biopython-1.63/0000755000175000017500000000000012250104774013056 5ustar tratra00000000000000biopython-1.63/NEWS0000644000175000017500000017743712250104543013572 0ustar tratra00000000000000News for the Biopython Project ============================== This file contains release notes and general news about the Biopython project. See also the DEPRECATED file which tracks the removal of obsolete modules or functions, and online http://biopython.org/wiki/News and http://news.open-bio.org/news/category/obf-projects/biopython/ The latest news is at the top of this file. =================================================================== 4 December 2013: Biopython 1.63 released. This release supports Python 3.3 onwards without conversion via the 2to3 library. See the Biopython 1.63 beta release notes below for details. Since the beta release we have made some minor bug fixes and test improvements. The restriction enzyme list in Bio.Restriction has been updated to the December 2013 release of REBASE. Additional contributors since the beta: Gokcen Eraslan (first contribution) =================================================================== 12 November 2013: Biopython 1.63 beta released. This is a beta release for testing purposes, the main reason for a beta version is the large amount of changes imposed by the removal of the 2to3 library previously required for the support of Python 3.X. This was made possible by dropping Python 2.5 (and Jython 2.5). This release of Biopython supports Python 2.6 and 2.7, and also Python 3.3. The Biopython Tutorial & Cookbook, and the docstring examples in the source code, now use the Python 3 style print function in place of the Python 2 style print statement. This language feature is available under Python 2.6 and 2.7 via: from __future__ import print_function Similarly we now use the Python 3 style built-in next function in place of the Python 2 style iterators' .next() method. This language feature is also available under Python 2.6 and 2.7. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Chris Mitchell (first contribution) Christian Brueffer Eric Talevich Josha Inglis (first contribution) Konstantin Tretyakov (first contribution) Lenna Peterson Martin Mokrejs Nigel Delaney (first contribution) Peter Cock Sergei Lebedev (first contribution) Tiago Antao Wayne Decatur (first contribution) Wibowo 'Bow' Arindrarto =================================================================== 28 August 2013: Biopython 1.62 released. This is our first release to officially support Python 3, however it is also our final release supporting Python 2.5. Specifically this release is supported and tested on standard Python 2.5, 2.6, 2.7 and 3.3. It was also tested under Jython 2.5, 2.7 and PyPy 1.9, 2.0. See the Biopython 1.62 beta release notes below for most changes. Since the beta release we have added several minor bug fixes and test improvements. Additional contributors since the beta: Bertrand Néron (first contribution) Lenna Peterson Martin Mokrejs Matsuyuki Shirota (first contribution) =================================================================== 15 July 2013: Biopython 1.62 beta released. This is a beta release for testing purposes, both for new features added, and changes to location parsing, but more importantly Biopython 1.62 will be our first release to officially support Python 3. Specifically we intend Biopython 1.62 to support standard Python 2.5, 2.6, 2.7 and 3.3, but the release will also be tested under Jython 2.5, 2.7 and PyPy 1.9, 2.0 as well. It will be our final release supporting Python 2.5. The translation functions will give a warning on any partial codons (and this will probably become an error in a future release). If you know you are dealing with partial sequences, either pad with N to extend the sequence length to a multiple of three, or explicitly trim the sequence. The handling of joins and related complex features in Genbank/EMBL files has been changed with the introduction of a CompoundLocation object. Previously a SeqFeature for something like a multi-exon CDS would have a child SeqFeature (under the sub_features attribute) for each exon. The sub_features property will still be populated for now, but is deprecated and will in future be removed. Please consult the examples in the help (docstrings) and Tutorial. Thanks to the efforts of Ben Morris, the Phylo module now supports the file formats NeXML and CDAO. The Newick parser is also significantly faster, and can now optionally extract bootstrap values from the Newick comment field (like Molphy and Archaeopteryx do). Nate Sutton added a wrapper for FastTree to Bio.Phylo.Applications. New module Bio.UniProt adds parsers for the GAF, GPA and GPI formats from UniProt-GOA. The BioSQL module is now supported in Jython. MySQL and PostgreSQL databases can be used. The relevant JDBC driver should be available in the CLASSPATH. Feature labels on circular GenomeDiagram figures now support the label_position argument (start, middle or end) in addition to the current default placement, and in a change to prior releases these labels are outside the features which is now consistent with the linear diagrams. The code for parsing 3D structures in mmCIF files was updated to use the Python standard library's shlex module instead of C code using flex. The Bio.Sequencing.Applications module now includes a BWA command line wrapper. Bio.motifs supports JASPAR format files with multiple position-frequence matrices. Additionally there have been other minor bug fixes and more unit tests. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Alexander Campbell (first contribution) Andrea Rizzi (first contribution) Anthony Mathelier (first contribution) Ben Morris (first contribution) Brad Chapman Christian Brueffer David Arenillas (first contribution) David Martin (first contribution) Eric Talevich Iddo Friedberg Jian-Long Huang (first contribution) Joao Rodrigues Kai Blin Michiel de Hoon Nate Sutton (first contribution) Peter Cock Petra Kubincová (first contribution) Phillip Garland Saket Choudhary (first contribution) Tiago Antao Wibowo 'Bow' Arindrarto Xabier Bello (first contribution) =================================================================== 5 February 2013: Biopython 1.61 released. GenomeDiagram has three new sigils (shapes to illustrate features). OCTO shows an octagonal shape, like the existing BOX sigil but with the corners cut off. JAGGY shows a box with jagged edges at the start and end, intended for things like NNNNN regions in draft genomes. Finally BIGARROW is like the existing ARROW sigil but is drawn straddling the axis. This is useful for drawing vertically compact figures where you do not have overlapping genes. New module Bio.Graphics.ColorSpiral can generate colors along a spiral path through HSV color space. This can be used to make arbitrary 'rainbow' scales, for example to color features or cross-links on a GenomeDiagram figure. The Bio.SeqIO module now supports reading sequences from PDB files in two different ways. The "pdb-atom" format determines the sequence as it appears in the structure based on the atom coordinate section of the file (via Bio.PDB, so NumPy is currently required for this). Alternatively, you can use the "pdb-seqres" format to read the complete protein sequence as it is listed in the PDB header, if available. The Bio.SeqUtils module how has a seq1 function to turn a sequence using three letter amino acid codes into one using the more common one letter codes. This acts as the inverse of the existing seq3 function. The multiple-sequence-alignment object used by Bio.AlignIO etc now supports an annotation dictionary. Additional support for per-column annotation is planned, with addition and splicing to work like that for the SeqRecord per-letter annotation. A new warning, Bio.BiopythonExperimentalWarning, has been introduced. This marks any experimental code included in the otherwise stable release. Such 'beta' level code is ready for wider testing, but still likely to change and should only be tried by early adopters to give feedback via the biopython-dev mailing list. We'd expect such experimental code to reach stable status in one or two releases time, at which point our normal policies about trying to preserve backwards compatibility would apply. See also the README file. This release also includes Bow's Google Summer of Code work writing a unified parsing framework for NCBI BLAST (assorted formats including tabular and XML), HMMER, BLAT, and other sequence searching tools. This is currently available with the new BiopythonExperimentalWarning to indicate that this is still somewhat experimental. We're bundling it with the main release to get more public feedback, but with the big warning that the API is likely to change. In fact, even the current name of Bio.SearchIO may change since unless you are familiar with BioPerl its purpose isn't immediately clear. The Bio.Motif module has been updated and reorganized. To allow for a clean deprecation of the old code, the new motif code is stored in a new module Bio.motifs, and a PendingDeprecationWarning was added to Bio.Motif. Additionally there have been other minor bug fixes and more unit tests. Finally, we are phasing out support for Python 2.5. We will continue support for at least one further release (Biopython 1.62). This could be extended given feedback from our users (or if the Jython 2.7 release is delayed, since the current stable release Jython 2.5 implemented Python 2.5 only). Focusing on Python 2.6 and 2.7 only will make writing Python 3 compatible code easier. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Brandon Invergo Bryan Lunt (first contribution) Christian Brueffer (first contribution) David Cain Eric Talevich Grace Yeo (first contribution) Jeffrey Chang Jingping Li (first contribution) Kai Blin (first contribution) Leighton Pritchard Lenna Peterson Lucas Sinclair (first contribution) Michiel de Hoon Nick Semenkovich (first contribution) Peter Cock Robert Ernst (first contribution) Tiago Antao Wibowo 'Bow' Arindrarto =================================================================== 25 June 2012: Biopython 1.60 released. New module Bio.bgzf supports reading and writing BGZF files (Blocked GNU Zip Format), a variant of GZIP with efficient random access, most commonly used as part of the BAM file format. This uses Python's zlib library internally, and provides a simple interface like Python's gzip library. Using this the Bio.SeqIO indexing functions now support BGZF compressed sequence files. The GenBank/EMBL parser will now give a warning on unrecognised feature locations and continue parsing (leaving the feature's location as None). Previously it would abort with an exception, which was often unhelpful. The Bio.PDB.MMCIFParser is now compiled by default (but is still not available under Jython, PyPy or Python 3). The SFF parser in Bio.SeqIO now decodes Roche 454 'universal accession number' 14 character read names, which encode the timestamp of the run, the region the read came from, and the location of the well. In the Phylo module, the "draw" function for plotting tree objects has become much more flexible, with improved support for matplotlib conventions and new parameters for specifying branch and taxon labels. Writing in the PhyloXML format has been updated to more closely match the output of other programs. A wrapper for the program RAxML has been added under Bio.Phylo.Applications, alongside the existing wrapper for PhyML. Additionally there have been other minor bug fixes and more unit tests. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Brandon Invergo Eric Talevich Jeff Hussmann (first contribution) John Comeau (first contribution) Kamil Slowikowski (first contribution) Kevin Jacobs Lenna Peterson (first contribution) Matt Fenwick (first contribution) Peter Cock Paul T. Bathen Wibowo Arindrarto =================================================================== 24 February 2012: Biopython 1.59 released. Please note that this release will *not* work on Python 2.4 (while the recent releases have worked despite us not officially supporting this). The position objects used in Bio.SeqFeature now act almost like integers, making dealing with fuzzy locations in EMBL/GenBank files much easier. Note as part of this work, the arguments to create fuzzy positions OneOfPosition and WithinPosition have changed in a non-backwards compatible way. The SeqFeature's strand and any database reference are now properties of the FeatureLocation object (a more logical placement), with proxy methods for backwards compatibility. As part of this change, if you print a location object it will now display any strand and database reference information. The installation setup.py now supports 'install_requires' when setuptools is installed. This avoids the manual dialog when installing Biopython via easy_install or pip and numpy is not installed. It also allows user libraries that require Biopython to include it in their install_requires and get automatical installation of dependencies. Bio.Graphics.BasicChromosome has been extended to allow simple sub-features to be drawn on chromosome segments, suitable to show the position of genes, SNPs or other loci. Note Bio.Graphics requires the ReportLab library. Bio.Graphics.GenomeDiagram has been extended to allow cross-links between tracks, and track specific start/end positions for showing regions. This can be used to imitate the output from the Artemis Comparison Tool (ACT). Also, a new attribute circle_core makes it easier to have an empty space in the middle of a circular diagram (see tutorial). Bio.Align.Applications now includes a wrapper for command line tool Clustal Omega for protein multiple sequence alignment. Bio.AlignIO now supports sequential PHYLIP files (as well as interlaced PHYLIP files) as a separate format variant. New module Bio.TogoWS offers a wrapper for the TogoWS REST API, a web service based in Japan offering access to KEGG, DDBJ, PDBj, CBRC plus access to some NCBI, EBI resources including PubMed, GenBank and UniProt. This is much easier to use than the NCBI Entrez API, but should be especially useful for Biopython users based in Asia. Bio.Entrez function efetch has been updated to handle the NCBI's stricter handling of multiple ID arguments in EFetch 2.0, however the NCBI have also changed the retmode default argument so you may need to make this explicit. e.g. retmode="text" Additionally there have been other minor bug fixes and more unit tests. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Andreas Wilm (first contribution) Alessio Papini (first contribution) Brad Chapman Brandon Invergo Connor McCoy Eric Talevich João Rodrigues Konrad Förstner (first contribution) Michiel de Hoon Matej Repič (first contribution) Leighton Pritchard Peter Cock =================================================================== 18 August 2011: Biopython 1.58 released. A new interface and parsers for the PAML (Phylogenetic Analysis by Maximum Likelihood) package of programs, supporting codeml, baseml and yn00 as well as a Python re-implementation of chi2 was added as the Bio.Phylo.PAML module. Bio.SeqIO now includes read and write support for the SeqXML, a simple XML format offering basic annotation support. See Schmitt et al (2011) in Briefings in Bioinformatics, http://dx.doi.org/10.1093/bib/bbr025 Bio.SeqIO now includes read support for ABI files ("Sanger" capillary sequencing trace files, containing called sequence with PHRED qualities). The Bio.AlignIO "fasta-m10" parser was updated to cope with the >>><<< lines as used in Bill Pearson's FASTA version 3.36, without this fix the parser would only return alignments for the first query sequence. The Bio.AlignIO "phylip" parser and writer now treat a dot/period in the sequence as an error, in line with the official PHYLIP specification. Older versions of our code didn't do anything special with this character. Also, support for "phylip-relaxed" has been added which allows longer record names as used in RAxML and PHYML. Of potential interest to anyone subclassing Biopython objects, any remaining "old style" Python classes have been switched to "new style" classes. This allows things like defining properties. Bio.HMM's Viterbi algorithm now expects the initial probabilities explicitly. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Aaron Gallagher (first contribution) Bartek Wilczynski Bogdan T. (first contribution) Brandon Invergo (first contribution) Connor McCoy (first contribution) David Cain (first contribution) Eric Talevich Fábio Madeira (first contribution) Hongbo Zhu Joao Rodrigues Michiel de Hoon Peter Cock Thomas Schmitt (first contribution) Tiago Antao Walter Gillett Wibowo Arindrarto (first contribution) =================================================================== 2 April 2011: Biopython 1.57 released. Bio.SeqIO now includes an index_db() function which extends the existing indexing functionality to allow indexing many files, and more importantly this keeps the index on disk in a simple SQLite3 database rather than in memory in a Python dictionary. Bio.Blast.Applications now includes a wrapper for the BLAST+ blast_formatter tool from NCBI BLAST 2.2.24+ or later. This release of BLAST+ added the ability to run the BLAST tools and save the output as ASN.1 format, and then convert this to any other supported BLAST output format (plain text, tabular, XML, or HTML) with the blast_formatter tool. The wrappers were also updated to include new arguments added in BLAST 2.2.25+ such as -db_hard_mask. The SeqRecord object now has a reverse_complement method (similar to that of the Seq object). This is most useful to reversing per-letter-annotation (such as quality scores from FASTQ) or features (such as annotation from GenBank). Bio.SeqIO.write's QUAL output has been sped up, and Bio.SeqIO.convert now uses an optimised routine for FASTQ to QUAL making this much faster. Biopython can now be installed with pip. Thanks to David Koppstein and James Casbon for reporting the problem. Bio.SeqIO.write now uses lower case for the sequence for GenBank, EMBL and IMGT output. The Bio.PDB module received several fixes and improvements, including starting to merge João's work from GSoC 2010; consequently Atom objects now know their element type and IUPAC mass. (The new features that use these attributes won't be included in Biopython until the next release, though, so stay tuned.) The nodetype hierarchy in the Bio.SCOP.Cla.Record class is now a dictionary (previously it was a list of key,value tuples) to better match the standard. Many thanks to the Biopython developers and community for making this release possible, especially the following contributors: Brad Chapman Eric Talevich Erick Matsen (first contribution) Hongbo Zhu Jeffrey Finkelstein (first contribution) Joanna & Dominik Kasprzak (first contribution) Joao Rodrigues Kristian Rother Leighton Pritchard Michiel de Hoon Peter Cock Peter Thorpe (first contribution) Phillip Garland Walter Gillett (first contribution) =================================================================== 26 November 2010: Biopython 1.56 released. This is planned to be our last release to support Python 2.4, however this could be delayed given immediate feedback from our users (e.g. if this proves to be a problem in combination with other libraries or a popular Linux distribution). Bio.SeqIO can now read and index UniProt XML files (under format name "uniprot-xml", which was agreed with EMBOSS and BioPerl for when/if they support it too). Bio.SeqIO can now read, write and index IMGT files. These are a variant of the EMBL sequence text file format with longer feature indentation. Bio.SeqIO now supports protein EMBL files (used in the EMBL patents database file epo_prt.dat) - previously we only expected nucleotide EMBL files. The Bio.Seq translation methods and function will now accept an arbitrary CodonTable object (for those of you working on very unusual organisms). The SeqFeature object now supports len(feature) giving the length consistent with the existing extract method. Also, it now supports iteration giving the coordinate (with respect to the parent sequence) of each letter within the feature (in frame aware order), and "in" which allows you to check if a (parent based) coordinate is within the feature location. Bio.Entrez will now try to download any missing NCBI DTD files and cache them in the user's home directory. The provisional database schema for BioSQL support on SQLite which Biopython has been using since Release 1.53 has now been added to BioSQL, and updated slightly. Bio.PopGen.FDist now supports the DFDist command line tool as well as FDist2. Bio.Motif now has a chapter in the Tutorial. (At least) 13 people have contributed to this release, including 6 new people: Andrea Pierleoni (first contribution) Bart de Koning (first contribution) Bartek Wilczynski Bartosz Telenczuk (first contribution) Cymon Cox Eric Talevich Frank Kauff Michiel de Hoon Peter Cock Phillip Garland (first contribution) Siong Kong (first contribution) Tiago Antao Uri Laserson (first contribution) =================================================================== 31 August 2010: Biopython 1.55 released. See the notes below for the Biopython 1.55 beta release for changes since Biopython 1.54 was released. Since the beta release we have marked a few modules as obsolete or deprecated, and removed some deprecated code. There have also been a few bug fixes, extra unit tests, and documentation improvements. (At least) 12 people have contributed to this release, including 6 new people: Andres Colubri (first contribution) Carlos Rios Vera (first contribution) Claude Paroz (first contribution) Cymon Cox Eric Talevich Frank Kauff Joao Rodrigues (first contribution) Konstantin Okonechnikov (first contribution) Michiel de Hoon Nathan Edwards (first contribution) Peter Cock Tiago Antao =================================================================== 18 August 2010: Biopython 1.55 beta released. This is a beta release for testing purposes, both for new features added, and more importantly updates to avoid code deprecated in Python 2.7 or in Python 3. This is an important step towards Python 3 support. We are phasing out support for Python 2.4. We will continue to support it for at least one further release (Biopython 1.56). This could be delayed given feedback from our users (e.g. if this proves to be a problem in combination with other libraries or a popular Linux distribution). The SeqRecord object now has upper and lower methods (like the Seq object and Python strings), which return a new SeqRecord with the sequence in upper or lower case and a copy of all the annotation unchanged. Several small issues with Bio.PDB have been resolved, which includes better handling of model numbers, and files missing the element column. Feature location parsing for GenBank and EMBL files has been rewritten, making the parser much faster. Ace parsing by SeqIO now uses zero rather than None for the quality score of any gaps (insertions) in the contig sequence. The BioSQL classes DBServer and BioSeqDatabase now act more like Python dictionaries, making it easier to count, delete, iterate over, or check for membership of namespaces and records. The command line tool application wrapper classes are now executable, so you can use them to call the tool (using the subprocess module internally) and capture the output and any error messages as strings (stdout and stderr). This avoids having to worry about the details of how best to use subprocess. (At least) 10 people have contributed to this release, including 5 new people: Andres Colubri (first contribution) Carlos Rios Vera (first contribution) Claude Paroz (first contribution) Eric Talevich Frank Kauff Joao Rodrigues (first contribution) Konstantin Okonechnikov (first contribution) Michiel de Hoon Peter Cock Tiago Antao =================================================================== May 20, 2010: Biopython 1.54 released. See the notes below for the Biopython 1.54 beta release for changes since Biopython 1.53 was released. Since then there have been some changes to the new Bio.Phylo module, more documentation, and a number of smaller bug fixes. =================================================================== April 2, 2010: Biopython 1.54 beta released. We are phasing out support for Python 2.4. We will continue to support it for at least two further releases, and at least one year (whichever takes longer), before dropping support for Python 2.4. This could be delayed given feedback from our users (e.g. if this proves to be a problem in combination with other libraries or a popular Linux distribution). New module Bio.Phylo includes support for reading, writing and working with phylogenetic trees from Newick, Nexus and phyloXML files. This was work by Eric Talevich on a Google Summer of Code 2009 project, under The National Evolutionary Synthesis Center (NESCent), mentored by Brad Chapman and Christian Zmasek. Bio.Entrez includes some more DTD files, in particular eLink_090910.dtd, needed for our NCBI Entrez Utilities XML parser. The parse, read and write functions in Bio.SeqIO and Bio.AlignIO will now accept filenames as well as handles. This follows a general shift from other Python libraries, and does make usage a little simpler. Also the write functions will now accept a single SeqRecord or alignment. Bio.SeqIO now supports writing EMBL files (DNA and RNA sequences only). The dictionary-like objects from Bio.SeqIO.index() now support a get_raw method for most file formats, giving you the original unparsed data from the file as a string. This is useful for selecting a subset of records from a file where Bio.SeqIO.write() does not support the file format (e.g. the "swiss" format) or where you need to exactly preserve the original layout. Based on code from Jose Blanca (author of sff_extract), Bio.SeqIO now supports reading, indexing and writing Standard Flowgram Format (SFF) files which are used by 454 Life Sciences (Roche) sequencers. This means you can use SeqIO to convert from SFF to FASTQ, FASTA and QUAL (as trimmed or untrimmed reads). An improved multiple sequence alignment object has been introduced, and is used by Bio.AlignIO for input. This is a little stricter than the old class but should otherwise be backwards compatible. (At least) 11 people contributed to this release, including 5 new people: Anne Pajon (first contribution) Brad Chapman Christian Zmasek Diana Jaunzeikare (first contribution) Eric Talevich Jose Blanca (first contribution) Kevin Jacobs (first contribution) Leighton Pritchard Michiel de Hoon Peter Cock Thomas Holder (first contribution) =================================================================== December 15, 2009: Biopython 1.53 released. Biopython is now using git for source code control, currently on github. Our old CVS repository will remain on the OBF servers in the short/medium term as a backup, but will not be updated in future. The Bio.Blast.Applications wrappers now covers the new NCBI BLAST C++ tools (where blastall is replaced by blastp, blastn, etc, and the command line switches have all been renamed). These will be replacing the old wrappers in Bio.Blast.NCBIStandalone which are now obsolete, and will be deprecated in our next release. The plain text BLAST parser has been updated, and should cope with recent versions of NCBI BLAST, including the new C++ based version. Nevertheless, we (and the NCBI) still recommend using the XML output for parsing. The Seq (and related UnknownSeq) objects gained upper and lower methods, like the string methods of the same name but alphabet aware. The Seq object also gained a new ungap method for removing gap characters in an alphabet aware manner. The SeqFeature object now has an extract method, used with the parent sequence (as a string or Seq object) to get the region of that sequence described by the feature's location information (including the strand and any sub-features for a join). As an example, this is useful to get the nucleotide sequence for features in GenBank or EMBL files. SeqRecord objects now support addition, giving a new SeqRecord with the combined sequence, all the SeqFeatures, and any common annotation. Bio.Entrez includes the new (Jan 2010) DTD files from the NCBI for parsing MedLine/PubMed data. The NCBI codon tables have been updated from version 3.4 to 3.9, which adds a few extra start codons, and a few new tables (Tables 16, 21, 22 and 23). Note that Table 14 which used to be called "Flatworm Mitochondrial" is now called "Alternative Flatworm Mitochondrial", and "Flatworm Mitochondrial" is now an alias for Table 9 ("Echinoderm Mitochondrial"). The restriction enzyme list in Bio.Restriction has been updated to the Nov 2009 release of REBASE. The Bio.PDB parser and output code has been updated to understand the element column in ATOM and HETATM lines (based on patches contributed by Hongbo Zhu and Frederik Gwinner). Bio.PDB.PDBList has also been updated for recent changes to the PDB FTP site (Paul T. Bathen). SQLite support was added for BioSQL databases (Brad Chapman), allowing access to BioSQL through a lightweight embedded SQL engine. Python 2.5+ includes support for SQLite built in, but on Python 2.4 the optional sqlite3 library must be installed to use this. We currently use a draft BioSQL on SQLite schema, which will be merged with the main BioSQL release for use in other projects. Support for running Biopython under Jython (using the Java Virtual Machine) has been much improved thanks to input from Kyle Ellrott. Note that Jython does not support C code - this means NumPy isn't available, and nor are a selection of Biopython modules (including Bio.Cluster, Bio.PDB and BioSQL). Also, currently Jython does not parse DTD files, which means the XML parser in Bio.Entrez won't work. However, most of the Biopython modules seem fine from testing Jython 2.5.0 and 2.5.1. (At least) 12 people contributed to this release, including 3 first timers: Bartek Wilczynski Brad Chapman Chris Lasher Cymon Cox Frank Kauff Frederik Gwinner (first contribution) Hongbo Zhu (first contribution) Kyle Ellrott Leighton Pritchard Michiel de Hoon Paul Bathen (first contribution) Peter Cock =================================================================== September 22, 2009: Biopython 1.52 released. The Population Genetics module now allows the calculation of several tests, and statistical estimators via a wrapper to GenePop. Supported are tests for Hardy-Weinberg equilibrium, linkage disequilibrium and estimates for various F statistics (Cockerham and Wier Fst and Fis, Robertson and Hill Fis, etc), null allele frequencies and number of migrants among many others. Isolation By Distance (IBD) functionality is also supported. New helper functions Bio.SeqIO.convert() and Bio.AlignIO.convert() allow an easier way to use Biopython for simple file format conversions. Additionally, these new functions allow Biopython to offer important file format specific optimisations (e.g. FASTQ to FASTA, and interconverting FASTQ variants). New function Bio.SeqIO.index() allows indexing of most sequence file formats (but not alignment file formats), allowing dictionary like random access to all the entries in the file as SeqRecord objects, keyed on the record id. This is especially useful for very large sequencing files, where all the records cannot be held in memory at once. This supplements the more flexible but memory demanding Bio.SeqIO.to_dict() function. Bio.SeqIO can now write "phd" format files (used by PHRED, PHRAD and CONSED), allowing interconversion with FASTQ files, or FASTA+QUAL files. Bio.Emboss.Applications now includes wrappers for the "new" PHYLIP EMBASSY package (e.g. fneighbor) which replace the "old" PHYLIP EMBASSY package (e.g. eneighbor) whose Biopython wrappers are now obsolete. See also the DEPRECATED file, as several old deprecated modules have finally been removed (e.g. Bio.EUtils which had been replaced by Bio.Entrez). On a technical note, this will be the last release using CVS for source code control. Biopython is moving from CVS to git. =================================================================== August 17, 2009: Biopython 1.51 released. FASTQ support in Bio.SeqIO has been improved, extended and sped up since Biopython 1.50. Support for Illumina 1.3+ style FASTQ files was added in the 1.51 beta release. Furthermore, we now follow the interpretation agreed on the OBF mailing lists with EMBOSS, BioPerl, BioJava and BioRuby for inter- conversion and the valid score range for each FASTQ variant. This means Solexa FASTQ scores can be from -5 to 62 (format name "fastq-solexa" in Bio.SeqIO), Illumina 1.3+ FASTQ files have PHRED scores from 0 to 62 (format name "fastq-illumina"), and Sanger FASTQ files have PHRED scores from 0 to 93 (format name "fastq" or "fastq-sanger"). Bio.Sequencing.Phd has been updated, for example to cope with missing peak positions. The "phd" support in Bio.SeqIO has also been updated to record the PHRED qualities (and peak positions) in the SeqRecord's per-letter annotation. This allows conversion of PHD files into FASTQ or QUAL which may be useful for meta-assembly. See the notes below for the Biopython 1.50 beta release for changes since Biopython 1.49 was released. This includes dropping support for Python 2.3, removing our deprecated parsing infrastructure (Martel and Bio.Mindy), and hence removing any dependence on mxTextTools. Additionally, since the beta, a number of small bugs have been fixed, and there have been further additions to the test suite and documentation. =================================================================== June 23, 2009: Biopython 1.51 beta released. Biopython no longer supports Python 2.3. Currently we support Python 2.4, 2.5 and 2.6. Our deprecated parsing infrastructure (Martel and Bio.Mindy) has been removed. This means Biopython no longer has any dependence on mxTextTools. A few cosmetic issues in GenomeDiagram with arrow sigils and labels on circular diagrams have been fixed. Bio.SeqIO will now write GenBank files with the feature table (previously omitted), and a couple of obscure errors parsing ambiguous locations have been fixed. Bio.SeqIO can now read and write Illumina 1.3+ style FASTQ files (which use PHRED quality scores with an ASCII offset of 64) under the format name "fastq-illumina". Biopython 1.50 supported just "fastq" (the original Sanger style FASTQ files using PHRED scores with an ASCII offset of 33), and "fastq-solexa" (the original Solexa/Illumina FASTQ format variant holding Solexa scores with an ASCII offset of 64) . For parsing the "swiss" format, Bio.SeqIO now uses the new Bio.SwissProt parser, making it about twice as fast as in Biopython 1.50, where the older now deprecated Bio.SwissProt.SProt was used. There should be no functional differences as a result of this change. Our command line wrapper objects have been updated to support accessing parameters via python properties, and setting of parameters at initiation with keyword arguments. Additionally Cymon Cox has contributed several new multiple alignment wrappers under Bio.Align.Applications. A few more issues with Biopython's BioSQL support have been fixed (mostly by Cymon Cox). In particular, the default PostgreSQL schema includes some rules intended for BioPerl support only, which were causing problems in Biopython (see BioSQL bug 2839). There have also been additions to the tutorial, such as the new alignment wrappers, with a whole chapter for the SeqRecord object. We have also added to the unit test coverage. =================================================================== April 20, 2009: Biopython 1.50 released. See the notes below for the Biopython 1.50 beta release for more details, but the highlights are: * The SeqRecord supports slicing and per-letter-annotation * Bio.SeqIO can read and write FASTQ and QUAL files * Bio.Seq now has an UnknownSeq object * GenomeDiagram has been integrated into Biopython * New module Bio.Motif will later replace Bio.AlignAce and Bio.MEME * This will be the final release to support Python 2.3 * This will be the final release with Martel and Bio.Mindy Since the 1.50 beta release: * The NCBI's Entrez EFetch no longer supports rettype="genbank" and "gb" (or "gp") should be used instead. * Bio.SeqIO now supports "gb" as an alias for "genbank". * The Seq object now has string-like startswith and endswith methods * Bio.Blast.NCBIXML now has a read function for single record files * A few more unit tests were added * More documentation =================================================================== April 3, 2009: Biopython 1.50 beta released. The SeqRecord object has a new dictionary attribute, letter_annotations, which is for holding per-letter-annotation information like sequence quality scores or secondary structure predictions. As part of this work, the SeqRecord object can now be sliced to give a new SeqRecord covering just part of the sequence. This will slice the per-letter-annotation to match, and will also include any SeqFeature objects as appropriate. Bio.SeqIO can now read and write FASTQ and QUAL quality files using PHRED quality scores (Sanger style, also used for Roche 454 sequencing), and FASTQ files using Solexa/Illumina quality scores. The Bio.Seq module now has an UnknownSeq object, used for when we have a sequence of known length, but unknown content. This is used in parsing GenBank and EMBL files where the sequence may not be present (e.g. for a contig record) and when parsing QUAL files (which don't have the sequence) GenomeDiagram by Leighton Pritchard has been integrated into Biopython as the Bio.Graphics.GenomeDiagram module If you use this code, please cite the publication Pritchard et al. (2006), Bioinformatics 22 616-617. Note that like Bio.Graphics, this requires the ReportLab python library. A new module Bio.Motif has been added, which is intended to replace the existing Bio.AlignAce and Bio.MEME modules. The set of NCBI DTD files included with Bio.Entrez has been updated with the revised files the NCBI introduced on 1 Jan 2009. Minor fix to BioSQL for retrieving references and comments. Bio.SwissProt has a new faster parser which will be replacing the older slower code in Bio.SwissProt.SProt (which we expect to deprecate in the next release). We've also made some changes to our test framework, which is now given a whole chapter in the tutorial. This intended to help new developers or contributors wanting to improve our unit test coverage. =================================================================== November 21, 2008: Biopython 1.49 released. See the notes below for the Biopython 1.49 beta release for more details, but the highlights are: * Biopython has transitioned from Numeric to NumPy * Martel and Bio.Mindy are now deprecated Since the 1.49 beta release: * A couple of NumPy issues have been resolved * Further small improvements to BioSQL * Bio.PopGen.SimCoal should now work on Windows * A few more unit tests were added =================================================================== November 7, 2008: Biopython 1.49 beta released. Biopython has transitioned from Numeric to NumPy. Please move to NumPy. A number of small changes have been made to support Python 2.6 (mostly avoiding deprecated functionality), and further small changes have been made for better compatibility with Python 3 (this work is still ongoing). However, we intend to support Python 2.3 for only a couple more releases. As part of the Numeric to NumPy migration, Bio.KDTree has been rewritten in C instead of C++ which therefore simplifies building Biopython from source. Martel and Bio.Mindy are now considered to be deprecated, meaning mxTextTools is no longer required to use Biopython. See the DEPRECATED file for details of other deprecations. The Seq object now supports more string like methods (gaining find, rfind, split, rsplit, strip, lstrip and rstrip in addition to previously supported methods like count). Also, biological methods transcribe, back_transcribe and translate have been added, joining the pre-existing reverse_complement and complement methods. Together these changes allow a more object orientated programming style using the Seq object. The behaviour of the Bio.Seq module's translate function has changed so that ambiguous codons which could be a stop codon like "TAN" or "NNN" are now translated as "X" (consistent with EMBOSS and BioPerl - Biopython previously raised an exception), and a bug was fixed so that invalid codons (like "A-T") now raise an exception (previously these were translated as stop codons). BioSQL had a few bugs fixed, and can now optionally fetch the NCBI taxonomy on demand when loading sequences (via Bio.Entrez) allowing you to populate the taxon/taxon_name tables gradually. This has been tested in combination with the BioSQL load_ncbi_taxonomy.pl script used to populate or update the taxon/taxon_name tables. BioSQL should also now work with the psycopg2 driver for PostgreSQL as well as the older psycopg driver. The PDB and PopGen sections of the Tutorial have been promoted to full chapters, and a new chapter has been added on supervised learning methods like logistic regression. The "Cookbook" section now has a few graphical examples using Biopython to calculate sequence properties, and matplotlib (pylab) to plot them. The input functions in Bio.SeqIO and Bio.AlignIO now accept an optional argument to specify the expected sequence alphabet. The somewhat quirky unit test GUI has been removed, the unit tests are now run via the command line by default. =================================================================== September 8, 2008: Biopython 1.48 released. The SeqRecord and Alignment objects have a new method to format the object as a string in a requested file format (handled via Bio.SeqIO and Bio.AlignIO). Additional file formats supported in Bio.SeqIO and Bio.AlignIO: - reading and writing "tab" format (simple tab separated) - writing "nexus" files. - reading "pir" files (NBRF/PIR) - basic support for writing "genbank" files (GenBank plain text) Fixed some problems reading Clustal alignments (introduced in Biopython 1.46 when consolidating Bio.AlignIO and Bio.Clustalw). Updates to the Bio.Sequencing parsers. Bio.PubMed and the online code in Bio.GenBank are now considered obsolete, and we intend to deprecate them after the next release. For accessing PubMed and GenBank, please use Bio.Entrez instead. Bio.Fasta is now considered to be obsolete, please use Bio.SeqIO instead. We do intend to deprecate this module eventually, however, for several years this was the primary FASTA parsing module in Biopython and is likely to be in use in many existing scripts. Martel and Bio.Mindy are now considered to be obsolete, and are likely to be deprecated and removed in a future release. In addition a number of other modules have been deprecated, including: Bio.MetaTool, Bio.EUtils, Bio.Saf, Bio.NBRF, and Bio.IntelliGenetics See the DEPRECATED file for full details. =================================================================== July 5, 2008: Biopython 1.47 released. Improved handling of ambiguous nucleotides in Bio.Seq.Translate(). Better handling of stop codons in the alphabet from a translation. Fixed some codon tables (problem introduced in Biopython 1.46). Updated Nexus file handling. Fixed a bug in Bio.Cluster potentially causing segfaults in the single-linkage hierarchical clustering library. Added some DTDs to be able to parse EFetch results from the nucleotide database. Added IntelliGenetics/MASE parsing to Bio.SeqIO (as the "ig" format). =================================================================== June 29, 2008: Biopython 1.46 released. Bio.Entrez now has several Entrez format XML parsers, and a chapter in the tutorial. Addition of new Bio.AlignIO module for working with sequence alignments in the style introduced with Bio.SeqIO in recent releases, with a whole chapter in the tutorial. A problem parsing certain EMBL files was fixed. Several minor fixes were made to the NCBI BLAST XML parser, including support for the online version 2.2.18+ introduced in May 2008. The NCBIWWW.qblast() function now allows other programs (blastx, tblastn, tblastx) in addition to just blastn and blastp. Bio.EUtils has been updated to explicitly enforce the NCBI's rule of at most one query every 3 seconds, rather than assuming the user would obey this. Iterators in Bio.Medline, Bio.SCOP, Bio.Prosite, Bio.Prosite.Prodoc, Bio.SwissProt, and others to make them more generally usable. Phylip export added to Bio.Nexus. Improved handling of ambiguous nucleotides and stop codons in Bio.Seq.Translate (plus introduced a regression fixed in Biopython 1.47). =================================================================== March 22, 2008: Biopython 1.45 released. The Seq and MutableSeq objects act more like python strings, in particular str(object) now returns the full sequence as a plain string. The existing tostring() method is preserved for backwards compatibility. BioSQL has had some bugs fixed, and has an additional unit test which loads records into a database using Bio.SeqIO and then checks the records can be retrieved correctly. The DBSeq and DBSeqRecord classes now subclass the Seq and SeqRecord classes, which provides more functionality. The modules under Bio.WWW are being deprecated. Functionality in Bio.WWW.NCBI, Bio.WWW.SCOP, Bio.WWW.InterPro and Bio.WWW.ExPASy is now available from Bio.Entrez, Bio.SCOP, Bio.InterPro and Bio.ExPASy instead. Bio.Entrez was used to fix a nasty bug in Bio.GenBank. Tiago Antao has included more functionality in the Population Genetics module, Bio.PopGen. The Bio.Cluster module has been updated to be more consistent with other Biopython code. The tutorial has been updated, including devoting a whole chapter to Swiss-Prot, Prosite, Prodoc, and ExPASy. There is also a new chapter on Bio.Entrez. Bio.biblio was deprecated. =================================================================== October 28, 2007: Biopython 1.44 released. NOTE: This release includes some rather drastic code changes, which were necessary to get Biopython to work with the new release of mxTextTools. The (reverse)complement functions in Bio.Seq support ambiguous nucleotides. Bio.Kabat, which was previously deprecated, is now removed from Biopython. Bio.MarkupEditor was deprecated, as it does not appear to have any users. Bio.Blast.NCBI.qblast() updated with more URL options, thanks to a patch from Chang Soon Ong. Several fixes to the Blast parser. The deprecated Bio.Blast.NCBIWWW functions blast and blasturl were removed. The standalone Blast functions blastall, blastpgp now create XML output by default. Bio.SeqIO.FASTA and Bio.SeqIO.generic have been deprecated in favour of the new Bio.SeqIO module. Bio.FormatIO has been removed (a gradual deprecation was not possible). Please look at Bio.SeqIO for sequence input/output instead. Fix for a bug in Bio.Cluster, which caused kcluster() to hang on some platforms. Bio.expressions has been deprecated. Bio.SeqUtils.CheckSum created, including new methods from Sebastian Bassi, and functions crc32 and crc64 which were moved from Bio/crc.py. Bio.crc is now deprecated. Bio.lcc was updated and moved to Bio.SeqUtils.lcc. Bio.SwissProt parser updated to cope with recent file format updates. Bio.Fasta, Bio.KEGG and Bio.Geo updated to pure python parsers which don't rely on Martel. Numerous fixes in the Genbank parser. Several fixes in Bio.Nexus. Bio.MultiProc and Bio.Medline.NLMMedlineXML were deprecating, as they failed on some platforms, and seemed to have no users. Deprecated concurrent behavior in Bio.config.DBRegistry and timeouts in Bio.dbdefs.swissprot, which relies on Bio.MultiProc. Tiago Antao has started work on a Population Genetics module, Bio.PopGen Updates to the tutorial, including giving Bio.Seq and Bio.SeqIO a whole chapter each. =================================================================== March 17, 2007: Biopython 1.43 released. New Bio.SeqIO module for reading and writing biological sequence files in various formats, based on SeqRecord objects. This includes a new fasta parser which is much faster than Bio.Fasta, particularly for larger files. Easier to use, too. Various improvements in Bio.SeqRecord. Running Blast using Bio.Blast.NCBIStandalone now generates output in XML format by default. The new function Bio.Blast.NCBIXML.parse can parse multiple Blast records in XML format. Bio.Cluster no longer uses ranlib, but uses its own random number generator instead. Some modifications to make Bio.Cluster more compatible with the new NumPy (we're not quite there yet though). New Bio.UniGene parser. Numerous improvements in Bio.PDB. Bug fixes in Bio.SwissProt, BioSQL, Bio.Nexus, and other modules. Faster parsing of large GenBank files. New EMBL parser under Bio.GenBank and also integrated into (new) Bio.SeqIO Compilation of KDTree (C++ code) is optional (setup.py asks the user if it should be compiled). For the Windows installer, C++ code is now included. Nominating Bio.Kabat for removal. Believe it or not, even the documentation was updated. =================================================================== July 16, 2006: Biopython 1.42 released. Bio.GenBank: New parser by Peter, which doesn't rely on Martel. Numerous updates in Bio.Nexus and Bio.Geo. Bio.Cluster became (somewhat) object-oriented. Lots of bug fixes, and updates to the documentation. =================================================================== October 28, 2005: Biopython 1.41 released. Major changes: NEW: Bio.MEME -- thanks to Jason Hackney Added transcribe, translate, and reverse_complement functions to Bio.Seq that work both on Seq objects and plain strings. Major code optimization in cpairwise2module. CompareACE support added to AlignAce. Updates to Blast parsers in Bio.Blast, in particular use of the XML parser in NCBIXML contributed by Bertrand Frottier, and the BLAT parser by Yair Benita. Pairwise single-linkage hierarchical clustering in Bio.Cluster became much faster and memory-efficient, allowing clustering of large data sets. Bio.Emboss: Added command lines for einverted and palindrome. Bio.Nexus: Added support for StringIO objects. Numerous updates in Bio.PDB. Lots of fixes in the documentation. March 29, 2005: MEME parser added. Thanks to Jason Hackney =================================================================== Feb 18, 2005: Biopython 1.40 beta Major Changes since v1.30. For a full list of changes please see the CVS IMPORTANT: Biopython now works with Python version >= 2.3 NEW: Bio.Nexus -- thanks to Frank Kauff Bio.Nexus is a Nexus file parser. Nexus is a common format for phylogenetic trees. NEW: CAPS module -- Thanks to Jonathan Taylor NEW: Restriction enzyme package contributed by Frederic Sohm. This includes classes for manipulating enzymes, updating from Rebase, as well as documentation and Tests. CHANGED: Bio.PDB -- thanks to Thomas Hamelryck Added atom serial number. Epydoc style documentation. Added secondary structure support (through DSSP) Added Accessible Surface Area support (through DSSP) Added Residue Depth support (through MSMS) Added Half Sphere Exposure. Added Fragment classification of the protein backbone (see Kolodny et al., JMB, 2002) Corrected problem on Windows with PDBList (thanks to Matt Dimmic) Added StructureAlignment module to superimpose structures based on a FASTA sequence alignment. Various additions to Polypeptide. Various bug corrections in Vector. Lots of smaller bug corrections and additional features CHANGED: MutableSeq -- thanks to Michiel De Hoon Added the functions 'complement' and 'reverse_complement' to Bio.Seq's Seq and MutableSeq objects. Similar functions previous existed in various locations in BioPython: - forward_complement, reverse_complement in Bio.GFF.easy - complement, antiparallel in Bio.SeqUtils These functions have now been deprecated, and will generate a DeprecationWarning when used. The functions complement and reverse_complement, when applied to a Seq object, will return a new Seq object. The same function applied to a MutableSeq object will modify the MutableSeq object itself, and don't return anything. =================================================================== May 14, 2004: Biopython 1.30 Affy package added for dealing with Affymetrix cel files -- thanks to Harry Zuzan. Added code for parsing Blast XML output -- thanks to Bertrand Frottier. Added code for parsing Compass output -- thanks to James Casbon. New melting temperature calculation module -- thanks to Sebastian Bassi. Added lowess function for non-parameteric regression -- thanks to Michiel. Reduced protein alphabet supported added -- thanks to Iddo. Added documentation for Logistic Regression and Bio.PDB -- thanks to Michiel and Thomas. Documentation added for converting between file formats. Updates to install documentation for non-root users -- thanks to Jakob Fredslund. epydoc now used for automatic generation of documentation. Fasta parser updated to use Martel for parsing and indexing, allowing better speed and dealing with large data files. Updated to Registry code. Now 'from Bio import db' gives you a number of new retrieval options, including embl, fasta, genbak, interpro, prodoc and swissprot. GenBank parser uses new Martel format. GenBank retrieval now uses EUtils instead of the old non-working entrez scripts. GenBank indexing uses standard Mindy indexing. Fix for valueless qualifiers in feature keys -- thanks to Leighton Pritchard. Numerous updated to Bio.PDB modules -- thanks to Thomas. PDB can now parse headers -- thanks to Kristian Rother. Updates to the Ace parser -- thanks to Frank Kauff and Leighton Pritchard. Added pgdb (PyGreSQL) support to BioSQL -- thanks to Marc Colosimo. Fix problems with using py2exe and Biopython -- thanks to Michael Cariaso. PSIBlast parser fixes -- thanks to Jer-Yee John Chuang and James Casbon. Fix to NCBIWWW retrieval so that HTML results are returned correctly. Fix to Clustalw to handle question marks in title names -- thanks to Ashleigh Smythe. Fix to NBRF parsing to it accepts files produced by Clustalw -- thanks to Ashleigh Smythe. Fixes to the Enyzme module -- thanks to Marc Colosimo. Fix for bugs in SeqUtils -- thanks to Frank Kauff. Fix for optional hsps in ncbiblast Martel format -- thanks to Heiko. Fix to Fasta parsing to allow # comment lines -- thanks to Karl Diedrich. Updates to the C clustering library -- thanks to Michiel. Fixes for breakage in the SCOP module and addition of regression tests to framework -- thanks to Gavin. Various fixes to Bio.Wise -- thanks to Michael. Fix for bug in FastaReader -- thanks to Micheal. Fix EUtils bug where efetch would only return 500 sequences. Updates for Emboss commandlines, water and tranalign. Fixes to the FormatIO system of file conversion. C++ code (KDTree, Affy) now compiled by default on most platforms -- thanks to Michael for some nice distutils hacks and many people for testing. Deprecated Bio.sequtils -- use Bio.SeqUtils instead. Deprecated Bio.SVM -- use libsvm instead. Deprecated Bio.kMeans and Bio.xkMeans -- use Bio.cluster instead. Deprecated RecordFile -- doesn't appear to be finished code. Feb 16, 2004: Biopython 1.24 New parsers for Phred and Ace format files -- thanks to Frank Kauff New Code for dealing with NMR data -- thanks to Bob Bussell New SeqUtils modules for codon usage, isoelectric points and other protein properties -- thanks to Yair Benita New code for dealing with Wise contributed by Michael EZ-Retrieve sequence retrieval now supported thanks to Jeff Bio.Cluster updated along with documentation by Michiel BioSQL fixed so it now works with the current SQL schema -- thanks to Yves Bastide for patches Patches to Bio/__init__ to make it compatible with py2exe -- thanks to Leighton Pritchard Added __iter__ to all Biopython Iterators to make them Python 2.2 compatible Fixes to NCBIWWW for retrieving from NCBI -- thanks to Chris Wroe Retrieval of multiple alignment objects from BLAST records -- thanks to James Casbon Fixes to GenBank format for new tags by Peter Parsing fixes in clustalw parsed -- thanks to Greg Singer and Iddo Fasta Indexes can have a specified filename -- thanks to Chunlei Wu Fix to Prosite parser -- thanks to Mike Liang Fix in GenBank parsing -- mRNAs now get strand information Oct 18, 2003: Biopython 1.23 Fixed distribution of files in Bio/Cluster Now distributing Bio/KDTree/_KDTree.swig.C minor updates in installation code added mmCIF support for PDB files Oct 9, 2003: Biopython 1.22 Added Peter Slicker's patches for speeding up modules under Python 2.3 Fixed Martel installation. Does not install Bio.Cluster without Numeric. Distribute EUtils DTDs. Yves Bastide patched NCBIStandalone.Iterator to be Python 2.0 iterator Ashleigh's string coersion fixes in Clustalw. Yair Benita added precision to the protein molecular weights. Bartek updated AlignAce.Parser and added Motif.sim method bug fixes in Michiel De Hoon's clustering library Iddo's bug fixes to Bio.Enzyme and new RecordConsumer Guido Draheim added patches for fixing import path to xbb scripts regression tests updated to be Python 2.3 compatible GenBank.NCBIDictionary is smarter about guessing the format Jul 28, 2003: Biopython 1.21 Martel added back into the released package new AlignACE module by Bartek Wilczynski Andreas Kuntzagk fix for GenBank Iterator on empty files Jul 27, 2003: Biopython 1.20 added Andrew Dalke's EUtils library added Michiel de Hoon's gene expression analysis package updates to setup code, now smarter about dependencies updates to test suite, now smarter about code that is imported Michael Hoffman's fixes to DocSQL syntax fixes in triemodule.c to compile on SGI, Python 2.1 compatible updates in NCBIStandalone, short query error Sebastian Bassi submitted code to calculate LCC complexity Greg Kettler's NCBIStandalone fix for long query lengths slew of miscellaneous fixes from George Paci miscellaneous cleanups and updates from Andreas Kuntzagk Peter Bienstman's fixes to Genbank code -- now parses whole database Kayte Lindner's LocusLink package miscellaneous speedups and code cleanup in ParserSupport by Brad Chapman miscellaneous BLAST fixes and updates Iddo added new code to parse BLAST table output format Karl Diedrich's patch to read T_Coffee files Larry Heisler's fix for primer3 output Bio.Medline now uses proper iterator objects copen now handles SIGTERM correctly small bugfixes and updates in Thomas Hamelryck's PDB package bugfixes and updates to SeqIO.FASTA reader updates to Registry system, conforms to 2003 hackathon OBDA spec Yu Huang patch to support tblastn in wublast expression Dec 17, 2002: Biopython 1.10 Python requirement bumped up to 2.2 hierarchy reorg, many things moved upwards into Bio namespace pairwise2 replaces fastpairwise and pairwise removed deprecated Sequence.py package minor bug fix in File.SGMLStripper added Scripts/debug/debug_blast_parser.py to diagnose blast parsing errors IPI supported by SwissProt/SProt.py parser large speedup for kmeans new registry framework for generic access to databases and parsers small bug fix in stringfns.split scripts that access NCBI moved over to new EUtils system new crc module biblio.py supports the EBI Bibliographic database new CDD parser new Ndb parser new ECell parser new Geo parser access to GFF databases new KDTree data structure new LocusLink parser new MarkovModel algorithm new Saf parser miscellaneous sequence handling functions in sequtils new SVDSuperimpose algorithm Dec 18, 2001: Biopython1.00a4 minor bug fix in NCBIStandalone.blastall optimization in dynamic programming code new modules for logistic regression and maximum entropy minor bug fix in ParserSupport minor bug fixes in SCOP package minor updates in the kMeans cluster selection code minor bug fixes in SubsMat code support for XML-formatted MEDLINE files added MultiProc.run to simplify splitting code across processors listfns.items now supports lists with unhashable items new data type for pathways new support for intelligenetics format new support for metatool format new support for NBRF format new support for generalized launching of applications new support for genetic algorithms minor bug fixes in GenBank parsing new support for Primer in the Emboss package new support for chromosome graphics new support for HMMs new support for NeuralNetwork slew of Martel fixes (see Martel docs) Sept 3, 2001: Biopython1.00a3 added package to support KEGG added sequtils module for computations on sequences added pairwise sequence alignment algorithm major bug fixes in UndoHandle format updates in PubMed Tk interface to kMeans clustering July 5, 2001: Biopython1.00a2 deprecated old regression testing frameworks deprecated Sequence.py Swiss-Prot parser bug fixes GenBank parser bug fixes Can now output GenBank format can now download many sequences at a time from GenBank kMeans clustering algorithm Kabat format now supported FSSP format now supported more functionality for alignment code SubsMat bug fixes and updates fixed memory leak in listfns bug fixes Martel bundled and part of the install procedure Medline.Parser bug fixes PubMed.download_many handles broken IDs better Mar 3, 2001: Biopython 1.00a1 Refactoring of modules. X/X.py moved to X/__init__.py. Can search sequences for Prosite patterns at ExPASy Can do BLAST searches against stable URL at NCBI Prosite Pattern bug fixes GenBank parser Complete Seq and SeqFeatures framework distutils cleanup compile warning cleanups support for UniGene code for working with substitution matrices Tools.MultiProc package for rudimentary multiprocessing stuff Nov 10, 2000: Biopython 0.90d04 Added support for multiple alignments, ClustalW BLAST updates, bug fixes, and BlastErrorParser Fixes for PSI-BLAST in master-slave mode Minor update in stringfns, split separators can be negated Added download_many function to PubMed xbbtools updates Prodoc parser now accepts a copyright at the end of a record Swiss-Prot parser now handles taxonomy ID tag Sept 6, 2000: Biopython 0.90d03 Blast updates: - bug fixes in NCBIStandalone, NCBIWWW - some __str__ methods in Record.py implemented (incomplete) Tests - new BLAST regression tests - prosite tests fixed New parsers for Rebase, Gobase pure python implementation of C-based tools Thomas Sicheritz-Ponten's xbbtools can now generate documentation from docstrings using HappyDoc Aug17-18, 2000: Bioinformatics Open Source Conference 2000 We had a very good Birds-of-a-Feather meeting: http://www.biopython.org/pipermail/biopython/2000-August/000360.html Aug 2, 2000: Biopython 0.90d02 is released. Blast updates: - now works with v2.0.14 - HSP.identities and HSP.positives now tuples - HSP.gaps added SCOP updates: - Lin.Iterator now works with release 50 Starting a tutorial New regression tests for Prodoc July 6, 2000: Biopython 0.90d01 is released. February 8, 2000: Anonymous CVS made available. August 1999 Biopython project founded. Call for Participation sent out to relevant mailing lists, news groups. The Biopython Project (http://www.biopython.org/) is a new open collaborative effort to develop freely available Python libraries and applications that address the needs of current and future work in bioinformatics, including sequence analysis, structural biology, pathways, expression data, etc. When available, the source code will be released as open source (http://www.biopython.org/License.shtml) under terms similar to Python. This is a Call for Participation for interested people to join the project. We are hoping to attract people from a diverse set of backgrounds to help with code development, site maintenance, scientific discussion, etc. This project is open to everyone. If you're interested, please visit the web page, join the biopython mailing list, and let us know what you think! Jeffrey Chang Andrew Dalke biopython-1.63/setup.py0000644000175000017500000003031712250104543014566 0ustar tratra00000000000000"""Distutils based setup script for Biopython. This uses Distutils (http://python.org/sigs/distutils-sig/) the standard python mechanism for installing packages. For the easiest installation just type the command: python setup.py install For more in-depth instructions, see the installation section of the Biopython manual, linked to from: http://biopython.org/wiki/Documentation Or for more details about the options available from distutils, look at the 'Installing Python Modules' distutils documentation, available from: http://python.org/sigs/distutils-sig/doc/ Or, if all else fails, feel free to write to the sign up to the Biopython mailing list and ask for help. See: http://biopython.org/wiki/Mailing_lists """ from __future__ import print_function import sys import os import shutil from distutils.core import setup from distutils.core import Command from distutils.command.install import install from distutils.command.build_py import build_py from distutils.command.build_ext import build_ext from distutils.extension import Extension _CHECKED = None def is_pypy(): import platform try: if platform.python_implementation() == 'PyPy': return True except AttributeError: #New in Python 2.6, not in Jython yet either pass return False def is_ironpython(): return sys.platform == "cli" #TODO - Use platform as in Pypy test? def get_yes_or_no(question, default): if default: option_str = "(Y/n)" default_str = 'y' else: option_str = "(y/N)" default_str = 'n' while True: print("%s %s:" % (question, option_str)) if sys.version_info[0] == 3: response = input().lower() else: response = raw_input().lower() if not response: response = default_str if response[0] in ['y', 'n']: break print("Please answer y or n.") return response[0] == 'y' # Make sure we have the right Python version. if sys.version_info[:2] < (2, 6): print("Biopython requires Python 2.6 or 2.7 (or Python 3.3 or later). " "Python %d.%d detected" % sys.version_info[:2]) sys.exit(1) elif sys.version_info[0] == 3 and sys.version_info[:2] < (3, 3): print("Biopython requires Python 3.3 or later (or Python 2.6 or 2.7). " "Python %d.%d detected" % sys.version_info[:2]) sys.exit(1) def check_dependencies_once(): # Call check_dependencies, but cache the result for subsequent # calls. global _CHECKED if _CHECKED is None: _CHECKED = check_dependencies() return _CHECKED def is_automated(): """Check for installation with easy_install or pip. """ is_automated = False # easy_install: --dist-dir option passed try: dist_dir_i = sys.argv.index("--dist-dir") except ValueError: dist_dir_i = None if dist_dir_i is not None: dist_dir = sys.argv[dist_dir_i + 1] if "egg-dist-tmp" in dist_dir: is_automated = True # pip -- calls from python directly with "-c" if sys.argv in [["-c", "develop", "--no-deps"], ["--no-deps", "-c", "develop"], ["-c", "egg_info"]] \ or "pip-egg-info" in sys.argv \ or sys.argv[:3] == ["-c", "install", "--record"] \ or sys.argv[:4] == ['-c', 'install', '--single-version-externally-managed', '--record']: is_automated = True return is_automated def check_dependencies(): """Return whether the installation should continue.""" # There should be some way for the user to tell specify not to # check dependencies. For example, it probably should not if # the user specified "-q". However, I'm not sure where # distutils stores that information. Also, install has a # --force option that gets saved in self.user_options. It # means overwrite previous installations. If the user has # forced an installation, should we also ignore dependencies? # We only check for NumPy, as this is a compile time dependency if is_Numpy_installed(): return True if is_automated(): return True # For automated builds go ahead with installed packages if os.name == 'java': return True # NumPy is not avaliable for Jython (for now) if is_pypy(): return True # Full NumPy not available for PyPy (for now) if is_ironpython(): return True # We're ignoring NumPy under IronPython (for now) print(""" Numerical Python (NumPy) is not installed. This package is required for many Biopython features. Please install it before you install Biopython. You can install Biopython anyway, but anything dependent on NumPy will not work. If you do this, and later install NumPy, you should then re-install Biopython. You can find NumPy at http://www.numpy.org """) # exit automatically if running as part of some script # (e.g. PyPM, ActiveState's Python Package Manager) if not sys.stdout.isatty(): sys.exit(-1) # We can ask the user return get_yes_or_no("Do you want to continue this installation?", False) class install_biopython(install): """Override the standard install to check for dependencies. This will just run the normal install, and then print warning messages if packages are missing. """ # Adds support for the single-version-externally-managed flag # which is present in setuptools but not distutils. pip requires it. # In setuptools this forces installation the "old way" which we # only support here, so we just make it a no-op. user_options = install.user_options + [ ('single-version-externally-managed', None, "used by system package builders to create 'flat' eggs"), ] boolean_options = install.boolean_options + [ 'single-version-externally-managed', ] def initialize_options(self): install.initialize_options(self) self.single_version_externally_managed = None def run(self): if check_dependencies_once(): # Run the normal install. install.run(self) class build_py_biopython(build_py): def run(self): if not check_dependencies_once(): return # Add software that requires Numpy to be installed. if is_Numpy_installed(): self.packages.extend(NUMPY_PACKAGES) build_py.run(self) class build_ext_biopython(build_ext): def run(self): if not check_dependencies_once(): return build_ext.run(self) class test_biopython(Command): """Run all of the tests for the package. This is a automatic test run class to make distutils kind of act like perl. With this you can do: python setup.py build python setup.py install python setup.py test """ description = "Automatically run the test suite for Biopython." user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): this_dir = os.getcwd() # change to the test dir and run the tests os.chdir("Tests") sys.path.insert(0, '') import run_tests run_tests.main([]) # change back to the current directory os.chdir(this_dir) def can_import(module_name): """can_import(module_name) -> module or None""" try: return __import__(module_name) except ImportError: return None def is_Numpy_installed(): if is_pypy(): return False return bool(can_import("numpy")) # --- set up the packages we are going to install # standard biopython packages PACKAGES = [ 'Bio', 'Bio.Align', 'Bio.Align.Applications', 'Bio.AlignIO', 'Bio.Alphabet', 'Bio.Application', 'Bio.Blast', 'Bio.CAPS', 'Bio.Compass', 'Bio.Crystal', 'Bio.Data', 'Bio.Emboss', 'Bio.Entrez', 'Bio.ExPASy', 'Bio.FSSP', 'Bio.GA', 'Bio.GA.Crossover', 'Bio.GA.Mutation', 'Bio.GA.Repair', 'Bio.GA.Selection', 'Bio.GenBank', 'Bio.Geo', 'Bio.Graphics', 'Bio.Graphics.GenomeDiagram', 'Bio.HMM', 'Bio.KEGG', 'Bio.KEGG.Compound', 'Bio.KEGG.Enzyme', 'Bio.KEGG.Map', 'Bio.Medline', 'Bio.Motif', 'Bio.Motif.Parsers', 'Bio.Motif.Applications', 'Bio.motifs', 'Bio.motifs.applications', 'Bio.motifs.jaspar', 'Bio.NeuralNetwork', 'Bio.NeuralNetwork.BackPropagation', 'Bio.NeuralNetwork.Gene', 'Bio.Nexus', 'Bio.NMR', 'Bio.Pathway', 'Bio.Pathway.Rep', 'Bio.PDB', 'Bio.PopGen', 'Bio.PopGen.Async', 'Bio.PopGen.FDist', 'Bio.PopGen.GenePop', 'Bio.PopGen.SimCoal', 'Bio.Restriction', 'Bio.SCOP', 'Bio.SearchIO', 'Bio.SearchIO._model', 'Bio.SearchIO.BlastIO', 'Bio.SearchIO.HmmerIO', 'Bio.SearchIO.ExonerateIO', 'Bio.SeqIO', 'Bio.SeqUtils', 'Bio.Sequencing', 'Bio.Sequencing.Applications', 'Bio.Statistics', 'Bio.SubsMat', 'Bio.SVDSuperimposer', 'Bio.SwissProt', 'Bio.TogoWS', 'Bio.Phylo', 'Bio.Phylo.Applications', 'Bio.Phylo.PAML', 'Bio.UniGene', 'Bio.UniProt', 'Bio.Wise', 'Bio._py3k', #Other top level packages, 'BioSQL', ] # packages that require Numeric Python NUMPY_PACKAGES = [ 'Bio.Affy', 'Bio.Cluster', 'Bio.KDTree', ] if os.name == 'java': # Jython doesn't support C extensions EXTENSIONS = [] elif is_pypy() or is_ironpython(): # Skip C extensions for now EXTENSIONS = [] else: EXTENSIONS = [ Extension('Bio.cpairwise2', ['Bio/cpairwise2module.c'], ), Extension('Bio.trie', ['Bio/triemodule.c', 'Bio/trie.c'], include_dirs=["Bio"] ), Extension('Bio.Nexus.cnexus', ['Bio/Nexus/cnexus.c'] ), ] #Add extensions that requires NumPy to build if is_Numpy_installed(): import numpy numpy_include_dir = numpy.get_include() EXTENSIONS.append( Extension('Bio.Cluster.cluster', ['Bio/Cluster/clustermodule.c', 'Bio/Cluster/cluster.c'], include_dirs=[numpy_include_dir], )) EXTENSIONS.append( Extension('Bio.KDTree._CKDTree', ["Bio/KDTree/KDTree.c", "Bio/KDTree/KDTreemodule.c"], include_dirs=[numpy_include_dir], )) EXTENSIONS.append( Extension('Bio.Motif._pwm', ["Bio/Motif/_pwm.c"], include_dirs=[numpy_include_dir], )) EXTENSIONS.append( Extension('Bio.motifs._pwm', ["Bio/motifs/_pwm.c"], include_dirs=[numpy_include_dir], )) #We now define the Biopython version number in Bio/__init__.py #Here we can't use "import Bio" then "Bio.__version__" as that would #tell us the version of Biopython already installed (if any). __version__ = "Undefined" for line in open('Bio/__init__.py'): if (line.startswith('__version__')): exec(line.strip()) #Simple trick to use the 2to3 converted source under Python 3, #change the current directory before/after running setup. #Note as a side effect there will be a build folder underneath #the python3_source folder. old_path = os.getcwd() try: src_path = python3_source except NameError: src_path = os.path.dirname(os.path.abspath(sys.argv[0])) os.chdir(src_path) sys.path.insert(0, src_path) setup_args = { "name": 'biopython', "version": __version__, "author": 'The Biopython Consortium', "author_email": 'biopython@biopython.org', "url": 'http://www.biopython.org/', "description": 'Freely available tools for computational molecular biology.', "download_url": 'http://biopython.org/DIST/', "cmdclass": { "install": install_biopython, "build_py": build_py_biopython, "build_ext": build_ext_biopython, "test": test_biopython, }, "packages": PACKAGES, "ext_modules": EXTENSIONS, "package_data": { 'Bio.Entrez': ['DTDs/*.dtd', 'DTDs/*.ent', 'DTDs/*.mod'], 'Bio.PopGen': ['SimCoal/data/*.par'], }, } try: setup(**setup_args) finally: del sys.path[0] os.chdir(old_path) biopython-1.63/BioSQL/0000755000175000017500000000000012250104773014146 5ustar tratra00000000000000biopython-1.63/BioSQL/Loader.py0000644000175000017500000013512012250104543015723 0ustar tratra00000000000000# Copyright 2002 by Andrew Dalke. All rights reserved. # Revisions 2007-2009 copyright by Peter Cock. All rights reserved. # Revisions 2008 copyright by Cymon J. Cox. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Note that BioSQL (including the database schema and scripts) is # available and licensed separately. Please consult www.biosql.org """Load biopython objects into a BioSQL database for persistent storage. This code makes it possible to store biopython objects in a relational database and then retrieve them back. You shouldn't use any of the classes in this module directly. Rather, call the load() method on a database object. """ # standard modules from __future__ import print_function from time import gmtime, strftime # biopython from Bio import Alphabet from Bio.SeqUtils.CheckSum import crc64 from Bio import Entrez from Bio.Seq import UnknownSeq from Bio._py3k import _is_int_or_long from Bio._py3k import range from Bio._py3k import basestring class DatabaseLoader: """Object used to load SeqRecord objects into a BioSQL database.""" def __init__(self, adaptor, dbid, fetch_NCBI_taxonomy=False): """Initialize with connection information for the database. Creating a DatabaseLoader object is normally handled via the BioSeqDatabase DBServer object, for example: from BioSQL import BioSeqDatabase server = BioSeqDatabase.open_database(driver="MySQLdb", user="gbrowse", passwd = "biosql", host = "localhost", db="test_biosql") try: db = server["test"] except KeyError: db = server.new_database("test", description="For testing GBrowse") """ self.adaptor = adaptor self.dbid = dbid self.fetch_NCBI_taxonomy = fetch_NCBI_taxonomy def load_seqrecord(self, record): """Load a Biopython SeqRecord into the database. """ bioentry_id = self._load_bioentry_table(record) self._load_bioentry_date(record, bioentry_id) self._load_biosequence(record, bioentry_id) self._load_comment(record, bioentry_id) self._load_dbxrefs(record, bioentry_id) references = record.annotations.get('references', ()) for reference, rank in zip(references, list(range(len(references)))): self._load_reference(reference, rank, bioentry_id) self._load_annotations(record, bioentry_id) for seq_feature_num in range(len(record.features)): seq_feature = record.features[seq_feature_num] self._load_seqfeature(seq_feature, seq_feature_num, bioentry_id) def _get_ontology_id(self, name, definition=None): """Returns the identifier for the named ontology (PRIVATE). This looks through the onotology table for a the given entry name. If it is not found, a row is added for this ontology (using the definition if supplied). In either case, the id corresponding to the provided name is returned, so that you can reference it in another table. """ oids = self.adaptor.execute_and_fetch_col0( "SELECT ontology_id FROM ontology WHERE name = %s", (name,)) if oids: return oids[0] self.adaptor.execute( "INSERT INTO ontology(name, definition) VALUES (%s, %s)", (name, definition)) return self.adaptor.last_id("ontology") def _get_term_id(self, name, ontology_id=None, definition=None, identifier=None): """Get the id that corresponds to a term (PRIVATE). This looks through the term table for a the given term. If it is not found, a new id corresponding to this term is created. In either case, the id corresponding to that term is returned, so that you can reference it in another table. The ontology_id should be used to disambiguate the term. """ # try to get the term id sql = r"SELECT term_id FROM term " \ r"WHERE name = %s" fields = [name] if ontology_id: sql += ' AND ontology_id = %s' fields.append(ontology_id) id_results = self.adaptor.execute_and_fetchall(sql, fields) # something is wrong if len(id_results) > 1: raise ValueError("Multiple term ids for %s: %r" % (name, id_results)) elif len(id_results) == 1: return id_results[0][0] else: sql = r"INSERT INTO term (name, definition," \ r" identifier, ontology_id)" \ r" VALUES (%s, %s, %s, %s)" self.adaptor.execute(sql, (name, definition, identifier, ontology_id)) return self.adaptor.last_id("term") def _add_dbxref(self, dbname, accession, version): """Insert a dbxref and return its id.""" self.adaptor.execute( "INSERT INTO dbxref(dbname, accession, version)" " VALUES (%s, %s, %s)", (dbname, accession, version)) return self.adaptor.last_id("dbxref") def _get_taxon_id(self, record): """Get the taxon id for this record (PRIVATE). record - a SeqRecord object This searches the taxon/taxon_name tables using the NCBI taxon ID, scientific name and common name to find the matching taxon table entry's id. If the species isn't in the taxon table, and we have at least the NCBI taxon ID, scientific name or common name, at least a minimal stub entry is created in the table. Returns the taxon id (database key for the taxon table, not an NCBI taxon ID), or None if the taxonomy information is missing. See also the BioSQL script load_ncbi_taxonomy.pl which will populate and update the taxon/taxon_name tables with the latest information from the NCBI. """ # To find the NCBI taxid, first check for a top level annotation ncbi_taxon_id = None if "ncbi_taxid" in record.annotations: #Could be a list of IDs. if isinstance(record.annotations["ncbi_taxid"], list): if len(record.annotations["ncbi_taxid"]) == 1: ncbi_taxon_id = record.annotations["ncbi_taxid"][0] else: ncbi_taxon_id = record.annotations["ncbi_taxid"] if not ncbi_taxon_id: # Secondly, look for a source feature for f in record.features: if f.type == 'source': quals = getattr(f, 'qualifiers', {}) if "db_xref" in quals: for db_xref in f.qualifiers["db_xref"]: if db_xref.startswith("taxon:"): ncbi_taxon_id = int(db_xref[6:]) break if ncbi_taxon_id: break try: scientific_name = record.annotations["organism"][:255] except KeyError: scientific_name = None try: common_name = record.annotations["source"][:255] except KeyError: common_name = None # Note: The maximum length for taxon names in the schema is 255. # Cropping it now should help in getting a match when searching, # and avoids an error if we try and add these to the database. if ncbi_taxon_id: #Good, we have the NCBI taxon to go on - this is unambiguous :) #Note that the scientific name and common name will only be #used if we have to record a stub entry. return self._get_taxon_id_from_ncbi_taxon_id(ncbi_taxon_id, scientific_name, common_name) if not common_name and not scientific_name: # Nothing to go on... and there is no point adding # a new entry to the database. We'll just leave this # sequence's taxon as a NULL in the database. return None # Next, we'll try to find a match based on the species name # (stored in GenBank files as the organism and/or the source). if scientific_name: taxa = self.adaptor.execute_and_fetch_col0( "SELECT taxon_id FROM taxon_name" " WHERE name_class = 'scientific name' AND name = %s", (scientific_name,)) if taxa: #Good, mapped the scientific name to a taxon table entry return taxa[0] # Last chance... if common_name: taxa = self.adaptor.execute_and_fetch_col0( "SELECT DISTINCT taxon_id FROM taxon_name" " WHERE name = %s", (common_name,)) #Its natural that several distinct taxa will have the same common #name - in which case we can't resolve the taxon uniquely. if len(taxa) > 1: raise ValueError("Taxa: %d species have name %r" % ( len(taxa), common_name)) if taxa: #Good, mapped the common name to a taxon table entry return taxa[0] # At this point, as far as we can tell, this species isn't # in the taxon table already. So we'll have to add it. # We don't have an NCBI taxonomy ID, so if we do record just # a stub entry, there is no simple way to fix this later. # # TODO - Should we try searching the NCBI taxonomy using the # species name? # # OK, let's try inserting the species. # Chances are we don't have enough information ... # Furthermore, it won't be in the hierarchy. lineage = [] for c in record.annotations.get("taxonomy", []): lineage.append([None, None, c]) if lineage: lineage[-1][1] = "genus" lineage.append([None, "species", record.annotations["organism"]]) # XXX do we have them? if "subspecies" in record.annotations: lineage.append([None, "subspecies", record.annotations["subspecies"]]) if "variant" in record.annotations: lineage.append([None, "varietas", record.annotations["variant"]]) lineage[-1][0] = ncbi_taxon_id left_value = self.adaptor.execute_one( "SELECT MAX(left_value) FROM taxon")[0] if not left_value: left_value = 0 left_value += 1 # XXX -- Brad: Fixing this for now in an ugly way because # I am getting overlaps for right_values. I need to dig into this # more to actually understand how it works. I'm not sure it is # actually working right anyhow. right_start_value = self.adaptor.execute_one( "SELECT MAX(right_value) FROM taxon")[0] if not right_start_value: right_start_value = 0 right_value = right_start_value + 2 * len(lineage) - 1 parent_taxon_id = None for taxon in lineage: self.adaptor.execute( "INSERT INTO taxon(parent_taxon_id, ncbi_taxon_id, node_rank," " left_value, right_value)" " VALUES (%s, %s, %s, %s, %s)", (parent_taxon_id, taxon[0], taxon[1], left_value, right_value)) taxon_id = self.adaptor.last_id("taxon") self.adaptor.execute( "INSERT INTO taxon_name(taxon_id, name, name_class)" "VALUES (%s, %s, 'scientific name')", (taxon_id, taxon[2][:255])) #Note the name field is limited to 255, some SwissProt files #have a multi-species name which can be longer. So truncate this. left_value += 1 right_value -= 1 parent_taxon_id = taxon_id if common_name: self.adaptor.execute( "INSERT INTO taxon_name(taxon_id, name, name_class)" "VALUES (%s, %s, 'common name')", ( taxon_id, common_name)) return taxon_id def _fix_name_class(self, entrez_name): """Map Entrez name terms to those used in taxdump (PRIVATE). We need to make this conversion to match the taxon_name.name_class values used by the BioSQL load_ncbi_taxonomy.pl script. e.g. "ScientificName" -> "scientific name", "EquivalentName" -> "equivalent name", "Synonym" -> "synonym", """ #Add any special cases here: # #known = {} #try: # return known[entrez_name] #except KeyError: # pass #Try automatically by adding spaces before each capital def add_space(letter): """Adds a space before a capital letter.""" if letter.isupper(): return " " + letter.lower() else: return letter answer = "".join(add_space(letter) for letter in entrez_name).strip() assert answer == answer.lower() return answer def _get_taxon_id_from_ncbi_taxon_id(self, ncbi_taxon_id, scientific_name=None, common_name=None): """Get the taxon id for this record from the NCBI taxon ID (PRIVATE). ncbi_taxon_id - string containing an NCBI taxon id scientific_name - string, used if a stub entry is recorded common_name - string, used if a stub entry is recorded This searches the taxon table using ONLY the NCBI taxon ID to find the matching taxon table entry's ID (database key). If the species isn't in the taxon table, and the fetch_NCBI_taxonomy flag is true, Biopython will attempt to go online using Bio.Entrez to fetch the official NCBI lineage, recursing up the tree until an existing entry is found in the database or the full lineage has been fetched. Otherwise the NCBI taxon ID, scientific name and common name are recorded as a minimal stub entry in the taxon and taxon_name tables. Any partial information about the lineage from the SeqRecord is NOT recorded. This should mean that (re)running the BioSQL script load_ncbi_taxonomy.pl can fill in the taxonomy lineage. Returns the taxon id (database key for the taxon table, not an NCBI taxon ID). """ assert ncbi_taxon_id taxon_id = self.adaptor.execute_and_fetch_col0( "SELECT taxon_id FROM taxon WHERE ncbi_taxon_id = %s", (int(ncbi_taxon_id),)) if taxon_id: #Good, we have mapped the NCBI taxid to a taxon table entry return taxon_id[0] # At this point, as far as we can tell, this species isn't # in the taxon table already. So we'll have to add it. parent_taxon_id = None rank = "species" genetic_code = None mito_genetic_code = None species_names = [] if scientific_name: species_names.append(("scientific name", scientific_name)) if common_name: species_names.append(("common name", common_name)) if self.fetch_NCBI_taxonomy: #Go online to get the parent taxon ID! handle = Entrez.efetch(db="taxonomy", id=ncbi_taxon_id, retmode="XML") taxonomic_record = Entrez.read(handle) if len(taxonomic_record) == 1: assert taxonomic_record[0]["TaxId"] == str(ncbi_taxon_id), \ "%s versus %s" % (taxonomic_record[0]["TaxId"], ncbi_taxon_id) parent_taxon_id = self._get_taxon_id_from_ncbi_lineage( taxonomic_record[0]["LineageEx"]) rank = taxonomic_record[0]["Rank"] genetic_code = taxonomic_record[0]["GeneticCode"]["GCId"] mito_genetic_code = taxonomic_record[0]["MitoGeneticCode"]["MGCId"] species_names = [("scientific name", taxonomic_record[0]["ScientificName"])] try: for name_class, names in taxonomic_record[0]["OtherNames"].items(): name_class = self._fix_name_class(name_class) if not isinstance(names, list): #The Entrez parser seems to return single entry #lists as just a string which is annoying. names = [names] for name in names: #Want to ignore complex things like ClassCDE entries if isinstance(name, basestring): species_names.append((name_class, name)) except KeyError: #OtherNames isn't always present, #e.g. NCBI taxon 41205, Bromheadia finlaysoniana pass else: pass # If we are not allowed to go online, we will record the bare minimum; # as long as the NCBI taxon id is present, then (re)running # load_ncbi_taxonomy.pl should fill in the taxonomomy lineage # (and update the species names). # # I am NOT going to try and record the lineage, even if it # is in the record annotation as a list of names, as we won't # know the NCBI taxon IDs for these parent nodes. self.adaptor.execute( "INSERT INTO taxon(parent_taxon_id, ncbi_taxon_id, node_rank," " genetic_code, mito_genetic_code, left_value, right_value)" " VALUES (%s, %s, %s, %s, %s, %s, %s)", (parent_taxon_id, ncbi_taxon_id, rank, genetic_code, mito_genetic_code, None, None)) taxon_id = self.adaptor.last_id("taxon") #Record the scientific name, common name, etc for name_class, name in species_names: self.adaptor.execute( "INSERT INTO taxon_name(taxon_id, name, name_class)" " VALUES (%s, %s, %s)", (taxon_id, name[:255], name_class)) return taxon_id def _get_taxon_id_from_ncbi_lineage(self, taxonomic_lineage): """This is recursive! (PRIVATE). taxonomic_lineage - list of taxonomy dictionaries from Bio.Entrez First dictionary in list is the taxonomy root, highest would be the species. Each dictionary includes: - TaxID (string, NCBI taxon id) - Rank (string, e.g. "species", "genus", ..., "phylum", ...) - ScientificName (string) (and that is all at the time of writing) This method will record all the lineage given, returning the taxon id (database key, not NCBI taxon id) of the final entry (the species). """ ncbi_taxon_id = taxonomic_lineage[-1]["TaxId"] #Is this in the database already? Check the taxon table... taxon_id = self.adaptor.execute_and_fetch_col0( "SELECT taxon_id FROM taxon" " WHERE ncbi_taxon_id=%s" % ncbi_taxon_id) if taxon_id: # we could verify that the Scientific Name etc in the database # is the same and update it or print a warning if not... if isinstance(taxon_id, list): assert len(taxon_id) == 1 return taxon_id[0] else: return taxon_id #We have to record this. if len(taxonomic_lineage) > 1: #Use recursion to find out the taxon id (database key) of the parent. parent_taxon_id = self._get_taxon_id_from_ncbi_lineage(taxonomic_lineage[:-1]) assert _is_int_or_long(parent_taxon_id), repr(parent_taxon_id) else: parent_taxon_id = None # INSERT new taxon rank = taxonomic_lineage[-1].get("Rank", None) self.adaptor.execute( "INSERT INTO taxon(ncbi_taxon_id, parent_taxon_id, node_rank)" " VALUES (%s, %s, %s)", (ncbi_taxon_id, parent_taxon_id, rank)) taxon_id = self.adaptor.last_id("taxon") assert isinstance(taxon_id, (int, long)), repr(taxon_id) # ... and its name in taxon_name scientific_name = taxonomic_lineage[-1].get("ScientificName", None) if scientific_name: self.adaptor.execute( "INSERT INTO taxon_name(taxon_id, name, name_class)" " VALUES (%s, %s, 'scientific name')", (taxon_id, scientific_name[:255])) return taxon_id def _load_bioentry_table(self, record): """Fill the bioentry table with sequence information (PRIVATE). record - SeqRecord object to add to the database. """ # get the pertinent info and insert it if record.id.count(".") == 1: # try to get a version from the id #This assumes the string is something like "XXXXXXXX.123" accession, version = record.id.split('.') try: version = int(version) except ValueError: accession = record.id version = 0 else: # otherwise just use a version of 0 accession = record.id version = 0 if "accessions" in record.annotations \ and isinstance(record.annotations["accessions"], list) \ and record.annotations["accessions"]: #Take the first accession (one if there is more than one) accession = record.annotations["accessions"][0] #Find the taxon id (this is not just the NCBI Taxon ID) #NOTE - If the species isn't defined in the taxon table, #a new minimal entry is created. taxon_id = self._get_taxon_id(record) if "gi" in record.annotations: identifier = record.annotations["gi"] else: identifier = record.id #Allow description and division to default to NULL as in BioPerl. description = getattr(record, 'description', None) division = record.annotations.get("data_file_division", None) sql = """ INSERT INTO bioentry ( biodatabase_id, taxon_id, name, accession, identifier, division, description, version) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s)""" #print self.dbid, taxon_id, record.name, accession, identifier, \ # division, description, version self.adaptor.execute(sql, (self.dbid, taxon_id, record.name, accession, identifier, division, description, version)) # now retrieve the id for the bioentry bioentry_id = self.adaptor.last_id('bioentry') return bioentry_id def _load_bioentry_date(self, record, bioentry_id): """Add the effective date of the entry into the database. record - a SeqRecord object with an annotated date bioentry_id - corresponding database identifier """ # dates are GenBank style, like: # 14-SEP-2000 date = record.annotations.get("date", strftime("%d-%b-%Y", gmtime()).upper()) if isinstance(date, list): date = date[0] annotation_tags_id = self._get_ontology_id("Annotation Tags") date_id = self._get_term_id("date_changed", annotation_tags_id) sql = r"INSERT INTO bioentry_qualifier_value" \ r" (bioentry_id, term_id, value, rank)" \ r" VALUES (%s, %s, %s, 1)" self.adaptor.execute(sql, (bioentry_id, date_id, date)) def _load_biosequence(self, record, bioentry_id): """Record a SeqRecord's sequence and alphabet in the database (PRIVATE). record - a SeqRecord object with a seq property bioentry_id - corresponding database identifier """ if record.seq is None: #The biosequence table entry is optional, so if we haven't #got a sequence, we don't need to write to the table. return # determine the string representation of the alphabet if isinstance(record.seq.alphabet, Alphabet.DNAAlphabet): alphabet = "dna" elif isinstance(record.seq.alphabet, Alphabet.RNAAlphabet): alphabet = "rna" elif isinstance(record.seq.alphabet, Alphabet.ProteinAlphabet): alphabet = "protein" else: alphabet = "unknown" if isinstance(record.seq, UnknownSeq): seq_str = None else: seq_str = str(record.seq) sql = r"INSERT INTO biosequence (bioentry_id, version, " \ r"length, seq, alphabet) " \ r"VALUES (%s, 0, %s, %s, %s)" self.adaptor.execute(sql, (bioentry_id, len(record.seq), seq_str, alphabet)) def _load_comment(self, record, bioentry_id): """Record a SeqRecord's annotated comment in the database (PRIVATE). record - a SeqRecord object with an annotated comment bioentry_id - corresponding database identifier """ comments = record.annotations.get('comment') if not comments: return if not isinstance(comments, list): #It should be a string then... comments = [comments] for index, comment in enumerate(comments): comment = comment.replace('\n', ' ') #TODO - Store each line as a separate entry? This would preserve #the newlines, but we should check BioPerl etc to be consistent. sql = "INSERT INTO comment (bioentry_id, comment_text, rank)" \ " VALUES (%s, %s, %s)" self.adaptor.execute(sql, (bioentry_id, comment, index + 1)) def _load_annotations(self, record, bioentry_id): """Record a SeqRecord's misc annotations in the database (PRIVATE). The annotation strings are recorded in the bioentry_qualifier_value table, except for special cases like the reference, comment and taxonomy which are handled with their own tables. record - a SeqRecord object with an annotations dictionary bioentry_id - corresponding database identifier """ mono_sql = "INSERT INTO bioentry_qualifier_value" \ "(bioentry_id, term_id, value)" \ " VALUES (%s, %s, %s)" many_sql = "INSERT INTO bioentry_qualifier_value" \ "(bioentry_id, term_id, value, rank)" \ " VALUES (%s, %s, %s, %s)" tag_ontology_id = self._get_ontology_id('Annotation Tags') for key, value in record.annotations.items(): if key in ["references", "comment", "ncbi_taxid", "date"]: #Handled separately continue term_id = self._get_term_id(key, ontology_id=tag_ontology_id) if isinstance(value, list) or isinstance(value, tuple): rank = 0 for entry in value: if isinstance(entry, str) or isinstance(entry, int): #Easy case rank += 1 self.adaptor.execute(many_sql, (bioentry_id, term_id, str(entry), rank)) else: pass #print "Ignoring annotation '%s' sub-entry of type '%s'" \ # % (key, str(type(entry))) elif isinstance(value, str) or isinstance(value, int): #Have a simple single entry, leave rank as the DB default self.adaptor.execute(mono_sql, (bioentry_id, term_id, str(value))) else: pass #print "Ignoring annotation '%s' entry of type '%s'" \ # % (key, type(value)) def _load_reference(self, reference, rank, bioentry_id): """Record a SeqRecord's annotated references in the database (PRIVATE). record - a SeqRecord object with annotated references bioentry_id - corresponding database identifier """ refs = None if reference.medline_id: refs = self.adaptor.execute_and_fetch_col0( "SELECT reference_id" " FROM reference JOIN dbxref USING (dbxref_id)" " WHERE dbname = 'MEDLINE' AND accession = %s", (reference.medline_id,)) if not refs and reference.pubmed_id: refs = self.adaptor.execute_and_fetch_col0( "SELECT reference_id" " FROM reference JOIN dbxref USING (dbxref_id)" " WHERE dbname = 'PUBMED' AND accession = %s", (reference.pubmed_id,)) if not refs: s = [] for f in reference.authors, reference.title, reference.journal: s.append(f or "") crc = crc64("".join(s)) refs = self.adaptor.execute_and_fetch_col0( "SELECT reference_id FROM reference" r" WHERE crc = %s", (crc,)) if not refs: if reference.medline_id: dbxref_id = self._add_dbxref("MEDLINE", reference.medline_id, 0) elif reference.pubmed_id: dbxref_id = self._add_dbxref("PUBMED", reference.pubmed_id, 0) else: dbxref_id = None authors = reference.authors or None title = reference.title or None #The location/journal field cannot be Null, so default #to an empty string rather than None: journal = reference.journal or "" self.adaptor.execute( "INSERT INTO reference (dbxref_id, location," " title, authors, crc)" " VALUES (%s, %s, %s, %s, %s)", (dbxref_id, journal, title, authors, crc)) reference_id = self.adaptor.last_id("reference") else: reference_id = refs[0] if reference.location: start = 1 + int(str(reference.location[0].start)) end = int(str(reference.location[0].end)) else: start = None end = None sql = "INSERT INTO bioentry_reference (bioentry_id, reference_id," \ " start_pos, end_pos, rank)" \ " VALUES (%s, %s, %s, %s, %s)" self.adaptor.execute(sql, (bioentry_id, reference_id, start, end, rank + 1)) def _load_seqfeature(self, feature, feature_rank, bioentry_id): """Load a biopython SeqFeature into the database (PRIVATE). """ seqfeature_id = self._load_seqfeature_basic(feature.type, feature_rank, bioentry_id) self._load_seqfeature_locations(feature, seqfeature_id) self._load_seqfeature_qualifiers(feature.qualifiers, seqfeature_id) def _load_seqfeature_basic(self, feature_type, feature_rank, bioentry_id): """Load the first tables of a seqfeature and returns the id (PRIVATE). This loads the "key" of the seqfeature (ie. CDS, gene) and the basic seqfeature table itself. """ ontology_id = self._get_ontology_id('SeqFeature Keys') seqfeature_key_id = self._get_term_id(feature_type, ontology_id=ontology_id) # XXX source is always EMBL/GenBank/SwissProt here; it should depend on # the record (how?) source_cat_id = self._get_ontology_id('SeqFeature Sources') source_term_id = self._get_term_id('EMBL/GenBank/SwissProt', ontology_id=source_cat_id) sql = r"INSERT INTO seqfeature (bioentry_id, type_term_id, " \ r"source_term_id, rank) VALUES (%s, %s, %s, %s)" self.adaptor.execute(sql, (bioentry_id, seqfeature_key_id, source_term_id, feature_rank + 1)) seqfeature_id = self.adaptor.last_id('seqfeature') return seqfeature_id def _load_seqfeature_locations(self, feature, seqfeature_id): """Load all of the locations for a SeqFeature into tables (PRIVATE). This adds the locations related to the SeqFeature into the seqfeature_location table. Fuzzies are not handled right now. For a simple location, ie (1..2), we have a single table row with seq_start = 1, seq_end = 2, location_rank = 1. For split locations, ie (1..2, 3..4, 5..6) we would have three row tables with: start = 1, end = 2, rank = 1 start = 3, end = 4, rank = 2 start = 5, end = 6, rank = 3 """ # TODO - Record an ontology for the locations (using location.term_id) # which for now as in BioPerl we leave defaulting to NULL. if feature.location_operator and feature.location_operator != "join": # e.g. order locations... we don't record "order" so it # will become a "join" on reloading. What does BioPerl do? import warnings from Bio import BiopythonWarning warnings.warn("%s location operators are not fully supported" % feature.location_operator, BiopythonWarning) #This will be a list of length one for simple FeatureLocation: parts = feature.location.parts if parts and set(loc.strand for loc in parts)==set([-1]): #To mimic prior behaviour of Biopython+BioSQL, reverse order parts = parts[::-1] #TODO - Check what BioPerl does; see also BioSeq.py code for rank, loc in enumerate(parts): self._insert_location(loc, rank + 1, seqfeature_id) def _insert_location(self, location, rank, seqfeature_id): """Add a location of a SeqFeature to the seqfeature_location table (PRIVATE). TODO - Add location operator to location_qualifier_value? """ # convert biopython locations to the 1-based location system # used in bioSQL # XXX This could also handle fuzzies start = int(location.start) + 1 end = int(location.end) # Biopython uses None when we don't know strand information but # BioSQL requires something (non null) and sets this as zero # So we'll use the strand or 0 if Biopython spits out None strand = location.strand or 0 # TODO - Record an ontology term for the location (location.term_id) # which for now like BioPerl we'll leave as NULL. # This might allow us to record "between" positions properly, but I # doesn't really see how it could work for before/after fuzzy positions loc_term_id = None if location.ref: # sub_feature remote locations when they are in the same db as the current # record do not have a value for ref_db, which the SeqFeature object # stores as None. BioSQL schema requires a varchar and is not NULL dbxref_id = self._get_dbxref_id(location.ref_db or "", location.ref) else: dbxref_id = None sql = r"INSERT INTO location (seqfeature_id, dbxref_id, term_id," \ r"start_pos, end_pos, strand, rank) " \ r"VALUES (%s, %s, %s, %s, %s, %s, %s)" self.adaptor.execute(sql, (seqfeature_id, dbxref_id, loc_term_id, start, end, strand, rank)) """ # See Bug 2677 # TODO - Record the location_operator (e.g. "join" or "order") # using the location_qualifier_value table (which we and BioPerl # have historically left empty). # Note this will need an ontology term for the location qualifer # (location_qualifier_value.term_id) for which oddly the schema # does not allow NULL. if feature.location_operator: #e.g. "join" (common), #or "order" (see Tests/GenBank/protein_refseq2.gb) location_id = self.adaptor.last_id('location') loc_qual_term_id = None # Not allowed in BioSQL v1.0.1 sql = r"INSERT INTO location_qualifier_value" \ r"(location_id, term_id, value)" \ r"VALUES (%s, %s, %s)" self.adaptor.execute(sql, (location_id, loc_qual_term_id, feature.location_operator)) """ def _load_seqfeature_qualifiers(self, qualifiers, seqfeature_id): """Insert the (key, value) pair qualifiers relating to a feature (PRIVATE). Qualifiers should be a dictionary of the form: {key : [value1, value2]} """ tag_ontology_id = self._get_ontology_id('Annotation Tags') for qualifier_key in qualifiers: # Treat db_xref qualifiers differently to sequence annotation # qualifiers by populating the seqfeature_dbxref and dbxref # tables. Other qualifiers go into the seqfeature_qualifier_value # and (if new) term tables. if qualifier_key != 'db_xref': qualifier_key_id = self._get_term_id(qualifier_key, ontology_id=tag_ontology_id) # now add all of the values to their table entries = qualifiers[qualifier_key] if not isinstance(entries, list): # Could be a plain string, or an int or a float. # However, we exect a list of strings here. entries = [entries] for qual_value_rank in range(len(entries)): qualifier_value = entries[qual_value_rank] sql = r"INSERT INTO seqfeature_qualifier_value "\ r" (seqfeature_id, term_id, rank, value) VALUES"\ r" (%s, %s, %s, %s)" self.adaptor.execute(sql, (seqfeature_id, qualifier_key_id, qual_value_rank + 1, qualifier_value)) else: # The dbxref_id qualifier/value sets go into the dbxref table # as dbname, accession, version tuples, with dbxref.dbxref_id # being automatically assigned, and into the seqfeature_dbxref # table as seqfeature_id, dbxref_id, and rank tuples self._load_seqfeature_dbxref(qualifiers[qualifier_key], seqfeature_id) def _load_seqfeature_dbxref(self, dbxrefs, seqfeature_id): """Add database crossreferences of a SeqFeature to the database (PRIVATE). o dbxrefs List, dbxref data from the source file in the format : o seqfeature_id Int, the identifier for the seqfeature in the seqfeature table Insert dbxref qualifier data for a seqfeature into the seqfeature_dbxref and, if required, dbxref tables. The dbxref_id qualifier/value sets go into the dbxref table as dbname, accession, version tuples, with dbxref.dbxref_id being automatically assigned, and into the seqfeature_dbxref table as seqfeature_id, dbxref_id, and rank tuples """ # NOTE - In older versions of Biopython, we would map the GenBank # db_xref "name", for example "GI" to "GeneIndex", and give a warning # for any unknown terms. This was a long term maintainance problem, # and differed from BioPerl and BioJava's implementation. See bug 2405 for rank, value in enumerate(dbxrefs): # Split the DB:accession format string at colons. We have to # account for multiple-line and multiple-accession entries try: dbxref_data = value.replace(' ', '').replace('\n', '').split(':') db = dbxref_data[0] accessions = dbxref_data[1:] except: raise ValueError("Parsing of db_xref failed: '%s'" % value) # Loop over all the grabbed accessions, and attempt to fill the # table for accession in accessions: # Get the dbxref_id value for the dbxref data dbxref_id = self._get_dbxref_id(db, accession) # Insert the seqfeature_dbxref data self._get_seqfeature_dbxref(seqfeature_id, dbxref_id, rank + 1) def _get_dbxref_id(self, db, accession): """ _get_dbxref_id(self, db, accession) -> Int o db String, the name of the external database containing the accession number o accession String, the accession of the dbxref data Finds and returns the dbxref_id for the passed data. The method attempts to find an existing record first, and inserts the data if there is no record. """ # Check for an existing record sql = r'SELECT dbxref_id FROM dbxref WHERE dbname = %s ' \ r'AND accession = %s' dbxref_id = self.adaptor.execute_and_fetch_col0(sql, (db, accession)) # If there was a record, return the dbxref_id, else create the # record and return the created dbxref_id if dbxref_id: return dbxref_id[0] return self._add_dbxref(db, accession, 0) def _get_seqfeature_dbxref(self, seqfeature_id, dbxref_id, rank): """ Check for a pre-existing seqfeature_dbxref entry with the passed seqfeature_id and dbxref_id. If one does not exist, insert new data """ # Check for an existing record sql = r"SELECT seqfeature_id, dbxref_id FROM seqfeature_dbxref " \ r"WHERE seqfeature_id = %s AND dbxref_id = %s" result = self.adaptor.execute_and_fetch_col0(sql, (seqfeature_id, dbxref_id)) # If there was a record, return without executing anything, else create # the record and return if result: return result return self._add_seqfeature_dbxref(seqfeature_id, dbxref_id, rank) def _add_seqfeature_dbxref(self, seqfeature_id, dbxref_id, rank): """ Insert a seqfeature_dbxref row and return the seqfeature_id and dbxref_id """ sql = r'INSERT INTO seqfeature_dbxref ' \ '(seqfeature_id, dbxref_id, rank) VALUES' \ r'(%s, %s, %s)' self.adaptor.execute(sql, (seqfeature_id, dbxref_id, rank)) return (seqfeature_id, dbxref_id) def _load_dbxrefs(self, record, bioentry_id): """Load any sequence level cross references into the database (PRIVATE). See table bioentry_dbxref.""" for rank, value in enumerate(record.dbxrefs): # Split the DB:accession string at first colon. # We have to cope with things like: # "MGD:MGI:892" (db="MGD", accession="MGI:892") # "GO:GO:123" (db="GO", accession="GO:123") # # Annoyingly I have seen the NCBI use both the style # "GO:GO:123" and "GO:123" in different vintages. assert value.count("\n") == 0 try: db, accession = value.split(':', 1) db = db.strip() accession = accession.strip() except: raise ValueError("Parsing of dbxrefs list failed: '%s'" % value) # Get the dbxref_id value for the dbxref data dbxref_id = self._get_dbxref_id(db, accession) # Insert the bioentry_dbxref data self._get_bioentry_dbxref(bioentry_id, dbxref_id, rank + 1) def _get_bioentry_dbxref(self, bioentry_id, dbxref_id, rank): """ Check for a pre-existing bioentry_dbxref entry with the passed seqfeature_id and dbxref_id. If one does not exist, insert new data """ # Check for an existing record sql = r"SELECT bioentry_id, dbxref_id FROM bioentry_dbxref " \ r"WHERE bioentry_id = %s AND dbxref_id = %s" result = self.adaptor.execute_and_fetch_col0(sql, (bioentry_id, dbxref_id)) # If there was a record, return without executing anything, else create # the record and return if result: return result return self._add_bioentry_dbxref(bioentry_id, dbxref_id, rank) def _add_bioentry_dbxref(self, bioentry_id, dbxref_id, rank): """ Insert a bioentry_dbxref row and return the seqfeature_id and dbxref_id """ sql = r'INSERT INTO bioentry_dbxref ' \ '(bioentry_id,dbxref_id,rank) VALUES ' \ '(%s, %s, %s)' self.adaptor.execute(sql, (bioentry_id, dbxref_id, rank)) return (bioentry_id, dbxref_id) class DatabaseRemover: """Complement the Loader functionality by fully removing a database. This probably isn't really useful for normal purposes, since you can just do a: DROP DATABASE db_name and then recreate the database. But, it's really useful for testing purposes. YB: now use the cascaded deletions """ def __init__(self, adaptor, dbid): """Initialize with a database id and adaptor connection. """ self.adaptor = adaptor self.dbid = dbid def remove(self): """Remove everything related to the given database id. """ sql = r"DELETE FROM bioentry WHERE biodatabase_id = %s" self.adaptor.execute(sql, (self.dbid,)) sql = r"DELETE FROM biodatabase WHERE biodatabase_id = %s" self.adaptor.execute(sql, (self.dbid,)) biopython-1.63/BioSQL/__init__.py0000644000175000017500000000105312250104543016251 0ustar tratra00000000000000# Copyright 2002 by Andrew Dalke. All rights reserved. # Revisions 2007-2008 by Peter Cock. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Note that BioSQL (including the database schema and scripts) is # available and licensed separately. Please consult www.biosql.org """Code for storing and retrieving biological sequences from a BioSQL relational database. See: http://biopython.org/wiki/BioSQL http://www.biosql.org/ """ biopython-1.63/BioSQL/BioSeq.py0000644000175000017500000005415412250104543015706 0ustar tratra00000000000000# Copyright 2002 by Andrew Dalke. All rights reserved. # Revisions 2007-2009 copyright by Peter Cock. All rights reserved. # Revisions 2008-2009 copyright by Cymon J. Cox. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Note that BioSQL (including the database schema and scripts) is # available and licensed separately. Please consult www.biosql.org """Implementations of Biopython-like Seq objects on top of BioSQL. This allows retrival of items stored in a BioSQL database using a biopython-like SeqRecord and Seq interface. Note: Currently we do not support recording per-letter-annotations (like quality scores) in BioSQL. """ from Bio._py3k import unicode from Bio import Alphabet from Bio.Seq import Seq, UnknownSeq from Bio.SeqRecord import SeqRecord, _RestrictedDict from Bio import SeqFeature class DBSeq(Seq): # This implements the biopython Seq interface def __init__(self, primary_id, adaptor, alphabet, start, length): """Create a new DBSeq object referring to a BioSQL entry. You wouldn't normally create a DBSeq object yourself, this is done for you when retreiving a DBSeqRecord object from the database. """ self.primary_id = primary_id self.adaptor = adaptor self.alphabet = alphabet self._length = length self.start = start def __len__(self): return self._length def __getitem__(self, index): # Seq API requirement #Note since Python 2.0, __getslice__ is deprecated #and __getitem__ is used instead. #See http://docs.python.org/ref/sequence-methods.html if isinstance(index, int): #Return a single letter as a string i = index if i < 0: if -i > self._length: raise IndexError(i) i = i + self._length elif i >= self._length: raise IndexError(i) return self.adaptor.get_subseq_as_string(self.primary_id, self.start + i, self.start + i + 1) if not isinstance(index, slice): raise ValueError("Unexpected index type") #Return the (sub)sequence as another DBSeq or Seq object #(see the Seq obect's __getitem__ method) if index.start is None: i = 0 else: i = index.start if i < 0: #Map to equavilent positive index if -i > self._length: raise IndexError(i) i = i + self._length elif i >= self._length: #Trivial case, should return empty string! i = self._length if index.stop is None: j = self._length else: j = index.stop if j < 0: #Map to equavilent positive index if -j > self._length: raise IndexError(j) j = j + self._length elif j >= self._length: j = self._length if i >= j: #Trivial case, empty string. return Seq("", self.alphabet) elif index.step is None or index.step == 1: #Easy case - can return a DBSeq with the start and end adjusted return self.__class__(self.primary_id, self.adaptor, self.alphabet, self.start + i, j - i) else: #Tricky. Will have to create a Seq object because of the stride full = self.adaptor.get_subseq_as_string(self.primary_id, self.start + i, self.start + j) return Seq(full[::index.step], self.alphabet) def tostring(self): """Returns the full sequence as a python string. Although not formally deprecated, you are now encouraged to use str(my_seq) instead of my_seq.tostring().""" return self.adaptor.get_subseq_as_string(self.primary_id, self.start, self.start + self._length) def __str__(self): """Returns the full sequence as a python string.""" return self.adaptor.get_subseq_as_string(self.primary_id, self.start, self.start + self._length) data = property(tostring, doc="Sequence as string (DEPRECATED)") def toseq(self): """Returns the full sequence as a Seq object.""" #Note - the method name copies that of the MutableSeq object return Seq(str(self), self.alphabet) def __add__(self, other): #Let the Seq object deal with the alphabet issues etc return self.toseq() + other def __radd__(self, other): #Let the Seq object deal with the alphabet issues etc return other + self.toseq() def _retrieve_seq(adaptor, primary_id): #The database schema ensures there will be only one matching #row in the table. #If an UnknownSeq was recorded, seq will be NULL, #but length will be populated. This means length(seq) #will return None. seqs = adaptor.execute_and_fetchall( "SELECT alphabet, length, length(seq) FROM biosequence" " WHERE bioentry_id = %s", (primary_id,)) if not seqs: return assert len(seqs) == 1 moltype, given_length, length = seqs[0] try: length = int(length) given_length = int(length) assert length == given_length have_seq = True except TypeError: assert length is None seqs = adaptor.execute_and_fetchall( "SELECT alphabet, length, seq FROM biosequence" " WHERE bioentry_id = %s", (primary_id,)) assert len(seqs) == 1 moltype, given_length, seq = seqs[0] assert seq is None or seq == "" length = int(given_length) have_seq = False del seq del given_length moltype = moltype.lower() # might be upper case in database #We have no way of knowing if these sequences will use IUPAC #alphabets, and we certainly can't assume they are unambiguous! if moltype == "dna": alphabet = Alphabet.generic_dna elif moltype == "rna": alphabet = Alphabet.generic_rna elif moltype == "protein": alphabet = Alphabet.generic_protein elif moltype == "unknown": #This is used in BioSQL/Loader.py and would happen #for any generic or nucleotide alphabets. alphabet = Alphabet.single_letter_alphabet else: raise AssertionError("Unknown moltype: %s" % moltype) if have_seq: return DBSeq(primary_id, adaptor, alphabet, 0, int(length)) else: return UnknownSeq(length, alphabet) def _retrieve_dbxrefs(adaptor, primary_id): """Retrieve the database cross references for the sequence.""" _dbxrefs = [] dbxrefs = adaptor.execute_and_fetchall( "SELECT dbname, accession, version" " FROM bioentry_dbxref join dbxref using (dbxref_id)" " WHERE bioentry_id = %s" " ORDER BY rank", (primary_id,)) for dbname, accession, version in dbxrefs: if version and version != "0": v = "%s.%s" % (accession, version) else: v = accession _dbxrefs.append("%s:%s" % (dbname, v)) return _dbxrefs def _retrieve_features(adaptor, primary_id): sql = "SELECT seqfeature_id, type.name, rank" \ " FROM seqfeature join term type on (type_term_id = type.term_id)" \ " WHERE bioentry_id = %s" \ " ORDER BY rank" results = adaptor.execute_and_fetchall(sql, (primary_id,)) seq_feature_list = [] for seqfeature_id, seqfeature_type, seqfeature_rank in results: # Get qualifiers [except for db_xref which is stored separately] qvs = adaptor.execute_and_fetchall( "SELECT name, value" " FROM seqfeature_qualifier_value join term using (term_id)" " WHERE seqfeature_id = %s" " ORDER BY rank", (seqfeature_id,)) qualifiers = {} for qv_name, qv_value in qvs: qualifiers.setdefault(qv_name, []).append(qv_value) # Get db_xrefs [special case of qualifiers] qvs = adaptor.execute_and_fetchall( "SELECT dbxref.dbname, dbxref.accession" " FROM dbxref join seqfeature_dbxref using (dbxref_id)" " WHERE seqfeature_dbxref.seqfeature_id = %s" " ORDER BY rank", (seqfeature_id,)) for qv_name, qv_value in qvs: value = "%s:%s" % (qv_name, qv_value) qualifiers.setdefault("db_xref", []).append(value) # Get locations results = adaptor.execute_and_fetchall( "SELECT location_id, start_pos, end_pos, strand" " FROM location" " WHERE seqfeature_id = %s" " ORDER BY rank", (seqfeature_id,)) locations = [] # convert to Python standard form # Convert strand = 0 to strand = None # re: comment in Loader.py: # Biopython uses None when we don't know strand information but # BioSQL requires something (non null) and sets this as zero # So we'll use the strand or 0 if Biopython spits out None for location_id, start, end, strand in results: if start: start -= 1 if strand == 0: strand = None if strand not in (+1, -1, None): raise ValueError("Invalid strand %s found in database for " "seqfeature_id %s" % (strand, seqfeature_id)) if end < start: import warnings from Bio import BiopythonWarning warnings.warn("Inverted location start/end (%i and %i) for " "seqfeature_id %s" % (start, end, seqfeature_id), BiopythonWarning) locations.append((location_id, start, end, strand)) # Get possible remote reference information remote_results = adaptor.execute_and_fetchall( "SELECT location_id, dbname, accession, version" " FROM location join dbxref using (dbxref_id)" " WHERE seqfeature_id = %s", (seqfeature_id,)) lookup = {} for location_id, dbname, accession, version in remote_results: if version and version != "0": v = "%s.%s" % (accession, version) else: v = accession # subfeature remote location db_ref are stored as a empty string when # not present if dbname == "": dbname = None lookup[location_id] = (dbname, v) feature = SeqFeature.SeqFeature(type=seqfeature_type) feature._seqfeature_id = seqfeature_id # Store the key as a private property feature.qualifiers = qualifiers if len(locations) == 0: pass elif len(locations) == 1: location_id, start, end, strand = locations[0] #See Bug 2677, we currently don't record the location_operator #For consistency with older versions Biopython, default to "". feature.location_operator = \ _retrieve_location_qualifier_value(adaptor, location_id) dbname, version = lookup.get(location_id, (None, None)) feature.location = SeqFeature.FeatureLocation(start, end) feature.strand = strand feature.ref_db = dbname feature.ref = version else: sub_features = feature.sub_features assert sub_features == [] for location in locations: location_id, start, end, strand = location dbname, version = lookup.get(location_id, (None, None)) subfeature = SeqFeature.SeqFeature() subfeature.type = seqfeature_type subfeature.location = SeqFeature.FeatureLocation(start, end) #subfeature.location_operator = \ # _retrieve_location_qualifier_value(adaptor, location_id) subfeature.strand = strand subfeature.ref_db = dbname subfeature.ref = version sub_features.append(subfeature) # Locations are in order, but because of remote locations for # sub-features they are not necessarily in numerical order: strands = set(sf.strand for sf in sub_features) if len(strands)==1 and -1 in strands: #Evil hack time for backwards compatibility #TODO - Check if BioPerl and (old) Biopython did the same, #we may have an existing incompatibility lurking here... locs = [f.location for f in sub_features[::-1]] else: #All forward, or mixed strands locs = [f.location for f in sub_features] feature.location = SeqFeature.CompoundLocation(locs, seqfeature_type) #TODO - See Bug 2677 - we don't yet record location_operator, #so for consistency with older versions of Biopython default #to assuming its a join. feature.location_operator = "join" seq_feature_list.append(feature) return seq_feature_list def _retrieve_location_qualifier_value(adaptor, location_id): value = adaptor.execute_and_fetch_col0( "SELECT value FROM location_qualifier_value" " WHERE location_id = %s", (location_id,)) try: return value[0] except IndexError: return "" def _retrieve_annotations(adaptor, primary_id, taxon_id): annotations = {} annotations.update(_retrieve_qualifier_value(adaptor, primary_id)) annotations.update(_retrieve_reference(adaptor, primary_id)) annotations.update(_retrieve_taxon(adaptor, primary_id, taxon_id)) annotations.update(_retrieve_comment(adaptor, primary_id)) # Convert values into strings in cases of unicode from the database. # BioSQL could eventually be expanded to be unicode aware. str_anns = {} for key, val in annotations.items(): if isinstance(val, list): val = [_make_unicode_into_string(x) for x in val] elif isinstance(val, unicode): val = str(val) str_anns[key] = val return str_anns def _make_unicode_into_string(text): if isinstance(text, unicode): return str(text) else: return text def _retrieve_qualifier_value(adaptor, primary_id): qvs = adaptor.execute_and_fetchall( "SELECT name, value" " FROM bioentry_qualifier_value JOIN term USING (term_id)" " WHERE bioentry_id = %s" " ORDER BY rank", (primary_id,)) qualifiers = {} for name, value in qvs: if name == "keyword": name = "keywords" #See handling of "date" in Loader.py elif name == "date_changed": name = "date" elif name == "secondary_accession": name = "accessions" qualifiers.setdefault(name, []).append(value) return qualifiers def _retrieve_reference(adaptor, primary_id): # XXX dbxref_qualifier_value refs = adaptor.execute_and_fetchall( "SELECT start_pos, end_pos, " " location, title, authors," " dbname, accession" " FROM bioentry_reference" " JOIN reference USING (reference_id)" " LEFT JOIN dbxref USING (dbxref_id)" " WHERE bioentry_id = %s" " ORDER BY rank", (primary_id,)) references = [] for start, end, location, title, authors, dbname, accession in refs: reference = SeqFeature.Reference() #If the start/end are missing, reference.location is an empty list if (start is not None) or (end is not None): if start is not None: start -= 1 # python counting reference.location = [SeqFeature.FeatureLocation(start, end)] #Don't replace the default "" with None. if authors: reference.authors = authors if title: reference.title = title reference.journal = location if dbname == 'PUBMED': reference.pubmed_id = accession elif dbname == 'MEDLINE': reference.medline_id = accession references.append(reference) if references: return {'references': references} else: return {} def _retrieve_taxon(adaptor, primary_id, taxon_id): a = {} common_names = adaptor.execute_and_fetch_col0( "SELECT name FROM taxon_name WHERE taxon_id = %s" " AND name_class = 'genbank common name'", (taxon_id,)) if common_names: a['source'] = common_names[0] scientific_names = adaptor.execute_and_fetch_col0( "SELECT name FROM taxon_name WHERE taxon_id = %s" " AND name_class = 'scientific name'", (taxon_id,)) if scientific_names: a['organism'] = scientific_names[0] ncbi_taxids = adaptor.execute_and_fetch_col0( "SELECT ncbi_taxon_id FROM taxon WHERE taxon_id = %s", (taxon_id,)) if ncbi_taxids and ncbi_taxids[0] and ncbi_taxids[0] != "0": a['ncbi_taxid'] = ncbi_taxids[0] #Old code used the left/right values in the taxon table to get the #taxonomy lineage in one SQL command. This was actually very slow, #and would fail if the (optional) left/right values were missing. # #The following code is based on a contribution from Eric Gibert, and #relies on the taxon table's parent_taxon_id field only (ignoring the #optional left/right values). This means that it has to make a #separate SQL query for each entry in the lineage, but it does still #appear to be *much* faster. See Bug 2494. taxonomy = [] while taxon_id: name, rank, parent_taxon_id = adaptor.execute_one( "SELECT taxon_name.name, taxon.node_rank, taxon.parent_taxon_id" " FROM taxon, taxon_name" " WHERE taxon.taxon_id=taxon_name.taxon_id" " AND taxon_name.name_class='scientific name'" " AND taxon.taxon_id = %s", (taxon_id,)) if taxon_id == parent_taxon_id: # If the taxon table has been populated by the BioSQL script # load_ncbi_taxonomy.pl this is how top parent nodes are stored. # Personally, I would have used a NULL parent_taxon_id here. break if rank != "no rank": #For consistency with older versions of Biopython, we are only #interested in taxonomy entries with a stated rank. #Add this to the start of the lineage list. taxonomy.insert(0, name) taxon_id = parent_taxon_id if taxonomy: a['taxonomy'] = taxonomy return a def _retrieve_comment(adaptor, primary_id): qvs = adaptor.execute_and_fetchall( "SELECT comment_text FROM comment" " WHERE bioentry_id=%s" " ORDER BY rank", (primary_id,)) comments = [comm[0] for comm in qvs] #Don't want to add an empty list... if comments: return {"comment": comments} else: return {} class DBSeqRecord(SeqRecord): """BioSQL equivalent of the biopython SeqRecord object. """ def __init__(self, adaptor, primary_id): self._adaptor = adaptor self._primary_id = primary_id (self._biodatabase_id, self._taxon_id, self.name, accession, version, self._identifier, self._division, self.description) = self._adaptor.execute_one( "SELECT biodatabase_id, taxon_id, name, accession, version," " identifier, division, description" " FROM bioentry" " WHERE bioentry_id = %s", (self._primary_id,)) if version and version != "0": self.id = "%s.%s" % (accession, version) else: self.id = accession #We don't yet record any per-letter-annotations in the #BioSQL database, but we should set this property up #for completeness (and the __str__ method). try: length = len(self.seq) except: #Could be no sequence in the database! length = 0 self._per_letter_annotations = _RestrictedDict(length=length) def __get_seq(self): if not hasattr(self, "_seq"): self._seq = _retrieve_seq(self._adaptor, self._primary_id) return self._seq def __set_seq(self, seq): self._seq = seq def __del_seq(self): del self._seq seq = property(__get_seq, __set_seq, __del_seq, "Seq object") def __get_dbxrefs(self): if not hasattr(self, "_dbxrefs"): self._dbxrefs = _retrieve_dbxrefs(self._adaptor, self._primary_id) return self._dbxrefs def __set_dbxrefs(self, dbxrefs): self._dbxrefs = dbxrefs def __del_dbxrefs(self): del self._dbxrefs dbxrefs = property(__get_dbxrefs, __set_dbxrefs, __del_dbxrefs, "Database cross references") def __get_features(self): if not hasattr(self, "_features"): self._features = _retrieve_features(self._adaptor, self._primary_id) return self._features def __set_features(self, features): self._features = features def __del_features(self): del self._features features = property(__get_features, __set_features, __del_features, "Features") def __get_annotations(self): if not hasattr(self, "_annotations"): self._annotations = _retrieve_annotations(self._adaptor, self._primary_id, self._taxon_id) if self._identifier: self._annotations["gi"] = self._identifier if self._division: self._annotations["data_file_division"] = self._division return self._annotations def __set_annotations(self, annotations): self._annotations = annotations def __del_annotations(self): del self._annotations annotations = property(__get_annotations, __set_annotations, __del_annotations, "Annotations") biopython-1.63/BioSQL/BioSeqDatabase.py0000644000175000017500000006603612250104543017335 0ustar tratra00000000000000# Copyright 2002 by Andrew Dalke. All rights reserved. # Revisions 2007-2009 copyright by Peter Cock. All rights reserved. # Revisions 2009 copyright by Cymon J. Cox. All rights reserved. # Revisions 2013 copyright by Tiago Antao. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Note that BioSQL (including the database schema and scripts) is # available and licensed separately. Please consult www.biosql.org """Connect with a BioSQL database and load Biopython like objects from it. This provides interfaces for loading biological objects from a relational database, and is compatible with the BioSQL standards. """ import os from Bio import BiopythonDeprecationWarning from . import BioSeq from . import Loader from . import DBUtils _POSTGRES_RULES_PRESENT = False # Hack for BioSQL Bug 2839 def open_database(driver="MySQLdb", **kwargs): """Main interface for loading a existing BioSQL-style database. This function is the easiest way to retrieve a connection to a database, doing something like: >>> from BioSeq import BioSeqDatabase >>> server = BioSeqDatabase.open_database(user="root", db="minidb") the various options are: driver -> The name of the database driver to use for connecting. The driver should implement the python DB API. By default, the MySQLdb driver is used. user -> the username to connect to the database with. password, passwd -> the password to connect with host -> the hostname of the database database or db -> the name of the database """ if driver == "psycopg": raise ValueError("Using BioSQL with psycopg (version one) is no " "longer supported. Use psycopg2 instead.") if os.name == "java": from com.ziclix.python.sql import zxJDBC module = zxJDBC if driver in ["MySQLdb"]: jdbc_driver = "com.mysql.jdbc.Driver" url_pref = "jdbc:mysql://" + kwargs["host"] + "/" elif driver in ["psycopg2"]: jdbc_driver = "org.postgresql.Driver" url_pref = "jdbc:postgresql://" + kwargs["host"] + "/" else: module = __import__(driver) connect = getattr(module, "connect") # Different drivers use different keywords... kw = kwargs.copy() if driver == "MySQLdb" and os.name != "java": if "database" in kw: kw["db"] = kw["database"] del kw["database"] if "password" in kw: kw["passwd"] = kw["password"] del kw["password"] else: # DB-API recommendations if "db" in kw: kw["database"] = kw["db"] del kw["db"] if "passwd" in kw: kw["password"] = kw["passwd"] del kw["passwd"] if driver in ["psycopg2", "pgdb"] and not kw.get("database"): kw["database"] = "template1" # SQLite connect takes the database name as input if os.name == "java": if driver in ["MySQLdb"]: conn = connect(url_pref + kw.get("database", "mysql"), kw["user"], kw["password"], jdbc_driver) elif driver in ["psycopg2"]: conn = connect(url_pref + kw.get("database", "postgresql") + "?stringtype=unspecified", kw["user"], kw["password"], jdbc_driver) elif driver in ["sqlite3"]: conn = connect(kw["database"]) else: try: conn = connect(**kw) except module.InterfaceError: # Ok, so let's try building a DSN # (older releases of psycopg need this) if "database" in kw: kw["dbname"] = kw["database"] del kw["database"] elif "db" in kw: kw["dbname"] = kw["db"] del kw["db"] dsn = ' '.join('='.join(i) for i in kw.items()) conn = connect(dsn) if os.name == "java": server = DBServer(conn, module, driver) else: server = DBServer(conn, module) # TODO - Remove the following once BioSQL Bug 2839 is fixed. # Test for RULES in PostgreSQL schema, see also Bug 2833. if driver in ["psycopg2", "pgdb"]: sql = "SELECT ev_class FROM pg_rewrite WHERE " + \ "rulename='rule_bioentry_i1' OR " + \ "rulename='rule_bioentry_i2';" if server.adaptor.execute_and_fetchall(sql): import warnings from Bio import BiopythonWarning warnings.warn("Your BioSQL PostgreSQL schema includes some " "rules currently required for bioperl-db but " "which may cause problems loading data using " "Biopython (see BioSQL Bug 2839). If you do not " "use BioPerl, please remove these rules. " "Biopython should cope with the rules present, " "but with a performance penalty when loading " "new records.", BiopythonWarning) global _POSTGRES_RULES_PRESENT _POSTGRES_RULES_PRESENT = True return server class DBServer: """Represents a BioSQL database continaing namespaces (sub-databases). This acts like a Python dictionary, giving access to each namespace (defined by a row in the biodatabase table) as a BioSeqDatabase object. """ def __init__(self, conn, module, module_name=None): self.module = module if module_name is None: module_name = module.__name__ self.adaptor = Adaptor(conn, DBUtils.get_dbutils(module_name)) self.module_name = module_name def __repr__(self): return self.__class__.__name__ + "(%r)" % self.adaptor.conn def __getitem__(self, name): return BioSeqDatabase(self.adaptor, name) def __len__(self): """Number of namespaces (sub-databases) in this database.""" sql = "SELECT COUNT(name) FROM biodatabase;" return int(self.adaptor.execute_and_fetch_col0(sql)[0]) def __contains__(self, value): """Check if a namespace (sub-database) in this database.""" sql = "SELECT COUNT(name) FROM biodatabase WHERE name=%s;" return bool(self.adaptor.execute_and_fetch_col0(sql, (value,))[0]) def __iter__(self): """Iterate over namespaces (sub-databases) in the database.""" #TODO - Iterate over the cursor, much more efficient return iter(self.adaptor.list_biodatabase_names()) if hasattr(dict, "iteritems"): #Python 2, use iteritems etc def keys(self): """List of namespaces (sub-databases) in the database.""" return self.adaptor.list_biodatabase_names() def values(self): """List of BioSeqDatabase objects in the database.""" return [self[key] for key in self] def items(self): """List of (namespace, BioSeqDatabase) for entries in the database.""" return [(key, self[key]) for key in self] def iterkeys(self): """Iterate over namespaces (sub-databases) in the database.""" return iter(self) def itervalues(self): """Iterate over BioSeqDatabase objects in the database.""" for key in self: yield self[key] def iteritems(self): """Iterate over (namespace, BioSeqDatabase) in the database.""" for key in self: yield key, self[key] else: #Python 3, items etc are all iterators def keys(self): """Iterate over namespaces (sub-databases) in the database.""" return iter(self) def values(self): """Iterate over BioSeqDatabase objects in the database.""" for key in self: yield self[key] def items(self): """Iterate over (namespace, BioSeqDatabase) in the database.""" for key in self: yield key, self[key] def __delitem__(self, name): """Remove a namespace and all its entries.""" if name not in self: raise KeyError(name) self.remove_database(name) def remove_database(self, db_name): """Remove a namespace and all its entries (OBSOLETE). Try to remove all references to items in a database. server.remove_database(name) In keeping with the dictionary interface, you can now do this: del server[name] """ import warnings warnings.warn("This method is deprecated. In keeping with the " "dictionary interface, you can now use 'del " "server[name]' instead", BiopythonDeprecationWarning) db_id = self.adaptor.fetch_dbid_by_dbname(db_name) remover = Loader.DatabaseRemover(self.adaptor, db_id) remover.remove() def new_database(self, db_name, authority=None, description=None): """Add a new database to the server and return it. """ # make the database sql = r"INSERT INTO biodatabase (name, authority, description)" \ r" VALUES (%s, %s, %s)" self.adaptor.execute(sql, (db_name, authority, description)) return BioSeqDatabase(self.adaptor, db_name) def load_database_sql(self, sql_file): """Load a database schema into the given database. This is used to create tables, etc when a database is first created. sql_file should specify the complete path to a file containing SQL entries for building the tables. """ # Not sophisticated enough for PG schema. Is it needed by MySQL? # Looks like we need this more complicated way for both. Leaving it # the default and removing the simple-minded approach. # read the file with all comment lines removed sql_handle = open(sql_file, "rU") sql = r"" for line in sql_handle: if line.startswith("--"): # don't include comment lines pass elif line.startswith("#"): # ditto for MySQL comments pass elif line.strip(): # only include non-blank lines sql += line.strip() sql += ' ' # two ways to load the SQL # 1. PostgreSQL can load it all at once and actually needs to # due to FUNCTION defines at the end of the SQL which mess up # the splitting by semicolons if self.module_name in ["psycopg2", "pgdb"]: self.adaptor.cursor.execute(sql) # 2. MySQL needs the database loading split up into single lines of # SQL executed one at a time elif self.module_name in ["MySQLdb", "sqlite3"]: sql_parts = sql.split(";") # one line per sql command for sql_line in sql_parts[:-1]: # don't use the last item, it's blank self.adaptor.cursor.execute(sql_line) else: raise ValueError("Module %s not supported by the loader." % (self.module_name)) def commit(self): """Commits the current transaction to the database.""" return self.adaptor.commit() def rollback(self): """Rolls backs the current transaction.""" return self.adaptor.rollback() def close(self): """Close the connection. No further activity possible.""" return self.adaptor.close() class Adaptor: def __init__(self, conn, dbutils): self.conn = conn self.cursor = conn.cursor() self.dbutils = dbutils def last_id(self, table): return self.dbutils.last_id(self.cursor, table) def autocommit(self, y=True): """Set the autocommit mode. True values enable; False value disable.""" return self.dbutils.autocommit(self.conn, y) def commit(self): """Commits the current transaction.""" return self.conn.commit() def rollback(self): """Rolls backs the current transaction.""" return self.conn.rollback() def close(self): """Close the connection. No further activity possible.""" return self.conn.close() def fetch_dbid_by_dbname(self, dbname): self.execute( r"select biodatabase_id from biodatabase where name = %s", (dbname,)) rv = self.cursor.fetchall() if not rv: raise KeyError("Cannot find biodatabase with name %r" % dbname) # Cannot happen (UK) ## assert len(rv) == 1, "More than one biodatabase with name %r" % dbname return rv[0][0] def fetch_seqid_by_display_id(self, dbid, name): sql = r"select bioentry_id from bioentry where name = %s" fields = [name] if dbid: sql += " and biodatabase_id = %s" fields.append(dbid) self.execute(sql, fields) rv = self.cursor.fetchall() if not rv: raise IndexError("Cannot find display id %r" % name) if len(rv) > 1: raise IndexError("More than one entry with display id %r" % name) return rv[0][0] def fetch_seqid_by_accession(self, dbid, name): sql = r"select bioentry_id from bioentry where accession = %s" fields = [name] if dbid: sql += " and biodatabase_id = %s" fields.append(dbid) self.execute(sql, fields) rv = self.cursor.fetchall() if not rv: raise IndexError("Cannot find accession %r" % name) if len(rv) > 1: raise IndexError("More than one entry with accession %r" % name) return rv[0][0] def fetch_seqids_by_accession(self, dbid, name): sql = r"select bioentry_id from bioentry where accession = %s" fields = [name] if dbid: sql += " and biodatabase_id = %s" fields.append(dbid) return self.execute_and_fetch_col0(sql, fields) def fetch_seqid_by_version(self, dbid, name): acc_version = name.split(".") if len(acc_version) > 2: raise IndexError("Bad version %r" % name) acc = acc_version[0] if len(acc_version) == 2: version = acc_version[1] else: version = "0" sql = r"SELECT bioentry_id FROM bioentry WHERE accession = %s" \ r" AND version = %s" fields = [acc, version] if dbid: sql += " and biodatabase_id = %s" fields.append(dbid) self.execute(sql, fields) rv = self.cursor.fetchall() if not rv: raise IndexError("Cannot find version %r" % name) if len(rv) > 1: raise IndexError("More than one entry with version %r" % name) return rv[0][0] def fetch_seqid_by_identifier(self, dbid, identifier): # YB: was fetch_seqid_by_seqid sql = "SELECT bioentry_id FROM bioentry WHERE identifier = %s" fields = [identifier] if dbid: sql += " and biodatabase_id = %s" fields.append(dbid) self.execute(sql, fields) rv = self.cursor.fetchall() if not rv: raise IndexError("Cannot find display id %r" % identifier) return rv[0][0] def list_biodatabase_names(self): return self.execute_and_fetch_col0( "SELECT name FROM biodatabase") def list_bioentry_ids(self, dbid): return self.execute_and_fetch_col0( "SELECT bioentry_id FROM bioentry WHERE biodatabase_id = %s", (dbid,)) def list_bioentry_display_ids(self, dbid): return self.execute_and_fetch_col0( "SELECT name FROM bioentry WHERE biodatabase_id = %s", (dbid,)) def list_any_ids(self, sql, args): """Return ids given a SQL statement to select for them. This assumes that the given SQL does a SELECT statement that returns a list of items. This parses them out of the 2D list they come as and just returns them in a list. """ return self.execute_and_fetch_col0(sql, args) def execute_one(self, sql, args=None): self.execute(sql, args or ()) rv = self.cursor.fetchall() assert len(rv) == 1, "Expected 1 response, got %d" % len(rv) return rv[0] def execute(self, sql, args=None): """Just execute an sql command. """ if os.name == "java": sql = sql.replace("%s", "?") self.dbutils.execute(self.cursor, sql, args) def get_subseq_as_string(self, seqid, start, end): length = end - start # XXX Check this on MySQL and PostgreSQL. substr should be general, # does it need dbutils? #return self.execute_one( # """select SUBSTRING(seq FROM %s FOR %s) # from biosequence where bioentry_id = %s""", # (start+1, length, seqid))[0] # # Convert to a string on returning for databases that give back # unicode. Shouldn't need unicode for sequences so this seems safe. return str(self.execute_one( """select SUBSTR(seq, %s, %s) from biosequence where bioentry_id = %s""", (start + 1, length, seqid))[0]) def execute_and_fetch_col0(self, sql, args=None): self.execute(sql, args or ()) return [field[0] for field in self.cursor.fetchall()] def execute_and_fetchall(self, sql, args=None): self.execute(sql, args or ()) return self.cursor.fetchall() _allowed_lookups = { # Lookup name / function name to get id, function to list all ids 'primary_id': "fetch_seqid_by_identifier", 'gi': "fetch_seqid_by_identifier", 'display_id': "fetch_seqid_by_display_id", 'name': "fetch_seqid_by_display_id", 'accession': "fetch_seqid_by_accession", 'version': "fetch_seqid_by_version", } class BioSeqDatabase: """Represents a namespace (sub-database) within the BioSQL database. i.e. One row in the biodatabase table, and all all rows in the bioentry table associated with it. """ def __init__(self, adaptor, name): self.adaptor = adaptor self.name = name self.dbid = self.adaptor.fetch_dbid_by_dbname(name) def __repr__(self): return "BioSeqDatabase(%r, %r)" % (self.adaptor, self.name) def get_Seq_by_id(self, name): """Gets a DBSeqRecord object by its name Example: seq_rec = db.get_Seq_by_id('ROA1_HUMAN') The name of this method is misleading since it returns a DBSeqRecord rather than a DBSeq ojbect, and presumably was to mirror BioPerl. """ seqid = self.adaptor.fetch_seqid_by_display_id(self.dbid, name) return BioSeq.DBSeqRecord(self.adaptor, seqid) def get_Seq_by_acc(self, name): """Gets a DBSeqRecord object by accession number Example: seq_rec = db.get_Seq_by_acc('X77802') The name of this method is misleading since it returns a DBSeqRecord rather than a DBSeq ojbect, and presumably was to mirror BioPerl. """ seqid = self.adaptor.fetch_seqid_by_accession(self.dbid, name) return BioSeq.DBSeqRecord(self.adaptor, seqid) def get_Seq_by_ver(self, name): """Gets a DBSeqRecord object by version number Example: seq_rec = db.get_Seq_by_ver('X77802.1') The name of this method is misleading since it returns a DBSeqRecord rather than a DBSeq ojbect, and presumably was to mirror BioPerl. """ seqid = self.adaptor.fetch_seqid_by_version(self.dbid, name) return BioSeq.DBSeqRecord(self.adaptor, seqid) def get_Seqs_by_acc(self, name): """Gets a list of DBSeqRecord objects by accession number Example: seq_recs = db.get_Seq_by_acc('X77802') The name of this method is misleading since it returns a list of DBSeqRecord objects rather than a list of DBSeq ojbects, and presumably was to mirror BioPerl. """ seqids = self.adaptor.fetch_seqids_by_accession(self.dbid, name) return [BioSeq.DBSeqRecord(self.adaptor, seqid) for seqid in seqids] def get_all_primary_ids(self): """All the primary_ids of the sequences in the database (OBSOLETE). These maybe ids (display style) or accession numbers or something else completely different - they *are not* meaningful outside of this database implementation. Please use .keys() instead of .get_all_primary_ids() """ import warnings warnings.warn("Use bio_seq_database.keys() instead of " "bio_seq_database.get_all_primary_ids()", BiopythonDeprecationWarning) return list(self.keys()) def __getitem__(self, key): return BioSeq.DBSeqRecord(self.adaptor, key) def __delitem__(self, key): """Remove an entry and all its annotation.""" if key not in self: raise KeyError(key) #Assuming this will automatically cascade to the other tables... sql = "DELETE FROM bioentry " + \ "WHERE biodatabase_id=%s AND bioentry_id=%s;" self.adaptor.execute(sql, (self.dbid, key)) def __len__(self): """Number of records in this namespace (sub database).""" sql = "SELECT COUNT(bioentry_id) FROM bioentry " + \ "WHERE biodatabase_id=%s;" return int(self.adaptor.execute_and_fetch_col0(sql, (self.dbid, ))[0]) def __contains__(self, value): """Check if a primary (internal) id is this namespace (sub database).""" sql = "SELECT COUNT(bioentry_id) FROM bioentry " + \ "WHERE biodatabase_id=%s AND bioentry_id=%s;" #The bioentry_id field is an integer in the schema. #PostgreSQL will throw an error if we use a non integer in the query. try: bioentry_id = int(value) except ValueError: return False return bool(self.adaptor.execute_and_fetch_col0(sql, (self.dbid, bioentry_id))[0]) def __iter__(self): """Iterate over ids (which may not be meaningful outside this database).""" #TODO - Iterate over the cursor, much more efficient return iter(self.adaptor.list_bioentry_ids(self.dbid)) if hasattr(dict, "iteritems"): #Python 2, use iteritems etc def keys(self): """List of ids which may not be meaningful outside this database.""" return self.adaptor.list_bioentry_ids(self.dbid) def values(self): """List of DBSeqRecord objects in the namespace (sub database).""" return [self[key] for key in self] def items(self): """List of (id, DBSeqRecord) for the namespace (sub database).""" return [(key, self[key]) for key in self] def iterkeys(self): """Iterate over ids (which may not be meaningful outside this database).""" return iter(self) def itervalues(self): """Iterate over DBSeqRecord objects in the namespace (sub database).""" for key in self: yield self[key] def iteritems(self): """Iterate over (id, DBSeqRecord) for the namespace (sub database).""" for key in self: yield key, self[key] else: #Python 3, items etc are all iterators def keys(self): """Iterate over ids (which may not be meaningful outside this database).""" return iter(self) def values(self): """Iterate over DBSeqRecord objects in the namespace (sub database).""" for key in self: yield self[key] def items(self): """Iterate over (id, DBSeqRecord) for the namespace (sub database).""" for key in self: yield key, self[key] def lookup(self, **kwargs): if len(kwargs) != 1: raise TypeError("single key/value parameter expected") k, v = list(kwargs.items())[0] if k not in _allowed_lookups: raise TypeError("lookup() expects one of %r, not %r" % (list(_allowed_lookups.keys()), k)) lookup_name = _allowed_lookups[k] lookup_func = getattr(self.adaptor, lookup_name) seqid = lookup_func(self.dbid, v) return BioSeq.DBSeqRecord(self.adaptor, seqid) def get_Seq_by_primary_id(self, seqid): """Get a DBSeqRecord by the primary (internal) id (OBSOLETE). Rather than db.get_Seq_by_primary_id(my_id) use db[my_id] The name of this method is misleading since it returns a DBSeqRecord rather than a DBSeq ojbect, and presumably was to mirror BioPerl. """ import warnings warnings.warn("Use bio_seq_database[my_id] instead of " "bio_seq_database.get_Seq_by_primary_id(my_id)", BiopythonDeprecationWarning) return self[seqid] def load(self, record_iterator, fetch_NCBI_taxonomy=False): """Load a set of SeqRecords into the BioSQL database. record_iterator is either a list of SeqRecord objects, or an Iterator object that returns SeqRecord objects (such as the output from the Bio.SeqIO.parse() function), which will be used to populate the database. fetch_NCBI_taxonomy is boolean flag allowing or preventing connection to the taxonomic database on the NCBI server (via Bio.Entrez) to fetch a detailed taxonomy for each SeqRecord. Example: from Bio import SeqIO count = db.load(SeqIO.parse(open(filename), format)) Returns the number of records loaded. """ db_loader = Loader.DatabaseLoader(self.adaptor, self.dbid, fetch_NCBI_taxonomy) num_records = 0 global _POSTGRES_RULES_PRESENT for cur_record in record_iterator: num_records += 1 #Hack to work arround BioSQL Bug 2839 - If using PostgreSQL and #the RULES are present check for a duplicate record before loading if _POSTGRES_RULES_PRESENT: #Recreate what the Loader's _load_bioentry_table will do: if cur_record.id.count(".") == 1: accession, version = cur_record.id.split('.') try: version = int(version) except ValueError: accession = cur_record.id version = 0 else: accession = cur_record.id version = 0 gi = cur_record.annotations.get("gi", None) sql = "SELECT bioentry_id FROM bioentry WHERE (identifier " + \ "= '%s' AND biodatabase_id = '%s') OR (accession = " + \ "'%s' AND version = '%s' AND biodatabase_id = '%s')" self.adaptor.execute(sql % (gi, self.dbid, accession, version, self.dbid)) if self.adaptor.cursor.fetchone(): raise self.adaptor.conn.IntegrityError("Duplicate record " "detected: record has not been inserted") #End of hack db_loader.load_seqrecord(cur_record) return num_records biopython-1.63/BioSQL/DBUtils.py0000644000175000017500000000701012250104543016017 0ustar tratra00000000000000# Copyright 2002 by Andrew Dalke. All rights reserved. # Revisions 2007-2010 copyright by Peter Cock. All rights reserved. # Revisions 2009 copyright by Brad Chapman. All rights reserved. # Revisions 2013 copyright by Tiago Antao. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Note that BioSQL (including the database schema and scripts) is # available and licensed separately. Please consult www.biosql.org import os _dbutils = {} class Generic_dbutils: """Default database utilities.""" def __init__(self): pass def tname(self, table): if table != 'biosequence': return table else: return 'bioentry' def last_id(self, cursor, table): # XXX: Unsafe without transactions isolation table = self.tname(table) sql = r"select max(%s_id) from %s" % (table, table) cursor.execute(sql) rv = cursor.fetchone() return rv[0] def execute(self, cursor, sql, args=None): """Just execute an sql command. """ cursor.execute(sql, args or ()) def autocommit(self, conn, y=1): # Let's hope it was not really needed pass class Sqlite_dbutils(Generic_dbutils): """Custom database utilities for SQLite.""" def execute(self, cursor, sql, args=None): """Execute SQL command, replacing %s with ? for variable substitution in sqlite3. """ cursor.execute(sql.replace("%s", "?"), args or ()) _dbutils["sqlite3"] = Sqlite_dbutils class Mysql_dbutils(Generic_dbutils): """Custom database utilities for MySQL.""" def last_id(self, cursor, table): if os.name == "java": return Generic_dbutils.last_id(self, cursor, table) try: #This worked on older versions of MySQL return cursor.insert_id() except AttributeError: #See bug 2390 #Google suggests this is the new way, #same fix also suggested by Eric Gibert: return cursor.lastrowid _dbutils["MySQLdb"] = Mysql_dbutils class _PostgreSQL_dbutils(Generic_dbutils): """Base class for any PostgreSQL adaptor.""" def next_id(self, cursor, table): table = self.tname(table) sql = r"select nextval('%s_pk_seq')" % table cursor.execute(sql) rv = cursor.fetchone() return rv[0] def last_id(self, cursor, table): table = self.tname(table) sql = r"select currval('%s_pk_seq')" % table cursor.execute(sql) rv = cursor.fetchone() return rv[0] class Psycopg2_dbutils(_PostgreSQL_dbutils): """Custom database utilities for Psycopg2 (PostgreSQL).""" def autocommit(self, conn, y=True): if y: if os.name == "java": conn.autocommit = 1 else: conn.set_isolation_level(0) else: if os.name == "java": conn.autocommit = 0 else: conn.set_isolation_level(1) _dbutils["psycopg2"] = Psycopg2_dbutils class Pgdb_dbutils(_PostgreSQL_dbutils): """Custom database utilities for Pgdb (aka PyGreSQL, for PostgreSQL).""" def autocommit(self, conn, y=True): raise NotImplementedError("pgdb does not support this!") _dbutils["pgdb"] = Pgdb_dbutils def get_dbutils(module_name): try: return _dbutils[module_name]() except KeyError: return Generic_dbutils() biopython-1.63/DEPRECATED0000644000175000017500000005371512250104543014406 0ustar tratra00000000000000This file provides documentation for modules in Biopython that have been moved or deprecated in favor of other modules. This provides some quick and easy to find documentation about how to update your code to work again. Python 2.3 ========== No longer supported as of Release 1.51, having triggered a warning with Release 1.50, with a mention in the release notes for Release 1.49. Python 2.4 ========== No longer supported as of Release 1.59, having triggered a warning since Release 1.55, with advance notice in the release notes for Release 1.54. Python 2.5 ========== No longer supported as of Release 1.63, having triggered a warning with Release 1.62, with advance notice in the release notes for Release 1.61. Python 3.0, 3.1, 3.2 ==================== Never officially supported, these trigger a warning in Release 1.62 recommending Python 3.3 or later if you wish to use Python 3. Iterator .next() methods ======================== The .next() method defined for any Biopython iterator is deprecated as of Biopython 1.63 under Python 2 (and not present on Python 3). Please replace my_iterator.next() with next(my_iterator) using the new built-in function next() instead. Bio.SVDSuperimposer =================== As of Release 1.63, the main class (confusingly also called) SVDSuperimposer is best imported as follows: >>> from Bio.SVDSuperimposer import SVDSuperimposer >>> super_imposer = SVDSuperimposer() This short form also works on older releases. The longer even more confusing historical alternatives dependent on the double module name no longer work, e.g. you can no longer do this: >>> from Bio.SVDSuperimposer.SVDSuperimposer import SVDSuperimposer >>> super_imposer = SVDSuperimposer() Bio.PDB.mmCIF ============= This was removed in Release 1.62, when MMCIF2Dict was updated to use shlex from the standard library instead. This had required manual intervention to include when installing Biopython from source due to a dependency on flex. Bio.SeqFeature ============== With the introduction of the CompoundLocation in Release 1.62, the SeqFeature attribute sub_features was deprecated. Bio.Motif ========= Declared obsolete with a PendingDeprecationWarning in Release 1.61, formally deprecated in Release 1.62. Please use the newer Bio.motifs module instead. AlignAceCommandline and CompareAceCommandline ============================================= Deprecated in release 1.62. An up to date version of the software cannot be obtained anymore (affects Bio.Motif and its replacement Bio.motifs). Bio.SeqIO.Interfaces ==================== Unused class InterlacedSequenceIterator was deprecated in Release 1.61. Bio.HotRand =========== Obsolete file Bio/HotRand.py was deprecated in Release 1.61, consider using an alternative RNG, or the Python module "randomdotorg". Bio.Search ========== Long obsolete file Bio/Search.py was deprecated in Release 1.61. Bio.Pathway.Rep.HashSet ======================= Deprecated in Release 1.59, removed in Release 1.62. Use Python's built in set object. Bio.SeqFeature.WithinPosition and OneOfPosition =============================================== The arguments to create these fuzzy positions changed in Release 1.59. Bio.Encodings ============= Explicitly declared obsolete in Release 1.55, deprecated in Release 1.56, and removed in Release 1.57. Bio.PropertyManager =================== Explicitly declared obsolete in Release 1.55, deprecated in Release 1.56, and removed in Release 1.57. Bio.InterPro ============ This module was a parser for the EBI InterPro webpages, but no longer worked with their current website. Deprecated in Release 1.55, and removed in Release 1.58. Bio.GenBank.LocationParser ========================== This module used to be used for parsing GenBank and EMBL feature locations. It has been replaced with faster code using regular expressions, and is no longer needed. Declared obsolete in Release 1.55, deprecated in Release 1.56, and removed in Release 1.59. Bio.Parsers and Bio.Parsers.spark ================================= This module was a copy of John Aycock's SPARK parser included with Biopython solely for use in Bio.GenBank.LocationParser. Declared obsolete in Release 1.55, deprecated in Release 1.56, and removed in Release 1.59. Bio.Restriction.DNAUtils and check_bases ======================================== This module (originally in C) offered complement and antiparallel functions (duplicating functionality in Bio.Seq) and a rather odd function called check_bases (also available as Bio.Restriction.Restriction.check_bases). Deprecated in Release 1.53, removed in Release 1.57. Bio.Blast.NCBIStandalone ======================== The three functions for calling the "legacy" NCBI BLAST command line tools blastall, blastpgp and rpsblast were declared obsolete in Biopython Release 1.53, and deprecated in Release 1.61. Please use the BLAST+ wrappers in Bio.Blast.Applications instead. The remainder of this module is a parser for the plain text BLAST output, which was declared obsolete in Release 1.54, and deprecated in Release 1.63. For some time now, both the NCBI and Biopython have encouraged people to parse the XML output instead, however Bio.SearchIO will initially attempt to support plain text BLAST output. Bio.Blast.Applications ====================== NCBI "legacy" BLAST tool wrappers FastacmdCommandline, BlastallCommandline, BlastpgpCommandline and RpsBlastCommandline were declared obsolete in Release 1.53 and deprecated in Release 1.61, having been replaced with wrappers for the new NCBI BLAST+ tools (e.g. NcbiblastpCommandline and NcbipsiblastCommandline). Bio.Clustalw ============ Declared obsolete in Release 1.52, deprecated in Release 1.55 final, and removed in Release 1.58. Replaced with Bio.AlignIO for parsing and writing clustal format alignments (since Release 1.46), and Bio.Align.Applications for calling the ClustalW command line tool (since Release 1.51). See the Tutorial for examples. BioSQL and psycopg ================== Support for psycopg (version one) in Biopython's BioSQL code was deprecated in Release 1.51, and removed in Release 1.55. Please use psycopg2 instead. Bio.Application.generic_run and ApplicationResult ================================================= Declared obsolete in Release 1.51, deprecated in Release 1.53, and removed in Release 1.57. Please use the Python subprocess module instead, or as of Release 1.55 the application wrappers can be used directly to execute the command. Bio.Entrez.efetch and rettype="genbank" ======================================= As of Easter 2009, the NCBI have stopped supporting the unofficial return type of "genbank" in EFetch. Instead we should be using "gb" (GenBank) or "gp" (GenPept). As of Biopython 1.50, Bio.Entrez.efetch will correct this automatically, but issues a deprecation warning. The code to check and correct for "genbank" was removed in Biopython 1.55 final. Bio.Entrez.query function ========================= Deprecated in Release 1.47, removed in Release 1.52. Bio.SwissProt.SProt =================== Declared obsolete in Release 1.50, deprecated in Release 1.51, and removed in Release 1.56. Most of the functionality in Bio.SwissProt.SProt is available from Bio.SwissProt. Bio.Prosite and Bio.Enzyme ========================== Declared obsolete in Release 1.50, deprecated in Release 1.53, and removed in Release 1.57. Most of the functionality has moved to Bio.ExPASy.Prosite and Bio.ExPASy.Enzyme, respectively. Bio.EZRetrieve, Bio.NetCatch, Bio.FilteredReader ================================================ Declared obsolete in Release 1.50, deprecated in Release 1.52, and removed in Release 1.56. Bio.File ======== Bio.File.SGMLHandle was declared obsolete in Release 1.50, deprecated in Release 1.52, and removed in Release 1.56. Bio.File.SGMLStripper was deprecated in Release 1.57, removed in Release 1.61. Bio.File.StringHandle was deprecated in Release 1.59, removed in Release 1.61. Bio.Graphics.GenomeDiagram and colour/color, centre/center ========================================================== GenomeDiagram originally used colour and centre (UK spelling of color and center) for argument names. As part of its integration into Biopython 1.50, this will support both colour and color, and both centre and center, to help people port existing scripts written for the standalone version of GenomeDiagram. However, these were deprecated in Release 1.55 final. Support for centre was removed in Release 1.62, and we intend to eventually remove support for colour in later releases of Biopython. Bio.AlignAce and Bio.MEME ========================= Declared obsolete in Release 1.50, deprecated in Release 1.52, and removed in Release 1.56. Please use Bio.Motif instead. Numeric support =============== Following the Release of 1.48, Numeric support in Biopython is discontinued. Please move to NumPy for Biopython 1.49 or later. Bio.Seq and the data property ============================= Direct use of the Seq object (and MutableSeq object) .data property is deprecated. As of Release 1.49, writing to the Seq object's .data property triggered a warning, and this property was made read only in Release 1.53. In Release 1.55 final, accessing the .data property gives a DeprecationWarning. The Seq object's .data property was removed in Release 1.61. Bio.Transcribe and Bio.Translate ================================ Declared obsolete in Release 1.49, deprecated in Release 1.51, and removed in Release 1.57. Please use the methods or functions in Bio.Seq instead. Bio.mathfns, Bio.stringfns and Bio.listfns (and their C code variants) ========================================== Declared obsolete in Release 1.49. Bio.mathfns and Bio.stringfns were deprecated in Release 1.50, Bio.listfns was deprecated in Release 1.53. The three C implementations were all removed in Release 1.53. Bio.mathfns and Bio.stringfns were removed in Release 1.55. Bio.listfns was removed in Release 1.57. Bio.distance (and Bio.cdistance) ================================ Bio.distance was deprecated in Release 1.49, at which point its C code implementation Bio.cdistance was removed (this was not intended as a public API). Removed in Release 1.53. Bio.Ndb ======= Deprecated in Release 1.49, as the website this parsed has been redesigned. Removed in Release 1.53. Martel ====== Declared obsolete in Release 1.48, deprecated in Release 1.49, and removed in Release 1.51. The source code for Martel is still in our repository if anyone wanted to develop this outside of Biopython. Bio.Mindy and associated modules. ================================= Declared obsolete in Release 1.48, deprecated in Release 1.49, removed in Release 1.51. This includes the Bio.Writer, Bio.writers, Bio.builders, Bio.Std, Bio.StdHandler, Bio.Decode and Bio.DBXRef modules Bio.Fasta index_file and Dictionary =================================== Deprecated in Release 1.44, removed in Biopython 1.46. For small to medium sized files, use Bio.SeqIO.to_dict() to make an in memory dictionary of SeqRecord objects. Biopython 1.52 onwards provides Bio.SeqIO.index() which is suitable even for very large files. Bio.Fasta (including Bio.Fasta.FastaAlign) ========================================== Declared obsolete in Release 1.48, deprecated in Release 1.51, and removed in Release 1.55 final. Please use the "fasta" support in Bio.SeqIO or Bio.AlignIO instead. Bio.Align.FormatConvert ====================== Declared obsolete in Release 1.48, deprecated in Release 1.51, and removed in Release 1.55 final. Please use Bio.AlignIO or the Alignment object's format method instead. Bio.Emboss.Primer ================= Deprecated in Release 1.48, and removed in Release 1.51, this parser was replaced by Bio.Emboss.Primer3 and Bio.Emboss.PrimerSearch instead. Bio.Emboss.Applications ======================= The wrappers for the "old" EMBOSS PHYLIP tools (e.g. eneighbor) were declared obsolete in Biopython 1.52, deprecated in Release 1.55 final, and removed in release 1.58. please use the wrappers for the "new" EMBOSS PHYLIP tools (e.g. fneighbor) instead. Specifically, EProtDistCommandline, ENeighborCommandline, EProtParsCommandline, EConsenseCommandline, and ESeqBootCommandline are replaced by FProtDistCommandline, FNeighborCommandline, FProtParsCommandline, FConsenseCommandline, and FSeqBootCommandline, respectively. Bio.MetaTool ============ Deprecated in Release 1.48, and removed in Release 1.51, this was a parser for the output of MetaTool 3.5 which is now obsolete. Bio.GenBank =========== The online functionality (search_for, download_many, and NCBIDictionary) was declared obsolete in Release 1.48, deprecated in Release 1.50, and removed in Release 1.54. Please use Bio.Entrez instead. Bio.PubMed ========== Declared obsolete in Release 1.48, deprecated in Release 1.49, and removed in Release 1.53. Please use Bio.Entrez instead. Bio.EUtils ========== Deprecated in favor of Bio.Entrez in Release 1.48, removed in Release 1.52. Bio.Sequencing & Bio.Medline ============================ A revised API was added and the old one deprecated in Release 1.48, and removed in Biopython 1.52: Bio.Sequencing.Ace.RecordParser --> Bio.Sequencing.Ace.read(handle) Bio.Sequencing.Ace.Iterator --> Bio.Sequencing.Ace.parse(handle) Bio.Sequencing.Phd.RecordParser --> Bio.Sequencing.Phd.read(handle) Bio.Sequencing.Phd.Iterator --> Bio.Sequencing.Phd.parse(handle) Bio.Medline.RecordParser --> Bio.Medline.read(handle) Bio.Medline.Iterator --> Bio.Medline.parse(handle) Bio.Blast.NCBIWWW ================= The HTML BLAST parser was deprecated in Release 1.48, and removed in 1.52. The deprecated functions blast and blasturl were removed in Release 1.44. Bio.Saf ======= Deprecated as of Release 1.48, removed in Release 1.51. If useful, a parser for this "simple alignment format" could be developed for Bio.AlignIO instead. Bio.NBRF ======== Deprecated as of Release 1.48 in favor of the "pir" format in Bio.SeqIO, removed in Release 1.51. Bio.IntelliGenetics =================== Deprecated as of Release 1.48 in favor of the "ig" format in Bio.SeqIO, removed in Release 1.51. Bio.SeqIO submodules PhylipIO, ClustalIO, NexusIO and StockholmIO ================================================================= You can still use the "phylip", "clustal", "nexus" and "stockholm" formats in Bio.SeqIO, however these are now supported via Bio.AlignIO, with the old code deprecated in Releases 1.46 or 1.47, and removed in Release 1.49. Bio.SeqIO.to_alignment() ======================== This function was made obsolete with the introduction of Bio.AlignIO, deprecated in Release 1.54, and removed in Release 1.58. Use either the Bio.AlignIO functions, or the Bio.Align.MultipleSeqAlignment class directly instead. Bio.ECell ========= Deprecated as of Release 1.47, as it appears to have no users, and the code does not seem relevant for ECell 3. Removed in Release 1.49. Bio.Ais ======= Deprecated as of Release 1.45, removed in Release 1.49. Bio.LocusLink ============= Deprecated as of Release 1.45, removed in Release 1.49. The NCBI's LocusLink was superseded by Entrez Gene. Bio.SGMLExtractor ================= Deprecated as of Release 1.46, removed in Release 1.49. Bio.Rebase ========== Deprecated as of Release 1.46, removed in Release 1.49. Bio.Gobase ========== Deprecated as of Release 1.46, removed in Release 1.49. Bio.CDD ======= Deprecated as of Release 1.46, removed in Release 1.49. Bio.biblio ========== Deprecated as of Release 1.45, removed in Release 1.48 Bio.WWW ======= The modules under Bio.WWW were deprecated in Release 1.45, and removed in Release 1.48. The remaining stub Bio.WWW was deprecated in Release 1.48, and removed in Release 1.53. The functionality in Bio.WWW.SCOP, Bio.WWW.InterPro, Bio.WWW.ExPASy and Bio.WWW.NCBI is now available from Bio.SCOP, Bio.InterPro, Bio.ExPASy and Bio.Entrez instead. Bio.SeqIO ========= The old Bio.SeqIO.FASTA and Bio.SeqIO.generic were deprecated in favour of the new Bio.SeqIO module as of Release 1.44, removed in Release 1.47. Bio.Medline.NLMMedlineXML ========================= Deprecated in Release 1.44, removed in 1.46. Bio.MultiProc ============= Deprecated in Release 1.44, removed in 1.46. Bio.MarkupEditor ================ Deprecated in Release 1.44, removed in 1.46. Bio.lcc ======= Deprecated in favor of Bio.SeqUtils.lcc in Release 1.44, removed in 1.46. Bio.crc ======= Deprecated in favor of Bio.SeqUtils.CheckSum in Release 1.44, removed in 1.46. Bio.FormatIO ============ This was removed in Release 1.44 (a deprecation was not possible). Bio.expressions, Bio.config, Bio.dbdefs, Bio.formatdefs and Bio.dbdefs ====================================================================== These were deprecated in Release 1.44, and removed in Release 1.49. Bio.Kabat ========= This was deprecated in Release 1.43 and removed in Release 1.44. Bio.SeqUtils ============ Functions 'complement' and 'antiparallel' in Bio.SeqUtils were deprecated in Release 1.31, and removed in Release 1.43. Function 'translate' was deprecated in Release 1.49, and removed in Release 1.53. Use the functions and methods in Bio.Seq instead. Function makeTableX and classes ProteinX and MissingTable were deprecated in Release 1.54, and removed in Release 1.58. These were remnants of the removed translate function, and no longer served any useful purpose. Function 'reverse' in Bio.SeqUtils was deprecated in Release 1.54, and removed in Release 1.58. Instead just use the string's slice method with a step of minus one. Functions GC_Frame, fasta_uniqids, apply_on_multi_fasta, and quicker_apply_on_multi_fasta were deprecated in Release 1.55, and removed in Release 1.58. Function quick_FASTA_reader was declared obsolete in Release 1.61. Use function list(SimpleFastaParser(handle)) in Bio.SeqIO.FastaIO instead (but ideally convert your code to using an iterator approach). Bio.GFF (for accessing a MySQL database created with BioPerl, etc) ======= The functions 'forward_complement' and 'antiparallel' in Bio.GFF.easy have been deprecated as of Release 1.31, and removed in Release 1.43. Use the functions 'complement' and 'reverse_complement' in Bio.Seq instead. The whole of the old Bio.GFF module was deprecated in Release 1.53, and removed in Release 1.57 (with the intention of reusing this name space for a GFF parser). Bio.sequtils ============ Deprecated as of Release 1.30, removed in Release 1.42. Use Bio.SeqUtils instead. Bio.SVM ======= Deprecated as of Release 1.30, removed in Release 1.42. The Support Vector Machine code in Biopython has been superseded by a more robust (and maintained) SVM library, which includes a python interface. We recommend using LIBSVM: http://www.csie.ntu.edu.tw/~cjlin/libsvm/ Bio.RecordFile ============== Deprecated as of Release 1.30, removed in Release 1.42. RecordFile wasn't completely implemented and duplicates the work of most standard parsers. Bio.kMeans and Bio.xkMeans ========================== Deprecated as of Release 1.30, removed in Release 1.42. Instead, please use the function kcluster in Bio.Cluster which performs k-means or k-medians clustering. Bio.InterPro ============ The function pairlist_to_dict was deprecated in Release 1.45, and removed in Release 1.53. Bio.SCOP ======== The module Bio.SCOP.FileIndex was deprecated in Release 1.46, and removed in Release 1.53. The class Parser in Bio.SCOP.Dom was removed in Release 1.55 final. The class Iterator in Bio.SCOP.Dom was removed in Release 1.56. Bio.utils ========= Functions 'translate', 'translate_to_stop', 'back_translate', 'transcribe', and 'back_transcribe' were deprecated in Release 1.49, and removed in Release 1.53. Function 'ungap' was deprecated in Release 1.53. Use Bio.Seq instead. The whole of Bio.utils was declared obsolete in Release 1.55, deprecated in Release 1.56, and removed in Release 1.57. Bio.Motif ========= CompareAceParser and CompareAceConsumer from Bio.Motif.Parsers.AlignAce were declared obsolete in Release 1.53, deprecated in Release 1.55 final, and removed in Release 1.57. AlignAceConsumer, AlignAceParser, and AlignAceScanner were declared obsolete in Release 1.53 and deprecated in Release 1.55 final; their functionality is now available through a read() function in Bio.Motif.Parsers.AlignAce. MEMEParser, _MEMEScanner, _MEMEConsumer, _MASTConsumer, MASTParser, _MASTScanner, and MASTRecord were declared obsolete in Release 1.54 and deprecated in Release 1.55 final; their functionality is now available through a read() function in Bio.Motif.Parsers.MEME and Bio.Motif.Parsers.MAST, respectively. Bio.Compass =========== The RecordParser and Iterator classes were declared obsolete in Release 1.54, deprecated in Release 1.55, removed in Release 1.59. Their functionality is now available through a read() and a parse() function, respectively. Bio.Affy.CelFile ================ The CelScanner, CelConsumer, CelRecord, and CelParser were declared obsolete in Release 1.54, deprecated in Release 1.55 and removed in Release 1.59. Their functionality is now available through a read() function. Bio.PopGen.FDist ================ The RecordParser, _Scanner, and _RecordConsumer classes were declared obsolete in Release 1.54, deprecated in Release 1.55, and removed in Release 1.58. Their functionality is now available through a read() function. Bio.UniGene =========== The classes UnigeneSequenceRecord, UnigeneProtsimRecord, UnigeneSTSRecord, UnigeneRecord, _RecordConsumer, _Scanner, RecordParser, and Iterator in Bio.UniGene were declared obsolete in Release 1.54, deprecated in Release 1.55, and removed in Release 1.59. Their functionality is now available through a read() and a parse() function in Bio.UniGene. The HTML parser in Bio.UniGene.UniGene was declared obsolete in Release 1.59, and deprecated in Release 1.61. Bio.SubsMat =========== The methods letter_sum and all_letters_sum were removed from the SeqMat class in Bio.SubsMat in Release 1.57. Bio.Align ========= The methods get_column and add_sequence of the MultipleSeqAlignment class were deprecated in Release 1.57. The Alignment class in Bio.Align.Generic and its method get_seq_by_num were deprecated in Release 1.57. Bio.ParserSupport ================= Bio.ParserSupport was declared obsolete in Release 1.59, and deprecated in Release 1.63. Bio.ParserSupport.SGMLStrippingConsumer was deprecated in Release 1.59, and removed in Release 1.61. biopython-1.63/CONTRIB0000644000175000017500000001064512250104543014101 0ustar tratra00000000000000CONTRIBUTORS ============ This is a list of people who have made contributions to Biopython. This is certainly not comprehensive, and if you've been overlooked (sorry!), please mention it on the development mailing list. People are listed alphabetically by surname. Cecilia Alsmark Tiago Antao Wibowo Arindrarto Sebastian Bassi Bill Barnard Yves Bastide Paul T. Bathen Yair Benita Peter Bienstman Jose Blanca Bob Bussell Diego Brouard Christian Brueffer David Cain James Casbon Hye-Shik Chang Jeffrey Chang Brad Chapman Peter Cock Marc Colosimo Andres Colubri Cymon J Cox Gavin E Crooks Andrew Dalke Wayne Decatur < https://github.com/fomightez > Michiel de Hoon Bart de Koning Sjoerd de Vries Nathan J. Edwards Kyle Ellrott Gokcen Eraslan < https://github.com/gokceneraslan > Jeffrey Finkelstein Konrad Förstner < https://github.com/konrad > Iddo Friedberg Bertrand Frottier Aaron Gallagher Phillip Garland Walter Gillett < https://github.com/wgillett > Frederik Gwinner Jason A. Hackney Thomas Hamelryck Michael Hoffman Thomas Holder Yu Huang Jeff Hussmann Kevin Jacobs Diana Jaunzeikare Joanna & Dominik Kasprzak Frank Kauff Siong Kong Andreas Kuntzagk Michal Kurowski Uri Laserson Chris Lasher Sergei Lebedev < https://github.com/superbobry > Gaetan Lehman Katharine Lindner Bryan Lunt < https://github.com/bryan-lunt > Erick Matsen Connor McCoy Tarjei Mikkelsen Chris Mitchell < https://github.com/chrismit > Ben Morris Konstantin Okonechnikov Cheng Soon Ong Anne Pajon Alessio Papini Claude Paroz Lenna Peterson Andrea Pierleoni Mike Poidinger Leighton Pritchard Andrea Rizzi < https://github.com/andrrizzi > Joao Rodrigues Thomas Rosleff Soerensen Thomas Schmitt Wolfgang Schueler Peter Slickers Kamil Slowikowski Thomas Sicheritz-Ponten Frederic Sohm Nate Sutton Eric Talevich Bartosz Telenczuk Bogdan T. (bogdan at pearlgen dot com) Carlos Rios Vera Johann Visagie Dan Vogel David Weisman Bartek Wilczynski David Winter Hongbo Zhu Christian Zmasek Harry Zuzan biopython-1.63/Doc/0000755000175000017500000000000012250104773013562 5ustar tratra00000000000000biopython-1.63/Doc/images/0000755000175000017500000000000012250104773015027 5ustar tratra00000000000000biopython-1.63/Doc/images/plasmid_circular.png0000644000175000017500000004203412250104543021050 0ustar tratra00000000000000PNG  IHDRݡ pHYs  tIME ]0ѫ IDATx}\?W&$ A4M7X`[zz C=%k˷G5=GۡkCOMYdv V(^($G*n+\Iуu}>7" BAt T1pe 'F+ /k?IHTJP`) 1ΆRCGEPZF+?r9]Q ,BXJH$\DD@ LEGF<_J}uXLN*kMH⣂@ G2LRj/'#,"\ PCP\B*X>b׏6`ƅi< [$T*lق ,"x0jZP ˇ#cé3Lf)`@`߶DRlFEtzƖBGi*l6@hr@ X- ,mmm)K |;VKpv{]]穟\.ϧ)/zj|Wj.8 *7XdL&^0V-//OHHPҌ)ڰXƗmG\ͧ`XSa^o2JN[hf f|@P TWC )N}n0TT__iX%P(1\ &4q^~TT>tM|llhFO5jb Ksj4)A4Jl݊bZOL$ @gJno>,2fqUV5999??oK |ܖZFۂpA@*RYYYt}[ju: T@+04E6s#}jXz}MM 0U渭PlT^G|dWʖ(Fbl]ZZޥ܋{, {>P`~lEe,L&۹sZ|$`2+**, 5Xr%KD)1YXDUSShZp8fMXx|F=߀ ;2n[Y]';7(Rb"D" MLժRlRגZFh4KeHrղtqpYXWVVVQQ>77. OfYV(h086mߖ0gu~w(&Ef0 fBׄbi&p۸ ,~{_NUsu~w3bYYY]]]۷o"P(+++J;T;Y`(<2}Xzm}/|B5)**`6i$ݞsi jdÛґВ[K4>uϢ1VtAE+''gc~ dK#_ݴb"eϢ&zjkksrrJ}hK-Fcf^5g,Yۺ}XSiߴiSQQQ\\?"3Zd25@`Ëm52 ;&vjϢTZZJ#B Riuu`P(l,72^P>|_fIHd~ka555yyy===/@xQII޽{Jdk\vxdmЉeۆ~ 444'''ݻ6'^Q[[[VVhh n@ufn^$d_?>KSOQgͮ]j]h=}QQQVߺ\bV4oI/%osux7CC QLD$$JZl6o>uLm۶UWWTh:#_-]JyܟEMD_VqwWҘ}=|-yGRP] UeeZ....,, BԩS˗/?u4^n݆0^O* 'H%bj 鬨XfMss33f477WV\*|b @ϠG\TBEEEYYN(yꧯ; gJV͊  fЁ5F1y А4o_yM3N#)klիWj/խճt:]/ %-UDϑ bFZjٱcgAB|h,--yz?%|g:>:Y6Gm6۷-av޽f*礥tM^-,\y=ۍC%ѡS\ jfff:FZ r}|+N# `233رҊFV_\]uاvCjr:۷o~+r33z]893%moB&77q}awP`MVKU}8>e{*ĿYgl{6`d\Y?cqgeY?UVuvvcz[prgq#nw44H(o0 ?!,rHXqqq8m>1tEnh\:o9qrQ&GVݻ7.6j; >X&nuN޷n, Jp/tE>Npb(eӦM }M:[N۩E^/,,|~g8>z_XFqpWH7St?E?$J',@UUU555^PE1NDžtc=/{l6?xc?` ;tO]#Ѫ?)JD/^\N>N10Jt!_a ;v,++10=kZ͔O&p}= yZ3{\]_@l'|ҳF-|@*"~NP mO/}&;;;w5cvr쌙>w.O$@xրi- C3|1 v?0GZ?)}բۖs{qH,R9&eǎ~ٱssQ\T|USSѣ}DH]z#jҊi11o"Ok9|~^W-K_kUM+Vq{9rJ+JeAA-1w|ދMBݞcXع?隳/;ڿX>PɪYNYVVd׽GpzDI_òX,({=]? 9br\ڱwnw{{Ν)B))//k#s .r|u8"F@ `Ͼouaptl܌08ZvA"MC7mڴ?U]kf$p{pC.I z Oc2-8w4*.>98\vis)7͏\JW )~kOԕ'I'^9t#j655H+"@}5O:]Y>zIV\A.oݺuB߻;8dd Ųlff*_:}߿4o5/GD<ޜ/l|یɗfbT*\gÓ/bݽ|f 4jjjz wu "sh۞Z񡁋1!aae[gȨPr-gX}4*zK%a ,>r | =)wƻ>\3[綎n - !! վ%ΙF\q!Rɸ?B***ji[&sw|?ְE\'hKs]n! P$z lެP(G:r;'2SGpui\(z_,;7ßIC&3 R^^n;~Ώ쳀qY3YkhQBG|zׯ^ȃ#m#b|QP#d EqqcG?6<+߶ Z-=B&";;[VZ 0J`Y, R R*QP@IUl>󃏫'K(UYYpȁB>^X*uL\qq1Oc##UD`]{%*7zOcC]Ǻ jv>zrtT@IIIJJJso=;֮1A^4@GhPI#Jc]13uiݫR-RR#3ɜZ| X5"d0P.M97qcG9?)g}o> ƵJXΦFd9?ٻnlyLOX6ʩ*###O?4`w UCA g]~?ƻLJw<:2<}(Ht WR?sH89Bb*ZpO"zϟ=3W}~u$K9vS9V-c>?-;vnHT@1`>892 "?kn^z)zC~p5ua;ۭ}3)KԫHO$4̀ Pnf@&SRPRB Nw_n}q ~]ޮ7\.whXgHUߜvW+äڍ>/&":$x|#U[[0̶mZ-`)p3?/Հ 8*T"oڼLuXU52r!Y^]x벤yzspbD>4;.&=1f:>zi556Z]Xݺ&Sđ#~D$ppf`r*hUBx23>yVRs]]:}ՙq3vyryBåZv.:bdJYm B'D ao@ ||b#@t. l>v¡)e7DҨA㢣vꂴ2!qnK~rb\:r8 (JmW XMMK²N@(ρ7 *@DD"Or]#2l@kxYTU__iP] @Z[gf80cVxęfY6+~fdvr)tX, MJ.(pQRǀ HbET~*\Vki/4 -V(NV+z0Y-D<!^Ųl|||AA۽p:o7 ryRJf0L|CRJ+Bgp˲9kXZ[[N*++U"ߠk,+Ԍj1X)BZaf]C,* LךbZՑ&..Nkw&ᗽ[N/'M IqRYAg#=`8x%7wdwOu[;~26:7-Z0L]]T6 1{gu|4 X,ABP*JLfދqbX88H /yD:i߾} mS:A !XDBB!P`B|0 P`B|fvQ ,B5 !ćQ ,^1ΕBE!XBE" ,Br`544%F`fjB(!T*J"R^Xo}..!J %Xq1!c Dp8BE!0 Xee+B P1g.KH`bYZ8-.4!dz=9NGwE X|7tBBL&H$>XI4IJbI( H80"$XV+NLZp(M^Kl(.. W$΢GHiU+.UB(.roP.w'ϱ,Jijecּ3gM~n'!Y^m2vf`q}gB^Gh;JcYV.s4 TTB5,K~~>;)ќ WxGE:SPR$&cpЭ%x:yZƁ532,,e%hYSSSGGZBhu K*8<+wMBn'zhBB0 xD ,ΗmH7 !SB+ ,H$U|ZòlBB\.&4Vazt촆 ,xmXGBUDTl{L߰Z2c EN* iL*JRM}`]+>!BoO:̈́cbaXe+T^4T>,VU uvj%rݍbU }bթRSs0x?vnp'Qc۷/!!:!>*++d2AO $䶒HE+7<h2pǀ1,TA ef|vTU!/"yUUmx8{ahx狓H E<]YYi2x]“+Wn<#'%*JK1ɏ{oLwbƒ a iH\xg~bJJloo"455YV@?ֆ6ȀF<$$@*孆?RĎZ[i;!>J̀vbGΆR ܙ3%&~!7L6mڳgZ@DhT*CXb`]ѡ.ػlΓ̟vn^81ak(n!Ej!Lng٠!3c2#h;vٻ¥dؕIw$FnVZZV5!trAc̀q4 .{[JYpǮ1qYDvOlkkKMM-))1-K ,PpKp12y"y%ݮGL~BLVVnrI4|` ]8- SfN<';*bό$* b1\^]./&!-Zd2A񖜜ڦ"( طoLp/%7!Dl6=6u jXA^Ks3c;d@Eyy90T,&^h:y24dB dDR D.,8h.-ǤBFȰlk!!Bòh4Kk9 \Q`۩"fЍqm+)P`)ʂE W+xP`I$-[Փ dZSR(Yx$KRrssiL!¡Jekk=v8ј,B3Y{iB`L#$kDcͦ=O/o hmEA&H,|D!ְXr8BCȔp:EEEWhjxWKKCsDN5,4&)ih4lj\o,g|3!ְ55^ Z[SRh,Bͳj}[ j`:W­aaJ ?Cyԗ}[g`xx h\ ­a9ZdǏ( iiiTݾqFպo>儢FHSeTj M\ b XP̲!^UWWg2 ZgOXq ;vk4n:+`0܄j:ٳ%%V/Imʚ  `4BqٳG=3NWSSo߾t 'u),6W49۶m+--H$TW\YXXh0fób@`immMسPBȍ?,a8i:-abʍ0anԀ$LL]]]OOF`,jk \i;!|vo,`4㭔J;w&BȄ>իM&шLqVv:ɕT^lAiW`Yx<Vn-NBF'jjjjO4\xif?;vhZ*mL1Yi޽ Η@\@`.u "պeH+ׇ5CףʩaH$yv*---((W`)m7;B&V2,*xtý{xdž VkccZw[wx)eYYYT {Z655VZ*rs;ȧul4sss'q6 Gg[n۶"!gZ333NgccNM`Lشiؘ0\ o1YGlgee"!tVTT,[]] ύe `lY\UeeeYYcD`3V&!W0L2roG/Sx8G.])DPjRE8g\xFLlò'ClF-;mr lj:V/ֳT Lv}fy?}G_;'Hhp)nu~H 'P kLJK!tlv2''d2+8yzO 1[]ǩ_E(Fe%u0/* hH$6mcf;p|~pr=nUZZ?;ǯ6p\-,Pa0p~ԷDp\՞={lܸ G\_p]!q;?qZd&ou[ч̄!@9`ٲ1 Wp|p8}`\`Xaax @ tf`Fa^]\k^}{;3j9m97po@"-rs= U?^(aX7|9 dVxϋ$kT*}W?`dlZ744:?eȐ`1-SCF*''XR~ m@PfvEDDpuF=*k" ICʥQ!4zN+>#vKQB8>Xg8b`Maa/##b{` U¼2Qaq!e4VwC= Q[_j o%JX?ka>"~V?0L#.}]CҼ8R8,XhZT":y7z#GEs'ԳV˺BU rd2mܸQ"L_w :O`y\d2mڴip5gђcbv (%&B-A,\֟z/b {6l~Wռ%d:$o(,<+VeGV>XzVC˽}ޢ0yh3#hhjjX,sW_-yKi k8պaÆݪe+6?SY] C6-+p#\UZfGKAFkaCeee =i9LJ!{~+ ,ΰ,뫪Ϳ?vP?yIA4q\Vkff&˲F^ng4E'Mv.]>oEűxU_ y͊ov~ٻ?vn{ڵ'Qp8t:]SSjFsխO3d]4X"_6|k 677gei/t??3՞W92? >䦎0&V[SSܜ}մcpɮG_?2Ÿ'H5,o5%S+֎c!a֭#)6gjB(///))Su9֓}yHX;ow^[, 6\acǎIUbcbOU"D}_pZհZ+++=0n=#2lլi~gG*rN'v=~TD[+u-7|K&^7Lu gxM龍&I[V|nO1r>=׵"d;y8HNC ,ݷ寁uRYa#{cOeflNOus&4TGa'?H$ȰZO?.))BZyHs+y!aWvNIDhfME%&Fhxx7?%u[c6-Kmmnh4|Uݐ>3/9 njيH⠴at0-gK/^y6irFSZZ: l?ۿW-[/l HIjc] ,uuuf3'16XKTSU{oogμAidTbT򄘀tP` f3jވXYPRRR>g{uK%;bpc ,ojjjhhhiiqEDEm~<>!IKAD`1 3`5MrrryyyJJ0q̎ ĕ)|FKK ˲:pV-K_lŊ> ,]] vza4MFFT*FEzY? }:C&֞)K``0Jevv6+ ,;^V[- IDAT[=P4/5+PmQWg?MssV"DEʳmbb`*j) ,)Owt hnVKŇLс S$$%̗m~"1)8KcvXNg n@] )%(("CE3S˸/|ȑ|SثQקRaX/xӍ*02^q*X$:Ղ  t)-d=;;wfP`BLDK$B(W"XDBE.!>!>lk@E`\ZP`"lN'28J/d"xQ!P`5!> N']A>,![T" pH&%.չs' o`dZ  P*Q`6m4@7pJPo,!R)22U` ,BH"הwDxDΦ!W | H7y jT(.{AE ȁPm╗C@\r 5 h8fKC9 /P =P)BE 'i((LveHjSʟx\UnTB"HEʟDDP#P 2bj IENDB`biopython-1.63/Doc/images/gc_plot.png0000644000175000017500000004431112250104543017162 0ustar tratra00000000000000PNG  IHDRX3sdsBIT|d pHYs )I IDATxyxUCHB {vEU@e ̠q\2 ^YUAtEQGd#A ( &IBs&kN:\]w~mnZo%Ik׮UW]`nO?/RݺuSZԮ];}_E1c(""B5j,GM7ݤpYfzټyڵk+::Z<Ν;uYjRΝi&5mTO=}Kwc9sFHz7ݻ?ԪUԵkW>}T5J?>EFF*>>4a-_\ڵkٳgx+55Uo>3͜9ӡo˖-߿{饗^ҦMtmٷ9rnF5jH~}Q9Rl29﯍7jѢEZ~5kΞ=[ZffϞW^yE/?o>]s5o7ꮻɓ'^ׯׄ 4rHmڴIVҠAVp j]vf/^ll6;w}ݴiL^쏛6mjJjj֬iyrܹkѣGMllyK3f3vۻwl&11Ѿf˗cINN65k4/þzaJ<w_{GvPرcMfLnn}fzʾiӦ1W_56_6~~~fϞ=uSNf̘1ovW||ݻnڷooly~t޽o@e hƍz[j޼yd:|-ZQ_}[oݻe_׮];5jx_tԩq֭%r۷+//OC qX?dȐ2=t\o;\ffmۦC*//Ͼo^-[otU'|+RW^yu8p֭[_~?Ouw8<յkWرC>l٢;8TScǎըQ4fh}#G*##|]g?Mᅲ$Ct޽[k֬qxʕ+rJ}7СC},ͦp[$IN*\WUXӧNrrrmذ}7|3gjȐ!:ze4i$ 6kccc\AAA@TF ;8DEEm۶Z|y ,\ZyÇkJKKڵk5fծ][_@j.,,Laaa^xAzRV$I/o];w֤IJcGYV^|оwߵ_EWݭZR kgϞ.W]uvZϳvZԩf͚uСCѣz^]t)u\s֭[\+33ak6nPc\\}5hР̖魷c=}Y սޫ> vܩM6K.oիWkmvZuQ>}Jwtt~a=c*((P۶mf]*Bh ,XK5jСCUPPO?TTuՈ#裏@Zҫ'N:ٳuwu:w.]ho^`wܡP=zT6lɓպuk3F/ 1cɓ9sBCCo֔)Sϫ]vZfvP=ܣ_|Q]wq]q:{o߮7ˌ3Խ{w 4HƍSHHvܩH{z3g*--M}UxxaM:J}&))tԪU˄?W䓦YfE^{cFmMxx9ryK/iѢ 0!!!f&))a۷AP`ZliFmRSS|SN&00t$&&j077<&,,DDDqƙ^zHgϞ5cǎ5525k4u56_|E.))0!!!&((t|'~DDDӼys3k,SPPP ،)笄5kM>ݥ \Eߠ*7y"p1Z\b,#` XYfﯨ(QF;iӦ"ۦijӦ>}_VAA$رck}ĉUd}q:A)66V5kTdd C9ld]PPPuVf֗<ڽ{wەWӦMDFFnݺuСԼys=~իW[nU"""4hР"7>,K?^v5kW_}U;wTze˖iĈ裏W^8q>CIѣ 6(((H<{N8QǏWllleddUVZd>s=ڳgsٷ[hڶm+Vhjݺ{dř9sKfӈ#m6'8la :TݺucjZxq?[7t6lؠ7|SmڴcՀ[o%֭[gl6y7}~͚5ٳC5ĉE=vٻw1Ƙc/44ԾƍM&MLvvv/f3}ӧlשS'ӯ_?86ͼkN$߿8}1]tqX7uTirrrJ|]rrSyW]Q*JB G;}[nQhh$ȑ#ZnNٶaÆj۶$)77WjՒ$+''Gk paaaEוֺuk>^ׯב#G {СC?I"۞={L6ʹnӷo_ꫯ|m-Zd_d˗/7111N:fĉֶn:s5ט0obccѣGl~%`]ӦMMBB/NbbiӦ7~~~+wm"""LZL\\oJݻM~LTTQW뮻\͘dwnjժeBCCGgϞ"sc̹sC=dLZ 7p# |f {ァ;*44TZl$kǝwީpկ__gvs~z;Vut믒GyD:q~W[M46|{3fLДH}駺%Ye7n0##C;wԉ'ԦMEEEiȐ!:q߯uѾ}핔Ɗ*cVZ?\ǎn6eddHj׮m߾N:JOOwW x:uHFuJLnݺ)88XUΝ;b,TJp5na]h璒&[TT2ydk 9߹/,|UXhҥ:}4|]{mݦٳg+33SG?1%kҤI۷J(;;[׿$IK,QxxbccճgO9Rwu+'ip͜8wSΫy<+K>i ύ*v%`9۽[2D:|ؽu9'U}'i*| /Fr^o X@т rw x:u3gnRRe|J ^| /ER,!`XCK܇kW@|Jr)(Z6o--ݥ^ΝwW\|JredXٳGJM.?,m"K}H{[!+hߝeΡ,'9#5e®]VkWH:XvmkSGWO뾀kP|_#K6X7P֨@s( vp̔Z ={ͭnjB9_;8HV:yRj@rIaCk ӯ{_;2('$&JFI11M[I2x#?.M }ht >GnGvXi~; W,̔/ں/0к߳J.BW;i@k\ըQҰa﫯9zJzawW@ߖy@'ҠAsP}x}l:uK۶m<ZZV魷'˚̗&>oȑ֤\jG^߂%I="##բE ͛7H*y@|4s& Փ*'))IM4QXXo߮x5J&M*k@u/խk nv6Ρ^.h"XBvryͦɓ')..jÇ8JLLTbbܹs}*`]ʘ9s渺>DߟpU]1w\7VS~ ֺu딙)Iڱc/^aÆy@S{{*77WuUBBx id+E QV%5 Ρ^\6nҢsw ݃,G!`E_k&%EjY3|J cl$IBGx )XA `<¡CRn( 믗jpw%@Xq#݃L_8_~)ljPv PTԢ+aL] IDATPTi87%C|y23_ww%v Pmm*wpcRn4r45 $,@h!%$yr:$ubuij v Pc l< Pԩ8k͛Pn'R׮kPZB~t֤+x:Z_liwW\:k͛PUCiUNt=+xZk*[ K~*~kPEp cѣۥD  P匑ƌ6oZ]Z,@2F?^ڴZ]z,@1FzQ㏭pU+* P%rr#/tgJÆIҖ-Rx+*l*ѣ5H+%e^-_."j.WP -^,]w4{S,K8! .PںUͺqck \чkP|>H[ſJڻ;uJJIBB֦¥fMkB?I8Pt.s( vptXsHK?$?oݗKn%+Kڳj*kQ_ߺ_zV Ρ,' k{e~k\SVXMAR@klW=|Jr.((Z~N~KNڵj(~e%Ρ,'x,!Akcueg[tgZoYKVmk#GVպceY71&Hs( vpykǭ. c Xg~z/\k˼ U)6V[jִZAAV0 ~[]x6ۅlR&V"@kP|ez!<9b-[?J6 Z/KQ 2~~5SoIkSP{E9_;8jE:{ NgX?O0i/8HYA+4kfl @ 07|JrVʺ0)e~%b .\Nr|b EDXKd^X׷~6jdMbm\Ρ,'QP`>|H0ȺZWxsݼm BQf[]ԭ8pn]=p)|kZrmۦmJrss5~xے;S>jԨQd_vpboVN mc`Tx'NX㒂F1E  Ka@ p`Q#kikPwPl6NӧٳuV8p@߿̙iӦUqd;HKXPkpvkVZV,I&e˖iv=c:u* Ev9raҩSV+{YtO(r]>{9-^XQQQf)55UǏWǎ۶o^GUzzBBBX5q/fGkʀ+.,-[J6H;j@uk0m߾]I&ܹsڵk۷S$<@^(m|a@0Fi6k*›jE k8]yx}С=zhܸqZb&MdSm CWIjʔ)We֭ U+ rnMi4m[kb2Vq 5lPw_Uƍ̙SeuDzm L"-X X.L.\WxuՕσջwoݻW[4m4 qiʕK>p`5mu?k|ӕW9+J_|!=5Xڸj:U1ޏ,'ZXZ5;sF:yҚtI!kV+֚|Jro@wߵj+'^RT5fL4j$cM{P|ʒv쐶l>Lskxi+H,_8 ppZwHs礤$i.˥Gn]wW tpu rpZ oH|옴}5?ZkFSG][ ֭^yp%O9  *; ;ճחwZujrw_Sϡ4 ^y駥]5˚s*8UX믭/LڹSjIMmۺ7O~n7@u,'Nɚ:ꫥ}P1 ʮ]҄ ѣܹ Rsw(/HgEwҟLЂU HZS*O U =u_hc0 U1@o~)7Է wG\kN3 Wx2V52uoѣ] t:27֚ꫯ-+-pQ' \ Xn#-[&kgݜyxwW\&]~J H~*ը+0VȐ6l֭_CZBӇ4m 3gO>:v nEjѢrj:A`U˥h] dNI%JvteT%V%#`{X@WURST-V%*d+| 1 DD,|MJD7*ѩSRLUUN _DDtXo"`UcMUI~ͺ!xd:{}Q 8P=?(o\ ]ӦMS͚5%IGտ/IR~Q ᘢ-XꪫKB 7ܠ)S(..NvsEтc(C顇RÆ pBm޼Y{Uf?YgTޯkT)?_78sт%I͛7׆ t׫o߾ԩSuwVIr-X.Xz5w\>SbbnF9r໪_O1n=zT{ջwo+5l0vmw,|G]RSS,uE$7of̘Qu8ܸGR۶\`yDڵ뮻N7nԡC:,o^RAA$iZrm۶MmIF=8ǥhZ1Xk֬Qrr.\\~OFfl6M:Up匳g+##/i7Cy&MT8Tڹs>#ϧUՉ)^=nb }>wwkʕ>//O<.]XSddZhy]r B|GK/#Gjɒ%~ѢEرSСC:sVX^Ͽz]~z]szҞ={J|tRڵ;t`G7nVXI&)S)..6,KLLTbbpXeyf%''Hׯ7|S_S7gΜ2ߓ=|ōsuc5U#[j>6oެVZo]Gݻ{n˒ݻwkպu딙)Iڱc/^aÆ]R`<"`=ú{nwֈ#ڠ իWϾDDDf^z ТEԠAթSG1bxKo.„߿_ݺu_u*99YĉP}OǛ7ovy\Eo :tH|RRRyU坅iSv*&<k߾}JLLԨQ$IVlzԮ Lyc`QnJ/ k#`͝;6[nU~Էo_իWO .tcuӥ\)*ݕwƍի'IPjj$̙3ر;Vu'}8 +KǠJMM+I7nHbq! 3f?wŐ\A<"`ٳ:;ٳgWT2Z@i)Ŕ)St7*;;[`ZJSN|X#W_+Vh̘13f}}&MkucuNZtw<*B8p>h˖-olb)>^** kWzD V!ͦVZzsgw;y.B|G r$\EX.d ˥ΝΟ69: :eF wW܉B p˥6twX.tԠFr&`KE$KE$KE$H'NEX.,KE _lE"`@!0E(Dr@!E \.BP"tB6cqwf+=ݚ`ykQਤsbbWBr\+\+\.B{,"Gr\DN(n\)0P:wN vSaTsL4 5; "`]".X9X.Bp1%\u"#`]"|*`eee+߅ѣG+::Z3f˵?c'XOӧQFlug֭[u۷O_|̙S>mj򙀵sN}GHEGG+R}v.F55UǏWǎڷoG*==r!(OEcǎӧsIj׮m_WNI*w Bp1wPJ> s GDDf^ziӦjٲ$鮻r, @q˕.NK_|!hƢւWV4)4UꆀUARf& EtF wû$*,=j69b JKJ* 8V`\UA`*)@IXD!( "%!`U-X$  UA`*,PVтJB Z@IXD ( h%!`U-X$  UyyRV-Xx HO@wW#V] X+PVp!( h!`U-X4 HK#`*.BPVEJCZ@iX@ ( h!`U-X4  U`*,PVЂJCZ@iXN͕i%#`9)=]YS tw%"`9W,,'1 $Z@YXNJK#`N!(I`D ( I`4 ,>FF)$$D[u Iߖ/ie5fJOO?gj$ͦS*==ݾm۶}тB˖-@͛7$cd)he,I7oBCCue),,LO?$SddZhyhe5i$駟4aIu!9sF+V?痸Z@Ylƙ1/n:s=JKK+ܢEb ڵs6M5lT(Ds:5$߿^PM*5kV.n;wz^EzKk֬Y%YYرC/ְaJc@Y033S֮]Hq5kԻwoݻW[4m4l"egKUYT6ͧ>`fS@k]+@YXNb( I`De!`9.BPhe!`9,Phe!`9,Phe!`9,Phe!`9,Phe!`9,Phe!`9,PX,,'P\b,#` X.Fp1\b,#` X.Fp1\b,#` X.Fp1\b,#` X.Fp1XGVFHz:q$)77WGVtt5f绹b|"`3F??ٳ?~$iںu8}/М9s\1 %&&w^Ϋ9*O-[*00PTPP5o\l2=裊Ttt{1+,w^Ϋ9*O,I7oBCCue),,LsQjj?;ڷk߾=t7V <I&)--MO?+##CTvmvuԑ$01Ƹn:s=:z"##gmVN:ٳ qxfsGx_.TfMaÆڽ{Cjܸqp%ց*322[o)33S~͚5Kv$)!!A=31b;K3335x`ڵK999wܡYf) @yyy7nV\)I뮻'$^"3gܹs:zϟI,YӧOZxCb"ʕ5mTkVӦMpBiii;kndee+":vPjٲe8+ˉ'tM7),,Laaa/H8w%K[n u]\Yǵ^.VSIDAT?n{L>]5rcr_^cǎ+4߿_}q^Yz!:v233K8w h\VqǽA6lh|M+V&M p|dff@esg6}u_q^dǎm۶fÆ fsWnݺ_ JrW^xxɒ%m۶sW1cׯqYǵ/`H^vvnݪN:i߾})'%%Bx@K.wK%##C;wԉ'ԦMEEEiȐ!:qq^In&^ZRSSzj 2 u\qO*Źs$1iU1hĈ}Ww-Z;O>9+Gjj1Zj>s;vLJM6MRtt$iʔ)U߾U JBcCi޽_wil6lhx 7T=̩S˚5kf3N2ϟ瘯$O?֭III1[o5{6pW\c&L`Lff7n_8wheeEx\wښfggа `#xӧObg]ww Рq޽[U0T{{޽uIRMM IuYUWWKu!MLLh׮]S*~zX< %I?~tuuu˗/joog9uVVV}h7I⢮]ii}Y{FGGU^^H$pv>p8 :6ḻڷo8/_nPHDBΝh4h4l6!b1~K ˲קݺuKkkkeR)Ycǎ)Nk``+5??cq璤u۷JӚׯ_#߯X 5551UTTȶmUUU)//Om[dRWiilǵ(H,맿 uwwE@@PHW\1FlV===*++S হ]UٸWp e,X.#\F`p2 e,X.#\F`p2 eߔ7IENDB`biopython-1.63/Doc/images/hist_plot.png0000644000175000017500000003743612250104543017552 0ustar tratra00000000000000PNG  IHDRX3sdsBIT|d pHYs )I IDATx{|{1{'3lS0(V#9qO珳J(a}JQ χٰ߮ool~on^{t#ƣ;PlF f,"죏>RzTL]wuz/9SO=%Ps6n8EFF9ϟyΝ+6U}嗺{էO5|pyxxh_5{lpB]7n__Eɓ'aÆ={$E:v&Le'|RC ̔1FJs<_F2224n8UREeʔQzӧOjJj֬ҥKk۶m85iDe˖U@@ڴi={,ߪqQ:uvZO*66VAAA uܹSppuvS?8%''kҤIyn|w}Wk֬ф \_^wqBBBW_}ݻ[޽[۷Wʕ駟V~~ÑgΟ?;C+Wԋ/˗+22Rwqv2IKjҤI5kf̘ao߾]vΝ; hʕzu|k?~髯|vӗP$թSy.e3f0L2*=zi֬5abbb.ѣGy\ʻtb6lhMxzz{Ze&,,?ǎk_~8o93o|,X}ԥhƍ{nԭ[W!!!׫}KS۶m{YGZJjRZedduNmef͚:t5zj#F~O?\PD Hiii˗/WJJ|+VԎ;\V\h}駪TRG{OÆ s9}yW޽gYX@yf}W馛_K,Ѻuy5jmҥKB jѢEmh6l233Uvm-]Tqqq.wJُ`yxx^?RJ{UffV^nݺا U߾}O+33S5jМ9stK^u)uI=zP͚5u Qݺu%I/ճgO=޽{_jȑYbcc5sLuU:|&L uIFk:uhҥ]ثW/jժnANҦM!C{\ƎoYڵӐ!Ct:yfwZׄ tilRںuK=쳗[ow}=Kٺu曍7:tpS,7И w;T\x{{uŋӧOӪU_tiԨ)]7m۶67n̶i:55 4@ӯ_?o^.ϛGyTVx{{iڶmkn2ߦMLv팿6իW7 2 Jn(22R1113fLaw@1]p  `%g(~8E`3`،`3PL7zaQp)7N{q)_f<<33SSLѝwީzb>iӦijڴ{=uQׯWƍm/!`HQ'&MZ_V-TӃ>hl޼~7ZZ5tMZdz}m:???~\>U'(55U:zRJOSO)%%E/~Z҅?kO 3!P/С_GNmܸQ:u*U_=[[cǎUt:*..:{n]wuVZCJrY\իմiSlٲS.\g4\V[|]K@@@YR/Vڵk5o|VX(u=ۻ/ŋSN.`u]˗װatQ>|XCUXXw.IJKK$y{{T_z\cÑk?lTbΞ=k:tȔ.],]cW_}ey嗭y222L ѣ1޵dMgy衇0{1k.p8_2_~ֱ~zp8LJJea̒%K̦Mu]g*Vh=<ӗlaÆF&==FEEe{ѣGy\ʻtb6lOv_mϲmݺՄa 7۶ms郇8GbժUر<==tN:َ.mUf۾}u=,st^.5jlٲzl2%&&^xA{4i={jʕ:~^{Orz0' Ў;;d;ՙ}խ[7O[lב9`]v;TF+WnݺjӦufhhnM>]k֬QrrfϞ?\H݁ zyfXI͚5xSHH aÆ)33SkҥKϟ?>H`-[VFRxx$I&;Zc {*bΝӆ ԠAlذa R:u4sB( < }*,,L>$iڴi]||||ru]~~~z r79?fO<7j q'|RW\\\:á#GZъf}wp8$ٹ;rpG!W||5=eE2hڰaU\\}'o>}G`Z `|uk kժU.ԩSWjj1Zj,X]bo@qW`ٳG*SJ*eS&LPsNedd(<<\0`@m[%>`ݾPPX%C!@A"`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`جT(""BдiӬӧOG TŊ5iҤB-( < ZzzU'*<<\}ڷo˫W^z'ѣj޼V={v@10ƘDA{^zIAAAZznVIs=+Wj͚5ٖs8rkpHsq}h?ExsiÆ jРo߮Tկ_ߪ[nZ=ŝ[,c0=:s$ךOIIIEPkcO_~ի)???IRrrΜ9#әk;Fkqxv7 [\eaǫ\r\5i$Zkq VnP8E8h _^V•$-[VݻwפIݻw뭷R߾} +G٣H)SFJ{_]IIIׯ19IDAT-[2ehРA׿c[ps}hXvr/VnP8EPX6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3͊Uz衇r,ٳg wc)NTRRR@%&&^;bpHsq}gaw ?͛'IJOOeҮ]\pQ,֜9sp89sXC.eX":t^|B[)’*`e9rΟ?RVJk^wr@A!`|-XB111:tKPFFF! UzLC5l0%%%)33!\X"ӧ mvx K>wۇ#Xmڴw}Wbu VʕաC= ƌS=?*`%&&C:sΜ9#I.( 5X@A{s)7n2eʨUV.uQQQ锿;ȯbu0"""򼞃UR%3F+WԶm۲-[oW^vvb233];ѣGu֗\K.͛7xxҝYkX"Xhh^~e56lTN͜9ӦwU`$)))۫s.ǴiTvmh޽KNU?~uЙ3g'cǎWfƍkNzҢEr X?Z+^7G<F)Vk׮].2dy|-ߍ¥ɚ>^ ,{;J{U4|9rD*T?6m\rqi„ .eQQQZxڷo;w*##CኍՀrl9҅#XX,әklr+}9 ',\ wۇV^]/v)UZB@vֺuԱcG5h@UTў={e}'jѢ5_o Gp%mZ,Vjj>*UѣOtaUXQmڴQŊun_  W"`?^{ٳWUVѣy?9!`J>XoQqqqQF;ws_y?9!`J>X.B(8,\ wۇuRRR +*I&Zpau-RӦM G+/{~gu]w)))Iݻw?;vL-ѣlٲ"X\%I}bcc{n,""BԡC郻?p CM$c~w;vL!!!^C/p%mZVas/䄀+nbq;@qB f,lF f,lF f,lF f,lF f,lF f,lF f,lF f,lF f,EzWոqc)SFZr;}z@UXQ&M*^³;P*U1chʕڶmKݓO>>Qh*`95j[[lѭ*Iںuիk'O}$ Ĕ)S 7-NfddܹsJKKSffΟ?T-[VݻwפIݻw뭷R߾} s5qD-[V'OֺuvI@[nQ~r@q0n.p.\na6^5u#X`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`3< P94ֵ_q`ws{-QQߵElF f,lF f,lF"],(xPqf,lF fnҥKtZ?۶m+nbг>$vڅ-P}$c| pw,I򊂃UZ5M:øyغuVmڴIݺu5bĈl:l.'S{עMcumb/yFiMGGG+:: "`6E{*x[SL)Xy`O-}VQlnwۇ5X}RRR$I?f̘]r@qG7o_~Eiii ULLFG7VQlnwۇ}?fo'uSv#`،`3X6#`،`3X6#`،`3X6#`،`3X6#`،`36a{wv-AB>vm6)BlF f,lF f,lƫrJk>*\9XwaF*xw`ww$!X6#`،`3X6#`،`3X6U9(p1] oٽ3kS6#`،`3X6#`IJKKӠA*##)I&iÆ ڹso߮kjɅ-H n1/xycqm$͞=[O?aÆi֬Y-Hb#Xǘ<ז8p@׷֭{*)){+XgΜ$Ze~~~DW_t:_w},^~g.]'N5}t۷)?%IG։'TzuI?QFr@qGҥK+((HSjj֮]3fêw:϶m۬y@U~}+,,Lgϖ$>}Z=zP``*VI&,W=rwϙ3G%;rc~\^^^.w*`rsu=( @ԩ:$﹌ӧ?~׏34lМ8q;vԯ_L0ZtD/LժU?c1O61Ƙ^zvڙdk.nϟo-W=rv12uYիWL2Śk]<<ܼ;cVjgKƍ縃NNN6K6ׯ&MdZlz.17B;wnu۴i4vm:99kVZ7ް_}USvmc s>E(I򊂃UZ5M:5۝+͛7U\9uYԎ;mLn*Iy#g,Æ SPPԩ3gZ՛5k.UPAR-W1~s,YD%$$hɒ%ܹ3s5XO=/yzz{ֳ.ӬmKԘKҴiӴg%$$h:t}IJNN֢E\Jk4keJKKSr"I5jsyW$IM6Ր!ChѢ|_JqAָ 8P*[F׫lٲix6]jոqcHڵk^z=g>:t``rurs`wܡ ̙3JJJRݺuuwXsX9233%>4Kn( T*U\ʲƼB 6Փ$ըQ٥<{V9c~ufΜ޽{6ym;ض\<7lϯΡCi& 8P>>>*[ 7ܹs| گ"!..$''cMʕ]`ȫ>Ǐ[w@L8`?D1sϙƍǏs}͛c.ܱ־}{;,X`-W=rۘ'&&UVϛLrJMm߾xxxXwk]^-WRc~iiiB 9{III1C 1+V4n=wu@k"""MFF%33343p@lMllYFF:t 5cǎƘ xM@@)_|?ꑳرcq5j^{eY<3&***Ǻl[̥Ɯi&s___knvwc;{v,lF f,%BDDB[{Yˌ1BSL$޽;_num]E_~EmڴT5uVs8r8]ػw̙ҧnMKŋmi!`XFF.5h@GQRR>3լYV9<7xC:u^e޽{kƌbȑ#ڿykG]zuuٚԩSQhhu})!!_jW}z'#IZf"##]٧O?ޚ^~5k&U\YU7n8C=TbE-X7SDDNz-_ܪ2eV*5ky9sW.խ[WWꢢ4qDnZNSuя?h_jѢN4h_|O{Ut:5rHkիWvUv픘k>cn:[!=JMMtw^xAaaa ֈ#\mݺ[?~<)7-Z0-!۷7:u2&-- 0tc̑#GL@@Yx1Ƙ5kibbb1|W&""¥>}c믿;w1Ƙݻwn|gcƎkʖ-kM/]Ԕ)SƜ>}s>׷}cc1?n1w1ܹs9EDD믍1,ZcL||)W9|1Ƙ-[jժ;v SOf͚Ym5j<3&==߿ԭ[DFF渮,s=&11ќ>}vmfȑ95%%8?Zev2ä'N͛#FX OOOSO4w^SF ot:͗_~zP8pƚZjRJ믿|ccٵk5'III1M˖-]ٳg-/=zc.ۥ>44lܸcLժU͊+r\VpR^\{iժ;vK=c~mc1QQQfV/bJ.m17eʔ1ϟ̙2@g1i۶m}=pq8?ʲWrƘ 2eʸYfYRR%p x4W',,̺ԩSzԭ[7ݻW$5le///8qBV*U\Vkӷ~ ,##C~5ⲌΟ?/I:xn\4h b׾}4m4լY3k:44ԥOY>Py{{[y6˖-k}΋eӧUZw*UtaK.k}V/kk$ @ƍӹs*,,Lk.%$$X?))) WŊg6cݍdGZTڵkӧl2I󮾰09UTI ,pi̙3zJ*sY6)))5K9)_;f.IVPrw+F߲޽޽{U|ykرc:wK} \y̙l@#`Xbb&MKt9͘1CU"##նm[ f={V'OCYuzg}iѣUzj5kHA1oooܹS[*T+Vhٲe$-ZH>>>&Moth͇~#G* @?zm@߿.]X__Wpp裏Zw)l#GK.T˖-#8ÇW=t]wt*22R3g׸t]ǏW޽t:UR%M:%T]ܯO/^X|󍂂tw롇RRgyFFR``}\ۻg'+%%e;SjRDDzM0WUJիWO;vT~\-Wa/&2~x޽[s)`~Ųm~N]YF1119۰ay+<(\\璾{+WNڱcMؾ[o%\E |LQ~uE U^ Ppf\`3X6#`،`3X6#`،`3X6#`،`?Sn#IENDB`biopython-1.63/Doc/images/plasmid_circular_nice.png0000644000175000017500000015644412250104543022061 0ustar tratra00000000000000PNG  IHDROOꥧ9/iCCPICC Profilexc``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ïPo pHYs 7˭ IDATx]xSW>-Z݇lp:a w2%oJmO9{nO8BE!@5z=:!@! B؎B GNFH!@lG!@#@lsL#$B w B@ 9!@;@! B  Bi!@v!@?v?4BB b;zB b;c!!@!@1 B؎B GNFH!@lG!@#@lsL#$B w B@ 9!@;@! B  Bi!@v!@?v?4BB b;zB b;c!!@!@1 B؎B GNFH!@lG!@#@lsL#$B w B@ 9!@;@! B  Bi!@v!@?v?4BB b;zB b;c!!@!@1 B؎B GNFH!@lG!@#@lsL#$B w B@ 9!@;@! B  Bi!@v!@?F?D!!x Ɇcol蟋蟉1G1urZBu9Rڽ Rh4񙡁Ę00@2y,#Y mve=WN"裙aTB+K32ZhYיXݩѨP(Ծ^QŽOº)y47a&sz1ߒa/j^mO|ux$',i_M! ԁ:P:u#pTaRb!~V,je8}X)f`O[tnWmܫlp3ӏق ISIWM!(3!O$$3[2<ߍ'LY((NyV"FYVZ=4(עJ׎"7rEhb; JU*#~l0;r]\1aQeN݊Imᦥ'6mV$Pb;@!Iӗ\'3}^aֺ/TbKOtp`$<87VjRFӣ iѠ{B@[HL)dO/2q]| ݚ8ͫ3o7Ř/)-M_z[9_|r{5C @lG!$ "_]m"@{;}U#cHz~FhdȺ6miZ=WbܣHPM }l?}DNgƤ'xeEv;Sm8+e?ڡ']lq7n{' } uflQ=BN&G@'S.6D>x%47Q6xԦId"iz \ڃbKJz*Lֹ1]lz9QoHCCR~19ӧd7۠?vDS=$L=T `TG{}\aTBBw}WPhgf&6ך©䓫ziP /mnp̳{ ʷmS UǓ&GEwAw_Y`8J$[|Fd\sPPsrefhg,Ll|w6'ɎXŏgE@%YOB`#nb"CuXܬrFMٵNvrBKsN)O^0/ `2ߋO'=HDy|WA\GF74]U QGٚ#aqS_PuAYLǩ{6a]֔.Zyy{?}PB ް/"!!np}Wn~ON}W|* Jhu}*X޲^Hqj1GhWA~\J+_1us8iT}4IdMqgw+[8kp`Ŋ-DG_ᶶT\{]rry[=GPUECߠƂ{.0‘aѤâhoWXߜo~x[?8sB 1E~!= 2{[74tnǬ#;:9^0y@l|ü ˝Cىq}v{ho/y8D B4xj^@{vH[fb2L9e^ۋyMo~'6Qef O6և6 GlӰ22Ӻ,k5o?ЮFߚ攝 /LSOG~DJX- p䧀R4h?xّcd~NU?_ Q߮8XC"vu4_Wg|pƨF@z.s)HG_Wð{n{[ P:b'r:7$SK}.NlϳvbΥ Dy~:̔HHÝ[£YB C(عx9UJJ~OA+ͶNT+NՒ&,$|a 0!7O>ݮWuwzrr֏7?e`+gj97p? 1>F \ U@aIƒWsԖz7_Xp&FfGuw22414P6^r,NC@3|fU+_ =8*!RwA}]vf9m daψtbIP8tC-}w7߾U{.L-QuGo \aLȦ.6"sC0M dˢ)"ӢϮ@9|c Pdֵ/R{nQyjٍ_@ 0v533@^/MtRSkcAMmyQ1xq\ Pسp8(V]Fdja-Z*=|xۅ傪JZq|3 }ڵkvUXjcn:=oͫt]-ؖʰkίp-=#[>cfa§/RTQvֵxU''٘;|?/Ƀi 95CxK͹'t|U()V!@lUQ`ӛ'] -\{~ A8fuKنquƍ˗/_v lWnƍW馦"M@HHxtpRVZlͮ.WĄ敻(85]p>&/Q3MĞlb%D/dC}rG7tc4ː u\U@_=Vp&ѣs]t ⻚5kW5 4^?4t_~͛m~pvvshcvxlГjYD:)C3+KIc_#EQs5fꕠ;k:άcݾ [Wsbz}3 $L1_ @_?gΜ9Es8ׯ^ .@Uj)!@loPFCK$;.mLxOɡC ~j;wW/q8z,8#O> y҄]{Vm؟j+tXV.= MDX;4Ӯ^lwɮ]–K&MX ChWFolh?V'htO<-Z)ArȐ!Du]FYr%ܧm߾nի׶y-*QJGf9 qe]XA]w_sn(pfu@Ι((wGN爀ônhIi9ɇDo0n׮N޽7qD^>NM`Աuj>X@96f@-S ^4֠@.݋O9 G0^RfwժUCjT6v)OTPٻN\rԞk80`@bp\pp*{B-ʃ7MY6nh 5 9׬Y<SʓsiGZ)TT=_P>|;/X`ԩǏg) +8쵸]Uo|?݄~)ٳ'޽{(׵UPrC3fmڴ {qWj\h :뻃#HחZ;uL9]lTH,={ݻd8Q[ O!} O  4ؽW믿©ܹs)azd*q g-0=Z:vdǎC?5А3b *ܲeˠA@uժU7o,IztglXq)N]⯽w7cث kݻ7B@Cfuԉ6sB[^} ;rWj 9r$6@F DȞSG[ξY6pJ{2Cɇ̘} -]tΝí]~G3OU҉t_,ۺѿM\I8v@IO@@mgGMPm"fpoڂiآ=~o /W"vy>ίE+T B!nk5 BK\XIm^-۩FGv5~f&eIձއ2f"[` y\XMH2laÆE1I7"+A"Q[O;z(vr8{gfVzu J!p!|\{TZ DСC?G{\`t%,wO ! k.I ~߰alCD6mF?V;D̅PsxnpN $\9b*1t +#y}Zp>i]!|z.Aeڞ?86l -$:\m"ׯ؟+TJ۩_a(\\>}w\ ~s[p!t=Ca*ZwWӹqob$)RdհT(ʍcƌQَszYMNT`)?Ky>bu"Xo  \SL0(}+!S樰& $RΫNȝM_?9&d7h6ӦM Dkbo]\\ &dݐsΜ9k*).޽ aN_6ySX V281cl <) A6668xgxjףGѣGÑ,uj4Ye80u20hB+DуN*o0EѠU2{ZK_V<f2CK6 8 l>*1<9=;!%.{?(:tivZ6!s]נˎ_f5 UIEN= W73Szj̫0 ӯ_Ϋ?wxʸ )dj{̡3vћkƪxY=^D^J@\rnK^27h.S_TFɯnR;Z@JX}AmuDD ##cΜ9/^M^Ǣ2C}C@]fvJ;&Mw.EḒ>_!73繤GdAgcV@ƍ`~^J8/=K3Q.]d &)_Dz$Xqb"!SxHJ/W;ϒn jŋGd(tW`'v ?0利E3 {x`6&uH1?6LWye{6j1{SDO)% uE% \ Dkyaz{+͗B~*Be7k8NbMPSQvxDx`vBVoEUt 8~_L<.C;`YX`i 28`W*#O=˱Ç#8vx.% f$ô4csu`Mɽ+9'8 >1سC|ԇvW5 fg?V/LR@ށ3K8dIxuLD-@M6 `_^rUM聆Q6#7Z" 0vZo21a3TY/VUSهU(7gr T@F ]wtqBl))5mJMv6#AT ipGp~h8Jnfzu b"9QXP~ cgGrpDxKnjd?OQ&UYʜeY/6mNj$|>͛^^^kNOO SNaNu6TL9nfdP3iiʼn픆N @e=t{޾\=!yϷfݗWAL3_j,?~y9Ѳ@ :4 FϞ=(""bرǏ:Y^ [t)Bybgfl>OGSknʕ+`;TViبBGlrA;8mMk^Ƿ۴iO2Q2sm۶i4Azagg7{l+;v:tHLIXBuhWl@VdLFNXOڵChi 9{oML>;7{/9KQ6B`aw\2ky6 שSƬt6[$O'Lc`333I 8LA(uZr2TPS樔I(7VBl77B~jvc- x+OL* S3['3%CJ2'j}(~vQ4ᑣimOs38!SLNt6񽝹I}  u0JDz16s06ud͘1#&&` yFr041RAvx969{ 4 rY.<'反9ۺ_|zק:uQ.<9\%2,www_)SˆX P:.]QK ؘg)(6u9Y>D'%)Okt//$ɔ)}ʇSzwp\"qh/ܟ4v|АI J=WT2Nx Ӻ#F@'xP|}EFtrr4CK3!e)rN9tԗ/_ ,xKuwQ r6ƈ ]`^ʷP### Ex3((Y׮] 왇@MOGsSǦ(yVvOi'A?HISi𫅩՞k"C jg? Q09ޮE=ɱ+WܠAP3HيS %uk֬znmn7 sɚkj4ܴ;o.x:/RVmC3777(jB9H Dz ^N&<.O+9 d#S5],aÆ7ܥWgwo_t[T1uZ?E9siӦ;:͛7Ս;v޼y~-^[^֞^QOrDsw-0+>n8pXxx8ԏa]y:ˇBhcSݸq`cPQ*Cb!Ք(=b;9ҁl^Y\"ALۺ;j#C5NM4m.9p/V+cytȑsjՠf 'a9ݻv<~ggg݋/Pj$<~Kq_sPK{3K,絭.vE7RmG@lR@ZYJ+cۮݥ+VN|JHmQF"9sZe|j%.\,! `:lpeQZW^b֦ uf6?~!Z|5hgZ {i76UV-Ŷ~-Ry|xCS<I,b>*X>}Z߿D0ex]c"S2Tq-OGcCY,E%x .fG߇,GB@uƎC ,I֮]/Bʗ\T/ %Q2gBT_ܟʕ+.GbP'Yx1Y"JntQ٫W/3;S^-b:Op70uD|pBj#p|Qï18^RB@i=vQB`.P~P-3I29ӦMߞ|@fx[nR3y"ePZ!552[tO*"C[<{aq|itqVqzYNm /+QTyP#zo\ByCX~AYI]~'8#EvftzMJ15l.+"J qlàzWgx6f:@%0Y<&(qp+ RyUa!jm g“ xieݺuN{֭MulͨNmcYՑ p'6~x~t%oXD !α HNuR)RQ7&δ{NH2=, 걭wYLr4˳' #wAB+&%#M6 p(c9vo dz6舕 |!V( .㐘4ItC *̀+ SE|%sy΂"]@ޢai:={x,YW{ Q*%) uRŅ$HBPxS[h.d:udY#H#Ol' j8,UO4 5kOc{ Opp8'<>|v˗` j8$-h$N %TC VXaɫP5P3~ w,4qσ+indaO+v|ܸqCKF5 D@1 oX!-8 vHc Ѫ#ԀЮ_ūu\;N⑧'  6&=A;Rʝ;w"v(MuE. Cuxgx76SG؆Kr##wbj*!$ 3o 3M\U@9V1. ߜfdd*W e>}Cl<4g̘֭[FA9sLtDIG"Lsn|Z.X!$LȎ#JG ObU]6KV'ռEЉ1T'MMMA`.]BEm40ql2DT'g:Sqz+€lj{w!r<1:Qv31I&]i+՛~b3<1!%AV͛0x( GQyx|rҌHHnضc]-q™#o $ǧH*"(`8x왴]`K\Q| IDATJjJPZ:O.96%0>O[s}ŧ$,YÉ-qh5IE^̙C"tUmw E [&_?' `~e%(wqG)'LV9!7Zyg7bRޢakQZWb~ ZrS˶2kKY.Q.]8Zj)v~ٗE*ȀZU4kpw]xQ El%M=!@9ժUs_Ts &ŋr)T.cLRhRG( &\,M{8I7˸?W/ϟ9YU{&Q999IJF*=533CWP$mয়t7X*AxՋЁrR)B@(8."|*lZT%gd~NGM&֬0#`nvRÁ:%ѩO_n$odRJTֱÆq_zӇ%c+pxS$!v>>>ҥDT-oӶ׏x[N=umD&]ά=z%*65C Dnݺ-ZPHWy-+׈^ C^TTeb\u -]:y;޾5m8v-Fln:Yo MӡCX_G@ЭWO.ejl(qjbjq*uz^?-0bŔ1ߝIf~1a9S(!0">6_J2xNd(b%R K_n¤F,1kEajըQn_-[xAA8PK9tE~oeub!]E}A+%QC/]rPcV3iݱs[:qzWExTH B@`8;qD  T{lۘc-YOD'S?n\ڙ3Wd|lt׮}naڨ2Xo=v`hh6/3MYlXSW (Faz675cӕO|ތ=zyqݻraC\^T( $ZErb ].S!$A]fE9fȞY!#hƀLv KpoWv Nٴd /W=8&[CWW; sHQ Ckv+LӘǦᘚy8)Lّ%vv0ӽu!ݱErbBZJJm‘Mw=pD~hV 8"P"!–!qCѣB@uzӻ/^ #4JGM}c;+Iȑ/^0lڰS)Zef:_fR"?::ט=y O|劑d͚ݼVXPaڎڂm8Tp*_ zfEg2ΕN۱ĥ̀yl^4rz67j#li& 71V_.P   n.C3;s^VbD\D?N 11v7QQHXXX-28VV7oGԪe\/nPwf& *l6^p*uU,OTy8k8V#Չ co6kd}cKwdl׸))ƌp|AeO:UV-LO  8 @U]?"AYïKFl'$-K9p8ŴeKEDCkN'N֭>&MǍKW~PΝXXHR.a<իWGg SD _-66b}Z8NvI8@KVyRf$ae ߉3bWaك ;v찶~8fP#!@ԌҥKlw~a OInnnrZxZUuwPcZXU!b;18z,%Gl5Iz'N$.?~ݺSvrq+7obۧʴEEE!j]0 ^~εVP\< ƒi^=+~XcSG}"5jf-G'Efsnp-vę^_ij bx3yAA/%Fg5k+Y2[6.gYƪ$ҕ,;(u7KWխtܛ&r쬿s6f}NmܸBN!xfR!@hPBT%J[JMWnIZ3"z.l'yW^2.n _1cZ>cZÇ۷/N$E Ö˗Y "sBjnPWDxhr+9s$3ǎ=VE$@~"0uԘ]veo %{YyRpbWMq2~%r̠C¦dgΝ総1\4jӧׯʕ+UN0alHnݚGWAHtd@]aevkχS>\FĦMPѣGufVJ4ODFF*Uӧۻt璹9q(n\VY ?PöݻwϒG>0ACq?|ٳկo0$}vFWp]_r,ҫӜo,ح[{- WbCsss<9@!>:t%KP%%<)'!:4ggn,%ciǏ!_?.v[nAc…w H1c%c¤%K";O.XvŊ˱HWIެ]C7.YDbט{b"MI!G`ڴi?aq-x0:w;lk?~ʢPK^5Xʕ+PЀ^zX0v`Όӎ]!,,_ZH3bbGThⲷas@T+_'O0ut۷ggX\\z54P!&9PF8z݃i64驇42je3kYF5]ʼ2vm=D+Cl>xZBL‘ؗ/_ecK(!@h0 )aL 2%1Rť7OؽkV66 ڴ/_FlT mr_|}Æ 7oތh`DMMn 5a/mg[lɲ2-[׬|'*e3gE^ /~!.YJebʤ`cru&rUV6BLLcT 4@ΝAxh/"9=(>%1=2Ng{!!_Jw@%/Y:aZ+[:aDاw޿?qN7ǚ^"O]|QF:u8> 8n-z܋ׯc ȞE{{ۙ35Rä99;$Mu8ͭZr$Ggw+C. .6/N ,}@J[zŜ)hp]8xru}XFמ޿{͚VI sK˨P;c##7~`IU*U| q#p! 3!C@YSn ;e-A'x,zp}[a#G30jqK>Ga\z,}K L`l )\  C \e| ,)w?݆)|3oI7/N)9SlXK >!D=zyNHb;U'`2|7BBٲWaecd$kbzff[={6^/H{:,qUFY>$d/E)!P n 4DYf<>|]FÈYꕎE_f_UGDXH J =bI8 P °/$D8A?BY۵ki'k5[042jЦu[nWQRrJ< KX%avY&= n׮Mmy "|p`83mdzxi:  3u¼tqE=!!!pbҠfCoWE^),"[$=BqpRqB L݉+M8?[$IԵkWVpPf)`>UlL"ҴCByrT #{o/zt~-yZ9-Fr`ng`m۶Իw$N!Rؾ};|†&-[d)[Gndwg}ٓ'6mV5Pv>ըNmtga%-5\8h 58ORUFHV`+}=qūp͛ "m޸_ZMg7g,pg칶m:8crCl'Lab "¢/6v7$g; Nwas>YB""ڬ[W>$dcC{M3&-"RMVڋqs5]̈́|{>V"a&t"~U !#pU+*bhƒ@Գqw[?tyAVYw^Y6x}5%p VdcGi)Y2kG@I`3:ö-'''{{ƻ( 23%5CȀe[.իx- b,8z@YC>|ST!ΌeUVr/JQA#U+I3~I 8EPWJyyB6b$Hmmmnq'ODyzz7N}$%d>0Ò Sw2>NIN܈b)ѥ C=*z.L(t򇸠+yiX >U{)"Vpn#;3d('7[۶X?wOA$'nA 00(7sXXc!"@$` DN7*K6?y1?~|r >iɩף 9AR.NtR@9SRDǏG T  p!?B:ubw^<9S'ƋgU2!Şe_0 xIZrcn GhՑn?f9(}H측c AQ^ $hN¸R">~n rpRDYELIr131LuJ}d㚘oenjOnRK?+D'SXYfrօelenU?=CXaE7b74kIS#GMVf\diPهؒun)N !Hht? AQ%xy2j4yڃFzNE%Y:Zہ٧?M7lVK:L#n1u&OOy[sZNZ*N^>6m*EОz-Vg"f˲g5j{ eVEc1W)2]XpBL 3b&q"Nq0ˀN% .\?®( ?8 ch(e]]{նszmSvoS{}5g)=nv^Y"]YhL{ۇnhӚ)o>YZ7~FrlNA}6lܹsNJ, eNDQ9~ Z0D( 1\1,r5/[z>‡ *:e&DsP[[x1(q9$+w T0UW萂ؙW4aa,NcH1lCvi7]tdtZk5بMm]\%K=HXwd qP{ XlY| awy[DĞfB܈+$butpaa!րX'BAKPfB(R 8܃hGFqv̙#G \n݀JH2 N.T-<8#?8STȤOA~;~{ut_ӉI>Pm r{nm&U VhרBj>M,r볖ӹJBl{IW]DPx=PSZ/0^ '>+YluᤦYk׌KDsod{lGw$7ASfB ؐhJ%X"P(JR ޜ'Mb IJ! ', )|l }-"^%kn^Ls[ugu(^ٻ7ۖuj+ת[P 63T<Dm] ?_1*emַ%:$J IDAT&'HK;0am.*eڼ9¦#x5`> qcm :BR3_$'%M [1AE Q0bwV4;6I7b[rġuQ {NSjj¯G=`X8F>O\gUsj> TehGAҥxa`eg/#D$f.0ՈfDXS',0p/y0tNr B@/PW}H FPzd].{5'pՓ5Uc!D0q ?>c}#cSML--ď V c*& JPUVx#q0˾w–^,u7Q{J[({Oˍ7 'B~\ (*""{SVҽ6`m\.4Iw>{ŰYDT<Wi*8 L/ p` aҒ*ڥT)p1KR!߂8=Ө{Tʌk }q77J%B Z ޴s̱6 g\(p)­'@i3^N6 )^Sׯ_?]yb>YW&H4M}2IŲFU+@΀^M"@g҃Y*tݻڶת^)%%H鯦ScC5G%0X-%< @WУ[$x QLF°%<ʑ eR d7l6lWzb20f@ ɈStMFWpA@rϩ,"fΝ! Ȇ5x*rsO0w-@r2L fi(/~$HD|]Ag̘kϋltz۶'\QʂfebA؎㶃 i8T dqį)ND CO?$8B~?'xbw'/ȩD@.L /Զ>iO$矔d+E MV7\pHJe;$e3u Pp7H6y(~#7#  9 2u~x荚$VN=V;.-MiiiO>dιCȼez,a]'."8z͌@@`4מV#\~ MS7%`Mûΐhlڰ6H`cY;/j,-D<Yuv9wsw B{Ջe_T̂@H2U}*Axœ&R)&+ǴOλwߍtw!;ؚ&X-v$~˫î@0]Ky&Ro@t@Tg{1!jר7nᵈuh92"K0Gzٲe>vi@e=) d9 /3 ++5Sh䙛7oMB8Wyf1d[p'q1 z^7Ӹ}E"oPHnάbѝY/)ME^{b) H\peM;^/U+lα7^Cܟ-*זvHh@Q0T,=sٶ.@#]H,5zM6󄬴r.L*Paj.?ЎP+8Y^{ +Y@ <;7///eBhѺ15-9XeQiqVbCVgo9&IEᝃoāDW0Ե?u6Յ ߔg`m%[M|鯕þMk`|lWݠusxUte]ۈfճgOrpq& oZA%ڜv1qT⤉U*QLE7 (ByQ[e*ň2T7iT Aw y_M*j pH&&Df?>[SSD?65 A!<<yɠͤd- NB~4ct|'c24K CډF"\q{;x#kμZ}bhZ0Ӧ޼0!@ r9B۷o +7mԫv>,n:h(ۮ/9YtqT) ewͮSIyv꼶b1QG%)6,Wv$!в@7mCzp[C~砧cxqR041% /#c;IّqE]sk~-&ٖ)++ ڞcB Zݮ]X>g:d<|c^RW(LR 2B(ޗ/>vET&Χ*Kmxx֭^uGnɒ%vgsVG_Xs_j9"C2D=D}aap[#[K9ˌ0:Jk4z Q3 f@ A /|p|Z~ B.=z8z(!HCuY,YPX}Ĥ5g]iˆ~-$=;9 +D0%,3Π@*Dx!VI)g9Bɨ7֜0TW z7sLl"$EEQ}aHb .|NNgBڐSd'+WkNצGegg|s :B-!9*,maUT$!!.!@M@Z8 8oNP`6'1'#˼o$:{[vkC<1Qiڹf%DZ=|j1E 2Woс|@HB5OPuXe1'n9 Tn?y0v=`') 9J7 7|b}:j?f;jr: Jb"_ "oͶ0V O瞊Omƺ 0'gT ,)Fbf޷uAn >,w2ٳ)))+҂vDXM)eN7/8 B;Kmf$m廍'bג0QToQTQdnQFFɓ'4wlf<6 ۹~r& F@_ys[G/1'Hz"{̡Idvz<1b'6>}mΠo g-sss]j@@!Pa"2OI m1nVnk47x:AP@{f2vclv4D,GFZڛ3!*PZ*n2-[pov"vSe 0'S!ǔ׆kָkى11kb;_[z!@"qb;[@;[ӻEw1hFϜ9C{FWB, |gH9e;s 7eo(9_sU%@ <<\*?rc bcU$BU\\^}e;@Dl'{(66ߗOQvNחCiC^.{0RW...{_T #gSp.:W&ۈ @ "@l|e;KRf)--%I&;!@ 111xRLӫ_6gnl6$$uuuF144FJV7m'lwXvy*N?⧭m_َ$!HN/+t _A)b;lgܚ+245!'A؎Z%ۙp';F$d;k$lp2!@xLUWWT/O`2Av {IZ `BhS*Id;[PŬ~`;R2JO!V>5$_܈ -dv D<~-ٝ .I2ioT*E-S`;JxOUlG{;'PeB,"/WL^/H|whd!@0p"HK;;j;l{|t _@O* #1%1ب=b;wi`!`E Es~vncq`8!k!S9]d;_HR;!QKl"PE!@Ot^oR[[G*C@K!V-ջl'$3<<_֒Iܱm_+Wh0!M`RpYb;62RqJml0PXօ`۶m, {Dyt|8Y;{Sj |\ S*>>N_]be إqñN}G ZS N?3TР"TޯMƠ6Ym{1g"!фO+cSH`JSNDNWgrYMYɲwT?@YMmo!1!*ҥKۓc q3L*9\"$B*++m/6`CoNқD.I꒐ zJN~!`wv܉:>B!u:w|a7Ζrwa'gݽ۴陒#)-!z Gϥٳg7\DN  64`'}Ğ +;T,;cN77X[ީc3u2Lh̉$,֏30S`bjtL+ub E-fֽ9/hSd/va'w0L&{bbxԿn:}:C-޽{hjW 2Ks9ބڜeQ=,UZN:tDxhPyv$Joh3,>v%ۦtKL(K!b;s3И EjGl!xA7  /9i{KHybsU1-)c`[XNvK!@o祩ЈL G.=Yfe$WxY̘ҝgU,s 15GUG&'wKa kkt@7طoI2l' "!5pXo$juڪe>䗻FSM.R! I&nDAaclCC*mdH(lLcpj8OSUi9^ZuxۑڼJ҅T)Iݛٳ Vm8A B&ۯ_?!54kV_N$>]M}Pjd挾_0Eƌѽa$MFS'rscl21 %LiwE?.??ŇN7 0={_>v9ڿQ|dQi^') #læ-[@$8鎴iYA)[N{PLIo<َ %).}ԑ.*&;.>t E ,fޗX9 pa3zC4d(mmx;T.]j$eLsWxsc&xvK#Ф NٍaP;2˴qq]{3t@h4}05LB?9nSٵ玕OǶRˮ=]R\)!"͸ a|cY%7:tO?M#'@`ǎOv 9> e;Lxpdjc?OozOMՖ.-\}Sz'4ұ1x)a3~A8pڻ`ʹs 2 ͛ /e; Ep xvn=5S +BIT$1K k+B2Ç[1!@x˗/fЗbmдYN7]R^bwRPֲgW_}]T صkWMt|pԨaq,Ƕ>YnZ,&H'U՚b$h!B |; 9(S^Ji@r{޸qoF"G?;vlO (۹: Ѝ:it,;3f 6!@<";w96[ISv 7Sl3~Vr4 B`)+++<<ܧF  en]q]CS.eY!֭#pnۙ$ȥ ԂꎥX,ݶfw!@p@`ڵ&MPa!aWN hت&OLlG?B2D>}x.p.J)2-U ,QfN0a˖-PM@ @/'Nd/Aۅ%&AZlիW/U 6#.L¥&aa;SiZ._~?H!@AY~`a;M\;@P2ꫯ{Vo!n!@x^ꂂPHbh[^w\m=˅l׮]ZZچ Xb!@ʕ+wZhue5Lc{@4}B{kp/] >JL[;*ۭZ 7Xb!@pCয়~1bDXXT Enݙ5l;vLJJ"L!ꫯzO!<4{QݥE1AUP} C' Bsر+ॵVHX( u/OիWV{ B|p* tG~V+1TG 컄fG-H#d 9*W~셙7xw͂ | #'ODB_ߍ'N)E"wV !ܼysaa;=R]B "pB{_|𤛯voE'z ̂j8O:_+kh! Á*E˪=뚽!n'v! 7̫UT޶s֬Y}.2 _5)1~԰^z29g'?f2}ȸoNߘؖa"&1~NbۨT镆6tDphz`(b_~^3!@pCફ>|xs|ʤ4GK' z ʚeܟc W:f|)qi\aovΜ9VTUy^(k^x'N<1Jt #k:EDD\m*(SU,b{3`}&Mp'P\!´̬Iݘ֜/@ѣ:uf߾}-wĎ}ѳ'Uuwaxao' Gs;۟>}]s!@?k˗ڻim!5:F"bt/Lʠ̭]ZV/@vկ_?mG ѹï-3t봬_QwAR 1水X;wM3ƍlٲfi_jVgK|e@4BS,Yr]wY.Μ 0";]C\SU3gznJbw_u?3fX’pߟ={ؽVUnIDCGeMTiz}Vj9Ye 5' U  82 McBK7?sT!gL ޷lmL Ÿ***a*~iϞ=#x|b"c|%H-9T I`<i;3~xPҤW7xIs5dݠH(B!@pF[;ﴶp4c '~ (pDֽ\{w$n͏v};n2eE D2b@_ʙw{ceYM31LLgbNqanRZFsY{mʚh, mgϞoٶL6'9V50:=>fycN~VjkkMHl>˭[NB R n;F7_:/X*zYF|䨘`ygq0X9rkPyvkLzB.?$^T EnvR٨o`+C<԰4kܹ3=t 6@(7)T_[p^۾jH f} &muc3I>SwPق㡮 B=HSMLdn]0!@c1۽KO=upCa ?C7nܻwڵk 3翺p E*k)}N?3Ewz=9!jhu444>}؝|y xUG.e‚.gl`ZrC\~111| +;⅓=" 4{wcCi·uxH mkif Bs@ r;ivɰ &0]-j,X <&v-*렴[p7|oX:pOA'iUɨyOab(Wu")L.{!<.Y+8ў 쏝+_0y0&5.BNRT 0TՁz퉵M`?_@n8+T,c].# WxOFU!@,}NGVこNKP,1TfDA?+aoVH aI= qf!J;QzI DG&!@x~8; ^3n_nw7~yog]lYZV! 24_N3^t 2Fx)BAHæ oeL)g.m%?f;}g_|wښm5HBÿ (SS!"`cO?4K;jCXQz s惇e? ^C(@$BJJJ.]<_~d# j9zx#:?$@ 6*E?Pvrfҗ{j*pƒq&*4yѹ &NLa=i$n?x,zTAM8yzA綁Fr֩Ymv fӇQSٰq%,N($ME*C~ +-[_Lf#3& 07V {38d2jO,(J'8BW B@LB(nhИv401MqRؠGl%w,HQ\[[g2|y".ڧ!kѝ=~0g Zn

eee͍?N|&(~$ Ji\@`!=z@0Q1N:~Y3]PF&e(7e9 vN%~ TUUo~gmdi5}16)JG[!@0ӦMKKK{ܟ㘇v7mM?so I& iY:u_pzl B]ʳuyX xoj | lw"ܮeIҜA FdT鷵S*H|%:~^Tv ؀XbƺUՉS:׬# ui;9\^|E^# Љ%Wv̒GxOyoO޵kWFFƲeyT*ΫK_gtݎAR0rga^uF-ҥK;wt`|=Ăd̻^Ы)6!)}ǎ[PP0y={~W7UNGS31)^zC>P'Bjjj8{؝D̕Ø (:u*(S6nM zo1nkyj>zt/4h۶7>B^ ֘x ?>ܵk5kX#]م̺>\J$n7@{ rIW[i cW^-vཇϙ3wg B8p%Kq!6ovKG!T1c۷OTbhF=w\\ܹ3NZYxjAJ{SG1"{!WDp)=qBzoj |Pmݶ`TOo߾0KQ(8IA̠h!lŋ/lݺck}xG@WzUe 6l/m߼yJ[oտxx$!OB ݩSP d#x~06zDw3+ ѥ8>^;f:InvПqkZ}B:TVV>eŊ0|7.\]TT0ض̘1|:ob24?l(W3E߷$>= !BIƍ/B Ϝ1bpBM7o[FURR{ѫ顮J`[X{/_"7wŋy k1v\"o3g p`ˎϜk:{g V*Ǐ 9YMPuH7in&+&2 wDC,ŐđYN #6m@os B p(--ҥ?0dߙwb/yeAi2b;'0+~sʻG~ 2* l vjIH”ޕ@tisAn:P-@' B>}zxx8,,0)?M~O9SmcC.,iݻCH *0ku˽: d2Ѕ^u * !|:"g@6o޼YY]?S=!v( sȍڟ:]"Mȩ=*i=wG:=c42)̀3_4F,t°[?#8$5C pYa\r0 (QnuȻdRwK}߲N"پ%loJMļpzϟE`|5LJ,ӧ#3j?_DHvq _39s&rN |5KA d֓tЂ_4qCnKx!:I^Jlr3g萃*"l2ӫyg&#N+B 9 8Ӽ;vO~g~ڥVBiŮB€?i3i>$|'6 ։6 ISgϞ:Y1Ӛo˥3TvSP:Z7Cڃ\R&&y{ۦ믿@}\dd D_&!:@xmC:ﳳ6ggh`&^WYc&]5 19I5j.RB\59 !f\>Tof.C<^FBDe!(| v&muá7WaQ}n Yl/4GT{4iM5Ya >"!O |F0 2+냰x!o,R;" 7=l{cB 8kC;`S "3յ r'⸡ʃ\wo,(@W&0'XnFYhy͜9q؈)J!CDEX%t;V-V^u$(7iib×o+hZDzj.zdbńAꆰ4¹.;9r18c=8o)rcNLTWj:Ick_<Pc,`M O8 `ssG\MqX:333(( bY>`DZg߲e˦M5AjE k-kK|X&\F=`ڷ V"HٓǬ~E`: J;e\=Rfꓦ?"'N@J0lQ222I0`i׮:KyDKaojJUaM}Ĉ*CC!nf` qö6^,&Z'y9^pe4zct%CeT7J>nKs y n̼9G 9ivӕyd4Tؤ??{ρhG"v0]vĚ?7)}nW-Qt BLB![XmǍ״,v{O=TQQ˛^u̇~vuxtz~RGiF<>0Q~-,%-T qIZ.#3oOT7b/{;Do2dɓ'ыbL9dC b0)L6sNRܣ}QLB7~v1M[o}!dBGȁt30l ~J]nm X?9+s+0mAm_r{f) 4 1_c=V[[=Rٱc yY,'re.i.qcB=MxxHIߧK+aJBy7.nM'UVVBoBځMq;bˈhD:urpγ z7׻zզ<sAF{^!r󳙍bϯ rp8 [^2]Tk w 6vfasNDQ7t~wuСC 5FB3)'eRV"L%L1Ak Ay|@`Z]B{J-pW7h!ؤ%0y/Lz;&\a,` 7de9ۚ6@=q_CT@(-^t{NA-z Ob.Cg/CȂ[SÃ2B$4~>mn喺:P`i7BpzӦMsgO>~]]s$7~FmWBDB@@`קU/af(fݛnpiqft*`=z@ sW .L9;]C0lOQtۛ-d|#I}x/js9y > L5u*]m}_JR,DFAsM$\III=THĐjxR -yTxhWJf*CQЎ&*GCmCfcDEE2yƌmVU]=q_~P)?Xա ph!1|O̳{;LSpbddbԇq$Ӑ#O~û;!dIxޞ={L%O?yjs(,cFjdrJH 㲞U1Ǎؾ˒?NA럒.䀴2H?5 /Cގ`|{._3ocCf4sY g[hُr\٭ފ`mK\DŽM kIm}4"OKoV$52-W\kT5:2wC_ - ȁjT*3^2~˟OwuY`t7#I=@m<й)',AExy.G# Ϝ"ˑAvB+눵 7gAk;t&k׮2,FLHI ި P=?d-W{$D@椨chW?yLp<߄d9Aِ˔bdm.ܝNWۮc7"SnAxh& τ.aHNZpq5#sg&ĽP嵍BQ Ko}`;? TP\[g 4^)`uVV Ucɒ%\x@`+WDL>GZ [; B@g]kj½L׹#|]ݺkJĂ_`zj*(s% @tXnD_ń \$ ߟ5;?Hb@J SF*eH ?9^^o] X`0(HL ψ( [zEURYs$bܔ#BrĿ#vuW]uKM8uhduNuDU8n;S6mL5d{litQWdzvs MYM5fA汙L&}1s-S7sxʐ[l?bЅ TFNkxÝhiMPᮀSJ[=6/朧 }-V"J)eAl D&W;8uCHuu5< `?[΢:%u XS ƋG $^=!txQ#;M纞"3/a@c?N,c5\Mk M5D [oF)`Rdeo쮝̱[-S^gv:|shqI2%K'ix]C0:< ARkYEKL!WSs,@i}Fw^N*P ٶȼu|xi_._/޽杈.` iĆae@Ri o"Ж%+ {q8hj*C2$go s*]ѣGWZK {`sbi) gTMmkxu& !Wx:^٢?Y17Vw`cLݖ%v;wns. E~P؍E GEà ]e?f-iJk:U981?lϚ51bFpJW` r4 %D3g΄tBWg1jZϛb K0f.nB?%9)FZ35 ߧB8NxL|& F}q'H';0w25 %dbswdH2a ȅ8`[I}6 ,^NyݿgJן87DLK9KJJG#<60=RI l,RĶ y}}g@1\lY {b˯VAvؾ#+Tю-b sC-ppp^L h)7SwAҴ P!~Yb`M[nzkݲe 2X%MLTlx[zwavQB]Um);hi5 sl"'#2vBc رc7{Gwٴ g~)`9t rDc|yKK([:0Q]1N 'ӧC;h#+tі6+#/ggb$Quv@{;o@ Б|AcqiǷLsL# ,ynY`m x8;;,_<>>)j)H zGl~ P1\ uH=R! w85c)a*~y*ڡCK>8!~ͼy{CBh"ěC5ctJrP:6qtl ǴQȹ Ǒ#Gxݺu* <ԶB T #6%]vE0\!c"gdz\ft[†ϲ=#XL~yŵΣc{WQA0vq xk֬w̰9𠫃>r W\ ̲(P9bw~0ʞn)-2=>ER"_ċG9x Lj!XööY:v`졑~(D)~)HɓcƌA%OS=z='6Zxpw EbL-pC$pc[ /0L(((HLLį??3wXYkx)#21k_ ,,İ`.'ՅI7_L0uCm=3.2{k02 ('{aN M35j 5M6X oAXn#Ɲ4߄~hIA=ioa?9w;<A=%DD`fp T}0Az!Ȉ-FC-<`PxB.ygl3 B$sFv(C-5G}rAWwA~zK_XD߸q#%9ξ"Q{I2cű$~p+W>`;Jm/z0`==+}<g*U*+b!wO4=vr-#$l %@ ]26g/vr2Cv!TUvڰaÁ H 5s9pZ ϐ"LL;2-^8 Ƕe*g)`N۶myyZs\EMz糗%*ƇRjF%HbC07R80G3lr6mƅ#I:nYN5]wJ;$1 ]K,6ZW^5!En8Y&YSIDATVOvdʝ''|*nFf"x),9*6뉫++}ChxK~BN2_zRxr5Ň]zt"`fk KǒD$'_{DO>H‚+pܔB!r, =̄ !r|u>m}gl-;DD(}UC]42.Ҹ`FR0j/-TwA5Ax5jxrNxZ9Pk:ƺ%p|xjA꺆" ɵnF \)Skq=9:h>H/sPU]B?CA8=H/͊ 8_ѡkb} 8z_;|q bg0yuخylg@XW_}w]jBdHPK~`S8K$A LGd7a1ݷy  UJ3u>tŌ9c8&gyHV*CJ :AC4zAOexGc3KzTpR&Cv^ 86Hm뫯ׯ &SZ갾<㩯{ލWJR|kr$$=VbC05<㜭Xvjjj?DB("yؒ&2 uBli7'|c:pml}Xz1Yo\<~nȃ"@@" :XXPS5;[ʢl1kf]Xk58+X0C9*JJ^J@J;!@B޹I%&p}r]T>|wm0aHtu19%H9|+ XWPW+!777!Vj壃'].94(r(߮9g܍Vd{̙Jҥ_846; ҿ./(vA.]%E'W`S7ߔӚo:j7pq!+l;^Dpay8d8WZT5VX!wɐ!C"@lwmmdO^]]-_˗+[eπ@.h+WZTT/nM>=>@G\ht}_HSĤjDr2f̘ ڑ8s*{NӽD%jɺ]P; k/!P\\zPg_R26>]ƻ swB?ڵkՓ,y'^J/?#~' kX5&毼jYjgW}amn:0`54yA/gE?(m{?I]~N{`FAZ4AALghK8Q{4PAAffPhȆ_~Yi]%ҼNVl$Xk< l|e+ %NuPykLSTNfϙE[-9;644L6M ZzweJz|=\1zrQMEm>~{8p&8m[w?}]vXl!RSؙv;[gJk EhBG=fFW6u)\;j}nsɾ æw vޭ,FΦ=wBbN 459ylli2A:T}r+H7{lBP; %9gs߿Ґ;54P@նs 쥥䭺^Uky.vnhQP;OTF@-{ydۣ?m~Z@:m2i ul}nq T8%XY9SB:.ꙬóthL~((RIy 6tJ6\N7U;v98mg8rҹNeu'żp8'ۜYBm`C'hu'Hi{7{$IK$} 0sd=JM@gfpr@b˗C=OG̙:q+d'V@&8\&@ Nz a_2]|,y'g.@.`  !PQْt 1{7UowT΂@\ vq F@TTL`@znd6pmLk.|/dzB0'L}ϬA>kc1n.I*"a4Gh^$o:%%uMMh23HdJM`Gr8TpQѬrhe4>̞ji öp]8!k555N[yq7~q__7N˿>MڷbmgKW{&}wN0Wf!rnQs\`P'f͚~8cRkMby@3e昻o6ufp.йv\ж fnV*++O8ٳgΜ9gΜ7=O}nƮ3)Έjf+ЕMw830-vg]s;\$zŋoذ!k_L>w_hgW23Luͤ1掛|6G4.갹WГ镚$$pر~coݧf',,؇嚉1117y c.bvT&Tyyy/#<2xদ+W>~wG.- P5(non}m2a.pO"Y#dɒ^s5 |$KmJb\g 5CUWnű#Ŏ-W+ܶm[IIINNΔ)SF:/ z7 3;0ď\$]dOٳ -}2d֭rlSs rMPW#wjgA%ab&˰;wo3,\ƙΧ;;UO>P620È #@" |gIKKS]hQۮʷҧOisg2?Wu`Ls;~%N7 zd!0jԨP7VԓY__/=B/wHgsN}4\Z))5#B\ S@" 4mOC=o5{wF 5ӟpUƦǍ*kg? ԎI0%%%؇Hs9gK ,dfؽ?;{W[ggH؟K=H駟>s̲e:ϜU#xL1k[f8"I+,󊊊:6/-շ♔60jrx6!z2@ zꩊ*ʦM|I76씱̧ ~aY h۵eď@YYӧ$Sjk׮l%si]7rpզw3jMum$MWz z`Hhnn\wYYYۅ=g-t6~?ٲw}>!waLv{3g͚~.Y ~{lVBX 0ۅaq%pњa-]TAx]5"~>uٔ@'@OfϯcƎ{[&MjΕYL(Pfҳۧla _~ `/޺r@pK/(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@@;, P;(@x~%"qYIENDB`biopython-1.63/Doc/images/three_track_cl2a.png0000644000175000017500000077770112250104543020747 0ustar tratra00000000000000PNG  IHDRWr)iCCPICC Profilec``2ptqre``+) rwRR` ``\\yy 5F}Yd<^\PTQJjq2]^Rgd$e@좐 g ͗a_ ' v@t0l-bVep/,L(Q0200PpLOJU,.I-VK/*/J,IM ! A!ahiiI P<@X(v!ɥEePa>Œ9 KX Lz00OE2030ïPo\' pHYsgR IDATxw`eg64! * ]+']Ă~੧*N RJAB !6~fMTޯg3}y$Y8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h8F#h$&Lx饗 g}~طz+Xs4L[h1mڴ .d3f(++s~婧:z+zy]wϿ8u[oUZZzO2E;kX瞏>e˖B}}qqqvۍ7ިjժ_]\&.((x뭷?ީS?}iy޽{p ʿK,YfM||u]w 7Hut_]֧ERSԩSm6e]6qDJnǯlܸqw_ \xvvYmժիeafڵk=.;nΝSL)**֭'|2`!ġC.\|5j˖-_}Uaa#~阘uO q<1cƌ?>11#,ϝ;w۶m~wko>!<6lp)AeM^U[jզMkƍn7 ;qŊ|INNNVǮH ./˙Ҵ.guj*/Wۻ n̙3 ,طo_x͛I_ࠜnnΝO=T~~e]G\oOgY;^q{RZݹdux..)?~eӻtw.K.ݱcW_}w h4Ξ=wٹ\>/^n]'OܫW`S-ZWe J=y)8h ~V`0̞=ѣC 7nr~_9Oc.DܮThO|wUUU.111ݺu֭[Ν8o}Go&YN7eɒ%|͛oj92aX.YǏb eY;O.[d2 [>C_u.]ɓ'/]t֭SNݽ{wRJpj^veSNX,Gv*((XxӳW.]sȐ!=І -eߪ4i޽{U.WX7(nL!޽{_^{i~am=zfnφ;/7͓&M̼袋l6ٳgjǑ6ػw?~a5k?^wݾdEEEǏ_lY~ s=Çg[[l1cΝ;]ݾ}{FFyw&Q:֭[/]Կj-Q۝y;w)))W^H .OL3i]@pT^^-hy]v͜9m~R]ѣGggg_qk֬KF ]ܲes=aijjuýsYH//6\T/.Sj\6~ r}rqWM0aʕ=PKq9}o;vl[\.Ң ,xo͛=$(r[KxUY޽SN8.w}ʕ+oѣGƠ}<ݴi˦ m]H]5u@oꪤm۶նm1;;;,,@w̙=cƌo{vZ?~,u} Ijjjsss Կ!Daa  ԬYv)̝;wذa ԩӥ^輔'>p@-K֭ׯ_rAƾ+~|3}ݍⲎoM8lݺQ_?vbŊSN}衇Ν{m5O?c=y-[L&/n_4G7|sW(/_ 7رc=zxΝ{%\s5A,\a^xM6ާt|6qeee#FPBX,+Byo߾jtڇ~Xٳ;v=MEOst{_}˗/B >hذaaaa_~yСʿyyycg֭[#|eee K&/{™_-v'3F5 GUvGZpy:`)MrRm=4ߵ j9r%|?|uuMjvv^zi|||rr?38l0O w۳>}zniXZK7w ӋnA)?~Y^߅7ӧOttロo5Ji\NbеkWv?~<3uHB\ve;x`P嶖rG=~)N駟*ֺukݾvڜ?ΕIpywVU׻lօە ]_GS8wl+rŊ,wͥuCt:ݣ>:wܡC-մT8##cȑrW4:tUY:fddիt[>۾}zk[~.ycI4`'|[nYl{ꫯ9r;qtA9;uqFeǑrW\ٺu/.htzO/z^vmxxbҥn?R__Oi&//Oyy睲,?SLqyGW^y'No>|Is{n|ovPwr;qܹcƌ9{… Kera״<-uj*i]6Y5SN~O<#1!eF_Hnz.hxV;5󬝿zPKmQwn/NTϹ|AOJG_(=F5k֬;vt:5NEݻ[h_2//7ޯuՔ r۶mz? NA ,KP7yx[ nW*tw vđh2o-RPPPPPХKUV9!e>''G8"""X_yȲ2YVkbb%KLK/M4IeٜkL  ->|x'Mw[.] {ȭs W^=>]vܢE:v(pfo"""ov4v;SE _~ϺEZfffxxŗ_~gP&BeLJJ駟AzС;*_opcǎ-R"Ǧ m](]5G<;t0{lǻYYYݺusn/wގGwxҪU+K:ΑN6Ϳ~jjjJKKeYZUUU PK/4))I{Æ JJ~Ǒv}ԩJ%?^zϞ=$lK弎Vq$tIuرc-^eY>x`EE;7f]]ѣʿoY솻uӦMڵ7z|:x`̘1َ~ו Gw|Wf[n/N縷Ev믿v߽{M69^G]f͔Vwkjj~ǿӦMk\J&Q˹C=ÁVw-v'JK?|„ ʮH .'tr[ϫNc0nW n믟1cbvvvtttmmoG^@NjkױcGǩtodr \;&kٲe-.r8z<}}{՝^Gɍn-^ht;9zL6wLӭ[s^뒜윥>= 1ixxxv픈x[ nW*w A~On[Vﺺzm+7J&I11t AQ/VܷOʊ!ߙ~qsQ߿~xef!D Enڶm~o߾.UVVVDDDNNҥK/䴴aÆlZ?_TTdXz>od2?-ZY&''O6m׮]qqqرcvIiiiaaa{.//BlڴiȐ!m۶=p3g^{!CWVVL&/4++ .޽{ժU7n4Y;ieٚ^anVn{jkk_}3fDDD|駽{.--ucLZ\ caaҡƎ;O8qw*eY>ydXXXϞ=W_|E}}o}u/fvҥ{Vn+jxxѣϟ[o}7O=z֬%֎eݺlٲѣG;/m}}}JJJRRRVt:nO>޽{Fc^r &iڴicƌݻ#˒׿e0?`6?V~u]999}ن/ٳg駕+Wnڴ5kVϞ=vgϞg϶oqw}s޽򑰰Cرb8q[okۆIt+ 1~E͛7ϹxI[l0(..^fի,\nݧ~EmmO?tĈo߾NonɤEwWچٳO>s7nܲe맜SLy뭷.|bHK޵jj̙Ç޽Ϟ=ۯ_?j*Wn׺tk EL|,gTGy:NBرcoȯo߾BEF٭,)u&,,Srrرc2~.4d.ˎ̼[9Ҿ}իW^z .={m6h ]s̙yGsVI-kJK\6lUnNwܹr{ IDAToqҥQQQTBԖ-[7|6Ӆ#wСCgg_u4o^1s̊{ϱkŽFWCfH{hjTp.yݺu^NIjEJ؍R]QB1+Ko.Ha첨Og˟{{NK/}7Fx;wjw۶maaavY4kv}uVPPpϘ1oqzFZ!/,\6D4iҘ1c{ &+ҵkץK^wucǎX~wo+d/rErl-Ou͊{QnjlgZJe/l޾}d2)ݐ;ʟ8qO<1jԨ6m̝;קY۷СC{hX}w&Lн{+r̘1Tyv"ˌu۶mw+YYY5jr|VVV:-Kdddf;n֭J[GB!CtMׯw9<-v}}֭[bGπB|%}VbQ())ٺu;.]~{IOOwy166LwܹqFdNj/77jԨ;̜9UVŸ:uj֭{##G㏅7o66lpDGf͚ /;))){.,,lX̙3$͚5]lذaŊyyy:ur{iiiEEECb?cYYٸq/*+G͞=[9 ruyj= k-.G}ݷm۶܋.E˗/7o^^uvڤ$:tyOHBzYWyׯk׮R9VSevx,E$ vwX,SN?~ˋ>s;D\4*B¼_uq]]vnK#"" ͛4 ˈ#F(8q;w޶m[N| S r*2G'uq򱝳_ .~7[ n0YoG}4::n3fL}}}ͿYņ{ kF}t.gy:wU%lvyQm/ s͝K۵kWJJJïD|#}V璽n}Cس}ܶyۅt~(&&N~ilc8qJJJڷo;9_\uU;v:thVt:ߵʟ˒m eg:"HaEѨoREl޼.r CEEm6[uuuYYUW]*!!!''3L&)i%MzsF\^mޗ&|CAQuf;ækWްp'v7 >.~>McWE|GbCꦕ_aabԩS}}}aa$_KJKkjt 鏉NѮt e"Y#[ !u6͢ÃsrrVkmJP]͖y6mbB_C, GaiP74XכKK:t P!̦?j*eY)*ܦuI/oE&TwnEyRshM.Bt5V)O߼֭B\۬w!:]뿍B$%%tSNiy]*++sssYmsbBkH|@[B\wbLOOpiuD׍6E_8RСC#FhyR\]}<, !j-S?o)t'ɏ !,Vk .-:w1 uuun\{} Œ10)e!hth #""qȲso[J3?6Z]GFM"ٹs㧛'%_z6xdBDRq &ѯ_?L/:?%,Jy _ӧ+zM6B%K8ɶm۶m6X(Y_{W؊.옚j&ϊ͛,1Ve.(pVV!M^;% !l m;[|*lzʾuz `_L##"/}[!B0v]E.BM-;D>>$ (kCڴ?ܶ%6"W0%T4hٲeޒZ.i#S)5 >Bj#Dӿ&Y?sau)YdUWzJuB:zT*H!eNcvbrXX]U?[iJl'x,LD+y]={DDy>KoƬpam֬p؅rD^NNƍR.} $.QQ}3?6p:'Ǐ#'&K`W9׏z>p<;zgRЀhp;x!J" 5%6귽FmD-qȲoW?tl${NK Ja..)))v J΢b,ޠ:76u%)3!1tb4c@2Zշ}SU࡭zd^^޽{٣ͼ6(]-zZ&~vg*6> ~Ӵٲs?=U!G e-MNV^vꤚ9tɜMXoFp2W7Շۙ?YdٖVnW1Ht$F|Dl+0?])4L$~QMH`G&":3h3/)YBm'HxXsb+s\ n B<)V%IQ>")%klC"`9JQ,v8:4$ Yҭ[P{n_tzcŅfnp$+zY'w]IZ,Շ646=n.5#DzlAVAS9s&7Wm?^L$TOD2%%L5o~b ¨u%u~>Lٴ/6`Vv2n ӏjJ8iҿW@dZ!+iW,C9˶k/KDޚYel|:s.%%u&[/2V߃XkQOPI$SJ]MHiA&"g5i#_|Qk:֭.,D%~-G9.ޮ —#liP3Pt_Ȳo[ݪCHvW"UI?3Tڸqcvvv eJj=`2~cǎi0`=~2HP$&㧋R>ZP$6\}9VkipjZ5%Oo1s'Ύ/Zd/.c`ŕ?թά*- d^9O99H }"iYfrjR]Rw, C ZGF7#%IQ9`*YŖedz /I%pOmaW^]Zi<$)[#|~B3&t:G}jLSJ9)|l Y94*;eתbƍn; |_۷#H$& ym!#KPλE)|rҥMHB~{vёgUw>~v)-w׎VBzsYF3J,ځ2<]e,רs'ڏԙCHך,~V:Yl;3CTBD8R%j,RQ`#?TE]7|:!̎4{d!_l10kec0׶EEMH!rDdC,vZ۾c@!"Um.A/o.)!Gnؐl^bEok9ũm.H8R#"[ĩ,?Hfu~G{\߮)·.tz򺡦'e!|Ecǎ/4:R$RTѴ΅D2##^E^|erdWTT4U"i0ZHP)NvG !NS@2SڪJ~ 9oUxVaƖyu{ª9JD2Pmb\?S'~~ַ M%ԉP>828204^6ҩS矗9BX{^!jp:[5(8WAFxh itH,uЬ%IQ2p%K~m8(#NDĐs:,phvVSSrJ߭~O$n6EF54$ogԩSe1v!R1vsg̣ghٹ,k׮=sLHRZZz*9'{DRP'6-FK3Yl8MH攦)NN3_gW?be֙iN{W=*jUz,aΪ7ow@24K$BJ$CFʿ1mdci੻?&gCƉ$ $ &"eAl sKH>YloVJU(v\i@#O=yfh}IIT>ܮ(<-)M@J(5#6a"ƕ/BLUUYn2Suuzsk6M?)f2ZfJW ۙ$XKɯ_;H4K$-v9` }`Wu$XI]H3~i#IO@R22f UBD8R Ȑh,RQߵJOg̐Q%BNF IBj5@ܵ=**(ny>B =  IDAThlLlU+q~AI >~gbCЙ2vP }̙T50K_Xl-uD{ ?~܏g9S&W6$$~?Ȣ"mH !Vʕ+CzeSUUuhabpt%U ^H⢀m)k6]H f ɯ~~P }"}%sFYE^m+|IB<>_o W}-N!q I՞Rfs޹H04lƴZ ]"ybKȟVhHGA|ME22stRf~zвHe6sBѵuEp{jq0lזeK8[Gt!n?$ !*z1L!1-{XE7g#CpxGݻ7XuS Sue76"ӯSz#%IqE1V>QfYN3?nf]O Y6Z*Z&Q#J(}r{ 灓#ş-|a?/ͯ)n1aO>ҡIYodAEN x#svlWܴF'+H/;uR"՗ި)iW G+ THBHK&x4K$Ͷr?;d~kFӦ>_ Q"-c*M"Iqd5m)0x)+K?} wBHB9kJ!5M;/Xbݴ3>$ I2v֑B!쑑:whI'Fܐ2$fm!veCճ.^P練"t=}as-r?+JeII^Htp$ĝ9e4P\^lDR%'N~~:X#MH֙_No=ǑvFU#ըLӿW@2m$!ċ _-U qdpiH[3BӱϹJ$K|~Z5?ƴGF: dyNeQvkHL&_{?GSgᄈl,ӥlU:!Lgd냑v]֑A>]K=#Sۣ)^U兵Y #"a'+>X%r kcu]wrMTTQq`HIIFO`tfU=@SmsG}B곪[S`XlYUUF߷o_ '->nC"^Iј& 0ÿ7MHfz>ekgmɦMt vu?Ud=^q@"ݸ_W3 t{R &ɼZs^UI$k-c!K$̶bG:"Lݪ]II"&"eӡ+_O!UWp{Ni_?e?#ᐡsW>{lEkk~k:R!$|XcYԥC6 7,<$ Y "T5YlЋB1жfoo&"e}N~R3 %O$ȍki ޿W'uv{ߏ ªzU; vOU4II!DmmeBQ$( |@ŞXϖeA#*ܕa/q/ $3KU mݳɌv\%_ټUE}/?4%!bHfJci};P%>iSa ?'iƑ"$k7828<BԿ=77DKgK!k#|>A";'*,kwoIp ڲliѲahH!u"IB-э-]dK߼%ڿЌ_,VKC3жh\b!A畸,c[ͱ-Qj55®ӝ mEE2L:IꡲOU9E޶*N~e"ފLc6[c-Cj{)4K$ &yH֘CH1/}CpܣB&đ" ?Bi;}:t#HyygK_BHBB/ThOuݽa4 uW25# بS5Y/<{Y*pǗ|rJ'aro"gv.NZM"i"Pߤ_vT"yD1mzDHj8Ck# !BzJ6'R^gjݾ]k婞g h!D瑦-C3]^GEUeٔXAW֤0W.~h{+((X~} J MMI!ԅ&k~-͍5A^^lyf?cTv es}"8?xQ\\bŊv+99> +sH$ z"8RQZ]0g4_Lqv$dj֪&ݶL8kjokٜF'mӛԎ}zӆ2FBLH@<bFxDoM"iK 8j-94dFoUwÖ(vAL$~ a^(6t8GE׮l N4yQ./-$D39F{$!Damwqɤj]jzg6e>X5G&׉csۅ$ ,6eoͯvJ#? \XbՎ`ӅepT@Rqd4u(= K{8929:9FQ9KFVr?%..x,paa{ MlK(499UFROy!M:uyw(7*f0@z{{y nQHH@J$GYErllS0[_:Dq7̈">WDXEaDM/kPݟHx}ZNogSx`ZZaTRTuÕĿlOǻOm Ρ!u*NfD|ʫ9KGp'{O m68PO8+y.,fY8xwH%G< T( weīgלb(AҰSji󓫜~Gv3"d8nMF E2%GF0QJ)2AWZtISO2~# ?J>.h8_^ nV/2vDt Lo~E gL1"!;8.*5E`Z4Ĉ6(i xDĢqk2GI`{=\޲X,Ʀ`^_sm3;gͦpUk;,ܹӧOرC]pNZLHwG}>^9v2Z[w,^,eimm=tо}({*xw. wǞ3~ET~܇R.i}6|O|8onʴ^^;{ܮǑPCCÎ;4ؤ1?Hy 2Dc&E{5Toaiւ?_KŸ[b򡥟qѸk|PZ<Ǜ^y;HOf`={۟k'o!<7]m;L|rؕZ]E~Hm%*F< -2[gһY>u&.e&+g 8C;e[l,m5AtN3Nܥ!oMRNĎ0eᒁ!_w1.ո`{E8E?z6FpHɑHEGJAH@EAp؇s--X020y4 F,>dIKw>Z6 @rjd/#* \y;i\(2.k7Vhe4*3ږ9o=t萜G*yqt{p'1/mYQLǽ6{fX wBCCëlxH[[[ RIs? " BWė D|d0UꋐI^Jlc7hzBګiaYgG{6L0d {0KkKb1 UKdFϝQI LiOW59HzFI,*Hq$|+АGո") dʎ[ BP`0ŽkbdKlٹ#᪜$)̰KWJީ(\DKww`]Ѷ,ys`gS.(\:"ӐOK*Ξ=+e)tKOr l'H49 Q[[+@i2R\%Za)7Gɞa L>B$`ET+m7TPЦH \|w'_x~uʳcB߿(]}7TH^: {5"YߞS7.LE[MʎG *)9RIEbկ*0ȣ3El9R¸]+)]RD !,i@y7u(jTORUQ[ܣ 3_"Y+OISN mmmZHC4!^$1 \K FwaY6iI Nzwߕ09RQ$/^x&K<輺+ ?ެur+H{Na@mG<>bg%$#K+\ 08^9NEGΥDEpi +F]G^KQ$G +6C0ˑH^~KF(Hn)H=zII*-| ;،8qBIql%hʂ͌R$ɑH^tE/x<|>Ho?.ƢLH>}mDlnY\ F|Ww2_%oߐ.5ƿq$@ '}I)N{~3aN)S$O:_[@"9:2ڥ ETtd Rr$ɦErHGGGgLaIʦv`ں@]:թ+#}7ʑo܂t%OP=+9Io c*6;T\ ~Uk 櫲U-}ʕw]HKKqMo(!ѧ!hqq?fgſ/!DI] A3o-pt}Nd*s&7f"Il2IҢOmҗ$XĘ/HaF|׈tƦ4hA ;xuKy4K\KiZ)n /+nT2;?|yīT};%YPv$+'E(H|>977)92>ɦE`#Áz*cc#R] 1"ڂMxQ7V#%\ð<J$sx"@Xo\$GXڦ0bh[wfS~m/Vg8~xmr+n>R2XwY 2 GH׊{SEO^>+ϣ߾Az?^x/ H:y)`N)L? 0@Mj;KH6}ئh$!_LD#%G! +^{MG:P"r$\)HwIn-GQ.WZ"sVUn ƞ|gBF-CJ(( VaR?v8A4x D8Ѹ3y3~٥ъ={hhHIC!571YmޜحMK4_hWXX>\_cǂ )E9dKKǣJ\O_y,^i@Mց+?;MEj;mNZ@%?u I5L{9{&Ik'(CPxl^"9 )%a6yOHv_LgdJFJEjWd}J3MMfiݻ(zʂGV`fI`t(T,KuEx6M`aW/b1_/>7cq#e 8$D`J6s&ؼ8ͨ~+]]~1>t"^ԩSI0)EɊ$uuȂޠ'<As ȑpE򝺗zi;zpCID ݄ ~)M-{; *uZRD$d;N'e()=m%'lHhȨ$ R>4&Ąv6D]qP+"kddV؟-P3_O1GŐ=@֠5se {9S\9z.Vveħlwȳ9} 0:<>P($9d< /N<4Ir$+*k@`,{q[[$XՑ?.~0XKI^K /GQšӯ'sAEi,tH6}*LsJU@ rG fߜJrɊdKJLrj\[?T/}TKԈr$股vҠKc,]̽kڹ IDAT1RR!iP.ڳEKh6V {hR%\9((aѸLٳbCzYHE"^ҟPs)$Rtƞ}' 8z8%&fwoJQ@|T@P${G%zŅpqhn dIp~%I 0(W6`1gTvDRrT_2 ૯^}U\.?O55a w(h;RRfpnw(:Lw !#]QtkH`U'|&6n2' MMMC!O)ǽJ )'kDcqr$(/_VH"3\žtI@YIܳo\I;/cl99x̥J0Hz52 eU9W7푻f"!HȈYL+3<я~4++k۶mQ|(' |!,-Z|KIddL}O3Z,3\2 =f UF)e*tQC*o0Y^*v"FBi}XSV˵zҺM^#Z[[Lt8999%E, ÔJ!TVVV`^~YH"rqV]}:ø (5y=_<V-))'%0kxRئ@GjE%Ff-2.SH=jR:lW-mg:.fԬPyrH} <}QtՑ$G%(B^uvfYߴG۞j¿_~eyȑ-[=$'%G^#gz)RH"E)RH"E)nrRr$-Ve)++{o~Cɮb1>o)C{CW)Ci$!1لUT=zT  )% 1}1B)=yͱ-冺\rZ=&o J!\N9I7"Ξ=;>.@aaaii)a3g$&dZtiSS֬YhorT(ZSXY}]DEt5yyu6cm/qロ  Rx? _FU:Vrzؿ[wj'R%n* PTx$>`su-ВE]wS\0㑃(`Mf ҏL&ӊ+G?JRo3BJJAAőܣN,o2¿Û697nYٳg_7~' jӸnߏ|{#13۶UصkŋIZ&fvQ+X#߼Ƴ;k{91x9 \JjVޚ6"Buf6)z  bg 3H6 +,,$l65e^pa#k֬ٸq}Aϻ_*4@kYH|.1?Cd2}sO47O4y]_ʼnpKvm,{PX}oLVޝh2n|xU!sTݴ{|ʣ&hjRSSĀ1FiB bi}fI^c=ojU Rd>ܳ>ESS?Gdɒ;֖#RSKg>iPWe,>`vqiwmܐlop2Rip-GABiii% b(,-t\ fwm2\zVz @"͂0eI{qE@MM (JFGI|KB"EqvJ$_.XՒ#E5Go.!^UZ$ޅ!Ľ8yiq"׸EZji4tIy Z$vJ-@ VCŚtXƜ"5Mr)ICT$58|2}1Lի  XbYpt~ ɕQ;2HgϗqQ@_k/0bўx甿P(tH"f;Ј {5>*; ӏBf?#BLi4] [')rYӉJX((vt[hݺu NFJ$G &ʲWETe7ԼE'Z$|e祑ZcEÔM⨨$if_xO| sU M2x]u*:2a$Bi&6g)sG,h , hF5ynR 3̤X$"2NJUbɕ+ d (WsCbYQP"LDie8I:$%RTKj!9bq(Dq֙uFj4;CBl{]@Y<!/p^ H ū3 \X\$MhF뮻222w%'Hr$k,VV Xbɴ}i1Y 8o\E޳VUlO6N*4+ڴƬ-Oa/-h-kJHz$HYlF$-Ȣ-TH/+N\ꄢ''bHM.J V77gNBPd.~ӊuDz/O7nݪ`o.*(4yE~ 2U |nN?C_K|nW\w8دp@Q%(DY wW1ĻVTTf(hb>t}xadbզ5 S/Xa;Prƍ͜'.)-Z$TUU &I+t& G&X\Y !*~e3eU(ܴwGI~c!wx`ݿ=E9Rehfb UqsGY<2dj#3˖3B*G V`7/[$oݲE~'ipθ4id( BbGG !بN<8tPkX!sGYឯ{ni>'ݍ` ƀ]<@ uʕOk@\+r9!W[0ieɦHRVG }%3Zf: !5W`ji4eDL ɑE?0cӅT p8 ]u6=N1Pr!`ƅs ֭?+XtdCHrjTK0.'Mj:ZBH;<cV%VZD!K j$BhJui&HAZRg@J$Gi|#$*K`-Rgm{lnf{4w(80!}#uJ04C*S;$H40Ԃ4#r"M`FBHlC7)Y,Xkt̼Ϗ"Z$B#c#ET$(~Vz[…3)ŜUSsHFy ^8nJ J8 dtKrnЯZ Nf]P>HU+ݻN ֋㏌C>%(IB&YcGJBCo܆(QMh)L}S\n喪*;$BrgF Li"Br\"a_;c=AH`" G&^{߯&Zԥ)߽&|nL;Yg[$T!;$߰PBy3>IPMRZ,gҔڔ %qkG̗>.s)SRH AMQǤSZdZd& UJh`""@Dz_&d'BO&.QRĨ^9e|V' Bs! |0iZ(ɞHY6mڴL"7OIgu `波loI<-REHP 76;ݱ}턍#FG*2kbQ5lFk՗V5QM|!==n3sn^bҩZ֢řR.?|E L^()qUZ$,H34Q}S$kji"s k4RkoNER(eqVVDef:At!(:z- x3t0RnJp{>JK?_1Ho?~[+2ߠ(Mԙ0 Go4ވ&6 Hʈvx 07r$ƀZBz}x1~.j&RBFbxJ2gY; ]ϭkOA76QS W0.]*m d[}aѨ c9KzBsyj.-oXv-Z|2d\"+lz.P8lhx䠴L$c6"*.RhP N=wB"\ib ~p|0XVMKej0[3LKW4n&9eHHOO 1H=m%"vEc(+_0!'?կl#c0ߠHFfcSXhD|uMKҒ @q9PuU7'w iGGB,[/pan)Q͉ q 醇䤨߿_5K9[2WFF60K.t(i4&Im$|jK4 )a-e˖I cEQ֭vlURo4/vH;5vƿ|Ҏ "OX)|盇]JiP]]-EDteI0)ygE;?~\ΐE[A87kS'Jk4;댴FSȝ#̜Wq3aT="T_?Ո @z K8-1ŹZ!h {poҳ_@%e942N_u[ $Z)]#``xWT0qMk0vS}"`r(tד" \S+EBpd<ҟ$Iɫ6j`0]"aoPh.bYZ֦h "D{=#?uM(p~."e=)'2e;u{c/hǓ}J\vQZJpjf"|/:kL.s0@~2!~i)T&+.c8y/ABȊ,\p6R[r,Ybgyyh ̮zZJ(Eҙ_\G1y 2#Z]knMNGe.Uh󖸕%`1~+}i_| ' EJ"%݊&]QTH5HgtF̝zܦSGF@74pSnw(EꭺejF -Rrd_sL&ReUȨ*ِŅ_F2"ІCRӴ`ʕhID5odj4 %.8޽[5˲k׮v,%tb"QVȈߎ[=Qi=#ZMma_# XsI)EMnb1+Ȓo^X.Ko[ 1%d)OHtM" (ݐr=Y>B-m.sD%-Rrd|nmW*nn3F/B]uvV|8C?$89S;B$N40TuR!8wSZd Z(k>67Ji0$9E,+!%G*@2(TZl }_y#$dj vk^ְMO@dkn_*T8nM Tg#7]vĦsEWf1}#KOz+#Hߖ$H G"vY~Ƒ̗Z m̈́MQ4M4`hdqqը7WZ%DdjHr"iR+?f9#Z?rtRf2Y13+#I.޺&x%w*yI)<̗3F+E=͋"5I72*2;Zd:Z$qW)bPPbCiUw3#!I?M ޿j5[j/;ٙ2OMӣ#ivt3q@w̳',VϸE "i`$+m9nć*BTb%H& 'ё%_p;777//zdt⚵RD`P犰YYY933&r*DLiNitI3w =;O-Py67YhZ$)[K@U-Rn1㊤6K{7]]MtFNHbƶaGM4Äi ё(v=!~(.zx(ﳤnNg֪ܮ^;M>sLҘ0Sq& w!M{t#-4A* Zb8O82zcDOdD,i*aJ$G -Ծ}gVmp`Q63i.dp8e9˓Y66ASIJZ$_Y i|#K՞)-2VC} GcV"ۙ]D5 &3u p|(Ȋu`b#RMI$T,0ksDǦ<t -2MwT"i%61[k6 ˚- hF< Yn&JJJ}Y2:;x~|W|^Ax.]m '?NeOTiiKx͙O~ aaFq\{{P8Z+WL/~7K_x~&ki:ˠ7Tڅ îo86BDGjFG(.l8j#ƀ Y6Bϱ>YC`l<ؕ>^-|C`.7=s=Cεd2vm6 !OdY6M:`0mVYY)rL&SQQ1=::+ø@ nn16qieih"Ɩ#1GGXW^ f)LFzxbZ<5ȴZ +b{FM7l gzv0|([>4/._ܚyf +l{ue*KtԎ@EB՚gT3KvX,L3< d24E>Z]@ߝ:qa2WO @?&E)-R]}1|lJwf׊)GňZ?wf9W|x"UW}v7ƎNӟEvGhݣ ]piF@-+ܱvwvv.kdd-/9^4mw1݊m(| '?>EQ㲌5 04k ' Vk*E< "3l%f7nO;ubrp{|9X  FڌQ;oh2BiAu5CQpfV(nu!PatCf.tݎ "](` sY9(Iy?yC4 i:H(oH5H-Aډ"@ yq}}}7Z( Ẍ́U/BCK˹uAɁS_~hH?<ܹq /a&ՠ^|e=r GHKK ---r 0gFDzKOC4#(ʕ‡ّџf^3n"$k_|bc(pn٧=|{ভ\|j,izxiZ V;Qn̙3fh4_tiY,A<~[@aqVܧ#[>TTLχ23382M'R/]Tª~NKI/"4Fؕ1%.&{Qu5;;{<)SA.8Ǐڵkc&u3),]t vH(4lIdX: : ;::jkkw)x)`0455N9  2H+,Ҏ{U5-G#ȔKwW1[.^p8ny۶m S$U" 6~aQɇS.ʨ9"K{/]d.\}Iz(=548r ײC*mm=zokCETy%`AGr?杵 ,]x|9Ո#GFؘm6kdd74- 4wDz0;o<Ο;O;'N3kiy>hkks8E577,pBj7 "Zzjǫ槝9}0 j\ZR:µ|M+N[놧5k1ð@F&.+w>^A-{@ok-\ͷuv651z#;{MxhZ./BF1z܉5,=4.*,]n8 SFw^GՆ}^ww3c闄CO3H[E>RمJZ$$JL Lm2Rr  (7/l0pn/D ]w1 _XK__LW$Cz},ܹx}ߺn)\.LrʪU5uڵk K`0/WUUYzj[>Gii!Ɲ"HHK }{?D}!FVsKbU ]qv9rELv‘1M8LɸxNf'puOɲ/}Œ7l>u^N-`w[&v\A7oțLS}`銱y ,K0 B!GGG$ .[9sb_y啓'Oިa{ m0=\M+~5bxsm~`?32¥gKike4【&b=SC&C\ _#`fRщ,Q,jo@‘Y6[]2zw߭TYhlڴIf+r"恁沲ȅYwj(ÛzZ]-mO>uq3>|>pB(K1۶m7;vWK(_sR@oԺ|EٖuuvzB S\/(IjҒ w;9=i£fP}gUHeʊ|QيK2f6m "0CіmMo=Ѡ{~qQ<8_y]ȸ*Ikr;֗5-[+w@ͧ+3҂c7oތ~ׄ+>}Zr-ZGo(Ynaa:.:uc\cppmݺuy``_6FE:ͨ4{5Fme5& [C,;>6^]RjilݿsԠ1jQB B>!G[zfgg8p == c<885t:]iii p:Vaѵb Mf/긜iPQ 32!bۄ>p8L4 zk1j6D7UA cbݴ ' jw}wZSXXXT$ׂ$JF/))8}A>99f -Rw{zÂ[bkB`cEENtyyR1S]]]! bVY!{8֗m?͝///T&jkZv$4Y_঒L GΠd"{B#3.hp? (ٶq{yT2% ;>͕uN ::;;}>ߢE$--mPIIV@j(+ '-| Fp:xaZ```aHfd W$Td)Tnd}o/;6檨#1Ȁ)H"'E (nh$Esr]BZ7X !4-MBcs^1x s^ p=<65`x'\P.,ҿy0Jx=,&Qs  pñkj =kӉGGu9ɮ)"`ȫ9I ه0 VGXm,y[9μ !w"d<KL[Sj@Mn Weee-^|}~$Z[[;::VZ%v^1]带vP2,##q Ya/qR瓡.]Կg8Pш ㋜M{96.o @c|Hb<'_)bĀt݀٩:&Ba@ Ӭ&ѿx%l=< kWax*~,Z,t:ŋ--|1$HYT|`;@l:9F Y} ^+ɾȓidLMmQC#a ēt%_eep2,y睙rd!Bhp̙3_럺?6DI{cBVH;h"Ls`f0hh>Қ7 \===쐫E帮?Fe-9Zd˲ sad9t-{Hzab_ AسwK`L3K욃_>VeBzelөh2P(TSS3=OP }}B5e>t:ӯ\~Q(++['ވzNERjҍ:&hJgE{ iӽk, 884B ~8ɂh@kIc0Mx&38^ݨ=Ky=[@]#S׳gLƮe"ibl1 GEډ"ӧRL'ugJ^^ fGNgģb0Hz7z4 $;/Ϟ= &T @ pĉyMTsgBM& }6ՠ23O~gdo vDJ Vr06}^MFD&Cn0r>6 a9t#v1U"1`,j+pN)ƚwNZ5 f8N6(lRW8-4M>yiTsOWr9b}i =-//,5J8pͬI;^]S IDATi}b777Q/hDH;ܼKԵ Sr뗈Zi?֣md 7XigeeYӲ9Z]eEӛmەrstR}ʑR<zXYZ+eXs^/=5뀢 GR^Z$DmdvR[ʥ߻E"̠ي$Ik/Gۺ "MRErmtTVt:6+U\Ͼ;k;HT* ;1tuV׏-B*ueDy=~kX6:Gm:ej&ڲ#wVZh}a8Im챑Lz%VxxS$ ŕ}OqNy~N}GƞxSh0B&_}Y?N2YehҶ,7PB?qA> zqZ=~s=W,h+?q֭[.SY*WWlRTG2Meu]uMV1YMܲt@xk ?F.يee|bX.%ҁ.,ck B㲨ۧ;M/ Ǐ7?r&1 =.} NBqeq ץK.:tHq%xWk-ˤ<{l{I7G"bȮ~rْ8]"O}uxܶ(͎m홏,a#8Z2?g ݛQ}bL* _B:R}JRJ9wh/Gk?P}Quh\eBH2]T@e:1??I^9tg/r+kk׈մH?O J^:Я 5À6)Atpv.ꋴˇ[Iezh|9ܚs߾}\)G#AAPȑ#'O6}+ )8BHꤻzٳgKǫK OfJ~E|z'O:dܳ/}?Xi\&h|#yGz+Di("!^׸lƑ[úE~~lS6o]|_t/vz[WWWO>VIXv{[VJZrz]YYyg_|Ŋ+;6=aۯbbp~1]˾}O~,;w.9Ik[Ϲ1!o2{v#"Ir=0HRV+]\ ZbUY"cck?^_͗wHz|B//щT#Krq]Ӈ?8qúp-58ˋJq=FZ$yDTpdH@w$3(GzOf>Dck0U#o1?貶Z 9W,HIk@nS[NcϞ;wѣO=Tٳg+J#V*8tHٟgu2is ,,4^lm`R8LMվU0"ML%\-o/t.MRZY sR;vf$)wbΏdʹr"g><#d@6kn+! IRQsC|lHՊD@҇*B a*J(t}7͛7c۽{wɓ' Bc*U5X_N42YymwYm둜eK2bGp,օoa9Y5^JvvF_^#Ylv GSO=3EQݻ=dܹs'Ohh"-zϜ9L&rkT:;c:JHMe?~M655U(]NIbZ,˴$}a(%ȓ"g7gd5u|;oד^Er>3pɗ^z)z֫x~_h:]^^OjUpt{%êjVɧ5G?j {HUU1#jULM{v FM>AޒϟW;Lmg$˒f.CB6ՇjӒ$ш'NܼyGٹsEޥKFFFZۨYaqEeZ]^][i[ %lTWhO#'u䎭.V0>#dgl[#K][?k .)eGI^fb\RNS۵ۖ $)=?z8`nryc.yvFU޻hm'F[UUZ swPߥ\tiƍ,,,{<+׷oS7[%CC0&&|IBWϸtuٵ+ܙ~:3'5rAU'~ܾ=k>}i8r]w56/vj8t萮?Y]Q3wx,=jpr111jw%Y7n+`8BZvjVeφTl\,ŋu cG#1-vؑF~9fc#NF99W}˄yۇ&oyᖲlOv=۷{YZZV;vn &&&:~T޼rmO97o,Jսvu^^d2OzxifJC2ڵkoT) Q-rXWvEw ,#<}s-,mhYRdՆ}2>߼ -TWzJVW~ˆTN~$wcelFUUɺYزLSY}omWVfV H9F zl"`۽dZ$LNNq:2zpqmmyCvd*;_R1J)rղ+՚aLe 'ʪ?}-o`v}}n4m0.֧xvvvtttii^$Qt]bi^~G3==?~'^~<:zHU- 33o2kҥUMUTbfڌOT_ovnp~N/om-:M}W`G.8;,_C2=jZ(4?LrIbZU]d߮ pI:  ]yܴ0g`)/|ja^B򶛷;v9bXdg{aXۋ*!j5iG_Ss˫k>RxnWK2]{:u2Ռ+/̵R^&''?Bܝ+ϟ8qT*YYs\k˖-t4x4ev~vАIK+i vdI^ L"ri=PT/_kqh@COsy'OH.w)@Y{XhNOmh+/B~?Ug\2L~=N/ͫ/2eCĎ+l/ҒM?|睬^L4M;rfn)u{y ymh~~4͙'ONLLt4k׮zX,nٲիo޽{-_^իlvx)67?{eOMM>}X,NLL,,,;i; 1&'-lvWo3iYdyb)l|m< vQm|FUnxg*AUivӯ.9Bׯ_x=Zi>6\>uԹrܯZ.7G>}tp+e(reYaܼyrرEyz-uu˲h~T>cOײC,GF7! tw??@z;v]o.cw_{v#yyf?v Gym 83gݾ<0w} =<11q+cn;7jXݭ޺tԩSb͛7xCn[KK"(9Pk* G2a0;fS̚e+W洱dLN;wsMM6mٲKssX,޺k=/ ]v={v9xN s{6[oRifuiCCC_r9X[Jw߽|4? Ol+aÆ}' obZd{&(KʥjڧkZ$زCQ1~z#-hʕ+KKKk,|3)&+hdŔZvJix/ɟ=z÷LF6<,ˍ}/m3?O|.8033ZUTѵo?//?LJ=6%gϒ%!E"ׯXYJj|B߻\.ûoUsyj`8z;vZRZ^3k oݶɍ=@H'<d罖ԙ O<]^,aJ f}7^a=ыㅃw/굷b?ZM@Q2G$|-tT TUtuaWq,--U*bǐ[0 9PelTeZTjԉl<::qF4_}U0j/H%{veZ޾}MQ"Z+7n@w(LyƧ9"IyE)SGXݻW̜9sfb=Xu۷hP*Ѧ{m۶,$m~w; Riqq1NݼraÆ_S3'.?h$.--ѿksWwol:n~e˯M22ġ%23\[߱iYօ n(n޸4^+l44ޔc[]]~ĦG:^x딞~SLsKSt]q70::1wY[cC I`\68-t<&<*ܿ-8klX]\^\\$)YH!;tp[)q")bzFٳgZm;UʒZ @?a45lλ`wΟ-ˊ<<.yeG)l#{jc#ûvLXeT9F 4;uꔾ^*xWPG$I U*ULBi-/o>"bZ٘ڝP{;W^e(J]ݑ ˲{CQ72om“ϟU^/^l.^Y}ݱsÃ+8}3 yuuСC|Cf ǡ(;{}?W8_~>!UU=5Pfo}tCA(ql6{oUA/#V?#NNN̟G<4z(;eYV>76/wf| >:>>^:ntxɫ^-ğH?&F&Fª##1OTudY-wyTGj8J=xzUUx>m9[^]\*@(e<܄ щY1w67w}}Ge:2IJV IDATݻHD27]Tݿ]yOB=#[ytMoƤi&7•Z~޴#,w+KUl*[l5!=!~G?}(Ntff?я>C8A@[M9pn?sssZ5u|h4?&Z^weE݀8!;B_OɾlH=*My4>F9gO<,P.) 3_$ྦྷZ eVu= QuUU 0EcNUMд"\9c=+ ΍ yLbQ'R@G miq͸gFrCw|= $_t2Ǟ/HlYίگ}_I Aﻜw:? !qFѿ3w_XX0T5iP*!ǽdž Hӿ{;ZNs#&#!ȸ4ɑ}?`>Y#̵bY@iBA#+G Z>#OL@e aM 5#~{2SN=쳗.];wwE[ $I"b:|'>Io.-YP&ӛH;S Cn*펤KL|_+l)nX-_*GRd=E;OH9_$+c":ˑ,%0 M[[[^ $f &)GVU;ԢJz Gݑ8 >s|gn+.å8 pB.s+?;^z{^47Oʤů}c/AȮ#K~r$а-ʎ0 I224do;I#{7;;2mّZNrT $)ANv(GA=)ݷȂ3+Ve ɲs6#-2/wG9),E*vD#ك#]9)R2nMd"#ѥHT*5Eј{0>Aan!T'=U!$,2|M 9]#O=lg7n3I)Q4 }-\Kg|^AqdOձ*;N1;#Ihw jMD;R*D#ˑWið6U6 aWJO׈\.!#e˒,T֎Aqj6'#G&_W=6҉ٙkQ~7wʵF O=䧞zw7lL'98,sGֶ_y^jQ!f92 wd$ٴR#UB#Y1aݑ|ÿRZ6w$XlIvX5M[[[rtdAgAwdW)dž/:w#U_fam pXx;p:9vb#IfGrɎ [cZ9cq_eq_{ k j##!GtGώz-K-GfG2 kNA0t^#AzDy aծ;:w/\#qXAP@^лU6*PȀ*5_e_l$;@;V#Yҝ 뎤aVF kGnڡj8+:Գ4kS"k N|$A1+ʑ C/SDˑ::ă#@1;ݑȀraw\$&)*l\eSiU&µc:跟%.>[9)l-GzMjtgXVلmnxfڴ&]סHŲ$"1 HWpkQ H# !Z 0;Zդkl#5@w$20p$$dwنqD*U塌qEٞ枟uGBHݙU6<^掴nT8ѿE;4TįF C'8t]ˠɗ&-/I[lJ am< ;R/)(HWTάtֳ=u]ݑfHlkswG˔ra;#U6Aa VVѷX\AC/kȑV~kΎDw$9wpG_~X!;2hX"ّ'W e^gwd@=(GZ w$Ԧw!sXY[ 㬢+ّv ЬM\مm6 !2$Az{XJɒD|#ZmזLfG"9$쎌^wvY۴31|vgL W0.ڡe>) o.r;󰶬qhv_ᤳ##|8hXaL&!>AztG&!$9{lxrW#y+9Nd*{'2Iج x@\9s%GR wdoT@60G_"DZܑu 7ܑvtfHط [fsfma[;2fM$9~J1}.td?RɲLka.UlAm0;2ywYiLVf,uakQM@6Ⱥ(G"G9<^amD}0Ы]er{XMJcH$qMM&;Rg[;1Wi֦fG*ĮxwH*N$ 浩;\.^; Hסi(I1N Z>ʑ|AAwdPw낖ogG6'| JܑSq4k;ppDwlò|HfmYmvRNWFMa|^C{T9gyvG ҬtGˎT‰fGZׇMӲ,I2$QDMPL $j5ZmN##vWj@famZ HdA9rqʵ@amQHamv5pGH[ݑ^Cu3s6BqDO4kّzr:ȖfmnU6a/wd55 _Ifi$$kc|$ HCO(Iؔe0LǦ[roN>9WD$ݑ#/-)u~ڤVO6 rd;aZw7ovόe 1|aV?#fG;ҫO4*jk۟ Hg uG*YUKˑklL* u" eY,V$C">qCWj@堯w$FAV+ yd4#BͼlZlVܑKzqB,)";v@H%?t#.(&#7͡#CɑnMHAzg 0/ #18/J5N>##i$IDgX[/`v$3Zl`#8Jo[볥ѳ##ua~bH='@dH44tU;Rّܑ1rSBՀNEI0r$ HZ#1-1YuA j%51 Cj,~>08ڽ(Z1jvE6;o9Wܑu3UH-&\JdG!|zl-GcˑwҥH{ /lvvmi^#Az Iʑ2< T-8~Sq7?A #mlfus~6kȨ-ݑI)ّr*Ahծʆ#8;2䰶w$4k?E1 ZּMAnAO(Ij@Z*#y gJ*nG0-D<&`!)Qc?wdVkUy>U6Dv"YˎtL~;RtH_wWv$1׬}B?Nak ّ1H3T|$G" Ljղ,B$bFꕮl/92hXݑ(G&;RtMH!)FGlr8'y,6w ]Zّ] wrwG+ˌ%9P;NC;GTbl =NnvȀOEfmHR$EF9A'e^$,ǦvㆈD+dǾH<&Nvdbnv_0GƹWDZ,.;\d;RVxe(G0> 0#9TDo֎PIJ+EsGBymfS* H;2a!Bݑv6NjsB?Tnte|Mݑ^N ݑ(G&N*Hq: RNHsRɵתl#Iڢ[Qv9ZHF/;2Z+d0ӽ2› B !j6 $۬$ $I4:?w*:ݞtFw$>0$㎤t!U6rU Qeؗ69#iMܲ#6V{fGm GaЮ+G#eQ{4e0'9د ;vIt:-hHNhccнImpׂD<";RtMH!U6\poe,t##e9wXۑ6kڼܑͣ!)ʆ' ّΰpwdK[e%;֎*ّiZ*Ia|$ H?ck8D\=H.( ȬtuGz;A( ";w2#;oX6ٮewG\SW#gx8.Gnvdh9}  5D1)%Iɑeћ⢈IzW;R*Owkr$iw0qVe8/Iّ5vGy 6kELvw06kHrXHU6#ɑlBjZ\FA;Xe0Bݑjt+}FVjHYY792(;PLl"#`*#ֱ}o q159;2tsv*iGEgvamȬ3)gZ)-r$}q}厌^*7Zv֎R9Ғey$g^#AztG&Lc m|PѭZam66moorGzVBi fّHrGrĮ玔SH ;R&l.YTU5ɀ$2H 3;2I,;\T3=6HOoceX;VUA9r${aւGz#=46#֬X.0Ue,?_ݑ!t}XΎ0uB%C25tGA:ٮj}cHA<,nd8G#{foMs*2G[<9׈1ݞ(8IV05֎m]eAHGuG3bXkّ:1,Of!>0#Az˲)ݑ V*;Zq*wǦaX[ zT!8 9wcߓ!DPp8d QeY߬\^FX%;2amU6;4My0L*T܇I?1͞TVvd-NϢhU6( U$k1>AΉdꎬT*bʊzAwdXIXe r#E~ e4U6 TOlޞZ-WiGVʞLQr9;4?B.)*0ˑlb4kǞZQّi^#KG- fd-G@u+hp$TamtG"ʑ郠c4{WeQS`v5ܺ1έ~3:~YˑBܑ\#GvVRw(wda8rsbkf&_, 4MD.!~)JB.*Gbp$/i Эm*2YݑB=td Q;ңʦML Wۚ#4.;2Jv;RrG#u.f9c4fFr23Vvd*1Vl\U6f%I"l20>AGZ$$ Rlw$Gr"5>]tahG}W^8 ;2#FT ׬Ue>m;x#}##[,W2+bZtGuGfj#]9XX_:5kAI #AzIwR[i9/b@{#5[ts IDATm(A Xe #ܑ񵧪l*GlW kw^ k7og*8KhZ (TH-<;|#UwXۧƯV|Ș;W*$7At<Q[HA~D68uxX4\PryOw_F<͎Dw$>0$;Ha&c _wdP7׎ǻYKrv8'kVwCI,+6(1^_/KġFQ?(eIXU*y# IbaratA'zl掔3*cvkHA9r`IYZq!*!ݑKώ֎+鎌pF_-_w$V6Xt;W#_ ھVfGrp=KvG,!d0>AR j\iH(82۽Z|dY//a@6`v$8>08$>5M{ۿE 8-5#XuEqG.dG qGz!QQeI,4ݑ1Seǀ'4Y{KY$ ~^#A#$ 9{l8OM!:w[۠ oH䎤~tG"ʑ郠ۈU׌3پّfF͎͎`RȲt+Gz#e#ž'))nxyU6B95kGuGzE.BOܑ>;qGʩVwdvwl'Ga1K:OّJHABO(hImBHV̎DjWtG k˚$ xPlw0UU6"69;ewpit6kFl&^ّu $[ڴlwv$MY?YGMxڝS ^.ّ0*G_; zEa DBZ @/,Ggv35※bEˎRe\ 9TاXh=Re7;RܰvdgGIEnL^ 麒H3lv;T^U6]:w8u!SKtݑ!# HA.HVz $z/iʑT E#;Ci#b,-f;mXZe%k;r6uGFdLّk,rGrˎTe<96@HřK66H6MHAn`Yk'"$In{l@j7k@- Ch8 6 (#y^sG&ɎU6f} ۻW>{ܻ e3Ύ"$nّNvwGiHA#c #9;FHA.a:'J#EZ#amtGrAL] B7C-wHq@9rpwĶDoWeCge!gWqk6$ I|u9rd1@H4".ʳY[2brQb5ʑOܤi6RF$ H7'e  j >1Al7ݑj>O7$SqXe . .AP0eºY3!2U-vǏ;bKYu/ʆxш쎴*9k_sGv{X;Jvd뺮 I8 #?~#J#k}wqQ 8N(wV`݂HF z ?DݑN ;ݑ% Ǥ6tȎqn֎,y#7k Hs;J\u3&Ved\y}XZQH* t^.bNp|H:Y.M3(= ʑ!tXImN7m\6WW+GN*F >pG6f4֎nˆZi*\e#Ʌΰ;ҭf#YN;ʆǗU6,ّ\ܯG2FHAn@rd {l8Aݑ˗vw7#AںD @v$j/4;A%HamH9RSeQkyYlwOeuGvY;g?qZ ݑq^x5K/S:#k<ݑR)D} &ɄgXH>(T $ n0f ;)<莔#=I5;2t#CvY;r}ȑݪߵȄl(v|d(9#AhDj䁶an6<8Q͐IɑlLT*#$=0 ڄZX ͭj ak9{XݑbdG DWxװʑWZkv$am.VAZS9;E;2 #w1B? lܑ;ZH#eG:!Qݑ<fR Q, p^A$Alw$ꑂWr fd [}ݑ(U' k# Ӭ-كU6ͼgFvGꎌ;pi5?vpGRܑ@\Em֎rgq| ֮UU3 5H   jc /i Qy[ҿّN%w$%7|!U6!}vOO#=%GtGxmwdH3 Ji}8);~*Zay249cݬԇWZu4kGpvGBHDINH Kj|336m4hN?ʑ;7;ݑ(G24k"J, o5#;R$HqQMoK\v$ \X@#|6 kgl#9#>?H CCCRT V5'5 I9jDّږ *ʦӰv?ݶo=\b;v{M#{Y¹#;gGmv92")ݑ/ aGxhwdeG tGWHmlH9R|V \y;Bfh=Kfn6rTd/9vGߚݑ5 GJd$\O "tG&IɑtXY "A&&dnoK#=;U#PprmtʆT*- vGFl;{dXN7xeGֆ $O,GҚV\ֈvGv-;2mWTP"G;A$*D j6/SS$SE(J& )Gّ^HWam#j玔5kбW2fwdU k۫ Q۾V 4Ȏ" QU9Ù%|-H檍~Hc#˲Ҭ1cfGF WecZU6B#GvAavby#n(@zlBЏ]6j#HH3-=Gfw$V}}̷Y;[)Ywxx#cuؖNjC'wd{;*1lb#1hK̎v&FqG:V~U6r&^5>2@6kEwGvTŹ#%Ir Ϣ "rGNj _}|^Bȑސ(#ُ+ȁFxvVGkhj1*H  $/cgGdvdZm#TY⎌Ze#}r$k#H' 4;RlMnVٴ#Ƿh;RΎgEDvdX玬^cV.G%d2<#ckG̎teS k-6CGZG"#EcծT*bʊzHw>pGzP wqܑL=DtȖ0?QmoȎ$ HkJPw+űّ!zvY.{>Vo3kّql k$;Үaj$GR)UUA% #ADّIVzc$7Ljf*cyj!}+G}4@w$80;R-#WWSkaÖ#;'9^Hّܑۓ@Hv$+]gX5 #Vˑ2wd6SmZ^Zar$ڡ1>AD$8-HuG_ x_#A=aّE#;..2:+vrG]2:y#C6k{#kGrq2,;}X[m#}l5k&oU6D;\92T G" s$=6s9ImȠam U6ݑaU aّ+}Zj8ei~?fGliO|ʑa#xّ1Ze)t'E-K"IJR;9Ak Z#eY$*;#ؘ(=6ȠamtG"H' 4ΰvfG~d`i?ucro%ɪ ia;2{ޜ;2E_DݑtE=Y;, kVЈҘj#{!;t]u$}^[r 8 4 ^iA˷HtG@P}i#H $xhl ܑ.ֱܑ&&e-ʖH$mam"`X;X^B|jwܑF8H֎We#E#sȎ gmF 1浱A;B4M^VD,ЊlOȑJȀYCw$=a*U6Q#JG#GW0#=Iȑ1Dʎt ;ҵ&dr=۩YxNw#NCGaȎ@"rd-|MT¯ |q{lЩ$#2= Cf|k ّܑRȁqGQ;t]Gsݣ~alHHhɎlPj'LW mw簶$ rGY I|ܵJ{X4-˒]e+;2R%;Wܑl,Yf_bYeB0>A/߅A.b8}|ʳWb&sA-@Q>uT`v$4{@ʑD6Db5k$' #M!HؿnƥEˎrNot0nF-,8qKVڑ ݑgId&;r$Cvd DVit:T|$`|$ F4Dh6BVзHpG<#YA@9rKbtqi d/k/ | i>D|1OCv1:bܑTH]VjU+,WCcJ&mWlzʑ\lFw$[I{( Iɑ  tG t.#(G@eMި.qp$ԇ=(#Irm1HߖEpGwX;t#Z{MKQ6e!;ҩcC?~=6nd.r wd6Bs:Yݜ͞k1MX__HAّImA ksDwk{ rd@Nk#H#' :)e-H{XUG5s#}-ձCHMYّBݑtE=4{l=rװv]4Zݑֺ IDATlֆX>d;#M3Hi)"(%[!  G{.$ڄZpk˽o92F*iOrHq}ٝ7}d`Mdww `N3ّI,wdZtrGJN_amfm{X; fvd*KT%@ymD #"VRB7]l8E#i[gKokGώk wd-ݑ7͎e:CwdaّõMU#+rZm Ȏ<[bH2t%9^[6d4V{F&IDG~%4 kP{p$;r364*'wam}4!fƬ'il*ّ#ޑ.GwdNOw;keG#yHڬmkGWtˎҘ);RD;V{³#H*|ul;>r$DB}z3jhRs!8ȑp$;rX{zHI*0i~*2;Rk֎L7UcE;s.U6(l;rKCHmܑ,; X4#|^ 浏ڈpĴ/PkZmGF!8~DT<$ݽܑ}:"0 {G#Ӿm.cmݑڝGb.=X <0dG5k#+5O|=XY tG:k țV٨M xl;rOWqG#뢰p,8 6@tuAZR/oR,~o^^!Pܑ\#L.:*GPnS9Ҵoj>wi6ܞrUl5=]V+#מGvo#H<4ˑ!qoc=}H"l6YqƜ#!k@0NcVeT9 wd ʗW~2rd>ȁ}=6#@w#S|Xh(tawvXqKNB*մ%[{;V=8y>2v oɎT!O wgղ#1& WH:9?DTGˋaBّ#l;`wb"w$T~v@象a)#Wӻ#ŕRK ddGj5/sw_˷ڡU6!ّj#eM>8H#GO # NGZnGDDj5}ןܛ: k$-#99HIok9}pPrGεg+xφFUĸ":q'vTO9*rG^: w&3f8ّ~W4kJFW k_ʆT|dUE! B2\V=6ݿ[oȉgG#Ű6ܑ`w"cWmMB;#l VHiIk՟:;|EHVei= ~[#ɵY((FMwdʲ"G6r?>D^<'jHF5a^€;2W>|4MY{r>#99 !amI[{rGvVd8-Mɽ(u ݑq3 nv͎okV٨ !H!;z\<S|Ij^r$wd"8pG΅Ȋv#?Hs6ܑ`wc*>2[LrZ`6#̳HٽmX;fvdjwd _m;E|$uR<ݑ͎ i,;(~HRG6G@pG&Bqc$)GS͗vKZX^МHH, r$,PL"v j 6gG#lb8-;2ՙ8nO+fGvl&* H p8FȎl{w~OW̎$%GNuMG R,ql64@D#cP3-&~YRxMEyqܫlHɑ+gGj*n#ao/Bgjb4 o꯿Rox]~vm̽džN!]` -Ns*4;2Eu`w;;=-uvTvHwU#嫖lX*391ɑ;!}Ѹ6===Qr]V!>s_M-¨ ZHD/}nHL3#gކRbX#DݑC7*9,Rw솵j.:+AHrd$gO_[ˎ5ʑH24k +nە09Rアqxam"9ʑܑܑB6zlbQ|HB qGjW6;¾'}d-gpwG^JriK1l(z|\sk'pGj;\#;R\;i&2#HχgGˑH%G^ ):?+&Ϋڙk *D\A<&㣘2:ˎ30w$= G?Qwd[a펰5:3OrNRV4 }#drdJwgvd]Nx$FaAwfX;8;R^ .;]do\HArZV+b `0ťQDّpGFlk'cCKwG";85ܑ!*5Ve_D쁪Uu_);2~OvOLլ= :#,U!I0n3 ?0#۝sHѯ}tL-2 rdDV?(9rJ#!GhlB#[X U^M'"YpGFˎL ;I,万gGvsѬ!;sNGDRMHG@M Nj7MSU#goݒsSe 6] GU6Ȅ'ֲZw9,l|OZ<;{7V뚵#}eQݑٵV( ckw EAD9/wБ{k&=##~7=:qIZ-⒫6ݦN?}",gwC1wHz`Bؒ#[2-Q%;R CwEv :;[vdGz^<qGn4wG9Q谶Ȏ tG>l-Ȣ(6 1VYO15 $ʑlJQwAG&?'ݗ/ސ Ȏֆ;ȑ uM;2Ee )guUhD7CE" +JsEZmj92] ;Y9ˑ#ȵcM&;2ݛl}w02_F=Hp=6B6#"[heBڬ(DѬȁ*1 w$-85ܑ$}d b#Y)#/IuEB۬ݒKpP;#U6ۑHWDpGV٨ [6ﺛ kv#ޮ/AM 8#yՏ?Kij?$"X*렆`ȑ`ّHax>84eGfmͰv2E漇c#֬2Hg:ƱY[##Tل4l qS9->i @L`eb} kG|UڿLIm2#UIpGpY;;2.YGEvd)`'4mR{ YX7IO9ެMDMUEMỎȎ (͎ͥ9rGyn ɈJG;NA;9?Dt-wGqTGZٻd к#$]4Yݑ{v gȿ7;eU6Hfm7㯍#:##!Ύ$ytPڈ'LAI9u])ֿ7֟fW߷ޖqG6#Ham@mvd"wdXMDKfm;RXs;uݑ EUD֮ըO,GNt7ex !ܑͬnّbWC[r⎼uv$M,f ymG# D豉A"_z[:wjMHdG ƘGĪl]~j,ԶF<-Y#O;`wz8ّȮV9fmιж\?}`X莔Oݓ#ћ8ّ}7&ym#ȎN.[WUQ˫aRڴH)r$ J[)Ig-W9V #M}!G$$ѬͯLCƨ@ d,4krˎ(&0;RZe)7 knVeCD>| w$GJBفak(Y0EXvd>amҥ<]%-DqȎlݑ&ӾqX;&<}RǛjvw>HU?)i1>IkcİvXvd '_ˑQ!ȼiXp &:I'/?Ro'5Cl;R3ǔqr$-8Qr Q7}6w ongc#gctNRV k?| ()jpGF L;;c ytF|$Xa$vDtOn.^_hzC.Eȑ7jH k9ʵ;R=>d-՝*}p@>vTfްY;ᰶwZ|!;RGF'QedcۑyM#tF|$X">-("רFpd$'^pd(Jg-G*ND xDvAC n K)$;2vwZ߬7)a.#]k<vG=6Z9RQeḂ86-iv$)9. -wG pGF Bw"peZœ՞yPPYuDr$ jE_SJ0Ϊl4eG33y]!+d\ МçQF6GfGZk?<QQZm=waّU6AHrҬMD&2Xmm9Ϛs$wd\8WqG~Kqc3-w#iІ"#H|N)H㎴:U6p*HݰTlfG&lN ɎհtGrdv&Bvݑ3;R#g G2| vuXݡeYX_ȑ#czy?|(hrPvd w$} GȀfT8#"4ReӚ1Ts"fGIY;evg^Haqwz)VلfGȎL֬}Hj#lQZ92.vR;HȎg"Ms[oK#_mv$ܑ\M2;Rh#ܑ,qG#Z]knݑm4Yi pG5k{H"U;G5ÈI|HImys<֘ǟh~Y;!; p.D)#'QecpG k# 2JX吻{vdw\"2f߬-H}1#sfmX*8ّA5'a+vYD5XȑWf\#33kB/$%<[G^ *ˑYYܑtNL2r+*^ ;xQVٸ7k<-QݑMȴ]qwG>Qe1WX#H˻*8;6xXyKݑ1}t׮kB|$wdtQI>d5*s6HNd ѤlZf|ܑcّ1m0ڽpKT[vd{v_ݑY ItGo$79R?o{y۩g6#`wdDQ?Z/Ӫզe##1 9#QJwdvѪ 6U6fJUܑ٘u"kUvd*W#cw;2İk{xެZa+&Bv$ ʎT;mX۶YWrM!>vv0ujJֆ;2勔#|zgJ#ʦ 8nVFl#vVَ钹#^eu]˙k{9r%LܑQaϖ[bx[gGz#m,Kb Gb^v\M(էO fq.Y{(;H.;Qܑ&ьU6wdi#RWDsCJܶ&p0ؙTs%amql*[q[ݑnIS|dUHqrd"kxwv?LY@\Gv$xDݑrC͈oXeK;_!^M('ݗО;2ؿrg|iw$Oj=6HsG.eGP*`jhGY\+jWF|OӜ~~&"2Sq \_ IDATY:qHk ?ufliܑU6JЌ1ͫs#T8'TUEyKs`X{kl֖YU]9 :Y tGFn-ڤFln.GH弮~_k;2.W>`R;(=zlam E؉~7;R I/%9;U4bH;r"ڤܑM5{*p8vDIiĹ QOX{mS<%ɑam#8b IIRH;=Z7( 5'J] GR#G*LWSq%8֎AWT>;/wiǶs1L&]5bbZ>]_ٿYۭʦm6#U63̎l]7*# :jur$Dp)A\8)G.Y#嗑. \H԰v3Mݑ9ivG% ;4p;rU6^ّf]̶[2_ݑpGfGt#}ܑvّǩdGG5q~<9-'9\aXQX[eHe°6x#SV(]nXȚt#''to=tّ ݑ 8#9ģY[ʑlXe!;% HRm6DTV!>.@MD52D@DoR,~o'5?n-}GqQw.80 @">ywl4-7U#H1w"zortGj{~#+6@Zv"5Bfqz6=Ԭ=4kSp %q>lG>H h;zڇái4՟XX)L|Ayn#DJiܑڷ͎ȳ}");RVVqtihtgHȊľqtGIR-SܑbX{)߽xȠH5) %4Sʎ$ϲ8jgx }"HQ'|DhpI. % HxdȰnzckSܑY^i%ΰ'2 <#EƧ';FNY:+;#kUqۻّjk"4nّRٷsG4%9浫0 ]+jcI,5Ĥ6H IԬ8Q@ mlugvpv;A.u7:(:Y5ʝQ)Zm1'Nfڂi6k a~\8 kS+G'i9L9֎XYP˫a4gZ9Pe) ܑH;2Z7֦7z>69ˑxU6tڧʝ4Hat^mvGf[f*zuwa-EfbU6Dn,󈏬"n5E&CLb91X}LDizmPt=ĝIx( b~^;k4MӼ%6>"D &5p8py]W7FD2ImZPp$*L -8$ Lr6*a3omjȰvyjώºP8y]^9Y#ZmjJ뎌99-t0&ym V@cs8EʼnRGbR;?KiQ%Gjܑ!NHUtwd$lU ϫ=ՠ;:M^IOLWecն kj&Svdavs[ec~8$HᎬ#'5 ̅V{k @ȑDRwg [*HNKz92pGWwGF֖C3Q#ӟ>=8-#&MKs oV"NmHX;YeCDjZcyӰ#>pOu| pGƠ|}?LwX{AّpG8(;A$͎tGi80H#pZ&cP~l61&Ҋ!GeG HOnIa0ViE+i,UCH6{w#ո~X;;2r̎&|5-EQ ]XR?e9 {dv$0Q/f7'qm9pY;#vXU6!NfI#I쇵hsG8>-;4͆ rw wd C%U6rX;o3 ώ xDuE.nk:* h;p`X; WFMV//#'"|~XU6!NSȎJMW2U]kMs@sEGF־qv &mv˰7zlHeGuE,]rdm6u&Ilv8+#1?Qs<ۢgI=6g6ͅV.1A˥ֶVU62#Cp$e/""8=#;LwJܑ6kJ؀;2X#{U6o`o,PYv%dy~m}#oF\[0ʲ8p8#~DpT=ȑVxð6ZpH#2߬ba#"am(1oXkitf8M9_RU~j{`M@ӄHj絝# cħ: fbqal4Zɑ_*t N{X;;RU<[i(6ϔHiѕzJ- ]]mXg\;uv lyrU1"X<#é9jJ8zl"LV9!5 w$= G'#N^#S*JU6gّظo7 NK,魬*8'?#;Rqw6cLCU6>ّRb#BT'IDy E H#ΏjB*~2Zm"*h)r 0ȑpG &@c#ch8#>;)jN-:vŝ^ 6U{'ιΰv:wzlNpG5U6ٔl(l^u̎S#)`^;5ڼư6zlbxLy}Ij*hC!ȑ\Ctq?+#HܑޮuGWG֎xeGŽVrm6 oȘU6ו#pˑƺ\J#HgSϖF]%#U>oڢ牰amq#SOHAhq#JYe>LVsG򇁿1;rکݑO<٤;փvwd{A*GFɎ Wx!,4ID1eȫ8Gs-,G#d,Sc]לߣ/~}GD G!]"8 GpHANFvGT$|ȑǪi) 8-vw!X+;WsG%ֺ4kka|IAwd`M 5n= j&,\ Q4$&?Od}npd^g5-Eڌ1ȑ :pG \ȄHΥd!qmY|,̎>-f᎑y#Yx:$)]lݑ͠;rؕp٬&DqG<;Uw^0mERʑ1o>!Z豉AaH1[F@ zl0tH0ʆ. jѮ(fmcqYҨsvӬk7'uMI7;\ܑ64sU6SɎl#8k_e&.G6<- KH5jcaerzlhp*N k %#A٬`DzZ*.~?5Q#Ge Ue%ފ_8zwdI&mMB#[kʆrd`M;2ȦruTM>>rfYYTq~8 + r\(Imd|A4)<(pGp A# >ّRHdM}aBՀiTvș)B 3+M%I>ʹ6koff֖[#5ҽ{B ?1ymF5a^pg ;2ιXV)֗r$ca tGܑ :$qGrI#}li.Ƈëlty,a5pG:Wng;ݶN|^,ưGvd]eW#l^!H!>q +2M>#PBD ؐʎ\H\Q:sGʦ#;܀irGհVz:;#w&.r1;=[fm*G:sGo̶#ّ7٦ wdh ֖!Kte69|4spGYC|dU#wtGŸK;%n7e7l|%݄{lhqȁamȑQ:fo Lsh-gk#ݽ,Gzvuwdfm wd4#Uc9mV`V&Re]Ƈ4H"l6ycAkx< 7#s;Rw&.c㎔mf၈,˲LɑI%w9 wϰ!SmC IDATIg) 'PeUjXXrݑjW}HAeGN胻?=b;}P"#;O](YpG(BtّRnNуd!NIIwVZmj3f9YKft1l"ٯ#Zw, w$΀;2+ kV; ID{o-C,#K#ЃtPݑrIHHrl䎼ЃH9B*œwvuݑrH1RHj,;r!ّHRr0#wz.8jg*%yL*Á GF`BD2cZ#5ܑ :LIFHðMvd*!KM3;2;2ICJ=6ȝ)3Uvd̷ޒrIo8@?<بZx8pG e"k3/w䔬P2XwZ"apw$1#SO%6C厴vȎ̶[֮ X£]ٟQv$6+>r.Pn n GLjT=qw3-ISqH$sƛ= uvGfv*>AxvGzbݬm/GNّkwdxd#݇K\VՊu]#>xZm(~\V//j?QYސh U`X8*@Y#~b:o#k}lܑ"TDuGR[ˎLWe0;BRU6>ّRȎ\ɪʦ۬D1lT wW3ezX8'9絙F|$`& kC矉O uGꇵ- K G>j^;{#hX;gvO9аF֎27{wtȎ6FHWلfGRȰ5x0Qvҏ2ϛ@$i-fݑJˎ6[ø;* kN8=9`^ڤ&췸m qIK1Z4+9{G"r !zeɑ>98*@UOnH*Sv$7fGܑ=QzX9ob{6O-jX^|;0=ZM9rU6͎l}eYkȦa7Mn+a%jJ1$Aq0ӓ t6*ȑ"pr$#Ď#'3Vesz\{ZrɎ4BхӬ}Hʝqιx# <=զA9&Ue𭐻7kU[h@GZ_#>p'`X;LjυLzlHU,OUu_H}#WvoYeCU6]`qXۥY(Y*UsDɎTUHaX;$`]ʆ#=5;a2,'CehJ̶tGf ѩdG;1;r^2>2۶/'UqZܑ1XDDoz[F#eaa$U6Q$j'A Y#icU6=wdmّ3S/:2xX;;=Գf8=j0ڌZm"6rdAHyT:&fGQ\浳aM9{{KipK;$/0=V>o7B[)k #qܑ (wdF`vam+9+39p5`ӬD`erٻYRyI?tDoUee05;2}^)$# ّ4rP(9?aHfLDY-0(ݑC)#0QȈgvdek2y6uHi.gjU62h:ݑWWF ~r8i4#˂Onx'rp[7Yʑb^IhF\OEa]po Z ͢ViQfGp@}#Ii?-Q`WЀ;RfꈒU6+tWfX;avP(cH1m/Ggr1 wװvIK?oWe ky*,#f% ڇ'4 ^?|햌:MiHVRH.QʘU6adr\etGlNmÚ,JM;R+s;+{Wa|wG>RX{i5]u k+GpȠoרi%eY@.amoP=V//wG>98*@U6BuȎL!GںLU6&,;2°v wdpvdzwd4ّa0Y1ݑAk s7׵HR7zb$&"?ïz[FȲ,o!R;ȑ־;ݠh[b-LKWwִ/WkRwdHw$;2$[pfm[Y);ҦFngʦ uG걉Ь(,ɧwxT|HӁF|$`5ᎌg?gtnETw{pG L,s$ΡɑuGZO9$H8$W8!/4Zm"*sG 9H^rSCܪYe莜Ұ>uGdG%JKl =gّ 4#oc*Go^kO #=?.C7S,־iI9z+-H1]׵xi GF "O>85kH6ܑh(wdk6o92$a^hH]M'ūd\ȮPvG*AJ);Ԭˑyȶ&5v\Qbfvr$!>hkaPrNvUWˋxv_fU6K#儓~X{-r$ʑ<禿-R)"oz#2DW֎bEu{tNamŲY1;|X{Yk֎̧$"*7w~rtG#,V\#8=61(_^pG ֺ# 80@e8U67uGnU6g l{3fyfGښȄU6uCFtG6M#Se|x-l ȜZӨ7qlQe8gnYq#뚈Qcy<9QHȑXr/ݒq,8݌_[+GbX380@Ƙ*׎`KL7 iΎ4#;{IU6Q]fU6wGH^dۭ ¨l r$c@vz;;3;96kϳʆcA!KHo<?IDnW筷eI\L.Y{`XPW G #þ'IIJof{QwС,cT8حܵq5w`SoĤvevGfo>r\esfV|# X<92E pG`"ju  \Bl(}`@Crm"58WٻHqƇUPuu_J*[;3جcSP{gug#Xe3fG9 k/@sHȑ!^nHp #DW9,.8,#ȑ@Cdwdw~ٞtU6Ԋ5DwH0UjXD2Z'Z9am4HV,5)Iqk;_j;Gˑ>GȎdYB.Of)#jOnח_l)wuˎ 8{#>q}ȬIk#1 XrXHGĕzlOjL! k HA##nzkc:i̎^2jRzX;U a)0Im tGf##ël }ݑ#EvY8DoR,~ox]͢H k*Fo H48oVuPyd2*GHɑ3aX_Y쎬6k'NRe3t#ŸrGȑ[#+GRM*XY6(1yp4|v@vWֆ;2 "/Wz!/wȎ;-#լs3Di9Ze3!B*;rm WvVd^;1V2l0 i֖5#݆ȰHU6xȑN's#׶Έ!$ ~$ڳpM12Im"*ج=Pa w$#0!wώqG%i.;rجMDа;Y;;2m|U6W9T|$lZ/~<W}{#|ؐrG.LȎLa+G:#MّCE4e8բfG&I%t|e wdӬY'nJݬ}\;2_=w5WU ELjWѻ\mzlhZ9, H dͭoH]am{wdOKtˎ47k_}X;YUb-͸;R ;ȎZU∞FvZ.4qvG.`X,jE$&Ώp7w'QIZ9 kgۭ&G k3#0S3 %jNvI9I<6dG^}X;;})m!ufB?q"G#uH ٸ>/Iuf<#ѯ X MȰ[oɼB=61X}DDoz[,˖l/HdG` lbq##[65-w|sɻ1#}#fG6MamntGJެʲ|!uxo;- ȸU6l~.ݑȣS|d]# 5jᎌ'":6pjK <釵!G` Vٌ-.% S!iʎ֎鎌{)>!̎Ű7Y6q#7U6KU8#WчɲoG `1tpGƠDä6ɑ=m*r$А(;[}o{lܑYaj|VDȎXT@J!ZmqH2h֦)UH?mYz"ܑEQl6b~^`y:9iH֎[D,#izW k0 !~Wvd^{Nhh#iEtsvHtّ ڎԯ2ܑFeCXe\AҾ͆ymGzl<4,K!]nט'B%j/P28y_}ݑ ޥ햌7k 9υiƽϷGy\ȄڗV6U|scCyRzٻ#yCov m6ymR;҃kLjb{|}?mQe09R~;!;380'fN/!RV)#ǫl*ްv75\aFlj\hˑWvGk]9RUݑ;R KL ͎sXձHfmu;a&#fXB'cI(~I\rmBdGZ^epGbX380ƘJ~#GNiXbϜ#*m1eU6jZגwӻ#}+wFW6+z-;?|B9Pq"jρό~[İvYސ(wdX)w HGkGʎ$vHT6(~X[8-&i(;Ұrw(fX;yvd[ڎّ0|8;2lN#L掌PZIj^h}P > 0jB4H"ʗfGw(Eȱ$X#MD Tp1ѽÈVIv4?ڬ]yeGj)&[۲qtHV[nK("n$8nH{w$!>0Aa@D#ɲ_IDrlH1MpG`ggGk pG޶Yi!'~$11񍡭I*w?EDwéY[V+SبS uG &dudGd{ÞID1ehE#!XSRR"r8MSg5lܑy=<ȁ\c r$Z G=ʆ+}*fbvE;Ґ!B*;R.wQxv$(Fk.K'Gzۯ|AȰ |7rِ}vӜG 9sG#w1,ȥ_;o⼮kG{jbTG~ Dzy?C,e2uSq -8;=$ڧ;2'KvXۤDwGkG :j:b\IjT9SsBGHZm6,;aHpڤ絙2H">0_jcUʑ#EvQ ll(gpl=a#VLȨMl4ڶّe?;ҤՆVP;?uwI>m|+#χ!wð):Nrd*Ymwϯס$u/C.fH|;QbRy@M ֟&fbEDԦHQڱ!>)TوZU6gf]<-ݑq9H;2,I<}NnTkvӰ;R#Gƨi@hGZHw+רՆ;2W"2b=642]ܑDʎܶQe+^#XvuKWӽ [3M%bRus,m6B%&"^WOpG`7;R0*Ņ; pU6>.PD ;UI\;ݑ2;A| *fm֬hlPڬ-%]lH$ qDܑ1XWxz"9ehXހ]9Qڱ!>ّ4U6͚r4Vedy,|XkFո?Wّ 3NjX-;eX;^e3fm7m7k/I*>sG8ێ=pG΅hV=6D?>ѝ# 086厌5M4*vX{Q=ޯўb"Iܑ3qG|VvdvRw$+UeXe׬}eɑͦ( b> ȷ%=kKZ9?>kFv+,/;R^~k!G0 GeGtGzf,O=Xe~{XrSkafm`V*GWX#Flİv,OSDwd:oρzŹ#Ik#9G|$`DpG9F_8jO3eY6EͥhB㎬07ħ7Xȹ8_z[lEʑ w$&pzc3N|dȬc ڮU6zX[i(!U61ǖǐYksK ͎|8 ksjal&{wd#ijU61>Xiqrj*˒7H#B۷ϟۀaj,ʒ `$j\ݑV=f4ّ(;2ް6(ńm6q |c8JM;o֮,&)Y;BvdԝSİipr^[Ay4$`VH9zWpGcj'Z9ڬ w$& G#1˵#1-qpG*ّܑ=;RU6fg9t̎ltّ fz$YRe)[\wKۙ&/3<Ȳl7;P]˔#EI k;aYRܨϧdž0Ev$Fk#In(ٻ#V0FuhwGƯˎԼҝ<%?ډVŇG8Û]Zm%GvRnhc;^_#*j#!>H=sq33Y׵x-0U\cC͎lXpl#2.8wtڜȑ߬lܑY&VLOgM\w$^ّak#ӊ iUjy.h>cCwGfefvON%;..f,r^cIf^p >c)nGD_ LKWU=aˑUu_Yam Q!Ȥ7wаzPvdA;TGfY{icsImoܑ*xrdݯ@hɑ浏m6B|tO5uI'zI~I\̦V;j$+ݬ;apl#39s1WqwY[fu #31Zi\#e#+G9 wG7r)ώ, ;R,+xKp.ɑm6 #I7Mmp$zlb1Vz[X;AA  a(a[WƓHwGrCv$3#/Eɓ%ˎ0am~GtGH." kSS˩KWMHl~-fpGSq"ȑs|y!#YD9r0@ k HTwԪl6AI;{Fܑu͙r꭬ gb,UkJx=dtڗHȢ;mReuGeG䍳#?К2˵l6Xe=]5q+]@Li[o,B6#ebf7YqGUل5kKwd`r<92;ҭF6k;?Y)浝#Kkf82h4jeZE_\X#áƹ#˫a˿o%N,58L\ ݑ창yMX߶y)G|Cr哷nr^2Eޢ vy?y摜l6n}92⎜Vv\#}6ˑnh񹍯:6(l}ȈH;rrȑqG8G#ݑ+;R &x냗H^MhX;OгY[9_w9ّ=whM̵Fa훹#=#ˬ!<h !*p8 a0Zw$ ȑ1XO"jz[(+GJwn$.+!G0H`d*Ȕ|vgg[s@FNáJnPז7"wN9(|c!9 kt{UWwv/8Flܚ'GȈU6jŰwwPҗ.Gm6E]#FkC N&"ϟo7#ّ%#09_xW9R󦹐t>eG;r ;Ɏ-[Û#{{#]GV1̈Bݑlb~qT|xxȲgYH%W9&>o4+i lU6 k.LVec?U1;H9yb kGَّ>DrdAcf}QMnU6fmHU6#Crwz HƘ0Hm ">*=&-8jJ8ܑ)>~$jg"ʲlP c "\ [a"H]vd*tˎ k7;otfUٶy#CVȎ$[勮ږԼ6 w%Iko)+l;(ʮRI! U(R~WE "( RQPD{B6m7fٝlΤ>kN/ 96q$}`܁+,e㎴Dو(Gc=+6'9(vrirGvG ;Rbmqܑ%eýXCw$Xmp&G$kɑ;Yd>c;#k4m4ݑ^#a96 #3Sr$bmaN|l9s)V]ݺ#LvXoEޑ%r= G#Ŏ񨰽#71:7HV%]r4~OC6װ{*R7ޕ[T*⼧4 SH.Ж>1Hdh׮B,rdE+֖V(ޑ qX[ޑ|F5,'qQ6˒(#Q648c0ݑ(yY kmIYs9D6ޑ޹#IB"pH/=i.G#kK,#ut )Ce=t JňTjck}zzΉTbmr$.`܂++ֆe]ΰQvmV]#$k/֦RHzGZlvгA"UTlxR!HAzG ׽#Exz(1UX9Gb0 {rkpvEAZ_bҞ' H+,HoOXEٸMvecXλ(zG)ޑv̴apGuNHR r&YV拀#-+ѕjXGـU n`*XmqslpH!>UjCe#]PH ;q ><0)Fp3ltaW9!bMތn _ϡ;R<9Ҷ㧀8I8(vX,tݑ`t@T*R)zmVZ-pJmF6#JI *`6H@HˑW {w$ ֲ.ֶ҅>h94sQH!(ԎzGS|s\ڇiҺ#=sGDx]Sۗ_Ezm MPGb0:i\. ޑB AO.PyH}8q ><00 +Y);%A)مmīX[%zG [#ʦݑ#wM-[ Fiɑ$#%^4~FوH=r=1bVzE4b#1Ly#0x# M Mj'^ՐcuiY4 qH5\tl; MkWm/zD#[q*]EA܄*ޚob˼-֖H!ܑkSQ6|ݑYK;}$En`s\A4[#bPHƑ ;e zGz{Ēelե;y )]ڴH=#Ej 1vHl6XMQT*\m*!)zG eS` Sbm.W 96bL! 82<}^q` kcw$,Gb\aqGz{e/GHQ6fa2"X[k!Ne;TܑGZHr4WQ6*aHo{G ec5QoFeÓK4' |@1"ˑc=!}ZZYϊHVj{;Q6[qw R>)q8vG:#]46]7S(u3ڒ2DO;&/ܑlUv!GzkkRޑ#]Quµ;"Ik6S 1X rȂ OtGTf9RpH Xĸ’-i0{^-j .]%T$AE*)r()bma^Zsw$('rgowwQ6.T2LPAp7Hi6UA`0;.Oi#spȂC]E˱Kve#-HBݑqJB=bm[ϣ!K \y#ݑ&B#{H,#(*GJ}ꞌo(wݑ M[F#Ő#0'kchZuzm M40 n`w[ r$F iw8ȃ}ZEtGC#-ˑW)3X:βEؒ6W{=0º#+TH񊵽LF474\^bmH̽#ibAޑbm/&x;qKi6tGI>?H$bČXm׌`0xLvGZ?ޑ[qIUL.i#2dQ62Y!I9R>̆#)Gbj**-eƑ@8#X; d$G"w$-М7N`0 t nYQP>-w#2rtS-#1sP̞_G>fb9Nʴ\]k.ܑvǪU%w׌Ibm8pGXM;(bm#%*bmr#%BʑxedqXtD"QTAɑEEEUD`0,G.X$0YH}L&Ju rH^N-Dc3U6.lO9+XxP:#F'H8 .2.gz1BH`뵹d>RՊ9_ \ ;k{$ t0V;aHR&7H 9I'@ {8UF٘GreXZ,ђF);Ҍ([ޑҒwENsH`-\dm!lԼ=?Tޑy zm SHW0`\-V96ie;'Hqd=nKݑKqޑ tLɎ.t\,<ޑl싵-x(ʆzs6ֈJӴdo4tR9V#A*T[ʛbm^Q6S#YXHI{HN`0r)9.Xh42 CL|'^Րu4 IDAT 莔U8.l`܁,#)j bOFhwޑHQ\cnH.za(빌H*tIrG*CwdQ6""H"ic0L@ׅ`_c(݌Kv[v(""iCFzYϋH@"T#EH䎬 #1n0K'#y R=m[\胖?1 S cKw|0crC`w$_t ƙ;~bm#e2إ]-PHmGk1Ƽ Xi \ܑ*xX";Rޑ^LYUK$=5HJ) t:n`txڀݑacSAݑ\4G8L q;Rz^HK mt2PPw$ Fޑ70H#}=jQQHEyYݑ*;zmG|m S#"^6EQhxUC>TXmV wޑpˑ7ݑkz/(;Ҳ\b"GJ\ح!lXBpbiޑN6k[ܑHU厲FQ6|^6i6 62H lڮaF<9j7}zZ ?wX#1#iTو;Rbmݑ汤R$@Gop|]i#Ew$4'kk=KֶB.Y1lW d*e*$I>T8pkPD"C'27ĕB ZxyFZte#H =Jq%Y[w$Iqv ]6B Q#m^Oq1Y[ޑ@weϣl'k e#;R5š9w$'^[JQ0zT2R `J\Qc qHkb@pG'kcw$|``vfEH3")2SzC rG:#;Vdm!ݑH3ƫ wd#^$Ð4 `t--ƒnrGXB*EcUw(ˑ qY#E.6*X[(Gޑ]i~<$=Y+fvfQ6ݑkq )X.A.!Jm#@ Y wd%6` S3hC4wwdqޑFޑXQHݑ"Xxjޭ;RT?x-eЛIޑ<ݑ(3U5\[PHR 굱;X56V7Cͱ?T w$X[{Gb0G=3S{Gf rpG%0E6} qNSݓѡ#)N}Vt.GJq7ˑRlĉC癥 Fr$IOR1/f0 F$(K~qH)jc9{dի; c*;t܇1.#t&.u8k-ƽ;ašy,]F ydd#-Hαھ%bD\ȑ41Qr#yk+zm`# ;k ,8};vYl0.`9KwGgpQN]–SQË(gBFp 8aJ)b ;V8ksB2ʆb<ܑ TS5HfCy>`0eαq ;R)F1>j 6V@68Y[ݑ{q Hw=qG [h\#]DٸIֶ]?Bk{,15t)X;^teS~ܑXG. C{뎬Q6 r9ڸ}$)#p Aw b#5ҤVU kh4TJ;8vGb0k{tGQtw8'k;uG&k{_-pM:nz.&qݑdmQ6>~Xە;R>rd( @h9,F a^LG]^ Rzm>d2>b Sj$e2Ǎ#D R¾B#]jX#1#;һŋ7C3[VqHv #Q;8OXw8vGjB*<+Fع#%< н#-bB^#굹# K66Hb0R#]P چl1&^ՐVq$HlW2\jX#15=dm/ϧEqHc;dWQ6OysGNqBl*F{TL>Y霍BtG#%Y# rGR$}Q6n`J;ʑfw$α?)BE#%DZt p! EwrCWlc& : zjZ`L#yQ6dݑDHqG8=7Tdzw)J g#-ȪpDpbbY 96 H*=\䡏r$|`S21$YK )w$y_-ɴXp0@bjsv?DHڎiH%w$8#YI'B'k[&yd{]lH EPGb0#] ^ MF*nJA>RvNxSsl#$C S5r$=e;Rbm"h73d'lHt5;ҙP`t\񙟒2Yw"G (-dmKޑ$k ,#=,F!TzGt6xfGb02,GbkXmrcq"<6D]4x;zC##1w#A ^HJz=(/u_-XMz'vN^)ne7rl8ˑ>"H6`(/{G e#`HCˡ{G yO#1L郋A[rDZ"CV& H*IX1`\/XܑOFو(*qXY2imSɷdݑ8x+SRkkHl"0ޑEND/lrG Gzv\0rD"QTA#r;)ep3ЍL&ñbqHA0jWƑPܑ{Gr#1`9K2(/ƃޑ&[wSە;RZ\%?-'++Y<3b#MBy AEʑ !)V#yy.S{G4G  =HO8Bˑ^C*>F_aGw$؊wQH -bq%Yl8sn(w#yk{#1 7nƯwd##wrGzslFe8#ͳg*)G :2]!Y7Q6zHks# A`0vG:*Xm\596Xı 7AqH"t/ge4##ˮX[`b#~$a`zqSk$*>Nܑ^k;R7>="TJb{GڵիW0`Azvڶmrssxc9^~ۿk/"&O>*HZha=֊+6n0L~>Chȑ|D"Y~}fff>} VF 6mڔm6vCٯڄ \~m>I2 V'O/o?x0;7Kvw7<8|x^A=o/52o߶GZ*++[n.'˗+YfܹѣSLiР.\Xlّ#GoZj\~|-[f;;.bn tvK#=yd͗.]j޼Em>x ,]4 GٿGct+V\zYf'O[.\~~`5kVF6mtʕvڽ{r2:[{S4W~9孱af._J%C2?T90ܿZ+n޼ٺukz)zK JtBU.jS"cKB"8p?5 @IoFS -|"e˖G+{,;|ؼys$^j'4-7S1k{8u߿Dj #| %G#HTR Lo+&"gA$ }?|O*ER99^t^ zGܹ?OII9 _F{.lJ˾\5Z|0|kZm27g /ܟs_9:?f: %JeRYæV#DmѮy&@ӫ㟒'F\@J:'h}:wb_Ν߶MLZD"匙L{רF1̊'iP_%xAr턄/>9,JV O`[\u"]]9c0o6un? ))o߾k۷)SILCKrn٬٬E_q*&W>fK3_~0 IDAT2dS áCd4\7)ZF :$5CP, I/'R'NZ`JVܼyO5<۷ottty}9ĉSN}4h_dHJHDO_:}[ѣksBsNΟ?|`w$ë֭[ϝ;OA_bj2Y<&4 aaaZ55j hRj;4 2 % ^ ;4ҠTm@puRٹ]I ̱p߿3{w_FN!E< {+H$I#B=@t@ρuw{Z`2)0~zҎ= nJΖ%ҵE7U9*p4*WJ^5U+|3O%V+/'Oe \@ ףFmj3[ ÿYCC@뛞>{lvH=zTվzLt}Ob jk'*ԙ3 TrMVqF0`@͚59N>ݽVd(}:T78xAUpim5i iՊrHg?~MaaaÇꫯr9ԴoCݺuknJ}:u5kݷ^رg}E#GlWI9yʉ0̣8=eX64}~Mu=T#q 4-yƍnᡯDF@\u^UH_.as._-ĩײeJHHHعsg?_;wkp>wߵ899yرO<ѣG/Ǐ2do߾vիW߸q#;;{„ h-[ԯ_`2oNQzKtС7n4k_~ veƍ&)'''!!N:P^=[hChkyfw]a^yuօ_oTeNZ}sg_8|8dҫA I3|0nݺiӦ9wFVVѲ ϟ?mӧO>iԩ={<|0grrqLvs ?.dlֹ}D2-uYa.niF18p~w۶m2fMرcՃ 9r#G;6j('n0w&M;Yf7n\||ѣ53g\|955U*v!::z\ מG)Rޟ'&8`[._޾u+x|/keaÆY{bbbHH#O'$+OS 5 Yp$&&߇.y7}ФRFشiScYKBdٳggOTcǎA͜93bgCΘ1㭷zѪ+U Yf~RIɔ3ĥglr;^Ӡ>hg'4qIz5uTERRRdd\.io߾2lʔ)]PP`4vm۶cǎQ[nիWoڵ۷o7uzM03//zP:wԷO*:E`,B!g? |Ur6c}}jA 44yvbZ>`k׮:ݻwwkҤɵk5k֠"h끣^zUGILLl۶-MK,iӦ +99FX[lǏ߿?::i|mh۶-zjmJ$V[ZGN:u&n>lڵ;w~W\3_燤=T套S(v:ԼqcDҮy3/z͛GOܦ 8iٷo__> $$ {`ĉ ,@z+deeeffv3&&mؾ}{AAWQQQׯ_g nqv(}׹}6[-u`oi7nt\pa~~9saAСCdΝ۷oO ;wfd3pFFV}?ܹqqqO>>}w}V޽{;wFY#""|||kk=S$G>KLLLNt]sӧhj.EOȨտcHLLLMMR!!!#OLQT^^EQ\WRSEEny略8Z#FCQԟ׮oNxvCn(f3,H?T*mePhbizر- -~rxܹyg޽zr6$Wa&>>>PJ.MI?8,L7UK*޻wgϞwep[u+zK.$٭[7g4㮤4)AONw/HQ6 44ô rHОO81t>]WMFYu~ɄZq z) ɴ;#'QWbեR9InN͚8bC?VdL4&SZjg \7ZIG#mHehGO~JLdp[;)_XmY!>ʦi0[wݼSh4 2Udm"##iwf)HdJeRj׮]ݻh>}Ǐ^@۶m#TJy0 ƌӶV-tʉGH㣐J:Ϙ{M4. %/7j8̛7J$C:KQhZK?'<R;BQTM?˿g^3*I&լYh4vrW^BBV5kT*ўPV-hР!CxP$njT*>裓'O^qƵjӧO a/_f͚|7"ӧOlٲd@vC>}vHt1dɒ+WT*$ Vsb^yeב#o:tl::*YF:/{ 5N Ç:u… :n4M [cDz7CǏ?M6ک* 6p]cΰqoi;v?~\뭷rYf䓮;R,Ix>p,Gz;=4}ʕ6RkFĈUu#(NLq6wNw4-shDhѨ)=MCMǗ7׿VMk7sO:mr*G׊^vlf6[.E^!wr.Gn{,#K-oOFK54w麄E2)R%J%HXl ?A%t=ޓu:*sԣv:t;O`V3ňOuALDvv͛/3F=gϾEƆ6iӧk׮mѢEvvvVV֪Uj֬YPP0ٳ,Yv}l<~|+r;~>0?Rׯ_jGqFXXػ;l0tx8qSL;uvpzZ ~ˆ 6l?b_xU ;v|WRS<VqذaÉ';ZqGխ[nrPt~==G2Y`NG3LPT)κ" [ުS_DM$nT)׶nneYϬSo֙3glelB3 b O5ӦMS())) >}!ǍצMaÆmٲq= E/ I#h4͛GFFΙ3:['LˑNx;PLLLd幖-[X "T S,G (aE.]V)Irǰkw Z0uj+5f9q;Rj;-.^\hтٳElcjVA2izf#u A| ^QKHt?CNd0@ JʑE1 $۷~7R目TQּ9aӧ9s͛s̱ gG+6;;ӫ7~ެI#?CMKt}c ﳩjL9F|$ ;޽{K.h),X0bꫯ޿?==8q?غukJx㬋/=Sk44q%aPS BPBm:T_ .>XZ| ޼ eV02cةm[(*Q+h`#jժ5sׯ ^z)!! 3v?6;wPIDҪU#F ׯbŊP^~eؤI5kMQ! … O>`J $A)@U:j֬٢E ttIzz-7SYQ6`27PXAbr:ݚo$F7ڥK7=*}EO]0i~:+6m4w_R칾V䈈}}Ch~ߗ wft'" yÇ>| ic󚠓'Oj4۰wfff{6Uoyyy_MaTרI]N{3>}h4FDDT;6 @ܺuیm_={{ۭ['Nݧ'|Orssoߖ?nGn,{ի_aNOOptfZn=~rVh |7~V-qOIɴ)yĉ}Č׮]9sCBBbccwu~"M )CNukv=ZW駟fzׯUnʞK.tYoĨ>}ZZ^.]ڲcGO'KPw|bVVCn?ywމ|B8݂B^K%"::-FΞ={Ybv:\fڴ)-Сʮ]kl۶F>>>ȑ#CΟ?P(@.m`/ jժ2NH\ׯ>zرcg-Lz^޽;iҤիW޽Foŋ%ɑ#Gy\y攔-Zj\ޣGovܸqǎ;rĉ;L&HНk{MŃ+Y9c݈2ɡC|:Tcƌ r9rԩScYKP( 0k֬}޼y3ǀ+,,䩜UV} bM41-[\fo]PP_o>//o֭qqq+W\dO<9pri4G>\ь;7޸~.\ڻwoff˻vڨQ?4i2lذ+WkԨQӦMo޼yΝ:u={6)))((h޽wӧψ#vܩhu0 +Vh4{={vjj۟={f?F5LڵCD"SSϞ=嗣\ղeTt.u}5Bqڵ.]T/]vOpp0=))IR9rdʔ)_ݣGޑP IDATr<**Ճ?^_7[ Vg۷o7idٲe۷<ؿ{:tѣ~C}߿ay3{TMkw?wL:05xŋmv˖-߳gOJJJJJ dG׷_Xѧ=W4C}FW% uGֺuիCfuzΞt>۲CZLy￯XW^!Iۃu̙3ӧoixSW^oPrmӦO?Իwo7n^Ñૻv[?ZZj$ɵk2`0=ztw5߿?+K7ܹc}vډTxmNIIٹsŋU*۷wm۶4׍ґ+oF}g={d_~~~YYY2l7c 4KXxqͼO?4e"2Ҵp_ iO{ 5p`^߹sgͻt钟pliMZZϖwSCf {vtJ CHST k$iii3W}Y|;0aν7o,q0aνObm IEħIøz=4M<(((11G111&L2dHkKjuvv6cIIIZEFm:aeggnٲe˖-;vӏ;P(7nl2c2n޼YC;ĘOoݺu~ƌ#233?cݥI*O^tS3az>}$7LNwy6f%!!!;;yT*5H )%Ҩ,Xlٲ޽{ udvȬxV{̙^2.\pĉFϟ?~jjugaΝ;>y233)b=ĉF)**{S aÆ6w5$$gϞG{믿~W#Gܷo_AAM??ر?ḠL:Ms3 nȰ^Kϟ>}oe˖h͚5;pJe-Pr#;֠AԦMsj4ZݬYÇٳzഴ4{}]4=p{Çh \tiӦMHݸq3guO?o^"̛7Ϧd j޼ /nݺjժEEEխ[wҤIEQݻwG}'цhԨFѣG~PC&Mrvɑ,A؜*YW^~mܮ];$e.d'iit4sА!CrrrBCC#̙fYzZF՗SVĥ(encEU$ )&d6[jʔ)3f7Lݻw>`HJ Kb'W$Lװ1#ЇQyyym۶=x`V3رcϟ?ߨQ0$Q$''Sկ_˗]޽{FbozO:e%YYYZqƧN9Q嗳fjذ^_f̓6mk3ɓ'Llٲ֭[o޼_~J߹_\ALRCnnnLL-kE٬ݻַ)))b_/[lرׯ/T/KH*;w|7w~ќɻu~T*]UG֍q|An߂>}ԱiB3@^"_萐'O G.eƨ(k6uk#=ٰ^>ʨ=RSS yQbqu<5 ?J*ЁC"Vpv_:RvF `ԩ~~~۶mhذ᫯oݻwOPA".mj9A,5tP]&ufdw|yE[^ E*VT-ɲ%%9vbq˱޼ז߸OK\bǶG,QHQ`CX6lr?؝3gf b̙̙=,HC[8fN aC? AjEKgֶ²l*4 HSﮆK.ZQ~w pL7tKwqn5=spsd78f:Ӿ nj_PșL6;8;̦̄ ][KJJg?Y${U"xb;C\VvJ@w|K?9 NSq @e?|ooomm)q~{WWעn(ڵdnB^/`|]kFἀh$VaZ0鳾8ņ,X8RtdȅG;W;***;x<(т`{M&=ztϞ=&鳟(pjя~cc=H$].Y>uO>5klq\{{;9sffnbdE%EE;:AhiDB㓓--~bIX nG}4Lm.)fgbd7g1ܑ|OXSc?2Z_]Udc@H8Дo׹D/|l1w]O&7~+;énzu}pN6%Gުb%mSm)7gMiMul{@ù+ `0U 7n;]&&&24\x}{Gʛ[27 &d6g6e_>3/~2sq2'^y n)mZ<  w47}bh϶8-"L̴֒ G7|w 6/5R;2ֶH۝L&5NCUT`E3PoYR۩ W՞K4,UdcȡXnJX$!?y5!:y:ҷuGߥv[kkkwyrr2tvvY۷|l6WWW^{92/>ollln;ejw]P]"^|d<^m_QG?ct\}~eڇtڢ{?яy䑇z('@ wddc2XXcei!_H:b H&}_t4`p䖁f^'Ǩ{+167le8L1>?,¿9Kҩb.}ԱE# _1ͯ:$涪3'% V=bPE_PpϾKlN'>TTM6TS]|167n0coǹ#i<i`ĉ---ǚK u= ӧnͲ,r\.WOoRP^^fE#,\D73 ~CN4w4k H40F+1kK"86ޝ;p-'Фq۷OTBcrCԄ;+IsO,Rpb$KX,JZ+8HCAmY5!7t\)\;;Vu~,ah0N}* Wxd8.#G'&}EQWq DLBil2LuTk>vnKxT1P(+fTF!CCCrN o`(Ֆdj/Sn@%D:p?GN)Ng BU>˂A3COgΜy7rZoJ y/Dim=rH -x&`jkgY*T[VLDuW5!|!8a :up_~9^w23tޜeb;=H0|yACQˋ}1]^, { \\} *H6MzL*rG(ц,Ʉ>0 MWV7U[t];ѰƯ}4L_%Vs'UTI|x|ևSmeH:l,&TDJ\FGG3_"m@(fڝQylV E $6H-UDŋ/o? y\٣e\S9R$ѥ' }ɿ"yԩz+wDhRYs=ɤ)ƒ&Bs{IILڿ{6շQqyU$9eI}V"IŅ vޝEauӹT<lo tVXKN!p)|9ͷ0W:x70Yʑm dJU!0&$\Wt֣Kɑ( (; > ͭ]g/\(%2rd$ u?WV;m8 9<?5kV"QmA%W$O8SE7<}.0rيߟlJn kgّGE㘵SQT CQWId6ʑg^;Ox>pwtRray_F KE׿eטs:l`CHQL秚Hk;V E$y=骐 I#ԟ㸬>Tk@O3PQ(n,*Q]dIt؝zS&Y3UGAvTT%4hY9/\\=NAohLH'ȰTڊrdV."Iw$$p(ȰǓsۅvV"yV<%\i'ѣGݛx,B YŒcG*pɱG 7`;xQkk췙GEWRph D EC9=z3g]ȥ: 6{Rv5E'3=J .YB-?~<_h!hoBj2+#ӱ'C3p[+Δ#ܑ2)"iU@ i0DmY$Z$Ş0њuz.x<yJTJSQ=Z 3ДrIUǐߙf44,ZVnPjW,@'GJ' .o:HDUwP_?1іڣ 9Ȱ_*V" ?6@SKÇR܆$7uF@ͯig}u|YɉՑ\~$?vXN 966Fdx˺#_'N1|?i2fy_= %" De`{X#щ޽}>0@i$vȭ5^:"J>,2b`(&6`YW+o& ,n1WV6bQ~kVNU BqcuH[CYUFN!Z5[l2EմhԛI:MC6V)vzm8 ѡNlQƑ0>{Q;}ݑ@І zmqw@O4]IXيdsYɿ"yС>`u{+yH=ދbe$w:=ɮY"$Bc ʻ$%o6y ϟ_]Ac|̈5׳o7Tb`YޗBf H?BL˴ oj]h$";"m Lw$l%W$ܑ%r07Ei[/ 22ƜArnxCYu쪏 & sԥv$Q0R"#eI*cTVUPQ%+v\nTYڑ+AFn6t0ƪk>! IDAT;#M # ǼGCIO KJV$@#W$^:D,=݊CyΜ 09thyD`9z{7kQ/N{ Vg/[H j浕ˬP E^{R Sj0GQ@OO|>jz<:D },XVFGcw{zw'RUL-ӵ^M%~D:%Y+!BPԧ۱0T1TDjZH#A0[:_mg/&e#jTH2 d$ɬX,&忋Fu0L&R:Ve'zey4qRnH$2;+J^ 9==--\tEpp^MGLbi5EX7f)"y"LJ8K _|T')B_[ٻ-$ݤ֣T?E jJJ7HB>IdqW6W EW^yEmJ59gΜI/;'+ˑŒM&Λ?w:I },LV׾ėhFQ{<>rY8^S')Y6&;fVDY(Z,5uwIM_;7(Ƶue|mvT"BdVaNXb*A-ˋK5^〽K%L'''3uG(l>EȈǯiyi;ACn(`E`NI=^Y+jȿ"o߾Çl'b_^zY'0B~ahm*7FWV-#,Hb] FX "/888yWPIR7>Gv_ػ XWdɵswk۳./Om? F`6۵- _-+ywd9Uջu]| rUic,V!GAJ۶I7"%W^仡sdQUc܄ 85]tRPȑvt8 vh$v{6=>R޷׻+CᎤ׎%+ 3Ą`2x{\ HwJɽ{=9# '/ r!/$Bqdl%kP$#?/3{‰'Ϥ388(S|mn6@U XFOk\,rYh,C?AX#7`{;oȤ-Ѧn^, "^旤R{1eM&ƞ6ozeKбi!='˩a7|S*7,5u>=mbZ"#.r$p,,;ƕB =|dHhDmbGCcB]dE]dʬhEajsk_˥+V#U:={tl&KR=A_F G!dߪvt߰>B#P{1μ"9l(7l.9vEa}ƲKLR^zTԣD6F(Vנr$ƱƖv4 3jEʼnV#[nsW6SxhNyH,r$Ƽ?ࠜSt)RBX(Y[Ve H\S< fJG󉄂5[FZXB ( 3{_}]FjLX  ˵,@V")gH'Nfȑ3}I/Lo,@teHNU]O?7@7)=0 z/E`6lVvbA08۵kLG/vww+.ˑdnQ&Ga)A᳼/C!h#_J Z_;"0ÿgapt0i "sYk%U52(A9mr;V_unܤqQ̰x]%m.䙾JUY%ڕʳȑ@/dRfD^{C.&>٧S2IeӼ0NۦY(*mQXq2Ro6HDJ8N^;">.\P][tzh@k2H R sH♾.}//#XEcܼS;i1Igyn"C8& 6R=kO|D`YB!h#w{-$:}}m4杻 ha$8tU$$)Ulh*!4fx5LaLH6I"n{^0L\u gJѺQY*U[-7$/XӰ>+SSSPHQ5-f=VkF:VdBR-#,kB!68\K T47" U+S/tȿ"믓\1!& ӧ\fQ0.9r;/<-H׊$O$fXwe3Ǩ>70ISO=%/Qp!Mڱ*9 mvsnٴ30Pdy_" B" ӟҩxľ}=9A[t GoLU4ER>5idV92YV.f1@DrKy$!«]D[5Nis;t DZ']\c(qE]u ?`t't%Rf#[0^3hB5S$1>G[;_vzzZFL!S$|@Lmqt1q)$ԝ9{obXV"?pN$_|׺5O؈_^>&Q7F5y)_ t9z_CIdvW5* 0I᧞zb!'|ƔV\DyE`:ӞG" =_m`P8,S Z02gh[T֬Sz[F@(`ȑ2H_ d棙ҹ#^{k{w<{Dj\|Ѕ+bȃ<Ԉ$>~𸣇N7Qvm~ap', E8aW4%"`0SOEљ:tpKA僒0&2k8~A ÄO.Z+gpAx뮃f@U>اǧ#$D}uƭ*܅k12c˦$2##)յErvEmi_Mik&q2й~ٺ=rOajkc[>r+z/7ڮ8Gi]*h$(DKEkk\CrEd{KuXrnKLed= d\{c+X̮"LrvE&-w-.@nNf/xT) jzSe5cּd6!jQ!Wc, laܣRzM-Rd;^3<6&&&FFF&K8}'NOOWUeXe+Я }V}do_Wi`1HJEVlK@>8c;GH<,O#ҵE~8/e™3MzXk;yem}UJ!qYw&-sciuGG8ٽS62q*Eh=PtZ,:VgC%nOux98^ZYfN ]wbu©3椳$FinwVe 06/\cSS@!Glm%^yٳ[H4~_JsLV75e0$ϝ;'5ÞX$Gr JJd㳳ٺx71ӡq".Ue*:Χ)|{y% ?^xA*T߃Ƚe ]Mm'd̳"1ӟ0̚5kF +ˑlZ[9F\lhgn4տD|EkceBI']ag`2qg!8AHLEqƊvhߑSAɩ]vRI:tPzNfy9@>rr,89[Z5O[ŕ;״ m_*W&o|Cq[o3O6L(00L)a-3ͦ,.K4:q.Qe(WZ6Z;Ln&+k-I)MkjBc)U3@v!@(^[?L<[Ω *5GH&C~R90N5rsJI3ձZӒ2l#/^(JdƕJ dٚ&J:WŏyK/0bLƔL0&̅ȚH qkbǓ}9\QYN5y+96Q8nH*Vmmse6chhH~6b1Ȳrz? :20XZ 9R5"oc@B.&5נSt8=H P>Y=Lb $&ywX9kpITZ l,hEw87{TMfQ+99L\6k-$&ytWS"a6ZrKM&&&2\b3Ar-U#at\tӘ۝, }qVr$OeYEnO)$i3 )ժHl7&qeVCs[Qn;ou:"ZmZm70,g8Z[HU). (%8+݁yUe)8SDEUREK9R~X͊AR&> BaIx2GSsnYz$Sesa)/F,lYE_WodHqP;E ]z&Lq#N!,!vm6 2,D=l}A"%M-6Jg꣣K&_~9(W.ٖu+jD"vJ t8j .$s?eY,N/ۛ=TWw$Pk@ȈAŋq!~pJnR(E2K#x~>+/jah+f cB&5S~e=&,96:k@h*y:\ދ+BJAi1Y~xQʴk(vp8Bڕ"p[z혔9oҧR ի=mT)ZI;'skuaYhmo-euXqP5*4hQ/)o B^7<+Cb/Q*hd,nZ)tS(յrex[VJ_^wY )H&R*H׎%}/`(Nk\)V"y^:)|Ez7{H /+^$xLj굓$Y$ FUzm)H&, \~ 4 ]͛"y74wmn%ccc˷rdL1593..q7YQhZ08|Uq]2Lۧh,]}CքPhc`&xJٔu|fY1WDqU_no͹5H*{^wӃsl#Q?t0gY5yJP3ٗf4jVrk@,+eqY mm'^&]- BafQ$֩'''! ~[Ds1XQ+ Ή]W$? )ndLO0^b呣 Xպ)UjP"Ƚ"q,7Z@ 0QMΩS٣qAW$ǥ S q 1w,qS(ˌ}E@_UlMej>8uJ/Naᅮ!V,in%!ߟK_ A _gJ"XZWtڦeo{lTזF)gj&R`Uu%Xs@hU!?sǵ 'j-c=EEOMMtZ^?@A^;Kw'd Le S E2;Ζ"s=7%}3&,}W]7Ar).Ύ~wAU5g&NJ$BqY>SLYs`0#GRGݿANw?^j]O2[_vejj1) M14;ɹd!9d^z)#G|H.Ϟnr֭r!$fwesU6P$ovwwSN".[‡ǜ{{s\``;—; SHw EiAT 6O:H-p'@`tUd[*ٸYĪ'b:KH"ٲf{dTJuee Cy |M!=Vd@hTu/ AMܹsYH$dtC^h#Ǧ[-0h HF}ɘ@[D$WDTdL?;gLElѻF"('nD]\HeHnږ޽zqT/0ƊQK_{~ٔ`y_rD PWt*KtWT^tt='OJC\&6)JtS˄?4){_AK>E2/}'`>7D ͖ OF8Ώ L˽/^H}zz "O@ =o-Y=o?{.L=e<-$G"{yz ̜"qfn$VQ,np 󊤻tٷ,G,[/(_~9GAFRG8;A0s@ {_h_"NkKI>3YQ^p^|8;+\l^!p8|>_0Hd)xԖ Y(v9`_`{LB$}X4; /br0^j .bӵr-xOwݺu+ٞ>})U'[." VUUaӡxp y)^CxG*Srkg^&k;?_H Ly 5Pf- S. _G:[tN65Z̆Ŧ/}BX#Ţ<>wyTNw0Kl)y?_~'pF h-fOz x衇~.Y\9ZX C,n ˰NdK׀=Z&xpe%Z5r\01w ܶL).B`BAHyeeYXLZU@ɔ2&J},鼍,2 >ҩN 4ĘD1_d1p= ,xrL,3I 5m)aY0, `1_O!a 4ñ0Na_':*ö}K_>O>٣}( Ī&_z)Om_]I<+=Q]V^|']0]Յ֩jO֯pqؽ:6ըvy3 ߞ͏Sq0?*~  d0!P^8vmhhg!o޺u??=dڹsgcc#7ݖÕ\}y;M`F7 FXRqڵ PQwƀP@oiP]94Q++Bh"g&ejJYƮ~9JP#dx[n]֟;{`uu[J@mlmh۵N;*+ry`G/E )-r=ۮ׀fMN^}T۟P|XuȾeaeo`:+C[:IT.+y-)0^H4hd<"fO e?Oa^~v! ?˝ t50@E@a*o|>y-ލaV5ݠ?u r JWTeee F^\p@YEboQ:,sP}jyFiK~2QE %( o@]6Z# C;ƀqk[[[J^pԲO.ҹ\LWSFo*QѠ^NzC[Py"N>HPܪd](jЦ\}T>;7 *odc-%̴}GQ?Lkp+PƔ11' @ CId:}TQ셯B2a0^Y>ZFB2trU!DÀ%a=|g뭍$#t!EPj?X` \jnёy%=ch U"m}R@9O\Ftc:q6n(U##Gi$T;RT:4UVZ EL7tܠ"ZxɳKڕW-ĉl"zo:1e(2%s몮E] G29"(6zG-uW9p1GIk׶I^!Enz$ԯ }?\l` 9RT$g?s㘮|;`fuCbgo~+*** SnHi]|#J:vQKBL2Yw}W/>1T*XG.(Z|ŢQ _$etE9fوK׵#sӓ`feeG[i֢j';'Z$P*Qyb1Hvm6l8UW]E%3X,2*#Y3۰Qn ?W 21H" Md**~㘶m3F#RVqƜAMʑI{UP_Tp&W4[b&a=9%n򖗗s`wECC/R7$5>I'^czR֩G̕iJZ;R8Eqq1]/4ju1.P cr5M$ fK-H9zqIIX,Ess3yR:]VP^T0ZX9Z$kцKOH]q ;ۚS숛i<8rC[}Ylq6%y M&lӪ ej =٠Ǹ*P G}j6|3MT"ApxU|xLYh0S H`δX#%S{lذ!d߱rwvk֬fJc;˶Z#K%[+j9z! Tz]1)X-R&AFVialz Gkqq*"y5ھS֪.pY77h8eNnHk2^?6z -R=۶mZ;Xݺt> B`*LY& jT}'0Y.}+CTGA)Uo|C8IzhNNƴql6kIKK-ŚF m%fsU/ MlX~G'C#\O7x{'v.@X}H(yZ[ !E"Q,00Ģߑy ل\ϓ}S4ſ,)nVRjZ3qU$!mry>(5#b[ 9֙Rnk1q9!qSG2"ÎP,"Eb -NH7-(ꫯ&ܲADXݱ^R1ݼ9Uhy#E [-YȢڛop>K/ߤ#ϛ @5c3l4bdTH,7̪ꢱsVŽ-ARriʾ?,S不{oBKS`_6{g2Sp1Le֮RH-Qv%u!ͥ,{ Iɑfhz1bUlܸQr-/8J)eeeR-n\;SFm}h,@ .n.nL%Aߜc M"΍U;b0|55X]6na|>mCvg]f9ky"M&}РI&9N J"{k,YhtwMK,&І ^EWXȀlǜ,-xFCԛ C܉C͆eZvˋ̽|=H͋(hkk#oĦThf=yX,9F& $Gq~Cl1#tn^%#E;Zb6M>cgyA<ZfC}(Zni0XY caF+h'jXI!+:zNӓ=a|GY*20v#+**˥~kYfMU6HK1Ŕ4y^$1T &\GʫGUjw:(>(X4X#oEїջ&E%RrăʳO~%5Gd^d֡ny)~ӻNn6/E:b5MFe5{/۷niX֬QHuwz] IDATFg e6`X2_m'QԯAcȑZ)EOnI -!フuZ莼f8%% HugiZ|^PNJu9yfS'SpI}1+4c=r(eo )tt֧vfٲT d ̉*eC j><!N8iUHF:+Ru5بh8rݺuRbY63*ДVc%)+Rdrl{F;V  p޻޴oZjmx\'7ubyIy&̓gN2885dْ,RR/$d7wk;"juPU(QU}k/V^ Hme;VΧ?sȹyGE=z4_1թNsͲz\Fu'KGt`nHu6 IOp򓮣}lTq8=[$n-rᎎM2kq:m6jYʔ\mc m2TʑW]D 뿮p#^!C9LPߞ[\2.՞X1ceIԆf|AUrr#ihZ',qiA C5PUTB6tNVr}R#2"=L%[{z*{u~[l\.Hs-~6a6o6L`em 8Rù\pyJPV~rPA Yt-8Ko`9JVAv6b2vvZN#i?$ G4e8CaYRï\eٓ/KdZYL #tQ*ǭo/8RVY nRuSl7;iNܰ4]<6YD=UAWS VD0=Fg5x-r+oz3{}Fe7E"d] Z%U E-'x"eM%ڵkv.ZZZ ! Gmk+Sӱ>a|l&U\S*Vpn8eW;R,<#o wD(-`W_WZ/6-I&-S2oNin%ZDƒٷH$2>>D C[[[2NONNp23^L&kjHuyt7_,i+X-a!;2J!(҃_7!&ȅy0V;WV uEG"..+.Љl@W'y|2-L󯼔Bim B!y^ܷP3?WBQrcbw˂/ψ"F4@ǡ8(2pdGX%E/,0Yxt}Ѫ}BHw&YG"`?.gqB  eTG?*8D\_j+!P1k(4Aud[[Ns}!dƑ\k0O<Dvܹuݾԕ}`MBUy)ZKQfjaj5w -IsĒ dJVߕ$K (>rA)Lt Q̊)b(VԃAcXȂ%avttt94wo')Mzu1?~2>WΪ{i1m5j\p꼋bT!,iΠפðNhO7NlȨI0I8NEɞd UZL89V`sH}b)-R2ׁ>N]~=vIKFୟg^^H/RR2Nqfh&ELI r0 1H\"R}lHDYCJ,*JDqU˲EYBx|")2PUcP@@e[ފ[;W~M~@qC^x'!ɦE [{bLBM];虀b4M-ͮ=~L\Fc6A`Yܹs&f4u:ףdBjju?+0W0dž$_ Vfb4ƍXM&S=n mNfmޑ?k:ny1) Bpq{y7<:{񅧞ؿ1{__x|E@:xm'Zyrwwwoo/W^ye||\B Ýwީ^x㍡!Ucz^z9I") I"ytD…_+`! \Hu3 gOZClvIiNtfXl}$ZJE9 K[Z{Ejjd?}ĝTj]rskwn!+M;^p MV/HlMwt3'cl4cX4}GE|2iZӡKCw kGҽyH<ЄB UVUWwj)쯠M˥Ze Sb\L \^HV\ZIt]>WJ uKʒ]ӯDdeAVZNS`0,9jϟ?קt$\<캽QT,۴HDQ}2 kdd$D6'U(`a1ʑ "* zB@g($`YB:֚i :[&WE}WsYhM!5l5P϶8w'#aC>yڹj۱{Np} q?_{їNM0<06(0Ű6I"H?f9h_߾POA=0IQNYSdG( Lx<~ԩ/ uR29l;=nP$x``f['inZ$- u eTHZ@bW7Ճ@><{۰V ںv"x4IϰMҼ MyлmQ+56o< 6yBw@ܽW`0HAYVVʑeP(Cg^paǎ,b{nBΞ={ܹB#z0[tUr}w:K]JOUUBT*e`?uKRq{@H,VK.cw?_bs3$xlD"_8 D@ ʔ߿_B زeeݻwmEbƿKyZ+4-4f~UVVUW"՜i' _* 4Ê-0.H5B|v\^ 6̎, XYiW|@ vI@!DG35zVJU-1 +nP.r_2$6ս >ͩa@=mѨFX,555t:S U".._ݐV7 n)B![u\Y =[ټ7l3u4`$8ҍAXeYF(P !һm`eh3Lj5)p\u@MF200f٩HdTo+&VDZBe hXtYU7;ׇIĦz|bcπDLˇ"D?%݁!Uzj-E$dDYgq$h ˓i"D"ʘSקR￿!ѱk.9,r> Ym,O-[h4Ŧ .Ft1#;z[iڷ>k3kUrQ#W199IӴV; _Tpy?Hl ̆ ~O+8O_>Nl;of"P<> dl6+2999888779BvNLLL&5sc\WW766r84fj޽rLz44fd#?qiP|i$XjPrHaՑbNmml@6!`:{*&̉ !@ EK0a,ZLIUdQ|=l!ZP2TJө>EIt:>LӴZfuرY[:tH}m۶{MM?SniG?*]]ѣe ?*2ӆ9X}e5 CctN׼?&&09yXP:!&4\*ٚ Bsg L_%{3"^L4>?hE. ;Hm?GC6(]8 n#Fb3ナRIWj $,G_7_Sz'Y:7RL@H'E3@4-fKӧO$% OKcNc/BrdNHBP&%gdP&y>6Դ-w=:D 2,PkF鲂,r$8Od.cƑٶ Ôԩ`awpa.q0 s IDATSUSbEyCH}4!JKpt!hZ޼"I D+=%Ia Z, -csxܧu600J3E"#$ :BBqGX (-KNY:I0X~?7i%-+dȻT2 msb:yClR-j&`*26t Ӵ9yo3i\FHCHͤ01eFf9{lXrz3c=tJkMF_^ E8C]zȶJa-VHPiG. w6;pZBvcHѨr$urū~t~&5\m<65:!26․J!!d -)`VmFhf'd B SR8&"m|}gEy睪ᵠHGgUr֓z#.)G5pcU1j4e:| ,׭|RP|ҔQ"%SNQUi``(e{)Rd (Ąjʼf<11H< +DhY|cg3HB!҂9^ \OZ$aW\SGea.%[D$=9XlT Hͱ.RID"[EcM4TWC ^z`kd:8~>_6G%(JX n.}tuJ# ӯzmS̙Eh(>PO=`n9m4IMOpHvPTRkܿl-RعGjJ#2hqSW#8E!,ڙ38E=,F#BAfƗƑKK?bR2 ePȎChd4Tbi$Bp8_LNm+Gݩkݒbih(\fs\d8aYݝN11UDq6(˕L&Bq5vum-2) hCXB oTC6z'-a l"B!P&"{!j<E>|xǎnV5[KjFsI" $@>uou].0Ytأ i[ .TNQb+wMYRI{RFZ>o>W++EX-!7E-MZjfzB,PT#Z#d,L~uz WP>a\gZ$KK3?f"TW $dLk]@(*qߧĦV?{![Lo!4_ YfVKFuc{{:{L&  Aߟ4vٜ(J#  uBm6]ɑ=Q|e*7U9rzhkks\&!M=C=ϞSH(#u^yHb!t?X˞cQ٧]abQKKKnSEQfggf3LMMeVT&3jɉ*+6But>Z޺*ʧP߶ G" GʹS ʑujЩ$A`nVGH*2|LtW s\*`AjmG G.ÓrC#7пl> HJ1aYӫbf^)}͏VqymWJd /J^ '8Q$G-`L "˲IQ Bbe T1ޑ0RdW2'"4lp\92ȥ|BHp.gɑs"պadIՑE~l)TKÉfs\>-H-&ߒLJ"_c,.@^Ǹc&љFIQKdK!-":TRxBX(…{z_fNtZ9}R9fl60Hre |UG 4H]H"B !@(@3QšK">KЮ)Ud (q2% rVu~~>{շe9;J;N?DE0P0 tWYE*Fe/3AGY.]JXa*]Ujl_a|_W,5@J$p0C5d2 agD48{*IR"`\NTxʀ9J,Rz֘}16ׯK1J0Bw5J'.`ZK\ :jf9uKn].ϒN. jW* V~vF1[2SТ kai1(u4̈́Ò^xaK]hn1گBbIp(tE0\>MpAW_Lݮ:鴉b<ϫV8까b&BDc{):O[RC6J /&ƤVr 5VeKe#l(njٝږ˵^'' .EbXy -D`MĬf fO\B-˲y\p\ĩhJ2/Sdk'"p$if`H`_E_B`0p~iDK LQW9ΨZuکh̠ә4p8<( X(DQAYI4-ISZFQ B%!Ī&eLkP$Q5u(/?Y~ M6H_hIQ I#]nyQV P<2ee0t%?+ݷ*P4~:p@%9e`s;s( ae?lDb\1UwEj-ht*u[ #$gݏ>{nkS l 5F BdYQVd$˜*3 3V A~r{?>q]C :]@B,=Bȣ(T2ǻF( J,COOxPY$ǣ TkNgf. õf30L)9wݳ/M# ˅ʺG=dB\Hhe.wk5tj U:@WZ ^?ށe9NєNmi/$9 h ,n/ aQ,V·epKkN6JB/.Ȓ)qvv`K^0kh$b< N744٪@yӧOSTVЀ1###~aCC(/^HcG={0b#MOi .D=9JR x(z L{e-˥!GD… ۰څ2>>>Zq {Џ=1??Juײ8 @/Ƿ8oF{K(j,zgg믿o>!tСwy>PlllT8;|c>]Nw!˞=7ހdkY^/< "iQV=t{T =B utxL75u-e_~틪r0>|[kf} /~5/fwjzva׉As~ r4\ݩ]Ri$˲Efhy,Baш kR'@zǧI]v}mRbՃFE566:VQG*5888$lllTu,Flmt %cuօxw 0/:K M69#s{Rw5ݥܐqgJE2/)U-?K{؄^L(޺wkAc4:r<Z?(*(nS772QS[]!ZE.)4˪׬._KJNhI/G+K56kNHPhBZvu:|6iKZYо8<<|1-Ƹl6iqcǎen---fY:2>>~jxX kn^,IJIɗ(\mc,cPQMV:^J7fJ7{q̿ !ԩSFoY.8u8T'Q8=d(^\jfdYXZm|Wx82~l~Df dQݻ !ϟ?<`{{{c'&^p,Ir9,v?\`)+#xOm%-7 ӹm۶b\T) wyҼp8F<9jinnjV%n[-S_ccܭnkjRC|~3Qq\pRS#lO}S?oV- e}^X`L&}ٟg LNNo3#%ŭ`W W*m۲?ٹ'rׅk`=zt{{{/EӴ# u?Vn]# _`&ѣGG(FA[ZZB333---wl6;Nټnw 0T5G ϯcP(J=k>E0kR Z[[7f&s.R)BȾ}ה1 m۶yjUa_ϯrKKK}}}<gYVG}4s.򗿤iZV|Gh42Ypuww477:SXU?%[1(bsaZkkk^EѮ5{8<˲/Fd2~˵mPEӵj5R-[|ngg(|>[5tz"gsss:Vuܷo_iVoll {v0E٥U6G~t&IhXS׿lۨ^et*F`Gp,ݝJ҂ho>N$,<Ri[zzd:VOmf=K aWBP女vw>Krw^8<\ga*՚[j:w߹គ _p IDAT2>j`69n=+Lm{1ƹ}L ϲ ~߿4r9|G3[)jM 1'5!Dԟ$beNcy=o='ޠ7g9;;oO$j)@$z^EQTt:D"^ʛ )]-]g\֝Ӽ"$V8Ԇq~B@4r X&h#W'<*eB$+y,fK$ <=v-o j!xN3{JΝ;{zzFLeر#Se6 fedtt1P"ڊ8kooϵ妦ydz4|5wΙoqP{糟g?ْ |T)DnЛ'~3XdY b۷?<|p{bO=gZ>|_6'RZ\:::~Wk_ӧ8077w{7|*UT.F p\ik|PcX,g``@$. 9`6+ѨxD;}t:v(~%_khZw=cyq1eoq{B\`KW!r@zk Ưjb3i Ho`0W.B3i ]@F!  :|I: DD![EA-w- ]PDVDQ---kEQB̩d ?E^Hz 2I 0`n:q6-t*U0T7,EVO?#G?ZÙ3g~5{'{p7ӴOҾ'ٯ}kEڵԩ"TRE4 DQ" (T :˜)H&`k$ Jo4@P`0;Vcj PcIE#! bH d""%B!tg`FBw&%󚨔(H5#au$i*UTEQ/b֭w[dʞ={̙3j'?ѣG~w}g?(~r9{dz4668qCTR!ljQjS>qY>,)EI\,UcBLHqt!bη 5맗J$ IR"G;S9.Q$.W,XG]9y#`Pq5Jpr6iyE дTJZqXhQBA_"*UTʑ72>?|[*uݯؾ}'ުu^w:o|OSSS&IRRJ*Y87P(N)d v{Iyn?QhĦh.%Ri`r]uRZ-˪c Pj6bIeqΜTɑ0UƲ@qBR@XdKudXVR LUa{Wӟih'?yUw𱱱~&/}KIҥK]XXATRX5 K z_-(,#u$)ss:.b@ʛP8k XLQa >hi Xd HbJ !Xk2ߢ(q3"8lԯTA / r IY)H$R xR O>}|g۶m+^$)?3`O<|A|{{022|XEOOO" I;ٙyɓ۶m{ꩧ>RJ~mKVqو"D" \N0r!)08P-`_L|`J#;odYv/O>Utǹc2d{ AV'IV˕!h35@UWdf~{YUIƉ<!s&'vAZt1:Mez7֯1<|aU?~i9> lk|@=t+GJ%?r;ʷ/`Qla'*K8gym!ă׬\/^׼GQٟu {7N/~??xZaH~?oʲ?뿾 !Dh$6xp`2(зt{Xvx<48ʋDϟ"?7D1 y;~::ByTb!62zywL.~#&2YNyߝvN@zd^[rd/~gZWoo_%ڴ~~_g˿ȗn~ӟOE+ !ylcʲNrdkes"үy˞5!kEqr^)bn^?.A"4ݍOh6G53_^ːlNcL}ʏ;lc:jmJ0FM|z$2c\Ӈ|mBkʧZU:M>=#`^;-ym{qCz-|61%m1f ,!+RB!ĝaMb>cpC\kGNXy/7^?I~ v5}WZSrK=Ud-|"wp572sWrRi9¾m6z Q*>r6 rB!*Цvr00$988 :;ɓ:* .ٔ/7"Ps}=?@ͻ,wK3J$mmt ;|mU`F!AY\>N@d-3~B_ԓfQ|$vE *8r_62F$kƐskaB!3ұx <痁6 U,,IkŘ[42ЦkOkJ):U};CtbK2n1P]vUֺ/ p!d^:mkV6{HseҒ:sB9lc-J0i @zdsBGʑB!cm0Ksn4@nml#taڜ曯P,߽F-$Nl,si"nn$ڤuH /(>p!VJz=k_3bo6.V y; I9R!wH)v+>8`4uNR! r @5,>;Զ@{f޿ggQTjNO9Nט2sXk*c\>>rR+L*K2]Ӈ|mBH%6d-Ze5*~ *[""'?uׯN9&_[,2e7yռt֢z^,F;YPT6H̪ӭՍ~=h^Nq]djZ ɫ[ C92cDE[6H֒2-xB!>MNB)<6f`2DQ7HwqGMˡG#2J>ˏ9ucϹ(EL3fռ4n4 kf[)|sn:|ӼV,|ˠ))G|~ B[&H!B4ªArae+vgc2F)_6+> @믙Yz}1Em^GDۥ $n}8tUph]/%.G{ ^K+V#F@}4HJNhk12-xgB!興`aϋ ѨkYk/eߞ1~dNO|\\TZ9:ՇCa\.{GZhA nX,yfZܼV7H*f󵏂"h>ssǿ2$z)KUQ($ЦBm.?Gʒ L>%ArD@vb RxaxA#7NJ)ir@}5H&I(*V2^!,BX#2n0>-x6_6,_(Eq֌|k4r^{: Y#=(wg?pTD~^v9@Л}e}%0{hʒQЄ+iSB$#BnnC)l~np`2^VK`P.";e߿5;7);IN5\mۭV$ )?G)y,ni2SVX;h q x4b犢(O}{%?!&62]O]D!vA-BO[#`a܏L&p.| =eIRP{@Ulyrc1Eam׌ b[׮X%g2B)7ks( l& 6]cjJ!d浓$iw_~4(#X\iZ#. ;ArB!bQ\0D/7} zQO\knw#ӽ!6 D(WٕM>zZ;_97PǏni^TR^4q-bhSrN2-xh)BZ[ .f3"W0>>Ya95|s:z]Gt @Es. "喩TypwvRj szf"( tCFGy, M$tҧ, >˾L)^7*Іh |ı@|k !)G !YVڤ)97i7Vs:膕sghf_3j0~̱&߇X1F#o;k*8FsX Ihka\7ZvU咳G\&2kKP#h#$눊i^ݎ*HB!Dt$I5oq~`2t( Dg7:lsw9}| sz?kڜp'Lo7ۦi\.zGs ]=JX`H/G@\^ڠ qݼ6 w^pdmŋՒS>_[$#B8O|6ee 0pmUY]\vq@9jĎF 87H;Ɨ#B̻w8I*ʵzʑH]}g^o\)i6k(@8MhSOBDʑB!h^+&_%4I xz_(^u^#lItS$vMD[ Y f;P̬Tȳfsԣ-} XF1;[ee}ʏ[JKS"W@Yy~gBrB!'UErێd2t7~?]rkV]G{@UՖV5J5Lӽޑo4<PC~Ȋ!fRX6% ol57/nnpGc\ EQQs|hSbJB<RB!D}h eiL& !#1,H) TAip<9af ը}pQ34)Іh12Dj .L'\"|}djyι= lk۟Z0;{d =|:"k ! y,B&vq#80RE&imGb @}\[3jX~pjJvGs{YۇN8VktvI"=Tsd-ji bZ_Cꃿ*G*ݜoi/yͯۊKe"67%n(QOm>AQ)6BB~ !٪U'1 i[pauxg/UP~ 3~_o[q!k4i^^̱/Gg=f7#Ksݯji NSet!P-$_{)lx/6YhRB<RB!DCq|ttV4&IIJlٳP߳׫3xnXt5:M^g*}Zz_qK> #tbՖ IDATFoy.gC7rLn_&>na^9h bf鈊EQ,!'B!˷7J -b6ymUX}6H:޾5A/P N)ۘum*nF[܋VV#+ ))BQ!pMQp C_m$ ^,/n~FZkx_ 8Ar5~-jׯDQ4E636#HSk8VLL$R<ymu׃4HVjZ+[$bB<RB!Ds}ht@8/ٔ,@XD|lKQ]G9[ګ-);ǭ+*`1f:^Vi6WsM/ l}xx C}59 C ̈^?)|(f/sko.[tei].}S4e6z(}Mԝd2-)B{`h?V9Z;LV6>,ɔzm&f{vpۋ ы Ԏ $ɽ\k6Kv}* 8 I%F}6iRC&'AymT߇ko) hcwX!ЦT!笵n$BrB!Vohsq`8Z hӬ.[3jXkѫW;- 5z_Ӫy|\k߽ZU~u<PnZ_uˑp΍G(l]>r^[ʑU"ڔ{fqlejF>kuB쏼 !~ah`\:ɐZUe`VGGMˡӥI/,?bԟ>;er1e3NtVjRym-(FY  x fyέG"ʽ Ir!3gYVGHVk غ-ĵ|m]E!&H!BZk$ gEp8!Y3<@{絛Us 3'OƮ:. sv4g^sʼ~ɋ%絭1 !P I@l 3n"l'(W!Geɳ)kLjyJmF^$seHQf1sN浅#Bq?(V [70nEP:ddXP}v6;?gkU[mDDDW?slۜ_9έʑO ;)G"h$8MOz(NkK`hA) y3yBORB!Ľ 9<Ħu?2˜,/hڪ%CHZ޽լI7@uc]Ck~QeIykzJ)jpm%Ѿ93DZ[ 8sGCFG%nC)p`>_]yxxtx)K086{ )Zu~"l&B{GʑB!7vnS```8K)?ڼxXڀ=;xY|r'off:mtLKxO'"?5hKoUEf_ Ihkvj疸QGQMws%NStE N\RE/D@7\Í4t 4M4]+ @E(*pHX.X ?&vzm n^# )KHd -+B!DCZ-JFb>gm:*kTQR jWv^\^FS;6A 5:r^V1k;mz҆#!ڠщ}4H.ʖP\fV !>O_!B'J)_O:f80&k678jwoY?~\?xʯ 8zUC|o2\cqw:"s ifL)R|99" ѐІ$憴Zfym!"H!B3rvc8eYe !>:z=):FQkl ZI;쌝V5foZ4j~Yy734H3ڱ1L(d^ZLp]/n})tE&8ۊ%Ц8ϱմBRB!=t..Z?X:|9ҶԈ9Jx6@T/zcf)h0gLosym b@Ew$\ðdD@=>-{żH9g[bm̦"q(, B#RB!s@d2iI@a>> (n0Tn(5QO\|6g'^.=U :֚Xo5'o|[Eh\@]2JU?Α`믏{$CܹDz}9(ݜoMWBb64HވvVh#GoB!Dmml5X ϝs4M'`^,Z"D͛vө[:7Źsh]$}TYR3$?E<8[ƀlm#_a;j^[MK2f^\&})$Α*Iqx'k˼B!ǾkϋscPsÛ>?oYzb._ 4)kjZYmtU˫,>yS)1)*MG^CT2Yy3i+DH|9m.S)B{ihst]hr _!2͵(M`;˥NIZ1;gNOWmNNv)t 4M4Wݑ~M-*fb/t!7b@֬ԗ:8 )5 8zY\~>b`2;w9HWeLe/ @! _;#[jn8MxGį$jkO&eȼN( r NkSZ R̒-/)BO*_``<ym$6`Q?@Ǵ}pu|̪CJa._ 9v'"dsz b[/?j,oYymf723u{7ז#/絥[`vIv]%fŦbX#Bqm]lUJ\Ykg)A\f) 7Q$} @ym*ѵ;AkoN`β,_\) =3j^(( yrrvLd*KTY9DM9!1[kIOz="rJY Q 3b6'N{zaBj/dB!7E'bf+0F|dbY@?@wr 7{eics_\lfCnS$9? = qyO kyka`"`y>2GQ`CAPqG#\ z k1 7@Q)B{@ʑB!V6ant:t:QAk|gmw_ltgY~PG/k,{ 4G' SvV%=||!rA:!x}$*vBe[,qSb}kom @j5'~|m!Ľ H!B{^/ImKsn<$UQZc lN_~yG;Desmu$IZ)ׯU'KY ft:(O Rc9y#w~G6x8\.frQJJ`!P#_;MWݍy#QQ9K 9)B`ht@sȏ{ۤq ]6{ggѰy),K:XM@ڼ\rY'+wRZ%v+Y̬}$V kD5HZ$I@$ :eml@z+2}J B4#BGv{تUg4sD@T4HFY ?{bsR*Y  6yn9oz0ͮ6ˑFoG#k r0!`}dbVKdP7wGMڲ>2P@m%@Xmn@'H!B<q*{a cѣG*ωH|u6=y jؼ6n6C{qZW42U̼^UoOހ㸢/8Z.Ѻ[ fd^ LnHמfWWv(E .K ؆{sQ"דB!x nhs`2DZ 6>p߳sPՍ<ޭ⛯Yu}5%_ž}#Arm  vTY9(M9Qu$ڷ4n!<)W7u]"bRF:´6JAL$fkDEB4#B@z8EHl4cf}]e`NT լIszz6 l\zkr ,Rlu.w^4$_ ^T`Wk !Ie !B  88R&`0JV#ǜQ*ůqe\4 ZL&1qtH/SPʭ/v`Z̢N)SYh-)ҰCfNӴ,ˏ> F)WL (vmlFu> ym!D˺B!8}v6yh4z W$cHkYe jE]Y%픧'7/ *`1~6DB|LʑB!xP~E* -(݂qYQ7PdLDq$ͷ Z6KZ+w:5E:^n|fc%П^P h(UG"׫jC<\h8!ͦ9mQ̬YT\üd2!Ǥ)B冁6a80/m6&t/jm3l kq^,l Ņ2hʂw ID~Z?㱯U< X "4H<7&_q$7X]6`^g3. bSnW)Dջ/uE;/)$F$_[X#V!6[1\NbD?c>b>rltmp_YĒׯ^Z=]t)[YWYGb>_Vu;ԓKD$RviL 0(@mic9kޒ IDAT> !D.B&I?pҥ)'ɪAhSp^bggh^9;5fNpv%,|WiѪףF{v UnRY (GF;s7C k+f)VkEC園@IB4MS~B!ءռVc9(C~)w}0ƞ_3f3;. JS.]Zz=ڒ}k<3p4VU~4a-" 9(>/GZ"WL9[Mm%f{es,h)G !:88Z#Np614%v R! qGUs\Ww})$ڶ۔r$.Ǘwh5]k 9D浉yz}$ZfV.՞ޟl^ cx2u Qu: )NgE(+UJ͖5sN浅"H!B<@l5m F#0ЦQEAJ*g߼Ah@uSs$.nJCe5pˑѣR{qU^`nNa#zPC @? |kom Ykxw+DYy-璯-h)G !aZl״8L&GGG\zD\P~6{GG#ogϨNգ,)k-ЦnqLZ.ZhwxS#Zi}Hf7$-~}|>:!F) wM{/>k˼9\!S V5 ea"YԪtYztlx;Ww|-"չY~絻)9l6/~aNZ Ie Q6>:BnD7XXp1w}@ZzH۔`I@XT\K[K2t:!ĊpB!ă6"h4y1GihcO_s\@uc]AkfQeAE;o\kW/p)>R#kR*dc%{DaO|7~^|WGn%q *6]l}qH|x<!J~B!حUMBCŢjiYkЌyUG#. J>ˏ_z%pu} Q١6l#"P==ZUz>~?$40zsdj^{es713!p5#?k='m nhA2n/. |mBq3e!BRJ6HnU( Lá e k)*KTM 1ggUs^ۜmnLY/>=^V)QY13*K8-`f"Scsԣ-{..Bz-y4f犢h)egU@j4Pm2F浅єߺB!aU<ݦV۬<Iu׃4HnIOM\E!-IB4#Bnudk(󲻹V)U/x6%5HPDJkhӔr$.' .^W};!i60!x}$6m )G"Z _RR,SΩPEEB4#B$Іp hQΩ_I~@exE W'-N9N';:Z]*K\Yn,IVEDz}u޾EnE`FGc0;\ev8[(fMQDGoG. G\$;e+b@D([ї )h)G !;::RJm.>8y>a]AhϞQ.44}ف|m:rŠ<11M”Ib}xj؋ h^;M9MySz~nq 1E1}Ju$=L B!H!B +yN5Qoxڢ`Skom I$e^{{~}b0 Bqw)BoU<:V5x<^k;kUD%m|;vf/s{~ Z=o܌* * fdeUJQ)fsr%IEnn/(|8`~4N=HO*i6Zan nQ)tYB浅 H!B<|N@)< `[{ fϱq^;pHX.ZYټ#x4u J~^1fP&,Xr,"5-!B:::""t:!\ LS?ԪwYBY=K_sAԠ@T;/Gbwoxż6Ϧ>C1ezO]kK9rk`Zւ Pk !@ʑB!$hoh(i}i{F=SjsƱc;}LfEI,RE zESr2&IT\b[:up*)`Vt80SI=U,yh#՜pN4^]]1$`0 I3CkydHS8b@W30{\XJ3Z(bHkEQ ۑV)YU߻Phs$o m$Bt#B\){t: ̘Ĭ~r66߽m:5B㼶9?g9|qTƘnm~yWUl* X$mk[4#Ml=7b4V>^@$y=d"wΝ_y\53_~_[) mov 20Oyb3bN$-xTB!u6̘LLs";} [Hy6kۏ~&tQWpMFyB_'Y,`|bD&޼_s6|Ǒ=)m6{Y ^Ƒe ff7ү-x\];B!FYAklKݺX,21H[//j4*,~0ۿyӤA/dxKӛnᓹfA}Po^=SUfhw`fldP3n~> R"tZ͛8ґ͟XfNQ6]:}_{Z=M @ƑB!xv)Y.X0b&.K0`3x [ P%4H޳$\]]mY[L/7 ߜ&$YFo#%o*^,4Mۗm=,HfyBh&B<G !YڌF\56ֱɲ,@/hϯ8Hn{2&TƘ>yj_\iͨq#q>26Tu-cGE%J׾uw1|gd-LO$wc?9qB!$I mf,K֚v{[IQ dN4k,I'۷,Ü"7٪3~vfA/*S˲R?m޵>Ӕ7Ӗ9MW/y֡vU|z}oo( bqwu=Ժ $Ц(^O>4SQ/&"k71̑;p$_ţBCƑB!xELbX*Z,He futԩ] @[$:9;Н~m\ilGQ.?1XXc:`~XV^s6Bo9[ 'SlwnHϓ{/I&^b J^[d)Bgv`:i׫fq?a3pq\VU *1jc,{gZx0^hCFPs2\ WSf^VƘo]N)}@pY~sRh+R#ym!#_B!X!s{//<OSeaMSct֪^[QtH߼mL@ԝINKcͅU&%jGP>G(Nef5Qr=wHXo浓$*YKʞi1+,HVRhtז!8R!:}b1puummA]=eCbv6(˒fי~m܌[16ݗlG;f;fWlH"B4NXxDƉ ;=`֧_IY۔V mik{k"\B! !i"Iӑl1T9b^@|ImwS4g3_h<'5=gϲ)\{cL[,ªoM̜~R/`Fqrr fT?=yHTUXx,p>2s7om]n mļ.(L$k# ~m!ăqB!D7oZKZׇX( / T&ٳ34c?}`; I7{-ڄZnQOuZV!]$ u:>FSW+݊`$ LgX͇ m+VaB!xn mib fj圪*RJyߣvV(I8ҜgfRკu^{؝oC^{>;Zy0? qy#3kRb׍wGkm` }߇92DUC%slB H!BuS,qgg_ޠKUy(BiXhc?~}̭@]`^.UU˺aslk# rsf-3SO֗n1#_]{ Z0ɽ3m_$ Y.H^;rK^[07*!Bf4lW֚8M]4v:3jϯ(I7oY[4b󋅝L@ԝINK鴕\`s/ 9 y8jm6CH"6wGI(렓0Q׮4dEf1g4y B<Y!`kÂzA2ⶠ6QW~nr>b,ijׅ6]Gf6R$p87܇I7 HDhv 歑gLvq$% o7mlORU𞕲BIG !#B!@k,W_\^^ifL^UKgN$=sIdkY s $I(Iɦ_c?}೺QR`FIպ8fk63pTs(V֍#:a}BM$ HC䵣ŢR)BJ} m./C`0GJ?Q;O&;U寮—%v;CC0s[[~:eATaVQ!9dݍ6f1,o4+e{V2gޯ ]$NFqsZk !,B.9(fARVnaVF IDATn嵫ё }S3ymbڵּvYȼv#_ztv>{Ix<䵛f.I,^(~‚#MƑB!k~4;M 'gv5K@,Oύ5'G㻖G,[esjjhDOvN/ظh#PGN527<<< m6Mh@BXs&BXIX,,B+B!肛B[0ZWJqtiQ dE71\(Hݯ,l@MiXD*qNKiGj$ݧ Ԕkc=x?J+0{lW1_ i[|dwHoLZTl6&۲WB$LƑB!_*a@l^-%cH)˓+@kƑ^/F9;]GHl6  m= Zaۂdk#U~>8@LIN-w1Y?gʒbm})3Z_#cI8R!+T)Xh3X,ª )BC/ޫs\Ԟf8jvZ.1l''<_s 6*_@G闍_Gnߎ͂|>&kg-)\%Q1江Ed8R!Ǒ;ڬVXWl,H&j|м[^ w-_6ki@ڀsTh,#j Mβr fdG.@o*Uީk*fS|bFkN0sض[IM彖8R! p.$'O^{1U @7w;} dx̤TlA25`؝S/s[ax8;IbP s _$ q 7^ "B\^ZkmY߼i8*ȑ|o? m|v\מf B'KB!>6*I>\r:&*WWl iKVSY͎e ]PƐ1 kƑ|jG. ||$ ğLSj| ##|y嵉( p+9m7v+]]eUU,BIƑB!:::RJߏ^ctHvA} cyё:j42\gbᐈߧE4zuHj2_M<ֆnӐ#D8zbG:*hˍ˛|I̯ym9ِ{/IM ŜYBG !B|ߺf~, \ S$~YvN Y~6׶92xG-jƘE6i'f4$We f$ b涗SNȳ>$U|}Uz}8G.0jKT\G '~oBG !B|a0@|cX,!LĂdR` ݏ9,5Μ?LM&ϟ-ڬ$_n9ۼF#G*ka-$P''+:M{<1ι(y`0Z39TLރqZ䵣j*EB!ߧ^촄5Yk7"\Iڄ߫5߇g޿gfR*i6'5; qI7mUY~ :L"G1#@INB5Q? DVn,ۯmO(Ib} $ym!ĽqB!F17ר*"4u§O9%)vꂤ1ak4t,؁}Td 37 C5 Cﱟ>!4o~/~c@)D32$O 6<<8R!N$G!ϻWMX{ZoeOH޼~ׯ9;4DNfJd8vg?~`fbSUfhSRORvvCrym^\sU,p>rXtfnX GMYJM0c<gB<B!D7'';]]ZcL$|I\Q?jA|yR&]bgvg;*KxoNy헛G~7@UcG:kTFENMS~ym^,ZyNg~ 2]z΂J_M%6H )h1)Bh4ʲlBf$:1p^V𞲬yk\HFw&&DkOlg mY9(YټxQ3"wK>&wG^:z>2Dn ma8,_Ar׾,qB!v{L\__#GR!y6쌙O?=Tͼ̤T]Ks zhF7y`$ fBOW9qLtj]L3错ciį_u}M^[Ƒ-*ڸSZDrA2Fb J^[G !Blw:.F#K93[kR$.b9:9AgX(a2e%FH7e ]đЇLEx_<<<7oɄR~W19asȟnG%"""SD^WxLD^)'kwi@10cBko'ym!Dd)BBbԓ l1CCJ_N${3>:R/sL^h1] lk/; E~mcY =&7#_oޢF*ko Gղb]hMÊTBV8R!">6Kx_`0|@zv/^ 5{vwkiB`tsQw7vpH?lGЋ Q%m9GDh_ȓ`nC߻PhcZ/P%w-B4ӕ- !Bth4JI܎./y@*dR`V7ya FPmBss;Ȏ=Z#9Ui׹Y#ۏog{(6f`J٥b&#y % o_ #<{3#RE֊YĝUZl*6MMBG !BD"} m&yAB@ƑB!օ61X,Cu^_/љo+i}_h\hc?sf35D\+㓚_G D ^q>ƑJT_GFulזЀB,T"֒wBIW!^iZӡ WWW58GI^5 Sڀ9=~EM&ϟs4.zYՏ짏|@^.4E\i:EDY{fq^O4!/Gjn}S~ mq vieHW$-h)BB婵44  bp<Ǔkn>kX~{f&w$n0ΦURy|eלٌQM d-Dk ΁~A9:nEfk^;"=fނRj<C$>^ڤ^fh9|>gB7\!B|-)=Yׅ6*彪*͛)N]\wfGp{rv.66ku?hb; f;@r} f sWr67m6t|Ӵ'S1̜$۬9e ~Qg,,H6/BnwHk^Ϸ^hZ{Vڦ-^>=93K^[ф#B!v^ܩ:cGJ7>XPOƾEfP^l#՜p+8y1|Z8jj "xA=u6,Hk+G#)wl%#]I^[є#B!vvxxF8)K,'"nLVZ%w,,S \($6ksv̷}no\. ~DT >|೬Z 19pjK9>G^Ni0DkHDҳ Zf%]ΜY謤, k !& !B6q[ #6bARYK֐RVh>H ZgNH^YZ3n{Ĭ mnM[ "yA2ZX y9jﲖg3"|5r͛á֚o_x}kZ^k_ mzZ&흲eAR7sQ!bs%_V[I9՞UWauj8'5;kqI߭>O55_{>RDW"Gf|dQntnHf$HRa mRhG 8R!b^o<4Ct\&I?\Y(G⽟]H5Y9y }dZMU㽟f{`0ZSg O\_39&>"ϙs/#ĘvGಬTM9YM^Z"!8R!bOɟv N&ywc94'Wh@N]\ofǪ7ݰ+ym!`zquͨQ1;8ؾ I[#(4o|R" mt (x˖ˠQ;! 6Fy,H !%H!B= mVE{||@&!#!oY_9ojvǏ|ϝEQTUڛG@^;I%b23ǍNGd^Zݦ$I!Jw 9 n'- 0$BUɶ9dB!Z/Hu|>Yo࣪ SIw~ R6{~ y^\Ȏ=Z#9Uh ގq}@M Ѩ""ϙDDDii|H<@epShc[/~]h[71,B#B!G7r )Θ~m"ǓkSofV~w]h3H:lIkj2f4 {(מ]kkg:x|@>oG2wf#)m! uq.v9I{m-$-؋#B!n6 1F)I"j3mGf I$(xD㧲Ẏar 﫪+wxxvYZ/Hp89X9egzhK/߇+7$I04m 63_%-؃(Bȋ0ح$sd 7o{βO%[g yBkO\gĬ_]bd^_#|$JSu;mvH_~_v{f|_6EH6IUe&hϓ#B!9::RJ׏a62BI\/W{{~)iN6NݧOM>_G9fso:`sJ^|$\cǑG^#ꇅ(Y.ɇbڲ )ؕ#B!Zhc2PEeP.IY%}_ Z期NѸ_M&~GUYo2AXk9|af(7 DѯKx"[cH#w*s^Sf.nG8r]Z3m(UUBU9)؝#B!Z#ƜyYO皲懷̬옳Sn4jZ-kG~X)͇q10Zu7 1ymc[ZF#Ȃd&䵳;{ݔ eYV~!ďDƑB!M `"3 IDATSԍ9X^YSȐ9B + _D4KF_\9ouǏ|_S3BJ(/c"R!mu#z!|J.s>9"B}Nۼ ?rlk9ٮBH$@)=)H^[H!vSh=:=âŶ6%U,3ms;LrN%,H*º޼ i?}dfNQr6DcNl歑gL-@YF|b?fRm" (f}tkoT+H^[#G !B興`=r;)"yjl1~3W9;CEf MaOl V~mZ}x !ëNNֵ;oE1y͛z^ v ʡ'ZieZc?!H!Bhw.SJkZSw;dup@ͶZ=_]c ,($͞ʞs.Zzr 﫪Z,|qM봛N-IsD_;tcv-߂ݺЦIŬCMO$81Rh#؍Y(Bюu^'oBADM~$?$o~eLs@5tW~u&MaArve^қoۻ_GK0C'OK=6'`8s7 \َl],! sד}qb72B!h`0zʒ\t~~41|y֒NoY2߳Tڬf|8Q9|k%{|1V΁~A$w:=\ "WKf^VwkFy}tcօ6M~f= o[ڟ\UUQ,B#B!ZSVt b1 @ ,;c ]鯿=@[qLr \DgPUEzi H]z>rY@H( k[j8pwqӯl8;pwAR)56;рBH^,H !8R!5DK0/09F@,_~i]̬ON(ofG*9=E m 4kF#z5@v$zfv9ED/6 ؾ%B(i{4-Phc 3k߭Bd)BuoY |dD&,ЋL5J; 1Z 8 SO7㯋3]`n81޼>bfNSyQGk`flQ*b_N{$t|d `XMqUjxؠ=1Ib֫ӗv7H^[+B!xn mNv)0CnvZ9G\p yS1繝\vF9V%,HOZ]3sW+>*w>Q p뜟"d<ϿySzR!\h8b7٢BBԐqB!DFQ׃8y\_\eluKޏM?{WY~73~_j7ggZ^;`#fQO.A}^F㨰#{ ڄE׵N!y5̜$qmm(ЦVGsk !qB!D ;ED/.E$ v,#:>A9r:&Eި~>g8M]gRzUU-=4Mس3Q*0C)Ĝ Nmg=B^4!b&|2i ,~zxo,ߐqB!D˾W<<&f]x6˗ԥo$^!negO\gĬ ~G~Xs TU8|2ւhdx;2ٵKj͛B9Z64l{$-' !B,IpPoj9qs^L:MOu /\H][{:mT7vg9N nJ0T/~9WؖE^.Z87jwy<{ Dcl[B;sRڑڒBl*B_ mt&b4D,Hjc%jvа9:׆Lr \"kWWW{@kMi6 6`Fqg2`~9kǑt|uז׳D]IZlE7}sBqKB!hh4ʲ ICl窪 l\;-r<ɼ)3Xſ_3>>V )VhX`߼MƝ33'uWpb 03] &@y8@Z_s?ܾ{[ fֺZV m͂~?B<2B!h\h :""NSnv:) 0Tkoc8 F jΤu9sczNP7KvAR%GDDv]sڨrEw;BŮB{>)v_{Bg+B!xbCpu4B)uMķ{e ;OQ=7~ y|$\vF9V%tǿxLK5> c>W3DqR14$zo_#̷=OW+0{ЦK^[QCƑB!"Mӝ mEZkߏ9,'w>/.9JK3WM^ǜky<ǾZh|WszOYA8t fT}f3Zkߞ ӂ#֥=Z_ZhS;UHW$-%H!BkxK<ϳ,R1$ k^5tІ˒ʞs_ۛ^.}UUw1|MIEւІ Gk+`mL9#WkpQpYƳ;g].߼)0L`)9d]hfCg_[BM?!B24E`s./}Ya& Y.'Whc̬_.mV y [Ys~u&M̺(oͺ6l 6˒|^.jX |dڽnJY]$G2% yc7)mhk9rc?d)Bq_-: O3q].,~hVS 씽'w.Hp؝wiJZ׬ 0ݎEf$IL:?%:k7 >:B$q{^[G)ή‚du+_[QOƑB!h]h3#>;X,1 Zҿtb+ al2tCR7J{GUYokל򅙡OY6E5ikzh5ndRdNEMrCS٥iOtvz~SV뻟BG !Bܫ,@3o-*\e` S+?2{UǴ̬ոQڜK6 51̜ؖV`5(1L@"7j H3Lޝǐv rVBMd)Bqě\(R)Iϒj(BElGGGGY εdBT m~틋~!D8R!f&I4Fx (´"ІY6_OQgJ؏:EEaAd; SU`<_c:887/Hڳ8xsrxel.&`"ϊo~HG=Xz>غF›; f(e{;^cT)c@T3sk !~$H!BEDu mo7qN:PO6TG|9ecH-H֯`fgR;t)u4O6ԫDqf bA2u@CN$. ^.WK9Wz$I@d{#hnnf`2)H{!" !BܸU^wF#ŢF?u )MՓ?@#ĖOe?}d8M]gv?uYu?v5<>i(y}s|1xfpu*y?7.1k j1$@v1{Ѝ13ePf8ۗ`?'-K04@y,H !~ n !B܆C5 GDZ3^WS 9˗-w/ѝ=2f7u|YB)w~k{GB1sqaM 8:befupxzubpՂz8%}3zޭ mv fgB@ƑB!A)**K,̜$ lBO>hWϟ{Je}TE4,70oߢSyƟkemϟ#3뙌mڰ7/oFگ6R7-s79x˽50!:DƑB!d>:nMQIeA8G>mpSym?Z;3̋C" 5_}̜9媘$i:W5f%lGfmO|$JHYvFBlgFBB%H!B[p86||b﫪:88`Q6z>2z:j`?}kOE#٘[SU`<_cWȆ DcP r kjDHbF]#::}v,|Y3|$f\({SYH$oЦQזd)Bq{]h&Qy6WbױguMDZ^bf|u^+H m~b)#D-g0Ƽqy󑙵(I"C *u>-ym9yszF(ueЪ&If\ehfB8R!6iXZ~" !Hk|.Hڏa~UwB;i:e ^,$I>5س3X5AO[#ωyǭ# C8yyyBM;$BYb~m!w/r2a'cf`@DLzwO|+Y,<럛U G !EƑB!j>>jt`\ǵ1EfuxH] 3_^Hjq۷=i[4pAwz0NùxaO=~p_^88жsf 3"x׃Z׶/*ZkK^3'kgt]KM`~!D'8R!Vz`k\UoD Wu @ܷI 9;hv/K(:գꊬ_%IBIN6ht>bHiѺyv9Fl'η󑧧F?r>RlnB@̉G !BܶՂd|1 "׏Ks鳖 ][KJʬw~:h6oߠSyuuDkgf4W@!_{v fV5G{j$)MX*c` mҴIJ!Bv||Bպ&MS("{t]{ʲ+`]|t_ۏ0@{2gg;Ջ̋sz>rmym,hHP-ѯ''h7ڭ1V#(x"ۙYUUdXS!m6ss^;^cέNVg y[v̯eΤj$,H !8R!N|+܄b Z>|VWGg uWw~NZ۷ܠ+Hl^[k=јgJbe-A~phmGڰJ-82*O/pՂ$oT\܎%]:9z $_[!H!Br||LD? e$ &j0pr1V m۷=iꂤyڃvb`:X ݠiJJ5Ǐ|i;R%uTxn<΅rexwy퓓"vG RfD;_TPRhsMqd)Bq7֫Bi$dfW+T?KsxګBǏRn:c_Pz\T]};::l|afNRyGLdz(_Z絿#>l7#5z ژ$I>dAFܺ&}Z1H]@@j$-qB! yCkd@QYA 1D={i;@VƠu9;cfܙ^1&!^6?#30#9q#4g#y^ W>iݙD7Yh$%I׾>% IDAT#B!Һ&:],\z{ۏY:/!;3<Ec(grk(mm_=B9fAbfo\VNv#Ֆۗz%}H͕5併`!!H!BtrrBD 3:P5e1?Kq,sXH~]?7WY?}ڃ#.y^5-G#1LoG^Lعs>޾ 1f\~^$ ]W蘄Y1Oů{_hDB!KIY\.!1R+c{ -s]?Z] mO˺rNjXjyri7p[Cfkz=(i_/FEZ$ IlӳwB,gl?~mk 8R!⎭ڧU3b:`~6~nΑ鯿|c^<09 L^C̵YyND[ڮq,*0C)l>C["ω`=`#}yy8RG޴ܹ^cƐ B+ik{ܕ #B!p8̲ Z4cFZGÆQyKׄNҥ~m{OZ i߽ ۡt#zyG#fF-W258Kx"8#@vHe?(­S_k^)יD@FƑW䵅xd)Bq]hsy cs;I.Kŋ~ndf}|OnHt/K(:sSUY뽿ro^|yE>]T³,m;Y>:n pYbakWpBu8 y m|v&].CmWɺ_Z!2B!{a/r8D|fp4\ދٞsY܉B$?`f}E͛70"|+Ћ9 Zk2.^78xhZL&8Y f"A^{ݯmo[[g% (f&L,1'%K^B2)bGcBu7vNW6M/Tx?ׄB!o6?VUNGzoym-3S%]1>Hku>ҍ )QΪ\\7xQs2]Kĝ$0޺ Zׇ ƗSZ[wozitf¾2.Imm( Wگ-ym! M!aHڌ,K"i""IQYP,3_^H~P^~3~_?}oAWƑb"C8RahƍG|ȐE/<|d,yzDu>'WU%};n& 2vckBG !Bt]fz1BIbVu @__1yӌ9? mO˺2e﫪Z,$IGイkjc "D,Hb<`n&cn߯ktMHiyPh:גB-6W !~qB!DW m_ߏ}gԓ9<9"Ty@Eḟ33ymbek浏#dCkβpHUUpD[w sGl(&cf.Zݛ+e Ӏ6^$,Rhsp>r>!WT!^K4k?,$IX u )MՓV r֫e߿cI_[}w;!}oG2 ے^aTHHn03q_oRL^y>U J#y[35BͮҲ`w曷;sZk 8R!CV 5) %^ _,ymkfV~6rC@ngӍǾ,TsmRUE:^/IJ@6bfhu9H_Kdƒ<v %c@$$$%-C#H!B9<XI]?+B1G !BtȷBd檪>b$sd-{ j)qSH I{fy;E`>ixU^]\U jke>"1 &o/.x}/|$_^1ι({Seyܾ3'BzU9{@{0NYGƑB!&򆝵F\6t1=(c՘ո[oZrYD)Q֪Y ,j8;ha7.%q|r1(ITn뎩Ɇv-y훧=^\ jARW2AqB!DdYvpp"߰(8I\3)K0SO۷?ݪUڃ#.ԓym{v9hsD1TsN>n?|oA?kgV6\!k0/=k!}'H!BYXf3Ե~0 nA\b m_Y$-hm?b8M]֕+]𾪪źNz#򒽇RqLUG*k`-.H&!ݺ k |6?3rq3RLH~vq31G^Z]Pkk _iB!stt.9I^#pB^[Kw,lc$Z|'EΙg&f]΂|)6C)x>R0ƼڱX |dn 3 k[˗jA-?݆:jkˢB#x84!B!x,4R}GHkY"_[v{>LpA Vt: <ϲjyq?p^`R8h$i΅/kfoڧ,-]KͭY-Y.=k=Eqd)BEqQ9kf,CtCZ,/1;3Sqh}ҍǾ,klzMZelkffN3<#A\^s03SM?~iz>2Id3Sr $07Ph.HJ^GYB<(2B!<χ5 mFGR: yw~3GZ~W6È[A~8rkZ^.vYOX.ӯm-ujs {_|U/7iA5l.v"ڸ,런.Iwk B!uBֆÊ$WnAҾ{SȭqƠ9{>c&ηC <w8ztqy 2]@Hk֪e</G\2]k﷔rN5vIRRHG5!~qB!DGie8ڞEp 0!gϺsfq'=%v=;CM.K7;6Z\"zAR)Y >53B9"NkRWaaL7FkiA=k(Ɋi|a?LYYaqB!DG)]h3(B)Z +xOYZwwtM\Eܭbf'ګ+H$4x>g研o<ƠVZD,H&Pw=b͙'<֚|oEϭ mvƨ ޳R6qU!/L!Vcl;xR( ^GCC1_h]d_ff5FFeo1~uԲՐ~q|VtQ~<}xʚdmyd>#scY ԀKX_GW嵉Hڷ;;kוoHM 檪]?f8R!z`05.HXk^#"|=B_:eB m̟H?1_9 ]Z$P,NӴڶ?m6u fڄmvu^vGƀeQ`ג%]"6#Ȃ'BiBdD1 9oA2L^@g8={OIy b&η#kOS9nZܜ_-5TD@Hdŏ_pm)ѕ0+)~]hӕ~m!G !BtR y ӯ ]{7|I'ɯfkؗ%r;u] 0 qQ [A@Y"b0:9E5q΅_GUE˒woId0;3[{5MڄaKwBv]eY!n#B!: m[>M}D(8)Kcy'p[6GԮ{Uhә~mZ/HF֚To|չƶz>31 "Gfƀj{x9,<"|$Gclkqx[͞hDRB;L!DnE+}`"f4Ĭ ޻I/f֧tppϲSk|~ZמƘLD!lO ><W5@m^G*jK+ m$Я-ym!#B!}(uBp~|@=yҝ3;IUujA~ 6ҍ ΂VUKDo6ЛGrQ1 Szx"Gzc Z @o%oGV₽3X.$ 205}*IS'+151u1b|B!&z9*5vIxOI>m]@oLK3@?8a.kyv!|9MWg8[ܫүAF嵽$|рbFܚ(u]0Nw$ B<2B!V6>qSKb$E@xI̬\?}vϲfOO3;i6n. x_UUf}giX?6k i4`s}^-H1Ib^9 &Ⓢ][z;ȯڙ|/Yk3F$H!B{@k}Jf/ٍF#bfu|L>vnjD22<kh#̇3tiAuY"zArk7n>FHUUD[$ TnbpV!m})v(Zh?u]9(esBGm}k䵅W2B!V6'SXkD&bARyOP/mAҽ@?yB"gg=%Iky ^n^LpYGǏ6F@Q_b 4׃ŨrRޢ[Da"y63.uLƑB!`0zP 0" m??}bI]{n/_$:vdJH-PUks[9ԳN I+lQ 6|$I &_Qԧym9y&MݶuF~CWZƑb/8R!X\#=\.E|$%)f?c0s1kXt_:6ya󑀰1ڗS0{+ f4f#};10 yl,&|R257WhSUH[C;~BG !B'''D?/K,zQe @xYǽ:~v)5Z4ggwfJƘY6.KkvY@HbF(5Ku#G]KNZkrMygY"kߦ mv}a2/k d)Bqoh ~W+[ 1?91")` : i?|֪_ҍ ΂VUK[9ԳaKԍƛ|fd\⻼D)Sրzs<-K0$Bd̒~qB!=.k ϲi:8vծst,m@t^L̂$1D܂dGӍ7m% >#"򜅼Q׃EzkY~>U JH^v)@{;BRhsЯ=$-ĞqB!=* \,PU̜9b$Y5w6f֏Qgv{GIjgӼ};iz10NB= )pW1d]ee8 O$i9f"j[7טmkK-BƒB @=~>//܏7, Β׾e5Lܿ\\)fι~!8R!Y]\NdYD̼H{~3^O?}vϲ//(Ղ9;cf1Bo.f1=R6ݗ/|c^[g`F fKt:EZ0S٠#↛~1׾e}kCwkIPh^A)E32B!h]h5#!>Ks0 @UHoUf[VecugARYnܯ, GkXLS!ӯR;BNAL7Z˵D@=]z9Y.H^;I]Nw BqB!ĽtrrÃYt csiF>SޑD rR2 IDAThM?~`;ӯҵ6օ6 _?кZ. 8Dm ym"R~s3 V(\UՏƑt|ܰ6/.yzڽDŽ^sDꚙ!ڍ :Fi fjAWL6H)6YW@{efYbo8R!⾺~@UU|IMR`^"Ttk?x6%͇҂$1z iz="jX\G5,Hy-zZُtz uvG׳B,,Hd?B#2B!4E$^c `y0 j,yWXvS_g?s$_| t' {aƑ_03)7dVoYlP|d|>g~\h˗UZY0;_CNBB]/ !5G !BWDtzz \'=\^O6#gcL: /K("@UKX뜻r 6D1'88:%?dێaj-[\}mx>/S$Iߏ})v;;ksR|:Q+k! B G !Bc"]LV)Zw1pVϞ{q y+2~ڕvІX "֔ [- 0Ck|.&9i )I٠z,u>-ym9yƀe?-K6˚ T#2B!4=<<"y$| ; e˟NrobfJeW뚈Zl%?-+fz˓M>{^bۯq>&0{\GO _f kH#Ֆۗbf|C6RuAZ`^,? !G !Bo m"F^ ]3vQ\{v֏˥A;z k 1g#a "$S簋n}>z}ɓ13WUs-쓂F|/ m?i(䵅7B!vxx$ 4ЦX`d4MAd#zY@߂w̬=nޡ̬ _gHuxH7kf`Fs)#scY ku׏S^oF嵝 ]?.H~'59p3^?ZhZk_\\!ڒqB!S66bY?}8z [.HO9NۤUUEnZƼ6k/Ho D7@Cwp\p>2GB^W k0e㚰~qB!Ľk"͢>`<18M]}FW,kw/1@ow(ߘ?x6&͇T . \##f4m>q#r Ad}͵h?t}G#{ݛl})n`Yv^hSl*6(fk d)BqeYvpp"D6lX4|  I^.]i}kOg%I6Ǽ}ܙqF(NMkaO=zMo^\`8po<.89lqx |TW. ^.yX|&p83ڹu͎䵅2B!B9OjzB^=ByOluڸ/[=L|YB)ɿZZeûz4MIk\7|>( "DT\Lq>2̤:RUu:|dc^{u>Rwo Xs‚dݹ{B^{\VUu"y2B!Zkd>xPyhZ"Oc7Y1oޠSym )E^;#}㤆X6]\+ GqR2}B]_LKxZۈbN,H q8R!b(V6'F#ZkD I=߻qLJ GP$;;fy|c6l6j+7y1gco,5e>91cKT|y_RqD^{2a^.߽)쓂ȴ@a"y6!#*!B=k!rf<I})FZ`Voo޸O@ҝ~mj˥Ai[UUm DP7a[^;4Ęhvu̪o)gQym~(ISs]YYi#\UՏsy!}! !B<χ!8.CZU ml`U]a/ m޾af}t7~pmpawbaA9k ,O|iqLyPsxF#v[9a@m嵏QD| hB圪kս|"pbjH^[LƑB!c׾Fsq z=; %Zwϟ9NweE((˲yH?33'o\IS%Gs ں (GG{{cEQo ^)י"_ mv6F m%#B!ybsDI"*c=i>m$\3O˗ЩBf]ؖ>::NN6fؚ^~c'9t<^\<Ͽ{}z؇_L ޳BoBv]EQ!~FWB!hO)urrD0c2)$_(/Igv$y]};i_aw,<'sk7 v$p172kLJEԵ_'GJ^rkq36iYfF{NƑB!{eUhs|Fo61t>:>]}(rڸ/_:B'_PMop9wyyna_y%L #̬k\%@yU69E4ȭ/ [fN5ƴ,4sH t:m' !DgɟeB!{ ^, %$Im { Iv+{>1~;NɼY" Y,-GnqQp] m-@U!"Zlܺ=޾k융˛yy"Y mt(ɵ7H^[HƑB!fUhٯ `t1~qDԲ=fx>"V {fy;sX0gv C9m,q_||fht `kMn ))&_N٘먼63O&h\wojq]焼|E@ZH^[IƑB!D)^ۃ00Y3J2 bKt 8=;xt1\Dv(kи IDh\Bt>pۑ1)K#v! b,l?!3L^(9@$ޒqB!ľVhyι*X$@/طo^-+fVán75Wy mgɘGƃ}jY@He-99"""u=ƗEQX: RL:S[0nHRh/1]?zd)BV6''l8 t>?ƮKl-,H:gh]hc?b8I|3_q$!ݰ//==3,-8c6p3 *?߽E)I>!}kW6^c\$IsA@*BOB!~JQhl+Xk1֒s~o$H=Τ y2v|%T . 44DԘt]#$:#N=l4SLDmk=r>B]絕Ȃk qO8R!b? m$5ۏ*IO=`wwoNe~Q$7o`=?Mv4!q??-!djĝLdP-G~ݯMiFOڳǯ[r9rRܜPhz1䵥+m-yqSXe2B!O'''D~?Jc Ōࠡ^Z.,$ѻe|A뼶LR.B:.//7|/ rhɢp˛,KDkg"[">Vna t&.ik}5 /髸GSP y)".0fƀPS6fu>2j~Q6P#" XpĊ`Iޫ"Ho" !dve1INLMY]\\ٙgfٝy~;: VmԎֻ5#]3?IjQ@RtR~# l>32 {=oP E@uklPUJkԉ]Tѷx&E:[^fhc0(, ^[QUk37U#`0 $Wah Yґn7Tc99 uOUNP'or)99 DUR\2qWPnYXqyTQލyT2t$E૛ dYB!z mlJz,$00 {_2TUdhvMN!-k3lj`0 FP 3QB)r r`w\N|,V%"b4 b.XZ>u*/P,UX] "&56; zJbCGI`OͶRJzmNG,IwYQ!$((^F1K(UJW"kM!6f0#X:`0 F&0̲zmMl% 6;(%aaГ߹~znIXrz:U*je^3J].WYcx>00Y PC^%,t$a͂gcH*Ixf \v2RҪ3IF9k^QPJ8b1 # `0ndA N88yhBrڤRJ(UpW XfRU92EzCQ{Hj5/-kk2hp#9 B䊎6zm_\g[vMSYMp#ɨ"L@ C^@2//a0`H`07)L @(cPR. +%-*  o(@է: mrssf4 #"2fɲ\ڞlh~Upw8 8<QUHt$EAe9>C)uݢ(e6 *lxKb͒DdH~IU^N`?K `07>WmhcB (ce Bx-X?R5+ PdZKs 9u?6,@nnn B8xYswQJG GCmQlEJ)ߊgl+T-ѡUdIk(fdt.WUN KG2 ` $#ZmXxnQt}XC$煺uk:B)k/ )bbOiѼg)<*P4DGHWP,PZ|ouH$, [Gr,Y m*dƹfa KG2 ` d[AV3+L'1v;(傃(׮Gݮ|,LTEχφ6rz:U*{(u\N=fQJ8[v #9B*HT'aa.횦$Zޗ*hɪ14C5m=5|`0~KG2 `B mtkK8٫Uq&(d w $ՔKR>,\-WUT%BUgda:2,c,ӂ[ꇷ@)L&j0T[%+5WbzZP@.JiAAAY<[,0dMc m {>hڒ13*/K`IaH`0z =vm-~_nGG74(TQ`|s35mr|A\J)6x+9t^SGB@99>2@A)y.\4?Jzl YȚxƫ}̓,X:`0 f`0h ,&˃,k埪ѨHg.(%FIROUr>9 S*;Krp.EQrkS}%9DPWJ)y&E^bӉj-|@f |=b!!!d7'fICoZ.,QC`x# `0n" uR $A!z]No=?DMJ@|LLMRx,$54t$hHsʏmTqWaQAAEH Z#kV iN.UUQŪ"F#a5QUA),]˥ȕ] ~=Qg ґ `07 `@h@fhh֣2lHDF";l* |rDNnB!Iɗ(1@s^^;??\? q1uZ:{PP#HG̼@TbBTYF m|ϖeN@:H6H2~ KG2 `\Ơ &'%8}& h:K¯á:=2QcGo9=* orJ].S-IBBcX:`0 㦣^[?*rr<Bdʉ"nDC%XtĄ%Ӥrj*Ţb@Tw:A )l&xH*ڼ$R܆X$A!5( (%+O%(ki~ܬ^۟1RJ4CH N'<3`DyFYs't$`0 MGHHHM7XhI= vvmrdeFIKB[W;b6Wh rss\)*V2P+QnūfA{5pDGX/;K;\rE/Հfh#u@5TX6῰t$`0 M!tIA\.-% PU\>o(@?V\B.8Nlks(xq"!H* {p_۠(*Չ8VZKGEeUjh !^ m (: m@` ґ `07#Ȑ4xZk>t^k~r)nݚYJ)I|+k\afY"\@RzXx(T˃&QI !&LUMUIV]@PІ $aEPv?`0jd0  X,Wahm6Pʅ}C% dhC &|*!)jɻuul,EY(OoWhޒ>R(2k]}hq$ZX$!!!L껽yOi DJ@QY 1 }$fh`),`0 qru6<Czé*Qd܍ghJ)É=] ];ZRḰ? $9Y"RZnxVRAPo*` 38@Q< }q! ^[kp8%X,QBnkRUbhrAU)+:74# ?1 `ܤ<Q0 5d} |L5(#ΟrAAon U^ ՑAAēQUռ<[@g`m>2@P&5̲zm=#vERs!@Rd#,C\?굵.Ɣp8j:X:`0 &0NW^$I3QC$ ө^phA!.ΓJu*j~> N ww8@*kbEyNOGEڼ,CUZ٠p'OEQ{5l+*f5IA)yϵ"Cz`dIٿ `0nf CCl+4_}5n܍gh kGt, bcK7:UR(yT"DU9@vvvٹZ~>RfP1qk+U!rEC^UQښ@B F#Bmyͦ=<('Ug`PT ((o*  77`0jd0 y1L Dou>-W^ 5 UU[|jX(iiTQ (f]u"M(hH.kK/tP ߡZ+JGrdT&Y U mY6?t$`0 M mtfLrs(Eںnv;(,A>j 'mZ`n7!ǐ$J`Ru6zxG[,˥fkOɡ ^b AVU$A@RPNgk!z mlJ,{f3ٗJ"@Q@)8NBY N'( yI"*rAAAM`0 ٿ `03SɁ&8RN7z2 k:Bdz>kS[@$"Ҳ™ējN6kI֡=P :J$RJBB|읪fYh.]VݒHv'$ $} Q)T7$jbmV`,`0 qc6f38 m$} v;.:'gCIK^@ReHy:/(7j²i|G@='E@uWkgWPlPUB8'-$No..;+4C mEs6f0r`0 qm\E:oy JD|Bl.mi5(j^7N 7*.rU}@5ׄ8v@H]8 ǢWUTFZMX}';rޗ(;WfІdFolxY&(J zQt$`0 dU6:j \!/% ˮ bEUU9-!9(O Y fnpk>f0P=IX:G% H$@_6SITUp|`` X` mL,c$ BMAyyy5 X:`0 PMo&;깅6)$, PYYTQOJz:Ub0 FCkRƀB9dzm^tc @HiePJ =F/lZtqjGmk *6QfhS>2??_; Fr%1 `04 u2rB Ɗ+yU#;(U3)|Dѩ-z !UssU Tv 5ù\PY˦؊=kY4Q$/x/^[h~X,СߤV"75`TdTA6| e(^X:`0 & p}(VkKɬZpcnt$\@Rїuرc…:t8qb?]~ɒ%k֬E˗֑}&iܸqW?({}ǮaPcFuNڼyw}Ǎ7߿_Geeeum{iii}ɓ'^}զMʚ7oޡCڷo?vX6JY~A]-V3'N|嗙={8p`-^F{uUn\{͛h }GO)>R,yv?N:ݺuz9u՞WEDDDjj*"k!+Sq]btmugҾlO_luqlDݵkA;gI_yI %4'@Bj_˱n$U0@V^ނ.E=#Att%cU@vf!.N<{Fر4iܹiS8;JB*(n7g2ϟŅ{&7ּYØ{Qt\j=rrmT 02s/.ް1;/sֽ;`ٖ'%d̈*/@ l, %7ǩF# yy.QqMvX7ZoSРnw@Ï6l v;Dqh>?ԼA7Iwֻa߁4h`$g.\Xr57_ᡡ6ܹvNcHH޽ZSۍk~̥Kh{ Tk6,׮8ltsSdEwS7leփw5o~4۟neK)o@ϞVoٺeϞ﹯K ੪^ K:r;mZ_(E|Ν;+kc׮]?}'Ο?z333+ksǏ?~ҥnD׹o߾k'Xfͫ}~iȑ k׮ݼysMرcʔ) WCjj+n-K. ~LSL Crr>dOø5L>}ƌ eSNCݴŋO<ŋb$u҅R:p+Vxe{%IײC=rc=k׮Ç{zĉ'|}<ݻ= r'V?.].ўղFw}Ճ74n۽uA-tֿW{_-aaa`Ӂ~f 5_gԩqO˖;mǎǁp `/1-n}'>tlb|aE69v9glZm5kȊ \]Ȋ2rKM3ڵl;v|5qj5`ժib!%'`+~9uKNQ|qwrC.|}G5JۭH i{rܜޝٰgy~޶S'W w8I"H)-9RR Ƣ;ڢ-Kmm]u]i_3iq{ga!BC#"""$lܿ…W6{{Eu[_vOrw6rlT/Rx7gw:ɤ(='+Wm; 4iұ'?ߛ3秵km?\uѴɫkk:1Kd*٭VP0=[rr'zh$Rڿ>ѼyI/k}!BF0u$INNSRRbbbz_֖~S];x[hѪU+e*Sp_|q„ fΜ_),]tYYYzkI&-Z}_~e9˗/6L 'εk>S?<'(W\~#Mnm[9򿯽r6n/ڲC3~^٣՝Z&$tio <G!C< $:ǩ 9>\}ƿ8-s%7 <>`KL0CvR)ݰsgzmZܲgOnݖt9_=jؠA/޲5{*dJ)!dt:SgϾum|[D/Nh({c֬~%.^<ׯO1nUGq7nܤI)Ֆ*IݺuyuRRҊ+1R#|}5k'lٲի V2ԑ ɓ~s&Mzɓ'o={vPPЃ>X 4ml6'N9sfΝ"?o^Ĝ:ux駏92y)YYY{g>\Yӈ;rȮ]*:;j(uJJJݺu_.駟~7Gy333;vXs-1K/ɥq5ҥ_}ĉ111K./^|ȑv/VrEEEBN>%Zj}뼼<ޠAӧOwE+SN``ۛ;mV 4R=m)kW_}ծ]rs<,X`FYp}R 6ѣGoܸQQrߔkwѸqc.[4 +:q]dn:pΆ $\ܮYSmۢk) @5U^:j^\ZuDEE3 e*8.:c&ӟ~ Km_[n s IDAT9.40iwX^5$9h|۶nP*DQԼ<zp,ypEU_ϞkZ+W ֭4t(TS6?˵x;Peo~/QPt:].Wc ,8!<(HUսNe6 !55.*j~a;/88ַaÆfu֤I+W0ak}X!!!'''!!iӦoF%I*;T*M6|wegg/^*5Wi4,K@@xMFXYQզ KAZzk:NhU0;=,uTvd6=yV?Kgjݴ ۱i*#w\ )) qqQ!!?|鲢ۼr'V)bBCݺ&.\ԽE M&MFCwy1UNKX,KDh΃[~dٖ-?<=)-O.zx8wʅ*t fS'"@)S_]weDqyyy?1p?ϜOeGG_}بHϋ3?ա&ڷN?曯u6mjժ%|pPPDX_mֳ璵k>0ݷ|Æ쌌+Wfeeqaaj2KaA LpjV+}dDo7oy1oJ%5ۊkX,'v'oL%t;sDEMӦ,˽3@Y (CRjg}8~|ʝzmc~\l2=ܻW.^|&zɻ >WNz7^_n;vTCT^na,Y"!C! OtF׾}ٳg\_u׮]UzΨ,X:lܭ[GٰaC̙ӷo߆ VO<[ly:dٖ-[';KÆ k۶w}]wuܹqURLL(8Enzj?Oy˼yM#Ϟ=;}7|3==n;j/:uj?cƌJwd O{q&&.eh|+w>ҞpGˑ[wz!07ߛvܹ7ldi=~g6_O9N8urr&O~7NIԯM>0bDauW v|O|vb^+8S\i41__^=J fe^l3Yt:UUM~~ g'(9E fgNrp횎mZQYWU}|.]9Bs9zhttѣXʂ#Kzׯ<߰aÒ^~,g#FToc)v߶m[\n={]LũS&''gddjժNLs뭷%''k^x;ךּU):u:uf<흧z… """bcc9" C;whѢ+W^U'1v]wVEɑ A[9?/Ɔ >#۷o/wIޯ_|)/ݻ;ꫯj-ڷo[\|Ӹڴiÿ+VTzH+-7,X@ppO?wr^v+5mڴΝ;1"''s1#QlHUn]TvxMf<}wigC=Tj^i~mZ̟) ZLR$-o5JRڸ^=d PORS֎S bG)e,& ;L)O0GR%-RO[6j6NJe'VyHdk9ql}wq*%*p fc9}zʒT\-ٱcy쯿rr?Zѵjqr\N(,˥!!!.|bս]4A% w2P'*jpA YQ[7WOPzR}Y}:v3{Cw??4^FQ̼Fi<+pۼeǟxI9O.fdZPUEQ,3jԨ'ͰZ?ѯOQTEVN8ط߹ 6:z#>y\әQ%`ϟhѠ^8sf>襗]WjbBѽw`p8\akš6;ͷ άA(3ӢQ#S he!ngΜԍfצMmFUo[۷gffUHҥF"TU522~>~no:K\0+Zm }ĉMVby/PJ=u o/((8}w}Iݮ-Yn/ū";;;11uIIIqqqɛ6mѣѣGϝ;קOQ;uEYQ}ܨ.^h2~nݺOڵkɭSJO8fff.Y$;;{֬YSL%IJLL$x۷ꫯM]vԨQn6m(\y+㑑on_t8 7f3gfs J.t:?(^rYfz]y7srrfϞ]*vڡn?{СCΝۡC<(wNZɭZERRҞ={7|}v۞={RRR7o^(w'NGzvHyoФ;}dF8?ӦcGZcrl)oM^|h0>p)њ#8œEOhj7j4g=t蕼frsw;d@YD3f:qH#Zhk0bL7B]7l sn;N\U\.);Μ;wo>=|SϷ'i5TURgڥ^ݺgڰMd[ _Y~B 5]^HKK+y qlvD}wͶ?>=zttw6k/$6vnIIK#*'(h0=Fccǎ)Ev6?нO߮:9u_Ϟ1+ O f=v۾شY8|8=3~.M|3r~\'^H7=FH|f4n\Ñ8s/^VTT+(O>swzpaqWߡ7oGD@Uqk>z޽{,'NիצM8U}qxxǬy"!_,[KcÊ;noe<u3yKC٪ʽM(.eզf#F޼nR:WK(GnݻU%&njmػ)S ٠JjߞS{ I8/z)ټlٲW^yJǜNgxxC na֮]ۯ_?/L)rŋn͠RK5Э[ 4kb+Iv8p߾}Ǐ,ٳgFcaH={vݺu+=WE˗effj>UͱcǶnxQ?bÆ .IHرԩSn%+dZoÆ ̜9s111/_1c )))6l رcW\I)߿.\[oL&#K._>$$gΜy#Uc?YYYO޷oߥK͚5͹e˖By@$\D\re=\oNNMMy~ժUa̘1%?tP/_b &rŊ,v[,#Faر=wܑYN~]Ν;qwܡ( T$۽w8P{00aA5o۶0>t޽{[_}yڦMɴuVAZhA)UE[UVٳ ^~]Xzի/_W>~ڵǿ8kܹseW>cƌry椤x2˖-۾}{裏Ι3y 3gNF=vM΃gVG>|xΝ2dHjd+V(w4k׮F1==}˖-+w̙3o/9--mÆ ;vHKK+i.]4&&f:Wnׯ_lY4I煒Y;{c&e_3$!SN}vPI>'M=O Vp_’HKaa Ν;e˖?#(ss!))''wԘ?tSNcǎ}oTt:/7ȯosKdU#^F#Q)wN(S/~ʫ~-Zm;uRW&J(huv(y4h$uҥgϞUzUv~-##O>(s cǎqUes6mtĉuJTNӥK5p}>|wc5eʔw}w֬Ys \2a6nXۺ!!Rx]x{ׯ"lٲo߾U- QΝp8j׮} &ZaN;g_HTpo߾6m0` hҔ%K1bDDEWi'|"rΝ;tpԩZjZ&11QkUVnݺEEE*޽@HHHqRzܹzi*/@``СC+Eի&N^^7|`С%[&yW^qqqaaacHNN^t)mjVץHOO$)..j 9;Cp8ZǙ_U\.{=p G.W|yA4hbŊ/nݺg6jV:_?{o֝x~} -YN>,YlɲVoJ'L3I:٤vg+djRTvk3dtw[aKD)) ? C${8?r~Z,\v&&&֮]pݻٳr9~6== ---2ɿ˿i:JT4mlltLI N /911QUU"8Dcc+Wرc֭[Y !v?cMO>kOtNtCvXNFλf7;sU * C~"+|fn/Z ⾺h4uo?0(?\oV/e 5 6Ua33Aƹr335UU߈R8#-EVH]uopNmѿuE>y5T(**hv jkjⷜ1[L?ϲw B3gCmM҇EYBPs^ ?:0'zbj^ŋ!r- vijq֑htbrt7(?x;{#BX@I>PLTJ"ATĄ(%B=k(:R6J U*Vj!ɿh4wb-޳ IDATΝ;?VT+C .3u:'|KL"L5$'Iqkkl5^߿4^[5alĻHxQ,5Lwӹl(ںj釱19u$ݻz/_ @'F`&i|x p§~*2Q.Onذlfffe7$u:/ϳg6lB\\Dgz[?J 6mZ qš c󎎎e?L <;|pUɽf\$Ӷ7S 2AtS,kjoQLmGl)VFl% @ o|_l` ^Rnܤj$j.ހ!AL1'|9Q/_Dktu~O=+,HUW*BF CB `2L̮R jk] !u5Q* Tyxݱ@D}(\ hڈ@`0sgoeZ!~g7- 9 xa|s}JYrb~8_i] kkVmW*Ru 3O'JR@FcTRFSu%ջZI @cCg]6D9&֐*U'FǙ9A3gjkk%h4:00%\CN/~񋘑V`}I'+r]I3H%6m||Ll6۲cccޗ;.kn+tE֙*v[/q$4$bJW_}%剘_R$* ^ⲙ(> ɷKK#kIݻw(ؗyIJ?͢ d111Y7,Ο?DJ_pMKOVo8H^jK5%6 3q'9f^<92/_R.~c~t˖6?I/ L'~)qW0S$axzBda_KA}'ya|Rc$c H)P 2K##%%.ܹ#fjUY\\F`-q8Ԕl#?~<88()zzzgx)a1*4M8;;˽ә< $" >zHsRt%ٌ]҇1u$8۷oK/>|(-g}&&A$#^/9~!l${aRyuOHJ(_EEב*933*7oެԂ@V/A.A^իiQ! /#v;ViDDݺu yU)MӼ=ITXww[7p\׮]C'HH>|p#3[I#v[{zzxb ?OOO,..={6%p".Q/T ]F< bJd$L9-,M?M-hC)}nϯC c $T!J䚑LIL$"#"U.D&޻wuªtמ㞗Jٳg8&8o)a{\5K9eRg$k8p=~n. μ;?+7N FͻBm Vթs2SFJe$4*HIH_~nl6gyC@$mɽ%ZxH.--?^s sTFFF? ':FFFD޶>}! tͮ(/>rΝ;2<\9Ē/;q=[KaD䬑|N"ȑH='ٷ%Av#_#Y߬#(D@$F=>[%_U71i… RB#I$zYCʍd "e%m/6550CHCR8B8{.T ʫD䬑@ܑ9ed3ط]#~/-q%m|¢SaM[#='x>le<4`}X\6qA^GJFÀ="HwIWrHJx@<9n$: yH-fOJe;,:2j0gϞc9" p87n 둀tÇQU#]Uy\.+|IjHwhӛ7oi%RvI^$jn۹ |s|9!/ϠTjx1cd}I?/"e5Ȉ G]y4 9+^KkCy)rI̧5J.J@ 0::vL)Y#IQTMs2D@]$ܾ}[LyY>% ,!`~~^؜x^BMEeH @rFUbU>8k8NG9EQϟ.1VIs)FNRe$''',!@&t& >"* T#GGG,S0?.\HAIÇeNORe$K.SdzѣGߴOxDL,"5%-S5kKFCjJRPiIW^P 9e$:y)4qhݻbFx B$q9gY $I={Vz2{FUpQ,G|mw;KUuO)t$MӝH/CHd$IC" wE{i< |k枂vL13Oe^p+}_RAz#^Iai{ʯ&PYa1)_L,E\kˀFÀ}zӜSHlFrii)U\a䈑\XXOnבBH O<sRn^/EA4򾩊ӈ?K'V =z42"*b||94M# lKG4ɰ|m2]$Rrvt'4;tw G=O.ͳ^ƣGBt977qb-}>_zb$n_~ΰ# |KHzH{^xooGT#`hhI͆Hz/^$2iX1Sf4>cƕxk׮!{ׇ<~~hsg}m#_K䔑_ȇ%%錤{ m& hϺG)a5z|Ytɍ$Mׄ2x#IQTV`OJvɼD2;Ir}}}{h4lp8D^>|H$ ~>ccc۶mCGKKKb,..nhhHѨ~l9Ԫ\/?r<Ȳ '|4lkZˍ7 堝hoիW6mJYT|wiiiQ(Wɓ5kְow G_{QмUkerO) Og0F3Id|@D=#eUP |}Ց:|4 '&..j,E,& wy&-5Izw17;mih/m[K,{<%ğ5ϺU<@bXAPVR[SR_*SUB0I 1 ӆhA6͛Ea5%_1wČի;mE \ c$?䓒$044,0FO>1 |_dӝ #0.iŤDfzxh1}} ryM<^|)QY˗/Rw^L+Gr'k qKfp#ZChq1IRz ۽94buRP64K&iŹ7ɃPױvHFLQT=Yq mbd_v>S-ytsEl.1??/VjC#kLOOsƎxtFi Ο?/x3h4ޣUCϟtߟ蛉Fҕ B/,,\|YChd @=9CHzHtKKKܛz!Q`f [2ab^xyF䈑 Cщp@aHQG2iCᴴI̫2'vУ ,pM~ I ,.S$gd$_~*,@~Hu$Z:2 "Gdb^E=K7U:Pk3uv/ g7A4M߸qCYrB!O&ѣGΝC,3Çi#nm$M"_I=YGOO`~.u679nIc H#ǐ#FrzF:r#O 6ϸ,Qa6=(7SϾM>:R> >5.SW"5F 1-RNp8<[4H6EBppgcccRddב j$_ӧ"Sy! lӧOYQk|m| F}_ů޹sG,$/߼yp@ 4Ag? $ŋ: 9 L>IFW~/4#yxH#H Z#,8G_/ɭ(yYHn0@`60)] A)2u^>:R>ܗa{0~ m6Uթq"kdk3dDN^G&$ ]$&lb, |/I._M$m6B]_yI*Z=::Ik۷EJL-u s.]$2[:ɾ> e^pƹ7%#]ؘOΈ]xy F2 ԧlj#4$A\86qoɏ xZe|td1 IDATjHn+(TdK7/,0Lmuꤧx<"l6. Xa Sq{#=LI<{,zT\zU xI_%Ml@E& lnݺpp8|ܹmH,eHzA 1`WH$-tI?̳ +˹P:I Fru+&ӑ0k및S#mC1GXp#IRԒ(Vg(a$3=@2H#W%E@ggȉA4 –Ą)i, Y ܑN0(i1e4M# { ]U;J͆ajj%jU.ڵkD *#999{t#׮]l*knI͛7;)I}.m̦l䂑Fi, R |"&~rr2@<3G$GpD2(O-.NafVI)LG:#dY͸@@rWWh?H$<!2EHcG6#9$-YBJbۇl?jydB*#a@cX~!Ӎdk3du000 2ixxX]&LSTHDgg݇3wܑpM~J|3:c/\2DG4}TI {!g}&Ῠ Kf=%dx>ɞɠ]5Íuw{#vȷ#I2Hva4$dpuP. ;w{ {D88N)x̟IWia!A_^/ڐUQs䬗F2KlQHuW\A~1dӧR;kye)^{<|m1HrPD1usvT\׋?Y%^#~RE1,&.0F2)R#_I^ά 2RA恼p8E@WWȹ`w Q s kKA$_ax޳g"myͤLMMGǏ:2'ڬ~:aI1#uHk[$Pŋ24FFF$atboRoЈ;;/>.~T`w_UΨycK oh\8WSAח΋|#977'46GX,~hliiI|KCCCAA188(f"()+++++q?˕FpM=(,,UͷDVkO|>w\WWҍ E[[߳vسgOss3iء*,,e˓qꦦ&Jh7oHT0)~U*ڵk1 {5<.*b+" V˥1I,K Tla)t/&S;ITZ+ e2^?ێPտ,?45 ͭAKy胥Gm{Z ɭy!!ygûs:P[[kH<;55'pRبjn)VmjjxzH̾Ce˿ۿZPh2rʕ3Kj: Ӂ}{y:/y5DEkkɓ'Wf?Gv}S?<+9x`GG6kꆊ_LPͭWU@FH sSاm:Ȩ+MEøSqjp?oߦ>ŋoVvu]ʃʶ~aPZ,Z(JLۿ8.I <[,O?S7n](CMM͙3gT*߯ul$iT~zNZ.E xaʢ~ эh4;RBYYى'k4BCCu6ݻwLmm-@rt")--E>fCCÞ={E!7n܈jg ..2UL?PX,2\7mڔE Aa3Uwދb梶Tz0~O x|/}{TXL,H{$a.xׯ_/є3%r2sPXXp'F"0ĉi$q?pA'RHbX@q{'(ӧO5MJюڵkYRRiӦqFXۥD-eKDaaaaa!1-έ*ĻHŲfMWrHBj(Ǐ?.'ݱcӌCI1ryq`"5khQtZHؑI~74'U ~)brAӯ,-۠XV2ݝRXh 3{m2,I- \WD{J/>^kd$u(5 " 203%%%j'B_BY`2K"_zCRyԩ c"`ٴ).8k}ݕ%#9"<&IӖ'NHt66j E4 ?c\ 㧉q\)pm9UK72T-WFaf*##1|uhloovIaJL&o2݊Rd¦wFUEm_9]B1TqVne ^Z2uw wW] Ꮄ.L~uIhAHNB"d?u䪤ܳgs@X))0'קZeZe'4 'N$,JeS^\ؽ{7V<¢#U͚5k箮JMMEyE"2.8H0 ;~Ț|Kl߾]\B>c!1T8^ϋwpBK}= .R! +em euuo.LS/%?;6Gt!.BHhoo4B2EIuꤧ4 ;w3BqquJRI~o*NjXS8£E՞>}Z|UN 0MY۷'Un 3 7X,"0 KB%uh0h#v +c'T.w}W8Y}D޽[drȫ^4k /0*yJP+\FehAiJ~Wnqw֩\0f'y~J4m%Fhd k7ҺHU4\=?:: \$dEvH|H$0HO#uV'ݻIARړE!)\rUj!o[̂j֑***X^,@SСC$u:]_ ljjJ9޼y3#SPrE ~fU0]DKV~#mXZf2Sk7VEq '۔֤tUe#RO{EBFfMPfH]Vd Ԯ]y䇊o3ȂL#fAR5`Z9"=fԄ0HP1S,glPrK#wɗ7&rHؽ{w> AjP(#GHJZlغuD9N<)s3&6+3>42G\f|MBB]STrL͜B#Z]﷡UDMKf7JOGH"v}8 iNָHZ-E4 J2mc)2LNI {=1#Pt2)|u${/Tej!`WUU>|x_4-~eHT*թSOmjwm;Ą',**`=F#]FpAA-[\8t(MeZi67o66v,hۑVqh4$:̙3RpJUs¢l)oM rEpDn _vQ]=:KSB.[iz6"ls/6yh$L i]$M@e ,J2~&5.֭[=E2G%#9!dc5ł\^^N׳Jժ'O&ZEb[j5G o3.WT*8Y$ZE=A‘C`0:u=@[Ξu,(\$ԮDթWvGG(ӧOPh kEppR_J|q;븆b1ĸb&wv%7XS`VBi3~(fdmEbXA[dL \$Ș <\$G&uH^paddDPIGFF(e CGGǣGxf {DTWW/,,pْ]B֦dڏaxOT*O>Rqxx `0Ej`bt-[o ,G~ss3Ã0h#kkkYt:Up4\:Ytry< DrYQQrj666zR@ &y"u:uFJj~vj t=zT%:Vb}ߖ^>9FP $[ !p,=Q>f!:t\d_ȞG/0" {.rDHH<.㐩kB@%&6Rqk/(MHk*Q(h-ͺU :wpdhV/RKap=h/ @Pӯ Qx.tUWܣR$.LrLĞC)\dkkׯOHGG&#yH=zTX,O a۶m===pK֬Ys x^%=S;U#;z(m?eq|jՑvXOsݍJ#Pz_nE9ds .S{˖-omeee?Rܺu+&[3FV/Ş@r^$I~ &I{%.Hѻ&j&sjw8EOi`Ek ]I\]'_dpEV&IhRg}-ٗO>@!yɛ1ZvϞ=bFزe >ŹVRXX`ƒjXd DF577ݻ#qɓ|-[<%|fT%;::?'r2X>D}l0 ۿ8PZZ  -RH}]cfrH"aii)߼y TWWhLD^o4lj5M0rEn5)[MEL nmZNL[\k{Pm.%4:R.dp@U(Էl"\$]VӒ.#בBH#i&`VVw%uuu/.\N钒6ͩ ]\\|1yvȠ:֤N-Př ݻP(=Б,Ml@‘HZSҰ'.D_9]$X'ST'N@QG*m۶!|_X,ID!bCSBNH V{2D.8HKmXA!(Sh^s/UNե:R$w4 eYcHl %+]$țwבHHq|dٴiSҶ`E ./jO>X"hkk-.3EÁiJKKy#JKK75  IDATJ%Ǐ#,̇ \F3]$+}h1Sx6lҾLZZ1U%<߫P]ɚ4pS.Nh,"EVmҕTUywRğtE,Xo*9eu"1p]4ViZ3+/8\$&CHᤉlnniCT9 ~Ureq\@W0ɓ$ˠJKK>,r.!~,GBKK *$=9---H4*EtmxU$wE";wʦ]dUUkX]P(nfSNl ~=&S&*rEnpQYEH o2-rK%m{Pkyղ32!#%Fm 3J=E.2-42G\$Cfit&#E&FRdy劊WZW UUU%O2jjj:tԀF9y;ɹRd#0tZHts)b<:R#%;v?Zs&)=ȃ.FZVV1S{h?C98^kÔroyT5Y\q`M6fmnp[R_owlCzkmNE'FcJs9\$&S.q䋦ґS.H,++xj$qgZe627lذy k򨁏?X|jw,++KԶ[ ii&hґk֬a/b-E={X֣G"H"wE[0Hq\XP?~\b\nцFڵ y; EKq"v4D[FH8گNEl.R_XM[J/itVƉ?.&MۜL=HIT&4%黤'Y"y;5 yH$q:Eܷo9uV+׮]X>{sz]UU*yݻŏ}v.-}gj|>t%jU'1 Ĕ4SyhdQQZ}ԩtEjq Pv#Hҍƿh *K@[[’Ck׮ݳo(0dVYMlrET J'jD6 EuJeX6kwӱi{PW 8MX_9qc^y#(5" .S4 0!M+EBdj砋՚˥FOZ?yQQ|088s,p<~2P(׭[wĉ .$aP(ӧOKJJb4v:f*j[0tLj]]]l'Ip\ v=4M4ͲmKKK6v꒒{?ץj8n e0PŲ񢦦F@$OSy\dCCF1i22Clp8|>g~hׯ8iw`` 5 X(4=77gٔJeYY2|>sY?|l6/壣nբ&$ 1;;p8F㲏pErرcs!vfH$g8~ȑx Ο?$ =|pff򨩩ٺu+6vF 70LѨj Yn[ƠRZ̉ܗf3Ae /, L>,/ yc2c ޯi_Nc[TX:VuMpZ AAhZm|(b8Q(0AfZq^7L5eшdŠ1˔r#LڝE3"*MTc_>H5gsy\$\`GU!\V{n$NW aaVTp<] ܁`F]l0=Sx^_GҒ'"(ʨVWYмN*/(0x/.\3Moe+$音G<an*gUH"f3/MPUUIJ=l H{u|EQ$I&O<1{X,n{jjŋ>o׮]IF)** BgxxD".]D"œ/^8|0_D|>1 #֭[Nj*Jd0\.Wl.xvoܸVn Օ9X[[BYYYaJmE@RyiqfرcHmHi񂂂P(DVeg+Mӷoߞnlljv}||Wфe-[|j%I˗1m:==}-`4c2+Ţj JRWbԾ}T `0ȼdٳ011k׮].9%=R I$I>~>vqqƍhtƍhf}Ѫ 4M,:;{~~ 0ðh4B+vٳ'CӴhTTdB^WTz>;ӧO_?4"cB#sEi{Lca&) ˹`\/ |(\ <Ϝs-s7YW05U(J3k4K@oޭQ(J\08Ri2I7od x换 fRg) ZU""#[{ўzi)T]\WTTn`{T+jhq+RdsVĿRd6ԩ~##i0✍(涽gFͩHNPTsQQNGPl$x|{jUɞ$yolHVXZsm-~}S^ZG\kKKꋊJxLZ ]uzCsszJR/ͻ7TVT48:[בI̽z^tkfe$4MשׂJ曒"ק w.HHV:PPPD-J`WWWIIɡCPXXtіb#alB/^x="I$k׮uvvH@Ny\B8y$uZq#.F1G$a&iaaue4ߛ7o7oZ---gϞ5+?oFGGc/^.--ZHѣG0,v.3Gy<>t~6Lj]SSSee%IssscBgϞ0AUPʕ+Z)5444Ȝ=]$ant655Awww8>vX,))~oooGGʗY&&gϞxgg};tPCF>3˵iUH"1 cҙw/|ȷغu+I]]]v``$͛7/ںukCCC(6LYYYfȋ۽{7Mӱbmjzո n&$ @PpoZWSjHI{uu[w;8|0*qF>-1YiZV]`˗/Wkږp8L_/ }uAAA,'`0aÆZ(* 2{[ZZj4cW Zܼc(EQv$I&`00%Z-W٭hfZ]K;,V+RHشiSx]pJJJ{2v5kUlhhxwVC1 JRRa EQ~{]8f|>\|JNc$p 澼f$ 'OLILq,6sEZ1AŶe?TRtSk<+l6RYSփZX[TXDk2nŰ("hYE5MMĤV5@@4J zHUWW+(^Q P͊^Xy9/@yzZ]G)ʿb?ӂ4TVu,n|½ T <9ڀamghhW=C!W Pc2߮]RRR]R)AQvb֩TxFC!\Uonܵ{*p,X0AB0u|6ZƍMq6G@8+JJSd̎ .RVp|/8LD =[eV ttt@m2bۯ2ZTfjcbuuÇ7mK[[[XeegVTNRkxNTzo<䦋O~CA]4:c4+֖Vve`^f-R~bU*&;k ޝU93Kı88@-TX+EԫnPE"UEB-B!رx=xsa<'āDf>#IHDD-?#b jDl9?/1G`gyJFFF|F͏H﯎F󧯎 Fa!D BI5*Ξ^^JmnuQmrg ^M[Q6ژב>oY>E a;b6IjsrvzpppX3̕+VTd'@8,Ҙr,4͌nXd !2<[b߮p8d !lR?d8"0gy2o[MVebkD5-l4~H, `tmmmO)^b$ EIHf K:Ȩ"1EqӦM񡧦i|򉪪3uH1v=>N GZ%%%iiieeemmm999٪##srrn>3-Ϗ-p555wf3GGGsrr=iӦǍ6۷'4mUU'&&F{<ljll,Wmm>2---^p*͸W\999g<]]]$-zaoja[o]y0!Bl޼wzuuu}YyyyKF4?jkkc}Q(˲я;[ox*uvWPP0Nn[@ PUU(cӦMBVؗ56Y0P[_,RUX(z\iESFm1IK%!}{զLI\VQFL*kZ՚.B`s||,B_yLa]ǍG2fG{v;se`0tg$p]3KD,766NLL=z4)EQR_yz( K<uU +O¸jii/B ;NS\W7|3\{USŢH' 3$#/đ 't:.-q2-t:{Yĕ7nLu$I3m{iceњR 7$ 8~FUi ƾҌn5k$4p8|{fggZVn/t!aNvSp֬Yx8NSf49?[>h$| 7.̵{owI&E^\.䢔FVUUM/6$D,%f9w0xNU͞r8S1%Zq6W̍B\&+ !BUZ!U$Z·/ҲӣG<6[ ]veݝR+{2jRRm=+vaL(L"E Qa4չI FB%pרFtyL)u]b809xqi)CDUO긐t&QQeCȱ`p#+33W,>\-u)f:_>"0}-啝]]]}Ic`f㙘z5~$$M613~N=պm۶ݻwܹspp0īzzK[n>33sK߼ξ}XYAAAK,sH=6X6-IRtR/41c]De$޽3sɥqNNΌڶm[ZZZSSS|` ! :vΝӿFKhpxnO*uuu7|-Y(Fķmmm7ncuaUe˖|Z.dBk/pEټy7,36؞5LCbԻW1{ubpp/~kdeQZs_ՅiNH}Y|eHcEU: qSLF3>ed9[qС7$B,>4!-t8ξ0-h(d

~Þ /Y&WT '0Y^dyټ%1VYP$қ^g&Meμ,R.WhEDeI D"^YBəZad4'c|¦(?UMhAYKKvVUʒt7v{l_jr7g_HUNkkׅXZRkHGjENwY/ș_t߿?AczRdLD >4MQ @ (06Č1hΜ/IDAT|]PPx3;vnݚ|yzKUnmz zZw f*++,R8rΝK3eB۷/le ë-Z7oinn=(JzzzwwwB݄#TWW8VX#! Fa B mYt[BbՅ###I]tѣ~+X ^mxElv޸{XYbHrBYqb)˲n wc-%E !YV$i2:%s Ӣ!ѴhŐʒ)J_ pjx8CtFB!!3Gj4lr[nZւ$ܑ\ʒ-6kVza"6E\ ɤ,RׅYcdaYvO#7VCL]O]DZgF4Y-luBѨ #_, 7g>MO$ Y/RZ:,}E,ʉ#j]VT]rcZ7n800_QUU(ʑ#G⋰4M;~(ODҘm'~nGGG~~(%C|YO>{Xyرn2Pt: 裏N-20].xՑmׯOFu!"+++7o޼o?S*đB•+W~F`M2Bi믟bP 0gM5ڲ$IvėˍsJ$ow+=ZSSe˖yyyR*uλOQ={,M"_WgEg+++[dV_e\gkeOe^LK66x"H 8vX 0-KUUɓ'{zzkkkm6f+((8sLvvvnnSTUBtww|Ѹ[6dÆ G13>>+++|Q۶mknn~{ a VmGj/z/323zϜJ#,߄XEW_Vjoo߿hQQOF{ٲeKxySS#Ⱦ}|>8p`֭n;֖?@ z>j*UUۻ'''u]mmmMb+eYNOOVUU$iQFj%;srM7-u"_c>#$mٲ7|׭[jggsssjf\MC#HZZxݽNowB ~ypp(,++;-$q{eUHW+Ja%Ia)KޚDBTeǭN,焊ܘd3kOT4Bd;fؗTM:Boox.m3SΚ/:Q$ҜB1%3#j'&$UTT$ ]HB{/>yNWoKs:3JJC4x/awUmUEi(-cǛ'*3mVhbB$;]Ryc&/3ieҔ,2n)BRwkI/hͽf?UўGo]Kv}a˥ 6x5I%\YK ɟGu65UǃӊѨ"pL=U.I !"Nxuĉtu].M:=nwVqĥNsr;{{]>_;266< )*n>@iQjzҜNwAik;62ZiZpxnVf(#G$ŝ?0,jL̺. -rD筩#塸Z%;sGN=a=Nvq8ȲBqG۷KVu 7nY]]mX>#N뮻׿ejnڴiŊhthhHr%%%ر_w87Čٳ WYk֬ꪬ\vѣG6~ÇJ5:3g8FpSqTvUU6-##caNiZeYe; ExǼl6INg |[SS IW_'$I;v8rHssslw^^^UU/z/u֦&xp rnw5vhcrrr'N8q>UWb??iv=TezA]n]3e# ]wu&|tsuvvq7|8`<"IRmmug'B`0XWWg-Σ{YchBl :uTWW>>>::p8^l]v{[lm|#GLNN:W^yVTT̘;FIy8nkkǚ/p8k׮7]]]htƪ gBLΟ?zKKˌ9KOŭʙ럯n'ҲrT:H$2223~oϟz$ڪ \P(֖ B###{^mXR5FT~T̯h+/)#@ooiCCC`p;!]·_{MOOMll|>lK{*?44ΉgΜq:u]?saug&^04fp*U#oZSjY,RӴ`0n璟Ҍp~5n-VjFѱ1M<OBUͺiCCCNssT333~? O1WаQeUU;7Wg&3C M׻2.7u ]U.0prFj]^O[dMZ]굌ju:)ˏE.?).2UU!,ygIoBݞ[(|OPP(u]wݩG4,c[ٺ鎎dzԫܹsyyyg:UUϝ;WVVf™ѣGoV>88SO{z=/š5k&&&~_nٲb,bWOPZZd2~W^? {}M/Lbڵ;wP(httl{ BUg}{7R_HXo=3ϰfZoV@tH>|5:tܻwoii_'gϞ]V98r1ŧ zg{bő1?Oڵ+ŗaño߾F!DKKOx$E. kڵ'NSix7>x f%??_嬬,EQ~_[nn׮]O=ԣ>ZVVv c}Gw}ٛon{%@?w/œVy׬VkWWs=7999<xa~'xԩS>2]]]]KKKUUU .\ضm۱cǶo^UUuK8r8tP}}=ܳ7ikk-g?ӢMMMw},?c%gx/^z饗_~9^wu>$IV7|={$޽? B?0!K*?4bSN=䓱 z˸W:H&aH&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&!`H&u ͮaiIENDB`biopython-1.63/Doc/images/PSIBlastRecord.png0000644000175000017500000012771312250104543020323 0ustar tratra00000000000000PNG  IHDR/*AsBITO pHYs=4 IDATx}\Te?QAVdnuI*țto@+oLmMksRVe3I塶̱P?v KI>;;?gs9 ssfx=1u3 g3%H|رc]= pWnСG ^*++]= pG}Cк=zzN^vգWcǎVݻwɒ%8JnݺQhݳ> /zN=QheddlٲգЖiӦգ;ɹxGϋ]=ĉ?>55գ;;pp/"4hPqqGUVV0գ(< ((n< ?: 8 ={+ ơQcǎ}?aC p={.=3 ' ݾ}zٙ3g:a7os†@U>lׯ vx>v_?;vL3lH۶m3gٳg/^lN|o<>>GİA;{숈gAx'}||^z%^#y]tx"G?k>}$&&v\:c<6Q߾}S}](_}eddz QQQ37jNcԧzԩSqqqz^EGG$$$?TYOXXXbb1c^7;s̰a<>>ѣ ӦMܹ̙3dCjnn&Ak裏յsWϞ=򗿴}5k9!!Cܢٷoeeez v /^ةSڽ{7Ʋf:t9r${Ozyyի;wܩS'Q_y>/~.^?ok߾} 1 .}`ذaDt-WD+ܠF}}}ZZN>|xϞ=Yqc]&P\^444{@lz4w&^{/^o?AvT5wꫯy"Z|D׿5##.\j*";v~cњ5kD#;B3_g7VyXq# _~eK.MII(44֭[枽{EQӧfDQLJJ2İaDesϲmM2iӦ;׮]s e(nd4Wۗ?K.eUdo}˕UQ(Hqܡ=p_'"GUsGaSpႹݻw_(:::66\"?HDC M"w"(n_?,Ӊ/ MY~Vӧoִgoݺuر˗ѠA\" m]sCѣ7nxSSS='߿޸qh4њ5k^~nݺ[- 9x+vShf3fN{饗fe{I国;ǎKOOꫯ?=Garfv_Ϟ=kƌZС?v 5p4^߯_>}Qyy9 Çے,/557|{ׯ_1,c=ӉZ.]._l}ma10l @?0؟\qEw]vmǎ6mbO?C-;t{˫W^h9oU-A`Z+~qQFFơCwUO<lGB/wu֬Y򋯯222yӧO:uԩ .$S^xⳒ+VKGBS_KlڴcǎXr{"zطQ}aYfX(&\ _K\#`?!bAAA׮];wh"_____SNرO<,\PO>taРA_Ν۹s.]̙3I4`exxȑ#7n+aaa;v {W >q댯򤯥𵔌78|jjjǎwΊ5ƭi-mP܀mPx9tN;d'x H֛lE~ap xm@ka2@ V}\=p'8ՑЊo]=p?(n$(n@[k"ܹvwkY^GMLLtXlڴ/"pG&6U[[KD?gZJD/(nLyѥKz$4D4dȐCm޼y ٤IN>Q"޽{ϟ?#ijkkW^ݻwoWDC:uDD=z`ٿI\G"{޼yI{TYYz=zz SD<p?O-uL?^OOTTՃ :"B!Z*nBCCϭWvAXtѣ{QJJJddwjj*ܹHDGaGe˖ !:''חeĬX%`/*njkkϭmU`ljTSSӿiՃ;߆ e|L??"NNN ݱc AXhQΝ322+~D9&{jkk;v裏?-[`ok,"kU~Hi2ix+W\nv N RRR훕e4̍SS^~ do/믛ۖb'?裏 Y0sóB>SΙ3*,,ڳ@qc72gnԜK~%k׮eOۖȝ{̍h Fk7V۠QF49j LN'۾}Sp"!66n_+Ö$''ю;{Ν;{z}_~ҤIO=뉨FcII )#@Q999999|lImmAUUlɠA***nIMMrϴ436Ms3sL"]ݦUZ]weWA\!*L(nFI;Cq_Oz )]g7HWQދz~ YYY^^^FVrN6|tXQ?pďg9~-w6vMRyWղRDMBOF1E*ld!Z ;AJeɩĝgcMMMRROm]մWTX"'xK5LۘnkmBjBˆ#hڵ,`vĈUUU#Fݺuc;R*/ܣGbFFo׮])Mʁ ۡrq3i$RRR"]sU,$g@q#AgL%K]v͙D`zrh4&&&*6 ޽{=z$<<\!Ki%Ν;CBBg͚%ek."c7N>=<<}j+-7NϘ1cӦM <hZG3f {(JѡCX3~Q63)bQQQ׮]efA=fnx37Yg_s0scկaFz*8Fq}gE?-A7tyIGgMpbp'HiPGAqоdggS+  @2|sO.5Cn S aƍ[;ޡf;Qr >7VɖKդ0Ť~ x뭷~_Z@s#\ph_Ө 7<ݻhÆ ݺu+,,E쟢(fddv5::ZT+6BqciqßV#{7򪯯65PFJq/ܣGQH-y76jaYn/̙3JKK[CqS-8 G F,д2ȑm#7V9-jRbrl[b׮]p̭6Bq#j}جYF4Vs44Pԧ׳;655555yyyMߢ*Se#F(nrN*{9G_FEEyyy|䍷;Qݑ.m-t_(nx*SM^̍Y4oTRmHT(nf* UIW"~iӦVFVW_~ҤIO=Yniފ 2p#=\?_fΜ8_KIѡCDE57mc| j*89$Kqv=fnB*8372VR;|Oʾ%(nrZ*x||<sl &[2tRBΨQ dҴ5i<[GōLgDlf9.h_lYXX%'' uUA-o={?~|Μ9Dz꺺?P K..\غuZ}&ϟV4mڃ.]D/ʕ+,^4|t:ݥK۪}}}.^ɖѣ%%%KzQ\\bO)&7++Kj)B]]dn4bcc[.XQ =P_777+TWW۵DsWIG>i\n))Kj7߆ΉqfnrZ*xTRR[RTTԵk`6/儳 96m rѣG^{5rԨQ:.66Vq-~O,q fnd(nř@f MWQE1--mǎׯ_;wv-Z/7NϘ1cӦM@+,ZJ6΂gyI&`YMF^0scR6 ?UDo%V3G}Zlsf88!a'Ι3^ K]2s%c{` IDATv#FP@P Y!ZK[Mhh(>Zry1\ͧ;Zdgg=jrTkZK'k$X]Ep;K~W:b nv>*Sh۶m7o,,,ի|~E鱚TFFqM{fYvm@@@ǎ\7/1b^֭EQ>|^ׯōUNKe):6pKt:|k2V{FFөT9 ZlٲÇ;v3f q|8dɁ'O|饗k׮UVVv0M& ϶TpY6-[Ǜ1M痨Lm-XZKw|UG j*x||<sl>[z e˖SYZ2}&.\dgx(o۶ ō96ࠞµ[72Nw|Up9@VYYi0AxTpYlɮ](22Ϗ6n8}7nQ^^u-gﴥs h'[nҊ111T3hYN4ihlii)))7 YW̍UH`FelDQ->'bK|˗6,gVWW>\׳? pȑ{5j(U@@b uVXX&##׷k׮Ѣ(VUU1Bwm\37<537s9~8[Ÿ);wT\LW!~DTVV9'-[(VWW>eƷ={Vgnlz̍F1ܧi݅>]d=Tp"zG>i>'=%+%AFvfUj[Aqc | ݙ˭FMEEE]v fw6ؒٳgzHӱR~<`w(nd(nTp>L444t}N(nxjfn;v-yZdm58ePXel) RAM26gݡ1]o۶MZ O?$Sͱo#>|iAqó~"*))to~7xCT:S玲UM̙3YogϞ%SNI`-ƪ73f`o'Oq`&M۱cG|<F"Kgs%n5ns\*@qó\ܨxVsGZ*mPȴ"|޼yANNNNN,o#r},93ɓmH2 pk]q< ЖDy>c;p?`w(n@[*++yvp(n@[C͞={ ٺu,~45ʮ˔J~8ЖロFm.Ki?sjkkI)GSeDTT(jW0E iSڵk=UӧMclnݺv -ܹsFF,U1j+%[]]cs3 煹Y ~555III>>>e&~M,?A;~?,*5{z=[Gª&ޕ_K3JBx'{qdΜ9G߿/۷/+,&Oܳg7n 2dĉ>>> ń &NHD#GdkQ\\ܼy ֭[hƌ>lff7s#Z%11qժU'_7mڔ޹sgor6Dd4;uDDyyy&Lعs端<{li۷o'"6<ӵ9C 9r]}Yv^sQ2) 111N2 lI`` 6;ӹrҟJ@DIIIDn0 vؑlINd#ܸqEQ|嗥Wm7}H37S ҳ+ҞyR:0FzРTWW9sFEooo(hVR m񍽼M+%۹s'-Xv $kS^ZopYY0s#sGqc=Pg EQ᧟~fFo#;0 jZ{={%⋛kײ̭fAqN¾fƌb8yײI&v`0mvZFFgggݻEQ={^衇t:tɨQt:]ll,'߆/E~;vСC Z`k͘1wѢEDϯžT:t]"/2**`0l<'c6"MLh]fnBq##> 5*++ eW<߭[X]]}̙~~֭;6++^pX$&&=z֭[ocU3[̙36@ڽ{sNڿ%K444YՃ?7+nڂŋ8ۭ[׿z{{/]fΜoxvTgҴM޽Hcdggk<gǬ)(neKTfd Y}5ԆWUePXZJq~ ߆͔mds*gAelc$"~V!)^mc Wht&OMhLKKMLL4]ܼuVV4k3]K&!!4m&""S[UUuLdʕ֭7oJKѣA T-A-iի!~T0s8?fŒbaa!N-̂ṊEp kI37PRgbF ,/(fy/eݨɄKͤ͘:&&FHi ;ug={N:o{l$DMld ɖȶu)=lc̍ _E*skY.nT>[ 7Pjp!ѩ8N{UQxo2 `(..NJJ˓\---ׯy my˖-lvoc4y晚Vߘ[K6BےPƍ|Dх x ..N([c2 |Y'CqE"\&,jn 6c.Cq-p4/":s̐!C\=C*"2:u" &ܹW_mnn={Jkjj۷bJ@DIIIDn0 vؑ,[ҩSg}622RŘGnܸq(Ҙ2_~G]nر:^^?ҤBGz-e?ɞ4iۓ?>zh0'''''r?#{w\CVT ٳq/nPk)9jSC:LKYvCCZID:ҥK{eLHH;v,XňΗ,Yv-[XҔQ3Kxid 1+o۳8,a;<<ƍҳSNӧω'`׮]D57D$hdkEGG0vOي|RJyII tqA|AZv܉"3w)\yn _Ki57~޸qcyyԛ]>&Md4[ZZJJJLGR2^NMJ?S -}}} N>=x`"9sfnnmL81//o̘1|)j8/v RVZ<.j{-{ݻwea{Ϟ=С 7n(y 4(00`0,qv`i#99YW >'\-ARnëq/WAapb- n.?.Q\ko/+/ÛEQ|WT-MR8Rͱjj'yC +P܀Aqe .mϚFq-//z k).LKK۱cן~is=[AzP]]wS:K$T:- ڳg͛7S~-Fhȥ'%%+wݦMΝ륅VS,Y?ʕ+zVC7.-onn޺u++Gl/'\siR'l+lH8_cǎ{s{!Y8uLDaaaǎ2׳b,o7#Ra𵔖W*8'GUR2Z C>43g$"AN<ks?7>WuDop x7QPGAq޴ dH {r*!9Z @Ӑ 4Hp ^SSӿ'"9rmzٲeaaa[Crx{ܡ< Pe >t 6466J쁅***Zf j /W<19w(Aqc0(nRd]/is5Vl?(ndp  ޣG⤤$@JNwҥ2 #4?gV߭hTc*ƍO~ iԩSs "*((aܰMFzyy̽VH#Ra𵔖yv*x?q6nX^^f[yFr8 Ö>}MpL8qΜ9m`ܸqz~ƌH+**-{ݹ IDATwe<0s x7QP7 պuˍ,qσi?\Ŗ } KRTpCa={*0%%%22;55em쐐Т"6~~~111m3ݏopb0CT QY mh۶m7o,,,իbsΉgSdu&mg2(n@qōT+V=A);sp,q72@DM_r[ZZ֯_onmy˖-gy&&&Ne* =4TpV⤧ LN'] #ۺb۷omv=k,#$d{$i̳S^#Z8R`8vq㚚"""%A(nZYkn< TpG@6Xi? RTp {pTpR->reXܖm=//Omٖ.;ܡ< Pe .K6^TTfO~̤"s[u$]ejUK2(n@qōy^*.[MN8?fR-ۺizsm*]%Pk)-㄄cֲFDDGq- dڒ%Z[jɒ%k׮ݼy f>}zsy7]=;0)))+W걀|0vج^xccrg~Ĩܺ_ģG޺uCYa셿Ak[9s& p)g uXPGAq x7 ӦIv(nR]TTf_g7TpMC*8@ka= \˩g"2ҋfukjj|||on6%R#L-C*8s*8qAV}С6lhll4L7VFː N Ώ{{{744X Pk)-ӄTp"scʙ:ҥK{U=z(..nhh``/(n4MD*Ҙ5 >u>}8qB}߸qٗbZQ a eHw =!\ֶnTp)X (n< ((nInnnPP]wݵpBm%;;[1$_A;g<,_ŋ=%3?sUxz`s ?~܅hm<wDQС 7nd1 ,[,,,5KIINMM-//aҥ~~~G~\]](33/888&&FE:w~<;wb`=<(&rؒ.]%Wy󦿿{ҥKYYY||ɓ{Y[[{ƍ!CL8g_|E߾}͛g0nJDUUUdxLb|@qEW*ThժUDIqqqDTQQq )gΜׯ㉨A.@R!+W<|KK$$$tMZh4y晚\t@Ӥʆ]BD҅/h4f!33S͝; S_}H??aÆvͦy*F57lsx/ Yp%NNNNNN7|=`-G-[?7gZZԳ]scJqJ]B< ((n]YvD?_}ӧ[Ee?oZ@0)Z(n܃mn>' "$%%!; `+7aʔ)]^*-;wܻK&,g_6M<900ɓ/Rcc# +W,^X"Z`]{^q|8$p47&}HD ^Hd>[1[3O%o6n{ IhHp.]b8*Y>ߛe=?EQ%nyb&99ܺ< ((np' 뮻.\hn̕+Wv?h 7q˗//,,xbii%~7x#((ꏽ Nh avmmmBB Ǐ7wߝE8hfn}ղeBYw^^ !!!l͞={X աCA6n/Q9HYrΝ;[ G흚س#ED4gW>:DD+Wt@@}(++tt:t MEEEk֬a4 G}d0۶myzF֧%:u$= 9w(yyyGXQQ!"0׳'mq-WD+^{{{>|XͤJ3,X73m4"1bVlcgΜH6¢UVIQ=ۼ-x(nH}!tMDDDqqqRR 4%~%[nЦC%"3IPWWd\---,Sgm8t57D$hddL۷}v †Kx׿س~'QJJJhh}ga7e#LOO7 :nǎI- HMMEJ|7UVVZhO([ÉGcgmfn<̙3HSNM{cHPx\VCƺz,ʴ?Bp;(n< PrP2$ siMMM.R۵6U0s6?Sҳerrr|}}YHgLL̊+6n@`8=R \,SVVVZZϖ%l>@ 2Z @TpQ{왕ŞӳK=… KeeeO 0 \*8VUUEFFJl4aWPPRRR=zh3@ \siĕA|-ӳKؖY`ĉ͛K/)^srV {zhOϦ;S~i":t/b 37ncܸqz~ƌ6mRl'lZkiA#0sveMnnnnnH0s x7QP2+iBCCsi-\MkGX[[_{p H7ӆlarrrAAƒ6fׇkknLɤIFcKKKIIt K`|T h'[= @%GAq x7`ҳhTV-#7X466^v1u׎@ ۰K*Ν;[oYeK}||BCC{p4m,[O?E3f ^:**͛D4a„'v… s=z)SL24*99YEAtVUUѝFeKzY[[{ƍ!CL8QgGCqEM74o]ĉ{e^|9""BM@DGnꂂߺlIBBBPPPNNNnw `w@D{3)))wݾ2Len+n]DDFF(GŞ 37a۷oONN>~t%MNNNNNeee<(-aWȚkn,l_ҽ{t-Ş 7n\SSSDDT'Oƒ]oTox\ {pm*8u5p \s x7QPu?} $hPnnnPP]wݵpBsK {X`ֶC٫R /^XZZjn Rfzb7U[[ -#{\uץ`aS* MS]]24%պu-Zf7SY#6i5MRI -f"^?O\3<tys]y <}^/㷸 v%%%neff^{qqq[ql󤧧L&ɤqF-hBQ˗x{FE8 "wޅGŋ.nlڴID,Y8[:ur{́TU-))LUUVSٳkvϊ۶m֭[jy-~x좺ZBRvztvgϞC׿#GL>= `ѢE?/gEo |k'f͝;7///))>m]{bŊ?88X :ydffaNtuΝvܹol:~kEQfR}SSSM&Sbbٳ8vwkڵnxxxnݴSv}޽"vKN4;ԢvVu8Vng.*,,tq_NmkV޸^p;=~Sͮ#nߑ6`0lKCaEEE㏻vһbK.˗sk;4¥KZ`CFpޣm۶"w-%[n=u>#I&-X@ZKJq0 0 0RVVv/һBO>zW0 xۏ;V*Pqqqz#8p͛9rdvvW_}w-P/-zyE$$$䥗^*--ջԈp@ݴeC.Z/GnڲO?FFFx7ls7FFF>,x3 u/hOYrjlx7iF7#P#e 7ތp@.hXZܫiF"^-6o7j_Ѱx ڂΝ;[lYaK/t}*KnpVPPPZZz;wΝEqҶmƍ\6o~׮]Cݹs]Z`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(z9{][.1NһMQUUw/R]]ݢ[ދ:t^ӻ c[ժ(.I]j EiѢEuuޅ籪 p p p p p p p p p R@#;vɓzWxܹ2s@[ hxW_ջ Cdc,3g4zWRSS77o^bbUx]vnxVnnnnnnnn((W\qū3 sΩWoUgϞ}WMn7ڹsOsUU'O{n1w饗^Fjk9?O:UUU} 4/ s=z  CBBڵ㊢ߟ?HOO/**ںuoѲeovLuuu˖-@!w޹{WZաC7|UV/p AAA .lӦMQQ~Ç#""zy뭷VUU͙3C&iܸq[l @RXxW+ :tΝ-Zp1=w0 0 0 0 0> 4R^^y睡z9""|7@#8qBDrrr.Ļnp4RbbC~mٳ8Mnp4RDD\s5O}C@w    #TEQ &DH>}6#Hyyyqq57@S̼k###ⴑtd2222D$--MQ Ϛ5KD,(K,9{(رc%$$l6]VD>mk'ر6%K"##ozV^^ްaBBBf@3R4E$++qTϞ=_{/>H\\ܶm۶ng?~ƍ'NVU~ܹseeO=Tnnn||/4$$$33sϞ=u 7+NEzА!CD)&ST6Fy^}լD(UU;OHXXŋEDQϠw1z/ZhR IDATŊAAAڑ.]8233cbb׳zQ\\|W)Cݹsguu57)/P x=+8޽{XFvsNUU;w\T<]wu锔aÆYzI+"k׮}wûu릍,]tҤIwyҥKE$--MDl6ێ;DD;vܵkW>}Ddݺu"h܈(6M9;;;..NQÇ=k3gܹsIIؖq[JJ&O#ݼ NR̤px9tGN]Vl6On)))aaaڵKJJ6"Wi75v}:tz57)))9r䈈lݺUZIny .hȑ#yyyzGj|PU 6]x~l6۷OHH8xEr>299u7tӡCrrr. lذawlsKJJ***jrq ۴knDDQͦ .]tҤIwyҥKSv}޽"~mfiVgΜٹs璒⩩&)11qؖrN:] x+7?j׮Qnnnnnnnn[ F3sLjRTTTRRҳg&cǎ[nmNM~~~vvv6mKp)"OnϜ9SQQ3@=n`L'O ֻ ԡCK        hZի38"Ml6Y歷޺E]hrW^yg̘/H~~~uu_N:^}ߪEDQxEQ:w<|𐐐^xADaÆn&WQQ{ȸq^|ŧ~:))i˖-}}ꩧS~o{NDM6m'NhwBQUUOX,~iyy4t W^&Lؿӧ۶m{ԩ|W#'''>>~x*ҭ[#Gtѣ/+++l߾/=;tr1 X\=TUtw}ڸ{Ӊ@ۥkѢcOnf(JϞ=E`"2k֬>h֬Y":ZLuM7ȢE/^\XX ҥK .|ꩧw7gee= ,G}ҥKUW]U >ѣx㍌7WFm;Vnnnn]a"u@kG-[Ի ~OKhڴiskzWr͌3X?źu낂_cF}n}n nnnˊ]^7@~aK~u4EQ.\>k,ZZldee)c3fر}]ld2ǎX,!!!fyڵ"'((O<ѱcG";n2a8pV^=qd9r$%%W_]XXتUAij}SXXXRR2`dŢ( jժ~o78u7Jڏ}M>^p!22RUՋ/ڧҥT~+702{Ψ=s,"YYY"iӦ5k֬[NDbcc† "]s#"l~:Rb[ XBBBBB۩ މp2a8p`NN;#"'O,,,ܷoߣ>Z^^޳g>;;ȑ#}||۩6o_>}zѢEn>}Z\\]YF&77,LbouنnԮήN]r\M6?cbban2|ơݱr#k\W={~g;vV^ݳgO~k6mǎ"bZ]rkW <믯lӦ9 މm)MStލöݱrԍC 4-{@3c   0Hmc |==#!/xwyyyqqfx~gԨQGמK, HLLܾ}Sw,EQ{챰1cƌ;o߾}]{Mp,w'|ڈ#DqGj-j:u$$$$33sϞ=nܸĉUV;wND233Edv[QQQ~~lpYn_d2䨪jZkngW]uU׮]=8!4ή>7|ӱcǥK:šySRR=p}'K.N}iN02aGZti ͍)ZretttGj6mܹyyyIIIvfW_57 +ӧOKII .Olmp]|…A9|,X@OkOrxt)Ou?.++p rZ-;\7;AAA'O3jQٕW4h'7-deeKSv}޽vٮ=E$!!!""bӦMk֬qGk'-[ތm)MSt84Ҹ?ӷm)c[ {GDEٷo}N}@ FǕ+7+70?}]``޵jXѴi̙3zW+++bFy̙ǷlRZQFFkfEt%//oݺu\s ׸ 0 0 ҥKz'."RVVVUUw-\lYPPP--2x3 ֭[]ڵ%\SNmݺuքGn`(%%%"ҧO:;]fK,oveef /Iem7Gׯ׻-[ȩS>nIr4PVk?,++ӻSNٳ'**JDǀ"8>kv̙~lܸGꪫ6mD n`گdmhڢE &hqY4ơm"L8O>=z]RRwQ%?Ӯ]CD|]ٿXINNp͛ $--ҥK'Nvy˖-.\л. CAUUUگ%n4[ly('N,))-n`ׯW;О&$${֭gΜѷ0} 6~$"270'O/&''WVVnڴICV?۷o=>C.| Fav'NT[VkPP'Nx~|F`Z[l9a]?_* "''СC7tSW2-1B兆6ˌ.((Х*|qĴlĉz70I&8o>֭[>}* bذam۶ݴiSuuƍx9 ʜ. ?~/;k?Tp#4hPN6ox5~-A\#ӧ?~W#[={fիW^_1dȐfNw+70_Oݙ3gmۦ8 wCM/q?_|q_}za70'mٲET"))[nz_ru/r{gH>poK%8&Թs>#wUU޽{wP@Ceeeݻ 駟]c2qċ/߿$4k.UU9}+OF%OZ4תU-[k v-H۶m۴iw-p6z_ս{wԩޅh$ d2]cǎz70K]F"^fYQEQ۷_TYׯw 'z|Ĉm_RU5>>wMG5bq} }ɓ'O6b޽{̘1Z.~mGZtiҖ\GEE\_niQQQS6wܼ$|=#"۷_~<1 :uΟZ?K.+Vh$.@OӧOKII .> ."hkn""E$--MDl6ێ;D$77WDI>|XD,X "aaaC q=jjǏ5l6_{j2gϞL\7xC[qr9Xn竪=:eʔFr-Sɓ{u+WΙ3G N>m2-r3~-Yn%+7P7P7P_xUԡ"888 r/)6lؖ-[k7|_~y]wO&MZf3tв={?~[n#F(--ԩ͛?O2eǏ{9m~ʜ9sDdȑ6M7uZj?A*|Lii%/.(FJOOӟ?)##K))) 裏JJJ3gܷo߉'fꫯ_|񩧞߿lٲ~UV ͧ`'O^`Cdgg?#7xSNwq?~/^}z…l '##w]vvvvvdڶmW{|{AEQў*=̙7<t{Juuuw"ܠ:4>>>>>N;Sog}6x_~>3ybb'ڶm[4n8T\PeM6iOꫯ.]ڵk⋸8t|c$anEn֋/zUxϘ1ફ ׻"DDDDDD]qA1*u뮻Eu{ٳg_ySǸίjLLLϞ=dQr(** 6|zҴ;݉?rEjЗ'@ 6LfպukwW$%%5Gȍ7X^^n8z6#FG߱cFDDXVivvvBBBHH#<׿uʔ)#FXl~qqq!!!3f̰:UUU8pwc9t};rȆ~4?Vn;wk׮zҴ}]wڵ֭[tR1V֭fsܷX,<֭[ED뛱jժ#GN>G?pAAAFFFqwk3gN6ͱ/Grrq㮻 =zq-[:bЃ^pԩL:b]KӪ ܸJHHZ pTP-#G=_"ݪU+/X~5\ӦM7jSN6mc_NjC=4^\O``\P 6o|5hOEwq=ҩ{gZK>N}37gϞ4$%%]]/yW^yמ:͠/b[ @ݜZ[طx6nO!jWh87hyyy0Hh=9u{ӂo8p@XXޅznܠ-<쏵qEQ7PdYz_QQw! .ӂͨQfs޽'"qqqǎEQF'c((III͋UU5))iΝ:+C۷iP҈}]na~S5}|~m)`(`(u0͎7+@O7۝IQp顼S@#nI5_\e˖of3jԨѣGtSW YdIddd@@@bbEYpaxxYEyƌ3vؾ}p:Kׯ@="m۶ϕ$|X,+HJJrt8p@UՒ:8dffٳ'""Ս78q"88X{jժsΉHff 0n+**7.\p=n~7dȑzn˃]+**J̆:cǎ O> Yd}nΞ=[{0p@φYPlK gA\v4jډp: q衱x_~y *444777???%%ԿF}zzMȵ Dd999vO<ڵ맟~[jtF۩pޅcG9)rرq]O.@7ЙuԮ];^2/ڵӻu#~ꫯ^rU7|SNzn\P p pi5u 89<>`s(Sg=GUVV]9%/ .Y|\ 7 XbҤIWw}744ꫯʲZɯŋ[ho3mFdcǎ̩SN&+r'VVV]~w AVQ3[fnܸĉڈdQUjڏy뭷JKKlҩS'ԟϰۙcoƙ`xܠ/v*"***/ٳ'++СCg̘!"#F(((h^OKa6m„ :txeeի T1ZqϾ{npmTɔ8{l) 6mZfMMn"F,KM3;RK#= ;乹N#ngv70VnЬQez0& o]m$qlK~gyg{إKDzh0 ѣ"]/N8w #ܠz?czһUUU5u.]]7hvډȍ7ި}***Nw!b`(PUU%tC z ܠmۦ5N%%%O?txxx֭=ŋ=X9n`/%Ի>7hoһ:wQFqlذAUd8qx~ aIII|MAAA۶mKJJcbb~4+Vn`G-K۶mE$""bG9pޥ}6JۍhSLa[ ѫWHm… mڴSE͆w}ߏ9ҞlD+;v?cmfFlذADqm$--M:!E_~qFFplaժ(70aÆ۷///>XXX}tE͌p8q27nX]]} ?(8 ̙3۷OHH8x6~Ϟ=:tз6@sbѺunСC"rĉ/n !8(mgJkxb`[ q9ܩS/^ݻwEE6>uԉ'.] ..N">pcߍt֭ĉ,Xкuk{Cl2::Z2m)4?P{_<ؾr(ʀΝ__ O||SNxW-ZԦM'Nh;w֡D#@7ofppp```ppp|㔁h tbŊ |0+!>>^UU3f̘1ch.(BBBwE)((صk޵ VYYw!SpᥥqzWZnW* ʍjJDzѿk^֭.`3"bX/_w->ޣ".(BBBBBS]MpIII k׮]RR6yFFFi#&d2edd'|((OhРUԵ8ހp㧜> iӦ5ko܈(E;fԨQfS^xtD$77?k/q+7P7P7P7P7P7P7hZt43"sp;fXBBBfڵkEdʕ6mgyj*9,̼k###⤆^45P&OSXXXRR2`{キM6˖- 6mE$99Ygw}Ng}KIIy饗Ddʔ)SLQ4~ߡC3o޼˗F^x4//K."2z'N|7ڸ=EEEzV```qqqhh>n***BBB,˶m0lK׮7n\aaTK6iiiFѣǒ%KO\zAܞջw+VTTT8KFSՔu։HlllXXؐ!CDdʕ?prr}gyF;ұsY"vw}7<<[nr%@S-4T'ݥFc[ |+7=#"߿_Zu{7kkw-ԁp p p p&d6Eqs Mp&u>UN?DS^[X*>pEYpaxxYDD."6MQ,EQ{챰1cƌ;o߾n5jTlll``ѣkz8%KDFF$&&n߾ݩړ]I֮]$O}^G7?NӧO#>6ޞch4b`T8w6lXHHHBB6.N3yTUq&H"6QAЁAȻәA94?ԭ6D7M$9gsTvC0`a].]zwsss?^}47۷o^|yWWWSS6e2ۯ]}LIJJjnn>v예ZJ}s\"rԩׯwttlݺu$I{b+U/spc|56B]1SNp?SVV)}=>\v=33s-epcPƣhڵ"bٴ!p{w?﹄6oඔD+q[ .vnnnnnnnLSII'`4nL<~'gᷔpcPpct6MQfR]]-"O6fY{+"999'ONHHFWHp(L&XVEQ :;;dX BD$77}P[yd2IDATw3fPU5::ᅬ֎1ͪl͛7#""TUݽ{۷.\t:޽kXsctYYYeeeVK.=ljjr{ʕQZ"OpIOO퍌<|\׮]_#]ee)-----x   #AQUV |8:4A+ <+**(dkv*hRe˖-'N\~CgUIvvvjF<333E$))رc"|.6`D#~|K,i s΍?~x/ng+~oEQNgXXX__sԩS/\jن" /|{Y,Dy̍(b۵<ëDn_xQDl6[QQڵk#""Q>q)566{-cFoooPPjZO+++++M4?Zx&ڵwޭZx&BAB(re? g΍}ZyE)**zbPeǎK.]l[ZZVkPPb)//5 {wTUFCCC{ݿ?$$̙3"2}к䬬iӦwww/\pʕAAA$ng+x*JJJW8qBlkkdc >OOII +..2e0,r%ўAt'"Հȍ7D>W_}uh?ZVpعBBBBBBB1(pctAAAZl ݮnnZtvv*bZyU#]vv˻+Vh/|MEVVdjoov{zzVyyy"rለ<ɴ{#Gj8`[Ν;7~>{{̙#u pc,ޭ.\HMMl㏺: m۶z{}G#v< ʕr֮]>={իWER9<>>><^==="~X ^[[p8cbbzϞ=&;\ pc,[vƍ[[[Nk1N3,,L{֭G0YhxƠT?WTT 6,Kbb6;;;:::'''00\g\ Yc?6Z`b"#  Dh;7@W7@W7@W7 < `.yyy@1(vYzE14á(ʎ;.]lٲW/sLhnٲeĉׯ B1>}z{{3gvءUݻt={VDVZ>n?{Gcǎb~h[EU󔔔诗/=nܸ[322Dwx sc,MT"߿Z y>L ԩSׯ_p sNiiMD㞔G+pF jmmhllq}fYxq[[ϯ ߱sc,>[v{ff -Z~p__ߑ#G}~VppFƠ1UTT 6cccCBBNm)s-5/ZAؐ0ʸ-c;7!{?5rVp p=﵌}}}"C/xF}]bL4i_U;7""f͊Zƌ*,, <5K"o<_KMoooUUUddxj  1>gљC7FQRRRRRU0%XX\QIENDB`biopython-1.63/Doc/images/plasmid_linear_nice.png0000644000175000017500000003410112250104543021510 0ustar tratra00000000000000PNG  IHDR&< pHYs  tIME+)߉ IDATxwXSIBE (8[[ժ:j(u娫ulU,u 8 "#ldxS*N$1^wB|N ˲~@r@r@r@r$WsRs@rtR4s320 Q1K$RIC>?82r克,:rL#k:sܲgOrdelu_r?gߟ~B Mݓu(el~eE phmֺh;)y))d.틶myoޓgN9oisLutwNTBIϒ^ja8\'EE ĎbGL@;%&λw4ok׈Ƚ8$/v(;j5c@mܒ0c:Q9?bƾ)vR*MBj306#x{v}8oݸqFo_J n'Ӭ ȟmCefKeҕ>+zB@keeVnNR4e^O18ӓ?Ȭ.ffEw M+|.!B,%%BY%YBry9Dob"lDZ׾a-!:1OΥK\\\JKKU{/6n511mv5cƌ֭[{zzkn„ Dtڵ޽{;99]VP[ǎ===۶mf˗/Z*22RTv(ˏ;H%J"ɹCt鎟j)++裏8ӧO0gϞK.oUBBGΝ]]]###(//߿cǎ...cǎ}5mյo߾?&'OO{UHCZܹsUw]rR)fS%=lqsM^U1N~j;8SViӦXBTFDDTVV^pO>,ܹsĉ >}YU( wuuz*˲Rw,˺,+Hrrrvzq//SN,7 <$55,e,(ôF\rGEEE>}4˲cY6++͛oO||+**X? "ɾիWrBvy,wYf,T*.\lٲ}nٲeΜ9SNU(gϞ9sѳgCf* -͗ Roۦo\YLTdϔ)]`2&y5@s\bEnFc==_mڴL&ׯ+m۶yyyp,--+**"""<<<܈H(߿U066 ѣ_}հarѣG'H9m90K^jozuKCws9\DMc:w?P(&/;tpƍѣGտ*YMMM}qpp0%:33iڴiVVVRRa@@@zzÇM֬YX???RZ"0mՅU{/77qU'u}T.id敁>gZE䲌nȶʸo$nP-111Ytg}xe˖)gϮ[NXBϜ9|=zݜDk׮f͚UeiӦUg߰a[FannɓaÆN'{) Dzc7[7- Yw϶̘1cȑ>)v_899<0 ~'B7|p˗,3sRaLLLTgD[*ҥK6ooee01Ǔ+WT;pepi >o75Wo"D Ğ=}0*4M^O6TBnk(;L; ?? ̜9a?mkk_s%KJN.]8NΝ322TLLLiҤ۷J:O?%?YfBȈ+**W] ӶU mx{[2y+~5$xqdEԊ?bEߘǴ>`:"1pd㫋3TQ&>_=-|>_,F8R׬Y33cccXljjjF/]GDR4$$a(333X u,ŵkUcEG/go;_ӫ~PNbK{Zܿ?77ٳgL* @@D666666wJO< _bjQպu봴ⴴ4RٸqΝ;7ZM=Ĥ,\:MJ9c;̻=EPܹs'77w۶m|K^khff{ٳgKRL6~޽{to'O4iR|~hh}qF荮P*yzzرc۵ki\nHHȷ~۱cG.~]v}:t(˲K,),,2 /*X|9טYf8pņLOˁGx8KڿQddJ*G3>W32((_ݮvu&æ{|U/RsFFF ǂDD}Wg;x3g~?cqK-Q'Kֈ1}PSuXy{_=zѣGcΨ>￧~R ײ7TP$TT'$cTЈ Q@uTP_$}">M CωV}˾E곤d/=[L~(8C^[q1Խ{P"Ϗ ˤ2?ҿ U^}#w [jc_3fOY4/`oQ{/ћP-b̫fCxt}Jҥ;MԈ(8f޵NJK\,7Eu>XUU0"է8†Y` V$P)aDGc  9R.^h2DQ 9r%u17 ި>vo8 ހfzch ȪUdO@o@`Pd \]iXy1'IiHO$}?51kԛU΢E+0jԩ%ƶCJeW%\8 zӰPЂz`z7ހ:7PO{x[7H:}ƀޠ7Z}˗c2^kn#x<,'ԉ ۃihLVD}vNfQFHN/$$@r0@r@r$$$$$@r@r@r@r@r$EuaYS@r@r$$$$$@r@r@r@r^ޑ 3fӧO;uuVe߸HsssOOώ;v-))FձcGggӧѲelmm===rss(%%e͚5G͛7Ϝ9IWDDD;s@r^o]zuQQӧOwڵpBP(9{ر=33mֻwׯ?~RtΜ9k׮_T={vLLL||P( ɓ6modggO8!}ݻw/h'Ous񅅅G޽]7nx{ j֬YXX͛\5 s?~K.۷߹s _mڴiEEEJJJii/0zzzC~2׸q .?~ܹgϞJr|Æ -[ }>ζ={vNƏ?a„:ab>gϞ[[[ҥ}ꫯ>ܨQ#H7t&M`\u6ȑ#ś6m211ILLn޼ R(FFFaaaiii$;w,]T*Ɔ B}}}YLLLLLLT>uT~~~^^^jjܹsW"266rgϞ522IMMmXd#F1bŋwѵkW՗ϟ?|Ç/[ CCrX,&LGGG"rwwwHԲeKR)J1egg7`-Z?V$z?eee/ Bgggӵk*9|>Yf999YYY888a0 SuX&99^ںukBXVV#a~k:cjj*_XP(RSSR) Xlaaڕoux˖-Ug744fff\]]_.ݻgll,"##]H;W9IIIJ2&&UV VZQRR2j(RYTT4|>h̙7~lHǎaP( 7qDkk뚧D?ӟڹsgRW_toݺu۷5k삃,Y2tP///7^"iIM ޽{\\\@@@2\1t bŊŋd2G4j޽k׮}siCӎ4e FXBCCoݺzjm0rYdj>emfǏ9r˖- g}#HDɓu[eAs /y__β,0,FQÁ\q!]hrciiYxlNQx8V9PcNZ{2p`U7_~I5:AA.:nNѠAH:;v` UɩQT3p FVAuPu__~P^^iԻ7j;ߠ^*SDIz_t7^9]BЗV)rt!9MUuZR^{R.WDa΀H: ArP@u4T$Ugv0ArT14=-@筪4PAC!+-yTArm!pt  zހ{syy/6,۷7!@o>ToAoPo p` v=\ ˲5Xb2WiC7 \^ D: Z/MCހfx S{zP9wAr@o4$@C!b^ڱL V9 7 z-_a"ReYy><'{b5s1$\\ ŨEPjgTm ˈX?V/L1Dl^t sLmr/^]1cIBܰO>7T%g+x.@r@r$$$$@r@r@r@r@r$$$y{{s8eYL>*$$$$@r@mCr@roȿjmAݭ>I@7d\ɸvRT*:~hآ{0+IRY^0F8rYrA?:wjQ$$Q+ZkUYmnOrnH4E[tQoNRT*3 剩'FoWΓ?(<&Uq l{W_,yZҴc-.xq薡?!r.'Ԥ]I&{Ie"0"bڐCt7X{, e% w$V'{R^f-͗fg\ܳ,Pׯ7-^sL)lAc?eߖ$$zaP'NO(999..nȐ!aaa XYY9䍻:w˲|>gϞݺucFTFGGGGG|-Z }ݿ ֺu4yƊDCfffӧI&ӦMH$bⲲ*++GݨQ#"rpp4hݽ{7!!A,?fffDdiiloop<==ѣʘеknݺڵkD2x: {o)+1jCfnla~v$0x޽....]:tjB8˗7nc#Je\\QG@@8}ˠ[[[UohԨQÆ aeܹSTTdee׳gOT*H&mܸ/04gOi;X%{%xFߔ}؍'~#Պ-[maa1f̘TsM49111((Ho鿮GcZEZmW~j'9rd=hE"Qƍ7nXCUM'cƌѣǔ)S>}JDǎ{!˝_P߿„ 3n!$+b2٬HԜ1teYM1IDATOU]]6gΜŋ>}Z6ڰJgY_dR(cttefjѱgϞ&L8qgBCCCCC_Ϛ5)44Ϗl+(/oʴsgYɓ'+V]p@__ԩSŪ"j:me8̡`jgZ_[~WoooP8::#D$ ]\\jOr{{{.ۼyhOid:11Q iFɩ ---]\\pJJJLMM%YYGI/<]|0yr6_֍UXX7Nj-jݺ50ZڵH$wޗ_~0ۼnse㕛ovoke“Oǭ|Q+V,^X&xXށݻDz,0,˚dddXYY}7o WWj҄"# 3 Nԭ[$55իZxg_|Ed.;_,,!okss}~vرc_ؒ[={FzѹsXn e˖>kZW/(gggG]{~z;w J :yJ$P 9@ArՁZU(*-/]Ugh΅wޗ"#woQ]zNLqa^R"P(7ͦM77^UrM [[Yze p}.9y֫kZh 75#p9#jSwާ7X&7H f ڸc皼Kox3g7t 9gj$Po@o@C!"b_f+B\^VР aH_eaYjKU(ERdB/_8'{d޿][q1Խxd Ð{o+1ly?~ƕ =^o׏r_kxb> ĥ Fh;@}VD'4G] rH_4z๜'gz&۫'I_|"Fo@ݫ44jݞycoR$%)SOss}>o@2ԼAo@Ao@AoO$ fj_82h 9|/sTԞT4T4T4T4TtW>w$iUu.屯8cZ`MKK:ިh 9DdNX:դRٳg0 Nگ`ڵxuUu0PмPÇ?suC Ȗ-[2 "L΢E-ZT )hX-,Yҵkר}͘1#44e˖3f̘7o^dddjj*ꆰ19/!"60PAE">_Ǻn |"eYHTZZZPPrJ yԨQ~i.]߿UN% 9c u6mA1lذ={~gQQQ ðfp8H@Z|.\8r䈿D"ݻ3lmm/_kHxӧOƎ+^0`==7FGG6s=@r@r@r@r)d2P;yvZ(@M i**MMv:T$.3nY2TJЁ]4ڶEu?~rL!n$b>eeڷC`f@ԉ\JVYqٍvv=Z@uoQo.^ۙ+؛79fBpNw0NW -j?qƢƭ[c>4ꄄ맪7ꌒUOܟZdZsr#-M0@rXoBC);JJԔz& c:ί 䦄 082/~Ԇ% 22b'wwG PQEѺKK?{J) `KPZ5jDOĉ ԭwOlsŋ54iBx7Xri流 6(>ٽB20 wwfꐒUV4myѹryB@o@#Gj Srr 'NdV$5^8u$BÝ13 #{4d@G>x# ܹLy9PL ̮]Kzu%_vR艵2Je!}CW| ;;ɓn3fjL&;tÇ|}}9,-i68 f(!?￁:Ͳ˦tp7+{\{9N0IZV9 p8ǏWm_`G}\^^OR8LJ]zD&$c^e>:{P;oa|i.Lm/ Z(_esE8!2VK zuy]gO>o2 ''&&f[nMMMussSmOOOJϟ1acI:>Th:y jLNTTԎ;gddTRRr}}}__VZj311Q*:tm\jB45e""ys[p@mrc4N^]v >|ܸq è69R3g{%ˢ͹7?_̘1^^gUuZ$ۻjS:H::HϽQ'p\""X"H\l/l_-a͋lc-:^<_@ɹSֹ :ra@rP$$@rP$NVi9䨝P@9 9j ޣ7HzHz7 >ܰ}]IeK!ǫOAAB7\@mp` @r$$@r$$_ؗY|9&jud쭠JOaaSЮ]4nۧWRW.W65t2-xvu+}O0xx_SFU7(@}^`:m>ܠ7HFW/7 zH_Ѓ 9ލ zԟ$%ҥIJ0ۧ_-Owtѣߡ7ŕ;Dk?ZϾgiWEHŽi&O={^wDJLK>|yMIN^عe2/k#.Z=N4$@os9Zm$W-X]BCCoh -4qb}"nHv۳>T'!*s!4@r:&0Q@rݨ 9::h!T0$i1BK?I|4uHNõk3-Y3kTLju0 PUgd85ӪHHhguQXmS+'33300,2 ò, C><ΩSΜ9cggMD Q?3===yxg;wz#˳haaoꔔM:w-uhÇ'%y㉊X իWϞ=/]‰u떒BDϟ޽{N\\\l"ϴ~'ӦM+++{% 3gNܸqU'_|8 ݽwr_ wrr!C q*Gphh|}}׬Yӷ+W*oܸqĉuֹp lڴ=//oVVVÆ ¬9b a?yd߾}{Z n:}ٳgϝ;gbb=wںl˗/8pٳ27Lt`}:AT޸q#==}ܹm۶uvvNNNnٲSNNNAAUVVV3999FСϜ9ȑ# JKKsss%R$v҅:88ee2L&{~葉e-d2YNNKOVRR0EEE3g411!ݻoŋUPPSTTDDJM6 xxxj#rrr*++6* Lhn:A?|ʔ) TVV B"GSN^k׮|>?++vҤIM6]|ťZl;f̘䢢Zb7Tϝ;m۶-[2 p^8Ji``srrˉhԨQOckk?uTCCC++۷o1 s޽VZ]rw'K.zxxGUerw 7n]H@ ӧi=;tT*srr BCBB<<<& [[[ ;;аɓl֬YZZڔ)Shܸq&Mѣ@ 9{֭[ U=ySRRzݻw_><}l۶Cd|>?%%寿{ӧ%Ɉ#;: X$$@r0@r@r$$$M;Jf|IENDB`biopython-1.63/Doc/images/tRNA_chrom.png0000644000175000017500000071310112250104543017527 0ustar tratra00000000000000PNG  IHDR7 pHYsgR:iCCPPhotoshop ICC profilexڭJP@ EV p'QPL[):$ٚ4T)M'prt7P:8D g:òQaUU' ̲@n&vQ>_vo4a hcqSE?7}(2`RdN'ZV,˒v/Cy4Ju8L^*UW= lӪz2C oF91^[m na:o+e(m ïPo/ cHRMz%RX:oZIDATxwxו}f{H{'%U^mI%w=M)l6u$8cǖdIzH${'HhD/3ƌHכѣb{O! 'Hfg<30000000晁1 yf``````3cg<3000000晁1 yf```````3cg<30000000晁1 yf``````3cg<3000000晁1 yf```````3cg<30000000晁1 yf``````3cgۇ ÿ 6$T4Tj2 ETTǞA=p8&''bq\\6<<<==>;ONNJRpST^bxz//~4:plܸqQ׾_B kzc`t0g9Z[[[fͧx~J"l۶fEBaaLAAgMJJ¦[0t}d[l"6mqPddl>u/~ T g}}^zuKKK__߽fkjjnw\\\IIJ;o vԩSl6{ŊP(o].׹sfff6l  Fd:ȈR\fMnn.s +WYv-ůx<ϟ˗/oڴ)##c/r.\088T*WXѰX,333Y,qEQ\\PSS҂JNN^r%v|;$Id2*l2w\$##k׮]8ǯX<f`'+ǏOOP((zo'$$#~eRRRSJرc>lBٺu+~!>hyyydds8!)}---5хįz>/|{o4<^؀30g-Ο?`w.Ll zꩡ!^xqp/Ğ_vI<opp!#VzhU!Ӊ[l9xWlmm-B׾]O?4B詧x5066g~K_joorSSS7111p\o&>mxUVaHtee%>֫zI&F"hbbil| .ϘNtKK >PzzK/_, ??Ğ99tl߾](ٳ.\0x{}w}'Xl6?Dݻwl61ZxJ>SOVUUAq\ǎ^z鮻@ p#GD{gjjѣ*~ӧu۫D"{GGGwڕCIII۷oj5^=al=SjZDFFnذabbBVPg4Mر l@{I|wrssx[,\(.++ۺukrr2/G}$ɳgn޼955%Z/z(LHH G|w!%%EV J2&&c1("IrƍMMMyyyZgX]REGGxP( O:uӑg``3?eeef{ʕÖ oglBUOOOqqonݺC'?qH$¦qL"hƖc6G '7dPx<^8{;::.Y$={vݺuׯ_=>laa=uTii)j"cb3gmVYY?p8>_LJJ߃oqq?al'$$ڵkΝv*))I6}s۽qwyv\a/_VcbbjvÇ^^XX  ?K,Y#Gx駟/3׏gff"jjjn4p'xall,%%%}lX>/h) }_oi&M-tғO>W7Y0}˗oyf{fWall ;ӟs=Ar|+ز.J%6o'''_xᅅ3.^|ի=˗,Y244P:,}{_ree8Yf͚5/_ްaömZ[[kjj$ N¼###\.ԩSxC,H:::x7==`0nooonn{nšc{\{ꩧ~_vB!'OFFF^~ҥK z|\K(q@,Wc#LQvtU`E8pJJNNƵI s=fݡPhժUܹs)۽gNKKoVp8~i4{gVZdIGGBhhh("""::y888==-@0r b333B011133 A>oahx<A l6.v\EdP(q?X,)))*a%n7IBo^/M rrrF^ g`'1 G(*,,lmm=}B6ÿLjf>wtfggG1 s1 yf``````3cg<30000000晁1 yf```````3cg<3000000晁1 yf`````??gv oب {766SQQxry]]^lUUUNbtuuyVwᔔcǎ9s&pQZ}رk׮)J~ʕ`09իW\BXԡϞ= ov__ͮTT|tgΜD/_t.] $I={`0}rG9|(VTGmnnmnn P`0\vm||\ ?^ Eɓ|>xxw  zܹs4M+'Od^X\VVF *9 +++ Á\~_ :t-..`0444ׯ_vVe6u:@ `&ܛ#^H;>>v8|>̙3zWR]|fOMM]~=""qロzĉӧO^̙*Jt:/_ zHSSD")++iZ~att$Il}|~mm-Iȑ#f9:::/FGGS/]j:;;cccY,?y>x`oo5Mrro~ .lڴivvv``(|]}:==}zzoFiooJ===YYY\ꫯխ\2UV ږ^???_UUp8,KSSSOOObbbLL|R+//p† X,\QQpccxff&q4MYYYQQQCCC*EY)=ںc,Y?\p k׮\x4TWWp8)xη~;###;;;x7###M&S(JOO 333$IxֱP8;;ؘ9СC۷oj$IVVVVTTl߾}ttd2yb nAtuuaB!HzܸqJCCCiii<q8|0 MMMQfەJedd<02""\J$J #""RzX,֭|FqrrRј@ Cpܶ6K qqql6544洴4l2999;;cǎ/a߸q֭[k_w:lA":N,KP(4>>RVkuuuDDNJW&X(,,)鱱1788ht:]SSĄjUՓ 2tfee9L=>> -[{v .^rD" ۶mîJRI+WBF^OJJgXp8l޼칳>σ<6>:33p8/ ƍ}+z{{ :jDԙ͛7ζf̎455裏4=66h(Rtw}b_R^lK,닏zpVv1NtGGGkkl @X,\,vYT_ (NӉ(B199OUڵk{{{w}Hu̙l\p|[dϟl6;!!ѣj:77ɹrFq8Em۶M([{moox<˳=100`X lR'>֗yӖcǎL&Vk6+**rrr֬Ysq6]PPbʞ~醆|8BݭT*srr~;w.nvssDLLL&ܻwhYYYTTҥK{bfڒ._hn.B3Аj BpjubbbVVVnnb7R2i梢.\d)))K.x>??jժ9R922rz뭜PvW^|:Αi4јp>ݛS]D".+==bl6Ju!ljm^;w̔vwwGGGnñ|Eņy'N8zeeeTӧO߿bzuްalx<)))m "Al6777􌎎:N6h4fee}Xc]>(ŚBUV'NZTSTr駟əp8qqqٵG,jsy Yj^7::;444(TJd 0̓}}}vڱcǢaϟ߳gϝw?[˗gff˗,YrŘ@&''E"Q(:wΝ;Cw:ZCO)kw&i )ovGG\.7z^$qd2s=BshXoᖖm۶Y,ݾlٲjuwҪUjurrS` h]];300j[bk2fsjj_XXA}ettt9r$&&&&%%$I۷fggWVVfddx<ZRRՕ433ѱvZDk)//&&&z}JJhj ggg?iii[O4 7M)b4M$/Cbߜ.Qp 7/8qĉf`0$%%i4GQ嚜 EEEwߢA%B6`*J"\|9==]rJ6dap8giٟ><< W^%bժUET*WVVjKJJ%::ztt4..nhhZmKKKIIk~>+;FN';16?Ϛׯ__h4~V#)++klld2n՚t:|~OO Aghh(77wjj`0x<D"QGG^_ GFFV@744TXXt:srr{nn)L^RR244222fQpA~n:?-[/~//~7''vy;^H(Ԟ{nwiiիW:/yppX/]s񪪪RSS9gϞk׮-\PPP[[+G}3hnnNQ=ܳaÆON;~7񍤤$)+@@]fk??????j/^( lR]]R"""._\RRbXGaaK-[fǷnݺLR /|_=uTSSƍ^/BhժU'Oz+Wiʕ+2,55jݺu]]]ׯ_/(( Ϡ`$^QQ_Z.W>ɓw'xbɒ%w>?D,% xշq@PPPP]]wcǎI .TUUd2>?==Y,Vkkkvvlssl4 lgd7?԰7x`4>}:99yrrrjjjpppttEEEoQz# BѰ"#)"j=---?pbbo~k͌'.gϞccc5P 8im2bccKKKmv;44 rh4P㠝H$ VUP]vQr={611qnnnzzv`` ++k```tttzzrUWW ׯՙf`XtZ]>ӌ}>_ Bffr(z(9ydzzlnllc644466699y5x śoc#^BϡCu]=\^^M777"Hᄍ2,==o,d9NIPTwR/Hd---6mڵyyyr\ ؈@jndJII©: e4M[,;hlvbbb0rwuי3gvuu6|>6yMMM;NHH#sss֭t vHn޼yhhcLKKKU*U8D#B`EB :~O~;w\lcǎ~hhV ( =hDaNz"SV(N;v|X,WWWBﴪ'x<ޢ\P?<8?$bŊo|8 l\r9A4M566줤LGĺu|>)((pիgffRSSooj-[V__/Z-9y$|ÅxGt:"##qNeeeb >DhEަ;g>vZ^}-777**l"xp:!tZp8Ei4@ 0==t555:l6ftҳgnڴo͚58tU}v湶655599b| FnnnX, ]]]PTT400955׉sss؜ x D’}}!R䄩{WX)lΝ;<844t7A`T*ia +*ssxӳnݺsFMbAT s=Ov:K.-+++...((rƍ\.v\111gΜZd4 OOO%**jbbb۶m==KWgrP.Op?쳸 H$ڽ{~+ )4,&Tr" B t췟}Gjkklv01118$Ɉ4;;+ iv8xQbn۷4-v{||˗-KJJl ṹ8l6066VRR7;;x<^_ZFTu!DpNw"##? +۷;IHHilM"|pzcE ꡡ .XV@bp)Nww7ź{6}v=66VRq8\-c k׮$cǎ_rgˋD+W-[z-ѨP(*++kkkv{__vj4\8pѣ-q+"##W^}mK/,`!=9m[քDsURn:B/Yiպnݺ={<>}hPN;00p8 :EZZH$2 @$  .]Q@6UD X ;ͼk:zm۶VTh$p DAh Ғ3gάYgG ZmZZT*r:S񊋋?3A.5 ?Y0;;+JfD yD"jBHPK uwIK/**z'Γw۶m1 PO+"PG㑣G߿t7x_zOO.RRRZ-MRj䡡l6WDDۿya`  SSS$IvB|>\._p{<T 3O[u!>H$M֌4Mu]O>-[A=ztzUEsAp[Ѩ7ިݽ{ƍ_y'|rddgillYYYQQQ>ѣG322[[[RO>yĉ{S\ I:PjFDDaժhg!J7z^/vT !?V [h<wfO:*)pyQNA0j!9sԩS?իW;::o^[[âj: 왙lY,V___FFVo.A{޾!/ xWz!,5SXX ?dfffdd477!FGGn7ÑJu6V&i޽ާH'O|79plR XV'jjj Uպ\.LVVVV$ HHOO'nuttggg_vT*Vp8ӻ׮]óWx+p8^^TkZQDx |`MGxPtGGǿۿ={ר~&yp Ql5.~󋊊mp@aa+Wr9ISSSvr:Ν׾?(ʭ[ƞY,)D?'Bb.KĄBB2 ? >HdiJ 6!'<4D*}\G{\.EQX>/ jzBP0K;WKKKqL\v @ B?==5<^4-5MTTT__NKJJZ L&7==S% ^m6D" Ml$VL&UOA\\"4Ҿ %!-Ç>^vZ015hCN$x\D;`PV'%%˗+zͶe˖l0pv h6:w߭Xz˗M&Sqq&&&\SSxmmkhhhjjD/^mii1LrQҥK):r>.x;;RL۫h֭[w'^}U˵aÆƢ"***fff6n888[ZZbq}}dSTW^ ؇Wń994""Gl^}%K,6P СCw}w|fzP@ȔD4pyl๑Ņ,Esss%%%/^Dwqĉz ~j4*!Dϯ_~Q8^ÕW^hXn+Ϫ?yrrrUUUSSr1)6&N'VNț'+޽;112Am߾hXф=(ZGEA 5r {޽>OP={CD" 6r &%% ¹YZ-o-Oddd錎6XLT*Jx<^nnR4$>>>11Q,zBR*N@pom| _GVk[K˪kgZl3 r?qb~~X(FDD|K.bݾk.ټy3acʕ+V o^o(ZTѣGNg8޸q].jll\zP(6lHII BX l~^hs EKF-@)"HGB~_7yyן|la3.& Dk$I@Z%0EQ`0""op!˗qrxקT*)U08]a ˗/p8QQQ8i6sʽ{\̷zdqtlϷ:A ::<:lnfEDvV(4<5UX\:Z-p}e2Q`g'XGTDd D(R(~ZӖfdf9 at ФhڱN7<<f@Dwww8V*RoذR*vvvzhjjh4cTUZZZ__n:ȉ(Q'H Ə~I1i~eMJ2a<"L!BfE 3:;?WKHHizxx_޺uk0<^?99u֎͛7;vh4Zց@cooo8nhhضm[^^ҥK5͡C*++ׯ_L^Zyyy<|ر>HMM*,,61Zbx|O.\@:PTAx `` 36D(ȈPb&%%ǿ;$I>===>/++ K,d2pZlv(7o|c~~Oӝwi0~=ϟh4Kظf͚!v鼼HRJ0|.p =K%BM)lJ*?L*G ~@;7"<#c dǖ<]T*K >#|>ի=PRRR{{;;R \.߾}{(ZlYnngf4?;АCQT]]!RX,p\r!Rr T*eXccc^oGi)ðp-XDMYQQܼ<02 .ong&HwC$ifc&Bшp8Ic?pkkk~~ٳgix</^`Xz5kָn,iX}/7j`a6 WJ2//ȑ#yyyW^ wqL&۳gOkk֭[^_vqRyXIXшM( rZ%PhQ],ɘ@x޸}>= Y t /L y.jڲx@ h\ZWW{Xw/>w966c.\@cCKu^e$D"iܹsIII\. C􍡂Tbj~,z w \B^?t@J4BK?RˉHbҌN (B,5ǏhMJJt !TUULMMB!Q(ϟGccQ'Y__p|M6:w…{G233 L5 2'IPft("IrQ }oa&))YǶ9CB!8Nؗ d]]ccc'''e2P('7nB055rEGG/j $|IqX|y8h4.Bv]Baafwt:m D H1dIEl=I ;@"h z@@J\.njr l@l5R!lB,G+X+WAwev#DSSS صkWR .k!< XH/ܺuP(|衇Z[[hOHAAVŗ#Mӓ`0Z"#Y e''#/<:JMOs9A97Mc#}.A+f .V\!x<`$'S,!t:xn :b$R>xSVǥK~OOKKtbX '.癙8# V\yc<OL%%%, KR7"PJo0 bf>/8Fg")M3lDQ.%.f%@AђsC*b˖-׮]_z饥KWѩ@ oٳ… A{K.jn݊0i޽{P(###sssַJeGGGFFVLYm$d%CH-#B*)d%ܿ b;Q$[6njjZf UVaܤ4]__uz A8' [[[srr***N5x^cbb<OjJJcSSx^@ p'}^ gGwnGm3@+;wnzz;)B[ZZI$Nv{AAAwwx<333:n!oOl6I'Oܶm۩SL&SjjL&s\Rd2]$ɾ>\/lvoo/ϷZ^W,|>Ȣځ³[Ap  ApVxzoit+@r!,EEP,%' E(#nŸ#W\_b` ʕ+ջv)//cccMMM</##ܹsnڱcGyy9'=cujZB5 RrI D111! D11 Ҟ@IKn0 o{>=K,#hl H(;G*\2""F;,ф EJL,d2}>_dd$EQ8'ͭZٳ&) p8X63 ٝ+WX,zٳfynn.++mܸvcW'ՊhPMkD3p!L6n.A Cܲ w"&:~l)k~߿K.5ͣl6;//K&vZ/\v-""B,s\[l.X«~n'A**hZ p~TT.!Iba-_$ᰚA$z@p\wkF݈Žp!Y 0!^U?Ϛ0x@јxw755+JQUUWOx W577!. 7"뮘BHkÆ Rtxxxjj%IGG.tYnIfl,+-- s8N  ~?f\0l9 n~~ܸE.OJIIܻw+Wp 766477;lko,ĸ0Ç ?y/ejkk-hliiDGŵ$Ialp } X*ʎBHpڅ9G5j V#,^"Pv ?,9T* ڴiӱcpyXwwD")--|QQQ~bbbӦMd!m/ of D>O@YzGlhHZEȨk' hmm;fez}MMMggۿ577~;wɱ푑X… X`x_.,,˖-rRh4^p!338΄zG=99jժK.è H!zPJ 10r޻v,'ya Xx\a ?!q@( Ns֭2 8soorJ2::nU:l6/jb8%%ns8b[Er\?ś6m›N\C@H|f6;;x<pP9CcŸrp7: Bn{``@*NOO=Ѹ~/22w^IHHlP jhh;n.^ʾ/i4BqƱm۶XW&''嵶$' fKKKe2.KpBRJCO?-P6GXrL+v>G: 7{SP H6pb 0?k Pv4>SO_!300PZZJQɓ'Zet:kl0cbb"##9n|g?22t:ڵk|`x333CCClݺu/s:6mzWt:oqwGFF-+*R"fgSK QNOnp۵ }}+Wnzisw/{ɒDuvB7+@0)Q6'675v8 ϋ֡!zpguV[UUe6q]ivv?Y&.bRED 뮻}(J p^o֭[WUU﷘2:zeH/&4V4& A4PR)+͇Ǣ ^S:15v}ׯ\W+6mypק>QQQbXјL&077w\uuuַ 7n(H22BQ ~#~#OT322FGGC?ϧLOOسgs=8ϖs @ X *?ZE3ی=y6gDX$''[VX\^^sΎ8HYZZԄ(JII l6{QU*j>~8.cmϷ{WJ$ɓgΜi,EL  X@pX^6 oU@Y}pӅ&DTs^D,C:`?{%UK|BJZ~=VVVl)"hvvbdYT0\X__[XGt[[[__EQ. 7,((j"hrr2??l6 i4FCMLHXI \2_X]KCUXjuJ!Bh@,TfBMJe]]rX)d; rssy "Jwp8rrrZmee%|+WpB^^^vvvUUUqqONNr!''jjj FOH8 lȟD(Cyb-Bз4P / ˾ō,سܿ23gϞ'OZ,ئ~׿u0W255USS狋{ꩧ^~_r%77wdddff#NG[dICCP(LJJ"ʕ+z>֪j۽tJݭ*jG`4-(ZGLF51:MM A#pJD adb Rrsse2om6zꩫWVWW/_b$P(^q$ֆ6׿,tQs=\paŊmmmXs1&&b 5557$Q4 lpfbd#l3@@X85L&$q2,6WJR4>><ol=-- /Vp["ĔGyv '''v#n aÆp8,Yq$Ɍ >A`SD#h F(S]qs6~%(E˻rʾ};T*򪫫VZt8C \ϬggB333bij|5k֤777GyyŊYy|>Jli$'7X,><<ljbEGt:Dh1M_%}Y K=KѴpJ%mH<ŒHBpdddE~rhz=. $T:55e6lvNNNoo/M#[wddd~V otv%&&b Xh&pff&J'`sY'DDD4$Qpja6 Ms@K_6@4Ѻ%\$}:::󫯾i&&''GFFz=4پ}ۇ~kk뢔2.]<77fZ n׿鑑z*::ڵk)))uuu<,hmmݱ}3 B} 5@2LQSo?@[x1)ꖽ㇡݆ 7n(Vqֳgφa R).!eX(FdZ{ҥKsssXm---mbb"..# fX[ !˓p6"ϫB @ ~[,57A~Xp>T>|ģ>o~iB-Yr\*wQVVp8+neW^y'N<յrJ+W<{Xf Yw˫Xti8OLLm鳲ȿ n]`&=W[lwT9)߰ |4AOVtMv|DBSv)NGrx}ޱ1׋[\x<ܨ{ok֬YՕq.JKKq^UUq( yA766fc |>׮] 6,u!&p,}b .y|.Hd!LMNRSSeZѱc͂P?P)v;'=(*IH$+VcL&"##gff&ֱd'==}pp5k466b51D288{nɒ%:W_MII˳lVU$啕"Bw8G}j! CЃV4BKLDׁ&4DR#;n*aR""ܳH*6*h 8^ ʉ{ |?1 )K.۷Ol6Ԕ{G}IX,~nעF899yvvJIId$22r~~>!!A$-]TV+ G[RRržBʢiZa AL 8R@./DnPF)(rmKx 5)0ko( 8h4&$$|>_^^{1޾aÆIX,Go~X"|,ʻb ,z_TT433a6=11/m۶x<,Lf⢣7lf?\opٺmۚx<-van֙L~> @ć}@ 0 pn 7pW#9s|ժUcccfGΪ*׋o;Xb~KbKŔp+WձXT蚦 (]B@! 9Ē;^yQFG6ʈ`/}7A HTX[9`ɁE@ P[S |~8D7ᴴ`0\.ȶmfff<7㴀B6?~< -[W_p8<իWo؈β脄K.Xbtt4 .˖-۳g@)`Shs33^p(7F4/H|tshzUwYVR"A b99 %C$IȔ梢"x<dB厌[ p8UV書^[,g},wK.mڴ޲eD"333W\yI˥V \)B\BI{7EfЈٞG>| Ѣ@s0#D29^ppI|rt 8>* gff(KPJO/]z+FݢڵK|m?M\oiJ$իbf.;>>b^wpp⾾)Z÷߹K.]t a%I;ƽ˗U*V]|yEE^ޔ˗/t7;{.5&g>,  4h/Dml# c>Pw߽|r,_WPPVTT?>55d2w4uuuPE" BZS$NN)>/ ˶oϾ[Ͳ@7?3OtLF;##DB\bb1+@0xj.êa W03T*X,aӃ[-:>>d2L&,_788ݽ{wyg||+Dv?x={._z{{RRRb?ၘGA{. ۜ i( a +B\BW1bBg}I^ IIIZP ۺuk^^^QQF9x`EE;633`0mmmcccFqhh@ :rh}D}D [BC/g@'EdO! \$FMC 4 ,>744hݺu|>ҥ wߝ~']V]]]PP'캺:54ۗ/_Vo-RRRΜ9jժ^zkkk[dIgggCCǹyyy~ff&e4L---20skq; :"n?xko:,]U7 ߾eŚ)D3??+++׭[۫RBaOOϗeX|wWfffbEOXp͛7:u* Y./|bnngee]rE*YiժU\.7!!f -YFX N [C, 0xF}$nVMq H!47]C -A5A` ~Jo\xwWHff3gDZ:)Ľm?bp FYxl湭 +tvvX@ JPi4qïJZr󛛛srrXR.MMD򆴺 BXLܶd{MgJhhNx\xb)H \RMLO'OLL,9sfA5lɒ%.\˛!I2==}ժU !\5Fqݳn:zںsNx+Vl\zjZgϞUVVФ7ZLB)"T"P 檧.Z~3"}fܴf/o[f3'bX8G,??? {/""[5JbŊQQQZW_xMMMQQQ ĉJﮬܰaҁYL༢˜Ls8^ PV$I/ ?9DQXH/@տ\@fZsrr^yНwpNZ6>/;;[VD"|f׋(fy^2J7oݱcGss3n^\\p8VX166fl6w;Ƒʬ,>dJb>B$,]n3w?|ͤ$K656^|pSxy'>iz͚5W^ݿc~>Muvʨ؉^G*$muu!rY @!R33,B ppܱnNwʕ\ bg(jhh5 EeRX.r\:  _bccE"֭[E"f ,h$,i[-#"}'/h27j r䄞6?Y-\qVy(sJejjK~iX_0R뮻p8%%>X~ŋy˖-fʕEڵ ojX{{{VVjMdIڷo+P`Pn @0"^ ߇M]=ӮsA|.\ B֢@@Qk"6ffV^})ݮj.]r}{l6_*N߻wc6md٪[omذ644ͩT+{~[:{lV*8|E,r|~\\܁6mD$֙-V+v*U*P YMw,  0@5PWLMM^:>>FFF 111@`Ŋ퓓ǎq\"ĉbDFF_җΟ?/J[199}WU xw|W^y%==]~`0TTT8yͦhp߿t҃{EaM"gvpl E$!vdFCA}u^ nFIHHD555uuu|422bXl299ԔX__oX BZM!RT(T*;p8 F$v9lkcWXsoxZث 647u\HG Yϧ&'Yz=$  EQQBXdIGGGfff}}=nqZ7%\{7:cՋpjXVVa^e JLMMp8---UVaqG~%eyMD(?y&%@7)ntQ^Gq+!y UK$w.-P)&knn6X}Qk=F5ONN`Ge N^WT$Ip8 mIد[PP3Xh=33+ x06(.A-'hDiqĄ`) ũY}~^02b濿6v46 ,$B!p, ,t+Ook4ەJebbbggd뮻^oKKeX&I$FñbŊF6A 5oA3_WLW;|@հn-,Ѩ(N> o6NOM၁J{cLMMb ȈD"ټyb ]]]bxVnJ\닰mww={,[YYT*mVSSSXXݍ,((hnnĶd!VR;bD z ePNDh'ZL&BqGILLt,-[nTp8V}}}˗/{NSx 饗|}wСavv!lٲ˗/GFF ׯcwe(333sss{<2ф)c4.xqqH p(D!<)ؾ]p닛B+457G$5>NH@A(< !tm۶ ! B釯ܱJPe˖?x@MM x,kQͪ=Osswܱt˗55lٽ{^z};wnӦM{j555Xcǎկ<>F3=|ܴłVu̟&Ay? 1\ȢSiqG/8{###.]ڿ?Mne˖oݺŋOONHHضmb?unT (**a2h4^x111%KvӹnݺÇE:%OY &H#a؝!xL|j>p4FfLD$ Pmm-ǫIHHwynYڵk---7nDoB~D%<22RQQq_ݻjkkp걱˗/Z[nfffjjtܚ9"$Kp8= H'P"11/1 ?orrdtt466rFgrE"F :N>|dttKGDDWF~l6߿NK@bbիWzbQTΝS(ʮ]fgg333q"plH%ٷE9 <8 jQ ('BHԢ!&gXWvNl6OOO6vȂfkhh+V08%V MNT8jXiikf6q0|ZwYQٜtf ;!o ss?<ɶpUUU=P]]l:fkuZ)iEc4ƒh &n4sJK.}555' 766^|9>>>//orr}^+W|r9>>=7?VRRRXXUvY^^k.n %N{P xDLϡAWAK'ÈǁPdBz/ޓ*7oCJ,\y  N4ʒK+++ccc~yyyJJ`8{,ɟu>n} l6ի~ztttii)|>} ŲvΎpXVV{DGGOLLLOOuaЇQN䌰[V%~޳@ 鰐$~;Ֆ/_B4Goy<ޓO>d2ٓO>3`RRRbcc].͛l=ݳFFFuw%M%<(Ra3RZb6Ea.RlA|t^vHzիwu׵k***pgggWWh뛛U*o+**>y3ύ F06rinoo øSLLNj&ivv6/Tr?Ǔ -':/-[hn|>qۅIh~v8y,!<9hh-9fff~E9+V;w{Zp ***F]6,jKJJ  [lJNcnnn~'p{صkD"Y~}II B=&6F PFsbBm!AvO 64#fP$wq˥R<ϛo~'OF#A]`0*V V^]UUnu>9997r>?<< qիWFnoii!"//o```xxx+W5?jB#I:DN3<~`hBp/ys< 9;Js{jJ)fmW"iHLu[n=|0山$Is===='::zzzCE+WDFFNS IYY^Zv-nqi\W^JGX_&}SSKA7}啍kn{cVT2>ÇGǟy ./}Kbd~~~``9r$'''==׿O>^xqnn׬YSZZzp8Ε+WV\YVVfbccj錊ƥs:R4** 7rݩC&$B|G^ A9!lBf(Lnh!<@xZ )%8 Їևr9Az纺p^epooBp۱cG]].g3QQQK.Ūa"O4+Vj<@UUիjXJJʖ-[._3`ϭ[666>CcccOBln&D"R*%rB `'&"?GβFltI2w@Ma4M`x he0GG11D!+LQXWm&$$vT622T*nյjժL͆Ur9nMsڵE `HۤX-P\ WmaV$Ireˊ,Fg{\Oq#+!x UFD!HIm;w:q (駞zjxxSr:D&zȊ \vf 6lؠp׿q,w~?22!t9\bT*/_^WWeFwX95T2B#>8lH#l=TRH%g{ ]%J{Ӊ*܏z7w@97Oۄe=F|B*M U5'Oo~#;::L&S__NBXr``+++7^,:+G}̙3n;;;[">ҥK`|||}}j˿/ܱcV\&Irrr_?AO4k,nlVB8eEFQ.'IH*( "B @=( *p8t3_~E'&&B8sƍpI,j pLŽqe˖uvvܜX,Ky!+66f:@ ؽ{7~G.8lx'9J%vbA4MRIMB,ӱH\K$Ap0 8`?͎D0ÄLF1vbbxdJ.Ls82LRIRJֆ~\.WP(JLhbq8dVaƍ/^fX4ib/ ?oZ啟Ŵ4Tjj*nVSSp8wZoFDōG3b<}zN굞W^;|ח-[K/=C,VN_z?66P(jkkWX!Hh6OIIfff.#0;w?N0QHPJ@-'RPJiԋc\#WS&n>}pg)B?`nB,eT]]niiȰ퉉<ﭷr:O>duuu[[A|>z\.?vXIIԵk>ߞ;wLm۶+M6q8Yb%&&" .K" r AH`t67Bk lEVT*033FPpP(ۻ~j)xF)//q_+W666ر$u]~W^ywBdZbn0x8 q R BDJ\  t h=)Pe -v,\*{FFAʀ-O2v9;bJJJ ETTI---&)&&aũaEFvp8\TTv5V__/7lp%j@ Yl211U|>RaW6 h9 uvfw8@JiIDa f3;11<0hȈ /+*H$$a-i6E˗IҪnjXCC÷+Wbհ&XwSNa+W&ifY.{< ]*u f4AMˑ_o\.ȭ&f>GY111eee?8˕H$IIIEB֜\vvp8bm>"cbbn +WD8;99vږٜuف;w677[u]h,--\^Q(b@%%bu^S ""4}3"y ?e p>@841_PxڵNr***t:ӧIK~?33sttTTt#ʒ}{_B޽{=Ϗŕd'N帚mذ cǎsa(~455MNNn\ @ 49y o!۳v+Lh`PApI RUpC*aՠV M?梞,BK䇚ܜwPiر>_N(`A섄PWPKgEEQ.45UXX8<pHx3XTX466vffjS544 pO@ܙN&Cu]&_z#@D((4ӃZ2фYNaqq]׹齢 z`{)J%Yv$8u8YBRX^@$@ ze0h?H6489笽z;Ea5S9^"usCȄHj;|{F@ɀ}Xa%CLٙ`(8==A7n>v겳^L&#Z ^rssk۵k˗ UJ s@X]dk"]0`8/=3\s0{FNGDP&3SB>gq33ŋ |믿 &''GGG###yd2B!e)pBTT˲\.?~8Ƙ>;q\ww>ZWWgZ9s\ hBr)D"##kkkB!BHR@ jGFFΒ"QMMMӳ;w,**|?O:;;7m4;;ܜP(.]vں6GHfY[Zg(|__yQZMQٳg t~IƚNqNS(n;''ڵk6l6DF1?Qw]~ ./bcxZBSHE`,pn`v.=K!d2--//ß|L&+++qFDDF%Rx0Wgj@FF` xJEQQQiiiŋ<냝.A<0 b;`8 p hL0J01 P &!`S y99B "тժjjyOӴJh*//>Zz5 r{,Msݑgtttm۷o6- BrrVU(D%@ӴOX%P7/D.l!sX( b H5eH/'<O{{>p8֬Y3::ZWWw̙^{0KJJl6!.UVVl9Ҥ+22r޽.Duww[,~UUUΝ[~=&눈㊋ fYIS0!Q8TRY9hGs~U Ch r1 >  XB>)ظe˖lT[֗_~(]lYGGIjR]\T Oxx8??bb" o۶B+ ?N5IwP"PJX1<=~\(d " W#18ޜ0w@I[(B@)R X_ 0111dEfF*^~H`HLL$*0J544f i/</o;D{+V@bb/ $(@, ,K$Z8pqyss_q⽳f9U?*^aT'A,d2Ud\o//3 7oR I %1>=]\\<22#444deel6[dIII<a@OO;CP(@ddД˗曅cccv⎎{RnZSSyY<ޅ܀JRI<,l"P]p;`F Z)#Pn^Ic|ر @t:;;;AgVTPإFbXC[%02>+Ή||rR~~m$>7oPo/fnfjEg j9ȁ8|>2O%'%ٳU*fSgΜ!J)۽i&ݾiӦݾ}aYvI%"L֖iL~(155H阘G$Z`X2L`? ܖ_~ET:22MJ:8N>hB!bbbo͛IIIO&"`dҲjժ22u.//q:CCC֭[EEE###T*VΝ;?bP* 4lÔ (4ćk31)=g\T|oK)*n$_N0%$BV{r=SG%7nxᇛb -[VSS#J꒓ ERuvvZ,7n`Y611>i VjFyׯp8bjݴiM6X~RLLC<}[{ɄYl8};;?hh`yy@QEQ:;3]] 9d|899I~1ȃ;԰;v|5l.\ؼy޽{H嚙ٹsOS/dH7@zjC<% 7aAPsc:*B'6/yLnX]1 $_B/BCCCaaܜ@ z>&&"|EEE… iii6lhoo(((;sLii)9ؕ\x1??D7lp5Fr;i>JR$LY+XAP$,Ϗv۶m$b@fχ(_d=xZZڭ[J%aٝ?r8oƫ}ȑ{j?&Vӟ7- t)--͛?7Z饅ҋԟ8>^SSSɮ1**wR.4!6nڝ],>#齽D*/pbb"z<~E n߾n֭AөTt۳k0c'f& *Ma@Ia3/( +@phg`$h}k\]^ༀ(@|@B hx1( Ӊ)CE!*FnsCG]]*GX^N?Dž ( \ d2NQ,--mjj&|ÑW^^^]]vj%̇*FFqNsIo2|p8CDP(D:/bww+ERI8<#r<66oݺs˖3Lt "P"6-`_0PPZDMG$Jwy7,( ZP]]-Ɉ/bpp077W$Ӯ]ZZZ###&''u:]^^^RR81x^ӹ7͛B*|>_|922axR$Hvٲeş| LLz9*ސXG714}ҫ@B./,"DhjjUVHRy^zƍuuud3$"##W\I5glXPv.\0??/ʕ+/^z].H$S7nhnnޱcBHVwttDFG(Lm&0Q 82?h|>L&|2< ^Df]tillxB^3o}[?Ofgg=/}رcIIIW\w:&)??E$LDO޵;+; q(Mac@1@Wx]..!@!HH]~9IP'<C=R~l߾ڵk Ah0|Z ޤ/ŕg/r7;;IDOz>22? Ŀ[^^>::7;;Kb$kkkS7>ծ5bM]ns8땯~g;}{8Ocի<橧mBhh(  PO`  B~?777'''Issq* riZT[,񼼼ׯ/3>>m6ȝx H$QQQ`ff@ @RҴZm0$Q-RPڍH#C:5mOQF#?u wwH@ˀ BnBL0f'|>ߗ1a6__3  Ν;WQQq֭W* BA`4MҞ??Rljj|'ǫSRR-[vĉRӹ|,#քxO:>I<EEta B >J.4""-8Ы0`>rPY+ O^]n]GGǦMh֭[29455z׮];33av:4M >I n@~~>w=#@\~ٲecHc`FF.JY&D@o?PT Dr500x|~AA!i( \n2Ba~~-((liiٹs烿ׯK$ݻwsέ]!Dk<ȏ~#T*˕JeTTEQ7n`&2"rhd0=9@ xBS#**'I!#~ʃYA(Q xG}СCBljj*//L&dr\GlٲT &''/\@{֬YZﬧzN!ZT-[vanMߝ[[{FxDUUwjsxb3yyai餅Bkt:+V:u8PzzD" QZZ*8//i4 b1S10ƿ/֭[G(}3337o8.==qxxh4Dg 6^?)(B>pbfHH4G?@ӈ?u1bA@s#*#Dr/x'Hoo~+\tKR]zBO?t__Ԕ|(2(qFEEV}G.DDi&ҩ^~ ww46l0R\ve?9<2[9#? P 뛟]$uk* ]e<38 R2 PwױzՃU1qBBT*%ԤCDo~4BB ++ c l6[iih?x˖-]]]111{mnn%ܢbr+ 󇆆-輼0_8U"kIҁ86KĤb34[蕶lb0JJJ0RtI0o߾[n狏VՍ111999/^ Ba\xxʘXx"(J Pp S2n0FYm{a?0zSq\'9}6BӞCe"DPUQۭP(֮]+ E"ƸS?k׮1;CR Hwmpp9NVO1W^E_nŋzڵkfX,fL fggL&LfZI$(*T"/x3W")<LJ Zq ].dBtOw;چ"""V+(\.bD$Jgff:N't<op0xrssHBOLLɓ'BK?+BI{ E2Cf?(`o cQ:y2 4(;a@ !=p*##ŋ7GFFBO>ƍ֭[wh$rcnnM.=SwI nZ3$Eas<!565j% rdD">55u``ccc E[[[eeeCC_fy>{7AX4M뷾꒒zkjS(|w7|s͚5V+"DATGF`D CՔH9(3? j@& {<z=IZjZχwygϞ=$W_d{{}'N={LNNVWWeff~}}}~鎎P(Dtqq񥋗l0)̣M+UBȋ8.X\PtO=ApB$%O[|0,HT h:ZQQA1XEί===6-??rrRP?3$&++㸆θ%] `[l9~xUUtGGBy 0Vxxz*Fнۺ`u`R"vOܐDD=ݢ, :XuR&}zh~u: -If̆Ae 477 6RJuᙙ^x͛uuuEEER$Ι|>r~u:]MM͚5kjP($.!8wnbrn8|Z"h4@ yOH6@_1" #h " <>|:>><5%Y5J^ooo8nHy׋1^XXhoo'l[TYYIv'[l!%]e2YEEE(";w|>@ꫯoذA*L&"NH#[zu<~p a{玢f@`C+l kKR1PsN\#{X)[]l@,uœdH.) !/BaO޽z}hqEQ裏?B_җȬ%1Jrutt X`y䑸h~ڵk#""Ξ=RHƶJ"5kZussJڴiSssSff6f vCJ@|) ^ (=aC)--+8R"TI8#QhqnT$ٳ֭[UUU I duuu8`/// rrrZv:6p8;wn~~>&&{ʕ+%%%7nܸvz(abbbZZZ݉eYJsO"  w58<:RSS`OOIٹs[L&Ӗ-[ J$ԈbV\\<66@F'ںzzzv599r˖-vfl)))կl6[EEÇ=Ottk׼^o~~~__!ީa3QȄ() ūۜ`}j⼀BRQ `?`*  vCӀ@!~c[[[@rrkA\.jD""U!" x?bX /<ٳeٞDBabXզ>|Q% y<qo6 x5krJ2LɪPW4Q B X 8{V*/^SEYY,,8bmq199yvvvhhhaaajj*33tn(J,,,tW^yenn˗/oll\jJL&OHHp: d+V0DVTT411󧦦,Z& X<==zViOq0`?8}Gb=AF>rB, M0p>pb>L +b+XV'X(0 A77o477$''/,,;wB!s￿vښrDuttIK{511}ullLR K.ϯ_l6 }teSRR:;;5 MjlhhH,x%FϖSXCQTՏ_*,]2/ A-d `늲bDFF"d2YQQQJJʡCb}offf(u:?яuaG8dI$'|H0(?!^9|k_C4mxRZwR-۶md111N3))tj4>hvZ}iB,-ˉAv/qܕ+W 77$w;::j*_SSjVk\\ʕ+LP͛7p.ME4? 0 A#' @&H 8Y }N@@~ZE}ޤ` x X;VŔ(%c]p8)""B,;Κׯڵ֭[W^|###qqqzrrr{{޽{ ٘,Ly^z5ݭu":Ý;wv^ 0x#i10ƈ y }gTVC|~phavn(#V O%Ǔ+X.766z^>OhiX,Hй}}}"HvQsrry䑓'OZd2l~[$UVVNOO,;44vk׮J$[n\#GZwJa2 `!LQ稣`ٓ q b`Me!D?972# #|$;&˗/ڭ[u+BRwʦrrrgggɉiJ~!!k׮;TŢD&A@|V "L/`>10-<2qV%}NDYBB9qVQ<`h=zG?х F͛].l&gNR>GGGyvvv``Gmkk#F*g?{';;;\㏟8qhfsvvvAAAuu5qg0Ν;f͚ٹĢ" )zfgjii&DuV/ cL2z=MׯJP񔔔TUU={ EQ_W.^833~zzW_RWbÆ ܴ`ODS:fa4p0]n?nr[-OS6c&JX`Zq xdfs0jETUUH \>00 H֯_Occc"^#<I30 \PYj$fQ,UlF) "5 H*oE"13p?@p Otbi4a.dP@K rr==DRpdZnxv Czz^K.˲]]]O=TLLLTTL&)--mmm9q ЈyNK/TSS~zD z-[HK.!WTT XbC:n{ a=Z\\LQQQ]LsrrJKK;;; I{pӦM6mjjLVXqe"-=cv-i_FnsA(ɆR=0s \9}xY)HBV' O$JI tab#DMM~d2mݺ>csݼyh4&$$ uuum۶ȑ#ZvժU.ep8l44hjjھ}{WWמ={:;;IU(ڲeK{{qݻ^o\\ϯBz~tttxx8;+K``|-n՟<K9qa=Ü8v45Oq+B4@OOϝ;MFgZ3;;jvN[UUl۶Y&޽}YA=qtFO^^ޝVx Sb0B@PȈ\̏knkJ`%ԁr]\"8xZ0 c;LtMK41|>bbb͚5ǝ:uJ-[֭[DRZZF"U(?KI>_|[n7YSSZ[[U*[oiӦ})aD"L?uڵh~Y}>n71 77ߗ*;ުԩ{HPUݎaP)  vr dܲe vvb~ngffJҮXBd6dV԰}wxxXш3gXּ;wfff7oMSmm;Hŋss1OxD2g<WUljd6m ܼy3##cjj駟>}4X֕+Wvwwnܸ:#V냗gp:ŋđ(***N< UZZ===o߾+WN,\z2??]Ĝ(8(^Ĕ 1~) pLBaKNA¡B=.o`ŘV#~ pn1B jê>,=wEQj:11KRVKb'&&d2\f ?SvT ˗/xjZG}$|&==}dd$55gҀJMM4 ǃ=vs~?,i$#$+m+ڵ OEQ.R?,ڼ~X RQQ8`-z{E;vF9RIqBlXbllVunn~?1>}Z&477b>?::ZRRrwƍ;f\=EQdGO?4r\DHf #W47ΆأBq~pCi}1JVL!B$P v<-@R)A"!{?яӉ07ܱc5L$1!!wǎNjii!؁RyoU__/ PÔJ԰;w\0~z3gMӻvjhh(j޽7겲X=k!d%Ea v0JҐXF,D|XW ==c(! i6QEiaZ,Oz$\|yqq1..kW0Wzꩧ^ߟn4^}%IÒ^~嚚UTT$H^y.s͆H χ,ۻqFW\޾,,p(噠|@og'Nj#4:Ҁ%ziJ544$RSS-KooZ9tPAA@ p8ccc$Igfٹo߾5kۿ[FF˗srr Eww_|ڵk%d8^bÇ)x<>q cZ i@4 );z) Dkֆy?q.b@D!ŋ;P(󍍍IIIgΜٲeKKK‡~XVVf|n:669b|/<,_eYQGrbPΜ93==mr9mӧOBqqqcccʕNc#)<w8eɤj_r_jŸ\d*y^n.bH*B!$rcFp8ȉ_*2 òl0$MNe[[[Z-gffRYK@Qhh4Vudda鬬,NܺavvJRR333%bw6ls¬TT O֡?uS@%Bԇ"?ĠTQ1hFXQ]}YVWW? "**ds\.Fߟ:77g0LTTTtt̊+$v`0Fnݚ|ǍFcuuujj*BHѤ^~}ff_&vaq\\@ wK) F/#Ә 3Wz^ B w =r.o04,wBZ ـ9^(ŋ'N/~a4f3'۷A{U`ZZIHH8ry&b4xf]׮]vKKKIv=C$ naz=KAA dx(@0 +tnFկ}M,EFF~ZcE"W^Mƥvbڵ[[[srrhI$vٲe`0 _l6 `XkkkWZrH !zkWȗ ς 18 FnG{oXhX`Z L$d!ց3hGi4X,bcc׬Ys1b_lٖ-[BgϞݺuk[[իCv{OOOwweH[rI$ٶmP(|{zz/_q>2l122RPP`6@Y,z""z(׮K,\^~vp'2 ,, %\|Ek4e\TTs=Q\\|IbOKK+--r ۸q {Dsss}}}eeeK5Va|b"Q^bEsstKK ˲iiicccb8++ܹsyyyB(P9::WՏc[&С xEbLX 2=3!H@^ԠD1!!+_yرccN3XL@CX1 *>mt;(1klh`PWVVvb;^rÇ K+33[G*_wꫯ=zt?o;w 9/~cLRsWUTdv /ۏ0@||<9N#]ZT*|~bb\.'V]e5B 2$fYxɖ$*;v(((hnniz"FGG?׮]# A׷j*NGjk֬!ܔ֖;v CЈH:0-  sa$CXa!9 T7V!J)ļXDV Z ?P###:8M&ޟ8qB$FEll FV)))$8::/P(BIN4L㈈;3?LF`a Ðiz<DB6,px<;8p5y`:2#T* (fY>˂N'f`{쥗/??PSC)8bf(j5LyP(H c<444551OH?裹D^SS16%%%C KJJJNN޹sgcc֭[nwOOϕ+WZP(=VD,xBZ(!]@@Q<"EAh7$x׎9۫T* HFGGI bNrssnխ[fs{{jXYYQeeeለy& j.--mii w?` )#=hJĿ|lm_^>@"AWC)4z xD,) b JX3x@TnذAJ$h8-//'Gb1N C}Ұ{/ݻ7P(ܿ/M;tЪU"""8o}룏>8z7JKKFc=vnnvzݔBKOGwT/ƽGiwJ.Ϟ3LhhVh£tt4gp>-TjT*%"mD"f3Iw&9cv-h\|O<177g0l6[tt4x1|?SKaf9##ȑ#wSÞy晶6dzrJPx¥FDL,0(BnlBx X wnooG=CNyy\.?sO?}QNM؂sssj:::/0 }>N#doB^~?nGGG{^\.FGG[[[WXA34:BfX0z:%3!iz``lN].sܽabmj%>I⧧Jej%%evAr9ZŁѰSSb. gg℄"joogYnggg^~]զ|>ŹyѸf͚6m&W\y75GCCCh4tҞ{9a I4fowY 7,F*9/v A&Cz?8h@hFTjv<Ɔ[W^%Q<-776{SSSqq1BH  =cFQד)n7LIIIKzUwa>h||< 'l߾2lذF"TVVOk}>!Bv96ґ"c%Eᦦ&*X|y(ɑdK/tՁu֊DP(TPP@B;;;1iipdggOMM dk-..6DF?B'$ 5 CN!vu `r%y"@|YV8Jg\[[o߾$I`T*}h޼y@ ظq#˲`I%)o>}dqټys}}J">h޽---{9BRREQRi˼ESRZa^4b0C4К%87e{ks8P{($oG1DbwvvܪX׫Vrlp#3 ,IIIW&CPS˺uT*3>nZFcrrrvvvxQh3bDH,(@"@{)t8, QZ9px(dRSSz-r˵877GtVV@DDlyyT*%r}_(9СC7n!7 l7o˿K[[[cccMM|owww?l?裙O4~?<4D |hD KI vt@d@==v4b!Of'&&կYdӧOOMMjJuq((( O/,,~ӎ B5VB̟6B?vQ"LHE# Qf?B+W|ܹs^{ѣG-˵kȃ~I"G㚚nJ$PnSt:y<!T*__ b|>_cccjjjBB0DzJ t}' p~!G;o@Q[brzX,ccc# B>ǻzQzdAD%k׮ oڴ c\RRr…@ p KJJzzz_NQTOOOvv:sLGGs8 Hрß`CBPLkMku_o Ӗ:%^$|xOD883e111)))t^tiÆ Vuqq===䳨9uԩS,˯3g/ES~@ (--!??aaaaaG!԰22Z\\$癙"hR*QQqnq6L8Fttllh@.KdzH~Zӟ>S<:l6~IIxdQÔ^-,`eeI[__yYp8@@,a8""i@`bb"''??6l044419ʐ2{g EQ$Dvݺuwc"~q\8vxXҠyn$HS7'8pॗ^裏jbb"++q#zj0/,q\ss;򊊊z#Gjkk7lؐsaD0LiiiCC駵p'ݞ388XTThKl.D8 ,aBC$VW,- g'O:%`:G ?ߏDڔTͽ׮])++khh D]iӦ7|(N^XXx0~866D*>JrϞ=6lccc/{nHyf|r"ޙhom<pw}Ⓤ.9؝C|@t~W2PrrNJJZ\\W\INN&7(!RlllUUXXXzplILs׿.H;Il8~zNNNBBh:zhll,Q'$$Ԫ%nO3 D33o +P/啜kݏƲϾO܇X%_'38 A8OA)kg%" ժU*ڪB߻<#cqQpPBYEL~'L ~+_)zzz:!!c,F#I =ui[4-o޼ ˗/Z!j3K+wSm&z꩞"(***iE"QFFFTTC=$Ho :HN3zC==LRՆM&yXh`~G3EaiP(*48x<3k`l6`:}}*" |>p汱1Zm4҈}vvO y=z_z饛7oAJuaRcǎ:zԩؚjkkYizbbbjjKT"ݼq3--_Wh!9omm-,,$}MOO+XDk _y;vPT+V8&r?ɔoL&?? -[ ^xP(0ƍ93LZN^䊫[DJG ˀ~!w*0M,_NĠqSQPMA:ZE-L&R fŊIIIJ;v ֭Ը8efڵk_lٲE|7OAkIңG>S{޳>[[[YWW7{w~򓟼YYYr{yx'hi9Oq݆H\:w5LַXTTtD" ]T?? ~FMMM>lcccttP(x<q^қ|-788z-:::vqy/\_~hhhbbmݺ5?~4-B0[0ύFQY&К/U(cccF1lܸw;wzަGyfNLTTTZZZSSROH*# T$ . Jȑt 11IRzBP(t",:1*QVim3@KPi2y4EQ A Q@g%x3SB.=zO~ .dZXX0E4=;;K( OD=^Rkkk vooH+ oݺWUUNMM!anߗ-[vҥIL&JL&6l/|rPh2-[688(;;;׮]^8q`HIIrJVVYn݇~bŊ,vPRH,Y׿g$ͻgy6+֗ @ -0M#NdJ61(H֖p8<66VUUU__b JNOO ׯ_'_dbX6m_r||{ wxx_?˲_/_lZi|SSS ===pxrr(H0̲eˮ_Vv; ؝N!1ݕg:8CQN-b VGGAAI`P"dffO>l6őPZXL! $ czz*iM&Soo>jX֬Y0??p[Z;P(Xl(vB0ƍ]]]EEEiߡ9K/jXddr8DLzGcbbV #{~^ާ(C}}ŊsssYYY˗/R͛eeeGUTsssKzFs֭o%%%ׯW(>}teeeqq3gQՋ ݻ\²,# F<Ќ` s6TH!}O?=;چD$"HEm8; Ly0\>]v566nܸiݭB˗N.mmm555?ŋ#""Hh4Nг>+J322}x<^EEEEE?O>$I!#Rؿ?0~/6!N:m@ 7ꡇ~#  V`@O~.b/&{|1<<~zw1&ɤq?*..&aDuBRmm2 Bk`aa!668."@̨(TrKO b,0Z@p~ J{ >e"8` P`/-80ɈV-G÷ƞ~i (3 c4KKKCЉ'd254cLبhfff&&&222I_鹩)""5^fB #۷OOOwvvR +$1 ==;>@JH`᭷dY`|1u]+"pfff@T].&)>=:L0bFH$ļO85H͖H +Vp:JRՊD"#P(@Ix7 R￟S^^022Vn'lٲepppbb"??4yϞ=s|}{x:ZZ`t ܹa}׋DF?<<3ϴj4O4qqqd૮fffp0lhh mm7445͛iii}}}쟟_QQqLVQQaZsrr("{7D}}}7nt8Kzv;is_uNNE+W(JRz^htmmmqqq/_#ǁ\+6Roi< ?477֧~?)I Bn*..v8333|>8~Ν;K+**V+TUUtP(zofrrrhh^VR*0ZRRrʕ bŊ͛Byd'^riS{D(Ee@R)H& FpAj>Ҩ Gя~tEѸy晙;??qxqq!G"G}IJl]]P("&\f͛{ݷo߭[j5///uV yG6lpҥᨨ(>OXI"ڍF]O<s;um 2tw]|>^O^1NOO:tPiidI&''gggU*Ւ2E^vBHII\|9 d0'JKKz}ddNuk^4 {1 p?1B=,PpS৓3458f@{\'x? 7oܳgOkk+߽{VX~M&Ӎ7rrr:;; )/0NO && -Y%IBpӦMwc~:zz( #B!ZFcc'fqg]]Hv&5gggљz94b`(ze2Ie0iiiC&V3EQ###6m:uTdd$EQP衇~044rʺZrZ əC?|~UVTaafRLLL$qPѱ$.PH/Yn~GNEnJ J~yҴW~/3pnaxƢ9.MF=P--M>d2m۶~ʕ*ѣF瞻y&aIvuu{nggO>iZ \.ظq//+Wddd477oݺP[[[4EQ.ҥK=Q766twwK>ƍ;v3 nK S^nv>a@Vؘ7Ɂ@k||!IJΝ;&&&lvۣ缾~nnnʕ׮]͵X,OHќ:u_~~WWWbbbmmj Bj{-[;wgF2\8 J;=HKh<x2ch ⧡(F!TqǣT*׮]+ bBhiil/»xpuuu0hhhn[P\z5..Z,/, 5=zSSS?mrr׿5W:pnoܸo~o{zzΜ9`>C 3~hhX1ơx8Xt8 ⥦x))$[DB!<(F1V*Dh~?DQQQD0j%ѓ7oޜ *_ĀTNo}"HxDĜs/x)la\h@ P A: kĀ 4i3566L&KMM}}}6`0`0 xqbbp222rssnTϜۿUH2L'3Ϝ;w乚̖8w\mmmWWnGGE nT£qtBBIK ޺df  B0x_i.B% LA# Y,Lz:6$_ҧIJ" Y@ x4=66ae9#1N`06\.'x\NQMIIX,~p"~"i d=ӓ;YHF.[& J@T_fuf/ׯ_!?׬YSQQ@zq</11d2{O[p|ORz@ pdɱaÆVJ>hT0ψQs?\IѨw秠liY jjdd󥤤\UUUFFe2ݻj5kD"O<166t:juYYY8 K0 SQQ -[ObLiƍWRRq\fff('4@bl.2m@ `0Ɏ>`؛!+"inn's;-ޢBPYYT*ݿ\\狍]RrB:ߵ9{Ֆ&Klcc HH$Irf&$CH!S 7ٲlIVQ~,8;cBfݏd>k}+_ɓ'm60v/_L üEEED{lZ5Mzzi|)@(~V]計Gq8nπ~F/m/J_I^ aXg1i(0tˍ!0uco^/?77"ZKSb^z2[oBBqn7-p~ 5Y rn7RaŞPhfvlxxxڵ xx0J!0\.ZzfZ 5LbSSSRRRQQӧsrrq㑑4M$''x<˵iE4RPQɋ܈JvgM(k_>ϟOJJ 1 4M]$x 5g{SS |vejpOO֭[;VϜ9bŊ17::J2m6N{iX,!Zk׆aZ]VVrG:.;;h]7 V\Iiu4 `Z l{ge~/ߣ`@Lɑn5O( IF4Nz7n={^x@PQQA .DEE7xL Cd2{4T*Y ΞE"WLZZ srrw]WWWXX |T Xj l߾nvn.tDNOsv;SPEFb\tTL_bp'cnY_$x ?>w4۷sNgxdD7YJ$,(JRu(-%}eƈiVKE~J$ KUHnOT D ‹.08!%;q񌎎۷_>%%_zWWb\\\8NHHرc B=??o~ٳӫ^R \.8(Z###IX,6 De0x<ݻϝ; |d`q,NDRRٰbQ ֫ȱc͚5r>y衇ZZZFV">?loo8ˏדZzz:YIw"˿vwwlB"'{HJJ^RRITcyyybxpp TΌb 2!\|ާ*JFmX톬3K3Ӌ qf^~ƍ|>`j4_nZ8055566Ft(HLLlnn.//xɳ˒]reڵ===NR0h4#&ϟ ׯ_Ǯ^0,))|rUUGQ`@ /Y SOF[IK4Vtuv „Cojsxxx @;::rss=O(bY6%%exxxpppYD#G䔗/~QVVp8233׿uDDDWW׎;\.(//~z]],@kLjP*L y |cwȾLe30OQ(<:`Ap3)H47* \qyyy׮]CuttX"))3pJJh [nӟXMKK;tM{*++&Ο]vP~eɳm۶AŲuVǚLAa!؉ 4ߏ%Y4,<>;{Nmz{!R*9RE)jbf&;;?RHkAAAkkMjXllP($\ccc$Wf%''/w{>l0q\vv#GFGGM&SbbbBB@ OMM%?K.u |61RY\c:|rpF1R)C̍{`MgϞ mmmJ=\0?@f+WMMM<9 O=Բj@ vڵkגd"|v28q@|pz a8h |P w Du.s{o~I6 A3MGLZ^[֫W慅k׮[gxy<^zzzDDD[[֭[M&޵k׫a?siiiRz衚V7;;3-[4صkX,޽{͛[[[wK-e>@0f'ߦK 2@.H,ټA#DddW(C(mذ!338://[*jvAW^7y̙ȳg>SDĺyZ._L$Q`ff$m߾=**jppPTnڴđ_7/?w1Prt#2 =Å9J @I-ʀB&1?xrE=SUhrrRӑm#<"^zb)X,M@'nȰ1v뭮jqqqϟ{\b2뫪FGGVؘl~_asY)(3280ŅFF11p{O /YH!/Xyʄi~+U__~~{BJs.]t\.'͋/fJJJ{{M~UUUI$^z)??_VOOOY; FDD$%%9s&>>cLZdZIѣGsssׯ_/Dg<C  D6{Go( |[`8ey?~߹&2&Go p bP8NB`΂sP :JB{v0_kkX,OJJú˾kZZ &6|1 ! ㄚ%IvvP(,..xޥPg $N?SHYVӑY`.H%:7k233_yqmmH$"sݎ1H$d|>Bh)))&rPZ9N322'8|&}rbڻw+W9KR=zhD""M111CI IH*l` VXXhSBD^u @++ƪ&1(044PRNBGGG(HU|~ 6M*2 311hbqLL̕+W'<'e{&MPh||HRiyyy0zdl0`AAѣG7mD2YH$<@0G|~hxRLJ  /&ھ]m۝f,˾ÅNSxK,tx|6B]]EMsrFML~$&&ZQPH4O޵kȄJo~BDBaQj*<<37h9{Z&ܹ333 wLP6v=;;f|׏766l6?#|755}k_+,,ܴiP(|wy睕+W;w.77oJeTT0Fp8e&Zjq_7~+˶` iB0.A(-X0gD2RIBݣMյbŊP('^'xHZZZRnZZ6--^Xu-~{x<#?>!!avv6''^C2^N#{mKVRDux\ZnSyLNN޾0K0@ PWW7=3S^^"##!VX755\r_ONN?~|qqҥK555u< LFD?XnnBeeሏh4id(P(D"(ju!B"!!(@4pn$vkX W ]>k?^ZO 9̏Eq$ TPWWp8jDp8Ν;o߾/n۶jUUU===|>?..ȑ#R4::Z~lv'$h\~ᆱ룢r˲rl6򞓫WJ$~://oժU|AUUULLH$*,,Dtbv4o+V1Pbb:&/'RBFzw:$%`ޏinnh B~}jj (2 'OT([lSSSIIIO&CkkkBBB+Fc}}=jog?~ᖖP(tFC2Μ9裏{ZVV:Dkd;g) `>-ja3r#,BA YS Dk;X3"v gss@pff`0P]SSsaXhzzz7ozyHlUUU}і-[H$݇ٞɿ$&&~Y/>8;r+1Aa!gb)B32  *)zNfC|>z96E12P `p~CX0==t:Ѓ>ɜ8!!B! lYsCCa ٳ&3Tj4kkk].i ;΍7x<nC@iP<"9}Tf='yQsɅZ,9-p:z/^{ollʕ+999===khh_;;;;;;WZ% ZmOO}z{{)Zz{z{Wvvv^^!u )}s#j=??OJ>?<:KK 3EE}^6?m'vh^h)sft b\8<Q] otddx|M!Z XX b!>ׂ#G,t:srr)B lڴinn.''ONNVUUɴ\.7.kYwX<###^wŊCCCJP.]T]]MӴ\.#j&bv pX* AN h xJ`,uh D;f.݌ b+Gﺛ @a )@2Rq.+6> cǎXbƍiWI;;;ZmUU!qN*++9+//tĐoHR1D"QZZMh@ غu+ Ba_7Ϝ9C/u񙙙ԉVqTJ)6<>NJ 8> `Rc;Ju;~˿0ZgAIyMMe>Q GGGWbOO@D"8y`0 YYY8HIIill\.smn["͛7p2G'ƒew+v^X%f).U :W]cȽT/@c%o{ |O{%B #i=y3qqqgϞ}jZzB5"(]MFDDyZSSsܹ>?я6lؐ_di4ئ&piii---6<<\QQqUV[N&@0Vxr>(H#'h (dQ>_s@ݾCs`LuJ‚TIQ}\A)k RJoܜ=\cL2znkk3 11qqqk;Zk׊Z[[gffd2Yuu5a9)V{s,J+I TD; h>`4o ecZGF~{srKmh)y ҥK&i͚5/2˲?q8zԩSDNVcǎ'$$;vP*A\\͛BכۏjX~=ͅmmm>__򓟼9P(E =`4@r J@ [DHw?pa"" kj@@r޽x/{侾ݻw766L^Z[[mfXl6[ggX,^X(FGG$`0P(bbbN'n^OQ)IS"^ZHs@|!6ց7d*NE인F-a^0?txĎ{vzf:F,ќ[D111ofiiimm/..6GQ(@ 22nܸq``7o{޻w/qrltkh##SShQ(XrR H cl322JJJD"Qtt4D" #@EErHEںq+V^Z$Q544$xwyG"OTnrJbm˖-:nhx(0kQ<7 C: Řh|RxB CG x,`/@'6 ,}*(_twwDڙ7KD" ˗sssO:Eȩ3VPP`ZZZnq/ #HT*Ȗ-[- B(;;I\GjjjssvV7dJ% sYC] /}m8oy_L%AFƉh|4RH@@\dnE!RRRfffj5˲*>I3iگ]VRܹvlo/^LMM%Z&t)?III/H$vZllldd7oLh~c866F!+o}v“LA "M{Ņ\2x<%==pD~"z.K.766FEEIѼyw)w ,imiiؽ{CN677w}EGG7j]]ݾ}N:uڵą@0D"/Jf-B /S |Af^4P7,=`ѣT&m߾x<^ۯ]644TQQr,H$"@I$裏&ׯ_vB{!/:::{no~3իWݻw755I?ܳgO2;0S3E!ujƪprq(T`q(H8oY gg' "Ӌ^|~vԩ-[LMMl)b+'Y⁁ޔK.ݽeY|ԩS W^}ܶ6!EaD .LZzj1 GQ$JXڞ@X{Áqelo=/`FNmmoOk_xAe`xKcl 0O}Rlhh(55I\]]]|||ZZ!ƞ={v׮]*R8bYO T*եKёzO8eqkk={z{{+**^~@ `RSSfs0imlK^F)7RΎ7nnl#7w~yuw ,S$S,K Qb!Mc~ ` ĂtTo- <ꪪ*N'H._\[[Vփ1&򨨨dk֬q\ˍ=S5??OF@b8 ]|YUO,%&& ydgg.Ybb"ӂ />|8"3l811~Eg}[Sjk_C% ( 4(㩴=="aXzH$|tlj5zѨP(%.TKWqܖ-[UT zhmۆ1޴iA^vG D^<*3u(Ɍe#Z-5BP?x ln"xZm6}Ϝ9ry0|7o޼bŊSN4M6{w8ȇ=,"ƎNLLx̨(""BhHDt֭s86M.8B\u߸oU|cp(r`dĠX=d5Hq}4 hkm!M6Z~뭷{˗/ \rrMOO B?44DN+Wt:oO׊Gya'|!tA''uXG}4bBZl6+j E"?@x "p,8կ[Z*k_+0f$f!m K.uDsk 6 IXVɺjkjjE -re k4f=ϟ' LLLdff644DEEF@@Ȭ|T*-..#22r~~^bm$K7F 7 4CHY\讉 nx# 9ٹٛPf0Ѐ}@!41 kr?B{"vz@WWWQQ!&''744*J Fb{'_.|[ߺpBLL wۺu+ܹ$""bddprmߵ+@{VQ:cEG)R)V5qH$UGNO k TDӴab\MMt\$'l6T 2Q(%%%$ CTZk׮sM~_fYTZ,\J:~QQQ jzaa<("2=Arxh@'^fRX+7a? qi[NBsB[{{e&묬zWU8җIh$a$G.gff/XŲ~ʲ3gά_ihh(&&pKTTTCC9=S?N>/f<~IVm ,\&9:G` 5rz`ފsQ(.HALжmkjj("CPN'.\@TZCCCQQQ~j掎|ԁ7|S;&aw}w˖----$Rz------$0##PGFFpzz:dyXm_ʑ  1~4 $06>vjuuuP($Swwdz_uǣv;I(_^SSS^b~۳j&y,|>?**d<۷b! [f͚{'?I̜hiIK PO/!{84OMA(J -Ƭa 7`w7hx<2~`<>5UVV644sΘDFQLKRRuuʕ+Ĵ#H%__KKKKJJx⹹9(z`|||oo/XhZev{ttܜH$xNEqv暚˗/kp8l2o:Ӌ>~Ҳi&T*ŋ@ h4oooRRdpʕ+M&kkkC4琱'j)ߍc?a Z>!y:Ĵ I@q,@tVNVrrr0ׯ_/++x<*ڵk:jYN<୭NJR=zt~~؁hə!`jD" _~IHJn7):C8`F:"X 8.Z|7!58興૯Ƽ4{2Y{g'-,,8NBv:VI$h zw7l099p8|Xq"v*.. .=ׯ_?fJkYY!Dֲ +`,@b=08x2mxjߔayi*I7`QB 3N g>2R4dllb=@ S###Jcl*++/\O8z eYvĉݻwPJE (LFQT(pC!0  D$d΄<} |6> o$6 SQb$HU666>|'?+b47oc<22BQTZZZrrrkk .]`Z>?Àn5p^@p.hUwmz ,Z $ă xZüHX[[Br](ZOT;wLKK#KqVVիWIӦMiqBB|ֶ粲2R&l]h~衇FFFjjjHFcbb"˲qqqxFf%%aXR l4M#|aw%ƪ_p',pr{yJ&áPxxǻY:Fj+ i8%%%+WfBA4 r\$fVXss FFFFFFȝ<~Ԟ={+WLMM7-~x.`Eh@x = f hy$ơl JKBF̤(㘧GI$To;v׿k֬!@FNg2B{W\\r\.Ȉ7PhvvoA=KRr SBskkV]~=AvĝL&# ?V;66&Wsv;PryuR:sgS*fY8߬R?d=|Kx|V:1x!d`!%Dݺ='%C)ndz"PzX32x^֯oovwwJ_\\$gPYYL&/,,\\\X,jn\ԩSdF˺Dn*Dryvv6( D 7- E<?+J NLAB$DQ8NDzcﭬq&h4j\8::NLL,+J].WAA^Yw,fU8rtXvھ};|')p7NrziP(\"RFMn.wU?UsF# [aKq;@Drm۶=p#qׯ_8^* lnn^bn{ﯩ!P(zjP(ɾկ9sh4g *GGGS۫T*8z@`||fc 0 RBs>8~{6MSix J`mO  qlBxppvk4JH$\.Wh|~m˅r:]]]/^%'FC>Ұ'Ojqba7yيޙFqll,22rppPz}kk+qr*%'c 8R <9D~?|0sXY꫘lkjX8644NrSSSR87nxIA>CHKK֠"##VkOO0%%%$n2Ffff[[[JJ xll,33O,GEE EDDLLC(DK@X37.G'|!EڛW,Ʒs>g&.!IMjP>0P駮ؿY~+W^zjdddll,99l6ϯ]ҥK499եR7oа!gJCCX&FU2 R9_PÁ@UY|e2َ;4MEEJ:~xyyD+WOR+iiiw_]]d*++;uT||<(LlH.^( y<޲R, ],VsԃUVpVfgHxtF| 4qh9AO]΅y毵aOdĢg@ģd $GW$"@p5utbhikk+)) 6zlx<WVVr***Igm{&`0Hn\SN%%%"FGG?v~?[ݠeeQIOhsA.*p'm4\G<^ Ix<M#8Vj4"PrJI ńF, !g6r‚h$2^LW^)((쬨윟vEQfynnR###GFFr9٭1.k{ y'"?rzEnb*L{?Ɓa!%FGPZSAAA]]]NNEQ4M_x1''MNNZ֑ Tv;vngff !IBX"B$J&HMkks=OO/lMMj%h,ˆawIR...1::JF]FGGo}vuu566J$P(e˖6LpСRe]V\\ޮFFFxK8O @@H$0\QRNV);J"cJʪ}-xKMo/pn(~MfIC2laaaxxl6,jժp8<88e˖>!WQQ144ܼ,,bwԩS'r>H"Tg>3ﲳW^&??d2Ȇ Z tfmQ@kOx F8".hp3h:0O 9̏D׶}BQe|~SSbŊXLrr0&)555999jÜin `JLoB4t?BI hֆC ( ✀V280-~Ç}h8zDLjoc`RtnbjEFFz<؊ȾBNPVV&Y%E`y 6)|9FiXxpNmaY[8DZJ}=t11>fψ},k2rF#iJ 뛝%eOl d;;;K ;x`9rdqqqǎǎ gΜX,[ly嗓GFF?sNqLLBz?x/PӣnC xX=*En)D3 SLxDR4st3ϼ /^JMMZ (ʘ4xqrr!rƢǣ jr)IƢsWsIIŋ׭[f3Q2@GGag8p`rr2>>9!!ĉJR"l6HLLq{8NNNxҥ@ j*J/}%==h4|BT,V46:ZfadR%& `~IKWԺQk+,iRg[zc A  '+5;k^\;wBhŊ&+JT*+**4P(kmm"_FSZZxH~|Ҿ>C:[n%b?== ry?Rۚui (1 %ZiJbZȉE8@Ǡfљ3gw]&_\\x…͛7+6lرcZx"IHJJ"VOe{EEE^j =Bl6[,aVP(4zaǓP`sh IۍMV:z6?2lqH( 66"F sxD@N^/ϓXŢ`0u}W"$.,,$"g0]v"|k_ UV<he`P |T7E ȍ3R^uymm@:4scZ*1 +7x :w]a\e˖RNt~+JKKIuOOOFFƦMz{{GGGE"f۽{cVyiѣ~a!C_]*֒IZNOO/++ $uϞ=OBEūXn]wwzjEEE^^\./..ZjQrdggt@ @4p̕V) /[ .{hlg @@$&#DOp#=I?h4bccggg\B?`cuuu333]]],q'L=$2gMMM'$lA#Jv;Y+Beby (٧Ef@ˁ$fOCoM^ &)&&تÇD~z^FarUVVdѣGkkk_~[M _җbqVV??? {zzz/aFSWWR<L&inn&An{Ν6MJ^d ty@H re~y|g'&h`g'HÐ9g(B1V!Faa!  MMMoVUUGFFձ,P(ccc|tBb rJOO:͑VIjbT*GF4Ma)i$0sR!J1aJQRfn<n7L'.t|!> !1xNb8s*Xݷo_KKK~~~ p:6l ˏ? DdddBBs碢RSSIʙ3g_Wfs|oBuuYXXP(seSPP044-KRRq ~nO~gyF.Kp8}sYYY/^H$cccW\!-eɎ,  9#È88´!2 (8tDkkì Ch=22gh4H k$P&kFqʕ]]]sssiii\.a%%%A [v-MOOW"##cbb,KzVD[[Lz:I 1Fr9ۑXEQ B&#󓖆CCI^J b00Gbp\6[(/-- jSSS FFF2 355E6oBP(SRR{5СC%%%Rt:hBB^) V'Xӹw^F#@R+q-G&n@Q|G1Ə?˗O8C) O>IIIVg}mvDАXPPښ!K* a^?䎘8ϒ9zI%ozz7lIݑ~?**jڵ.Kӽ[>bbb˖-Zr`ddJ n{Yw_GZ7Mnn뿖]rn H>+_ѣGU*UDDVOn?n%΍) B 19)aOA,d$f?G1-Z‹%i`JnnFb9LNN&$${KqqZ&fbU{{ի 5gp;jT*ESbbb||OK ,gRZ-͠Op{Fs:U#TO00'e2غk14JnwDDDTTܜV|>a2BH$_I +))I l,VUUK&133S[[q c ƉIFCEsJ*JGY7rO&E? !HC@01F]7{i``  =#7#G|'<]v%''_v ` 8wt}{---K+$Ǡ .Z* l`0(JIHzzNCMMM իWMMM=veٳfy٤`0h6x a_WWW_|[\\ B( )fdj VΉU*3,%sό@ bE,Ð1z‚RdvsG~ !ȉS*Ǖ.˺1>sLddٳg~iJ%Jl2::ܼez귾~Vu$~MTz 68v2ak*K0 8Dol<ď&O,"Z2Σt QLk._qߜEAfV#ZBIBӟ\.׾}^uPXVVH$Gn׮]Jyy9T BJ5<<\TT۫V?7afGn۶M <֭jDcccy< "##Yw1р;;d2G2g#)XXU*Tv^21W  0pKs(q||ժUCCC2L&l6hz"0|>'aV~E=\sT]]=222::J7azɓ'fݻa˗/WR0ܰaÕ+W8۴0AjKFA'ZF 0apQ ``Q p/eee>}8]t)--- MMMΎ`u1\nZ'&&r9៻ BpXt|tEpq!_?7\9$D}!&&hburssz-DuV.--p¦Mr_`ƍ9 Jt@@EE L,++ۼy$ o~PH,^aM,4PXt"7h)!n `6%%}^?r0w ``.͖;pcal6V=q\.njjR(]]]UUURRRrFGG .߿劉y'9bHvaa!۷ŋ"HsjRJh4_ޱci\kQSr#8(rtow! ے JGu=` FAH-!q|?0%1Z،fĸQ*UUUD"*;::f?^{vGGGney<ޫ3LNN tgFGG|ſ[ߕ ghh% 9EQVU$D"BDH&$,2EEn~jjhlh (;H*EMGQԭ԰,:NHTRRvsrrpvTM6a.*JmCPˑףT'^pYI-ؘ)0.`!XC6>իUUU͹~aZZ޽{?|_oo֭CQQQUUUd욚zرl"lmjjB_{饗ӫ;)I}?>^V[cǎTYLw^8px{nrl&X|K_"5kh.)$ a&qa;F@aJq/m~ }m3d_h祶ݜ! ̤"~ aAw["" f~`8===rjW^}P(ښ~ڵ ӟ޽{z-Sӟjll@DP166?99z~7eeeFf}!FGFrN'H89 JagfT9=rݩaYR(By&:Fs[ H(DF$+fs\Mpxvv=+++I+_Pz{{|~IIdJMM%&QLQ&l&~/IxfȐAj#)tN~3?Kqܖ͊AF}.[n6-#?Sc)!@!#MO@"EZ;ѨLgyϞ=ёfوGaN7999::JHPQ133s7yqqqrrիO=T{{͛)"yJs˗1$j cLvkCccc&iﲀF2dnn666fٶmܼrk׮]tIVo߾}ppphh(99_gYV&EQ~rr}7<<5͇ř'Ooo߾ׯ_.((hkk[jt8Zvʕ:9ɒ4,@vv^swX@_PD(da,R hkkZX,gggP($礂'NTWWݷ(|>߯~/~!)vڏ>vZ`0VWW={VVGGG'Yܰ(7)1h0x߲==>}r *fRoh%8yDoR$VVP511AUPhwޭR^{{w4]imذܹsB3zF#A[N DDDL/}KoBhݺu c>/: vvC##l@0H >ra%K$xqNqqq%%% <\p8L###"(##8VTQQA̩XPP@XuuuIII###===yyy "1l߾=::Z7(JR>uT Lx;zn+`!E)i;y z@~ ,(RnLxDl G iiq$kbbʕ+---_WFFF I@0|駧7nܸoDFF{'N .]599I|==>>n2\.W}}}tttGGɵz@__C=Db Y%J >:J phɛܦf̣/^\z5 D,;ټ8555??!(% }9>>>11!n :FpիZaۣJeGG?<;;s+Vs`0ȣiXHe%n\=nW2br|d2.t:h*ȑ#U^^~UT]]mZ^-**zgξݻwͭY?1 | !.\ ˗/ FhQI6O87 c:b p%E-#n~,1(8i<(0) (097żn{}իM&˲dpP(T*O'ւAZMZߟڵkqqq,655qx(Rb]rh4:r= 8q"''gbbeYbxQ($FG CSSpWWT*(zp8,J{zzӻH'j```Ŋ)7ysI),,z~ʕ*l6T*L_/̛BJˆghP42! zۆ׮ZH0/%^l n5GTPB0pj?G3Jׁ" iسgO[[ի|>˲/ƍbqCCC("{C|||8.,,9ɕW^]V!w}TכL&|etti׮]@@T...\DH$ BRtlll~0~ƜUqNP,Hu @Ngb:;;YZϟϯ,Z[[nwYY￿~zb ((( '  #mo}ĉ&I`o~q\Rȑ# LNN;vdjj2jݲe盚aK-l/vUiXcw^{׿1}ǏSNYm۶{ äSX<99188w= 61(YWEnTd A'Y$<!55A2 ~?vqC( AJ@4b2FPܸJB@;봹wu1v{. >]]]|ĉuviiiINN^fͫO.&̎tW\IBy#u2n} %#"Ӆ;`c<*PR$S_|~k䬣h\.Wwww~~@ PTdJ$4̙3{p:yyyw=S#y UR_"a qb B!oٲ%|9,ВBVxy=(|7-1R` 6NN~_&'|wޡi(GFFl6[www to ?~xb 0 dZ|򪪪ӧOኊ Hd2$O?}yñvZrrr"""4Mlll]]=C|>ttt5xD `?mi=a&%Ef0?xT!,˒Y^aa!Q ]~]T655:.ihx+**ZZZ&''?M7^'8Sr0aV^M܉7`y@$Xḑ1BqC ϥ,.]ZR$ Q8Z,cc)<#P*=ngY633SuuuaݞWQQqرUVuww'$$ Mz@ e{G$VB ۻw_&''w Y5 /'y'HF/D4 @4bv<(s}2 Lخ&?~_&''wttDDDx@8v8<*w B$rɓdI)))>O( ⊼KiXUUM`OOOIIntEEEFqn$jWVVJ$JEgffB^_be\|@hZ`- 0̀֌)-`11y 3(097(2՝_)$XOOill|rH$ ̒{Q՛6m2 &)??38{z~2 s'N<ҥKJ{mF9*ҥKz^.y)`f`S) .<)DDMi4DJơPn=333<M܈ Ad"PQ  ~̻Jܹs{ihhHJJr\~bq1\~], M6ׯ_͚5'N6)n0>P!/8Ƹի6l@L&j0L]]嚜loo/** CCC6mlltMaah&''⪫[[[kkkO8AQbٰaCww7BHP\x111ʕ+yYf%--M J+a-`BiVj f!-ޭ0l:䆆R<FYXXji2Hǫia099hbcc{zz~{g?{7x_|1//󵴴ő|jjʕ+|>Dׯ dgg;}sO!T:S@0 \@4a}hξg QI~ M E#`!8tHIB:M$p(D5J;77't:LJJ z^rD@Ԋ9 @쨨(:??G}رctjkk[ZZT*\MM$$&66HcJb>6(FiiH$B"/!G9!^B77 F3R@PÈD"REBFGGjӧB 'N,-JdJ'O99 dH[xTR8BiQ1/n7Vb!Qb>=iDHX" 6,g2#G\.Vx?UWW$[wIJJ(*))IPl}\zkYۮ~,v]p*n  {8c=FN3>>1 qƴ7xC"<DvG\@^W|u?~|pd2-7ٳQQQĎxp8߯Rʕ+n#)sssܽ{n?}TNfaZH<"!Y_r9}:Pa? -^ȓ(+yJ R){2 s;vT*RFEE)D2;;KQM]^Duҥggg'Nb[ZZjkkCd*--kii v=##cnn.%%%!!! t(R:[0wRmq<` 6c?HW5?qxt Or9~W&I$zֶB?0++khhhzzzxxwjjJ$>}IF)|0 LQT(2$r_R)v:w裏|33NYH(~?($~zmX]^/XRioi..F#/55<:KLBXn˲@$O N\XX VU*b!2Dk6 6qOO"xee+Wr]رcMMM|xxxXR {w.]8sܵkfggmv᜜`0(Iu4)חv"c) ?fWY V]@*F:%RJU͇я~/ONNnڴiaa88nqqjl6aFFFΜ96??E=ϲ<pX>q]>N { ޫ(R(zeGد+qKے,ɒm5J)Qb D%{f0{h&‘dGYZZ#w=콟{:sn>+Wȋ{>ptwwZmOOV³L&W17 w_}}=ik4ڵk;v@G"UVT*r^.XD"vhGB! D"56bDxw-e:fvXNJ Tf B [vT*dR^oLLLFFF$q$o&6pzы=Lo|111RV$>>ȑ#bĔ .&%% '|9@# ca,OrS^6 ͞Y+!^,hQfv<Me#@v}`r \onn^rM_|C̱555ƒF2%bŊK.8p>uCv7\r1JGԷy<[B&&&:t5^_QQqɂd2ٕ+WKKKoG=rرl 7l r9߿n"O55500hL. pX h9w.nӋ0ƞ[`A%NP #qjiioٲ`I~򓟤޸qc]__oݺmݺu7nX|O#40|>_-_<|111sssݵΝ7 jϞ=###999/Fx&EEXE'DY,dee#כ%dB2vPa}hP(sK.xO0DYWWwu=<|xɒ%@,WUU{e˖ ae p9a|M)[jեKȜ_ccGFFijjZbd"cB`ddD&')ăBN_s]]܌ JflBj #XV%Kh4Nj׬YCܫ^y啒oۏmpTi`IYQLT#G9x+˲{=|<rJ<%.]_>Ǫ?Ɨۀܾ*>?VHE!m|( (4'TT###pGuz-TC c}>1ݾ}dUUܜJ|> b4 ׮]{:44hBammk233[[[^ovvd}}ҥK >v{0b T @ dv >f; Fw0-MLV<=h.gaKLY=T*sݹ7m^;h|ݹsgVV˝i駟/** B-yNN7 B~+WE(z~mfр@Kpph( >pSPhɓ'N緿m"2 iii'NX~}OOzLNN'Nؽ{ŋIfdd$??|L>oӦM*BtW\IsҥSNM6eddeee4RCq(8X ^jeF Q, 8R ~I)0apLNMiHf.iX233m61EaƍEEEr̼{^"EIt:򕯴ՅGK.Lgyfzz: uttl߾ Baᑡh*ێ 쐆J-"-~<6݉sb8iplx [&^r:#j$'#?sbbKw} <"41&p8<11zHbÆ ĝO%|Z$!Y7뮟~|u;y)B`ΝHX!EjHE qTgg???+z~ݺuv}jjTz";αjLz/ivwvv:NNG4Dm߾d2dXaٳgx<3@,ЁH'%%"ɮ.ۭT*].Wmm`__$Bc,+**"cY׃ ~T*U(.nڵkjjJ,(u8i:sSR~zZG?x㍼UVsrrrFFƩSr-]ʕ+~jjjgΜ,1S>ʚ{b 6q@,IEd Wl߾V*?~\P߿sffĉExVӓ}>b{!-_# g}+--{ΝfsLLfᘚR*`ڵ~Op $N"İN'GtcVl6ssrq J$l:]yy={srrl6BLM$%% fC넴SRR`vvv8^ p8o###f9''GV_xc*++?R 9q8u]|q4W<$K,F*1uYpEQz+u\|$Zmo>z* ɲeN8r=ӧj5儫 .]P(>y\0L:ڵk_W%Mӳ.--%***^o 0LJ$GaY6 aAS?˼h T2PD#@Q Kg6jTb,nd,vww lDuС~Pooۇ˗/%99Ojݺu9 ADVTdff"p |yM0 ?+i-fAR] b60?ڵk~Bx׳'&&%Z]]]__[od˗/秤B!?22rɟP:x y!]\.7˰%`=8"V94n *jժUZ07oLZRSSFX,H$VUR~avU_hx9]z򭪪 H|ҥK/~rtBKE.׭mfv‹͑SUY-MN͛eC]]ܜ[łd2lB!H52RYQ100077711 YH$fY$aCPA 򞞞|"l{nQcv$b84{EEE s % @4pTA ("@1tȎf`ɭ;GF9rd||\V w}W\a'liiq\skFI$BFںX˗l68 :θI¶lllYbECCC||tvv61TYvvӧ +O+H ^zE bPr7Q`KU0sG84% ^?xO>VKM5k ~mDgB6lś6mַEjE[nQao|7c0|M6m޼?O>-jT*moo˛JHHHLLO&dz~ttl6G"p8j qrrdCCCw/ #ݙ7<~pUUEQdfԩSVu͚5@{Æ **99rttUWW_r%>18q3蓑s"̋Gg]4~7=Ͻ_R TWWmݺ/ |>||<''`0pܚwyhoo߿M'<7Hqɓ[tvVK쪢 KKK!=..sJ'%1z= DTbE VEfg/)bMKơnnn X3&7++ǰR B LDIcb꜑D8hCCCRT^ȗ.]JKKx< VkcccfffiiKN| B$]~}ٲe:D ;.Eɂ @jf'dH+A x=5[B?B<`f!Bl܅MnbHŋm_Ѻ_xxjFPKK˺uaƍdtg]l1_&&&3XBϷe˖ֲ,lٲ .,B\%@0*!T(`l(<`d7EB0r AgBVʫ/$oXFGG0B#vtOOdD tvvAeE^~eCرɓ^ڵk EEE/^,((p& cgffD"` U<O L&IJD6o<==x^r-4?&<_xߖH$"H$}7q9o 4Z\yf._";;; utTL B!>RَpXQ8CNwq)1% w9X%XV\ pk<(P">Y/[ѣHt?~`0 %KD˗@oo`"%݅ЩSrss8pܹl".{7b5knܸ/ ?vttx(Tt:#H\\\ZZZ4ma'BPO&Hrx2BH@ ޳;\?J| by Ü!rKΝ;裏|Lf4ɰl?x\.D"֭+(( +Wzyՠ yߟ)VkVOC?O7|>$B$D{g^O---{흜ϿxbwwwGG4L))).K,E30dRrB! BRގ1z۶mdND1^RZxիU5_ J@IJ˗w(}. @ 6|bb3gBUUU(D"h qqqkRѐHNN&j*_p!))_ݾ}իCPkk H)! Ϸy澾βqgƊicĜ?s JB.9  J:zhBBƍ@bbFr.]"/ax6 Pl6nR\bzqqq}L&WVVVTT544B!D jkkLÞ= %ð.0K7!KbU,[#7p60LHMrh5 f3+0(ձ7n]ww4ǓdZV.,yɒ%F-V{uBiZZMauuuQQQ===D}qF0 ay{7ndYrʴ;EJ2\`HBݚ +PH]u3^0Wc6b RgKʋ׮^q![ZZrssWZuQSTTtH gffbbbDi||{キw^^,E wjj.<.(@@0:3@.A!qff:;;~Xzxffh,..&JUUUnG-[deeUVVxݻw+[N g}naOҥK Gx<333]]rUT]I ~++Erg9 5  P>y??~߯V_}UFJIIz*mڴitttttTREEEa oQ&-joݺ? R`04\ {VrJ `0x;.p4511A1bw}2[n-,,|M2&&& iXee%BY>ȲؘR$.yP833399IJeLL̡C/]IJlVVVww؁ T2g犙!_һ \} t,n`@ZP+6(27^V"QN\.WT2LV$ٓqH$2L$dffNLLp8ٜAu ?&HΜ9CaqqqG%il'PH7NMM{wa %dCQ(L 0*{Rڝm@XRVmB0nP2(. ÀEXZ;ο=zCKTrܜׯG"l"kmm탃W^-))rdh52 @sn{Yx^d =~d?D6,VXQXX{7y+V,~ڵkeeeqEt i:++Kӑ,bBAtbbb0LKK:.>>r*HR x< e*@   mNj|n 0>>>3 m߾rvww{~_&\իWtֻd[ntsOwwR!+W^bE8̌&:xRSSJe\|,|Ѧq ӡE VvuG ~@DZ$U I$099R.L$NxF޸q#  $%%l8$ !;;w$%VSX) '몪*. cmxJPiH;Byo=PUo@9esD f<7u\s\VkllW^ye޽^~/ϋb␡Fs,|JJJooΝ; J#@`qu.I03'bB n7l JINN^j1z!n###ׯV:+M&ӪUhx&9*,1h"1ehhnONN>#GA9sFTB!D|F#9 / ϟ?0L^^ޛop700PSS333s+5Lє777oذc~׏Y-["$nvDT*(lZ ݮ Tt40:3nbvOLL8ry||FiZ \|gdȼo =Z԰ҳg2 C/_===֭x=[7oUq"(zkhRF,;&tA,pFa/n7PIB!# /B]ՍK,!>hٲe|>ppp򴴴e˖~V%/_ ߰~!BRNQ 21RApIZǖ-[Z[[.]V__Rn:222<Mnرcbl6o߾^Ziyyyj6/Th[Hx 2#*y64k=Q蹹+WPCtWW޽{?#t:I>a2RSSO<)Hիl6#Ǜs{Eoo}\bZ 5,::B.EQ6m'z~)\1RGFy2 Pv(`^! ` z8.>ꫯ᧞z?TKrܤ"b _^^ؘFFFV^^^0B^022lSH$))iddfB "L)3z!^:B`~?O"1#\nKKˮ]vMQXEEEQr쪾<88t:԰p8Ljb7a-`0"Wx/ۉvlk׮ 19˲z~׮]}iDEEMMM۷offʕ+Dp|~jjjSSS^^EQ,_aJ"]`P8v#L}N'=ؔN׆ 9󁝃kJ||;::FFF***,ɓ'+**\.0sdd$!!attz}$ _$ /y xx 0NKϸzL&[dP(E"p8o>^?88HjׯZ`p͋z'iPx0 ]HN10CCVU&_> ܙ|ɓnatt[V\^3LN366Hq\P{挌iKVk$jyOV 䔔Ą$ 1 `\@Sϳ(S:CiW5<5 cbb=JZOPFGGH$ |>-&&&99YV'a~N۞x}{p$&&u}Dh~~h4F"̘͛7?~|޽Hdnj ,|yNR0ssdX`fv#.7LΖP($JSRRfcfdd|O0,,, +WܴiSVV7-㤨|;=l#-]ĉZYnn3( P(4LǏwG-))za[ϟf#GB uLT?+ՑC4O2W`Fł$V+ @ G?rDGH M_ҁpv["ܶD1BD/H-%#4BjZ)p8̲l$i&5h4Y͛"2nU*c.;dff?'iN3 ^T`9l~Թ菍%v\.H/&˾}d2fJ#))<o```֭D_rzBqҥo驩@ hoo'%K.=D*ɢ`\\\||tMMMYY\.W` t @ӓt̬ܺ{11 p=| 0䦦R狏(iBp8YYYr<...##He2FaYV$alټXGIMM%=frƍ["zzznjZR-++ZYӀpY42n=ilh>ub 5<<;..cM&9y\.7̓hfիU*;SVV 9'| 5L$b@/jʕ+zzz\.cYlll,--x/Rvvva4mmь˅s 4R:Sh4v`,_XKPGE|>EQfiUYY֖?<<|V]]}̙B0tRlC:N$ֺ\3yZ:aۿ---ief\wޏ?\RBǎ#RF"=|MM o)*.@2ae'yH@-THy]ZQL(p`_Cs*vbT!pAŶXAڹ+:j> ì_>''ԩS?22t:_R$8p:::/_wlhh⾘9s8 4!]co)ܕAg۳gOff14xNٳyyy?AUUMb׻ᄏzjB7i4^:p"N c2>}bHRajkkϝ;WTT #ÇBaMMdi֭[&33y^(#_N-aYY\Sn0aE.& @/t`x10h vff+_ʙ3g>r8 }}}~?66vdd$''W^?S`H$wyn7<'Np: D~?iZo$&&"ȳS__r.]ח$Rc p% *ۈԧnw=ƀqMQ#!T^^T* $[oUQQlٲӧOr82Aڪh竫1_NǪ0OQJI KHH8~8-]4%%۶m mmm b~~6 IJ0SS$Qffg9 $fd}FmV,Ki(p xݬDI$v#fYW__?88~1>>Rhnmm}ꩧN8-JFc8!w}wߍ&tX޽{;c0:::|ܽK|oHp:z BNl0a DIomGB,gy#!ӛ KKQ)rxTrܖkK.tRAAb~GeeeDfhX`U|||ggevH$*(( ~!P(fffB!|?iԤ +;1__򗿜#H$B,}XJ(W"X,:;;I E(rO=nߴiS0,**"-+' E&:&&&J Ӵ @&0B%NHdir]=k|5["$yW`pttr4j*#ݝc4{{/fNSTQQQĽ4''D"B%nH$zi~'N͛Ic񤤤dggt{:NͦVU*U$!vYYY`իW'$$2lE4}Ÿ1nt<ܺo jybb,ˎ* Rp&԰~OOOONNZ>rz?==h322FXA^/D(ـA D&'v{#){q3c0 sɌ: a RJUWW7<<\YYy &ϗ1333!--=99.ŐKJJڹs0uuuqqq ^wΝ7nرcB!DT+W,--%HxZm(KWd" Tr#yU 2XBJ|%u $SezDjHGwܳ-)!eddڵk\./www޽g?Y$ٿȈ_z#GvrZZZ|ӧO^:%%_|W-BrmL~ۻfs(#E dtnn}~B\.oo{Ŋvz饗޳g"~\.oiiYdq\III^+))rUTT:̂ YȤ9΢1?(e@`4 ."@뉉BիJAJ'gzor7nDEEY,rxHHggg=BIl"8]̱9袁ے`@(~% @Qyp_x|DAU)KϿ %%%V… %%%dMMMGaz{{8""I1,N7r/_LI2Dfyxx8''gvvc\PP@6`0v)JLLY _wwmjjڿݻ]RJKK\b4Zm|||GGs=GySSSNc,G0hW  #bFF.+G B0pH\2  Y[UFQPQ%644ܹSRL'w:R.oܸFCw];;;we4WXX$?H,J[`ȑ#Evr"`N,b#(֭E䐦i՚ĄfKKKCI$|Nr|>0WzH3w9$kPee%EQR4 kڲ>\B&411qhh(77Wv:< bavudrɬ^Dt6)&29\2L V).|T:::zijiiiv655⋳`vvnGEE>}Z,~?ҥKsrr^x⡡p:::RRR۷o`rrrOOώ;>r.At>Y lvA sی #@Tr+Jx''nGKXaLpPH꬀x?vPaPB- 7n899dB1883ϴlڴ?aii)ID =ѣGo 577?sǎ#c]-G{2Ff&77W Bk[B_zttƍ|ٳgwA'N{X_{g/ pCCCyyyoo!Vdt8@ !!iӹnݺs1 sڵhq{{B(,,xZZj/xsm, ˗Ot,|Ex IqA¿e 3Ф`9͵fټ|dYB.KLLLիWJR711yԩJ077q# -[2 >^t:\U CkkJNN6 MV<0.gcJ,MgH@.ĈD׫T*D&m~~^$dbJeZsss=򕯌fo}[611Dfff~'6li: fggc^/7J#3ǑNZ0 ZS_|&7-v!x,HԔh䖖)hup8JKK-[V__o0zbbbLL%V|>ZTq{nnvwvvnٲeҥd<`ff!t񥥥۷o'~52򆆆Ē% w _n3ΔZ%:dnf!,[s2U w<{C GCO0j ,DHjc4WDfyUVW^ٴiX,&c"(==ʕ+ B,c7nx5{)2ETQş??֭s8333DFDj]vȑ#7o&Qp\.W$ BA`YvʕŃ͛7+{lqqq]]]t8|rGH&77aټmv74& G^p^W &;iց7]c ao۶Tbbb~uwwoذ}tt4!!ʕ+|ANNիW.]DdQmp8k׮nlB4 lhhp:'d թ/^\v-1Flr"fL˾HEd޻v<۷o饗%FggƍN>h0Ο?[QQ#v}Bb:%İX,sssPc\TTrcbb`nWVV+)))ԩSWVV{=L611Q[[+f;;SmeN^z:kE}2|<3IKLNBJg tˢ$vH1tiii###eff&77rD)RD_^^^եh6mӟH$10NS.*{zjyy4i\|yll;|pOOO?# F(###$r@p o$qZbbH> 1 #B>;vGA uJ*N\bFxxSݻw~際333_C{(z޽{_y啃Ν;?ӟtӦM .b;v\vjƍ!2GP!333~GFqvvavMv=77wvv厎fffiºA~H$F*$IPlظ(.DZ `3/~ϵyMwJcJJĿ+~Usq"`b:;;F#1r\.@pX,a˨&\b8??nsj.]j4,YvRiTTϏD"֭ ĩbcc9\؀:c?8XPᑑQۣjW^M,1B죏> c=xN~~~ɓ'l6Fq\`֬Y0Lgg'#066ѣnUm޼911jgRRX, ng%TFff(̐3S p|$v@ϳG0T*33)IIrت|>'B,&&&&%%%$$h4VSSֶXʔLھ}T*|111 <===O=B~뒚"a&&Im|.x "hMi0\EUqŘf9K=[vka%B4&<+PNjGG^}壣\?>>_b֭`P׫Tμ/D"T066&ɮ^Z\\|ʕ]wv*_~z:6XVE&z{{F@zzaQQxAAAZZ˗kjjnVww7^/{'11C=Db;111ׯٌ͛7G<@<@ `N\lw{\"B ʱu("^X`nꩧd2HjjIOOj|ܹPHXRW[[j/_,RSSҥKo}[?'&&>C9r$99ܹsQQQgll,55.WXEj}>ڽ+/!ܽX*P T$677vww7H$\2Afۈ{Sssԗ0izr\&y<ҏ7 䚄aǣ/\ JY%gzcļ]V;ijTr % *JTJR9BMJJ"P($)>/X4 #4pM=1s~AR~3_ &?BvbC JQr)h);{Ltt|X&z݄7n ѱnݺ#GkRSS N>Macccd䡿Y\j''' (\8 A(s/dΝ!   z 0,[$r7n ryFFQtGEEOOO𜟟/HVkYYp8>-"766 –m۶MMMrn8>}tmm-EQ}}}+Wt\"H"YnXbffflliԚɉl^.'/ roo%V%Þ]vhx<WUUcǎ@ 011QXXX9?OxD^xXBBvs܄2Ç1'|" yJ.'25ER4͘LtL ϭBQ"H,Dgfkj7mڤhN@ N' JP(,//t|;~'NTVV^rx:E"Dx6-..nhhHR⹹;v\rii@80s~bYm9"C[ w@kB yHHς'hPO-AI6:jMMM}}}/RyyyMMCPqq;zkײ|>_8jkkCeee}_1ɲ1@t\߼ww/"(AF"!x.\n:ǃdclBi'/޾uVNav!PDX#Ӊ.]RT^W(cҮ߸bYM!q `T۶ p8;`IX #4H,blb@ xȑo~]]]~_'B牯9xݺu?Ͽ?~aⱱ1(ne;$&W;v\r%)effWyZu\QQQ$ɒRo/_˺ -օsJ3FCp||{GQTUUBO&Rx<6-;;eYBh _%Zx7>#Px}}׾F^777Hg4--ח.]zɯ'Nz{Ocprr˅d2X[P}_4 Vp d ,Q o .[h4:n4CH$"mP(R):. eeeCIѸz xɒ%J![,e˖UUUE}K,ٲeoAR\\;vlٲe4 \!ȅ0".궽g ~o 2Z wL o_E;)K4cj>kQʺ]z;-[f4srr8NyyjSSS|>*;;;zKHH"A!+, gŋJr׮]D]1??OfC 1L`brQ){IHH(++JdsϺu$ԔN7I*j۶m>/))>盛>!.@p| @E(Nw:ׇ\5DP,C ,'P|12lYUUE2999&'x#Ȗ-[^xIONNǫT*T4L}}}7 "Ѡ}B@pHje21l?dD"PhϞ= ݻ$WZ>h/1%J  Ξ;t8>rԩxҥK7n$ cǎoͷzgy7H$H=:11Q\\_Bfgggffry]]]uuuBBBrrl۷oD"E-_\&x<.;00b L?>>StիTx$ I:)1uF;k3z=|x4E eI9Dp!*tJe0 X,D"W<77y^r[ܹsgrr|G%%%@ҥKFŋSSSIII>ԩSZ6!!APFJ522rщXgdz6aEw޸QTTnݺ,µfs[[[KKKLL ˲ >>~zzC LNN B &4 /}ر_|… jщ ˲`rW^mjj gΜjmmmiiqbܽ8%D "Il6јVV^}@ ;55uA՚711!Jɜ²eˈ+d233#HKK ˲>tYb1s\fy׮]`@/BMMMtt@ 陞[˅raJO|ީ3c4["z=P$qzG*++裏x< 999Rtɰ&1-//zz6mR(555nO ]pD'x矗JCCCyyy䜞;44D:⣣sss,Z)P@!)D!?y 4 WB=#@25Ja Gx w8yZ[[ꈦW^ٰa@ t B"P*))dDP(~_mٲeff$wn0 ì!Ï&RH4==]WWWPP?###RҥK;w$.!YU_$?׾&^{:9tPccc^^^SSX,zjNN N-''ٳ bڵ+66x<'=&Bf ,ewU3,- V6gjX?㏓CCCuuu*J={cccdIIIJJbm7nhkkݲee5ʕ+<{<OOO϶m}Ft H$j%ǿ1Oz\- {衇("1Ǜ_ti$9~8{,Yxzz}ݥK9ŅիWc- ?dzmϞ=RTW͛7k$پ}Z&"@(24D|#tffMclGDEQ EXd29Ylئׯk4yL644dXH$ϟz&t:Bl/R?p87󘘘ᇘr%KY.BnG4`YQ@۱. bP&<*BJ Dduy.(փ-nt:ݻ?cҒB~{|~eetUUի|!³fqT\"gy楗^l+W(*[VwU*U ~-[ry^r31;_{r\.7[TT_Z(PյD otuuttп?A pX6b 1S6G0#@UMHBooh"MMMy<Ǐ@mmBp: bppP./_fx<\SRRQvwwjg0.\HNN>|~~>p8۶m_r%E}+_q:;wvDuu51!leN-ȥ/ͺZ"6xn60GBBR~abgN~)"~}}}zϤI|<Ƙ:-..DFRn Iּ \:e)426yP> 2:J)A ;54-% 1 DS@hljjիWSSS' vfDHZY h4@ @\Z-ǻ)'[-.þ0ڋVQKʇ|$(3Dq^~9Xٿ+7nD"A.OOOwvv444DrF n $ ||p6oֶtҖK.͛7Y։ӧOwuu)pBvv6A7cfrr#VC^OKK Vp8K,inn~zffL&kiiIJJH$  <?+*F? F|5(3g?0~_Ѽ+QQQ>;;{ƍ+Wl߾??irrrjjbvuuIEy<7~n;''i"_}'Ν;GQTyykVWW755CTYYyJYIS) B?xKƝC@I bJ ?=t8>bMOO?qڵkG}d2k_F7 "ȑ#ccc_NK xCІ ^z%>cǎ=7nܘrK,ihhHOOh4׮][bX8V(###qHɉLNSgf;,vKqdtNHq8@v<]ZP(Z7q87hx( 0^z51}[<..W^MNN*))ZC,gff644,Yfܹ… K./~|!۽o߾EY2Q;n!Oڈ<$B v,}B"<FpYRy…}EEE%%%昘ݞ1::ׯKT"ezjffҥK_|`0o߾'O5*\./C ! '&&ח!|nX,OF{{{&''=ZYYxJJJ!CI$l>c@UUUUU,[l~~~ӦM.+ ݻwD\\Cc-[Ҵg ,BXD+>7>Fcfff(Dz1^?ylllYYϏGMLLr2e[ZZ֬Ys_&m޼v6l wE>d7(KJJ(9_b8b8 J!z26x´8u8x ?} t;l,[;9I~툵W^:H(Ñ醇M&MjXWWJ mmmUUU===f׮]4Mݻ{tIIIkkkRR₟d2:::oUTTg.XwޣGT̎C?ZGz-QQQ bttwAiAZ\"N}|[| "@ȃ-ZA/!eRQ:tѣv}+VTWWG<>}:::zzzZgff4MP0N˓kTn@" ȥ04z࡜̦&\d@000PUU1@o߾3gά]$_W{zz wQh6$ɹsꚚFGG5 fdd /F[TTD@@eggLaVV$T!7"`,ٳ!?ճϲ 1|! :8yfT:88rRRR֮]K~8&UcJxxjdeVn߾o:uy۶md7!Zrժ,Yc6sssj@ `Y7=qX/>0`@<@"8Ÿc; -wi`=;)D y*M&Svvv(:vX HIIIMMmkk[f s=>WҥKp$Yp!x<^GG˲p$l.//H$@`tt4h4V֦hV+KQ$$Ƒ^qqd|3:vnz2̻=TDӷv"33bb $b!@xVFSPPKx'%%3(͍UչrK4A,P1==]zRߵkoMʼ|>?&&,E zP(Pʡ|`?k`#axEcPN|v<Rںu[o# xbb"??tOz衖b/;vX,۽l22SVVWi- p1, @T\ 78ꫯ:t_v:"H K8NII!~999D b1a0E;D\9??_'<侾>Je6?+V|~5??? ̤LOO) 2;0@4\lK Bp%hJ[TPXbvXRjR(d˖-dmm333QQQBprJNN&11!"/vO&R{+W?ϿxbNNB,..nii),,kll\niY,uĉP( B#z1cN0 vJT'   H XՈ2DB6RbŊhbqFwdZRRˍ%N*fl~sTTs=Gx#SPYYW\2>>o֭ ڵk'gyf||rX|>37Gr> M4zxxI$Dv8iiÆBL!OMjtuu{wwwjjX,6:;; z\.wQ9''{5Lkגcvv߷oߍ7ۧhz{{8ccc"1 pp(IGx4(I x!9v<Jr'(@`£CT@CCOCWWܞ={^{_~999G-((8sVq86`pʕ >_c3x \x '>l~ݻ׬Y^\\|9Fj*B]]]H]. =YYY4Mݯ/K.i4_<qqq ƍ$ `˵|rp\ ÐL`/^p`69ƍ]<ޝaϟΪBPH`]څ:iE#@=ztnnZ8~ AV k׮h4Ό oX,YݝkXFu<755544E"p8aÆ^^):||||BBj%z1e4>`ddZ._xFXqI"='= QB7tW}@ɀP@+D;vz瞗_~tttl޼y``K~X$SRlG&YDEEEGGǪU vdB #f~W^ g?t\` !>\.},kw94m4E"F  SSSijBzͶk׮w}7//oQ|E:v}ҥNSTgDP(R}>Ve& 򪪪H$G|1,0b pd0xys`dJn\(a x\B(…%tʕ .7K_\' x:RFnFYf@ AN裏|R$^#$сRipޗ*<ox#G½{׿&'$N y<.K2ivR?)`G&&x4xO&իW7l//۷ookk!G|ݯR)P4P4o`!cԼ؜;ٛ@л Ϙb.ajF#.RS0 ZreeeKJȈ_voZbw={vŊ,8pd2uwwggg>|k`.4D"X)E]^xQPTEEENNΙ3g-[:::.^X[[KZ$ \.WPA߿qE<:t˲{EI$z l6V B~@]])BbFrDQ  .wQcw.n#_>hiI9  `ˍnz*ӞONN*ʞ˗k4{=[|>tNLL(r_.DR^^~/nE| H877WXXzM&VS(Č$11騨̌LeR4Ѣ;9.D1#@ +F׺K$RXĵڵk^Ґ۽{LZjQ._ڵke gff&(+Vx)7Z,dfR1_/[lllPbX\.wR &&&,YbZ9Nll,q%* @0>>XO_^;v쨨X|\.(h44įp8L62Vӓuܹ<R|{("偸yu_m(\j"@ȆgP4p #% _m|?~ sssq#~(` VGGG/\P]]rJnOIIkl$"Am|>|{}=OUUZ&E1 CpXTFEEYl٦ S-OW8@x?@LAM#~*mLBB$~Z#hnJ׿EEENS %$$ o޼x^RTTp꺻|>%sw^x^{駟~+**~pjjjss3ѯz'p8111ׯ_'`BS8dL h%``D:}gh'6dƍkkk|>!ͭ]vrr2&&fӦM󞔔D_⠞999]|yffŋ${'''oӳf͚>qq8."ѰV+! Dq rbb2Q BhX,'.ZM:_WB-N@RϞ=ۻrJU]g?]NEGw $PDn`Il8͌&Lǎ;`0`@~ԏ~,Cq<:%nnnt:Ązy'tD4pyW"ZA$nWFqݟ~I$ THJ1R(Ib(L @r>ZZZތ|PX]]gϞXzF Ν;'暛8j3,1@!@`sA|8444zޢ"ZMfϟ#""FGGkjj\{s΅B!I`!`+ v40e=HFflpkhhPTo{799il6Is8eYeSRR\.Wllݻ<O(3 Rz|ee^JMM...l.\ 7A\>::]c2\~}Mm @ r cy/PXbs?zwZo}Ӊ1PTfY(lhh8{lssݽ@3337m$ ***J壏>tFFF:tvvNsN׻qF"J7mxSR@"ᆇ?#{dffbADJ2 A0  A.@"2C@E:itO(hm,0A €9p!޽{+**xk׮EGGͽO?OS}={?'gggg?YDDDii6`wxq5u޽7'gUuund999oP(,--%7ZX||F0] Id`2WVBI B7֤6[o`d2xG֤oBEFF^|(>`m6GFFFFF^zrDORSO4MBE#9S7)%Jbl1k8fÁR Q`F0_TH9Dvh PrcuJ.펈(..afzzP~N ohhX~JjooX,[XXhjj]2FyQ>Ç~s||PjkkX(**%SVNP(?tnwC_^FR)`x(a,FF '&&HZ.`1 M",-- ^T^WWwbzM׬YSQQqբׯc333[ZZ[ZZz=n;HDYYY@t8p ""FbP\9BRR$ ĸwhf,58؃nZC($ TVG-_& X ZV(fgg\˲$SD"2G /t"f@}c'otML>|X.OMM9P(Dm'N`Y6 ^tiժUMWUUy<Lj\.˃~ԩSFD 6TUU-..%''777k4^ܜؘp!)9)=1#0hǏ qLWg 40JN@#{;Q4e4fyyѣ 477ܹsݺuRtzz:{ュNSѐYCZZڿ(:霝>zB0LV\zuCCLHH5EvsfRBF&3D &iii$"K$s΍>|iijuww4SOϋgfggf0 )b07j K'HqEEEd2qIIMGxxx|| ѬFzۧVr+++KJJ{69.^W^^/Y__ׯ_ڵ`0H ? ;vvL&b+**z˗^IIHTw J ;1"J'}@) >23 Μ9CQTAAATTsG^/q?P(I-++\/&s.˲622Bab%22r||<"""<I}&:&PHHEE׽ȑ#CCCj,..68XXA‚ Y?|0$ϟ?zhUUqOZ?\ZZH$.㸏>h~!XY^^v }~Y~_'԰H)((8rHuu ;;;#G::: PV'%%us޾DGA(d2ۍh^\nۛFcooojjn$|FV#ZZZPEGG|1 _mϞ=2lݺuPp:xB!aڵbcc 9+,,bX͆1(b^1 b!2(h,jGWv4<`U(a(ٍ-&~Pt dLQ^??S"""l6, JHH e!A^`pqqQׄJZiXaRc!ZaM/=՘NLF0W~}ERqZmZZZ㊊xllАj =33300vZD255F İ@TV5!!ahhH.P`xy l`pddf[mmm&'8~8o}>EQ<[,Һ "bt?3~f#1@-Ho߾ڔׯ 7dFBڒ 6 Ԁh(EF#5YsFnC @lpDAJ :Jaiy~zj[DQVVF"1Ϝ9 QڵkGFFvAl+JQoQo&J7w07>8]/{6, yZEaVivJj7XA.\.N#III '/ɕdW&$$8zLVXX822RTTDIIIYYYRiqLFQTOOBx>^WWwo}[===eee/WZuڵ$?11Q^^f4wU[[EY C 0`H"_\ZZڼys F D"ٸqt:sss--- "]?᷿mPxر|t?~kjjRRRģڑ> ??vv6 <P(SFƪo[@ ^74K<7ok{VW(^fdYV{թ)2"Ё@xU].ܪUFFF<+{90sE6 p3jڵ$1srrhNaΆ RP`Ns:^Z2A`"W@YN&P p >|顡pl^zu0裏(JIIIOO';G&2:nqqqΝVVH:13(x0 FH*5>>^a@ yE"v{tttVVFj: @ \ir0>|UV͹\W_}U"lڴL&&&Ms{###^Ejjjd f@K!.?v>-L<0{֠372&VQ1>~U0 1N~I"`qc2 ТxvXTMoٲLi{"t򤤤k׮ ^O@555;w|0=xfA˭!b0!!]l2{mjjڰaCKKKuuF9p@l__L&{ZRRRSS1.kE׹^._r[VvvvAAo!322?/d2 iSSq@ᅅ쮮 2F4 V2VE^US b<Nu\4MX,v\qϞ=#lܸQ%%% d,8?g=sL{{{EE9sv_~ڵ޶mfd)633f͚ڼ<`a"IT`'1 |89huцc %ރ1w ե h qkתTlBoذbqkk֭[f3Ir8)))Fn }Wk3:p~iyEYi}Q(4O$n; NLL0 cXLLLXVGM+:1&q+aaa`ϢP(,,,h4FqϞ=MMM[XX6;`9 P)lua8DB9^yEVc#dE> LJAblxVr[G"0t}۶m8C*o۶ի---= ͛7 B^Kuuu˷v8A pDjaΌbK#III HqMMML3gLOOOMMT*2+5LR6l NGyf2$ŨӧOD"A%%%P(IJ,EQyyy v0q>Z-Ws `Or/Goy`}ww+7x+@n%@zx8qOWss"a EQ:.66VVgdd4===MtdddXXT'^w_dddYYY[[DGGLΆ"50E%&&={ԩS`"Ȥ@1PZ(/^6Hp\aas?$Z ` A$}7|Sјf;==H` 6m"޶'N:uŋs˗/wuu9s|1aގ1 ;{,EQ{X,z~.kzzZ^v<|>޸q‚j-++Chw8 1v!DEJ*P0VxRidd$jB !`zWJ ygFGGzL&;wl ;qL&ZU1;;\B #;`歈Q* X@08m|:0Q\c)7BfGU'B8FE<*MaS&@@]>`jjnoo/9wRT$ ©)կ'?ٸqL(t6v:7wypWSSze2Ly~Ϟ=F]x1>>r盞ޱcٳg EQ;wpªիhft@ ?q@IB80I?X}?[ 3 @4`?D~\imKS0LxxxAAIUIKK:}tWWR B"aaaA(^~=66vpppݺu%,^矗RT"'?y.]y掎v9]PPqŋ B(''G Kiii`phh(==F0iDSr9t 4  hZT4ub 5lyy9`5,99Pâ^y溺1NG_+:"0=裡P!i6ɮ, ?aAoBeyn`yf(?bcX4ʉFwV~ӇoXN)%~,-O(++/򚚚}fgg ?00 ɑccc<3 Cv${_:(x * ,\lN4XOWZ7nd8|0$\LF 844T*Yye)RTuuuׯohh0jzǎqqq333CCCRT.l6^!G<ҒZ $d>? ~! ߒMAۏƨ;}@[s\~~fffpp0--mii+_ʛo w+8q ) ^]]zj|gSZZZVVveKKKb\.gn;np8ZmWWT*%XӹjժƆ7 k@N`6 (%0Q(d,H]q!cUF Ic8+8dc$D)wΝnBA/*>}p VXL$:==}vv"k'gh2Rdd$Bbnp9kf$Z&.#::6E1 6/(ĂXj1(Nb[ ?<a<2cQ z*ɆgPJ207ln > ^/yU+;v(,,<>EZeX^^x<===ʻRhO~ꩧ^~\b/((}_.--8L*++SRRxCA80xD΁Q h=Bi)]m}UH7!H?m?yT olhM,FcNkϞ=/P(,++쬨 ~/..npptIRYZZ/"##K U7mD$@cxo㣢 333 GGGv &&&bccSSS^R<磢6s^hH"J~q&PB<χ EJNJLLLJJ"~7% EEE@LLLDDR$nEb tcc@ a,bIL&Ӂȼ`0dffAH& ?D2cpShPc;yd^^͛xիW_$ڥcǎMMM%%%cNJ^zɢxgy0pD )LHtJ703h?zь:RvZWTTyiXsN2ٳgϹsnx~\v(Ϸgvs=w9o8n֭.]ojjr\E;wt&%%Q%Hhh4tIQPi DhE()fOnH"*++w /B/}KKKKn[h0o~)s---<ʕ+GmjjJNNu\Ν۽{7׏2 v7mڄ"R"^Yn]||vX}}}[[Zްǎ UV EyFGGDnB"E 4X$ n{^-?'?QZZhKOO$0CCCyyy$tFKs#l`0nYX۶m#_ټy3ܔ_hMʆ]wl{} JɐN fl ҬxV" E̎/ܾ}??`7o[o-,,;w.::tttNxBB~~z?ŏ-[TW^ye͚5JrzzzÆ }}}c\~=k׮}wIv~e֭Ǐ_fMyycy7F tJ *Zp [x8^cKK[ZZVZu/tr1 """^j&&&v%ϝ;' Wizbbm6@ 'ICCC999nk4bh4:vd2f@xxmC4ܘA1OC"4MQTwwf˄7R^^..^;;;ɔl63 iӦD~B0!!A,?UfZNCUnvs.KznK3Zu HFl,b"Qh q9~EJ{9km!!OE:!%dn7&M҂1ų? ܺu+ r}}}_WLѴ=ztdd$::& UCPSSQhb1M KKKfbb4 a;v\~*/,H><[RSJ%` l14àeJ\RRё{IGvvvQQQeeebbի֮]+x߽{KHHx<%%% R0 B|Tx8xP̐3(i.w{<]zDEE---)^K# rrr].W^^os={g?OZa*b =\NNNii)B( *ÇG$+&**a_"(''a۶mZYYZYz^QH0v1R* V^RKx4ʰE<kkD"ѵkv=::KO=Tss_z饏>(>>~vvv׮])))SSSׯ_j$̙3+eeeMNN/?66jFcTTMR3==]VV6::j7nxue*kTY( 9R V'D,R9AB&3@mKx͚JJò,LKKxD"ٰadj[ltVRxxxGG֭[I͆]׮]#g}vժUoP($԰'N9wggg0TՕQQQǥvwwgefR}x]I*00/ygaP"%,dIHHr B(??_J"`༼|aaaxx{}wbqXXHXXXccR^ZZx<Ī h!Bn>i y>MK8/` ě`H2 cw|RE~@9aqr~骪-[d@ /رŋ$`0\(/e2ILHH8{, #'''++knn ;#MXH#H$JM&cRn;(uaihxЌ Wᆕ+RSO>=55hUQQFV4155EfO?oo%%%sssP(''ķcRJ.]2 /_~ Fjnn޽{7˲p$=<#?ς7񍦦|;/5kBt_~yϞ=+YYYp3hy j&E.>QܹzU(c Jwccx8?9yJ#RAos_=x!^?Gp{A)Eע>8P]]MmmmɋΝLO*++e2YUUn'#'NB!X>j:;;[*~_(oL жm(*))!3|iϷ}v%/(J30;X~BI\C;g8[mNV5;;; m ػw믿T*m/}V___VVfX:444455rmáh{'N_EQdZApﯫs:ϟ+.. @PxxXTX^@1F"li0Ha_~KN\i9A=U)pZf'A]`H <@IgÈ,>sED1EQ>imm-///..&FSb,//gYvhh{gvv6>>9{Z333~ae###׬Yc6fÇߟ>}d2lL~nn."""55uzvIVeT;+1uꨮ,穰0Ozg ty9g6#1 ,^^JIsb߿====;;t:nBGkkkm ?c٣ 9e/ Ii:33|% ,{!"@{ᇅB>e4at|x3-=$|WVV[NR۷}bbMuDz|()]_ެ֩?(s80h̃AqL] ((w+LH$=\VV033sG}tbbEEEjmZw955UUUu-2?{ju}}}aaaccJھ}dLLYrӉ1Y\\$t:Ӊ3Q&q:xl$kE;@)OfX 0}gcOOyyL& |6lp\ǎs\&p`^IRTTT__Լ@.=zK_,((0$"666<<|zz  $pjFԇØJyKJ Lb!y dm ݉D ߾H~Qk=krs%P(H$]]]$wY"ŅB!a”Jedd$yB' _|իWvHLLzjVV&JE<6l #G(On9 x1",3z6TlLV>8 QQѣd=Jɻ>K+>]J-7b$W%~TKx, ,Q^\+++~aBA111n[VONN=# %%%===O>ɓO<jڵk;::JeKK1wtt|tHDE;iɾzG?d:B I#ϫT*T(+v@ GM6+GBfoo>z衇H1qϟWT>__vyu2ٳgO]]B(##ի;wΦ(0);fc'~`& A.Tsݳ0-}ہ1mHgH$ qL& >|C~jJҙ?#|!'rw ቉ @qHvvB'p2%w#:6 hA&EjӞƱ?Yyi!֣$;3 d@Bh@2[2գ䑥Ę}Ǐ/// r²'O /2 s!m`YV 7|sE " tcccvP(ccco }>_CCCxxx\\\xC |r~Z?kF8Y4 ÒX)Ab!LcCM-2-c 052!&!EN).]uַ~ȃI\[ H^VsrrNiڕZEw{^\\\LLo~B  ;w7 0 MUUU86-5 hy>NxGH(liiiǏٳG$YVNw%Rq֘\@`2bccϟ??33333ssrRv=;;[\\ .\n:eΝ;gryyycDzBΝ;_)JPB"$LCyl DlT>~g$=&5C@8b]5$q.@KũrPÆ Niii.\j[n<YؕzرcEEEd>* ? Bׯo~ò>аk׮Çhw 9-yyyfylLL/J><+nMd$1oґ2T0ǻgM{983S~l6z4MnI $&&Js}}}NNOB!]6<<|}}}}===n,+Jm6T*j"馧`f&8HM$Ӥ)F !'0 5.p.AJ/9*Ajo"{n<ߞ{cǎꜜ2P(T\\׬Y377kkkn7٣dddj^jnYFuuuLgyfllի%%%'כzڵM6QE CCCVT?k/s뵊B[UK2 qZ ttt .fddGFFNLL|Gz[[[`{zzZ.8qWnٲg=q+5, ex^^s<Ovv6A lܸqnnNP:uJ$deLGQ]kfgf6lI?ϣu<5llllJJJr'N8|pSS<|>X绺bbbꊋ^/Yhb "A㲳ZڶnJ40RApS2`x`ctaopLx7*zGzC!t I$l&?fl6;C2Z~rssyBg>H6p8V+àa^DٹR)f^^^RRcٳGRc0|;;;|IZC9FFаgϞ` " ;Nr)بC kHEKxLO,!1RƑ#G7ٴi_gyh4{oy$~qqC'&&镕YA~OIIIII $'ow+=sÆ @zV'M0,/Jd7RD2(ђ34Dh,NBU"444^R^^͛Ңh\.֭[w-++5Lc=0Weff49r$ l6^\._XX`)JZR!/=wFSl!'@ 0>>Nfӄh0x``?''w˖-555IIIĖ|xxBGyX,>|D"t:$%%ܹk׮8p@&!Q___qqq|||kkݏ@*D0g1˛^y/8VSE 6u T8NJHwmۦhveyyYӑ@IJH+5z(`cL@H3}>b@ٳ:>>HQHEQdC P]3ж}s̝,<@ VJ*E!Xۍ(DL1VfFѸnv }hfgg''' ney~III&I,//իbbb +,,,<<<&&j$HlFFL&KNNB P%< b*C'^Т9Ud&07===&;w _h4vtt,,,0 s3dEǩSrss- 1nȹ͛7wvv ]6%%*77nl˗/ggg3 GbCU*Uqq4o6!3Z!v7 ͪiZy xx(9^,/ߒ~_R9 .B066vaaA,ONNGGG[{l`` 66!4??Ow?enRN'i ^Z"nJ5== BPrG^ǹ`(N@U!PH{38xc矟`o|]LN>2bjj:SSSC|pŴ4Z=00PXX("""UpϞ=D&&&;::H"99pI-"OP(vzIZ "3332*Bge@BՈBS]6Lw怒 48;& =ڷo߯~+@PVVֶcǎA>99iӦSNt+W,İڔ"N722BQTvvU*++v{VVh{'&&lGRd0(2F+=*޻.,B% x da!)fYҒR5, 9 6\t)11qժU&9#הȣ??7lpĉiD/\cKA$`˲fzzز 5LVhJ0BLV|%Esg!PR`#gÁ1,EhՀ}Aw{ C<ApxhH a~'?>>>V+1tww8fe, ˲E+7 fa~?Y) LXz 55U fDҗ  :;ٌ ZCNAN +g~P*xaN'&pܭmDagw:˗czz0{{{SRRJM^|pffm۶mW\Yis{ttutt{k׮-,,$n󕖖k'NR%%%^w~~~۶m===4MOMMݔg>KE(!]Lx.-'"4>쳿/ 55b NP(ˉhE (,,lxxSPjhh]]]&^PUUE$ׯ_߷o_EEŻᄏuVNxvu_reUvRp$Ԣu{r:Pw9Cco e@*y3q Չ, 1ӹuQUSS322r9\~}kk3;;K-Ç<_rER]z]jU9wqWCcccSS\.̴l,˶}`OJs[qȄ@T}p0Di  @cVH$"l^XXX__OQxGGL&+//^~=IBlI&k׌F<믿_J(9O<:??ŧO.--x<]]]IIIKKKB8۷j9rD--:"+_ "킨(nl EF&'4yStaad2Z]VV6<<\XXHpqE4hRܷoV(* n߾l6 M6L Drrٳghh8BO{?ú1"U[\\|Wccc /_,˫B֭[yqhFP(tgbUR2ݺ)?A7aAe<R(~GL1(`R0 ϯ[h4^~gmmmx饗N<맧ڲkkk+**ǯ\}̙3Bxv)P*MMM333{< D6v<ر㭷VTv7770^ML>(i0oV;>>pڵ;wz<Ǐ{<"LY__/ )6c,D U~?o޼Y$EGG4m2FFF򕯜>5JrBp͚5qTNN&ݻwK$\.HxX^.A Lm6)iWuz@a W*T*Zm]]tnn.{EccjT*)//흛̲W\ʲ#GH2666--m|||aa?T*Y/..l6Z:;;w܍BTp H~#!0zz!ﰸ{]~Οo+]c x01,`?Ά˒O=roNfϛ6m"^BAl2rQqB||< FzX,bFbTP(qb&22R <388h0JJJ_ nJD544$%%-//[J `srBӁ&5Ua:hk-!"LV D"L&>[nmm]XXx~߮^zE*VꫯYF ѹ$릿ll I-..zrr`hjj H1CG+o|<rʀ'&>6QiҠX?E692,/ Lʁ+/Uݻoll$1_O<<3</Ү]h~w?yAAA~~O~}{P(X,/~dBBa-6sR8.!B9xu C* NbLpy3$G )05Xqhؠ}^WK/Y֍7 ușBo!1Vx R E )B ,bs ^RotTU'CyNsF $ šݻw8p <<)++^zݺu~qqc"4y??c˖-@!_N{nYXX8444333==- <^]8!%J( ~QuGjw0 %Da#1`'pt:~RB~N>=88Hwddaq#JLLx<+(ϑ1Ӥj۵kWtt]yh4ַ&&&\OXMO7LL hCCJddz{٬,jVB]!9 F#ao!XÁ$" ɼ~ngggwwwmd^^MiXNN1>={8͛7={{NsE?p\>lRRRYYqNRsŋ'''/^HwZHbccIpMAAxxxnVVRNEtm~!v8 X@J#1J\,hQf--,uwwرGy~֭ 'N?==:򡡡o|`vŦ}{ApǏ~[ _WRtjjpppP$ Gsf$Ζ^|`ӦM$`cJDeD.t4hĽ(=h1zӯDk`h kR D($18/ ypl߾9//Zv۶m]]]ddz\b0wD"hlldfR>3 _xᅛ&ݮ馦V` &"%`$488HKKKd}ﭭwdڸqO~5kTWW4&xyߟmXmvI>44zs:@;1gơ]gxz(C(Y1H&p(90:ÔX-jK$6^UWWGkkX,޵kWuuhT*iii+mۚ U|7x]vvZMBBannh0$X,q0$E#(N$R7PDH*] 1AUCqpOy/]T*#M:0Шd2hѸn:JHK(n׎* k{F~7AD/aJo]i`5(f X֥_pk_~zBBB0{z=@4~@D"N3 299rTTT(wy?,++˻x"7χ$qCCCdyy9 \BuXZd&93t#hYsQA,-xw#fչ_ 7вSAHC!87u$tX.ʕ+yyydjY5cnnh4 ;;{jjjP(TSSV]]f1q{陜w\.\HLL gΜYZZlf9>>jvuueddDFFdK.Ρ ` tOx ܷ 6"{AnG夬 X00abPXAཀ7#1!4Ҳ{◙gYVTfddAqHƤ/f$TUUy</I$'=ܥKl}ڵ .w}ccc^7|^WR0(իЂ1II@b1~f;+BX?;KDɄIJD7baZJh4r\477|>֎ ~D'iZKl* 4M\."%[Id(M֬Yc0bٴiSeeennݻ].a&766jG}GjM]i`@Ž_r66Ib$JV>>Krrrg78:a0֮]o,'&&_Nvza{oݺuzzj=k)2'Ŧ`#a؏>r]z9~732 c 8 ޜ:߬M{-[rL@ҷFc PTR4 ^znnnvvV$PTr?S~~~dd/G ,fiG=}4 +W$$$(J2Dlv#R韟߇pb!H1mbF+Ach=,hé 36.#:*P A][S MMMX\\ܰah~>>66e˖_|EFF^p8֋0 ﯬ\04t:](j>/%%!222RRRHڻw/~R c U#0oF8րµ `am*$E[A ZW?Ei[zj+$04 qp&M8/` xR#›6mjiiξ~ t:]iilGGG}}=/^|xjjaۇ޹ʲߞ;wniiX<>\UU____SS}5LR HW"pٙc'Edw01>xU$X tW;*!bc}nUQ,؜S I#>>LxɈ+--]ijݏ㺺:UST֭#vpBnn.˲111aaa.kڵm'JaH?'u7W,0Z4a@1r;1P`Z,LOM~ݞL%%%'O IIIgΜQ$ x͛7+333W'྾Sgۮ}yyyDpӗB|dG:7o@g']I )[**n_ 0FB 2K/97?/я8R*y7Fgc2 MciZVwtu:CR>xR)E1 FTd2^߿ҜŖ)((())!ٮ.T/ x7?y'֪n A(SUp]~_B/qEJJJjkkZmcc;|ΝgϞݵkWWẂV ;wa@@^YY$Ɉ* Q1I>ŋCЪU~ߓ|M6MLL\zUTn߾\ߵkR<|EE˗wUWWg^ZNb(`0 cbbebD"Qll,yL^X4))i~~~nn8zzz:[ov˅jkks:h&^;::B I~p/~|ʕ"{nkkk׮%&&.// <8)gsrD;LEPw3GY Gxi@&@Qܾ%CcMJJzg:::Ϟ=㉎.,,~z\\ш bNNcf~~>''>obqyҹ7 %11:ti޽7n фSWW}vp8X  Z^b@$ 4l~B`8tm74kfrpw/0JAc*c-aWWs3 wFGGKp||l~W7o덋{7kjj~i人H"F\t'ظqcMMO<1??r^w޷~[LNNݻ̙3yEx”hh/ 5%:F '( զw޵{!Uyt9&,XBNdt$g~뭷+nǣ뉤 ȓeYZ\\lii Zvaan];W^ٿ[[[SSSRRÇkkk qllD.wvvnٲWμaMabv o $Dۧg6[Z;w \.LLDdmddxpLOOWUU p`Y6 y^KTTT655߿N(wСԾ>@pA2󝔔ab~633sϞ=,0ٜI)~ӦMb<bB Y5=(q͹86M v)#'Z8(dØFJXQ/ynnN"LOOӧׯ_?22"jkky}逸߻whhh  t:0kH$EEEdB^۷,˳I$aXCXXȦ؂ ( s\Dr($ 䭲mDH};2̌A~*5(\>>>vd r;::d2qqWF-+2xJX3 C.&^VAR6jdzfܽ`(/%`LI8d!- ?t(с%\Ph.]td\[\\jmmmnnnhh \@ ++7 ,Ʋ,k6sĉz<8< p;i;_KJ}S)`M5b阥"8+Ĉܘ '0(',ۗ&I ++eY^qa233 8i^| n۶?^J۶mkjj2CCCC=ϋ/HUDh4wIj񣣣VuaaСCIII R4==lU4CƁvAa!7LRs_n$ fˢ*FӴ&,PHNNnuIIIh4j%788522r? CqZ7; =A 1.XrcE)i.q5D+PcK='>QWWݽ011`Æ ֭L[6lp\uuu*))!'ӧO?QQQҺ BVb *R vՐ~Dje,YA@0Sð /qF C?VX{ZCy|w0|SLZӕ2M!thԌDX&pyryCCCzzX,H$333Dj6yk׮rb1}uRUU588XPP0;;{ҥG} .DDDm޼Y&!N<|ooV%휜2344$N펍]ZZڻwosii o^WS"@*238=p@0 p4Tޤ@qFbLLŋB%%%D??bX⺺:b=22R^^^__ONBDj!RB\"fS _:F 1IϿ}Tx_X۰b2[Daц5H-I,HJ޽{KJJΝ;GLZ"[XX!2-222{챫W4v7mtoo(R*s-//'&&,s]|9??ʕ+/_ꚛYYY)--tMNNfgggfzX מPQQ?  `DV([A:yd?8׫h~_h822R__T*1DXYY9??ښ611aZW… .\ *jǎ̈́˲וJ͛KKKzNشiӹsII4qx/`/}7j HH tP"rw4/?w~΅hRe.c"F - bZB TPU&OBcLVZZj4%իW7o699n:V[PP0ĄNdiiiEeggI{* {}>ߧ>)rJII~.]2Nĉ3wy,xWTNs޽Q١@g ;@W7?O #:R*e~yfn&wh_ZZzjXYYtvvfr Sas;_w;_GDPrMx7 ©<ဒlozrUUU%&&^zK_Rwwbl111niiq8~yyg윛X]]}Wb#u|_~h4ڵ333e2@sssbbb}}=˲cccD.G;)CV Z% ̣N~̷Wgejb.)w]e(A4̶\`؄A&04Q`u° ~KnTFcBBBbbbss3ƘAnnRllb n[զ"]]!Wm DB_56& "2F@S$}cw̙3M(R/ |60-//gdd1P0ܻwowwL&۶m~遁BAs,>dUpt{wޱZz7^}/_NLL#@\c2::ڣ# x0uQ`Qa$Ew1Xŀ(3 V2Y1%EJ L4pN'z~衇_ƍl266F:7o>{lAADgggQQQGG^OII!mDcqNEyeeeffB|#/t~~>1%9Ta4Șif&**INfglf&m4bvv H*s3Bt(DB q2TQػτLB*vvaVjT*]EFFn@jId#ړAm_g!B ?Ej%Br.s`xhxΝ׮]+))!]W^yeӦM \~vwwgdd|:255511Swֻ.ohhH$܂aFrʣ>u֚s=C~GpBVV֚sJ)(Ab' X[o$_:~߂e3Q3VKC\884= VBxkUWTTttt SNTruֵeff&$$SzZ xU,#Hz!s}..r'{nU#IE}Y(//'? G۞% 6J?7OoϤnom;! 0Y1bFBKoHFr:>M%nyQB-&Ǐ1w\~O֭8uudH,TǏ)#([ZZ <ϏB_!;xHGF"$$'3z{6b1ٌn˒6i0- ,;19qF~?yRt:u:]TT˲"t:|jj*U?cXmcAbf^_=Y8M.8 Xp[8EZ *R 2?!E@$䡏DJII9z <#9zknn6L6>>O\>OY @hD7RR"HUzZMF9"""::zjjJ׋bCDd/~'"!~ 'N%p@`Æ O&gΜ)((V(/^Ș_EX %P"DPp QІ Z;;i孭#""xf4m6IAwăIҕ[644~-1JKKp]um{yGFF`b[NP[ܹI>8Ɓv6;,R99^륣1ơ 6>&&0s B"(*8: fg(33[nĦ&Vd|*jnnN&Bd2x<fBx饗#""5,..n`` //T)ygO:EQ˲--- ѯ/rYY|ǥpxYZk!]_RR(a5"l)h©t+j-Y"nd~ cKr<>>b6l ϕ_HɤL&;q@ 8zVMMMmmm+"]O9n߾vV & v 䢢"<>+Cǀ @,Dr } C@S BF?$E!DqCޤ PH xwf?, ~SZg``ڵkEEEԔzWFwwwGGM&See??Z04M_xQ_xQV=PYYy}}}L_ nh%`/.,G ( פDV^MѣT*gff:$JO8}ܦ-[ k׮8pnÆ 4N\.#GPeb t:{Gl6jn7'sNPP@c`)ł@o/ɡ)nqDSSLq1x DN{FxC? p\deeoVE(@ @Ԁ\BӴZ&GHKZQQu֯~Pn}PÈ;ogg';---v횝ݹs<`JcjZO?)[4n_S |WS3dRa%E~40 "H|`` ''.--8qBRmذ5>>> ?'O|ՔRIׯ*..%eٲRxxx___lllggX,.,,A*=!ā/n/\xt8BnH` 2~;=J;9I(;K@uHS͝#855ELi{{{z'N2LlllbbbRRR?EQhooiiiQQQp0111""l6\QQ}_6mdrԩ~;66&XD,( }>AMOO?gϞ GMNNh4oVaabX,Pl;?<x"gY!w^b amnjj"hթ)+q\fffLLZ>{lFfM:;S-cX4(d@D Uv驪~&6m hmw:d~%Htڵ}s8Ne?spYCҏD"aYWϗ 766>} f\[[T*_{_|ի$'''SI``ziAnnph(䄦xg\'OyZS}{WLLp:tz2q= %r98 DrMjqp&)9YAx׿N>Ͳj ]|r*H$d7عsP(|뭷G)//߳gdz;;;GFFX-,,zjxxb2.kfffϞ=?O?я8q>(G=pÚI{{a_1 Hx+b^-/JlJ)LZpN" 8FA:8yӧz]XX0 111^ӉgWwwwLLoM΅ z_WA"+Y2ip8233_z饻B1kVn~5@ ǃ _ ET* D.K$z<̡!i.((رcǩS\.6E}ӟ6eeev"l*ʕ+۷o'.Vu`pA@I%${䅜+() B@x@4 &&:C***$ 0ѽ>ӧ$""رc:.//oupž={}>߇P6333;;v{||̕aaa(//0*DT[p_˱ "oM"!+EH14P xǜE;S*0c/\|'zqVׇB^x!::r%''=4Lw\XX())ikk[ŰaRvС(^O4}6mjǎ۲eKEEECC'ٰaDuuoIlCwԔ!<^{)$U"ٍ[5RBێ"wu VaӒ6b籐o Rn|gAF`>,Z[[磣)~t:ƶm߯j7mT[[{XTTt…ɭ[~m۶m۶miiԊDj:..rrr@`V(>ϊD FzcbbӭVT*=w\~~~BBBww-[tRyyy J7or&سg|<{;w ϻVQ2Z ELgǀ0@]Ca|QQQ7op@ X^^nmm;}|֭kmmx<===;wz] zeC{lYYΝ;G&dGjd"~'N4ǎtG>:h~ _hkk#R)X|;vX,K.K.d2ɤP,V{4KFr k-F]\F 1ѬyԱ?=cDw/#8R"+GKJJJJJ***\x199922(HaP,阘\XL 7ZvU[?<ܛd[R|BWW*V?׫F#ܛ;wwܹW߿~~^([w!)nL&zSjUUUoo/B(''fH n80bhF~ 67 Hʐ0o9;o#rB7 !p&$a(8Yԗ%'''srr4dG>BQTSS͛{zzmۦRڈxLLLLLLiii0*{XENnc}>ߞ={0ƻwnll0LRTC=qjU*7b33Cv6+ tX%eS*ڷzϷ )|y]<}hLɄ#XIf BEE###=صkҬV+EQ` VƊbb+H<///}y yq*>LJ)4(ƆgHA[O%/0LII-..333F`09Υ ZZZVkwwC:=񊘜4L !!!aii j~~ٳg yšhpIB&sۑ-`h6E#C hb2$MI%`x]8?;0zbRb1QT*P(y>!!rTiAK4M+@`/BO>o|oii!iyyS֭[gZGFFJJJcbbJeSSBPT+ˇ|Ra4zz7L\';:، $#RR 4YtyJW覌IM889q|<MM# @l<ߨoB2t``l6OLL|P(Dd(T dׯiӦen nyڵ EٱeS:' -RVzrrnvq20677wʕM6; ä[Awvv涴P<22c^w{_]ҫzi^qDB*:ݕ_4%ZDDҟ)d8.i=) RCg6?~pVV "hkk.++kkk3Lb8 uww<ر`ڵkuuuEEE´m۶Ry橧2Lh2vttKҾu˗.ӂ!|w_M?UZ4nG;k&T&1-f!tMɁs~wn_D"~g=ZZZ ~?jH$⡡{9Bvҳ#e^i&H%FGG_xᅣG Qhو^l7n!`0 ROppiKN H" 3^DDnۖwmo &>Fx#pCC@Q @p~FT*HV~?qďi"-KKK3͋:N"M,DYv?Ǿ}>jwW[Q y~@^tTb.WUjo~GioojVvd2sss5 T*Zyyy*/NtGT$gI 57; A(N0"mFvO鮮Ñ,^{5O~ݕ&ORRRQQQwwwzzѣGggglO?~Ϟ=4M޽[,\bSO___z5!!Aa}QXWWo>d3^50໠a~qޞ{rbc dƂxD`H@ Bs@%ےi<OFF0ᥥxbXXƍ;::~ᘘbb@&%%%J---& 577J4tHۼ-,"DH @hB, 򑏸\M6^rȑ#_''''&&fӧgffbbb qްaCmmݻIô~j-O}g7fdA1hŎ>Xoc #%W^%#4V.!!`0=z($BrLFZΗ/_rpo<ǃ L媪嘘.fffRSS~(">RTRjBa0\.D")eTŔX`a,HQ8pۛRhj_(`"Pp€aA ]Dꞽ{R۫x'@ P]] (" u||<))(T*~RRH$"`Q芊 h 6hڧ~q׮]уwJda~R(^/A ( ttp"}S uC,APAYnj I$H$BB!o߸=4 0pp^/tttǯ(IR0LOOOqqDBBZj~: }s?7~7y׏;vرF!jQ*dt3ٹ~z֭_t8=n !*.b%G[ÉԵkvkHR՚WTTtU@O|… 4Mر_W(W^}?clZ_deYY?::<88HSSS顡bqܹg}0zh!4ØG*Dû21`0.`(0h Nc$ByZKn9q\gg'ɲ2,;;[VWڼysYYYMMMttt\\l9xjMHH8}}z{{9ՕÓ@RRRTTX$H2FӴD"K$~JHD)lvv-s63 '''Ozgg=crɁ莇%Bj5޽=bxHTβRh4 ",,+4-T*VZ2h4jZvZ]]Mw+ ^xr|;W^}f+5BѡD|ж[-󉉉/2uvv}`0|fͯjTTO~|A.sm޼;w}ɧNY^^Uy殮¤l"ђRy=B]X08Ja?ʕ+{ټyskkkFFlii{'fggبRəillzq_Ņ z}MM'> 6͵ٳׯ?Щpׯ_yRYY9>>N8?j/%&S@L$ALk[)FE SRp6F |@kPhK/-/K$Lښ믗MNNdG}@?v+++Xjj*8C?=kϋbo_r]]T*:~={._;33  \.zACvv[D"6++-Yy("YXHÐwk )=d4"Dps.e@@$#(++S*4M B$ *e4HX(w(*++#X?+>Cz;>SNg?KKK;~dE~T*]8z??ǓΐN}o8uwvvڵ_Ԕ:tkii>K0<OMMj}/^x&&&~_k4M6΄cǎ%''>}Z.9qzW6h0@C!%bC}S!ѡV/_C.111yl2b6SSSnwnnnOOb'~w+{p8BW'OZV\Nn{׮]#37zܹsV5<7 ,j322N> Z@SEP($ RX,###`2uee%qJKK[\\g>vrr2))ittaBfYLlʤĉ26%%#,(@b1: hQ6I$H*}M!${m9ld ))j ±1*@C=dӉ[CrrrrrDNNիW>/}~ӟ>S6l#[+++===W^mii }cB%<⣫ϝgΜyIXʰ,;77G0L^jNOOoݺUuww!]e^~eÇk4LaX.^h0Ğ={mz{{ItFFF}]r%;+SR_T Qyn9z|3F^?4u^g{ 'ƊD"p͛IU"TUU zqqvvv]]]rJrfF&EA3-mJ Ļ0^4)Lg:m{lwww~~ܜ\:"{6=>_sDvm[o,Bd2$64(DQ@Q8}>JHceeET.--|>an76Ƙ'r@=m6‚BX~VG>BGsssc, 5Mxxʀ U[H <@ ۆ)O=z@ ,91 R?HX۷oy/vq9Kl6R/((R@(b!C C !nBp _FM&9=y PF(Y/H)qM87 14tbT .lݺj̙3:.77kjj*++/_ ;}7x#%%ȑ#G/^wI֖l۶mdd襗^*++z*B`ttORk׮FG& H-v@h<0٭dd s](~͞"!JV0|8l Ø!J) 8;U-`U]-[?%Cd2MMM-[:힚 jh46773 F4gFs9~ӟ2 sឞ;22bXva6WVVFcSSD" aaa+++{C$$x 27w;֭%8|b|jJHq[ !R?MLLjXcccZZ B MRL&J111dnk4ddd@P'=|XF`$ u3q ,m o'$$e˖sΕNNN_sUTT;v B;p" q B2_Yi׼vpuydcg]GȢ &pA Zv<5   Άt\M&ƍfgg~f^OfO< N'8 ]xG}?>**… _RP(ܳgȶm8#ġɞX~k׮9Nvڵ3gΤ*J$9 8H slG~wx I@;]>rc}0 B)F"aNO>aD" M&>{ɡh$'\\\x"EQ6mhh(11}3^wyyyDcʕ+555֭(((8qRyyy[[ە+WHg!ӓ dٌ@G'f TJ^>VDDD Is\LIIٷo[oxӅBV`(4 C H RଘDdz(k4jjjxM,޽ŋ vxy4]]]{W~-1z{{].W0 XPP@~dddnn.##cvvr Bawڵҙ`YQ:b`w7)"R*فvZC; YJj !( 7tPi0g*"1TC,SSSPA܃WNay.]zǷlrҥ쑑u0H4??t4a?}ۇ^y/; \S8JoE<Y)8߶mۛoI ]B;w$~ϱ$hX%J2<<΍Ľ B/..:t/22rrrrQeuy褤\HRlB;110mR#1BD@+ q65SRÍ@XL`6fѢB/#!!cLQOl2o5@ Uܹs3g"##og0jkkw;88o߾%usF@Jfdش4A^^%V990>xΟM%3=MdTx8aeo\Wo,K 4]-[,...//l6p8eeeNMM+cǎþ>۝122BP5m_7ӳj-'?񺺺*Jظyfñqƴu566bѸ(H5=犢,+ qi )ew;w<))C:uJ''' 1L_+ ӏ?^PP٩jKKK,*,׾Y\\$B~;111h+q555B饗FFFl6[eeeWW׾5Jx7 y`G啮Γu 38+Ԁ}-B p(1D´,8,kri2 t󓓓AWvLP(h4tLHҦޥ碢"^x  *J  #F"8`0ۋ&) 傜@OddH ugh趆J䩧VMG62 xpx8%@@6]B2$ʊl2~bbl߿?¶ዙ[G}ƍ %+V' Ma3/bK04 J))Qy.C|8ҩPE$8^/))y7&&&HoݝDosss/_vGGG-ꈰG)((gΜ!"mٳgIl6///?3NB`~/ۜo`L gw3E 3! UIT`!0- B+xPhSrV n fWj$ٳgy晋/VVV <E 4}ʕׯK Rgx׃֭[ӟ §zɓO>dgg(M[ntUUUKݝEGd@g'bA^^cdJ xy\ BX6U/=Ps3~?&XP@=1pBhdX,G;;; N|eNJ -((ͽtRBB]YY)++xbFFxdff...J44fƭ89 )ek ˷UnI&}چpb$Ji4fbT`sA[DUUUIIIMM\.OLL /^LKK=wP(tjet:BD{yrylx]7=Xp|$ҩV`À 7u;w|xllL  ´4b\u-h?P(>яJ$興Qo|򌌌¨G}4 NOO|d@90`  H !{yBAt˛+ܾ=ܥH B nSR]T/c$c<MtK(:@ pYx<B!ˉs|BB!<H cxXg& l@ @aaaׯ_8pe0h˃V tX(`}_CCCcccDDo|cccMV9 P( n`0 vcBEqWQQAsZv~~> jpx?`<8<Zх"dexBI$ ଀()1PJ1B\QF-O2B(''GPdgg+ʗ_~yƍ555qqqa7VWW'''GGGQ(uP#$h|B(11QV͖]VVvҥt8aب*`nk_kkkv .t֍7l֧~}iirVV˲,8A(qȠi>HMM%6,,رc!iaP(l EddOOOX,2L v׳ g2)f99Ƥ 23JB|bZ\\&V?kbbBVBJŒ̲,ݴ~O<#cǎ1ξs!B<,'- FaJq(Ax؟#! PV} $ mcEE%uuuDx.^qiav+z+##CTZ,UM܃&,,gMNN/**l]]]tАlZ_yŢVggg)"jr544pZ+Rb1fOF4 2|$îgΜU!vKKK f#QQQɤ'jjGc$AM 5fl<"8-c& a? p( `/I\͛(Drz>>}fSAX,&gϞ5,|ua~3|6-66鰰7π60;;kٞ_~c,_}U D"nyzb ́Jd32B &&'yv p7-1 2Ljln~Pv(aa2ljjj>\.XLӴVTJrjM:=˙sssŤ099IޥVUjX(WVa'O'0Ryzkii)<|ULF`+,,$#QQQsssgff*appPTgv XB$Sb111\ptq(i_.ٴ{ sLVVJi:::ѣ6lx볳Y)"ٗ` 2(h˜Rwa(IIA BM! J8x"B04oM%FUUUwwM&''fmۚw``|2!dnWUUH#""beeYJ c @<^lKK\0)yw:XĄߴ7'wt:w h0@~=2)ncC!qqeK1Rioo/++lVunnx]6RT*zSSS2vrZx(X,zadZкunn^rJYYYnnnmmfÇ+**v!7'PG1ˀEb! dA$@*p 5m~[e3X59pCDJI ` #iO3) WVVFFF{SN544477u577oڴL -,,DFF-=Sue㒓x :4::ZRRb6kkkU*ծ]R4//y֭奥vbt?T b \-,8:g]eBwѵI=!آ"Jd 4EDRq<fn7@ 033877777'JYz###7nLNN 6-P)??t:߿J KOO_XX@\V#--O+++ ..c /?8=8Aee@(@a"1k1*9Oa@I " DKvX@ˎEX]v!0ǿ(VXXP(juEE˲{Frxw@8͛7,,,ˆzj||k׮]uuu-..dqqƍ_)-(E<A90G 68\ n*"?BM1( (@(8i tvD"!SUd]~KXZ0,,,D'N;RñiӦk׮3Ƹl޼9%%E*'OFGG<#MMM ׯ?h\XX+++qqq/r~~>9i8>X3"Bn]|R%b)ͤH}v԰/PJNݎ6Pr͘FqvvP ?NaIII%%%uuu4MT*p8֯_OQT[[J"m`MR~+6L6l!//)))KKK+++YYY]]]FQ.[ҥK7o @$Ճ,6|2^>'UP2s,AQc[%;@.(=RX.\;zȩpL---trjj__/1 קP(Ο?}իP`p߾}۷bi0|K.-..)\^^}Ç!Tzʕ=Rt0`#$nh!%D1Jq78ۍB:J "ΎY/HS4aabÇ%ɩS6lPZZبڈn_~}ggML&SlllAAk@ܳ444 '&&HU.~R.MII"r\$}ۍm6n71ƈaHD"JEb1|`;}/}5^ZdAAuruP0BbdDիW۵ZbQ(KKKbX"LNN.,,RFFFz@zbY\\ljjzw! 9?[O<QXXH([ZZ5x<\(DUahAvCGK ߡv"rZ b>#rzoC @)jss3B\Bk-..~SrJ}}jMHHiAR|QQQ3336lxxJNHfgg7mvE"ц  55UPܹ3 J'xB(pR~] !<ayP6xmm 0B 0aa >!gKٳg=,i&1˲&I(PHQ#bFa$ ˲Znj%mܻWW"))FcddMN<VVV6>>T*bqtttff' gf7ofgA,F -PjY+xD"ʼW`nA ^\Na2L"r( !1&0WaiF9èKJJ"8~dSSS&)..!66655ull)d2ٳg}SNy͛7WWWkQ$L &r9_lO0T5:"!4AXA0DÀpttԾ}:::vءP(cccJSfFF'xXՕh4@TKq77/R'y晷zh4;wNV湹9R}7׭[G%===QQQgΜٷo߻01g$&Q!hhDALܓ)rA4T-C` bNy2DBXtttww3`0~z2z/NLL=caÆ v{bbʦM+**ZZZ6 @,I daaKpk=67NQ.ZOCxKe@,D, Hfppp۶mojU*f[˲绻j5D.,,,//~2{ f3?*^ʲwm2˻8;{lEEM`a\>??o6|7|S(z^ɤRL̬L@AT4< @w>X}`}mk_i(! IL'` ( 0J ==>!EӴ޺ui4#]Pr ݾ}Vgo>]tI"o~]WWP(ǥKRSS_o[`x<6GߥߏnyV._Q^ޚwP @I薽ZC##kKxvDV+`1)n'9fY,oLOOR0BPKKKeelNNB(EDDׯ >)\LL uGPu:H j[P'Id}͍VQ2 D$B A@$=h]mXWl!n "4H.tMiq]mWuu5舍]XX蘚zWVV:;;O8WRRrѡqc2 鸸2aHTRRg6mdE"ѭsh>_>ѣ333۶m# tB X,4M?P֭[W__qF,7 ~/>?sAB&O+SdWx" l# $ V'c4gDB R^rJZZX,V(7nhoo'<z0tCCCN*))x">$B=hDO>D"QTEEEV_yFKKKGGG+**[Z[x VC[!0qIȃG?= hbl;XH=m ;I0a29App]yqhlhh D)HFFF&###vF!Jh855%J?鹵5??㸦&@8rܹsB0::rMݮjRtVV盘|֯@4Hh<*9.u!Aaͫ38|0(2Zm@XXXOOTOOOVVVgg'#tuuK҅`0HHǎEEE===" -Vk__/[%%%ݻĉ### 4fff$P(LIIvZll,qb+@ MLy:9:Fʯ & yo;!Xm>܋ypb~dbȌGxʼn:70=y@ݻvWWWvƸ6+++!!F$#( TVV0dɡir _?c % F,//'$$AvteYp88s݁@t\pc쀠aѿg9p|Gw݆9`n,0 *x6g: 6@, X(fѣZbLLLTWW?3G-,,Nt\ׯAPH]bhg.=Wt:W{ =1'n\~aHDa`` 33seeDt'P(3/b+CbT8'V<òEEEֶB**E-..n'4M;BA<3RSS)zWqR944rHi!J W^h4=== biiI&4MQ թPj8P4V g'JڃU8(5lˬ Sb MXg`P+I1Eڬ;v9rSM;::B{!mHRRV̔d1vuAWI(:۷o\\\}ʕ+< i4^zunn.""bhhH. &{G-˼gApoT#C2 (L`Dqxfc% fc1=l]^b`08qaƕaf37bbbZZZv{YY׭VkrrlgZ=111dדۤ띜tݑ!>Fy< Sw4M1ёKB`p$*X* `BlSGBBQkZV"#""bbb~WWWTTa񉉉OPt:dznݺP(411q{>X .0 ClpWVVJJJcbbjuKKfsiiիWӲbDc: XnlpZiq$SrxM# \QQFN@ ۋ"lZ_jMMM"(++'//אiRRdpZb͙@ hׯv=''O.[,Gydyyyaabxx8++bFJ5O)C!M&7(HvZ,ҷZy嵧96G;< QƘˑχ=Xoh pxB*0ƣ^W,,Kv.TM|ffD"F3116;;$x??mڴI,ZvfffÆ ]]]>/<<)hlYzUii|dɒp8dff&$$>|e٬,LzzdR^UU nw'hn عs'q]w۷oNj5{*u(Zt{-srr>VAa#$ P,P_GksFGm0_UH3!oC!d?gC+ \ܜꫯi4k֭;{lFF|յeQqL\n4x \y^&=z4  CTRRR8004tu|{(ȲaB*T(E.CH''7V WQhE(Q, ݢCAhR7\Ndr8nphڹ9p8L&x5vvF+JB=u :;;[WW}mɒ%5_ׯ__SSsټbŊ/v}ӦMGk׮} 00:I%  q̙iqR4I@c*L%Yg 9(;*d =$EexܑÛ7o>tP8V8955uppBgϞQ|YlYkk}݇` "[ z/oaEqY"mܸ駟J{}wn։kמ>}:22B8<<\TT4==x-[6>>p8vu~>8qvVB|hFQl |GB(x ) 0R)uu}XE$H E)5Ѿ>jW;BZoZELu!E䟍%KX,]~?v ڹsgVVǷmfX2229RUU ~'Oh4Z*B˂/((O3EEE999ԩ@~ E Q gA%44Գ,Ғeۓy饗\.ך5kjkk`PzJxv{ooojjj~~XmmKv \x?}tnnɓ'Ay~]]]؆Z";vl޽Gζlx?BsssVVVLLB8~xi h^V]{N+JEG@#2Jʴ jR4???11o|- Þ={pdt8j&&&^w޹f[֞{;~x?)xS)@?3۶mKNN+/+ 83B!JaRSϏ.~Q^H+o;g`@Jq~Ò\-"ET*u:`1zq糲&''pBRfggAxL&STTT8&z\kXddҥKr-\޽{Xl~ۿm߾g{WO755% ga $NӃ%E%efULL}Ia(&g?`p˗/DyvvVR=Gۺuk0x<_Ϝ9bcc}>߆ FFFrrr֯b4>'Q( CbIR(.|QkpgBV$IPD?$Jwy^gH$k֬izzzzdddjjkimmU(iiiΝۻwJ:|7ogff !禦&ܻ|>˲ {lfffOO.,,\bÇSRR NcY͛7WUUMMMMNN_tW^~o}tt__?" ?~/fР8v> Jq jMcZӧO\pJu_*Ѧ ׺I`h!J3!gAb1'Txn+W* T:997q3gN>]YY^ Ν;g4{zzqJgC!SSSlrҥѷr˙3g/_с=֯_???666V\\\YYQ8i+@LNfASF#8$d R (6Yo\rd .,"@ E৑BRi.9׿uѝ;wdÇ/[^FFF䴷/Ydbb044L^7ڒ `p޽w~~Z---=qDZZqccc7pñcǰHaan߽{7v~4H;_tv"{Vxɕ trCÔ(ϣ@#Q(Bde]Br ht8E9(|˖Xaa!se˖-[l``>,Nh4jZ]^^O P)GOpö(T:77wر};,bMM̖-[Z[[f3Ӗ_r ]]]]EEE K.zqqqշr06$J%%%x5\@HR0I/5 @铊v4ڻ؁H 9$zZ ) XZp1 ObYvڵ y F.C''''''322=j4[ZZڪApʳŮ:n$>>>>>~vvvjj߷ov{LL(Zgzzmݺ㸚u%''|(ςa "(B C)aQr(_p8(~#VK0lf&ŵg띚kf(E0C!39FxA|>J2L&3`ce͠(.Hbbb$ƍFZ> PH9eq/+HHHd? ٳ'--O"޽[P4j*a%%񴶶FFF4}!Nj-K6=="3`Y(C2\?Hu?_!:==fgm&!j4 QĮaZ{`H.K$RyY/T*UBBܜRLNNNaecҥԉ/s DJNNܟY&rl\45ě 3oAaYr.ܢo߾]v8pjfeezp JrffF*VVVPt:xW(RxiY3-!nA9 枞-HpEk9|L& Z6==}bbGNgrr2^{>{,9''gڵYF 7l";w ZۻuQ;wZ, A+K AyΞE~?e4@"aI:xˣbb.Wdd[dIKK BHќ9sył=>Z-NAFz1eYVEZE >wy睂˗߹s~e˖ϧwvvvww#233Ϝ93>>~]w544|>^Tz 49B*N!,G|PQL۷o8qYFDD'%% z秦6m4;;k2/t9**ɓ(feeM;w)//X,N3..;<Zv`3!@QTT78fegٹ9|IӴRw=}ر|P׫͛7o޼BXSS JJJ^~e$mp8o|UUÇ3)9 zB#é6@HHtY^䓒!999xfjj*###%%E*phܵkW8V*K,aYO.ۮ*Ϣ(644gff'|266;v8w|pu 544X,VkZ7nܨVm6(`C BP Lr2a A):qz\.JMr(RoEIL&{{{=h$v/_XX;333PoV(񑑑eÆ riff&!!!~٬⒑ Y ~knmmּRZ_u* e;vyyy @w{> ==}˖-?7mTSSy97^>y_XXPJd-[8OQtVVĄjQ**fNu5 ANdDJBy=28nj6N'vJiFZfY6//OT,׭[7<rZ"_A~=NGGڵky8X>66V._s5:M"a)G$<uZ{%¦5&RnСC333xR)_q9g˗/$&&b+iAV\ 0 ءzҥ /Df CLb"?5B@1LDQ* Bx'=〣陙V+Jy{W͛7P/r!_}}};v옞^j?^ZZZ]]YPP0>>h4wJ^{Lo\.e@ !(wD{0 5RJ| ?HĀe+JEEE 桇2LJiӉu gfdggl6[JJE_oygX>۷ttte˖-,,uttTUUuuuzvvv:7ݤ@`|(f?L2' D`[[[~mAnwNNβeˎ?u^jV穧 tǏPڲeKww6*9vR4L;v8~5kNolTTTmmsF K~{ÙC˗/峳r\XXڸq竬...|z+G)))]b)i&A qM\8ԙ*JRo?pt 6Qj@)~ت}{Qꊎ^zur 2馛(:{sUwwf ׯ?u@(W칵W!`P*feelݍg7o>t^>;vsr9|>~lLO,дKLZZQ `(*"Bt: h VtjZrG4Ƌe&...""!{رآP(T*9+Vׯ_?00iӦ㺺JKKN' X,k֬a&"""33w&&&,t:5 q#A@1YD@J (5fAniݥ:m F^I"@"""hkkeZZZ{ll5kp$lkkkDDDvvbg,˖-[yw8 H y|ɳ\.GB%%%Xxbccw}˗&$$˗}mmmƇ~fGE[ZX:*Idssˍ LB!R4[A0xv3$ҿZ(6zET*dYiittBt@!t:Ξ=:??7vFׇu@ |?/~AQԾ}?`>!!fvvvvvvaa6lHLL|٣P(kۻw)DA& N `FȚ!2nA91D>E;/].Z $<@܇kπHH7ᇑ!\>66{n\~+V,]Nծ^zddDP444i05EGG/.?311155x沲\.B陚wmmmk׮-:.55:uJ./5+'Nz{ܜz{kp̙aㆆƤRi0mjjʠuA9 J!riu{ԅ݈b(ɀ͗V\^ )K@({`7х .ZbG̰,+ ۖږ.]=XNL&8p71??>?}رAVsJJJ}XlmOMMrs[,4b4*?|=>|X>iQ"#5(K_l5a^Ȳ)J4B]~D"Q(<4(U*\vv6~lz~zzxn/t:/NBv{nnnMMMLLf8NP( ZPP`=ϒ%KN8AQ˲nP  (!@@p nA `!x@ f5Ea¦T6=kP?4db/o\P@nGH5k455={6>>:.11jp8|FbXV322h\jrݹO4Mo߾}l F311v5*lv6 ps3e21qqKRy86b۶Vp![X(MORD`b|Sah>鹹9\=`x_iLƦpXRF#XGHJMKx@/_L9~s6m ##Lj*?9IxFWT p IIINiP(j F") D5r!;,2 sѪnn.55`0n400`ZjRZFnn\^__˲1LV@>Xq PWl?)"xߡ_D,ȸer'FA(bk%//7)ڵ BX]]]ZZZ\\#1pUggJljjVktt|\YYk4%h.3_җDd׎ZP"av̄Qp!!8`h䋊BN˖`B< @AZ-]:666;;kZN'q5 KNdtbS߯h%H@ ;/BjjjNN3<~~zҥ8 99cppP>}wyg``h4ⴌ{;صJdb BQD(Si]yź_b =S4Ɂ PpS @ m ~T%E6M:a^^^qq1EHJJdCPFFT*{f3Qt:Wk˲uuu $$$4Mo۶j?~d2233.]:<<JJr~~~ݺuK&9$$kֈ'Xx͋=ӑ_bq P6_<|P" :P&SyaDDM|>\gϡPhjjj5Ld2#""A a ѣǏbcc###׭[799x3 sԩkoݺugϞj+V8~xZj%b D!$D8< Pr@ %~ae~%m@ Pof{5UDfH ~sw-ڋ۷vk_] ѣvۛodɒ`0;˲K>?}ق%u37 B?|k1455|CUVV䌍 * Po__n^^RiDGMH(Y&拴 "ȲK㘤$يӧU>i))\W/|P7=1vʕ+[[[,Yo<]Ö/_~ر< CSSfMIIq\DVT~vGDD<O( RLKKOMMr|Æ ###,jZgfMH` eAF e1\g^9h xURK H3!gE>DZxϡ0䀍`0q\aa!0iB877g6!o֮]5 c)--ZM/< r755ZUt8kq:СC۷oy~ڵ: dg{z"i'xHPn:{̤##̵BJe]N'qǏn򳳳ubb/9 - X}>덋&@Ru] s=prUVVz<[n022:99!zjTfHS$dD z @մ}SD yApƌ`8g̀l,BqJA ͍m6nn0pEVp8|q˅pϯh4aR(+W<[{Wũ*lٲzK)@ hl6[yy^gY{޲z5 ZƆ{z$) )IRX=غP`*2Rt:D 6r``رc4MS2n^u:FtZ۷9s& 8\- b󅢨{?yssÇk2B½5k466zJݽqj񎛍7}\k@t# PR@Z}m  [:͖1fHɁ$ (ʕ?8&%%\_OEF)5 ¦ƭ[vvvbK۟E@_)0}(' XLւkQ\%].׃>ՅɴdffꫥcccZ&//ٳ2lzzѣ6molle픔Q/e]{~BЭz\{_jkk)---HMMu8UUU؄M"hZӹ"NIQnn5h/ ^y B8N*aSStb 2PM&@@) x< hAӴD"P顡!9<<<55Рjggg`0䐩3@ صaŊ@ ڸ8Jߟ>33N:UVV!bQQQ}}5C2R&bgbHՊwR_! ? "mJ)ƙl< JX(B$$nł=g8>|XŲΚ;77hB999]]]۶ms8%%%nmʑg׋5MeeD"KNNH$D #""Z[[W^phJJ@99l^^MT϶* rgEQLP%8?nk\ (D"S(.AUWW'%%uttPRRRQQqѤ%Kn앆WƆEQkH$@"@ݻ7%%_*ڵKPշUV;w>C4M>裍:.22{XlYJJJ}Ci:Ī࢔bmZ P=J3E\@BxnSN[FFGu H!7B}@CkS2`CC\.8eYeR)qGϧ(*fAQ`p8GyeYZ=>>l熆 DQBFT*Rɓ'GGGVݻ:իW MUU&9ŕm6==--.a)[FfE، &!A$&.IJ)"taSDhkkƭxm08iӦ 6CEGGT*BaXrrr C___AAjMMMMLL9//oݺuy^A6oތ[[[X!,**j)))rk q\L lvvo=^?@@L %KCEGEQT( uZөfv v||@ |Fokvw̬q\.klllʕ555y)J###{ݻwkZ? `͐R ?XNׯ_o~@ $i0lE/d!,OPb m@`ʕop$FD"Z6mÆ YE"455洴p8F^i~aaiiD"xr9,𐙙V r|XْPs3ɘpW09Ic0:s^P!DWn@Lf&.z}t<ۓ(~F M@>D!cgϞ~s'N<H)~$ B`b!$";;;=Ϯ]***eoȑ#gϞ8~x\\hoooTTԾ}^o|||MM/<_پ}^|EL688899c=fZ_{5T555ezkkk}#G>|forr[nt<m6Ϟ=kXfp8[\.dMc$26:\3xE Y3 H3!uPvlYUUu rZ[[{zz&''}>_LL;;;srrN}zǎ=== mEޫ鲳%޽{e2YrrrLLLNN}AJJJJelll^^M)))))) +VK4>lqwٽ{~K.tS%CP5C7NCzhh(-- (ܹS*:t!""bݺummm[lijj*,,?{n:??o_=_~ƍ---+r\ļ sss8_Puww777_{QQQccc 8LGD)NHwt@IN溻6&+ 3<\ΤQ :$Jƨo2=F!<[VJrnwZZZYYYVV  ~a@ |>W/~qq?11{OApSSS}}ݏDp΂$h4+o׿uקt=zt7tN[ $i*@~P/˯ !d >x9cˤO ž}8[f\N9~Ν;GFFgff{zzRSSF#BHVWWc7vݾ}.yFF̤t:::b^-&- O/]iDwvF\{FLJ%LMѱLR?48ÂJ򡡡⺺!qMQZBSSS߾ˁ@ȑ#~///J/AN8vixwuu-[;vLVGGG={655f|kbK;! $^ZAaGn˗FGGkZD'3sss Em۶o%? 4zݽ.L&Bttƍ:$pGGFIKKs8Zeٞhߏ;;;˯4y8/r-Vfyzzzzz:xL&[|y[[5\r |>‚do{uEtuI]]Lb"EED jkqCC,Lĉ J"Q 7Z kj.ع E1R)燛%EEv:*ǁ("yQ7L|P(ݳEQ|nf|㸒g☔`0HWTT]ȑ#>oɒ% LMM,6kQ_WΝ;;sss%Ifff8QI!ˉO<鬭;~x(d!EQ tVDd_599bk˖-wy'--'@'''?xU[[ۦMT*Unne{._U^a1<&&f}w/XB`Xz5^ɳR|B8jɒ%qqqv]tiNNNllhlUUUȒPvvu뚚<>_V ))e%1bӡJr==tt4#v쐯^}PzykAZaF71H$bEHr. D\r?uH (mY`L~t؜ӈ&BY]Y)b( B,. VNFQձ===8)pLOOgdd\2@ Sq&g@`llltt4""bڵk֬cccv»JKKWXaÆ+V@}>o0LKK`(,,@e ~r줣鸸p[ T\N׋.WvBi XBBK AAEi4HRdp-+VPTjZRfD],Eqnn!$HGGG׮]knL&|.=444P__/(*""B&Q0009''ȉ+JVK Y2DIO4&Ӳ[ F!( *V % N(“\o/ LOS$$^/X,Lj*EQӵuu--/y;t\AR!e{o YYYmmmh@ D(RRRpbbƍjӧOܹ3---(۷,T*+++jkkI_ Pz=e2QJ%)-~rj|$770V 4K,(vmt/AxQ|_~4>^ e0[,LB?9II(h95 Ԇu`09Α `yy{7>|^(--MLLx@ !>>ܹs(&''?3xjϟE122!ۭP( qIQHi4TDdff( =IyPO)^/fd0nwAnE26DtTTxttvzb"" H$fݎ՗-[633 vL&y~vvV"ɓ6l6m&"_ @ l6+JV_⡇:z____ NgZZZCCCuu5i+//*LBHH@p yVѴ,XwLMImhԥmC@lZpPPAr8;+z88sΤ8é/W>}trrr}}ҥKygFJRNgDD9A Ngffzz:::kdxW5R;bcc3gθn944c78 ӉΓj(f3 <8!x(DC))C))V }}jojj de٬pGdY& ٦KJFGGn7q~?--maaA& 9J=>,YRPPѩJHH (@ ybٷo_ x衇 |}}}~>0 &(JzYUTgΜ 7nLJJ&e2+ cco߾}˗/W)֙ªTJ?].q~Y:n78 /عDR*UULz:~/;jfmڴXTgRSEq`DGٹu  ~D8H$.nݺW^IOO5@ <oذAŖT2`0}\.p\.饗RSS?^eY۝fX<>UU\oBE,T/039QG%q `kQ4^/+>_s (:: MFKwuY!ķcccjEQk=?88h333M&1&"_,+V<l0M7400i&811VZb/--8N'%%%''/,,9.R^bDR߁}A@MMJDGÇK2iiBJ℩)DӐZmSSӊ+'&&FFF~?JrvvVp722277g"""zxxx˖-(Lr/GB(J>x111SZ Sh?OZ^q㥾뮓]{1{͵X&S8t(&zί |e%EE(⇇\@Qb0(c`8<;; !LMM111n[әcۭRBB(##l6#juVV&WV6R@ y'塇ڴi 7P]]ix߿_^uʂ*ǦA9VkwwfɑJ_Eeوu֍[,|Q0̹s^/9G Ƀ>.!w֭[5o$$0\?e6#O / +~lXuy',,,>88ϯX{(?,++я~ ٓ pu 3կ ?chh}GQTWW 7ܰvs] odggWUUK/fgg_W؎~핕~WW?\^^~@GG֭[׮][__7c{5״ -[9{+~9RQQqm:uj֭SSS~d֭~~~G?Qvvvff#sxlgggկ\9D|>7޽{Ν/'}Q@yy9Z|7x#;w޽\YY%il>t:]/xٳgfT*Gl6[DD+W ~ 111FU=t?οկ333ȫBVBXZZiPߏ7U f-~<b+r#oEQD6n(w!t?ʔ/ןO[o,^/UVaÆėJiiD'Oa`-Kll,;w9::eCT~gnjjc;448qBj㭷+{x VY<8<Ȍ?8`A҂ڵ+_=gyWhKKWU{|cֆ]yc{'=lmmƦB~?>>d2~zDuvv|GN8SO}_8cPgz8~8۳g^pl}]׿uqV=yoo| |{]*ۻc#ioo}Qկ~;E/tuu}+_y?̿/%%%xz>vzvqeJLL|=w}SN={oO~"x>SO;Ww=b)..//xP]]}\.Vh<رvȑ]vW| 뮻ί@ ^/.-{`Ers-c466mkq5&55CI$Bī zW<|͸׾o~O.]t|:66ǖeYRx_xG(Ba`q'9^_VV={_Ѩm__T*{~m#Gpop8 cO!//K]`ռؖӧO#f޽{8`ۿ/d2 7ܐu˗94LMM={3jm\ 'Oo۟z)߿}v}>_MM EQ;vʺ'xb޽~q͞RB3} 7:Jor9r$11qxV-w H$\,(c{̙P(m۶;vLvw^ /|呑:}{/!6o۶p`-Ǐ(ѥK.;ի/8_^o}[xqt``;//뮻`m߻/(0vgcΝW6{ Bn hooXr'sؾ[ NL~Μ9s?A{{;yaaaƍ&rڵ;v pZA/V6AÇҍ7~,ydl+**pbGG~Phqloű-++X,%%%|f\ߴi6 MWhxGG{_y{xjjjt:ݖ-[NS8>w(vZe?ͲJkx}G.߽ ΦgyluMNNWVV)|KO ŕ>O+{EQwK:rȣ>z}!M֭[B '22'|+VJso?(zgqsu9rСC/ /Fz@ >J;::JQԟ+x!.]yʑ#G`JJ:455c0>>/lٲj;YYYW'99i6׮]X>{lyyyaaa0ӟkxž={v]]]Ͳ,BHRmٲeG>;|[olՁ斖L3h4;[Tݻwz|c q"X+Yq" +YB\+Y @\ D W D W D$ 62<nyʀ1Ho { @\ q%X+q@\+XJ\@\+J\W J\!W W  Xqť-,Plc,q%@`+q q%X+q @\+X+q@\+XJ\W J\W+A='O, @\+X q@\+XJ\W J\Wp& pF  pf,qG q{,ƞ<%,ALA`- A`X3G`X8{X;`.X:En@`X!,n Ɲ, wq ,dw  "",`1,]pq,w `1 ,V$Z*"YtP~D @`,X  @`,X   @`,X   @`,X 0e$N!{w~+pn`ԅf X`b!f @`aX-EXX`!f X`b!-@`EX-Ef X`b!f @`aX-@`EXX`!f X`b!-@`EX-@`Ef XX!f X`b!f $Yؿql|72)?v3,q9l ,B ",1[Y_}! ,W #Q,qő#xYn@@`Bd ,@`!@d " X @dq" X Yq" +YB\+Y @\ D @\ D W ,W @`|W&ǛB`n`!fX+@dq" +YB\+YpcՖ&FFU'X-T00Ӵ}o9 J\!W W ĕXqY-,J ̸{,q%@`+q q%X+q @\+X+q@\+XJ\WA\!W W ĕW,ĕ ,ĕB` ,q%@`+q q%##WW+='Oĕ ,q,gyz@\9Xb¹9#QѰy={ vn D p,D +,E`X8gX`;wX<@`Xe{A`XX{`iX5 %@`XθG`WX0`A`.e{G`X9`bQ'1}o83?"X @` @`,X @`0?}'8uiIENDB`biopython-1.63/Doc/images/phylo-draw-example.png0000644000175000017500000005602712250104543021261 0ustar tratra00000000000000PNG  IHDRgdsRGBbKGD pHYsaa?itIME,71 IDATxwTTG>"E鈊 hD(#1jc^{$Ă1آ)cGԈQlXį"Jv~\wрy>I[vwهݹs%!L* """"^"""""^"""""^"""""^z9ӧOL&Ç_s믿FӦMa``L۷YաC bРAd}6ۯ<2|}}e/[ ΨY&d2;Khذ!5jzzC ^… 1}tԫW'OѼyj߹d2C.۷ʕ+P(E*GUd^/KFW+IR͚5k^U*5d2 str]XZZqW$? 4PM2lق#G}J[zԩ*[eM]HT%M6u>h Ϝ9nnn8v_U ǏLJ~:u 4q=z L%Kh#,, 2 #FPbҥ֭`hh a׮]Z_'ʜL0Y&\]](**̙3###4i˖-};???]vӧUOW\A`ooԩSõkt(d2n޼7o~R$,34hpvvƖ-[*z8qڵksN055U%;;96m ###XXX /WV8hڴ)>stw666h۶mR*oSo2 :t@VV+LS~ostt7|:CAvs ,Z...YjsYK^P\\ٳghР&OHf͚ŀp]*#}jRYpd2tԩqqq>߿_kvuÀu{aA͚5u֕:n<}{Dǎajjڵk#00.]ҩ*onH+UVO?E͚5ѣGԯ_׮]O?~ ^nnn}ݺu1fX[[O>ZcHIIALL >}={@P{hҤg;wpss+uAAAhԨ&L?YB1`<}?7o IQFÈ! SSS|ƍѵkW9r#FǏ7nD߾}qQxxxodgbȑq ++ ڵիW?<͛KҵN_1zhԪU }􁵵58sb8zs޺u ;vĭ[@E`` gϞ!55;v,,,,T2k֬A ЧOԮ]ǎCXXo>oߕǣ|l޼| d2 Z744~-7n>kݻwqI۷/5jiӦiT}TE~ڻu<<<[oaMгgOi|p]v{077G=P^=dffҥKXbMqٳgԿRHbh?~<.]^z!22<K.w[bʔ)$ k֬[T;GAѽ{wZ^{Ƒ#GЭ[7bΝ7oӱfuΝ?4hj׮:.j׮]iCӋTAANмysHII~$''?m_#''={.]H"..m۶U///ܾ}>>>h׮ݻ#G_k[T߱cbccѭ[71صkNmӟ2jիFYf"--MmY||gϞjG5jM6O>iiiN:D\|Ym|ϛ%~maaa!Ԗ988ID=DAA_<믿V[޽B$6 $si,鸨HVs}B<Iرc+3G~ Ϟ=S 333QvmQXX/LVN5D]k;7mڴYYYjѤI!Ž{Tׯ_zzzFܹsGm_B$﹬>tZyZZ$_~e!I4is_H$_j=f͚ L&6oެ(!Ih֬y1d!I?w000(-+5jm3e!IoʛӧW Ǐ$ݻwk]޳gO!œ'O̙#$IB$zr=y$IZCNjF!5j$d28x2___v +OMj} ;v0E I_j=&''WJ赳S J;w$xe$N:i|O ==Rq J5k ID^4N~m:??_ SSS8^e1c$Ii@UY*={VH$9mۦ5UC!˅}(_R?0,Y"$I?CUTTT$;C(dj,--Eƍ5BuyΫåƍ5J 4eVevZo9*L-d2o_gXiW&Tm .)̱-h貼bhzkΝ}׌34ֿu떐  ӦMSNCB$)*EEE^zZ3033S GG2IY۫eyann_RsTW~ 0޽{z˛/^s^^nxñcDbbt( \v j?9!@vvjy~d8;;O>xwХsU~8~xۇ`֭G}x{{~>>u*rnUIKKCvp DFF⣏>zofffZ+u\;e 1IЦMrR!| 4}g|~88::W^8q\.ǰa_Uuܬ]O_N:?3gСCyѶm[7~'DEx]ۮrᅬ/>"]P]`P u|} IƎ[XN:APsٳꂥ3g 66V~%})֪Ue4GyUdI"XO?c멢h#XZZjFOOVVVxa곴eEEEK fOe[TYe*5)R<^Jh2ɓ%s6h'Nӱg| BmJuԼysܹsZ=x.^g?Bvv6fΜsn:'U74k V!C쌮]}6`kk4y֭XlڵkS&!** 6lڴi6u޽h߾=SSS:u > "wڵ+>3޽-[ğ8!,,,e;wo I_رcBnn+m`bpvvIm6D|ʺ3Ҝ9sKɓر#>|͛7#''K.Uc!C0p;&]888`ѢE5jѧOXYYGbb"4&Z߰a:uꄡCbh۶-p?HLLuҥKS_~7lmmq]\|NƍKyݺuо}{4n~:~7bܸqjaX|9z-q0d@\tM4;3ʕ+xԆԩSC__޽k=uicݻqi@ǎ*J_~q_UV۷/LMM,jJKb_uyk׮?͚5իWm6j9s]?~8p=DGG#00۶mӸGe*OX-]pA 4H888aii)\\\UӃݺuKXXX qm}(RwoǎSԪUK ֬Y#d2Xv~6lXC;v,qzAiL5t&ǎ~~~Tq)L>]d2)p=Z8:: CCCQvm$  bccuޣrڒB˗/mڴ5kƢM6bZ~L]_GYu]Ҿ^/u*077]tqqq:V/_djs]*۷OtE (BCCN%O<g[&&&H4nXt]"''붠@,]TkNԮ][';9`Msq1bѪU+aaa!2dHSرCt]}}}agg'<<=mMilj.}$QY_uQ8t:uӧcԩ*B RDDǏakk wwwÈi q/DDDݫ;M* كgϞՕ>Ԙʳ}ѫW*C^p,^VVVZcU? .Ĺsi&H@۲e N ԯ_8|0RU) IDATRRкu>ViΟ?X>}qqqxUhӦ  ccc`Ν^__C/Qd|{aÆ;<ܼyb}޽{# ~z׏E5RU{wWcѢE< `lc1mL˗/#$$Dz_ESXYffflT56&1Ul28O/z_*886&1mLys$nOv""""f:~KDDDDo>^""""b%""""b%""""b%""""b%""""b%""""b%""""b%""""^"""""^"""""^"""""^"""""^"""""^"""""^"""""^""""b%""""b%""""b-ӧO1~xԫWFFFpssæMn͚5dZlA""""*z>N7|M"22P()6o\‚-HDDDDU#ڵ GTT [}LV-Z;[ oغu+jժ޽{<w܇EDDDDU7^xNNN溸GݡKKKKm4!##M4(W(q[;;;|W􄩩)Ο?9sGUg""""4ݾ}{SN֭[Kv033S+ 9""""z}V]Bos333UHLL,uE7"""j@IIIhݺumٲ%._ BV~P$!"""zSlٲE|͚5W<<<ʵT$$$ˋ-HDDDDez-v 1?[o(۷olu!55t 011 0w\aƌlA""""bbb_bԩ̄6n܈>}Q(P(js򺸸 22`cc???iEx|i^FDDDLzzzzzzzzzzzzzzzzzz-[ 6<==qMKKf͚A.c„ Z׋Fadd-[bj#""; µkDDD DoӦM3gΠUVUV$IcG?ưapY={DrrjÇc̘18~8PXX.] 77BDDTI$!xTRRZnӧOݝL:/^ BcƌAhhh ,P+۷/}vU\]]kÇaccÇ}l""תLoz )) ~~~/BI;V&&&Jgvv6Ғ CDDTI^K})&O.]2 :oAh׮8֣JCViiioZZZ) СC899Qu|d2<興 >ď?Bs8x /^۷]vÇقF3f .\7044BڵkDDZ齎'iذ!駟AcǎбcGj 'OFbb"[^r7߇][N9fl߾;ׯFoAA֯_={ݻXj&O^>mݺ͛7W^ 'p="4}}}nW) ˫R'ũSѣGc֭8x 5jmېڵk8r<""zsCoy]x-[(wqq^ĉ?bݺu|2F< <0e 8Pmgٳx qY\tI|ܸqسg,X+W`HJJѣU5 ذa4<{썩۟VVV@^UV#"FLXXXh+222Jv033S+ Fpp0[5طoN8Q^ƍO{ʕ+{Evv6fΜZԩOJJ† `ff'{ꅈ}ELL bbb+VͭZ[5Jۈ!annnݺ!::/ O""BTTʔ3+BXh CDDZT(Wq.Ӫɓ'w_ƍBXz5XjC/U>.\hтHTE߿ok,OLL˗߸9;ʕ+jcC~zxzzN:lE*L&Cll,:_Tjݻw#''O< [lCźu됚 {{{!Cl2ś5/_ĶmеkW{ZYp!֯_9s@OOFDD?9nآ Ip 4h  Bm._}}}c3f rssݻwClA*j(,,O1bر={d+#-P^wi9p:w وJd:t DDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDKDDDDKDDDDKDDDDKDDDDKDDDD&[l6l###xzzɓ!Xv:5j֭ CCC4k wfeC/~6mg}p9sZB@@֬Y͛YXXuP(`cc~$ wy """"ޗհaCdee222O?{-Z VVVZaggu:uh| |}Pn]䄴4AOû !^vՍ>Zn u///ǫš]v{{{#%%E];;;^"""b*w===XZZW^HNN~ceĉn:\|#F@^^ 2ejf>|8RSS+W`刎Ƅ T17n];w"""GY@DDDo|L>SN-s{?'LMMqy̙3YYY8z(\\\4IJJB֭ѡC- FppKHL82٫!''(..F5`jj5j=zb1x1 abb###}ɓ'(,,\.=ZѸqciDDDT(DEEegg#!!O~aU>js-sغuk2*$pwwR-RSSzj^"""tr0\___|<"8pV^͊ ""*ZߜU,ODDDD UBjj*J̀ymxݻ'Oe@`` 0tP[SNpvv .\sBOO3f` Q #Gĭ[=,!::ѐ$ 7n@ P(P(uqqAdd$/~~~ C&M؂DDDDTuB7\g?-XDDDDD/E* """"^"""""^"""""^"""""^"""""^"""""^"""""^""""b%""""b%""""b%""""b%""""b%""""b%""""b%""""b%""""^"""""^"""""^"""""^"""""^"""""^"""""^"""""^""""b%""""b%""""b%""""b%""""b%""""b%""""b%""""R+k"޽W\A^^Sތ oW^-q^""""J_7o$&&ڵkдiSܾ}5HDDDD;cĉ[.@.I&oI&z;waÆdQ-{$"""zI`gg .eee5HDDDD;#993f_~M0exzzHòeаaC'O,qݘkFvo>uڴisss ׯgEQѣG_N:8p 5HDj6mڄ> 8s Zj>>j;k׮ѣGJ'"2l2 -[ PXX$"$%%OU&Ip1P(SXYYi].@||#zlܸӧOGTT78AÆ b ̛7Jbccc899Ν;nuV4o\x 'N޽{lA*D__[Ue *q( <6l@uz.BI'gE1f͚ ݻ-Z $$䥞ѣGHJJs]x-[(wqqaDϛ8q"~G[/_ƈ#L6l؀`޼y@ZZc:ؿ?RSSqe,X '5(**BQQ222j*ݻ >Xp!1p@5 ,uhBiF<|嗥 reYFFFۏ?fffjef˿&{ոNEO!!!4iѨQ#"!!pq>SN_S1k,̞=#G,s}KKKdffjX&;;;lݺ "zmׯwwwտ}]H)S`Сҥ +_{r̚5 ;v,WU>>sqqq5/\hѢ[ 3661+Q@Ο?K/Vl%II۴B̘1 CXX/.((W\'TeEEEX~=<==QN ٳ&DDztE\|yyy PǴiеkWtMcn]OOOСCn:0d,[ {Ɯ9s`mm˗#%%EmJ$"""ﻅ*?grrrp1̙3 6| "b.77^wN++ر$aϞ=سg2IP\\ Ϲ)P-G||<&O1c 77nnnؽ{N@&"Kbɒ%CCC888/BCCabb "bnƌy&:;"&&&&&Xr%Ο?M6ejXiXzFNw~#" f%DTR"44T5{C hg Q7oބr9$IBnnjY~m6 Ukff'O@$ڵkeEEEa Q-ZիW}KЈ$$$GVXDDDDTz!СC9s&:t9v$"""zԩnݺ7nW$ Z͛7YDDDDT:/_V=z{gtzB$ Uy=zGv=ܾ}[m\[ua Q -BxxAAA%n5DDDDD՞U@DDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDDKDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDKDDDDKDDDDKDDDDKDDDDKDDDDTBo||<MGϞ=Tk֬L&HOOg Q^Ǔ\< `޽{Sm޼Z[F]t)lllʺv&M`:-Z)/IDATݝ-FDDDDZ7xNNNsNB^m=z$8;;~ݡKKK l=""""҉?ģFB^^R׳W_}OOO3g<==qQaffV`<Q(z°a,]nnnտ۷o@`ԩغuk.Z〉m_L&%%u֕>!<<fٳ1r HLLBDDDDU+􆇇KO$ U;c #,, aaa/T$$$ˋ-HDDDDez-czϟiӦk׮֭ưOOOСCn:N:&&&pΝ ===̘1-HDDDDU#ر$aϞ=سg2IP\\ P(P(js򺸸 22`cc???I&lA"""":zj^Zll%""""z)2V1=*:;L(\D H%*/(+󂹺YQinkz R[c^@UWRԨ#Jh.s T9 ^ zB/@ ^ zB/@ ^ zB/@^ zB/@  zB/@ʑ@yxxsڹsg?nW)"zεrJ?^٣m۪W^:sLO{,B\3gѣ5l0hBSj{;o̘1Q.]d@;˗ݻ;,Rݵm۶[hN<ɓ'x{cݫ5jHժUBBB\>|TzuhӦMtu={VEEEw]N>]朣Gj„ JJJ_VPPjԨ!5kLcƌ)]kojذ ]xQ:tN<'^w?G}T.\ٳUvm ׆ ԭ[7:izմiS ;v(22Reiܸqҥua%%%),,Lyyy{BCC4'N(11лpBeffj۶mԩ$),,Lm۶U||oN+7778nݺ{nݻWƍ${GׯWXX* .Vnݪz9֭F5kPm Gv{{͚5jѢ#JbbbceggAcǎڰacX7nT.]J-奃j߾}ۘ1cԼys۷O<E* (''GӦMs W0`KoՆ1***ҷ~T[Ng.wK% IRfffGm^аat+88XfRAAF!I0aN:%KȲ,liVZj@'no߾.;V{رc˝'ooR%cΝm3̙3:r"Զm[+3gΨe˖?򔗗#GԩS};wN/_=TRJ,Ã"օމ'jڵk /ҥKz饗~mũf͚Ncъu_fҬYx޽{5hРR-Z(wO=;tU|r-_i,?? ApIҤI4rH9ǧoTYfC̜9SÇ mְaoڴI:0;V{`͛7O'Nn *y$n5{U׮]yp vZ=.wۮސ&7775i 0@֎;cJJJRΝUN::u(>>^N*sիWSį~wRppuY*%%ESbcctR?~qȑ#AiԩӜ9stQK\{?EDD}7n:w,www=zTIII:pH7/$$D-Ғ%K/OOOkNIII֬YS uQw<`JtHo ԠAIRxx$iҤI9r*Fy5'/P'NY-ˢCoZZԤIwqV.] ~-9aRppuY*%%E$jҥ:~4=zGQVhڴiӟDpgސ-ZHK,Q~~<==ծ];%%%i劋U\\tMޠ %''믿VAAj׮ݻkҤIjڴ)OWoUzj6 WG ^ zB/@ ^ zB/@ ^{Y|9EǠǠǠ &==== ^쮸S.]$:tWF~~222x0zLAAq{d^e1VdJpIII2dZgϞպu(^)ХKt K^<| ^ z+/*..NPr ի+$$D6m.oFqqq U͚5eٴd b}^j{15nXժUSƍcǎQT ԣGjժף>?ȿW{WeDQ!8ԪU$&&tSO˲̲eʝw%ӺukӰaCl2as=fzfLϞ=eYfɒ%ܩS'ӷo_{-[$ӲeKSF Ia]+W4?III1[l1k֬1z2e$ [{={U:u꘠ C>XeVX4޳gO`;7!!Xeo+,,4Z2:u.bϻv"hsssK:uʸQFQ\qY\bׯouFq]W\1ڵ3qqq&,, c1?k֬Q54h #FԩSʝۢE u1榘رCز?.g??RcuU@@=.nv;uN:Ul8zo+͹$%eff;M6+2Ǹ{|qeeeUVׅz\\\B:uJ'O_|@?s/ܹsUzu BΝ;'ooR%cΝܼ=Ǹ;\XX#GF"q>}kƌJNNVdd$ŭ-**ȑ#p '|e(..VllnݪUV) w}WϟWvvkȐ!| Bq*wyG_~>CBǼ<-YFrwW1zꩧKo߾zܴiSϑӧyBo%oVV^{5M6Mv]MQQΟ?*Ujժ. ӦM:tHN$nsRc=}6hԨQZx.\SԻ|RJǏҥKzgmݺURZ+P`B/ /w_xPÇkǎB%%%sΪS=#/Vbb FA1F7oVZK+i۷ot[ZZڶmƍ+==]O?4q6kz{{ M6y1#Gnc?X~0`qww7[l.ccIMM5歷2eq9}7n,ƚ۷m۶9nzܯ_?kUVtl2ӳgOcY;w.u 5[S\ŋ3u5UT1ڵ3+WtZffi<'' 6b6nHQ]ǖe9n6gFz{qzse^WO^t.]D~a=$^deeiR͚55tP={i@WWV7xCnݺ_jӦOBu|LsN=C^4izTu}jժWDD9R*$Μ9S7V5>gb׮]ׯ|||:(55iŋf)==]cǎ|}}leG?^uQݻw+00P#Fp$=òllZt~Vn@0`5kUViʔ)ԫW/jY2228[NQQQ/RO<.]>H>}~;mDz,>}Z111z'S{ք XS׮]X}ᇚ7o7o^*T&$$hƍ={߫O>p !--M>.\kڵj׮qZbԨQR/_iӦ)==]111Nˌ1Bg֨QvZEEEi:㔅H曒9shھ}"""HpQ'O6e;/[Xec52رc害\r,]vx,44Xev4UV&<ϴ4cYټycE7EEENԫWqѢEƲ,3n8On,2999c233eYf„ N˭XXeFKMM-|nnp38 2Adە4&MgOrwwװaT\\\tu/ޫyzG~GDD8}ɫ*YYY7Tcǎȑ#Vqq ޽{+;;Ծׯ~Hr͛%qB(z~ B/WNv]:w\u,uMٚ={>SڵK 2ƔOuTREgΜQ+ܯ]_*U$i}#Izt{eYVj%/U߲p#YVf)Wh uܹRAf}zj5h1Oڵ_J^y 8e5kӧK Gzd)))***RXXO- 1c,XO޽_(--ՠyo~{Ce<==oh+W:***r+9J?6~/_ Gz5kn{ԤIԮ]R碖gϞrwwWttUPPs*??+r8\R/`h۷o1|[>|ի<:tH{QJJ e˖֌3榇~X9sdq驪Uwue~),˒eYZz>(M:h٥lzϣ>S*11Q=z=_t;vf͚S=?A6mR=ʝ{E… կ_?8[fMr5kۧ~X<>D[k׮Zlx  ֯_m۶cǎо}4uTժUKw:n'l^^^Z~モ"""׿ ‘^<B/@U+\IENDB`biopython-1.63/Doc/images/simple_chrom.pdf0000644000175000017500000004070412250104543020203 0ustar tratra00000000000000%PDF-1.4 % ReportLab Generated PDF document http://www.reportlab.com % 'BasicFonts': class PDFDictionary 1 0 obj % The standard fonts dictionary << /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R >> endobj % 'F1': class PDFType1Font 2 0 obj % Font Helvetica << /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> endobj % 'F2': class PDFType1Font 3 0 obj % Font Times-Roman << /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> endobj % 'F3': class PDFType1Font 4 0 obj % Font Helvetica-Bold << /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> endobj % 'F4': class PDFType1Font 5 0 obj % Font Times-BoldItalic << /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj % 'Page1': class PDFPage 6 0 obj % Page dictionary << /Contents 10 0 R /MediaBox [ 0 0 841.8898 595.2756 ] /Parent 9 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> /Type /Page >> endobj % 'R7': class PDFCatalog 7 0 obj % Document Root << /Outlines 11 0 R /PageMode /UseNone /Pages 9 0 R /Type /Catalog >> endobj % 'R8': class PDFInfo 8 0 obj << /Author (anonymous) /CreationDate (D:20111028164923+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (unspecified) /Title () >> endobj % 'R9': class PDFPages 9 0 obj % page tree << /Count 1 /Kids [ 6 0 R ] /Type /Pages >> endobj % 'R10': class PDFStream 10 0 obj % page stream << /Filter [ /ASCII85Decode /FlateDecode ] /Length 14385 >> stream Gatn,:!Y-=Z'FLCq.2Mr-`%nNlYI&DtUN,ZKuI/5F!VBaiqFCKcrro&'NrnTg;q!!h]5Q*CmeUL7_mt^^/s/geMW3q%6qg=>K?Wq79nY_H%bElP9]^./R?,,`KoISqPM!-5\]"dC\[20kZ1?TYKh9SaRgOB.srPtO[iJ50\qN$$7ia=tKE^-#P7lYfVEAXLs2AJ8gHYm7sH4Mo0=#RgXq6D0m=Bc<9o:iM_11"#O8$I:(_aZ`-icgWnp&(oaV3W-8lu&b'Z'4(jQZN#Z9\S;e=ML?-[UZX,QPe2d43lEFpr`Q3p)P5\XYs[;[-DIf,0"/Pm7bI$bl4ofN:.Ui04SXrphZQ1m-+!(H+9s#\W-8:ij[EOB3f^DR\M(')HpG@!N(4pNu0tQg*k[_@qb*ECqdCWAaV.iHC_sAkS,`uA]A@QlZ]sdL,`u'pU>@KcL`XTa=McOH6,jbL@e]NZeb;[K8j3KZan@mH@X2,<1J2ECTmML^Jj@?40=as[IlBDVVa#H=Xgl7b'NSRc7cg&@8'0eF#LXYCVq9Tm=sipJF0YNZR5YlB9h+E:Cm0Nom;\^W1U11d>HJ#IGOXhJNub=)EnSikB1u)s)u-N6oHW,D7,.iZ\[GL:)W_PNV_cX*X37E.Y00AJZX(U;fBkT?!'=?HsRQ?N(E]2[dCt=$)ohj%H>@P2grn0/V3t5U6;j?\/qcio6mJ]42"gOVX&[54&n>Z99fX7tEQSUXXAX[b!?5mPEN..2M.oc18g?oZG4!,3^@rk)RX0(NcTArUgG?,+2(0DQF%_:5!.q^olal9CmfWLfgInCZ(/m"!C)e[=SNqnP=f'd%S\RW7KkM?ke[up2tg:_07.en0CNW16lY'habV"e^;YKG'R:LbE.FZPJ=d+.aHl6'BujO9iUoFRa,CpQ[A"17^'C?!Lt;Oe)bCd@>?&:P2*('U`Z3.FY9IdblV`O^OtNWbhOANNoR`O42RF='"JIBl4X@bH@,.OJ6`BQGuTses['&G=E>gU8.H>EsmT?DJ=hAN)Agg&h)5=\Pg?o)?OJBMCcnl\ssIcPkDIcMH%a@>`AiSb.Cs)89%Fnrb[[Vb'L<#oRp(1-/r&qgL5:c@d=I?TRE]*=dY$:_M#9NB6%,8P%NN2CEN;H)^V->g5V+dM`_gI3GhVK$-f`]Z?fT_Y1dXC1:rS=I6W8\<[<8b1#MhfH"=:f^<)]pdnnjBc=jeeSK(jYW8G#Jkeu(36CKCs6(GTMa:cT#/?7=WPHo`ZpS*cDS?ZB-DDjUNU:`V+:bnAQ>VK#LapS'PUI5XRR"4IE'fcXp(*T+"[FURSd3*>q/FhUX>bePMhK']uia2t\I2K"P$65Nbq(`F"3P58=6,9]P*.JLV%@"PMd3X8^/oQ:QP^m=4hV_AQXHfndsA:6p8A./2ul\`S-0j*^JI;f7mgja3>M*qHC!]22KdfV07dS3tJ&%'UgcLeo@L[lRLPV/IY9d94VMES#/6C_20sK5pUk:B%=);G_=ijiR$AGM"aAmIK8:=uulR@\X9Vl5?S6k=_WHk]l[fd)hYH53Z`WoKKQr]uB?rf\Nl.7T[@KY*OPaRCAYZ>YRbA.ps9!umK4BV)Zj=e>)6rOQ&u?+gO#boDLtH08l[B7/S(Fn-*#"o8hCA"s%fCWd$?Mj?'HA`pE3,^+=KCG0o3`p;pUm'diN-+X'eWEVtm>.QRiJeMbAC4fD9,ij-)?J6hiIMVi*?J&)s5AMFI3K`*d8-KV*,R&EmEqNb=V4pjSitKgi`R%&0qOBP4l]Za>rJ;1d>d07&7%AX(=CsuW"NCO2tfYCO<[`3'KM=Fl]EDuZm[pi7OOB$BJ_h3c:2<.j)HnP3Gq?^Q(iWt@lXi`hj0HpoQN>;P72[SpEUQH#!])E`s5nPfH`G.J&o;,^CGpJu$e(Arq[l4:dTYO#KCgm.!nC\NO7,$,"Nnir(Ue8E>OZ8%$-Bhn932j76&QnX+l,Ilr`7eL?Qc8G13e5e^gUj&8iuo_=hR76SBJ>AQIr.$\>(NCp&%kAl]b>][?opC6T;pq):T.1"9]O]B'1lMal"s3&Htq\@trNYAdPPI]NCYYp0*o9Y.[h%hV/Vl'=&YLhTJU=#Sk)&PtuGOpnT\kq+jm>naSI)_-/\\]u^dc8kJ`"_arK-g"TntrG2HUt]q:g^>VmOF'$eW+8C`"rn5,98"#-O6fi'ieH(P%jR:3@Dr+#1JNur,".d>P>P\d_U&hQcHuGS!Z1romuB#9E$hO\JP"F%^eXO5M"n6K+09#X[k.jh30G6[WH,7n*&=LQsB[SYs?.t],OtNRd'M!$Tk@RW[3kD%Aprjq:f:'O<<0*dCn+A^DBSACU1Fc1t!Xr]1nMI@:`f<),0@SA8d+b=3(8Kk$*=1]U/G"A8/Y>gW97ZC+DGsY<^[ar;1S)"7a?6N#m&`t(fI=uolZS14W<'h1RO$E+\f5?6W=-O9=ioV,RmjVd;)W_U\:HL4bp7`@>&)A/Op$,Oi=o`n+Jra`bp=e">B76iXq2lc-e=2O*]KJ+a5h5mh0W40jf#+7EulES.B9n8m%d"6XWsoJQ-=Yk'"*=WQCHnXI[(A#-R=kk9YZ^WQ?"iHMf+)H)_6bdAQ?$j=&cWmoiLI3[?bS0/[+g#X].B4'q@=b0pHB?>?m$cec&T"qVQ(6jV&pL=SKFWU\"Sf?M\o#KHb@3h7lfXJ^%J!_$)0Kl8#CN="<)kQ&NK'NIF(K\t5gGbJYLYB9]"#cgTB2J)0(4P54j$h8?r^WsJISC[G_N4<:p"Ne73,(@CQkmgkK8HodK6W5sJY<%gU:>,1Bne4r.h4M]+JQI%FH[$X^q<&]jrYW3X58t^2$^!GU?CSOZDi'7GU/klGMnA">QP;ZWq1kVZ."ZC+"4SuotGliQA;Qs&6UWKU$*8RpQbiV$TSBdf/aBOd&#Q^uQVbj/*!<-mD8RQ<:^`Utjb`()Wi^(1W?l#\`Ek556Ao>1fP#VQ/-fscUmMZn,ehb`",>p/:U[J9!]L#H4ja746DT8;VVa3YDZSC$/'Dh4lQNGIHa>7/Ak"^j9/%4BS5mC[m$)q7@LPbm#-/dP,F^X!4?X-uap6Y'AR$*0lb0H/&.h*QaTq,?0V-cdO+=2P%A@4A"jEe,.rQ?;cY%r81)0r#6Jf7V!h4>HW$fUpoCpfFJ-J0k@NWOpWE7#$BG9GAC5[#+Nf"fOhL9ao3K5#TC3nlK6CD.>gI?=.,gZue$VU<5%)K'2bjc,NDFb"1TYSgGuf*5X2YC_QC!plN&-o=3UmY\2d6"6q@l3o$U84-HpG)CcK-d^\nb91<>GN\'#R+58Fhm1C,>u@KP?R)hGH"0U6Bu\lOh,2IKm9Pc)eLjm-=4=q=a,YXf(R!W_`N`lCYiBRfr!-Gr$TaKf:%#dGE_J3[rq&812_f*U+j,NX0!MBUnQLMZsPrgM"Op(l3nUO-ODFn1OJ@BLEB>)@*8[G6b@r(;\"#(F_+RqMgVB>+U0Gi%._>3M3ZUXRNA4Z`/8!hsb^C*>Y9X=D'n@.b+l!NVH((.cZ&!PspHN!bk?@;(aS$JU2e)cd\Hj05mm6AP6Q;EHEb;WQf4Z#C5oNV.]ZF'Js'K?*XO3.5%5KHWnJ8!o$9V1cD#`CuY\>kE\N8[VDtRTr15ouX%2=JT2bKpBfGgS\NNDsM?-:t(6#8X98A?Xn&9lj9^m]]he89jt@*THK^TW>5-cOJ+rUSgnRp2oT10h\3L#e31c6pDI_\?\+`dZNLi7M@h!:c[l%Zs<;*hQl=t#bK<`.S`sl'cFeEr<%%qJ;2O4c:Ok*XuYL6?r.efpX1t/:MQ8)V*qt@_=QM?%EmuN#oCM:G!1b^pGH/-DS8KKhC>s@kgn%a7%an3%;_"7sbD?kdDlAN5lf+=mFafWP0m?YF\*Cuh\:U7LHr,.@hT*Zie,`We)E5(?m]*+]pC3o2,WXXf`GTCG:AW=*Y\S!_"0!hID0`?_,T5CTE`,[;[n\F.G?EN-!*aXnq;WBD8^HN#=>)$^ggK4r.=99rJZLtGEk&sP&s2nif'i*R9G0#oXdd!<">uJ6al*Gnf8pGS#09Cp7ZSE+T!'O>oOhW$;Al&d6@)bam8o!\jAo,KX`gL)dKE^7Ip>rr!FV5fU(]h4=MYkq>=@cnK-hh@P\6OQqB]lf<%_s!CsE.\T+U\PhG@.g[-I10YG_4#F[1:Y/2S7G0C[BYn2rAjCS2Fj7oDV%CGfs*csS%Os$4`CpQT9=XFmWGslO)uAO-b>@LE0#mB:eq9SR.QLLDQr8PI[oMWS2KogW2QFco!cI3?./XWh26>E48IVl..hP=jDT[1=d-T0Fr+rBkc7b--\!(/:4=)^Qj32K7X`6M`pU7Tm(e&C4jB[8;(VOt@/;t6/LSGRmQ\hN#+KHTIiD(b:\)!2b$Bl(7Z<3SUEtC/%(GQ##c+P=^Tf-f'p^dl-,f<^X!";3'_[cjC<5@2=d.,02Gf6T(;[EpgrZ0t1=g5':i*LPa2/c)c2U>'b%l^i_;,`4f9s8?07&m2e\l-Bsk]BhMb#itr,l-2&qObme#&@isIiGJXHm?a`H[^<5r\g,JY*pUAmNLFM9,0!.W[fM:X?Mf0r,&ZYB(EFO?+EpuP/9r>pQ6ATi52398ZE2C9AdSXWjcH.GY'@qG?PNfatM8;/[bF_buf'mfo9LF[)B*%p5B8TTESN"n\(;TLb#Q=Z/09A[!Wg/fSqebNj2X/PT-T8]D9*P[1-_lTogg+L'#WQF!T<`cT9XdIk4m;543,^\:5h4[3D(0GM>^>iE:8h/X\Q&EE&Mgdis&(VP3OT!Xhmk`*]hWK+*keHP(5Ip]=^[>NP(+R2m_F9J_]:p0uDWn^9+@!VPqn(DMgRgWW3gq-=aFE_rMkRbOiOSS!Nkb@HX(R6=c/Z.RLD&7l0>iSJCNl2i1GZeh>f%_q*\=::Ar$n;0NA41B*6d'p$f$`COHV_?!sK\iE<*O5R[+NAh2MNk!"tIB[lk]"AF9K(,=Wt"B[+9Jk=cH#C:cO"WagM>("nQ':AdM:,*0uP@aqYTQ32U-QlI?=53CJ`(dI=I63@i+=!V]a'c-u.M8_tb.&l`@Xlj4)?K0CA!Nr2YZe4=NO4@)X]Hr,+0ns*OjiJZ1iQ,pcVntjR_c>kepMP0At*DG%@m4@j]l)4u,@1&]3&$iI%!35,fkKk._NDpc=DRX%R](s'Vt<<$kT95FS?Ydo4T<)QDdOG!#(eBnAm*]n*)5!E/;,S*bQ:c%n+8"VK*"^,I^8^o!$/YHJAj`Hk<##,YHNC,;pBN4H`]\diP0p@nF0R!A:Fb="_"V.pXET:2cT@rk$QCXoDhEE-[OZ,Tt(b13G$`Uh.)?8Tcu3Q?+pRV4frUY3Y.4.:10"/:'2Td"f1*)X?`aFP^"L)ck\Z,hJI)NYs.U/B$`1&@:X5bmeiJN!A"*0?qVb&KN>XW65n0?\V`qR;tJUc"Sj-eXRYTYK^5"gY\N:UIWTi3I9q[]=m=O.6]fa/-Vc#c]TG4r@BP;&Kh5i`W6I40Gmp=KFu&3-O^C67q$5ci\&aAksEO^.jTKaGn%=.#ghSV=%87GOfHnS`2dG9"#&b\VJ&)RiqW)",Dtljh4T*?10aoTt8%/I2@ROPBa%lZKgN$?@XSi\f-KJ1I2aoT1/=]0H>h31cG%";pGL\_Y8/S_ScNAe0oN4#LEr]WS0+@n944]8b@o\3C*sCos?hOUUm%DRX"Em?ZOF@r3O$)f4EPJNs)bA%'bVm=TsA,SKC/JPBou^3qjmZ1c5mIhS:U^<54-FC>(BEu)H]B?\r\^3r5M<_DWfJsA.Em?WAdRg/U*JaP#DV^2YV`_'$u"S;L;T)L(h>tOY]6,ED'D>j*"_-6O1H!_;fXNk^mCtsJ$P1pGS#\A7GP0=&IUhT%![R=WW[h!7[/B45.10,>g+Z<,"_;JjPB#4&rMZQ$!adnFKr)hrPfahI0rR&652G(\>W0)opT"Z`K7Z[H+l0PN&Jh-tY(P2#pqnQn,C5Hp]elZMs757%*fOr`Gjr/?5ZB:7=5=pgSgN'+-04J87hDOFVXjlUiI;J#]#1:tBVm`Ffr=f@I*-aOb.\]=,Z#^>ETpV147)KtT%E[o?]/P;TM%;+EiiO;b+I0A#VS@se=W&TTh3p"i+:jmr+STK"2g$Vh1Z-L_es:.qemI[W'Ygn*k]#!GknE(H8'CE&e(3>,9]@-Nj4qftl8.nI;*E+`*_:F%K`hU#I"KJ;F&:pte-1rV9OABaQ=DL(1h-f=SSl[cV*^I?imfqLP-GLL98U@WOclA5@XI)s^IQ,o`GXD6DbK%Qi/e&gQYUsV\]>:N'PX`5(XQClcM60UtcRVL'F]Q6ReX3J>Vn,0ujJ"$:gR,['j=Na'/oL+/ml&NfHM`kjDT?Z"Nk,I3HJRWC&^Y4UM<2bDNZG..^hS=Re?'4-.c*?(N5*Z-IQh[c:pCMk:HuS>-p2dIh^PB$]&3HsoC)XhLXB7$V5#b>VpnX][uQ7ABp?CIf$IL:Ik!Y-2B3cm>K+m0_/Iq?Y*JfN8,/j_F)E\4>5XoB.KgVF<6gXnld:J?sDAKk2B/I-@L*0$t)6XQVSO(g=k]2eHTj.a`A#,Q*Yb=K#rH-l8,?Sg,TaZ&T!^F@EmdYR)[p;l5!aCHL2;c/ImE43'81aF\Et@VRR,5)IcY?#81/Oeh'IDp!r%P/=D$fkj"[[^l%FmcV58-]C!^#$uAOqS7oGCCb1Fh>##4djaM(-:,(/cP[h,\6Cs.KCUk9u*Js/7B7nJ+E8*qN5f;,sjF=C?G%_-0$"-b*BF!!">5Z8)#^Kmj")O%nW%G8U1/AJ10L0[1gHA^FCm5S/a#"B1'0g]DS\Su'NA[$I;KT#fCG@N.Ca&0gfmm+/J]8]mn:+22J7&HiI<^Gi:`li.>Y]n(?mF>2jp&gM:U)D5>_D-8Z!]Z=PH.un[9TB:.L)BC-hV;VN)m\`lREiiX;Rbge2UQkZZ8Jr;"Jbkdb[f?/aanbQn@@pqN_IrjZ\_a$4=`@is@U.%PYN7?f1^ufR+X3mcNhe'Z?-6hT_20.MNVCh&a.&O3Fs:lX9GLJK43XR+Tb.UL;Tk>('9N/aqQeZr3%Q^-4K.d`^$7o\A+ms][8pU$Jmph>67#tWt>*J="]]X*][_`JFoGeI%PGb.?fN9=\-ds0_=duC5Ko]A+=6k>?27J-F9W-Css@o%1V3CZGiO^hNN,!"dS_ieM>oJJX`7fSZ^D=gC[,Y((a6[/0.3Q+F;Q8:i!EB.Ms^R$`LoS#:-7K8`2UI@D9&mr#J.6C"CS!0d0_)^+:VjqgKFOW-^]Ge:!u!q20\h,XNeXa@gsOZ)f,EAl*r&G5EAElYl2)K#^;@\Og#D-@L9)t/";aFEms7#UL>!^(p]7_5R&E;]bgm8M(Wc[3h$_&.3q@HYYp.u2!o!DEi(nP)m&pA:]3rY$:2W#CZj,^J&q6k`gk0$[==a5*'CZ&-9mH:G6)KJ<6>YN=2U@8n2(?fo:!gmM4).,MCm\pTC(=%9rR5^1;G?c0;8uh-:'JgFYQIiP93up#FZ)e#GfsbFa.LNZOSCa5K8.+'93No\:TpGa?R6+V2aDCuHgs`d6Y;k>)6"qpYJP7@^LDi8rQ^J;kl>5,DiV4`YefZB4sdLGo[p$f>PO]>*Gk]uuam95\'(_p#LK-#Qj[Qo=Y1M`WK9]R**P&W4,HEdKj7R[\Xm62>l8!Y@?qj8a]"uP]GBJ[GW*$GdPLg8PC9kF%j?EA$'e'kj$i+l`O_i)QI8?ARVJUa<-`I.^Ic<0YPW2=sJJAKnm,[hH.>%8e;B6Q6`MXi<>*^(YL;iZ"C&/oPbtXeTR+TGTC;ce_[!3Ylq/)kEZ3Q^Q6>ghX5'oNC5U(P`:mGG4h3gYpdY-[$)TUA?>UoYT`SFJ3&j3I0J@`a/EYO)h'kbe.u-iB1_bJ6%B0qQ#!%oA9EOLeW\O#C^db`%CMA#DI`M(gf=LES]``tq;pD(9>t7N90]&PGYn(=`Pt-TcR:f!TAM)ks16bZ,kCF&\qb]Feo,-sPhFSDVs=,&?U9-i9D3S1pUA274rqlY']ZrM[W,&m4BO_hb?\V0e\e7jcm$O%ask0\@f"%'a4Nn@R13>rBMPO^B+T[U_fpYUBN!+t8t2BaGF0@8Wq+?_YMP`P,CB*n/Ch$uAL_X$sU7eUMtn![<`gb(tK^2o4dl@O:#L70UFM1g:e$>.[:,[r;d'a0W@4Fg+^g_R5)I0OKS.A-oKg@l*0YN7KR,dZpXKYW8loNRS(hNi+$r@:6eF=n5MsVK63C7]`Q)B+W7U5V#aIk?"n@r4"j"K0@-)o/0W3IQDCN#HI10AsWO"LJ!16R(eCW/O&3X;`[rs%(B($5Yhm'ZEnLlP]%iIdjY^05o#arl;"7J)[CU7+BfMZNU'KHISXGQ0#@"g:$GkB.%UMVT9U@S5D1Ka94.`GTD!^H.MAJX&FD"Y8JDKC_5.(r`]iY'r>;I/g!lR_^T^&L@8hacR7[tmWW\m;L\;HHpf_&(5da)%c_T,;;UoJKCp?[L/O\o&fBrm>n<37^Z,^8Z)o]jt'S4kSVNSRZ!5K0k3ET9\+c,P'8cE+OiH.35_DtEAJ[ocG\Gu:4-kJ]Z8D_qdqpI-lhO!C)'I(7Roi6r<5$pK*em,4'I9bG)Vd6-BG(/5RY\C$8o5nHa0*\>^oTeR9F+>>m[hrTM(I:,f4d4aVbj_\SSA'o_eHl$('cAU)pk3NskDpGZ9)s;#W4`o!'d;.q+*^+ca!R\MlZ/@3_eeI'GORrgrJ-AO^$S5i*J7-2,7Kj0p0JllsL$q;_/*mjK@pu.:C(%Y-eQpf_X9-;R+gDk2%r9UJ6R2lbTbOKQ"=LO"F`pu<`3A(Eh^uK/QHp4\_Xr5k5CWL!rs(Hi1oU~>endstream endobj % 'R11': class PDFOutlines 11 0 obj << /Count 0 /Type /Outlines >> endobj xref 0 12 0000000000 65535 f 0000000113 00000 n 0000000245 00000 n 0000000410 00000 n 0000000579 00000 n 0000000754 00000 n 0000000931 00000 n 0000001209 00000 n 0000001344 00000 n 0000001618 00000 n 0000001724 00000 n 0000016255 00000 n trailer << /ID % ReportLab generated PDF document -- digest (http://www.reportlab.com) [(\326\1775\315\217\230\177\302Jjs\011\312\356\272\204) (\326\1775\315\217\230\177\302Jjs\011\312\356\272\204)] /Info 8 0 R /Root 7 0 R /Size 12 >> startxref 16307 %%EOF biopython-1.63/Doc/images/phylo-apaf-zoom.png0000644000175000017500000006074112250104543020562 0ustar tratra00000000000000PNG  IHDRFzusRGBbKGD pHYsaa?itIME7 V' IDATxy| S$EB -.BhJKQGiԑPG뾣#)B&Cw~V|< =f?;;33DQADNAA|}}m6ٱAM@T> LZ bQnD z"2h4l"='"=1艈AOD`<1Hr=v{"=1艈AODen2L\BA(D z"2 ++ s~w߿ꉌ;Ϲʟ8ԬYSG9=u BwSSS6 \.]ղQDd4_|W_Ep/ēCDĊDTp=Qг'b+z"bQs=X Y1Ȉ'bcEOĠ'"VDĠ'"VDĠ'"VDĠ'"VDĠ'"VDĠ'"]ΊAODFNP@dBק'"=J^El4hP*XbHD z"*#V\J*hٲ% T*9|OĠ'Fcpss֭[qioP*طoߏsA=9"#Al߾|6m={zR+J,\~~~HNNGDF}'2j8rL4|x뭷 uo߾^>DĠ'"1l0TP=5kSSS/.EQfϞ ???=^w["!!cƌ#G` 8 iбcG$$$̌Ldx0QA@TTѥKΝ;R?/96l]vld"=*>|v  ܺٳ~k^"Ap3Arr2>֑ػw/f͚DrGĠ'WQŋI&Ɯ9s`ggWjA u'''3Zz1艨pt,]9sĤTƎ5kb„ D! ~5jcpAl߾k;ev4v؁0pxDT ߿ &H!o|qU(Y&>4o޼L-?J+z"e˖I&Xv-n݊G(]QabbyZ!OĊ8]ݿwR[QF}}iҥ /'bEOTvC^El߾] {ٳ#vލSN?oXMxcѢEXbRRRal* :|0z{qe!bgo֭[3sLL<\{q5p@ܹs>=ѓ'ԩڷo_(e˖ V^lڴCD z"êHuZjСCѻoŊѯ_?Zm޼AAAd1^*D 2駟1cpI[+WfўkFPPڴiÎ>z*6Z-fϞ{2|}}yfX[[JiӦׯƍ'bOOODze#))ѣѡCҳ޽{Ƒ#GRvDM@)Aʕ+1n8dddyF!44nnnÿ#%vvvZFvv6ِm6|7HOOz"=z C(")) !!!puuR,T9>\FΧQENNN8q"|||̈AOFu>m۶˗fJ)((BЛҖ^OرcR0a„B;"*]< zׅ@FFߏѣGCTbɒ%/64Jʕ+pvvfh@vލjժaС[.ϯ'bEO\ 7n`hܸ1mۆ#>>ҵgϢv e2~tj IJJo:u׮]ï*]VWHDDDf͚ z n` Z0Eq=,Z=R!/_ƾ};֜^U6/ĉQvm,_7Y@iWW^? \/N:ܻwu;G$cbb+VFعs'ڷo_z{DrT^UrעE -ZFA1j(= 9A+W0rH\xcƌÇR&Jy+Wp 45 ,--qi ]DJ-uq)h޼9ڷoT|R6Zt -'TJO?E^^?7"=JUj1bW_UڥKʐaaaz|8222HD zzUUӧ憀oW^Œ%KФI^?)++ UTX^P $$DXL0U=J3̟r655k֬ c"==C \.7KӖuVһ}شi bӋl`܈ \15kիW#""Ç{nX͗^E 0}ȑ#ϪAOOMM֭[agg#..G#M6A0110rhܼyX YfZ=%%'N4D z*i ۷o#((xw#FG_>.^~ 5j0GDDuTRaƍzbܹl ]5k --FQ.aaaHKKC= (q]Ύ+F5kZoSNExx8Gk=/l!_O-CY~|oݺ>ǏÇ}̰a GGG(2^Kj׮]5jn޼ot`srrЦMDFFJӰ`vE/j5:t5j@w-&MAPF >׼yPJ zZ*}>| @R...(hԨ\\\APjUnݺ{.*UHb S8#88PTWqĉ2S[n^:SdרQAAAHOOҥKB<ܹsH*{ \Ro|2~W^-onnn9s&ڴi#gݔFzU7mk֬|E=8D/+r9ڵkW󑒒Z + #P( ! DQRVL&nh4h4055VE~?`ذaY&j%faa͛PZ-Z-DQ,]VÇz?ҿBff&rss N:?>x mz/ʅ 0j(~ˍE?o>\zUZyKk\r(b߾}R ˥0/((@~~>󑑑[hj$&&bݺuP* 3f <:2[+eff"''999Evv6,ߟ777yyy@.KݿO_.CT~SSSXZZȑ#HJJ#0j(UVz_^6@ӦM-72ruE~~>1l0ٳ CT\'&ǎC֭ Zt'>VZcǎ]b޽޽;f̘ǿVR½{ x򽙘RJT*VXRJxhZjaFǎ_Ce иqcCuK*Uĉq!A""":t0#u?B pwwgzQMDEEaq(⫯Bƍѿ\ 6EGDD@@P@@բYfsݻZ ԬY% Tdeezmy&j5d2t04Vqewe888H3EZL$$$ ;; V>q xyyqm~{ѥK6hРO={9g}Ǐl, sg|7tvOܹsv1j~ر8s ?ujժXr% U0k,ǸqFիqԩG=6n$''sZT#kJS7 زe φ#z]A퍅 :ƆF SSN2[1RRR`iiɆ(㕼 裏aTX*TR+VСCِD}JxDtW[@~[0qD;wNl$ۇ(4joFjؘTQf mǍ?!_3g!_+'?>m&M] 6qIJg 6AHl޼MCe3+">Sl۶MJeI^E̘1uŵkP~}+z*?0vXHN:6H Ai₮]/ЫW/6*{ܹsСnݺkkkV(EJ۷oG0eٳgѢE և:u`ԨQOذĠ'1F&M`̘1'VZ믿FNXF:t@xxt+WP~}6Pq9kprr*u\E$''^z8st#"VdPUΦMm2i#:666=~G-++ VZU;88 88llbГmsrr0x`,Z&&& b"''G֖Su\,ZZB߾}K3{aaa<+իW]vx7 Oq5uAOGGGc޼ypKL_ݻ7XѓaPXp!.]xΠxeC۶m1sLiȾGatṹQF2e #V7 `ܹhذ!o_{ڵ(e`oЩS'|G/}@wT#F = 55'OFTTd26mZ D>}111hР<:/d JUYjP*hذ!uHNNFÆ "իpsskTUVhٲt߬,,X2 * ݻwGŊ֬Y)1vXq}ڵkCTT_:޶m[@@"=2/_FӦMqΝ2"_5lقJ* ׯhZڵ J2 _=uI&ҥ |}}> :uʕ+q-T^]ojՐ3gU+V#[oa۶mP( h%%%I& AAAMApaXZZ"""^^^زetʞZF^ٰ1QT9s&ZB^YYYPTtXٓQhZQՊ[g͚Uߋ֭[޽{{aÆ^^^|ΦM7n~?q"fff.\H?ÇG%;VZ}E'''1))IZλw{=bTT(xyQ&YYYO}u?۵kg03c q᯦9F IDAT,ɨ`Vb޽B׮]t[z5KdXlp]_^^^ѣGsN]l L&C푚#GH4_~={лwoTPAcbb$<|+s5j*V yиqc<ݎvKy_Zİ0{7nGjEB!ƖhhӦMݦT*ſK#FSNEQ[j%\REQܰa@T( L& إK"Ĉbll> O8!ZZZ7oVϕ^ahh(ԩ^zM5x ++ xT͘1u,޽{Xt) hV1f|Wc̘1?HII{p1=zoiEk1gOOO~߿Za=z4`jjjw͚5ѹsg{=Z.FUIYFAhsJTJ|"QQP͚5ϟ?/(fffj/\׆mڴD "q144TLJJkժ111BH= ݻws%~ƺ=~xOTn ϣA?kF_IP'>cimGĉE||<zm6,ZgKFCq>==#FܹsP(FX|E=Jah0tP۷KJ9 @~~>vx_188111 cG߻wOj}fffرc6l TW^EZZN<Ǐc˖-en>|07wkz!""+WfEr### ""^E_~X".]ÇXp!(޽{cӦM 6DddtM O ;Tqf ..~- Çc֭z裏 {1bر4oQF<& 9 US~~>xbՋ21d_]ƍl 2  /"nnnٕ!GW^GLN?K󻳏Eeݎ;믿ݶ|ryh׮==ѩS'šRJvZA@nn.po>>>8vL$"ܹOOOܼy+V @荅FA~0|˝zUT?]w[q}^shGaBx4GϳlP8;;cJG z*ٷoJ% ?* @uօ ذanB@@u6mBZf:u*<==!ɰzju׬Yx4:t{|@@ ֯_Le߿?A+W 0w\\v w6L6 ?JV/V^ KKK(J)n߾ qqqD6m)}wQNpe\h"333xxx=:u띒fnn.-B(v[E(`ؓEm^#77WݺuxR:K,AFF .`7nV^={sXhS֭Zƴi "7o???;K,(HOOڵkZ}􁥥aE͚5?mۦיxfϞ-_PPΝ;#==[,,^~) cǎ3f ~~~8ydӂBCC0TV *UƍQPP<)Ν;CXf 6mgժUk.)DQĜ9spa_~AAA42͛7Ezر>>>߸q#jUVŁ΀CUˣGFzz;#Hdp-*yzG& y$!Ds=}v޽ݻw:,&&&ؽ{7:v6$1;z(:uWDFFӓCݻ6m4*a@% ȑ#>>>8uoٲ%N:%׳Ƞdgg#""BtEos QG8q,2M}C|g{(jqA(J̛7 c1m4^zĉQreܹݺuáCPNDFF GFll,zbҤI]"Jorss#|2,Y @K( 1`St-[L4nܸCjժUCzP~}K%P~5DQĀob޽ر#4i)S &&ժU&T*bXreEDqrrn={6/^DVV:uVZP*Xl~g 8ΝCll,v܉΅bEy4mapq㏈ݻ`С\s Tvлwoj1'O}йsg_ 077 prrmkL 6UVѣv 777;v (\2Ѷm[,]TI ´iBբB 8{,vڅ-[bʔ)Xb>@"2<6lЛ:..ӧO/4 ^r7W>Ss ="ƬZJ:ݺuȑ#QJ8::+ytEy`Oy>77 4@˖-'''\~>BJ*]6jժZjvO*U'A*I1i4iy 8V+rd>FA^KZ-j5J%A@AAt=5t#"j| H갘^̚5 /ƩSf.](0559Fك^zĉL&Fŋ L+B&hݺ5~wq'ND/.dLLL\ۤ'Kвw۷oΝ;up-#,, xA@J[[[XYYÇؾ};lllPbEXYYroFammjժ prr~:u*DTP*Tޞ F 4 ~G 2-Z@&Im?@.cxo>tؑ!(O"&55ވ})TG~~>rss 'OF>}wݻHIIF *W[n=uLMMaffSSSppp@ZqFI#HJJ۴iiӦe˖¼yWk]vMz9xyy1YZ&&&PA,iDa](֨Q ,O?Tq9`eeK>ut']rٳ'̙< . ?5j ӧOǦM`bb°rM@DrbŊ7eӅhZWqjժhٲ%<<>;vNG8tODfkkkSRRЫW/ܹ3ZhyaΝoq ௿ȑ#Q!ɤ#u̙sb߾}P*̄(Eƍq dgg-ÓL]vEhh(ƌ+++ ??XjZ4/Μ9ݻK.رczxDD/₯*zpyL&WPPP7CB(v"'QzNT**@MܣG!A_vth4P+z"Zj9t/̊\./t*'y<ȟ2L󗂪S(️۰ϪUXA'"*pM*.ˁ"g]DDFRU\VK|uġ{"ȉdʒg8CAODTɋ1艈(p=1艈4AAODdLtĠ'"2b...HKKcCU^=1艈wDDHR!55N%=}JJ DD iii zbQT*QPP'=2 ZAO z""d ybs*z>1艈0r9rssy9Wbc !!A z""c z[[[dz1AODdlA@ʕ =1=1艈U*U8tO z""=L=ϥ'=ݻwĠ'"26666DDFTBP 99A z""c$'bJŠ'=1}RRDDDDe.y=1艈T͚5V =QӡVĠ'"26իWǃPPP =1E2 J=1艈B6AODd,,,Ġ'"2Vפ'=Vyyy&=1艈Ġ'"2FgCX+[n!AODdlDQDʕq61艈-A /UK z""c#N8ٳ 0r;'r2 ի:___6 '"2zQAODd,jԨ;ϧ'=QT zb'b9 zb#IN2oz޽ˆ!=1]PE3AODd$߿ B z""cxEjצ'=1VF!=}BBDDɡ{=1艈lbQamm͊DDHXYYAT2AODdP(9tO z""#zNC z""# LJj5rrr0Ġ'"2666:t(,,,舐r6 1艈:QQB Ghh(LLL8Ġ'"*!/͛K.ѣ8x N>%KH!*M 6ѫ c8qGۅUVhҤ Zl)ݗ4"DD$ѩS'DDDC>{쁿?bbbPfM=}6}9rzC(⭷BHH:w>Q;i$9sbȐCмyst |3jѡCԯ_˗/>1艈 ͛w/ {z!<ꞈ%#-[H$`׮]hԨT*ħƒ^B/ZOƟ ~*5 IDAT {E͆CDDٳ'bbb`ccaذa;}mڴٳgږÇ_>.\={"q{"$b׮]~V+Vā[[[ ը(kn݂%Þp=3*yQVobOaÆ2e <==Ő'VDD wށ /_nS!::{L&c+z"1c%K@&L5.Y7oC$<)!zjԩS0111޺u+ׯ333=CDDŅѣG[oիpqq)3y]ԭ[þ=Q!ytGAWZ[nE^̐g EΝ~4o޼LUĺ|70tPxzz"''GP9\9tOD߿ƍc?~|-ȑ#~M zV z"rGw|ЩSr]yyyڵ+4iyq=5jnݺ۷U ~5k İgJ^wQ&N{w4mWþxDTC~˖-غu+`bbbT.a[Z5h֬RSSyi[=۶m+ol.0sL4oYYY\zΡ{"*KSNI&}'xBBB2'"2ΰKIIヒ04iҤ\ c*9s௿g}& /uOD AF0j(t޽\&LMMqy899{ys螈K?j֬ŋˀӽ縸8hԨHq螈E-_зo_XXX`…w_RaŊh޼9艈fO Bʕajj;wHוg;w.6oތÇ\S@艈 6ۇ?yMLLz?~<6l@ڵkFц|ll,t4ٱ {Xr%T**WtbСoϊ0Cƍh֬*USNAR'DEEB HOOرcA:sGOD 6ĕ+WLLLc曬Rڵk#77Wڻ*o*.QEeQhDqk=JDBl=4Q@qZM0H+la ?r99ݹof޼w{ `ddc=QPSSc*BmƐoaԫW/\xzzzryuu5\]]QZZcƠ'"zaVh"\pAl<Ç#**JqEBNN-Z$cb= CDD^ojcϘ1˗/W,;r}6i ֮~0zk5?DppٳqС6omw!%K`Ϟ=;w"((?أ'#LOO/zHI0|9r$222򉉉4i,--aaa & ..NQg֭!%[NJJ1-- vvvAyy9,-- Y3g@$}ę3gB!CQ^^.?zj"%%EtMt*JqDYYu\/;/ݺun*55?ɓ]C̘1>To۶ z_ރ?5֣}aӦM Ett4$Iٳg xzzrߛW,D@@@/q螈!$IBAA/^/j!`ddr(ΝK.)Y[[?033ñc4WWWx{{O>!!!^RRR]7ʯ===1n8|W5 JfCC0vX7D^^ 钓Єشi̙(߻w/>3q&=u:::Dƞavv6pA90Zmmm9s`ܹصkyǏ(Okwk ao/++Cyy9?]o>)!O#{Eqq1 e899apttĜ9sPRR?/_~-KTT|||0j(AGGѰĻヒ={ffftuu[o!88jZqmmm/1c0rHE78v1a޼y`ccw1č^xÇcȐ!w7!Ǐ$IAmm- ///:t* uuurp-}c?..BF~~>ƌekyy9kL2ׯ_)vG^y444x饗G 66f͒+@CCKK.۫$ /_ѣ1|pddd6m1艨9wƣgSNŪUPTT!<<1艨 <`;w.Fԁh;O>x70m4>KD%%%%ѣGѣPU^^+++\?Cdd$ bQ|w1c[ۇ0XYYa՘0a$ =3:W6{gæLO•+W#448r3DDA]|>>>Ol سg֮] WWWDGG˗5:tx{{?^c]ɓ'#-- }0x`ڵKc$.'"v)//rrr~̓1w\c޽7n >OݰGODD@ii){B"55سg<<~x8qgϞӧall{=z>~%$ _u5m@1118w9gggرCq CAODD :7 y{{?qe !!!#Ġ'"_@RR~B߾}7o"66{ݻQXX>P̔Kiz~~8wΝ;T`ٲe|==u,--m '''ڵ oF~~>uVϠ'"!33|f &&&8qQPP,^3艈tz]]g:...ؾ};򠣣={bŊ`ϞAODD?Ellَ@---޽xǠ'""z/vo:i_~رcRRRЯ_?a())җ1艈MPPP_|ۏfgϞ2dVX.gQv>wFRR닱c"33$!66QQQ>DDDBܽ{NNNE(6[ZZ"001b  =<<<j=u]pssҎ-[֭[(++Ý;wׯ_ѣ1zhݻDDԦßчzCMo(!!/F>}pܹVeMTS; ovxB\|.\`oo 8uQ]]#Gbڴi{60tP,YCxx8###H2DEE!''VVV5k!$I?3gZ^3gp=,\"##QXXsssxxx`ҤIPT8p_Z-ҤI0aBFTأ'"6)((MٟzZJ3g>aooooo\r7oF^^BCC]bb"ѧO ,, $ 7oDϞ=q%? pvvÇ޷oF#"&&R 8UUU2e yfwtt1m4L6M#QjB_M[h,+((FFF޽{ͮL J%4裏DAAxEhhb'ODvvBÇTE5kֈ &!Xvo~׮]lj=z""j$ID]] :~57*++Ʋ\7{^!LMM gnv{UUUXr%ݑk*1e111m;;;joyƭDDDqqqݻ7;>#F\Y[o¢T*aʕprrFx 4Xd Ν9s@RN666AϞ=qQ==}/^:Vl4ypp0޽ZZZr9;Xn]YVVw}GϞ=h"XYY)o߾3߿@S*J~ϧ~ $''cҥ2e N> x1N:۷o#//~Ǡ'"Ax }G"I֯_Ǐ044kkk1h cÆ P={:%%EƑDw,ź޽+% ƍr}]]]BOOzzzC?c""j-H >>6mPVqF|8}4PRRc6l>C6m K---ر~ojjX$$$/8#G֭[… 1fyoG˗7 >>矣 'N1;ʗ/66>|(_bCCݰI5xaگZamm1;ĉ"))I\NWWW[\]]H h/+ I`ooyBܼyCE@@b_$I:$Kxbr\r?*=QW_QQQiwns\oAXXңqmۭ[ jkkqMrrrPQQxII n߾-~SN֭[ȁ$>CVVBBB묬͛7L.Ǐbu B"** 'O۷q]]f͚gFJJ $IG0qD#//$ի5ks)zB]Gɓ8䝛z!^CDD\vai\eܾ}.]8vFΝ;5:Ġ'"$IƒPRRAW_{ 8rV^KFNN ++ غu+`gg28;;c۷/o__ߴRC$''G...xJJJPZZ>e˰f~nݺFpEAA֬YSƺqFĠ'"xyظq#OJӧc^m/cʕ9s&yI \\\`hhggf'εgeW^ҥKvxWׯ_o@hkk+|嗘1c޽{u 4sŢEbu|mm-1~xTVV* PT$ 666{F\~+3glmmQ\\,x۶mֆ$IX|yjF>|DXXb}ZZZ9BjE7{g+V ++ 3gT.xwP]] GGGW^Ǩ(={珊AODԱڵ غu+|||0uT`׮]rX7 k׮w~;{nL<wƤ; Q\\[*kiioJ[[HIIA``  ===F#33331dEHNNƆ 4ڵk(//G@@FaÆTq>lܸQ6/QQQXn}]B$=IDAT~S VVVco]\\PUUZkՕ0`fϞC#F+VLLLj#I:"_EcϹꠧ4ca4smn]--oOmmڳٟ1Ş|q螈Ynpw1L@kn]m}UUƥjBtMbozm>?{DDM={@ReoYfa`=QW1̻κ'""bDDDĠ'"""=1艈DDDĠ'"""==[@g|IENDB`biopython-1.63/Doc/images/GD_sigil_labels.png0000644000175000017500000005002612250104543020536 0ustar tratra00000000000000PNG  IHDRXV pHYstIME x IDATxw|TUd2 KtYP( "MPDDt}W]eW`QTtAPz)R&b#uL#Lz#ܹmνss=r "@IF! Q'|ޢ(䢣 J} 8pՋ-3g@BD-f;tЎ;,Yk3&44tذaGݼy]vy{{^zܹ׮]@rW^U s-Sʕ+~J*WRsxXg4ߴiStt^[SO=Ł,vg}ֵkWM6 >… O=T&Mf̘O ܾ}kl6[tt?O{?Xʹ\[ڵk_|EPPƍm2("s9p￯:wˋaq "r]:u/㓓ӢE Mf9.._1cFbb/BCC%44Tִif͚}GZʕ)EQ+Uv}ĉ ,Xl cM8bŊ<۷vڳfZhۭV+?1^0͍7ꫯ~Ǐ7^z8rp8~a֭;s޽{UTUV+뗔Ծ}m۶M0?qD1o=O|uԉ۷oСC)%$cbb.]|GydԨQaaa0Ȋ+&N8w\^r7xի!!!tPb$&&>AAA&iѕ*Uڶms=1+fΜc:nƍ4L999oƔ)S~wk׮>Dl6O6aÆׯoӦͲe۹s簰0~h)^sE%$$ 4bĈv޽trJ3f4߿xO>×.]ի׊+UV\9@Icǎ͛7Oӕ/_>**GF5jԈTmذ!555===55UD֭h⣏>jݺ5qɉ-[̚5k֬Y3g۷?c,Xкu됐 6tܹy4ڵkylz$$$dff;wްa/[n_ݲe.::G;~ԬY"A=o޼/M4QO0`ڵcݣFj޼945kֹsӨQÇnzϞ=&MJII|x|Z֔w9Ν;lȘѣG ;uTttszꫯ~gM6]`A)w||K.u\]vWx:up` "SNMNNnժOu:ܰaC@@ۃSSǼu p9 a~aw{Cه BO ŸPFcV ClBBB(DGv횫PdZd]7doF5.]ApsGAg=e}ZZFx|^Wz}׮]ia[5 (ƻTG%%/Ar\9#u"qd9,Y0++DošsPU#̖l)6]$y|P@@@@@@@Pylv8.b 6t:bewK':JÃNt.ߡⰻ씹.)N€~c 'Aw}UhlX|vIG'IMM[|RI!C̘1!v#111$$LHH(;F:^bŊ+֭[|f_|/kŊ+VzGg͚GGG/x{{= .M&{キjժjȑ111+WNKK3 /A(֮][l uiϞ= (_ٳE$A󲲲Eٳ?ó>sFEFF](Χ`߾}ǎWF~M4))Hp%$$~f9999 `ȑ 4iՋ!9A 0`2epFӏ=*"ZÆ =n͛h"۷_~nݞxRVw4}Q`޼yeDSN< g>իϟ?ԩS#F|}}=인)S[8y M6V^q;?s̛wǎ׭[v… .\w:%fffjC_rE>qD5qĈΝ;שSA-[lΝϟ3f/xM&# 445Bm)Q@@h4z֗)S[ZChݛ6mͰnݺ~I5-ٳgݻwϵK.խ[n8q³JOApppRR{UXhx7toܲe˺uOjժzjK.mР'bzpӦM+4Rp'Nc/2iҤl6{=PކDiZ)R?СÕ+Wԩx|I֭>˗/ϕ#o;ײs{F^>}6Q[VArec/V~nذA-&&}Ujjժj <{f̘qvbX,CMiӦ}lٲkV{ԩӦM={j6kL]믿jnzR{< BuеN:<̮]Բ ҎݗMJJ{c޽{ +ԋ/t_~Q+ə={v6k,W!GGGZ`0aիWՂ۴iӪV_~j#<~zľ#FOժU]A /Ajjj7m4###Ǐ>uիWOOO]|jcǎW]T}eĉ:tH-ؠA +hׅ;yyخ] Bi޼s.ݶiҤIiTP}([{mK.cƌYvmo'HKKS%?iATm6[Wm6|P4hP&?rHJ9o߾y7:t[ _j?=ZV-_yp<䓪Rp¼e?huD5q޽~C=4o<J{ "9r\-?.]Z&Oݴiӧ]P I&OWz#O<5k 6Q駟滭۫//{]b!;wwO=u5o󦷷c=6f̘/\0<nkҥ+W\/E1}|pX'-[v9, 6 Rf|1bӽGhvvj 3"rȑ/j3hVEO>>3*/V[lwzllzZqZi.cƌܾ]e˖]~}u5WVƍM6a„5kvE v{[of?tPu>|{jKt|}}|_mڴ< .T, " /Pwp˗/tΝ;W5y507|om۶̙3/^>GZ Ė-[.ջw3gΜ9s/+&x|ڵ+5V(_B]رcr咒֮]{MF׿vC._6l8v예7n{=}tRRRxx 6{ k׮9rԩSS,"vU4hP~}k׮]v}nzرo/_vō7gŷ||_j߾V_E=?ru1/uK=D-իUON-tmʔ)E%>)F]/1c N믋ȳ>ꞦyjgѣG{%KaDkٲرco!3f ~e˖MJJRmS^-d=zTZ̙3'OLOOWd~>Z LmٲEEZ6m3=rrrϟ=ܶ|\?-aiOvڂUG_%رc-֭[=~z--[֯_9scj:lWnݺ_՚ 63=W-K/eݪuW Zp8|M7u^Rh`0,Z[n"okРAǎ4iҭ[7xgܸqѣ͚53   y饗jԨQ>:#ƷDQE沧~Z}W^]^=Q754iRlY//*UO>]Uݻw̛7oٲey߬jhԾ x믿aÆI&m޼YD.]Omر#&&&SwNa4%V,'phwyi޼ 7X,111111 4m۶t# 23fɱv}Μ9ӠAG}^z ^GWr%]DNT^=tf4ULL{,W #!!A7((H})QF߾}kԨ1u;vpvޞ.]m۶CUV 4N,zڵ|׮]U^=!;bĈr~gʖ-[s=;ߴiC͙3wZZG~N>sADL2dȐiӦY&---''GEl\\\\\_|s}kPH0_7V:z/Gj={9rdƍG_~VV/Q)gϞ޽j\ >|ѣ#&I]&Mt{]{G'7pB9h mx駝N;w#޳gOFO>cǎ+T=N7^cj0>ƕZhܷo_ ne4>tPߧ}׮]S3nܸ.]䪿6idfĉ7o>rO?BQ###GES1E$==+] IDAT<>-ZF!֭[N'OZ֋/^zUDj,YL#G/3ydK.5@L V4f+xZdҥJ*7 ByU1A,YsNP’%K5sg]tAAAjеá)EVV@aÆѣvo~=ٳs@pӤI5ʄ =zޤ'O~gUB~Fөj~'_۶mS]ԫWNl/[LUD5aÆj˗ZJ5DEE?f̘o 'CnFy9<%ߎ RPDx|Stfddw/HVVּy Ih Zg.dΏ?xܸqcƌcܹ77n9ٽk'imj=ƍ˻*7lؠZDΟ? o>/R.>UTgm۶&5jhAXvm}۶mqx ׏Bh j銎V7nC``ZC^Z%gцl6mRo{w)X;v@b;w}׵B駟pӦM}ڿ;3uԟ~I;Q9駟N:UA&/m`m曩SN:.ҰaCVիA"rYf;OTT>{o֭ íٳgu_СCm۶vϽ:p@_!AM6ii͛ ׿\㨝?^U׬Y=T VR|iժUjAAA+WԦ6|g}k!!!RZZJ uӆvs:+VpqQaÆ?{]|YUz-Z8qK)))&L*͗.]R>ƍ~iݺu֧W^a/0֨Yߪĸno (Fc<Aמx\K=3L^&G7? ݢY {L=jD^kqsR3xyy p!5k4Ƞ7HLJ;>w}uڡPx7tQ_t!)rsuO:먗TT\\_vYmm۶:S_o~]6ݙTBCC]nuv`ן5tA7QkNmSNj3?S|fߛ/Qoz+vUA0߰]wZ*|bo7jur 6]}qiެY3m5ҪUW!5E De˖>UWQ~/om{Knˈ^72ki8p 6∊wNDsݰaRh;P&r"";18,m7\\r~~s˱?=rUPZKǭg1d&d:vڸ q>"yfu U3f8 Ւcǎmutv99"׽ř65Ӛ-"99c֎ Q z|F$**Jr%"M/onk?/O"[gmvx}]̲w޽{igjKUz]qd)bTOKX|C*﮸{릭oy_2ef/wסC+Vc=+{FFFZӧ }GL9oQ*CDj' "gDhfʋi(RN$m*ߘ?)< rXD ԋjHޅHqmT"DqK}D8DޘH`zd]"Z@v"Dt"d\INڤVZƜ'O/GJ'znIpN14Iqw"{EzQy"q".H#HK 7R5Z"-D "3"olH;]$N!bi,bȳrCЍyx%'r^$JDtREH-L^S(/F R=ω*rJ~KgE"uD\7N\;s㽜qQ>b_?Kyn?=xMÆ kժ;@ +:+WcE7mﴱ+Ɗ j״Xo\nQ$:hr݆] !bɳ]E_D'bqѻ׍hkw[wcA\of+z rn'OA]"^"y.".kKЎKoBr~Dna1us܊]cM"<b~$Q5؍ e19EE~T XF?b.}vX\ZVXhAae;"v[$u#Z۷pov8DLC~o\wO[u>( :E,.-.MZ^ʋ2AXlZE@Dl".C˭M?bZz{ P㹊V+{xGs =8vvP4z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBBBBBBJ2_twu|}GćcQ b3܃KDG{N( x|z2uT??[mD ␄# 32f$f%#paf9r/4x`ooBR*Ta5B5dDQH35BOl<0|7ȒWaҮf߃MޛrBzzz*UNgVVG K3” 'aқIeue"G?{+&[f=b;7,rRSSi#}I=2^+v׃Б;Q̒]|v@FBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAA@EF ^"?Oq ](R:]PA S'bQ zQDZ:q7CA9cӂl6; :l"zq`SY,U /)[$mzsj"Y] "~"E~q,)./Up.b"y(@$[d~Dg.7[EfYmz}"5D,nowƽdHHS"Vݻ].WPPk/ށvװZjbJ:du@dv= bԽ{ݻhBlg]KG!22 ׳?7dumٶm>GLj[&v͖i+h=5#jf%g^#^G`Pk߾6}٩dddDDDW3(g.'Aϯ7<.]ɓjj|A!Cܗ0`ޢE l҉'}Yj5^vvYOa?\4z{w^ZbEVԫ=zw.\ s,ZvZjW_j/Y]vնm믿.J9j/ "--z"e˖3?~OD|}}īW֫WODN:w)޴iSuߴiSу0;;I&js+W̻˗CBBDh4FEEaժUj=`ݻVk6mϟo+WNׯ_ҰaJX@i_;wNU:vwu_Drrr?~lٲVZt 1MV?~llիW^ygX+""6>jFFj={ ~-%%%ͭ\r׮]"ҹsA!((7쓁 P]vڵkN=: /_w-Z5WZs)o]<=wŋst_UDVگ_zHD.]4}|WuQwyͩ"_ZH _׮]S111.ڵkVVm{7١CߺuKƍSVV:u? 5}ѣG>8JzWL͛2gttkDp_ 4hРG8p`Μ9ɪq:O>E]-[2o?.\PҬY *$$$\xq/iwZ?ߪjfԨQӧOOJJr:cƌY~믿u#ٳ~8fثWԩh"--l6[TT뫵%۷/ߙUq,WEM6YNi+We~\3WԥKV5jTF)"UTIHHpouV2P\m۶aÆ"}'O4[llltt>겗W۶m|PUJNN;ɓ'<fr7O2eD$33sĉyEQG\\\BB6F=>}z֭m.11qݕ/_&M4jԨĜ4(uBCCUhW.{IOOCj_~G̙3AnZjnݺBZUTw*v>ةp}Ԕsi#"͛7W.]ںuk~t__߲eˊHNNO@D:S Tp1b};vl!MSN]bMP|Zbaҥ>>>ڝ\c*fYtۿW׬Yc2˯s .Ԫky׼i&5wxxN;~xԔ)S}F(բB )))yܽ{-44499%YP󯻱cQ@iѭ[7unܸܹs8U_G__\>|XoQkwz5Tؼy͛_x___5g 4Z^z3gf͟?_m`0,\PMX,?_맟~RT{l65kN:ŋ̞ܹz n@1 C:tPMAEkoo7h=ɤݶm[F#Fh\+Z8TF6 ,pj z &zUBUڜ{lt\-Zj Bf[f;}fϞ)Y8dȐ|tk֬Y_]p_jܹ4={:tHY Boo!CfUD-ӲW^FqsװaC.L4=Xr弯;V5RN)rN>n֨Qt Թ\.ߥ~ 6hӦyş=^fiӦ'?w\mJj^xVZ?~"""ƍ~h)66Viܸq_T;vZk|###sÇ^2[kѣj<6ȼ3:u*66Vi6zMgΜ]U6LF5c F*'Ap8k֬)_|FFF֭kGIr)ɶRJ!c._>4%Jp ˗NZ2AHOO駟{՘ DF.ONd,c(-:uT|ƍS %U6m^y/txG yĉ!JK.M4f+Wj~Gн~, ìY̙zl۶( l6rݺuKJJ)##cƍ5|rLLLPL:uԨQ.\XzHjՊ{(nAjjE~.]P#;ñrʍ7hѢ_~R P#~又x嗉@5sLR# 3LK.ݿl!rX,SRR)x.d~~~KII w: :B |A&M.^H D tС3g>>%##c&Ir%ӵkkԨ/Sf9$$I Q2>}?\Fc6m֯_?eʔx {5mڴWPeff;v,i!'iii:e˖e+TN Dd2fϞu֪U:;Xr ><q |||ڶmp8TB@Zm۶u͞=ܹsB@kHHȇ~qFJ}}}v;OOk-[vޝ.pw…n:99aÆ<q rʍ9ߟy= ,Z^z B(ށ^N/D>|$ ,ⴴ&>>>ݚNS4p8)-@ZZݮ p UX=pƉ'Q/}';ѯ]tD3*bA iߦ;V2L7‚t7xCO { ȿ| 6F1R$Grudnrg6R_iif1iiaf1;A{3r2Pj!                                                   h^p8e8ӉN;SXtá(&/.+Gr\ 5qDr,$I_8?\(g9c= 9r9l_u~3|ރ*RṈ̚ƚ6rMYŚ]#QW'mտglَ- ϖx%1B# nEM81**B {nݺ5jJRjձcǖ+WEޔ B`r8nex6Ñ@uJ,_˔nexvupNz(J^,YUJD"ZIII}9B!`0DDD\ڵk׬YA]¼V'Q}7IIIBf ֭[ ( JŲp_ѣG)Jb4۷o=BJ//;8q`0ԩSAtX,k֬駟G P ezOl6-99Yח/_Ai@@@@@@@@@@@@@@@@@@@Py=;W>y6UVΝ=ҦMRO̶m:Ψ໷rT ."Sl xcb+Vk>=DdC"E<\bޘQyȑÇ;^%k4#Y%㍙Lb+:]>=v [$CȮJC)q:OcHK+"'4ET+2BD'2[ !(MDDDn08EDXD PjsE&""E([d/"ENlMaɳJ$M$\Cqi#V,Dq,+>8$7k-iSJfdcŠelTFaX,JLE?*R&YUIL-lY]K!mun6KG+I&w"yj[WWUu>_MF!1Vj}:0DukpBR[zj;]{?Z_ZG;>OuY}Ssr=S`WzZE@G?:S7!RWԙ:^-B8z~S'뉺"̷6֙.1L}^y_߭Ws4 :YߪձepwN˞,B8kg49=\ՓuE@Gl=Tߨ]u._4 x5u,ayz>R-|͵~~&,B8b&jSu·9D{]R:nX|..ᚩaG\ubQ2V<@^ߕtWTM+AG,_CUP1 \׾:UֽuC]@Gɇ>8Qm[[o35Vu`:Z[#`-h/TuYXӮz1zns?!d\zsႚPM׷jcM׬]ù{'6ո#'‘w>Yobz=VGojo B8>f^߶znݵ"\%t_]Q֥E@aP~P7tqD! [z=U?-BrK6֯=Bg`}  K}GE@aPVK_ueMטE@aPn{mu6y}5Xn% DBBBBBBBBBBBBBBBBBBBBB[nA?IY֮JcXu}ᇧ3xYŠtX-rW}ڲ ,իW_{V](v}GݰaXю9r.ə|pAOpmaEڻ/_;zycǏ{X*'Ncw!^' MBBBBBBBBBBBBBBBBBBBBBBBBBBBBXtL<]՛j-`hg꛵]1,4F/oԥuS}N[De}OUj Gp[Y-"򝚪[uZDz;B!j[f!w-+,5Qs8 Ji]i"Nr{mcuUB04kU{E`P^jU]Q/׌E`Pnסz~K-OX>YY7պz9zBhO}Og̱8\X>G`9`h,t.";BzOY7 !꺲^rC uzP;P/Css=5U-zqiTzTm ,O,@NW_}'O eYHv@s$@ HJJ'KJuttmlF1qD+XCFei礣gXQV~} www accc|y=Pqԩ38Kt>*䷭v~m*d*JrϞ=s5s+[cS ްa,\QP%q9s-_/zMϛ;uCӍ7ޘ5/x}Rj| 69:wkkk  d뾗 m >cCO쯿Z30-#c8t3v=vcW~¼{uZ"5{>=F޸& [0M{y~+#P:6c֯aߝꗞWUQ^'hKeY݀~W/4ij"goAQQk^_mu"zyiMT*@q/h*h)" >ux&o2̸c/ d6n2fjߡ}j@9rc[?F'K SNr԰Eiv8}#Ӈ?jjEb_lwi< FUJLC B&N=fw͠jk#΄|P>7ڢh?މ'|4Ə=z*磷44Ls/#Qރ*QC(((70j+R>qpZrRhvqnn.ʈdo3g$~ͿXۻM{{ܹs!@[WUV<~ߺwu%dfTkiiH661ta^7͈wdddmahh0LyicBϷqtNBQcii2"ۤLCS-G6;)5t+PC68/Vɢo?3wn]vu"ظ(-Gd405h)C;X>ԁ塵Ùsޛ0}AG7yQosnn.ғ{\^w⩁'6^zWmo|f{Ϧb+<;( m5v̘km₨kV=r[6x#FmɪU?][SƧ(/>{) {GMw_p"R43dKu8s!'OC ڎeU)V~W(?6ֿ{IgN  ?6>쭱C}}}Q@'R]][`c3GVVRي#PV7fP_l{%3_1!AFM'fYxٟ?X,\Am?t@o>3YJ:+o B͛q002s7,+ɼ[3zK=z@11nD}3˾myy[W\>5񇎎r|˖-UUU/Ҋtuummm{-6{G|)|ƍ '{ỳᓜ=zZ*9Y17#N'Dߔ׭ D4x`333Tmg(///88;wb x|SDZD4s&a_vP([lh<}:& ٟYg̒% xE7؏9y󬬬P1OdTʕ(Q*.]jdhɒ_˨ k燚 _> &k-_<ss7|S D"kkk{{{ԤCimBq5 Uh#G¡CVVV hw PFC: ڮ"::zbށ0iŴf A1O ""B"hkk 1@$23ˋ{Euu֭[,X:zc:<""kk7֬A=nnnu${g|9:Dc޸qcРA(32ŋi*T1^x]Px8]JټgY @wy}Ҁ7~Ϗa7Pa!*WJJJMMJdOO?6oF%p Ax<C֮;);(##@s=͜I֡?~|>@sͪU_J@r޽<Ah} *˅ /P $;7}9Cn]gddHvեKi T/G$Hv.[yT())o߾(ijZ ݻ:Jd羹sBCQ ಲHnA kiJR*Q K.y{{kjjH׈ϧ{Q JT:p@ޝΣiQ ࠈ޽Kk*\S]]}֭AHhzF%S^쬯R ٻAW/ںdׯ_ǖxHnmF~1JdᄐW/P \~e4ؑ@ѶmJ@iiiinnR ٻ;GG>֯G%kS(h#١'޽J@v-CCCkkkDD4>^J@WT*/];t)?NѨtIRTSS@}d ZJ@òlxxQv#]LXX@R<#999aaa&&&ÇE ԤU)t=/^D3rС>}ع'(21'Zt)*˭?YZY:z̕+Wf~NQP {Rt|~IB{TW=n¤1Gi읗HDkҊIJ(t .\c@ɾ};䝗NmD5y֢=aI鹥~C'٫bccQgj i>T:Ԫ*///T;nwY5Z[8J*1ۇ~С qF&| pܸqfPX :TβG޽Q4{Λ%2M;x\^t-yLWWW={;x|C)Nۖ^zn;;;%:܀4g6*uPSSx Èb'|P(BP(|Hb10jjj:log44=TUQVVRda¤INJl0Bgff0Q~ѧZe5{}v?ak;f̠H )S %eٔT/hwGOOOWWWLT*ry}}}}}}]]BS*jkkYU_&Q; TxX.H:ۨvԨVݣ:[=f, cbb]]?zv {G-\%3G쿚#VSov@qAaΕ/Hv'>qױUS/eYYWߨ޸yjڵ\<_2hbm wVU5lCIp[Oᶽ=鑖V 7HO**ĤY""(",!__ GAbllT*MOO1<Q" :}Uz~'z3l{BF&->t<藉3I|L-.:0|fdCpfmkWFfZ:z)q}d!y &diii!v,m-6fWu[[tuQVa*/o0wrB:S(R4!!ٰ,--%&ֺW8q}MOOxƮcfE\M-?t=~骭 GE^sR|w&!"Ymo[dnji_g&=mml%%Z?F+*&y4M 4Q,-?I&')$BC项DDI˗wCĻ)JܹSSSc$!*F@6~cQƋ U_T>B=WkNP$u9,7+ʮ1Ue qm{muL5}gW_om^/2NSjIsoJ7kVՑZk۴)pZ,RWGgRPRQQkGzz6{zUKD"6e^gjftqm]@?K/M~ĘW̞[:D߹[/LM31똘Y d"k=Ԙ#4z4tӁ%5kͭ퍗Lw'oݺc|D"qvv3\4l+WŽ xgęPG磞:o?hU!gC'M,*.k MZ=MtRYD(#iHڶΟ :xrs[82>6l ɩ!}|Pٳuuu->dkkC/ܛsf-YjY}5prwTU񪣁aMQ((5.> ÔREnzaƆFŋi(ק{>'Y[Cgeee>>UUUC7nj3tB&&&=v.Vvέ|p|c'5lfO>׮_*/50,/ey 'HOXN `JI!"'gg J2i2nh²D"222BYsν6#&|w%Ç7o5MϞ]c^蝈 sԢ|ϗ駫nݢ7#"}BB((JJh$ Cљ%UWWDGGzxxxyyڢ,v?gGYgMqxB?`ɒ["|ݘ(Em'B~c;1pE4tФIOÇӓ/F}}}bbT*{D"qqqhE),,777**Ν;SWW@3&L@>VH$( d G+22,9YScccnt$JD˗YpFFFi) _961d֢ d$;@'tRDA&rdd[__SdĹ͏1Mա d,Hv.d.Hv@tnX];ױ 8竩1 a<^m6vXfHvN<&k HvNHv@pL&C3kcD"&k0tG$;l HvASB!HvNX]\9dX"k5 ucu@p V$;au@p V$;`u@p5|>WP5HvND( 8a.Hv%;HvNX\73k=cB!kdZa#IDATE$;`u@pV$;`u@pjL&C)HvJ,\)|>E$;BB:S 8E d,0HvB?; 8 s'=dlr HvNHv@p z$;NzN{8LـngPECo p)JݎPDHvn%7ˆըSmvHvN%d\cc)b1%PDHv@p@HHvN16"Hv@p #"D?; 8FFDj$;ǚ",Hv%dF("l HvNBdWPdG?; " Kzc6;$;HvncG@p #d, HvBdz$;׈D,zc%c"[06܂QdHvaD"BSDbbYRԣdL!]dG@pՎ5"zc-B$; 8F|10È$;`!_@p 6$;רa[%@p |5B,HvBd6#JBkTYPe%DJg8&6;@'o:* 81_ Hv$;@#V[2d&mvHvNhrqKv 17\T$; 8@Ԥ7okɎ6; sP1@6; ,&Hv.ZHDB!clrJ#E=j,*)lV2%Mgsk[ [ZLr9cmfelIcfX2V oa D69Ah0.<'7A5Qyɟ46+PfgYxV ceXX?/๒*Ӓ6591Nn3gм'UF^v ElvfciX1V 1Ʉ ;\7,&+S ̊ʛ:ciJ3TUG Cc{Ylv:<a,k[ҖgeC 򼼌MgSXqr9DK,o E36 ?`3ӕ+rMy+[ܒxYشej"ьѓ~'FSX"ɞ˸yRYlV22[Z̘2, :gsﱩ6+16e\+[]jQuihx%cfI5 u=x<^csjUU(ST c]xx nlf*81Nn<RQ26?14f,mU Hv6lF2%MId {`ˌ3qZTYAfa fgʿO5ceXlIS |@ #[R}Cɕ?|,cHg{2ZlU%^mBƁqh+ج 6˰,pxvxajDl}=E5 BE>Čo .2lff?pHvLJ6+]$y9-хqte,a?GvXʘU˰Ylv<+yRָ Hvؒ"6%MIPMftf7{uE?aT-clBULy7MIdS*38teluLU/fY鬬qH%.B#\n_ޟ埕ilhh@|s?˰i a]U*<x"١kyyYCgj+u.>UVtں36fg*GeŌeG =r‚|Balb5ySSSj퉁h'yp-gĨwߢJ:T7^mr֖e,eXB7~ysңg?#3K_tVęW>hѿW\:EaS)lfj?ɕ{Y/j%kH]Us˰vMeXřTTpIzM/;OJKھʒÇZYYEdR,qte]y8zФ{}RuгYlflYi$[VO60&S]]=x&l]e߶9s`x!yQ(، -ѕqtyV_`ֱ~(cٴG$VS<҆!u͇9kvVa3m}Ӓ̄>Hۇy+7/aK __ ǻ?ya>LIhsty_d׳/l߷58 _5 ?<<vQ{_0^K=-=mB?ZΌ3bGw 'Ox򢢒'8{641W*E9QW"vpr jϷ)ӒٔDnI$j$6%MIdfNpr/̂ׯsՕ䄆PHhB~4c3=TĘH?f:`Go4ۑ'G]qٸaC^,f743He<_b6/9Y/2%>({MN2?lvGȫEd?lug߾}QU_?fZv(m]f ii3ǣ5ي'QuKqaR$6[sy3ڞ"ebeǓR |Xo~?dGs{/. 832r֯߰z'MjN~ګK^tM-J¹ڛ䲙ilVwK={?qQw9m+0Y/_>p(tG譇c]V[]/336kCoӜtP}c~\'WRVm1EZ6+=/2QJӒ#gTGLzg`|5ܵ|Ū9ypOdRFfVfiėͬ_︗aF&+ѕsl$bKt*b5U٥Q 8~r}==Mwt׬f㦃ݾN=^""eÎ/?'SD4q梀kˆUk\]g81.#:fg1M= 73Q:jkn߼hX'"a^zc5^x:%=eK[j\KklPP ;Z۰aþ=Wz%lهF %qhvgJ\TMueA#ZW88"ΐ&[Y ˋǰqQܽ< s7F"ٹ)'7{x;KH%MBvo8{z 6c Y9_23۵ Pv[l/߬ڼTwgڅ `靅P h)S}7rb5 1MV"S;wnY?Ḁ3φ.[CsyC$:v:8 8QQ=+K i4CeͥӇr|+_x+8h.dA݊hސ\k_8ZB^'+)kvXG ͎O~2}mT*o犷ؾm3i`ݘNUuE&eŅN=&^TfU' QQFcKcQ>s֜i 9IWՋco(fyg;5->ZPܶx˧8ifuMß:(ǎsag,,|AanvNVz͝kaqG${7j՟\kֿYHǦ$(Ο]RtڸlRiff֣G---9N/d" {uN]+ςZϞ={RW i JHv$x}\=P §PM햷@tUZڄ=6[}%hmvK [Ɏ6; 8ԢjR(H@5˟Ϙf_svBaj63^@dB,Hv`$;[d$;4UNFr]ͮhCW+DbjͫW*-؅lc;rȶ;·5746Ņ={zsάYf hHOO̬i 1IVy57.kڪwگ_? ]DD)Kؚe3{\m>}:Hv+99O~o2:'ݹȑ#Q:@tF oyOtf㌍Q@@t:wqמ/mva޽:Ym{,loam- HvNmgxw%DjUx(͑iwSuuuQC0 c]e{/XC&^>N:2B'9н;wg\IaNA mv%++QE];:zFΘZ\d$;@'SVVdNKifɮS٘f=?sL0Cꚓܾf%d\Fubqd5e%)ʦ^?lѨ! :{uf5>{JUEIQC0S 7o?1msT(>1̙N^ƍJOr1_9sLTf}YͿ6]Na,~};oF055EmvNJ$9uR}7p@LGy7qտG}:,m۶u7عx3B d%ݎ8}SQ.@t>p(k K/M0n&&&( C?;:̧S(IENDB`biopython-1.63/Doc/images/GD_sigil_arrow_heads.png0000644000175000017500000001151312250104543021570 0ustar tratra00000000000000PNG  IHDRX3HbKGDC pHYs  tIME5y[wIDATxm@Qr 8='X& j?;e $Hz?~ 3W>\@`  q%X+q @\+X+q@\+XJ\@\+J\W W W,ĕ ,ĕ%W'ĕh >@`+q q%@`+q @\+X+q@\+XJ\AJQ0p k{m37XJ\W W W W ĕ. D N D ,C` #,Q`=A`+ `}A`fC%03nOY,0,C0̱/ q >! m,ھ0, 0 c+ " _3,C0l,C p9 m`ED8 5@W~D @`,X  @`,X   @`,X   @`,X  {j}8Uk-՛ă I`@l C @`!  @`Xb | 1>  X` , 12(" [1X>,C X`,0Xb,|C @`,XJ5 7X Xp w.K)2^ @`׹`Un9A` 8+V p @`eg޸łu,.ďْ(LJ ݹ `en8[,X VӸ `%n8[,X Vӹ 3W-,߹O=@)n:X]a(?^ո,Z&W,Rp{ ^!H,hr{ W  ^&W,Rp{ ^!H,hr{ W0WovG,Xm ^&W,Rp{ ^!H,hr{iCDn'ă{r  /q{ ^!H,hr{ n!X- ozb!X;- nvb!X9F- orb!m jf Xk@`ƚ Xy6,@^nh k@`Fƚ!Xyv,@^n`!,k rS :#B  @`,X,  @`,X, X @`,X, X @` X,d/ZK)D=H ֩х=@`a(cO2@`a(cOXS=XS2@`a(cO2=XS=X`(cO2@`a(@`=XSl(SԈ_o/o=EY~5ٰa`3=X`(cO2@`a(@`=S=X`(cO2@`lOS@`=X~(#3+-{,V-@`Bh,BKh +[h B @`!@h B X Z aB X+ZaU# Qˣ[}!v8721?"0l+ZBX g+ZBX g+ZBX Z V  V,, Od|QRn;Utm11a,>X a@X +JXYBX!V V   V,B` ,aB`+ a%@`+ @X!X+a @X +VϜG. ,a%@`+ @X +a @X +X a uCEX +k xCIX +X aV+XJXV B\gn&ĕ؅$`8m @X!@`  @XOV-XBhV_h!B  Z aB  Z,a+Z,@X\, V XV-X- @h- @h!aB +@h!aB +Z,@XB +Z,@XB` Z,VE Z|W 5, X @` @`, X @` @`,X @` @`,X  @`r~ZJ)%"' ß zo`Zr0N\2rϲs  :/Z" -kBt^-2X:k2zFMMpl-ք2Ze!gϹX ; @`\ B @`1! Cbpp8[2r1L9KˠDh,&DX . ](sVb9q>PEh,&DX .Yp˰= {@`2x e -0Z &DW@`bоO@`A2 eX -5X@r7K,[ $/+ @L!  S-!X [ S   S-X*[+ T ,T-gX)Z @`!``lyf,-@`!@hy%  Yƅw,00#@`!,A-@`)@hyTccZ w,10. c4+MGu}ʀNs;p3iVR` T QX+T @XX+@T!X ĔV  1V*BL!V*BL!  T,b  T,aB`+,QB`+ @X!@`+A @T!X 1V*XJLV*BL W% +q%anCf     | @X1ᜈ.b9\,@ Kt!aϞB`  @Ty],@X,X g\t!aϿB` &<K`*. `$ ϚX U) ϮX&<ӢK`  .+`{@t ,@TK` ] [a  GK`:4+K`xmX m} wB %X @` @`, EDW#IENDB`biopython-1.63/Doc/images/phylo-rooted.png0000644000175000017500000003530512250104543020163 0ustar tratra00000000000000PNG  IHDRpVĹsRGB pHYs 7˭tIME69} IDATxw\SW H!#aقDG](-ujmֶ_ 8ŁȒlH#}( ed|/Mx=+p Q?p .--#SèI$"Phmm=w΂KUu,mfjl_\;h]*R[[B  |g;6nhcrߤݕtfQP1"`͵g?~bmEĺ9 vuĉ@[YM[zhؘh===T PvYZ+"""=|eˌ0< C &^!ɊC/_H9YYbM3<)LK_퐆Aqa^VbqĘqSlu>Y1Aܾdx#t|6iNO-rgDNXF;Ƀͱ*i{8 ^$' 76U ֿv e)!999!@546ȑ>yȨ/TTV+,,DOBTp 6*(T1a٢g@R2U̲\VN~OEi:ʈ@c2>yXKKa6\RAWW5D ٳÃ9Y. u ܾm xb^ :7qF07.I`)i5^NAcsӪ)W/_A +h{m퐛@477ۍvq//STT=.HA>T37tR\e;C*]SSS{|viĽ@6h1W/:*EC@gT: *u< P ''; -D7gΜ)I1Q[0 "վA(mjp8UUU~~~(ZB7o=lddd-Dy0@VFFFm? Ȗ-[޿?++ eA KR(6@MBJRRrժUm}}}kjjP"ڸqA_U[[ Ɯ9ܑãkZ w&D!`n]N< צMڶQ"ZpKgs8\ڌ@^֭#BFFfǎ@MwEEE .]z1 @v =211A5e@y݉'P 9rdNNN0  444MR(8%$$Q؅ fgg] h!o6n2dXG[Z˯رc)ʍ7P "z9g:5~:Uӵ+.ݲ?uw455VI[l5|2󫨨(g-^SRIz528膪*hnnԼ{n˜RRR;l?xnTdއ}?6&ٳ'??+$"IMM񊭿MuY×v?n` 9D#GF8vus:7蘸(T6{lOOO-DP[[IRV}=}LPU‚.ݻ>CЍX\jݻg4ʺ4bF>9vŒ@N >>d;;v& vÐ? ͬVn~+ó$ 1v>wyfrrުxe#L(? |0o;sqqˋE)\VyvFJ^VÌALuY~ocd(AH$҆ N>R>aВB|y;L_㤘G%T0G;n:mmb555T-Dޥ(ΖUܽ1T7w80WSS!$EEE4yOvWwF <c nA]=,Qѿ iinrR}C&5OJJJ1cߠӦNS^Re? Ґ )s*'=i~%z\WW(ZWyy˗/ jȻ&Od$gg=fӓbOFڪQHC2-B)B?p۷d--͵5UjjC]]usCxⅣc~~$@6cxx8w;wDMWL0aҥk֬A)eJJJm>|@AlٲԩSHKKmա [f͚UQQ@W'*qF7T^|sл,Xp deew6o|نpŋQ "ذañc00}m̙͏=B)8}OTtӦMZA  @?XlǏP "Okfc4+Μ9R,Q%%%oYVV@ʲoB-W>geeR y:=<</^x]4lݺ!yƍM )SD^o'ԠЧDDDp)""B?XjU||< y,ۃwժUX$Ӥ?֯__UUR y7e7a„ .D`P l6@ h fĉ$)$$@ "YYY؈R@?ٲe .mcr'IKKS(ACCJ}"/"zo$%%W^}qȣqO7nz* yѐ!CB1qDsp H#ĉ@.3B" 믿>v@@F-Y$---%%@  \nݩSP " :~rC]f" *:m4ooo@ nڊR y%1eر7n@)<*06o| +.3 Eegg'%%ā'##@D"֬YIDAp֭ ,++C)TRRRqƱX,LkX1+**P 7Ç ͛---ܝT*ؘD"V~UYY۪@(--𔙙ݻ_xŋwJE}D" 4ՀkFDD0.1774aMMMZZZjjjJJ 7% m<KII^&!!QZZ*''R@c2~~~ޯ^ii t++۷#WNNv[LKKKDD5G +d2999YCC^uڵ111K.SRR):rHQF@ ~MMPCCC .0/_vyt:Fݿ}իWT*}/[WWWLL 9r1cP 7 ˗<АN/[L&ܜZSScdddffG`G07K.1--!!1w\:nooߟ?D5jԨQq;III mdĈD$$$p[D__ڵ+WTTTXIIё533HMM-))122䞈TUU婚744<|UU**z:ӧOE899-Zhɒ%(\KK J---3N0a VUUq?rOD|RRR{{"h֪E Ⱥu n݊R'X;wxzzFEE}Wl6[\\|֬Yt:}ҤIڴ4HnJaڎLwu]l/wg֥HMMMڶmݻQ FAAٳgd2Nwuu[zիՅNMMlb?ogSC|rÄ]/ؓҙ|G|lw2G͝;wݺucǎEY>˗ki)8rHnx܃dr[tuN18 WljyP)=lpm\`cnۯ"ÇsssO>R@{EEE (*..nb'$$|F tuuNfdd|37;p8~s*#+a5~ڞ$ J _" #,,lΜ9.\7nԦNJDPPǎdX׮]Sظףi ' T`S =~nin*6i+W6mUX 6mhHޥ~z[[^d0vŒ=?WmAH tqPJzH1vSowx!Z="-- 3c//;w̘1 v{X,Vedu̲2EMi#o+Wxё#Gwڥ,}}5U;'ں_"pgV1ˎ?81W GG0"ks1L77W^_M4,i S˾&$XUWS-GV6o?cƒ]8ux&fH}}4j%`={`0^jooOӧO.̋E󩨨E}2 ;+/)$~V@~oz 2(UCmm-=z9sRSSo߾=k,!?ilx;@QuifݰcwAq=]zݳfş7rIKݴ9V)q͛:?@@DQ]]ݕ+W FnnիuttPARoM1`knj}皂O?0.l~7PK.m۶ݻw@ kkؘ7nY4.5!,VkXЅUS Śbc|?#1/]`0233W\6==I>>>w,gѶU*P*},*\YoOQ枲g̘R𲌌 q…#GsJHH,&%%ǹyy55TUMFR?B{JVV]ftu///^,_<22eZffffff_BbOaP7yO__Nϟ?_RRe/@) 𔖖 #T999Νrwwu떴4D\2M//ŋ,@EEEC6 UTTtz```y0X,ݻw _` +++eF B2~%\BD D )6}}C+Wh4<555C_(..]RRNv@ih!zÇ NNN(  !555L&dVTT>}ZDDoTTTD@c,p\os82L&ĘLfii)͞7o޶mPI@ Tillj2jIII2@/CCC6BnZ,=>yyy6-=nZstP(®͛hkk h!YYYSWW[W3L ūOvW;X;ڰa:- >\II@"F>fD͛7>c]QQcmd\SVV1bz.((-.]o ۷Ż S9rc=ttt,--;t?@W GDDd͚5 ť?{ֶm;559F)F 766fcccŹ>ݻw=9^BBC!Z "///hs@"`XڵkvvvO>!"ڔBE7o~:_#JJJ_>@Y-Dޒ`aam T_Q@ 6}С)S|W\4"U]fRXXbŊÇ ( 8---B!&&^Ànz]' n޼)..>jLtRRRarr2lA%''[ZZ .p8GqttܲeבFal@ SDGGK0_@?!!!ffffff#F7GѠJCCw}7yd|fS($---TBscƌ)((HNNFܷPTf@ 91~ 6+))SA4 'nJKKW\YXXSccc|޼~-h!P333}}8!;vWjjjP @ -[Zܹsǎi'%%ebbR7[[[gff&''O6 1Ś7@5̙3vvvk֬s玊 >` DF%8ܲLMM#FTUU m-ľ>j(*3!:t"n/Դ}vWWWOOSNIJJC_4 f@ ~W^hYf@*@4mɒ%WSSg)Bė*.]=z4>Ebd˗/T*h!~ǏGslD@ ~ZKK?pB!%%fa 7o'&&:;;Th'Z[[ϝ;8$ƎZ[[R@忪tzRRRXX& dddFjZ믿dddgٳgܹٳgeddQ ;;;" ^J".\I盚2LQQQTx1c̜9ѣGHCᤡ1dȐT Ԭ_>66ݻlmffR0~11$!`6"i X}999߿󲲲TF>.s^^+IHH\F*///**RWW׿KIDATG5@(Z/_4iRDDBÇ7FDDܼytfgg9o<XQQp„xss󦦦d!| FA?XPQQb;vl>tZYY뼁[ZZv9eʔB 'M4O344G)@@133F:tf|III J=5c\$Ϟ=kaa~)S^xCOrnnn8rHhh(z.66}OhMkkkxxx[QѥKjkԇv쬤˗ihhx%sssTzNKKKRR2##h!n#GVc'o_zDカ>|];!NOHH@z㺛vbl6(#8t>0/ΒWOعsg1A 3g̱cǒQ @p8K\)u9NGGGC]]]߼yR@v:<9{LC o_ͮO?tPXXѣGk!bJTV~F $KTw9ζeSXXX+&Li&܌,׭0_;߸`\^V|݇e^g^lFYY޲k׮#G0]fuU' <ɾOo3ڞc`jiSzv L ƪTTœcƉ$*0#zرcQ k]L~5U[c/yƆ[fV#-g. {(+"]]x{{{T;KKK?zu]6nfef(b@z0]fiiښ`%?t_hZzRum2eell:"Je}bb#޾Ne;*BﲵŌ?ƍZR""[q KOOoРA_F)QQQ,ɽ._ue~vܕkf;9h4ZTT}w37EE?ckgK|e^wѴsΡЯ-D f̘D?s(ujB1=& k>}{.~r###ѣP @Rwn\8HyjkעGH$00?Y|\g+' P]Y6=xy޽ Մ>ecc@>գՇ8 }EաKU}dƍȠBBB@ 100 "33""@@DqC|QAAL&"=D@  Dv0!)++Ԭ"HBMIIiذaIII( k"a@ B@3  Q @ A#qq苞&fjhh BMRR,&&"z̀@/ 4C9Dc%%%Ճ B5-Djjjj( 0q@ W"AQ]]]nn.JDo z̀@@דRYYYTB&%%ebbRDqR___VV&<' h4Zll,b٨ƿT[[5},9yYYYM-md0?*++EEEGekk|1驣w-)K{^Z䪭|˚O6i۷oe4hPUU4V^y#]S_{qe+'L@9---܇>8q"YX,9-b?()%Ov;i4EJJܼ!&i~]qW?Au݁s]JKK>^! <+7 q}a9w R5p2m"##t:jw߶dVVV2̊ WeeW(C;$;#nr]hgĔ/L>|8GYZZ-brJKKˏZ[[oĵa׏ZNX1MU_qEDL&-""Y__J~,x#8Kʩlœ1'V}>M@A`0nܸ1i$:ׯi7qw/\0s?TWEܻL@>V]]}EOOj775k : {VWW;v %YYY'Oy+ɬPRQ)_jx%/^,&&&;R||< 7nN>}zaaawGe'^EEE[[[BBBe">0߯^zڵ]^)Q]][n@x`b6D//?fϞ=f4^999CCø8<ٳVVVӧO'IIIݤ!Fê"/^0 &hB>okk(%%`ϝmggfQR@ OFF87|o5$%%322Q[@ CSSS@@HTTԓ'O/^'yhHT233;*z)77?аh"W:::Z[[766>~8**j咒h4"|L̆}9---:p>],UNN.;;[oh!jiiqԩSG]UUz^:pРAh$g|gP;yyy޾ׯ_&**bݺuk̙&&&%%%ϟ?A UO"B2L]]]穬TWW@ ;wٳG+Wlذa`Ӑ ]]]=s;wGRRN)((OȝݦB$|yϟ?yf^KCs"|R???///111ww+V(**emm]^^lZp?~h"===Z^ڶm!Azzz$իWp>ۻCYY~nA<}tٲeZZZ;w4$Z%Ο?`0֮]kuuulmm >Y$ ?bcc===_>qDwwiӦ BYNN.??_II 2ݩt钗Wyy[FFJ_D"YYYEEE͙37tZBBƷo޷o_^^O?$`iȅvmmJJJݻw'pQq2 2rܹ˗/3N;99}ɤRL&<@7pG޹󶼬L RN4cƌs/)yM[#qt:=!!AWWWJJ&i4`"ܿk8Շȑkk?z?...~iذaݼIDDכ:<5a„G gmw؁RRRf96m};YiVUW_:hKLҹ]yKJJjkkX,>W ;;`|-D>7m ߿#"uyqDGG3k׮544tcccww˗ m333JKKe"O+**n1{r|Fr޹`0RSSh'Cue6TT EQEE59%%%MMDyȰ{c,sr۟^wr4qZoр =UMs1b\gϞs΍7P @ }c]k[Zzzb# >BQ,kڌⲪ\N{j\l48b\\h!11kW.Wd;}ȦƆOn]r i[[ۨ(qxHbU#5Uhlr8---h'O.3JLLޟ<~4B-GQ|_;yf0IH{ep~m?~k eaA3i (@0Z&&>q㦊F7T1ݼPVRdP9D}v4IiHWEQ3b DD!"" DD!""1@ DdddAMU@9DQ HMME@@QTT]]] "@!R:t|*1@豫QabbD}9r$ 1@!BBB?W*8q"KeDOiFxL4 XpTןwK.E.]~N!?>N8[>2DQDUU͑{{{V=oa Qdž}zzzͅ7x+!dW^E푝 CCç-"55+"M#"вeK|͚5CMM OfW D@&EHLLK6n܈-[_~J!R啇L&mWWzEQĠA`aa{!>DEEa͚5 \Nk֬AFFVXmTSLL ܹ+V4$ׯG۶my1 D~kȑ#!"޽ +++\t -ZaGVVBCCwޅ_X!R!%%%pssCrrr֢(/BDʺw 33F䧰0~xt֍' Dl!uAi~7cܸq'|a2G޽HEQĊ+i&ٳ47щ̙3Q]]O>D?-`oo-[H_HEO%Rb{CpQxt233d"rBD ܹs CqqJ=wJE?!!!(((6/&j THJJ°ap>xQMqHCR*x1tP"ݻW %.\[[[^l@۷#66{fj3K}dddYfҩ2 jڵkƅ 鈊Bzz%W DԠJKKӧO}x̘1 =` >>>Ɂ @ :(1@)Ct˖-C5jEӦM%VZŕ*O B1j(`)mUV!<BDٴ(pqqw}-Zpz߿?\\\0sL _|c/@bb"V\QMt3}tyxB700˖-CǎY) "ׯ_u!!!W^^GGG\x666˗/3ك4޽Qtuu7779sk@TWrr2BBBpM>]T׮]c0@Torh嬔vA3/^dp7"n=K憔P p̛7:ÃB: 6EQO>Xׂ-<~mbԩ%>}:C "+l۶ {`DOFY) "6oތs̙3%STTI& vr """3WR EVVtttx7щhժ>Pb-[ŋѫW/>BԸDQDMM \]];;;_ 00P:a5 Appp`KE̝;Xx1{ D #FiӦX`O\,_QÅǺuk.l޼O+BTRRR+Wp䏀.NY˗ /͛fXpTzÍ78!cD'z8TVV",, >s5 K{!<!M6ذalllX!j690`0{lH]. SN4i JQÇcѬQ|kvaɒ% f= 6믿Ç{.ݑ+++V Ap CDFF 0@| %?;|p899wߕ1@C AѩS' /صk?#u=Ҕ2e nݺ5k7)L$$$UVgaF47oތK.a֭ GAnn.7o?-Z` HKKCxx8rrr]233ѽ{wdee2@HmBkyyy zb{iٲ%VXOOOHmA닜=eeeӧo[\&7֮] [[[$ϠAE1<-tBC Av0ydV =w;ѿD ~ݺuسg~vzu{Ǒ#G!um6HKKR핕wޅ tDEE!##DS.\@Np }=){s8r+ꜗ[Ջ;a:<`ggDqvH΢#G2D A@XXv OOOvjv&".\3g'* R!3aaa jY~=:&:bxe˖ضmÃUWWgΜ;H#%%Dž (jjj`nnׯPZhj&s5oiI9&2ZZZHJJ]o!h׮ѤIV 5 ѡC<!ؼy3X!^{5DFF"&&FBB* L4 ]tm+RG!!!7nԨMtR &L#NMsRZXr%umBJw}={01ܾ}(..fxJpzlnD'5~3Pŋm+RN'֯_;!moaÆ̌BTΞ=v"##sNV |XYYƸ~:fU[XnݺN:Iك|V \b x'?ޫ.v5,͚5ý{V#vvv RiǏnj3ǏG߾}&D K0TTTH+W/Ԣϙ3Rٖ-[Ep5<7J&LeXAVmܐ%޽={d=Ox|ǘ={TǏ3,,,!]:8!zJGAHHcN^ GG?`A@II LMMUr=jp<-y8888 ..N!X|}}UvOѣ022bF֭V\)z*ڶm+cfav܉6mpσ4j"5n8KRYrr2z-;0L|Æ q]Ҹ8o׮] ˗/W=<AosIÆ ðax4o*++ammTx{{.Q#sy&<<tŠ"R.n=yeaQOptfaGNFү'S$ Eضmd2ܹspwwgE)3g ccBV&B&*55"LϟOǡ~ f!|}}tRt{Ҷfffy&tuu4 "jT..hn8|cEy;wr |M7ݺu{7---;vO$R"ixh8Y1/u' }2@K,A~~>Ǝ~);4!nF/up8qW|>=芢 QXP333>jGހ<'"%%ӡ?{?O?={v#UXXX"G5䀘 UZZ ggg>SÒsx1h J}K~PC۷aii3ghd&$$ֈ`)~>1@4tfsήV3gΠUVHLLDfXD83ի&N__Zm }}}8pnnn`1@HW0bmof...8s <==_D!5Yylذ(O>5QEwL'Ҕq4CRRK.A:4vX>,"*֭[Ap?/2CBYYY055\HJJ />[nYK.׮]:T)<A@tt4͛]6`bb . $$2!B!U O?VVV6lX ޢ( K,Qn"R$dž FĖ?QTT۷Hp]͜>}#GĹsw9bbbx lK.\inCfB߾}y ,{`mmZ= CYf8t"=u:uD)kkkܹsAx KWзo_ :m۶UN8qyB ࣏>9&O0P+֭[#66ݻw1@1#>>;wUjE=z@@@ƍ!RQDWpQRR}}}[^{5xzz?7Չb@CEG\\Ã+onnnE۶mU~ЕAn޼9N> WWW^`"c*4/,Y??? PXXcccĄ"[X*4Ў1'OFttm: -- [fx1@.X9rm6Oa`xV]D}{ KwƔ)S'fϞR,[' QXX֭[@#Sح[7; CHIq]ݿ͚5Cnn׀AT7pqq@t.sΡYfWڸtF)ㄏ/}#Fٳg!˿ycŬ"]r71<"aaa5j D^^ X)O+GGG9r F=%{npf;"%%(((`1@47<1k,tQa333իWѾ}{TVV2t  .Dzz-ZW_}P.Q#L i&>}3{K.G_YD =qcǎaĈHOOgJn̙9sR ꫬ Z… `llsHPPbbbЧOV DܻwVVVHNN+ãC@۶my;p8$%%͍RhXTT333C[[CTx W_}&LO\Sann.71@TvӧOtIDAT!|MZgވE@@2!"ʅ áC70<HDDzI&1DsMs 﨨(aڴi o"@Tgq||| ^ 9+zرcۇm۶QٯmoooVJ#^J#!!"@;<ڵksˋy%%%%"@7<_|cǎe(|ڵk! Df_|,,,0vX<,gSNؾ};?ѣIn?z믿lhiq+ИܿK,a1@۷Gzz:2DгgO7{f1@O&ǎ'Ã!A`ii]v+ Dqq1LMM'4oe0`̙!={ "0c _z*7n7A@AuV,Z zE!;;+V`{!&W@nn.ڵkԓHDDD`ĉl7t4y (**)zҌaٵk:v;;;ߟC\hRxwwwՕ- d2j 탳3+4Fn `̟?... jCڈ'JKKY)QY#ׯ Ax늞;Dlmmqxzz*1"v˗ SLag:aÆ ܹ3'#Y(M_1yd?'gNCDL>׮]7|E u ͛7ٹQQQ>|81@ԅ_ΧROV}vRHi{sss:t ö]"##lQ`xx8[>.^ݻ!B U ~~~ӧ;15([[[|7҃ *K,AJJ ,YLjp 44}:v(M"w#G`سgÃu2h|l~%u;uun999022b%X`Ȑ!=z4+ Qo߾ [[[ܸq&&& Rquu?,}%':u۷Grr2LMMyeIyfi0==y&Y1T~D6mݹYIJ"HII)***N " #G:+2rqqo~:1@;{o233.611AII qHtEaʔ) b>>HMMʿ{k ҌBӦMqUVDOץH}D lvvv(**>]rERZZ egg}VC7>}(ǬYDO;{Gq1uЁ}3@AԩSgl裏Dϡcǎشi҄HDސWZŋK垞Dꫯb묬,Ӈ{a ֭[+F o&"""'ϙ33f`jH~~>7o.Enn.lllXDu"ߥÇ*T/@DQDEE5kr~Chh(k[YYޛ ___VՋz zj,Q=7333dggCWWW*СJKKYA"ݻ+| 0f.ꑥB>QQQ)W:u 0~,22|ÃW!(m۶ϥ;w_T{W^ŁpDvD>:u gB|88ss-C^.]C0d`BZZÃM<K.^Oahl'Wܿ_+akaOEK/ OCWWgp=*Fj۷s511[XD L/q .ފ^¤N[|{8;\̄1+j tGphBpMoWʕ+prrꃨTUUj QEhi [/u@vN6,o_=qDY>}0`ۨOZ:[6Ⱥ jUHMM ܹcoQ| W,+^}-n""nݺsssϸmmFu.2SCjDQĄ6HNIa53f]$|;AoJE:pt󄙅tgA[G{#` aߥ[}-?_r?`d늋/5j̛>ibɣjFqQe"ޘ1N~}?@`]xeD("_n>Zo":~{2Q#HKK73-նB#_Gk\80q h"V"+'?oC hbb(Aqa!, {7le-5k׮cu}X K`ݴ9(jJڭ@Gb}^jj!g؁V|L&.khkkA&~Z| N"\bM +j@iq9-m58cw1 "twT܅KigZ&jNN8. 1jbMaa'6:A&{ Pp"+j썯΄ZZRGNa-S`;0C!@phV5L<==Q\t9Xwo /S9hU Qp[_=oee% wtt-`VshX4@H͂|, '/Q#/w/ Jf*o 52t1CA70W'la=wDXG|p5(@;m?ZnHDQDuu5Lakg "O:Dޣ-Zh0Q#+++C3;;χ郎GLĜp=?w艞Q& M?!;z"zo[| DGG`bfftzg|:m4Fރ{%oDwDȐ!zߗ1}N:=S^Yadd Ƀڭƪ@L:oES+Lp:BBBw 3d3#ƣ6Q@kBDD!""1@BDD """1@Q?= 9GIENDB`biopython-1.63/Doc/images/SRR001666.png0000644000175000017500000073465312250104543016703 0ustar tratra00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxwT^/e"JQD#E-*h,i&Ę b5h `CcmEea]2gw3q]ƙAEPuus<3s9~єR !B!.B!C!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$B!B$ B!BD!B3!B!rF!B!DH"B!I@B!9# B!"g$>l66[G9k֬7n~*BB/.gYcc#7pÆ 9-^^^SO=7Ǔ !OQ!cꪫ8)**Ln9P2!lzT!xd>Zp!+V`ܹ(2>g߳ŅLQ!bdnaÆe}^SS8N: ::;;sXR!80I=*_\2k\s5L0*sN1GiTVVrm/;PPP !āEQ!S#Yxrݪo_~4}畦ijΜ9YCǧ؟P(ĵ^_СC A݄[ߢUVuR㬳eQ.gԣY(]B# GNkk+_())<sur !ȤB!s@>r***4-z+K./Y`0ȱiU!HR !#pݜxi8>3f`ر(X|9ӟ;v,\sMN- GBH 4-5ǜ9shjjB4FW_M7$+!H=*_|͛Ǽy_\\O?K袋w>Ё^F)s>exd-\+V0wܴ0 {9O8C9xꩧr]\9K/ۻwvLWY<67`Ŋ}ޜ*ğ^ _=k\)Ec?7˟#7{dCw=+3kle|UYYgH|Z}jjd?,lۖ}7xc{d*pG-[x뭷_y-̹z_ev~|b;ٵ(efq73;;BTv/HƸRSϼ^\àEěæi2џ2u;Iw֬`kn}V5ky3iayzυIZZZO~mưa555b1&M8q"۷o'~">L}{k-- hm}$k_z{Y5o-l[o~=ѷ0+7m.l_m exQJђز+cmg=;ɨAc.b;bYqϣzi#_]Y. *DZ)C=Ċ'Dzk^*z!-[)YC⊔m_s뭷СCiNSk6ڻ&6ӆW-sȊLޞvK^: {3c=1 Lgalo6 L:1uk1g2l&b iK'qzy Ŕ7iI7-pP8~]z E0\`:2͡h`tgNa^\S(z.fLX1nkaޛCtq}KQ{i`3ٟ륷1r2& h )aI'Qd.C1qdz$JK . 5#cۣʧ}̻W-4 6m -yLߓigpB>6ggNI4^4ںO,(pZܝTLDh=-w;sGwg|atUeeF͐C3[;i1>aǭT3-FS.c|Λ!_odnZ/gY3'ckژۻ?i?#ƤrÛz/>*n`Bk;\8iTGOHO`jL%6tYs|>k.|SR~xbuc}~p>n81%co>;cmۮQ!do_x1 {Ȩo2gkx<ıc+CA@z*i l[1<]xpGSk;/~Ň& G k:t(`@ww7R:;ǁwvviY_N׍| Oވӹxl ヷXK">/ $4Q[%"Og1g >g I߼d3n yY)Lזw.{oři=WrW[q>o_f_x%19cʸߍ7λtw3{6^+㤞0zM睢R|mcs1}qgSzV:d#q#Eu6K؉Z?==*ߒ7ء2n/7=㏙տ#4?V?HidVo:BBYZo.~y6:4;&jW|gP),1̛|Y?tl_#HYZ!$g\Q)m(aps7^-]ev,cᢵ66]&x!Ƹ~Z\o{qx/^ʔ'goSU|8v~cNԔ7; ݾ2% 'pΉ7sM-۸h%|ۙqJ#*+=)U7U- uXkTEdjU_ɸ`wOQCܧ@'W'籫PqY@9Tc]W x\]}ʆMF+ޮABRzEOV;v==J;VgT RJ)DGn?_}?(NвeoߣTa|Pe]_RUv(P~lU"z&Wa3.\gWW_~3g*-^ CQQ47g}m櫪x Un]UPZmɲj*)QTT(Nک߰*mhP *Uy<;ӫR㝝 C=ef>K^PTT(:ZExMu˕UPo1IFog Wjh:;RJE;ʕ3Ujg7(8(5l:(**1ק~ޥV:Xr٩ T˗p8|qɝW)**Tߦ=SjTʋڕUtK{WJPu7Z?4c<+\/U> )[Piݦ^(c=gLB˩2qĴoYgŒ%KhAaժU|;_ocq8,ǧ3C._ccx0q&n_lvL3gBZ[[ %́W^p8 IL%GQ l޼9-&ѽ:zX8zݺu`=y&]tj6D2,C(<p ?q8yrnӅ"t" &ׁrecz]JFt{ $S@t4~{{{ngI],BGnB:ܴ\c=po(c,wG#m8AbLʊJDg{(2JKKꪫRF [;3<ߎYIJ#΂ (Anμ`G2i<=4.xb`(YG2 EX WaPay]%3&a'-lr1Sq+*NS0441|ֹ$ 6ngKVXb#IOwʉTW_29=A=3` ټhVag݉(d˖KPI.tf͊'mܔRTU]wi;h\l0e QY}TO{Vc#LPB CndLI +V'P@0g̈́ YW=.&Lxש_́5Myx'Ȯ.+15'.&?nHYN}_H)zw,ttwC%ٙau{\nW_ fo@&5CK[߹8PhgW \L`?0tJOiiǏOee%3f0{l;0/_?泞h%7q#V4 0 ڞllVYwYO5B{AY sC,n|974T5MƈL/cdw%i5k )INSS_jSZ:N8:~oL~!!ܿ~.I_S3Zy13xU\gL~f$hz&?2f@ETi%7Dk?z@x7Bumx< t+_J?*]@ 6n61=Z;P^T}>M+\ɿ7n;`4NQ|ЗyՑ7muB֢="Q>5R  ^Maq8Bּ{huu#_E}ұ㞞RS F)oyu$l~`ػzgk{{ٶ. L_/.Wr{}$ڒq@eL;8p:JW{(b Y 10w.;pVبﷹ0;vX HCd]6|̛7dɆG}4 P`0ȓO>ɘ1cC ?N-F? 1^(#BKxz@ZkL ,uӭ._ҺEgg'̀d⋭ykƒb= qplmWVR^ }-Qm/֯_؃m; +WBTWIJ#j-ssU6Yu[C = Ivg}ƹz?xzU>$H[WFౖlmpmJ7mK֖zH$Hc;˦\K ド2_'uJF8W8W`FiGAЃn-id ë®]FbÌ7t47`턌8@ NG]Eopš? E^>fq<[X%)cImCN7'+oPv6nᲧ/#GxGqڝG,1b3CD:֯>f֭k<9m{TpYhc H *++ @`sW /0w\,Xyi꫗1 }uqw|r&}LSϴ[y9& z޺twLy}CPua b5oLWв&**Υvt!Tf^w1% l\x<:Fg+ѿd  dlXn~5}Ʋnu?_+l‘$M-"<+I,c }d3agÀI7p6n%-5jg1nN|[}JN?~+&痢cOP|hp ׉XL>n [J4'P_OгYetZ?΢,B)ENŞx1ZʷxP G1;P ?ݽ*Z :<>aB!~^SeC%2 $D3% Vk077= ^oLS\iGOcPk̔ |&c0SLay睌7UE`Ơ 50|f̘A[86xWJ1o¨-)V j\4*:bBXsZؿJl]rxp:A4/D(Co dxpVn^ICOJ)vyB6'[#qm~#w SNq#lr(OkcE1{3a8d]?|C+a5|"&<Ž*zC†nsѱ_s[ :RMM޺@z@K@=63#VMFp:$2$žq6p05TfZ~mk+4h_~Ӧۿԓy$ɁGY)9 S{@p;4=ȑV^_o3W-*uueʬa^m-N ZӁ4î]= ֭1|A ]4~F{HFz!m(gDV`hѼF[W&x97nGK"섣JٶmBo:%ϖPz~Owz޸!Ib .7`$:+0"ScƳ!9aY ?ua1/t41?:8oc_z@LN7ͼypQGqo 4J7QO:#N} *]#i{wXW#=BxUkm_喓Ӱy9/l z@voILB>aXLtvt~>wFbvg+= l'|)W^M8渉ǑG}Mt qfϞ͒%KB,^ 6nns˹PQW̞=Nf+YX{-1Q:'lw51]'Z$H`bmIƮP# AWI lJ$ě|E05k-hc%  3a£\C??iR^]ZԘ0?DCXVMtSQH">+2z/L3RO=dA8 Lr'?;za)/@iUutdqѕzk 2i̤Xf!, vZz(MNdLމ@cC1iGqyMv Va6H10mbښ nSZjQ ٖlJ^Ptu@2-҆3čItc:V<= qcF –ƅC`wH$(Ж$ZP(@'Q(YCa!̟k{q;|h_k UOQa4[^A,gℿ~z]] B~@ƠA>}:'LuX݋>VlBluĉqmXĥG\JG[5t@f$I$(-@EW`%h<쥲==mn6(ra&3 pyhN#2W/"D7= CTֹ'vlݪpa x=TVAqo:n%]]` &(thIvd_RboOn&qcYH&Z' Ʉ7t֥loH+7&-n:z o'Q^_Et+uJ419ٝ$vQP8t 0ˈAo(vN : XpZG' HdwҒƐX #gw`I~}np/%uod~ttiѝ~ Z= n&;<=ѻ(ҊzRzX(UUU/@AHRtbQDt^kںFFĚ|ز 'n~ͼf4bg !}IP}qs\D ag ^h-ټjE+6t06lSmQ#C@`>h # W +_CQ@75]xZGCن`I@>^|:K% N3mn%N'x%}>Od! kj!HrJN:$4+5 =Vx={6ׯ^CIf]~9J)>]trJB~o-v2Y4(VNBRDLL$qIeUO0XA4mQD vwEE]]5D ݉SىnRY_|,@tEw|  (8my]aav'pqhv~KiVOWJߜ=5R{̞-`tTd;ֱoW n~:'ѷ mJ!mgqd{'-3H8Y^eI@ okAn:3- 'ae׮]trmvS("?Zw7n4MNZt灴C2EAWIK6MgOx@GyTjc,oqi>TPdo7>bi~DeJX~8ZպԜ333@{|^~0XԊ m*#I}[fZ^ DMW=54ʉ?GXsaPHcO@e ҭo- cR \\YMe"BtuF tk3'-1΍襔t:!"zd#c ?m/qqoj 4D Љ)aaY9a~RŌR)/m(y;CTʕ+dB}Ir,_1hx4]O|bbp4M㣏>=s;32̩noZ93K+ցZ&Zj\YvNWaԂS&e{"ߘY&'Zzva>lg"eD5N1(!s^덯!EDDi}/*r쓅pjgo_5ynnxbdHI cuf!nNŻ׾k*RE[OyZh- Ij#N/a; |P.XF\O>ĀXDb_\9#KĐ`~8&̨sNZzkϟ7qbUVVVHGjҞ$zUՁLv6gy@o c˗U_>b"Ć.jĻh̳ObvċSjf`7h$C1H,0}h L}=%qt(ۦhc4MsH~Hlt"J&%Vbw7MH0 pۇ_u4yǔDʼnV}R_|z Q@b~7aKKˬ{?K='[>5" = d=gO$XF> B,E! ֤vD=t+1XV+%c~p5r͂v@d f#df2)W{W8q_$ DQٳg}ss\),R| ߢ橅 Ο?kS]OVM уބK&\a+Uu{{T]dOSɤmn',LR4L1 kM5N W uA#ƞFAj-Ьqq }<7\x% ^kg6 xmÍ2cQ{M$IZcNqC` z=%zI6̘0״d;B91,No!N1Ha|2R)!>C@1B(,IQ84T;bcHQ3  *ӱ5u)Wg_<19g Ӭ"D&-HSՐI׽o9=xDQDdĚ<*8> á0 0?IͩѧvVqS+`ʔIss3f-Ȳ>QRcW ~<`niv*P4r,G}Y=2I &稳lDWש9Ru ]Ĺ@7p_5inmvIqqI$wJ>f`3xF/+p0Q`g?&NЕI"i`1r&a3%`ƈTLeh\ =E7ľy#1jp:}X !9R.>kAXlv~ѯ^eL(Mcl9a=yd29gf@PR( XbN˰wEj!c?1x @X8v#DZtS3g |;Kxw?}/0S( 6TW ] 11 ;\?alA-gPv4uzz>&,nMa[ޯnI'UcƂW{MQTTs 5}jjܺŻzELq+ç/1YzxXUP̟OHLUѐO( <=Hto 1 -v"ÛoBSMa"kA ձO<ȣdm_#J#'Yvq_OY&* <. 0[̳QygammZ@4=!M`! , RZ,B3q(1R V7??K@68S" R8S&+"p0Ȇ7tun Vn0z΀ @(K6aO@9}h!Or'(K!oվˉyKO-:$y_י2  bQ<3c9ܨ4X /dY0e@]ɻK\ʕ+@{:X.> %$IrbQb˲/no~#F3pz'٢4(q5Bp=Lab-AzA}P% H nP {*)p$p!q/ sLYlU=ZiϪaܨj$1S-{M({Fw44U_6Ż.Z5'\_{cMWd:nc.0`ݤY@1D;7#B0 -\ |2lBV0f?)Үتɽ{l!dʀP(1~$:B`̴1ܝy23d=zOL`N`*$>C-Rͮ&,Med3 #qZ 5I1330$+++H6]fzc/7iZ >#:RORɟ|sČ CK]1_P:[oGx=5R 8Ht ShB# ONYx'ajw-ҴKxnO%fc I?+N): FWEV Y>d-ڢ۝GG[*1h[)C. vzP)ycfND~8R ZdO~"R?T1@ 4T^Q Ox/yH|>3 leEӴ'薆x@#;,b31E!l[qtoF: 2 ߠj# ʩ{r愒2F^*TغsUvvvrήb!:j=(byyWw@5&Zq31p^ۡ`PS,d:W<֏@1Qf&=f#@RM#Mla"BnQBĆFŵ'ӒwG $[ettRdAWUʊb@ϛ02`0OѨ! R >kw(zy2.c%N_t"m9цHqXh' 9"uЄvF#]iь%4iyv&~3EB;%XNvDlBV0>Hm8ڍ;Cǹ{Ԍ^o u H2vk@Gx$yf1V !yumS |~obY(@, p= Yq@TBT9 b/bׯ_ϖfj̈́ׯsifggy롒=iիUN2Q#Eo`YW2[ixĄKjEcm<5*A`! I3 d-XmF0ywAT7I94gcƴ#+ 5Aź%C Ha}@ ^Ň.8A=OGΐ ;ݻKdD<9MckB,dݞݰ 膚Tpc_e{I=8xoȣѨǂᐹԀ̀`uš,֑O0q5#NXi,gD03ƻ!R׃\vm t_8 ȁYRj.[}RW7wAJlag7bV\HZ>2e !llhTW}d_tQ)1=.4sD,L#nFwi`Q[$i3@r87Mmh4d4"5v4#d'=4K㕫 l Iqspyw^F!$W{.Q~Ƽ)B3(y@%ֆ°@U Ȕ0Ұ m+یfZS "%:V kkSދHjh$b@B4^8#I #Pnbb@"{D9Ψ<{`P5(3K$mc3 #q/d2 yL$&|(+oeӞ$ ŀOȈS >k6=PNSqhY[c̛쒚guu4s1#3@j b\VEzw4tY0f&RH!/y 垺Q^Jf\z 5Nbw5駑ǽ|ؽT@]MvIz.' %\6B*2)یL˹|ih@e@;f17} Bh? $1 D%^[lכU8sQNSfz˂K HfCfi\8`e 5 #qbSZ4i%Ty#k|S`I=j˗b@Jhn9ɗ/o͙3gu} .Z{Zm-J% qt$.{d@ "WY{ 0s4%hhLL84wPɭ-C ":I>xzuK_%:ҩXF_W1իU,W< U$1,5h8n|c0" y5?e6 M,'cn̯ZSH1&H썡&ڊیЙsSg,%L"eJ"&Qч>FN NmږZٮ?5{ (% Y IDAT]5o'g3zV42#g@܁$A48)tGсk@&+2DԺeX˹kx}bS2SPbyP#dP|0-hy5"ޞ([0"` @G Xa9D%be.)g~[o lpF)[1-f(o5&\.櫵r̹s`jnFC@#I9@O*JvKGf۸f{5!tt`A< W,`IIp4m(}@j14}RGXDr@b1KS3E3aw}ԿE;C;Y HB`^,Arc4`~_d9D, kV&zVE$%:i ˦i5 }d8)Kb)1$ukcɲ1i]=RJeeק^  (֧68ۿeY>}z @-B{|I[,`ʀtxy4NB en1uYN=e@24)uhlO)CEtwPަ5с9yDı_ &l}ōȥK0dNT.XׇC]d zM=:z GpAB/M!gyz HiSfh=1kc2"{f|SQnl!hv~=Žb ɠSc3 @͕brj'$  Ih?tG8 Cg wcPI\mWԷ=2ӹX ɠMR"f:>сCNsF9ISX_G4w5 #q(r <h[uLT2 J^~z(1l`xڶJOvLMYYYa416Mxf@P\wJ +jjwq6bN7ԡ^BS*(};d2bem"KͲ,n'NPF/ 4vVV:KI A~u),6 4B ! 1 ,E;+S' 5 GG Odl=B䍦vw5̟qfxlݚ@fb8!bTĿO^?Hd@lZ^}]|:{zErD>faSHSL?$/> iM{\ dˮ /<]e>JEnH,L( /˺4)Q>"%=iy.BwLΩbiu{[Bs'c2D>gg05HԀLid1d]UbG%e"Ӕ(;A`C ΂^ew!U̶ cbEb@}?c124sLф->\,=&t*jDx'D%=c( PU27T C%r%~Yz=&s F:H;DwLFT 3ɧXyt.2` 4p!0;)"Ydr9l95/cLIdZ-:qH#Eށҩ+ IX:Ŧ$-H`dj04+g!sm5j1M=3iCp& >889~q} U k xZ'0 Y.V<`b1dt @u*T4 W 3 ކU\UfSTK+YcK| nm @n;^}ւR :pJcix # FѴoo%J»!hd6ƿ7Uk_ƑcO$X$U8)DoR "|ǩt46slZ>X_^^fccc6_p EJ`Ӽ;IL;EHdƺ%ʀhA&E[kz\XTXr它Zn($ uL#"3 jDׅE-*=( 4^Zx-<6"'Lk @JlMk#sbl vbŻI΀hD%0 t|nɈ`Щ-S@ „~WnhmZbn;8G%Y6$,ҜXDH ]Ye\3gI!y]#q򄢘֐cyq @YXAS<kL'jdR+2` Hkp@6PT+!qiآfA<Aoq `iFTblmW Uyҩx_r{uS)4:aid;Zҥ/ebkH^:TI0@+xigjAAR-"Cõ ЛMuZn8h=@*TgLH]b 0 ]6^OaqA0 9hdHy@ZwgHfCvZ= @4M"ͨ*O1@:32c/mSg<^, %Xg fs0hTOc@,GL ~4}\FX7);sxw)8ʙ39v6V6$N;[YEi6`<"MmNNUI\&d2.,srLXS5  ϟ?dsp'&Iq ai.w{[3d|_id.v\V산?;p29K$C bu \Qcc2ˠFjb_g;{IvMJU0vއd>蚒y]F7T Cx E`&5޿Ke(g@d)74בPѰтvD* V{C7fShy: pY[< ;; ai0 'NTHIы< mLCcgb.U*Ht$C]|Ҕ)= [G@=B._0N6]E캞ae`zoonװ,JO8.0/u@PCL7{~f0oĘ.Nm"aѸ;PMt NޠLz$ |chʛ>^^uN>^ {1Sf#>ic kcFB`%!AO1ET;jFb\pw @ti̫foOJM9C.cϟgww{{℺"V.Ie@&kRsqh`&q rKSC]}w _W]YGEk93fwGcZ8ݒcA2>x3MOKp g? p !yRd"\+WtӏLl#[{tdD~Ƭ"M|)Uytgf66Nc! ewU_,A!(QumwKGZ,_ "MT=0T>IF}R$%Xc+C_Gl艡4 "UF/ (k1@PtGvS|1~1 scrʀL{ ȯ 6c 4Z Gk@nnPe:i& H>15 _xכ2'!ZNvS(aTZN1zmb~ZF)FK+ 'M,ͻvb3ۧu^lvw\}YF{|n>k+\[(d< A_Khtgf}\`Y8ܽ˕*LD{P(Z-t4|,/Mڷl)v@t"a;QEQM;O1Y7 f26 R7YpFGg#m {{ !)"3ɉ粛@-Sy8F)!?_A?9Ҵ' Ol,a,xzO fMix=aad ;%eij3I#j&v4N`e@04JU() PPQT|ISJXTE-xA0bś45v٩ܵj#el]/!B< J,:='IszB72&zE~@3Hd&{c.]1->`@ZŃuGM$O!xU56f ]DEJ(\eH! >m|ʂ<a m8*7ʆ1C o#3ɾ($Ui /v%cRgX^u2L"ˢSqPfD3 H{uyhc$ 08^'DŽ!#(E#Iln H^(/Zy.q|Cވ <Cd(1M۶Y5a3&IK% èe@&Q3jtTT''WNB%yM$5s?FLt+Zx>e@,.ßaXIIWgݻ]k flT'ND& Ew;:67ܾ03 ~G8]H;]-}LQ=~jb@`Ţfoع-MEX!1)R,rlL*XScUP@Ӵ$XOr8i,ֱ' ;7qeV눱Zz=DNwVG)a%MU5=ɭ-f[˫0pF`Tu]b$ 1 ,fVåKʅ)L4{pl*2 p"I@A HZTi-L=5D!^σ_R@DjQE0ڻOǠ38v&,nuo&1G cqr6i 0D#YLv{gb~TRLdJkUk֛Me-۬zӥZ#I$c|{7"&Hzp|e" 5.OSg[Xca[ɽ{<8?ARh },w*[RKc@§%^H_0+6̌!~#.[`M7-9?/B7~u@n)^paxWd &^b@ _g@@X.{>#zvbf;ßAu t@ˀNĕZ2h_ 5òW>b1{5 e@>-tI6ggK>"D.70ȯ/vsUX>b)Rv|ǀLfc@>dhz- DZ(NtyÓvct[|@ίP*Dܢl^MۄG_:J="[9]e0n`t MC]L)2)&4rzԟ%K[ ~0 4 c,$`qOP=זx KAa]s@>@ ] ? ҁB5o a(w\yDUkBDEINѷ5^k7‚ITȽ['Or:5O-H uHT'OpxxC? TM Hk@*Q1`Ps8I!x8w$`r5lSѴ*5M_(Ʉ?fӐz}T-`0 {Cfrπ\Ӝhb ڵi>) M#PY_~GC¼ C*(}Ĩ&?c ;>KƬ@joT<d_?gA8;{+$Vx%ftE#M *\H"ggtV6{V[nm'ޱcԅK'KRlu37d{ݿeB/g\ vZl̀UkG/ւw[p:ZSx 'DtRjwD(HW{TZǜk:QʥњY4 u4|rXp 1 x'lCJ9]2n-lh) ۽1| %<Bt_1\>} iJCVVkOE?rc@6<_5âUG$hN凄ÖO_)mq,' lc^[{_X͒QT1Tjs?%ʖ`4ОEa|gdLb8dx;ژHYHmi(t*`3@ZFlw@֖>'W] ޟy^om5k He@c˫ʋtV:XƸ?6@uRy6;;7*G^p]`a猃e@8)O^j@E>S 7| Wzk۝;MRhUJqL0w)EQ#1;w5&픈@XVbhIo-5S)?Lj$@rNJ ~wOrS\[P>Fx^`{$XQ5o \`. YFKʫ( ΆPꪂӗ>y4k5D)RH骵J̧F>G J[}(\]׿TXJ^<2K:m[O2`էO?Ϗ~<@W;[G? i%X$Mt_ Co׺=yLgg9}4© ,,L=Ҭ]w$~M~[[De IDAT}CYDg=I 9A.V ԡiψ (kB/"MNc@b2  "T$[Nbµ4+eyV ^|}WŒHB+WQ}vԾ?_Mo; ڝP!4R?a/g\ fl}$X[c@VN%0bd6!X&p|>ѺDwy\. MZR|ܮӿ}ѧQʁ t/i%z.歷\3Pϩn T /)ϵh h dH+~qG~k9_k1*k @6.tkhH۷&t'O、$ B 1Cf?RĔHS`(mOPt;:A1Ϟ-u۳!dC f$XuDQC}7mhlE(4l6vOO}o@C}PPt4pz CۜYc}{܆U::э&U)^@`Yko_.u?4Ul_P nPG<mIЀ2Գ$X/O3&Xm7κ9iqq)888 և>*Jg^ cƌ878T8$#)JIЗt)S#TSP`LO 1iEƨ3vρSNO%d^C1> \;0BE+m% >l6.ϝa0 ;nﻸ3H؂r@, M&y )e@ [^/Z#66d!-Ayʬ$XG9̓jΗɄ3ÚR+W6dq<+5ؖ:c%UU$Um'x1z^zKzǦ KfQ֢ ٦Oer++ bړՏS;kն^}w5K`mNTlCۿͦokX+ů;F{2Y')?_~R= [ӱװ%Ih%!UDZK|/( >',1qH1 6x:u-Hj^=-`.=5AJ(&!g_-hQ|03O[֝|EECo,K2ՖY h//3ʳDR0x leIGɆrF#,(@E3IP*@G)/(KwIp2]W㣩!Րx)!焵M87.${AG2@m&+5YaLmIP dk[b+jykj+R"Q aA,GX+Qjc@b*־'_ n}3 %%3fTuZH$%WL g-csV"(o@t)STK: U.?4 1'nAzC [\Cr@^_I0 6dWَtD}tW{77 sgʋv.ec@Tp;XA`e7{'9WztpŘC.iƴ.Xnw<'zs ·ϫ8HrxYg1-da`rd29&d@ ?5d+ûN'|EIMC? vrQ f/Y{`՗O&D&4z m~O>jyE2r"!<Hk-G')|@gs.K^vdz\D»p^#DVv]: S޻Ib`/'z4Y ~m> VH#<"2 OIcW9o%X2H!H*1J)=r/3 st㻤1HF%L2}w1 JaϲmQD@a"er@YJP(cggpOHdAteC[Ppǀ1@3 NoS!/IE_ZSGxO1> 鄓锅,2IYc<-i6 Ƈ IAkE9B\v#7rBvi4 ƹveQHYPXobEMM 7y\g@a}$XĀܹ= yR0ܺsdǀz[DCf.97@L Yi(G/ΗL xëuk$XGM7w7mS|H ,pH,`TSWVTo5Mh HD~M?=՞iV 'wgLR5 @1ܹs'Of$3 >q=^k&r/Yǀ,;HEOw8`mHenH+2EzP j(,$I=?-H@=evKXwRxϖ,!⌙T)~0 ۴\u uMA*([Gx&q*pH>O]L)apu@Ě6g{nPU$>fF/0)on|S~sK@e!Tq]_l QV>/隋[NHmPdUJLhB~KFWծ,s24D4J\7޹ ȏ #BSk!zW ֶ9UJ[Xjf~ #vd1a6TD]Ic -7 _~%ަkSOۙү2 p8l%Xz@^w>ϟ?\*BKq1Խd,`qذٸR|}r@1t֖1(2ODÇ\À ~ˀh I%(_W<$h:| !Vw4$DjRa*$z^jvdV(`ZF%X z5G>DM5&,K %U`fe}] ҵ }qCS"[߮М8 b[}ԏg@ƻ翭~d fcˀ,??r i6N~o`-{iXmxF{?؏6C4>Ru혩,w eD g$YjHᩐD~h4)1# %Y+*ӏ89H |/;4HP/8mϷS\ ^ L~ߝ_̧P-D.~g}uup[5^e@ wo9&QtcT Ra f>oqM wM["b2E3*eu%*1 v#GWyd3} UZoe@j3yAE j߫8;I[wU#Cwh9cJe--8hi{XX1N-qU̺l勔fˀH~rz2DÀ߽m2Du ^;YK`TϞ&Fjt:E[@ le*_wt:vg,OۙүQ* w|F#q(4M] mٟ߀i4Riؒ %Q6dv3:sa}%\h71_BÇ\*ҶDʸfiC4/W0kǀc@BE2dFj2Q\:CG1^ 1EL :x-Bn4:FKϠ#Q{}iQPcȸHy xkhiBO,kv,Jyԛs9``ubZ붏oe@d '''=\ C6 +krqd%WK ՁÇ:c-}JJNԥ!JcÔ$(mv%TrV '+gO)>e{4'<JVgZV\HMP໹ٖ;䪪0uc@*V7+0 "57H xd*«Z7B< 0laoX.Hl{@#5j U)+>9(6ǰXieD§= Ȼ|Y [yjˀd+˷3 I`cpͅ~aDj i2\_{9V ֤ BӓTw_ ]\ AznDAڬ@yh b'rFQPu"/Dtd lml݅-: '0$P{'_.z(Ekǭ6uOIp:c1wߏ*Nk6h6ŸAֺ x ! 4ƺ9> v}t>ղ6v׵3<6vW'΂]춴a>wsm=+Q n1f].UE\TF ׄ^c<8?oc@L@*@k,1 e ,BSj(Jb:uJl\#)[Oޒԋ}iۨ^mQ^uH0SwP7ޫT@6 0͕ H&mD}|3:Y+3 BОsVъa< ] @8?70$o&7>Y^!dNȫ@PRHL&\]r4b4L(2E3~BeԂ@bȆ )ΆW☣69{PV$?ΰ-bql6΁S ф F% C [D7Pkj C/l<2TNzJF>il QDaJ'L}ي4ӷW{9/)~sV錃AK9{%:c QM?T[;=~Ca[$qv`|"P{}q.rM>RnsZMf9v&wLQ5$6!ys%x?G]ǀdUm^C#S{1 I+\z1A-jDh)|Cbq֋V>wN~˳7_UL.}]CDG\/XKx>>UN4LdAُMBaƬ*iQ6SA()6z9 ))A>DWg`!l{ qNKl?HhZ+,KBHEFs^]hDÓASSU>+NcbDBN45lܛeu`jݗKVQDRg;)BP Fјƒ^S /-3fVUp62ܭ-g z IDATƱb  @WDVDVJkdU 2 x;`yHhY% thv+,%>}_|BF0( @ʄSڥ Ѷyl,&1 T 3@$i 4ʱ_)'')gLM3/XKO TTh_q%V!lOzBn{[DamyEmjv(sh:Ü.S ^2 t:9E):Gy:n-5UYaB^n (EH.gc>8@ 2ѣ'CdS2 Q9``4uLѲGq4xZ5M|j`!^): $${eYJZ"/.rZuz_*'nC 乷c<ϽvۈnRcQz#v6E"!K N}U꤁o9;GF EYpkB!c3fP (p)03d/'kf~^;uwO9ܢǜ>H[Y_VHdtsc;c*#JT2Ϙ5 Yш5߈<' 5똦zς%%#.U&9mT`bM`6%v :X$G6#wʟ&,Ah)U'wYZ4T&`QU1oS8b*Hݼ Ap/<-ZP'klY)8SzOQԋ;@*HLԾ Y߾_G4>pXlE  @f 7gn˿^+zMszVy|ܲ^)!o*\1bG y`u/vLp8@eTDn\!pMe|n/s&ǧ P%{ -$B7-ȷߺ /ZůҔ;xS_=[![lSd Yc)KXkjjgy44U4ӫsx)Ѣos0<NP^8Bu;>4!p|~H  4QA! oƵ)͎B`LD)r8|~I@֬IA@օ eDdtz!'i(ysKsjQ!c#Ӣ7~έ?&^*$ڂjE]Ok =@Ԁ?Bպ`ӄضQ$?.P! lH5;8V| \I0b:7! 8ʏ^{M4%.5GL=ǀD-U~Yn? h}yqqA43R.Ƭ-K p,;kWVKʖ=ɤ˺f:9::&dݡMh"YkBOic@M1! pglmX̏ @;]?Y,fiЎe*ʏn1 aY"F -y}G S)}`PQjԽYS3b6cS O5%.|N@jJPX蚜R4-,cܹG"n󜆖 ?nMWX}VrWHEiVWk @ Җ<#0 Gɔ΀D[ˋUg(qWկG#bFWTn?J8= Mikb/a0à)3)@Bs |r9w 27SaN/S]wy@4\9.X:$4MF!pM8X\£O)O ܺ/^ x)۩UbC) b6"  Wxތh9[lhP"wAuR3I'-zc@$OS~N3DJJu9;sc~Xp4qGX!sRn!<`I)|MIB\.9]9),;~k9sߪnWUwۯd` "D(A0XƊP  XX^QD£ =nus~k|X{oUvfZ]9Z' J*-y`:GLz+ W\yT8o!J{ct[ՠbZho%R} @IXV71 }NFSB`T)};6j/",F]%ɦyV{Qgd̓A.v,{"]?XʪLe7y+nyS 5 s mF }ugX  n! ֲ}kxRc$; gp!N GHH;zAfx&p/=kBDRtxPW_5r z쵾)]th =& _#?XonZR8qjYݛ+d#rЩƜTƪil6E4Gjc"/x3UEG(j泫:CtVEb7.^1BaBmi[Au@n(MQ*C(H6kvy69z &+Әc@}z.x v+rfC|<Q0,fשBBS^cc `$ vՄ)^n}|!<cq2aVS#᫣/EUFQvվjա݌wj],[`-o5Sz5 c<@}@^"%]ŽϫT+GC}°CB y05x&`<@GS3/h>\q۷ma,k9ey}ˀgdgh]C:N9Oۆ 0(PRh;`g& 1xxt=}6@MX )Ncz/"Ժ5݊uo l2y*j!Xv 7: #w2y23%N `ݺu멿X7ʒ>nx(.i Oⷐi͚Rw+12_^[ ^꣔"JeL&6׹}dѰ,Bn@]>|(z1 &s0 qܲ6#vu~_HIZ@s)a Pө(Stum{}E"|du [v*"tT ){w[ h @#lvl.al2` Fnm)łnv~}kޅ3 C{睾w$|c4]ywi RFuU_O@ފKxk{O~zؕMو7GEv|u#ol0L⊱3j@ٯ\2LL)8-y 7–כWQ\ Ik(dl%~쪥ӈW^sd[_onjJ )tnovSYu HQC"`)~ymZ:$AQqJL:B@ dgh\rudZh%F,;:$V=!dIRd:WEMR %Tb@Z̪3F[R2^sϸ)ףi)ԭÔyEHÝAt099x'8FJtzȍ|S`{)EkH 9ާe<*sMoR )g+݅Y˂IѠu\`[ 戎B6 Hos-/%T]yn^ "9t8)bEl3k .1Z'B@`PAMT,)7# M~V#sCL#S&'U)@ IDATu* )T.LI3=vpS4HT6&}݌wb aM'on,_S߾\%7 RZXX=@qk @ p `ؕ>bDæڶ]1 K"OJu''', &KclǾGj@Z8$3;=vu :YoߗH˔kkI d~j ɨ @. XbŒ(ʽe|@JhT eh  ɜI\v-HpYCű)({xW_' BY_s, ,#,M,*:sttY G44*4Po #< s1d ȭxێHgz_$l+¬"hZhI7U''4aFg@t` <}Fԧ>Elll?ʯ |#o6g__S?SGWm[ۉ[d@\g#Zeesp@E ܀01jd@FىwqEt@ufYr}c#=nróDfi! x}=1i_~ICh1Fw7ؠGѸbcb.OɡM.:ZI|cqn37jz)6lT`D[N !⁵-4=b`逴!,fvNe`<;2HO eg'!o֘ۺ1Eb1[;1c%X`lfc7 @y\ B%(DyeZ_HquA+ wm^e\Jz$x4!}Ad JuDZAAD *%t> 8rt w-މyTv% ehu.(מr^+K~oƀ[$v e߲;whE3ʲ$X.k@NQ^ SFk9rrC6ͩmӢ6ե5 0"~p P2)ac?#0b&\ƒ4d}GG D7p^9K3کBa:Br|d@~?BSk&+Z1 Q̊Wց6V0f~1fu~0>@D+ VGHڱ7KhAZ@Cj>S@\yHdR/64x5#=ģ˻ׯ_İ<:qd]RceR7 00k~D*o))Q/3(5 pLZ1Oldv&S.֡9MnUވ' x;[U2-D[*0DʀDYF6iH]Jk Y;R#_51R}朒<#n3lPͱ$ҵ+FbrhǁG8 5!6yPuƳT= F2:@IKoX!ހ:j@p+:($e1ОנQk3Ì~,=yՠwH3 ѸnV3c">{ n9Į?$krpkGYb 3z-%X Sd>ZWsi`=Wt$8ezE $LuAwwQ=&G> Xր: AyKM-5ebjl2KK*J ݘh|1Q;{3pAIS̠cAdhc- Vc]VABwhqoqՓ}'C6,T%s/[@^{? ?2^g_a]ӹNf%Q6/G#1_05ǧA~:zGi1l *٥Fd "2!PhVTmR3}&GszOMdn:U \ԶKv/up(vjm蔝+APrwn]""ǀ4`q]BIec0B|*L>CTH*rQR)&1iuk"-ߌytY\~HOeB<%q璹g-Bˀ$Z\ @#-δf9џJx#Dr% %b7p&L dn>D ȵkX1& Y9،3u{{{ܹs_Tm?/`_oxCq6+ܧgQp-b?J\rRyzZѶ`MB,4CyV-=ruu`HִȲ\1DU) []3%瑻NO^WЫ !x\P3bS rg)&uXeʲ>!О2>x }0(a@(!q]=ԝV5DEjmRco`jÛ{;PifFV} M o(EO3^!'''|y677s??ɏ؏ꫯb _[ūʧ?wgmEsgPJ".<^c=nyrV(u6_/ }gI @ hZ{DU?a 3Bٞ50%=J@/mNZY6cw( i9a@̰mB&m^WV怃:MFxRM B[A8;0 yβǴL:C55j]/nwQKh>eT? (G>g?Yf!??`0 I~7 ॗ^S˿؂oX_t[OZD`,,$y* VO 1 [T&HT؅`@2\x9s;R_'1g4:fsc=࠮R Csb}*v| wcme'W H.qSݧ>π K:(GCiw*! *{l5 LQ-dP I+F]Zm'mY*ޥwr]ʫ eSy,FZ>^Y.R %S0 $I.ys +. 1|;@QDQ(L&yεk8)fKSgr087mL3y&Y,>uS#S ]σ{O=9<2h#}o+O\dk@_ eH(ft]p䝽a)ƓUƩqV"3_1C$%eg׾R2"&U^BB |΃%٥1e0qJ$e{dU@5dS @vtu! %o @NB(G1,KQt4hets'xp8OOߡ+z `@&_pd@/`] жd~>`ɞt g5g$`WZ`OPO,T} KuP|G"chK[6vb `;\+^5LJ؎FyΆD BUe0p B,hN]"vl DCY]EKv&c9j]Ɋ tEHq=fJ v /=U\aib@h-#7f W(77Ȗ6U*+'tD.騢D'4@c'h"jjZ>{A5JH* vVĩM0V ;9.ٍu²7ʀBp# \&ZFOJu'2 <#:-Ve33 Kl-+h>tj@׵-HӔxLܿo7E_W#/ YλQQ;Q BB4 ((&#EUJd!6Gmb@21RdB'9xE*@-U|wS*v KK:-%~U(XF՞I"?!$@"U镝`Zw"CfT5^8ܷM eB[?:!hD Rio2V,#:|)e@*ӀH˒K \*8w,c@]\PUE{]*/RWm`<4<e9er'ykTLi HmVnB$Y4L}:$y*1ۂ)iDJ=g@Q<yo; ,[ _3` Od@ E<=$ ^hLbHYd1,f4 ښ|u: `;Yi@vo33B6d3<ţ`{Fs Ab7z. j nHЄ ~4K:CkPʬj@BQqo򜰫inW޻lZFgSQYO=<:n B+|Q49l7wBU7F}E2Ij{-uP6!5u* l94wF!0R !5$[{: Sְ Hj6γ5 Fb2b`0I;0:ƑO6g.1R*3 (xuܷBķ޿fgg!zjV8޸iXugI27xN|W/Ŝv?loc2#wmC]7Fc< vv܃^~)U.?=A}IQ̭.V)a("n KԢ@ ;%ve璤!Ju_ՂDWԑTi \Y ɣ$X"  Phq-:C(4e@bFC*$> g<=E.B8 VDYO*i>}cq3VEœ\З,%./ǷIr5 In]`9O2 Ha ZS5>يA{!`ww8dQ0$X`kK-qG   D4 kPIK4+r4ı=hɀ'!q5v=Ih<,,B`םA$ʷd D IaEH"OE JՄٔ^ޮj@|t}dn3--W!*-0~gRbd@қ2[|`3b r*TuMϣkc9=1@:%B/)^ _6р6 F`mfsi,QA5F0==xF~?Fl8t^)7P99yo;m>~xO |)  ﭭ=W#zַ@cҒ"B"t?ޣsv8/$]! [ێzͣ(╯$SBcK[pAbEã `^p0fc@9|ﰤWvv3cD0{@v6( %oHHgO~Awi pFB=h P݌+i NTt@zupQ_(z@EzNw_D@ea*wa-*s( mLΘ]{|(#-2($hy{A%%3@BOƠAґO[\N6=[Àr@>T+z2&zdYFێX:c/݂5]0 Ǒ$axuu "coX\l%xhr0?n9;;gg,7{rzz 2o` $HD6sD%M| Ovk/Rwi`r<??V™x`TNIH ʿ$& Qϭ[h[4Vdˀڸ?SlDaɺ{\l|4GpqQC=fIQU;9 HktCUB⾧!3>֔C Ηfn646௒W?wgY{SJ?·=Q)zIJ&gj*' CUh1v.~7lGBG!fCKz)cw5;Ȼ @AC25z_v;(BkΒ!-$k %qrb k{9yUyLP`eZ(  xw<{fijk]`{ w-Y:~~%sddZ6 z_W;u0P=3 v1Ťd@Nj"J a)}G|N߻g#愺㘂 YPѶ?'sFx5,[{/uLO[(N:_!L SI8B,AG]qԻ$&l͊ ނǩkH Zd+wG2 &?g|d~-#nxveQeF$lD8Hq$nL16iܛfmf# 3^\z߄`lb@7$8'眞ry~IC qpu)YNwD& \ aE=/, f6&|IRkx9?3焲7#"D9ak2`e+Lz oh7 I7/#nW=SLOFDaIUFIBn@JK?Hqr'X?Ir5;.'X;R gXYXAX Hf`F"=dL36Ak HQP,"E]vy΢oȜvϓ13_,{`Mɂl ߟ*ٺenȵlVse!wb2Ix [<{_:0Af"0l2/8SG$B>m,Xqn%&5n:fR^ӂ5 ¶sn9H}b2kEYOE^$Axj݂O%k%dG7$\^oU@`?%&wDOԽ& /dvtD1CB$%Ϟ~ٳ) /{Kn}{8zar@r1**cH@saHf3ml|*7W{5/_ @RG[ggx>c?SbS-,&>լ5/xA؇|YhӶXV$՜F6}J arTρNf΢t]J0#'3FMȳkDa`m 1{ V(| @YP\8& +z62CSϷ7~ Ήc`eq @YI5(p'I{ ? 45+ PD f@]CQfJ c~E-剢'ݒ C@2re`M̩U\YvݎbOch7vID8DTE`@>9s@㗎)]6_&S)H#egwگ ^Yf5EQo.$& ¢ õ[T u{ZQ/3k7T5>SssM/Qً763@x0ZOBH{:tHVf"g"gddG2w,X p)1=O()ُĠ`;H ` eOׄcM QQ+ڞ@tH*ٸŞh,K:-FB!ipۘ"X*t=p}wc'֚d5ϸ-2zyS! ߩx+}ʾ6D A,wC $R#F#¶ X& ÊCKrwYH_^^Q@ _.^^Ic\I1{qǂNy9I˞ O7,XtRw5x?"2E,sq55i,X>Aa!lނW7I]J]qPDF6~\,p`U*ozEU<,Xyd *7_TԧsC8&$ ߲`EjH[v< CLhDٯiG ='{$°<`@G?͗̆]ڑ>P\䊇 }q f>lX'bX(r KDSZ[ P$B^ _½Zt{Ը OIo VEN@6֋GX{Dׄ~W\ /H|'+kE%|(܂R@xu;3xI+mX, 9( mvIT0U:(8oEʺIwo"gfc)#k 1bҴVR)R_MCN6 p{o1 :faE͆0v@8\wqucPBQ^(1â9۴AHP5Bmxmpl)EKlmW@,vAc'3*`IRZj[Qw;_xWؗD-([)m( [d#ƎTp!݅YPdŋ3Lo(E5&onK|ÂIfƷ+ RR:񒎎p o&q'PH9.|%ʨlE4R?2qR @d1P>t_s(" jB\b`JCCFk}@"vqţ`\Hk1' q~àh#JϺGH_5&c@Է:D*g$"V}2~Mg> zo 1l'{"LH zrd]2)~WҲ 9HEEĚ4"XXqxAOm@Xym3 JYUdX\&j+ O+xtL% OB ołUA|XyPϰ1蒗ߖrss"^' 5%mDwDJWoSಁݒOO4ZLU0=4tP1%1~7P+7)*5"D{ನ'5C FHI;OuH;I軧Oà#n<ܐ)E:&j_`hXұ!!fXA).9AkLE9SGkrF丠H8 蔦2%[&w '2C>*ı̱h5# [Iح)k_:SmXRޠw@>h % -6fn|?ľ-> v vdbˮn:$ }r3@Cdzt%WWr"$A Ղ堢\UGя"h"0=+ܦj6㎼483rj"@^TID@R GKAEZ06vj{e\N='ĺԖ{E# apW!lcS(sۂ$-uaCUBe5V%ᳯF񔥡= B+l2ǗB 0(V"A .`ك8[mw$,IiҀ@PۖS_*Af&FGdI< xk @㗎կ+|K)qt| Q&^n,]Q̯9@}>l$a(:Tyb!șlb7{e m ח) Vgg{u,]^cf@uk,X;,dpF'S !Dk#bL"Dąq )@VXܥDȚ%%GnWѯL^Cv9#zZ½ɔ qI* :f4?y1,‚@JTZ 4,Cf3QhaI#Rc-[%"Sܷ@--H"4P+jz>ږ7s!~#&kkN:;G͠m݂mr}}<9w{ Ee``,,H>)#yFQ@ 7! W~H{-VwohZP)Kh6zW@"Zv Hq:-X[,qFBDq58$bpǔv_=@«7à%L(D#Dnw`j]׳7 I#upAY̎` W9Rn 8n"\JEJ\ X7V: v<];]."%jZ5K<]{a@~W_w@>P27>o*bޚnFQ- ]#<+ "k 󅁰y#d$IV-Xc5bXn ELGG,;b{0[J4 K0lDȊAX:{ 2 &)k ( tTxkW+X.ڽk;rW@G84ʲW@&,=^?F\pYYqDo=gM=^vHF#=z:$^ RH 1E~ BC=(p]$p"{x*i-Xp{cpmbҡ!w9 QS@4#ǝׂ3dH`H\mX%}&ʁV|EF݂*&ނq Ifð! 5TAN R8~+ώY3wYUy k2(q)r epU֬(:zb%GM T4b!;Vl IN+TwXHrSU#٤ q6|F" $ CbF% ) Q- ,mM hO w]S $!(wu쌣 #f=@bD$6<FxF8wzv !NB0TN{ o`%Y$tkۊHEU@d$ |d6@;U Hm|#·0\vgs XfIa*k3 SwWbɂwGS5#41==Q~P@B{W)\ ȇ / ぼY`S=;rLQT: ۈ{Owa}gd%v;1V@V+bfǏ]JjzkhVtb͜]а~ )Kg{}2n72@3w;=% -Jͮc;+lIn-W]"d3Gxd%/(5 ey}AHHb 2) #09,bAHZwTH[w ϴ0qVvڥ2AC+-Cl{! ځa2 kr}@DTF@Q:E1ձ)˻uPo6l@)>aA&gk` ^S@>``@j :MD zB 57 {:6!-3.!)D=E/MoH@=uYxCLMzݏncg$ԑDHUk,RBw-X/9l}{q+k zK^"p [& FXxY ;SHY-9 T|7D`PהY603#S)5Ac)kWXpNsJ lYL"w1!eHɨ\HoϟW>>)x`2:-6? B8++ ZjbYؚ5M~P@PGyxk\< <}ݮg>?$?"^iKnd&e/CNmҺI]Kl [4_$ mb;oH8"Xzd&: E}%sBRKLW 䩳A=>jg K{T0Yk<_ #GE9ȹ?!cZ[1$,CnXkn&#-Vm]Z;xW@,iBIpr}/lF>狏bb:tRV`΂Uw4NU+PyyO>+ MO={ц@,z$IhG;XnU cځ X_iWC3KOHD}ūKKf}LF|$ev@Qء힝|qC?*"4rwr,J7UֵT* 4 }Obނ>y0 hw_t#5M!DM`G"_Ao6A W?nV"4x) ߐ}7  o9G '+ PUTYD:Ul ;(5 CҨ2ʑXpNsqKmY=c.Hq9ERbԤ/?5}|RK~]Y0 `v H]hQjVA/z0 ,g> HpX("]dk1beuaGj8( T|Օ;ryIK2 fXgg9 VyuP1LA@UY~ }#t"ԾT5 1ܢ? "zU`Š.0^ɲT?{yrQ_!IMk_@YKmXyBŴqUN7)KBv&/  e"EMd IKJ6M>}' iAx>2] #w@>Ƃe{L( i M]1S ۷&HQ wi If{?nSǰ c`q\;;+`>uТk7עƎw.ۀ4D,#w~UBr Q)y&A;L9 - HG4<?<q?+$q'쫲lG&fDo"D:sUu%300fMn(҈VfD>EJa4 iRP96,bvo qM㕦'[cd,}#VEI/BZ ezߛ77"-E6 O^Vt#sn߸ C"L*e.WnAXZy|ԸI]V@gXx ֭O7,XYf=yO;YXX,5}lcRƶnl0a-)#aqypֺ$v ʒV%,)C6ۆ9 2V_T۵KI+ aҔTHA]"6$IBY:d `0ŞRqnnK Ґy&ƒKhPpVq>9傔&!Jjt{b qycٵ}5d.K^ێfw ~qym insy݂%X,NI趷ޫ"\]+}*oa݈ߗ "f+R٭f_k/ޙo08)ýn; HԀVVb3FMG/ď1; :,䳍좀h0 {XB/W@,%#z9 'B05ê℡u K8 ?FBEX0&X`E-GR#D p1|xG@ An` 13*hJܿ4u &=3&4,#:!mXXIz0,,)u!$Iq1A݂6A= '~; j.oӂն+ aH; n \M4EД'RȔh89_6e w&ȮEWW;Yv98wy)k}pU,1!m)v}hGdI4ݵI 51/ @tfIZ6n`mC(dPӣGw"&j ccf g<""'k! b㞱0,XiCH;&fbVaW@*1݅rci[R׾fApQ9 B,PlD8%uL)Lo( B D$0@^`Mb|f* ՛w;yp`f/|:L*a32*rAmUIJGq %GzlAANN:J6G=ҬYQ@FR fBGlÈ7tqg8Gkգ]DD09kn,W ?)OF 7OZ*kHSO;Z$a$)1of| 9 ۓ[\W( 'zJ4_!D2W"\{MCkC*1beg\]= r3H \]v۸8ʏ\9aQ<} 5@(W@lA.]bױqTsCTUOQ4gzqt<{MEq&MEYb2Qpy > 2$YiEԪJ!.A:D$ Ig%OOen5mlJ!J\'@ vp7)muCJ5Y!+pوkg[{1gBe7͇~oD(/` !sE7M)$C[S0ƹ$&C`0hM}Q&!Cj#tCgpZIzs>g}_*XaȥbDy< tgΜ:S.†h#dSe$" |Dr'tZخ O4NSqBT x]m3\;%=~S{*cv0'lS&T#a2x>(֬W?Hp !R{=cAz $YDq8-UYs@ݛ@L z'It6)GX>W&VbIG`@cv6Y̴m [ūÙ^ ϼNߓ+~ e}zuQ=vl̵1|LJA΅sBp$iZ3C񱛭Ϟi>3!t{W2* a"P44'Id}݆̖d 56^eUՓXQYR<@Ƶ_u 50dy, ,$Ң&0_ sE[0lR@ NKҾ2rY["$ @-nPş<56* CڠŊz4 1<( ;y C 5d,,3tu,X䊾RU0$tm(tKfSЂ:V1eT@H .9@ڊ.IQu,{}͓' X4e!-X Z%04ml` 34-GYHm"l)p a\x|f5>O(0%R&2 |7: V dd$:>s iUM% ;tjqR1jۣz5 X`{|K-),&d]1A[?:T @6 #y(|"w*( @Nz) -ϰaLy },X&«քbȫ,X1c2įE3)T** w$X %pIq+Iӻo{F&^jy~uAXD۰QGFD7f\\$lԭDՃb~Y~F9gƌ:9J/0%v@6jU %CrU}Tڮ&)*&o[4N__AHDW0ԴVC!̒06[:}'( ٷjЄy@ A&4( '>.6ED]} yZN*8K#k 41ﭏcZX<8g* -n)iT6<K pqp;d 7H:|7 ~{}U|T7YFx# VA5@X999 2ԯڱ),LX4@UL> C|~8/ V2ȥ{4X><} lfK( ZPC:#,=i6<=@d9pù z2!h|>W09hdVDłd  yJ&5TgYţG'o\4 Lndyf]{Z2Ί3>~u}z2C* .rQh>8ǬmQ:\cB"f|LTX96\] >|1Fde%Z* c5{ "4YT@`Aq`K5y1Ga]@.Z9 mO9.rU_qqY͏7IB@(W=&V aLBc%B<_p1@k+1cFTxTY3 9;UvYr@&''g6oIhv^_7Y,`[2)J`;iwȄ|Ꝙrsg@Ŧ;LN5ņP = 4uL YGp}҃  'm[ :( Q0oUhx%vT@LnN #,ʚJxDs} GacхY20\\`7ȣrbP.c!ޘ; [5M,X#xA/|y(K:e,uP((@5,^wFz|-$ 5aŎGgO|;@"g!VɂYc<,.rnxD28ih) k H6.=b* ]$,X HL~}$qT...X@p]؁|FBm1dg|{*M\`|%kTTI)G00PrYbє 蒫+78TQ`%*$WۏQɘ@<6 @(ubdͪ:@lN/T@ $Z3zsgv2ȕCT@@yb**D UdJu6[u # ƴ8/^bpHd QP@Urkz"n,7 5 SiV5XkbA E鯐XL7c,X+ oroR&HY|$Z˰71?`i|cyxW P4 |' 8X fw.## ?,ȆawӔIH|#'8IGc,6( 99 _j`eYƜs~~~`lYEglyL2{ 11q^p4(Eғ9=Ex9L N+$F&8HY )Pg@'5)?fZa'gj Q} ✧S0@IĨ\_U"RIdO(Ԗk**m[~'>!A#{S, z]|l^dfN,7T@v ?*Zf Ub]VKdAMvrs^cBX`7N%9T} u^tec/lЦ=sl\L3Z2ǔdXDžԠ:Mm<4%WN"Aʐ2B3Ig:|톄V{> Y{¡c<&^T lfX`>; :g )"%o[,r¢ N5KK}̛FKT*9ig1ܞ"zi8uM, .Ovb .'maiT7is|~qØ? M,XcYտ9fuz،p? }>M:erςذ˘Xju ggab߷`gg|5r|"X`}`:gA9+j52\jhk;cG2( ކ ા,( Ƈkb'vd8怤ic*NsQD3i$1xт3vuhF+V@R/s H;_"/}[t@Zv;H.:8B$/ӣ#D>k+Û{eW ׂgg *"9:Rq1O5-wWhq,&1&,Uדbo#Wq4tyΊ@P]u)gw:$v\ǐg&Bj8_uQq~4iEW=dFeGHgrs$z!A&HIyԥ4Lg1挾lXƜ)ƘnN 偌I (m9+ YLm`JZ 9 宱378'ؿFUxB}eT7GՏHI~2Y _dgW@h::,( O~'WE$lg$O$DZa>[3ţ^6騻 0c05 nF9HWB,EϗdX b> p8N 3 %'"!hVyCJLt }ʡ,X:B&I'`nkی H D1%s $Ou%C-881ޑ 6$-t^MM҈2򶝬,9BmE d?9*  f %@ &3԰uN %oðHv|~۸!|O>I]X8tȸ` ^hK3΃ YE2kQԜ6ٻ 0kRcebS@|2Vm+\hYGik swB1,m})Er>0qǂQ^i#2!@6Jx.29WWW\]]{!SS5DŽG4͌<0}y(,29f*#NO) R#& cjȠpitH+GW Ƞ!Z6@݆ R$S_?xKw^y۸xkw^?,* f}}d${ HvmjcQ3u 7RUAIn ð@01 Ud@EdL HPp~~0 Z,Ј07y\I>D]%HnfC0|x cY dwEJK$MI@ Sc:xcV+e&6쪣7 [$zR哿 hJ!mýj- H@QG;kA/ie& IDATetũ`EQj1,?l$Ud!膎?ܭ E6X{x,X#o["@@nzNP-X*Xq,AIUK">; [8( NLKiOd3 r0ߨB)xђY?H&%Y#XFY",;ӧ:GGEhL D0nk gEF&G4TR8'-I:"T8Gړu>7{{&05m`i y7 .>g [VU,#)O9OnzbT@n3RMǀ7_":e;) LOֆtS@R"( J !( dZZPWi_- ǢexFkv Tt<<ăA1+!y0ZdP@}΂Mғ%Mp<8 @ 'C:4.mݒCK71Y-Lc5}DU.@b$W@F7l2s4P]yBq> cI#L9 Q@!LHӿUT! I߽ ڗHRkAC VC$?-X& 8e Ѥ4Ť+( =WTl ׹93DS@1@]űqskwysTuH0?]\ J:( {e,3#|#\rI>$XM@Czl ΣPI,X iҢA z;?U(U6JE xm"IZph2 -Rj(+zI;9KG }60&+H\3) OO1Yf鶰6x%ٮVg@lR59I,f{VykٙVlʶð 9 ;wz0ٍ dv9 p 2B~ v(;,{e) CJÇp~RBei޳ZzI63rR@r( %Yp 1"ZģsXZ9@R^%wA-tHE 2IRޱ`CO{^|( *oX(H* ,~6$6v`=gm.g@ M4)݂ɚM@%7 K'PW??]>CgxX1gx?4тQɈ-ḑ"[*WT.(k/EN#]IC?Pákz/`!Xis@bgTlZ١"[ĞRP9n7j>ߧtML,\3||vdjzv+&\4rMAeHHӔpmys;.ܣm7Gin:* O(lcfftɟ)ڠW=Lgm΢K8lKCj-))[Hx`B \P f0xKGJ 4,heQk4#TGrD:ODo!g=c da`'exùid3iw øs:4sP5Z𢥈 w#O✯_}g wI1TѪ%Mad(qg 4rbnP( `TקG@ްH nST>0BXkɩ} ƄI0T {k)ǂ|Ms,iq΂5ȹ!٤tEY.//+^tNS CK( ]_p,KIߥ ,Lt9VΚNmWF%[g--{NhƆw|N)K\x(gs R^cEq5 6֘dP8@ DIx[|{~6H &m;]2HcmzNb0!E TV)~[$}+%$>:F_!ł}v{k @Ԅ,BuI^/j-7*f/V@Y) =P@pP&[f À+  Ç;`Mwhh6sCP@*@(i#v-3'$AX)#2 q6펎n Ki"ϲ 6 d b@~|"W]H5۞; p0!ϡu:* wOII\вH}Kof cUT `d`.( jcfUc%w,X߼&λ7NBDwW3M*$1tEFm[{⦆PsW) 5 tUC+[x~}!Һj9t͎zhdQu~q1HPr$I͞rt0&#M㵱@To.8K:Lv-_*o02T7,ee==6Ttl#6'2TS4Y9BhT`aVz N=> xjT`H]=( dĒΑ mi@HlGQ "*x!ДlYiP50`dMx>n/QOD1P/yorocQ7!7` Àw'@k Mqss3 S@ʳm$5{+TRBptt$Ip#;KS HHyr-HӔl@@ 2ҡdk۶-Z{sg  % jp x0$s} A>UL:XhIlZf&I{8; ٰ* 5!* S8Im1:w|_,?դ4&䆕= 4-JPIJ,~ VJ2gy ֋P)JzHxiHӠm?D5,>LbmXJb>TPvhgW@w>TchI2mTUDe`-QݷW5yVr7uذ˱toS@8a (}v` (?'MS8; ?={ƅwߝS P ?%7+1"̢PQ*HBL+%m$2MQkmr..8l$!Nj[Meg0yk4Plx*>hCvrtdR2mB="mAц,XfR2zRز HP@̣RgwBoȁbHl@dnD&wx) 곿ǔ@ 7*'''@HB΂%eB||)_7T@w$ֱ:̑KЯ*)-[=S3Q{^dfͧ_+IĤD^5ٳ7tq߱d;p`R@F ֌-Χƒn1{eFY:ȡbz{tg:AoQɏM4qinY @ڶC$H,#9l3'0qI2s?k ־Q`I/f1W,>VX{QڿFgq6iܲX,Xj+RT?c¢q_ٷ]kT`)Tc$$)Խ [q bH+GS7E݆8mɣd3:`I$7R8IhpRbY I0@Q?ZPA@DucҐ"c ʖeIV ׽0U:[΁_ۨ,37bY"`` 2YLvT@^ q C_Kħ>)$( ~gW\{/ł~W~ۿQƘZŐ2.Loes_,%RH6jm; ܵ`3lɂ%A=Kr@q0.et]ҷa(akQ-u+r$#,Zi6]gpG .05@< Sk1aԱR\-MrHiwkdDjBa-sihIit>}VsT&<}θl[)YiJOutP@3]t`j Q]N&K)3_*^gP;Bk6/'9ԛjPH$t]G6E79 pygUOn ȞM-Xoq*( hz:S@AQ TbJYhX*g*9M|j)ə>#58!0>|Vุ萲3ps }/#|T ۦl@n&T"k@@0Ppl̯kL`,xQ|aU>I( 0`³&Ii jlɩI\)/T Յ=MgC"- ٬ŀ,[k3(OQJM9 f!;g5溭[HRHV Wl>aq CV+~'~|+ٟ'~7~ߜ~k__җhۖ??WqCx@n>]Ȳ,x2CZ* RHck)'$n>؛t > ,! RS+r@Fݱ`H؄ ;E[T@F lZV8 4]QE#3W.Z]XW5<:* pCPP"jYb2|v'˯k{LM J_bdP@~?ɰ&y~тenY%;rOkDžhIo<9ݷ2&/P 2oA#x|>m;vf|>9Gx B H۷CKci%I蹤ZDN0Zؓ'kNa ,qEhbNm?㻓2h=}UdYFs@wfT_ Ru}B3FIIϰcI> bW@.r`}Pl}Ό3H'Dy'>1Np0$|xT" <  >gQ D٦9A9 Efe5ZOJɂ5h3ꨀ ld^CS@LhDv,C쐀h?%C75EUtXVB`J`*Xb>Cv0,bY=f I*) ,C_f _:O?E/|yw?~Bk͟NП<_W;Yhαo[ E`d^\. e)f:ᦾsg L Ȱ汖]wgמ9w]*81yI#/5QhAbմx i54"@QkEB$*=ÞZXksP.]O|o{tY{}F$qMӌ u-XC@d,Q3Y 1Xq|rlHQKv9R#vDmb"aOrVh D)8|N2,! ݐ,VS<$'r@lm!Wiql( !˒;MUU$' ^ [,JJ >af`-EZo۰`(#I ]8 PM tJHٛ^ @nqT,Xcn ?W \NY$ִ,]LBz$e_` 6$N) }e! Xõr xw=UdYFkZLshy=-.INrspp % Iҧ=&,2I, ef34&`B.rpStVpcsFawܱ$M_vĚT@+3O<s"B/( <t9 ٌ,oJ2( {HKIXCR&Ƕ`MK(!# Ri9ބ JD`,sPἝOR ĕ=<ϔvPga*vh*:H ;\kS@ `43 oGĦcjYq$i,\=˅C@ bTA Jтu) >VapINi]:#,rVx VI4\~A8Y 8ez>؈)%[svdr2 =T}$ӧ?H҆.NH>1* F8|@Nge,HT!bHRvXB*>"ʠX>m!,M`S]ĭ"Lk$,ФLrT@vMZN_3n%KW._. JP7A΀|9-ܟ# /e4A?u~ޓ)ILF(EɸHSr^<98 !(TP@%|,AXK'WOlhDt>ha=Mzt%96svCI;BDZv 74.[+ٟڮs9::~7}{ c> u]WxOb Ogڢ,礀 o>r_w`BIm B,C!А6J@*X]Ҝ`A `EClS1ZCk: UǬ9 P'o-` 9 'P4hzqK!IliJ tE4@*X=?*1z4*4.k[qN ;ȆaVZI l%[m=˂Bu#Il,CHW{6Cfȳ9 MP0%XD' `2#( ,@ۆ^ ڏUB8EoZL~ IDATJˢd5*KVk [*줠1"m(_P; &Lj}ΉrCeo1! K\]xP)ӆ RxAvD\jMkhJ<$Ogz + BxdxvU$Dz!W8 Cb6T;㸽=^` :7$L9 o"\kiss >s2TU\ʢP S~ Sd vcl3gt_lᰲDhAl~v滾_e˾k~gwı|~+??pLbooܱU[%nEy$aRcQ$tX+ !>BD,Xp@K!DrfnX{|EG/}h4ukN) Vh+CQ53I]d9'Q_I'm?i$@*,X4 ",·M `ѯD{b ٢F'rA\ΉB/E."e,X(:h[-dsQTw!p8#HL{Fg8:X^L,XZS@1o[Pl yr@8:d%dKrLBtO@̱Bpܘq `;AeGGG寭Mr({,L b6GA@e%f$eo"V|VC4Lf܆@D k^  ገ'zVYB!ʛv*Hs @ELDjr.$@@({O :KmhD`p1M{KϨ# Z@ZfHS?* -PW}JG'dX(Af q- 3_Nc)η|˷?Os8~ \1[ @NyrӵPevg7E!+ [C'tIp=&9n:+RЮOV+0Q,XC *&&MZ+\$rd0ȔD",@E>S9j! .Hߣ.b 8$ I':B M`'Ad:٥s\\ʰWdFA4s If ψJtg rJD2B azŭ6F>Rc5,X^ y RHOm1dPK6,ex+3g3D,I`r#sPGG )0y2S8fb?F%x!㝷2 嶇q `DxEE_۽sw@xa !2DFa& x.FSЧrqL@?a-@D09nCd ytSAfBsc VDe7H?eR(99MD)9⼺$tGW9'4 tv6Dư`3cAK[l &#RYتʌ H!@v RflkGˊL&Oh: 7#n$<ϏMH6?V F⮻⮻ym׮]C1N__q񶷽YF {zgqr,=9<ՖB(1Bc9 cexS! ֆSVg* `-X<p+nEҍyN#lҔDD8q%RcXNDr@&JqBB5F1l0TDbαږ ȓKܬ Lt,1Q_ &Ir"vnA)b,Dvq0{PQrQ pe2--ds'=d8NU;X YscQq_^ ,ޘ@Z~º rpajK7@G (X Ĵ6Tc UPH4̉HiXP]˅;+.#I.pI0go+ZL(mQAve 8q]N :` AXK)9ۓF$@j 吵Ba(dI{%Ճ*Q;> 섾"ZjP@D\\U;!Gy]ECBBSu{YKIDdX[Rjڢv03?؂.R<˸?y׻[Sگozӛn~^++<üu#˲3m +^qv?r\E;F֭ I n{jPL$ńdtN&k8 W@Ĩ -XHVIԞm# {YO*wwqJyq.r=+3,*x։IgY Vt<#?Gy$5vrTYв*4$D!*t]-D} -X1e6*ĞTYHETd"=^ٶB.|X@7D6B' LIJ^y?I\'L3M׋[m|;^H,O29$Q2w%w^g3(+k87 }?TZCy V3Y+ =W@nĂoF|t$;BU_;}JX'٥@VP_c HD!dSs͉UJmx(./$k;h[,%#I`z.cb 0nFH&cJѱ5($ ;E L8{ZY9 H]D6 Y RsUC%R5)Kh,+}rױ7WhT@&R@yZsqzr Jtws=/G*X)WcWO L ś|/?#o5cL|uG4ni ֏؏77g~g=K}j?+R{DQė$|R___7eϷݠ:" 4 ֦z ނ%}G$PSu @J9 ۇM IDCҜ`埖3{l V))Ku ݥJ.Z㤓& ^ÔP鉉s5<\x!9 mmZsedhV}B? 48a52HB88|^b >%3Cb,ٹ0+C(.vQҺJd&vnLó߇L H:D~yVkuizؿqLgȳ-7Z2H@ k %e yt@8mZ\d9 n`aq2g* |>k k?4Ayի^k_ڰU(1s[\کm?^LeB qx?"hb/tA!t:ݔ-D5wRU&Mz.7E⋑׸^YNoDxeólcM-mS""*Whj)7JOJLXl* (0)@8E'N;s%=awSV+YJБmU~?I-XƆ.ߗt,IҴtQO܁!'"$tR\qRLGMX"f߾r5Nn%nriKqqK+ ?۾+^ Wr~w~FOOǼ-o~臨ܹs||M?C-X~ YȲLY.f) 0RO Wes}'ϷZK$IflO(\%5!c=}sVQo?,XlW #c9BH:7 8yloީ?]yZ ։> }40$Yi cJ q`ִܿL)m-s/;N}UE?[H9g( ??Y ȝݝOD; ߰` 282fR_ [=s @"+ ?IA^ulu׸%ɰAhm:롈KD=pu~ bxBsĊVk X9>g>}?RN@wNCΝoF)cvC].ZH䢠&V1 ERy% Sݳc"I XbADoJܲ=wǫ^*>pe6_w___[[|ww5_5DQěfw>k=<o<\\ς5TY2آ)m׆ 6B$@ NDv,XJmq[+w˗tUgL</(ٝTW+8F5E3L`{!!Q_XJ?gТf[K/ku/Pb R i)E+:8CDOٮs  1傻<WB"k@KtpƊ g- k)o~{GoF׾??{N{!E`̊D3 H۶urͰ`]V% 82~Jm=r$PhX!NEU'FՊ6I(By̓{1t)䟰$cЬh0a}n*4%!"=>(.\@Ih$?8HD'2-R,U)@[)LТUKê|>gWO$B;Ò. DiUv܂\^Sؖ7tJ <G#,85k]^91Mh*G`c(cFދυ1K> XAd#y&ٲ MO%:cY'r ;Qq`FiP+?w!hMM'5jcլdUl [b¶[2 AQ 5+[es@(cK/Q#k=9˂5LR\2$29bOmZp"Do̕$#4&u`5! `y4@K8\SUkI%;ҟ˹:)Z""bbŋDQ#H`'Oviztx]-ZI+>HJ<.Ȩ qu*lG )z$ۣdX s!őcAY, rM)ILKb, @s`P>,!? HY-uc8z@gR?u#Pk1He::H%ɪ:u^j: I簩[z HqBSе4cl/H3ɮ_sW6( 7֐DK @Y#(6 2Hx=Iry"Ҍcbc̏SscR \G+j y}$|՝Xbb]Kȩ̄ E(07CC1.~Ÿ9BP@" 8c@ˊؓDނ(Jq-6% Z24̴MD6EVx VDK٬{*>-1D[JSmK[xC|7~#~?ч5|ago,9r=d` J`yȀbms=`2AJΩnJMFeт$HyZQJ!TRW+,C@oiuwP>?Jl Bksݳ e O:ϳFQGTn]Ԡk!ex9HNN4S$je9[*ǒ ȝcŌxp?ł,d??pgmd; !# UsD,P8`Xȶ7Xѓ29 }@4,*@m,{aTLgk|ߋZ}-ʒnꭢQ*y ̙BdubLKEF  NRjs0# " hN lÏ5u5@l1N#an )01JWp2g79Ķke ń>֪ 971`o@;0LYM,:!1.+Z >H9^W "4*xV~tz˒[.F GC6rTyKd4Cd{v=+\hV2j7j % ¼Rbr/ō-m{-7ַL7}7}֋[@Xf6"+ Httw{)+ Mzʒ_q| @Tub|y'P2T;s@ KVrx|,Gq ۵;SE;2 ;Y~DUG+E,e ok-(̉Ja n~3Ϲ04BPzI>$Ox!?g?OtzBwN) U+cxWaSayXStU +QB%W@FV@=cZq=J^k8N}/9^j1c̳aibիWI>5H84MyR(f eRX4} &q)s9"U{Ԯ4ܕ^?>ozӉ1.F ›/2n& IDATdO6`5y /loKn+Yy^p4(s毗Kk%%[Əb4R'PccDFRZ 2;f[i%ȈDl|EQBU1\ʶ֎b"DVadP^g4<裼?on!6$ϟ]rv<[ 0I&7KZ3NW?C;fM< M?%{{{Ds@ݏ8 rs9Xys1$I|kZ(?̂ :&?eȾ!&wIK0;6Y _^ԚXIܟ҅}ϙPk8@&4o↺tiF\d?rbe8:xGod ߗ|yә  ;;וp:r% hfY;ӂ+:RZZ?0l[h${4)-9D_b0GWf+ ;K"iy Hˁ1ؖG۷OVPLvP݈* 8hw':H. o wPg9Y:hɤd8 p"a:? J510!6LL#Hex{Oqm$hK%2K$a%`i)Z@ߏJc29 y - ='^41H^bks>G* C!N tYaoo rrs@lpD;e?v"'3-Xq ͉ Fhiq έTqC2 T!X:fEI !ۯ]r-X ͡;fN 40-4pO_/)3IxhR JaV2h4E|H +}YJ |N(HD tdbdR^{}Pi ԥȐOʅFDJ\5Ι-X/qt: FOg259m]@KgHǴ!d7m[f3COwz+RTtƶX!T(9 ҉ XO*VHpo.fZfҌ T YS E:XxDZh^XE]/Ct`$n]|In3 c[o 8:I+Wl)nHUUF[ ğM{p^)T r"Bz> ;%[\'Uu@t”U"Ju(,M?o'Pjrry\}ކA K#@K DW騚%RQDQ߃EaY)ꠀPENz)n(ni#{z*|~s.%R!Jma O,XB+XȐ>X&_p3=M$K)X=rVHHB7 ׹SO>lm5 ʍP7bkoo!4u=AW*|\?3g' =ٌy='w{)CeɽYK_ԗ2+K?!' vc"EVǟ|jEx=*wWWϺGftR@5 hh2 E͑lΞ 69"jR0 q/Di-XH,> =׷hFV g17َNy@Xwpr| HEH) ,՘O` FN,&f-XN8L:~duҳ\(dB_nyh ,N) 2[+ NI? p 2]Uz4:\EvzY%.@{ 3äfsR2Iޑ@B4s+ޙVz{TP@3e"lmA$:E]1#$K+$y_,?h'=B@,4SNWm bYlg{$kPPPBOJuHkDŔթ2O/q,QJ=gd<Ķ!S(#V/ǭPh{ƐԧZkoL%-Jȑ8TEH2{ 4M颳D*j dJx?@X:3, h z&@&}X@ ,0cp% ʍdCxs) VHPD:|'m4S:Q4f&@sofb8 5H7fn_9KQ҇U",x-%'K[("zZ%L(x"= ]RFsk .I` n}_X(CՖMDYJoJp]IirS6%$2kHf3jb CDi=(KqcqK}׻//rü~ٟO!R1(/dkkk,o_|ʧ| R>Po@9K7 o8M)O瀌,OƦd ˍڎlms09{ykh)q\! Ռ"Lpk8-XgLy='33KB8$R|h3eﻘcM48h1`<h=غ5*@c#ΖKx=oFʖ4$,+cޏ+"ljӓд-9!Py8W Pҥttظ´ *pՔAċe5auyXhxɈU P `2 \H>SY.$@V Z{Fr D|{V)i(}\I:@Dd%3ѱPWYV$ 1sNqfC}؋ I{ LcWKa'Dd)SA&ӏ9H l 3i$e ;XF5o{)g(JnpB`"EnhT@(c}^MPFp(u8nV=&בF')`g"WcSvL!R5BuXqi %q 6CҽHrނ%o˭o9k"bQ,$XITLeM0nc:s/U˂ E8f__廿y;9۽<_)nNdS^\ς/ C\@61 5SثNWڈVP@Ί8@ɰd6тu=C`f.$6  ^9r%f!$Ksl>5 Yihh,WiQh(BIt.D|vcL9 R,B!j_Dn3~BUuP@xkPu>  V:GmQRBз "ʘug/qtZ w29,Ї> jOBGyeAJC5iLC#9;;^=9 a,-&P2Lϵ /qSgRHTZoĮհ^k2t&4+R *2s@ĬGz]0 aB LK*|Ef˻8ȓ~>e B-(K,w4;~CUyp۰!6v.Hp)R`,".P.¾DDd%;pDa289LwUuwxZ+k_}U=n~tw}oN`JUytBa?Љך^G@vvvַu׾o3?d<4 nk( &v*<Hт59wgD/yqkM򶣮 v$,EZ 4g|.޳hn/CXbUed;uY!*TV@:>@tm,׏B yxnLbYq+.Wd[稰m1^20&iҽ=R0Nz d80)`Zֽ N(!yt[Ƚ$wlfRZk")wFc܀*4zO|ȲNtgЉd dWZDd4^}DHSiEE d6U$v.>Y>0$Q8e aZe,aÚGD{V30~&ɰxGD$ `b:$@{mrcLڧ4EH;rza=>3φ`GHDI Ľ# ԧ>o?S?.]٣" Ƕ )΍ HP5Wq w`3,X3 ;Dk@acE(&~,4 gYbgzqhɧ מ~Oj\P@X ͷcL€@J4P@Z&O`ppsJ8~I1d&Hh_3D>###%R/RkP54B޴P3qGߓrI0*  D)*H{5"l F*T@1ӂUbc9Pb 7 vaET#:EBBq޾"'%@e K\LBhDۦ[eMH0i7gπXxc@j> GZl$bK c_Mu7_{n:71D)kAKbjo0'=.L`&6ClH;aȯ Ƃbs`d:QIt@*9V[RfuG X0h@"-RԮFfFõti~@GYJӓxgHoo?|y饗!~w~ݼG.Ec@VYwӡ\ R,Xܒ8ȋ19N exK,CM~ƭ, V! YI̫xOE!hQ|Sy>t61k] "XاogN( H<G^ENt[-֬lbf ٰy"֭4,5vmɲPҗKeER '@A)[rkIEE;zR*A-7qG 6<=@[L)Z  ޷ޣ,[&E;Pc"= g) Z x ̹ʗ sq@P|E*[j_m\5%K˰E8gmװ*1 v 1',MWW8ˌIz~mlՓdR{mw|jQ@~*V#={<|_xk}χ3AghJa+Em ]>tP= 2 9R@t8X/}@:Iirl *6ty ]GZ9q`sQz7 N6 HiHPR58z୨e\[YGGO$L}04<*;;;R(v"V@ wj\3*_{}&xmզ y$ID#l y8$sT1&J^:OY$RRbpXloo==V@. S@lH-O%1Ra>6!հP;} IDATa}tcz?dc"F O)-99Kd@B}s5Eu;[ ǡXwKṿI,Xq w0LCNz1 hrY,;R+fs@L\ Y`. `#D3)QƂesy,Y/@ŀ/MT@XtXiFkvDŘ1&CJReH焒Sj@E۲ĤLtrJm) SorXOPIXFE<ܛۇ}?7j-P]G$Kh9 -ZC, 6* <*M:>, BD=Z1?-MHG;81-ϰI"yl˘k81`h}T A3.R櫬.I[ @GVwTq+J_ -nL)˱ q bvolхr@ҾJWK@|RuR>"]|[g8b}h0= rIQ\1$smv@кrIpۥsXC?{2h!(i} s$S*iIK%}_IGZy&ʙ_׿aZ"{z] Ƃe z؂u{cBӃwU@Ԡ a܃Ҷ9Ƭ6 t(8b$$:b :TX*LJvbě7=>FqǍG-X[9 %=O@>Ƞ(ve07=8Tk&qutȑÉ*ȼk;N//ۥ~_+zC ޙ{yXs)J"DŽ`m D>nAڨ 7,96hh]1P{!X, VP@ }1MF3%y,l^Orx e]P@-Xkѣ@@ y>FeOk"S۔K/IIl6{? NZ2e2 PmV@.,p=4MF[!q!V^E(C9Lnt"HgJE:~tH Hw!m7s,\j1kTLBт *U2( 4iK6*cтEIe15* )=Z HӀ,+7IշV'iDe\gLҖ*ŵ@ZQnMÕ+7oLB9 VRzΝV@n:Z:rJ x=k4\쐴XRdM}v+tiwL=CoBD5ȩ&XҔ4Hݎz(ZZē6iC q,3TF& SyM= Z̑ =0A%2㥗 IZN˅BϧBr1k ϷK$L)[d8TB:Tafe;.;e jѲ7 HIIw<?|3k_ډWg>ϼKW$x;ӂ5ȸPmX@N* $4" I H]|B9'dsUIBvcE1 S'Gs,Xix'֚g*-X5y t2ܼI?'%,XT'vhYvBiT4OpIג%$믆 X-`pd-xQ$ i̵ұ6pUR2V^ <:ȸy~$Q];`HUl  M2d f92Z>ߙ2ךu* Mˆe:D6%2K"L[hh2Qa<<;kQV¼ҾR%#`Rx z 8 2*IuK4Y.AEj v2b)jΪ+a2㯼BUPf}Ph %*Xa*oN4)ZL1렐iVU$&hRfez,%/eb#BcukP)4MQ@D &i7djքَbL&D#;ȒuߞFv3 .(NO|}'>OO|z7/I<v"IS@6,X@=- :ڳ+η`M\N0FIҝ y~a~$IĻ> wto#1V%~ZQ кEY391d^bAQ6R5tBKK.kz`:>4<3|_Wg?YկO|/~<3%>w9@ 2nLƅT@FUCslT:^+,\ﱱ`e\ VR$WhݞeHT<]q{ r A4@Ίא\"TZyfтPZ#\ 2`IIWӍeE*.-bR%;n77RarisU6"KtdGQ3HIE*>!Cv&=B;:q&M[e('\w#70PeZ2 H?Hݷ8ͣ5Ĩp_7qJe&"@t=h|U g'is@fJF{U{ VTomBa1X臭#CFԲ,o$30$IB3H0#t{R d̫ ŚJnbA -{b"΃Uk Tr`Sa{V,)k^z j !;X,P8 .( uwiqQqy x̯~LT(Trh35èU5LNOoD3e<4@q{kmMdo`S "ѰKNCRNynj]}@k"rߑYUEa`hٕ H̹H-ݬQCs@d|DkhzA(q7 H+s*|m^ 2hढ, t( KJ޷ZO/" LR&D7QeS"\_1b/<=Yh @#=aHhTIT@|hDGR/%ZF@`K3*]=[9KD:]*oW$_ }R@fu} ݿ$Tj &gBd=( =~^EܼyIؔd] (<޷75c4 Ie.Tq_PMG3:\A%}xuѾr;jjxR\^nUbEo zm4.\ ri.^x Er FIIM+ 2SւTAhcHҶto8ͣ5{zW > .#h?GD9i tFizRjXn' [S |@ -2 cQ6 )ʕֱCI d(5^#i" 4 Ae-SQq泴]D)RR~w( )m#d tR7}xu-w@tH2K+~?GypuHBg}##[g NP.!+:{0%E7hz [M8m IDAT pKM-1)xHP~ DLaE)S.2Q 8([x:$M]ȧ`/mxw$s8U  )s<~~G>>9~i>OW$-XcBx,lޜ9 {t}{rrb6 iw~T=!?և!3s@Ӑa#/`:2 uԵ& Pv= EǟXj Q0):y S H: `cH&2P?f`4T"ba@F\ ~/ѦålD)5nKiS$uƪFI&<~<:YVc6U-X5#I y!ܩס |~L ՆQ(r]X oYɪ}rرu!iѾ( eہ}:* I"( ^AgjD6ZV&S:䀴C#,k1)WpO@nýk6kp:k[{׮]洛4r+U5$E6oJ&mb ( . r$L}xmaLM:<i@cD i{n4URT/#D"{ @n8ݲ`5CzZ4"xmv`%fW "ljVX/&'b$9 zr 7^cs@D\znlHn7ΡlN׎gH M+rO^ JJHa;ɘ^t3y8ٌͣa8<<| V!ָXt`KrA1STfXLvWCs@1[:f(9!N) 6z]#P@oQͬf_n,XiJD!) _19@)U!C+ @RUZn?Auy~0( }QcYWY@\ui.wddի?`< q&L~oF; U 3Eʾ9?VjT ;;K.絽p ʑ`8 K ;]-X'0H=ۥȩI\C/%i,!*rR_F05s=X5* 6V7 OpAY9;eɤ $*a:>?Gѻ۔?3؏W^}:>wĂwKϐߡBR@F5C!4"kϵ`9E t< J d,Z0M _w9I 7 HiַB>èt#Dn202E'$7Lڊ!k H9dPy+W?oa`Su!ZHzn"R8†cOo(Y8)#555Uad9kKE LztNn0<:n_$b  S(ỳdZW,HBN'r2z|1* Cv@3IwF|˲QjJ Ir@Fv2K?w(1&,E!)_?`UKr@,),S#SO&GLP@25sKl*%c_]_k9V)5(A*f܈a @Au"{HKeAwG |YzͯzW(By c5$QwR& oi4V b\k0#{ t!n;4Gu@ڹV+wyĽ# ?C 3Qﳳ$qwRk@{m? y*d XV@ε`?Y',Xe Yb *Xn#.б`zH%c1J(g! =wH5¾ UT1]-'+8V@w? V}AQ Fe)Irkĥb4R_--y 3r- UclV˜H3Y L;t]AcZD;cny?ϋi7ׯ_{V9 vo+>nO,K"Pt^՝m:@s@TlHz@\06d8W3UHl򹚮C+k*}@\,[<~$kW(57KokAuB*nb_vyA tJ8Zl@*2 s@>|b2tU0-)ǒ܉[K{D׌a9 T&з!sn;zV_NjT':n\ۄ=$x$rlRr DdyהJAwf@4kB>t"૴I$Z`\ɬ0&( =.>i}s/Gʪgwod I<§?hƓO~./_'??y{]'0Z$Zo&~ND!Sc Ax;s@ >mε`imwiym6$m+s(*0@bƴn~ߍy=%@{֫k7 ^)+F A1i oeҰL4kDHXt53Qf Y (|T@kIu*_ZW(>Ţݬ,L"|ϥKt2e%}sJƼLV8mUNE=+R"qb[ z;rQtBEkbG0t_M4H0rAT}|1F1\kGG9pjZk5\s9>~e![FLi)=^ R_{99 ?s?<mOO̟NMo:qt,X{/eY^3,c:uNqaL5O[b VӜu"1uGCI(B>|2H(\0!@[Mu#0t7'xUFD*C[ld װ:t'*; "b i\hh }|$`fݾ?ft[b ӆj; {{^ R'LChlMԶwDZz/"  #n"B+GlTm. oɰAAj2lQEN(ovWT*gG,FJ㒵\E  0Cxl_`jYBVBI|غ2 ժ"k*h`{ŔZkPnjҍJ9,_NrmK1;U bcy`q\.ku?z VK[}‚e~ZUq 6a)WA.M㺙a@ƒv6<1=$YcAO@T;9]#w[UZ,q"cyl%`nHfݾXQTd|р'v_]XM's7ʪ`p( l̻/A'( ƴ c6q!1瀘V!ʜXBJVw+ uce-SSk(E5rr1cZ BBLm.lXc+˘ л7 dA6Nj948q5먪j F$F_Q! B9Ҋm/ m,ܦ( 䒱-+ @83'B5lg(F)Kl2+DI71YD^Bж[G-#ǹ3% V c{H)y|lP@ RbЀp>!jԒ<#JJFaH@ћ:1 q uimF#uQ$ u auj;0^(뒗y] +Ll.z%h&H*Rj9ƴS@WedmM©o, ,4n8x^ ˫zc`]dkngr3tOۂ%D|e"m-X>r@p#*WLKHb( rN"萑<'9zíd0,ISo֬Ҡ|JCKCMnv {VڏrpN~{"g H bB^nA~b71^b4:R{Ihj8L0|p܆--MР|3<rIsYh4*i)XhƏA\apSȐ^:ַЇd" HI'$Vk>$,)ФH,Ƙk5A0*X[ #i`u-iՇ&-N {aa:N|~LŪeoae@Br=4tp6.I2eLU]) M;W@DTZRŚk<4!7cH""Z+s5NJiaejyI"i~? [O|/tLK B!@dJ)2Z41_HRNP$g~q\28ב$ɾFkGEeh`ccQ@w5 H\9,ubG G) $ :|ق`s7B5RL7P(H( gθ]+D8!"99Aۃj =+TĤQ4%WC?S( xBg }xc/!!+ YMlPm:) fS:5)ZMO=;Sh q M%8ѹg佢B:FLu&}xVȕ$I%?̴Fzd`(5-3_rw+edԼ# VlbԴҫ3aHKDsK=NF9d x&#E))5$l@f͖ʴ&45n(ѹͭS&#t2D6.(g]-D{X؂8}]gapZkbk6^C DXl z'#g(SMܶUn+Nl,X9D) VҍŴ0ё ?((?]L—s;ٵ+.ݸr-$& ƕՌ y﫚yXCJ=+8)9 {>RpOt)֠t<8qx("uu,/i`)bmsl9 wu@,MsబH9By$?w IƄc=L IDATw]'܄xw:ȉ$%Mr,k,Y"% Xou+0S8 F`Nf');7E d@ Al+  չ{M(Cb I 4X# /(j kX\b W h<䓀e:u/:rЂ:+qW`mL1cUKb2`5`/1^a~/,X d@$:tǿȉ=1-Ym` @d4t#FlX0$\y:MMT# -BD(!Ys\Kt CiEz&u J俘uU\YܭJ$`׬-X hX,倄)U[㕄=Oq@V&&T=L9 =o}[?S[/iT| ox/zы5ۿ7H){bM]7 ֐pxs!pR@F12r \&GadxlԾC0v 9s INn_/$#ck#'<{k;) дP-lI[H7zuj5)K;I W Uʴ(oʓvO:Cc%LK N5Vf }*jjϓڒMO&6"* FB}CGKUr}@Z3fZnzS;6 EG#_.;R$xY?=Ue瀫p7nވp H]4"[U) C߻s#mB}EG/k$An?eƸiZ#s@ a{rYO~|#׼O}S^{-''XΝ;*A\w:jr)j-XdIGX9 kZ8ٳO 9 :`DrAMUM=dʲXA&W[Α<4N2zX2:ٓ5dߞQeJ^iܔDQ:B5sȋ2+o}i/:Y^0<箻чp\q|cQ1n`^ Q?_*+Q@9 ,ɣ-X!4Eᒹ{ ɮ$edšP@4h*~HKI H#=T"c0( q D4E%+b ~d6(1!'5 ŋKw.jOf󒗼dO<'N CWƉ`mmm@1񰱿 ӱ`-L9 ނ[pDF~@LaX`s( = :Ȓ*T))&oamЅo\ȼD5 [TĚ^d'=,,X?7$ݓ-Z@"+'o2 #"Ĵq%"a8Z1r~D"ZO\ :TB #3XvR;cT\6S69 ~>:B+ȀBu7ϣ;ٚ8s#V ?GԢ`D$4-1_İ"V'N0ۣVޮo.}Mz V IQe;d~/=4hDHxl:7 & mXĩf zAʃ()Io\.#DY)HA`iNkve2Y (tAJ%-b1\xN[~??*^|(qષo~Zwc_r^Wҗ!{>~d8M +`pョ^`Y`Zr> ˘I)&`2;ڂejV=e@v׿a )D&FP-Zk֜;wpUAAJʈbmhDX.+z h=֒{AFfBzѡdI(\9(~D*h4~eV j ,0PG:t\Tyy0/ 6&DqS#JҸ!N&(Xcφ2py d/ǘy, C""p#`r f,-X^( ȉ "{w/P97wN?K_o2]m!ƮW50T`{A]66lG @lсۯt-Y44X,xnz6 _i,qwo[I'3Y@zjb[^bm@Mpan,Mzl1dVP(EE%r}V5q!H-vn0tII6 1} QoiMʆw;i44 Зd&QtDiÖ&ܯYNg*vmdj rD*ͪ.4X;iG?ʛf)_w}}誷???m^_Kn=77 Wq鸚=666躎뮫OpzIU+Iq {Sq-5]QS@YV@Li=*Wph}˲,Z$=Yd!]Z&i Dqyq^˻_8͇/8vr6ڄb< EQMH4s$'7H?V8 7XlP^:dHDJLyYƊ,&@825`b;K~ !\ V]rd&$I9;ɡm٭kFALfHϓ6G[H#eM{Tay][۟qߥIqUXFdh=#)tJ)V#<x}2> i u҂z}1ָe $BxT_ZM\pV rzۤu'~8e%t]}BDې rq\64͑5M?||;ɻ.~7~V˿Kvvvx_}y/0DqIZ666e*r52X'WK:׺)]it0X<,@de @: V`uh@CS#ЩQT#c{6}n2"jݐsq=Qq׾WT( }@"1RjH}@D(sq, BRkX$Mk 2^Fj "Cz>h} go?>d> N IbLXya&2Mu:jž `Xg#n= IDAT` @`DnjA^4bϹ҅ }^Qsqt!&elss+:3M+5&Dhƾ'G][wOT#ΡLknfܖkMC#:ki ֥G}={x=WGy7ȏw}7Zo}ݼoq0ץb8q ]k=IJK|2Ob".vܹC)J5a dߐ.Øf9snH,$SPn{M8w HJE@Ia&ԮiJ`),9wk]]?HI,ǏHC2NducҦ-VGaCD}L C{|0wX[ Wr7IjTTf{ORL7JWe4zXZE56$a'c2t`u>X(qRYƴDRmH) ;q$M)#* 2=ƀ_DqmbߘkaG7<sZeЗ rA<DF]SeY2-X1\Ga?2_KDnH =΂cJFJK #CHm)HUWkv2M)AX&'!51QI?{ocYr"wɥ*ko{bSCqآԒ`ˢd1ˀz^~@EXd30e46Ƅ!b8dG &MR],'"qRU&Fev\-\BKAw둮 C˅ GCR!9!Tu Vd@ wjhD]5 l&b)KGL!kMϲ*W1GF!"i+X)k0T'w]H)KNI&es\{^FuT1E|9B(וMɶCA`҄.yQpD4Hy͚o$'d`Utb<ƿN ^ž'^%%u97LJ4%3G))m8-@񽱨RYEM%om^((qibôMct oʁ&Gr@n*a<7MF4hs[{y^ B$!˲L!H)ӥkeFWe V`EIN5"\&dwI㰋&7pV$χEpr*IѺJJ2x׹q@*B:(ߞNp]-^c"X۞@z:!`BftFI> T@Yntx$ ؎*&O;r%xI^4%I'Ҙ,m)Af6)iL`ib$Xu>>u_ Z)E!ny Ys M p\JȰvX~5m&j|+vGV`0ƱTȐc@B_Fpa|H&aiؔօk(浽=iz|1.$$;f4>>#'$eNq &Hervf~rIR Ά,74d::Q@zFͫ1u4  p7wzx@%5} +/1c8&m+XA:+p_/=kCEMUh!׷V59zz_N ]0.R5+$X [lHDٟf@ځ%Xg\@ 5/{ @ U_J#A{(ʂ}ϵk{Hp[g2 m}R썱xKb $-'QDpj$ɀk\{vN&dY@Kvx0: PFfQC'4J½B *,R ZiX8j@1ߝ"3R#BFH})D)EY9 V$Xs݄7k4%I4ߕHFcq @)7H:vÁG)o 0/rE<~voo|!-r~ogae=2cSQ6v1y)%-<CM&.hX \!e#AQ)8xfd ,?v}}`@ܷ$J9nL&Y;/r p`E\}Jv^}rawi6[AEY[>3B 蒎1+iyz/| ˯RH)O)u߅z[@dXྛd.n^;3X[oJr{*wE1. P͗ɖ,!Rz5k#!EaR2+_ /߈Wi(څ5Ȧn4N"Wrc'UC6O pYH/؎;t)j>px;n.M$kO ǧqD^yECw8$ +[[6yg;A5SFvZ$ hԊ 7>Ƥ)RKD .>l $R19G hJnLQTi8:F$N@H @nX NE.HPC(dpfvyEzv55ڌD3߇y@~ׯ/~⼋y=.} u]GOûyD2ڥk8R~ý! 4.|ؙ]ʱ$hƤe /xmʰ@($&ܒΣ%N^c^bLRo-X< "!+zRҖq9P Q{+`NQD$S} qH1 ZS mZ4'MJ@:N<|Tt]g@$`@$_ HEYȀ4؈^7/S 5` LZ 9id@nS2$I'M@1s u!Q,d4o}~ fwHcZ(,t]tyDޙc(QN)]{DɶX ق)=So-8ncP{F8`  2 1VKaYaڞ&lShG |SW7wz{od[l.0"%M48bWƠ2K%k6 &iV,)$b!Qiԡ9D`WLvE(W<{c@~7~̯U@1˅V]joXa="L]$s,6ݾ i:), N_~4Mk@f U5"%eUy@6%Xs(3$E@@j2pMHF%Ӵ\U*0_F4xᡀ8qUEjXpeyHj\e 4t 6qH-9G{~, |. KKXtT&Ѧ No &`r)9!ݔ`#r )A L!\dGf R*|, en8@C];GyŰUzS ZW ętmqX3a^O;~g[a 02Y4B(wv8dtOkWxɤI8> x߭ OcVO#b@4m8u@®[o' Pj%NK% Zl$E:vJU$ж\پGh֗ HaBG+2tDQq' =&ѿdS!0@B2Zc@Ҕ$L=TQ~)ɏ$܉&ҼQ#b#BMC':$<6Th$>ȳM,'ǬĄ`=SeJܾ}hS2%M,$Yva|NCқ]< 5|hs \*g!`čv'I}JU&h@&2h q6IllЄ]ܼ˥Ed*GagГ%a.y/ͅ>bd0ؘ{P3Lv'9~2 iF,DE+6oc@>?~=:n(8{U{_ˇ{$ąX{2~$X}$Q'`g~&wWEA߇]۷(6LJZ1 = L]Tׯ_`:EZжO#yC]n]6ՖNdd=H4IbL_v /n0dR~yLZk=ŖdN M4OU:rKV4MmާsrR9}<mI%XNG$, ^8.ݻ37HdƢY_ ?Oc0GEMVun^^8 EJy6 I>78߼IL|ltSἽ RLhMqnCl[*dܜo߿ wvݏ4@^U(rZ `#k?$3 Kz7ܣʲĘ[@ O?avw!ڧ;?,{1y" 8a9d`K] ܇_{?FpvifSK:ƻt7))DfczzH .ǣc="R~lcIC׏)uS3n d&"l 1u .^࿰_*4UF@-dYxX=lCЌE @+9o\J&v2I@k*,3Ua`g:wV?)wYs IVh CܦfX0otnWd#U%Z)0&M4򧸵S,zRj\L $$JhۍBe ]gW HN&EǨd8ɈHi@mrH"MeCGQJeeBцL|Bmj:J:Y IDATPh1/~ .PIOs A#$i^Ɲp{W=7"{H!+h1X7,rc&0gow&%[Q+H!%rMd|J)d2 ~؜z(ZhEÅ dc‚5I4yNN)2)9=,\P}w{F "EOs:8wEܱ|'D=\1 rŗq'0ھlCfB1_dtD>Q8 `\lriۖi \@LYO$:H͂dwi,5\4 R9i^ A:6n^^:ƀ&4k-O^  bcRlS7|9V9uԶ D[HR+OwtWVS@_QuI 7;=ߺ{&c@T :0 A]v7j%*L lo8Il& Hgm H8R HXa1RY{`),OV/̲ f̈́ރPH[>y6Ͼ:\j"eX<ڋs Vbbwt"hO#0ex҅., [!)IM $j~r/V[@| "4 92(z O<ŋW(u68J"5$ʐSn4·,dµ[ނ1 w>gx6v}*m@ MӰ8 !2˹k,q{ FH,YHT<$L>[u$,ܕ0_~;wV%,Ř ++ "& ~,%ylD2X ZuP6{d`V܎z Pd2'w@ҴE"-Zb+-Gh^(̐d@/G2="%yLO[1 L6 gϟ5WMaM%WLr h(dk+ wx^]񏣵˗/sttDuloouc_c@H]u͍7@X8!F; թ+ܛ VHȃH/~~K$ּǐi=¥nܸk$XL . WQdh@Laϑ$~6b2q@s$,!z`Fʼnܖ2F[=,=6ebIH6gȋΛQch :f?CNa=LL .E-GYl2?ŀH dXkO_ɣ#|yFc,K t%L&D>Ňr87KYJ@l B@2J62r! u>>ڕbMb@Br 7Ix|&ģ O10 ,𬤪\t/eQlƅf3UŚB| B9FwJ5I<^zz%{B~w41ð@^{=oYr"G,)׎-ɣlJNBȥAsf:Ǫb2{fW_l;G+ uV(Tl v!ȜV?}8xѓ 17`B`%^REI=II$X3( rLX1 F0gok2͸|R{yrrُgg;G;ggg't}t sݑ`C5 ml,C7;qY;[`mS&BcY<>FX5YH}4l oYBMrD I uolIޏ([ɲn|AmHRz)rw>SQ5.`diۊ8o $Iqc /cvu2z!BEG:V A)gH_e}: RZACkѬƓdYF{iF @ĊQ8z` ag; E&mu`@`v]Cw,|)dZ 2|U\ER`]2 L /^ <܇_=\g^"+]XDͤc~[tbG2O&tVXoXDQ:+$uý^g@ uFBw?h?]z$0 $7;'ymϗ&tV Ȱvppr\lE׳U̶RMow=mc @._|ϟ/կ~yydXwYE"Tw lI\`I7JmB j`@"$XLdʓ{V kR$AOHUlVIyty)H/+LW9L"zŬ$ 4));'a|,V HQDDrq~D7*b%_~7I:}KS< ?/e<$XJn[jx:GbxotϞ~*@oKrsS֘ES ZHB;j.2ċ"V$Y^,%qK 32t}I;Ȁ 躚@"1J[p1?'1+O~KO4z)i/YDYKC GaWf@ՎDxDijQ&z@Jiއ)Y|ns*!RGevqys4kDM >*-!m@ KG\dP]ڄ?|_'''>ooc7OOwurvOhJ2P, փBalS[eB߿]dX<c(ˋzzfNp )>OpdA4af|qwsWC":,Va&P8%X2 aiC"iҡpM+ȱ32 ^8})adѺZv ~j60BἀRʶu&?L%tFq}1Y]=(\z, K㗯U*2(.`}hũFo""xn9k&KC.%[[,%Y2 } 2tRtm|'V#mV,:. ?7;H/ǯ}xȘPKk|CO9:[ i[Dֶ[Ş L̒կ#<(_Ҷfo+pJQhMMF8/k< kq)X8ᤏ-l)S:"-'mg%>(7Kի? _%!LKH$7{$%x-Gӣo{t N"j12;c @>Oꫯkk|_S{{9~~;|(}X,9$H4RVKz]˜;$C+4j&qUD !eB չ$j55[IOjT5Rt+20 <,Od@r+,ZkTtdȀB\@ƔkK"&t瘦oh)WcX4>ːRRQ*uQ*ے "xs| x_Ag nhf2c{Zm̏(综$ZӒa9> d|= :Lhc_ R33R߾4LI}|f(0 01ħ߻$}ހQ$ӛ 0&HƶP%Ж% bzą#Mb$Q'Ȅ%d8p KV+ӘV "a"|&\4 We +"IQӲ5bj9EK:+ߊ֦vs:G@Ž M$_6i-˘VqJ@IL( :IHm<.d,I7p(7H@NIts(mۑhʅe׵t$d4BØ)ȝ ِ. )99nm @23KN8ᵧ=&ٙ$}$$Z$HQs_: L"qrr΁tx'ȤY JtL< ] 4sK[BvͶ^^6[y7 N't*lC$X024`E6*ߡ Hnjɛ0{@z_WlQ mR5.\* GYMJ5T`E9+ؒ$mSC{$1Z0mԦfՆx{/ VQkiaHH9182zXz@Mc`!Qf4Hz>&,2h[0DDayâW)XRuאPҥJH` ;_-nR;7/=8h W3!,$)M6^7@MU63i&H/QZG2wX.b@Z3-؞&$Tia4Cʎܔ$1$SZr$H13%!&V nog᥋dpxۓv5-YJJJ#vx"JNTrAW#YohdUU0M|/H$1θ4&J3%JJIG b*Z IDAT\Agn׿W *~%޳8Lw,S"qR9>u[Z~3)˔$1ѐDyoK`Px c:ES:7%X*Fz?H@d)29W i֑ Džv.xk7E5zF!ZW,ixa}ñ8Ŝd4<Z+>e'h"b藉Uԅuod|_}95!=}\ξȇ?U5F ^36p}Lh䛯=p5l5'̘0~8 r=_>9g?>|z;20/^,GR%ޛږu~֞p7׫rUy(My `Z"(DH(R"2`܈4 @c$%R"`DŽظMyF{5x9{XSXks}Mu~{>{:k~_y#Bkgr1-XYYL0N*>HnD@#$W8jpdzɘii$EVS{3gxVL+ )t&%kڦL,XYB6NUt`'S73d =0[8z1π\!)(}@QEW!oD` ʕPf@nւex ]r?Qё eMֶ%rhcn#usmj$ VVfA@j XMybiW@ ȝ'f $ᬠNRW a7L ;愱'.:2aȌ8ٔl0xNSh}B8|`uix4y chr+}1af0 @w)'~^Ogqӂ[@c'5=v$]pXegw d94Zqbo' N\\oso3ַ~8 g@\Rw*7 !* ټM["I,:O5#j]sqrLA+ eY`ud2HPᬌ+S2B. dHGb,ze>I2 Ot p@st"iCp9IR2I[057: {)*x G2|? xƣ`]+tmFyCe)1[t,%=9c7~ot: ZLT@lJ>@<\IXY mO@96W [( >L:I}&3h v .ǝo߲_ K[7`)XYY9>"e֛gkO@z ֵ*'7] lFQ,H%2L (p<R$`h\p$uԁD<6 Pl1% yYb H܎<5탚b`jfT5!p"-v6"ipݶ VsbtVp<~q# Vx`-XR Azә[FA$Ga]רB$u]TWBe H$m#9a3e$}?rrH ƃ1%bR@DC8jyIۯDe+_;ENHta +o^ޝmj=9'>uO@|roYַb)46Nf֠a)p8oZ ddBGuޓEbb'ҍڐcEG JT:p^^`+9eTՄijqĩ9Y`cLB'1jƘ&K2hL鍍zIc ڂO}׬| _W~W:ƑC$H)8q!UU:%Dln6"~k{}ohBm}E,﾿~ᕼ=ɮmOLLZ ݋ R/!e U5Xے9 HF?{V`k2xiv'L|A-aBkjACU1gC( A$UH2apR3: b W4%]yd#(.K[ ̀nv$up<m(@rx,R?xF-X:Ӭ3?SaR@^k/{O/.ëcrkgXr''Ruu}1ੵ0|<5>#Q[5qq%8Yôk22ctdD,#@$c46z0e+l ރo@SX}*~QS~'Є3 !hwF~="4 1v_:?}#<*S9Qsw(4 blGС 0) .ܒeKe!st {,4KUnxOthc S7`4@Ԧi N*WJ3; UEj"( YE8w}IQl6a4aN 3,plP8`(?,co"%wZSeKok2ےH/{.̊aepp[S@ѣQ@|KRC-X]O>j$Y Se V"NFY1~A@pak_ǑiY_3f7GYoێb1JAk@Bf2bgc<޶HHb<1уQHf3X;{2iaJJNØ]ޕV矌=:6(:pɔRUpj0mJTeD`!2fz<]LgƖ  ZMsE3mȽk*W$I[\RE$xGjS@$  Ao0Y@X]TLKxM@ג$;fߚ\qN E)yy,z r!nA]o:0liy!= H* F TO{i*hi{0fd-K!n2ņ v]Y.C_( Iq(qBIo {HLD*E0/U^6h <>Z R{LWrsZ]2\a1ac-)9xoe VtofN@¹LpXt`uiBKK4Z=Z%ia5W@bMFJYW(Z+hGtY\d fYi67G#vcv-B?1q-䛁,]! Rz8j׭* ) ~,g@R,FHʮ5\ؽ79 ?fZ.0FL"e]gɲ !kT丠HVX bׅX1' * dB6${ *Af\u1.J;0ܭ) 8ڸ KʩwP \﯑=HeG"~p!i}vBJ:E'tQ_Hd 3G@ʥYwWNqֹ4Yd@z H\kxT͕\0πt (cCp/a2 }Yݨ6vVPq A2h*.u 2uYa2f:e X(pf2!KI2Df4\h:a?m_5vs/:O#&6Yrz%RҒ83 { tAVQV$:b@jSxi HV>[%^,؝TEP6G#vEUc<;{wϼ[,X=dG)ex-X}Y۷` مTbWC*a-+ Ocaɓ8MZX#WP!6Ҷ,N#$<쀼 8!nUȀ2!jW{kV^'&w[Z]}p<mL% H=p~DqM[&m}3) :fEҵL@)"L؛HqpnE"LOQ@2 c8^eI&ZK0.8uXgQRx(;WP0.3mHx{ Ӑ ä$XZYEYG Q9ܤfĄYB .]ěfN:ťKԧ>ř3gx[: [ S@ QV@B|n4,+ zld2pe|rlȮm'm0h¶66żTlL@QkpL`+"A"X8~-X1SEaPs2* 2VckWG bAӜ;/W;|d3k7Աsktѣyz r7镏谨|ե 7:;w b~ft͖Iur t Gz86; Hoe|eݑT@1cPJ]&[*+ t|U {#tncZMVݯ| O{)'vN)dFɂ%q9I7j#3fz0' "K4~aS8k#ޥ /Zg$Yт!=G%`HlB4fcc;_>@@5Aii2hf\guo1wy{}M;3گ7hώqp 7 Gg,XEYJӤe VH)畯`-g@.A3 Q@!E &y8v Ee3ӏDsx-uB1sZtΕcTam t\HYbAڅf}>j:K_ d&ϣZS2R(D-LKwQ$a4(%L;YhdNEFXՋx9NŲ}YzFZ -XUH@vNhigf܂G5Α 4$Ȼ IDAT6f/ۣi4y: Ρ12pO~Rv, WVVh{ <#sA8qG}yޣcUF@. ,X@uoO:B _ev($0vz2 Z;,#+$T=KBc̒bB#B  X L\CY |1T|vJQĕG-1RF[s7h=Ş R@.DouH3Aq{Gц)u-X6sqpolnoʂ9r3 Rc6d2N2d+6F88wHb},kY#qcL &  E;D@<.** EQO|"yyi )j7ihA3k;V L6+ \S09~6#M!7k4us b.m)kif&O ẤSsdq_UҭI.9/p1+ q¤&*-q._&͘$\e9A% .YLj1n /hrwGGCw}G89~bN`HХL3G-Ke7`m54 Hdvw@'_Arbvq)Eބ:_V"d Zų(YYU4ޅJ=iYP@]^8G>RP.QnI5~d"鰅) VU lvw9wwY,q0]O1&E0ޭ9֦H&BiL)w'WJz$!|x5Z]<\ޗ] ۫v|P uCUYGOD ut9N)=OSO(4XF ibvA t-HޡOq:Nzx|ZXsZM_1d[a2DZr% J:H:Gێg vQIBO/c}2a{4¸y;N._̏si.]ć>!>я~8"(+W{7k(s+n}kF`W@D*@@;lcNe9 ,/Yb1!i1;" u,Gg HȠh-XʂRszJCo_AU3'v:J񵺦,AKE1 WA\ɓ./v-,U:ib(˜Fh ,2KC,#~8-u:q#S kYRbb2u*X=)V@l.{, by]RB=ޞw,AqdR]Bv i5Z'Ȳ1 RdeGK_R>񏣁4* k w/{{TU@E_AkA@<-|6/JFt{f.MBQ\^G-hjll( Tui~_X:\9 2g:ENH<~ica]9uؿ'Oɽ۰$g"uqKUD;fL^6Cqe>O-qxA+ ?S?<mo3 y;yK?Sx^ekkk y{?h??zlU8¸"`mm 8 ATƂ' Z V۶n1l`] oݵixPkO&a"W-XYiK՘}aR`x z2?Pm{+،Z!QuN"`LIAulih8K$:<ܷloK2W@l<6-޾GЍ4΀ = ndaG-) GǂL@} `kmb>^̊1/Y #MJ) SkT\p`Bz1dQUs\q#$Yp8ds0R þ!d9,mE.C%E*̘!~/uUq+xz LSIKjgH@@V;M.f9'B}6lM=g BN{GK&q$i -3 ַt^ɔc>^'S> O<-?4~w~w]ٟoy[3+_ ?m_2ozӛZe?*IƣO@:z+v}=̂eުM lZa\9@t"`BO4ИC.dYj\+aܒ:C"Uh%󛁀ń@˫jތ1$,kmeMSanN@,Kڶœ(kv쭆myoq<mȂe!%[6u7nDؿ~HqIȗa#^4w&3g4 Ȟ1Zl9D0Zm%黴7]i3d8y\9Qj iJ.5Y`%u)4 gB-y^s3epf;eJ$aR%NK^ /U8G.R^ׂendկ`y ,> ּ3% V._}(痞P^1\~;WOԁN聀T5kh<9 HIkp9RUm.>λ!aE/bNs<|-Cu_hNT UIe-3_2EZyˌ2(V|kPٌĀ)rfkN@MfZ051 zX9gƉnƅf+1:>*A͓UVh݅$W~tMjV8.T]t֠dmXy.W@K|h ^p Lj>wcЄ|?o{aʕ+u$tCП} ,,y Mg@҅FH@R `乢i:쎝+eb9c-X&LDs VgHբ/R:* ga2f)@@U]G^z:$~$t&gsc6+YP@LYP-. -SkAvN yu=nJ_[7Ѳt!,H> x+v?+Kd{ПT-% ֞5`[|q.V<ٙ*Z mzw0D:H:6Xfw@'ilFGG=uƙXR@X =тU ψJZ@?HPt SFdyCM+<7WX '"DY( O5앐@ׅ2mT.8YEI ]F$].|'vvv`uudԩFhNWX_4QUm 85a2;Ƴ1M\|/| կi^\WJvDP)w EOId*ɲ,縌CIK7"AHMU5sFr3r~' 4jSw5}\C:e8x`˘gӄŜ{cf']Aĉ&[SZvwae棯$i`:]ĉ{ j|z Ϝ61 xi=[ׯz:{'5|3[z}%JQ =+Rz87lBcYz|@؄F͈ TrЂu ]`hF?+g@=W6N^ԑ$y H`%0K/YZ'a,X"aqJs)U 'fETA)'al *Ï[8zH3 Hʩ}zUj]cKOZu{8i2 t H{vcq(odkDycdg "sdJS@j 1"=X9A q;D)xyl 7{/c_B k2q.`A@~H J@8~&<݌J y$T`=U͌*)B)BqSzxcL^4Y8hArxhq])UR2EǷU79HH@|yի44)m;쩜= 99W1- m]zGw7;Ǹ |3[3 !疀tJ;RIíTajr !6$ς+ |,Kh").,XC_y!( x4 iPnR[P@f(b$2`!$X H w'nL4QќNB:؄|'mlZ3&xﹲ I+8J8Go~D+}}D]M@`,dJA: i7=r H_b5fi|hا @sloor+c<ۢ.e*āky/cU"C<R3V +!W@z 27!79zZF!%z)y| $M똺 kHie,-K~VE Io$;I.3# b 5YXo_N_E5x8մ6YY2[% NPO@" mFd}~C wz=8GPV@z V? ! a?'d@ƣ KI+\|suTk 'Ka3 }HAO+Ah;`ѶcG)Mk:q2kFXi_D%"v|.ɔ2b` {R[U(cBT HUE&Uw"INR"D߁hl;' ҁdjC Fҥ-9cYp4{hMS= d[j(Ycmʿ? ί\ W@6ί fp|W<_ O^><M@/O}SP+ÛJI*4+[[жM?Ô7A)L,] ؀8tEE6k-5+/]vTXjRvtJ!*%v<1cF*+ $oH jūV4s&U@zƽ LDX,PXS 嘶xO (IkDg /by+]36ǹS .:gV;Ο=ok`.G~֭x \xӟ^>sܹ[{^˿˼IC?Cɟ ;;; .?0ͻ[c 9ς|׾߈]&B<㎟F669U@z 8AsTff7wLJ#Rl٤UDt~@ )d5$HZBG$Z5leeũEr,UR$EC}s~Z{{s9{>k~ַ7ɧ?i~~/| <t]w}cگy?}گ]|O??ɓ'_WW*D e9 v7KK9sumՄ ;yϫEej^p륚ޛ'`yҧ=v/vmJ`=#GP` IDATU𱌬z2{2"׻>Ӷ bs_g@@7 zyG3Uo9s @Q8)R10 dۻaG ~aB;`"&㨺)ha|AGW\IU ]1ٽsM,s{{r߽#ٷi3fL xoRb Ȭ{3 %X["7 2A_ﳑOq$*aƖ'\g\;O;+u~/}6h;qC&x )ߎyRZ;AkT 2k(2mp`%mCSqIII7g/rs\4nЍhC8Du`@FrpȈIT)0ZN:ͻo;rWzYvXd60 Gi'X iPjeBq1 'yGg>Ï.o~3{ɟI~~UD>ȃ>7!\sz=C?ggZ}c6b7 j9^}"ԹI4W<ȥ$XQ$@wK4Pl;vIv3 "I"Ef|)sn݈^_214H"y~>]2Dk`O> {!$KHv̶Xw[B;%Q2._Sͬxq4Q3W@V+Ѡ:qCv#e>?[y\K,πlX5Bʄ=ix1fS< aBV^Uz˿oDRPSz΀H ]U1 C"r]$^0 68 -3mh;&p 񼯻`h"Vdor71f"b$m7 mX7uJlSR ir"SlT@7Nv8%ZGc#s7xIi(=3M)k|CA 8>}jas &m(ܸQ)UW|7iK.f~c }Iɟ ;;;lmm~/V^r!Ti+VC$j1 VH[N3 +b@.%Z0 f^9E!3I9 1MckzQg@rvčk %"`Ec?q?W0ؼ(Qh H&IK1@.E5t8H:8 3o[1$꞉8z"VeZ4>t( kɄ~l~trK  D9o.ˀ絓9Fzc@.iVU@:|/g@ H  'Y&њyM>ڶz/Ò= `# mfkzם4 {g(¦l?g?f6[lQ? 󩡊Rm"3ʔ`HcIbX5\iI`ԀRD` s/țt㟛N(͢HHk1&Ӻ`z<&̞`KaXrBPk $Cp qL𚢊` I Bm]G$6ji[ EuFKʙz@/~Nޏ?;؟wpPI~揨NQ̔%A19"fbcz3xeqݥЇ>t]ޭ$X7|٤I^-"h\Lf@~^`]%XX9jPsq% V4 uRz*:p:^4L k M< |w}, _Giō6@';usB=;:^NLMI$$B,ˈ1=Ʉ6+j=\q%zWi hy!BXqkeit:CKF+rd/"HqMCU8NISv3 6Yی [2Q?$0 i Z} Hך%8,%u!'@Ny[%?Ųٌq(iD 4#8EDm˴,q79mGz { lZ׏pi[9Fa$h:Rݱ'ϋ@b`vDd(Pԍ?O Ҷ5iR49&. 4MA"k(IҰj=\q9sK3 \uKIdM[ @: G]„k}HRLP5 .'ي=f)&CLhGQw/KzyUR$q{IA v-3 Gmo{})~>H^?ǿXP HiaRt2'&3>}_IӀtJ#0/8y1xHItZ@3 LTc}tu^X6% 7g@$"iԁiڞpVtw75y߾ 8Qw` ە&mrb"hr\U⥆u$z>vK˙":9rmk[8u(r]9E =2ƾhycj=\K%u R]&t4y=ә_]tkQm%,#ŀƍ{Cȼ$ ;8Y:QrTkcO"EM$ K-|nwqWn3 z.s2W㎨tʚiבeGuFhCI)w(ꄤmqRAWb,YZ(1lo1MHjGXָ@#1y$6{ ykE5rJgaӡtB66qݜGԧ>tn9pؙ?FtB,%53ӄVXкC`@(b5ytoqp< i滿er{IЯg(`$;5yzr]k%JuLC)Eӑޗǰ H"h ÀcBHbcu{$ٰ) D7̈́FA 1# 'r0ЕcTvL%MSnFpin  y$$XMkHS`c*d4V'FC0gjbU a:-uGEKcN $)0vD 2'>^67nS5#]2nC GMi3hEn3/j Xˍ~:lUK Dj] =a]ZKu\$k/m47S> {V   D& o.>,- }_ t&KlHI*j j򠹶cKgAJ%X2FAJu`զP5NBx< 8$Lė(h9qnܓıg@`^Qr:jV7ZHNGCʃ(u>ob[h!blo_[m3~xR.ejz"q*êcoV*7Qf tk|Ս!!2R%2lTӐB4Fv]`@bq HvUF@>{ #o`43NekρЍN[Q+Gy{#7Ao)MɉQ$R*^B*V0Kz@<4/$Zȡs`e&0 {%X{{)=3<ꆹ(pI~~nk&4a\m(?͌ 2H HFB@vMXjd+"ui0 N`E{$XB A+!u[0RVrsc@ Fmu#c3 Qdb$JP+drΒ$' kk|Es#?6߆.MHeL,]8Fc"%Yq+,YҦJπ4: CP\Zf15 Y/#ц]<,vĐ:#"hۄz h M &X"C0~lVAw|8O; o%t)3K% MHdq6nWqXU"D?q]p` K,X`I]vsodYFz< IDAT]AXJD$pj9W'LȐ83`R$~%xDXb@u51ֶsZQFMIf@|B#d_K_pRYAbrFK2 8p-*BzkpT(b<B$g@n-,i] HXzeb%owC+K{1}xM@30Vxza0њ,˸[869Pz"1CF n) A>4hcBHQ1-1y";=1 m t81ICļ|Oϒ_1Z7fDOEF{\|~G;|M *)kb"M:;'fUXU"af@v5d7 ncqΥ EDH]0% &(*ZJ"TѺg@$jɄN0{Pr 677 Hi[V?g/'?FP= G&Y`N81=kB6 @F+SH@@vUPGD,X= q1 e[4ǿV,)@2 I`xL]xJv3 "r:Bʨm Xf@f[iCwֶmg@D sCizhzfȗ8"v@Bc :10iDf]yWf;SkHZfe0hNMx|_8PdqMaLB=r *T0l rJξ9#MHRIR1݀h ]@ mwEd'ǝ<Dž v!%h١fDW{V#/0AtM<ӫZX$I}Kx~Y9Sw$ Y`dBk LT-R(4fK%br@b@z//gg/"_~&ˎ5Flu't= uדrR"J_]R "?q5GODAn{uW  ZB/ɵ@u} Ir) Vtµ- {^Fkǭ=ɓp͜d٘n6ĝM :e|w>?_ԀhMuW,9h&iJ:f M(!BQ80 p `4w.#ӁӁNdՂ @tCpÿӚ&یy-<%c2&f՘l}JnC~'szπtHF094OmDNbG_yߍ//fm LL$#aIIoP{VR {77߀0Esv?~V= }vWӄnmp+,Xb@6 %:d|9> Db7JHX~3 RFDv@l)|d]=Lsq4`Ṳqtء,i/Ո*ܶ#)¹[k! 8zx" ֶޔ.bAc_ ׊ 3 Ρ@Y(N Y9(rܖ $i(Sx Q* d"V1Xz8r[=|4g@K@MD%Xzf3 c mHcꝜ:(p]q1 +C@vFy BU+dЄ҆|;><4]3L fIzuO2jIw95N26;|ShJPQL PP 9{U?F7a4,3 I~UWg;*W Ȭg@^ R ; VGU!m_4 hD\/H $\P'$Xv~ٲ  Aji-2q̽G  ]`@vnb]S؉(.xjfU2q~?]28ziaZޔ_ֶَaZa@}.dcg☻ Dd]C,H}&y6"JZTvMSdS~S`Q_"=$J w= Jb!Je-HZ$8uu}*1)jk֋yαceT4$6Y{ |ުĥ Cg v*Hũ>?4+fHUiZ1i6 oe"tHo%506n8}7n"A]Ũ HF sm|kO%u@Μ9F7a44ekkgB^M ֜U4/rw;^tX_Wn$XW0* @Zh@r(&t!<t98C?5.-ڶ]H Zk/-XE;نuuE#.NEIiD?N$V<V)MXRNg'9ȏ;V~{P&48@ς3""W e]&~#bwo ^,[ ;-:ڡUq<ғAH8^jI=%"a)A a*"7"4Pws2o;H{`t5zogyoBA^d'a|a '>. L]'QmYIAu$:C@=I͏D Yj}w٘HJdߣɚЫF7cP΂u2`B{HoB晰}Y~g~_JT$:[f@FI2~כ%IIeǽ3 iXmx2P޴ } /h4f{:o$u s47}8^0 Pe٭'h$-iۖi]|6?/xb5^K}}}u@zFDDW%gZ`@v3{V Hwcgm'>b@"؏c7pғ4HTs:uJF:4b@-R+ S\`EkF1|;*RdJ UW S BCjj&3nCv#mph4uW&clA\S xB]w}3 OcI2TyjT:q4nh L z/xt!)GltF@w;8p# ?k|S XڐIPX-5 um\ùsv >s|{{A[ŵM臑p} ȂPM +iD:@v3 ,I`@Դg@лek a_m\ _uS}F[uYQqm̙ d!%6pv,cnJjgϞemA޼v'/}F{{pX#$X{%"*VWf@Bf: B$]Ym%sç,Qq;BΔ$:ڐR׸%d28LdVET̳y;WJ/8RfdnB,-@|huȉa4lSchkZuyRu60m9$&Zr$Ee->qF+f @mTsV&T?Gcl3 M L5ž_⊨%R T=i3_ 4&4DXc@ˈ p@^q\wZ˯ʯM7Giۖo}[#G|k(YHTBT// @:Dc@ryIȂU5wı,h ?Pܭ :4ĜgFl~&żٍ ܩo3xQJrQUCU!f5grT(iWG}"xg'qqX$+j=\ۄ7z`!cdB9Iub@ڄ~ d8S^d@z$/,3 Q 61 ȴ:(D0ia8}Gy I}< z )u3 qd@mqC8F$?Qa(|[w)Ӑ6dF9j<(@&(sT2قm/x2(:C,"HOZ^>HN. :voT@7z2 X;w+_sKӂ DObW:>^Ξ=oo1ԧHO||C:TYVa`-5`L!S?iR+W֭XU%z_ DL0W{%Xq{r]Hv4;0K*w6sriNyZrn;Z6!Hd):Ht)9uc3_FiM裏Ro{SG\W`[Gd!rقzB\w ȿ7~_5;>9?owq7?4W/zzQk_ `(d.dj^},882q| nsY_eȂUXe2(3M #G`w![gK?aAe'}y{w+꿘UIa'8`6#8~ota3 {p8zb.:k1 e,ʗބ; Z Ā8w 2ŋ|_U+"AfqKi-c3S$P ۲L0HIp8-o~5\P$A~}^pDbCTsi|}ѣ" 5ߞ0.F{}(rmAIxvM!Ѕ᳾@`!I"ٵX,.3<)Z%w¦@p& 1ϯ)π mcIxfZ ~\ EJcZ8prUUXW0 ܘl?z(|䑰 q'ŕj=\q9zc_D-뀄1 } ;JC@̀ha_  f@Xx V wPC.|S @H4[1QBH]/[|IuզF;IY%Y-π qg@u?Μ?fyHOFcx?#E$$`V1K 7wƹSH` R94F5 ؈.tQ*gzbpGropPSY0O(pD[L DrQ$ɾGg/1;RU6M67!Ī neRw=lucn]UK-d@2t!V?}p.  St7m|^HsZ|mQHt>9*KWŤ-SK]qpEޟ5S[ЂYv`d4!:m/!-Of!<^J 8gnۗ ݱTX+:psK?0LB8z+Z!ZBPS@"<S1*}U)P o N{{Z IDAT|9#V譅ڂ_#@N WDtIgnDCv]Lj(ȲlZvt0nQR5Z6asU4I 1Ry"fkgێ<ï.p& &U 1ގξ!Ƙ@@ {QP@'EmH(I5wS@i#j%pTQ"ɊbY~%iCmo_1?(RM&a溵8!yR<_3S(@T<[]{Ze u > &4׶`]+xe@rrz@73£>ٳ$IFcٌa{[|mO&4 H%R3ER$M]dFE͹s}n?锎mUAe+ Y-bۗЂ|+'CquF7)Cy i( jG@ʐG.<w/ђ#3.@[  b\ը ԈpgBp_M!t" *E@D#8w=ZRʀN5X,d@creUAS#< H{ π_X[Qмwï~M@wH-X.E~.Ah3&w 91L A3j|5ڂV'{EPҏ% B$ 8$09y@aS%Ÿ( !H"TŰiXq gH.mRRaatYˀZ>oyuUxre΀HV9-~oςe|,+ أʼns ְD(Ai&=|7=ˁL+AE>tI_) SO`/S@@Xy~OOA>kGgtQ.^o{4#dr8hM$3.]qBYVE  _vWZ`X{Z`N@ࡇb{{˗N5 I1{Nc-g@BĀ[ϲQ:"y=1r2hM@pR u(,@4} ! KHҡ|Y~)\ 3h6\0*ITawQ9ނ;ۜnH+AA'TLmuGn?K7Qͤ|%:)rE+_\53i%). rD;9rici\W"Gx`Ŝt6)g>󙥟೟,y ne ˛fZO$nkDX-XTIw" 5[[ HTB@p$$ lzX5}@ ,+ dlB"g)"CUSWI)N9B~W)cŤQ@Ƥ<3zN@>, v8zkA }@vd@BI`(vUUQ嫊ԤcX{Zmn'x8EV)!V9`/T"\IӔa:=T r` K;PDR]ʺ^R%esA@ej+,rm?@FS*fW^QDO)tH0Bv9T@>ڀνđt{%-@[UL@L.s*֟E*%L!2ӄ3dZ"&^J"CZk;Ki)˔*MLu6mVҦ"@: ȸЅBp XPVxɸ,X+Rq++ TA@ FY~>(K!f&4i:]C@r[,f;k,X%:IjfP I ngP8 VYy=qCsM@کc('ܹh,XU1&C1 H}iUAС]+z`yI}@D D@fUYxv* ϯ HM@}BuN@N<ɱcܢF p6 0RH,b!2ߟ,Rюt`*Vey ȶ vХ$!8DJY|maazz&)1L5,(Byog5݆V00]`eAሞP `e;\l?E bJi@ZȀhILU{s"`tD ۣtNr@M\ lȅF]LZ*KwXV2N@nFh*ap}0|PwqNjCT߅z/;&]5! ahH5$F[W# A`Ȳj`gU`呦vĭe-Atp1H#Ǔ2)@rgaZtŊܮTW"̜y-Z PWSdQK"֜f$~R>3vЕ4Me΂Պ9M{ǔtAp_Ѝ/Z7Dk3wpV@|$T,wBDdLqU)0%wܐ7vWJB"YQCY,K͒"Z+E֬'?'E+X\z͐i ] \͞oVpK*tr^gy >Sd0+ 3A 8vAvoU 6ނp~HTU Rzj&f\4,Hz&K#tHеU_4 b֬vN@#ۦ[d! +'!&ͼnxJ j\/Vd}fєv{Ġڤa !*1)Aރgpk( k~Ujͮ1& q7NDqz=ܹs<܏eƢb$2p@T cbظh"/l ;dz|F؃(SU60;2 ֤1"# &[Xbz;APkxx ˙rV8,( Nʒ΂ ظM , r%xrPITsKYs%0@EF-"gI5Z"C5mI+daҩ(N\A"P6 s) U#mB?å,|^Vz%V% FiC@d8`C̫./xbNtwo~W3+nu?N F6M$q6;*BaM*2'kXoƥA&paҷg(E/vul.Fr U,X ?)kOW̋ReN9UB_* DQC@\ݝOR/I|g;wJR@۫j#(bO@W@jմH/6R`mNՂ׿;ZWʢSGF[ nWhBT:%vX:iaVokNtK4?"'Of:""( "LW@{7eӌDiL H;`3,nwak,XVT ~OzsBՍsRJ}YN[ ΂u3`pf> !4Xa,4oD'Œ & 1ЉCl!ڮ!]BYaJW?h]n$ Cz`מ_kygO7(,dg_֗V<,X2#-=\ˀ,Ckõ2 VWM~ͳD $IעΞ=K1*,Yy^)rC)'BRU3vlFkMbu@IJ$[P@utE=P K kSzvw`ڐB蕪ЉĄ~zj~+ &pM5scHGE*A-A. t逓A2r( wIN"IH)m ] &T@R&w㔝5ZiB8TNt mr:0HTX$͢V[u0{_E# J 0N:JK*XZovKdPWey_`usxM^ 2;`u:ŋ{Q=Ed #Kj7K}@rQkjV,.ܝ|C>KL0rW> &!Z?G~_CB. 2zFqj+(;{ V_[u¬ۂ-U ˭,؁d@v~?G)F͂[U{[rJPMHo[et(UlJAadvӃZY" [h4 ǎk`MZ%C5hB19Zcmr ?H1mu0QBN&z$[ /AmS~LM SvPS% ɧ9I`wSUBG)>O-0GwO) 5LÒG/>c]5֡~_Cre:5ñcLj]&5)]qBkg-XBAJTr5eM@ٰ͌s"eBS6EXQM ~MEYn6сEdR s yABV}W-Z5ACϭ%E@yjRj^oiz4ImImHda0@M+B` I6}2hO@L Fk B!X+ 2R$&rbRtf*t7ͧx>ۦ"Gu;fAwxa9dvhH%.2IPiЋWx)l6K_O?4G?GG+W]Ν;|fN'O_sUXa΀,nDEe@DC6En ؋)# zBqzURЍER |' ]嬰dQO v患( !`)*[|@_`Nٜam;Z-^.z V(rRvm[ F^="}@BK@@JYRX^p V "=fle^/Ht{ɽnR-֍R- ^3 n0P< m%+ RT/?cDWU2tXZrN@XJQG@L dE@9bFܱvY@4ĂE%'90D#}? j=' l0cZhQHDM@ ;;pP݄NYth\&`+ 9<~y'~~/˼9s-駟1xa򶷽?sۂcJP{T΂z,Z ( _WD&IB"Ƴf@$XnBT͋+o9,1ƭ$rɂ'Y(9=_/yk0tD(0[s'$}wA(8z!PU`HiB{4")EI/ R`,XHܹs a:u) 2Eʘ R6!t[% ad1 IDATB&V1W@t;>3h ;Y}`*wBsUZd@Ju ( gdYM@4(khII1qDEIҖ0 *`@a"|OE| H|`Cʤ$6cmm1C]C|LK*hqT~-. Nr^e;xaqqە'?Ʌ _5/ߡj}՚6-Z[a ȭd?cw#e Ģj_b_!t7i:s۟$KHRUiW/:lcw"|iB.[`ҪS?Ne+άqiAs1,A>£g!"Bpm`5zد b#]}@jINLs7ᾪ"[‚uIY=8##wWWZ΀xH2 RcPJ5 "QE(-~>\+ WKDz`9 կ h%TٰGF,XZ:J @ , 7c"))'nA׻Dj(sG@gXh +/D) Ht{2Q+w,YZiU5ݢ1y]r^$8f(Μ)-6я}|;\xeݗsa1u]|`sse݇e@vwZYP@$T*PUc:y+:QWJE( _u<bmF ٬& }&^nxhTcwӏcH=YT@0$ '0' i yNdEaP˲ww <S@V#҈P@@ VRrMt)DqK-D3ٯ [X~jTƾYP]v TbOZwB7dHUT:$e #\'G& 'ET! YeJe oXwԓ+kkS9y HAN㝎G E?m(4JFC2$&p H*Ȃҕ0ΥmSr*$v?92j! 'X+P^ɋ 5tbM G#A;i3R~NO#SV}@ŋ^z]z.]zJ-omo{o|B_%z +3 ̀H;1`dʝ# !R2jق%+*͢ 78qu Mj3b,X"`e10#-UkF#TRLZX_ba4LNZ~' O[DQD9dds(j{Ϟ} jFwB[v+ 59,7f)JX6a~lBa$-:vtBs q!$ pYȀL2419ǚ) iLY._ˑtHӌVE8iǹn.X_uƬ#@'0z k~q^!tkR𕯢2r> Q@rr|x5* Ӫ7{8fMk \ 0>0F slaqI1 g3 TU{D{XL dV`N HQ73! w| H_iMi$NtEWϲALd5$6PeR%ۤ㋤(H Y]], <0!xC%B 6X &gI,׸Q G8i€K }k>T / xGoH5lS?So|㪯?ӗiVp-XЯ V-Xv1P-Xe ґ_$ ^a񆀤d4{.QJ8'"`?qWa<0)Q%or\d8LY__' -7{2/܁5w}C?Ξ rߐn qBj*&,UYk> " sUj <|~5.Z̀vg@4h :X `: Uс w^ш(H3XszϊZJp0`,X2sUu:,`]2[զ֫` ;G,XU]m*˒,MITET)}wn"D@U+aHQrW>J^۝:QtϜt}翷 n:9bۮ@%+AHb 4B# :<n+ruxJaR+ ($ 12[ʎ]v A lN@Ls 8v${_fa˄ q'%W.v_]g6x;^]Y6*["륖ᅽ`-f@r![YĮJXGb REV4X=8*T7d'}qM@ɲj#,L:<>77 H6)Q?+jI O׿N(gW譇Bϋ b%9+%UJ@B) ܷ/c ?#yWĭ!1$IH҄pb,T?|pQ@*o#( WκV@=*5ojs0 !t?q譑38(_` m–O=x{k1& +2~!>?6R#ᇹkr劇3APx r۝,ZEj Y_ec~Y\S3kT)lYfW9*gz- nzkg# og|_f2p/|ҥK/?s?ٳg77o&gϞo>/B`X Qr,XF.IYs1T!"VA@r& 5$W7.K `{5"9y V%zw.v93 Q$RVu>R NM&e{a5z+H@$[%Qf;q bS&c_!WC hnDN"`2KU 3U5 :)n!IВZiD HebXN? GC@cG);p RB9BZ~60>6(}?GVd6^ec د~_29v3SƏPh.ܹ\r}ڣ΂αcI,uuA, MEFITn\f3.r/Wvd_v?q~iM>!O>$^Vůsy}|c㓟r 7RŰݶ,KʲD)6ztˈj^7Bƒbcw0h%<Rty𹋦0 EFW= TdYl"AV@(!q í-Xkq( q^CpXfu%%uyQ0ʗ-:$VE]!ǒ-}@R,U-3Wse@ܹSՐY:k*X\ym@'%i hB$2~ }@"SqY(4|ُE[0 bliIc=$6X{ H}K2!i5鮥<ź}, W.ܵ*)$YAF\&VtX_wY Uz֟t $ h Wfff Wy[YiO@:+F[݁×aOVXaq7q3״`pzTQ@b#0͞0DN$+JXhw[ɲ Hbz @&Ep[:J4[ֱiW.+ A2I]r⸙n\.$V荅+ Mv+ hd'A*VEx8%kuzp RjWD Ȭ$Iwj Oe9W@Ғ+Wsݗ$)Q0T^ŝèu sa`Hmc*ˀ|~#(vا~y B2g<)9Vp\{^* f3Ρ)LE"WTZAUJtTl՗\VM:o_PI[PPl3cHFjfIGIQ#kUzґVX6q-Xsx6msD@@J32#uris$iѱ. x$ iyE½Y'I[VT$ڍ+\ u۞v!kző ּOܟn}u bUV5**~NQk& 6pa+"<._Un̨CZ4٥4,Ya^xV .wHiU5εf'l)\uE VV@cG*'"( G~ |["CaiB <(GٮW)N ȕD` ! ɹ@Do$լmyG@@n V݈pKI SQb "2UCKdM0π) yB*wXۋ3d/CVowq[WUL *e94'8(oxq5S@RЖY-:E6Jt O2;H0WK :$ԨB&Xɰ:833#.z k7CNKpp +&X~^߈nvJY^j)3 ż V RN ^!,_G3& S9;:$&KIbvDUjO,)%v NȇSf4 HPT%ND@Sv9Ӓޝw,ˍV}=B辱bERfH'kz5!D.(4Zϧza <~ 5i ƈHLe2 3K ,9(ڡ2 QTNS;˂%qـ|k׶Z97=+Ns GLR$C*AZE"tPI}CZF`&,ײ*3 O@f 1MS.kjFcdä!N cE@VX6Ͷ`-* i / V %D[g ÃYfŋHi:h_M6y5n_nR p`YN'Mo 2>Dp jn mkk8$Eh sƤʢR̺ z׉IC=**R1$x/Z&m^N@c) Z ?`aN6FÜ8T@[ zz4"S p(Ȳ]n0g:tN;S@p.T r0Mgw2R@y!a%Ja{_uD}H,9,)mdBS3gyFӠH!#0V@JRVʒlL_DMǐ0/g2`rAj2N)΂MO>ɩ⽫ׯ[=}wHu N$Кg IDAT?8rq_݄^I7&{ݯʢXS$%A"j=ʀ蚤e􋋖JV+',u {Ykb(Yk{5HH ȂU{c2`)г2kJ,M@cR-%Y҂i7% a'κs& .Ҥ HzE@-<) Sg?'`Y @wWW'yWd^);Ȭ9m& .>P! ܾ&Cv$ H6B P+3Ϗ+!0d!q}3u;#w8dW㔺JMJ^~e[A@ܢP<5z(8ꈡ理 &k6{BS@tL@/i!}[EcIdU|]H5XavSg(s/1" TpL^f@Y&CZwQ,i-qʛ$zíZMڰN Ʃ) $ \ ," : sZjR j؍3#dxJY\H!Yd*,X4R 䩊[exO',XQ*!$ bQyp\#b,0S|U,:+U/9XS#gF< !7]x H@ۜ8G!t 2|gK؆{dL^w,Z) 7Mc{v~k-gN1>>[=65IIl O@j,R4dİȖ$:Gc9Y3׻e OJ6 O6>E#lqLVGFE@*T8&xo3 ,X ȻYKdD)7' i}V~'7Q(HӔ<}D HTY V9‚`VVs7佽r Z2"fNZw^H39({P B *X#] q" T& 鍪"$-?@H) H^t`,Zu +^ !-H⺜jBx4d A &OԒ2r:k5VW? }>#O:yΓD1ɔcn @UCII@NXC*W_R¼T@r49}yS@ i¥MBz " dhZm) YXxTTBc2"[CƌW<' ͑e@ jD`[h.H Z\X+-Xb(P+`}Nt{ !x :GdfF wWJ޽:@^T1zd@)0IcdP@|:JQQ H `T|{V H0t9.4C#V ŋ3f0ܸl wyA@Zy76:&2i>mzmEd$ Ni'9Y" iH*RV'8Tg,C!rMO@s!8gV1ϵL'AJU9TpL0& 1 Q1Z% W^9t*=[TK!` gF!tG b(BC) jƂ~nQTG)oJ%9l6&0c[+-XB_vgHcF ,L Kn/S/Jd2dH)N* @K H9&z}_NJCWÈĜ#=DB%q}Bc "4VC[Mˠ͠'IZ._D) W"Q >bk7 Q0T@ 2ˀ"b22֚Ėa&g$4iV}l5$$ .`G{ƨH !?UٷZU{ ȗ%~~Zf,_hٰyPE) ǒd8T+.߽V![JR* LZn0 }WNrւEЂԒd};YCsDcV)WMg23 dxh,fU;灵 r/-Xzނ;ٜxcAY{zJO)IȂe!-r+OitRP/!` `9O8r# woM* w>i]1(Ͽ`}TK,M@'x97a>a6W@&-Xe't|]ޥtd̙3"38wkH^sW^mqvwK&%ރ}@Il 3NFDDC2`{, waأQ3-~_ oܦFXtlR@VMmL@F9"$?Qi pe}J@`swq-@e`ٳ\&38j)+|y.dw^#6-G HZ\+焙 )$q5-{O 8K?>e;U8՝Bc!D@`.<U@UFW>ڎ,`>s`dFA㢿#jM( J @0l46|xebKkͭG ||F#2(JE@Vt-XI6 HB/cv,`IYhZj܈!BW?X4Ap%h Ȫ`'ɷ#F̌&.\K9<1">Ir/(A fDCcmNǸY} MlDIAj3G,Kш̀HK HDtetGq;ɟ#|w7 O>**R1߈ & ᐻw/yn`6# d܈_ Ȃ*XzE;&V( ) .&4mkd @ꥈa) ĘdX$)Dtbr0*rLTN9a h8zE H6F,+ VC WEklʱd[.谸l <V.U5,^|=D6R?`B,9I|uNeuXw)I\=3Ւ]Ɛ8ɓ|>/i>D 44,21Ғ ȀUJp I2E,.63=ڛ'f|| HH.N1Ȩuz`-0*ň</‚^O[йy7>þ;CE@*T8Fxoi * ӟ4׮]cwwwjPNc΀B' H*XH9؂74K9I8Θ$q ڄX^C&_BTiڙ" YVίQ+2 L0Z-}hH0,%ZJ9XBh> _؈pY 5ǖ8›徧,HTb# kTrXe}D 5 ]1QdfA2(՗u`4]6wq%^wԖF -h EmNL ko}Cmx)ǧb+,C^ϐa #-Vx^b)$!1Zxlo`{{ȅ3[f$\<_) Tp^e@قu_W_) jY *a2 Zg}pd~btcߎ k-y0@%2jS@@)HV1p&z`bl^i6&mQ:@uHT5p.I54㡎WF`ٔa2s*6g-UxhTBcR9ʂ&+ ϟg%dx) H`92oFBqǻO# X pX&NIFBhHS@|CiŊA$فv) 6T@*rlQZˀo",y( <di3 $Zj(c^mxY<09u`xՙ}xs I-:z[AL ox3 o %N||-H\{YA޼W؏卷 kDH=;uCZ[uBE!DY#"t(ٷ];Tu96xv5YW$0VxxTBc*2B aex^O=ۮM*DDl#YQ z}Trʈ⋼꫅zڂ5I@Fg,XfƂ%f#S!t`5r`) hzrDQ ߩS HI@P@nꪩddZW@y(kT@l2 fqeXf-g0Rb__աTQdF|* $n6R* kM+ )>V@8PH1s_}L@h*q)$a"GȲdba( JCc&-:}X ;ţ7,Xc"4x1A~2 'Apx6L;L|d;Ȁ[A&tz+|so(,nz!f(Xs=rsHF m DQ/B.zus H0~@L_|kVpTBc҂Y" ~{M4Mb2<_K"FB `zNޟ`?n⵿OKmίF@g@ʲ(kf;A d7H׃JXRKTaɸȤr&#W%V% fُLXy) Zʺ @߃ݝq1HgZ&>% G+ e3SծCw]`4,Xg[ .] x2XC aoX؂)͍N|.mqnu}h7@$3m嵁@\|֋9S\ 3HS@4Bd! 5nl;=u~9Y}9hپrp4*R1“O"̻IO8l^駟UZdx3 ~X]33䄳`e3 КV=_ȓOŸ#"%^/EiD.lAw׷̀6) ZMp\Y!OaeŽ:9׌ЫRHs}@f`xď2 B6HGK(F HdYvH)X bf@[?[dXۻKfC-X;;;(;<$ BbrTWŸ,r Mh5ׁ7aFJe@K4!ia^H$ala0̉ZęMJ2'M?pR<>= gS4LQd(1x}3"}a|SopĿ-)Nm{ˑ " *T8c|Y+{U1lm+#drL+ ,#-XfL[*XRԻ}vc S@+Kb}3&-XiiZ< ƠN_YFQ@8F%Ṫ? ȵfp & CwJ#t0s Hfyk-OZ6&'/^.P#E8q|&E` ``!L N<n2`LZ[m tuw:֚Q.ֽW'IݵQ@᱋ <Ңw^C5Qą*LJXM" *T8Z*{.\X){WBSV@&,XH_"mszAL:M 4,2DH9qT@H8M҂g>U( p  Mؒ/ ۜ`51L\*+i/;d&%' Sa>XI TC77FRH)thBD?UГً) }]K~`rsB 2l@u LLWȔ,d,XO5>ibR`2CL <?tٍy*ٹ3=7ʀdE #5֨&'R١VX#l2̯$,҂QĹZmc >**RB#Q&Xk V}OfkkW^yej΂eky,`a!.$ c7f~R. gٴ}Um\}%O5lo1HPO_wҺd}.^@׭bTB GblGe-X^9`M+ B P+n @bw]Mp4(SXuAϲAբ - 3xkˌn( I7>:֖ pF灃 Fx+,8E0va8o*{<4.cfA@}XCx^_bŌ (J| v.}|~D; ְ;а x<VI.c V( )MGKu}K5=Qt?l? ~z/\ng=oD@P6cNQ *E*ї`%x_|/S( d,/W5πlm!i=,qۗ8RMX] ϗ& @}Pa>o G!Q/2j%}+MY> /LZ2a!Ȭ'M qS@WS@ MίG,&,X(ľk:H]ݻ7gfZ~ f@HS~g3 hzK[UtA!6oKN_`ucJ5RX5&g㳰YϽ{ZGԄdbS7fQ*y0!A$; Q;|0F=B,NhsG=Y*3TB GbڂUAex" n^Q~ _x_X-T@Ϊ1apd\6^P@ʉC* y#&Ƹ:0yP\pHԍF,Ug> 3L˟> 6"\ + Ǎ H_';,k-7:78>1fD@Yj: .X`:\"7ѿw\^!P@b*s2[BY;7m2Ʃ~IsX{q;dMXLCM6zоM!4 ~L %G>"Bcbe,3,B7or׮T@> Fdq  ҙ]~~nM7=g}@H Ĥ.`-*{U<ϛR⥗^_*BK|*nR`Bky/R@=w#m4&Il:[WeAcB ȀxRs$o :g}=uln9͝OέO exˆsURUNR>Rkdi_4R* U`չ?OEk;:Q1t$ĉT:XI7ޞ/̈́C@C ָ(Z5r ?DܿHwh=v<NYE^B{|S(I/ T@' :D18w Lx H0cyP* d{&prJt#Ľ8iWxaadLKn;eWWُk}=BIW@&-XNq=@ζymM^,ۣ5Y Q HiL|bO?V^@@PLZA@f,Xғ xB2Lz)0_+4gDQE"sGOsy~x>ZLMY4L&PdY^QԷ`JQrE\_} /h~/ '76;΍bϝ[ŨH b r+W,_J^xQ%(r7EL #daZ؆54 - $Dm> 01) כ!( H젆We "[q%g22ϑGxt XG 䳻V)]Ư.,Zk/&)?<< K//ur Rp}@ {ZKe"tx$s\F!‚uR2@~jSHAS,?1$ QHB>q-'%YRJvj::& `̜r}ApHQkǓȏ~淑?x|{j}o0Be@&&ej۹> 嶓 HIFmDب5+ W@f-Xuntnp]dP@J:9 g5Fc`Zn~w.c!t* Z(=ۜ& ,+<_ KLj{%ĉ{l~ILe|W~.S H\G@4tDl/IY#̠+cRj:f`(C4#y휸^ÓB5~w~ |" Jy̮HӔ/|  ŋn>ub &Zʉ }Yw ${9ּF>W@ha,X'<^04cn7CuyY9(-XK!kFh +njZԩc1Sjqdg~p8":\z/߲Pp5{XB_I~2I@E5eFЀ zq؆}_p)2׼kcHĉ}0k H59smrOYj576vK\$c[_A@jhv._q~~z1~!v-~,H_z;^~yX}9@}2׋cPҍi $V8Җg}m`8$͜kG\B| [!,`j %jy(r+J=UT/Yd*K.$ l$;`i8tr`mZxZ-zb§TL@>`-R@z0r67q lePB*X|rG! Z[ ~z=` `}oTueѡmR@CPjKZtȂU.}$ g}!+t+=֮:x@3zY鬻Hzp^QO! 5=l18g7v͇9 'A}FmJwK2)w5MRg=33g~|U ʂK]NA+Tx? 7fy#?#ı# Ƥ C>*xk /`Od5uUp# ?{o#u~^{WlB(kcS-B:X= /I_fK/f Ų3XzȞÖ;v)ZHQbSf/vڻrL~]޺vթ=3ZBB58T@ȀRpeEӓJQ$I$hRkss3bjU@c~2+dI"G~!$ܶT9 V2lc|݌9^Zrc7ꄾ\Xf.ݮڰ|4G H" B/S0$YEÆ.% o$źFLEgm;J$Z%MBpnQe! WZ6kCﱲ<$ 2Ċ>sE~Xc橉w)T9f|&>!xKw _ҎA߱y?4W4hR71m" [&0T;AbTb.C^A7gp59S|Ƶ-;}ݻe@qq4wu-̋pc ˗ 8q/,K1ʀHK{teZZuT߀Kе Vb`Hleu M &*$!g1*(\Ma!tBH ,X}V ՎU|\X,'32j^׾5=l% B.$$ נbH022m,zEmnJXh{Pք$ !,X.dJlsoPń %U(6٪bc%dð9M)G ࿊H)Y&:>l4ת ҚFz]j]Oi( XE謁[-C3Jſ"@u~g~??ggg~ӟ?E0`13We8Qם,-X<#aQ[/ 8a(j5E*qhlUUj|ox3/ЂzsRqbrR@-&ɱ@To2hO#B#~`5HI@nFWN& jwp<ݬ`&=o255Źs -Xo}*6LԩMNN6X,XTuI@D 1"<@|gzhƬjxK<ꄎbz8|kDN/ҨwF]h.K7 HB¿xᄶi]g"$ VB%V)i55 .q ED@?s=?ո{{jUO|??'`zz/| !PςY7ϓ" Ǐp4{( jX{O#A1\ UU\.S Nd@弼JuTUVjͲʀlnnB&C1(Bkk_B׳LL|߿ 7}@z5"lq fGI@ c@Zi HթUjd6:a4xJ_mχʱzDbABdffmPQu*lFlDzzv,/Xvд4p&'Q4K5U[yb΀c[*Qr2?CR0Uc@M@ bML%)_* [*)3TQ sG[{W^&iL^OCq `N/ [) !\&kmg_|I~W%O~ץ,..g>O?=Ë/tFp3! Wg 'W\.ۊ{󤺡 b(h(`!W_A+L # bQڭ)\wZF8Fy{) NSL$P|* _fjj +,]wK8zB=]Q[l:> 5|U@*X* Pm$ +iꄼPzE0&Y0z4B4%]SmVzlllȿ[b1LL\Sӂ nG;A1<z0H=l@!i$5 j%@H^L*Ұ`)$ > ׯ]j4 kITJR,r9q2ۮ4m# 6._v=M? HhRӂOV}rr&`U5)%-VtM)r`E_uw6 F*K.H"XlnW( o?8еWSm$^kf6T ZD"$lDx3ft mrl K>xSY-o V+vvv< Eo+ }\.G&B،Pҕ1|YIwˀHC* T * ,Id.;G4ښKFK)x`փ sPì(Y*-sK( sG` 8X@q4ЂaT92OBIYN*|p .ZRõ}C!).-erc) "D HDQåb4}FN务 c oRcDz0ޡ(jhQP@0>2 `5'fX`%`:( z$N?B,lSb w7pkS$ !i H?U_Akśւ X0'C薥pvl ,}k# MAerÆ)CfTVR@n0Hj=3 "\,>1i/ ( Zm12b;j(HW`d5M*ٰ @\p]YjaA+5`e 4HW,Bar}k!\v`lſ/=Z&s0U;&_*䱝 5 f&\AZ^7$F6J ߿}5(iMþUA5뫈4:j$T@p(JEvnbD "N V':` J@c 7KUMj I@M|,ޛT$7'F@@ >:#1Mx ;t.pk=-Xʞ H ʵ2 uvDckZdqbzťnǂeV$ϣv訴M"-ɣYFV45= \]]ErxM VJS! BzZ|]ѯ.7w {:+uz]w^_V$CBeq0tXq Y8|?fBTz2h%\-`{(u_^1#]zgD04"!BjOBp20Me2_``ШՑrX,ep5$,*q<7'5 &fPoT<\?wW:72Bh' }4"Ƃa_qn;`,$ Be|p,^YlOP zKo. z.?v Բ5K4`V8 #}NB.b;Eh4Atf@D*E,&hjO4yuց}A=}Wa*w{f@@c wOPW" vmO>$zac˅]ЮXN x~pO;>}YBc)|.aLLȾBXI \($̂:Nz@@uZB_Iڵȟ7tXSc9U:**No{cb`{ ,1U5tOhyl1gsMXۭ$ L[iuTKk S\ؐ U*S5%pH~,M4 ۶. ~Bp,} TAbYydk@b6lJRPAQEr8 $#FwaMӘ;5G>)n>Vw=+| sf@:?C֝ Tj"fq:Fy_/ VZ۵ : ̀™cgة́* > 3Eʴۂ cVK }L8 =v* B`3nEVZZZ?dOg)X Y\\5ffb)Wu5 H80`^@z𗓯Pw$b\%g(h kk$n+:I=Kץ xN?B2y_$kCD@"D`A^0 QUUuϭPL Z J5b? 4M D8M@:-WZZQ6pDEPQ*mۅexkeld0 &|~*őy Q#r #T@Ղوp:>Tա2 gc;y/>0X+!* qb1S3q^xѣŞ-`HZ h( ۏ* =|Ykr",۳{> ]hu\ [ o8HL죍ߙW?UkWڵk X.Zm'M9tA@| h Jzޞ ֮g²9]j8mG}qV$k!U*X7/hA3 㷔MZx\mQzLG *QMg٪n}~_thπ3G+^c :@~dFKg#T&8* !SkЂ{* ǷPIZn$^YzoDu=(x&Ǒz/ VH@nۘNMsn\y1qj5H,Y`_m2gMf-شe~u++,_ > s'GP"O?PPZٳgyoGm!BЯ+ϓL&V=>畻pc,X/Ûq[,G9Y N/֮lnnb4tEiPqN@RwӰ@ۡTD9<|alfW^m~o\c׎ Wa{v HcCG>}ԵjG~,X 32 YpIRlllU TYYYaffMӘ ,Xt]vsOcM@\ܼȝSwbZ0ЦX8N G ȱ~[gp x-Zh^ o&0N Vf5E\*JdlT Z#̀dt8ӧI$t"pUm/ V:h`~u{EbVECó:`飣2.irefhHoh+8[?(1 :ɑg$5nc.V&kAtʵ“0g}KBZQ|#s!B_W|ӂ֑a mU/ێug@`hN[ z}EQToS@D*%ʃȗ ^@D[!t۳{[N mn4FqS1qpxY>tC=^H o[Y?( hơ=KyCWqa/ V?vpK@ [' z" a^ T]]@WueO z<._XBafĻt@@ޘ, j' a*jɑ6Ϟ+? @2>NLZyҺO\5ҎW ^!<H9("!B '!* ЛǗBf!qƂH@&tukd> H֗yx\V yx:?߼ȂuKzH{a {yw칽|oi9( NFS&{) f#gRV7T@:0ދ42vD1UY[[qįIo/n]C;F i$$&IL?UTfdb4D![.Å p~CI<Җ^߾xG%6VHkR|h&\mܼ$"@9{,O¿{ѷQBEj2p0 Li?d@^TblP_kNڒ'mlZFv.\) 6 E@8GY\Zwv{׾G.0/5;.a/dd'❱&鹿V !IqNO222ȑH̀f$M > JRBPo5h)]]iƃl_o6롨1##Թ#SBU=!`6 lA<72 _򗉙1QɓR]}1&iM /̑غG._/>RD ȍAD@"DګTݜ R I@B2(_Hʨ_hNOQs*B&/*gvKQEWOd*X䡹Hiw~qi:'ORK@~z Hb9l5˲,$rks(&/JL0::ڮNSI w|#$1y +T@ɰ9(wWF8taH".F?/ׇWD50SB3<=iaI$_[RU`9iSۼ`vڑ=1?{!B_'_yOB? VS Vf8V.d@!$ ~GrgmiB,YV |4aCW%RAna֗[~#ъFd,g,ϜfW"viiQ6=@`!c=΂҆U/ױ=~ڦ4։1#M@Z!J2kuR~:C {S%I@|})y;:4 ; G34sH)or%~?j(nK/]`6FsѠm(@.銼ޱ,w /(Jd:("!BдH,ÛJ0ǗWn VN}JEN{H@p,6jQ*SuY{eeq|KlW@աah/͒NQ͂ y1z{m|T@ϫ6+侙כ8|go' B =ULDL/~G|P(s-]a\ŋS|O0gYϫ>X 7'8C?P5axDD"D c/ ֱczv>)Û8 I 1{EIJ+A2f=D( iW^a{(QrkFY*X1}iTtmQvʜ>zzqr Q@ Eؗ͏n1lLVW2uJR 8$6 Rד%iU@G<ޭLMM5TEQNZxe1B@Wk+侩GٙJ֙#G"U^U+Z#d@1)az&_Wyꩧ0RA(g)%.\i桤h, q=K'cĽJF A"V`/ 0cڈ2rP ְ @ g$C[_zed K K hKO$a5! S[ jPvv' zoT*cEQxSKL`7J!(cۇMcBw 5Im`ꂾ&&&(ȿmH@\euuK||hjU@@wZhS@ !Ձ֪z7/2L%;nĹgί'Ejw]frR{;;Z,.^Z N zU<Ť.Jw(J/"jRE*>U'OMO$ !"ƥiU@B2ې~C V Xۂ51fVb! HUٔvSCV V<[1YbÏP*2jq>'NW`l I/{3gp1GS@h~ǏsF%e&&&8{jYަTy\Pߺ-h6^V"V`7 oo>^üưexi32  "+eʘI6{( h$|D*E|2V7?gd/$'` @9.\f/6={GMEH@f3}mZH5mw b*lI)$ qXZp=Y.}Sm鹿JF@G*_U qr$/LܔB4*V%u*7yQwBAQtΟnkP . >\~i$ c;;T=(W9z(.\䘙CY)H$8qm@̌@.-]3d¥KS]"V`7 S*"=3 K1|#ƒ[JѶ~+ H@,0RŲ,3T$J|JZz H[k/$'` C@L" O-<7~Rq*C?#mL@V+L&&{*F̚u߿ض-\ f |]?Tf@:ŢT,K玣 }:$I4,&D yg T WUPH[N*C1u?BxIRq_51x8sI誏y/_`{,XQzh  5>ϡ)Z[!Aj2[?uϧƲ|/22<|q>+ گ`9t?UUQU8nMΌ[˲*> wCDV#u) y;Ki`mUUr{* e_d|38{XġC ! X!b3?}d2)3T+/QAu4\{)g:8i*?q'xxa.5F "v {1jM>z by,NSuB41 ޖ_|F`Z]]EeTRڦ$Ȁ@{7NRRFGMl]k"'aE*`5=1|fUҲd"!O,6A&˞_\;2 ߅<|sj1BSWSC~7xzY A$22k ށzK/7㏷*B1G?QL&){px)K$qtx`AV:s ƵF#" "D 5FYR+T@zɐ Ȏ#*- ;jb*J܈T-Mr6233p97?+;Hd*XS3w^~/[=P=}~O˂%3~+`ANҠ(—Z 9{0y,TăcXQ3$0kiXq+:ʹs2|P./~+ HJb*>l5Youn(N::%oˁD "ނZnDXCޓЂ5ķS:&_+s  s bmt pw2b {]4Mz",X7!B_AZ*Om IDATXÞ,R,A@hڪJҚ=C>TtK!"ՖX[-̓z) n V!S]?uC!=>k苀 jR 4QsklnnR׻ @_}i\ؼc{AD@"D~ ABG8J,.tX,AZm MtII A:iZ[2O; C3D`:@ Uz=nS'! xe\=0ht82 +$ U 9 * ˿M-Tj# zT@ c͂PUR}YE{PMIslp.R >|)K_ 5# Ƚ]+B\ص$1!p7L&W WyxT^QI]=<#:g/{ˍ"!B`jDW@ cLC,!J, ,74Ro*L$֒PZ jݮZ֫\mEr+V*h NB2g?&3dfY2K~>|3gf7k:|* 4ZoNWկ.jjV3?Q&֫`L% ?#4dm6 Ej"͐?U@LazV;vRhs84:o[nn.YY;ٿ~JK!-mjH1xMh04M^=MFГ^+Z,6dc0zk<9LZk63BXZRRBQQj1]X2 3|h3.`2ҝzbpy ":!B^&7V*}x2ɓ7]?f;ZI#--&Zje7}ކ2zRVZ].H{}(ihx=_vlbT=6Ak&DԆUTVOy Ao0iwDq( V%??ƀ;…{~HQ-X,hjrOw88 Lc{\ր_rRJ ۏnǨ52,cXHOwpȨCgzV@&a4֠(.vر`VΚWF[3fkkS>'$lĬ3oxvƽ?efVZ2֤ 4 ݫ׷55Oc6cKGç׺@?$ި5hxPZl85ᯄ ]`}]ZN[2d^m+dWhmu1z3(e"_t9tN3$!@^ zήe~wۈ)PN::dfѡD2z`|>z kL2:{t'׻E^OE҂jr XP *&سvpYz } {' 鴓>^UUEyy9zN; u,c@N#V1kdth.TpR]=gBg.#`bl9nf}=;222̛7#99or'0N-~崢i5z~ "rXyy9SNMtB ƀFق-]Z9= ' g`PւNe`s@rwiq%GC穀K@Bj3X* Oa%UU>32`0PSI ۂjYM0Uo5p5_}(&##1(}#Ɍ@wӦv;8 Z݂e08hebsvcAQ&o_=>`l9k4txiOeU_e/m`kCIu;iᏫ S L-{,SUUzq#^-XA7"Lx V? HN@t ފŔ :\`ۯa2֧ld 'Dl}Զz䛦o(L H4g:f YYY:\47[X ۶-";{99ݻk4RS˱7QUUh8d"77[`tp@H+`gpQk%5&kDk]?qu-C m7sr_2e :iֵ;~-&==RN: H %Rtddd0k,D$D=$-X.rEbb4~Z :-A+ =>A=\yZ<H}[=@Tz}\<3P!+ kv hli rgtLFzܮ/-znLn]/ÝtzրKu7>NyTOdΉ#-d)Ʈ@闀9cNWm,Ɋ+ǾA?gyLvun \,6' HXVn6y6lK꫉ODFAh$ dNa"U[z^S Zm:S8ZBG^陀ӰaXMְDD_Tm9#8t -X]ohEz{,EV@47AuKttOBǶorĕEJN$vHq@Ol4 iQ-MKᲉ{yAgdth^ҵSK*$ pkI@bd„ w}̚5Sr{1l0~%:YSP[KݏiЃU@Lji"CixiiO #Kt:qe0qoQOBQ}d,OmX/o90h dWIYi:t _ ζ6 9۫?h<@A ݂s:+ V?7ۮ[LY@KSO Ԯĉv;U[y[N.]s?}߻Vlʖ#[8< Ft± =ί\+W%^P"d$W^y%!c~y}H9 A$ Hmm-))y+ hi0IG /䭀LGqwƥxu"DS VŋIG SFW5 `edd8ZuܶTk`!@NNOeb2y  C1SPP@mm-mmm>-X3Jha԰ F:}_ w3lXK{/y{hw:jsBPM?~u;1{lt4;}* ZEaH }'`_\h,I Vv֮]ȑ#^Bd(_y^{re7JMM |B-Xzg >o*ضTמ$w pS[W?(e[j~SFpe0`AD}Սa_uzkOKQL:--dggc21Jhr|vBwg 0Ý[t E&( Þ1+ -T~wx55 FԮiI@>vp  B'0) bthTb2,|%ŋ>|8r ޽|j֮]Fc DW@,sA>E1 U&&7jL<ٿ~.'p:˻$Xo@MEAhW٣1jlg{~$LhZR )j[V-<m~+cc1]I$(H^HK`Ӂ͆pӟ;?pOK{8 >ge=V;5 ≋9|nȧoCMyNMZqX ȨQx饗X`?w}s9' w V<* AMttmXCW%Pg'`Ϟ_R_߹55Ocߢ1X8g0W@Z=csdž<:%xB4Tc*O@hwT&#T@ :CW>y+s |YbuI3pP{3x-ƂqfZLD^eP (1ri&ì]O?=ѡ x`%F2_ Nl:%%K̜Η_.m46~4G#F>_| ]n"!&!9 НUiwyAwi6Ov8# H=Q4;~QHÝ2|[=l 3lzw ~/W,{9 : HvJ6Gam3ãkGH!DՂthzEKy W_]WfYNg%;G!6"y_Ab+ N@BZhsEԂh[SM@m+ zﱽ{ijklw{dkQarfVƏb2{>o1@=[r&H&|6+.pvfظxb6;_^0T@ Ĕ$ Bū+$iUD]C>'ǎ;}BU#n,g.u%%wwRvߐ8$ d|x~۰"} D:t% ZR0$9&>@ijnn{$ N@.E`osՏM@];1u:Aud%|yK iZKb0WĘ$ Bţ`%$`z|#gyWqX39pפbQ bp9 lBfLcmT7VQ4[Yh+ 4w ;?x < zW@p:ֶ$7dv].[W+Š0magpp5zvSO;).v陀8\5=|D$ (0IĘ$ BţP҂e땀(Onyos`sȷ7^OJJJ=%1;-dju<4ww|Tm6kpO1itft8 tz,o~+%҂s!BVRU1{K<_A>7_Eq ( tN "zPXz4Q {fý;_{< .uE#Gf4Ww@<ORXX2Wׂp]+6ϛo/_a[ر/=vg;U}:vr3-cۏngu71#|7.>l=+ UUkRPP2歸\SN@l6FÞ/#CQ4~С+PY{ܱ6kytSws:@q+\i:2Ɣ$ B$Bm=]$U9z3 oNvւ5.w!WM^5 H,L&$T/ (ޕ_sWpӟ=+|jAEx|o$I"1$B$N& oRV @vJ6_sw=@bYqr[3F HoRUUmJM(6@ t6ϟO~~>O<ҕ4F]âE[YRGUsܓd{vG;{F,H I@"I T@D0 ՏdI@M~^q:S]]>+ /?8caԮ Zf-1cNچ婀lD/H I@"IڂeKoEr`Xwk؊9+H7s=+IDAT2gE<%Y3^?#|Ç}Z,IPUkt Yu+m۶qWrsW=G3*kTĒD!g`EQ+LBAE; ]ѢUQ`%k0`*~fzoF cF9 6[z`훺* 'a g׮]Y;jyVM܊ :]޶9VH# B$ Nl{3B`x{SL!ӽRt HPĉͤ3ok|gw|Cz 6,ǚ(`FL;܀5 g<7 H~~>Z6`d֭\}\ve,yEӢmJQ*J*L-JqF1uuԶ X$ BD֭[ﱚS ؇7.y#Z*e֭X,ҸDz V%??߯bۙ7oeee 5ui|K!墠o2*Z[w^ r5װ~֬YCJJ{Fj~!VTp9恀 `mdH%$ B!'Og+螈~.q }[illgԨQw!)I@B!N H@ xRPP@CC\r 555Y9}c-Xa,\QRx9]N>5'd`$ B! S Ԃ@+d&GR5|K>߰vgT@)I@B!NW@ H_s@Zϟ{P'C@tOD%s@'I@B!NU@RSl#BCr)_:* BQYRɿ&=ݨ52,#y7I"BqA{+!ifRRF]d2/c4#фU<dmZ68DH"Bq=MÇߋ^CFqr?66!!y & B! BQ>ΞVVẶ!aVPE;d{vNʒ+I@B!Dҫ(o>^Á2}D!B$J\7> ALQUUMt(!D,D*E-Bճ~/ԒXdT@B!D[,sV’=I@B!ĠPQ\H`' B!*J*d AN!B1( (HV$B!(TTH ' B!4*K*22IFuB>>!NtvtZ6a18]B!"TF1!(I V vnF 0L4իW':\2!+cqq41=F/: E$sb .^u&O… T!dQN#BH%${|08by?O?͢E>}:v[n .@O!qT!O2rڵk1,X^B 2 !Iٲe eeeƌ֭[B 2 !I9z(6ѣGB *2 !I$!EQB=>H%${|08b<%O cQDF \]]@dS!pqT!O҂#ƍc׮]ttt,;6a !Ġ!B$sU|?spi%(2!dB㓴`ȬY83hkkcȑOw矗F!臌Bq| H K,Z%K>UVpB9vof3&Mb h4}qns뭷2sLh4,]4๟}3g$-- yǞ={"ŋ'tRL?… >|8~>sq‰1QpӦMuYa0HIIa,[D\PK+pbL},hd JMM塇⡇ zܹs׿H+pb2FOQ*W_UEQWXs|jAAt:Y~[UE}w{K.{l޼yjUǾkUժv[[hZZZ8z:t1ݮfgg3gK 5D]`6d/ٮ_4d\ŘXؑq"-X vZF# ,9~饗rA>EOUդZ2X,o̞= #F0m4o*_yMsssRVVFUUJXV7L/2F.QHTؑq" Hmٲ2F1cKM&`֬Y)]vpy1cưsN%=dee6l_wox:rK;FD^CUUq8׳|r֭[s 9a_y$=-G^2áJX8zb9 tQl6fZۘ>}:6;wRQQ/g}xdPUcǎмLԩS?~<~z~x >\y8N _!ꫯ'@r]w_HkW|7dxp"cG#' .=^"#Ggq;vnWKKKՓN:)a1ٳ'`_|*._9_*$,`<}{o#v7˖-KW߿_O7|SkTFu]&5+`qG#h_1X8zb HeeevSʊwH!IMMeΜ9<"Q<,P EQZ_?Zlذ!.wwx{<_5,**3fp8կ~UW]0X|W^y%C x߃Eс py8GOl2$ƍǮ]==ˁzE0|~mݺ#Gb0Y8Mb/}=Ϛ,ׯk۔)Sp\߿?ia8y~ѐqt%=x2<GO,$ܹs`ժU>ǟ{9 8Yv;k׮eȑING?_ihhߵk6l`ܹ .s}.]=Ò%KO_j1bDR\þ &/2dCXؐqĢ]dɒDq1b~!˗/fȯ~+c1nܸDŋinnСC_޽z*;~[͛7yf^{5rrrP/Rz=ƍ筷bȐ!lٲ'z}YRRR?>mmm455g}Yn&JKKy'V(> wy'g}6_~9UUU> zBq߾} ^{-6l#GqFnV\-ٳ]PKG×h(1&j,q4z2 @&'nWouȐ!hT'N^:ay{ Դ4Uө999瞫~ DUEUEh4>޷oO?T9sfddsUwޝ9s%%%`PFzI'7|zرVQQS_D]PbL5\|:m4jZVZjeekJ|~"hx} %D2FOQ4 !B!C!B!F!B!DH"B!I@B!q# B!"n$B!Bč$ BDiŊh4/^OQQ_~9h4}޿ݻ%Ko>s/^Lii MR!ND bٲeL<{ҥKywزe fy磏> w}73f̠i[!bMR!1@˙:u*ӦMtrw xޣ@{>|W!AR!҂%Dz۷vnvJKK1ruuqcX0 8N9K3fPYYm]xgmmmm!RRRe]ƟgƏdG}t`/BAR!?R"Fv @vv6sfɒ%ql޼; 6a ;v`̚55k֐AUUo. V}mEQ8sxGkm eee~s=X<[~=۶mjOp2b<̘_C!T*O?*jggڪTtuժ(p5ꫯH" c?I@3g_v-mmm|{{(L2Gy-[}}@GGG{N$!H2 qU3<:;i/;Ԯ]d;##H PV(*>9991sLΝ;?l,y&C \r888ЩS'9bŋL:8evcNӭ[7/,4]vѢE f̘1ܾ}nǎR z}3)?>>>>X[[N`` W^z6mDPPxzz9ݻVPref̘a^x1z f͚q[׳b v4ߌ3~4j;;;5jݻN5([,5kdƺ .ٷo,79y򤱬{{<쳸bccC*U?~)i׮xxx0b^mF||< (($oߞ2eEn݈/`t:ڷooL,6l؀Æ #""5jTq B`` ۶m_~9>###֭5j`̘֭1UV;&M;m(]/fΜ9ٳoMZƌCժUٲe }ɹZ_}v *4mn lٲ&IYxx8m۶sw{ٲe;vUVh"mƤIDGGӽ{w|||ؼy3cǎeȑř;g|Mرc b̘1̝;It+Vhsxx8vvvƘ ^|EXr% ӦM:s̽sF^FݻN:ƍ/ؽ{77{Yz5>>>iӦXRBJ[^{5RׯW:N?~X*V|Mc:uj޽{tjҤI&S52n:To޸sϩ͛|fƍJө#G}Bh߾ gl>|۷o璻 NScƌ1ٯiӦjzl+ɓNS{x-R...m___5zhUbERM}}t:Zbqr&߳RJ;VnjT233e[lQ:;RʕSMz72 J) z쩔RܹsJ5JKJ):t::sLmcclْoʝ8ԴiӌemڴQ-Z0/7C{;(5v"/@Fx@{Oݺuee˖gϞݻѫW/޽{sȑ|G~7cR֣G;4i҄~iӦqA]l׮]ȹ<&ܽ}/m۶%11#G˗7n111\pǏO@@@mt::wlRor~ݻwL-iڵ+SN /`V߾}y&O {",,ӳgOVxx8*T0.Kƍ?~<| WS7nӹsg4mjj*I@JJɶNcر:u}>ŕ{tiӆpV믿8zUT~w/w[_n]Mbvvv~ERJ|r!WN^\w;v,d899]]]tL8DFF+$$$uVG,!Sbb"&Lzt O:er۷ټyȃMEt~ LCݩM6y>yfhݺ1Bmʵcǎ|d̘14h(.'''իƍMOB0cնm[CxxY֭[eq۶m&ӷiwߘn:<==Up͚5={$%KS6l|@zz:ϟ>| cҥԩSǤ-[rI7nۻ֯_OFF$Xs("99Ç`RSSٶm=zФIzqrrb٤og˖-t;;;qtt}...lْM6n:֬Y&Mu 2`.^ȸqիFz/^L߾})[n=cԩtؑݻwi&}FO=qWTTcǎ-w|/ǏgРAҵkW~wV^ Px뭷~1YiӦ1(,YQExFXHHK,O>p5Mq+++&OرcqvvM6ٳs駟ocR[6oLzxxx0`\t۷3qBXW^MÆ IC5B|SLQ:Nt:땫j֬zwTLLLoܸܔ TQQQ&9rD5mT(^pwޅΝ;+;;;UrexbTLBCCU͕*_ Qiii&?QO,d #""4|`z2dSLyK3;w.Ç7K[ޓ͛ɏ=tGrM<ÇvZ^u(B` aۤ|ѢE4k ܹ3Ǐ/vvE͘1c}r̘1øxbz= .4͚5 ???^gŊm???Nʌ3~d˞={hذ!vvv4jԈݻw?[^ϗ_~o...dee\eʔ)TRݻwS~}СW^ܹstjԨ]ufׯ-4i$gyiӦQ^=ʖ-+?<Ϗ/2uTz=z01c5k֖ *K/bҥTR;;;t•+WLeĈxyyaggG֭MϩQ666ЪU+;fW>>>-RH%ܹJ*y7xؾ};k֬ޞ]0t֍5juVf̘UL^R\aaa-[Ǘ#NDze8vVbѢEl۶I&9{,ݻwJ*l޼qkP?L~>C.]ܹsucܸq|]K.1d /-[Vϓ0p@zΝ;ٴi ȓd L8P/_΍7xg6lˋaÆADD5`ȑL>ÇʢE2~V)Ů]Xf /fʕ8qW_}ոOzz::ubǎ|'l۶*UЩS'.\似bȑ޽kҭ[7M-[sB+!,voK/,Ժu۷WC{9ռys6nܨt:s-R...z___5zhUbERM}}~^ʕUFL3vXc~UժUUVVlǎJyt:zL^xPs-轃tرcƲ/Bt:>}Zt:sNr+W*OO g;YYYڵkJө^Ó'O*NV^o\ڵSƲ?\)SFedd(Zd& հaCR꣏>R͚5+{M!,` a111)$00GGG'>>s~>};;; `%&&r|2ƍ#&& .pq 8:Ν;ҽ{wQ@t.]v-~+mOOO|IvժUV Kpp0+2]f,۾};O=vvvX[[GA Fvލ}-pW ͍7ڵkSvmyeggӱcG@&M8x cǎe޽X~BXI0{MѥKz=~-'22 *v<==Mʬpww'..4=<< #<<ܸaÆƲr_';;۸gANgrYLTr;M,-;9UN6l3g޽;ߟׯ;Ϝ93S>xyyw,B2qDΠAbɒ%yg˖-t;;;Y&#F`_lْX~hTa!CXh:t`T^ߏoӦM#11vѣGپ};'O6i+""dOKº&MYO$/^dȑtؑwy3gΜrM2|nJ=ؼy36lȳ|:uE:t 0i$-ZD`` #G,v\޽.]ҡC8|0M4qSƍǸq;v~xBX *ʟBB-ZŋsaCyrvMvGh$$$7o a)$L222S駟:fĉhOOOΞ=˴ipvvROLL ߿5kj%$XBb1b?ׯ_Օnݺ'PBCBC,!B3EB!f& B!I%Baf` !B$XB!f&)>Z!cI.b}L8QK[IB!L,!B3KI``!hʒߒ,-ߒ\U9Š,rY!xPևB!$&&v:Q#NND222DK!Zz5^^ #=}̝Q:I҆7B^zqv/nObe@JJai}^/(*ͿիWӲeKP=z___cUXݦOnxB݃3f0GO5X۷ogȐ!t҅!Cm۶b}۷W^y%O]pp0g֭[ܼyٳg3lذ" !B ֜9s2d~~~???OƲeh۶-ժUSҪU+j֬IZh׮4_aB!ťc*T@hh(O>ĉtؑ #n1B!PG IrPvm F !B<A7o ("!BaVJw^*V/.]ʕ+iӆݻw? diÛB!XZcjgsH!Q|{ibiٷBa.ևjK!q# B!I%BbT$eUoV%]BfÆ DEEQfM뇭a !}n GL 6..}:QQQ?~?wyGD)tey= :$MJܾd !̡QVDE]b򹣶*'gZ>TݝX\]]7wtt$99YeiGi/qcU )II6m;jۣHڍy(S&Gǵ?~+j9;{ g X ТE#~-=$P~~~~\r Oru)KBG`|GJĉŤggg`(/2lG#%1_H1䬹rS["+KZ*nnnyoիW  YZ]ZRDDDо} [[WFZW KC]`iGiq6m,$ [5XBg-ktܚѣGQ+KCKL/`ChRvq&/_f/~=֭3x`K!?,,z饗Xr%'N 00t AZ/K8Bs>Tɉ$~i={6Ǐȑ#Z/K8Bs>D$Xʕ#::'''RRRx'9XB!c*ޘ\ACH-IB!(4KRRRz\‘#GugϞ|Z&B@huϛl{zzG}CB!0揅Bs>T) 6 B8lKʀ6l5"b[!0KC5gɒ%\pf͚ѤI,X@bbV! !BEx˗Y|9˗/ڵkӇaÆѮ];-B˗e攕…be ֡ !x,- V.,] 6EhÜ̦MGIO`?ӬY3BԩS)1,-Q ֝bccqww.s9}4$# 6+pww%&"eh!05kɓvtgOGi,l ĉ /iɕ.\^=@ i=zT89yrm`),]%l޼Y4K&Mա#֠A23w<a !YtFZ XIf hDxxy{{3@?J|}VZ')==*UjKa`?& puu0Jy{1[na֭[I^iܸ N%`04ر}xyyiBU1YYYp]gU%FiCIb(DZcLVVS 7 X?r֡9jشi.]Zj<2*(]233Jl/p3=p,[`"-YJzjn`CI86mǡCϢֶ-׮ !"44.]F`0|~@ B2q^ׯa%KICͭD?s!wt:{= *}Ժ;JacS(ڷoUXBXG,.p8QÇoacciB[ϼ 0Cmɹ6nH pvv'`ٲe$&&2p@\]]?4\a9J"==J*iBknT^]ЄQ|yf)=Mvv/X;ѲeK%k|||h֬!!!yTٵkZ࣏>bǎ/߭4oذO>YLzz{wf7}BAŊy'妝B>Ԝ4O͛ǭ[2e}J %%gggOΊ+!  C&MHJJ bcc9|pwC!0KC5"R+W;w.nnn2N m+..k׮eϞ=8880dό3 !BM˗OQG5j@kx6mj|KJJ1JNN˝ $00Hq !$44PЌ& ֝ زe O?t}nZ\]]5)Ɔ#GX=z\ZjX/ӧO/R\B!%{"wVRhSrnnnӧ~zmۆ=Cڵk1tPnܸuw Θ1AZ'K?B!yŋ h׮kˋ۷of>s\]]y'hٲ%#G4I B!(.F Uo?ˆ giٷBa.ևj;7oNddKtRDžB!J,`&} !bi} t:W^4nXB!GE(T~Ν;G@@+V:L!XZZ~)#Gbɒ%kxi>EأG&NH6me{el޼-[op aiÛB8eNVXYUN'܃Y KC5O\\\HHHȷ\)#)))Dg.!(%!a0Rǿ/#ևj>EX|y6l`R?R|y"4!Nr5>` x68X|۷/M4RJ\|z^}UBQeeeaeeCv-d5 KXͧbbbشi׮]ˋ={uXyXBvTT7 R~3G`vq! **=qZ )T^ݻ7SR%C(ևj`s!fu:v0,BDžRX$KC5_/7t>%BNZjZ!,#X\v '''-(K˾Bs>T4a0C!l4ꫯX~=&uEuo} !DIsilق={6>3Q|ևj`Dtdgg?h fixܼyCزe#66v13ammuhBJ)Y'z}"vv ƍk(KC5OJK8C)E8rďD3|xk?P}Ƙ1M)uF&`={ׯӪU+Cɗ]q)6 =*;b'e6%%%.ߑd!J __  +A}p-lll dΝG&~e+)ɦLtCFDЯ_o @7{`!Лm`BC)Bgggtg,OLL2<,mxS<^O?OFTΝ?OhJNNgϾ e ;Yfj("KC5O9|0^^^ʕ+lْr&K K8'##FZdJ:'O$)):uu8,U9w̘1@TTǏgРAZ&cƦDH"Daj׮uB#X|Wܾ};wqMVIaiٷBa.ևj`ƍ+Wej=Y!B%&* ,B!PM`eamI|UB!DQh`?^ !(D~G ,;v={3ɓ H'gK [ѭ[7b%&Xaaa۷ ҵkW3g2a"7K8^V>x`?rfŋprr*TQXZ+ҥ 6lo߾ӇtcG}Tvs c}ff&GBBBL^"]XBS;v@)gz8w#6$Wbi`͘1׳o>Ξ=K\\={jG1yd?u5o9sSNӋ\/^BBÆBTڀ [_%ÇYx1۶m+2j ld͚u*D4booo}mճgOթS'NPP2eJ*UR+W4nrE_`0+[۾ (ئ쪩9siEHHHP~~5*h[*77/ *S9;W!bV/ԋ/[n8ևj6͛7۶|3`0ּypwwF̜9m\\W\A}իǥKHJJ*^(;CzJrӧG{G͇hdfvqg^|Z^NNyA_K۠())YfoifnܸkE-@bbRS=X:vQ~XɻXf F2ذn:KZZZy73g...߿^x & qGGG ?ܵV!wMʔ(!1f~fJV1YQr h0:G MӦ$$Y+9_|e-QJѪU{#R㏓>|&MҊȏf NJJJrkkk֮][(ׯow-x7o0a1Y8IYYYˤI $00Hq !O:!YK2eѶ0m۶4k`8[[xBb{PcǾÍWLe'2Ɍ̙3?0 qqq~hh(eY鉧=묭i׮};FJ8rqѣG5&PM hx簶nBV_/oҥ;^oOv1J`ڴ# VVٿE%XXYYc0DUs .-ZEJֱcGn!Qr͚54Q/9b,+W("m4hkr&}_|.dV_yU~}O1c(???GQ3g,R;mڴQAS*`TFR]"IïKB˫qQvjذQ*33S밄(+W)kk{eeMWTN:ʖuU VeU R.\PI_]-6mPei}fOrPD)Eʕ9|qh622jZ,)RrMcL\P DA㉌rԨQNWJᇟrFO=U<^oCJuDZZՕzaeePci}f qAW}IaiWfĈ$%ݹN(Uܹ;!Գg?~َ/kt珣kci}fWΝw 2Ĥ.==2e4[/+gx\deeuz23?l=Jxf V˖-S ,0۱cn(mt_Md LGk2(1T/fStGb҆7Ńٿ?}ՋtW_Ŝ9? B3h0֭Fzr+ԮG#dٌ,- VIeixpJ)bbbpssVp̰aY;3iݺW/G%XwfլY}aZU K8’^PKևjbŊ/Y#GRR%|||xB!&;;;Ih6DRRO>$gϦ[nܹѣGs)-B˗eB;{,?#eʔwh%"rss3yR '''yK=N leС֡ YZ=YYY|(&-- ;ygffʝVBJFFAA#IO 4˗xzzuȽ(퉏ںmQZm;x H>L\toooZCBruueY+ii$f1e;\eeeQz}o$P6Tt;vL,!4aRRo&=z`ɒ%  @ٲei޼9gϞ*4!x(>tIVйN/رoW[ׯt&K'ի!j!lpȐ!DEEѵkWnJ W^aٲe$&&uV-B˗ o !JS2ee`p}OKt?iw>Tݝ'ORB\n͍|||HLL"|Y!(9.\믿h޼1O=՘ZHfs`7ooMR%XbccCZZΤbmmMVV...hZ,Bh+;;ߟҥ+v*d88ܦzZ;P'2ydM^,l{ӦM9r$gժUԩS9sogQV-BBeffRVC.\H?{weq= & Kn{䞩%Բ\, TܗL-W]RQTa(?ܯ f>W=zn9ykѿI֭Fɒxϟ_in!#GЩS'N8AV8q"k̙3F,YBUD{({=#F}KHo4k +W.VQ 1T Vٲeٷo_w^J,dBҥb+4uin5K/(qlQ[eoշB۳jf{`*bܹF1xb6*Ťu,\ɤ*Bج .NN!n]#R\ aÔ`9::b[nӇ QUBVX!qY/%S1TYALL K.eDDDPreCΝPBd-MX|9k֬߿ Cm#r-{CXqqqGEENxx8ׯ_CPvq!)[ѷw7c&ʖ-:P)X,Y3fh".!Dָ}6 R@ ` 4aÃYڀBd{Cmevq!W_Mwa=J͛"+.Ch!Pj@[P؆aeGYٿ`lJ"Yôh u:J*Ú4Ѐm×R !2%BzMXX~[\BM!ijӧӧ/|@< E4._."63{u6YPe3˗ɉ_[Bd(QK7@ ?5aJ*6YPe"trrb˖-TRŋSvmUq"l۶:ubeX?+"r*4"(ۃ`43g>7&,,Le!xfCVX,M Xqx ˩V”Bf34lܸ;ҢE %B!DLr8q$ yŋpJ(ͱc{qpP;P]~}vŁ[.)))# !9x ..>8q ppKi^+W#GvKq%D.OX6oLPPIII R !Dƌ;Z$E3&YwĈq^mBdeKs9 mzSpʕoG9x :^kRB(focUVP=͉ɜ9s_;v_=087)Z񗥸(+&L@fעE 2[ϝ)noCrr2àAz\BFbe0Rn\Wxd qvvBŔXvI& {9t:]jѣٺu+Ǐѣlڴc>qBӻw ȅAdW\F;ǦM2ydEIixxx}ph4ӣǫ\|WWW6DYճgOϕ+Wҵ_r?{M0`ի~!};{,6l &&փXOe' `Yf))=cN",,={wXOmWTyxx`6 Æ K:$$')9nܸAժ9}_z#:M{'dLX_9a͛cɓGqj!lKDDc(,\7zj\2~!ټy3є+W@3g۷/.\8z\x!r˗Ӻu9))g:u&Cĉ1FwL\~tڕ~*l~,A@O#b4:qA-&"GRVTP+VbO( ExO6mdH!Dd_p~,J䞤ᇩ'$&~8Cta̘QxIHXV҉GQpLl~~~BիW)V , ۓfXOfș3qssSV#x]7n _>_4D4]]رOʕ+%n޼͛7϶͹'NbHL`XJ|k8ztOB<ɓ')]2K X TIj@׮m;w"z*[nۛڵkUGiV`/)))|駪cdX޼yɟ0՝hZŊ-RHs6 hJrܺUF.DVXFX]'8sbG4oއ jp5ձ +99O>Du t̜/܄)SEuLu9RR*kKL …  {e28rd0q xOOw];O۶m&ŕ+Wݻ?II#C`sL[nyG!2fݺuj5CBJ'fm U6UdIƌ[puuUJ<)WWWg˗/˔): 4JdxJ,˿^o??SVۇ+'dC/0o1 ,:ȅ֭ O'9ypP Du4aC`ۗ+[oחLFذaC{{ԫ M+usm8 jC rUBCeڵx{ݻ61 `o`Ȑ!L8HZTu~@$cƔ3 am ' !llT29sX,W@M?A!Ҳc,X:Bc4̙X ݪY`}tr !l5f |'W%%%/ 냙2b=!?ԩaٞQ!G`e , U8x njDog ,{CeBSNQl%q`P /^GPBQJ7mYz}}DB6m4JHr<4z"{- hwr)6OYׯ*UСC4jԈ qqq*=Mo oj| ('Xk@3Zj +x&6*+ʔ)7|Cf͸z*:uB׳b FXB؁uzTa}+(X-!Daoc%ӬY3ϪU0lْDU@p4hG^tWBGYɵkRwvv_~Օ-[bXTEBd)ROO?ڴL͚f~ \ӧ +@YUn]-Zɉ%K.XB2seDE}El&VeÆ.GǪXOf/E@7oFpgYf_уzqĉll!DlVtt4)R侾dnJ?#l=n{%;wCŊYf_m 88=S'Ol"Dnfoc{}}}}``Jln޼HӢ#!!.](JLJ8끦` )i+Vk׮r !r6eKL8 *PJ UY `۔2 eb.OG ;Ν;X,9re˖oc64_UKޯ&Dbocݝ۷om]B M8t111+W|$Dcoc%Bf3#]ߝ;wYcBl(_B\D&5j.[f ʕSK!)["|sPpaIҳM!b0z]ƛo_88(]MCj+.\8CUhh(xxxMt`=444|||4h)))?~!եKȓ9>x'NDsn С&6GY Ҷm[ڴiÜ9s2^ ɓq nݺŐ!C=z4[n=zM61vԟ}\VXAB ,ͱL})+Ҟ}3m4뇿? 8}YRT)bXb̘1x{{ûロޝ:u֭;_ׁIwDGG+L(GYvvĉ,ZI&1i$,Yw}ɓ'~~~xzz2vXnܸŋS ܹs=_#izJ89 TN!lMx"M6M>$$ .d=>bcc9uQQQ 2xR_X(~!\xpv'jT3f^؏ !]Rvؔlfh` 11i.Z(ÇG|'ZT;Q2lذԯCBB yB͛įlրa2͠cǎJ !lSDDc(z\r:tUyfJ*m61 ͛ۗz)\pj "2L$%%'Otݺu_Wr_z`  <'yԄBؼNB7Nag`ݺud|||x-[F6mpuuرctؑڵk̊+Xf ѰaCڷo۟!Ý;wh֬%7nbIT`,MPPPk4McDEEQhQUNSZjVF$$$вeKكdۛΝ;glf,X67ߤߎ;Y3%s'R$ !ij1TYȑ#9~8m۶W^tڕKRBϟO%TD{({8D0~wXuI_}0"Xd2ZRQ{.?ĉ޽;))),[E2p@Uф4MyV?c=۪9))ԛ@Bd,ooo9/^$ ׯŭ[ 66VE[N/cׁX 8 <UptGtyͫ*"1T]& ///Zlnnn<@!̙x~b7p8ȂsBgljժ׏?~.&''wQtiUфU4Mc޽,_/b4i^uNwݻҾ}{5a"PDx:uĉ'hժ'Nvڜ9sȒ%Kh޼heoӛ"|2ժŋWqp(Nw=1k"57`)\8?'NIq4sʗ/OUGBd6uLCBB{dɒs[8>|K͝CѧOo9ȎL& *εk5+p:|0 &p OFx?Pq⇳X,tҋeVa0TdA:u\BdIt@ٸOUː~89M}޽_WM!H&wtTTTᄇsu:t@xxhe..]zb0$%"qDF wa"##)Z(Yu}v~#N:Iٲe4sUB|3gRD ֮]:B!SQDXL>S:vڶxbFѣG&Mo !P'nzvB!2ʗԩ͛ӵEFFRNEB!MFJ=zx˼+.\(~7z"B!3SDسgtg[݋vPަ7Bboc=X9]B!Df1&ܹs']{z%B!xz iӦ1p@pvvNwEx={j*CSI!PDŋ QxdV@v+'6P4РAy믿N"EpssH"|嗩t҅yR@F/DZ/ybX牏TN!P^` 2q=ϛfJ,Idd$|̞=r .]Ķm3gN?_oLRpXb8p`lB!l%SNѨQ#bbbJmt>}޳s͛///֭[GZ3f k֬aÆ $$$M , Ʀ/]RN!l7wЁөS6?$nʰa8z(& &Lc/DZ& o@ߩ '¦(/N<Ν;^ѧO ,H޽ٶmnnnqww'..۷o?_+F``qN:tp{o{VP!P^`կ_CQBgzMx79x ֭wwwS۷o6lX!!!9G9t:+W.I?'))kɛו+ȳ3?"""PC{ ĢExWɗ/_jNcȑO1`nJDDD~gbbb2e ǎ#)))}.,%%uE>f͚`H}PE4Jɓiom 8w, m U~Ehܸ1qqq̝;n42dd":~8ҸqU_s?0?+#XJ*&Pڵk>}M7W^!*J:B<%J믿RBq)))2}΍ $.2;i/c6Xg2e7_abB||sN9ZdEGGS|y\"C[UMox-+W1?-ȭ4M899NSId"{CX3g:קH"YիWW_Pvqd6MhԨ1"`+Іv.dBd{C #3EGGSXo'U}@wPΡCTBEm Uv=zUVh֬KVId/RHq p AZ{IaJ!"(ޢE e&<<ӧSB/_*dݺlW>@wg/0v짪" !JYIPPÇg߿0o<>CUD&۱c;\OO0OOΟ?W"?~ub4z_3g$B`y{{s Ӟe+mi]psZhA]9> x6FFJ nݺEq?KOFk̛7W^yEui!66VI!dմi*))XLЄIO^HJig̙lܸݩX"=zXbb=Mofĕ+W(X! 7Yv*SPuN8A IJ f:|NJӉa~i&nnntMi m݋X+=a0d:CX|FQu44MW:obc0LoGT{8vkm[N 3m K48bB 88cӱ##(QdtjR+///L&ɓZ*F^J]Hll,>>>6yZ u֥>mAuYy'~m{tӏ ,ZuJ"E߿?ӧO{B!hV"k)+^|ŇթS:uWDݾ}'aÆ~BHH3egϞe$''ӺutzB!DFEDD:2ʎi֭[,Yӧ>i֭tڕ3gd=Gņ X~=`݃ͺuR$=zh֮]ˆ _Ӟ={2kB5a o[u4!DnCFm $$$ptUׯ_JII!))d, wd2ʫѣIHHٳ㏩3c={a֬_>y };u U!jٲ%#GZiڴ)3fH5keʔypuueرl޼6m Xʛ7/ F׏nݺs3k6>MO0Ç%B!r6eK7nܠe˖\|ҥKj*HLL?Zj*=Tn?hݺ))w%@=Wpp(¥KgSP!DnQV`uVbƍNŊi۶-b=Tn8?Nr1]Nf iSK ("mc(-rxqtڛ^|p,ԯ_u"a!&7h֬*>Ƌb0sL OOwBC߸yB!ijʍc(+ț7/;wO>TTIE ɩǬY0Lt؂#>Uu,!v$OK+ӦM̙3TV*UFllHR3ÇpXo5jbQM!ȵ`yxx>… ˗i׮}~yӪ 6РA[4'; EٴWjԨ2B;ge1bNbs[/r4X,ExTB!DYhذ! 6$&&Fubzj>?':6 i{yTFB!r5eև~~oolJ;=zjpv2P{T)5fZ z B\L[]?:t8P (,踂>jŪUٷo'9=x P$11ggg9Mlu *Jeܼy-[(HX,jԨС#F`:܄'γ}zns )]ڽ{7eVO|v")+vA`` 5k֤PBL4)]lr4MӨU۷_\)R|B؊^zG};O?JxLфwa$$$xb>s>#Uqr-[ca P؝p~7WO[`T`?gҤpɄM{e 7o֭[ `̘1b{^`}Hu ?#:]<(XB؀;wi}r+wQGaXNNN`0 {0fJ,5& h+ Μwww!M6byX4n2n^QL)["\2g6֯_ŋW,ghԨժG өSc/Hq%],\8 7F/@6x。 !r1e4l۶87n|_ߥK駟${8[d2a,_A@7˫%Ms&00PB[Cvq!P9mO!")Su:)))YF!"s)),B!D(Bɔ`mٲڵkqFt:_W^쌥Ľ o BG]˗)Rř3g3ce&;rJPFEf !"c2 .}Qj}fN?C!%V`lgQb5a`<7P+WbTPLf28u){tm~~~epwwWK(NӢiɓGU$!tԉ6m:d a}# fҥʲf̞= 5..pqi̝;Um..oS8:O޼hԨhB;"Kpoz3..%y\TU ;1#<)ZOD0hƓi.dSO)EJ/3C\Q1̭qaKpXG?2h(2sޯ׼t;9sϽ}Pv^` dŸ~R(ΗFSW|)V'ͭwa]"d qdC;@_M~Paa:X@cc#fϞ [[["66ӹlPP0w Lvpyl1RYaa"==ٸv?D=K7Aۉ]P le*55wKs9qߘw9u$''cܹP(żym6=KA,ZaH}/91ߘw9qߘYUYYb 8K0` P]]c S4oNBRddcoaa\F?ݻw"Kk;Z$ S\z,0 0݂EXYY=z\t  ;YٜJ 0 agr9zꅋ/:X^S`a,ƚ5kP^^2YӦMba23Xh"0e,Xaa`jj7Xn7ALBlܸ>>>D@@/VUUW_}666pttć~@']CCT*!T*zj.nٳg ())~7vQ[[ ބwJ H$믿rqC?|8p R) ۽X,}fff;iŋiT^^N4p@z:w}G=͞=xH &ZMԫW/ڹsgO:ZM˗/B"":{,) ψODEuuuDDTVVFF'QPܹsߟB!fyWT7n?x ѹs爈~w"2vߒ7%%%q Xz/{_[#dޫjSNqi~!1CjҤI4c 1߾}hD~7vI^^^t!\]RҥK =>>>:;Ev;{,ҍ74C7v > aBCCC|_tC4h]f4_bR) ɐn7vh0}tl޼\1֯_B޽{cŊ҆ZϣC=;m۶ cǎEϞgwX MBj9Ż"´i䄘QUU#..jzobڵ8p Ko/o8_|M6aʕ ? "|8v ajj۽ZFJJ nyC`47<+ |7繽xwBD9s&\Ԩ>ۭݽ]`ͼz2 0dHII`oYfX`N:kkk[D"7K3+VZNBL$3ݡxwAD5kΜ9T( Ɠi4Ʀzʼn'PZZ ///8::b„ '''?ޠOSSy=666puu5_ٳѴ["**w]+uwMqwM,[wSh4 éH{LHHn?[xwo7z޽K_~%j""vy{{̙3zߝEmm-ݺu{}w$֭[T__oy'"ڳgN1CLJʨiذaDdHօB!wdK?nՎF5k) R(KK,!@{5OPUUE'O&LFQ{']^^ "X̽;ZM$I$ s!44 w???!HDJzݻGّT*SII ~'"5ޒ?aa1X 0 0uaa:`1 0 t2badtԩSsws!sJ%;e# QPPeߖt:u|}};qx~ʕ+z.Oȑ#P( 燌 .D½b1B!-SYYC&gF`B6{=>W^B ^x.c߲e ollĜ9s`ooH{Rn!ZM XˋD"B!QPP*njj_|իWX BHޣ1aeeŭ/Jy^z pppiPUU-Zooo!::CetIGH$ׯ@cqW2P(p\xh+))Ahh(d2d2^|EܸqT*XXX믿rٳg ())p~D8,ZrzTJ%Wĉ̙3ղW\y?4JJJ0vXHRa֭?G̓uǪgFII *++1j(3A]`Ν;accǏ\<ܹs011>͍$.V___ܺu HLL#xϘ1mܸwFFF1rH޽{ݻwyy)--Eggg1@]2)ӭ=3OhŕJ%;v{/ndmmMbdbbBϟ͛Gcǎ)S-yxxЧ~ܜΎéԩS^ BA{r;vH$"[[[rttiӦL@#___.KJ{N?ŋޞ.\@DDQQQdooO/^$FC*iD?YZZRUUD"ǏQJJ d2q?iiizgiёZѣGSll,/-""NJ555TTTD^^^2';;;ik6sLD$hΜ9ERJҙc"""@@7nhs[Wgٳb1]|YӧOP^ڻK#GJZp!o r𠤤$lDDIII$HH Є Z͘^!CG}KkNSRRHP?LDDԣGy&1zMYYYt=փeJ'UUU/{zR>}7/-??ݩ,Yk}уuh:K^}Ur6l͟?Ԕ⨱ O>ev$ :tCyb `1dii=RhNEG;XyyyDׯ駟Đ@ m۶ѱc‚~'""ueeeQii)M4 255z_5իWH{`-(( " 1caܹ$ԔJ%n-"::x[`"vz-.?L&-HgΜᖿ{Æ C_ѣdmmM'OlkG&&&t%^7ۛLMM?Ν"":x IRꫯt~ƅ HThtN=<==ظq#~7\|[С=z4 ""}h/o6_6rqqի?Ν;###EEEGbb" wqaa!RRR ˹QQQ@;6GmXXX[Օwss9eYO8Wns Oc\ZMM |}}1eԠx׸e|||Ko]mi3gK3-֫BXXO']oH$¸q4"ȑ#1h nր0rHnoood2!Co-3wwwzˤ8rRXXիW#GP^^-cgg_$q16zޖm۶_䵛]vSNչX,Zݽ{7VP777y&oߛ/zP(cXy (-- SSSqML2>hРVQc{)SPɓ' 'Nй3OJU]]?m~^[Kχ/^ _SSoߎiӦ/\\033\.GLL ~h`ff<==T*v^t!"DFF+Wls٭["**wK7pY̚5 VVVƛo3gδn̚ǩ=L|v޸3/_ު?H:nŪ*޽U==|0233GGG]prrB]]QQQCҥK_///AAٳ'ƍ?lvnuһwoxyyaɒ%h4(..ƺu:|-))?^y6۶m&LTK饗P[[sÇ#44v"bccѻwo@Lvލl.Çsg;JJJ" 666wڅ۷o )))u3ӧOǗ_~#Gp=dff"++ @?ݻ'O=rE?^͝*}ڛ>|ݻ7,--ah4sRSS"O??&Lٿ?wfܹsX~=""":EѠhllԹ@ h"l߾555lL6M˖-åKjoӧO:joolٲuuuŖ-[гgO޽{}ĺu2Sصk²e0iҤu CZZ̙3#33Ѐ'N[F_]1AP 77WwW_}[[[ tu!;;/^ą 0c … w 6 /F/owwŋHHHh4Xp!4 f\ȑ#xyg#%&n-''H,ӠAhժU mZt) żW˱AdiiIGϒD"!RTvZrvv&HDr^~eAׯbׯ}\w!{{{dggG*˹͛7)<}üǞ@ ++V-i׮]z'N9H;dmmMDCRD"Ӈ6mĭOC%LF"<<F" daaZG|| Ξ=K~~~$H$eddpq???!HDJ>^\&۷/NwA^^^$֖Ǝ ߪ B}{DŽrrr"Lƍ? y "zhҥm.C=ܿb !DB...uV7oΝF2NKK#RI+W$GGGx^ lscDar駟?;P(.<t_ѣHHHhl?zW(G}~V{DŽѣϝifD<;deeaռyy3u1oСs@Hѣ/*++!X?q<)2'O2V׃ cL{%BaaN.2 0 t2bad0 0 Xaa0 0L'c,aaN:X 0 0uaa:`1 0 t2bad0 0 Xaa0 0L'?ViHaIENDB`biopython-1.63/Doc/images/phylo-apaf.png0000644000175000017500000020125112250104543017571 0ustar tratra00000000000000PNG  IHDR:*]sRGBbKGD pHYsaa?itIME426 IDATxwXTgeD) bE@Tb'D%5^cAb *6Dl(ʕ&X*=?Voy=>;s9g{>3B@P( _8P( BBP(  BP8P( BBP(*( RB[av\IQBP\b1]͛7B>}`eetܹHa0 [[w0 ߿/nݺ[nDxd/^Dxx8ZjxDtt4X,ˑmmmTVV" `F.UVDHH+dcx)x<@DD.^H2P( }ĪUAAANJ+. |rzaddT*ELL [6 ___x{{ 1e1ΝÞ={0{ldffV PPP|}}7P phZ( Dxڷo}vܹrҬ,  =֭[w}SSSԛCH" B0 %K]v055""";v,D"]WWW;w4p=fffx*hժ:u9pF Bc9qp0i$(//:@P(-ɓ'cȐ!qM{{{_gooPAYYI$XZZѣD(((ӱpBY>}Y=z~ő#GX1һwoa޼y߿?jkk555@BP(!ǤIn:,^y{{#77^XC666ӧcܾ}۶mCJJ @II ϟ ,Ym6bXv-333oPq@P(eeexnܸ}}}((X({^?.s xzj?xbTi(+P(Lzz:֯_///hkkҥKݻwC*Ǐ ;v@EEIܸqB/^̙37ߠgϞpuuիW:66?M0Ԡr>*++;v`ҤIM!55ڬS'eee >>x*( .ڴi:9_gggqi.\[v=ɓ!!!ׯƍ{.1yd\|SL-555,\/_1[n0}Ejj*Z4448jP(G]& ol#!555ܹ3233Ν+V4zi 9P(„B!D"QOS}Fa1vX7KKKxxx4mqv^kiJ,}&'ޗ  bii jkk1m4ύ,9 <UUU`0`@z x***`eekkkA^^ݻkkkXZZ6H$ŋQQQBкuktޝM3''nbϣggg˝[(ڵk`l0{.rrrV|O>BVV<==lqI( 뤦^B6o޼#Ο? foߎ+W8wBCC1zh6}H@DGGcҥ?~i ƍ.qq#** n:`ڴi`/^T*ErrǃеkWB G燇b̘1!ʕ+rJ~eZ( +%%f5Mݻh׮] D`` k!X|9~gV0 .@SS***Zz0 0sLk ǢEЦM(((;SSnapY31}tp\ ,7tШs/:BPBconeVX47t͚dֈ`̟?YHM'u,'m۶aر9s&eA!,6AZ( ѸbHKK}XPUUo>"G $ >}hdggx TTT͞OdffbРAlRRRPZZ:WƝ;wN:oooH$"<<]tBP(4h~75kXsXx1rrr0w\DFFbҥزe ~f[2Z1fϞ Ɔ… ѽ{wm쌄8::abt/FMM !MNBP(_%sAǎQXXFB===tpuuEPP֭[ BEE>ЩS'֤6H$8<._nO]Z{AMM .]H :|>HHH@PPN< X KKKرrJhժZ쳤s( IС\\\q&ۖЁ"LO"!!ϟX,Fff&܇Av͛7 lٲAa UVĦM ,\~zhiiA[[ΝCbb"{VЏZ( Kbƌ3g0 #33sɓѺuk`:t(Ə_Pɀm\.eQFoӧ1g,XMaxK,.*++qbZ~TP( E!Mݛгgwڵ+v؁/_UV E@@JJF~~>@OOEEEuuun;vɓ1x`#>>s@니 88&2z ֭[se@Ϟ=(q@ Q( Y`ѢEʕ+9М 2udŋĀн{wbʕHLLuΝ;CKK<7O'8P(ʧ$55GFNN5ol޼D5jL'''A`` jjj (++ׯqyD׮]ѧOb>|b1z OOOxxxǎCee%ٳՅ.<==ꊥK9___x,6k֬;%K ҂nyWVVF^^߄B!^aadff"88O<+XWʟіY}TP( 9 hsz"gΜѣG8pq|wF?P9 z[ ,=!CѣGxLLL"mɓ'1p@l۶z(TP( B444ŋg?!ݻw#00qqq:t(JBP(_@xusΈ{/ L޽lj'KGZs@P(-0j(L4 k׮eWR4d۶m0m4$$$͍Z BP(_AfIocdggښ"Ե4vZ,\/^€Z(  @,#>>f͂eez΋VX-[ѣpppBP(-ъ\.CEZZѺukvDaɒ% F B`+ bw^ٳԩJBP(_@Y^x Յ?0  c*ٷ_M mT+s\t{^aشda }(_'Ojjj })ݻ֭:w ;;;tѐH$bL6 ]tq&UUU&:uN:k֬a> .ˆ[[[c(**=\.JJJٳgrѱcGڢcǎ0`ԩSr$ޘz (탑իW///hjjb066ƩS"5f͚BIII1bƌCCCx<{ H xyyaǎ;w.kEHOOGVVpQL2=˅3Μ9UUU9cwlꉃtܙ*(BtttDB\|wޅ!kZxPPP @P/ǃ9T aÆ Chh(L"wneee(++O S!k`kjj;v #F>`ܽ{UUUpqqMդ>QSS'NgϞh0~EEn޼V9rǏGn0c \t }akǃC"[n011+BCC8ʢ7 1Gff& pPRRgϞ7oH$BC5i=͛7Q[[/_C$~aп@QQZnӧw :лwo,[ܾ}<"T|EʠAP>TJR)H$˗ܾ̌}?0 C ظ[n%MiddD"""=7o!'NիdԨQʊzB@ dƌD,PH8@455B!Ν#ݺu#5HRB!gϞ%~eB._LN|P򑽮K555899AQQ]= \6)dYNGG.\@^p=EpQ˗/ǪUt pv zv [ —U  ;;EEEH$044Dǎ?={>;;;7YCCC}бcGC|u#K$tfff(,,DFF444X @"֭[Dҥ ?W^W^޽Ǐr b1{>ٶ]vH޽{{{{B߿ҥ 9s`ٲex0wf5(--P(ĕ+W3f`rCXlٳgر#bccY1rzj:t'bׇ>}-B֭Ñ#G>/+\.N>_~}Ann.jjjpܹ&㏸r ֬Y~mp=ĉY!333={&L.^x=€PVVtϞ=C6m䞕'|||uV_~prrD"T*)޽{5xDMM <ܿ /..&cƌ!lܸYapٳgILL$ONׯ B<<<9پ}{tCvB>|8D"N:Yfɽ ,1k,͛[[[g8|Ѽ~-χ222 ~bCK  FӍDxx8MPbaǎѣ*++1feeeHLLČ3믿̛75Cr...6llll@X,9당sϏ/3S6$>o* Z&\.n$wal޼055ŝ;wUUU6?ެ1g`ĉ055;D"Ayy9&NXf aaax5!`nn.w,YYYYq98p0J||L8<{D|>` Yv-ݻwCطoR)\.k.w/PoBb]qC 哢%%%m۶_lws\,X ,x+n޼Ç r|TUU1x`_~MB/|}}"\~!޽;=zT/R>Rq@baz*x,]`_Ǐ#99="aPSSTTTӦMðaà333B߿ٳgCII 111ƹs=!k׮x8q"ƌ &Aߡݻw#,,  P>兞={b_MݑX$&&B]]}􁋋 X˝r&38|ʶcnTڄ())ѣGqf1}t066Ν;1|R$uuu:@,;s%ٵD"^fffioy&"##?ҧ@AYYb1OSϝ8֧ &1u$F?ޕ^MM ?~0bȑX~=}wё'+VX555`֬YPSSc-jlu-o?帼D"APPN:z&p8p82f%%%Z¾}Q]]+W"** 'NĄ `bb"G  CW+P( O\YMs8x 0uT`ʔ)׿֭[ UqV8wBP 6lS/ ܼyBUUUBmm-e(++?uý{f]RSSqFvpMTPݽ{pu 0@2[=(--sLO۽{7ϟ/^ԋA5P(H$u?555~{H$@ @rr2^~ ???M6033{%T Pq@c+jY!,[ Xbnrhii!??Hyo0zh={V?̞=Aw>>>HMMm1x󑚚 <@ff&TUUaff޽{W^ٳ'ڴiY~kJ]\7~SKvޞ>K8PB|rV^ X,CFF:t@{?fSXX777<~^XVp1իADǏ֐ q l0 عs'ݻqơO>h߾=mۆӧO###ׯ?ЬM6(++CNNí[={`„ ٻ!C v?\ nݺ???TTTŋaeeYfaƌБlX,Ʒ~6y`%m?o<̘1۶mܹs#FP]]ܞ&+l>Xvp}TWWNNNѣrJi#6\.lll`cceQv-pvv0Cv퐓{b˖-x1P\\ X UUU$&&BOOfff033;-x9rpꊃB_9Uuָ}6=8b O<)-- /^'{۳q޵kC7BÐJD*IBB ZZZdٲeɼy@IǎYjVZZ7n#666$((iJA,--Ivc8Ge۷oOJ߿_/풒G V/lҥ֖XXXv 2bB! |Dy'DYY9r&@Kur 166&bF\]] 0`i۶-"fffo!˗/'W\!l:vvvDCCp\GlB.]DHff\{\]&MDɈ#ȵk!rQҾ}{k"Jپ}ܳ%^^^lz\.ܹs{r@2ѯ_?ofw\ljkkcǎ=RgϞx9Ollذ^kv\`lllɓzEv`UTThD`DFFرc0667|˗/kƼmQx! r зo_̘1PRR$\r111Xp!D"ꊢ"H$ &&=<==!J!QTTeee9k,_|>CΝ;ѣG$%%mڴuɈB@@AII N<#G=2Y)Džjj #;;G$++w&***LtR| 155%oC!d֭{BHYY k׮̜9,Xڒӧ˅~zҪU+Z޳By$[믿!9w\8#F ֭kdffǏP*>6177'wёTVV=zbbbBI`` !Ғ~BHzz:QSS#999BˆNёݛݛt҅6QlL.puue! q!3^V^ }}}tܹYk]ضmtuuѮ];% ?e{<ў={  ..%%%r=֯iC1p@ >>VVVr.ɬMMME߾}`ZZZbСX`;9ر HHH@jjj=LMMfܻw={?899!44pQbRRR0xf告 ܆κKAAq9=z|>JJJ `rxb\~Yjjjжm[C֭["G,͛7(..Ɔ 6|Ϟ=PWW-ƌR4}v9OxO=-p5L>5'˞0А0{.|||xzsog|> =~SSSx<tCfϞcǎ\2qDl߾7n@FF+W<2BTP(_`wwwܼyVVVx{{C"˗\oooXh3ǵkPTT/_",, ָz*n޼ w OOOa͚5r#44rĉA(b(**Bqq1of޽;;-߇fΜ3g{URRW^A(lx)`x!,Y333())! ~~~h߾= ٽ]dz 2֭/N㡦@eBSv:2G|gϞrcm۶%=b>x yyy 1ّu5kÇ~"۷'ܜӇԐ*rqҪU+K!$99 zzzޞtԉeeeRSS90aseA(ѣGrmNAcу FFFĄuuuB!D__ <鑐&566&۶m[ݣN!#iӦz'[l!2fbmm`.]"PΙ3 ǎe\[&>>>ͺOTP(-d٘1cp*ٵkńB,qXHDVp8Mٳ'!biiIݻGIrr29s i۶-ٷo+&ŁD"a?_kWsss)ׯTOl^5X·O=xsХJbCOO=z .@[[رc ,, 066H$BBB0lذ&>b1 xRe˖ +Vٳga9,0|p7nD"Q.}e^zɓ'TWWc044*D"6l؀%K`֬YXhQa _XXSnػ5鮸4fsy&}2҂H$rƳg0c ʕ+pppz O<7orѺukف4Z b$''ߞ֮^Ζ1p@?~<0 B!$Kܽ{HOO!:u<<|􄚚W# dիW6l\.֭[GGG* >ሉ7G~ ZBiJ:t(rrrpehjj6x4V?>-[S>sJ<5..ÇG@@6mGEg~xnqo;iӦSN8~8_!mK&`C% ѥK۷g~K.Ç~|Z?_TP(-X شiu놾}b˖-;vlI~~>rss~JȎ=<֭[gϞA]]L6RY&$$ ((vvvHIIA۶m&Tw髹f:@^r~:5k (([A aܹ:uj|YgƎ;JQ(r@P>CAqUݻ抍[SNT|DA푝3gǸ{.^ϝn]Swyc oO7)!pvv͛7ykn:eeeXf """ BnܹCCCV⽯0zcZOQqсѪU+ :W\0 <UUz5k0 \.TUUakk磼L+**0`p\p\hjjbĈ(++c{ 8;;CEE {/\uuu-+B^qu0 }y}shodܦM۷ׯ%dSN+wN>s! ""DZrJ"** pqq… qOс1âaիWFFFX|9jkkmlرxU5 9077ÑQ]].]ȑ#Pq~/GEE]\ѣ|}}1o޼&TŐJD^B!F#""<@۶mw]vW\Ann.!J0 R)-ZI&ax!paxxxͧ&rssqzܹ9RD^^ q IDAT3RMi+eeeڵ ~~~ƥK2.08s bcc|r.=}ٳ0D}}}ٳ8p nݺbΝ077 &NUV!==rNޮ MLL <{ {EDDƩĪUPXXW"++n~CBB 6ԫKAll\ԡCH$b2Jg iii|HD"ټy3IHH lܳgϒpr12fvZr!)//'&L 7ol4?˖-#\MN>jR^^NvJΞ=ˆ'%%GnݺE!$++k׮ɥSVVFȮ]!9stЁSn.͛GϟO!BvMlll}\cR(uItt4166&r.`ߦiYtlܸQn aaÆzq IRR!C !H^HvH.]ȑ#ҥKɹs˗/Yڵc _~dĈozzz$::I|>/!C"##6y&9[WեۓC+۪_~022޽{QXX/^`Ĉ BZZظ?ٳ &wrpvvn{?(()))i0ϥr񰱱<uuu5  ,ŋkB_~5&L4Ԙ1cpQ̙3?SCplٲvvv7njpq̙3^3fŕH$BQFaРA(FYA"E bG(6hƨD&klLj-F)tA@E: ly?<;/+ XX9;3ޝ{k׮… 8rtuuѡCۜʧOBKKY _|֘xᱰ@FF0sLBOO .䬿hܸ16oތ={e˖\ ?Ka>\@\|N!C sss5<|>HOOWHJJ… f͚HS||֭[P(4d2 VVV077G޽w Ryiii2d`aaX HYu#"4iҤk\\AAA/Jumpp0VZLHk׮!''ǃz(++SJkII gҶ:lj'1c@GG5θ~:gx ˎ""22cƌA޽qAXZZxO>pqqa`G___5O}?c 5:&wrJL>GEEB__NtDFF"77SL+WL_VV=z!Cp0.^L6 _b֬Yػw/FՍڴi糗'++ ꫯ///l۶s2vZ5UkT\ ,ٳѧOtf|\#߷o_\p3g77k,IIIӧV\b"x"zQ#.___!;;ϯq@ X,fF1??͚5Cdd$ܹ/";;7( x<JKK~zL>k׮Űa?* T_~ڵ+]8|d077F3_ˑ/ΝX,ƙ3g JͥO.رc ԄX,f/孔s*HOO_ L4 (//T*L&Æ Eaĉ8q"ߠ[ wV^r >c2^j 6npuu'ϟǏ?F...9s&n @Pk:J%*++ՎG'Wٳ'P(0}ts AII :t耮]b͚5wmƭW9Vii)^^^غu+5!QUu_sk׮E~  ahh}}}o'OFnn.P^^c߾}ݻwq]9s/^DjjjXEE*++QRRFFTBP`Ĉ0B#g`̘19r$:w n@U{^-ݻw/^zՙ\<@ %ŋSխ"((طofϞ bd2|:u \|\SLQ+ЪkT*11IEE 0lk "ٳ3f;v@jj*v 68??͛uTĉضm|>r9z3f{_EEн{w*++QUUG6m4440{l ZZZ={G???r:88'OĔ)SPTTU#w᧟~փ988`ǎw"Mr9  jFR)|>$ !ɍ(q066 ^AA_[**q1.|U+Ϫ*C.׈ eee044AKK M\O|ϯ[nm_kt-xSallSN1#HXF `mm*{DJ"xNxԄ.)((7zjUk >XBrk!_W\\fgpMx2ǻר>_t#o۶x"u֍ĄҥK(j߾=#Թ?6k@Z I$200 H$4n8R*T\\LHWWqԵkWڻw/x^S:H[[G[[F6%( !{uttɓ{f6Vr3f uԉR;b4+cJJ ?yu*e~a :DF!88uri}ũS0sL\~prr? 6  ѩSz{EEE֭1**; kFBD"QRRkkkEEEuNN:a۶mjFFFpttD&M믿x"<==a=\|ƍk[`Cjh`` pyj*IUcƌaT hllZMMM+Aѣ(//3ڶmrL>-SF¢EC$&&BSS#FD"AѾ}{8}x<ܻwعs'>#CM@:,juuu}}}ؠUV¤Iжm[x<(,,ĶmM}TOX,VxKy<:wW" [gBWHD>}: 7uuuJJ%7n^Vݻފs>_r066ƨQsǣG`aa'Oiii᯿jPezjG||}:׃ի\ <C yP9#22~aժU={۾};'*++1qZm?0NSSǎҥKcĉ 㦓XT\,Y֭Õ+W\p{ 3Bgϒ:t-%>} 244$'''իYXXԛ`277Cegg%$$͛7IGG,YBÆ %Kpӈ–J?3 oZZx<:r;)""d2wa\TrOꞂj׮7U*/| M4ްI"6ikkX,&>O_~%WڪtgggU ##C @T*LJb1꒟8;&k\-r9'2?X7>%%%|` C-rj׮Ӈ=zDTPPnܸA>ǏӶmŅ_cLjQ||<Ǐ)??6oLbۺBff&s[)66 (==>|B!ӧh5 .3_fffGDDR:uDӦMؽh.vΜ9G)))syk^+_ߺu +-- @JJ \nŋښ::|>]vwtt?zE͚5#0a͜9ܜ6nH[¾}H(˗sGQQQtM6[7o$GW^%""33lHD.\J$"oI*ҵkx<$ijh˖-4p@%ccF3zhjԨЭ[(::JKKI*L&{*m۪ 2Hwԉ:vH/xwRgUUIR*++z ݸq~W #GR6mȈ.MOƍU?|>D" {ѳ3fҏ?H?&fp3f $$17 p1 0Eo#GÇ_ 33077ǣGM@ @˖-ahh>DH077d2D"D"444===a„ ?~<@P]+I&P('<<<ТE 888Nî<+V}pm6x#yJ.cĉ8wۇۿԗL&ӧOQPP'O ??EVVP\\ T T*H$ 666 aeeD…_VV А+VVVaii +++V*8tۇ8899aȐ!ҥD6x+)qԩSw^N@ff&6mn~n>|xANN.\V===䄓'OxEUOO[n#D"N8yaҥhڴ)nݺc֬YD\SQQJd2s5j2 UUU(..3]044lllжm[ 2-ZW3Ibb"WT#G"88_ukSSSdܿHMMEqq1JKK5akk 4nb:::֮~a/((@ X,fSm"!++ ضmol_ZD>}`ʔ)@ee%J%ШQ#@P`Μ97|cwFAAO?A"ngggA*ƍ(**3R)7n ,Y_~%~@DD sss<~Fǎѹsg֬Y;w <<^iiiԩL7nm7H$8tZe`( "aСHLL5$%%!)) %%%ppp ѬY3899兮ߦƶzZ=ze˖a066̙3gAGGBe/~w}0bĈz ֭[2hiiQF֭VNLJWe`͚5066$''c۶mHII)F5<Xf {E.ի8s RRRТE ?|HLLăPUUg}qưڰ曮Ua1 7ݻزe 6nߺ IDATv&MFְQR?B`Ϟ=HJJ' :pSlDމzMï{bEC eʸ9Ӵ4WY<ߏg">>iiipvv:w\cMU.@HHN ,x3 wݻq=oC 7lll۶mCV@ºx9. B!,%1r_{"66;w/&O ###4k C ~mdϓމ?WѨ(((spY;w<|||УGQx<[0aZh@*Fypa3ZΝ;'''>|nnnAyyyXx1~ӯBC … ]38`|`bv"""*x ~wDGGC__}ѼysΗ뱰|T*qeÇX|9 \vۊɫ?㒒kqqqu^۲eK;>>>L18`JJJ"99G\\|>\]]ѡC`'6߿ɓ'#55sŀjley)((5ki&5|]L:֭cϝ͎*T_{вeKܺuƆ[]- Ye䗪*̛7+Vɓ|rb5o-fsW w}Z0vXlZZZL18`Y>|'"<kkkUV􄻻{{qx{{CKK gΜ1:(J=ҥ 7 3339Ѷm[.,Tٳطo3H%.s4551c ҥKܹʭbVTBɓICCC͵s=8ڌb'MMM !B APpn===iݺujIPL&#LFɴsN;v,999q.Ꝝhg|%7$˹CƔ:.((.]hʕunܸ:t(uA-Tjڴ)97oOhh(ihhիJKK [Qgf4h9lذa***k.tzzzصk舑#GYfXd D"РFСCit7Tʕ+1cөw\Z B$)GhذaT^^΅uIק""ڿ?SQQ7It|2ǿu lA"?cÆ سg0x`ёszͻIOONJ+w^L<K.e=xh۶-Oi捼Ϻx1{J BVBBr9Ξ=qa4h sկS(Jacc,?8E"$ Oxzz:t`׮]Jx)Fw Oƀj(++.^:NL0H&!** 'BCCQZZ]bԨQj+YS^^ b0`&M|genݺu8x .]ZZ_V,t.]jp8?PRR2U_QQJ#22hڴ)r9V p~zT544p@P <<46j;wFDDӑwww5 \:._c ~cS-L0i@DdHIIʕ+o>eرc!X#>G"((سg8[lPZZ={bذa2e?^T9s'\7nP\KKKXXX@KK zzz711AXXN GP( "8;;CGGGm]BǏJ%V^]{hҤ ֭[///̞=ׯÇŗ|>FB3gΠ/VJ%J%6m r`0ުnqFj֬ѣʕ+3{Q>}ԔÞիWI PBB¿k ?%%GӧO;#YXXu҅O7@~͛GB@54<%KPӦMYfԲeK֭OjyyyуԾ۽{7k׎($$FԩS':z(ԦMZP^^NBHvvvl2mt͛8w?x{{cذaٳ'vxE<͛7'N1)@;v &&Yٮ> hjjK.(,,ʕ+cbyaY'G:QutiB*"''?36o HI&a֬Yrn ۇ3gB.c2dHoyx]ݻcǎWM-xA`` pInElC:lZ ovn޼I_~%|@5R3 :t@("" Stt4}ԴiS8p >|غ]~vAY[[SVVwO?6mPFFQPPo^m}mĐPkwA<<==9R*..fsss233^-|CCCUVqs5ĉiܸqT*)$$>c*(()**R˟q=O6lRyY&QII %%%,0qQPP@G&244Ӆ  mΎ6mJ{aad4~xŤOFFFdffFG\EOdaaATVV+]tI-;wR6mؘ5kFϧRJ$SSS#}}}ի-[HGG8Pbhڵ\(' 4i$JMMJ& !233‚O CJs\]l߾455)((MFDTC<;F!@lZϏ***xd2+YTJǎ#ccc0`7z4hx֭DDGڔ]w- TRRZ⠾a};;;ѡEQYY5o\ZTRII mۖ~g""ڴi6xdFg&",5k͛7kT5kijj7ݸqCZsZERee%IRH$jn}@Ufi˖-OeeedddDUyur5qJ'|B?>#s/校ӧԽ{wH$pkmˬ>w^#<<+VΝ;R \]rDZI$OOOX,FΝ!!P\\F8o񐝝 4ЧO<~aaaj{CʢEVVVXr%#DBM6kREE?xQvEvvvdggG[lGq[XM"#g~]\\H"_Q>&-{111\TJeeeԩS'x58""jUd22d-Zƴ;I$#*;:::\\ڴb i„ Լysnݺq@l& 7oN\ꫯΎ̌hܹn #DBwQ>++:wLa``@111DDGq 7ٴ㭣T_рhTYYI4~x/^[ߟb1ۗ֯_Od``GĄ)))M&Tʥ5##OA .;w۷)..nJjBA۶m&M6 >nܸAEEE5i¸UO>} s@ 9*u_5/sM< RXXт H$˗_իcǎGOf͚qә8!rJJKK?,--i„ 5l@ O>D-4255)11 I$_8`9rzM4|pԩ 0NڵS~LJrss?LZQ;uꤶ BHDIIIDlQә3ggΜ-[RϞ=i4tPܹ39r֬YCB}xww#W;v-(( Z|9xQ||իWyfL2[Fiiia}'={6h,/wAbb`8wFXCC"/0al޼GXr%v ؿ?J%ZjB>TsΡcǎ\ݺASSʜZ+^MMMۣq5j222|rp{@$W^Xv-7n&4se0!ɠP(  qlٲ^Ru@XhiiA"'OgϞXz51k,ʕ+_R IJew5lDr|>|[_ƙ8`c٨z;;;_)))1틉'iӦjB=SCSN!$$HNNɓ_x\.Gxx8M>Ǐذa`XYYA[[AAAӧ[aĈj`ܹpZh:UVVbݺu Be˖ꫯvaD&݁k׮ ˑBnq[]'77gH qEDDiӦ011+((@bb"LLLѤI8J% ܹs5F17oDee%7pqq@ `yD񚂻2ĄdA[[UX jy<ɓdj窪0h X[[vs-BSS=  T*QUU0>%66 F!"4jԈ?P5la.xn"x=3aWbL0 & ӧOQUU;;;0  X,FF`0L0g;4i`fE  b`0q`0q-l[A`08`0>xJ%rrr``= 233ahhMMM`0q`0t`08`0Ȁ3`0q`|T>̄;{( C8}4bccѶm[N4u %$$}Add$:vnݺ㱩y&7R J!3  jd 11Q{f!`0q`|\;`  ƇJff&Ծ{-$7oLx>Ȧ2B7KZZJKKվS:x7oԩSͅD"AǎѻwoDGG(**xG޽q]lڴ Jhٲ%Dž_=ǏٳذaCS*{nܸPA"sxƯѣGs2<شi>|RɅ/<}JKK nnnꫯ 6 88,33x3b!<<Y[\@׮]ѨQ#L6 sAjj*vڅO>ӧzM=ݻw!888 99YW5CŦM4tRt2 ]v&O9sp* `͚5;w+,,ĪUТE ׏mڴ@ \.Ɲ۷/>ĪUjL 1`0J^J"FI^^^dbbBd``@ZÇSpp0:tbcc)##򨨨***G}ߩW #tڵEEEў={޾x>LTVV/mۖMSN%R(PTTTk"##k=zD7۷eeeqץ.%''Wyy9SBBB a 㡤͛1vX\nn.ߑ*kff[[[vvv5câ:>`Mz"" {511`FĂ(@ "bGemwD yeܲs9 HKK5! ={6Scze2}`aaG.ŋӦMÎ;pf0k,|Qb~:4557`ҥ)SQxmjBR(u@ТE V(1ѪU+v[DX X D"ݻHII3g|I&puu+\\\W_ 9s@[[|>ZZZprr3ݑӧh"33!UQQѭ[:!zzz (**ܿƭ[ a0|HRH$T*Eyy9C+]ʕ+)S ""F@KK -Ze9r$~w0 <|Wiʰb ̘1> Ca^|;w… 5||e 00Pi;XwݻHLLDdd$֮]2d24m%%%dy=‰'r"""r"ѤIܸq&MXr+**@Ayy9l2̘1RׯºիWŋ#++ 666RΎrhjjhkkc߾}cчBB4,_;wFӦMFׇz /_Ę1cybYeee(//X,f hRR rJC*B&A"@&x ƊLbƌ HHH@rr2֯_R%Q͛7EU¢E0 ݋ ňٳY芩*0KKK4mڔ> ʧa>сZlYc~gφzwww|}իWs6/^7n܀Hqqq=m۶D"ÁX,ƪUXqPzwMPq@P>Ew꽽r̪bŋH$wݻ$ܻw)))8< o>DGGC,cƅ `jjsB5k͛C&a߾}(((H$³gϰe7)ܹ5kBQ Ň ]vʕ+ѥKL<Ć п<}EEEضmҹk WWWp8DFFܜcc#** qM::wzn MMMvfL_Sv0`ʿ~_~ܹs^(..Ƴg`cc4={ 99 <M6A.V&336m}n©S]t#GqU;֯ cccSL@  P\\̮'@__+Wd BA*bر#*(J ۷oSN{ >`PPVV/^`߾}غu+ ?b.{}H5yR>յP8P(bxrٰa?|@SSFT1B1Q҂5 J0  7oބS8'ؽ{7SNl o޼~ׯ_+-H$4i @Bqpp@߾}bŊF'|o/_ɓ'yfaҤI7o{{!J5YrFP(TP( xn޼+VWΜ93gɓ'>>ԩS,'11tܙ ܹ3믿HNNСCɰaÈ9pRݻw'5u)-733cv}Ν})zyQ흨!e[ƻzP*W^2dH< \>ϟ?2DRAQ!XnTTTPRRR_~ڵ+BCC+W`֬YV())!ZZZdȐ!DWW\]'HǎI׮]Ill,ٱc܅5ѣG7bB!Rhii}BIJJ"|>$!!ܼy~BHDD100 ŋlqqqҒ|rF!/^VPȞ'=wIHH $%%d2oYhyqtt$.\5(**"'Ņ|7JKKKw UYliժIJJ"C QZӧH$xzz_U[ߟʧ{F߾}1qDdggcĈXt;R\---,X3f@.]mrX0 [[[:tx d28pyDFFO>֮9r$;81>>ְS 믿bر @UUUi4q \̘1Ci?z(Ƒ#G bĈ {ANNp-ܼy'OS0 ???<|Xv-Μ9gϞSNj*lܸ"mڴ+WII Μ9===Ә;w.1?=z>@Ө_GDD pvvVsO,,,Hnn.>֭ӧYf$44hkk+9@kܤFx<5jYx1i֬$??dffBv$eee]vdӦMJ|>Ҏ/sХKgL]]DEE5s|u)WctRx)$j}[222BAA򠧧Y,6lԩSQTTTm]^^^D";mbСѩqn lmm?1=CRZޱcG4su /_mw&8 o΋B|`0P\\gϞ!<<9r$<<<УG >]tam߾J$64*!m۶!?~|T 2xJk"//̓-D"Q0B ,@`` 7o^N7 ,8q"!C`޽K PnL8.\P:LM… P yGB$AUU2 CӦMQQQk׮hѢ7oΆ466OHNN7,--QXX3g΀AJJJp;wp8L0YYYx+?<&77ѰR=QQQTn޽{qɒ%ؼy3Ǝ#G -- ǏGHHڴiEX&<|8L i^߷eViL&Czz:ك@WWRî]~!!!0`@ 4k+ ***еkWx.]r9ӱb ݻfff0b%ԗBc7nTrpuuS5b<#Gp dddiӦG`` `ffe@/GBp ;v쀪**2a۶mE`` F͛Ȉ>; 36}e|>FGGmHII7pe<APP;6_HR5 Xz5zU=Ν;ѣG 9P(Tԧ0wT TK.?ĉ'PQQnݺaԨQWy4<ggg>EEEܹ3  io IDAT 󑓓={W^EVV,--Ѿ}{DFF"99^x<̞=ЀP(d TUU^ԏ\[l޽{ѽ{Wgºup}`X|9Ο?###̚5 z444轧P(T/@U!Jq >>PSS5Zn WWWl&&& `ܹ8}4j ffW^(..Fii)***PQQL4iưabbP^A?;v,\\\?bh3%%ϟ_A***E@@zgP(/j2وC\.] 88]tTTTkVe2TѣGx!rrr ---vL&Cyy9?~4U]W> K48r`CSSSE^7<@as8p\Bh?H$BJJ kiiiAaa!;Çc $%%aX`jޒڼD%%%(((˗/HTX*ÇҥKHNNFVP\\7oϯAӪB9444pv?ϽT*߂իWM6PWW|>3g^zXaBKK 3" СCpssH;wZZZԄP(0PWWgۇ}`҂%~7k1sLv]]]8;;ݿ ɓ'l]J=%G?=pi SLQNNMM_rѣG5{=cƌҥKѧOb޽W^Ŕ)SR07o(o>>}zzzaB4@q 肊oƍvRš;磬}K-**oCE\\8ڴiDBH_#RW\9sC"""PSScWQQ!C]^^r֭[z*bccq]ԩSCyy92227n`۶mxB!lmmѱcGkׯqFĿ QÇn:dee@ Ɔ`oo[[[hii)aD"lݺ ,qCϞ=j*8995QEݻCk׮زe ZhQ)ծ\puueb,_wÇQZZ4mŋ8rHIIIAJJ vz.VXQx'O`ܹXbΜ9J\xsEEEN:>}CHII-6apuH$#==׮]M.|a40 ۷oÕ"d2V ;SL!CK6 2dBCCe! ann[[[}L333tϞ=?Ѯ];$&&pvv!+V@XXjIAyy9v ###tRgϞErr2/^ gggd2aógϰelڴ gΜ? \ɓDhh(ۇiӦA"`˖-XjQZZ ח? .&)LMMѡCt](2 !!ׯ_Ǚ3gp]p8LJpttDvv6Ν[c7bPUU!?W/1Ξ=իWu8v{x;KKKB`ee+++m6ܹs :\\\ؘ "QQQxgخ MMMxxxN: XP(akk[MU-}ES(y>GGGEQQQ!{s%KMMME=ߔ"xeaaaҒ+WV+7??]v;wkk_^^N >!:::D]]̜9T2'nnn yqqqԹ]VV166&111dݤI&!ʊ73332p@v~ :d2B!ϟ?'***$,,PHbbbwy/= 3--#GB"J+MMMIRRV#""@ v"r$a׉6S*ԩSӓCII P=ϙ3L6&$**JiM+{F|D>( ǚ]ӼF%K''ˋ&ӧu{[MDT.K$UXL!u֤CJ`Ȑ!D""G]]/.\FZh^I&mW׮]#vvv$00XXXTJ HAA$..ܽ{ϟI&SSSS罹s믿Ƚ{ŋŋP($VVV[nYfՕ}hjj(<<TݻSR̃nHѷo_|l۶Mi6!C3f;gx-ʕ+㧟~%Am6 iӦڵkJ8vfΜ={Ã"֯_?BUUU)"YYR***dL}x(//udC\XPPk׮ǐH$pttDΝfdee!22o߾6w^cKYjZjN:a̘1lR-5kְ_BGGG('={D&Mp̙j6T5&ܰUTTT[nmmTŠAsEbb"݋`p\p8I&;v, &(-S011ǕꐔWWZ4[vZ,Z?>Ǝ X a ???\~HII;w|~3\TUUw^,XWF`` 9+++FTTe{ٳ1uToCݱgYMKK󡯯xݻw̙3t:OPl99w9{,$O&h"xbrIrAN\\\HiiieFFF[[[~zrin:K 6 FFFݻJˣҀPLFIxx8!_ <XX"w}GN>M~'ź?7b1իҨFaaaHR) pȭ[!899)uS͝;vرd̙$==+$##BȪUHӦM.^H\.gٓL8rBVXQ-[dW t+4&,,,۷b1kѣ8pƎcǂ .͛7qU`ӧ~BCW SzCp8 CVV!pvvLs.]gDH9H:+d2ڵk>}:oT6mڼӣq}p\6_~iiiؾ};8R){g`lljT^شiSddd. z mRھ1ڠ.TJ PmHc~;BJJJȵkY*+V '&&&ٳ,~ 5~%AAAdƌ@.^H!$//xzz*̈́x"xݻD]]RB=z޵ި4ܪ׶>S{[nůWB]]M0b 6' ȑ#UGbٲe:u*ۇs2NNN5HFA~z%T*ex<;#FҀ1G?ӧOGN~k@8PڵaaaXx1.\>Q Xbś7o,Oa 1sL9sIIIVʖhkkz}<<\t 8v옒rx1!i&6*;yVTTӇB?@ll,\~ҋ6 Ck.,Yߡf{(]<-p8صkabb3g@,:HCC:::h߾=.]SVKmmm%nnnV~0337BgS W|q[a>|| BBB q\xrXt)FÇcǎX|9 6ann˗#** 'N@pp0LLLӧO͛3rec߯_?`JT޿֭2331l0?3z 777`S(kK/ܭ~۸~:6lW_}cB[[GxxRŚƍq]|>8q"ۭx{QӇ 8n:q_BqU_k׮*.]2)gB`6m`Fwn2€V.}.5{) P(19xk\.6@ǫ }g| Bw+|(׮]  z( +jzCiӦ .s@QWWgWQQBP8|T [S:l BPq@B!;P(*(_:BBP8|PBϖR)ThҤ šP(*(}KKKq%DEE!>>ķ~gϞɓxHP(?"G]CB!TTT q -¼y@P(*( ]HR!;;8~8```cذahٲeeݽ{AAApwwǮ]K Q( $ !!/^Dll,=z xxx^^^{gbܹz*voooEP(*(;عs'QQQ 4PWW8;AmA"`Ν6mV^Sҋ~ IDATNP(TPk@mˋPPP۷o8{,8:v#FG*C^zaРAXjBP8|LAPը#>>7n /_Dll,bbbp-bXXX}񁇇GXWkff&Fbl޼_} Щ%í08t8"þ}Cl}Ŏ;`bbMMj@a?[F=z@ll; D CBP ͭ V2 r9JKK߹)&Os3899!..Z;0 P(9@U-PVVr㈌/  aiibСl=u]ݻwc̘1غu+BBBX@ B)򐜜$$$$Ç())dA"YfpwwG6m ++jhTcbb0a899a˖-קBP8rABBN<'Nɓ'Ԅ }}}hkkC(:wnݺ_~Ѐ;ѐB`޼yŋaggtnT,P(  ZB !ӧOFtt4 }Epp0lmm,KEE 4hl,\+V}0p@իLMMHP(-jT'ؾ"Omo5r9RSS$%%֭[̄D"ARQQW#""0eddd|QӘ3gܰ~c˖-֭ 6l@JJ BCCQ^^Ζ[RR;w`ܸq{.x<x<;ݮYfG^}va~ݻwǡC\̇Ν;sSN>Ǐɓ'+"88aaa]FM11::wijQ&a˖-0ro>8R B|8`ӦMôiӐV3\.x#ןa'''mUTTF+h֬9455⢔ +VaàQP8q022b!-- r^x1pu+صk^{!77ꫯzjܼъÁs\YG "##7חFP(T"Fxqq1|}}!J1dL>ֹ5ů2}m|p\v[1 !!J1c l߾ھK,>fapMxrssS|2F'I&hҤIc>[lll,}^ kkk>|5kҺ;w ((˖-) [[[l߾x!&Lx8p_42AnP^^Tt J|>~Wxzzb٬@QfNNP "c"8w\ϭcǎ077nE"ڵk4h')3gE8p ubB@APP^^^pqqArr2ZhԩS1c xNqےDFFBOOeeeHHH@affɓ'wG"..rW\aEӧO{n̾}BSSb2 r\#3p= `eeMmڴf?~v}цOqޝ;w˗1yd6DŽnݺ * ( l6mv5x~ڵֆ JKKRk` wrr2D",,,pxzze˖ Eii){ilȑ#!555SN >WFZHEEƱ_ W_}ݻw=zi0h deeaĉ{@P8Oc*ٿr @&a0 cǎACC 0o֮w?8zhcǎa,\0`Ѯ];k׎= ,Z={d^ a J1k,D"aڵ+ GGjkŧ$22nnn ^p-aܸq 0t!1yTQ(Jobdggo66oތǃ&M͛7aiiY@CP HS߿_IiӦPUU͛7c 6L) H$X,f>6l`n݊ǣUVIMMEnݔ/d/^($&&BEE;(fYޫ*%`/+55*Qdž&&&VbQbTbA+BAz]vc]Ozޯ׾`޹sgfwg=|UZT5;v F BCCtR1!::{Frr2֬YMMMA|YYYuN~8={ӧOrhii NNNu^/.J֭[B𵦑dh߾= zx%<<-YEEE"-- ^^^HIIP(䏻n:|'8}4M===ڶm4L03f21ؿPaĉWt8пx{{ĉ) >8QqO.s17|8s .^SS:Thhh`իW޽{*JSr$""GS444 ]]]XZZbʔ)qc|J][[[,\} Ǎ7pcK, bmm]ƿy֯_ŋ~ĉ<N8ESN  HU?i00w\;v IIIj2@)zS,ƶm`cc-ZySZO?a8xJ֭[ B:::'Onnnh߾=ك˗Y)q*SQQ_W k8-Z7͛AD qpqqpKA⠆}ʥV±c}}頰j* 0=Qϟ?+ R)lmm.\V7,, cǎX?Y}ŬY7 |wV^mڴsQHRlݺ=zU݋/0uT"!!666*m?k֬6p>Ao7(̜9[nٳgw=(tsL:N) 4lO> ֭[[vզ7}Xׯ_G.]˗/KT ,[ ?#GJD{ d}Μ9‚翳v/_FQey~ا~ZV\\]]U3HYaa!f'N`/^`1ȬyoiӦ1L /y*<c}7ߟ' 2lj}ܸq#kذ!b^^^,99sd,""Be{֭Ycm۶MϚ d ].cDz1Xjj*PYQcX\\Ǐ3@ 2d9ő#G#>ʼP)S 66˗/y+2X,FYY ~CBB=< ŋQTTذa={P( #;;|ӧcذa߿?tuu1|e^ ***j˫Wp899~P)ӧ`|Z% r0w\fooS_|4i@ `M6e_}aӦM\t)|}}`^^^,""rVPP4iŽ=r‚M2q[*&M[ݫR`c,**`ۛyyyVZ1MMM>Bu*H$cǎl,//YYY/uBCC;|0377WvzZnf͚cL.ѣGk2KIIa5Z._̚6mʢ?ݻYflu:? Zy1N#YiiK,@*\RZD%Tyy9d*rVVVb1!UTTWTTR3DJKKYhh(ԩ fښou>7o2CCC֤I6}t&~ihh^b3f`,55$Ǝ̙cNM )lmm E{X0$ QPPub$===zyyyHLLjuл{.x\.455WWW%%%/1~x$$$HJJX,ƍ7 H +++ho߆X,;[ZZё5\XX'O/_Dnn.>kjj(X[J㠭*,eʹr,BPeB2{eaa!.]cccܽ{wŐ!C 1nܸZ;;w`ҤI*Vy戈@TT?~ GGGaǎXb[}>+**pĉqA :,"11ڵÈ# CCC9PAM+)֖yzz2 vu2LfΜo6ʘ 4h6m6m?~}X.]ݻw?tM5AҡC$$$@.\Pzmdee"NoEVTr???DEExŋ[[["+WjkkcҤI5jcسg,YA B>kjjV@:MƧŮװaz-B]\\Tms[[[`sbǎ􄻻;&M///Ĺs"88?Mˋ/:t?͛7}W^l>5?~MX}c044ѣG1|p@*"22'OD^Ȃ@DވB*0f~[]Y7.][lY`aabxyya5=446mǏy3f`Ϟ=ׯN:T" :ǡ!HP\\''''bʕxS(ׯx됟֭[OogƏ?TEqqq&MBff&.\MNI$9r(**¤IвeK}ubbbpubȑܹslsb۷w܁L&+ GGGb|7;w.ܹsvºu sNhhh`̘1|/_#; kkkcʕX`ÇXn&N^%a#6Q^^΄B!u͍oooςsаaCi&vdff2{{{vر*cccǏVXXȷc鱖-[>LKK2RRR"##H$R-[Xǎ?999,''zl~uB`EEE,''5ͿR-))*_ʋr{\QL&cyyyj(GUP\oU&qUZ<&6l/ӧO޽;srrb}]???{nv!6uTfiiOVTTk׮D"6=/~:311adgaaalѬUV=Ҙ[x1MD}⠸nݚmڴ]rݹsYZZ &eyov]/_2{{{v5ɄB!hhh***XZZ377g/_+))alҥqYVV;ue?åZ?6l>\cSNR ,Y=ë,=z4[zuq#qƩeq&<ȴyq [lZ/^`%%%,==4Ȭk@APK۷/\hhjjqqqӫWLUQLMMannsaѢE8tM={;;;t .kkk9Vaee={",, acc B |#>ZhZ8î]peygeJY QA IDAT/dÆ TIRR?~?czzzՅJ;59jhh:_TTm۶߿?Μ9xׇT*q|Ѻ?66yyyjSYT8'N@`` `޼ybj zsPZZ8H$0,t , 455q <s̩5F<<<`nn& kMA `ҥhڴ)F HR\rOFaa! P^^@ hhh+E̙3 cccfffHNNH$BLL LLL`ll ccc~0W^W^aٲe`A @ @P}P(UޗWQFʔa1c / 0tPÇD^W_aرu,pSN)+3n8cܹ(//GYYQ^^RիW\c+e=zhx{{>BCC#F&vލ+WW^xfdde˖EHHN} ,_NNNصkWmT H${a8wq9~B!V\,L!A|\cժUL&ŋJ>,ZokȐ!*߷-[GBB8~G1P۷#$$OƤIȚFC {mxo@лB.WL(:AB^{/WWW>dn[   HD=84j t1 q@k쐒 AϞ=@A8  cA8 ׇ9bA >v>-[A >b>^^^vA$#C|把 rL$A|07!00. A$c&::vE!A|pƍCCCv}HhiРJĬ,^8A8 DLA$=M\x. A$cEWW077&O}  t ⟇1\~֭:2,[ NNNj r@ ǡ&L!C燋/bڵAFжm[]OV (F8Y S0|p`P( ǣo߾022BDDlmmɂ@YC5j&N["** *u[lϟ}͛Q\\.AxDI1 }pttĝ;wR26oތpݻ;wW2TA+hZ š_~ppp@XX!M)~L2| V^]e D=(yf̘޽{믿F\\5jV0yd$&&ܹspssClll& q@D(5k֠CH$~:.\9kܸ1^ٳgcԨQ?~U A oniЫˀXU9%׮]ţGpTY>)>ǏQ^^mb|4A$ ɰ`nFFFعs'^RRٳgٳ'222j]0c 4jԩ;2d298YYYOPXXX 007oƞ={вeKL>AAA8h޼9 ===͙3FFFɺ܇1[[[l۶ Xb:v"*A⽣'OR)R)_{aÆ CӦMѤIT;*Ajj*4i/_Gll,ƌ єܽ{;v,\\\pM#((EEEDhڴ)455Cii) 'n݊'OÇs(--ѣGQTT;w<==S888իabbd2"Q3 ) B役9۲eKڲZnҤ P.XAA~ǎٙ3*/{{{֬Y36b6|&˙\.gcǎe| clfhh.]Te?ڷoϦLœu`ڵSaXRRRי ,DVx󩿦333QRR{{۽s1yd544`dd?ϙ3xZ;999J QXXX1ªAAAHNNFLL;nkmmm0l֭ hZr@&!$$...ѣGӧO!Py%tuuQPPǡaÆҥ /^\eC]]]t 044DFn“'O0`X[[{yG*P_eee;w.z쉔A8 > *ƙ3g^ա2o@uXYYAOOJ } .\͛7#>>jL>&LPףGjA$!!CEEcP(dFXX޽ BeЮiZ[[/Reeex"Ұ{n_8}4gaٲeUm6m4l޼֭_ HMMł cccC$aŊ㏘7o޵kWh 00c ={6OOOnZZZ k׮%q@|"hҤ8߫'˗/o^|X`!˱j*L:pssî]`eeMMM9sĴis믘1cCgϞaԩ=z4---:t})))AnၳgB$A"`޽;j-XnRSSannBXBʴ A|`OjAo5رc\\\ԢI2b |}ed20tP̝; N޽{1|pbt yyy7nBBBpq-```Dعs'ҐKKK K,Ahh(,X]v|! %Dj)hz q@ؓ1Qٹs'fϞ6V~Av~'~'s.]WbϞ=*KMO4ܾ}0 >cV+ڵkqMYYv,YϟNVՖ<<< ///ݻx yyy|h 5[q>}'Oƍ!HZ0`aa>A8  22:uRYP~@PPbbb`oo8 qk׮&xmmm"33`U@嶟hcxRRRУG*pM6a͚5_РA< pEO>x9̬DUot: ´il 8BZZg᧟~B.]#̚5 Ç-j*b֭xOsNDGGcprrBjj*fϞAgϞؘ"0Hy&kӦ +--7DLSS B& bL$1Hėiii]vzlwwwv9bуmݺUe{dd$bٙmݺrP(c) &H،39300`}e|)))lёiii1;;;JJJc%%%1WWWs LJh HX $$ BBBjtDڎQ[Y]~1X!A|D:t;vvi ;m岺r]$ A| /^89+j\@D/ em-,X[nܹsjUw9T*B@EExLTyP) r@GQsmۆ^zA"n O?ڵkw滋/] G=ztLǏG֭i&ݛ.1o<\x!..zR;C0|p?_Py߾}п޽OYmff9_~%UߏN:}Pn/i&A ,YӧO… uZ_S:t(֯_ƍ]|9bccQTT+Wԩ;v@\\JJJ0g̛7r 7oDVVիW8ϟ?۷Upe`.˱qFѣG*8pሏWiӧeD(H00i$,[ R)N: 9s*\.ǃpI:t/^X,qḠZgҥK8p`,$Gk-"FD"̙3q _PN:S ʧ-[ 9N8v sssh&A{ݷ~ݻc޼yvЫW/8={V\.nj3!AWݻvvvhӦ 00GEaa!8Reee9s&5kggg4iYYYʗBcG˗o圧L@}ܹ(,,DVV>}6mڨ,3T½{ J|$cطoF@tAAAUk.*NA;PnxAAPPPnݺA.8<:w\ իW333ٹČ1ܼyrz~:u 7n+Yfjkk}r뫵駟BP`С:uZL&ѸqctHLLDzz:ѤIhӦ BCC HD8Ç8p_BlܸF6m qMx{{^g|ѨQ#@bb"RRRt@pp`ܯpww;\mޞP(Tawww <<϶(JqDE ,ٱcf>>cƍj^ R0A [lA߾}ѧOh׮zxqi&L:8<yBbq"##k׮!++ -3Ǝ;2 r\M@TTT---zjL>W\nܸr1O*1BL9aj++tR]2LŹYfFXXEU$"$D'|bW'ODV}IDATHz 򂻻;?DqmۣYf#Gлwjߺu 7n܀6444P^^t֭FKBll,ch۶`p\\\C, :t??~mڴqΟ?===xxx`߾}`oo"xb1:޽{###iii*+)) qqqhڴ)o!A;777 4͛7WD6PյQgB.vmᐫ;>O&V : PB>>>}n@D˗/C( | W1VW涺'a@d9 ƲO?`޼yjD.cرDIu| q@A_"$AA  AA8  AA$  q@A  ) vWIENDB`biopython-1.63/Doc/images/three_track_simple.png0000644000175000017500000016154112250104543021404 0ustar tratra00000000000000PNG  IHDR #ve CiCCPICC ProfilexSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/V pHYs IDATxݱ#Ir&`)Q?[|kv2zSh"a_:ͨSQbQ@"}lw@߁~o_gR@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@8{PO?omݟl|q_OI{}ݾlQm?W>|}ϧ8/ոg.cVԄۗ՞G8ϾoҐwʞ}[^>ߎ-.Hs`Z~pzom힅7vY/e~dϾku_˼_xwU\6?հ=}v3s=?ar_>s½-cto|٨ۿ}MFQjBJ5/K|a7~vx5,RV4>=Vt;;ý^?|ž?|>޾}xVYxvmS~dk.yA^67u}[CCa~e*Wgla_/W/G.Lmݗ^ovj{=5=&|{ogGw= vu4-%+#o?G82˿U7 *Á5 5NunKn購|KwN?o+~GCUG#. M1W+tqaߠ^׽+oٸc_lsƳ@ ~Wφ f %3؋:b> ̼y?0wwO1;98J|8w1x~7H݅7aؙm/>)䡗rcN˯*tr{:E[zk6zҎ1[۷|lg_*? DzhА6}/Q}P_X|ezˢ N[}3ܽe{G.S.; O.Fؠ5|ڸ_rg ^2չƽ R+jr=ㇳƘߝɓZmu;OZxe&ֶ#f9'%kАv>݋wAl?/߂F[mU$mׯѯ=)zއww^U|X 3r+Yő+|8-c;#{}m۫}{l_~=}e|=yĸWTmccNï\>gED7>[[fCob7ȑ?O['?Пesɉ[ һ{fϻ º=Gqo\$m 7ݣ}& K77_.\۝ .dgf 篞Ƴ$z=zKZzX] 홍yw>~Ϋ|ZʸhΓu3+ mcm ٺ5g=oSyM: +HڠID,=@XKb<y4Cn]kΨ6Oqe yh% ?ݿ뻿ʯ42Ҵ F|xӱ,jϷ=);^v/glFLuF(6imƗk6kyVߡN'l:6?WAmmFP'}5 |_|MsCznS ,׍g3y69Ωt{3.AC G!\a{'E%i_={rǏ?_Ǐ~||c{~_~W6?ZP?_9?~|||nx{y}uǫ?>^?[]k/;JgO< ?C^\;kv~{m?ΪW+oqNxxkZzW ,o˷]/rL㶐FՅ߿٘ZW'=o.){?Ϟto/OBǿ^pWFױm?s={/ˏOmճܹ4k._\.Oxo&xx~M 㼸_vްgeɗwA/{ׯvyz$rYn?|ˆ ivug珏_]sϿN>7+^6l;hك.N>K]Se3vur# ~}=waduw={˷ 6t^Up٘wɓ.~(sUs .˟Oo?|>] 򻶿Y 2 c>>~c=o6Ƞۦ Q|]cK3^o;Iwmp3{xv}~rvIV};m@۷מy}׸*/;sƷח,}h5wΕxkvT_}m;R~v>^6/?#v{0y!}܆ 99{+S9wWoWN.w^5vİ[|oyWa[w!lc>IIږ}UCPͩPUN8˚|LPt܂=E˲\pn- b3aI`E+Y#kn{,ViýR-w -K3a,6jRB u$lc&Iϱ69ֶ߸1FA0cJ$/].&d0bVU^%ZS-$m)BQv7=e d`6:62BA=sdqpEas` VrL=¥Ko]qVԴߠW1Rag /HYk#I&l 9pX4k:i؁Q=*ńRB%O-6,X2,e6&:n4۳cmJyFZnUt+ Y'l[dg|&- t|R MC4|!{PobFrH!KFk-j.HVfÉ$m@qvmrEX8;k ފË9qg$_yX9W%ږ)[ YY 2 Øfz;-t6e汶,7,LmV^^RsU(Na-MBCfK <ªcBV/l#I@ѻ`nV)Rc+2w rIbRDV~vnG|Zp1,Xmt'iplNw5tYr4;,,73B),8|8 +<6Y~8m%iQ ̲π,㤶 006D|X9W%*#5^@C>wn'kY\`7|(eeK6:ADRVQ$=qUc5D.9^L X9 J7n5zKwC8f ˌ0c8Ų'lID5gypP+"7IR O"e. 搴APK}dv6kͯja {r+R r_6) Y46KUΟ9F6 D[-#LVxUZ>^wK lρiRNa[}VhrO8忔=l{ r/:;9R,6_hXEٖXff#OXN†j-{$m0PFXI҇tDMoTbJ搯b >>L? "lI-f86Ts{SwS7sz*ceMmfÆ6ә&"l #ŖA}pm˘PFk Gdfr'M@+*emЬp'gѐ 6oO'i$v}Y#9ˈ+%շdQ.¶2lKZfM?cee69+˵_,E\.I-8cmMrpEETr/LQe fx346[xFN6H#}C't\%z cNR2)S酸)=3\FF)Bj̣]STm{պiC򌰍=$mX۲4F;=ae|笆?Q#l†t;3򌰍$mIcmN- 2ng^>^:^ 0#mEe**SH=6B͖YJvdQ`<#lc ڞjVX[[~iɼoӟhdTe y&ol}U Daf%ÆE5HK%a$mL܎zok[SإM+M;6, J9u>)Ohu@'K36d$^3 rj],d.Us;M_v(e8QAjI'$mcmxz׉!ɪlҷ, |jT"ʱ'z>qJMKZcm<$ivs C1 ťVbj)t8,1Ŀ "=jHqbaCr͂yHW6Hiб;8ȱ601)Wݔ/PW6 J9;ݧ+61ˉ9*. aw$m@&7SF z*˚i:PSJp)bO>'y^246dZwҨmܒ ~8WC? @ wTTo}O}y9N\e}`am*BZbjRoBN+0@YI`@wvu/:yDɰ@QJ]Vs`~4l#ha1k9*lgQ \Aȑw(2",Lp,uzE@R:Ba,],4mY6eFke<Ƃ K6xwDnW܈cm2J4k)0#1K9HAJmm|5bgxtgj25ޠO]Z?S(p mDS l(Pgx8ֶ&I8ֶm̕Su?.|%ȤX[wGض IX[q֬6V '+u]L'9$g-,{ؐ}9:klE0OtwXUt|1)RG;|L"ezHL%gL֝A I`ѿM-ok V^+NWi=¥WxIi+ET3H3aC^8=#l[ o&Tp;]IMD*oiyGLٌh(;a8[~ƹ|`I@z\']t(ؠ)H򎼰qSlm:lH=x"n9ֶI$nLP~]!+vzTxpiԘeqGAI\Ұ! )`9a[̷Iڠ^ږ//[x24rps&he68.iiI GJ!vuȎ/%6XH@ Zԝe-[x &ijt%=L{k p f†.1)gHV%i9 g$P̭^Y_@:RbN]2NS1fգ'a[I6d%X| 55f7L_8*cuLZbʴ>3kfÆhc63wmHڠ,⋹ӅcmGЦ~}2タm0Sa^I@z} d4_ "]ؐn-X4zIV *s9~눼#i,J=d@g ׉405IV jV;ٹp*e>zIy9m$+l5ZⳢ(F9Ɖk8DX~} ټ%|EDq-$m(?@2Zuxklͪ(%DS{>]u ?(zYW>CIX@(w[ӝtեC5K{!8atMYF L╰-;I[3 tDXzI'D!2f†DC% Jؖ h h6 TY5%]f†6Vy%iecYTsv!Ͳ m<1&i #Owrk+pFLʬcmiI'ä́ rWWHcms_Yr]zmN&irOXMOPlEKB0$  %i6H_~9{ǔm:׳@e6& _~x ȞU ˏґprH ޗ~#9_BN&i ? PQsvn;b632@[N6[v3|\# 4 Sy%iGG‚jH5`&'`># YI.E̖ rK<# t@wb63Dg<^lIڠ_eC]-WF),$(dpY1[~6:,m'߲/_`LھmaAbf Yhʢ 5xh`AŝxŜ>_v+UQJ`tyOP1$ ux[&_9V QhpvW;IW]?PͶu.拕YW#bow˓Ae~C[|^YsB#WylL2__=V[#"Ѣ68"WmûleH˸ #hcz*>hjQ8BRc6;׉䚬\bg+1[%6(ˁ6W`*1Yc.O0f#1A#i8MՄ9 jYQ=b1Yt&2JV jr;B+ak0hFY728?/gay V37i0I0 HӤ|4e2VqżX*)Uv=ؿN!4Es񰟹@[I6੘̉+S)#%" S_L{:6#2 LL'1[U6(GG+("WD䱥6+L_$iuI][̻*"l3G]iNK?͉b-OP|ƁDO}%ͫw)Vs@R_Ҙ!鰉B4[m6ƁGb 9oyGMTpi\8ʹn)#()#T.v!Y$f+OuiLsQqQ&.!4H(d?~D>l 6%鿤́^NJ$'<'i0m𮠷DnW:KUbt5 3uG̶&I@0Mțۂ7ZPÑEfN)M)PA:LٖgV( /|Q-xW8va||||<NԛqTguݾ\KzwK}brl?O~b%W2MӈVLY7|yM["D)0BS\6XbH~vkCNhV03m[r++@[GYBӒ+u*@3JLVq!tAN_?=-gM?ŖQAǛ0.b6iNWUKc&KU=NFſ'/i[AƙGYEQq-qm6HlāIK>m Z|/|ue¥Q[ư32+ڸHFOkr;jQ.NSu?$nQf"b2T1v}%fJ38|7q,Tq[xYтo.,Tݔ/PW99emc-lK[ d%f㓤 XwEM?e%DCe)%L LPX)z뗴1 *BZbh!0␴AJhu{u)(0Y)6U(*AɑpDመ2HqG t/dqlT}LjUgjWw½u.tRlOg X{H eug/]u;ko |jTQR ;<:ftbSm|%iH&E6ӝ6j]6%EՓwmvY석/*b/iCb6A2e]>x:N K[1;SP3̡1E1%idcݎW75ukr7jRrV]Ƀ/5Qņf% BM]^׫ݨnjy(r$mIЮ;^uɁt5Cŗ (oԱFQ5,O@h GԋVv`+3)&iҰ{Y21'|^|ɢ6yҽ<=!Q#f}geCb6^A ,],NlLuz!klvPFu6t:$m@7)6>&Ї4gZKKje҅2KIQ$4Dݧt;3m!i.۸IŕA7vDJjU[ ^SڒWMr\'5UcuWu29 rё ݣIf~hmWR-0B1HR̖h˻=[׉ ۓ3b6X2RjT|Ȥqn2] REjِ]'ǪБbޕmN3bJk2)I$ ^-¹?sQL҄\_ܓu"Ӊj*6wv'+𰥅؂3b6"9v.z GGZw5g6ЅRvXNn :*Q8f(\rK7#ID@ w.'tk5.K*T˶ ;TSoIIOA @aXbG}5SA9Dxc[h3z%Ttk1S!lua1!F9WޝrӴR]q'rPPXEٰN-LV2f˻Vɼ_1$m0P̾"֌/9#,;ʵߋUDk{ddlS1Cl)fa#$mלEIxʢRgۙ8Y->Um9|i f I&0;@YӔwyTJZUePKŊ*q˨B eU٘CpӛNy ɓG>3p8~Rb\*VTI[ iL¥2> M^FXh8IQ8V]Eu{_ k6p~Sib5F P&f ID4@[.U:3@?nho#w1wl5$Sdn5Kc1[Mtʵ!fI!b@۶,3~^6ߋsXѶtW%dX$f\f䱕lt$iQϥ m lĨ dʡ#5)1-3KQF>P7rVoї /GGÁoEm;rEyX9W%ڐ^MV \] YޫXlt'ik5Z? [QE+xX9WrQOpYNX+LqmJ# bёYvsӁhF5.,Iyf%ږ\FVB8%cXh-ta696G> .f"mj4x2gA,X,[aLZ l!i@fhk`[yLGk)h[kJTZnU\ ilą[&#*=,l#i!gfpRE<6_7‚%9AܻT˭uXAP'ufĆO_1 uΰ3B3 X"Qt᪇A։a!rq}$a8l&ixۄVs96͚CLj]Ug.R'j-]^d'i|vms-4UW/% 3^T˭uEХ3qVTg36|W$b6[!fHtL{@n%5OYA;oM w07 gJp1 cb6}-KnBV81sH|p7# >˶JIFZd)m-]3WjBZYc%^1G-$m©kṕvy1ơёD%٣R-w PÂ14Y{EuF́\w@<j%xʐEeZ]ׅp o;=5cU^tW^lL&irG6.6<YbP x ڢ:+3E'ZaR{Yw231ILyq'v zU,|V#P궭\;eͤ'ce eao=~駳p\.Ai6hg` ?r.?>d/{ lf/tL} V6I^qo~0 8$ Iwh0'i#nvW$Lb- /Iw'iCWEi$[@jՉxmi%fu B B-$mrVm$m+:=[:}HGҶ@6%t%Ba I"⺥AU1U/0$mK,t'iOvGC.$m!0I[q%A$mhБhR$ic>/I[MR%$mNꑴU#RJO$mBVJ[*fO$muf!f{H[q$m%U zH[$mɓ`4I[n8BFA>`I[b8HҖ搴$L8!e4|IHڒm`&Ix$m␴!f۠9|%I pd{)$m HE+f?\*&Fڦ?$mBW[?@1HI"E$m!V#i GdHb!E@@fHyGLF&"= I[2$\$m!٦ >uz$mBv>G% IɲHLv&1N$i#:14%4CFFaIN =(@F yHL6ITb N6Oht-zT%iI(F-$mB6ɯ?~=z#lO$mS LFP<x IDAT 8Il LvR*I!I$mBvPQ@I3ɐ򒴝Lض.I8dZ&lO-acm$mQr<CH)IbYE@6+IdwkRffdE-7r>A|w5Q;PN3ꪵBtp8q>nf$p@/=JHIfeI[ F$--%INF5Aa$З-.I@dЄmH]0)WGHM"iK@N.$m9$  p- ړ@ I[&YVnu3KsaHڒ'!iG-I8 -%9+:4#iJmH8 -1Q+:4 iMЋ-a[" JHF`SJ6R¶mR%$m N D6R̪FHO3H$Xh@F ÿ㑴IHO$mÊ,E IȄ[w4H%$m +B1j il 6#zM!N$mq 8IDKt8HFk".` Hnpm:%*$m3u/` IMZVew c?_w_j mϏ_}|m(u˾s}׏W{KR:~q8-YU>]u&:溼7u@3Lt7u0:7u'Wv}uQ|uOp{}}m?rHUZ=I{Jn 8R07u[vdn%i%jW5zn݋;^-k*OtscΞv Mu.nDpSvw:w c?.Һ]ʮ[O7e˂~x{lp%mU׏|6nZ8Gmy/ sݖæ 2ѽڦ: s:wA'--.}[u!vr58[6˾RumX-:?Mt007uXv~w >>>~%d]U+yxX+v#U@_.aL]5l3x%hLJ8xdM[nӟ>~ĸYgӱo8i\ D\0'O4lIOkv < I}Dج`As*r!i V .lYF]6 kx'~yRϻUb_|ݕ6 OɖnӬU}:IPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPB%$mPw }+?UX^`,_|oU-ߪ]}Zp<ǽqz[1+'MU9zvmi1+VFL8Ǘ!|v.fS:i8u8+OP?-feX-8ue|Uwu)fc[>ry|z$:o|yv6 Dyûԭ+X.xYmvWvn<+iW߭u}_V׭<y;-o9*>5?+#R/Y?>Wv`8XRJپ㶼S|~5^ݻbt{_ l:y󳯰+nRʱ2we]kow~YywFuuXŵf"i=^77V~~(9uU;̉sZ^Wv֎?#ۿ[߾lܶLx܋?v *|#Oンr}|y eus6r~nH1[~-mϭ6=<{/^U6f<8ʱnӇ; KrFWe?}vt$mpMb)xC`'YR6n9v|]NKSh?^e9WYwٻ'R_{JRqg`˦ăGgˏcK緜?+-z#OSۍl[p 8>U|$}PprlI,~o<]ߥ`Z?9V&oFOΎ*z۷\{9AcV~-Δgʱ^ 39<[ݐSӝio{vں,Uʴ֦ qxtۄ֟#y[(\;`xoK˗?~,_}~~^۷?6?~߿?>>.5w^_~YZvt1>nmleuekw*–[K/Xtԗ=uS`e˷ 8ෛ:xd׷ X*Ֆ]ɖ-mTF֧ĥ9+;}U|X?mu#W_~mwV~^[lxw_-x=|Nnϳ֏o֝_/_2-TpL_槍7r?믊>?箘Wo|+]2-߫Vi=حZˠ :ÿ_/_O{~933V?IwgtW/.%zgyYpͫ[|f׎~A07IY4ngXoʙpȟ˗N]^wެ<~Xn~Jגnqԕb*Zʺqe_.lj[o|˖+6UnDqWnZ]OU\iFU]gW?L뱀A >VeP[[`x8;sƽj}ԻV3e}Kmd^?]R?Z.uكD#S'mW=oL7I.13mkϊNpBK:7eW_{)]_ڏMwcyx εZW D۽o,)|UUgN-kEVWн_6na[Rˋ7/Hr> uk4?z#U<6K0[ )QQ@r.&lEZ-  a{EVhlR\j>S^qH2"ۄaM0bYLH$Z0vC{NZvܺ Ӕ \l^#"eNJGluQ U $m,R5XsfY[-2_>ORд.ä)M8bʜ<<#ZAe ,kH .ڼp%=\3Ԛl,IS`͆0@ 6HڸnuBJi yb/`d7V 6iʄC\?vkTP^S%L봢~-kH "I:i,Hem0y6H-:oړļelPUgE$?CƩ;p4f TfcjɤyńCyiZ<$m#dqTϦmjFv& E̅VP@`%i|I{s7U-k0'lJ6.>uƾ\sk4IFE$rQ $$m@}ڨY7lRf3H) ]f/YLK&t;I"Ҍ~.$mem@jҋZ5:d),k۫4nYWf;e$LZ1kh f i ̢[̳mODLRG2@T=h^R :!iLKZ>P BkҹÀ y2t@8jC SnWaY6760-oE5tgY Os잴\5ϲ3W0 f4TJ&-/s t .EYTAt>| AnbiI3 a,<ۥ挍B AHG $m@emI߼NZv 8b'KGܞw=V Ίy@qh2{Ir&iN.*~AX`c'e5O2HKݫd԰m;] ܊Îײ6 Z8(_k%-(< 9G:I&&Hn $LRmgi/k X!i,kϜ*rjAuYe_%@;C6Dr*]ڊP>ZH`H6Hò\DBg<@rF\j[$-{cS^Jk0_͓ {YhB+w bIJ6 ک -_kmSs^ՠ .&2+0Qң$L1Z I@ ݼZ^fY `TKM+{6Fڑ/Z,k$m[emLI.,!b/kgqhəp'cIJ%cьOFOw(ZgC#[k֢QYgAö}- HI =ژ3$K-, E-3ԡQG^EV$i uC|P^U1g7aN\[hfzpq6kԬNް-{Α/"\ޖA^6em;f "ꔼNYŽ.ZaykRD7aH[$ I4.sEdH(G'lEz=J '^f O=4jNҝP!GvH݊Dwݝ̲6HJ᥻Qdg5=ZVN/[c,c\3Zgv+iVWꄩ.8[+/BQ݁uR.`I'DH8EVM6H;\:Ye7v3jե8Wބ:x;0Iw{}!hr.WXbF^΁DE-I 9emz?n۷ouytsTc88(^MцE8?~븵tRuKIS?NyVLk׽P@ִAk>ˠ#fY99#fi,wڴ"\z֙Y[2D1EVDukg/; rh$yU$uu/É9ҘU$NB -T1Ir%:Sqh+ctx,`6>P֥9Fh[OժU|g-D]fl6F"]+\" Yv-k0ahqD4أiO<ΐ(l#t y``68d}?pQ8SS[$ *f9b3dT#bmh{Iz˲6BEAI?bqן#KֲרV߹7Tfƨmđ+a:UV j⤁ dYs 2 xyZqzNdT[(RAWGER\V<RAbzj)F=[Os5N%LC:QUW.3XB7aHZ1jH`Xu<Lr9WkaW0Ψ㢺,q g7F̤ADy$V,,k$mbo1AuC-R}P+G$L,pExK#1ɌyKbJ5䠀۲SqPZ]fAp6oP6dV2(637@Fj4CE"{|d[{I)Z :I 6U¶4lal*NOe!U.UW@mDs$cBB+|Ad67hemqFl*>k{zj7d2䠪ߥ*OQ\EۈI´ߊ1: ’A-֖lw hiô1@&?qE?+2!I!c S3Z `Lqaũ)5^84ވΠKM̰M /" b,k;dRy?2Gge-.GKMIUb4'L-oTxJ3T>|x`?tkA ]-x YI`MHumFDZW ]w\Ąm'aZDn+#IH[6g _jÜ2LCb$C, 6yE;v V²6F9ypRs]2-γihw$m[e ,T10SSjKes]2֤.0-W,kP$m0 1 sf3`^ $ HA´ /nIhײhRg:. gBL+N3# ␴t,kxgktjA'^EVx ._G |e6i1OABЂWVȲ6B3 b"G/{4$l# "Z+ܻ\Iڀv܁}4$lch SGZ᭞,k$m\>{Y.ALfw sڝmН `|>:2 /EO:Oa mKXP@vH]pCLb6 ugAD i;nF]FIbQ Zԋ>$i(VʩF]F˄<ә⥫}pE΂6B鵠^^xp•BR#ES#<#OwqAĂW+}L ne'r4q) ^W,h8$mcAUzsrܳԙNer]Bl1C 9RW #hhݽDHI ]X> ; IXgp7  6{z}pK pG->w4̙Yk 2L9iP``9I.y3h1)VXHڀFPiA[-㍈ Zq*!^eiMR">*rܮ<,,hP_w^@ctY 6 و/rԒ>΂6H_ҙa̰9RXAAG,tD?76Rb6\zth-I` V3*dB ΫZ t B\x~x# &I!N{Jtٌ73{6f9ѹW4W$m0> T؁4(,-{Q~fS?1 O9^/laA%ii"N^l$8jJV(2Ft]GH$r&ˡJчWU,hKaԏXFػbCP@G)\ j%7ah2RK G}lcAD&iZ&{6 e$CwAUKyh,x&ƈq\^~W6mbA"5o"?"Eֲא.E sz A 6nFȑ'j%%<5%"K̖+qR` I 9?.iY6-oIӨAKqũQ$CdɄR !-xy I@0'0%NTJ EFݨ㢖PأQ]-]10J m3Q}w!D;]D0jj\oMj:3q84/}||,1Лc6W,hDi$a)R;8rRuVI(Q.q\1[TcHĕ>pBC]ܨ(r/ ;uJL5X :8S ~Z]|Y"]FI#,ht$mD$c1p2(WBh2FwU>z# .hs4 :XgaVC ˡY+b@,)Ef.M˘/եdAd$iLVdZGNη?qU cO\c.D)i,]-麔hl⍾*u\") HڠV] ,hCC0|W Xv9U%b%i3$ǂ㥊a % )I0侍&\#l o.IۇZt#GWFe1gN7fptWI}A:B&RgF4i|eUQ6m Ytg0KCX^XyIH)2To)QӅŠȣ U[bNbT uӄ}Ht뛨T`*6mݾȽF]V}\?Դ.8^FT`&C@.9Oh{i$:f*@khAj6q_$e1_%#FpuS=Ow mnP:#Av6H_h{VZX66 '=cҳ K.ƈc\A;񃱙Lg69d>:2N#2DQ\|XF=5OvF#:n^uW0$mٹ]7ak[X mKLgiPŜd1n4|A* R^ˌaKW!oYlI@b'^Q^p!% W*s5p"f0A@]$m+;&aMu4yp-֟7CA* Rƴùa:/hIF;21)IܼV4dIGIu#YaU$m'r|dH" /T'aHamc  ~6re-3(.NFj̣n[6$mOP jӒ]"kfHV{ (lJG8H1 /`ADVq2p9dZ3MVaU &4X&hC;;'idFMςλr/!f>QEPt? (6Vg0"xR}U\fA F *o1_kwӁ Ұo}6^afAp6LL2*:/LY{y x*fUE=P%`ۗQ1AHzQ$mZmAn_`H/&OF"x{:Q*PjG Ш'69|ԑR@t5C"\"Ju081FJ;ؼv3GM3},1-҇|uMq,'|T' Y/TT=h^u;.8{+rm3!f:$}$ `67sA1y GڽtHSjUc/&$qH3y5I,#(ޒAPMr20Y)kBE'43[}٨hxi>Оm0I0oxJ{f(e1FϺ?1rm*fԢWSEm"isN-an,h#ϵ )N̪3xLjRmGU/{ӯ^iT4SK+!8T$mFfڟ3tٝhVITjKPHCQ6̹a#b6Hx5[\Ԫ[H D ^ݽ5۾;&pDcCp 3 l7$ ¡III]K`66CK[6.i`#l8|M91d v9ː&D#Մ}uQ U $mHm`m&)Qp*#xj˜&҇R& &$i2ݾz..m<.:p0GpFU4+E%":nJG90/?]Ø|һ('Ai6(!i]~7ÿ~|<~3r*f(ox05mPBOs(hp{]$W I/$mGGgWb$?w"ir.fё@6:_] iCPB61[/Q@6F#ڐMM( IDATPL61[KTj^K}$m5:u\@@6xCz<%iQ(B GHڦ#B6c3F7v#$mt g`7ID[If1|#$mS* JHj Yb%*5%@ I&&&md'Hh'QTI۰Ɋ)mL§#tBF#+] HЀm4l;[bMPL%$mpݘw PN6QIF hOƹJ"7m>4 $mIz%?f_"Q]"i#%Н-+QSE "JQ$@1I[>,$mS7k\vٻ8JҖLX(K$m␴!fё@6_3 FҖ@-QJgI8$mɖb.fKTpR$mqh $mAe2L{K:$m⓴#f{b[tBF+`6XUYH#ٻFE(ue$mPBB5aOT*?:bu&FHJ!Dw P'[Z%iFrB`f>dTI:mQ#]T&ikmh@ I[SցmW@pvFF @I[#)Hڀ}~~.ꓴ@ I[#ѻ۷oK$mF"iDP0 'ikJz0 I[k61H($2do߾.*u H$m}Ȑu3@6IM%iii!u&jF[&I[ $muvR(b LjC$mQr7lKy-iS Ire]l"iߌ_y'i@ԅ6o@ I[JX)$m#i"DcIڪ-(m@bO1h&iIst HFz1`I[Y%4U&juK$F;q?bjKPm X&i;I,m@2N$mB6wht$iK-Hk$*5%$m!$iN8*H$m3rE$mUF0_7{?ۚ͟VaI=*u+h ϸt@F17uu=7u+ddS @^o\gS{ڲzx_a?u=?ã=;ra/.(u돳|Ǭy:^'Z8ZÜ뀕l6u6uqm?9C} ]eOrKk ~?>>}} Dww[wObP6WMCu|s1NtP񛺇|P6uP/}[nv7Rzߛg%^xWWGB%}Ot~纕g|1ޟ@1a7uwk+\U=C':(MisM@iKi#/7ZI+[xuOAkPDJ6u@yo:v= ាeJ w9~_Bv[γt]m_} i8{$VĜgOD={ :w-g_?N9߰ux=d_˗_cCgI}~~ct\p5??GUBcNtώyw$|{Y6EMݳCu[0:ǦD;l8էxIҶIC}d/G~]>R/~y?sm{|uv8v؉֟gIǬ )˦V`r6u6 ӶsM[~7e$} 0:`uHڎC|_?l8ys[Yt?-a ^rm3;9w `wۯ׿>m'JwEBLOAk0ɉ]'hfS`YȦ I~Ǽ+~iڶgOw\Ho%fD7u[s?\~ؖ:纽7uйJsC|ˇ9t#tգm_qZ9x>o嗗Ow^>N'Ss]L.nI̹ffS* QǬ?"i?9i,&sΗ|Ȇ*;SslI@`Fo>B57gi㱽1)1~,9qOOsϟ7 n,n\;Mw r6kZoH>·G@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ߍ.f۷so?r!l|_߾}[>,_} yt/[\}ց c ?<cI|8/\o'ʕ|P3>;OҖك6/Ícz,/Lv#8SgnNqiUcI`y|}6^lOrvolI74Uߧ[ߍ_.a8 ?|=3.|>ﱆk~dS³yY Ck>l*^њLoiqݳb?#Mt*X~-v aͥVٲBҮufikx]9G֟к~{w>etVaqq$I s?FBy{T?W~ۅjm +3}_ۖ0q*ʉm<l1Y=/=;3 kcecAaotOFOusqocGqsY$+mm{5^O1?r {YGY,DRyyIګJyrSb5 ?YhQ;:W|n5p><;nYccy./9-|o2-g=%_}_ Y;b:3Bu?5^8^?0 <ͅBe΄1ho|pI`KϻƷ'j!u/_fG.{PwD^mXᅠ={˪c?(g]#9f7S˟:l?SgZ~?BLT vk{X9ƛ>\<&dNw׳,A^y ¤_>r3(ou8N{הd/zm^\E1& ҈yzY~^>u(z~Slj)w dJּsipm5"Yk;%|[.l9φZT,7rzRg,M1>{k_B(֔_\.iחjtk޸Kb"M >IpP{nl'/7.?1vf={ot/8ښjVSˇ ҢSOd;Nǎ7C۾]?,M164 ^~w:og$~.zoI;P֌0H 7o{ eSvGώ/:b.,?ۊ%ԢbQ\yiz-\Q kf3#[%ʓ/5NˌHo.~۷~|||}}Ϗ?N.ď?>??pt/6]?!TMmņle7N+}vù}ݧoy?~X9?i}^:a%={Bwy8N˖q|d :ݽ兹ح?|}k~oE<\sM>~|+׷ur{n#WVof҂p x/??<};}}vߟNOg{Kmev???zA>NSAW_ΆzmFa\c&,?%K8.}~~g\_Æٳ:_y7m1oǹ9}¶{C[޺7,l*vje6Qi5<#ij_j<3sgR=TaIVTH#HG5՟읲Oqj0M% ^&$m@/HIWd&ffjcr50W$YF%qmjcaTӵi~l!Iu҄G$>sZKZh $+o5!jQ.# Y %dK#IN/ر2Uf +oxLm{ԛْ S8l'p7m86 ׳ X3Ȳ=ZDgo]SWATmf6g!i [N\xdA^S+<Ug2*5\ܤSuI|y;i ~R1/`F=g?I'BMWpGs} Bµ!mjk#a& lpMX]̖ƬL^yÕYN`a$QӂI:PxCJ> /jTQ-l?9/ Qӎ)5QCڄO@ ?iGvU$a$mV(CHdqc|e6?B`W3hB]h3(8Atxz'/l .fW;Cz ]X% dK]IvAVٚv3Ӌ2HڊmqJH }8[.k=!A9M&QtQ|$mOMK:ؤeg1H/ 'bgm }$aU ۸&N%ݕZAI==B VQ!a C%`2a[x-1jM.9( iX₺]~.xy3eaQJba g]j+a~$m@O}?J \2x5[[L>LtCC$dLV)8N%)hBPDP;38\Y"df~J*z{z#b ILXb;]&XB+fP,(6j#d`BMRF+ /$r5stG0=j0.0e; #Tb__EE3p__zi[_i@KaiX| .Am_Aj^(#H̙>G 2 eTW" &5ƘX0IrMցheeXI+ܥ+8/pTxh]D Uz S3`=l)0А&ooAҲ9tHKA{p+2a}~ވXI9wò5w̥*E?Syڐ̵ ,"meim~ވXC6&"^?f!KETGsȉYZ% 8 `IgWM8.2ZذL\4޻z#%IP ؍ 9`x 4-ҍ^2jD:Լ:!aF$J GoN22E167 Ҧ^RoDbm5j4f,Hڀ}v]q!&:V$ }ΐި(QÑ?t0P̰mG3zM7"H 7LPςIgXT]j xBwf|opC$IPGV!Ьƒ1əL͊E/ņ-mlW lIH ;5iɍ]FŢSl+ (EPd;XļǬj,ߡG2SwX0Io'&)NwD B$IHڀݹ5A!,/L@Û?6*??GpG H̛+J kt kމ6؋O0א $m'MD(`I4mt DTl_l8$m{&YESrPs*9%j/5F+-N^I3l30%I Yeiu2B2  5JJXW I\Sr*Ta*!2KD xV]Ib6 )IPSM b/S]num43f2K0! Y-%IMopM,lh]9@^eҩ2ُAbl] xCqCCHDJ쟽_Y)[<ņ3stPۉ^aw"H[Ib6f`&i!JֳZj0WX?P@-{2f7Y"i {%vCXPF[>, ^R-$fcf$mUӷ!tlL,-UUI`Ybb޴덈wI:(yAcP%uQ{ta D!) ށP8:H%!8 z1'ߍ.ύ fqﯯ#>l:fys0Kl|?d-ȵu9Xَw^tzwUoFDlMYY|1VeRJ7w ΫpDerкHڟ&TlKm0*A,7kRb|#d\~Aj^(c`y 2wÄ?>^>fYA{a -BF>>~?%oezt@⦅bz1;)eJ~H[2wY bˣ^2QoDVO \1+يz# R<j졊/2ׇItsa."8tpUxhLآy-ҭRw%tk=le66T3ghˬ& ZUѠ!zqfN*]b68Y3-IIkXb*N,ʱнʴ@ʴ=ɞRdܨLܚ$l,(C[LͮB+22keIY)?@ pQhdK.$m@.c74`/nF6,urͬb"R9)T*T1CDRlfv"ize<Ek;Ȕ b|ea6 eb[wî%\rPt'iXj.K ^jOYѥ.~~I[R<E.)`X!%خdK=Hڀ\Xub))ż(0RFVg6I208ϖ $mOmbB ^@ IIݐSb8T]ɡ;AB ^ꆆ '\ bD /kE)B 38 ޅXr5Fȣ\۵,uMJ2]ď.W<#m?B31sAIN+Y5?79景.#]+EnHz'\gkP1C&KɽkA+I #/laYa=a*ҚJN$!ӂI:`w}.9(&i)z [&a C,2Ef6Sqi%`Ib6 6H#+xyyXs@sҘUb(xy[LL59I_Ucsy_xC,Hڀ@_̆P~4Stn9+9Ǿ}shJVlHfDP5fIG-BTixdх4)Q2zȕ횬mr)<_DM{^¸fh&ip1洓ɚ"Z6wW8f<1)o/9(#i8&6|`LVmY)i9^v/E^ 5[hCJMԟW8MxTL $m0Iѓ -Vmҟ]JbMK+Y?l$i:~5^LNm=DgjF*wNY%3M ibQ/-I ڗ1_lu/fUܙWN歼l.=A'h%(3+5PT18 `^vv揢YZn(r 3 f&̜frMCX?t!isC۽U1_)kLe!E b ؉VI0/[tL+}N潆 3CX$pr7UZ\ -vmNld ы j5^ŲEFũMWd+eF,N%{oWiU$kLddjJ-fˢ^(`?6`R?Z{te&f}W T8#k؟^ri3S%OS ,LU|IDAT):.`kUUN*-JcYdA`i(]3w-8]723Ps5O61/I0WӰA^5^V5F99G4KژT1<<#H kHڀ"=^^kj%ԗ~^C9[9{8 q*I4a̖Kh:.4_\ٓtuDXTN؆, imiaHqjs!cIaaF2Wxh2v5mwT?_8[/IުvK vOOr)6_ņsVrPŘ=jJC4i@Ll3DP3 ID烪4,]pL|戽ͶƎL8MS8h .s;1fUUp~9}6 =QNdi6hL+O,7ů?fxct 6Ƹjm0IK>I#6{@:6NcPXbD$mZHmvж3-8mj*fyNG5A$IՑ޹H& mFb6$mEH# ZH..^$m Pmh w:6&ll$iT ;I[}b6_ #i+NIU䆶 e\ XaReh iIl?#Ir^T>8!iFp I[)bht$i#T4fj0 X)jULII*8Ld@bO1HҖ@ `I[bl;[]IO@Җ4+8J>RKҖ҄/ 'iG-1[ $%iL+kځIH6( I[nHڈNj@a>OMҖ@X:E'IM$m9\-.@dlI"JTp>%-H9;I#K?Hb H`N@dKH-7/;xy@jB76$oGHBHF;!03I`ª{z iI+v%i&{~$m"!ON6*3 J>RAvBF < Iۡ$IeHڎS&f+3-$mNE@.#Ȑꑴ3:J>R.CF)@:6h!i <@ I@ I@ I%D!i# P?)CvJ/JcKg`6a0Ev2IRl!i; Iфm 4HDF m1UUf|\m gtB6LH){I(KJ6( /I`öO`KIp+N򾖂;$mQHhr"lHDFPrG 8I[,㥌5l'i Gp՗~;E$OF;EIǤep<)g'i K 8I[\6$m% "d6H-:c$iK KؖN.$m9bUm$mП"@ҖF&E]H26ǚv@dddNAH -/la@R6rHR;@>KҖUW] P-1Y@6؞,&$mЋ-= )LbVd$i+By?)I[ 3Q@I[)Hؑ(LVp%-T>I*?@ I[Mq8%iϽ+Iʪ2,u $myq-`I@:DJ;KV_D*B }Iڦ N6 a  ]#i {RqR ۻw춑- [icπr(V|FcX<,/*^ T8_ĀOlU(t:_Avhm,iPLAitwuV{Aukit5-Z,^=m5S}}}=_M n}z_\Iw[yp٨gzbYխlE]R/ÞE}}}^z㯏, NSzt_npb6= ukV;F78rbn4:؋,&JUuup4uupuw7AhӶo9fsud1 .2Ɔut)Gqؚ-4^ͱvntMqklz]I+̢;s^]cQl ΢5HڶB\ݰ EkN ^UF nc]<4뢮[{:0:"u k-h󇴊R_gގ[MTk[uHht=$Gp{_|NuXmݽhG\.ֽvl=i5 vpFXY͞6ڕ\k9 + JbQ<:,cO ^bK67~K镲i 怍*L`Vus/ꀭ9`k,x,겧mMܹqknl}]t*sFkPzE]cQw^gQ0{qX&~zO~`۠nZW>_ XLj5(v΢;B=mdu^2=|{Ľ\.Df'wvkbuUvؠ:دntE4ͫ::YI֗:Mlo{t:Mu@kuculdQW>lI.V XEݒuX-\ cȎH4vLjcXcamVre~Kh)uc ՠ^msQ7=̢xE]l5:5 u=>mecnnBޘ^6rwWr,RE,&j1W݂cp2S\X˦u&V8uku%4:;z@=m5xdzȷO)|pa> vz-,9[M{`Gz'Rec>2=mc~URm{|9*6:뀗G&;k;K5OZ{{v t==%czk,~$ic!3el~ Ziu Tnw`R5I #l\;ؗrJy$mN^GwwJf(-ӭ֞3Gtѵ↶ne4yreOMfh޲[5q)@# !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6HH !i 6H \ n%IENDB`biopython-1.63/Doc/images/GD_sigils.png0000644000175000017500000004675612250104543017416 0ustar tratra00000000000000PNG  IHDRX z$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  @IDATxՕodoh# lcyL cL6Kχ9gL|44}O}3v0c dĢ}A+ڥZʌ%3^Dx8Edr}zI@,$P0'R Zj9?~\l"rKn?uյKxl!0߻N^^e&QvʆKK R! {L"s^z7婧:y9^=&b'ѥRTM q+f1긕Cioo'|W2W̚'`d˟!`;La{@ CB@TO!NI^! P`Hŧl'lA(0$Uu@@RW *p:  )+D~ LIt"?@& \|@vH  @R.>] `;$e{@ CB@TO!NI^! P`Hŧl'lA(0$Uu@@RW *p:  )+D~ LIt"?@& \|@vH  @R.>] `;$e{@ CB@TO!NI^! P`Hŧl'lA(0$Uu@@RW *p:  )+D~ LItZ&x`6"/1=q f/eEZTq[.c~̞@7BZ58Hb!JK&\pA5ѯiӧɿ˿;n[.M$a-2BFkN!U7Nb [,WbDҏcW~YVg,˼oI]$*7tSݓ ^ V; +͕d_X(s*uc%{Rul l9@@]H.vB  U @KIN@ @u X @6@R6T @.$U ;!@Hʆ* %ba' @IPr T],  )@ P `$eC@Rul l9@@]H.vB  U @KIN@ @u X @6@R6T @.$U ;!@Hʆ* %ba' @IPr T],  )@ P `$eC@Rul l9@@]H.vB  U @KIN@ @u 4%3g 폶}O:u\t)s=*ǎ˗/:U߿_rܹsΟ?xZ CaI/}Y]_oذW_}Uv!;wzKv%{5kӧk_zp^'Ny. K㨘^{5ٸq={n{ |hNN8eѢE%*M6jƎ+7pC((ɓ'CEgϞ-s̑)Sљe2rPFGiӦɭ^6wPD>Z*|\.k_Zxƍa @RRzKMg9wul۶- F*+W gB ,o-[,٭͛7>P8 oL0A.\sN{MUwwwx\cO<<@΢*~N?ܠ{G[bŗ_)fsRڒͶ*62h^B3eiIi>gc $KR&! @/g޾x@HJ,q!@ 6$! @ )H*)ą Tl  b@R""K\@MIFH@HJ,q!@ 6$! @ )H*)ą Tl  b@R""K\@MIFH@HJ,q!@ 6$! @ )H*)ą Tl  b@R""K\@MIFH@HJ,q!@ 6$! @ )-?.[n[nvw߮AWgG퍖[ZKdMz#D<ضmLd.X}Onu/4*ГT&|:j%E3XUʧVR5Gg.hHuBP 5WEUTAE#QE$غF:I!䇘k*"l]"`TzCQ!cQFR*wQ!cQ|BR*WQ! GC sI!KD7f8q2gpET1LRʾ`TscQ5Ǎ >oԵcf:埒*jwgA+Ǐ#.oˤH-;[e GKS˛$6j@$$@P [De'ђ%K& & 2D5LP9$y H/՗H2U2\j2˓h1 Q5S'RGN@PIv?J/@Rq!& &qYTi`(j(BGTp xqa0ИUL\n2%uO+?#2p/㼄 Dz3 Fx NI · os9 fCGz\#i,tJ5h@Ra7 dOIe_2  '@` @@R׀ @`Hj0 k@ 0$5vC@2~  @`0Hjfji VgdwLks2h2T&/ET E}e̶,3ҁH I)1y{QY4"A-Y@E&:g!({jA&JJ@TW#yڅ"4AD5T;cKd@ >+$@Th(1·&`*#X <$@TsW"<@ kIJ J-!vQ/62ϔ@Z?,]L_ |ӟ IHHfBtK\V $FHߚDc^K6}=JM?m2*ϟ~9ԴJbvVeB֯卲)nUy ŲquINTe)D$w@M_O׽_v|'& W  ^zL%AKde[2#,ĝj(.+=bƍW־'U7[vB# J*b8_TPn2So@ @P @ Q!J I3hhjSm2P`B@ (s,dT#U\@ Q*QCQTHjȲq ۰MTHjq 00$*$`80KAi*-BR*J@)V?IGݦ%{D> ֬$yڅB-|ɰ݃ːc *t<  )Cv MIt!;@& ]~:@nH B@R.? `7$ew}@ B?M׀ `3$esum\xݽe,w'>TK\%WJKE@krW͵+1)$UkZDeWI_,-KF2#"@REe}FTDgPʞzbXAQe_} Ƞ?$՟ {2"24cO˃@RhUTiqYqfJUJfTzi9H9n\0D0 s9|c9vX .\|Y/'Nq)㝝=xD5pM(7*"FA)%ۻwo( 6=n:ٱcܹST$k֬'O^/JZ.yBA9rDP6z,oFx~GGGxo[Q)nݺU֮]۷gؙK,7*"VAi'Qy9w\}ղhѢj6m ;V,Yҳ_|vճo֬Y2{lW<>W9۷OΝ3rp?q@$g+`-₠Ei'=[lvsșx6B/k:jii :t(hQq͟?gĉ\ J1cFxOoM6- #͓1cQg^3gUb*8=y$HT"]%AE5D#"f J{;&M$SL oE*ӧyue3)E?zmR*}ϟeBoc^-zvG(\T4tUD6))E塇 ?pŐZv vaԙի{~tFT,]4|IoizOo-^X{=Q᨜֯_3^_wu?!|Ke,X4@E岠"fytDOrmED9~lٲ%|G4(t?uSĨફrIo}_ o5*n޼Y6⭷*zn5:EE裏ٳj*YM`Y9o1py|\/78_2R֠`uIMIϽ/clGAv[f޾? I?I裏CH@U*R񫩶vczh(b@&8kZBǍMKJًޒ(  `@,ILX D x@HJ4@@Tȸ""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ"RЉ'd۶mr7T7/HߑmKΖdwmi ;. a_É ^u$gO ӟ)2LDҙ4j -X+?!eBsA 823"A͔fVPzۗq$0L BPfF21QTn230y\=sϭps깟{.% Lec 4o7c4QT$I,:ZJ.1"<>TRhӓiay'"%8RnV5+!`BPGЅʅ*ՇK A*>C" (^r-)@" ]\}ȭT3t!r!BP$Ѕʅ*݇I A*>C" (~r%)@" ]\b1I!AgBBӇ\H A*>C" (X>X/)@" ]\b`T3t!r샵BP$Ѕʅ*VJ A*>C" (X>X')@" ]\"}JR*DPAPE? T|.D@P.T>DA5Υ+Kդ/J sI!AgBBC_J A-GT\AXU2?T|.D@P.T> DȲe6x̢lˮyx f'ۆN%Dq7*M6ec#JU.Fب 0>wGO{$5m4я~sBR:`T |\}QM}?#_U^!:F/LV`r?%몯Hw"*`7A)':cOr*+V{2;!`;rVXf3BIٞi7V1S2rL6V6`EPC{BY2ٛ,V9&w?nvE& bp{GgQ,pEPVyFA5>5XHj0: T*>C"$(剤\U?T|.DMPI0 *>C"((劤\]_x lER.A/:Ѕ6 J")FYAgB #@}@P񋍠3t!B }@P 3t!B^ #}@P񋌠3t!B > FP!oRHʅpT" ]GA)w$s*~aT|.Dȫ=ra:*>C"YPI0 _P .(ra$:*>C" (ra4:*>C""(raD:*>C"$(raT*~T|.DpMPZ$qT! ]ࢠ.-.>@)?r9X`ei J-n] q qV/*`ei Jol4dA&{I%˗yR Vˮ '^ύշ"J,ϔ2hFHWwwڇhh_\_tY]ooS9+ϗqłN!}{8uKŷ%rO}xCc?/В.}'3AixOJ)8C@IB0%U4;F)& ^A :TPsy1ĿIgHK @PA)K$ˆ lDR.A*>C"&(e\Y_| lrER.A/<Ѕ J")FXAgB| `}@P 3t!RHʅV> FP!RHʅV> FP!/RHʅW> EFP!ORHʅQxT# ]7A)s$s*~qT|.Dȣ;ra9*>C"UPI0_T ,(ߔΞ=[vhӧO˥K琞_Uj*zNɓ~pBCΝ 9s&ܯqϟ?sc9@PK3t!B5hXR*ݻw׭oF֭;v? of|5k+"~i(|[۴ia/tuu#Gضmݻ7jT ]˼*5\# .R ~͌7Nn<:ٵ^+gϖɓ'֭[]t|rٳgOk_ZxEd߾}t|'ܿdeȑb QtManv[(I&Ikkk&yn*>C""(Ő3SN~r~*;wJ\Foh;v̛7gĉTtwQ٩dTDv ;vLf̘>>x`_<~L6-ܯmٲ%Ew,X Sgs7sT|*(VXEA/Ѕ. J1t ΢TӧΤy睞Ç:GTh.^(z(ҨQzn1BDo'͛7䦳(g_# \d}C=$/b(P3~aźgWy^@E/˷P6*;qℼ,^%[::ujeܹ2zhT*Mܒ쵓'@PK3t!Һ@z;O?=ނn:ә3gN('>ӭo[E$}"hٗ?}?IgFzoʔ)%*Y6UF57Ο?_tyjժUaM=Go1KwA~SyQ`- Bq9&hon1ѻkC/>>OkСCT "ē_s>&P!ogxEqe~."ORсl{R:sa $KR&! @/!?C""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ""M; 0$02.  H 4LI5 @ -H*-Ҵ@ @R #@HJ4@@Tȸ""M; 0$02. 6t ٱc,[v7-$p? #u7H)"p K]l!:v)'Nٳg:KR6lzJ֯_$G r?/i]Vetri2'ioo'|W.#_O[~Q79*GxY+/t 3pY.#L+0 D5 ͬN*gQ\D:e2W̚N-D.T$*=:]0E|-MU/<) $UG]FT ]T|/Q G<$ei""| QNdi23U>JQ'4GIcH*%DTY!pt&畟q9L\r$UJUo,v@Tvׇ'̤N$H, %4L _d,!LʚRdH$Jg  @$*b81GTd*IFT3lp/V:Ny*96rx7 "aL;%TM)ılDyd)|~D6QcJ gڲ #* \!;*HETn׷(=1ޘ%KEA5J,GcSeW-2X}y;ɈʙR#HJIlyx ]ɈʹC'UR#y]DŧS!)E2 d5*k力7rKS'RGN*ymQrI9Xs`QJ*!@RƑfAe?o#Ux")j*f]AT)¦ y.y QRI9Ps@-Џ$_;Te{ /?$bZ-JnDe[EO;p,_Trr1>OF%]"~챂H~/V6$`l8k V ={V%oM:U߉쀀i{d_}7-c/ o"/Z6W3T"+=M:l?ORmmmrʺ'& 69Z|@RCe % @Ra y%Z9FRטB`PjP<̘ʸ4, ,p P8HA9XT,*]PP8n $eK%)@P)#@> |ԉ,@RWXN@PN!)gKK p‚G">BC(W !҃rUf ,&R"PtA)f׌=rޘG ( g[\Ti @P %lTiJ GAC!J7\y >vk J2mIIIz!3/kkOYWy%n!T0Hݗ2p@TTi$eC1 zD$ 9#T~oiuQ0*jw (-¥`o@PtI%H+RJd[^< nGGRnח9H%AEY,=Um$Ճ#ZH!`1aGT $`  AP~D`(R [$(*"Q-*v,,*"Q-*nԕUJO"L,y)34 T.**)R]Dy= L*e"ɢ@PW:j:V(jr#vr'ˆʅ3 U&/jY^@Ryy;AA5_FD<<]T-ru_NDٳg+mtttvvժh|8q"9ytww.\гԩS~ttuuEGKmӧO}yxDױ@Z9҈K#5,)ݻe׮]@x㍺׮]+۷o;v5?/*']:$oݻW4ֳ>e͢?֭f͚?\~߄OW_ [.ܪ{9o8p@>Cy}i@P#*Lm8wӦMkF.\(n{w&LŋFE-^{̚5KꪞжmdʕeY|yx̙3[o E_ jƍo}Ks6l 퓉'ʹsk.]*y33f 䀫~ˊq ))}ݢ]TGtso=>gΜg̘1|J5v"IVޢS\}GEW*Q1"| J;YδTxz(qƉ UX 6W9?^tV+M=i@Pi_zhiHItFŋML)`}_zuO$<o[N{zfi*=%}C*+ןɟkδThov(.ߵ`̴iSNp6ݔ)SC:љ[z;Nci ݯ3!ݧt9czPeӼ6.*5>u֥况@ M݁!y&)9K/ކH}jN,nuJ/xyHz,FgHGy'z@trw'' #3 >-7)A@3bI 0\C~pb8 `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `2Mx `2@ `@Km'OΝ;eҥyrYީ-_//XYIA>A1 ?V62q)n2a5kVzIjSOnY8,dcMtHTJR<eU 3r[<k~=Qneឦӵvy'{5+g/f_I5XYIEZdke ^>nr$KI%Wou+JrBGQXH1V0<I8p(D: *=OH*Z!@[ @!$ ܾU_"|Ww]͐TU-mQYZ:i!:PR܅R5""*돠ʨ*#5,+HM:FTU-jQYT/SAPIe\ Dq,iQYR eO-4$eA=E D}T5K$*#5+ʎ`-#| Q UAP3nHjR:QfUzBPn%$ AT IxD|T㶀LzD؜ET A%dd$eX0МCT 3M*"JȜAT ̱L#Jr6UL\Agv$6&CTMs2D|AT첼IeIU=Q5^X83[@RTby ar4D5#ᳲL$ecU Q  ЅFPC3 $e{Q `GP$jQRЧT&y݃Z/FT9/ dщ.7u|j]U9ywNS?X]]gRZ$*)-֮M e!-r& FsēoxߔHq,IȖꧢXȣveKS+EURއ2S@ /Koe&e+w^~Ϥ*M6#*RM{"Q9˭CY-FgRY.I*NvEr=[De鴋j+*U6VQ!(kĐ1vBTv#l\jT.Jw!Tq[ۘBP7!)H GVٸ$*(ʦ]$ T[ETⶶ1D^%CkW`DeW=&ϢBPYlEROuD*nkˣ)ĐTjQUɓTVĎvuH5 D*nk˃'ĐTjjQUYT*QaWHʮz J(*epI=1$:rDTv#llj..fRmmc6 AY;<2K Ieޮ]*,E")jv*U6!eރʊ+MKElx_+^k-u]8O`OF$ Q{#'z!')S??;[X}3x\Mjrwƙ Y7-WcԥNkmHG6ɥS:e\/k={L{7ax?CIM=ν9X'B&k%+G+XY!/Jck dIDAT`;&ڽvy;,(KYn,-[&5~yO.L[P#g!(%3r4(|td4VI-uQE$@R4 AuUDmDIE$ EP,z."(5D`TA*ht6AE![$U1 X:]UPQ*"Q-*XT >@wmT6Hw T{Ubռ*Hs RwUBͼ *Ho PsU"yT5D(I9^oxٽ *&Hg5r tAE]FTbluFPn&*"I9Xc`Q蒫P [$X}cm; *‚"nCͣ|*XAEUDm?zF7'xÿ"4FEZ/JpyqН_.̑É-2ݛY2׿,UfNr@~]y6_5թ2Cs geEU^I% *;d,`k7 py,S.7"-q Tg0u&#ϐTN+rZ8i#@U}.y܋rX5â%2*O^"T<T Pjx`8|:}rCP})j1^l l7j9n6\l9 !0WhD_VW#]5LPQf$&BP ste,Ϥ! 7A5 αT2ETpM"*Jj̘*&@G.GPQ%Tt$e8ȜAPQ9N+H*="(@sA[8D.F[CRK|؜EP Qe}8"PJ0GP Qe֑@dRڏRmy3ʎ!*;Pc2pKCPvQU$Q=TF-kAYV/ATIeP t DP&%DU#ÇMIܹsuS>{lgΜG9yd^-ϟ8 Q˗{wҥXOS9]pA<Gs}N Z=s0 ar4#԰|׮]u3߹sgkʶmdǎ~zO?T nx~?|wޑW_}繞\fMx^ scƍ-[<>#Q#Gȯ~+Qnݺ\s A5T WpWqtttȬYdR.tV&L /+T.w ׊\uU/z=Z6o,ǎ *>LtMHIZ 2ydQL>=,\0Զ-[n̙?>M6 0GOGP,l$g*?Cʒ+V=8nóE|ԨQR*o ͝;7|Q_tixG-cǎ~P::CG鹭wQ6mZx[[[{ٳgI0U>*kFF7mC|p©]'NȤIzftwqG8RFrkNZ{#aar$#l7>}֟{N?~eƌy^(jryz~tw뮻EoVF`Tz;OgC[n gP\StQ}}_k=T6:cy:+m褋/ulkk CRmt%ʍF)KDY?#fy* pCEzꞟy=%.TE3%=Ig+ }Kgdƍ }{;SnPZzLՙ3*]֤b\reEsW۷/ήTRt6mfni ! 5HExqv=*vjEeI@`Pm1Dȑ#?xϜ93әW*Q Jolfbz BgX:suِoPZ*/;_j,jN*WpL3&}2*3SX3/袃wGˏD(>g!9(т\)l%-Ke|#K, _k#ylks{=`zNeT0, f脢OR}O칚Og9:[d`p  0\$5F8 2&IENDB`biopython-1.63/Doc/images/smcra.png0000644000175000017500000004255612250104543016651 0ustar tratra00000000000000PNG  IHDRzF pHYsHHFk>DIDATxݿJbq:7-.6bUxނpF[\Tt`NM@W+0?$GGCp9:C~ %RYԭXF@f/eЏ@H^+BlsyWwñœ+E![ ](}MpqP斞:׳n<-=NKP{=Ź:<ͺ*hԢ/ oS#j߬ɘ0k?ycwՇ7+\2@be'u.eP{ZF= }Os6]y'8؁j}|Þ 'G(aP{a|y2 z>{&,=_'G(_=o= wy< z^{&,^ܥq|j8y9q_(ݰ#'G^P>]l3avN=P9_}JOCCP~_= `?TCk%~i,5',~u׏GOYx 6        ٨ 6l0HHHHHHHHH^dq 陰PiQp 8r@@@@@@@@@@/Q Q9.== m>          ٸELX(q(HHHHHHHHHH8|@@@@@@@@@@@/Q Q9.== m>          hv\{z&,@8|@@@@@@@@@@s7*#똋ƺ/e߻*eܾw]F˨wMpڸ:}wFV*b e]F2]Fhy{QE M[#Ij = = R JRk{Q}2D(w.eT߻:e8m`}E%Dz@z@z@z   ٨0ٚAz@z@z@z@z@z@z_ȢH>Jz-lznEQ:.lz& =@tHHO"ODzgN\ $D E'zd*-"= "= /DzH!=@?|!@zHgo?>ew+!ʪ^@zO/v~o>q&$HԎ#҃}"=cz0S{{Μ>1=9B[zEzt_4eݶ0%ںߺ[}%Z]꯺yYٴB yͶR+!JhoBn5/ſ^{~%x_*Ć$Μa"Cz z~`؃uO0A\HOҺAO, {Hn#4 {H|r#?{eL"ozGͩSԠGcLDzfS=Dg.=1/b2!=sAI`3obLBzf2>= {IH6 HO< =#=Iݿe߇ғ˲߆ғ_fٟғkֹW'qgs{|EzU)b[c9G7,;FSUnu)W[|mqӑ,-3.`:3_Mi)3.`:3_eG/3.`23o1f =3.`3[??\)HG|K =|| ukf\ I:3.DfO^bƅl6=4=:~w2-V@z%Z￾q0ąl%q!=Z3G\HO-Ć$le1BlHOƱ-Ć/-`23_?bLFzG;;|8yZw7=fu{_3>Aϴx3.[tLJq1f =>gQ0f =>I{o3/Ǯ=̷HL-`2wpЏ ;!!"=~l؉>JzHlQʲr! lz&H1=ńu@*_HϣI)'|hRFzMJO3_5hRzu@*_H#҃͋]#=H6/u<"=ؼ5`6{ zGzLO-(.Kb[E鸄S,~TٳfTq# BoQg Fzwcz԰LzoCz='۶SWx6t?m+Iz'T>aPnR~W\4F[|Ez}MI}{J\׹IOszmIy5=KF=#ʤF<┙/Du.&=KYg>.ba}DAzFڷ'9_#9ˤG=7uk;eBaĿK"gz[s6Wd-`mku[ZZ7ã3)"_:9+U[/Էm\-AkW?Ʃ^\S(RaMjHDzDy1=meSxPQiwfԶסL-Ak瑝yaW=~S584g}U׃_H#R͋]#=H6/u<"=ؼ5`JPH#,<"=^l ꌟnH3%=H#=H8(zH"=<GD<"=Hϓ?_?\=c"AzOc&Ǎc=)p;=evv=#{g1VzZƒh_ȢH;=@46{(qDz%ғ:҃(m6= :'uQ"=#=IAHOHDzRGz%ғ:҃(ԑDiRL@zLFz`ƭ(J%qBz`?!=,f!=~H0 Cz>JzD JMR8"=f3CzRGz%ғ:҃(ԑD J'uQ"=#=IAJPH,w"'~ }-zj%:=,1}G,/yD׮V]wk#=|mY1H陏x[m{ɲSH:!<3="=w,f\;Dz#=2<=ƵCCznr:de>WIH֪WKXlTǃwҐ8 }OOexRzqw[f .Ta|m3czZ9bKxLzz^rMzj!\~=KOv?{Y%=7=z~+ RށT㌋.}ML04Lb;vTZsT}SY0'_8"2.낃YuoGtזUꑍ3Ka *;>6.$=^5.[GQom~hשּׂY_O7n6I+kg=ENZsW^vN?DyNi)w#[ӏPrf8H$|SUn m;^آ~E^tn꣕1D*=^/W._ս~"8Oݝhjju31[Euͭ;{ߚ ݚ:i#r5|k>GnszwJoo&\ըG-\fnv[]L޼¥;7PB֯_J6앖9պj5>VaeEf5ɇHeTp֩\m㾙>ոLh˺KnCf̥ Cz~'cӨߜw+'i8+3!kar7(~Ǐq|.=6ce7qχ7㐞1)Fo祵fݞˋ1]n)=rA.<ntR_ )w9w¤2WT1 5g\W>u}s^ZTױ="\G=aV<cc-AJw^jsv4Uy0[meNMԆ* %gG3ޢ"Wht*Z\Z]`ΛNO=kqF=긌z􈭹{0کfV~QTUuFok㭏ecku)yf Vn\\rH5ew7VzWw}Ro=bl1ХΪQKͬ n6ό:|+61%SÉoo^Iqkj{6t0^tcU"=n:L*g)kIzܟm$& U|?=fX$S|Dzn)fyow?W慓vEғ$ymM'5g>{zHOrH| ov}oI 陏2!=HOjH|os+ ޤ IMqwEzRCz߇F"{7]w],9}xx>|W+9bq+_#'7aqx{}/G~qw*;Y|~ᴺ҃-=|W,ax>|W,o:E:!=!=;cχ ="=gi?~ ~B߷G"=gMx>|Wlngeg_|9H߇BzZTYNϿeoC߇]lz@zHgݝp Klz&H1=!w׫ve,$;4bOHO>I!>Ч[cƵғ6u0=铭1ZI9ÞO,;\q$Mz;ÞY&jf\k"=IOϰ.7Q̸VCzRO k=\i;˝i]'e,={A<̰5Rx }Wvc驅#B{W1 ݌fӳG]A:ÞfebƵ"ғ.} ? {3-f\k"=҃}0=,f\!=2R˰qÌk='Ufc{ʰ57̸VCzR՟Tð5{u}Hp,$g{gHg㌅D gy72y9+!=i=g0ye!] I6 {^V9qjHOA~ {^eYVLX7|Űk|k5'E֠6kcBzRNO^y4Np^gғOf~,=Y^EIV9&nO3 LAՙ?52"=mlnB9h.(NBo\g3'Q}M]j"Bo䒪^.D?e_2Wwȳ /7bϷ>=ewpMo"wlz8|V'1l Wۧغ~8!Y]|S̍ndw1 *^3a^^}{ ;n[_軐ml~Y9&bE>D]ZlM 5oU|ɕ@gwuR YCq02>%=v{6.'uMդ0~󛣮BN}tIYX9.)˅8ߚ.IFpڹiVzBbɲ2Mz.b7}z5 *0~Y.ҕb#O/( :=67{|pχ|BԥëfУ|6MG粗_Uϴ\ h&Vo?Ug=ғ$sKݒoC1~A:=7k"럪ӰFE%x#*k6%n^~;3+v;tq{"=Q"=~RHAF>.=qpϬ}҅P_sS+OGS s~:v}wDI!=go)l┫yhqW~Aj\֨xTĘ(sm5w344VT;uQR][[3까HOHNC?=_\W?m3x[+=ɕ0zdNm'&9UvYZ9._jNNE.^3ߗDxzf'n($Ȍ#r!̔lL*̰㵺Cv7Q]E=G}Y];;nG;=w=ߪC=fB?1͒I#=$.WU7o!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7KCzܐſYr,͒!=nH,IIϺ,I鞴!=k$=~HR%3?=9FzD)5!=RkCz0 JaA_8|A_H҃(ſ?Q #=~HFzD)5!=RkCz0 JaA_H҃(ſ?Q {qj!dH~f~Ұ7K'j~' ˋ$=^,=?iXA%Rf3n+sݗfIz\#eoLJiȱY#eoG)ӓ7SoVě1ZſY'Րr.(͒x-e;1r,Inu3.u3.,(͒)<ru<ȁ`ƅſYr|zsZſYԆ3O,Il}rK͆≮7K3ېS]o6Ō ˉ$=s& oaƅĿYAˤ:3.,&͒eyʌz+!3.,&͒d%pʌ*3.,&͒d1a=iwo>: 9MpfIzfʳ6|sv$]jofIzfk]޺2,ILvC^JM|4.͒u?}uw]v`1og.%.fIz3mo)[XN%mxy}|˺6-,'͒ϸ&^1-,'͒ϸ^̌fIz333ZU~HVw+ 92ybFK2 tC-V%[ǒ,I5pX8YfIz<|[FK̷7KAN.3ޝsP7cĿY%1zf̷7KC]f^nf̷7KCθ^8$=Z-f]B8fȬ3;/͒ xeW; fIzЏI@ KϹos_'!^o>M)-$4+͒hs{wNOFziDƓxſmvzIIC_HFz0ң$%5hI #=AR_HFz0ң$%5h3S6!^a> }|g^']ǁ:Ɠxſ\ G7#=Sky|cz>~>h%<9篳lfIzprBRWRk.8כeE\>=ټnOK.;Z@1Ys^ſY~Kz{߶9+Dvpyi]*5¾Dz,ҳ!􇣷Mno3퐞ZLuw2;5!=H_-o6nJ!=G%:WS+bV~^!=ixY]$?X /|Q#OY4=~9W~ġn #5<>!=(;ȑQ^mR52Zܬ_U+0e#שJkGN ^ccGiz>bq([ˆ #=̓Nf,3z$ʳNJ}IO~?XV0_^ܿZjڂ6Iz [Gc>*i uzZXuq5>c1ga߿ǿb,Edr}/Fz7>x9oA?x'˃haңF([PI;=ݖ60R>\>!NI6=s\GN}&n篗zH'=~MOoG>Z{N붹|scCTZ)EQsRT'OE k[K3&,_\ڹqGʻV6r9M+{>݉?)G}B>3j)3.'"+jg=Zs3\Ou^IūWp'WɿʗQݯwzv'r #/?EZCnЄ un@2'yqq:2{6?swDľ!N>#|M$8֤GͺȌ"qOt׻ɽrGлU=bR9ɥrgEU*vNب{~ַ ғqոG߃./69^CZn4CT3^̥_0̮zkr8e[X3_E-n'\TT [%R-S34ɚe^ˋC;J+Cz.ӿu =K<==gKn&4yoT{JO/իYoV{y;HO;v?$i|ͳkݪfO'_\鉺rx=ڋ?N3H][z$CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ RzYkZg?ɤGu<'pyJ&=jP!=S(陊@!=~HT Cz"=PH3BzHLEz?g*!=S(陊@yY|Dz"=P8|陊U CzbՂBzX?g*V-(陊U CzbՂBzX?g*V-(陊U CzbՂ~HT !=S(陊@!=~HT Cz"=PH3BzHLEz?g*!=S(陊@!=~HT !=SjA!=~HTZPH3LŪ!=SjA!=~HTZPH3LŪqLO%`Y ?FZ =H ZxZ*]\*u"~C CzYHBz`?!=,f!=~H0 CzY^nH0 !=,f!=~H0 CzYHBz`?!=,f!=~H0 p!=,?!=,f!=~H0 CzYHBz`?Ezj!T\`CzYHBz`?!=,f!=~H0 CzYH"=(CߵM =,>?!=,f!=~H0 CzYHBz`?ɲr?zi.ck Ąx), rʲnpeM; DPI9}^% C%a8srLLJJ1,CD8 gȌ .;p].̸ F23N.̧ky8Q0Fg>=.;|Bc /S 1GܓjMe:]bᣳÝOÙ~F)Q|q#3̰/0"=sݲ,_Ό1g.egf\uȲpf1Fg&+)o3mϼ[ 0HLvRp,;@HLvR gQv@HLw!=D/T;D߲'\„ xGg3nf35y;Q̷μMʘ([z Ř([6 g5&0 =ÙOG.`Dzf3* g3 ̧3ig>=([xPÙIQb8˃θ$E&`ur8#>K]&`#=>LyƵ-`Dz|\TR+>!=>jǤN#`GHspS?~? =w y/\fr̲8]̝vሮdkzHpV M5=V9 H(Ez#=HsXy"=ϑ`Q9,<%=M.?XL~%\ ynLO3\P bԕW󛾰n7$== Ez#=HsXy"=ϑ`Q9,|X.{J[n5Ⱦ\]]h}ҫۋ.]$f*w7ŋ)))r ֮] 6h֬Y#F]v˧P(ʴ}LL 0b,GQ<==qET^]c/6Ⱦ EOÜ9s-q֮]qY̙3׮]{'Zh!퍱cǢm۶0`n߾  ݫnh^Ê3z\;-ggg#22 *ӹBo9+h4Xhݻ?ObذaZ*j5>CDEEx)B?]BV|MN>* 5jĉ)cǎ:u@T})4[ ;w.PJ?.t(J>|Ç50{_z5Vѭ[7 BBBCTbڵŋU\V*iԨQjhڴ)T*6m3giժUpssիիWm߇Rď?(/Fnݺ%֭^󎉉 [[[N:_",j!""ڵZVŘ1cZd?~Ϟ=àA87 ,о}{⧟~t:t/^Ć ~( o^,,8իcԨQx".^M{aÆǏG닽{}dd$v 777;v !!!رcS~\x/rZ~=BCC1{l;w=7ob7qD[8z(ƍ =;v`„ :t(N8ooo ><ѰaCqzϿ1zꥷܻwoDEE9:tWo]ݡRp…WQOOOFPP._R=K.z/?Pp |zۼ\m"99QQQiӦ!66Ǎ73xyyBN:swwϻuS]ڥKXZZHHH'|~ӧ}6 ϟ GFУGqT+""Ra5kl۶ GS8:uiqE:NV7YÇ#==ӃT"z HHH# 11ZvZQYOgϞ}bb"burg̘1 Ž;{%ZjZoYTBx Umraݡjxxx M4UZegbb={VGT^\_?_o³gp qUVxfffz㑐P~ڵ nnne-ћk8{,t:>>}Z`8?e_` nogg8uyyyHHH]rQiiiz SLAtt4bcc1w\,]TBʿ}( izZyyy!<<*_P` ^/55jT̵k֭[+WnݺիW߇M2/_hP(?/22#G,IJJ±c8zE ,Wӧnݺ<L9rDo̬L"z}qzP/jӦM9rhݺrrrJ<~5i|'O,r{L87{-J[rQ/t mܹs0Hպuk=zTu<~mhLسgP~}+ wލwe޸q#bcc˔I&?>Ͷm۰rJlڴ 4kShٲ%nݺf͚WF3߿,}JҥKz*֬Yt?~\TV^za…h4Xd 0i$q_8z(tJwwwXYYy;w-[Çg޽g̘֭[cذa0m4 777(J_={ Dǎq>|Xo/Z|x׵k0eʔRƅǐ!C.]য়~®])yyy/-+mڴƍѷo_ɓ' fΜ)Smڴsb ,[LS}^^^:uX[r%ѤI"$%%gϞ}>T*jԨ'"33SlwqqAHH~z(J]V\xbJ}@FP߿?RRR;wM4JBӦMqQ*oZ666;v,t:]ka͛:u̙3hԨ,--ѡC<~CΝVӧO{n4j氲gAAAlmmѧOb+Go(8իcԨQx".^M|}}pB=aaaXnLLL ӧOcX~=oߎ7obر6YYYqI,]ǏG:uy_~ ___9s?vdנe˖8uTQ ߷O?tBFF`gg'ٳG\߾}{G\τۋ={Zh Bu 666b0~xVZ Bnn`gg'lذAsqq6mw)SNNN zKt⺓'O LP={['^^^z}ܹsB!/ 6 Bn߾-( ԩSz_۷ >C?,,t:ɓ'B~gq}akx-APv*2Wv5jUV Bvv qFATe4i"  ,{_`ʌ#XD {{### +++TRxݻW}_p}[׽{wT*?dDEE!&&'MXܿ7ngUq :uꤷ^nݺ鍒x{{ҲTϥK.%z…bw}W\~뭷|~m ӤI$$$aaaHKKk:N䉸ĉRPJqߑ3g@R_~nBE\\磯yycǎ|2L#++cU6, DtJ=.]H8::xMqpp[gbb{{{$&&xGS"<<0M4UZKV8NnnTpBQhqYX"/|q}| 4pt 0`o/U|Gpvv޽{O?>;UB,W(/fx)~WTRE-_ ƛ6mӧѶm[TZ P"~!8::={IIIصkXn$vvvhC<$$$?mڴADDlmmkbGJO>['BOiJGѣ222pqaرطo'n^ő#GVsNPzqD8UVE||<-J ]őÇcHNNZe˖$$$zꯜȘp<<Rлwo 8+l֬#wE.p;wL}퍌Ԟ7~wԪUK5k 6,5>3tܹ͛7ZyG ӧOǓ'Ow^^^033È#0qDܿ-UAь3кuk 6 >>>xM^z1—_~[,ڴi]l/NqaƍO0abyQ|}RopetZÎ;KrW^'Yf|2>3t˖-ôi0m4q? ߿LTY(Ҽm%[ׯիWRΜ9vd燧OX U, $;; 4ʕ+C8 ܽ{AAAt%Oll,q%ԫWO8D ,"*1c7oڢk׮Xt)FDTa""""20^^ `jjӻy$ J 88.\;wp,\PXDDDFV%yfL2j:u*6m$w,"""%&&ѣGhܸ>DJJɈ ,# @KvDU9F.z.FmYzMDD`9;;;Ԯ]QQQׯٹ@fӦMիW9%$""2.,*SSSZ 񈏏NJ+T_lٲ^˛xMs WHPz@Z#UEfbENnKKKs""ʃq!Jzz:ADDF`E;HrG "8p1 R@D]vaܸqr ""X`I,++ OظK^n<>ظpPB=z?n޽޽Lظ>XrwwG@@[oCP(AğxpD|DD$ƅ#X;qo.kڵܱHB]B6l\]]ѿbXlшHBHj/ IDAT"#n޼;"66Vd4|`I(//Owyyyy2%"""KBC )0rJ 2DDϩS@DDdp"4:? ϣVZpvvÇ#igΜ1e;w.d݋}T8Eh\X`ط~[6 }aHΓ{ڴiꫯd96QE˸"'kv|җ +++cUrdX,Hē*Ǐf͚rǐ`D<>ظSDDDD*pP"ѨZ*}J*"wBqxH>샍 , lڴ G ۇ>}:nZ&"`K 4ŋ#F 889`8to4JDDzXPHKKC^^,,,SSS@VVU$SēH>샍 /r9@TR,rssFDDD\]]#gڢQF 9b(#XZZ̘1ƍcr ""* , xzzήж.]ǧZj7o tA-99-jԨ2@DDT(Ӓ7וg"//:tM[V-̙3'O͛7&LD<~7₡COJO?7oބ7&&& Cƍ˴yܹsaooӧOUV ɓ8{l'X>ظpP:u*xSN}cܾ}z_^v"""%v%޽JZv޼yYk755{n峲BJJJډH:,$fii F#.j &QJj/ʋpkg%"&w  , #V{6Oݽ{ժU+> raff(ׯQFj/… ˜7!!!2!C5Xխ[Wl{,XP}"33999CVVaii 88鈉1j((OVpCPP޺HII/= ?f+e |X8pu&~'ᛂ'7|XP*ŠA0j(4mTH“H>샍 %6n܈ރ'֬YdQ94x?[l-[FBvdNY=ɇ}qj׮ٳg޽{8tt:v*wJk˖-x1qK/`&!!嘨t*˻M6aȑr "SYʂ#X("W +""GHwODDal\8EDDDd`,ۿ?AD 66VDbE^޽qIcQ >r *"Qe?w\?U66,$W\AVVNP`Μ92*On ""^^^r J}q1;14imooojP)"""CqUrG){""`‹%dccWWWcQ9c%S"((H*NX:u=zKKKى ~V"Oɇ}qEe˖Q(各ڷo/|Q(ͱc17NJH %%z;;;$&&ʐx&"`‹ك@DDDJe?ߡ,HDDDTX`I -Z@dd8P(`kk 9x 8OD$ƅ#X)p( Fի5k&cB"""/rAPvma߾}033ý{NdS޽;ЦMqpB9rGŤIpS_OLL {KJJ5Ta6.,$dcc" +++ɐҜ:Y&"24XƅSV8СCVU*^+""񯥄V^~kƟ˗/ccǎ9%%Çɓ'^:zիP&"`D<>ظpPBϞ=W_}+W ++K\P(piX`IhHMMaii)W(2""""qPBjO샍 o !WWW*JDDT8%oǜ9s,S|XR*  T(-4%MD$ƅKӃDDD*wŅ ^񁫫+j5\]]_|}ݻFZZߏCa˖-ڇNϟڵk㧟~BnaÆa„ HLLǏ ...:t(NٻwH"KB;wFǎ1m4TZHNNFÆ ~ [[[,[ vvv8}4ZjX`N333q4iFƍv\~pbۉH,$VѣGy QFf͚9r$RSS䳲BJJ NDDD5X샍 2Mzz:-ZTN>X:ugϞر#ammdܺu gΜ1bD8E(bڵ8x G^YƄ4|X@bb"RS,DDal\x T*j֬Y+"zs\zUDT`>ظpX` ,""""c%p,^'N(ƛ7^.hڴ)n޼N:aǎ077h4Ȝ ^`ID$ƅ#X ?ݻHLLD=)w4"""*ZFZZO>8tU,"">ظpK666xlnn{}dLGDDDRc%///޽[o+++dddȔ%4h Ю]VOɇ}qaE"DDal\8E(dcP4jꫯdNGDDDR3;1/<ܺu ĉrJcD8E(GGG\| W^Eƍ샍 ,&"`)B EλvB޽ѫW/l۶MTDDDT^X`IVZ7n/j׮ '''L0uYDD$NJ@ш'ヒ%Kk׮SNa񈎎3b8r+=ɇ}qaUΒV+wxrQiڵ ;al\X`'7|^%L<ݻwƍA-ZݻwHJ, 6 ׮]C.]p14n9999r$6oތd;vL$55sҥKBdtXǭ[G 񰳳CRR,wxrSibXxQ `)B dggbVVVZ2oprrF=Ǐx~ۇCBOo%͛Yfb%͛Ǐ/4hP`ʕ_~燻w"%%0yd@pp0.\;w ::Xpؒډ^JBpp1*,XXv-\>} ;;'Nu`nnYfSz`nnC^^z-͛1eCbԩشiؒډx V9IOOǵk2?~ѢEXp!RSSѻwoٳϞ=CժU/aÆׯI&HJJN+]DDal\8UN,--ѪUW*`HNNƽ{L<iii_ו/Zj'"""i B>}`fff}שSf°a0o< -bQhm/̌3ğmDD\XXAa%#G… /0d5 ۿNC*U`kkڵk#**Jo Y,Jj/ו*Q^~"c24NJ@RXv-ѴiSh6l(\ZZv؁t۷1| 0%K >>O>Œ%K0j(%󑙙)w ""Y"w h4Bزe lقx[l)վGիΆ=  :&MΝ;C ˡT>Kj/$C9s&P(B`l\X`I+_^^N<͛7c2$+On""6.,$PTU&"`k$pM#X`IĤ롈8FBnjSΉ<@*UpmqΟ?uϟ;#XmΝ;c͚5rG"""rKb'NѣG#G"++KHd#U( ֟>}nܸ!~ME{ɇ}q ;Aj׮xxx{ڈGdC8;;{"9?[;`Iرc?~|mǏGttt9'"X\1b%K[n_u9'""")B !..rrrPZ5$&&ʐx&"`, Z\)t:]9'"zs赱 ~Bۮ\rND;w.M&w "KÇرc>66cǎLɈ .ė_~)w "Wk$O?B۶m8gϞؾ};ʊWr*  44T(D}qa%sĉtvHظ"On0{l,[L(Dbl\*< \h[Ϟ=rrNDRX`BDTj,$uV̛7ж@|嚇MR`̙3G(@D$4 RRR mEˉ&1uTc`, y3ќ B7ԩSsNc%ШQ#>|жcǎq圈ȸ 4HDD*\L:#FR,>|cƌƍHDDD5XYv-ON{{{$$$/رcW(ɇ}qa%㏈VEVhU$ڻw/+w >ظ"OnzX'N;+cl\X`عsP(mJlxrӛn…1c1^ `ڷo_̙3)Ҝ= RNF!88Ud, ,&c "88X(De>ظ>XDdT,--1m4̜9S(DT*g ;F&w22֘6mf͚%w"8EX233aii<i26Xt)BT"ƅ='' ,`ETN)CX011A-`aaQ-77ϟGnn ɊǓH>샍 , c͚5رc6Nl c}qEh۶- m311yfddnݺP*_CBOodv2,Wӑ)w "X`I`Æ 7n\mUTٳg˼9sIڮ`\pwAtt4ñpRzӧOGZZZ*Xo+Wرc>޼y3L{{{hZL:6m*u;zU E@@," ,ܹt:3k֬ћJLLģGиqcq>|ۉ*+W" ӅD$X2X`A]t)7n\ອTZYYYRRRJl'V\ t:2;@etƍRmw=YW^-Ж_,8͑_Ti4FQE1c7KfڵQXSL%KBPXXˆ""" x~Y&mۆڵk#**Jl~:"`qEryMlHHi8E(p,^'N(жhѢRcATTqFk,Yx),YQF/Jテ/6m7oSNرc<{Ξ= ooo^V:&M/2d/_.+&wDDal\X`I˗/Gnc011Çaaaxr=ݘ1cA`KjZ,|'ġCPZ5XD,`k$`ccOػw/,--GU!$3f V^-w "zvޭ {쁕222dJFD_믿;8E(8յ@[NN.\vڕpxYf!88XT 6.,Hēp&L+.!6.-$ _/mԨ<==W_ɜ_>sfDD%%_"22yyyu<'Baʕr$2X~=FիWB8DTqP|2A ^ƍ"##1x`o2,D%u `KVVV+sa On1b6lSSN6.K:0l0,vDo͛7cܸqr Zl)NYFɓhذ% a#Q)rCI 4"##{d>ظ"On""6."_k.z¶mdJEDR{a%Zj?oܸ]60a„eћnݺXj148bɒ%ڵ+ԩS?~XDD}q $uV*U ##* X`Iǖ-[ 6͛7Ѽys@DDի'g<"""YRRrrrjR>ظSƦBWD$]"77WDTNX`I %%'OFݱqFaРA@-xJ'K IDATa%/aaahРBCC1tPS&L wD"A~/'"k$`oo[n=agg$899!99YpH>샍 G$ ;;;ϋ-XYYj5 ""2r,$мys srrrJԯ__DDD$!NJ֭[8p ~7| E֭q}XXX`Ϟ=?!w8}1`l\X`'7<-[/R$3ƅzAO>033;N&"`KC^^ QFCX%MD$ƅ"JǏvZDGGiӦhѢ6l؀8%FWH=x[l-[~a˖-2&,=ɇ}qV9pqqyp}ݻrG"""" qK/`)H>샍 G$pM#X`IĤ;wS""" , 899a)}̘1圈 , TRW\A۶m_ , [.<==qWannF#{?ZZ~~~-u; ,XXX`۶mGΝf͚WڏB̙3"kذ .Ν;Fxx8.\Xv"""2<X8q"=@9YYYeGqݼy3L{{{hZL:6m*u; rЮ];\| }X,8FN+03fwћn*_aaa ;I _yyy;;;Ԯ]QQQׯ_X@2^Of œ9sAeؐӐ2:i{BӧO~t|2VXѣG>>>Xd tAd5Dd̙"Ξ=[ ڵkWdnܸ888gφBt:L4I!C`P*j9 >ظ"On""6."ӧOq!}EDDDm$tiԭ[~-~W=,zw23 3 m7D:*^5fe[;0Wif[Mv<^Rjh7@{#Wa<ض<`2"{1b p{=[hr*СC1j( 99۶mCddI=gˊf͚+V50/bȀdRk4o*fV5~{""R`Zѣѯ_?; w"""]3dddGBB еkWS#"""+ w+ŠA>YfY/ZQ۶m_ 00& ());222N&"R`3XVt5ZLj(..V)#"?oɒ%j@"???ڵb޽{RFDDN w+Zt)FѣG3gM6Y`Yш#B"88n1tPS#"""+ wRp%z""""gUj~F~JX`ճ{cHDDal[8 Sډwwwc˖-|j;=8::}8si5zJT1XV`0lݺطo~aL<cǎNS;JxH=m ,+(/*JLLDLL 6n܈,dee]ظ>ض r%%%صk YՎi:qwv'-ePq_k׮pqq'֯_“O> WWWxxx`ҥ'QZΝ;u}_5fΜ?=z@vv6]x琙4\v }􁯯/~:ʼnauDw>JEQ^^f3ك^z-[ݻwc߾}D߄ yf +`l[x >7oDxx8L&f3A8qбcGh#GDZZPTT]*wPkWDM ,+x-]TTcǎرch4x뼮Llق#%%@nn.XEH=m `5saΝh4yEa…ja5m `YAhh(֮] ի%WVDDT bjAT'seeDDMdӨwm ,+ƍ~ddd@#((&L_ӫ75/2V\v}maE 6n""-D8y$JKKN[oCX`YA0K. BѡC$''ݽij@DD^"a3f 씻 PPPV3*4zXVPjٲ%Μ9777@ff&>dddbظ>ضiZɄ"3""""kce?233qy% WWW#"""kW;[g+TIIIx:%"""j@E ^'"R`3XVP\\ ;;;h4e?}vh41*gHDDD1XVгgO>}C"11/^Đ!CrDDDdMDhFnk111۷/xꩧfUi""-,e˖HJJ3qu TʮzlDDal[x  ñ~z%i&jFDDD g 33ÇǕ+W;w;vT9퉈H=m ,+)--Ν;~ddd@#((=FUH=m ,Rq}m,+ضm NT FL>?Q CTX`Y3|<֭[(@Dt3W; 1eTlذ6l+Wcʔ)ׯYVDt/;vzYCcl[X`YA ..111ضmUʮzlDt۳gz!oTU`U܀ 7zW_}xc, )퉈H=m `YIVV97oV:tHG={֬YcW)3"""j,^?ض"J F5j<6n"'Obذar3f`ӦMxЦM`xꩧꊕ+WXrکQkӦ m69Rt aǎR]|Æ O?W^U1oODDal[X`Y`͛7-^\\ ɤض!Q=cEDDDTX`3XDDDDQ=cE6#..N?6P`E6wlM=oWWSm""""g|;)4)l;N6l""KDDDDQ=cu}6f̘777!** %%%jXv-zf͚!$$"'|ҥK*0i$A+Wsaf̘ooo f=iiij?~񕟟mBn) ''' /4m/]v <==~z z}]*IB Hn$==]_.]vŋ//Rf̘!!!! &HxxJbbiF6o\xC͕e˖IJJ9rDflڴlCBBȍ7d2fiLK/$V[ChѢjMav)r1ʒ_UDF(00PVX?=M6+G^BXp_;77WСCʴKJ~Wرcg& ׮]03g~4ҩS'ٵkh4:򏌌_xS؆=zTY5v|]?a|.]ҥKV1%$$RuFPPΝ;d7ހ Zjш˗z4㫸SNźuLo* ٌv7Pm ې'N -- ;vD-0rH5v!Cu't:2M@o^wmq5LOOOLe> r S!O~qqq0uʱ1mCEpppkOc88ׯSN?ĉ'})--P{n i8[nd@tt4&NhqjS"5pqr˒%KNKQ\\,kI߾}@ E[]*o(>+6,""r9 iӦHǏW~~\zUy}hիRXXٺuG.Ƽ ˖-=zȍ7$//OF-}Dʎ{VXQSX۷ol6l()))Q;-… EXא%ƍ(ZioIIIhyWyط!77WBCCd2Nooo={Rv4k޽ih t:EIiiiچy]\\\dᒖ&" ̞=.抚'uǞ`3XDDDDQ=cEDDDTX`Qܹ3:]1.)) V[dd$-ZTm|߾} 7شii4:vBxx򷟟߯Z>Z.]RkCw5E'5ӧOW۹|0`f3z=qQ%|r jm6eLL<-[hă>beVXǫjCJJ x fbذaJlƍX>Po̙3ѲeKt:͛+˻X{1xxx@ףUV2e L4N(~w% '''u/J|ƌ`lѣVDfkO?O0sJ>}haȐ!pqq/p>ݻ7gY=cE *;;3f@ZZ2331p@<#ܹs6o WWW <@Ʉ$ܺu ׯXbEhh(zW"33˗/\NIDATȱ_~?3JlڵqQdggc9r$JJJm~::wɓ' >>> L&7NYرc ={'OĂ F?OeYYYO^|9RRRǏرcXlYwj׮z-1g+ 2GFjj*uV$''ի_,IVV0h իڱcG}6m4HIIA^^}Y}kYSNJ<** +qܺu fͪsN| n߾YF?D>}X쫋/be7իұ1n8xxx ##۶m /𧊾L8WcEw~C߾}a0UVY\àA0rH4k xWp-={1n8899v܉+WV~ǬK.u&qF`֬YpppF5}\pVSO=7n 33eoߎ@m۶eg20|p{x"~mxyyl6W} :F?Smopttĺu몌oݺ5j6GDDZ#<[,W>СJKK;M0pqqC[D%K+7o'X֯_oo ܹs]qvQ9sʴ .`ȑpqqȑ#jo^9KKK+wڶmjho...ҥqտ,Y0 ܹ3~'%^S0zh\t tFyϞ=ԩt:qs,qFoa1}͚5СBBB,ŋq,Y֭"""~g󃋋 &Oܷo[ofs̱X644=nܸQm"MI{dR\\,ҥKW~~~~oFSv!ΒY)"vvvr e/,C NjmV){jJeђG-O? 6LftYmۦ7n(:NCLbێ;KΟ?/EEE/K޽xbb)>|X믿SNI˖-ɓ""2qDiٲ:uJ%22ReٲeRZZ*~4kL |w""+FQ{V}dΜ9"Re֬Yrmt|` v6aEw… ҬY3RDD6l`QTԵJJJOOOyw/^Xwn1mɢh$&&FDD/NNNߊիW%!!ADD_.cǎN:)^aaabootzQΞ=+"eKDDҥK"ڷo8;;+%%%[L%00Pǎ<ٹsȧ~Z{>>H۶m|+11Q'"RΚ5k&+}r^^^ն}DHwʕ+pww2M6wT!22=\`Æ 0NIIAll,L&ڰa222MiѢ2L&:PXXcr,Q}=f\186l@ѥKeZ^^z#//}6z)e=z(1aˠu3gάLm~]-#Gbԩ3fLmٲ:CU  eV.]0`e@F?}yUOjdR᪤`ʕ={[)LPqq^<O>Aaa!~*͵c1V*ʿ}||p/Vʎ#\6mbEwUV~ҹeݸ|2BCCQ`游8\rǏTi^u ViiZ^o<֭[1~xxzzBbܸqppp\ SNEff_ՔGrrŴdjժ 1j( 6bJKKaL2bɓ'0LJݻqqxxxVÇ鉂"##P|||wJJJR}%vvuX[n]~FnRJvЩS',\Ÿ|2V^]4-- O6l؀<1eʔ*,Yj/Y֖-[UVPPP||hݺrf۶mJ.Ǐի}O>D'$$`ɒ%;vlU9r$[m|ڴi?Ǐp\|Yc.}lFbbb_W~)ܔ3V^ԩS8y$y'ODfp}O>X`O?>w  ??Xhřbk(..FJJ ~mٳȑ#,:Nt:ѣGxppN???Yh͹*&It:x{{ٳ1NūRZZ*:thgwӍ7JND׋ 2DAsV][+b4ZV-?$$my衇_q~u]|Y,A%::˷o+A&M{!2{l644{d4"$D?2ZVDg뒒R/}aѢE5u&MB1qDSiTvڅwy_߫>۷o&MTm;?|0fϞi{/]%!!+Wxn5><Պ+ zPHjCff&t:&Ljoh,ކƌam` xQmx!Q=cEDDDTX`3XDDDDQ=cEDDDTX`3XDDDDQ=cEDDDTX`3XDDDDQ=_M"". IENDB`biopython-1.63/Doc/images/simple_chrom.png0000644000175000017500000003260312250104543020215 0ustar tratra00000000000000PNG  IHDR7 pHYsgR:iCCPPhotoshop ICC profilexڭJP@ EV p'QPL[):$ٚ4T)M'prt7P:8D g:òQaUU' ̲@n&vQ>_vo4a hcqSE?7}(2`RdN'ZV,˒v/Cy4Ju8L^*UW= lӪz2C oF91^[m na:o+e(m ïPo/ cHRMz%RX:oZ3IDATxy|Lgk&&],pKw*b7p*TKQK4;!"d!33s~\͛7ׯl-<|0%%VZ 6|222ݻWNz\tĤ]vloP]vBJuرgk䣏>B;O]~]~~͛ҧU tݻ_t)>>>((իgΜtM6ҥK:ud[ammvܹI&Bڵkϟ?_>j׌}Z[[ !ʏ]1sL9j]>V-,,VZU ˗//C۹sUVr/^zE;wqpʕ+풓E9t萳qm۶!DFzm|v֬Yr}ڵ{YEQ r!Ĵi̙#_~eEQf̘!Ĭ_^ ܾ}[Q3g_&?Ybbb֬Y#077OMM-_D7޲eV4֭LGp1^7n'{`1?qİ0[li0.]$ߨe˖֭8qƍ%K0a08 TO;vBZ[[5j˖-aaaYYY{'fGi&[[۬M6،1r855Z˖-;fii9c __̈;T*Jeffj֭9rXvO[RRR&Mvecc3vݻwoܸQ6"?<hذ^Z7ܹs'%%%00ĉeeevvv[҆c0*n޼y``ʕ+CYYLݻw[ZZAzmٲ^z}{lVTr/h"0x`J(~qqW۶mk۶ <}mʏ92''={F rP=ydAAeZM^vU߰az~L>c'X6mڴe˖2[!iJJJ^^\8p#BcdvUa-A~⼼S:tswwShM:UV0O?51116*((BztssM NNNVrttlܸqDDDTju~.^خ];ggٳgW8^NFrYYY#ڵk߿A<@<ǡCq׮]yL;k k׮oݺw;v*4XTTd|,:h4Ƥ(A&__@A-XXX.\ϯ844wާO⋱-((ؿϞ=?2/2hРcǎM8ƍ{| {_4o|ڵ۷o/ߦ||_yYaee3P}ȑm77Ç6l]tBDDDz8t۶mѣZm #r>T6mqNNN׮(O?d\W)GKKKCBB~~~ڵ/jee/駳g>;wE9sLp-++r7x#22eeeΝPMX C>R7wիW_|xȣ*3 _+<<|>|H5 QSܾ}[b/[lرraNNVݳgk&طsttѻzꔔUV{ഴݻ9r$??? ƍKmmmN|W^yرcwܑ}\F=zѣGxxx߾} };;;9KZ~}rre.66ĉ&L(,,LKK3|벲2SSӘGEEt 1A>">>~ƌ|x!TQY^zO>|[/Wk\E3YYY/]b<3-_fMc^/Yy`vj-[ԩS]^d4vXF3bĈnݺi4_U>F%>cggVZ~fر _%??XEQnܸҨQ#yYQ~~)Sy\WWEi4ȷyf߾}BOOPܭ^ !͛WRR"bƵ\\\V\)|75ͼy%^}1~ׯf͚W&;;2G]o>YlllFqssɹsNdk?Fyz%K4͛o(5MӦMSRREYp<'lŋ Pm۶h4ŏ Tꪠ@)bggWXX뭬B؂mZXXt:^/o-RTTdmmmbbWVV֪U+`o޼mggjMLLd#իW寧.]t'$$4lťofeeլY3ٯBovammݬY*(,,lذJ*,,4`0T*qJJJbbbLMMZVۗ"111;;ãN:eee&&&VVV:NV[[[tAA`0?66Xy++'jxzottL 8t=e˗ڴii30 gg@<@<xx33   g@<@<Lkg6 щŊ8884iҤUVڵh4lQRR]RR"055utttuun׮=|Y7n䔖 !̜5kֺumZ[[Sͽtҕ+W|ئM &xyyQ(ʾ}ۗհaC͛k4 ^jSRR㓒JJJ:v8nܸƍՍV3lذ-Z<:.<<|۶mZ֭_'lٲ7o8pС"ݿ?,,짟~277_p|~avv# Tn/...o|QQQ}^;vl߾}k׮߾};$$$,,y󎳳3|GƏ߽{wǼ8>>>$$ѣ~~~ ,xKս{ŋ=ՊGիҥK7 XreIISgϞ.][W۷o߼ySe06nk.j_}]t y/_޹sGRjѢE}􉈈xߙI&͞=ocGGG?YYYC yc|WzJNN~Փz7Pxwl_xSN戮1siӦI?~СN:U?r„ ˗/{H/_ر͛7+HQQmF=hp[n߯L#]t9v|.00i*HHHرc\\|e˖M2.tlڴi6l|;Z[n׮]U^6lXhhh固sN׮]333j:W^<8Qޅ SXXHU+HKKҥKjjjڷoȑ# U &&Gojڵ3gά=ǧM6MN8oaBGǏ7778p`jԨQ^nJU+s۷wss۷oU`˖- _~2dTofVVVojƌ7nܨ|j>A0:|pC={V!UbTȡCVUk}9|0U-ƍ=\fjjڡCGHw֜QU5iҤ–_ TݻGUWQFUՠgZZ-/##ֶN:Uՠݻw*Z6557fB"Waj5E~d_2777 f,*,Ĥ oenn^JtEQxc3_fY(_SdJZJrxx33  gg@<@<xx33   gg@<@<x33   g@<@<xx3   gg@<xx33  gg@<@<xx33   gg@<@<xx33   g@<@<x33   gg@<xx3   gg@<@<xx33  )3   gg@<xx33  gg@<@<xx33  fSo gqT*UUfbbbeeEUA<355-++3 U`III=glllJKKSSSׯשS‚xgR|}}WU :tO>3TʤIBCC*Thh^ܹ3U ҠAɓ'Ϙ12$''{K.UٻxJ6mZ˖-Ǎl-\|y .lݺ5 Ucٲe;v2dHhhSXZZ_̚5kҥC q={Uc^~={4idϞ=...3T=C޽oWkݺu VMKKqիW>|تU˗iӆҁx߅J/0}۷{F,--k׮ݴiٳgiښrxߋUZvKprrׯ_~(bTP)&&&UÇZ-} Q)ڵ;qDUv&M0 Q)C 9wܽ{m۶3Jqvv>|oYV^hvJUxFe+,\2+V@< T 6M<FKKK,YiӦ[֮]zannwߵmvĈk׮}JJJ}5lؐJuϨ2!C֯_?anݺmʪ|_'Otqqy;t@xƟm;tÇ7mdjjjiiijj*EEE...۷/5kFx_)(((((Hq޽BEQ,,,]\\̨?0g@<@<x33   gg@<xPE RlllLLL5ZjQUxP)%%%999UZVVVYYUg~ԩjԩST TʨQBBBz}*--=pȑ#*@<6mxyy-[M{ڵkٲ%Ug>>... ;;;99111jzذacǎUT5Jl(^-VX{ɳg>|X+Rjŋ[n]bDWEEEeee*¢zux3XZZZZZRaxx33   gg@<@<x3߉J۶@Mgss T\ wܩh 8uTUvGGG[[[6\xtO־qƱJ111y뭷.\j+ի +[n#F }F6n?Z@>>7oz嗽O8Q} TG#FBƅcƌ5j| !m7BtA.7oqQƌ#wMKْ ! $77W5O_ʼn'䒌 ''Çt"HLL|fի'Xv\9m6ݻP544?Bfff%;v[nAA(*itGV+"3225k֢EjwB'//O.Yf`P%>>^ѿj388XacccT套^Zxqu*]B޽{_w&LBwOk׮B>iӄ}-oL[[[//m6**ܘǎSTvvviii5onРbO<999YƆMV .&%%%GUTػw^z>u޽{͛ƅ7nܘ:u|k.![o-BcbbTT\?z蒒ذaܮhTT/,_^|j6>>^6::Z.~zm5Gcؓ'O_~֭TEQ 5jh>|W_3~7s9zuΝ[ZZZa*-Uh8|ӧY !Ν1{I&c֮]Bm?3!Ŀ/^/;B={֐N2B˗/˝ξ}oFFF/iҤ.[pB8SÆ r" 5gw^N!Ċ+/#G !Fl;lٲSL)?(Nm_|[_mܸqrʸ3 22R1lذ;wN4IȌi֬W_577ГرcQF:fرc_BYf;v4޺uUFՖ_100P1g`^M(lZZm^zW_n߾`0BϚ5Š=77ٹ}ƅM6Bt~M'->>WTTZv׮]ղªoFlΝ}||yٓ͛75ѣ5_ηӧO͜_kt5ssiӦlR^2j('' +^p!;;v~~~rӧ5jWeggu^~_,(( aaar+FFF8::mAAAƍBǏzoooy,UeffK"?(JǏo߾{M:ҲL5:tGyه7%55uŊAAAkB#;vLw1bݺu#F011?qZ9r#dmSRRVX1~x9^T޳UxJNܿwٳgmmm֤͛I٫6 'O}6 !^dnnGjX_Q&k{ԩaÆkn߾}#G455;:8;;W8*ɮG^[(mIIɰa|||BBBdm>Vg͚ю;V.޽]?ڀx뭷G!<9=hРGmcw$wBBBrrrFU2.\Ry!C!._|.]qN;t⏾E'O[ajꑵ]hQllq&g8pĤCrS[-߿a֐ȹ111ƅׯ__`Aqq'N4ɓoߎi߾}֭ٲ0`նH^^-111i޾}͛Zĉ .--qƙ3g ѣfoߎ3330&XYY-X1ŋwnذA΍8w\Fzꕒrܹnݺݻw/55Uȡ?";չtzVVǎ۵kĉ?s9!VNEO:u MKK,%M4^Reff-kj*^Css\EQӧOyfJJU !ļyZmQQ-裏j,899m޼9<<>5jԙ3g|ckkk Y[o1cFJJʕ+\W\\_J.X@XB. t:ݢE䒯z`0̟?_3fVED2DQy'gg+VwY&#' (ߺuKVoܸf.JKKΠABCC_y^{M^uV!ĴiE9yq֭+,,MNNV՛6mTɡw̱}"77#FO9Ν;?C6m?{zzv &''+VcO?Wmf͆.kcǎz_ҥKcƌi޼yjj~?TsN!J211ݻ;jJ255ӧOFjHmܹe˖;;vM0vBܝ;w֯_rk~5k(oƳ/^֭N۰aCZ&O,o%fkk;f̘4j7l0gΜj|g  gg@<@<xx33   gg@<@<xx33   g@<@<x33   gg@<J`NRIENDB`biopython-1.63/Doc/images/phylo-simple-draw.png0000644000175000017500000002673312250104543021120 0ustar tratra00000000000000PNG  IHDRloJsRGBbKGD pHYsaa?itIME 1B IDATxyxT 6*[UD[iREJ-xoK E,Ԉ`"E .`ڵkL0!WW]PPŶmذ!sC3///ڶmkUPʕ+'tR 20(-[?矏aÆmߵkWs=qWdŋ]v=eN~~~t)^}xW./"??ĞGh!۷oiӦEnnnlٲ._|1^}yR{|Μ9yO#"bҥ1k֬8묳RJ4AC}Ѻu{R{|̘11jԨ1bD7q2̇~[lO<>hWf1bD3z-*vI'"T*""7oUTN;-n袋2;4~HR1gΜ3gnΝ;aCSNk׮RR ;e\M&M&B&B B  @h@h 4@h 4 4MMʆe_re}ٱj*2e˖-qgBL<9V^#G (S YڪVC (S,X`ޣ @h 4@h 4 4MM&M&B&B B  @h@h 4/guV4l0*W-[믿>ΝkBsmܸ14hcǎ9s_+V={M ѵk8ꨣFq 'c֭%KԩStԩ/87n'N뮻Α8ꪸ;k׮1nܸ8_qEFܓ+FvvvTTɑ8Ν&M;#⊢sL7>yR $IbΝǬYbҥ1uTG>}zӧnмꪫ*T{,tpM6-HRA&M*mѾ}..6lX 80^zxGwqm>ޭsss#77J`򗿌:ga)-[$I ض 6Ь_~ԯ_?ڵk]vYt)~Ā"/E۶m JTr⤓N!Ce_k׮={:xh׮]Dlk׮K:IDaanڵYqPCGӦMaCG1p4hP# _3gF⩧*)/w'pBԬY3^xᅘ7o^,Y$Ǝ~# pM4)v&M!C֭[YfqEE374O>2eJ}ݱqƨSNh"fϞ{vd2@߾}o߾;zeXM&M&B&B B  @h@h 4@h 4 4MMʆFe˱ƍիeg}f 4t-DZ 2o6@i2d!Pdޣ @h 4@h 4 4MM&M&BJF!IxcŊ{;1طܲeKzꩱx/`o{GM6O?O?t<ѯ_hӦMlذмqI'EDa?cqǐ!CL }y 'ʕ?k&|I`Czy戈8ꨣW_->۷{/m6.]g}vs91jԨذaCԬY3~ob{h4(z뭈կ~>l3&ʕ+gqF\y&fnݢ[nQfxgߎJ*QGeZ_hoT*4iRt}QBSke.(lٲWZ;v41=4K.-Ӄ>|Yf䮻t:ժU3q=\Rh߾}L<9o]w]{ѱcx饗 :thuQJL[`AHQBhذat1ƌ6m*lժU<8.ɉ'={vԨQc+.]Dn"IG C+fϞiӦE&M_WɇfDDʕO>qa|{l\pӧO~:&L 22LvvvԩS'ڴi]tQ,^8*V_~yɇ;?y'N?_Wi&ϟO[oHUTA>SO^x!?#~_DD)ѭ[1bD1bk-[w21"//0(SrsscҤI{fb׮]oF˖-K.4{X`A|EێAkߦOӧO7ʜ}7]PPŶmذaϡK/EZv{r7;w'ܴiS 4(ڨSNѓwDDlܸ1ʗ/UTm۶V%*;;; b5VXʕM~{:xh׮]Dh)2?OU֭[k׮qG]ؼysԨQ#.BG lڴ)&Lgyf/_o3/_ׯ.+#;ݚ$IzOc=A @cͱf͚XdI3&v'N,/۷o}ٳ_vXtiSLrũBl޼y8ꨣAѿѡC(W\TPX^{c~xر#RTy䑱bŊے$/{+V3<3w7|sTX1j֬v[{&^)vFsy戈6lXTT).ӧOTP! `;~7<̈hذaKhѢZjj*/^lbbg4t˗//^Jڵko>^ҥU>7oܸ16nIDD|n֬Ywygԭ[ػˋQFmӧϗ9""6m9_2rHD @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&B&B,Xtz{ʀcǎ.]֪U+S #,X N;ݶR";;ې SCiӦq'27ވիVvmL$IL[hTk+FݺuώW_}8N@(3YYY1xܹsTR%y䑘5kV|ߏ~:ڷoop,Y$:tliݺu,\pիWo˗/74lӦMiӦz׮]cȐ!ѨQymg}4dbhwq1cƌ0aBlݺ54h]v#FDfLЩSصkA7)4oƸM fI&B B  @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&B&B B  @h~^{-;hҤIT\95kcƌ1q }}GoѴ( ,t:eĈ%|I?'|W\qEwy1uԢ;w6m2oիW/^JCL o=>>|],4Q/qaźuSNQZ8cСuV $IbP J[oT*z{CFaaaL0!-[>hF|999yf?Rlٲ%ROӺuXpoW^nԨQ Bsǎm۶߿~ѻwʊ… SN<8m͍: *TuY)Ev_z3<ժU+;YAAA۶aÆ ͺuksN{n?>^}կ ͼh۶AE]dP,X "" b4jY~{:xh׮]D{46mR)G (мK#"(N8ʀM6ѯ_Ϗ7Ə~xc̙ѯ_S ߠЌ6mZh" ѨQ5jT0q2FΝcΝߤLR1lذ6l Qi#@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MMW߿/<ڸ[n18 QPPPlۆ ^h/B _^^^m֑R4dChѢEs=f͚jՊZj}iߞN.^8ڵk=pe9d~E$QXXhP J54?쳘>}zo>Zlid={%\^{m~1eʔx'3f+q! |0֯_l&+??=fÇ6mu]͛7ŋR}ɓjժӟԤXw^wyߤМ;w Qi#@h 4 4MM&M&B&B B  @hV=fo M1{ @'4|sϔ/d۶m|6lŋ[cfϷo֭[#$I _\p-0} uܹs#'''*U|m۶-V\=zȜ/ 4̎;׿un:jԨ]vs}7oW_}u4o}"""J`&N+Vk& O>qwG-矷3xٸqc4h Ǝs̉믿>VX={gOE` OIDAT-ZRdʔ)Ŷw9iժW{MRT2m۶mK5ky 7)S$T*y [.IRɨQjk?0Wm{wTP!9s _>쳤nݺ1Qk[uFʕ+O~b/XlY _yߜܹsѶ;,rss>ȏP4/c%>;k?0Gynի׾|k[%bŊgVoG}nٺu눈\ovwqmoݺu$IU\J\^B 3xC/9ׯ%KqM[3k~ݱcGk1rXti 4(*4Unk׮]t{iܗߑGÇxᇣ{1o޼ ?vk]z1|p>o헌**Vw\;6{ͨ_a}JN=GE8㌸⋣cǎ_* ڷZÇٳgw͚53x~6lX 80^zxGwqm3fh֭[w-|[ݺu֭ۯr`ߓSN9%ZjW93rȸ[bرqWX>kdԯ_?ڵk]vYFv7Mڵ+c*4>x뭷b۶mŶ/Y$""7nmҤI꫻m_dIRɱKi:Z~fިQb1jԨo0֮]K.͜m{.IRԩSڵ+ܹsҺu민}ݗRd^|nB)~Oz$J%3}GGXn馛T*ݧYv~8 *$[n͘߶!'RJrm%_~%*THx}.Ҥ|ɻ[mǎɉ'dgg'wyg&=zHV,Z-ٟ~-ܒ̞=;y衇K.$QFrGۏ裏&3gL&ORo߾̙33g&[l3p7n\J3<3YhQ7?so&CMf̘<ɭޚt5IRɭޚQk[;vH~_'{lviܹsӿ$N'V*}UW]4m4YfҳgO&{f'ZJWTT)iѢErW&$J%T*I3kܹsyN̔)SSO=5]vRbŤ~Iݓz(z'$>-6&B B 8Ft:wy't7n`HSOelٲ9rdZj:w[` p0}[Neb{ o Mm6C(a 4oE] 4W\7o.ONNN;i5jԈѣGGDĄ SO:uwݸꪫbE/X"zq9ģ>Lj1bDQZSNuYbŊ쮻N8!֭7pC[=7|3;hܸqdee~VlSF:1th֬Yj*bÆ ݹsgf͚}of%\Rx}.]D:t:= W^z7n\t)&Oݻw/O*W^y%?hӦMƏ~x뭷?i+sΉ!C~a;4i&M]vE^g)oq)رc^z1eʔ8qb4o<>b9yӟ_QXXgq~矏}{lٲ8p`qQ\ٳg^n)>9rd :>W^yetMѸq0aBTV-u|Iz[n%""nXhQ,Z(:묢Yf iz SMRTr~m%T*5l0IR… 1wڕl߾=曓 *$[l)SNI*Jf͚UmΝIVVV_h~$J%w}>ʕ+T*qۋϚ5+IRɊ+?~J'|hdgg'}Y}[n]2eJJ^zoРAIݺuI:N.b?>IRŶϜ9sg_&qz .,#:v^{-~ӟF bŊQb>|xܹ3۷jժԥԩSx8âO>_s9Q|망vZDD̛7ofnݺxK.t:;v({jժΦ~r{ձt҈XhQ$I=z(qݛM xŮ7o=ի#"~5kիWߧooPL#4iRt_O?4֭[lrv9s3f(:1mڴz6lϏM6EժU 6l_~y\~{ܧYfGuTD{?8+V'|b%M ̙3gO9唯!Xf͢m;wnݺQf͸+bРAvӟ5k֌{os"_ Yf\vX<ѻwܹsaʔ)ѱch߾}uY 6m˗/^z)}z>:.Ҹ뮻>K/4~xꩧ;N3-[rŝwիWZjEƍ#ʹM2F*T*_N:<|߿<'+V|0Zh_}Q >?ߗ}E?/ .o1y߿\~or~_ԶmXlYl2ݻw\}=uW'N#F~;c̙gEzW^L81{8sOGydJ P߫߬f޼yFvbǃ> 4^zɀ=ew7o^?>l999ѯ_3f%!/%IENDB`biopython-1.63/Doc/images/biopython.jpg0000644000175000017500000035460612250104543017555 0ustar tratra00000000000000JFIFHHwExifMM*bj(1r2i ' 'Adobe Photoshop CS3 Macintosh2009:03:30 16:22:51 &(.AHHJFIFHH Adobe_CMAdobed            -" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)%3u;ck!Ƽz+xebZ&fVVʺ26R+c[  NKSޡ WQ}nuVxWg[g~nVTdXkDp3/}U7}-׿I9tweՋ Hٔ[q_XΥ22i6OGP儲d88Yq0Jw_#YcG/d%ߟEEgŠffp隯h1fqc3_OfQ`.eWCj9l5W Cx36<#epYj])HG kC>U,g_߬_=٘ 9 ?k7;;.2#z]pݶRaH%A>~u"gI>l_iMX7Gϡo;P_̣$pl8%cǧ[5J>/ދNMPe74> \75ȋq-9_KN ͕*z8i/U:ّ]knpg\QYqJ 2 ~Zl}dNTki{̇w>c"=W\s1i Ʒ15ŏc.+m~컘|l,"׿YJY7=m'׵S${WYp)^޹1cVXߺ5cٌܶXӎza#v-ڱՏfϘ5=\[7iɱ =W_EX}Xokr9e[ `t&Vm88-yx2\ݛ0_/g 3b"18_j"$ <}96+w{LEŖYomŶڜXZnc­k,ŦgG[_ZΚ6E=ޭDn#7m6<\QFQdS_֋`dHuO];Yp>Y.m66Vw]C&f~_ҲS_Penw?BۍΩ-gF5UMwZ;ŮT2 U ~ej5K=0} ~}?5K&zeXk_PX\1e .f~+?ȏT|2C߿G ^6Kj}N7~?O0Ο;z_ zF+0įcʛcCR\U}dX*myWѷ'ƴ{g;}>+f^P{KnU7moXYZZpz gMXSoQœ\qf0_ 2_Vf0$b'u^Ctީ6;2_oc~:~vKv1.X̵ߏQ#^1}W԰Ь z-ϩ={:]Ym-ۊ[ߡK?+?Z7c;gzdE1_i佥d)7e[F`>mZuiOkF5Ωӵ7zߪe펗OfUGEԮ5--mol7odz?V&L\ϕɖPC("xpf`R>ޥO,5dhJF[zG\cŮ¢6v6[rfN#WW[ksMuݻO޳e6T_ڃրV7ccj2z8xl1F4{]^}_N!|\oaY?_+ ~eіDgtv]_6V>Mxؖhs5Z;?WZzGP9eLعmCںfC\_UߟGUn=-%驦ho15W\3g+O%wrX1<3m\dbTG*umx[;7fWPOŢy4?1m݊Lg\s11ICi|vcd3z+zgPǝ_m-fͿW.RQY?%S2cFX8|A+ %o~G䍣uBCt=Ih`u,>Y~3m:9'G9G$e1 X2q?{o>E#"z})[غE6r1d2 `/1x>龎?W"<646e~?gazYUͬ]k]{փ茟\Go]gM>>?c=_etCh~18:LKjSJ8p SGı^XˋHwFS~@q6ӓ`.7 ʝ1XNaSoYo/EuoE{4IgOѭtBtO+2~!" t^m}_WvsKN=yXM~cLk?GoB9E6EmjmlkZqmu\?woO{}OS>~=O*://_3#,?;w8͙r81@f;}jksp O1f5ѻnKUXXۚ,cQ{?mȫMWiW6w1}_UfEMgWꮫ7ogw?Jom}8pS(P$V3_'g҇xZ)M[CXl5ebmWtzэ͏cJVUJ='dl~?mg/OW`T}g6ҍ~ٵK Ra,A()~YbqN8r޽yS=lmi|w3s[gXV62>u~׿KLޕ_sW{_=nw7}x>J\A@o ?Kb)GC(YYW鿧}-hc78=̲~wKo+ueo-en{^ \1ǽg>[+tQhJӔXc0kp_m?jh]a7.`XD8Kp "Rz+WsMPp2i.'쑏`}gm2{otF-Kw>=7;ݻh ?ۓ猠\a)w?}kr}?g'oGg{fg{z Q13NC:0BPhotoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName A4 com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMG  biopython nullboundsObjcRct1Top longLeftlongBtomlong RghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong RghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM ]-T`AJFIFHH Adobe_CMAdobed            -" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)%3u;ck!Ƽz+xebZ&fVVʺ26R+c[  NKSޡ WQ}nuVxWg[g~nVTdXkDp3/}U7}-׿I9tweՋ Hٔ[q_XΥ22i6OGP儲d88Yq0Jw_#YcG/d%ߟEEgŠffp隯h1fqc3_OfQ`.eWCj9l5W Cx36<#epYj])HG kC>U,g_߬_=٘ 9 ?k7;;.2#z]pݶRaH%A>~u"gI>l_iMX7Gϡo;P_̣$pl8%cǧ[5J>/ދNMPe74> \75ȋq-9_KN ͕*z8i/U:ّ]knpg\QYqJ 2 ~Zl}dNTki{̇w>c"=W\s1i Ʒ15ŏc.+m~컘|l,"׿YJY7=m'׵S${WYp)^޹1cVXߺ5cٌܶXӎza#v-ڱՏfϘ5=\[7iɱ =W_EX}Xokr9e[ `t&Vm88-yx2\ݛ0_/g 3b"18_j"$ <}96+w{LEŖYomŶڜXZnc­k,ŦgG[_ZΚ6E=ޭDn#7m6<\QFQdS_֋`dHuO];Yp>Y.m66Vw]C&f~_ҲS_Penw?BۍΩ-gF5UMwZ;ŮT2 U ~ej5K=0} ~}?5K&zeXk_PX\1e .f~+?ȏT|2C߿G ^6Kj}N7~?O0Ο;z_ zF+0įcʛcCR\U}dX*myWѷ'ƴ{g;}>+f^P{KnU7moXYZZpz gMXSoQœ\qf0_ 2_Vf0$b'u^Ctީ6;2_oc~:~vKv1.X̵ߏQ#^1}W԰Ь z-ϩ={:]Ym-ۊ[ߡK?+?Z7c;gzdE1_i佥d)7e[F`>mZuiOkF5Ωӵ7zߪe펗OfUGEԮ5--mol7odz?V&L\ϕɖPC("xpf`R>ޥO,5dhJF[zG\cŮ¢6v6[rfN#WW[ksMuݻO޳e6T_ڃրV7ccj2z8xl1F4{]^}_N!|\oaY?_+ ~eіDgtv]_6V>Mxؖhs5Z;?WZzGP9eLعmCںfC\_UߟGUn=-%驦ho15W\3g+O%wrX1<3m\dbTG*umx[;7fWPOŢy4?1m݊Lg\s11ICi|vcd3z+zgPǝ_m-fͿW.RQY?%S2cFX8|A+ %o~G䍣uBCt=Ih`u,>Y~3m:9'G9G$e1 X2q?{o>E#"z})[غE6r1d2 `/1x>龎?W"<646e~?gazYUͬ]k]{փ茟\Go]gM>>?c=_etCh~18:LKjSJ8p SGı^XˋHwFS~@q6ӓ`.7 ʝ1XNaSoYo/EuoE{4IgOѭtBtO+2~!" t^m}_WvsKN=yXM~cLk?GoB9E6EmjmlkZqmu\?woO{}OS>~=O*://_3#,?;w8͙r81@f;}jksp O1f5ѻnKUXXۚ,cQ{?mȫMWiW6w1}_UfEMgWꮫ7ogw?Jom}8pS(P$V3_'g҇xZ)M[CXl5ebmWtzэ͏cJVUJ='dl~?mg/OW`T}g6ҍ~ٵK Ra,A()~YbqN8r޽yS=lmi|w3s[gXV62>u~׿KLޕ_sW{_=nw7}x>J\A@o ?Kb)GC(YYW鿧}-hc78=̲~wKo+ueo-en{^ \1ǽg>[+tQhJӔXc0kp_m?jh]a7.`XD8Kp "Rz+WsMPp2i.'쑏`}gm2{otF-Kw>=7;ݻh ?ۓ猠\a)w?}kr}?g'oGg{fg{z Q13NC:8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMhttp://ns.adobe.com/xap/1.0/ Adobed@          s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]4yBpտaXVB{(9NwvfmY KpyPO1h(yAyMVAńpeokO?t}%[#&XJ t?]D?i25 a{jJH%!O%_ͮL$cv{c𸚏g)<t98yfCE3_ Ń:QGמ8q}yc,ڲj Ե%6 UuZ~hqO;!= YYC)XT ׷v*UثWb]v*UثWb]v*5'E7Z66q"ƦU,1h6c)mor lKƳx:-f8%)9O\BxG!/>#qy=@V nYLc_Ǩ K%'r&< Q~Ě?jsg&LF9Fz]YA_n,>lh;sWfpp{6-̖\o@j e?1WQLᘣM3-v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]v*4`ct%nҪ쇌Hñb7>8Onjxևv\)y?8k!޽N ,<y-~SGjz]GlQ˻Lљ{p=(δ?NaC5R7)}wpik%77 ʲokQ5HKP>{?}N2.\QUlѸDŽ/Ό40$4[7zehd;}^v*UثWb]v*UثWb^a՛Kx\_ſVyoU98tw> Dz;欙H?}/Y5i. H\0y^M۶sg/Q?澉D j_OgXR! (7aACP%BR轝\-+2*wlRpȃ $[; ^ILL/hJzh[LeS|@ycJִSyuoGI,C*5GNͮˆ@<櫳1׫_[U~sysB޺R>wZDؼGniUhgԍ?m8$'(sU54}FJEh[J)^P[6Z>ˤߥhcYN/ikqZZ]1lX~ǬͻSGx~wF/)}m(GI%%;;Uf ҋA TjgO6z= ny'VS)TdqEXvjO]aO@l^ rL=H8h^Hz09g<.L hv.cWe Z26G26{̵,ŧ:d/.V+BpjX=H7d.}4*=oqwy Z4d]ML!cJ/Wop3.]#h5&#kS"91,U T9DcL%^p[Ȫ'z0ܐsY)Wfڤkrhm.Im"`YJ@=:O|h`gQ4Qq9K_/U m*p0 &Vo-(9|$=c 9bl/R t3T[5fQz68@d-Jm*]Xar"]jH%M%vx N.XH⺿В7z:Ɨvm5KskP=7y:dR_viP5;%;6}hQ =GC;h姗ںb]v*UثWb]v*/)Be 抪NW$q[ #ek+In&$}Y! UlϏ(2 b@zJhGjѼU 44pǗ=iJ7(WHm(Gkhl2@( 7+%DJ6Fi0nmZPh mVXr̘zek%Gt55yiW)oɸ-c]y&$=7Rnm8mnmO/[/hc ywq_IL9UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]yϝc֐ISFT#$Cfo7~:\#?'/!=?`vosq?_ߚiid)XBj;S8Yd0`9KxezZXl|e3O.zNfQ\ (GӬ5_[K(tvIE-WA/\zdS1][Xe5Ů BcR$oOd!Ϲ Z ktKO[Nٖiؚңj% @|R% 6!mFxшȶή)jfXG?"7 Khk_=FfR6;03O^Nb : <~T $'$䡾OCV05e΃Zictrcy}Ͼ|-3Ϟ[i񸀚3{߸giu1όN=_7`K#̧ثWb]v*UثWb_&E~o[Mm2F' ֌] QN:swY-NOH{H0CƟyyPy,r4Ĩ2+٣ť"X,rӯB7= &s"ѵ}ऐ%ܓ9٘-R{m\jpea63= Gǥ\{y+KP3ƣAywdHrlQM=X <f xxҐ]Gq:]i䉕=jh659  yYA\Rrt*AXԈt.nәPIBI[PSO4+eg yެrKoHIVvhhG|9GZ#WԞI> (V6qiO!іP&8OW~Arbe;"- rC0kw-קj>e=1~-vO,UثWbT縂a1Id!U@I`R;~FѤh,WPI[%b27Ϋ=.?޻7ajr"cž+q3HĞ*,K#@K8qd/ ?i+M`>Uل=O$-9|jz$F{ /㏓Y 9<|x%Z4KGųSeuK%]? I=,Ȅ2**UثWb]v*UثWb]v*UثWb]v**UثWb]v*UثWb]v*UثWb]v*UثWb]\em5ˈѥCQ"O #O 12 e?*/{pލ@`jmQ kZ<⒕(= jU=T2z-ݲ nvs)BN&)F]ë%W{ F%׍$^]:-$$t"7imi2^K%Z_&T5wVua$W$y_ߙ;hڴȾqҐ-TsNǴoѳ;7]z|]g^͛wZUثWb]v*?%zXe@)ks|vh >gGyc)j_{7sZ^ٲh2TM_h쬧B*S^Hp̶B\G=A-e+{T|5cS+yOATO^oZnΐᣴ~YO;"A9HXԧՕRGlQĂ$.BW1 _ cm];LI.!i,Ȣ׶,Yqj;/>iss>55Hx`1C˿mХ:ZeGu#UqFn ✶a=Bx3s=є6"_ 4`1qDy9qw%K}Nm[Y"_A7o#qd"GYU川'ӵFa}Uj( wc.2u2yМE::Ȫee5=!b]v*UثWb]ϩ)Lm)ja.ՒQ pz~}?wm>)Mu)d^W{8)s<$ykZ3,Me6iMHgE!gG3Ƀ_jNHg,Hcb9ӥɔeMOMg` z|y;>a]8c4.norP7]\uHP{ ǎz:Bm{K\bNqx_,w4IJRfrr;Qȓ " vN6~oBU6x\^\piDG F[=O6A* l K)HJ>/ZGq=Ŵ&,j@J cêΦ;{V6"[x'[ňyʑHD۪^!n#$ ZE*73v6gȿYG ƽ޻#PɻKDt6O'fԻv*U濘?_T[SRMmDn>_,{ShThyݑVow_'?/>{}cO͵FC`t}  8͐iG5g&wV-:@:A xY3S7`8T6?ɱ~?RߕQY( BO+wvǹig ԢNzk2vPH3-wG+ȱԏυZYwX|O)מUkpC6kISHO?fA۹td+v>-P>@yBDbt/2R=mn)B^YۘuR$>wJo{oZ΍ѻv*UثWb]v*UثWb]v*UثWb_*UثWb]v*UثWb]v*UثWb]v*UثWb]kykTD}cRV;}[ >tLOs{53q07.g,Ta X?ǚ;oZrd!0C% m^þvx><ǙuoSʞXdH7EPYcofװO.iyjo/kqY4B0ť>#o(͆9c[e8Z凛#d5|ڱ&7ꇪ|K<{>qod! A**DCHcUҊͥ4Pٕל26Q^b%3h2I%h Ga;gcF<8ۺZm6f|>\%fKCWb]v*cFTPYIH@x~ 夬,cUxoJRLIuDǴ?p?Wx X#%UCCJcw&:bޘRk[HjmG!u#O2y5}UOdpR@>R})Q1J>jv#$((er7hN'~_'ybB`hEnI=G,qe#=n&9Gzǖj^0BX"`rhJpH]=># n@Mհ)xvއ#zr?y=QݗZKũ.O"+_&^(C_I2 K_BƋkBkQ~WO<2Bu]#LՁcosj stz`%2`1/LͶН93cRv={gI<ĹkIߤ-X.#afF(Ѓ^37r5m8p![\8)sseF^`F@-It6!6lk!E1b?=һ _'x>ǁr{t΁ثWb]v*UثLT v UgCڌHa|FE뼭&;}'W zo0\j pKd(+%XZXNLA$a@ Ww9#n)iޡt씩'6Ͷ2u\j3 \Y vMwz{0 J;>e. !(֠ 1AdZ+Sڝ0{;|`:K+){$M:.9ǎ5#nRlK,Ӣ"PRـ71)TӸ| zO (f*Aw4krHN`WSMvI$b, 4wGSm2M A"Ҫ|@︮N懨WqFx}Xkz\Di"x+Px2ZvYc@^sRO#`I5nR'rfq _󽗚4:G-d 5D|Cn-="D?Οt_wB֬<ţkdK4-ލx"nLgO0en_>rx_4w:n#=*ۇ~ň^ FȾ\uXO4$wwjnI'8\xy#0 W wu-L EY&`҈D tY[fOy?]=X̀JI9NNϕl ll3= OSG$_ך=N 4([7I\SH}9*Cwf8E֬4/i#!(4Q-LOaNx4wz^|;|âWcNLdd_;n0&x_'1MI<C"D!AlA į®]v*UثWb]v*UثWb]v*U*UثWb]v*UثWbgS]͎=-TEPK(jPi 4?O73Կ7OwS??SM5?II 4k>Z&):~r6SUdn_˴6ysO"FmF_aTv*Uثssii/x!L2Kjq*|qM%PII 4`TVRYў%U\Y_I ޷CV`;⯄$1KVޑYFkfGQ|!Qq<$hWBZT~7|]\^]I<ח&a@噔/X˭恦Y>uXB\*d496c"w?CֆX_Q?ڝ\DZח'4{2w.@xjobx#ow]=>|9#@Ь,\ i6m8#$|1&*̷]՗I?[.~ЀTz(.]?-^^eRXԓjOFN?7 ZivA?>ԺV[11Q6iFhm)ɒh7.VRw,*֖#YpxVڢ> [UVd{6$Jӧsăe?Ě6m,ZD3+(A@QtpRU{h]\+qXYvs8r<{ uNc&iv&ͯs@E=Odsb/g ط;]667Tccm/ ηOJ=KSOV_2hdӜzot3eJJͯgf9ØFHpˑ}OB]VP[P)pu0X Ǒ|.#f'E$Sښ?Y x_/[Kx-Yo18\FZ>A DqWNOcjTS.&0ɜbwvϥsa99ҮG-upХ [~aH%Ǟ//k!?oIY^AB_gq%]J A'dM NJx93nQE*Yn]Bڤ,X!:0f%njп󏟐fœZմcc۲4w9Gn|7f0-Ș{ Ontkִ= B igkÔtsZ=Dsc?c?:ģ@*^eJ@vy'FKK;,j $ZTwsYK<^|r.]A,oq#^Xsr)]l]`,Oއ47P6:pZrZ uRԯQZS-&!(n:3d#(Ln:%׺ᶰxd+#U$XpN7(ɊOmؼ3[K$q) f3Hb'iW:~qs\~Gf 0J͞޴ׅ.Ox.Q#w}KǼ#Vkc?|#ǩդN_gq=^_kvGfď79~Iiߖ]CЩ/9[' M<_ِ7#Z=|OǓnjzh2aVcC8z̘Q<S$~qǩ!IrZ _'OힱnX˧ؾ}D>ktO6t7\R\E#U%2ySFPUثWbSϞe|As[Cuu4=)@Rq#}Hy CIVҬC -5AN(Z"J)U@Cy:o]6Y1WN=)즒^=MD=+qq+__!K?Hk]ētz<"r/0"ud|ȭ+ERHURŠ\o/6Sk=XsAe6P$`J-iV R8y+NCI N%bP൏v {{|1m7̖ژ\p_@WSRS &KN}QTAƂjKۗngKٶu:nd>+.?7ti1WBۂ>逷Ah8ut?5xJ9lG~G ڋ~tiSi_¶ߝ(~ ڴ7 SV:I6 ႒4/wQA<}c ᐰ݋4K& ?IѓNе(?%<7(?n 8HG׉aeH-)5DNjҤk#@'I/u ]kZy3FR ouw_z}M4BRB, wq%z(Zj0zT{ ^\(2LJWӞ} ÐK 1^VG{]B =M!auj ")^4x'_{Ɉdss4 rT}9x98gdOg$x=hx]DyQ׏|Fٍ@JƁU.InIў9. Voݼ~ޙyS~ rme,P}_F#=YdT7hh nzd(6wz I?9xhr[G,2Α(ǥY{O|jh^oAuX%H].#G*1OIBnxӮ2H}G~inm HidOX,(YzaL&pK/XPGC14pO~?ci+OvZ;_?-ݢk_يڙһ\ߊGK[hu1[huԸӟ=?]Rp.`aĈFVxd%ɜ9m4j߯M=/[򨉐e<۱F[vIqtھlqyG[f"8.!Vۙg?B>~X|sVM7E~kk_N+1? P> e{\ܱG^DNN؎` 'xUPO ͖r1cهy^M&2[@79O˩=`)<Țg忓t)idg}?ɠΟ!!9%^19)P.VjJT\ZGg1~;dk|'xn{ڋshY Knu"Iބ>ya+_7ӱJV_Ӧ2t %Qr +NիO0.8([a'휦i+/'dˈw3Y'B mFl &AQ3S;Hi_ĕZʹ\J8aP*W34&).]99Ye r7—[[VǚXV9q(8 LL{^z/ce)$dmcONf ȥkLq,J5ו7|<&S2 65&zN/C Oo4s_o1]jBFs>)Н{$UI}9h~zР״[i~bj a}^? v*wqL]a@3j,Cwa~&,ʍ_hGa:ӈ˓ż/mMחrxkvwL~;K|Hn5IQ$˛2L]v*UثWb]v**UثWb]v*UثWb?%$g,+?d:~\_ߓFO/i׷N9XLâ>oC~B՗*d _Rx+邖~C RˎStSOm%?ZF}N:T(OC~Zߕ^jVs*X]ۡ4boUiy't3\A*iq<71jA B_f~P~aC=7DZV^^E :ˈ(!aCW>Mp/48 8{W;M/i[]B9.ہOMI/6>-iƣ&/̱ثO/1X].q!kM?RHՈisP)s}O68!KF-,O|8+oؙO^%DIcel;/OȏȀ yzzTgdtnJ wqTyiȞˈ.ħL֟YJGo z [uQihLwsK*Κ}Cr#Wdž?|jOsqYbm1IoREQeEM?QO1/$ƵWm?_|x}me_e.W7B~φ dYf2s`|藟PUXax6gvfn?ovf:@oLvq;Tn'X[`ῼC= 4Lh?kp$*\KMMY8 7p}է] <>?|7|6|ǧ=),2xMY3$@ى~ey~~Awt0跔#@X杣:IJ<oh5#S.Rr\Z.W귒 GQoO^HsE) =^-nEaRxN5?hPvqںiq.a,,=mY K xCĨxM[FЀIߓfbF&E_oD&#hetv~(7;?~W~ >D-ʗAW O쳋')K㛨瑘ep}sk~AɚM/jj6s,wVMyS=W|bAmV!.}_ Co[]PZ0=7mT1T'MϣǗѸ4\M2ЧbvGLU&8V..b|wp ywp * ?.7' \Bg ZMs+*w}?,pLhFYrzg8(Z M'\/aҼ Tjv_*-wߖ5i/+Ś*9s6rݳ$Lϯޏ%˧-ľuћDnLWʼR59<,E{%? W;Kn-n㯪$+b(sqٽEm9$rÈug?rK%^K0)I`+D  V!.& !ǧGyu]`CL>_RmaaAj7p&g\F 0"*~vZvomB"vUQƣ_(<.#7UثWb]v*UثW*UثWb]v*UثWb&dey}?=vҚ5}ˑ$Ϛ'YFb=H %kA,(s4Tx~1Q/ڗO^]`jafیЏ35dkN '?1M.-fHbE4hAgf Hg'ZO)oqpS2YOpcGS( r|K2l+Z/Fi3T0e?f/NR;Zr:@{guRGˌ^M% Q:~[ь` O|g s?v"2"P:=W JIfP3!Ô=1"Xl"OEX* KiwW:]Peb8 z01mkeґդ (m'&):,yIcR?Wm;}>Pe xjOmP m$~7a6?PyVx/T u2Oo:-6~1.qu8*YWs1shrTnBWp}}iǒ'M',s-N*wa2|VкO.7]L!ncՊ0o+qFw<%,rIqyKκuKt^jH,U`?ݠ}8o;WoPf+bKΑyM2{9)&QZ]򔰠rY@ghފz :i-K#:G$3{BoRo8O~r$D| H~d%9"32iτv|8y?>v4jvեDi&>Ƞ̆0_^X//iZ#d m7cƬ}wDDtxD,`U~g _" 2[ j,;l| G64gTcJ4,SgvgdC ~-'zgk4Y7M2;R~DgGna7_ZHiW5 CL̸ i%A,c Uӑ OP<2"Tvv-,Wes-[fDrJטr!QK;ohZRh:e*ʒ8S)ZZl؏p>K2q7O74G))&3GLϒ wr_7_^yZXrKv6 bV4gb;(=72Ko/Xxs־JSF&֊yލ!s՘aBysK!ߜo$3OV$ E4[?wnޡ0yDOŸ:SY~ՑLn E=̚H/]5*s'FSdYz>Oȟ#ky&G=>bcDd|XAWϾgg="ִ):)Ȟ*j0<(7:{ $f;#J<2%IW_JªbzFZfKAk1%UX涙h_r__<OI~;c]?wDok1q*P%xtcay61Ó.lYOЌb$ޚ~ɞ=;Ro-0LUz ׶_?2H~dYۯlOzh"m5c9b{}'c+xuaE,thE;)1Y얄crwWe'~hy~pbhLPlG4UҴ`L4 @zn77Tn(5 B#-iﺧث>FY~[4h;k8#b?N*Oךa1k>[x\ !"Ya*:Oߗ]iu(^Y IrG6xכt E"XxgۍSy+V?KZ+n7 (!.Wqy>vhjټ层6(!&1K齁#.. O5M>#ln\=k 4(zsβl~2"\y)=KF`cg,j qjh/_gq~Yi~PSwGM|v.Yj#vf. kto&_JE64Cc~lͷWu/%^nR nqTzekD|۴t X<sQV[H"#,Hb @E"<8kK}FS& ЩCG~g5ڰ9-zX8&=mBJq$qAD ?wr=8ezȏE͔P1"Xo _Gv[QdMOazuǓx|kњݨuxq~bHc{K%'/?13~$ %ҼmlF7KoqeU#Ӵ"1$nOĄ}#[rsz.rC Ӥ%Ӫ9 ΠuGVXy4r\- \FS9C "N^yȾGŇ_*?9rĞ{>?d=qOͭ}zzhn,VJVly&ZAŠ_'I} ݧ>+I@4Xdg~smGʺoynb֡YnIe@$r(yb3hJqYc۠cf;gR{~Ռ/,5Vm.U-.@<$qP9F`8:z|:b>3i:6]/^T8n$yEja;Inu)M +$#$,Hw2db9u nN˾bEi^)!i} N fb2"=L̾VJNRQdbN:1WGu]+yQRWFFf!5^ú0ꭾtxhGE0,_W~U)yKKBZO:vopjdI,IdXT)Y静zo_)&x_Q"mms imwM:[i}05Äs~; L79|cO7^^O7yɞT[(uk nƳ"Pv$VQV7[m4BQ cs]`kmk3zv$`#3 "9k8Iw#v(|YhG,wwuz)G$Z) /rPۦHdx >hWf^M͞MA )MJHT=!=_O$v1҈L!|ͣ~ў~s_W|_H'6\Sؐ ;V8 ]Z;LmJ_b }c8oy,Pj4yeE-R|od&΍ѻv*|*;BWKQci}ҴE ~Tm[TJrԪxֻK)/q~#!17;U4嶵IІqSSăQ}8%%t519mތ=5AQ_Wq ʹ} zKv.ꇱ5J2_r85?D4:DZrQTU~ 1 D\C aY[ DG_o4zaewX L~ZcXVZKPTnXMQa=ٝw_IDNo(yr7pSM_7CJ1QR: =/GմFDV֕Gȷw.e G0RFҞE O RUtN,6:մ[KnĴ`H1 _栺fGbV$Dr$F.ic_6_?4Xsh>j Ɉ懵@0Y!斋y:/4$Xmz^^ØɄ>dծP!.*3fBFBIϼFWӭ5[,AQʡ${y|?P=>WK 'P1-UKBHkٰOW#S 57u.y'cUG&ؓZ<}?\? cNL0tїvwR`9[OpEoj'7(9oBY^+(] )oM'@ qmKy>qzN 'y<ӱWb'+9OlUߕ Y&N[:G/$rSxAz;v*UثWb]v*U*UثWb]v*UثWb(f1cI1<ɡqC]6\927hI_CNfϣ(}5;v*=A_"~}RJY-Hq(a)f󉚇{g.t.-#`7Y[!LMciw)2*0?G#<ߡ]ѽ,I)"WF^#X 'D~qBoV]6F.o=|7wLnzdڟy jZn0#}^(crS\fFF"Ł/tKCʼѼ 𻼏տ~~Zsؼ,Qp|Qe/_!̘/дSTV,a=?0eYpŊQhIQ6S֤~&/'ћr^8O?k,52(e??g‡bV$ȡpUAb8o-r[['-|zyb?{m8R4O/4)3^"ZI!ȧz_`]{k}U=x-T]8o_`jKS񳝠6a>>ŧK;g* "^6cZox>|ya)>1OO%yLLA^jPT}>u8&.1<>z槧Xt*ʮ+08cgÖX2:<>U/ & hIgBfD54z6]3bw `WhV?{,d|Oz?ekN{tW~~ѼWa VBTsZL?u0Qj<\G7 ']yUf֧.*t>i6M>'gA.Owi)@}sBVX`E[by7fHۉ#K<ժ; #xC%Ga;fn6.+;ϗ5=VXUn6Ze/R~"Z]Dp5ͧ>F3o3/`Քr!ŘvTa8]'|~Czi7=+f)+J휖Ŝ7tӖ\4^hg^ǿ^_6߃g1qyhl^sgu~gy@ѐ]x[)Mqx$eq/YeXnPz\U|A!7sPys0m*u<} K]Dgwnk.-ƯU_U۩o)¹1 s\x+y>ͶcM X9 2U<ö;2XH-vLxyXPYCc4(< _ŷt&|2$omEԦ07DSf/AAQN/ӖٰȚWEuYHw#*\ӭ *{S8sK8(zQY[HЪ-$ 7w r]F_L9#V9EkVE RM[*ƀPsf*vPs#S:c0_䑧îyr+uyO*ВEw靗b^//-ڢ1[9#o302 J}Z,WR* Â=f,QgEj_[Qp%G݋9u؂jRvfK;D;H}t~<ݨ6MO/jK6Rcp)Ŏ.睡'1),lt1NNv  rH5&'XEYNXj7eCDe;l0#.Q<ow?&1䧛9"״}}X W+O6Ca1oIھ z&~^GB?KoWx|HϜ8!?͟6p'y7W 4JZttjvu%XgsiFC9|d>c]^ӛ+4^#U>j=h怜y28by.jv*2,O̶^LuImˢa4 ^I qd7p?LCWb]v*UثWb_*UثWbT./--EngHG_&hc3%.AE5*D,H또<%g DZ:H`ªZH]]v*rk/b?tfI <Lkֿy9䘼5]8E?2&UثWϿ1F4ٿkzW&4X<v#dbONQԡo)I|yj6˺DO[(8C Jo-)0OKnO\2͂.o<9~m{0KL}q*"\@. fb[G" J[G?Cm'51ܾG_dz+Us'|$QwjjSͩі|1qNJT~\UYe/ -;d5Z,f0̹ܨr$eKUƇޤ#DйMp?B2Hv*UثV5/<{`k3O Y~|)ƙ{y±$WQج '#6qSO=/Ͷ![6EMxprAsWZ-Ŕne3 >IuGcǎW_=ϳݧ<z'wp%ʑq܂ud w:|˸_{^zZ_C_ #$܏LSNx~eGqM24GJ,& gϣGdjAxepoeKlU1E5RL radYsYr0^+<ڿ8? )FDCqGn@[׭m Jh%HRڭm7|ir&0JAFϩ? yүn_u iֶC hUg#JF*XL8X((cQ`lGt7!=>Y@_v-]"zu?e'CoN$$bxYBڭ6˦<7 ,˒# B IMp~b][Fn\~*FZR05/{krHV-IլĖڴOjE2%|E= #w ?DžON;aCk\^y~K@I mrO_n Oi579Auq;1}Nlnآ dL꥓ј5 NNl'Y.< zXo4Sbt{hrmEQ@ۋVsy.> s,s㸉O:Ԭ;iOZWi.{cˏn/o ^M[B]52Ov\x7 7#Ͼ7B\۞N=SqBw y$x?(ߝ_U!I!Iu mԵӹX "0?~}aa<[IA?TaVqtgs&:9LYLbywdIKkKYN %r6g ݀ J01L$0IsW)o---ڌKgn(Evݕ!Єc7/+ E)Kj9O2詿мzGh'ЏE~D?0[b$~9 0i}uXߌ|~Lx@Kt!};v*U 8_r%ɐϟ&'+4Mj/شX䲑bz 5]$ug <4sXXG{s2l=|n"=6a(н>f&һT#- | +ih'VHspGcrzͺ,Ȓ1qs$IdO"u lQք}wͳh|{o(F0I~cV;'Q h͈UثW~uyyg4 b芞VW!_;y;RwhBiߣnIVN-;C=FE,5`G} uXa8ө6?)C}b$fӑT}mbO7_ˢ37uu 1%Ę%/f‡b]v*UثWb]*UثV]7˜@D #Y3j0 Ǔƾ<2vgbe0bkWn EoݥO@ҿI&v]2%=;iM ZWiwjq$e,jWs7 I~AqٜFk%\"O;Ec,K~Z-XżPg^wV^^khb! e.fC@L`u_97OW34USH 7nx03o_/Y-|s;Ǔ{3j띊|]9J\>7~ 6){gx4y$|ro8$7H}`UثW̿zQhCe{oQ*I56 p-?نȄ~r^o&7z$?D"bAD@G ثOɗO{odǒeβ__,{Oh0K!X6ʿSTf'1Ǐߞ%펼u yb#w:1y5 {ZM63cs;ec+|Lуy'ɗiҡ a9y~lÌp)pV@Qi]#)Z}z@ 2y8_pK|{\u#k +q /v*UثWb?>ȭ5SqBv2'Sď0uqǨ&>8/Hߠ.k|l"7_v]GynG1rI] V6}+#) O_m4/f8ǒo1w4C`0ys *G%3E7|11ojkFM,5~s7|igݣ%]ёhO'9dj=e+#}Cm3Im׊(.V.kNU0f 㹶. a榞[1XIBÖؓ'?HAy]A|ѦS2^̷raNv]~v+vIFsL_1i+hxql}GH _'s  >muhxBҹ*Nǵ$?ӿDy>1v*UثOqWN??`&qt #K?31|t/}^Əu%ʹ5Lӧp}1!7FBsak/ȎH^~d<=Cd2PyggʑiKи!\4qz=8q\?UZ n_mSU;;sxWbo4ִ=CJq_@񯳑🡨qWߚsEj土 wG UytW厝(I v!r>[I[ѴI͐}`Oy1K&)E~P_^v>BL_>RS4J?țg`.LRl{{C$}Q9O!kk-[A ۙ6ޠO|GC99Fe5ccy{h:ݷך\wnc B<3Lp2 9$6}?2ioޛ]1Y0,;*~Yx2_!ˌ㙉L'78^ B JjCշ82&ߞ_"ɱf[FosQrR(v*UثWb]v*UثԳ p빅X+0ĵ~ddI#(N_MkӮX54oZ?mWIez>E'V֑v+kåc[<W Xg`ooіyhVTVcAn8?iX8N_] H<_cv/c2@>[-5KCw. EŠYYRxSk00Ϛ|t2{{Tn5[)Ui}Ye_y0d'?,2|k|%}{Oe(.@5zJ1߭jqde21nP^3N(BF`sQk[';? #JRjK'o1mMOkÖ$qF6HhkVy]*So+M jYw";o\yDGW6gK?0k*Bu&e3IB|]W`剼~|ݤyѵ+{RHΛqp6>?ib51E6̷OWCO|O&]^x?j8%<5rw)$FG Kgn  sQ˝)o$ů񟖇[%/ъޣ8Cמ|A_It PJrX)]mCsy3(YGHa(vmѓC}#y(kZ#oU‡b]v*rK%T]饎߷o૊ E'E YɀC鞅aG+KaK"wfMO;~C7͑kNҢBZ@L<眇Z=7ak<06>Zx/-dK+ru kes%) xc} DWyiN,kWif:U$-0܏Rช?4 /Kqir֚K(&ROGk9L:(5I/]_@9cU` &nD~PzO?';I]ۅ7'W2XȣA,f  qSlGwY5wz/& }t'+4 `z>E2I?%Fc/o $M]F*z t.s9rNLAFu˰9%N& >KC+eOoDE ?VI*Ƽ7וگgb5S (`upqny)߾~ A5֩o9c0`KD)smTSG 9Iw1y҅.,qہu=`H}_-m/?T]fj|,2$n0KԆ錐lvD ZE/ڹ`;y=!՗k>fYKrڮ(BRzoRjvk힇:u} ˏg ٫'n'Ry?J?駓#~z}7ɐ3ZX!Z_˵os՚(_g /)?wby]&[nnME"!K{gdYK(5uѠDd3U"f H䑲@~I1 Ižc}OD>bJ,W~\NevslsQ]Α HUU˹ gbC!b:Ԕ$Ato_3i=8j|OuxGiv%ޣ"R`rI S5!"z g:~Pޜvղەbyc`O:7B^??t>-QG ՞_N*7B8igiZo4?C˸qW_phD01v5"?,37֞d5Ov_C>|~j j8H̭ho(Ǧ-#ɨyOnlDUmSUu6ϡ5f;gOͷOk2;9բBa"(7k91y~Lȃ=Oy6]ԑ͹XT:ik N_>.' ARJ4Y(q^>$+.gov;㐚'LFYh΄:*yR+Ȍ|Cx{|XŮ`%Q]&:>2;e:/?!<..BN?VGHTyǻCǘٴu]|ɣ$v~cQt=ېsby$=GvyqKud}GܫrIAFjX7pK5t#0> ߚgͿ_61J#w Oa{Q`$o3ޝ.($+ $ʤSq) k337)K>GnQ;=X@4Ro4.V&s | xO]|CFY/ǹ~H?G=XT?e;hs~ccbԶ.fK h;?_sc8qK}pKď>Whk1i|!_>SMjKmNV]aDhe濑^kO ^גCWb]v*UثWb_ܱ,>'+nE,oǎ@$k<,w$Fހo9Ӛ<#a /tr-FVQD suZc[l_Ej8ȓGgct_ӧ 7|upV_.Mf6 س|CڝNB^KzL=_~ LG 8o | ^`8:h##y3)y?8Dfvړ;4]_!vW=_>g=9QSڀГ< Q Ȳ ]VP;>'=gX;‹kWmK bPHbNl^-97vGany^G$oh,< Eg)B CaCWb]y/] ҫpxE;Xmk7x݇6gEH)V7kɖ!7 Gh΢HΌ*>-A6@ .@yRjhJbcک_s;ricsdv?iGQ _:1/E畵iâoqvj7,ShE#}] [kmRs.wY~MB#`MsYR *Qc=HD0ipRYΝ2 O|]ć/f,8g5Բn7"W:^ݟzmJ_(kI=aU5>?dRb8rS38&2G{t%`R(iKecO$'ʆ[&֮WL9$93Ͽ7|O?'H`_M[Ԝ ߑ^E>@4+frRpn ~T?aGW3hzw5Ft z16=*&/EIϛ,fdI2r q<loO,cle<&Pd{hа4žru[k,/^{k 4m:^w4I D+abs&g]H7Ϲ{P2O5ԖHK%i(\&Z9Y5%)$IV.I'Վ, h>0+myXvh$yy.wOԼԌЯnRH§F=[[Y1ǟx-,2y=j>O--7HYڮN_ѣ&C9CI4jMrhsYBW-/)kW-/*VrBb c2rbׯ2%N?1?.lՒIeh*=CR|Sw."kad=H~? /On4N x}KML..^-Kz!^$NƯ\8-<%kw:oҴwVsq_WR=3-IO*d삄-6܀~a5i҆6zB~`q9 $9&0ƦdͷiAPasgGџ:ԾPʻ3$ދa_d{@K}i6GUثW_*~bEjȈW#QRL#h/xj~x^5a5ͭ٦u6;~ nc$Bmot_0nޓz)ub'Vp_Ee_}gPI)~1\xvC~R r}2c74h i 2۱I3_RVOhJ##v3b:е?0:ܬ#"C:|LYHE0gp-?Ld:=#,y42_KO ^ےCWb]v*UثWb_*UثM/~mkc[il.*-n;V1csOqh<ݞYƚ|J%Q\Fu?̬Fs:f= bWPl j[W5A SlreWgـ ́~Y 'm,0Dۥ˥ [qWeWaŖtM10U6l[A&&'+@gxqñpz_Mq$#$N*9=&OI+{{ V3o&!q zM3@uiT?Ucզr|x5̱Ǘ7_-kFUM$Ǜ! T !v*UثWb6@i=}BzBn?nt:p?3?V9]֧im)Nݶ +~/FOpʳj`_dƟK՝ԝBK쬓b^uŠ~JE*`j N7!/=B>}<.ʭHxdT%mt򓵁,\f}fB5c%6q~%;s %ac_N>0c苠!zmY7;>kߔڧoX.8ӻI ǃۇzoc\\'^N.x+uWX\nˇE~Z,Te\A,ד0 6NW1ھ?/GmwdiUgX flW}?89-Ե3 UJpXwܩTѝD9`ԾKzN ^ fG|'Ä;h%1?'X\MFmUKaWBMMU{gaFpb;Vom˧?~@|s֋?0U7O̝?L9MNEN!QY׭:bw,xUƕoO<#һTKW\*R_c+*R}þW\%8Rt?WWʔT;=Џ.ViuXwMQg47S O*HB'|#d9ʾGP%aZ%3g1{M"~c֛qK-no"nD` EAϞ;\Y<{=lDVv; aS)ܭ+Av˒~qyxMp Q-.*H-N$uj ㍊޷krˋe=E-2TJF얨nH8a#߳c<܈e(Dz?#DbѤfg ZqW"-H4m2G|:^ڼF% $;|w]yĪCӜz>λk/`?w ?J}N}0ˌLr/eqMrb^%}OP?.?) |[GLT5Y%R4@=J9}Y m"Fɀ Wep5&G|mZL!|g(.]=[7?q:CrLbi2JpK~1O'j<doЯ,MY kۺ~cS38Vθ@){vI]v*UثWb]*UثT~M44_5ijz{։2գcQ#RBpqg#q'NrZEui>wI7esO)8w4cGKn?#cmu 9+KxcQj+czo澖HAݢ~U;;,z}߭3O=ִ6Z\k-j\"Y1Sw&VͿl7-fISeVQܨGfpg\ߡE1$0 j8UUf p8FU 20H=8U~pxש&? PmlOθ AH4kcoO/EO,CNX\(HJ5zz؎K&п5ihqCshHP:$zJxbhqG^I"R/dz/5K{g!=#{N;[B1\[;byJf|0~>LS8/a;-5N=y ` W:NLCx뵚,SXf_]ޙ7%03@>6_9}=UFc}؀h&M?'=Ou"?X( ' R#XK*$y8>T?iˏ/BBdp<E+Jeށu=ϗF#VJC;)$`="$L^e?,k++{xy_]EvT>vhVmR z}d=7w,N>gM*O>ᴭdkDDWd6l;kEӛvFp2uCȾvSM|q8O.$x ֬5WpTlȭŪ9Oa#b-,B=@I{Sј,v&o|ooi77wLXb|ͧ*dIJ0V#ɔFd|<2Ռ~L(P2DF@%3j>_OWGɣ;8/<7a95ԂފVSc;'$|.b{{ĚtS̻?}e%t,IV ?4cR ㌑]C;Oaƫo晩h&-hX8<=TiPh#9_C̶>gӠY-gNq<7'F }9̝ K;: )]ܖHmdTYUާ|C2]l H=sg{\ވJH v=z0o.=ugR#?oB\ +<-\ؕn_ y(5?bJ{-9258n1Oxx˧ɊC;BjMGUd NY#f<҅wk$ 66rgJjRS֫OY蝏>M=c%n"=gMx̓}m~]{-^CCX?F8aS2‡FOF#>F\ǘO/^?WV"._T 3tS#W*Z"#_C-JR(tRsܵSSpW̺qn'ubD܏| aJM930K5EO㙇*hP6ǒe7ik-R#;JrLyC g)u¹& Wb]yo5vXHx7eK>jHkڲ3 )ЏK֚nE8J'ɧߛfXϧTQ7ljcxqHT|;](Lt: Hd??~gqhzlR]E[~sG,r1/x`w3El4F7 [. OpWb]|m\ P (l~_6˟C{u]"Jө4SfăRC@*XU|Ew96/?|u~gkiYuKC T |l̸%E5xn AqVAAOc8E&a G0/Cɺb@0K /Ξd}Exzٵk.^]iaĺ{L(6U@ONYaDzlog~V2 㒞]v:}Nf8eӓ6Z>{x_`ݜRf0O@=LkKILI$zcC:FP4M9DmXi|qo_I ^\<]7c慨Y:z~~)2y+!j6]N&X_j6-wڹ W:^sGF7`8"c}ʖQ@ yCz"{3ӐOFd3;ajrzr2ȪFp3{Eq8EyU}nAced0 anja\Vi"~O.յ+}6PҴPѤ1 zqF^IXr~y,I|szǐ?XbRD,7 ;|7z׳>ǜ<l긤1A'_ uMqAߚӲ?p/ߝ%|n ծ^2Jq5pZ\_Ie8Pv qVF.rN)wϟ[.O)VߟK̻c@M Ujf~Mm#Nз+yi".Sv`&q|\D=u3"Xճ}2=靻CC^0ySԗ@[{c_Ӿ<|<ìHIgx\'W${ N3B$+XHwC^S3n/W_V^myg]Uѥ#"~,i'4ӁvV2.a5ЧGt_zY$,ֲl*:}3)0xzty,r_ v' ~d ( a-쌆bXu؊a2)O8{/Nm[ܪF&,8 졥o yDݡ0]Nl*ݐ^q_q9y:.%辽Q={M^+(cRKT=.ǯ$I2!K?>pFX8R94UOOGKmbk`ox *9/QpI/ɥK̲O-mq3z`t )ɱ|M9'(~w%&CM? y&\tn.#iйZiUG53*ا-&kVxNd1伢M(?Fz^@c[C)Հjnkagw_Il5I@hb"H9\YIlZPD~q>Ko~5_&{RS_s$8G& v*UثWb~, >O7>_DcѳȆEPU!+@ <( 坎e ͌SZB-ʾ&XLo '-}OGO1< +EIpRJwf3udWm{c1˖< I\ܢ[<ʨbX@;ҝG|pPC 8#/͋h-Nՠ6RݮT)CC+T~4?䷶w]&@|UfqB_}RMB!y؏<3__@1#Q-iZִ[F\}~wC<|HF&n%WO=5+&Ԟ}BM ߿9rF#Q(jl#Xaw} Nq) JN \qe}?m6" wXj+!D-p%`Q;<+qg__r7cʲEqbME%khq{faPEYTIUϲyKv=NPK+kyUk4ݩ~vgG<ZHu[;A#4qLպ#pc>a+dywwLKIJ,$Ho`cs.('^ms.x8mdZGfl2xÖ3 <~UO;iIZW4?8s0˂˧Vo=ŵEh~2dR@s#)-6< ЫtTzyb4ڭkGQ ;&/G6wiioQ6cĈTtXKQK3\#`a{җ;<ځ=n ܤy Ja3҉FaF#Ĵ*\y[_(iS/NDG JWESópSG c zcӡv䤈*i>q򙜸29 ̿nl=TP?9$~c<)!%&IWbVKV*;r+HGkKOm,d,߉`#Oa<*4!Z(lVUVu=KZ-_M͚ūSx[_*8vnփs9 yHY{彣s=wZUm쟶ES{Wҿ!GQS@zLu3\H@KAo-[@B l4O0BWI9?\r?.,(`CL HpA_!iVMi_xkUHa y᦬m:ya-Yeq\O9 Z?kJnAergOm}uɽ>&ӧPm<dǒe&.]v*UߘBߝ>pF݌p!+iR脛S{Xo#Z|6_9K޽֣h˄^/q(\YD ,,Qi64 (% qnh?]3>kbc Kkz^yE+H`HX 䚚оiBcy^ӌn_qdzAjr>s^݉o wqpӪ/!򆞈GT}5=Oox}F( t9.[>x#Vh ݞ1#pߡY>jM֏LTq 1b>Ug -Q85oz7MuVB>!qxzsrK\rpMm=_˲ςח %+ʔon,r8 0%Ǐpy a=2[,h?{O:v5f(\ِ+nLU B LjPlpf.\|CKS__8\p)~[?ܖ="9ln@;tS>/syb]b?7gSWr9'z={i#.I {pΙ&#IWb#* 'n>P#b9쫟?/:9B~,:oejˣc ܓ%M,ɉieLsf,S=C(a MlsPA9Ofl"Mv̺Tܧ/1U_4!š)`1BV.%)4<ǥɧq8 I *Nٗ1$"f|h%(_y{RQJ#9 q_KQUx/O]c))lX]zMϟq;]:!YG'9ovά̌>+}O&u:).B56/|{g$7MisdBԙ&.]H<;o*ygP.dBxN`CM=+/I9?j!d&3|U'iol_KZā:=Ss_EUjIcè3rGߣ )IIz8'Ϡ?|Ve!z<+|槊Oν1Ǚ>1,NvY7^0H͠H[2[)P1Od"oϗ:^c[ܟnknYvƊa;3U+<\LO$|dA18Ets){އiVZlJєԀG*g7L2FQ?T~m fޥ݋z5GPkLN)1ɬ{EZ].ZO!=&^찭|3W9qN9?}Tykm O 8}r.{=w.g{{9G8easDE,EN*7r?Wm7aXQe |?$<9ivv:V)}ء~#<c_ݬ޻X}?ap!m]S"9$y_˯mV}Ck;y_g>yZNB?"B_*=yzԈefRtO9JL,Mbvg6:Qƥt/A, ToՐWNloW%->[uخ(t.9ٰ *=\W7m$ i\CQ3|[8r/V$ͣN &DžLbUثWb]v*UثW*UثWb+ż -G 96WM@xNaAR*Fd7v*UثLh _KNA\ouGO K@C9I쫨a#vC}ϓ`Uث8%<rwQjAQNq/Li!4yzmLo0]>c{MVԓ$5~̐ѻ%/fl~>}yGִ55tJe@ݞX?h G*.,x$[0:^|Qc$nOz=td?5h]pâyͺfsW!y kԨ vkӎyKA-<oin1]#O-9RG?i }{C7>|ޓEZcc>|9 ʺT gה?} "F#?*%//}-V8_c(i@ґ@cCs5z*70&t]NY<FM?v"/[_RTԘ?\!_*Nj?->^Ik%h+6WǕl=A3jg=~c8|//]414/dĩScNMWb]u{t_HJl*roXV4&Rp~|i)}7w :&&B4-Z[^̓[īğb9qtqߋtxӿCå9eOWV?ytQ= ===99/Y^>:B?C(}]]-̦5oCSPesFaN>agǔ~>'̱v;/j6ѿ%ry1q V>fz3/?^7緎~JZCyѼ'Vڕ`] Sh=ap#;g`Nӟωyh|ceiYsִ1<,?45;CbA諞0 (3P||xe0_{DLVR5;#i{idU:QF nz;Z쾧\Mj) o+NiŐ r8}k}r e,Um%utz,$]XI·@5$bfP12q<2[bc19Hw.[n?w{`6#TJ~eLH7]BMV(2 rEj;u.[¼S5~w?,o3إ4;_ڠݨ::6zgfkhcx'u.]aߙZSbch=Ӭz?=WOY2HI 1~I2e'6];?H5+kI>"@x]TFFV\Qr-HHs7h寘5?*y`GZI9纝z]$ì,-YO H@VQ5:&5!\O&G0hYk q,w!{W;Wa2qy=[K-e 2eYS'y%?iM*;ҹӜX_IsB֣iceu2zqIp]{3*u8ÐX0l/uH>9&){BhPA͏鏹[E)m%"e{E G89 n(6où#Yu׍z*O IS!cZrv5sOGx$IMi]N\k*Af$Fm:НFXba:nfO&YeF" vH1B"#|s2$e'׿8eC(!ɩ'd:dnѿg$Ñ"ȅ/rL]v*rPO{ch-G+SFBNϞcV(Q<&=>`sKIj;H?L ~aelRGYa}vr~0=0Jx'ڸGnCļIy*^Ww,\>dvoK!v9@>oH#ȁf=QNW2SL@͞0u6YO?X%IRh#:xq}8'kUǩZؙ-->aO$O.N*JV7!d>2c8 Ɗc#aqi2s6@=?ɐg1huQwzN?wߖo[k;N^cC>aFLƌ.H[€#_0=K/.[]ꡊH=abo1?C)['FˀrI< VILm;:q<3!8/,Mot ^d0w oTm[ʚ^$Լ*h:)Vr_ONp8dzl0ßo7oWÔl_OKO,`P8"y$ثWbgx5X5KMc$Q^<ϧhoÚXaOu9t^eYё6(Zr*z;}1?;3V%{uz̍OFz 󙜸eR`Bb<}muLer_O%[zo)[_im_@B.Zܦ݀{=?g9kFKw7)O7xHmĵ|J_ןK'ne&4USLIEӫ3\'w< `K:ϖ=9G)eB|iη[3iyn] [0# 'wp|{G":o XMS?9hՌ{na$d&`YOBC'yIǖ4hz~Tl{v*U^ct۫ՠi>(ߗ3y_8]mGl<g-lGW_IsC}%jmycSo+A%6SԖ*3BczsG7sFY#?B]p!]%c20(*e>A<ιxx\gC,IrrPmDH^g)neҔhkS˺6kH+S@ Is<7.wK^OֆjJhZ(nHI,f 7PN hv.}x짗165O,nƴ~=zȎƍSծ -ctO% Q0y(ǯ4_wGj(T~]$xsotyfmrk9Oq[9"7*HFvl&>7 ēk:G-囉 0C$mKy<;mt|2W S'_ߝ:?JXS\F6/'zYu_[r{lbXgyG!W9MuN?Gz=c`ڴ_$pPO17#R}+`UثWϟ /,),$4G?o57Ûʏ".ض{2 ȤVXSfv/ 㸞o[R7f顾HiЀ?Aql#itĎ~U14| 90 ]Yn&|IKW4 ]|$7a <.̶N[]jT =2 rp~Z`L\$@7xLպ:NZz>]EK{Mi]C2,yDՇ\F<^iwic4QP)4 T}93$t/f/5 q dR9_UW=GŇ<^&N/xέߟ?'1DGy~9$u{H~$/Sɿ0iHˑKlbRYyݚAiHGvnܒbj1Irrt%$qǜjzj z4顒@P9|4\}8iϑ_,i&}!#2?(2 'HPIĬBzY);zC{|k6Õ2^p")e@}(_͈d|C 7ݙ0]uԙɒjԟp| &*/|زϢ?;4hh_:ЩVzpAa|?4MtBOz|Qo9~ ҟ$(vj>8OP}s5zcu\M`{}^;ΜŚj.HAv9|FQCw^,e/Uo(.;fq1=Tz~ nxDdMiptҵ m4u`r<:#l՜nNyւilȬ֒R`#i$#‡ߛx,qq6QrO7mVN $>0v*U_]XlޯF9Z'?1~v큓ib"=lQz kI[֡t0^E,zdO%=2FhG{>׭|ѡayu+ k^Z!V}(ˌLr/eq qxjwdɮOw1A꺝es3l8INb2<(DȀ9x|w?. gGv^^ϔ#Yŧ%=}=H$[$D(MnztFAzL"+]oPU X*mb<*7͖>c7 "~O4>Y4Z-f?UaOf\k/k{A.XLԛz^ԯ;5{Xx`Kxޯdu5 &E.‡b]*UثWb_2vIu=9=J;V X Dk?:9=q0})kso{m 夋5,J+Aln[ v*UN O7__/M2?O4cdd[rwR sJKTUTy[W;_ՅOCv>?hAZSۨKhkvsM㞞<>;}ثO?>G _cOpb<6/5w{ӿ1-|2+Y,"侭 Ia&bj493˦[O.4=Y}+W!'Қ:2lW<۴8&2}yqGz>{~RDӘ}lV@>6py'[b~c>lncQHWFst1V- &!7273Ij쀭!څν7>n5װu >\^\ %| mqvVn=#ݘh$ ##;=!#ӭdR/X4J5{u5^AUxX~8bAoo?$j?~q>&A=סeAyjhN Q^㳵48e͈* 4mNPas=7Y dHIkVr%;W5 SqL D"Dv+jjЛKǪ[O.FBxN#>9FQ~t0~M^nQMsUK.^<' jd-iYZs<ON.l3Tӵ/"|&i!5^>6~f ΒOve}=SG9M,2qFbc*srVaˣտ 6Y?_䐕_xqR_J䘻v*UثʯN})KEא`ǃis-0G|RI[7$#9FU'oW %b6~ɽi|1Kq8Oz!{9Uz@ex7RNJUq,y+<$w__e]S4bߏ7{ FvK&mKqܺé#f ҬiXo8e"Cx EJX$K+~*4$rSK.!!Ey_y@kTBki%.c7])}6a/?0>ɶa t$K-Ben1jyX͊nxY,r/Yìc^}ZL$>QCYO̿j\O4Ca1@yy`~t2b$ثW{ko)YEzts<ii=>hy>y,'MM:IR;77PC$+"@=܈H>E|`ݽS\x}eQ1k9kHeՔUsPp_Y~~w$ߕfi<9k& XAiZm ow " TU7?6V7K%)Z)"۸!a/h%mϑ,cO,k)[M8_O|JK{+V3[]t]w&EV-ki!oICEhTF9'͛sYz*mwNtp)?q'(׻<&>zD)QIbHtr9Hpˣٞ+}g@ZM#\* *O"Q WW&ܺM"M ̚~vǮqn߼" ]|;'=ND5s/ߟ5#y*7IK=>ss)ذ%Q|`VM`3~uO)!d7r͟;13?V丐:YREV6//IH>;?y;mֲ3a Y~(|R0B_c}\}RdG$o"提OaQ'rH bRo51y, s92Q Gynl~bf~K_f2,Z9ڔ'L jZr2 _-Bx/cVjX.q*R ,EթccWO_)~g6FcejY)QK==p˄<|'Lr)?柘*_FmD8|]0˟RQ*Aja(RRU ~}3Ms&0~?d0*ߕZ#WݍˢڙOVn?Q^*з_N8;,Lp]ѯn  q$* tu[A,cr]W\]+tY"Vt+O@Zextܝ>3͐yW[YQ6 *h@&_:}NTepove` IΏ/ⷖS3BZ {g=f>(|.rig?'͛Uث*UثWbX柑,22u+f[Iwӄ!8 e pxe^UOO;R[xi -:L#oKZF fzH5{j qϩws}{*VG,Ȁe@pYPcH? 3uf4R/"@䘢$v4cϟt٢Ѣ9PTl@fw9Mh ִPZqc#J /~U΅ [[t(Rw~p]R_<mGM2̓vb?d*柵idɴcn,Gv˗['o`JٔycNsS}ij ׳َo~&##wG@&ث˿:oth|m;(ZJh,!_!jO-'XL.%U&Ձ*NDO}}  _0ZTni%m7cPTWRuG1(wii塩~uğnKY uo@Cۼo8ވբe"oBe=6$M V(?ZW _7zQGa7D?hk;w1/6_]`yRG!ޤ̒/N1R\襤z:q0:ȩ7,q9|,-G l*(6|\!nZ@m|qoڌ48K~ ?8 jo/ I к,FR3̈́cQzY%ѹЮh\ZHŚGU g#,2lnnFJY$1SR*Zޥݼ:K%…9l*zО hdØLsJre^^5sv>@juZh$v{, nFүd`]QBhJt.YHL) Z~kG>}oG.Mb- Cp?I_HWY'p~?"'ҙ&.]v*yTլ| h6,*]lӇS15zx1K&CQr4 ,|CbMY-&KOPi sJ op=V-n.<|btXBzɩq<_v%|4O Ϳ y"_T䘻JŭywEnc.s~[ ϔ\.Y q_\j:αj%#R>6`Ϟsz}O8q&t X7vgۈ$ӵsy,pIo:}0>QM^9m[ 6zr5N>AGV2tV5w 6zby$@h6[8x |1j^xrџGSSAsbr_KSـI~byV?v_^Cuſ4hra`zJkUL(>bb-]$t٣u;ӉQmŐ㕼˚񶛋FT Pc8-n/eԍZ!oL-k4aᜮJc"oOI%=oϨ7hdD7NOHԨ5x#8;v>K mOLeNOk vSw''sTǔcy1YDi*4S32[>W_/|'sRj,*κzV:ip>Ū>w#\^}䮍}uaL$dv>S^OثO 1HQ?7:EII/!C~ڭD`$o0v*UkM-]T֐iv\Z@ôHTdyMlL_]e}nX|krV5 >-77i8P0;Jje~Qr;O|WWxʹ~{~W–Gėq0پyH cϠv_{oK[SpGz;7#Y L8J{my@ԉ-f`@kfپC!v?wsoisaHϖ|m`VgɊRtfmV*ο5æ;,:-[@SMFrqo?wR,$sS̐N&ԩhObd?˭7| Z4pKE}1!}_;76 ?i2ybKF(YîoJ6da"Dkwr2D-4#|gj9a_078EY5^3yNÓ3@s@ t5Q'!ˈ̜\9N{L張yk:Ήq6x-)ѳ3i8hæw]v`qV{hrpCZg'#u(&j(@m`r0 y)> ն𻷖ݨ"bBe`hg4*UثWb]5/`åPD_`^2#ljbD9i"3>i|;,]?Qf UlŐd䁄ykbPځO_״HHfBmOWQ>YӵФ܈bƤz`rZT_MpZ^{?Mmxt/OÏ1O!?0!'XU36CPMKκާ斌0$Kg#z WM<&i[ڎ0YXmMݗjsg&ϩt B)ʝ*rn_q7KU'5q&4 Fv'<-XJ:!N@||Ϥm.3,_puIN_L%Uo';x成|6Ff8T+dJۆV _&cy{W@RtW-ޱB:%yC̾e1t?C-Uҝyk2/?*}֙u9]kTg@W#N P4~Vq.v6Kkx[V*)jHaw>i:ЪlgH+$H~gN5[9[7w%M=FsI?/">yؼc+5oϷy7. aku#O;G#OĘ#RN4+^U<3f{ɟ-36n8c(ۑ힇9D9Hv<4#3GZY7)Ϡ~xkkhkIza;!ӈy7 UKԥsЅRIsE)䈱i/|.4zۧhBvu9yn1ǹP?-5Ry 53oagL :>kڹXף G t~;yGo.[?}fQl/op҄,/Jt4랇ݪLD'CG&Ǔ] OJ=ڬ ?n&zF=,J$?-ħA=|F)9>]/Gz=r)2J8Z?\~AIWbVhH#@YrIH@|4Uev rs$?Wm[. GoٟrLzyBM3Ru6Ɯ.PHn3H Gx˓NeKKA,tdoeO$uô^Z<2v!,^2PM .8z2lɦYQ>dMZ4ȍv"i+%ͪl11qضG!Űz5+)ІCRhk~>yk1J\"1J2wϞח˚B%gw.:GIs>{K{0GKSUc t#\Z+_̸4󭸿uB|YK}U`U篛5]F*i7 azLƛԚ}}H_jȾgp9}?o4kԸY*EPvJC,綠yClmm1[8!]"e/'k1!?=6}-/_gRh ꐑ4ek>W9vgk."5Oʣ_[oǨ4֞o69>ɰv*%{Q^V܍I]OfSF/;yfH5M<9@}VCnR;XQ|w mCJ5:Gr|eO 7e}U40Jwy0J{c+Pz֍BfT]f.\Ҏh5Ah&K! MӐpڭ8Uz5kx%G,tSـC0ʮ;dGcC0ȾN`i0 G2×L! X.-J98i{r 5/OsMo5ɴ[tW_a#翝?槙l|w8Ҭ#4$mQs]?UeAկ MC,J(;"3Uث?7i1P PW?&L%ߘ !Kȣ֖\9 j:Upd"$", #C_?}^yi4O%6ׅƪ> hxOM?sg) ;w]sybiEyw$$s)o9"8cǥZ9MJ8: rUi]|{5dg|{c zcߘ:kMޞd,ʛ*n>=>(偌LbA(lW׭^ ;XiANYbE֍O<;,e[~YXg>!R˯ MeKQIQ5)8cSs}ɏ_'Q.OJpj0X9t/)&3 #2w ?+o{-|K"~$,oZ|=r40<ǛFޕ v / XSR82\H1n]cWbMLM>K8+<k^{JMq*y4G)xx>xղD8G%4H?4F$)Z7秙$pUguNdE4`W[<(^X.4Kvֵ%ڧTbR֘i^C9C(XeNvzVd+MlYZ%9$wvc90 #>},H\ƿ#!bӟ;Xb֟ĢbŊ?oo rG7nIbHcаbW|ժ5x%xS#]Ϯ4?<%_9^(toN;hM^Bv֧ HDy&F2g{o5ϋWԥƒs=Pnݺgv13_8ݏFIRc4!Wm/L^ 3sYmN9ƒX̲c 6ouE0|"쀨ȴݙf4!Ze\y~oSы}gSAZ4{bOjvdԇ_/{K^ߘ~PyO6 >MANUw&|sq9o>0_@[h< N?/מa4:gBıJ-f\?5cQMNfV*N :x|/gv0,aB hApAힽAV(- VGC֝ *\Cq QΣC$LMLEZQhSjuc4Ӯ`{yHx]4Yq.ņM_[p-.n?G & VغTjGG99xսQHi2q]Ы9Hsô<'9~\MFB4=BBIOe`_{`u>|7‘yu[7MW&]U [edZl ;j_]5X4^Bo8Tsd"}Yb?3ɰv*Uh~\[yISliKϥߑOچJnc~~!7,.RJխO,ۍͤ<OFF68HT5m3P 5P8 U +Ge ,yFtJH(IHPT-O}2^d[42[39v4zC$/u[No,@+"n\sDrz\9'#c/EZq\ C5//t8d.}o5sgr .Udi*syD'=>"yǿ?)hZ|!2Ac0m,'P-8pg{+ڃY^=]ϘvΓϷ._.vثWn0~H?*,ZlO=_ZF^LqEi-!5Tv "+䑂\"w}wumcm- dg4UE$#O 12 e懟1eӭN 06E;K'⨟goj6wcv(9c=FU_[@g ^wz9LF4y!2[zkgŬ\cµW;/m{7%HmW1gfkd]o_QvSʹM>S֓\nM??<cQ_/xWiGby&ږkX-1[If p '^8HFwy5{)\y|޷l/R FxMnjY k{CF58%sZ4f:3_짻{UjvFߵq;8/fyO6w._MOÿ,=98ΛNӎ-X|?mi|}?f{.^e#fm+Vkʭ!A He\h#0iS.(e毗e]* RM! |FJsvlRv?jDʼk+O)ǃSԆuu*>.G-2ɮ:ȴ_IɏT^OPg_9>b_=<S|8^aI/3i:an;b?Ql4݁/쓃e!P4}J44+6xmE!ԞS vs26yl]v**UثWb]| 9Qs3Z~wybniݍm.V18_pzT+V;ـ<]vY>hc_Pla!X$=AZr<<ܣE+.4˭,"}b+w94;^GIs#%nZGFsGJh'nb̏͟˿1y̖Aՠ,N*9AnKL_B֭MԔī#gjҏ?P{6g&m1I@ԕ5 S3D3Hyo,`;y{@m"=F̚Aq?b@+~~'L%]{GB'_{~^ao/˰ywH^uj Lrb;7sG,xqKث󇒼/W-X󶸌JSN7S/:Pb3hIRK*{oըڏ/8ȆSot1IȧRHOaӗry+G\Wd?Xw$&o;H7?6[K1j,as@PohAm9\Gmwߖ-(Օ[Y_8ͻWp1k!ݥ/{':]Ɖ^kpZ[5K z3:0dE_vRGFCGaljTPU5yc3{Ѩy?̶B=L *I!*Ա=3H3/{O*,to+áiM/]G,{^=랻 8CK"N򶩫 R[I$ E2ݾ/{_e9KtX5VO(/---27RDP®]0+eAg?OK%?7y>/-@u7qFX ?#!G!`>/u0Wu5O(r%Oz%#"KUق^|8M;6k)r@:yc\M% T?uZM拨IO/nyqBT&@d@jΙZ5roԟaV-48`1 %5dTsXZh%-n.d`}gﴙuG8qH>]5d_Oij/>w1]B81qq}?lli]x֋tnCNW<'8͆Pۢbso;h$3x%F`(Lç¸ YFkm2K=ԊJ"dWpI<'o1~6_t|Z 6%c *(;3~~jpCbL z^Fn.coR&O뙦6+Xn 6b6#lGtXіJ݇^')n Y.W sk'y{|j0آ0aipU5"s4 7㐖f>Y:i;z9e +Cöi5!0d6$DN4-5eX.`:PbO+oS׫`Iw ռWKaU\ϫ>̖/\>ǚ鿞c}M]u4gP? 5izO%Vh7WW6m:''i7CF&\,Q-DHȀ?15ig_ yG~7,Z+8Kd_j;GW[Y%YiqqFI.Ski#2kon+؝'lӜ]ܐ6UW#rrv2!Y?'`ޕ;ig֓n>7}$I'/6\9b2LqxcDa_>v5GYkKeD_s4X` _:Ϩi\e3[s\nIDUPY!\(S~vچ{{!gxbu„#dE aPntZhA^%t3^ .~kLg^Mg{5؇ ~q^8GGП~c\YWћzAX>I/ʻWI|G9Ή;v*UثWb]v**UثWb]I~\Լ quj='8fSFSمqW喣yqu-ͧ/,9i$<9r/͝_Qvm`霪OQ؟f~S`8E虘;v*UثWb]GQҬ忿EmmNɐc݇ B|4K $mV-i pvX>~9v>_`征٧8DZIgc@eexKlDMMPZ~]POּx1momG]4Q-깽un]|w9;82=ݩ2(iǡmzʃukB`sv=W|3|m%eqIZFp9U[}^qt$V9Xva9 _51GXA5ϟC#F1==?-}cK٘pÄswmykx~k}2I\ ƹF|W3QHtjpCEalU};G@<\W__.1azq]kZlvEB} OsC?ޮII߫Ϳ4<>ym#[ޠdH-,qǜe.굚Q~B~J[~U?\x\SEmVhxT٢ |U9ظN]v*UثWb8WgζOjn//22 _5y3vfYn"P ?bh~ˈNPy1bCDX G˅I$8GW W anq=Ubu6FTu?'9BQrc1&wO1j~Vu=41봰Ԏ v|&٥zmeiz(ې̟ wW?ex}ޯڞ:Kimi7'-OY#օfOpWwחKŸݍsTG-|s\<'SCgWŒF.GgО\%)oT6~צ"%~Yި:rv&}__P ?2% ~L{d_gy տ(ۨiKy@^*+SmWc4݁o!~&Ry 4pҔ#OM|\@}"&\B#&׬O[=fĤxm(@_ a<ʶE`Wе)۳5)_#\zF8hTVOl_6c߿pY}5{$5=K ÷Qfe7ыӺRʒkքFhsb049;,r߫;KiS*ME~KIDE#r?EWǚ4` oBE-gDf/v4dxkOyf|mo#׿cyLJ:ba~}|ML%s$HB=Dnz~i1xacRʷ) Jc@bsSND@]<+D\j\|9IZ>\1G.OR`+EumC7sD@?qQvuK񴚵[akq%j* 3+CQy8G~ENġDGP >=E1>esd2fv*UثWbX?,/߰??L.]|og%אp_R Y aoP~6Ӌ%>?=0٣$\!/6mHFwҔJ<3>,2X-J6w$ZۮJm쬝H~C_ >3.'Mv} G\\0,æ{M >1g,323)ثWb&$s LFO2q=%>qu 0.vRpe<,%xY^0QN߿ N&W4ڟX/ b_=~b[$D-6Q5]SV=ۢvl*Fb>j/vodC #_X0ْN+icH–r7li61}y%M9b2;D>Uji/^eVG+~h=˙来GS*@~;3v*UثWb'?e'̾5ws\ۨHk֚mfKnK17 ONZj)WQٰ0k.jk h䨊9`%=({P#ͪcߘkL[F 2y(EA$m\.>9HٝE[aU QޜYKjJj+]ڀu9cDG*Ot .\\<=9T>9;Pfgşfڃ|汮O&ت:^:xkn,\CK\o0rkZ m 3΢{}#C[GEilZ=ppD-U<8LxDP𲑑MRd~YYWvi-%Xn`Sӓ!AV4aCNNarꉬ&CncaͱYb' \Ϣ1_?= =B( dzz}~eE@|'9y~bkIc .# !ZSUa3h`>_}S7_Tn џs?Kb{Ocq3Lw領3s6KyoUlZJ_$}nc1!aJ&&mbqsoi \]J@,@'l",MZHk]-WP?ii1^˜^oƥ~.hm UFy&6]?7/vKOipPǷhOּ}-QCB(JӜPov.':V6N~!iW-ABꝊv*UثVUŒZJ+̾G^>wxI5/ >|yG1lQCD'Z}_Ǔܼ'4ֶDkY 'kG~z|55sCѰ+?gʞwkK؉k;ũ ae?zmxO$I%S""z+zFT2=#rψH&6'Lc-QQs{܈n6MS Ѿ XD) (,i&f' ɴcI!q=9*mWMlbDQzh7A ޥ4#AӗS׋g9M维XJ4Bޟ_JRԽH!X* y)Aj\2dFS;BD/2ޤ fq˱r"XU#;zfЩ$Ų0 m -K=+P -)Sփ%=To86[k=Q;L x4*Ƽ~9ܻ5{"_WDo丼 W)#0G@TrhgSJAVVSB.X < GcBaݽ:5 S1 ئAݒC³R:u\ěvP*ށyR9Z)obz%9HFDè;Eq<@RDƵN5F ğs$Hlq'H*J:Føc#m1\DIq^GU;+ $,]Wo-8py#(KxKqgޤGŢkyO֌p חt)V]>%M:Ƭq &g##̦k[Wb]v*UثWbXG8{uJ+-T>i ,$~L`m|hmum2BrDۤq)9`e5'.hSS* \Os:2z A}e ^ ͤG`A?ylU~&/KPg@3ռYs.7Ǎ唄Sű6VUw儊;i 5ߟO/_w/u;4a<I jnFV{oM6eG{+<%@_~`KvqKao "}nB҄?#4_d=g/_ RPoivܽ̕䖡C]wL.#5H}S]v*Uث>+B,/\KA#ek_3`b[8$v;E$7oyj!Y|A5zl\$^ C4mD/X3Gy8ruZQ~;Plm->UX%^*3HG|p0&'Dbby?˓1Ni3^xDo]&$| f]z9zL6A'h-.sgU3_rf2M!2. V$̓q݊v**UثWb]v*Uثſ=e:Gӎ;ERuՏ؞K 0iycB;rǗzqffVLMms}8_GEch~v,ɬ]IzjITCFh5ZWw|\?LkZy?M{6iO/7c쫚hsjq|@tq){/'8\^OYQ[QɄcKWd5Ȗ{wo'Gl;Q{6R-(3Jļ8$Vcl=.njTG~\.))e4v*UثWb]|s98ܗ~H5>Wlwy-ʲ?Ѿ&m8.nN,/1R0ld1ZȬFifõ3q{2(1AySҙъW:Q[yz)oA#V5RaɐZ66~Ϩֱ?KCP:GlOO)t2O&3Smdq0ۏVIaANvob;v8cC>qO|y=AWM͞GyFXrEfֻv*UثWb]v*UثWb#GZ>s6Q.&BTU8ȍJKU#K'/0ۡ(f;~v2c[NcM±#bT֎b!m&V*XE| ^q;SRiw:$JrDn,ߖ1e q;R#dWf<140EM3& BV/lUní-Պ4$'"] Z|QQ?{;l<ɯK-CJҹ,Cq̺L' Q6 27yu x&qBg ?@|:rGr|z|%ZL_$gmК~˕OI(< [t[SP-5M9.UVdQZѕ*(J'BCCp9{P(U^& w96-껆$gN %H 7NٝAԓme^`aDMCVO)H' 4*ïfYQn_HF/[)iiC$ݏgy0,#̆b]fDּ¨d?p\$2!%]˾rgѵ sG*e$fbB`?[z)P\/ KY@-Q|ãͷDᢜut#5ٰYEn-<#[džuZUUz=CU6My'}idV֠ 3UѐHH L_\H!v $sHKק|x_wڡ/;\+I_UkTtY0rbu4vȾ] <ӽt}?UB- x=Is#AyFGGv*UثWb/).<7?-kHk9S9:Gb]*UثWb]v*UثU3 b;qWqS37_]y^-+S#=IXH 2# >K/>e"=ڹٺ|2~Q,y NGW׵R Јӱ[H4r>?Z_`OQߑ)Nf9޿+UfcN JfY\UثWb]v*UثWbXWLjt>"U'R0Gx$|9Y m)f"U܁2Wh^VVd[14?.@g=lG]]ʭ3 LЧO5|Un;&y{[wShF!y󕵁14!X²PV"hkє9lu")ukGM&\+Ew- P*ٺH>?]B|pOBK][/?5Μou 7.|&96Ywzf8]v*UثWb]v*UثWb{ -R}?R W"6YA8Kn|):i׮LyVi!'qm+WG<2@IfC}wB:i:[FbjxYs_ ǐk-8 94l1Z8Fhǒ=g̍&`p/hQɷ?ދZ1Qb1$)бXfyai]MB)4yd=oݛ)ʡ; ^8rsFhjR]NykD:=(Z|EfsUثWb]v*Դ ^J-ӯ"x.P+qW. k}Bbl.lVn!>D2G7i՘Ɉ춡nm%Pe5g m'Ş*?'< E}GA,#Iߢ4dݳeݣL8&89r?!h!RHZ~|SZ-y `Ԭ7 $r=D;WM!b_dSgg~!|rw$b'IJB Uz&n˞zF+}y~x=^\ҼZh," 411ݎn`Gu9,̥̦{SWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]5G>X[zUʔf#|/0\KP}>=)YiNBPdCOF k? %ͫ:U}0Δ]$jTD֟^bh b7x'~v=ߖ\CW>l"GsKk ior0'2q{NO4 *-?L ,Q"*fp)6‡b]v*UثWb]v*UثWb];]y#Km%dk鋄Xt>|>*5Xh:YGJ,Wq#H|ɄK >eWYN &qAvM-C)9q|\\kotIuboQ(3ٰh\kG28JX{n'jGE[%P-CJ@~5/{x 48Wm̼xOWKߘ2,X/~!&zmjAolǦ͔mi>_^~U%32CǙ5Krd i6 fO7].mdvU"`3h]v*UثWbXǜ.h,Yk0muiSIE: ZAkէ7>W5?/HkH %`%%?Q,-4|ߥ'Mk=SB41%@WE};p/kpcj ki#ƜYy>l9'Yy~XuyY!3ihH#=jylGt/iZv kJ:ls>12I6Q$;v*UثWb]v*UثWb]a?_Bю";Rwwl~%>dҜ|8۩/+u|Tiw:s'̘2`1ϭ?%?!龭?5Q2!)27f v3=wȿ󋿜f)|-0,7j+Xiuf6>{۲v {c^Y[KnZP]ԧ]\2vUtX` Ϩcr,3gb]v*UثWbPaiWu4W6E$l(UU'͜jߔz34LI5')#謲}I Xu2˓#EeJ_8ϸ1?َ{WᶙM H2AfYH I#=Ǚ8{*7-9 ߏs -.?NDp[¡#DfTI&#$b]v**UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتUudu e"_pw\~o^WvOs%sgy8?ItKi7֐nRlŖUuHpChnդ+lM>aʿ!hiy4B/c<~s +B~QAm'yٻ }0>! ?2qÐhyϙz:PP(:- ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Ubiopython-1.63/Doc/images/bottle.png0000644000175000017500000000306512250104543017025 0ustar tratra00000000000000PNG  IHDRq`gsRGB7MSiCCPiccxc``哙$PW~AA<17-RA|/b '-@\hd.@HrAd;AՃo~^g^AiBHjqF%9 TɥEeP( ܣU g20x_ZQq/,L(;u9 : @:X!(8,5EBDW6IDATx_hEgvrm4%6(X(҆+  QjEAD- J֖yH8ZZDBJp:K7۽ݻΐ /} R+p7SJY7[8Q p*oW0yި{rWekKڡ=|(UZ3|JMk$l"Kϫ^ "@5^FN娆׬8=:j =^C_iл%p,7.o]cI4FըUPibyJ_tdT wmmam:VZG/NzKAtI2NB$3~OǢ `(_G|\M<4_?p[cK|XԂEUD3eFP+X JPiM,qb['#쁼uh]q-'kiloX+-WPnUFPTiJ#;{Poik0,pl'9ТE 0VQrEϽU%Բ4 ЩFըUjڊ9YZu~*D L[tGHyyrJ?7%kwFjƲ]Cn%tj{5;zC ֝T wu>ʹxCH@] «:YC·-NdlP=ԭO!_/֭VI[ gWtt)NMiʜiWLW & Pm!vFZr2K=y64FըUjT, Bz6~x%\sՒДK)RBKk(9GLUUTsWw}z 4k׮1eʔZ>w^^^ڶiӦ I&Ev T:uFǎ ^u]W}q=_OK.wF PL6-rrrb/\~ӟƴiӊ<(9㮻hٲeE]/b,_H^:_`Alݺ5>䓈XbE̙3'""<̨P# p7Q;裣u1}4iR楗^k֬Uٳgٳ#Jի~4!?/r=VիI{4M&M&B&B B  @h@h 4@h 4 4MMJF%ˇ~ӦMT*e(v2@qYYYѶm[àDyꩧ &PܪU;v4J%Kbޣ @h 4@h 4 4MM&M&B&B B  @h@h 4?\pA4m4*W:u'իM@hSƪU.sF>};-Z?oŋ#N\jԨ9s.'&j׮]p{ѿhܸqx8oUVu}w^t)jժU$_,g4?[nm";;;㎋Gʕc޼yEv엁6nJwq*@H$""l3gΌM6'\d_P}# QF9r5jԈ/dàDiݺuk_[nDDl߾=RT̝;7Zj QFży[of͚}#FBrss#77J7/_n85k¯=QJظqco~}ͽ \tio>"=cǎqرckq42XRO>)+3Ǐcѣ?#a>ضm[lܸ1?~Of=zt3zOΝ;[(˖-3fq+[lt*Dyw C{4M&M&B&B B  @h@h 4@h 4 4MM{饗3ό DŊe˖qW… M@h͛7Gc„ `+cժUѳgϘ"{ߋNJ+asΉ$Ibܹ{|m݅JCwyg.]:6m&=z!CãGz̞=;:vO>dt8#㏏ի />h+1a„(_# pvmѵk׸⪫۷GfϏݻgnhtI1cƌ;cQVhѢE̛7/zdG%4tJ 4MM&M&B&B B  @h@h 4@h 4 4 J8묜6,(Y> @hŪk׮q@s fB(vW]e<&jޣ @h 4@h 4 4MM&M&BFܐ$I|*U*ʗ/_ e]O<YjغukDDuQ||`evŊ+⬳Ί>;Ǝ6mիǯ~8sL Ç[o?gGRO/֭[t-""WO?tQB8ꨣL  JI&L2W*@~l۶m;Y&:udbh|'VXQh|0ڶm֭;;"NG*UL$s=T*:tӧO+o߾ѩSXl~?#G:*Rf/t:t:ʔ) 4N:c˖-Z>~E] 6SƯ~7o^TVm/.]Dn"IG C=͛C +4iߋ>4#"*V}r|{l{tw}wSN^x!+~ӟFD'ѭ[=zt=z.-[w21D&%Knnm͚5ݻwǛo-[,|bqI'l]v<1z7n>9s_~yЈ#"++?V }f[;/qE^^^m6m{h.[,jԨǝ*U*nܹW>-[bqGZ _WDDl޼9J.*U'Mڵ*(RW]eUVZJM~{;th߾}D{4ٟ26lǯ~8# .{olݺ5UwalSL38#J.}{+W7?KvڱhѢB[$n)xxG2h(~~alݺ5֭[J?>vSN-/ѿ7oB\r3fDRSNqTN6o}D2ebذa&>)tF[VqѠAXlY,Y$*WZK.]ʕ+ WT)v:t_=tbbh~F9қ7o͛7G$Ļ[huu11-4'Mcǎ-ЧO/y&fnݢRJqWǏW^Vw\x&I''tRDDlٲ% %r>4?e̘1&@HB  @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&Bs-^8^/='L]t)UV@FXxqz{lORDvv!AfӦMN0e2oUV-f͚I0/;;{^2e]e˖:uYg˗/7q2#Pضm[m5j:dbhs9ѨQh׮]TX1?Ɯ9sL2ּy=?> 214;5kVL2%o׏]ѣYf@Fɉݻw|BkktJ0o@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MMWyW_~ѤIXb4k,ƏoB͝;7:tq 7k1m2ŋ#Nq=z@(]wǰaâ_~1ŝ;w6m2oUV-^R%CL [n%>5j𵐝](4Q/Q\ذaCD*U裏#GM$!@1(3oVRٳg;Fs΍)Skψo#m Z,)qRjGA?֭[ժU34ȴܹsgر#rKDD;b3'1bDdeeږE<۵kKdVeFDDmàdf/~O?UT)./// m۴iSf:uW_>}ɓc_&Mv᤿+'yoQcaӨQ#фK.6m?QR @ P9hРx m#"7u_:oӦM 0 M7oٳcR x Fq]wE-bܹ1phԨQ;6~ӟ8sαk.ShR3a*mM&B&B B  @h@h 4@h 4 4MM&M&B&B B  @h@h 4@h 4 4MM&M&B&B B t:{Jǝ=:.Bے$޽{G 7y2ܹs[nUVŦMAqiŏhҤ*37N8eǎaÆ8p`R) # :4T*x饗7MTP!Əo@pJ6mZqFg3XӦM+x٨QM6qWDcҥXߣ9}\rG?2i2V~_~_\p Pi#@h 4 4MM&M&B&B B  @ho^z)`[gԩjժbܹѧO;E[<kl޼9ׯ&L ĕW^V={ɓ3k' K,IRT2cƌB;wjKoN 6IDAT{&T*YhQ;v$͚5K8㌄3T*Y6lؐRdرfokKʔ)}}/z~iRNcɨ:ywFŊ?a\pAk /|m6l;w.V\͍Gy$fz h~xcg[v{l[nm+_Wl3‡zBߎ>zlݺuDė.~;;=n:$wy*.W^QLhذa 0ᱳ/klܸ1^y啽i>so;wW_}5ƌ+VÇgF5jc{͚5 ^Wv5jTL6-z޽{_iԨQ1o޼[Yf}/]w] 2$-[Ϗ޽{7C ɘ:YNmunذn~oN>hժ>?v~̘1co &İaì _4ի۷.(Ν۷{Yߨ<㭷ފ;v+DDDƍM4˗W^T* 6i:^~fرccܸq1vظk}/֯_+VȜM{.IR̙3 ޽;ܹsҺu/}ݗRd{^|nB1~o|$J% 0c>b?|_R~κ?q)S&پ}{Ƭ O>IJo9 0 )SL3hРtɻ[mΝ 'dgg'~{&=zH*W,Y-ٟviɍ7ޘ̛7/\xIjՒ#<~|'gNORٳٳg'۶m3p8qbJ38#YdI7?so!C$#GLf͚kcƌ5kΝ;G֭-X@hJߔkŸqߤdǎPM@h(7n??ׯՋaÆ֭[ ӰaݻwSO=5Uƍ)S)jՊo}[q%ŋ^^jU+ώ5bGm۶*UDZ3όUVfwqGQN㭷:Yѯ_hܸqdeewӟTh3gF:1rh֬Yj*&M6m*]E4k֬}7aÆq_#"K.N#N~B/s&@FիW]6&N9991}޽{}RTq9D6mbܹ?""zя~;8㪫>>ݻw4i$nؽ{w+~O &Dݺucƌ1uh޼y|s6^{m̝;7N??^!CĭJ={ܹsꫯ_guV3&FYh/8hܸqL2%Tݺu?^zō7rK,Y$,Ygyf[+4=)~_$T*9 m曓T*4hRgܽ{wp I2em۶|-'''IRɜ9s ڵ+J~l/R;YzuJ#<2/>gΜ$J%VhѢ$J%Ocƌ$J%z*Ó:u\7t:\xᅅ_3ذaCKqF:;w\k֬lg/w׮]+V%KD$ѣGB}2 'PzͣJ*ޡC=~yڵѥKxWcܸqc /&M$Ibƍoذa/_ж裏 Y&ڴiUTުUB׫UQի#" b˸q"J;S_vڈwShf͚EժUJi׿F&M 'D:u WT=n`裏b֬Yg#"~> 4EŖ-[rʇd 4CСCOf>:ꨈ{???UVlEM ,X`O>䯼g!Xzmv특sg?v-(fϞ~iԭ[`uԩSދ} '?~ D6mZ 2$}z }xg}=P&ŏΠq~^03 ùsܹ!Bvu-+477 ȭ ! .BCC]]pQoZaN*W\ꚠسg0$ BFY\\:M455 ( WW!H|-w!'B! tnz)ɇBH+B!HعA!G B!< vnB!V233_s]pعA!R&N8vׯرc׮]ίɓ?عAI|Ǐ92S(&MrhY-OR%''ˁpcǞ;w~/kl{Ʀ4i_5H~aҥ ]820a_UUՆ ,kχTG K/9R,ϤImۦVǎ{ɻ+((f8pq|||fϞw@dd$QelVT!!!=KJs`ĉ'N8ڬp(rC\߬=ygʕ2/CXj/YruEo~?O3g?~3PaΜ96*6d:7BDe6/ݻwB}]xK|-7fȑAAAD|<M?GEET*qĀ8 fVۛ2uT줥GFFնPbƓ wׯ_X,AAA΍X U?裕+W\rʕqƉexO>yҥZڭ?~xll,;w<77W#FDDDO o5;v,A*}ω'o;ˋ*--S#tw:t("">r~[,5???xΜ9}Ty>"qIT(++#W-Y-%=-7uOTT^z2o<x'ΝK4oNNX򊊊+33_~=$$>HKKkhh ~}}}\B/:4^#lB7ooooox???(--m~~3s1R gn䷳f>^:%CW(ewCn~ܖpn/hz]]]TTM~\zR &LXrRLLLlooXW_}5gFL9p &Mt!~b?QdnݪRϟo2hzuuԩSJرc}]`~~3sc`V;+֬ n6HjMsQs\ 4DRmsQ󳳳~5zFȉI8T(F!b?G3M !&p!Bz( .?PEȵk)4݉B` /|%G}B.D-K熾!G_ԋfWW!Htnh<^SS܎XOKfϞ=oʕB!~/~y[.\p׮]#6 )lRLV׬YCH())Kdѣ̢-[6bĈ(ҟx ʇHGh4ʹG'C >9՗/_su?mٲ~|R[V,'deeLxjȑ#===BիG'h4,iiiW^ RyyBɹr劗]yF]ʲIٽpk EEE.]jii<4bKoqϿy}_Mtgf&2L\x?B1cDb+/]tmmm&iݺuK.%"o.V5L|}ݙVns9fYRI4 4% ϟ^99`WA)GHϯl6WVVZ8===b+KOWXqgݹalf͟$j5߬wvvo-t6d2i4"r*!9xRX?d?Ib|6lX~=!$((hܹ7PYJ σהunUUU'7$@UUkj9WqF9s&!dNۓ_S?saaV-**"lݺwcF~LdwnK[0]0;7}maC?rNbɴqFO̜lYbD΄BHoo'Jwtt3gHoDkWA)GӹAhPѓP֯9s愅9rO>.(o۵k^zd2Iqܙ3gz{{;::$ֹpnoookk}`׳;v͝>>\:SRRj[n% 9 y~%>tA.GOBUR(¥ȱo)q? 熣ggggee|_RR( ~],!Bș[Ff"B!3aLBy B>3a"BȖDg sFB9rCkY4s50vҙ2z2sCz{{s7k֬{+=u_ZZz}]] 9iβFSPP@ ,)--:yhh(;vLt0**:::..nIrɛvP!~s /gN<1)G8Sӕr}#43 sźVd3Sb#GBRRR$[<髫KJJ""""""jkkizss#}:!'0А~eƍJrĉtMMMDžIMf)S5k[:ה;7̱tpppeeb)//9GhfubI;7b a Er;7)))0br+ѣ&rȑ|\x`].B7Gԝ2$`C?r&.]tmmm&iݺuK.%/ޖ/_su"69F2KG6r37EJr̙Ǐ#43 sź Y,BaX_lذa[Gn禥߿wǏh4 ;;8&p6E3"Bΰ!P2b/C#6zj& fNQґ Eff='l6XBhaNXKY:N>.Stzg=qmLc;7g]x1!$&ܸqrE"1 gs0"Bΰ!>&j4iID_6+)JD9F2KG6r3g̘AWrr2MI`0;VTjZz-NΌL˒Y:!{5jRٷov6b㙛 .|ʇ~H$Mf!6 gyh'lG~f*P~ Fo&f63(Sf^S"s3y䆆ÇHd^A8AD@ҥKW^}}o$Mp6w709%%EV[?P,6҉"""t:]II U9ƕ_:ה,[LV{{{?˖HMaa DOs#tqصk/([?֠$aEĦ3lGf9a"'(2;7 z*А@^}C@aaaffj\ )G!''@]Ը !cK!Bȣ`!B;7!,Pv B-??_Gűs Q2zFGmX -x(ѹq`0D_ 3?rE7CgffY-`0(FSPP' ۶m իϟo04 ,fǎ-izhh(M7**:::..np69ٮ~!ߜ'e6Z g!ݓ @yyBɹr劗Xu2KgHxFC = 378=PڴiNST&M:x (sssiQFM0%s<2wEIIISNUk׮"fNT:d%|Ies%$$K᷿-!$///22W"u m޼y޽UUU---wql:>6)MMMDžJLL2eZ^f !'^'`X6nT*'NXQQጞGc2'9: €RիW=O>h4mnkk݈Q9;i999ׯ_^ɖ-[˗/+JRr@VVd*..)LjB̍3`y[hh#p@-$6cߘ]|3|IM0`S٘7!/^)!== !LZd2loo߽{wffU$=b9fYRIn^bn5^S1M@@ѣG8pw鞞v" - HeWMN߀R!((H,@΍5CJp)!!ҥK---ҫb?If3%sr93!o߾]VGGG߿򪪪ĉoBJ:"4B2228h43gΤ)hcf ͖]M wfJa7믿a6Ϝ9I8&J,4{ƣL&Z=`6+++n&3'`6srrVX!S{xM9;:7ijbx1Om0M+|n0vXRj{0͛"n(s+C"""t:]II K^{-((Hզs aaa=CMMM9)r'tn&չ1fˮ&Ɂ q ~*sl]̜SLSk֬td)Gvnci`EЀ4a ZXʫjNŅD%sǬ9rdll,i4׮]ks,kkk9寓oJKKGOkԴlٲ#FGEE-!>Ou߬,ɴgϞxt׷Lu-]lVhؑs˖-˗J#xM9gM IDATX'2 B2#3CA K[Y@ΊDhz"Dzoh]FS~*s09@σ q7 VglVT[[l2hi͡k޾{UV1Zґ e G666iHȏ -,]lqf=?cOOOkkz"bwn->Mq!ŋDє߼\' l`C?&涶Fع!"/5vdbLHH(**tRKKDFb숬5(rgE߾}Z޿?UUU'7$@UUs#ۄknS:sqʷ=ぁ>>>҅De̍%MdvzlG~l6X& ~qw鞞vbؑϯl6WVVZ/.td)GqBTp`X7Թh4ٹ?y!9 8{衇hbsssJJZ~XlqF9s&=v3kj9%2KG6r'tnλ@bbIscn46?b9ssٹqNeE;p<{QPy*z*ٶ"7D_0^}C@aaaffj\ )G!''@]Ը !cK!Bȣ`!B;7!hT(n 4$`!ts8JvnEVV N] Bwu|APh4>fضm\]]P(V^=|hRRRV{СXooof͚w^hiiIMM  |GifbssE|}}%*յi&NR&MtA0AAAwu\zU/Z(--nR)44TlqhTTqqq? Ä+_섇 Xpה) @yyBɹr劗X:l67B.]*L\|yNNׅ&O? 9{ϊm]URG!s8/r ^8e???ZfӷiDDDDDDt+++G7œ4pUᄐ<ŋzR5}tGa )Gvnci`C%Spppeeb)//¨DVk25!7;vҥKo޼)ř;Y%^QQa]I(k)1:ƜBdNIQFM0,YP(Z-(95A zc=f6lwΝ۽{R_9s_q,\ƇW3s.\|Ç?UVVuq @h ~qɧpȯD; _>pD)N㤋Ri'66FinnZ1ohڼ>+}]bqaVC{{{O8A眐 R99&<uvg쭭B2aC?rOs=|HpBHBBBQQѥK胇EAAAҋ W)ָ[,/bÆ ׯ{$ENLp۷oW<'7$@UUs3f̠+99&677ꀀT:`&EDDt5*Č\XXj![ni43g-.CU{GT*cbbgxFTZ|JBHPPX,na.\o^WW7m^!BK/wfsee΍lYbU1s2;78zs, Q#pz&O}က+9;6m6m';v짟~z'iʕ+kkkwiXΞ=+1c)))!!0oZ T4rYYYLLF/dcV(W?`h4)))b5**:::..Db9+4sq z^Չƿ]'3Q~i&DCU2+6$6Pr sIΫWrrE~̴W UrBs///j#Gh۔"˙ Z&8>>^ 3ǜfX|x#; sԌ?n{ !SLSk֬!ݕDDDDDD֊%Z,7+ʉ'VTTЂ9 ãrxM9sKí(D23/q CzzzEE Ic93CA /b6U*DAbI+洐ÓaCLqW|ʑ#GB#!1=ZUbOX]ꁙ(B^T*O޿}XS]ӕrزe peR/HGo{졣7f]cG*xM9gOaX,_|ņ ֯_Oc93CA /$QXm]܆ÓfC,<;ϭӿfddxbBHkkҥKuqΜ?W4s٤PJr̙Ǐ EEE.]jii荙h^S"'p&ߺu+!, \UU'N7|UUU{」FR*111#0c9P@XXq=PSSDA 4̙39mCɎfC[pႏ}>k'ʜtlGΩ`~B`6+++m3Ѯ#r Qe ksNAUrC$SiӦ߿mӦM|b@@c~'|\vΝٳ3f?ԩ{GN5xqw̙ގD9{lΝ|bu{:{lBh"h0͛***8ΦZԩSt+ ~imǎ'O;iNX<~֏ Q9VIx)D{֎?~DqckgϞuJsȐ6y䆆ÇHMf"rxM9fn&6׮]KMM^ Lo˖-SǏŲ%&&ҵJ'!)G r9z*eLh4nذjjj/ߞ̙3gݺu !dc(B9 !ih!B!=B!]sBy02lعA!<|عA8DhxuڵFWeG熾!(E%BNSVVh hhTTqqq`0 Eii^uuub9‚ZZZRSS}QVСC͚5k޽4uTZvZz"ד >3\]"k2D1MgΫW)G83--ի4d2ٳ'>>^"'K_d2[N"N+--5山4q˖-˗JD=K[Jdf+†wnh0? !SLSk֬[? XRRQ[[KӅî9r$h sViB^T*O.555Ǐ^~efAb&ra9^>Rl6T*L̂g$<88bGEEݻwgffWId? G1`dX,7n W*'N=䮰!{!-mmm 9\P\rˋ3ršxM9gabAAA9i4!NTΜ941!!ҥK,z"糣s|򜜜ׯ[IɶYtKZ\\,}W=ztCCCWW'|hp q7eQQѺuF1jbE֣7ƍ/JCO~J\q)^S2 8qpп朜+VHdb*k $544JǦ%؝fjM&~hmJߒ2s J?q{aC?rOs=MMM|"s&V`=z[\*‘9ršxM9R;Э[[_(qC=_2ܜVRSS%F3f̠熗Wrr2M|ׂZmzz:qtcD.a̍RF{oۀM;d |dvn!/Rll,cfĊ ћUIm+CO9rΔy\r'Onhh>|p@@뉜~ >mڴmڴOo̙vǝ9sC:'X, J={6qs]|yqq1\vΝٳr!!bծ_{{=0 teggK0<<\՞:uN0ͥBP(œpIx뭷hjJdɒ"Ξ=[Px{{/ZH #BIIIP(}w5z"gEDDt#"Ss 4̙3iI@N6H? kP(h4nذXٰs&WW||nwD;c233333.=7!P Û׮]klltu-<ѨP(rfeeṎBVYYYLLFgqFcddJP(JKKz^\BSPTUU5>յi&NR&MtAu;vLq X]]P(V^=|hRRRpСXooof͚w^HJJ:uZ_vX噉bonn^hoxxc2fWȚ Qߐ<7E~̴WDf{`gdb.Nӳh$`sCE "''ʕ+^^^bUtf<66&J0Q̈ÁdIf!!l熣;7̱4܊rOX_C,3s217n \xYf禷.)88bGEED᥅bgFx_ssO>'hZ>1))_?P(Ҋ^ o s5>sÜ9srW_}QӅ|7]]]ӟƍf666B Cnn.!mF;iҬ-[8\>G}R._,Vr .!g"%L:~x^^^OOώ;jX4L֋S* bbb@TΝ;/w㤳 J2..4111qŊNN|gg'qaIan1фˊ[sk3pRz цři9h]x?B1cvM w2k.-4t ~fƺVzfN&lܸ^|Kln6,XP__o`6+++mVbSyaX㋋M& VÞ{BHuuKs>Ι3g]-d5XlO?-s{mjj3g߿cڴi\,](XP?\r%((hZlqa=cn͛7 !>>>tjta0`۶m/ M?X---ֱM&8 "44T,Y:s0+/vm'8}f6 U퓽 !w@_Ij髺mtuu=C0p+={v.Nӳ᥃1˹/@yyBɹr劗Xt:]iil.//ov%}0ѮPL` %"I wᐳN[dGl\X~CsK@oo/~0 fJ%8Mq!ŋJ?^IG]Mtpppeeb)//w\j,DkZ$ 6)̹ Y'ܘ93SL5X| pƬ1BɮA5ȗHOB/>H-[VǏecV=H&U^̹ Y'ܘ93bsVByE= ǜdV~s3"j58q_;c;7RC'ܜB! CѸ.1B'p#B0B!< vnB!Q~ZjĉB ++#$06l|L ҹ9kBh8#{L[ҹٳgk[rBvpx׮]pŸ#{!CA#?Tiiѣi00 ,? qMM㽼|||n_~"43 b&mfF.aK[C<vnIJ:l6DX '3K# ?%~G?(BKcK/]x199yΜ9%00ƍb9BBB|G/_3g\vw!wh]0100ú]tiĈ g?BƦvzrrrhἼxxdz?Bg// |a:aC!BvnN B!Zع(:msN B.66l |p!VMMA-(++k@s3 @T B$^k;$vnzچ B9k׮566;7g3mC BIknn^hoxx8 m6kӦM:NRM4Oͥ_*UUU5j„ dBjO111,V,&&Ḟ8n֬Y{MKK#+P~ő__|&͛{﹤b 4BGG+F]ʲI,_<''C?^z ]]]|F1|춶BHKK}}=kFFɓ'j]XAv@YӕXm[ _BCmmm¿۷&L!4$`;7V5L|瀀eϟ?gq!ŋ4g]x1!uҥ}Vպ8&pppeeb)//bO.= k~>mc A!tvvr'T*Νk}ߢJ 6TUUwȰ z5/|5{F;7|>yBbMM6ǎ駟|Irڝ;wvvvZ,gJs̘1?p~~ScWA7oꫯf͚ŧsw̙ގJGb<6RGuuu: m߾]VGGG߿򺻻 رcJV+7o_!!!֫=~8|E67g2 [B 3f̠ zyy%''k8N̜9Sbq4~~>yxk ]v-55z̓1/t^?!`47lIII555\ۻᄏj*3gκuǚ>}zBBBWWט1cv5ES T]j„ gΜaBT@@@gggGGA ???;;;++뗯r:z̍}Ν;?f!!!-[o!B3<3ӿ曃FGG;V!OB!QsB!B.`4iɁ*++9Q9Um N"OB.)rQߒTfty* \8 tڵFW3a!S577/Z7<>^"Z>rHOO!$%%zѣG744tuu}'l6KouW:l6Jl&sq' Bhp_H!՗.]Ͽ;gΜvZww:rһڲe˞~i7o޻woSSӜ9s86m+WrH,^\\P(韺j5EzőLBB`5-LLLyffffsZ,>3gNNoj222@TH<=Ņ _]+ Ra!SM6mmmm6m9s愅9r:3qgΜ `…9gϞqܹs/_N)rڝ;wvvvZ,gڵ9v-^YYY__ͯj֬Y;7!owؑ;y; w޼y:lg1cƈ#,X@SrkSNF**,,gɒ%EEE+ oϝ;\nԶmև~nmm={BEhb#0*c|73f̈O#Q='Eg~%4;mVRRr%''4QB!AO>=!!k̘1v"௥B!\]aA!G B!< vnB!QsB!Bn?7nτ %΁/r K;7!ºuvuٰ0Dw~~VKJJU8ʻ \2-X>HDvvZcckTعA!<]]]6mt*jҤIuY4P(uuuDciZN iii֋cDŽ_,YDPhZ}PLLXAbbbb4MAAM1**:::.. B(--zn໎SXCbcc95k޽{;DCA@.Ź" 4BGG+F]ʲI׬^z ]]]|F1le{ԙp-% .*#|뎻Gg`9!M-mr,؞=Ga9Dsvn;v``WHD0ok$~1'>y~|Gm0LBBPsVwnkkV\um_' ɍqNn q(sWٹOBAAA}}}l,\|׮]ׯgf```͚5" fzt۷o?u###RTC8B}gΜX,s9!ͧ./0 C7i={vZZڥKסD"m.|9 v_=..믿nhh`HR֦j=zto-[Ɗ<޽{333%Znhhp7kn{rss/_\UUe6-KGGDŽ4l\}m6dv֭pBffIIIIi:---;;+RYYVnt̙ѫW&%%q.)H~܅RGh͍1N`DP(Ϸ0[N90Fq۶mr<00~Iaa!M2l |g5!"qj7|a/I$?LQ*4M+B}?!ΎސFOHH`Θ1#33S5_ i\~=!!AVYdݻ!mڴIhh#bϞ=̙3qܹBHdbaw={vZZڥKסD"m.|9 v_=..믿nhhعs@f3MBr.ާT*%p?Нy޽{333%Znhhy<057=/_2cBgeelA>M6d2t;uUTT\p!338.]ZWWg4+W|w8 ֭['pk3gδ^z5))+wMR>?-.ܖ?Bkn썍t H$B0L~~iݺuB1۶m偁 G id˗/g>s޿FS`xU*ǹ UWWGj}q<ݲ!}'"C?:::xj7|a61cFffЩj>`DBr.$7ǕfJse`/Û7ovkqXx͛7>Ӑз_Bܖp ՔV׳KRӟ~wteq[lYrr2M۷o~',(EEEEEE۷o>Q8vF2_Ar~ $7WpɅ &&&>=Oi}ZjBzh4y0+D-kGBrBAAAMMjP*"NC\֕k|EEDDdHg'{wwU( hjj)ixx޽{$7MVXRIҸӧOB Eb0x yBnݪP(T*UTT!$''Ǿ9s!W\q qF y|&::Zh ^}}}k׮9sfxx8Wn%oMV}}}DDDDD`###RiTTZ:O3tE8q"::Z&UVV/\@tRRѣGS[R]]-ϫTǏBZ-0^hhBؾ};MiqI&!DT4+|$IttVϟw8!͵Z-!7d>'$$ g̘)t慚O8b%P0u^ ~ٲeVu՞b8;v!b+Hn  N]QQ < EQ.0{ժU&BqZ*J*ŝ>}RPPNP B愐[* JEɱo>gBȕ+W޸6nHQB 477S-4/^)JjaBヂ%xΞ=+tD'NDGGdJBtEGDDDDD xGw'vv[Zcǎyݼyj^xQ&8Wm+|۶mg&!!A9oypppkk+ݻw,((ѣG lذA$}M:;;%}<%%%F199-="BHNNNOOOkk\.7$FŐ!(J_y^xGwKyDׯ_OHHPlOb6M&7=S]EEEIIFqxo 2VH.>?-ީRzz:!(^}/;{0s~ $7W_Arɓ'.\(R\|濫hb8u jjjVkGGR)tХpCEEC𪢢q(8x^j!$ I@fn{VkqqJJqqqO&S,c9!o֭ BREEEBrrrϙ3r7.7RP(!EEGG KGFFJҨ(Z-t`vr6gφ ĉ2ҭt:EQA($]?!@s]?K}}}k׮9sfxx1p?B{K_kv1o޼7oZ֋/djmE_~۶m $$$5-nmme{68IggD"h4&''%GDimmB6h4GILLd yCrݭbzϮ0?A!í6  /ꐐ;wpt(j1Bͅwڵ~za֬Y#2/N}SNq15)**z22 s]!6MЄBo222"Jϼ!9 Mn\?K bppЕtxI"8l(zB%믿~ٯ?ܹs@JKK"x}f[[!Z$N!/rXXD"E{ b4Mk42.g}Z-!7d>0RI++nw}7(((**j:KWTǏ皻%t22R*FEEj.'NDGGdJBȕ+W`ɱ/3g@p?B{K9_kx>ј̖۷)HjEvuu͘1cǎͻyjxL&a&((ѣG lذk*yb q[ < >0뭷Rcnooeee1 j)luuu&iҥ\G644pRT*&HaRm)ib7!^_*B^ztta'NODIuLL ! B:4?&7n*ʖj/_2-OIIi:---;;vifL&, YYYvA1[hJWӭ\RR:u钒sB>sBȡCjiii:NׇT;wRTTnܸ>`;$߿n~nA1Uoo/oYfR$xj5($$l6L&ve1Fp k_B_Ar~ $7W_Ar~ Fgssƙ^/LZHnr >E(** $7Y/Crޓcf 'Nd E={6,,,66bZU*T*;}4VGFFJҨ(Z-'!!!!r|˖-B]v̙8AHn{>#}{{{Ο?'hZBVek Mv… UUURVVv ٹpB> !yyy]]]=\^^P===91_~!}YR[[KQR/뭷Rc!uuu&iҥܷ]]]111eeeGMMMmhh鳩oV)ϹsgyݣCr¦2&BKsR)!$::"H.]PjiG8p@Of] nK4nL&[ sss/_\UUe6-KGG[BtZZZvvvmmH{2k֬tҺ:X\\VsHnmf͚j*BN#߿bBwyGPJsN\**7~B}BU*ܹs߿!=72۷oB8P^^x^z ቮ_V]Xl2d2cQQQQRRh}]_K+Hn  +Hn z4-ͧ"$70Y굢"G oga xϊ+,Yȑ#.\tE8q"::Z&UVV}}}k׮9sfxx8W!!!r|˖-Fިz}ddT*RՄ+W8DzW!VXRIҸӧOOig˖-iii?'?IFFիqTVVF9|[['|jr^^^xxxwwwWWs=;ЬYx*++;qj\p!!dŊ!Bhf{_WݻwppUUUvvb#u෸iç~z񎎎ٳg777-[LZJ[rܹogrBVw}G644cX_y ՙLKrubbbD:OCr|P4?OMMMovNN΋/H:f'V[lZֶ6VѣO/lD"IKKtQxϬYJc)&&ѣ37Ζ.]ZWWg4Œ={ 5kָ5PJJ Miiiٵ"}DBͽ|rUUlX,nx,+jzWX,sV+v{{{u:!d^}>p@yyŋ_z%B[[R͝;H(BTT*7n&.! (ѣGwyGPJsNϜEp''jk| b6M&L&u,01***JJJ4ͻX>?a  1nK_Ar~ $7WZ܃|@;oK9NJ|Mtt4!D&}rb4###M&b $wܺMFQԗ_~M&{nfffjjٳ7xtÇx8[ ,2Dp[ jҥuuuFXfFFƞ={Fcyy5k,KeeeFFkNҲkkkrm6;c$!7n*ʖFHn8p|/!Dӱ ! rU*ܹs߿!<<<\PܺuK tX;E-}v5>>(((888??(0 BGk U[v̙3vΞ=m߿y搐\e˖~k:@Q`-S W:nxx㣣o!+V/HR<`M6TS(>|0ݻwْ`~dB!t~ b<ސ{̔dovCC[sգEEEnZ,W6Xd}}}uf3MӼ_IRBHtt4OgCSW.$7UgΜimmzjRR[xƍTRPbTVVfdd?ʕ+3v%RsҥuuuFX<Ό={ 5k$R| xS)))B_NrJJu)KJJpBq-zM%IZZڡCD8p|/;.BQR]]ݭRΝ{C \apVV!!O HnD ݻ`{ժU컘D ]o@r^u…=JIOO 't:#""""" Pz>44G?!'""BdkΜ93<<-a_(ٳaaaly͛CBBr-[BrEQ7HޚW\qĆtĉhLVYYɖ;eBvvZ@ v@`°.h4rkJilla ~H$\CF388xȑD?g} IDAT]Djfgg>xqڮh4&''%6mڽ{h,((شiPH5\PMrBHNNNOOOkk\.g yϧLEa $7Br޿gϞ}8w\PMMMQQk]###RT|.X`ӦM" C2 s]$88h4e2PH5/&76+nSKR)0ػwoffL&{ؚW-**tbL&c6iJ*B?Udϟ?r@|=$7UgΜimmzjRR[xƍTRPbTVVfdd?ʕ+3v%RsҥuuuFX<Ό={ 5k$RWDt<! nN[rJ:uM%%%lyxxBuFz~ӦM$--СC" 8P^^x^z]PL(jΜ9\nJ5w:tH($+2aoMnA1W۫!g|r߾}[(b#vZ.' 1&ɕ 0%TTTh4[!/Ǘ,Yb0233jREnq;t.ĥy_BW-[,99۷WWW UKOO'Pe?gû5]SD u0;v̕j͞]0$+Hn  v|Na($7WCr%v ߻wϛ<oH0N… 1114M'%%=zOtEGDDDDD srrw`P`7U(ٳaaan|7$BZ\\RRi\\ӧߖuAV:)ud2:0 ơZRGFFcbb}:;;% P 9r$11Q|t+!h4&''s;͛wMzEL622">xK7p$aVkPP[bX7xccc\j֭yyy᭷ޒJE ɹd2-]k@HnS!NMݻ733S"ꆆp?ϋrÇX,`U*BE\:~ҥqށ57UgΜimmzjRR[xƍTRPbTVVfddwKt{{f3Lsann˗fbpw $7YHII(* `ڵlN[rJ:uM%%%lyxxBu7KHH5k֪Uun1[PL> ɹwtz>44TRܹSh 1.XP .,(?B ,^͛ccc~iHHHM狔.d!'LXP >lٲd:jj"xCr1NW>>(((888??-R4**JVBrrrwTo֭ BREEEBt:7C~P7o [l/((IQ`-|S@rvڵvV˽z׊+ܾ}-,++;qj\p!!䣏>bj`cDrݿ=!޽{B}兇wwwwuu=syyyd~SDjj*o8OS{g7~=)78|p{{[XVVvԆwCjnn %\tMMM~\.'hHw{/ x Lb YzhQQ JKKG؋/:"\?ױb+Hn  +Hn  +Hn`o)8|CC>$Opk֬ٸqBr0_|Emm9g$7~ a` d`_: pIoo/i   +Hn `4}Voo0iD*.Z(66V":ul]-^'?0Q?ido&tvvΛ7L<LG2{lBoc?XB*>쳿"## !_~9s<8$7ȟ縸EYfiZo{=\bŊk׮`_-++?_ׄg}V0D!FFGG;w22R*FEEj֭[ J"wpΞ=KrNGQT}}}DDDDD` usjN߼ysHH\.߲eK?'e2YeeHݏ y #FPTvvviiv1o޼7oZ֋/daZZZ=z0̆ ׯ߶m[?0 d9(TM|ӦMw66mbr&o\. o5B\BGb|q`())h4%ݐb&44o5k[a\n2ݹs'&&淿ݻw333SSSgϞ~sxx888ÇRobpb>&\&}rb4###M&EQ6,a.ި :"{?2WxC1`/WYLӴ}5Dv%楥VM>zleٰR)!>aXd2[C9 ^4Kb$77UUUfbttt)))4MeggֲYYY===6mppp|1X,ʌ v0 ##cϞ=CCCF|͚5B5ygM3BxD0M H7G8P^^x^zyNCCCU*Ν;ٚRTTnܸ>` REy晤$xA1!~,44TRܹS9[?///!!a֬YVbKRR ܸq|yp0r ;&***JJJ4 LC^xǏ/Y`0dff/qd57ײe˒V󫫫}Ԁ`:v옯Cz +Hn ¸f'GO$ާvDp KOOg7{sJ(cxD7>},U` DU{|LHn<ܹsEر?Nd6lt\~d(''~9sB }GDDDDD >VkqqJJqqqO?===>>>(((888??_oH .4tQ6'NDGGdJ'os޳c_h"466RUZZ5c :;ih9(TsǎͻyjxL&:}:;;%r(TT###111\V\:%8y%{B?2?xC1- BjEl6^nݚ'Td2-]+ꊉo>|}xxxllxVkPP{6, W^[[KQR*,nKL Y8x`bdBJ$4o2BիGGGƷ޽{333e2o]<}T˖-KNNizO!x;v!4+/r'O:pI?y`Z>xP @9rj޼y>}?~֭[ֳ׮]c_Xd}g <̀ v;Lk!h˗/߻w`V={ ,iܸqVVƎkmm]RRRVV&Dh= w=Dtر < h@gg۷o_|`ׯzҥ}N4Izӧs޻w`WvvvSSӨQd2 ,ӧO'#G4ua"mJ *߿_Θ1^zֲ/`}F)ӧOwpp`|p'CrZ55L1z'Jn>}#nnnDdooOt,̙3@>h[k0$!6wR$3f 1zD4~x61Br>F"#G 0mS˙7ӂG@Zb̙}a1Dh֮]+b/?J^^^ .ttt,..}5fdd>N>+STrᑓCD/fuXe׿Ér ,dLMMJ[li!x @Dr' tZrNDxEo~J@Zϯ\r lmllljjF)**W@\lH$qoBD }\ze'AAAͿ2ccc7n"ݻwj~yyÉ(22ͭ%22333377/T(%HH$C0:VpttfcğY)^{ᶶuuu|9ݿ_ݸqCrL{bSLlZ*:Z֠'薫YS>c}_KVFdee 6GyX62h }222_4iB={Z&FqAN͛u:ݢE? `WߺuH$8p1cf gĈDTXX(t Cr"ݻǶWShhjرcoʕ+Yt cUUS[JFoTJn~mQTT$w} ryJJʽ{8Yxqii3<ÒVxbbb-[6hРNrpph![[ۓ'O655t9stN5$7555egg?[o:rȤI8?g}6[p͚5|N~7NJDǏ-[x];;;G1zE#Gܿ?99y̘1.Xs΁jA+NO3aF77bYf׮]m=\ڲ0ILLKf͚ qZv߾}G+1pLVSScccCBB<HV Z?=X/i0ao޼YYYI&Z(TTD$ƏkP͂ȷ""S dhCC: xu&BfV`X bk֭BK}NNND")((P̔tUxxwyGӱG 6sL":qtDtAR9dHZqߺu+VZ%HRYɓO>*#*ꖛvSuuu_|Fw5XCчX*;dObF_cLNNvwwwww?q℩s}T͔.}&˃䦷Cr]^6lا~j733SRT*6̼&7:cZQFGGWWW_;vU3K&]#u`yKR,aC9{;w222f̘A%裏ZS-,,9u֨..\xAF3xत_~tPn EMn,t>ӝx6s]bѣG¢\hyvv>@r`iJ=:l0{{{X׮]: K.W2۷QL:cyn , (Hn:gذa_|E]׷ ׯ_oees#Fxyy]vm޼yyyy]q;;;[[*9r魬 `t!C/񍍍 ]qwEe䦓/:~81--mС666?#+bV^f裏<==bSO=UPPjw}Ņz|}}9ST}4iRuu5yzzO?_9##cԨQ"h}o~;jԨWvMSOq`B#d&]uj;;;t:"e%-vB[n=N&J"| *++'L?߿-Z;k,ww[޽/,++{G?sϱn߾~ڸqc>} 6իh|>??ѥ^Zc˗/uU]]}I":zhSSS fũjy8`K]t۹<@r$ Etcǎ߼yo%>>;O,| |555lYx ֬YCD,e4iRyyyݟB"b3޽n̘1lQQQC i~'xbСy`.]DDf"qyzz^@@[h9rx "j^OWWW{{ 8}}}6l`kk;dȐs=NNN~[g3u<}a"\tiԨQ.n]Bv^3z Hn:٭[FAD쿺ψ$ 8p@T]tiݺu+VjDdeeJsg@:*X[[,N0`g"4U3++kժUeee...֭+..k? pƍ۷oWWWESFf-7MZ388C,:x`;;5jH$*++h4lDQ̅ X\\<|pr7h轎=j_z***Ξ=ۼҥKW^7nSO=ۮ^}U++)SL>}„ zٲzGKKK FUUUcZ3sy';7Hnz/6Baod)SܹS&]|yF'h-ojyXZc|wywiy_,'hLқ銋9dsYeggwõ؄]w~= A[MDFF#G9s&L`_-eeeOYYYӦMӯYPPi&'''JzjTw{y+՜}w֬Yk׮ƶSڲ꧘dp֬Y:NPpj[x`rJVkkkϜ9Cz*X@uLL̵k@7@93L:!**}kh_><<\*{iii|y OZZx1vz$7\ŋCBBd2ɓ'qxzzSΜ9ئc>S͐X>S]LDΝ#;wK6|6̈aBbp{3[K92//ᄈ n`0r3f„ f;v:a {:!&w%oRX,Vii)=k!&M6 +((5kQ`t[[ۊaÆ źvZMMЁ @9rdqq=Nzё#G  ܘR<==b?+Xp\.bϷwppX`Aeee=EI IDAT\\y"##uh!2|]LL?GGGBj*VS$#c-b"&,.fhR8.55[*nٲU񱶶H$III/__PrcRppSBCC&Nm6"5k֊+nZSSHD3fqFN7m4'\t￟dַ!o`&V\{رٳgeff^~=,,lڵDdJ5suֽD{nCW鰊'}bL&ܾ};+LHH1BV4&;v,[L.[[[O>}Νqqql9 ۴iJZzT*;.Z3MLL8N&԰]֖ƚ+V: Ƥcǎ5/tppmPؿ~PP( A5kk똘΍,ygj4n~pHooٰaʄWLBh[izzS&L`P.H}}}b ] ,~ ? =[XXi&RRrˉunذT*]UUq̙33GFFo-Ր.<7<___gzڵ*?֯_ODQQQ{?JRյgΜipn)h1cL0A !!!""k7o,;FF9 [\:=Cז$h!"le,IjjT*ݲe +QTbߟJ%q)))999jL7F_h G8;;CrcҥKO8PWWV 3eff~hСΟ?qƨ(S5;(((h_U ޽[_,uӦMNNN*jRϏг4reDd2YMM +MJJ*// IKKOD .l&zL+p! 1##t ²cnwh4\BԴm6jZ*f' AK$ЈD]jz˖-3fxhikH$??_vֵ |6J6l@D*2fܹ۷o뻹9::^tUnfkЃLP4.Я_ɓ'EC@F QTT?LرcF뗖Isi偦.RL 9qaaaDq2 Yreee @{ uuuDTPP,t,ˣ7z$7ʚ6mn>C;wӅ,={V@HnƏ4 򪞈ME#݅E`w)))^zy}}}]]L&:0#cǎMMM]hV7ۼyuƍ't <-e[2`qAV*lذm>|e˖=JR*Ι3ilmmVXau}||%I```RR8h֮]+bCLLSk\">hrAD/.--=uꔃC:8)..2u~mDnP.ܻw>>>-iҲe h=*Jݻgpڞ}zSOzgD&yG}ќD7^0eϞ==E&"OOO:EЅ [KtQ8f̘ &h4ر+.=ڢE-Z$tof_@φ'ٻw!t>V~"8ĉJ,.إ.^HXĉ%%%C 1bDff-[&tPЃ v,XBDLNNFr,.إ؂qjlld6͟?ۻO>ǏrС@O,.إRcǎ:曲#G鳧M߿ʕB=f(!}RG  9-X)=SAq@1C4%%%B=ݻw:qAr3mڴ~;wʕ+{={ٳG(z#G=/H$fڳgOJJJ\\P@L/tCܱ%Ν|ܹsٓڡ7&7=wqAK2h "***jzyyuwL`0߿`h?&N:襆~ʕ駟 Al6A SߩZvl}`Xg}\}RnHn@0>c=VQQW_ׯӧO66蹐X ALD))):۷q@Ć#lll z*XTJJ ky@GVTT-H<==^z)S`Hn@x!!!'O$"WWג7 R <~3@!͛7ښfϞ-t,[ ̂MCC۷]]]z6YH$Dde_JQ=f%7qB X$7`Q@׊Ft'< ]ťٹ{K(Hn;z{{K-[J)YKJJGNNN 5LAr!33377/T($66655U :y7FEE\(.qVeÊ77CBB۫V߿߼/z$7ok4/i޽Muu!C*++ܶm/z $7&7Ntϟ8qb>}FVoܸO?m^Vcnk)J"ڰaT*~[,d2ٳg߽{e6Dx%VYܹso.-7 :{{{GRB Tq| @;ZnR)@ @ot[n {.i .ti]]]=<<:S@7o^nQXx@02](,Н;wJJJ@0-BBW@@/ , (Hn ,  "8חח8h|Mkk!Clݺl鱷jll&z=Hn!zj\~ƍիW'%%]bxĈC {mv!lO?Jׯ_/..^jf RXXxڵo>3! ",UUUտV^dP'88***@rׯgϞ>|9sf͚l2++Fߓ'OGE ` 544@CC_k׮Ç۶m4ic=vUCÇ2e EDD:$7F{`Ĉ|1c N>[o[lˇ\"J^yb!z|ժUnnnl׈# xO>>|k׈H& Ix{챡Cŋ $C_y󦷷o/ IHnI#6lذaÆ0, (Hn PWWGDBbM^ Ν;GDBbΞ=+t $7JD$݅ݹsd腐`ر-: yu֍7N@@P  X$7`QEAr X$7f8C/J)YaEE… r+? *++88.##uDh֮]+bC{m] MMMh4EEECe˖-D7n\\\Xadd[IIIqqKddBtDsUggg"Zr"""jP`bwH:.666))<$$$--gee;99Y#Gnݺ@D ӓ?ƍb޽{h߾}GtFHnke8m0111&77WP455m۶D?ٱb"fdž)EB H$p֬Y+V(--jլpƌkjj~iӦ=ҥKO8PWWV t#$7fDنbL&;wYaBBX,1bD߾}Y;JJJrvql mڴITT*'''\|n|qRرc ߟ( BaP:&&&&&s0+h, (Hn , 3¼X?$7fj-5< A8$7f-%%#''N>=Yx1҂b *S,{yy ?@Cr`Ο?P((((HI޽]<66655U :74綾^tR[QYYi™f5p|0jTsh4\BԴm۶Nܩ-[̘1j$??_ֲ`D$7fyKT* (XȀ~M>>$000))hFCh4k׮bСC^ŋuY*S,{yyw@cDGG$ŋ:uy[N[YYo6D"Q W7Z(SRRݻw4iٲe h4GJ3uxlmmO<Ԥ̙c5K`b7:9d555-a֬Y:NPpjMU[fͮ]FeAjh!۷v|bֿؤ򐐐R_0 h͇ڙ:u/k׮ƹ~pHﯟ^d~qS5*&&F*m۶5~ 0?};w,YҎ/^"N<َO:p̙6t'N$$$թꂂK$|V[[[J%IhhhDDDbbb; oQ*Da"b}ɓ'?-T*>LDΝ#;wYasJrĉrdݺu<7`oaa!?/,//'`㬭gΜi*N!*JJ$˗/_$Ȁ~MM&O A@!0SOEE̙3J4ڵkrX,=t)JRSSR-[h+*8;;Pk:T*OOOXߕ @r`t:]UVUUU+W߿?;;>!!!""BVQfffnn_~P(hl(j}MW'TFSTT4tЮIF`bƵ>|͛}KW[[;zhLJ9d]&%%uCr`X*q_˶N"藈DǏ7 xL*=-IDAT]=&&F*m۶uu$ zѣG۷_v-+Yt'juAAAgH$Z5M]=88X"FDD$&&%t3lÏޥzm۶ō9rܸqDT*7mڤT*U*\._|9+' 6Jⷉ(222 _~'OnBiD$e2ܹson֭: ˡ, (Hn , (Hn,\')ƚ`XsYJb0X$7fm'L)JRRR<<<<<!!!""BV:DBDzR6H .dI 9r֭[DP(<==(666))<$$$--899Oz?+W>3Gt: Y` _VVKRmt\NLLFU(MMM۶mxHo񆯯kZ"(44puvCS[l1cqƌkjj~iӦQppD" HLLl$??_ֶPm?͛Éhҥ'NHHHSfՐ6nnn.]RTdǎ%%%r|eee;w$"X,lllΝ}v&L6DЯ_ɓ'\o} R:hJDwf=G:NӕB`999W^e]|ݻ1;!eff~ \j_UUU5zP `)~C&%%=$7nk֬ٵkW~~~}}}cc#_-118LVSSJ>|;}vKZnk7vLL?GGGBjժD,7qԩ QQQ՚쩫H$:|K$ЈD\"kxbHHL&;yd=z}{wUqݹN6 8[HR|ob(g 95bd B^hZY5m ^ERd33_kzМ9;:xϛ7o***f9@C&,f9***??ĉjyIIIzzzlllvvxXn1V8ά,j4vB:tH!\TUU-]tŊJixXF$^kL?em6۸#L ^?++++++@._hѢ˗Gz8 VVVV[[fs !O}zyvv$I?㯿QphTYYzK9iAs&''+sssSSSgΜi2JKK$[tl޼WTTX,YSRR\'ophǝp8®$իW?|pttѣGB 6!֯_ {pGFF<OAA#7a ^?Z円z###޽SA!IR hllJKKS+.^x"@2O,B (yjwT`0dffClЃgdd[nk׮7oz߶qhh(--M-]xr]]]-rCC">>~Νǎkii|Ezz? DeE,a`0dffvvv~,Bui޽)))?nii)//,hWZZZcc7o***Yfݾ}իW;vPJvuM3<DАi!DMMMUUҥKWXVUUegg\277Wt:>t:nw||b)..7 !$IR6ܨ_[[[XX8 OO4p\vf9r3[ѝ;w?~JzӠz 37ֹneFSNLǏO7 uV5 {nDBBBBBeӯ">phnظq3t:t!WTTX,YSRR\" IR[[ܹs$ !:::$IRԜvϟ?_夤e˖ ! #BOuMMM9sd*--?Юׯ_)%T.s…ׯx<p8zzz$QWWg2]&-//t^YY={h"!ę3g>+5W^G !>x5e ^OFGGo844.^XeAscǎ x"==cVVV>}?##ŋao߾:;22ݻЏBӃph21ta`0dffvvv~,Bui޽)))?nii)//3;w8ٶmj={v]]]4`Y Ю7oTTTfͺ}Wvءڵ͛gxxuwws…6mr\#w 6iWZZrzз:DАqfdY6QQQ'NPq&">phnrϗe9))iٲejySSӼy͛ե֔S lݺ5..b$%% ! J9s|?<77755u̙&TQUUikk;wnrrЮfٳEzj*%V5 [***2 O}?##ŋj#G!lR\\ώx!Dggcwh߾}uuu^wddݻwUWW˲wF4AҐ$)t~Ν;cll&狉 ӧ_pC P999۶mZgϮ He!Ă Xk͚5F133>#w 6iWZZrzW}bgdd[n}>74#˲l?qZZll,tCeyɒ%ѫVRKJJccc cwtfeeY,Vhە B?դy+rvfSvLϝ;b?~Em?O)z|_sA[[[BB¬Y_V"u7  a!Dww#=믿/w !^zHEH@dnPOc6HE^z/c /_?<߂R+V@D;nnn?(tŋH"sٳgFz7r@=;NIENDB`biopython-1.63/Doc/images/tRNA_chrom.pdf0000644000175000017500000011436012250104543017516 0ustar tratra00000000000000%PDF-1.4 % ReportLab Generated PDF document http://www.reportlab.com % 'BasicFonts': class PDFDictionary 1 0 obj % The standard fonts dictionary << /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R >> endobj % 'F1': class PDFType1Font 2 0 obj % Font Helvetica << /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> endobj % 'F2': class PDFType1Font 3 0 obj % Font Times-Roman << /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> endobj % 'F3': class PDFType1Font 4 0 obj % Font Helvetica-Bold << /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> endobj % 'F4': class PDFType1Font 5 0 obj % Font Times-BoldItalic << /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj % 'Page1': class PDFPage 6 0 obj % Page dictionary << /Contents 10 0 R /MediaBox [ 0 0 841.8898 595.2756 ] /Parent 9 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> /Type /Page >> endobj % 'R7': class PDFCatalog 7 0 obj % Document Root << /Outlines 11 0 R /PageMode /UseNone /Pages 9 0 R /Type /Catalog >> endobj % 'R8': class PDFInfo 8 0 obj << /Author (anonymous) /CreationDate (D:20111028165014+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (unspecified) /Title () >> endobj % 'R9': class PDFPages 9 0 obj % page tree << /Count 1 /Kids [ 6 0 R ] /Type /Pages >> endobj % 'R10': class PDFStream 10 0 obj % page stream << /Filter [ /ASCII85Decode /FlateDecode ] /Length 36699 >> stream Gau.S?*A*,OsTa,;Z2CL#UT/\h]InY#uZV)!E-QQ*fA\]=fH`U3ZEpj:CPudLUYkqBC3CLC3B9mET`?>LSl.)[c>8S)#?J*rP-,GnaZ.qJ,/kXrd4NNh8`n%cOUs9iSuTkj2ZZDQ[epgs87rXnA"qjo[&*ca+%dK\.l._a?gJ$e&kNV<2"03EQ;Bf?o+.0tqY85U+90l@qtGU=5Q:%7rnmb%J,-SRo'ubZoj<4K[t"ANJ,QQ8rpmOZ^\h"Dofm<[#L1#CGQ%7HCYbbOq@Raq39T;A+!9('LUT/om!"!qq^B#'.,\rOUq\Ik^WdJ3^i)&/rXkZ):lUO#;FjI+6MT/]qtTKt^]362f1>p9IP)sg]_PrF#/fA)AN%PM/.jiq=)r"WM;C%SW[B>\9NkPSWF7DTaJKH$6D(Mm(B4N'Wh!72[:/tSVA:)BS0-;rL-kD>ni!qmGP+h6muKohjTG,QZ0Vf^<`4qeU]4@"Q>=?5QA>-es"lh')Wl[Y"&$JKL;a_H^g_+eVEAlir#6gTgoq\Ps/f'7==&DQ%NTU>Q%o)Gpg%]NUJ?Dn)j#or2CNp8!K8;QT/o/;;R79UlEM^IuO#3Yl)WJ3Ad=,+@cX;r/V7%]lZOJ$Tp-9$a0eIJ[*qWu"L2h#-`f8^HZ4KrKRn:]ndq/:[g68eFI7>T3BL8d0/oiMH2%)+W.hMf3CO5bP#(sO*\YiOQB3_X"3/k"\$XI*5sk2Q/qRLMJO_ZP1UI^^IWl]\XaTllG$Q=@!+$c1qUdH<%iM`((_3hJL"_o.LL9A_s+Fo>#9]bKUY#nQ(:DZisQ%C(2;>bFsbWF=YD;5aH\0^T,R1%scQfS#!u;WGPjoNbdHL9])Q&,gl(N7i#._>r>l^]_jklE?5^sCF.%1Oh%/4K`DeGls(>6bq%_b\YBjACJCCYpLJ1&?G=+8U'(qaSKOJr;WGbhF*A7dJcOXQDPt>>pkYWj+js5]-B`M:Q[g"&#e=/D3o+k(BcV/!6G[EVsY`j#L"G9rAP'b`J1Uf3Eeg)?PAjbn4@6p??)O5=9P1;T]*"'tT@*NhLAI0NWnq=R9D9dRZ99"P(4-#thV-(&BMKh8"E?",k,/bSo[s?qcQW*6WE#VLd-()47K&S?9?:M@4ha>Kl1ecNoGWcf,]#r&+iifrSBT2H^31ckHrGD_'F)Gnd`iE.^.hrMBl,,JBL(NF>?]`Y:AV65V;@\nN;(]ZYTL<.p[(SQ':`hA&u,VY:@ks17Md_RsS)BW=p]%-o_#[\aoo]4kin@LAUq-HNgmad/)KR)q@*`k[[o);DW&7Y@qp5OC3YKXG_@NKD!CNglk#k##Ve29V^+Q@lH3jWc=fi\h09R!7RN[\SS=*\#OsI!IQZdS:g/4g7f-d75l2ZpFhW[6_CcN)2:kEL<$_IsmS^"@o:o$N-$9d(Y.bV*ui""[SWVmY[gk*q\q[mkmARiuPPKcONS(UQ)(J8ub%\KP`-_eQW>gUUJbrSrD'fcKn:#''W*e:&O,NAcU]b++qr+nOA&qRK;3De\SLh`,/p3gm]?>_P^doZ)G(YKkMQQB/f\ViQ?,Vf.EI?USW:05>3icjKb'rZ17_j[g7fRc^'ef=NE9s+UsP-0_d)'>Eq+JPTCeUlmCEI%^.#.dYa0P@[J26aLA68U']]GboU3>==5BOA6:[LA4kB]K\kL7%LT>A-Vr\SfAE7\+fAXcR#DED^'At??hd`$"%f[ApQM6E%6(n_.4#?$sf;?G\)[:NX:EphP52-JdJuH?\bT^59>N%b$nlF6gm^dR28s6iN(NfLb^YBr7,Wn)Rf(lPt@`*I"rHl#CS+mbMIn;cU=VIDq%-Z>H(X0cDV]7(j`;BJ2p=q<:9cT5Xor9!H,2OB]MrrU4Y!]eS-/[,olRAHMmRe9qcB^t?VjUO"J!sNBB`mo!]KXj[Dpka\_CkgMT2U.7QI'nSHoZ+<'F-"P1Pf3*mIR=D28uIL7TskPdWtPdqY''?ZA84"g(MZH$0N1mk1b['X4I0;3[_O\c`-a6md@*_iMt1Ki[/?Q]nqN>TI<"S1Bq0*E"]H.0>@BbI@Qnq*#+1j]Z/EJpN59lC5S)FlElE2\ZtGSh\7-u9jO9\`1UhY]sh'5hOPT\c,$[HlJ((Bb\E"okFoKLi0^S"W`[/5AK8nX]daLe/GAA`kO\%?;`o*`0+La'P&$rip+]npqfBBQ3Au(oICOKQ#4_\7cSW\^?$/KnRJEO*h56Zs>g_DVHZMXZ.uJflm@uX#U&(g.?cpWu&*D#);Ua"Tus)&*KtC*1V!)->C3-5EiZ9`Og0WQo,,hSO%@dDfl3Yl#P[gH@"2_`l*Xj:ZC.D`S9uh?)^5JCK1G.K[FMI4j*V+WsE*1+"s13';[rNM"a^C"JoiA[T\(49@M`5'Gu31:S]g*"a-(@Kr1]+/]r(-V!aKb5[-dH^Lh+qK%MGNK9V+^`7oC*L+%`mg>lq7Sn(4R$pCE@-Rj+/6fT68>g%N#aZc^dI0?s?-\YsrC!2kc[bfI=d@a%Oq.4\"PmrkOS^UJPbm$OAK(@QqU%]F[$"r&2>87h&bBm3X5OW:9`5bA=kAFXDE(HVO-c)?7+4e%oI^5m"PO>c#DRUH$EkKp1-A].?W7u\M"f+#cE9Ceqd_;E!44(.;+iGV9k<*BSH[Ge&(!hgk!%snC4n%KKXm_-^qG48oPa3"TO6;4IesqEc*3W'TMcMi6l5;"$s]ZU"A.n-/!j[;&c)W\$orQ2$[:C*OD`6:5fRs"3W$<=YRR40X)_A_Xag]Jb,W64:phl/5hNU">t.pq,YWZ;!q%2B#4AqdK#/,'ZP&S%;IP^cNWrl3E*CRqlS1qj$NXV+Fij$i4LVrhte>R<(24b5`mt7Z40'7IGju6O)>!#o0M@?!kkQuCOIn60K1'RT6\q$I.($u"m6B1?N=f=r"oQ8W=,G=m;kn13+ggZ->E.%dJZo^](If2H0Q^p6EZ!UV0G*lEP3aYaQjIp(5(Q#\VB^>K^tE'>hDg2114_-WjEc#0'hfPeR'Ca$p^W/CS@^enbMW1VJe"kfJDk*rX[#"cAtAnI),0$SZm8meY?m_*Ek+dIsH:3+o_o3)G5"[5VdZp-$d2eb?e!gu\iDkq1)g)\=,iUYH2A2dMdRJDe>hTBnZtA"rDmXK;#.\r(g:kO>#UM^'*K?iTVmW;9PaDL,LIt;UmT1\^'_f"u'9E#taU-+Wpl]9U__m+A5ZWNf.s=*\@^GB4kp-6C+*tb-8c[M<0J5]>H^WCa;ruf!p)mh;U9C$2lVkK0q?bJgd"VJGO@77N<&^JPK&4Oek)Xb]A#p+_`dLbM;hie_N8b14_aApoq&OKgnITu:N#8Am4:3oPP1@_!t)@t)[HfB4rXq<2deNh'^ihS>U[7Bg#,\O+/9:>E)C5R7,c;4VM`7PREZP%CG_M;$5[INEYP\-m.i&7ZIp0pG]'jCUi>g8YK>l1cBa^3>F_67Ki^8r>RKq@2Sp/7l>2h:]\1t?;g?!^!N5FIB;85\7F-^[_V:ZA5D<$")h\R]I5V]Q:-SCk'mkMbQ?6s\B(o3.YF&$Z`Vs@j65BB^feHLnB4bf,[I'C\=2jT@p1Y8RW7fL>D74'2=0X'@m:!ubmG'M=aM!5OJjU.[+k.Yq^g[.i4T^q94M^K(;)=4p[?G?jfS2flrgfr5kaJI$8_Y\BuGd:sqcN6iNlIVH8>g3)l/:E4sW+q&Le5Ike3.J]Tm"Q:sX2IC2^T8b";dI7q3+Cs@)BCuP"?iL@*Lh]/:TE07R73!k^m>s?@"NJCJ7ho1SHD&_DgHKQ]2:ko5]u8O?].pA$3UX6odgcBZBnJ&YgfhQ9Uf4XC+gn1tY9nS\V+L7#(V.KN?@p6q1"EA4$;Rp+qFb9N_:)@a"Z*j,@:Y9H5t"5$VSQjY%t#.52W:U`0tNOM4t11?;4XVS)B!b]$e."@nWge++M+/71*Ypa.4r5lmBpJ3#GbtZ;*dh.+=m(D@7UMsGS*9P?k\HcBTPT00c@UGAj>9,[oD7:V.G1n8ud`iM!MH.;=3[bgm&/>&>l^\>GkR3hY4'5p](4'h_/;uU=eP/90:ed*4YJj>91g\3.H1,0+@&[OcWA:iGA68q96cWpV(pFS`1n.>jeM7m9k:`T1ji^hiu?NH5i'"1pq*LI`e9VS6&f?U\19*ikm#:Ec8e#r(4gBUHi@sBTu2BICO[n87fqN9S183)8.R[-I"?\8#2'84>`'AAiiu6,6ek1\op8%jY%r]_(9Wa=NQ6/D-QqGIE@_gQmgb2c1\plPM@[n?XkkP1D?5mG.k3gZt,=%>`!gnS`NWo.D3F5ia1<$8?n3s?Zh.E&AMo2pD*16=MF=HW%!.5\[24U,\h^gdF__;+a9F2LjQ1njY%h?rL4la7`]`0Qp:`jF"^'qb+DA?;p\_Y-YN=:2mgZnHX#>UIkl"@j.#g6Y5A$/+EuQ`POoV(Q7nW.OC=T2i_FITb-Gk3?&m6i]LM/,2S.=Vpan*^tnmGCQ/3tlYDD7LHD2!%L[-7F8)J.K?>/V;')\@:a]A$LA]$/I9R)_+FMI!s.]aR-6HbVRO4.ar!K)-h_stUa!`\cGdPo[lHB,;^V]14[l94,O5^>&QCR9k4i]qfU>`i"5W0O_?A7J!OL0E$F%l+Ua1#("ikb:e,S-^KW,&J%r8a!Q_XcWj1Qk6tb*KK>FbjBeN5G/Di]iS2Eji?Ghp9_PW-Qs]#aCY]u+aC6AelmaP/i%e5_e3P5\U7bp)@"0'cGWE4lMai!4Yn"pj20$bnj+D"UP9&U=GH.]4f4h+%Wj:NI/Sh2&4B?703B>p,]-&Y/tMY^K,+b&sc$Ds=$DFtrb`T6`75X&qrk-D>g`T-hC-6&"H65BnBjDK=H%bWV3sZn&gp>oN:]NaDg>NUXG^M^]E:MkLhNEY@32[heH\c#84nX6dC=[6g49GA2>gp;9I\i'+l[fj?](dW*cbLiWYD;h3-Hr7Il6Fn'pCs%e5HIGlIna2R\`1O:Q``$4c@\obbTa-O2TJ!*6F<;h3K6bM?NA'8*&7*,P=*7aXF&+PRupHnq(*iR:1H-i]DWg@oh`![VIf"?.`'Keu<^2Qg4Z?X2Qa-sJ,V36U`A?0%Mkn#LmkZIH-cW0OlO)!H-Xio]-%jc#Jo-N!!U"ZJlEo%sGn5-FQ./,08<0YkD`M*_V*0`""hCX"qQtFrl/rLN.PUq+*gY/UIccZ!r`XjeJ.+rXJj-Df(?IiGh*@tOd:pT1oO,QBL?utcPMT%4i$B['L\bkB;!^sJqB=/`="V2n`?LuI[5KHL.ANQc6_*c8/8!A*;.!0NGRBq"O6H>6Z]3WgY(_f!X[lj@5?LZ=HjO'iq8*pK#Dt+\("V2VH*r!uhh8>[s!@:[WTV5l>UYEYf*)^D@CBY^;"V2V`*qsVALCR#R>"$IH06l[to,-i>"#]hV7?gL9Jqo@@O4t\>6dLBkFoMdX(;FO1^EE&A@ln.D%Wt+@7?gL9Jqf:7-]>?]%TG*o(/Zj+$Q_p;4F+F+aCql#c'G\\_*c>3U\Bl2;'.N"M^Y"Q"V2nhT$t]sUM675jg%\PJqoLD06UPAhP6"G2=&*<"V2npNc$qA#L]EN7?gL9JqoLHYIjW"j`)qDJu&hj3jq/=/Y3*anNp6Z??Cu>4EPCb11B?s?<>a=Xetm4j81\7FrkfgHugGRC\X@EcJf!<*G_5X=tY)2[)oke4BT8STju?2F$#HZE;j$+aV6CQkZIH;[f\T+;=di%ZcaLunBeH&aldMh7/sd,obc*\$QWHCK&'SJ7kWBp8u?jL6cYLjD''VdUS`@^@qY=`KoRHTHfC#Xk$d;XE0;YVn5-FPE=;5Tan:D$[s/>OJqoL@:]#E5$GFm_/KR:WjH6I*/^Ik#Oc\aR9inTE5srbYmml`D4A&I("+,h?1mBP:g"c7:+6MGJBh0$cPg"C.NtAXI[!ku`BFOE_LQWOY]BRD8A?B0&jq'1jkSWlLgH!A#U[dt6e%t#I%in$/H]e0t6hO=#[9/S@?LZ;rjk5BJ8$S+YeLRX?iWTi5;kBQ;H%^stl'h!InUcOV.F2miM/`]q2m0E!_AA!rQW`!%pjGeA>2/"Oc8pk"4ETq7%U2VcX/L>dXiSX!06l[tnr+DtaTH*5Y/QPtnUcOV/^JFO7]RrL&[/b2/7.hmZ/n!6SHli+^)'GZiWTi=>FtP@l.S0Q?dlP:?LUdsjlA-(*[p$?JpKkt6bM?NABT&IH(aZH[:k^P?LUdsj^kd[hOsAX[:k^P?LUdsjX'@Xb/79Q)R"qk`T-h)(O$oXD*0@!Dd3YtRGnA\*ID,:B$WUYGjErs4N%UK3qg4R[.?QI%JA#nLNpX&a.=(dG93]rE@mbmMAJBsm!1)e06u'f]f6Fd/m.=>oAY?1IV[1tN4igd=M3Rc@*MtB:rLW]PrGk"P>(M17nbPLc,7Rl%5hra:s$$"o%L#:ahqlsnHJeDEQ]Eo%[B!&X6^ne-P**eVM+9G\pIL,1[)"_LedK(LXEX,O(bTs=e,dc-n7I08`:$]+[`Btlf4JD(DgpF6)G!s$tnKEAP-lQM2WB@iN1:',9\*J6H3Q+]7d=nC5,FWJ7#8H%)[ldd*j:QKYCr(okT^YF\k-MC=aht+IaC5)iq*ABORau'?P)%?Z.(cZ%:jU#bo@[9Zi8KS$O1K\M&Z%Fh/b:,kZ;=]c_>)8F7#->GiYuu&fN(.F=jA#MAJD35OiGMMVl-<61GD*c"C\ZMhaW(8a!?YksC`tjKHOf9_!^iNYMuQDsP'38$U\*8u?jL6cfi+[3U.!2k#ICiWYD;c`Y%cQWo&27I?(M@3njbTV5l@UYRjNQ2Ib[hQQVa06l]JoBo(hKe0Pp@lEr=M3RcA'X*Mjl7kKDqnjMV$dns[QLGSmQVQD&*WV#4GNXM6Qr>&n]9JE#R7[qgb#.HMAJBsCjEr_=n4gYdC";_;nV%^A'8kn-YQW3hRF>!1;sV>3]8Z0\+;lTNH!'PTAg"b*?1BiQI-F`I(3rRF-\F\kZGW2[kcmXU@cI5OHM&!n5-?>.6NLfoJLB%>^;7J&3kFcL#VYe`J:_QEG0=bOlNj2Oss`,:mb=k%4Est4A^@a>"HaL5C"*"ZI?N+;WYMhimP`UI*6#liYN,Zno*HKCYHN.C2[>b.@K0!%g=>Cr+BNKj(Xsa[)\08I,-6CGutfB]cmJ)jc,%BUh^.:=ScL#Yf_SaU6sV=?'!DQf0W*,prObYpQ$,p&I<^e#5Xr&F0GK*'Yen2pK^13Cd)^0(r`jKjL;uG^MdJbuTnh>&FIL?1Q2m.k!9_"=%=#fY_4OP"2+%#SYYPIN9?LW3sf+"hjq#39MHfJ9eo-o.9:iI&:X(/TmJe1b,j4`c8dME:FOr,mS_3]#$8+WtD=t>O\Ie'^?@<'XYWqjR8[5Y8=1S*Rfop1`,uaa&62Oji*p$8*gU(ib!=jV(AS:OkLI+s(Zs^/2^.0GKHnD4+MP!"o68.pA&HQOm`e49jM^MRWIdp7u?l'BRA@LDY+e\m+\E:0)prOa16sPFJ0j?RuQt]o-Y/QW!nWQJin?1-^4RNHd)$N"T25d"a0-1K!8OQ3in[LQZL@iU).4!>rKZ_cuNHlq4r82i+4tM0Q8.%g?+hV;Xh$aH%33EFL9_"$rL@INrUY?,JKL2l,j#*a*`D7QKBn0!CNU@YqNbKnjnq(MomTmR3Od\C"bL'lp:gEnK\E?r>)B#rPb)FS?q0U>E4do>_QS>ctXpFn"!(!uKTq.'qTaZ%;qfZ2j4=)IhEd1,o)fd855$7l$Z#r+?>p,G0B3JZ1OOo:^ku1^q(f\n2Ia@'/AmYT+;U7L1n0XS/)6^jKf_=!'?-,8OYs@Y"7cpg*(uC;XM""#=QE$n1kY?k1o7]$RZB4q?TID.s@3\fo<];PKKZk%tG-M]SW`=>Ym7Q7Q$;p8Nd+0UIO,;QLn+[5k[pBa+laSksM@&H/UL=@(,/@)3dH0Ub&:@EI"]YY[%SoT*64s/efSM9lBdKk2>aVVIEGos%FOjL!<=!V9q$/\S-g^0r/qC.Qgp*M[o(cNTOa"'/)J"*8qh7a6[[1VmI$n5Y"3U`F84&D)!,J0c:1_oTa:"/CA-L;fas!R06e>RhE'W6GgRe94XG0Tuj@/`sSc^OaZJV*VQaEX(T%/0:1fIGci2%;$YiTsp=S2*kF#^1":Redeh!+Dhl47_UKbm33HN$&(*lN+HBSq^sOqZXOuA.$fE1'Y=P2C`Lfh;A&A3#A->mNi:GE3_$-FPV+Ss*c$9=9sk2%eCQfk5"451S,tofC@+5_;I>J&(Z2\$D,'EO*`u)?Dau:77g1BGIA$:/IUL1,rg`Soe"CX@@qZ^==;Y-_n"jMOf7DW1VD-T^nJj-D@/DGj1ZT^9)(H>&$N-ER\c5.,A,ait8:Fqqjaj*d=L1-.gC9*jgN>(@018!!c/Z(cO9nb+0GoIGqLa?]EZ/%r8,C"06\AN.&p/I^Z?N2%j0ti"gt!NTY4?Y0Bmdrf?d%O-(5-'Q/G:Mg(n-8&//N4R\W>h+(d9CZ./_nOC:a>m9^l4sWD-#QmHVWKL%j\:h,nL1Bt,A(tTRk]^ed6"fT%Dl$CZHK`hk3;bZ7OV_hqor*Z!66R--B56gZZKpXE,'^=FOPJtGgL\,k-gDN`k1ZF!9QH]r"LnfgT>9tPgZF=pj$&\rk>r]S2E?rhH:,9'9^BnO6RdT3/V`Vas$[Hg=E@D]J+.aTRR_QRaI:0PoOa@/`?<(O@ah7d1K:rs*N.<%RSE3cSOS*Cu6N9.1Z1Hp+%5;/f[e0Z5a4=niOKchW.;^"Q@&^^9CVp=WNQ9b>[JaOj[Vs3P;/G9bm;tR2'D_*fVfB"jS+s-[hKhe^:\N1#P%jZMXo0N9>SgSjOQ99A3IFrW&eUBNre#cc9tKQKn,MY4TE".MnZ;jWIH&T4b<+/8d'eJFGeUhRFP?WF>I#h[5sD(l2=UtZPIfc*=%-]0Ek]64bG.3&>970##OO%O7j^5!G9n3K9P\9q-:O]supXUmY8WL'*GAsAQ;#NCoZrDWI*o/PlhOO:;]W%g;Irj$*ijDe'0)\`U-l&L'rg>(^S!PHB?@p^i9j>m]4te?:Kn'U"@+);h6VnYF,ZHbi3q!KiD`8#0gV]G3K;3]kX1=u:=r*=4A]&p_8c-s=H1T3OnH!dQ4tD;f-Jm@%bHH\GkL8\oBo0;0g?"s]#,QU%(nuA`^7E+&9E%kjO(RB["guo\XH/0)\18LV'\f\aRbR5a!TpLEM3BXbACfs8%tV1b:Y)Sl^]`Fue\c7S;Dr(#*DSXKI9)D]iI&iGn.*hkf1`9`L$b(f-`+(fJLl&miqiJr&VW12D!RIS8p`G&)[biO:/blO6Ms!E)tdUE^#hCBI&tp^5DTho`F%-f9t]"?:#ElNoi'%.r3PdZU3PJGh\0pIR=*%STs\1qVohkWN$7&uF2+S_X'A@0Qd4>C-&%1>N8?[:la6r;4kp_>p!'Orok?!\P>gWm*O;?kAgk\oa]le]ldZS];i`/)XnT9gabE;u4V]e,5F%5ZTHim#5&nki?65I3rlH3d8!S5ef:;[Q=dbnPRjj1i^:1G^Es72X2YnNI1hEaZYJ1c"J1*3tn]RZM:H8$Of$GWsagt,8:G'/tQufm:,TX_Hp6p+#W&\2l6u]l7]tilZr*mhKD2I73g1Pt&'Dl'Ekb^i+5u2QAB\=/:'S71tD<8sBVcM"QM`IMfhFNCs@?a].:c-ISO=NT!Q\(]h=hm^Fl!?/tbPCcYfbPIh"g"'LT(-3=6?HAMN<+*o2,EDf1-eANPS%T3Kk+^3W!4['\coGA$eAl,p]es1)2$NBjFEApG9W'mH(=KNa',tnYZSStaog_*@B;od!OJV=;1?gf7kK"E"pC78%+T,jK>:qR*79Po69mA4%(-X7@('YW?>Pa]^s!4^`$q>M%OpZ_*neCOJL0(2NB'*6=Nt:e=eEaY;&'?:k@_3[m3r$ac-e*P@HE$\amq4b*12H7,/Vi\R;=k$]kre#_]?`&h&Tqm^e1d->RQStQHPXA,E0?F^!b"2[g/3Y6"#B-]65IUK6K>%+'9UYNq!A69+NoB>_%R^A-[j?"lr#3a/U#,8dhR^2DPg^k(^C.W;s#r2Z19E)B*3DB1TE0%)YtAf/]?Ed4j1iAiZ%V==K!0Q>tS)h'?*%3fP3*/_t(!`eAF,G%BjP8c8/NH<]QV5V8cMk^PNm`5l_I_C"?`Z43)NJO.F.)ig5OM[K[/WE5bT&ULJTHsc8CiDQ?*\86K[&lWOFn.;6"icKp62"F!d`oi7pq5,,u_Kl*#1W0%gEmqp;!lWrOWsQj!'NZ<:>:m!Q+Lbld`B`kHNm6RIoFb:Nj+XW,+)R`s#BdqOEfCM"P=S]pmmT"eT?-8C[?B5OB027_m3>:Wl:#51':(kN]O%)kKgW)(8V&Hk0,Cs_%/H*DpTG?qH/Y]#1-t#uDJAPn@JQ+D1CE#mc\*SXEkPB!0+9e-Y^C%L#5-Lj75(1UDbQ6)X^A)H0cBNuPF'H,]l6CaRD>D:gMquTbF_Ik`])jlWf7<7`l3;9MrcT=;.6$b?(ke,Ymn)*24#X'QG8fs=,TS^E1nkNG[o^8Wg?Om-<'nS&mh`+qEd$c`e=$oqLu?oOY2+RnFh8<5=;_%%m)9Zg`aQ*-PQ)lam^*Uf-D#"5/-^a4pfD>9S*k>r;-S,$^[hk/MIkcfKg\2Qc/t#*I^ntm2f9ALf,kGd:U7X.(1&d>+1(Sl.*:Mt)ng=tJEq>-[nJJ5:)j>GGVd=Up0cBNu'8<"!b]f1C10:=d/-EY@PA.g-Tl`QYp.:4b8$K#AnUQSYo#@n2BI(R+Y4gA3s9$PlM"rB]_1Dpniuu%\TK\(99[F?Ibe,@ghZ1f4@[E*i.9Go?G0Y5+b&u)<.W(\9TV@JR\=Uc%e5`Qo\X"!P6\"(80/&f$ec!L&ANJ&E?_c7N"d;K,D:g_lHP:una"K6IXe+SH#P*ojAAL*(%&]U+b&s+\\7c6G]:6_i.6FN;RP?;6bKpIs8I1io&-$(aeLtG;XYWOLn?fP)ttS@#:FBr*f-Wcl:8UEpiSt&7f7o"d1U(%)7%GRK8QV)D7sqN#^hGr'pMU!>+jiPoBjeMQ6LORbhWG.t0k%T$IHSOpA!4a(p!f`=!aEh[aTeXI"+W)e98TLB8OV"crENeL[%2GsheBC@>sLnUegYqJ'&rOZ^\gNolYaS`0g6p\g7XHq3\1i=VTlV0Ah^_;fsW4)5O%*jqnHhVp9.$Qed6-*ri"i.8Lt'Q<6l.:2LghbTaWY9]2"#[[K/i"3YJPkXq8>Sg)\BJlcmC#'q\Oa,n?E?g%gBp&Y*B@S6d&+P7,K(7b+G(N5'8:nCLFBSP&iN0m?k:21K#PsU;CJ'r4YN^8?!Tr/B&P=i&c3APE>fABDL9CH@g$$Q9@9#oCUH4Q8^m47'"UgQl.I)+:L\St9G_O,Qje3t2jP?k,nfQjmJ6Z(3_,[ig&(4f[4WO/,^NaF>%ka)!GbEl#PGl'IBG/KG)aJH&kY1'7malD.'E#XjQ2]g8=5/=:9O""E+pibTGc=<>En9or(V6-V>8`SQ&=$)Ci>'W4+'jmXhUe;J(K15+S-!?ma9tI3D=hK\dX;X3)1Gcil(t>RrVK>tRjA@aY[%;3!7jMa5g0NDH06uXQH&TalOp>_YWi(+`ial6%K!HdGjFtNf>*m29*a)p"N'=+j#:e3UC[,Y*QP$hZ/6]A]aeGFLkWKhO]]>dE,*&8)Jk)]?@CgWG2T8<1n%4D2pK6uO[rci[oPKI%1">Y6lHZQfJd6%=)1PBHZM50>Wt;6eS!Qbh=$hrYnWSa9cSjo[G5-"\_K!%-Ie&/arhP2,J20:J^?]/*qY-%8s7s]&FqgPYc9,ci=]`*-5A2@/?J/D%OC&jM#KV_.KVN3p$Sglu=cE:0Eo&nr*Ush\P`p/ddR+<[.ZLM._6`dI:c9@YfK._Z#FpFn>S[YV%7%%5JoFXmb-N0ZF14T^OZaNpdm=WW1BKr^nM:P@BEFJa#qL@!_YDhJN5sUQ%#P0bZ#L!bY0fP7&!6P"QXm*c":qbYj;d.^/(@dIo$ug/p48De8#n56Q8-%ClN"6$)L:Godr1s0r#qU)XP7Q@Wm]BA]%>>1puQMQT5I&R:I8$;IAsm=PDmgc)_WS0lfcF2MqnH'Lames(UjhDLb/_n-]QQr:@^-Gt28N8)=K8G-.W+kBr3E".$(`%J)K5JHb7u(/:1^J1TtY!pfMWE=,TAq`HhJ.=#=.L$`!JV%1`.`h6`dnoMg0^Wg1L8&Ulh+fpt$knl/>Dau%fcd<*acdc@%2kY=(P*$]L;BApK:h=0[N,>.&0GdGBcV3E+DBBH&i`=8=iqrU:Lf?cb8LMf"bkPd@UsMkP;41fO31(G^=T^/'^6L::Y!jd\Ouk6(@VP\4YQ(;KgNKdoi;HU#@KWf]mpKTYD;)deL)lFq)p@PLH,h1j7a6Bg.P>M-$aIgq=)__l:N$?=e@J?f&8$ekS&V\2am7r`=`@IaROVP\LbN"]Bi@ua),tYjqMZE,S>+oj*b"+em-;um8lP7XMkV6olSDSMerVl+l"!3ZfNL5i9pdHuP:[en;8h/.bn_.>]#@1\H3!'(>Lk-1)O1'IeX07=r=?*nJghH)!H%U]./Jfp;5"J+ing)[QGW67r!9Clld6k;JeC[-Y;4-28_?n/q[u\bpt#L9W$pbRF\hkDI+Amm>OS^K7pWIZ$]#.o;]69iH-XX.`LSq"%CIs%)]=I<.^cEUc3'cr>i=OGeKu>J9@?*9UKaiS+*-]RX=hcgBND4o?o-:bVl:G]Q_5+\GYLN"/FDRm0766o>roe7l%?9h_qlcPO@AV[n2KoN$jT;J'k"W-DDa+d7!T^G@0@Iiu8H"?QC"@=[IBUe;&dfp])Ll`BtkeIi$dWK\j8'tHu2R]pr_iiVYBSUba3Z^^A@O7DpM2;>!n@gendRcrQcGWIRQ0_jR5cfe01ii3d>_gYEqb;QRD3Vd]arBctUhJ2)_fjNF2,^r9E%s0[8*_RM^IJdb+k0C$9OHL=Sth(K>k,8kJOW[h>$^hVtW0CAX9;k]&$BjQ2Y+V+')9-S:O)L;r.X7XNkYaS:X)Al!a1l3rZUki?oeq-UNQIp"m.)fti\3[9\.o2q%pl4uOX1kr^YZi[l#d9Un[YF[1GK6ldZb4cXCkWH)X`K5tujT$EPNgBRjDQ!:/[0#2C*p26[FPI%\a=p@2AXjL>&8[X%=MW"=$8QK,QuP./pb#cI9u_'j@).q"10b5aY]bbi+fl*>j(Q7@IKn#`\:pp8Jj=D'5LI@$J0j7NDd1j50R?eRU>l65E(gb8"(Y*f+LMu"B1k]*.`^)ILcf(eNosU$*g"0WHR$*4(e;D_'Hf(CHE\ef$X1L>NY'_^;[=YrkELOQ^d@Sh$S=UUQo?5sD?M]rZaL)uF20"I216d2WC1!eD;hg]s0RJU!fLWkX:]%N/6IX11aX=]*(P%XW(gZ3"Mo,#VaY!p8c2hO!X4lM>]<)h!fOV[F"O7'(sP+%>&COB^g(n86kte@4X?LA=`$I#I,H,L"M=dc->[\,^f&Ar;VUVs&Hcgh%u_o@?p9XF)pu12S0,X4U3;*Mic[)gf-1X3-\]ho?sn\C7n*jgbJl<'gG0qMA447SlnP^U_\SsTbkhtkDL"F>KlN_J*:aMs^=*i8D%SASqtePCC1*lsd/">gD-I9_&&71]Cga77[E+Kb^uG.B&`=+s*GGGd!l5gfHl?)p(^K3j#S%r-jhRC1>6$]<)r6$b>FmZ43GcOu%5ZQEX9H:)e(5XTbd$\g8dbJul(=9G*k9Ffp4.0#dRHbkYVa5/8*#,OI%NM@i=Cm]&kDo09RqkWcs=p6!#@PoHt4!L/<77:Sq,01kI*JV@(t>HT:o[BE.13uHY?OFn]dRGd4f2mB;4Kb1sGTGbkW%!8li:[AMgL@/UsO"dpr]l>M\1<503HQa;`gnNVnt,G=N^sp3n5n7IoBL(=i-PPUh+rhLRmbWokq3.k&](!\Y#p4kF:V4HVi7;:%,_bljcc@hG5OY\>\'ci-rdaiI4V6n@7V($9U8EQ-`So[)l/&8]hdUh>V;X%A(Y,UnU3$hQc.\+("*?%[mQ$s7A_Fjia;eDjJ`L4-^hr5&Ll'HCeY4UR1UK;beSG=\K6-^%-?6^g19AadN)bV!3Z]_/cb1XtTUZEb6l1]3R[.KD>Bj1A\S6RZED,.s6IQ8ck9E1QH\qQX"\_hEd^cCCpf>+rXEd,>KkAhBUH0K@Y_YNM<=2T=OEqdK9n8al6C%H@(`Td&9f>VJ!Ed,OfqI1+^C`B"B;XEKfI^tI;UID`'3bF?>UfH_H6u:nhOP^F4pcg'.(G?Ruq;lUKA5Z:Ch5aV+R7p_sAFabLUgK_i#UVOiZWXujpLH&@:F=B#hCdnkB;uo5"OC2`jOPM1jA-u,DbqQ3cCQHL_@.?q.iV;JN)BA&pGqaE"#g8i6@X`f9c(K='"=I2=^G3Q8_X]&fZHrnM5sG92*_e]%Ybf"I7Q;,UOD'tbqTTP="cK!0a;DWeK9Q*V&)>0hUg>9f&n1U"$/+D6R;c'#AE#-YhHX8-;uU<:'g._K3kI+4.2?pKPFqCn',)&q$"lb$-9aQ)^ZYVlq94LM..8,LRADO(&6<;RAeM"h_*h^TENt%R8UeVEe8&YL-:@cC6Mb&C8ZSj6R7'rr7DE3UAA[mR'+HP;`@W@!KPSAM45ME91.ga/*Ug'2Z8'0ILjlJg`FR%s9`4cLhH;I"1[afd^Zf8T`j%Z7_2-pu``Y<%N0MUsNXmb$Wa/q>8?G0c<9e)\_#[Ao6(@aqkj@h`j>29LcCpA:cm6r@X//r5lkmNS-1`\i1slJ5SV\534FEDle3*UkQPk-I18!;*T1c`![XDG?($N9G6!&5_W?X*IQ":9]GrMA7eb2-FQ>Ch>8HKIkc5d/1r7o,A1Mui[9dr^[D@[*[;Cpnn;H>l94B@aeYbN8g_A;EfYpe_h@+Z-48X`F'LXNq,+8?USUogAE'Z,3oOUWab3o;leF@iCW^!Xo(R&@(6ak9]eLra*H4esZ2AbCrl0*9@PVuI-'RE;_GkjiJ')+l^X$($.pR%W)Z]XQg%rer*F7p(>aW08Ho<.q=(HYsYC?a1VYB\iDm-DOnp`hXe]jdt5GneVt;?l2C>-UGZqV_Y8Z0V7h_O]4/no^Z(H#]75%XOf@5;uS!3`_G\C_I^SB-4tsXmLe^C-]b4b4E<;:aho::;S=CT.:4c+E4NLFgr9JFEn$ShTCN/LpT5VUs-#j4@[6o*e^!`RLc96?dnV*^7cHl?.7*5XEi8gQDH"gW%bId\.@C=7kGa4CT(5=#h>;M6(A-CLUdm':R`@;I:FI?VgQ>AI?/00Lu"G/`37rP-7jX$M=9cg=\DgO8WL6rl8_P9r5jWKjQ.`]5@hY(Si7ueqTJV64Nh**K)U0+5O2cO-5h6Om[XSYq(iY`3X*.:"iN>HaGCc:PrEi8iW,Xhk`>jm,O;YjD92't]iMW.V)k\&WNaeU-X45=nh=T2hDb55@ep1N$FPXjt$1G:I#ng>+N7f8?YdMc6o-ETng]p!:K^Nd9_0,J7[Oc;kZ3#Aa"pF1S\#^_8*_HgFm'AG:/YH@OJImjY?pO2nkrFTP;;=WZ"HCsaEP;dO\(6d.!82'sF2=E6;Omc3bAaZW33"i`h,-HOHG,$RY=L_U"NN)\WqRYh-Oj.::"S/'P0D\P*VBW&13>3I]*eU!=QE7XM_+$!NOYCYPp>?\CJT^L'i".J`E#9nYS[GV9.2)C/;M0YiG4G_X!.)lHIIVO5&=nD`dg'ZEl39K7"Lc[L)j,'IFJ_R%1UFmhBX5lC;+-,o2D&J[ajb;Fc0&'Tb$JJ-OCrtq,@V*?nR2Zb53j;[5u%Kf(!?A!!q"1#X8iroCZ6+GFf?!7X_%kM0V"&$)PJW\52*@q*UYb_/oV7@06F+gBYq\p>MppkqJgTVCe3L';Q=RG:I1#kg2p:m^Yjafi?Wkmnd?>^Amfd>IY?4o+R-#'r11:==*N(V*,XjES]faZ/P5HrcuU;2`^rGO9/_t7j88&ij(1b^[#9O.2TJ2@Z;4Kg=9A!H"!@BchM$%"r!^&%aA#2UgNKblSJHmTA9r:`-6Qm$46_+c>b>_B9'$(dUC9Qrg&S&q.Va"]r)EUs<2bO:@Ya,nBs1*pe/7D_B*97&ZA3:]XX9U;H::glK9c(R_+Qd_7\:P'Z'ioV@P3)[Y.@RhobO`F4n>6H6R2QmPZU!3`UhHOeZ%H?O37GO^6mcC]48=8Y*B6fK!Q=nK/3gTu7AFnr97^uZiMp#$F."R]RB4H"JmH4/OZ>7Esr\:g%6ftu4G]m$^Gse<5871.HYO_;(2HI#=LWp3>(TUn"L3m'LL0&]pSMNkk&$tuk%\p4V=0c0s4mB*BhT/L_cq3cN/O3[/Nfj?^/&s;6\#f`0SOj\rY5ZU]DdSci[P_\"0oNaf$=i+3KEqM<:6@2f7uU&'RluP9`:Mp^$NK4/X$qr\*bs-Pk67n6*j%KIg%%pMdR/=s*RCmi.0O90lVA2-S'j+(q4oZ&@t&Ra8N]TEEd.4YhnJ2b4m>A61H$]UUP2o*+40<Q3Qqk<[s)&^leR/O']p6HN3K4FS$m.(jWLQ8kFBKY*[2.^V-Ho>CWr"X/9G2*LUkj3)B!hIS5(T)9[4N]u-OU4D1LR9CEi1I?'Zo<>Qd>:s(5a=d"sh::_lfHoA3[dhp,fi;:g\4\%WkmguIY=qQD#a]caZZlA/.3=U&iUdY&["1S+ao#\EWAF%R?M.*#?H:!qFtJ!2ROQL,FJd1BQ7d6h*J^6O5j@*ERiF%$U:UgApuL(!BiJ[&DVbEi*9I,]+If*lp\`&cj!n*KHNW)J;s8F1K4DmD;$s9UP2[?p0O_i_^o!T"gCrXs$dCD!#DTr^MTYa^g+8e"G2GjA5)l>n>BCn.tYOXPRf&0Yh_mnU)Qb##L8HUL78!%5=Cps$VdY!G6%JA;h!P1W$an-kE1tE@&_g+(-O$%O#S\6,5gIr3n82#["-#-UNfC=[2n/KI"+d&QZhY8hG,k=K[dYCEZHgOuF@"L"Qe]N8R,7QNH;DiD?Qj%ebW?jqgK[1G*$/rm1UTk;*AX\OVHTnR240$2Ht?mQMIKYst7[G"Spl0J*_s)(3fPg`'sY3!#'WKK:?7&k-";irQ$doiImi3X;70fVS:Dl%pW-9r(7s!CUaNrl:XW_ifhp2&i$9f:J8hfZFAt4K90+o"]HnR?:@]%s&a+a;2i:PRUq=UFA^W0j'K#'fEN5K"ni3I?H@qaa-G;moOH\P_8>MGE.&YfkB9gs:Uf5J$Hd_ZM1dC4LF#oudV)`BhqV7TI."-/36^0bsV^kAHT@4_?Sq,93`R]UH,ioMgP:>TgKJP7BNeK8Fjj&T:39:X+'0YGPM%`4pL5PRl`O:]R9BGT#dno-YmasK_M%JNBSU\1GVsP[mC2WkP><);q41'J#F$q1dV`KStq-%+.L%hXc*_D$XimmYa(D2tJLtL=;(]Eo$9JU&C())uuR?1lZ?ntIf,ni8D=hWnB@`%[`PE]CWD=Ga?m>VEMjO>\m#UVq@_^8=8'Uh2;T_(JH["abYV49K^c#e;L4X-7jX$EN`H.qIRap`e7#ZXS9F8bF_J&Jmk1S`Rck-9\GS,D+aUHD`>\AB8+Gh##j-)?)1TjE:uZmut!Rai)j+4lI8+/t!D@W[6O!-7kdWfMXPnZs`il7j>pHhLSSo)"JIRpNgiF?fj19-In5f;6SuiR'?M1,Zb.NKp+_Z-LCg5hD\m=Mocc]"TC/L7PI+Km<2fcM92!sQmDQLoueF4iB/j:`1lg:^:&fhng>*14o@u3gmDX#/F"P%"d:*Z1*I%/^gs6g8g_h.7-!,_@JPh<;-539fXil;rC5uhP9GE2Z!K^(EsB!^ic0[PhMPet@JPffWD=N]q_AJfC,GZK$-SZ'?LBQ;,9jH8^rD%N?;\BXP$g'+1D<^$co16G9XntlA.h8uBlT%;bF_J@_CfV)p5ht2H/(Im*muDDX)Mi0bF`T%&uh.l?//WQ)"JK,n@mW91,4ptU0$c"YZUgtTqHgH0qF:o5r?Tp&&Rlb'2uYqTHZ$:>EJ7p+3>WD.T[LeUWMS]^M`+3R#G-]aTOR#=oC&LPeWT]r,!NX120&9OpUN.CK>?qFNPCn^@).W-6rA9@m\23W4*R&jY%s!R)I+";`H%dj;tk32p+>GY?Oo&_ka-?CeP,H7g$UE#?tPQ%erC$S.-`(+S\dJIG63#h=SF$#-jPSX=;6oJU:G2]?;XQ0mVf2F>4ZDCE&K0#Ys3cTCNe^0/Puk+VRWAP>#osjjY4eTCO?CpVsbj@PY542^[YFI(j5,=oMkC'\3S'N=%#hKSL$%/[eFMMocoNo90KY#"p;a@?9\:ohP<5,XR>Z9;140`(/>gmPs;]-Kb9[207"g'8Ku7H]r6$T=6->NAJVoUM&Y+2"DmSE6UtBngBPt22I46"d4`:ZiO(^\Y&F/'6:V>B#o]u0gY2>ogX&$r5llmXEZAa,ak=6S5kW*39;e?Da`>R-S6me>KL;iq,cW+ELMi#G4iF6tn$#PKIe$#:%fIqO.='9ibV@q[M_&3h;:*-a^2md^B]Z1"`LZQ9';r',\B_']Jnt@Qe\_Yfq2:+.rg!.c1?u\J-5MGml2a_Zr5g3rKlt7TGrI&V/OHYo`@69?6ms%KcMGMC$$fuT5OSH65FM;>_.47+hO'N4,2V`B)=eRWKe<5([k4"m":qNAbrt0ld#L$d"W*A"p09@=p9MBoFKtTU7A+UZ264W54Q<.$hn>ZQ(R$epL)-!#@6cRk5HK,&Yb>"p@Uer`f+#&$_o@@1N`Qa:4QT?ck)CM5fr]uJDFc,8M5?jdX*r,,OWEo:/oF@g&YX\Boe_k2rZ^@Y?gujc71qmNUh&mr7@(]Ef_<)"g#kg[+e.qaH6VT&Ikl$+qr&QrVpjkJZn]Z]>"bLY=*TLG2S#:GpKC516ADCkmRZc"uQ1j29\JA*Y)!Q@;@A&/EaUPRqik@!/e4,^f'JD\D#Qr?bfLY4X&HmIc"_>`rp@QWo9*PAR.;#efDtkii>RTO6hrrN=:9)OQ@>Ld$S3`D"KhRlK+F!m@9TIAMM63nbp@p56Y!@;^LiJ[nSD)M+=-95q:]bUD:VU[7sc./UOIPm/#![Bc8I0TRIud<-(hc/U0@GKPk*26Dit\$-!uo4WS5)I3E&WG\9'Jbe/DF>hDIB":LqBX!n%WQ,7sL(dClXbH"Uf*O"X]r`Y9g(A1]V1BL+\&Qi6Q&gmY)G:0j.;k-AJb_KXAp7-\VRS1hQpRVaT=2bf^g\0eUjGm:5\!:.eu?GY0jBQ9')F$%7F?r,:`KpF8&&(iY-oCKZ`bl5j1UZT?aEPLlBc?s!JMH#^='f#R1mtkQ6m*De[5"7#*r/0ZAU:g?UjM>dHq^:mB&pi.;ni-^_;?:SI6tQ'4d#,?nRK%\YBmXp8AK9\&Qk3;U[(q[4eabLeG)T#%jmk)G=_(^oGfCHF+@j(6.'P%g-l"D2kBu[jZ[7[5%rPX@]_Z0eiIH8TmQ-7U,YiZ#o],hKEZc%4kV!nD"s<"1+kbLNF*n6KB9$f[YZQ(ke$+g%n;CF1&UHj#U.h$Gq4SciTGFOt5.X4P@0WSaCSel2cYb\ki1>+To&eD5Dg2@bKI-"*:hJhUE6"EkP!3e7FlV_Ia`=^7=#J8cthC:ReJo-nCX\7CM^7lt3[X4P6qsPm6BFfpYM81X1%UmXh9$/88lL%4p89V_k(1lgCP[k-Nfg8cs-?ZRr)q_MAb^%QSDiV6b;8GMO63Jr1YQ/,PrlAQLcKQ([2Ch7QmKC]q4-]`b`8OjZ6:bW!R:37/MRe%.Wq.'%srMpa%%bVYk=S9JADrU+^sB`h@Fg,B+eQ+"]NV?'e4]r]iB!i\r>W3.]XT[:W:9aUla\";$`&ukrS*=o@cA5DFo3OACCDA^+%fOeP"=N\>uCY3;Vc.f[:X8'+%ch$VI>=Fr`glK-#PII&[k*%ChF.'K(j6)0*s3G=r**S'J033>tJolY#R^4fc:Rc46/j>u+p(oe_r)1,H?75GG,as9kCjP`-QS6EBqdT#b08[0:=K22kCN*,FrTs@Lo0+O/G^DjMf!@r-*IZoI>'I]7hR(P]pS)u40kXO=L*Dp-VT_ce^SUDB@?>k5C/G")C>f>XqMa2,s$_(dol3o42d6SS"5^%SA[`02X\2)rU*UH.heidIq"'>HEn&Sc.1WGlsl1QTfh3)mW`AXiJi6sXPb^\d``inKfTIBlSuRQ.fmaJ\(#,sKq0VKka\CIrYj"P*)/+o^/t6q:VXH@Sd,XjYkK5AL%05L\6AhB8'WM60[NEc[b`$]%e8+6*9',=:hdgGY%^KJM*>W`s5nn#&s!Tm-g,qNDsu)SpW:'I)Z(<6p;DPu]mZWCF.Q8P87+eJK%0';^XXJQ8q1!gYt*<.4X[,TBtABE;>b.GQ-Ks]ie?ZCFf-YEWE\%92Ma%Z;;4NA09=l"-[XP@/E(u'Ep@Esk@RY*ejI#1-b[gH(o5'LHc8W?@d'Pl(#PelD'*1X%g\n/hQ$*I[C&1jH?,=SZ^7u*5geKcY-sLUok+\eg=mhj<.,Fo`1mXYH/tuIa(&g*Rh/;>l0T)Y>0lLl:%@aFANEIN]E^AN`([i7CZhimfJ_#:2[UNf-UurJ(JK5E/;!Lm\lAG7l1Oejdb"'&KQ@:f3m"_eE9cCc@44d3pGM(_'XpY`7Gc)6]\o:Tj>>qY!]@Tq@$n:[E:^q4:VLF.@)?pnKLLA23Z0b*QF1Xh\qBFG,glOU:u];"kaIN&.Z/-cM5BJ3lpu"R#r.SD#[VpjjXJGAG0AQf)m!be-fYEAkpB[.2p!2N*@b:0HWIX7SEQ]/LfKFho>Ar-u_9=)b'l8YT3I?>FLCcWRq''/K4kT:QA@L>1*a3RsLqK-b!3R:M7t2BfRktkc8c":!8e&(@+Mj)EB[jJr-!JdrKAW3EqA7dBP:+O<6h6%q]U6L3&&P^(7H4H3teX"T]!Rj8b2;+^j/e;&X^L^h?FFOcEt7!1as@8P=Rhk?X).-=Fq)?6]a`fUTr+=ULOs@lSg1'd27hJBu.aMk&ufVW(.n!`lDW'"NOhfWu??\egHA![il5UbH1?L+RZZ(p.j,PK\QF1k&jYUKQYQ42]CPUbuPjN!,]6g]jj^5`l0S/6W]TXrJRV/#U_$PWE2)>(3QLh>sscV\G."4[:U,;WR@NUg9$]4OX0.jjXqd3@teEiecKT#6DdT3>\s^(]k(o,bC$$6t!CMP0@&3k-4\MDBghsEa)$@,TnmtUaJd_"'C:l+>',s=@mpqES;_C>hkX:fs(Gr7Lgf-2"JaJeIrckm>m6k:gg!L!O^/!#2.o>ehTpMq6"!_&J^Dnh>V$'C;WO7kK%EBA4PJkkJ&q!GE'LcZF4>ApWPP@VeoP>'/];u)eMRjl,_2)WN+X./Dc*a]B/lIbQ^fUDE5PXaS!8SS3#FJ*mBaTgp$!&S[`5T2_9(L_AUN+o/7+1p2(i:kf?NuCi=f1RF9i2,GTRK2_qSumrF/kHp>p;Q97.e>LMWWE&fJ>5q[qR1X5#(F%3b=(nA,h58n1EbE'i7n8].\`k7fmS67N-'IVh^WQ0kl@YSne^RWB8pFkYjQNrVqJu]0ujhoUQ`$469"EH)7nH-75\]B>,gKY.QC4K/;60JWXXBs^?6M0a(V,WrSVpoI"2I>]UnQ`+)Ub9t&IrN"\6+MC:nsnCZt!A;6eXUS&L-TdQP,G3P=pp,/'EWo($SY9)&D1WE4$JGTQ!mIl,[i:([:F.Po/a&EA\Wu5]P0hiF[(H)X36$%3+Q>ENL2Eh/Q./kll+p*8rGhKcTDVE[;dkHZHqDiM(?u+5t:]q&ekiEg\'7(3;JZkrs1A+mET[Gp;L5Eu?4e[WAu(l/$Ja,e4@$eW]'3JVu)$>t(s8,ki?bX@_hW\>YVHbAcu!\`_oi;0$Tn[A;k)MJGu/]b]4sP$9]E@3p)7a(Fj5Nj5[Kp;5tiO,m86jC=LQ<4,=::;;`(np?Y/pns@6IBgNH$`=i)$.`>-n'NhWYl)Hc^KS29L!uiW$,3cmdp^('aBqX#X47>[3-LKZ,2CJ%hh:)e-Lp1EGV>S98ga=)rC5.l$-Q[L?ESYQ_D1T#"O?8NDo2&]'E;h?cke;:,a7TR7&\^#SkN8cA.l2b3oR]fNXE)OpPk:\Vo?uj\I5fjedJ[6q'Wn'fEl^IM8#3RDen"3gnA?)\^r>jIffcFYOd)(R(2$]"S_e,FGk,<:u`G0p=%n0R8/=b]"iL`0t!Bj;&Dp5FI1kqc^`GEjd\gKsHWoK]PuV5*WN>8<3V36uYP=ELBMrPDBUM2YhYB6?6SaFu&@EW#(X@Ikc5Z8,!CRWfdYuURZeRaN9+s:F;iEC'LWV)qhMFWJVfYgNn.^*YJQA(F+ib7fWRXq>_ttiSe7LN@(>mqVpD@(F6(8,Y-2(,VMfRk%M,5)`T%C&!$!Q_o&uq81;),E(!f88;b=*KH4s!K\VNAJ(liBYWbU$O"$HUL5)LBV-JQs;dW)PmToGuan0ppP3_g%`f[Jh84N![:;XGD77&S_b7ur_ctAMhH+`Z`Xu7PJ3s4@Rk_#\=ogKZjkaI1mk_)t*;]QQb?!jHO#f':/nW/5<06u[sYNYg,"`Xj;j!\,6FnH@P_cbmah"_$Sa),LES@3a^NQ%+ea.?LBkEr4oL4_*4-20Sf!]'F7P/bu/6?:fYLJ0)0m>N8uI8*Uf8A:'TTc4XD@mVp#qk`pl,er2PQ2WuZp"OGUpH`oVE3R%tNb&h+8njHWk]12R$0sChhUD>>MrZHW;R`q!Epp=],ZA'4XFCS>S>Sps"lcF>'%R<0rc[VgT1ERGTcp*K"+at!qEf5(IhE>=WCa%*_\kE\X:LKT:`ps$;j1I#l]LWBlO1hh9qZt[RCT5MUs`8bY\P9+B9I?s>_YNCX1I3?Y]#>%]$Eu4!WCQeY1@hqSOqB0J^)_&jneg,@X4Jf:*&C;5Vm-p",q:c+LDr=J/!e(KY).>&o+e>!_K7Q8<116=oUlF]:`gM]%Y[9a+X,>`8Qk%g;OmA18=u4$0qtU_j)BemEm2'6_hFO@=9<@%[/TU2pru$OGmY-U.ABn8rqt+Jf@JW\rQeQ?02";c74t^`]Ko/_uVDDSCO?o]0hA,'L?X;3b+)dn]ain*G,d^5.IEMGKQV5.&LKEElN"+#d7]BA]_lK]LO=]bP$-pH\8<2$JoKkefC>6c?M2lNSMlhF"m7*<7W&'M]@JP8LSF`GIN\uonC>XL?GdQ"4G;B*B.uC^A+$1DO_Z-o60iM09(Q9V]N9oKYAXM(_Y+02^IF746&q?k_nh@@7qF_S05",7R:*Rghm8e6*`S":6=P?8QsiN&m+or?OTVV^%=b:"%,Ds476=i:OV$J^<1c.,5`IP2,\:,4a/c`cEn-hmbm)H9[,P8tJdiE&'fp#MQm=O>KSL$X5_[?V'n``?SQ.C6EVHQk'!C66@ICqE18U,i"4+OGqLdEfYp"lAG],>i1H)a')1mb.4ds%pM._+!eD"0=fH`f8s6Z!YIA6Ys(^=KtEBgRGFu&aJe8!,DR?2\?p[\obeT0^bs02j]^R[4S6UiZ#FEH8^K$EOGp2t@O&`\VS4gUXM=17:Quc85:1fV,hKP]MtKA6*VR#N7E<0UYj.S/Qs>ls*EVo#?]hEC<=/oV-[QG_-F<OJMR*+Yjsp-);QFST93qf^]XN+N]&FasrXCIb8-D)Q1$a'u&$2Z^eq9$CU#Dctl')ris&(J=cUH0fqNhg-u<=L1H6A:N;XQoYm3*ORsqHf,0_,/P2^2o/Mhu]Ppi*<>QrRf46lie3(\b^/*4)j6nC322m4]'oBgJHr;Bk[kBk_Ng2cq2.:nV=\+5I$(4#h/`Fl$kYgkXlUU.h2j;/'*\H?L6,u._9fAe\9BH_b"p:Ke(+GfW4X1L6JOLOSngjpD,Dh7j<(*0\()*s8)K)R50I`orn(8.t@Nrn(1q(Id-Ogld%fp")0@u#l~>endstream endobj % 'R11': class PDFOutlines 11 0 obj << /Count 0 /Type /Outlines >> endobj xref 0 12 0000000000 65535 f 0000000113 00000 n 0000000245 00000 n 0000000410 00000 n 0000000579 00000 n 0000000754 00000 n 0000000931 00000 n 0000001209 00000 n 0000001344 00000 n 0000001618 00000 n 0000001724 00000 n 0000038569 00000 n trailer << /ID % ReportLab generated PDF document -- digest (http://www.reportlab.com) [(u96\216\262\243\302\206\256\031\301\(\316\267\377\023) (u96\216\262\243\302\206\256\031\301\(\316\267\377\023)] /Info 8 0 R /Root 7 0 R /Size 12 >> startxref 38621 %%EOF biopython-1.63/Doc/images/plasmid_linear.png0000644000175000017500000001226512250104543020521 0ustar tratra00000000000000PNG  IHDR&< pHYs  tIMEt(TIDATx{pg I0PESn@9V:3՟9:mm=?3N<+mm d "Z,$ls L>d;w6H~+V={v<֭[׮]̌ŋGqw Hdr=ƍGŢѨ@*))STsssϞ=@ k6lܼysmmmF7dD"[o:tSN\sM*߿@[Z555oV}}wQRR2qļ<'0`@}}}4ݻw1cP]X72Ç>ַL\_XK$?z裏>z !3%ɷ~'bٳgΝ; 6eÒ֭[7hР &vy,ܰaCFNcqi***ϟЭ[zý{6Ȧ,X`Ȑ!ojjJRoɓ СC-Yzu6m*,,,((0Ț{w}… sssW\~wȑfMFٺu7޸hѢc&rO[>c- ˗O_qҥSN!m۶G]n]>}~d*'=~ӦM2ӠA} & d*3555.Pt"޽Q%Ns=7sd2ylf0X8zj2 }HOsho.| 9HH 9HH 9 9HH 9 9H 9Hعo3#.W3kоx2lmrd<75. kH 9F 9 9H 9HH 9 9HH 9 9HӂI&=3hԌh0 MK@r@r$$@rr%zsɁvW^^xڵFm(fpT*UQQFg 9^Yz***^z饞={ H?p͚5 a<877L@r]:tѣ^{?A^^@+--=z)Stbm/ t:]YY#TUU=3h'#j\Td˖-_җ92xiӦ X@knn޽{wCCѣ'Ol 9^ˇJjӀW;w=z5jȑ#Ѩ@{7\ ҥKÇ Ho7n4jժT*D~I&E"cN;[|oCƠ $xSl_Y̞Ag!oJ>q|0A}^tΏZ}|…*Ӷ?6n nflA:fO?n!}gRo65rKX,̙+뮋[]3P 9f͊x@r$1$@r$$@r@r$@r@r$$@rL4gFf@ah \UH 9 9HHmc۶m֭3D"'477X@o~t9//@y%ih\dI*\YY\uU99~*hStW^em& ãG;v;Xzu^^ހU VUUEÇO>=77d3~/Fss?d2y=7@L.AX~q MZM6a8yAEQ3hKͨ͟Qjkkkkk7 9/Ϝ9&M>=J}l:8vؑ#GvܙJꫯ>䓒N{9vriC㟷P϶}0α3wx*8ζ}Eiqbg*8/C8akε?ѣ Fb]͈lH$JKKsk '7'XCF&.ׯ߳gOMMͬY:ud 9.,Y9rz+ \뮾}~GC5 py0HW$$@r@r@r$$@r$89uuuͫ1).R$ oH$ׯ_AAʕ+͛k^}r (///))D"=X߾} kak֬2eʤI M c9NZbEqq5\7^X{wf?9ީ>ݺKwgG[wmʉz5$$@r@r$@r@r$$@r$$@r@r$+@7;jpx2<$x<[~I$/|ͽ{v}W9pvy}=zȑ,Xalٲܻ;??퍍N%Hرc ,HR]tO~r^zM8W^|؛6mZre$9x3nN:9 9d_WǏb|O vm~Ibҥcǎmjj~ &8І<h4hСYq֭[fM>`,w*y,ֹs͛7766F"lM999avڵYo*Q[[k׮QFec!;wbtAr 9 9HW|%ٖ[IENDB`biopython-1.63/Doc/images/three_track_cl.png0000644000175000017500000021245512250104543020512 0ustar tratra00000000000000PNG  IHDR #ve CiCCPICC ProfilexSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/V pHYs IDATxݱ#Ir&`)Q?[|kv2zSh"a_:ͨSQbQ@"}lw@߁~o_gR@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@ I@8{PO?omݟl|q_OI{}ݾlQm?W>|}ϧ8/ոg.cVԄۗ՞G8ϾoҐwʞ}[^>ߎ-.Hs`Z~pzom힅7vY/e~dϾku_˼_xwU\6?հ=}v3s=?ar_>s½-cto|٨ۿ}MFQjBJ5/K|a7~vx5,RV4>=Vt;;ý^?|ž?|>޾}xVYxvmS~dk.yA^67u}[CCa~e*Wgla_/W/G.Lmݗ^ovj{=5=&|{ogGw= vu4-%+#o?G82˿U7 *Á5 5NunKn購|KwN?o+~GCUG#. M1W+tqaߠ^׽+oٸc_lsƳ@ ~Wφ f %3؋:b> ̼y?0wwO1;98J|8w1x~7H݅7aؙm/>)䡗rcN˯*tr{:E[zk6zҎ1[۷|lg_*? DzhА6}/Q}P_X|ezˢ N[}3ܽe{G.S.; O.Fؠ5|ڸ_rg ^2չƽ R+jr=ㇳƘߝɓZmu;OZxe&ֶ#f9'%kАv>݋wAl?/߂F[mU$mׯѯ=)zއww^U|X 3r+Yő+|8-c;#{}m۫}{l_~=}e|=yĸWTmccNï\>gED7>[[fCob7ȑ?O['?Пesɉ[ һ{fϻ º=Gqo\$m 7ݣ}& K77_.\۝ .dgf 篞Ƴ$z=zKZzX] 홍yw>~Ϋ|ZʸhΓu3+ mcm ٺ5g=oSyM: +HڠID,=@XKb<y4Cn]kΨ6Oqe yh% ?ݿ뻿ʯ42Ҵ F|xӱ,jϷ=);^v/glFLuF(6imƗk6kyVߡN'l:6?WAmmFP'}5 |_|MsCznS ,׍g3y69Ωt{3.AC G!\a{'E%i_={rǏ?_Ǐ~||c{~_~W6?ZP?_9?~|||nx{y}uǫ?>^?[]k/;JgO< ?C^\;kv~{m?ΪW+oqNxxkZzW ,o˷]/rL㶐FՅ߿٘ZW'=o.){?Ϟto/OBǿ^pWFױm?s={/ˏOmճܹ4k._\.Oxo&xx~M 㼸_vްgeɗwA/{ׯvyz$rYn?|ˆ ivug珏_]sϿN>7+^6l;hك.N>K]Se3vur# ~}=waduw={˷ 6t^Up٘wɓ.~(sUs .˟Oo?|>] 򻶿Y 2 c>>~c=o6Ƞۦ Q|]cK3^o;Iwmp3{xv}~rvIV};m@۷מy}׸*/;sƷח,}h5wΕxkvT_}m;R~v>^6/?#v{0y!}܆ 99{+S9wWoWN.w^5vİ[|oyWa[w!lc>IIږ}UCPͩPUN8˚|LPt܂=E˲\pn- b3aI`E+Y#kn{,ViýR-w -K3a,6jRB u$lc&Iϱ69ֶ߸1FA0cJ$/].&d0bVU^%ZS-$m)BQv7=e d`6:62BA=sdqpEas` VrL=¥Ko]qVԴߠW1Rag /HYk#I&l 9pX4k:i؁Q=*ńRB%O-6,X2,e6&:n4۳cmJyFZnUt+ Y'l[dg|&- t|R MC4|!{PobFrH!KFk-j.HVfÉ$m@qvmrEX8;k ފË9qg$_yX9W%ږ)[ YY 2 Øfz;-t6e汶,7,LmV^^RsU(Na-MBCfK <ªcBV/l#I@ѻ`nV)Rc+2w rIbRDV~vnG|Zp1,Xmt'iplNw5tYr4;,,73B),8|8 +<6Y~8m%iQ ̲π,㤶 006D|X9W%*#5^@C>wn'kY\`7|(eeK6:ADRVQ$=qUc5D.9^L X9 J7n5zKwC8f ˌ0c8Ų'lID5gypP+"7IR O"e. 搴APK}dv6kͯja {r+R r_6) Y46KUΟ9F6 D[-#LVxUZ>^wK lρiRNa[}VhrO8忔=l{ r/:;9R,6_hXEٖXff#OXN†j-{$m0PFXI҇tDMoTbJ搯b >>L? "lI-f86Ts{SwS7sz*ceMmfÆ6ә&"l #ŖA}pm˘PFk Gdfr'M@+*emЬp'gѐ 6oO'i$v}Y#9ˈ+%շdQ.¶2lKZfM?cee69+˵_,E\.I-8cmMrpEETr/LQe fx346[xFN6H#}C't\%z cNR2)S酸)=3\FF)Bj̣]STm{պiC򌰍=$mX۲4F;=ae|笆?Q#l†t;3򌰍$mIcmN- 2ng^>^:^ 0#mEe**SH=6B͖YJvdQ`<#lc ڞjVX[[~iɼoӟhdTe y&ol}U Daf%ÆE5HK%a$mL܎zok[SإM+M;6, J9u>)Ohu@'K36d$^3 rj],d.Us;M_v(e8QAjI'$mcmxz׉!ɪlҷ, |jT"ʱ'z>qJMKZcm<$ivs C1 ťVbj)t8,1Ŀ "=jHqbaCr͂yHW6Hiб;8ȱ601)Wݔ/PW6 J9;ݧ+61ˉ9*. aw$m@&7SF z*˚i:PSJp)bO>'y^246dZwҨmܒ ~8WC? @ wTTo}O}y9N\e}`am*BZbjRoBN+0@YI`@wvu/:yDɰ@QJ]Vs`~4l#ha1k9*lgQ \Aȑw(2",Lp,uzE@R:Ba,],4mY6eFke<Ƃ K6xwDnW܈cm2J4k)0#1K9HAJmm|5bgxtgj25ޠO]Z?S(p mDS l(Pgx8ֶ&I8ֶm̕Su?.|%ȤX[wGض IX[q֬6V '+u]L'9$g-,{ؐ}9:klE0OtwXUt|1)RG;|L"ezHL%gL֝A I`ѿM-ok V^+NWi=¥WxIi+ET3H3aC^8=#l[ o&Tp;]IMD*oiyGLٌh(;a8[~ƹ|`I@z\']t(ؠ)H򎼰qSlm:lH=x"n9ֶI$nLP~]!+vzTxpiԘeqGAI\Ұ! )`9a[̷Iڠ^ږ//[x24rps&he68.iiI GJ!vuȎ/%6XH@ Zԝe-[x &ijt%=L{k p f†.1)gHV%i9 g$P̭^Y_@:RbN]2NS1fգ'a[I6d%X| 55f7L_8*cuLZbʴ>3kfÆhc63wmHڠ,⋹ӅcmGЦ~}2タm0Sa^I@z} d4_ "]ؐn-X4zIV *s9~눼#i,J=d@g ׉405IV jV;ٹp*e>zIy9m$+l5ZⳢ(F9Ɖk8DX~} ټ%|EDq-$m(?@2Zuxklͪ(%DS{>]u ?(zYW>CIX@(w[ӝtեC5K{!8atMYF L╰-;I[3 tDXzI'D!2f†DC% Jؖ h h6 TY5%]f†6Vy%iecYTsv!Ͳ m<1&i #Owrk+pFLʬcmiI'ä́ rWWHcms_Yr]zmN&irOXMOPlEKB0$  %i6H_~9{ǔm:׳@e6& _~x ȞU ˏґprH ޗ~#9_BN&i ? PQsvn;b632@[N6[v3|\# 4 Sy%iGG‚jH5`&'`># YI.E̖ rK<# t@wb63Dg<^lIڠ_eC]-WF),$(dpY1[~6:,m'߲/_`LھmaAbf Yhʢ 5xh`AŝxŜ>_v+UQJ`tyOP1$ ux[&_9V QhpvW;IW]?PͶu.拕YW#bow˓Ae~C[|^YsB#WylL2__=V[#"Ѣ68"WmûleH˸ #hcz*>hjQ8BRc6;׉䚬\bg+1[%6(ˁ6W`*1Yc.O0f#1A#i8MՄ9 jYQ=b1Yt&2JV jr;B+ak0hFY728?/gay V37i0I0 HӤ|4e2VqżX*)Uv=ؿN!4Es񰟹@[I6੘̉+S)#%" S_L{:6#2 LL'1[U6(GG+("WD䱥6+L_$iuI][̻*"l3G]iNK?͉b-OP|ƁDO}%ͫw)Vs@R_Ҙ!鰉B4[m6ƁGb 9oyGMTpi\8ʹn)#()#T.v!Y$f+OuiLsQqQ&.!4H(d?~D>l 6%鿤́^NJ$'<'i0m𮠷DnW:KUbt5 3uG̶&I@0Mțۂ7ZPÑEfN)M)PA:LٖgV( /|Q-xW8va||||<NԛqTguݾ\KzwK}brl?O~b%W2MӈVLY7|yM["D)0BS\6XbH~vkCNhV03m[r++@[GYBӒ+u*@3JLVq!tAN_?=-gM?ŖQAǛ0.b6iNWUKc&KU=NFſ'/i[AƙGYEQq-qm6HlāIK>m Z|/|ue¥Q[ư32+ڸHFOkr;jQ.NSu?$nQf"b2T1v}%fJ38|7q,Tq[xYтo.,Tݔ/PW99emc-lK[ d%f㓤 XwEM?e%DCe)%L LPX)z뗴1 *BZbh!0␴AJhu{u)(0Y)6U(*AɑpDመ2HqG t/dqlT}LjUgjWw½u.tRlOg X{H eug/]u;ko |jTQR ;<:ftbSm|%iH&E6ӝ6j]6%EՓwmvY석/*b/iCb6A2e]>x:N K[1;SP3̡1E1%idcݎW75ukr7jRrV]Ƀ/5Qņf% BM]^׫ݨnjy(r$mIЮ;^uɁt5Cŗ (oԱFQ5,O@h GԋVv`+3)&iҰ{Y21'|^|ɢ6yҽ<=!Q#f}geCb6^A ,],NlLuz!klvPFu6t:$m@7)6>&Ї4gZKKje҅2KIQ$4Dݧt;3m!i.۸IŕA7vDJjU[ ^SڒWMr\'5UcuWu29 rё ݣIf~hmWR-0B1HR̖h˻=[׉ ۓ3b6X2RjT|Ȥqn2] REjِ]'ǪБbޕmN3bJk2)I$ ^-¹?sQL҄\_ܓu"Ӊj*6wv'+𰥅؂3b6"9v.z GGZw5g6ЅRvXNn :*Q8f(\rK7#ID@ w.'tk5.K*T˶ ;TSoIIOA @aXbG}5SA9Dxc[h3z%Ttk1S!lua1!F9WޝrӴR]q'rPPXEٰN-LV2f˻Vɼ_1$m0P̾"֌/9#,;ʵߋUDk{ddlS1Cl)fa#$mלEIxʢRgۙ8Y->Um9|i f I&0;@YӔwyTJZUePKŊ*q˨B eU٘CpӛNy ɓG>3p8~Rb\*VTI[ iL¥2> M^FXh8IQ8V]Eu{_ k6p~Sib5F P&f ID4@[.U:3@?nho#w1wl5$Sdn5Kc1[Mtʵ!fI!b@۶,3~^6ߋsXѶtW%dX$f\f䱕lt$iQϥ m lĨ dʡ#5)1-3KQF>P7rVoї /GGÁoEm;rEyX9W%ڐ^MV \] YޫXlt'ik5Z? [QE+xX9WrQOpYNX+LqmJ# bёYvsӁhF5.,Iyf%ږ\FVB8%cXh-ta696G> .f"mj4x2gA,X,[aLZ l!i@fhk`[yLGk)h[kJTZnU\ ilą[&#*=,l#i!gfpRE<6_7‚%9AܻT˭uXAP'ufĆO_1 uΰ3B3 X"Qt᪇A։a!rq}$a8l&ixۄVs96͚CLj]Ug.R'j-]^d'i|vms-4UW/% 3^T˭uEХ3qVTg36|W$b6[!fHtL{@n%5OYA;oM w07 gJp1 cb6}-KnBV81sH|p7# >˶JIFZd)m-]3WjBZYc%^1G-$m©kṕvy1ơёD%٣R-w PÂ14Y{EuF́\w@<j%xʐEeZ]ׅp o;=5cU^tW^lL&irG6.6<YbP x ڢ:+3E'ZaR{Yw231ILyq'v zU,|V#P궭\;eͤ'ce eao=~駳p\.Ai6hg` ?r.?>d/{ lf/tL} V6I^qo~0 8$ Iwh0'i#nvW$Lb- /Iw'iCWEi$[@jՉxmi%fu B B-$mrVm$m+:=[:}HGҶ@6%t%Ba I"⺥AU1U/0$mK,t'iOvGC.$m!0I[q%A$mhБhR$ic>/I[MR%$mNꑴU#RJO$mBVJ[*fO$muf!f{H[q$m%U zH[$mɓ`4I[n8BFA>`I[b8HҖ搴$L8!e4|IHڒm`&Ix$m␴!f۠9|%I pd{)$m HE+f?\*&Fڦ?$mBW[?@1HI"E$m!V#i GdHb!E@@fHyGLF&"= I[2$\$m!٦ >uz$mBv>G% IɲHLv&1N$i#:14%4CFFaIN =(@F yHL6ITb N6Oht-zT%iI(F-$mB6ɯ?~=z#lO$mS LFP<x IDAT 8Il LvR*I!I$mBvPQ@I3ɐ򒴝Lض.I8dZ&lO-acm$mQr<CH)IbYE@6\rw΍7z1 `cԷG"d,ML&&7=C-6Z$@Fچv 8,D^4fAل fpʓ 0A0ƴ6]U.9Ny~}ϟU=S-9ڳٙ(-ENҖ(I@$ms:(⒴K2I[҄mHҖ¤Z X$m&S I[2 2j*lHF(?I,!iI.#3ŐeFI[~m 'IzœeIuJtP6I[DY I[DJHڲrm)( ؔɦJqlYH!Uؓ HڊffVFuHM-H $X؁=D7(LCj%i+VjRjXIV2րI` I[ŕBcRhPI[dK[Q# dK`%I[-D\}'ixO5$mMAV)WjkHڪ#^BVa[ti I,!i\m(ӵk׺򕯴?ܽ{M7jNu s؆1\\c:vsMfL?;P9څ6L=7tJ)lfmnʋA.R}: uӶc3!?ԋEN/ymg{w.S$( ]3m[7m d$mݔ Mom" ]X :uekʉDFaf0=^NcƫnsۺS Ny=7t@uuS1m[pPA5u'Hv5s;{Csz5 Mnvp[gCv[Q톮qP5v[ ݀ܽ{9C.Fo&>l {%;j;n}JbvtV"'Sԝ}H>lSלyP7䌌4]\\t?˃6bL[>/>@?|>xGӽuu5k;ҭIɢ7tG_7[m ]Y,m)Sz啱 G0S4OŔrvyMt}e hنnWRa\PzPLdLV>?._^^^}2uPu,^[)y A-Z%NW|UkeQ 1em0kgJ)Q@:yD=(M\GE٠;X% PIVF?P_>O߿F?nvoki4Q57Q8 ޽uk{^x藷o>ƣGkvvffG ^vE_@/yOja\.hp1ț6 ?^w{a?~>_|g_{+,h؈^oY7o|뭷ڟ?a4M _~cs{gk?w??y睛7o}"?Z?x/'#c|~c>}O?8)a,SѦ19v?S `@Җe)ZjژDg<-v4E+ا*oz)qaݏ|n)oE:1v>E7-`6PƩ Utڵ,bbǙm-Jx88)6wxݏ|u4Kg(^ܘh#.'St6gl1[`wmY|_gC=M7qȎӀA,6+Da hZF6?~*@GF#[t׾}_lݜM =ƈP{MYMjX|Ymͱm@\nVFX.17i+Ρq$uڀb%7= jsnTNWb7aW{Ͱ/n޼yt&ɹ#lؓy#ѹUh$m薈Avyy% A@$cԑ䫿[63-kh'I8_/vC&ƭ7)^ j@Yϭy#Y,Ә I'?+?}t0ڵk$#~5O[˫-x6=SkOքmP7i+y# (嘭#M܉ 8nӆmnֆml@aL a@[B 0 i㈭cӞn|kx8v[8[b7VL^݄ eH3odaP9I-sxM -N.l-uvH0[DtMR!i#]=ׯGlIn鍼qmrLg z ma[cs ̀;o$G9Rj/eXpSG.aU.a$3o$e7o{%i*0#|5O/})TK/ l͛n%Ix 9Nij 5ph=̀63o$@$m@r޻};vwc7aA[%l؇Mb9لU6`݋;#8Bir6,b6sG?~=bK ΁_'䔣aܼh&ohb?JΝ-2"i`W{F}{Z`2\R&4'l鼑 0NqIۀn޼~&Ia,f p jonB6޽u+vH+)y>?q&HmĀ6*Tԑ]wFFFߪQaoD6 :_݄|7c7aWömۖ Ob6+f@$ ,IDp8u7 k8 c. bb6<.2n_nߎhyMm.ԑ0PL 0?`3?MjH,&fcmaJG;[E{5W^I뱛+a)y# hX@F ?~=bK֫@y֭MI۳9+:ۄm@U h#ba-I9WcxM`-=@(nV14o$9]Ś:rkʗ6y4٘:`)I@n޼ma[cpP%m)nEw?xhϖW_]җBC' )⥗b7قmf$fc1F;D1=A&, /z)gׂ:җ b}ָm|Mڀl>9r<c~"Ι `6B)Ϸ<fg{V&,onB\+z⋱@6m11om]Y t$m3;:e9\6rpoǏ|;(wnB+aFl%:fH)7jvpH#lnҖ5FLFcA8ݾ Sƿ؟v0EM6s'bKLIڀh1b9X_݄~/l7^}W.Ѱmn&lhle=fN5$m@9޽u+v(Pd8 ag6 GdFrg`@)޿{7vԑp7oIR@1ܤ-SdlL A?-ag4D1vIۓW^Y"Q&o'f+I1ۀ-+Iڀx(vjm59ȅy#Yy# hKS}MX䫯y?}KZBgMڶ:rܳ) gȼ,S休Rwn%I{/ g/$HmM8KVb6!@)jm[{ooLOz ;="i}֜m6cH)rԑn|(;\K}7~,t⭱ԑӞdK/n 7ej7I35>~V4 `g<@R ߶M@줘NV"c6Bލ݄\Ca ŬcGda5p7eJ71u$6xM:A#ldHdF >~=bK ;Ӭ7i{g By۶ 2Uvf@ۡ;[dM a_?xCömH}P2` I4:2bK2h%P*7i㐘-_٘@`c eq6TmM0Ƹa۶ C$"O|4:ӊwDl ;IǏc7V8;ԑxM 'Gm@Xd4 `k6?z-!޺ Tm͍'?c uy$mDd1[j7r\>~V=I,DkbM^ލdMDdU{aep7 ؈C ]7=|os ЖlL IfȕXo smZUἑQjgrŒ|Wy ;d l|s;[C=A&K:2W&}ߔeg͛7m@l|Xv$iR7[6j }NoB@6&m4˜?|,rƣGwnB-͡ 'lژ771u$@<6JVm>SGvf]I`"aü,`Ȗ $m@ݾ U/})vjMڶvK6`s2R#iꘜ0#|M(#s/|!ve[fM@MR`HvƤ)nY3o$sv?'0OnO ]6ӧOO=7sڶo?hlGgV;6M[ӶyuV}o|[ȟ_=7hS\- u_f\^^+2oڟ:ruM_?7X;MэƵk׺}/ oϺ\`zm<|zgs}ǜMY4M?40ΌNeL,٧Oyeo={S+'wh8|?OQY/2vgTŵMaw&~x?iPz4w%<{֩E3q%նXMYRV6k5Mg5Um]]]׸n:\_o[;kWß>]vGggo~M֬#-D益_F/.T;=<$m;6T"Y өm77^E_t7~x0ѯtm7kR;aa7ѩ@hOs&jZѦnZmxѣ/?ǟ~Q܎io~׿tO%C~^^^ҵojO>yzܮ8?wy9H׺&jSM?G40L_Z:b8^l?]vm[ h)F.pTs {Kڟa[M١{k ڦ;?^|ʟ4zN͉Ĝiś+,vx;_uuuu'Lӟ u&lӧOG(!=gU#FkE\H?wulWr[#St?wl6$9쑰J٥?-B)8ltxr5M xѩ?| ?vx~[a1H̶x/vX-'qwyy9%fk__lگRcVP<b)!ni;oZf|u'6cNih;ܔ|;mO#e:I3a 93O?+_gӳoqh)_m?]rlh{?d ʞukNmK:/žXY>Vnsoby#wۂ7Uݞ+'{pvWu)v%OG_lGnx?ŗ%XGI(S^j<@r`Ю}<}ӧ+L@_5_m[R}T/r۽Քک#>~Mw>ӏhnm}u |:SwꜺa[޹?-x jٿf,vtʣ;fWWWO^yn}D}JΝ79w#>lA^{ʠs8YN=`d=< ͹[}\7,}jݻ/Hql&O=2h-eկ`JI׿ͣ(o:qS;n[s,fwGa 6t?g3{ާm`^wpd}̰SYZ҆mR:ecN7HG)k֥nȣZei;q~qxS~@[sEҵd3N4CyőYSO9zvOzʇaUs0XelIhgPf~N1>Ɯ}/5>5].//'ތԑr8o[[Hd$_ ҥ#;靽lgl3I#ORVoz 8$m&> {wojfj?ozm3ܪ7~;pZGݻn=gnewCBmW˾nHcںQnԑ#ڼyef]J2aP벼hSǯ|u~Lޘ{Dm~s0m]֮0mp;qd_D9iӻuwSo1r&y)GS ptOz ̾ ٿs[nv׿~1TOa@v&(lwl^j<ߺ1ؘo^UlQí𘪽 l26;:EѣeHoa-e?x8e{._CO{5p?=<<9-LD k}۟ÇZrzSˁ%0*|p'?݊ 5x/okm3uMmFn琌;T;t0 Kֿ>=3dovԲ 2pLC⥗6upynSOyLFF-6:<5dsuϩ锧fV\8\p#3]֝Na|4So 3bJ,/Nִ<1ӗ G/NlZdla=s|WveY̖:-xpŻ㑝'vƴ-k2XsI(Q?-U;hoyg"c*Ѯuk&9+ؚٚk}z49ȪSflk]^hBM}?nGMMrdr1h8z-ڸ)O?Z~㗗[ret /Qv;՝ H[ӒjrvK;g==奼LOĩ1-mt|$fkWzO[lL~ =z|ΞoG`ѹ~,W>m$wl;?ox_eԑ+fO0fk*T;t);9:' )w5u|yY60_L&{?W뽇~gb}N>/QvWC6]#/ݚ6e'Ҙ?ߗ_h۬SíeD̶>_}[݀f|kK9&z<Ͷ,iʇ~xO|ϖ4ҩ}pF|Xg..y4׮]{I'OַPyQ۷{f;Olѣ{ݻw߷|7>zrݿ/ܵѣG?lGoß?:Nw^ۇi:O,JAgF4hՏtyW_?fn~l^^Qo8SƠoqw-嗻z~#О}vЭM tģsī^Zdԣ?k1 OsИ {Ï6~G;ҶZa^\<3./[vWWW? W\^K!WWuM>M4;?Bli3zw>iw o}3F>|%?~y/>ݦlS#GfVr~ nzGt޽g+hMl5^si{͙׾/_r|4gHm+FxYn8i_WMpٿv؞ƷM0Ą(;gY'~Es;:>eO<)%o4:#Gߨ[*Ԓ=ݻܻ֝w綧gs/VSUj|H;k.=ˠ_ i.:l@u_T vj_pY¶#fւX񾌻1|R^&`;k֓b*߿v_/?_?~j[<=ˮ,G1[:kd_0_fma[2SݹO?=Ow/,Bg|r͛޿QW{ͽ6i X,{ 6ΒQ5(2-{S }9 Ϻ7m)XhSyю}@^Yƫ4񕃼Nj3g9y@#m}5 n|,[V.o1s_yvxY*R8կ|S .;[Hc1pҲSٳտ~xq>+ʝYP Vk])4¶|_K-BZ# gxw2~%m/?9IZr*[g..>+yy9a-ҩg\oQ]z+voGѣGS,$Xf72J&mUR \:˛O:,o?^Ngq/pX?w4&.hS՞;q pİ On+tő TFT+IHۓZ)y,QLwH1"w$T| ŖQ \?$PI$cS6ӷH(˩ѓ"jk}%UgRg+^̐( ( YI;"Z(u( acNR(l,N25\^* X„ ڠB6HKFN]I c Ix ܸ Ӕ X1؎(*)YO ;"ZRؚ Ey;93-:=aDFMME%(&M./VLlUOUOO iRҲjAm$m(\_XC2=\-"ٲ)&M.օj*lJ0^($mf){(;g Ӕ \۹C[U8dqJE3oAM$m"F_Ca),HڠHmrPTSO)Od&CZπ3RJtzNKQX θFmJm]ZU1P=S.R= YN-A=$m9#;kő4m'&޼֧@eZ* Ev`p eɍlw鳘@%k*{wvk$$LJJN-[@J|$TDe`qöz(Գi= N,\왜|/Fj(l%nԳ%itd-"Tk5heH$IeX\7Ɯ-VCtJ}g SRT{nZ kH`sԘ@rz3[fI'hɨ%) SήT@lR N!ٙv;} I$m$㲞SZZ T+U +UaI:ŗ"amPDHD=HBfpԹ ήPs*; J 3Sv)*9"M&iXƥ‚)>5K0HIɱQڜchUpB"R؎RaLsX[3m2`FUyj] [V$(nWpEf. SRD?TIڀM~ aXkdkpt%UlTUzYת/%)5l+8Nm;"ڂ'_ڠT6Ai֖d8e@qjPZnRcYiv N0*5lc;'Ls)EmdIP|/<̰(>ԙMܶJ =g ^%@" "ٔvJ-E3GI0-/"a[||xVc) $C'Y+e]>qoƞ T J,6` gX[a"YuR *1Q 1gOU[5Y ̉0 #iL:DVHi UnyTdnVΆ"e"@$m@!<ڴI23mzMO dd2amMtJa~@;啢inrpc kH 3AFRvk[E8%6[WIRI7˷P}Qjr‚,9s0-%i\tzĦ̥9*l#RI7SjAI>ΝJ$e VA kH ?;vP[jY[IQ&>P#eBm SIrVReg5":@$m *B.ME+j25r6w$ULQNI6˞ŐAJ2HB1Mzl;5QY1FІEUJ*^$m2̰YVl}UⅪYZRԐ 2-X@(~IGT > Ͱ6( r/"$d GLd& b!LYjc qf,PFƞ$LbJQ@!ih_3F_"Hmɹ/r./VmL=K}LydW$gž 1G.ٍn {2bX@ > -pٔYڡY YQrM1_”IK){aX k`ö;Nit_,5Va[iG^ԼbXNyKX[F*bM15OqmcOք#Y`(99c2X %aPhCb!IpR>)V.z;FZeRk1˽gPj%X)밭#GQ=|N$I {QgU5=$d Pgw ZዢpV)Kٽ (B5ά/Ӭ( \Y'La)t$meX,+e+%$N>'IMKDw-9A9ƀ#װ60ka iޅW6椓Q67a N)rD0^dH.ULWzD IDAT(r^2Z^yS#khs مm,Np ;?@H\\|I׼/57]YB*V2l(N6Hkl3O|ղKv#$ {Om۽xX[Z@;0 fGB#fX[Y9,PF*/wZ)z33: 3a f)tr,E {(fu|agA^$mPI^VFϺ7 IUKi *Qp"TגjL_ c#y%:Uh+DŽi#Jq,68P鳌:"l{]lףtjPFUlmDXJa #6+вKɥhgIڠd\9RR˧,%JSq\Ev ([a[.aFU,RnfA$m\Y"ðiM#6Ֆ蝊ހ)hd|1@&ga1E)Aks\ .ْ&0&Jj &՘FyH\*SRp"=!>RsIF,ROh e63 8amsl^ĥN~|ӏrF$LK!kڎ %i8e(iŔ1َ&~ vx Mv,2J?aڍRKPtaSHVyPy=ڂ*Aj d)t:©P k4Iڠ h2S\y?eN1,P ]"(bԌ> T$I3)3W Ӟ/ ʚcC/%[d! + .sף-R\ sD`ؖxQ  A- k|)xy="ZwS ]mJ0l#qNʥG8$iv>ϽJ#~Y+f Ցb j[m7x e$|RN/hYF`amITİ65鳖 K F}\E>Py0u-= `%ITc9nyIbX$Eu1-}bb:Lx2Waو*A Ȃf)XIOam(^.\ڙrºS!tNؖfn!KeXC1 XƕA _Sug JTtrKI:6¥vw4ڀٞdJRH,b$ -8( kDHڠF@\T\%e;iJ$l##Njp ВqURRR_J&as0EZ)\ΰ6H |M IlvC#F\%L)@j$m1R";I8K”&IHsu ,a@1m$H@m_ΰ6KPjP HAD6XB@^~M 'O>'w I̶in'\H s5*A3Fg@D'i(#TvC#L"HS}tX, fk@j$m@E.U!Mb6/REg@@5I+J]JF$fcX M6HolܥT'X@JhAub h#n=NSCh,dhlG8$.E`b)VKR&i WRRR_rҰ%VuG΀6H J=UQ:sigvR]*/Q%HPR1[,:Ou1u\ .MI@.$trX@JhI` )x^ FTS=Vds ,VupH 0 iЖ>G53TG ºīcNRBԁAj$mNrc:ҀPHgJ%d-eXɫyY5Jp.gRuC6mDTYo. K\ Fү I0f#})K{R 氰53َiXO\rew=k ggi\z8 x2ڣIU0m%kԜQQ$` pmA )il$.xi75DA$m苁ǔ-)/n)G[HJIJ1[F,VuG8E/wŜJ%ۑl߳K?n+nrg.\iӹllQ /C€6H +vN:y\ӒY42q-h YT)x7i##)l2dY4,-VA hBSGFlFG6l˞L1QqK^DJnRN,EuhL1m2IhB>[SaP[FRdTpYT)v 3vx&Hʥ\N~-Ì|j1 #>5gmW"_#e";\Ul)xik-"=H $29*uH e:BƥBd!ŔKQ 9A!ij]ld¦ g\WS^״-lR+٩j67J|- ZL?)0 'i (aUOO!J"Hiƈ[H"e2 3*a!eFe$mP&wh#" PL%qI[R-5eh?ȌdR+:suG h,H)uȒ'Lg5UjR%HD.1[^yF,:Et$mP.fGg@[OMJ ZW:-9r2D'5.`K&%eR+:$GKy 68*9($GŬt$/=E ڻRE(I`oeei̲h@~2vܡfѧ:4m;:x޽?'_~V$!5F}RPjT4މwTbQSKO cf #ƴ$aYpLI:8eP jR 36W̖cQ$ #Ru!iLԲh\L+d⬒2PpR}-ʓvSjYڴ-ڗ)F-[83 bH2~j=$&/?(SԺZ{r"e)$:Qpqo:Q eYF)H4{0fvor)2]ۣ# AƴA9 h e냰^?M h+C14ud,*XO] Kjx"d/a@dGGM.N1:G,w- eP'59.FtA+:GJ"iB$;͑S h;ke;s&g(9ɲh 'ؤ,,dVдS( /d@HR#֚s'xH{]R,QR_ݻPRF (ӘMC.{) $mF%;ЖBU-%e4{f2b+JN, :^ HKpHdx)IPK不*#hAE;$1:ݻ*9I1#"o^ǨkH {9.b,Ta"Elhy*;_)weWM6DYf; X x)uHV^A$md)ej]8q.HwI-Ɛ;YMʷ CF5 逶_L9Wڂ+IMy)7#xG`"EWh\ R۰'2:LeKR@jDY@lrWfI)ąMd<Q({:8@kHLAƢߡ,kJk`YڀelYcGFeKQ2hI`?c5sp +lg:27MAgT#V-PGՓm󈎦+VeDyQ:&mPIj.dۜl+x@ۂ|IkZRkoRH }p%&D12e( fcV1usk FS;PN7(R u3Pl,PL:mPIdDay$Y{ճriʅJmSm`bH iFsS=aO,T^'nTGƀ$mrb+[6ZVd>i|WL%b5ԁvP I3=r0#/tNKWVWkA('.؍R C=o'Ig#:|ٴP ՒYR^7Rn쩆d%>Fog,&MHI1),^ZL؂mPI;\qp}hfBo2] }$Y 9a^ PVyup; z6L3mw\x5"D_X͟PFOaaR@*K˨C@;Lx hHڀB,;7ɨb;XVRT`DIyEbE#׫[(LV^&؁"$mڈŀ(i^,=q:S:-o2K%\OLYxi"s-?ʀ6( *%el2oOj_ۍZ~ǷPIW7jm:vp57iG1[GRT"il\>waf@5TT j;b3N)2fckVu{퀿c@IɞH$۰¨3J9HmD*ac$.,ZRD(oK8EBG3-/%]1-2>{ZFΪm f̒]Oc58BAJؔxUp>(ݴ;WF\?&Fp؟-\Tl}KKTJB&%@;(G ѩmKJRNH 2`@YIBmݘ=LPt946MX툗Ze!I$€6( Dv,8PtSSzz^bG#HҋPv ¶$meq|['|/죔`wkR-R%u=Pa |xgYꕝE, ^j_;DeTԑq~2{wP7z74[Iy)=P%L *>f+>BU[ꐾDd8I$mmz"40:F*xq⣠ԖKN-6[uP&-VaTF h,E0f N-lM h@{amrn) LWaSI[Ѫ0fc 㥣!wY9,nF}̨t)RƕE nQQ(vyj^`nE%"ZJGVRVuHdPkO>݆2]v-v`9 eL,!i%$mOn@<\\-;2x ̀ߢt߿vcSi%$mqt@[v6E֓1%I_O c$^I(#IX1 ȑw"iiL @Fd+:ߏA҆ ` I[l|5؇҈}Hڪ&XLV1[LQSuMy$m*5:*_@$mp8JV:". $mu);fۢweW XCF+߿ 0"-$m(>f3u$3I[Jj ?{*Kv >H`e] cBF30 aFh^!0\h0.EiT#zQdE a^Mۋ@5#[#_ EeGEFDFFƟχZܺ7o9s22n~9,&i%$mZC1 jjn,!iKnH2?lG~ J j*pI[ZdEEҖ!ic'+XHҖL `ljVom6% 0$m- ׍:tG7%9"6$m'ic[5@Vjj;!i+ (ŏ𤠦qt&6$'i+iE , i+RPXLV @6ʳn(@L %i&%55kIsaI#C(儅@$mǐQNv1L MI&=Je$mmWցͧV@pd2`INDSHڀX G7swwwt`}2`NҶ+@% A IDAT rȐX2 Lv @$mI%b6BaIڎ FJe$mTFwwwwt`MIJ$iV['H &I[¤}3"I[B H)7l+hrMH` I[,V\BNa[A.@dDAFja@U$mAI6; I[\ҠB&aPI[h-p#I[t!$m(+l۴e1wwwG7V i^r;2Ȅ $ *$b!8$m0,k+MQM&$m HEDME4`1I%$m<@O`1I[DYkQ /b@z dNPF*6XBҖDXm )XNҖ`OTm" KҖMmAQm␴%3|*$m9nz{; CH ?lb$[)p-9F$mjOXKHB-n4I[F"NVq$i%$mB `E ۂ4cZWT ؓ:A XLV#)U $iT(k~TW^ig>31_<1{|̗_~9y3{qW^yxٹnqfm3N<Puuk^8P"ukGrsQ5m|}W^9雧_17˃G;t.>](Qn??0MW^yw!N]U^_~7OI3iX1zxn񃇇n?5ړL4(WZauPu8AJ_ >CŚ]])WwgE\c3^Z1[GB&u3`3yc}Ʉ[jmÜ +utdk68׹š"û²M[R9ZOAsDo݋Z\,HSǦ:um?Li *_&d{qYu[&m|[V<6sYp=dfĜucOD{ :kYV-)킭^5MdO֟V*纉L̹qQ8A"\5Ku.ΧHҶmкd <8'V9yv{|K6hIڊۉnuǹ$vc C̹`v;S{e[p43._tL?%D׬w[$D+nI̹jn~ruQ7:uHJ5ON]LȬ .>]>O!:u'9Y s?7_|ŋ{Cc~ms/OZq?#Ii:\݃raOC٭m*+[vh‡P:unp(Q:W%pm,͓͐r69yt7\oPr֖t p T0 /gBa7ִ1ѣ&F lZ9, h؏~[ߺPK4ay㍋^;kZ֏>k_۷!+O}jGoWW8o~|?K/KNOoOߜ.ɪCya7F9;O:ӏ>o?97{|\nK|w~y{޿[|~jǞOJluC@%köfMvQ y*a["o ۚC??lkfm ¶f$oK5۸`&l>f)ĊL8 윷Yv¶ⶎ"6aE¶m\66=غܨݲH擴PI .]q"¶fgq[͢m¶}6,Km$ ۚC6a4al&I +I0ⶲfmHRu6mkm556I)mmn۶۶1(fP$#i.'oB6m.y۶-`qcm¶Y ⶲ¶FQۄmӄm$] i o+H m[#lcWdAm^~lmnƄhI6XP4Im=~y[sm6aQ,n( X.N&lH6mym$f3IN,n( $ #o ysm[#lcy-#iV05m6G mnvq6:m&bq@A$mjl&Yy۬5[mn۶۶1GMvJ!iVf3ɂ,nhm¶ivdIҲ >I>I$G5am[#lchymIXVyXLc0od۶5nƙhy6$mmɝLdmn۶!mJކ &I6I#Gl%ۚöNg$Y7oc0lkm; 96.M۸Rmmw"iv%o+m¶fmۮCI2hymg!i|3IaI ձa[mϹmcm IpY5om96I^6mf'Im p6H5rmm3۶f^&l-F޶/$iC&l[Eⶋ ms6 dqQ$m@6,m¶fmۮ55n%Y?I$K#lkl&9`6mf'IqY3I$K#oE.ns۶F -nkm; `76 (y[)m^~֬m۵ܶ[Dۄm `6 .IB6mՆmMm۸ZlMDgq[)m/op۶kI[u6IN)IPy[)m^~֌m[/ns۶F,n `#6A¶FvmZVNm$IIP y"y僗5+memMmXBa[#o (/?onq۶M"lk$Y7om+ ۚym¶YǗ5Mms6Vaq[,nX (m]>xa[3e%IRF& Yp;I¶Y/?o}q[Ya[ os6V$om7ILY ۚm6mm*dqb6 J!o|pܶzvdE6e$m@B"f-lָm[ ۲6kInۄm]>xa[s[mr6V'omWYVymm&msX0 omN.I5mm͎ܶ$*!ija3".maömJؖ*Ld¶f-ܶZnFl&yaIPțI N,n|öfռm&5ܼ*6A6R6,Bⶓ}ma[c'IdMm$m@¶F$g(o+(lkmaömJVy[%öFTL.f¶/nkl&1l5e޶mq6m D46,DmMQyZܶm۶h7om6 _l䜰] lk,naAv'z¶NtLH"$,n;5nV¶zj`qP9Iy[|ca[STf3ɋܶZnܼՒ4o*/nkl&1o]m&m;pXI0"$,nhmnmf5 2y[|6|öʼ-lָm[ j#oK6*6l&_mHfqva[m7/n5nF$y,n*!i=zӮP.u=z4p;I5`G>j s.>2Wuskv "y9Ŕq^W8Vfb3PΓMguö'O_<{O~u/l;/>7|s{Z1o~{t}_lumONdaܘN/}|YE~7~cz~ ?6lb/o?/ΟujO׵NS|\=ztcyۻͿ<}}'~48ö_9f;Ilm?kv57|p\~q,3x/ޯZlfOrwlz-i?ѺO7ӿ>k7G8tӿs~eSijy_e][|wH5ZJ͕76s*X%o;}i D7]o_kir7Kܚyo 0}sK%g/uy;ͱ5⫞^~{El?ZX(8dO/Ziկ&v{ǖuR``.kj{5*ufO<lk\x5MgޏNnx  IDATAwڠo蝗N<7Ƚk AXtrbw4ý?\7}fKS?5e˱t=/t Y/$i ㈋oEsG7dDhǜ5vc۶Ӊ_-N9<_$c7qZؿŞMo_xal]wwG?m/]sN}:l9֘xS>s6l^slaڵƒG?:3NtV֑" FOM߹ߌmG[x׾v aND2mO ml%zp8m6߼ovQ{< ۖݼ9~{y~y~  \@@z ޛ[6b;/9W`^M<~@P]۝ziqWUo jWyYMDpqx=]؏)[9]ȎvƺЛmnƘ;\L|L<5#ݡZO<ݼ\ ejmvQ\)&Mm\m0TƖMmȭۺ ں_Zm4m };4:ۂ^zIIW^>W4/<|mo۶}?eo|cl\7B=[3d3gݶvm0N%03eFc;IvO 2١z77^bf|b- {Ud"?=q8vd')7JE-뷂 lS9Ig?Fkmm'>1=o1˝6>7g4[Ϝ$?/g?M$oֻm[w[3db:m9IZW] o o׆m?k?1Mxχ>4i[uc=]ּm6lk6~kpd/9{g2 jYfvI9'pky-sJhsRgL6ø9{4Mۚ}/C[fȠ^7=7JRuڮ<^E<0cY`qΕË/{-ē'Ņ9d\n{z NJTgLY>su?W)_ݔvtjS!3V*mT^V>G:M̠,[V"|w_N/_D`MDգ|\R$$+JY̔@a ꫯ>p}'w/>]|5^+7ɓ'/=}w7Tu_wrk ,cMPtP.`n;McZms-K.bn,~w<~^2QT84N%SCvw/'i]휚Sp1Bi [6P)E7,ӯ  b7)s\Eޮ9S4Nӑs|η63eOL-l$].Yű$m1|W gaLq ^ ,n1+%*tԲf*Uª-l-Z{n$m&WϮșTa;UͮC JYv/coնC" A''U]SIڀXv.là\9^V9z1!}fL^_E ¶zTYQ$mp9u~hr2eZi ӊK5vPgRh mvq׍ ۪ʟlo_ Iڀ#YvnDa|EףܽK0QM/Y}Rg-3) *+*mܖǧę qZLퟩnT?ІVl`#Y2SO}DftRTD#/ ؎ bFP S{b")FVöbz"*>16(Cwܽ[FM\#ź*QA" SY]޿eէ6[,S SJ¶87$m JC*1j*JerdSbejVqa[USWg;.a -Q!j1*ZWhoQa36|ړ^d*e֖UXLH͕nR:eؓ i*~C]+ftd $[^YWmJmI8.ؓ-$m@ހsD L<2-+@0=ڳ{c+H 8lu3H(KBMbrU4vRmHnuIUs$mPUwxo!u8M:~{9prCejFm$lsu.I@h.\YҘb"ēpeR:[J;C *&TRTsNIg7rT^mv*r mTe'a:6VIҎ,m{EC.Z{ytrL8@A =U+UuvcGM򍝜B6v:-I ޥSshJSx*Ԑ0TXsN)IhoӚӪM[,i9va 㕕 $#m-+tJyZQda[ !5ԡ* I/_"\ Eh50Ӣ)eDJiO/p--YF,e؎ J_3r+OzpDP{zxo]ۥ)r2 $})\;jRԹd+x1^Pz"zzL,>)lDض8-Y]ʮAy3;&Pv29WcR aKA"B6s KWI_.);$mS.} wp;Ky3da[[TD^pJ(l$I)}Iu?J \f0&]Յ%2dsRQI UI7S3MROA"AQ}H) ;a(+TIAr.G̓m5aS;$mPޮ7H3Rj`ǐqs&f&e8 "6Y:OEH]0mH0K8-CM6uy"IW![S)à|}Ӱ8-)`%8;lck)H)V$iNF s3yƨ W1aB!eN||ҠeqN,JmגtT ) EFxnl#ٔm,);Z$m@qѦOIJdԂ(b 62`7jRJZ; -`İm\KyIOEĉɰuMq8-)r1- ՘rQqz%]1[[?) Tk|=60B5&}eP.Nd*F?BE(+l!͔P;_O rcG7V!BOhC~1\)c!#UX\ㇻ[][լǏ[|iUkɣ[$fMc9T r+5€Ty|蘭 ct-H32)z \+BEA#83?fePUr)u|][<+(taE=_´R0 lEܣ T2 7fiv)-OQD~51 c"mu33J)a*ʵەgzG, iXA-:Pu$?R:E*qﬔ̥m̄Aߺ*px{o@(Adf+k⒵_+:DV2Emɢ$#iX_qoԧh F,;SRl~ހdvNVuӑ"c,lc;HڀE{;=7U>- q9v0kRI},#ahLEOx/Z+;E7<|5}ega ?|}#擴e [cc\)CZF.OLў PSkZFShߦ/嶼N)C3!4am1 }iycZ"W2r۶SgO*RRvzdn/ )E-Mb4s|#搴 vl}6Oۏ$d(%XEΦԊgfj$l;n$mpDz&|jU G.ܥB6lKB﯏|="I7ٳyKL q.$(Z(G#_rT dAM-׊qHd)\ nGm) `+it,ʞ1-]m#X[Ka\ɗ@W̰-GVtt1LJm$mv{_֣ DjmFkO%ΐ&_QAe ˿/.~:8P̰ |G:Yu;$MF#QHCؖRa-*EAr( =^iJ( zubTnv#G JVdݡ%ilG:T eU w22JD&@$mŇnp(`.uFT=50?smJ|fiX@(Ǩ I3`6XB@un@,D6`!d4YwnpYDuIlşO0P"1Pfb4 . أM`"Jvٟ;46؂k&3y0U1XT  9hSM 'i ǐԁ[?);UCSp.GRI;8R1K$mT i)uf K% 4 fKeU5Yw8{*+20iJ(W%MG6>[x?.%1P(IS뛰 ${)mݝd,qwFGUƈ.M#THp|fKJEll$Eo%i.hM9@ҤSi:%l)?(zHڀ¾g]1[EMdݩVqٻn'zވ؃=o)٨y 4 xU2ْqre^2e  ĉJOBQL#Hڀl¾[v,uH#PӗLIuЛukd uIRͅU5_葴*˨[5c>leMܗKWbK!`fZJb6*a@lɁdL4q/]%S_6DPh1[|(e\RP"IJ7㘭:5:YŊLTRJIm.U1ܛiR f'U%$miy/g{N4S:MGjf+w0n,wٿ;eL˜sCDt5tIP6(Ո*( 3a{aė,wI11!_a16 yCNa6&JK%"o&@ ¦bN)сrpAW)֪Hڀmݫgł-cly] Fk?l^2ԫ,r{T%fƍrll_7McTfUhj{Uߙ/ (T%_֥>;X1vJnz.6z4IAwc GQ]HPP3c.G(_%lB'i7|jU G.ϡ,%9fK/M\ n'_m$m@{eZԦIXz ;aFpUUuViqn9\UJibMOƀIBr+w9*QdzJFmPm(H˵T,1hLus%IPǙm!~ cq,zx# Ue)Zсe"x>Ll̑zL6h ṡLTʒPuşQ(PIP0{m x|\Ú^}L٩u)*~b/k|=b>IjC=T֑rBFiFp:5\l)aEELdUvԖd$mpZ̥U>|wҕwxocZA 1)٨ S9I*)Hj$P lZsfE)-YƠlr)#%iXA7-:P'{@6JW x8ڵZtLl.> XOϱ?5{뇇=>lgy3Sn{:uME.o䶭9ҘfBh;j|=bkn 5GdfcV\ō]q .WR(t\⮭,lPA/-#P^ b~3G*EhmI8׼éC_|́ Zҵ 8aEH"!Ǐut5|3ӣB?o%E˚6`f %/AR.cWCF*ȗLI|QVL)cdW+o Ty;/MJRfHR"pIOz6%\"iF RFrbz\OȠP WbXBfNJYc|l͜Gύb\S=a)1iOrg?{ %e֒>.z$mW 3Z0MJ;&$&)KbN}g $%*4fc-R9IgBiF`-oo=-DMYVړ&r7k Ł0HqB1 Hǔ]Dv$MYV&QXF%ʍ٘8fKy SI\"eh6'JQ"F4)˘tRRI&(qe\hm-eSvUHڀxQ],Q),t "Y)TjUJ8 RtƘ1۱\vB>6`e/wd>P: ;6,řPDqh$|ǤTʓ.̭pNI] `Pщ܅'E4ULPG,8ӒS%%16L[;̋D)GmNO> SqEmV }8$fFL$mPޫ7H3R8 eaq4g!7Rֱ\ĉ:hdܩ 'L)%i( 546&TO+ً%oo!="%",ʱ?H3H`L)}J؈ XӺ,.r0E.QȐiD%J%\ l郥,rN:IP說ÉqY,x7svz݌жmH`0MF̐l.eSv-Hڀ1TS^D#w3RYJAr$_d2l鳥F6Q>}ۺ1:K H)L'(W%S%ݼ)SI 1[du)SlD%˿,k>Q W8| o]E)B%9jK>`6`5]Y)׊m*[S *G[zz@ll%eSvHڀp"EhCW̭#VJ2_cWgUxz5SDnZ Wi="x{ۤ) 71jH.R֒5eؔ Bpa 2^Pz§"zzl#(-E_<*/f&f'C+DІh "HYvnF^TVmjT 1+f*>Ya>*ҚBJB T>R9eؚ --là1?)h55F؆m"Sܢ}8?É +xʵCaY]̒l  >7U%+Uuvق='YW֘򜩞'bk&Hڀ@3;lWO#ŊN5xEu^Y7*Y!A֘rb6֥%i/6Tlc 0!yqg>mmʒxꉚ{aFab1I73`gN;1X0ЫcDkjKլݤnO)v#ihMw4)ZgB}:{cm좵\^XԂS 3ڴ绔Iᜤ Q!j1xAjUjgSeTILcj`&IڀnTzcRBm4pC0HX uk˪F*N;Y)3MSUIU~yWX ʐmVb*+SsUn%m2V$ ?@N2 )qc (3@{S(\;p <B7h(|5Tfc3bKJ$z|8Uxs ϕ8%9ǀMe]~lNr7(v&6`g.hsT3yʀ2! Hfc%5LPڀqY"!xއJ]8A?pr'U-^ ֓ob4"Xȏ(mRK^]F&<#>͙fQm߂pBw-AZNE.٪c-^z6`PO\k{ #SP^o9ǧ*YNk8Pi=|*C~ v6gNuuXIO?0=˴${dL05T`:rG1ʘ{=iن"і(iځA]}<؋ tl̠2^KPm4ΞÖmCicx^dxeyr< u4vic{]wa2T)#ҥ3[-՗OŎ6`+k[rӵLlVl -p i6Hd7/]8}SڀXA~3f14͎\xטo?`mF^L{K|hxd6uؗK5Ǥv˝h yj^kCL4`f!A(mU 9GC;?3yXh?c[akʰ;—e~nKfxh_g1e!I9 "6k ~~^|eϮ=&r1 S/z}}{6q66/Di_՟q8lRUT Qڐ"6PFmkܣ)mC”qlC ]Rؔ Nzע `!mD2rJpvl>:RqP BiZQ"a^)mؽd%m(m l, AUhNi_#(mV@ֳ$%ƹCQںwLwU (m}x+RXy֡Pz##lCiJ̖m< )mI(m@ߔN$: t:*uQJ[<Q䡴3>@CJ[m^Flw#Ji=A VRKi+i܀ $գ9d?aځE)mU2UY8VFTbM(m5(X m|=^0T+:4xiJ[UcU ЄҖ|Җi)m9ePҖ>ҖҖQ̶Ҁ`{N)W@Җ|ݖ Di˥bёD%B6Pڲ(zA[a'PҖ t;r6ry"T#Sv&V]sL=IJrxU)mށ`!\< mz@uJd^yd)>(m[^,mJIҶn2[7;Ҷu!Eiۂ稆82r76R0(mW(m@JD(m@>>>@J)hx@9J\ m ==azڗҶ3JY@-Jv)IJۦ4*n(m[&88@!JҶWYfrJJ><qd*TOJF@`UJ۞ m+ 1ơOXHi؁Kq:P$?uJYJ[ @-J["b@!JI@rJ[.R1,#\x+Q2Sh`4X86sJ:-)O-䔶6̔ Ŷ Y0(mez,Ķ*hBiaW1gKSڠ="@i+D)1H&JX8VVOؖvxiQNd$;@7Ki*.6 @´)m,j@CJ[miQځiBi8m=SXK*sT@EJ['$y~ $, (m]v6"q!hBiP%JPE @[J\R֭U8gI2OaK8$sJ6})mP2-mB@sJ(Ķ 8w]F֘J8% (m|k ?77Looo4s`7{C4}wLtۜ3A- Df溧&(sgަEJ΢ifz*_Mo:] 7nNƻ1B=Ot7ʜhv6X͟:fQv;@Nu7 ״mk[R9MXMa;LtPsE n`QaXkq|Lۛ_tV\)`3&LtPsE n`QaXkvs%o;5oW߯_q?>>ljMŶ'Ͷ﹮eup}XҶSd߷۬:6lo^ 0IDAT\7}ǹv$YͿJlS,7B={M:{) ;{:mmk|KK\}?iam?uVT7,nfuS,fDYӶ{} \wp%1qD7͛sm1jQ7f6ώ\Ya,0\pM[^7_|72ڠmv*eQ7f::`urG2iW5P7ׯrls]w@!'RNfi[&wwe'tw}v>w@!'xׯ_+P\V?6Mlpo=Yo 8pH\tD\L8ori'哶If;,Zy0pF=rJ\s|u/ܤ[-6"/.M;c@v}JGR.Mic#+ixpr]Jiu%Fzy9$R.Ji?+*V@Q/tmxA3Z<9rMY)}!klͮ>BsɝRK/ JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@JD(m@ZDIENDB`biopython-1.63/Doc/examples/0000755000175000017500000000000012250104773015400 5ustar tratra00000000000000biopython-1.63/Doc/examples/nmr/0000755000175000017500000000000012250104773016174 5ustar tratra00000000000000biopython-1.63/Doc/examples/nmr/noed.xpk0000644000175000017500000000272112250104543017642 0ustar tratra00000000000000label dataset sw sf H1 15N2 N15 test.nv {1571.86 } {1460.01 } {1460.00 } {599.8230 } { 60.7860 } { 60.7860 } H1.L H1.P H1.W H1.B H1.E H1.J 15N2.L 15N2.P 15N2.W 15N2.B 15N2.E 15N2.J N15.L N15.P N15.W N15.B N15.E N15.J vol int stat 0 3.hn 8.853 0.021 0.010 ++ 0.000 3.n 120.104 0.344 0.010 PP 0.000 3.n 120.117 0.344 0.010 PP 0.000 1.18200 1.18200 0 1 4.hn 8.685 0.030 0.010 ++ 0.000 4.n 112.262 1.852 0.010 E+ 0.000 4.n 112.260 1.852 0.010 E+ 0.000 0.99960 0.99960 0 2 5.hn 8.878 0.026 0.010 ++ 0.000 5.n 117.892 0.449 0.010 EE 0.000 5.n 117.894 0.449 0.010 EE 0.000 0.93720 0.93720 0 3 6.hn 8.978 0.010 0.010 ++ 0.000 6.n 120.085 0.343 0.010 PP 0.000 6.n 120.101 0.343 0.010 PP 0.000 0.57500 0.57500 0 4 7.hn 8.137 0.084 0.010 ++ 0.000 7.n 112.673 0.346 0.010 PP 0.000 7.n 112.641 0.346 0.010 PP 0.000 0.60770 0.60770 0 5 8.hn 8.140 0.026 0.010 ++ 0.000 8.n 121.050 0.355 0.010 PP 0.000 8.n 121.050 0.355 0.010 PP 0.000 0.56960 0.56960 0 6 9.hn 8.924 0.028 0.010 ++ 0.000 9.n 113.323 0.319 0.010 +P 0.000 9.n 113.322 0.319 0.010 +P 0.000 0.46630 0.46630 0 8 10.hn 7.663 0.021 0.010 ++ 0.000 10.n 118.341 0.324 0.010 +E 0.000 10.n 118.476 0.324 0.010 +E 0.000 0.49840 0.49840 0 biopython-1.63/Doc/examples/nmr/simplepredict.py0000755000175000017500000001276012250104543021416 0ustar tratra00000000000000#!/usr/bin/env python # ** What is this code? ** # # This is an example script for using new biopython modules for # generating NOE crosspeak peaklists from diagonal peaklist within # the framework of nmrview. # nmrview is not required to run this script, only an installed # version of python. # ** What's important? ** # # The xpktools.py and NOEtools.py modules are what I'm trying to # demonstrate. They provide methods and a data class for performing # some general analysis on NMR data taken directly from peaklist. # The code in this script will demonstrate how they are used. # ** Who wrote this code? ** # Robert Bussell, Jr. # rgb2003@med.cornell.edu # ** Running this script ** # # To run this script on a UNIX/Linux system, make it executable and # modify the first line of this script to point to python if necessary. # First try running the code with the peaklist that I provide to get # the feel of how things work, then you can use your own peaklist if you # modify the variables under the "INITS" code block to make it work # with your data. The modules xpktools and NOEtools can be called from # your own scripts when you have them in place on your computer. # NOTE: It is very important to have an intact peaklist. If you copy and # paste mine into a file be prepared to remove inappropriate line breaks. # ** Output of this script ** # # This script generates a human readable standard output version of the # NOE coordinates as well as an nmrview peaklist out_example.xpk. # *********************************************************************** # ***** LOAD MODULES ***** from __future__ import print_function import getopt import string import sys # -- don't need to modify sys.path with the *tools in Biopython # -- just need Biopython installed somewhere in the PYTHONPATH #sys.path=[sys.path,"./"] #sys.path=[sys.path,"/usr/people/robert/development/xpktools"] from Bio.NMR import xpktools # Contains data classes and functions for .xpk files from Bio.NMR import NOEtools # A module specific for generate NOE predictions # * * * * * * * * * * MAIN * * * * * * * * * * # ***** INITS ***** inc = 1 # The NOE increment (n where i->i+n and i->i-n are noes) infn = "./noed.xpk" # Input peaklist outfn = "./out_example.xpk" # Output peaklist detectatom = "H1" # Directly detected atom relayatom = "N15" # J-coupling from here to detected atom fromatom = "15N2" # The other labelled nucleus # *-*-* First the peaklist is read into a data class from xpktools # *-*-* that contains methods for easily extracting information from # *-*-* the peaklist file peaklist = xpktools.Peaklist(infn) # infn is the name of the xpk file # *-*-* The class attribute residue_dict allows the data lines # *-*-* to be separated from the header and returned here to # *-*-* the dictionary as a list indexed by the assignment # *-*-* of any of the nuclei in the file -- here, the detected atom # *-*-* is used dict = peaklist.residue_dict(detectatom) # *-*-* As well as the data, the dictionary contains two other entries, # *-*-* corresponding to the maximum and minimum residues indexed MAXRES = dict["maxres"] MINRES = dict["minres"] #****** CALCULATE AND WRITE CROSSPEAK PEAKLIST ***** # *-*-* The peaklist class has a method for writing out the header # *-*-* information in a format recognizable by nmrview peaklist.write_header(outfn) # Write the header to the output file # *-*-* Predict the i->i+inc and i->i-inc noe positions if possible # *-*-* Write each one to the output file as they are calculated count = 0 # A counter that number the output data lines in order res = MINRES # minimum residue number in the set outlist = [] # Holds the output data while (res <= MAXRES): # *-*-* Predicting the NOE positions based on peak assignment data # *-*-* is done by supplying the peaklist to and specifying the label # *-*-* of the origin and detected atom in the NOE transfer as well as # *-*-* the residues between which the NOE transfer takes places. noe1 = NOEtools.predictNOE(peaklist, "15N2", "H1", res, res + inc) noe2 = NOEtools.predictNOE(peaklist, "15N2", "H1", res, res - inc) # *-*-* The output of predictNOE is in the form of an xpk entry line # *-*-* suitable for printing to an output file # *-*-* Additionally, it is possible to extract information easily from # *-*-* these output lines by using the xpktools.XpkEntry class entry1 = xpktools.XpkEntry(noe1, peaklist.datalabels) if noe1 != "": # *-*-* Here I'm using the XpkEntry class to gain access to # *-*-* specific fields in the that make the information # *-*-* more readable and suitable for creating data tables # *-*-* This output will be printed to the screen. # *-*-* The data table contains the assignment, coordinates and # *-*-* intensity of the resonance. print(string.split(entry1.fields["15N2.L"], ".")[0], "-->", \ string.split(entry1.fields["N15.L"], ".")[0], "\t", \ entry1.fields["H1.P"], entry1.fields["N15.P"], \ entry1.fields["15N2.P"], entry1.fields["int"]) noe1 = noe1 + "\012" noe1 = xpktools.replace_entry(noe1, 1, count) outlist.append(noe1) count += 1 if noe2 != "": noe2 = noe2 + "\012" noe2 = xpktools.replace_entry(noe2, 1, count) outlist.append(noe2) count += 1 res += 1 # Open the output file and write the data outfile = open(outfn, 'a') outfile.writelines(outlist) # Write the output lines to the file outfile.close() biopython-1.63/Doc/examples/fasta_dictionary.py0000644000175000017500000000276712250104543021304 0ustar tratra00000000000000# In Memory # ========= # This next bit of code uses Bio.SeqIO.parse() to load a FASTA file, # and then turns it into an in-memory python dictionary. # This is *not* suitable for FASTA files with millions of entries. from __future__ import print_function from Bio.Alphabet import generic_dna from Bio import SeqIO def get_accession_num(seq_record): accession_atoms = seq_record.id.split('|') gb_name = accession_atoms[3] # strip the version info before returning return gb_name[:-2] rec_iterator = SeqIO.parse("ls_orchid.fasta", "fasta", generic_dna) orchid_dict = SeqIO.to_dict(rec_iterator, get_accession_num) for id_num in orchid_dict: print('id number: %s' % id_num) print('description: %s' % orchid_dict[id_num].description) print('sequence: %s' % orchid_dict[id_num].seq) # Indexed # ======= # This next version uses the Bio.SeqIO.index() function which will index # the FASTA file without loading all the records into memory at once. # This is suitable for FASTA files with millions of entries. from Bio.Alphabet import generic_dna from Bio import SeqIO def get_accession_num(record_id): accession_atoms = record_id.split('|') gb_name = accession_atoms[3] # strip the version info before returning return gb_name[:-2] orchid_dict = SeqIO.index("ls_orchid.fasta", "fasta", generic_dna) for id_num in orchid_dict: print('id number: %s' % id_num) print('description: %s' % orchid_dict[id_num].description) print('sequence: %s' % orchid_dict[id_num].seq) biopython-1.63/Doc/examples/swissprot.py0000644000175000017500000000137612250104543020031 0ustar tratra00000000000000# This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # """Example of connecting with exPASy and parsing SwissProt records.""" # biopython from __future__ import print_function from Bio import ExPASy, SwissProt # 'O23729', 'O23730', 'O23731', Chalcone synthases from Orchid ids = ['O23729', 'O23730', 'O23731'] for id in ids: handle = ExPASy.get_sprot_raw(id) record = SwissProt.read(handle) print("description: %s" % record.description) for ref in record.references: print("authors: %s" % ref.authors) print("title: %s" % ref.title) print("classification: %s" % record.organism_classification) print("") biopython-1.63/Doc/examples/my_blat.psl0000644000175000017500000000402412250104543017542 0ustar tratra00000000000000psLayout version 4 DNA DNA match mis- rep. N's Q gap Q gap T gap T gap strand Q Q Q Q T T T T block blockSizes qStarts tStarts match match count bases count bases name size start end name size start end count --------------------------------------------------------------------------------------------------------------------------------------------------------------- 61 0 0 0 0 0 0 0 + mystery_seq 61 0 61 chr19 59128983 54204480 54204541 1 61, 0, 54204480, 59 2 0 0 0 0 1 31298 + mystery_seq 61 0 61 chr19 59128983 54233104 54264463 2 18,43, 0,18, 54233104,54264420, 59 2 0 0 0 0 1 5533 + mystery_seq 61 0 61 chr19 59128983 54254477 54260071 2 18,43, 0,18, 54254477,54260028, 58 2 0 0 0 0 0 0 + mystery_seq 61 1 61 chr19 59128983 54210720 54210780 1 60, 1, 54210720, 58 2 0 0 0 0 0 0 + mystery_seq 61 0 60 chr19 59128983 54198476 54198536 1 60, 0, 54198476, 58 3 0 0 0 0 0 0 + mystery_seq 61 0 61 chr19 59128983 54265610 54265671 1 61, 0, 54265610, 58 3 0 0 0 0 1 1971 + mystery_seq 61 0 61 chr19 59128983 54238143 54240175 2 34,27, 0,34, 54238143,54240148, 57 3 0 0 0 0 0 0 + mystery_seq 61 0 60 chr19 59128983 54189735 54189795 1 60, 0, 54189735, 57 4 0 0 0 0 0 0 + mystery_seq 61 0 61 chr19 59128983 54185425 54185486 1 61, 0, 54185425, 56 4 0 0 0 0 0 0 + mystery_seq 61 0 60 chr19 59128983 54197657 54197717 1 60, 0, 54197657, 56 5 0 0 0 0 0 0 + mystery_seq 61 0 61 chr19 59128983 54255662 54255723 1 61, 0, 54255662, 56 5 0 0 0 0 0 0 + mystery_seq 61 0 61 chr19 59128983 54201651 54201712 1 61, 0, 54201651, 48 4 0 0 0 0 0 0 + mystery_seq 61 8 60 chr19 59128983 54206009 54206061 1 52, 8, 54206009, 47 4 0 0 0 0 0 0 + mystery_seq 61 10 61 chr19 59128983 54178987 54179038 1 51, 10, 54178987, 48 4 0 0 1 1 1 1 + mystery_seq 61 8 61 chr19 59128983 54212018 54212071 3 42,4,6, 8,50,55, 54212018,54212061,54212065, 40 3 0 0 0 0 0 0 + mystery_seq 61 8 51 chr19 59128983 54234278 54234321 1 43, 8, 54234278, 42 11 0 0 0 0 0 0 - mystery_seq 61 8 61 chr19 59128983 54238143 54238196 1 53, 0, 54238143, biopython-1.63/Doc/examples/PF05371_seed.sth0000644000175000017500000000305012250104543020016 0ustar tratra00000000000000# STOCKHOLM 1.0 #=GS COATB_BPIKE/30-81 AC P03620.1 #=GS COATB_BPIKE/30-81 DR PDB; 1ifl ; 1-52; #=GS Q9T0Q8_BPIKE/1-52 AC Q9T0Q8.1 #=GS COATB_BPI22/32-83 AC P15416.1 #=GS COATB_BPM13/24-72 AC P69541.1 #=GS COATB_BPM13/24-72 DR PDB; 2cpb ; 1-49; #=GS COATB_BPM13/24-72 DR PDB; 2cps ; 1-49; #=GS COATB_BPZJ2/1-49 AC P03618.1 #=GS Q9T0Q9_BPFD/1-49 AC Q9T0Q9.1 #=GS Q9T0Q9_BPFD/1-49 DR PDB; 1nh4 A; 1-49; #=GS COATB_BPIF1/22-73 AC P03619.2 #=GS COATB_BPIF1/22-73 DR PDB; 1ifk ; 1-50; COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA #=GR COATB_BPIKE/30-81 SS -HHHHHHHHHHHHHH--HHHHHHHH--HHHHHHHHHHHHHHHHHHHHH---- Q9T0Q8_BPIKE/1-52 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA COATB_BPI22/32-83 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPM13/24-72 AEGDDP...AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA #=GR COATB_BPM13/24-72 SS ---S-T...CHCHHHHCCCCTCCCTTCHHHHHHHHHHHHHHHHHHHHCTT-- COATB_BPZJ2/1-49 AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA Q9T0Q9_BPFD/1-49 AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA #=GR Q9T0Q9_BPFD/1-49 SS ------...-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH-- COATB_BPIF1/22-73 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA #=GR COATB_BPIF1/22-73 SS XX-HHHH--HHHHHH--HHHHHHH--HHHHHHHHHHHHHHHHHHHHHHH--- #=GC SS_cons XHHHHHHHHHHHHHHHCHHHHHHHHCHHHHHHHHHHHHHHHHHHHHHHHC-- #=GC seq_cons AEssss...AptAhDSLpspAT-hIu.sWshVsslVsAsluIKLFKKFsSKA // biopython-1.63/Doc/examples/make_subsmat.py0000644000175000017500000000177212250104543020427 0ustar tratra00000000000000#!/usr/bin/env python """Example of generating a substitution matrix from an alignment. """ # standard library from __future__ import print_function import sys # Biopython from Bio import SubsMat from Bio import AlignIO from Bio.Alphabet import IUPAC, Gapped from Bio.Align import AlignInfo # get an alignment object from a Clustalw alignment output c_align = AlignIO.read('protein.aln', 'clustal', alphabet=Gapped(IUPAC.protein)) summary_align = AlignInfo.SummaryInfo(c_align) # get a replacement dictionary and accepted replacement matrix # exclude all amino acids that aren't charged polar replace_info = summary_align.replacement_dictionary(["G", "A", "V", "L", "I", "M", "P", "F", "W", "S", "T", "N", "Q", "Y", "C"]) my_arm = SubsMat.SeqMat(replace_info) print(replace_info) my_lom = SubsMat.make_log_odds_matrix(my_arm) print('log_odds_mat: %s' % my_lom) my_lom.print_mat() biopython-1.63/Doc/examples/ls_orchid.gbk.bgz0000644000175000017500000007207612250104543020623 0ustar tratra00000000000000BCy#]s7+P٤QDrq/~ {~Xyn~fӴːqsfգ.ۻo/=}<_goyX6/~~_ϒ>_Oi{/bv},?|uMxLj{y>[_|<=;Or&~Gџ̖?.7lg7x/?|?( ~߻~̓/ˇ'gt{XGrvz)wO2yX.<ϝKJo^pR6lܼn90[7W^g7vz|n݁s_=]Kg6i^~x~\NG)=ۇҔԽ8w_8_.}yxb1^؍o^<~Y== >}|XهEu7X"-U>jmN>~*/<&C7y??~gOF#7OjۙO3P_OR~NRu䆧ӡ?~e->f>go>wos2^Wx~:kgBLct)P,/cfH1D|;|7'.M국V/ߐ?mҖ//Rn7J rF;&ikt0r)<<6_n+ߗRo=r|#>Bж~;^TK[B[k<59Ѷ&<5fCY^љNW6_}<,?#OG#\@z2ydxgЕ-U/,H𘏲 m+=~oM/3geS6!Qs`҈ *s7s_By(W`偔x`nWm+|lČx{Dg eXh0T,؉^(t`Di `<dA2DB]My*kpXCgHwQZn)OЖНW^1НH0JY-Ԃ1b ];]Uv1b239w0pSvk)yN7҈x<@zJZX58LSCyd{疟; c=  숱Pv2,Fi @ߨh`;{!Oo}o1BMݵ[ }w&6z_Mwз77}4Z(ܥ"E^)@E@FBh{8;Ej{E\2+xFI(%jF Q }<)U!<Ce> xJ{?((D׃H] b B }Nt=ršW^Aerl EK@; /&h3,EV}.$_ɐ .DДsb"+d*i/vҞ?Pȅq}T쫠/&>G$vFc3  |y~gdDXXg:77Yk9|wu׎n'MM6"f_oSZ/|^tkM=:_2/HNКOђoY $:Sht LCU3y&>*a͍7r*䋴3 k1B_93Z[EK }Ό r 3&>X|j˅:G΃)&uZ<*q֘$>܂b5 ?/ E4 4H }Nm^*3@R{\[k.Y@eG0eqe.'^&phI$Bs?Ɩ-ixڛ,ckzwȤ;̤[oB6DEԃl _Q åoꕷ\JuEG aPG+ b^JNiRDCHc8ss5E:|b{ %]TNHNu Fvrы- zLkL*Q QA+C]?&ݫC]?U\mҽ:\m]:?u(W{WLQ۲}wpp4x1cQw7 wѮv`w+nt̶̶F&wX! .Mmy'ƺ=BC'p%΢L(m#4 ^K}:O<=AN< OLɋɋX2Ib͕*m'dJOQ u8%54]WSapu撇 pjeÞ_qCۓ:66Yr r[uCwVRю7 m~]R܎6n>vcf`MTh A}lɠy6.blG2 13d#Xp+f3dc(58g. ulp؊ ْ3d ΐ D6 DEhG 3dCp0-9C 4ЧȆD6ْ3dkM Ddc6o/Êl⇉j[8["nzg [Z=G[:~8ھ:]ir7 r2t'X*z|3w|n?!ͼɯ2 l v)`4*lTC<CPb܊C{uk` qUBaipEثc\jc!KMrwE.G`a/b+Vx&Z鱦Z%YwcM 8ƙԜ,ItĻ`T'(S7 ;М$ȗV5B؉-U*]}ZvsծĶƊ}Gnh AUGI" QTn!7G+o;]Ht0[N'=[g{{xd&5Mo8F8i-ݵ[ jDvѯK;dׁݐ >xS|iCB\ UN\xO\08r1Ht䣀s=oc$CW[N% {#}RN$u̦W&*8 rus0J3׸!ΰ I80ǞyYLC[+X3'9SHpHt#Bf5qK^N}Ԡ t(q sC Uʉ8OO MZ.QtwLV3*=<ägR{C$H'M gPHR];bvn_mSbq_~bK:kKl4yl4Uϴ{rf+8Pgu͙፼47$T_&xM?5"IɌboiU6&?^p OUF'Me.WM#L0ε0_5i] L8ifg'bz&Ws)vv+!@FfB<1چ6h'(JE9p`2H00>MV^N\ tKQBuVA u򠀧yk!g2zt+^-*=8餀+³*a'I~8g2 Lt]fE+\m5.:ps&Eg2uYB81jD::,yp&!X;g2v\JgoԗxK/|xΖ!R["h=;̿5{rȯ{FեPV؆9MX=xpE,j%$bC+]/= uq%f!1S>6-YO4@I?3<(Yb@V|nE-ûᮣr=.c{ 67xKw6ktozoz9o!hG~n$Šcō(჆[Z1"&=#5 P!Ab'(-&9$HZ(p!5q^LY CᲸؑPȎmԆb^q4`F\&g\̈+3# fgk1 4hF\͈뒎*Tbzi$0r0OBch*,xeOtPǝG;ex~Ac编pBQ< ݘy>5 iV1o@ИR#$)ybz+@Lulm^aԔ@|^{ݵc[z;7Aw_Lwim?TzDψzxv[CD ^F=V5WHB NL[2 "g!z)AU@XVz$%_s)mWkyF}zhR֋U'!)sHa6iZ%I?¯Dx^js$1_5dKeg8dO]3 pQ-N66Ppnc;A"P0]k ^Y Z_4Om~Ь!9#A' B ՎtkP0O3 RR"g,lѪh}ʂ[~5  n %+ƂLVCg,肱 X[,X`2?^h(,袱 ǕoX1* 2V߾Pdogf]cAǼ*4 h,袱SnQ?wO/ت6{/SpKUR(Uўm6 xvwKYoz^.}ockL?RK33 4"!!W!|Ra`IMF:<;ZwBLzk*aIBe'ks,(Ф&I[&4 OM4Z44̈I7IX.E&K9 |nEOኘ`݊. ֍Unyn08 5)twHҪ3WD{K<;:l!NJU՘N#7q;G #%rHyc*}%ݹtﳗl>M냽Gvwo mM%+(Ym2 @vwK1o<;7myӯK9m y+x{6.p܋{:ǽb^9 y hy(:a\\V8G^ꏾ 7Qr[BLQw5=r ysUdN=\4 /ѦiS7cC 0#JsH{3yFq!#yF(9 Jr/IdsF6CCPD-wLx (KYA$/N/U8l t'gq6z%*QY5 vpwKnrn)UoM;"'Bޅj$!"eZ{ _d~%mY~rko>ƕ*M^\>_c_*^sT0Ց"3zYdKKm-N[foaoʡ&#[kxvVu6knw_/035xES3o I{J#/ ϙH 8qsfOio<5z5Bi.򝿄;:mwt[y.Jy;;)zƌFw mBC[sǕ)N)i$.?(2ږ8j5&*$O613 0 c1?d^gn[5_?^zQjvu3f0<t0Mͮwyp}˗۹?~|OSG_}}2:pw]eq~?u7.ҕ,Nj\ٽO'Wpd3;ܿosG޽%= ӻ4 2_~խni7t1ݸYtbrwן򋗷S3 Udq]?0L*=~F:n&NIpq8*X˿^|33H|y/~>zK ,S">.kw?yߏ߿z%Oy^80owi0ßuy3? 7"o⴨p?߇Oӛ3-?7}=|_Oѝc= gύ-t1=|ORtiip98s>ԽJ/i{̦w90y1ҷS};]=O\,&/_Ço/ԡLNtO4jz|5_Գoh_v~niixi]_}o/~o)MŇń{:>n9lW|O_R8m'ͿBi$ԓԚ-W>JKe2'U||VNx_ѷ0yCt;}3? Ik.ݖ酐^\LɹR FHs|.b>oBzKK!?M^58@zGKw0uߝ擻JWj{>]G5N/>HM}bJV̧Mwθ!ċy>Yݥ+冁zagMc=y)=:=c8if;҅? mysFZ<+=O}|-G.$!:/F,=K'7 ]_t٘Gߝ/<Y >}wF^yԃ/!4OH:W3!Obs ܧBޮi`p3y!7 8.`<]u~<+FD9 `?h{)r.Quz.s[">̻#/S^aO:]W~||#8 >ݻEӧݰww wv+nYuxx7 6e wa s]x25 ⽜.w.<DE9|8E9 p 9E9r4DNQD8w^QE(+@ qod2ea w T17o=`bs@&c|'  pjyN7=9s'0eE3$LAlOMaѝwf bC\oMu춧vvz8vv!^ zpZpk !mܔ".@--rRrܔh7۲ܖ.M*p FC (s "%7ϐ{܃Ir h!X\gI[Gc s!nպEP΁u'Ps{H˼('0R&$ VC 2AG?#{X y pc"风v^jpn p a1)h{@[aI9/}ywu =Y:u$zwzK]A|sߞr_o]}K;~Kwr,e;.E4]..v &-vέ+۹FF"cYVd;$6N/[e\~ SGhiͲy~ś //P[U34z2Z,SZ7DB0s,@خ4:GF # )VQoZ"ZIzT_<ܶDy\B^^Bu'͔GPĬ_ϋG.vҟP!ra yI[f;iY<&'IN avSޞR(o)}[כf7eu] 570/<\ƋIsxdLy 䅪A:9E> P0v#.f2Ők>'&] p~~ r{̌G(x̓yby#0^P<E[y xQ}o8ȃy#zYSA˚I7I7G d߳EcDZkf#b?gO1?- ԿX`z7YS%Ѓ*vP%בT&]U/O+<˸6ւ=x@@*nxJX Vq@`@^ɃkĿyG WשT:85. t [VGτ{ʄo.myMѰu% Uhw3!_ / =a3tXs̆h4 (b'*H(Y4@PU0ZAq z 40d6Pp !-C$] u U! 8+-@P]ޫ !f?H!.;gQ.AP] =wj [fz a a;Թb4ƅ=}H v:!UݤUc,iQuA2/`fX6-0,˃02ctĀx玘Qz "QDU1`j*Ddl]@ a@z #- .14- V=*G,"<(A(Oq!"`GqȜe@q3 s}3:b@ib\з#X_G=o\(u1̴"'p{Jz@À|W,3M0^ŀD~$,; FR ,91 /$:E2; o0v/<ݰ&]o\Gq~;G?*G}E J+f߮,t)ϭBA?'JҕaH W(gZgC/H/: GH[ s2qd @JV(̃.gDx϶_S;V8!{J6@ - qEEpR5gsh%:|WXYsd@b\% Z~ !ꑮ]P [1$ >+hW!k+9F;~DV 19yd+9 panQ÷h<|W,Z]yoTQ{'= ܳm=pho<ސtoRwau o7Ga/,|M$ אrMfPiNυ'A4 GJKlBvDՈeDoCD7?۱_ Dt,p$u SDBt.[eo.<䵧 [JœMb L9aK(Ӵx *Y|ec(ZD E._ M!Dtj ֥]dXdw-  ہb*x%/?(NR[v Xhr] ~ܤoZVGz](nYW@\Ѩ:zSk𮀸jo+TcC炸F+ą!.hdAKZ>8źU(R\a}M@PJ*w~Q] ŁS3yV,)eHBf%Kc4 4ۭP;#6:qNvnɮ4J]c<5gipW:ٹFilv3Vs8Ye8|b?Zqc]q+'wԗc))EcMӮEx3?/r^&Gz](j2gTGx{xtˍ[}K2ݨɱ).sS3TY"lxʉnk%K xhI%{TuLGlHg φQ(PSNR`A(0 `Aρ^<+)qm/ 01`A/[&Sqrkjm)SZ9W(H ƍE3:fNZ<,>u  f̠@:mP=)͝PM%Fȝ ERC\pg9GGru\ b#YA.A5\%69hul@؊#o+j"&΍\ƵZz,ٍa_w8 iwn\1.a v^ CFLn?.}X7d;[kz0u DwXxax.Re!*1ϑ_>{yqA"#&*0]XIS\J . sKQ|uCw8Nh%`ې0f='9E 4ɧ=Ȼj~8l2hB2۪2(cad au 'M Cwn2eqak,N+e:\\-e,k(caˑ:6SȃM2CT X\GW:[?QuiK^ GIc#58=hC̷V/c1.X v^Ƣ Z[nW='O [V-r}>̫m\ŭr7\\ϼWg1UUUq%uU.|U.4rً.D.Jjͩ,^e9{d֎{(WUּKi$ZQnq&WE1.jQ v^ +UGx xWmmHi7E|"y*#Lw.tA76Bw 6ק]T tǕRkY: ޣU /Ge;CwkաvAe;CwmuhEk킕 /6 x l)T휱rV 5v6WsLDؤkÎ2d؈qĸ(.1yq *δDvM;ے]>J ] nJsL]S_:t’4ul{Z%*F[6J4v;!;v avxLvd;DU!2فv؅T+̭JveUh@U™NɎ \}//] ET|bAWTC΀v܆Ɏ4DA'cjeƾ[˙.4vIß^;4g57Յtn"^w.6ׇ!w^ ̫5N(jdӨroK;o0?z">a|O8!Z51d>&^\X@MyC"S)Emf1V?eBC]s6)䪝I]˲^L/O74I;7Vam+Oo8"mUVEN'e"@?/sm6O}?_:9>>_߾~[#Tv9kw`p4;'U/|q'?zv3rq_/~xh8x߿ ww~\ ۽\{0r~jjn5n,_>h{Iw݇Wf\Ogn`(.8{v+?ªt9*wWv9ۛËOnKo&tW'%G|1oL}}ƼTF&noܫz89߫Ϸ)b1:zvyˋ47=woƫ_/Ώ~9z?ab}{>8YuV?zo>xT`;؛ f[7BX&hT_~;=uun+&w7=08n&Nt= G_fǛ r-\}4]yVn};_Ά_⩀r٭O5ד8E2˩_p\.'g?|ٿ.7 NͦO'q[Icȍ5y7پ^,էoW/~Z~o'>wwyɍݘ?rϭk1f?>;տ>Qn9w8/{ÚSL N\~rq}m3}W1'AmVN?{w<=*2/{Q[ nW~w5QVws%41[oqiuwsNz`4LQZA/EO\ /k^kx!8,wn\8*w8:lwFsҹ,],miK:~znWkM348%N#W8u/){~|28\,NYiSѝPfNOpntI4gGU49nBC# u:ՅsOW厲t-ƸpѹY^;>jG7G->>2g!""F=#ڳ\M;0rLs 3|30Z; !{KӢq}aiC$NI8xSm˩jKk2ZkX-ڥ:RORs!57ֆpoۉNV>_Nt^y2ҝ:ktw{kHc3-$/e2HgP@tAPt-| ŒTn4HNERfa# NFb$ E5=#]' 896#..y>2YbB˲x ;CŜDJUJ^$]ܬK^`9 ٝD ׅH'⥀/K *s^v|!ґ|FD~_^w{)`̇p6JC0:eA07'`;C-jw{Gi:V UFZxtT5 jڻb W/%57u6,HC)LIsX9TtB̂W)4,a+fbӜhg & C3ҀؖB`'D`t+Ia10qMxJ @=R105I1wl`Rt>1TkhN L b`esfi(Vwy|=A ,k8)ڥ:DODd1AԷAttZDk#]u& {`@쑙5'-3:-ᗂ_OT,c|\_FtQ^((EMFozd?PAVoK1Ed"cN:@N|?۫`S90!1H몍>E0I8/SvvbUL=4ٮ-e Vl)Cq~Cr%;)UƝyl%9\>WRSB9WRy /уNLr\eA@N[H-)kaLd{R@Drۚ#ˌu.%/V{1\&^fDrRWs˴dK̈䲮feu/3&`F'3TL3||HEQLyƻhu2]Wu>xnMboKӚTŧ%֙b]#ZG<axmaX~3`Sy uZ+3 h D V'eE2Du0/() ^'e\fxb{О֌Olφٚ/ XXd>yXNHu hHEëb0j?1}Xbm5 vR^@5\ɂSvRp\ cj6"$PQFdH*ЅJ۩D!dTƌU2jT4:f@+`vK!NE|CN1;)oիd f'Ey fgZ/H3NKƩDi f9eUFZ0;ɺ: WМ kdl(TYOHcW2F-K]M{W&^Bt]]a E[u{uT i1ԷicMѮ>US&ژjvfcSv@)Shsm,A;خ(K1AK6(g2ܑnpG5(.oPA^c)-llRC l`$ DQ6DH6`9RD!M);QX6V[C-efG%XXU\FBPSi$Eh$ 8 d@6p.B;g "̯e[tz])87#hbn?}X]X5L⬼O6r>[]ݵv>bwbOř12-3b dUSnzf)dFmA6lfO&3 ;!+af] NJ2 r$4̕$}̮6,%4(khmbhO쀨)}[aոž,M&pZ4C%}ae tHM f{E-b+ P|ÇX7Ѯ!dT "X0k1ѽ$dxBT-ƺWeR!^o14K.#)2cy)[zTnJqJ;/FXI.1~2( #6dԷGN9j3_y wGFij3_#Uyh̼*j&+GTU \X'ZRÊRG!b!-Ag$R @bšK-xuš+yBe}YM7ɈVbyo7X9Ľ&"_-oN+OZnr(`Pl4'4@kChⅾ4~LM2=`O3 &5rQ$Qi>J^g}-ZFuE!^%OU%QR,F&HuQ:ѯL\IZ\FOYΓ`5Q&E\avS7S|I[+yad5`_u||>wn .YۊuPTj[$٤D1/$@}5+S*X} }۬D} Dr~5}1 Ӹr~y5a^U }.˧(ĕ-ܲraoVyPr} a_h u,`ˍ!wm l][+le򲞼,k4'6D1r%UQq)oݱ} 2&/IU|:zOhB}X y=z})ŸGo\߹'deI'ìA=~}Gb? MWBA1NZ{ڵIQ, w\w!J(7Po rhdzt=`YpGf8xS,rQx3@D]x;RKQ9U( T\~eAΒ\NX.σ GZ.>̃L4ă>-knIWDzCLoyp5fL!1L k\tp:a8p:TI t&E8]\Lľ͋>(žNB<]> MZOF $ʝI'; cadb@p_ApZ36bo'5f-uf§=>I $PGW{Ƴ57dIR);UѵXD*RgD#[rvx|m792CΥ#&>e7ꞞJV?ٲg膀@جgxxvK=='4(Jbx!كG^@eߟԞ]IWλ jNv((X4XbN$DvDgcjxDGVwѩ;CN%Xi( ,j=.pr61s=PDl[|]I3 f.b&AҼBƞJ{FD'9K7#_p&FIN)AHNƅ삙|KX 9$'nX"R!#p.Iw 9$H=XYbTE(Vz$Xč FQWQr}Fv4&fj:H`41 }ú=ź`!ZREQ5Uuٕ/*N=TۘJdK/ZvT8؏ ha2"  1A0f-]Dv ` %/THx x \@"ն$N;1$=b'CCwIOoD{)dG=^H?<)O"bNb*7,:Nĸ݃!Ux}A`^Wuץ`u*V`t?` poݨMp )ڋڃ] x1y b [ww]E5Zߖ%eX< ]"<+f ³k6"Cxn ϯ|MBCr7]JdgRvB6dvoR4XHL_t7CJ34#kũE`p"%Njʳ/Ydn zL%Svgw=h/~6,\g:^e0*ŚlŗnwUxg݃G|q!KM\pj2ܺ,I;ֳw'|mRZ)cZO|iܛmgjeݻ}]zMj:re+Wxc\QZ}\e5[M0oWWеwvt'ʾ^L7SXwz;akªU[m} \{EƊ|U e:,*x(+ƕ p\WA+ml7x5k+v-u?UaІj媅\!EڻsT]wl* a:xG,Oѩ4:Ksm?hD,N m p~сCfaXAÝ#efX1_Vnv׹6ҜUoRxUTv;`Ȝ5p~u RWiZ?_=t VVuo {bٛO m|.\M[33ߟV{{əb<,ˇ ?A3pry /ZXћ7tsFx ev_[j׫;5?J_3+٧7G5Np4BwӓkN)*:|tV ^<+~x|{N\Jdi*2h|?׳{}ښy?f,7]':͇؀?Ltw~)I]yg8o&|>؇Y&ݟܟG,hܨYw{ߏ7_G*;3|{l4„;2|Ԫ_xG8Wsn8awu6s {wѧt~5nu-\Mgd'UI#\̯܃s6[ֺyCѧwϛ(;|u3'7=C T~gK~󡾹]y}_}>|eO~~\^kF/,q<k$7fʧ*и~_ On]ޮ%Dk6[;Dh{C4mb}SD S F"\ ьDX4vu8S^e>Kb:b,Drr)O,v FF%#`0ǜHF:B4b:"`FDj!(. ёHGà "D##tDx63u8H!w1!!b:9 \"1%q;oFϵk CD#‡N%FHK]%Tsq{T1@R)J~v=ƻ̍cv5Yzz-]|%ǎ++6VeUC3P3A0)g@[oN\]I!Dl e!RHBbk<򈰖"!DdjG@ ?< (AP A@ cDAЂ [ȓ xdeU<$@ge:A@BOF@GF@l6SA@ 1 Rw0*d< -c('fAݨG7Y\&fB~&5R;{n<k’Uﰻ#rAx}Z]#֤gWӽgF"À֥l2e0ic XxP_{ g #V;#V $QKF-7j,Tز-D45]jeYރ`jqw&*VCb˖-[ب FژIJ~p ĨE~V# /XI޲U -x rjm!Qڼ/ӝnltww1n.qcun/˘fэMD;İԗU/Lb@c#3b̂ ,S'>˂bǂ;6B:#,Uy%5Q"v,kͤEHGg_э; 2Ztڭpd.![0AC#[5ضpZq푢[tЭөntU\W n=W߂k;`⚴ ɁXԒ G-WlvkMU/zvUos\eZ ]gP{!|Vˬ7HXЬG[ycVEy%7a]U[5~X6:z)YΓ]lx KbWh>XnJ)b{ŊJ>oz Ѐu|eB,x˕:܁X1։bB)\ Ɗɪ \ ƺ*w*d)"HxWzpq*G $L@p\51ڱmƌGTF5޴%sŖB]נwXS#g_~u5hR;{t O\[+][ZUMieNx Hb |AұILY;ZIgKVSjUgi/X݄ Px%zUخ6XmJ J fk xZ=U((p5]#+_kX[%X|ͺ\O0Zoz 5ъ6ⓊcipkkUN&RAܚW3桪a*jq΀|+enc'5JGh!#],ywBDsE@47:2A`bR%TV,-cJaK@u׏Pa9rt\*y+]+ҵrr6^+P]V Յ,r1 ՁD0I3[+oG7ϯ&MVq %'ǎ+=tͪYɾt;zJo#/ezr}9ItN#V1~ t\kIʅ*d+z[/)v te!. ʅ*d[m)uJ62;ٌ: ׉w 4sp^qHqf<sm}[R\sMӕa-3kҏԐ(9W4/`1=u "Նp^*. e.UksժY82X#Y8os]sVZҿu,%VJη<:pݢWD8JqtAl#gMhmyND[N+=NVsSɰkkEV2tattUt7Aj(]޷,DoVVvwǸrZo:Jcio ݾ*V-ѻν%8bX3 `L.|(Dݼ&(L[?{#FQ#VPbYپ #:;H+Gqsi;Sђ,~Ҝ!F%(+F=8/bsUq*: #HE%S,h_/z4pq1rCmA_(S z}sxT*2ORA:Kh^W!Ȝ ߡ DVօ;sG#HO¾Nv{5kw{AOxW#Z ,gOnd}D+XI" tW ۫N J} ^52sse$p986gKrC[r/ AIR+Qsk=ITꖷ$[C|kk.98vHH6kTZn]lΫzޝU;XKVZQv9V^Ic}n!jUD=[y- 郎!sѭ6.Q[ІdsĔ,QD0 q ~- B`|8doD~ZE HbRrxhtXl΀$Po7gi|6273291|gb|AF191665.1|AF191665 Opuntia marenae rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TAGGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTATGNTCATTG GAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAAACT AAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTTTCT TTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAACATAGACAAACTATATATATATATATATA TAATATATTTCAAATTCCCTTATATATCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAA TCTATTGATTTAGTGTATTATTAAATGTATATATTAATTCAATATTATTATTCTATTCATTTTTATTCAT TTTCAAATTTATAATATATTAATCTATATATTAATTTAGAATTCTATTCTAATTCGAATTCAATTTTTAA ATATTCATATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTC CGGTTCTGTAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAAAGAACCAGA >gi|6273290|gb|AF191664.1|AF191664 Opuntia clavata rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TAGGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTAATGNTNCAT TGGGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAA ACTAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTT TCTTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAACATAGACAAACTATATATATATATAA TATATTTCAAATTCCCTTATATATCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCT ATTGATTTAGTGTATTATTAAATGTATATATTAATTCAATATTATTATTCTATTCATTTTTATTCATTTT CAAATTTATAATATATTAATCTATATATTAATTTAGAATTCTATTCTAATTCGAATTCAATTTTTAAATA TTCATATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGG TTCTGTAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAAAGAACCAGA >gi|6273289|gb|AF191663.1|AF191663 Opuntia bradtiana rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TAGGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTAATGATTCAT TGGGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAA ACTAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTT TCTTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAACATAGACAAACTATATATATATATAA TATATTTCAAATTCCCTTATATATCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCT ATTGATTTAGTATATTATTAAATGTATATATTAATTCAATATTATTATTCTATTCATTTTTATTCATTTT CAAATTTATAATATATTAATCTATATATTAATTTAGAATTCTATTCTAATTCGAATTCAATTTTTAAATA TTCATATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGG TTCTGTAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAAAGAACCAGA >gi|6273287|gb|AF191661.1|AF191661 Opuntia kuehnrichiana rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TACGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTATGATCCATT GGGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAAA CTAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTTTTTAAATTGCTCATATTT TATTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAATAAAGACAAACTATATATATAATATA TTTCAAATTTCCTTATATATCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCTATTG ATTTAGTGTATTATTAAATGTATATCTTAATTCAATATTATTATTCTATTCATTTTTATTCATTTTCAAT TTTATAATATATTAATCTATATATTAATTTATAATTCTATTCTAATTCGAATTCAATTTTTAAATATTCA TATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGGTTCT GTAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAGAGAACCAGA >gi|6273286|gb|AF191660.1|AF191660 Opuntia echinacea rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TACGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTAATGATCATT GGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAAAC TAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTTTA TTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAATATAGACAAACTATATATATAATATATT TATAATTTCCTTATATATCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCTATTGAT TTAGTGTATTATTAAATGTATATCTTAATTCAATATTATTATTCTATTCATTTTTATTCATTTTCAAATT TATAATATATTAATCTATATATTAATTTATAATTCTATTCTAATTCGAATTCAATTTTTAAATATTCATA TTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGGTTCTGT AGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAGAGAACCAGA >gi|6273285|gb|AF191659.1|AF191659 Opuntia pachypus rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TACGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTAATGATCATT GGGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAAA CTAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTTT ATTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAATATAGACAAACTATATATATAATATAT TTCAAATTTCCTTATATACCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCCATTGA TTTAGTGTATTATTAAATGTATATCTTAATTCAATATTATTATTCTATTCATTTTTATTCATTTTCAAAT TTATAATATATTAATCTATATATTAATTTATAATTCTATTCTAATTCGAATTCAATTTTTAAATATTCAT ATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGGTTCTG TAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAGAGAACCAGA >gi|6273284|gb|AF191658.1|AF191658 Opuntia subulata rpl16 gene; chloroplast gene for chloroplast product, partial intron sequence TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAATCTAAATGATA TACGATTCCACTATGTAAGGTCTTTGAATCATATCATAAAAGACAATGTAATAAAGCATGAATACAGATT CACACATAATTATCTGATATGAATCTATTCATAGAAAAAAGAAAAAAGTAAGAGCCTCCGGCCAATAAAG ACTAAGAGGGTTGGCTCAAGAACAAAGTTCATTAAGAGCTCCATTGTAGAATTCAGACCTAATCATTAAT CAAGAAGCGATGGGAACGATGTAATCCATGAATACAGAAGATTCAATTGAAAAAGATCCTAATGATCATT GGGAAGGATGGCGGAACGAACCAGAGACCAATTCATCTATTCTGAAAAGTGATAAACTAATCCTATAAAA CTAAAATAGATATTGAAAGAGTAAATATTCGCCCGCGAAAATTCCTTTTTTATTAAATTGCTCATATTTT ATTTTAGCAATGCAATCTAATAAAATATATCTATACAAAAAAATATAGACAAACTATATATATATAATAT ATTTCAAATTTCCTTATATACCCAAATATAAAAATATCTAATAAATTAGATGAATATCAAAGAATCTATT GATTTAGTGTATTATTAAATGTATATCTTAATTCAATATTATTATTCTATTCATTTTTATTCATTTTCAA ATTTATAATATATTAATCTATATATTAATTTATAATTCTATTCTAATTCGAATTCAATTTTTAAATATTC ATATTCAATTAAAATTGAAATTTTTTCATTCGCGAGGAGCCGGATGAGAAGAAACTCTCATGTCCGGTTC TGTAGTAGAGATGGAATTAAGAAAAAACCATCAACTATAACCCCAAGAGAACCAGA biopython-1.63/Doc/examples/ACT_example.py0000644000175000017500000001051712250104543020073 0ustar tratra00000000000000# This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # from __future__ import print_function import sys import os import time from reportlab.lib import colors from reportlab.lib.units import cm from Bio.Blast.Applications import NcbitblastxCommandline from Bio.Graphics.GenomeDiagram import Diagram, CrossLink from Bio.SeqFeature import SeqFeature, FeatureLocation from Bio import SeqIO #Modify this line to point at the Artemis/ACT example data which is online at: # https://github.com/sanger-pathogens/Artemis/tree/master/etc input_folder = "/Applications/Artemis/Artemis.app/Contents/artemis/etc" name = "af063097_v_b132222" file_a = "af063097.embl" file_b = "b132222.embl" format_a = "embl" format_b = "embl" file_a_vs_b = "af063097_v_b132222.crunch" for f in [file_a, file_b, file_a_vs_b]: if not os.path.isfile(os.path.join(input_folder, f)): print("Missing input file %s.fna" % f) sys.exit(1) #Only doing a_vs_b here, could also have b_vs_c and c_vs_d etc genomes = [ (os.path.join(input_folder, file_a), format_a), (os.path.join(input_folder, file_b), format_b), ] comparisons = [os.path.join(input_folder, file_a_vs_b)] #Create diagram with tracks, each with a feature set assert len(genomes) >= 2 and len(genomes) == len(comparisons)+1 gd_diagram = Diagram(name, track_size=0.35, circular=False) tracks = dict() feature_sets = dict() records = dict() for f, format in genomes: records[f] = SeqIO.read(f, format) tracks[f] = gd_diagram.new_track(1, name=f, start=0, end=len(records[f]), scale_smalltick_interval=1000, scale_largetick_interval=10000, greytrack=True, greytrack_labels=0) feature_sets[f] = tracks[f].new_set() print("Drawing matches...") for i, crunch_file in enumerate(comparisons): q = genomes[i+1][0] # query file s = genomes[i][0] # subject file q_set = feature_sets[q] s_set = feature_sets[s] handle = open(crunch_file) for line in handle: if line[0]=="#": continue parts = line.rstrip("\n").split(None, 7) #0 = score #1 = id #2 = S1 #3 = E1 #4 = seq1 #5 = S2 #6 = E2 #7 = seq2 try: q_start, q_end = int(parts[2]), int(parts[3]) s_start, s_end = int(parts[5]), int(parts[6]) except IndexError: sys.stderr.write(repr(line) + "\n") sys.stderr.write(repr(parts) + "\n") raise flip = False if q_start > q_end: flip = not flip q_start, q_end = q_end, q_start if s_start > s_end: flip = not flip s_start, s_end = s_end, s_start if flip: c = colors.Color(0, 0, 1, alpha=0.25) b = False else: c = colors.Color(1, 0, 0, alpha=0.25) b = False q_feature = q_set.add_feature(SeqFeature(FeatureLocation(q_start-1, q_end)), color=c, border=b) s_feature = s_set.add_feature(SeqFeature(FeatureLocation(s_start-1, s_end)), color=c, border=b) gd_diagram.cross_track_links.append(CrossLink(q_feature, s_feature, c, b)) #NOTE: We are using the same colour for all the matches, #with transparency. This means overlayed matches will appear darker. #It also means the drawing order not very important. #Note ACT puts long hits at the back, and colours by hit score handle.close() print("Drawing CDS features...") for f, format in genomes: record = records[f] feature_set = feature_sets[f] #Mark the CDS features for cds in record.features: if cds.type != "CDS": continue feature_set.add_feature(cds, sigil="ARROW", color=colors.lightblue, border=colors.blue) gd_diagram.draw(format="linear", fragments=3, orientation="landscape", pagesize=(20*cm, 10*cm)) gd_diagram.write(name + ".pdf", "PDF") gd_diagram.draw(format="circular", orientation="landscape", pagesize=(20*cm, 20*cm)) gd_diagram.write(name + "_c.pdf", "PDF") biopython-1.63/Doc/examples/protein.aln0000644000175000017500000003647712250104543017570 0ustar tratra00000000000000CLUSTAL W (1.81) multiple sequence alignment gi|14150838|gb|AAK54648.1|AF37 -------------------------------------------------- gi|12644515|sp|Q9MBB1|CHSY_EQU MTVLEESADASSRRLAQRANGPATVLAIGTANPANVFEQSSYPDFYFDIT gi|13774971|gb|AAK39113.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13774967|gb|AAK39111.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13774975|gb|AAK39115.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13774965|gb|AAK39110.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13774973|gb|AAK39114.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13774969|gb|AAK39112.1|AF35 ------MVTVEEVRKAQRAEGPATILAIGTATPANCVDQSTYPDYYFRIT gi|13919613|gb|AAK33142.1| -----------------------------------------YPDYYFRIT gi|13919597|gb|AAK33134.1| -----------------------------------------YPDYYFRIT gi|13925890|gb|AAK49457.1| ------MVTVEEFRRAQCAEGPATVMAIGTATPSNCVDQSTYPDYYFRIT gi|12644514|sp|Q9MB41|CHS2_IPO ------MVTVEEVRKAQRAEGPATILAIGTVTPANCVNQSTYPDYYFRIT gi|12644512|sp|Q9MB39|CHS4_IPO ------MVTVEEVRKAQRAEGPATILAIGTVTPANCVNQSTYPDYYFRIT gi|12644509|sp|Q9MB36|CHS8_IPO ------MVTVEEVRKAQRAEGPATILAIGTVTPANCVNQSTYPDYYFRIT gi|12644511|sp|Q9MB38|CHS6_IPO ------MVTVEEVRKAQRAEGPATILAIGTATPANCVNQSTYPDYYFRIT gi|12644510|sp|Q9MB37|CHS7_IPO ------MVTVEEVRKAKRAEGPATILAIGTATPANCVNQSTYPDYYFRIT gi|12644513|sp|Q9MB40|CHS3_IPO ------MVTVGEVRKAQRAEGPATILAIGTATPANCVNQSTYPDYYFRIT gi|13936397|dbj|BAB47195.1| ----MTSMTVDQIRRPLRAEGLATILAIGTANPANYITQADYPDYYFRVT gi|13936395|dbj|BAB47194.1| ----MTSMTVDQIRRPLRAEGLATILAIGTANPANYITQADYPDYYFRVT gi|13936399|dbj|BAB47196.1| ---MSSSITVDQIRKAQRAEGPATILAIGTATPANFIIQADYPDYYFRVT gi|14150838|gb|AAK54648.1|AF37 -------------------------------------------------- gi|12644515|sp|Q9MBB1|CHSY_EQU NSQHMTELKLKFSRMCQKSGIKKRYMHLNSEILKANPSLCAYWEKSLDVR gi|13774971|gb|AAK39113.1|AF35 KSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13774967|gb|AAK39111.1|AF35 KSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13774975|gb|AAK39115.1|AF35 KSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13774965|gb|AAK39110.1|AF35 KSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13774973|gb|AAK39114.1|AF35 KSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13774969|gb|AAK39112.1|AF35 NSDHMTDLKQKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13919613|gb|AAK33142.1| NREHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDAR gi|13919597|gb|AAK33134.1| NSEHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDAR gi|13925890|gb|AAK49457.1| NSEHKVELKEKFKRMCEKSMIKKRYMHLTEEILKENPNICAYMAPSLDAR gi|12644514|sp|Q9MB41|CHS2_IPO NSEHKTELKEKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|12644512|sp|Q9MB39|CHS4_IPO NSEHKTELKERFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|12644509|sp|Q9MB36|CHS8_IPO NSEHKTELKEKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|12644511|sp|Q9MB38|CHS6_IPO NSEHKTELKEKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|12644510|sp|Q9MB37|CHS7_IPO NSEHKTELKEKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|12644513|sp|Q9MB40|CHS3_IPO NSEHKTELKEKFQRMCDKSMITKRYMHLTEEILKENPSFCEYMAPSLDAR gi|13936397|dbj|BAB47195.1| KSEHMTDLKNKFQRMCDRSMIKKRHMYFTEEHLKQNPNMCDYTAPSLDAR gi|13936395|dbj|BAB47194.1| KSEHMTDLKNKFQRMCDRSMIKKRHMYFTEEHLKQNPNMCDYTAPSLDAR gi|13936399|dbj|BAB47196.1| KSEHMTNLKKRFQRICDRTMIKKRHLVLSEDHLKENPNMCEFMAPSLDVR gi|14150838|gb|AAK54648.1|AF37 -------------------------------------------------- gi|12644515|sp|Q9MBB1|CHSY_EQU QDIAVVEVPKLGKEASLKAIKEWGQPKSKITHLVFCTTSGVDMPGADWAL gi|13774971|gb|AAK39113.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13774967|gb|AAK39111.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13774975|gb|AAK39115.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13774965|gb|AAK39110.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13774973|gb|AAK39114.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13774969|gb|AAK39112.1|AF35 QDIVVVEVPKLGKEAAQSAIKEWGQPKSKITHVIFCTTSGVDMPGADYQL gi|13919613|gb|AAK33142.1| QDMVVVEIPKLGKEAAVKAIKEWGQ------------------------- gi|13919597|gb|AAK33134.1| QDMVVVEIPKLGKEAAVKAIKEWGQ------------------------- gi|13925890|gb|AAK49457.1| QDIVVVEVPKLGKEAAQKAIKEWGQPKSKITHLVFCTTSGVDMPGCDYQL gi|12644514|sp|Q9MB41|CHS2_IPO QDIAVVEVPKLGKEAAQSAIKEWGQPKSKITHVVFCTTSGVDMPGADYQL gi|12644512|sp|Q9MB39|CHS4_IPO QDIAVVEVPKLGKEAAQSAIKEWGQPKSKITHVVFCTTSGVDMPGADYQL gi|12644509|sp|Q9MB36|CHS8_IPO QDIAVVEVPKLGKEAAQSAIKEWGQPKSKITHVVFCTTSGIDMPGADYQL gi|12644511|sp|Q9MB38|CHS6_IPO QDIAVVEVPKLGKEAAQSAIKEWGQPKSKITHVVFCTTSGVDMPGADYQL gi|12644510|sp|Q9MB37|CHS7_IPO QDIAVVEVPKLGKEAAQSAIKEWGQPKSKITHVFFCTTSGVDMPGADYQL gi|12644513|sp|Q9MB40|CHS3_IPO QDIAVVEVPKLGKEAAQSAIKGWGQPKSKITHVVFCTTSGVDMPGADYQL gi|13936397|dbj|BAB47195.1| QSILVVEVPKLGKEACIKAIKEWNQPKSKITHFIFTTISGIDMPGADYQC gi|13936395|dbj|BAB47194.1| QSILVVEVPKLGKEACIKAIKEWNQPKSKITHFIFTTISGIDMPGADYQC gi|13936399|dbj|BAB47196.1| QDILVVEVPKLGKEACMKAIKEWDQPKSKITHFIFATTSGVDMPGADYQC gi|14150838|gb|AAK54648.1|AF37 -------------MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEIT gi|12644515|sp|Q9MBB1|CHSY_EQU TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDVAENNKGARVLVVCSEIT gi|13774971|gb|AAK39113.1|AF35 TKLLGLRPSVKRLMMYQQGLFAGGTVLRVAKDLAENNKGARVLVVCSEIT gi|13774967|gb|AAK39111.1|AF35 TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDLAENNKGARVLVVCSEIT gi|13774975|gb|AAK39115.1|AF35 TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDLAENNKGARVLVVCSEIT gi|13774965|gb|AAK39110.1|AF35 TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDLVENNKGARVLVVCSEIT gi|13774973|gb|AAK39114.1|AF35 TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDLAENNKGARVLVVCSEIT gi|13774969|gb|AAK39112.1|AF35 TKLLGLRPSVKRLMMYQQGCFAGGTVLRVAKDLAENNKGARVLVVCSEIT gi|13919613|gb|AAK33142.1| -------------------------------------------------- gi|13919597|gb|AAK33134.1| -------------------------------------------------- gi|13925890|gb|AAK49457.1| TKLLGLRPSVKRFMMYQQGCFAGGTVLRMAKDLAENNKGARVLVVCSEIT gi|12644514|sp|Q9MB41|CHS2_IPO TKLLGLSPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|12644512|sp|Q9MB39|CHS4_IPO TKLLGLRPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|12644509|sp|Q9MB36|CHS8_IPO TKLLGLRPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|12644511|sp|Q9MB38|CHS6_IPO TKLLGLRPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|12644510|sp|Q9MB37|CHS7_IPO TKLLGLRPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|12644513|sp|Q9MB40|CHS3_IPO TKLLGLRPSVKRLMMYQQGCFAGGTVLRLAKDLAENNKGARVLIVCSEIT gi|13936397|dbj|BAB47195.1| SKLLGLNPSVKRVMLYNLGCHASGTILRMAKDIAENNKGARVLAVCSDIM gi|13936395|dbj|BAB47194.1| SKLLGLNPSVKRVMLYNLGCHASGTILRMAKDIAENNKGARVLAVCSDIM gi|13936399|dbj|BAB47196.1| AKLLGLSSSVKRVMMYQQGCFAGGTVLRIAKDIAENNKGARVLALCSEIT gi|14150838|gb|AAK54648.1|AF37 AVTFRGPSETHLDSMVGQALFGDGAGAVIVGSDPDLS-VERPLYELVWTG gi|12644515|sp|Q9MBB1|CHSY_EQU CVTFRGPSETHLDSLVGQALFGDGAAAVILGSDP-LP-EENPCFELHWSG gi|13774971|gb|AAK39113.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEKALFQLVSAA gi|13774967|gb|AAK39111.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEKPLFQLVSAA gi|13774975|gb|AAK39115.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEKPLFQLVSAA gi|13774965|gb|AAK39110.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEEPLFQLVSAA gi|13774973|gb|AAK39114.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEKPLFQLVSAA gi|13774969|gb|AAK39112.1|AF35 VVTFRGPNETHLDSLVGQALFGDGAAAIIVGSDPTP--VEKPLFQLVSAA gi|13919613|gb|AAK33142.1| -------------------------------------------------- gi|13919597|gb|AAK33134.1| -------------------------------------------------- gi|13925890|gb|AAK49457.1| AVTFRGPNDTHLDSLVGQALFGDGAAAVIIGSDPIPE-VERPLFELVSAA gi|12644514|sp|Q9MB41|CHS2_IPO VVTFRGPSETHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|12644512|sp|Q9MB39|CHS4_IPO VVTFRGPSETHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|12644509|sp|Q9MB36|CHS8_IPO VVTFRGPSETHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|12644511|sp|Q9MB38|CHS6_IPO VVTFRGPSETHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|12644510|sp|Q9MB37|CHS7_IPO VVTFRGPSETHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|12644513|sp|Q9MB40|CHS3_IPO VVTFRGPSEAHLDSLVGQALFGDGAAAVIVGADPTP--AEKPLFQLVSAA gi|13936397|dbj|BAB47195.1| TGHFRGPAESHLDSMIGQALFGDGASAIIVGAEPDESAGEQPIFELVSTA gi|13936395|dbj|BAB47194.1| TGHFRGPAESHLDSMIGQALFGDGASAIIVGAEPDESAGEQPIFELVSTA gi|13936399|dbj|BAB47196.1| TCMFHGPTESHLDSMVGQALFGDGASAVIVGAEPDESAGERPIYELVSAA gi|14150838|gb|AAK54648.1|AF37 ATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLKEAFTPLG-- gi|12644515|sp|Q9MBB1|CHSY_EQU SNILPDSDGAIDGHLREVGLTFHLMKDVPGIISKNIGKVLNDAFRSAFDE gi|13774971|gb|AAK39113.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13774967|gb|AAK39111.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13774975|gb|AAK39115.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13774965|gb|AAK39110.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13774973|gb|AAK39114.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13774969|gb|AAK39112.1|AF35 QTLAPDSCGAIDGHLREVGLTFHLLKDVPSIVSNNIEKCLSEAFNPLG-- gi|13919613|gb|AAK33142.1| -------------------------------------------------- gi|13919597|gb|AAK33134.1| -------------------------------------------------- gi|13925890|gb|AAK49457.1| QTLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLVEAFQPLG-- gi|12644514|sp|Q9MB41|CHS2_IPO QTLAPDSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|12644512|sp|Q9MB39|CHS4_IPO QNLAPDSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|12644509|sp|Q9MB36|CHS8_IPO QTLAPNSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|12644511|sp|Q9MB38|CHS6_IPO QTLAPNSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|12644510|sp|Q9MB37|CHS7_IPO QTLAPDSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|12644513|sp|Q9MB40|CHS3_IPO QTLAPDSCGAIDGHLREVGLTFHLLKDVPSVVSNNIEKCLFEAFNPLG-- gi|13936397|dbj|BAB47195.1| QTTLPDSDGVARGHLKEAGVVIHLHQSLPGLISTNIEKSLTEAFAPIG-- gi|13936395|dbj|BAB47194.1| QTTLPDSDGVARGHLKEAGVVIHLHQSLPGLISTNIEKSLTEAFAPIG-- gi|13936399|dbj|BAB47196.1| QTILPNSEGAIDGHLMETRLTFHLLKDVPGLISNNIEKSLIEAFTPIG-- gi|14150838|gb|AAK54648.1|AF37 -------ISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEY gi|12644515|sp|Q9MBB1|CHSY_EQU SGNAEDRPASVNDIFWIAHPGGPAILDQVEEKMKLAPEKMRATRDVLSEY gi|13774971|gb|AAK39113.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13774967|gb|AAK39111.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13774975|gb|AAK39115.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13774965|gb|AAK39110.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13774973|gb|AAK39114.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13774969|gb|AAK39112.1|AF35 -------ISDWNSIFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13919613|gb|AAK33142.1| -------------------------------------------------- gi|13919597|gb|AAK33134.1| -------------------------------------------------- gi|13925890|gb|AAK49457.1| -------ISDWNSLFWIAHPGGPAILDQVELKLGLKQEKLKATRKVLSNY gi|12644514|sp|Q9MB41|CHS2_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|12644512|sp|Q9MB39|CHS4_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|12644509|sp|Q9MB36|CHS8_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|12644511|sp|Q9MB38|CHS6_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|12644510|sp|Q9MB37|CHS7_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|12644513|sp|Q9MB40|CHS3_IPO -------ISDWNSVFWIAHPGGPAILDQVEDKLGLKPEKLRATRHVLSEY gi|13936397|dbj|BAB47195.1| -------ISDWNSIFWITHPAGRAVLEEIEAKLQLKNEKLADSRHVLSEY gi|13936395|dbj|BAB47194.1| -------ISDWNSIFWITHPAGRAVLEEIEAKLQLKNEKLADSRHVLSEY gi|13936399|dbj|BAB47196.1| -------INDWNSIFWVTHPGGPAILDEVEAKLELKKEKLAISRHVLSEY gi|14150838|gb|AAK54648.1|AF37 GNMSSAC------------------------------------------- gi|12644515|sp|Q9MBB1|CHSY_EQU GNMSSACVLFIMDHMRRMSAQNKLQTTGEGLDWGVLLGFGPGLTVETVLL gi|13774971|gb|AAK39113.1|AF35 GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|13774967|gb|AAK39111.1|AF35 GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|13774975|gb|AAK39115.1|AF35 GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|13774965|gb|AAK39110.1|AF35 GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|13774973|gb|AAK39114.1|AF35 GNMSSACVLFILDEMRKAASNDGLGTTGEGLEWGVLFGLGPGLTIETVAL gi|13774969|gb|AAK39112.1|AF35 GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGV--------------- gi|13919613|gb|AAK33142.1| -------------------------------------------------- gi|13919597|gb|AAK33134.1| -------------------------------------------------- gi|13925890|gb|AAK49457.1| GNMSSACVLFILDEMRKASAKEGLGTTGEGLEWGVLFGFGPGLTVETVVL gi|12644514|sp|Q9MB41|CHS2_IPO GNMSSACVLFILDEMRKASSNAGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|12644512|sp|Q9MB39|CHS4_IPO GNMSSACVLFILDEMRKASSNAGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|12644509|sp|Q9MB36|CHS8_IPO GNMSSACVLFILDEMRKASSNAGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|12644511|sp|Q9MB38|CHS6_IPO GNMSSACVLFILDEMRKASSNAGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|12644510|sp|Q9MB37|CHS7_IPO GNMSSACVLFILDEMRKASSNAGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|12644513|sp|Q9MB40|CHS3_IPO GNMSSACVLFILDEMRKASSNDGLGTTGEGLEWGVLFGFGPGLTIETVVL gi|13936397|dbj|BAB47195.1| GNMSSACVFFIMDKLRKRSLEQRKSTTGDGLEWGVLFGFGPGLTVETVVL gi|13936395|dbj|BAB47194.1| GNMSSACVFFIMDKLRKRSLEQRKSTTGDGLEWGVLFGFGPGLTVETVVL gi|13936399|dbj|BAB47196.1| GNMSSASVFFVMDELRKRSLEEGKSTTGDGLDWGVLFGFGPGLTVEMVVL gi|14150838|gb|AAK54648.1|AF37 ----------- gi|12644515|sp|Q9MBB1|CHSY_EQU KSIRLAC---- gi|13774971|gb|AAK39113.1|AF35 HSVPA------ gi|13774967|gb|AAK39111.1|AF35 HSVPA------ gi|13774975|gb|AAK39115.1|AF35 HSVPA------ gi|13774965|gb|AAK39110.1|AF35 HSVPA------ gi|13774973|gb|AAK39114.1|AF35 HSVPA------ gi|13774969|gb|AAK39112.1|AF35 ----------- gi|13919613|gb|AAK33142.1| ----------- gi|13919597|gb|AAK33134.1| ----------- gi|13925890|gb|AAK49457.1| HSVAT------ gi|12644514|sp|Q9MB41|CHS2_IPO HSVPIKPGPH- gi|12644512|sp|Q9MB39|CHS4_IPO HSVPIKPGPH- gi|12644509|sp|Q9MB36|CHS8_IPO HSVPT------ gi|12644511|sp|Q9MB38|CHS6_IPO HSVLIKPGPH- gi|12644510|sp|Q9MB37|CHS7_IPO HSVPIKPGPH- gi|12644513|sp|Q9MB40|CHS3_IPO HSVPT------ gi|13936397|dbj|BAB47195.1| HSVANKF---- gi|13936395|dbj|BAB47194.1| HSVANKF---- gi|13936399|dbj|BAB47196.1| HSVENKVKSET biopython-1.63/Doc/examples/getgene.py0000755000175000017500000002126612250104543017375 0ustar tratra00000000000000#!/usr/bin/env python # Created: Sun Oct 15 16:16:20 2000 # Last changed: Time-stamp: <01/02/15 09:01:27 thomas> # thomas@cbs.dtu.dk, http://www.cbs.dtu.dk/thomas # File: getgene.py """ Example code to index a non-reduntant protein database of SwissProt + TrEMBL for fast lookup and retrieval. To build the database and index it: cd /opt/bio/data/ wget -N -nd -r -l1 -A'.dat.Z' ftp://expasy.cbr.nrc.ca/databases/sp_tr_nrdb/ zcat *.dat.Z > nr.dat ./getgene.py --index nr.dat setenv PYPHY '/opt/bio/data' To retrieve entries from the command line: ./getgene.py EFTU_ECOLI To use from a python script: from getgene import DB_Index db_index = DB_Index() # retrieve a complete entry: db_index.Get('EFTU_ECOLI') # get organism, lineage and gene db_index.Get_OS_OC_GN('EFTU_ECOLI') """ from __future__ import print_function import os import re import string import sys try: import gdbm # Python 2 except ImportError: from dbm import gnu as gdbm # Python 3 class DB_Index: def __init__(self, open=1): if open: self.Open() def Create(self, infile, outfile): db = gdbm.open(outfile, 'n') fid = open(infile) db['datafile'] = os.path.abspath(infile) while True: line = fid.readline() if not line or not len(line): break if line[:3] == 'ID ': id = string.split(line)[1] start = fid.tell() - len(line) elif line[:3] == 'AC ': acc = string.split(line)[1] if acc[-1] == ';': acc = acc[:-1] elif line[:2] == '//': stop = fid.tell() try: value = '%d %d' % (start, stop) db[id] = value db[acc] = value id, acc, start, stop = None, None, None, None except: print("AARRGGGG %d %d %s %s" % (start, stop, type(start), type(stop))) print("%s %s" % (id, acc)) db.close() fid.close() def Open(self, indexfile=None): if not indexfile: indexfile = os.path.join(os.environ['PYPHY'], 'nr.dat.indexed') self.db = gdbm.open(indexfile) self.datafile = self.db['datafile'] self.fid = open(self.datafile) def Close(self): self.db.close() def Get(self, id): try: values = self.db[id] except: return None start, stop = [int(x) for x in values.split()] self.fid.seek(start) txt = self.fid.read(stop - start) return txt def Get_Organism(self, id): entry = self.Get(id) if not entry: return None for line in string.split(entry, '\n'): if line[0:5] == 'OS ': OS = string.strip(line[5:]) if OS[-1] == ".": OS = OS[0:-1] return OS if line[0:2] == "//": break return OS def FixOS(self, os): os = string.split(os, ',')[0] os = string.split(os, '(')[0] return string.strip(os) def Get_Taxonomy(self, id): entry = self.Get(id) if not entry: return None OC = "" for line in string.split(entry, '\n'): if line[0:5] == 'OC ': OC = OC + string.strip(line[5:]) if OC[-1] == ".": OC = OC[0:-1] if line[0:2] == "//": break return OC def Get_Kingdom(self, id): res = self.Get_Taxonomy(id) #print("%s %s" % (id, res)) if not res: return "U" kd = string.strip(string.split(res, ";")[0]) if kd == "Eubacteria" or kd == "Prokaryota" or kd == "Bacteria": return "B" elif kd == "Eukaryota" or kd == "Eukaryotae": return "E" elif kd == "Archaebacteria" or kd == "Archaea": return "A" elif kd == "Viridae" or kd == "Viruses": return "V" else: print("%s UNKNOWN" % kd) return "U" def Get_Gene(self, id): entry = self.Get(id) if not entry: return None GN = '' for line in string.split(entry, '\n'): if line[0:5] == 'GN ': GN = string.strip(line[5:]) if GN[-1] == ".": GN = GN[0:-1] return GN if line[0:2] == "//": break return GN def Get_OS_OC_GN(self, id): entry = self.Get(id) if not entry: return None, None, None OS, OC, GN = "", "", "" for line in string.split(entry, '\n'): if line[0:5] == 'OS ': OS = string.strip(line[5:]) if OS[-1] == ".": OS = OS[0:-1] if line[0:5] == 'OC ': OC = OC + string.strip(line[5:]) if OC[-1] == ".": OC = OC[0:-1] if line[0:5] == 'GN ': GN = string.strip(line[5:]) if GN[-1] == ".": GN = GN[0:-1] if line[0:2] == "//": break return OS, OC, GN def Get_OS_OC_OG(self, id): entry = self.Get(id) if not entry: return None, None, None OS, OC, OG = "", "", "" for line in string.split(entry, '\n'): if line[0:5] == 'OS ': OS = string.strip(line[5:]) if OS[-1] == ".": OS = OS[0:-1] if line[0:5] == 'OC ': OC = OC + string.strip(line[5:]) if OC[-1] == ".": OC = OC[0:-1] if line[0:5] == 'OG ': OG = string.strip(line[5:]) if OG[-1] == ".": OG = OG[0:-1] if line[0:2] == "//": break return OS, OC, OG def Get_SQ(self, id, fasta=1): entry = self.Get(id) if not entry: return "" SQ = "" record = 0 for line in string.split(entry, '\n'): if record: SQ = SQ + string.strip(line[5:]) if line[0:5] == 'SQ ': record = 1 if line[0:2] == "//": break SQ = re.sub('[ \n]', '', SQ) if fasta: SQ = '>%s\n%s' % (id, re.sub('(.{60})', '\\1\n', SQ)) return SQ def Get_XX(self, id, xx): entry = self.Get(id) if not entry: return "" XX = "" for line in string.split(entry, '\n'): if line[0:5] == '%s ' % xx: XX = XX + string.strip(line[5:]) if XX[-1] == ".": XX = XX[0:-1] if line[0:2] == "//": break return XX def Get_Keywords(self, id): entry = self.Get(id) if not entry: return [] keywords = [] for line in string.split(entry, '\n'): if line[0:5] == 'KW ': for i in string.split(string.strip(line[5:]), ';'): kw = string.strip(i) if len(kw) < 2: continue if kw[-1] == '.': kw = kw[:-1] keywords.append(kw) if line[0:2] == "//": break return keywords def help(exit=0): name = os.path.basename(sys.argv[0]) print('Usage: %s ' % name) print(' or %s --index ' % name) if exit: sys.exit(0) if __name__ == '__main__': pyphy_home = os.environ.get('PYPHY', None) if len(sys.argv) == 1: help(exit=1) db_index = DB_Index(open=0) func = db_index.Get for arg in sys.argv[1:]: if arg == '--index': sys.argv.remove(arg) infile = sys.argv[1] outfile = os.path.basename(infile) + '.indexed' db_index.Create(infile, outfile) sys.exit(0) elif arg[:4] == '-Get': sys.argv.remove(arg) func = getattr(db_index, arg[1:]) elif arg == '-h' or arg == '--help': help(exit=1) db = 'nr.dat' if len(sys.argv) == 2: # shortcut, mostly we use nr.dat so dont bother to name it ids = sys.argv[1:] else: try: db = sys.argv[1] ids = sys.argv[2:] except: help(exit=1) dbfile = os.path.join(pyphy_home, db + '.indexed') db_index.Open(dbfile) for id in ids: #print(db_index.Get(id)) print(func(id)) biopython-1.63/Doc/examples/www_blast.py0000644000175000017500000000317012250104543017757 0ustar tratra00000000000000#!/usr/bin/env python """Example showing how to deal with internet BLAST from Biopython. This code is described in great detail in the BLAST section of the Biopython documentation. """ # standard library from __future__ import print_function try: from StringIO import StringIO # Python 2 except ImportError: from io import StringIO # Python 3 # biopython from Bio import SeqIO from Bio.Blast import NCBIWWW from Bio.Blast import NCBIXML # first get the sequence we want to parse from a FASTA file f_record = next(SeqIO.parse('m_cold.fasta', 'fasta')) print('Doing the BLAST and retrieving the results...') result_handle = NCBIWWW.qblast('blastn', 'nr', f_record.format('fasta')) # save the results for later, in case we want to look at it save_file = open('m_cold_blast.out', 'w') blast_results = result_handle.read() save_file.write(blast_results) save_file.close() print('Parsing the results and extracting info...') # option 1 -- open the saved file to parse it # option 2 -- create a handle from the string and parse it string_result_handle = StringIO(blast_results) b_record = NCBIXML.read(string_result_handle) # now get the alignment info for all e values greater than some threshold E_VALUE_THRESH = 0.1 for alignment in b_record.alignments: for hsp in alignment.hsps: if hsp.expect < E_VALUE_THRESH: print('****Alignment****') print('sequence: %s' % alignment.title) print('length: %i' % alignment.length) print('e value: %f' % hsp.expect) print(hsp.query[0:75] + '...') print(hsp.match[0:75] + '...') print(hsp.sbjct[0:75] + '...') biopython-1.63/Doc/examples/clustal_run.py0000644000175000017500000000400512250104543020277 0ustar tratra00000000000000#!/usr/bin/env python """clustal_run.py Example code to show how to create a clustalw command line, run clustalw and parse the results into an object that can be dealt with easily.""" # standard library from __future__ import print_function import os import sys import subprocess # biopython from Bio.Alphabet import Gapped, IUPAC from Bio.Align.Applications import ClustalwCommandline from Bio import AlignIO from Bio.Align import AlignInfo from Bio.SubsMat import FreqTable # create the command line to run clustalw # this assumes you've got clustalw somewhere on your path, otherwise # you need to pass the full path of the executable to this via cmd="..." cline = ClustalwCommandline(infile='opuntia.fasta', outfile='test.aln') # actually perform the alignment return_code = subprocess.call(str(cline), shell=(sys.platform != "win32")) assert return_code == 0, "Calling ClustalW failed" # Parse the output alignment = AlignIO.read("test.aln", "clustal", alphabet=Gapped(IUPAC.unambiguous_dna)) print(alignment) print('first description: %s' % alignment[0].description) print('first sequence: %s' % alignment[0].seq) # get the length of the alignment print('length %i' % alignment.get_alignment_length()) print(alignment) # print out interesting information about the alignment summary_align = AlignInfo.SummaryInfo(alignment) consensus = summary_align.dumb_consensus() print('consensus %s' % consensus) my_pssm = summary_align.pos_specific_score_matrix(consensus, chars_to_ignore=['N']) print(my_pssm) expect_freq = { 'A': .3, 'G': .2, 'T': .3, 'C': .2} freq_table_info = FreqTable.FreqTable(expect_freq, FreqTable.FREQ, IUPAC.unambiguous_dna) info_content = summary_align.information_content(5, 30, chars_to_ignore=['N'], e_freq_table=freq_table_info) print("relative info content: %f" % info_content) biopython-1.63/Doc/examples/my_blast.xml0000644000175000017500000041463212250104543017741 0ustar tratra00000000000000 blastn BLASTN 2.2.27+ Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), "Gapped BLAST and PSI-BLAST: a new generation of protein database search programs", Nucleic Acids Res. 25:3389-3402. refseq_rna 42291 mystery_seq 61 10 2 -3 5 2 L;m; 1 42291 mystery_seq 61 1 gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 520b (MIR520B), microRNA NR_030195 61 1 111.292 122 4.91307e-23 1 61 1 61 1 1 61 61 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 2 gi|301171311|ref|NR_035856.1| Pan troglodytes microRNA mir-520b (MIR520B), microRNA NR_035856 60 1 109.488 120 1.71483e-22 2 61 1 60 1 1 60 60 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 3 gi|270133242|ref|NR_032573.1| Macaca mulatta microRNA mir-519a (MIR519A), microRNA NR_032573 85 1 102.275 112 2.54503e-20 1 61 13 73 1 1 59 59 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCGCTTTCTGTGGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG ||||||| ||||||||||||||||| ||||||||||||||||||||||||||||||||||| 4 gi|301171322|ref|NR_035857.1| Pan troglodytes microRNA mir-520c (MIR520C), microRNA NR_035857 86 1 100.472 110 8.88303e-20 2 61 14 73 1 1 58 58 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG |||||| |||||||| |||||||||||||||||||||||||||||||||||||||||||| 2 55.3874 60 3.31332e-06 1 60 73 14 1 -1 48 48 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTAGAGG ||||||| | |||||| |||||| || | | | | || ||||||||||||| | |||||| 5 gi|301171267|ref|NR_035851.1| Pan troglodytes microRNA mir-519b (MIR519B), microRNA NR_035851 80 1 100.472 110 8.88303e-20 1 60 10 69 1 1 58 58 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCATCCTTTTAGAGG ||||||| ||||||||||||||||||||||||||||||||||||||| |||||||||||| 6 gi|262205330|ref|NR_030198.1| Homo sapiens microRNA 520c (MIR520C), microRNA NR_030198 87 1 100.472 110 8.88303e-20 2 61 15 74 1 1 58 58 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG |||||| |||||||| |||||||||||||||||||||||||||||||||||||||||||| 2 55.3874 60 3.31332e-06 1 60 74 15 1 -1 48 48 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTAGAGG ||||||| | |||||| |||||| || | | | | || ||||||||||||| | |||||| 7 gi|262205302|ref|NR_030191.1| Homo sapiens microRNA 519b (MIR519B), microRNA NR_030191 81 1 100.472 110 8.88303e-20 1 60 11 70 1 1 58 58 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCATCCTTTTAGAGG ||||||| ||||||||||||||||||||||||||||||||||||||| |||||||||||| 8 gi|301171259|ref|NR_035850.1| Pan troglodytes microRNA mir-519a (MIR519A), microRNA NR_035850 86 1 98.6682 108 3.10048e-19 1 59 13 71 1 1 57 57 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAGGAAAGTGCATCCTTTTAGAG |||||||||||||||||||||||||||||||||||||| |||||||| ||||||||||| 9 gi|262205451|ref|NR_030222.1| Homo sapiens microRNA 519a-2 (MIR519A2), microRNA NR_030222 87 1 98.6682 108 3.10048e-19 1 59 14 72 1 1 57 57 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAGGAAAGTGCATCCTTTTAGAG |||||||||||||||||||||||||||||||||||||| |||||||| ||||||||||| 10 gi|301171447|ref|NR_035871.1| Pan troglodytes microRNA mir-526b (MIR526B), microRNA NR_035871 82 1 95.0615 104 3.77716e-18 1 60 11 70 1 1 57 57 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTTGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG |||||| |||||||| ||||||||||||||||||||||||||||||||||||||||||| 2 49.9773 54 0.000140886 2 61 70 11 1 -1 47 47 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCAAGAGGG |||||| | |||||| |||||| || | | | | || ||||||||||||| | |||||| 11 gi|301171276|ref|NR_035852.1| Pan troglodytes microRNA mir-519c (MIR519C), microRNA NR_035852 86 1 95.0615 104 3.77716e-18 1 60 13 72 1 1 57 57 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCATCTTTTTAGAGG ||||||| ||||||||||||||||||||||||||||||||||||||| || ||||||||| 12 gi|262205290|ref|NR_030188.1| Homo sapiens microRNA 519c (MIR519C), microRNA NR_030188 87 1 95.0615 104 3.77716e-18 1 60 14 73 1 1 57 57 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCATCTTTTTAGAGG ||||||| ||||||||||||||||||||||||||||||||||||||| || ||||||||| 13 gi|301171354|ref|NR_035860.1| Pan troglodytes microRNA mir-520f (MIR520F), microRNA NR_035860 86 1 93.2581 102 1.31836e-17 1 61 13 73 1 1 57 57 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAAAGGGAAGCGCTTTCTGTGGTCAGAAAGAAAAGCAAGTGCTTCCTTTTAGAGGG ||||||| ||||||||||||||||| ||| |||||||||| |||||||||||||||||||| 14 gi|262205281|ref|NR_030186.1| Homo sapiens microRNA 520f (MIR520F), microRNA NR_030186 87 1 93.2581 102 1.31836e-17 1 61 14 74 1 1 57 57 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAAAGGGAAGCGCTTTCTGTGGTCAGAAAGAAAAGCAAGTGCTTCCTTTTAGAGGG ||||||| ||||||||||||||||| ||| |||||||||| |||||||||||||||||||| 15 gi|262205298|ref|NR_030190.1| Homo sapiens microRNA 526b (MIR526B), microRNA NR_030190 83 1 91.4547 100 4.60152e-17 1 60 12 71 1 1 56 56 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTTGAGGGAAGCACTTTCTGTTGTCTGAAAGAAGAGAAAGTGCTTCCTTTTAGAGG |||||| |||||||| |||||||||||||||||||| |||||||||||||||||||||| 2 49.9773 54 0.000140886 2 61 71 12 1 -1 47 47 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAAGGAAGCACTTTCTCTTCTTTCAGACAACAGAAAGTGCTTCCCTCAAGAGGG |||||| | |||||| |||||| || | | | | || ||||||||||||| | |||||| 16 gi|301171394|ref|NR_035865.1| Pan troglodytes microRNA mir-522 (MIR522), microRNA NR_035865 86 1 89.6514 98 1.60609e-16 1 59 13 71 1 1 55 55 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAATGGTTCCCTTTAGAG ||||||| ||||||||||||||||||||||||||||||||||| || |||| ||||||| 17 gi|262205429|ref|NR_030218.1| Homo sapiens microRNA 519a-1 (MIR519A1), microRNA NR_030218 85 1 89.6514 98 1.60609e-16 3 59 15 71 1 1 54 54 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAGGAAAGTGCATCCTTTTAGAG ||||| |||||||||||||||||||||||||||||| |||||||| ||||||||||| 18 gi|262205423|ref|NR_030217.1| Homo sapiens microRNA 522 (MIR522), microRNA NR_030217 87 1 89.6514 98 1.60609e-16 1 59 14 72 1 1 55 55 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAATGGTTCCCTTTAGAG ||||||| ||||||||||||||||||||||||||||||||||| || |||| ||||||| 19 gi|301171401|ref|NR_035866.1| Pan troglodytes microRNA mir-523 (MIR523), microRNA NR_035866 79 1 87.848 96 5.6058e-16 1 61 6 66 1 1 56 56 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAACGCGCTTCCCTATAGAGGG ||||||| |||||||||||||||||||||||||||||||||| | |||||| | ||||||| 20 gi|270133247|ref|NR_032574.1| Macaca mulatta microRNA mir-519b (MIR519B), microRNA NR_032574 81 1 87.848 96 5.6058e-16 1 61 11 71 1 1 56 56 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTGGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAACGTGCATCCCTTTAGAGGG |||||| |||||||||||||||||||||||||||||||||| |||| ||| ||||||||| 21 gi|262205309|ref|NR_030193.1| Homo sapiens microRNA 523 (MIR523), microRNA NR_030193 87 1 87.848 96 5.6058e-16 1 61 14 74 1 1 56 56 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAACGCGCTTCCCTATAGAGGG ||||||| |||||||||||||||||||||||||||||||||| | |||||| | ||||||| 22 gi|270132717|ref|NR_032716.1| Macaca mulatta microRNA mir-526b (MIR526B), microRNA NR_032716 83 1 86.0446 94 1.95662e-15 1 60 12 71 1 1 55 55 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTTGAGGGAAGCACTTTCTGTTGTCTGAATAAAAAGAAAGTGCTTCCTTTTAGAGG |||||| |||||||| |||||||||||||||| ||||||||||||||||||||||||| 2 46.3705 50 0.00171634 2 61 71 12 1 -1 46 46 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAAGGAAGCACTTTCTTTTTATTCAGACAACAGAAAGTGCTTCCCTCAAGAGGG |||||| | |||||| |||||| || | | | || ||||||||||||| | |||||| 23 gi|301171437|ref|NR_035870.1| Pan troglodytes microRNA mir-526a-2 (MIR526A-2), microRNA NR_035870 68 1 84.2413 92 6.82927e-15 1 61 4 64 1 1 55 55 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAAGAACATGCATCCTTTCAGAGGG ||||||| |||||||| ||||||||||||||||||||||||| ||| |||||| |||||| 2 39.157 42 0.254728 1 61 64 4 1 -1 45 45 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTGAAAGGATGCATGTTCTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTAGAGGG |||||| | ||| || |||| || | | | | || ||||||||||||| | ||||||| 24 gi|270133306|ref|NR_032587.1| Macaca mulatta microRNA mir-523a (MIR523A), microRNA NR_032587 87 1 84.2413 92 6.82927e-15 1 61 14 74 1 1 55 55 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCACTTTCTGTTGTCTGGAAGAAAAGAATGCGCTTCCCTTTAGAGGG ||||||| |||||||| |||||||||||||| |||||||||| | |||||| ||||||||| 2 57.1907 62 9.49283e-07 1 61 74 14 1 -1 49 49 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAAAGGGAAGCGCATTCTTTTCTTCCAGACAACAGAAAGTGCTTCCCTCTAGAGGG ||||||| |||||||||| |||| || | | | || ||||||||||||| | ||||||| 25 gi|301171428|ref|NR_035869.1| Pan troglodytes microRNA mir-526a-1 (MIR526A-1), microRNA NR_035869 84 1 82.4379 90 2.38365e-14 1 60 12 71 1 1 54 54 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCACTTTCTGTTGCTTGAAAGAAGAGAAAGCGCTTCCTTTTAGAGG ||||||| |||||||| |||||||||| |||||||| |||||| ||||||||||||||| 2 58.9941 64 2.71974e-07 2 61 71 12 1 -1 49 49 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAAGGAAGCGCTTTCTCTTCTTTCAAGCAACAGAAAGTGCTTCCCTCTAGAGGG |||||| | ||||||||||||| || | | || || ||||||||||||| | ||||||| 26 gi|301171211|ref|NR_035845.1| Pan troglodytes microRNA mir-518b (MIR518B), microRNA NR_035845 82 1 82.4379 90 2.38365e-14 1 60 11 70 1 1 54 54 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCCAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAACAAAGCGCTCCCCTTTAGAGG ||||| | ||||||||||||||||||||||||||||||| |||| ||| || |||||||| 27 gi|301171153|ref|NR_035838.1| Pan troglodytes microRNA mir-516a-2 (MIR516A-2), microRNA NR_035838 89 1 82.4379 90 2.38365e-14 12 61 27 76 1 1 48 48 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||||||||||||||||||||||||||||||| |||||| 2 42.7638 46 0.0209094 1 53 76 24 1 -1 41 41 0 53 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTT CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCTTT |||||| | |||||| |||||| || | | | | || |||||||||||| || 28 gi|301171146|ref|NR_035837.1| Pan troglodytes microRNA mir-516a-1 (MIR516A-1), microRNA NR_035837 89 1 82.4379 90 2.38365e-14 12 61 27 76 1 1 48 48 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||||||||||||||||||||||||||||||| |||||| 2 42.7638 46 0.0209094 1 53 76 24 1 -1 41 41 0 53 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTT CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCTTT |||||| | |||||| |||||| || | | | | || |||||||||||| || 29 gi|270133254|ref|NR_032575.1| Macaca mulatta microRNA mir-519c (MIR519C), microRNA NR_032575 87 1 82.4379 90 2.38365e-14 1 60 14 73 1 1 54 54 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAAGGAAGCACTTTCTGTTGTTTGAAAGAAAAGAAAGTGCATCATTTTAGAGG ||||||| | |||||| ||||||||||| |||||||||||||||||| || ||||||||| 2 55.3874 60 3.31332e-06 2 61 73 14 1 -1 48 48 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAATGATGCACTTTCTTTTCTTTCAAACAACAGAAAGTGCTTCCTTCTAGAGGG |||||| | || || |||||| || | | ||| || ||||||||||||||| ||||||| 30 gi|262205445|ref|NR_030221.1| Homo sapiens microRNA 516a-2 (MIR516A2), microRNA NR_030221 90 1 82.4379 90 2.38365e-14 12 61 28 77 1 1 48 48 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||||||||||||||||||||||||||||||| |||||| 2 42.7638 46 0.0209094 1 53 77 25 1 -1 41 41 0 53 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTT CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCTTT |||||| | |||||| |||||| || | | | | || |||||||||||| || 31 gi|262205441|ref|NR_030220.1| Homo sapiens microRNA 516a-1 (MIR516A1), microRNA NR_030220 90 1 82.4379 90 2.38365e-14 12 61 28 77 1 1 48 48 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||||||||||||||||||||||||||||||| |||||| 2 42.7638 46 0.0209094 1 53 77 25 1 -1 41 41 0 53 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTT CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCAGACAACAGAAAGTGCTTCTTT |||||| | |||||| |||||| || | | | | || |||||||||||| || 32 gi|262205325|ref|NR_030197.1| Homo sapiens microRNA 526a-1 (MIR526A1), microRNA NR_030197 85 1 82.4379 90 2.38365e-14 1 60 13 72 1 1 54 54 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCACTTTCTGTTGCTTGAAAGAAGAGAAAGCGCTTCCTTTTAGAGG ||||||| |||||||| |||||||||| |||||||| |||||| ||||||||||||||| 2 58.9941 64 2.71974e-07 2 61 72 13 1 -1 49 49 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAAGGAAGCGCTTTCTCTTCTTTCAAGCAACAGAAAGTGCTTCCCTCTAGAGGG |||||| | ||||||||||||| || | | || || ||||||||||||| | ||||||| 33 gi|262205321|ref|NR_030196.1| Homo sapiens microRNA 518b (MIR518B), microRNA NR_030196 83 1 82.4379 90 2.38365e-14 1 60 12 71 1 1 54 54 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCCAGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAACAAAGCGCTCCCCTTTAGAGG ||||| | ||||||||||||||||||||||||||||||| |||| ||| || |||||||| 34 gi|301171236|ref|NR_035848.1| Pan troglodytes microRNA mir-518e (MIR518E), microRNA NR_035848 87 1 80.6345 88 8.31975e-14 1 59 13 71 1 1 53 53 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCGCTTTCTGTTGGCTAAAAGAAAAGAAAGCGCTTCCCTTCAGAG ||||||| ||||||||||||||||||| || ||||||||||||| |||||| || |||| 2 48.1739 52 0.000491741 3 61 71 13 1 -1 46 46 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCTGAAGGGAAGCGCTTTCTTTTCTTTTAGCCAACAGAAAGCGCTTCCCTCTAGAGGG |||| ||||||||||||||| || | | | || |||||| |||||| | ||||||| 35 gi|262205383|ref|NR_030209.1| Homo sapiens microRNA 518e (MIR518E), microRNA NR_030209 88 1 80.6345 88 8.31975e-14 1 59 14 72 1 1 53 53 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCGCTTTCTGTTGGCTAAAAGAAAAGAAAGCGCTTCCCTTCAGAG ||||||| ||||||||||||||||||| || ||||||||||||| |||||| || |||| 2 48.1739 52 0.000491741 3 61 72 14 1 -1 46 46 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCTGAAGGGAAGCGCTTTCTTTTCTTTTAGCCAACAGAAAGCGCTTCCCTCTAGAGGG |||| ||||||||||||||| || | | | || |||||| |||||| | ||||||| 36 gi|301171342|ref|NR_035859.1| Pan troglodytes microRNA mir-520e (MIR520E), microRNA NR_035859 86 1 78.8312 86 2.90388e-13 1 61 13 73 1 1 54 54 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCAAGATGGAAGCAGTTTCTGTTGTCTGAAAGGAAAGAAAGTGCTTCCTTTTTGAGGG ||||| | | |||||| ||||||||||||||||| ||||||||||||||||||| ||||| 37 gi|262205265|ref|NR_030183.1| Homo sapiens microRNA 520e (MIR520E), microRNA NR_030183 87 1 78.8312 86 2.90388e-13 1 61 14 74 1 1 54 54 0 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCAAGATGGAAGCAGTTTCTGTTGTCTGAAAGGAAAGAAAGTGCTTCCTTTTTGAGGG ||||| | | |||||| ||||||||||||||||| ||||||||||||||||||| ||||| 38 gi|301171247|ref|NR_035849.1| Pan troglodytes microRNA mir-518f (MIR518F), microRNA NR_035849 86 1 77.0278 84 1.01355e-12 1 60 13 72 1 1 53 53 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCACTTTCTCTTGTCTAAAAGAAAAGAAAGCGCTTCTCTTTAGAGG ||||||| |||||||| |||||| |||||| ||||||||||||| ||||| |||||||| 2 58.9941 64 2.71974e-07 2 61 72 13 1 -1 49 49 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAGAGAAGCGCTTTCTTTTCTTTTAGACAAGAGAAAGTGCTTCCCTCTAGAGGG |||||| || |||||||||||| || | | | | || ||||||||||||| | ||||||| 39 gi|270133223|ref|NR_032569.1| Macaca mulatta microRNA mir-518c (MIR518C), microRNA NR_032569 101 1 77.0278 84 1.01355e-12 3 59 25 81 1 1 51 51 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTGGAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAACAAAGCGCTTCTCTTTAGAG |||| ||||||||||||||||||||||||||||||| |||| ||||| ||||||| 40 gi|262205313|ref|NR_030194.1| Homo sapiens microRNA 518f (MIR518F), microRNA NR_030194 87 1 77.0278 84 1.01355e-12 1 60 14 73 1 1 53 53 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCTAGAGGGAAGCACTTTCTCTTGTCTAAAAGAAAAGAAAGCGCTTCTCTTTAGAGG ||||||| |||||||| |||||| |||||| ||||||||||||| ||||| |||||||| 2 58.9941 64 2.71974e-07 2 61 73 14 1 -1 49 49 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAGAGAAGCGCTTTCTTTTCTTTTAGACAAGAGAAAGTGCTTCCCTCTAGAGGG |||||| || |||||||||||| || | | | | || ||||||||||||| | ||||||| 41 gi|301171225|ref|NR_035847.1| Pan troglodytes microRNA mir-518d (MIR518D), microRNA NR_035847 86 1 75.2244 82 3.53765e-12 1 59 13 71 1 1 52 52 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAACCAAAGCGCTTCCCTTTGGAG ||||||| |||||||| ||||||||||||||||||||| |||| |||||| ||| ||| 2 48.1739 52 0.000491741 3 61 71 13 1 -1 46 46 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCCAAAGGGAAGCGCTTTGGTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTAGAGGG ||| | ||||||||||||| || | | | | || ||||||||||||| | ||||||| 42 gi|270133232|ref|NR_032571.1| Macaca mulatta microRNA mir-518e (MIR518E), microRNA NR_032571 87 1 75.2244 82 3.53765e-12 1 59 14 72 1 1 52 52 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCGATTTCTGTGATCTGAAAGAAAAGAAAATGGTTCCCTTTAGAG ||||||| ||||||||| ||||||| |||||||||||||||| || |||| ||||||| 43 gi|262205392|ref|NR_030211.1| Homo sapiens microRNA 518d (MIR518D), microRNA NR_030211 87 1 75.2244 82 3.53765e-12 1 59 14 72 1 1 52 52 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAACCAAAGCGCTTCCCTTTGGAG ||||||| |||||||| ||||||||||||||||||||| |||| |||||| ||| ||| 2 48.1739 52 0.000491741 3 61 72 14 1 -1 46 46 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCCAAAGGGAAGCGCTTTGGTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTAGAGGG ||| | ||||||||||||| || | | | | || ||||||||||||| | ||||||| 44 gi|301171300|ref|NR_035855.1| Pan troglodytes microRNA mir-520a (MIR520A), microRNA NR_035855 84 1 73.4211 80 1.23476e-11 1 58 12 69 1 1 51 51 0 58 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGA CCCTCCAGAGGGAAGTACTTTCTGTTGTCTGAGAGAAAAGAAAGTGCTTCCCTTTGGA ||||| | ||||||| ||||||||||||||| |||||||||||||||||| ||| || 45 gi|301171161|ref|NR_035839.1| Pan troglodytes microRNA mir-516b-1 (MIR516B-1), microRNA NR_035839 89 1 73.4211 80 1.23476e-11 12 61 27 76 1 1 46 46 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTTTGTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||| | ||||||||||||||||||||||||| |||||| 2 40.9604 44 0.0729808 1 50 76 27 1 -1 39 39 0 50 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTC CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCACAAAACAGAAAGTGCTTC |||||| | |||||| |||||| || | | | | || |||||||||||| 46 gi|270133259|ref|NR_032576.1| Macaca mulatta microRNA mir-519d (MIR519D), microRNA NR_032576 91 1 73.4211 80 1.23476e-11 1 59 14 76 1 1 54 54 4 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGCACTTTCTGTTTGTTGTCTGAGAGAAAACAAAGTGCTTCCTTTTAGAG ||||| | |||||||| ||||||||| |||||| |||||| ||||||||||||||||||| 2 46.3705 50 0.00171634 3 61 76 14 1 -1 49 49 4 63 CTCTACAGGGAAGCGCTTTCTGTTGTCTGA---AAGAAA-AGAAAGTGCTTCCTTTTAGAGGG CTCTAAAAGGAAGCACTTTGTTTTCTCTCAGACAACAAACAGAAAGTGCTTCCCTTTGGAGGG ||||| | |||||| |||| | || ||| | || ||| ||||||||||||| ||| ||||| 47 gi|270133218|ref|NR_032568.1| Macaca mulatta microRNA mir-518b (MIR518B), microRNA NR_032568 83 1 73.4211 80 1.23476e-11 1 60 12 71 1 1 52 52 0 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGG CCCTCCAGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAGCAAAGCGCTCCCCTTTAGAGG ||||| | |||||||| ||||||||||||||||||||| |||| ||| || |||||||| 2 46.3705 50 0.00171634 2 61 71 12 1 -1 46 46 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTAAAGGGGAGCGCTTTGCTTTCTTTCAGACAACAGAAAGTGCTTCCCTCTGGAGGG |||||| |||| |||||||| || | | | | || ||||||||||||| | | ||||| 48 gi|270132725|ref|NR_032718.1| Macaca mulatta microRNA mir-516 (MIR516), microRNA NR_032718 90 1 73.4211 80 1.23476e-11 12 61 28 77 1 1 46 46 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTTTGTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||| | ||||||||||||||||||||||||| |||||| 2 40.9604 44 0.0729808 1 50 77 28 1 -1 39 39 0 50 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTC CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCACAAAACAGAAAGTGCTTC |||||| | |||||| |||||| || | | | | || |||||||||||| 49 gi|262205396|ref|NR_030212.1| Homo sapiens microRNA 516b-1 (MIR516B1), microRNA NR_030212 90 1 73.4211 80 1.23476e-11 12 61 28 77 1 1 46 46 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTTTGTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| ||||||||| | ||||||||||||||||||||||||| |||||| 2 40.9604 44 0.0729808 1 50 77 28 1 -1 39 39 0 50 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTC CCCTCTGAAAGGAAGCACTTTCTTTTCTTTCACAAAACAGAAAGTGCTTC |||||| | |||||| |||||| || | | | | || |||||||||||| 50 gi|262205294|ref|NR_030189.1| Homo sapiens microRNA 520a (MIR520A), microRNA NR_030189 85 1 73.4211 80 1.23476e-11 1 58 13 70 1 1 51 51 0 58 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGA CCCTCCAGAGGGAAGTACTTTCTGTTGTCTGAGAGAAAAGAAAGTGCTTCCCTTTGGA ||||| | ||||||| ||||||||||||||| |||||||||||||||||| ||| || 51 gi|301171602|ref|NR_035634.1| Pan troglodytes microRNA mir-1283 (MIR1283), microRNA NR_035634 86 1 71.6177 78 4.30974e-11 3 61 12 72 1 1 53 53 2 61 CTCTACA--GGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCTACAAAGGAAAGCGCTTTCTGTTGTCAGAAAGAAGAGAAAGCGCTTCCCTTTTGAGGG ||||||| || ||||||||||||||||| ||||||| |||||| |||||| ||| ||||| 2 44.5672 48 0.00599063 1 59 72 12 1 -1 48 48 2 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGC-TTCCTTT-TAGAG CCCTCAAAAGGGAAGCGCTTTCTCTTCTTTCTGACAACAGAAAGCGCTTTCCTTTGTAGAG ||||| | ||||||||||||||| || | | | || |||||| || ||||||| ||||| 52 gi|301171454|ref|NR_035872.1| Pan troglodytes microRNA mir-527 (MIR527), microRNA NR_035872 86 1 71.6177 78 4.30974e-11 9 55 21 67 1 1 44 44 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCCCTTTCTGTTGTCTAAAAGAAAAGAAAGTGCTTCCCTTT |||||||| ||||||||||||| |||||||||||||||||||| ||| 53 gi|301171333|ref|NR_035858.1| Pan troglodytes microRNA mir-520d (MIR520D), microRNA NR_035858 86 1 71.6177 78 4.30974e-11 3 61 13 73 1 1 53 53 2 61 CTCTACA--GGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCTACAAAGGGAAGCCCTTTCTGTTGTCTAAAAGAAAAGAAAGTGCTTCTCTTTGGTGGG ||||||| ||||||| ||||||||||||| ||||||||||||||||||| ||| | ||| 54 gi|301171291|ref|NR_035854.1| Pan troglodytes microRNA mir-519e (MIR519E), microRNA NR_035854 86 1 71.6177 78 4.30974e-11 3 59 15 71 1 1 50 50 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCCAAAAGGGAGCACTTTCTGTTGTCTGAAAGAAAACAAAGTGCCTCCTTTTAGAG ||| | | || ||| |||||||||||||||||||||| ||||||| ||||||||||| 55 gi|301171219|ref|NR_035846.1| Pan troglodytes microRNA mir-518c (MIR518C), microRNA NR_035846 100 1 71.6177 78 4.30974e-11 3 59 24 80 1 1 50 50 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTGGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAACAAAGCGCTTCTCTTTAGAG |||| |||||||| |||||||||||||||||||||| |||| ||||| ||||||| 2 44.5672 48 0.00599063 3 59 80 24 1 -1 44 44 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTAAAGAGAAGCGCTTTGTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCCAGAG ||||| || |||||||||| | || | | | | || ||||||||||||| | |||| 56 gi|269847477|ref|NR_031696.1| Homo sapiens microRNA 1283-2 (MIR1283-2), microRNA NR_031696 87 1 71.6177 78 4.30974e-11 4 59 14 71 1 1 51 51 2 58 TCTACA--GGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG TCTACAAAGGAAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAATCGCTTCCCTTTGGAG |||||| || ||||||||||||||||||||||||||||||| |||||| ||| ||| 57 gi|262205435|ref|NR_030219.1| Homo sapiens microRNA 527 (MIR527), microRNA NR_030219 85 1 71.6177 78 4.30974e-11 9 55 20 66 1 1 44 44 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCCCTTTCTGTTGTCTAAAAGAAAAGAAAGTGCTTCCCTTT |||||||| ||||||||||||| |||||||||||||||||||| ||| 58 gi|262205336|ref|NR_030199.1| Homo sapiens microRNA 518c (MIR518C), microRNA NR_030199 101 1 71.6177 78 4.30974e-11 3 59 25 81 1 1 50 50 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTGGAGGGAAGCACTTTCTGTTGTCTGAAAGAAAACAAAGCGCTTCTCTTTAGAG |||| |||||||| |||||||||||||||||||||| |||| ||||| ||||||| 2 44.5672 48 0.00599063 3 59 81 25 1 -1 44 44 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCTAAAGAGAAGCGCTTTGTTTTCTTTCAGACAACAGAAAGTGCTTCCCTCCAGAG ||||| || |||||||||| | || | | | | || ||||||||||||| | |||| 59 gi|270133264|ref|NR_032577.1| Macaca mulatta microRNA mir-520a (MIR520A), microRNA NR_032577 85 1 69.8143 76 1.50425e-10 1 58 13 70 1 1 50 50 0 58 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGA CCCTCCAGAGGGAAGTATTTTCTGTTGTCTGAAGGAAAAGAAAGTGCTTCCCTTTGGA ||||| | ||||||| ||||||||||||||| ||||||||||||||||| ||| || 60 gi|269846946|ref|NR_031573.1| Homo sapiens microRNA 1283-1 (MIR1283-1), microRNA NR_031573 87 1 69.8143 76 1.50425e-10 4 61 14 73 1 1 52 52 2 60 TCTACA--GGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG TCTACAAAGGAAAGCGCTTTCTGTTGTCAGAAAGAAGAGAAAGCGCTTCCCTTTTGAGGG |||||| || ||||||||||||||||| ||||||| |||||| |||||| ||| ||||| 2 42.7638 46 0.0209094 1 58 73 14 1 -1 47 47 2 60 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGC-TTCCTTT-TAGA CCCTCAAAAGGGAAGCGCTTTCTCTTCTTTCTGACAACAGAAAGCGCTTTCCTTTGTAGA ||||| | ||||||||||||||| || | | | || |||||| || ||||||| |||| 61 gi|262205358|ref|NR_030204.1| Homo sapiens microRNA 520d (MIR520D), microRNA NR_030204 87 1 69.8143 76 1.50425e-10 4 61 15 74 1 1 52 52 2 60 TCTACA--GGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG TCTACAAAGGGAAGCCCTTTCTGTTGTCTAAAAGAAAAGAAAGTGCTTCTCTTTGGTGGG |||||| ||||||| ||||||||||||| ||||||||||||||||||| ||| | ||| 62 gi|301171206|ref|NR_035844.1| Pan troglodytes microRNA mir-518a (MIR518A), microRNA NR_035844 86 1 68.0109 74 5.25034e-10 9 55 21 67 1 1 43 43 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCCCTTTCTGTTGTCTAAAAGAAAAGAAAGCGCTTCCCTTT |||||||| ||||||||||||| ||||||||||||| |||||| ||| 2 44.5672 48 0.00599063 9 55 65 19 1 -1 38 38 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCGCTTTCTTTTCTTTTAGACAACAGAAAGGGCTTCCCTTT ||||||||||||||| || | | | | || |||||| |||||| ||| 63 gi|301171169|ref|NR_035840.1| Pan troglodytes microRNA mir-516b-2 (MIR516B-2), microRNA NR_035840 89 1 68.0109 74 5.25034e-10 12 61 27 76 1 1 45 45 0 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTGTGTTTTGTGAAAGAAAAGAAAGTGCTTCCTTTCAGAGGG ||||| |||| |||| | ||||||||||||||||||||||||| |||||| 64 gi|262205387|ref|NR_030210.1| Homo sapiens microRNA 518a-1 (MIR518A1), microRNA NR_030210 85 1 68.0109 74 5.25034e-10 9 55 20 66 1 1 43 43 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCCCTTTCTGTTGTCTGAAAGAAGAGAAAGCGCTTCCCTTT |||||||| |||||||||||||||||||| |||||| |||||| ||| 2 44.5672 48 0.00599063 9 55 64 18 1 -1 38 38 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCGCTTTCTCTTCTTTCAGACAACAGAAAGGGCTTCCCTTT ||||||||||||||| || | | | | || |||||| |||||| ||| 65 gi|301171381|ref|NR_035863.1| Pan troglodytes microRNA mir-521-1 (MIR521-1), microRNA NR_035863 86 1 66.2076 72 1.83255e-09 1 59 13 71 1 1 50 50 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGAACTTTCTGTTGTCTAAAAGAAAAGAACGCACTTCCCTTTAGAG ||||| | ||||||| ||||||||||||| ||||||||||| | ||||| ||||||| 66 gi|270133201|ref|NR_032565.1| Macaca mulatta microRNA mir-517 (MIR517), microRNA NR_032565 86 1 66.2076 72 1.83255e-09 1 59 13 71 1 1 50 50 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGATGGAAGCACTGTCTGTGGTCTAAAAGAAAAGATCGTGCATCCTTTTAGAG ||||||| | |||||| || ||||| |||| |||||||||| |||| ||||||||||| 67 gi|262205417|ref|NR_030216.1| Homo sapiens microRNA 521-1 (MIR521-1), microRNA NR_030216 87 1 66.2076 72 1.83255e-09 1 59 14 72 1 1 50 50 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGAACTTTCTGTTGTCTAAAAGAAAAGAACGCACTTCCCTTTAGAG ||||| | ||||||| ||||||||||||| ||||||||||| | ||||| ||||||| 68 gi|270133214|ref|NR_032567.1| Macaca mulatta microRNA mir-518a (MIR518A), microRNA NR_032567 87 1 64.4042 70 6.39622e-09 1 54 14 68 1 1 48 48 1 55 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTC-CTTT CCCTACAAAGGGAAGCCCTTTCTGTTGTCTAAACGAAAAGAAAGTGCTTCTCTTT |||| | |||||||| ||||||||||||| || |||||||||||||||| |||| 69 gi|262205407|ref|NR_030214.1| Homo sapiens microRNA 517c (MIR517C), microRNA NR_030214 95 1 64.4042 70 6.39622e-09 1 59 19 75 1 1 50 50 2 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGATGGAAGCACTGTCTGTTGTCT--AAGAAAAGATCGTGCATCCTTTTAGAG ||||||| | |||||| || |||||||||| ||||||||| |||| ||||||||||| 70 gi|262205377|ref|NR_030208.1| Homo sapiens microRNA 526a-2 (MIR526A2), microRNA NR_030208 65 1 64.4042 70 6.39622e-09 1 61 5 61 1 1 51 51 4 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCCTCTAGAGGGAAGCACTTTCTGTTG----AAAGAAAAGAACATGCATCCTTTCAGAGGG ||||||| |||||||| |||||||||| ||||||||||| ||| |||||| |||||| 71 gi|270133311|ref|NR_032588.1| Macaca mulatta microRNA mir-523b (MIR523B), microRNA NR_032588 89 1 62.6008 68 2.2325e-08 1 59 14 74 1 1 51 51 2 61 CCCTCTACAGGGAAGCGCTTTCTGTTGTCT--GAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGCGAAGCGCTTTCTGTTGGCTAGAAAAGAATAGGAAGCGCTTCCCTTTAGAG ||||||| || |||||||||||||||| || |||||| || ||| |||||| ||||||| 2 40.9604 44 0.0729808 3 61 74 14 1 -1 46 46 2 61 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAG--AAAAGAAAGTGCTTCCTTTTAGAGGG CTCTAAAGGGAAGCGCTTCCTATTCTTTTCTAGCCAACAGAAAGCGCTTCGCTCTAGAGGG ||||| |||||||||||| || || | | || || |||||| ||||| | ||||||| 72 gi|270133297|ref|NR_032585.1| Macaca mulatta microRNA mir-521 (MIR521), microRNA NR_032585 87 1 62.6008 68 2.2325e-08 1 59 14 72 1 1 49 49 0 59 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGTACTTTCTGTTGTCTAAAAGAAAAGAACGCACTTCCCTTTGGAG ||||| | ||||||| ||||||||||||| ||||||||||| | ||||| ||| ||| 73 gi|262205401|ref|NR_030213.1| Homo sapiens microRNA 518a-2 (MIR518A2), microRNA NR_030213 87 1 62.6008 68 2.2325e-08 9 55 22 68 1 1 42 42 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCCCTTTCTGTTGTCTAAAAGAAGAGAAAGCGCTTCCCTTT |||||||| ||||||||||||| |||||| |||||| |||||| ||| 2 44.5672 48 0.00599063 9 55 66 20 1 -1 38 38 0 47 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT AGGGAAGCGCTTTCTCTTCTTTTAGACAACAGAAAGGGCTTCCCTTT ||||||||||||||| || | | | | || |||||| |||||| ||| 74 gi|301171372|ref|NR_035862.1| Pan troglodytes microRNA mir-520h (MIR520H), microRNA NR_035862 89 1 60.7975 66 7.79219e-08 1 59 13 74 1 1 52 52 5 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGG-AAGCACTTTCTGTTTGTTGTCTGAGAAAAAACAAAGTGCTTCCCTTTAGAG ||||||| ||| |||| ||||||||| |||||| | |||| ||||||||||| ||||||| 2 46.3705 50 0.00171634 3 61 74 13 1 -1 50 50 5 63 CTCTACAGGGAAGCGCTTTCTGTTGTCTGA---AAGAAA-AGAAAGTGCTTCCTTTTAGAGGG CTCTAAAGGGAAGCACTTTGTTTTTTCTCAGACAACAAACAGAAAGTGCTTCC-TCTAGAGGG ||||| |||||||| |||| | || ||| | || ||| ||||||||||||| | ||||||| 75 gi|262205412|ref|NR_030215.1| Homo sapiens microRNA 520h (MIR520H), microRNA NR_030215 88 1 60.7975 66 7.79219e-08 1 59 14 75 1 1 52 52 5 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGG-AAGCACTTTCTGTTTGTTGTCTGAGAAAAAACAAAGTGCTTCCCTTTAGAG ||||||| ||| |||| ||||||||| |||||| | |||| ||||||||||| ||||||| 2 46.3705 50 0.00171634 3 61 75 14 1 -1 50 50 5 63 CTCTACAGGGAAGCGCTTTCTGTTGTCTGA---AAGAAA-AGAAAGTGCTTCCTTTTAGAGGG CTCTAAAGGGAAGCACTTTGTTTTTTCTCAGACAACAAACAGAAAGTGCTTCC-TCTAGAGGG ||||| |||||||| |||| | || ||| | || ||| ||||||||||||| | ||||||| 76 gi|262205366|ref|NR_030206.1| Homo sapiens microRNA 520g (MIR520G), microRNA NR_030206 90 1 60.7975 66 7.79219e-08 1 59 14 75 1 1 52 52 5 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGG-AAGCACTTTCTGTTTGTTGTCTGAGAAAAAACAAAGTGCTTCCCTTTAGAG ||||||| ||| |||| ||||||||| |||||| | |||| ||||||||||| ||||||| 2 46.3705 50 0.00171634 3 61 75 14 1 -1 50 50 5 63 CTCTACAGGGAAGCGCTTTCTGTTGTCTGA---AAGAAA-AGAAAGTGCTTCCTTTTAGAGGG CTCTAAAGGGAAGCACTTTGTTTTTTCTCAGACAACAAACAGAAAGTGCTTCC-TCTAGAGGG ||||| |||||||| |||| | || ||| | || ||| ||||||||||||| | ||||||| 77 gi|270132721|ref|NR_032717.1| Macaca mulatta microRNA mir-524 (MIR524), microRNA NR_032717 85 1 58.9941 64 2.71974e-07 1 55 12 66 1 1 46 46 0 55 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTT CCCTACAAAGGCAAGCACTTTCTCTTGTCTAAAAGAAAAGAAGGTGCTTCCCTTT |||| | ||| |||| |||||| |||||| ||||||||||| |||||||| ||| 2 37.3537 40 0.889088 9 61 64 12 1 -1 40 40 0 53 AGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG AGGGAAGCACCTTCTTTTCTTTTAGACAAGAGAAAGTGCTTGCCTTTGTAGGG |||||||| | |||| || | | | | || ||||||||||| | ||| |||| 78 gi|262205276|ref|NR_030185.1| Homo sapiens microRNA 519e (MIR519E), microRNA NR_030185 84 1 57.1907 62 9.49283e-07 3 59 16 69 1 1 47 47 3 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCCAAAAGGGAGCACTTTCTGTT---TGAAAGAAAACAAAGTGCCTCCTTTTAGAG ||| | | || ||| ||||||||| |||||||||| ||||||| ||||||||||| 79 gi|301171363|ref|NR_035861.1| Pan troglodytes microRNA mir-520g (MIR520G), microRNA NR_035861 89 1 55.3874 60 3.31332e-06 1 59 13 74 1 1 51 51 5 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGG-ACGCACTTTCTGTTTGTTGTCTGAGAAAAAACAAAGTGCTTCCCTTTAGAG ||||||| ||| | || ||||||||| |||||| | |||| ||||||||||| ||||||| 80 gi|270133196|ref|NR_032564.1| Macaca mulatta microRNA mir-516a-2 (MIR516A-2), microRNA NR_032564 89 1 55.3874 60 3.31332e-06 12 61 28 76 1 1 43 43 1 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCT-AAAGAAAAGGAAGTGTTTCCTTCCCGAGGG ||||| ||||||||||||| ||||||||| ||||| |||||| ||||| 81 gi|270133191|ref|NR_032563.1| Macaca mulatta microRNA mir-516a-1 (MIR516A-1), microRNA NR_032563 89 1 55.3874 60 3.31332e-06 12 61 28 76 1 1 43 43 1 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTCTGTTGTCT-AAAGAAAAGGAAGTGTTTCCTTCCCGAGGG ||||| ||||||||||||| ||||||||| ||||| |||||| ||||| 82 gi|301171387|ref|NR_035864.1| Pan troglodytes microRNA mir-521-2 (MIR521-2), microRNA NR_035864 86 1 53.584 58 1.15646e-05 3 59 15 71 1 1 46 46 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCCAAAGGGAAGAATTTTCTCTTGTCTAAAAGAAAAGAACGCACTTCCCTTTAGAG ||| | ||||||| ||||| |||||| ||||||||||| | ||||| ||||||| 83 gi|262205353|ref|NR_030203.1| Homo sapiens microRNA 521-2 (MIR521-2), microRNA NR_030203 87 1 53.584 58 1.15646e-05 3 59 16 72 1 1 46 46 0 57 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CTCCAAAGGGAAGAATTTTCTCTTGTCTAAAAGAAAAGAACGCACTTCCCTTTAGAG ||| | ||||||| ||||| |||||| ||||||||||| | ||||| ||||||| 84 gi|270133237|ref|NR_032572.1| Macaca mulatta microRNA mir-518f (MIR518F), microRNA NR_032572 87 1 49.9773 54 0.000140886 2 61 73 14 1 -1 47 47 0 60 CCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CCTCTGAAGGGAAGCGCTTTCTTTCCTTTCACACAAGATAAAGTGCTTCCCTCTAGAGGG ||||| ||||||||||||||| | | | | | || | ||||||||||| | ||||||| 85 gi|301171283|ref|NR_035853.1| Pan troglodytes microRNA mir-519d (MIR519D), microRNA NR_035853 87 1 46.3705 50 0.00171634 1 59 13 72 1 1 47 47 1 60 CCCTCTACAGGGAAGCGCTTTCTG-TTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGCGCTTTCTGTTTGTTTTCTCTCAAACAAAGTGCCTCCCTTTAGAG ||||| | |||||||||||||||| |||| | ||| ||||||| ||| ||||||| 86 gi|270133288|ref|NR_032583.1| Macaca mulatta microRNA mir-520g (MIR520G), microRNA NR_032583 90 1 46.3705 50 0.00171634 1 59 14 75 1 1 49 49 5 63 CCCTCTACAGGGAAGCGCTTTCTGTT----GTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCTAGAGA-AAGCACTTTCTGTTTGTTGTCTGAGGAAAAACAAAGTGCTTCCCTTCAGAG ||||||| || |||| ||||||||| |||||| |||| ||||||||||| || |||| 87 gi|262205371|ref|NR_030207.1| Homo sapiens microRNA 516b-2 (MIR516B2), microRNA NR_030207 85 1 46.3705 50 0.00171634 12 61 28 72 1 1 40 40 5 50 GAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG GAAGCACTTTGTGTTTTGTGAAAG-----AAAGTGCTTCCTTTCAGAGGG ||||| |||| |||| | |||||| |||||||||||||| |||||| 88 gi|262205349|ref|NR_030202.1| Homo sapiens microRNA 519d (MIR519D), microRNA NR_030202 88 1 46.3705 50 0.00171634 1 59 14 73 1 1 47 47 1 60 CCCTCTACAGGGAAGCGCTTTCTG-TTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG CCCTCCAAAGGGAAGCGCTTTCTGTTTGTTTTCTCTTAAACAAAGTGCCTCCCTTTAGAG ||||| | |||||||||||||||| |||| | ||| ||||||| ||| ||||||| 89 gi|301171138|ref|NR_035836.1| Pan troglodytes microRNA mir-515-2 (MIR515-2), microRNA NR_035836 82 1 39.157 42 0.254728 13 59 25 67 1 1 37 37 4 47 AAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG AAGCACTTTCTGTTGTCTGAAAG----CAGAGTGCCTTCTTTTGGAG |||| |||||||||||||||||| | ||||| | ||||| ||| 90 gi|301171409|ref|NR_035867.1| Pan troglodytes microRNA mir-524 (MIR524), microRNA NR_035867 86 1 39.157 42 0.254728 3 61 71 13 1 -1 44 44 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCCAAAGGGAAGCGCCTTCTTTTCCTTTGGACAAGAGAAAGTGCTTCCCTTTGTAGGG ||| | |||||||||| |||| || | | || ||||||||||||| ||| |||| 91 gi|301173375|ref|NR_035835.1| Pan troglodytes microRNA mir-515-1 (MIR515-1), microRNA NR_035835 82 1 39.157 42 0.254728 13 59 25 67 1 1 37 37 4 47 AAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG AAGCACTTTCTGTTGTCTGAAAG----CAGAGTGCCTTCTTTTGGAG |||| |||||||||||||||||| | ||||| | ||||| ||| 92 gi|262205340|ref|NR_030200.1| Homo sapiens microRNA 524 (MIR524), microRNA NR_030200 87 1 39.157 42 0.254728 3 61 72 14 1 -1 44 44 0 59 CTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG CTCCAAAGGGAAGCGCCTTCTTTTCCTTTGGACAAGAGAAAGTGCTTCCCTTTGTAGGG ||| | |||||||||| |||| || | | || ||||||||||||| ||| |||| 93 gi|262205285|ref|NR_030187.1| Homo sapiens microRNA 515-2 (MIR515-2), microRNA NR_030187 83 1 39.157 42 0.254728 13 59 26 68 1 1 37 37 4 47 AAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG AAGCACTTTCTGTTGTCTGAAAG----CAGAGTGCCTTCTTTTGGAG |||| |||||||||||||||||| | ||||| | ||||| ||| 94 gi|262205270|ref|NR_030184.1| Homo sapiens microRNA 515-1 (MIR515-1), microRNA NR_030184 83 1 39.157 42 0.254728 13 59 26 68 1 1 37 37 4 47 AAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAG AAGCACTTTCTGTTGTCTGAAAG----CAGAGTGCCTTCTTTTGGAG |||| |||||||||||||||||| | ||||| | ||||| ||| 95 gi|390332045|ref|XM_776818.2| PREDICTED: Strongylocentrotus purpuratus TM2 domain-containing protein almondex-like, transcript variant 2 (LOC576518), mRNA XM_776818 4082 1 37.3537 40 0.889088 32 56 2287 2263 1 -1 23 23 0 25 AAAGAAAAGAAAGTGCTTCCTTTTA AATGAAAAGAAAGTGCTTCATTTTA || |||||||||||||||| ||||| 96 gi|390332043|ref|XM_003723358.1| PREDICTED: Strongylocentrotus purpuratus TM2 domain-containing protein almondex-like, transcript variant 1 (LOC576518), mRNA XM_003723358 4079 1 37.3537 40 0.889088 32 56 2284 2260 1 -1 23 23 0 25 AAAGAAAAGAAAGTGCTTCCTTTTA AATGAAAAGAAAGTGCTTCATTTTA || |||||||||||||||| ||||| 97 gi|356543101|ref|XM_003539954.1| PREDICTED: Glycine max probable alpha,alpha-trehalose-phosphate synthase [UDP-forming] 7-like (LOC100811463), mRNA XM_003539954 2936 1 37.3537 40 0.889088 30 49 2157 2176 1 1 20 20 0 20 TGAAAGAAAAGAAAGTGCTT TGAAAGAAAAGAAAGTGCTT |||||||||||||||||||| 98 gi|356517317|ref|XM_003527287.1| PREDICTED: Glycine max probable alpha,alpha-trehalose-phosphate synthase [UDP-forming] 7-like (LOC100800847), mRNA XM_003527287 3251 1 37.3537 40 0.889088 30 49 2494 2513 1 1 20 20 0 20 TGAAAGAAAAGAAAGTGCTT TGAAAGAAAAGAAAGTGCTT |||||||||||||||||||| 99 gi|297814701|ref|XM_002875188.1| Arabidopsis lyrata subsp. lyrata hypothetical protein, mRNA XM_002875188 593 1 37.3537 40 0.889088 19 43 119 143 1 1 23 23 0 25 TTTCTGTTGTCTGAAAGAAAAGAAA TTTCTGATGTCTGGAAGAAAAGAAA |||||| |||||| ||||||||||| 100 gi|397513516|ref|XM_003827011.1| PREDICTED: Pan paniscus pumilio homolog 2 (Drosophila), transcript variant 2 (PUM2), mRNA XM_003827011 6002 1 35.5503 38 3.10322 20 49 4867 4896 1 1 28 28 2 31 TTCTGTTGTCTGAAAGA-AAAGAAAGTGCTT TTCAGTT-TCTGAAAGATAAAGAAAGTGCTT ||| ||| ||||||||| ||||||||||||| 3056429 673143725 0 0 0.41 0.625 0.78 biopython-1.63/Doc/examples/m_cold.fasta0000644000175000017500000000235712250104543017657 0ustar tratra00000000000000>gi|8332116|gb|BE037100.1|BE037100 MP14H09 MP Mesembryanthemum crystallinum cDNA 5' similar to cold acclimation protein, mRNA sequence CACTAGTACTCGAGCGTNCTGCACCAATTCGGCACGAGCAAGTGACTACGTTNTGTGAACAGAAAATGGG GAGAGAAATGAAGTACTTGGCCATGAAAACTGATCAATTGGCCGTGGCTAATATGATCGATTCCGATATC AATGAGCTTAAAATGGCAACAATGAGGCTCATCAATGATGCTAGTATGCTCGGTCATTACGGGTTTGGCA CTCATTTCCTCAAATGGCTCGCCTGCCTTGCGGCTATTTACTTGTTGATATTGGATCGAACAAACTGGAG AACCAACATGCTCACGTCACTTTTAGTCCCTTACATATTCCTCAGTCTTCCATCCGGGCCATTTCATCTG TTCAGAGGCGAGGTCGGGAAATGGATTGCCATCATTGCAGTCGTGTTAAGGCTGTTCTTCAACCGGCATT TCCCAGTTTGGCTGGAAATGCCTGGATCGTTGATACTCCTCCTGGTGGTGGCACCAGACTTCTTTACACA CAAAGTGAAGGAGAGCTGGATCGGAATTGCAATTATGATAGCGATAGGGTGTCACCTGATGCAAGAACAT ATCAGAGCCACTGGTGGCTTTTGGAATTCCTTCACACAGAGCCACGGAACTTTTAACACAATTGGGCTTA TCCTTCTACTGGCTTACCCTGTCTGTTTATGGTCATCTTCATGATGTAGTAGCTTAGTCTTGATCCTAAT CCTCAAATNTACTTTTCCAGCTCTTTCGACGCTCTTGCTAAAGCCCATTCAATTCGCCCCATATTTCGCA CACATTCATTTCACCACCCAATACGTGCTCTCCTTCTCCCTCTCTCCCTCTCCTCCCTCTTTTCTTCCTC TCACTTCTCTTCTCTTCTCTTCTTCAATACTCCCCTGGAGCGCCCTCTTCACCTCCCTACTCTCTACTCC TCTCTCTCACTCTCTCTTCCTCTCTTATCTCTCTCCTCCTCTCCTTCTCATCCCTCCTCCTTCTCTTCCT TTTCTTCTTTCTATCCACGCGCCATCCTCCCTCTTCCCTCTTCCCTTCTCTCTCCTCTCTTTCTCTCTCC TCTCTTCCTCATCTCACCACCTCCTCCTCTCTTTCTTCCGTCCTCCTTCCCTTCCTTCTTC biopython-1.63/Doc/examples/Proux_et_al_2002_Figure_6.py0000644000175000017500000001513712250104543022426 0ustar tratra00000000000000# This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # """GenomeDiagram script to mimic Proux et al 2002 Figure 6 You can use the Entrez module to download the 3 required GenBank files This is an extended version of the example in the Biopython Tutorial which produces a GenomeDiagram figure close to Proux et al 2002 Figure 6. See http://dx.doi.org/10.1128/JB.184.21.6026-6036.2002 """ import os from reportlab.lib import colors from reportlab.lib.colors import red, grey, orange, green, brown, blue, lightblue, purple from reportlab.lib.units import cm from Bio.Graphics import GenomeDiagram from Bio.Graphics.GenomeDiagram import CrossLink from Bio import SeqIO from Bio.SeqFeature import SeqFeature, FeatureLocation name = "Proux Fig 6" #As explained in the Biopython Tutorial, these are three phage genomes. The first #two are self-containged GenBank files, but the third phage is integrated into a #bacterial genome, thus we slice the full record and also take the reverse #complement to match the strand orientation of the other two phage: A_rec = SeqIO.read("NC_002703.gbk", "gb") B_rec = SeqIO.read("AF323668.gbk", "gb") C_rec = SeqIO.read("NC_003212.gbk", "gb")[2587879:2625807].reverse_complement(name=True) records = dict((rec.name, rec) for rec in [A_rec, B_rec, C_rec]) #Here we hard code the gene colors for simiplicity and to match the target image. #In practice you might have an automatic mapping based on the gene annotation #or some other classification: A_colors = [red]*5 + [grey]*7 + [orange]*2 + [grey]*2 + [orange] + [grey]*11 + [green]*4 \ + [grey] + [green]*2 + [grey, green] + [brown]*5 + [blue]*4 + [lightblue]*5 \ + [grey, lightblue] + [purple]*2 + [grey] B_colors = [red]*6 + [grey]*8 + [orange]*2 + [grey] + [orange] + [grey]*21 + [green]*5 \ + [grey] + [brown]*4 + [blue]*3 + [lightblue]*3 + [grey]*5 + [purple]*2 C_colors = [grey]*30 + [green]*5 + [brown]*4 + [blue]*2 + [grey, blue] + [lightblue]*2 \ + [grey]*5 #Here we hard code a list of cross-links with percentage identity scores, based #on a manual inspection of the target image (there could be mistakes here). #In practice you might generate the list of cross-mappings from a BLAST report #or similar computational analysis: #Tuc2009 (NC_002703) vs bIL285 (AF323668) A_vs_B = [ (99, "Tuc2009_01", "int"), (33, "Tuc2009_03", "orf4"), (94, "Tuc2009_05", "orf6"), (100, "Tuc2009_06", "orf7"), (97, "Tuc2009_07", "orf8"), (98, "Tuc2009_08", "orf9"), (98, "Tuc2009_09", "orf10"), (100, "Tuc2009_10", "orf12"), (100, "Tuc2009_11", "orf13"), (94, "Tuc2009_12", "orf14"), (87, "Tuc2009_13", "orf15"), (94, "Tuc2009_14", "orf16"), (94, "Tuc2009_15", "orf17"), (88, "Tuc2009_17", "rusA"), (91, "Tuc2009_18", "orf20"), (93, "Tuc2009_19", "orf22"), (71, "Tuc2009_20", "orf23"), (51, "Tuc2009_22", "orf27"), (97, "Tuc2009_23", "orf28"), (88, "Tuc2009_24", "orf29"), (26, "Tuc2009_26", "orf38"), (19, "Tuc2009_46", "orf52"), (77, "Tuc2009_48", "orf54"), (91, "Tuc2009_49", "orf55"), (95, "Tuc2009_52", "orf60"), ] #bIL285 (AF323668) vs Listeria innocua prophage 5 (in NC_003212) B_vs_C = [ (42, "orf39", "lin2581"), (31, "orf40", "lin2580"), (49, "orf41", "lin2579"), # terL (54, "orf42", "lin2578"), # portal (55, "orf43", "lin2577"), # protease (33, "orf44", "lin2576"), # mhp (51, "orf46", "lin2575"), (33, "orf47", "lin2574"), (40, "orf48", "lin2573"), (25, "orf49", "lin2572"), (50, "orf50", "lin2571"), (48, "orf51", "lin2570"), (24, "orf52", "lin2568"), (30, "orf53", "lin2567"), (28, "orf54", "lin2566"), ] def get_feature(features, id, tags=["locus_tag", "gene"]): """Search list of SeqFeature objects for an identifier under the given tags.""" for f in features: for key in tags: #tag may not be present in this feature for x in f.qualifiers.get(key, []): if x == id: return f raise KeyError(id) gd_diagram = GenomeDiagram.Diagram(name) feature_sets = {} max_len = 0 for i, record in enumerate([A_rec, B_rec, C_rec]): max_len = max(max_len, len(record)) #Allocate tracks 5 (top), 3, 1 (bottom) for A, B, C #(empty tracks 2 and 4 add useful white space to emphasise the cross links #and also serve to make the tracks vertically more compressed) gd_track_for_features = gd_diagram.new_track(5-2*i, name=record.name, greytrack=True, height=0.5, start=0, end=len(record)) assert record.name not in feature_sets feature_sets[record.name] = gd_track_for_features.new_set() #We add dummy features to the tracks for each cross-link BEFORE we add the #arrow features for the genes. This ensures the genes appear on top: for X, Y, X_vs_Y in [("NC_002703", "AF323668", A_vs_B), ("AF323668", "NC_003212", B_vs_C)]: features_X = records[X].features features_Y = records[Y].features set_X = feature_sets[X] set_Y = feature_sets[Y] for score, x, y in X_vs_Y: color = colors.linearlyInterpolatedColor(colors.white, colors.firebrick, 0, 100, score) border = colors.lightgrey f_x = get_feature(features_X, x) F_x = set_X.add_feature(SeqFeature(FeatureLocation(f_x.location.start, f_x.location.end, strand=0)), color=color, border=border) f_y = get_feature(features_Y, y) F_y = set_Y.add_feature(SeqFeature(FeatureLocation(f_y.location.start, f_y.location.end, strand=0)), color=color, border=border) gd_diagram.cross_track_links.append(CrossLink(F_x, F_y, color, border)) for record, gene_colors in zip([A_rec, B_rec, C_rec], [A_colors, B_colors, C_colors]): gd_feature_set = feature_sets[record.name] i = 0 for feature in record.features: if feature.type != "gene": #Exclude this feature continue gd_feature_set.add_feature(feature, sigil="BIGARROW", color=gene_colors[i], label=True, name=str(i+1), label_position="start", label_size=6, label_angle=0) i += 1 gd_diagram.draw(format="linear", pagesize='A4', fragments=1, start=0, end=max_len) gd_diagram.write(name + ".pdf", "PDF") gd_diagram.write(name + ".eps", "EPS") gd_diagram.write(name + ".svg", "SVG") biopython-1.63/Doc/examples/fasta_iterator.py0000644000175000017500000000164612250104543020763 0ustar tratra00000000000000# This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # """Example using Bio.SeqIO to parse a FASTA file.""" from __future__ import print_function from Bio import SeqIO def extract_organisms(file_to_parse, format): all_species = [] for cur_record in SeqIO.parse(open(file_to_parse), format): # extract the info from the description new_species = cur_record.description.split()[1] # append the new species to the list if it isn't there if new_species not in all_species: all_species.append(new_species) return all_species if __name__ == "__main__": print("Using Bio.SeqIO on a FASTA file") all_species = extract_organisms("ls_orchid.fasta", "fasta") print("number of species: %i" % len(all_species)) print("species names: %s" % all_species) biopython-1.63/Doc/examples/ls_orchid.fasta0000644000175000017500000022530012250104543020363 0ustar tratra00000000000000>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG CCGCCTCGGGAGCGTCCATGGCGGGTTTGAACCTCTAGCCCGGCGCAGTTTGGGCGCCAAGCCATATGAA AGCATCACCGGCGAATGGCATTGTCTTCCCCAAAACCCGGAGCGGCGGCGTGCTGTCGCGTGCCCAATGA ATTTTGATGACTCTCGCAAACGGGAATCTTGGCTCTTTGCATCGGATGGAAGGACGCAGCGAAATGCGAT AAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCCGAGGCCATCA GGCTAAGGGCACGCCTGCTTGGGCGTCGCGCTTCGTCTCTCTCCTGCCAATGCTTGCCCGGCATACAGCC AGGCCGGCGTGGTGCGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGCGGGTCCAAGAGCTGGTGT TTTGATGGCCCGGAACCCGGCAAGAGGTGGACGGATGCTGGCAGCAGCTGCCGTGCGAATCCCCCATGTT GTCGTGCTTGTCGGACAGGCAGGAGAACCCTTCCGAACCCCAATGGAGGGCGGTTGACCGCCATTCGGAT GTGACCCCAGGTCAGGCGGGGGCACCCGCTGAGTTTACGC >gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAACAGAATATATGATCGAGTG AATCTGGAGGACCTGTGGTAACTCAGCTCGTCGTGGCACTGCTTTTGTCGTGACCCTGCTTTGTTGTTGG GCCTCCTCAAGAGCTTTCATGGCAGGTTTGAACTTTAGTACGGTGCAGTTTGCGCCAAGTCATATAAAGC ATCACTGATGAATGACATTATTGTCAGAAAAAATCAGAGGGGCAGTATGCTACTGAGCATGCCAGTGAAT TTTTATGACTCTCGCAACGGATATCTTGGCTCTAACATCGATGAAGAACGCAGCTAAATGCGATAAGTGG TGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCTCGAGGCCATCAGGCTAAG GGCACGCCTGCCTGGGCGTCGTGTGTTGCGTCTCTCCTACCAATGCTTGCTTGGCATATCGCTAAGCTGG CATTATACGGATGTGAATGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGTTGCTTTGATG GGTAGGAATGTGGCACGAGGTGGAGAATGCTAACAGTCATAAGGCTGCTATTTGAATCCCCCATGTTGTT GTATTTTTTCGAACCTACACAAGAACCTAATTGAACCCCAATGGAGCTAAAATAACCATTGGGCAGTTGA TTTCCATTCAGATGCGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTGAGGC >gi|2765656|emb|Z78531.1|CFZ78531 C.fasciculatum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGCAGAACATACGATCGAGTG AATCCGGAGGACCCGTGGTTACACGGCTCACCGTGGCTTTGCTCTCGTGGTGAACCCGGTTTGCGACCGG GCCGCCTCGGGAACTTTCATGGCGGGTTTGAACGTCTAGCGCGGCGCAGTTTGCGCCAAGTCATATGGAG CGTCACCGATGGATGGCATTTTTGTCAAGAAAAACTCGGAGGGGCGGCGTCTGTTGCGCGTGCCAATGAA TTTATGACGACTCTCGGCAACGGGATATCTGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAG TGGTGTGAATTGCAGAATCCCGCGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCT AAGGGCACGCCTGCCTGGGCGTCGTGTGCTGCGTCTCTCCTGATAATGCTTGATTGGCATGCGGCTAGTC TGTCATTGTGAGGACGTGAAAGATTGGCCCCTTGCGCCTAGGTGCGGCGGGTCTAAGCATCGGTGTTCTG ATGGCCCGGAACTTGGCAGTAGGTGGAGGATGCTGGCAGCCGCAAGGCTGCCGTTCGAATCCCCCGTGTT GTCGTACTCGTCAGGCCTACAGAAGAACCTGTTTGAACCCCCAGTGGACGCAAAACCGCCCTCGGGCGGT GATTTCCATTCAGATGCGACCCCAGTCAGGCGGGCCACCCGTGAGTAA >gi|2765655|emb|Z78530.1|CMZ78530 C.margaritaceum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAAACAACATAATAAACGATTGAGTG AATCTGGAGGACTTGTGGTAATTTGGCTCGCTAGGGATATCCTTTTGTGGTGACCATGATTTGTCATTGG GCCTCATTGAGAGCTTTCATGGCGGGTTTGAACCTCTAGCACGGTCCAGTTTGCACCAAGGTATATAAAG AATCACCGATGAATGACATTATTGCCCCACACAACGTCGGAGGTGTGGTGTGTTAATGTTCATTCCAATG AATTTTGATGACTCTCGGCAGACGGATATCTTGACTCTTGCATCGATGAAGAACGCACCGAAATGTGATA AGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGG CTAAGGGCACGCCTGCCTGGGCGTCGTATGTTTTATCTCTCCTTCCAATGCTTGTCCAGCATATAGCTAG GCCATCATTGTGTGGATGTGAAAGATTGGCCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATATGTGTTT TGATGGTCTGAAACTTGGCAAGAGGTGGAGGATGCTGGCAGCCGCAAGGCTATTGTTTGAATCCCCCATG TTGTCATGTTTGTTGGGCCTATAGAACAACTTGTTTGGACCCTAATTAAGGCAAAACAATCCTTGGGTGG TTGATTTCCAATCAGATGCGACCCCAGTCAGGGGGCCACCCCAT >gi|2765654|emb|Z78529.1|CLZ78529 C.lichiangense 5.8S rRNA gene and ITS1 and ITS2 DNA ACGGCGAGCTGCCGAAGGACATTGTTGAGACAGCAGAATATACGATTGAGTGAATCTGGAGGACTTGTGG TTATTTGGCTCGCTAGGGATTTCCTTTTGTGGTGACCATGATTTGTCATTGGGCCTCATTGAGAGCTTTC ATGGCGGGTTTGAACCTCTAGCACGGTGCAGTTTGCACCAAGGTATATAAAGAATCACCGATGAATGACA TTATTGTCAAAAAAGTCGGAGGTGTGGTGTGTTATTGGTCATGCCAATGAATTGTTGATGACTCTCGCCG AGGGATATCTTGGCTCTTGCATCGATGAAGAATCCCACCGAAATGTGATAAGTGGTGTGAATTGCAGAAT CCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGG GCGTCGTATGTTTTATCTCTCCTTCCAATGCTTGTCCAGCATATAGCTAGGCCATCATTGTGTGGATGTG AAAGATTGGCCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATATGTGTTTTGATGGTCTGAAACTTGGCA AGAGGTGGAGGATGCTGGCAGCCGCAAGGCTATTGTTTGAATCCCCCATGTTGTCATATTTGTTGGGCCT ATAGAACAACTTGTTTGGACCCTAATTAAGGCAAAACAATCCTTGGGTGGTTGATTTCCAATCAGATGCG ACCCCAGTCAGCGGGCCACCAGCTGAGCTAAAA >gi|2765652|emb|Z78527.1|CYZ78527 C.yatabeanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGTAGAATATATGATCGAGTG AATCTGGATGACCTGTGGTTACTCGGCTCGCCTGATTTGTTGTTGGGCTTCCTTAGGAGCTTACATGGCG GGTTTGAACCTCTACCACGGTGCAGTTTGCGCCAAGTCATATGAAGCATAACTGCAAATGGCACTACTGT CACCAAAAGTTGGAGTGGCAGTGTGTTATTGCATGCGCTAATGGATTTTTGATGACTCTCGGCCAACGGA TATCTGGCTCTTTGCATCGATGAAGGAACGCAGCGAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGC GAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTC GTGTATCGCATCTCTCTTGCCAATGCTTACCCGGCATACAACTAGGCTGGCATTGGGTGGATGTGAAAGA TTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGATGTTTTGATGGATCGAAACCTGGCAGGAGG TGGAGGATGCTGGAAGCCGCAAGGCTGTCGTTCGAATCCCCCATGTTGTCATATTTGTCGAACCTATAAA AGAACATGCTTGAACCCCAATGGATTGTAAAATGACCCTTGGCGGTTGATTTCCATTTAGATGCGACCCC AGGTCAGGCGGGCCACCC >gi|2765651|emb|Z78526.1|CGZ78526 C.guttatum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGTAGAATATATGATCGAGTG AATCTGGAGGACCTGTGGTTACTCGGCTCCCCTGATTTGTTGTTGGGCTTCCTTAGGAGCTTACATGCCG GGTTTGAACCTCTACCACGGTGCAGTTTGCGCCAAGTCATATGAAGCATAACTGAACAATGGCATTATTG TCACCAAAAGTTGGAGTGGCAGTGTGCTATTGCATGCGCTAATGGATTTTTGATGACTCTCGCCAACGGA TATCTTGGCTCTTGCATCGATGAAGAACCCAGCGAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGCG AACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCG TGTATCGCATCTCTCTTGCCAATGCTTACCCGGCATACAACTAGGCTGGCATTGTGCGGATGTGAAAGAT TGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGATGTTTTGATGGATCGAAACCTGGCAGGAGGT GGAGGATGCTGGAAGCCGCAAGGCTGTCGTTCGAATCCCCCATGTTGTCATATTTGTCGAACCTATAAAA GAACATGCTTGAACCCCAATGGATGTAAAATGACCCTTGGCGGTTGATTTCCATTTAGATGCGACCCCAG GTCAGGCGGGGCCACCCGCTGAGTTTATGT >gi|2765650|emb|Z78525.1|CAZ78525 C.acaule 5.8S rRNA gene and ITS1 and ITS2 DNA TGTTGAGATAGCAGAATATACATCGAGTGAATCCGGAGGACCTGTGGTTATTCGGCTTGCCGAGGGCTTT GCTTTTGTGGTGACCCAAATTTGTCGTTGGGCCTCCTCGGGAGCTTTCATGGCAGGTTTCAAACTCTAGC ACGGCACAGTTTGTGCCAAGTCATATGAAGCATCACCGACAAATGACATTATTGTCAAAAAAGTTGGAGG GGCGGTGTCCTCCTGTGCATGCCGAATATAATTTTGATGACTCTCGACAAGCGGATATCTTGGCTCTTGC ATCGGATGAAGAACCCAGCGAAATGCGATAAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTT TTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCGTGTGTTGTGTCTC TCTTGCCAATGCCTGTCCATATATCTAGGCTTGCATTGTGCGGATGCGAAAGATTGGCCCCTTGTGCCTT GGCGCGTTGGGTCTAAGGAATGTTTTGATGGCCCGAAACTTGGCAGGAGGTGGAGGACATTGGCTGCCAC AAGGTTGTCATTTAAATCCCCCATGTTATCGTATTTATCGGACCTATATAATAACTTGTTTGAACCCCAG TGGAGGCAAAATGACCCTTGGATGGTTGACTGCCATTCATATGCGACCCCAGGTCAGGCGGGCCACCCGC TGCA >gi|2765649|emb|Z78524.1|CFZ78524 C.formosanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATAGTAGAATATATGATTGAGTG AATATGGAGGACATGTGGTTACTTGGCTCGTCAGTGCTTTGCTTTTGTGGTGACCTTAATTGGGCCTCCT TAGGAGCTTTCATGGCGGGTTCAAACCTTTAGCACGGCGCAGTTTGTGCCAAGTCATATAAGCATCCCTG ATGAATGGCATTGTTGTTAAAAAAGTCGGAGGGGCGGCATGCTGTTGTGCATGCTAATGAATTTTTTGAT GACTCTCGCAACGGAACTTGGCTCTTTACATCCGATGAAGAACGCAGCGAAATGCGATAAGTGGTGTGAA TTGCAGAATCCCGTGAACCATCGAGTATTTGAACGCAAGTTGCGCCCAAGGCCATCAGGCTAAGGGCACG CCTGCCTGGGCGTCGTGTGCTGCATCTCTCCTNCCAATGCTTGCCCAGCATATAGCTAGGTTAGCATTGT GCGGATGAAATATTGGCCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATTAGTATTTTGATAGCTCGGAA CTCGGCAGGAGGTGGAGAATGTTGGTAGCTGCAAGGCTGCCATTTGAATTCCCCATGTTGTCGTATTTGT TGAACCTATAAAAGAACTTGTTTGAACCCCAATGAAGGAAAAATGACCCTTGGGCGGTTGATTTTCATTC AGATGCAACCCCAGGTCAGGTGGCCACCCTGAGATTAAGC >gi|2765648|emb|Z78523.1|CHZ78523 C.himalaicum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACCAGGTTTCCGTAGGTGAACCTGCGGCAGGATCATTGTTGAGACAGCAGAATATATGATCGAGTG AATCCGGTGGACTTGTGGTTACTCAGCTCGACATAGGCTTTGCTTTTGCGGTGACCCTAACTTGTCATTG GGCCTCCTCCCAAGCTTTCCTTGTGGGTGTGAACCTCTAGCACGGTGCAGTATGCGCCAAGTCATATGAA GCATCACTGAGGAATGACATTATTGTCCCAAAAGCTAGAGTGGAAGCGTGCTCTTGCATGCATGCATAAT GAATTTTTTATTGACTCTCGACATATGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAAC GCAAGTTGCGCCCGATGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCGTGTGCTGCGTCTCTCCTAT CAATGCTTTCCTATCATATAGATTGGTTTGCATTGCGTGGATGCGAAAGATTGGCCCCTTGTGCCTAGGT GCGGTGGGTCTAAGGACTAGTGTTTTGATGGTTCGAAACCTGGCAGGAGGTGGAGGATGTTGGCAGCTAT AAGGCTATCGTTTGAACCCCCCATATTGTCGTGTTTGTCGGACCTAGAGAAGAACCTGTTTGAATCCCAA TGGAGGCAAACAACCCTCGGGCGGTTGATTGCCATTCATATTGCGACCCAGGTCAGGCGGGGCCACCGCT GAGTTTAAG >gi|2765647|emb|Z78522.1|CMZ78522 C.macranthum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGCAGAATATATGATCGAGTG AATCCGGTGGACTTGTGGTTACTCAGCTCGACATAGGCTTTGCTTTTGCGGTGACCCTAATTTGTCATTG GGCCTCCCCCCAAGCTTTCCTTGTGGGTTTGAACCTCTAGCACGGTGCAGTATGCGCCAAGTCATATGAA GCATCACTGATGAATGACATTATTGTCCAAAAAGTTGGAGTGGAAGCGTGCTATTGCATACATGCAAATG AATTTTTTATGACTCTCGACATATCGTGGTGTGATCGCAGAATCCCGTGAACCATCGAGTCTTTGAACGC AAGTTGCGCCCGATGCCATCAGGCTAAGGGAACGCCTGCCTGGGCGTCGTGTGCTGCGTCTCTCCTGTCA ATGGTTATACGTCATATAGACAGGTTTGCATTGCGTGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGC GGTGGGTCTAAGGACTAGTGTTTTGATGGTTCGAAACCTGGCAGGAGGTGGAGGATGTTGGCAGCTATAA GGCTATCATTTGAATCCCCCATATTGTCGTGTTTGTCGGACCTAGAGAAGAACATGTTTGAATCCCAATG GGGGCAAACAACCCTCGGGCGGTTGATTGCCATTCATATGCGACCCCAGGTCAGGCGGCCACCCGCTGAG >gi|2765646|emb|Z78521.1|CCZ78521 C.calceolus 5.8S rRNA gene and ITS1 and ITS2 DNA GTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGTAGAATATATGATCGAGTGAATCCGGTGGACTTG TGGTTACTCAGCTCGACATAGGCTTGGCTTTGGCGGTGACCCTAATTTGCCATTGGGCCTCCTCCAAAGC TTTCCTTGTGGGTTTGAACCTCTAGCACGGTGCAGTATGCGCCAAGTCATATGAAGCATCACCGATGAAT GACATTATTGTCAAAAAGTTGGAGTGGAAGCGTGCTATTGCATGCATGCAAATGAATTTTTTATGACTCT CGACAACGGATATCTTGGCTCTTGCATCGATGAAGAACGCAGCAAAATGCGATAAGTGGTGTGAATTGCA GAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGATGCCATCAGGCTAAGGGCACGCCTGC CTGGGCGTCGTGTGCTGCGTCTCTCCTGTCAATGCTTTCATGTCATATAGATAGGTTTGCATTGCGTGGA TGTGAAAGAATGGCCCCTTGTGCCTAGGTACGGTGGGTCTAAGGACTAGTGTTTTGATGGTTCGAAACCT GGCAGGAGGTGGAGGATGTTGGCAGCTATAAGGCTATCATTTGAATCCCCCATATTGTCGTGTTTGTCGG ACCTAGAGAAAAACATGTTTGAATCCCAATGGAGGCAAACAACTCTCGGGCGGTTGATTGCCATTCATAT GCGACCCCAGGTCAGGCGGGGCCACC >gi|2765645|emb|Z78520.1|CSZ78520 C.segawai 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGCAGAATATATGATCGAGTG AATCCGGTGGACTTGTGGTTACTCAGCTCGCCATAGGCTTTGCTTTTGCGGTGACCCTAATTTGTCATTG GGCCTCCTCCAAAGCTTTCCTTGTGGGTTTGAACCTCTAGCACGGTGCAGTATGCGCCAAGTCATATGAA TCATCACCGATGAATGACATTATTGTCCAAAAAGTTGGAGTAGAAGCGTGCTATTGCATGCATGCAATAG AATATTTTATGACTCTCGACAAGGGATATCTTGGCTCTTGCATCGGATGAAGAACGCAGCGAAATTGTGA TAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTATGTGAACGCAAGTTGCGCCCGATGCCATCA GGCTAAGGGCACGCCTGCCTGGGCGTCGTGTGCTGCGTCTCTCCTGTCAATGCTTTCCTGTCATATCGAT AGGTTTGCATTGTGTGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGACTAGTGT TTTGATGGTTCGAAACCTGGCAGGAGGTGGAGGATGTTGGCAGCTATAAGGTTGTCATGTGAATCCCCCA TATTGTCGTGTTTGTCGGACCTGGAGAAGAACCTGTTTGAATCCCAATGGAGGCAAACAACCCTCGGGCG GTTGATTGCCATTCATATGCGACCCCAGGTCAGGCGGGCCACCCGCTGAGTTT >gi|2765644|emb|Z78519.1|CPZ78519 C.pubescens 5.8S rRNA gene and ITS1 and ITS2 DNA ATATGATCGAGTGAATCTGGTGGACTTGTGGTTACTCAGCTCGCCATAGGCTTTGCTTTTGCGGTGACCC TAATTTGTCATTGGGCCTCCTCCCAAGCTTTCCTTGTGGGTTTGAACCTCTAGCACGGTGCAGTATGCAC CAAGTCATATGAAGCATTGCCGATGAATGACATTATTGTCCAAAAGTTGGAGTGGAAGCGTGCTACTGCA TGCATGCAAATGAATTTTTTTATGACTCTCGACAACGGATATCTTGGCTCTTGCATCGATGAAGAACGCA GCGAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCC CGATGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCGTGTGCTGCGTCTCTCCTGTCAATGCTTTCCC ATCATATAGATAGGTTTGCATTGTGTGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTA AGAACTTAATGTTTTGATGGTTCGAAACCTGGCAGGAGGTGGAGGATGTTGGCAGCTATATAAGGCTATC ATTTGAATCCCCCATATTGTCGCGTTTGTTGGACCTAGAGAAGAACATGTTTGAATCCCAATGGAGGCAA ACAACCCTCGGGCGGTTGATTGCCATTCATATGCGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTTA >gi|2765643|emb|Z78518.1|CRZ78518 C.reginae 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGGAGGATCATTGTTGAGATAGTAGAATATTCGATCGAGTG AATCCGGAGGACTTGTGGTTACTCGGCTCGTCGAAGGCTTAACTTTTGTGGTGACCCTGATTTGTAGTTG GGCATCCTCGAGAGCTTTTATGGCGGGTTTGAGCCTCTATCACGGCGCAGTTTGCGCCAAGTCATATGAA GCATCGCCGACGAATTACATTATTGTCCCCCAAACTCGGATGGACGGTGTGTGTTACGCATACCCGTGAA CCATCGAGTCTTTGAACGCAAGTTGCGCCCAAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCGTG TGCTGCATCTCTTTTGCCAATGCTTGCTCGACATACAATTAGGCCAGTATTGCATAGATATGAAAGATTG ACCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATTGGTGTTTTGATGGCCCAAACCCCGGCAGGAGGTGG AGCATGTTGATAGTCGCAAGGCTGTCGTTCAAATCCCACATGTTGTCGTATTTGCCGGACCCACAGAAGA ACCTATTTGAACCCCTATGGAGGCAAAACAACCCTTGAGCGATTGATTGCCATTCAGATACGACCCCAGG TCAGGCGGGGCCACCCGCTGAGTTTTCC >gi|2765642|emb|Z78517.1|CFZ78517 C.flavum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGTAGAATATACGATCGAGTG AATCCAGAGGACTTGTGGTTACTCGGCTCGTCCAAGTCTTAGCTTTTGTGGCCCTGATTTGTCGTTGGGC ATCCTCAGGAGATTTTATGGCGGGTTTGAACCTCTATCACGGTGCAGTTTGCGCCAAGTCATATGAAGCA TCACCGATGAATGACATTATTGTCACAAAAGTCGGATGGGCGGTGTGCTGTTGTGCATGCCAATAAATTT TTGATGACTCTCGGCCAACGGATATCTTGCTCTTCCATCGATGAAGAACGCAGCGAAATGCGATAAGTGG TGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCAAGGCCATCAGGCTAAG GGCACGCCTGCCTGGGCGTCGTGTGCTGCATCTCTTTTGCCAATGCTTGCCCGACATACAATTAGGACAG TATTGCATAGATATGAAAGATTGACCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATTGGTGTTTTGGTG GCCCGAACCCCGGCAGGAGGTGGATCATGTTGATAGTCGCAAGACTGTCATTCAAATCCCACATGTTGTC GTATTTGTCGGACCCACAGAAGAACCTATTTGAACCCCAATGGAGGCAAAACAACCCTCGAGCGATTGAT TGCCATTCAGATACGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTTAAGC >gi|2765641|emb|Z78516.1|CPZ78516 C.passerinum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAGTATAATATATGATCGAGTG AATCCGGAGGACTTGTGGTTACTCGGCTCGTCCAAGTCTTAGCTTTTGTGGCCCTGATTTGTCGTTGGGC ATCCTCAGGAGCTTTTATGGCGGGTTTGAACCTCTATCACGGCGCAGTTTGCGCCAAGTCATATGAAGCA TCACCGACGAATGACATTATTGTCACCAAAGTCGGATGGGCGGTGTGCTATTGTGCATACCAATAATTTT TTGATGACTCTCGTCAACGGATATCTTAGCGAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGTGAAC CATCGAGTCTTTGAACGCAAGTTGCGCCCAAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTCGTGT GCTGCATCTCTTTTGCCAATGCTTGCCCGACATACAATTAGGCCAGTATTGCATAGATATGAAAGATTGA CCCCTTGTGCTTAGGTGCGGTGGGTCTAAGGATTGGTGTTTTGATGTCCCGAACCCCGGCAGGAGGTGGA GCATGTTGATAGTCGCAAGACTATCGTTCAAATCCCACATGTTGTCGTATTTGTCGGACCCACAGAAGAA CCTATTTGAACCCCAATGGAGGCAAAACAACCCTCGAGTGATTGATTGCCATTCAGATATGACCCCAGGT CAGGCGGGGCCACCCGCTGAGTTTAA >gi|2765640|emb|Z78515.1|MXZ78515 M.xerophyticum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGCTGAGACCGTAGAATAAACGATCGAGTT AATCTGGAGGACCGGTGTACTTCGATCTCCCAGGGGCTTTCGCTACTGTGGTGGCCTTTGATCTGCCATC GGGCCTCCTTGGGAGTGTTCTTGAAGGCGATCAAACTTCTAGCCCGGCGCAGCTTCGCGCCAAGTCTTTT GAGACAAGAATCGGCATAGGGGTGTTCCCTTGTAGCCGGTGGGGGTGGCACTTGATTCGTGCCCCCCAAG TTACATTTTTACAACTCTCGGCAACGGATATCTCGGCTCTTGCATCGATGGAGGACGCAGCGAAATGCGA TAAGTGGTGTGAATTGCAGAATCCCGTGAACATCGAGTCTTTGAACGCAAGTTGCGCTCGAGGCCGTCAG GCTAAGGGCACGCCTGCCTGGGCGTTGTGTACTGTGTCTCTCCCACCAATGGTTGTCCAAGAATACCGTT CGGTCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTCGGTTCAATGGGTCTAAGACCTCGGGCTTTTGAT GGTCCAAAATTCGACAAGAGGTGGATGGGCAATGGCTGAGCCAAAGCTGTTGTGCGAATGCCGTATGTTG TCCGATTTGATGGGCCATCATAATTCGTAGGACCCTTCGGAACCCCATTGGTGCCACATCAACCCAACCC ATGGGCGGTTGATTGCCATTTGGAAGCAACCCCAGGTCAGGTGAGGCCACCCGCTGAGTTTAAGC >gi|2765639|emb|Z78514.1|PSZ78514 P.schlimii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGGACCTTCGGGAGGATCATTTTTGAAGCCCCCAAATATACGATCGAGAT AATCCGGAGGACCGGTGTACTTTGGTCTCCCAGGGGCTTCCGCCGCTGTGGTGACCATGATTTCCCATCG AACCTCCTTGGGAGAGTTCTCTATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCTCCAAGTCAAATG AGATAGAACCGACAAGGGTCTTCGTCCTCCATGGATGGACCGGGGAGGGCCGGCGTGCTGCTGTGCCCCC TTAAGATTCGTCTGACAACTCTCGTCAACGGATATCTCGGCTCTTGCATCGATGAAGAACCCAGCGAAAT GTGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCC ATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCAATGCTAAGGTTGAACAGCCA TACTGTTCGGCCGGCGAGGATGAGAGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACTTGGGCT TGTGACGGTCCACAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACAAAGCTGTTGTGCGAATGCCC TATGTTGTCGTATTTGATGGGCCGGAATGATCCCTTTCGAACCCCGTCGGAGGCACGTCGACCCAACCCA TGGGCGGTTGACGGCCATTAGGATGCAACCCCAGGTCAGGTGAGACTACCCGCTA >gi|2765638|emb|Z78513.1|PBZ78513 P.besseae 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCCAAATACACGATCGAGTT AATCCGGAGGACCGGTGTACTTTGGTCTCCCAGGGGCTTCCGCCGCTGTGGTGACCATGATTTGCCATCG AGCCTCATTGGGAGATTTCTCCATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCAAATG AGATAGAACCGGCAAGGGCATCGTCCTCCATGGAGCCGGGGAGGCCGGCATGCTGCTGTGCCCGAAAGAA TTTTCGACAACTCTCGGCAACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGTGATAAG TGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCT AAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCAATGCTAAGGTTGAACAGCCATACTGTTC GGCCGGCGAGGATGAGAGTTTGGCCCCTTGTTCTTCTGTGCGATGGGTCCAAGACTTGGGCTTGTGACGG TCCACAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTTTTGTGCGAATGCCCTATGTTGT CGTATTTGATGTGCCAGAACGATCCCTTTCGAACCCCTTCGGAGGCACGTCGACCCAACCCATGGGCGGT GACGCCATTAGGATGCAACCCAGTCAGTGAGCTACCGCTGAG >gi|2765637|emb|Z78512.1|PWZ78512 P.wallisii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGGACCTTCGGGAGGATCATTTTTGAAGCCCCCAAAAAAACGATCGAATT AATCCGGAGGGCCGGTGTAGTTTGGTCTCCCAGGGGCCTTGGCTACTGTGGTGACCGTGAATTTCCGTCG AACCCTCTGGGAGGAATTCTTGATGGCAAATGAAACCCTTGGCCCGGCGCAGTTTCGCCCCAAATCAAAT GAGATGGAACCGGCGGAGGGCATCGTCCCCCATGGAACCGGGGAGGGCCGGCGTTCTTCCGTTCCCCCAA TGAAATTATTTTTTGACAACTCTCGCAACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAAT GTGATAAGCTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGC CATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCTCCCATTGCTAAGGCTGAACAG GCATACTGTTCGGCCGGCGCGGATGAGTGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGG GCTTTTGACGGCCGGAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTGTCGTGCGAATGC CCTGCGTTGTCGTATTTGATGGGCCGGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCGTG GGCGGTCGACGGTCATTTGGATCCAACCCCAGGTCAGGTGAGGCCACCCGCTGAGTTTAAGC >gi|2765636|emb|Z78511.1|PEZ78511 P.exstaminodium 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTTCGGAAGGATCATTGTTGAGACCCCCAAAAAAACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTGGCTACTGTGGTGGCCGTGAATTTCCGTCG AACCTCCTTGGGAGAATTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCCCCAAGTCAAATG AGATGGAACCGGCGGAGGGCATCGTCCTCCATGGAACCGGGGAGGGCCGGCGTTCTTCCGTTCCCCCCAT GAATTTTTTTTTGACAACTCTCGGCAACGGATATCTCGGCTCTTTGCATCCGATGAAAGAACCCAGCGAA ATGTGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGG CCATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCTCCCATTGCTAAGGCTGAACA GGCATACTGTTCGGCCGGCGCGGATGAGTGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTG GGCTTTTGACGGCCGGAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTGTCGTGCGAATG CCCTACGCTGTCGTATTTGATGGGCCGGAATAAATCCCTTTTGAGCCCCATTGGAGGCACGTCAACCCGT GGGCGGTCGACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGGA >gi|2765635|emb|Z78510.1|PCZ78510 P.caricinum 5.8S rRNA gene and ITS1 and ITS2 DNA CTAACCAGGGTTCCGAGGTGACCTTCGGGAGGATTCCTTTTTAAGCCCCCGAAAAAACGATCGAATTAAA CCGGAGGACCGGTTTAATTTGGTCTCCCCAGGGGCTTTCCCCCCTTGGTGGCCGTGAATTTCCATCGAAC CCCCCTGGGAGAATTCTTGGTGGCCAATGGACCCTTGGCCCGGCGCAATTTCCCCCCCAATCAAATGAGA TAGGACCGGCAGGGGGCGTCCCCCCCCATGGAACCGGGGAGGGCCGGCATTCTTCCGTTCCCCCCTCGGA TTTTTTGACAACTCTCGCAACGGATATCTCGCCTCTTTGCATCGGATGGAAGAACGCAGCGAAATGTGAT AAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAG GCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCATTGCTAAGGTTGAACGGGCATACTG TTCGGCCGGCGCGGATGAGAGATTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTGA CGGTCCAAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACAAAGCTGTCGTGCGAATGCCCTGCGTT GTCGTTTTTGATGGGCCGGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCATGGGCGGTTG ACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGCCACCCGCTGAGTTTA >gi|2765634|emb|Z78509.1|PPZ78509 P.pearcei 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCCAAATATACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTCGCCGCTGTGGTGACCGTGATTTGCCATCG AGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCATATG AGATAGAACCGGCGGAGGGCGTCGTCCTCCATGGAGCGGGGAGGGCCGGCATGCTCCGTGCCCCCCCATG AATTTTTCTGACAACTCTCGGCAACGGACGTAACAAGGTTTAAATGTGATAAGCAGGTGTGAATTGCAGA ATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGTTAAGGGCACGCCTGCCT GGGCGTTGCGTGCTGCATCTCTCCCATTGCTAAGGTTGAACGGGCATACTGTTCGGCCGGCGCGGATGAG AGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTGACGGTCCAAAATCCGGCAAG AGGTGGACGGACGGTGGCTGCGACAGAGCTGTCGTGCGAATGCCCTACGTTGTCGTTTTTGATGGGCCAG AATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCAATGGGGGGTGACGGGCATTTGGTTAACCC CGGCAAGTTAAGGCACCCGTTAATTTTAGGA >gi|2765633|emb|Z78508.1|PLZ78508 P.longifolium 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCCAAATATACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTCGCCGCTGTGGTGACCGTGATTTGCCATCG AGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCATATG AGATAGAACCGGCAGGGGGCGTCGTCCTCCATGGAGCCGGGGAGGGCCGGCATGCTGCCGTGCCCCCAAT GAATTTTTTGACAACTCTCGGCAACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGTGA TAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCA GGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCATTGCTAAGGTTGAACGGGCATACT GTTCGGCCGGCGCGGATGAGAGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTG ACGGTCCAAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACAGAGCTGTCGTGCGAATGCCCTACGT TGTCGTATTTGATGGGCCGGAATAAATCCCTTTGAACCCCATTGGAGGCACGTCAACCCCATGGGCGGTG ACGGCCACTTGGATGCAACCCAGTCAGTGAGCCACCGCTGA >gi|2765632|emb|Z78507.1|PLZ78507 P.lindenii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCCCCAAAAAAACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTGGCTACTGTGGTGACCGTGAATTTCCGTCG AGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCCCCAAGTCAAATG AGATGGAACCGGCGGAGGGCATCGTCCTCCATGGAACCGGGGAGGGCCGGCGTGCTTCCGTCCCCCAATG AATTTTTTTGACAACTCTCGCAACGGATATCTCGCTCTTGCATCGATGAAGAACACAGCGAAATGTGATA AGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGG CTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCTCCCATTGCTAAGGCTGAACAGGCATACT GTTCGGCCGGCGCGGATGAGTGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTG ACGGCCGGAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTGTCGTGCGAATGCCCTGCGT TGTCGTATTTGATGGGCCGGAATAAATCCCTTTGAACCCCATTGGAGGCACGTCAACCCGTGGCGGTCGA CGGCCATTTGGATGCAACCCAGTCAGTGAGCCACCGCTGA >gi|2765631|emb|Z78506.1|PLZ78506 P.lindleyanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCAAAATATACGATCGAGTT AATCCGGAGGACTGGTGTAGTTTGGTCTCCCAGGGGCGTTGGCTACTGCGGTGACCATGATTTTCCATCG AGCCTCCTCGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCGTATG AGATAGAACCGGCAGAGGGCTTCGTCCTCCATGGAACCGGGGAGGACCGGCATGCCGCCGTACCCCCTTT GAATCGGGCTGACAACTCTCGTTCAAGGAGCCCTCAGCTCATAATGTGATAAGTGGTGTGAATTGCAGAA TCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTG GGCGTTGCGTGCTGCATCTCTCCCGTTGCTAAGGTCGAACAGGCATATACTGTTCGGCCGGCGCGGATGA GAGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTGACGGTAAAAAATCCGGCAA GAGGTGGACGGACGGTGGCTGCGACAAAGCTGTCGTGCGAATGCCCTACGTTGTCGTATTTGATGGGCCA GAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCATGGGCGGTTTGACGGCCATTGGATGCCA ACCCAGTCAGGTGAGGCCACCCGCTGA >gi|2765630|emb|Z78505.1|PSZ78505 P.sargentianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCCAAATATACGATCGAGTT AATCCGGAGGACTGGTGTAGTTTGGTCTCCCAGGGGCGGTGGCTACTGCGGTGACCATGATATTCCATCG AGCCTCCTCGGGAGATTTCTTGATGGCAATTGAACCCGTGGCCCGGCGCAGTTTCGCGCCAAGTCGTATG AGATAGAACCGGCAGAGGTCTTCGTCCTCCATGGAACCGGGGAGGCCCGGCATACCACCATACCCCCAAT GAATCTTTGTGACAACTCTCGTCAATGTGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTC TTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCT CTCCCGTTGCTAAGGTCGAACAGGCATACTGTTCGGTCGGCGCGGATGAGAGTTTGGCCCCTTGTTCTTC GGTGCGATGGGTCCAAGACCTGGGCTTTTGACGGTAAAAAATCCGGCAAGAGGTGGACGGACGGTGGCTG CGACAAAGCTGTCGTGCGAATGCCCTGCGTTGTCGTATTTGATGGGCCGGAATAAATCCCTTTTGAACCC CATTGGAGGCACGTCAACCCATGGGCGGTTGACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGCCACC CGCTGAGTTTT >gi|2765629|emb|Z78504.1|PKZ78504 P.kaiteurum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTTCGGAAGGATCATTGTTGAGACCGCAAAATATACGATCGAGTT AATCCGGAGGACTGGTGTAGTTTGTCTCCCAGGGGCGTTGGCTACTGCGGTGACCATGATTTTCCATCGA GCCTCCTCGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCGTATGA GATAGAACCGTCAGAGGGCATCGTCCCTCCATGGAGCCGGGGAGGGCCGGCATGCCCGCCGTGCCCCCAA TGAATCTTTTTGACAACTCTCGCAACGGATATCTCGCTCTTCATCGATGAAGAACGCAGCGAAATGTGAT AAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGCCATCAGG CTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCGTTGCTAAGGTCGAACAGACATACTGT TCGGCCGGCGCGGATGAGAGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTGAC GGTACCAAATCCGACAAGAGGTGGACGGACGGTGGCTGCGACAAAACTGTCGTGCGAATGCCCTACGTTG TCGTATTTGATGGGCCAGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCATGGGCGGTGAC GGCCATTGGATGCAACCCCAGTCAGTGAGCCACCGCTGAGTAA >gi|2765628|emb|Z78503.1|PCZ78503 P.czerwiakowianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACCAGGTTTCCGTAGGTGAACCTCCGGAAGGATCCTTGTTGAGACCGCCAAATATACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTCGCCGCTGTGGTGTCCGTGATTTACCATCG AGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCATGGCCCGGCGCAGTTTCGCGCCAAGTCATATG AGATAGAACCGGCAGGGGGCGTCGTCCTCCATGGAACCGGGGAGGGCCGGCATGCTACCGTACCCCCAAT GAATTATTTTGACAACTCTCGGCAACGGAGTCTCAGCTCTTTGTGATAAGTGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGC GTTGCGTGCTGCATCTCTCCCATTGCTAAGGTTGAACGGGCATACTGTTCGGCCGGCGCGGACGAGAGTT TGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTTTGACGGTCCAAAATCCGGCAAGAGGT GGACGGACGGTGGCTGCGACAAAGCTGTCGTGCGAATGCCCTACGTTGTCGTATTTGATGGGCCAGAATA AATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCATGGGCGGTTGACGGCCATTTGGATGCAACCCCA GGTCAGGTGAGCCACCCGCTGAGATAA >gi|2765627|emb|Z78502.1|PBZ78502 P.boissierianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACCAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGACCGCCAAATATACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTCGCCCCTGTGGTGACCGTGATTTGCCATCG AGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCATGACCCGGCGCAGTTTCGCGCCAAGTCATATG AGATAGAACCGGCAGGGGTCGTCGTCCTCCATGGAGCCGGGGAGGGCCGGCATACTACCGTCCCCCCAAT GAATTTTATATTGACAACTCTCGGCCGGAATCTCGGCTCTTGCATCGATGGAAGGACGCAGCGAAAATGT GATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCAT CAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCCCATTGCTAAGGTTGAACGGGCGTA CTGTTCGGCCGGCGCGGACGAGAGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAGACCTGGGCTTT TGACGGTCCAAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACAAAGCTGTCGTGCGAATGCCCTAC GTTGTCGTATTTGATGGGCCAGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAACCCATGGGCGG TTGACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGGCCACCCCGTGAGTTTACGC >gi|2765626|emb|Z78501.1|PCZ78501 P.caudatum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACCGCAAAATATACGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTGGTTACTGTGGTGACCGTGACTTTGCCGTC GAGCCTCCTTGGGAGATTTCTTGATGGAAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCATAT GAGATGGAACCGGCGGAGGGAATCGTCCTCCATGGAGCCGGGGAGGGCCGGCGTGTTGCCGTGCCCCCAA TGAATTTTTTTTTGGGCAACTCTCGGCCAAACGGGAAATCTCGGCTCCTTGCATCGGATGGAAGGACGCA GCGAAATTGTGATAAGTGTTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCG CCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCTCCCATTGCTAAGG CTGAACAGGCATACTGTTCGGCCGGCGCGGATGAGTGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCA AGACCTGGGCTTTTGACGGCCGGAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTGTCGA GCGAATGCCCTACGCTGTCGTATTTGATGGGCCGGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTC AACCCGTGGGCGGTCGACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGGCCACCCGCTGAGTTTAAGA >gi|2765625|emb|Z78500.1|PWZ78500 P.warszewiczianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGCTCATTGTTGAGACCGCAAAATAATTGATCGAGTT AATCCGGAGGACCGGTGTAGTTTGGTCTCCCAGGGGCTTTGGTTACTGTGGTGACCGTGACTTTGCCGTC GAGCCTCCTTGGGAGATTTCTTGATGGCAATTGAACCCTTGGCCCGGCGCAGTTTCGCGCCAAGTCATAT GAGATGGAACCGGCGGAGGGCATCGCCCTCCATGGAGCCGGGGAGGGCCGGCGTCCTGCCGTGCCCCCAA TGAATTTTTCTTTGGGAAAACTTCTCGGCCAACGGGAATCTCGGCTCTTTGCATCGGATGGAAGGACGCA GCGAATTGTGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCC CGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCGTTGCGTGCTGCATCTCTCTCCCATTGCTAAGGCT GAACAGGCATACTGTTCGGCCGGCGCGGATGAGTGTTTGGCCCCTTGTTCTTCGGTGCGATGGGTCCAAG ACCTGGGCTTTTGACGGCCGGAAATCCGGCAAGAGGTGGACGGACGGTGGCTGCGACGAAGCTGTCGTGC GAATGCCCTACGCTGTCGTATTTGATGGGCCGGAATAAATCCCTTTTGAACCCCATTGGAGGCACGTCAA CCCGTGGGCGGTCGACGGCCATTTGGATGCAACCCCAGGTCAGGTGAGGCCACCCGCTGAGTTTAAG >gi|2765624|emb|Z78499.1|PMZ78499 P.micranthum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAGGGATCATTGTTGAGATCGCATAATAATTGATCGAGAT AATCCAGAGGATCGGTTTACTTTGGTCACCCTTGGGCGCCTGCTATTGCGGTGACCTAGATTTTCCATGG AGGGAGCCTCCTTGGGAGCTTTCTTGCCGGCGATCTAACCCTTGCCCGTCGCAGTTTTGCACCAAGTCAT ATGACACATAAATGGTGAAGGACATACCCCCTTCGTTGAATTCGAGGAGGGGACGGCATGTGGCCTTGAC CTCTCCCAATTATTTTTTTGACAACTCTCAGCCAACGGATATCTCGGCTCTTTGCATCGGATGGAGGACG CAGCGAAATGCGATAAGTGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGC CCAAGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTC CATGCATACTGTTCAGCCGGTGCGGATGTGAGTTTGCCCCCTTGTTCTTTGGTGCTGGGGGTCTAAGAGC TGCAGGGGCTTTTGATGGTCCTAAATTCGGCAAGAGGTGGACGAATCATGCTACAACAAAACTGTTGGGC GAATGCTCCAGGTTGTCGTATTAGATGGGCCATCATAATCTAGAGACCCTTGTGAACCCCATTGGAGGCC CATCAACCCATGATCAGTTGATGGCCTTTTGGATGCGACCCCAGGTCAGGTGAGCAACC >gi|2765623|emb|Z78498.1|PMZ78498 P.malipoense 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAAGGTCATTGTTGAGATCACATAATAATTGATCGAGTT ACTCCAGAGGATCAGTTTACTCCGGTCACCCATGGGTGCTTGCTATTGCGGTGACCTAGATTTGCCATGG AGCCTCCTTGGGAGTTTTCTTGCCGGCGATCTTACCCTTGCCCGGGGCAGTTTTGCCCCAAGTCATATGA CACAATAATGGCGAAGGAGGGGGCGGCATTTTGCCCTTGACCCTACAATCACTCCCCCTCTCCAAATTAT TTTTGGACAACTCTCAGCAACGGATATCTCGGCTCTTGCATCGATGAAGAACCCAGCGAAATGCGATAAG TGGTGTGAATTGCAGGATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCAAGGCCATCAGGCC AAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTACATGCATACTGTTCA GCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTCGGTGCTGGGGGTCTAAGAGCTGCAGGGGCTTTTGA TGGTCCTAAATTCGGCAAGAGGTGGACGAATTACAACAAAACTGTTGTGCGAATGCTCCAGGTTGTCGTA TTAGATGGGCCAGCATAATCTAAAGACCCTTGTGAACCCCACTGGAGGCACATCAACCCGTGATCAGTTG ATGGCCATTTGTTGCGACCCCAGTCAGTGAGCAACCCGCTGAGTTTAAGC >gi|2765622|emb|Z78497.1|PDZ78497 P.delenatii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTG AATCCAGAGGATCAGTTTACTTTGGTCGCCCATGGGCGCTTGCTATTGCGGTGACCTAGATTTGCCATGG AGCCTCCTTGGGAGCTTTCTTGCCGGCGATCTAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCACATGA CACATAAATGGTGAAGGGCACGGCCCTTTGTGAATTCAAGGAGGTGAAGGGCATGTGGCCTTGAGCCTAC ACTCCCTCCCCCTCTCCAAATTATTTTTTGTGAAACAACTCTCAGCAACGGAGATCTCAGCTCTTGCATC GATGAAGGAACGCAGCGAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGA ACGCAAGTTGCGCCCAAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCC TTAACGAGGCTGTCCAGGCATACTGTTCAGCCGGTGCGGGTGTGAGTTTGGCCCCTTGTTCTTTGGTGCT GGGGGTCTAAGAGCTGCAGGGGCTTTTGATGGTCCTAAATTCGGCAAGAGGTGGACGCAACGCGCTACAA CAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAACACCCTTGTGAA CCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTTGCGACCCCAGGTCAGGTGAGGC AACCCGCTGAGTTTAAGC >gi|2765621|emb|Z78496.1|PAZ78496 P.armeniacum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCGCATAATAATTGATCGAGTT AATCCAGAGGATCGGTTTACTTTGGTCACCCTTGGGCGCCTGCTATTGCGGTGACCTAGATTTGCCATGG AGGGAGCCTCCTTGGGAGCTTTCTTGCCGGCGATCTAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCAT ATGACACATAATTGGTGAAGGGCATATCCCTTCGTGAATTCGAGGAGGGGCCGGCATGTGGCCTTGACCT CTCCAATTAATTTTTTGAACAACTCTCAGCAACGGATATCTCGGCTCTTGCATCGATGGAGGGACGCACC GAAATGCGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCC AAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCC ATGCATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTGCTGGGGGTCTAAGAGCT GCAGGGGCTTTTGATGGTCCTAAATTCGGCAAGAGGTGGACGAATCATGCTACAACAAAACTGTTGGGCG AATGCTCCAGGTTGTCGTATTAGATGGGCCATCATAATCTAGAGACCCTTGTGAACCCCATTGGAGGCCC ATCAACCCATGATCAGTTGATGGCCTTTTGGGTTGCGACCCCAGGTCAGGTGAGGCAACCAGCTGAGTTT AAGC >gi|2765620|emb|Z78495.1|PEZ78495 P.emersonii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGAT AATCCAGAGGATCGGTTTACTTTGGTCACCCATGGGCGCTTGCTATTGCGGTGACCTAGAGTTGCCATGG AGAGCCTCCTTGGGAGCTTTCTTGCCGGCGATCTAACCCTTGTCCGGCGCGGTTTTGCGCCAAGTCATAT GACACATAATTGGTGAAGGGCATAGCCCTTCGTGTATTCAAGGAGGGGGGGCGGCATGTGGCCTTGACAC TGCACTCGCTCTCCCCCTCTCCAAAGTATTTTTCTGAACAACTCTCAGCAACGGATATCTCAGCTCTTGC ATCGGATGGAGGAACGCAGCGAAATCCGATAAGTGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCT TTTGAACGCAAGTTGCGCCCGAGGCCATGAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATCTCT CTCCCTCAATGAGGCTGTCCATGCATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTG GTGCTGGGGGTCTAAGAGCAGCAGGGGCTTTTGATGGTCCTAAATTCGGCAAGAGGTGGACGAATCAGGC TACAACAACACTGTTGTTGTGCGAATGCTCCAGGTTGTCGTATTAGATGGGCCGGCATAATCCAGAGACC CTTGTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTCGGTTGCGACCCCAGGTCA GTGAGCAACCCGCTGAGTG >gi|2765619|emb|Z78494.1|PNZ78494 P.niveum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGGTCGCATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGACATTTACTGTTGCAGTGACCTAGATTTACCATCG GGCCTCCTTGGGAACTTTCCTGCTGGCGATCTATACCCTTGCCCGGCGCAGTAATGCGCCAAATCAAATG ACCCATAATTAATGAAGGGGGACGGCATACTGCCTTGACCAACTCCCCATTATTGAGGTAACACTCTCAA CTTCGGATATCTCAGGTGTGAATTGCAGAATCCCGTTAACATCGAGTCTTTGAACGCAAGTTGGGCCCGA GGCCAACAGGCCAAGGGAACGCCTGTCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCAT ACGTACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTCGGTACGGGGGGTCTAAGAGCTGC ATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAA TGCCCCGGGTTGTTGTGTTTAATCAGAAGACCCTTTTGAACCCCATTGGAGGCCCATCGACCCATGATCA GTTGAATGGCCATTTGGTTGCGATCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTAAG >gi|2765618|emb|Z78493.1|PGZ78493 P.godefroyae 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGATTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCGCATAATAATTGATCGAGTT AATCTGGAGGATCGGTTTACTTTGGTCACCCATGGGCATTTTCTGTTGCAGTGACCTAGAATTTCCATCG GGCCTCCCTGGGAGCTTTCCTGCTGGCGATCTATACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCAAATT TTACATAAGTGGTGAAGGGGGGCGGCATTCTTCCTTGACCAGCCCCCAAGTATTTAGGTAACAACTCTCA GCAACGGATATCTCGGCTCATGCATCGATGAAGGAACGCAGCGAGATTCGATAAATGGTGTGCCTTGCAG AATCCCGTGAACCATCGAATCTTTGAACGCAAGTTGCGCGCGAGGCCATCAGCCCAAGGGGACGCCTGCC TGGACATTGCGACTCATATCTCTCCCTTAATGAGGCTGTCCAAACGTACTGGTCATCCGGTGTGGATGTG AGTTTGGCCCCTTGTTCTTCGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGG CAAGAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTTGTGTTTAATCAGA AGACCCTTTTGAACCCCATTGGAGGCCCATCGACCCATGATCAGTTGAATGGCCATTTGGTTGCGATCCC AGGTCAGGTGAGGCAACCC >gi|2765617|emb|Z78492.1|PBZ78492 P.bellatulum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCGCATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCACGGGCATTTGCTGTTGCAGTGACCTAGAATTTGCCATC GAGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTATACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATAT GTCACATAATTGGTGAAGGGGGGGAGCGTACTGCCTTGACCCACTCCAAATTATTTTTTTAACAACTCTC AGCAACGGATATCTCGGCTCTTGCATCGATGTAGAACCCAGCGAAATGCGATACTGGTGTGATTTGCAGA ATCCCGTGGACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCT GGGCATTGCGAGTCAAATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGA GTTTGGCCCCTTGTTCTTTGGGACGGGGGGTCTAAGAGCTGCACGGGCTTTTGATGGTCCTAAATACGGC AAGAGGTGGACGAATTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTTGTGTTACATGGGCC AGCTTAATCAGAAGACCCTTTTGGACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATTGGCCATTT GGTTGCGATCCCAGTCAGGTGAGGCACACCGCTGAGTTTAATA >gi|2765616|emb|Z78491.1|PCZ78491 P.concolor 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCGCATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCACGGGCATTTGCTGTTGCAGTGACCTAGATTTGCCATCG GGCCTCCTTAGGAGCTTTCTTGCTGGCGATCTATACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGTGTTGGGGGGAGGCGTGCTGCCTTGACCCGCTCCAAATTATATTTTTAACAACTCTCA GCAACGGATATCTCGGCTCTTGCATCGATGAAGAACCAGCGAAATGCGATAAATGGTGTGAATTGCAGAA TCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTG GGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAG TTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCA AGAGGTGGACGAACTATGCTACAACAAAATGTTGTGCGAATGCCCCGGGTTGTTGTGTTACATGGACCAG CATAATCAGAAGACCCTTTGGACCCCATTAGAGGCCCATCAACCCATGATCAGTTGAATGGCCATTTGTT GCGATCCCAGTCAGGTGAGCAACCCGCTGAGATAAGC >gi|2765615|emb|Z78490.1|PFZ78490 P.fairrieanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTGTTGCAGTGACCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTGAACCCTAGTCCGGCGCAGTTTTGCGCCAAGTCATATG GCACATAATTGGTGAAGGGGGCGGCATGCTGCCTCGACCCTCCCCAAATTATTTTTTAACAACTCTCAGC AACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAAT CCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGG GCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCAAACATACTGTTCAGCCGGTGCGGATGTGAGT TTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAACGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAA GAGGTGGACGACTGTTCTGCAACAAGTGTTGTGCGAATGCCCCGCGTTGTCGTATTAGATGGGCCAGCAT AATTTGAAGACCCTTTTGAACCCCATTGGAGGCCCGTCAACCCATGATCAGTTGACGGCCATTTGGTTGC GACCCCAGTCAGGTGAGCAACCAGCTGA >gi|2765614|emb|Z78489.1|PDZ78489 P.druryi 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCGAGGGCATTTGCTATTGCAGTGACCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCGAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGTGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAGATTATTTTTTAACAACTCTCAGC AACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAAT CCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGG GCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGGGGATGTGGGT TTGGCCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCATGGGATTTTGATGGTCCTAAATACGGCAA GAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGAGTTGTCGTATTAGATGGGCCCA GCATATCTGAAGACCCTTTTGAACCCCATGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTT GCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTAGGC >gi|2765613|emb|Z78488.1|PTZ78488 P.tigrinum 5.8S rRNA gene and ITS1 and ITS2 DNA CTGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACGCAATAATTGATCGAGTTAATCTGGAGGATC AGTTTACTTTGGTCACCCATGGGCATTTGTTATTGCAGTGACCGAGATTTGCCATCGAGCCTCCTTGGGA GCTTTCTTGCTGGCGATCTTAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATACGACACATAATTGGT GAAGGGGGCGGCATGGTGCCTTGACCCTCCCCTAATTATTTTCTAACAACTCTCATCAACGGGATGGAGA ACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACCCAAGTT GCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCAAATCTCTCCCTTAATGAGG CTGTCCATACATACTGTTCAACCGGTGCGGATGTGAGTTTGCCCCCTTGTTCATTGGTACGGGGGGTCTA AGAGCTGCATGGGCTTTTGATGGTCCTAAAAACGGCAAGAGGTGGACGAACAACGCCACAACCAAACTGT TGTGCGGATCCCCCGGGTTGTCGTATTAGATGGGCCATCATAATCTGAAGACCCTTTTGAACCCCATCGG AGGCCCATCAACCCATGATCAGTTGATGGACATTTGTTGCGACCCCAGTCAGGTGAGCAACCGGCT >gi|2765612|emb|Z78487.1|PHZ78487 P.hirsutissimum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT ACTCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTATTGCAGTGACCGGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGTGAAGGGGGCGGCATGCTGCCTTTACCCTCCCCAAATTATTTTTTAACAACTCTCAGC AACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAAT CCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGG GCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATATTGTTCAGCCGGTGCGGATGTGAGT TCGGCCCCTTGTTCTTCGGTACGGGGGGTCTAAGAGCAGCATGGGCTATCGATGGTCCTAAATGCGGCAA GAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAG CGTAATCTAAAGACCCTTTTGAACCCCATTAGAGGCCCATCAACCCATGATCAGTTGGGGCCACTTGTTG CGACCCCAGTCAGGTGAGCAACCGCTGAGTAA >gi|2765611|emb|Z78486.1|PBZ78486 P.barbigerum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTCACGAGGTTTCCGTAGGTGAATCTGCGGGAGGATCATTGTTGAGATCACATAATAATTGATCGAGAT TATCTGGAGGATCAGTTTACTTTGGTCACCCATGGACATTTGCTATTGCAGTGCCCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGTGAAGGGTGCGGCATGGTGCCTGACCCTCCCCAAATTATTTCTTAACAACTCTCAGCA ACGGATATCTCGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGC ATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTT GGCCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCGTGGGCTTTTGATGGTCCTAAATACGGCAAGA GGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCA TAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTAG CGACCCCAGGTCAGGTGAGGCAACCCGCTGA >gi|2765610|emb|Z78485.1|PHZ78485 P.henryanum 5.8S rRNA gene and ITS1 and ITS2 DNA CTGAACCTGGTGTCCGAAGGTGAATCTGCGGATGGATCATTGTTGAGATATCATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCATGGGCATTTGCTATTGCAGTGACCGAGATTTGCCATCGA GCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGGGCAGTTTTGCGCCAAGTCATATGA CACATAATTGGTGAAGGGTGCGGCATGGTGCCTTGACCCTCCCCAAATTATTTCTTAACAACTCTCAGCA ACGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATC CCCGTGAACATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGG CATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTGCAGCCGGTGCGGATGTGAGTT TGGGCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCGTGGGCTTTTGATGGTCCTAAATACGCCAAG AGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGACGGGCCAGC ACAATCTAAAGACCCCTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATGTGTTG CGACCCCAGTCAGCTGAGCAACCCCTGATTTAGTA >gi|2765609|emb|Z78484.1|PCZ78484 P.charlesworthii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGGGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGGCTATTGCAGTGACCGAGAGTTTACCAT CGAGCCTCCATGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGGCCCAAGTCATA TGACACATAATTGTGAAGGGGCGGCATGTTTCCTACCCTCCCAACTCTCAGCAACGGATATCTCGCTCTT GCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCT TGGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTC TCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCATTGG TACGGGGGGTCTAAGAGCTGCGTGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCT ACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTT GACACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGTCCATTGGGTTGCGACCCCAAGTCAGGT GAAGCAACTCCCTGAGTTTT >gi|2765608|emb|Z78483.1|PVZ78483 P.villosum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTATTGCAGTGACCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGTGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCCAAATTATTTTTTAACAACTCTCAG CAACGGAAATCTGGCCTCTTGCATGGATGAAGACCAAACCGAAATCATAAATGGTGTGAATTGCAGAATC CCGTGAACAATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGG CATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCACACATATCTGTTCAGCCGGTGCGGATGTGAGT TTGGCCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGTTGGTCCTAAATACGGCAA GAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAG CATAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGT TGCGACCCCAGGTCAAGTGAAGCAACCCCTGAGTTTAGCA >gi|2765607|emb|Z78482.1|PEZ78482 P.exul 5.8S rRNA gene and ITS1 and ITS2 DNA TCTACTGCAGTGACCGAGATTTGCCATCGAGCCTCCTGGGAGCTTTCTTGCTGGCGATCTAAACCGTAGC CCGGCGCAGTTTTGCGCCAAGTCATATGACACATAATTGGTGAAGGGGGCGGCATGCTGCCTTGACCCTC CCCAAATTATTTTTTAACAACTCTCNGCAACGGATATCTCGCCTCTTCATCGATGAAGAACGCAGCGAAA TGCGATAAATGGTGTGAATTGCAGAATCCCGTGAANCCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGG CCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATAC ATACTGTTCAGCCGGTGCGGATGTGCGTTTGGCCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCGT GGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATG CCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCA ACCCATGATCAGTTGATGGCCATTTGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTAGCA >gi|2765606|emb|Z78481.1|PIZ78481 P.insigne 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTATTGCAGTGACCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGCGAAGGGGGCGGCATGGTGCCTTGACCCTCCCCAAATCATTTTTTTAACAACTCTCAG CAACGGAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCACACATAC TGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCATTGGTACGGGGGGTCTAAGAGCTGCGTGGGC TTTTGTTGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCTACAACAAAACTGTTGTGCGAATGCCCC GGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCC ATGATCAGTTGA >gi|2765605|emb|Z78480.1|PGZ78480 P.gratrixianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTATTGCAGTGACCGAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTAGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGCGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAAATTATTTTTTAACAACTCTCAGC AACGGATAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTCAATGAG GCTGTCCACACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCATTGGTACGGGGGGTCT AAGAGCTGCGTGGGCTTTTGTTGGTACCTAAATACGGCAAGAGGTGGACGAACTATGCTACAACAAAAAT GTTGTGCGAATGCCCCGGGTTGTCGTATAGATGGGCCAGCATAATCTAAAGACCCTTTTGAACCCCATTG GAGGCCCATCAACCCATGATCAGTTGA >gi|2765604|emb|Z78479.1|PPZ78479 P.primulinum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCAGGAGGATCAGGTTACTTTGGTCACCCATGGGCATTTGCTGTTTCAGTGACCTAGATTTGCCATCG AGCCGAACTAAACCCTTGCCCGGCGCAGATTTGCGCCAATTTATATGAGACATTACTGGAAGGGGAGGGA TGCTGCCTTGCCTTGCCCCCCAAATTATTTTTTAACAACTCTCAGCAACGGATATCTCGCCTCTTGCATC GATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATACAGAGATCCCGTGAACCATCGAGTCTTGAAC GCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGACATATCTCTCCCTT AATGAGGCTGTCGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGA GCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCGACAACAGAACTGTTGT GCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGAACCCCATTGGAGG CCCATCAACCCAAGATCAGTTGACGGCCATTTGGATGCGACCCCAGGTCAGGTGAGGCAACCCTCTGAGT >gi|2765603|emb|Z78478.1|PVZ78478 P.victoria 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCAGTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGGGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTGTTGCAGTGGCCTAGAGTTTGCCATC GAGCCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATGACACATAACTGGAAGGGGCGGC ATGCTGCCATGGCTCCCCCAAATATTGATAATGGCGTGATAGCAGATCCCTGAACATCGAGTTTTGAACG CATGTTGCGTCCGAGGCCATCAGGTCAAGGGGACGCCTGCCTGGAAATTGTGAGACATATCTCTCCCTTA ATGAGGCTGCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTCCTTTGGTACGGGGG TCTAAGAGCTGTATGGGTTGGATGGTCCTAAATACGGCAAGAGGTGGACGAGCTATGTGACAACAGAACT GTTGTGCGAATGCCCCGGTTGTCGTTTAGATGGGTCAGCATAATCTAAAGACCCTTTTGACCCCCATTGG AGGCCCATCAACCCATTATCAGTTGAGGACATTTGGTTGCGACCCAGGTCAGATGAGGCACCCGCTGAGT TTAGGC >gi|2765602|emb|Z78477.1|PVZ78477 P.victoria 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATGATAATTGATCGAGTT AATCTGGAGGATCAGTTTGCTTTGGTCACCCATGGGCATTTGCTGTTGCAGTGACCTAGATTTGCCATCG AGCCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATGACACATAATTGGAAGGGGCGGCA TGCTGCCTTGCCCTCCCCAAATATTTGTTAACCAACTCTCAGCAACGAGTATCTCGGCTCTTGCATCGGA TGGAAGGACGCAGCGAAATGCGATAAATGGTGTGAATTGCAAGAATCCCTGAACCATCGAGTCTTTGGAA CGCAAGTTGCGGCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGACATATCTCTCCCT TAATGAGGCTGTCCACACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGG GGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCGACAAC AGAACTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGAAC CCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTTGCGACCCCAGGTCAGGTGAGGCA ACCGCTGAGTTTATGC >gi|2765601|emb|Z78476.1|PGZ78476 P.glaucophyllum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATGATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATTTGCTGTTGTAGTGACCTAGATTTGCCATCG AGCCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATGACACATAATTGGAAGGGCGGCAT GCTGCCTTGGCCCTCCCCAAATTATTTTTTTAACAACTCTCAGCAACGGATATCTCGGCTCTTAGGCCAT CCGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGACATATCTCTCCCTTAATGAGGCTGTCCATACATAC AGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGC TTTTGATCCACCTAAATACGGCAAGAGGTGGACGAACTATGCGACAACAGAACTGTTGCGCGAATGCCCC GGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGAATCCCATTGGAGGCCCATCAACCC ATGATCAGTTGACGGCCATTTGGTTGCGACCC >gi|2765600|emb|Z78475.1|PSZ78475 P.supardii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCGTCCCGGCGCAGTTTTGCGCCAAGTCATATGA CACATAATTGGAAGGGGGTGGCATGCTGCCTTGACCCTCCCCAAATTATTTTTTTGACAACTCTCAGCAA CGGATATCTCGGCTCTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNATCAGGCCAAGGGCACGCCTGCCTGGG CATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCAATGCGGATGTGAGTT TGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCAAAATACGGCAAG AGGTGGACGAACTATGCTACAACAAAATTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGC ATAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTT GCGACCCAGGTCAGGT >gi|2765599|emb|Z78474.1|PKZ78474 P.kolopakingii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACGTAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTTCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCCAATCATATG ACACATAATTGGAAGGGCGGCATCCTGCCTTGACCCTCCCCAAATTATATTTTTGACAACTCTCAGCAAC GGATATCTCGCCTCTTGCATCGATGAAGACACAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCG TGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCAT TGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGG CCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCAAAATACGGCAAGAGG TGGACGAACTATGCTACAACAAAATTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATA ATCTACAGACCCTTCTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTTGCG ACCCCAGGTCAGGTGAAGCAACCCGTTGAGCTT >gi|2765598|emb|Z78473.1|PSZ78473 P.sanderianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGGGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGTAGTGACCTGGATTTGCCATCG AGCCTCCATGGGAGCTTTCTTGGTGGCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAAATTATTTTGTTAACAACTCTCAGCA ACGGATATCTCGGCTCTTCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATC TCTCCCTTCAATGAGGCTGTCCATACATACTGTTCAGTCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTT GCCTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTACCTAAATACGGCAAGAGGTGGACGAACTA TGCTACAACAAAATTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACC CTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTTGCGACCCAGG >gi|2765597|emb|Z78472.1|PLZ78472 P.lowii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTAGTCACCCATGGGCATCTGCTCTTGCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAATCGTTGCCCGGCGCAGTCTTGCGCCAAGTCATTTC ACACATAATTGGAAGGGGGCGGCATGCAGTCTAAGACCCTCCCCAAATTATTTTTTGATAACTCTCAGCA ACGGAATCTCGGCTCTTGCATCGATGGAGGACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGC ATTGCGAGTCATATCTCTCCTTTAATGAGGCTGTCTATACATACTGTTCAGCCACAGCGGATGTGAGTTT GGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCTTAAATACGGCAAGA GGTGGACGAAGTATGCTACAACAAAATTGTAGTTCGAATGCCCAGGGTTGTCGTATTAGATGGGCCAGCA TAATCTAAAGACCCTTTGAACCCCTTTAGAGGCCAATCAACCCATGATCAGTTGATGGCCATTTGGTTGC GACCCCAAGTCAGGTGAGGCAACCGCTGAGTTTAAGC >gi|2765596|emb|Z78471.1|PDZ78471 P.dianthum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTAGAGGATCGGTTTACTTTGGTCACCCATGGGCATCTGCTCTTACAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTGTCTTGCTGGCGATCTAAATCGTTGCCCGACGCAGCCTTGCGTCAAGTCACCCC GACACATAATGGAAGGGGGCGGCATGCTGCCTTGACCCTTCCCCAAATTAATTTTTTGACAACTCTCAAC ATCGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAAT CCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCTTGG GCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCAGTGCGGATGTGAGT TTGGCCCCTTGTTCTTTAGTACGGGGGGTCTAAAAGCTGCATGGGCTTTTGCTGGTCCTAAATACGGCAA GAGGTGGACAAAGTATGCTACAACAAAATTGTAGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAG CATAATTTAAAGACCCTTTTGAACCCCATTAGAGGCCCATCAACCCTGATCAGTTGATGGCCATTTGGTT GCGACCCCAAGTCAGGTGAGGCAACCCGCTGAGTTTAAGC >gi|2765595|emb|Z78470.1|PPZ78470 P.parishii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTAGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTACAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAATCGTTGCCCGACGCAGCCTTGCGTCAAGTCATATG ACACATAATTGGAAGGGGGCGGCATGCTGCCTTGACCCTTCCCAAATTATTTTTTTAAGTTGCGCCCGAG GCCATCAGGCCAAGGGCACGCCTGCTTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATA CATACTGTTCAGCCAGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTACTACGGGGGGTCTAAAAGCTGCA TGGGCTTTTGCTGGTCCTAAATACGGCAAGAGGTGGACAAAGTATGCTACAACAAAATTGTAGTGCGAAT GCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATTTAAAGACCCTTTTGAACCCCATTAGAGGCCCATC AACCCTGATCAGTT >gi|2765594|emb|Z78469.1|PHZ78469 P.haynaldianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTAGTCACCCATGGGCATCTGCTCTTGCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAATTCGTTGCCCGGCGCAGTCTTGCGCCAAGTCATAT CACACATAATTGGAAGGGGGCGGCATGCGGTCTAGACCCTCCCCAAATTATTTTTTTGACAACTCTCAGC AACGGATATCTCGGCTCTTCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCC TTAATGAGGCTGTCCATACATACTGTTCAGCCACAGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACG GGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTACCTAAATACGGCAAGAGGTGGACGAAGTATGCTACA ACAAAATGATAGTGCGAATGCCCAGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCCTTTTGA ACCCCATTAGAGGCCCATCAACCCATGATCAGTT >gi|2765593|emb|Z78468.1|PAZ78468 P.adductum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCGCATAATAATTGATTGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACTCATGGGAATCTGCTCTTGTAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGATGGCGATCTGAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGGAGGGGCAGCATGCTGCCTTGACCCTCCCCATATCATTTTTTTAACGACTCTCAGCTC CGGAACTCAAGTTGCGCCCGAGGCCATCAGGCTAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTC TCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCAGTGCGGATGTGAGTTTGGCCCCTTGTTCTTCGG TACGGGGGGTCTAAGAGCAGCTGGGCTTTTGATGGACCTAAATACGGCAAGAGGTGGACGAAGTATGCTA CAACAAAATTATTGTGTGAATGCCCCGGGTTGTCGTATAGATGGGCCAGCATAATCTAAAGACCCTTTTG AACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTT >gi|2765592|emb|Z78467.1|PSZ78467 P.stonei 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGAAGGGGGTGGCATGCTGCCTTGACCCTCCCCAAATTATTTTTTGACAACTCTCAGCAA CGGATATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGTACGCCTGCCTGGGC ATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTT GGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGTGCCTTTGGTGGTCCAAAATACGGCAAGA GGTGGACGAACTATGCTACAACAAAATTGTTGTGCGAATGACCCGGGTTGTCGTATTAGCTGGGCCAGCA TAATCTAAAGACCCTCTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATATGTTTG CGACCCAGGTCAGGTGAGGCAACCCGCTGA >gi|2765591|emb|Z78466.1|PPZ78466 P.philippinense 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGTAGTGACCTGGATTTGCCATCG AGCCTTCATGGGAGCTTTCTTGCTGGCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAAATTATTTTTGTAACAACTCTCAGCA ACGGATATCTCGGCTCTTTGCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATAT CTCTCCCTTAATGAGGCTGTCCATACATACAGTTCAGCCTGTGCGGATGTGAGTTTGGCCCCTTGTTCTT GCGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTAT GCTACAACAAAATTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGCATAATCTAAAGACCC TTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTTGCGACCCAGGTCAGG TGAGGCAACCC >gi|2765590|emb|Z78465.1|PRZ78465 P.rothschildianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGCAGTGACCTGGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGCTGGCGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATG ACACATAATTGGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAAATTATTTTTTTGACAACTCTCAGCA ACGGATTTCTCGGTTCTTGAATCGATGAGGAACGCAGCGAAATGCGATAATTGGTGTGAATTGAAGAATC CCGTAAACCATCGAGTCTTTGAACGAAAGTTGCGCCCGAGGCCATCAGGCCAAGGGAACGCCTGCCTGGG CATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAGCGAGTGCGGATGTGAGTT TGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAG AGGTGGACGAACTATGCTACAACAAAATTGTTGTGCGAATGCCCCGGGTTGTCGTATTAGATGGGCCAGC ATAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTT GC >gi|2765589|emb|Z78464.1|PGZ78464 P.glanduliferum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAGCGGAAGGGTCATTGTTGAGATCACATAATAATTGATCGGTTGAGTC TGGAGGATCAGTTTACTTTGGTCACCCATGGGCATCTGCTCTTGTAGTGACCTGGATTGCCATCGAGCCT CCTTGGGAGCTTTCTTGCTGGAGATCTAAACCCTTGCCCGGAGCAGTTTTGCGCCAAGTCATATGACACA TAATTGGAAGGGGGCGGCATGCTGCCTTGACCCTCCCCAAATTATTTTCTTAACAACTCTCAGCAACGGA TATCTCGGCTCTTGCATCGATGAAGAACGCAGCGAAATCCGATAAATGGTGTGAATTTCAGAATCCCGTG AACCATCGAGTCTTTGAACGCCAAGTTCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTT CGAATCAAATCTCTCCCTTAATGAGGCTGTCCAAACATACTGTTCAACCGGTTCGGATGTGAGTTTGGCC CCTTTTTCTTTGGGGCGGGGGGTCTAAGAACTTCATGGGCTTTTGGTGGTCCTAAAAACGGCAAGAGGTG GGCGGACTATTCTTCAACCAAATTTCTGTTCGGATTCCCCGGGCTTTCGTAATAGATGGGCCAGCATAAT CTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTGCGACC CCAGGTCAGGTGAGCAACCCGCTGAGTTTAAGC >gi|2765588|emb|Z78463.1|PGZ78463 P.glanduliferum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGTTCATTGTTGAGATCACATAATCATTGTTCGGTTG AGTCTGGAGGATCAGTTTACTTTGGTCACCATGGGCATCTGCTCTTGTAGTGACCTGGATTGCCATCGAG CCTCCTTGGGAGCTTTCTTGCTGGGGATCTAAACCCTCGCCCGGGGGAGTTTTGCGCCAAGTCATATGAC ACATAATTGGGAGGGGGCGGCATGTTGCCTTGACCCTCCCCAAATTATTTTCTTAACAACTCTCAGCAAC GGATATCTCGGCTCTTGCATCGATGGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGC ATTGCGAGTCATATCTCTCCCTTAATGAGGCTGTCCATACATACTGTTCAACCGGTGCGGATGTGAGTTT GGCCCCTTTTTCTTTGGGGCGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGA GGTGGACGAACTATGCTGCAACAAAATTGCTGTGCGAATACCCCGGGTTGTCGTATTAGATGGGCCAGCA TAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGACGGCCATTTGGTTG CGACCCCAGATCAGGTGAGCAACCCGCTGAGTTTAAGC >gi|2765587|emb|Z78462.1|PSZ78462 P.sukhakulii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTCACGAGGTCTCCGGATGTGACCCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGCAGGATCTGTTTACTTTGGTCACCCATGGGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGATTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATA NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCGCCTGCCTGGGCAT TGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGG CCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGG TGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTA ATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCAT >gi|2765586|emb|Z78461.1|PWZ78461 P.wardii 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGGT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGGGCAGTTGCTGCTGGAGTGACCTAGAATTTCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTACCCGGCGCAATTTTTCCCCCAGTCAAA TGACACATAATTGGTGGAGGGGGTGGCATTCTTCCCTGACCCTCCCCCAAATAATTTTTTCACAACTCTC AGCAACGGATATCTCGGCTCTTGCATCGATGAAGAACGCACCGAAATCCGATAAATGGTGTGAATTCCAG AATCCCGTGAACCATCGAGTCTTTGAACCCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGAACGCCTGCC TGGGCATTGCGAGTCATATCTCTCCCTTAACGAGCCTGTCCATACATCCTGTTCAGCCGGTGCGGATGTG AGTTTGCCCCCTTGTTCTTTGGTACGGGGGGTCTAAGACCTGCATGGGCTTTTGATGGTCCTAAATACGG CAAGAGGTGGACGAACTATGCTACACCAAAATTGTTGTCCAAAGCCCCCGGGTTGTCGTATAAGATGGGC CACCGTAATCTGAAGACCCTTTGAACCCCATTGGAGCCCATCAACCCATGATCAGTTGATGCCATTGTTG CGACCCAGTCAGTGAGCAAGCCGCTGAGTTAA >gi|2765585|emb|Z78460.1|PCZ78460 P.ciliolare 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATA TGACACATAATTGGTGAAGGGGGTGGCATCCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTC AGCAACGGGATATCTCGGCTCTTGCATCGGATGGAGGAACGCAGCGAAATGCGATAAATGGTGTGAATTG CAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCT GCCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGAT GTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCCAAATA CGGCAAGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATG GGCCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCA TTTGGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTA >gi|2765584|emb|Z78459.1|PDZ78459 P.dayanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATA TGACACATAATTGGTGAAGGGGGTGGCATCCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTC AGCAACGGATATCTCGGCTCTTGCATCGGATGGAGGAACGCAGCGAAATTGCGATAAATTGGTGTGAATT GCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCC TGCCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGA TGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAAT ACGGCAAGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGAT GGGCCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCC ATTTGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTT >gi|2765583|emb|Z78458.1|PHZ78458 P.hennisianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCGTA CGACACATAATTGGTGAAGGGGGTGGCATCCTTCCCTGACCCTCCCCAAATTATTTTTTAACAACTCTCA GCAACGGATATCTCGGCTCTTGCATCGATGGAGGACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGA TCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTG GGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAG TTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCA AGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAGAGGCCCCGGGTTGTCGTATTAGATGGGCCA CCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGG TTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTG >gi|2765582|emb|Z78457.1|PCZ78457 P.callosum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGGGCATTTTCTGTTGTAGTGACCTAGAATTTCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTTCCCCCAGTCAAA TGGCACATAATTGGTGGAGGGGGTGGCATTCTTCCCTGACCCTCCCCCAAATATTTTTTTAACAACTCTC AACAACGGATATCTCGGCTCTTTCATCGGATGAAGGACCGCAGCGAAATGCGATAAATGGTGTGAATTGC AGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTG CCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATG TGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATAC GGCAAGAGGTGGACGAACTATGCTACAACAAAATCGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGG GCCACCGTAATCTAAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCAT TTGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAG >gi|2765581|emb|Z78456.1|PTZ78456 P.tonsum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAATTTGCCATC GAGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCAT ATGACACATAATTGGTGGAGGGGGTGGCATCCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCT CAGCAACGGATATCTCCGGTCTGGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGATTGCAG AATCCCGTGAACATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCT GGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGA GTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGC AAGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGCC ACCGTAATCTGAAGACCCTTTTGGACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTG GGTTGCGACCCAGGTCAGGTGAGGCAACCCTGAGTTTAGC >gi|2765580|emb|Z78455.1|PJZ78455 P.javanicum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACCAGGTTTCCGTAGGTGGACCTTCGGGAGGATCATTTTTGAGATCACATAAAAATTGATCGAGTT AATCTGGAGGAACTTTTTACTTTGGTCACCCATGAACAATTTCTTTTGGAGTGACCTAGAATTTCCATCG AACCCCCTTGGGAACTTTCTTTTTGGCGAGAACTAAACCCTTTCCCGGCGCAGTTTTTCCCCCAATCAAA TTACACAAAAATGGTGGAGGGGGTGGCATCCTTCCCTTACCCTCCCCCAAATAATTTTTTAACAACTCTC AGCAACGGATATCTCGGCTCTTGCATCGGTTGAAGAACCAGCGAAATGCGATAAATGGTGTGAATTGCAG AATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCC TGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTG AGTTTGGCCCCTTGTTCTTTGGCACGGGGGGTCTAAGAGCTTCATGGGCTTTTGATGGTCCTAAATACGG CAAGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGC CACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTT GGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTAGCA >gi|2765579|emb|Z78454.1|PFZ78454 P.fowliei 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGAT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTACCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTTCTCCAAGTCATT TGACACATAATCGGTGAAGGGGGTGGCATCCTGCCCTGACCCTCCCCCCACTATTGTTAACAACTCTCAT CAACGGAACTCATGCGATAAATGGTGTGATTTGCAGAATCCCGTGAACCATCGAGTCTGTGAACGCAAGT TGCGGCCGAGGCCATCAGACCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAG GCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTCTGGTACGGGGGGTCT AAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCTACAACAAAATTG TTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTAATCTGAAGCCCCTTTTGAACCCATTGG AGGCCCATCAACCNCATGATCAGTTGATGGCCATTTGGATGCGACCCCAGGTCAGGTGAGGCAAC >gi|2765578|emb|Z78453.1|PSZ78453 P.schoseri 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAGTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAACTCATT TGACACATAACTGGTGAAGGGGGTGGCATCCTTCCCTGACCCTCCCCCAAATTATTTTTTAACAACTCTC AGCAACCGGATATCTCAGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCA GAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGC CTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGT GAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACG GCAAGAGGTGGACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGG CCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATT TGGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTAGCA >gi|2765577|emb|Z78452.1|PBZ78452 P.bougainvilleanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTATTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCA AGCCTCCTTGGGAGCTTTCTTTTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATA TGACACATAATTGGTGAAGGGGGTGGCATCCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTC AGCAACGGATATCTCGGCTCTTGAATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAG AATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCC TGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTG AGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGG CAAGAGGTGGATGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGC CACTGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTT GGATGCGACCCCAGGTCAGGTGAGGCAACCGCTGAGTTTAGCA >gi|2765576|emb|Z78451.1|PHZ78451 P.hookerae 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGTACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGAT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGGGCATTTGCTGTTGTAGTGACCTAGATTTCCATGGA GCCCCCCTGGGAGCTTTCTTGCTGGCGAGATCTAAACCCGTGCCCGGCGCAGTTTTGCGCCAAGTCATAT GACACATAATTGGTGTAGGGGGCGGGCATCCTGCCCTGACCCTCCCCAAAGTATTTTTTGCAACTCTCAA CAACGGAAATCTCGCTCTTTCATCGATGAAGAACCAGCGAAATCGATAAATGGTGTGAATTGCAGAATCC CGTGAACCATCGAGTCTTTGAACCCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACCCCTCCCTGGGC ATCGCGAGTCAAATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCACCCGGTGCGGATGTGAGTTT GCCCCCTTGTTCTTTGGTACGGGGGGTCTAAGACCTGCATGGGATTTTGATGGTCCTAAAAACGGCAAGA GGTGGACGAACTATCCCTACAATAAAATTGTTGTGCGAAGCCCCCGGGTTGTCGTATTAGATGGGCCACC GTAATCTGAAGACCCTATAGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGATG CGACACCAGTCAGTGAGCAACCAGCTGAGC >gi|2765575|emb|Z78450.1|PPZ78450 P.papuanum 5.8S rRNA gene and ITS1 and ITS2 DNA GGAAGGATCATTGCTGATATCACATAATAATTGATCGAGTTAAGCTGGAGGATCTGTTTACTTTGGTCAT CCATGAGCATTTACTGTTGAAGTGACCTAGATTTGCCATCGAGCCTCCTTGGGAGCTTTCTTGTTGCCGA GATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATATGACACATAATTGGTGAAGGGGGTGGCAT CCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTCAGCAACGGATATCTCGGCTCTTGCATCGA TGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACG CAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTCCGAGTCATATCTCTCCCCTA ACGAGGCTGTCCATACATACTGTTCATCCGGTGCGGATGTGAGTGTGGCCCCTTGTTCTTTGGTCCGGGG GGTCTAAGAACTGCATGGGCATATGATGGTCCTCAAAACTGGCAAGAGGTGGACGAACTATGCTACAACC AAATTGTTGTGCCAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTAACCTGTAGACCCTGTTGAACC CCATTGGAGGACCATCAACCCATGATCAGTTGATGACCATGTGTTGCGACCCCAGATCAGCTGAGCAACC CCTGAG >gi|2765574|emb|Z78449.1|PMZ78449 P.mastersianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAACTCATT TGACACATAATTGGTGAAGGGTGGCATCCTGCCCTGACCCTCCCCCAAATTATTTTTTTAACAACTCTCA GCAACGGATATCTCAGCTCTTGCATCGATGAAGAACGCAGCGAAAATGCGATAAATGGTGTGAATTGCAG AATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCC TGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTG AGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGG CAAGAGGTGGACGAACTATGCTACAACTAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGC CACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTT GGTTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGTTTATGC >gi|2765573|emb|Z78448.1|PAZ78448 P.argus 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAATTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTTCCCGGCGCAGTTTTGCGCCAAGTCGTA TGACACATAATTGGTGAAGGGGGGTGGCATCCTTCCCTTGACCCTCCCCAAATTATTTTTTTAACAACTC TCAGCAACGGATATCTCAGCTCTTGCATCGGATGGAAGAACGCACCGAAATGCGATAAATGGTGTGAATT GCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCC TGCCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGA TGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAAT ACGGCAAGAGGTGGACGAACTATGCTACAANAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGAT GGGCCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAGCCCATGATCAGTTGATGGCC ATTTGGNTGCGACCCCAGGTCAGGTGAGGCAACCCGCTGAGG >gi|2765572|emb|Z78447.1|PVZ78447 P.venustum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGATTCCGTAGGTGAACCTGCGGGAGGATCATTGTTGAGATCACATAATAATTGATCGAGTA ATCTGGAGGATCTGTTTACTTTGGTCACCCATGGGCATTTCCTGTTGAAGTGACCTAGAGTTGCCATCGA GCCTCCCTGGGAGCTTTCTTGTTGGCGAGAACTAAACCCTTACCCGGCGCAATTTTGCCCCCAGTCAAAT GACACATAAGTGGTGAAGGGGGTGGCATCCTATCTCGGCTCTTGCATCGATGAAGAACCCAGCGAAATGC GATAAATGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCAT CAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATAC TGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGC TTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTATGCTACACCAAAATTGTTGTGCAAAGGCCCC GGGTTGTCGTATTAGATGGGCCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCC ATGATCAGTTGATGGCCATTTGGTTGCGACCCCAGTCAGGTGAGGCAACCCGCTGAGTTTAAGC >gi|2765571|emb|Z78446.1|PAZ78446 P.acmodontum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTCCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTCCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCGCCAAGTCATA TGACACATAATTGGTGAAGGGGGTGGCATCCTCCCCAAATAATTTTTTAACAACTCTCAGCAACGGATAC TCGGCTCTTCATCGATGGAGGACCAGCGAAATTGCGATAATGGTGTGATTGCAGAATCCCGTGAACATCG AGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGATTGCGAGTCATA TCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCAGATGTGAGTTTGGCCCCTTGTTCT TCGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGCCCTAAATACGGCAAGAGGTGGACGAACTA TGCTACAACAAAATTGTTGTGCAAAGGCTCCGGGTTGTCGTATTAGATGGGCCACCGTAATCTGAAGACC CTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTTGCGACCCAGGTCAG GTGAGGCAACCC >gi|2765570|emb|Z78445.1|PUZ78445 P.urbanianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGGGTT AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAATTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCTCCAAGTCGTT TGACACATAATTGGTGAAGGGGGTGGCATCCTTCCCTGACCCTCCCCCAACTATTTTTTTAACAACTCTC AGCAACGGAGACTCAGTCTTCGGCAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGCACCATCGAG TCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATAT CTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTT TGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTGGACGAACTAT GCTACAACAAAATTGTTGTGCAGAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTAATCTGAAGACCC TTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTTGCGACCCCAGGTCAG GTGAGCAACAGCTGT >gi|2765569|emb|Z78444.1|PAZ78444 P.appletonianum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGGTGAACTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTGGGTCACCCATGGGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCATCCTTGTTGGCGATATCTAAACCCTCAATTTTTCCCCCAATCAAATTACACAAA ATTGGTGGAGGGGGTGGCATTCTTCCCTTACCCTCCCCCAAATATTTTTTTAACAACTCTCAGCAACGGA TATCTCAGCTCTTGCATCGATGAAGAACCCACCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTG AACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTG CGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCC CCTTGTTCTTTGGTACGGGGGGTCTAAGAGATGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTG GACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATAAGATGGGCCACCGATAT CTGAAGACCCTTTTGGACCCCATTGGAGCCCATCAACCCATGTCAGTTGATGGCCATT >gi|2765568|emb|Z78443.1|PLZ78443 P.lawrenceanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTT AATCTGGAGGATCTGTTTACTTGGGTCACCCATGGGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCG AGCCTCCTTGGGAGCTTTCTTGTTGGCGATATCTAAACCCTTGCCCGGCAGAGTTTTGGGCCACANNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNCAGCGAAATGCGATAATGGTGTGAATTGCAGAATCCCGTGA ACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGC GAGTCATATCTCTCCCTTAACGAGGCTGTCCATACACACCTGTTCAGCCGGTGCGGATGTGAGTTTGGCC CCTTGTTCTTTGGTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACGGCAAGAGGTG GACGAACTATGCTACAACAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCATAAT CTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATTTGGTTGCGAC CCAGTCAGGTGAGG >gi|2765567|emb|Z78442.1|PBZ78442 P.bullenianum 5.8S rRNA gene and ITS1 and ITS2 DNA GTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTG TTTACTTTGGTCACCCATGGGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCGAGCCTCCTTGGGAGC TTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGGAGTTTGGCGCCAAGTCATATGACACATAATTGGT GAAGGGGGTGGCATCCTGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTCAGCAACGGATATCTC GGCTCTTGCATCGATGAAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGAACCAT CGAGTCTTTGGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGGGAAT CATATCTCTCCCCTAACGAGGCTATCCAAACATACTGTTCATCCGGTGCGGATGTGAGTTTGGCCCCTTG TTCTTTGGTACCGGGGGTCTAAGAGCTGCATGGGCATTTGATGGTCCTCAAAACGGCAAGAGGTGGACGA ACTATGCCACAACAAAATTGTTGTCCCAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTAACCTGAA GACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGACCATTTGTTGCGACCCCAGT CAGCTGAGCAACCCGCTGAGT >gi|2765566|emb|Z78441.1|PSZ78441 P.superbiens 5.8S rRNA gene and ITS1 and ITS2 DNA GGAAGGTCATTGCCGATATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACTTGGTCACCC ATGAGCATTTGCTGTTGAAGTGACCTAGATTTGCCATCGAGCCTCCTTGGGAGTTTTCTTGTTGGCGAGA TCTAAACCCTTGCCCGGCGGAGTTGTGCGCCAAGTCATATGACACATAATTGGTGAAGGGGGTGGCATCC TGCCCTGACCCTCCCCAAATTATTTTTTTAACAACTCTCAGCAACGGATATCTCGGCTCTTGCATCGATG AAGAACGCAGCGAAATGCGATAAATGGTGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCA AGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAAC GAGGCTGTCCATACATACTGTTCATCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGG TCTAAGAGCTGCATGGGCATTTGATGGTCCTCAAAACGGCAAGAGGTGGACGAACTATGCTACAACCAAA TTGTTGTCCCAAGGCCCCGGGTTGTCGTATTAGATGGGCCACCGTAACCTGAAGACCCTTTTGAACCCCA TTGGAGGCCCATCAACCCATGATCAGTTGATGACCATGTGTTGCGACCCCAGTCAGCTGAGCAACGCGCT GAG >gi|2765565|emb|Z78440.1|PPZ78440 P.purpuratum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGGACCTCCGGGAGGATCATTGTTGAGATCACATAATAATTGATCGAGGT AATCTGGAGGATCTGCATATTTTGGTCACCCATGGGCAATTTCTGTTGTAGTGACCTAGAATTTCCATCG ACCCTCCTTGGGAGCATTCTTGTTGGCGAGAACTAAACCCTTACCCGGCGCAGTTTTTCCCCCAATCAAA TTACACAAAAATGGTGGAGGGGGTGGCATATCTTCCCTTACCCTCCCCCAAATAATTTTTTAACAACTCT CAGCAACGGATATCTCAGCTCTTGCATCGTTGAAGAACCCACCGAAATGCGATAAATGGTGTGAATTGCA GAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCCCGAGGCCATCAGGCCAAGGGCACGCCTGC CTGGGCATTGCGAGTCATATCTCTCCCTTAACGAGGCTGTCCATACATACTGTTCAGCCGGTGCGGATGT GAGTTTGGCCCCTTGTTCTTTGCTACGGGGGGTCTAAGAGCTGCATGGGCTTTTGATGGTCCTAAATACG GCAAGAGGTGGACGAACTATGCTACAGCAAAATTGTTGTGCAAAGGCCCCGGGTTGTCGTATTAGATGGG CCACCGTAATCTGAAGACCCTTTTGAACCCCATTGGAGGCCCATCAACCCATGATCAGTTGATGGCCATT TGGTTGCGACCCCAGGTCAGGTGAGGCAACCCCTGAGTTTAGCA >gi|2765564|emb|Z78439.1|PBZ78439 P.barbatum 5.8S rRNA gene and ITS1 and ITS2 DNA CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACTTTGGTCACCCATGGGC ATTTGCTGTTGAAGTGACCTAGATTTGCCATCGAGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAA CCCCTGCCCGGCGGAGTTGGGCGCCAAGTCATATGACACATAATTGGTGAAGGGGGTGGTAATCCTGCCC TGACCCTCCCCAAATTATTTTTTTAACAACTCTCAGCAACGGATATCTCGGCTCTTGCATCGATGAAGAA CGCAGCGAAATGCGATAATGGTGTGAATTGCAGAATCCCGTGAACATCGAGTCTTTGAACGCAAGTTGCG CCCGAGGCCATCAGGCCAAGGGCACGCCTGCCTGGGCATTGCGAGTCATATCTCTCCCTTAATGAGGCTG TCCATACATACTGTTCAGCCGGTGCGGATGTGAGTTTGGCCCCTTGTTCTTTGGTACGGGGGGTCTAAGA GCTGCATGGGCTTTGGATGGTCCTAAATACGGAAAGAGGTGGACGAACTATGCTACAACAAAATTGTTGT GCAAATGCCCCGGTTGGCCGTTTAGTTGGGCC biopython-1.63/Doc/biopdb_faq.tex0000644000175000017500000012130612250104543016370 0ustar tratra00000000000000%% LyX 1.3 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[english]{article} \usepackage{bookman} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \usepackage{geometry} \geometry{verbose,a4paper,tmargin=20mm,bmargin=20mm} \usepackage{graphicx} \IfFileExists{url.sty}{\usepackage{url}} {\newcommand{\url}{\texttt}} \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands. %% Bold symbol macro for standard LaTeX users \newcommand{\boldsymbol}[1]{\mbox{\boldmath $#1$}} %% Because html converters don't know tabularnewline \providecommand{\tabularnewline}{\\} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands. \newenvironment{lyxcode} {\begin{list}{}{ \setlength{\rightmargin}{\leftmargin} \setlength{\listparindent}{0pt}% needed for AMS classes \raggedright \setlength{\itemsep}{0pt} \setlength{\parsep}{0pt} \normalfont\ttfamily}% \item[]} {\end{list}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. % header \usepackage{fancyhdr} \pagestyle{fancy} \lhead{Structural Biopython FAQ} \rhead{} % remove date \date{} % make everything have section numbers % Make links between references \usepackage{hyperref} \newif\ifpdf \ifx\pdfoutput\undefined \pdffalse \else \pdfoutput=1 \pdftrue \fi \ifpdf \hypersetup{colorlinks=true, hyperindex=true, citecolor=red, urlcolor=blue} \fi \usepackage{babel} \makeatother \begin{document} \title{{\huge The Biopython}\\ {\huge Structural Bioinformatics FAQ}} \author{Thomas Hamelryck} \author{{\normalsize Bioinformatics center}\\ {\normalsize Institute of Molecular Biology}\\ {\normalsize University of Copenhagen }\\ {\normalsize Universitetsparken 15, Bygning 10}\\ {\normalsize DK-2100 Kbenhavn }\\ {\normalsize Denmark }\\ {\normalsize thamelry@binf.ku.dk}\\ \url{http://www.binf.ku.dk/users/thamelry/}} \maketitle \section{Introduction} The Biopython Project is an international association of developers of freely available Python (\url{http://www.python.org}) tools for computational molecular biology. Python is an object oriented, interpreted, flexible language that is becoming increasingly popular for scientific computing. Python is easy to learn, has a very clear syntax and can easily be extended with modules written in C, C++ or FORTRAN. The Biopython web site (\url{http://www.biopython.org}) provides an online resource for modules, scripts, and web links for developers of Python-based software for bioinformatics use and research. Basically, the goal of biopython is to make it as easy as possible to use python for bioinformatics by creating high-quality, reusable modules and classes. Biopython features include parsers for various Bioinformatics file formats (BLAST, Clustalw, FASTA, Genbank,...), access to online services (NCBI, Expasy,...), interfaces to common and not-so-common programs (Clustalw, DSSP, MSMS...), a standard sequence class, various clustering modules, a KD tree data structure etc. and even documentation. Bio.PDB is a biopython module that focuses on working with crystal structures of biological macromolecules. This document gives a fairly complete overview of Bio.PDB. \section{Bio.PDB's installation} Bio.PDB is automatically installed as part of Biopython. Biopython can be obtained from \url{http://www.biopython.org}. It runs on many platforms (Linux/Unix, windows, Mac,...). However, the \verb|Bio.PDB.mmCIF.MMCIFlex| module (used internally by \verb|Bio.PDB.MMCIFParser| to parse mmCIF files) is \emph{not} currently installed by default. This module relies on a third party tool called flex (fast lexical analyzer generator). At the time of writing, in order to parse mmCIF files you'll have to install flex, then tweak your \verb|setup.py| file and (re)install Biopython from source. \section{Who's using Bio.PDB?} Bio.PDB was used in the construction of DISEMBL, a web server that predicts disordered regions in proteins (\url{http://dis.embl.de/}), and COLUMBA, a website that provides annotated protein structures (\url{http://www.columba-db.de/}). Bio.PDB has also been used to perform a large scale search for active sites similarities between protein structures in the PDB (see \textit{Proteins Struct. Func. Gen.}, \textbf{2003}, 51, 96-108), and to develop a new algorithm that identifies linear secondary structure elements (\emph{BMC Bioinformatics}, \textbf{2005}, 6, 202, \url{http://www.biomedcentral.com/1471-2105/6/202}). Judging from requests for features and information, Bio.PDB is also used by several LPCs (Large Pharmaceutical Companies :-). \section{Is there a Bio.PDB reference?} Yes, and I'd appreciate it if you would refer to Bio.PDB in publications if you make use of it. The reference is: \begin{quote} Hamelryck, T., Manderick, B. (2003) PDB parser and structure class implemented in Python. \textit{Bioinformatics}, \textbf{19}, 2308-2310. \end{quote} The article can be freely downloaded via the Bioinformatics journal website (\url{http://www.binf.ku.dk/users/thamelry/references.html}). I welcome e-mails telling me what you are using Bio.PDB for. Feature requests are welcome too. \section{How well tested is Bio.PDB?} Pretty well, actually. Bio.PDB has been extensively tested on nearly 5500 structures from the PDB - all structures seemed to be parsed correctly. More details can be found in the Bio.PDB Bioinformatics article. Bio.PDB has been used/is being used in many research projects as a reliable tool. In fact, I'm using Bio.PDB almost daily for research purposes and continue working on improving it and adding new features. \section{How fast is it?} The \texttt{PDBParser} performance was tested on about 800 structures (each belonging to a unique SCOP superfamily). This takes about 20 minutes, or on average 1.5 seconds per structure. Parsing the structure of the large ribosomal subunit (1FKK), which contains about 64000 atoms, takes 10 seconds on a 1000 MHz PC. In short: it's more than fast enough for many applications. \section{Why should I use Bio.PDB?} Bio.PDB might be exactly what you want, and then again it might not. If you are interested in data mining the PDB header, you might want to look elsewhere because there is only limited support for this. If you look for a powerful, complete data structure to access the atomic data Bio.PDB is probably for you. \section{Usage} \subsection{General questions} \subsubsection*{Importing Bio.PDB} That's simple: \begin{lyxcode} from~Bio.PDB~import~{*} \end{lyxcode} \subsubsection*{Is there support for molecular graphics?} Not directly, mostly since there are quite a few Python based/Python aware solutions already, that can potentially be used with Bio.PDB. My choice is Pymol, BTW (I've used this successfully with Bio.PDB, and there will probably be specific PyMol modules in Bio.PDB soon/some day). Python based/aware molecular graphics solutions include: \begin{itemize} \item PyMol: \url{http://pymol.sourceforge.net/} \item Chimera: \url{http://www.cgl.ucsf.edu/chimera/} \item PMV: \url{http://www.scripps.edu/~sanner/python/} \item Coot: \url{http://www.ysbl.york.ac.uk/~emsley/coot/} \item CCP4mg: \url{http://www.ysbl.york.ac.uk/~lizp/molgraphics.html} \item mmLib: \url{http://pymmlib.sourceforge.net/} \item VMD: \url{http://www.ks.uiuc.edu/Research/vmd/} \item MMTK: \url{http://starship.python.net/crew/hinsen/MMTK/} \end{itemize} I'd be crazy to write another molecular graphics application (been there - done that, actually :-). \subsection{Input/output} \subsubsection*{How do I create a structure object from a PDB file?} First, create a \texttt{PDBParser} object: \begin{lyxcode} parser=PDBParser() \end{lyxcode} Then, create a structure object from a PDB file in the following way (the PDB file in this case is called '1FAT.pdb', 'PHA-L' is a user defined name for the structure): \begin{lyxcode} structure=parser.get\_structure('PHA-L',~'1FAT.pdb') \end{lyxcode} \subsubsection*{How do I create a structure object from an mmCIF file?} Similarly to the case the case of PDB files, first create an \texttt{MMCIFParser} object: \begin{lyxcode} parser=MMCIFParser() \end{lyxcode} Then use this parser to create a structure object from the mmCIF file: \begin{lyxcode} structure=parser.get\_structure('PHA-L',~'1FAT.cif') \end{lyxcode} \subsubsection*{...and what about the new PDB XML format?} That's not yet supported, but I'm definitely planning to support that in the future (it's not a lot of work). Contact me if you need this, it might encourage me :-). \subsubsection*{I'd like to have some more low level access to an mmCIF file...} You got it. You can create a python dictionary that maps all mmCIF tags in an mmCIF file to their values. If there are multiple values (like in the case of tag \texttt{\_atom\_site.Cartn\_y}, which holds the y coordinates of all atoms), the tag is mapped to a list of values. The dictionary is created from the mmCIF file as follows: \begin{lyxcode} mmcif\_dict=MMCIF2Dict('1FAT.cif') \end{lyxcode} Example: get the solvent content from an mmCIF file: \begin{lyxcode} sc=mmcif\_dict{[}'\_exptl\_crystal.density\_percent\_sol'{]} \end{lyxcode} Example: get the list of the y coordinates of all atoms \begin{lyxcode} y\_list=mmcif\_dict{[}'\_atom\_site.Cartn\_y'{]} \end{lyxcode} \subsubsection*{Can I access the header information?} Thanks to Christian Rother you can access some information from the PDB header. Note however that many PDB files contain headers with incomplete or erroneous information. Many of the errors have been fixed in the equivalent mmCIF files. \emph{Hence, if you are interested in the header information, it is a good idea to extract information from mmCIF files using the} \texttt{\emph{MMCIF2Dict}} \emph{tool described above, instead of parsing the PDB header. } Now that is clarified, let's return to parsing the PDB header. The structure object has an attribute called \texttt{header} which is a python dictionary that maps header records to their values. Example: \begin{lyxcode} resolution=structure.header{[}'resolution'{]} keywords=structure.header{[}'keywords'{]} \end{lyxcode} The available keys are \texttt{name, head, deposition\_\-date, release\_\-date, structure\_\-method, resolution, structure\_\-reference} (maps to a list of references), \texttt{journal\_\-reference, author} and \texttt{compound} (maps to a dictionary with various information about the crystallized compound). The dictionary can also be created without creating a \texttt{Structure} object, ie. directly from the PDB file: \begin{lyxcode} file=open(filename,'r') header\_dict=parse\_pdb\_header(file) file.close() \end{lyxcode} \subsubsection*{Can I use Bio.PDB with NMR structures (ie. with more than one model)?} Sure. Many PDB parsers assume that there is only one model, making them all but useless for NMR structures. The design of the \texttt{Structure} object makes it easy to handle PDB files with more than one model (see section \ref{sub:The-Structure-object}). \subsubsection*{How do I download structures from the PDB?} This can be done using the \texttt{PDBList} object, using the \texttt{retrieve\_pdb\_file} method. The argument for this method is the PDB identifier of the structure. \begin{lyxcode} pdbl=PDBList() pdbl.retrieve\_pdb\_file('1FAT') \end{lyxcode} The \texttt{PDBList} class can also be used as a command-line tool: \begin{lyxcode} python~PDBList.py~1fat \end{lyxcode} The downloaded file will be called \texttt{pdb1fat.ent} and stored in the current working directory. Note that the \texttt{retrieve\_pdb\_file} method also has an optional argument \texttt{pdir} that specifies a specific directory in which to store the downloaded PDB files. The \texttt{retrieve\_pdb\_file} method also has some options to specify the compression format used for the download, and the program used for local decompression (default \texttt{.Z} format and \texttt{gunzip}). In addition, the PDB ftp site can be specified upon creation of the \texttt{PDBList} object. By default, the RCSB PDB server (\url{ftp://ftp.rcsb.org/pub/pdb/data/structures/divided/pdb/}) is used. See the API documentation for more details. Thanks again to Kristian Rother for donating this module. \subsubsection*{How do I download the entire PDB?} The following commands will store all PDB files in the \texttt{/data/pdb} directory: \begin{lyxcode} python~PDBList.py~all~/data/pdb~ python~PDBList.py~all~/data/pdb~-d~ \end{lyxcode} \noindent The API method for this is called \texttt{download\_entire\_pdb}. Adding the \texttt{-d} option will store all files in the same directory. Otherwise, they are sorted into PDB-style subdirectories according to their PDB ID's. Depending on the traffic, a complete download will take 2-4 days. \subsubsection*{How do I keep a local copy of the PDB up-to-date?} This can also be done using the \texttt{PDBList} object. One simply creates a \texttt{PDBList} object (specifying the directory where the local copy of the PDB is present) and calls the \texttt{update\_pdb} method: \begin{lyxcode} pl=PDBList(pdb='/data/pdb') pl.update\_pdb() \end{lyxcode} One can of course make a weekly \texttt{cronjob} out of this to keep the local copy automatically up-to-date. The PDB ftp site can also be specified (see API documentation). \texttt{PDBList} has some additional methods that can be of use. The \texttt{get\_all\_obsolete} method can be used to get a list of all obsolete PDB entries. The \texttt{changed\_this\_week} method can be used to obtain the entries that were added, modified or obsoleted during the current week. For more info on the possibilities of \texttt{PDBList}, see the API documentation. \subsubsection*{What about all those buggy PDB files?} It is well known that many PDB files contain semantic errors (I'm not talking about the structures themselves know, but their representation in PDB files). Bio.PDB tries to handle this in two ways. The PDBParser object can behave in two ways: a restrictive way and a permissive way (THIS IS NOW THE DEFAULT). The restrictive way used to be the default, but people seemed to think that Bio.PDB 'crashed' due to a bug (hah!), so I changed it. If you ever encounter a real bug, please tell me immediately! Example: \begin{lyxcode} \#~Permissive~parser parser=PDBParser(PERMISSIVE=1) parser=PDBParser()~\#~The~same~(default) \#~Strict~parser strict\_parser=PDBParser(PERMISSIVE=0) \end{lyxcode} In the permissive state (DEFAULT), PDB files that obviously contain errors are 'corrected' (ie. some residues or atoms are left out). These errors include: \begin{itemize} \item Multiple residues with the same identifier \item Multiple atoms with the same identifier (taking into account the altloc identifier) \end{itemize} These errors indicate real problems in the PDB file (for details see the Bioinformatics article). In the restrictive state, PDB files with errors cause an exception to occur. This is useful to find errors in PDB files. Some errors however are automatically corrected. Normally each disordered atom should have a non-blanc altloc identifier. However, there are many structures that do not follow this convention, and have a blank and a non-blank identifier for two disordered positions of the same atom. This is automatically interpreted in the right way. Sometimes a structure contains a list of residues belonging to chain A, followed by residues belonging to chain B, and again followed by residues belonging to chain A, i.e. the chains are 'broken'. This is also correctly interpreted. \subsubsection*{Can I write PDB files?} Use the PDBIO class for this. It's easy to write out specific parts of a structure too, of course. Example: saving a structure \begin{lyxcode} io=PDBIO() io.set\_structure(s) io.save('out.pdb') \end{lyxcode} If you want to write out a part of the structure, make use of the \texttt{Select} class (also in \texttt{PDBIO}). Select has four methods: \begin{lyxcode} accept\_model(model) accept\_chain(chain) accept\_residue(residue) accept\_atom(atom) \end{lyxcode} By default, every method returns 1 (which means the model/\-chain/\-residue/\-atom is included in the output). By subclassing \texttt{Select} and returning 0 when appropriate you can exclude models, chains, etc. from the output. Cumbersome maybe, but very powerful. The following code only writes out glycine residues: \begin{lyxcode} class~GlySelect(Select): ~~~~def~accept\_residue(self,~residue): ~~~~~~~~if~residue.get\_name()=='GLY': ~~~~~~~~~~~~return~1 ~~~~~~~~else: ~~~~~~~~~~~~return~0 io=PDBIO() io.set\_structure(s) io.save('gly\_only.pdb',~GlySelect()) \end{lyxcode} If this is all too complicated for you, the \texttt{Dice} module contains a handy \texttt{extract} function that writes out all residues in a chain between a start and end residue. \subsubsection*{Can I write mmCIF files?} No, and I also don't have plans to add that functionality soon (or ever - I don't need it at all, and it's a lot of work, plus no-one has ever asked for it). People who want to add this can contact me. \subsection{The Structure object\label{sub:The-Structure-object}} \subsubsection*{What's the overall layout of a Structure object?} The \texttt{Structure} object follows the so-called \texttt{SMCRA} (Structure/\-Model/\-Chain/\-Residue/\-Atom) architecture : \begin{itemize} \item A structure consists of models \item A model consists of chains \item A chain consists of residues \item A residue consists of atoms \end{itemize} This is the way many structural biologists/bioinformaticians think about structure, and provides a simple but efficient way to deal with structure. Additional stuff is essentially added when needed. A UML diagram of the \texttt{Structure} object (forget about the \texttt{Disordered} classes for now) is shown in Fig. \ref{cap:SMCRA}. % \begin{figure}[tbh] \begin{center}\includegraphics[% width=100mm, keepaspectratio]{images/smcra.png}\end{center} \caption{\label{cap:SMCRA}UML diagram of SMCRA architecture of the \texttt{Structure} object. Full lines with diamonds denote aggregation, full lines with arrows denote referencing, full lines with triangles denote inheritance and dashed lines with triangles denote interface realization. } \end{figure} \subsubsection*{How do I navigate through a Structure object?} The following code iterates through all atoms of a structure: \begin{lyxcode} p=PDBParser() structure=p.get\_structure('X',~'pdb1fat.ent') for~model~in~structure: ~~for~chain~in~model:~ ~~~~for~residue~in~chain: ~~~~~~for~atom~in~residue: ~~~~~~~~print~atom \end{lyxcode} There are also some shortcuts: \begin{lyxcode} \#~Iterate~over~all~atoms~in~a~structure for~atom~in~structure.get\_atoms(): ~~~~print~atom \#~Iterate~over~all~residues~in~a~model for~residue~in~model.get\_residues(): ~~~~print~residue \end{lyxcode} Structures, models, chains, residues and atoms are called \texttt{Entities} in Biopython. You can always get a parent \texttt{Entity} from a child \texttt{Entity}, eg.: \begin{lyxcode} residue=atom.get\_parent() chain=residue.get\_parent() \end{lyxcode} You can also test wether an \texttt{Entity} has a certain child using the \texttt{has\_id} method. \subsubsection*{Can I do that a bit more conveniently?} You can do things like: \begin{lyxcode} atoms=structure.get\_atoms() residue=structure.get\_residues() atoms=chain.get\_atoms() \end{lyxcode} You can also use the \texttt{Selection.unfold\_entities} function: \begin{lyxcode} \#~Get~all~residues~from~a~structure res\_list=Selection.unfold\_entities(structure,~'R') \#~Get~all~atoms~from~a~chain atom\_list=Selection.unfold\_entities(chain,~'A') \end{lyxcode} Obviously, \texttt{A=atom, R=residue, C=chain, M=model, S=structure}. You can use this to go up in the hierarchy, eg.\ to get a list of (unique) \texttt{Residue} or \texttt{Chain} parents from a list of \texttt{Atoms}: \begin{lyxcode} residue\_list=Selection.unfold\_entities(atom\_list,~'R') chain\_list=Selection.unfold\_entities(atom\_list,~'C') \end{lyxcode} For more info, see the API documentation. \subsubsection*{How do I extract a specific \texttt{Atom/\-Residue/\-Chain/\-Model} from a Structure?} Easy. Here are some examples: \begin{lyxcode} model=structure{[}0{]} chain=model{[}'A'{]} residue=chain{[}100{]} atom=residue{[}'CA'{]} \end{lyxcode} Note that you can use a shortcut: \begin{lyxcode} atom=structure{[}0{]}{[}'A'{]}{[}100{]}{[}'CA'{]} \end{lyxcode} \subsubsection*{What is a model id?} The model id is an integer which denotes the rank of the model in the PDB/mmCIF file. The model is starts at 0. Crystal structures generally have only one model (with id 0), while NMR files usually have several models. \subsubsection*{What is a chain id?} The chain id is specified in the PDB/mmCIF file, and is a single character (typically a letter). \subsubsection*{What is a residue id?} This is a bit more complicated, due to the clumsy PDB format. A residue id is a tuple with three elements: \begin{itemize} \item The \textbf{hetero-flag}: this is \texttt{'H\_'} plus the name of the hetero-residue (eg. \texttt{'H\_GLC'} in the case of a glucose molecule), or \texttt{'W'} in the case of a water molecule. \item The \textbf{sequence identifier} in the chain, eg. 100 \item The \textbf{insertion code}, eg. 'A'. The insertion code is sometimes used to preserve a certain desirable residue numbering scheme. A Ser 80 insertion mutant (inserted e.g. between a Thr 80 and an Asn 81 residue) could e.g. have sequence identifiers and insertion codes as follows: Thr 80 A, Ser 80 B, Asn 81. In this way the residue numbering scheme stays in tune with that of the wild type structure. \end{itemize} The id of the above glucose residue would thus be \texttt{('H\_GLC', 100, 'A')}. If the hetero-flag and insertion code are blanc, the sequence identifier alone can be used: \begin{lyxcode} \#~Full~id residue=chain{[}('~',~100,~'~'){]} \#~Shortcut~id residue=chain{[}100{]} \end{lyxcode} The reason for the hetero-flag is that many, many PDB files use the same sequence identifier for an amino acid and a hetero-residue or a water, which would create obvious problems if the hetero-flag was not used. \subsubsection*{What is an atom id?} The atom id is simply the atom name (eg. \texttt{'CA'}). In practice, the atom name is created by stripping all spaces from the atom name in the PDB file. However, in PDB files, a space can be part of an atom name. Often, calcium atoms are called \texttt{'CA..'} in order to distinguish them from C$\alpha$ atoms (which are called \texttt{'.CA.'}). In cases were stripping the spaces would create problems (ie. two atoms called \texttt{'CA'} in the same residue) the spaces are kept. \subsubsection*{How is disorder handled?} This is one of the strong points of Bio.PDB. It can handle both disordered atoms and point mutations (ie. a Gly and an Ala residue in the same position). Disorder should be dealt with from two points of view: the atom and the residue points of view. In general, I have tried to encapsulate all the complexity that arises from disorder. If you just want to loop over all C$\alpha$ atoms, you do not care that some residues have a disordered side chain. On the other hand it should also be possible to represent disorder completely in the data structure. Therefore, disordered atoms or residues are stored in special objects that behave as if there is no disorder. This is done by only representing a subset of the disordered atoms or residues. Which subset is picked (e.g. which of the two disordered OG side chain atom positions of a Ser residue is used) can be specified by the user. \textbf{Disordered atom positions} are represented by ordinary \texttt{Atom} objects, but all \texttt{Atom} objects that represent the same physical atom are stored in a \texttt{Disordered\-Atom} object (see Fig. \ref{cap:SMCRA}). Each \texttt{Atom} object in a \texttt{Disordered\-Atom} object can be uniquely indexed using its altloc specifier. The \texttt{Disordered\-Atom} object forwards all uncaught method calls to the selected Atom object, by default the one that represents the atom with the highest occupancy. The user can of course change the selected \texttt{Atom} object, making use of its altloc specifier. In this way atom disorder is represented correctly without much additional complexity. In other words, if you are not interested in atom disorder, you will not be bothered by it. Each disordered atom has a characteristic altloc identifier. You can specify that a \texttt{Disordered\-Atom} object should behave like the \texttt{Atom} object associated with a specific altloc identifier: \begin{lyxcode} atom.disordered\_select('A')~\#~select~altloc~A~atom atom.disordered\_select('B')~\#~select~altloc~B~atom~ \end{lyxcode} A special case arises when disorder is due to \textbf{point mutations}, i.e. when two or more point mutants of a polypeptide are present in the crystal. An example of this can be found in PDB structure 1EN2. Since these residues belong to a different residue type (e.g. let's say Ser 60 and Cys 60) they should not be stored in a single \texttt{Residue} object as in the common case. In this case, each residue is represented by one \texttt{Residue} object, and both \texttt{Residue} objects are stored in a single \texttt{Disordered\-Residue} object (see Fig. \ref{cap:SMCRA}). The \texttt{Dis\-ordered\-Residue} object forwards all un\-caught methods to the selected \texttt{Residue} object (by default the last \texttt{Residue} object added), and thus behaves like an ordinary residue. Each \texttt{Residue} object in a \texttt{Disordered\-Residue} object can be uniquely identified by its residue name. In the above example, residue Ser 60 would have id 'SER' in the \texttt{Disordered\-Residue} object, while residue Cys 60 would have id 'CYS'. The user can select the active \texttt{Residue} object in a \texttt{Disordered\-Residue} object via this id. Example: suppose that a chain has a point mutation at position 10, consisting of a Ser and a Cys residue. Make sure that residue 10 of this chain behaves as the Cys residue. \begin{lyxcode} residue=chain{[}10{]} residue.disordered\_select('CYS') \end{lyxcode} In addition, you can get a list of all \texttt{Atom} objects (ie. all \texttt{DisorderedAtom} objects are 'unpacked' to their individual \texttt{Atom} objects) using the \texttt{get\_unpacked\_list} method of a \texttt{(Disordered)\-Residue} object. \subsubsection*{Can I sort residues in a chain somehow?} Yes, kinda, but I'm waiting for a request for this feature to finish it :-). \subsubsection*{How are ligands and solvent handled?} See 'What is a residue id?'. \subsubsection*{What about B factors?} Well, yes! Bio.PDB supports isotropic and anisotropic B factors, and also deals with standard deviations of anisotropic B factor if present (see \ref{sub:Analysis}). \subsubsection*{What about standard deviation of atomic positions?} Yup, supported. See section \ref{sub:Analysis}. \subsubsection*{I think the SMCRA data structure is not flexible/\-sexy/\-whatever enough...} Sure, sure. Everybody is always coming up with (mostly vaporware or partly implemented) data structures that handle all possible situations and are extensible in all thinkable (and unthinkable) ways. The prosaic truth however is that 99.9\% of people using (and I mean really using!) crystal structures think in terms of models, chains, residues and atoms. The philosophy of Bio.PDB is to provide a reasonably fast, clean, simple, but complete data structure to access structure data. The proof of the pudding is in the eating. Moreover, it is quite easy to build more specialised data structures on top of the \texttt{Structure} class (eg. there's a \texttt{Polypeptide} class). On the other hand, the \texttt{Structure} object is built using a Parser/\-Consumer approach (called \texttt{PDBParser/\-MMCIFParser} and \texttt{Structure\-Builder}, respectively). One can easily re-use the PDB/mmCIF parsers by implementing a specialised \texttt{Structure\-Builder} class. It is of course also trivial to add support for new file formats by writing new parsers. \subsection{\label{sub:Analysis}Analysis} \subsubsection*{How do I extract information from an \texttt{Atom} object?} Using the following methods: \begin{lyxcode} a.get\_name()~\#~atom~name~(spaces~stripped,~e.g.~'CA') a.get\_id()~\#~id~(equals~atom~name) a.get\_coord()~\#~atomic~coordinates a.get\_vector()~\#~atomic~coordinates~as~Vector~object a.get\_bfactor()~\#~isotropic~B~factor a.get\_occupancy()~\#~occupancy a.get\_altloc()~\#~alternative~location~specifier a.get\_sigatm()~\#~std.~dev.~of~atomic~parameters a.get\_siguij()~\#~std.~dev.~of~anisotropic~B~factor a.get\_anisou()~\#~anisotropic~B~factor a.get\_fullname()~\#~atom~name~(with~spaces,~e.g.~'.CA.') \end{lyxcode} \subsubsection*{How do I extract information from a \texttt{Residue} object?} Using the following methods: \begin{lyxcode} r.get\_resname()~\#~return~the~residue~name~(eg.~'GLY') r.is\_disordered()~\#~1~if~the~residue~has~disordered~atoms r.get\_segid()~\#~return~the~SEGID r.has\_id(name)~\#~test~if~a~residue~has~a~certain~atom \end{lyxcode} \subsubsection*{How do I measure distances?} That's simple: the minus operator for atoms has been overloaded to return the distance between two atoms. Example: \begin{lyxcode} \#~Get~some~atoms ca1=residue1{[}'CA'{]} ca2=residue2{[}'CA'{]} \#~Simply~subtract~the~atoms~to~get~their~distance distance=ca1-ca2 \end{lyxcode} \subsubsection*{How do I measure angles?} This can easily be done via the vector representation of the atomic coordinates, and the \texttt{calc\_angle} function from the \texttt{Vector} module: \begin{lyxcode} vector1=atom1.get\_vector() vector2=atom2.get\_vector() vector3=atom3.get\_vector() angle=calc\_angle(vector1,~vector2,~vector3) \end{lyxcode} \subsubsection*{How do I measure torsion angles?} Again, this can easily be done via the vector representation of the atomic coordinates, this time using the \texttt{calc\_dihedral} function from the \texttt{Vector} module: \begin{lyxcode} vector1=atom1.get\_vector() vector2=atom2.get\_vector() vector3=atom3.get\_vector() vector4=atom4.get\_vector() angle=calc\_dihedral(vector1,~vector2,~vector3,~vector4) \end{lyxcode} \subsubsection*{How do I determine atom-atom contacts?} Use \texttt{NeighborSearch}. This uses a KD tree data structure coded in C++ behind the screens, so it's pretty darn fast (see \texttt{Bio.KDTree}). \subsubsection*{How do I extract polypeptides from a \texttt{Structure} object?} Use \texttt{PolypeptideBuilder}. You can use the resulting \texttt{Polypeptide} object to get the sequence as a \texttt{Seq} object or to get a list of C$\alpha$ atoms as well. Polypeptides can be built using a C-N or a C$\alpha$-C$\alpha$ distance criterion. Example: \begin{lyxcode} \#~Using~C-N~ ppb=PPBuilder() for~pp~in~ppb.build\_peptides(structure):~ ~~~~print~pp.get\_sequence() \#~Using~CA-CA ppb=CaPPBuilder() for~pp~in~ppb.build\_peptides(structure):~ ~~~~print~pp.get\_sequence() \end{lyxcode} Note that in the above case only model 0 of the structure is considered by \texttt{PolypeptideBuilder}. However, it is possible to use \texttt{PolypeptideBuilder} to build \texttt{Polypeptide} objects from \texttt{Model} and \texttt{Chain} objects as well. \subsubsection*{How do I get the sequence of a structure?} The first thing to do is to extract all polypeptides from the structure (see previous entry). The sequence of each polypeptide can then easily be obtained from the \texttt{Polypeptide} objects. The sequence is represented as a Biopython \texttt{Seq} object, and its alphabet is defined by a \texttt{ProteinAlphabet} object. Example: \begin{lyxcode} >\,{}>\,{}>~seq=polypeptide.get\_sequence() >\,{}>\,{}>~print~seq Seq('SNVVE...',~) \end{lyxcode} \subsubsection*{How do I determine secondary structure?} For this functionality, you need to install DSSP (and obtain a license for it - free for academic use, see \url{http://www.cmbi.kun.nl/gv/dssp/}). Then use the \texttt{DSSP} class, which maps \texttt{Residue} objects to their secondary structure (and accessible surface area). The DSSP codes are listed in Table \ref{cap:DSSP-codes}. Note that DSSP (the program, and thus by consequence the class) cannot handle multiple models! % \begin{table} \subsubsection*{\begin{tabular}{|c|c|} \hline Code& Secondary structure\tabularnewline \hline \hline H& $\alpha$-helix\tabularnewline \hline B& Isolated $\beta$-bridge residue\tabularnewline \hline E& Strand \tabularnewline \hline G& 3-10 helix \tabularnewline \hline I& $\Pi$-helix \tabularnewline \hline T& Turn\tabularnewline \hline S& Bend \tabularnewline \hline -& Other\tabularnewline \hline \end{tabular}} \caption{\label{cap:DSSP-codes}DSSP codes in Bio.PDB.} \end{table} \subsubsection*{How do I calculate the accessible surface area of a residue?} Use the \texttt{DSSP} class (see also previous entry). But see also next entry. \subsubsection*{How do I calculate residue depth?} Residue depth is the average distance of a residue's atoms from the solvent accessible surface. It's a fairly new and very powerful parameterization of solvent accessibility. For this functionality, you need to install Michel Sanner's MSMS program (\url{http://www.scripps.edu/pub/olson-web/people/sanner/html/msms_home.html}). Then use the \texttt{ResidueDepth} class. This class behaves as a dictionary which maps \texttt{Residue} objects to corresponding (residue depth, C$\alpha$ depth) tuples. The C$\alpha$ depth is the distance of a residue's C$\alpha$ atom to the solvent accessible surface. Example: \begin{lyxcode} model=structure{[}0{]} rd=ResidueDepth(model,~pdb\_file) residue\_depth,~ca\_depth=rd{[}some\_residue{]} \end{lyxcode} You can also get access to the molecular surface itself (via the \texttt{get\_surface} function), in the form of a Numeric python array with the surface points. \subsubsection*{How do I calculate Half Sphere Exposure?} Half Sphere Exposure (HSE) is a new, 2D measure of solvent exposure. Basically, it counts the number of C$\alpha$ atoms around a residue in the direction of its side chain, and in the opposite direction (within a radius of 13 ). Despite its simplicity, it outperforms many other measures of solvent exposure. An article describing this novel 2D measure has been submitted. HSE comes in two flavors: HSE$\alpha$ and HSE$\beta$. The former only uses the C$\alpha$ atom positions, while the latter uses the C$\alpha$ and C$\beta$ atom positions. The HSE measure is calculated by the \texttt{HSExposure} class, which can also calculate the contact number. The latter class has methods which return dictionaries that map a \texttt{Residue} object to its corresponding HSE$\alpha$, HSE$\beta$ and contact number values. Example: \begin{lyxcode} model=structure{[}0{]} hse=HSExposure() \#~Calculate~HSEalpha exp\_ca=hse.calc\_hs\_exposure(model,~option='CA3') \#~Calculate~HSEbeta exp\_cb=hse.calc\_hs\_exposure(model,~option='CB') \#~Calculate~classical~coordination~number~exp\_fs=hse.calc\_fs\_exposure(model) \#~Print~HSEalpha~for~a~residue print~exp\_ca{[}some\_residue{]} \end{lyxcode} \subsubsection*{How do I map the residues of two related structures onto each other?} First, create an alignment file in FASTA format, then use the \texttt{StructureAlignment} class. This class can also be used for alignments with more than two structures. \subsubsection*{How do I test if a Residue object is an amino acid?} Use \texttt{is\_aa(residue)}. \subsubsection*{Can I do vector operations on atomic coordinates?} \texttt{Atom} objects return a \texttt{Vector} object representation of the coordinates with the \texttt{get\_vector} method. \texttt{Vector} implements the full set of 3D vector operations, matrix multiplication (left and right) and some advanced rotation-related operations as well. See also next question. \subsubsection*{How do I put a virtual C$\beta$ on a Gly residue?} OK, I admit, this example is only present to show off the possibilities of Bio.PDB's \texttt{Vector} module (though this code is actually used in the \texttt{HSExposure} module, which contains a novel way to parametrize residue exposure - publication underway). Suppose that you would like to find the position of a Gly residue's C$\beta$ atom, if it had one. How would you do that? Well, rotating the N atom of the Gly residue along the C$\alpha$-C bond over -120 degrees roughly puts it in the position of a virtual C$\beta$ atom. Here's how to do it, making use of the \texttt{rotaxis} method (which can be used to construct a rotation around a certain axis) of the \texttt{Vector} module: \begin{lyxcode} \#~get~atom~coordinates~as~vectors n=residue{[}'N'{]}.get\_vector()~ c=residue{[}'C'{]}.get\_vector()~ ca=residue{[}'CA'{]}.get\_vector() \#~center~at~origin n=n-ca~ c=c-ca~ \#~find~rotation~matrix~that~rotates~n~ \#~-120~degrees~along~the~ca-c~vector rot=rotaxis(-pi{*}120.0/180.0,~c) \#~apply~rotation~to~ca-n~vector cb\_at\_origin=n.left\_multiply(rot) \#~put~on~top~of~ca~atom cb=cb\_at\_origin+ca \end{lyxcode} This example shows that it's possible to do some quite nontrivial vector operations on atomic data, which can be quite useful. In addition to all the usual vector operations (cross (use \texttt{{*}{*}}), and dot (use \texttt{{*}}) product, angle, norm, etc.) and the above mentioned \texttt{rotaxis} function, the \texttt{Vector} module also has methods to rotate (\texttt{rotmat}) or reflect (\texttt{refmat}) one vector on top of another. \subsection{Manipulating the structure} \subsubsection*{How do I superimpose two structures?} Surprisingly, this is done using the \texttt{Superimposer} object. This object calculates the rotation and translation matrix that rotates two lists of atoms on top of each other in such a way that their RMSD is minimized. Of course, the two lists need to contain the same amount of atoms. The \texttt{Superimposer} object can also apply the rotation/translation to a list of atoms. The rotation and translation are stored as a tuple in the \texttt{rotran} attribute of the \texttt{Superimposer} object (note that the rotation is right multiplying!). The RMSD is stored in the \texttt{rmsd} attribute. The algorithm used by \texttt{Superimposer} comes from \textit{Matrix computations, 2nd ed. Golub, G. \& Van Loan (1989)} and makes use of singular value decomposition (this is implemented in the general \texttt{Bio.\-SVDSuperimposer} module). Example: \begin{lyxcode} sup=Superimposer() \#~Specify~the~atom~lists \#~'fixed'~and~'moving'~are~lists~of~Atom~objects \#~The~moving~atoms~will~be~put~on~the~fixed~atoms sup.set\_atoms(fixed,~moving) \#~Print~rotation/translation/rmsd print~sup.rotran print~sup.rms~ \#~Apply~rotation/translation~to~the~moving~atoms sup.apply(moving) \end{lyxcode} \subsubsection*{How do I superimpose two structures based on their active sites?} Pretty easily. Use the active site atoms to calculate the rotation/translation matrices (see above), and apply these to the whole molecule. \subsubsection*{Can I manipulate the atomic coordinates?} Yes, using the \texttt{transform} method of the \texttt{Atom} object, or directly using the \texttt{set\_coord} method. \section{Other Structural Bioinformatics modules} \subsubsection*{Bio.SCOP} Info coming soon. \subsubsection*{Bio.FSSP} Info coming soon. \section{You haven't answered my question yet!} Woah! It's late and I'm tired, and a glass of excellent \textit{Pedro Ximenez} sherry is waiting for me. Just drop me a mail, and I'll answer you in the morning (with a bit of luck...). \section{Contributors} The main author/maintainer of Bio.PDB is yours truly. Kristian Rother donated code to interact with the PDB database, and to parse the PDB header. Indraneel Majumdar sent in some bug reports and assisted in coding the \texttt{Polypeptide} module. Many thanks to Brad Chapman, Jeffrey Chang, Andrew Dalke and Iddo Friedberg for suggestions, comments, help and/or biting criticism :-). \section{Can I contribute?} Yes, yes, yes! Just send me an e-mail (thamelry@binf.ku.dk) if you have something useful to contribute! Eternal fame awaits! \section{Biopython License Agreement} Permission to use, copy, modify, and distribute this software and its documentation with or without modifications and for any purpose and without fee is hereby granted, provided that any copyright notices appear in all copies and that both those copyright notices and this permission notice appear in supporting documentation, and that the names of the contributors or copyright holders not be used in advertising or publicity pertaining to distribution of the software without specific prior permission. THE CONTRIBUTORS AND COPYRIGHT HOLDERS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \end{document} biopython-1.63/Doc/install/0000755000175000017500000000000012250104773015230 5ustar tratra00000000000000biopython-1.63/Doc/install/Installation.pdf0000644000175000017500000044556112250104653020400 0ustar tratra00000000000000%PDF-1.5 % 171 0 obj << /Length 1336 /Filter /FlateDecode >> stream xZs8~_#9\gz}F}WH86`ǦԱbaV~+lclƇ {C{5/ȳ0r1a`,JBy&vE>INؼܟN<Ak dqRNS3-GZN0$]OYǗCOg&Ds'O_YhB] N՞"QZSgek!K/{߅#(}Efg;KۨbD׽, ^`(5o=~@ q/728bR;kcu3zL5Zs6; n3x/6CNҜw3 K2 {jjІP QQVvљmf+ A*Rj @DāG 9 ==V .<i8JCvlx LEveyBbD\kP> stream xڵY]oF}篸 HRl n-䁖D $~ϥFE CgΜ9Ν;"I$OSIIJϒ"ã_ Hk]hMH{tDȠ5!PX5l]$'#YSXM.#/Qx֐M7PXtEH(X@2p&`XiHԢFI 0)I`XJD14nʏD}#4<06A,g$ `(f /,͏C$jW)B*AZ!$O ZAS*Zi0pa hmj+H:XW`0(K؄ na8k 2ޞXYa Ѡ |` U YY~jI8C/tuč`! a~p4Tܮ{ l(uD$ܱ=_U$&F?;Z^~PP觟ίmWT6+zכ-?=OWf[Wwoꛉ\菉fuj:7{C^g:Axs'ؖ]~{Pmǁڣ=?n/UGkA{L=} s2} ˺VնjVU4^߮7UW/u6}p]|^RW-͆WM o ?ڋOX1NO,OUT{-3ַeom o+HҎ\#Aeгɐq~.Dz\V}1n_$fJ;ěfh55-oXMU=j= 6j(tG2} u1nfgru5.Td!x/8fQ>>GA',pP?iGber\g#Zv/ T7Ҹ8soOm_w"4mc-Ut;IoizϟmEsضXjjmӇZ.# I,ѡ/rEӴI]svTԹ4tx6ٌg3x.㹌2x.㹌2x.3x>3x~NQbj`mQRqեoˁ. g]IhdEGt8/ qk:$#^c8:mEqYHl|&s^2)LS_G-'NN*iI/ pYkz_"h#>1szQDxH"S;$N/b x%|tG?Ы#vGB I !'>( h'>);?V}G'Db5_J鼙vP Q8v{jTK*wUɍ477 l~qFr#ĝ w @ aROS9\V,QG#V;MO&!*$RVqP`+k@DmVHw$-I^jڗy 1蟎`2S#6!?G3$6B!]Orb%,žV endstream endobj 186 0 obj << /Length 2453 /Filter /FlateDecode >> stream xڍ˒۸m9U#ߏI8l\)o -ߧ_H&Fh[Ew"Vv޽zmR.b]ɪ0JCT7:Ƀ_͠:`k,@nhN;^8a+M{нvmސG%6&V_qeGUiV$WaV|chj_AӷH\aƞ-pRF " 8P ~/9!]R^p0rn4{9"{ . 4H{jp3 _HT E5pp5)~dp-Ĕl3asR+[\zPGN|t2n$%?C'Csxq(Y~ݡpx7{d0p+YLJN@ވ&< ox*ёUFm۰VۣsNkCd)+BZ.qg0lE H[k@6 yD0 VQ˜]†׌Ŏb BJz,K2mYn +i0OF薬 6=hyeQJ:rb)_!RB͒B17Jc }I߯P\i-^y2Gxc]ߋ.)`E5o}BэCN-acE\dwC27ANVZǭi^I>!agBsI&iSDJ{~ó'6>*ާR E]"e_[oc8".W2)_Lt*NyOM&aܔ,iVrkFqо3+m%f]mo>va=U- SfiRJ$E `P=jHst:w>k tfkQp.f !LR\+aJ[~> stream xڭYY~LMR"6"1Y$A6Gj 4k}j5Y#E*Z}"ﻻ>a}2Q?_-Jכtqk/ܵEި@$OdzkYu3qHk&9JG6CYBLa&fd[Z-gj{@tɱsw0p3OCבVZxH 5`оQIrZ#!BS,mֱh~3\/ڽcNq>wvvۡVSVA:7pώ3Y!1(oG1%vy4/?;stISl0Q[/x +tpW8;fR*= ] .?ps.†$<$~ !@##oB.[1X}p=WP.oMB~5q3vf;ےqt/ @6`Gi<"dpnT-` Mxw: .؄/m(u{* $x59r뀓tD@S6݄XY)Ͼ1:Y۠|u~@ET2I R)yR[ڞۜ>E&TZH-׋IQ5)F2 u Kҹg%*pC|m3 r0J9_^wb.fPb\ĸEIv":l#fݳџpa871 Ðr.! S׈ݝ;1W9ٚ]F0w w[q+7929;eyz ^n8XNiQTd!Lz=#M9πF.LwL<MpOFgP3j !_=ކJ14j>(uuz Q k~*h˪*ߏjNio9TθNB (glIxi9MIS()(><hn 63!E 9i>DH0! x|[NLd}6L3v9] çBF!+w._{ggY֏¢?H3L{yUe:̊< ԥֳ($ (mggMzy^:*ufV% a4 YŏE8hPo l R]$C;f*pxQm-ʳpWPiQ#K=t>FS4HH,% AJY7d=WHI/f3oE$b/ Ae~/ uZqGtdF)Y )!Z v|]歮b.JR\F/}Y8He| P^1 P~[ܘ*hcz !_v*ZNϣ\I*o% 51hzQ}&qL>7Eo7ܙ?~r LjD M;eWwv#zZ\?=ڢ q&f<2Ĩ>J7 ŋ@3၂\B 1EJƖ^~M: ^e*^s%cxmXV) A7#T*]qk߉o%hhW dcs" cےb$/|KuWMea k*N .cUT'8xJۅQ>VZ!֒Q"kjl8> stream xڕXY8~ϯlGޒ llz fmѶ6dR;_?uQӝ}bX,~u_VW|޿9LWA$ WUW~o^›ufeW5uQKՔMx'{ UpW WQ^ )qzuR phm#mUy\`fýnʛKEb`:nYzod4vU7k`6%4N3TzD) aɖ||x̒F5-@D;R};%Z-Q. NtQ slnzL"g;vL㫢(9] ԭ.!V5k7[)$~L7TX [Qu0JF[[<P믂UAd4UiwwI閪vweL 2.TJv%l8RE;+ى-PE%e^2!B0PI>*o&=VO'T'_y0[=Y;'x4 Anxnc:}(b϶5X ɍw+yF5 M]mp7Qo/rq $/Pom[lao+, oU)IC\ %0 sO"n#O 8wňzoCT[9iUmve\\at(^1qAH<],X/: >~׿ n$qrD쎈~/; NʉC8"b,AS9)jKg“Iqx0!ĦeM$ʦ][34lBܺC׭q}cRHO%TB˱2Cųmlo;Ѵ4j{˾ .agh{w5ߒ7"Da4jf#`>$*^ وkI94vc=}_]KLXa8Ew=+gY_[ pM~;(X|\pʷU{Ăkҥ "i6^AÀl6X!B5Yp/_SJ8|{il5He*8 %꣒ļ&&YΑ&e]nkGB].`Bmfjti$>Qaar>ra,ök㑡LNwdd%h^f(h(9BN}Yg֧L1@amxkٮdR%4y㊛-L"Bgy[k+..x|,zq{q^-!j-<@|p0]5k4Ot`ә|$Ak]}vpS,xc.8u2z CrAr=m@І#L4 rwcsR,CŜC豥u30GM *ҽMYQF=_wL_a/ E4X+ңCg>] %.ZPSAy ;(𕎆' C8r0"Kݕ<# P pa]ڧ>Z-hY<غ$| lo4Nќ}r`tL+*@rv¾6.TdEY3ge7b\Y*,Egd3!\0aHǐA-]ު]PK T+`_~@M{Hg~K#Ox;Q& y0<}[ҜчjMm`0T["gL 奟s**a$"49T_nY9C҉(Zz 3R$ "60.|򐐸h&_1)l{(fƱ5pFgl't;d~PHea!2q8pe )y* =o!ï]Es7H CHF]F?Pm2Z'\*vH8jc'Zn'c9Jg %2p۵ͶC1o֙U!r4sRbqz5d@CN⤝H|sNXdCYt5Ay,XrU{eFr Ь<#Aэ T lqMc~ұ1^[g5ؗ JOI욽4 BTytwZx* MF|W, endstream endobj 207 0 obj << /Length 2264 /Filter /FlateDecode >> stream xڥXY8~ϯ -NKCv9=YdZmNZR[*G;,&dXWU gY8{"^\l,b, LC5As?YU7Obog~R$ٛ<9f?o#̏ )9s?O˲kV8MѨvC+VngUI> -5k mXw8QnhZ"tk:#`a̋H(Xfqyq_h{b@JLA 2DpTV:2FmGBMWU- . ~GAD>(}3R|{+&/( 4u)oY7fkEBiSE&0eS =;tVBWDE@/e5j3#;Qk}Rư{\ռV֪ij15пhOK'yAo+`]%IȕX"{ch>(KPI[Dn%z"Uynm)jT.1O#'Q][Ǣt}&? 8 ev FI R Re!zNͽF0;\x \NF'kK|鲇}/i˭,˲ZmÁe9k&de%׎t _Momc Ɨw? %/3n.{ځua DN?1#Vlm@R) cbFOQl; S@dK"흀˒ KQ;ypx/͙-~(X3zQYJ\"rV}k\p56ĸ8*q2E%7~T?'!IX5csn fr2'4d Zƚiĥ{ф9 \RliQiiʼOVɮͷDGN8I˄wB׻Tw5p u0(iO lIv6D6,s E|հk9+&nT=~>` fcFOPso V~J"xRvZa=uIO%T-8Ŀǿ'h#yh[#,\wX Dݽ_=QX[vCI5y@AuvU6c sn2> hܯRKnӦgؖԄHhӴ{24"NJ l4}<Փ= ϾLˆTPXPg\Z[U=k)4`f؂d ie}:Ifؕ(Ն[ը\65{v'vrG9}ݪѽp*Rf.mMsM(U2}I]/ͷ(B5EN endstream endobj 217 0 obj << /Length 2573 /Filter /FlateDecode >> stream xڕYY8~ϯ0FڴLd2 <mk#K^6o]$dT$U_UQl;sg?p}sbOfb?mf?K습.yxőeƢj;]i|bmxJW9dt{FkrRؘ9ߋj+GzS9uӘuW7fPAiUP\J?ovB%=]ݗ9 ı*XYۼn',Yp[.l *8*?J@?9S+_%(,3M2#) N*ܮȜݺޭWd۷P}7pa/V|݈}?bZU_;`ΔǗpj(ɋ})!`Uk}݈ܢ^wE]k;x|{M9)qVDny4߽LB߉0q!O{vp{ NwI Tv uv^ R'@J% )'a\1a_pFf%ux-GJ:&yaa&VE E `*"GY;MQOk۱}+<0@;e)=wo]/况@'Wl$g bb׷" \;镦%q57a<ۯ SRoui> Ңޓ懁#BypkTOf`3ͳ11`0rrU>nE eE8vQ QCˀP ZȠl<9G;_!52>4lCJz81ZM"RsC {ܟ4T1J5rR3]ŝM$Y\= ;ث3N@17֐W G9$S{#vdxe;D*l U5( Geh@ ' y>/ 3& :wF$ t6{YslKB! >|8oWlɹ ؀'> }W"Bݐn[K ; N؟H(@Zu ~"9DqKI4VjAY *MҩmPB8tE>-5 / C9'ȧ`̖= )Mù2/pMSF"Y2e`r>Uϖs%2L;}+/I|*) !^i/nry2аn*/(*zLhJ; ¿O,$s/]-xzCOƞϕ+d B%k)8[g%ںoV c*)$k"Ͻ3"҄hydx(dg⫩aH8RhӠy@``D96- RTb >?wY=jCy1^|( ɔ˫Յ k [t}Ӝ+<]#pBI<4@Y Z^} ͝wPRo$Hx>vM/kd1$2T%ӯ(=uY m] J2.x% Ad\NHF]͊=O5 GNֹyJ i.B_r C78 6r[5V0o_t97VRpˇRe.eLUwNYCw&zR1gMe}؋]SMS w/m+4 endstream endobj 230 0 obj << /Length 3040 /Filter /FlateDecode >> stream xڭYY~PYZl6 Ʈb78"a"$5q|j^~ȋT}~~}'*QI腫*UH5*[1V-o?')].lcea#q[YQžkj<]l>5ۜi;*,@ct 9>t7Ω["N]Q+^Y8x| ^ }.ѭpѵ_xjC i v Ktȝj5-%]%U9JzD8rKEY  StpDS!r)}گ%p.BQwPw>V@BvHWK6fiĘvYL k;6!qdwO[(EK3ULLQEaZE~l::p]EѴ|оsz6D'Q4UlI}NWӢcdAEz[dFfTrmwA(fzmqaz.8 (*:ohڌgG_@XF.:,͏xo*oeGQ/b txJ=^+?ILh;?P2Ȁ:4qQ#A'@h;‰͇/3FgesiJtbgfEokk07P9r$,M*{싎Φx'UNDEsn" zO#vHyRTef I}NQb u PqE0Li1#ϴqG:PA\ 2xQ5B3c\ +5's:,7fc N#MOe6 Q0otI-KۼƉځ=^}!Xe$Ħxdhr@M.Cq ;$l)LAqbDBy2Xv<_RG%HEZLJ0nF\=}_a1[,,1!t[WbZ'$HQ6Mrўo/QQ6 fWT UCmH93q~ny7{Z%޿{2!CiFJPJ1]~?:O+iی퐚d{d`4GO 1LL[ŨJmQtrz9A;sD/؍vT9$~ Vܳ.jvjNН`4/! Ts<,Ѝ{\bp Zdb8w~;gCMLoĞԖ=$|!kZPE:)` )lS:VT)8EAG)l;|G znm*d mVvU,Λ(Qj$* ڞ&_ _&%< `#{EC>168c\a6O ŒLL$>MIx#LZx [{X ̓gRي']`e/u"?IY%yB Ani~d/Qje`NK3D~ȅUij{|8㠋Mkp98j2Fc̑T>e%y>XCzM_|.ɧ$8L$|I_A%fV_JRlDpH'#K&#ԊIZČvyHq@*ETih-+| #7\3x@ŋo=eB'`Lo[np?w]xh jM> stream xڥYێ}W4w4uii_klgO`͌ZuqS7RROz<,ޫNQjV|zUenVuQ^mW?Y&(x_*=ئI4o|.|Wnz`(NG0.Quz/rwϻ?߾+f{V7q&E[Iuky,w]sR:, Ng9]5FKo] pNwB, au Q(' Ao UߠmO8,Zah_Սk;eq֏a k3 lZuX5MYβҠ?Ҫ-Wx@lѝaSPm}nI4JU[<7!5T7llZ^3kz,԰k:$۴84RXkSO=qv4Mj58ѸBy&T^]J4]{vCG)`H;2$BXhtMs= 9U*k\g|Xgtu|ķ u^Es6< ގ^\S㰡:] bӜTZTQ)aƜ bAE:̇C׌ke\X@=~wyx-^ Xy Ojn@ :Vz#{m**BcKKgJ`8ǐ⌁ B&WN3oOml15e)"΃3"',)z/js{6y<(nyf\`{u M%`i8̑ 6J8pg*"8'lD۝va7gk吠",&6q& U_ Γ-qu1Wgm 2U;u<"ojŴ{:{Ս4>Lva\& rx2rdg ~2.x̣0g4+Mo O}=7X_$N›~[!EpxClSg1(8W>0gX|ԏLLS.B~H4̟`M3 r>lԵ_Gz".bԃybt2 E/q;@tL@ѳ Z}j|˱}l@UϽ N9FO?tMw5qT֜,!PP[݋22r/QHӰLϨz1zlmew'}e&PP4-!6Cq`&@XʜIAnk/h8gZ[|݂ZPdj|gٔpgY8WC {;!XDACH $Rs[yͱJEӓd~΋oп\Ɠ/ ς +G;҈KX8F v Y疑=$?,C&(ϭf qԦӕѰс&؀fj ?qq KJ`nGL 4w:΢Sص"'brdq2R&=)%[sM V2Y. (˿|*Jx.LX/Kp(g'J:t'm2qp^,:)_l< RY_&؄f(UtNtbv2;@j.S/|TKRhPT̼$rJ7Q3.tŷ:]rd~G0Նg“u`"`vm0,j ;$c+$[qg' |"+'V"h @EHx@Ï637 p* G$A ;n*G+@+;EXg9bIG[ {= d'aSbّH\8WS`1ť9/JgJaҽ\hh+m^tsT`9%:ǜLMh:5CV!dULZ88%aƿ|l64 8'ay4[9tጆ*̳rN&)&Ht1iT:R))ϔBH?6zBU~YƷDšdv82ȦLä.8-\RD?t k.ă),a d8s+p6 Gn ie^VN+Q^%/D؃Mn vŋ|=UG`{y<2ݝѩmIqB`ǯ./lJMM+Bc}KMAN b*SLQ3蝭hEnm&[ϰ&/I5%|/75zaa\`H\(XI\)^Ndqn?܅Ld9 FwY.}! Aɇ^|Ď([v֔ǥk/rOBZ6䲑lz"N|b@8JU1&;kh~KWÔ&d.n' ==~+nv&uV P:bgxۚ =xb-g2Lab Q$j{ECb\9 ;Lͺ;SF%W{~^ sxpr,"vT`~wݚz1_/F辣C"q͔łl[lƮ%;\`7]7;bk(яw/e(*mG/Qyh>/TB:~t{ Z1`[;6 ħeb9 ~w  = ߄T鍢XŞ)fgɬ3D6T/d ]xTYysfU>90a{_9OGI0?+PYQbw_ endstream endobj 255 0 obj << /Length 2645 /Filter /FlateDecode >> stream xڥkoF{~.(`j|2{urmiĕŚ*KҊk)'wBcvvv3nn9}vS>,F(Iax4-F⦅N3< -Çhi۔ndsvi3䁷9rOFufUYmWЫVU.xea͊w߃480;‘7xE4|F$`^lf?˅09<_ýzs=xptı< I2~Zx?<ߟy%2'OFݚͲ#-ρuUU $y:xxdhLWN`x[F.a:;ׂErD vHQZ=o}]}ÿ-wǢЏ/dM16Gͺ_sBYin?dE4{ړ tMhB0Ss=% c؊ =V T TT췆ϳKc+[X--y {8Wef{ݐm?dQix.zmFa^5_ $vF`A M"F 6:'V@ џ[xd}~nN,sf.|c7LU<8wF6\1\Y[WKMRNj /5`s!q`=e;-tVF)|Vw9Ad׉8sQ8V/uϨƩFpQ/%(Cb_GD6- C #LCiyTl9 (fL Y5du9v'_~~\ԸGZv'_#*9aIm2AN[0Ej{FN R1:(%u8]5C  r񲺇FPX0²=pݘ/|u0pЎ LեQ: WG!E=9JGn,(," (>QC7qqM SG򌲐#e2kr`4:%bI0޵+Vy/m clxsPLjWT;`P`p ŵnw`Wr؝CCYd)ʢqDP6v̲a%I3)Ұ@1! z$r?3agߐbm*[56x!BHƻc LsN/(lJm1W  I&H;0 1)} Fb`x=c,@pKrvƵOK& 0Uݞ9{B41 +vy$h>+zu759+))< z@-ڏ,أD~A)TfӦ`p8@V+KRUm\i[tȤ*iam9.4ҵTCNQ}ÞS>p+V6\P tL[odw jtZm ev;ӶZH|Lx';-G&.jk(%ШT۱4z MZ\cM-IvM2p$C0'j $GhᓢsW]A;wY+ HPۅs RҦG)F P+OCalvky@~ahQ¿p!c~ZZDo{AU#rs %kv1wU{ꌰtR}4.\f Tf?F[衠v(C? & {(?فY endstream endobj 181 0 obj << /Type /ObjStm /N 100 /First 858 /Length 2321 /Filter /FlateDecode >> stream xZn} ݇b NH2_d[vS|̨-f&.bթSl$eN&(\ۈ;mlR6$|DghYڨ2S@C\dl9 $V;0{bLqF2jVXth!c8r姨DsLJ2TGB3vhU A9ѥDNϊb@ xaJ6q)+1D01uh2 `(h²Ɗ0<`5,¤æD;Nqᰠ7 ,+/zy-VyӱX9ha 6 ~ |`~X:N04dŖ%{( O%<)8'2AS6(3l\ <%3!0.$dSe\BG#CaJ*3b8&w"<4B-lFd(@.c61 } @ި$$\$'dJLyfaA]QXQ<ʤ$8|&e/Rb eXlOv&f[bFSտ_٠5?-/C2\γZPF)#v?Pk/91txU{zTUPU뛵zzYźCH>]Y] rYsQ n+{D1 c@B{Xxԇ:Ni+*eܬ:ڜY]ի2Xz QVz4Q[ t\Qg/ *=RVa`.tQ )->5-Fهi9Z. ꮂh_gv%$@ !js[i?q{N<4z]ȡo$  RA0$ %a>B}w_ JCp _:_jG` Ra¦3)pZn=&Ӱ`(@5A1Fn%eH>ԸR TD)Z(d5DDYbeZϏO&~ty20 DQDpӗxM-hNF^J`AJ Blse3߉Zćv[Q+\ r6 91hdž}v|8i)w>\[[;-|Ilʖ0>v,!|Fi*O|A3# j>*8zFѻy FF\}λ $S%Q8 $] QrH1bptA(g/ $D#HT뇕̠,Ve;X9ܫ}-jhYHxѬ/7'5}M6%!EpDњB޴ Q؅G%ۼimv#ƇA9J.ʹlu4(G38=Ja@#"7YY.' ry^= wmFNY֓']sUgMެy.Ofѭ˿l_aRgsFHn1Ts;y'./OC֖2}d=L8)[$C㈣yjEA9>[ؖ!y]ؠ-rMR [Ycr:$bžA9I.?5hr"?؏{R*<)CR`ݹ^UE' &}Pj#Ad3ě8R/ZΏWm:O/@ɼRD@`V H$@b ЧqG՗J H8pHaKE*ʇ,>IXqUsj|]h|}\]x?94-H]dҟ`0y.#}DbgT^~{=W}*4de Y,P! 24^\7 q U*x)ǂA9xXt<4shQ_x2逬': +rSޟ[{-y ڞ|50< endstream endobj 261 0 obj << /Length 2098 /Filter /FlateDecode >> stream xX[o~ϯ ]ry ; i>(("emM*/u,EL`O|,~!߿gW+A.ϔZ$R"LW7!? Wh J!۹]^/WAx7r]UA7ߐ3ex;jntEB90 =JW ~ ;eێgMװq}ɚ$t$(hMSVa (\oD+ z[xf ̺laazwv^AZBoW?5=-v~ʏC56]ݶOE 3H%*4՜b,E:ger,] C k}AN nf;w8Hjspmo@"~9$ޕ}gA,)@81wH/WeI{Efn G9ۿ8Jѝv.D '!zsOxˋri86 !Iף*:iiE)4sqoY20[s}f8l͂aZ k^+|^ Z Yް1RJR2UG"*8IOΞ/1g-Ɓ1h&yIbRыd\i 6e }yqj.}@H \ =w!o@X]uF'T<]ޮw>]]us~4f]XοbJ?=XЧ}V~Q?^65U W,؄uÐ'/XkND`x^^zSd,O ὣ/s y(J4+B)C^mzc b??/WVumD2,+fHY052D((N90f ĢkЭ@?tENY[R6|Ӧw}4ٚ'n`J 9#E}1+vm B?$yo\qbѹEP !0=A/88xp@ƚw_yo?|>uc}'߹I[P=yoZQPr4\/x4rB<m֢kiK򦊧^M{s޴;U 3na8m0cA]q5=,: EYv׌hAHU2g0@%%%rm"7P}Ap̅t(1|DSO:;}0O&|~Qp}i29P =LFld\lhEלGw>©<œ,c{>TPܿM?۔ɎC=peyɉ=.52kR63 B\Gd~&uV$&\`:I;t%yCSى:ƅu#$ abMvpa,f)?ˎaڎi벧W<d/ʘ1x[W[ĄPk`c_mHؓ|V. lZC>v=T\ xئ{Z[B^TNf \.y0qg+X~Ė"^nP_'v[nD7=A"|N`; (b+4+?a|Z֚PŅIo_2 endstream endobj 272 0 obj << /Length1 2124 /Length2 17117 /Length3 0 /Length 18389 /Filter /FlateDecode >> stream xڌtk Ƕm۶XvXӰضm6FoZ3q:N\P(19%]Xyb ,ff6FffV8 u+W[p@g+{X9]?dƮ Y7[ Cg^@ `tsprtG) ow`j hjl Ps0zOj~KWWG^&&Fc;Fg Az%@tv P4#@_ 5sWcg C`ke wpq7:>dJ@ˀXY`ne (I3z24uq7v7560Is1urtuat#_a>,ao&`gwu|V@ӏ{16>AVf0ssdҰrrʈCGftp033sqrN%_ Խ+YpqtpY?~|\݁Wg7?XXfV=ܟbG<`' 3scwdUeMJQQO'x8-U6Q/O׆>3z̦_,oW't[O/׿->c7>6jТfW'j!"-'L_C.|*;XuXcLm>.^~7u0kX?nlaXR3߳ `bwpp|;8QN_!N`/b?Cq 73Ib0A1 vq2?#OCg}d7/Lf,&Gɘ?4BV&, ?8Yz9Z~ܵ,>dVdl?~?O(Wß8G1?6b8?ȱ|Od8>]>?1c\-W8|ppG2֏^|zv}P@O)ʢ)_u]hCŁV ϊst2M-{^= ;UWӖ/_Uڞ}_ Tg NEa ԅ}_|5l[@d)rܸ<<?/Vs2hDSd-B2Т]y"ϡL&Űl>.xoTtߡPb/Eo ,esE '.i+82dwwxf:jN)(a|(J̿VfX<%juu]ht&#@|yb*7L6$[UTšPPqi(xc,` nŷNoޓDkaWnc f4a'O޴+\ס2آHYòi[ v.`Z*Ofg$3BHsYeBk*hg@(xHt oAټǼMxn_ut Samoه\)2*˭w`Tb5eDNyۡ 7(O$śx4 m"G\%|˻t2k䈙pI`fPJEV:I˳gaxrwKJ"j? 6COGsjǷ(ǃnɿ(7iT;SӹYb& ,Jju9:'2V2@xǶF%#dm#ks!zQG;N?S]l>(bWUbĦ[&>Hܚ/L,ޖ󬜰0q<w^Me-ľWϨN_%*4iwמل糝~5)jI'rN<] Hh<3jĩ:F2;o6"d΢+u. H: @:7adj84j$W{cѾ/8 zA' K0aM)1HVdݗ\҆x=}r9?UML~EUM}Tas IA@YՀڂ⪳ LˑPAZLYExz_=,]O&cnMp65z3Eے |MWxoht1nL&A`u8Y {h#6 #PgНX|2t@qV8} |uy}w6GVY+g( 5ѧ&-nBEgj闚-.Y/"mRDsS?ĤkcJ8!R]sm-G;l?,B8ArS] nmsIBPAuk1[#5X V)3.JQ"Jm-oe_+PA$9>Ye+DHnʈrktmu@"$g:׏wl7ٕP\U#ZpQ:tΞg%gR]D0Њ>\0l ^E;B:WM‡OʢV7ӧgkᚒ z"6i? QqCCC\^Bu F(੸yG/ BsgldC_NhP[-?nR)FyA21kW>J_G|ۊ"G+^±Z9l*_2fKqrbda0[\zahWUl1Iı}˭%Ƚ;A21eYMw(U^${6cjU\_d-տal8B2sѐyKGQH0}TT.nFGCe зքKzphyQW!y|m82PZ]\fE3|Y뿿r߻`F_m0Yx`E8Y{UeӮxK$h0 8O VcveT+*s^bN[z(0sMr{IީfSerZ e"uasP2mz> zwԲSU_LiNPѝO4rckAh$=T%ɤ/ȔsbA虛ItH*F[X^:H89$r,Ό"w͈ 0~B+h)D+!i04bp^]ls 'Xi]sE7 owKria^Y/ +޾lg`۰b@ D86`s_HDuw8#^^y>'5mƍ !@:Q/\֖Z g'%'S#UX#缡%>UeqbRd 7çF)B"f#Pd~J»!Xy5x'5Ê]&&ZЭ W p`G| ){|mNs\K^x~Ǘ+C#H3l Hy߶;](T~[$] 7XF W`epFIߊ^3q(>BVᚸ^( :jc!G*SG4Q6&r\n$8|HEnɶA*Ÿ <хMDrc^*dɹ6JuK7Tr.wvM蹂\Pc49,뒤^6XgԅO/ +~i~ _o1 fC@=Bǿ逳W../Q&=6Fÿ2JMŎS`FV`|L{= 4D6ty[ x܃ߤk4O2"NPzG$y|vA%3CnÜ f CEgkR gtnXz~ O[ bJ Q]mɆ-RV}Zag u OځO\/+1FjBVcQ 0LraL7O)`eDY 6c2ץ~`/c;zݐarT @N&\lwz xtp硐[8UѤ4uϚDg/V?1kvvu'>ҽa0~Zb G6/.?j˻PGb\ޫ#)ydQU_koNZb vpo~(ߋл⚚ &r?}c$|^O*ȡMnŰҠT(cF>IǏ.OSk}L?ݘfA2R I70>rvi&6wJ$Y=`p@L!'r$" ֥*_(,L"U5wˤXe0F,wt>D7^%{`A:K}miQ.*E/-369E{ξBZ҄)Cm{?WA+'\5RѪ1&5 |}+5P9E~?nP$ڛp/=Vwɷ.~گ}rE7{=il?[f} HR"7WqZ߃ `D5EB#(4ӞUmήzZv;2AFl3F㴳xBGaS;*>: E 3wb1 ^Eޡ|:eokF(u.r:|Nn]:+ 6f˅U:'a*=XkzA5rp!BQ/JU\+x$˲:*5[^c? \kǬLtۑ2| }YJx_vhKB=rLbAc:na//SQˤ)ml6ϥ+9JDgZmq-35Y#Sәx6K fL@2Ff+7S^#Jڙ5MUQ}(@p7D^A|HLV,bFK$Qobmo_'ubJ^C|`:'qta6S1!3IƐa]eNH&W5[+ð{/ogοV}xyP4!Ez4F֥Mť9]QeM@e.ep953ʥV"%z&pQeۙlpe) ;z +E=p#C*N椃 DE0/tٺA#an<+궻389.oW.q74DEJ>{NVR뱎w0έI :eE7}̶*DuaYMvu }YEd1>$}qZ7 0 */ށoyrbN6 I!{dSB?mZji`ϟTjdIU?q]kς̝,֜F\1 O/o( bG]ɖ{zp96" q\ྒྷҸ*gVOok+SsO#HtJ@2s;[_Fʡ= QZ7jrf3uP'- ,w/rT}Pd!O(mV^kۉL;<<:a6(SϝVzGgC+E(áLTm~9bWeц!{ s"Fzk^'7C񍥈h3>=ĕ&kk' <fR'^L.a2sǔ[~ZAن`ox NHJ~a}?隌-Ips޸P#cyP0 |ӰWȳe-#/2tMv+%y/W>egHf o[bgZ/.3 B8P]"?P5iL-3ym 0WDOr^ndBI=z^fqBn6UE9'@},|qugK9eD\mK!ÊMCw kABSx(afo G ۗzevngJ_+MQY&wa= 2 g)U'{p *(# r*5Mtpo[]A״z#Cz57{5BH|]G,=UV{g X)Պ=NBܘdCɒ1P fٔޕv&.X/C}o=nG'ӭX5 LraBh;DO.x׌x:nQg*u@Ur*|~y usOK{*լauuəh'a呰/_Ga`?QQ 8`%wFCن&o mQ-~4xI>W.(0Bhm\В7LS&_~*m+M*^nq$1Vv[wbQDݩ'˛^-zԋD&P 9`]``aPw]E!I46X)_DOX@!16y,}gRCaK7Pޗ Bq%W3XUNQ#~yNSK`/%L- g'q`S+e;pMc9n^HQƸ98Y|6!c4/s6&N|Ă?;țT{?Z\mT7v -h$1%%vwet`8iޅ]YqgNYZJ%0ON!Wp`9Q?3+\DRyX)(#*H 1\T0Ǚ'G1/B"'Hq?h|34GxR\"=sB PAW e؈DmJXXpFZsMZ37t*w)RTL􋅗XKfs0j9NߦefgeǁLSm8ү? J8&Hk%SPH,&i/6SNWI$~ m7h f>TKOfQe>64vNpo0q[u75Oi⍻26CxH& ћͮ'8ˆcsDT.E  8Kk&򔳒Ga>>RCj4yH HCl({?Jm?QXwI$VnyrgC3t0mfЃeվq8e*{hm#OʅhC>X|sw>wXDf_W*ƻ([A,r-[*9e-".F6+Q>K0*9|AJN. aդv\kp){$ X@^uXcϴw3|mK ͦn>_}iI~ɤYwϹ$fo y9yȲrʑ,-2/:ܡ;JbݹQ- )&Pa # \lȴc9`1e_etNOTu(Y̫8zlPy{ɛz+.$ؔ\ s-Ɠa# z+jŁ4=3iÃg[G)œP4;O.]&FTK}|4!+D钹$r2rIPMg+cM%֓xK?o-e2MD;BFFz,EsfVX'f+J;MVaW.pބzbԴp롱Z%Iw:.fe \FS~$*i +Zoc#v`L+8p\{D s{BRa+C;/l~}ZGmwmOݸ6H$c*f{N\bkڠi4aRJld]JHk>g~l.4 L"p-ԯ߆dN%dcÀ4DwcVe}7{-WdWKHv.2y} B>" t,ae;O\W uY8dv!hXѝw^ -Ў.گ2V<0Ysb̝4;&dߞ*A(+ &pcFeM>DJ eSL,~sPuZa<xNvB, zU(Xz~2O j' s` | Q:|5dIX*}q;mQ[/mrE0b JFeΨ12&d^tD˼U-U:@|؍:=VSk/>kָ W6W"ëyV낽+AlGa}dQ5+z1-֍HCd!5~64׺x FKkPܝ% _v,SG7m~9McF[ WwQyhQg),azl&tϙ Y(^ g6 RE!C-W\|F |f~(/)!DَևGNi|Dߍ%_BiNfǬLލYfq4p "mJx\j!x9 ԡXi'54HR5 lqjB$rVd♹yn&{'ht]:"i69 Z5xZ I:]Iae`݇p ״jh,Eb\<>8حTuqdEP*{RcR# a ')_:O]k%%7(*c, UPڀT?ElLZnVshCØAY*q4}-DIb#5s{+A6q7,.n&gpR>ae㼽 3(dK7 9r}FBY﹛zaGjPPhUp L֮+" O 4C!L8-ӆmFtrx.hx } N{J4M1UJo:%\hz&V{a?oiGN&a;>tJx`Q}k 4R5XES -{wO.??.03yV_Ƨ|YlApdJt*Jj*A `Υ`sw>}ߗ6*ji$j<. Ua܀S<>QbvI\>j\"]wmA±[򾯦 HV /EҠB1jo&6m9\IJnO[i}]Q ɺ딸Q6d?2 |]Aeyȵ.iҨ]$LY.6Wzt⇁"yϟ^LГ,FW:P'|n#l&(9P!nR#?^cFċRFAI 23lwb~A1@nWcb{Ĝ`TLKF?8*"IR.696Y.wVҩe+scn - J^xsc3Pz V;Uv [f}Ͱ1,,vyIuD:6- 9>7[ 89|zÃׯ.ǹ4i~bыB8p+aѐ=OPr7a/=.d> ls,{%vR$"ϦUÝsG {yRE&d5 Ps~*o%orHpY8Z}y[<9x^Ycdhi?+U&\"a6&zm؀UK˺SXM\)4: r5tm`k_^`ǮjBh`/3"RjzrT[+ǹ A7w0LK,`$|ɔlS u}mvV;'#TEu^..,,MNd=23߶ E6#\ > hZVk$^g,HsnK3Gsۋgp =_$J+f 1l&ww)4~"6Y ׺$Op#JXޡў?؈2Xڪv1"8WG1IgG+ba- B $t{ T(k3a$[)P.fS,tڿ__Krf*NN["{9aA2܈MLU0jxF^YD%x145t|Mȍ}/D/}\~pI׋0=El>]as:f_$1 v?ң28Cb?fˁ w}:P't讑үTe ̷/1%*+X 1S?Uͩ Y&xNyґs_3KbvZUO0-0ahT}I>jڴӡ][Rns& *֪ xP/n~v/ AM7iGy#9! RaJxT9ZS2`*?j8lrK);MNpT5%jGA KEfd0!`1Ew^,_-&*4Cszݴ{Ko m@"%=I㖈 +ws#_NH5-_ P#_m70 P֚kpEHᕤz{BDͭL:l iY@,Idy50z3FW8?Vl"0Y*жΧNA>#~Z mmctFԅ3bh]vutup"O^Y ;IT3l"uls^OsB%R3?[jP[MYF~@x%Lic14E+>|6m'ח}҄E!} Tzh W>,%_Qv?Rt)A"'Q[*nepqeVBm {+(q~S^ܢhC@dUIL@qϫ]'miV2*r˜MbgYKt. ];s|Y)`;K+}Ka?eJ^Avp!󢕙B7VƾCTQq5Ky'Cl3qfS~m ɐ/mɨD@½Sg]¹HIl)Ϗ'4@Ǐ7}TDFLrf{S 3ms8dotdc48q{6z hkóы3&7* 9j|qHZ ݄"i} :ބϠ0vǸʃStҭj쩏\}'6PҔ&l5hSaVN[T2દ¹﮻!~ 0e>\|ǣmYl3Nŷm_y:r A "B!u\+yc@5\ 2TswS80k\p rBLJo,'_x+>2q]C>wlKA3X\PݎTRR6SZM/p/p޷ǰy&aEqԢ5V‚:K’)D;5Ֆe~:[e{sDZQJQ0*tWP+FcYɚ抬>(T %|(O̅{>m_-پ3&wWM\Nʦ Ɯ )7F E8+պ^cW.|,eL(s#du|†@o2Y~y0Ӡkis K>Pxdα\.;]~6p0 BC™U] {d\7M!b7!}MĮcl cۈwH ј' rP;@&2e:V 3mLʧWVwiEnJ-6vi ŝH^j;tOe2 L 3itI{@흴QMU)g>EHqgⰉ3NbHBڿB O)1!bЖ ا4}^Ayۨ;yPĒ< uHv\@^{SrOV`[haUGhC`?I,xFqMj AP`]O3-mg *(]GS)T$k;7tu67#n@Lʉf7{MJgAuZՎ>y oAX|giAFٕKS0y0~u^,KҠbi836WųHynCƳ/"<#%>UU(|R[[^giI&덭۔8jf';WeU1f*^iێ2"E;;5!|iKe<][n<A0#:E鳲yzuh%spWej*] %ݱ3q;U^g \i W!w7E}d;drm[lYM6.7< W٠|nO$XVBBh!B M|z-YtSFP)rҢ\ۆeKht<7iֱ/t@>fʅ]W$|TwHB04hU1eP^nu&MRjNp( CމfUJ}=2瓗@NZ6ͽs\,kAҕ]Dʸ2߬j;46Fw3 VmW9xڇ ?ĸf5BJ 3^پYXPFF8O2cw=5%Qf5|g@57m[54,Eg`wOn-뚏3.S{lmdԿ(f&\ ċZ:=_n}ycI7MxUjg}$]dN#`V#6:9Hgiz!$)Ҟf(O._fh_ժ?E~4W6Wt-.׹"3VRõӗouBO%sm0#XCu 4mac=мԹ!V$̷TlU5wG ٧͐(,K}ۈ-ucFUIpd:oo sp-F#إBCGj~(9&~Gϲ>3p]W]Oq4dE/+fpD~ޱlE: t.#%0Ҏ4ˈGn2u  c%g}RĦ/8Oԧ.DK)B*8{-ЛKlo1M Tl.~^XN: [ jgǸq8%$'|R,1A6ƦZIeseLnc~5/..Փ W((T ^.Qd)}V*' D3}1:7^c=[\~+*P2EUbn~0X:1R> stream xڍp$Z Ƕmgb۶:m{m;3 '$غ9Ŝ{Y~^ko %Ua3+ #3/@T^D GAfj Bb` QgLP f `app23Xyc 3v23d.p^Vy@mJ` lt25Z>2TL^ՑÃ΅Baj P݁f(GPrBZ]>\̀΀Ui9#_r29F_v665us4[rc{ m]>ݍlM> . ! 0`o~.V..Vqd+GD.p'f 4ӿ?/fnLVNn@i|,fff.N 4d+#o%_~>@?+s; `C 48g+O.DŽ9z1DMJO`ov?*[:?<"ѽqdP{mhAc?ly v7E[zlm1n!!Tq5:iW o\$vRq8Uߔf+' cX98>,Kj{L.r~sgN$_$qD /b0IA~rЇLJ Ib0AT vAȮ}d/A:?2" NZG5 >1 `nnp0(OA$--??2v6l?,lbr1X?_Ǐh0;˿8~,?zAY>xi_.2|*L@W8|5t=@$c73us?@'neSuChC0<žf: ϊst*MmvO;o(ԷBį>'MʝϾ/Uf;~` M70 :jـP;q#)?x Hz6VM/+r¿T1ĩ.P|5Y!re ED^G˛~'LwV죳Q҇KC~61K#r&SV SbNh*Ѝl^OһW1>=sl$Z;`C!2zl׃U:bXsS"8dz=ɖ(Z((mn US{&_]u}=z.%aruoԴf@FɌX,I>Aj ՠ͂ZOFz{b"jw(줶ìB8i+o1.MƪZPr2#b&8Q%U[fl\U@aqSzD;4[> lV+b;+]1;L#RrH&&vΒSɦ\81s+ÈŹ\@ȗ+?zJ,C[<B%ЪcgY0LQ~ D}fGo[SQZcN\ [*䂰!K|R}|OWRw#7B;:7%9~7J 1~8mĐ}} p{ eS괓kDlUwR!ʼ`НHKۓ)X8_*3t9drȮ-d6yJve p֮J]5-A,% ޞ؜3EhkQ4,gok .Y\!DjW?Y|Vu2('P1/!/LŦ_B҇_q˸ACƞTB; Vz3_/ГIfH ׯycU\:W~t'0 h݌1X<(fڟ}[%+)b: i5 i͵ Z_,)4`~"y "7΢b/ 9=^А6=`d<5<<Iiz7{T7|2όws)UYuhùF.ᚷghig4mYl+ ĜP@WDQ]䏃tԖt}.Bno : # *.A@?*ڦ? vda(BևDLǩӛA;J:vGPdv@1̲H)<%}ZC^ DiJ >=pfrY\!TBa3_St2tp&Ynzw_>+ xXH=Y7"۝zߧ`>ο 8z0i>#1vJC4'Y&WͯuZKasD O)+ga=H7ڋjB`]Q 2)&S:f i 1  g .%9r+Ŗyq7'e9x} 2.dঈ dp9qƾ/B) u/G>Ȧ|5~YJ ?ah}]TUǕ&? ҆6Y]`>LZe9d^H~wQVƭv |(:r T2HhFM&nK q\C«!x6!ʕ홇}yJ,w7!(N@u U<6 @А6=G sk^=*bKi=t%/1=&TUq]97/zd+aM4X{MxZܔ\ƈCfo_6R \4т~xM\W)ЬOiu t:d9Y2M|!I9{e䈕z 鄛P`5WdEި P+,4'24߻bT*۽bll:6yfRh{0ln؛ۼM\"dty!ܧ^b5b1i; ˙_K,0 L8LMO#rտ΂LQapf/:9:*KZZ9rP_4)M9//8 (%"O%S1MbVĬ߳IRe~M#1K_gj \xWTKsIWhz}Via\s. 9B$d2j`~Z X*Tt-r>uJL}J弓p8kڔEIz#q6_yzT:L w hMf?xo,{o߭~R$JakFJC nU&ZFvx*Ab7uGT oş`ol/p"%#-^o~MKA+nBPo)&W ]+x-{$ւrwK4gQ.T]8 Z߮'W%'~1u4.+h[1vIASOu2ҽ^"3ͤ`"S =O<_:ʯ|]]i@Fc11) .%'*AISM*Zi,@+u*1kG,OXdR.PW۪AɎ9hԮ='Ҡ|Fb>S%'2Ev@Xnq:By"+=t{+F{4f贀`((dޝz| P9GY f3DcSMsvI*$jp0o @&xAy/.thSOC.YC 9GƮe^VoMWl/(yś1~?FlF,~^~j7 a8ajs@loT侌HÚGNv8vRySӢ'~~IhRעi,̚ӿM~s4)V cf¾EsQ"[ C%ë:`cZǩ|J ,$Ot\-3bP0*ԕ]'+MdAn?*HcsrP`m[;Py#^iVL:D$%9|/X#݉m7;g,x2D|@ϫ]Βqmy^!u7ȳ*BL>'ʢ~fc}0#w?vIj;_fo;c͕ Z{ ӑ~s2iX=e5a}ب7v& ?زd [%$2gIN뭠*#E`m;2D 8D@D36?#.  %O-ϳCxӽ&;B\a.XGC9E Β;˺a ;g#Wgf~Ev²n8PׯW^W>ʺt:2INmptBv?ͥT$ k!je>(aȢDT b+`FR- 3)|"OdRKamEA{;x]P-W&K 1oZH`ec(sy3)>qo6CqθLJZt`' ),;Mvd5*Oï@ br 3V`-/ۦ}tL"a = ٚ蚦 3aQر4A?TQ`shD5?Yj%/F1ˣGHrLG0'[7EeY2CBz{1GZg'-5ZE#0ІU&܄oB$wg^> wSc_/wkŦ+YLevǺKPbLZoA#(aB[rح}TOlF\ Zt=*d{bf=M$Ḱ;An?!׼oLO*gJZ(gq-`@FԵ(-'#9(^?m-hN<$"yK֞*__̻ UIW-D8%^GNDR^F̴~'6cƷkg5: lm9_B$2^t6v(6 Bz{WUrrm _ϫs^Ff59|FI~:nLOMppc<m#;s|;n^ dʦ3i%ߪ;<£uN{26͛g=x76Ƒ(;>eѶr~}16,i~+GPI@A$>sޱH_SeLSڤZRVl7!"3 gvR{)44|mbO b:%3 =Ls bZ G:(2mP-f[dRw=b?5-lQG]&R?HxUw׃ԫA a#}sv}DDMGvrUMg ų ԩrD#$-X~o_P"?%,u#p֩&V*uLc?!֝깹?j@u2<0XI⩬-s (kk3"Mۍ~>L1UʩiyP1!o]&mp_qv߽0g@Ϥ Ɠ00OǨ`(ÿj_ iIj;؄&#/ypu8XMXS%)vRc:PZe;{]Tϼ3V,f߷A9 S@Aý}Y5=kfE\c&5 yxJ&ꈻK޼ yߔMy 5{{KG-c Bm:T]hB^܋/lRѰ^sX:!HoPfM8)x z v[i9&JNe xeUWgVt*qQ@;u!7sN]|LvYuX献>U?pe1jfuh;oƶT0 RH$jkg*9\s Cћi%wʼnma` !d 藕 U/[V.FxS0/8 N2h"[)nNꎟq<3WcS1,O8AB6[U6Q5!ɲ˔; I e2MJݳ30[/ǫ_" %-*EJ{o.׌uHOJ;"CWj@@_/+ KD[hտ kKHJ@~Bk.116hOo^PCH1C e|[j'VQj_ 6#gL 6b9KLghUFC49vxF`@eE&*Ź qVtMNCз TL}[{3wbE 4$rTUf 4d>o䦃P XJdsR[4 34}ճп2lq'I|Pn2[<˸c>̜J1Y*ЀZEg:pXoWxBG>Bk}1&P>Y/!{I %hW?q*Ф <u^,BJWamr+n=O]+X!:(-W.BZAJ! ö,o }kٗ'*C'Xw ͜OV!lHyIR|)摸3U3?})'"րUA8~A?yתnM!*9'|X_r# &`FG@T\}Ȕy sb\޼蠾W;j=SV(?d4VN>Jicn/Օ0eZ\WFyeCʼnQH'oPJy^3ЄbZ ߌN帗w+YŰ#.'ԗ;'/՟v "1a<;j۟*rTI\OP/K1xFU8W%*HWm k`O(74Xp%gF9a JzYr1(&)9 q){˫$duYkѼ3-SJ=q*4J`$od*4B0bI] 5M[X9W/jzoB%2)eUp8w"jnQxH)XQS,1/9i!L(3"!lJZ]sG.W{3 ~9O69Զ>nuPY ּB3'vj% u=)zuf*\#WGf7w9 ?qI ۶h+':oXoU˳a]] S_kL)8Kv8B#-< 7) uĎ ,)ܛP\k&mHr:Tʽ65fUuN' o^{UʌqUT]ܗ޴՛2EzsE"[I(SعFvU,Kc4R.%*H' vwEc Ś1"p]m!8.i &3c3WD2oWWT'oםkC0,߫&0 S(M6/p\ʭס?sFL;f P3k]28eХiO2ov4ta (p$csE3`o#MG}Y1YʏmF>@~x"*"Ȗ,x39IT{PB99 a\ᴿp>ʛgIWm'j _gůo`>/PGq(`t[{ö˨wb;t6z9s">5# \ Ϥ\Y0c%u[DA~Ήx(r`> 2~"1 ƉfD/ik>[奤~+Z⃱C.} } ɧnc-d G4Ǣdx`J q+<՝N,pVx{z];C$K:Zc ]QQ2$³`c |j;7! L5Ky)\x5 8S0>J +H yjw]sY1׳V^XN^KSTC.:$%QZڅޏ(]Nc99$&;܋pBP*?ٯU 2'|?3J4 N9/SD*w:SNmdO*WZv><'sHCaYZs":QԴ7f X.Żɿu5Þi`; U9A~ݲ9͕҆zGB "B T@F0'>g73XqģdR)Q] (\Kdc:K&Zzk:fD0 Y,Z^?<7j HM"6ǀ G:}ۉ:,_8Eі6 G. y^NE1+h_vԊZ`i 8{/9¸B.Z1tyjM7鍊@nyt}{1V Ѯ|d5OߨA,;sڍi)IAM VA!.TxI)Jk[;̭[dSBTURq99e%NeM& xp--k\p/yt}lLB*꫟U0oAMhRmӄv_ eN∏(J"ʿKٲ$O3 NFĐy%N/OpMmEV!~=B0<3x,S.ۑS'8.TXfz:%ʇ8&x]x+leH 8\El$UF`Pi-tm1Qn騍̰<[ά-âʞ~ru*| x%:℞EzݖT <:֞vaڅ7 %gEl#KbNR$:~WoDH>̓6/-'FP>}w.Z{ #?~oM3(W3I`Wҍ Ln$7:" 9䄟eVs$x\e±q8Z1 .hZBT)(F1N yi/- %e '*¿i@)TwAM5![`}gPQ :`r *9ă)'㘭0*^ᧂ3l-A]:C|OÖ+;hMDo6/]CZ1 {c.UHц_0(x<鬻S?Suۀ5&c$Yx3p9Q\mp  Ŋ/(ljeoFzm?o`':AN+Vv8e#lpj(! >tW}`rNtf3ḦL&J }j }_gJmTKFJe1$ӌ%З8HWp99oJoI]"DZ- m6)^vɏqKX;W0~[I,'K C!ۢtk./y"39b򚹫ŖjS+OeZHge`:kutoQkN%4 {~Gb`Dhأ߻9ՑUK:gۤ`<ϐ=&!-rĊdԃ`ǥb޾L_w/-O?\#C.m|<`d-2xvs62=n5,YN452"a:ͻ_ պYVwzAtjccSIiG4-%ڏaxȋg>1a}']gg#kEH9Á}Q+c+Co]qDpg'bM,. ,1xh5 DuZnvQ9cyx/ԮF$mg=loP|m,mN{+LkKD[d[nyDYf e9 :[pEd1d"T&uYֈQu%$/'oy84ʎe\#~m?&N:Ċ_"EüluFqx0a%u/<(6E9ԓ)ԑ3}ڽֺ \@@U_>r&yS(nse}MWpe !8 cq`L}8n2JId[VBS$s@&|~ ?.C)9<(,cU, QD ^xbdKaߔQ[HןBok FBXhu%xŖ5LqlC[cNNEudۀR1EuWhB,70y5@%NݚWyQ5q!o_{1GQ-vNO^&wгiHlEY=5/OS}UaZKID}PN-1Nd 98Ҽ2'~Ƕėr WD`;VT4M'[ {R;UMH5wJվPcC$#+c|5ݲ(I7#<3oaŦi }q MKn'jȬx' nޢ+0 =3蓰G$h_K qݎCŻFuYGYnFϢu0}ǪgJ[xvDΈ\`ᯣNe@n|ݵ,\YiIH"詴m|p\p>ւ//:0+uG7v;pzRE֯71.ɡdRĀ&1V$O-O[f@ O/K`igYtvQ8F-`Maz+dy&hAK:OB-Q ZJ;S_Dd兽v$JD*$1 !5;m3j:=k)Űj#>83zHXEays_3;Pґ6!`Ui(E։ޮZqpd#.Ot)J2ޚ ?o6Ɇ}?y_Vq>H3N;* EyjTשs;m00+g['PVmR 1ENloM!5n MzQst<[(͟-7PI{4p²o?R? Wn'w'o70*R0P+GhK%rX)hGJ ޙк'KORk\ZeZgiɁ2!t![g=[-09): _cI=㫉/E8cTav3$Ne=7 endstream endobj 276 0 obj << /Length1 2602 /Length2 22619 /Length3 0 /Length 24100 /Filter /FlateDecode >> stream xڌT  4JJ% C3tw#HJHtw#)HJZ,yXAN(f rcg*11YU,Հ ? N`Nr0>p1s129gh1t0lA@Gra[;w 3s'p}PS89ir, AYC's 85@ Js'';.WWWzCGz[3>*Z9@ tp~ 3]=9@oX[A`g PAm@ 7&zEdn2ZXb2NnNC/CCkG[ bCph`aHhaD_4.Lmml 'G_X8mwg{V [W?dbg;U3PR `cdddd@7cs_*vL =l"@?OGC  `ba0Y~@ӿ1xnmF1M^& k͗AMBYLZ ٺדTdy3B.k[M_Hܮ^iǒ)(Hw$Ntphgn3Wh_hX=6f=VT;qp@]L:Hž,__pk'LB9B)S2δGI*nw Ǭlя@wb ^uZ/qNռf5͏<jWnBRo \E͵W R`JF_u%1.$q<x 2m}ad?a:.;kߘy;o튦AŨ# 9AFeNhǜ Ej`L` F9H;LY>x|PNgZjK,["qAP`p/ui桭YkP {Pv%ϝ ng{H4Ġov<ҖHS/Iz-.|x\&K f5 \BG=QL#oNOp)N&$ٺwIsAxi8;sY2UYionRGk晥I>WBW`!zKvyBE fZXj Bʩ}';l*RΣ9Yay3W1s02[EDIzLB&b/Cچ!C?_p /ٓGa/9xXf .yo% P?65z;H;3< CXaJ8WON{_#{1&$Y?incgu!N׿lzZSٿg˸NPz!+u'Yl$9+Ci$,87P*S+QubK{ k g!/SKS03NT|T #~8/kK|w4ÑLnhTz#5Jl#[c9>5;tuZ ur_7r gX:ot"1ջo7:gfoG|%쵒e7[Wgv#:'1Ƴ=aRcy1K3̀yoy&mI:B_A͉,6W B \Υ5rQ;b鯕YERPyȣP>1Aɸ`Xt$=n+Р>RK͊9'{׽9 W=m 9\jTB2 {<%X'l%Yy7:)I4`@b$p 8<lv`S諟2|EGNQ׆#{4J)N@(!B(ŝ4uUVv~BOiUʦcŵG[SZUte.MG7&~|3dUd:(ܲWo,;Yu4Nxu.5/偣1ydLLsHr}F1T;I`R51 :A:&.Mnd&.ϻB;.L녾"z!ΏdFMra^қ" +Й鯐yg)a". 76M˺~@Ɨy\n /ICB/r,A5V;5h%TL˷Uhݚ|KVF2z9y Ia]N|찤~%<8}5@$kGqlYu5X%oD3z*C{Ib|PbR7uɊ yԁD?O K2J\4{L%RܱC~UM{wk>R~͂fO11HUȳiYTH:>H-E1T '򼝗N"*cL*CMezs ߙT>( JJ& 2Yz?DByXUZ7<]e/9M}ah.[2+{ ?>;8&at_^֡S[xol1<ህ"<}O AFvf L&u+fu@5Z#y5r&Ә xmW yT ~2 e|ha1wfįnw5ܕu}΃?J-;,K'Jt!f;hK @Z]?)]7 0UpcZ{Yp&: OǽM Rm[lr%v|R-BOu P'f?0iQ+8F8u?`q w:V/U#P28rϞf-^;Y8 RZ[`%xo1{ H:`ΜFz>ꈓVxYEMsfCǠn8vm'A9:dPrD ?~F|OV w׉EBkg]+Dq|vq!T!wu Qܯq(v,cR2s5c.+ڿ.HRh:zÝkZqwfJ ODLx0 +t)0^)3"J%. %YSOב6wlؤ!՟^T= kZMӕQ}=?`1Tߒ5C@JhMƑ&?0l<&|HZSe^N75GV 1/Ѥ Qvxv7d*hNprBGBObkB`E ůOR"f!f6 HXvt p[IFأ[JX~\IʳKe:#n0-i !,>5@ V*a4,$vwo:2&s;I0}`Ͳ~``D8m>" u'뺆F޺(=Dyrbyh" ߸-FjR%lͰ֏#U8P@L~`N+l#0+8]BKQ&dUzt,N%E^gFo& ;@D7YyËb'LEA#n7h"K"K?^3 ȿd8w~mm:UgyfF{?gB " tp*9. џD*\?N^_+kt2VQo64,/ԨS# z?"i5bNCADRyt\N /8x~d3Ow RЈ @U{AQ(5hkHMl'$7t&)GX)+a*0ԀG{W33o3\&M+a3ZmcIʽ'B_.<zefkLKfmZ YNcΔ{yqkL2tVj/=ޡz~sjdOwxǬ蜬xr馕&򂄿 OR[@TƣڥoLsMQCeEH362$g7@uuGϨXv  [v{@!GPޣϓ![DRπ!CSx4+.4zBh`8E`/V=vԈ)„{v%!j!4QٸyݴA[ tϙy|6 G . xعN@X[|'tHUy|{ɫc UQN1_NI0F˓zr\A= }iĊnr=eF.dF՘4#(wt `*\ʔX+f;>wH E.ˆ6{d/l½eM4&LW0h S0z3 6Ш /$Xǝ*{CO 6$bAQ RJ pQф}JC $-Mo*q?M`e^K(g,:9N~ E&>U嬿q©}Ua̜Mɓ?]E(vs텹 fJn`|H^qI3F;)ٶ=SmE9~>;e ^435%PrvǃhI2'e8WUô)8P7xJ3X>91 7*s$/^ ljکRʇlwE2շ5V4;4ڸxĿӁKFX&@l۔\ |ZWr=}1tyMZsu3|d%3\EWQnrNIhR5[LsuגCr&iT5,ɳ4m7PV}.lv!M^0J:Lc~Z]Bs\MKV M!JEч*d+Ckl h]gUV'x;^9ʃ+X1nRqn9vնKN6HP{492R El  fstv7A9n}5=SK_Pgu9|l%G"@. K|Xy W8-/@0bPS;ia Q\R=BPS Bt~G_ToRrݲ8a7x?N2Ohl.gGJ)YҒxxi5E8ٞ_-p9/S )WÆuݰ̻U7ynSH.J0qxqjSh1Xޘn<vʔ,hQdx,U!D/A ޯx(KH qO@zq61.OH?>IKrEk@5~˦_M,ArSIy' V6aSُE8~wIp:[Ԏ4}&&v7C+Sɳ+O^Ն:2դp2&B_lM'~cZzQ/e7"}kc \՛:,|uu1Ї̩ aT SasE.$եrXg9nU; PpHeOlF\TJǐU#`uVsSu0\ЃëB A(A1D ][ UlК}$ &U#kbP(ͤEg0N|]H_c ٛTe$yx-y_䴶#5f&ǮZ8j}s_1buꜢ[CI,E[π$s1б̐B2V6Ϭ@t\ AGg;<ѫ9^E {{{֛0 Fh*\$(is0K,6Ș]Nir@{#)Mp+mcDt@b@ nlZb JKo.(fox@ңrn[w# =6pКTFl!eM /j-YC)I@›OŚ9US ]=#hŋ t3j8/ ~#-T&@6p )—~WHXdw}[KQCw'ǝ E6u&9գ޺yж4Xjaʋ3╜boq`)z׈)2:0dKT$݊c9 anbrpkjj_iOAKZ–hLk]d%(HD;3e$6;OG#!dA$Sw7عyĦI>eI4H6,۬ FآFu1>jRaxo,VݎYIZHG+0^6a]RxK D3إ{ЀU=睟6l`1tܳlqө8-۫x-UErq ňDy!H6KL{2Oy˷~?%;4'L;%K~KLa qr ίƣѦYey M>N+65J'(FPF5lo&2JQ'!Qq+vcshZ^>4Kذ2mhy33ᦃ<| V gA6`:cŗ%%S'76s޳H!ke=#.ݾ:l߉htf9Yھ!:M9]^?ݞ~0vyz0RіR{ٕhAH# ϱnn3|*. \\B%:<#ӥ*Φg Lw06s$2_v|̸H6u͞`_ix.ng٣D.TwwA!Jv liNPM6*Doy`,{$#3墁Q}5ݸ.]K ym3):~j\a>qr8qݲV7 y|Dâk&oʰrLwY)^FrW(O#d!{]֮}$"3gjhԛF̻B/_Y;0a5 'g)e9+HE%فJSwNC}lvPVR,m΅U9TCl(@\xIn/6v!yYxomI^g*ɹI?WHV<[6c~]ϊx,'\*,*5b@%bU~\%Qܘqܚ%3[]ɧ][%8  w<@*I=-^>@Rkl pp;i;"6fb) +|랻ʒUC6eٍFRG9uNByH^\Kp> tahWd$ބ[#l2x 0R5V1+p r!șZ!P{&/ &߄r]u T}?Eþ}/촛IG@P.8j5wD{Ew ]2Ɉ/eZ՜4ìwe>Lȡ^':AqM>k`+~zWr0n;XqgD#pV 2Fr#NޯҨ8+!3G$lfF};]}Z+Gh1**oܚ\- 4,WX{{5jShD[V'H <`3bF8Ikg9P[yHk_iCBQdž{g>eTyɋNyUAW1GZy:!r'ӐyДir hw|\TP5N7-Uwڌ(PHkh+qBWxIoho#|FEɯ:KdEVKs`] rU} 8j]-QAC.G\4k\ic۳:c/r֜S0 Y"gZ=;+ዬrӹU;N,l-(Ҋs dHJawa~;Mypәшk^@يv p;:p` ' j%MƮ{δ}rat_IzǑ48\ZHi°cdm~|}|!5J%i,Z1ױ}%S+ȯŠ.ځDtlsUqP[smaK&ICɑ4w7>=|Vԡ<ɔvbϣ.xQ4B/j1 ӗ-M:Zw|-8DCTbe_‚ CK%Kp0lB?BUčnN_ E|#*ʚ2 _*Sḑ5mBC2(2 M5Pr29Cx{-{8CU0OOZOr %Zݪr/l G*SV&~3jn4 WH(")9x̼=ڏzjgFÒxBflDwGWӍz7GE(򱽋`Xt.rw!vF5O2Qftgt\YFjXL!gT$dßh,QT@" O ̭sNWU鱨rI6j8lrz~M6@C6P!9wܪqzʿ*[/<3qH 'gүEI_|ºưaE1:|Pm>Q}a'3AmBDQ Wq9:*fG˟HiɣVz{'d=kvJ#0\S#>f\,G7VwUYY*NG7Fʱ,^"70$c6q< 턲гHԨ&#`D5<\֣ m@y t΂u3 ^ dՖ,L2IJxIlM}NR:_NsX'vV3.*D0Mw2)iʽYZ'L:RP<1|j otOAc /O >J2,#8Tc.}Ȁ15[<`,̐X` ^> Ldx^VOm)Wv=;O̾w94]|&dM59b WBXҖe:;_` }A=߼Y8x&<7L[<۬J1`%'fxXȔ)kDH4uOfPYPUE.过ˈk}2з&XO^at-F:,  S|pwQ\|aa#Fok[h% DHj'N#:'SAtFjXv:umck њ7d 1: +̬CSS{?e2àةߡ$`碒1D;Di 05o!ߴ#x 1ĸF9< ?Wu.(m;_+8 L֣9OL?J hv1r) (>#p. 1ⷎ}c) G <#BxY$Ps9[#2bɱۖ3il~xvZ$ UFnșS؁S RY K[y@ANnˆȯRu{>9RZ65Uc[Aƒټ"]%tc?1H+]`_'MK▛EJ֑\k/s30CFlpnS;.ݼ"[*&~RŃ8rd6j8(Yvyzw߇*D|2A0We oJ>}J݂9i Ftc6T~/Ś .|P\{-tNX^ aѓV>ăg@!y1Ÿ~]S㲅#`pO3c[Pw 7uR9S!mʄ~uL]#yAc"Å=;;Ԓ nj.]Lܴcdޛ,qz Z¹fuIrhsz3i~67W%0߫QފW>,򆩅}o0DUYԯwط~{ T +Oޥs ޴»@>T2eU#W $v1K(6 ar}u_2ܴq4ry~aGd g)$A/ ŷ8"1%`N,f%Aj#kGYCxAtL'2!*i,a4Bi3uwKOW4tXy _]i9_n,1~C>零r'Dt: 3*5pS=\ug2pR oO ?@>L΍P^#Y\Xإj-\ϜD+y|OMMzxcg3@' ^gNV^ϽGVq `$nC(nMiIY9`;:׮&ɓI;3E;,=.-#sH~̄1ظl2e_}|2ۅEyC*WKX[rp ~x7-mT >5wIK:refQt|a&;4uE[v&tv}*5s[\-)xKXO)t=O.Kk5uh@wxh<̂ % ^  z$*y8@:A+x´Yd]CA+Ix04ַdN2{ȭ,ug$:-?L/x)iCo|)-V%}qnr![ q#9 ݭ[EZtiUF4"JqKa:nzT:+|R \#5cq(Wq뗇 -pm_%`#A+5^{e"Eaү _gmXj"(ѫ&|J 5"м 9gρWIמG؄V¢V&A؞_đd ΟXG[XQ`2>kk&X\a99IhHCA6 fK4?L9f L02K@wӚSIYtcY_\#A9{)4a պ}z U,PVmC| %Aq i%YZBMNGJ@m82`e?Ͱ"9}ة K~)Š3f`| *ٵi!0X6JkBXs_T"L0E$;a2)xx7w/.Xx] GI2\ O5/6#4f}"5dQot_cEeR'a)9dDc, 'kr@3@\= NQhBVԀ7a. RD@p7p&E%#IB)g;cx?iMX"O?j"t4mTn} yMXf2x.` ]Ӛe~6;$MV5uƯ|_;u~M{r2hg0הPsFz9/l4mvFTyZ}H'˖o16F&MgIsIBTsʛV`0KΑݛOr JÙt[[9!q7(zTI*ʵ:@xhA o2y aPRRGm-S֡OH¾.Oݷv;Ի.b2$myF֠K_[i~{4#tlǾ LGj;HaAQ_NQqPEr*H .?3zHKKGu*O8o< g YףD=vFPX@f)`Mz\jKi7"F_I)|bul4LM;̭o"÷JXƆb4Q֢AԚIKV/ A9NH4F1ծ&Kە̕j俇,QߥS9'+6M5/UĎ\MQ#$F{8vZ-Iw+˒MKsKSf  =8⿧R{J|ڤp6`W TyV) ~?^k5b:!эS_ԕG?N wOZ٭C-IrN7{<=׷lq}`ck :gCSvQ~\ M<{MZh! 5Ǣ0+)Gl)#JYt.Lvq0|YP _0&8\ȧm!&PIZ#nC=B7t,q(]w:HVK/i=4e"'N#W[>EEХpW 6/IO憐ѕ7@鎭6U qV[zexC[k(lD{Y@%ڷdƔ/z(ri:-8h41P&"@CrǫXz ,(:Q#|t^Ök)5Y$4&72NsЮ?yT=u\7K+,8Hn6haƇL5N_ r90BGBڴ28 \ w-|!xpG^Nd*=;b_sEqk!4ft#bC;Vv=ѩ)|fM䄟-P v{| ^ަI/NP d܌('TV";x_*[4SBHmu.`%V-I~!˱4JcjĂmRt\e3Xm "+^ llA 4r9؝ z+E$=Hri?[xf83!Rm% ){4NZ^=q_ flPϤj0},9s+b(-A7": Y x=4Z>#ͦV+D%?a9wWE6\AG_HE W4R y9w8+W'=[\ I|Ќ}1Ua̐_hV o'v?/y xO4 kPƷ(E1 Z""d[UQ,oFp`T['# ,y>m^?`9G&raa6)Qg 8&#Nrk߄PKi=0{[Lrߜ‘6aK ]%<1-ȳ{3 !3N J1R)$}E ,cy*8)@4zM2Hmؼ:d\!µ.L<ܭeя]l5Xse}|a|$$Z[f_m]Ћۯ1oM69@ZW~ Kw3VEy' O$VVAXcԡ㧀vF9^ii+S.=0B\y!2pxWj&][mj4ٕpEH!TM^X[_h"dQUE֪--F24%5RKQXo`輘-j疭5L1W= n}r\쉢"[vLϾvyAV%hN%|+H,xZ2vCIuYI-,ízьR"E<.mof* I=c2ʯ)x|8&lй`Wa80/txՅs*uϑdMLxnT-Su|H##l~%kO 7vBnjU1򗘥t}{< HH@i3ὲo +I V.^?|w 3RМ!hkW h~lҽhT'+4EH+=ɻeW9ZMKI_WϤwbڔr~sqH$yX5-"9'bm*_pTPvJ.3Cb)%uFUs&]==ae(y=eQs$=~.kUSn*0;םh} :"9~iFveUȂ%aXʉyUq}aasi3X=xQQ%JM":=4(td\-kB̡W`z5Kr>|H6FBI ,% #dͤEuZ)WgBrB/ҰHhC2K g߂NAb89{.M([peI4.R%JpTN۾k#4YhV)LJVdh~jur w;3<3o-UsY\y֨m $߻\l%_G;IIhi10.:xx̾|eH9MYp\W$Q{P`} bzlň6Xհ8OF8m<"EUv_~ I^6E u'`S .0b; _Z,U hD=Q% ߥ*8\k.c7 CbG$a>&*ui" ,0HZ,3lۭh6b(f߿73^@ xn+__:3 g;@F{g;;xtmC4]M#I[ dեYam4 Xo2N7kDqه:X=J/ 8塴/%73-s?WsoB7aTY*֖bySXAoN@OtwԴ,^vX 2/`ޖcICq+d9.Y`RϷ KB? c1ȅeN/yt\hc*s,@TE61,nPōF劖6#An 1YWU}ˤ\~RͽO{BӍUW4StXwȶʇ >P\R+LKY8x"}t+w6hm ^j_3xjڞ-?Ԍ kѫ{8k$BqC纆_J*-Ryei͝}ѫMI:b+C Zۮ*˽gDA~r'ܙŻ8.^hՄX?#-W Qq(Rx,H)@_0qFaP~8 BnjVfA&Ecr-_čUD45R~(6T󑛑jD 1/1`c#.=@EkDŤF` iAl"ϼ~ כb}6k!SUcJ-zwN] 9_ rl.n.3߾G܁\ٝ$WXNu=ݣvi&'s@/4(.i:Ad"!QSQ6l9Fk(&! $SaS96I.'ϴs.2 gᅰy ^1fCo-T10\=>T4ObߠjIPcYuX@:uoVT 1wgS%"yt<7έw OE@ SbZPvFEdpnL N]L+ê&&$ɫv6J(5:ّ {6tRr;"IJy8K~Vϧ?`CjتAjg3e=vWD\P ĥ.+0fT*T&oLH:]~n^_%9ky>ReL endstream endobj 278 0 obj << /Length1 1751 /Length2 10031 /Length3 0 /Length 11140 /Filter /FlateDecode >> stream xڍP.SHqR@) H`];S(Z tw3Nf2^6S%^b=7 6#4b>`MotudEHw"`Urx:$;s&>rd{zin7е;hfKdHz-1[ #~}&`+ "q$ubFZN+w2ڠ~4~Wԛ۸eeOՕ9(nB6ǜe&6^lʅF=2]hU~tq!Vf]&G'K)Fd:7@Q}[T'0Roٜ4:Q/8N+d菤:Gzރ#0ΰS vSŠ9f WPQZe߼-,hv]0^7 m)o $ r8^9yrW]$A"9~R.MYXl2} jqAt/L ".Ӗ"J;}CoZ8nlX-3;!0&?0٪m.# KeMRQhs䟍27[s;Rl0΢حDn[sR ~/(9 "]'we䃗޸wāӁ;e>}D9g$CL@8b;:6:}xޟt-ڻ-Q/͘5&*<;_5raM# C1JHŊI. e6 >x»&xFVB9I&[YWr/Q.^.Fʐvl,zj'Yua;i_FycL+8;ajt81;4>?miD;ǭk6_@j>+Ûjъc]p[> w"،ءr=kl^\9wmH}%~Ez1Hl5m7IPf9Rzld5)7=7P.Mٚwx(>* D"kHɿ\%l^0v H #@`2t)N# NJI-H+{|h^6FP&wgMQ*c߻4ԘOMi 3yޛmO3/4vK.c^=8T5ޟE-PTƬ|SS>Z[licY =v+:RT滲%b3VNB Y2KH0#|D!)/EsJ!׀ hւߗס >];( @.mE{$$ G}aXXHVyxKU8 I/0'8 Cߌb4褥ĚL1np%SXi+\֑}s^ŧMgA 6эwf4[JYlt`Dž-^ZK:<#eyYKc&]g}תy?Ķ'-j=fs.m1`kcyBzẺ#A=lm 'QdW(|-H`H:6ʀk{Zʒ!Yr R̾ LK *O+![Cmz(5d A) 6OIn7AI2Sl c=9Ugo[@= ;zfvubqk﹟&[/b j1teݨ_V$b^oӄo]H5aOذ?]D]gDyCX3cn6txYa*vu:I u}T;2}h0wV_YU^XڠqgS BGP(xiMJn54RFK0[oDÇ_`&ݾhkqoR͌]OBDYOOU&zae4v[=mo{v~keIC+\phZ8B٤Nk_D'Y@J-O‘s1`<_n+։i UE%I 80 fe0Of>ErxKB AS"~4zVS4D %ÁO<|[2k=+ؙ)jOU.luV#pWHMUF-۔dmN;qEz :,9~<9Bܯd(j^RGw?.ݮdHpI_Gbe]GKF4T:/an iL^ "<4&llϜ@yňGN1EU2et@?3b-_{Obr̼e9]>ڰ)]mδytj@$9Cw̅յiGs!:"_3"-_yPQ2"8dǷw m~9zjAQ^*̷pٟk}Lc iς8F5g.7l^7ZJۙ7/K܄KXr' 8?R]ֆ J'K^%"%KOobO@b5~.Ix_ nZWtHuRW{]&]%NM|dُ웽ȟ{`nw_"sw >WګLXڙo,EҌb#Kkh[E1Qel&R3C5]#Ɩ[:_uK`EGE )S0Po>\5o"w&Na!Fd'3S%i]j (zwD)4|fǁzT0c kZRyd}]? h:.Y &Ԧ6Ƕ˼NmtoDCͰHݡ# 0['Ru|mvxca%O 1yl&R]h02Mٛ2c&G[$RUˮV7¨6*b-|(Wq'l_uHȶ?QXE{R:}';޴(3rp3O۬x bfěc- W(dFa gcŬW >3lȟU@#Z6#NFgC>Y `K&}rK TLUəIqj?#X@ p86Yy˼6?4$!q:XIL\<ŵBE*>LKXB)\5<G[ эKdbL(5]lLi(8(3Ɣgy6J%"N•:TL u5rP27q36;䦽7,Et_x\D }PWo { Mهast8fٮ2❦>9r (:cp`LMT@:{qՓ tnHeIi#?ʂݴg}`j5ۛQiیjR!|QerTl_\mf~~{Ux2Kyvfx;9b-tÂd~2J!` )pyʐ6U%xa& ']-Jfї2r3Ćb#Vۮ0嫃us$yVI{O)CfXL.͎_)Q MQMm)7A ]TgYPk7dH-3db(/)нHs~ 1O,ը7:]#ڷ(F}Wl1;erxG4_nfIV8Eo4_\ hM@?(B1R i&/yq370nvlUECC8Q@%Yem+]8.d,ɛ|{~V c;Gc:g K29s(M~ߕe[(l |byy4^:SZ-d=C5Yrsx|DQUDz{$EF{"L;PFبmjmv[c+ 3/DQY//G:o%e{Q\ շI^"r|0!M2"uTE +<~FY]07/횗%7 ң6^E5ٖ݇$rO L<4س2hmk& nC{NZ0xgȎBuz2E@Vnhl~bq4FW6݀1/jf{/I(3( J~Z,9DP|\-]0>Fߵy;M7j ڮFol2Nr훲M}pZ"iq}edlZAlkew]a?3r`&c ɬw* 6nDcC;#q:?%\ĝ w+Dŧ~=q˕E.yGIW* ޏn!$ܨa=8٫޲G^zX"#L,ܢЗ̒~08: ݁+3|a1w`gmdܵH+ cfd%Um1b_&u Kl.78¨ϴ5b9.KCLXZ~2 o/y.:#40U/H,6.~?x}YibtO\:Bޔ1@x>f؂f~ O"!LEs"O)[z{;Re#jR'Fz=g~V8 S '}[\.xrGZ! GclL?DXJ5"HѵR)E0'/\>Gq3)Wm yA>w3{{,f5Z r6Iْq(v}:lwxwN9<ڢɑd;7D,c( >\K'"Fc^nd-ݾ,ߖ‹%"^;-~l+sw6g|:q4h͆-[Wdnn)h~-MXV2s{=t\QjVf<1$m98+Ԛ6>2?7O$!\#>RRRSoΑ.H}^8D -YJ_,}5d ڮb^K%XFC"֯`uhboWbvIl6+WVKIgSI s$F pdo8IT=1]Z0zwF_SovM]UZ:~~TA~ 'wjH>*KMDL*v1vjUƂNXCQ@^}/սk8qk-BR.g Dt2ޕ>'ӗStͫ*{%>v۲z 1j5CiH&wֻlvzL͟(Bnq*s?%rqмt){u!yoW|؍ aAsidHzf)e./Cn6܏d!DTJ2G! @U@/8Rv6ȚJwtѳY[{6ᛯ_VlGҠ˟JTB^$ܦ}yuSk}ق x=h_Y#Ӕc~Rl"Gr[۰JT B,>OϡњMK( 3ۼ]1v: F)tpPgr D>u_-ߐ3N^nE~ϵ~*R[ PFk[8;PFN>֜$AvscqZ_X\d (v^n>ju7r4:GfE@CGI li01>I20/ay̥ʇOgiBЦcPuf(@AזAghWFuOpIDDD>dv K0E)k6,ieMgֈF 4C#H?ܘQ,6IХYqde? ]?}rC6 V6zVy3g >l,f[iC&gCa~4; %t"Ӊ WNgdT2ǹPPbCENt msH3g%2r|PDk{eŅ)3$Eضgeឰ!O9Xe eq+xQӿ Rg  @l&In.ω+|cKjع䶏2\'V@ iFt.dZfes\^;1kq6"8-'*N 91c9~a3L_˜*QShӺj$(~ O*YVu endstream endobj 280 0 obj << /Length1 1547 /Length2 7952 /Length3 0 /Length 8965 /Filter /FlateDecode >> stream xڍTT.t(-!5P13tw !! R"Ht^[u֚s~{ ke5&s)H qfbeTY@ ;3ȆJEviF9:9Ll&Oq P@`} ؀@qW9@ PĠ`K+eКXyxD@`3@ d-@ j9{-=/ 3Rv@ s/E;̘QV`?jP g7G` 6A2\ G5y=G?{`efܟٿ !M̠v&0`$噝ݝ&_&NЧ|WS$ET&OdwvbvS% bP;; {q6O`["abϢ;d y2c98@ 'Y*ade~beX<-@O/T/'Wo*++l 0Y!T2,Ov z2x9bOeV`>QQ; pp8x>7*2 ( O럪sb]A$e9fO?'_Uo Iv&v`[?4 ЧـoIV]+l4"Kۿv̕fVHSx*o N_w Ӽ<'NOgz.)1;67GGT89^Ojrl 3x::7o,L;Eo`19,V 7 @Y,A6S)=9ٞr=~07sqt|~k-2C][]U1m LQmk1y-8ܠ#\sysyK\xk)%A(Nubu ^x>b&uoޚ6p:er\ѕpz?.n|z#vW:V#Z?h*4sљcb ;{L6-{:[J:S!%. 9n,W(&a{Ly״云.#A.}O<%ꐣiHw ةC?c1b^tz_͸NM_;V#c^:&jfatqW/8̓p]/<%^j1/aI9c%[qVB|vWѳ 㚅 Ұ_&uz2ؠ0Tmc2>59,ymW,wHەNQM?"!͞8#m͗B,k_IaVl/dr#jvd|q -÷6y1 rF+.ǯ 7xG`}SodO?vAx5Iצ[C8+˂^_A}\L&Iwn_LUHRI :AM$0ixqGu\wT܌H:F\~nEZ:=A[GίxOY 2 3N`h[ypSbYrY3*O5/7-v}RQyCS[F&h8^k-t@+,̼i:|#x o8aȟ4$X䨪G҆* tC(5m ܰxzj`/?g\!r}fPd.JW1!f!kus@jQH.J=heh(*=U "^禜ZyłxjjL!}I]GV#ˍ(q!u—\,.ݮ.}4j-AVuݝ 2ub|ҙ-B[@Vsiq}oWhG "Dƒ,E48YNβjDKO8wRb1 Su!Lȣܭⲫ [C>o c͉@j"-iJ-G\!Fٌ0_npk Oh}\F!ﹲi5qlgjz|OOIڹ~sKWG9樦#<5Ϛ\"udHB Wz+sbT|9/=xoriP6.BYͬԼyUhL"`ʵuOc#CA ކrNlt0/N kU(jmP E\a HЕ)'/[ ϪpkЉNjUњapƧP_1k9ԖwvC3gƊEXE+$7R YZd'?Pd3f_ ꯵IYY1Ҳ´ȻKRVrX$# H nF:dfPkՉq21wdX]j4 lǸ'sQEm6k*EjuTcDz5bӟV~wFuTXɥ&s%UD%d3sm5[&kA2C݊\~4Sܿc4% t\QĨ7ԧM>_}Vҧr6@EOlhlIO )9_X6ACH}UƈMA@ ZΏ SB Lj ԙ kc'3| MV+}y`Y'/zvl_/]Y#Cʸ$b30wѵ%[*g'6zc4?EN+|o"1ٍ猀;񮏓F31j,_)%ޖFlJ_&nZ%ډԬ қ;/U~Ê՜I躳>ȑDaO"G a犑 m]e f&am],);Iԑei/CRlGO-ϬʎƬQ+8C&TAHYg["*s&*PSnR|BW:9 -%&pKx L*w= "U'-_tx?x˘Egg2EsNH]ji}kn|*.Fm9 #@RgC1z7q޵.<~Hvm똵?Y#@妕AS>ىVXo.5gpaYe1E׵[ggbml!EXr>?r2_V]BP[<}bi֢h%] U (a4~ gvFr*x󶻸qE}RdRu)[a8/=GN;,Xv\#~bXGBxgN-U4OEW{lG QO4F 5ɳ #cѴeJkJe0 Oo2(v 2Oz1P$\çz%GR0)Ze$7J45P(E:eQĚ0!)nMC>B>Nʁ)XZzTO?Vu(ϋiX)0y鶉"LSYC;$*z" hTd;EX>ܲM?菻\s茕O95NVE|Ȟq+[2?^-๼NaQ$F7xnE!i}oIu(ẰNqCKhuѫe)“N"|!~0XaoA8HxUZ屳wrk)ڹ^U 1`2ltJ$2B`CfL.[Y%2B)W4~#4WZ|Pj;f~D,1$\PF7o  +Au-PjXb%/z\7V6SNj^x&nb 6 Q0 e.z {,JvL!y@~x&@.Q:%Cbb>A7SW>4{ߠ#VsrB#?bah@ӛ#}k:3>IuʯjPdZZIvsTp!%Zb\ft~v%\qX|Zh+ppOE$ޗ:lǴol+nt>V+߿3 f(CpܑVKSIG'(m0>u._膢7C9[U˒KG!/^|T#QԊRsl+Һ ̓c[O[Q 3^eO #1 I@cdd:l9® zj':kcsV^H2׈tCMZGæ<4unK쒹> pTCQCo:\0Qfu $^V!n#=`YO1`8/JqP+qFi(S'H*rHҒM}cP APLصNpǶ']>=ߐ+>S֬^~yrDB0z76;3Ǥxls`$:1e˝qQȯ^ /"EW(k<8l({*[Bk&s<ynusYzZa,g`&u퍓-$Ⱦ O°{@fL+7/ܙPmfVW`рXE?8c 6w~t܃}Ȋ8>bsdWyy|T+WML/Jd8y["u1`ljakn ;U&sLTa냍UWqEc&Xv'|%Hmy6A #Aև%ΐ$}/GK]j`1W~'+T`s^ 4=Nyhz9GHhwۤMV!86hVP̄ 1 ܅'J;>7#<uȓx9ONewmQ}K E}ND](>2+Y щo[HoV͸KFݑi=c; |Uo3Q1Kr^'s](`Q0FK##c6պGnIaBG^ڥ㿩d‹ ?)39Ɋ Za9ݖwkIw' |?mI jmT\I WQB(m.o@aaGd28m;e7)ig)yU moV'Ohby3Tvg6ڋUCsU?/)h~3>ЉlJx'^N0I*҈WnOfs;PAܧti˨2/O7H|޾vyPJfӸ|XZ@r/+hܨ:7x.㛣Ag)'"j]iE) l%,rZ_|>g+\pX<>HEןWֵ>t9i 3>DC)ےK];ޮәo?" L]B` )hBv`cd䘅l'R97RM׌$4QwSPƚܳߢ\ ?.}&Z{7|S[ۄ_CvY`)-}|f8(\D6u2!$.o}D&N&sۍ0Z|x". ?AJ,)wk|zWfyYl'!8 Ϋʰ B,$~x8[KEqcǂ\^z.\2xWO:o߭Iڶchn 4s?,(g v[lB`,#${J_ YƍI͘WՖh,>8\ nvUgK8z<ۤt!8DL(Q,,$Da6d8ȭn[]jPqu105SSFNE<'B.p-JItTס4"0gל+1+\pf& 3jՙpqs N1[m^^c6Ds`ϘqP'rXvLR ;vVAOP,ѡC[.[u> stream xڍx4ֶ Zhчu{NDc0D{ !: G'JM=5k={_{p (!mHZ$(i PD&0пD&Pw ;ؔh P<@"H\ Re'-xD@QDJHWw#S[7Pp `@v`*Bp!}#*%$%vA "dy^0#{B(t.?8F0_C= ` p@aB<vPw:PC E Ht%!~!+C8ap(@WUKv`8 {ap-{`>a sEQ0/B`ڬSB@hѯ)ܡL}3{eCa*dy@5`0&h(PRLLG_|\~HW=4f|P@  B`gǘ1X1>(TL PSQ H H .. guoz`؟GF =  L&GƆ :HP\@!,{Gpo?_v} 0z@cfCCM 6^ 43# @P0o qKK!Q_L_>A1~g]ikE`wwF(U;oH4&G:X(@#1vxc0^u( !ABÜ^(0x l୬vF'E9g9jgM)ؽ37W11|Qwnrz>Ko]P`qI0&NqDfckb:s.#rPr(9%gMg@)ub?1ge_E?"naakhimn_Qfo؋J:*ytIPXJilt.86? ےD<to>~QY>b1.Dr99ڑ&]t(ZߋK \֞Bka/4?snLK ||(gv7]auZ/yҌ%qmPO! dpYG& &*bZYd5OB^TA~^[Cyɹq#Y#mLBsp)rRJ/L/= iI>^?@^~KMD[C!a+·6:\a'gZS=~o#IAB]CxtjdwL3_vpm{7\RI +D[-Z'=O,ΤmZ}j9pQᦨ M5.)B;S8$PmxC BѾh.@Sk9BqQ/ 8DU⇧ȇBfbo}]_n[1(hE[)=h(4O~Whru%n-rEK9R=͏D=IG5A߆$9?0aa2VI=*jI> gQyEmzɬgX_$DPRMi? Rpc.G}yahPeYAVY;8Ϫq+ԫwPFOJgu9!}r\?o"epc o*ItBYϋ5:$JCT&ȺEּdTZa륕*7eN4PJ+Wv$#%pMgkV8׳®Ϧ,Tu憜zHd 32Ө-Aч1n/N(h1ܬš[ rWËIlƥr'ur)3a➤2z TY|NաHZf}kG$2E' (>5ANF\tl_㇓~YYki;3P\J>k5/^[B%Rjn\t[74.91$}/!U,n9c%'pñX`;h4b5y|dI!OKhBpu %Ydm cV}[ 0d+NvaeM z%(CXX2Z'xP;>qVNi)7"5?(?1FzuE .O} ):p@}|j]) ج2Yg[|'?ES2Œu<{K >L4X껞v'2wK=Lտ9,LCOӠ*M<8HqKYV-)ɱqCX?զ }bjjx3rwSWUf@K#[a,!>.ع./jJ> 7!汫brԋ߷j~89n71Ii+ϹADi.F@x$wvmX6XDf'TkFKjYǴOu韝{W Ǭ8ȁ W{.amXd.ȩ{7[_k@ Oڏ:wA@B礱*w3"!,*d:G>GbMty/#xxH"OKa)5dEI"8tgX$s*8xĒjO&~1~i_<>>*[G,4qr%-B}S;f~seBЗB%*[tS.T3oԝZ̊ {D>7qFY-b U>$յZ[r灻(Bqb^2aL[@{Ȳ=Hud2'8Iɏ I3[ɻlكh;!حiTެEGaeW%RO?4 ~Z6J]$l~8fM/8r_:6GT_*[k)s|f /B S(`xηiꆌ9F@Be -tAjk ؑT/tc˃Hd|MZzdH>.Ef쇒*4N2DO,yݬ&9+V0Uwb֧=۫nXV^/Oka,Jzg=a1a_zMgEIKݞ6jўtz_3 zTFaSu$+RS"sE=+  A\.{YƟ%]Y;Kmp̔%+ydYq,b&Wn^y?HF;;sIQ._XtҎg"u;"rt a#n9hBix:ì{̚Q}zʷ(csR\S6~M}̀o׏<#rSI9HH ^͔m{*BUEK8'f-zB m)t\"(IXŢclsqayY5W/L%4d=K_,Jh!Q"䑲Yw迦O%Tku6b%,b]Z EJ6O]lGI;<'ҕskr;co$׎^t;(<"h["WH] iEt:Z=K&Ij}7śuР<ɚ{81%]Wv*wO{*j,rk,ו/NYL.i ~D"d>{mJ=s6O(oi<AG6V^8UDo|I!Ҋqǎ7M]3w^r#_= _w_Ub}#rȾc魖bw±\' LN }plHlプ:0B*\WtEo#̫zf9$^[ڕM=dV0Y ?4C!RL2 1Zt+%!.T ߳b, F<˃(v Z1SJ%^O!{ZN?㡏5+#;|ݺsj\b^GbfȻ5u#s,KL{,vƂTf"S"XflIL{iԼ|1 _{s"g,y ZtͰ3Pس Kc*u!{T#wbzAB/𾏢x9;|y4GX=#[lg\_YeE~h{۟[ML3%פR;s!LnPSO.K~xZU[^l:DxBFIC%2`Hjx^xYv56KߴYշ{?Z!NJs˕ssc {;2Sd՟=WE iƤ ]Z%u)r:Uzj턜7:83-nN|UNѓg\hԗ`;Hr0q/h,ӇZ=w^G9XpG+fvPh5b-hk ~jɗa˂ifAgќyK"'krTUGO(νʨPꥪ޷GKI:$g̬WxҒe` Y%WDS8pHG1R&v#SYSSĘG&5 _+,/w1r^+/_=}b+Ք6_:Q8U9dS'8vd`'=b7eTo F?liG:Vt?V^.}|>V6L+Vi> stream xڍtT>!tHC ҠRC3tJ" !HKRJw~{}Y7gsγ=E(D Jt4 B#8 憂#RPr7>e0D4ݝB!1)!q)AAHPPo M C:M$"PBx7}^!<!IIqEgFth{MG `ahG]@OOO3Jf'0 ;P Q hO ppC`M; stjh@H@_d*GNC Hg0`h/4?Pț|:0qQ(/_enYUB:;h)`s\Ge G@mрpWw̍>; *(((\0/=W#o/ _ n #E=`;?P8 ~eܿ XF~B_,nE" }@}]-?',  D7  W E$"qsz ?cg]䍞a\PTr?U_;Ruwr p'?=ofCy3!hQ 4fFv7:'$" (R{zp4/-}7=d Wf 7o ~`7Ͼ*kAb؛F7(WfV0HM ?FbBB ʀ?Bn(J5Ru+yv3g~bSIQQ >fX35}Իu5(!723u} IYU$j6Z$Mb{>[MRs 48ފT{\L58ɨ#ʁ+;Q}pAVSXUcS!13 (0~`PQWy$|bД;J]fW[ [ӲtENӆ0fo ևaÀ%nq\_0C)V.su'o\1(gLdcH3|&d>R8{_oݺs$Eh?pdL: ufj>,ZT}X Û<^d ZʎAu*-Zǖ̻UԐFm(|By΃g'|ZLLT*F0̍ TsF@÷oͻퟮLd-Ih%V3{'"8Awi&5CN&,QE<2ףvN&RDg9TgqJ3=r_Nn+-|Z_+[2syΜ1Qʡw%"LxZ''|W5_fz5 Tg?va31a"X\뛟;s=$5WL+>tJJsp3F0# 0>++Zw%:S?qͦl;S=) L$-$믿n-G&{s4}*k_ pO_*2A>>\.e^lOZ#Kb7@|̭V`ST2|ŮB(]jʁAծ}U;d*dVLw?V%2O:sKK9]=Dܻ^y6!F B{[(CZ]dqwVdZׇ#0|tE/P|eYbRge1sp|r( ËgvަN߫Ov?*IfZe i{Ϡr,gb6%uW$MƠ%s|WWgKOM8C4vg5])y m8emk {GV9eƎq5oh<>{B+#|j[Im˪rnwYٟ}&OvX>p{ϩ8!)uXQwj/ (xIYϵ-Fqt!)TBڷ<֏ٔY%TGR5UB vD#)PEq/HXg}lgktP5J$Km:܅)0FH82 l9,m%s#'#.̾JY,"GGOە.&&.>O7 ń-*dDWO'e3& f&"?y{żpa,l6HkJ׽~ B@ Kpuü`B-]|g*sKqB^*4L[9gl3 [1}zd0m$?~=5(t Ԣ_Xna#n_$-V¦T!ɏZ3>uS+UfU'M. !flё="9d; h &c׬X£x&iNCe}o,#'ioc4js5㒬7rh\Ѹh~cuV#$Dy`Ο>K]_ F`VΓUo~/x YYAd̆h=u* {װ&b19)rH('hww3 U`C_VˀgQ=pCVvzJ;Q!<ȳMK-n,L.-Ϩ:M`㮍 Suj*k-~pL('k[5*m $Y8g*;K^SܴgwI_:mx8ag!|UaMvWoS]^n4TUmwDOie?;Gr ce˰a\,=|'j9{^)KbFWfuYe)M`~⢌RA)26zR0/<_ M;Ljwul>x[ea^/*P{Yb7񳶀5hC`b=";eΝJYqX+ c O> F&Ò[3?&{H)4_w+9E2p囓NoRhӂCI~[4[RNbSQBA*{CRVeA7|T18GX=~mV;_ *89}5HLL Ɗ&o0Fٻ/a~< HtK룚Y x- [rJ>T}O&ہSpU!i=)򛔜""8>Uiv3ړ;5cï`&YLtu\8JUV0@3;ǞstWNխǬiDH (ԧ,Ӏ\h|k6xw$/tz8GKkyg eW#~gr@iA4-,?{td CK$l߇aWoߍfOy61\PhWN L_d¨]y"nɸ>V-}VAz>NZŒEs TFs\INQvxUӉrMO6EHNp\{v>Ѫ|0jV}C}62"Њ5ls\4ORe ȨRÑc%#'`؝F(,TE:-X Ta-;ůdk6.j".Qn]ub w/bDCJ&YyIqB\ ˀ+s6T} FP.i\xӉzۏ@E""Of*e)mN#ћȵH& 2)uzw"l$R,@oʒUV ?!mO"Օ%C6 3AVp fU޹wfokwBqFHX֞~Gku#d\ 5a鸨*Fg_u}Xw<|j.7Gyr?ǰ1}cQ{|3;Չ]\'='ո3E. ~VFq~T>g/!Zf`!~ ;ړb"AYQܗ6D"W9Ny¯manui)KnccaFn  =#޼At0Gd5t=YM}tr8㧄9+ZB{V4|L[Po{_Bp(̡3M<^K.'FuփRg*9 Q8Q!;3+|íK5 =U%H."K{ÎI\{Zf7#Et,{I|,\ud͍Io.:>vL[4xayA9¢SOC󡅺lE1k+惐tw>P쥆>Ja,ɧ?'{YvxY_B_* n)_*S-7hRs4追&ش 5Վ}aJ@n<{O6>UO3bjKٹU㬨x\}h̃ݼcow <-z v{.%LeHҶ+iqåZ^s(L8O mWZ:ԭO3z=x LI`fqQj[2vTxcH>Qʭ-3u롕Uq48|.{`)=* f;+@>4Arl;zɣ^x4SaBU+"R}1E+sҀ9&#IJS8Ut ԖaE]9ӻ~ZxÀr^U,1]ķtSFK'\/ nf^;*%DQnlROӾ;m%gZIqF}ܱۧXyH.G>iUV:g^G% ,V'ީx5XBBQKG: I*j.foF33WVD %əriMwRl<l,/_VՎG}W|2id\^1H#!.g>P;Z,ܽ,dW{s+L0[s_FԘsGOn {3O%_uLV.ޅcY,NJ>ӌ JXBK[&jY [u,ҐUU/o>-K$Gϲ IdH.L㞻5CiC+:tK[Vr'@6c&Id=%xlu|!l ͧP"bh"Sk GևBE9(1%PTUn>& 捠}KRIeЯLĥ"xH>F%M3dFA.&4$=.a&*=zѺb=K^Ҝx4M{/&+iS,%.d&KS˟u)FFa,eB}$?U UÝTK#XT3%[ӮFE}-KX_x_Ia9ڻ=eg/\5 LғHN}vǰ;-գ,?I <fMMԭ',)d*VDx`7FQ;E {"E F:M7[b pb#{<(7?:+;ß͊8Hw(99޳(%Ūp1E#pNƹ̪~}83`p\ȓtEEVOͮ e]]ءUVr02vlB /QՒWяk5\03Z./9)C½~3;\,m7qO,!t;kQ+ƅgcݻ)pvnI"i *̫pc[ PwhZSײ5¬?RR/V{rǡ(p:4zDF2>7"F)-(^ #eʼllSu^C R59›QX[҂ 䂌S:m܆#ڎ$t*oT/Af[K}X/9څKx^{X椈deUtq/ݷ[UV+ӷ]X:}0iwԨXg* kHvM_"\HT5mfJ9d|xP'䱞jSoK3|`ׂ/mWCcC-(gejJpPEwņful NBJ]h5AU"Fyx |9vfrǔeŏ ZY|ڏRABHuߌ{iy- E93+BEJRvȄ_`99 2˹t&Ln!\\(E0qX\"3 ,cv2^_oMoFq.G endstream endobj 286 0 obj << /Length1 2631 /Length2 18798 /Length3 0 /Length 20303 /Filter /FlateDecode >> stream xڌP c;%\Cn!9ܓ+`Vݽ@NB/djo sgf`ȩ23XXU-]lÓ-xqdF. C9{; `ab@ :Ó;x:Y[x@eB ` d t41XmA&F6{Kpqqadtwwg0ufw2秦[X@'7)௒FJc'ZX:Gbon6&@;g) bHv1 _,v621u03Y ..t#;ӿ lAFnF6F S7 )@S3_52f1;S{[[3_Z:M@}dp,L*ՁQ(% H[ft311q_A5z;;@e}-̀?Fn@+O"xff hni;:H 4@ 4~~0S{;1?%xӳYXY쬜nFT'egfO ꟥/=hïdyv7Ezl-m<M h3AaM5Yg9J6DFZ:[zM-]L,(P@t3)Π[m2ٙ؛z,#''#Ox&|A;j { v. :__G`K`8"Q7083Q7b0JFF.e#ob@ ".obW@ʿ]7b0F\~#ob@Z"nѿ g Kg& wdbldblcl[ J $(3r٥,LE { _[߹5_BVPMmledR􎮠=* (]3K?bwdb;"HoK ְNhHfejԜ?3u7ݠ#\@M &;W[.=?2sŴËTo5ٲ1#ߓe {?;'P]]ƿbGјATrB@?Z2wHfj*33([ Ǚuq8lbg@zA@P~ tOs_:LzMMxꂿ=|N;q|W#{٩ &&+pN(yemGVp&-Q ^yf~ikpX~^UpG=K<ѕ I_£~bu1ۆ\k^} sŐƿ),':qP;sE)JNGFA/h$EgӅn7]W[epv?%i4U"nLdeYIș[0R!S@*(jEp]|B.lǠ"Ԝcq$ԜvvѧT H[HIv-ƕ>Dpb:cyR{?NAƱp6kש"~0WN)׋SU l~C*x[3ߗ/m\{G{scs]XPN!X&ZnKZj%<`Y hiފ-V}+djwXV#?RRd.>7vsїMehJ,h M #!!<($y1>j3ǟͰ+E\PLS{K>VefO\D̊R-k}|&|Ll1OmmZ>9El*{z L?63n_a@ }vrUo#V0~gfs}|6ƒ.mݯ^F^G3 [QbZmG&>YulwC/`Ĺ3#D<JeExČD4[/_;J=,y.33?!r泼$R .Cr̤}]25ٽKx/^/<_f?ԓz] x29: \{F<-Gp/zV0mhaB Q!*|<ׯ;=GUzʙ""P5ܤ7B?h׆xJ4( ~ HT ;%&ciYC! YgCS|#tl_z*7t/jTdgSjDU}_!N@:!|#Ts]eDZLU;UxrC|`* .ztm96vؼ嶗Ȍ~RmvJ1uG;BpvW`]'j :oz̟L!!`Oh;R~u"v1|eNRνv 9c(>hWYh`heWJWr5_ա? RdjX._`dD)vġj7 Ńa+y 1Ps eҦN-%~F0#ڈ˄8(j)| _4Lygm5CjpDñ[ .M:>NL׭K`65Ee:xa$'}Y F~bl:& XK_,.ڊF/u@W&GGq`=|j_"b߬4ջ GM["waNx6-C{\ ~H)*!>YfDUݚ fb/ !tp²20f/t6>>A6)# r#]k?T;194S F f"<>9cDccLBy+4- 2'j2LMIJHjm${^$*_^E{ABD띏[F@q$o#0Z!gY % 6PjG5$h:zWލ:LZ|^ɛN( UO H~!rF>| Eƃm< o!f)Erg{2Y~0(K j.qLFa#Db6 f9(HM&pM22f Mf]mNWNZ ׆z~.dҁ}+K_F2ѱ &Į XQAףRzh#X]_ۤ H2vs&_|V%r6uy$@oxiNBc1 la@mMEr!% oO6Txe'B|ԩO'VO!' n^EqApQp &NhNHR'Gh+*G*npvB zogqyEbu%PFӛjqien#h @߳}^y"S݊~„S6*D5שE@v#gKpG*2JÀ/m#MSœsVIS{Fs ħޖ %`δ sxv*zǦE0[ϷkGWmQ{??%G-R$O' >t(HmrfN1zCyyқ:Mx }'zBޜY|^oP.ߡzlX}E]>-ui.k˲$LpEx#_DӜko3@mOdZ04U0C^ئkv$dz!q6|_kzAnt6CXƣHHҩ1=]>TGӒp#{a }{QFW5k9<0n4$r|ЄiVR٣-בu#a՘+Qra WT! %Œ D{m=/|$ɟ4W.B!a*3qBl]~#2v@.8I LSim*UI -99+b‚ǙAVXm3{9Uc29P uՒ |뜽J;WV'QPM,C:6 wTOP̰SeR}?AH>,'P'))ECfC-ƣh<.Q7yAGΊԞ}vz,v f2mGEK7Ux._sӶQb5GzY>*_kÚ]0]c _+ln><ˮU8#.Eg=]ĬZ(iP+еXFiṕSfs%s.4K h]Y7wLWy)(,*ȟb/[c@w B3mt}dB^?4`T%GӤRagt*]b*mU h8H҄51} 3Wv٤ 9TT)z_XIRg`aYhgR!&vaTpڲj5q ;P9)e-tcEj}s9kvm~ueAB!7O%z^'rQv̭G ĸЛ r  K'YX,!˞\uw|xEJ68v5o5Z DE)`E(DhJlZ9^s!0\M }:4J*M56ɔڳQ o>oNpŚ3H zQIT`/gj>chpbW{QM<;\89 gQ`ȖيO?JLMq0`)Ӆ`N8$YƁ.Mid '=ޅs;L95hEF3#rT᎙b'۠wUk'}9#a{2i[Dz3 EmjO%. c[l1}!l/"".ZI![ܤ[fk#>|$̗ o:f!- Rh8oERxu|dGO P3z R6n_<o_L?By͸䝱3)N9DP:AΎG֪ftn$stx ޴WCܑL7o]o"afG|نG-7zÉ_skgPAHYՅO p,".n]?ݹm'W?Uλ[,qcbkf]xDžoE^y5%`OoJ^u))ӕZ0~)58mTq՗[h4cTMw85yp$ow T^w3@O/2޻0O&xdxRglVߧTn-~`nmݩ, .]HP:W ap"Á{6'*p`i;uKTi(HT.Z3p:l|$P-!*\z7F3GGjb%8b2[F5)5HceScCrRiޖgB3&DX!U?v;]y<ꌻL _.S0go+tRBQŤhV|غ9 pb*Y^mt0:bq[BJ8 kcT N`w"L-cRnk0gxa_8dz U7hieɰktpGL%o%T<%c\ٰX;[ָ׸oEGu2ਈ @ug$3y~ꂜMPs!ru 6GiSBqo /adU Z_®PQX:4Eu`/;TK/w}7̿6؂/:-0*^F6GЩ5O=o_65"[M].ܡ?];r lWv) {;]293ǜ }F 23)Ü0 ?-W4XI;W%_T聆=x:i͘;ke'-<4(ֵQ~MQf|(,$̤š] %<([Zh,T~oon1a_ĔwYJچ ygCeg int31<x8D,yU5ۥ(Cl4Ɲ ):!"jPGOh(a_~5>QtX8^\{d޻g,Lϖ~7/CfkLֳ ^?k.BQRL~cX"0^8 ` !uz5QqW=&aZixk>q!ngƊNƄ]N}rDeoRm ce8U KNAR 'RS$]Y[4qyPd ]Tpy$[M[RVkc .^iQu+h,ݽ'xSq;'E;vVٝ=_Q E uw$O]҉.$i$1['Q dpC^"/E3Ms]r'õV1 b%f=CxEL@Q& ׬^D)\Y:IfxC$ IR@$.՜C,k)_jt{94E, ^6rZ:WI F){bj0udpQUC?f&¬5Du!8ZP+h#Vb3l\&)UVnQg$m4 -2IQhbJ>,!J07M xO~1"JRVͺ[a_t!m\LeCkBh[9oT]rgjSw`?m5K1U勈SXCv6-9&]%x娎Bu`{#-U/>:PXJ  n-6+lHS;(BbTqUoG( \r%XuSJQgDHu2jxZn冀B!AfY&0f_ْ#@{)rlJpWgf$]:8&sHjs'x^6V$[ɰHboȟvv/8Esp#"'j`:> Xq`AMKAqBD{ oߥ0O^\P8X\XB.Em;KaszkT JM>!ӜH`,\fׂ4eѵ%BФM)nɜ6Q xX ѿ q.[n'h= b"쾵mrj:َgc|\v ~ #n!ؘw_vnB<{ʀUtaת vqnRtٿ9NH>M!׼mMk||<dqԻG 8nA8O~WX$N؝d$~U-۠c9wljA/E =z)Ӎ3ܠK^&eFDiqqo'GԕhTGTW%z_jKh$SrH.EkdzUB?K8@"~/CYWg-6PL*?H/4oAB|-bp sT^&gQ}.n#z<0xWCmrFg6(˦2I;Y4u YQAף!Ԭ}[wƳG HiajJTVp^Wo1q^ YEVU+b~>GFQ5r.({,k9[t]0o $O?Un5RadP-+/Nxj7Jv"Gת;Mf48O?Ujr$cwn=~ؕ]7#,,a]fKs(2,;F m`StzA DMLI9`TJ뼚K/vw#yП0!(&'2GNN'(9yMxX@?OUu/v~m[q,de{X2 3i,Ԯ5[c x=ڕITՏ7s h҄s39rH :3$' 3ﳯq7Crv]["_&nHb w1XdQ+֬|b(ukASϚ2>eVFc-#8gB1W^ljbv~;1;9CR(zQ`ݘy()!*Y(l!. BFds#̗\; G4/gLlER=PqlOh+͖PP~1FbB#Ȧ~)g[򢮪$v0"M&=L^Fznryq#/ k,%j\)\ %; HV!(^pU{P,w[:CN$@7;}A F&ԤDA\#sg.rZZxYҖ'/ԊL wⶫ:BQXuI|bc)p O?ܧv ltvF`Q̀#C ~y,0aO;{۪b؝l@]>T[b&fE7bjW|IvOg6-uW7{n~m?M,y_ږK2Qɏ*ZasG݊oMs*SoO/}KY^Z=0mgBÌH)8BW 9c8d9h5_yRG?v+|\dE">ޢlQG Kk3n۞Ԁjo{ȭLG csY;ی@^|},ˆ**%Ʒ3> G <f.p&|{+-'!Ca=]p NNA:΢vo|)Lq1ZUD…77D01fgI|ͮ't{G[3H!cށB }<l;BdvK%P+#25 ( PCT?T}B<`f-nuvY}+L/v |׺p/<-`q9mYpӢ=>Zoz\\u0HDf:W0w*5~Cj+4{ϑ&m!mmVqsbEFv\PEgZBClY5CdW!N(0ni?z;FP/8½!$P"h2֧s}R;=hX(*nhx쨏,_!#o}KQ %J{~.@8~T',ID) i> %Z)Nw݇\0<`ilt y(K]DWswAE}:HOL:ˎ7 ijp'0cleFf(ԝ֖brBsAyCZҋ~z~0+ml9ivks0 ,=U&{#}r.Wpzel[+3˙ h m[Z%8!bV?ɒnȭ6%Կ jgC]{kAjEHmI!sUKh>XAt1iAE;RiW4D±ܥӿݨ}0Q6l:תq"M`!v?Z<𰮠%Qs{T~ g:@bQ!x]{iAY*'R9e*I4'"c6l JVaNKgR|2]iGґJ-?3o(TzV 68N{ePQll!`0H3eHw Abg_bbTz>cW lgemB E\Fށ0s5.>gmh-pWQGB*o4(*$g߇w:\qD_ݼBt&ԓ|uZo~h @ :3~^\rW|Ě\ yD[H-k#,Oq-RΧ_U=Z GO9R`#*ś"6W,v˲h0Yoaat*FV)י\wiK7zH. <\u$^VoҾG+f6AhY>'SPsL)_gxA/atS B^̬?׏*Mx랞"=-Y,:6Xdz){|6d/>5ri;"<ҹ <[~I-!hJ8p<*/߁u-50կUcr, yL 6)͚5z"leԱ s[4/I8^T.ɿ|c 6=R"|tFzZu&lvK"g6#ݲSϜg|! {MHpo@Mņs2(⿧'\eMIF#y=р3kó94ٻ';T"( }plN o[GFUWgm2o[c3MCL+|}ߨ9T'TIk% uc횦J}m0934S$(UDGw1Z9M4lgLv:9N%]%Lp r fK%Z7nIU ;)N`ǝs{r.URgؼdX!3QDZhT2 L6X"[䇝ٙ}BsM )eyqbdXaO +xn M6i"dKa?rv-J_4<9MX*23A/j͗unmks6Hn:Ai C7. 6wvܔB'\."6xy<ӢJedl`XQ LV߄9dSfrbd p&ڌ攦/iLi,-`ȍz)8JmGՍr `^.;"D}M6;;mU e ƒTkG8Fwu6ELVƴE%<!5QuuqF #ScZ̯x>kjHU;.:̃S{5+Nϭv,N)Ǚ*Ɗ {iu}]D杲J0ޝP|9p}p~ pvga9rltTvTwDýׂ>8wy͞MG8;0m\6kkaՃ$pI-֒EѲOTfC?&ͮ~':4d̆!8 UpClk揾n(6 VLfm o3ݢ^'Yj!BIRᄩ}{]hӣRמyqJI9j-Ic ˮ,_⽶d6S!Kf؛m/e,J~&A 'u-ଟn#3/XBq~77L_aρdRH0bs)'zWh`ꥭ8 lq@4b PטBPC6ӨP*B ۛO3M2d^ IO/|s֭~K~#lN/'ܘq~|[iw]Ƣ|S/JPNlL`S_m*Qwo> {6g=PR2ز[)[Iْ#)ah}pDi%vH3D΍fٚZç`K"((O', bk{4,2L+඿)ƚ!dqWQ㖻ysȜY0PplCZYpn9E2&@ņ-6p[Zx7]U,+ٴ Tv'$X\J@^8 _OlJ:9\]y_- /`X _[@/]LF۬Mj eX+ĔVL%(d6XZ#*BLMor,K(9v(:^<6،D(1íېT"bDHbwp ?ݯXՈx/$rІ q<3~[՘ T~O6 J%8FtAc_B &ѝzwJ8t~{7rh,? :ّN=.eiP\:S[Տ_M y-,uC#("Rvi<$&) nwX HFn*"< +Sk:eG5.;{vJ\]UdJBtz>n=O_~5WPC'ۘG :Jnnx5G85DVM7bJ%JZ|r0yTc =_=Sg21xjN'?q *-S}v;n)fC|h@#GO1 A*on&vV` h=dS[bF@&166MgV!:QFHw0 9R|6*e=2#?uq͚F\(-K`ףyc+ji67ϹS~J-#u^XY϶&Pmnw~KOfנ@@)N'@$KgOijbp"͂X-[+$Y4umKZT1"3T3w#="}@XKz?12mUR:,?Mm!Tg2K濫8hƂ `I3m.ߞ2AR Q=GMK ~ t^w[\lC9G d37)PV 6їa2}k4̘<{Gn0g*|NE]fMiţ9\HqRջ #Bl෱[7LS1%;&gm }A;Q&/c+!Z^a:kL]T=SGt 5jHGT2?.8_O gaz C ՕWrѾ fy4ڻvOuY0-&Yirq'IՍSM3Е@7NtB:&t;nf-w)o0?9(8*dJ>U)*Ț63E^ZLvސ, uR~((=, 18 ;AB,Cf"3ljyUmeH;Yr1n^#ǜ\4#.'Hנ*CЩZ]^l#F>w|k4D^oZx-2O+$~O,D90l.kd9[+YF4S'd:Q/m H7 L|,)f>rd?jy2Am>< 51?D7`z=ׂyX˘3~W64 oDzjx-ҒaȆɠ<"sG(@ڴQ}3mͨTnU|wAUmahl =2 DV@0M!S8ɮʭ /@RpG?Q nPds-~ ̕x8B܄\x6UN{)KV8 'J->!#S4CNycȷjlb_O?4ͤvC(xB;[&M (rNkB r@|e+A#_gI:ӫ%}J@h"xySe!-h 0Ϙ4/5JgXucK蹍?hڀ [ eY }G<L`:.(QL=\D Aj8Bayȥ&2&Ưw  bNo`r"Σ[IλA-B>@uA,M`XGkʫ<}> endobj 257 0 obj << /Type /ObjStm /N 82 /First 710 /Length 3483 /Filter /FlateDecode >> stream xZ[sH~#V5U!  'e~[ZdH1U:}9}%GHWBUPH !m|!ƽ9BB+z(÷Յ౦0laIr@8"N;Lj00rx\pI Q`Q)W  + PX2(٪@SFJ k5qNx^8.pr<SRBbJyPp4`F9g1~$Sp 8;GLd9 EOrC)^9r4%x|y"oj >)B/ $͋/w#p]D- o |FC)P"+ .H SWr\E6hGRRӤ``P}$ 2-T3FUQFa^B^,wcm~;~%-X)HRIM*&{\}^Uu]^})11,Gz:$>b/vy^ډb:yZ X Oafl,ȷ?/}\KdE){S~c!Eatk,/c$|'gkdOlhퟯ9;a_>Ͻ_M7Wxd_pe>[L.IJY:-v.x$*WV@Ψ` <|Oqb,堤Q*c 7O%IKZp?Wclt(銽Q<΢it? Fk=N"s1zSWj*̮Ē4Kyt̽>dž>rˋkPh{)e) 9G^|]Em8-PW([iW$"~Dwjd ; ʪld,{ʩltT0mġl6Z**O`tU"6%tf-ͧ~a@ lUc]7Z\d(Қkk"TҵZQ():/KnI5kt߹opo5wB=~GH3؃|Ҝe.pq3ݥn\-jb!<)t :Z X$h'h TI8W68_8GT.XjR؞qNI5q3ix>rx*D2Qqwȣ!5tgSDi٣rz^,y3_>? rU0>tOyAi' ]+v檜)f|:/ق-pa7r`Kb3VӯlW˲d/ v>/+S.GSNeMtaPg@iBnduʯ5e;jտ#E7>ݖb]^SKÔirjF>d'O޽=x`1aS)xd f8巻\b*~(6$_zwקoG(*U;r:0f r(xŨob]hɻ,C[nzML \B|0gYnGtgOEDEf{g7Zoz5pʐޥ`phCu8Rʿ>:lr1u%:j]#_,fɲi̟n'y,'0ojzc秺o]v~+e>\P."?wتP|}4]֔I}eoUGy5O{|qkm/ZUfzg'Z[ܺunt{ѵnNzwo߮;7ֻ}k}pla3mkT+\k=~Z_ԧ2#dz* =/ӏ8-zȆ.]~~fڥMǎOqZ񪂫Hъ?ǻגSllô0bY~?/ 'ijiiwJW.=߹6.utFܡknRU RN^ #,\#m45؊67rKC7rKU{U#|JVoˆװ V f]q0h\z*]5[o <4F92A1821FB81E1F4F7C442DF585C5A3>] /Length 695 /Filter /FlateDecode >> stream xIRQETCcC+v(}c@C9p00Эr2ޟffY2?9HcjqWgz=*Pk@-wYhufA 7 Zpݸ)>> \end{verbatim} \noindent (The precise version text and details will depend on the version you installed and your operating system.) \subsubsection{RPM and other Package Manager Installation} There are a multitude of package manager systems out there for which python is available. One popular one is the RPM (RedHat Package Manager) system. Each of these package managing systems has its own quirks and tricks and I certainly can't pretend to understand them all so I won't try to describe them all here. While these package repositories may include Biopython all ready to install, you will typically want to install Biopython from source to get the very latest version. However, there is one general point which it is important to remember when installing from any of these systems: you need to download and install the development packages for python. A number of distributions contain a "basic" python which contains libraries and enough stuff to run simple python programs. However, they do not contain the python libraries necessary to build third-party python applications (like Biopython and it's dependencies). You'll need to install these libraries and header files, which are often found in a separate package called \verb|python-devel| or something similar. \subsection{Python installation on Windows} Installation on Windows is most easily done using handy windows installers. As described above in the UNIX section, you should go to the webpage for the current stable version of Python to download this installer. At the current time, you'd go to \ahrefurl{\url{http://www.python.org/download/releases/2.7.5/}} and download \verb|Python-2.7.5.msi|. The installer is an executable program, so you only need to double click it to run it. Then just follow the friendly instructions. On all newer Windows machines you'll need to have Administrator privileges to do this installation. \subsection{Python installation on Mac OS X} Apple includes python on Mac OS X, and while you can use this many people have preferred to install the latest version of python as well in parallel. We refer you to the \ahrefurl{\url{http://www.python.org}} for more details, although otherwise the UNIX instructions apply. (See note above about installing XCode to get the compiler tools.) \section{Installing Biopython dependencies} Once python is installed, the next step is getting the dependencies for Biopython installed. Since not all functionality is included in the main python installation, Biopython needs some support libraries to save us a lot of work re-writing code that already exists. We try to keep as few dependencies as possible to make installation as easy as possible. \subsection{Numerical Python (NumPy) (strongly recommended)} The Numerical Python distribution is a fast implementation of arrays and associated array functionality. This is important for a number of Biopython modules that deal with number processing (e.g. Bio.Cluster and Bio.PDB). As of release 1.49, Biopython supports the standard NumPy distribution. Previous releases instead used the older Numeric module (which is no longer being maintained). The main web site for NumPy is: \ahrefurl{\url{http://numpy.scipy.org/}}. \subsubsection{UNIX and Mac OS X systems} You should download the \verb|tar.gz| file, and follow the standard python build process. Note you will need a C compiler installed (see above): \begin{verbatim} $ tar -zxvf numpy-1.7.1.tar.gz $ cd numpy-1.7.1/ $ python setup.py build \end{verbatim} Once it is built, you should become root, and then install it: \begin{verbatim} $ python setup.py install \end{verbatim} One important note if you use an package system and not installing NumPy from source: you may also need to install the header files which are not included with some packages. As with the main python distribution, this means you'll need to look for something like \verb|python-numpy-devel| and make sure to install this as well as the basic package. \subsubsection{Windows systems} We recommend using the NumPy provided windows installers for your installed version of python. For Python 2.7, at the current time this would be \verb|numpy-1.7.1-win32-superpack-python2.7.exe|. You should follow the now-standard procedure of downloading the installer, double clicking it and then following the installation instructions. As before, you will need to have administrator permissions to do this. \subsubsection{Making sure it installed correctly} To make sure everything went okay during the install, fire up the python interpreter and ensure you can import NumPy without any errors: \begin{verbatim} $ python2.7 Python 2.7.4 (default, Apr 8 2013, 15:01:09) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import numpy >>> \end{verbatim} Note that for the import statement, NumPy should be in lower case! \subsection{ReportLab (optional)} The ReportLab package is a library for generating PDF documents. It is used in the Biopython Graphics modules, which contains basic functionality for drawing biological objects like chromosomes. If you are not planning on using this, installing ReportLab is not necessary. ReportLab in itself is very useful for a number of tasks besides just Biopython, so you may want to check out \ahrefurl{\url{http://www.reportlab.org}} before making your decision. The main download page for ReportLab is \ahrefurl{\url{http://www.reportlab.org/downloads.html}}. The ReportLab company has some commercial products as well, but just scroll down their page to the Open Source software section for the base ReportLab downloads. If you want to generate bitmap images, you will also need the ReportLab module renderPM. This in turn requires the \href{http://www.pythonware.com/products/pil/}{Python Imaging Library (PIL)}. \subsubsection{UNIX and Mac OS X systems} For UNIX installs, you should download the tarred and gzipped version of the ReportLab distribution. At the time of this writing, this is called \verb|ReportLab_2_3.tar.gz|. First, unpack the distribution and change into the created directory: \begin{verbatim} $ gunzip ReportLab_2_3.tar.gz $ tar -xvpf ReportLab_2_3.tar $ cd reportlab_2_3/ \end{verbatim} Once again, ReportLab uses the standard python installation system which you are probably feeling really comfortable with by now. So, first build the package: \begin{verbatim} $ python setup.py build \end{verbatim} Now become root, and install it: \begin{verbatim} $ python setup.py install \end{verbatim} \subsubsection{Windows systems} ReportLab now has graphical windows installers. Nice and easy. \subsubsection{Making sure it installed correctly} If reportlab is installed correctly, you should be able to do the following: \begin{verbatim} $ python2.7 Python 2.7.4 (default, Apr 8 2013, 15:01:09) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from reportlab.graphics import renderPDF >>> \end{verbatim} Depending on your version of python and what you have installed, you may get the following warning message: \verb|Warn: Python Imaging Library not available|. This isn't anything to worry about unless you want to produce bitmap images, since the Biopython parts that use ReportLab will work just fine without it. \subsection{Database Access (MySQLdb, ...) (optional)} The MySQLdb package is a library for accessing MySQL databases. Biopython includes an accessory module, DocSQL, which provides a convenient interface to MySQLdb. If you are not planning on using Bio.DocSQL, installing MySQLdb is not necessary. Additionally, both MySQLdb and psycopg (a PostgreSQL database adaptor) can be used for accessing BioSQL databases through Biopython (see \ahrefurl{\url{http://biopython.org/wiki/BioSQL}}). Again if you are not going to use BioSQL, there shouldn't be any need to install these modules. \subsection{mxTextTools (no longer needed)} Historically this was an important Biopython dependency, used extensively in a number of parsers. However, we have gradually phased out its use, and as of Biopython 1.50, mxTextTools is no longer used at all. mxTextTools is available along with the entire mx-base system (which contains a number of other useful utilities as well) and the latest version is available for download at: \ahrefurl{\url{http://www.egenix.com/products/python/mxBase/mxTextTools/}}. \section{Installing Biopython} \subsection{Obtaining Biopython} Biopython's internet home is at, naturally enough, \ahrefurl{\url{http://www.biopython.org}}. This is the home of all things Biopython, so it is the best place to start looking around. You have two choices for obtaining Biopython: \begin{enumerate} \item Release code -- We made available releases on the download page (\ahrefurl{\url{http://biopython.org/wiki/Download}}). The releases are also available both as source and as installers (windows installers right now), so you have some choices to pick from on releases if you prefer not to deal with source code directly. \item git -- The current working copy of the Biopython sources is available via git hosted on github -- \ahrefurl{\url{http://github.com/biopython/biopython}}). Concise instructions for accessing this copy are available at \ahrefurl{\url{http://biopython.org/wiki/SourceCode}}. Our code in git is normally quite stable but there is always the caveat that the code there is under development. \end{enumerate} Based on which way you choose, you'll need to follow one of the following installation options. Read on for the platform you are working on. \subsection{Installing on UNIX and Mac OS X} \label{sec:unix_install} \subsubsection{Installation from source on UNIX and Mac OS X} Biopython uses Distutils, the standard python installation package, for its installation. If you read the install instructions above you are already quite familiar with its workings. Distutils comes standard with Python 1.6 and beyond. Now that we've got what we need, let's get into the installation: \begin{enumerate} \item First you need to unpack the distribution. If you got the git version, you are all set to go and can skip on ahead. Otherwise, you'll need to unpack it. On UN*X machines, a tar.gz package is provided, which you can unpack with \verb|tar -xzvpf biopython-X.X.tar.gz|. A zip file is also provided for other platforms. \item Now that everything is unpacked, move into the \verb| biopython*| directory (this will just be \verb|biopython| for git users, and will be \verb|biopython-X.X| for those using a packaged download). \item Now you are ready for your one step install -- \verb|python setup.py install|. This performs the default install, and will put Biopython into the \verb|site-packages| directory of your python library tree (on my machine this is \verb|/usr/local/lib/python2.4/site-packages|). You will have to have permissions to write to this directory, so you'll need to have root access on the machine. \begin{enumerate} \item This install requires that you have the python source available. You can check this by looking for \verb|Python.h| and \verb|config.h| in some place like \verb|/usr/local/include/python2.5|. If you installed python with RPMs or some other packaging system, this means you'll also have to install the header files. This requires installing the python development libraries as well (normally called something like \verb|python-devel-2.5.rpm|). \item The distutils setup process allows you to do some customization of your install so you don't have to stick everything in the default location (in case you don't have write permissions there, or just want to test Biopython out). You have quite a few choices, which are covered in detail in the distutils installation manual (\ahrefurl{\url{http://www.python.org/sigs/distutils-sig/doc/inst/inst.html}}), specifically in the Alternative installation section. For example, to install Biopython into your home directory, you need to type \verb|python setup.py install --home=$HOME|. This will install the package into someplace like \verb|$HOME/lib/python2.5/site-packages|. You'll need to subsequently modify the \verb|PYTHONPATH| environmental variable to include this directory so python will be able to find the installation. \end{enumerate} \item That's it! Biopython is installed. Wasn't that easy? Now let's check and make sure it worked properly. Skip on ahead to section~\ref{sec:is_working}. \end{enumerate} \subsubsection{Using the Python package index} Another simple option is to use the Python package index (\ahrefurl{\url{http://pypi.python.org/pypi}}) with the \verb|easy_install| command: \begin{verbatim} $ easy_install -f http://biopython.org/DIST/ biopython \end{verbatim} If Python is installed in the standard location, you will need administrator privileges to do this; the \verb|sudo| command works well: \begin{verbatim} $ sudo easy_install -f http://biopython.org/DIST/ biopython \end{verbatim} % FreeBSD port not up to date % \subsubsection{Installation on FreeBSD} % % Johann Visagie has been kind enough to create (and keep updated) a FreeBSD port of Biopython. Thanks to the wonders of the ports system, this means that all you need to do to install Biopython on FreeBSD is do the following as root: % % \begin{verbatim} % cd /usr/ports/biology/py-biopython % make install % \end{verbatim} % % And voila! It's installed. % % If you want more information on FreeBSD and things, Johann has written a nice primer for his FreeBSD EMBOSS port. This has lots of generally useful information, such as how to keep your ports tree up to date. If you are new to FreeBSD, you should definitely check it out at \ahrefurl{\url{ftp://ftp.no.embnet.org/pub/EMBOSS-extras/EMBOSS-FreeBSD-HOWTO.txt}}. \subsubsection{Installation on Mac OS X using the fink package manager} Instead of installing from source, on Mac OS X you can also use the fink package manager, see \ahrefurl{\url{http://fink.sf.net}}. Fink should take care of downloading the source code and installing all needed packages for Biopython, including Python itself. Once you have installed fink, you can install biopython using: \begin{verbatim} $ fink install biopython-pyXX \end{verbatim} \noindent where XX is the python version you would like to use. Currently, python 2.4, 2.5, and 2.6 are available through fink on Mac OS X 10.4, so you would have to replace XX with 24, 25, or 26, respectively. Most likely, you will have to enable the unstable tree of fink in order to install the most recent versions of the package, see also this item in the Fink FAQ: \url{http://fink.sourceforge.net/faq/usage-fink.php#unstable}. Note that 'unstable' doesn't mean that a package won't work, but only that there has not been feedback to the fink team from users. \subsubsection{Installation on UNIX systems using RPMs} Warning. Right now we're not making RPMs for biopython (because I stopped using an RPM system, basically). If anyone wants to pick this up, or feels especially strongly that they'd like RPMs, please let us know. To simplify things for people running RPM-based systems, biopython can also be installed via the RPM system. Additionally, this saves the necessity of having a C compiler to install biopython. Installing Biopython from a RPM package should be much the same process as used for other RPMs. If you need general information about how RPMs work, the best place to go is \ahrefurl{\url{http://www.rpm.org}}. To install it, you should just need to do: \begin{verbatim} $ rpm -i your_biopython.rpm \end{verbatim} To see what you installed try doing \verb|rpm -qpl your_biopython.rpm| which will list all of the installed files. RPMs do not install the documentation, tests, or example code, so you might want to also grab a source distribution, so you can use these resources (and also look at the source code if you want to). \subsection{Installing with a Windows Installer} Installing things on Windows with the installer should be really easy (hey, that's why they've got graphical installers, right?). You should just need to download the \verb|Biopython-version.exe| installer from biopython web site. Then you just need to double click and voila, a nice little installer will come up and you can stick the libraries where you need to. No need for a C compiler or anything fancy. You will need to have Administrator privileges on the machine to do the installation. This does not install the documentation, tests, example code or source code, so it is probably also a good idea to download the zip file containing this so you can test your installation and learn how to use it. \subsection{Installing from source on Windows} \label{sec:windows_install} This section deals with installing the source (i.~e.~from git or from a source zip file) on a Windows machine. Much of the information from the UNIX install applies here, so it would be good to read section~\ref{sec:unix_install} before starting. You will need a suitable C compiler. What you choose may depend on your version of Python. For Python 2.6 we currently use Microsoft's free VC++ 2008 Express Edition from \ahrefurl{\url{http://www.microsoft.com/express/download/}}, installation of this is pretty simple. Then go to the Biopython source directory and run: \begin{verbatim} c:\python26\python setup.py build c:\python26\python setup.py test c:\python26\python setup.py install \end{verbatim} For older versions of Python, we use mingw32 installed from cygwin (\ahrefurl{\url{http://www.cygwin.com}}). Once everything is setup (which is a bit complicated), you would again get the source, and from that directory run: \begin{verbatim} c:\python25\python setup.py build --compiler=mingw32 c:\python25\python setup.py test c:\python25\python setup.py install \end{verbatim} Previously (back on Python 2.0), Brad has also managed to use Borland's free C++ compiler (available from \ahrefurl{\url{http://www.inprise.com/bcppbuilder/freecompiler/}}), but this required extra work. Now that you've got everything installed, carry on ahead to section~\ref{sec:is_working} to make sure everything worked. \section{Making sure everything worked} \label{sec:is_working} First, we'll just do a quick test to make sure Biopython is installed correctly. The most important thing is that python can find the biopython installation. Biopython installs into top level \verb|Bio| and \verb|BioSQL| directories, so you'll want to make sure these directories are located in a directory specified in your\verb| $PYTHONPATH| environmental variable. If you used the default install, this shouldn't be a problem, but if not, you'll need to set the \verb|PYTHONPATH| with something like \verb|export PYTHONPATH = $PYTHONPATH':/directory/where/you/put/Biopython'| (on UNIX). Now that we think we are ready, fire up your python interpreter and follow along with the following code: \begin{verbatim} $ python Python 2.5 (r25:51908, Nov 23 2006, 18:40:28) [GCC 4.1.1 20061011 (Red Hat 4.1.1-30)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from Bio.Seq import Seq >>> from Bio.Alphabet.IUPAC import unambiguous_dna >>> new_seq = Seq('GATCAGAAG', unambiguous_dna) >>> new_seq[0:2] Seq('GA', IUPACUnambiguousDNA()) >>> new_seq.translate() Seq('DQK', HasStopCodon(IUPACProtein(), '*')) >>> \end{verbatim} If this worked properly, then it looks like Biopython is in a happy place where python can find it, so now you might want to do some more rigorous tests. The \verb|Tests| directory inside the distribution contains a number of tests you can run to make sure all of the different parts of biopython are working. These should all work just by running \verb|python test_WhateverTheTestIs.py|. If you didn't do this earlier, you should also all of our tests. To do this, you just need to be in the source code installation directory and type: \begin{verbatim} $ python setup.py test \end{verbatim} You can also run them by typing \verb|python run_tests.py| in the Tests sub directory. See the main Tutorial for further details (there is a whole chapter on the test framework). If you've made it this far, you've gotten Biopython installed and running. Congratulations! \section{Third Party Tools} Note that Biopython includes support for interfacing with or parsing the output from a number of third party command line tools. These are not required to install Biopython, but may be of interest. This includes: \begin{itemize} \item NCBI Standalone BLAST, which can used with the \verb|Bio.Blast| module and parsed with the \verb|Bio.SearchIO| module. \item EMBOSS tools, which can be invoked using the \verb|Bio.Emboss| module. The \verb|Bio.AlignIO| module can also parse some alignment formats output by the EMBOSS suite. \item ClustalW, which can be parsed using \verb|Bio.AlignIO| and invoked using the \verb|Bio.Align.Applications| module. \item SIMCOAL2 and FDist tools for population genetics can be used via the \verb|Bio.PopGen| module. \item Bill Pearson's FASTA tools output can be parsed using the \verb|Bio.AlignIO| and \verb|Bio.SearchIO| module. \item Wise2 includes the useful tool dnal. \end{itemize} \noindent See also the listing on \ahrefurl{\url{http://biopython.org/wiki/Download}} which should include URLs for these tools, and may also be more up to date. \section{Notes for installing with non-administrator permissions} Although I mentioned above that I wouldn't go much into installing in non-root directories, if you are stuck installing Biopython and it's dependencies into your home directory here are a few notes and tricks to keep you going: \begin{itemize} \item Building some C modules, such as \verb|Bio.Cluster| require that the NumPy include files (normally installed in \verb|your_dir/include/python/Numeric|) be available. If the compiler can't find these directories you'll normally get an error like: \begin{verbatim} Bio/Cluster/clustermodule.c:2: NumpPy/arrayobject.h: No such file or directory \end{verbatim} Followed by a long messy list of syntax errors. To fix this, you'll have to edit the \verb|setup.py| file to let it know where the include directories are located. Look for the line in \verb|setup.py| that looks like: \begin{verbatim} include_dirs=["Bio/Cluster"] \end{verbatim} and adjust it so that it includes the include directory where the NumPy libraries were installed: \begin{verbatim} include_dirs=["Bio/Cluster", "your_dir/include/python"] \end{verbatim} Then you should be able to install everything happily. \end{itemize} Yes, it's a bit of a mess installing lots of packages in non-standard locations. The best solution is to talk with your friendly system administrator and get them to assist with the installation of at least the required packages (they are generally quite useful for any python install) before going ahead with Biopython installation. \end{document} biopython-1.63/Doc/install/Installation.html0000644000175000017500000011651712250104654020570 0ustar tratra00000000000000 Biopython Installation

Biopython Installation

Brad Chapman, with other contributors

Contents

1  Purpose and Assumptions

For those of you familiar with installing python packages and who don’t care for following details instructions can try going to http://biopython.org/wiki/Download, installing the relevant prerequisites, and Biopython.

This document describes installing Biopython on your computer. To make things as simple as possible, it basically assumes you have nothing related to Python or Biopython on your computer and want to end up with a working installation of Biopython when you are finished following through this documentation.

Biopython should work on just any operating system where Python works, so these instructions contain directions for installation on UNIX/Linux, Windows and Macintosh machines. The directions assume that you have permission to install programs on the machine (root access on UNIX and Administrator privileges on Windows or Mac machines). While it is certainly possible to install things without these privileges, this is a serious pain and all the tedious workarounds aren’t something that I’ll go into very much in this documentation.

With all this said, hopefully these directions will make it straightforward to get Biopython installed on your machine so you can begin using it as quick as possible.

2  C Compiler

Although mostly written in Python, Biopython (and some of its dependencies) include C code, which must be compiled to run. If you are going to be installing from source you will therefore need a C compiler. However, in many cases this can be avoided by using pre-compiled packages (which is what we recommend on Windows).

2.1  Unix

We recommend GCC as the C compiler, this is usually available as part of the standard set of packages on any Unix or Linux system.

2.2  Mac OS X

Please install Apple’s XCode suite from the App Store, and then from the Xcode options also install the optional command line utilities.

2.3  Windows

We recommend you install Biopython and its dependencies using the provided pre-compiled Windows Installers. i.e. You don’t need a C compiler. See Section 5.4 for more details.

3  Installing Python

Python is a interpreting, interactive object-oriented programming language and the home for all things python is http://www.python.org. Presumedly you have some idea of python and what it can do if you are interested in Biopython, but if not the python website contains tons of documentation and reasons to learn to program in python.

Biopython is designed to work with Python 2.5 to 2.7 inclusive. Python 2.7 is the final 2.x series release, and this would be our recommended version (assuming all other Python libraries you plan to use support it).

Upgrading bug-fix releases (for example. 2.6.1 to 2.6.2) is incredibly easy and won’t require any re-installation of libraries.

Upgrading between versions (e.g. 2.6 to 2.7) is more time consuming since you need to re-install all libraries you have added to python.

As of Biopython 1.62 we officially support Python 3, specifically Python 3.3. Python 3.0, 3.1 and 3.2 will not be supported.

Let’s get started with installation on various platforms.

3.1  Python installation on UNIX systems

First, you should go the main python web site and head over to the information page for the latest python release. At the time of this writing the latest stable Python 2 release is 2.7.5, which is available from http://www.python.org/download/releases/2.7.5/. This page contains links to all released files for the given release. For UNIX, we’ll want to use the tarred and gzipped file, which is called Python-2.7.5.tgz at the time of this writing.

Download this file and then unpack it with the following command:

$ tar -zxvf Python-2.7.5.tar.gz

Then enter into the created directory:

$ cd Python-2.7

Now, start the build process by configuring everything to your system:

$ ./configure

Build all of the files with:

$ make

Finally, you’ll need to have root permissions on the system and then install everything:

$ make install

If there were no errors and everything worked correctly, you should now be able to type python at a command prompt and enter into the python interpreter:

$ python
Python 2.7.5 (...)
...
Type "help", "copyright", "credits" or "license" for more information.
>>>

(The precise version text and details will depend on the version you installed and your operating system.)

3.1.1  RPM and other Package Manager Installation

There are a multitude of package manager systems out there for which python is available. One popular one is the RPM (RedHat Package Manager) system. Each of these package managing systems has its own quirks and tricks and I certainly can’t pretend to understand them all so I won’t try to describe them all here.

While these package repositories may include Biopython all ready to install, you will typically want to install Biopython from source to get the very latest version.

However, there is one general point which it is important to remember when installing from any of these systems: you need to download and install the development packages for python. A number of distributions contain a "basic" python which contains libraries and enough stuff to run simple python programs. However, they do not contain the python libraries necessary to build third-party python applications (like Biopython and it’s dependencies). You’ll need to install these libraries and header files, which are often found in a separate package called python-devel or something similar.

3.2  Python installation on Windows

Installation on Windows is most easily done using handy windows installers. As described above in the UNIX section, you should go to the webpage for the current stable version of Python to download this installer. At the current time, you’d go to http://www.python.org/download/releases/2.7.5/ and download Python-2.7.5.msi.

The installer is an executable program, so you only need to double click it to run it. Then just follow the friendly instructions. On all newer Windows machines you’ll need to have Administrator privileges to do this installation.

3.3  Python installation on Mac OS X

Apple includes python on Mac OS X, and while you can use this many people have preferred to install the latest version of python as well in parallel. We refer you to the http://www.python.org for more details, although otherwise the UNIX instructions apply.

(See note above about installing XCode to get the compiler tools.)

4  Installing Biopython dependencies

Once python is installed, the next step is getting the dependencies for Biopython installed. Since not all functionality is included in the main python installation, Biopython needs some support libraries to save us a lot of work re-writing code that already exists. We try to keep as few dependencies as possible to make installation as easy as possible.

4.1  Numerical Python (NumPy) (strongly recommended)

The Numerical Python distribution is a fast implementation of arrays and associated array functionality. This is important for a number of Biopython modules that deal with number processing (e.g. Bio.Cluster and Bio.PDB).

As of release 1.49, Biopython supports the standard NumPy distribution. Previous releases instead used the older Numeric module (which is no longer being maintained).

The main web site for NumPy is: http://numpy.scipy.org/.

4.1.1  UNIX and Mac OS X systems

You should download the tar.gz file, and follow the standard python build process. Note you will need a C compiler installed (see above):

$ tar -zxvf numpy-1.7.1.tar.gz
$ cd numpy-1.7.1/
$ python setup.py build

Once it is built, you should become root, and then install it:

$ python setup.py install

One important note if you use an package system and not installing NumPy from source: you may also need to install the header files which are not included with some packages. As with the main python distribution, this means you’ll need to look for something like python-numpy-devel and make sure to install this as well as the basic package.

4.1.2  Windows systems

We recommend using the NumPy provided windows installers for your installed version of python. For Python 2.7, at the current time this would be numpy-1.7.1-win32-superpack-python2.7.exe. You should follow the now-standard procedure of downloading the installer, double clicking it and then following the installation instructions. As before, you will need to have administrator permissions to do this.

4.1.3  Making sure it installed correctly

To make sure everything went okay during the install, fire up the python interpreter and ensure you can import NumPy without any errors:

$ python2.7
Python 2.7.4 (default, Apr  8 2013, 15:01:09) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>>

Note that for the import statement, NumPy should be in lower case!

4.2  ReportLab (optional)

The ReportLab package is a library for generating PDF documents. It is used in the Biopython Graphics modules, which contains basic functionality for drawing biological objects like chromosomes. If you are not planning on using this, installing ReportLab is not necessary. ReportLab in itself is very useful for a number of tasks besides just Biopython, so you may want to check out http://www.reportlab.org before making your decision.

The main download page for ReportLab is http://www.reportlab.org/downloads.html. The ReportLab company has some commercial products as well, but just scroll down their page to the Open Source software section for the base ReportLab downloads.

If you want to generate bitmap images, you will also need the ReportLab module renderPM. This in turn requires the Python Imaging Library (PIL).

4.2.1  UNIX and Mac OS X systems

For UNIX installs, you should download the tarred and gzipped version of the ReportLab distribution. At the time of this writing, this is called ReportLab_2_3.tar.gz. First, unpack the distribution and change into the created directory:

$ gunzip ReportLab_2_3.tar.gz
$ tar -xvpf ReportLab_2_3.tar
$ cd reportlab_2_3/

Once again, ReportLab uses the standard python installation system which you are probably feeling really comfortable with by now. So, first build the package:

$ python setup.py build

Now become root, and install it:

$ python setup.py install

4.2.2  Windows systems

ReportLab now has graphical windows installers. Nice and easy.

4.2.3  Making sure it installed correctly

If reportlab is installed correctly, you should be able to do the following:

$ python2.7
Python 2.7.4 (default, Apr  8 2013, 15:01:09) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from reportlab.graphics import renderPDF
>>>

Depending on your version of python and what you have installed, you may get the following warning message: Warn: Python Imaging Library not available. This isn’t anything to worry about unless you want to produce bitmap images, since the Biopython parts that use ReportLab will work just fine without it.

4.3  Database Access (MySQLdb, ...) (optional)

The MySQLdb package is a library for accessing MySQL databases. Biopython includes an accessory module, DocSQL, which provides a convenient interface to MySQLdb. If you are not planning on using Bio.DocSQL, installing MySQLdb is not necessary.

Additionally, both MySQLdb and psycopg (a PostgreSQL database adaptor) can be used for accessing BioSQL databases through Biopython (see http://biopython.org/wiki/BioSQL). Again if you are not going to use BioSQL, there shouldn’t be any need to install these modules.

4.4  mxTextTools (no longer needed)

Historically this was an important Biopython dependency, used extensively in a number of parsers. However, we have gradually phased out its use, and as of Biopython 1.50, mxTextTools is no longer used at all.

mxTextTools is available along with the entire mx-base system (which contains a number of other useful utilities as well) and the latest version is available for download at: http://www.egenix.com/products/python/mxBase/mxTextTools/.

5  Installing Biopython

5.1  Obtaining Biopython

Biopython’s internet home is at, naturally enough, http://www.biopython.org. This is the home of all things Biopython, so it is the best place to start looking around. You have two choices for obtaining Biopython:

  1. Release code – We made available releases on the download page (http://biopython.org/wiki/Download). The releases are also available both as source and as installers (windows installers right now), so you have some choices to pick from on releases if you prefer not to deal with source code directly.
  2. git – The current working copy of the Biopython sources is available via git hosted on github – http://github.com/biopython/biopython). Concise instructions for accessing this copy are available at http://biopython.org/wiki/SourceCode. Our code in git is normally quite stable but there is always the caveat that the code there is under development.

Based on which way you choose, you’ll need to follow one of the following installation options. Read on for the platform you are working on.

5.2  Installing on UNIX and Mac OS X

5.2.1  Installation from source on UNIX and Mac OS X

Biopython uses Distutils, the standard python installation package, for its installation. If you read the install instructions above you are already quite familiar with its workings. Distutils comes standard with Python 1.6 and beyond.

Now that we’ve got what we need, let’s get into the installation:

  1. First you need to unpack the distribution. If you got the git version, you are all set to go and can skip on ahead. Otherwise, you’ll need to unpack it. On UN*X machines, a tar.gz package is provided, which you can unpack with tar -xzvpf biopython-X.X.tar.gz. A zip file is also provided for other platforms.
  2. Now that everything is unpacked, move into the biopython* directory (this will just be biopython for git users, and will be biopython-X.X for those using a packaged download).
  3. Now you are ready for your one step install – python setup.py install. This performs the default install, and will put Biopython into the site-packages directory of your python library tree (on my machine this is /usr/local/lib/python2.4/site-packages). You will have to have permissions to write to this directory, so you’ll need to have root access on the machine.
    1. This install requires that you have the python source available. You can check this by looking for Python.h and config.h in some place like /usr/local/include/python2.5. If you installed python with RPMs or some other packaging system, this means you’ll also have to install the header files. This requires installing the python development libraries as well (normally called something like python-devel-2.5.rpm).
    2. The distutils setup process allows you to do some customization of your install so you don’t have to stick everything in the default location (in case you don’t have write permissions there, or just want to test Biopython out). You have quite a few choices, which are covered in detail in the distutils installation manual (http://www.python.org/sigs/distutils-sig/doc/inst/inst.html), specifically in the Alternative installation section. For example, to install Biopython into your home directory, you need to type python setup.py install --home=$HOME. This will install the package into someplace like $HOME/lib/python2.5/site-packages. You’ll need to subsequently modify the PYTHONPATH environmental variable to include this directory so python will be able to find the installation.
  4. That’s it! Biopython is installed. Wasn’t that easy? Now let’s check and make sure it worked properly. Skip on ahead to section 6.

5.2.2  Using the Python package index

Another simple option is to use the Python package index (http://pypi.python.org/pypi) with the easy_install command:

$ easy_install -f http://biopython.org/DIST/ biopython

If Python is installed in the standard location, you will need administrator privileges to do this; the sudo command works well:

$ sudo easy_install -f http://biopython.org/DIST/ biopython

5.2.3  Installation on Mac OS X using the fink package manager

Instead of installing from source, on Mac OS X you can also use the fink package manager, see http://fink.sf.net. Fink should take care of downloading the source code and installing all needed packages for Biopython, including Python itself. Once you have installed fink, you can install biopython using:

$ fink install biopython-pyXX

where XX is the python version you would like to use. Currently, python 2.4, 2.5, and 2.6 are available through fink on Mac OS X 10.4, so you would have to replace XX with 24, 25, or 26, respectively. Most likely, you will have to enable the unstable tree of fink in order to install the most recent versions of the package, see also this item in the Fink FAQ: http://fink.sourceforge.net/faq/usage-fink.php#unstable. Note that ’unstable’ doesn’t mean that a package won’t work, but only that there has not been feedback to the fink team from users.

5.2.4  Installation on UNIX systems using RPMs

Warning. Right now we’re not making RPMs for biopython (because I stopped using an RPM system, basically). If anyone wants to pick this up, or feels especially strongly that they’d like RPMs, please let us know.

To simplify things for people running RPM-based systems, biopython can also be installed via the RPM system. Additionally, this saves the necessity of having a C compiler to install biopython.

Installing Biopython from a RPM package should be much the same process as used for other RPMs. If you need general information about how RPMs work, the best place to go is http://www.rpm.org.

To install it, you should just need to do:

$ rpm -i your_biopython.rpm

To see what you installed try doing rpm -qpl your_biopython.rpm which will list all of the installed files.

RPMs do not install the documentation, tests, or example code, so you might want to also grab a source distribution, so you can use these resources (and also look at the source code if you want to).

5.3  Installing with a Windows Installer

Installing things on Windows with the installer should be really easy (hey, that’s why they’ve got graphical installers, right?). You should just need to download the Biopython-version.exe installer from biopython web site. Then you just need to double click and voila, a nice little installer will come up and you can stick the libraries where you need to. No need for a C compiler or anything fancy. You will need to have Administrator privileges on the machine to do the installation.

This does not install the documentation, tests, example code or source code, so it is probably also a good idea to download the zip file containing this so you can test your installation and learn how to use it.

5.4  Installing from source on Windows

This section deals with installing the source (i. e. from git or from a source zip file) on a Windows machine. Much of the information from the UNIX install applies here, so it would be good to read section 5.2 before starting. You will need a suitable C compiler. What you choose may depend on your version of Python.

For Python 2.6 we currently use Microsoft’s free VC++ 2008 Express Edition from http://www.microsoft.com/express/download/, installation of this is pretty simple. Then go to the Biopython source directory and run:

c:\python26\python setup.py build
c:\python26\python setup.py test
c:\python26\python setup.py install

For older versions of Python, we use mingw32 installed from cygwin (http://www.cygwin.com). Once everything is setup (which is a bit complicated), you would again get the source, and from that directory run:

c:\python25\python setup.py build --compiler=mingw32
c:\python25\python setup.py test
c:\python25\python setup.py install

Previously (back on Python 2.0), Brad has also managed to use Borland’s free C++ compiler (available from http://www.inprise.com/bcppbuilder/freecompiler/), but this required extra work.

Now that you’ve got everything installed, carry on ahead to section 6 to make sure everything worked.

6  Making sure everything worked

First, we’ll just do a quick test to make sure Biopython is installed correctly. The most important thing is that python can find the biopython installation. Biopython installs into top level Bio and BioSQL directories, so you’ll want to make sure these directories are located in a directory specified in your $PYTHONPATH environmental variable. If you used the default install, this shouldn’t be a problem, but if not, you’ll need to set the PYTHONPATH with something like export PYTHONPATH = $PYTHONPATH':/directory/where/you/put/Biopython' (on UNIX). Now that we think we are ready, fire up your python interpreter and follow along with the following code:

$ python
Python 2.5 (r25:51908, Nov 23 2006, 18:40:28) 
[GCC 4.1.1 20061011 (Red Hat 4.1.1-30)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from Bio.Seq import Seq
>>> from Bio.Alphabet.IUPAC import unambiguous_dna
>>> new_seq = Seq('GATCAGAAG', unambiguous_dna)
>>> new_seq[0:2]
Seq('GA', IUPACUnambiguousDNA())
>>> new_seq.translate()
Seq('DQK', HasStopCodon(IUPACProtein(), '*'))
>>>

If this worked properly, then it looks like Biopython is in a happy place where python can find it, so now you might want to do some more rigorous tests. The Tests directory inside the distribution contains a number of tests you can run to make sure all of the different parts of biopython are working. These should all work just by running python test_WhateverTheTestIs.py.

If you didn’t do this earlier, you should also all of our tests. To do this, you just need to be in the source code installation directory and type:

$ python setup.py test

You can also run them by typing python run_tests.py in the Tests sub directory. See the main Tutorial for further details (there is a whole chapter on the test framework).

If you’ve made it this far, you’ve gotten Biopython installed and running. Congratulations!

7  Third Party Tools

Note that Biopython includes support for interfacing with or parsing the output from a number of third party command line tools. These are not required to install Biopython, but may be of interest. This includes:

  • NCBI Standalone BLAST, which can used with the Bio.Blast module and parsed with the Bio.SearchIO module.
  • EMBOSS tools, which can be invoked using the Bio.Emboss module. The Bio.AlignIO module can also parse some alignment formats output by the EMBOSS suite.
  • ClustalW, which can be parsed using Bio.AlignIO and invoked using the Bio.Align.Applications module.
  • SIMCOAL2 and FDist tools for population genetics can be used via the Bio.PopGen module.
  • Bill Pearson’s FASTA tools output can be parsed using the Bio.AlignIO and Bio.SearchIO module.
  • Wise2 includes the useful tool dnal.

See also the listing on http://biopython.org/wiki/Download which should include URLs for these tools, and may also be more up to date.

8  Notes for installing with non-administrator permissions

Although I mentioned above that I wouldn’t go much into installing in non-root directories, if you are stuck installing Biopython and it’s dependencies into your home directory here are a few notes and tricks to keep you going:

  • Building some C modules, such as Bio.Cluster require that the NumPy include files (normally installed in your_dir/include/python/Numeric) be available. If the compiler can’t find these directories you’ll normally get an error like:
    Bio/Cluster/clustermodule.c:2: NumpPy/arrayobject.h: No such file or directory
        

    Followed by a long messy list of syntax errors. To fix this, you’ll have to edit the setup.py file to let it know where the include directories are located. Look for the line in setup.py that looks like:

        include_dirs=["Bio/Cluster"]
        

    and adjust it so that it includes the include directory where the NumPy libraries were installed:

        include_dirs=["Bio/Cluster", "your_dir/include/python"]
        

    Then you should be able to install everything happily.

Yes, it’s a bit of a mess installing lots of packages in non-standard locations. The best solution is to talk with your friendly system administrator and get them to assist with the installation of at least the required packages (they are generally quite useful for any python install) before going ahead with Biopython installation.


This document was translated from LATEX by HEVEA.
biopython-1.63/Doc/install/Makefile0000644000175000017500000000113012250104543016656 0ustar tratra00000000000000# create pdf, txt and html documentation FILENAME=Installation all: ${FILENAME}.pdf ${FILENAME}.html ${FILENAME}.txt clean: rm -f ${FILENAME}.aux rm -f ${FILENAME}.log rm -f ${FILENAME}.out rm -f ${FILENAME}.toc rm -f ${FILENAME}.haux rm -f ${FILENAME}.htoc distclean: clean rm -f ${FILENAME}.pdf rm -f ${FILENAME}.txt rm -f ${FILENAME}.html ${FILENAME}.pdf: ${FILENAME}.tex pdflatex ${FILENAME}.tex pdflatex ${FILENAME}.tex pdflatex ${FILENAME}.tex ${FILENAME}.html: ${FILENAME}.tex hevea -fix ${FILENAME}.tex ${FILENAME}.txt: ${FILENAME}.tex hevea -fix -text ${FILENAME}.tex biopython-1.63/Doc/Tutorial.html0000644000175000017500000374636012250104613016267 0ustar tratra00000000000000 Biopython Tutorial and Cookbook

[Biopython Logo]

Biopython Tutorial and Cookbook

Jeff Chang, Brad Chapman, Iddo Friedberg, Thomas Hamelryck,
Michiel de Hoon, Peter Cock, Tiago Antao, Eric Talevich, Bartek Wilczyński

Last Update – 1 December 2013 (Biopython 1.63)

Contents

Chapter 1  Introduction

1.1  What is Biopython?

The Biopython Project is an international association of developers of freely available Python (http://www.python.org) tools for computational molecular biology. Python is an object oriented, interpreted, flexible language that is becoming increasingly popular for scientific computing. Python is easy to learn, has a very clear syntax and can easily be extended with modules written in C, C++ or FORTRAN.

The Biopython web site (http://www.biopython.org) provides an online resource for modules, scripts, and web links for developers of Python-based software for bioinformatics use and research. Basically, the goal of Biopython is to make it as easy as possible to use Python for bioinformatics by creating high-quality, reusable modules and classes. Biopython features include parsers for various Bioinformatics file formats (BLAST, Clustalw, FASTA, Genbank,...), access to online services (NCBI, Expasy,...), interfaces to common and not-so-common programs (Clustalw, DSSP, MSMS...), a standard sequence class, various clustering modules, a KD tree data structure etc. and even documentation.

Basically, we just like to program in Python and want to make it as easy as possible to use Python for bioinformatics by creating high-quality, reusable modules and scripts.

1.2  What can I find in the Biopython package

The main Biopython releases have lots of functionality, including:

  • The ability to parse bioinformatics files into Python utilizable data structures, including support for the following formats:
    • Blast output – both from standalone and WWW Blast
    • Clustalw
    • FASTA
    • GenBank
    • PubMed and Medline
    • ExPASy files, like Enzyme and Prosite
    • SCOP, including ‘dom’ and ‘lin’ files
    • UniGene
    • SwissProt
  • Files in the supported formats can be iterated over record by record or indexed and accessed via a Dictionary interface.
  • Code to deal with popular on-line bioinformatics destinations such as:
    • NCBI – Blast, Entrez and PubMed services
    • ExPASy – Swiss-Prot and Prosite entries, as well as Prosite searches
  • Interfaces to common bioinformatics programs such as:
    • Standalone Blast from NCBI
    • Clustalw alignment program
    • EMBOSS command line tools
  • A standard sequence class that deals with sequences, ids on sequences, and sequence features.
  • Tools for performing common operations on sequences, such as translation, transcription and weight calculations.
  • Code to perform classification of data using k Nearest Neighbors, Naive Bayes or Support Vector Machines.
  • Code for dealing with alignments, including a standard way to create and deal with substitution matrices.
  • Code making it easy to split up parallelizable tasks into separate processes.
  • GUI-based programs to do basic sequence manipulations, translations, BLASTing, etc.
  • Extensive documentation and help with using the modules, including this file, on-line wiki documentation, the web site, and the mailing list.
  • Integration with BioSQL, a sequence database schema also supported by the BioPerl and BioJava projects.

We hope this gives you plenty of reasons to download and start using Biopython!

1.3  Installing Biopython

All of the installation information for Biopython was separated from this document to make it easier to keep updated.

The short version is go to our downloads page (http://biopython.org/wiki/Download), download and install the listed dependencies, then download and install Biopython. Biopython runs on many platforms (Windows, Mac, and on the various flavors of Linux and Unix). For Windows we provide pre-compiled click-and-run installers, while for Unix and other operating systems you must install from source as described in the included README file. This is usually as simple as the standard commands:

python setup.py build
python setup.py test
sudo python setup.py install

(You can in fact skip the build and test, and go straight to the install – but its better to make sure everything seems to be working.)

The longer version of our installation instructions covers installation of Python, Biopython dependencies and Biopython itself. It is available in PDF (http://biopython.org/DIST/docs/install/Installation.pdf) and HTML formats (http://biopython.org/DIST/docs/install/Installation.html).

1.4  Frequently Asked Questions (FAQ)

  1. How do I cite Biopython in a scientific publication?
    Please cite our application note [1, Cock et al., 2009] as the main Biopython reference. In addition, please cite any publications from the following list if appropriate, in particular as a reference for specific modules within Biopython (more information can be found on our website):
    • For the official project announcement: [13, Chapman and Chang, 2000];
    • For Bio.PDB: [18, Hamelryck and Manderick, 2003];
    • For Bio.Cluster: [14, De Hoon et al., 2004];
    • For Bio.Graphics.GenomeDiagram: [2, Pritchard et al., 2006];
    • For Bio.Phylo and Bio.Phylo.PAML: [9, Talevich et al., 2012];
    • For the FASTQ file format as supported in Biopython, BioPerl, BioRuby, BioJava, and EMBOSS: [7, Cock et al., 2010].
  2. How should I capitalize “Biopython”? Is “BioPython” OK?
    The correct capitalization is “Biopython”, not “BioPython” (even though that would have matched BioPerl, BioJava and BioRuby).
  3. What is going wrong with my print commands?
    This tutorial now uses the Python 3 style print function. As of Biopython 1.62, we support both Python 2 and Python 3. The most obvious language difference is the print statement in Python 2 became a print function in Python 3.

    For example, this will only work under Python 2:

    >>> print "Hello World!"
    Hello World!
    

    If you try that on Python 3 you’ll get a SyntaxError. Under Python 3 you must write:

    >>> print("Hello World!")
    Hello World!
    

    Surprisingly that will also work on Python 2 – but only for simple examples printing one thing. In general you need to add this magic line to the start of your Python scripts to use the print function under Python 2.6 and 2.7:

    from __future__ import print_function
    

    If you forget to add this magic import, under Python 2 you’ll see extra brackets produced by trying to use the print function when Python 2 is interpretting it as a print statement and a tuple.

  4. How do I find out what version of Biopython I have installed?
    Use this:
      >>> import Bio
      >>> print(Bio.__version__)
      ...
      
    If the “import Bio” line fails, Biopython is not installed. If the second line fails, your version is very out of date. If the version string ends with a plus, you don’t have an official release, but a snapshot of the in development code.
  5. Where is the latest version of this document?
    If you download a Biopython source code archive, it will include the relevant version in both HTML and PDF formats. The latest published version of this document (updated at each release) is online: If you are using the very latest unreleased code from our repository you can find copies of the in-progress tutorial here:
  6. Why is the Seq object missing the upper & lower methods described in this Tutorial?
    You need Biopython 1.53 or later. Alternatively, use str(my_seq).upper() to get an upper case string. If you need a Seq object, try Seq(str(my_seq).upper()) but be careful about blindly re-using the same alphabet.
  7. Why doesn’t the Seq object translation method support the cds option described in this Tutorial?
    You need Biopython 1.51 or later.
  8. What file formats do Bio.SeqIO and Bio.AlignIO read and write?
    Check the built in docstrings (from Bio import SeqIO, then help(SeqIO)), or see http://biopython.org/wiki/SeqIO and http://biopython.org/wiki/AlignIO on the wiki for the latest listing.
  9. Why won’t the Bio.SeqIO and Bio.AlignIO functions parse, read and write take filenames? They insist on handles!
    You need Biopython 1.54 or later, or just use handles explicitly (see Section 22.1). It is especially important to remember to close output handles explicitly after writing your data.
  10. Why won’t the Bio.SeqIO.write() and Bio.AlignIO.write() functions accept a single record or alignment? They insist on a list or iterator!
    You need Biopython 1.54 or later, or just wrap the item with [...] to create a list of one element.
  11. Why doesn’t str(...) give me the full sequence of a Seq object?
    You need Biopython 1.45 or later. Alternatively, rather than str(my_seq), use my_seq.tostring() (which will also work on recent versions of Biopython).
  12. Why doesn’t Bio.Blast work with the latest plain text NCBI blast output?
    The NCBI keep tweaking the plain text output from the BLAST tools, and keeping our parser up to date is/was an ongoing struggle. If you aren’t using the latest version of Biopython, you could try upgrading. However, we (and the NCBI) recommend you use the XML output instead, which is designed to be read by a computer program.
  13. Why doesn’t Bio.Entrez.parse() work? The module imports fine but there is no parse function!
    You need Biopython 1.52 or later.
  14. Why has my script using Bio.Entrez.efetch() stopped working?
    This could be due to NCBI changes in February 2012 introducing EFetch 2.0. First, they changed the default return modes - you probably want to add retmode="text" to your call. Second, they are now stricter about how to provide a list of IDs – Biopython 1.59 onwards turns a list into a comma separated string automatically.
  15. Why doesn’t Bio.Blast.NCBIWWW.qblast() give the same results as the NCBI BLAST website?
    You need to specify the same options – the NCBI often adjust the default settings on the website, and they do not match the QBLAST defaults anymore. Check things like the gap penalties and expectation threshold.
  16. Why doesn’t Bio.Blast.NCBIXML.read() work? The module imports but there is no read function!
    You need Biopython 1.50 or later. Or, use next(Bio.Blast.NCBIXML.parse(...)) instead.
  17. Why doesn’t my SeqRecord object have a letter_annotations attribute?
    Per-letter-annotation support was added in Biopython 1.50.
  18. Why can’t I slice my SeqRecord to get a sub-record?
    You need Biopython 1.50 or later.
  19. Why can’t I add SeqRecord objects together?
    You need Biopython 1.53 or later.
  20. Why doesn’t Bio.SeqIO.convert() or Bio.AlignIO.convert() work? The modules import fine but there is no convert function!
    You need Biopython 1.52 or later. Alternatively, combine the parse and write functions as described in this tutorial (see Sections 5.5.2 and 6.2.1).
  21. Why doesn’t Bio.SeqIO.index() work? The module imports fine but there is no index function!
    You need Biopython 1.52 or later.
  22. Why doesn’t Bio.SeqIO.index_db() work? The module imports fine but there is no index_db function!
    You need Biopython 1.57 or later (and a Python with SQLite3 support).
  23. Where is the MultipleSeqAlignment object? The Bio.Align module imports fine but this class isn’t there!
    You need Biopython 1.54 or later. Alternatively, the older Bio.Align.Generic.Alignment class supports some of its functionality, but using this is now discouraged.
  24. Why can’t I run command line tools directly from the application wrappers?
    You need Biopython 1.55 or later. Alternatively, use the Python subprocess module directly.
  25. I looked in a directory for code, but I couldn’t find the code that does something. Where’s it hidden?
    One thing to know is that we put code in __init__.py files. If you are not used to looking for code in this file this can be confusing. The reason we do this is to make the imports easier for users. For instance, instead of having to do a “repetitive” import like from Bio.GenBank import GenBank, you can just use from Bio import GenBank.
  26. Why does the code from CVS seem out of date?
    In late September 2009, just after the release of Biopython 1.52, we switched from using CVS to git, a distributed version control system. The old CVS server will remain available as a static and read only backup, but if you want to grab the latest code, you’ll need to use git instead. See our website for more details.

For more general questions, the Python FAQ pages http://www.python.org/doc/faq/ may be useful.

Chapter 2  Quick Start – What can you do with Biopython?

This section is designed to get you started quickly with Biopython, and to give a general overview of what is available and how to use it. All of the examples in this section assume that you have some general working knowledge of Python, and that you have successfully installed Biopython on your system. If you think you need to brush up on your Python, the main Python web site provides quite a bit of free documentation to get started with (http://www.python.org/doc/).

Since much biological work on the computer involves connecting with databases on the internet, some of the examples will also require a working internet connection in order to run.

Now that that is all out of the way, let’s get into what we can do with Biopython.

2.1  General overview of what Biopython provides

As mentioned in the introduction, Biopython is a set of libraries to provide the ability to deal with “things” of interest to biologists working on the computer. In general this means that you will need to have at least some programming experience (in Python, of course!) or at least an interest in learning to program. Biopython’s job is to make your job easier as a programmer by supplying reusable libraries so that you can focus on answering your specific question of interest, instead of focusing on the internals of parsing a particular file format (of course, if you want to help by writing a parser that doesn’t exist and contributing it to Biopython, please go ahead!). So Biopython’s job is to make you happy!

One thing to note about Biopython is that it often provides multiple ways of “doing the same thing.” Things have improved in recent releases, but this can still be frustrating as in Python there should ideally be one right way to do something. However, this can also be a real benefit because it gives you lots of flexibility and control over the libraries. The tutorial helps to show you the common or easy ways to do things so that you can just make things work. To learn more about the alternative possibilities, look in the Cookbook (Chapter 18, this has some cools tricks and tips), the Advanced section (Chapter 20), the built in “docstrings” (via the Python help command, or the API documentation) or ultimately the code itself.

2.2  Working with sequences

Disputably (of course!), the central object in bioinformatics is the sequence. Thus, we’ll start with a quick introduction to the Biopython mechanisms for dealing with sequences, the Seq object, which we’ll discuss in more detail in Chapter 3.

Most of the time when we think about sequences we have in my mind a string of letters like ‘AGTACACTGGT’. You can create such Seq object with this sequence as follows - the “>>>” represents the Python prompt followed by what you would type in:

>>> from Bio.Seq import Seq
>>> my_seq = Seq("AGTACACTGGT")
>>> my_seq
Seq('AGTACACTGGT', Alphabet())
>>> print(my_seq)
AGTACACTGGT
>>> my_seq.alphabet
Alphabet()

What we have here is a sequence object with a generic alphabet - reflecting the fact we have not specified if this is a DNA or protein sequence (okay, a protein with a lot of Alanines, Glycines, Cysteines and Threonines!). We’ll talk more about alphabets in Chapter 3.

In addition to having an alphabet, the Seq object differs from the Python string in the methods it supports. You can’t do this with a plain string:

>>> my_seq
Seq('AGTACACTGGT', Alphabet())
>>> my_seq.complement()
Seq('TCATGTGACCA', Alphabet())
>>> my_seq.reverse_complement()
Seq('ACCAGTGTACT', Alphabet())

The next most important class is the SeqRecord or Sequence Record. This holds a sequence (as a Seq object) with additional annotation including an identifier, name and description. The Bio.SeqIO module for reading and writing sequence file formats works with SeqRecord objects, which will be introduced below and covered in more detail by Chapter 5.

This covers the basic features and uses of the Biopython sequence class. Now that you’ve got some idea of what it is like to interact with the Biopython libraries, it’s time to delve into the fun, fun world of dealing with biological file formats!

2.3  A usage example

Before we jump right into parsers and everything else to do with Biopython, let’s set up an example to motivate everything we do and make life more interesting. After all, if there wasn’t any biology in this tutorial, why would you want you read it?

Since I love plants, I think we’re just going to have to have a plant based example (sorry to all the fans of other organisms out there!). Having just completed a recent trip to our local greenhouse, we’ve suddenly developed an incredible obsession with Lady Slipper Orchids (if you wonder why, have a look at some Lady Slipper Orchids photos on Flickr, or try a Google Image Search).

Of course, orchids are not only beautiful to look at, they are also extremely interesting for people studying evolution and systematics. So let’s suppose we’re thinking about writing a funding proposal to do a molecular study of Lady Slipper evolution, and would like to see what kind of research has already been done and how we can add to that.

After a little bit of reading up we discover that the Lady Slipper Orchids are in the Orchidaceae family and the Cypripedioideae sub-family and are made up of 5 genera: Cypripedium, Paphiopedilum, Phragmipedium, Selenipedium and Mexipedium.

That gives us enough to get started delving for more information. So, let’s look at how the Biopython tools can help us. We’ll start with sequence parsing in Section 2.4, but the orchids will be back later on as well - for example we’ll search PubMed for papers about orchids and extract sequence data from GenBank in Chapter 9, extract data from Swiss-Prot from certain orchid proteins in Chapter 10, and work with ClustalW multiple sequence alignments of orchid proteins in Section 6.4.1.

2.4  Parsing sequence file formats

A large part of much bioinformatics work involves dealing with the many types of file formats designed to hold biological data. These files are loaded with interesting biological data, and a special challenge is parsing these files into a format so that you can manipulate them with some kind of programming language. However the task of parsing these files can be frustrated by the fact that the formats can change quite regularly, and that formats may contain small subtleties which can break even the most well designed parsers.

We are now going to briefly introduce the Bio.SeqIO module – you can find out more in Chapter 5. We’ll start with an online search for our friends, the lady slipper orchids. To keep this introduction simple, we’re just using the NCBI website by hand. Let’s just take a look through the nucleotide databases at NCBI, using an Entrez online search (http://www.ncbi.nlm.nih.gov:80/entrez/query.fcgi?db=Nucleotide) for everything mentioning the text Cypripedioideae (this is the subfamily of lady slipper orchids).

When this tutorial was originally written, this search gave us only 94 hits, which we saved as a FASTA formatted text file and as a GenBank formatted text file (files ls_orchid.fasta and ls_orchid.gbk, also included with the Biopython source code under docs/tutorial/examples/).

If you run the search today, you’ll get hundreds of results! When following the tutorial, if you want to see the same list of genes, just download the two files above or copy them from docs/examples/ in the Biopython source code. In Section 2.5 we will look at how to do a search like this from within Python.

2.4.1  Simple FASTA parsing example

If you open the lady slipper orchids FASTA file ls_orchid.fasta in your favourite text editor, you’ll see that the file starts like this:

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
...

It contains 94 records, each has a line starting with “>” (greater-than symbol) followed by the sequence on one or more lines. Now try this in Python:

from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
    print(seq_record.id)
    print(repr(seq_record.seq))
    print(len(seq_record))

You should get something like this on your screen:

gi|2765658|emb|Z78533.1|CIZ78533
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet())
740
...
gi|2765564|emb|Z78439.1|PBZ78439
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', SingleLetterAlphabet())
592

Notice that the FASTA format does not specify the alphabet, so Bio.SeqIO has defaulted to the rather generic SingleLetterAlphabet() rather than something DNA specific.

2.4.2  Simple GenBank parsing example

Now let’s load the GenBank file ls_orchid.gbk instead - notice that the code to do this is almost identical to the snippet used above for the FASTA file - the only difference is we change the filename and the format string:

from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
    print(seq_record.id)
    print(repr(seq_record.seq))
    print(len(seq_record))

This should give:

Z78533.1
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA())
740
...
Z78439.1
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA())
592

This time Bio.SeqIO has been able to choose a sensible alphabet, IUPAC Ambiguous DNA. You’ll also notice that a shorter string has been used as the seq_record.id in this case.

2.4.3  I love parsing – please don’t stop talking about it!

Biopython has a lot of parsers, and each has its own little special niches based on the sequence format it is parsing and all of that. Chapter 5 covers Bio.SeqIO in more detail, while Chapter 6 introduces Bio.AlignIO for sequence alignments.

While the most popular file formats have parsers integrated into Bio.SeqIO and/or Bio.AlignIO, for some of the rarer and unloved file formats there is either no parser at all, or an old parser which has not been linked in yet. Please also check the wiki pages http://biopython.org/wiki/SeqIO and http://biopython.org/wiki/AlignIO for the latest information, or ask on the mailing list. The wiki pages should include an up to date list of supported file types, and some additional examples.

The next place to look for information about specific parsers and how to do cool things with them is in the Cookbook (Chapter 18 of this Tutorial). If you don’t find the information you are looking for, please consider helping out your poor overworked documentors and submitting a cookbook entry about it! (once you figure out how to do it, that is!)

2.5  Connecting with biological databases

One of the very common things that you need to do in bioinformatics is extract information from biological databases. It can be quite tedious to access these databases manually, especially if you have a lot of repetitive work to do. Biopython attempts to save you time and energy by making some on-line databases available from Python scripts. Currently, Biopython has code to extract information from the following databases:

  • Entrez (and PubMed) from the NCBI – See Chapter 9.
  • ExPASy – See Chapter 10.
  • SCOP – See the Bio.SCOP.search() function.

The code in these modules basically makes it easy to write Python code that interact with the CGI scripts on these pages, so that you can get results in an easy to deal with format. In some cases, the results can be tightly integrated with the Biopython parsers to make it even easier to extract information.

2.6  What to do next

Now that you’ve made it this far, you hopefully have a good understanding of the basics of Biopython and are ready to start using it for doing useful work. The best thing to do now is finish reading this tutorial, and then if you want start snooping around in the source code, and looking at the automatically generated documentation.

Once you get a picture of what you want to do, and what libraries in Biopython will do it, you should take a peak at the Cookbook (Chapter 18), which may have example code to do something similar to what you want to do.

If you know what you want to do, but can’t figure out how to do it, please feel free to post questions to the main Biopython list (see http://biopython.org/wiki/Mailing_lists). This will not only help us answer your question, it will also allow us to improve the documentation so it can help the next person do what you want to do.

Enjoy the code!

Chapter 3  Sequence objects

Biological sequences are arguably the central object in Bioinformatics, and in this chapter we’ll introduce the Biopython mechanism for dealing with sequences, the Seq object. Chapter 4 will introduce the related SeqRecord object, which combines the sequence information with any annotation, used again in Chapter 5 for Sequence Input/Output.

Sequences are essentially strings of letters like AGTACACTGGT, which seems very natural since this is the most common way that sequences are seen in biological file formats.

There are two important differences between Seq objects and standard Python strings. First of all, they have different methods. Although the Seq object supports many of the same methods as a plain string, its translate() method differs by doing biological translation, and there are also additional biologically relevant methods like reverse_complement(). Secondly, the Seq object has an important attribute, alphabet, which is an object describing what the individual characters making up the sequence string “mean”, and how they should be interpreted. For example, is AGTACACTGGT a DNA sequence, or just a protein sequence that happens to be rich in Alanines, Glycines, Cysteines and Threonines?

3.1  Sequences and Alphabets

The alphabet object is perhaps the important thing that makes the Seq object more than just a string. The currently available alphabets for Biopython are defined in the Bio.Alphabet module. We’ll use the IUPAC alphabets (http://www.chem.qmw.ac.uk/iupac/) here to deal with some of our favorite objects: DNA, RNA and Proteins.

Bio.Alphabet.IUPAC provides basic definitions for proteins, DNA and RNA, but additionally provides the ability to extend and customize the basic definitions. For instance, for proteins, there is a basic IUPACProtein class, but there is an additional ExtendedIUPACProtein class providing for the additional elements “U” (or “Sec” for selenocysteine) and “O” (or “Pyl” for pyrrolysine), plus the ambiguous symbols “B” (or “Asx” for asparagine or aspartic acid), “Z” (or “Glx” for glutamine or glutamic acid), “J” (or “Xle” for leucine isoleucine) and “X” (or “Xxx” for an unknown amino acid). For DNA you’ve got choices of IUPACUnambiguousDNA, which provides for just the basic letters, IUPACAmbiguousDNA (which provides for ambiguity letters for every possible situation) and ExtendedIUPACDNA, which allows letters for modified bases. Similarly, RNA can be represented by IUPACAmbiguousRNA or IUPACUnambiguousRNA.

The advantages of having an alphabet class are two fold. First, this gives an idea of the type of information the Seq object contains. Secondly, this provides a means of constraining the information, as a means of type checking.

Now that we know what we are dealing with, let’s look at how to utilize this class to do interesting work. You can create an ambiguous sequence with the default generic alphabet like this:

>>> from Bio.Seq import Seq
>>> my_seq = Seq("AGTACACTGGT")
>>> my_seq
Seq('AGTACACTGGT', Alphabet())
>>> my_seq.alphabet
Alphabet()

However, where possible you should specify the alphabet explicitly when creating your sequence objects - in this case an unambiguous DNA alphabet object:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("AGTACACTGGT", IUPAC.unambiguous_dna)
>>> my_seq
Seq('AGTACACTGGT', IUPACUnambiguousDNA())
>>> my_seq.alphabet
IUPACUnambiguousDNA()

Unless of course, this really is an amino acid sequence:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_prot = Seq("AGTACACTGGT", IUPAC.protein)
>>> my_prot
Seq('AGTACACTGGT', IUPACProtein())
>>> my_prot.alphabet
IUPACProtein()

3.2  Sequences act like strings

In many ways, we can deal with Seq objects as if they were normal Python strings, for example getting the length, or iterating over the elements:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("GATCG", IUPAC.unambiguous_dna)
>>> for index, letter in enumerate(my_seq):
...     print("%i %s" % (index, letter))
0 G
1 A
2 T
3 C
4 G
>>> print(len(my_seq))
5

You can access elements of the sequence in the same way as for strings (but remember, Python counts from zero!):

>>> print(my_seq[0]) #first letter
G
>>> print(my_seq[2]) #third letter
T
>>> print(my_seq[-1]) #last letter
G

The Seq object has a .count() method, just like a string. Note that this means that like a Python string, this gives a non-overlapping count:

>>> from Bio.Seq import Seq
>>> "AAAA".count("AA")
2
>>> Seq("AAAA").count("AA")
2

For some biological uses, you may actually want an overlapping count (i.e. 3 in this trivial example). When searching for single letters, this makes no difference:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPAC.unambiguous_dna)
>>> len(my_seq)
32
>>> my_seq.count("G")
9
>>> 100 * float(my_seq.count("G") + my_seq.count("C")) / len(my_seq)
46.875

While you could use the above snippet of code to calculate a GC%, note that the Bio.SeqUtils module has several GC functions already built. For example:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> from Bio.SeqUtils import GC
>>> my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPAC.unambiguous_dna)
>>> GC(my_seq)
46.875

Note that using the Bio.SeqUtils.GC() function should automatically cope with mixed case sequences and the ambiguous nucleotide S which means G or C.

Also note that just like a normal Python string, the Seq object is in some ways “read-only”. If you need to edit your sequence, for example simulating a point mutation, look at the Section 3.12 below which talks about the MutableSeq object.

3.3  Slicing a sequence

A more complicated example, let’s get a slice of the sequence:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna)
>>> my_seq[4:12]
Seq('GATGGGCC', IUPACUnambiguousDNA())

Two things are interesting to note. First, this follows the normal conventions for Python strings. So the first element of the sequence is 0 (which is normal for computer science, but not so normal for biology). When you do a slice the first item is included (i.e. 4 in this case) and the last is excluded (12 in this case), which is the way things work in Python, but of course not necessarily the way everyone in the world would expect. The main goal is to stay consistent with what Python does.

The second thing to notice is that the slice is performed on the sequence data string, but the new object produced is another Seq object which retains the alphabet information from the original Seq object.

Also like a Python string, you can do slices with a start, stop and stride (the step size, which defaults to one). For example, we can get the first, second and third codon positions of this DNA sequence:

>>> my_seq[0::3]
Seq('GCTGTAGTAAG', IUPACUnambiguousDNA())
>>> my_seq[1::3]
Seq('AGGCATGCATC', IUPACUnambiguousDNA())
>>> my_seq[2::3]
Seq('TAGCTAAGAC', IUPACUnambiguousDNA())

Another stride trick you might have seen with a Python string is the use of a -1 stride to reverse the string. You can do this with a Seq object too:

>>> my_seq[::-1]
Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG', IUPACUnambiguousDNA())

3.4  Turning Seq objects into strings

If you really do just need a plain string, for example to write to a file, or insert into a database, then this is very easy to get:

>>> str(my_seq)
'GATCGATGGGCCTATATAGGATCGAAAATCGC'

Since calling str() on a Seq object returns the full sequence as a string, you often don’t actually have to do this conversion explicitly. Python does this automatically in the print function (and the print statement under Python 2):

>>> print(my_seq)
GATCGATGGGCCTATATAGGATCGAAAATCGC

You can also use the Seq object directly with a %s placeholder when using the Python string formatting or interpolation operator (%):

>>> fasta_format_string = ">Name\n%s\n" % my_seq
>>> print(fasta_format_string)
>Name
GATCGATGGGCCTATATAGGATCGAAAATCGC
<BLANKLINE>

This line of code constructs a simple FASTA format record (without worrying about line wrapping). Section 4.5 describes a neat way to get a FASTA formatted string from a SeqRecord object, while the more general topic of reading and writing FASTA format sequence files is covered in Chapter 5.

NOTE: If you are using Biopython 1.44 or older, using str(my_seq) will give just a truncated representation. Instead use my_seq.tostring() (which is still available in the current Biopython releases for backwards compatibility):

>>> my_seq.tostring()
'GATCGATGGGCCTATATAGGATCGAAAATCGC'

3.5  Concatenating or adding sequences

Naturally, you can in principle add any two Seq objects together - just like you can with Python strings to concatenate them. However, you can’t add sequences with incompatible alphabets, such as a protein sequence and a DNA sequence:

>>> from Bio.Alphabet import IUPAC
>>> from Bio.Seq import Seq
>>> protein_seq = Seq("EVRNAK", IUPAC.protein)
>>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
>>> protein_seq + dna_seq
Traceback (most recent call last):
...
TypeError: Incompatible alphabets IUPACProtein() and IUPACUnambiguousDNA()

If you really wanted to do this, you’d have to first give both sequences generic alphabets:

>>> from Bio.Alphabet import generic_alphabet
>>> protein_seq.alphabet = generic_alphabet
>>> dna_seq.alphabet = generic_alphabet
>>> protein_seq + dna_seq
Seq('EVRNAKACGT', Alphabet())

Here is an example of adding a generic nucleotide sequence to an unambiguous IUPAC DNA sequence, resulting in an ambiguous nucleotide sequence:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import generic_nucleotide
>>> from Bio.Alphabet import IUPAC
>>> nuc_seq = Seq("GATCGATGC", generic_nucleotide)
>>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
>>> nuc_seq
Seq('GATCGATGC', NucleotideAlphabet())
>>> dna_seq
Seq('ACGT', IUPACUnambiguousDNA())
>>> nuc_seq + dna_seq
Seq('GATCGATGCACGT', NucleotideAlphabet())

3.6  Changing case

Python strings have very useful upper and lower methods for changing the case. As of Biopython 1.53, the Seq object gained similar methods which are alphabet aware. For example,

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import generic_dna
>>> dna_seq = Seq("acgtACGT", generic_dna)
>>> dna_seq
Seq('acgtACGT', DNAAlphabet())
>>> dna_seq.upper()
Seq('ACGTACGT', DNAAlphabet())
>>> dna_seq.lower()
Seq('acgtacgt', DNAAlphabet())

These are useful for doing case insensitive matching:

>>> "GTAC" in dna_seq
False
>>> "GTAC" in dna_seq.upper()
True

Note that strictly speaking the IUPAC alphabets are for upper case sequences only, thus:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
>>> dna_seq
Seq('ACGT', IUPACUnambiguousDNA())
>>> dna_seq.lower()
Seq('acgt', DNAAlphabet())

3.7  Nucleotide sequences and (reverse) complements

For nucleotide sequences, you can easily obtain the complement or reverse complement of a Seq object using its built-in methods:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna)
>>> my_seq
Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPACUnambiguousDNA())
>>> my_seq.complement()
Seq('CTAGCTACCCGGATATATCCTAGCTTTTAGCG', IUPACUnambiguousDNA())
>>> my_seq.reverse_complement()
Seq('GCGATTTTCGATCCTATATAGGCCCATCGATC', IUPACUnambiguousDNA())

As mentioned earlier, an easy way to just reverse a Seq object (or a Python string) is slice it with -1 step:

>>> my_seq[::-1]
Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG', IUPACUnambiguousDNA())

In all of these operations, the alphabet property is maintained. This is very useful in case you accidentally end up trying to do something weird like take the (reverse)complement of a protein sequence:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> protein_seq = Seq("EVRNAK", IUPAC.protein)
>>> protein_seq.complement()
Traceback (most recent call last):
...
ValueError: Proteins do not have complements!

The example in Section 5.5.3 combines the Seq object’s reverse complement method with Bio.SeqIO for sequence input/output.

3.8  Transcription

Before talking about transcription, I want to try and clarify the strand issue. Consider the following (made up) stretch of double stranded DNA which encodes a short peptide:

 
 DNA coding strand (aka Crick strand, strand +1) 
5’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG3’
 ||||||||||||||||||||||||||||||||||||||| 
3’TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC5’
 DNA template strand (aka Watson strand, strand −1) 
 
 | 
 Transcription 
  
 
5’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG3’
 Single stranded messenger RNA 
 

The actual biological transcription process works from the template strand, doing a reverse complement (TCAG → CUGA) to give the mRNA. However, in Biopython and bioinformatics in general, we typically work directly with the coding strand because this means we can get the mRNA sequence just by switching T → U.

Now let’s actually get down to doing a transcription in Biopython. First, let’s create Seq objects for the coding and template DNA strands:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna)
>>> coding_dna
Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA())
>>> template_dna = coding_dna.reverse_complement()
>>> template_dna
Seq('CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT', IUPACUnambiguousDNA())

These should match the figure above - remember by convention nucleotide sequences are normally read from the 5’ to 3’ direction, while in the figure the template strand is shown reversed.

Now let’s transcribe the coding strand into the corresponding mRNA, using the Seq object’s built in transcribe method:

>>> coding_dna
Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA())
>>> messenger_rna = coding_dna.transcribe()
>>> messenger_rna
Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA())

As you can see, all this does is switch T → U, and adjust the alphabet.

If you do want to do a true biological transcription starting with the template strand, then this becomes a two-step process:

>>> template_dna.reverse_complement().transcribe()
Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA())

The Seq object also includes a back-transcription method for going from the mRNA to the coding strand of the DNA. Again, this is a simple U → T substitution and associated change of alphabet:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG", IUPAC.unambiguous_rna)
>>> messenger_rna
Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA())
>>> messenger_rna.back_transcribe()
Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA())

Note: The Seq object’s transcribe and back_transcribe methods were added in Biopython 1.49. For older releases you would have to use the Bio.Seq module’s functions instead, see Section 3.14.

3.9  Translation

Sticking with the same example discussed in the transcription section above, now let’s translate this mRNA into the corresponding protein sequence - again taking advantage of one of the Seq object’s biological methods:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG", IUPAC.unambiguous_rna)
>>> messenger_rna
Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA())
>>> messenger_rna.translate()
Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*'))

You can also translate directly from the coding strand DNA sequence:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna)
>>> coding_dna
Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA())
>>> coding_dna.translate()
Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*'))

You should notice in the above protein sequences that in addition to the end stop character, there is an internal stop as well. This was a deliberate choice of example, as it gives an excuse to talk about some optional arguments, including different translation tables (Genetic Codes).

The translation tables available in Biopython are based on those from the NCBI (see the next section of this tutorial). By default, translation will use the standard genetic code (NCBI table id 1). Suppose we are dealing with a mitochondrial sequence. We need to tell the translation function to use the relevant genetic code instead:

>>> coding_dna.translate(table="Vertebrate Mitochondrial")
Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*'))

You can also specify the table using the NCBI table number which is shorter, and often included in the feature annotation of GenBank files:

>>> coding_dna.translate(table=2)
Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*'))

Now, you may want to translate the nucleotides up to the first in frame stop codon, and then stop (as happens in nature):

>>> coding_dna.translate()
Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*'))
>>> coding_dna.translate(to_stop=True)
Seq('MAIVMGR', IUPACProtein())
>>> coding_dna.translate(table=2)
Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*'))
>>> coding_dna.translate(table=2, to_stop=True)
Seq('MAIVMGRWKGAR', IUPACProtein())

Notice that when you use the to_stop argument, the stop codon itself is not translated - and the stop symbol is not included at the end of your protein sequence.

You can even specify the stop symbol if you don’t like the default asterisk:

>>> coding_dna.translate(table=2, stop_symbol="@")
Seq('MAIVMGRWKGAR@', HasStopCodon(IUPACProtein(), '@'))

Now, suppose you have a complete coding sequence CDS, which is to say a nucleotide sequence (e.g. mRNA – after any splicing) which is a whole number of codons (i.e. the length is a multiple of three), commences with a start codon, ends with a stop codon, and has no internal in-frame stop codons. In general, given a complete CDS, the default translate method will do what you want (perhaps with the to_stop option). However, what if your sequence uses a non-standard start codon? This happens a lot in bacteria – for example the gene yaaX in E. coli K12:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import generic_dna
>>> gene = Seq("GTGAAAAAGATGCAATCTATCGTACTCGCACTTTCCCTGGTTCTGGTCGCTCCCATGGCA" + \
...            "GCACAGGCTGCGGAAATTACGTTAGTCCCGTCAGTAAAATTACAGATAGGCGATCGTGAT" + \
...            "AATCGTGGCTATTACTGGGATGGAGGTCACTGGCGCGACCACGGCTGGTGGAAACAACAT" + \
...            "TATGAATGGCGAGGCAATCGCTGGCACCTACACGGACCGCCGCCACCGCCGCGCCACCAT" + \
...            "AAGAAAGCTCCTCATGATCATCACGGCGGTCATGGTCCAGGCAAACATCACCGCTAA",
...            generic_dna)
>>> gene.translate(table="Bacterial")
Seq('VKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HR*',
HasStopCodon(ExtendedIUPACProtein(), '*')
>>> gene.translate(table="Bacterial", to_stop=True)
Seq('VKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR',
ExtendedIUPACProtein())

In the bacterial genetic code GTG is a valid start codon, and while it does normally encode Valine, if used as a start codon it should be translated as methionine. This happens if you tell Biopython your sequence is a complete CDS:

>>> gene.translate(table="Bacterial", cds=True)
Seq('MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR',
ExtendedIUPACProtein())

In addition to telling Biopython to translate an alternative start codon as methionine, using this option also makes sure your sequence really is a valid CDS (you’ll get an exception if not).

The example in Section 18.1.3 combines the Seq object’s translate method with Bio.SeqIO for sequence input/output.

3.10  Translation Tables

In the previous sections we talked about the Seq object translation method (and mentioned the equivalent function in the Bio.Seq module – see Section 3.14). Internally these use codon table objects derived from the NCBI information at ftp://ftp.ncbi.nlm.nih.gov/entrez/misc/data/gc.prt, also shown on http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi in a much more readable layout.

As before, let’s just focus on two choices: the Standard translation table, and the translation table for Vertebrate Mitochondrial DNA.

>>> from Bio.Data import CodonTable
>>> standard_table = CodonTable.unambiguous_dna_by_name["Standard"]
>>> mito_table = CodonTable.unambiguous_dna_by_name["Vertebrate Mitochondrial"]

Alternatively, these tables are labeled with ID numbers 1 and 2, respectively:

>>> from Bio.Data import CodonTable
>>> standard_table = CodonTable.unambiguous_dna_by_id[1]
>>> mito_table = CodonTable.unambiguous_dna_by_id[2]

You can compare the actual tables visually by printing them:

>>> print(standard_table)
Table 1 Standard, SGC0

  |  T      |  C      |  A      |  G      |
--+---------+---------+---------+---------+--
T | TTT F   | TCT S   | TAT Y   | TGT C   | T
T | TTC F   | TCC S   | TAC Y   | TGC C   | C
T | TTA L   | TCA S   | TAA Stop| TGA Stop| A
T | TTG L(s)| TCG S   | TAG Stop| TGG W   | G
--+---------+---------+---------+---------+--
C | CTT L   | CCT P   | CAT H   | CGT R   | T
C | CTC L   | CCC P   | CAC H   | CGC R   | C
C | CTA L   | CCA P   | CAA Q   | CGA R   | A
C | CTG L(s)| CCG P   | CAG Q   | CGG R   | G
--+---------+---------+---------+---------+--
A | ATT I   | ACT T   | AAT N   | AGT S   | T
A | ATC I   | ACC T   | AAC N   | AGC S   | C
A | ATA I   | ACA T   | AAA K   | AGA R   | A
A | ATG M(s)| ACG T   | AAG K   | AGG R   | G
--+---------+---------+---------+---------+--
G | GTT V   | GCT A   | GAT D   | GGT G   | T
G | GTC V   | GCC A   | GAC D   | GGC G   | C
G | GTA V   | GCA A   | GAA E   | GGA G   | A
G | GTG V   | GCG A   | GAG E   | GGG G   | G
--+---------+---------+---------+---------+--

and:

>>> print(mito_table)
Table 2 Vertebrate Mitochondrial, SGC1

  |  T      |  C      |  A      |  G      |
--+---------+---------+---------+---------+--
T | TTT F   | TCT S   | TAT Y   | TGT C   | T
T | TTC F   | TCC S   | TAC Y   | TGC C   | C
T | TTA L   | TCA S   | TAA Stop| TGA W   | A
T | TTG L   | TCG S   | TAG Stop| TGG W   | G
--+---------+---------+---------+---------+--
C | CTT L   | CCT P   | CAT H   | CGT R   | T
C | CTC L   | CCC P   | CAC H   | CGC R   | C
C | CTA L   | CCA P   | CAA Q   | CGA R   | A
C | CTG L   | CCG P   | CAG Q   | CGG R   | G
--+---------+---------+---------+---------+--
A | ATT I(s)| ACT T   | AAT N   | AGT S   | T
A | ATC I(s)| ACC T   | AAC N   | AGC S   | C
A | ATA M(s)| ACA T   | AAA K   | AGA Stop| A
A | ATG M(s)| ACG T   | AAG K   | AGG Stop| G
--+---------+---------+---------+---------+--
G | GTT V   | GCT A   | GAT D   | GGT G   | T
G | GTC V   | GCC A   | GAC D   | GGC G   | C
G | GTA V   | GCA A   | GAA E   | GGA G   | A
G | GTG V(s)| GCG A   | GAG E   | GGG G   | G
--+---------+---------+---------+---------+--

You may find these following properties useful – for example if you are trying to do your own gene finding:

>>> mito_table.stop_codons
['TAA', 'TAG', 'AGA', 'AGG']
>>> mito_table.start_codons
['ATT', 'ATC', 'ATA', 'ATG', 'GTG']
>>> mito_table.forward_table["ACG"]
'T'

3.11  Comparing Seq objects

Sequence comparison is actually a very complicated topic, and there is no easy way to decide if two sequences are equal. The basic problem is the meaning of the letters in a sequence are context dependent - the letter “A” could be part of a DNA, RNA or protein sequence. Biopython uses alphabet objects as part of each Seq object to try and capture this information - so comparing two Seq objects means considering both the sequence strings and the alphabets.

For example, you might argue that the two DNA Seq objects Seq("ACGT", IUPAC.unambiguous_dna) and Seq("ACGT", IUPAC.ambiguous_dna) should be equal, even though they do have different alphabets. Depending on the context this could be important.

This gets worse – suppose you think Seq("ACGT", IUPAC.unambiguous_dna) and Seq("ACGT") (i.e. the default generic alphabet) should be equal. Then, logically, Seq("ACGT", IUPAC.protein) and Seq("ACGT") should also be equal. Now, in logic if A=B and B=C, by transitivity we expect A=C. So for logical consistency we’d require Seq("ACGT", IUPAC.unambiguous_dna) and Seq("ACGT", IUPAC.protein) to be equal – which most people would agree is just not right. This transitivity problem would also have implications for using Seq objects as Python dictionary keys.

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> seq1 = Seq("ACGT", IUPAC.unambiguous_dna)
>>> seq2 = Seq("ACGT", IUPAC.unambiguous_dna)

So, what does Biopython do? Well, the equality test is the default for Python objects – it tests to see if they are the same object in memory. This is a very strict test:

>>> seq1 == seq2
False
>>> seq1 == seq1
True

If you actually want to do this, you can be more explicit by using the Python id function,

>>> id(seq1) == id(seq2)
False
>>> id(seq1) == id(seq1)
True

Now, in every day use, your sequences will probably all have the same alphabet, or at least all be the same type of sequence (all DNA, all RNA, or all protein). What you probably want is to just compare the sequences as strings – so do this explicitly:

>>> str(seq1) == str(seq2)
True
>>> str(seq1) == str(seq1)
True

As an extension to this, while you can use a Python dictionary with Seq objects as keys, it is generally more useful to use the sequence a string for the key. See also Section 3.4.

3.12  MutableSeq objects

Just like the normal Python string, the Seq object is “read only”, or in Python terminology, immutable. Apart from wanting the Seq object to act like a string, this is also a useful default since in many biological applications you want to ensure you are not changing your sequence data:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna)

Observe what happens if you try to edit the sequence:

>>> my_seq[5] = "G"
Traceback (most recent call last):
...
TypeError: 'Seq' object does not support item assignment

However, you can convert it into a mutable sequence (a MutableSeq object) and do pretty much anything you want with it:

>>> mutable_seq = my_seq.tomutable()
>>> mutable_seq
MutableSeq('GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA())

Alternatively, you can create a MutableSeq object directly from a string:

>>> from Bio.Seq import MutableSeq
>>> from Bio.Alphabet import IUPAC
>>> mutable_seq = MutableSeq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna)

Either way will give you a sequence object which can be changed:

>>> mutable_seq
MutableSeq('GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA())
>>> mutable_seq[5] = "C"
>>> mutable_seq
MutableSeq('GCCATCGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA())
>>> mutable_seq.remove("T")
>>> mutable_seq
MutableSeq('GCCACGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA())
>>> mutable_seq.reverse()
>>> mutable_seq
MutableSeq('AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG', IUPACUnambiguousDNA())

Do note that unlike the Seq object, the MutableSeq object’s methods like reverse_complement() and reverse() act in-situ!

An important technical difference between mutable and immutable objects in Python means that you can’t use a MutableSeq object as a dictionary key, but you can use a Python string or a Seq object in this way.

Once you have finished editing your a MutableSeq object, it’s easy to get back to a read-only Seq object should you need to:

>>> new_seq = mutable_seq.toseq()
>>> new_seq
Seq('AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG', IUPACUnambiguousDNA())

You can also get a string from a MutableSeq object just like from a Seq object (Section 3.4).

3.13  UnknownSeq objects

The UnknownSeq object is a subclass of the basic Seq object and its purpose is to represent a sequence where we know the length, but not the actual letters making it up. You could of course use a normal Seq object in this situation, but it wastes rather a lot of memory to hold a string of a million “N” characters when you could just store a single letter “N” and the desired length as an integer.

>>> from Bio.Seq import UnknownSeq
>>> unk = UnknownSeq(20)
>>> unk
UnknownSeq(20, alphabet = Alphabet(), character = '?')
>>> print(unk)
????????????????????
>>> len(unk)
20

You can of course specify an alphabet, meaning for nucleotide sequences the letter defaults to “N” and for proteins “X”, rather than just “?”.

>>> from Bio.Seq import UnknownSeq
>>> from Bio.Alphabet import IUPAC
>>> unk_dna = UnknownSeq(20, alphabet=IUPAC.ambiguous_dna)
>>> unk_dna
UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N')
>>> print(unk_dna)
NNNNNNNNNNNNNNNNNNNN

You can use all the usual Seq object methods too, note these give back memory saving UnknownSeq objects where appropriate as you might expect:

>>> unk_dna
UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N')
>>> unk_dna.complement()
UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N')
>>> unk_dna.reverse_complement()
UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N')
>>> unk_dna.transcribe()
UnknownSeq(20, alphabet = IUPACAmbiguousRNA(), character = 'N')
>>> unk_protein = unk_dna.translate()
>>> unk_protein
UnknownSeq(6, alphabet = ProteinAlphabet(), character = 'X')
>>> print(unk_protein)
XXXXXX
>>> len(unk_protein)
6

You may be able to find a use for the UnknownSeq object in your own code, but it is more likely that you will first come across them in a SeqRecord object created by Bio.SeqIO (see Chapter 5). Some sequence file formats don’t always include the actual sequence, for example GenBank and EMBL files may include a list of features but for the sequence just present the contig information. Alternatively, the QUAL files used in sequencing work hold quality scores but they never contain a sequence – instead there is a partner FASTA file which does have the sequence.

3.14  Working with strings directly

To close this chapter, for those you who really don’t want to use the sequence objects (or who prefer a functional programming style to an object orientated one), there are module level functions in Bio.Seq will accept plain Python strings, Seq objects (including UnknownSeq objects) or MutableSeq objects:

>>> from Bio.Seq import reverse_complement, transcribe, back_transcribe, translate
>>> my_string = "GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG"
>>> reverse_complement(my_string)
'CTAACCAGCAGCACGACCACCCTTCCAACGACCCATAACAGC'
>>> transcribe(my_string)
'GCUGUUAUGGGUCGUUGGAAGGGUGGUCGUGCUGCUGGUUAG'
>>> back_transcribe(my_string)
'GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG'
>>> translate(my_string)
'AVMGRWKGGRAAG*'

You are, however, encouraged to work with Seq objects by default.

Chapter 4  Sequence annotation objects

Chapter 3 introduced the sequence classes. Immediately “above” the Seq class is the Sequence Record or SeqRecord class, defined in the Bio.SeqRecord module. This class allows higher level features such as identifiers and features (as SeqFeature objects) to be associated with the sequence, and is used throughout the sequence input/output interface Bio.SeqIO described fully in Chapter 5.

If you are only going to be working with simple data like FASTA files, you can probably skip this chapter for now. If on the other hand you are going to be using richly annotated sequence data, say from GenBank or EMBL files, this information is quite important.

While this chapter should cover most things to do with the SeqRecord and SeqFeature objects in this chapter, you may also want to read the SeqRecord wiki page (http://biopython.org/wiki/SeqRecord), and the built in documentation (also online – SeqRecord and SeqFeature):

>>> from Bio.SeqRecord import SeqRecord
>>> help(SeqRecord)
...

4.1  The SeqRecord object

The SeqRecord (Sequence Record) class is defined in the Bio.SeqRecord module. This class allows higher level features such as identifiers and features to be associated with a sequence (see Chapter 3), and is the basic data type for the Bio.SeqIO sequence input/output interface (see Chapter 5).

The SeqRecord class itself is quite simple, and offers the following information as attributes:

.seq
– The sequence itself, typically a Seq object.
.id
– The primary ID used to identify the sequence – a string. In most cases this is something like an accession number.
.name
– A “common” name/id for the sequence – a string. In some cases this will be the same as the accession number, but it could also be a clone name. I think of this as being analogous to the LOCUS id in a GenBank record.
.description
– A human readable description or expressive name for the sequence – a string.
.letter_annotations
– Holds per-letter-annotations using a (restricted) dictionary of additional information about the letters in the sequence. The keys are the name of the information, and the information is contained in the value as a Python sequence (i.e. a list, tuple or string) with the same length as the sequence itself. This is often used for quality scores (e.g. Section 18.1.6) or secondary structure information (e.g. from Stockholm/PFAM alignment files).
.annotations
– A dictionary of additional information about the sequence. The keys are the name of the information, and the information is contained in the value. This allows the addition of more “unstructured” information to the sequence.
.features
– A list of SeqFeature objects with more structured information about the features on a sequence (e.g. position of genes on a genome, or domains on a protein sequence). The structure of sequence features is described below in Section 4.3.
.dbxrefs
- A list of database cross-references as strings.

4.2  Creating a SeqRecord

Using a SeqRecord object is not very complicated, since all of the information is presented as attributes of the class. Usually you won’t create a SeqRecord “by hand”, but instead use Bio.SeqIO to read in a sequence file for you (see Chapter 5 and the examples below). However, creating SeqRecord can be quite simple.

4.2.1  SeqRecord objects from scratch

To create a SeqRecord at a minimum you just need a Seq object:

>>> from Bio.Seq import Seq
>>> simple_seq = Seq("GATC")
>>> from Bio.SeqRecord import SeqRecord
>>> simple_seq_r = SeqRecord(simple_seq)

Additionally, you can also pass the id, name and description to the initialization function, but if not they will be set as strings indicating they are unknown, and can be modified subsequently:

>>> simple_seq_r.id
'<unknown id>'
>>> simple_seq_r.id = "AC12345"
>>> simple_seq_r.description = "Made up sequence I wish I could write a paper about"
>>> print(simple_seq_r.description)
Made up sequence I wish I could write a paper about
>>> simple_seq_r.seq
Seq('GATC', Alphabet())

Including an identifier is very important if you want to output your SeqRecord to a file. You would normally include this when creating the object:

>>> from Bio.Seq import Seq
>>> simple_seq = Seq("GATC")
>>> from Bio.SeqRecord import SeqRecord
>>> simple_seq_r = SeqRecord(simple_seq, id="AC12345")

As mentioned above, the SeqRecord has an dictionary attribute annotations. This is used for any miscellaneous annotations that doesn’t fit under one of the other more specific attributes. Adding annotations is easy, and just involves dealing directly with the annotation dictionary:

>>> simple_seq_r.annotations["evidence"] = "None. I just made it up."
>>> print(simple_seq_r.annotations)
{'evidence': 'None. I just made it up.'}
>>> print(simple_seq_r.annotations["evidence"])
None. I just made it up.

Working with per-letter-annotations is similar, letter_annotations is a dictionary like attribute which will let you assign any Python sequence (i.e. a string, list or tuple) which has the same length as the sequence:

>>> simple_seq_r.letter_annotations["phred_quality"] = [40, 40, 38, 30]
>>> print(simple_seq_r.letter_annotations)
{'phred_quality': [40, 40, 38, 30]}
>>> print(simple_seq_r.letter_annotations["phred_quality"])
[40, 40, 38, 30]

The dbxrefs and features attributes are just Python lists, and should be used to store strings and SeqFeature objects (discussed later in this chapter) respectively.

4.2.2  SeqRecord objects from FASTA files

This example uses a fairly large FASTA file containing the whole sequence for Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, originally downloaded from the NCBI. This file is included with the Biopython unit tests under the GenBank folder, or online NC_005816.fna from our website.

The file starts like this - and you can check there is only one record present (i.e. only one line starting with a greater than symbol):

>gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence
TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGGGGGTAATCTGCTCTCC
...

Back in Chapter 2 you will have seen the function Bio.SeqIO.parse(...) used to loop over all the records in a file as SeqRecord objects. The Bio.SeqIO module has a sister function for use on files which contain just one record which we’ll use here (see Chapter 5 for details):

>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.fna", "fasta")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
SingleLetterAlphabet()), id='gi|45478711|ref|NC_005816.1|', name='gi|45478711|ref|NC_005816.1|',
description='gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... sequence',
dbxrefs=[])

Now, let’s have a look at the key attributes of this SeqRecord individually – starting with the seq attribute which gives you a Seq object:

>>> record.seq
Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', SingleLetterAlphabet())

Here Bio.SeqIO has defaulted to a generic alphabet, rather than guessing that this is DNA. If you know in advance what kind of sequence your FASTA file contains, you can tell Bio.SeqIO which alphabet to use (see Chapter 5).

Next, the identifiers and description:

>>> record.id
'gi|45478711|ref|NC_005816.1|'
>>> record.name
'gi|45478711|ref|NC_005816.1|'
>>> record.description
'gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence'

As you can see above, the first word of the FASTA record’s title line (after removing the greater than symbol) is used for both the id and name attributes. The whole title line (after removing the greater than symbol) is used for the record description. This is deliberate, partly for backwards compatibility reasons, but it also makes sense if you have a FASTA file like this:

>Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1
TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGGGGGTAATCTGCTCTCC
...

Note that none of the other annotation attributes get populated when reading a FASTA file:

>>> record.dbxrefs
[]
>>> record.annotations
{}
>>> record.letter_annotations
{}
>>> record.features
[]

In this case our example FASTA file was from the NCBI, and they have a fairly well defined set of conventions for formatting their FASTA lines. This means it would be possible to parse this information and extract the GI number and accession for example. However, FASTA files from other sources vary, so this isn’t possible in general.

4.2.3  SeqRecord objects from GenBank files

As in the previous example, we’re going to look at the whole sequence for Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, originally downloaded from the NCBI, but this time as a GenBank file. Again, this file is included with the Biopython unit tests under the GenBank folder, or online NC_005816.gb from our website.

This file contains a single record (i.e. only one LOCUS line) and starts:

LOCUS       NC_005816               9609 bp    DNA     circular BCT 21-JUL-2008
DEFINITION  Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete
            sequence.
ACCESSION   NC_005816
VERSION     NC_005816.1  GI:45478711
PROJECT     GenomeProject:10638
...

Again, we’ll use Bio.SeqIO to read this file in, and the code is almost identical to that for used above for the FASTA file (see Chapter 5 for details):

>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=['Project:10638'])

You should be able to spot some differences already! But taking the attributes individually, the sequence string is the same as before, but this time Bio.SeqIO has been able to automatically assign a more specific alphabet (see Chapter 5 for details):

>>> record.seq
Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', IUPACAmbiguousDNA())

The name comes from the LOCUS line, while the id includes the version suffix. The description comes from the DEFINITION line:

>>> record.id
'NC_005816.1'
>>> record.name
'NC_005816'
>>> record.description
'Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.'

GenBank files don’t have any per-letter annotations:

>>> record.letter_annotations
{}

Most of the annotations information gets recorded in the annotations dictionary, for example:

>>> len(record.annotations)
11
>>> record.annotations["source"]
'Yersinia pestis biovar Microtus str. 91001'

The dbxrefs list gets populated from any PROJECT or DBLINK lines:

>>> record.dbxrefs
['Project:10638']

Finally, and perhaps most interestingly, all the entries in the features table (e.g. the genes or CDS features) get recorded as SeqFeature objects in the features list.

>>> len(record.features)
29

We’ll talk about SeqFeature objects next, in Section 4.3.

4.3  Feature, location and position objects

4.3.1  SeqFeature objects

Sequence features are an essential part of describing a sequence. Once you get beyond the sequence itself, you need some way to organize and easily get at the more “abstract” information that is known about the sequence. While it is probably impossible to develop a general sequence feature class that will cover everything, the Biopython SeqFeature class attempts to encapsulate as much of the information about the sequence as possible. The design is heavily based on the GenBank/EMBL feature tables, so if you understand how they look, you’ll probably have an easier time grasping the structure of the Biopython classes.

The key idea about each SeqFeature object is to describe a region on a parent sequence, typically a SeqRecord object. That region is described with a location object, typically a range between two positions (see Section 4.3.2 below).

The SeqFeature class has a number of attributes, so first we’ll list them and their general features, and then later in the chapter work through examples to show how this applies to a real life example. The attributes of a SeqFeature are:

.type
– This is a textual description of the type of feature (for instance, this will be something like ‘CDS’ or ‘gene’).
.location
– The location of the SeqFeature on the sequence that you are dealing with, see Section 4.3.2 below. The SeqFeature delegates much of its functionality to the location object, and includes a number of shortcut attributes for properties of the location:
.ref
– shorthand for .location.ref – any (different) reference sequence the location is referring to. Usually just None.
.ref_db
– shorthand for .location.ref_db – specifies the database any identifier in .ref refers to. Usually just None.
.strand
– shorthand for .location.strand – the strand on the sequence that the feature is located on. For double stranded nucleotide sequence this may either be 1 for the top strand, −1 for the bottom strand, 0 if the strand is important but is unknown, or None if it doesn’t matter. This is None for proteins, or single stranded sequences.
.qualifiers
– This is a Python dictionary of additional information about the feature. The key is some kind of terse one-word description of what the information contained in the value is about, and the value is the actual information. For example, a common key for a qualifier might be “evidence” and the value might be “computational (non-experimental).” This is just a way to let the person who is looking at the feature know that it has not be experimentally (i. e. in a wet lab) confirmed. Note that other the value will be a list of strings (even when there is only one string). This is a reflection of the feature tables in GenBank/EMBL files.
.sub_features
– This used to be used to represent features with complicated locations like ‘joins’ in GenBank/EMBL files. This has been deprecated with the introduction of the CompoundLocation object, and should now be ignored.

4.3.2  Positions and locations

The key idea about each SeqFeature object is to describe a region on a parent sequence, for which we use a location object, typically describing a range between two positions. Two try to clarify the terminology we’re using:

position
– This refers to a single position on a sequence, which may be fuzzy or not. For instance, 5, 20, <100 and >200 are all positions.
location
– A location is region of sequence bounded by some positions. For instance 5..20 (i. e. 5 to 20) is a location.

I just mention this because sometimes I get confused between the two.

4.3.2.1  FeatureLocation object

Unless you work with eukaryotic genes, most SeqFeature locations are extremely simple - you just need start and end coordinates and a strand. That’s essentially all the basic FeatureLocation object does.

In practise of course, things can be more complicated. First of all we have to handle compound locations made up of several regions. Secondly, the positions themselves may be fuzzy (inexact).

4.3.2.2  CompoundLocation object

Biopython 1.62 introduced the CompoundLocation as part of a restructuring of how complex locations made up of multiple regions are represented. The main usage is for handling ‘join’ locations in EMBL/GenBank files.

4.3.2.3  Fuzzy Positions

So far we’ve only used simple positions. One complication in dealing with feature locations comes in the positions themselves. In biology many times things aren’t entirely certain (as much as us wet lab biologists try to make them certain!). For instance, you might do a dinucleotide priming experiment and discover that the start of mRNA transcript starts at one of two sites. This is very useful information, but the complication comes in how to represent this as a position. To help us deal with this, we have the concept of fuzzy positions. Basically there are several types of fuzzy positions, so we have five classes do deal with them:

ExactPosition
– As its name suggests, this class represents a position which is specified as exact along the sequence. This is represented as just a number, and you can get the position by looking at the position attribute of the object.
BeforePosition
– This class represents a fuzzy position that occurs prior to some specified site. In GenBank/EMBL notation, this is represented as something like `<13', signifying that the real position is located somewhere less than 13. To get the specified upper boundary, look at the position attribute of the object.
AfterPosition
– Contrary to BeforePosition, this class represents a position that occurs after some specified site. This is represented in GenBank as `>13', and like BeforePosition, you get the boundary number by looking at the position attribute of the object.
WithinPosition
– Occasionally used for GenBank/EMBL locations, this class models a position which occurs somewhere between two specified nucleotides. In GenBank/EMBL notation, this would be represented as ‘(1.5)’, to represent that the position is somewhere within the range 1 to 5. To get the information in this class you have to look at two attributes. The position attribute specifies the lower boundary of the range we are looking at, so in our example case this would be one. The extension attribute specifies the range to the higher boundary, so in this case it would be 4. So object.position is the lower boundary and object.position + object.extension is the upper boundary.
OneOfPosition
– Occasionally used for GenBank/EMBL locations, this class deals with a position where several possible values exist, for instance you could use this if the start codon was unclear and there where two candidates for the start of the gene. Alternatively, that might be handled explicitly as two related gene features.
UnknownPosition
– This class deals with a position of unknown location. This is not used in GenBank/EMBL, but corresponds to the ‘?’ feature coordinate used in UniProt.

Here’s an example where we create a location with fuzzy end points:

>>> from Bio import SeqFeature
>>> start_pos = SeqFeature.AfterPosition(5)
>>> end_pos = SeqFeature.BetweenPosition(9, left=8, right=9)
>>> my_location = SeqFeature.FeatureLocation(start_pos, end_pos)

Note that the details of some of the fuzzy-locations changed in Biopython 1.59, in particular for BetweenPosition and WithinPosition you must now make it explicit which integer position should be used for slicing etc. For a start position this is generally the lower (left) value, while for an end position this would generally be the higher (right) value.

If you print out a FeatureLocation object, you can get a nice representation of the information:

>>> print(my_location)
[>5:(8^9)]

We can access the fuzzy start and end positions using the start and end attributes of the location:

>>> my_location.start
AfterPosition(5)
>>> print(my_location.start)
>5
>>> my_location.end
BetweenPosition(9, left=8, right=9)
>>> print(my_location.end)
(8^9)

If you don’t want to deal with fuzzy positions and just want numbers, they are actually subclasses of integers so should work like integers:

>>> int(my_location.start)
5
>>> int(my_location.end)
9

For compatibility with older versions of Biopython you can ask for the nofuzzy_start and nofuzzy_end attributes of the location which are plain integers:

>>> my_location.nofuzzy_start
5
>>> my_location.nofuzzy_end
9

Notice that this just gives you back the position attributes of the fuzzy locations.

Similarly, to make it easy to create a position without worrying about fuzzy positions, you can just pass in numbers to the FeaturePosition constructors, and you’ll get back out ExactPosition objects:

>>> exact_location = SeqFeature.FeatureLocation(5, 9)
>>> print(exact_location)
[5:9]
>>> exact_location.start
ExactPosition(5)
>>> int(exact_location.start)
5
>>> exact_location.nofuzzy_start
5

That is most of the nitty gritty about dealing with fuzzy positions in Biopython. It has been designed so that dealing with fuzziness is not that much more complicated than dealing with exact positions, and hopefully you find that true!

4.3.2.4  Location testing

You can use the Python keyword in with a SeqFeature or location object to see if the base/residue for a parent coordinate is within the feature/location or not.

For example, suppose you have a SNP of interest and you want to know which features this SNP is within, and lets suppose this SNP is at index 4350 (Python counting!). Here is a simple brute force solution where we just check all the features one by one in a loop:

>>> from Bio import SeqIO
>>> my_snp = 4350
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> for feature in record.features:
...     if my_snp in feature:
...         print("%s %s" % (feature.type, feature.qualifiers.get('db_xref')))
... 
source ['taxon:229193']
gene ['GeneID:2767712']
CDS ['GI:45478716', 'GeneID:2767712']

Note that gene and CDS features from GenBank or EMBL files defined with joins are the union of the exons – they do not cover any introns.

4.3.3  Sequence described by a feature or location

A SeqFeature or location object doesn’t directly contain a sequence, instead the location (see Section 4.3.2) describes how to get this from the parent sequence. For example consider a (short) gene sequence with location 5:18 on the reverse strand, which in GenBank/EMBL notation using 1-based counting would be complement(6..18), like this:

>>> from Bio.Seq import Seq
>>> from Bio.SeqFeature import SeqFeature, FeatureLocation
>>> example_parent = Seq("ACCGAGACGGCAAAGGCTAGCATAGGTATGAGACTTCCTTCCTGCCAGTGCTGAGGAACTGGGAGCCTAC")
>>> example_feature = SeqFeature(FeatureLocation(5, 18), type="gene", strand=-1)

You could take the parent sequence, slice it to extract 5:18, and then take the reverse complement. If you are using Biopython 1.59 or later, the feature location’s start and end are integer like so this works:

>>> feature_seq = example_parent[example_feature.location.start:example_feature.location.end].reverse_complement()
>>> print(feature_seq)
AGCCTTTGCCGTC

This is a simple example so this isn’t too bad – however once you have to deal with compound features (joins) this is rather messy. Instead, the SeqFeature object has an extract method to take care of all this:

>>> feature_seq = example_feature.extract(example_parent)
>>> print(feature_seq)
AGCCTTTGCCGTC

The length of a SeqFeature or location matches that of the region of sequence it describes.

>>> print(example_feature.extract(example_parent))
AGCCTTTGCCGTC
>>> print(len(example_feature.extract(example_parent)))
13
>>> print(len(example_feature))
13
>>> print(len(example_feature.location))
13

For simple FeatureLocation objects the length is just the difference between the start and end positions. However, for a CompoundLocation the length is the sum of the constituent regions.

4.4  References

Another common annotation related to a sequence is a reference to a journal or other published work dealing with the sequence. We have a fairly simple way of representing a Reference in Biopython – we have a Bio.SeqFeature.Reference class that stores the relevant information about a reference as attributes of an object.

The attributes include things that you would expect to see in a reference like journal, title and authors. Additionally, it also can hold the medline_id and pubmed_id and a comment about the reference. These are all accessed simply as attributes of the object.

A reference also has a location object so that it can specify a particular location on the sequence that the reference refers to. For instance, you might have a journal that is dealing with a particular gene located on a BAC, and want to specify that it only refers to this position exactly. The location is a potentially fuzzy location, as described in section 4.3.2.

Any reference objects are stored as a list in the SeqRecord object’s annotations dictionary under the key “references”. That’s all there is too it. References are meant to be easy to deal with, and hopefully general enough to cover lots of usage cases.

4.5  The format method

The format() method of the SeqRecord class gives a string containing your record formatted using one of the output file formats supported by Bio.SeqIO, such as FASTA:

from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import generic_protein

record = SeqRecord(Seq("MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD" \
                      +"GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK" \
                      +"NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM" \
                      +"SSAC", generic_protein),
                   id="gi|14150838|gb|AAK54648.1|AF376133_1",
                   description="chalcone synthase [Cucumis sativus]")
                   
print(record.format("fasta"))

which should give:

>gi|14150838|gb|AAK54648.1|AF376133_1 chalcone synthase [Cucumis sativus]
MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD
GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK
NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM
SSAC

This format method takes a single mandatory argument, a lower case string which is supported by Bio.SeqIO as an output format (see Chapter 5). However, some of the file formats Bio.SeqIO can write to require more than one record (typically the case for multiple sequence alignment formats), and thus won’t work via this format() method. See also Section 5.5.4.

4.6  Slicing a SeqRecord

You can slice a SeqRecord, to give you a new SeqRecord covering just part of the sequence. What is important here is that any per-letter annotations are also sliced, and any features which fall completely within the new sequence are preserved (with their locations adjusted).

For example, taking the same GenBank file used earlier:

>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=['Project:10638'])
>>> len(record)
9609
>>> len(record.features)
41

For this example we’re going to focus in on the pim gene, YP_pPCP05. If you have a look at the GenBank file directly you’ll find this gene/CDS has location string 4343..4780, or in Python counting 4342:4780. From looking at the file you can work out that these are the twelfth and thirteenth entries in the file, so in Python zero-based counting they are entries 11 and 12 in the features list:

>>> print(record.features[20])
type: gene
location: [4342:4780](+)
qualifiers: 
    Key: db_xref, Value: ['GeneID:2767712']
    Key: gene, Value: ['pim']
    Key: locus_tag, Value: ['YP_pPCP05']
<BLANKLINE>
>>> print(record.features[21])
type: CDS
location: [4342:4780](+)
qualifiers: 
    Key: codon_start, Value: ['1']
    Key: db_xref, Value: ['GI:45478716', 'GeneID:2767712']
    Key: gene, Value: ['pim']
    Key: locus_tag, Value: ['YP_pPCP05']
    Key: note, Value: ['similar to many previously sequenced pesticin immunity ...']
    Key: product, Value: ['pesticin immunity protein']
    Key: protein_id, Value: ['NP_995571.1']
    Key: transl_table, Value: ['11']
    Key: translation, Value: ['MGGGMISKLFCLALIFLSSSGLAEKNTYTAKDILQNLELNTFGNSLSH...']

Let’s slice this parent record from 4300 to 4800 (enough to include the pim gene/CDS), and see how many features we get:

>>> sub_record = record[4300:4800]
>>> sub_record
SeqRecord(seq=Seq('ATAAATAGATTATTCCAAATAATTTATTTATGTAAGAACAGGATGGGAGGGGGA...TTA',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=[])
>>> len(sub_record)
500
>>> len(sub_record.features)
2

Our sub-record just has two features, the gene and CDS entries for YP_pPCP05:

>>> print(sub_record.features[0])
type: gene
location: [42:480](+)
qualifiers: 
    Key: db_xref, Value: ['GeneID:2767712']
    Key: gene, Value: ['pim']
    Key: locus_tag, Value: ['YP_pPCP05']
<BLANKLINE>
>>> print(sub_record.features[20])
type: CDS
location: [42:480](+)
qualifiers: 
    Key: codon_start, Value: ['1']
    Key: db_xref, Value: ['GI:45478716', 'GeneID:2767712']
    Key: gene, Value: ['pim']
    Key: locus_tag, Value: ['YP_pPCP05']
    Key: note, Value: ['similar to many previously sequenced pesticin immunity ...']
    Key: product, Value: ['pesticin immunity protein']
    Key: protein_id, Value: ['NP_995571.1']
    Key: transl_table, Value: ['11']
    Key: translation, Value: ['MGGGMISKLFCLALIFLSSSGLAEKNTYTAKDILQNLELNTFGNSLSH...']

Notice that their locations have been adjusted to reflect the new parent sequence!

While Biopython has done something sensible and hopefully intuitive with the features (and any per-letter annotation), for the other annotation it is impossible to know if this still applies to the sub-sequence or not. To avoid guessing, the annotations and dbxrefs are omitted from the sub-record, and it is up to you to transfer any relevant information as appropriate.

>>> sub_record.annotations
{}
>>> sub_record.dbxrefs
[]

The same point could be made about the record id, name and description, but for practicality these are preserved:

>>> sub_record.id
'NC_005816.1'
>>> sub_record.name
'NC_005816'
>>> sub_record.description
'Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.'

This illustrates the problem nicely though, our new sub-record is not the complete sequence of the plasmid, so the description is wrong! Let’s fix this and then view the sub-record as a reduced GenBank file using the format method described above in Section 4.5:

>>> sub_record.description = "Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, partial."
>>> print(sub_record.format("genbank"))
...

See Sections 18.1.7 and 18.1.8 for some FASTQ examples where the per-letter annotations (the read quality scores) are also sliced.

4.7  Adding SeqRecord objects

You can add SeqRecord objects together, giving a new SeqRecord. What is important here is that any common per-letter annotations are also added, all the features are preserved (with their locations adjusted), and any other common annotation is also kept (like the id, name and description).

For an example with per-letter annotation, we’ll use the first record in a FASTQ file. Chapter 5 will explain the SeqIO functions:

>>> from Bio import SeqIO
>>> record = next(SeqIO.parse("example.fastq", "fastq"))
>>> len(record)
25
>>> print(record.seq)
CCCTTCTTGTCTTCAGCGTTTCTCC
>>> print(record.letter_annotations["phred_quality"])
[26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26,
26, 26, 26, 23, 23]

Let’s suppose this was Roche 454 data, and that from other information you think the TTT should be only TT. We can make a new edited record by first slicing the SeqRecord before and after the “extra” third T:

>>> left = record[:20]
>>> print(left.seq)
CCCTTCTTGTCTTCAGCGTT
>>> print(left.letter_annotations["phred_quality"])
[26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26]
>>> right = record[21:]
>>> print(right.seq)
CTCC
>>> print(right.letter_annotations["phred_quality"])
[26, 26, 23, 23]

Now add the two parts together:

>>> edited = left + right
>>> len(edited)
24
>>> print(edited.seq)
CCCTTCTTGTCTTCAGCGTTCTCC
>>> print(edited.letter_annotations["phred_quality"])
[26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26,
26, 26, 23, 23]

Easy and intuitive? We hope so! You can make this shorter with just:

>>> edited = record[:20] + record[21:]

Now, for an example with features, we’ll use a GenBank file. Suppose you have a circular genome:

>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=['Project:10638'])
>>> len(record)
9609
>>> len(record.features)
41
>>> record.dbxrefs
['Project:58037']
>>> record.annotations.keys()
['comment', 'sequence_version', 'source', 'taxonomy', 'keywords', 'references',
'accessions', 'data_file_division', 'date', 'organism', 'gi']

You can shift the origin like this:

>>> shifted = record[2000:] + record[:2000]
>>> shifted
SeqRecord(seq=Seq('GATACGCAGTCATATTTTTTACACAATTCTCTAATCCCGACAAGGTCGTAGGTC...GGA',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=[])
>>> len(shifted)
9609

Note that this isn’t perfect in that some annotation like the database cross references and one of the features (the source feature) have been lost:

>>> len(shifted.features)
40
>>> shifted.dbxrefs
[]
>>> shifted.annotations.keys()
[]

This is because the SeqRecord slicing step is cautious in what annotation it preserves (erroneously propagating annotation can cause major problems). If you want to keep the database cross references or the annotations dictionary, this must be done explicitly:

>>> shifted.dbxrefs = record.dbxrefs[:]
>>> shifted.annotations = record.annotations.copy()
>>> shifted.dbxrefs
['Project:10638']
>>> shifted.annotations.keys()
['comment', 'sequence_version', 'source', 'taxonomy', 'keywords', 'references',
'accessions', 'data_file_division', 'date', 'organism', 'gi']

Also note that in an example like this, you should probably change the record identifiers since the NCBI references refer to the original unmodified sequence.

4.8  Reverse-complementing SeqRecord objects

One of the new features in Biopython 1.57 was the SeqRecord object’s reverse_complement method. This tries to balance easy of use with worries about what to do with the annotation in the reverse complemented record.

For the sequence, this uses the Seq object’s reverse complement method. Any features are transferred with the location and strand recalculated. Likewise any per-letter-annotation is also copied but reversed (which makes sense for typical examples like quality scores). However, transfer of most annotation is problematical.

For instance, if the record ID was an accession, that accession should not really apply to the reverse complemented sequence, and transferring the identifier by default could easily cause subtle data corruption in downstream analysis. Therefore by default, the SeqRecord’s id, name, description, annotations and database cross references are all not transferred by default.

The SeqRecord object’s reverse_complement method takes a number of optional arguments corresponding to properties of the record. Setting these arguments to True means copy the old values, while False means drop the old values and use the default value. You can alternatively provide the new desired value instead.

Consider this example record:

>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> print("%s %i %i %i %i" % (record.id, len(record), len(record.features), len(record.dbxrefs), len(record.annotations)))
NC_005816.1 9609 41 1 11

Here we take the reverse complement and specify a new identifier – but notice how most of the annotation is dropped (but not the features):

>>> rc = record.reverse_complement(id="TESTING")
>>> print("%s %i %i %i %i" % (rc.id, len(rc), len(rc.features), len(rc.dbxrefs), len(rc.annotations)))
TESTING 9609 41 0 0

Chapter 5  Sequence Input/Output

In this chapter we’ll discuss in more detail the Bio.SeqIO module, which was briefly introduced in Chapter 2 and also used in Chapter 4. This aims to provide a simple interface for working with assorted sequence file formats in a uniform way. See also the Bio.SeqIO wiki page (http://biopython.org/wiki/SeqIO), and the built in documentation (also online):

>>> from Bio import SeqIO
>>> help(SeqIO)
...

The “catch” is that you have to work with SeqRecord objects (see Chapter 4), which contain a Seq object (see Chapter 3) plus annotation like an identifier and description.

5.1  Parsing or Reading Sequences

The workhorse function Bio.SeqIO.parse() is used to read in sequence data as SeqRecord objects. This function expects two arguments:

  1. The first argument is a handle to read the data from, or a filename. A handle is typically a file opened for reading, but could be the output from a command line program, or data downloaded from the internet (see Section 5.3). See Section 22.1 for more about handles.
  2. The second argument is a lower case string specifying sequence format – we don’t try and guess the file format for you! See http://biopython.org/wiki/SeqIO for a full listing of supported formats.

There is an optional argument alphabet to specify the alphabet to be used. This is useful for file formats like FASTA where otherwise Bio.SeqIO will default to a generic alphabet.

The Bio.SeqIO.parse() function returns an iterator which gives SeqRecord objects. Iterators are typically used in a for loop as shown below.

Sometimes you’ll find yourself dealing with files which contain only a single record. For this situation use the function Bio.SeqIO.read() which takes the same arguments. Provided there is one and only one record in the file, this is returned as a SeqRecord object. Otherwise an exception is raised.

5.1.1  Reading Sequence Files

In general Bio.SeqIO.parse() is used to read in sequence files as SeqRecord objects, and is typically used with a for loop like this:

from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
    print(seq_record.id)
    print(repr(seq_record.seq))
    print(len(seq_record))

The above example is repeated from the introduction in Section 2.4, and will load the orchid DNA sequences in the FASTA format file ls_orchid.fasta. If instead you wanted to load a GenBank format file like ls_orchid.gbk then all you need to do is change the filename and the format string:

from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
    print(seq_record.id)
    print(seq_record.seq)
    print(len(seq_record))

Similarly, if you wanted to read in a file in another file format, then assuming Bio.SeqIO.parse() supports it you would just need to change the format string as appropriate, for example “swiss” for SwissProt files or “embl” for EMBL text files. There is a full listing on the wiki page (http://biopython.org/wiki/SeqIO) and in the built in documentation (also online).

Another very common way to use a Python iterator is within a list comprehension (or a generator expression). For example, if all you wanted to extract from the file was a list of the record identifiers we can easily do this with the following list comprehension:

>>> from Bio import SeqIO
>>> identifiers = [seq_record.id for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank")]
>>> identifiers
['Z78533.1', 'Z78532.1', 'Z78531.1', 'Z78530.1', 'Z78529.1', 'Z78527.1', ..., 'Z78439.1']

There are more examples using SeqIO.parse() in a list comprehension like this in Section 18.2 (e.g. for plotting sequence lengths or GC%).

5.1.2  Iterating over the records in a sequence file

In the above examples, we have usually used a for loop to iterate over all the records one by one. You can use the for loop with all sorts of Python objects (including lists, tuples and strings) which support the iteration interface.

The object returned by Bio.SeqIO is actually an iterator which returns SeqRecord objects. You get to see each record in turn, but once and only once. The plus point is that an iterator can save you memory when dealing with large files.

Instead of using a for loop, can also use the next() function on an iterator to step through the entries, like this:

from Bio import SeqIO
record_iterator = SeqIO.parse("ls_orchid.fasta", "fasta")

first_record = next(record_iterator)
print(first_record.id)
print(first_record.description)

second_record = next(record_iterator)
print(second_record.id)
print(second_record.description)

Note that if you try to use next() and there are no more results, you’ll get the special StopIteration exception.

One special case to consider is when your sequence files have multiple records, but you only want the first one. In this situation the following code is very concise:

from Bio import SeqIO
first_record = next(SeqIO.parse("ls_orchid.gbk", "genbank"))

A word of warning here – using the next() function like this will silently ignore any additional records in the file. If your files have one and only one record, like some of the online examples later in this chapter, or a GenBank file for a single chromosome, then use the new Bio.SeqIO.read() function instead. This will check there are no extra unexpected records present.

5.1.3  Getting a list of the records in a sequence file

In the previous section we talked about the fact that Bio.SeqIO.parse() gives you a SeqRecord iterator, and that you get the records one by one. Very often you need to be able to access the records in any order. The Python list data type is perfect for this, and we can turn the record iterator into a list of SeqRecord objects using the built-in Python function list() like so:

from Bio import SeqIO
records = list(SeqIO.parse("ls_orchid.gbk", "genbank"))

print("Found %i records" % len(records))

print("The last record")
last_record = records[-1] #using Python's list tricks
print(last_record.id)
print(repr(last_record.seq))
print(len(last_record))

print("The first record")
first_record = records[0] #remember, Python counts from zero
print(first_record.id)
print(repr(first_record.seq))
print(len(first_record))

Giving:

Found 94 records
The last record
Z78439.1
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA())
592
The first record
Z78533.1
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA())
740

You can of course still use a for loop with a list of SeqRecord objects. Using a list is much more flexible than an iterator (for example, you can determine the number of records from the length of the list), but does need more memory because it will hold all the records in memory at once.

5.1.4  Extracting data

The SeqRecord object and its annotation structures are described more fully in Chapter 4. As an example of how annotations are stored, we’ll look at the output from parsing the first record in the GenBank file ls_orchid.gbk.

from Bio import SeqIO
record_iterator = SeqIO.parse("ls_orchid.gbk", "genbank")
first_record = next(record_iterator)
print(first_record)

That should give something like this:

ID: Z78533.1
Name: Z78533
Description: C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA.
Number of features: 5
/sequence_version=1
/source=Cypripedium irapeanum
/taxonomy=['Eukaryota', 'Viridiplantae', 'Streptophyta', ..., 'Cypripedium']
/keywords=['5.8S ribosomal RNA', '5.8S rRNA gene', ..., 'ITS1', 'ITS2']
/references=[...]
/accessions=['Z78533']
/data_file_division=PLN
/date=30-NOV-2006
/organism=Cypripedium irapeanum
/gi=2765658
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA())

This gives a human readable summary of most of the annotation data for the SeqRecord. For this example we’re going to use the .annotations attribute which is just a Python dictionary. The contents of this annotations dictionary were shown when we printed the record above. You can also print them out directly:

print(first_record.annotations)

Like any Python dictionary, you can easily get a list of the keys:

print(first_record.annotations.keys())

or values:

print(first_record.annotations.values())

In general, the annotation values are strings, or lists of strings. One special case is any references in the file get stored as reference objects.

Suppose you wanted to extract a list of the species from the ls_orchid.gbk GenBank file. The information we want, Cypripedium irapeanum, is held in the annotations dictionary under ‘source’ and ‘organism’, which we can access like this:

>>> print(first_record.annotations["source"])
Cypripedium irapeanum

or:

>>> print(first_record.annotations["organism"])
Cypripedium irapeanum

In general, ‘organism’ is used for the scientific name (in Latin, e.g. Arabidopsis thaliana), while ‘source’ will often be the common name (e.g. thale cress). In this example, as is often the case, the two fields are identical.

Now let’s go through all the records, building up a list of the species each orchid sequence is from:

from Bio import SeqIO
all_species = []
for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
    all_species.append(seq_record.annotations["organism"])
print(all_species)

Another way of writing this code is to use a list comprehension:

from Bio import SeqIO
all_species = [seq_record.annotations["organism"] for seq_record in \
               SeqIO.parse("ls_orchid.gbk", "genbank")]
print(all_species)

In either case, the result is:

['Cypripedium irapeanum', 'Cypripedium californicum', ..., 'Paphiopedilum barbatum']

Great. That was pretty easy because GenBank files are annotated in a standardised way.

Now, let’s suppose you wanted to extract a list of the species from a FASTA file, rather than the GenBank file. The bad news is you will have to write some code to extract the data you want from the record’s description line - if the information is in the file in the first place! Our example FASTA format file ls_orchid.fasta starts like this:

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
...

You can check by hand, but for every record the species name is in the description line as the second word. This means if we break up each record’s .description at the spaces, then the species is there as field number one (field zero is the record identifier). That means we can do this:

from Bio import SeqIO
all_species = []
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
    all_species.append(seq_record.description.split()[1])
print(all_species)

This gives:

['C.irapeanum', 'C.californicum', 'C.fasciculatum', 'C.margaritaceum', ..., 'P.barbatum']

The concise alternative using list comprehensions would be:

from Bio import SeqIO
all_species == [seq_record.description.split()[1] for seq_record in \
                SeqIO.parse("ls_orchid.fasta", "fasta")]
print(all_species)

In general, extracting information from the FASTA description line is not very nice. If you can get your sequences in a well annotated file format like GenBank or EMBL, then this sort of annotation information is much easier to deal with.

5.2  Parsing sequences from compressed files

In the previous section, we looked at parsing sequence data from a file. Instead of using a filename, you can give Bio.SeqIO a handle (see Section 22.1), and in this section we’ll use handles to parse sequence from compressed files.

As you’ll have seen above, we can use Bio.SeqIO.read() or Bio.SeqIO.parse() with a filename - for instance this quick example calculates the total length of the sequences in a multiple record GenBank file using a generator expression:

>>> from Bio import SeqIO
>>> print(sum(len(r) for r in SeqIO.parse("ls_orchid.gbk", "gb")))
67518

Here we use a file handle instead, using the with statement to close the handle automatically:

>>> from Bio import SeqIO
>>> with open("ls_orchid.gbk") as handle:
...     print(sum(len(r) for r in SeqIO.parse(handle, "gb")))
67518

Or, the old fashioned way where you manually close the handle:

>>> from Bio import SeqIO
>>> handle = open("ls_orchid.gbk")
>>> print(sum(len(r) for r in SeqIO.parse(handle, "gb")))
67518
>>> handle.close()

Now, suppose we have a gzip compressed file instead? These are very commonly used on Linux. We can use Python’s gzip module to open the compressed file for reading - which gives us a handle object:

>>> import gzip
>>> from Bio import SeqIO
>>> handle = gzip.open("ls_orchid.gbk.gz", "r")
>>> print(sum(len(r) for r in SeqIO.parse(handle, "gb")))
67518
>>> handle.close()

Similarly if we had a bzip2 compressed file (sadly the function name isn’t quite as consistent):

>>> import bz2
>>> from Bio import SeqIO
>>> handle = bz2.BZ2File("ls_orchid.gbk.bz2", "r")
>>> print(sum(len(r) for r in SeqIO.parse(handle, "gb")))
67518
>>> handle.close()

If you are using Python 2.7 or later, the with-version works for gzip and bz2 as well. Unfortunately this is broken on older versions of Python (Issue 3860) and you’d get an AttributeError about __exit__ being missing.

There is a gzip (GNU Zip) variant called BGZF (Blocked GNU Zip Format), which can be treated like an ordinary gzip file for reading, but has advantages for random access later which we’ll talk about later in Section 5.4.4.

5.3  Parsing sequences from the net

In the previous sections, we looked at parsing sequence data from a file (using a filename or handle), and from compressed files (using a handle). Here we’ll use Bio.SeqIO with another type of handle, a network connection, to download and parse sequences from the internet.

Note that just because you can download sequence data and parse it into a SeqRecord object in one go doesn’t mean this is a good idea. In general, you should probably download sequences once and save them to a file for reuse.

5.3.1  Parsing GenBank records from the net

Section 9.6 talks about the Entrez EFetch interface in more detail, but for now let’s just connect to the NCBI and get a few Opuntia (prickly-pear) sequences from GenBank using their GI numbers.

First of all, let’s fetch just one record. If you don’t care about the annotations and features downloading a FASTA file is a good choice as these are compact. Now remember, when you expect the handle to contain one and only one record, use the Bio.SeqIO.read() function:

from Bio import Entrez
from Bio import SeqIO
Entrez.email = "A.N.Other@example.com"
handle = Entrez.efetch(db="nucleotide", rettype="fasta", retmode="text", id="6273291")
seq_record = SeqIO.read(handle, "fasta")
handle.close()
print("%s with %i features" % (seq_record.id, len(seq_record.features)))

Expected output:

gi|6273291|gb|AF191665.1|AF191665 with 0 features

The NCBI will also let you ask for the file in other formats, in particular as a GenBank file. Until Easter 2009, the Entrez EFetch API let you use “genbank” as the return type, however the NCBI now insist on using the official return types of “gb” (or “gp” for proteins) as described on EFetch for Sequence and other Molecular Biology Databases. As a result, in Biopython 1.50 onwards, we support “gb” as an alias for “genbank” in Bio.SeqIO.

from Bio import Entrez
from Bio import SeqIO
Entrez.email = "A.N.Other@example.com"
handle = Entrez.efetch(db="nucleotide", rettype="gb", retmode="text", id="6273291")
seq_record = SeqIO.read(handle, "gb") #using "gb" as an alias for "genbank"
handle.close()
print("%s with %i features" % (seq_record.id, len(seq_record.features)))

The expected output of this example is:

AF191665.1 with 3 features

Notice this time we have three features.

Now let’s fetch several records. This time the handle contains multiple records, so we must use the Bio.SeqIO.parse() function:

from Bio import Entrez
from Bio import SeqIO
Entrez.email = "A.N.Other@example.com"
handle = Entrez.efetch(db="nucleotide", rettype="gb", retmode="text", \
                       id="6273291,6273290,6273289")
for seq_record in SeqIO.parse(handle, "gb"):
    print seq_record.id, seq_record.description[:50] + "..."
    print "Sequence length %i," % len(seq_record),
    print "%i features," % len(seq_record.features),
    print "from: %s" % seq_record.annotations["source"]
handle.close()

That should give the following output:

AF191665.1 Opuntia marenae rpl16 gene; chloroplast gene for c...
Sequence length 902, 3 features, from: chloroplast Opuntia marenae
AF191664.1 Opuntia clavata rpl16 gene; chloroplast gene for c...
Sequence length 899, 3 features, from: chloroplast Grusonia clavata
AF191663.1 Opuntia bradtiana rpl16 gene; chloroplast gene for...
Sequence length 899, 3 features, from: chloroplast Opuntia bradtianaa

See Chapter 9 for more about the Bio.Entrez module, and make sure to read about the NCBI guidelines for using Entrez (Section 9.1).

5.3.2  Parsing SwissProt sequences from the net

Now let’s use a handle to download a SwissProt file from ExPASy, something covered in more depth in Chapter 10. As mentioned above, when you expect the handle to contain one and only one record, use the Bio.SeqIO.read() function:

from Bio import ExPASy
from Bio import SeqIO
handle = ExPASy.get_sprot_raw("O23729")
seq_record = SeqIO.read(handle, "swiss")
handle.close()
print(seq_record.id)
print(seq_record.name)
print(seq_record.description)
print(repr(seq_record.seq))
print("Length %i" % len(seq_record))
print(seq_record.annotations["keywords"])

Assuming your network connection is OK, you should get back:

O23729
CHS3_BROFI
RecName: Full=Chalcone synthase 3; EC=2.3.1.74; AltName: Full=Naringenin-chalcone synthase 3;
Seq('MAPAMEEIRQAQRAEGPAAVLAIGTSTPPNALYQADYPDYYFRITKSEHLTELK...GAE', ProteinAlphabet())
Length 394
['Acyltransferase', 'Flavonoid biosynthesis', 'Transferase']

5.4  Sequence files as Dictionaries

We’re now going to introduce three related functions in the Bio.SeqIO module which allow dictionary like random access to a multi-sequence file. There is a trade off here between flexibility and memory usage. In summary:

  • Bio.SeqIO.to_dict() is the most flexible but also the most memory demanding option (see Section 5.4.1). This is basically a helper function to build a normal Python dictionary with each entry held as a SeqRecord object in memory, allowing you to modify the records.
  • Bio.SeqIO.index() is a useful middle ground, acting like a read only dictionary and parsing sequences into SeqRecord objects on demand (see Section 5.4.2).
  • Bio.SeqIO.index_db() also acts like a read only dictionary but stores the identifiers and file offsets in a file on disk (as an SQLite3 database), meaning it has very low memory requirements (see Section 5.4.3), but will be a little bit slower.

See the discussion for an broad overview (Section 5.4.5).

5.4.1  Sequence files as Dictionaries – In memory

The next thing that we’ll do with our ubiquitous orchid files is to show how to index them and access them like a database using the Python dictionary data type (like a hash in Perl). This is very useful for moderately large files where you only need to access certain elements of the file, and makes for a nice quick ’n dirty database. For dealing with larger files where memory becomes a problem, see Section 5.4.2 below.

You can use the function Bio.SeqIO.to_dict() to make a SeqRecord dictionary (in memory). By default this will use each record’s identifier (i.e. the .id attribute) as the key. Let’s try this using our GenBank file:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.gbk", "genbank"))

There is just one required argument for Bio.SeqIO.to_dict(), a list or generator giving SeqRecord objects. Here we have just used the output from the SeqIO.parse function. As the name suggests, this returns a Python dictionary.

Since this variable orchid_dict is an ordinary Python dictionary, we can look at all of the keys we have available:

>>> len(orchid_dict)
94
>>> orchid_dict.keys()
['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1']

If you really want to, you can even look at all the records at once:

>>> orchid_dict.values() #lots of output!
...

We can access a single SeqRecord object via the keys and manipulate the object as normal:

>>> seq_record = orchid_dict["Z78475.1"]
>>> print(seq_record.description)
P.supardii 5.8S rRNA gene and ITS1 and ITS2 DNA.
>>> print(repr(seq_record.seq))
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACAT...GGT', IUPACAmbiguousDNA())

So, it is very easy to create an in memory “database” of our GenBank records. Next we’ll try this for the FASTA file instead.

Note that those of you with prior Python experience should all be able to construct a dictionary like this “by hand”. However, typical dictionary construction methods will not deal with the case of repeated keys very nicely. Using the Bio.SeqIO.to_dict() will explicitly check for duplicate keys, and raise an exception if any are found.

5.4.1.1  Specifying the dictionary keys

Using the same code as above, but for the FASTA file instead:

from Bio import SeqIO
orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.fasta", "fasta"))
print(orchid_dict.keys())

This time the keys are:

['gi|2765596|emb|Z78471.1|PDZ78471', 'gi|2765646|emb|Z78521.1|CCZ78521', ...
 ..., 'gi|2765613|emb|Z78488.1|PTZ78488', 'gi|2765583|emb|Z78458.1|PHZ78458']

You should recognise these strings from when we parsed the FASTA file earlier in Section 2.4.1. Suppose you would rather have something else as the keys - like the accession numbers. This brings us nicely to SeqIO.to_dict()’s optional argument key_function, which lets you define what to use as the dictionary key for your records.

First you must write your own function to return the key you want (as a string) when given a SeqRecord object. In general, the details of function will depend on the sort of input records you are dealing with. But for our orchids, we can just split up the record’s identifier using the “pipe” character (the vertical line) and return the fourth entry (field three):

def get_accession(record):
    """"Given a SeqRecord, return the accession number as a string.
  
    e.g. "gi|2765613|emb|Z78488.1|PTZ78488" -> "Z78488.1"
    """
    parts = record.id.split("|")
    assert len(parts) == 5 and parts[0] == "gi" and parts[2] == "emb"
    return parts[3]

Then we can give this function to the SeqIO.to_dict() function to use in building the dictionary:

from Bio import SeqIO
orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.fasta", "fasta"), key_function=get_accession)
print(orchid_dict.keys())

Finally, as desired, the new dictionary keys:

>>> print(orchid_dict.keys())
['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1']

Not too complicated, I hope!

5.4.1.2  Indexing a dictionary using the SEGUID checksum

To give another example of working with dictionaries of SeqRecord objects, we’ll use the SEGUID checksum function. This is a relatively recent checksum, and collisions should be very rare (i.e. two different sequences with the same checksum), an improvement on the CRC64 checksum.

Once again, working with the orchids GenBank file:

from Bio import SeqIO
from Bio.SeqUtils.CheckSum import seguid
for record in SeqIO.parse("ls_orchid.gbk", "genbank"):
    print(record.id, seguid(record.seq))

This should give:

Z78533.1 JUEoWn6DPhgZ9nAyowsgtoD9TTo
Z78532.1 MN/s0q9zDoCVEEc+k/IFwCNF2pY
...
Z78439.1 H+JfaShya/4yyAj7IbMqgNkxdxQ

Now, recall the Bio.SeqIO.to_dict() function’s key_function argument expects a function which turns a SeqRecord into a string. We can’t use the seguid() function directly because it expects to be given a Seq object (or a string). However, we can use Python’s lambda feature to create a “one off” function to give to Bio.SeqIO.to_dict() instead:

>>> from Bio import SeqIO
>>> from Bio.SeqUtils.CheckSum import seguid
>>> seguid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.gbk", "genbank"),
...                             lambda rec : seguid(rec.seq))
>>> record = seguid_dict["MN/s0q9zDoCVEEc+k/IFwCNF2pY"]
>>> print(record.id)
Z78532.1
>>> print(record.description)
C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA.

That should have retrieved the record Z78532.1, the second entry in the file.

5.4.2  Sequence files as Dictionaries – Indexed files

As the previous couple of examples tried to illustrate, using Bio.SeqIO.to_dict() is very flexible. However, because it holds everything in memory, the size of file you can work with is limited by your computer’s RAM. In general, this will only work on small to medium files.

For larger files you should consider Bio.SeqIO.index(), which works a little differently. Although it still returns a dictionary like object, this does not keep everything in memory. Instead, it just records where each record is within the file – when you ask for a particular record, it then parses it on demand.

As an example, let’s use the same GenBank file as before:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index("ls_orchid.gbk", "genbank")
>>> len(orchid_dict)
94
>>> orchid_dict.keys()
['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1']
>>> seq_record = orchid_dict["Z78475.1"]
>>> print(seq_record.description)
P.supardii 5.8S rRNA gene and ITS1 and ITS2 DNA.
>>> seq_record.seq
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACAT...GGT', IUPACAmbiguousDNA())

Note that Bio.SeqIO.index() won’t take a handle, but only a filename. There are good reasons for this, but it is a little technical. The second argument is the file format (a lower case string as used in the other Bio.SeqIO functions). You can use many other simple file formats, including FASTA and FASTQ files (see the example in Section 18.1.11). However, alignment formats like PHYLIP or Clustal are not supported. Finally as an optional argument you can supply an alphabet, or a key function.

Here is the same example using the FASTA file - all we change is the filename and the format name:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index("ls_orchid.fasta", "fasta")
>>> len(orchid_dict)
94
>>> orchid_dict.keys()
['gi|2765596|emb|Z78471.1|PDZ78471', 'gi|2765646|emb|Z78521.1|CCZ78521', ...
 ..., 'gi|2765613|emb|Z78488.1|PTZ78488', 'gi|2765583|emb|Z78458.1|PHZ78458']

5.4.2.1  Specifying the dictionary keys

Suppose you want to use the same keys as before? Much like with the Bio.SeqIO.to_dict() example in Section 5.4.1.1, you’ll need to write a tiny function to map from the FASTA identifier (as a string) to the key you want:

def get_acc(identifier):
    """"Given a SeqRecord identifier string, return the accession number as a string.
  
    e.g. "gi|2765613|emb|Z78488.1|PTZ78488" -> "Z78488.1"
    """
    parts = identifier.split("|")
    assert len(parts) == 5 and parts[0] == "gi" and parts[2] == "emb"
    return parts[3]

Then we can give this function to the Bio.SeqIO.index() function to use in building the dictionary:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index("ls_orchid.fasta", "fasta", key_function=get_acc)
>>> print(orchid_dict.keys())
['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1']

Easy when you know how?

5.4.2.2  Getting the raw data for a record

The dictionary-like object from Bio.SeqIO.index() gives you each entry as a SeqRecord object. However, it is sometimes useful to be able to get the original raw data straight from the file. For this use the get_raw() method which takes a single argument (the record identifier) and returns a string (extracted from the file without modification).

A motivating example is extracting a subset of a records from a large file where either Bio.SeqIO.write() does not (yet) support the output file format (e.g. the plain text SwissProt file format) or where you need to preserve the text exactly (e.g. GenBank or EMBL output from Biopython does not yet preserve every last bit of annotation).

Let’s suppose you have download the whole of UniProt in the plain text SwissPort file format from their FTP site (ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.dat.gz) and uncompressed it as the file uniprot_sprot.dat, and you want to extract just a few records from it:

>>> from Bio import SeqIO
>>> uniprot = SeqIO.index("uniprot_sprot.dat", "swiss")
>>> handle = open("selected.dat", "w")
>>> for acc in ["P33487", "P19801", "P13689", "Q8JZQ5", "Q9TRC7"]:
...     handle.write(uniprot.get_raw(acc))
>>> handle.close()

There is a longer example in Section 18.1.5 using the SeqIO.index() function to sort a large sequence file (without loading everything into memory at once).

5.4.3  Sequence files as Dictionaries – Database indexed files

Biopython 1.57 introduced an alternative, Bio.SeqIO.index_db(), which can work on even extremely large files since it stores the record information as a file on disk (using an SQLite3 database) rather than in memory. Also, you can index multiple files together (providing all the record identifiers are unique).

The Bio.SeqIO.index() function takes three required arguments:

  • Index filename, we suggest using something ending .idx. This index file is actually an SQLite3 database.
  • List of sequence filenames to index (or a single filename)
  • File format (lower case string as used in the rest of the SeqIO module).

As an example, consider the GenBank flat file releases from the NCBI FTP site, ftp://ftp.ncbi.nih.gov/genbank/, which are gzip compressed GenBank files. As of GenBank release 182, there are 16 files making up the viral sequences, gbvrl1.seq, …, gbvrl16.seq, containing in total almost one million records. You can index them like this:

>>> from Bio import SeqIO
>>> files = ["gbvrl%i.seq" % (i+1) for i in range(16)]
>>> gb_vrl = SeqIO.index_db("gbvrl.idx", files, "genbank")
>>> print("%i sequences indexed" % len(gb_vrl))
958086 sequences indexed

That takes about two minutes to run on my machine. If you rerun it then the index file (here gbvrl.idx) is reloaded in under a second. You can use the index as a read only Python dictionary - without having to worry about which file the sequence comes from, e.g.

>>> print(gb_vrl["GQ333173.1"].description)
HIV-1 isolate F12279A1 from Uganda gag protein (gag) gene, partial cds.

5.4.3.1  Getting the raw data for a record

Just as with the Bio.SeqIO.index() function discussed above in Section 5.4.2.2, the dictionary like object also lets you get at the raw text of each record:

>>> print(gb_vrl.get_raw("GQ333173.1"))
LOCUS       GQ333173                 459 bp    DNA     linear   VRL 21-OCT-2009
DEFINITION  HIV-1 isolate F12279A1 from Uganda gag protein (gag) gene, partial
            cds.
ACCESSION   GQ333173
...
//

5.4.4  Indexing compressed files

Very often when you are indexing a sequence file it can be quite large – so you may want to compress it on disk. Unfortunately efficient random access is difficult with the more common file formats like gzip and bzip2. In this setting, BGZF (Blocked GNU Zip Format) can be very helpful. This is a variant of gzip (and can be decompressed using standard gzip tools) popularised by the BAM file format, samtools, and tabix.

To create a BGZF compressed file you can use the command line tool bgzip which comes with samtools. In our examples we use a filename extension *.bgz, so they can be distinguished from normal gzipped files (named *.gz). You can also use the Bio.bgzf module to read and write BGZF files from within Python.

The Bio.SeqIO.index() and Bio.SeqIO.index_db() can both be used with BGZF compressed files. For example, if you started with an uncompressed GenBank file:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index("ls_orchid.gbk", "genbank")
>>> len(orchid_dict)
94

You could compress this (while keeping the original file) at the command line using the following command – but don’t worry, the compressed file is already included with the other example files:

$ bgzip -c ls_orchid.gbk > ls_orchid.gbk.bgz

You can use the compressed file in exactly the same way:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index("ls_orchid.gbk.bgz", "genbank")
>>> len(orchid_dict)
94

or:

>>> from Bio import SeqIO
>>> orchid_dict = SeqIO.index_db("ls_orchid.gbk.bgz.idx", "ls_orchid.gbk.bgz", "genbank")
>>> len(orchid_dict)
94

The SeqIO indexing automatically detects the BGZF compression. Note that you can’t use the same index file for the uncompressed and compressed files.

5.4.5  Discussion

So, which of these methods should you use and why? It depends on what you are trying to do (and how much data you are dealing with). However, in general picking Bio.SeqIO.index() is a good starting point. If you are dealing with millions of records, multiple files, or repeated analyses, then look at Bio.SeqIO.index_db().

Reasons to choose Bio.SeqIO.to_dict() over either Bio.SeqIO.index() or Bio.SeqIO.index_db() boil down to a need for flexibility despite its high memory needs. The advantage of storing the SeqRecord objects in memory is they can be changed, added to, or removed at will. In addition to the downside of high memory consumption, indexing can also take longer because all the records must be fully parsed.

Both Bio.SeqIO.index() and Bio.SeqIO.index_db() only parse records on demand. When indexing, they scan the file once looking for the start of each record and do as little work as possible to extract the identifier.

Reasons to choose Bio.SeqIO.index() over Bio.SeqIO.index_db() include:

  • Faster to build the index (more noticeable in simple file formats)
  • Slightly faster access as SeqRecord objects (but the difference is only really noticeable for simple to parse file formats).
  • Can use any immutable Python object as the dictionary keys (e.g. a tuple of strings, or a frozen set) not just strings.
  • Don’t need to worry about the index database being out of date if the sequence file being indexed has changed.

Reasons to choose Bio.SeqIO.index_db() over Bio.SeqIO.index() include:

  • Not memory limited – this is already important with files from second generation sequencing where 10s of millions of sequences are common, and using Bio.SeqIO.index() can require more than 4GB of RAM and therefore a 64bit version of Python.
  • Because the index is kept on disk, it can be reused. Although building the index database file takes longer, if you have a script which will be rerun on the same datafiles in future, this could save time in the long run.
  • Indexing multiple files together
  • The get_raw() method can be much faster, since for most file formats the length of each record is stored as well as its offset.

5.5  Writing Sequence Files

We’ve talked about using Bio.SeqIO.parse() for sequence input (reading files), and now we’ll look at Bio.SeqIO.write() which is for sequence output (writing files). This is a function taking three arguments: some SeqRecord objects, a handle or filename to write to, and a sequence format.

Here is an example, where we start by creating a few SeqRecord objects the hard way (by hand, rather than by loading them from a file):

from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import generic_protein

rec1 = SeqRecord(Seq("MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD" \
                    +"GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK" \
                    +"NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM" \
                    +"SSAC", generic_protein),
                 id="gi|14150838|gb|AAK54648.1|AF376133_1",
                 description="chalcone synthase [Cucumis sativus]")

rec2 = SeqRecord(Seq("YPDYYFRITNREHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDARQ" \
                    +"DMVVVEIPKLGKEAAVKAIKEWGQ", generic_protein),
                 id="gi|13919613|gb|AAK33142.1|",
                 description="chalcone synthase [Fragaria vesca subsp. bracteata]")

rec3 = SeqRecord(Seq("MVTVEEFRRAQCAEGPATVMAIGTATPSNCVDQSTYPDYYFRITNSEHKVELKEKFKRMC" \
                    +"EKSMIKKRYMHLTEEILKENPNICAYMAPSLDARQDIVVVEVPKLGKEAAQKAIKEWGQP" \
                    +"KSKITHLVFCTTSGVDMPGCDYQLTKLLGLRPSVKRFMMYQQGCFAGGTVLRMAKDLAEN" \
                    +"NKGARVLVVCSEITAVTFRGPNDTHLDSLVGQALFGDGAAAVIIGSDPIPEVERPLFELV" \
                    +"SAAQTLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLVEAFQPLGISDWNSLFW" \
                    +"IAHPGGPAILDQVELKLGLKQEKLKATRKVLSNYGNMSSACVLFILDEMRKASAKEGLGT" \
                    +"TGEGLEWGVLFGFGPGLTVETVVLHSVAT", generic_protein),
                 id="gi|13925890|gb|AAK49457.1|",
                 description="chalcone synthase [Nicotiana tabacum]")
               
my_records = [rec1, rec2, rec3]

Now we have a list of SeqRecord objects, we’ll write them to a FASTA format file:

from Bio import SeqIO
SeqIO.write(my_records, "my_example.faa", "fasta")

And if you open this file in your favourite text editor it should look like this:

>gi|14150838|gb|AAK54648.1|AF376133_1 chalcone synthase [Cucumis sativus]
MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD
GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK
NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM
SSAC
>gi|13919613|gb|AAK33142.1| chalcone synthase [Fragaria vesca subsp. bracteata]
YPDYYFRITNREHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDARQ
DMVVVEIPKLGKEAAVKAIKEWGQ
>gi|13925890|gb|AAK49457.1| chalcone synthase [Nicotiana tabacum]
MVTVEEFRRAQCAEGPATVMAIGTATPSNCVDQSTYPDYYFRITNSEHKVELKEKFKRMC
EKSMIKKRYMHLTEEILKENPNICAYMAPSLDARQDIVVVEVPKLGKEAAQKAIKEWGQP
KSKITHLVFCTTSGVDMPGCDYQLTKLLGLRPSVKRFMMYQQGCFAGGTVLRMAKDLAEN
NKGARVLVVCSEITAVTFRGPNDTHLDSLVGQALFGDGAAAVIIGSDPIPEVERPLFELV
SAAQTLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLVEAFQPLGISDWNSLFW
IAHPGGPAILDQVELKLGLKQEKLKATRKVLSNYGNMSSACVLFILDEMRKASAKEGLGT
TGEGLEWGVLFGFGPGLTVETVVLHSVAT

Suppose you wanted to know how many records the Bio.SeqIO.write() function wrote to the handle? If your records were in a list you could just use len(my_records), however you can’t do that when your records come from a generator/iterator. The Bio.SeqIO.write() function returns the number of SeqRecord objects written to the file.

Note - If you tell the Bio.SeqIO.write() function to write to a file that already exists, the old file will be overwritten without any warning.

5.5.1  Round trips

Some people like their parsers to be “round-tripable”, meaning if you read in a file and write it back out again it is unchanged. This requires that the parser must extract enough information to reproduce the original file exactly. Bio.SeqIO does not aim to do this.

As a trivial example, any line wrapping of the sequence data in FASTA files is allowed. An identical SeqRecord would be given from parsing the following two examples which differ only in their line breaks:

>YAL068C-7235.2170 Putative promoter sequence
TACGAGAATAATTTCTCATCATCCAGCTTTAACACAAAATTCGCACAGTTTTCGTTAAGA
GAACTTAACATTTTCTTATGACGTAAATGAAGTTTATATATAAATTTCCTTTTTATTGGA

>YAL068C-7235.2170 Putative promoter sequence
TACGAGAATAATTTCTCATCATCCAGCTTTAACACAAAATTCGCA
CAGTTTTCGTTAAGAGAACTTAACATTTTCTTATGACGTAAATGA
AGTTTATATATAAATTTCCTTTTTATTGGA

To make a round-tripable FASTA parser you would need to keep track of where the sequence line breaks occurred, and this extra information is usually pointless. Instead Biopython uses a default line wrapping of 60 characters on output. The same problem with white space applies in many other file formats too. Another issue in some cases is that Biopython does not (yet) preserve every last bit of annotation (e.g. GenBank and EMBL).

Occasionally preserving the original layout (with any quirks it may have) is important. See Section 5.4.2.2 about the get_raw() method of the Bio.SeqIO.index() dictionary-like object for one potential solution.

5.5.2  Converting between sequence file formats

In previous example we used a list of SeqRecord objects as input to the Bio.SeqIO.write() function, but it will also accept a SeqRecord iterator like we get from Bio.SeqIO.parse() – this lets us do file conversion by combining these two functions.

For this example we’ll read in the GenBank format file ls_orchid.gbk and write it out in FASTA format:

from Bio import SeqIO
records = SeqIO.parse("ls_orchid.gbk", "genbank")
count = SeqIO.write(records, "my_example.fasta", "fasta")
print("Converted %i records" % count)

Still, that is a little bit complicated. So, because file conversion is such a common task, there is a helper function letting you replace that with just:

from Bio import SeqIO
count = SeqIO.convert("ls_orchid.gbk", "genbank", "my_example.fasta", "fasta")
print("Converted %i records" % count)

The Bio.SeqIO.convert() function will take handles or filenames. Watch out though – if the output file already exists, it will overwrite it! To find out more, see the built in help:

>>> from Bio import SeqIO
>>> help(SeqIO.convert)
...

In principle, just by changing the filenames and the format names, this code could be used to convert between any file formats available in Biopython. However, writing some formats requires information (e.g. quality scores) which other files formats don’t contain. For example, while you can turn a FASTQ file into a FASTA file, you can’t do the reverse. See also Sections 18.1.9 and 18.1.10 in the cookbook chapter which looks at inter-converting between different FASTQ formats.

Finally, as an added incentive for using the Bio.SeqIO.convert() function (on top of the fact your code will be shorter), doing it this way may also be faster! The reason for this is the convert function can take advantage of several file format specific optimisations and tricks.

5.5.3  Converting a file of sequences to their reverse complements

Suppose you had a file of nucleotide sequences, and you wanted to turn it into a file containing their reverse complement sequences. This time a little bit of work is required to transform the SeqRecord objects we get from our input file into something suitable for saving to our output file.

To start with, we’ll use Bio.SeqIO.parse() to load some nucleotide sequences from a file, then print out their reverse complements using the Seq object’s built in .reverse_complement() method (see Section 3.7):

>>> from Bio import SeqIO
>>> for record in SeqIO.parse("ls_orchid.gbk", "genbank"):
...     print(record.id)
...     print(record.seq.reverse_complement())

Now, if we want to save these reverse complements to a file, we’ll need to make SeqRecord objects. We can use the SeqRecord object’s built in .reverse_complement() method (see Section 4.8) but we must decide how to name our new records.

This is an excellent place to demonstrate the power of list comprehensions which make a list in memory:

>>> from Bio import SeqIO
>>> records = [rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \
...            for rec in SeqIO.parse("ls_orchid.fasta", "fasta")]
>>> len(records)
94

Now list comprehensions have a nice trick up their sleeves, you can add a conditional statement:

>>> records = [rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \
...            for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700]
>>> len(records)
18

That would create an in memory list of reverse complement records where the sequence length was under 700 base pairs. However, we can do exactly the same with a generator expression - but with the advantage that this does not create a list of all the records in memory at once:

>>> records = (rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \
...           for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700)

As a complete example:

>>> from Bio import SeqIO
>>> records = (rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \
...            for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700)
>>> SeqIO.write(records, "rev_comp.fasta", "fasta")
18

There is a related example in Section 18.1.3, translating each record in a FASTA file from nucleotides to amino acids.

5.5.4  Getting your SeqRecord objects as formatted strings

Suppose that you don’t really want to write your records to a file or handle – instead you want a string containing the records in a particular file format. The Bio.SeqIO interface is based on handles, but Python has a useful built in module which provides a string based handle.

For an example of how you might use this, let’s load in a bunch of SeqRecord objects from our orchids GenBank file, and create a string containing the records in FASTA format:

from Bio import SeqIO
from StringIO import StringIO
records = SeqIO.parse("ls_orchid.gbk", "genbank")
out_handle = StringIO()
SeqIO.write(records, out_handle, "fasta")
fasta_data = out_handle.getvalue()
print(fasta_data)

This isn’t entirely straightforward the first time you see it! On the bright side, for the special case where you would like a string containing a single record in a particular file format, use the the SeqRecord class’ format() method (see Section 4.5).

Note that although we don’t encourage it, you can use the format() method to write to a file, for example something like this:

from Bio import SeqIO
out_handle = open("ls_orchid_long.tab", "w")
for record in SeqIO.parse("ls_orchid.gbk", "genbank"):
    if len(record) > 100:
        out_handle.write(record.format("tab"))
out_handle.close()

While this style of code will work for a simple sequential file format like FASTA or the simple tab separated format used here, it will not work for more complex or interlaced file formats. This is why we still recommend using Bio.SeqIO.write(), as in the following example:

from Bio import SeqIO
records = (rec for rec in SeqIO.parse("ls_orchid.gbk", "genbank") if len(rec) > 100)
SeqIO.write(records, "ls_orchid.tab", "tab")

Making a single call to SeqIO.write(...) is also much quicker than multiple calls to the SeqRecord.format(...) method.

Chapter 6  Multiple Sequence Alignment objects

This chapter is about Multiple Sequence Alignments, by which we mean a collection of multiple sequences which have been aligned together – usually with the insertion of gap characters, and addition of leading or trailing gaps – such that all the sequence strings are the same length. Such an alignment can be regarded as a matrix of letters, where each row is held as a SeqRecord object internally.

We will introduce the MultipleSeqAlignment object which holds this kind of data, and the Bio.AlignIO module for reading and writing them as various file formats (following the design of the Bio.SeqIO module from the previous chapter). Note that both Bio.SeqIO and Bio.AlignIO can read and write sequence alignment files. The appropriate choice will depend largely on what you want to do with the data.

The final part of this chapter is about our command line wrappers for common multiple sequence alignment tools like ClustalW and MUSCLE.

6.1  Parsing or Reading Sequence Alignments

We have two functions for reading in sequence alignments, Bio.AlignIO.read() and Bio.AlignIO.parse() which following the convention introduced in Bio.SeqIO are for files containing one or multiple alignments respectively.

Using Bio.AlignIO.parse() will return an iterator which gives MultipleSeqAlignment objects. Iterators are typically used in a for loop. Examples of situations where you will have multiple different alignments include resampled alignments from the PHYLIP tool seqboot, or multiple pairwise alignments from the EMBOSS tools water or needle, or Bill Pearson’s FASTA tools.

However, in many situations you will be dealing with files which contain only a single alignment. In this case, you should use the Bio.AlignIO.read() function which returns a single MultipleSeqAlignment object.

Both functions expect two mandatory arguments:

  1. The first argument is a handle to read the data from, typically an open file (see Section 22.1), or a filename.
  2. The second argument is a lower case string specifying the alignment format. As in Bio.SeqIO we don’t try and guess the file format for you! See http://biopython.org/wiki/AlignIO for a full listing of supported formats.

There is also an optional seq_count argument which is discussed in Section 6.1.3 below for dealing with ambiguous file formats which may contain more than one alignment.

A further optional alphabet argument allowing you to specify the expected alphabet. This can be useful as many alignment file formats do not explicitly label the sequences as RNA, DNA or protein – which means Bio.AlignIO will default to using a generic alphabet.

6.1.1  Single Alignments

As an example, consider the following annotation rich protein alignment in the PFAM or Stockholm file format:

# STOCKHOLM 1.0
#=GS COATB_BPIKE/30-81  AC P03620.1
#=GS COATB_BPIKE/30-81  DR PDB; 1ifl ; 1-52;
#=GS Q9T0Q8_BPIKE/1-52  AC Q9T0Q8.1
#=GS COATB_BPI22/32-83  AC P15416.1
#=GS COATB_BPM13/24-72  AC P69541.1
#=GS COATB_BPM13/24-72  DR PDB; 2cpb ; 1-49;
#=GS COATB_BPM13/24-72  DR PDB; 2cps ; 1-49;
#=GS COATB_BPZJ2/1-49   AC P03618.1
#=GS Q9T0Q9_BPFD/1-49   AC Q9T0Q9.1
#=GS Q9T0Q9_BPFD/1-49   DR PDB; 1nh4 A; 1-49;
#=GS COATB_BPIF1/22-73  AC P03619.2
#=GS COATB_BPIF1/22-73  DR PDB; 1ifk ; 1-50;
COATB_BPIKE/30-81             AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA
#=GR COATB_BPIKE/30-81  SS    -HHHHHHHHHHHHHH--HHHHHHHH--HHHHHHHHHHHHHHHHHHHHH----
Q9T0Q8_BPIKE/1-52             AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA
COATB_BPI22/32-83             DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA
COATB_BPM13/24-72             AEGDDP...AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA
#=GR COATB_BPM13/24-72  SS    ---S-T...CHCHHHHCCCCTCCCTTCHHHHHHHHHHHHHHHHHHHHCTT--
COATB_BPZJ2/1-49              AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA
Q9T0Q9_BPFD/1-49              AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA
#=GR Q9T0Q9_BPFD/1-49   SS    ------...-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH--
COATB_BPIF1/22-73             FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA
#=GR COATB_BPIF1/22-73  SS    XX-HHHH--HHHHHH--HHHHHHH--HHHHHHHHHHHHHHHHHHHHHHH---
#=GC SS_cons                  XHHHHHHHHHHHHHHHCHHHHHHHHCHHHHHHHHHHHHHHHHHHHHHHHC--
#=GC seq_cons                 AEssss...AptAhDSLpspAT-hIu.sWshVsslVsAsluIKLFKKFsSKA
//

This is the seed alignment for the Phage_Coat_Gp8 (PF05371) PFAM entry, downloaded from a now out of date release of PFAM from http://pfam.sanger.ac.uk/. We can load this file as follows (assuming it has been saved to disk as “PF05371_seed.sth” in the current working directory):

>>> from Bio import AlignIO
>>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm")

This code will print out a summary of the alignment:

>>> print(alignment)
SingleLetterAlphabet() alignment with 7 rows and 52 columns
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRL...SKA COATB_BPIKE/30-81
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKL...SRA Q9T0Q8_BPIKE/1-52
DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRL...SKA COATB_BPI22/32-83
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73

You’ll notice in the above output the sequences have been truncated. We could instead write our own code to format this as we please by iterating over the rows as SeqRecord objects:

>>> from Bio import AlignIO
>>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
>>> print("Alignment length %i" % alignment.get_alignment_length())
Alignment length 52
>>> for record in alignment:
...     print("%s - %s" % (record.seq, record.id))
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA - COATB_BPIKE/30-81
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA - Q9T0Q8_BPIKE/1-52
DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA - COATB_BPI22/32-83
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - COATB_BPM13/24-72
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA - COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - Q9T0Q9_BPFD/1-49
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA - COATB_BPIF1/22-73

You could also use the alignment object’s format method to show it in a particular file format – see Section 6.2.2 for details.

Did you notice in the raw file above that several of the sequences include database cross-references to the PDB and the associated known secondary structure? Try this:

>>> for record in alignment:
...     if record.dbxrefs:
...         print("%s %s" % (record.id, record.dbxrefs))
COATB_BPIKE/30-81 ['PDB; 1ifl ; 1-52;']
COATB_BPM13/24-72 ['PDB; 2cpb ; 1-49;', 'PDB; 2cps ; 1-49;']
Q9T0Q9_BPFD/1-49 ['PDB; 1nh4 A; 1-49;']
COATB_BPIF1/22-73 ['PDB; 1ifk ; 1-50;']

To have a look at all the sequence annotation, try this:

>>> for record in alignment:
...     print(record)

Sanger provide a nice web interface at http://pfam.sanger.ac.uk/family?acc=PF05371 which will actually let you download this alignment in several other formats. This is what the file looks like in the FASTA file format:

>COATB_BPIKE/30-81
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA
>Q9T0Q8_BPIKE/1-52
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA
>COATB_BPI22/32-83
DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA
>COATB_BPM13/24-72
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA
>COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA
>Q9T0Q9_BPFD/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA
>COATB_BPIF1/22-73
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA

Note the website should have an option about showing gaps as periods (dots) or dashes, we’ve shown dashes above. Assuming you download and save this as file “PF05371_seed.faa” then you can load it with almost exactly the same code:

from Bio import AlignIO
alignment = AlignIO.read("PF05371_seed.faa", "fasta")
print(alignment)

All that has changed in this code is the filename and the format string. You’ll get the same output as before, the sequences and record identifiers are the same. However, as you should expect, if you check each SeqRecord there is no annotation nor database cross-references because these are not included in the FASTA file format.

Note that rather than using the Sanger website, you could have used Bio.AlignIO to convert the original Stockholm format file into a FASTA file yourself (see below).

With any supported file format, you can load an alignment in exactly the same way just by changing the format string. For example, use “phylip” for PHYLIP files, “nexus” for NEXUS files or “emboss” for the alignments output by the EMBOSS tools. There is a full listing on the wiki page (http://biopython.org/wiki/AlignIO) and in the built in documentation (also online):

>>> from Bio import AlignIO
>>> help(AlignIO)
...

6.1.2  Multiple Alignments

The previous section focused on reading files containing a single alignment. In general however, files can contain more than one alignment, and to read these files we must use the Bio.AlignIO.parse() function.

Suppose you have a small alignment in PHYLIP format:

    5    6
Alpha     AACAAC
Beta      AACCCC
Gamma     ACCAAC
Delta     CCACCA
Epsilon   CCAAAC

If you wanted to bootstrap a phylogenetic tree using the PHYLIP tools, one of the steps would be to create a set of many resampled alignments using the tool bootseq. This would give output something like this, which has been abbreviated for conciseness:

    5     6
Alpha     AAACCA
Beta      AAACCC
Gamma     ACCCCA
Delta     CCCAAC
Epsilon   CCCAAA
    5     6
Alpha     AAACAA
Beta      AAACCC
Gamma     ACCCAA
Delta     CCCACC
Epsilon   CCCAAA
    5     6
Alpha     AAAAAC
Beta      AAACCC
Gamma     AACAAC
Delta     CCCCCA
Epsilon   CCCAAC
...
    5     6
Alpha     AAAACC
Beta      ACCCCC
Gamma     AAAACC
Delta     CCCCAA
Epsilon   CAAACC

If you wanted to read this in using Bio.AlignIO you could use:

from Bio import AlignIO
alignments = AlignIO.parse("resampled.phy", "phylip")
for alignment in alignments:
    print(alignment)
    print("")

This would give the following output, again abbreviated for display:

SingleLetterAlphabet() alignment with 5 rows and 6 columns
AAACCA Alpha
AAACCC Beta
ACCCCA Gamma
CCCAAC Delta
CCCAAA Epsilon

SingleLetterAlphabet() alignment with 5 rows and 6 columns
AAACAA Alpha
AAACCC Beta
ACCCAA Gamma
CCCACC Delta
CCCAAA Epsilon

SingleLetterAlphabet() alignment with 5 rows and 6 columns
AAAAAC Alpha
AAACCC Beta
AACAAC Gamma
CCCCCA Delta
CCCAAC Epsilon

...

SingleLetterAlphabet() alignment with 5 rows and 6 columns
AAAACC Alpha
ACCCCC Beta
AAAACC Gamma
CCCCAA Delta
CAAACC Epsilon

As with the function Bio.SeqIO.parse(), using Bio.AlignIO.parse() returns an iterator. If you want to keep all the alignments in memory at once, which will allow you to access them in any order, then turn the iterator into a list:

from Bio import AlignIO
alignments = list(AlignIO.parse("resampled.phy", "phylip"))
last_align = alignments[-1]
first_align = alignments[0]

6.1.3  Ambiguous Alignments

Many alignment file formats can explicitly store more than one alignment, and the division between each alignment is clear. However, when a general sequence file format has been used there is no such block structure. The most common such situation is when alignments have been saved in the FASTA file format. For example consider the following:

>Alpha
ACTACGACTAGCTCAG--G
>Beta
ACTACCGCTAGCTCAGAAG
>Gamma
ACTACGGCTAGCACAGAAG
>Alpha
ACTACGACTAGCTCAGG--
>Beta
ACTACCGCTAGCTCAGAAG
>Gamma
ACTACGGCTAGCACAGAAG

This could be a single alignment containing six sequences (with repeated identifiers). Or, judging from the identifiers, this is probably two different alignments each with three sequences, which happen to all have the same length.

What about this next example?

>Alpha
ACTACGACTAGCTCAG--G
>Beta
ACTACCGCTAGCTCAGAAG
>Alpha
ACTACGACTAGCTCAGG--
>Gamma
ACTACGGCTAGCACAGAAG
>Alpha
ACTACGACTAGCTCAGG--
>Delta
ACTACGGCTAGCACAGAAG

Again, this could be a single alignment with six sequences. However this time based on the identifiers we might guess this is three pairwise alignments which by chance have all got the same lengths.

This final example is similar:

>Alpha
ACTACGACTAGCTCAG--G
>XXX
ACTACCGCTAGCTCAGAAG
>Alpha
ACTACGACTAGCTCAGG
>YYY
ACTACGGCAAGCACAGG
>Alpha
--ACTACGAC--TAGCTCAGG
>ZZZ
GGACTACGACAATAGCTCAGG

In this third example, because of the differing lengths, this cannot be treated as a single alignment containing all six records. However, it could be three pairwise alignments.

Clearly trying to store more than one alignment in a FASTA file is not ideal. However, if you are forced to deal with these as input files Bio.AlignIO can cope with the most common situation where all the alignments have the same number of records. One example of this is a collection of pairwise alignments, which can be produced by the EMBOSS tools needle and water – although in this situation, Bio.AlignIO should be able to understand their native output using “emboss” as the format string.

To interpret these FASTA examples as several separate alignments, we can use Bio.AlignIO.parse() with the optional seq_count argument which specifies how many sequences are expected in each alignment (in these examples, 3, 2 and 2 respectively). For example, using the third example as the input data:

for alignment in AlignIO.parse(handle, "fasta", seq_count=2):
    print("Alignment length %i" % alignment.get_alignment_length())
    for record in alignment:
        print("%s - %s" % (record.seq, record.id))
    print("")

giving:

Alignment length 19
ACTACGACTAGCTCAG--G - Alpha
ACTACCGCTAGCTCAGAAG - XXX

Alignment length 17
ACTACGACTAGCTCAGG - Alpha
ACTACGGCAAGCACAGG - YYY

Alignment length 21
--ACTACGAC--TAGCTCAGG - Alpha
GGACTACGACAATAGCTCAGG - ZZZ

Using Bio.AlignIO.read() or Bio.AlignIO.parse() without the seq_count argument would give a single alignment containing all six records for the first two examples. For the third example, an exception would be raised because the lengths differ preventing them being turned into a single alignment.

If the file format itself has a block structure allowing Bio.AlignIO to determine the number of sequences in each alignment directly, then the seq_count argument is not needed. If it is supplied, and doesn’t agree with the file contents, an error is raised.

Note that this optional seq_count argument assumes each alignment in the file has the same number of sequences. Hypothetically you may come across stranger situations, for example a FASTA file containing several alignments each with a different number of sequences – although I would love to hear of a real world example of this. Assuming you cannot get the data in a nicer file format, there is no straight forward way to deal with this using Bio.AlignIO. In this case, you could consider reading in the sequences themselves using Bio.SeqIO and batching them together to create the alignments as appropriate.

6.2  Writing Alignments

We’ve talked about using Bio.AlignIO.read() and Bio.AlignIO.parse() for alignment input (reading files), and now we’ll look at Bio.AlignIO.write() which is for alignment output (writing files). This is a function taking three arguments: some MultipleSeqAlignment objects (or for backwards compatibility the obsolete Alignment objects), a handle or filename to write to, and a sequence format.

Here is an example, where we start by creating a few MultipleSeqAlignment objects the hard way (by hand, rather than by loading them from a file). Note we create some SeqRecord objects to construct the alignment from.

from Bio.Alphabet import generic_dna
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Align import MultipleSeqAlignment

align1 = MultipleSeqAlignment([
             SeqRecord(Seq("ACTGCTAGCTAG", generic_dna), id="Alpha"),
             SeqRecord(Seq("ACT-CTAGCTAG", generic_dna), id="Beta"),
             SeqRecord(Seq("ACTGCTAGDTAG", generic_dna), id="Gamma"),
         ])

align2 = MultipleSeqAlignment([
             SeqRecord(Seq("GTCAGC-AG", generic_dna), id="Delta"),
             SeqRecord(Seq("GACAGCTAG", generic_dna), id="Epsilon"),
             SeqRecord(Seq("GTCAGCTAG", generic_dna), id="Zeta"),
         ])

align3 = MultipleSeqAlignment([
             SeqRecord(Seq("ACTAGTACAGCTG", generic_dna), id="Eta"),
             SeqRecord(Seq("ACTAGTACAGCT-", generic_dna), id="Theta"),
             SeqRecord(Seq("-CTACTACAGGTG", generic_dna), id="Iota"),
         ])

my_alignments = [align1, align2, align3]

Now we have a list of Alignment objects, we’ll write them to a PHYLIP format file:

from Bio import AlignIO
AlignIO.write(my_alignments, "my_example.phy", "phylip")

And if you open this file in your favourite text editor it should look like this:

 3 12
Alpha      ACTGCTAGCT AG
Beta       ACT-CTAGCT AG
Gamma      ACTGCTAGDT AG
 3 9
Delta      GTCAGC-AG
Epislon    GACAGCTAG
Zeta       GTCAGCTAG
 3 13
Eta        ACTAGTACAG CTG
Theta      ACTAGTACAG CT-
Iota       -CTACTACAG GTG

Its more common to want to load an existing alignment, and save that, perhaps after some simple manipulation like removing certain rows or columns.

Suppose you wanted to know how many alignments the Bio.AlignIO.write() function wrote to the handle? If your alignments were in a list like the example above, you could just use len(my_alignments), however you can’t do that when your records come from a generator/iterator. Therefore the Bio.AlignIO.write() function returns the number of alignments written to the file.

Note - If you tell the Bio.AlignIO.write() function to write to a file that already exists, the old file will be overwritten without any warning.

6.2.1  Converting between sequence alignment file formats

Converting between sequence alignment file formats with Bio.AlignIO works in the same way as converting between sequence file formats with Bio.SeqIO (Section 5.5.2). We load generally the alignment(s) using Bio.AlignIO.parse() and then save them using the Bio.AlignIO.write() – or just use the Bio.AlignIO.convert() helper function.

For this example, we’ll load the PFAM/Stockholm format file used earlier and save it as a Clustal W format file:

from Bio import AlignIO
count = AlignIO.convert("PF05371_seed.sth", "stockholm", "PF05371_seed.aln", "clustal")
print("Converted %i alignments" % count)

Or, using Bio.AlignIO.parse() and Bio.AlignIO.write():

from Bio import AlignIO
alignments = AlignIO.parse("PF05371_seed.sth", "stockholm")
count = AlignIO.write(alignments, "PF05371_seed.aln", "clustal")
print("Converted %i alignments" % count)

The Bio.AlignIO.write() function expects to be given multiple alignment objects. In the example above we gave it the alignment iterator returned by Bio.AlignIO.parse().

In this case, we know there is only one alignment in the file so we could have used Bio.AlignIO.read() instead, but notice we have to pass this alignment to Bio.AlignIO.write() as a single element list:

from Bio import AlignIO
alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
AlignIO.write([alignment], "PF05371_seed.aln", "clustal")

Either way, you should end up with the same new Clustal W format file “PF05371_seed.aln” with the following content:

CLUSTAL X (1.81) multiple sequence alignment


COATB_BPIKE/30-81                   AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSS
Q9T0Q8_BPIKE/1-52                   AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVS
COATB_BPI22/32-83                   DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSS
COATB_BPM13/24-72                   AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTS
COATB_BPZJ2/1-49                    AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFAS
Q9T0Q9_BPFD/1-49                    AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTS
COATB_BPIF1/22-73                   FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVS

COATB_BPIKE/30-81                   KA
Q9T0Q8_BPIKE/1-52                   RA
COATB_BPI22/32-83                   KA
COATB_BPM13/24-72                   KA
COATB_BPZJ2/1-49                    KA
Q9T0Q9_BPFD/1-49                    KA
COATB_BPIF1/22-73                   RA

Alternatively, you could make a PHYLIP format file which we’ll name “PF05371_seed.phy”:

from Bio import AlignIO
AlignIO.convert("PF05371_seed.sth", "stockholm", "PF05371_seed.phy", "phylip")

This time the output looks like this:

 7 52
COATB_BPIK AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIRLFKKFSS
Q9T0Q8_BPI AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIKLFKKFVS
COATB_BPI2 DGTSTATSYA TEAMNSLKTQ ATDLIDQTWP VVTSVAVAGL AIRLFKKFSS
COATB_BPM1 AEGDDP---A KAAFNSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS
COATB_BPZJ AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFAS
Q9T0Q9_BPF AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS
COATB_BPIF FAADDATSQA KAAFDSLTAQ ATEMSGYAWA LVVLVVGATV GIKLFKKFVS

           KA
           RA
           KA
           KA
           KA
           KA
           RA

One of the big handicaps of the PHYLIP alignment file format is that the sequence identifiers are strictly truncated at ten characters. In this example, as you can see the resulting names are still unique - but they are not very readable. In this particular case, there is no clear way to compress the identifiers, but for the sake of argument you may want to assign your own names or numbering system. This following bit of code manipulates the record identifiers before saving the output:

from Bio import AlignIO
alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
name_mapping = {}
for i, record in enumerate(alignment):
    name_mapping[i] = record.id
    record.id = "seq%i" % i
print(name_mapping)

AlignIO.write([alignment], "PF05371_seed.phy", "phylip")

This code used a Python dictionary to record a simple mapping from the new sequence system to the original identifier:

{0: 'COATB_BPIKE/30-81', 1: 'Q9T0Q8_BPIKE/1-52', 2: 'COATB_BPI22/32-83', ...}

Here is the new PHYLIP format output:

 7 52
seq0       AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIRLFKKFSS
seq1       AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIKLFKKFVS
seq2       DGTSTATSYA TEAMNSLKTQ ATDLIDQTWP VVTSVAVAGL AIRLFKKFSS
seq3       AEGDDP---A KAAFNSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS
seq4       AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFAS
seq5       AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS
seq6       FAADDATSQA KAAFDSLTAQ ATEMSGYAWA LVVLVVGATV GIKLFKKFVS

           KA
           RA
           KA
           KA
           KA
           KA
           RA

In general, because of the identifier limitation, working with PHYLIP file formats shouldn’t be your first choice. Using the PFAM/Stockholm format on the other hand allows you to record a lot of additional annotation too.

6.2.2  Getting your alignment objects as formatted strings

The Bio.AlignIO interface is based on handles, which means if you want to get your alignment(s) into a string in a particular file format you need to do a little bit more work (see below). However, you will probably prefer to take advantage of the alignment object’s format() method. This takes a single mandatory argument, a lower case string which is supported by Bio.AlignIO as an output format. For example:

from Bio import AlignIO
alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
print(alignment.format("clustal"))

As described in Section 4.5), the SeqRecord object has a similar method using output formats supported by Bio.SeqIO.

Internally the format() method is using the StringIO string based handle and calling Bio.AlignIO.write(). You can do this in your own code if for example you are using an older version of Biopython:

from Bio import AlignIO
from StringIO import StringIO

alignments = AlignIO.parse("PF05371_seed.sth", "stockholm")

out_handle = StringIO()
AlignIO.write(alignments, out_handle, "clustal")
clustal_data = out_handle.getvalue()

print(clustal_data)

6.3  Manipulating Alignments

Now that we’ve covered loading and saving alignments, we’ll look at what else you can do with them.

6.3.1  Slicing alignments

First of all, in some senses the alignment objects act like a Python list of SeqRecord objects (the rows). With this model in mind hopefully the actions of len() (the number of rows) and iteration (each row as a SeqRecord) make sense:

>>> from Bio import AlignIO
>>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
>>> print("Number of rows: %i" % len(alignment))
Number of rows: 7
>>> for record in alignment:
...     print("%s - %s" % (record.seq, record.id))
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA - COATB_BPIKE/30-81
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA - Q9T0Q8_BPIKE/1-52
DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA - COATB_BPI22/32-83
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - COATB_BPM13/24-72
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA - COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - Q9T0Q9_BPFD/1-49
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA - COATB_BPIF1/22-73

You can also use the list-like append and extend methods to add more rows to the alignment (as SeqRecord objects). Keeping the list metaphor in mind, simple slicing of the alignment should also make sense - it selects some of the rows giving back another alignment object:

>>> print(alignment)
SingleLetterAlphabet() alignment with 7 rows and 52 columns
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRL...SKA COATB_BPIKE/30-81
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKL...SRA Q9T0Q8_BPIKE/1-52
DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRL...SKA COATB_BPI22/32-83
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73
>>> print(alignment[3:7])
SingleLetterAlphabet() alignment with 4 rows and 52 columns
AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49
AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49
FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73

What if you wanted to select by column? Those of you who have used the NumPy matrix or array objects won’t be surprised at this - you use a double index.

>>> print(alignment[2, 6])
T

Using two integer indices pulls out a single letter, short hand for this:

>>> print(alignment[2].seq[6])
T

You can pull out a single column as a string like this:

>>> print(alignment[:, 6])
TTT---T

You can also select a range of columns. For example, to pick out those same three rows we extracted earlier, but take just their first six columns:

>>> print(alignment[3:6, :6])
SingleLetterAlphabet() alignment with 3 rows and 6 columns
AEGDDP COATB_BPM13/24-72
AEGDDP COATB_BPZJ2/1-49
AEGDDP Q9T0Q9_BPFD/1-49

Leaving the first index as : means take all the rows:

>>> print(alignment[:, :6])
SingleLetterAlphabet() alignment with 7 rows and 6 columns
AEPNAA COATB_BPIKE/30-81
AEPNAA Q9T0Q8_BPIKE/1-52
DGTSTA COATB_BPI22/32-83
AEGDDP COATB_BPM13/24-72
AEGDDP COATB_BPZJ2/1-49
AEGDDP Q9T0Q9_BPFD/1-49
FAADDA COATB_BPIF1/22-73

This brings us to a neat way to remove a section. Notice columns 7, 8 and 9 which are gaps in three of the seven sequences:

>>> print(alignment[:, 6:9])
SingleLetterAlphabet() alignment with 7 rows and 3 columns
TNY COATB_BPIKE/30-81
TNY Q9T0Q8_BPIKE/1-52
TSY COATB_BPI22/32-83
--- COATB_BPM13/24-72
--- COATB_BPZJ2/1-49
--- Q9T0Q9_BPFD/1-49
TSQ COATB_BPIF1/22-73

Again, you can slice to get everything after the ninth column:

>>> print(alignment[:, 9:])
SingleLetterAlphabet() alignment with 7 rows and 43 columns
ATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81
ATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52
ATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83
AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72
AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49
AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49
AKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73

Now, the interesting thing is that addition of alignment objects works by column. This lets you do this as a way to remove a block of columns:

>>> edited = alignment[:, :6] + alignment[:, 9:]
>>> print(edited)
SingleLetterAlphabet() alignment with 7 rows and 49 columns
AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81
AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52
DGTSTAATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83
AEGDDPAKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72
AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49
AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49
FAADDAAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73

Another common use of alignment addition would be to combine alignments for several different genes into a meta-alignment. Watch out though - the identifiers need to match up (see Section 4.7 for how adding SeqRecord objects works). You may find it helpful to first sort the alignment rows alphabetically by id:

>>> edited.sort()
>>> print(edited)
SingleLetterAlphabet() alignment with 7 rows and 49 columns
DGTSTAATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83
FAADDAAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73
AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81
AEGDDPAKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72
AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49
AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52
AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49

Note that you can only add two alignments together if they have the same number of rows.

6.3.2  Alignments as arrays

Depending on what you are doing, it can be more useful to turn the alignment object into an array of letters – and you can do this with NumPy:

>>> import numpy as np
>>> from Bio import AlignIO
>>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm")
>>> align_array = np.array([list(rec) for rec in alignment], np.character)
>>> align_array.shape
(7, 52)

If you will be working heavily with the columns, you can tell NumPy to store the array by column (as in Fortran) rather then its default of by row (as in C):

>>> align_array = np.array([list(rec) for rec in alignment], np.character, order="F")

Note that this leaves the original Biopython alignment object and the NumPy array in memory as separate objects - editing one will not update the other!

6.4  Alignment Tools

There are lots of algorithms out there for aligning sequences, both pairwise alignments and multiple sequence alignments. These calculations are relatively slow, and you generally wouldn’t want to write such an algorithm in Python. Instead, you can use Biopython to invoke a command line tool on your behalf. Normally you would:

  1. Prepare an input file of your unaligned sequences, typically this will be a FASTA file which you might create using Bio.SeqIO (see Chapter 5).
  2. Call the command line tool to process this input file, typically via one of Biopython’s command line wrappers (which we’ll discuss here).
  3. Read the output from the tool, i.e. your aligned sequences, typically using Bio.AlignIO (see earlier in this chapter).

All the command line wrappers we’re going to talk about in this chapter follow the same style. You create a command line object specifying the options (e.g. the input filename and the output filename), then invoke this command line via a Python operating system call (e.g. using the subprocess module).

Most of these wrappers are defined in the Bio.Align.Applications module:

>>> import Bio.Align.Applications
>>> dir(Bio.Align.Applications)
...
['ClustalwCommandline', 'DialignCommandline', 'MafftCommandline', 'MuscleCommandline',
'PrankCommandline', 'ProbconsCommandline', 'TCoffeeCommandline' ...]

(Ignore the entries starting with an underscore – these have special meaning in Python.) The module Bio.Emboss.Applications has wrappers for some of the EMBOSS suite, including needle and water, which are described below in Section 6.4.5, and wrappers for the EMBOSS packaged versions of the PHYLIP tools (which EMBOSS refer to as one of their EMBASSY packages - third party tools with an EMBOSS style interface). We won’t explore all these alignment tools here in the section, just a sample, but the same principles apply.

6.4.1  ClustalW

ClustalW is a popular command line tool for multiple sequence alignment (there is also a graphical interface called ClustalX). Biopython’s Bio.Align.Applications module has a wrapper for this alignment tool (and several others).

Before trying to use ClustalW from within Python, you should first try running the ClustalW tool yourself by hand at the command line, to familiarise yourself the other options. You’ll find the Biopython wrapper is very faithful to the actual command line API:

>>> from Bio.Align.Applications import ClustalwCommandline
>>> help(ClustalwCommandline)
...

For the most basic usage, all you need is to have a FASTA input file, such as opuntia.fasta (available online or in the Doc/examples subdirectory of the Biopython source code). This is a small FASTA file containing seven prickly-pear DNA sequences (from the cactus family Opuntia).

By default ClustalW will generate an alignment and guide tree file with names based on the input FASTA file, in this case opuntia.aln and opuntia.dnd, but you can override this or make it explicit:

>>> from Bio.Align.Applications import ClustalwCommandline
>>> cline = ClustalwCommandline("clustalw2", infile="opuntia.fasta")
>>> print(cline)
clustalw2 -infile=opuntia.fasta

Notice here we have given the executable name as clustalw2, indicating we have version two installed, which has a different filename to version one (clustalw, the default). Fortunately both versions support the same set of arguments at the command line (and indeed, should be functionally identical).

You may find that even though you have ClustalW installed, the above command doesn’t work – you may get a message about “command not found” (especially on Windows). This indicated that the ClustalW executable is not on your PATH (an environment variable, a list of directories to be searched). You can either update your PATH setting to include the location of your copy of ClustalW tools (how you do this will depend on your OS), or simply type in the full path of the tool. For example:

>>> import os
>>> from Bio.Align.Applications import ClustalwCommandline
>>> clustalw_exe = r"C:\Program Files\new clustal\clustalw2.exe"
>>> clustalw_cline = ClustalwCommandline(clustalw_exe, infile="opuntia.fasta")
>>> assert os.path.isfile(clustalw_exe), "Clustal W executable missing"
>>> stdout, stderr = clustalw_cline()

Remember, in Python strings \n and \t are by default interpreted as a new line and a tab – which is why we’re put a letter “r” at the start for a raw string that isn’t translated in this way. This is generally good practice when specifying a Windows style file name.

Internally this uses the subprocess module which is now the recommended way to run another program in Python. This replaces older options like the os.system() and the os.popen* functions.

Now, at this point it helps to know about how command line tools “work”. When you run a tool at the command line, it will often print text output directly to screen. This text can be captured or redirected, via two “pipes”, called standard output (the normal results) and standard error (for error messages and debug messages). There is also standard input, which is any text fed into the tool. These names get shortened to stdin, stdout and stderr. When the tool finishes, it has a return code (an integer), which by convention is zero for success.

When you run the command line tool like this via the Biopython wrapper, it will wait for it to finish, and check the return code. If this is non zero (indicating an error), an exception is raised. The wrapper then returns two strings, stdout and stderr.

In the case of ClustalW, when run at the command line all the important output is written directly to the output files. Everything normally printed to screen while you wait (via stdout or stderr) is boring and can be ignored (assuming it worked).

What we care about are the two output files, the alignment and the guide tree. We didn’t tell ClustalW what filenames to use, but it defaults to picking names based on the input file. In this case the output should be in the file opuntia.aln. You should be able to work out how to read in the alignment using Bio.AlignIO by now:

>>> from Bio import AlignIO
>>> align = AlignIO.read("opuntia.aln", "clustal")
>>> print(align)
SingleLetterAlphabet() alignment with 7 rows and 906 columns
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191

In case you are interested (and this is an aside from the main thrust of this chapter), the opuntia.dnd file ClustalW creates is just a standard Newick tree file, and Bio.Phylo can parse these:

>>> from Bio import Phylo
>>> tree = Phylo.read("opuntia.dnd", "newick")
>>> Phylo.draw_ascii(tree)
                             _______________ gi|6273291|gb|AF191665.1|AF191665
  __________________________|
 |                          |   ______ gi|6273290|gb|AF191664.1|AF191664
 |                          |__|
 |                             |_____ gi|6273289|gb|AF191663.1|AF191663
 |
_|_________________ gi|6273287|gb|AF191661.1|AF191661
 |
 |__________ gi|6273286|gb|AF191660.1|AF191660
 |
 |    __ gi|6273285|gb|AF191659.1|AF191659
 |___|
     | gi|6273284|gb|AF191658.1|AF191658

Chapter 13 covers Biopython’s support for phylogenetic trees in more depth.

6.4.2  MUSCLE

MUSCLE is a more recent multiple sequence alignment tool than ClustalW, and Biopython also has a wrapper for it under the Bio.Align.Applications module. As before, we recommend you try using MUSCLE from the command line before trying it from within Python, as the Biopython wrapper is very faithful to the actual command line API:

>>> from Bio.Align.Applications import MuscleCommandline
>>> help(MuscleCommandline)
...

For the most basic usage, all you need is to have a FASTA input file, such as opuntia.fasta (available online or in the Doc/examples subdirectory of the Biopython source code). You can then tell MUSCLE to read in this FASTA file, and write the alignment to an output file:

>>> from Bio.Align.Applications import MuscleCommandline
>>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.txt")
>>> print(cline)
muscle -in opuntia.fasta -out opuntia.txt

Note that MUSCLE uses “-in” and “-out” but in Biopython we have to use “input” and “out” as the keyword arguments or property names. This is because “in” is a reserved word in Python.

By default MUSCLE will output the alignment as a FASTA file (using gapped sequences). The Bio.AlignIO module should be able to read this alignment using format="fasta". You can also ask for ClustalW-like output:

>>> from Bio.Align.Applications import MuscleCommandline
>>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.aln", clw=True)
>>> print(cline)
muscle -in opuntia.fasta -out opuntia.aln -clw

Or, strict ClustalW output where the original ClustalW header line is used for maximum compatibility:

>>> from Bio.Align.Applications import MuscleCommandline
>>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.aln", clwstrict=True)
>>> print(cline)
muscle -in opuntia.fasta -out opuntia.aln -clwstrict

The Bio.AlignIO module should be able to read these alignments using format="clustal".

MUSCLE can also output in GCG MSF format (using the msf argument), but Biopython can’t currently parse that, or using HTML which would give a human readable web page (not suitable for parsing).

You can also set the other optional parameters, for example the maximum number of iterations. See the built in help for details.

You would then run MUSCLE command line string as described above for ClustalW, and parse the output using Bio.AlignIO to get an alignment object.

6.4.3  MUSCLE using stdout

Using a MUSCLE command line as in the examples above will write the alignment to a file. This means there will be no important information written to the standard out (stdout) or standard error (stderr) handles. However, by default MUSCLE will write the alignment to standard output (stdout). We can take advantage of this to avoid having a temporary output file! For example:

>>> from Bio.Align.Applications import MuscleCommandline
>>> muscle_cline = MuscleCommandline(input="opuntia.fasta")
>>> print(muscle_cline)
muscle -in opuntia.fasta

If we run this via the wrapper, we get back the output as a string. In order to parse this we can use StringIO to turn it into a handle. Remember that MUSCLE defaults to using FASTA as the output format:

>>> from Bio.Align.Applications import MuscleCommandline
>>> muscle_cline = MuscleCommandline(input="opuntia.fasta")
>>> stdout, stderr = muscle_cline()
>>> from StringIO import StringIO
>>> from Bio import AlignIO
>>> align = AlignIO.read(StringIO(stdout), "fasta")
>>> print(align)
SingleLetterAlphabet() alignment with 7 rows and 906 columns
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191663
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191665
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191664
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191661
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191660
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191659
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191658

The above approach is fairly simple, but if you are dealing with very large output text the fact that all of stdout and stderr is loaded into memory as a string can be a potential drawback. Using the subprocess module we can work directly with handles instead:

>>> import subprocess
>>> from Bio.Align.Applications import MuscleCommandline
>>> muscle_cline = MuscleCommandline(input="opuntia.fasta")
>>> child = subprocess.Popen(str(muscle_cline),
...                          stdout=subprocess.PIPE,
...                          stderr=subprocess.PIPE,
...                          shell=(sys.platform!="win32"))
>>> from Bio import AlignIO
>>> align = AlignIO.read(child.stdout, "fasta")
>>> print(align)
SingleLetterAlphabet() alignment with 7 rows and 906 columns
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191663
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191665
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191664
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191661
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191660
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191659
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191658

6.4.4  MUSCLE using stdin and stdout

We don’t actually need to have our FASTA input sequences prepared in a file, because by default MUSCLE will read in the input sequence from standard input! Note this is a bit more advanced and fiddly, so don’t bother with this technique unless you need to.

First, we’ll need some unaligned sequences in memory as SeqRecord objects. For this demonstration I’m going to use a filtered version of the original FASTA file (using a generator expression), taking just six of the seven sequences:

>>> from Bio import SeqIO
>>> records = (r for r in SeqIO.parse("opuntia.fasta", "fasta") if len(r) < 900)

Then we create the MUSCLE command line, leaving the input and output to their defaults (stdin and stdout). I’m also going to ask for strict ClustalW format as for the output.

>>> from Bio.Align.Applications import MuscleCommandline
>>> muscle_cline = MuscleCommandline(clwstrict=True)
>>> print(muscle_cline)
muscle -clwstrict

Now for the fiddly bits using the subprocess module, stdin and stdout:

>>> import subprocess
>>> import sys
>>> child = subprocess.Popen(str(cline),
...                          stdin=subprocess.PIPE,
...                          stdout=subprocess.PIPE,
...                          stderr=subprocess.PIPE,
...                          shell=(sys.platform!="win32"))                     

That should start MUSCLE, but it will be sitting waiting for its FASTA input sequences, which we must supply via its stdin handle:

>>> SeqIO.write(records, child.stdin, "fasta")
6
>>> child.stdin.close()

After writing the six sequences to the handle, MUSCLE will still be waiting to see if that is all the FASTA sequences or not – so we must signal that this is all the input data by closing the handle. At that point MUSCLE should start to run, and we can ask for the output:

>>> from Bio import AlignIO
>>> align = AlignIO.read(child.stdout, "clustal")
>>> print(align)
SingleLetterAlphabet() alignment with 6 rows and 900 columns
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF19166
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF19166
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF19166
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF19166
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF19165
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF19165

Wow! There we are with a new alignment of just the six records, without having created a temporary FASTA input file, or a temporary alignment output file. However, a word of caution: Dealing with errors with this style of calling external programs is much more complicated. It also becomes far harder to diagnose problems, because you can’t try running MUSCLE manually outside of Biopython (because you don’t have the input file to supply). There can also be subtle cross platform issues (e.g. Windows versus Linux), and how you run your script can have an impact (e.g. at the command line, from IDLE or an IDE, or as a GUI script). These are all generic Python issues though, and not specific to Biopython.

If you find working directly with subprocess like this scary, there is an alternative. If you execute the tool with muscle_cline() you can supply any standard input as a big string, muscle_cline(stdin=...). So, provided your data isn’t very big, you can prepare the FASTA input in memory as a string using StringIO (see Section 22.1):

>>> from Bio import SeqIO
>>> records = (r for r in SeqIO.parse("opuntia.fasta", "fasta") if len(r) < 900)
>>> from StringIO import StringIO
>>> handle = StringIO()
>>> SeqIO.write(records, handle, "fasta")
6
>>> data = handle.getvalue()

You can then run the tool and parse the alignment as follows:

>>> stdout, stderr = muscle_cline(stdin=data)
>>> from Bio import AlignIO
>>> align = AlignIO.read(StringIO(stdout), "clustal")
>>> print(align)
SingleLetterAlphabet() alignment with 6 rows and 900 columns
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF19166
TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF19166
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF19166
TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF19166
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF19165
TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF19165

You might find this easier, but it does require more memory (RAM) for the strings used for the input FASTA and output Clustal formatted data.

6.4.5  EMBOSS needle and water

The EMBOSS suite includes the water and needle tools for Smith-Waterman algorithm local alignment, and Needleman-Wunsch global alignment. The tools share the same style interface, so switching between the two is trivial – we’ll just use needle here.

Suppose you want to do a global pairwise alignment between two sequences, prepared in FASTA format as follows:

>HBA_HUMAN
MVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHG
KKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTP
AVHASLDKFLASVSTVLTSKYR

in a file alpha.fasta, and secondly in a file beta.fasta:

>HBB_HUMAN
MVHLTPEEKSAVTALWGKVNVDEVGGEALGRLLVVYPWTQRFFESFGDLSTPDAVMGNPK
VKAHGKKVLGAFSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHFG
KEFTPPVQAAYQKVVAGVANALAHKYH

Let’s start by creating a complete needle command line object in one go:

>>> from Bio.Emboss.Applications import NeedleCommandline
>>> needle_cline = NeedleCommandline(asequence="alpha.faa", bsequence="beta.faa",
...                                  gapopen=10, gapextend=0.5, outfile="needle.txt")
>>> print(needle_cline)
needle -outfile=needle.txt -asequence=alpha.faa -bsequence=beta.faa -gapopen=10 -gapextend=0.5

Why not try running this by hand at the command prompt? You should see it does a pairwise comparison and records the output in the file needle.txt (in the default EMBOSS alignment file format).

Even if you have EMBOSS installed, running this command may not work – you might get a message about “command not found” (especially on Windows). This probably means that the EMBOSS tools are not on your PATH environment variable. You can either update your PATH setting, or simply tell Biopython the full path to the tool, for example:

>>> from Bio.Emboss.Applications import NeedleCommandline
>>> needle_cline = NeedleCommandline(r"C:\EMBOSS\needle.exe",
...                                  asequence="alpha.faa", bsequence="beta.faa",
...                                  gapopen=10, gapextend=0.5, outfile="needle.txt")

Remember in Python that for a default string \n or \t means a new line or a tab – which is why we’re put a letter “r” at the start for a raw string.

At this point it might help to try running the EMBOSS tools yourself by hand at the command line, to familiarise yourself the other options and compare them to the Biopython help text:

>>> from Bio.Emboss.Applications import NeedleCommandline
>>> help(NeedleCommandline)
...

Note that you can also specify (or change or look at) the settings like this:

>>> from Bio.Emboss.Applications import NeedleCommandline
>>> needle_cline = NeedleCommandline()
>>> needle_cline.asequence="alpha.faa"
>>> needle_cline.bsequence="beta.faa"
>>> needle_cline.gapopen=10
>>> needle_cline.gapextend=0.5
>>> needle_cline.outfile="needle.txt"
>>> print(needle_cline)
needle -outfile=needle.txt -asequence=alpha.faa -bsequence=beta.faa -gapopen=10 -gapextend=0.5
>>> print(needle_cline.outfile)
needle.txt

Next we want to use Python to run this command for us. As explained above, for full control, we recommend you use the built in Python subprocess module, but for simple usage the wrapper object usually suffices:

>>> stdout, stderr = needle_cline()
>>> print(stdout + stderr)
Needleman-Wunsch global alignment of two sequences

Next we can load the output file with Bio.AlignIO as discussed earlier in this chapter, as the emboss format:

>>> from Bio import AlignIO
>>> align = AlignIO.read("needle.txt", "emboss")
>>> print(align)
SingleLetterAlphabet() alignment with 2 rows and 149 columns
MV-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTY...KYR HBA_HUMAN
MVHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRF...KYH HBB_HUMAN

In this example, we told EMBOSS to write the output to a file, but you can tell it to write the output to stdout instead (useful if you don’t want a temporary output file to get rid of – use stdout=True rather than the outfile argument), and also to read one of the one of the inputs from stdin (e.g. asequence="stdin", much like in the MUSCLE example in the section above).

This has only scratched the surface of what you can do with needle and water. One useful trick is that the second file can contain multiple sequences (say five), and then EMBOSS will do five pairwise alignments.

Note - Biopython includes its own pairwise alignment code in the Bio.pairwise2 module (written in C for speed, but with a pure Python fallback available too). This doesn’t work with alignment objects, so we have not covered it within this chapter. See the module’s docstring (built in help) for details.

Chapter 7  BLAST

Hey, everybody loves BLAST right? I mean, geez, how can get it get any easier to do comparisons between one of your sequences and every other sequence in the known world? But, of course, this section isn’t about how cool BLAST is, since we already know that. It is about the problem with BLAST – it can be really difficult to deal with the volume of data generated by large runs, and to automate BLAST runs in general.

Fortunately, the Biopython folks know this only too well, so they’ve developed lots of tools for dealing with BLAST and making things much easier. This section details how to use these tools and do useful things with them.

Dealing with BLAST can be split up into two steps, both of which can be done from within Biopython. Firstly, running BLAST for your query sequence(s), and getting some output. Secondly, parsing the BLAST output in Python for further analysis.

Your first introduction to running BLAST was probably via the NCBI web-service. In fact, there are lots of ways you can run BLAST, which can be categorised several ways. The most important distinction is running BLAST locally (on your own machine), and running BLAST remotely (on another machine, typically the NCBI servers). We’re going to start this chapter by invoking the NCBI online BLAST service from within a Python script.

NOTE: The following Chapter 8 describes Bio.SearchIO, an experimental module in Biopython. We intend this to ultimately replace the older Bio.Blast module, as it provides a more general framework handling other related sequence searching tools as well. However, until that is declared stable, for production code please continue to use the Bio.Blast module for dealing with NCBI BLAST.

7.1  Running BLAST over the Internet

We use the function qblast() in the Bio.Blast.NCBIWWW module call the online version of BLAST. This has three non-optional arguments:

  • The first argument is the blast program to use for the search, as a lower case string. The options and descriptions of the programs are available at http://www.ncbi.nlm.nih.gov/BLAST/blast_program.shtml. Currently qblast only works with blastn, blastp, blastx, tblast and tblastx.
  • The second argument specifies the databases to search against. Again, the options for this are available on the NCBI web pages at http://www.ncbi.nlm.nih.gov/BLAST/blast_databases.shtml.
  • The third argument is a string containing your query sequence. This can either be the sequence itself, the sequence in fasta format, or an identifier like a GI number.

The qblast function also take a number of other option arguments which are basically analogous to the different parameters you can set on the BLAST web page. We’ll just highlight a few of them here:

  • The qblast function can return the BLAST results in various formats, which you can choose with the optional format_type keyword: "HTML", "Text", "ASN.1", or "XML". The default is "XML", as that is the format expected by the parser, described in section 7.3 below.
  • The argument expect sets the expectation or e-value threshold.

For more about the optional BLAST arguments, we refer you to the NCBI’s own documentation, or that built into Biopython:

>>> from Bio.Blast import NCBIWWW
>>> help(NCBIWWW.qblast)
...

Note that the default settings on the NCBI BLAST website are not quite the same as the defaults on QBLAST. If you get different results, you’ll need to check the parameters (e.g. the expectation value threshold and the gap values).

For example, if you have a nucleotide sequence you want to search against the nucleotide database (nt) using BLASTN, and you know the GI number of your query sequence, you can use:

>>> from Bio.Blast import NCBIWWW
>>> result_handle = NCBIWWW.qblast("blastn", "nt", "8332116")

Alternatively, if we have our query sequence already in a FASTA formatted file, we just need to open the file and read in this record as a string, and use that as the query argument:

>>> from Bio.Blast import NCBIWWW
>>> fasta_string = open("m_cold.fasta").read()
>>> result_handle = NCBIWWW.qblast("blastn", "nt", fasta_string)

We could also have read in the FASTA file as a SeqRecord and then supplied just the sequence itself:

>>> from Bio.Blast import NCBIWWW
>>> from Bio import SeqIO
>>> record = SeqIO.read("m_cold.fasta", format="fasta")
>>> result_handle = NCBIWWW.qblast("blastn", "nt", record.seq)

Supplying just the sequence means that BLAST will assign an identifier for your sequence automatically. You might prefer to use the SeqRecord object’s format method to make a fasta string (which will include the existing identifier):

>>> from Bio.Blast import NCBIWWW
>>> from Bio import SeqIO
>>> record = SeqIO.read("m_cold.fasta", format="fasta")
>>> result_handle = NCBIWWW.qblast("blastn", "nt", record.format("fasta"))

This approach makes more sense if you have your sequence(s) in a non-FASTA file format which you can extract using Bio.SeqIO (see Chapter 5).

Whatever arguments you give the qblast() function, you should get back your results in a handle object (by default in XML format). The next step would be to parse the XML output into Python objects representing the search results (Section 7.3), but you might want to save a local copy of the output file first. I find this especially useful when debugging my code that extracts info from the BLAST results (because re-running the online search is slow and wastes the NCBI computer time).

We need to be a bit careful since we can use result_handle.read() to read the BLAST output only once – calling result_handle.read() again returns an empty string.

>>> save_file = open("my_blast.xml", "w")
>>> save_file.write(result_handle.read())
>>> save_file.close()
>>> result_handle.close()

After doing this, the results are in the file my_blast.xml and the original handle has had all its data extracted (so we closed it). However, the parse function of the BLAST parser (described in 7.3) takes a file-handle-like object, so we can just open the saved file for input:

>>> result_handle = open("my_blast.xml")

Now that we’ve got the BLAST results back into a handle again, we are ready to do something with them, so this leads us right into the parsing section (see Section 7.3 below). You may want to jump ahead to that now ….

7.2  Running BLAST locally

7.2.1  Introduction

Running BLAST locally (as opposed to over the internet, see Section 7.1) has at least major two advantages:

  • Local BLAST may be faster than BLAST over the internet;
  • Local BLAST allows you to make your own database to search for sequences against.

Dealing with proprietary or unpublished sequence data can be another reason to run BLAST locally. You may not be allowed to redistribute the sequences, so submitting them to the NCBI as a BLAST query would not be an option.

Unfortunately, there are some major drawbacks too – installing all the bits and getting it setup right takes some effort:

  • Local BLAST requires command line tools to be installed.
  • Local BLAST requires (large) BLAST databases to be setup (and potentially kept up to date).

To further confuse matters there are several different BLAST packages available, and there are also other tools which can produce imitation BLAST output files, such as BLAT.

7.2.2  Standalone NCBI BLAST+

The “new” NCBI BLAST+ suite was released in 2009. This replaces the old NCBI “legacy” BLAST package (see below).

This section will show briefly how to use these tools from within Python. If you have already read or tried the alignment tool examples in Section 6.4 this should all seem quite straightforward. First, we construct a command line string (as you would type in at the command line prompt if running standalone BLAST by hand). Then we can execute this command from within Python.

For example, taking a FASTA file of gene nucleotide sequences, you might want to run a BLASTX (translation) search against the non-redundant (NR) protein database. Assuming you (or your systems administrator) has downloaded and installed the NR database, you might run:

blastx -query opuntia.fasta -db nr -out opuntia.xml -evalue 0.001 -outfmt 5

This should run BLASTX against the NR database, using an expectation cut-off value of 0.001 and produce XML output to the specified file (which we can then parse). On my computer this takes about six minutes - a good reason to save the output to a file so you and repeat any analysis as needed.

From within Biopython we can use the NCBI BLASTX wrapper from the Bio.Blast.Applications module to build the command line string, and run it:

>>> from Bio.Blast.Applications import NcbiblastxCommandline
>>> help(NcbiblastxCommandline)
...
>>> blastx_cline = NcbiblastxCommandline(query="opuntia.fasta", db="nr", evalue=0.001,
...                                      outfmt=5, out="opuntia.xml")
>>> blastx_cline
NcbiblastxCommandline(cmd='blastx', out='opuntia.xml', outfmt=5, query='opuntia.fasta',
db='nr', evalue=0.001)
>>> print(blastx_cline)
blastx -out opuntia.xml -outfmt 5 -query opuntia.fasta -db nr -evalue 0.001
>>> stdout, stderr = blastx_cline()

In this example there shouldn’t be any output from BLASTX to the terminal, so stdout and stderr should be empty. You may want to check the output file opuntia.xml has been created.

As you may recall from earlier examples in the tutorial, the opuntia.fasta contains seven sequences, so the BLAST XML output should contain multiple results. Therefore use Bio.Blast.NCBIXML.parse() to parse it as described below in Section 7.3.

7.2.3  Other versions of BLAST

NCBI BLAST+ (written in C++) was first released in 2009 as a replacement for the original NCBI “legacy” BLAST (written in C) which is no longer being updated. There were a lot of changes – the old version had a single core command line tool blastall which covered multiple different BLAST search types (which are now separate commands in BLAST+), and all the command line options were renamed. Biopython’s wrappers for the NCBI “legacy” BLAST tools have been deprecated and will be removed in a future release. To try to avoid confusion, we do not cover calling these old tools from Biopython in this tutorial.

You may also come across Washington University BLAST (WU-BLAST), and its successor, Advanced Biocomputing BLAST (AB-BLAST, released in 2009, not free/open source). These packages include the command line tools wu-blastall and ab-blastall, which mimicked blastall from the NCBI “legacy” BLAST stuie. Biopython does not currently provide wrappers for calling these tools, but should be able to parse any NCBI compatible output from them.

7.3  Parsing BLAST output

As mentioned above, BLAST can generate output in various formats, such as XML, HTML, and plain text. Originally, Biopython had parsers for BLAST plain text and HTML output, as these were the only output formats offered at the time. Unfortunately, the BLAST output in these formats kept changing, each time breaking the Biopython parsers. Our HTML BLAST parser has been removed, but the plain text BLAST parser is still available (see Section 7.5). Use it at your own risk, it may or may not work, depending on which BLAST version you’re using.

As keeping up with changes in BLAST became a hopeless endeavor, especially with users running different BLAST versions, we now recommend to parse the output in XML format, which can be generated by recent versions of BLAST. Not only is the XML output more stable than the plain text and HTML output, it is also much easier to parse automatically, making Biopython a whole lot more stable.

You can get BLAST output in XML format in various ways. For the parser, it doesn’t matter how the output was generated, as long as it is in the XML format.

  • You can use Biopython to run BLAST over the internet, as described in section 7.1.
  • You can use Biopython to run BLAST locally, as described in section 7.2.
  • You can do the BLAST search yourself on the NCBI site through your web browser, and then save the results. You need to choose XML as the format in which to receive the results, and save the final BLAST page you get (you know, the one with all of the interesting results!) to a file.
  • You can also run BLAST locally without using Biopython, and save the output in a file. Again, you need to choose XML as the format in which to receive the results.

The important point is that you do not have to use Biopython scripts to fetch the data in order to be able to parse it. Doing things in one of these ways, you then need to get a handle to the results. In Python, a handle is just a nice general way of describing input to any info source so that the info can be retrieved using read() and readline() functions (see Section sec:appendix-handles).

If you followed the code above for interacting with BLAST through a script, then you already have result_handle, the handle to the BLAST results. For example, using a GI number to do an online search:

>>> from Bio.Blast import NCBIWWW
>>> result_handle = NCBIWWW.qblast("blastn", "nt", "8332116")

If instead you ran BLAST some other way, and have the BLAST output (in XML format) in the file my_blast.xml, all you need to do is to open the file for reading:

>>> result_handle = open("my_blast.xml")

Now that we’ve got a handle, we are ready to parse the output. The code to parse it is really quite small. If you expect a single BLAST result (i.e. you used a single query):

>>> from Bio.Blast import NCBIXML
>>> blast_record = NCBIXML.read(result_handle)

or, if you have lots of results (i.e. multiple query sequences):

>>> from Bio.Blast import NCBIXML
>>> blast_records = NCBIXML.parse(result_handle)

Just like Bio.SeqIO and Bio.AlignIO (see Chapters 5 and 6), we have a pair of input functions, read and parse, where read is for when you have exactly one object, and parse is an iterator for when you can have lots of objects – but instead of getting SeqRecord or MultipleSeqAlignment objects, we get BLAST record objects.

To be able to handle the situation where the BLAST file may be huge, containing thousands of results, NCBIXML.parse() returns an iterator. In plain English, an iterator allows you to step through the BLAST output, retrieving BLAST records one by one for each BLAST search result:

>>> from Bio.Blast import NCBIXML
>>> blast_records = NCBIXML.parse(result_handle)
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
# ... do something with blast_record
>>> blast_record = next(blast_records)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
# No further records

Or, you can use a for-loop:

>>> for blast_record in blast_records:
...     # Do something with blast_record

Note though that you can step through the BLAST records only once. Usually, from each BLAST record you would save the information that you are interested in. If you want to save all returned BLAST records, you can convert the iterator into a list:

>>> blast_records = list(blast_records)

Now you can access each BLAST record in the list with an index as usual. If your BLAST file is huge though, you may run into memory problems trying to save them all in a list.

Usually, you’ll be running one BLAST search at a time. Then, all you need to do is to pick up the first (and only) BLAST record in blast_records:

>>> from Bio.Blast import NCBIXML
>>> blast_records = NCBIXML.parse(result_handle)
>>> blast_record = next(blast_records)

or more elegantly:

>>> from Bio.Blast import NCBIXML
>>> blast_record = NCBIXML.read(result_handle)

I guess by now you’re wondering what is in a BLAST record.

7.4  The BLAST record class

A BLAST Record contains everything you might ever want to extract from the BLAST output. Right now we’ll just show an example of how to get some info out of the BLAST report, but if you want something in particular that is not described here, look at the info on the record class in detail, and take a gander into the code or automatically generated documentation – the docstrings have lots of good info about what is stored in each piece of information.

To continue with our example, let’s just print out some summary info about all hits in our blast report greater than a particular threshold. The following code does this:

>>> E_VALUE_THRESH = 0.04

>>> for alignment in blast_record.alignments:
...     for hsp in alignment.hsps:
...         if hsp.expect < E_VALUE_THRESH:
...             print('****Alignment****')
...             print('sequence:', alignment.title)
...             print('length:', alignment.length)
...             print('e value:', hsp.expect)
...             print(hsp.query[0:75] + '...')
...             print(hsp.match[0:75] + '...')
...             print(hsp.sbjct[0:75] + '...')

This will print out summary reports like the following:

****Alignment****
sequence: >gb|AF283004.1|AF283004 Arabidopsis thaliana cold acclimation protein WCOR413-like protein
alpha form mRNA, complete cds
length: 783
e value: 0.034
tacttgttgatattggatcgaacaaactggagaaccaacatgctcacgtcacttttagtcccttacatattcctc...
||||||||| | ||||||||||| || ||||  || || |||||||| |||||| |  | |||||||| ||| ||...
tacttgttggtgttggatcgaaccaattggaagacgaatatgctcacatcacttctcattccttacatcttcttc...

Basically, you can do anything you want to with the info in the BLAST report once you have parsed it. This will, of course, depend on what you want to use it for, but hopefully this helps you get started on doing what you need to do!

An important consideration for extracting information from a BLAST report is the type of objects that the information is stored in. In Biopython, the parsers return Record objects, either Blast or PSIBlast depending on what you are parsing. These objects are defined in Bio.Blast.Record and are quite complete.

Here are my attempts at UML class diagrams for the Blast and PSIBlast record classes. If you are good at UML and see mistakes/improvements that can be made, please let me know. The Blast class diagram is shown in Figure 7.4.

The PSIBlast record object is similar, but has support for the rounds that are used in the iteration steps of PSIBlast. The class diagram for PSIBlast is shown in Figure 7.4.

7.5  Deprecated BLAST parsers

Older versions of Biopython had parsers for BLAST output in plain text or HTML format. Over the years, we discovered that it is very hard to maintain these parsers in working order. Basically, any small change to the BLAST output in newly released BLAST versions tends to cause the plain text and HTML parsers to break. We therefore recommend parsing BLAST output in XML format, as described in section 7.3.

Depending on which BLAST versions or programs you’re using, our plain text BLAST parser may or may not work. Use it at your own risk!

7.5.1  Parsing plain-text BLAST output

The plain text BLAST parser is located in Bio.Blast.NCBIStandalone.

As with the XML parser, we need to have a handle object that we can pass to the parser. The handle must implement the readline() method and do this properly. The common ways to get such a handle are to either use the provided blastall or blastpgp functions to run the local blast, or to run a local blast via the command line, and then do something like the following:

>>> result_handle = open("my_file_of_blast_output.txt")

Well, now that we’ve got a handle (which we’ll call result_handle), we are ready to parse it. This can be done with the following code:

>>> from Bio.Blast import NCBIStandalone
>>> blast_parser = NCBIStandalone.BlastParser()
>>> blast_record = blast_parser.parse(result_handle)

This will parse the BLAST report into a Blast Record class (either a Blast or a PSIBlast record, depending on what you are parsing) so that you can extract the information from it. In our case, let’s just use print out a quick summary of all of the alignments greater than some threshold value.

>>> E_VALUE_THRESH = 0.04
>>> for alignment in blast_record.alignments:
...     for hsp in alignment.hsps:
...         if hsp.expect < E_VALUE_THRESH:
...             print('****Alignment****')
...             print('sequence:', alignment.title)
...             print('length:', alignment.length)
...             print('e value:', hsp.expect)
...             print(hsp.query[0:75] + '...')
...             print(hsp.match[0:75] + '...')
...             print(hsp.sbjct[0:75] + '...')

If you also read the section 7.3 on parsing BLAST XML output, you’ll notice that the above code is identical to what is found in that section. Once you parse something into a record class you can deal with it independent of the format of the original BLAST info you were parsing. Pretty snazzy!

Sure, parsing one record is great, but I’ve got a BLAST file with tons of records – how can I parse them all? Well, fear not, the answer lies in the very next section.

7.5.2  Parsing a plain-text BLAST file full of BLAST runs

We can do this using the blast iterator. To set up an iterator, we first set up a parser, to parse our blast reports in Blast Record objects:

>>> from Bio.Blast import NCBIStandalone
>>> blast_parser = NCBIStandalone.BlastParser()

Then we will assume we have a handle to a bunch of blast records, which we’ll call result_handle. Getting a handle is described in full detail above in the blast parsing sections.

Now that we’ve got a parser and a handle, we are ready to set up the iterator with the following command:

>>> blast_iterator = NCBIStandalone.Iterator(result_handle, blast_parser)

The second option, the parser, is optional. If we don’t supply a parser, then the iterator will just return the raw BLAST reports one at a time.

Now that we’ve got an iterator, we start retrieving blast records (generated by our parser) using next():

>>> blast_record = next(blast_iterator)

Each call to next will return a new record that we can deal with. Now we can iterate through this records and generate our old favorite, a nice little blast report:

>>> for blast_record in blast_iterator:
...     E_VALUE_THRESH = 0.04
...     for alignment in blast_record.alignments:
...         for hsp in alignment.hsps:
...             if hsp.expect < E_VALUE_THRESH:
...                 print('****Alignment****')
...                 print('sequence:', alignment.title)
...                 print('length:', alignment.length)
...                 print('e value:', hsp.expect)
...                 if len(hsp.query) > 75:
...                     dots = '...'
...                 else:
...                     dots = ''
...                 print(hsp.query[0:75] + dots)
...                 print(hsp.match[0:75] + dots)
...                 print(hsp.sbjct[0:75] + dots)

The iterator allows you to deal with huge blast records without any memory problems, since things are read in one at a time. I have parsed tremendously huge files without any problems using this.

7.5.3  Finding a bad record somewhere in a huge plain-text BLAST file

One really ugly problem that happens to me is that I’ll be parsing a huge blast file for a while, and the parser will bomb out with a ValueError. This is a serious problem, since you can’t tell if the ValueError is due to a parser problem, or a problem with the BLAST. To make it even worse, you have no idea where the parse failed, so you can’t just ignore the error, since this could be ignoring an important data point.

We used to have to make a little script to get around this problem, but the Bio.Blast module now includes a BlastErrorParser which really helps make this easier. The BlastErrorParser works very similar to the regular BlastParser, but it adds an extra layer of work by catching ValueErrors that are generated by the parser, and attempting to diagnose the errors.

Let’s take a look at using this parser – first we define the file we are going to parse and the file to write the problem reports to:

>>> import os
>>> blast_file = os.path.join(os.getcwd(), "blast_out", "big_blast.out")
>>> error_file = os.path.join(os.getcwd(), "blast_out", "big_blast.problems")

Now we want to get a BlastErrorParser:

>>> from Bio.Blast import NCBIStandalone
>>> error_handle = open(error_file, "w")
>>> blast_error_parser = NCBIStandalone.BlastErrorParser(error_handle)

Notice that the parser take an optional argument of a handle. If a handle is passed, then the parser will write any blast records which generate a ValueError to this handle. Otherwise, these records will not be recorded.

Now we can use the BlastErrorParser just like a regular blast parser. Specifically, we might want to make an iterator that goes through our blast records one at a time and parses them with the error parser:

>>> result_handle = open(blast_file)
>>> iterator = NCBIStandalone.Iterator(result_handle, blast_error_parser)

We can read these records one a time, but now we can catch and deal with errors that are due to problems with Blast (and not with the parser itself):

>>> try:
...     next_record = next(iterator)
... except NCBIStandalone.LowQualityBlastError as info:
...     print("LowQualityBlastError detected in id %s" % info[1])

The next() functionality is normally called indirectly via a for-loop. Right now the BlastErrorParser can generate the following errors:

  • ValueError – This is the same error generated by the regular BlastParser, and is due to the parser not being able to parse a specific file. This is normally either due to a bug in the parser, or some kind of discrepancy between the version of BLAST you are using and the versions the parser is able to handle.
  • LowQualityBlastError – When BLASTing a sequence that is of really bad quality (for example, a short sequence that is basically a stretch of one nucleotide), it seems that Blast ends up masking out the entire sequence and ending up with nothing to parse. In this case it will produce a truncated report that causes the parser to generate a ValueError. LowQualityBlastError is reported in these cases. This error returns an info item with the following information:
    • item[0] – The error message
    • item[1] – The id of the input record that caused the error. This is really useful if you want to record all of the records that are causing problems.

As mentioned, with each error generated, the BlastErrorParser will write the offending record to the specified error_handle. You can then go ahead and look and these and deal with them as you see fit. Either you will be able to debug the parser with a single blast report, or will find out problems in your blast runs. Either way, it will definitely be a useful experience!

Hopefully the BlastErrorParser will make it much easier to debug and deal with large Blast files.

7.6  Dealing with PSI-BLAST

You can run the standalone version of PSI-BLAST (the legacy NCBI command line tool blastpgp, or its replacement psiblast) using the wrappers in Bio.Blast.Applications module.

At the time of writing, the NCBI do not appear to support tools running a PSI-BLAST search via the internet.

Note that the Bio.Blast.NCBIXML parser can read the XML output from current versions of PSI-BLAST, but information like which sequences in each iteration is new or reused isn’t present in the XML file. If you care about this information you may have more joy with the plain text output and the PSIBlastParser in Bio.Blast.NCBIStandalone.

7.7  Dealing with RPS-BLAST

You can run the standalone version of RPS-BLAST (either the legacy NCBI command line tool rpsblast, or its replacement with the same name) using the wrappers in Bio.Blast.Applications module.

At the time of writing, the NCBI do not appear to support tools running an RPS-BLAST search via the internet.

You can use the Bio.Blast.NCBIXML parser to read the XML output from current versions of RPS-BLAST.

Chapter 8  BLAST and other sequence search tools (experimental code)

WARNING: This chapter of the Tutorial describes an experimental module in Biopython. It is being included in Biopython and documented here in the tutorial in a pre-final state to allow a period of feedback and refinement before we declare it stable. Until then the details will probably change, and any scripts using the current Bio.SearchIO would need to be updated. Please keep this in mind! For stable code working with NCBI BLAST, please continue to use Bio.Blast described in the preceding Chapter 7.

Biological sequence identification is an integral part of bioinformatics. Several tools are available for this, each with their own algorithms and approaches, such as BLAST (arguably the most popular), FASTA, HMMER, and many more. In general, these tools usually use your sequence to search a database of potential matches. With the growing number of known sequences (hence the growing number of potential matches), interpreting the results becomes increasingly hard as there could be hundreds or even thousands of potential matches. Naturally, manual interpretation of these searches’ results is out of the question. Moreover, you often need to work with several sequence search tools, each with its own statistics, conventions, and output format. Imagine how daunting it would be when you need to work with multiple sequences using multiple search tools.

We know this too well ourselves, which is why we created the Bio.SearchIO submodule in Biopython. Bio.SearchIO allows you to extract information from your search results in a convenient way, while also dealing with the different standards and conventions used by different search tools. The name SearchIO is a homage to BioPerl’s module of the same name.

In this chapter, we’ll go through the main features of Bio.SearchIO to show what it can do for you. We’ll use two popular search tools along the way: BLAST and BLAT. They are used merely for illustrative purposes, and you should be able to adapt the workflow to any other search tools supported by Bio.SearchIO in a breeze. You’re very welcome to follow along with the search output files we’ll be using. The BLAST output file can be downloaded here, and the BLAT output file here. Both output files were generated using this sequence:

>mystery_seq
CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG

The BLAST result is an XML file generated using blastn against the NCBI refseq_rna database. For BLAT, the sequence database was the February 2009 hg19 human genome draft and the output format is PSL.

We’ll start from an introduction to the Bio.SearchIO object model. The model is the representation of your search results, thus it is core to Bio.SearchIO itself. After that, we’ll check out the main functions in Bio.SearchIO that you may often use.

Now that we’re all set, let’s go to the first step: introducing the core object model.

8.1  The SearchIO object model

Despite the wildly differing output styles among many sequence search tools, it turns out that their underlying concept is similar:

  • The output file may contain results from one or more search queries.
  • In each search query, you will see one or more hits from the given search database.
  • In each database hit, you will see one or more regions containing the actual sequence alignment between your query sequence and the database sequence.
  • Some programs like BLAT or Exonerate may further split these regions into several alignment fragments (or blocks in BLAT and possibly exons in exonerate). This is not something you always see, as programs like BLAST and HMMER do not do this.

Realizing this generality, we decided use it as base for creating the Bio.SearchIO object model. The object model consists of a nested hierarchy of Python objects, each one representing one concept outlined above. These objects are:

  • QueryResult, to represent a single search query.
  • Hit, to represent a single database hit. Hit objects are contained within QueryResult and in each QueryResult there is zero or more Hit objects.
  • HSP (short for high-scoring pair), to represent region(s) of significant alignments between query and hit sequences. HSP objects are contained within Hit objects and each Hit has one or more HSP objects.
  • HSPFragment, to represent a single contiguous alignment between query and hit sequences. HSPFragment objects are contained within HSP objects. Most sequence search tools like BLAST and HMMER unify HSP and HSPFragment objects as each HSP will only have a single HSPFragment. However there are tools like BLAT and Exonerate that produce HSP containing multiple HSPFragment. Don’t worry if this seems a tad confusing now, we’ll elaborate more on these two objects later on.

These four objects are the ones you will interact with when you use Bio.SearchIO. They are created using one of the main Bio.SearchIO methods: read, parse, index, or index_db. The details of these methods are provided in later sections. For this section, we’ll only be using read and parse. These functions behave similarly to their Bio.SeqIO and Bio.AlignIO counterparts:

  • read is used for search output files with a single query and returns a QueryResult object
  • parse is used for search output files with multiple queries and returns a generator that yields QueryResult objects

With that settled, let’s start probing each Bio.SearchIO object, beginning with QueryResult.

8.1.1  QueryResult

The QueryResult object represents a single search query and contains zero or more Hit objects. Let’s see what it looks like using the BLAST file we have:

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml')
>>> print(blast_qresult)
Program: blastn (2.2.27+)
  Query: 42291 (61)
         mystery_seq
 Target: refseq_rna
   Hits: ----  -----  ----------------------------------------------------------
            #  # HSP  ID + description                                          
         ----  -----  ----------------------------------------------------------
            0      1  gi|262205317|ref|NR_030195.1|  Homo sapiens microRNA 52...
            1      1  gi|301171311|ref|NR_035856.1|  Pan troglodytes microRNA...
            2      1  gi|270133242|ref|NR_032573.1|  Macaca mulatta microRNA ...
            3      2  gi|301171322|ref|NR_035857.1|  Pan troglodytes microRNA...
            4      1  gi|301171267|ref|NR_035851.1|  Pan troglodytes microRNA...
            5      2  gi|262205330|ref|NR_030198.1|  Homo sapiens microRNA 52...
            6      1  gi|262205302|ref|NR_030191.1|  Homo sapiens microRNA 51...
            7      1  gi|301171259|ref|NR_035850.1|  Pan troglodytes microRNA...
            8      1  gi|262205451|ref|NR_030222.1|  Homo sapiens microRNA 51...
            9      2  gi|301171447|ref|NR_035871.1|  Pan troglodytes microRNA...
           10      1  gi|301171276|ref|NR_035852.1|  Pan troglodytes microRNA...
           11      1  gi|262205290|ref|NR_030188.1|  Homo sapiens microRNA 51...
           12      1  gi|301171354|ref|NR_035860.1|  Pan troglodytes microRNA...
           13      1  gi|262205281|ref|NR_030186.1|  Homo sapiens microRNA 52...
           14      2  gi|262205298|ref|NR_030190.1|  Homo sapiens microRNA 52...
           15      1  gi|301171394|ref|NR_035865.1|  Pan troglodytes microRNA...
           16      1  gi|262205429|ref|NR_030218.1|  Homo sapiens microRNA 51...
           17      1  gi|262205423|ref|NR_030217.1|  Homo sapiens microRNA 52...
           18      1  gi|301171401|ref|NR_035866.1|  Pan troglodytes microRNA...
           19      1  gi|270133247|ref|NR_032574.1|  Macaca mulatta microRNA ...
           20      1  gi|262205309|ref|NR_030193.1|  Homo sapiens microRNA 52...
           21      2  gi|270132717|ref|NR_032716.1|  Macaca mulatta microRNA ...
           22      2  gi|301171437|ref|NR_035870.1|  Pan troglodytes microRNA...
           23      2  gi|270133306|ref|NR_032587.1|  Macaca mulatta microRNA ...
           24      2  gi|301171428|ref|NR_035869.1|  Pan troglodytes microRNA...
           25      1  gi|301171211|ref|NR_035845.1|  Pan troglodytes microRNA...
           26      2  gi|301171153|ref|NR_035838.1|  Pan troglodytes microRNA...
           27      2  gi|301171146|ref|NR_035837.1|  Pan troglodytes microRNA...
           28      2  gi|270133254|ref|NR_032575.1|  Macaca mulatta microRNA ...
           29      2  gi|262205445|ref|NR_030221.1|  Homo sapiens microRNA 51...
           ~~~
           97      1  gi|356517317|ref|XM_003527287.1|  PREDICTED: Glycine ma...
           98      1  gi|297814701|ref|XM_002875188.1|  Arabidopsis lyrata su...
           99      1  gi|397513516|ref|XM_003827011.1|  PREDICTED: Pan panisc...

We’ve just begun to scratch the surface of the object model, but you can see that there’s already some useful information. By invoking print on the QueryResult object, you can see:

  • The program name and version (blastn version 2.2.27+)
  • The query ID, description, and its sequence length (ID is 42291, description is ‘mystery_seq’, and it is 61 nucleotides long)
  • The target database to search against (refseq_rna)
  • A quick overview of the resulting hits. For our query sequence, there are 100 potential hits (numbered 0–99 in the table). For each hit, we can also see how many HSPs it contains, its ID, and a snippet of its description. Notice here that Bio.SearchIO truncates the hit table overview, by showing only hits numbered 0–29, and then 97–99.

Now let’s check our BLAT results using the same procedure as above:

>>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl')
>>> print(blat_qresult)
Program: blat (<unknown version>)
  Query: mystery_seq (61)
         <unknown description>
 Target: <unknown target>
   Hits: ----  -----  ----------------------------------------------------------
            #  # HSP  ID + description                                          
         ----  -----  ----------------------------------------------------------
            0     17  chr19  <unknown description>                              

You’ll immediately notice that there are some differences. Some of these are caused by the way PSL format stores its details, as you’ll see. The rest are caused by the genuine program and target database differences between our BLAST and BLAT searches:

  • The program name and version. Bio.SearchIO knows that the program is BLAT, but in the output file there is no information regarding the program version so it defaults to ‘<unknown version>’.
  • The query ID, description, and its sequence length. Notice here that these details are slightly different from the ones we saw in BLAST. The ID is ‘mystery_seq’ instead of 42991, there is no known description, but the query length is still 61. This is actually a difference introduced by the file formats themselves. BLAST sometimes creates its own query IDs and uses your original ID as the sequence description.
  • The target database is not known, as it is not stated in the BLAT output file.
  • And finally, the list of hits we have is completely different. Here, we see that our query sequence only hits the ‘chr19’ database entry, but in it we see 17 HSP regions. This should not be surprising however, given that we are using a different program, each with its own target database.

All the details you saw when invoking the print method can be accessed individually using Python’s object attribute access notation (a.k.a. the dot notation). There are also other format-specific attributes that you can access using the same method.

>>> print("%s %s" % (blast_qresult.program, blast_qresult.version))
blastn 2.2.27+
>>> print("%s %s" % (blat_qresult.program, blat_qresult.version))
blat <unknown version>
>>> blast_qresult.param_evalue_threshold    # blast-xml specific
10.0

For a complete list of accessible attributes, you can check each format-specific documentation. Here are the ones for BLAST and for BLAT.

Having looked at using print on QueryResult objects, let’s drill down deeper. What exactly is a QueryResult? In terms of Python objects, QueryResult is a hybrid between a list and a dictionary. In other words, it is a container object with all the convenient features of lists and dictionaries.

Like Python lists and dictionaries, QueryResult objects are iterable. Each iteration returns a Hit object:

>>> for hit in blast_qresult:
...     hit
Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps)
Hit(id='gi|301171311|ref|NR_035856.1|', query_id='42291', 1 hsps)
Hit(id='gi|270133242|ref|NR_032573.1|', query_id='42291', 1 hsps)
Hit(id='gi|301171322|ref|NR_035857.1|', query_id='42291', 2 hsps)
Hit(id='gi|301171267|ref|NR_035851.1|', query_id='42291', 1 hsps)
...

To check how many items (hits) a QueryResult has, you can simply invoke Python’s len method:

>>> len(blast_qresult)
100
>>> len(blat_qresult)
1

Like Python lists, you can retrieve items (hits) from a QueryResult using the slice notation:

>>> blast_qresult[0]        # retrieves the top hit
Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps)
>>> blast_qresult[-1]       # retrieves the last hit
Hit(id='gi|397513516|ref|XM_003827011.1|', query_id='42291', 1 hsps)

To retrieve multiple hits, you can slice QueryResult objects using the slice notation as well. In this case, the slice will return a new QueryResult object containing only the sliced hits:

>>> blast_slice = blast_qresult[:3]     # slices the first three hits
>>> print(blast_slice)
Program: blastn (2.2.27+)
  Query: 42291 (61)
         mystery_seq
 Target: refseq_rna
   Hits: ----  -----  ----------------------------------------------------------
            #  # HSP  ID + description                                          
         ----  -----  ----------------------------------------------------------
            0      1  gi|262205317|ref|NR_030195.1|  Homo sapiens microRNA 52...
            1      1  gi|301171311|ref|NR_035856.1|  Pan troglodytes microRNA...
            2      1  gi|270133242|ref|NR_032573.1|  Macaca mulatta microRNA ...

Like Python dictionaries, you can also retrieve hits using the hit’s ID. This is particularly useful if you know a given hit ID exists within a search query results:

>>> blast_qresult['gi|262205317|ref|NR_030195.1|']
Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps)

You can also get a full list of Hit objects using hits and a full list of Hit IDs using hit_keys:

>>> blast_qresult.hits
[...]       # list of all hits
>>> blast_qresult.hit_keys
[...]       # list of all hit IDs

What if you just want to check whether a particular hit is present in the query results? You can do a simple Python membership test using the in keyword:

>>> 'gi|262205317|ref|NR_030195.1|' in blast_qresult
True
>>> 'gi|262205317|ref|NR_030194.1|' in blast_qresult
False

Sometimes, knowing whether a hit is present is not enough; you also want to know the rank of the hit. Here, the index method comes to the rescue:

>>> blast_qresult.index('gi|301171437|ref|NR_035870.1|')
22

Remember that we’re using Python’s indexing style here, which is zero-based. This means our hit above is ranked at no. 23, not 22.

Also, note that the hit rank you see here is based on the native hit ordering present in the original search output file. Different search tools may order these hits based on different criteria.

If the native hit ordering doesn’t suit your taste, you can use the sort method of the QueryResult object. It is very similar to Python’s list.sort method, with the addition of an option to create a new sorted QueryResult object or not.

Here is an example of using QueryResult.sort to sort the hits based on each hit’s full sequence length. For this particular sort, we’ll set the in_place flag to False so that sorting will return a new QueryResult object and leave our initial object unsorted. We’ll also set the reverse flag to True so that we sort in descending order.

>>> for hit in blast_qresult[:5]:   # id and sequence length of the first five hits
...     print("%s %i" % (hit.id, hit.seq_len))
... 
gi|262205317|ref|NR_030195.1| 61
gi|301171311|ref|NR_035856.1| 60
gi|270133242|ref|NR_032573.1| 85
gi|301171322|ref|NR_035857.1| 86
gi|301171267|ref|NR_035851.1| 80

>>> sort_key = lambda hit: hit.seq_len
>>> sorted_qresult = blast_qresult.sort(key=sort_key, reverse=True, in_place=False)
>>> for hit in sorted_qresult[:5]:
...     print("%s %i" % (hit.id, hit.seq_len))
... 
gi|397513516|ref|XM_003827011.1| 6002
gi|390332045|ref|XM_776818.2| 4082
gi|390332043|ref|XM_003723358.1| 4079
gi|356517317|ref|XM_003527287.1| 3251
gi|356543101|ref|XM_003539954.1| 2936

The advantage of having the in_place flag here is that we’re preserving the native ordering, so we may use it again later. You should note that this is not the default behavior of QueryResult.sort, however, which is why we needed to set the in_place flag to True explicitly.

At this point, you’ve known enough about QueryResult objects to make it work for you. But before we go on to the next object in the Bio.SearchIO model, let’s take a look at two more sets of methods that could make it even easier to work with QueryResult objects: the filter and map methods.

If you’re familiar with Python’s list comprehensions, generator expressions or the built in filter and map functions, you’ll know how useful they are for working with list-like objects (if you’re not, check them out!). You can use these built in methods to manipulate QueryResult objects, but you’ll end up with regular Python lists and lose the ability to do more interesting manipulations.

That’s why, QueryResult objects provide its own flavor of filter and map methods. Analogous to filter, there are hit_filter and hsp_filter methods. As their name implies, these methods filter its QueryResult object either on its Hit objects or HSP objects. Similarly, analogous to map, QueryResult objects also provide the hit_map and hsp_map methods. These methods apply a given function to all hits or HSPs in a QueryResult object, respectively.

Let’s see these methods in action, beginning with hit_filter. This method accepts a callback function that checks whether a given Hit object passes the condition you set or not. In other words, the function must accept as its argument a single Hit object and returns True or False.

Here is an example of using hit_filter to filter out Hit objects that only have one HSP:

>>> filter_func = lambda hit: len(hit.hsps) > 1     # the callback function
>>> len(blast_qresult)      # no. of hits before filtering
100
>>> filtered_qresult = blast_qresult.hit_filter(filter_func)
>>> len(filtered_qresult)   # no. of hits after filtering
37
>>> for hit in filtered_qresult[:5]:    # quick check for the hit lengths
...     print("%s %i" % (hit.id, len(hit.hsps)))
gi|301171322|ref|NR_035857.1| 2
gi|262205330|ref|NR_030198.1| 2
gi|301171447|ref|NR_035871.1| 2
gi|262205298|ref|NR_030190.1| 2
gi|270132717|ref|NR_032716.1| 2

hsp_filter works the same as hit_filter, only instead of looking at the Hit objects, it performs filtering on the HSP objects in each hits.

As for the map methods, they too accept a callback function as their arguments. However, instead of returning True or False, the callback function must return the modified Hit or HSP object (depending on whether you’re using hit_map or hsp_map).

Let’s see an example where we’re using hit_map to rename the hit IDs:

>>> def map_func(hit):
...     hit.id = hit.id.split('|')[3]   # renames 'gi|301171322|ref|NR_035857.1|' to 'NR_035857.1'
...     return hit
...
>>> mapped_qresult = blast_qresult.hit_map(map_func)
>>> for hit in mapped_qresult[:5]:
...     print(hit.id)
NR_030195.1
NR_035856.1
NR_032573.1
NR_035857.1
NR_035851.1

Again, hsp_map works the same as hit_map, but on HSP objects instead of Hit objects.

8.1.2  Hit

Hit objects represent all query results from a single database entry. They are the second-level container in the Bio.SearchIO object hierarchy. You’ve seen that they are contained by QueryResult objects, but they themselves contain HSP objects.

Let’s see what they look like, beginning with our BLAST search:

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml')
>>> blast_hit = blast_qresult[3]    # fourth hit from the query result
>>> print(blast_hit)
Query: 42291
       mystery_seq
  Hit: gi|301171322|ref|NR_035857.1| (86)
       Pan troglodytes microRNA mir-520c (MIR520C), microRNA
 HSPs: ----  --------  ---------  ------  ---------------  ---------------------
          #   E-value  Bit score    Span      Query range              Hit range
       ----  --------  ---------  ------  ---------------  ---------------------
          0   8.9e-20     100.47      60           [1:61]                [13:73]
          1   3.3e-06      55.39      60           [0:60]                [13:73]

You see that we’ve got the essentials covered here:

  • The query ID and description is present. A hit is always tied to a query, so we want to keep track of the originating query as well. These values can be accessed from a hit using the query_id and query_description attributes.
  • We also have the unique hit ID, description, and full sequence lengths. They can be accessed using id, description, and seq_len, respectively.
  • Finally, there’s a table containing quick information about the HSPs this hit contains. In each row, we’ve got the important HSP details listed: the HSP index, its e-value, its bit score, its span (the alignment length including gaps), its query coordinates, and its hit coordinates.

Now let’s contrast this with the BLAT search. Remember that in the BLAT search we had one hit with 17 HSPs.

>>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl')
>>> blat_hit = blat_qresult[0]      # the only hit
>>> print(blat_hit)
Query: mystery_seq
       <unknown description>
  Hit: chr19 (59128983)
       <unknown description>
 HSPs: ----  --------  ---------  ------  ---------------  ---------------------
          #   E-value  Bit score    Span      Query range              Hit range
       ----  --------  ---------  ------  ---------------  ---------------------
          0         ?          ?       ?           [0:61]    [54204480:54204541]
          1         ?          ?       ?           [0:61]    [54233104:54264463]
          2         ?          ?       ?           [0:61]    [54254477:54260071]
          3         ?          ?       ?           [1:61]    [54210720:54210780]
          4         ?          ?       ?           [0:60]    [54198476:54198536]
          5         ?          ?       ?           [0:61]    [54265610:54265671]
          6         ?          ?       ?           [0:61]    [54238143:54240175]
          7         ?          ?       ?           [0:60]    [54189735:54189795]
          8         ?          ?       ?           [0:61]    [54185425:54185486]
          9         ?          ?       ?           [0:60]    [54197657:54197717]
         10         ?          ?       ?           [0:61]    [54255662:54255723]
         11         ?          ?       ?           [0:61]    [54201651:54201712]
         12         ?          ?       ?           [8:60]    [54206009:54206061]
         13         ?          ?       ?          [10:61]    [54178987:54179038]
         14         ?          ?       ?           [8:61]    [54212018:54212071]
         15         ?          ?       ?           [8:51]    [54234278:54234321]
         16         ?          ?       ?           [8:61]    [54238143:54238196]

Here, we’ve got a similar level of detail as with the BLAST hit we saw earlier. There are some differences worth explaining, though:

  • The e-value and bit score column values. As BLAT HSPs do not have e-values and bit scores, the display defaults to ‘?’.
  • What about the span column? The span values is meant to display the complete alignment length, which consists of all residues and any gaps that may be present. The PSL format do not have this information readily available and Bio.SearchIO does not attempt to try guess what it is, so we get a ‘?’ similar to the e-value and bit score columns.

In terms of Python objects, Hit behaves almost the same as Python lists, but contain HSP objects exclusively. If you’re familiar with lists, you should encounter no difficulties working with the Hit object.

Just like Python lists, Hit objects are iterable, and each iteration returns one HSP object it contains:

>>> for hsp in blast_hit:
...     hsp
HSP(hit_id='gi|301171322|ref|NR_035857.1|', query_id='42291', 1 fragments)
HSP(hit_id='gi|301171322|ref|NR_035857.1|', query_id='42291', 1 fragments)

You can invoke len on a Hit to see how many HSP objects it has:

>>> len(blast_hit)
2
>>> len(blat_hit)
17

You can use the slice notation on Hit objects, whether to retrieve single HSP or multiple HSP objects. Like QueryResult, if you slice for multiple HSP, a new Hit object will be returned containing only the sliced HSP objects:

>>> blat_hit[0]                 # retrieve single items
HSP(hit_id='chr19', query_id='mystery_seq', 1 fragments)
>>> sliced_hit = blat_hit[4:9]  # retrieve multiple items
>>> len(sliced_hit)
5
>>> print(sliced_hit)
Query: mystery_seq
       <unknown description>
  Hit: chr19 (59128983)
       <unknown description>
 HSPs: ----  --------  ---------  ------  ---------------  ---------------------
          #   E-value  Bit score    Span      Query range              Hit range
       ----  --------  ---------  ------  ---------------  ---------------------
          0         ?          ?       ?           [0:60]    [54198476:54198536]
          1         ?          ?       ?           [0:61]    [54265610:54265671]
          2         ?          ?       ?           [0:61]    [54238143:54240175]
          3         ?          ?       ?           [0:60]    [54189735:54189795]
          4         ?          ?       ?           [0:61]    [54185425:54185486]

You can also sort the HSP inside a Hit, using the exact same arguments like the sort method you saw in the QueryResult object.

Finally, there are also the filter and map methods you can use on Hit objects. Unlike in the QueryResult object, Hit objects only have one variant of filter (Hit.filter) and one variant of map (Hit.map). Both of Hit.filter and Hit.map work on the HSP objects a Hit has.

8.1.3  HSP

HSP (high-scoring pair) represents region(s) in the hit sequence that contains significant alignment(s) to the query sequence. It contains the actual match between your query sequence and a database entry. As this match is determined by the sequence search tool’s algorithms, the HSP object contains the bulk of the statistics computed by the search tool. This also makes the distinction between HSP objects from different search tools more apparent compared to the differences you’ve seen in QueryResult or Hit objects.

Let’s see some examples from our BLAST and BLAT searches. We’ll look at the BLAST HSP first:

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml')
>>> blast_hsp = blast_qresult[0][0]    # first hit, first hsp
>>> print(blast_hsp)
      Query: 42291 mystery_seq
        Hit: gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 520b (MIR520...
Query range: [0:61] (1)
  Hit range: [0:61] (1)
Quick stats: evalue 4.9e-23; bitscore 111.29
  Fragments: 1 (61 columns)
     Query - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG
             |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
       Hit - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG

Just like QueryResult and Hit, invoking print on an HSP shows its general details:

  • There are the query and hit IDs and descriptions. We need these to identify our HSP.
  • We’ve also got the matching range of the query and hit sequences. The slice notation we’re using here is an indication that the range is displayed using Python’s indexing style (zero-based, half open). The number inside the parenthesis denotes the strand. In this case, both sequences have the plus strand.
  • Some quick statistics are available: the e-value and bitscore.
  • There is information about the HSP fragments. Ignore this for now; it will be explained later on.
  • And finally, we have the query and hit sequence alignment itself.

These details can be accessed on their own using the dot notation, just like in QueryResult and Hit:

>>> blast_hsp.query_range
(0, 61)
>>> blast_hsp.evalue
4.91307e-23

They’re not the only attributes available, though. HSP objects come with a default set of properties that makes it easy to probe their various details. Here are some examples:

>>> blast_hsp.hit_start         # start coordinate of the hit sequence
0
>>> blast_hsp.query_span        # how many residues in the query sequence
61
>>> blast_hsp.aln_span          # how long the alignment is
61

Check out the HSP documentation for a full list of these predefined properties.

Furthermore, each sequence search tool usually computes its own statistics / details for its HSP objects. For example, an XML BLAST search also outputs the number of gaps and identical residues. These attributes can be accessed like so:

>>> blast_hsp.gap_num       # number of gaps
0
>>> blast_hsp.ident_num     # number of identical residues
61

These details are format-specific; they may not be present in other formats. To see which details are available for a given sequence search tool, you should check the format’s documentation in Bio.SearchIO. Alternatively, you may also use .__dict__.keys() for a quick list of what’s available:

>>> blast_hsp.__dict__.keys()
['bitscore', 'evalue', 'ident_num', 'gap_num', 'bitscore_raw', 'pos_num', '_items']

Finally, you may have noticed that the query and hit attributes of our HSP are not just regular strings:

>>> blast_hsp.query
SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='42291', name='aligned query sequence', description='mystery_seq', dbxrefs=[])
>>> blast_hsp.hit
SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='gi|262205317|ref|NR_030195.1|', name='aligned hit sequence', description='Homo sapiens microRNA 520b (MIR520B), microRNA', dbxrefs=[])

They are SeqRecord objects you saw earlier in Section 4! This means that you can do all sorts of interesting things you can do with SeqRecord objects on HSP.query and/or HSP.hit.

It should not surprise you now that the HSP object has an alignment property which is a MultipleSeqAlignment object:

>>> print(blast_hsp.aln)
DNAAlphabet() alignment with 2 rows and 61 columns
CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAG...GGG 42291
CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAG...GGG gi|262205317|ref|NR_030195.1|

Having probed the BLAST HSP, let’s now take a look at HSPs from our BLAT results for a different kind of HSP. As usual, we’ll begin by invoking print on it:

>>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl')
>>> blat_hsp = blat_qresult[0][0]       # first hit, first hsp
>>> print(blat_hsp)
      Query: mystery_seq <unknown description>
        Hit: chr19 <unknown description>
Query range: [0:61] (1)
  Hit range: [54204480:54204541] (1)
Quick stats: evalue ?; bitscore ?
  Fragments: 1 (? columns)

Some of the outputs you may have already guessed. We have the query and hit IDs and descriptions and the sequence coordinates. Values for evalue and bitscore is ‘?’ as BLAT HSPs do not have these attributes. But The biggest difference here is that you don’t see any sequence alignments displayed. If you look closer, PSL formats themselves do not have any hit or query sequences, so Bio.SearchIO won’t create any sequence or alignment objects. What happens if you try to access HSP.query, HSP.hit, or HSP.aln? You’ll get the default values for these attributes, which is None:

>>> blat_hsp.hit is None
True
>>> blat_hsp.query is None
True
>>> blat_hsp.aln is None
True

This does not affect other attributes, though. For example, you can still access the length of the query or hit alignment. Despite not displaying any attributes, the PSL format still have this information so Bio.SearchIO can extract them:

>>> blat_hsp.query_span     # length of query match
61
>>> blat_hsp.hit_span       # length of hit match
61

Other format-specific attributes are still present as well:

>>> blat_hsp.score          # PSL score
61
>>> blat_hsp.mismatch_num   # the mismatch column
0

So far so good? Things get more interesting when you look at another ‘variant’ of HSP present in our BLAT results. You might recall that in BLAT searches, sometimes we get our results separated into ‘blocks’. These blocks are essentially alignment fragments that may have some intervening sequence between them.

Let’s take a look at a BLAT HSP that contains multiple blocks to see how Bio.SearchIO deals with this:

>>> blat_hsp2 = blat_qresult[0][1]      # first hit, second hsp
>>> print(blat_hsp2)
      Query: mystery_seq <unknown description>
        Hit: chr19 <unknown description>
Query range: [0:61] (1)
  Hit range: [54233104:54264463] (1)
Quick stats: evalue ?; bitscore ?
  Fragments: ---  --------------  ----------------------  ----------------------
               #            Span             Query range               Hit range
             ---  --------------  ----------------------  ----------------------
               0               ?                  [0:18]     [54233104:54233122]
               1               ?                 [18:61]     [54264420:54264463]

What’s happening here? We still some essential details covered: the IDs and descriptions, the coordinates, and the quick statistics are similar to what you’ve seen before. But the fragments detail is all different. Instead of showing ‘Fragments: 1’, we now have a table with two data rows.

This is how Bio.SearchIO deals with HSPs having multiple fragments. As mentioned before, an HSP alignment may be separated by intervening sequences into fragments. The intervening sequences are not part of the query-hit match, so they should not be considered part of query nor hit sequence. However, they do affect how we deal with sequence coordinates, so we can’t ignore them.

Take a look at the hit coordinate of the HSP above. In the Hit range: field, we see that the coordinate is [54233104:54264463]. But looking at the table rows, we see that not the entire region spanned by this coordinate matches our query. Specifically, the intervening region spans from 54233122 to 54264420.

Why then, is the query coordinates seem to be contiguous, you ask? This is perfectly fine. In this case it means that the query match is contiguous (no intervening regions), while the hit match is not.

All these attributes are accessible from the HSP directly, by the way:

>>> blat_hsp2.hit_range         # hit start and end coordinates of the entire HSP
(54233104, 54264463)
>>> blat_hsp2.hit_range_all     # hit start and end coordinates of each fragment
[(54233104, 54233122), (54264420, 54264463)]
>>> blat_hsp2.hit_span          # hit span of the entire HSP
31359
>>> blat_hsp2.hit_span_all      # hit span of each fragment
[18, 43]
>>> blat_hsp2.hit_inter_ranges  # start and end coordinates of intervening regions in the hit sequence
[(54233122, 54264420)]
>>> blat_hsp2.hit_inter_spans   # span of intervening regions in the hit sequence
[31298]

Most of these attributes are not readily available from the PSL file we have, but Bio.SearchIO calculates them for you on the fly when you parse the PSL file. All it needs are the start and end coordinates of each fragment.

What about the query, hit, and aln attributes? If the HSP has multiple fragments, you won’t be able to use these attributes as they only fetch single SeqRecord or MultipleSeqAlignment objects. However, you can use their *_all counterparts: query_all, hit_all, and aln_all. These properties will return a list containing SeqRecord or MultipleSeqAlignment objects from each of the HSP fragment. There are other attributes that behave similarly, i.e. they only work for HSPs with one fragment. Check out the HSP documentation for a full list.

Finally, to check whether you have multiple fragments or not, you can use the is_fragmented property like so:

>>> blat_hsp2.is_fragmented     # BLAT HSP with 2 fragments
True
>>> blat_hsp.is_fragmented      # BLAT HSP from earlier, with one fragment
False

Before we move on, you should also know that we can use the slice notation on HSP objects, just like QueryResult or Hit objects. When you use this notation, you’ll get an HSPFragment object in return, the last component of the object model.

8.1.4  HSPFragment

HSPFragment represents a single, contiguous match between the query and hit sequences. You could consider it the core of the object model and search result, since it is the presence of these fragments that determine whether your search have results or not.

In most cases, you don’t have to deal with HSPFragment objects directly since not that many sequence search tools fragment their HSPs. When you do have to deal with them, what you should remember is that HSPFragment objects were written with to be as compact as possible. In most cases, they only contain attributes directly related to sequences: strands, reading frames, alphabets, coordinates, the sequences themselves, and their IDs and descriptions.

These attributes are readily shown when you invoke print on an HSPFragment. Here’s an example, taken from our BLAST search:

>>> from Bio import SearchIO
>>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml')
>>> blast_frag = blast_qresult[0][0][0]    # first hit, first hsp, first fragment
>>> print(blast_frag)
      Query: 42291 mystery_seq
        Hit: gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 520b (MIR520...
Query range: [0:61] (1)
  Hit range: [0:61] (1)
  Fragments: 1 (61 columns)
     Query - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG
             |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
       Hit - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG

At this level, the BLAT fragment looks quite similar to the BLAST fragment, save for the query and hit sequences which are not present:

>>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl')
>>> blat_frag = blat_qresult[0][0][0]    # first hit, first hsp, first fragment
>>> print(blat_frag)
      Query: mystery_seq <unknown description>
        Hit: chr19 <unknown description>
Query range: [0:61] (1)
  Hit range: [54204480:54204541] (1)
  Fragments: 1 (? columns)

In all cases, these attributes are accessible using our favorite dot notation. Some examples:

>>> blast_frag.query_start      # query start coordinate
0
>>> blast_frag.hit_strand       # hit sequence strand
1
>>> blast_frag.hit              # hit sequence, as a SeqRecord object
SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='gi|262205317|ref|NR_030195.1|', name='aligned hit sequence', description='Homo sapiens microRNA 520b (MIR520B), microRNA', dbxrefs=[])

8.2  A note about standards and conventions

Before we move on to the main functions, there is something you ought to know about the standards Bio.SearchIO uses. If you’ve worked with multiple sequence search tools, you might have had to deal with the many different ways each program deals with things like sequence coordinates. It might not have been a pleasant experience as these search tools usually have their own standards. For example, one tools might use one-based coordinates, while the other uses zero-based coordinates. Or, one program might reverse the start and end coordinates if the strand is minus, while others don’t. In short, these often creates unnecessary mess must be dealt with.

We realize this problem ourselves and we intend to address it in Bio.SearchIO. After all, one of the goals of Bio.SearchIO is to create a common, easy to use interface to deal with various search output files. This means creating standards that extend beyond the object model you just saw.

Now, you might complain, "Not another standard!". Well, eventually we have to choose one convention or the other, so this is necessary. Plus, we’re not creating something entirely new here; just adopting a standard we think is best for a Python programmer (it is Biopython, after all).

There are three implicit standards that you can expect when working with Bio.SearchIO:

  • The first one pertains to sequence coordinates. In Bio.SearchIO, all sequence coordinates follows Python’s coordinate style: zero-based and half open. For example, if in a BLAST XML output file the start and end coordinates of an HSP are 10 and 28, they would become 9 and 28 in Bio.SearchIO. The start coordinate becomes 9 because Python indices start from zero, while the end coordinate remains 28 as Python slices omit the last item in an interval.
  • The second is on sequence coordinate orders. In Bio.SearchIO, start coordinates are always less than or equal to end coordinates. This isn’t always the case with all sequence search tools, as some of them have larger start coordinates when the sequence strand is minus.
  • The last one is on strand and reading frame values. For strands, there are only four valid choices: 1 (plus strand), -1 (minus strand), 0 (protein sequences), and None (no strand). For reading frames, the valid choices are integers from -3 to 3 and None.

Note that these standards only exist in Bio.SearchIO objects. If you write Bio.SearchIO objects into an output format, Bio.SearchIO will use the format’s standard for the output. It does not force its standard over to your output file.

8.3  Reading search output files

There are two functions you can use for reading search output files into Bio.SearchIO objects: read and parse. They’re essentially similar to read and parse functions in other submodules like Bio.SeqIO or Bio.AlignIO. In both cases, you need to supply the search output file name and the file format name, both as Python strings. You can check the documentation for a list of format names Bio.SearchIO recognizes.

Bio.SearchIO.read is used for reading search output files with only one query and returns a QueryResult object. You’ve seen read used in our previous examples. What you haven’t seen is that read may also accept additional keyword arguments, depending on the file format.

Here are some examples. In the first one, we use read just like previously to read a BLAST tabular output file. In the second one, we use a keyword argument to modify so it parses the BLAST tabular variant with comments in it:

>>> from Bio import SearchIO
>>> qresult = SearchIO.read('tab_2226_tblastn_003.txt', 'blast-tab')
>>> qresult
QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits)
>>> qresult2 = SearchIO.read('tab_2226_tblastn_007.txt', 'blast-tab', comments=True)
>>> qresult2
QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits)

These keyword arguments differs among file formats. Check the format documentation to see if it has keyword arguments that modifies its parser’s behavior.

As for the Bio.SearchIO.parse, it is used for reading search output files with any number of queries. The function returns a generator object that yields a QueryResult object in each iteration. Like Bio.SearchIO.read, it also accepts format-specific keyword arguments:

>>> from Bio import SearchIO
>>> qresults = SearchIO.parse('tab_2226_tblastn_001.txt', 'blast-tab')
>>> for qresult in qresults:
...     print(qresult.id)
gi|16080617|ref|NP_391444.1|
gi|11464971:4-101
>>> qresults2 = SearchIO.parse('tab_2226_tblastn_005.txt', 'blast-tab', comments=True)
>>> for qresult in qresults2:
...     print(qresult.id)
random_s00
gi|16080617|ref|NP_391444.1|
gi|11464971:4-101

8.4  Dealing with large search output files with indexing

Sometimes, you’re handed a search output file containing hundreds or thousands of queries that you need to parse. You can of course use Bio.SearchIO.parse for this file, but that would be grossly inefficient if you need to access only a few of the queries. This is because parse will parse all queries it sees before it fetches your query of interest.

In this case, the ideal choice would be to index the file using Bio.SearchIO.index or Bio.SearchIO.index_db. If the names sound familiar, it’s because you’ve seen them before in Section 5.4.2. These functions also behave similarly to their Bio.SeqIO counterparts, with the addition of format-specific keyword arguments.

Here are some examples. You can use index with just the filename and format name:

>>> from Bio import SearchIO
>>> idx = SearchIO.index('tab_2226_tblastn_001.txt', 'blast-tab')
>>> sorted(idx.keys())
['gi|11464971:4-101', 'gi|16080617|ref|NP_391444.1|']
>>> idx['gi|16080617|ref|NP_391444.1|']
QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits)

Or also with the format-specific keyword argument:

>>> idx = SearchIO.index('tab_2226_tblastn_005.txt', 'blast-tab', comments=True)
>>> sorted(idx.keys())
['gi|11464971:4-101', 'gi|16080617|ref|NP_391444.1|', 'random_s00']
>>> idx['gi|16080617|ref|NP_391444.1|']
QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits)

Or with the key_function argument, as in Bio.SeqIO:

>>> key_function = lambda id: id.upper()    # capitalizes the keys
>>> idx = SearchIO.index('tab_2226_tblastn_001.txt', 'blast-tab', key_function=key_function)
>>> sorted(idx.keys())
['GI|11464971:4-101', 'GI|16080617|REF|NP_391444.1|']
>>> idx['GI|16080617|REF|NP_391444.1|']
QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits)

Bio.SearchIO.index_db works like as index, only it writes the query offsets into an SQLite database file.

8.5  Writing and converting search output files

It is occasionally useful to be able to manipulate search results from an output file and write it again to a new file. Bio.SearchIO provides a write function that lets you do exactly this. It takes as its arguments an iterable returning QueryResult objects, the output filename to write to, the format name to write to, and optionally some format-specific keyword arguments. It returns a four-item tuple, which denotes the number or QueryResult, Hit, HSP, and HSPFragment objects that were written.

>>> from Bio import SearchIO
>>> qresults = SearchIO.parse('mirna.xml', 'blast-xml')     # read XML file
>>> SearchIO.write(qresults, 'results.tab', 'blast-tab')    # write to tabular file
(3, 239, 277, 277)

You should note different file formats require different attributes of the QueryResult, Hit, HSP and HSPFragment objects. If these attributes are not present, writing won’t work. In other words, you can’t always write to the output format that you want. For example, if you read a BLAST XML file, you wouldn’t be able to write the results to a PSL file as PSL files require attributes not calculated by BLAST (e.g. the number of repeat matches). You can always set these attributes manually, if you really want to write to PSL, though.

Like read, parse, index, and index_db, write also accepts format-specific keyword arguments. Check out the documentation for a complete list of formats Bio.SearchIO can write to and their arguments.

Finally, Bio.SearchIO also provides a convert function, which is simply a shortcut for Bio.SearchIO.parse and Bio.SearchIO.write. Using the convert function, our example above would be:

>>> from Bio import SearchIO
>>> SearchIO.convert('mirna.xml', 'blast-xml', 'results.tab', 'blast-tab')
(3, 239, 277, 277)

As convert uses write, it is only limited to format conversions that have all the required attributes. Here, the BLAST XML file provides all the default values a BLAST tabular file requires, so it works just fine. However, other format conversions are less likely to work since you need to manually assign the required attributes first.

Chapter 9  Accessing NCBI’s Entrez databases

Entrez (http://www.ncbi.nlm.nih.gov/Entrez) is a data retrieval system that provides users access to NCBI’s databases such as PubMed, GenBank, GEO, and many others. You can access Entrez from a web browser to manually enter queries, or you can use Biopython’s Bio.Entrez module for programmatic access to Entrez. The latter allows you for example to search PubMed or download GenBank records from within a Python script.

The Bio.Entrez module makes use of the Entrez Programming Utilities (also known as EUtils), consisting of eight tools that are described in detail on NCBI’s page at http://www.ncbi.nlm.nih.gov/entrez/utils/. Each of these tools corresponds to one Python function in the Bio.Entrez module, as described in the sections below. This module makes sure that the correct URL is used for the queries, and that not more than one request is made every three seconds, as required by NCBI.

The output returned by the Entrez Programming Utilities is typically in XML format. To parse such output, you have several options:

  1. Use Bio.Entrez’s parser to parse the XML output into a Python object;
  2. Use the DOM (Document Object Model) parser in Python’s standard library;
  3. Use the SAX (Simple API for XML) parser in Python’s standard library;
  4. Read the XML output as raw text, and parse it by string searching and manipulation.

For the DOM and SAX parsers, see the Python documentation. The parser in Bio.Entrez is discussed below.

NCBI uses DTD (Document Type Definition) files to describe the structure of the information contained in XML files. Most of the DTD files used by NCBI are included in the Biopython distribution. The Bio.Entrez parser makes use of the DTD files when parsing an XML file returned by NCBI Entrez.

Occasionally, you may find that the DTD file associated with a specific XML file is missing in the Biopython distribution. In particular, this may happen when NCBI updates its DTD files. If this happens, Entrez.read will show a warning message with the name and URL of the missing DTD file. The parser will proceed to access the missing DTD file through the internet, allowing the parsing of the XML file to continue. However, the parser is much faster if the DTD file is available locally. For this purpose, please download the DTD file from the URL in the warning message and place it in the directory ...site-packages/Bio/Entrez/DTDs, containing the other DTD files. If you don’t have write access to this directory, you can also place the DTD file in ~/.biopython/Bio/Entrez/DTDs, where ~ represents your home directory. Since this directory is read before the directory ...site-packages/Bio/Entrez/DTDs, you can also put newer versions of DTD files there if the ones in ...site-packages/Bio/Entrez/DTDs become outdated. Alternatively, if you installed Biopython from source, you can add the DTD file to the source code’s Bio/Entrez/DTDs directory, and reinstall Biopython. This will install the new DTD file in the correct location together with the other DTD files.

The Entrez Programming Utilities can also generate output in other formats, such as the Fasta or GenBank file formats for sequence databases, or the MedLine format for the literature database, discussed in Section 9.12.

9.1  Entrez Guidelines

Before using Biopython to access the NCBI’s online resources (via Bio.Entrez or some of the other modules), please read the NCBI’s Entrez User Requirements. If the NCBI finds you are abusing their systems, they can and will ban your access!

To paraphrase:

  • For any series of more than 100 requests, do this at weekends or outside USA peak times. This is up to you to obey.
  • Use the http://eutils.ncbi.nlm.nih.gov address, not the standard NCBI Web address. Biopython uses this web address.
  • Make no more than three requests every seconds (relaxed from at most one request every three seconds in early 2009). This is automatically enforced by Biopython.
  • Use the optional email parameter so the NCBI can contact you if there is a problem. You can either explicitly set this as a parameter with each call to Entrez (e.g. include email="A.N.Other@example.com" in the argument list), or you can set a global email address:
    >>> from Bio import Entrez
    >>> Entrez.email = "A.N.Other@example.com"
    
    Bio.Entrez will then use this email address with each call to Entrez. The example.com address is a reserved domain name specifically for documentation (RFC 2606). Please DO NOT use a random email – it’s better not to give an email at all. The email parameter will be mandatory from June 1, 2010. In case of excessive usage, NCBI will attempt to contact a user at the e-mail address provided prior to blocking access to the E-utilities.
  • If you are using Biopython within some larger software suite, use the tool parameter to specify this. You can either explicitly set the tool name as a parameter with each call to Entrez (e.g. include tool="MyLocalScript" in the argument list), or you can set a global tool name:
    >>> from Bio import Entrez
    >>> Entrez.tool = "MyLocalScript"
    
    The tool parameter will default to Biopython.
  • For large queries, the NCBI also recommend using their session history feature (the WebEnv session cookie string, see Section 9.15). This is only slightly more complicated.

In conclusion, be sensible with your usage levels. If you plan to download lots of data, consider other options. For example, if you want easy access to all the human genes, consider fetching each chromosome by FTP as a GenBank file, and importing these into your own BioSQL database (see Section 18.5).

9.2  EInfo: Obtaining information about the Entrez databases

EInfo provides field index term counts, last update, and available links for each of NCBI’s databases. In addition, you can use EInfo to obtain a list of all database names accessible through the Entrez utilities:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.einfo()
>>> result = handle.read()

The variable result now contains a list of databases in XML format:

>>> print(result)
<?xml version="1.0"?>
<!DOCTYPE eInfoResult PUBLIC "-//NLM//DTD eInfoResult, 11 May 2002//EN"
 "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eInfo_020511.dtd">
<eInfoResult>
<DbList>
        <DbName>pubmed</DbName>
        <DbName>protein</DbName>
        <DbName>nucleotide</DbName>
        <DbName>nuccore</DbName>
        <DbName>nucgss</DbName>
        <DbName>nucest</DbName>
        <DbName>structure</DbName>
        <DbName>genome</DbName>
        <DbName>books</DbName>
        <DbName>cancerchromosomes</DbName>
        <DbName>cdd</DbName>
        <DbName>gap</DbName>
        <DbName>domains</DbName>
        <DbName>gene</DbName>
        <DbName>genomeprj</DbName>
        <DbName>gensat</DbName>
        <DbName>geo</DbName>
        <DbName>gds</DbName>
        <DbName>homologene</DbName>
        <DbName>journals</DbName>
        <DbName>mesh</DbName>
        <DbName>ncbisearch</DbName>
        <DbName>nlmcatalog</DbName>
        <DbName>omia</DbName>
        <DbName>omim</DbName>
        <DbName>pmc</DbName>
        <DbName>popset</DbName>
        <DbName>probe</DbName>
        <DbName>proteinclusters</DbName>
        <DbName>pcassay</DbName>
        <DbName>pccompound</DbName>
        <DbName>pcsubstance</DbName>
        <DbName>snp</DbName>
        <DbName>taxonomy</DbName>
        <DbName>toolkit</DbName>
        <DbName>unigene</DbName>
        <DbName>unists</DbName>
</DbList>
</eInfoResult>

Since this is a fairly simple XML file, we could extract the information it contains simply by string searching. Using Bio.Entrez’s parser instead, we can directly parse this XML file into a Python object:

>>> from Bio import Entrez
>>> handle = Entrez.einfo()
>>> record = Entrez.read(handle)

Now record is a dictionary with exactly one key:

>>> record.keys()
[u'DbList']

The values stored in this key is the list of database names shown in the XML above:

>>> record["DbList"]
['pubmed', 'protein', 'nucleotide', 'nuccore', 'nucgss', 'nucest',
 'structure', 'genome', 'books', 'cancerchromosomes', 'cdd', 'gap',
 'domains', 'gene', 'genomeprj', 'gensat', 'geo', 'gds', 'homologene',
 'journals', 'mesh', 'ncbisearch', 'nlmcatalog', 'omia', 'omim', 'pmc',
 'popset', 'probe', 'proteinclusters', 'pcassay', 'pccompound',
 'pcsubstance', 'snp', 'taxonomy', 'toolkit', 'unigene', 'unists']

For each of these databases, we can use EInfo again to obtain more information:

>>> handle = Entrez.einfo(db="pubmed")
>>> record = Entrez.read(handle)
>>> record["DbInfo"]["Description"]
'PubMed bibliographic record'
>>> record["DbInfo"]["Count"]
'17989604'
>>> record["DbInfo"]["LastUpdate"]
'2008/05/24 06:45'

Try record["DbInfo"].keys() for other information stored in this record. One of the most useful is a list of possible search fields for use with ESearch:

>>> for field in record["DbInfo"]["FieldList"]:
...     print("%(Name)s, %(FullName)s, %(Description)s" % field)
ALL, All Fields, All terms from all searchable fields
UID, UID, Unique number assigned to publication
FILT, Filter, Limits the records
TITL, Title, Words in title of publication
WORD, Text Word, Free text associated with publication
MESH, MeSH Terms, Medical Subject Headings assigned to publication
MAJR, MeSH Major Topic, MeSH terms of major importance to publication
AUTH, Author, Author(s) of publication
JOUR, Journal, Journal abbreviation of publication
AFFL, Affiliation, Author's institutional affiliation and address
...

That’s a long list, but indirectly this tells you that for the PubMed database, you can do things like Jones[AUTH] to search the author field, or Sanger[AFFL] to restrict to authors at the Sanger Centre. This can be very handy - especially if you are not so familiar with a particular database.

9.3  ESearch: Searching the Entrez databases

To search any of these databases, we use Bio.Entrez.esearch(). For example, let’s search in PubMed for publications related to Biopython:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.esearch(db="pubmed", term="biopython")
>>> record = Entrez.read(handle)
>>> record["IdList"]
['19304878', '18606172', '16403221', '16377612', '14871861', '14630660', '12230038']

In this output, you see seven PubMed IDs (including 19304878 which is the PMID for the Biopython application note), which can be retrieved by EFetch (see section 9.6).

You can also use ESearch to search GenBank. Here we’ll do a quick search for the matK gene in Cypripedioideae orchids (see Section 9.2 about EInfo for one way to find out which fields you can search in each Entrez database):

>>> handle = Entrez.esearch(db="nucleotide", term="Cypripedioideae[Orgn] AND matK[Gene]")
>>> record = Entrez.read(handle)
>>> record["Count"]
'25'
>>> record["IdList"]
['126789333', '37222967', '37222966', '37222965', ..., '61585492']

Each of the IDs (126789333, 37222967, 37222966, …) is a GenBank identifier. See section 9.6 for information on how to actually download these GenBank records.

Note that instead of a species name like Cypripedioideae[Orgn], you can restrict the search using an NCBI taxon identifier, here this would be txid158330[Orgn]. This isn’t currently documented on the ESearch help page - the NCBI explained this in reply to an email query. You can often deduce the search term formatting by playing with the Entrez web interface. For example, including complete[prop] in a genome search restricts to just completed genomes.

As a final example, let’s get a list of computational journal titles:

>>> handle = Entrez.esearch(db="journals", term="computational")
>>> record = Entrez.read(handle)
>>> record["Count"]
'16'
>>> record["IdList"]
['30367', '33843', '33823', '32989', '33190', '33009', '31986',
 '34502', '8799', '22857', '32675', '20258', '33859', '32534',
 '32357', '32249']

Again, we could use EFetch to obtain more information for each of these journal IDs.

ESearch has many useful options — see the ESearch help page for more information.

9.4  EPost: Uploading a list of identifiers

EPost uploads a list of UIs for use in subsequent search strategies; see the EPost help page for more information. It is available from Biopython through the Bio.Entrez.epost() function.

To give an example of when this is useful, suppose you have a long list of IDs you want to download using EFetch (maybe sequences, maybe citations – anything). When you make a request with EFetch your list of IDs, the database etc, are all turned into a long URL sent to the server. If your list of IDs is long, this URL gets long, and long URLs can break (e.g. some proxies don’t cope well).

Instead, you can break this up into two steps, first uploading the list of IDs using EPost (this uses an “HTML post” internally, rather than an “HTML get”, getting round the long URL problem). With the history support, you can then refer to this long list of IDs, and download the associated data with EFetch.

Let’s look at a simple example to see how EPost works – uploading some PubMed identifiers:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> id_list = ["19304878", "18606172", "16403221", "16377612", "14871861", "14630660"]
>>> print(Entrez.epost("pubmed", id=",".join(id_list)).read())
<?xml version="1.0"?>
<!DOCTYPE ePostResult PUBLIC "-//NLM//DTD ePostResult, 11 May 2002//EN"
 "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/ePost_020511.dtd">
<ePostResult>
 <QueryKey>1</QueryKey>
 <WebEnv>NCID_01_206841095_130.14.22.101_9001_1242061629</WebEnv>
</ePostResult>

The returned XML includes two important strings, QueryKey and WebEnv which together define your history session. You would extract these values for use with another Entrez call such as EFetch:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> id_list = ["19304878", "18606172", "16403221", "16377612", "14871861", "14630660"]
>>> search_results = Entrez.read(Entrez.epost("pubmed", id=",".join(id_list)))
>>> webenv = search_results["WebEnv"]
>>> query_key = search_results["QueryKey"] 

Section 9.15 shows how to use the history feature.

9.5  ESummary: Retrieving summaries from primary IDs

ESummary retrieves document summaries from a list of primary IDs (see the ESummary help page for more information). In Biopython, ESummary is available as Bio.Entrez.esummary(). Using the search result above, we can for example find out more about the journal with ID 30367:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.esummary(db="journals", id="30367")
>>> record = Entrez.read(handle)
>>> record[0]["Id"]
'30367'
>>> record[0]["Title"]
'Computational biology and chemistry'
>>> record[0]["Publisher"]
'Pergamon,'

9.6  EFetch: Downloading full records from Entrez

EFetch is what you use when you want to retrieve a full record from Entrez. This covers several possible databases, as described on the main EFetch Help page.

For most of their databases, the NCBI support several different file formats. Requesting a specific file format from Entrez using Bio.Entrez.efetch() requires specifying the rettype and/or retmode optional arguments. The different combinations are described for each database type on the pages linked to on NCBI efetch webpage (e.g. literature, sequences and taxonomy).

One common usage is downloading sequences in the FASTA or GenBank/GenPept plain text formats (which can then be parsed with Bio.SeqIO, see Sections 5.3.1 and 9.6). From the Cypripedioideae example above, we can download GenBank record 186972394 using Bio.Entrez.efetch:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="gb", retmode="text")
>>> print(handle.read())
LOCUS       EU490707                1302 bp    DNA     linear   PLN 05-MAY-2008
DEFINITION  Selenipedium aequinoctiale maturase K (matK) gene, partial cds;
            chloroplast.
ACCESSION   EU490707
VERSION     EU490707.1  GI:186972394
KEYWORDS    .
SOURCE      chloroplast Selenipedium aequinoctiale
  ORGANISM  Selenipedium aequinoctiale
            Eukaryota; Viridiplantae; Streptophyta; Embryophyta; Tracheophyta;
            Spermatophyta; Magnoliophyta; Liliopsida; Asparagales; Orchidaceae;
            Cypripedioideae; Selenipedium.
REFERENCE   1  (bases 1 to 1302)
  AUTHORS   Neubig,K.M., Whitten,W.M., Carlsward,B.S., Blanco,M.A.,
            Endara,C.L., Williams,N.H. and Moore,M.J.
  TITLE     Phylogenetic utility of ycf1 in orchids
  JOURNAL   Unpublished
REFERENCE   2  (bases 1 to 1302)
  AUTHORS   Neubig,K.M., Whitten,W.M., Carlsward,B.S., Blanco,M.A.,
            Endara,C.L., Williams,N.H. and Moore,M.J.
  TITLE     Direct Submission
  JOURNAL   Submitted (14-FEB-2008) Department of Botany, University of
            Florida, 220 Bartram Hall, Gainesville, FL 32611-8526, USA
FEATURES             Location/Qualifiers
     source          1..1302
                     /organism="Selenipedium aequinoctiale"
                     /organelle="plastid:chloroplast"
                     /mol_type="genomic DNA"
                     /specimen_voucher="FLAS:Blanco 2475"
                     /db_xref="taxon:256374"
     gene            <1..>1302
                     /gene="matK"
     CDS             <1..>1302
                     /gene="matK"
                     /codon_start=1
                     /transl_table=11
                     /product="maturase K"
                     /protein_id="ACC99456.1"
                     /db_xref="GI:186972395"
                     /translation="IFYEPVEIFGYDNKSSLVLVKRLITRMYQQNFLISSVNDSNQKG
                     FWGHKHFFSSHFSSQMVSEGFGVILEIPFSSQLVSSLEEKKIPKYQNLRSIHSIFPFL
                     EDKFLHLNYVSDLLIPHPIHLEILVQILQCRIKDVPSLHLLRLLFHEYHNLNSLITSK
                     KFIYAFSKRKKRFLWLLYNSYVYECEYLFQFLRKQSSYLRSTSSGVFLERTHLYVKIE
                     HLLVVCCNSFQRILCFLKDPFMHYVRYQGKAILASKGTLILMKKWKFHLVNFWQSYFH
                     FWSQPYRIHIKQLSNYSFSFLGYFSSVLENHLVVRNQMLENSFIINLLTKKFDTIAPV
                     ISLIGSLSKAQFCTVLGHPISKPIWTDFSDSDILDRFCRICRNLCRYHSGSSKKQVLY
                     RIKYILRLSCARTLARKHKSTVRTFMRRLGSGLLEEFFMEEE"
ORIGIN      
        1 attttttacg aacctgtgga aatttttggt tatgacaata aatctagttt agtacttgtg
       61 aaacgtttaa ttactcgaat gtatcaacag aattttttga tttcttcggt taatgattct
      121 aaccaaaaag gattttgggg gcacaagcat tttttttctt ctcatttttc ttctcaaatg
      181 gtatcagaag gttttggagt cattctggaa attccattct cgtcgcaatt agtatcttct
      241 cttgaagaaa aaaaaatacc aaaatatcag aatttacgat ctattcattc aatatttccc
      301 tttttagaag acaaattttt acatttgaat tatgtgtcag atctactaat accccatccc
      361 atccatctgg aaatcttggt tcaaatcctt caatgccgga tcaaggatgt tccttctttg
      421 catttattgc gattgctttt ccacgaatat cataatttga atagtctcat tacttcaaag
      481 aaattcattt acgccttttc aaaaagaaag aaaagattcc tttggttact atataattct
      541 tatgtatatg aatgcgaata tctattccag tttcttcgta aacagtcttc ttatttacga
      601 tcaacatctt ctggagtctt tcttgagcga acacatttat atgtaaaaat agaacatctt
      661 ctagtagtgt gttgtaattc ttttcagagg atcctatgct ttctcaagga tcctttcatg
      721 cattatgttc gatatcaagg aaaagcaatt ctggcttcaa agggaactct tattctgatg
      781 aagaaatgga aatttcatct tgtgaatttt tggcaatctt attttcactt ttggtctcaa
      841 ccgtatagga ttcatataaa gcaattatcc aactattcct tctcttttct ggggtatttt
      901 tcaagtgtac tagaaaatca tttggtagta agaaatcaaa tgctagagaa ttcatttata
      961 ataaatcttc tgactaagaa attcgatacc atagccccag ttatttctct tattggatca
     1021 ttgtcgaaag ctcaattttg tactgtattg ggtcatccta ttagtaaacc gatctggacc
     1081 gatttctcgg attctgatat tcttgatcga ttttgccgga tatgtagaaa tctttgtcgt
     1141 tatcacagcg gatcctcaaa aaaacaggtt ttgtatcgta taaaatatat acttcgactt
     1201 tcgtgtgcta gaactttggc acggaaacat aaaagtacag tacgcacttt tatgcgaaga
     1261 ttaggttcgg gattattaga agaattcttt atggaagaag aa
//

The arguments rettype="gb" and retmode="text" let us download this record in the GenBank format.

Note that until Easter 2009, the Entrez EFetch API let you use “genbank” as the return type, however the NCBI now insist on using the official return types of “gb” or “gbwithparts” (or “gp” for proteins) as described on online. Also not that until Feb 2012, the Entrez EFetch API would default to returning plain text files, but now defaults to XML.

Alternatively, you could for example use rettype="fasta" to get the Fasta-format; see the EFetch Sequences Help page for other options. Remember – the available formats depend on which database you are downloading from - see the main EFetch Help page.

If you fetch the record in one of the formats accepted by Bio.SeqIO (see Chapter 5), you could directly parse it into a SeqRecord:

>>> from Bio import Entrez, SeqIO
>>> handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="gb", retmode="text")
>>> record = SeqIO.read(handle, "genbank")
>>> handle.close()
>>> print(record)
ID: EU490707.1
Name: EU490707
Description: Selenipedium aequinoctiale maturase K (matK) gene, partial cds; chloroplast.
Number of features: 3
...
Seq('ATTTTTTACGAACCTGTGGAAATTTTTGGTTATGACAATAAATCTAGTTTAGTA...GAA', IUPACAmbiguousDNA())

Note that a more typical use would be to save the sequence data to a local file, and then parse it with Bio.SeqIO. This can save you having to re-download the same file repeatedly while working on your script, and places less load on the NCBI’s servers. For example:

import os
from Bio import SeqIO
from Bio import Entrez
Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
filename = "gi_186972394.gbk"
if not os.path.isfile(filename):
    # Downloading...
    net_handle = Entrez.efetch(db="nucleotide",id="186972394",rettype="gb", retmode="text")
    out_handle = open(filename, "w")
    out_handle.write(net_handle.read())
    out_handle.close()
    net_handle.close()
    print("Saved")

print("Parsing...")
record = SeqIO.read(filename, "genbank")
print(record)

To get the output in XML format, which you can parse using the Bio.Entrez.read() function, use retmode="xml":

>>> from Bio import Entrez
>>> handle = Entrez.efetch(db="nucleotide", id="186972394", retmode="xml")
>>> record = Entrez.read(handle)
>>> handle.close()
>>> record[0]["GBSeq_definition"] 
'Selenipedium aequinoctiale maturase K (matK) gene, partial cds; chloroplast'
>>> record[0]["GBSeq_source"] 
'chloroplast Selenipedium aequinoctiale'

So, that dealt with sequences. For examples of parsing file formats specific to the other databases (e.g. the MEDLINE format used in PubMed), see Section 9.12.

If you want to perform a search with Bio.Entrez.esearch(), and then download the records with Bio.Entrez.efetch(), you should use the WebEnv history feature – see Section 9.15.

9.7  ELink: Searching for related items in NCBI Entrez

ELink, available from Biopython as Bio.Entrez.elink(), can be used to find related items in the NCBI Entrez databases. For example, you can us this to find nucleotide entries for an entry in the gene database, and other cool stuff.

Let’s use ELink to find articles related to the Biopython application note published in Bioinformatics in 2009. The PubMed ID of this article is 19304878:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"
>>> pmid = "19304878"
>>> record = Entrez.read(Entrez.elink(dbfrom="pubmed", id=pmid))

The record variable consists of a Python list, one for each database in which we searched. Since we specified only one PubMed ID to search for, record contains only one item. This item is a dictionary containing information about our search term, as well as all the related items that were found:

>>> record[0]["DbFrom"]
'pubmed'
>>> record[0]["IdList"]
['19304878']

The "LinkSetDb" key contains the search results, stored as a list consisting of one item for each target database. In our search results, we only find hits in the PubMed database (although sub-divided into categories):

>>> len(record[0]["LinkSetDb"])
5
>>> for linksetdb in record[0]["LinkSetDb"]:
...     print(linksetdb["DbTo"], linksetdb["LinkName"], len(linksetdb["Link"]))
... 
pubmed pubmed_pubmed 110
pubmed pubmed_pubmed_combined 6
pubmed pubmed_pubmed_five 6
pubmed pubmed_pubmed_reviews 5
pubmed pubmed_pubmed_reviews_five 5

The actual search results are stored as under the "Link" key. In total, 110 items were found under standard search. Let’s now at the first search result:

>>> record[0]["LinkSetDb"][0]["Link"][0]
{u'Id': '19304878'}

This is the article we searched for, which doesn’t help us much, so let’s look at the second search result:

>>> record[0]["LinkSetDb"][0]["Link"][1]
{u'Id': '14630660'}

This paper, with PubMed ID 14630660, is about the Biopython PDB parser.

We can use a loop to print out all PubMed IDs:

>>> for link in record[0]["LinkSetDb"][0]["Link"]:
...     print(link["Id"])
19304878
14630660
18689808
17121776
16377612
12368254
......

Now that was nice, but personally I am often more interested to find out if a paper has been cited. Well, ELink can do that too – at least for journals in Pubmed Central (see Section 9.15.3).

For help on ELink, see the ELink help page. There is an entire sub-page just for the link names, describing how different databases can be cross referenced.

9.8  EGQuery: Global Query - counts for search terms

EGQuery provides counts for a search term in each of the Entrez databases (i.e. a global query). This is particularly useful to find out how many items your search terms would find in each database without actually performing lots of separate searches with ESearch (see the example in 9.14.2 below).

In this example, we use Bio.Entrez.egquery() to obtain the counts for “Biopython”:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.egquery(term="biopython")
>>> record = Entrez.read(handle)
>>> for row in record["eGQueryResult"]:
...     print(row["DbName"], row["Count"])
... 
pubmed 6
pmc 62
journals 0
...

See the EGQuery help page for more information.

9.9  ESpell: Obtaining spelling suggestions

ESpell retrieves spelling suggestions. In this example, we use Bio.Entrez.espell() to obtain the correct spelling of Biopython:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.espell(term="biopythooon")
>>> record = Entrez.read(handle)
>>> record["Query"]
'biopythooon'
>>> record["CorrectedQuery"]
'biopython'

See the ESpell help page for more information. The main use of this is for GUI tools to provide automatic suggestions for search terms.

9.10  Parsing huge Entrez XML files

The Entrez.read function reads the entire XML file returned by Entrez into a single Python object, which is kept in memory. To parse Entrez XML files too large to fit in memory, you can use the function Entrez.parse. This is a generator function that reads records in the XML file one by one. This function is only useful if the XML file reflects a Python list object (in other words, if Entrez.read on a computer with infinite memory resources would return a Python list).

For example, you can download the entire Entrez Gene database for a given organism as a file from NCBI’s ftp site. These files can be very large. As an example, on September 4, 2009, the file Homo_sapiens.ags.gz, containing the Entrez Gene database for human, had a size of 116576 kB. This file, which is in the ASN format, can be converted into an XML file using NCBI’s gene2xml program (see NCBI’s ftp site for more information):

gene2xml -b T -i Homo_sapiens.ags -o Homo_sapiens.xml

The resulting XML file has a size of 6.1 GB. Attempting Entrez.read on this file will result in a MemoryError on many computers.

The XML file Homo_sapiens.xml consists of a list of Entrez gene records, each corresponding to one Entrez gene in human. Entrez.parse retrieves these gene records one by one. You can then print out or store the relevant information in each record by iterating over the records. For example, this script iterates over the Entrez gene records and prints out the gene numbers and names for all current genes:

>>> from Bio import Entrez
>>> handle = open("Homo_sapiens.xml")
>>> records = Entrez.parse(handle)

>>> for record in records:
...     status = record['Entrezgene_track-info']['Gene-track']['Gene-track_status']
...     if status.attributes['value']=='discontinued':
...         continue
...     geneid = record['Entrezgene_track-info']['Gene-track']['Gene-track_geneid']
...     genename = record['Entrezgene_gene']['Gene-ref']['Gene-ref_locus']
...     print(geneid, genename)

This will print:

1 A1BG
2 A2M
3 A2MP
8 AA
9 NAT1
10 NAT2
11 AACP
12 SERPINA3
13 AADAC
14 AAMP
15 AANAT
16 AARS
17 AAVS1
...

9.11  Handling errors

Three things can go wrong when parsing an XML file:

  • The file may not be an XML file to begin with;
  • The file may end prematurely or otherwise be corrupted;
  • The file may be correct XML, but contain items that are not represented in the associated DTD.

The first case occurs if, for example, you try to parse a Fasta file as if it were an XML file:

>>> from Bio import Entrez
>>> handle = open("NC_005816.fna") # a Fasta file
>>> record = Entrez.read(handle)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read
    record = handler.read(handle)
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 164, in read
    raise NotXMLError(e)
Bio.Entrez.Parser.NotXMLError: Failed to parse the XML data (syntax error: line 1, column 0). Please make sure that the input data are in XML format.

Here, the parser didn’t find the <?xml ... tag with which an XML file is supposed to start, and therefore decides (correctly) that the file is not an XML file.

When your file is in the XML format but is corrupted (for example, by ending prematurely), the parser will raise a CorruptedXMLError. Here is an example of an XML file that ends prematurely:

<?xml version="1.0"?>
<!DOCTYPE eInfoResult PUBLIC "-//NLM//DTD eInfoResult, 11 May 2002//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eInfo_020511.dtd">
<eInfoResult>
<DbList>
        <DbName>pubmed</DbName>
        <DbName>protein</DbName>
        <DbName>nucleotide</DbName>
        <DbName>nuccore</DbName>
        <DbName>nucgss</DbName>
        <DbName>nucest</DbName>
        <DbName>structure</DbName>
        <DbName>genome</DbName>
        <DbName>books</DbName>
        <DbName>cancerchromosomes</DbName>
        <DbName>cdd</DbName>

which will generate the following traceback:

>>> Entrez.read(handle)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read
    record = handler.read(handle)
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 160, in read
    raise CorruptedXMLError(e)
Bio.Entrez.Parser.CorruptedXMLError: Failed to parse the XML data (no element found: line 16, column 0). Please make sure that the input data are not corrupted.

>>>

Note that the error message tells you at what point in the XML file the error was detected.

The third type of error occurs if the XML file contains tags that do not have a description in the corresponding DTD file. This is an example of such an XML file:

<?xml version="1.0"?>
<!DOCTYPE eInfoResult PUBLIC "-//NLM//DTD eInfoResult, 11 May 2002//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eInfo_020511.dtd">
<eInfoResult>
        <DbInfo>
        <DbName>pubmed</DbName>
        <MenuName>PubMed</MenuName>
        <Description>PubMed bibliographic record</Description>
        <Count>20161961</Count>
        <LastUpdate>2010/09/10 04:52</LastUpdate>
        <FieldList>
                <Field>
...
                </Field>
        </FieldList>
        <DocsumList>
                <Docsum>
                        <DsName>PubDate</DsName>
                        <DsType>4</DsType>
                        <DsTypeName>string</DsTypeName>
                </Docsum>
                <Docsum>
                        <DsName>EPubDate</DsName>
...
        </DbInfo>
</eInfoResult>

In this file, for some reason the tag <DocsumList> (and several others) are not listed in the DTD file eInfo_020511.dtd, which is specified on the second line as the DTD for this XML file. By default, the parser will stop and raise a ValidationError if it cannot find some tag in the DTD:

>>> from Bio import Entrez
>>> handle = open("einfo3.xml")
>>> record = Entrez.read(handle)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read
    record = handler.read(handle)
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 154, in read
    self.parser.ParseFile(handle)
  File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 246, in startElementHandler
    raise ValidationError(name)
Bio.Entrez.Parser.ValidationError: Failed to find tag 'DocsumList' in the DTD. To skip all tags that are not represented in the DTD, please call Bio.Entrez.read or Bio.Entrez.parse with validate=False.

Optionally, you can instruct the parser to skip such tags instead of raising a ValidationError. This is done by calling Entrez.read or Entrez.parse with the argument validate equal to False:

>>> from Bio import Entrez
>>> handle = open("einfo3.xml")
>>> record = Entrez.read(handle, validate=False)
>>>

Of course, the information contained in the XML tags that are not in the DTD are not present in the record returned by Entrez.read.

9.12  Specialized parsers

The Bio.Entrez.read() function can parse most (if not all) XML output returned by Entrez. Entrez typically allows you to retrieve records in other formats, which may have some advantages compared to the XML format in terms of readability (or download size).

To request a specific file format from Entrez using Bio.Entrez.efetch() requires specifying the rettype and/or retmode optional arguments. The different combinations are described for each database type on the NCBI efetch webpage.

One obvious case is you may prefer to download sequences in the FASTA or GenBank/GenPept plain text formats (which can then be parsed with Bio.SeqIO, see Sections 5.3.1 and 9.6). For the literature databases, Biopython contains a parser for the MEDLINE format used in PubMed.

9.12.1  Parsing Medline records

You can find the Medline parser in Bio.Medline. Suppose we want to parse the file pubmed_result1.txt, containing one Medline record. You can find this file in Biopython’s Tests\Medline directory. The file looks like this:

PMID- 12230038
OWN - NLM
STAT- MEDLINE
DA  - 20020916
DCOM- 20030606
LR  - 20041117
PUBM- Print
IS  - 1467-5463 (Print)
VI  - 3
IP  - 3
DP  - 2002 Sep
TI  - The Bio* toolkits--a brief overview.
PG  - 296-302
AB  - Bioinformatics research is often difficult to do with commercial software. The
      Open Source BioPerl, BioPython and Biojava projects provide toolkits with
...

We first open the file and then parse it:

>>> from Bio import Medline
>>> input = open("pubmed_result1.txt")
>>> record = Medline.read(input)

The record now contains the Medline record as a Python dictionary:

>>> record["PMID"]
'12230038'
>>> record["AB"]
'Bioinformatics research is often difficult to do with commercial software.
The Open Source BioPerl, BioPython and Biojava projects provide toolkits with
multiple functionality that make it easier to create customised pipelines or
analysis. This review briefly compares the quirks of the underlying languages
and the functionality, documentation, utility and relative advantages of the
Bio counterparts, particularly from the point of view of the beginning
biologist programmer.'

The key names used in a Medline record can be rather obscure; use

>>> help(record)

for a brief summary.

To parse a file containing multiple Medline records, you can use the parse function instead:

>>> from Bio import Medline
>>> input = open("pubmed_result2.txt")
>>> records = Medline.parse(input)
>>> for record in records:
...     print(record["TI"])
A high level interface to SCOP and ASTRAL implemented in python.
GenomeDiagram: a python package for the visualization of large-scale genomic data.
Open source clustering software.
PDB file parser and structure class implemented in Python.

Instead of parsing Medline records stored in files, you can also parse Medline records downloaded by Bio.Entrez.efetch. For example, let’s look at all Medline records in PubMed related to Biopython:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.esearch(db="pubmed", term="biopython")
>>> record = Entrez.read(handle)
>>> record["IdList"]
['19304878', '18606172', '16403221', '16377612', '14871861', '14630660', '12230038']

We now use Bio.Entrez.efetch to download these Medline records:

>>> idlist = record["IdList"]
>>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="text")

Here, we specify rettype="medline", retmode="text" to obtain the Medline records in plain-text Medline format. Now we use Bio.Medline to parse these records:

>>> from Bio import Medline
>>> records = Medline.parse(handle)
>>> for record in records:
...     print(record["AU"])
['Cock PJ', 'Antao T', 'Chang JT', 'Chapman BA', 'Cox CJ', 'Dalke A', ..., 'de Hoon MJ']
['Munteanu CR', 'Gonzalez-Diaz H', 'Magalhaes AL']
['Casbon JA', 'Crooks GE', 'Saqi MA']
['Pritchard L', 'White JA', 'Birch PR', 'Toth IK']
['de Hoon MJ', 'Imoto S', 'Nolan J', 'Miyano S']
['Hamelryck T', 'Manderick B']
['Mangalam H']

For comparison, here we show an example using the XML format:

>>> idlist = record["IdList"]
>>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="xml")
>>> records = Entrez.read(handle)
>>> for record in records:
...     print(record["MedlineCitation"]["Article"]["ArticleTitle"])
Biopython: freely available Python tools for computational molecular biology and
 bioinformatics.
Enzymes/non-enzymes classification model complexity based on composition, sequence,
 3D and topological indices.
A high level interface to SCOP and ASTRAL implemented in python.
GenomeDiagram: a python package for the visualization of large-scale genomic data.
Open source clustering software.
PDB file parser and structure class implemented in Python.
The Bio* toolkits--a brief overview.

Note that in both of these examples, for simplicity we have naively combined ESearch and EFetch. In this situation, the NCBI would expect you to use their history feature, as illustrated in Section 9.15.

9.12.2  Parsing GEO records

GEO (Gene Expression Omnibus) is a data repository of high-throughput gene expression and hybridization array data. The Bio.Geo module can be used to parse GEO-formatted data.

The following code fragment shows how to parse the example GEO file GSE16.txt into a record and print the record:

>>> from Bio import Geo
>>> handle = open("GSE16.txt")
>>> records = Geo.parse(handle)
>>> for record in records:
...     print(record)

You can search the “gds” database (GEO datasets) with ESearch:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are
>>> handle = Entrez.esearch(db="gds", term="GSE16")
>>> record = Entrez.read(handle)
>>> record["Count"]
2
>>> record["IdList"]
['200000016', '100000028']

From the Entrez website, UID “200000016” is GDS16 while the other hit “100000028” is for the associated platform, GPL28. Unfortunately, at the time of writing the NCBI don’t seem to support downloading GEO files using Entrez (not as XML, nor in the Simple Omnibus Format in Text (SOFT) format).

However, it is actually pretty straight forward to download the GEO files by FTP from ftp://ftp.ncbi.nih.gov/pub/geo/ instead. In this case you might want ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SOFT/by_series/GSE16/GSE16_family.soft.gz (a compressed file, see the Python module gzip).

9.12.3  Parsing UniGene records

UniGene is an NCBI database of the transcriptome, with each UniGene record showing the set of transcripts that are associated with a particular gene in a specific organism. A typical UniGene record looks like this:

ID          Hs.2
TITLE       N-acetyltransferase 2 (arylamine N-acetyltransferase)
GENE        NAT2
CYTOBAND    8p22
GENE_ID     10
LOCUSLINK   10
HOMOL       YES
EXPRESS      bone| connective tissue| intestine| liver| liver tumor| normal| soft tissue/muscle tissue tumor| adult
RESTR_EXPR   adult
CHROMOSOME  8
STS         ACC=PMC310725P3 UNISTS=272646
STS         ACC=WIAF-2120 UNISTS=44576
STS         ACC=G59899 UNISTS=137181
...
STS         ACC=GDB:187676 UNISTS=155563
PROTSIM     ORG=10090; PROTGI=6754794; PROTID=NP_035004.1; PCT=76.55; ALN=288
PROTSIM     ORG=9796; PROTGI=149742490; PROTID=XP_001487907.1; PCT=79.66; ALN=288
PROTSIM     ORG=9986; PROTGI=126722851; PROTID=NP_001075655.1; PCT=76.90; ALN=288
...
PROTSIM     ORG=9598; PROTGI=114619004; PROTID=XP_519631.2; PCT=98.28; ALN=288

SCOUNT      38
SEQUENCE    ACC=BC067218.1; NID=g45501306; PID=g45501307; SEQTYPE=mRNA
SEQUENCE    ACC=NM_000015.2; NID=g116295259; PID=g116295260; SEQTYPE=mRNA
SEQUENCE    ACC=D90042.1; NID=g219415; PID=g219416; SEQTYPE=mRNA
SEQUENCE    ACC=D90040.1; NID=g219411; PID=g219412; SEQTYPE=mRNA
SEQUENCE    ACC=BC015878.1; NID=g16198419; PID=g16198420; SEQTYPE=mRNA
SEQUENCE    ACC=CR407631.1; NID=g47115198; PID=g47115199; SEQTYPE=mRNA
SEQUENCE    ACC=BG569293.1; NID=g13576946; CLONE=IMAGE:4722596; END=5'; LID=6989; SEQTYPE=EST; TRACE=44157214
...
SEQUENCE    ACC=AU099534.1; NID=g13550663; CLONE=HSI08034; END=5'; LID=8800; SEQTYPE=EST
//

This particular record shows the set of transcripts (shown in the SEQUENCE lines) that originate from the human gene NAT2, encoding en N-acetyltransferase. The PROTSIM lines show proteins with significant similarity to NAT2, whereas the STS lines show the corresponding sequence-tagged sites in the genome.

To parse UniGene files, use the Bio.UniGene module:

>>> from Bio import UniGene
>>> input = open("myunigenefile.data")
>>> record = UniGene.read(input)

The record returned by UniGene.read is a Python object with attributes corresponding to the fields in the UniGene record. For example,

>>> record.ID
"Hs.2"
>>> record.title
"N-acetyltransferase 2 (arylamine N-acetyltransferase)"

The EXPRESS and RESTR_EXPR lines are stored as Python lists of strings:

['bone', 'connective tissue', 'intestine', 'liver', 'liver tumor', 'normal', 'soft tissue/muscle tissue tumor', 'adult']

Specialized objects are returned for the STS, PROTSIM, and SEQUENCE lines, storing the keys shown in each line as attributes:

>>> record.sts[0].acc
'PMC310725P3'
>>> record.sts[0].unists
'272646'

and similarly for the PROTSIM and SEQUENCE lines.

To parse a file containing more than one UniGene record, use the parse function in Bio.UniGene:

>>> from Bio import UniGene
>>> input = open("unigenerecords.data")
>>> records = UniGene.parse(input)
>>> for record in records:
...     print(record.ID)

9.13  Using a proxy

Normally you won’t have to worry about using a proxy, but if this is an issue on your network here is how to deal with it. Internally, Bio.Entrez uses the standard Python library urllib for accessing the NCBI servers. This will check an environment variable called http_proxy to configure any simple proxy automatically. Unfortunately this module does not support the use of proxies which require authentication.

You may choose to set the http_proxy environment variable once (how you do this will depend on your operating system). Alternatively you can set this within Python at the start of your script, for example:

import os
os.environ["http_proxy"] = "http://proxyhost.example.com:8080"

See the urllib documentation for more details.

9.14  Examples

9.14.1  PubMed and Medline

If you are in the medical field or interested in human issues (and many times even if you are not!), PubMed (http://www.ncbi.nlm.nih.gov/PubMed/) is an excellent source of all kinds of goodies. So like other things, we’d like to be able to grab information from it and use it in Python scripts.

In this example, we will query PubMed for all articles having to do with orchids (see section 2.3 for our motivation). We first check how many of such articles there are:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.egquery(term="orchid")
>>> record = Entrez.read(handle)
>>> for row in record["eGQueryResult"]:
...     if row["DbName"]=="pubmed":
...         print(row["Count"])
463

Now we use the Bio.Entrez.efetch function to download the PubMed IDs of these 463 articles:

>>> handle = Entrez.esearch(db="pubmed", term="orchid", retmax=463)
>>> record = Entrez.read(handle)
>>> idlist = record["IdList"]
>>> print(idlist)

This returns a Python list containing all of the PubMed IDs of articles related to orchids:

['18680603', '18665331', '18661158', '18627489', '18627452', '18612381',
'18594007', '18591784', '18589523', '18579475', '18575811', '18575690',
...

Now that we’ve got them, we obviously want to get the corresponding Medline records and extract the information from them. Here, we’ll download the Medline records in the Medline flat-file format, and use the Bio.Medline module to parse them:

>>> from Bio import Medline
>>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline",
                           retmode="text")
>>> records = Medline.parse(handle)

NOTE - We’ve just done a separate search and fetch here, the NCBI much prefer you to take advantage of their history support in this situation. See Section 9.15.

Keep in mind that records is an iterator, so you can iterate through the records only once. If you want to save the records, you can convert them to a list:

>>> records = list(records)

Let’s now iterate over the records to print out some information about each record:

>>> for record in records:
...     print("title:", record.get("TI", "?"))
...     print("authors:", record.get("AU", "?"))
...     print("source:", record.get("SO", "?"))
...     print("")

The output for this looks like:

title: Sex pheromone mimicry in the early spider orchid (ophrys sphegodes):
patterns of hydrocarbons as the key mechanism for pollination by sexual
deception [In Process Citation]
authors: ['Schiestl FP', 'Ayasse M', 'Paulus HF', 'Lofstedt C', 'Hansson BS',
'Ibarra F', 'Francke W']
source: J Comp Physiol [A] 2000 Jun;186(6):567-74

Especially interesting to note is the list of authors, which is returned as a standard Python list. This makes it easy to manipulate and search using standard Python tools. For instance, we could loop through a whole bunch of entries searching for a particular author with code like the following:

>>> search_author = "Waits T"

>>> for record in records:
...     if not "AU" in record:
...         continue
...     if search_author in record["AU"]:
...         print("Author %s found: %s" % (search_author, record["SO"]))

Hopefully this section gave you an idea of the power and flexibility of the Entrez and Medline interfaces and how they can be used together.

9.14.2  Searching, downloading, and parsing Entrez Nucleotide records

Here we’ll show a simple example of performing a remote Entrez query. In section 2.3 of the parsing examples, we talked about using NCBI’s Entrez website to search the NCBI nucleotide databases for info on Cypripedioideae, our friends the lady slipper orchids. Now, we’ll look at how to automate that process using a Python script. In this example, we’ll just show how to connect, get the results, and parse them, with the Entrez module doing all of the work.

First, we use EGQuery to find out the number of results we will get before actually downloading them. EGQuery will tell us how many search results were found in each of the databases, but for this example we are only interested in nucleotides:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.egquery(term="Cypripedioideae")
>>> record = Entrez.read(handle)
>>> for row in record["eGQueryResult"]:
...     if row["DbName"]=="nuccore":
...         print(row["Count"])
814

So, we expect to find 814 Entrez Nucleotide records (this is the number I obtained in 2008; it is likely to increase in the future). If you find some ridiculously high number of hits, you may want to reconsider if you really want to download all of them, which is our next step:

>>> from Bio import Entrez
>>> handle = Entrez.esearch(db="nucleotide", term="Cypripedioideae", retmax=814)
>>> record = Entrez.read(handle)

Here, record is a Python dictionary containing the search results and some auxiliary information. Just for information, let’s look at what is stored in this dictionary:

>>> print(record.keys())
[u'Count', u'RetMax', u'IdList', u'TranslationSet', u'RetStart', u'QueryTranslation']

First, let’s check how many results were found:

>>> print(record["Count"])
'814'

which is the number we expected. The 814 results are stored in record['IdList']:

>>> len(record["IdList"])
814

Let’s look at the first five results:

>>> record["IdList"][:5]
['187237168', '187372713', '187372690', '187372688', '187372686']

We can download these records using efetch. While you could download these records one by one, to reduce the load on NCBI’s servers, it is better to fetch a bunch of records at the same time, shown below. However, in this situation you should ideally be using the history feature described later in Section 9.15.

>>> idlist = ",".join(record["IdList"][:5])
>>> print(idlist)
187237168,187372713,187372690,187372688,187372686
>>> handle = Entrez.efetch(db="nucleotide", id=idlist, retmode="xml")
>>> records = Entrez.read(handle)
>>> len(records)
5

Each of these records corresponds to one GenBank record.

>>> print(records[0].keys())
[u'GBSeq_moltype', u'GBSeq_source', u'GBSeq_sequence',
 u'GBSeq_primary-accession', u'GBSeq_definition', u'GBSeq_accession-version',
 u'GBSeq_topology', u'GBSeq_length', u'GBSeq_feature-table',
 u'GBSeq_create-date', u'GBSeq_other-seqids', u'GBSeq_division',
 u'GBSeq_taxonomy', u'GBSeq_references', u'GBSeq_update-date',
 u'GBSeq_organism', u'GBSeq_locus', u'GBSeq_strandedness']

>>> print(records[0]["GBSeq_primary-accession"])
DQ110336

>>> print(records[0]["GBSeq_other-seqids"])
['gb|DQ110336.1|', 'gi|187237168']

>>> print(records[0]["GBSeq_definition"])
Cypripedium calceolus voucher Davis 03-03 A maturase (matR) gene, partial cds;
mitochondrial

>>> print(records[0]["GBSeq_organism"])
Cypripedium calceolus

You could use this to quickly set up searches – but for heavy usage, see Section 9.15.

9.14.3  Searching, downloading, and parsing GenBank records

The GenBank record format is a very popular method of holding information about sequences, sequence features, and other associated sequence information. The format is a good way to get information from the NCBI databases at http://www.ncbi.nlm.nih.gov/.

In this example we’ll show how to query the NCBI databases,to retrieve the records from the query, and then parse them using Bio.SeqIO - something touched on in Section 5.3.1. For simplicity, this example does not take advantage of the WebEnv history feature – see Section 9.15 for this.

First, we want to make a query and find out the ids of the records to retrieve. Here we’ll do a quick search for one of our favorite organisms, Opuntia (prickly-pear cacti). We can do quick search and get back the GIs (GenBank identifiers) for all of the corresponding records. First we check how many records there are:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.egquery(term="Opuntia AND rpl16")
>>> record = Entrez.read(handle)
>>> for row in record["eGQueryResult"]:
...     if row["DbName"]=="nuccore":
...         print(row["Count"])
...
9

Now we download the list of GenBank identifiers:

>>> handle = Entrez.esearch(db="nuccore", term="Opuntia AND rpl16")
>>> record = Entrez.read(handle)
>>> gi_list = record["IdList"]
>>> gi_list
['57240072', '57240071', '6273287', '6273291', '6273290', '6273289', '6273286',
'6273285', '6273284']

Now we use these GIs to download the GenBank records - note that with older versions of Biopython you had to supply a comma separated list of GI numbers to Entrez, as of Biopython 1.59 you can pass a list and this is converted for you:

>>> gi_str = ",".join(gi_list)
>>> handle = Entrez.efetch(db="nuccore", id=gi_str, rettype="gb", retmode="text")

If you want to look at the raw GenBank files, you can read from this handle and print out the result:

>>> text = handle.read()
>>> print(text)
LOCUS       AY851612                 892 bp    DNA     linear   PLN 10-APR-2007
DEFINITION  Opuntia subulata rpl16 gene, intron; chloroplast.
ACCESSION   AY851612
VERSION     AY851612.1  GI:57240072
KEYWORDS    .
SOURCE      chloroplast Austrocylindropuntia subulata
  ORGANISM  Austrocylindropuntia subulata
            Eukaryota; Viridiplantae; Streptophyta; Embryophyta; Tracheophyta;
            Spermatophyta; Magnoliophyta; eudicotyledons; core eudicotyledons;
            Caryophyllales; Cactaceae; Opuntioideae; Austrocylindropuntia.
REFERENCE   1  (bases 1 to 892)
  AUTHORS   Butterworth,C.A. and Wallace,R.S.
...

In this case, we are just getting the raw records. To get the records in a more Python-friendly form, we can use Bio.SeqIO to parse the GenBank data into SeqRecord objects, including SeqFeature objects (see Chapter 5):

>>> from Bio import SeqIO
>>> handle = Entrez.efetch(db="nuccore", id=gi_str, rettype="gb", retmode="text")
>>> records = SeqIO.parse(handle, "gb")

We can now step through the records and look at the information we are interested in:

>>> for record in records: 
>>> ...    print("%s, length %i, with %i features" \
>>> ...           % (record.name, len(record), len(record.features)))
AY851612, length 892, with 3 features
AY851611, length 881, with 3 features
AF191661, length 895, with 3 features
AF191665, length 902, with 3 features
AF191664, length 899, with 3 features
AF191663, length 899, with 3 features
AF191660, length 893, with 3 features
AF191659, length 894, with 3 features
AF191658, length 896, with 3 features

Using these automated query retrieval functionality is a big plus over doing things by hand. Although the module should obey the NCBI’s max three queries per second rule, the NCBI have other recommendations like avoiding peak hours. See Section 9.1. In particular, please note that for simplicity, this example does not use the WebEnv history feature. You should use this for any non-trivial search and download work, see Section 9.15.

Finally, if plan to repeat your analysis, rather than downloading the files from the NCBI and parsing them immediately (as shown in this example), you should just download the records once and save them to your hard disk, and then parse the local file.

9.14.4  Finding the lineage of an organism

Staying with a plant example, let’s now find the lineage of the Cypripedioideae orchid family. First, we search the Taxonomy database for Cypripedioideae, which yields exactly one NCBI taxonomy identifier:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.esearch(db="Taxonomy", term="Cypripedioideae")
>>> record = Entrez.read(handle)
>>> record["IdList"]
['158330']
>>> record["IdList"][0]
'158330'

Now, we use efetch to download this entry in the Taxonomy database, and then parse it:

>>> handle = Entrez.efetch(db="Taxonomy", id="158330", retmode="xml")
>>> records = Entrez.read(handle)

Again, this record stores lots of information:

>>> records[0].keys()
[u'Lineage', u'Division', u'ParentTaxId', u'PubDate', u'LineageEx',
 u'CreateDate', u'TaxId', u'Rank', u'GeneticCode', u'ScientificName',
 u'MitoGeneticCode', u'UpdateDate']

We can get the lineage directly from this record:

>>> records[0]["Lineage"]
'cellular organisms; Eukaryota; Viridiplantae; Streptophyta; Streptophytina;
 Embryophyta; Tracheophyta; Euphyllophyta; Spermatophyta; Magnoliophyta;
 Liliopsida; Asparagales; Orchidaceae'

The record data contains much more than just the information shown here - for example look under "LineageEx" instead of "Lineage" and you’ll get the NCBI taxon identifiers of the lineage entries too.

9.15  Using the history and WebEnv

Often you will want to make a series of linked queries. Most typically, running a search, perhaps refining the search, and then retrieving detailed search results. You can do this by making a series of separate calls to Entrez. However, the NCBI prefer you to take advantage of their history support - for example combining ESearch and EFetch.

Another typical use of the history support would be to combine EPost and EFetch. You use EPost to upload a list of identifiers, which starts a new history session. You then download the records with EFetch by referring to the session (instead of the identifiers).

9.15.1  Searching for and downloading sequences using the history

Suppose we want to search and download all the Opuntia rpl16 nucleotide sequences, and store them in a FASTA file. As shown in Section 9.14.3, we can naively combine Bio.Entrez.esearch() to get a list of GI numbers, and then call Bio.Entrez.efetch() to download them all.

However, the approved approach is to run the search with the history feature. Then, we can fetch the results by reference to the search results - which the NCBI can anticipate and cache.

To do this, call Bio.Entrez.esearch() as normal, but with the additional argument of usehistory="y",

>>> from Bio import Entrez
>>> Entrez.email = "history.user@example.com"
>>> search_handle = Entrez.esearch(db="nucleotide",term="Opuntia[orgn] and rpl16",
                                   usehistory="y")
>>> search_results = Entrez.read(search_handle)
>>> search_handle.close()

When you get the XML output back, it will still include the usual search results:

>>> gi_list = search_results["IdList"]
>>> count = int(search_results["Count"])
>>> assert count == len(gi_list)

However, you also get given two additional pieces of information, the WebEnv session cookie, and the QueryKey:

>>> webenv = search_results["WebEnv"]
>>> query_key = search_results["QueryKey"] 

Having stored these values in variables session_cookie and query_key we can use them as parameters to Bio.Entrez.efetch() instead of giving the GI numbers as identifiers.

While for small searches you might be OK downloading everything at once, it is better to download in batches. You use the retstart and retmax parameters to specify which range of search results you want returned (starting entry using zero-based counting, and maximum number of results to return). For example,

batch_size = 3
out_handle = open("orchid_rpl16.fasta", "w")
for start in range(0,count,batch_size):
    end = min(count, start+batch_size)
    print("Going to download record %i to %i" % (start+1, end))
    fetch_handle = Entrez.efetch(db="nucleotide", rettype="fasta", retmode="text",
                                 retstart=start, retmax=batch_size,
                                 webenv=webenv, query_key=query_key)
    data = fetch_handle.read()
    fetch_handle.close()
    out_handle.write(data)
out_handle.close()

For illustrative purposes, this example downloaded the FASTA records in batches of three. Unless you are downloading genomes or chromosomes, you would normally pick a larger batch size.

9.15.2  Searching for and downloading abstracts using the history

Here is another history example, searching for papers published in the last year about the Opuntia, and then downloading them into a file in MedLine format:

from Bio import Entrez
Entrez.email = "history.user@example.com"
search_results = Entrez.read(Entrez.esearch(db="pubmed",
                                            term="Opuntia[ORGN]",
                                            reldate=365, datetype="pdat",
                                            usehistory="y"))
count = int(search_results["Count"])
print("Found %i results" % count)

batch_size = 10
out_handle = open("recent_orchid_papers.txt", "w")
for start in range(0,count,batch_size):
    end = min(count, start+batch_size)
    print("Going to download record %i to %i" % (start+1, end))
    fetch_handle = Entrez.efetch(db="pubmed",
                                 rettype="medline", retmode="text",
                                 retstart=start, retmax=batch_size,
                                 webenv=search_results["WebEnv"],
                                 query_key=search_results["QueryKey"])
    data = fetch_handle.read()
    fetch_handle.close()
    out_handle.write(data)
out_handle.close()

At the time of writing, this gave 28 matches - but because this is a date dependent search, this will of course vary. As described in Section 9.12.1 above, you can then use Bio.Medline to parse the saved records.

9.15.3  Searching for citations

Back in Section 9.7 we mentioned ELink can be used to search for citations of a given paper. Unfortunately this only covers journals indexed for PubMed Central (doing it for all the journals in PubMed would mean a lot more work for the NIH). Let’s try this for the Biopython PDB parser paper, PubMed ID 14630660:

>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"
>>> pmid = "14630660"
>>> results = Entrez.read(Entrez.elink(dbfrom="pubmed", db="pmc",
...                                    LinkName="pubmed_pmc_refs", from_uid=pmid))
>>> pmc_ids = [link["Id"] for link in results[0]["LinkSetDb"][0]["Link"]]
>>> pmc_ids
['2744707', '2705363', '2682512', ..., '1190160']

Great - eleven articles. But why hasn’t the Biopython application note been found (PubMed ID 19304878)? Well, as you might have guessed from the variable names, there are not actually PubMed IDs, but PubMed Central IDs. Our application note is the third citing paper in that list, PMCID 2682512.

So, what if (like me) you’d rather get back a list of PubMed IDs? Well we can call ELink again to translate them. This becomes a two step process, so by now you should expect to use the history feature to accomplish it (Section 9.15).

But first, taking the more straightforward approach of making a second (separate) call to ELink:

>>> results2 = Entrez.read(Entrez.elink(dbfrom="pmc", db="pubmed", LinkName="pmc_pubmed",
...                                     from_uid=",".join(pmc_ids)))
>>> pubmed_ids = [link["Id"] for link in results2[0]["LinkSetDb"][0]["Link"]]
>>> pubmed_ids
['19698094', '19450287', '19304878', ..., '15985178']

This time you can immediately spot the Biopython application note as the third hit (PubMed ID 19304878).

Now, let’s do that all again but with the history …TODO.

And finally, don’t forget to include your own email address in the Entrez calls.

Chapter 10  Swiss-Prot and ExPASy

10.1  Parsing Swiss-Prot files

Swiss-Prot (http://www.expasy.org/sprot) is a hand-curated database of protein sequences. Biopython can parse the “plain text” Swiss-Prot file format, which is still used for the UniProt Knowledgebase which combined Swiss-Prot, TrEMBL and PIR-PSD. We do not (yet) support the UniProtKB XML file format.

10.1.1  Parsing Swiss-Prot records

In Section 5.3.2, we described how to extract the sequence of a Swiss-Prot record as a SeqRecord object. Alternatively, you can store the Swiss-Prot record in a Bio.SwissProt.Record object, which in fact stores the complete information contained in the Swiss-Prot record. In this Section, we describe how to extract Bio.SwissProt.Record objects from a Swiss-Prot file.

To parse a Swiss-Prot record, we first get a handle to a Swiss-Prot record. There are several ways to do so, depending on where and how the Swiss-Prot record is stored:

  • Open a Swiss-Prot file locally:
    >>> handle = open("myswissprotfile.dat")
  • Open a gzipped Swiss-Prot file:
    >>> import gzip
    >>> handle = gzip.open("myswissprotfile.dat.gz")
    
  • Open a Swiss-Prot file over the internet:
    >>> import urllib
    >>> handle = urllib.urlopen("http://www.somelocation.org/data/someswissprotfile.dat")
    
  • Open a Swiss-Prot file over the internet from the ExPASy database (see section 10.5.1):
    >>> from Bio import ExPASy
    >>> handle = ExPASy.get_sprot_raw(myaccessionnumber)
    

The key point is that for the parser, it doesn’t matter how the handle was created, as long as it points to data in the Swiss-Prot format.

We can use Bio.SeqIO as described in Section 5.3.2 to get file format agnostic SeqRecord objects. Alternatively, we can use Bio.SwissProt get Bio.SwissProt.Record objects, which are a much closer match to the underlying file format.

To read one Swiss-Prot record from the handle, we use the function read():

>>> from Bio import SwissProt
>>> record = SwissProt.read(handle)

This function should be used if the handle points to exactly one Swiss-Prot record. It raises a ValueError if no Swiss-Prot record was found, and also if more than one record was found.

We can now print out some information about this record:

>>> print(record.description)
'RecName: Full=Chalcone synthase 3; EC=2.3.1.74; AltName: Full=Naringenin-chalcone synthase 3;'
>>> for ref in record.references:
...     print("authors:", ref.authors)
...     print("title:", ref.title)
... 
authors: Liew C.F., Lim S.H., Loh C.S., Goh C.J.;
title: "Molecular cloning and sequence analysis of chalcone synthase cDNAs of
Bromheadia finlaysoniana.";
>>> print(record.organism_classification)
['Eukaryota', 'Viridiplantae', 'Streptophyta', 'Embryophyta', ..., 'Bromheadia']

To parse a file that contains more than one Swiss-Prot record, we use the parse function instead. This function allows us to iterate over the records in the file.

For example, let’s parse the full Swiss-Prot database and collect all the descriptions. You can download this from the ExPAYs FTP site as a single gzipped-file uniprot_sprot.dat.gz (about 300MB). This is a compressed file containing a single file, uniprot_sprot.dat (over 1.5GB).

As described at the start of this section, you can use the Python library gzip to open and uncompress a .gz file, like this:

>>> import gzip
>>> handle = gzip.open("uniprot_sprot.dat.gz")

However, uncompressing a large file takes time, and each time you open the file for reading in this way, it has to be decompressed on the fly. So, if you can spare the disk space you’ll save time in the long run if you first decompress the file to disk, to get the uniprot_sprot.dat file inside. Then you can open the file for reading as usual:

>>> handle = open("uniprot_sprot.dat")

As of June 2009, the full Swiss-Prot database downloaded from ExPASy contained 468851 Swiss-Prot records. One concise way to build up a list of the record descriptions is with a list comprehension:

>>> from Bio import SwissProt
>>> handle = open("uniprot_sprot.dat")
>>> descriptions = [record.description for record in SwissProt.parse(handle)]
>>> len(descriptions)
468851
>>> descriptions[:5]
['RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-2L;']

Or, using a for loop over the record iterator:

>>> from Bio import SwissProt
>>> descriptions = []
>>> handle = open("uniprot_sprot.dat")
>>> for record in SwissProt.parse(handle):
...     descriptions.append(record.description)
...
>>> len(descriptions)
468851

Because this is such a large input file, either way takes about eleven minutes on my new desktop computer (using the uncompressed uniprot_sprot.dat file as input).

It is equally easy to extract any kind of information you’d like from Swiss-Prot records. To see the members of a Swiss-Prot record, use

>>> dir(record)
['__doc__', '__init__', '__module__', 'accessions', 'annotation_update',
'comments', 'created', 'cross_references', 'data_class', 'description',
'entry_name', 'features', 'gene_name', 'host_organism', 'keywords',
'molecule_type', 'organelle', 'organism', 'organism_classification',
'references', 'seqinfo', 'sequence', 'sequence_length',
'sequence_update', 'taxonomy_id']

10.1.2  Parsing the Swiss-Prot keyword and category list

Swiss-Prot also distributes a file keywlist.txt, which lists the keywords and categories used in Swiss-Prot. The file contains entries in the following form:

ID   2Fe-2S.
AC   KW-0001
DE   Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron
DE   atoms complexed to 2 inorganic sulfides and 4 sulfur atoms of
DE   cysteines from the protein.
SY   Fe2S2; [2Fe-2S] cluster; [Fe2S2] cluster; Fe2/S2 (inorganic) cluster;
SY   Di-mu-sulfido-diiron; 2 iron, 2 sulfur cluster binding.
GO   GO:0051537; 2 iron, 2 sulfur cluster binding
HI   Ligand: Iron; Iron-sulfur; 2Fe-2S.
HI   Ligand: Metal-binding; 2Fe-2S.
CA   Ligand.
//
ID   3D-structure.
AC   KW-0002
DE   Protein, or part of a protein, whose three-dimensional structure has
DE   been resolved experimentally (for example by X-ray crystallography or
DE   NMR spectroscopy) and whose coordinates are available in the PDB
DE   database. Can also be used for theoretical models.
HI   Technical term: 3D-structure.
CA   Technical term.
//
ID   3Fe-4S.
...

The entries in this file can be parsed by the parse function in the Bio.SwissProt.KeyWList module. Each entry is then stored as a Bio.SwissProt.KeyWList.Record, which is a Python dictionary.

>>> from Bio.SwissProt import KeyWList
>>> handle = open("keywlist.txt")
>>> records = KeyWList.parse(handle)
>>> for record in records:
...     print(record['ID'])
...     print(record['DE'])

This prints

2Fe-2S.
Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron atoms
complexed to 2 inorganic sulfides and 4 sulfur atoms of cysteines from the
protein.
...

10.2  Parsing Prosite records

Prosite is a database containing protein domains, protein families, functional sites, as well as the patterns and profiles to recognize them. Prosite was developed in parallel with Swiss-Prot. In Biopython, a Prosite record is represented by the Bio.ExPASy.Prosite.Record class, whose members correspond to the different fields in a Prosite record.

In general, a Prosite file can contain more than one Prosite records. For example, the full set of Prosite records, which can be downloaded as a single file (prosite.dat) from the ExPASy FTP site, contains 2073 records (version 20.24 released on 4 December 2007). To parse such a file, we again make use of an iterator:

>>> from Bio.ExPASy import Prosite
>>> handle = open("myprositefile.dat")
>>> records = Prosite.parse(handle)

We can now take the records one at a time and print out some information. For example, using the file containing the complete Prosite database, we’d find

>>> from Bio.ExPASy import Prosite
>>> handle = open("prosite.dat")
>>> records = Prosite.parse(handle)
>>> record = next(records)
>>> record.accession
'PS00001'
>>> record.name
'ASN_GLYCOSYLATION'
>>> record.pdoc
'PDOC00001'
>>> record = next(records)
>>> record.accession
'PS00004'
>>> record.name
'CAMP_PHOSPHO_SITE'
>>> record.pdoc
'PDOC00004'
>>> record = next(records)
>>> record.accession
'PS00005'
>>> record.name
'PKC_PHOSPHO_SITE'
>>> record.pdoc
'PDOC00005'

and so on. If you’re interested in how many Prosite records there are, you could use

>>> from Bio.ExPASy import Prosite
>>> handle = open("prosite.dat")
>>> records = Prosite.parse(handle)
>>> n = 0
>>> for record in records: n+=1
...
>>> n
2073

To read exactly one Prosite from the handle, you can use the read function:

>>> from Bio.ExPASy import Prosite
>>> handle = open("mysingleprositerecord.dat")
>>> record = Prosite.read(handle)

This function raises a ValueError if no Prosite record is found, and also if more than one Prosite record is found.

10.3  Parsing Prosite documentation records

In the Prosite example above, the record.pdoc accession numbers 'PDOC00001', 'PDOC00004', 'PDOC00005' and so on refer to Prosite documentation. The Prosite documentation records are available from ExPASy as individual files, and as one file (prosite.doc) containing all Prosite documentation records.

We use the parser in Bio.ExPASy.Prodoc to parse Prosite documentation records. For example, to create a list of all accession numbers of Prosite documentation record, you can use

>>> from Bio.ExPASy import Prodoc
>>> handle = open("prosite.doc")
>>> records = Prodoc.parse(handle)
>>> accessions = [record.accession for record in records]

Again a read() function is provided to read exactly one Prosite documentation record from the handle.

10.4  Parsing Enzyme records

ExPASy’s Enzyme database is a repository of information on enzyme nomenclature. A typical Enzyme record looks as follows:

ID   3.1.1.34
DE   Lipoprotein lipase.
AN   Clearing factor lipase.
AN   Diacylglycerol lipase.
AN   Diglyceride lipase.
CA   Triacylglycerol + H(2)O = diacylglycerol + a carboxylate.
CC   -!- Hydrolyzes triacylglycerols in chylomicrons and very low-density
CC       lipoproteins (VLDL).
CC   -!- Also hydrolyzes diacylglycerol.
PR   PROSITE; PDOC00110;
DR   P11151, LIPL_BOVIN ;  P11153, LIPL_CAVPO ;  P11602, LIPL_CHICK ;
DR   P55031, LIPL_FELCA ;  P06858, LIPL_HUMAN ;  P11152, LIPL_MOUSE ;
DR   O46647, LIPL_MUSVI ;  P49060, LIPL_PAPAN ;  P49923, LIPL_PIG   ;
DR   Q06000, LIPL_RAT   ;  Q29524, LIPL_SHEEP ;
//

In this example, the first line shows the EC (Enzyme Commission) number of lipoprotein lipase (second line). Alternative names of lipoprotein lipase are "clearing factor lipase", "diacylglycerol lipase", and "diglyceride lipase" (lines 3 through 5). The line starting with "CA" shows the catalytic activity of this enzyme. Comment lines start with "CC". The "PR" line shows references to the Prosite Documentation records, and the "DR" lines show references to Swiss-Prot records. Not of these entries are necessarily present in an Enzyme record.

In Biopython, an Enzyme record is represented by the Bio.ExPASy.Enzyme.Record class. This record derives from a Python dictionary and has keys corresponding to the two-letter codes used in Enzyme files. To read an Enzyme file containing one Enzyme record, use the read function in Bio.ExPASy.Enzyme:

>>> from Bio.ExPASy import Enzyme
>>> handle = open("lipoprotein.txt")
>>> record = Enzyme.read(handle)
>>> record["ID"]
'3.1.1.34'
>>> record["DE"]
'Lipoprotein lipase.'
>>> record["AN"]
['Clearing factor lipase.', 'Diacylglycerol lipase.', 'Diglyceride lipase.']
>>> record["CA"]
'Triacylglycerol + H(2)O = diacylglycerol + a carboxylate.'
>>> record["PR"]
['PDOC00110']
>>> record["CC"]
['Hydrolyzes triacylglycerols in chylomicrons and very low-density lipoproteins
(VLDL).', 'Also hydrolyzes diacylglycerol.']
>>> record["DR"]
[['P11151', 'LIPL_BOVIN'], ['P11153', 'LIPL_CAVPO'], ['P11602', 'LIPL_CHICK'],
['P55031', 'LIPL_FELCA'], ['P06858', 'LIPL_HUMAN'], ['P11152', 'LIPL_MOUSE'],
['O46647', 'LIPL_MUSVI'], ['P49060', 'LIPL_PAPAN'], ['P49923', 'LIPL_PIG'],
['Q06000', 'LIPL_RAT'], ['Q29524', 'LIPL_SHEEP']]

The read function raises a ValueError if no Enzyme record is found, and also if more than one Enzyme record is found.

The full set of Enzyme records can be downloaded as a single file (enzyme.dat) from the ExPASy FTP site, containing 4877 records (release of 3 March 2009). To parse such a file containing multiple Enzyme records, use the parse function in Bio.ExPASy.Enzyme to obtain an iterator:

>>> from Bio.ExPASy import Enzyme
>>> handle = open("enzyme.dat")
>>> records = Enzyme.parse(handle)

We can now iterate over the records one at a time. For example, we can make a list of all EC numbers for which an Enzyme record is available:

>>> ecnumbers = [record["ID"] for record in records]

10.5  Accessing the ExPASy server

Swiss-Prot, Prosite, and Prosite documentation records can be downloaded from the ExPASy web server at http://www.expasy.org. Six kinds of queries are available from ExPASy:

get_prodoc_entry
To download a Prosite documentation record in HTML format
get_prosite_entry
To download a Prosite record in HTML format
get_prosite_raw
To download a Prosite or Prosite documentation record in raw format
get_sprot_raw
To download a Swiss-Prot record in raw format
sprot_search_ful
To search for a Swiss-Prot record
sprot_search_de
To search for a Swiss-Prot record

To access this web server from a Python script, we use the Bio.ExPASy module.

10.5.1  Retrieving a Swiss-Prot record

Let’s say we are looking at chalcone synthases for Orchids (see section 2.3 for some justification for looking for interesting things about orchids). Chalcone synthase is involved in flavanoid biosynthesis in plants, and flavanoids make lots of cool things like pigment colors and UV protectants.

If you do a search on Swiss-Prot, you can find three orchid proteins for Chalcone Synthase, id numbers O23729, O23730, O23731. Now, let’s write a script which grabs these, and parses out some interesting information.

First, we grab the records, using the get_sprot_raw() function of Bio.ExPASy. This function is very nice since you can feed it an id and get back a handle to a raw text record (no html to mess with!). We can the use Bio.SwissProt.read to pull out the Swiss-Prot record, or Bio.SeqIO.read to get a SeqRecord. The following code accomplishes what I just wrote:

>>> from Bio import ExPASy
>>> from Bio import SwissProt

>>> accessions = ["O23729", "O23730", "O23731"]
>>> records = []

>>> for accession in accessions:
...     handle = ExPASy.get_sprot_raw(accession)
...     record = SwissProt.read(handle)
...     records.append(record)

If the accession number you provided to ExPASy.get_sprot_raw does not exist, then SwissProt.read(handle) will raise a ValueError. You can catch ValueException exceptions to detect invalid accession numbers:

>>> for accession in accessions:
...     handle = ExPASy.get_sprot_raw(accession)
...     try:
...         record = SwissProt.read(handle)
...     except ValueException:
...         print("WARNING: Accession %s not found" % accession)
...     records.append(record)

10.5.2  Searching Swiss-Prot

Now, you may remark that I knew the records’ accession numbers beforehand. Indeed, get_sprot_raw() needs either the entry name or an accession number. When you don’t have them handy, you can use one of the sprot_search_de() or sprot_search_ful() functions.

sprot_search_de() searches in the ID, DE, GN, OS and OG lines; sprot_search_ful() searches in (nearly) all the fields. They are detailed on http://www.expasy.org/cgi-bin/sprot-search-de and http://www.expasy.org/cgi-bin/sprot-search-ful respectively. Note that they don’t search in TrEMBL by default (argument trembl). Note also that they return html pages; however, accession numbers are quite easily extractable:

>>> from Bio import ExPASy
>>> import re

>>> handle = ExPASy.sprot_search_de("Orchid Chalcone Synthase")
>>> # or:
>>> # handle = ExPASy.sprot_search_ful("Orchid and {Chalcone Synthase}")
>>> html_results = handle.read()
>>> if "Number of sequences found" in html_results:
...     ids = re.findall(r'HREF="/uniprot/(\w+)"', html_results)
... else:
...     ids = re.findall(r'href="/cgi-bin/niceprot\.pl\?(\w+)"', html_results)

10.5.3  Retrieving Prosite and Prosite documentation records

Prosite and Prosite documentation records can be retrieved either in HTML format, or in raw format. To parse Prosite and Prosite documentation records with Biopython, you should retrieve the records in raw format. For other purposes, however, you may be interested in these records in HTML format.

To retrieve a Prosite or Prosite documentation record in raw format, use get_prosite_raw(). For example, to download a Prosite record and print it out in raw text format, use

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prosite_raw('PS00001')
>>> text = handle.read()
>>> print(text)

To retrieve a Prosite record and parse it into a Bio.Prosite.Record object, use

>>> from Bio import ExPASy
>>> from Bio import Prosite
>>> handle = ExPASy.get_prosite_raw('PS00001')
>>> record = Prosite.read(handle)

The same function can be used to retrieve a Prosite documentation record and parse it into a Bio.ExPASy.Prodoc.Record object:

>>> from Bio import ExPASy
>>> from Bio.ExPASy import Prodoc
>>> handle = ExPASy.get_prosite_raw('PDOC00001')
>>> record = Prodoc.read(handle)

For non-existing accession numbers, ExPASy.get_prosite_raw returns a handle to an emptry string. When faced with an empty string, Prosite.read and Prodoc.read will raise a ValueError. You can catch these exceptions to detect invalid accession numbers.

The functions get_prosite_entry() and get_prodoc_entry() are used to download Prosite and Prosite documentation records in HTML format. To create a web page showing one Prosite record, you can use

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prosite_entry('PS00001')
>>> html = handle.read()
>>> output = open("myprositerecord.html", "w")
>>> output.write(html)
>>> output.close()

and similarly for a Prosite documentation record:

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prodoc_entry('PDOC00001')
>>> html = handle.read()
>>> output = open("myprodocrecord.html", "w")
>>> output.write(html)
>>> output.close()

For these functions, an invalid accession number returns an error message in HTML format.

10.6  Scanning the Prosite database

ScanProsite allows you to scan protein sequences online against the Prosite database by providing a UniProt or PDB sequence identifier or the sequence itself. For more information about ScanProsite, please see the ScanProsite documentation as well as the documentation for programmatic access of ScanProsite.

You can use Biopython’s Bio.ExPASy.ScanProsite module to scan the Prosite database from Python. This module both helps you to access ScanProsite programmatically, and to parse the results returned by ScanProsite. To scan for Prosite patterns in the following protein sequence:

MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT
CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN

you can use the following code:

>>> sequence = "MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT
CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN"
>>> from Bio.ExPASy import ScanProsite
>>> handle = ScanProsite.scan(seq=sequence)

By executing handle.read(), you can obtain the search results in raw XML format. Instead, let’s use Bio.ExPASy.ScanProsite.read to parse the raw XML into a Python object:

>>> result = ScanProsite.read(handle)
>>> type(result)
<class 'Bio.ExPASy.ScanProsite.Record'>

A Bio.ExPASy.ScanProsite.Record object is derived from a list, with each element in the list storing one ScanProsite hit. This object also stores the number of hits, as well as the number of search sequences, as returned by ScanProsite. This ScanProsite search resulted in six hits:

>>> result.n_seq
1
>>> result.n_match
6
>>> len(result)
6
>>> result[0]
{'signature_ac': u'PS50948', 'level': u'0', 'stop': 98, 'sequence_ac': u'USERSEQ1', 'start': 16, 'score': u'8.873'}
>>> result[1]
{'start': 37, 'stop': 39, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00005'}
>>> result[2]
{'start': 45, 'stop': 48, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00006'}
>>> result[3]
{'start': 60, 'stop': 62, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00005'}
>>> result[4]
{'start': 80, 'stop': 83, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00004'}
>>> result[5]
{'start': 106, 'stop': 111, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00008'}

Other ScanProsite parameters can be passed as keyword arguments; see the documentation for programmatic access of ScanProsite for more information. As an example, passing lowscore=1 to include matches with low level scores lets use find one additional hit:

>>> handle = ScanProsite.scan(seq=sequence, lowscore=1)
>>> result = ScanProsite.read(handle)
>>> result.n_match
7

Chapter 11  Going 3D: The PDB module

Bio.PDB is a Biopython module that focuses on working with crystal structures of biological macromolecules. Among other things, Bio.PDB includes a PDBParser class that produces a Structure object, which can be used to access the atomic data in the file in a convenient manner. There is limited support for parsing the information contained in the PDB header.

11.1  Reading and writing crystal structure files

11.1.1  Reading a PDB file

First we create a PDBParser object:

>>> from Bio.PDB.PDBParser import PDBParser
>>> p = PDBParser(PERMISSIVE=1)

The PERMISSIVE flag indicates that a number of common problems (see 11.7.1) associated with PDB files will be ignored (but note that some atoms and/or residues will be missing). If the flag is not present a PDBConstructionException will be generated if any problems are detected during the parse operation.

The Structure object is then produced by letting the PDBParser object parse a PDB file (the PDB file in this case is called ’pdb1fat.ent’, ’1fat’ is a user defined name for the structure):

>>> structure_id = "1fat"
>>> filename = "pdb1fat.ent"
>>> s = p.get_structure(structure_id, filename)

You can extract the header and trailer (simple lists of strings) of the PDB file from the PDBParser object with the get_header and get_trailer methods. Note however that many PDB files contain headers with incomplete or erroneous information. Many of the errors have been fixed in the equivalent mmCIF files. Hence, if you are interested in the header information, it is a good idea to extract information from mmCIF files using the MMCIF2Dict tool described below, instead of parsing the PDB header.

Now that is clarified, let’s return to parsing the PDB header. The structure object has an attribute called header which is a Python dictionary that maps header records to their values.

Example:

>>> resolution = structure.header['resolution']
>>> keywords = structure.header['keywords']

The available keys are name, head, deposition_date, release_date, structure_method, resolution, structure_reference (which maps to a list of references), journal_reference, author, and compound (which maps to a dictionary with various information about the crystallized compound).

The dictionary can also be created without creating a Structure object, ie. directly from the PDB file:

>>> file = open(filename, 'r')
>>> header_dict = parse_pdb_header(file)
>>> file.close()

11.1.2  Reading an mmCIF file

Similarly to the case the case of PDB files, first create an MMCIFParser object:

>>> from Bio.PDB.MMCIFParser import MMCIFParser
>>> parser = MMCIFParser()

Then use this parser to create a structure object from the mmCIF file:

>>> structure = parser.get_structure('1fat', '1fat.cif')

To have some more low level access to an mmCIF file, you can use the MMCIF2Dict class to create a Python dictionary that maps all mmCIF tags in an mmCIF file to their values. If there are multiple values (like in the case of tag _atom_site.Cartn_y, which holds the y coordinates of all atoms), the tag is mapped to a list of values. The dictionary is created from the mmCIF file as follows:

>>> from Bio.PDB.MMCIF2Dict import MMCIF2Dict
>>> mmcif_dict = MMCIF2Dict('1FAT.cif')

Example: get the solvent content from an mmCIF file:

>>> sc = mmcif_dict['_exptl_crystal.density_percent_sol']

Example: get the list of the y coordinates of all atoms

>>> y_list = mmcif_dict['_atom_site.Cartn_y']

11.1.3  Reading files in the PDB XML format

That’s not yet supported, but we are definitely planning to support that in the future (it’s not a lot of work). Contact the Biopython developers (biopython-dev@biopython.org) if you need this).

11.1.4  Writing PDB files

Use the PDBIO class for this. It’s easy to write out specific parts of a structure too, of course.

Example: saving a structure

>>> io = PDBIO()
>>> io.set_structure(s)
>>> io.save('out.pdb')

If you want to write out a part of the structure, make use of the Select class (also in PDBIO). Select has four methods:

  • accept_model(model)
  • accept_chain(chain)
  • accept_residue(residue)
  • accept_atom(atom)

By default, every method returns 1 (which means the model/chain/residue/atom is included in the output). By subclassing Select and returning 0 when appropriate you can exclude models, chains, etc. from the output. Cumbersome maybe, but very powerful. The following code only writes out glycine residues:

>>> class GlySelect(Select):
...     def accept_residue(self, residue):
...         if residue.get_name()=='GLY':
...             return True
...         else:
...             return False
... 
>>> io = PDBIO()
>>> io.set_structure(s)
>>> io.save('gly_only.pdb', GlySelect())

If this is all too complicated for you, the Dice module contains a handy extract function that writes out all residues in a chain between a start and end residue.

11.2  Structure representation

The overall layout of a Structure object follows the so-called SMCRA (Structure/Model/Chain/Residue/Atom) architecture:

  • A structure consists of models
  • A model consists of chains
  • A chain consists of residues
  • A residue consists of atoms

This is the way many structural biologists/bioinformaticians think about structure, and provides a simple but efficient way to deal with structure. Additional stuff is essentially added when needed. A UML diagram of the Structure object (forget about the Disordered classes for now) is shown in Fig. 11.1. Such a data structure is not necessarily best suited for the representation of the macromolecular content of a structure, but it is absolutely necessary for a good interpretation of the data present in a file that describes the structure (typically a PDB or MMCIF file). If this hierarchy cannot represent the contents of a structure file, it is fairly certain that the file contains an error or at least does not describe the structure unambiguously. If a SMCRA data structure cannot be generated, there is reason to suspect a problem. Parsing a PDB file can thus be used to detect likely problems. We will give several examples of this in section 11.7.1.


Figure 11.1: UML diagram of SMCRA architecture of the Structure class used to represent a macromolecular structure. Full lines with diamonds denote aggregation, full lines with arrows denote referencing, full lines with triangles denote inheritance and dashed lines with triangles denote interface realization.

Structure, Model, Chain and Residue are all subclasses of the Entity base class. The Atom class only (partly) implements the Entity interface (because an Atom does not have children).

For each Entity subclass, you can extract a child by using a unique id for that child as a key (e.g. you can extract an Atom object from a Residue object by using an atom name string as a key, you can extract a Chain object from a Model object by using its chain identifier as a key).

Disordered atoms and residues are represented by DisorderedAtom and DisorderedResidue classes, which are both subclasses of the DisorderedEntityWrapper base class. They hide the complexity associated with disorder and behave exactly as Atom and Residue objects.

In general, a child Entity object (i.e. Atom, Residue, Chain, Model) can be extracted from its parent (i.e. Residue, Chain, Model, Structure, respectively) by using an id as a key.

>>> child_entity = parent_entity[child_id]

You can also get a list of all child Entities of a parent Entity object. Note that this list is sorted in a specific way (e.g. according to chain identifier for Chain objects in a Model object).

>>> child_list = parent_entity.get_list()

You can also get the parent from a child:

>>> parent_entity = child_entity.get_parent()

At all levels of the SMCRA hierarchy, you can also extract a full id. The full id is a tuple containing all id’s starting from the top object (Structure) down to the current object. A full id for a Residue object e.g. is something like:

>>> full_id = residue.get_full_id()
>>> print(full_id)
("1abc", 0, "A", ("", 10, "A"))

This corresponds to:

  • The Structure with id "1abc"
  • The Model with id 0
  • The Chain with id "A"
  • The Residue with id (" ", 10, "A").

The Residue id indicates that the residue is not a hetero-residue (nor a water) because it has a blank hetero field, that its sequence identifier is 10 and that its insertion code is "A".

To get the entity’s id, use the get_id method:

>>> entity.get_id()

You can check if the entity has a child with a given id by using the has_id method:

>>> entity.has_id(entity_id)

The length of an entity is equal to its number of children:

>>> nr_children = len(entity)

It is possible to delete, rename, add, etc. child entities from a parent entity, but this does not include any sanity checks (e.g. it is possible to add two residues with the same id to one chain). This really should be done via a nice Decorator class that includes integrity checking, but you can take a look at the code (Entity.py) if you want to use the raw interface.

11.2.1  Structure

The Structure object is at the top of the hierarchy. Its id is a user given string. The Structure contains a number of Model children. Most crystal structures (but not all) contain a single model, while NMR structures typically consist of several models. Disorder in crystal structures of large parts of molecules can also result in several models.

11.2.2  Model

The id of the Model object is an integer, which is derived from the position of the model in the parsed file (they are automatically numbered starting from 0). Crystal structures generally have only one model (with id 0), while NMR files usually have several models. Whereas many PDB parsers assume that there is only one model, the Structure class in Bio.PDB is designed such that it can easily handle PDB files with more than one model.

As an example, to get the first model from a Structure object, use

>>> first_model = structure[0]

The Model object stores a list of Chain children.

11.2.3  Chain

The id of a Chain object is derived from the chain identifier in the PDB/mmCIF file, and is a single character (typically a letter). Each Chain in a Model object has a unique id. As an example, to get the Chain object with identifier “A” from a Model object, use

>>> chain_A = model["A"]

The Chain object stores a list of Residue children.

11.2.4  Residue

A residue id is a tuple with three elements:

  • The hetero-field (hetfield): this is
    • 'W' in the case of a water molecule;
    • 'H_' followed by the residue name for other hetero residues (e.g. 'H_GLC' in the case of a glucose molecule);
    • blank for standard amino and nucleic acids.
    This scheme is adopted for reasons described in section 11.4.1.
  • The sequence identifier (resseq), an integer describing the position of the residue in the chain (e.g., 100);
  • The insertion code (icode); a string, e.g. ’A’. The insertion code is sometimes used to preserve a certain desirable residue numbering scheme. A Ser 80 insertion mutant (inserted e.g. between a Thr 80 and an Asn 81 residue) could e.g. have sequence identifiers and insertion codes as follows: Thr 80 A, Ser 80 B, Asn 81. In this way the residue numbering scheme stays in tune with that of the wild type structure.

The id of the above glucose residue would thus be (’H_GLC’, 100, ’A’). If the hetero-flag and insertion code are blank, the sequence identifier alone can be used:

# Full id
>>> residue=chain[(' ', 100, ' ')]
# Shortcut id
>>> residue=chain[100]

The reason for the hetero-flag is that many, many PDB files use the same sequence identifier for an amino acid and a hetero-residue or a water, which would create obvious problems if the hetero-flag was not used.

Unsurprisingly, a Residue object stores a set of Atom children. It also contains a string that specifies the residue name (e.g. “ASN”) and the segment identifier of the residue (well known to X-PLOR users, but not used in the construction of the SMCRA data structure).

Let’s look at some examples. Asn 10 with a blank insertion code would have residue id (’ ’, 10, ’ ’). Water 10 would have residue id (’W’, 10, ’ ’). A glucose molecule (a hetero residue with residue name GLC) with sequence identifier 10 would have residue id (’H_GLC’, 10, ’ ’). In this way, the three residues (with the same insertion code and sequence identifier) can be part of the same chain because their residue id’s are distinct.

In most cases, the hetflag and insertion code fields will be blank, e.g. (’ ’, 10, ’ ’). In these cases, the sequence identifier can be used as a shortcut for the full id:

# use full id
>>> res10 = chain[(' ', 10, ' ')]
# use shortcut
>>> res10 = chain[10]

Each Residue object in a Chain object should have a unique id. However, disordered residues are dealt with in a special way, as described in section 11.3.3.

A Residue object has a number of additional methods:

>>> residue.get_resname()       # returns the residue name, e.g. "ASN"
>>> residue.is_disordered()     # returns 1 if the residue has disordered atoms
>>> residue.get_segid()         # returns the SEGID, e.g. "CHN1"
>>> residue.has_id(name)        # test if a residue has a certain atom

You can use is_aa(residue) to test if a Residue object is an amino acid.

11.2.5  Atom

The Atom object stores the data associated with an atom, and has no children. The id of an atom is its atom name (e.g. “OG” for the side chain oxygen of a Ser residue). An Atom id needs to be unique in a Residue. Again, an exception is made for disordered atoms, as described in section 11.3.2.

The atom id is simply the atom name (eg. ’CA’). In practice, the atom name is created by stripping all spaces from the atom name in the PDB file.

However, in PDB files, a space can be part of an atom name. Often, calcium atoms are called ’CA..’ in order to distinguish them from Cα atoms (which are called ’.CA.’). In cases were stripping the spaces would create problems (ie. two atoms called ’CA’ in the same residue) the spaces are kept.

In a PDB file, an atom name consists of 4 chars, typically with leading and trailing spaces. Often these spaces can be removed for ease of use (e.g. an amino acid C α atom is labeled “.CA.” in a PDB file, where the dots represent spaces). To generate an atom name (and thus an atom id) the spaces are removed, unless this would result in a name collision in a Residue (i.e. two Atom objects with the same atom name and id). In the latter case, the atom name including spaces is tried. This situation can e.g. happen when one residue contains atoms with names “.CA.” and “CA..”, although this is not very likely.

The atomic data stored includes the atom name, the atomic coordinates (including standard deviation if present), the B factor (including anisotropic B factors and standard deviation if present), the altloc specifier and the full atom name including spaces. Less used items like the atom element number or the atomic charge sometimes specified in a PDB file are not stored.

To manipulate the atomic coordinates, use the transform method of the Atom object. Use the set_coord method to specify the atomic coordinates directly.

An Atom object has the following additional methods:

>>> a.get_name()       # atom name (spaces stripped, e.g. "CA")
>>> a.get_id()         # id (equals atom name)
>>> a.get_coord()      # atomic coordinates
>>> a.get_vector()     # atomic coordinates as Vector object
>>> a.get_bfactor()    # isotropic B factor
>>> a.get_occupancy()  # occupancy
>>> a.get_altloc()     # alternative location specifier
>>> a.get_sigatm()     # standard deviation of atomic parameters
>>> a.get_siguij()     # standard deviation of anisotropic B factor
>>> a.get_anisou()     # anisotropic B factor
>>> a.get_fullname()   # atom name (with spaces, e.g. ".CA.")

To represent the atom coordinates, siguij, anisotropic B factor and sigatm Numpy arrays are used.

The get_vector method returns a Vector object representation of the coordinates of the Atom object, allowing you to do vector operations on atomic coordinates. Vector implements the full set of 3D vector operations, matrix multiplication (left and right) and some advanced rotation-related operations as well.

As an example of the capabilities of Bio.PDB’s Vector module, suppose that you would like to find the position of a Gly residue’s Cβ atom, if it had one. Rotating the N atom of the Gly residue along the Cα-C bond over -120 degrees roughly puts it in the position of a virtual Cβ atom. Here’s how to do it, making use of the rotaxis method (which can be used to construct a rotation around a certain axis) of the Vector module:

# get atom coordinates as vectors
>>> n = residue['N'].get_vector() 
>>> c = residue['C'].get_vector() 
>>> ca = residue['CA'].get_vector()
# center at origin
>>> n = n - ca 
>>> c = c - ca 
# find rotation matrix that rotates n 
# -120 degrees along the ca-c vector
>>> rot = rotaxis(-pi * 120.0/180.0, c)
# apply rotation to ca-n vector
>>> cb_at_origin = n.left_multiply(rot)
# put on top of ca atom
>>> cb = cb_at_origin+ca

This example shows that it’s possible to do some quite nontrivial vector operations on atomic data, which can be quite useful. In addition to all the usual vector operations (cross (use **), and dot (use *) product, angle, norm, etc.) and the above mentioned rotaxis function, the Vector module also has methods to rotate (rotmat) or reflect (refmat) one vector on top of another.

11.2.6  Extracting a specific Atom/Residue/Chain/Model from a Structure

These are some examples:

>>> model = structure[0]
>>> chain = model['A']
>>> residue = chain[100]
>>> atom = residue['CA']

Note that you can use a shortcut:

>>> atom = structure[0]['A'][100]['CA']

11.3  Disorder

Bio.PDB can handle both disordered atoms and point mutations (i.e. a Gly and an Ala residue in the same position).

11.3.1  General approach

Disorder should be dealt with from two points of view: the atom and the residue points of view. In general, we have tried to encapsulate all the complexity that arises from disorder. If you just want to loop over all Cα atoms, you do not care that some residues have a disordered side chain. On the other hand it should also be possible to represent disorder completely in the data structure. Therefore, disordered atoms or residues are stored in special objects that behave as if there is no disorder. This is done by only representing a subset of the disordered atoms or residues. Which subset is picked (e.g. which of the two disordered OG side chain atom positions of a Ser residue is used) can be specified by the user.

11.3.2  Disordered atoms

Disordered atoms are represented by ordinary Atom objects, but all Atom objects that represent the same physical atom are stored in a DisorderedAtom object (see Fig. 11.1). Each Atom object in a DisorderedAtom object can be uniquely indexed using its altloc specifier. The DisorderedAtom object forwards all uncaught method calls to the selected Atom object, by default the one that represents the atom with the highest occupancy. The user can of course change the selected Atom object, making use of its altloc specifier. In this way atom disorder is represented correctly without much additional complexity. In other words, if you are not interested in atom disorder, you will not be bothered by it.

Each disordered atom has a characteristic altloc identifier. You can specify that a DisorderedAtom object should behave like the Atom object associated with a specific altloc identifier:

>>> atom.disordered_select('A') # select altloc A atom
>>> print(atom.get_altloc())
"A"
>>> atom.disordered_select('B') # select altloc B atom
>>> print(atom.get_altloc())
"B"

11.3.3  Disordered residues

Common case

The most common case is a residue that contains one or more disordered atoms. This is evidently solved by using DisorderedAtom objects to represent the disordered atoms, and storing the DisorderedAtom object in a Residue object just like ordinary Atom objects. The DisorderedAtom will behave exactly like an ordinary atom (in fact the atom with the highest occupancy) by forwarding all uncaught method calls to one of the Atom objects (the selected Atom object) it contains.

Point mutations

A special case arises when disorder is due to a point mutation, i.e. when two or more point mutants of a polypeptide are present in the crystal. An example of this can be found in PDB structure 1EN2.

Since these residues belong to a different residue type (e.g. let’s say Ser 60 and Cys 60) they should not be stored in a single Residue object as in the common case. In this case, each residue is represented by one Residue object, and both Residue objects are stored in a single DisorderedResidue object (see Fig. 11.1).

The DisorderedResidue object forwards all uncaught methods to the selected Residue object (by default the last Residue object added), and thus behaves like an ordinary residue. Each Residue object in a DisorderedResidue object can be uniquely identified by its residue name. In the above example, residue Ser 60 would have id “SER” in the DisorderedResidue object, while residue Cys 60 would have id “CYS”. The user can select the active Residue object in a DisorderedResidue object via this id.

Example: suppose that a chain has a point mutation at position 10, consisting of a Ser and a Cys residue. Make sure that residue 10 of this chain behaves as the Cys residue.

>>> residue = chain[10]
>>> residue.disordered_select('CYS')

In addition, you can get a list of all Atom objects (ie. all DisorderedAtom objects are ’unpacked’ to their individual Atom objects) using the get_unpacked_list method of a (Disordered)Residue object.

11.4  Hetero residues

11.4.1  Associated problems

A common problem with hetero residues is that several hetero and non-hetero residues present in the same chain share the same sequence identifier (and insertion code). Therefore, to generate a unique id for each hetero residue, waters and other hetero residues are treated in a different way.

Remember that Residue object have the tuple (hetfield, resseq, icode) as id. The hetfield is blank (“ ”) for amino and nucleic acids, and a string for waters and other hetero residues. The content of the hetfield is explained below.

11.4.2  Water residues

The hetfield string of a water residue consists of the letter “W”. So a typical residue id for a water is (“W”, 1, “ ”).

11.4.3  Other hetero residues

The hetfield string for other hetero residues starts with “H_” followed by the residue name. A glucose molecule e.g. with residue name “GLC” would have hetfield “H_GLC”. Its residue id could e.g. be (“H_GLC”, 1, “ ”).

11.5  Navigating through a Structure object

Parse a PDB file, and extract some Model, Chain, Residue and Atom objects

>>> from Bio.PDB.PDBParser import PDBParser
>>> parser = PDBParser()
>>> structure = parser.get_structure("test", "1fat.pdb")
>>> model = structure[0]
>>> chain = model["A"]
>>> residue = chain[1]
>>> atom = residue["CA"]

Iterating through all atoms of a structure

>>> p = PDBParser()
>>> structure = p.get_structure('X', 'pdb1fat.ent')
>>> for model in structure:
...     for chain in model:
...         for residue in chain:
...             for atom in residue:
...                 print(atom)
...

There is a shortcut if you want to iterate over all atoms in a structure:

>>> atoms = structure.get_atoms()
>>> for atom in atoms:
...     print(atom)
...

Similarly, to iterate over all atoms in a chain, use

>>> atoms = chain.get_atoms()
>>> for atom in atoms:
...     print(atom)
...

Iterating over all residues of a model

or if you want to iterate over all residues in a model:

>>> residues = model.get_residues()
>>> for residue in residues:
...     print(residue)
...

You can also use the Selection.unfold_entities function to get all residues from a structure:

>>> res_list = Selection.unfold_entities(structure, 'R')

or to get all atoms from a chain:

>>> atom_list = Selection.unfold_entities(chain, 'A')

Obviously, A=atom, R=residue, C=chain, M=model, S=structure. You can use this to go up in the hierarchy, e.g. to get a list of (unique) Residue or Chain parents from a list of Atoms:

>>> residue_list = Selection.unfold_entities(atom_list, 'R')
>>> chain_list = Selection.unfold_entities(atom_list, 'C')

For more info, see the API documentation.

Extract a hetero residue from a chain (e.g. a glucose (GLC) moiety with resseq 10)

>>> residue_id = ("H_GLC", 10, " ")
>>> residue = chain[residue_id]

Print all hetero residues in chain

>>> for residue in chain.get_list():
...    residue_id = residue.get_id()
...    hetfield = residue_id[0]
...    if hetfield[0]=="H":
...        print(residue_id)
...

Print out the coordinates of all CA atoms in a structure with B factor greater than 50

>>> for model in structure.get_list():
...     for chain in model.get_list():
...         for residue in chain.get_list():
...             if residue.has_id("CA"):
...                 ca = residue["CA"]
...                 if ca.get_bfactor() > 50.0:
...                     print(ca.get_coord())
...

Print out all the residues that contain disordered atoms

>>> for model in structure.get_list():
...     for chain in model.get_list():
...         for residue in chain.get_list():
...             if residue.is_disordered():
...                 resseq = residue.get_id()[1]
...                 resname = residue.get_resname()
...                 model_id = model.get_id()
...                 chain_id = chain.get_id()
...                 print(model_id, chain_id, resname, resseq)
... 

Loop over all disordered atoms, and select all atoms with altloc A (if present)

This will make sure that the SMCRA data structure will behave as if only the atoms with altloc A are present.

>>> for model in structure.get_list():
...     for chain in model.get_list():
...         for residue in chain.get_list():
...             if residue.is_disordered():
...                 for atom in residue.get_list():
...                     if atom.is_disordered():
...                         if atom.disordered_has_id("A"):
...                             atom.disordered_select("A")
...

Extracting polypeptides from a Structure object

To extract polypeptides from a structure, construct a list of Polypeptide objects from a Structure object using PolypeptideBuilder as follows:

>>> model_nr = 1
>>> polypeptide_list = build_peptides(structure, model_nr)
>>> for polypeptide in polypeptide_list:
...     print(polypeptide)
...

A Polypeptide object is simply a UserList of Residue objects, and is always created from a single Model (in this case model 1). You can use the resulting Polypeptide object to get the sequence as a Seq object or to get a list of Cα atoms as well. Polypeptides can be built using a C-N or a Cα-Cα distance criterion.

Example:

# Using C-N 
>>> ppb=PPBuilder()
>>> for pp in ppb.build_peptides(structure): 
...     print(pp.get_sequence())
...
# Using CA-CA
>>> ppb=CaPPBuilder()
>>> for pp in ppb.build_peptides(structure): 
...     print(pp.get_sequence())
...

Note that in the above case only model 0 of the structure is considered by PolypeptideBuilder. However, it is possible to use PolypeptideBuilder to build Polypeptide objects from Model and Chain objects as well.

Obtaining the sequence of a structure

The first thing to do is to extract all polypeptides from the structure (as above). The sequence of each polypeptide can then easily be obtained from the Polypeptide objects. The sequence is represented as a Biopython Seq object, and its alphabet is defined by a ProteinAlphabet object.

Example:

>>> seq = polypeptide.get_sequence()
>>> print(seq)
Seq('SNVVE...', <class Bio.Alphabet.ProteinAlphabet>)

11.6  Analyzing structures

11.6.1  Measuring distances

The minus operator for atoms has been overloaded to return the distance between two atoms.

# Get some atoms
>>> ca1 = residue1['CA']
>>> ca2 = residue2['CA']
# Simply subtract the atoms to get their distance
>>> distance = ca1-ca2

11.6.2  Measuring angles

Use the vector representation of the atomic coordinates, and the calc_angle function from the Vector module:

>>> vector1 = atom1.get_vector()
>>> vector2 = atom2.get_vector()
>>> vector3 = atom3.get_vector()
>>> angle = calc_angle(vector1, vector2, vector3)

11.6.3  Measuring torsion angles

Use the vector representation of the atomic coordinates, and the calc_dihedral function from the Vector module:

>>> vector1 = atom1.get_vector()
>>> vector2 = atom2.get_vector()
>>> vector3 = atom3.get_vector()
>>> vector4 = atom4.get_vector()
>>> angle = calc_dihedral(vector1, vector2, vector3, vector4)

11.6.4  Determining atom-atom contacts

Use NeighborSearch to perform neighbor lookup. The neighbor lookup is done using a KD tree module written in C (see Bio.KDTree), making it very fast. It also includes a fast method to find all point pairs within a certain distance of each other.

11.6.5  Superimposing two structures

Use a Superimposer object to superimpose two coordinate sets. This object calculates the rotation and translation matrix that rotates two lists of atoms on top of each other in such a way that their RMSD is minimized. Of course, the two lists need to contain the same number of atoms. The Superimposer object can also apply the rotation/translation to a list of atoms. The rotation and translation are stored as a tuple in the rotran attribute of the Superimposer object (note that the rotation is right multiplying!). The RMSD is stored in the rmsd attribute.

The algorithm used by Superimposer comes from [17, Golub & Van Loan] and makes use of singular value decomposition (this is implemented in the general Bio.SVDSuperimposer module).

Example:

>>> sup = Superimposer()
# Specify the atom lists
# 'fixed' and 'moving' are lists of Atom objects
# The moving atoms will be put on the fixed atoms
>>> sup.set_atoms(fixed, moving)
# Print rotation/translation/rmsd
>>> print(sup.rotran)
>>> print(sup.rms) 
# Apply rotation/translation to the moving atoms
>>> sup.apply(moving)

To superimpose two structures based on their active sites, use the active site atoms to calculate the rotation/translation matrices (as above), and apply these to the whole molecule.

11.6.6  Mapping the residues of two related structures onto each other

First, create an alignment file in FASTA format, then use the StructureAlignment class. This class can also be used for alignments with more than two structures.

11.6.7  Calculating the Half Sphere Exposure

Half Sphere Exposure (HSE) is a new, 2D measure of solvent exposure [20]. Basically, it counts the number of Cα atoms around a residue in the direction of its side chain, and in the opposite direction (within a radius of 13 Å). Despite its simplicity, it outperforms many other measures of solvent exposure.

HSE comes in two flavors: HSEα and HSEβ. The former only uses the Cα atom positions, while the latter uses the Cα and Cβ atom positions. The HSE measure is calculated by the HSExposure class, which can also calculate the contact number. The latter class has methods which return dictionaries that map a Residue object to its corresponding HSEα, HSEβ and contact number values.

Example:

>>> model = structure[0]
>>> hse = HSExposure()
# Calculate HSEalpha
>>> exp_ca = hse.calc_hs_exposure(model, option='CA3')
# Calculate HSEbeta
>>> exp_cb=hse.calc_hs_exposure(model, option='CB')
# Calculate classical coordination number
>>> exp_fs = hse.calc_fs_exposure(model)
# Print HSEalpha for a residue
>>> print(exp_ca[some_residue])

11.6.8  Determining the secondary structure

For this functionality, you need to install DSSP (and obtain a license for it — free for academic use, see http://www.cmbi.kun.nl/gv/dssp/). Then use the DSSP class, which maps Residue objects to their secondary structure (and accessible surface area). The DSSP codes are listed in Table 11.1. Note that DSSP (the program, and thus by consequence the class) cannot handle multiple models!


CodeSecondary structure
Hα-helix
BIsolated β-bridge residue
EStrand
G3-10 helix
IΠ-helix
TTurn
SBend
-Other
Table 11.1: DSSP codes in Bio.PDB.

The DSSP class can also be used to calculate the accessible surface area of a residue. But see also section 11.6.9.

11.6.9  Calculating the residue depth

Residue depth is the average distance of a residue’s atoms from the solvent accessible surface. It’s a fairly new and very powerful parameterization of solvent accessibility. For this functionality, you need to install Michel Sanner’s MSMS program (http://www.scripps.edu/pub/olson-web/people/sanner/html/msms_home.html). Then use the ResidueDepth class. This class behaves as a dictionary which maps Residue objects to corresponding (residue depth, Cα depth) tuples. The Cα depth is the distance of a residue’s Cα atom to the solvent accessible surface.

Example:

>>> model = structure[0]
>>> rd = ResidueDepth(model, pdb_file)
>>> residue_depth, ca_depth=rd[some_residue]

You can also get access to the molecular surface itself (via the get_surface function), in the form of a Numeric Python array with the surface points.

11.7  Common problems in PDB files

It is well known that many PDB files contain semantic errors (not the structures themselves, but their representation in PDB files). Bio.PDB tries to handle this in two ways. The PDBParser object can behave in two ways: a restrictive way and a permissive way, which is the default.

Example:

# Permissive parser
>>> parser = PDBParser(PERMISSIVE=1)
>>> parser = PDBParser() # The same (default)
# Strict parser
>>> strict_parser = PDBParser(PERMISSIVE=0)

In the permissive state (DEFAULT), PDB files that obviously contain errors are “corrected” (i.e. some residues or atoms are left out). These errors include:

  • Multiple residues with the same identifier
  • Multiple atoms with the same identifier (taking into account the altloc identifier)

These errors indicate real problems in the PDB file (for details see [18, Hamelryck and Manderick, 2003]). In the restrictive state, PDB files with errors cause an exception to occur. This is useful to find errors in PDB files.

Some errors however are automatically corrected. Normally each disordered atom should have a non-blank altloc identifier. However, there are many structures that do not follow this convention, and have a blank and a non-blank identifier for two disordered positions of the same atom. This is automatically interpreted in the right way.

Sometimes a structure contains a list of residues belonging to chain A, followed by residues belonging to chain B, and again followed by residues belonging to chain A, i.e. the chains are ’broken’. This is also correctly interpreted.

11.7.1  Examples

The PDBParser/Structure class was tested on about 800 structures (each belonging to a unique SCOP superfamily). This takes about 20 minutes, or on average 1.5 seconds per structure. Parsing the structure of the large ribosomal subunit (1FKK), which contains about 64000 atoms, takes 10 seconds on a 1000 MHz PC.

Three exceptions were generated in cases where an unambiguous data structure could not be built. In all three cases, the likely cause is an error in the PDB file that should be corrected. Generating an exception in these cases is much better than running the chance of incorrectly describing the structure in a data structure.

11.7.1.1  Duplicate residues

One structure contains two amino acid residues in one chain with the same sequence identifier (resseq 3) and icode. Upon inspection it was found that this chain contains the residues Thr A3, …, Gly A202, Leu A3, Glu A204. Clearly, Leu A3 should be Leu A203. A couple of similar situations exist for structure 1FFK (which e.g. contains Gly B64, Met B65, Glu B65, Thr B67, i.e. residue Glu B65 should be Glu B66).

11.7.1.2  Duplicate atoms

Structure 1EJG contains a Ser/Pro point mutation in chain A at position 22. In turn, Ser 22 contains some disordered atoms. As expected, all atoms belonging to Ser 22 have a non-blank altloc specifier (B or C). All atoms of Pro 22 have altloc A, except the N atom which has a blank altloc. This generates an exception, because all atoms belonging to two residues at a point mutation should have non-blank altloc. It turns out that this atom is probably shared by Ser and Pro 22, as Ser 22 misses the N atom. Again, this points to a problem in the file: the N atom should be present in both the Ser and the Pro residue, in both cases associated with a suitable altloc identifier.

11.7.2  Automatic correction

Some errors are quite common and can be easily corrected without much risk of making a wrong interpretation. These cases are listed below.

11.7.2.1  A blank altloc for a disordered atom

Normally each disordered atom should have a non-blank altloc identifier. However, there are many structures that do not follow this convention, and have a blank and a non-blank identifier for two disordered positions of the same atom. This is automatically interpreted in the right way.

11.7.2.2  Broken chains

Sometimes a structure contains a list of residues belonging to chain A, followed by residues belonging to chain B, and again followed by residues belonging to chain A, i.e. the chains are “broken”. This is correctly interpreted.

11.7.3  Fatal errors

Sometimes a PDB file cannot be unambiguously interpreted. Rather than guessing and risking a mistake, an exception is generated, and the user is expected to correct the PDB file. These cases are listed below.

11.7.3.1  Duplicate residues

All residues in a chain should have a unique id. This id is generated based on:

  • The sequence identifier (resseq).
  • The insertion code (icode).
  • The hetfield string (“W” for waters and “H_” followed by the residue name for other hetero residues)
  • The residue names of the residues in the case of point mutations (to store the Residue objects in a DisorderedResidue object).

If this does not lead to a unique id something is quite likely wrong, and an exception is generated.

11.7.3.2  Duplicate atoms

All atoms in a residue should have a unique id. This id is generated based on:

  • The atom name (without spaces, or with spaces if a problem arises).
  • The altloc specifier.

If this does not lead to a unique id something is quite likely wrong, and an exception is generated.

11.8  Accessing the Protein Data Bank

11.8.1  Downloading structures from the Protein Data Bank

Structures can be downloaded from the PDB (Protein Data Bank) by using the retrieve_pdb_file method on a PDBList object. The argument for this method is the PDB identifier of the structure.

>>> pdbl = PDBList()
>>> pdbl.retrieve_pdb_file('1FAT')

The PDBList class can also be used as a command-line tool:

python PDBList.py 1fat

The downloaded file will be called pdb1fat.ent and stored in the current working directory. Note that the retrieve_pdb_file method also has an optional argument pdir that specifies a specific directory in which to store the downloaded PDB files.

The retrieve_pdb_file method also has some options to specify the compression format used for the download, and the program used for local decompression (default .Z format and gunzip). In addition, the PDB ftp site can be specified upon creation of the PDBList object. By default, the server of the Worldwide Protein Data Bank (ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/) is used. See the API documentation for more details. Thanks again to Kristian Rother for donating this module.

11.8.2  Downloading the entire PDB

The following commands will store all PDB files in the /data/pdb directory:

python PDBList.py all /data/pdb

python PDBList.py all /data/pdb -d

The API method for this is called download_entire_pdb. Adding the -d option will store all files in the same directory. Otherwise, they are sorted into PDB-style subdirectories according to their PDB ID’s. Depending on the traffic, a complete download will take 2-4 days.

11.8.3  Keeping a local copy of the PDB up to date

This can also be done using the PDBList object. One simply creates a PDBList object (specifying the directory where the local copy of the PDB is present) and calls the update_pdb method:

>>> pl = PDBList(pdb='/data/pdb')
>>> pl.update_pdb()

One can of course make a weekly cronjob out of this to keep the local copy automatically up-to-date. The PDB ftp site can also be specified (see API documentation).

PDBList has some additional methods that can be of use. The get_all_obsolete method can be used to get a list of all obsolete PDB entries. The changed_this_week method can be used to obtain the entries that were added, modified or obsoleted during the current week. For more info on the possibilities of PDBList, see the API documentation.

11.9  General questions

11.9.1  How well tested is Bio.PDB?

Pretty well, actually. Bio.PDB has been extensively tested on nearly 5500 structures from the PDB - all structures seemed to be parsed correctly. More details can be found in the Bio.PDB Bioinformatics article. Bio.PDB has been used/is being used in many research projects as a reliable tool. In fact, I’m using Bio.PDB almost daily for research purposes and continue working on improving it and adding new features.

11.9.2  How fast is it?

The PDBParser performance was tested on about 800 structures (each belonging to a unique SCOP superfamily). This takes about 20 minutes, or on average 1.5 seconds per structure. Parsing the structure of the large ribosomal subunit (1FKK), which contains about 64000 atoms, takes 10 seconds on a 1000 MHz PC. In short: it’s more than fast enough for many applications.

11.9.3  Is there support for molecular graphics?

Not directly, mostly since there are quite a few Python based/Python aware solutions already, that can potentially be used with Bio.PDB. My choice is Pymol, BTW (I’ve used this successfully with Bio.PDB, and there will probably be specific PyMol modules in Bio.PDB soon/some day). Python based/aware molecular graphics solutions include:

11.9.4  Who’s using Bio.PDB?

Bio.PDB was used in the construction of DISEMBL, a web server that predicts disordered regions in proteins (http://dis.embl.de/), and COLUMBA, a website that provides annotated protein structures (http://www.columba-db.de/). Bio.PDB has also been used to perform a large scale search for active sites similarities between protein structures in the PDB [19, Hamelryck, 2003], and to develop a new algorithm that identifies linear secondary structure elements [26, Majumdar et al., 2005].

Judging from requests for features and information, Bio.PDB is also used by several LPCs (Large Pharmaceutical Companies :-).

Chapter 12  Bio.PopGen: Population genetics

Bio.PopGen is a Biopython module supporting population genetics, available in Biopython 1.44 onwards.

The medium term objective for the module is to support widely used data formats, applications and databases. This module is currently under intense development and support for new features should appear at a rather fast pace. Unfortunately this might also entail some instability on the API, especially if you are using a development version. APIs that are made available on our official public releases should be much more stable.

12.1  GenePop

GenePop (http://genepop.curtin.edu.au/) is a popular population genetics software package supporting Hardy-Weinberg tests, linkage desiquilibrium, population diferentiation, basic statistics, Fst and migration estimates, among others. GenePop does not supply sequence based statistics as it doesn’t handle sequence data. The GenePop file format is supported by a wide range of other population genetic software applications, thus making it a relevant format in the population genetics field.

Bio.PopGen provides a parser and generator of GenePop file format. Utilities to manipulate the content of a record are also provided. Here is an example on how to read a GenePop file (you can find example GenePop data files in the Test/PopGen directory of Biopython):

from Bio.PopGen import GenePop

handle = open("example.gen")
rec = GenePop.read(handle)
handle.close()

This will read a file called example.gen and parse it. If you do print rec, the record will be output again, in GenePop format.

The most important information in rec will be the loci names and population information (but there is more – use help(GenePop.Record) to check the API documentation). Loci names can be found on rec.loci_list. Population information can be found on rec.populations. Populations is a list with one element per population. Each element is itself a list of individuals, each individual is a pair composed by individual name and a list of alleles (2 per marker), here is an example for rec.populations:

[
    [
        ('Ind1', [(1, 2),    (3, 3), (200, 201)],
        ('Ind2', [(2, None), (3, 3), (None, None)],
    ],
    [
        ('Other1', [(1, 1),  (4, 3), (200, 200)],
    ]
]

So we have two populations, the first with two individuals, the second with only one. The first individual of the first population is called Ind1, allelic information for each of the 3 loci follows. Please note that for any locus, information might be missing (see as an example, Ind2 above).

A few utility functions to manipulate GenePop records are made available, here is an example:

from Bio.PopGen import GenePop

#Imagine that you have loaded rec, as per the code snippet above...

rec.remove_population(pos)
#Removes a population from a record, pos is the population position in
#  rec.populations, remember that it starts on position 0.
#  rec is altered.

rec.remove_locus_by_position(pos)
#Removes a locus by its position, pos is the locus position in
#  rec.loci_list, remember that it starts on position 0.
#  rec is altered.

rec.remove_locus_by_name(name)
#Removes a locus by its name, name is the locus name as in
#  rec.loci_list. If the name doesn't exist the function fails
#  silently.
#  rec is altered.

rec_loci = rec.split_in_loci()
#Splits a record in loci, that is, for each loci, it creates a new
#  record, with a single loci and all populations.
#  The result is returned in a dictionary, being each key the locus name.
#  The value is the GenePop record.
#  rec is not altered.

rec_pops =  rec.split_in_pops(pop_names)
#Splits a record in populations, that is, for each population, it creates
#  a new record, with a single population and all loci.
#  The result is returned in a dictionary, being each key
#  the population name. As population names are not available in GenePop,
#  they are passed in array (pop_names).
#  The value of each dictionary entry is the GenePop record.
#  rec is not altered.

GenePop does not support population names, a limitation which can be cumbersome at times. Functionality to enable population names is currently being planned for Biopython. These extensions won’t break compatibility in any way with the standard format. In the medium term, we would also like to support the GenePop web service.

12.2  Coalescent simulation

A coalescent simulation is a backward model of population genetics with relation to time. A simulation of ancestry is done until the Most Recent Common Ancestor (MRCA) is found. This ancestry relationship starting on the MRCA and ending on the current generation sample is sometimes called a genealogy. Simple cases assume a population of constant size in time, haploidy, no population structure, and simulate the alleles of a single locus under no selection pressure.

Coalescent theory is used in many fields like selection detection, estimation of demographic parameters of real populations or disease gene mapping.

The strategy followed in the Biopython implementation of the coalescent was not to create a new, built-in, simulator from scratch but to use an existing one, SIMCOAL2 (http://cmpg.unibe.ch/software/simcoal2/). SIMCOAL2 allows for, among others, population structure, multiple demographic events, simulation of multiple types of loci (SNPs, sequences, STRs/microsatellites and RFLPs) with recombination, diploidy multiple chromosomes or ascertainment bias. Notably SIMCOAL2 doesn’t support any selection model. We recommend reading SIMCOAL2’s documentation, available in the link above.

The input for SIMCOAL2 is a file specifying the desired demography and genome, the output is a set of files (typically around 1000) with the simulated genomes of a sample of individuals per subpopulation. This set of files can be used in many ways, like to compute confidence intervals where which certain statistics (e.g., Fst or Tajima D) are expected to lie. Real population genetics datasets statistics can then be compared to those confidence intervals.

Biopython coalescent code allows to create demographic scenarios and genomes and to run SIMCOAL2.

12.2.1  Creating scenarios

Creating a scenario involves both creating a demography and a chromosome structure. In many cases (e.g. when doing Approximate Bayesian Computations – ABC) it is important to test many parameter variations (e.g. vary the effective population size, Ne, between 10, 50, 500 and 1000 individuals). The code provided allows for the simulation of scenarios with different demographic parameters very easily.

Below we see how we can create scenarios and then how simulate them.

12.2.1.1  Demography

A few predefined demographies are built-in, all have two shared parameters: sample size (called sample_size on the template, see below for its use) per deme and deme size, i.e. subpopulation size (pop_size). All demographies are available as templates where all parameters can be varied, each template has a system name. The prefedined demographies/templates are:

Single population, constant size
The standard parameters are enough to specify it. Template name: simple.
Single population, bottleneck
As seen on figure 12.2.1.1. The parameters are current population size (pop_size on template ne3 on figure), time of expansion, given as the generation in the past when it occurred (expand_gen), effective population size during bottleneck (ne2), time of contraction (contract_gen) and original size in the remote past (ne3). Template name: bottle.
Island model
The typical island model. The total number of demes is specified by total_demes and the migration rate by mig. Template name island.
Stepping stone model - 1 dimension
The stepping stone model in 1 dimension, extremes disconnected. The total number of demes is total_demes, migration rate is mig. Template name is ssm_1d.
Stepping stone model - 2 dimensions
The stepping stone model in 2 dimensions, extremes disconnected. The parameters are x for the horizontal dimension and y for the vertical (being the total number of demes x times y), migration rate is mig. Template name is ssm_2d.

In our first example, we will generate a template for a single population, constant size model with a sample size of 30 and a deme size of 500. The code for this is:

from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template

generate_simcoal_from_template('simple',
    [(1, [('SNP', [24, 0.0005, 0.0])])],
    [('sample_size', [30]),
    ('pop_size', [100])])

Executing this code snippet will generate a file on the current directory called simple_100_300.par this file can be given as input to SIMCOAL2 to simulate the demography (below we will see how Biopython can take care of calling SIMCOAL2).

This code consists of a single function call, let’s discuss it parameter by parameter.

The first parameter is the template id (from the list above). We are using the id ’simple’ which is the template for a single population of constant size along time.

The second parameter is the chromosome structure. Please ignore it for now, it will be explained in the next section.

The third parameter is a list of all required parameters (recall that the simple model only needs sample_size and pop_size) and possible values (in this case each parameter only has a possible value).

Now, let’s consider an example where we want to generate several island models, and we are interested in varying the number of demes: 10, 50 and 100 with a migration rate of 1%. Sample size and deme size will be the same as before. Here is the code:

from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template

generate_simcoal_from_template('island',
    [(1, [('SNP', [24, 0.0005, 0.0])])],
    [('sample_size', [30]),
    ('pop_size', [100]),
    ('mig', [0.01]),
    ('total_demes', [10, 50, 100])])

In this case, 3 files will be generated: island_100_0.01_100_30.par, island_10_0.01_100_30.par and island_50_0.01_100_30.par. Notice the rule to make file names: template name, followed by parameter values in reverse order.

A few, arguably more esoteric template demographies exist (please check the Bio/PopGen/SimCoal/data directory on Biopython source tree). Furthermore it is possible for the user to create new templates. That functionality will be discussed in a future version of this document.

12.2.1.2  Chromosome structure

We strongly recommend reading SIMCOAL2 documentation to understand the full potential available in modeling chromosome structures. In this subsection we only discuss how to implement chromosome structures using the Biopython interface, not the underlying SIMCOAL2 capabilities.

We will start by implementing a single chromosome, with 24 SNPs with a recombination rate immediately on the right of each locus of 0.0005 and a minimum frequency of the minor allele of 0. This will be specified by the following list (to be passed as second parameter to the function generate_simcoal_from_template):

[(1, [('SNP', [24, 0.0005, 0.0])])]

This is actually the chromosome structure used in the above examples.

The chromosome structure is represented by a list of chromosomes, each chromosome (i.e., each element in the list) is composed by a tuple (a pair): the first element is the number of times the chromosome is to be repeated (as there might be interest in repeating the same chromosome many times). The second element is a list of the actual components of the chromosome. Each element is again a pair, the first member is the locus type and the second element the parameters for that locus type. Confused? Before showing more examples let’s review the example above: We have a list with one element (thus one chromosome), the chromosome is a single instance (therefore not to be repeated), it is composed of 24 SNPs, with a recombination rate of 0.0005 between each consecutive SNP, the minimum frequency of the minor allele is 0.0 (i.e, it can be absent from a certain population).

Let’s see a more complicated example:

[
  (5, [
       ('SNP', [24, 0.0005, 0.0])
      ]
  ),
  (2, [
       ('DNA', [10, 0.0, 0.00005, 0.33]),
       ('RFLP', [1, 0.0, 0.0001]),
       ('MICROSAT', [1, 0.0, 0.001, 0.0, 0.0])
      ]
  )
]

We start by having 5 chromosomes with the same structure as above (i.e., 24 SNPs). We then have 2 chromosomes which have a DNA sequence with 10 nucleotides, 0.0 recombination rate, 0.0005 mutation rate, and a transition rate of 0.33. Then we have an RFLP with 0.0 recombination rate to the next locus and a 0.0001 mutation rate. Finally we have a microsatellite (or STR), with 0.0 recombination rate to the next locus (note, that as this is a single microsatellite which has no loci following, this recombination rate here is irrelevant), with a mutation rate of 0.001, geometric parameter of 0.0 and a range constraint of 0.0 (for information about this parameters please consult the SIMCOAL2 documentation, you can use them to simulate various mutation models, including the typical – for microsatellites – stepwise mutation model among others).

12.2.2  Running SIMCOAL2

We now discuss how to run SIMCOAL2 from inside Biopython. It is required that the binary for SIMCOAL2 is called simcoal2 (or simcoal2.exe on Windows based platforms), please note that the typical name when downloading the program is in the format simcoal2_x_y. As such, when installing SIMCOAL2 you will need to rename of the downloaded executable so that Biopython can find it.

It is possible to run SIMCOAL2 on files that were not generated using the method above (e.g., writing a parameter file by hand), but we will show an example by creating a model using the framework presented above.

from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template
from Bio.PopGen.SimCoal.Controller import SimCoalController


generate_simcoal_from_template('simple',
    [
      (5, [
           ('SNP', [24, 0.0005, 0.0])
          ]
      ),
      (2, [
           ('DNA', [10, 0.0, 0.00005, 0.33]),
           ('RFLP', [1, 0.0, 0.0001]),
           ('MICROSAT', [1, 0.0, 0.001, 0.0, 0.0])
          ]
      )
    ],
    [('sample_size', [30]),
    ('pop_size', [100])])

ctrl = SimCoalController('.')
ctrl.run_simcoal('simple_100_30.par', 50)

The lines of interest are the last two (plus the new import). Firstly a controller for the application is created. The directory where the binary is located has to be specified.

The simulator is then run on the last line: we know, from the rules explained above, that the input file name is simple_100_30.par for the simulation parameter file created. We then specify that we want to run 50 independent simulations, by default Biopython requests a simulation of diploid data, but a third parameter can be added to simulate haploid data (adding as a parameter the string ’0’). SIMCOAL2 will now run (please note that this can take quite a lot of time) and will create a directory with the simulation results. The results can now be analysed (typically studying the data with Arlequin3). In the future Biopython might support reading the Arlequin3 format and thus allowing for the analysis of SIMCOAL2 data inside Biopython.

12.3  Other applications

Here we discuss interfaces and utilities to deal with population genetics’ applications which arguably have a smaller user base.

12.3.1  FDist: Detecting selection and molecular adaptation

FDist is a selection detection application suite based on computing (i.e. simulating) a “neutral” confidence interval based on Fst and heterozygosity. Markers (which can be SNPs, microsatellites, AFLPs among others) which lie outside the “neutral” interval are to be considered as possible candidates for being under selection.

FDist is mainly used when the number of markers is considered enough to estimate an average Fst, but not enough to either have outliers calculated from the dataset directly or, with even more markers for which the relative positions in the genome are known, to use approaches based on, e.g., Extended Haplotype Heterozygosity (EHH).

The typical usage pattern for FDist is as follows:

  1. Import a dataset from an external format into FDist format.
  2. Compute average Fst. This is done by datacal inside FDist.
  3. Simulate “neutral” markers based on the average Fst and expected number of total populations. This is the core operation, done by fdist inside FDist.
  4. Calculate the confidence interval, based on the desired confidence boundaries (typically 95% or 99%). This is done by cplot and is mainly used to plot the interval.
  5. Assess each marker status against the simulation “neutral” confidence interval. Done by pv. This is used to detect the outlier status of each marker against the simulation.

We will now discuss each step with illustrating example code (for this example to work FDist binaries have to be on the executable PATH).

The FDist data format is application specific and is not used at all by other applications, as such you will probably have to convert your data for use with FDist. Biopython can help you do this. Here is an example converting from GenePop format to FDist format (along with imports that will be needed on examples further below):

from Bio.PopGen import GenePop
from Bio.PopGen import FDist
from Bio.PopGen.FDist import Controller
from Bio.PopGen.FDist.Utils import convert_genepop_to_fdist

gp_rec = GenePop.read(open("example.gen"))
fd_rec = convert_genepop_to_fdist(gp_rec)
in_file = open("infile", "w")
in_file.write(str(fd_rec))
in_file.close()

In this code we simply parse a GenePop file and convert it to a FDist record.

Printing an FDist record will generate a string that can be directly saved to a file and supplied to FDist. FDist requires the input file to be called infile, therefore we save the record on a file with that name.

The most important fields on a FDist record are: num_pops, the number of populations; num_loci, the number of loci and loci_data with the marker data itself. Most probably the details of the record are of no interest to the user, as the record only purpose is to be passed to FDist.

The next step is to calculate the average Fst of the dataset (along with the sample size):

ctrl = Controller.FDistController()
fst, samp_size = ctrl.run_datacal()

On the first line we create an object to control the call of FDist suite, this object will be used further on in order to call other suite applications.

On the second line we call the datacal application which computes the average Fst and the sample size. It is worth noting that the Fst computed by datacal is a variation of Weir and Cockerham’s θ.

We can now call the main fdist application in order to simulate neutral markers.

sim_fst = ctrl.run_fdist(npops = 15, nsamples = fd_rec.num_pops, fst = fst,
    sample_size = samp_size, mut = 0, num_sims = 40000)
npops
Number of populations existing in nature. This is really a “guestimate”. Has to be lower than 100.
nsamples
Number of populations sampled, has to be lower than npops.
fst
Average Fst.
sample_size
Average number of individuals sampled on each population.
mut
Mutation model: 0 - Infinite alleles; 1 - Stepwise mutations
num_sims
Number of simulations to perform. Typically a number around 40000 will be OK, but if you get a confidence interval that looks sharp (this can be detected when plotting the confidence interval computed below) the value can be increased (a suggestion would be steps of 10000 simulations).

The confusion in wording between number of samples and sample size stems from the original application.

A file named out.dat will be created with the simulated heterozygosities and Fsts, it will have as many lines as the number of simulations requested.

Note that fdist returns the average Fst that it was capable of simulating, for more details about this issue please read below the paragraph on approximating the desired average Fst.

The next (optional) step is to calculate the confidence interval:

cpl_interval = ctrl.run_cplot(ci=0.99)

You can only call cplot after having run fdist.

This will calculate the confidence intervals (99% in this case) for a previous fdist run. A list of quadruples is returned. The first element represents the heterozygosity, the second the lower bound of Fst confidence interval for that heterozygosity, the third the average and the fourth the upper bound. This can be used to trace the confidence interval contour. This list is also written to a file, out.cpl.

The main purpose of this step is return a set of points which can be easily used to plot a confidence interval. It can be skipped if the objective is only to assess the status of each marker against the simulation, which is the next step...

pv_data = ctrl.run_pv()

You can only call cplot after having run datacal and fdist.

This will use the simulated markers to assess the status of each individual real marker. A list, in the same order than the loci_list that is on the FDist record (which is in the same order that the GenePop record) is returned. Each element in the list is a quadruple, the fundamental member of each quadruple is the last element (regarding the other elements, please refer to the pv documentation – for the sake of simplicity we will not discuss them here) which returns the probability of the simulated Fst being lower than the marker Fst. Higher values would indicate a stronger candidate for positive selection, lower values a candidate for balancing selection, and intermediate values a possible neutral marker. What is “higher”, “lower” or “intermediate” is really a subjective issue, but taking a “confidence interval” approach and considering a 95% confidence interval, “higher” would be between 0.95 and 1.0, “lower” between 0.0 and 0.05 and “intermediate” between 0.05 and 0.95.

12.3.1.1  Approximating the desired average Fst

Fdist tries to approximate the desired average Fst by doing a coalescent simulation using migration rates based on the formula

Nm = 
1 − Fst
4Fst
 

This formula assumes a few premises like an infinite number of populations.

In practice, when the number of populations is low, the mutation model is stepwise and the sample size increases, fdist will not be able to simulate an acceptable approximate average Fst.

To address that, a function is provided to iteratively approach the desired value by running several fdists in sequence. This approach is computationally more intensive than running a single fdist run, but yields good results. The following code runs fdist approximating the desired Fst:

sim_fst = ctrl.run_fdist_force_fst(npops = 15, nsamples = fd_rec.num_pops,
    fst = fst, sample_size = samp_size, mut = 0, num_sims = 40000,
    limit = 0.05)

The only new optional parameter, when comparing with run_fdist, is limit which is the desired maximum error. run_fdist can (and probably should) be safely replaced with run_fdist_force_fst.

12.3.1.2  Final notes

The process to determine the average Fst can be more sophisticated than the one presented here. For more information we refer you to the FDist README file. Biopython’s code can be used to implement more sophisticated approaches.

12.4  Future Developments

The most desired future developments would be the ones you add yourself ;) .

That being said, already existing fully functional code is currently being incorporated in Bio.PopGen, that code covers the applications FDist and SimCoal2, the HapMap and UCSC Table Browser databases and some simple statistics like Fst, or allele counts.

Chapter 13  Phylogenetics with Bio.Phylo

The Bio.Phylo module was introduced in Biopython 1.54. Following the lead of SeqIO and AlignIO, it aims to provide a common way to work with phylogenetic trees independently of the source data format, as well as a consistent API for I/O operations.

Bio.Phylo is described in an open-access journal article [9, Talevich et al., 2012], which you might also find helpful.

13.1  Demo: What’s in a Tree?

To get acquainted with the module, let’s start with a tree that we’ve already constructed, and inspect it a few different ways. Then we’ll colorize the branches, to use a special phyloXML feature, and finally save it.

In a terminal, create a simple Newick file using your favorite text editor:

% cat > simple.dnd <<EOF
> (((A,B),(C,D)),(E,F,G));
> EOF

This tree has no branch lengths, only a topology and labelled terminals. (If you have a real tree file available, you can follow this demo using that instead.)

Launch the Python interpreter of your choice:

% ipython -pylab

For interactive work, launching the IPython interpreter with the -pylab flag enables matplotlib integration, so graphics will pop up automatically. We’ll use that during this demo.

Now, within Python, read the tree file, giving the file name and the name of the format.

>>> from Bio import Phylo
>>> tree = Phylo.read("simple.dnd", "newick")

Printing the tree object as a string gives us a look at the entire object hierarchy.

>>> print(tree)

Tree(weight=1.0, rooted=False, name="")
    Clade(branch_length=1.0)
        Clade(branch_length=1.0)
            Clade(branch_length=1.0)
                Clade(branch_length=1.0, name="A")
                Clade(branch_length=1.0, name="B")
            Clade(branch_length=1.0)
                Clade(branch_length=1.0, name="C")
                Clade(branch_length=1.0, name="D")
        Clade(branch_length=1.0)
            Clade(branch_length=1.0, name="E")
            Clade(branch_length=1.0, name="F")
            Clade(branch_length=1.0, name="G")

The Tree object contains global information about the tree, such as whether it’s rooted or unrooted. It has one root clade, and under that, it’s nested lists of clades all the way down to the tips.

The function draw_ascii creates a simple ASCII-art (plain text) dendrogram. This is a convenient visualization for interactive exploration, in case better graphical tools aren’t available.

>>> Phylo.draw_ascii(tree)
                                                    ________________________ A
                           ________________________|
                          |                        |________________________ B
  ________________________|
 |                        |                         ________________________ C
 |                        |________________________|
_|                                                 |________________________ D
 |
 |                         ________________________ E
 |                        |
 |________________________|________________________ F
                          |
                          |________________________ G

If you have matplotlib or pylab installed, you can create a graphic using the draw function (see Fig. 13.1):

>>> tree.rooted = True
>>> Phylo.draw(tree)

13.1.1  Coloring branches within a tree

The functions draw and draw_graphviz support the display of different colors and branch widths in a tree. As of Biopython 1.59, the color and width attributes are available on the basic Clade object and there’s nothing extra required to use them. Both attributes refer to the branch leading the given clade, and apply recursively, so all descendent branches will also inherit the assigned width and color values during display.

In earlier versions of Biopython, these were special features of PhyloXML trees, and using the attributes required first converting the tree to a subclass of the basic tree object called Phylogeny, from the Bio.Phylo.PhyloXML module.

In Biopython 1.55 and later, this is a convenient tree method:

>>> tree = tree.as_phyloxml()

In Biopython 1.54, you can accomplish the same thing with one extra import:

>>> from Bio.Phylo.PhyloXML import Phylogeny
>>> tree = Phylogeny.from_tree(tree)

Note that the file formats Newick and Nexus don’t support branch colors or widths, so if you use these attributes in Bio.Phylo, you will only be able to save the values in PhyloXML format. (You can still save a tree as Newick or Nexus, but the color and width values will be skipped in the output file.)

Now we can begin assigning colors. First, we’ll color the root clade gray. We can do that by assigning the 24-bit color value as an RGB triple, an HTML-style hex string, or the name of one of the predefined colors.

>>> tree.root.color = (128, 128, 128)

Or:

>>> tree.root.color = "#808080"

Or:

>>> tree.root.color = "gray"

Colors for a clade are treated as cascading down through the entire clade, so when we colorize the root here, it turns the whole tree gray. We can override that by assigning a different color lower down on the tree.

Let’s target the most recent common ancestor (MRCA) of the nodes named “E” and “F”. The common_ancestor method returns a reference to that clade in the original tree, so when we color that clade “salmon”, the color will show up in the original tree.

>>> mrca = tree.common_ancestor({"name": "E"}, {"name": "F"})
>>> mrca.color = "salmon"

If we happened to know exactly where a certain clade is in the tree, in terms of nested list entries, we can jump directly to that position in the tree by indexing it. Here, the index [0,1] refers to the second child of the first child of the root.

>>> tree.clade[0, 1].color = "blue"

Finally, show our work (see Fig. 13.1.1):

>>> Phylo.draw(tree)

Note that a clade’s color includes the branch leading to that clade, as well as its descendents. The common ancestor of E and F turns out to be just under the root, and with this coloring we can see exactly where the root of the tree is.

My, we’ve accomplished a lot! Let’s take a break here and save our work. Call the write function with a file name or handle — here we use standard output, to see what would be written — and the format phyloxml. PhyloXML saves the colors we assigned, so you can open this phyloXML file in another tree viewer like Archaeopteryx, and the colors will show up there, too.

>>> import sys
>>> Phylo.write(tree, sys.stdout, "phyloxml")

<phy:phyloxml xmlns:phy="http://www.phyloxml.org">
  <phy:phylogeny rooted="true">
    <phy:clade>
      <phy:branch_length>1.0</phy:branch_length>
      <phy:color>
        <phy:red>128</phy:red>
        <phy:green>128</phy:green>
        <phy:blue>128</phy:blue>
      </phy:color>
      <phy:clade>
        <phy:branch_length>1.0</phy:branch_length>
        <phy:clade>
          <phy:branch_length>1.0</phy:branch_length>
          <phy:clade>
            <phy:name>A</phy:name>
            ...

The rest of this chapter covers the core functionality of Bio.Phylo in greater detail. For more examples of using Bio.Phylo, see the cookbook page on Biopython.org:

http://biopython.org/wiki/Phylo_cookbook

13.2  I/O functions

Like SeqIO and AlignIO, Phylo handles file input and output through four functions: parse, read, write and convert, all of which support the tree file formats Newick, NEXUS, phyloXML and NeXML, as well as the Comparative Data Analysis Ontology (CDAO).

The read function parses a single tree in the given file and returns it. Careful; it will raise an error if the file contains more than one tree, or no trees.

>>> from Bio import Phylo
>>> tree = Phylo.read("Tests/Nexus/int_node_labels.nwk", "newick")
>>> print(tree)

(Example files are available in the Tests/Nexus/ and Tests/PhyloXML/ directories of the Biopython distribution.)

To handle multiple (or an unknown number of) trees, use the parse function iterates through each of the trees in the given file:

>>> trees = Phylo.parse("Tests/PhyloXML/phyloxml_examples.xml", "phyloxml")
>>> for tree in trees:
...     print(tree)

Write a tree or iterable of trees back to file with the write function:

>>> trees = list(Phylo.parse("phyloxml_examples.xml", "phyloxml"))
>>> tree1 = trees[0]
>>> others = trees[1:]
>>> Phylo.write(tree1, "tree1.xml", "phyloxml")
1
>>> Phylo.write(others, "other_trees.xml", "phyloxml")
12

Convert files between any of the supported formats with the convert function:

>>> Phylo.convert("tree1.dnd", "newick", "tree1.xml", "nexml")
1
>>> Phylo.convert("other_trees.xml", "phyloxml", "other_trees.nex", 'nexus")
12

To use strings as input or output instead of actual files, use StringIO as you would with SeqIO and AlignIO:

>>> from Bio import Phylo
>>> from StringIO import StringIO
>>> handle = StringIO("(((A,B),(C,D)),(E,F,G));")
>>> tree = Phylo.read(handle, "newick")

13.3  View and export trees

The simplest way to get an overview of a Tree object is to print it:

>>> tree = Phylo.read("Tests/PhyloXML/example.xml", "phyloxml")
>>> print(tree)
Phylogeny(rooted='True', description='phyloXML allows to use either a "branch_length"
attribute...', name='example from Prof. Joe Felsenstein's book "Inferring Phyl...')
    Clade()
        Clade(branch_length='0.06')
            Clade(branch_length='0.102', name='A')
            Clade(branch_length='0.23', name='B')
        Clade(branch_length='0.4', name='C')

This is essentially an outline of the object hierarchy Biopython uses to represent a tree. But more likely, you’d want to see a drawing of the tree. There are three functions to do this.

As we saw in the demo, draw_ascii prints an ascii-art drawing of the tree (a rooted phylogram) to standard output, or an open file handle if given. Not all of the available information about the tree is shown, but it provides a way to quickly view the tree without relying on any external dependencies.

>>> tree = Phylo.read("example.xml", "phyloxml")
>>> Phylo.draw_ascii(tree)
             __________________ A
  __________|
_|          |___________________________________________ B
 |
 |___________________________________________________________________________ C

The draw function draws a more attractive image using the matplotlib library. See the API documentation for details on the arguments it accepts to customize the output.

>>> tree = Phylo.read("example.xml", "phyloxml")
>>> Phylo.draw(tree, branch_labels=lambda c: c.branch_length)

draw_graphviz draws an unrooted cladogram, but requires that you have Graphviz, PyDot or PyGraphviz, NetworkX, and matplotlib (or pylab) installed. Using the same example as above, and the dot program included with Graphviz, let’s draw a rooted tree (see Fig. 13.3):

>>> tree = Phylo.read("example.xml", "phyloxml")
>>> Phylo.draw_graphviz(tree, prog='dot')
>>> import pylab
>>> pylab.show()                    # Displays the tree in an interactive viewer
>>> pylab.savefig('phylo-dot.png')  # Creates a PNG file of the same graphic

(Tip: If you execute IPython with the -pylab option, calling draw_graphviz causes the matplotlib viewer to launch automatically without manually calling show().)

This exports the tree object to a NetworkX graph, uses Graphviz to lay out the nodes, and displays it using matplotlib. There are a number of keyword arguments that can modify the resulting diagram, including most of those accepted by the NetworkX functions networkx.draw and networkx.draw_graphviz.

The display is also affected by the rooted attribute of the given tree object. Rooted trees are shown with a “head” on each branch indicating direction (see Fig. 13.3):

>>> tree = Phylo.read("simple.dnd", "newick")
>>> tree.rooted = True
>>> Phylo.draw_graphiz(tree)

The “prog” argument specifies the Graphviz engine used for layout. The default, twopi, behaves well for any size tree, reliably avoiding crossed branches. The neato program may draw more attractive moderately-sized trees, but sometimes will cross branches (see Fig. 13.3). The dot program may be useful with small trees, but tends to do surprising things with the layout of larger trees.

>>> Phylo.draw_graphviz(tree, prog="neato")

This viewing mode is particularly handy for exploring larger trees, because the matplotlib viewer can zoom in on a selected region, thinning out a cluttered graphic.

>>> tree = Phylo.read("apaf.xml", "phyloxml")
>>> Phylo.draw_graphviz(tree, prog="neato", node_size=0)

Note that branch lengths are not displayed accurately, because Graphviz ignores them when creating the node layouts. The branch lengths are retained when exporting a tree as a NetworkX graph object (to_networkx), however.

See the Phylo page on the Biopython wiki (http://biopython.org/wiki/Phylo) for descriptions and examples of the more advanced functionality in draw_ascii, draw_graphviz and to_networkx.

13.4  Using Tree and Clade objects

The Tree objects produced by parse and read are containers for recursive sub-trees, attached to the Tree object at the root attribute (whether or not the phylogenic tree is actually considered rooted). A Tree has globally applied information for the phylogeny, such as rootedness, and a reference to a single Clade; a Clade has node- and clade-specific information, such as branch length, and a list of its own descendent Clade instances, attached at the clades attribute.

So there is a distinction between tree and tree.root. In practice, though, you rarely need to worry about it. To smooth over the difference, both Tree and Clade inherit from TreeMixin, which contains the implementations for methods that would be commonly used to search, inspect or modify a tree or any of its clades. This means that almost all of the methods supported by tree are also available on tree.root and any clade below it. (Clade also has a root property, which returns the clade object itself.)

13.4.1  Search and traversal methods

For convenience, we provide a couple of simplified methods that return all external or internal nodes directly as a list:

get_terminals
makes a list of all of this tree’s terminal (leaf) nodes.
get_nonterminals
makes a list of all of this tree’s nonterminal (internal) nodes.

These both wrap a method with full control over tree traversal, find_clades. Two more traversal methods, find_elements and find_any, rely on the same core functionality and accept the same arguments, which we’ll call a “target specification” for lack of a better description. These specify which objects in the tree will be matched and returned during iteration. The first argument can be any of the following types:

  • A TreeElement instance, which tree elements will match by identity — so searching with a Clade instance as the target will find that clade in the tree;
  • A string, which matches tree elements’ string representation — in particular, a clade’s name (added in Biopython 1.56);
  • A class or type, where every tree element of the same type (or sub-type) will be matched;
  • A dictionary where keys are tree element attributes and values are matched to the corresponding attribute of each tree element. This one gets even more elaborate:
    • If an int is given, it matches numerically equal attributes, e.g. 1 will match 1 or 1.0
    • If a boolean is given (True or False), the corresponding attribute value is evaluated as a boolean and checked for the same
    • None matches None
    • If a string is given, the value is treated as a regular expression (which must match the whole string in the corresponding element attribute, not just a prefix). A given string without special regex characters will match string attributes exactly, so if you don’t use regexes, don’t worry about it. For example, in a tree with clade names Foo1, Foo2 and Foo3, tree.find_clades({"name": "Foo1"}) matches Foo1, {"name": "Foo.*"} matches all three clades, and {"name": "Foo"} doesn’t match anything.

    Since floating-point arithmetic can produce some strange behavior, we don’t support matching floats directly. Instead, use the boolean True to match every element with a nonzero value in the specified attribute, then filter on that attribute manually with an inequality (or exact number, if you like living dangerously).

    If the dictionary contains multiple entries, a matching element must match each of the given attribute values — think “and”, not “or”.

  • A function taking a single argument (it will be applied to each element in the tree), returning True or False. For convenience, LookupError, AttributeError and ValueError are silenced, so this provides another safe way to search for floating-point values in the tree, or some more complex characteristic.

After the target, there are two optional keyword arguments:

terminal
— A boolean value to select for or against terminal clades (a.k.a. leaf nodes): True searches for only terminal clades, False for non-terminal (internal) clades, and the default, None, searches both terminal and non-terminal clades, as well as any tree elements lacking the is_terminal method.
order
— Tree traversal order: "preorder" (default) is depth-first search, "postorder" is DFS with child nodes preceding parents, and "level" is breadth-first search.

Finally, the methods accept arbitrary keyword arguments which are treated the same way as a dictionary target specification: keys indicate the name of the element attribute to search for, and the argument value (string, integer, None or boolean) is compared to the value of each attribute found. If no keyword arguments are given, then any TreeElement types are matched. The code for this is generally shorter than passing a dictionary as the target specification: tree.find_clades({"name": "Foo1"}) can be shortened to tree.find_clades(name="Foo1").

(In Biopython 1.56 or later, this can be even shorter: tree.find_clades("Foo1"))

Now that we’ve mastered target specifications, here are the methods used to traverse a tree:

find_clades
Find each clade containing a matching element. That is, find each element as with find_elements, but return the corresponding clade object. (This is usually what you want.)

The result is an iterable through all matching objects, searching depth-first by default. This is not necessarily the same order as the elements appear in the Newick, Nexus or XML source file!

find_elements
Find all tree elements matching the given attributes, and return the matching elements themselves. Simple Newick trees don’t have complex sub-elements, so this behaves the same as find_clades on them. PhyloXML trees often do have complex objects attached to clades, so this method is useful for extracting those.
find_any
Return the first element found by find_elements(), or None. This is also useful for checking whether any matching element exists in the tree, and can be used in a conditional.

Two more methods help navigating between nodes in the tree:

get_path
List the clades directly between the tree root (or current clade) and the given target. Returns a list of all clade objects along this path, ending with the given target, but excluding the root clade.
trace
List of all clade object between two targets in this tree. Excluding start, including finish.

13.4.2  Information methods

These methods provide information about the whole tree (or any clade).

common_ancestor
Find the most recent common ancestor of all the given targets. (This will be a Clade object). If no target is given, returns the root of the current clade (the one this method is called from); if 1 target is given, this returns the target itself. However, if any of the specified targets are not found in the current tree (or clade), an exception is raised.
count_terminals
Counts the number of terminal (leaf) nodes within the tree.
depths
Create a mapping of tree clades to depths. The result is a dictionary where the keys are all of the Clade instances in the tree, and the values are the distance from the root to each clade (including terminals). By default the distance is the cumulative branch length leading to the clade, but with the unit_branch_lengths=True option, only the number of branches (levels in the tree) is counted.
distance
Calculate the sum of the branch lengths between two targets. If only one target is specified, the other is the root of this tree.
total_branch_length
Calculate the sum of all the branch lengths in this tree. This is usually just called the “length” of the tree in phylogenetics, but we use a more explicit name to avoid confusion with Python terminology.

The rest of these methods are boolean checks:

is_bifurcating
True if the tree is strictly bifurcating; i.e. all nodes have either 2 or 0 children (internal or external, respectively). The root may have 3 descendents and still be considered part of a bifurcating tree.
is_monophyletic
Test if all of the given targets comprise a complete subclade — i.e., there exists a clade such that its terminals are the same set as the given targets. The targets should be terminals of the tree. For convenience, this method returns the common ancestor (MCRA) of the targets if they are monophyletic (instead of the value True), and False otherwise.
is_parent_of
True if target is a descendent of this tree — not required to be a direct descendent. To check direct descendents of a clade, simply use list membership testing: if subclade in clade: ...
is_preterminal
True if all direct descendents are terminal; False if any direct descendent is not terminal.

13.4.3  Modification methods

These methods modify the tree in-place. If you want to keep the original tree intact, make a complete copy of the tree first, using Python’s copy module:

tree = Phylo.read('example.xml', 'phyloxml')
import copy
newtree = copy.deepcopy(tree)
collapse
Deletes the target from the tree, relinking its children to its parent.
collapse_all
Collapse all the descendents of this tree, leaving only terminals. Branch lengths are preserved, i.e. the distance to each terminal stays the same. With a target specification (see above), collapses only the internal nodes matching the specification.
ladderize
Sort clades in-place according to the number of terminal nodes. Deepest clades are placed last by default. Use reverse=True to sort clades deepest-to-shallowest.
prune
Prunes a terminal clade from the tree. If taxon is from a bifurcation, the connecting node will be collapsed and its branch length added to remaining terminal node. This might no longer be a meaningful value.
root_with_outgroup
Reroot this tree with the outgroup clade containing the given targets, i.e. the common ancestor of the outgroup. This method is only available on Tree objects, not Clades.

If the outgroup is identical to self.root, no change occurs. If the outgroup clade is terminal (e.g. a single terminal node is given as the outgroup), a new bifurcating root clade is created with a 0-length branch to the given outgroup. Otherwise, the internal node at the base of the outgroup becomes a trifurcating root for the whole tree. If the original root was bifurcating, it is dropped from the tree.

In all cases, the total branch length of the tree stays the same.

root_at_midpoint
Reroot this tree at the calculated midpoint between the two most distant tips of the tree. (This uses root_with_outgroup under the hood.)
split
Generate n (default 2) new descendants. In a species tree, this is a speciation event. New clades have the given branch_length and the same name as this clade’s root plus an integer suffix (counting from 0) — for example, splitting a clade named “A” produces the sub-clades “A0” and “A1”.

See the Phylo page on the Biopython wiki (http://biopython.org/wiki/Phylo) for more examples of using the available methods.

13.4.4  Features of PhyloXML trees

The phyloXML file format includes fields for annotating trees with additional data types and visual cues.

See the PhyloXML page on the Biopython wiki (http://biopython.org/wiki/PhyloXML) for descriptions and examples of using the additional annotation features provided by PhyloXML.

13.5  Running external applications

While Bio.Phylo doesn’t infer trees from alignments itself, there are third-party programs available that do. These are supported through the module Bio.Phylo.Applications, using the same general framework as Bio.Emboss.Applications, Bio.Align.Applications and others.

Biopython 1.58 introduced a wrapper for PhyML (http://www.atgc-montpellier.fr/phyml/). The program accepts an input alignment in phylip-relaxed format (that’s Phylip format, but without the 10-character limit on taxon names) and a variety of options. A quick example:

>>> from Bio import Phylo
>>> from Bio.Phylo.Applications import PhymlCommandline
>>> cmd = PhymlCommandline(input='Tests/Phylip/random.phy')
>>> out_log, err_log = cmd()

This generates a tree file and a stats file with the names [input filename]_phyml_tree.txt and [input filename]_phyml_stats.txt. The tree file is in Newick format:

>>> tree = Phylo.read('Tests/Phylip/random.phy_phyml_tree.txt', 'newick')
>>> Phylo.draw_ascii(tree)

A similar wrapper for RAxML (http://sco.h-its.org/exelixis/software.html) was added in Biopython 1.60, and FastTree (http://www.microbesonline.org/fasttree/) in Biopython 1.62.

Note that some popular Phylip programs, including dnaml and protml, are already available through the EMBOSS wrappers in Bio.Emboss.Applications if you have the Phylip extensions to EMBOSS installed on your system. See Section 6.4 for some examples and clues on how to use programs like these.

13.6  PAML integration

Biopython 1.58 brought support for PAML (http://abacus.gene.ucl.ac.uk/software/paml.html), a suite of programs for phylogenetic analysis by maximum likelihood. Currently the programs codeml, baseml and yn00 are implemented. Due to PAML’s usage of control files rather than command line arguments to control runtime options, usage of this wrapper strays from the format of other application wrappers in Biopython.

A typical workflow would be to initialize a PAML object, specifying an alignment file, a tree file, an output file and a working directory. Next, runtime options are set via the set_options() method or by reading an existing control file. Finally, the program is run via the run() method and the output file is automatically parsed to a results dictionary.

Here is an example of typical usage of codeml:

>>> from Bio.Phylo.PAML import codeml
>>> cml = codeml.Codeml()
>>> cml.alignment = "Tests/PAML/alignment.phylip"
>>> cml.tree = "Tests/PAML/species.tree"
>>> cml.out_file = "results.out"
>>> cml.working_dir = "./scratch"
>>> cml.set_options(seqtype=1,
...         verbose=0,
...         noisy=0,
...         RateAncestor=0,
...         model=0,
...         NSsites=[0, 1, 2],
...         CodonFreq=2,
...         cleandata=1,
...         fix_alpha=1,
...         kappa=4.54006)
>>> results = cml.run()
>>> ns_sites = results.get("NSsites")
>>> m0 = ns_sites.get(0)
>>> m0_params = m0.get("parameters")
>>> print(m0_params.get("omega"))

Existing output files may be parsed as well using a module’s read() function:

>>> results = codeml.read("Tests/PAML/Results/codeml/codeml_NSsites_all.out")
>>> print(results.get("lnL max"))

Detailed documentation for this new module currently lives on the Biopython wiki: http://biopython.org/wiki/PAML

13.7  Future plans

Bio.Phylo is under active development. Here are some features we might add in future releases:

New methods
Generally useful functions for operating on Tree or Clade objects appear on the Biopython wiki first, so that casual users can test them and decide if they’re useful before we add them to Bio.Phylo:

http://biopython.org/wiki/Phylo_cookbook

Bio.Nexus port
Much of this module was written during Google Summer of Code 2009, under the auspices of NESCent, as a project to implement Python support for the phyloXML data format (see 13.4.4). Support for Newick and Nexus formats was added by porting part of the existing Bio.Nexus module to the new classes used by Bio.Phylo.

Currently, Bio.Nexus contains some useful features that have not yet been ported to Bio.Phylo classes — notably, calculating a consensus tree. If you find some functionality lacking in Bio.Phylo, try poking throught Bio.Nexus to see if it’s there instead.

We’re open to any suggestions for improving the functionality and usability of this module; just let us know on the mailing list or our bug database.

Finally, if you need additional functionality not yet included in the Phylo module, check if it’s available in another of the high-quality Python libraries for phylogenetics such as DendroPy (http://pythonhosted.org/DendroPy/) or PyCogent (http://pycogent.org/). Since these libraries also support standard file formats for phylogenetic trees, you can easily transfer data between libraries by writing to a temporary file or StringIO object.

Chapter 14  Sequence motif analysis using Bio.motifs

This chapter gives an overview of the functionality of the Bio.motifs package included in Biopython. It is intended for people who are involved in the analysis of sequence motifs, so I’ll assume that you are familiar with basic notions of motif analysis. In case something is unclear, please look at Section 14.10 for some relevant links.

Most of this chapter describes the new Bio.motifs package included in Biopython 1.61 onwards, which is replacing the older Bio.Motif package introduced with Biopython 1.50, which was in turn based on two older former Biopython modules, Bio.AlignAce and Bio.MEME. It provides most of their functionality with a unified motif object implementation.

Speaking of other libraries, if you are reading this you might be interested in TAMO, another python library designed to deal with sequence motifs. It supports more de-novo motif finders, but it is not a part of Biopython and has some restrictions on commercial use.

14.1  Motif objects

Since we are interested in motif analysis, we need to take a look at Motif objects in the first place. For that we need to import the Bio.motifs library:

>>> from Bio import motifs

and we can start creating our first motif objects. We can either create a Motif object from a list of instances of the motif, or we can obtain a Motif object by parsing a file from a motif database or motif finding software.

14.1.1  Creating a motif from instances

Suppose we have these instances of a DNA motif:

>>> from Bio.Seq import Seq
>>> instances = [Seq("TACAA"),
...              Seq("TACGC"),
...              Seq("TACAC"),
...              Seq("TACCC"),
...              Seq("AACCC"),
...              Seq("AATGC"),
...              Seq("AATGC"),
...             ]

then we can create a Motif object as follows:

>>> m = motifs.create(instances)

The instances are saved in an attribute m.instances, which is essentially a Python list with some added functionality, as described below. Printing out the Motif object shows the instances from which it was constructed:

>>> print(m)
TACAA
TACGC
TACAC
TACCC
AACCC
AATGC
AATGC
<BLANKLINE>

The length of the motif defined as the sequence length, which should be the same for all instances:

>>> len(m)
5

The Motif object has an attribute .counts containing the counts of each nucleotide at each position. Printing this counts matrix shows it in an easily readable format:

>>> print(m.counts)
        0      1      2      3      4
A:   3.00   7.00   0.00   2.00   1.00
C:   0.00   0.00   5.00   2.00   6.00
G:   0.00   0.00   0.00   3.00   0.00
T:   4.00   0.00   2.00   0.00   0.00
<BLANKLINE>

You can access these counts as a dictionary:

>>> m.counts['A']
[3, 7, 0, 2, 1]

but you can also think of it as a 2D array with the nucleotide as the first dimension and the position as the second dimension:

>>> m.counts['T', 0]
4
>>> m.counts['T', 2]
2
>>> m.counts['T', 3]
0

You can also directly access columns of the counts matrix

>>> m.counts[:, 3]
{'A': 2, 'C': 2, 'T': 0, 'G': 3}

Instead of the nucleotide itself, you can also use the index of the nucleotide in the sorted letters in the alphabet of the motif:

>>> m.alphabet
IUPACUnambiguousDNA()
>>> m.alphabet.letters
'GATC'
>>> sorted(m.alphabet.letters)
['A', 'C', 'G', 'T']
>>> m.counts['A',:]
(3, 7, 0, 2, 1)
>>> m.counts[0,:]
(3, 7, 0, 2, 1)

The motif has an associated consensus sequence, defined as the sequence of letters along the positions of the motif for which the largest value in the corresponding columns of the .counts matrix is obtained:

>>> m.consensus
Seq('TACGC', IUPACUnambiguousDNA())

as well as an anticonsensus sequence, corresponding to the smallest values in the columns of the .counts matrix:

>>> m.anticonsensus
Seq('GGGTG', IUPACUnambiguousDNA())

You can also ask for a degenerate consensus sequence, in which ambiguous nucleotides are used for positions where there are multiple nucleotides with high counts:

>>> m.degenerate_consensus
Seq('WACVC', IUPACAmbiguousDNA())

Here, W and R follow the IUPAC nucleotide ambiguity codes: W is either A or T, and V is A, C, or G [10]. The degenerate consensus sequence is constructed following the rules specified by Cavener [11].

We can also get the reverse complement of a motif:

>>> r = m.reverse_complement()
>>> r.consensus
Seq('GCGTA', IUPACUnambiguousDNA())
>>> r.degenerate_consensus
Seq('GBGTW', IUPACAmbiguousDNA())
>>> print(r)
TTGTA
GCGTA
GTGTA
GGGTA
GGGTT
GCATT
GCATT
<BLANKLINE>

The reverse complement and the degenerate consensus sequence are only defined for DNA motifs.

14.1.2  Creating a sequence logo

If we have internet access, we can create a weblogo:

>>> m.weblogo("mymotif.png")

We should get our logo saved as a PNG in the specified file.

14.2  Reading motifs

Creating motifs from instances by hand is a bit boring, so it’s useful to have some I/O functions for reading and writing motifs. There are not any really well established standards for storing motifs, but there are a couple of formats that are more used than others.

14.2.1  JASPAR

One of the most popular motif databases is JASPAR. In addition to the motif sequence information, the JASPAR database stores a lot of meta-information for each motif. The module Bio.motifs contains a specialized class jaspar.Motif in which this meta-information is represented as attributes:

  • matrix_id - the unique JASPAR motif ID, e.g. ’MA0004.1’
  • name - the name of the TF, e.g. ’Arnt’
  • collection - the JASPAR collection to which the motif belongs, e.g. ’CORE’
  • tf_class - the structual class of this TF, e.g. ’Zipper-Type’
  • tf_family - the family to which this TF belongs, e.g. ’Helix-Loop-Helix’
  • species - the species to which this TF belongs, may have multiple values, these are specified as taxonomy IDs, e.g. 10090
  • tax_group - the taxonomic supergroup to which this motif belongs, e.g. ’vertebrates’
  • acc - the accesion number of the TF protein, e.g. ’P53762’
  • data_type - the type of data used to construct this motif, e.g. ’SELEX’
  • medline - the Pubmed ID of literature supporting this motif, may be multiple values, e.g. 7592839
  • pazar_id - external reference to the TF in the PAZAR database, e.g. ’TF0000003’
  • comment - free form text containing notes about the construction of the motif

The jaspar.Motif class inherits from the generic Motif class and therefore provides all the facilities of any of the motif formats — reading motifs, writing motifs, scanning sequences for motif instances etc.

JASPAR stores motifs in several different ways including three different flat file formats and as an SQL database. All of these formats facilitate the construction of a counts matrix. However, the amount of meta information described above that is available varies with the format.

The JASPAR sites format

The first of the three flat file formats contains a list of instances. As an example, these are the beginning and ending lines of the JASPAR Arnt.sites file showing known binding sites of the mouse helix-loop-helix transcription factor Arnt.

>MA0004 ARNT 1
CACGTGatgtcctc
>MA0004 ARNT 2
CACGTGggaggtac
>MA0004 ARNT 3
CACGTGccgcgcgc
...
>MA0004 ARNT 18
AACGTGacagccctcc
>MA0004 ARNT 19
AACGTGcacatcgtcc
>MA0004 ARNT 20
aggaatCGCGTGc

The parts of the sequence in capital letters are the motif instances that were found to align to each other.

We can create a Motif object from these instances as follows:

>>> from Bio import motifs
>>> arnt = motifs.read(open("Arnt.sites"), "sites")

The instances from which this motif was created is stored in the .instances property:

>>> print(arnt.instances[:3])
[Seq('CACGTG', IUPACUnambiguousDNA()), Seq('CACGTG', IUPACUnambiguousDNA()), Seq('CACGTG', IUPACUnambiguousDNA())]
>>> for instance in arnt.instances:
...     print(instance)
...
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
CACGTG
AACGTG
AACGTG
AACGTG
AACGTG
CGCGTG

The counts matrix of this motif is automatically calculated from the instances:

>>> print(arnt.counts)
        0      1      2      3      4      5
A:   4.00  19.00   0.00   0.00   0.00   0.00
C:  16.00   0.00  20.00   0.00   0.00   0.00
G:   0.00   1.00   0.00  20.00   0.00  20.00
T:   0.00   0.00   0.00   0.00  20.00   0.00
<BLANKLINE>

This format does not store any meta information.

The JASPAR pfm format

JASPAR also makes motifs available directly as a count matrix, without the instances from which it was created. This pfm format only stores the counts matrix for a single motif. For example, this is the JASPAR file SRF.pfm containing the counts matrix for the human SRF transcription factor:

 2 9 0 1 32 3 46 1 43 15 2 2
 1 33 45 45 1 1 0 0 0 1 0 1
39 2 1 0 0 0 0 0 0 0 44 43
 4 2 0 0 13 42 0 45 3 30 0 0

We can create a motif for this count matrix as follows:

>>> srf = motifs.read(open("SRF.pfm"), "pfm")
>>> print(srf.counts)
        0      1      2      3      4      5      6      7      8      9     10     11
A:   2.00   9.00   0.00   1.00  32.00   3.00  46.00   1.00  43.00  15.00   2.00   2.00
C:   1.00  33.00  45.00  45.00   1.00   1.00   0.00   0.00   0.00   1.00   0.00   1.00
G:  39.00   2.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00  44.00  43.00
T:   4.00   2.00   0.00   0.00  13.00  42.00   0.00  45.00   3.00  30.00   0.00   0.00
<BLANKLINE>

As this motif was created from the counts matrix directly, it has no instances associated with it:

>>> print(srf.instances)
None

We can now ask for the consensus sequence of these two motifs:

>>> print(arnt.counts.consensus)
CACGTG
>>> print(srf.counts.consensus)
GCCCATATATGG

As with the instances file, not meta information is stored in this format.

The JASPAR format jaspar

The jaspar file format allows multiple motifs to be specified in a single file. In this format each of the motif records consist of a header line followed by four lines defining the counts matrix. The header line begins with a > character (similar to the Fasta file format) and is followed by the unique JASPAR matrix ID and the TF name. The following example shows a jaspar formatted file containing the three motifs Arnt, RUNX1 and MEF2A:

>MA0004.1 Arnt
A  [ 4 19  0  0  0  0 ]
C  [16  0 20  0  0  0 ]
G  [ 0  1  0 20  0 20 ]
T  [ 0  0  0  0 20  0 ]
>MA0002.1 RUNX1
A  [10 12  4  1  2  2  0  0  0  8 13 ]
C  [ 2  2  7  1  0  8  0  0  1  2  2 ]
G  [ 3  1  1  0 23  0 26 26  0  0  4 ]
T  [11 11 14 24  1 16  0  0 25 16  7 ]
>MA0052.1 MEF2A
A  [ 1  0 57  2  9  6 37  2 56  6 ]
C  [50  0  1  1  0  0  0  0  0  0 ]
G  [ 0  0  0  0  0  0  0  0  2 50 ]
T  [ 7 58  0 55 49 52 21 56  0  2 ]

The motifs are read as follows:

>>> fh = open("jaspar_motifs.txt")
>>> for m in motifs.parse(fh, "jaspar"))
...     print(m)
TF name  Arnt
Matrix ID MA0004.1
Matrix:
        0      1      2      3      4      5
A:   4.00  19.00   0.00   0.00   0.00   0.00
C:  16.00   0.00  20.00   0.00   0.00   0.00
G:   0.00   1.00   0.00  20.00   0.00  20.00
T:   0.00   0.00   0.00   0.00  20.00   0.00



TF name  RUNX1
Matrix ID MA0002.1
Matrix:
        0      1      2      3      4      5      6      7      8      9     10
A:  10.00  12.00   4.00   1.00   2.00   2.00   0.00   0.00   0.00   8.00  13.00
C:   2.00   2.00   7.00   1.00   0.00   8.00   0.00   0.00   1.00   2.00   2.00
G:   3.00   1.00   1.00   0.00  23.00   0.00  26.00  26.00   0.00   0.00   4.00
T:  11.00  11.00  14.00  24.00   1.00  16.00   0.00   0.00  25.00  16.00   7.00



TF name  MEF2A
Matrix ID MA0052.1
Matrix:
        0      1      2      3      4      5      6      7      8      9
A:   1.00   0.00  57.00   2.00   9.00   6.00  37.00   2.00  56.00   6.00
C:  50.00   0.00   1.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00
G:   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   2.00  50.00
T:   7.00  58.00   0.00  55.00  49.00  52.00  21.00  56.00   0.00   2.00

Note that printing a JASPAR motif yields both the counts data and the available meta-information.

Accessing the JASPAR database

In addition to parsing these flat file formats, we can also retrieve motifs from a JASPAR SQL database. Unlike the flat file formats, a JASPAR database allows storing of all possible meta information defined in the JASPAR Motif class. It is beyond the scope of this document to describe how to set up a JASPAR database (please see the main JASPAR website). Motifs are read from a JASPAR database using the Bio.motifs.jaspar.db module. First connect to the JASPAR database using the JASPAR5 class which models the the latest JASPAR schema:

>>> from Bio.motifs.jaspar.db import JASPAR5
>>> 
>>> JASPAR_DB_HOST = <hostname>
>>> JASPAR_DB_NAME = <db_name>
>>> JASPAR_DB_USER = <user>
>>> JASPAR_DB_PASS = <passord>
>>> 
>>> jdb = JASPAR5(
...     host=JASPAR_DB_HOST,
...     name=JASPAR_DB_NAME,
...     user=JASPAR_DB_USER,
...     password=JASPAR_DB_PASS
... )

Now we can fetch a single motif by its unique JASPAR ID with the fetch_motif_by_id method. Note that a JASPAR ID conists of a base ID and a version number seperated by a decimal point, e.g. ’MA0004.1’. The fetch_motif_by_id method allows you to use either the fully specified ID or just the base ID. If only the base ID is provided, the latest version of the motif is returned.

>>> arnt = jdb.fetch_motif_by_id("MA0004")

Printing the motif reveals that the JASPAR SQL database stores much more meeta-information than the flat files:

>>> print(arnt)
TF name Arnt
Matrix ID MA0004.1
Collection CORE
TF class Zipper-Type
TF family Helix-Loop-Helix
Species 10090
Taxonomic group vertebrates
Accession ['P53762']
Data type used SELEX
Medline 7592839
PAZAR ID TF0000003
Comments -
Matrix:
 0      1      2      3      4      5
A:   4.00  19.00   0.00   0.00   0.00   0.00
C:  16.00   0.00  20.00   0.00   0.00   0.00
G:   0.00   1.00   0.00  20.00   0.00  20.00
T:   0.00   0.00   0.00   0.00  20.00   0.00


We can also fetch motifs by name. The name must be an exact match (partial matches or database wildcards are not currently supported). Note that as the name is not guaranteed to be unique, the fetch_motifs_by_name method actually returns a list.

>>> motifs = jdb.fetch_motifs_by_name("Arnt")
>>> print(motifs[0])
TF name Arnt
Matrix ID MA0004.1
Collection CORE
TF class Zipper-Type
TF family Helix-Loop-Helix
Species 10090
Taxonomic group vertebrates
Accession ['P53762']
Data type used SELEX
Medline 7592839
PAZAR ID TF0000003
Comments -
Matrix:
 0      1      2      3      4      5
A:   4.00  19.00   0.00   0.00   0.00   0.00
C:  16.00   0.00  20.00   0.00   0.00   0.00
G:   0.00   1.00   0.00  20.00   0.00  20.00
T:   0.00   0.00   0.00   0.00  20.00   0.00


The fetch_motifs method allows you to fetch motifs which match a specified set of criteria. These criteria include any of the above described meta information as well as certain matrix properties such as the minimum information content (min_ic in the example below), the minimum length of the matrix or the minimum number of sites used to construct the matrix. Only motifs which pass ALL the specified criteria are returned. Note that selection criteria which correspond to meta information which allow for multiple values may be specified as either a single value or a list of values, e.g. tax_group and tf_family in the example below.

>>> motifs = jdb.fetch_motifs(
...     collection = 'CORE',
...     tax_group = ['vertebrates', 'insects'],
...     tf_class = 'Winged Helix-Turn-Helix',
...     tf_family = ['Forkhead', 'Ets'],
...     min_ic = 12
... )
>>> for motif in motifs:
...     pass # do something with the motif

Compatibility with Perl TFBS modules

An important thing to note is that the JASPAR Motif class was designed to be compatible with the popular Perl TFBS modules. Therefore some specifics about the choice of defaults for background and pseudocounts as well as how information content is computed and sequences searched for instances is based on this compatibility criteria. These choices are noted in the specific subsections below.

  • Choice of background:
    The Perl TFBS modules appear to allow a choice of custom background probabilities (although the documentation states that uniform background is assumed). However the default is to use a uniform background. Therefore it is recommended that you use a uniform background for computing the position-specific scoring matrix (PSSM). This is the default when using the Biopython motifs module.
  • Choice of pseudocounts:
    By default, the Perl TFBS modules use a pseudocount equal to √N * bg[nucleotide], where N represents the total number of sequences used to construct the matrix. To apply this same pseudocount formula, set the motif pseudocounts attribute using the jaspar.calculate\_pseudcounts() funtion:
    >>> motif.pseudocounts = motifs.jaspar.calculate_pseudocounts(motif)
    
    Note that it is possible for the counts matrix to have an unequal number of sequences making up the columns. The pseudocount computation uses the average number of sequences making up the matrix. However, when normalize is called on the counts matrix, each count value in a column is divided by the total number of sequences making up that specific column, not by the average number of sequences. This differs from the Perl TFBS modules because the normalization is not done as a separate step and so the average number of sequences is used throughout the computation of the pssm. Therefore, for matrices with unequal column counts, the pssm computed by the motifs module will differ somewhat from the pssm computed by the Perl TFBS modules.
  • Computation of matrix information content:
    The information content (IC) or specificity of a matrix is computed using the mean method of the PositionSpecificScoringMatrix class. However of note, in the Perl TFBS modules the default behaviour is to compute the IC without first applying pseudocounts, even though by default the PSSMs are computed using pseudocounts as described above.
  • Searching for instances:
    Searching for instances with the Perl TFBS motifs was usually performed using a relative score threshold, i.e. a score in the range 0 to 1. In order to compute the absolute PSSM score corresponding to a relative score one can use the equation:
    >>> abs_score =  (pssm.max - pssm.min) * rel_score + pssm.min
    
    To convert the absolute score of an instance back to a relative score, one can use the equation:
    >>> rel_score = (abs_score - pssm.min) / (pssm.max - pssm.min)
    
    For example, using the Arnt motif before, let’s search a sequence with a relative score threshold of 0.8.
    >>> test_seq=Seq("TAAGCGTGCACGCGCAACACGTGCATTA", unambiguous_dna)
    >>> arnt.pseudocounts = motifs.jaspar.calculate_pseudocounts(arnt) 
    >>> pssm = arnt.pssm()
    >>> max_score = pssm.max()
    >>> min_score = pssm.min()
    >>> abs_score_threshold = (max_score - min_score) * 0.8 + min_score
    >>> for position, score in pssm.search(test_seq,
                                           threshold=abs_score_threshold):
    ...     rel_score = (score - min_score) / (max_score - min_score)
    ...     print("Position %d: score = %5.3f, rel. score = %5.3f" % (
                position, score, rel_score))
    ... 
    Position 2: score = 5.362, rel. score = 0.801
    Position 8: score = 6.112, rel. score = 0.831
    Position -20: score = 7.103, rel. score = 0.870
    Position 17: score = 10.351, rel. score = 1.000
    Position -11: score = 10.351, rel. score = 1.000
    

14.2.2  MEME

MEME [12] is a tool for discovering motifs in a group of related DNA or protein sequences. It takes as input a group of DNA or protein sequences and outputs as many motifs as requested. Therefore, in contrast to JASPAR files, MEME output files typically contain multiple motifs. This is an example.

At the top of an output file generated by MEME shows some background information about the MEME and the version of MEME used:

********************************************************************************
MEME - Motif discovery tool
********************************************************************************
MEME version 3.0 (Release date: 2004/08/18 09:07:01)
...

Further down, the input set of training sequences is recapitulated:

********************************************************************************
TRAINING SET
********************************************************************************
DATAFILE= INO_up800.s
ALPHABET= ACGT
Sequence name            Weight Length  Sequence name            Weight Length
-------------            ------ ------  -------------            ------ ------
CHO1                     1.0000    800  CHO2                     1.0000    800
FAS1                     1.0000    800  FAS2                     1.0000    800
ACC1                     1.0000    800  INO1                     1.0000    800
OPI3                     1.0000    800
********************************************************************************

and the exact command line that was used:

********************************************************************************
COMMAND LINE SUMMARY
********************************************************************************
This information can also be useful in the event you wish to report a
problem with the MEME software.

command: meme -mod oops -dna -revcomp -nmotifs 2 -bfile yeast.nc.6.freq INO_up800.s
...

Next is detailed information on each motif that was found:

********************************************************************************
MOTIF  1        width =   12   sites =   7   llr = 95   E-value = 2.0e-001
********************************************************************************
--------------------------------------------------------------------------------
        Motif 1 Description
--------------------------------------------------------------------------------
Simplified        A  :::9:a::::3:
pos.-specific     C  ::a:9:11691a
probability       G  ::::1::94:4:
matrix            T  aa:1::9::11:

To parse this file (stored as meme.dna.oops.txt), use

>>> handle = open("meme.dna.oops.txt")
>>> record = motifs.parse(handle, "meme")
>>> handle.close()

The motifs.parse command reads the complete file directly, so you can close the file after calling motifs.parse. The header information is stored in attributes:

>>> record.version
'3.0'
>>> record.datafile
'INO_up800.s'
>>> record.command
'meme -mod oops -dna -revcomp -nmotifs 2 -bfile yeast.nc.6.freq INO_up800.s'
>>> record.alphabet
IUPACUnambiguousDNA()
>>> record.sequences
['CHO1', 'CHO2', 'FAS1', 'FAS2', 'ACC1', 'INO1', 'OPI3']

The record is an object of the Bio.motifs.meme.Record class. The class inherits from list, and you can think of record as a list of Motif objects:

>>> len(record)
2
>>> motif = record[0]
>>> print(motif.consensus)
TTCACATGCCGC
>>> print(motif.degenerate_consensus)
TTCACATGSCNC

In addition to these generic motif attributes, each motif also stores its specific information as calculated by MEME. For example,

>>> motif.num_occurrences
7
>>> motif.length
12
>>> evalue = motif.evalue
>>> print("%3.1g" % evalue)
0.2
>>> motif.name
'Motif 1'

In addition to using an index into the record, as we did above, you can also find it by its name:

>>> motif = record['Motif 1']

Each motif has an attribute .instances with the sequence instances in which the motif was found, providing some information on each instance:

>>> len(motif.instances)
7
>>> motif.instances[0]
Instance('TTCACATGCCGC', IUPACUnambiguousDNA())
>>> motif.instances[0].motif_name
'Motif 1'
>>> motif.instances[0].sequence_name
'INO1'
>>> motif.instances[0].start
620
>>> motif.instances[0].strand
'-'
>>> motif.instances[0].length
12
>>> pvalue = motif.instances[0].pvalue
>>> print("%5.3g" % pvalue)
1.85e-08

MAST

14.2.3  TRANSFAC

TRANSFAC is a manually curated database of transcription factors, together with their genomic binding sites and DNA binding profiles [27]. While the file format used in the TRANSFAC database is nowadays also used by others, we will refer to it as the TRANSFAC file format.

A minimal file in the TRANSFAC format looks as follows:

ID  motif1
P0      A      C      G      T
01      1      2      2      0      S
02      2      1      2      0      R
03      3      0      1      1      A
04      0      5      0      0      C
05      5      0      0      0      A
06      0      0      4      1      G
07      0      1      4      0      G
08      0      0      0      5      T
09      0      0      5      0      G
10      0      1      2      2      K
11      0      2      0      3      Y
12      1      0      3      1      G
//

This file shows the frequency matrix of motif motif1 of 12 nucleotides. In general, one file in the TRANSFAC format can contain multiple motifs. For example, this is the contents of the example TRANSFAC file transfac.dat:

VV  EXAMPLE January 15, 2013
XX
//
ID  motif1
P0      A      C      G      T
01      1      2      2      0      S
02      2      1      2      0      R
03      3      0      1      1      A
...
11      0      2      0      3      Y
12      1      0      3      1      G
//
ID  motif2
P0      A      C      G      T
01      2      1      2      0      R
02      1      2      2      0      S
...
09      0      0      0      5      T
10      0      2      0      3      Y
//

To parse a TRANSFAC file, use

>>> handle = open("transfac.dat")
>>> record = motifs.parse(handle, "TRANSFAC")
>>> handle.close()

The overall version number, if available, is stored as record.version:

>>> record.version
'EXAMPLE January 15, 2013'

Each motif in record is in instance of the Bio.motifs.transfac.Motif class, which inherits both from the Bio.motifs.Motif class and from a Python dictionary. The dictionary uses the two-letter keys to store any additional information about the motif:

>>> motif = record[0]
>>> motif.degenerate_consensus # Using the Bio.motifs.Motif method
Seq('SRACAGGTGKYG', IUPACAmbiguousDNA())
>>> motif['ID'] # Using motif as a dictionary
'motif1'

TRANSFAC files are typically much more elaborate than this example, containing lots of additional information about the motif. Table 14.2.3 lists the two-letter field codes that are commonly found in TRANSFAC files:


Table 14.1: Fields commonly found in TRANSFAC files
ACAccession number
ASAccession numbers, secondary
BAStatistical basis
BFBinding factors
BSFactor binding sites underlying the matrix
CCComments
COCopyright notice
DEShort factor description
DRExternal databases
DTDate created/updated
HCSubfamilies
HPSuperfamilies
IDIdentifier
NAName of the binding factor
OCTaxonomic classification
OSSpecies/Taxon
OVOlder version
PVPreferred version
TYType
XXEmpty line; these are not stored in the Record.

Each motif also has an attribute .references containing the references associated with the motif, using these two-letter keys:


Table 14.2: Fields used to store references in TRANSFAC files
RNReference number
RAReference authors
RLReference data
RTReference title
RXPubMed ID

Printing the motifs writes them out in their native TRANSFAC format:

>>> print(record)
VV  EXAMPLE January 15, 2013
XX
//
ID  motif1
XX
P0      A      C      G      T
01      1      2      2      0      S
02      2      1      2      0      R
03      3      0      1      1      A
04      0      5      0      0      C
05      5      0      0      0      A
06      0      0      4      1      G
07      0      1      4      0      G
08      0      0      0      5      T
09      0      0      5      0      G
10      0      1      2      2      K
11      0      2      0      3      Y
12      1      0      3      1      G
XX
//
ID  motif2
XX
P0      A      C      G      T
01      2      1      2      0      R
02      1      2      2      0      S
03      0      5      0      0      C
04      3      0      1      1      A
05      0      0      4      1      G
06      5      0      0      0      A
07      0      1      4      0      G
08      0      0      5      0      G
09      0      0      0      5      T
10      0      2      0      3      Y
XX
//
<BLANKLINE>

You can export the motifs in the TRANSFAC format by capturing this output in a string and saving it in a file:

>>> text = str(record)
>>> handle = open("mytransfacfile.dat", 'w')
>>> handle.write(text)
>>> handle.close()

14.3  Writing motifs

Speaking of exporting, let’s look at export functions in general. We can use the format method to write the motif in the simple JASPAR pfm format:

>>> print(arnt.format("pfm"))
  4.00  19.00   0.00   0.00   0.00   0.00
 16.00   0.00  20.00   0.00   0.00   0.00
  0.00   1.00   0.00  20.00   0.00  20.00
  0.00   0.00   0.00   0.00  20.00   0.00

Similarly, we can use format to write the motif in the JASPAR jaspar format:

>>> print(arnt.format("jaspar"))
>MA0004.1  Arnt
A [  4.00  19.00   0.00   0.00   0.00   0.00]
C [ 16.00   0.00  20.00   0.00   0.00   0.00]
G [  0.00   1.00   0.00  20.00   0.00  20.00]
T [  0.00   0.00   0.00   0.00  20.00   0.00]

To write the motif in a TRANSFAC-like matrix format, use

>>> print(m.format("transfac"))
P0      A      C      G      T
01      3      0      0      4      W
02      7      0      0      0      A
03      0      5      0      2      C
04      2      2      3      0      V
05      1      6      0      0      C
XX
//
<BLANKLINE>

To write out multiple motifs, you can use motifs.write. This function can be used regardless of whether the motifs originated from a TRANSFAC file. For example,

>>> two_motifs = [arnt, srf]
>>> print(motifs.write(two_motifs, 'transfac'))
P0      A      C      G      T
01      4     16      0      0      C
02     19      0      1      0      A
03      0     20      0      0      C
04      0      0     20      0      G
05      0      0      0     20      T
06      0      0     20      0      G
XX
//
P0      A      C      G      T
01      2      1     39      4      G
02      9     33      2      2      C
03      0     45      1      0      C
04      1     45      0      0      C
05     32      1      0     13      A
06      3      1      0     42      T
07     46      0      0      0      A
08      1      0      0     45      T
09     43      0      0      3      A
10     15      1      0     30      T
11      2      0     44      0      G
12      2      1     43      0      G
XX
//
<BLANKLINE>

Or, to write multiple motifs in the jaspar format:

>>> two_motifs = [arnt, mef2a]
>>> print(motifs.write(two_motifs, "jaspar"))
>MA0004.1  Arnt
A [  4.00  19.00   0.00   0.00   0.00   0.00]
C [ 16.00   0.00  20.00   0.00   0.00   0.00]
G [  0.00   1.00   0.00  20.00   0.00  20.00]
T [  0.00   0.00   0.00   0.00  20.00   0.00]
>MA0052.1  MEF2A
A [  1.00   0.00  57.00   2.00   9.00   6.00  37.00   2.00  56.00   6.00]
C [ 50.00   0.00   1.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00]
G [  0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   2.00  50.00]
T [  7.00  58.00   0.00  55.00  49.00  52.00  21.00  56.00   0.00   2.00]

14.4  Position-Weight Matrices

The .counts attribute of a Motif object shows how often each nucleotide appeared at each position along the alignment. We can normalize this matrix by dividing by the number of instances in the alignment, resulting in the probability of each nucleotide at each position along the alignment. We refer to these probabilities as the position-weight matrix. However, beware that in the literature this term may also be used to refer to the position-specific scoring matrix, which we discuss below.

Usually, pseudocounts are added to each position before normalizing. This avoids overfitting of the position-weight matrix to the limited number of motif instances in the alignment, and can also prevent probabilities from becoming zero. To add a fixed pseudocount to all nucleotides at all positions, specify a number for the pseudocounts argument:

>>> pwm = m.counts.normalize(pseudocounts=0.5)
>>> print(pwm)
        0      1      2      3      4
A:   0.39   0.83   0.06   0.28   0.17
C:   0.06   0.06   0.61   0.28   0.72
G:   0.06   0.06   0.06   0.39   0.06
T:   0.50   0.06   0.28   0.06   0.06
<BLANKLINE>

Alternatively, pseudocounts can be a dictionary specifying the pseudocounts for each nucleotide. For example, as the GC content of the human genome is about 40%, you may want to choose the pseudocounts accordingly:

>>> pwm = m.counts.normalize(pseudocounts={'A':0.6, 'C': 0.4, 'G': 0.4, 'T': 0.6})
>>> print(pwm)
        0      1      2      3      4
A:   0.40   0.84   0.07   0.29   0.18
C:   0.04   0.04   0.60   0.27   0.71
G:   0.04   0.04   0.04   0.38   0.04
T:   0.51   0.07   0.29   0.07   0.07
<BLANKLINE>

The position-weight matrix has its own methods to calculate the consensus, anticonsensus, and degenerate consensus sequences:

>>> pwm.consensus
Seq('TACGC', IUPACUnambiguousDNA())
>>> pwm.anticonsensus
Seq('GGGTG', IUPACUnambiguousDNA())
>>> pwm.degenerate_consensus
Seq('WACNC', IUPACAmbiguousDNA())

Note that due to the pseudocounts, the degenerate consensus sequence calculated from the position-weight matrix is slightly different from the degenerate consensus sequence calculated from the instances in the motif:

>>> m.degenerate_consensus
Seq('WACVC', IUPACAmbiguousDNA())

The reverse complement of the position-weight matrix can be calculated directly from the pwm:

>>> rpwm = pwm.reverse_complement()
>>> print(rpwm)
        0      1      2      3      4
A:   0.07   0.07   0.29   0.07   0.51
C:   0.04   0.38   0.04   0.04   0.04
G:   0.71   0.27   0.60   0.04   0.04
T:   0.18   0.29   0.07   0.84   0.40
<BLANKLINE>

14.5  Position-Specific Scoring Matrices

Using the background distribution and PWM with pseudo-counts added, it’s easy to compute the log-odds ratios, telling us what are the log odds of a particular symbol to be coming from a motif against the background. We can use the .log_odds() method on the position-weight matrix:

>>> pssm = pwm.log_odds()
>>> print(pssm)
        0      1      2      3      4
A:   0.68   1.76  -1.91   0.21  -0.49
C:  -2.49  -2.49   1.26   0.09   1.51
G:  -2.49  -2.49  -2.49   0.60  -2.49
T:   1.03  -1.91   0.21  -1.91  -1.91
<BLANKLINE>

Here we can see positive values for symbols more frequent in the motif than in the background and negative for symbols more frequent in the background. 0.0 means that it’s equally likely to see a symbol in the background and in the motif.

This assumes that A, C, G, and T are equally likely in the background. To calculate the position-specific scoring matrix against a background with unequal probabilities for A, C, G, T, use the background argument. For example, against a background with a 40% GC content, use

>>> background = {'A':0.3,'C':0.2,'G':0.2,'T':0.3}
>>> pssm = pwm.log_odds(background)
>>> print(pssm)
        0      1      2      3      4
A:   0.42   1.49  -2.17  -0.05  -0.75
C:  -2.17  -2.17   1.58   0.42   1.83
G:  -2.17  -2.17  -2.17   0.92  -2.17
T:   0.77  -2.17  -0.05  -2.17  -2.17
<BLANKLINE>

The maximum and minimum score obtainable from the PSSM are stored in the .max and .min properties:

>>> print("%4.2f" % pssm.max)
6.59
>>> print("%4.2f" % pssm.min)
-10.85

The mean and standard deviation of the PSSM scores with respect to a specific background are calculated by the .mean and .std methods.

>>> mean = pssm.mean(background)
>>> std = pssm.std(background)
>>> print("mean = %0.2f, standard deviation = %0.2f" % (mean, std))
mean = 3.21, standard deviation = 2.59

A uniform background is used if background is not specified. The mean is particularly important, as its value is equal to the Kullback-Leibler divergence or relative entropy, and is a measure for the information content of the motif compared to the background. As in Biopython the base-2 logarithm is used in the calculation of the log-odds scores, the information content has units of bits.

The .reverse_complement, .consensus, .anticonsensus, and .degenerate_consensus methods can be applied directly to PSSM objects.

14.6  Searching for instances

The most frequent use for a motif is to find its instances in some sequence. For the sake of this section, we will use an artificial sequence like this:

>>> test_seq=Seq("TACACTGCATTACAACCCAAGCATTA", m.alphabet)
>>> len(test_seq)
26

14.6.1  Searching for exact matches

The simplest way to find instances, is to look for exact matches of the true instances of the motif:

>>> for pos, seq in m.instances.search(test_seq):
...     print("%i %s" % (pos, seq))
... 
0 TACAC
10 TACAA
13 AACCC

We can do the same with the reverse complement (to find instances on the complementary strand):

>>> for pos, seq in r.instances.search(test_seq):
...     print("%i %s" % (pos, seq))
... 
6 GCATT
20 GCATT

14.6.2  Searching for matches using the PSSM score

It’s just as easy to look for positions, giving rise to high log-odds scores against our motif:

>>> for position, score in pssm.search(test_seq, threshold=3.0):
...     print("Position %d: score = %5.3f" % (position, score))
... 
Position 0: score = 5.622
Position -20: score = 4.601
Position 10: score = 3.037
Position 13: score = 5.738
Position -6: score = 4.601

The negative positions refer to instances of the motif found on the reverse strand of the test sequence, and follow the Python convention on negative indices. Therefore, the instance of the motif at pos is located at test_seq[pos:pos+len(m)] both for positive and for negative values of pos.

You may notice the threshold parameter, here set arbitrarily to 3.0. This is in log2, so we are now looking only for words, which are eight times more likely to occur under the motif model than in the background. The default threshold is 0.0, which selects everything that looks more like the motif than the background.

You can also calculate the scores at all positions along the sequence:

>>> pssm.calculate(test_seq)
array([  5.62230396,  -5.6796999 ,  -3.43177247,   0.93827754,
        -6.84962511,  -2.04066086, -10.84962463,  -3.65614533,
        -0.03370807,  -3.91102552,   3.03734159,  -2.14918518,
        -0.6016975 ,   5.7381525 ,  -0.50977498,  -3.56422281,
        -8.73414803,  -0.09919716,  -0.6016975 ,  -2.39429784,
       -10.84962463,  -3.65614533], dtype=float32)

In general, this is the fastest way to calculate PSSM scores. The scores returned by pssm.calculate are for the forward strand only. To obtain the scores on the reverse strand, you can take the reverse complement of the PSSM:

>>> rpssm = pssm.reverse_complement()
>>> rpssm.calculate(test_seq)
array([ -9.43458748,  -3.06172252,  -7.18665981,  -7.76216221,
        -2.04066086,  -4.26466274,   4.60124254,  -4.2480607 ,
        -8.73414803,  -2.26503372,  -6.49598789,  -5.64668512,
        -8.73414803, -10.84962463,  -4.82356262,  -4.82356262,
        -5.64668512,  -8.73414803,  -4.15613794,  -5.6796999 ,
         4.60124254,  -4.2480607 ], dtype=float32)

14.6.3  Selecting a score threshold

If you want to use a less arbitrary way of selecting thresholds, you can explore the distribution of PSSM scores. Since the space for a score distribution grows exponentially with motif length, we are using an approximation with a given precision to keep computation cost manageable:

>>> distribution = pssm.distribution(background=background, precision=10**4)

The distribution object can be used to determine a number of different thresholds. We can specify the requested false-positive rate (probability of “finding” a motif instance in background generated sequence):

>>> threshold = distribution.threshold_fpr(0.01)
>>> print("%5.3f" % threshold)
4.009

or the false-negative rate (probability of “not finding” an instance generated from the motif):

>>> threshold = distribution.threshold_fnr(0.1)
>>> print("%5.3f" % threshold)
-0.510

or a threshold (approximately) satisfying some relation between the false-positive rate and the false-negative rate (fnr/fpr≃ t):

>>> threshold = distribution.threshold_balanced(1000)
>>> print("%5.3f" % threshold)
6.241

or a threshold satisfying (roughly) the equality between the false-positive rate and the −log of the information content (as used in patser software by Hertz and Stormo):

>>> threshold = distribution.threshold_patser()
>>> print("%5.3f" % threshold)
0.346

For example, in case of our motif, you can get the threshold giving you exactly the same results (for this sequence) as searching for instances with balanced threshold with rate of 1000.

>>> threshold = distribution.threshold_fpr(0.01)
>>> print("%5.3f" % threshold)
4.009
>>> for position, score in pssm.search(test_seq, threshold=threshold):
...     print("Position %d: score = %5.3f" % (position, score))
... 
Position 0: score = 5.622
Position -20: score = 4.601
Position 13: score = 5.738
Position -6: score = 4.601

14.7  Each motif object has an associated Position-Specific Scoring Matrix

To facilitate searching for potential TFBSs using PSSMs, both the position-weight matrix and the position-specific scoring matrix are associated with each motif. Using the Arnt motif as an example:

>>> from Bio import motifs
>>> handle = open("Arnt.sites")
>>> motif = motifs.read(handle, 'sites')
>>> print(motif.counts)
        0      1      2      3      4      5
A:   4.00  19.00   0.00   0.00   0.00   0.00
C:  16.00   0.00  20.00   0.00   0.00   0.00
G:   0.00   1.00   0.00  20.00   0.00  20.00
T:   0.00   0.00   0.00   0.00  20.00   0.00
<BLANKLINE>
>>> print(motif.pwm)
        0      1      2      3      4      5
A:   0.20   0.95   0.00   0.00   0.00   0.00
C:   0.80   0.00   1.00   0.00   0.00   0.00
G:   0.00   0.05   0.00   1.00   0.00   1.00
T:   0.00   0.00   0.00   0.00   1.00   0.00
<BLANKLINE>
>>> print(motif.pssm)
        0      1      2      3      4      5
A:  -0.32   1.93   -inf   -inf   -inf   -inf
C:   1.68   -inf   2.00   -inf   -inf   -inf
G:   -inf  -2.32   -inf   2.00   -inf   2.00
T:   -inf   -inf   -inf   -inf   2.00   -inf
<BLANKLINE>

The negative infinities appear here because the corresponding entry in the frequency matrix is 0, and we are using zero pseudocounts by default:

>>> for letter in "ACGT":
...     print("%s: %4.2f" % (letter, motif.pseudocounts[letter]))
... 
A: 0.00
C: 0.00
G: 0.00
T: 0.00

If you change the .pseudocounts attribute, the position-frequency matrix and the position-specific scoring matrix are recalculated automatically:

>>> motif.pseudocounts = 3.0
>>> for letter in "ACGT":
...     print("%s: %4.2f" % (letter, motif.pseudocounts[letter]))
... 
A: 3.00
C: 3.00
G: 3.00
T: 3.00
>>> print(motif.pwm)
        0      1      2      3      4      5
A:   0.22   0.69   0.09   0.09   0.09   0.09
C:   0.59   0.09   0.72   0.09   0.09   0.09
G:   0.09   0.12   0.09   0.72   0.09   0.72
T:   0.09   0.09   0.09   0.09   0.72   0.09
<BLANKLINE>
>>> print(motif.pssm)
        0      1      2      3      4      5
A:  -0.19   1.46  -1.42  -1.42  -1.42  -1.42
C:   1.25  -1.42   1.52  -1.42  -1.42  -1.42
G:  -1.42  -1.00  -1.42   1.52  -1.42   1.52
T:  -1.42  -1.42  -1.42  -1.42   1.52  -1.42
<BLANKLINE>

You can also set the .pseudocounts to a dictionary over the four nucleotides if you want to use different pseudocounts for them. Setting motif.pseudocounts to None resets it to its default value of zero.

The position-specific scoring matrix depends on the background distribution, which is uniform by default:

>>> for letter in "ACGT":
...     print("%s: %4.2f" % (letter, motif.background[letter]))
... 
A: 0.25
C: 0.25
G: 0.25
T: 0.25

Again, if you modify the background distribution, the position-specific scoring matrix is recalculated:

>>> motif.background = {'A': 0.2, 'C': 0.3, 'G': 0.3, 'T': 0.2}
>>> print(motif.pssm)
        0      1      2      3      4      5
A:   0.13   1.78  -1.09  -1.09  -1.09  -1.09
C:   0.98  -1.68   1.26  -1.68  -1.68  -1.68
G:  -1.68  -1.26  -1.68   1.26  -1.68   1.26
T:  -1.09  -1.09  -1.09  -1.09   1.85  -1.09
<BLANKLINE>

Setting motif.background to None resets it to a uniform distribution:

>>> motif.background = None
>>> for letter in "ACGT":
...     print("%s: %4.2f" % (letter, motif.background[letter]))
... 
A: 0.25
C: 0.25
G: 0.25
T: 0.25

If you set motif.background equal to a single value, it will be interpreted as the GC content:

>>> motif.background = 0.8
>>> for letter in "ACGT":
...     print("%s: %4.2f" % (letter, motif.background[letter]))
... 
A: 0.10
C: 0.40
G: 0.40
T: 0.10

Note that you can now calculate the mean of the PSSM scores over the background against which it was computed:

>>> print("%f" % motif.pssm.mean(motif.background))
4.703928

as well as its standard deviation:

>>> print("%f" % motif.pssm.std(motif.background))
3.290900

and its distribution:

>>> distribution = motif.pssm.distribution(background=motif.background)
>>> threshold = distribution.threshold_fpr(0.01)
>>> print("%f" % threshold)
3.854375

Note that the position-weight matrix and the position-specific scoring matrix are recalculated each time you call motif.pwm or motif.pssm, respectively. If speed is an issue and you want to use the PWM or PSSM repeatedly, you can save them as a variable, as in

>>> pssm = motif.pssm

14.8  Comparing motifs

Once we have more than one motif, we might want to compare them.

Before we start comparing motifs, I should point out that motif boundaries are usually quite arbitrary. This means we often need to compare motifs of different lengths, so comparison needs to involve some kind of alignment. This means we have to take into account two things:

  • alignment of motifs
  • some function to compare aligned motifs

To align the motifs, we use ungapped alignment of PSSMs and substitute zeros for any missing columns at the beginning and end of the matrices. This means that effectively we are using the background distribution for columns missing from the PSSM. The distance function then returns the minimal distance between motifs, as well as the corresponding offset in their alignment.

To give an exmaple, let us first load another motif, which is similar to our test motif m:

>>> m_reb1 = motifs.read(open("REB1.pfm"), "pfm")
>>> m_reb1.consensus
Seq('GTTACCCGG', IUPACUnambiguousDNA())
>>> print(m_reb1.counts)
        0      1      2      3      4      5      6      7      8
A:  30.00   0.00   0.00 100.00   0.00   0.00   0.00   0.00  15.00
C:  10.00   0.00   0.00   0.00 100.00 100.00 100.00   0.00  15.00
G:  50.00   0.00   0.00   0.00   0.00   0.00   0.00  60.00  55.00
T:  10.00 100.00 100.00   0.00   0.00   0.00   0.00  40.00  15.00
<BLANKLINE>

To make the motifs comparable, we choose the same values for the pseudocounts and the background distribution as our motif m:

>>> m_reb1.pseudocounts = {'A':0.6, 'C': 0.4, 'G': 0.4, 'T': 0.6}
>>> m_reb1.background = {'A':0.3,'C':0.2,'G':0.2,'T':0.3}
>>> pssm_reb1 = m_reb1.pssm
>>> print(pssm_reb1)
        0      1      2      3      4      5      6      7      8
A:   0.00  -5.67  -5.67   1.72  -5.67  -5.67  -5.67  -5.67  -0.97
C:  -0.97  -5.67  -5.67  -5.67   2.30   2.30   2.30  -5.67  -0.41
G:   1.30  -5.67  -5.67  -5.67  -5.67  -5.67  -5.67   1.57   1.44
T:  -1.53   1.72   1.72  -5.67  -5.67  -5.67  -5.67   0.41  -0.97
<BLANKLINE>

We’ll compare these motifs using the Pearson correlation. Since we want it to resemble a distance measure, we actually take 1−r, where r is the Pearson correlation coefficient (PCC):

>>> distance, offset = pssm.dist_pearson(pssm_reb1)
>>> print("distance = %5.3g" % distance)
distance = 0.239
>>> print(offset)
-2

This means that the best PCC between motif m and m_reb1 is obtained with the following alignment:

m:      bbTACGCbb
m_reb1: GTTACCCGG

where b stands for background distribution. The PCC itself is roughly 1−0.239=0.761.

14.9  De novo motif finding

Currently, Biopython has only limited support for de novo motif finding. Namely, we support running and parsing of AlignAce and MEME. Since the number of motif finding tools is growing rapidly, contributions of new parsers are welcome.

14.9.1  MEME

Let’s assume, you have run MEME on sequences of your choice with your favorite parameters and saved the output in the file meme.out. You can retrieve the motifs reported by MEME by running the following piece of code:

>>> from Bio import motifs
>>> motifsM = motifs.parse(open("meme.out"), "meme")
>>> motifsM
[<Bio.motifs.meme.Motif object at 0xc356b0>]

Besides the most wanted list of motifs, the result object contains more useful information, accessible through properties with self-explanatory names:

  • .alphabet
  • .datafile
  • .sequence_names
  • .version
  • .command

The motifs returned by the MEME Parser can be treated exactly like regular Motif objects (with instances), they also provide some extra functionality, by adding additional information about the instances.

>>> motifsM[0].consensus
Seq('CTCAATCGTA', IUPACUnambiguousDNA())
>>> motifsM[0].instances[0].sequence_name
'SEQ10;'
>>> motifsM[0].instances[0].start
3
>>> motifsM[0].instances[0].strand
'+'
>>> motifsM[0].instances[0].pvalue
8.71e-07

14.9.2  AlignAce

We can do very similar things with the AlignACE program. Assume, you have your output in the file alignace.out. You can parse your output with the following code:

>>> from Bio import motifs
>>> motifsA = motifs.parse(open("alignace.out"), "alignace")

Again, your motifs behave as they should:

>>> motifsA[0].consensus
Seq('TCTACGATTGAG', IUPACUnambiguousDNA())

In fact you can even see, that AlignAce found a very similar motif as MEME. It is just a longer version of a reverse complement of the MEME motif:

>>> motifsM[0].reverse_complement().consensus
Seq('TACGATTGAG', IUPACUnambiguousDNA())

If you have AlignAce installed on the same machine, you can also run it directly from Biopython. A short example of how this can be done is shown below (other parameters can be specified as keyword parameters):

>>> command="/opt/bin/AlignACE"
>>> input_file="test.fa"
>>> from Bio.motifs.applications import AlignAceCommandline
>>> cmd = AlignAceCommandline(cmd=command, input=input_file, gcback=0.6, numcols=10)
>>> stdout, stderr= cmd()

Since AlignAce prints all of its output to standard output, you can get to your motifs by parsing the first part of the result:

>>> motifs = motifs.parse(stdout, "alignace")

14.10  Useful links

14.11  Obsolete Bio.Motif module

The rest of this chapter above describes the Bio.motifs package included in Biopython 1.61 onwards, which is replacing the older Bio.Motif package introduced with Biopython 1.50, which was in turn based on two older former Biopython modules, Bio.AlignAce and Bio.MEME.

To allow for a smooth transition, the older Bio.Motif package will be maintained in parallel with its replacement Bio.motifs at least two more releases, and at least one year.

14.11.1  Motif objects

Since we are interested in motif analysis, we need to take a look at Motif objects in the first place. For that we need to import the Motif library:

>>> from Bio import Motif

and we can start creating our first motif objects. Let’s create a DNA motif:

>>> from Bio.Alphabet import IUPAC
>>> m = Motif.Motif(alphabet=IUPAC.unambiguous_dna)

This is for now just an empty container, so let’s add some sequences to our newly created motif:

>>> from Bio.Seq import Seq
>>> m.add_instance(Seq("TATAA", m.alphabet))
>>> m.add_instance(Seq("TATTA", m.alphabet))
>>> m.add_instance(Seq("TATAA", m.alphabet))
>>> m.add_instance(Seq("TATAA", m.alphabet))

Now we have a full Motif instance, so we can try to get some basic information about it. Let’s start with length and consensus sequence:

>>> len(m)
5
>>> m.consensus()
Seq('TATAA', IUPACUnambiguousDNA())

In case of DNA motifs, we can also get a reverse complement of a motif:

>>> m.reverse_complement().consensus()
Seq('TTATA', IUPACUnambiguousDNA())
>>> for i in m.reverse_complement().instances:
...     print(i)
TTATA
TAATA
TTATA
TTATA

We can also calculate the information content of a motif with a simple call:

>>> print("%0.2f" % m.ic())
5.27

This gives us a number of bits of information provided by the motif, which tells us how much differs from background.

The most common representation of a motif is a PWM (Position Weight Matrix). It summarizes the probabilities of finding any symbol (in this case nucleotide) in any position of a motif. It can be computed by calling the .pwm() method:

>>> m.pwm()
[{'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, 
 {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}, 
 {'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, 
 {'A': 0.65, 'C': 0.05, 'T': 0.25, 'G': 0.05}, 
 {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}]

The probabilities in the motif’s PWM are based on the counts in the instances, but we can see, that even though there were no Gs and no Cs in the instances, we still have non-zero probabilities assigned to them. These come from pseudo-counts which are, roughly speaking, a commonly used way to acknowledge the incompleteness of our knowledge and avoid technical problems with calculating logarithms of 0.

We can control the way that pseudo-counts are added with two properties of Motif objects .background is the probability distribution over all symbols in the alphabet that we assume represents background, non-motif sequences (usually based on the GC content of the respective genome). It is by default set to a uniform distribution upon creation of a motif:

>>> m.background  
{'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25}

The other parameter is .beta, which states the amount of pseudo-counts we should add to the PWM. By default it is set to 1.0,

>>> m.beta
1.0

so that the total input of pseudo-counts is equal to that of one instance.

Using the background distribution and pwm with pseudo-counts added, it’s easy to compute the log-odds ratios, telling us what are the log odds of a particular symbol to be coming from a motif against the background. We can use the .log_odds() method:

 >>> m.log_odds() 
[{'A': -2.3219280948873622, 
  'C': -2.3219280948873622, 
  'T': 1.7655347463629771, 
  'G': -2.3219280948873622}, 
 {'A': 1.7655347463629771, 
  'C': -2.3219280948873622, 
  'T': -2.3219280948873622, 
  'G': -2.3219280948873622}, 
 {'A': -2.3219280948873622, 
  'C': -2.3219280948873622, 
  'T': 1.7655347463629771, 
  'G': -2.3219280948873622}, 
 {'A': 1.3785116232537298, 
  'C': -2.3219280948873622, 
  'T': 0.0, 
  'G': -2.3219280948873622}, 
 {'A': 1.7655347463629771, 
  'C': -2.3219280948873622, 
  'T': -2.3219280948873622, 
  'G': -2.3219280948873622}
]

Here we can see positive values for symbols more frequent in the motif than in the background and negative for symbols more frequent in the background. 0.0 means that it’s equally likely to see a symbol in background and in the motif (e.g. ‘T’ in the second-last position).

14.11.1.1  Reading and writing

Creating motifs from instances by hand is a bit boring, so it’s useful to have some I/O functions for reading and writing motifs. There are no really well established standards for storing motifs, but there’s a couple of formats which are more used than others. The most important distinction is whether the motif representation is based on instances or on some version of PWM matrix. On of the most popular motif databases JASPAR stores motifs in both formats, so let’s look at how we can import JASPAR motifs from instances:

>>> from Bio import Motif
>>> arnt = Motif.read(open("Arnt.sites"), "jaspar-sites")

and from a count matrix:

>>> srf = Motif.read(open("SRF.pfm"), "jaspar-pfm")

The arnt and srf motifs can both do the same things for us, but they use different internal representations of the motif. We can tell that by inspecting the has_counts and has_instances properties:

>>> arnt.has_instances
True
>>> srf.has_instances
False
>>> srf.has_counts
True
>>> srf.counts
{'A': [2, 9, 0, 1, 32, 3, 46, 1, 43, 15, 2, 2],
 'C': [1, 33, 45, 45, 1, 1, 0, 0, 0, 1, 0, 1],
 'G': [39, 2, 1, 0, 0, 0, 0, 0, 0, 0, 44, 43],
 'T': [4, 2, 0, 0, 13, 42, 0, 45, 3, 30, 0, 0]}

There are conversion functions, which can help us convert between different representations:

>>> arnt.make_counts_from_instances()
{'A': [8, 38, 0, 0, 0, 0],
 'C': [32, 0, 40, 0, 0, 0],
 'G': [0, 2, 0, 40, 0, 40],
 'T': [0, 0, 0, 0, 40, 0]}

>>> srf.make_instances_from_counts()
[Seq('GGGAAAAAAAGG', IUPACUnambiguousDNA()),
 Seq('GGCCAAATAAGG', IUPACUnambiguousDNA()),
 Seq('GACCAAATAAGG', IUPACUnambiguousDNA()),
....

The important thing to remember here is that the method make_instances_from_counts() creates fake instances, because usually there are very many possible sets of instances which give rise to the same pwm, and if we have only the count matrix, we cannot reconstruct the original one. This does not make any difference if we are using the PWM as the representation of the motif, but one should be careful with exporting instances from count-based motifs.

Speaking of exporting, let’s look at export functions. We can export to fasta:

>>> print(m.format("fasta"))
>instance0
TATAA
>instance1
TATTA
>instance2
TATAA
>instance3
TATAA

or to TRANSFAC-like matrix format (used by some motif processing software)

>>> print(m.format("transfac"))
XX
TY Motif
ID 
BF undef
P0 G A T C
01 0 0 4 0
02 0 4 0 0
03 0 0 4 0
04 0 3 1 0
05 0 4 0 0
XX

Finally, if we have internet access, we can create a weblogo:

>>> arnt.weblogo("Arnt.png")

We should get our logo saved as a png in the specified file.

14.11.2  Searching for instances

The most frequent use for a motif is to find its instances in some sequence. For the sake of this section, we will use an artificial sequence like this:

test_seq=Seq("TATGATGTAGTATAATATAATTATAA",m.alphabet)

The simplest way to find instances, is to look for exact matches of the true instances of the motif:

>>> for pos, seq in m.search_instances(test_seq):
...     print(pos, seq.tostring())
... 
10 TATAA
15 TATAA
21 TATAA

We can do the same with the reverse complement (to find instances on the complementary strand):

>>> for pos, seq in m.reverse_complement().search_instances(test_seq):
...     print(pos, seq.tostring())
... 
12 TAATA
20 TTATA

It’s just as easy to look for positions, giving rise to high log-odds scores against our motif:

>>> for pos, score in m.search_pwm(test_seq, threshold=5.0):
...     print(pos, score)
... 
10 8.44065060871
-12 7.06213898545
15 8.44065060871
-20 8.44065060871
21 8.44065060871

You may notice the threshold parameter, here set arbitrarily to 5.0. This is in log2, so we are now looking only for words, which are 32 times more likely to occur under the motif model than in the background. The default threshold is 0.0, which selects everything that looks more like the motif than the background.

If you want to use a less arbitrary way of selecting thresholds, you can explore the Motif.score_distribution class implementing an distribution of scores for a given motif. Since the space for a score distribution grows exponentially with motif length, we are using an approximation with a given precision to keep computation cost manageable:

>>> sd = Motif.score_distribution(m, precision=10**4)

The sd object can be used to determine a number of different thresholds.

We can specify the requested false-positive rate (probability of “finding” a motif instance in background generated sequence):

>>> sd.threshold_fpr(0.01)
4.3535838726139886

or the false-negative rate (probability of “not finding” an instance generated from the motif):

>>> sd.threshold_fnr(0.1)
0.26651713652234044

or a threshold (approximately) satisfying some relation between fpr and fnr fnr/fprt:

>>> sd.threshold_balanced(1000)
8.4406506087056368

or a threshold satisfying (roughly) the equality between the false-positive rate and the −log of the information content (as used in patser software by Hertz and Stormo).

For example, in case of our motif, you can get the threshold giving you exactly the same results (for this sequence) as searching for instances with balanced threshold with rate of 1000.

>>> for pos, score in m.search_pwm(test_seq, threshold=sd.threshold_balanced(1000)):
...     print(pos, score)
... 
10 8.44065060871
15 8.44065060871
-20 8.44065060871
21 8.44065060871

14.11.3  Comparing motifs

Once we have more than one motif, we might want to compare them. For that, we have currently three different methods of Bio.Motif objects.

Before we start comparing motifs, I should point out that motif boundaries are usually quite arbitrary. This means, that we often need to compare motifs of different lengths, so comparison needs to involve some kind of alignment. This means, that we have to take into account two things:

  • alignment of motifs
  • some function to compare aligned motifs

In Bio.Motif we have 3 different functions for motif comparison, which are based on the same idea behind motif alignment, but use different functions to compare aligned motifs. Briefly speaking, we are using ungapped alignment of PWMs and substitute the missing columns at the beginning and end of the matrices with background distribution. All three comparison functions are written in such a way, that they can be interpreted as distance measures, however only one (dist_dpq) satisfies the triangle inequality. All of them return the minimal distance and the corresponding offset between motifs.

To show how these functions work, let us first load another motif, which is similar to our test motif m:

>>> ubx=Motif.read(open("Ubx.pfm"), "jaspar-pfm")
<Bio.Motif.Motif.Motif object at 0xc29b90>
>>> ubx.consensus()
Seq('TAAT', IUPACUnambiguousDNA())

The first function we’ll use to compare these motifs is based on Pearson correlation. Since we want it to resemble a distance measure, we actually take 1−r, where r is the Pearson correlation coefficient (PCC):

>>> m.dist_pearson(ubx)
(0.41740393308237722, 2)

This means, that the best PCC between motif m and Ubx is obtained with the following alignment:

bbTAAT
TATAAb

where b stands for background distribution. The PCC itself is roughly 1−0.42=0.58. If we try the reverse complement of the Ubx motif:

>>> m.dist_pearson(ubx.reverse_complement())
(0.25784180151584823, 1)

We can see that the PCC is better (almost 0.75), and the alignment is also different:

bATTA
TATAA

There are two other functions: dist_dpq, which is a true metric (satisfying traingle inequality) based on the Kullback-Leibler divergence

>>> m.dist_dpq(ubx.reverse_complement())
(0.49292358382899853, 1)

and the dist_product method, which is based on the product of probabilities which can be interpreted as the probability of independently generating the same instance by both motifs.

>>> m.dist_product(ubx.reverse_complement())
(0.16224587301064275, 1)

14.11.4  De novo motif finding

Currently, Biopython has only limited support for de novo motif finding. Namely, we support running and parsing of AlignAce and MEME. Since the number of motif finding tools is growing rapidly, contributions of new parsers are welcome.

14.11.4.1  MEME

Let’s assume, you have run MEME on sequences of your choice with your favorite parameters and saved the output in the file meme.out. You can retrieve the motifs reported by MEME by running the following piece of code:

>>> motifsM = list(Motif.parse(open("meme.out"), "MEME"))
>>> motifsM
[<Bio.Motif.MEMEMotif.MEMEMotif object at 0xc356b0>]

Besides the most wanted list of motifs, the result object contains more useful information, accessible through properties with self-explanatory names:

  • .alphabet
  • .datafile
  • .sequence_names
  • .version
  • .command

The motifs returned by MEMEParser can be treated exactly like regular Motif objects (with instances), they also provide some extra functionality, by adding additional information about the instances.

>>> motifsM[0].consensus()
Seq('CTCAATCGTA', IUPACUnambiguousDNA())

>>> motifsM[0].instances[0].pvalue
8.71e-07
>>> motifsM[0].instances[0].sequence_name
'SEQ10;'
>>> motifsM[0].instances[0].start
3
>>> motifsM[0].instances[0].strand
'+'

14.11.4.2  AlignAce

We can do very similar things with AlignACE program. Assume, you have your output in the file alignace.out. You can parse your output with the following code:

>>> motifsA=list(Motif.parse(open("alignace.out"), "AlignAce"))

Again, your motifs behave as they should:

>>> motifsA[0].consensus()
Seq('TCTACGATTGAG', IUPACUnambiguousDNA())

In fact you can even see, that AlignAce found a very similar motif as MEME, it is just a longer version of a reverse complement of MEME motif:

>>> motifsM[0].reverse_complement().consensus()
Seq('TACGATTGAG', IUPACUnambiguousDNA())

If you have AlignAce installed on the same machine, you can also run it directly from Biopython. Short example of how this can be done is shown below (other parameters can be specified as keyword parameters):

>>> command="/opt/bin/AlignACE"
>>> input_file="test.fa"
>>> from Bio.Motif.Applications import AlignAceCommandline
>>> cmd = AlignAceCommandline(cmd=command, input=input_file, gcback=0.6, numcols=10)
>>> stdout, stderr= cmd()

Since AlignAce prints all its output to standard output, you can get to your motifs by parsing the first part of the result:

motifs=list(Motif.parse(stdout,"AlignAce"))

Chapter 15  Cluster analysis

Cluster analysis is the grouping of items into clusters based on the similarity of the items to each other. In bioinformatics, clustering is widely used in gene expression data analysis to find groups of genes with similar gene expression profiles. This may identify functionally related genes, as well as suggest the function of presently unknown genes.

The Biopython module Bio.Cluster provides commonly used clustering algorithms and was designed with the application to gene expression data in mind. However, this module can also be used for cluster analysis of other types of data. Bio.Cluster and the underlying C Clustering Library is described by De Hoon et al. [14].

The following four clustering approaches are implemented in Bio.Cluster:

  • Hierarchical clustering (pairwise centroid-, single-, complete-, and average-linkage);
  • k-means, k-medians, and k-medoids clustering;
  • Self-Organizing Maps;
  • Principal Component Analysis.

Data representation

The data to be clustered are represented by a n × m Numerical Python array data. Within the context of gene expression data clustering, typically the rows correspond to different genes whereas the columns correspond to different experimental conditions. The clustering algorithms in Bio.Cluster can be applied both to rows (genes) and to columns (experiments).

Missing values

Often in microarray experiments, some of the data values are missing, which is indicated by an additional n × m Numerical Python integer array mask. If mask[i,j]==0, then data[i,j] is missing and is ignored in the analysis.

Random number generator

The k-means/medians/medoids clustering algorithms and Self-Organizing Maps (SOMs) include the use of a random number generator. The uniform random number generator in Bio.Cluster is based on the algorithm by L’Ecuyer [25], while random numbers following the binomial distribution are generated using the BTPE algorithm by Kachitvichyanukul and Schmeiser [23]. The random number generator is initialized automatically during its first call. As this random number generator uses a combination of two multiplicative linear congruential generators, two (integer) seeds are needed for initialization, for which we use the system-supplied random number generator rand (in the C standard library). We initialize this generator by calling srand with the epoch time in seconds, and use the first two random numbers generated by rand as seeds for the uniform random number generator in Bio.Cluster.

15.1  Distance functions

In order to cluster items into groups based on their similarity, we should first define what exactly we mean by similar. Bio.Cluster provides eight distance functions, indicated by a single character, to measure similarity, or conversely, distance:

  • 'e': Euclidean distance;
  • 'b': City-block distance.
  • 'c': Pearson correlation coefficient;
  • 'a': Absolute value of the Pearson correlation coefficient;
  • 'u': Uncentered Pearson correlation (equivalent to the cosine of the angle between two data vectors);
  • 'x': Absolute uncentered Pearson correlation;
  • 's': Spearman’s rank correlation;
  • 'k': Kendall’s τ.

The first two are true distance functions that satisfy the triangle inequality:

d

u
,
v


≤ d

u
,
w


d

w
,
v


for all  
u
v
w
,

and are therefore refered to as metrics. In everyday language, this means that the shortest distance between two points is a straight line.

The remaining six distance measures are related to the correlation coefficient, where the distance d is defined in terms of the correlation r by d=1−r. Note that these distance functions are semi-metrics that do not satisfy the triangle inequality. For example, for

u
=
1,0,−1
;
v
=
1,1,0
;
w
=
0,1,1
;

we find a Pearson distance d(u,w) = 1.8660, while d(u,v)+d(v,w) = 1.6340.

Euclidean distance

In Bio.Cluster, we define the Euclidean distance as

d = 
n
 
n
i=1
 
xiyi
2.

Only those terms are included in the summation for which both xi and yi are present, and the denominator n is chosen accordingly. As the expression data xi and yi are subtracted directly from each other, we should make sure that the expression data are properly normalized when using the Euclidean distance.

City-block distance

The city-block distance, alternatively known as the Manhattan distance, is related to the Euclidean distance. Whereas the Euclidean distance corresponds to the length of the shortest path between two points, the city-block distance is the sum of distances along each dimension. As gene expression data tend to have missing values, in Bio.Cluster we define the city-block distance as the sum of distances divided by the number of dimensions:

d = 
n
 
n
i=1
 
xiyi
.

This is equal to the distance you would have to walk between two points in a city, where you have to walk along city blocks. As for the Euclidean distance, the expression data are subtracted directly from each other, and we should therefore make sure that they are properly normalized.

The Pearson correlation coefficient

The Pearson correlation coefficient is defined as

r = 
1
n
 
n
i=1
 


xi −x
σx
 





yi −ȳ
σy
 


,

in which x, ȳ are the sample mean of x and y respectively, and σx, σy are the sample standard deviation of x and y. The Pearson correlation coefficient is a measure for how well a straight line can be fitted to a scatterplot of x and y. If all the points in the scatterplot lie on a straight line, the Pearson correlation coefficient is either +1 or -1, depending on whether the slope of line is positive or negative. If the Pearson correlation coefficient is equal to zero, there is no correlation between x and y.

The Pearson distance is then defined as

dP ≡ 1 − r.

As the Pearson correlation coefficient lies between -1 and 1, the Pearson distance lies between 0 and 2.

Absolute Pearson correlation

By taking the absolute value of the Pearson correlation, we find a number between 0 and 1. If the absolute value is 1, all the points in the scatter plot lie on a straight line with either a positive or a negative slope. If the absolute value is equal to zero, there is no correlation between x and y.

The corresponding distance is defined as

dA ≡ 1 − 
r
,

where r is the Pearson correlation coefficient. As the absolute value of the Pearson correlation coefficient lies between 0 and 1, the corresponding distance lies between 0 and 1 as well.

In the context of gene expression experiments, the absolute correlation is equal to 1 if the gene expression profiles of two genes are either exactly the same or exactly opposite. The absolute correlation coefficient should therefore be used with care.

Uncentered correlation (cosine of the angle)

In some cases, it may be preferable to use the uncentered correlation instead of the regular Pearson correlation coefficient. The uncentered correlation is defined as

rU = 
1
n
 
n
i=1
 


xi
σx(0)
 





yi
σy(0)
 


,

where

     
σx(0) =
 
1
n
 
n
i=1
xi2
;  
 
σy(0) =
 
1
n
 
n
i=1
yi2
.  
 

This is the same expression as for the regular Pearson correlation coefficient, except that the sample means x, ȳ are set equal to zero. The uncentered correlation may be appropriate if there is a zero reference state. For instance, in the case of gene expression data given in terms of log-ratios, a log-ratio equal to zero corresponds to the green and red signal being equal, which means that the experimental manipulation did not affect the gene expression.

The distance corresponding to the uncentered correlation coefficient is defined as

dU ≡ 1 − rU,

where rU is the uncentered correlation. As the uncentered correlation coefficient lies between -1 and 1, the corresponding distance lies between 0 and 2.

The uncentered correlation is equal to the cosine of the angle of the two data vectors in n-dimensional space, and is often referred to as such.

Absolute uncentered correlation

As for the regular Pearson correlation, we can define a distance measure using the absolute value of the uncentered correlation:

dAU ≡ 1 − 
rU
,

where rU is the uncentered correlation coefficient. As the absolute value of the uncentered correlation coefficient lies between 0 and 1, the corresponding distance lies between 0 and 1 as well.

Geometrically, the absolute value of the uncentered correlation is equal to the cosine between the supporting lines of the two data vectors (i.e., the angle without taking the direction of the vectors into consideration).

Spearman rank correlation

The Spearman rank correlation is an example of a non-parametric similarity measure, and tends to be more robust against outliers than the Pearson correlation.

To calculate the Spearman rank correlation, we replace each data value by their rank if we would order the data in each vector by their value. We then calculate the Pearson correlation between the two rank vectors instead of the data vectors.

As in the case of the Pearson correlation, we can define a distance measure corresponding to the Spearman rank correlation as

dS ≡ 1 − rS,

where rS is the Spearman rank correlation.

Kendall’s τ

Kendall’s τ is another example of a non-parametric similarity measure. It is similar to the Spearman rank correlation, but instead of the ranks themselves only the relative ranks are used to calculate τ (see Snedecor & Cochran [29]).

We can define a distance measure corresponding to Kendall’s τ as

dK ≡ 1 − τ.

As Kendall’s τ is always between -1 and 1, the corresponding distance will be between 0 and 2.

Weighting

For most of the distance functions available in Bio.Cluster, a weight vector can be applied. The weight vector contains weights for the items in the data vector. If the weight for item i is wi, then that item is treated as if it occurred wi times in the data. The weight do not have to be integers. For the Spearman rank correlation and Kendall’s τ, weights do not have a well-defined meaning and are therefore not implemented.

Calculating the distance matrix

The distance matrix is a square matrix with all pairwise distances between the items in data, and can be calculated by the function distancematrix in the Bio.Cluster module:

>>> from Bio.Cluster import distancematrix
>>> matrix = distancematrix(data)

where the following arguments are defined:

  • data (required)
    Array containing the data for the items.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • weight (default: None)
    The weights to be used when calculating distances. If weight==None, then equal weights are assumed.
  • transpose (default: 0)
    Determines if the distances between the rows of data are to be calculated (transpose==0), or between the columns of data (transpose==1).
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

To save memory, the distance matrix is returned as a list of 1D arrays. The number of columns in each row is equal to the row number. Hence, the first row has zero elements. An example of the return value is

[array([]),
 array([1.]),
 array([7., 3.]),
 array([4., 2., 6.])]

This corresponds to the distance matrix





0174  
1032  
7306  
4260




.

15.2  Calculating cluster properties

Calculating the cluster centroids

The centroid of a cluster can be defined either as the mean or as the median of each dimension over all cluster items. The function clustercentroids in Bio.Cluster can be used to calculate either:

>>> from Bio.Cluster import clustercentroids
>>> cdata, cmask = clustercentroids(data)

where the following arguments are defined:

  • data (required)
    Array containing the data for the items.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • clusterid (default: None)
    Vector of integers showing to which cluster each item belongs. If clusterid is None, then all items are assumed to belong to the same cluster.
  • method (default: 'a')
    Specifies whether the arithmetic mean (method=='a') or the median (method=='m') is used to calculate the cluster center.
  • transpose (default: 0)
    Determines if the centroids of the rows of data are to be calculated (transpose==0), or the centroids of the columns of data (transpose==1).

This function returns the tuple (cdata, cmask). The centroid data are stored in the 2D Numerical Python array cdata, with missing data indicated by the 2D Numerical Python integer array cmask. The dimensions of these arrays are (number of clusters, number of columns) if transpose is 0, or (number of rows, number of clusters) if transpose is 1. Each row (if transpose is 0) or column (if transpose is 1) contains the averaged data corresponding to the centroid of each cluster.

Calculating the distance between clusters

Given a distance function between items, we can define the distance between two clusters in several ways. The distance between the arithmetic means of the two clusters is used in pairwise centroid-linkage clustering and in k-means clustering. In k-medoids clustering, the distance between the medians of the two clusters is used instead. The shortest pairwise distance between items of the two clusters is used in pairwise single-linkage clustering, while the longest pairwise distance is used in pairwise maximum-linkage clustering. In pairwise average-linkage clustering, the distance between two clusters is defined as the average over the pairwise distances.

To calculate the distance between two clusters, use

>>> from Bio.Cluster import clusterdistance
>>> distance = clusterdistance(data)

where the following arguments are defined:

  • data (required)
    Array containing the data for the items.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • weight (default: None)
    The weights to be used when calculating distances. If weight==None, then equal weights are assumed.
  • index1 (default: 0)
    A list containing the indices of the items belonging to the first cluster. A cluster containing only one item i can be represented either as a list [i], or as an integer i.
  • index2 (default: 0)
    A list containing the indices of the items belonging to the second cluster. A cluster containing only one items i can be represented either as a list [i], or as an integer i.
  • method (default: 'a')
    Specifies how the distance between clusters is defined:
    • 'a': Distance between the two cluster centroids (arithmetic mean);
    • 'm': Distance between the two cluster centroids (median);
    • 's': Shortest pairwise distance between items in the two clusters;
    • 'x': Longest pairwise distance between items in the two clusters;
    • 'v': Average over the pairwise distances between items in the two clusters.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).
  • transpose (default: 0)
    If transpose==0, calculate the distance between the rows of data. If transpose==1, calculate the distance between the columns of data.

15.3  Partitioning algorithms

Partitioning algorithms divide items into k clusters such that the sum of distances over the items to their cluster centers is minimal. The number of clusters k is specified by the user. Three partitioning algorithms are available in Bio.Cluster:

  • k-means clustering
  • k-medians clustering
  • k-medoids clustering

These algorithms differ in how the cluster center is defined. In k-means clustering, the cluster center is defined as the mean data vector averaged over all items in the cluster. Instead of the mean, in k-medians clustering the median is calculated for each dimension in the data vector. Finally, in k-medoids clustering the cluster center is defined as the item which has the smallest sum of distances to the other items in the cluster. This clustering algorithm is suitable for cases in which the distance matrix is known but the original data matrix is not available, for example when clustering proteins based on their structural similarity.

The expectation-maximization (EM) algorithm is used to find this partitioning into k groups. In the initialization of the EM algorithm, we randomly assign items to clusters. To ensure that no empty clusters are produced, we use the binomial distribution to randomly choose the number of items in each cluster to be one or more. We then randomly permute the cluster assignments to items such that each item has an equal probability to be in any cluster. Each cluster is thus guaranteed to contain at least one item.

We then iterate:

  • Calculate the centroid of each cluster, defined as either the mean, the median, or the medoid of the cluster;
  • Calculate the distances of each item to the cluster centers;
  • For each item, determine which cluster centroid is closest;
  • Reassign each item to its closest cluster, or stop the iteration if no further item reassignments take place.

To avoid clusters becoming empty during the iteration, in k-means and k-medians clustering the algorithm keeps track of the number of items in each cluster, and prohibits the last remaining item in a cluster from being reassigned to a different cluster. For k-medoids clustering, such a check is not needed, as the item that functions as the cluster centroid has a zero distance to itself, and will therefore never be closer to a different cluster.

As the initial assignment of items to clusters is done randomly, usually a different clustering solution is found each time the EM algorithm is executed. To find the optimal clustering solution, the k-means algorithm is repeated many times, each time starting from a different initial random clustering. The sum of distances of the items to their cluster center is saved for each run, and the solution with the smallest value of this sum will be returned as the overall clustering solution.

How often the EM algorithm should be run depends on the number of items being clustered. As a rule of thumb, we can consider how often the optimal solution was found; this number is returned by the partitioning algorithms as implemented in this library. If the optimal solution was found many times, it is unlikely that better solutions exist than the one that was found. However, if the optimal solution was found only once, there may well be other solutions with a smaller within-cluster sum of distances. If the number of items is large (more than several hundreds), it may be difficult to find the globally optimal solution.

The EM algorithm terminates when no further reassignments take place. We noticed that for some sets of initial cluster assignments, the EM algorithm fails to converge due to the same clustering solution reappearing periodically after a small number of iteration steps. We therefore check for the occurrence of such periodic solutions during the iteration. After a given number of iteration steps, the current clustering result is saved as a reference. By comparing the clustering result after each subsequent iteration step to the reference state, we can determine if a previously encountered clustering result is found. In such a case, the iteration is halted. If after a given number of iterations the reference state has not yet been encountered, the current clustering solution is saved to be used as the new reference state. Initially, ten iteration steps are executed before resaving the reference state. This number of iteration steps is doubled each time, to ensure that periodic behavior with longer periods can also be detected.

k-means and k-medians

The k-means and k-medians algorithms are implemented as the function kcluster in Bio.Cluster:

>>> from Bio.Cluster import kcluster
>>> clusterid, error, nfound = kcluster(data)

where the following arguments are defined:

  • data (required)
    Array containing the data for the items.
  • nclusters (default: 2)
    The number of clusters k.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • weight (default: None)
    The weights to be used when calculating distances. If weight==None, then equal weights are assumed.
  • transpose (default: 0)
    Determines if rows (transpose is 0) or columns (transpose is 1) are to be clustered.
  • npass (default: 1)
    The number of times the k-means/-medians clustering algorithm is performed, each time with a different (random) initial condition. If initialid is given, the value of npass is ignored and the clustering algorithm is run only once, as it behaves deterministically in that case.
  • method (default: a)
    describes how the center of a cluster is found:
    • method=='a': arithmetic mean (k-means clustering);
    • method=='m': median (k-medians clustering).
    For other values of method, the arithmetic mean is used.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1). Whereas all eight distance measures are accepted by kcluster, from a theoretical viewpoint it is best to use the Euclidean distance for the k-means algorithm, and the city-block distance for k-medians.
  • initialid (default: None)
    Specifies the initial clustering to be used for the EM algorithm. If initialid==None, then a different random initial clustering is used for each of the npass runs of the EM algorithm. If initialid is not None, then it should be equal to a 1D array containing the cluster number (between 0 and nclusters-1) for each item. Each cluster should contain at least one item. With the initial clustering specified, the EM algorithm is deterministic.

This function returns a tuple (clusterid, error, nfound), where clusterid is an integer array containing the number of the cluster to which each row or cluster was assigned, error is the within-cluster sum of distances for the optimal clustering solution, and nfound is the number of times this optimal solution was found.

k-medoids clustering

The kmedoids routine performs k-medoids clustering on a given set of items, using the distance matrix and the number of clusters passed by the user:

>>> from Bio.Cluster import kmedoids
>>> clusterid, error, nfound = kmedoids(distance)

where the following arguments are defined: , nclusters=2, npass=1, initialid=None)|

  • distance (required)
    The matrix containing the distances between the items; this matrix can be specified in three ways:
    • as a 2D Numerical Python array (in which only the left-lower part of the array will be accessed):
      distance = array([[0.0, 1.1, 2.3],
                        [1.1, 0.0, 4.5],
                        [2.3, 4.5, 0.0]])
      
    • as a 1D Numerical Python array containing consecutively the distances in the left-lower part of the distance matrix:
      distance = array([1.1, 2.3, 4.5])
      
    • as a list containing the rows of the left-lower part of the distance matrix:
      distance = [array([]|,
                  array([1.1]),
                  array([2.3, 4.5])
                 ]
      
    These three expressions correspond to the same distance matrix.
  • nclusters (default: 2)
    The number of clusters k.
  • npass (default: 1)
    The number of times the k-medoids clustering algorithm is performed, each time with a different (random) initial condition. If initialid is given, the value of npass is ignored, as the clustering algorithm behaves deterministically in that case.
  • initialid (default: None)
    Specifies the initial clustering to be used for the EM algorithm. If initialid==None, then a different random initial clustering is used for each of the npass runs of the EM algorithm. If initialid is not None, then it should be equal to a 1D array containing the cluster number (between 0 and nclusters-1) for each item. Each cluster should contain at least one item. With the initial clustering specified, the EM algorithm is deterministic.

This function returns a tuple (clusterid, error, nfound), where clusterid is an array containing the number of the cluster to which each item was assigned, error is the within-cluster sum of distances for the optimal k-medoids clustering solution, and nfound is the number of times the optimal solution was found. Note that the cluster number in clusterid is defined as the item number of the item representing the cluster centroid.

15.4  Hierarchical clustering

Hierarchical clustering methods are inherently different from the k-means clustering method. In hierarchical clustering, the similarity in the expression profile between genes or experimental conditions are represented in the form of a tree structure. This tree structure can be shown graphically by programs such as Treeview and Java Treeview, which has contributed to the popularity of hierarchical clustering in the analysis of gene expression data.

The first step in hierarchical clustering is to calculate the distance matrix, specifying all the distances between the items to be clustered. Next, we create a node by joining the two closest items. Subsequent nodes are created by pairwise joining of items or nodes based on the distance between them, until all items belong to the same node. A tree structure can then be created by retracing which items and nodes were merged. Unlike the EM algorithm, which is used in k-means clustering, the complete process of hierarchical clustering is deterministic.

Several flavors of hierarchical clustering exist, which differ in how the distance between subnodes is defined in terms of their members. In Bio.Cluster, pairwise single, maximum, average, and centroid linkage are available.

  • In pairwise single-linkage clustering, the distance between two nodes is defined as the shortest distance among the pairwise distances between the members of the two nodes.
  • In pairwise maximum-linkage clustering, alternatively known as pairwise complete-linkage clustering, the distance between two nodes is defined as the longest distance among the pairwise distances between the members of the two nodes.
  • In pairwise average-linkage clustering, the distance between two nodes is defined as the average over all pairwise distances between the items of the two nodes.
  • In pairwise centroid-linkage clustering, the distance between two nodes is defined as the distance between their centroids. The centroids are calculated by taking the mean over all the items in a cluster. As the distance from each newly formed node to existing nodes and items need to be calculated at each step, the computing time of pairwise centroid-linkage clustering may be significantly longer than for the other hierarchical clustering methods. Another peculiarity is that (for a distance measure based on the Pearson correlation), the distances do not necessarily increase when going up in the clustering tree, and may even decrease. This is caused by an inconsistency between the centroid calculation and the distance calculation when using the Pearson correlation: Whereas the Pearson correlation effectively normalizes the data for the distance calculation, no such normalization occurs for the centroid calculation.

For pairwise single-, complete-, and average-linkage clustering, the distance between two nodes can be found directly from the distances between the individual items. Therefore, the clustering algorithm does not need access to the original gene expression data, once the distance matrix is known. For pairwise centroid-linkage clustering, however, the centroids of newly formed subnodes can only be calculated from the original data and not from the distance matrix.

The implementation of pairwise single-linkage hierarchical clustering is based on the SLINK algorithm (R. Sibson, 1973), which is much faster and more memory-efficient than a straightforward implementation of pairwise single-linkage clustering. The clustering result produced by this algorithm is identical to the clustering solution found by the conventional single-linkage algorithm. The single-linkage hierarchical clustering algorithm implemented in this library can be used to cluster large gene expression data sets, for which conventional hierarchical clustering algorithms fail due to excessive memory requirements and running time.

Representing a hierarchical clustering solution

The result of hierarchical clustering consists of a tree of nodes, in which each node joins two items or subnodes. Usually, we are not only interested in which items or subnodes are joined at each node, but also in their similarity (or distance) as they are joined. To store one node in the hierarchical clustering tree, we make use of the class Node, which defined in Bio.Cluster. An instance of Node has three attributes:

  • left
  • right
  • distance

Here, left and right are integers referring to the two items or subnodes that are joined at this node, and distance is the distance between them. The items being clustered are numbered from 0 to (number of items − 1), while clusters are numbered from -1 to −(number of items−1). Note that the number of nodes is one less than the number of items.

To create a new Node object, we need to specify left and right; distance is optional.

>>> from Bio.Cluster import Node
>>> Node(2, 3)
(2, 3): 0
>>> Node(2, 3, 0.91)
(2, 3): 0.91

The attributes left, right, and distance of an existing Node object can be modified directly:

>>> node = Node(4, 5)
>>> node.left = 6
>>> node.right = 2
>>> node.distance = 0.73
>>> node
(6, 2): 0.73

An error is raised if left and right are not integers, or if distance cannot be converted to a floating-point value.

The Python class Tree represents a full hierarchical clustering solution. A Tree object can be created from a list of Node objects:

>>> from Bio.Cluster import Node, Tree
>>> nodes = [Node(1, 2, 0.2), Node(0, 3, 0.5), Node(-2, 4, 0.6), Node(-1, -3, 0.9)]
>>> tree = Tree(nodes)
>>> print(tree)
(1, 2): 0.2
(0, 3): 0.5
(-2, 4): 0.6
(-1, -3): 0.9

The Tree initializer checks if the list of nodes is a valid hierarchical clustering result:

>>> nodes = [Node(1, 2, 0.2), Node(0, 2, 0.5)]
>>> Tree(nodes)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: Inconsistent tree

Individual nodes in a Tree object can be accessed using square brackets:

>>> nodes = [Node(1, 2, 0.2), Node(0, -1, 0.5)]
>>> tree = Tree(nodes)
>>> tree[0]
(1, 2): 0.2
>>> tree[1]
(0, -1): 0.5
>>> tree[-1]
(0, -1): 0.5

As a Tree object is read-only, we cannot change individual nodes in a Tree object. However, we can convert the tree to a list of nodes, modify this list, and create a new tree from this list:

>>> tree = Tree([Node(1, 2, 0.1), Node(0, -1, 0.5), Node(-2, 3, 0.9)])
>>> print(tree)
(1, 2): 0.1
(0, -1): 0.5
(-2, 3): 0.9
>>> nodes = tree[:]
>>> nodes[0] = Node(0, 1, 0.2)
>>> nodes[1].left = 2
>>> tree = Tree(nodes)
>>> print(tree)
(0, 1): 0.2
(2, -1): 0.5
(-2, 3): 0.9

This guarantees that any Tree object is always well-formed.

To display a hierarchical clustering solution with visualization programs such as Java Treeview, it is better to scale all node distances such that they are between zero and one. This can be accomplished by calling the scale method on an existing Tree object:

>>> tree.scale()

This method takes no arguments, and returns None.

After hierarchical clustering, the items can be grouped into k clusters based on the tree structure stored in the Tree object by cutting the tree:

>>> clusterid = tree.cut(nclusters=1)

where nclusters (defaulting to 1) is the desired number of clusters k. This method ignores the top k−1 linking events in the tree structure, resulting in k separated clusters of items. The number of clusters k should be positive, and less than or equal to the number of items. This method returns an array clusterid containing the number of the cluster to which each item is assigned.

Performing hierarchical clustering

To perform hierarchical clustering, use the treecluster function in Bio.Cluster.

>>> from Bio.Cluster import treecluster
>>> tree = treecluster(data)

where the following arguments are defined:

  • data
    Array containing the data for the items.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • weight (default: None)
    The weights to be used when calculating distances. If weight==None, then equal weights are assumed.
  • transpose (default: 0)
    Determines if rows (transpose==0) or columns (transpose==1) are to be clustered.
  • method (default: 'm')
    defines the linkage method to be used:
    • method=='s': pairwise single-linkage clustering
    • method=='m': pairwise maximum- (or complete-) linkage clustering
    • method=='c': pairwise centroid-linkage clustering
    • method=='a': pairwise average-linkage clustering
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

To apply hierarchical clustering on a precalculated distance matrix, specify the distancematrix argument when calling treecluster function instead of the data argument:

>>> from Bio.Cluster import treecluster
>>> tree = treecluster(distancematrix=distance)

In this case, the following arguments are defined:

  • distancematrix
    The distance matrix, which can be specified in three ways:
    • as a 2D Numerical Python array (in which only the left-lower part of the array will be accessed):
      distance = array([[0.0, 1.1, 2.3], 
                        [1.1, 0.0, 4.5],
                        [2.3, 4.5, 0.0]])
      
    • as a 1D Numerical Python array containing consecutively the distances in the left-lower part of the distance matrix:
      distance = array([1.1, 2.3, 4.5])
      
    • as a list containing the rows of the left-lower part of the distance matrix:
      distance = [array([]),
                  array([1.1]),
                  array([2.3, 4.5])
      
    These three expressions correspond to the same distance matrix. As treecluster may shuffle the values in the distance matrix as part of the clustering algorithm, be sure to save this array in a different variable before calling treecluster if you need it later.
  • method
    The linkage method to be used:
    • method=='s': pairwise single-linkage clustering
    • method=='m': pairwise maximum- (or complete-) linkage clustering
    • method=='a': pairwise average-linkage clustering
    While pairwise single-, maximum-, and average-linkage clustering can be calculated from the distance matrix alone, pairwise centroid-linkage cannot.

When calling treecluster, either data or distancematrix should be None.

This function returns a Tree object. This object contains (number of items − 1) nodes, where the number of items is the number of rows if rows were clustered, or the number of columns if columns were clustered. Each node describes a pairwise linking event, where the node attributes left and right each contain the number of one item or subnode, and distance the distance between them. Items are numbered from 0 to (number of items − 1), while clusters are numbered -1 to −(number of items−1).

15.5  Self-Organizing Maps

Self-Organizing Maps (SOMs) were invented by Kohonen to describe neural networks (see for instance Kohonen, 1997 [24]). Tamayo (1999) first applied Self-Organizing Maps to gene expression data [30].

SOMs organize items into clusters that are situated in some topology. Usually a rectangular topology is chosen. The clusters generated by SOMs are such that neighboring clusters in the topology are more similar to each other than clusters far from each other in the topology.

The first step to calculate a SOM is to randomly assign a data vector to each cluster in the topology. If rows are being clustered, then the number of elements in each data vector is equal to the number of columns.

An SOM is then generated by taking rows one at a time, and finding which cluster in the topology has the closest data vector. The data vector of that cluster, as well as those of the neighboring clusters, are adjusted using the data vector of the row under consideration. The adjustment is given by

Δ 
x
cell = τ · 

x
row − 
x
cell 

.

The parameter τ is a parameter that decreases at each iteration step. We have used a simple linear function of the iteration step:

τ = τinit · 


1 − 
i 
n



,

τinit is the initial value of τ as specified by the user, i is the number of the current iteration step, and n is the total number of iteration steps to be performed. While changes are made rapidly in the beginning of the iteration, at the end of iteration only small changes are made.

All clusters within a radius R are adjusted to the gene under consideration. This radius decreases as the calculation progresses as

R = Rmax · 


1 − 
i 
n



,

in which the maximum radius is defined as

Rmax = 
Nx2 + Ny2
,

where (Nx, Ny) are the dimensions of the rectangle defining the topology.

The function somcluster implements the complete algorithm to calculate a Self-Organizing Map on a rectangular grid. First it initializes the random number generator. The node data are then initialized using the random number generator. The order in which genes or microarrays are used to modify the SOM is also randomized. The total number of iterations in the SOM algorithm is specified by the user.

To run somcluster, use

>>> from Bio.Cluster import somcluster
>>> clusterid, celldata = somcluster(data)

where the following arguments are defined:

  • data (required)
    Array containing the data for the items.
  • mask (default: None)
    Array of integers showing which data are missing. If mask[i,j]==0, then data[i,j] is missing. If mask==None, then all data are present.
  • weight (default: None)
    contains the weights to be used when calculating distances. If weight==None, then equal weights are assumed.
  • transpose (default: 0)
    Determines if rows (transpose is 0) or columns (transpose is 1) are to be clustered.
  • nxgrid, nygrid (default: 2, 1)
    The number of cells horizontally and vertically in the rectangular grid on which the Self-Organizing Map is calculated.
  • inittau (default: 0.02)
    The initial value for the parameter τ that is used in the SOM algorithm. The default value for inittau is 0.02, which was used in Michael Eisen’s Cluster/TreeView program.
  • niter (default: 1)
    The number of iterations to be performed.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

This function returns the tuple (clusterid, celldata):

  • clusterid:
    An array with two columns, where the number of rows is equal to the number of items that were clustered. Each row contains the x and y coordinates of the cell in the rectangular SOM grid to which the item was assigned.
  • celldata:
    An array with dimensions (nxgrid, nygrid, number of columns) if rows are being clustered, or (nxgrid, nygrid, number of rows) if columns are being clustered. Each element [ix][iy] of this array is a 1D vector containing the gene expression data for the centroid of the cluster in the grid cell with coordinates [ix][iy].

15.6  Principal Component Analysis

Principal Component Analysis (PCA) is a widely used technique for analyzing multivariate data. A practical example of applying Principal Component Analysis to gene expression data is presented by Yeung and Ruzzo (2001) [33].

In essence, PCA is a coordinate transformation in which each row in the data matrix is written as a linear sum over basis vectors called principal components, which are ordered and chosen such that each maximally explains the remaining variance in the data vectors. For example, an n × 3 data matrix can be represented as an ellipsoidal cloud of n points in three dimensional space. The first principal component is the longest axis of the ellipsoid, the second principal component the second longest axis of the ellipsoid, and the third principal component is the shortest axis. Each row in the data matrix can be reconstructed as a suitable linear combination of the principal components. However, in order to reduce the dimensionality of the data, usually only the most important principal components are retained. The remaining variance present in the data is then regarded as unexplained variance.

The principal components can be found by calculating the eigenvectors of the covariance matrix of the data. The corresponding eigenvalues determine how much of the variance present in the data is explained by each principal component.

Before applying principal component analysis, typically the mean is subtracted from each column in the data matrix. In the example above, this effectively centers the ellipsoidal cloud around its centroid in 3D space, with the principal components describing the variation of points in the ellipsoidal cloud with respect to their centroid.

The function pca below first uses the singular value decomposition to calculate the eigenvalues and eigenvectors of the data matrix. The singular value decomposition is implemented as a translation in C of the Algol procedure svd [16], which uses Householder bidiagonalization and a variant of the QR algorithm. The principal components, the coordinates of each data vector along the principal components, and the eigenvalues corresponding to the principal components are then evaluated and returned in decreasing order of the magnitude of the eigenvalue. If data centering is desired, the mean should be subtracted from each column in the data matrix before calling the pca routine.

To apply Principal Component Analysis to a rectangular matrix data, use

>>> from Bio.Cluster import pca
>>> columnmean, coordinates, components, eigenvalues = pca(data)

This function returns a tuple columnmean, coordinates, components, eigenvalues:

  • columnmean
    Array containing the mean over each column in data.
  • coordinates
    The coordinates of each row in data with respect to the principal components.
  • components
    The principal components.
  • eigenvalues
    The eigenvalues corresponding to each of the principal components.

The original matrix data can be recreated by calculating columnmean + dot(coordinates, components).

15.7  Handling Cluster/TreeView-type files

Cluster/TreeView are GUI-based codes for clustering gene expression data. They were originally written by Michael Eisen while at Stanford University. Bio.Cluster contains functions for reading and writing data files that correspond to the format specified for Cluster/TreeView. In particular, by saving a clustering result in that format, TreeView can be used to visualize the clustering results. We recommend using Alok Saldanha’s http://jtreeview.sourceforge.net/Java TreeView program, which can display hierarchical as well as k-means clustering results.

An object of the class Record contains all information stored in a Cluster/TreeView-type data file. To store the information contained in the data file in a Record object, we first open the file and then read it:

>>> from Bio import Cluster
>>> handle = open("mydatafile.txt")
>>> record = Cluster.read(handle)
>>> handle.close()

This two-step process gives you some flexibility in the source of the data. For example, you can use

>>> import gzip # Python standard library
>>> handle = gzip.open("mydatafile.txt.gz")

to open a gzipped file, or

>>> import urllib # Python standard library
>>> handle = urllib.urlopen("http://somewhere.org/mydatafile.txt")

to open a file stored on the Internet before calling read.

The read command reads the tab-delimited text file mydatafile.txt containing gene expression data in the format specified for Michael Eisen’s Cluster/TreeView program. For a description of this file format, see the manual to Cluster/TreeView. It is available at Michael Eisen’s lab website and at our website.

A Record object has the following attributes:

  • data
    The data array containing the gene expression data. Genes are stored row-wise, while microarrays are stored column-wise.
  • mask
    This array shows which elements in the data array, if any, are missing. If mask[i,j]==0, then data[i,j] is missing. If no data were found to be missing, mask is set to None.
  • geneid
    This is a list containing a unique description for each gene (i.e., ORF numbers).
  • genename
    This is a list containing a description for each gene (i.e., gene name). If not present in the data file, genename is set to None.
  • gweight
    The weights that are to be used to calculate the distance in expression profile between genes. If not present in the data file, gweight is set to None.
  • gorder
    The preferred order in which genes should be stored in an output file. If not present in the data file, gorder is set to None.
  • expid
    This is a list containing a description of each microarray, e.g. experimental condition.
  • eweight
    The weights that are to be used to calculate the distance in expression profile between microarrays. If not present in the data file, eweight is set to None.
  • eorder
    The preferred order in which microarrays should be stored in an output file. If not present in the data file, eorder is set to None.
  • uniqid
    The string that was used instead of UNIQID in the data file.

After loading a Record object, each of these attributes can be accessed and modified directly. For example, the data can be log-transformed by taking the logarithm of record.data.

Calculating the distance matrix

To calculate the distance matrix between the items stored in the record, use

>>> matrix = record.distancematrix()

where the following arguments are defined:

  • transpose (default: 0)
    Determines if the distances between the rows of data are to be calculated (transpose==0), or between the columns of data (transpose==1).
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

This function returns the distance matrix as a list of rows, where the number of columns of each row is equal to the row number (see section 15.1).

Calculating the cluster centroids

To calculate the centroids of clusters of items stored in the record, use

>>> cdata, cmask = record.clustercentroids()
  • clusterid (default: None)
    Vector of integers showing to which cluster each item belongs. If clusterid is not given, then all items are assumed to belong to the same cluster.
  • method (default: 'a')
    Specifies whether the arithmetic mean (method=='a') or the median (method=='m') is used to calculate the cluster center.
  • transpose (default: 0)
    Determines if the centroids of the rows of data are to be calculated (transpose==0), or the centroids of the columns of data (transpose==1).

This function returns the tuple cdata, cmask; see section 15.2 for a description.

Calculating the distance between clusters

To calculate the distance between clusters of items stored in the record, use

>>> distance = record.clusterdistance()

where the following arguments are defined:

  • index1 (default: 0)
    A list containing the indices of the items belonging to the first cluster. A cluster containing only one item i can be represented either as a list [i], or as an integer i.
  • index2 (default: 0)
    A list containing the indices of the items belonging to the second cluster. A cluster containing only one item i can be represented either as a list [i], or as an integer i.
  • method (default: 'a')
    Specifies how the distance between clusters is defined:
    • 'a': Distance between the two cluster centroids (arithmetic mean);
    • 'm': Distance between the two cluster centroids (median);
    • 's': Shortest pairwise distance between items in the two clusters;
    • 'x': Longest pairwise distance between items in the two clusters;
    • 'v': Average over the pairwise distances between items in the two clusters.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).
  • transpose (default: 0)
    If transpose==0, calculate the distance between the rows of data. If transpose==1, calculate the distance between the columns of data.

Performing hierarchical clustering

To perform hierarchical clustering on the items stored in the record, use

>>> tree = record.treecluster()

where the following arguments are defined:

  • transpose (default: 0)
    Determines if rows (transpose==0) or columns (transpose==1) are to be clustered.
  • method (default: 'm')
    defines the linkage method to be used:
    • method=='s': pairwise single-linkage clustering
    • method=='m': pairwise maximum- (or complete-) linkage clustering
    • method=='c': pairwise centroid-linkage clustering
    • method=='a': pairwise average-linkage clustering
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).
  • transpose
    Determines if genes or microarrays are being clustered. If transpose==0, genes (rows) are being clustered. If transpose==1, microarrays (columns) are clustered.

This function returns a Tree object. This object contains (number of items − 1) nodes, where the number of items is the number of rows if rows were clustered, or the number of columns if columns were clustered. Each node describes a pairwise linking event, where the node attributes left and right each contain the number of one item or subnode, and distance the distance between them. Items are numbered from 0 to (number of items − 1), while clusters are numbered -1 to −(number of items−1).

Performing k-means or k-medians clustering

To perform k-means or k-medians clustering on the items stored in the record, use

>>> clusterid, error, nfound = record.kcluster()

where the following arguments are defined:

  • nclusters (default: 2)
    The number of clusters k.
  • transpose (default: 0)
    Determines if rows (transpose is 0) or columns (transpose is 1) are to be clustered.
  • npass (default: 1)
    The number of times the k-means/-medians clustering algorithm is performed, each time with a different (random) initial condition. If initialid is given, the value of npass is ignored and the clustering algorithm is run only once, as it behaves deterministically in that case.
  • method (default: a)
    describes how the center of a cluster is found:
    • method=='a': arithmetic mean (k-means clustering);
    • method=='m': median (k-medians clustering).
    For other values of method, the arithmetic mean is used.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

This function returns a tuple (clusterid, error, nfound), where clusterid is an integer array containing the number of the cluster to which each row or cluster was assigned, error is the within-cluster sum of distances for the optimal clustering solution, and nfound is the number of times this optimal solution was found.

Calculating a Self-Organizing Map

To calculate a Self-Organizing Map of the items stored in the record, use

>>> clusterid, celldata = record.somcluster()

where the following arguments are defined:

  • transpose (default: 0)
    Determines if rows (transpose is 0) or columns (transpose is 1) are to be clustered.
  • nxgrid, nygrid (default: 2, 1)
    The number of cells horizontally and vertically in the rectangular grid on which the Self-Organizing Map is calculated.
  • inittau (default: 0.02)
    The initial value for the parameter τ that is used in the SOM algorithm. The default value for inittau is 0.02, which was used in Michael Eisen’s Cluster/TreeView program.
  • niter (default: 1)
    The number of iterations to be performed.
  • dist (default: 'e', Euclidean distance)
    Defines the distance function to be used (see 15.1).

This function returns the tuple (clusterid, celldata):

  • clusterid:
    An array with two columns, where the number of rows is equal to the number of items that were clustered. Each row contains the x and y coordinates of the cell in the rectangular SOM grid to which the item was assigned.
  • celldata:
    An array with dimensions (nxgrid, nygrid, number of columns) if rows are being clustered, or (nxgrid, nygrid, number of rows) if columns are being clustered. Each element [ix][iy] of this array is a 1D vector containing the gene expression data for the centroid of the cluster in the grid cell with coordinates [ix][iy].

Saving the clustering result

To save the clustering result, use

>>> record.save(jobname, geneclusters, expclusters)

where the following arguments are defined:

  • jobname
    The string jobname is used as the base name for names of the files that are to be saved.
  • geneclusters
    This argument describes the gene (row-wise) clustering result. In case of k-means clustering, this is a 1D array containing the number of the cluster each gene belongs to. It can be calculated using kcluster. In case of hierarchical clustering, geneclusters is a Tree object.
  • expclusters
    This argument describes the (column-wise) clustering result for the experimental conditions. In case of k-means clustering, this is a 1D array containing the number of the cluster each experimental condition belongs to. It can be calculated using kcluster. In case of hierarchical clustering, expclusters is a Tree object.

This method writes the text file jobname.cdt, jobname.gtr, jobname.atr, jobname*.kgg, and/or jobname*.kag for subsequent reading by the Java TreeView program. If geneclusters and expclusters are both None, this method only writes the text file jobname.cdt; this file can subsequently be read into a new Record object.

15.8  Example calculation

This is an example of a hierarchical clustering calculation, using single linkage clustering for genes and maximum linkage clustering for experimental conditions. As the Euclidean distance is being used for gene clustering, it is necessary to scale the node distances genetree such that they are all between zero and one. This is needed for the Java TreeView code to display the tree diagram correctly. To cluster the experimental conditions, the uncentered correlation is being used. No scaling is needed in this case, as the distances in exptree are already between zero and two. The example data cyano.txt can be found in the data subdirectory.

>>> from Bio import Cluster
>>> handle = open("cyano.txt")
>>> record = Cluster.read(handle)
>>> handle.close()
>>> genetree = record.treecluster(method='s')
>>> genetree.scale()
>>> exptree = record.treecluster(dist='u', transpose=1)
>>> record.save("cyano_result", genetree, exptree)

This will create the files cyano_result.cdt, cyano_result.gtr, and cyano_result.atr.

Similarly, we can save a k-means clustering solution:

>>> from Bio import Cluster
>>> handle = open("cyano.txt")
>>> record = Cluster.read(handle)
>>> handle.close()
>>> (geneclusters, error, ifound) = record.kcluster(nclusters=5, npass=1000)
>>> (expclusters, error, ifound) = record.kcluster(nclusters=2, npass=100, transpose=1)
>>> record.save("cyano_result", geneclusters, expclusters)

This will create the files cyano_result_K_G2_A2.cdt, cyano_result_K_G2.kgg, and cyano_result_K_A2.kag.

15.9  Auxiliary functions

median(data) returns the median of the 1D array data.

mean(data) returns the mean of the 1D array data.

version() returns the version number of the underlying C Clustering Library as a string.

Chapter 16  Supervised learning methods

Note the supervised learning methods described in this chapter all require Numerical Python (numpy) to be installed.

16.1  The Logistic Regression Model

16.1.1  Background and Purpose

Logistic regression is a supervised learning approach that attempts to distinguish K classes from each other using a weighted sum of some predictor variables xi. The logistic regression model is used to calculate the weights βi of the predictor variables. In Biopython, the logistic regression model is currently implemented for two classes only (K = 2); the number of predictor variables has no predefined limit.

As an example, let’s try to predict the operon structure in bacteria. An operon is a set of adjacent genes on the same strand of DNA that are transcribed into a single mRNA molecule. Translation of the single mRNA molecule then yields the individual proteins. For Bacillus subtilis, whose data we will be using, the average number of genes in an operon is about 2.4.

As a first step in understanding gene regulation in bacteria, we need to know the operon structure. For about 10% of the genes in Bacillus subtilis, the operon structure is known from experiments. A supervised learning method can be used to predict the operon structure for the remaining 90% of the genes.

For such a supervised learning approach, we need to choose some predictor variables xi that can be measured easily and are somehow related to the operon structure. One predictor variable might be the distance in base pairs between genes. Adjacent genes belonging to the same operon tend to be separated by a relatively short distance, whereas adjacent genes in different operons tend to have a larger space between them to allow for promoter and terminator sequences. Another predictor variable is based on gene expression measurements. By definition, genes belonging to the same operon have equal gene expression profiles, while genes in different operons are expected to have different expression profiles. In practice, the measured expression profiles of genes in the same operon are not quite identical due to the presence of measurement errors. To assess the similarity in the gene expression profiles, we assume that the measurement errors follow a normal distribution and calculate the corresponding log-likelihood score.

We now have two predictor variables that we can use to predict if two adjacent genes on the same strand of DNA belong to the same operon:

  • x1: the number of base pairs between them;
  • x2: their similarity in expression profile.

In a logistic regression model, we use a weighted sum of these two predictors to calculate a joint score S:

S = β0 + β1 x1 + β2 x2.     (16.1)

The logistic regression model gives us appropriate values for the parameters β0, β1, β2 using two sets of example genes:

  • OP: Adjacent genes, on the same strand of DNA, known to belong to the same operon;
  • NOP: Adjacent genes, on the same strand of DNA, known to belong to different operons.

In the logistic regression model, the probability of belonging to a class depends on the score via the logistic function. For the two classes OP and NOP, we can write this as

     
Pr(OP|x1x2) =
 
exp(β0 + β1 x1 + β2 x2)
1+exp(β0 + β1 x1 + β2 x2)
   
    (16.2)
Pr(NOP|x1x2) =
 
1
1+exp(β0 + β1 x1 + β2 x2)
   
    (16.3)

Using a set of gene pairs for which it is known whether they belong to the same operon (class OP) or to different operons (class NOP), we can calculate the weights β0, β1, β2 by maximizing the log-likelihood corresponding to the probability functions (16.2) and (16.3).

16.1.2  Training the logistic regression model


Table 16.1: Adjacent gene pairs known to belong to the same operon (class OP) or to different operons (class NOP). Intergene distances are negative if the two genes overlap.
Gene pairIntergene distance (x1)Gene expression score (x2)Class
cotJAcotJB-53-200.78OP
yesKyesL117-267.14OP
lplAlplB57-163.47OP
lplBlplC16-190.30OP
lplClplD11-220.94OP
lplDyetF85-193.94OP
yfmTyfmS16-182.71OP
yfmFyfmE15-180.41OP
citScitT-26-181.73OP
citMyflN58-259.87OP
yfiIyfiJ126-414.53NOP
lipByfiQ191-249.57NOP
yfiUyfiV113-265.28NOP
yfhHyfhI145-312.99NOP
cotYcotX154-213.83NOP
yjoBrapA147-380.85NOP
ptsIsplA93-291.13NOP

Table 16.1 lists some of the Bacillus subtilis gene pairs for which the operon structure is known. Let’s calculate the logistic regression model from these data:

>>> from Bio import LogisticRegression
>>> xs = [[-53, -200.78],
          [117, -267.14],
          [57, -163.47],
          [16, -190.30],
          [11, -220.94],
          [85, -193.94],
          [16, -182.71],
          [15, -180.41],
          [-26, -181.73],
          [58, -259.87],
          [126, -414.53],
          [191, -249.57],
          [113, -265.28],
          [145, -312.99],
          [154, -213.83],
          [147, -380.85],
          [93, -291.13]]
>>> ys = [1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          0,
          0,
          0,
          0,
          0,
          0,
          0]
>>> model = LogisticRegression.train(xs, ys)

Here, xs and ys are the training data: xs contains the predictor variables for each gene pair, and ys specifies if the gene pair belongs to the same operon (1, class OP) or different operons (0, class NOP). The resulting logistic regression model is stored in model, which contains the weights β0, β1, and β2:

>>> model.beta
[8.9830290157144681, -0.035968960444850887, 0.02181395662983519]

Note that β1 is negative, as gene pairs with a shorter intergene distance have a higher probability of belonging to the same operon (class OP). On the other hand, β2 is positive, as gene pairs belonging to the same operon typically have a higher similarity score of their gene expression profiles. The parameter β0 is positive due to the higher prevalence of operon gene pairs than non-operon gene pairs in the training data.

The function train has two optional arguments: update_fn and typecode. The update_fn can be used to specify a callback function, taking as arguments the iteration number and the log-likelihood. With the callback function, we can for example track the progress of the model calculation (which uses a Newton-Raphson iteration to maximize the log-likelihood function of the logistic regression model):

>>> def show_progress(iteration, loglikelihood):
        print("Iteration:", iteration, "Log-likelihood function:", loglikelihood)
>>>
>>> model = LogisticRegression.train(xs, ys, update_fn=show_progress)
Iteration: 0 Log-likelihood function: -11.7835020695
Iteration: 1 Log-likelihood function: -7.15886767672
Iteration: 2 Log-likelihood function: -5.76877209868
Iteration: 3 Log-likelihood function: -5.11362294338
Iteration: 4 Log-likelihood function: -4.74870642433
Iteration: 5 Log-likelihood function: -4.50026077146
Iteration: 6 Log-likelihood function: -4.31127773737
Iteration: 7 Log-likelihood function: -4.16015043396
Iteration: 8 Log-likelihood function: -4.03561719785
Iteration: 9 Log-likelihood function: -3.93073282192
Iteration: 10 Log-likelihood function: -3.84087660929
Iteration: 11 Log-likelihood function: -3.76282560605
Iteration: 12 Log-likelihood function: -3.69425027154
Iteration: 13 Log-likelihood function: -3.6334178602
Iteration: 14 Log-likelihood function: -3.57900855837
Iteration: 15 Log-likelihood function: -3.52999671386
Iteration: 16 Log-likelihood function: -3.48557145163
Iteration: 17 Log-likelihood function: -3.44508206139
Iteration: 18 Log-likelihood function: -3.40799948447
Iteration: 19 Log-likelihood function: -3.3738885624
Iteration: 20 Log-likelihood function: -3.3423876581
Iteration: 21 Log-likelihood function: -3.31319343769
Iteration: 22 Log-likelihood function: -3.2860493346
Iteration: 23 Log-likelihood function: -3.2607366863
Iteration: 24 Log-likelihood function: -3.23706784091
Iteration: 25 Log-likelihood function: -3.21488073614
Iteration: 26 Log-likelihood function: -3.19403459259
Iteration: 27 Log-likelihood function: -3.17440646052
Iteration: 28 Log-likelihood function: -3.15588842703
Iteration: 29 Log-likelihood function: -3.13838533947
Iteration: 30 Log-likelihood function: -3.12181293595
Iteration: 31 Log-likelihood function: -3.10609629966
Iteration: 32 Log-likelihood function: -3.09116857282
Iteration: 33 Log-likelihood function: -3.07696988017
Iteration: 34 Log-likelihood function: -3.06344642288
Iteration: 35 Log-likelihood function: -3.05054971191
Iteration: 36 Log-likelihood function: -3.03823591619
Iteration: 37 Log-likelihood function: -3.02646530573
Iteration: 38 Log-likelihood function: -3.01520177394
Iteration: 39 Log-likelihood function: -3.00441242601
Iteration: 40 Log-likelihood function: -2.99406722296
Iteration: 41 Log-likelihood function: -2.98413867259

The iteration stops once the increase in the log-likelihood function is less than 0.01. If no convergence is reached after 500 iterations, the train function returns with an AssertionError.

The optional keyword typecode can almost always be ignored. This keyword allows the user to choose the type of Numeric matrix to use. In particular, to avoid memory problems for very large problems, it may be necessary to use single-precision floats (Float8, Float16, etc.) rather than double, which is used by default.

16.1.3  Using the logistic regression model for classification

Classification is performed by calling the classify function. Given a logistic regression model and the values for x1 and x2 (e.g. for a gene pair of unknown operon structure), the classify function returns 1 or 0, corresponding to class OP and class NOP, respectively. For example, let’s consider the gene pairs yxcE, yxcD and yxiB, yxiA:


Table 16.2: Adjacent gene pairs of unknown operon status.
Gene pairIntergene distance x1Gene expression score x2
yxcEyxcD6-173.143442352
yxiByxiA309-271.005880394

The logistic regression model classifies yxcE, yxcD as belonging to the same operon (class OP), while yxiB, yxiA are predicted to belong to different operons:

>>> print("yxcE, yxcD:", LogisticRegression.classify(model, [6, -173.143442352]))
yxcE, yxcD: 1
>>> print("yxiB, yxiA:", LogisticRegression.classify(model, [309, -271.005880394]))
yxiB, yxiA: 0

(which, by the way, agrees with the biological literature).

To find out how confident we can be in these predictions, we can call the calculate function to obtain the probabilities (equations (16.2) and 16.3) for class OP and NOP. For yxcE, yxcD we find

>>> q, p = LogisticRegression.calculate(model, [6, -173.143442352])
>>> print("class OP: probability =", p, "class NOP: probability =", q)
class OP: probability = 0.993242163503 class NOP: probability = 0.00675783649744

and for yxiB, yxiA

>>> q, p = LogisticRegression.calculate(model, [309, -271.005880394])
>>> print("class OP: probability =", p, "class NOP: probability =", q)
class OP: probability = 0.000321211251817 class NOP: probability = 0.999678788748

To get some idea of the prediction accuracy of the logistic regression model, we can apply it to the training data:

>>> for i in range(len(ys)):
        print("True:", ys[i], "Predicted:", LogisticRegression.classify(model, xs[i]))
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0

showing that the prediction is correct for all but one of the gene pairs. A more reliable estimate of the prediction accuracy can be found from a leave-one-out analysis, in which the model is recalculated from the training data after removing the gene to be predicted:

>>> for i in range(len(ys)):
        model = LogisticRegression.train(xs[:i]+xs[i+1:], ys[:i]+ys[i+1:])
        print("True:", ys[i], "Predicted:", LogisticRegression.classify(model, xs[i]))
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 1
True: 0 Predicted: 0
True: 0 Predicted: 0

The leave-one-out analysis shows that the prediction of the logistic regression model is incorrect for only two of the gene pairs, which corresponds to a prediction accuracy of 88%.

16.1.4  Logistic Regression, Linear Discriminant Analysis, and Support Vector Machines

The logistic regression model is similar to linear discriminant analysis. In linear discriminant analysis, the class probabilities also follow equations (16.2) and (16.3). However, instead of estimating the coefficients β directly, we first fit a normal distribution to the predictor variables x. The coefficients β are then calculated from the means and covariances of the normal distribution. If the distribution of x is indeed normal, then we expect linear discriminant analysis to perform better than the logistic regression model. The logistic regression model, on the other hand, is more robust to deviations from normality.

Another similar approach is a support vector machine with a linear kernel. Such an SVM also uses a linear combination of the predictors, but estimates the coefficients β from the predictor variables x near the boundary region between the classes. If the logistic regression model (equations (16.2) and (16.3)) is a good description for x away from the boundary region, we expect the logistic regression model to perform better than an SVM with a linear kernel, as it relies on more data. If not, an SVM with a linear kernel may perform better.

Trevor Hastie, Robert Tibshirani, and Jerome Friedman: The Elements of Statistical Learning. Data Mining, Inference, and Prediction. Springer Series in Statistics, 2001. Chapter 4.4.

16.2  k-Nearest Neighbors

16.2.1  Background and purpose

The k-nearest neighbors method is a supervised learning approach that does not need to fit a model to the data. Instead, data points are classified based on the categories of the k nearest neighbors in the training data set.

In Biopython, the k-nearest neighbors method is available in Bio.kNN. To illustrate the use of the k-nearest neighbor method in Biopython, we will use the same operon data set as in section 16.1.

16.2.2  Initializing a k-nearest neighbors model

Using the data in Table 16.1, we create and initialize a k-nearest neighbors model as follows:

>>> from Bio import kNN
>>> k = 3
>>> model = kNN.train(xs, ys, k)

where xs and ys are the same as in Section 16.1.2. Here, k is the number of neighbors k that will be considered for the classification. For classification into two classes, choosing an odd number for k lets you avoid tied votes. The function name train is a bit of a misnomer, since no model training is done: this function simply stores xs, ys, and k in model.

16.2.3  Using a k-nearest neighbors model for classification

To classify new data using the k-nearest neighbors model, we use the classify function. This function takes a data point (x1,x2) and finds the k-nearest neighbors in the training data set xs. The data point (x1, x2) is then classified based on which category (ys) occurs most among the k neighbors.

For the example of the gene pairs yxcE, yxcD and yxiB, yxiA, we find:

>>> x = [6, -173.143442352]
>>> print("yxcE, yxcD:", kNN.classify(model, x))
yxcE, yxcD: 1
>>> x = [309, -271.005880394]
>>> print("yxiB, yxiA:", kNN.classify(model, x))
yxiB, yxiA: 0

In agreement with the logistic regression model, yxcE, yxcD are classified as belonging to the same operon (class OP), while yxiB, yxiA are predicted to belong to different operons.

The classify function lets us specify both a distance function and a weight function as optional arguments. The distance function affects which k neighbors are chosen as the nearest neighbors, as these are defined as the neighbors with the smallest distance to the query point (x, y). By default, the Euclidean distance is used. Instead, we could for example use the city-block (Manhattan) distance:

>>> def cityblock(x1, x2):
...    assert len(x1)==2
...    assert len(x2)==2
...    distance = abs(x1[0]-x2[0]) + abs(x1[1]-x2[1])
...    return distance
... 
>>> x = [6, -173.143442352]
>>> print("yxcE, yxcD:", kNN.classify(model, x, distance_fn = cityblock))
yxcE, yxcD: 1

The weight function can be used for weighted voting. For example, we may want to give closer neighbors a higher weight than neighbors that are further away:

>>> def weight(x1, x2):
...    assert len(x1)==2
...    assert len(x2)==2
...    return exp(-abs(x1[0]-x2[0]) - abs(x1[1]-x2[1]))
... 
>>> x = [6, -173.143442352]
>>> print("yxcE, yxcD:", kNN.classify(model, x, weight_fn = weight))
yxcE, yxcD: 1

By default, all neighbors are given an equal weight.

To find out how confident we can be in these predictions, we can call the calculate function, which will calculate the total weight assigned to the classes OP and NOP. For the default weighting scheme, this reduces to the number of neighbors in each category. For yxcE, yxcD, we find

>>> x = [6, -173.143442352]
>>> weight = kNN.calculate(model, x)
>>> print("class OP: weight =", weight[0], "class NOP: weight =", weight[1])
class OP: weight = 0.0 class NOP: weight = 3.0

which means that all three neighbors of x1, x2 are in the NOP class. As another example, for yesK, yesL we find

>>> x = [117, -267.14]
>>> weight = kNN.calculate(model, x)
>>> print("class OP: weight =", weight[0], "class NOP: weight =", weight[1])
class OP: weight = 2.0 class NOP: weight = 1.0

which means that two neighbors are operon pairs and one neighbor is a non-operon pair.

To get some idea of the prediction accuracy of the k-nearest neighbors approach, we can apply it to the training data:

>>> for i in range(len(ys)):
        print("True:", ys[i], "Predicted:", kNN.classify(model, xs[i]))
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0

showing that the prediction is correct for all but two of the gene pairs. A more reliable estimate of the prediction accuracy can be found from a leave-one-out analysis, in which the model is recalculated from the training data after removing the gene to be predicted:

>>> for i in range(len(ys)):
        model = kNN.train(xs[:i]+xs[i+1:], ys[:i]+ys[i+1:])
        print("True:", ys[i], "Predicted:", kNN.classify(model, xs[i]))
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 1
True: 1 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 1
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 0
True: 0 Predicted: 1

The leave-one-out analysis shows that k-nearest neighbors model is correct for 13 out of 17 gene pairs, which corresponds to a prediction accuracy of 76%.

16.3  Naïve Bayes

This section will describe the Bio.NaiveBayes module.

16.4  Maximum Entropy

This section will describe the Bio.MaximumEntropy module.

16.5  Markov Models

This section will describe the Bio.MarkovModel and/or Bio.HMM.MarkovModel modules.

Chapter 17  Graphics including GenomeDiagram

The Bio.Graphics module depends on the third party Python library ReportLab. Although focused on producing PDF files, ReportLab can also create encapsulated postscript (EPS) and (SVG) files. In addition to these vector based images, provided certain further dependencies such as the Python Imaging Library (PIL) are installed, ReportLab can also output bitmap images (including JPEG, PNG, GIF, BMP and PICT formats).

17.1  GenomeDiagram

17.1.1  Introduction

The Bio.Graphics.GenomeDiagram module was added to Biopython 1.50, having previously been available as a separate Python module dependent on Biopython. GenomeDiagram is described in the Bioinformatics journal publication by Pritchard et al. (2006) [2], which includes some examples images. There is a PDF copy of the old manual here, http://biopython.org/DIST/docs/GenomeDiagram/userguide.pdf which has some more examples.

As the name might suggest, GenomeDiagram was designed for drawing whole genomes, in particular prokaryotic genomes, either as linear diagrams (optionally broken up into fragments to fit better) or as circular wheel diagrams. Have a look at Figure 2 in Toth et al. (2006) [3] for a good example. It proved also well suited to drawing quite detailed figures for smaller genomes such as phage, plasmids or mitochrondia, for example see Figures 1 and 2 in Van der Auwera et al. (2009) [4] (shown with additional manual editing).

This module is easiest to use if you have your genome loaded as a SeqRecord object containing lots of SeqFeature objects - for example as loaded from a GenBank file (see Chapters 4 and 5).

17.1.2  Diagrams, tracks, feature-sets and features

GenomeDiagram uses a nested set of objects. At the top level, you have a diagram object representing a sequence (or sequence region) along the horizontal axis (or circle). A diagram can contain one or more tracks, shown stacked vertically (or radially on circular diagrams). These will typically all have the same length and represent the same sequence region. You might use one track to show the gene locations, another to show regulatory regions, and a third track to show the GC percentage.

The most commonly used type of track will contain features, bundled together in feature-sets. You might choose to use one feature-set for all your CDS features, and another for tRNA features. This isn’t required - they can all go in the same feature-set, but it makes it easier to update the properties of just selected features (e.g. make all the tRNA features red).

There are two main ways to build up a complete diagram. Firstly, the top down approach where you create a diagram object, and then using its methods add track(s), and use the track methods to add feature-set(s), and use their methods to add the features. Secondly, you can create the individual objects separately (in whatever order suits your code), and then combine them.

17.1.3  A top down example

We’re going to draw a whole genome from a SeqRecord object read in from a GenBank file (see Chapter 5). This example uses the pPCP1 plasmid from Yersinia pestis biovar Microtus, the file is included with the Biopython unit tests under the GenBank folder, or online NC_005816.gb from our website.

from reportlab.lib import colors
from reportlab.lib.units import cm
from Bio.Graphics import GenomeDiagram
from Bio import SeqIO
record = SeqIO.read("NC_005816.gb", "genbank")

We’re using a top down approach, so after loading in our sequence we next create an empty diagram, then add an (empty) track, and to that add an (empty) feature set:

gd_diagram = GenomeDiagram.Diagram("Yersinia pestis biovar Microtus plasmid pPCP1")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()

Now the fun part - we take each gene SeqFeature object in our SeqRecord, and use it to generate a feature on the diagram. We’re going to color them blue, alternating between a dark blue and a light blue.

for feature in record.features:
    if feature.type != "gene":
        #Exclude this feature
        continue
    if len(gd_feature_set) % 2 == 0:
        color = colors.blue
    else:
        color = colors.lightblue
    gd_feature_set.add_feature(feature, color=color, label=True)

Now we come to actually making the output file. This happens in two steps, first we call the draw method, which creates all the shapes using ReportLab objects. Then we call the write method which renders these to the requested file format. Note you can output in multiple file formats:

gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=4, start=0, end=len(record))
gd_diagram.write("plasmid_linear.pdf", "PDF")
gd_diagram.write("plasmid_linear.eps", "EPS")
gd_diagram.write("plasmid_linear.svg", "SVG")

Also, provided you have the dependencies installed, you can also do bitmaps, for example:

gd_diagram.write("plasmid_linear.png", "PNG")

Notice that the fragments argument which we set to four controls how many pieces the genome gets broken up into.

If you want to do a circular figure, then try this:

gd_diagram.draw(format="circular", circular=True, pagesize=(20*cm,20*cm),
                start=0, end=len(record), circle_core=0.7)
gd_diagram.write("plasmid_circular.pdf", "PDF")

These figures are not very exciting, but we’ve only just got started.

17.1.4  A bottom up example

Now let’s produce exactly the same figures, but using the bottom up approach. This means we create the different objects directly (and this can be done in almost any order) and then combine them.

from reportlab.lib import colors
from reportlab.lib.units import cm
from Bio.Graphics import GenomeDiagram
from Bio import SeqIO
record = SeqIO.read("NC_005816.gb", "genbank")

#Create the feature set and its feature objects,
gd_feature_set = GenomeDiagram.FeatureSet()
for feature in record.features:
    if feature.type != "gene":
        #Exclude this feature
        continue
    if len(gd_feature_set) % 2 == 0:
        color = colors.blue
    else:
        color = colors.lightblue
    gd_feature_set.add_feature(feature, color=color, label=True)
#(this for loop is the same as in the previous example)

#Create a track, and a diagram
gd_track_for_features = GenomeDiagram.Track(name="Annotated Features")
gd_diagram = GenomeDiagram.Diagram("Yersinia pestis biovar Microtus plasmid pPCP1")

#Now have to glue the bits together...
gd_track_for_features.add_set(gd_feature_set)
gd_diagram.add_track(gd_track_for_features, 1)

You can now call the draw and write methods as before to produce a linear or circular diagram, using the code at the end of the top-down example above. The figures should be identical.

17.1.5  Features without a SeqFeature

In the above example we used a SeqRecord’s SeqFeature objects to build our diagram (see also Section 4.3). Sometimes you won’t have SeqFeature objects, but just the coordinates for a feature you want to draw. You have to create minimal SeqFeature object, but this is easy:

from Bio.SeqFeature import SeqFeature, FeatureLocation
my_seq_feature = SeqFeature(FeatureLocation(50,100),strand=+1)

For strand, use +1 for the forward strand, -1 for the reverse strand, and None for both. Here is a short self contained example:

from Bio.SeqFeature import SeqFeature, FeatureLocation
from Bio.Graphics import GenomeDiagram
from reportlab.lib.units import cm

gdd = GenomeDiagram.Diagram('Test Diagram')
gdt_features = gdd.new_track(1, greytrack=False)
gds_features = gdt_features.new_set()

#Add three features to show the strand options,
feature = SeqFeature(FeatureLocation(25, 125), strand=+1)
gds_features.add_feature(feature, name="Forward", label=True)
feature = SeqFeature(FeatureLocation(150, 250), strand=None)
gds_features.add_feature(feature, name="Strandless", label=True)
feature = SeqFeature(FeatureLocation(275, 375), strand=-1)
gds_features.add_feature(feature, name="Reverse", label=True)

gdd.draw(format='linear', pagesize=(15*cm,4*cm), fragments=1,
         start=0, end=400)
gdd.write("GD_labels_default.pdf", "pdf")

The top part of the image in the next subsection shows the output (in the default feature color, pale green).

Notice that we have used the name argument here to specify the caption text for these features. This is discussed in more detail next.

17.1.6  Feature captions

Recall we used the following (where feature was a SeqFeature object) to add a feature to the diagram:

gd_feature_set.add_feature(feature, color=color, label=True)

In the example above the SeqFeature annotation was used to pick a sensible caption for the features. By default the following possible entries under the SeqFeature object’s qualifiers dictionary are used: gene, label, name, locus_tag, and product. More simply, you can specify a name directly:

gd_feature_set.add_feature(feature, color=color, label=True, name="My Gene")

In addition to the caption text for each feature’s label, you can also choose the font, position (this defaults to the start of the sigil, you can also choose the middle or at the end) and orientation (for linear diagrams only, where this defaults to rotated by 45 degrees):

#Large font, parallel with the track
gd_feature_set.add_feature(feature, label=True, color="green",
                           label_size=25, label_angle=0)

#Very small font, perpendicular to the track (towards it)
gd_feature_set.add_feature(feature, label=True, color="purple",
                           label_position="end",
                           label_size=4, label_angle=90)

#Small font, perpendicular to the track (away from it)
gd_feature_set.add_feature(feature, label=True, color="blue",
                           label_position="middle",
                           label_size=6, label_angle=-90)

Combining each of these three fragments with the complete example in the previous section should give something like this:

We’ve not shown it here, but you can also set label_color to control the label’s color (used in Section 17.1.9).

You’ll notice the default font is quite small - this makes sense because you will usually be drawing many (small) features on a page, not just a few large ones as shown here.

17.1.7  Feature sigils

The examples above have all just used the default sigil for the feature, a plain box, which was all that was available in the last publicly released standalone version of GenomeDiagram. Arrow sigils were included when GenomeDiagram was added to Biopython 1.50:

#Default uses a BOX sigil
gd_feature_set.add_feature(feature)

#You can make this explicit:
gd_feature_set.add_feature(feature, sigil="BOX")

#Or opt for an arrow:
gd_feature_set.add_feature(feature, sigil="ARROW")

Biopython 1.61 added three more sigils,

#Box with corners cut off (making it an octagon)
gd_feature_set.add_feature(feature, sigil="OCTO")

#Box with jagged edges (useful for showing breaks in contains)
gd_feature_set.add_feature(feature, sigil="JAGGY")

#Arrow which spans the axis with strand used only for direction
gd_feature_set.add_feature(feature, sigil="BIGARROW")

These are shown below. Most sigils fit into a bounding box (as given by the default BOX sigil), either above or below the axis for the forward or reverse strand, or straddling it (double the height) for strand-less features. The BIGARROW sigil is different, always straddling the axis with the direction taken from the feature’s stand.

17.1.8  Arrow sigils

We introduced the arrow sigils in the previous section. There are two additional options to adjust the shapes of the arrows, firstly the thickness of the arrow shaft, given as a proportion of the height of the bounding box:

#Full height shafts, giving pointed boxes:
gd_feature_set.add_feature(feature, sigil="ARROW", color="brown",
                           arrowshaft_height=1.0)
#Or, thin shafts:                      
gd_feature_set.add_feature(feature, sigil="ARROW", color="teal",
                           arrowshaft_height=0.2)
#Or, very thin shafts:
gd_feature_set.add_feature(feature, sigil="ARROW", color="darkgreen",
                           arrowshaft_height=0.1)

The results are shown below:

Secondly, the length of the arrow head - given as a proportion of the height of the bounding box (defaulting to 0.5, or 50%):

#Short arrow heads:
gd_feature_set.add_feature(feature, sigil="ARROW", color="blue",
                           arrowhead_length=0.25)
#Or, longer arrow heads:
gd_feature_set.add_feature(feature, sigil="ARROW", color="orange",
                           arrowhead_length=1)
#Or, very very long arrow heads (i.e. all head, no shaft, so triangles):
gd_feature_set.add_feature(feature, sigil="ARROW", color="red",
                           arrowhead_length=10000)

The results are shown below:

Biopython 1.61 adds a new BIGARROW sigil which always stradles the axis, pointing left for the reverse strand or right otherwise:

#A large arrow straddling the axis:
gd_feature_set.add_feature(feature, sigil="BIGARROW")

All the shaft and arrow head options shown above for the ARROW sigil can be used for the BIGARROW sigil too.

17.1.9  A nice example

Now let’s return to the pPCP1 plasmid from Yersinia pestis biovar Microtus, and the top down approach used in Section 17.1.3, but take advantage of the sigil options we’ve now discussed. This time we’ll use arrows for the genes, and overlay them with strand-less features (as plain boxes) showing the position of some restriction digest sites.

from reportlab.lib import colors
from reportlab.lib.units import cm
from Bio.Graphics import GenomeDiagram
from Bio import SeqIO
from Bio.SeqFeature import SeqFeature, FeatureLocation

record = SeqIO.read("NC_005816.gb", "genbank")

gd_diagram = GenomeDiagram.Diagram(record.id)
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()

for feature in record.features:
    if feature.type != "gene":
        #Exclude this feature
        continue
    if len(gd_feature_set) % 2 == 0:
        color = colors.blue
    else:
        color = colors.lightblue
    gd_feature_set.add_feature(feature, sigil="ARROW",
                               color=color, label=True,
                               label_size = 14, label_angle=0)

#I want to include some strandless features, so for an example
#will use EcoRI recognition sites etc.
for site, name, color in [("GAATTC","EcoRI",colors.green),
                          ("CCCGGG","SmaI",colors.orange),
                          ("AAGCTT","HindIII",colors.red),
                          ("GGATCC","BamHI",colors.purple)]:
    index = 0
    while True:
        index  = record.seq.find(site, start=index)
        if index == -1 : break
        feature = SeqFeature(FeatureLocation(index, index+len(site)))
        gd_feature_set.add_feature(feature, color=color, name=name,
                                   label=True, label_size = 10,
                                   label_color=color)
        index += len(site)

gd_diagram.draw(format="linear", pagesize='A4', fragments=4,
                start=0, end=len(record))
gd_diagram.write("plasmid_linear_nice.pdf", "PDF")
gd_diagram.write("plasmid_linear_nice.eps", "EPS")
gd_diagram.write("plasmid_linear_nice.svg", "SVG")

gd_diagram.draw(format="circular", circular=True, pagesize=(20*cm,20*cm),
                start=0, end=len(record), circle_core = 0.5)
gd_diagram.write("plasmid_circular_nice.pdf", "PDF")
gd_diagram.write("plasmid_circular_nice.eps", "EPS")
gd_diagram.write("plasmid_circular_nice.svg", "SVG")

And the output:

17.1.10  Multiple tracks

All the examples so far have used a single track, but you can have more than one track – for example show the genes on one, and repeat regions on another. In this example we’re going to show three phage genomes side by side to scale, inspired by Figure 6 in Proux et al. (2002) [5]. We’ll need the GenBank files for the following three phage:

  • NC_002703 – Lactococcus phage Tuc2009, complete genome (38347 bp)
  • AF323668 – Bacteriophage bIL285, complete genome (35538 bp)
  • NC_003212Listeria innocua Clip11262, complete genome, of which we are focussing only on integrated prophage 5 (similar length).

You can download these using Entrez if you like, see Section 9.6 for more details. For the third record we’ve worked out where the phage is integrated into the genome, and slice the record to extract it (with the features preserved, see Section 4.6), and must also reverse complement to match the orientation of the first two phage (again preserving the features, see Section 4.8):

from Bio import SeqIO

A_rec = SeqIO.read("NC_002703.gbk", "gb")
B_rec = SeqIO.read("AF323668.gbk", "gb")
C_rec = SeqIO.read("NC_003212.gbk", "gb")[2587879:2625807].reverse_complement(name=True)

The figure we are imitating used different colors for different gene functions. One way to do this is to edit the GenBank file to record color preferences for each feature - something Sanger’s Artemis editor does, and which GenomeDiagram should understand. Here however, we’ll just hard code three lists of colors.

Note that the annotation in the GenBank files doesn’t exactly match that shown in Proux et al., they have drawn some unannotated genes.

from reportlab.lib.colors import red, grey, orange, green, brown, blue, lightblue, purple

A_colors = [red]*5 + [grey]*7 + [orange]*2 + [grey]*2 + [orange] + [grey]*11 + [green]*4 \
         + [grey] + [green]*2 + [grey, green] + [brown]*5 + [blue]*4 + [lightblue]*5 \
         + [grey, lightblue] + [purple]*2 + [grey]
B_colors = [red]*6 + [grey]*8 + [orange]*2 + [grey] + [orange] + [grey]*21 + [green]*5 \
         + [grey] + [brown]*4 + [blue]*3 + [lightblue]*3 + [grey]*5 + [purple]*2
C_colors = [grey]*30 + [green]*5 + [brown]*4 + [blue]*2 + [grey, blue] + [lightblue]*2 \
         + [grey]*5

Now to draw them – this time we add three tracks to the diagram, and also notice they are given different start/end values to reflect their different lengths (this requires Biopython 1.59 or later).

from Bio.Graphics import GenomeDiagram

name = "Proux Fig 6"
gd_diagram = GenomeDiagram.Diagram(name)
max_len = 0
for record, gene_colors in zip([A_rec, B_rec, C_rec], [A_colors, B_colors, C_colors]):
    max_len = max(max_len, len(record))
    gd_track_for_features = gd_diagram.new_track(1,
                            name=record.name,
                            greytrack=True,
                            start=0, end=len(record))
    gd_feature_set = gd_track_for_features.new_set()

    i = 0
    for feature in record.features:
        if feature.type != "gene":
            #Exclude this feature                                                                                                   
            continue
        gd_feature_set.add_feature(feature, sigil="ARROW",
                                   color=gene_colors[i], label=True,
                                   name = str(i+1),
                                   label_position="start",
                                   label_size = 6, label_angle=0)
        i+=1

gd_diagram.draw(format="linear", pagesize='A4', fragments=1,
                start=0, end=max_len)
gd_diagram.write(name + ".pdf", "PDF")
gd_diagram.write(name + ".eps", "EPS")
gd_diagram.write(name + ".svg", "SVG")

The result:

I did wonder why in the original manuscript there were no red or orange genes marked in the bottom phage. Another important point is here the phage are shown with different lengths - this is because they are all drawn to the same scale (they are different lengths).

The key difference from the published figure is they have color-coded links between similar proteins – which is what we will do in the next section.

17.1.11  Cross-Links between tracks

Biopython 1.59 added the ability to draw cross links between tracks - both simple linear diagrams as we will show here, but also linear diagrams split into fragments and circular diagrams.

Continuing the example from the previous section inspired by Figure 6 from Proux et al. 2002 [5], we would need a list of cross links between pairs of genes, along with a score or color to use. Realistically you might extract this from a BLAST file computationally, but here I have manually typed them in.

My naming convention continues to refer to the three phage as A, B and C. Here are the links we want to show between A and B, given as a list of tuples (percentage similarity score, gene in A, gene in B).

#Tuc2009 (NC_002703) vs bIL285 (AF323668)
A_vs_B = [
    (99, "Tuc2009_01", "int"),
    (33, "Tuc2009_03", "orf4"),
    (94, "Tuc2009_05", "orf6"),
    (100,"Tuc2009_06", "orf7"),
    (97, "Tuc2009_07", "orf8"),
    (98, "Tuc2009_08", "orf9"),
    (98, "Tuc2009_09", "orf10"),
    (100,"Tuc2009_10", "orf12"),
    (100,"Tuc2009_11", "orf13"),
    (94, "Tuc2009_12", "orf14"),
    (87, "Tuc2009_13", "orf15"),
    (94, "Tuc2009_14", "orf16"),
    (94, "Tuc2009_15", "orf17"),
    (88, "Tuc2009_17", "rusA"),
    (91, "Tuc2009_18", "orf20"),
    (93, "Tuc2009_19", "orf22"),
    (71, "Tuc2009_20", "orf23"),
    (51, "Tuc2009_22", "orf27"),
    (97, "Tuc2009_23", "orf28"),
    (88, "Tuc2009_24", "orf29"),
    (26, "Tuc2009_26", "orf38"),
    (19, "Tuc2009_46", "orf52"),
    (77, "Tuc2009_48", "orf54"),
    (91, "Tuc2009_49", "orf55"),
    (95, "Tuc2009_52", "orf60"), 
]

Likewise for B and C:

#bIL285 (AF323668) vs Listeria innocua prophage 5 (in NC_003212)
B_vs_C = [
    (42, "orf39", "lin2581"),
    (31, "orf40", "lin2580"),
    (49, "orf41", "lin2579"), #terL
    (54, "orf42", "lin2578"), #portal
    (55, "orf43", "lin2577"), #protease
    (33, "orf44", "lin2576"), #mhp
    (51, "orf46", "lin2575"),
    (33, "orf47", "lin2574"),
    (40, "orf48", "lin2573"),
    (25, "orf49", "lin2572"),
    (50, "orf50", "lin2571"),
    (48, "orf51", "lin2570"),
    (24, "orf52", "lin2568"),
    (30, "orf53", "lin2567"),
    (28, "orf54", "lin2566"),
]

For the first and last phage these identifiers are locus tags, for the middle phage there are no locus tags so I’ve used gene names instead. The following little helper function lets us lookup a feature using either a locus tag or gene name:

def get_feature(features, id, tags=["locus_tag", "gene"]):
    """Search list of SeqFeature objects for an identifier under the given tags."""
    for f in features:
        for key in tags:
            #tag may not be present in this feature 
            for x in f.qualifiers.get(key, []):
                if x == id:
                     return f
    raise KeyError(id)

We can now turn those list of identifier pairs into SeqFeature pairs, and thus find their location co-ordinates. We can now add all that code and the following snippet to the previous example (just before the gd_diagram.draw(...) line – see the finished example script Proux_et_al_2002_Figure_6.py included in the Doc/examples folder of the Biopython source code) to add cross links to the figure:

from Bio.Graphics.GenomeDiagram import CrossLink
from reportlab.lib import colors
#Note it might have been clearer to assign the track numbers explicitly...                                                          
for rec_X, tn_X, rec_Y, tn_Y, X_vs_Y in [(A_rec, 3, B_rec, 2, A_vs_B),
                                         (B_rec, 2, C_rec, 1, B_vs_C)]:
    track_X = gd_diagram.tracks[tn_X]
    track_Y = gd_diagram.tracks[tn_Y]
    for score, id_X, id_Y in X_vs_Y:
        feature_X = get_feature(rec_X.features, id_X)
        feature_Y = get_feature(rec_Y.features, id_Y)
        color = colors.linearlyInterpolatedColor(colors.white, colors.firebrick, 0, 100, score)
        link_xy = CrossLink((track_X, feature_X.location.start, feature_X.location.end),
                            (track_Y, feature_Y.location.start, feature_Y.location.end),
                            color, colors.lightgrey)
        gd_diagram.cross_track_links.append(link_xy)

There are several important pieces to this code. First the GenomeDiagram object has a cross_track_links attribute which is just a list of CrossLink objects. Each CrossLink object takes two sets of track-specific co-ordinates (here given as tuples, you can alternatively use a GenomeDiagram.Feature object instead). You can optionally supply a colour, border color, and say if this link should be drawn flipped (useful for showing inversions).

You can also see how we turn the BLAST percentage identity score into a colour, interpolating between white (0%) and a dark red (100%). In this example we don’t have any problems with overlapping cross-links. One way to tackle that is to use transparency in ReportLab, by using colors with their alpha channel set. However, this kind of shaded color scheme combined with overlap transparency would be difficult to interpret. The result:

There is still a lot more that can be done within Biopython to help improve this figure. First of all, the cross links in this case are between proteins which are drawn in a strand specific manor. It can help to add a background region (a feature using the ‘BOX’ sigil) on the feature track to extend the cross link. Also, we could reduce the vertical height of the feature tracks to allocate more to the links instead – one way to do that is to allocate space for empty tracks. Furthermore, in cases like this where there are no large gene overlaps, we can use the axis-straddling BIGARROW sigil, which allows us to further reduce the vertical space needed for the track. These improvements are demonstrated in the example script Proux_et_al_2002_Figure_6.py included in the Doc/examples folder of the Biopython source code. The result:

Beyond that, finishing touches you might want to do manually in a vector image editor include fine tuning the placement of gene labels, and adding other custom annotation such as highlighting particular regions.

Although not really necessary in this example since none of the cross-links overlap, using a transparent color in ReportLab is a very useful technique for superimposing multiple links. However, in this case a shaded color scheme should be avoided.

17.1.12  Further options

You can control the tick marks to show the scale – after all every graph should show its units, and the number of the grey-track labels.

Also, we have only used the FeatureSet so far. GenomeDiagram also has a GraphSet which can be used for show line graphs, bar charts and heat plots (e.g. to show plots of GC% on a track parallel to the features).

These options are not covered here yet, so for now we refer you to the User Guide (PDF) included with the standalone version of GenomeDiagram (but please read the next section first), and the docstrings.

17.1.13  Converting old code

If you have old code written using the standalone version of GenomeDiagram, and you want to switch it over to using the new version included with Biopython then you will have to make a few changes - most importantly to your import statements.

Also, the older version of GenomeDiagram used only the UK spellings of color and center (colour and centre). You will need to change to the American spellings, although for several years the Biopython version of GenomeDiagram supported both.

For example, if you used to have:

from GenomeDiagram import GDFeatureSet, GDDiagram
gdd = GDDiagram("An example")
...

you could just switch the import statements like this:

from Bio.Graphics.GenomeDiagram import FeatureSet as GDFeatureSet, Diagram as GDDiagram
gdd = GDDiagram("An example")
...

and hopefully that should be enough. In the long term you might want to switch to the new names, but you would have to change more of your code:

from Bio.Graphics.GenomeDiagram import FeatureSet, Diagram
gdd = Diagram("An example")
...

or:

from Bio.Graphics import GenomeDiagram
gdd = GenomeDiagram.Diagram("An example")
...

If you run into difficulties, please ask on the Biopython mailing list for advice. One catch is that we have not included the old module GenomeDiagram.GDUtilities yet. This included a number of GC% related functions, which will probably be merged under Bio.SeqUtils later on.

17.2  Chromosomes

The Bio.Graphics.BasicChromosome module allows drawing of chromosomes. There is an example in Jupe et al. (2012) [6] (open access) using colors to highlight different gene families.

17.2.1  Simple Chromosomes

Here is a very simple example - for which we’ll use Arabidopsis thaliana.

You can skip this bit, but first I downloaded the five sequenced chromosomes from the NCBI’s FTP site ftp://ftp.ncbi.nlm.nih.gov/genomes/Arabidopsis_thaliana and then parsed them with Bio.SeqIO to find out their lengths. You could use the GenBank files for this, but it is faster to use the FASTA files for the whole chromosomes:

from Bio import SeqIO
entries = [("Chr I", "CHR_I/NC_003070.fna"),
           ("Chr II", "CHR_II/NC_003071.fna"),
           ("Chr III", "CHR_III/NC_003074.fna"),
           ("Chr IV", "CHR_IV/NC_003075.fna"),
           ("Chr V", "CHR_V/NC_003076.fna")]
for (name, filename) in entries:
   record = SeqIO.read(filename,"fasta")
   print(name, len(record))

This gave the lengths of the five chromosomes, which we’ll now use in the following short demonstration of the BasicChromosome module:

from reportlab.lib.units import cm
from Bio.Graphics import BasicChromosome

entries = [("Chr I", 30432563),
           ("Chr II", 19705359),
           ("Chr III", 23470805),
           ("Chr IV", 18585042),
           ("Chr V", 26992728)]

max_len = 30432563 #Could compute this
telomere_length = 1000000 #For illustration
         
chr_diagram = BasicChromosome.Organism()
chr_diagram.page_size = (29.7*cm, 21*cm) #A4 landscape

for name, length in entries:
    cur_chromosome = BasicChromosome.Chromosome(name)
    #Set the scale to the MAXIMUM length plus the two telomeres in bp,
    #want the same scale used on all five chromosomes so they can be
    #compared to each other
    cur_chromosome.scale_num = max_len + 2 * telomere_length

    #Add an opening telomere
    start = BasicChromosome.TelomereSegment()
    start.scale = telomere_length
    cur_chromosome.add(start)

    #Add a body - using bp as the scale length here.
    body = BasicChromosome.ChromosomeSegment()
    body.scale = length
    cur_chromosome.add(body)

    #Add a closing telomere
    end = BasicChromosome.TelomereSegment(inverted=True)
    end.scale = telomere_length
    cur_chromosome.add(end)

    #This chromosome is done
    chr_diagram.add(cur_chromosome)

chr_diagram.draw("simple_chrom.pdf", "Arabidopsis thaliana")

This should create a very simple PDF file, shown here:

This example is deliberately short and sweet. The next example shows the location of features of interest.

17.2.2  Annotated Chromosomes

Continuing from the previous example, let’s also show the tRNA genes. We’ll get their locations by parsing the GenBank files for the five Arabidopsis thaliana chromosomes. You’ll need to download these files from the NCBI FTP site ftp://ftp.ncbi.nlm.nih.gov/genomes/Arabidopsis_thaliana, and preserve the subdirectory names or edit the paths below:

from reportlab.lib.units import cm
from Bio import SeqIO
from Bio.Graphics import BasicChromosome

entries = [("Chr I", "CHR_I/NC_003070.gbk"),
           ("Chr II", "CHR_II/NC_003071.gbk"),
           ("Chr III", "CHR_III/NC_003074.gbk"),
           ("Chr IV", "CHR_IV/NC_003075.gbk"),
           ("Chr V", "CHR_V/NC_003076.gbk")]

max_len = 30432563 #Could compute this
telomere_length = 1000000 #For illustration

chr_diagram = BasicChromosome.Organism()
chr_diagram.page_size = (29.7*cm, 21*cm) #A4 landscape

for index, (name, filename) in enumerate(entries):
    record = SeqIO.read(filename,"genbank")
    length = len(record)
    features = [f for f in record.features if f.type=="tRNA"]
    #Record an Artemis style integer color in the feature's qualifiers,
    #1 = Black, 2 = Red, 3 = Green, 4 = blue, 5 =cyan, 6 = purple 
    for f in features: f.qualifiers["color"] = [index+2]

    cur_chromosome = BasicChromosome.Chromosome(name)
    #Set the scale to the MAXIMUM length plus the two telomeres in bp,
    #want the same scale used on all five chromosomes so they can be
    #compared to each other
    cur_chromosome.scale_num = max_len + 2 * telomere_length

    #Add an opening telomere
    start = BasicChromosome.TelomereSegment()
    start.scale = telomere_length
    cur_chromosome.add(start)

    #Add a body - again using bp as the scale length here.
    body = BasicChromosome.AnnotatedChromosomeSegment(length, features)
    body.scale = length
    cur_chromosome.add(body)

    #Add a closing telomere
    end = BasicChromosome.TelomereSegment(inverted=True)
    end.scale = telomere_length
    cur_chromosome.add(end)

    #This chromosome is done
    chr_diagram.add(cur_chromosome)

chr_diagram.draw("tRNA_chrom.pdf", "Arabidopsis thaliana")

It might warn you about the labels being too close together - have a look at the forward strand (right hand side) of Chr I, but it should create a colorful PDF file, shown here:

Chapter 18  Cookbook – Cool things to do with it

Biopython now has two collections of “cookbook” examples – this chapter (which has been included in this tutorial for many years and has gradually grown), and http://biopython.org/wiki/Category:Cookbook which is a user contributed collection on our wiki.

We’re trying to encourage Biopython users to contribute their own examples to the wiki. In addition to helping the community, one direct benefit of sharing an example like this is that you could also get some feedback on the code from other Biopython users and developers - which could help you improve all your Python code.

In the long term, we may end up moving all of the examples in this chapter to the wiki, or elsewhere within the tutorial.

18.1  Working with sequence files

This section shows some more examples of sequence input/output, using the Bio.SeqIO module described in Chapter 5.

18.1.1  Filtering a sequence file

Often you’ll have a large file with many sequences in it (e.g. FASTA file or genes, or a FASTQ or SFF file of reads), a separate shorter list of the IDs for a subset of sequences of interest, and want to make a new sequence file for this subset.

Let’s say the list of IDs is in a simple text file, as the first word on each line. This could be a tabular file where the first column is the ID. Try something like this:

from Bio import SeqIO
input_file = "big_file.sff"
id_file = "short_list.txt"
output_file = "short_list.sff"
wanted = set(line.rstrip("\n").split(None,1)[0] for line in open(id_file))
print("Found %i unique identifiers in %s" % (len(wanted), id_file))
records = (r for r in SeqIO.parse(input_file, "sff") if r.id in wanted)
count = SeqIO.write(records, output_file, "sff")
print("Saved %i records from %s to %s" % (count, input_file, output_file))
if count < len(wanted):
    print("Warning %i IDs not found in %s" % (len(wanted)-count, input_file))

Note that we use a Python set rather than a list, this makes testing membership faster.

18.1.2  Producing randomised genomes

Let’s suppose you are looking at genome sequence, hunting for some sequence feature – maybe extreme local GC% bias, or possible restriction digest sites. Once you’ve got your Python code working on the real genome it may be sensible to try running the same search on randomised versions of the same genome for statistical analysis (after all, any “features” you’ve found could just be there just by chance).

For this discussion, we’ll use the GenBank file for the pPCP1 plasmid from Yersinia pestis biovar Microtus. The file is included with the Biopython unit tests under the GenBank folder, or you can get it from our website, NC_005816.gb. This file contains one and only one record, so we can read it in as a SeqRecord using the Bio.SeqIO.read() function:

>>> from Bio import SeqIO
>>> original_rec = SeqIO.read("NC_005816.gb", "genbank")

So, how can we generate a shuffled versions of the original sequence? I would use the built in Python random module for this, in particular the function random.shuffle – but this works on a Python list. Our sequence is a Seq object, so in order to shuffle it we need to turn it into a list:

>>> import random
>>> nuc_list = list(original_rec.seq)
>>> random.shuffle(nuc_list) #acts in situ!

Now, in order to use Bio.SeqIO to output the shuffled sequence, we need to construct a new SeqRecord with a new Seq object using this shuffled list. In order to do this, we need to turn the list of nucleotides (single letter strings) into a long string – the standard Python way to do this is with the string object’s join method.

>>> from Bio.Seq import Seq
>>> from Bio.SeqRecord import SeqRecord
>>> shuffled_rec = SeqRecord(Seq("".join(nuc_list), original_rec.seq.alphabet),
...                          id="Shuffled", description="Based on %s" % original_rec.id)

Let’s put all these pieces together to make a complete Python script which generates a single FASTA file containing 30 randomly shuffled versions of the original sequence.

This first version just uses a big for loop and writes out the records one by one (using the SeqRecord’s format method described in Section 5.5.4):

import random
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio import SeqIO

original_rec = SeqIO.read("NC_005816.gb","genbank")

handle = open("shuffled.fasta", "w")
for i in range(30):
    nuc_list = list(original_rec.seq)
    random.shuffle(nuc_list)
    shuffled_rec = SeqRecord(Seq("".join(nuc_list), original_rec.seq.alphabet), \
                             id="Shuffled%i" % (i+1), \
                             description="Based on %s" % original_rec.id)
    handle.write(shuffled_rec.format("fasta"))
handle.close()

Personally I prefer the following version using a function to shuffle the record and a generator expression instead of the for loop:

import random
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio import SeqIO

def make_shuffle_record(record, new_id):
    nuc_list = list(record.seq)
    random.shuffle(nuc_list)
    return SeqRecord(Seq("".join(nuc_list), record.seq.alphabet), \
           id=new_id, description="Based on %s" % original_rec.id)
   
original_rec = SeqIO.read("NC_005816.gb","genbank")
shuffled_recs = (make_shuffle_record(original_rec, "Shuffled%i" % (i+1)) \
                 for i in range(30))
handle = open("shuffled.fasta", "w")
SeqIO.write(shuffled_recs, handle, "fasta")
handle.close()

18.1.3  Translating a FASTA file of CDS entries

Suppose you’ve got an input file of CDS entries for some organism, and you want to generate a new FASTA file containing their protein sequences. i.e. Take each nucleotide sequence from the original file, and translate it. Back in Section 3.9 we saw how to use the Seq object’s translate method, and the optional cds argument which enables correct translation of alternative start codons.

We can combine this with Bio.SeqIO as shown in the reverse complement example in Section 5.5.3. The key point is that for each nucleotide SeqRecord, we need to create a protein SeqRecord - and take care of naming it.

You can write you own function to do this, choosing suitable protein identifiers for your sequences, and the appropriate genetic code. In this example we just use the default table and add a prefix to the identifier:

from Bio.SeqRecord import SeqRecord
def make_protein_record(nuc_record):
    """Returns a new SeqRecord with the translated sequence (default table)."""
    return SeqRecord(seq = nuc_record.seq.translate(cds=True), \
                     id = "trans_" + nuc_record.id, \
                     description = "translation of CDS, using default table")

We can then use this function to turn the input nucleotide records into protein records ready for output. An elegant way and memory efficient way to do this is with a generator expression:

from Bio import SeqIO
proteins = (make_protein_record(nuc_rec) for nuc_rec in \
            SeqIO.parse("coding_sequences.fasta", "fasta"))
SeqIO.write(proteins, "translations.fasta", "fasta")

This should work on any FASTA file of complete coding sequences. If you are working on partial coding sequences, you may prefer to use nuc_record.seq.translate(to_stop=True) in the example above, as this wouldn’t check for a valid start codon etc.

18.1.4  Making the sequences in a FASTA file upper case

Often you’ll get data from collaborators as FASTA files, and sometimes the sequences can be in a mixture of upper and lower case. In some cases this is deliberate (e.g. lower case for poor quality regions), but usually it is not important. You may want to edit the file to make everything consistent (e.g. all upper case), and you can do this easily using the upper() method of the SeqRecord object (added in Biopython 1.55):

from Bio import SeqIO
records = (rec.upper() for rec in SeqIO.parse("mixed.fas", "fasta"))
count = SeqIO.write(records, "upper.fas", "fasta")
print("Converted %i records to upper case" % count)

How does this work? The first line is just importing the Bio.SeqIO module. The second line is the interesting bit – this is a Python generator expression which gives an upper case version of each record parsed from the input file (mixed.fas). In the third line we give this generator expression to the Bio.SeqIO.write() function and it saves the new upper cases records to our output file (upper.fas).

The reason we use a generator expression (rather than a list or list comprehension) is this means only one record is kept in memory at a time. This can be really important if you are dealing with large files with millions of entries.

18.1.5  Sorting a sequence file

Suppose you wanted to sort a sequence file by length (e.g. a set of contigs from an assembly), and you are working with a file format like FASTA or FASTQ which Bio.SeqIO can read, write (and index).

If the file is small enough, you can load it all into memory at once as a list of SeqRecord objects, sort the list, and save it:

from Bio import SeqIO
records = list(SeqIO.parse("ls_orchid.fasta","fasta"))
records.sort(cmp=lambda x,y: cmp(len(x),len(y)))
SeqIO.write(records, "sorted_orchids.fasta", "fasta")

The only clever bit is specifying a comparison function for how to sort the records (here we sort them by length). If you wanted the longest records first, you could flip the comparison or use the reverse argument:

from Bio import SeqIO
records = list(SeqIO.parse("ls_orchid.fasta","fasta"))
records.sort(cmp=lambda x,y: cmp(len(y),len(x)))
SeqIO.write(records, "sorted_orchids.fasta", "fasta")

Now that’s pretty straight forward - but what happens if you have a very large file and you can’t load it all into memory like this? For example, you might have some next-generation sequencing reads to sort by length. This can be solved using the Bio.SeqIO.index() function.

from Bio import SeqIO
#Get the lengths and ids, and sort on length         
len_and_ids = sorted((len(rec), rec.id) for rec in \
                     SeqIO.parse("ls_orchid.fasta","fasta"))
ids = reversed([id for (length, id) in len_and_ids])
del len_and_ids #free this memory
record_index = SeqIO.index("ls_orchid.fasta", "fasta")
records = (record_index[id] for id in ids)
SeqIO.write(records, "sorted.fasta", "fasta")

First we scan through the file once using Bio.SeqIO.parse(), recording the record identifiers and their lengths in a list of tuples. We then sort this list to get them in length order, and discard the lengths. Using this sorted list of identifiers Bio.SeqIO.index() allows us to retrieve the records one by one, and we pass them to Bio.SeqIO.write() for output.

These examples all use Bio.SeqIO to parse the records into SeqRecord objects which are output using Bio.SeqIO.write(). What if you want to sort a file format which Bio.SeqIO.write() doesn’t support, like the plain text SwissProt format? Here is an alternative solution using the get_raw() method added to Bio.SeqIO.index() in Biopython 1.54 (see Section 5.4.2.2).

from Bio import SeqIO
#Get the lengths and ids, and sort on length         
len_and_ids = sorted((len(rec), rec.id) for rec in \
                     SeqIO.parse("ls_orchid.fasta","fasta"))
ids = reversed([id for (length, id) in len_and_ids])
del len_and_ids #free this memory
record_index = SeqIO.index("ls_orchid.fasta", "fasta")
handle = open("sorted.fasta", "w")
for id in ids:
    handle.write(record_index.get_raw(id))
handle.close()

As a bonus, because it doesn’t parse the data into SeqRecord objects a second time it should be faster.

18.1.6  Simple quality filtering for FASTQ files

The FASTQ file format was introduced at Sanger and is now widely used for holding nucleotide sequencing reads together with their quality scores. FASTQ files (and the related QUAL files) are an excellent example of per-letter-annotation, because for each nucleotide in the sequence there is an associated quality score. Any per-letter-annotation is held in a SeqRecord in the letter_annotations dictionary as a list, tuple or string (with the same number of elements as the sequence length).

One common task is taking a large set of sequencing reads and filtering them (or cropping them) based on their quality scores. The following example is very simplistic, but should illustrate the basics of working with quality data in a SeqRecord object. All we are going to do here is read in a file of FASTQ data, and filter it to pick out only those records whose PHRED quality scores are all above some threshold (here 20).

For this example we’ll use some real data downloaded from the ENA sequence read archive, ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz (2MB) which unzips to a 19MB file SRR020192.fastq. This is some Roche 454 GS FLX single end data from virus infected California sea lions (see http://www.ebi.ac.uk/ena/data/view/SRS004476 for details).

First, let’s count the reads:

from Bio import SeqIO
count = 0
for rec in SeqIO.parse("SRR020192.fastq", "fastq"):
    count += 1
print("%i reads" % count)

Now let’s do a simple filtering for a minimum PHRED quality of 20:

from Bio import SeqIO
good_reads = (rec for rec in \
              SeqIO.parse("SRR020192.fastq", "fastq") \
              if min(rec.letter_annotations["phred_quality"]) >= 20)
count = SeqIO.write(good_reads, "good_quality.fastq", "fastq")
print("Saved %i reads" % count)

This pulled out only 14580 reads out of the 41892 present. A more sensible thing to do would be to quality trim the reads, but this is intended as an example only.

FASTQ files can contain millions of entries, so it is best to avoid loading them all into memory at once. This example uses a generator expression, which means only one SeqRecord is created at a time - avoiding any memory limitations.

18.1.7  Trimming off primer sequences

For this example we’re going to pretend that GATGACGGTGT is a 5’ primer sequence we want to look for in some FASTQ formatted read data. As in the example above, we’ll use the SRR020192.fastq file downloaded from the ENA (ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz). The same approach would work with any other supported file format (e.g. FASTA files).

This code uses Bio.SeqIO with a generator expression (to avoid loading all the sequences into memory at once), and the Seq object’s startswith method to see if the read starts with the primer sequence:

from Bio import SeqIO
primer_reads = (rec for rec in \
                SeqIO.parse("SRR020192.fastq", "fastq") \
                if rec.seq.startswith("GATGACGGTGT"))
count = SeqIO.write(primer_reads, "with_primer.fastq", "fastq")
print("Saved %i reads" % count)

That should find 13819 reads from SRR014849.fastq and save them to a new FASTQ file, with_primer.fastq.

Now suppose that instead you wanted to make a FASTQ file containing these reads but with the primer sequence removed? That’s just a small change as we can slice the SeqRecord (see Section 4.6) to remove the first eleven letters (the length of our primer):

from Bio import SeqIO
trimmed_primer_reads = (rec[11:] for rec in \
                        SeqIO.parse("SRR020192.fastq", "fastq") \
                        if rec.seq.startswith("GATGACGGTGT"))
count = SeqIO.write(trimmed_primer_reads, "with_primer_trimmed.fastq", "fastq")
print("Saved %i reads" % count)

Again, that should pull out the 13819 reads from SRR020192.fastq, but this time strip off the first ten characters, and save them to another new FASTQ file, with_primer_trimmed.fastq.

Finally, suppose you want to create a new FASTQ file where these reads have their primer removed, but all the other reads are kept as they were? If we want to still use a generator expression, it is probably clearest to define our own trim function:

from Bio import SeqIO
def trim_primer(record, primer):
    if record.seq.startswith(primer):
        return record[len(primer):]
    else:
        return record

trimmed_reads = (trim_primer(record, "GATGACGGTGT") for record in \
                 SeqIO.parse("SRR020192.fastq", "fastq"))
count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq")
print("Saved %i reads" % count)

This takes longer, as this time the output file contains all 41892 reads. Again, we’re used a generator expression to avoid any memory problems. You could alternatively use a generator function rather than a generator expression.

from Bio import SeqIO
def trim_primers(records, primer):
    """Removes perfect primer sequences at start of reads.
    
    This is a generator function, the records argument should
    be a list or iterator returning SeqRecord objects.
    """
    len_primer = len(primer) #cache this for later
    for record in records:
        if record.seq.startswith(primer):
            yield record[len_primer:]
        else:
            yield record

original_reads = SeqIO.parse("SRR020192.fastq", "fastq")
trimmed_reads = trim_primers(original_reads, "GATGACGGTGT")
count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") 
print("Saved %i reads" % count)

This form is more flexible if you want to do something more complicated where only some of the records are retained – as shown in the next example.

18.1.8  Trimming off adaptor sequences

This is essentially a simple extension to the previous example. We are going to going to pretend GATGACGGTGT is an adaptor sequence in some FASTQ formatted read data, again the SRR020192.fastq file from the NCBI (ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz).

This time however, we will look for the sequence anywhere in the reads, not just at the very beginning:

from Bio import SeqIO

def trim_adaptors(records, adaptor):
    """Trims perfect adaptor sequences.
    
    This is a generator function, the records argument should
    be a list or iterator returning SeqRecord objects.
    """
    len_adaptor = len(adaptor) #cache this for later
    for record in records:
        index = record.seq.find(adaptor)
        if index == -1:
            #adaptor not found, so won't trim
            yield record
        else:
            #trim off the adaptor
            yield record[index+len_adaptor:]

original_reads = SeqIO.parse("SRR020192.fastq", "fastq")
trimmed_reads = trim_adaptors(original_reads, "GATGACGGTGT")
count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") 
print("Saved %i reads" % count)

Because we are using a FASTQ input file in this example, the SeqRecord objects have per-letter-annotation for the quality scores. By slicing the SeqRecord object the appropriate scores are used on the trimmed records, so we can output them as a FASTQ file too.

Compared to the output of the previous example where we only looked for a primer/adaptor at the start of each read, you may find some of the trimmed reads are quite short after trimming (e.g. if the adaptor was found in the middle rather than near the start). So, let’s add a minimum length requirement as well:

from Bio import SeqIO

def trim_adaptors(records, adaptor, min_len):
    """Trims perfect adaptor sequences, checks read length.
    
    This is a generator function, the records argument should
    be a list or iterator returning SeqRecord objects.
    """
    len_adaptor = len(adaptor) #cache this for later
    for record in records:
        len_record = len(record) #cache this for later
        if len(record) < min_len:
           #Too short to keep
           continue
        index = record.seq.find(adaptor)
        if index == -1:
            #adaptor not found, so won't trim
            yield record
        elif len_record - index - len_adaptor >= min_len:
            #after trimming this will still be long enough
            yield record[index+len_adaptor:]

original_reads = SeqIO.parse("SRR020192.fastq", "fastq")
trimmed_reads = trim_adaptors(original_reads, "GATGACGGTGT", 100)
count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") 
print("Saved %i reads" % count)

By changing the format names, you could apply this to FASTA files instead. This code also could be extended to do a fuzzy match instead of an exact match (maybe using a pairwise alignment, or taking into account the read quality scores), but that will be much slower.

18.1.9  Converting FASTQ files

Back in Section 5.5.2 we showed how to use Bio.SeqIO to convert between two file formats. Here we’ll go into a little more detail regarding FASTQ files which are used in second generation DNA sequencing. Please refer to Cock et al. (2009) [7] for a longer description. FASTQ files store both the DNA sequence (as a string) and the associated read qualities.

PHRED scores (used in most FASTQ files, and also in QUAL files, ACE files and SFF files) have become a de facto standard for representing the probability of a sequencing error (here denoted by Pe) at a given base using a simple base ten log transformation:

QPHRED = − 10 × log10 ( Pe )     (18.1)

This means a wrong read (Pe = 1) gets a PHRED quality of 0, while a very good read like Pe = 0.00001 gets a PHRED quality of 50. While for raw sequencing data qualities higher than this are rare, with post processing such as read mapping or assembly, qualities of up to about 90 are possible (indeed, the MAQ tool allows for PHRED scores in the range 0 to 93 inclusive).

The FASTQ format has the potential to become a de facto standard for storing the letters and quality scores for a sequencing read in a single plain text file. The only fly in the ointment is that there are at least three versions of the FASTQ format which are incompatible and difficult to distinguish...

  1. The original Sanger FASTQ format uses PHRED qualities encoded with an ASCII offset of 33. The NCBI are using this format in their Short Read Archive. We call this the fastq (or fastq-sanger) format in Bio.SeqIO.
  2. Solexa (later bought by Illumina) introduced their own version using Solexa qualities encoded with an ASCII offset of 64. We call this the fastq-solexa format.
  3. Illumina pipeline 1.3 onwards produces FASTQ files with PHRED qualities (which is more consistent), but encoded with an ASCII offset of 64. We call this the fastq-illumina format.

The Solexa quality scores are defined using a different log transformation:

QSolexa = − 10 × log10 


Pe
1−Pe
 


    (18.2)

Given Solexa/Illumina have now moved to using PHRED scores in version 1.3 of their pipeline, the Solexa quality scores will gradually fall out of use. If you equate the error estimates (Pe) these two equations allow conversion between the two scoring systems - and Biopython includes functions to do this in the Bio.SeqIO.QualityIO module, which are called if you use Bio.SeqIO to convert an old Solexa/Illumina file into a standard Sanger FASTQ file:

from Bio import SeqIO
SeqIO.convert("solexa.fastq", "fastq-solexa", "standard.fastq", "fastq")

If you want to convert a new Illumina 1.3+ FASTQ file, all that gets changed is the ASCII offset because although encoded differently the scores are all PHRED qualities:

from Bio import SeqIO
SeqIO.convert("illumina.fastq", "fastq-illumina", "standard.fastq", "fastq")

Note that using Bio.SeqIO.convert() like this is much faster than combining Bio.SeqIO.parse() and Bio.SeqIO.write() because optimised code is used for converting between FASTQ variants (and also for FASTQ to FASTA conversion).

For good quality reads, PHRED and Solexa scores are approximately equal, which means since both the fasta-solexa and fastq-illumina formats use an ASCII offset of 64 the files are almost the same. This was a deliberate design choice by Illumina, meaning applications expecting the old fasta-solexa style files will probably be OK using the newer fastq-illumina files (on good data). Of course, both variants are very different from the original FASTQ standard as used by Sanger, the NCBI, and elsewhere (format name fastq or fastq-sanger).

For more details, see the built in help (also online):

>>> from Bio.SeqIO import QualityIO
>>> help(QualityIO)
...

18.1.10  Converting FASTA and QUAL files into FASTQ files

FASTQ files hold both sequences and their quality strings. FASTA files hold just sequences, while QUAL files hold just the qualities. Therefore a single FASTQ file can be converted to or from paired FASTA and QUAL files.

Going from FASTQ to FASTA is easy:

from Bio import SeqIO
SeqIO.convert("example.fastq", "fastq", "example.fasta", "fasta")

Going from FASTQ to QUAL is also easy:

from Bio import SeqIO
SeqIO.convert("example.fastq", "fastq", "example.qual", "qual")

However, the reverse is a little more tricky. You can use Bio.SeqIO.parse() to iterate over the records in a single file, but in this case we have two input files. There are several strategies possible, but assuming that the two files are really paired the most memory efficient way is to loop over both together. The code is a little fiddly, so we provide a function called PairedFastaQualIterator in the Bio.SeqIO.QualityIO module to do this. This takes two handles (the FASTA file and the QUAL file) and returns a SeqRecord iterator:

from Bio.SeqIO.QualityIO import PairedFastaQualIterator
for record in PairedFastaQualIterator(open("example.fasta"), open("example.qual")):
   print(record)

This function will check that the FASTA and QUAL files are consistent (e.g. the records are in the same order, and have the same sequence length). You can combine this with the Bio.SeqIO.write() function to convert a pair of FASTA and QUAL files into a single FASTQ files:

from Bio import SeqIO
from Bio.SeqIO.QualityIO import PairedFastaQualIterator
handle = open("temp.fastq", "w") #w=write
records = PairedFastaQualIterator(open("example.fasta"), open("example.qual"))
count = SeqIO.write(records, handle, "fastq")
handle.close()
print("Converted %i records" % count)

18.1.11  Indexing a FASTQ file

FASTQ files are often very large, with millions of reads in them. Due to the sheer amount of data, you can’t load all the records into memory at once. This is why the examples above (filtering and trimming) iterate over the file looking at just one SeqRecord at a time.

However, sometimes you can’t use a big loop or an iterator - you may need random access to the reads. Here the Bio.SeqIO.index() function may prove very helpful, as it allows you to access any read in the FASTQ file by its name (see Section 5.4.2).

Again we’ll use the SRR020192.fastq file from the ENA (ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz), although this is actually quite a small FASTQ file with less than 50,000 reads:

>>> from Bio import SeqIO
>>> fq_dict = SeqIO.index("SRR020192.fastq", "fastq")
>>> len(fq_dict)
41892
>>> fq_dict.keys()[:4]
['SRR020192.38240', 'SRR020192.23181', 'SRR020192.40568', 'SRR020192.23186']
>>> fq_dict["SRR020192.23186"].seq
Seq('GTCCCAGTATTCGGATTTGTCTGCCAAAACAATGAAATTGACACAGTTTACAAC...CCG', SingleLetterAlphabet())

When testing this on a FASTQ file with seven million reads, indexing took about a minute, but record access was almost instant.

The example in Section 18.1.5 show how you can use the Bio.SeqIO.index() function to sort a large FASTA file – this could also be used on FASTQ files.

18.1.12  Converting SFF files

If you work with 454 (Roche) sequence data, you will probably have access to the raw data as a Standard Flowgram Format (SFF) file. This contains the sequence reads (called bases) with quality scores and the original flow information.

A common task is to convert from SFF to a pair of FASTA and QUAL files, or to a single FASTQ file. These operations are trivial using the Bio.SeqIO.convert() function (see Section 5.5.2):

>>> from Bio import SeqIO
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.fasta", "fasta")
10
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.qual", "qual")
10
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.fastq", "fastq")
10

Remember the convert function returns the number of records, in this example just ten. This will give you the untrimmed reads, where the leading and trailing poor quality sequence or adaptor will be in lower case. If you want the trimmed reads (using the clipping information recorded within the SFF file) use this:

>>> from Bio import SeqIO
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.fasta", "fasta")
10
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.qual", "qual")
10
>>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.fastq", "fastq")
10

If you run Linux, you could ask Roche for a copy of their “off instrument” tools (often referred to as the Newbler tools). This offers an alternative way to do SFF to FASTA or QUAL conversion at the command line (but currently FASTQ output is not supported), e.g.

$ sffinfo -seq -notrim E3MFGYR02_random_10_reads.sff > reads.fasta
$ sffinfo -qual -notrim E3MFGYR02_random_10_reads.sff > reads.qual
$ sffinfo -seq -trim E3MFGYR02_random_10_reads.sff > trimmed.fasta
$ sffinfo -qual -trim E3MFGYR02_random_10_reads.sff > trimmed.qual

The way Biopython uses mixed case sequence strings to represent the trimming points deliberately mimics what the Roche tools do.

For more information on the Biopython SFF support, consult the built in help:

>>> from Bio.SeqIO import SffIO
>>> help(SffIO)
...

18.1.13  Identifying open reading frames

A very simplistic first step at identifying possible genes is to look for open reading frames (ORFs). By this we mean look in all six frames for long regions without stop codons – an ORF is just a region of nucleotides with no in frame stop codons.

Of course, to find a gene you would also need to worry about locating a start codon, possible promoters – and in Eukaryotes there are introns to worry about too. However, this approach is still useful in viruses and Prokaryotes.

To show how you might approach this with Biopython, we’ll need a sequence to search, and as an example we’ll again use the bacterial plasmid – although this time we’ll start with a plain FASTA file with no pre-marked genes: NC_005816.fna. This is a bacterial sequence, so we’ll want to use NCBI codon table 11 (see Section 3.9 about translation).

>>> from Bio import SeqIO 
>>> record = SeqIO.read("NC_005816.fna", "fasta")
>>> table = 11
>>> min_pro_len = 100

Here is a neat trick using the Seq object’s split method to get a list of all the possible ORF translations in the six reading frames:

>>> for strand, nuc in [(+1, record.seq), (-1, record.seq.reverse_complement())]:
...     for frame in range(3):
...         length = 3 * ((len(record)-frame) // 3) #Multiple of three
...         for pro in nuc[frame:frame+length].translate(table).split("*"):
...             if len(pro) >= min_pro_len:
...                 print("%s...%s - length %i, strand %i, frame %i" \
...                       % (pro[:30], pro[-3:], len(pro), strand, frame))
GCLMKKSSIVATIITILSGSANAASSQLIP...YRF - length 315, strand 1, frame 0
KSGELRQTPPASSTLHLRLILQRSGVMMEL...NPE - length 285, strand 1, frame 1
GLNCSFFSICNWKFIDYINRLFQIIYLCKN...YYH - length 176, strand 1, frame 1
VKKILYIKALFLCTVIKLRRFIFSVNNMKF...DLP - length 165, strand 1, frame 1
NQIQGVICSPDSGEFMVTFETVMEIKILHK...GVA - length 355, strand 1, frame 2
RRKEHVSKKRRPQKRPRRRRFFHRLRPPDE...PTR - length 128, strand 1, frame 2
TGKQNSCQMSAIWQLRQNTATKTRQNRARI...AIK - length 100, strand 1, frame 2
QGSGYAFPHASILSGIAMSHFYFLVLHAVK...CSD - length 114, strand -1, frame 0
IYSTSEHTGEQVMRTLDEVIASRSPESQTR...FHV - length 111, strand -1, frame 0
WGKLQVIGLSMWMVLFSQRFDDWLNEQEDA...ESK - length 125, strand -1, frame 1
RGIFMSDTMVVNGSGGVPAFLFSGSTLSSY...LLK - length 361, strand -1, frame 1
WDVKTVTGVLHHPFHLTFSLCPEGATQSGR...VKR - length 111, strand -1, frame 1
LSHTVTDFTDQMAQVGLCQCVNVFLDEVTG...KAA - length 107, strand -1, frame 2
RALTGLSAPGIRSQTSCDRLRELRYVPVSL...PLQ - length 119, strand -1, frame 2

Note that here we are counting the frames from the 5’ end (start) of each strand. It is sometimes easier to always count from the 5’ end (start) of the forward strand.

You could easily edit the above loop based code to build up a list of the candidate proteins, or convert this to a list comprehension. Now, one thing this code doesn’t do is keep track of where the proteins are.

You could tackle this in several ways. For example, the following code tracks the locations in terms of the protein counting, and converts back to the parent sequence by multiplying by three, then adjusting for the frame and strand:

from Bio import SeqIO 
record = SeqIO.read("NC_005816.gb","genbank")
table = 11
min_pro_len = 100

def find_orfs_with_trans(seq, trans_table, min_protein_length):
    answer = []
    seq_len = len(seq)
    for strand, nuc in [(+1, seq), (-1, seq.reverse_complement())]:
        for frame in range(3):
            trans = str(nuc[frame:].translate(trans_table))
            trans_len = len(trans)
            aa_start = 0
            aa_end = 0
            while aa_start < trans_len:
                aa_end = trans.find("*", aa_start)
                if aa_end == -1:
                    aa_end = trans_len
                if aa_end-aa_start >= min_protein_length:
                    if strand == 1:
                        start = frame+aa_start*3
                        end = min(seq_len,frame+aa_end*3+3)
                    else:
                        start = seq_len-frame-aa_end*3-3
                        end = seq_len-frame-aa_start*3                        
                    answer.append((start, end, strand,
                                   trans[aa_start:aa_end]))
                aa_start = aa_end+1
    answer.sort()
    return answer

orf_list = find_orfs_with_trans(record.seq, table, min_pro_len)
for start, end, strand, pro in orf_list:
    print("%s...%s - length %i, strand %i, %i:%i" \
          % (pro[:30], pro[-3:], len(pro), strand, start, end))

And the output:

NQIQGVICSPDSGEFMVTFETVMEIKILHK...GVA - length 355, strand 1, 41:1109
WDVKTVTGVLHHPFHLTFSLCPEGATQSGR...VKR - length 111, strand -1, 491:827
KSGELRQTPPASSTLHLRLILQRSGVMMEL...NPE - length 285, strand 1, 1030:1888
RALTGLSAPGIRSQTSCDRLRELRYVPVSL...PLQ - length 119, strand -1, 2830:3190
RRKEHVSKKRRPQKRPRRRRFFHRLRPPDE...PTR - length 128, strand 1, 3470:3857
GLNCSFFSICNWKFIDYINRLFQIIYLCKN...YYH - length 176, strand 1, 4249:4780
RGIFMSDTMVVNGSGGVPAFLFSGSTLSSY...LLK - length 361, strand -1, 4814:5900
VKKILYIKALFLCTVIKLRRFIFSVNNMKF...DLP - length 165, strand 1, 5923:6421
LSHTVTDFTDQMAQVGLCQCVNVFLDEVTG...KAA - length 107, strand -1, 5974:6298
GCLMKKSSIVATIITILSGSANAASSQLIP...YRF - length 315, strand 1, 6654:7602
IYSTSEHTGEQVMRTLDEVIASRSPESQTR...FHV - length 111, strand -1, 7788:8124
WGKLQVIGLSMWMVLFSQRFDDWLNEQEDA...ESK - length 125, strand -1, 8087:8465
TGKQNSCQMSAIWQLRQNTATKTRQNRARI...AIK - length 100, strand 1, 8741:9044
QGSGYAFPHASILSGIAMSHFYFLVLHAVK...CSD - length 114, strand -1, 9264:9609

If you comment out the sort statement, then the protein sequences will be shown in the same order as before, so you can check this is doing the same thing. Here we have sorted them by location to make it easier to compare to the actual annotation in the GenBank file (as visualised in Section 17.1.9).

If however all you want to find are the locations of the open reading frames, then it is a waste of time to translate every possible codon, including doing the reverse complement to search the reverse strand too. All you need to do is search for the possible stop codons (and their reverse complements). Using regular expressions is an obvious approach here (see the Python module re). These are an extremely powerful (but rather complex) way of describing search strings, which are supported in lots of programming languages and also command line tools like grep as well). You can find whole books about this topic!

18.2  Sequence parsing plus simple plots

This section shows some more examples of sequence parsing, using the Bio.SeqIO module described in Chapter 5, plus the Python library matplotlib’s pylab plotting interface (see the matplotlib website for a tutorial). Note that to follow these examples you will need matplotlib installed - but without it you can still try the data parsing bits.

18.2.1  Histogram of sequence lengths

There are lots of times when you might want to visualise the distribution of sequence lengths in a dataset – for example the range of contig sizes in a genome assembly project. In this example we’ll reuse our orchid FASTA file ls_orchid.fasta which has only 94 sequences.

First of all, we will use Bio.SeqIO to parse the FASTA file and compile a list of all the sequence lengths. You could do this with a for loop, but I find a list comprehension more pleasing:

>>> from Bio import SeqIO
>>> sizes = [len(rec) for rec in SeqIO.parse("ls_orchid.fasta", "fasta")]
>>> len(sizes), min(sizes), max(sizes)
(94, 572, 789)
>>> sizes
[740, 753, 748, 744, 733, 718, 730, 704, 740, 709, 700, 726, ..., 592]

Now that we have the lengths of all the genes (as a list of integers), we can use the matplotlib histogram function to display it.

from Bio import SeqIO
sizes = [len(rec) for rec in SeqIO.parse("ls_orchid.fasta", "fasta")]

import pylab
pylab.hist(sizes, bins=20)
pylab.title("%i orchid sequences\nLengths %i to %i" \
            % (len(sizes),min(sizes),max(sizes)))
pylab.xlabel("Sequence length (bp)")
pylab.ylabel("Count")
pylab.show()

That should pop up a new window containing the following graph:

Notice that most of these orchid sequences are about 740 bp long, and there could be two distinct classes of sequence here with a subset of shorter sequences.

Tip: Rather than using pylab.show() to show the plot in a window, you can also use pylab.savefig(...) to save the figure to a file (e.g. as a PNG or PDF).

18.2.2  Plot of sequence GC%

Another easily calculated quantity of a nucleotide sequence is the GC%. You might want to look at the GC% of all the genes in a bacterial genome for example, and investigate any outliers which could have been recently acquired by horizontal gene transfer. Again, for this example we’ll reuse our orchid FASTA file ls_orchid.fasta.

First of all, we will use Bio.SeqIO to parse the FASTA file and compile a list of all the GC percentages. Again, you could do this with a for loop, but I prefer this:

from Bio import SeqIO
from Bio.SeqUtils import GC

gc_values = sorted(GC(rec.seq) for rec in SeqIO.parse("ls_orchid.fasta", "fasta"))

Having read in each sequence and calculated the GC%, we then sorted them into ascending order. Now we’ll take this list of floating point values and plot them with matplotlib:

import pylab
pylab.plot(gc_values)
pylab.title("%i orchid sequences\nGC%% %0.1f to %0.1f" \
            % (len(gc_values),min(gc_values),max(gc_values)))
pylab.xlabel("Genes")
pylab.ylabel("GC%")
pylab.show()

As in the previous example, that should pop up a new window containing a graph:

If you tried this on the full set of genes from one organism, you’d probably get a much smoother plot than this.

18.2.3  Nucleotide dot plots

A dot plot is a way of visually comparing two nucleotide sequences for similarity to each other. A sliding window is used to compare short sub-sequences to each other, often with a mis-match threshold. Here for simplicity we’ll only look for perfect matches (shown in black in the plot below).

To start off, we’ll need two sequences. For the sake of argument, we’ll just take the first two from our orchid FASTA file ls_orchid.fasta:

from Bio import SeqIO
handle = open("ls_orchid.fasta")
record_iterator = SeqIO.parse(handle, "fasta")
rec_one = next(record_iterator)
rec_two = next(record_iterator)
handle.close()

We’re going to show two approaches. Firstly, a simple naive implementation which compares all the window sized sub-sequences to each other to compiles a similarity matrix. You could construct a matrix or array object, but here we just use a list of lists of booleans created with a nested list comprehension:

window = 7
seq_one = str(rec_one.seq).upper()
seq_two = str(rec_two.seq).upper()
data = [[(seq_one[i:i+window] <> seq_two[j:j+window]) \
        for j in range(len(seq_one)-window)] \
       for i in range(len(seq_two)-window)]

Note that we have not checked for reverse complement matches here. Now we’ll use the matplotlib’s pylab.imshow() function to display this data, first requesting the gray color scheme so this is done in black and white:

import pylab
pylab.gray()
pylab.imshow(data)
pylab.xlabel("%s (length %i bp)" % (rec_one.id, len(rec_one)))
pylab.ylabel("%s (length %i bp)" % (rec_two.id, len(rec_two)))
pylab.title("Dot plot using window size %i\n(allowing no mis-matches)" % window)
pylab.show()

That should pop up a new window containing a graph like this:

As you might have expected, these two sequences are very similar with a partial line of window sized matches along the diagonal. There are no off diagonal matches which would be indicative of inversions or other interesting events.

The above code works fine on small examples, but there are two problems applying this to larger sequences, which we will address below. First off all, this brute force approach to the all against all comparisons is very slow. Instead, we’ll compile dictionaries mapping the window sized sub-sequences to their locations, and then take the set intersection to find those sub-sequences found in both sequences. This uses more memory, but is much faster. Secondly, the pylab.imshow() function is limited in the size of matrix it can display. As an alternative, we’ll use the pylab.scatter() function.

We start by creating dictionaries mapping the window-sized sub-sequences to locations:

window = 7
dict_one = {}
dict_two = {}
for (seq, section_dict) in [(str(rec_one.seq).upper(), dict_one),
                            (str(rec_two.seq).upper(), dict_two)]:
    for i in range(len(seq)-window):
        section = seq[i:i+window]
        try:
            section_dict[section].append(i)
        except KeyError:
            section_dict[section] = [i]
#Now find any sub-sequences found in both sequences
#(Python 2.3 would require slightly different code here)
matches = set(dict_one).intersection(dict_two)
print("%i unique matches" % len(matches))

In order to use the pylab.scatter() we need separate lists for the x and y co-ordinates:

#Create lists of x and y co-ordinates for scatter plot
x = []
y = []
for section in matches:
    for i in dict_one[section]:
        for j in dict_two[section]:
            x.append(i)
            y.append(j)

We are now ready to draw the revised dot plot as a scatter plot:

import pylab
pylab.cla() #clear any prior graph
pylab.gray()
pylab.scatter(x,y)
pylab.xlim(0, len(rec_one)-window)
pylab.ylim(0, len(rec_two)-window)
pylab.xlabel("%s (length %i bp)" % (rec_one.id, len(rec_one)))
pylab.ylabel("%s (length %i bp)" % (rec_two.id, len(rec_two)))
pylab.title("Dot plot using window size %i\n(allowing no mis-matches)" % window)
pylab.show()

That should pop up a new window containing a graph like this:

Personally I find this second plot much easier to read! Again note that we have not checked for reverse complement matches here – you could extend this example to do this, and perhaps plot the forward matches in one color and the reverse matches in another.

18.2.4  Plotting the quality scores of sequencing read data

If you are working with second generation sequencing data, you may want to try plotting the quality data. Here is an example using two FASTQ files containing paired end reads, SRR001666_1.fastq for the forward reads, and SRR001666_2.fastq for the reverse reads. These were downloaded from the ENA sequence read archive FTP site (ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR001/SRR001666/SRR001666_1.fastq.gz and ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR001/SRR001666/SRR001666_2.fastq.gz), and are from E. coli – see http://www.ebi.ac.uk/ena/data/view/SRR001666 for details.

In the following code the pylab.subplot(...) function is used in order to show the forward and reverse qualities on two subplots, side by side. There is also a little bit of code to only plot the first fifty reads.

import pylab
from Bio import SeqIO
for subfigure in [1,2]:
    filename = "SRR001666_%i.fastq" % subfigure
    pylab.subplot(1, 2, subfigure)
    for i,record in enumerate(SeqIO.parse(filename, "fastq")):
        if i >= 50 : break #trick!
        pylab.plot(record.letter_annotations["phred_quality"])
    pylab.ylim(0,45)
    pylab.ylabel("PHRED quality score")
    pylab.xlabel("Position")
pylab.savefig("SRR001666.png")
print("Done")

You should note that we are using the Bio.SeqIO format name fastq here because the NCBI has saved these reads using the standard Sanger FASTQ format with PHRED scores. However, as you might guess from the read lengths, this data was from an Illumina Genome Analyzer and was probably originally in one of the two Solexa/Illumina FASTQ variant file formats instead.

This example uses the pylab.savefig(...) function instead of pylab.show(...), but as mentioned before both are useful. Here is the result:

18.3  Dealing with alignments

This section can been seen as a follow on to Chapter 6.

18.3.1  Calculating summary information

Once you have an alignment, you are very likely going to want to find out information about it. Instead of trying to have all of the functions that can generate information about an alignment in the alignment object itself, we’ve tried to separate out the functionality into separate classes, which act on the alignment.

Getting ready to calculate summary information about an object is quick to do. Let’s say we’ve got an alignment object called alignment, for example read in using Bio.AlignIO.read(...) as described in Chapter 6. All we need to do to get an object that will calculate summary information is:

from Bio.Align import AlignInfo
summary_align = AlignInfo.SummaryInfo(alignment)

The summary_align object is very useful, and will do the following neat things for you:

  1. Calculate a quick consensus sequence – see section 18.3.2
  2. Get a position specific score matrix for the alignment – see section 18.3.3
  3. Calculate the information content for the alignment – see section 18.3.4
  4. Generate information on substitutions in the alignment – section 18.4 details using this to generate a substitution matrix.

18.3.2  Calculating a quick consensus sequence

The SummaryInfo object, described in section 18.3.1, provides functionality to calculate a quick consensus of an alignment. Assuming we’ve got a SummaryInfo object called summary_align we can calculate a consensus by doing:

consensus = summary_align.dumb_consensus()

As the name suggests, this is a really simple consensus calculator, and will just add up all of the residues at each point in the consensus, and if the most common value is higher than some threshold value will add the common residue to the consensus. If it doesn’t reach the threshold, it adds an ambiguity character to the consensus. The returned consensus object is Seq object whose alphabet is inferred from the alphabets of the sequences making up the consensus. So doing a print consensus would give:

consensus Seq('TATACATNAAAGNAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAAT
...', IUPACAmbiguousDNA())

You can adjust how dumb_consensus works by passing optional parameters:

the threshold
This is the threshold specifying how common a particular residue has to be at a position before it is added. The default is 0.7 (meaning 70%).
the ambiguous character
This is the ambiguity character to use. The default is ’N’.
the consensus alphabet
This is the alphabet to use for the consensus sequence. If an alphabet is not specified than we will try to guess the alphabet based on the alphabets of the sequences in the alignment.

18.3.3  Position Specific Score Matrices

Position specific score matrices (PSSMs) summarize the alignment information in a different way than a consensus, and may be useful for different tasks. Basically, a PSSM is a count matrix. For each column in the alignment, the number of each alphabet letters is counted and totaled. The totals are displayed relative to some representative sequence along the left axis. This sequence may be the consesus sequence, but can also be any sequence in the alignment. For instance for the alignment,

GTATC
AT--C
CTGTC

the PSSM is:

      G A T C
    G 1 1 0 1
    T 0 0 3 0
    A 1 1 0 0
    T 0 0 2 0
    C 0 0 0 3

Let’s assume we’ve got an alignment object called c_align. To get a PSSM with the consensus sequence along the side we first get a summary object and calculate the consensus sequence:

summary_align = AlignInfo.SummaryInfo(c_align)
consensus = summary_align.dumb_consensus()

Now, we want to make the PSSM, but ignore any N ambiguity residues when calculating this:

my_pssm = summary_align.pos_specific_score_matrix(consensus,
                                                  chars_to_ignore = ['N'])

Two notes should be made about this:

  1. To maintain strictness with the alphabets, you can only include characters along the top of the PSSM that are in the alphabet of the alignment object. Gaps are not included along the top axis of the PSSM.
  2. The sequence passed to be displayed along the left side of the axis does not need to be the consensus. For instance, if you wanted to display the second sequence in the alignment along this axis, you would need to do:
    second_seq = alignment.get_seq_by_num(1)
    my_pssm = summary_align.pos_specific_score_matrix(second_seq
                                                      chars_to_ignore = ['N'])
    

The command above returns a PSSM object. To print out the PSSM as shown above, we simply need to do a print(my_pssm), which gives:

    A   C   G   T
T  0.0 0.0 0.0 7.0
A  7.0 0.0 0.0 0.0
T  0.0 0.0 0.0 7.0
A  7.0 0.0 0.0 0.0
C  0.0 7.0 0.0 0.0
A  7.0 0.0 0.0 0.0
T  0.0 0.0 0.0 7.0
T  1.0 0.0 0.0 6.0
...

You can access any element of the PSSM by subscripting like your_pssm[sequence_number][residue_count_name]. For instance, to get the counts for the ’A’ residue in the second element of the above PSSM you would do:

>>> print(my_pssm[1]["A"])
7.0

The structure of the PSSM class hopefully makes it easy both to access elements and to pretty print the matrix.

18.3.4  Information Content

A potentially useful measure of evolutionary conservation is the information content of a sequence.

A useful introduction to information theory targeted towards molecular biologists can be found at http://www.lecb.ncifcrf.gov/~toms/paper/primer/. For our purposes, we will be looking at the information content of a consesus sequence, or a portion of a consensus sequence. We calculate information content at a particular column in a multiple sequence alignment using the following formula:

ICj = 
Na
i=1
 Pij log


Pij
Qi



where:

  • ICj – The information content for the j-th column in an alignment.
  • Na – The number of letters in the alphabet.
  • Pij – The frequency of a particular letter i in the j-th column (i. e. if G occurred 3 out of 6 times in an aligment column, this would be 0.5)
  • Qi – The expected frequency of a letter i. This is an optional argument, usage of which is left at the user’s discretion. By default, it is automatically assigned to 0.05 = 1/20 for a protein alphabet, and 0.25 = 1/4 for a nucleic acid alphabet. This is for geting the information content without any assumption of prior distributions. When assuming priors, or when using a non-standard alphabet, you should supply the values for Qi.

Well, now that we have an idea what information content is being calculated in Biopython, let’s look at how to get it for a particular region of the alignment.

First, we need to use our alignment to get an alignment summary object, which we’ll assume is called summary_align (see section 18.3.1) for instructions on how to get this. Once we’ve got this object, calculating the information content for a region is as easy as:

info_content = summary_align.information_content(5, 30,
                                                 chars_to_ignore = ['N'])

Wow, that was much easier then the formula above made it look! The variable info_content now contains a float value specifying the information content over the specified region (from 5 to 30 of the alignment). We specifically ignore the ambiguity residue ’N’ when calculating the information content, since this value is not included in our alphabet (so we shouldn’t be interested in looking at it!).

As mentioned above, we can also calculate relative information content by supplying the expected frequencies:

expect_freq = {
    'A' : .3,
    'G' : .2,
    'T' : .3,
    'C' : .2}

The expected should not be passed as a raw dictionary, but instead by passed as a SubsMat.FreqTable object (see section 20.2.2 for more information about FreqTables). The FreqTable object provides a standard for associating the dictionary with an Alphabet, similar to how the Biopython Seq class works.

To create a FreqTable object, from the frequency dictionary you just need to do:

from Bio.Alphabet import IUPAC
from Bio.SubsMat import FreqTable

e_freq_table = FreqTable.FreqTable(expect_freq, FreqTable.FREQ,
                                   IUPAC.unambiguous_dna)

Now that we’ve got that, calculating the relative information content for our region of the alignment is as simple as:

info_content = summary_align.information_content(5, 30,
                                                 e_freq_table = e_freq_table,
                                                 chars_to_ignore = ['N'])

Now, info_content will contain the relative information content over the region in relation to the expected frequencies.

The value return is calculated using base 2 as the logarithm base in the formula above. You can modify this by passing the parameter log_base as the base you want:

info_content = summary_align.information_content(5, 30, log_base = 10,
                                                 chars_to_ignore = ['N'])

Well, now you are ready to calculate information content. If you want to try applying this to some real life problems, it would probably be best to dig into the literature on information content to get an idea of how it is used. Hopefully your digging won’t reveal any mistakes made in coding this function!

18.4  Substitution Matrices

Substitution matrices are an extremely important part of everyday bioinformatics work. They provide the scoring terms for classifying how likely two different residues are to substitute for each other. This is essential in doing sequence comparisons. The book “Biological Sequence Analysis” by Durbin et al. provides a really nice introduction to Substitution Matrices and their uses. Some famous substitution matrices are the PAM and BLOSUM series of matrices.

Biopython provides a ton of common substitution matrices, and also provides functionality for creating your own substitution matrices.

18.4.1  Using common substitution matrices

18.4.2  Creating your own substitution matrix from an alignment

A very cool thing that you can do easily with the substitution matrix classes is to create your own substitution matrix from an alignment. In practice, this is normally done with protein alignments. In this example, we’ll first get a Biopython alignment object and then get a summary object to calculate info about the alignment. The file containing protein.aln (also available online here) contains the Clustalw alignment output.

>>> from Bio import AlignIO
>>> from Bio import Alphabet
>>> from Bio.Alphabet import IUPAC
>>> from Bio.Align import AlignInfo
>>> filename = "protein.aln"
>>> alpha = Alphabet.Gapped(IUPAC.protein)
>>> c_align = AlignIO.read(filename, "clustal", alphabet=alpha)
>>> summary_align = AlignInfo.SummaryInfo(c_align)

Sections 6.4.1 and 18.3.1 contain more information on doing this.

Now that we’ve got our summary_align object, we want to use it to find out the number of times different residues substitute for each other. To make the example more readable, we’ll focus on only amino acids with polar charged side chains. Luckily, this can be done easily when generating a replacement dictionary, by passing in all of the characters that should be ignored. Thus we’ll create a dictionary of replacements for only charged polar amino acids using:

>>> replace_info = summary_align.replacement_dictionary(["G", "A", "V", "L", "I",
...                                                      "M", "P", "F", "W", "S",
...                                                      "T", "N", "Q", "Y", "C"])

This information about amino acid replacements is represented as a python dictionary which will look something like (the order can vary):

{('R', 'R'): 2079.0, ('R', 'H'): 17.0, ('R', 'K'): 103.0, ('R', 'E'): 2.0,
('R', 'D'): 2.0, ('H', 'R'): 0, ('D', 'H'): 15.0, ('K', 'K'): 3218.0,
('K', 'H'): 24.0, ('H', 'K'): 8.0, ('E', 'H'): 15.0, ('H', 'H'): 1235.0,
('H', 'E'): 18.0, ('H', 'D'): 0, ('K', 'D'): 0, ('K', 'E'): 9.0,
('D', 'R'): 48.0, ('E', 'R'): 2.0, ('D', 'K'): 1.0, ('E', 'K'): 45.0,
('K', 'R'): 130.0, ('E', 'D'): 241.0, ('E', 'E'): 3305.0,
('D', 'E'): 270.0, ('D', 'D'): 2360.0}

This information gives us our accepted number of replacements, or how often we expect different things to substitute for each other. It turns out, amazingly enough, that this is all of the information we need to go ahead and create a substitution matrix. First, we use the replacement dictionary information to create an Accepted Replacement Matrix (ARM):

>>> from Bio import SubsMat
>>> my_arm = SubsMat.SeqMat(replace_info)

With this accepted replacement matrix, we can go right ahead and create our log odds matrix (i. e. a standard type Substitution Matrix):

>>> my_lom = SubsMat.make_log_odds_matrix(my_arm)

The log odds matrix you create is customizable with the following optional arguments:

  • exp_freq_table – You can pass a table of expected frequencies for each alphabet. If supplied, this will be used instead of the passed accepted replacement matrix when calculate expected replacments.
  • logbase - The base of the logarithm taken to create the log odd matrix. Defaults to base 10.
  • factor - The factor to multiply each matrix entry by. This defaults to 10, which normally makes the matrix numbers easy to work with.
  • round_digit - The digit to round to in the matrix. This defaults to 0 (i. e. no digits).

Once you’ve got your log odds matrix, you can display it prettily using the function print_mat. Doing this on our created matrix gives:

>>> my_lom.print_mat()
D   2
E  -1   1
H  -5  -4   3
K -10  -5  -4   1
R  -4  -8  -4  -2   2
   D   E   H   K   R

Very nice. Now we’ve got our very own substitution matrix to play with!

18.5  BioSQL – storing sequences in a relational database

BioSQL is a joint effort between the OBF projects (BioPerl, BioJava etc) to support a shared database schema for storing sequence data. In theory, you could load a GenBank file into the database with BioPerl, then using Biopython extract this from the database as a record object with features - and get more or less the same thing as if you had loaded the GenBank file directly as a SeqRecord using Bio.SeqIO (Chapter 5).

Biopython’s BioSQL module is currently documented at http://biopython.org/wiki/BioSQL which is part of our wiki pages.

Chapter 19  The Biopython testing framework

Biopython has a regression testing framework (the file run_tests.py) based on unittest, the standard unit testing framework for Python. Providing comprehensive tests for modules is one of the most important aspects of making sure that the Biopython code is as bug-free as possible before going out. It also tends to be one of the most undervalued aspects of contributing. This chapter is designed to make running the Biopython tests and writing good test code as easy as possible. Ideally, every module that goes into Biopython should have a test (and should also have documentation!). All our developers, and anyone installing Biopython from source, are strongly encouraged to run the unit tests.

19.1  Running the tests

When you download the Biopython source code, or check it out from our source code repository, you should find a subdirectory call Tests. This contains the key script run_tests.py, lots of individual scripts named test_XXX.py, a subdirectory called output and lots of other subdirectories which contain input files for the test suite.

As part of building and installing Biopython you will typically run the full test suite at the command line from the Biopython source top level directory using the following:

python setup.py test

This is actually equivalent to going to the Tests subdirectory and running:

python run_tests.py

You’ll often want to run just some of the tests, and this is done like this:

python run_tests.py test_SeqIO.py test_AlignIO.py

When giving the list of tests, the .py extension is optional, so you can also just type:

python run_tests.py test_SeqIO test_AlignIO

To run the docstring tests (see section 19.3), you can use

python run_tests.py doctest

By default, run_tests.py runs all tests, including the docstring tests.

If an individual test is failing, you can also try running it directly, which may give you more information.

Importantly, note that the individual unit tests come in two types:

  • Simple print-and-compare scripts. These unit tests are essentially short example Python programs, which print out various output text. For a test file named test_XXX.py there will be a matching text file called test_XXX under the output subdirectory which contains the expected output. All that the test framework does to is run the script, and check the output agrees.
  • Standard unittest- based tests. These will import unittest and then define unittest.TestCase classes, each with one or more sub-tests as methods starting with test_ which check some specific aspect of the code. These tests should not print any output directly.

Currently, about half of the Biopython tests are unittest-style tests, and half are print-and-compare tests.

Running a simple print-and-compare test directly will usually give lots of output on screen, but does not check the output matches the expected output. If the test is failing with an exception error, it should be very easy to locate where exactly the script is failing. For an example of a print-and-compare test, try:

python test_SeqIO.py

The unittest-based tests instead show you exactly which sub-section(s) of the test are failing. For example,

python test_Cluster.py

19.2  Writing tests

Let’s say you want to write some tests for a module called Biospam. This can be a module you wrote, or an existing module that doesn’t have any tests yet. In the examples below, we assume that Biospam is a module that does simple math.

Each Biopython test can have three important files and directories involved with it:

  1. test_Biospam.py – The actual test code for your module.
  2. Biospam [optional]– A directory where any necessary input files will be located. Any output files that will be generated should also be written here (and preferably cleaned up after the tests are done) to prevent clogging up the main Tests directory.
  3. output/Biospam – [for print-and-compare tests only] This file contains the expected output from running test_Biospam.py. This file is not needed for unittest-style tests, since there the validation is done in the test script test_Biospam.py itself.

It’s up to you to decide whether you want to write a print-and-compare test script or a unittest-style test script. The important thing is that you cannot mix these two styles in a single test script. Particularly, don’t use unittest features in a print-and-compare test.

Any script with a test_ prefix in the Tests directory will be found and run by run_tests.py. Below, we show an example test script test_Biospam.py both for a print-and-compare test and for a unittest-based test. If you put this script in the Biopython Tests directory, then run_tests.py will find it and execute the tests contained in it:

$ python run_tests.py     
test_Ace ... ok
test_AlignIO ... ok
test_BioSQL ... ok
test_BioSQL_SeqIO ... ok
test_Biospam ... ok
test_CAPS ... ok
test_Clustalw ... ok

----------------------------------------------------------------------
Ran 107 tests in 86.127 seconds

19.2.1  Writing a print-and-compare test

A print-and-compare style test should be much simpler for beginners or novices to write - essentially it is just an example script using your new module.

Here is what you should do to make a print-and-compare test for the Biospam module.

  1. Write a script called test_Biospam.py
    • This script should live in the Tests directory
    • The script should test all of the important functionality of the module (the more you test the better your test is, of course!).
    • Try to avoid anything which might be platform specific, such as printing floating point numbers without using an explicit formatting string to avoid having too many decimal places (different platforms can give very slightly different values).
  2. If the script requires files to do the testing, these should go in the directory Tests/Biospam (if you just need something generic, like a FASTA sequence file, or a GenBank record, try and use an existing sample input file instead).
  3. Write out the test output and verify the output to be correct.

    There are two ways to do this:

    1. The long way:
      • Run the script and write its output to a file. On UNIX (including Linux and Mac OS X) machines, you would do something like: python test_Biospam.py > test_Biospam which would write the output to the file test_Biospam.
      • Manually look at the file test_Biospam to make sure the output is correct. When you are sure it is all right and there are no bugs, you need to quickly edit the test_Biospam file so that the first line is: ‘test_Biospam’ (no quotes).
      • copy the test_Biospam file to the directory Tests/output
    2. The quick way:
      • Run python run_tests.py -g test_Biospam.py. The regression testing framework is nifty enough that it’ll put the output in the right place in just the way it likes it.
      • Go to the output (which should be in Tests/output/test_Biospam) and double check the output to make sure it is all correct.
  4. Now change to the Tests directory and run the regression tests with python run_tests.py. This will run all of the tests, and you should see your test run (and pass!).
  5. That’s it! Now you’ve got a nice test for your module ready to check in, or submit to Biopython. Congratulations!

As an example, the test_Biospam.py test script to test the addition and multiplication functions in the Biospam module could look as follows:

from __future__ import print_function
from Bio import Biospam

print("2 + 3 =", Biospam.addition(2, 3))
print("9 - 1 =", Biospam.addition(9, -1))
print("2 * 3 =", Biospam.multiplication(2, 3))
print("9 * (- 1) =", Biospam.multiplication(9, -1))

We generate the corresponding output with python run_tests.py -g test_Biospam.py, and check the output file output/test_Biospam:

test_Biospam
2 + 3 = 5
9 - 1 = 8
2 * 3 = 6
9 * (- 1) = -9

Often, the difficulty with larger print-and-compare tests is to keep track which line in the output corresponds to which command in the test script. For this purpose, it is important to print out some markers to help you match lines in the input script with the generated output.

19.2.2  Writing a unittest-based test

We want all the modules in Biopython to have unit tests, and a simple print-and-compare test is better than no test at all. However, although there is a steeper learning curve, using the unittest framework gives a more structured result, and if there is a test failure this can clearly pinpoint which part of the test is going wrong. The sub-tests can also be run individually which is helpful for testing or debugging.

The unittest-framework has been included with Python since version 2.1, and is documented in the Python Library Reference (which I know you are keeping under your pillow, as recommended). There is also online documentaion for unittest. If you are familiar with the unittest system (or something similar like the nose test framework), you shouldn’t have any trouble. You may find looking at the existing example within Biopython helpful too.

Here’s a minimal unittest-style test script for Biospam, which you can copy and paste to get started:

import unittest
from Bio import Biospam

class BiospamTestAddition(unittest.TestCase):

    def test_addition1(self):
        result = Biospam.addition(2, 3)
        self.assertEqual(result, 5)

    def test_addition2(self):
        result = Biospam.addition(9, -1)
        self.assertEqual(result, 8)

class BiospamTestDivision(unittest.TestCase):

    def test_division1(self):
        result = Biospam.division(3.0, 2.0)
        self.assertAlmostEqual(result, 1.5)

    def test_division2(self):
        result = Biospam.division(10.0, -2.0)
        self.assertAlmostEqual(result, -5.0)


if __name__ == "__main__":
    runner = unittest.TextTestRunner(verbosity = 2)
    unittest.main(testRunner=runner)

In the division tests, we use assertAlmostEqual instead of assertEqual to avoid tests failing due to roundoff errors; see the unittest chapter in the Python documentation for details and for other functionality available in unittest (online reference).

These are the key points of unittest-based tests:

  • Test cases are stored in classes that derive from unittest.TestCase and cover one basic aspect of your code
  • You can use methods setUp and tearDown for any repeated code which should be run before and after each test method. For example, the setUp method might be used to create an instance of the object you are testing, or open a file handle. The tearDown should do any “tidying up”, for example closing the file handle.
  • The tests are prefixed with test_ and each test should cover one specific part of what you are trying to test. You can have as many tests as you want in a class.
  • At the end of the test script, you can use
    if __name__ == "__main__":
        runner = unittest.TextTestRunner(verbosity = 2)
        unittest.main(testRunner=runner)
    
    to execute the tests when the script is run by itself (rather than imported from run_tests.py). If you run this script, then you’ll see something like the following:
    $ python test_BiospamMyModule.py
    test_addition1 (__main__.TestAddition) ... ok
    test_addition2 (__main__.TestAddition) ... ok
    test_division1 (__main__.TestDivision) ... ok
    test_division2 (__main__.TestDivision) ... ok
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.059s
    
    OK
    
  • To indicate more clearly what each test is doing, you can add docstrings to each test. These are shown when running the tests, which can be useful information if a test is failing.
    import unittest
    from Bio import Biospam
    
    class BiospamTestAddition(unittest.TestCase):
    
        def test_addition1(self):
            """An addition test"""
            result = Biospam.addition(2, 3)
            self.assertEqual(result, 5)
    
        def test_addition2(self):
            """A second addition test"""
            result = Biospam.addition(9, -1)
            self.assertEqual(result, 8)
    
    class BiospamTestDivision(unittest.TestCase):
    
        def test_division1(self):
            """Now let's check division"""
            result = Biospam.division(3.0, 2.0)
            self.assertAlmostEqual(result, 1.5)
    
        def test_division2(self):
            """A second division test"""
            result = Biospam.division(10.0, -2.0)
            self.assertAlmostEqual(result, -5.0)
    
    
    if __name__ == "__main__":
        runner = unittest.TextTestRunner(verbosity = 2)
        unittest.main(testRunner=runner)
    

    Running the script will now show you:

    $ python test_BiospamMyModule.py
    An addition test ... ok
    A second addition test ... ok
    Now let's check division ... ok
    A second division test ... ok
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.001s
    
    OK
    

If your module contains docstring tests (see section 19.3), you may want to include those in the tests to be run. You can do so as follows by modifying the code under if __name__ == "__main__": to look like this:

if __name__ == "__main__":
    unittest_suite = unittest.TestLoader().loadTestsFromName("test_Biospam")
    doctest_suite = doctest.DocTestSuite(Biospam)
    suite = unittest.TestSuite((unittest_suite, doctest_suite))
    runner = unittest.TextTestRunner(sys.stdout, verbosity = 2)
    runner.run(suite)

This is only relevant if you want to run the docstring tests when you execute python test_Biospam.py; with python run_tests.py, the docstring tests are run automatically (assuming they are included in the list of docstring tests in run_tests.py, see the section below).

19.3  Writing doctests

Python modules, classes and functions support built in documentation using docstrings. The doctest framework (included with Python) allows the developer to embed working examples in the docstrings, and have these examples automatically tested.

Currently only a small part of Biopython includes doctests. The run_tests.py script takes care of running the doctests. For this purpose, at the top of the run_tests.py script is a manually compiled list of modules to test, which allows us to skip modules with optional external dependencies which may not be installed (e.g. the Reportlab and NumPy libraries). So, if you’ve added some doctests to the docstrings in a Biopython module, in order to have them included in the Biopython test suite, you must update run_tests.py to include your module. Currently, the relevant part of run_tests.py looks as follows:

# This is the list of modules containing docstring tests.
# If you develop docstring tests for other modules, please add
# those modules here.
DOCTEST_MODULES = ["Bio.Seq",
                   "Bio.SeqRecord",
                   "Bio.SeqIO",
                   "...",
                  ]
#Silently ignore any doctests for modules requiring numpy!
try:
    import numpy
    DOCTEST_MODULES.extend(["Bio.Statistics.lowess"])
except ImportError:
    pass

Note that we regard doctests primarily as documentation, so you should stick to typical usage. Generally complicated examples dealing with error conditions and the like would be best left to a dedicated unit test.

Note that if you want to write doctests involving file parsing, defining the file location complicates matters. Ideally use relative paths assuming the code will be run from the Tests directory, see the Bio.SeqIO doctests for an example of this.

To run the docstring tests only, use

$ python run_tests.py doctest

Chapter 20  Advanced

20.1  Parser Design

Many of the older Biopython parsers were built around an event-oriented design that includes Scanner and Consumer objects.

Scanners take input from a data source and analyze it line by line, sending off an event whenever it recognizes some information in the data. For example, if the data includes information about an organism name, the scanner may generate an organism_name event whenever it encounters a line containing the name.

Consumers are objects that receive the events generated by Scanners. Following the previous example, the consumer receives the organism_name event, and the processes it in whatever manner necessary in the current application.

This is a very flexible framework, which is advantageous if you want to be able to parse a file format into more than one representation. For example, the Bio.GenBank module uses this to construct either SeqRecord objects or file-format-specific record objects.

More recently, many of the parsers added for Bio.SeqIO and Bio.AlignIO take a much simpler approach, but only generate a single object representation (SeqRecord and MultipleSeqAlignment objects respectively). In some cases the Bio.SeqIO parsers actually wrap another Biopython parser - for example, the Bio.SwissProt parser produces SwissProt format specific record objects, which get converted into SeqRecord objects.

20.2  Substitution Matrices

20.2.1  SubsMat

This module provides a class and a few routines for generating substitution matrices, similar to BLOSUM or PAM matrices, but based on user-provided data. Additionally, you may select a matrix from MatrixInfo.py, a collection of established substitution matrices. The SeqMat class derives from a dictionary:

class SeqMat(dict)

The dictionary is of the form {(i1,j1):n1, (i1,j2):n2,...,(ik,jk):nk} where i, j are alphabet letters, and n is a value.

  1. Attributes
    1. self.alphabet: a class as defined in Bio.Alphabet
    2. self.ab_list: a list of the alphabet’s letters, sorted. Needed mainly for internal purposes
  2. Methods
    1. __init__(self,data=None,alphabet=None, mat_name='', build_later=0):
      
      1. data: can be either a dictionary, or another SeqMat instance.
      2. alphabet: a Bio.Alphabet instance. If not provided, construct an alphabet from data.
      3. mat_name: matrix name, such as "BLOSUM62" or "PAM250"
      4. build_later: default false. If true, user may supply only alphabet and empty dictionary, if intending to build the matrix later. this skips the sanity check of alphabet size vs. matrix size.
    2. entropy(self,obs_freq_mat)
      
      1. obs_freq_mat: an observed frequency matrix. Returns the matrix’s entropy, based on the frequency in obs_freq_mat. The matrix instance should be LO or SUBS.
    3. sum(self)
      
      Calculates the sum of values for each letter in the matrix’s alphabet, and returns it as a dictionary of the form {i1: s1, i2: s2,...,in:sn}, where:
      • i: an alphabet letter;
      • s: sum of all values in a half-matrix for that letter;
      • n: number of letters in alphabet.
    4. print_mat(self,f,format="%4d",bottomformat="%4s",alphabet=None)
      

      prints the matrix to file handle f. format is the format field for the matrix values; bottomformat is the format field for the bottom row, containing matrix letters. Example output for a 3-letter alphabet matrix:

      A 23
      B 12 34
      C 7  22  27
        A   B   C
      

      The alphabet optional argument is a string of all characters in the alphabet. If supplied, the order of letters along the axes is taken from the string, rather than by alphabetical order.

  3. Usage

    The following section is laid out in the order by which most people wish to generate a log-odds matrix. Of course, interim matrices can be generated and investigated. Most people just want a log-odds matrix, that’s all.

    1. Generating an Accepted Replacement Matrix

      Initially, you should generate an accepted replacement matrix (ARM) from your data. The values in ARM are the counted number of replacements according to your data. The data could be a set of pairs or multiple alignments. So for instance if Alanine was replaced by Cysteine 10 times, and Cysteine by Alanine 12 times, the corresponding ARM entries would be:

      ('A','C'): 10, ('C','A'): 12
      

      as order doesn’t matter, user can already provide only one entry:

      ('A','C'): 22
      

      A SeqMat instance may be initialized with either a full (first method of counting: 10, 12) or half (the latter method, 22) matrices. A full protein alphabet matrix would be of the size 20x20 = 400. A half matrix of that alphabet would be 20x20/2 + 20/2 = 210. That is because same-letter entries don’t change. (The matrix diagonal). Given an alphabet size of N:

      1. Full matrix size:N*N
      2. Half matrix size: N(N+1)/2

      The SeqMat constructor automatically generates a half-matrix, if a full matrix is passed. If a half matrix is passed, letters in the key should be provided in alphabetical order: (’A’,’C’) and not (’C’,A’).

      At this point, if all you wish to do is generate a log-odds matrix, please go to the section titled Example of Use. The following text describes the nitty-gritty of internal functions, to be used by people who wish to investigate their nucleotide/amino-acid frequency data more thoroughly.

    2. Generating the observed frequency matrix (OFM)

      Use:

      OFM = SubsMat._build_obs_freq_mat(ARM)
      

      The OFM is generated from the ARM, only instead of replacement counts, it contains replacement frequencies.

    3. Generating an expected frequency matrix (EFM)

      Use:

      EFM = SubsMat._build_exp_freq_mat(OFM,exp_freq_table)
      
      1. exp_freq_table: should be a FreqTable instance. See section 20.2.2 for detailed information on FreqTable. Briefly, the expected frequency table has the frequencies of appearance for each member of the alphabet. It is implemented as a dictionary with the alphabet letters as keys, and each letter’s frequency as a value. Values sum to 1.

      The expected frequency table can (and generally should) be generated from the observed frequency matrix. So in most cases you will generate exp_freq_table using:

      >>> exp_freq_table = SubsMat._exp_freq_table_from_obs_freq(OFM)
      >>> EFM = SubsMat._build_exp_freq_mat(OFM, exp_freq_table)
      

      But you can supply your own exp_freq_table, if you wish

    4. Generating a substitution frequency matrix (SFM)

      Use:

      SFM = SubsMat._build_subs_mat(OFM,EFM)
      

      Accepts an OFM, EFM. Provides the division product of the corresponding values.

    5. Generating a log-odds matrix (LOM)

      Use:

      LOM=SubsMat._build_log_odds_mat(SFM[,logbase=10,factor=10.0,round_digit=1])
      
      1. Accepts an SFM.
      2. logbase: base of the logarithm used to generate the log-odds values.
      3. factor: factor used to multiply the log-odds values. Each entry is generated by log(LOM[key])*factor And rounded to the round_digit place after the decimal point, if required.
  4. Example of use

    As most people would want to generate a log-odds matrix, with minimum hassle, SubsMat provides one function which does it all:

    make_log_odds_matrix(acc_rep_mat,exp_freq_table=None,logbase=10,
                          factor=10.0,round_digit=0):
    
    1. acc_rep_mat: user provided accepted replacements matrix
    2. exp_freq_table: expected frequencies table. Used if provided, if not, generated from the acc_rep_mat.
    3. logbase: base of logarithm for the log-odds matrix. Default base 10.
    4. round_digit: number after decimal digit to which result should be rounded. Default zero.

20.2.2  FreqTable

FreqTable.FreqTable(UserDict.UserDict)
  1. Attributes:
    1. alphabet: A Bio.Alphabet instance.
    2. data: frequency dictionary
    3. count: count dictionary (in case counts are provided).
  2. Functions:
    1. read_count(f): read a count file from stream f. Then convert to frequencies
    2. read_freq(f): read a frequency data file from stream f. Of course, we then don’t have the counts, but it is usually the letter frquencies which are interesting.
  3. Example of use: The expected count of the residues in the database is sitting in a file, whitespace delimited, in the following format (example given for a 3-letter alphabet):
    A   35
    B   65
    C   100
    

    And will be read using the FreqTable.read_count(file_handle) function.

    An equivalent frequency file:

    A  0.175
    B  0.325
    C  0.5
    

    Conversely, the residue frequencies or counts can be passed as a dictionary. Example of a count dictionary (3-letter alphabet):

    {'A': 35, 'B': 65, 'C': 100}
    

    Which means that an expected data count would give a 0.5 frequency for ’C’, a 0.325 probability of ’B’ and a 0.175 probability of ’A’ out of 200 total, sum of A, B and C)

    A frequency dictionary for the same data would be:

    {'A': 0.175, 'B': 0.325, 'C': 0.5}
    

    Summing up to 1.

    When passing a dictionary as an argument, you should indicate whether it is a count or a frequency dictionary. Therefore the FreqTable class constructor requires two arguments: the dictionary itself, and FreqTable.COUNT or FreqTable.FREQ indicating counts or frequencies, respectively.

    Read expected counts. readCount will already generate the frequencies Any one of the following may be done to geerate the frequency table (ftab):

    >>> from SubsMat import *
    >>> ftab = FreqTable.FreqTable(my_frequency_dictionary, FreqTable.FREQ)
    >>> ftab = FreqTable.FreqTable(my_count_dictionary, FreqTable.COUNT)
    >>> ftab = FreqTable.read_count(open('myCountFile'))
    >>> ftab = FreqTable.read_frequency(open('myFrequencyFile'))
    

Chapter 21  Where to go from here – contributing to Biopython

21.1  Bug Reports + Feature Requests

Getting feedback on the Biopython modules is very important to us. Open-source projects like this benefit greatly from feedback, bug-reports (and patches!) from a wide variety of contributors.

The main forums for discussing feature requests and potential bugs are the Biopython mailing lists:

Additionally, if you think you’ve found a new bug, you can submit it to our issue tracker at https://github.com/biopython/biopython/issues (this has replaced the older tracker hosted at http://redmine.open-bio.org/projects/biopython). This way, it won’t get buried in anyone’s Inbox and forgotten about.

21.2  Mailing lists and helping newcomers

We encourage all our uses to sign up to the main Biopython mailing list. Once you’ve got the hang of an area of Biopython, we’d encourage you to help answer questions from beginners. After all, you were a beginner once.

21.3  Contributing Documentation

We’re happy to take feedback or contributions - either via a bug-report or on the Mailing List. While reading this tutorial, perhaps you noticed some topics you were interested in which were missing, or not clearly explained. There is also Biopython’s built in documentation (the docstrings, these are also online), where again, you may be able to help fill in any blanks.

21.4  Contributing cookbook examples

As explained in Chapter 18, Biopython now has a wiki collection of user contributed “cookbook” examples, http://biopython.org/wiki/Category:Cookbook – maybe you can add to this?

21.5  Maintaining a distribution for a platform

We currently provide source code archives (suitable for any OS, if you have the right build tools installed), and Windows Installers which are just click and run. This covers all the major operating systems.

Most major Linux distributions have volunteers who take these source code releases, and compile them into packages for Linux users to easily install (taking care of dependencies etc). This is really great and we are of course very grateful. If you would like to contribute to this work, please find out more about how your Linux distribution handles this.

Below are some tips for certain platforms to maybe get people started with helping out:

Windows
– Windows products typically have a nice graphical installer that installs all of the essential components in the right place. We use Distutils to create a installer of this type fairly easily.

You must first make sure you have a C compiler on your Windows computer, and that you can compile and install things (this is the hard bit - see the Biopython installation instructions for info on how to do this).

Once you are setup with a C compiler, making the installer just requires doing:

python setup.py bdist_wininst

Now you’ve got a Windows installer. Congrats! At the moment we have no trouble shipping installers built on 32 bit windows. If anyone would like to look into supporting 64 bit Windows that would be great.

RPMs
– RPMs are pretty popular package systems on some Linux platforms. There is lots of documentation on RPMs available at http://www.rpm.org to help you get started with them. To create an RPM for your platform is really easy. You just need to be able to build the package from source (having a C compiler that works is thus essential) – see the Biopython installation instructions for more info on this.

To make the RPM, you just need to do:

python setup.py bdist_rpm

This will create an RPM for your specific platform and a source RPM in the directory dist. This RPM should be good and ready to go, so this is all you need to do! Nice and easy.

Macintosh
– Since Apple moved to Mac OS X, things have become much easier on the Mac. We generally treat it as just another Unix variant, and installing Biopython from source is just as easy as on Linux. The easiest way to get all the GCC compilers etc installed is to install Apple’s X-Code. We might be able to provide click and run installers for Mac OS X, but to date there hasn’t been any demand.

Once you’ve got a package, please test it on your system to make sure it installs everything in a good way and seems to work properly. Once you feel good about it, send it off to one of the Biopython developers (write to our main mailing list at biopython@biopython.org if you’re not sure who to send it to) and you’ve done it. Thanks!

21.6  Contributing Unit Tests

Even if you don’t have any new functionality to add to Biopython, but you want to write some code, please consider extending our unit test coverage. We’ve devoted all of Chapter 19 to this topic.

21.7  Contributing Code

There are no barriers to joining Biopython code development other than an interest in creating biology-related code in Python. The best place to express an interest is on the Biopython mailing lists – just let us know you are interested in coding and what kind of stuff you want to work on. Normally, we try to have some discussion on modules before coding them, since that helps generate good ideas – then just feel free to jump right in and start coding!

The main Biopython release tries to be fairly uniform and interworkable, to make it easier for users. You can read about some of (fairly informal) coding style guidelines we try to use in Biopython in the contributing documentation at http://biopython.org/wiki/Contributing. We also try to add code to the distribution along with tests (see Chapter 19 for more info on the regression testing framework) and documentation, so that everything can stay as workable and well documented as possible (including docstrings). This is, of course, the most ideal situation, under many situations you’ll be able to find other people on the list who will be willing to help add documentation or more tests for your code once you make it available. So, to end this paragraph like the last, feel free to start working!

Please note that to make a code contribution you must have the legal right to contribute it and license it under the Biopython license. If you wrote it all yourself, and it is not based on any other code, this shouldn’t be a problem. However, there are issues if you want to contribute a derivative work - for example something based on GPL or LPGL licenced code would not be compatible with our license. If you have any queries on this, please discuss the issue on the biopython-dev mailing list.

Another point of concern for any additions to Biopython regards any build time or run time dependencies. Generally speaking, writing code to interact with a standalone tool (like BLAST, EMBOSS or ClustalW) doesn’t present a big problem. However, any dependency on another library - even a Python library (especially one needed in order to compile and install Biopython like NumPy) would need further discussion.

Additionally, if you have code that you don’t think fits in the distribution, but that you want to make available, we maintain Script Central (http://biopython.org/wiki/Scriptcentral) which has pointers to freely available code in Python for bioinformatics.

Hopefully this documentation has got you excited enough about Biopython to try it out (and most importantly, contribute!). Thanks for reading all the way through!

Chapter 22  Appendix: Useful stuff about Python

If you haven’t spent a lot of time programming in Python, many questions and problems that come up in using Biopython are often related to Python itself. This section tries to present some ideas and code that come up often (at least for us!) while using the Biopython libraries. If you have any suggestions for useful pointers that could go here, please contribute!

22.1  What the heck is a handle?

Handles are mentioned quite frequently throughout this documentation, and are also fairly confusing (at least to me!). Basically, you can think of a handle as being a “wrapper” around text information.

Handles provide (at least) two benefits over plain text information:

  1. They provide a standard way to deal with information stored in different ways. The text information can be in a file, or in a string stored in memory, or the output from a command line program, or at some remote website, but the handle provides a common way of dealing with information in all of these formats.
  2. They allow text information to be read incrementally, instead of all at once. This is really important when you are dealing with huge text files which would use up all of your memory if you had to load them all.

Handles can deal with text information that is being read (e. g. reading from a file) or written (e. g. writing information to a file). In the case of a “read” handle, commonly used functions are read(), which reads the entire text information from the handle, and readline(), which reads information one line at a time. For “write” handles, the function write() is regularly used.

The most common usage for handles is reading information from a file, which is done using the built-in Python function open. Here, we open a handle to the file m_cold.fasta (also available online here):

>>> handle = open("m_cold.fasta", "r")
>>> handle.readline()
">gi|8332116|gb|BE037100.1|BE037100 MP14H09 MP Mesembryanthemum ...\n"

Handles are regularly used in Biopython for passing information to parsers. For example, since Biopython 1.54 the main functions in Bio.SeqIO and Bio.AlignIO have allowed you to use a filename instead of a handle:

from Bio import SeqIO
for record in SeqIO.parse("m_cold.fasta", "fasta"):
    print(record.id, len(record))

On older versions of Biopython you had to use a handle, e.g.

from Bio import SeqIO
handle = open("m_cold.fasta", "r")
for record in SeqIO.parse(handle, "fasta"):
    print(record.id, len(record))
handle.close()

This pattern is still useful - for example suppose you have a gzip compressed FASTA file you want to parse:

import gzip
from Bio import SeqIO
handle = gzip.open("m_cold.fasta.gz")
for record in SeqIO.parse(handle, "fasta"):
    print(record.id, len(record))
handle.close()

See Section 5.2 for more examples like this, including reading bzip2 compressed files.

22.1.1  Creating a handle from a string

One useful thing is to be able to turn information contained in a string into a handle. The following example shows how to do this using cStringIO from the Python standard library:

>>> my_info = 'A string\n with multiple lines.'
>>> print(my_info)
A string
 with multiple lines.
>>> from StringIO import StringIO
>>> my_info_handle = StringIO(my_info)
>>> first_line = my_info_handle.readline()
>>> print(first_line)
A string
<BLANKLINE>
>>> second_line = my_info_handle.readline()
>>> print(second_line)
 with multiple lines.

References

[1]
Peter J. A. Cock, Tiago Antao, Jeffrey T. Chang, Brad A. Chapman, Cymon J. Cox, Andrew Dalke, Iddo Friedberg, Thomas Hamelryck, Frank Kauff, Bartek Wilczynski, Michiel J. L. de Hoon: “Biopython: freely available Python tools for computational molecular biology and bioinformatics”. Bioinformatics 25 (11), 1422–1423 (2009). doi:10.1093/bioinformatics/btp163,
[2]
Leighton Pritchard, Jennifer A. White, Paul R.J. Birch, Ian K. Toth: “GenomeDiagram: a python package for the visualization of large-scale genomic data”. Bioinformatics 22 (5): 616–617 (2006). doi:10.1093/bioinformatics/btk021,
[3]
Ian K. Toth, Leighton Pritchard, Paul R. J. Birch: “Comparative genomics reveals what makes an enterobacterial plant pathogen”. Annual Review of Phytopathology 44: 305–336 (2006). doi:10.1146/annurev.phyto.44.070505.143444,
[4]
Géraldine A. van der Auwera, Jaroslaw E. Król, Haruo Suzuki, Brian Foster, Rob van Houdt, Celeste J. Brown, Max Mergeay, Eva M. Top: “Plasmids captured in C. metallidurans CH34: defining the PromA family of broad-host-range plasmids”. Antonie van Leeuwenhoek 96 (2): 193–204 (2009). doi:10.1007/s10482-009-9316-9
[5]
Caroline Proux, Douwe van Sinderen, Juan Suarez, Pilar Garcia, Victor Ladero, Gerald F. Fitzgerald, Frank Desiere, Harald Brüssow: “The dilemma of phage taxonomy illustrated by comparative genomics of Sfi21-Like Siphoviridae in lactic acid bacteria”. Journal of Bacteriology 184 (21): 6026–6036 (2002). http://dx.doi.org/10.1128/JB.184.21.6026-6036.2002
[6]
Florian Jupe, Leighton Pritchard, Graham J. Etherington, Katrin MacKenzie, Peter JA Cock, Frank Wright, Sanjeev Kumar Sharma1, Dan Bolser, Glenn J Bryan, Jonathan DG Jones, Ingo Hein: “Identification and localisation of the NB-LRR gene family within the potato genome”. BMC Genomics 13: 75 (2012). http://dx.doi.org/10.1186/1471-2164-13-75
[7]
Peter J. A. Cock, Christopher J. Fields, Naohisa Goto, Michael L. Heuer, Peter M. Rice: “The Sanger FASTQ file format for sequences with quality scores, and the Solexa/Illumina FASTQ variants”. Nucleic Acids Research 38 (6): 1767–1771 (2010). doi:10.1093/nar/gkp1137
[8]
Patrick O. Brown, David Botstein: “Exploring the new world of the genome with DNA microarrays”. Nature Genetics 21 (Supplement 1), 33–37 (1999). doi:10.1038/4462
[9]
Eric Talevich, Brandon M. Invergo, Peter J.A. Cock, Brad A. Chapman: “Bio.Phylo: A unified toolkit for processing, analyzing and visualizing phylogenetic trees in Biopython”. BMC Bioinformatics 13: 209 (2012). doi:10.1186/1471-2105-13-209
[10]
Athel Cornish-Bowden: “Nomenclature for incompletely specified bases in nucleic acid sequences: Recommendations 1984.” Nucleic Acids Research 13 (9): 3021–3030 (1985). doi:10.1093/nar/13.9.3021
[11]
Douglas R. Cavener: “Comparison of the consensus sequence flanking translational start sites in Drosophila and vertebrates.” Nucleic Acids Research 15 (4): 1353–1361 (1987). doi:10.1093/nar/15.4.1353
[12]
Timothy L. Bailey and Charles Elkan: “Fitting a mixture model by expectation maximization to discover motifs in biopolymers”, Proceedings of the Second International Conference on Intelligent Systems for Molecular Biology 28–36. AAAI Press, Menlo Park, California (1994).
[13]
Brad Chapman and Jeff Chang: “Biopython: Python tools for computational biology”. ACM SIGBIO Newsletter 20 (2): 15–19 (August 2000).
[14]
Michiel J. L. de Hoon, Seiya Imoto, John Nolan, Satoru Miyano: “Open source clustering software”. Bioinformatics 20 (9): 1453–1454 (2004). doi:10.1093/bioinformatics/bth078
[15]
Michiel B. Eisen, Paul T. Spellman, Patrick O. Brown, David Botstein: “Cluster analysis and display of genome-wide expression patterns”. Proceedings of the National Academy of Science USA 95 (25): 14863–14868 (1998). doi:10.1073/pnas.96.19.10943-c
[16]
Gene H. Golub, Christian Reinsch: “Singular value decomposition and least squares solutions”. In Handbook for Automatic Computation, 2, (Linear Algebra) (J. H. Wilkinson and C. Reinsch, eds), 134–151. New York: Springer-Verlag (1971).
[17]
Gene H. Golub, Charles F. Van Loan: Matrix computations, 2nd edition (1989).
[18]
Thomas Hamelryck and Bernard Manderick: 11PDB parser and structure class implemented in Python”. Bioinformatics, 19 (17): 2308–2310 (2003) doi: 10.1093/bioinformatics/btg299.
[19]
Thomas Hamelryck: “Efficient identification of side-chain patterns using a multidimensional index tree”. Proteins 51 (1): 96–108 (2003). doi:10.1002/prot.10338
[20]
Thomas Hamelryck: “An amino acid has two sides; A new 2D measure provides a different view of solvent exposure”. Proteins 59 (1): 29–48 (2005). doi:10.1002/prot.20379.
[21]
John A. Hartiga. Clustering algorithms. New York: Wiley (1975).
[22]
Anil L. Jain, Richard C. Dubes: Algorithms for clustering data. Englewood Cliffs, N.J.: Prentice Hall (1988).
[23]
Voratas Kachitvichyanukul, Bruce W. Schmeiser: Binomial Random Variate Generation. Communications of the ACM 31 (2): 216–222 (1988). doi:10.1145/42372.42381
[24]
Teuvo Kohonen: “Self-organizing maps”, 2nd Edition. Berlin; New York: Springer-Verlag (1997).
[25]
Pierre L’Ecuyer: “Efficient and Portable Combined Random Number Generators.” Communications of the ACM 31 (6): 742–749,774 (1988). doi:10.1145/62959.62969
[26]
Indraneel Majumdar, S. Sri Krishna, Nick V. Grishin: “PALSSE: A program to delineate linear secondary structural elements from protein structures.” BMC Bioinformatics, 6: 202 (2005). doi:10.1186/1471-2105-6-202.
[27]
V. Matys, E. Fricke, R. Geffers, E. Gössling, M. Haubrock, R. Hehl, K. Hornischer, D. Karas, A.E. Kel, O.V. Kel-Margoulis, D.U. Kloos, S. Land, B. Lewicki-Potapov, H. Michael, R. Münch, I. Reuter, S. Rotert, H. Saxel, M. Scheer, S. Thiele, E. Wingender E: “TRANSFAC: transcriptional regulation, from patterns to profiles.” Nucleic Acids Research 31 (1): 374–378 (2003). doi:10.1093/nar/gkg108
[28]
Robin Sibson: “SLINK: An optimally efficient algorithm for the single-link cluster method”. The Computer Journal 16 (1): 30–34 (1973). doi:10.1093/comjnl/16.1.30
[29]
George W. Snedecor, William G. Cochran: Statistical methods. Ames, Iowa: Iowa State University Press (1989).
[30]
Pablo Tamayo, Donna Slonim, Jill Mesirov, Qing Zhu, Sutisak Kitareewan, Ethan Dmitrovsky, Eric S. Lander, Todd R. Golub: “Interpreting patterns of gene expression with self-organizing maps: Methods and application to hematopoietic differentiation”. Proceedings of the National Academy of Science USA 96 (6): 2907–2912 (1999). doi:10.1073/pnas.96.6.2907
[31]
Robert C. Tryon, Daniel E. Bailey: Cluster analysis. New York: McGraw-Hill (1970).
[32]
John W. Tukey: “Exploratory data analysis”. Reading, Mass.: Addison-Wesley Pub. Co. (1977).
[33]
Ka Yee Yeung, Walter L. Ruzzo: “Principal Component Analysis for clustering gene expression data”. Bioinformatics 17 (9): 763–774 (2001). doi:10.1093/bioinformatics/17.9.763
[34]
Alok Saldanha: “Java Treeview—extensible visualization of microarray data”. Bioinformatics 20 (17): 3246–3248 (2004). http://dx.doi.org/10.1093/bioinformatics/bth349

This document was translated from LATEX by HEVEA.
biopython-1.63/Doc/Tutorial.tex0000644000175000017500000313301012250104543016103 0ustar tratra00000000000000% This is the main LaTeX file which is used to produce the Biopython % Tutorial documentation. % % If you just want to read the documentation, you can pick up ready-to-go % copies in both pdf and html format from: % % http://biopython.org/DIST/docs/tutorial/Tutorial.html % http://biopython.org/DIST/docs/tutorial/Tutorial.pdf % % If you want to typeset the documentation, you'll need a standard TeX/LaTeX % distribution (I use teTeX, which works great for me on Unix platforms). % Additionally, you need HeVeA (or at least hevea.sty), which can be % found at: % % http://pauillac.inria.fr/~maranget/hevea/index.html % % You will also need the pictures included in the document, some of % which are UMLish diagrams created by Dia % (http://www.lysator.liu.se/~alla/dia/dia.html). % These diagrams are available from Biopython git in the original dia % format, which you can easily save as .png format using Dia itself. % They are also checked in as the png files, so if you make % modifications to the original dia files, the png files should also be % changed. % % Once you're all set, you should be able to generate pdf by running: % % pdflatex Tutorial.tex (to generate the first draft) % pdflatex Tutorial.tex (to get the cross references right) % pdflatex Tutorial.tex (to get the table of contents right) % % To generate the html, you'll need HeVeA installed. You should be % able to just run: % % hevea -fix Tutorial.tex % % However, on older versions of hevea you may first need to remove the % Tutorial.aux file generated by LaTeX, then run hevea twice to get % the references right. % % If you want to typeset this and have problems, please report them % at biopython-dev@biopython.org, and we'll try to get things resolved. We % always love to have people interested in the documentation! \documentclass{report} \usepackage{url} \usepackage{fullpage} \usepackage{hevea} \usepackage{graphicx} % make everything have section numbers \setcounter{secnumdepth}{4} % Make links between references \usepackage{hyperref} \newif\ifpdf \ifx\pdfoutput\undefined \pdffalse \else \pdfoutput=1 \pdftrue \fi \ifpdf \hypersetup{colorlinks=true, hyperindex=true, citecolor=red, urlcolor=blue} \fi \begin{document} \begin{htmlonly} \title{Biopython Tutorial and Cookbook} \end{htmlonly} \begin{latexonly} \title{ %Hack to get the logo on the PDF front page: \includegraphics[width=\textwidth]{images/biopython.jpg}\\ %Hack to get some white space using a blank line: ~\\ Biopython Tutorial and Cookbook} \end{latexonly} \author{Jeff Chang, Brad Chapman, Iddo Friedberg, Thomas Hamelryck, \\ Michiel de Hoon, Peter Cock, Tiago Antao, Eric Talevich, Bartek Wilczy\'{n}ski} \date{Last Update -- 1 December 2013 (Biopython 1.63)} %Hack to get the logo at the start of the HTML front page: %(hopefully this isn't going to be too wide for most people) \begin{rawhtml}

[Biopython Logo]

\end{rawhtml} \maketitle \tableofcontents \chapter{Introduction} \label{chapter:introduction} \section{What is Biopython?} The Biopython Project is an international association of developers of freely available Python (\url{http://www.python.org}) tools for computational molecular biology. Python is an object oriented, interpreted, flexible language that is becoming increasingly popular for scientific computing. Python is easy to learn, has a very clear syntax and can easily be extended with modules written in C, C++ or FORTRAN. The Biopython web site (\url{http://www.biopython.org}) provides an online resource for modules, scripts, and web links for developers of Python-based software for bioinformatics use and research. Basically, the goal of Biopython is to make it as easy as possible to use Python for bioinformatics by creating high-quality, reusable modules and classes. Biopython features include parsers for various Bioinformatics file formats (BLAST, Clustalw, FASTA, Genbank,...), access to online services (NCBI, Expasy,...), interfaces to common and not-so-common programs (Clustalw, DSSP, MSMS...), a standard sequence class, various clustering modules, a KD tree data structure etc. and even documentation. Basically, we just like to program in Python and want to make it as easy as possible to use Python for bioinformatics by creating high-quality, reusable modules and scripts. \section{What can I find in the Biopython package} The main Biopython releases have lots of functionality, including: \begin{itemize} \item The ability to parse bioinformatics files into Python utilizable data structures, including support for the following formats: \begin{itemize} \item Blast output -- both from standalone and WWW Blast \item Clustalw \item FASTA \item GenBank \item PubMed and Medline \item ExPASy files, like Enzyme and Prosite \item SCOP, including `dom' and `lin' files \item UniGene \item SwissProt \end{itemize} \item Files in the supported formats can be iterated over record by record or indexed and accessed via a Dictionary interface. \item Code to deal with popular on-line bioinformatics destinations such as: \begin{itemize} \item NCBI -- Blast, Entrez and PubMed services \item ExPASy -- Swiss-Prot and Prosite entries, as well as Prosite searches \end{itemize} \item Interfaces to common bioinformatics programs such as: \begin{itemize} \item Standalone Blast from NCBI \item Clustalw alignment program \item EMBOSS command line tools \end{itemize} \item A standard sequence class that deals with sequences, ids on sequences, and sequence features. \item Tools for performing common operations on sequences, such as translation, transcription and weight calculations. \item Code to perform classification of data using k Nearest Neighbors, Naive Bayes or Support Vector Machines. \item Code for dealing with alignments, including a standard way to create and deal with substitution matrices. \item Code making it easy to split up parallelizable tasks into separate processes. \item GUI-based programs to do basic sequence manipulations, translations, BLASTing, etc. \item Extensive documentation and help with using the modules, including this file, on-line wiki documentation, the web site, and the mailing list. \item Integration with BioSQL, a sequence database schema also supported by the BioPerl and BioJava projects. \end{itemize} We hope this gives you plenty of reasons to download and start using Biopython! \section{Installing Biopython} All of the installation information for Biopython was separated from this document to make it easier to keep updated. The short version is go to our downloads page (\url{http://biopython.org/wiki/Download}), download and install the listed dependencies, then download and install Biopython. Biopython runs on many platforms (Windows, Mac, and on the various flavors of Linux and Unix). For Windows we provide pre-compiled click-and-run installers, while for Unix and other operating systems you must install from source as described in the included README file. This is usually as simple as the standard commands: \begin{verbatim} python setup.py build python setup.py test sudo python setup.py install \end{verbatim} \noindent (You can in fact skip the build and test, and go straight to the install -- but its better to make sure everything seems to be working.) The longer version of our installation instructions covers installation of Python, Biopython dependencies and Biopython itself. It is available in PDF (\url{http://biopython.org/DIST/docs/install/Installation.pdf}) and HTML formats (\url{http://biopython.org/DIST/docs/install/Installation.html}). \section{Frequently Asked Questions (FAQ)} \begin{enumerate} \item \emph{How do I cite Biopython in a scientific publication?} \\ Please cite our application note \cite[Cock \textit{et al.}, 2009]{cock2009} as the main Biopython reference. In addition, please cite any publications from the following list if appropriate, in particular as a reference for specific modules within Biopython (more information can be found on our website): \begin{itemize} \item For the official project announcement: \cite[Chapman and Chang, 2000]{chapman2000}; \item For \verb+Bio.PDB+: \cite[Hamelryck and Manderick, 2003]{hamelryck2003a}; \item For \verb+Bio.Cluster+: \cite[De Hoon \textit{et al.}, 2004]{dehoon2004}; \item For \verb+Bio.Graphics.GenomeDiagram+: \cite[Pritchard \textit{et al.}, 2006]{pritchard2006}; \item For \verb+Bio.Phylo+ and \verb+Bio.Phylo.PAML+: \cite[Talevich \textit{et al.}, 2012]{talevich2012}; \item For the FASTQ file format as supported in Biopython, BioPerl, BioRuby, BioJava, and EMBOSS: \cite[Cock \textit{et al.}, 2010]{cock2010}. \end{itemize} \item \emph{How should I capitalize ``Biopython''? Is ``BioPython'' OK?} \\ The correct capitalization is ``Biopython'', not ``BioPython'' (even though that would have matched BioPerl, BioJava and BioRuby). \item \emph{What is going wrong with my print commands?} \\ This tutorial now uses the Python 3 style print \emph{function}. As of Biopython 1.62, we support both Python 2 and Python 3. The most obvious language difference is the print \emph{statement} in Python 2 became a print \emph{function} in Python 3. For example, this will only work under Python 2: \begin{verbatim} >>> print "Hello World!" Hello World! \end{verbatim} If you try that on Python 3 you'll get a \verb|SyntaxError|. Under Python 3 you must write: %doctest \begin{verbatim} >>> print("Hello World!") Hello World! \end{verbatim} Surprisingly that will also work on Python 2 -- but only for simple examples printing one thing. In general you need to add this magic line to the start of your Python scripts to use the print function under Python 2.6 and 2.7: \begin{verbatim} from __future__ import print_function \end{verbatim} If you forget to add this magic import, under Python 2 you'll see extra brackets produced by trying to use the print function when Python 2 is interpretting it as a print statement and a tuple. \item \emph{How do I find out what version of Biopython I have installed?} \\ Use this: \begin{verbatim} >>> import Bio >>> print(Bio.__version__) ... \end{verbatim} If the ``\verb|import Bio|'' line fails, Biopython is not installed. If the second line fails, your version is very out of date. If the version string ends with a plus, you don't have an official release, but a snapshot of the in development code. \item \emph{Where is the latest version of this document?}\\ If you download a Biopython source code archive, it will include the relevant version in both HTML and PDF formats. The latest published version of this document (updated at each release) is online: \begin{itemize} \item \url{http://biopython.org/DIST/docs/tutorial/Tutorial.html} \item \url{http://biopython.org/DIST/docs/tutorial/Tutorial.pdf} \end{itemize} If you are using the very latest unreleased code from our repository you can find copies of the in-progress tutorial here: \begin{itemize} \item \url{http://biopython.org/DIST/docs/tutorial/Tutorial-dev.html} \item \url{http://biopython.org/DIST/docs/tutorial/Tutorial-dev.pdf} \end{itemize} \item \emph{Why is the} \verb|Seq| \emph{object missing the upper \& lower methods described in this Tutorial?} \\ You need Biopython 1.53 or later. Alternatively, use \verb|str(my_seq).upper()| to get an upper case string. If you need a Seq object, try \verb|Seq(str(my_seq).upper())| but be careful about blindly re-using the same alphabet. \item \emph{Why doesn't the} \verb|Seq| \emph{object translation method support the} \verb|cds| \emph{option described in this Tutorial?} \\ You need Biopython 1.51 or later. \item \emph{What file formats do} \verb|Bio.SeqIO| \emph{and} \verb|Bio.AlignIO| \emph{read and write?} \\ Check the built in docstrings (\texttt{from Bio import SeqIO}, then \texttt{help(SeqIO)}), or see \url{http://biopython.org/wiki/SeqIO} and \url{http://biopython.org/wiki/AlignIO} on the wiki for the latest listing. \item \emph{Why won't the } \verb|Bio.SeqIO| \emph{and} \verb|Bio.AlignIO| \emph{functions} \verb|parse|\emph{,} \verb|read| \emph{and} \verb|write| \emph{take filenames? They insist on handles!} \\ You need Biopython 1.54 or later, or just use handles explicitly (see Section~\ref{sec:appendix-handles}). It is especially important to remember to close output handles explicitly after writing your data. \item \emph{Why won't the } \verb|Bio.SeqIO.write()| \emph{and} \verb|Bio.AlignIO.write()| \emph{functions accept a single record or alignment? They insist on a list or iterator!} \\ You need Biopython 1.54 or later, or just wrap the item with \verb|[...]| to create a list of one element. \item \emph{Why doesn't} \verb|str(...)| \emph{give me the full sequence of a} \verb|Seq| \emph{object?} \\ You need Biopython 1.45 or later. Alternatively, rather than \verb|str(my_seq)|, use \verb|my_seq.tostring()| (which will also work on recent versions of Biopython). \item \emph{Why doesn't} \verb|Bio.Blast| \emph{work with the latest plain text NCBI blast output?} \\ The NCBI keep tweaking the plain text output from the BLAST tools, and keeping our parser up to date is/was an ongoing struggle. If you aren't using the latest version of Biopython, you could try upgrading. However, we (and the NCBI) recommend you use the XML output instead, which is designed to be read by a computer program. \item \emph{Why doesn't} \verb|Bio.Entrez.parse()| \emph{work? The module imports fine but there is no parse function!} \\ You need Biopython 1.52 or later. \item \emph{Why has my script using} \verb|Bio.Entrez.efetch()| \emph{stopped working?} \\ This could be due to NCBI changes in February 2012 introducing EFetch 2.0. First, they changed the default return modes - you probably want to add \verb|retmode="text"| to your call. Second, they are now stricter about how to provide a list of IDs -- Biopython 1.59 onwards turns a list into a comma separated string automatically. \item \emph{Why doesn't} \verb|Bio.Blast.NCBIWWW.qblast()| \emph{give the same results as the NCBI BLAST website?} \\ You need to specify the same options -- the NCBI often adjust the default settings on the website, and they do not match the QBLAST defaults anymore. Check things like the gap penalties and expectation threshold. \item \emph{Why doesn't} \verb|Bio.Blast.NCBIXML.read()| \emph{work? The module imports but there is no read function!} \\ You need Biopython 1.50 or later. Or, use \texttt{next(Bio.Blast.NCBIXML.parse(...))} instead. \item \emph{Why doesn't my} \verb|SeqRecord| \emph{object have a} \verb|letter_annotations| \emph{attribute?} \\ Per-letter-annotation support was added in Biopython 1.50. \item \emph{Why can't I slice my} \verb|SeqRecord| \emph{to get a sub-record?} \\ You need Biopython 1.50 or later. \item \emph{Why can't I add} \verb|SeqRecord| \emph{objects together?} \\ You need Biopython 1.53 or later. \item \emph{Why doesn't} \verb|Bio.SeqIO.convert()| \emph{or} \verb|Bio.AlignIO.convert()| \emph{work? The modules import fine but there is no convert function!} \\ You need Biopython 1.52 or later. Alternatively, combine the \verb|parse| and \verb|write| functions as described in this tutorial (see Sections~\ref{sec:SeqIO-conversion} and~\ref{sec:converting-alignments}). \item \emph{Why doesn't} \verb|Bio.SeqIO.index()| \emph{work? The module imports fine but there is no index function!} \\ You need Biopython 1.52 or later. \item \emph{Why doesn't} \verb|Bio.SeqIO.index_db()| \emph{work? The module imports fine but there is no \texttt{index\_db} function!} \\ You need Biopython 1.57 or later (and a Python with SQLite3 support). \item \emph{Where is the} \verb|MultipleSeqAlignment| \emph{object? The} \verb|Bio.Align| \emph{module imports fine but this class isn't there!} \\ You need Biopython 1.54 or later. Alternatively, the older \verb|Bio.Align.Generic.Alignment| class supports some of its functionality, but using this is now discouraged. \item \emph{Why can't I run command line tools directly from the application wrappers?} \\ You need Biopython 1.55 or later. Alternatively, use the Python \verb|subprocess| module directly. \item \emph{I looked in a directory for code, but I couldn't find the code that does something. Where's it hidden?} \\ One thing to know is that we put code in \verb|__init__.py| files. If you are not used to looking for code in this file this can be confusing. The reason we do this is to make the imports easier for users. For instance, instead of having to do a ``repetitive'' import like \verb|from Bio.GenBank import GenBank|, you can just use \verb|from Bio import GenBank|. \item \emph{Why does the code from CVS seem out of date?} \\ In late September 2009, just after the release of Biopython 1.52, we switched from using CVS to git, a distributed version control system. The old CVS server will remain available as a static and read only backup, but if you want to grab the latest code, you'll need to use git instead. See our website for more details. \end{enumerate} \noindent For more general questions, the Python FAQ pages \url{http://www.python.org/doc/faq/} may be useful. \chapter{Quick Start -- What can you do with Biopython?} \label{chapter:quick-start} This section is designed to get you started quickly with Biopython, and to give a general overview of what is available and how to use it. All of the examples in this section assume that you have some general working knowledge of Python, and that you have successfully installed Biopython on your system. If you think you need to brush up on your Python, the main Python web site provides quite a bit of free documentation to get started with (\url{http://www.python.org/doc/}). Since much biological work on the computer involves connecting with databases on the internet, some of the examples will also require a working internet connection in order to run. Now that that is all out of the way, let's get into what we can do with Biopython. \section{General overview of what Biopython provides} As mentioned in the introduction, Biopython is a set of libraries to provide the ability to deal with ``things'' of interest to biologists working on the computer. In general this means that you will need to have at least some programming experience (in Python, of course!) or at least an interest in learning to program. Biopython's job is to make your job easier as a programmer by supplying reusable libraries so that you can focus on answering your specific question of interest, instead of focusing on the internals of parsing a particular file format (of course, if you want to help by writing a parser that doesn't exist and contributing it to Biopython, please go ahead!). So Biopython's job is to make you happy! One thing to note about Biopython is that it often provides multiple ways of ``doing the same thing.'' Things have improved in recent releases, but this can still be frustrating as in Python there should ideally be one right way to do something. However, this can also be a real benefit because it gives you lots of flexibility and control over the libraries. The tutorial helps to show you the common or easy ways to do things so that you can just make things work. To learn more about the alternative possibilities, look in the Cookbook (Chapter~\ref{chapter:cookbook}, this has some cools tricks and tips), the Advanced section (Chapter~\ref{chapter:advanced}), the built in ``docstrings'' (via the Python help command, or the \href{http://biopython.org/DIST/docs/api/}{API documentation}) or ultimately the code itself. \section{Working with sequences} \label{sec:sequences} Disputably (of course!), the central object in bioinformatics is the sequence. Thus, we'll start with a quick introduction to the Biopython mechanisms for dealing with sequences, the \verb|Seq| object, which we'll discuss in more detail in Chapter~\ref{chapter:Bio.Seq}. Most of the time when we think about sequences we have in my mind a string of letters like `\verb|AGTACACTGGT|'. You can create such \verb|Seq| object with this sequence as follows - the ``\verb+>>>+'' represents the Python prompt followed by what you would type in: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> my_seq = Seq("AGTACACTGGT") >>> my_seq Seq('AGTACACTGGT', Alphabet()) >>> print(my_seq) AGTACACTGGT >>> my_seq.alphabet Alphabet() \end{verbatim} What we have here is a sequence object with a \emph{generic} alphabet - reflecting the fact we have \emph{not} specified if this is a DNA or protein sequence (okay, a protein with a lot of Alanines, Glycines, Cysteines and Threonines!). We'll talk more about alphabets in Chapter~\ref{chapter:Bio.Seq}. In addition to having an alphabet, the \verb|Seq| object differs from the Python string in the methods it supports. You can't do this with a plain string: %cont-doctest \begin{verbatim} >>> my_seq Seq('AGTACACTGGT', Alphabet()) >>> my_seq.complement() Seq('TCATGTGACCA', Alphabet()) >>> my_seq.reverse_complement() Seq('ACCAGTGTACT', Alphabet()) \end{verbatim} The next most important class is the \verb|SeqRecord| or Sequence Record. This holds a sequence (as a \verb|Seq| object) with additional annotation including an identifier, name and description. The \verb|Bio.SeqIO| module for reading and writing sequence file formats works with \verb|SeqRecord| objects, which will be introduced below and covered in more detail by Chapter~\ref{chapter:Bio.SeqIO}. This covers the basic features and uses of the Biopython sequence class. Now that you've got some idea of what it is like to interact with the Biopython libraries, it's time to delve into the fun, fun world of dealing with biological file formats! \section{A usage example} \label{sec:orchids} Before we jump right into parsers and everything else to do with Biopython, let's set up an example to motivate everything we do and make life more interesting. After all, if there wasn't any biology in this tutorial, why would you want you read it? Since I love plants, I think we're just going to have to have a plant based example (sorry to all the fans of other organisms out there!). Having just completed a recent trip to our local greenhouse, we've suddenly developed an incredible obsession with Lady Slipper Orchids (if you wonder why, have a look at some \href{http://www.flickr.com/search/?q=lady+slipper+orchid&s=int&z=t}{Lady Slipper Orchids photos on Flickr}, or try a \href{http://images.google.com/images?q=lady%20slipper%20orchid}{Google Image Search}). Of course, orchids are not only beautiful to look at, they are also extremely interesting for people studying evolution and systematics. So let's suppose we're thinking about writing a funding proposal to do a molecular study of Lady Slipper evolution, and would like to see what kind of research has already been done and how we can add to that. % Brad's links to Millicent Orchids are dead now (March 2007) % http://www.millicentorchids.com/greenhouse/images/papesq01.jpg % http://www.millicentorchids.com/greenhouse/indexphoto.htm After a little bit of reading up we discover that the Lady Slipper Orchids are in the Orchidaceae family and the Cypripedioideae sub-family and are made up of 5 genera: \emph{Cypripedium}, \emph{Paphiopedilum}, \emph{Phragmipedium}, \emph{Selenipedium} and \emph{Mexipedium}. That gives us enough to get started delving for more information. So, let's look at how the Biopython tools can help us. We'll start with sequence parsing in Section~\ref{sec:sequence-parsing}, but the orchids will be back later on as well - for example we'll search PubMed for papers about orchids and extract sequence data from GenBank in Chapter~\ref{chapter:entrez}, extract data from Swiss-Prot from certain orchid proteins in Chapter~\ref{chapter:swiss_prot}, and work with ClustalW multiple sequence alignments of orchid proteins in Section~\ref{sec:align_clustal}. \section{Parsing sequence file formats} \label{sec:sequence-parsing} A large part of much bioinformatics work involves dealing with the many types of file formats designed to hold biological data. These files are loaded with interesting biological data, and a special challenge is parsing these files into a format so that you can manipulate them with some kind of programming language. However the task of parsing these files can be frustrated by the fact that the formats can change quite regularly, and that formats may contain small subtleties which can break even the most well designed parsers. We are now going to briefly introduce the \verb|Bio.SeqIO| module -- you can find out more in Chapter~\ref{chapter:Bio.SeqIO}. We'll start with an online search for our friends, the lady slipper orchids. To keep this introduction simple, we're just using the NCBI website by hand. Let's just take a look through the nucleotide databases at NCBI, using an Entrez online search (\url{http://www.ncbi.nlm.nih.gov:80/entrez/query.fcgi?db=Nucleotide}) for everything mentioning the text Cypripedioideae (this is the subfamily of lady slipper orchids). When this tutorial was originally written, this search gave us only 94 hits, which we saved as a FASTA formatted text file and as a GenBank formatted text file (files \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{\tt ls\_orchid.fasta} and \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{\tt ls\_orchid.gbk}, also included with the Biopython source code under {\tt docs/tutorial/examples/}). % The GenBank version is actually new - it was created by filtering out the original 94 hits from the % latest search of over 400 hits. If you run the search today, you'll get hundreds of results! When following the tutorial, if you want to see the same list of genes, just download the two files above or copy them from \verb|docs/examples/| in the Biopython source code. In Section~\ref{sec:connecting-with-biological-databases} we will look at how to do a search like this from within Python. \subsection{Simple FASTA parsing example} \label{sec:fasta-parsing} If you open the lady slipper orchids FASTA file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{\tt ls\_orchid.fasta} in your favourite text editor, you'll see that the file starts like this: \begin{verbatim} >gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG ... \end{verbatim} It contains 94 records, each has a line starting with ``\verb+>+'' (greater-than symbol) followed by the sequence on one or more lines. Now try this in Python: \begin{verbatim} from Bio import SeqIO for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"): print(seq_record.id) print(repr(seq_record.seq)) print(len(seq_record)) \end{verbatim} \noindent You should get something like this on your screen: \begin{verbatim} gi|2765658|emb|Z78533.1|CIZ78533 Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet()) 740 ... gi|2765564|emb|Z78439.1|PBZ78439 Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', SingleLetterAlphabet()) 592 \end{verbatim} Notice that the FASTA format does not specify the alphabet, so \verb|Bio.SeqIO| has defaulted to the rather generic \verb|SingleLetterAlphabet()| rather than something DNA specific. \subsection{Simple GenBank parsing example} Now let's load the GenBank file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{\tt ls\_orchid.gbk} instead - notice that the code to do this is almost identical to the snippet used above for the FASTA file - the only difference is we change the filename and the format string: \begin{verbatim} from Bio import SeqIO for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"): print(seq_record.id) print(repr(seq_record.seq)) print(len(seq_record)) \end{verbatim} \noindent This should give: \begin{verbatim} Z78533.1 Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA()) 740 ... Z78439.1 Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA()) 592 \end{verbatim} This time \verb|Bio.SeqIO| has been able to choose a sensible alphabet, IUPAC Ambiguous DNA. You'll also notice that a shorter string has been used as the \verb|seq_record.id| in this case. \subsection{I love parsing -- please don't stop talking about it!} Biopython has a lot of parsers, and each has its own little special niches based on the sequence format it is parsing and all of that. Chapter~\ref{chapter:Bio.SeqIO} covers \verb|Bio.SeqIO| in more detail, while Chapter~\ref{chapter:Bio.AlignIO} introduces \verb|Bio.AlignIO| for sequence alignments. While the most popular file formats have parsers integrated into \verb|Bio.SeqIO| and/or \verb|Bio.AlignIO|, for some of the rarer and unloved file formats there is either no parser at all, or an old parser which has not been linked in yet. Please also check the wiki pages \url{http://biopython.org/wiki/SeqIO} and \url{http://biopython.org/wiki/AlignIO} for the latest information, or ask on the mailing list. The wiki pages should include an up to date list of supported file types, and some additional examples. The next place to look for information about specific parsers and how to do cool things with them is in the Cookbook (Chapter~\ref{chapter:cookbook} of this Tutorial). If you don't find the information you are looking for, please consider helping out your poor overworked documentors and submitting a cookbook entry about it! (once you figure out how to do it, that is!) \section{Connecting with biological databases} \label{sec:connecting-with-biological-databases} One of the very common things that you need to do in bioinformatics is extract information from biological databases. It can be quite tedious to access these databases manually, especially if you have a lot of repetitive work to do. Biopython attempts to save you time and energy by making some on-line databases available from Python scripts. Currently, Biopython has code to extract information from the following databases: \begin{itemize} \item \href{http://www.ncbi.nlm.nih.gov/Entrez/}{Entrez} (and \href{http://www.ncbi.nlm.nih.gov/PubMed/}{PubMed}) from the NCBI -- See Chapter~\ref{chapter:entrez}. \item \href{http://www.expasy.org/}{ExPASy} -- See Chapter~\ref{chapter:swiss_prot}. \item \href{http://scop.mrc-lmb.cam.ac.uk/scop/}{SCOP} -- See the \verb|Bio.SCOP.search()| function. \end{itemize} The code in these modules basically makes it easy to write Python code that interact with the CGI scripts on these pages, so that you can get results in an easy to deal with format. In some cases, the results can be tightly integrated with the Biopython parsers to make it even easier to extract information. \section{What to do next} Now that you've made it this far, you hopefully have a good understanding of the basics of Biopython and are ready to start using it for doing useful work. The best thing to do now is finish reading this tutorial, and then if you want start snooping around in the source code, and looking at the automatically generated documentation. Once you get a picture of what you want to do, and what libraries in Biopython will do it, you should take a peak at the Cookbook (Chapter~\ref{chapter:cookbook}), which may have example code to do something similar to what you want to do. If you know what you want to do, but can't figure out how to do it, please feel free to post questions to the main Biopython list (see \url{http://biopython.org/wiki/Mailing_lists}). This will not only help us answer your question, it will also allow us to improve the documentation so it can help the next person do what you want to do. Enjoy the code! \chapter{Sequence objects} \label{chapter:Bio.Seq} Biological sequences are arguably the central object in Bioinformatics, and in this chapter we'll introduce the Biopython mechanism for dealing with sequences, the \verb|Seq| object. Chapter~\ref{chapter:SeqRecord} will introduce the related \verb|SeqRecord| object, which combines the sequence information with any annotation, used again in Chapter~\ref{chapter:Bio.SeqIO} for Sequence Input/Output. Sequences are essentially strings of letters like \verb|AGTACACTGGT|, which seems very natural since this is the most common way that sequences are seen in biological file formats. There are two important differences between \verb|Seq| objects and standard Python strings. First of all, they have different methods. Although the \verb|Seq| object supports many of the same methods as a plain string, its \verb|translate()| method differs by doing biological translation, and there are also additional biologically relevant methods like \verb|reverse_complement()|. Secondly, the \verb|Seq| object has an important attribute, \verb|alphabet|, which is an object describing what the individual characters making up the sequence string ``mean'', and how they should be interpreted. For example, is \verb|AGTACACTGGT| a DNA sequence, or just a protein sequence that happens to be rich in Alanines, Glycines, Cysteines and Threonines? \section{Sequences and Alphabets} The alphabet object is perhaps the important thing that makes the \verb|Seq| object more than just a string. The currently available alphabets for Biopython are defined in the \verb|Bio.Alphabet| module. We'll use the IUPAC alphabets (\url{http://www.chem.qmw.ac.uk/iupac/}) here to deal with some of our favorite objects: DNA, RNA and Proteins. \verb|Bio.Alphabet.IUPAC| provides basic definitions for proteins, DNA and RNA, but additionally provides the ability to extend and customize the basic definitions. For instance, for proteins, there is a basic IUPACProtein class, but there is an additional ExtendedIUPACProtein class providing for the additional elements ``U'' (or ``Sec'' for selenocysteine) and ``O'' (or ``Pyl'' for pyrrolysine), plus the ambiguous symbols ``B'' (or ``Asx'' for asparagine or aspartic acid), ``Z'' (or ``Glx'' for glutamine or glutamic acid), ``J'' (or ``Xle'' for leucine isoleucine) and ``X'' (or ``Xxx'' for an unknown amino acid). For DNA you've got choices of IUPACUnambiguousDNA, which provides for just the basic letters, IUPACAmbiguousDNA (which provides for ambiguity letters for every possible situation) and ExtendedIUPACDNA, which allows letters for modified bases. Similarly, RNA can be represented by IUPACAmbiguousRNA or IUPACUnambiguousRNA. The advantages of having an alphabet class are two fold. First, this gives an idea of the type of information the Seq object contains. Secondly, this provides a means of constraining the information, as a means of type checking. Now that we know what we are dealing with, let's look at how to utilize this class to do interesting work. You can create an ambiguous sequence with the default generic alphabet like this: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> my_seq = Seq("AGTACACTGGT") >>> my_seq Seq('AGTACACTGGT', Alphabet()) >>> my_seq.alphabet Alphabet() \end{verbatim} However, where possible you should specify the alphabet explicitly when creating your sequence objects - in this case an unambiguous DNA alphabet object: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq("AGTACACTGGT", IUPAC.unambiguous_dna) >>> my_seq Seq('AGTACACTGGT', IUPACUnambiguousDNA()) >>> my_seq.alphabet IUPACUnambiguousDNA() \end{verbatim} Unless of course, this really is an amino acid sequence: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_prot = Seq("AGTACACTGGT", IUPAC.protein) >>> my_prot Seq('AGTACACTGGT', IUPACProtein()) >>> my_prot.alphabet IUPACProtein() \end{verbatim} \section{Sequences act like strings} In many ways, we can deal with Seq objects as if they were normal Python strings, for example getting the length, or iterating over the elements: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq("GATCG", IUPAC.unambiguous_dna) >>> for index, letter in enumerate(my_seq): ... print("%i %s" % (index, letter)) 0 G 1 A 2 T 3 C 4 G >>> print(len(my_seq)) 5 \end{verbatim} You can access elements of the sequence in the same way as for strings (but remember, Python counts from zero!): %cont-doctest \begin{verbatim} >>> print(my_seq[0]) #first letter G >>> print(my_seq[2]) #third letter T >>> print(my_seq[-1]) #last letter G \end{verbatim} The \verb|Seq| object has a \verb|.count()| method, just like a string. Note that this means that like a Python string, this gives a \emph{non-overlapping} count: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> "AAAA".count("AA") 2 >>> Seq("AAAA").count("AA") 2 \end{verbatim} \noindent For some biological uses, you may actually want an overlapping count (i.e. $3$ in this trivial example). When searching for single letters, this makes no difference: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPAC.unambiguous_dna) >>> len(my_seq) 32 >>> my_seq.count("G") 9 >>> 100 * float(my_seq.count("G") + my_seq.count("C")) / len(my_seq) 46.875 \end{verbatim} While you could use the above snippet of code to calculate a GC\%, note that the \verb|Bio.SeqUtils| module has several GC functions already built. For example: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> from Bio.SeqUtils import GC >>> my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPAC.unambiguous_dna) >>> GC(my_seq) 46.875 \end{verbatim} \noindent Note that using the \verb|Bio.SeqUtils.GC()| function should automatically cope with mixed case sequences and the ambiguous nucleotide S which means G or C. Also note that just like a normal Python string, the \verb|Seq| object is in some ways ``read-only''. If you need to edit your sequence, for example simulating a point mutation, look at the Section~\ref{sec:mutable-seq} below which talks about the \verb|MutableSeq| object. \section{Slicing a sequence} A more complicated example, let's get a slice of the sequence: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna) >>> my_seq[4:12] Seq('GATGGGCC', IUPACUnambiguousDNA()) \end{verbatim} Two things are interesting to note. First, this follows the normal conventions for Python strings. So the first element of the sequence is 0 (which is normal for computer science, but not so normal for biology). When you do a slice the first item is included (i.e.~4 in this case) and the last is excluded (12 in this case), which is the way things work in Python, but of course not necessarily the way everyone in the world would expect. The main goal is to stay consistent with what Python does. The second thing to notice is that the slice is performed on the sequence data string, but the new object produced is another \verb|Seq| object which retains the alphabet information from the original \verb|Seq| object. Also like a Python string, you can do slices with a start, stop and \emph{stride} (the step size, which defaults to one). For example, we can get the first, second and third codon positions of this DNA sequence: %cont-doctest \begin{verbatim} >>> my_seq[0::3] Seq('GCTGTAGTAAG', IUPACUnambiguousDNA()) >>> my_seq[1::3] Seq('AGGCATGCATC', IUPACUnambiguousDNA()) >>> my_seq[2::3] Seq('TAGCTAAGAC', IUPACUnambiguousDNA()) \end{verbatim} Another stride trick you might have seen with a Python string is the use of a -1 stride to reverse the string. You can do this with a \verb|Seq| object too: %cont-doctest \begin{verbatim} >>> my_seq[::-1] Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG', IUPACUnambiguousDNA()) \end{verbatim} \section{Turning Seq objects into strings} \label{sec:seq-to-string} If you really do just need a plain string, for example to write to a file, or insert into a database, then this is very easy to get: %cont-doctest \begin{verbatim} >>> str(my_seq) 'GATCGATGGGCCTATATAGGATCGAAAATCGC' \end{verbatim} Since calling \verb|str()| on a \verb|Seq| object returns the full sequence as a string, you often don't actually have to do this conversion explicitly. Python does this automatically in the print function (and the print statement under Python 2): %cont-doctest \begin{verbatim} >>> print(my_seq) GATCGATGGGCCTATATAGGATCGAAAATCGC \end{verbatim} You can also use the \verb|Seq| object directly with a \verb|%s| placeholder when using the Python string formatting or interpolation operator (\verb|%|): %cont-doctest \begin{verbatim} >>> fasta_format_string = ">Name\n%s\n" % my_seq >>> print(fasta_format_string) >Name GATCGATGGGCCTATATAGGATCGAAAATCGC \end{verbatim} \noindent This line of code constructs a simple FASTA format record (without worrying about line wrapping). Section~\ref{sec:SeqRecord-format} describes a neat way to get a FASTA formatted string from a \verb|SeqRecord| object, while the more general topic of reading and writing FASTA format sequence files is covered in Chapter~\ref{chapter:Bio.SeqIO}. \emph{NOTE:} If you are using Biopython 1.44 or older, using \verb|str(my_seq)| will give just a truncated representation. Instead use \verb|my_seq.tostring()| (which is still available in the current Biopython releases for backwards compatibility): %cont-doctest \begin{verbatim} >>> my_seq.tostring() 'GATCGATGGGCCTATATAGGATCGAAAATCGC' \end{verbatim} \section{Concatenating or adding sequences} Naturally, you can in principle add any two Seq objects together - just like you can with Python strings to concatenate them. However, you can't add sequences with incompatible alphabets, such as a protein sequence and a DNA sequence: %doctest \begin{verbatim} >>> from Bio.Alphabet import IUPAC >>> from Bio.Seq import Seq >>> protein_seq = Seq("EVRNAK", IUPAC.protein) >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna) >>> protein_seq + dna_seq Traceback (most recent call last): ... TypeError: Incompatible alphabets IUPACProtein() and IUPACUnambiguousDNA() \end{verbatim} If you \emph{really} wanted to do this, you'd have to first give both sequences generic alphabets: %cont-doctest \begin{verbatim} >>> from Bio.Alphabet import generic_alphabet >>> protein_seq.alphabet = generic_alphabet >>> dna_seq.alphabet = generic_alphabet >>> protein_seq + dna_seq Seq('EVRNAKACGT', Alphabet()) \end{verbatim} Here is an example of adding a generic nucleotide sequence to an unambiguous IUPAC DNA sequence, resulting in an ambiguous nucleotide sequence: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import generic_nucleotide >>> from Bio.Alphabet import IUPAC >>> nuc_seq = Seq("GATCGATGC", generic_nucleotide) >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna) >>> nuc_seq Seq('GATCGATGC', NucleotideAlphabet()) >>> dna_seq Seq('ACGT', IUPACUnambiguousDNA()) >>> nuc_seq + dna_seq Seq('GATCGATGCACGT', NucleotideAlphabet()) \end{verbatim} \section{Changing case} Python strings have very useful \verb|upper| and \verb|lower| methods for changing the case. As of Biopython 1.53, the \verb|Seq| object gained similar methods which are alphabet aware. For example, %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import generic_dna >>> dna_seq = Seq("acgtACGT", generic_dna) >>> dna_seq Seq('acgtACGT', DNAAlphabet()) >>> dna_seq.upper() Seq('ACGTACGT', DNAAlphabet()) >>> dna_seq.lower() Seq('acgtacgt', DNAAlphabet()) \end{verbatim} These are useful for doing case insensitive matching: %cont-doctest \begin{verbatim} >>> "GTAC" in dna_seq False >>> "GTAC" in dna_seq.upper() True \end{verbatim} Note that strictly speaking the IUPAC alphabets are for upper case sequences only, thus: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna) >>> dna_seq Seq('ACGT', IUPACUnambiguousDNA()) >>> dna_seq.lower() Seq('acgt', DNAAlphabet()) \end{verbatim} \section{Nucleotide sequences and (reverse) complements} \label{sec:seq-reverse-complement} For nucleotide sequences, you can easily obtain the complement or reverse complement of a \verb|Seq| object using its built-in methods: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna) >>> my_seq Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPACUnambiguousDNA()) >>> my_seq.complement() Seq('CTAGCTACCCGGATATATCCTAGCTTTTAGCG', IUPACUnambiguousDNA()) >>> my_seq.reverse_complement() Seq('GCGATTTTCGATCCTATATAGGCCCATCGATC', IUPACUnambiguousDNA()) \end{verbatim} As mentioned earlier, an easy way to just reverse a \verb|Seq| object (or a Python string) is slice it with -1 step: %cont-doctest \begin{verbatim} >>> my_seq[::-1] Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG', IUPACUnambiguousDNA()) \end{verbatim} In all of these operations, the alphabet property is maintained. This is very useful in case you accidentally end up trying to do something weird like take the (reverse)complement of a protein sequence: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> protein_seq = Seq("EVRNAK", IUPAC.protein) >>> protein_seq.complement() Traceback (most recent call last): ... ValueError: Proteins do not have complements! \end{verbatim} The example in Section~\ref{sec:SeqIO-reverse-complement} combines the \verb|Seq| object's reverse complement method with \verb|Bio.SeqIO| for sequence input/output. \section{Transcription} Before talking about transcription, I want to try and clarify the strand issue. Consider the following (made up) stretch of double stranded DNA which encodes a short peptide: \begin{tabular}{rcl} \\ & {\small DNA coding strand (aka Crick strand, strand $+1$)} & \\ 5' & \texttt{ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG} & 3' \\ & \texttt{|||||||||||||||||||||||||||||||||||||||} & \\ 3' & \texttt{TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC} & 5' \\ & {\small DNA template strand (aka Watson strand, strand $-1$)} & \\ \\ & {\LARGE $|$} &\\ & Transcription & \\ & {\LARGE $\downarrow$} &\\ \\ 5' & \texttt{AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG} & 3' \\ & {\small Single stranded messenger RNA} & \\ \\ \end{tabular} The actual biological transcription process works from the template strand, doing a reverse complement (TCAG $\rightarrow$ CUGA) to give the mRNA. However, in Biopython and bioinformatics in general, we typically work directly with the coding strand because this means we can get the mRNA sequence just by switching T $\rightarrow$ U. Now let's actually get down to doing a transcription in Biopython. First, let's create \verb|Seq| objects for the coding and template DNA strands: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna) >>> coding_dna Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA()) >>> template_dna = coding_dna.reverse_complement() >>> template_dna Seq('CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT', IUPACUnambiguousDNA()) \end{verbatim} \noindent These should match the figure above - remember by convention nucleotide sequences are normally read from the 5' to 3' direction, while in the figure the template strand is shown reversed. Now let's transcribe the coding strand into the corresponding mRNA, using the \verb|Seq| object's built in \verb|transcribe| method: %cont-doctest \begin{verbatim} >>> coding_dna Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA()) >>> messenger_rna = coding_dna.transcribe() >>> messenger_rna Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA()) \end{verbatim} \noindent As you can see, all this does is switch T $\rightarrow$ U, and adjust the alphabet. If you do want to do a true biological transcription starting with the template strand, then this becomes a two-step process: %cont-doctest \begin{verbatim} >>> template_dna.reverse_complement().transcribe() Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA()) \end{verbatim} The \verb|Seq| object also includes a back-transcription method for going from the mRNA to the coding strand of the DNA. Again, this is a simple U $\rightarrow$ T substitution and associated change of alphabet: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG", IUPAC.unambiguous_rna) >>> messenger_rna Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA()) >>> messenger_rna.back_transcribe() Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA()) \end{verbatim} \emph{Note:} The \verb|Seq| object's \verb|transcribe| and \verb|back_transcribe| methods were added in Biopython 1.49. For older releases you would have to use the \verb|Bio.Seq| module's functions instead, see Section~\ref{sec:seq-module-functions}. \section{Translation} \label{sec:translation} Sticking with the same example discussed in the transcription section above, now let's translate this mRNA into the corresponding protein sequence - again taking advantage of one of the \verb|Seq| object's biological methods: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG", IUPAC.unambiguous_rna) >>> messenger_rna Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG', IUPACUnambiguousRNA()) >>> messenger_rna.translate() Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*')) \end{verbatim} You can also translate directly from the coding strand DNA sequence: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna) >>> coding_dna Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG', IUPACUnambiguousDNA()) >>> coding_dna.translate() Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*')) \end{verbatim} You should notice in the above protein sequences that in addition to the end stop character, there is an internal stop as well. This was a deliberate choice of example, as it gives an excuse to talk about some optional arguments, including different translation tables (Genetic Codes). The translation tables available in Biopython are based on those \href{http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi}{from the NCBI} (see the next section of this tutorial). By default, translation will use the \emph{standard} genetic code (NCBI table id 1). Suppose we are dealing with a mitochondrial sequence. We need to tell the translation function to use the relevant genetic code instead: %cont-doctest \begin{verbatim} >>> coding_dna.translate(table="Vertebrate Mitochondrial") Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*')) \end{verbatim} You can also specify the table using the NCBI table number which is shorter, and often included in the feature annotation of GenBank files: %cont-doctest \begin{verbatim} >>> coding_dna.translate(table=2) Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*')) \end{verbatim} Now, you may want to translate the nucleotides up to the first in frame stop codon, and then stop (as happens in nature): %cont-doctest \begin{verbatim} >>> coding_dna.translate() Seq('MAIVMGR*KGAR*', HasStopCodon(IUPACProtein(), '*')) >>> coding_dna.translate(to_stop=True) Seq('MAIVMGR', IUPACProtein()) >>> coding_dna.translate(table=2) Seq('MAIVMGRWKGAR*', HasStopCodon(IUPACProtein(), '*')) >>> coding_dna.translate(table=2, to_stop=True) Seq('MAIVMGRWKGAR', IUPACProtein()) \end{verbatim} \noindent Notice that when you use the \verb|to_stop| argument, the stop codon itself is not translated - and the stop symbol is not included at the end of your protein sequence. You can even specify the stop symbol if you don't like the default asterisk: %cont-doctest \begin{verbatim} >>> coding_dna.translate(table=2, stop_symbol="@") Seq('MAIVMGRWKGAR@', HasStopCodon(IUPACProtein(), '@')) \end{verbatim} Now, suppose you have a complete coding sequence CDS, which is to say a nucleotide sequence (e.g. mRNA -- after any splicing) which is a whole number of codons (i.e. the length is a multiple of three), commences with a start codon, ends with a stop codon, and has no internal in-frame stop codons. In general, given a complete CDS, the default translate method will do what you want (perhaps with the \verb|to_stop| option). However, what if your sequence uses a non-standard start codon? This happens a lot in bacteria -- for example the gene yaaX in \texttt{E. coli} K12: %TODO - handle line wrapping in doctest? \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import generic_dna >>> gene = Seq("GTGAAAAAGATGCAATCTATCGTACTCGCACTTTCCCTGGTTCTGGTCGCTCCCATGGCA" + \ ... "GCACAGGCTGCGGAAATTACGTTAGTCCCGTCAGTAAAATTACAGATAGGCGATCGTGAT" + \ ... "AATCGTGGCTATTACTGGGATGGAGGTCACTGGCGCGACCACGGCTGGTGGAAACAACAT" + \ ... "TATGAATGGCGAGGCAATCGCTGGCACCTACACGGACCGCCGCCACCGCCGCGCCACCAT" + \ ... "AAGAAAGCTCCTCATGATCATCACGGCGGTCATGGTCCAGGCAAACATCACCGCTAA", ... generic_dna) >>> gene.translate(table="Bacterial") Seq('VKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HR*', HasStopCodon(ExtendedIUPACProtein(), '*') >>> gene.translate(table="Bacterial", to_stop=True) Seq('VKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR', ExtendedIUPACProtein()) \end{verbatim} \noindent In the bacterial genetic code \texttt{GTG} is a valid start codon, and while it does \emph{normally} encode Valine, if used as a start codon it should be translated as methionine. This happens if you tell Biopython your sequence is a complete CDS: %TODO - handle line wrapping in doctest? \begin{verbatim} >>> gene.translate(table="Bacterial", cds=True) Seq('MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR', ExtendedIUPACProtein()) \end{verbatim} In addition to telling Biopython to translate an alternative start codon as methionine, using this option also makes sure your sequence really is a valid CDS (you'll get an exception if not). The example in Section~\ref{sec:SeqIO-translate} combines the \verb|Seq| object's translate method with \verb|Bio.SeqIO| for sequence input/output. \section{Translation Tables} In the previous sections we talked about the \verb|Seq| object translation method (and mentioned the equivalent function in the \verb|Bio.Seq| module -- see Section~\ref{sec:seq-module-functions}). Internally these use codon table objects derived from the NCBI information at \url{ftp://ftp.ncbi.nlm.nih.gov/entrez/misc/data/gc.prt}, also shown on \url{http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi} in a much more readable layout. As before, let's just focus on two choices: the Standard translation table, and the translation table for Vertebrate Mitochondrial DNA. %doctest \begin{verbatim} >>> from Bio.Data import CodonTable >>> standard_table = CodonTable.unambiguous_dna_by_name["Standard"] >>> mito_table = CodonTable.unambiguous_dna_by_name["Vertebrate Mitochondrial"] \end{verbatim} Alternatively, these tables are labeled with ID numbers 1 and 2, respectively: %cont-doctest \begin{verbatim} >>> from Bio.Data import CodonTable >>> standard_table = CodonTable.unambiguous_dna_by_id[1] >>> mito_table = CodonTable.unambiguous_dna_by_id[2] \end{verbatim} You can compare the actual tables visually by printing them: %TODO - handle automatically in doctest? \begin{verbatim} >>> print(standard_table) Table 1 Standard, SGC0 | T | C | A | G | --+---------+---------+---------+---------+-- T | TTT F | TCT S | TAT Y | TGT C | T T | TTC F | TCC S | TAC Y | TGC C | C T | TTA L | TCA S | TAA Stop| TGA Stop| A T | TTG L(s)| TCG S | TAG Stop| TGG W | G --+---------+---------+---------+---------+-- C | CTT L | CCT P | CAT H | CGT R | T C | CTC L | CCC P | CAC H | CGC R | C C | CTA L | CCA P | CAA Q | CGA R | A C | CTG L(s)| CCG P | CAG Q | CGG R | G --+---------+---------+---------+---------+-- A | ATT I | ACT T | AAT N | AGT S | T A | ATC I | ACC T | AAC N | AGC S | C A | ATA I | ACA T | AAA K | AGA R | A A | ATG M(s)| ACG T | AAG K | AGG R | G --+---------+---------+---------+---------+-- G | GTT V | GCT A | GAT D | GGT G | T G | GTC V | GCC A | GAC D | GGC G | C G | GTA V | GCA A | GAA E | GGA G | A G | GTG V | GCG A | GAG E | GGG G | G --+---------+---------+---------+---------+-- \end{verbatim} \noindent and: \begin{verbatim} >>> print(mito_table) Table 2 Vertebrate Mitochondrial, SGC1 | T | C | A | G | --+---------+---------+---------+---------+-- T | TTT F | TCT S | TAT Y | TGT C | T T | TTC F | TCC S | TAC Y | TGC C | C T | TTA L | TCA S | TAA Stop| TGA W | A T | TTG L | TCG S | TAG Stop| TGG W | G --+---------+---------+---------+---------+-- C | CTT L | CCT P | CAT H | CGT R | T C | CTC L | CCC P | CAC H | CGC R | C C | CTA L | CCA P | CAA Q | CGA R | A C | CTG L | CCG P | CAG Q | CGG R | G --+---------+---------+---------+---------+-- A | ATT I(s)| ACT T | AAT N | AGT S | T A | ATC I(s)| ACC T | AAC N | AGC S | C A | ATA M(s)| ACA T | AAA K | AGA Stop| A A | ATG M(s)| ACG T | AAG K | AGG Stop| G --+---------+---------+---------+---------+-- G | GTT V | GCT A | GAT D | GGT G | T G | GTC V | GCC A | GAC D | GGC G | C G | GTA V | GCA A | GAA E | GGA G | A G | GTG V(s)| GCG A | GAG E | GGG G | G --+---------+---------+---------+---------+-- \end{verbatim} You may find these following properties useful -- for example if you are trying to do your own gene finding: %cont-doctest \begin{verbatim} >>> mito_table.stop_codons ['TAA', 'TAG', 'AGA', 'AGG'] >>> mito_table.start_codons ['ATT', 'ATC', 'ATA', 'ATG', 'GTG'] >>> mito_table.forward_table["ACG"] 'T' \end{verbatim} \section{Comparing Seq objects} \label{sec:seq-comparison} Sequence comparison is actually a very complicated topic, and there is no easy way to decide if two sequences are equal. The basic problem is the meaning of the letters in a sequence are context dependent - the letter ``A'' could be part of a DNA, RNA or protein sequence. Biopython uses alphabet objects as part of each \verb|Seq| object to try and capture this information - so comparing two \verb|Seq| objects means considering both the sequence strings \emph{and} the alphabets. For example, you might argue that the two DNA \verb|Seq| objects \texttt{Seq("ACGT", IUPAC.unambiguous\_dna)} and \texttt{Seq("ACGT", IUPAC.ambiguous\_dna)} should be equal, even though they do have different alphabets. Depending on the context this could be important. This gets worse -- suppose you think \texttt{Seq("ACGT", IUPAC.unambiguous\_dna)} and \texttt{Seq("ACGT")} (i.e. the default generic alphabet) should be equal. Then, logically, \texttt{Seq("ACGT", IUPAC.protein)} and \texttt{Seq("ACGT")} should also be equal. Now, in logic if $A=B$ and $B=C$, by transitivity we expect $A=C$. So for logical consistency we'd require \texttt{Seq("ACGT", IUPAC.unambiguous\_dna)} and \texttt{Seq("ACGT", IUPAC.protein)} to be equal -- which most people would agree is just not right. This transitivity problem would also have implications for using \verb|Seq| objects as Python dictionary keys. %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> seq1 = Seq("ACGT", IUPAC.unambiguous_dna) >>> seq2 = Seq("ACGT", IUPAC.unambiguous_dna) \end{verbatim} So, what does Biopython do? Well, the equality test is the default for Python objects -- it tests to see if they are the same object in memory. This is a very strict test: %TODO - silence FutureWarning from this doctest? \begin{verbatim} >>> seq1 == seq2 False >>> seq1 == seq1 True \end{verbatim} If you actually want to do this, you can be more explicit by using the Python \verb|id| function, %cont-doctest \begin{verbatim} >>> id(seq1) == id(seq2) False >>> id(seq1) == id(seq1) True \end{verbatim} Now, in every day use, your sequences will probably all have the same alphabet, or at least all be the same type of sequence (all DNA, all RNA, or all protein). What you probably want is to just compare the sequences as strings -- so do this explicitly: %cont-doctest \begin{verbatim} >>> str(seq1) == str(seq2) True >>> str(seq1) == str(seq1) True \end{verbatim} \noindent As an extension to this, while you can use a Python dictionary with \verb|Seq| objects as keys, it is generally more useful to use the sequence a string for the key. See also Section~\ref{sec:seq-to-string}. \section{MutableSeq objects} \label{sec:mutable-seq} Just like the normal Python string, the \verb|Seq| object is ``read only'', or in Python terminology, immutable. Apart from wanting the \verb|Seq| object to act like a string, this is also a useful default since in many biological applications you want to ensure you are not changing your sequence data: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.Alphabet import IUPAC >>> my_seq = Seq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna) \end{verbatim} Observe what happens if you try to edit the sequence: %TODO - This is not a doctest as Python 2.4 output omits the object name. \begin{verbatim} >>> my_seq[5] = "G" Traceback (most recent call last): ... TypeError: 'Seq' object does not support item assignment \end{verbatim} However, you can convert it into a mutable sequence (a \verb|MutableSeq| object) and do pretty much anything you want with it: %cont-doctest \begin{verbatim} >>> mutable_seq = my_seq.tomutable() >>> mutable_seq MutableSeq('GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA()) \end{verbatim} Alternatively, you can create a \verb|MutableSeq| object directly from a string: %doctest \begin{verbatim} >>> from Bio.Seq import MutableSeq >>> from Bio.Alphabet import IUPAC >>> mutable_seq = MutableSeq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna) \end{verbatim} Either way will give you a sequence object which can be changed: %cont-doctest \begin{verbatim} >>> mutable_seq MutableSeq('GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA()) >>> mutable_seq[5] = "C" >>> mutable_seq MutableSeq('GCCATCGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA()) >>> mutable_seq.remove("T") >>> mutable_seq MutableSeq('GCCACGTAATGGGCCGCTGAAAGGGTGCCCGA', IUPACUnambiguousDNA()) >>> mutable_seq.reverse() >>> mutable_seq MutableSeq('AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG', IUPACUnambiguousDNA()) \end{verbatim} Do note that unlike the \verb|Seq| object, the \verb|MutableSeq| object's methods like \verb|reverse_complement()| and \verb|reverse()| act in-situ! An important technical difference between mutable and immutable objects in Python means that you can't use a \verb|MutableSeq| object as a dictionary key, but you can use a Python string or a \verb|Seq| object in this way. Once you have finished editing your a \verb|MutableSeq| object, it's easy to get back to a read-only \verb|Seq| object should you need to: %cont-doctest \begin{verbatim} >>> new_seq = mutable_seq.toseq() >>> new_seq Seq('AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG', IUPACUnambiguousDNA()) \end{verbatim} You can also get a string from a \verb|MutableSeq| object just like from a \verb|Seq| object (Section~\ref{sec:seq-to-string}). \section{UnknownSeq objects} The \verb|UnknownSeq| object is a subclass of the basic \verb|Seq| object and its purpose is to represent a sequence where we know the length, but not the actual letters making it up. You could of course use a normal \verb|Seq| object in this situation, but it wastes rather a lot of memory to hold a string of a million ``N'' characters when you could just store a single letter ``N'' and the desired length as an integer. %doctest \begin{verbatim} >>> from Bio.Seq import UnknownSeq >>> unk = UnknownSeq(20) >>> unk UnknownSeq(20, alphabet = Alphabet(), character = '?') >>> print(unk) ???????????????????? >>> len(unk) 20 \end{verbatim} You can of course specify an alphabet, meaning for nucleotide sequences the letter defaults to ``N'' and for proteins ``X'', rather than just ``?''. %cont-doctest \begin{verbatim} >>> from Bio.Seq import UnknownSeq >>> from Bio.Alphabet import IUPAC >>> unk_dna = UnknownSeq(20, alphabet=IUPAC.ambiguous_dna) >>> unk_dna UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N') >>> print(unk_dna) NNNNNNNNNNNNNNNNNNNN \end{verbatim} You can use all the usual \verb|Seq| object methods too, note these give back memory saving \verb|UnknownSeq| objects where appropriate as you might expect: %cont-doctest \begin{verbatim} >>> unk_dna UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N') >>> unk_dna.complement() UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N') >>> unk_dna.reverse_complement() UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = 'N') >>> unk_dna.transcribe() UnknownSeq(20, alphabet = IUPACAmbiguousRNA(), character = 'N') >>> unk_protein = unk_dna.translate() >>> unk_protein UnknownSeq(6, alphabet = ProteinAlphabet(), character = 'X') >>> print(unk_protein) XXXXXX >>> len(unk_protein) 6 \end{verbatim} You may be able to find a use for the \verb|UnknownSeq| object in your own code, but it is more likely that you will first come across them in a \verb|SeqRecord| object created by \verb|Bio.SeqIO| (see Chapter~\ref{chapter:Bio.SeqIO}). Some sequence file formats don't always include the actual sequence, for example GenBank and EMBL files may include a list of features but for the sequence just present the contig information. Alternatively, the QUAL files used in sequencing work hold quality scores but they \emph{never} contain a sequence -- instead there is a partner FASTA file which \emph{does} have the sequence. \section{Working with strings directly} \label{sec:seq-module-functions} To close this chapter, for those you who \emph{really} don't want to use the sequence objects (or who prefer a functional programming style to an object orientated one), there are module level functions in \verb|Bio.Seq| will accept plain Python strings, \verb|Seq| objects (including \verb|UnknownSeq| objects) or \verb|MutableSeq| objects: %doctest \begin{verbatim} >>> from Bio.Seq import reverse_complement, transcribe, back_transcribe, translate >>> my_string = "GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG" >>> reverse_complement(my_string) 'CTAACCAGCAGCACGACCACCCTTCCAACGACCCATAACAGC' >>> transcribe(my_string) 'GCUGUUAUGGGUCGUUGGAAGGGUGGUCGUGCUGCUGGUUAG' >>> back_transcribe(my_string) 'GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG' >>> translate(my_string) 'AVMGRWKGGRAAG*' \end{verbatim} \noindent You are, however, encouraged to work with \verb|Seq| objects by default. \chapter{Sequence annotation objects} \label{chapter:SeqRecord} Chapter~\ref{chapter:Bio.Seq} introduced the sequence classes. Immediately ``above'' the \verb|Seq| class is the Sequence Record or \verb|SeqRecord| class, defined in the \verb|Bio.SeqRecord| module. This class allows higher level features such as identifiers and features (as \verb|SeqFeature| objects) to be associated with the sequence, and is used throughout the sequence input/output interface \verb|Bio.SeqIO| described fully in Chapter~\ref{chapter:Bio.SeqIO}. If you are only going to be working with simple data like FASTA files, you can probably skip this chapter for now. If on the other hand you are going to be using richly annotated sequence data, say from GenBank or EMBL files, this information is quite important. While this chapter should cover most things to do with the \verb|SeqRecord| and \verb|SeqFeature| objects in this chapter, you may also want to read the \verb|SeqRecord| wiki page (\url{http://biopython.org/wiki/SeqRecord}), and the built in documentation (also online -- \href{http://biopython.org/DIST/docs/api/Bio.SeqRecord.SeqRecord-class.html}{SeqRecord} and \href{http://biopython.org/DIST/docs/api/Bio.SeqFeature.SeqFeature-class.html}{SeqFeature}): \begin{verbatim} >>> from Bio.SeqRecord import SeqRecord >>> help(SeqRecord) ... \end{verbatim} \section{The SeqRecord object} \label{sec:SeqRecord} The \verb|SeqRecord| (Sequence Record) class is defined in the \verb|Bio.SeqRecord| module. This class allows higher level features such as identifiers and features to be associated with a sequence (see Chapter~\ref{chapter:Bio.Seq}), and is the basic data type for the \verb|Bio.SeqIO| sequence input/output interface (see Chapter~\ref{chapter:Bio.SeqIO}). The \verb|SeqRecord| class itself is quite simple, and offers the following information as attributes: \begin{description} \item[.seq] -- The sequence itself, typically a \verb|Seq| object. \item[.id] -- The primary ID used to identify the sequence -- a string. In most cases this is something like an accession number. \item[.name] -- A ``common'' name/id for the sequence -- a string. In some cases this will be the same as the accession number, but it could also be a clone name. I think of this as being analogous to the LOCUS id in a GenBank record. \item[.description] -- A human readable description or expressive name for the sequence -- a string. \item[.letter\_annotations] -- Holds per-letter-annotations using a (restricted) dictionary of additional information about the letters in the sequence. The keys are the name of the information, and the information is contained in the value as a Python sequence (i.e. a list, tuple or string) with the same length as the sequence itself. This is often used for quality scores (e.g. Section~\ref{sec:FASTQ-filtering-example}) or secondary structure information (e.g. from Stockholm/PFAM alignment files). \item[.annotations] -- A dictionary of additional information about the sequence. The keys are the name of the information, and the information is contained in the value. This allows the addition of more ``unstructured'' information to the sequence. \item[.features] -- A list of \verb|SeqFeature| objects with more structured information about the features on a sequence (e.g. position of genes on a genome, or domains on a protein sequence). The structure of sequence features is described below in Section~\ref{sec:seq_features}. \item[.dbxrefs] - A list of database cross-references as strings. \end{description} \section{Creating a SeqRecord} Using a \verb|SeqRecord| object is not very complicated, since all of the information is presented as attributes of the class. Usually you won't create a \verb|SeqRecord| ``by hand'', but instead use \verb|Bio.SeqIO| to read in a sequence file for you (see Chapter~\ref{chapter:Bio.SeqIO} and the examples below). However, creating \verb|SeqRecord| can be quite simple. \subsection{SeqRecord objects from scratch} To create a \verb|SeqRecord| at a minimum you just need a \verb|Seq| object: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> simple_seq = Seq("GATC") >>> from Bio.SeqRecord import SeqRecord >>> simple_seq_r = SeqRecord(simple_seq) \end{verbatim} Additionally, you can also pass the id, name and description to the initialization function, but if not they will be set as strings indicating they are unknown, and can be modified subsequently: %cont-doctest \begin{verbatim} >>> simple_seq_r.id '' >>> simple_seq_r.id = "AC12345" >>> simple_seq_r.description = "Made up sequence I wish I could write a paper about" >>> print(simple_seq_r.description) Made up sequence I wish I could write a paper about >>> simple_seq_r.seq Seq('GATC', Alphabet()) \end{verbatim} Including an identifier is very important if you want to output your \verb|SeqRecord| to a file. You would normally include this when creating the object: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> simple_seq = Seq("GATC") >>> from Bio.SeqRecord import SeqRecord >>> simple_seq_r = SeqRecord(simple_seq, id="AC12345") \end{verbatim} As mentioned above, the \verb|SeqRecord| has an dictionary attribute \verb|annotations|. This is used for any miscellaneous annotations that doesn't fit under one of the other more specific attributes. Adding annotations is easy, and just involves dealing directly with the annotation dictionary: %cont-doctest \begin{verbatim} >>> simple_seq_r.annotations["evidence"] = "None. I just made it up." >>> print(simple_seq_r.annotations) {'evidence': 'None. I just made it up.'} >>> print(simple_seq_r.annotations["evidence"]) None. I just made it up. \end{verbatim} Working with per-letter-annotations is similar, \verb|letter_annotations| is a dictionary like attribute which will let you assign any Python sequence (i.e. a string, list or tuple) which has the same length as the sequence: %cont-doctest \begin{verbatim} >>> simple_seq_r.letter_annotations["phred_quality"] = [40, 40, 38, 30] >>> print(simple_seq_r.letter_annotations) {'phred_quality': [40, 40, 38, 30]} >>> print(simple_seq_r.letter_annotations["phred_quality"]) [40, 40, 38, 30] \end{verbatim} The \verb|dbxrefs| and \verb|features| attributes are just Python lists, and should be used to store strings and \verb|SeqFeature| objects (discussed later in this chapter) respectively. %TODO - Update this to show passing in the annotations etc to __init__ ? \subsection{SeqRecord objects from FASTA files} This example uses a fairly large FASTA file containing the whole sequence for \textit{Yersinia pestis biovar Microtus} str. 91001 plasmid pPCP1, originally downloaded from the NCBI. This file is included with the Biopython unit tests under the GenBank folder, or online \href{http://biopython.org/SRC/biopython/Tests/GenBank/NC_005816.fna}{\texttt{NC\_005816.fna}} from our website. The file starts like this - and you can check there is only one record present (i.e. only one line starting with a greater than symbol): \begin{verbatim} >gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGGGGGTAATCTGCTCTCC ... \end{verbatim} Back in Chapter~\ref{chapter:quick-start} you will have seen the function \verb|Bio.SeqIO.parse(...)| used to loop over all the records in a file as \verb|SeqRecord| objects. The \verb|Bio.SeqIO| module has a sister function for use on files which contain just one record which we'll use here (see Chapter~\ref{chapter:Bio.SeqIO} for details): %TODO - line wrapping for doctest? \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.fna", "fasta") >>> record SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', SingleLetterAlphabet()), id='gi|45478711|ref|NC_005816.1|', name='gi|45478711|ref|NC_005816.1|', description='gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... sequence', dbxrefs=[]) \end{verbatim} Now, let's have a look at the key attributes of this \verb|SeqRecord| individually -- starting with the \verb|seq| attribute which gives you a \verb|Seq| object: \begin{verbatim} >>> record.seq Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', SingleLetterAlphabet()) \end{verbatim} \noindent Here \verb|Bio.SeqIO| has defaulted to a generic alphabet, rather than guessing that this is DNA. If you know in advance what kind of sequence your FASTA file contains, you can tell \verb|Bio.SeqIO| which alphabet to use (see Chapter~\ref{chapter:Bio.SeqIO}). Next, the identifiers and description: \begin{verbatim} >>> record.id 'gi|45478711|ref|NC_005816.1|' >>> record.name 'gi|45478711|ref|NC_005816.1|' >>> record.description 'gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence' \end{verbatim} As you can see above, the first word of the FASTA record's title line (after removing the greater than symbol) is used for both the \verb|id| and \verb|name| attributes. The whole title line (after removing the greater than symbol) is used for the record description. This is deliberate, partly for backwards compatibility reasons, but it also makes sense if you have a FASTA file like this: \begin{verbatim} >Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1 TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGGGGGTAATCTGCTCTCC ... \end{verbatim} Note that none of the other annotation attributes get populated when reading a FASTA file: \begin{verbatim} >>> record.dbxrefs [] >>> record.annotations {} >>> record.letter_annotations {} >>> record.features [] \end{verbatim} In this case our example FASTA file was from the NCBI, and they have a fairly well defined set of conventions for formatting their FASTA lines. This means it would be possible to parse this information and extract the GI number and accession for example. However, FASTA files from other sources vary, so this isn't possible in general. \subsection{SeqRecord objects from GenBank files} As in the previous example, we're going to look at the whole sequence for \textit{Yersinia pestis biovar Microtus} str. 91001 plasmid pPCP1, originally downloaded from the NCBI, but this time as a GenBank file. Again, this file is included with the Biopython unit tests under the GenBank folder, or online \href{http://biopython.org/SRC/biopython/Tests/GenBank/NC_005816.gb}{\texttt{NC\_005816.gb}} from our website. This file contains a single record (i.e. only one LOCUS line) and starts: \begin{verbatim} LOCUS NC_005816 9609 bp DNA circular BCT 21-JUL-2008 DEFINITION Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence. ACCESSION NC_005816 VERSION NC_005816.1 GI:45478711 PROJECT GenomeProject:10638 ... \end{verbatim} Again, we'll use \verb|Bio.SeqIO| to read this file in, and the code is almost identical to that for used above for the FASTA file (see Chapter~\ref{chapter:Bio.SeqIO} for details): \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.gb", "genbank") >>> record SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816', description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.', dbxrefs=['Project:10638']) \end{verbatim} You should be able to spot some differences already! But taking the attributes individually, the sequence string is the same as before, but this time \verb|Bio.SeqIO| has been able to automatically assign a more specific alphabet (see Chapter~\ref{chapter:Bio.SeqIO} for details): \begin{verbatim} >>> record.seq Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', IUPACAmbiguousDNA()) \end{verbatim} The \verb|name| comes from the LOCUS line, while the \verb|id| includes the version suffix. The description comes from the DEFINITION line: \begin{verbatim} >>> record.id 'NC_005816.1' >>> record.name 'NC_005816' >>> record.description 'Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.' \end{verbatim} GenBank files don't have any per-letter annotations: \begin{verbatim} >>> record.letter_annotations {} \end{verbatim} Most of the annotations information gets recorded in the \verb|annotations| dictionary, for example: \begin{verbatim} >>> len(record.annotations) 11 >>> record.annotations["source"] 'Yersinia pestis biovar Microtus str. 91001' \end{verbatim} The \verb|dbxrefs| list gets populated from any PROJECT or DBLINK lines: \begin{verbatim} >>> record.dbxrefs ['Project:10638'] \end{verbatim} Finally, and perhaps most interestingly, all the entries in the features table (e.g. the genes or CDS features) get recorded as \verb|SeqFeature| objects in the \verb|features| list. \begin{verbatim} >>> len(record.features) 29 \end{verbatim} \noindent We'll talk about \verb|SeqFeature| objects next, in Section~\ref{sec:seq_features}. \section{Feature, location and position objects} \label{sec:seq_features} \subsection{SeqFeature objects} Sequence features are an essential part of describing a sequence. Once you get beyond the sequence itself, you need some way to organize and easily get at the more ``abstract'' information that is known about the sequence. While it is probably impossible to develop a general sequence feature class that will cover everything, the Biopython \verb|SeqFeature| class attempts to encapsulate as much of the information about the sequence as possible. The design is heavily based on the GenBank/EMBL feature tables, so if you understand how they look, you'll probably have an easier time grasping the structure of the Biopython classes. The key idea about each \verb|SeqFeature| object is to describe a region on a parent sequence, typically a \verb|SeqRecord| object. That region is described with a location object, typically a range between two positions (see Section~\ref{sec:locations} below). The \verb|SeqFeature| class has a number of attributes, so first we'll list them and their general features, and then later in the chapter work through examples to show how this applies to a real life example. The attributes of a SeqFeature are: \begin{description} \item[.type] -- This is a textual description of the type of feature (for instance, this will be something like `CDS' or `gene'). \item[.location] -- The location of the \verb|SeqFeature| on the sequence that you are dealing with, see Section~\ref{sec:locations} below. The \verb|SeqFeature| delegates much of its functionality to the location object, and includes a number of shortcut attributes for properties of the location: \begin{description} \item[.ref] -- shorthand for \verb|.location.ref| -- any (different) reference sequence the location is referring to. Usually just None. \item[.ref\_db] -- shorthand for \verb|.location.ref_db| -- specifies the database any identifier in \verb|.ref| refers to. Usually just None. \item[.strand] -- shorthand for \verb|.location.strand| -- the strand on the sequence that the feature is located on. For double stranded nucleotide sequence this may either be $1$ for the top strand, $-1$ for the bottom strand, $0$ if the strand is important but is unknown, or \texttt{None} if it doesn't matter. This is None for proteins, or single stranded sequences. \end{description} \item[.qualifiers] -- This is a Python dictionary of additional information about the feature. The key is some kind of terse one-word description of what the information contained in the value is about, and the value is the actual information. For example, a common key for a qualifier might be ``evidence'' and the value might be ``computational (non-experimental).'' This is just a way to let the person who is looking at the feature know that it has not be experimentally (i.~e.~in a wet lab) confirmed. Note that other the value will be a list of strings (even when there is only one string). This is a reflection of the feature tables in GenBank/EMBL files. \item[.sub\_features] -- This used to be used to represent features with complicated locations like `joins' in GenBank/EMBL files. This has been deprecated with the introduction of the \verb|CompoundLocation| object, and should now be ignored. \end{description} \subsection{Positions and locations} \label{sec:locations} The key idea about each \verb|SeqFeature| object is to describe a region on a parent sequence, for which we use a location object, typically describing a range between two positions. Two try to clarify the terminology we're using: \begin{description} \item[position] -- This refers to a single position on a sequence, which may be fuzzy or not. For instance, 5, 20, \verb|<100| and \verb|>200| are all positions. \item[location] -- A location is region of sequence bounded by some positions. For instance 5..20 (i.~e.~5 to 20) is a location. \end{description} I just mention this because sometimes I get confused between the two. \subsubsection{FeatureLocation object} Unless you work with eukaryotic genes, most \verb|SeqFeature| locations are extremely simple - you just need start and end coordinates and a strand. That's essentially all the basic \verb|FeatureLocation| object does. %TODO -- add example here In practise of course, things can be more complicated. First of all we have to handle compound locations made up of several regions. Secondly, the positions themselves may be fuzzy (inexact). \subsubsection{CompoundLocation object} Biopython 1.62 introduced the \verb|CompoundLocation| as part of a restructuring of how complex locations made up of multiple regions are represented. The main usage is for handling `join' locations in EMBL/GenBank files. %TODO -- add example here \subsubsection{Fuzzy Positions} So far we've only used simple positions. One complication in dealing with feature locations comes in the positions themselves. In biology many times things aren't entirely certain (as much as us wet lab biologists try to make them certain!). For instance, you might do a dinucleotide priming experiment and discover that the start of mRNA transcript starts at one of two sites. This is very useful information, but the complication comes in how to represent this as a position. To help us deal with this, we have the concept of fuzzy positions. Basically there are several types of fuzzy positions, so we have five classes do deal with them: \begin{description} \item[ExactPosition] -- As its name suggests, this class represents a position which is specified as exact along the sequence. This is represented as just a number, and you can get the position by looking at the \verb|position| attribute of the object. \item[BeforePosition] -- This class represents a fuzzy position that occurs prior to some specified site. In GenBank/EMBL notation, this is represented as something like \verb|`<13'|, signifying that the real position is located somewhere less than 13. To get the specified upper boundary, look at the \verb|position| attribute of the object. \item[AfterPosition] -- Contrary to \verb|BeforePosition|, this class represents a position that occurs after some specified site. This is represented in GenBank as \verb|`>13'|, and like \verb|BeforePosition|, you get the boundary number by looking at the \verb|position| attribute of the object. \item[WithinPosition] -- Occasionally used for GenBank/EMBL locations, this class models a position which occurs somewhere between two specified nucleotides. In GenBank/EMBL notation, this would be represented as `(1.5)', to represent that the position is somewhere within the range 1 to 5. To get the information in this class you have to look at two attributes. The \verb|position| attribute specifies the lower boundary of the range we are looking at, so in our example case this would be one. The \verb|extension| attribute specifies the range to the higher boundary, so in this case it would be 4. So \verb|object.position| is the lower boundary and \verb|object.position + object.extension| is the upper boundary. \item[OneOfPosition] -- Occasionally used for GenBank/EMBL locations, this class deals with a position where several possible values exist, for instance you could use this if the start codon was unclear and there where two candidates for the start of the gene. Alternatively, that might be handled explicitly as two related gene features. \item[UnknownPosition] -- This class deals with a position of unknown location. This is not used in GenBank/EMBL, but corresponds to the `?' feature coordinate used in UniProt. \end{description} Here's an example where we create a location with fuzzy end points: %doctest \begin{verbatim} >>> from Bio import SeqFeature >>> start_pos = SeqFeature.AfterPosition(5) >>> end_pos = SeqFeature.BetweenPosition(9, left=8, right=9) >>> my_location = SeqFeature.FeatureLocation(start_pos, end_pos) \end{verbatim} Note that the details of some of the fuzzy-locations changed in Biopython 1.59, in particular for BetweenPosition and WithinPosition you must now make it explicit which integer position should be used for slicing etc. For a start position this is generally the lower (left) value, while for an end position this would generally be the higher (right) value. If you print out a \verb|FeatureLocation| object, you can get a nice representation of the information: %cont-doctest \begin{verbatim} >>> print(my_location) [>5:(8^9)] \end{verbatim} We can access the fuzzy start and end positions using the start and end attributes of the location: %cont-doctest \begin{verbatim} >>> my_location.start AfterPosition(5) >>> print(my_location.start) >5 >>> my_location.end BetweenPosition(9, left=8, right=9) >>> print(my_location.end) (8^9) \end{verbatim} If you don't want to deal with fuzzy positions and just want numbers, they are actually subclasses of integers so should work like integers: %cont-doctest \begin{verbatim} >>> int(my_location.start) 5 >>> int(my_location.end) 9 \end{verbatim} For compatibility with older versions of Biopython you can ask for the \verb|nofuzzy_start| and \verb|nofuzzy_end| attributes of the location which are plain integers: %cont-doctest \begin{verbatim} >>> my_location.nofuzzy_start 5 >>> my_location.nofuzzy_end 9 \end{verbatim} Notice that this just gives you back the position attributes of the fuzzy locations. Similarly, to make it easy to create a position without worrying about fuzzy positions, you can just pass in numbers to the \verb|FeaturePosition| constructors, and you'll get back out \verb|ExactPosition| objects: %cont-doctest \begin{verbatim} >>> exact_location = SeqFeature.FeatureLocation(5, 9) >>> print(exact_location) [5:9] >>> exact_location.start ExactPosition(5) >>> int(exact_location.start) 5 >>> exact_location.nofuzzy_start 5 \end{verbatim} That is most of the nitty gritty about dealing with fuzzy positions in Biopython. It has been designed so that dealing with fuzziness is not that much more complicated than dealing with exact positions, and hopefully you find that true! \subsubsection{Location testing} You can use the Python keyword \verb|in| with a \verb|SeqFeature| or location object to see if the base/residue for a parent coordinate is within the feature/location or not. For example, suppose you have a SNP of interest and you want to know which features this SNP is within, and lets suppose this SNP is at index 4350 (Python counting!). Here is a simple brute force solution where we just check all the features one by one in a loop: %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> my_snp = 4350 >>> record = SeqIO.read("NC_005816.gb", "genbank") >>> for feature in record.features: ... if my_snp in feature: ... print("%s %s" % (feature.type, feature.qualifiers.get('db_xref'))) ... source ['taxon:229193'] gene ['GeneID:2767712'] CDS ['GI:45478716', 'GeneID:2767712'] \end{verbatim} Note that gene and CDS features from GenBank or EMBL files defined with joins are the union of the exons -- they do not cover any introns. %TODO - Add join example \subsection{Sequence described by a feature or location} A \verb|SeqFeature| or location object doesn't directly contain a sequence, instead the location (see Section~\ref{sec:locations}) describes how to get this from the parent sequence. For example consider a (short) gene sequence with location 5:18 on the reverse strand, which in GenBank/EMBL notation using 1-based counting would be \texttt{complement(6..18)}, like this: %doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.SeqFeature import SeqFeature, FeatureLocation >>> example_parent = Seq("ACCGAGACGGCAAAGGCTAGCATAGGTATGAGACTTCCTTCCTGCCAGTGCTGAGGAACTGGGAGCCTAC") >>> example_feature = SeqFeature(FeatureLocation(5, 18), type="gene", strand=-1) \end{verbatim} You could take the parent sequence, slice it to extract 5:18, and then take the reverse complement. If you are using Biopython 1.59 or later, the feature location's start and end are integer like so this works: %cont-doctest \begin{verbatim} >>> feature_seq = example_parent[example_feature.location.start:example_feature.location.end].reverse_complement() >>> print(feature_seq) AGCCTTTGCCGTC \end{verbatim} This is a simple example so this isn't too bad -- however once you have to deal with compound features (joins) this is rather messy. Instead, the \verb|SeqFeature| object has an \verb|extract| method to take care of all this: %cont-doctest \begin{verbatim} >>> feature_seq = example_feature.extract(example_parent) >>> print(feature_seq) AGCCTTTGCCGTC \end{verbatim} The length of a \verb|SeqFeature| or location matches that of the region of sequence it describes. %cont-doctest \begin{verbatim} >>> print(example_feature.extract(example_parent)) AGCCTTTGCCGTC >>> print(len(example_feature.extract(example_parent))) 13 >>> print(len(example_feature)) 13 >>> print(len(example_feature.location)) 13 \end{verbatim} For simple \verb|FeatureLocation| objects the length is just the difference between the start and end positions. However, for a \verb|CompoundLocation| the length is the sum of the constituent regions. \section{References} Another common annotation related to a sequence is a reference to a journal or other published work dealing with the sequence. We have a fairly simple way of representing a Reference in Biopython -- we have a \verb|Bio.SeqFeature.Reference| class that stores the relevant information about a reference as attributes of an object. The attributes include things that you would expect to see in a reference like \verb|journal|, \verb|title| and \verb|authors|. Additionally, it also can hold the \verb|medline_id| and \verb|pubmed_id| and a \verb|comment| about the reference. These are all accessed simply as attributes of the object. A reference also has a \verb|location| object so that it can specify a particular location on the sequence that the reference refers to. For instance, you might have a journal that is dealing with a particular gene located on a BAC, and want to specify that it only refers to this position exactly. The \verb|location| is a potentially fuzzy location, as described in section~\ref{sec:locations}. Any reference objects are stored as a list in the \verb|SeqRecord| object's \verb|annotations| dictionary under the key ``references''. That's all there is too it. References are meant to be easy to deal with, and hopefully general enough to cover lots of usage cases. \section{The format method} \label{sec:SeqRecord-format} The \verb|format()| method of the \verb|SeqRecord| class gives a string containing your record formatted using one of the output file formats supported by \verb|Bio.SeqIO|, such as FASTA: \begin{verbatim} from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio.Alphabet import generic_protein record = SeqRecord(Seq("MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD" \ +"GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK" \ +"NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM" \ +"SSAC", generic_protein), id="gi|14150838|gb|AAK54648.1|AF376133_1", description="chalcone synthase [Cucumis sativus]") print(record.format("fasta")) \end{verbatim} \noindent which should give: \begin{verbatim} >gi|14150838|gb|AAK54648.1|AF376133_1 chalcone synthase [Cucumis sativus] MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM SSAC \end{verbatim} This \verb|format| method takes a single mandatory argument, a lower case string which is supported by \verb|Bio.SeqIO| as an output format (see Chapter~\ref{chapter:Bio.SeqIO}). However, some of the file formats \verb|Bio.SeqIO| can write to \emph{require} more than one record (typically the case for multiple sequence alignment formats), and thus won't work via this \verb|format()| method. See also Section~\ref{sec:Bio.SeqIO-and-StringIO}. \section{Slicing a SeqRecord} \label{sec:SeqRecord-slicing} You can slice a \verb|SeqRecord|, to give you a new \verb|SeqRecord| covering just part of the sequence. What is important here is that any per-letter annotations are also sliced, and any features which fall completely within the new sequence are preserved (with their locations adjusted). For example, taking the same GenBank file used earlier: %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.gb", "genbank") \end{verbatim} %TODO - support line wrapping in doctest \begin{verbatim} >>> record SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816', description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.', dbxrefs=['Project:10638']) \end{verbatim} %cont-doctest \begin{verbatim} >>> len(record) 9609 >>> len(record.features) 41 \end{verbatim} For this example we're going to focus in on the \verb|pim| gene, \verb|YP_pPCP05|. If you have a look at the GenBank file directly you'll find this gene/CDS has location string \texttt{4343..4780}, or in Python counting \texttt{4342:4780}. From looking at the file you can work out that these are the twelfth and thirteenth entries in the file, so in Python zero-based counting they are entries $11$ and $12$ in the \texttt{features} list: %cont-doctest \begin{verbatim} >>> print(record.features[20]) type: gene location: [4342:4780](+) qualifiers: Key: db_xref, Value: ['GeneID:2767712'] Key: gene, Value: ['pim'] Key: locus_tag, Value: ['YP_pPCP05'] \end{verbatim} %This one is truncated so can't use for doctest \begin{verbatim} >>> print(record.features[21]) type: CDS location: [4342:4780](+) qualifiers: Key: codon_start, Value: ['1'] Key: db_xref, Value: ['GI:45478716', 'GeneID:2767712'] Key: gene, Value: ['pim'] Key: locus_tag, Value: ['YP_pPCP05'] Key: note, Value: ['similar to many previously sequenced pesticin immunity ...'] Key: product, Value: ['pesticin immunity protein'] Key: protein_id, Value: ['NP_995571.1'] Key: transl_table, Value: ['11'] Key: translation, Value: ['MGGGMISKLFCLALIFLSSSGLAEKNTYTAKDILQNLELNTFGNSLSH...'] \end{verbatim} Let's slice this parent record from 4300 to 4800 (enough to include the \verb|pim| gene/CDS), and see how many features we get: %cont-doctest \begin{verbatim} >>> sub_record = record[4300:4800] \end{verbatim} %TODO - Line wrapping for doctest? \begin{verbatim} >>> sub_record SeqRecord(seq=Seq('ATAAATAGATTATTCCAAATAATTTATTTATGTAAGAACAGGATGGGAGGGGGA...TTA', IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816', description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.', dbxrefs=[]) \end{verbatim} %cont-doctest \begin{verbatim} >>> len(sub_record) 500 >>> len(sub_record.features) 2 \end{verbatim} Our sub-record just has two features, the gene and CDS entries for \verb|YP_pPCP05|: %cont-doctest \begin{verbatim} >>> print(sub_record.features[0]) type: gene location: [42:480](+) qualifiers: Key: db_xref, Value: ['GeneID:2767712'] Key: gene, Value: ['pim'] Key: locus_tag, Value: ['YP_pPCP05'] \end{verbatim} \begin{verbatim} >>> print(sub_record.features[20]) type: CDS location: [42:480](+) qualifiers: Key: codon_start, Value: ['1'] Key: db_xref, Value: ['GI:45478716', 'GeneID:2767712'] Key: gene, Value: ['pim'] Key: locus_tag, Value: ['YP_pPCP05'] Key: note, Value: ['similar to many previously sequenced pesticin immunity ...'] Key: product, Value: ['pesticin immunity protein'] Key: protein_id, Value: ['NP_995571.1'] Key: transl_table, Value: ['11'] Key: translation, Value: ['MGGGMISKLFCLALIFLSSSGLAEKNTYTAKDILQNLELNTFGNSLSH...'] \end{verbatim} \noindent Notice that their locations have been adjusted to reflect the new parent sequence! While Biopython has done something sensible and hopefully intuitive with the features (and any per-letter annotation), for the other annotation it is impossible to know if this still applies to the sub-sequence or not. To avoid guessing, the \texttt{annotations} and \texttt{dbxrefs} are omitted from the sub-record, and it is up to you to transfer any relevant information as appropriate. %cont-doctest \begin{verbatim} >>> sub_record.annotations {} >>> sub_record.dbxrefs [] \end{verbatim} The same point could be made about the record \texttt{id}, \texttt{name} and \texttt{description}, but for practicality these are preserved: %cont-doctest \begin{verbatim} >>> sub_record.id 'NC_005816.1' >>> sub_record.name 'NC_005816' >>> sub_record.description 'Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.' \end{verbatim} \noindent This illustrates the problem nicely though, our new sub-record is \emph{not} the complete sequence of the plasmid, so the description is wrong! Let's fix this and then view the sub-record as a reduced GenBank file using the \texttt{format} method described above in Section~\ref{sec:SeqRecord-format}: \begin{verbatim} >>> sub_record.description = "Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, partial." >>> print(sub_record.format("genbank")) ... \end{verbatim} See Sections~\ref{sec:FASTQ-slicing-off-primer} and~\ref{sec:FASTQ-slicing-off-adaptor} for some FASTQ examples where the per-letter annotations (the read quality scores) are also sliced. \section{Adding SeqRecord objects} \label{sec:SeqRecord-addition} You can add \verb|SeqRecord| objects together, giving a new \verb|SeqRecord|. What is important here is that any common per-letter annotations are also added, all the features are preserved (with their locations adjusted), and any other common annotation is also kept (like the id, name and description). For an example with per-letter annotation, we'll use the first record in a FASTQ file. Chapter~\ref{chapter:Bio.SeqIO} will explain the \verb|SeqIO| functions: %doctest ../Tests/Quality \begin{verbatim} >>> from Bio import SeqIO >>> record = next(SeqIO.parse("example.fastq", "fastq")) >>> len(record) 25 >>> print(record.seq) CCCTTCTTGTCTTCAGCGTTTCTCC \end{verbatim} %TODO - doctest wrapping \begin{verbatim} >>> print(record.letter_annotations["phred_quality"]) [26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26, 26, 26, 26, 23, 23] \end{verbatim} \noindent Let's suppose this was Roche 454 data, and that from other information you think the \texttt{TTT} should be only \texttt{TT}. We can make a new edited record by first slicing the \verb|SeqRecord| before and after the ``extra'' third \texttt{T}: %cont-doctest \begin{verbatim} >>> left = record[:20] >>> print(left.seq) CCCTTCTTGTCTTCAGCGTT >>> print(left.letter_annotations["phred_quality"]) [26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26] >>> right = record[21:] >>> print(right.seq) CTCC >>> print(right.letter_annotations["phred_quality"]) [26, 26, 23, 23] \end{verbatim} \noindent Now add the two parts together: %cont-doctest \begin{verbatim} >>> edited = left + right >>> len(edited) 24 >>> print(edited.seq) CCCTTCTTGTCTTCAGCGTTCTCC \end{verbatim} \begin{verbatim} >>> print(edited.letter_annotations["phred_quality"]) [26, 26, 18, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 22, 26, 26, 26, 26, 26, 26, 23, 23] \end{verbatim} \noindent Easy and intuitive? We hope so! You can make this shorter with just: %cont-doctest \begin{verbatim} >>> edited = record[:20] + record[21:] \end{verbatim} Now, for an example with features, we'll use a GenBank file. Suppose you have a circular genome: %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.gb", "genbank") \end{verbatim} %TODO - doctest wrapping \begin{verbatim} >>> record SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816', description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.', dbxrefs=['Project:10638']) \end{verbatim} %cont-doctest \begin{verbatim} >>> len(record) 9609 >>> len(record.features) 41 >>> record.dbxrefs ['Project:58037'] \end{verbatim} %TODO - doctest wrapping \begin{verbatim} >>> record.annotations.keys() ['comment', 'sequence_version', 'source', 'taxonomy', 'keywords', 'references', 'accessions', 'data_file_division', 'date', 'organism', 'gi'] \end{verbatim} You can shift the origin like this: %cont-doctest \begin{verbatim} >>> shifted = record[2000:] + record[:2000] \end{verbatim} %TODO - doctest wrapping \begin{verbatim} >>> shifted SeqRecord(seq=Seq('GATACGCAGTCATATTTTTTACACAATTCTCTAATCCCGACAAGGTCGTAGGTC...GGA', IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816', description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.', dbxrefs=[]) \end{verbatim} %cont-doctest \begin{verbatim} >>> len(shifted) 9609 \end{verbatim} Note that this isn't perfect in that some annotation like the database cross references and one of the features (the source feature) have been lost: %cont-doctest \begin{verbatim} >>> len(shifted.features) 40 >>> shifted.dbxrefs [] >>> shifted.annotations.keys() [] \end{verbatim} This is because the \verb|SeqRecord| slicing step is cautious in what annotation it preserves (erroneously propagating annotation can cause major problems). If you want to keep the database cross references or the annotations dictionary, this must be done explicitly: \begin{verbatim} >>> shifted.dbxrefs = record.dbxrefs[:] >>> shifted.annotations = record.annotations.copy() >>> shifted.dbxrefs ['Project:10638'] >>> shifted.annotations.keys() ['comment', 'sequence_version', 'source', 'taxonomy', 'keywords', 'references', 'accessions', 'data_file_division', 'date', 'organism', 'gi'] \end{verbatim} Also note that in an example like this, you should probably change the record identifiers since the NCBI references refer to the \emph{original} unmodified sequence. \section{Reverse-complementing SeqRecord objects} \label{sec:SeqRecord-reverse-complement} One of the new features in Biopython 1.57 was the \verb|SeqRecord| object's \verb|reverse_complement| method. This tries to balance easy of use with worries about what to do with the annotation in the reverse complemented record. For the sequence, this uses the Seq object's reverse complement method. Any features are transferred with the location and strand recalculated. Likewise any per-letter-annotation is also copied but reversed (which makes sense for typical examples like quality scores). However, transfer of most annotation is problematical. For instance, if the record ID was an accession, that accession should not really apply to the reverse complemented sequence, and transferring the identifier by default could easily cause subtle data corruption in downstream analysis. Therefore by default, the \verb|SeqRecord|'s id, name, description, annotations and database cross references are all \emph{not} transferred by default. The \verb|SeqRecord| object's \verb|reverse_complement| method takes a number of optional arguments corresponding to properties of the record. Setting these arguments to \verb|True| means copy the old values, while \verb|False| means drop the old values and use the default value. You can alternatively provide the new desired value instead. Consider this example record: %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.gb", "genbank") >>> print("%s %i %i %i %i" % (record.id, len(record), len(record.features), len(record.dbxrefs), len(record.annotations))) NC_005816.1 9609 41 1 11 \end{verbatim} Here we take the reverse complement and specify a new identifier -- but notice how most of the annotation is dropped (but not the features): %cont-doctest \begin{verbatim} >>> rc = record.reverse_complement(id="TESTING") >>> print("%s %i %i %i %i" % (rc.id, len(rc), len(rc.features), len(rc.dbxrefs), len(rc.annotations))) TESTING 9609 41 0 0 \end{verbatim} \chapter{Sequence Input/Output} \label{chapter:Bio.SeqIO} In this chapter we'll discuss in more detail the \verb|Bio.SeqIO| module, which was briefly introduced in Chapter~\ref{chapter:quick-start} and also used in Chapter~\ref{chapter:SeqRecord}. This aims to provide a simple interface for working with assorted sequence file formats in a uniform way. See also the \verb|Bio.SeqIO| wiki page (\url{http://biopython.org/wiki/SeqIO}), and the built in documentation (also \href{http://biopython.org/DIST/docs/api/Bio.SeqIO-module.html}{online}): \begin{verbatim} >>> from Bio import SeqIO >>> help(SeqIO) ... \end{verbatim} The ``catch'' is that you have to work with \verb|SeqRecord| objects (see Chapter~\ref{chapter:SeqRecord}), which contain a \verb|Seq| object (see Chapter~\ref{chapter:Bio.Seq}) plus annotation like an identifier and description. \section{Parsing or Reading Sequences} \label{sec:Bio.SeqIO-input} The workhorse function \verb|Bio.SeqIO.parse()| is used to read in sequence data as SeqRecord objects. This function expects two arguments: \begin{enumerate} \item The first argument is a {\it handle} to read the data from, or a filename. A handle is typically a file opened for reading, but could be the output from a command line program, or data downloaded from the internet (see Section~\ref{sec:SeqIO_Online}). See Section~\ref{sec:appendix-handles} for more about handles. \item The second argument is a lower case string specifying sequence format -- we don't try and guess the file format for you! See \url{http://biopython.org/wiki/SeqIO} for a full listing of supported formats. \end{enumerate} \noindent There is an optional argument \verb|alphabet| to specify the alphabet to be used. This is useful for file formats like FASTA where otherwise \verb|Bio.SeqIO| will default to a generic alphabet. The \verb|Bio.SeqIO.parse()| function returns an {\it iterator} which gives \verb|SeqRecord| objects. Iterators are typically used in a for loop as shown below. Sometimes you'll find yourself dealing with files which contain only a single record. For this situation use the function \verb|Bio.SeqIO.read()| which takes the same arguments. Provided there is one and only one record in the file, this is returned as a \verb|SeqRecord| object. Otherwise an exception is raised. \subsection{Reading Sequence Files} In general \verb|Bio.SeqIO.parse()| is used to read in sequence files as \verb|SeqRecord| objects, and is typically used with a for loop like this: \begin{verbatim} from Bio import SeqIO for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"): print(seq_record.id) print(repr(seq_record.seq)) print(len(seq_record)) \end{verbatim} The above example is repeated from the introduction in Section~\ref{sec:sequence-parsing}, and will load the orchid DNA sequences in the FASTA format file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{ls\_orchid.fasta}. If instead you wanted to load a GenBank format file like \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{ls\_orchid.gbk} then all you need to do is change the filename and the format string: \begin{verbatim} from Bio import SeqIO for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"): print(seq_record.id) print(seq_record.seq) print(len(seq_record)) \end{verbatim} Similarly, if you wanted to read in a file in another file format, then assuming \verb|Bio.SeqIO.parse()| supports it you would just need to change the format string as appropriate, for example ``swiss'' for SwissProt files or ``embl'' for EMBL text files. There is a full listing on the wiki page (\url{http://biopython.org/wiki/SeqIO}) and in the built in documentation (also \href{http://biopython.org/DIST/docs/api/Bio.SeqIO-module.html}{online}). Another very common way to use a Python iterator is within a list comprehension (or a generator expression). For example, if all you wanted to extract from the file was a list of the record identifiers we can easily do this with the following list comprehension: \begin{verbatim} >>> from Bio import SeqIO >>> identifiers = [seq_record.id for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank")] >>> identifiers ['Z78533.1', 'Z78532.1', 'Z78531.1', 'Z78530.1', 'Z78529.1', 'Z78527.1', ..., 'Z78439.1'] \end{verbatim} \noindent There are more examples using \verb|SeqIO.parse()| in a list comprehension like this in Section~\ref{seq:sequence-parsing-plus-pylab} (e.g. for plotting sequence lengths or GC\%). \subsection{Iterating over the records in a sequence file} In the above examples, we have usually used a for loop to iterate over all the records one by one. You can use the for loop with all sorts of Python objects (including lists, tuples and strings) which support the iteration interface. The object returned by \verb|Bio.SeqIO| is actually an iterator which returns \verb|SeqRecord| objects. You get to see each record in turn, but once and only once. The plus point is that an iterator can save you memory when dealing with large files. Instead of using a for loop, can also use the \verb|next()| function on an iterator to step through the entries, like this: \begin{verbatim} from Bio import SeqIO record_iterator = SeqIO.parse("ls_orchid.fasta", "fasta") first_record = next(record_iterator) print(first_record.id) print(first_record.description) second_record = next(record_iterator) print(second_record.id) print(second_record.description) \end{verbatim} Note that if you try to use \verb|next()| and there are no more results, you'll get the special \verb|StopIteration| exception. One special case to consider is when your sequence files have multiple records, but you only want the first one. In this situation the following code is very concise: \begin{verbatim} from Bio import SeqIO first_record = next(SeqIO.parse("ls_orchid.gbk", "genbank")) \end{verbatim} A word of warning here -- using the \verb|next()| function like this will silently ignore any additional records in the file. If your files have {\it one and only one} record, like some of the online examples later in this chapter, or a GenBank file for a single chromosome, then use the new \verb|Bio.SeqIO.read()| function instead. This will check there are no extra unexpected records present. \subsection{Getting a list of the records in a sequence file} In the previous section we talked about the fact that \verb|Bio.SeqIO.parse()| gives you a \verb|SeqRecord| iterator, and that you get the records one by one. Very often you need to be able to access the records in any order. The Python \verb|list| data type is perfect for this, and we can turn the record iterator into a list of \verb|SeqRecord| objects using the built-in Python function \verb|list()| like so: \begin{verbatim} from Bio import SeqIO records = list(SeqIO.parse("ls_orchid.gbk", "genbank")) print("Found %i records" % len(records)) print("The last record") last_record = records[-1] #using Python's list tricks print(last_record.id) print(repr(last_record.seq)) print(len(last_record)) print("The first record") first_record = records[0] #remember, Python counts from zero print(first_record.id) print(repr(first_record.seq)) print(len(first_record)) \end{verbatim} \noindent Giving: \begin{verbatim} Found 94 records The last record Z78439.1 Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA()) 592 The first record Z78533.1 Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA()) 740 \end{verbatim} You can of course still use a for loop with a list of \verb|SeqRecord| objects. Using a list is much more flexible than an iterator (for example, you can determine the number of records from the length of the list), but does need more memory because it will hold all the records in memory at once. \subsection{Extracting data} The \verb|SeqRecord| object and its annotation structures are described more fully in Chapter~\ref{chapter:SeqRecord}. As an example of how annotations are stored, we'll look at the output from parsing the first record in the GenBank file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{ls\_orchid.gbk}. \begin{verbatim} from Bio import SeqIO record_iterator = SeqIO.parse("ls_orchid.gbk", "genbank") first_record = next(record_iterator) print(first_record) \end{verbatim} \noindent That should give something like this: \begin{verbatim} ID: Z78533.1 Name: Z78533 Description: C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA. Number of features: 5 /sequence_version=1 /source=Cypripedium irapeanum /taxonomy=['Eukaryota', 'Viridiplantae', 'Streptophyta', ..., 'Cypripedium'] /keywords=['5.8S ribosomal RNA', '5.8S rRNA gene', ..., 'ITS1', 'ITS2'] /references=[...] /accessions=['Z78533'] /data_file_division=PLN /date=30-NOV-2006 /organism=Cypripedium irapeanum /gi=2765658 Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA()) \end{verbatim} This gives a human readable summary of most of the annotation data for the \verb|SeqRecord|. For this example we're going to use the \verb|.annotations| attribute which is just a Python dictionary. The contents of this annotations dictionary were shown when we printed the record above. You can also print them out directly: \begin{verbatim} print(first_record.annotations) \end{verbatim} \noindent Like any Python dictionary, you can easily get a list of the keys: \begin{verbatim} print(first_record.annotations.keys()) \end{verbatim} \noindent or values: \begin{verbatim} print(first_record.annotations.values()) \end{verbatim} In general, the annotation values are strings, or lists of strings. One special case is any references in the file get stored as reference objects. Suppose you wanted to extract a list of the species from the \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{ls\_orchid.gbk} GenBank file. The information we want, \emph{Cypripedium irapeanum}, is held in the annotations dictionary under `source' and `organism', which we can access like this: \begin{verbatim} >>> print(first_record.annotations["source"]) Cypripedium irapeanum \end{verbatim} \noindent or: \begin{verbatim} >>> print(first_record.annotations["organism"]) Cypripedium irapeanum \end{verbatim} In general, `organism' is used for the scientific name (in Latin, e.g. \textit{Arabidopsis thaliana}), while `source' will often be the common name (e.g. thale cress). In this example, as is often the case, the two fields are identical. Now let's go through all the records, building up a list of the species each orchid sequence is from: \begin{verbatim} from Bio import SeqIO all_species = [] for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"): all_species.append(seq_record.annotations["organism"]) print(all_species) \end{verbatim} Another way of writing this code is to use a list comprehension: \begin{verbatim} from Bio import SeqIO all_species = [seq_record.annotations["organism"] for seq_record in \ SeqIO.parse("ls_orchid.gbk", "genbank")] print(all_species) \end{verbatim} \noindent In either case, the result is: % Try and keep this example output line short enough to fit on one page of PDF output: \begin{verbatim} ['Cypripedium irapeanum', 'Cypripedium californicum', ..., 'Paphiopedilum barbatum'] \end{verbatim} Great. That was pretty easy because GenBank files are annotated in a standardised way. Now, let's suppose you wanted to extract a list of the species from a FASTA file, rather than the GenBank file. The bad news is you will have to write some code to extract the data you want from the record's description line - if the information is in the file in the first place! Our example FASTA format file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{ls\_orchid.fasta} starts like this: \begin{verbatim} >gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG ... \end{verbatim} You can check by hand, but for every record the species name is in the description line as the second word. This means if we break up each record's \verb|.description| at the spaces, then the species is there as field number one (field zero is the record identifier). That means we can do this: \begin{verbatim} from Bio import SeqIO all_species = [] for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"): all_species.append(seq_record.description.split()[1]) print(all_species) \end{verbatim} \noindent This gives: \begin{verbatim} ['C.irapeanum', 'C.californicum', 'C.fasciculatum', 'C.margaritaceum', ..., 'P.barbatum'] \end{verbatim} The concise alternative using list comprehensions would be: \begin{verbatim} from Bio import SeqIO all_species == [seq_record.description.split()[1] for seq_record in \ SeqIO.parse("ls_orchid.fasta", "fasta")] print(all_species) \end{verbatim} In general, extracting information from the FASTA description line is not very nice. If you can get your sequences in a well annotated file format like GenBank or EMBL, then this sort of annotation information is much easier to deal with. \section{Parsing sequences from compressed files} \label{sec:SeqIO_compressed} In the previous section, we looked at parsing sequence data from a file. Instead of using a filename, you can give \verb|Bio.SeqIO| a handle (see Section~\ref{sec:appendix-handles}), and in this section we'll use handles to parse sequence from compressed files. As you'll have seen above, we can use \verb|Bio.SeqIO.read()| or \verb|Bio.SeqIO.parse()| with a filename - for instance this quick example calculates the total length of the sequences in a multiple record GenBank file using a generator expression: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> print(sum(len(r) for r in SeqIO.parse("ls_orchid.gbk", "gb"))) 67518 \end{verbatim} \noindent Here we use a file handle instead, using the \verb|with| statement to close the handle automatically: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> with open("ls_orchid.gbk") as handle: ... print(sum(len(r) for r in SeqIO.parse(handle, "gb"))) 67518 \end{verbatim} \noindent Or, the old fashioned way where you manually close the handle: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> handle = open("ls_orchid.gbk") >>> print(sum(len(r) for r in SeqIO.parse(handle, "gb"))) 67518 >>> handle.close() \end{verbatim} Now, suppose we have a gzip compressed file instead? These are very commonly used on Linux. We can use Python's \verb|gzip| module to open the compressed file for reading - which gives us a handle object: %This doctest fails on Python 3, http://bugs.python.org/issue13989 \begin{verbatim} >>> import gzip >>> from Bio import SeqIO >>> handle = gzip.open("ls_orchid.gbk.gz", "r") >>> print(sum(len(r) for r in SeqIO.parse(handle, "gb"))) 67518 >>> handle.close() \end{verbatim} Similarly if we had a bzip2 compressed file (sadly the function name isn't quite as consistent): %This doctest fails on Python 3 \begin{verbatim} >>> import bz2 >>> from Bio import SeqIO >>> handle = bz2.BZ2File("ls_orchid.gbk.bz2", "r") >>> print(sum(len(r) for r in SeqIO.parse(handle, "gb"))) 67518 >>> handle.close() \end{verbatim} \noindent If you are using Python 2.7 or later, the \verb|with|-version works for gzip and bz2 as well. Unfortunately this is broken on older versions of Python (\href{http://bugs.python.org/issue3860}{Issue 3860}) and you'd get an \verb|AttributeError| about \verb|__exit__| being missing. There is a gzip (GNU Zip) variant called BGZF (Blocked GNU Zip Format), which can be treated like an ordinary gzip file for reading, but has advantages for random access later which we'll talk about later in Section~\ref{sec:SeqIO-index-bgzf}. \section{Parsing sequences from the net} \label{sec:SeqIO_Online} In the previous sections, we looked at parsing sequence data from a file (using a filename or handle), and from compressed files (using a handle). Here we'll use \verb|Bio.SeqIO| with another type of handle, a network connection, to download and parse sequences from the internet. Note that just because you \emph{can} download sequence data and parse it into a \verb|SeqRecord| object in one go doesn't mean this is a good idea. In general, you should probably download sequences \emph{once} and save them to a file for reuse. \subsection{Parsing GenBank records from the net} \label{sec:SeqIO_GenBank_Online} Section~\ref{sec:efetch} talks about the Entrez EFetch interface in more detail, but for now let's just connect to the NCBI and get a few \textit{Opuntia} (prickly-pear) sequences from GenBank using their GI numbers. First of all, let's fetch just one record. If you don't care about the annotations and features downloading a FASTA file is a good choice as these are compact. Now remember, when you expect the handle to contain one and only one record, use the \verb|Bio.SeqIO.read()| function: \begin{verbatim} from Bio import Entrez from Bio import SeqIO Entrez.email = "A.N.Other@example.com" handle = Entrez.efetch(db="nucleotide", rettype="fasta", retmode="text", id="6273291") seq_record = SeqIO.read(handle, "fasta") handle.close() print("%s with %i features" % (seq_record.id, len(seq_record.features))) \end{verbatim} \noindent Expected output: \begin{verbatim} gi|6273291|gb|AF191665.1|AF191665 with 0 features \end{verbatim} The NCBI will also let you ask for the file in other formats, in particular as a GenBank file. Until Easter 2009, the Entrez EFetch API let you use ``genbank'' as the return type, however the NCBI now insist on using the official return types of ``gb'' (or ``gp'' for proteins) as described on \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html} {EFetch for Sequence and other Molecular Biology Databases}. As a result, in Biopython 1.50 onwards, we support ``gb'' as an alias for ``genbank'' in \verb|Bio.SeqIO|. \begin{verbatim} from Bio import Entrez from Bio import SeqIO Entrez.email = "A.N.Other@example.com" handle = Entrez.efetch(db="nucleotide", rettype="gb", retmode="text", id="6273291") seq_record = SeqIO.read(handle, "gb") #using "gb" as an alias for "genbank" handle.close() print("%s with %i features" % (seq_record.id, len(seq_record.features))) \end{verbatim} \noindent The expected output of this example is: \begin{verbatim} AF191665.1 with 3 features \end{verbatim} \noindent Notice this time we have three features. Now let's fetch several records. This time the handle contains multiple records, so we must use the \verb|Bio.SeqIO.parse()| function: \begin{verbatim} from Bio import Entrez from Bio import SeqIO Entrez.email = "A.N.Other@example.com" handle = Entrez.efetch(db="nucleotide", rettype="gb", retmode="text", \ id="6273291,6273290,6273289") for seq_record in SeqIO.parse(handle, "gb"): print seq_record.id, seq_record.description[:50] + "..." print "Sequence length %i," % len(seq_record), print "%i features," % len(seq_record.features), print "from: %s" % seq_record.annotations["source"] handle.close() \end{verbatim} \noindent That should give the following output: \begin{verbatim} AF191665.1 Opuntia marenae rpl16 gene; chloroplast gene for c... Sequence length 902, 3 features, from: chloroplast Opuntia marenae AF191664.1 Opuntia clavata rpl16 gene; chloroplast gene for c... Sequence length 899, 3 features, from: chloroplast Grusonia clavata AF191663.1 Opuntia bradtiana rpl16 gene; chloroplast gene for... Sequence length 899, 3 features, from: chloroplast Opuntia bradtianaa \end{verbatim} See Chapter~\ref{chapter:entrez} for more about the \verb|Bio.Entrez| module, and make sure to read about the NCBI guidelines for using Entrez (Section~\ref{sec:entrez-guidelines}). \subsection{Parsing SwissProt sequences from the net} \label{sec:SeqIO_ExPASy_and_SwissProt} Now let's use a handle to download a SwissProt file from ExPASy, something covered in more depth in Chapter~\ref{chapter:swiss_prot}. As mentioned above, when you expect the handle to contain one and only one record, use the \verb|Bio.SeqIO.read()| function: \begin{verbatim} from Bio import ExPASy from Bio import SeqIO handle = ExPASy.get_sprot_raw("O23729") seq_record = SeqIO.read(handle, "swiss") handle.close() print(seq_record.id) print(seq_record.name) print(seq_record.description) print(repr(seq_record.seq)) print("Length %i" % len(seq_record)) print(seq_record.annotations["keywords"]) \end{verbatim} \noindent Assuming your network connection is OK, you should get back: \begin{verbatim} O23729 CHS3_BROFI RecName: Full=Chalcone synthase 3; EC=2.3.1.74; AltName: Full=Naringenin-chalcone synthase 3; Seq('MAPAMEEIRQAQRAEGPAAVLAIGTSTPPNALYQADYPDYYFRITKSEHLTELK...GAE', ProteinAlphabet()) Length 394 ['Acyltransferase', 'Flavonoid biosynthesis', 'Transferase'] \end{verbatim} \section{Sequence files as Dictionaries} We're now going to introduce three related functions in the \verb|Bio.SeqIO| module which allow dictionary like random access to a multi-sequence file. There is a trade off here between flexibility and memory usage. In summary: \begin{itemize} \item \verb|Bio.SeqIO.to_dict()| is the most flexible but also the most memory demanding option (see Section~\ref{SeqIO:to_dict}). This is basically a helper function to build a normal Python \verb|dictionary| with each entry held as a \verb|SeqRecord| object in memory, allowing you to modify the records. \item \verb|Bio.SeqIO.index()| is a useful middle ground, acting like a read only dictionary and parsing sequences into \verb|SeqRecord| objects on demand (see Section~\ref{sec:SeqIO-index}). \item \verb|Bio.SeqIO.index_db()| also acts like a read only dictionary but stores the identifiers and file offsets in a file on disk (as an SQLite3 database), meaning it has very low memory requirements (see Section~\ref{sec:SeqIO-index-db}), but will be a little bit slower. \end{itemize} See the discussion for an broad overview (Section~\ref{sec:SeqIO-indexing-discussion}). \subsection{Sequence files as Dictionaries -- In memory} \label{SeqIO:to_dict} The next thing that we'll do with our ubiquitous orchid files is to show how to index them and access them like a database using the Python \verb|dictionary| data type (like a hash in Perl). This is very useful for moderately large files where you only need to access certain elements of the file, and makes for a nice quick 'n dirty database. For dealing with larger files where memory becomes a problem, see Section~\ref{sec:SeqIO-index} below. You can use the function \verb|Bio.SeqIO.to_dict()| to make a SeqRecord dictionary (in memory). By default this will use each record's identifier (i.e. the \verb|.id| attribute) as the key. Let's try this using our GenBank file: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.gbk", "genbank")) \end{verbatim} There is just one required argument for \verb|Bio.SeqIO.to_dict()|, a list or generator giving \verb|SeqRecord| objects. Here we have just used the output from the \verb|SeqIO.parse| function. As the name suggests, this returns a Python dictionary. Since this variable \verb|orchid_dict| is an ordinary Python dictionary, we can look at all of the keys we have available: %cont-doctest \begin{verbatim} >>> len(orchid_dict) 94 \end{verbatim} %Can't use following for doctest due to abbreviation \begin{verbatim} >>> orchid_dict.keys() ['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1'] \end{verbatim} If you really want to, you can even look at all the records at once: \begin{verbatim} >>> orchid_dict.values() #lots of output! ... \end{verbatim} We can access a single \verb|SeqRecord| object via the keys and manipulate the object as normal: %cont-doctest \begin{verbatim} >>> seq_record = orchid_dict["Z78475.1"] >>> print(seq_record.description) P.supardii 5.8S rRNA gene and ITS1 and ITS2 DNA. >>> print(repr(seq_record.seq)) Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACAT...GGT', IUPACAmbiguousDNA()) \end{verbatim} So, it is very easy to create an in memory ``database'' of our GenBank records. Next we'll try this for the FASTA file instead. Note that those of you with prior Python experience should all be able to construct a dictionary like this ``by hand''. However, typical dictionary construction methods will not deal with the case of repeated keys very nicely. Using the \verb|Bio.SeqIO.to_dict()| will explicitly check for duplicate keys, and raise an exception if any are found. \subsubsection{Specifying the dictionary keys} \label{seq:seqio-todict-functionkey} Using the same code as above, but for the FASTA file instead: \begin{verbatim} from Bio import SeqIO orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.fasta", "fasta")) print(orchid_dict.keys()) \end{verbatim} \noindent This time the keys are: \begin{verbatim} ['gi|2765596|emb|Z78471.1|PDZ78471', 'gi|2765646|emb|Z78521.1|CCZ78521', ... ..., 'gi|2765613|emb|Z78488.1|PTZ78488', 'gi|2765583|emb|Z78458.1|PHZ78458'] \end{verbatim} You should recognise these strings from when we parsed the FASTA file earlier in Section~\ref{sec:fasta-parsing}. Suppose you would rather have something else as the keys - like the accession numbers. This brings us nicely to \verb|SeqIO.to_dict()|'s optional argument \verb|key_function|, which lets you define what to use as the dictionary key for your records. First you must write your own function to return the key you want (as a string) when given a \verb|SeqRecord| object. In general, the details of function will depend on the sort of input records you are dealing with. But for our orchids, we can just split up the record's identifier using the ``pipe'' character (the vertical line) and return the fourth entry (field three): \begin{verbatim} def get_accession(record): """"Given a SeqRecord, return the accession number as a string. e.g. "gi|2765613|emb|Z78488.1|PTZ78488" -> "Z78488.1" """ parts = record.id.split("|") assert len(parts) == 5 and parts[0] == "gi" and parts[2] == "emb" return parts[3] \end{verbatim} \noindent Then we can give this function to the \verb|SeqIO.to_dict()| function to use in building the dictionary: \begin{verbatim} from Bio import SeqIO orchid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.fasta", "fasta"), key_function=get_accession) print(orchid_dict.keys()) \end{verbatim} \noindent Finally, as desired, the new dictionary keys: \begin{verbatim} >>> print(orchid_dict.keys()) ['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1'] \end{verbatim} \noindent Not too complicated, I hope! \subsubsection{Indexing a dictionary using the SEGUID checksum} To give another example of working with dictionaries of \verb|SeqRecord| objects, we'll use the SEGUID checksum function. This is a relatively recent checksum, and collisions should be very rare (i.e. two different sequences with the same checksum), an improvement on the CRC64 checksum. Once again, working with the orchids GenBank file: \begin{verbatim} from Bio import SeqIO from Bio.SeqUtils.CheckSum import seguid for record in SeqIO.parse("ls_orchid.gbk", "genbank"): print(record.id, seguid(record.seq)) \end{verbatim} \noindent This should give: \begin{verbatim} Z78533.1 JUEoWn6DPhgZ9nAyowsgtoD9TTo Z78532.1 MN/s0q9zDoCVEEc+k/IFwCNF2pY ... Z78439.1 H+JfaShya/4yyAj7IbMqgNkxdxQ \end{verbatim} Now, recall the \verb|Bio.SeqIO.to_dict()| function's \verb|key_function| argument expects a function which turns a \verb|SeqRecord| into a string. We can't use the \verb|seguid()| function directly because it expects to be given a \verb|Seq| object (or a string). However, we can use Python's \verb|lambda| feature to create a ``one off'' function to give to \verb|Bio.SeqIO.to_dict()| instead: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> from Bio.SeqUtils.CheckSum import seguid >>> seguid_dict = SeqIO.to_dict(SeqIO.parse("ls_orchid.gbk", "genbank"), ... lambda rec : seguid(rec.seq)) >>> record = seguid_dict["MN/s0q9zDoCVEEc+k/IFwCNF2pY"] >>> print(record.id) Z78532.1 >>> print(record.description) C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA. \end{verbatim} \noindent That should have retrieved the record {\tt Z78532.1}, the second entry in the file. \subsection{Sequence files as Dictionaries -- Indexed files} %\subsection{Indexing really large files} \label{sec:SeqIO-index} As the previous couple of examples tried to illustrate, using \verb|Bio.SeqIO.to_dict()| is very flexible. However, because it holds everything in memory, the size of file you can work with is limited by your computer's RAM. In general, this will only work on small to medium files. For larger files you should consider \verb|Bio.SeqIO.index()|, which works a little differently. Although it still returns a dictionary like object, this does \emph{not} keep \emph{everything} in memory. Instead, it just records where each record is within the file -- when you ask for a particular record, it then parses it on demand. As an example, let's use the same GenBank file as before: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index("ls_orchid.gbk", "genbank") >>> len(orchid_dict) 94 \end{verbatim} %Following is abbr. \begin{verbatim} >>> orchid_dict.keys() ['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1'] \end{verbatim} %cont-doctest \begin{verbatim} >>> seq_record = orchid_dict["Z78475.1"] >>> print(seq_record.description) P.supardii 5.8S rRNA gene and ITS1 and ITS2 DNA. >>> seq_record.seq Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACAT...GGT', IUPACAmbiguousDNA()) \end{verbatim} \noindent Note that \verb|Bio.SeqIO.index()| won't take a handle, but only a filename. There are good reasons for this, but it is a little technical. The second argument is the file format (a lower case string as used in the other \verb|Bio.SeqIO| functions). You can use many other simple file formats, including FASTA and FASTQ files (see the example in Section~\ref{sec:fastq-indexing}). However, alignment formats like PHYLIP or Clustal are not supported. Finally as an optional argument you can supply an alphabet, or a key function. Here is the same example using the FASTA file - all we change is the filename and the format name: \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index("ls_orchid.fasta", "fasta") >>> len(orchid_dict) 94 >>> orchid_dict.keys() ['gi|2765596|emb|Z78471.1|PDZ78471', 'gi|2765646|emb|Z78521.1|CCZ78521', ... ..., 'gi|2765613|emb|Z78488.1|PTZ78488', 'gi|2765583|emb|Z78458.1|PHZ78458'] \end{verbatim} \subsubsection{Specifying the dictionary keys} \label{seq:seqio-index-functionkey} Suppose you want to use the same keys as before? Much like with the \verb|Bio.SeqIO.to_dict()| example in Section~\ref{seq:seqio-todict-functionkey}, you'll need to write a tiny function to map from the FASTA identifier (as a string) to the key you want: \begin{verbatim} def get_acc(identifier): """"Given a SeqRecord identifier string, return the accession number as a string. e.g. "gi|2765613|emb|Z78488.1|PTZ78488" -> "Z78488.1" """ parts = identifier.split("|") assert len(parts) == 5 and parts[0] == "gi" and parts[2] == "emb" return parts[3] \end{verbatim} \noindent Then we can give this function to the \verb|Bio.SeqIO.index()| function to use in building the dictionary: \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index("ls_orchid.fasta", "fasta", key_function=get_acc) >>> print(orchid_dict.keys()) ['Z78484.1', 'Z78464.1', 'Z78455.1', 'Z78442.1', 'Z78532.1', 'Z78453.1', ..., 'Z78471.1'] \end{verbatim} \noindent Easy when you know how? \subsubsection{Getting the raw data for a record} \label{sec:seqio-index-getraw} The dictionary-like object from \verb|Bio.SeqIO.index()| gives you each entry as a \verb|SeqRecord| object. However, it is sometimes useful to be able to get the original raw data straight from the file. For this use the \verb|get_raw()| method which takes a single argument (the record identifier) and returns a string (extracted from the file without modification). A motivating example is extracting a subset of a records from a large file where either \verb|Bio.SeqIO.write()| does not (yet) support the output file format (e.g. the plain text SwissProt file format) or where you need to preserve the text exactly (e.g. GenBank or EMBL output from Biopython does not yet preserve every last bit of annotation). Let's suppose you have download the whole of UniProt in the plain text SwissPort file format from their FTP site (\url{ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.dat.gz}) and uncompressed it as the file \verb|uniprot_sprot.dat|, and you want to extract just a few records from it: \begin{verbatim} >>> from Bio import SeqIO >>> uniprot = SeqIO.index("uniprot_sprot.dat", "swiss") >>> handle = open("selected.dat", "w") >>> for acc in ["P33487", "P19801", "P13689", "Q8JZQ5", "Q9TRC7"]: ... handle.write(uniprot.get_raw(acc)) >>> handle.close() \end{verbatim} There is a longer example in Section~\ref{sec:SeqIO-sort} using the \verb|SeqIO.index()| function to sort a large sequence file (without loading everything into memory at once). \subsection{Sequence files as Dictionaries -- Database indexed files} \label{sec:SeqIO-index-db} Biopython 1.57 introduced an alternative, \verb|Bio.SeqIO.index_db()|, which can work on even extremely large files since it stores the record information as a file on disk (using an SQLite3 database) rather than in memory. Also, you can index multiple files together (providing all the record identifiers are unique). The \verb|Bio.SeqIO.index()| function takes three required arguments: \begin{itemize} \item Index filename, we suggest using something ending \texttt{.idx}. This index file is actually an SQLite3 database. \item List of sequence filenames to index (or a single filename) \item File format (lower case string as used in the rest of the \verb|SeqIO| module). \end{itemize} As an example, consider the GenBank flat file releases from the NCBI FTP site, \url{ftp://ftp.ncbi.nih.gov/genbank/}, which are gzip compressed GenBank files. As of GenBank release $182$, there are $16$ files making up the viral sequences, \texttt{gbvrl1.seq}, \ldots, \texttt{gbvrl16.seq}, containing in total almost one million records. You can index them like this: \begin{verbatim} >>> from Bio import SeqIO >>> files = ["gbvrl%i.seq" % (i+1) for i in range(16)] >>> gb_vrl = SeqIO.index_db("gbvrl.idx", files, "genbank") >>> print("%i sequences indexed" % len(gb_vrl)) 958086 sequences indexed \end{verbatim} That takes about two minutes to run on my machine. If you rerun it then the index file (here \texttt{gbvrl.idx}) is reloaded in under a second. You can use the index as a read only Python dictionary - without having to worry about which file the sequence comes from, e.g. \begin{verbatim} >>> print(gb_vrl["GQ333173.1"].description) HIV-1 isolate F12279A1 from Uganda gag protein (gag) gene, partial cds. \end{verbatim} \subsubsection{Getting the raw data for a record} Just as with the \verb|Bio.SeqIO.index()| function discussed above in Section~\ref{sec:seqio-index-getraw}, the dictionary like object also lets you get at the raw text of each record: \begin{verbatim} >>> print(gb_vrl.get_raw("GQ333173.1")) LOCUS GQ333173 459 bp DNA linear VRL 21-OCT-2009 DEFINITION HIV-1 isolate F12279A1 from Uganda gag protein (gag) gene, partial cds. ACCESSION GQ333173 ... // \end{verbatim} \subsection{Indexing compressed files} \label{sec:SeqIO-index-bgzf} Very often when you are indexing a sequence file it can be quite large -- so you may want to compress it on disk. Unfortunately efficient random access is difficult with the more common file formats like gzip and bzip2. In this setting, BGZF (Blocked GNU Zip Format) can be very helpful. This is a variant of gzip (and can be decompressed using standard gzip tools) popularised by the BAM file format, \href{http://samtools.sourceforge.net/}{samtools}, and \href{http://samtools.sourceforge.net/tabix.shtml}{tabix}. To create a BGZF compressed file you can use the command line tool \verb|bgzip| which comes with samtools. In our examples we use a filename extension \verb|*.bgz|, so they can be distinguished from normal gzipped files (named \verb|*.gz|). You can also use the \verb|Bio.bgzf| module to read and write BGZF files from within Python. The \verb|Bio.SeqIO.index()| and \verb|Bio.SeqIO.index_db()| can both be used with BGZF compressed files. For example, if you started with an uncompressed GenBank file: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index("ls_orchid.gbk", "genbank") >>> len(orchid_dict) 94 \end{verbatim} You could compress this (while keeping the original file) at the command line using the following command -- but don't worry, the compressed file is already included with the other example files: \begin{verbatim} $ bgzip -c ls_orchid.gbk > ls_orchid.gbk.bgz \end{verbatim} You can use the compressed file in exactly the same way: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index("ls_orchid.gbk.bgz", "genbank") >>> len(orchid_dict) 94 \end{verbatim} \noindent or: %Don't use doctest as would have to clean up the *.idx file \begin{verbatim} >>> from Bio import SeqIO >>> orchid_dict = SeqIO.index_db("ls_orchid.gbk.bgz.idx", "ls_orchid.gbk.bgz", "genbank") >>> len(orchid_dict) 94 \end{verbatim} The \verb|SeqIO| indexing automatically detects the BGZF compression. Note that you can't use the same index file for the uncompressed and compressed files. \subsection{Discussion} \label{sec:SeqIO-indexing-discussion} So, which of these methods should you use and why? It depends on what you are trying to do (and how much data you are dealing with). However, in general picking \verb|Bio.SeqIO.index()| is a good starting point. If you are dealing with millions of records, multiple files, or repeated analyses, then look at \verb|Bio.SeqIO.index_db()|. Reasons to choose \verb|Bio.SeqIO.to_dict()| over either \verb|Bio.SeqIO.index()| or \verb|Bio.SeqIO.index_db()| boil down to a need for flexibility despite its high memory needs. The advantage of storing the \verb|SeqRecord| objects in memory is they can be changed, added to, or removed at will. In addition to the downside of high memory consumption, indexing can also take longer because all the records must be fully parsed. Both \verb|Bio.SeqIO.index()| and \verb|Bio.SeqIO.index_db()| only parse records on demand. When indexing, they scan the file once looking for the start of each record and do as little work as possible to extract the identifier. Reasons to choose \verb|Bio.SeqIO.index()| over \verb|Bio.SeqIO.index_db()| include: \begin{itemize} \item Faster to build the index (more noticeable in simple file formats) \item Slightly faster access as SeqRecord objects (but the difference is only really noticeable for simple to parse file formats). \item Can use any immutable Python object as the dictionary keys (e.g. a tuple of strings, or a frozen set) not just strings. \item Don't need to worry about the index database being out of date if the sequence file being indexed has changed. \end{itemize} Reasons to choose \verb|Bio.SeqIO.index_db()| over \verb|Bio.SeqIO.index()| include: \begin{itemize} \item Not memory limited -- this is already important with files from second generation sequencing where 10s of millions of sequences are common, and using \verb|Bio.SeqIO.index()| can require more than 4GB of RAM and therefore a 64bit version of Python. \item Because the index is kept on disk, it can be reused. Although building the index database file takes longer, if you have a script which will be rerun on the same datafiles in future, this could save time in the long run. \item Indexing multiple files together \item The \verb|get_raw()| method can be much faster, since for most file formats the length of each record is stored as well as its offset. \end{itemize} \section{Writing Sequence Files} We've talked about using \verb|Bio.SeqIO.parse()| for sequence input (reading files), and now we'll look at \verb|Bio.SeqIO.write()| which is for sequence output (writing files). This is a function taking three arguments: some \verb|SeqRecord| objects, a handle or filename to write to, and a sequence format. Here is an example, where we start by creating a few \verb|SeqRecord| objects the hard way (by hand, rather than by loading them from a file): \begin{verbatim} from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio.Alphabet import generic_protein rec1 = SeqRecord(Seq("MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD" \ +"GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK" \ +"NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM" \ +"SSAC", generic_protein), id="gi|14150838|gb|AAK54648.1|AF376133_1", description="chalcone synthase [Cucumis sativus]") rec2 = SeqRecord(Seq("YPDYYFRITNREHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDARQ" \ +"DMVVVEIPKLGKEAAVKAIKEWGQ", generic_protein), id="gi|13919613|gb|AAK33142.1|", description="chalcone synthase [Fragaria vesca subsp. bracteata]") rec3 = SeqRecord(Seq("MVTVEEFRRAQCAEGPATVMAIGTATPSNCVDQSTYPDYYFRITNSEHKVELKEKFKRMC" \ +"EKSMIKKRYMHLTEEILKENPNICAYMAPSLDARQDIVVVEVPKLGKEAAQKAIKEWGQP" \ +"KSKITHLVFCTTSGVDMPGCDYQLTKLLGLRPSVKRFMMYQQGCFAGGTVLRMAKDLAEN" \ +"NKGARVLVVCSEITAVTFRGPNDTHLDSLVGQALFGDGAAAVIIGSDPIPEVERPLFELV" \ +"SAAQTLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLVEAFQPLGISDWNSLFW" \ +"IAHPGGPAILDQVELKLGLKQEKLKATRKVLSNYGNMSSACVLFILDEMRKASAKEGLGT" \ +"TGEGLEWGVLFGFGPGLTVETVVLHSVAT", generic_protein), id="gi|13925890|gb|AAK49457.1|", description="chalcone synthase [Nicotiana tabacum]") my_records = [rec1, rec2, rec3] \end{verbatim} \noindent Now we have a list of \verb|SeqRecord| objects, we'll write them to a FASTA format file: \begin{verbatim} from Bio import SeqIO SeqIO.write(my_records, "my_example.faa", "fasta") \end{verbatim} \noindent And if you open this file in your favourite text editor it should look like this: \begin{verbatim} >gi|14150838|gb|AAK54648.1|AF376133_1 chalcone synthase [Cucumis sativus] MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQALFGD GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM SSAC >gi|13919613|gb|AAK33142.1| chalcone synthase [Fragaria vesca subsp. bracteata] YPDYYFRITNREHKAELKEKFQRMCDKSMIKKRYMYLTEEILKENPSMCEYMAPSLDARQ DMVVVEIPKLGKEAAVKAIKEWGQ >gi|13925890|gb|AAK49457.1| chalcone synthase [Nicotiana tabacum] MVTVEEFRRAQCAEGPATVMAIGTATPSNCVDQSTYPDYYFRITNSEHKVELKEKFKRMC EKSMIKKRYMHLTEEILKENPNICAYMAPSLDARQDIVVVEVPKLGKEAAQKAIKEWGQP KSKITHLVFCTTSGVDMPGCDYQLTKLLGLRPSVKRFMMYQQGCFAGGTVLRMAKDLAEN NKGARVLVVCSEITAVTFRGPNDTHLDSLVGQALFGDGAAAVIIGSDPIPEVERPLFELV SAAQTLLPDSEGAIDGHLREVGLTFHLLKDVPGLISKNIEKSLVEAFQPLGISDWNSLFW IAHPGGPAILDQVELKLGLKQEKLKATRKVLSNYGNMSSACVLFILDEMRKASAKEGLGT TGEGLEWGVLFGFGPGLTVETVVLHSVAT \end{verbatim} Suppose you wanted to know how many records the \verb|Bio.SeqIO.write()| function wrote to the handle? If your records were in a list you could just use \verb|len(my_records)|, however you can't do that when your records come from a generator/iterator. The \verb|Bio.SeqIO.write()| function returns the number of \verb|SeqRecord| objects written to the file. \emph{Note} - If you tell the \verb|Bio.SeqIO.write()| function to write to a file that already exists, the old file will be overwritten without any warning. \subsection{Round trips} Some people like their parsers to be ``round-tripable'', meaning if you read in a file and write it back out again it is unchanged. This requires that the parser must extract enough information to reproduce the original file \emph{exactly}. \verb|Bio.SeqIO| does \emph{not} aim to do this. As a trivial example, any line wrapping of the sequence data in FASTA files is allowed. An identical \verb|SeqRecord| would be given from parsing the following two examples which differ only in their line breaks: \begin{verbatim} >YAL068C-7235.2170 Putative promoter sequence TACGAGAATAATTTCTCATCATCCAGCTTTAACACAAAATTCGCACAGTTTTCGTTAAGA GAACTTAACATTTTCTTATGACGTAAATGAAGTTTATATATAAATTTCCTTTTTATTGGA >YAL068C-7235.2170 Putative promoter sequence TACGAGAATAATTTCTCATCATCCAGCTTTAACACAAAATTCGCA CAGTTTTCGTTAAGAGAACTTAACATTTTCTTATGACGTAAATGA AGTTTATATATAAATTTCCTTTTTATTGGA \end{verbatim} To make a round-tripable FASTA parser you would need to keep track of where the sequence line breaks occurred, and this extra information is usually pointless. Instead Biopython uses a default line wrapping of $60$ characters on output. The same problem with white space applies in many other file formats too. Another issue in some cases is that Biopython does not (yet) preserve every last bit of annotation (e.g. GenBank and EMBL). Occasionally preserving the original layout (with any quirks it may have) is important. See Section~\ref{sec:seqio-index-getraw} about the \verb|get_raw()| method of the \verb|Bio.SeqIO.index()| dictionary-like object for one potential solution. \subsection{Converting between sequence file formats} \label{sec:SeqIO-conversion} In previous example we used a list of \verb|SeqRecord| objects as input to the \verb|Bio.SeqIO.write()| function, but it will also accept a \verb|SeqRecord| iterator like we get from \verb|Bio.SeqIO.parse()| -- this lets us do file conversion by combining these two functions. For this example we'll read in the GenBank format file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.gbk}{ls\_orchid.gbk} and write it out in FASTA format: \begin{verbatim} from Bio import SeqIO records = SeqIO.parse("ls_orchid.gbk", "genbank") count = SeqIO.write(records, "my_example.fasta", "fasta") print("Converted %i records" % count) \end{verbatim} Still, that is a little bit complicated. So, because file conversion is such a common task, there is a helper function letting you replace that with just: \begin{verbatim} from Bio import SeqIO count = SeqIO.convert("ls_orchid.gbk", "genbank", "my_example.fasta", "fasta") print("Converted %i records" % count) \end{verbatim} The \verb|Bio.SeqIO.convert()| function will take handles \emph{or} filenames. Watch out though -- if the output file already exists, it will overwrite it! To find out more, see the built in help: \begin{verbatim} >>> from Bio import SeqIO >>> help(SeqIO.convert) ... \end{verbatim} In principle, just by changing the filenames and the format names, this code could be used to convert between any file formats available in Biopython. However, writing some formats requires information (e.g. quality scores) which other files formats don't contain. For example, while you can turn a FASTQ file into a FASTA file, you can't do the reverse. See also Sections~\ref{sec:SeqIO-fastq-conversion} and~\ref{sec:SeqIO-fasta-qual-conversion} in the cookbook chapter which looks at inter-converting between different FASTQ formats. Finally, as an added incentive for using the \verb|Bio.SeqIO.convert()| function (on top of the fact your code will be shorter), doing it this way may also be faster! The reason for this is the convert function can take advantage of several file format specific optimisations and tricks. \subsection{Converting a file of sequences to their reverse complements} \label{sec:SeqIO-reverse-complement} Suppose you had a file of nucleotide sequences, and you wanted to turn it into a file containing their reverse complement sequences. This time a little bit of work is required to transform the \verb|SeqRecord| objects we get from our input file into something suitable for saving to our output file. To start with, we'll use \verb|Bio.SeqIO.parse()| to load some nucleotide sequences from a file, then print out their reverse complements using the \verb|Seq| object's built in \verb|.reverse_complement()| method (see Section~\ref{sec:seq-reverse-complement}): \begin{verbatim} >>> from Bio import SeqIO >>> for record in SeqIO.parse("ls_orchid.gbk", "genbank"): ... print(record.id) ... print(record.seq.reverse_complement()) \end{verbatim} Now, if we want to save these reverse complements to a file, we'll need to make \verb|SeqRecord| objects. We can use the \verb|SeqRecord| object's built in \verb|.reverse_complement()| method (see Section~\ref{sec:SeqRecord-reverse-complement}) but we must decide how to name our new records. This is an excellent place to demonstrate the power of list comprehensions which make a list in memory: %doctest examples \begin{verbatim} >>> from Bio import SeqIO >>> records = [rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \ ... for rec in SeqIO.parse("ls_orchid.fasta", "fasta")] >>> len(records) 94 \end{verbatim} \noindent Now list comprehensions have a nice trick up their sleeves, you can add a conditional statement: %cont-doctest examples \begin{verbatim} >>> records = [rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \ ... for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700] >>> len(records) 18 \end{verbatim} That would create an in memory list of reverse complement records where the sequence length was under 700 base pairs. However, we can do exactly the same with a generator expression - but with the advantage that this does not create a list of all the records in memory at once: %cont-doctest examples \begin{verbatim} >>> records = (rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \ ... for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700) \end{verbatim} As a complete example: %not a doctest as would have to remove the output file \begin{verbatim} >>> from Bio import SeqIO >>> records = (rec.reverse_complement(id="rc_"+rec.id, description = "reverse complement") \ ... for rec in SeqIO.parse("ls_orchid.fasta", "fasta") if len(rec)<700) >>> SeqIO.write(records, "rev_comp.fasta", "fasta") 18 \end{verbatim} There is a related example in Section~\ref{sec:SeqIO-translate}, translating each record in a FASTA file from nucleotides to amino acids. \subsection{Getting your SeqRecord objects as formatted strings} \label{sec:Bio.SeqIO-and-StringIO} Suppose that you don't really want to write your records to a file or handle -- instead you want a string containing the records in a particular file format. The \verb|Bio.SeqIO| interface is based on handles, but Python has a useful built in module which provides a string based handle. For an example of how you might use this, let's load in a bunch of \verb|SeqRecord| objects from our orchids GenBank file, and create a string containing the records in FASTA format: \begin{verbatim} from Bio import SeqIO from StringIO import StringIO records = SeqIO.parse("ls_orchid.gbk", "genbank") out_handle = StringIO() SeqIO.write(records, out_handle, "fasta") fasta_data = out_handle.getvalue() print(fasta_data) \end{verbatim} This isn't entirely straightforward the first time you see it! On the bright side, for the special case where you would like a string containing a \emph{single} record in a particular file format, use the the \verb|SeqRecord| class' \verb|format()| method (see Section~\ref{sec:SeqRecord-format}). Note that although we don't encourage it, you \emph{can} use the \verb|format()| method to write to a file, for example something like this: \begin{verbatim} from Bio import SeqIO out_handle = open("ls_orchid_long.tab", "w") for record in SeqIO.parse("ls_orchid.gbk", "genbank"): if len(record) > 100: out_handle.write(record.format("tab")) out_handle.close() \end{verbatim} \noindent While this style of code will work for a simple sequential file format like FASTA or the simple tab separated format used here, it will \emph{not} work for more complex or interlaced file formats. This is why we still recommend using \verb|Bio.SeqIO.write()|, as in the following example: \begin{verbatim} from Bio import SeqIO records = (rec for rec in SeqIO.parse("ls_orchid.gbk", "genbank") if len(rec) > 100) SeqIO.write(records, "ls_orchid.tab", "tab") \end{verbatim} \noindent Making a single call to \verb|SeqIO.write(...)| is also much quicker than multiple calls to the \verb|SeqRecord.format(...)| method. \chapter{Multiple Sequence Alignment objects} \label{chapter:Bio.AlignIO} This chapter is about Multiple Sequence Alignments, by which we mean a collection of multiple sequences which have been aligned together -- usually with the insertion of gap characters, and addition of leading or trailing gaps -- such that all the sequence strings are the same length. Such an alignment can be regarded as a matrix of letters, where each row is held as a \verb|SeqRecord| object internally. We will introduce the \verb|MultipleSeqAlignment| object which holds this kind of data, and the \verb|Bio.AlignIO| module for reading and writing them as various file formats (following the design of the \verb|Bio.SeqIO| module from the previous chapter). Note that both \verb|Bio.SeqIO| and \verb|Bio.AlignIO| can read and write sequence alignment files. The appropriate choice will depend largely on what you want to do with the data. The final part of this chapter is about our command line wrappers for common multiple sequence alignment tools like ClustalW and MUSCLE. \section{Parsing or Reading Sequence Alignments} We have two functions for reading in sequence alignments, \verb|Bio.AlignIO.read()| and \verb|Bio.AlignIO.parse()| which following the convention introduced in \verb|Bio.SeqIO| are for files containing one or multiple alignments respectively. Using \verb|Bio.AlignIO.parse()| will return an {\it iterator} which gives \verb|MultipleSeqAlignment| objects. Iterators are typically used in a for loop. Examples of situations where you will have multiple different alignments include resampled alignments from the PHYLIP tool \verb|seqboot|, or multiple pairwise alignments from the EMBOSS tools \verb|water| or \verb|needle|, or Bill Pearson's FASTA tools. However, in many situations you will be dealing with files which contain only a single alignment. In this case, you should use the \verb|Bio.AlignIO.read()| function which returns a single \verb|MultipleSeqAlignment| object. Both functions expect two mandatory arguments: \begin{enumerate} \item The first argument is a {\it handle} to read the data from, typically an open file (see Section~\ref{sec:appendix-handles}), or a filename. \item The second argument is a lower case string specifying the alignment format. As in \verb|Bio.SeqIO| we don't try and guess the file format for you! See \url{http://biopython.org/wiki/AlignIO} for a full listing of supported formats. \end{enumerate} \noindent There is also an optional \verb|seq_count| argument which is discussed in Section~\ref{sec:AlignIO-count-argument} below for dealing with ambiguous file formats which may contain more than one alignment. A further optional \verb|alphabet| argument allowing you to specify the expected alphabet. This can be useful as many alignment file formats do not explicitly label the sequences as RNA, DNA or protein -- which means \verb|Bio.AlignIO| will default to using a generic alphabet. \subsection{Single Alignments} As an example, consider the following annotation rich protein alignment in the PFAM or Stockholm file format: \begin{verbatim} # STOCKHOLM 1.0 #=GS COATB_BPIKE/30-81 AC P03620.1 #=GS COATB_BPIKE/30-81 DR PDB; 1ifl ; 1-52; #=GS Q9T0Q8_BPIKE/1-52 AC Q9T0Q8.1 #=GS COATB_BPI22/32-83 AC P15416.1 #=GS COATB_BPM13/24-72 AC P69541.1 #=GS COATB_BPM13/24-72 DR PDB; 2cpb ; 1-49; #=GS COATB_BPM13/24-72 DR PDB; 2cps ; 1-49; #=GS COATB_BPZJ2/1-49 AC P03618.1 #=GS Q9T0Q9_BPFD/1-49 AC Q9T0Q9.1 #=GS Q9T0Q9_BPFD/1-49 DR PDB; 1nh4 A; 1-49; #=GS COATB_BPIF1/22-73 AC P03619.2 #=GS COATB_BPIF1/22-73 DR PDB; 1ifk ; 1-50; COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA #=GR COATB_BPIKE/30-81 SS -HHHHHHHHHHHHHH--HHHHHHHH--HHHHHHHHHHHHHHHHHHHHH---- Q9T0Q8_BPIKE/1-52 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA COATB_BPI22/32-83 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPM13/24-72 AEGDDP...AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA #=GR COATB_BPM13/24-72 SS ---S-T...CHCHHHHCCCCTCCCTTCHHHHHHHHHHHHHHHHHHHHCTT-- COATB_BPZJ2/1-49 AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA Q9T0Q9_BPFD/1-49 AEGDDP...AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA #=GR Q9T0Q9_BPFD/1-49 SS ------...-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH-- COATB_BPIF1/22-73 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA #=GR COATB_BPIF1/22-73 SS XX-HHHH--HHHHHH--HHHHHHH--HHHHHHHHHHHHHHHHHHHHHHH--- #=GC SS_cons XHHHHHHHHHHHHHHHCHHHHHHHHCHHHHHHHHHHHHHHHHHHHHHHHC-- #=GC seq_cons AEssss...AptAhDSLpspAT-hIu.sWshVsslVsAsluIKLFKKFsSKA // \end{verbatim} This is the seed alignment for the Phage\_Coat\_Gp8 (PF05371) PFAM entry, downloaded from a now out of date release of PFAM from \url{http://pfam.sanger.ac.uk/}. We can load this file as follows (assuming it has been saved to disk as ``PF05371\_seed.sth'' in the current working directory): %doctest examples \begin{verbatim} >>> from Bio import AlignIO >>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm") \end{verbatim} \noindent This code will print out a summary of the alignment: %cont-doctest \begin{verbatim} >>> print(alignment) SingleLetterAlphabet() alignment with 7 rows and 52 columns AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRL...SKA COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKL...SRA Q9T0Q8_BPIKE/1-52 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRL...SKA COATB_BPI22/32-83 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73 \end{verbatim} You'll notice in the above output the sequences have been truncated. We could instead write our own code to format this as we please by iterating over the rows as \verb|SeqRecord| objects: %doctest examples \begin{verbatim} >>> from Bio import AlignIO >>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm") >>> print("Alignment length %i" % alignment.get_alignment_length()) Alignment length 52 >>> for record in alignment: ... print("%s - %s" % (record.seq, record.id)) AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA - COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA - Q9T0Q8_BPIKE/1-52 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA - COATB_BPI22/32-83 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - COATB_BPM13/24-72 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA - COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - Q9T0Q9_BPFD/1-49 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA - COATB_BPIF1/22-73 \end{verbatim} You could also use the alignment object's \verb|format| method to show it in a particular file format -- see Section~\ref{sec:alignment-format-method} for details. Did you notice in the raw file above that several of the sequences include database cross-references to the PDB and the associated known secondary structure? Try this: %cont-doctest \begin{verbatim} >>> for record in alignment: ... if record.dbxrefs: ... print("%s %s" % (record.id, record.dbxrefs)) COATB_BPIKE/30-81 ['PDB; 1ifl ; 1-52;'] COATB_BPM13/24-72 ['PDB; 2cpb ; 1-49;', 'PDB; 2cps ; 1-49;'] Q9T0Q9_BPFD/1-49 ['PDB; 1nh4 A; 1-49;'] COATB_BPIF1/22-73 ['PDB; 1ifk ; 1-50;'] \end{verbatim} \noindent To have a look at all the sequence annotation, try this: \begin{verbatim} >>> for record in alignment: ... print(record) \end{verbatim} Sanger provide a nice web interface at \url{http://pfam.sanger.ac.uk/family?acc=PF05371} which will actually let you download this alignment in several other formats. This is what the file looks like in the FASTA file format: \begin{verbatim} >COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA >Q9T0Q8_BPIKE/1-52 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA >COATB_BPI22/32-83 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA >COATB_BPM13/24-72 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA >COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA >Q9T0Q9_BPFD/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA >COATB_BPIF1/22-73 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA \end{verbatim} \noindent Note the website should have an option about showing gaps as periods (dots) or dashes, we've shown dashes above. Assuming you download and save this as file ``PF05371\_seed.faa'' then you can load it with almost exactly the same code: \begin{verbatim} from Bio import AlignIO alignment = AlignIO.read("PF05371_seed.faa", "fasta") print(alignment) \end{verbatim} All that has changed in this code is the filename and the format string. You'll get the same output as before, the sequences and record identifiers are the same. However, as you should expect, if you check each \verb|SeqRecord| there is no annotation nor database cross-references because these are not included in the FASTA file format. Note that rather than using the Sanger website, you could have used \verb|Bio.AlignIO| to convert the original Stockholm format file into a FASTA file yourself (see below). With any supported file format, you can load an alignment in exactly the same way just by changing the format string. For example, use ``phylip'' for PHYLIP files, ``nexus'' for NEXUS files or ``emboss'' for the alignments output by the EMBOSS tools. There is a full listing on the wiki page (\url{http://biopython.org/wiki/AlignIO}) and in the built in documentation (also \href{http://biopython.org/DIST/docs/api/Bio.AlignIO-module.html}{online}): \begin{verbatim} >>> from Bio import AlignIO >>> help(AlignIO) ... \end{verbatim} \subsection{Multiple Alignments} The previous section focused on reading files containing a single alignment. In general however, files can contain more than one alignment, and to read these files we must use the \verb|Bio.AlignIO.parse()| function. Suppose you have a small alignment in PHYLIP format: \begin{verbatim} 5 6 Alpha AACAAC Beta AACCCC Gamma ACCAAC Delta CCACCA Epsilon CCAAAC \end{verbatim} If you wanted to bootstrap a phylogenetic tree using the PHYLIP tools, one of the steps would be to create a set of many resampled alignments using the tool \verb|bootseq|. This would give output something like this, which has been abbreviated for conciseness: \begin{verbatim} 5 6 Alpha AAACCA Beta AAACCC Gamma ACCCCA Delta CCCAAC Epsilon CCCAAA 5 6 Alpha AAACAA Beta AAACCC Gamma ACCCAA Delta CCCACC Epsilon CCCAAA 5 6 Alpha AAAAAC Beta AAACCC Gamma AACAAC Delta CCCCCA Epsilon CCCAAC ... 5 6 Alpha AAAACC Beta ACCCCC Gamma AAAACC Delta CCCCAA Epsilon CAAACC \end{verbatim} If you wanted to read this in using \verb|Bio.AlignIO| you could use: %TODO - Replace the print blank line with print()? \begin{verbatim} from Bio import AlignIO alignments = AlignIO.parse("resampled.phy", "phylip") for alignment in alignments: print(alignment) print("") \end{verbatim} \noindent This would give the following output, again abbreviated for display: \begin{verbatim} SingleLetterAlphabet() alignment with 5 rows and 6 columns AAACCA Alpha AAACCC Beta ACCCCA Gamma CCCAAC Delta CCCAAA Epsilon SingleLetterAlphabet() alignment with 5 rows and 6 columns AAACAA Alpha AAACCC Beta ACCCAA Gamma CCCACC Delta CCCAAA Epsilon SingleLetterAlphabet() alignment with 5 rows and 6 columns AAAAAC Alpha AAACCC Beta AACAAC Gamma CCCCCA Delta CCCAAC Epsilon ... SingleLetterAlphabet() alignment with 5 rows and 6 columns AAAACC Alpha ACCCCC Beta AAAACC Gamma CCCCAA Delta CAAACC Epsilon \end{verbatim} As with the function \verb|Bio.SeqIO.parse()|, using \verb|Bio.AlignIO.parse()| returns an iterator. If you want to keep all the alignments in memory at once, which will allow you to access them in any order, then turn the iterator into a list: \begin{verbatim} from Bio import AlignIO alignments = list(AlignIO.parse("resampled.phy", "phylip")) last_align = alignments[-1] first_align = alignments[0] \end{verbatim} \subsection{Ambiguous Alignments} \label{sec:AlignIO-count-argument} Many alignment file formats can explicitly store more than one alignment, and the division between each alignment is clear. However, when a general sequence file format has been used there is no such block structure. The most common such situation is when alignments have been saved in the FASTA file format. For example consider the following: \begin{verbatim} >Alpha ACTACGACTAGCTCAG--G >Beta ACTACCGCTAGCTCAGAAG >Gamma ACTACGGCTAGCACAGAAG >Alpha ACTACGACTAGCTCAGG-- >Beta ACTACCGCTAGCTCAGAAG >Gamma ACTACGGCTAGCACAGAAG \end{verbatim} \noindent This could be a single alignment containing six sequences (with repeated identifiers). Or, judging from the identifiers, this is probably two different alignments each with three sequences, which happen to all have the same length. What about this next example? \begin{verbatim} >Alpha ACTACGACTAGCTCAG--G >Beta ACTACCGCTAGCTCAGAAG >Alpha ACTACGACTAGCTCAGG-- >Gamma ACTACGGCTAGCACAGAAG >Alpha ACTACGACTAGCTCAGG-- >Delta ACTACGGCTAGCACAGAAG \end{verbatim} \noindent Again, this could be a single alignment with six sequences. However this time based on the identifiers we might guess this is three pairwise alignments which by chance have all got the same lengths. This final example is similar: \begin{verbatim} >Alpha ACTACGACTAGCTCAG--G >XXX ACTACCGCTAGCTCAGAAG >Alpha ACTACGACTAGCTCAGG >YYY ACTACGGCAAGCACAGG >Alpha --ACTACGAC--TAGCTCAGG >ZZZ GGACTACGACAATAGCTCAGG \end{verbatim} \noindent In this third example, because of the differing lengths, this cannot be treated as a single alignment containing all six records. However, it could be three pairwise alignments. Clearly trying to store more than one alignment in a FASTA file is not ideal. However, if you are forced to deal with these as input files \verb|Bio.AlignIO| can cope with the most common situation where all the alignments have the same number of records. One example of this is a collection of pairwise alignments, which can be produced by the EMBOSS tools \verb|needle| and \verb|water| -- although in this situation, \verb|Bio.AlignIO| should be able to understand their native output using ``emboss'' as the format string. To interpret these FASTA examples as several separate alignments, we can use \verb|Bio.AlignIO.parse()| with the optional \verb|seq_count| argument which specifies how many sequences are expected in each alignment (in these examples, 3, 2 and 2 respectively). For example, using the third example as the input data: %TODO - Replace the print blank line with print()? \begin{verbatim} for alignment in AlignIO.parse(handle, "fasta", seq_count=2): print("Alignment length %i" % alignment.get_alignment_length()) for record in alignment: print("%s - %s" % (record.seq, record.id)) print("") \end{verbatim} \noindent giving: \begin{verbatim} Alignment length 19 ACTACGACTAGCTCAG--G - Alpha ACTACCGCTAGCTCAGAAG - XXX Alignment length 17 ACTACGACTAGCTCAGG - Alpha ACTACGGCAAGCACAGG - YYY Alignment length 21 --ACTACGAC--TAGCTCAGG - Alpha GGACTACGACAATAGCTCAGG - ZZZ \end{verbatim} Using \verb|Bio.AlignIO.read()| or \verb|Bio.AlignIO.parse()| without the \verb|seq_count| argument would give a single alignment containing all six records for the first two examples. For the third example, an exception would be raised because the lengths differ preventing them being turned into a single alignment. If the file format itself has a block structure allowing \verb|Bio.AlignIO| to determine the number of sequences in each alignment directly, then the \verb|seq_count| argument is not needed. If it is supplied, and doesn't agree with the file contents, an error is raised. Note that this optional \verb|seq_count| argument assumes each alignment in the file has the same number of sequences. Hypothetically you may come across stranger situations, for example a FASTA file containing several alignments each with a different number of sequences -- although I would love to hear of a real world example of this. Assuming you cannot get the data in a nicer file format, there is no straight forward way to deal with this using \verb|Bio.AlignIO|. In this case, you could consider reading in the sequences themselves using \verb|Bio.SeqIO| and batching them together to create the alignments as appropriate. \section{Writing Alignments} We've talked about using \verb|Bio.AlignIO.read()| and \verb|Bio.AlignIO.parse()| for alignment input (reading files), and now we'll look at \verb|Bio.AlignIO.write()| which is for alignment output (writing files). This is a function taking three arguments: some \verb|MultipleSeqAlignment| objects (or for backwards compatibility the obsolete \verb|Alignment| objects), a handle or filename to write to, and a sequence format. Here is an example, where we start by creating a few \verb|MultipleSeqAlignment| objects the hard way (by hand, rather than by loading them from a file). Note we create some \verb|SeqRecord| objects to construct the alignment from. \begin{verbatim} from Bio.Alphabet import generic_dna from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio.Align import MultipleSeqAlignment align1 = MultipleSeqAlignment([ SeqRecord(Seq("ACTGCTAGCTAG", generic_dna), id="Alpha"), SeqRecord(Seq("ACT-CTAGCTAG", generic_dna), id="Beta"), SeqRecord(Seq("ACTGCTAGDTAG", generic_dna), id="Gamma"), ]) align2 = MultipleSeqAlignment([ SeqRecord(Seq("GTCAGC-AG", generic_dna), id="Delta"), SeqRecord(Seq("GACAGCTAG", generic_dna), id="Epsilon"), SeqRecord(Seq("GTCAGCTAG", generic_dna), id="Zeta"), ]) align3 = MultipleSeqAlignment([ SeqRecord(Seq("ACTAGTACAGCTG", generic_dna), id="Eta"), SeqRecord(Seq("ACTAGTACAGCT-", generic_dna), id="Theta"), SeqRecord(Seq("-CTACTACAGGTG", generic_dna), id="Iota"), ]) my_alignments = [align1, align2, align3] \end{verbatim} \noindent Now we have a list of \verb|Alignment| objects, we'll write them to a PHYLIP format file: \begin{verbatim} from Bio import AlignIO AlignIO.write(my_alignments, "my_example.phy", "phylip") \end{verbatim} \noindent And if you open this file in your favourite text editor it should look like this: \begin{verbatim} 3 12 Alpha ACTGCTAGCT AG Beta ACT-CTAGCT AG Gamma ACTGCTAGDT AG 3 9 Delta GTCAGC-AG Epislon GACAGCTAG Zeta GTCAGCTAG 3 13 Eta ACTAGTACAG CTG Theta ACTAGTACAG CT- Iota -CTACTACAG GTG \end{verbatim} Its more common to want to load an existing alignment, and save that, perhaps after some simple manipulation like removing certain rows or columns. Suppose you wanted to know how many alignments the \verb|Bio.AlignIO.write()| function wrote to the handle? If your alignments were in a list like the example above, you could just use \verb|len(my_alignments)|, however you can't do that when your records come from a generator/iterator. Therefore the \verb|Bio.AlignIO.write()| function returns the number of alignments written to the file. \emph{Note} - If you tell the \verb|Bio.AlignIO.write()| function to write to a file that already exists, the old file will be overwritten without any warning. \subsection{Converting between sequence alignment file formats} \label{sec:converting-alignments} Converting between sequence alignment file formats with \verb|Bio.AlignIO| works in the same way as converting between sequence file formats with \verb|Bio.SeqIO| (Section~\ref{sec:SeqIO-conversion}). We load generally the alignment(s) using \verb|Bio.AlignIO.parse()| and then save them using the \verb|Bio.AlignIO.write()| -- or just use the \verb|Bio.AlignIO.convert()| helper function. For this example, we'll load the PFAM/Stockholm format file used earlier and save it as a Clustal W format file: \begin{verbatim} from Bio import AlignIO count = AlignIO.convert("PF05371_seed.sth", "stockholm", "PF05371_seed.aln", "clustal") print("Converted %i alignments" % count) \end{verbatim} Or, using \verb|Bio.AlignIO.parse()| and \verb|Bio.AlignIO.write()|: \begin{verbatim} from Bio import AlignIO alignments = AlignIO.parse("PF05371_seed.sth", "stockholm") count = AlignIO.write(alignments, "PF05371_seed.aln", "clustal") print("Converted %i alignments" % count) \end{verbatim} The \verb|Bio.AlignIO.write()| function expects to be given multiple alignment objects. In the example above we gave it the alignment iterator returned by \verb|Bio.AlignIO.parse()|. In this case, we know there is only one alignment in the file so we could have used \verb|Bio.AlignIO.read()| instead, but notice we have to pass this alignment to \verb|Bio.AlignIO.write()| as a single element list: \begin{verbatim} from Bio import AlignIO alignment = AlignIO.read("PF05371_seed.sth", "stockholm") AlignIO.write([alignment], "PF05371_seed.aln", "clustal") \end{verbatim} Either way, you should end up with the same new Clustal W format file ``PF05371\_seed.aln'' with the following content: \begin{verbatim} CLUSTAL X (1.81) multiple sequence alignment COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSS Q9T0Q8_BPIKE/1-52 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVS COATB_BPI22/32-83 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSS COATB_BPM13/24-72 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTS COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFAS Q9T0Q9_BPFD/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTS COATB_BPIF1/22-73 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVS COATB_BPIKE/30-81 KA Q9T0Q8_BPIKE/1-52 RA COATB_BPI22/32-83 KA COATB_BPM13/24-72 KA COATB_BPZJ2/1-49 KA Q9T0Q9_BPFD/1-49 KA COATB_BPIF1/22-73 RA \end{verbatim} Alternatively, you could make a PHYLIP format file which we'll name ``PF05371\_seed.phy'': \begin{verbatim} from Bio import AlignIO AlignIO.convert("PF05371_seed.sth", "stockholm", "PF05371_seed.phy", "phylip") \end{verbatim} This time the output looks like this: \begin{verbatim} 7 52 COATB_BPIK AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIRLFKKFSS Q9T0Q8_BPI AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIKLFKKFVS COATB_BPI2 DGTSTATSYA TEAMNSLKTQ ATDLIDQTWP VVTSVAVAGL AIRLFKKFSS COATB_BPM1 AEGDDP---A KAAFNSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS COATB_BPZJ AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFAS Q9T0Q9_BPF AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS COATB_BPIF FAADDATSQA KAAFDSLTAQ ATEMSGYAWA LVVLVVGATV GIKLFKKFVS KA RA KA KA KA KA RA \end{verbatim} One of the big handicaps of the PHYLIP alignment file format is that the sequence identifiers are strictly truncated at ten characters. In this example, as you can see the resulting names are still unique - but they are not very readable. In this particular case, there is no clear way to compress the identifiers, but for the sake of argument you may want to assign your own names or numbering system. This following bit of code manipulates the record identifiers before saving the output: \begin{verbatim} from Bio import AlignIO alignment = AlignIO.read("PF05371_seed.sth", "stockholm") name_mapping = {} for i, record in enumerate(alignment): name_mapping[i] = record.id record.id = "seq%i" % i print(name_mapping) AlignIO.write([alignment], "PF05371_seed.phy", "phylip") \end{verbatim} \noindent This code used a Python dictionary to record a simple mapping from the new sequence system to the original identifier: \begin{verbatim} {0: 'COATB_BPIKE/30-81', 1: 'Q9T0Q8_BPIKE/1-52', 2: 'COATB_BPI22/32-83', ...} \end{verbatim} \noindent Here is the new PHYLIP format output: \begin{verbatim} 7 52 seq0 AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIRLFKKFSS seq1 AEPNAATNYA TEAMDSLKTQ AIDLISQTWP VVTTVVVAGL VIKLFKKFVS seq2 DGTSTATSYA TEAMNSLKTQ ATDLIDQTWP VVTSVAVAGL AIRLFKKFSS seq3 AEGDDP---A KAAFNSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS seq4 AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFAS seq5 AEGDDP---A KAAFDSLQAS ATEYIGYAWA MVVVIVGATI GIKLFKKFTS seq6 FAADDATSQA KAAFDSLTAQ ATEMSGYAWA LVVLVVGATV GIKLFKKFVS KA RA KA KA KA KA RA \end{verbatim} \noindent In general, because of the identifier limitation, working with PHYLIP file formats shouldn't be your first choice. Using the PFAM/Stockholm format on the other hand allows you to record a lot of additional annotation too. \subsection{Getting your alignment objects as formatted strings} \label{sec:alignment-format-method} The \verb|Bio.AlignIO| interface is based on handles, which means if you want to get your alignment(s) into a string in a particular file format you need to do a little bit more work (see below). However, you will probably prefer to take advantage of the alignment object's \verb|format()| method. This takes a single mandatory argument, a lower case string which is supported by \verb|Bio.AlignIO| as an output format. For example: \begin{verbatim} from Bio import AlignIO alignment = AlignIO.read("PF05371_seed.sth", "stockholm") print(alignment.format("clustal")) \end{verbatim} As described in Section~\ref{sec:SeqRecord-format}), the \verb|SeqRecord| object has a similar method using output formats supported by \verb|Bio.SeqIO|. Internally the \verb|format()| method is using the \verb|StringIO| string based handle and calling \verb|Bio.AlignIO.write()|. You can do this in your own code if for example you are using an older version of Biopython: \begin{verbatim} from Bio import AlignIO from StringIO import StringIO alignments = AlignIO.parse("PF05371_seed.sth", "stockholm") out_handle = StringIO() AlignIO.write(alignments, out_handle, "clustal") clustal_data = out_handle.getvalue() print(clustal_data) \end{verbatim} \section{Manipulating Alignments} \label{sec:manipulating-alignments} Now that we've covered loading and saving alignments, we'll look at what else you can do with them. \subsection{Slicing alignments} First of all, in some senses the alignment objects act like a Python \verb|list| of \verb|SeqRecord| objects (the rows). With this model in mind hopefully the actions of \verb|len()| (the number of rows) and iteration (each row as a \verb|SeqRecord|) make sense: %doctest examples \begin{verbatim} >>> from Bio import AlignIO >>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm") >>> print("Number of rows: %i" % len(alignment)) Number of rows: 7 >>> for record in alignment: ... print("%s - %s" % (record.seq, record.id)) AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA - COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA - Q9T0Q8_BPIKE/1-52 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA - COATB_BPI22/32-83 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - COATB_BPM13/24-72 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA - COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA - Q9T0Q9_BPFD/1-49 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA - COATB_BPIF1/22-73 \end{verbatim} You can also use the list-like \verb|append| and \verb|extend| methods to add more rows to the alignment (as \verb|SeqRecord| objects). Keeping the list metaphor in mind, simple slicing of the alignment should also make sense - it selects some of the rows giving back another alignment object: %cont-doctest \begin{verbatim} >>> print(alignment) SingleLetterAlphabet() alignment with 7 rows and 52 columns AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRL...SKA COATB_BPIKE/30-81 AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKL...SRA Q9T0Q8_BPIKE/1-52 DGTSTATSYATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRL...SKA COATB_BPI22/32-83 AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73 >>> print(alignment[3:7]) SingleLetterAlphabet() alignment with 4 rows and 52 columns AEGDDP---AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPM13/24-72 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA COATB_BPZJ2/1-49 AEGDDP---AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKL...SKA Q9T0Q9_BPFD/1-49 FAADDATSQAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKL...SRA COATB_BPIF1/22-73 \end{verbatim} What if you wanted to select by column? Those of you who have used the NumPy matrix or array objects won't be surprised at this - you use a double index. %cont-doctest \begin{verbatim} >>> print(alignment[2, 6]) T \end{verbatim} \noindent Using two integer indices pulls out a single letter, short hand for this: %cont-doctest \begin{verbatim} >>> print(alignment[2].seq[6]) T \end{verbatim} You can pull out a single column as a string like this: %cont-doctest \begin{verbatim} >>> print(alignment[:, 6]) TTT---T \end{verbatim} You can also select a range of columns. For example, to pick out those same three rows we extracted earlier, but take just their first six columns: %cont-doctest \begin{verbatim} >>> print(alignment[3:6, :6]) SingleLetterAlphabet() alignment with 3 rows and 6 columns AEGDDP COATB_BPM13/24-72 AEGDDP COATB_BPZJ2/1-49 AEGDDP Q9T0Q9_BPFD/1-49 \end{verbatim} Leaving the first index as \verb|:| means take all the rows: %cont-doctest \begin{verbatim} >>> print(alignment[:, :6]) SingleLetterAlphabet() alignment with 7 rows and 6 columns AEPNAA COATB_BPIKE/30-81 AEPNAA Q9T0Q8_BPIKE/1-52 DGTSTA COATB_BPI22/32-83 AEGDDP COATB_BPM13/24-72 AEGDDP COATB_BPZJ2/1-49 AEGDDP Q9T0Q9_BPFD/1-49 FAADDA COATB_BPIF1/22-73 \end{verbatim} This brings us to a neat way to remove a section. Notice columns 7, 8 and 9 which are gaps in three of the seven sequences: %cont-doctest \begin{verbatim} >>> print(alignment[:, 6:9]) SingleLetterAlphabet() alignment with 7 rows and 3 columns TNY COATB_BPIKE/30-81 TNY Q9T0Q8_BPIKE/1-52 TSY COATB_BPI22/32-83 --- COATB_BPM13/24-72 --- COATB_BPZJ2/1-49 --- Q9T0Q9_BPFD/1-49 TSQ COATB_BPIF1/22-73 \end{verbatim} \noindent Again, you can slice to get everything after the ninth column: %cont-doctest \begin{verbatim} >>> print(alignment[:, 9:]) SingleLetterAlphabet() alignment with 7 rows and 43 columns ATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81 ATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52 ATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83 AKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72 AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49 AKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49 AKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73 \end{verbatim} \noindent Now, the interesting thing is that addition of alignment objects works by column. This lets you do this as a way to remove a block of columns: %cont-doctest \begin{verbatim} >>> edited = alignment[:, :6] + alignment[:, 9:] >>> print(edited) SingleLetterAlphabet() alignment with 7 rows and 49 columns AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81 AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52 DGTSTAATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83 AEGDDPAKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72 AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49 AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49 FAADDAAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73 \end{verbatim} Another common use of alignment addition would be to combine alignments for several different genes into a meta-alignment. Watch out though - the identifiers need to match up (see Section~\ref{sec:SeqRecord-addition} for how adding \verb|SeqRecord| objects works). You may find it helpful to first sort the alignment rows alphabetically by id: %cont-doctest \begin{verbatim} >>> edited.sort() >>> print(edited) SingleLetterAlphabet() alignment with 7 rows and 49 columns DGTSTAATEAMNSLKTQATDLIDQTWPVVTSVAVAGLAIRLFKKFSSKA COATB_BPI22/32-83 FAADDAAKAAFDSLTAQATEMSGYAWALVVLVVGATVGIKLFKKFVSRA COATB_BPIF1/22-73 AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA COATB_BPIKE/30-81 AEGDDPAKAAFNSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA COATB_BPM13/24-72 AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFASKA COATB_BPZJ2/1-49 AEPNAAATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIKLFKKFVSRA Q9T0Q8_BPIKE/1-52 AEGDDPAKAAFDSLQASATEYIGYAWAMVVVIVGATIGIKLFKKFTSKA Q9T0Q9_BPFD/1-49 \end{verbatim} \noindent Note that you can only add two alignments together if they have the same number of rows. \subsection{Alignments as arrays} Depending on what you are doing, it can be more useful to turn the alignment object into an array of letters -- and you can do this with NumPy: %This example fails under PyPy 2.0, https://bugs.pypy.org/issue1546 %doctest examples lib:numpy \begin{verbatim} >>> import numpy as np >>> from Bio import AlignIO >>> alignment = AlignIO.read("PF05371_seed.sth", "stockholm") >>> align_array = np.array([list(rec) for rec in alignment], np.character) >>> align_array.shape (7, 52) \end{verbatim} If you will be working heavily with the columns, you can tell NumPy to store the array by column (as in Fortran) rather then its default of by row (as in C): \begin{verbatim} >>> align_array = np.array([list(rec) for rec in alignment], np.character, order="F") \end{verbatim} Note that this leaves the original Biopython alignment object and the NumPy array in memory as separate objects - editing one will not update the other! \section{Alignment Tools} \label{sec:alignment-tools} There are \emph{lots} of algorithms out there for aligning sequences, both pairwise alignments and multiple sequence alignments. These calculations are relatively slow, and you generally wouldn't want to write such an algorithm in Python. Instead, you can use Biopython to invoke a command line tool on your behalf. Normally you would: \begin{enumerate} \item Prepare an input file of your unaligned sequences, typically this will be a FASTA file which you might create using \verb|Bio.SeqIO| (see Chapter~\ref{chapter:Bio.SeqIO}). \item Call the command line tool to process this input file, typically via one of Biopython's command line wrappers (which we'll discuss here). \item Read the output from the tool, i.e. your aligned sequences, typically using \verb|Bio.AlignIO| (see earlier in this chapter). \end{enumerate} All the command line wrappers we're going to talk about in this chapter follow the same style. You create a command line object specifying the options (e.g. the input filename and the output filename), then invoke this command line via a Python operating system call (e.g. using the \texttt{subprocess} module). Most of these wrappers are defined in the \verb|Bio.Align.Applications| module: \begin{verbatim} >>> import Bio.Align.Applications >>> dir(Bio.Align.Applications) ... ['ClustalwCommandline', 'DialignCommandline', 'MafftCommandline', 'MuscleCommandline', 'PrankCommandline', 'ProbconsCommandline', 'TCoffeeCommandline' ...] \end{verbatim} \noindent (Ignore the entries starting with an underscore -- these have special meaning in Python.) The module \verb|Bio.Emboss.Applications| has wrappers for some of the \href{http://emboss.sourceforge.net/}{EMBOSS suite}, including \texttt{needle} and \texttt{water}, which are described below in Section~\ref{seq:emboss-needle-water}, and wrappers for the EMBOSS packaged versions of the PHYLIP tools (which EMBOSS refer to as one of their EMBASSY packages - third party tools with an EMBOSS style interface). We won't explore all these alignment tools here in the section, just a sample, but the same principles apply. \subsection{ClustalW} \label{sec:align_clustal} ClustalW is a popular command line tool for multiple sequence alignment (there is also a graphical interface called ClustalX). Biopython's \verb|Bio.Align.Applications| module has a wrapper for this alignment tool (and several others). Before trying to use ClustalW from within Python, you should first try running the ClustalW tool yourself by hand at the command line, to familiarise yourself the other options. You'll find the Biopython wrapper is very faithful to the actual command line API: \begin{verbatim} >>> from Bio.Align.Applications import ClustalwCommandline >>> help(ClustalwCommandline) ... \end{verbatim} For the most basic usage, all you need is to have a FASTA input file, such as \href{http://biopython.org/DIST/docs/tutorial/examples/opuntia.fasta}{opuntia.fasta} (available online or in the Doc/examples subdirectory of the Biopython source code). This is a small FASTA file containing seven prickly-pear DNA sequences (from the cactus family \textit{Opuntia}). By default ClustalW will generate an alignment and guide tree file with names based on the input FASTA file, in this case \texttt{opuntia.aln} and \texttt{opuntia.dnd}, but you can override this or make it explicit: %doctest \begin{verbatim} >>> from Bio.Align.Applications import ClustalwCommandline >>> cline = ClustalwCommandline("clustalw2", infile="opuntia.fasta") >>> print(cline) clustalw2 -infile=opuntia.fasta \end{verbatim} Notice here we have given the executable name as \texttt{clustalw2}, indicating we have version two installed, which has a different filename to version one (\texttt{clustalw}, the default). Fortunately both versions support the same set of arguments at the command line (and indeed, should be functionally identical). You may find that even though you have ClustalW installed, the above command doesn't work -- you may get a message about ``command not found'' (especially on Windows). This indicated that the ClustalW executable is not on your PATH (an environment variable, a list of directories to be searched). You can either update your PATH setting to include the location of your copy of ClustalW tools (how you do this will depend on your OS), or simply type in the full path of the tool. For example: %doctest \begin{verbatim} >>> import os >>> from Bio.Align.Applications import ClustalwCommandline >>> clustalw_exe = r"C:\Program Files\new clustal\clustalw2.exe" >>> clustalw_cline = ClustalwCommandline(clustalw_exe, infile="opuntia.fasta") \end{verbatim} %Don't run it in the doctest \begin{verbatim} >>> assert os.path.isfile(clustalw_exe), "Clustal W executable missing" >>> stdout, stderr = clustalw_cline() \end{verbatim} \noindent Remember, in Python strings \verb|\n| and \verb|\t| are by default interpreted as a new line and a tab -- which is why we're put a letter ``r'' at the start for a raw string that isn't translated in this way. This is generally good practice when specifying a Windows style file name. Internally this uses the \verb|subprocess| module which is now the recommended way to run another program in Python. This replaces older options like the \verb|os.system()| and the \verb|os.popen*| functions. Now, at this point it helps to know about how command line tools ``work''. When you run a tool at the command line, it will often print text output directly to screen. This text can be captured or redirected, via two ``pipes'', called standard output (the normal results) and standard error (for error messages and debug messages). There is also standard input, which is any text fed into the tool. These names get shortened to stdin, stdout and stderr. When the tool finishes, it has a return code (an integer), which by convention is zero for success. When you run the command line tool like this via the Biopython wrapper, it will wait for it to finish, and check the return code. If this is non zero (indicating an error), an exception is raised. The wrapper then returns two strings, stdout and stderr. In the case of ClustalW, when run at the command line all the important output is written directly to the output files. Everything normally printed to screen while you wait (via stdout or stderr) is boring and can be ignored (assuming it worked). What we care about are the two output files, the alignment and the guide tree. We didn't tell ClustalW what filenames to use, but it defaults to picking names based on the input file. In this case the output should be in the file \verb|opuntia.aln|. You should be able to work out how to read in the alignment using \verb|Bio.AlignIO| by now: \begin{verbatim} >>> from Bio import AlignIO >>> align = AlignIO.read("opuntia.aln", "clustal") >>> print(align) SingleLetterAlphabet() alignment with 7 rows and 906 columns TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191 TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191 \end{verbatim} In case you are interested (and this is an aside from the main thrust of this chapter), the \texttt{opuntia.dnd} file ClustalW creates is just a standard Newick tree file, and \verb|Bio.Phylo| can parse these: \begin{verbatim} >>> from Bio import Phylo >>> tree = Phylo.read("opuntia.dnd", "newick") >>> Phylo.draw_ascii(tree) _______________ gi|6273291|gb|AF191665.1|AF191665 __________________________| | | ______ gi|6273290|gb|AF191664.1|AF191664 | |__| | |_____ gi|6273289|gb|AF191663.1|AF191663 | _|_________________ gi|6273287|gb|AF191661.1|AF191661 | |__________ gi|6273286|gb|AF191660.1|AF191660 | | __ gi|6273285|gb|AF191659.1|AF191659 |___| | gi|6273284|gb|AF191658.1|AF191658 \end{verbatim} \noindent Chapter \ref{sec:Phylo} covers Biopython's support for phylogenetic trees in more depth. \subsection{MUSCLE} MUSCLE is a more recent multiple sequence alignment tool than ClustalW, and Biopython also has a wrapper for it under the \verb|Bio.Align.Applications| module. As before, we recommend you try using MUSCLE from the command line before trying it from within Python, as the Biopython wrapper is very faithful to the actual command line API: \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> help(MuscleCommandline) ... \end{verbatim} For the most basic usage, all you need is to have a FASTA input file, such as \href{http://biopython.org/DIST/docs/tutorial/examples/opuntia.fasta}{opuntia.fasta} (available online or in the Doc/examples subdirectory of the Biopython source code). You can then tell MUSCLE to read in this FASTA file, and write the alignment to an output file: %doctest \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.txt") >>> print(cline) muscle -in opuntia.fasta -out opuntia.txt \end{verbatim} Note that MUSCLE uses ``-in'' and ``-out'' but in Biopython we have to use ``input'' and ``out'' as the keyword arguments or property names. This is because ``in'' is a reserved word in Python. By default MUSCLE will output the alignment as a FASTA file (using gapped sequences). The \verb|Bio.AlignIO| module should be able to read this alignment using \texttt{format="fasta"}. You can also ask for ClustalW-like output: %doctest \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.aln", clw=True) >>> print(cline) muscle -in opuntia.fasta -out opuntia.aln -clw \end{verbatim} Or, strict ClustalW output where the original ClustalW header line is used for maximum compatibility: %doctest \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> cline = MuscleCommandline(input="opuntia.fasta", out="opuntia.aln", clwstrict=True) >>> print(cline) muscle -in opuntia.fasta -out opuntia.aln -clwstrict \end{verbatim} \noindent The \verb|Bio.AlignIO| module should be able to read these alignments using \texttt{format="clustal"}. MUSCLE can also output in GCG MSF format (using the \texttt{msf} argument), but Biopython can't currently parse that, or using HTML which would give a human readable web page (not suitable for parsing). You can also set the other optional parameters, for example the maximum number of iterations. See the built in help for details. You would then run MUSCLE command line string as described above for ClustalW, and parse the output using \verb|Bio.AlignIO| to get an alignment object. \subsection{MUSCLE using stdout} Using a MUSCLE command line as in the examples above will write the alignment to a file. This means there will be no important information written to the standard out (stdout) or standard error (stderr) handles. However, by default MUSCLE will write the alignment to standard output (stdout). We can take advantage of this to avoid having a temporary output file! For example: %doctest \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> muscle_cline = MuscleCommandline(input="opuntia.fasta") >>> print(muscle_cline) muscle -in opuntia.fasta \end{verbatim} If we run this via the wrapper, we get back the output as a string. In order to parse this we can use \verb|StringIO| to turn it into a handle. Remember that MUSCLE defaults to using FASTA as the output format: \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> muscle_cline = MuscleCommandline(input="opuntia.fasta") >>> stdout, stderr = muscle_cline() >>> from StringIO import StringIO >>> from Bio import AlignIO >>> align = AlignIO.read(StringIO(stdout), "fasta") >>> print(align) SingleLetterAlphabet() alignment with 7 rows and 906 columns TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191663 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191665 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191664 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191661 TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191660 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191659 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191658 \end{verbatim} The above approach is fairly simple, but if you are dealing with very large output text the fact that all of stdout and stderr is loaded into memory as a string can be a potential drawback. Using the \verb|subprocess| module we can work directly with handles instead: \begin{verbatim} >>> import subprocess >>> from Bio.Align.Applications import MuscleCommandline >>> muscle_cline = MuscleCommandline(input="opuntia.fasta") >>> child = subprocess.Popen(str(muscle_cline), ... stdout=subprocess.PIPE, ... stderr=subprocess.PIPE, ... shell=(sys.platform!="win32")) >>> from Bio import AlignIO >>> align = AlignIO.read(child.stdout, "fasta") >>> print(align) SingleLetterAlphabet() alignment with 7 rows and 906 columns TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF191663 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273291|gb|AF191665.1|AF191665 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF191664 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF191661 TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF191660 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF191659 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF191658 \end{verbatim} \subsection{MUSCLE using stdin and stdout} We don't actually \emph{need} to have our FASTA input sequences prepared in a file, because by default MUSCLE will read in the input sequence from standard input! Note this is a bit more advanced and fiddly, so don't bother with this technique unless you need to. First, we'll need some unaligned sequences in memory as \verb|SeqRecord| objects. For this demonstration I'm going to use a filtered version of the original FASTA file (using a generator expression), taking just six of the seven sequences: %doctest \begin{verbatim} >>> from Bio import SeqIO >>> records = (r for r in SeqIO.parse("opuntia.fasta", "fasta") if len(r) < 900) \end{verbatim} Then we create the MUSCLE command line, leaving the input and output to their defaults (stdin and stdout). I'm also going to ask for strict ClustalW format as for the output. %doctest \begin{verbatim} >>> from Bio.Align.Applications import MuscleCommandline >>> muscle_cline = MuscleCommandline(clwstrict=True) >>> print(muscle_cline) muscle -clwstrict \end{verbatim} Now for the fiddly bits using the \verb|subprocess| module, stdin and stdout: \begin{verbatim} >>> import subprocess >>> import sys >>> child = subprocess.Popen(str(cline), ... stdin=subprocess.PIPE, ... stdout=subprocess.PIPE, ... stderr=subprocess.PIPE, ... shell=(sys.platform!="win32")) \end{verbatim} That should start MUSCLE, but it will be sitting waiting for its FASTA input sequences, which we must supply via its stdin handle: \begin{verbatim} >>> SeqIO.write(records, child.stdin, "fasta") 6 >>> child.stdin.close() \end{verbatim} After writing the six sequences to the handle, MUSCLE will still be waiting to see if that is all the FASTA sequences or not -- so we must signal that this is all the input data by closing the handle. At that point MUSCLE should start to run, and we can ask for the output: \begin{verbatim} >>> from Bio import AlignIO >>> align = AlignIO.read(child.stdout, "clustal") >>> print(align) SingleLetterAlphabet() alignment with 6 rows and 900 columns TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF19166 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF19166 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF19166 TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF19166 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF19165 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF19165 \end{verbatim} Wow! There we are with a new alignment of just the six records, without having created a temporary FASTA input file, or a temporary alignment output file. However, a word of caution: Dealing with errors with this style of calling external programs is much more complicated. It also becomes far harder to diagnose problems, because you can't try running MUSCLE manually outside of Biopython (because you don't have the input file to supply). There can also be subtle cross platform issues (e.g. Windows versus Linux), and how you run your script can have an impact (e.g. at the command line, from IDLE or an IDE, or as a GUI script). These are all generic Python issues though, and not specific to Biopython. If you find working directly with \texttt{subprocess} like this scary, there is an alternative. If you execute the tool with \texttt{muscle\_cline()} you can supply any standard input as a big string, \texttt{muscle\_cline(stdin=...)}. So, provided your data isn't very big, you can prepare the FASTA input in memory as a string using \texttt{StringIO} (see Section~\ref{sec:appendix-handles}): %doctest \begin{verbatim} >>> from Bio import SeqIO >>> records = (r for r in SeqIO.parse("opuntia.fasta", "fasta") if len(r) < 900) >>> from StringIO import StringIO >>> handle = StringIO() >>> SeqIO.write(records, handle, "fasta") 6 >>> data = handle.getvalue() \end{verbatim} \noindent You can then run the tool and parse the alignment as follows: %not a doctest as can't assume the MUSCLE binary is present \begin{verbatim} >>> stdout, stderr = muscle_cline(stdin=data) >>> from Bio import AlignIO >>> align = AlignIO.read(StringIO(stdout), "clustal") >>> print(align) SingleLetterAlphabet() alignment with 6 rows and 900 columns TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273290|gb|AF191664.1|AF19166 TATACATTAAAGGAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273289|gb|AF191663.1|AF19166 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273287|gb|AF191661.1|AF19166 TATACATAAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273286|gb|AF191660.1|AF19166 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273285|gb|AF191659.1|AF19165 TATACATTAAAGAAGGGGGATGCGGATAAATGGAAAGGCGAAAG...AGA gi|6273284|gb|AF191658.1|AF19165 \end{verbatim} You might find this easier, but it does require more memory (RAM) for the strings used for the input FASTA and output Clustal formatted data. \subsection{EMBOSS needle and water} \label{seq:emboss-needle-water} The \href{http://emboss.sourceforge.net/}{EMBOSS} suite includes the \texttt{water} and \texttt{needle} tools for Smith-Waterman algorithm local alignment, and Needleman-Wunsch global alignment. The tools share the same style interface, so switching between the two is trivial -- we'll just use \texttt{needle} here. Suppose you want to do a global pairwise alignment between two sequences, prepared in FASTA format as follows: \begin{verbatim} >HBA_HUMAN MVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHG KKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTP AVHASLDKFLASVSTVLTSKYR \end{verbatim} \noindent in a file \texttt{alpha.fasta}, and secondly in a file \texttt{beta.fasta}: \begin{verbatim} >HBB_HUMAN MVHLTPEEKSAVTALWGKVNVDEVGGEALGRLLVVYPWTQRFFESFGDLSTPDAVMGNPK VKAHGKKVLGAFSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHFG KEFTPPVQAAYQKVVAGVANALAHKYH \end{verbatim} Let's start by creating a complete \texttt{needle} command line object in one go: %doctest \begin{verbatim} >>> from Bio.Emboss.Applications import NeedleCommandline >>> needle_cline = NeedleCommandline(asequence="alpha.faa", bsequence="beta.faa", ... gapopen=10, gapextend=0.5, outfile="needle.txt") >>> print(needle_cline) needle -outfile=needle.txt -asequence=alpha.faa -bsequence=beta.faa -gapopen=10 -gapextend=0.5 \end{verbatim} Why not try running this by hand at the command prompt? You should see it does a pairwise comparison and records the output in the file \texttt{needle.txt} (in the default EMBOSS alignment file format). Even if you have EMBOSS installed, running this command may not work -- you might get a message about ``command not found'' (especially on Windows). This probably means that the EMBOSS tools are not on your PATH environment variable. You can either update your PATH setting, or simply tell Biopython the full path to the tool, for example: %doctest \begin{verbatim} >>> from Bio.Emboss.Applications import NeedleCommandline >>> needle_cline = NeedleCommandline(r"C:\EMBOSS\needle.exe", ... asequence="alpha.faa", bsequence="beta.faa", ... gapopen=10, gapextend=0.5, outfile="needle.txt") \end{verbatim} \noindent Remember in Python that for a default string \verb|\n| or \verb|\t| means a new line or a tab -- which is why we're put a letter ``r'' at the start for a raw string. At this point it might help to try running the EMBOSS tools yourself by hand at the command line, to familiarise yourself the other options and compare them to the Biopython help text: \begin{verbatim} >>> from Bio.Emboss.Applications import NeedleCommandline >>> help(NeedleCommandline) ... \end{verbatim} Note that you can also specify (or change or look at) the settings like this: %doctest \begin{verbatim} >>> from Bio.Emboss.Applications import NeedleCommandline >>> needle_cline = NeedleCommandline() >>> needle_cline.asequence="alpha.faa" >>> needle_cline.bsequence="beta.faa" >>> needle_cline.gapopen=10 >>> needle_cline.gapextend=0.5 >>> needle_cline.outfile="needle.txt" >>> print(needle_cline) needle -outfile=needle.txt -asequence=alpha.faa -bsequence=beta.faa -gapopen=10 -gapextend=0.5 >>> print(needle_cline.outfile) needle.txt \end{verbatim} Next we want to use Python to run this command for us. As explained above, for full control, we recommend you use the built in Python \texttt{subprocess} module, but for simple usage the wrapper object usually suffices: \begin{verbatim} >>> stdout, stderr = needle_cline() >>> print(stdout + stderr) Needleman-Wunsch global alignment of two sequences \end{verbatim} Next we can load the output file with \verb|Bio.AlignIO| as discussed earlier in this chapter, as the \texttt{emboss} format: \begin{verbatim} >>> from Bio import AlignIO >>> align = AlignIO.read("needle.txt", "emboss") >>> print(align) SingleLetterAlphabet() alignment with 2 rows and 149 columns MV-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTY...KYR HBA_HUMAN MVHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRF...KYH HBB_HUMAN \end{verbatim} In this example, we told EMBOSS to write the output to a file, but you \emph{can} tell it to write the output to stdout instead (useful if you don't want a temporary output file to get rid of -- use \texttt{stdout=True} rather than the \texttt{outfile} argument), and also to read \emph{one} of the one of the inputs from stdin (e.g. \texttt{asequence="stdin"}, much like in the MUSCLE example in the section above). This has only scratched the surface of what you can do with \texttt{needle} and \texttt{water}. One useful trick is that the second file can contain multiple sequences (say five), and then EMBOSS will do five pairwise alignments. Note - Biopython includes its own pairwise alignment code in the \verb|Bio.pairwise2| module (written in C for speed, but with a pure Python fallback available too). This doesn't work with alignment objects, so we have not covered it within this chapter. See the module's docstring (built in help) for details. \chapter{BLAST} \label{chapter:blast} Hey, everybody loves BLAST right? I mean, geez, how can get it get any easier to do comparisons between one of your sequences and every other sequence in the known world? But, of course, this section isn't about how cool BLAST is, since we already know that. It is about the problem with BLAST -- it can be really difficult to deal with the volume of data generated by large runs, and to automate BLAST runs in general. Fortunately, the Biopython folks know this only too well, so they've developed lots of tools for dealing with BLAST and making things much easier. This section details how to use these tools and do useful things with them. Dealing with BLAST can be split up into two steps, both of which can be done from within Biopython. Firstly, running BLAST for your query sequence(s), and getting some output. Secondly, parsing the BLAST output in Python for further analysis. Your first introduction to running BLAST was probably via the NCBI web-service. In fact, there are lots of ways you can run BLAST, which can be categorised several ways. The most important distinction is running BLAST locally (on your own machine), and running BLAST remotely (on another machine, typically the NCBI servers). We're going to start this chapter by invoking the NCBI online BLAST service from within a Python script. \emph{NOTE}: The following Chapter~\ref{chapter:searchio} describes \verb|Bio.SearchIO|, an \emph{experimental} module in Biopython. We intend this to ultimately replace the older \verb|Bio.Blast| module, as it provides a more general framework handling other related sequence searching tools as well. However, until that is declared stable, for production code please continue to use the \verb|Bio.Blast| module for dealing with NCBI BLAST. \section{Running BLAST over the Internet} \label{sec:running-www-blast} We use the function \verb|qblast()| in the \verb|Bio.Blast.NCBIWWW| module call the online version of BLAST. This has three non-optional arguments: \begin{itemize} \item The first argument is the blast program to use for the search, as a lower case string. The options and descriptions of the programs are available at \url{http://www.ncbi.nlm.nih.gov/BLAST/blast_program.shtml}. Currently \verb|qblast| only works with blastn, blastp, blastx, tblast and tblastx. \item The second argument specifies the databases to search against. Again, the options for this are available on the NCBI web pages at \url{http://www.ncbi.nlm.nih.gov/BLAST/blast_databases.shtml}. \item The third argument is a string containing your query sequence. This can either be the sequence itself, the sequence in fasta format, or an identifier like a GI number. \end{itemize} The \verb|qblast| function also take a number of other option arguments which are basically analogous to the different parameters you can set on the BLAST web page. We'll just highlight a few of them here: \begin{itemize} \item The \verb|qblast| function can return the BLAST results in various formats, which you can choose with the optional \verb|format_type| keyword: \verb|"HTML"|, \verb|"Text"|, \verb|"ASN.1"|, or \verb|"XML"|. The default is \verb|"XML"|, as that is the format expected by the parser, described in section~\ref{sec:parsing-blast} below. \item The argument \verb|expect| sets the expectation or e-value threshold. \end{itemize} For more about the optional BLAST arguments, we refer you to the NCBI's own documentation, or that built into Biopython: \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> help(NCBIWWW.qblast) ... \end{verbatim} Note that the default settings on the NCBI BLAST website are not quite the same as the defaults on QBLAST. If you get different results, you'll need to check the parameters (e.g. the expectation value threshold and the gap values). For example, if you have a nucleotide sequence you want to search against the nucleotide database (nt) using BLASTN, and you know the GI number of your query sequence, you can use: \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> result_handle = NCBIWWW.qblast("blastn", "nt", "8332116") \end{verbatim} Alternatively, if we have our query sequence already in a FASTA formatted file, we just need to open the file and read in this record as a string, and use that as the query argument: \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> fasta_string = open("m_cold.fasta").read() >>> result_handle = NCBIWWW.qblast("blastn", "nt", fasta_string) \end{verbatim} We could also have read in the FASTA file as a \verb|SeqRecord| and then supplied just the sequence itself: \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> from Bio import SeqIO >>> record = SeqIO.read("m_cold.fasta", format="fasta") >>> result_handle = NCBIWWW.qblast("blastn", "nt", record.seq) \end{verbatim} Supplying just the sequence means that BLAST will assign an identifier for your sequence automatically. You might prefer to use the \verb|SeqRecord| object's format method to make a fasta string (which will include the existing identifier): \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> from Bio import SeqIO >>> record = SeqIO.read("m_cold.fasta", format="fasta") >>> result_handle = NCBIWWW.qblast("blastn", "nt", record.format("fasta")) \end{verbatim} This approach makes more sense if you have your sequence(s) in a non-FASTA file format which you can extract using \verb|Bio.SeqIO| (see Chapter~\ref{chapter:Bio.SeqIO}). Whatever arguments you give the \verb|qblast()| function, you should get back your results in a handle object (by default in XML format). The next step would be to parse the XML output into Python objects representing the search results (Section~\ref{sec:parsing-blast}), but you might want to save a local copy of the output file first. I find this especially useful when debugging my code that extracts info from the BLAST results (because re-running the online search is slow and wastes the NCBI computer time). \label{sec:saving-blast-output} We need to be a bit careful since we can use \verb|result_handle.read()| to read the BLAST output only once -- calling \verb|result_handle.read()| again returns an empty string. \begin{verbatim} >>> save_file = open("my_blast.xml", "w") >>> save_file.write(result_handle.read()) >>> save_file.close() >>> result_handle.close() \end{verbatim} After doing this, the results are in the file \verb|my_blast.xml| and the original handle has had all its data extracted (so we closed it). However, the \verb|parse| function of the BLAST parser (described in~\ref{sec:parsing-blast}) takes a file-handle-like object, so we can just open the saved file for input: \begin{verbatim} >>> result_handle = open("my_blast.xml") \end{verbatim} Now that we've got the BLAST results back into a handle again, we are ready to do something with them, so this leads us right into the parsing section (see Section~\ref{sec:parsing-blast} below). You may want to jump ahead to that now \ldots. \section{Running BLAST locally} \label{sec:running-local-blast} \subsection{Introduction} Running BLAST locally (as opposed to over the internet, see Section~\ref{sec:running-www-blast}) has at least major two advantages: \begin{itemize} \item Local BLAST may be faster than BLAST over the internet; \item Local BLAST allows you to make your own database to search for sequences against. \end{itemize} Dealing with proprietary or unpublished sequence data can be another reason to run BLAST locally. You may not be allowed to redistribute the sequences, so submitting them to the NCBI as a BLAST query would not be an option. Unfortunately, there are some major drawbacks too -- installing all the bits and getting it setup right takes some effort: \begin{itemize} \item Local BLAST requires command line tools to be installed. \item Local BLAST requires (large) BLAST databases to be setup (and potentially kept up to date). \end{itemize} \noindent To further confuse matters there are several different BLAST packages available, and there are also other tools which can produce imitation BLAST output files, such as BLAT. \subsection{Standalone NCBI BLAST+} The ``new'' \href{http://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=Download} {NCBI BLAST+} suite was released in 2009. This replaces the old NCBI ``legacy'' BLAST package (see below). This section will show briefly how to use these tools from within Python. If you have already read or tried the alignment tool examples in Section~\ref{sec:alignment-tools} this should all seem quite straightforward. First, we construct a command line string (as you would type in at the command line prompt if running standalone BLAST by hand). Then we can execute this command from within Python. For example, taking a FASTA file of gene nucleotide sequences, you might want to run a BLASTX (translation) search against the non-redundant (NR) protein database. Assuming you (or your systems administrator) has downloaded and installed the NR database, you might run: \begin{verbatim} blastx -query opuntia.fasta -db nr -out opuntia.xml -evalue 0.001 -outfmt 5 \end{verbatim} This should run BLASTX against the NR database, using an expectation cut-off value of $0.001$ and produce XML output to the specified file (which we can then parse). On my computer this takes about six minutes - a good reason to save the output to a file so you and repeat any analysis as needed. From within Biopython we can use the NCBI BLASTX wrapper from the \verb|Bio.Blast.Applications| module to build the command line string, and run it: \begin{verbatim} >>> from Bio.Blast.Applications import NcbiblastxCommandline >>> help(NcbiblastxCommandline) ... >>> blastx_cline = NcbiblastxCommandline(query="opuntia.fasta", db="nr", evalue=0.001, ... outfmt=5, out="opuntia.xml") >>> blastx_cline NcbiblastxCommandline(cmd='blastx', out='opuntia.xml', outfmt=5, query='opuntia.fasta', db='nr', evalue=0.001) >>> print(blastx_cline) blastx -out opuntia.xml -outfmt 5 -query opuntia.fasta -db nr -evalue 0.001 >>> stdout, stderr = blastx_cline() \end{verbatim} In this example there shouldn't be any output from BLASTX to the terminal, so stdout and stderr should be empty. You may want to check the output file \verb|opuntia.xml| has been created. As you may recall from earlier examples in the tutorial, the \verb|opuntia.fasta| contains seven sequences, so the BLAST XML output should contain multiple results. Therefore use \verb|Bio.Blast.NCBIXML.parse()| to parse it as described below in Section~\ref{sec:parsing-blast}. \subsection{Other versions of BLAST} NCBI BLAST+ (written in C++) was first released in 2009 as a replacement for the original NCBI ``legacy'' BLAST (written in C) which is no longer being updated. There were a lot of changes -- the old version had a single core command line tool \verb|blastall| which covered multiple different BLAST search types (which are now separate commands in BLAST+), and all the command line options were renamed. Biopython's wrappers for the NCBI ``legacy'' BLAST tools have been deprecated and will be removed in a future release. To try to avoid confusion, we do not cover calling these old tools from Biopython in this tutorial. You may also come across \href{http://blast.wustl.edu/}{Washington University BLAST} (WU-BLAST), and its successor, \href{http://blast.advbiocomp.com}{Advanced Biocomputing BLAST} (AB-BLAST, released in 2009, not free/open source). These packages include the command line tools \verb|wu-blastall| and \verb|ab-blastall|, which mimicked \verb|blastall| from the NCBI ``legacy'' BLAST stuie. Biopython does not currently provide wrappers for calling these tools, but should be able to parse any NCBI compatible output from them. \section{Parsing BLAST output} \label{sec:parsing-blast} As mentioned above, BLAST can generate output in various formats, such as XML, HTML, and plain text. Originally, Biopython had parsers for BLAST plain text and HTML output, as these were the only output formats offered at the time. Unfortunately, the BLAST output in these formats kept changing, each time breaking the Biopython parsers. Our HTML BLAST parser has been removed, but the plain text BLAST parser is still available (see Section~\ref{sec:parsing-blast-deprecated}). Use it at your own risk, it may or may not work, depending on which BLAST version you're using. As keeping up with changes in BLAST became a hopeless endeavor, especially with users running different BLAST versions, we now recommend to parse the output in XML format, which can be generated by recent versions of BLAST. Not only is the XML output more stable than the plain text and HTML output, it is also much easier to parse automatically, making Biopython a whole lot more stable. You can get BLAST output in XML format in various ways. For the parser, it doesn't matter how the output was generated, as long as it is in the XML format. \begin{itemize} \item You can use Biopython to run BLAST over the internet, as described in section~\ref{sec:running-www-blast}. \item You can use Biopython to run BLAST locally, as described in section~\ref{sec:running-local-blast}. \item You can do the BLAST search yourself on the NCBI site through your web browser, and then save the results. You need to choose XML as the format in which to receive the results, and save the final BLAST page you get (you know, the one with all of the interesting results!) to a file. \item You can also run BLAST locally without using Biopython, and save the output in a file. Again, you need to choose XML as the format in which to receive the results. \end{itemize} The important point is that you do not have to use Biopython scripts to fetch the data in order to be able to parse it. Doing things in one of these ways, you then need to get a handle to the results. In Python, a handle is just a nice general way of describing input to any info source so that the info can be retrieved using \verb|read()| and \verb|readline()| functions (see Section~{sec:appendix-handles}). If you followed the code above for interacting with BLAST through a script, then you already have \verb|result_handle|, the handle to the BLAST results. For example, using a GI number to do an online search: \begin{verbatim} >>> from Bio.Blast import NCBIWWW >>> result_handle = NCBIWWW.qblast("blastn", "nt", "8332116") \end{verbatim} If instead you ran BLAST some other way, and have the BLAST output (in XML format) in the file \verb|my_blast.xml|, all you need to do is to open the file for reading: \begin{verbatim} >>> result_handle = open("my_blast.xml") \end{verbatim} Now that we've got a handle, we are ready to parse the output. The code to parse it is really quite small. If you expect a single BLAST result (i.e. you used a single query): \begin{verbatim} >>> from Bio.Blast import NCBIXML >>> blast_record = NCBIXML.read(result_handle) \end{verbatim} \noindent or, if you have lots of results (i.e. multiple query sequences): \begin{verbatim} >>> from Bio.Blast import NCBIXML >>> blast_records = NCBIXML.parse(result_handle) \end{verbatim} Just like \verb|Bio.SeqIO| and \verb|Bio.AlignIO| (see Chapters~\ref{chapter:Bio.SeqIO} and~\ref{chapter:Bio.AlignIO}), we have a pair of input functions, \verb|read| and \verb|parse|, where \verb|read| is for when you have exactly one object, and \verb|parse| is an iterator for when you can have lots of objects -- but instead of getting \verb|SeqRecord| or \verb|MultipleSeqAlignment| objects, we get BLAST record objects. To be able to handle the situation where the BLAST file may be huge, containing thousands of results, \verb|NCBIXML.parse()| returns an iterator. In plain English, an iterator allows you to step through the BLAST output, retrieving BLAST records one by one for each BLAST search result: \begin{verbatim} >>> from Bio.Blast import NCBIXML >>> blast_records = NCBIXML.parse(result_handle) >>> blast_record = next(blast_records) # ... do something with blast_record >>> blast_record = next(blast_records) # ... do something with blast_record >>> blast_record = next(blast_records) # ... do something with blast_record >>> blast_record = next(blast_records) Traceback (most recent call last): File "", line 1, in StopIteration # No further records \end{verbatim} Or, you can use a \verb|for|-loop: \begin{verbatim} >>> for blast_record in blast_records: ... # Do something with blast_record \end{verbatim} Note though that you can step through the BLAST records only once. Usually, from each BLAST record you would save the information that you are interested in. If you want to save all returned BLAST records, you can convert the iterator into a list: \begin{verbatim} >>> blast_records = list(blast_records) \end{verbatim} Now you can access each BLAST record in the list with an index as usual. If your BLAST file is huge though, you may run into memory problems trying to save them all in a list. Usually, you'll be running one BLAST search at a time. Then, all you need to do is to pick up the first (and only) BLAST record in \verb|blast_records|: \begin{verbatim} >>> from Bio.Blast import NCBIXML >>> blast_records = NCBIXML.parse(result_handle) >>> blast_record = next(blast_records) \end{verbatim} \noindent or more elegantly: \begin{verbatim} >>> from Bio.Blast import NCBIXML >>> blast_record = NCBIXML.read(result_handle) \end{verbatim} I guess by now you're wondering what is in a BLAST record. \section{The BLAST record class} A BLAST Record contains everything you might ever want to extract from the BLAST output. Right now we'll just show an example of how to get some info out of the BLAST report, but if you want something in particular that is not described here, look at the info on the record class in detail, and take a gander into the code or automatically generated documentation -- the docstrings have lots of good info about what is stored in each piece of information. To continue with our example, let's just print out some summary info about all hits in our blast report greater than a particular threshold. The following code does this: \begin{verbatim} >>> E_VALUE_THRESH = 0.04 >>> for alignment in blast_record.alignments: ... for hsp in alignment.hsps: ... if hsp.expect < E_VALUE_THRESH: ... print('****Alignment****') ... print('sequence:', alignment.title) ... print('length:', alignment.length) ... print('e value:', hsp.expect) ... print(hsp.query[0:75] + '...') ... print(hsp.match[0:75] + '...') ... print(hsp.sbjct[0:75] + '...') \end{verbatim} This will print out summary reports like the following: \begin{verbatim} ****Alignment**** sequence: >gb|AF283004.1|AF283004 Arabidopsis thaliana cold acclimation protein WCOR413-like protein alpha form mRNA, complete cds length: 783 e value: 0.034 tacttgttgatattggatcgaacaaactggagaaccaacatgctcacgtcacttttagtcccttacatattcctc... ||||||||| | ||||||||||| || |||| || || |||||||| |||||| | | |||||||| ||| ||... tacttgttggtgttggatcgaaccaattggaagacgaatatgctcacatcacttctcattccttacatcttcttc... \end{verbatim} Basically, you can do anything you want to with the info in the BLAST report once you have parsed it. This will, of course, depend on what you want to use it for, but hopefully this helps you get started on doing what you need to do! An important consideration for extracting information from a BLAST report is the type of objects that the information is stored in. In Biopython, the parsers return \verb|Record| objects, either \verb|Blast| or \verb|PSIBlast| depending on what you are parsing. These objects are defined in \verb|Bio.Blast.Record| and are quite complete. Here are my attempts at UML class diagrams for the \verb|Blast| and \verb|PSIBlast| record classes. If you are good at UML and see mistakes/improvements that can be made, please let me know. The Blast class diagram is shown in Figure~\ref{fig:blastrecord}. \begin{htmlonly} \label{fig:blastrecord} \imgsrc[width=650, height=750]{images/BlastRecord.png} \end{htmlonly} \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/BlastRecord.png} \caption{Class diagram for the Blast Record class representing all of the info in a BLAST report} \label{fig:blastrecord} \end{figure} \end{latexonly} The PSIBlast record object is similar, but has support for the rounds that are used in the iteration steps of PSIBlast. The class diagram for PSIBlast is shown in Figure~\ref{fig:psiblastrecord}. \begin{htmlonly} \label{fig:psiblastrecord} \imgsrc[width=650, height=750]{images/PSIBlastRecord.png} \end{htmlonly} \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/PSIBlastRecord.png} \caption{Class diagram for the PSIBlast Record class.} \label{fig:psiblastrecord} \end{figure} \end{latexonly} \section{Deprecated BLAST parsers} \label{sec:parsing-blast-deprecated} Older versions of Biopython had parsers for BLAST output in plain text or HTML format. Over the years, we discovered that it is very hard to maintain these parsers in working order. Basically, any small change to the BLAST output in newly released BLAST versions tends to cause the plain text and HTML parsers to break. We therefore recommend parsing BLAST output in XML format, as described in section~\ref{sec:parsing-blast}. Depending on which BLAST versions or programs you're using, our plain text BLAST parser may or may not work. Use it at your own risk! \subsection{Parsing plain-text BLAST output} The plain text BLAST parser is located in \verb|Bio.Blast.NCBIStandalone|. As with the XML parser, we need to have a handle object that we can pass to the parser. The handle must implement the \verb|readline()| method and do this properly. The common ways to get such a handle are to either use the provided \verb|blastall| or \verb|blastpgp| functions to run the local blast, or to run a local blast via the command line, and then do something like the following: \begin{verbatim} >>> result_handle = open("my_file_of_blast_output.txt") \end{verbatim} Well, now that we've got a handle (which we'll call \verb|result_handle|), we are ready to parse it. This can be done with the following code: \begin{verbatim} >>> from Bio.Blast import NCBIStandalone >>> blast_parser = NCBIStandalone.BlastParser() >>> blast_record = blast_parser.parse(result_handle) \end{verbatim} This will parse the BLAST report into a Blast Record class (either a Blast or a PSIBlast record, depending on what you are parsing) so that you can extract the information from it. In our case, let's just use print out a quick summary of all of the alignments greater than some threshold value. \begin{verbatim} >>> E_VALUE_THRESH = 0.04 >>> for alignment in blast_record.alignments: ... for hsp in alignment.hsps: ... if hsp.expect < E_VALUE_THRESH: ... print('****Alignment****') ... print('sequence:', alignment.title) ... print('length:', alignment.length) ... print('e value:', hsp.expect) ... print(hsp.query[0:75] + '...') ... print(hsp.match[0:75] + '...') ... print(hsp.sbjct[0:75] + '...') \end{verbatim} If you also read the section~\ref{sec:parsing-blast} on parsing BLAST XML output, you'll notice that the above code is identical to what is found in that section. Once you parse something into a record class you can deal with it independent of the format of the original BLAST info you were parsing. Pretty snazzy! Sure, parsing one record is great, but I've got a BLAST file with tons of records -- how can I parse them all? Well, fear not, the answer lies in the very next section. \subsection{Parsing a plain-text BLAST file full of BLAST runs} We can do this using the blast iterator. To set up an iterator, we first set up a parser, to parse our blast reports in Blast Record objects: \begin{verbatim} >>> from Bio.Blast import NCBIStandalone >>> blast_parser = NCBIStandalone.BlastParser() \end{verbatim} Then we will assume we have a handle to a bunch of blast records, which we'll call \verb|result_handle|. Getting a handle is described in full detail above in the blast parsing sections. Now that we've got a parser and a handle, we are ready to set up the iterator with the following command: \begin{verbatim} >>> blast_iterator = NCBIStandalone.Iterator(result_handle, blast_parser) \end{verbatim} The second option, the parser, is optional. If we don't supply a parser, then the iterator will just return the raw BLAST reports one at a time. Now that we've got an iterator, we start retrieving blast records (generated by our parser) using \verb|next()|: \begin{verbatim} >>> blast_record = next(blast_iterator) \end{verbatim} Each call to next will return a new record that we can deal with. Now we can iterate through this records and generate our old favorite, a nice little blast report: \begin{verbatim} >>> for blast_record in blast_iterator: ... E_VALUE_THRESH = 0.04 ... for alignment in blast_record.alignments: ... for hsp in alignment.hsps: ... if hsp.expect < E_VALUE_THRESH: ... print('****Alignment****') ... print('sequence:', alignment.title) ... print('length:', alignment.length) ... print('e value:', hsp.expect) ... if len(hsp.query) > 75: ... dots = '...' ... else: ... dots = '' ... print(hsp.query[0:75] + dots) ... print(hsp.match[0:75] + dots) ... print(hsp.sbjct[0:75] + dots) \end{verbatim} %Notice that \verb|next(b_iterator)| will return \verb|None| when it runs out of records to parse, so it is easy to iterate through the entire file with a while loop that checks for the existence of a record. The iterator allows you to deal with huge blast records without any memory problems, since things are read in one at a time. I have parsed tremendously huge files without any problems using this. %TODO - Remove this or update it for BLAST XML parser \subsection{Finding a bad record somewhere in a huge plain-text BLAST file} One really ugly problem that happens to me is that I'll be parsing a huge blast file for a while, and the parser will bomb out with a ValueError. This is a serious problem, since you can't tell if the ValueError is due to a parser problem, or a problem with the BLAST. To make it even worse, you have no idea where the parse failed, so you can't just ignore the error, since this could be ignoring an important data point. We used to have to make a little script to get around this problem, but the \verb|Bio.Blast| module now includes a \verb|BlastErrorParser| which really helps make this easier. The \verb|BlastErrorParser| works very similar to the regular \verb|BlastParser|, but it adds an extra layer of work by catching ValueErrors that are generated by the parser, and attempting to diagnose the errors. Let's take a look at using this parser -- first we define the file we are going to parse and the file to write the problem reports to: \begin{verbatim} >>> import os >>> blast_file = os.path.join(os.getcwd(), "blast_out", "big_blast.out") >>> error_file = os.path.join(os.getcwd(), "blast_out", "big_blast.problems") \end{verbatim} Now we want to get a \verb|BlastErrorParser|: \begin{verbatim} >>> from Bio.Blast import NCBIStandalone >>> error_handle = open(error_file, "w") >>> blast_error_parser = NCBIStandalone.BlastErrorParser(error_handle) \end{verbatim} Notice that the parser take an optional argument of a handle. If a handle is passed, then the parser will write any blast records which generate a ValueError to this handle. Otherwise, these records will not be recorded. Now we can use the \verb|BlastErrorParser| just like a regular blast parser. Specifically, we might want to make an iterator that goes through our blast records one at a time and parses them with the error parser: \begin{verbatim} >>> result_handle = open(blast_file) >>> iterator = NCBIStandalone.Iterator(result_handle, blast_error_parser) \end{verbatim} We can read these records one a time, but now we can catch and deal with errors that are due to problems with Blast (and not with the parser itself): \begin{verbatim} >>> try: ... next_record = next(iterator) ... except NCBIStandalone.LowQualityBlastError as info: ... print("LowQualityBlastError detected in id %s" % info[1]) \end{verbatim} The \verb|next()| functionality is normally called indirectly via a \verb|for|-loop. Right now the \verb|BlastErrorParser| can generate the following errors: \begin{itemize} \item \verb|ValueError| -- This is the same error generated by the regular BlastParser, and is due to the parser not being able to parse a specific file. This is normally either due to a bug in the parser, or some kind of discrepancy between the version of BLAST you are using and the versions the parser is able to handle. \item \verb|LowQualityBlastError| -- When BLASTing a sequence that is of really bad quality (for example, a short sequence that is basically a stretch of one nucleotide), it seems that Blast ends up masking out the entire sequence and ending up with nothing to parse. In this case it will produce a truncated report that causes the parser to generate a ValueError. \verb|LowQualityBlastError| is reported in these cases. This error returns an info item with the following information: \begin{itemize} \item \verb|item[0]| -- The error message \item \verb|item[1]| -- The id of the input record that caused the error. This is really useful if you want to record all of the records that are causing problems. \end{itemize} \end{itemize} As mentioned, with each error generated, the BlastErrorParser will write the offending record to the specified \verb|error_handle|. You can then go ahead and look and these and deal with them as you see fit. Either you will be able to debug the parser with a single blast report, or will find out problems in your blast runs. Either way, it will definitely be a useful experience! Hopefully the \verb|BlastErrorParser| will make it much easier to debug and deal with large Blast files. \section{Dealing with PSI-BLAST} You can run the standalone version of PSI-BLAST (the legacy NCBI command line tool \verb|blastpgp|, or its replacement \verb|psiblast|) using the wrappers in \verb|Bio.Blast.Applications| module. At the time of writing, the NCBI do not appear to support tools running a PSI-BLAST search via the internet. Note that the \verb|Bio.Blast.NCBIXML| parser can read the XML output from current versions of PSI-BLAST, but information like which sequences in each iteration is new or reused isn't present in the XML file. If you care about this information you may have more joy with the plain text output and the \verb|PSIBlastParser| in \verb|Bio.Blast.NCBIStandalone|. \section{Dealing with RPS-BLAST} You can run the standalone version of RPS-BLAST (either the legacy NCBI command line tool \verb|rpsblast|, or its replacement with the same name) using the wrappers in \verb|Bio.Blast.Applications| module. At the time of writing, the NCBI do not appear to support tools running an RPS-BLAST search via the internet. You can use the \verb|Bio.Blast.NCBIXML| parser to read the XML output from current versions of RPS-BLAST. \chapter{BLAST and other sequence search tools (\textit{experimental code})} \label{chapter:searchio} \emph{WARNING}: This chapter of the Tutorial describes an \emph{experimental} module in Biopython. It is being included in Biopython and documented here in the tutorial in a pre-final state to allow a period of feedback and refinement before we declare it stable. Until then the details will probably change, and any scripts using the current \verb|Bio.SearchIO| would need to be updated. Please keep this in mind! For stable code working with NCBI BLAST, please continue to use Bio.Blast described in the preceding Chapter~\ref{chapter:blast}. Biological sequence identification is an integral part of bioinformatics. Several tools are available for this, each with their own algorithms and approaches, such as BLAST (arguably the most popular), FASTA, HMMER, and many more. In general, these tools usually use your sequence to search a database of potential matches. With the growing number of known sequences (hence the growing number of potential matches), interpreting the results becomes increasingly hard as there could be hundreds or even thousands of potential matches. Naturally, manual interpretation of these searches' results is out of the question. Moreover, you often need to work with several sequence search tools, each with its own statistics, conventions, and output format. Imagine how daunting it would be when you need to work with multiple sequences using multiple search tools. We know this too well ourselves, which is why we created the \verb|Bio.SearchIO| submodule in Biopython. \verb|Bio.SearchIO| allows you to extract information from your search results in a convenient way, while also dealing with the different standards and conventions used by different search tools. The name \verb|SearchIO| is a homage to BioPerl's module of the same name. In this chapter, we'll go through the main features of \verb|Bio.SearchIO| to show what it can do for you. We'll use two popular search tools along the way: BLAST and BLAT. They are used merely for illustrative purposes, and you should be able to adapt the workflow to any other search tools supported by \verb|Bio.SearchIO| in a breeze. You're very welcome to follow along with the search output files we'll be using. The BLAST output file can be downloaded \href{http://biopython.org/SRC/Tests/Tutorial/my_blast.xml}{here}, and the BLAT output file \href{http://biopython.org/SRC/Tests/Tutorial/my_blat.psl}{here}. Both output files were generated using this sequence: \begin{verbatim} >mystery_seq CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG \end{verbatim} The BLAST result is an XML file generated using \verb|blastn| against the NCBI \verb|refseq_rna| database. For BLAT, the sequence database was the February 2009 \verb|hg19| human genome draft and the output format is PSL. We'll start from an introduction to the \verb|Bio.SearchIO| object model. The model is the representation of your search results, thus it is core to \verb|Bio.SearchIO| itself. After that, we'll check out the main functions in \verb|Bio.SearchIO| that you may often use. Now that we're all set, let's go to the first step: introducing the core object model. \section{The SearchIO object model} \label{sec:searchio-model} Despite the wildly differing output styles among many sequence search tools, it turns out that their underlying concept is similar: \begin{itemize} \item The output file may contain results from one or more search queries. \item In each search query, you will see one or more hits from the given search database. \item In each database hit, you will see one or more regions containing the actual sequence alignment between your query sequence and the database sequence. \item Some programs like BLAT or Exonerate may further split these regions into several alignment fragments (or blocks in BLAT and possibly exons in exonerate). This is not something you always see, as programs like BLAST and HMMER do not do this. \end{itemize} Realizing this generality, we decided use it as base for creating the \verb|Bio.SearchIO| object model. The object model consists of a nested hierarchy of Python objects, each one representing one concept outlined above. These objects are: \begin{itemize} \item \verb|QueryResult|, to represent a single search query. \item \verb|Hit|, to represent a single database hit. \verb|Hit| objects are contained within \verb|QueryResult| and in each \verb|QueryResult| there is zero or more \verb|Hit| objects. \item \verb|HSP| (short for high-scoring pair), to represent region(s) of significant alignments between query and hit sequences. \verb|HSP| objects are contained within \verb|Hit| objects and each \verb|Hit| has one or more \verb|HSP| objects. \item \verb|HSPFragment|, to represent a single contiguous alignment between query and hit sequences. \verb|HSPFragment| objects are contained within \verb|HSP| objects. Most sequence search tools like BLAST and HMMER unify \verb|HSP| and \verb|HSPFragment| objects as each \verb|HSP| will only have a single \verb|HSPFragment|. However there are tools like BLAT and Exonerate that produce \verb|HSP| containing multiple \verb|HSPFragment|. Don't worry if this seems a tad confusing now, we'll elaborate more on these two objects later on. \end{itemize} These four objects are the ones you will interact with when you use \verb|Bio.SearchIO|. They are created using one of the main \verb|Bio.SearchIO| methods: \verb|read|, \verb|parse|, \verb|index|, or \verb|index_db|. The details of these methods are provided in later sections. For this section, we'll only be using read and parse. These functions behave similarly to their \verb|Bio.SeqIO| and \verb|Bio.AlignIO| counterparts: \begin{itemize} \item \verb|read| is used for search output files with a single query and returns a \verb|QueryResult| object \item \verb|parse| is used for search output files with multiple queries and returns a generator that yields \verb|QueryResult| objects \end{itemize} With that settled, let's start probing each \verb|Bio.SearchIO| object, beginning with \verb|QueryResult|. \subsection{QueryResult} \label{sec:searchio-qresult} The QueryResult object represents a single search query and contains zero or more Hit objects. Let's see what it looks like using the BLAST file we have: %doctest ../Doc/examples \begin{verbatim} >>> from Bio import SearchIO >>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml') >>> print(blast_qresult) Program: blastn (2.2.27+) Query: 42291 (61) mystery_seq Target: refseq_rna Hits: ---- ----- ---------------------------------------------------------- # # HSP ID + description ---- ----- ---------------------------------------------------------- 0 1 gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 52... 1 1 gi|301171311|ref|NR_035856.1| Pan troglodytes microRNA... 2 1 gi|270133242|ref|NR_032573.1| Macaca mulatta microRNA ... 3 2 gi|301171322|ref|NR_035857.1| Pan troglodytes microRNA... 4 1 gi|301171267|ref|NR_035851.1| Pan troglodytes microRNA... 5 2 gi|262205330|ref|NR_030198.1| Homo sapiens microRNA 52... 6 1 gi|262205302|ref|NR_030191.1| Homo sapiens microRNA 51... 7 1 gi|301171259|ref|NR_035850.1| Pan troglodytes microRNA... 8 1 gi|262205451|ref|NR_030222.1| Homo sapiens microRNA 51... 9 2 gi|301171447|ref|NR_035871.1| Pan troglodytes microRNA... 10 1 gi|301171276|ref|NR_035852.1| Pan troglodytes microRNA... 11 1 gi|262205290|ref|NR_030188.1| Homo sapiens microRNA 51... 12 1 gi|301171354|ref|NR_035860.1| Pan troglodytes microRNA... 13 1 gi|262205281|ref|NR_030186.1| Homo sapiens microRNA 52... 14 2 gi|262205298|ref|NR_030190.1| Homo sapiens microRNA 52... 15 1 gi|301171394|ref|NR_035865.1| Pan troglodytes microRNA... 16 1 gi|262205429|ref|NR_030218.1| Homo sapiens microRNA 51... 17 1 gi|262205423|ref|NR_030217.1| Homo sapiens microRNA 52... 18 1 gi|301171401|ref|NR_035866.1| Pan troglodytes microRNA... 19 1 gi|270133247|ref|NR_032574.1| Macaca mulatta microRNA ... 20 1 gi|262205309|ref|NR_030193.1| Homo sapiens microRNA 52... 21 2 gi|270132717|ref|NR_032716.1| Macaca mulatta microRNA ... 22 2 gi|301171437|ref|NR_035870.1| Pan troglodytes microRNA... 23 2 gi|270133306|ref|NR_032587.1| Macaca mulatta microRNA ... 24 2 gi|301171428|ref|NR_035869.1| Pan troglodytes microRNA... 25 1 gi|301171211|ref|NR_035845.1| Pan troglodytes microRNA... 26 2 gi|301171153|ref|NR_035838.1| Pan troglodytes microRNA... 27 2 gi|301171146|ref|NR_035837.1| Pan troglodytes microRNA... 28 2 gi|270133254|ref|NR_032575.1| Macaca mulatta microRNA ... 29 2 gi|262205445|ref|NR_030221.1| Homo sapiens microRNA 51... ~~~ 97 1 gi|356517317|ref|XM_003527287.1| PREDICTED: Glycine ma... 98 1 gi|297814701|ref|XM_002875188.1| Arabidopsis lyrata su... 99 1 gi|397513516|ref|XM_003827011.1| PREDICTED: Pan panisc... \end{verbatim} We've just begun to scratch the surface of the object model, but you can see that there's already some useful information. By invoking \verb|print| on the \verb|QueryResult| object, you can see: \begin{itemize} \item The program name and version (blastn version 2.2.27+) \item The query ID, description, and its sequence length (ID is 42291, description is `mystery\_seq', and it is 61 nucleotides long) \item The target database to search against (refseq\_rna) \item A quick overview of the resulting hits. For our query sequence, there are 100 potential hits (numbered 0--99 in the table). For each hit, we can also see how many HSPs it contains, its ID, and a snippet of its description. Notice here that \verb|Bio.SearchIO| truncates the hit table overview, by showing only hits numbered 0--29, and then 97--99. \end{itemize} Now let's check our BLAT results using the same procedure as above: %cont-doctest \begin{verbatim} >>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl') >>> print(blat_qresult) Program: blat () Query: mystery_seq (61) Target: Hits: ---- ----- ---------------------------------------------------------- # # HSP ID + description ---- ----- ---------------------------------------------------------- 0 17 chr19 \end{verbatim} You'll immediately notice that there are some differences. Some of these are caused by the way PSL format stores its details, as you'll see. The rest are caused by the genuine program and target database differences between our BLAST and BLAT searches: \begin{itemize} \item The program name and version. \verb|Bio.SearchIO| knows that the program is BLAT, but in the output file there is no information regarding the program version so it defaults to `'. \item The query ID, description, and its sequence length. Notice here that these details are slightly different from the ones we saw in BLAST. The ID is `mystery\_seq' instead of 42991, there is no known description, but the query length is still 61. This is actually a difference introduced by the file formats themselves. BLAST sometimes creates its own query IDs and uses your original ID as the sequence description. \item The target database is not known, as it is not stated in the BLAT output file. \item And finally, the list of hits we have is completely different. Here, we see that our query sequence only hits the `chr19' database entry, but in it we see 17 HSP regions. This should not be surprising however, given that we are using a different program, each with its own target database. \end{itemize} All the details you saw when invoking the \verb|print| method can be accessed individually using Python's object attribute access notation (a.k.a. the dot notation). There are also other format-specific attributes that you can access using the same method. %cont-doctest \begin{verbatim} >>> print("%s %s" % (blast_qresult.program, blast_qresult.version)) blastn 2.2.27+ >>> print("%s %s" % (blat_qresult.program, blat_qresult.version)) blat >>> blast_qresult.param_evalue_threshold # blast-xml specific 10.0 \end{verbatim} For a complete list of accessible attributes, you can check each format-specific documentation. Here are the ones \href{http://biopython.org/DIST/docs/api/Bio.SearchIO.BlastIO-module.html}{for BLAST} and for \href{http://biopython.org/DIST/docs/api/Bio.SearchIO.BlatIO-module.html}{BLAT}. Having looked at using \verb|print| on \verb|QueryResult| objects, let's drill down deeper. What exactly is a \verb|QueryResult|? In terms of Python objects, \verb|QueryResult| is a hybrid between a list and a dictionary. In other words, it is a container object with all the convenient features of lists and dictionaries. Like Python lists and dictionaries, \verb|QueryResult| objects are iterable. Each iteration returns a \verb|Hit| object: \begin{verbatim} >>> for hit in blast_qresult: ... hit Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps) Hit(id='gi|301171311|ref|NR_035856.1|', query_id='42291', 1 hsps) Hit(id='gi|270133242|ref|NR_032573.1|', query_id='42291', 1 hsps) Hit(id='gi|301171322|ref|NR_035857.1|', query_id='42291', 2 hsps) Hit(id='gi|301171267|ref|NR_035851.1|', query_id='42291', 1 hsps) ... \end{verbatim} To check how many items (hits) a \verb|QueryResult| has, you can simply invoke Python's \verb|len| method: %cont-doctest \begin{verbatim} >>> len(blast_qresult) 100 >>> len(blat_qresult) 1 \end{verbatim} Like Python lists, you can retrieve items (hits) from a \verb|QueryResult| using the slice notation: %cont-doctest \begin{verbatim} >>> blast_qresult[0] # retrieves the top hit Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps) >>> blast_qresult[-1] # retrieves the last hit Hit(id='gi|397513516|ref|XM_003827011.1|', query_id='42291', 1 hsps) \end{verbatim} To retrieve multiple hits, you can slice \verb|QueryResult| objects using the slice notation as well. In this case, the slice will return a new \verb|QueryResult| object containing only the sliced hits: %cont-doctest \begin{verbatim} >>> blast_slice = blast_qresult[:3] # slices the first three hits >>> print(blast_slice) Program: blastn (2.2.27+) Query: 42291 (61) mystery_seq Target: refseq_rna Hits: ---- ----- ---------------------------------------------------------- # # HSP ID + description ---- ----- ---------------------------------------------------------- 0 1 gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 52... 1 1 gi|301171311|ref|NR_035856.1| Pan troglodytes microRNA... 2 1 gi|270133242|ref|NR_032573.1| Macaca mulatta microRNA ... \end{verbatim} Like Python dictionaries, you can also retrieve hits using the hit's ID. This is particularly useful if you know a given hit ID exists within a search query results: %cont-doctest \begin{verbatim} >>> blast_qresult['gi|262205317|ref|NR_030195.1|'] Hit(id='gi|262205317|ref|NR_030195.1|', query_id='42291', 1 hsps) \end{verbatim} You can also get a full list of \verb|Hit| objects using \verb|hits| and a full list of \verb|Hit| IDs using \verb|hit_keys|: \begin{verbatim} >>> blast_qresult.hits [...] # list of all hits >>> blast_qresult.hit_keys [...] # list of all hit IDs \end{verbatim} What if you just want to check whether a particular hit is present in the query results? You can do a simple Python membership test using the \verb|in| keyword: %cont-doctest \begin{verbatim} >>> 'gi|262205317|ref|NR_030195.1|' in blast_qresult True >>> 'gi|262205317|ref|NR_030194.1|' in blast_qresult False \end{verbatim} Sometimes, knowing whether a hit is present is not enough; you also want to know the rank of the hit. Here, the \verb|index| method comes to the rescue: %cont-doctest \begin{verbatim} >>> blast_qresult.index('gi|301171437|ref|NR_035870.1|') 22 \end{verbatim} Remember that we're using Python's indexing style here, which is zero-based. This means our hit above is ranked at no. 23, not 22. Also, note that the hit rank you see here is based on the native hit ordering present in the original search output file. Different search tools may order these hits based on different criteria. If the native hit ordering doesn't suit your taste, you can use the \verb|sort| method of the \verb|QueryResult| object. It is very similar to Python's \verb|list.sort| method, with the addition of an option to create a new sorted \verb|QueryResult| object or not. Here is an example of using \verb|QueryResult.sort| to sort the hits based on each hit's full sequence length. For this particular sort, we'll set the \verb|in_place| flag to \verb|False| so that sorting will return a new \verb|QueryResult| object and leave our initial object unsorted. We'll also set the \verb|reverse| flag to \verb|True| so that we sort in descending order. %cont-doctest \begin{verbatim} >>> for hit in blast_qresult[:5]: # id and sequence length of the first five hits ... print("%s %i" % (hit.id, hit.seq_len)) ... gi|262205317|ref|NR_030195.1| 61 gi|301171311|ref|NR_035856.1| 60 gi|270133242|ref|NR_032573.1| 85 gi|301171322|ref|NR_035857.1| 86 gi|301171267|ref|NR_035851.1| 80 >>> sort_key = lambda hit: hit.seq_len >>> sorted_qresult = blast_qresult.sort(key=sort_key, reverse=True, in_place=False) >>> for hit in sorted_qresult[:5]: ... print("%s %i" % (hit.id, hit.seq_len)) ... gi|397513516|ref|XM_003827011.1| 6002 gi|390332045|ref|XM_776818.2| 4082 gi|390332043|ref|XM_003723358.1| 4079 gi|356517317|ref|XM_003527287.1| 3251 gi|356543101|ref|XM_003539954.1| 2936 \end{verbatim} The advantage of having the \verb|in_place| flag here is that we're preserving the native ordering, so we may use it again later. You should note that this is not the default behavior of \verb|QueryResult.sort|, however, which is why we needed to set the \verb|in_place| flag to \verb|True| explicitly. At this point, you've known enough about \verb|QueryResult| objects to make it work for you. But before we go on to the next object in the \verb|Bio.SearchIO| model, let's take a look at two more sets of methods that could make it even easier to work with \verb|QueryResult| objects: the \verb|filter| and \verb|map| methods. If you're familiar with Python's list comprehensions, generator expressions or the built in \verb|filter| and \verb|map| functions, you'll know how useful they are for working with list-like objects (if you're not, check them out!). You can use these built in methods to manipulate \verb|QueryResult| objects, but you'll end up with regular Python lists and lose the ability to do more interesting manipulations. That's why, \verb|QueryResult| objects provide its own flavor of \verb|filter| and \verb|map| methods. Analogous to \verb|filter|, there are \verb|hit_filter| and \verb|hsp_filter| methods. As their name implies, these methods filter its \verb|QueryResult| object either on its \verb|Hit| objects or \verb|HSP| objects. Similarly, analogous to \verb|map|, \verb|QueryResult| objects also provide the \verb|hit_map| and \verb|hsp_map| methods. These methods apply a given function to all hits or HSPs in a \verb|QueryResult| object, respectively. Let's see these methods in action, beginning with \verb|hit_filter|. This method accepts a callback function that checks whether a given \verb|Hit| object passes the condition you set or not. In other words, the function must accept as its argument a single \verb|Hit| object and returns \verb|True| or \verb|False|. Here is an example of using \verb|hit_filter| to filter out \verb|Hit| objects that only have one HSP: %cont-doctest \begin{verbatim} >>> filter_func = lambda hit: len(hit.hsps) > 1 # the callback function >>> len(blast_qresult) # no. of hits before filtering 100 >>> filtered_qresult = blast_qresult.hit_filter(filter_func) >>> len(filtered_qresult) # no. of hits after filtering 37 >>> for hit in filtered_qresult[:5]: # quick check for the hit lengths ... print("%s %i" % (hit.id, len(hit.hsps))) gi|301171322|ref|NR_035857.1| 2 gi|262205330|ref|NR_030198.1| 2 gi|301171447|ref|NR_035871.1| 2 gi|262205298|ref|NR_030190.1| 2 gi|270132717|ref|NR_032716.1| 2 \end{verbatim} \verb|hsp_filter| works the same as \verb|hit_filter|, only instead of looking at the \verb|Hit| objects, it performs filtering on the \verb|HSP| objects in each hits. As for the \verb|map| methods, they too accept a callback function as their arguments. However, instead of returning \verb|True| or \verb|False|, the callback function must return the modified \verb|Hit| or \verb|HSP| object (depending on whether you're using \verb|hit_map| or \verb|hsp_map|). Let's see an example where we're using \verb|hit_map| to rename the hit IDs: %cont-doctest \begin{verbatim} >>> def map_func(hit): ... hit.id = hit.id.split('|')[3] # renames 'gi|301171322|ref|NR_035857.1|' to 'NR_035857.1' ... return hit ... >>> mapped_qresult = blast_qresult.hit_map(map_func) >>> for hit in mapped_qresult[:5]: ... print(hit.id) NR_030195.1 NR_035856.1 NR_032573.1 NR_035857.1 NR_035851.1 \end{verbatim} Again, \verb|hsp_map| works the same as \verb|hit_map|, but on \verb|HSP| objects instead of \verb|Hit| objects. \subsection{Hit} \label{sec:searchio-hit} \verb|Hit| objects represent all query results from a single database entry. They are the second-level container in the \verb|Bio.SearchIO| object hierarchy. You've seen that they are contained by \verb|QueryResult| objects, but they themselves contain \verb|HSP| objects. Let's see what they look like, beginning with our BLAST search: %doctest ../Doc/examples \begin{verbatim} >>> from Bio import SearchIO >>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml') >>> blast_hit = blast_qresult[3] # fourth hit from the query result >>> print(blast_hit) Query: 42291 mystery_seq Hit: gi|301171322|ref|NR_035857.1| (86) Pan troglodytes microRNA mir-520c (MIR520C), microRNA HSPs: ---- -------- --------- ------ --------------- --------------------- # E-value Bit score Span Query range Hit range ---- -------- --------- ------ --------------- --------------------- 0 8.9e-20 100.47 60 [1:61] [13:73] 1 3.3e-06 55.39 60 [0:60] [13:73] \end{verbatim} You see that we've got the essentials covered here: \begin{itemize} \item The query ID and description is present. A hit is always tied to a query, so we want to keep track of the originating query as well. These values can be accessed from a hit using the \verb|query_id| and \verb|query_description| attributes. \item We also have the unique hit ID, description, and full sequence lengths. They can be accessed using \verb|id|, \verb|description|, and \verb|seq_len|, respectively. \item Finally, there's a table containing quick information about the HSPs this hit contains. In each row, we've got the important HSP details listed: the HSP index, its e-value, its bit score, its span (the alignment length including gaps), its query coordinates, and its hit coordinates. \end{itemize} Now let's contrast this with the BLAT search. Remember that in the BLAT search we had one hit with 17 HSPs. %cont-doctest \begin{verbatim} >>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl') >>> blat_hit = blat_qresult[0] # the only hit >>> print(blat_hit) Query: mystery_seq Hit: chr19 (59128983) HSPs: ---- -------- --------- ------ --------------- --------------------- # E-value Bit score Span Query range Hit range ---- -------- --------- ------ --------------- --------------------- 0 ? ? ? [0:61] [54204480:54204541] 1 ? ? ? [0:61] [54233104:54264463] 2 ? ? ? [0:61] [54254477:54260071] 3 ? ? ? [1:61] [54210720:54210780] 4 ? ? ? [0:60] [54198476:54198536] 5 ? ? ? [0:61] [54265610:54265671] 6 ? ? ? [0:61] [54238143:54240175] 7 ? ? ? [0:60] [54189735:54189795] 8 ? ? ? [0:61] [54185425:54185486] 9 ? ? ? [0:60] [54197657:54197717] 10 ? ? ? [0:61] [54255662:54255723] 11 ? ? ? [0:61] [54201651:54201712] 12 ? ? ? [8:60] [54206009:54206061] 13 ? ? ? [10:61] [54178987:54179038] 14 ? ? ? [8:61] [54212018:54212071] 15 ? ? ? [8:51] [54234278:54234321] 16 ? ? ? [8:61] [54238143:54238196] \end{verbatim} Here, we've got a similar level of detail as with the BLAST hit we saw earlier. There are some differences worth explaining, though: \begin{itemize} \item The e-value and bit score column values. As BLAT HSPs do not have e-values and bit scores, the display defaults to `?'. \item What about the span column? The span values is meant to display the complete alignment length, which consists of all residues and any gaps that may be present. The PSL format do not have this information readily available and \verb|Bio.SearchIO| does not attempt to try guess what it is, so we get a `?' similar to the e-value and bit score columns. \end{itemize} In terms of Python objects, \verb|Hit| behaves almost the same as Python lists, but contain \verb|HSP| objects exclusively. If you're familiar with lists, you should encounter no difficulties working with the \verb|Hit| object. Just like Python lists, \verb|Hit| objects are iterable, and each iteration returns one \verb|HSP| object it contains: %cont-doctest \begin{verbatim} >>> for hsp in blast_hit: ... hsp HSP(hit_id='gi|301171322|ref|NR_035857.1|', query_id='42291', 1 fragments) HSP(hit_id='gi|301171322|ref|NR_035857.1|', query_id='42291', 1 fragments) \end{verbatim} You can invoke \verb|len| on a \verb|Hit| to see how many \verb|HSP| objects it has: %cont-doctest \begin{verbatim} >>> len(blast_hit) 2 >>> len(blat_hit) 17 \end{verbatim} You can use the slice notation on \verb|Hit| objects, whether to retrieve single \verb|HSP| or multiple \verb|HSP| objects. Like \verb|QueryResult|, if you slice for multiple \verb|HSP|, a new \verb|Hit| object will be returned containing only the sliced \verb|HSP| objects: %cont-doctest \begin{verbatim} >>> blat_hit[0] # retrieve single items HSP(hit_id='chr19', query_id='mystery_seq', 1 fragments) >>> sliced_hit = blat_hit[4:9] # retrieve multiple items >>> len(sliced_hit) 5 >>> print(sliced_hit) Query: mystery_seq Hit: chr19 (59128983) HSPs: ---- -------- --------- ------ --------------- --------------------- # E-value Bit score Span Query range Hit range ---- -------- --------- ------ --------------- --------------------- 0 ? ? ? [0:60] [54198476:54198536] 1 ? ? ? [0:61] [54265610:54265671] 2 ? ? ? [0:61] [54238143:54240175] 3 ? ? ? [0:60] [54189735:54189795] 4 ? ? ? [0:61] [54185425:54185486] \end{verbatim} You can also sort the \verb|HSP| inside a \verb|Hit|, using the exact same arguments like the sort method you saw in the \verb|QueryResult| object. Finally, there are also the \verb|filter| and \verb|map| methods you can use on \verb|Hit| objects. Unlike in the \verb|QueryResult| object, \verb|Hit| objects only have one variant of \verb|filter| (\verb|Hit.filter|) and one variant of \verb|map| (\verb|Hit.map|). Both of \verb|Hit.filter| and \verb|Hit.map| work on the \verb|HSP| objects a \verb|Hit| has. \subsection{HSP} \label{sec:searchio-hsp} \verb|HSP| (high-scoring pair) represents region(s) in the hit sequence that contains significant alignment(s) to the query sequence. It contains the actual match between your query sequence and a database entry. As this match is determined by the sequence search tool's algorithms, the \verb|HSP| object contains the bulk of the statistics computed by the search tool. This also makes the distinction between \verb|HSP| objects from different search tools more apparent compared to the differences you've seen in \verb|QueryResult| or \verb|Hit| objects. Let's see some examples from our BLAST and BLAT searches. We'll look at the BLAST HSP first: %doctest ../Doc/examples \begin{verbatim} >>> from Bio import SearchIO >>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml') >>> blast_hsp = blast_qresult[0][0] # first hit, first hsp >>> print(blast_hsp) Query: 42291 mystery_seq Hit: gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 520b (MIR520... Query range: [0:61] (1) Hit range: [0:61] (1) Quick stats: evalue 4.9e-23; bitscore 111.29 Fragments: 1 (61 columns) Query - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Hit - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG \end{verbatim} Just like \verb|QueryResult| and \verb|Hit|, invoking \verb|print| on an \verb|HSP| shows its general details: \begin{itemize} \item There are the query and hit IDs and descriptions. We need these to identify our \verb|HSP|. \item We've also got the matching range of the query and hit sequences. The slice notation we're using here is an indication that the range is displayed using Python's indexing style (zero-based, half open). The number inside the parenthesis denotes the strand. In this case, both sequences have the plus strand. \item Some quick statistics are available: the e-value and bitscore. \item There is information about the HSP fragments. Ignore this for now; it will be explained later on. \item And finally, we have the query and hit sequence alignment itself. \end{itemize} These details can be accessed on their own using the dot notation, just like in \verb|QueryResult| and \verb|Hit|: %cont-doctest \begin{verbatim} >>> blast_hsp.query_range (0, 61) \end{verbatim} %hack! since float display may be different across versions \begin{verbatim} >>> blast_hsp.evalue 4.91307e-23 \end{verbatim} They're not the only attributes available, though. \verb|HSP| objects come with a default set of properties that makes it easy to probe their various details. Here are some examples: %cont-doctest \begin{verbatim} >>> blast_hsp.hit_start # start coordinate of the hit sequence 0 >>> blast_hsp.query_span # how many residues in the query sequence 61 >>> blast_hsp.aln_span # how long the alignment is 61 \end{verbatim} Check out the \verb|HSP| \href{http://biopython.org/DIST/docs/api/Bio.SearchIO._model.hsp-module.html}{documentation} for a full list of these predefined properties. Furthermore, each sequence search tool usually computes its own statistics / details for its \verb|HSP| objects. For example, an XML BLAST search also outputs the number of gaps and identical residues. These attributes can be accessed like so: %cont-doctest \begin{verbatim} >>> blast_hsp.gap_num # number of gaps 0 >>> blast_hsp.ident_num # number of identical residues 61 \end{verbatim} These details are format-specific; they may not be present in other formats. To see which details are available for a given sequence search tool, you should check the format's documentation in \verb|Bio.SearchIO|. Alternatively, you may also use \verb|.__dict__.keys()| for a quick list of what's available: \begin{verbatim} >>> blast_hsp.__dict__.keys() ['bitscore', 'evalue', 'ident_num', 'gap_num', 'bitscore_raw', 'pos_num', '_items'] \end{verbatim} Finally, you may have noticed that the \verb|query| and \verb|hit| attributes of our HSP are not just regular strings: %cont-doctest \begin{verbatim} >>> blast_hsp.query SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='42291', name='aligned query sequence', description='mystery_seq', dbxrefs=[]) >>> blast_hsp.hit SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='gi|262205317|ref|NR_030195.1|', name='aligned hit sequence', description='Homo sapiens microRNA 520b (MIR520B), microRNA', dbxrefs=[]) \end{verbatim} They are \verb|SeqRecord| objects you saw earlier in Section~\ref{chapter:SeqRecord}! This means that you can do all sorts of interesting things you can do with \verb|SeqRecord| objects on \verb|HSP.query| and/or \verb|HSP.hit|. It should not surprise you now that the \verb|HSP| object has an \verb|alignment| property which is a \verb|MultipleSeqAlignment| object: %cont-doctest \begin{verbatim} >>> print(blast_hsp.aln) DNAAlphabet() alignment with 2 rows and 61 columns CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAG...GGG 42291 CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAG...GGG gi|262205317|ref|NR_030195.1| \end{verbatim} Having probed the BLAST HSP, let's now take a look at HSPs from our BLAT results for a different kind of HSP. As usual, we'll begin by invoking \verb|print| on it: %cont-doctest \begin{verbatim} >>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl') >>> blat_hsp = blat_qresult[0][0] # first hit, first hsp >>> print(blat_hsp) Query: mystery_seq Hit: chr19 Query range: [0:61] (1) Hit range: [54204480:54204541] (1) Quick stats: evalue ?; bitscore ? Fragments: 1 (? columns) \end{verbatim} Some of the outputs you may have already guessed. We have the query and hit IDs and descriptions and the sequence coordinates. Values for evalue and bitscore is `?' as BLAT HSPs do not have these attributes. But The biggest difference here is that you don't see any sequence alignments displayed. If you look closer, PSL formats themselves do not have any hit or query sequences, so \verb|Bio.SearchIO| won't create any sequence or alignment objects. What happens if you try to access \verb|HSP.query|, \verb|HSP.hit|, or \verb|HSP.aln|? You'll get the default values for these attributes, which is \verb|None|: %cont-doctest \begin{verbatim} >>> blat_hsp.hit is None True >>> blat_hsp.query is None True >>> blat_hsp.aln is None True \end{verbatim} This does not affect other attributes, though. For example, you can still access the length of the query or hit alignment. Despite not displaying any attributes, the PSL format still have this information so \verb|Bio.SearchIO| can extract them: %cont-doctest \begin{verbatim} >>> blat_hsp.query_span # length of query match 61 >>> blat_hsp.hit_span # length of hit match 61 \end{verbatim} Other format-specific attributes are still present as well: %cont-doctest \begin{verbatim} >>> blat_hsp.score # PSL score 61 >>> blat_hsp.mismatch_num # the mismatch column 0 \end{verbatim} So far so good? Things get more interesting when you look at another `variant' of HSP present in our BLAT results. You might recall that in BLAT searches, sometimes we get our results separated into `blocks'. These blocks are essentially alignment fragments that may have some intervening sequence between them. Let's take a look at a BLAT HSP that contains multiple blocks to see how \verb|Bio.SearchIO| deals with this: %cont-doctest \begin{verbatim} >>> blat_hsp2 = blat_qresult[0][1] # first hit, second hsp >>> print(blat_hsp2) Query: mystery_seq Hit: chr19 Query range: [0:61] (1) Hit range: [54233104:54264463] (1) Quick stats: evalue ?; bitscore ? Fragments: --- -------------- ---------------------- ---------------------- # Span Query range Hit range --- -------------- ---------------------- ---------------------- 0 ? [0:18] [54233104:54233122] 1 ? [18:61] [54264420:54264463] \end{verbatim} What's happening here? We still some essential details covered: the IDs and descriptions, the coordinates, and the quick statistics are similar to what you've seen before. But the fragments detail is all different. Instead of showing `Fragments: 1', we now have a table with two data rows. This is how \verb|Bio.SearchIO| deals with HSPs having multiple fragments. As mentioned before, an HSP alignment may be separated by intervening sequences into fragments. The intervening sequences are not part of the query-hit match, so they should not be considered part of query nor hit sequence. However, they do affect how we deal with sequence coordinates, so we can't ignore them. Take a look at the hit coordinate of the HSP above. In the \verb|Hit range:| field, we see that the coordinate is \verb|[54233104:54264463]|. But looking at the table rows, we see that not the entire region spanned by this coordinate matches our query. Specifically, the intervening region spans from \verb|54233122| to \verb|54264420|. Why then, is the query coordinates seem to be contiguous, you ask? This is perfectly fine. In this case it means that the query match is contiguous (no intervening regions), while the hit match is not. All these attributes are accessible from the HSP directly, by the way: %cont-doctest \begin{verbatim} >>> blat_hsp2.hit_range # hit start and end coordinates of the entire HSP (54233104, 54264463) >>> blat_hsp2.hit_range_all # hit start and end coordinates of each fragment [(54233104, 54233122), (54264420, 54264463)] >>> blat_hsp2.hit_span # hit span of the entire HSP 31359 >>> blat_hsp2.hit_span_all # hit span of each fragment [18, 43] >>> blat_hsp2.hit_inter_ranges # start and end coordinates of intervening regions in the hit sequence [(54233122, 54264420)] >>> blat_hsp2.hit_inter_spans # span of intervening regions in the hit sequence [31298] \end{verbatim} Most of these attributes are not readily available from the PSL file we have, but \verb|Bio.SearchIO| calculates them for you on the fly when you parse the PSL file. All it needs are the start and end coordinates of each fragment. What about the \verb|query|, \verb|hit|, and \verb|aln| attributes? If the HSP has multiple fragments, you won't be able to use these attributes as they only fetch single \verb|SeqRecord| or \verb|MultipleSeqAlignment| objects. However, you can use their \verb|*_all| counterparts: \verb|query_all|, \verb|hit_all|, and \verb|aln_all|. These properties will return a list containing \verb|SeqRecord| or \verb|MultipleSeqAlignment| objects from each of the HSP fragment. There are other attributes that behave similarly, i.e. they only work for HSPs with one fragment. Check out the \verb|HSP| \href{http://biopython.org/DIST/docs/api/Bio.SearchIO._model.hsp-module.html}{documentation} for a full list. Finally, to check whether you have multiple fragments or not, you can use the \verb|is_fragmented| property like so: %cont-doctest \begin{verbatim} >>> blat_hsp2.is_fragmented # BLAT HSP with 2 fragments True >>> blat_hsp.is_fragmented # BLAT HSP from earlier, with one fragment False \end{verbatim} Before we move on, you should also know that we can use the slice notation on \verb|HSP| objects, just like \verb|QueryResult| or \verb|Hit| objects. When you use this notation, you'll get an \verb|HSPFragment| object in return, the last component of the object model. \subsection{HSPFragment} \label{sec:searchio-hspfragment} \verb|HSPFragment| represents a single, contiguous match between the query and hit sequences. You could consider it the core of the object model and search result, since it is the presence of these fragments that determine whether your search have results or not. In most cases, you don't have to deal with \verb|HSPFragment| objects directly since not that many sequence search tools fragment their HSPs. When you do have to deal with them, what you should remember is that \verb|HSPFragment| objects were written with to be as compact as possible. In most cases, they only contain attributes directly related to sequences: strands, reading frames, alphabets, coordinates, the sequences themselves, and their IDs and descriptions. These attributes are readily shown when you invoke \verb|print| on an \verb|HSPFragment|. Here's an example, taken from our BLAST search: %doctest ../Doc/examples \begin{verbatim} >>> from Bio import SearchIO >>> blast_qresult = SearchIO.read('my_blast.xml', 'blast-xml') >>> blast_frag = blast_qresult[0][0][0] # first hit, first hsp, first fragment >>> print(blast_frag) Query: 42291 mystery_seq Hit: gi|262205317|ref|NR_030195.1| Homo sapiens microRNA 520b (MIR520... Query range: [0:61] (1) Hit range: [0:61] (1) Fragments: 1 (61 columns) Query - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Hit - CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTTTAGAGGG \end{verbatim} At this level, the BLAT fragment looks quite similar to the BLAST fragment, save for the query and hit sequences which are not present: %cont-doctest \begin{verbatim} >>> blat_qresult = SearchIO.read('my_blat.psl', 'blat-psl') >>> blat_frag = blat_qresult[0][0][0] # first hit, first hsp, first fragment >>> print(blat_frag) Query: mystery_seq Hit: chr19 Query range: [0:61] (1) Hit range: [54204480:54204541] (1) Fragments: 1 (? columns) \end{verbatim} In all cases, these attributes are accessible using our favorite dot notation. Some examples: %cont-doctest \begin{verbatim} >>> blast_frag.query_start # query start coordinate 0 >>> blast_frag.hit_strand # hit sequence strand 1 >>> blast_frag.hit # hit sequence, as a SeqRecord object SeqRecord(seq=Seq('CCCTCTACAGGGAAGCGCTTTCTGTTGTCTGAAAGAAAAGAAAGTGCTTCCTTT...GGG', DNAAlphabet()), id='gi|262205317|ref|NR_030195.1|', name='aligned hit sequence', description='Homo sapiens microRNA 520b (MIR520B), microRNA', dbxrefs=[]) \end{verbatim} \section{A note about standards and conventions} \label{sec:searchio-standards} Before we move on to the main functions, there is something you ought to know about the standards \verb|Bio.SearchIO| uses. If you've worked with multiple sequence search tools, you might have had to deal with the many different ways each program deals with things like sequence coordinates. It might not have been a pleasant experience as these search tools usually have their own standards. For example, one tools might use one-based coordinates, while the other uses zero-based coordinates. Or, one program might reverse the start and end coordinates if the strand is minus, while others don't. In short, these often creates unnecessary mess must be dealt with. We realize this problem ourselves and we intend to address it in \verb|Bio.SearchIO|. After all, one of the goals of \verb|Bio.SearchIO| is to create a common, easy to use interface to deal with various search output files. This means creating standards that extend beyond the object model you just saw. Now, you might complain, "Not another standard!". Well, eventually we have to choose one convention or the other, so this is necessary. Plus, we're not creating something entirely new here; just adopting a standard we think is best for a Python programmer (it is Biopython, after all). There are three implicit standards that you can expect when working with \verb|Bio.SearchIO|: \begin{itemize} \item The first one pertains to sequence coordinates. In \verb|Bio.SearchIO|, all sequence coordinates follows Python's coordinate style: zero-based and half open. For example, if in a BLAST XML output file the start and end coordinates of an HSP are 10 and 28, they would become 9 and 28 in \verb|Bio.SearchIO|. The start coordinate becomes 9 because Python indices start from zero, while the end coordinate remains 28 as Python slices omit the last item in an interval. \item The second is on sequence coordinate orders. In \verb|Bio.SearchIO|, start coordinates are always less than or equal to end coordinates. This isn't always the case with all sequence search tools, as some of them have larger start coordinates when the sequence strand is minus. \item The last one is on strand and reading frame values. For strands, there are only four valid choices: \verb|1| (plus strand), \verb|-1| (minus strand), \verb|0| (protein sequences), and \verb|None| (no strand). For reading frames, the valid choices are integers from \verb|-3| to \verb|3| and \verb|None|. \end{itemize} Note that these standards only exist in \verb|Bio.SearchIO| objects. If you write \verb|Bio.SearchIO| objects into an output format, \verb|Bio.SearchIO| will use the format's standard for the output. It does not force its standard over to your output file. \section{Reading search output files} \label{sec:searchio-input} There are two functions you can use for reading search output files into \verb|Bio.SearchIO| objects: \verb|read| and \verb|parse|. They're essentially similar to \verb|read| and \verb|parse| functions in other submodules like \verb|Bio.SeqIO| or \verb|Bio.AlignIO|. In both cases, you need to supply the search output file name and the file format name, both as Python strings. You can check the documentation for a list of format names \verb|Bio.SearchIO| recognizes. \verb|Bio.SearchIO.read| is used for reading search output files with only one query and returns a \verb|QueryResult| object. You've seen \verb|read| used in our previous examples. What you haven't seen is that \verb|read| may also accept additional keyword arguments, depending on the file format. Here are some examples. In the first one, we use \verb|read| just like previously to read a BLAST tabular output file. In the second one, we use a keyword argument to modify so it parses the BLAST tabular variant with comments in it: %doctest ../Tests/Blast \begin{verbatim} >>> from Bio import SearchIO >>> qresult = SearchIO.read('tab_2226_tblastn_003.txt', 'blast-tab') >>> qresult QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits) >>> qresult2 = SearchIO.read('tab_2226_tblastn_007.txt', 'blast-tab', comments=True) >>> qresult2 QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits) \end{verbatim} These keyword arguments differs among file formats. Check the format documentation to see if it has keyword arguments that modifies its parser's behavior. As for the \verb|Bio.SearchIO.parse|, it is used for reading search output files with any number of queries. The function returns a generator object that yields a \verb|QueryResult| object in each iteration. Like \verb|Bio.SearchIO.read|, it also accepts format-specific keyword arguments: %doctest ../Tests/Blast \begin{verbatim} >>> from Bio import SearchIO >>> qresults = SearchIO.parse('tab_2226_tblastn_001.txt', 'blast-tab') >>> for qresult in qresults: ... print(qresult.id) gi|16080617|ref|NP_391444.1| gi|11464971:4-101 >>> qresults2 = SearchIO.parse('tab_2226_tblastn_005.txt', 'blast-tab', comments=True) >>> for qresult in qresults2: ... print(qresult.id) random_s00 gi|16080617|ref|NP_391444.1| gi|11464971:4-101 \end{verbatim} \section{Dealing with large search output files with indexing} \label{sec:searchio-index} Sometimes, you're handed a search output file containing hundreds or thousands of queries that you need to parse. You can of course use \verb|Bio.SearchIO.parse| for this file, but that would be grossly inefficient if you need to access only a few of the queries. This is because \verb|parse| will parse all queries it sees before it fetches your query of interest. In this case, the ideal choice would be to index the file using \verb|Bio.SearchIO.index| or \verb|Bio.SearchIO.index_db|. If the names sound familiar, it's because you've seen them before in Section~\ref{sec:SeqIO-index}. These functions also behave similarly to their \verb|Bio.SeqIO| counterparts, with the addition of format-specific keyword arguments. Here are some examples. You can use \verb|index| with just the filename and format name: %doctest ../Tests/Blast \begin{verbatim} >>> from Bio import SearchIO >>> idx = SearchIO.index('tab_2226_tblastn_001.txt', 'blast-tab') >>> sorted(idx.keys()) ['gi|11464971:4-101', 'gi|16080617|ref|NP_391444.1|'] >>> idx['gi|16080617|ref|NP_391444.1|'] QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits) \end{verbatim} Or also with the format-specific keyword argument: %cont-doctest \begin{verbatim} >>> idx = SearchIO.index('tab_2226_tblastn_005.txt', 'blast-tab', comments=True) >>> sorted(idx.keys()) ['gi|11464971:4-101', 'gi|16080617|ref|NP_391444.1|', 'random_s00'] >>> idx['gi|16080617|ref|NP_391444.1|'] QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits) \end{verbatim} Or with the \verb|key_function| argument, as in \verb|Bio.SeqIO|: %cont-doctest \begin{verbatim} >>> key_function = lambda id: id.upper() # capitalizes the keys >>> idx = SearchIO.index('tab_2226_tblastn_001.txt', 'blast-tab', key_function=key_function) >>> sorted(idx.keys()) ['GI|11464971:4-101', 'GI|16080617|REF|NP_391444.1|'] >>> idx['GI|16080617|REF|NP_391444.1|'] QueryResult(id='gi|16080617|ref|NP_391444.1|', 3 hits) \end{verbatim} \verb|Bio.SearchIO.index_db| works like as \verb|index|, only it writes the query offsets into an SQLite database file. \section{Writing and converting search output files} \label{sec:searchio-write} It is occasionally useful to be able to manipulate search results from an output file and write it again to a new file. \verb|Bio.SearchIO| provides a \verb|write| function that lets you do exactly this. It takes as its arguments an iterable returning \verb|QueryResult| objects, the output filename to write to, the format name to write to, and optionally some format-specific keyword arguments. It returns a four-item tuple, which denotes the number or \verb|QueryResult|, \verb|Hit|, \verb|HSP|, and \verb|HSPFragment| objects that were written. \begin{verbatim} >>> from Bio import SearchIO >>> qresults = SearchIO.parse('mirna.xml', 'blast-xml') # read XML file >>> SearchIO.write(qresults, 'results.tab', 'blast-tab') # write to tabular file (3, 239, 277, 277) \end{verbatim} You should note different file formats require different attributes of the \verb|QueryResult|, \verb|Hit|, \verb|HSP| and \verb|HSPFragment| objects. If these attributes are not present, writing won't work. In other words, you can't always write to the output format that you want. For example, if you read a BLAST XML file, you wouldn't be able to write the results to a PSL file as PSL files require attributes not calculated by BLAST (e.g. the number of repeat matches). You can always set these attributes manually, if you really want to write to PSL, though. Like \verb|read|, \verb|parse|, \verb|index|, and \verb|index_db|, \verb|write| also accepts format-specific keyword arguments. Check out the documentation for a complete list of formats \verb|Bio.SearchIO| can write to and their arguments. Finally, \verb|Bio.SearchIO| also provides a \verb|convert| function, which is simply a shortcut for \verb|Bio.SearchIO.parse| and \verb|Bio.SearchIO.write|. Using the convert function, our example above would be: \begin{verbatim} >>> from Bio import SearchIO >>> SearchIO.convert('mirna.xml', 'blast-xml', 'results.tab', 'blast-tab') (3, 239, 277, 277) \end{verbatim} As \verb|convert| uses \verb|write|, it is only limited to format conversions that have all the required attributes. Here, the BLAST XML file provides all the default values a BLAST tabular file requires, so it works just fine. However, other format conversions are less likely to work since you need to manually assign the required attributes first. \chapter{Accessing NCBI's Entrez databases} \label{chapter:entrez} Entrez (\url{http://www.ncbi.nlm.nih.gov/Entrez}) is a data retrieval system that provides users access to NCBI's databases such as PubMed, GenBank, GEO, and many others. You can access Entrez from a web browser to manually enter queries, or you can use Biopython's \verb+Bio.Entrez+ module for programmatic access to Entrez. The latter allows you for example to search PubMed or download GenBank records from within a Python script. The \verb+Bio.Entrez+ module makes use of the Entrez Programming Utilities (also known as EUtils), consisting of eight tools that are described in detail on NCBI's page at \url{http://www.ncbi.nlm.nih.gov/entrez/utils/}. Each of these tools corresponds to one Python function in the \verb+Bio.Entrez+ module, as described in the sections below. This module makes sure that the correct URL is used for the queries, and that not more than one request is made every three seconds, as required by NCBI. The output returned by the Entrez Programming Utilities is typically in XML format. To parse such output, you have several options: \begin{enumerate} \item Use \verb+Bio.Entrez+'s parser to parse the XML output into a Python object; \item Use the DOM (Document Object Model) parser in Python's standard library; \item Use the SAX (Simple API for XML) parser in Python's standard library; \item Read the XML output as raw text, and parse it by string searching and manipulation. \end{enumerate} For the DOM and SAX parsers, see the Python documentation. The parser in \verb+Bio.Entrez+ is discussed below. NCBI uses DTD (Document Type Definition) files to describe the structure of the information contained in XML files. Most of the DTD files used by NCBI are included in the Biopython distribution. The \verb+Bio.Entrez+ parser makes use of the DTD files when parsing an XML file returned by NCBI Entrez. Occasionally, you may find that the DTD file associated with a specific XML file is missing in the Biopython distribution. In particular, this may happen when NCBI updates its DTD files. If this happens, \verb+Entrez.read+ will show a warning message with the name and URL of the missing DTD file. The parser will proceed to access the missing DTD file through the internet, allowing the parsing of the XML file to continue. However, the parser is much faster if the DTD file is available locally. For this purpose, please download the DTD file from the URL in the warning message and place it in the directory \verb+...site-packages/Bio/Entrez/DTDs+, containing the other DTD files. If you don't have write access to this directory, you can also place the DTD file in \verb+~/.biopython/Bio/Entrez/DTDs+, where \verb+~+ represents your home directory. Since this directory is read before the directory \verb+...site-packages/Bio/Entrez/DTDs+, you can also put newer versions of DTD files there if the ones in \verb+...site-packages/Bio/Entrez/DTDs+ become outdated. Alternatively, if you installed Biopython from source, you can add the DTD file to the source code's \verb+Bio/Entrez/DTDs+ directory, and reinstall Biopython. This will install the new DTD file in the correct location together with the other DTD files. The Entrez Programming Utilities can also generate output in other formats, such as the Fasta or GenBank file formats for sequence databases, or the MedLine format for the literature database, discussed in Section~\ref{sec:entrez-specialized-parsers}. \section{Entrez Guidelines} \label{sec:entrez-guidelines} Before using Biopython to access the NCBI's online resources (via \verb|Bio.Entrez| or some of the other modules), please read the \href{http://www.ncbi.nlm.nih.gov/books/NBK25497/#chapter2.Usage_Guidelines_and_Requiremen}{NCBI's Entrez User Requirements}. If the NCBI finds you are abusing their systems, they can and will ban your access! To paraphrase: \begin{itemize} \item For any series of more than 100 requests, do this at weekends or outside USA peak times. This is up to you to obey. \item Use the \url{http://eutils.ncbi.nlm.nih.gov} address, not the standard NCBI Web address. Biopython uses this web address. \item Make no more than three requests every seconds (relaxed from at most one request every three seconds in early 2009). This is automatically enforced by Biopython. \item Use the optional email parameter so the NCBI can contact you if there is a problem. You can either explicitly set this as a parameter with each call to Entrez (e.g. include {\tt email="A.N.Other@example.com"} in the argument list), or you can set a global email address: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" \end{verbatim} {\tt Bio.Entrez} will then use this email address with each call to Entrez. The {\tt example.com} address is a reserved domain name specifically for documentation (RFC 2606). Please DO NOT use a random email -- it's better not to give an email at all. The email parameter will be mandatory from June 1, 2010. In case of excessive usage, NCBI will attempt to contact a user at the e-mail address provided prior to blocking access to the E-utilities. \item If you are using Biopython within some larger software suite, use the tool parameter to specify this. You can either explicitly set the tool name as a parameter with each call to Entrez (e.g. include {\tt tool="MyLocalScript"} in the argument list), or you can set a global tool name: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.tool = "MyLocalScript" \end{verbatim} The tool parameter will default to Biopython. \item For large queries, the NCBI also recommend using their session history feature (the WebEnv session cookie string, see Section~\ref{sec:entrez-webenv}). This is only slightly more complicated. \end{itemize} In conclusion, be sensible with your usage levels. If you plan to download lots of data, consider other options. For example, if you want easy access to all the human genes, consider fetching each chromosome by FTP as a GenBank file, and importing these into your own BioSQL database (see Section~\ref{sec:BioSQL}). \section{EInfo: Obtaining information about the Entrez databases} \label{sec:entrez-einfo} EInfo provides field index term counts, last update, and available links for each of NCBI's databases. In addition, you can use EInfo to obtain a list of all database names accessible through the Entrez utilities: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.einfo() >>> result = handle.read() \end{verbatim} The variable \verb+result+ now contains a list of databases in XML format: \begin{verbatim} >>> print(result) pubmed protein nucleotide nuccore nucgss nucest structure genome books cancerchromosomes cdd gap domains gene genomeprj gensat geo gds homologene journals mesh ncbisearch nlmcatalog omia omim pmc popset probe proteinclusters pcassay pccompound pcsubstance snp taxonomy toolkit unigene unists \end{verbatim} Since this is a fairly simple XML file, we could extract the information it contains simply by string searching. Using \verb+Bio.Entrez+'s parser instead, we can directly parse this XML file into a Python object: \begin{verbatim} >>> from Bio import Entrez >>> handle = Entrez.einfo() >>> record = Entrez.read(handle) \end{verbatim} Now \verb+record+ is a dictionary with exactly one key: \begin{verbatim} >>> record.keys() [u'DbList'] \end{verbatim} The values stored in this key is the list of database names shown in the XML above: \begin{verbatim} >>> record["DbList"] ['pubmed', 'protein', 'nucleotide', 'nuccore', 'nucgss', 'nucest', 'structure', 'genome', 'books', 'cancerchromosomes', 'cdd', 'gap', 'domains', 'gene', 'genomeprj', 'gensat', 'geo', 'gds', 'homologene', 'journals', 'mesh', 'ncbisearch', 'nlmcatalog', 'omia', 'omim', 'pmc', 'popset', 'probe', 'proteinclusters', 'pcassay', 'pccompound', 'pcsubstance', 'snp', 'taxonomy', 'toolkit', 'unigene', 'unists'] \end{verbatim} For each of these databases, we can use EInfo again to obtain more information: \begin{verbatim} >>> handle = Entrez.einfo(db="pubmed") >>> record = Entrez.read(handle) >>> record["DbInfo"]["Description"] 'PubMed bibliographic record' >>> record["DbInfo"]["Count"] '17989604' >>> record["DbInfo"]["LastUpdate"] '2008/05/24 06:45' \end{verbatim} Try \verb+record["DbInfo"].keys()+ for other information stored in this record. One of the most useful is a list of possible search fields for use with ESearch: \begin{verbatim} >>> for field in record["DbInfo"]["FieldList"]: ... print("%(Name)s, %(FullName)s, %(Description)s" % field) ALL, All Fields, All terms from all searchable fields UID, UID, Unique number assigned to publication FILT, Filter, Limits the records TITL, Title, Words in title of publication WORD, Text Word, Free text associated with publication MESH, MeSH Terms, Medical Subject Headings assigned to publication MAJR, MeSH Major Topic, MeSH terms of major importance to publication AUTH, Author, Author(s) of publication JOUR, Journal, Journal abbreviation of publication AFFL, Affiliation, Author's institutional affiliation and address ... \end{verbatim} That's a long list, but indirectly this tells you that for the PubMed database, you can do things like \texttt{Jones[AUTH]} to search the author field, or \texttt{Sanger[AFFL]} to restrict to authors at the Sanger Centre. This can be very handy - especially if you are not so familiar with a particular database. \section{ESearch: Searching the Entrez databases} \label{sec:entrez-esearch} To search any of these databases, we use \verb+Bio.Entrez.esearch()+. For example, let's search in PubMed for publications related to Biopython: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.esearch(db="pubmed", term="biopython") >>> record = Entrez.read(handle) >>> record["IdList"] ['19304878', '18606172', '16403221', '16377612', '14871861', '14630660', '12230038'] \end{verbatim} In this output, you see seven PubMed IDs (including 19304878 which is the PMID for the Biopython application note), which can be retrieved by EFetch (see section \ref{sec:efetch}). You can also use ESearch to search GenBank. Here we'll do a quick search for the \emph{matK} gene in \emph{Cypripedioideae} orchids (see Section~\ref{sec:entrez-einfo} about EInfo for one way to find out which fields you can search in each Entrez database): \begin{verbatim} >>> handle = Entrez.esearch(db="nucleotide", term="Cypripedioideae[Orgn] AND matK[Gene]") >>> record = Entrez.read(handle) >>> record["Count"] '25' >>> record["IdList"] ['126789333', '37222967', '37222966', '37222965', ..., '61585492'] \end{verbatim} \noindent Each of the IDs (126789333, 37222967, 37222966, \ldots) is a GenBank identifier. See section~\ref{sec:efetch} for information on how to actually download these GenBank records. Note that instead of a species name like \texttt{Cypripedioideae[Orgn]}, you can restrict the search using an NCBI taxon identifier, here this would be \texttt{txid158330[Orgn]}. This isn't currently documented on the ESearch help page - the NCBI explained this in reply to an email query. You can often deduce the search term formatting by playing with the Entrez web interface. For example, including \texttt{complete[prop]} in a genome search restricts to just completed genomes. As a final example, let's get a list of computational journal titles: \begin{verbatim} >>> handle = Entrez.esearch(db="journals", term="computational") >>> record = Entrez.read(handle) >>> record["Count"] '16' >>> record["IdList"] ['30367', '33843', '33823', '32989', '33190', '33009', '31986', '34502', '8799', '22857', '32675', '20258', '33859', '32534', '32357', '32249'] \end{verbatim} Again, we could use EFetch to obtain more information for each of these journal IDs. ESearch has many useful options --- see the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/esearch\_help.html}{ESearch help page} for more information. \section{EPost: Uploading a list of identifiers} EPost uploads a list of UIs for use in subsequent search strategies; see the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/epost\_help.html}{EPost help page} for more information. It is available from Biopython through the \verb+Bio.Entrez.epost()+ function. To give an example of when this is useful, suppose you have a long list of IDs you want to download using EFetch (maybe sequences, maybe citations -- anything). When you make a request with EFetch your list of IDs, the database etc, are all turned into a long URL sent to the server. If your list of IDs is long, this URL gets long, and long URLs can break (e.g. some proxies don't cope well). Instead, you can break this up into two steps, first uploading the list of IDs using EPost (this uses an ``HTML post'' internally, rather than an ``HTML get'', getting round the long URL problem). With the history support, you can then refer to this long list of IDs, and download the associated data with EFetch. Let's look at a simple example to see how EPost works -- uploading some PubMed identifiers: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> id_list = ["19304878", "18606172", "16403221", "16377612", "14871861", "14630660"] >>> print(Entrez.epost("pubmed", id=",".join(id_list)).read()) 1 NCID_01_206841095_130.14.22.101_9001_1242061629 \end{verbatim} \noindent The returned XML includes two important strings, \verb|QueryKey| and \verb|WebEnv| which together define your history session. You would extract these values for use with another Entrez call such as EFetch: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> id_list = ["19304878", "18606172", "16403221", "16377612", "14871861", "14630660"] >>> search_results = Entrez.read(Entrez.epost("pubmed", id=",".join(id_list))) >>> webenv = search_results["WebEnv"] >>> query_key = search_results["QueryKey"] \end{verbatim} \noindent Section~\ref{sec:entrez-webenv} shows how to use the history feature. \section{ESummary: Retrieving summaries from primary IDs} ESummary retrieves document summaries from a list of primary IDs (see the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/esummary\_help.html}{ESummary help page} for more information). In Biopython, ESummary is available as \verb+Bio.Entrez.esummary()+. Using the search result above, we can for example find out more about the journal with ID 30367: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.esummary(db="journals", id="30367") >>> record = Entrez.read(handle) >>> record[0]["Id"] '30367' >>> record[0]["Title"] 'Computational biology and chemistry' >>> record[0]["Publisher"] 'Pergamon,' \end{verbatim} \section{EFetch: Downloading full records from Entrez} \label{sec:efetch} EFetch is what you use when you want to retrieve a full record from Entrez. This covers several possible databases, as described on the main \href{http://eutils.ncbi.nlm.nih.gov/entrez/query/static/efetch_help.html}{EFetch Help page}. For most of their databases, the NCBI support several different file formats. Requesting a specific file format from Entrez using \verb|Bio.Entrez.efetch()| requires specifying the \verb|rettype| and/or \verb|retmode| optional arguments. The different combinations are described for each database type on the pages linked to on \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/efetch_help.html}{NCBI efetch webpage} (e.g. \href{http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/efetchlit_help.html}{literature}, \href{http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/efetchseq_help.html}{sequences} and \href{http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/efetchtax_help.html}{taxonomy}). One common usage is downloading sequences in the FASTA or GenBank/GenPept plain text formats (which can then be parsed with \verb|Bio.SeqIO|, see Sections~\ref{sec:SeqIO_GenBank_Online} and~\ref{sec:efetch}). From the \emph{Cypripedioideae} example above, we can download GenBank record 186972394 using \verb+Bio.Entrez.efetch+: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="gb", retmode="text") >>> print(handle.read()) LOCUS EU490707 1302 bp DNA linear PLN 05-MAY-2008 DEFINITION Selenipedium aequinoctiale maturase K (matK) gene, partial cds; chloroplast. ACCESSION EU490707 VERSION EU490707.1 GI:186972394 KEYWORDS . SOURCE chloroplast Selenipedium aequinoctiale ORGANISM Selenipedium aequinoctiale Eukaryota; Viridiplantae; Streptophyta; Embryophyta; Tracheophyta; Spermatophyta; Magnoliophyta; Liliopsida; Asparagales; Orchidaceae; Cypripedioideae; Selenipedium. REFERENCE 1 (bases 1 to 1302) AUTHORS Neubig,K.M., Whitten,W.M., Carlsward,B.S., Blanco,M.A., Endara,C.L., Williams,N.H. and Moore,M.J. TITLE Phylogenetic utility of ycf1 in orchids JOURNAL Unpublished REFERENCE 2 (bases 1 to 1302) AUTHORS Neubig,K.M., Whitten,W.M., Carlsward,B.S., Blanco,M.A., Endara,C.L., Williams,N.H. and Moore,M.J. TITLE Direct Submission JOURNAL Submitted (14-FEB-2008) Department of Botany, University of Florida, 220 Bartram Hall, Gainesville, FL 32611-8526, USA FEATURES Location/Qualifiers source 1..1302 /organism="Selenipedium aequinoctiale" /organelle="plastid:chloroplast" /mol_type="genomic DNA" /specimen_voucher="FLAS:Blanco 2475" /db_xref="taxon:256374" gene <1..>1302 /gene="matK" CDS <1..>1302 /gene="matK" /codon_start=1 /transl_table=11 /product="maturase K" /protein_id="ACC99456.1" /db_xref="GI:186972395" /translation="IFYEPVEIFGYDNKSSLVLVKRLITRMYQQNFLISSVNDSNQKG FWGHKHFFSSHFSSQMVSEGFGVILEIPFSSQLVSSLEEKKIPKYQNLRSIHSIFPFL EDKFLHLNYVSDLLIPHPIHLEILVQILQCRIKDVPSLHLLRLLFHEYHNLNSLITSK KFIYAFSKRKKRFLWLLYNSYVYECEYLFQFLRKQSSYLRSTSSGVFLERTHLYVKIE HLLVVCCNSFQRILCFLKDPFMHYVRYQGKAILASKGTLILMKKWKFHLVNFWQSYFH FWSQPYRIHIKQLSNYSFSFLGYFSSVLENHLVVRNQMLENSFIINLLTKKFDTIAPV ISLIGSLSKAQFCTVLGHPISKPIWTDFSDSDILDRFCRICRNLCRYHSGSSKKQVLY RIKYILRLSCARTLARKHKSTVRTFMRRLGSGLLEEFFMEEE" ORIGIN 1 attttttacg aacctgtgga aatttttggt tatgacaata aatctagttt agtacttgtg 61 aaacgtttaa ttactcgaat gtatcaacag aattttttga tttcttcggt taatgattct 121 aaccaaaaag gattttgggg gcacaagcat tttttttctt ctcatttttc ttctcaaatg 181 gtatcagaag gttttggagt cattctggaa attccattct cgtcgcaatt agtatcttct 241 cttgaagaaa aaaaaatacc aaaatatcag aatttacgat ctattcattc aatatttccc 301 tttttagaag acaaattttt acatttgaat tatgtgtcag atctactaat accccatccc 361 atccatctgg aaatcttggt tcaaatcctt caatgccgga tcaaggatgt tccttctttg 421 catttattgc gattgctttt ccacgaatat cataatttga atagtctcat tacttcaaag 481 aaattcattt acgccttttc aaaaagaaag aaaagattcc tttggttact atataattct 541 tatgtatatg aatgcgaata tctattccag tttcttcgta aacagtcttc ttatttacga 601 tcaacatctt ctggagtctt tcttgagcga acacatttat atgtaaaaat agaacatctt 661 ctagtagtgt gttgtaattc ttttcagagg atcctatgct ttctcaagga tcctttcatg 721 cattatgttc gatatcaagg aaaagcaatt ctggcttcaa agggaactct tattctgatg 781 aagaaatgga aatttcatct tgtgaatttt tggcaatctt attttcactt ttggtctcaa 841 ccgtatagga ttcatataaa gcaattatcc aactattcct tctcttttct ggggtatttt 901 tcaagtgtac tagaaaatca tttggtagta agaaatcaaa tgctagagaa ttcatttata 961 ataaatcttc tgactaagaa attcgatacc atagccccag ttatttctct tattggatca 1021 ttgtcgaaag ctcaattttg tactgtattg ggtcatccta ttagtaaacc gatctggacc 1081 gatttctcgg attctgatat tcttgatcga ttttgccgga tatgtagaaa tctttgtcgt 1141 tatcacagcg gatcctcaaa aaaacaggtt ttgtatcgta taaaatatat acttcgactt 1201 tcgtgtgcta gaactttggc acggaaacat aaaagtacag tacgcacttt tatgcgaaga 1261 ttaggttcgg gattattaga agaattcttt atggaagaag aa // \end{verbatim} The arguments \verb+rettype="gb"+ and \verb+retmode="text"+ let us download this record in the GenBank format. Note that until Easter 2009, the Entrez EFetch API let you use ``genbank'' as the return type, however the NCBI now insist on using the official return types of ``gb'' or ``gbwithparts'' (or ``gp'' for proteins) as described on online. Also not that until Feb 2012, the Entrez EFetch API would default to returning plain text files, but now defaults to XML. Alternatively, you could for example use \verb+rettype="fasta"+ to get the Fasta-format; see the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/efetchseq\_help.html}{EFetch Sequences Help page} for other options. Remember -- the available formats depend on which database you are downloading from - see the main \href{http://eutils.ncbi.nlm.nih.gov/entrez/query/static/efetch\_help.html}{EFetch Help page}. If you fetch the record in one of the formats accepted by \verb+Bio.SeqIO+ (see Chapter~\ref{chapter:Bio.SeqIO}), you could directly parse it into a \verb+SeqRecord+: \begin{verbatim} >>> from Bio import Entrez, SeqIO >>> handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="gb", retmode="text") >>> record = SeqIO.read(handle, "genbank") >>> handle.close() >>> print(record) ID: EU490707.1 Name: EU490707 Description: Selenipedium aequinoctiale maturase K (matK) gene, partial cds; chloroplast. Number of features: 3 ... Seq('ATTTTTTACGAACCTGTGGAAATTTTTGGTTATGACAATAAATCTAGTTTAGTA...GAA', IUPACAmbiguousDNA()) \end{verbatim} Note that a more typical use would be to save the sequence data to a local file, and \emph{then} parse it with \verb|Bio.SeqIO|. This can save you having to re-download the same file repeatedly while working on your script, and places less load on the NCBI's servers. For example: \begin{verbatim} import os from Bio import SeqIO from Bio import Entrez Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are filename = "gi_186972394.gbk" if not os.path.isfile(filename): # Downloading... net_handle = Entrez.efetch(db="nucleotide",id="186972394",rettype="gb", retmode="text") out_handle = open(filename, "w") out_handle.write(net_handle.read()) out_handle.close() net_handle.close() print("Saved") print("Parsing...") record = SeqIO.read(filename, "genbank") print(record) \end{verbatim} To get the output in XML format, which you can parse using the \verb+Bio.Entrez.read()+ function, use \verb+retmode="xml"+: \begin{verbatim} >>> from Bio import Entrez >>> handle = Entrez.efetch(db="nucleotide", id="186972394", retmode="xml") >>> record = Entrez.read(handle) >>> handle.close() >>> record[0]["GBSeq_definition"] 'Selenipedium aequinoctiale maturase K (matK) gene, partial cds; chloroplast' >>> record[0]["GBSeq_source"] 'chloroplast Selenipedium aequinoctiale' \end{verbatim} So, that dealt with sequences. For examples of parsing file formats specific to the other databases (e.g. the \verb+MEDLINE+ format used in PubMed), see Section~\ref{sec:entrez-specialized-parsers}. If you want to perform a search with \verb|Bio.Entrez.esearch()|, and then download the records with \verb|Bio.Entrez.efetch()|, you should use the WebEnv history feature -- see Section~\ref{sec:entrez-webenv}. \section{ELink: Searching for related items in NCBI Entrez} \label{sec:elink} ELink, available from Biopython as \verb+Bio.Entrez.elink()+, can be used to find related items in the NCBI Entrez databases. For example, you can us this to find nucleotide entries for an entry in the gene database, and other cool stuff. Let's use ELink to find articles related to the Biopython application note published in \textit{Bioinformatics} in 2009. The PubMed ID of this article is 19304878: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" >>> pmid = "19304878" >>> record = Entrez.read(Entrez.elink(dbfrom="pubmed", id=pmid)) \end{verbatim} The \verb+record+ variable consists of a Python list, one for each database in which we searched. Since we specified only one PubMed ID to search for, \verb+record+ contains only one item. This item is a dictionary containing information about our search term, as well as all the related items that were found: \begin{verbatim} >>> record[0]["DbFrom"] 'pubmed' >>> record[0]["IdList"] ['19304878'] \end{verbatim} The \verb+"LinkSetDb"+ key contains the search results, stored as a list consisting of one item for each target database. In our search results, we only find hits in the PubMed database (although sub-divided into categories): \begin{verbatim} >>> len(record[0]["LinkSetDb"]) 5 >>> for linksetdb in record[0]["LinkSetDb"]: ... print(linksetdb["DbTo"], linksetdb["LinkName"], len(linksetdb["Link"])) ... pubmed pubmed_pubmed 110 pubmed pubmed_pubmed_combined 6 pubmed pubmed_pubmed_five 6 pubmed pubmed_pubmed_reviews 5 pubmed pubmed_pubmed_reviews_five 5 \end{verbatim} The actual search results are stored as under the \verb+"Link"+ key. In total, 110 items were found under standard search. Let's now at the first search result: \begin{verbatim} >>> record[0]["LinkSetDb"][0]["Link"][0] {u'Id': '19304878'} \end{verbatim} \noindent This is the article we searched for, which doesn't help us much, so let's look at the second search result: \begin{verbatim} >>> record[0]["LinkSetDb"][0]["Link"][1] {u'Id': '14630660'} \end{verbatim} \noindent This paper, with PubMed ID 14630660, is about the Biopython PDB parser. We can use a loop to print out all PubMed IDs: \begin{verbatim} >>> for link in record[0]["LinkSetDb"][0]["Link"]: ... print(link["Id"]) 19304878 14630660 18689808 17121776 16377612 12368254 ...... \end{verbatim} Now that was nice, but personally I am often more interested to find out if a paper has been cited. Well, ELink can do that too -- at least for journals in Pubmed Central (see Section~\ref{sec:elink-citations}). For help on ELink, see the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/elink\_help.html}{ELink help page}. There is an entire sub-page just for the \href{http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/entrezlinks.html}{link names}, describing how different databases can be cross referenced. \section{EGQuery: Global Query - counts for search terms} EGQuery provides counts for a search term in each of the Entrez databases (i.e. a global query). This is particularly useful to find out how many items your search terms would find in each database without actually performing lots of separate searches with ESearch (see the example in \ref{subsec:entrez_example_genbank} below). In this example, we use \verb+Bio.Entrez.egquery()+ to obtain the counts for ``Biopython'': \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.egquery(term="biopython") >>> record = Entrez.read(handle) >>> for row in record["eGQueryResult"]: ... print(row["DbName"], row["Count"]) ... pubmed 6 pmc 62 journals 0 ... \end{verbatim} See the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/egquery\_help.html}{EGQuery help page} for more information. \section{ESpell: Obtaining spelling suggestions} ESpell retrieves spelling suggestions. In this example, we use \verb+Bio.Entrez.espell()+ to obtain the correct spelling of Biopython: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.espell(term="biopythooon") >>> record = Entrez.read(handle) >>> record["Query"] 'biopythooon' >>> record["CorrectedQuery"] 'biopython' \end{verbatim} See the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/espell\_help.html}{ESpell help page} for more information. The main use of this is for GUI tools to provide automatic suggestions for search terms. \section{Parsing huge Entrez XML files} The \verb+Entrez.read+ function reads the entire XML file returned by Entrez into a single Python object, which is kept in memory. To parse Entrez XML files too large to fit in memory, you can use the function \verb+Entrez.parse+. This is a generator function that reads records in the XML file one by one. This function is only useful if the XML file reflects a Python list object (in other words, if \verb+Entrez.read+ on a computer with infinite memory resources would return a Python list). For example, you can download the entire Entrez Gene database for a given organism as a file from NCBI's ftp site. These files can be very large. As an example, on September 4, 2009, the file \verb+Homo_sapiens.ags.gz+, containing the Entrez Gene database for human, had a size of 116576 kB. This file, which is in the \verb+ASN+ format, can be converted into an XML file using NCBI's \verb+gene2xml+ program (see NCBI's ftp site for more information): \begin{verbatim} gene2xml -b T -i Homo_sapiens.ags -o Homo_sapiens.xml \end{verbatim} The resulting XML file has a size of 6.1 GB. Attempting \verb+Entrez.read+ on this file will result in a \verb+MemoryError+ on many computers. The XML file \verb+Homo_sapiens.xml+ consists of a list of Entrez gene records, each corresponding to one Entrez gene in human. \verb+Entrez.parse+ retrieves these gene records one by one. You can then print out or store the relevant information in each record by iterating over the records. For example, this script iterates over the Entrez gene records and prints out the gene numbers and names for all current genes: \begin{verbatim} >>> from Bio import Entrez >>> handle = open("Homo_sapiens.xml") >>> records = Entrez.parse(handle) >>> for record in records: ... status = record['Entrezgene_track-info']['Gene-track']['Gene-track_status'] ... if status.attributes['value']=='discontinued': ... continue ... geneid = record['Entrezgene_track-info']['Gene-track']['Gene-track_geneid'] ... genename = record['Entrezgene_gene']['Gene-ref']['Gene-ref_locus'] ... print(geneid, genename) \end{verbatim} This will print: \begin{verbatim} 1 A1BG 2 A2M 3 A2MP 8 AA 9 NAT1 10 NAT2 11 AACP 12 SERPINA3 13 AADAC 14 AAMP 15 AANAT 16 AARS 17 AAVS1 ... \end{verbatim} \section{Handling errors} Three things can go wrong when parsing an XML file: \begin{itemize} \item The file may not be an XML file to begin with; \item The file may end prematurely or otherwise be corrupted; \item The file may be correct XML, but contain items that are not represented in the associated DTD. \end{itemize} The first case occurs if, for example, you try to parse a Fasta file as if it were an XML file: \begin{verbatim} >>> from Bio import Entrez >>> handle = open("NC_005816.fna") # a Fasta file >>> record = Entrez.read(handle) Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read record = handler.read(handle) File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 164, in read raise NotXMLError(e) Bio.Entrez.Parser.NotXMLError: Failed to parse the XML data (syntax error: line 1, column 0). Please make sure that the input data are in XML format. \end{verbatim} Here, the parser didn't find the \verb| pubmed protein nucleotide nuccore nucgss nucest structure genome books cancerchromosomes cdd \end{verbatim} which will generate the following traceback: \begin{verbatim} >>> Entrez.read(handle) Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read record = handler.read(handle) File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 160, in read raise CorruptedXMLError(e) Bio.Entrez.Parser.CorruptedXMLError: Failed to parse the XML data (no element found: line 16, column 0). Please make sure that the input data are not corrupted. >>> \end{verbatim} Note that the error message tells you at what point in the XML file the error was detected. The third type of error occurs if the XML file contains tags that do not have a description in the corresponding DTD file. This is an example of such an XML file: \begin{verbatim} pubmed PubMed PubMed bibliographic record 20161961 2010/09/10 04:52 ... PubDate 4 string EPubDate ... \end{verbatim} In this file, for some reason the tag \verb|| (and several others) are not listed in the DTD file \verb|eInfo_020511.dtd|, which is specified on the second line as the DTD for this XML file. By default, the parser will stop and raise a ValidationError if it cannot find some tag in the DTD: \begin{verbatim} >>> from Bio import Entrez >>> handle = open("einfo3.xml") >>> record = Entrez.read(handle) Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/__init__.py", line 257, in read record = handler.read(handle) File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 154, in read self.parser.ParseFile(handle) File "/usr/local/lib/python2.7/site-packages/Bio/Entrez/Parser.py", line 246, in startElementHandler raise ValidationError(name) Bio.Entrez.Parser.ValidationError: Failed to find tag 'DocsumList' in the DTD. To skip all tags that are not represented in the DTD, please call Bio.Entrez.read or Bio.Entrez.parse with validate=False. \end{verbatim} Optionally, you can instruct the parser to skip such tags instead of raising a ValidationError. This is done by calling \verb|Entrez.read| or \verb|Entrez.parse| with the argument \verb|validate| equal to False: \begin{verbatim} >>> from Bio import Entrez >>> handle = open("einfo3.xml") >>> record = Entrez.read(handle, validate=False) >>> \end{verbatim} Of course, the information contained in the XML tags that are not in the DTD are not present in the record returned by \verb|Entrez.read|. \section{Specialized parsers} \label{sec:entrez-specialized-parsers} The \verb|Bio.Entrez.read()| function can parse most (if not all) XML output returned by Entrez. Entrez typically allows you to retrieve records in other formats, which may have some advantages compared to the XML format in terms of readability (or download size). To request a specific file format from Entrez using \verb|Bio.Entrez.efetch()| requires specifying the \verb|rettype| and/or \verb|retmode| optional arguments. The different combinations are described for each database type on the \href{http://www.ncbi.nlm.nih.gov/entrez/query/static/efetch_help.html}{NCBI efetch webpage}. One obvious case is you may prefer to download sequences in the FASTA or GenBank/GenPept plain text formats (which can then be parsed with \verb|Bio.SeqIO|, see Sections~\ref{sec:SeqIO_GenBank_Online} and~\ref{sec:efetch}). For the literature databases, Biopython contains a parser for the \verb+MEDLINE+ format used in PubMed. \subsection{Parsing Medline records} \label{subsec:entrez-and-medline} You can find the Medline parser in \verb+Bio.Medline+. Suppose we want to parse the file \verb+pubmed_result1.txt+, containing one Medline record. You can find this file in Biopython's \verb+Tests\Medline+ directory. The file looks like this: \begin{verbatim} PMID- 12230038 OWN - NLM STAT- MEDLINE DA - 20020916 DCOM- 20030606 LR - 20041117 PUBM- Print IS - 1467-5463 (Print) VI - 3 IP - 3 DP - 2002 Sep TI - The Bio* toolkits--a brief overview. PG - 296-302 AB - Bioinformatics research is often difficult to do with commercial software. The Open Source BioPerl, BioPython and Biojava projects provide toolkits with ... \end{verbatim} We first open the file and then parse it: %doctest ../Tests/Medline \begin{verbatim} >>> from Bio import Medline >>> input = open("pubmed_result1.txt") >>> record = Medline.read(input) \end{verbatim} The \verb+record+ now contains the Medline record as a Python dictionary: %cont-doctest \begin{verbatim} >>> record["PMID"] '12230038' \end{verbatim} %TODO - doctest wrapping? \begin{verbatim} >>> record["AB"] 'Bioinformatics research is often difficult to do with commercial software. The Open Source BioPerl, BioPython and Biojava projects provide toolkits with multiple functionality that make it easier to create customised pipelines or analysis. This review briefly compares the quirks of the underlying languages and the functionality, documentation, utility and relative advantages of the Bio counterparts, particularly from the point of view of the beginning biologist programmer.' \end{verbatim} The key names used in a Medline record can be rather obscure; use \begin{verbatim} >>> help(record) \end{verbatim} for a brief summary. To parse a file containing multiple Medline records, you can use the \verb+parse+ function instead: %doctest ../Tests/Medline \begin{verbatim} >>> from Bio import Medline >>> input = open("pubmed_result2.txt") >>> records = Medline.parse(input) >>> for record in records: ... print(record["TI"]) A high level interface to SCOP and ASTRAL implemented in python. GenomeDiagram: a python package for the visualization of large-scale genomic data. Open source clustering software. PDB file parser and structure class implemented in Python. \end{verbatim} Instead of parsing Medline records stored in files, you can also parse Medline records downloaded by \verb+Bio.Entrez.efetch+. For example, let's look at all Medline records in PubMed related to Biopython: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.esearch(db="pubmed", term="biopython") >>> record = Entrez.read(handle) >>> record["IdList"] ['19304878', '18606172', '16403221', '16377612', '14871861', '14630660', '12230038'] \end{verbatim} We now use \verb+Bio.Entrez.efetch+ to download these Medline records: \begin{verbatim} >>> idlist = record["IdList"] >>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="text") \end{verbatim} Here, we specify \verb+rettype="medline", retmode="text"+ to obtain the Medline records in plain-text Medline format. Now we use \verb+Bio.Medline+ to parse these records: \begin{verbatim} >>> from Bio import Medline >>> records = Medline.parse(handle) >>> for record in records: ... print(record["AU"]) ['Cock PJ', 'Antao T', 'Chang JT', 'Chapman BA', 'Cox CJ', 'Dalke A', ..., 'de Hoon MJ'] ['Munteanu CR', 'Gonzalez-Diaz H', 'Magalhaes AL'] ['Casbon JA', 'Crooks GE', 'Saqi MA'] ['Pritchard L', 'White JA', 'Birch PR', 'Toth IK'] ['de Hoon MJ', 'Imoto S', 'Nolan J', 'Miyano S'] ['Hamelryck T', 'Manderick B'] ['Mangalam H'] \end{verbatim} For comparison, here we show an example using the XML format: \begin{verbatim} >>> idlist = record["IdList"] >>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="xml") >>> records = Entrez.read(handle) >>> for record in records: ... print(record["MedlineCitation"]["Article"]["ArticleTitle"]) Biopython: freely available Python tools for computational molecular biology and bioinformatics. Enzymes/non-enzymes classification model complexity based on composition, sequence, 3D and topological indices. A high level interface to SCOP and ASTRAL implemented in python. GenomeDiagram: a python package for the visualization of large-scale genomic data. Open source clustering software. PDB file parser and structure class implemented in Python. The Bio* toolkits--a brief overview. \end{verbatim} Note that in both of these examples, for simplicity we have naively combined ESearch and EFetch. In this situation, the NCBI would expect you to use their history feature, as illustrated in Section~\ref{sec:entrez-webenv}. \subsection{Parsing GEO records} GEO (\href{http://www.ncbi.nlm.nih.gov/geo/}{Gene Expression Omnibus}) is a data repository of high-throughput gene expression and hybridization array data. The \verb|Bio.Geo| module can be used to parse GEO-formatted data. The following code fragment shows how to parse the example GEO file \verb|GSE16.txt| into a record and print the record: \begin{verbatim} >>> from Bio import Geo >>> handle = open("GSE16.txt") >>> records = Geo.parse(handle) >>> for record in records: ... print(record) \end{verbatim} You can search the ``gds'' database (GEO datasets) with ESearch: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.esearch(db="gds", term="GSE16") >>> record = Entrez.read(handle) >>> record["Count"] 2 >>> record["IdList"] ['200000016', '100000028'] \end{verbatim} From the Entrez website, UID ``200000016'' is GDS16 while the other hit ``100000028'' is for the associated platform, GPL28. Unfortunately, at the time of writing the NCBI don't seem to support downloading GEO files using Entrez (not as XML, nor in the \textit{Simple Omnibus Format in Text} (SOFT) format). However, it is actually pretty straight forward to download the GEO files by FTP from \url{ftp://ftp.ncbi.nih.gov/pub/geo/} instead. In this case you might want \url{ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SOFT/by_series/GSE16/GSE16_family.soft.gz} (a compressed file, see the Python module gzip). \subsection{Parsing UniGene records} UniGene is an NCBI database of the transcriptome, with each UniGene record showing the set of transcripts that are associated with a particular gene in a specific organism. A typical UniGene record looks like this: \begin{verbatim} ID Hs.2 TITLE N-acetyltransferase 2 (arylamine N-acetyltransferase) GENE NAT2 CYTOBAND 8p22 GENE_ID 10 LOCUSLINK 10 HOMOL YES EXPRESS bone| connective tissue| intestine| liver| liver tumor| normal| soft tissue/muscle tissue tumor| adult RESTR_EXPR adult CHROMOSOME 8 STS ACC=PMC310725P3 UNISTS=272646 STS ACC=WIAF-2120 UNISTS=44576 STS ACC=G59899 UNISTS=137181 ... STS ACC=GDB:187676 UNISTS=155563 PROTSIM ORG=10090; PROTGI=6754794; PROTID=NP_035004.1; PCT=76.55; ALN=288 PROTSIM ORG=9796; PROTGI=149742490; PROTID=XP_001487907.1; PCT=79.66; ALN=288 PROTSIM ORG=9986; PROTGI=126722851; PROTID=NP_001075655.1; PCT=76.90; ALN=288 ... PROTSIM ORG=9598; PROTGI=114619004; PROTID=XP_519631.2; PCT=98.28; ALN=288 SCOUNT 38 SEQUENCE ACC=BC067218.1; NID=g45501306; PID=g45501307; SEQTYPE=mRNA SEQUENCE ACC=NM_000015.2; NID=g116295259; PID=g116295260; SEQTYPE=mRNA SEQUENCE ACC=D90042.1; NID=g219415; PID=g219416; SEQTYPE=mRNA SEQUENCE ACC=D90040.1; NID=g219411; PID=g219412; SEQTYPE=mRNA SEQUENCE ACC=BC015878.1; NID=g16198419; PID=g16198420; SEQTYPE=mRNA SEQUENCE ACC=CR407631.1; NID=g47115198; PID=g47115199; SEQTYPE=mRNA SEQUENCE ACC=BG569293.1; NID=g13576946; CLONE=IMAGE:4722596; END=5'; LID=6989; SEQTYPE=EST; TRACE=44157214 ... SEQUENCE ACC=AU099534.1; NID=g13550663; CLONE=HSI08034; END=5'; LID=8800; SEQTYPE=EST // \end{verbatim} This particular record shows the set of transcripts (shown in the \verb+SEQUENCE+ lines) that originate from the human gene NAT2, encoding en N-acetyltransferase. The \verb+PROTSIM+ lines show proteins with significant similarity to NAT2, whereas the \verb+STS+ lines show the corresponding sequence-tagged sites in the genome. To parse UniGene files, use the \verb+Bio.UniGene+ module: \begin{verbatim} >>> from Bio import UniGene >>> input = open("myunigenefile.data") >>> record = UniGene.read(input) \end{verbatim} The \verb+record+ returned by \verb+UniGene.read+ is a Python object with attributes corresponding to the fields in the UniGene record. For example, \begin{verbatim} >>> record.ID "Hs.2" >>> record.title "N-acetyltransferase 2 (arylamine N-acetyltransferase)" \end{verbatim} The \verb+EXPRESS+ and \verb+RESTR_EXPR+ lines are stored as Python lists of strings: \begin{verbatim} ['bone', 'connective tissue', 'intestine', 'liver', 'liver tumor', 'normal', 'soft tissue/muscle tissue tumor', 'adult'] \end{verbatim} Specialized objects are returned for the \verb+STS+, \verb+PROTSIM+, and \verb+SEQUENCE+ lines, storing the keys shown in each line as attributes: \begin{verbatim} >>> record.sts[0].acc 'PMC310725P3' >>> record.sts[0].unists '272646' \end{verbatim} and similarly for the \verb+PROTSIM+ and \verb+SEQUENCE+ lines. To parse a file containing more than one UniGene record, use the \verb+parse+ function in \verb+Bio.UniGene+: \begin{verbatim} >>> from Bio import UniGene >>> input = open("unigenerecords.data") >>> records = UniGene.parse(input) >>> for record in records: ... print(record.ID) \end{verbatim} \section{Using a proxy} Normally you won't have to worry about using a proxy, but if this is an issue on your network here is how to deal with it. Internally, \verb|Bio.Entrez| uses the standard Python library \verb|urllib| for accessing the NCBI servers. This will check an environment variable called \verb|http_proxy| to configure any simple proxy automatically. Unfortunately this module does not support the use of proxies which require authentication. You may choose to set the \verb|http_proxy| environment variable once (how you do this will depend on your operating system). Alternatively you can set this within Python at the start of your script, for example: \begin{verbatim} import os os.environ["http_proxy"] = "http://proxyhost.example.com:8080" \end{verbatim} \noindent See the \href{http://www.python.org/doc/lib/module-urllib.html} {urllib documentation} for more details. \section{Examples} \label{sec:entrez_examples} \subsection{PubMed and Medline} \label{subsec:pub_med} If you are in the medical field or interested in human issues (and many times even if you are not!), PubMed (\url{http://www.ncbi.nlm.nih.gov/PubMed/}) is an excellent source of all kinds of goodies. So like other things, we'd like to be able to grab information from it and use it in Python scripts. In this example, we will query PubMed for all articles having to do with orchids (see section~\ref{sec:orchids} for our motivation). We first check how many of such articles there are: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.egquery(term="orchid") >>> record = Entrez.read(handle) >>> for row in record["eGQueryResult"]: ... if row["DbName"]=="pubmed": ... print(row["Count"]) 463 \end{verbatim} Now we use the \verb+Bio.Entrez.efetch+ function to download the PubMed IDs of these 463 articles: \begin{verbatim} >>> handle = Entrez.esearch(db="pubmed", term="orchid", retmax=463) >>> record = Entrez.read(handle) >>> idlist = record["IdList"] >>> print(idlist) \end{verbatim} This returns a Python list containing all of the PubMed IDs of articles related to orchids: \begin{verbatim} ['18680603', '18665331', '18661158', '18627489', '18627452', '18612381', '18594007', '18591784', '18589523', '18579475', '18575811', '18575690', ... \end{verbatim} Now that we've got them, we obviously want to get the corresponding Medline records and extract the information from them. Here, we'll download the Medline records in the Medline flat-file format, and use the \verb+Bio.Medline+ module to parse them: \begin{verbatim} >>> from Bio import Medline >>> handle = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="text") >>> records = Medline.parse(handle) \end{verbatim} NOTE - We've just done a separate search and fetch here, the NCBI much prefer you to take advantage of their history support in this situation. See Section~\ref{sec:entrez-webenv}. Keep in mind that \verb+records+ is an iterator, so you can iterate through the records only once. If you want to save the records, you can convert them to a list: \begin{verbatim} >>> records = list(records) \end{verbatim} Let's now iterate over the records to print out some information about each record: %TODO - Replace the print blank line with print()? \begin{verbatim} >>> for record in records: ... print("title:", record.get("TI", "?")) ... print("authors:", record.get("AU", "?")) ... print("source:", record.get("SO", "?")) ... print("") \end{verbatim} The output for this looks like: \begin{verbatim} title: Sex pheromone mimicry in the early spider orchid (ophrys sphegodes): patterns of hydrocarbons as the key mechanism for pollination by sexual deception [In Process Citation] authors: ['Schiestl FP', 'Ayasse M', 'Paulus HF', 'Lofstedt C', 'Hansson BS', 'Ibarra F', 'Francke W'] source: J Comp Physiol [A] 2000 Jun;186(6):567-74 \end{verbatim} Especially interesting to note is the list of authors, which is returned as a standard Python list. This makes it easy to manipulate and search using standard Python tools. For instance, we could loop through a whole bunch of entries searching for a particular author with code like the following: \begin{verbatim} >>> search_author = "Waits T" >>> for record in records: ... if not "AU" in record: ... continue ... if search_author in record["AU"]: ... print("Author %s found: %s" % (search_author, record["SO"])) \end{verbatim} Hopefully this section gave you an idea of the power and flexibility of the Entrez and Medline interfaces and how they can be used together. \subsection{Searching, downloading, and parsing Entrez Nucleotide records} \label{subsec:entrez_example_genbank} Here we'll show a simple example of performing a remote Entrez query. In section~\ref{sec:orchids} of the parsing examples, we talked about using NCBI's Entrez website to search the NCBI nucleotide databases for info on Cypripedioideae, our friends the lady slipper orchids. Now, we'll look at how to automate that process using a Python script. In this example, we'll just show how to connect, get the results, and parse them, with the Entrez module doing all of the work. First, we use EGQuery to find out the number of results we will get before actually downloading them. EGQuery will tell us how many search results were found in each of the databases, but for this example we are only interested in nucleotides: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.egquery(term="Cypripedioideae") >>> record = Entrez.read(handle) >>> for row in record["eGQueryResult"]: ... if row["DbName"]=="nuccore": ... print(row["Count"]) 814 \end{verbatim} So, we expect to find 814 Entrez Nucleotide records (this is the number I obtained in 2008; it is likely to increase in the future). If you find some ridiculously high number of hits, you may want to reconsider if you really want to download all of them, which is our next step: \begin{verbatim} >>> from Bio import Entrez >>> handle = Entrez.esearch(db="nucleotide", term="Cypripedioideae", retmax=814) >>> record = Entrez.read(handle) \end{verbatim} Here, \verb+record+ is a Python dictionary containing the search results and some auxiliary information. Just for information, let's look at what is stored in this dictionary: \begin{verbatim} >>> print(record.keys()) [u'Count', u'RetMax', u'IdList', u'TranslationSet', u'RetStart', u'QueryTranslation'] \end{verbatim} First, let's check how many results were found: \begin{verbatim} >>> print(record["Count"]) '814' \end{verbatim} which is the number we expected. The 814 results are stored in \verb+record['IdList']+: \begin{verbatim} >>> len(record["IdList"]) 814 \end{verbatim} Let's look at the first five results: \begin{verbatim} >>> record["IdList"][:5] ['187237168', '187372713', '187372690', '187372688', '187372686'] \end{verbatim} \label{sec:entrez-batched-efetch} We can download these records using \verb+efetch+. While you could download these records one by one, to reduce the load on NCBI's servers, it is better to fetch a bunch of records at the same time, shown below. However, in this situation you should ideally be using the history feature described later in Section~\ref{sec:entrez-webenv}. \begin{verbatim} >>> idlist = ",".join(record["IdList"][:5]) >>> print(idlist) 187237168,187372713,187372690,187372688,187372686 >>> handle = Entrez.efetch(db="nucleotide", id=idlist, retmode="xml") >>> records = Entrez.read(handle) >>> len(records) 5 \end{verbatim} Each of these records corresponds to one GenBank record. \begin{verbatim} >>> print(records[0].keys()) [u'GBSeq_moltype', u'GBSeq_source', u'GBSeq_sequence', u'GBSeq_primary-accession', u'GBSeq_definition', u'GBSeq_accession-version', u'GBSeq_topology', u'GBSeq_length', u'GBSeq_feature-table', u'GBSeq_create-date', u'GBSeq_other-seqids', u'GBSeq_division', u'GBSeq_taxonomy', u'GBSeq_references', u'GBSeq_update-date', u'GBSeq_organism', u'GBSeq_locus', u'GBSeq_strandedness'] >>> print(records[0]["GBSeq_primary-accession"]) DQ110336 >>> print(records[0]["GBSeq_other-seqids"]) ['gb|DQ110336.1|', 'gi|187237168'] >>> print(records[0]["GBSeq_definition"]) Cypripedium calceolus voucher Davis 03-03 A maturase (matR) gene, partial cds; mitochondrial >>> print(records[0]["GBSeq_organism"]) Cypripedium calceolus \end{verbatim} You could use this to quickly set up searches -- but for heavy usage, see Section~\ref{sec:entrez-webenv}. \subsection{Searching, downloading, and parsing GenBank records} \label{sec:entrez-search-fetch-genbank} The GenBank record format is a very popular method of holding information about sequences, sequence features, and other associated sequence information. The format is a good way to get information from the NCBI databases at \url{http://www.ncbi.nlm.nih.gov/}. In this example we'll show how to query the NCBI databases,to retrieve the records from the query, and then parse them using \verb+Bio.SeqIO+ - something touched on in Section~\ref{sec:SeqIO_GenBank_Online}. For simplicity, this example \emph{does not} take advantage of the WebEnv history feature -- see Section~\ref{sec:entrez-webenv} for this. First, we want to make a query and find out the ids of the records to retrieve. Here we'll do a quick search for one of our favorite organisms, \emph{Opuntia} (prickly-pear cacti). We can do quick search and get back the GIs (GenBank identifiers) for all of the corresponding records. First we check how many records there are: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.egquery(term="Opuntia AND rpl16") >>> record = Entrez.read(handle) >>> for row in record["eGQueryResult"]: ... if row["DbName"]=="nuccore": ... print(row["Count"]) ... 9 \end{verbatim} Now we download the list of GenBank identifiers: \begin{verbatim} >>> handle = Entrez.esearch(db="nuccore", term="Opuntia AND rpl16") >>> record = Entrez.read(handle) >>> gi_list = record["IdList"] >>> gi_list ['57240072', '57240071', '6273287', '6273291', '6273290', '6273289', '6273286', '6273285', '6273284'] \end{verbatim} Now we use these GIs to download the GenBank records - note that with older versions of Biopython you had to supply a comma separated list of GI numbers to Entrez, as of Biopython 1.59 you can pass a list and this is converted for you: \begin{verbatim} >>> gi_str = ",".join(gi_list) >>> handle = Entrez.efetch(db="nuccore", id=gi_str, rettype="gb", retmode="text") \end{verbatim} If you want to look at the raw GenBank files, you can read from this handle and print out the result: \begin{verbatim} >>> text = handle.read() >>> print(text) LOCUS AY851612 892 bp DNA linear PLN 10-APR-2007 DEFINITION Opuntia subulata rpl16 gene, intron; chloroplast. ACCESSION AY851612 VERSION AY851612.1 GI:57240072 KEYWORDS . SOURCE chloroplast Austrocylindropuntia subulata ORGANISM Austrocylindropuntia subulata Eukaryota; Viridiplantae; Streptophyta; Embryophyta; Tracheophyta; Spermatophyta; Magnoliophyta; eudicotyledons; core eudicotyledons; Caryophyllales; Cactaceae; Opuntioideae; Austrocylindropuntia. REFERENCE 1 (bases 1 to 892) AUTHORS Butterworth,C.A. and Wallace,R.S. ... \end{verbatim} In this case, we are just getting the raw records. To get the records in a more Python-friendly form, we can use \verb+Bio.SeqIO+ to parse the GenBank data into \verb|SeqRecord| objects, including \verb|SeqFeature| objects (see Chapter~\ref{chapter:Bio.SeqIO}): \begin{verbatim} >>> from Bio import SeqIO >>> handle = Entrez.efetch(db="nuccore", id=gi_str, rettype="gb", retmode="text") >>> records = SeqIO.parse(handle, "gb") \end{verbatim} \noindent We can now step through the records and look at the information we are interested in: \begin{verbatim} >>> for record in records: >>> ... print("%s, length %i, with %i features" \ >>> ... % (record.name, len(record), len(record.features))) AY851612, length 892, with 3 features AY851611, length 881, with 3 features AF191661, length 895, with 3 features AF191665, length 902, with 3 features AF191664, length 899, with 3 features AF191663, length 899, with 3 features AF191660, length 893, with 3 features AF191659, length 894, with 3 features AF191658, length 896, with 3 features \end{verbatim} Using these automated query retrieval functionality is a big plus over doing things by hand. Although the module should obey the NCBI's max three queries per second rule, the NCBI have other recommendations like avoiding peak hours. See Section~\ref{sec:entrez-guidelines}. In particular, please note that for simplicity, this example does not use the WebEnv history feature. You should use this for any non-trivial search and download work, see Section~\ref{sec:entrez-webenv}. Finally, if plan to repeat your analysis, rather than downloading the files from the NCBI and parsing them immediately (as shown in this example), you should just download the records \emph{once} and save them to your hard disk, and then parse the local file. \subsection{Finding the lineage of an organism} Staying with a plant example, let's now find the lineage of the Cypripedioideae orchid family. First, we search the Taxonomy database for Cypripedioideae, which yields exactly one NCBI taxonomy identifier: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" # Always tell NCBI who you are >>> handle = Entrez.esearch(db="Taxonomy", term="Cypripedioideae") >>> record = Entrez.read(handle) >>> record["IdList"] ['158330'] >>> record["IdList"][0] '158330' \end{verbatim} Now, we use \verb+efetch+ to download this entry in the Taxonomy database, and then parse it: \begin{verbatim} >>> handle = Entrez.efetch(db="Taxonomy", id="158330", retmode="xml") >>> records = Entrez.read(handle) \end{verbatim} Again, this record stores lots of information: \begin{verbatim} >>> records[0].keys() [u'Lineage', u'Division', u'ParentTaxId', u'PubDate', u'LineageEx', u'CreateDate', u'TaxId', u'Rank', u'GeneticCode', u'ScientificName', u'MitoGeneticCode', u'UpdateDate'] \end{verbatim} We can get the lineage directly from this record: \begin{verbatim} >>> records[0]["Lineage"] 'cellular organisms; Eukaryota; Viridiplantae; Streptophyta; Streptophytina; Embryophyta; Tracheophyta; Euphyllophyta; Spermatophyta; Magnoliophyta; Liliopsida; Asparagales; Orchidaceae' \end{verbatim} The record data contains much more than just the information shown here - for example look under \texttt{"LineageEx"} instead of \texttt{"Lineage"} and you'll get the NCBI taxon identifiers of the lineage entries too. \section{Using the history and WebEnv} \label{sec:entrez-webenv} Often you will want to make a series of linked queries. Most typically, running a search, perhaps refining the search, and then retrieving detailed search results. You \emph{can} do this by making a series of separate calls to Entrez. However, the NCBI prefer you to take advantage of their history support - for example combining ESearch and EFetch. Another typical use of the history support would be to combine EPost and EFetch. You use EPost to upload a list of identifiers, which starts a new history session. You then download the records with EFetch by referring to the session (instead of the identifiers). \subsection{Searching for and downloading sequences using the history} Suppose we want to search and download all the \textit{Opuntia} rpl16 nucleotide sequences, and store them in a FASTA file. As shown in Section~\ref{sec:entrez-search-fetch-genbank}, we can naively combine \verb|Bio.Entrez.esearch()| to get a list of GI numbers, and then call \verb|Bio.Entrez.efetch()| to download them all. However, the approved approach is to run the search with the history feature. Then, we can fetch the results by reference to the search results - which the NCBI can anticipate and cache. To do this, call \verb|Bio.Entrez.esearch()| as normal, but with the additional argument of \verb|usehistory="y"|, \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "history.user@example.com" >>> search_handle = Entrez.esearch(db="nucleotide",term="Opuntia[orgn] and rpl16", usehistory="y") >>> search_results = Entrez.read(search_handle) >>> search_handle.close() \end{verbatim} \noindent When you get the XML output back, it will still include the usual search results: \begin{verbatim} >>> gi_list = search_results["IdList"] >>> count = int(search_results["Count"]) >>> assert count == len(gi_list) \end{verbatim} \noindent However, you also get given two additional pieces of information, the {\tt WebEnv} session cookie, and the {\tt QueryKey}: \begin{verbatim} >>> webenv = search_results["WebEnv"] >>> query_key = search_results["QueryKey"] \end{verbatim} Having stored these values in variables {\tt session\_cookie} and {\tt query\_key} we can use them as parameters to \verb|Bio.Entrez.efetch()| instead of giving the GI numbers as identifiers. While for small searches you might be OK downloading everything at once, it is better to download in batches. You use the {\tt retstart} and {\tt retmax} parameters to specify which range of search results you want returned (starting entry using zero-based counting, and maximum number of results to return). For example, \begin{verbatim} batch_size = 3 out_handle = open("orchid_rpl16.fasta", "w") for start in range(0,count,batch_size): end = min(count, start+batch_size) print("Going to download record %i to %i" % (start+1, end)) fetch_handle = Entrez.efetch(db="nucleotide", rettype="fasta", retmode="text", retstart=start, retmax=batch_size, webenv=webenv, query_key=query_key) data = fetch_handle.read() fetch_handle.close() out_handle.write(data) out_handle.close() \end{verbatim} \noindent For illustrative purposes, this example downloaded the FASTA records in batches of three. Unless you are downloading genomes or chromosomes, you would normally pick a larger batch size. \subsection{Searching for and downloading abstracts using the history} Here is another history example, searching for papers published in the last year about the \textit{Opuntia}, and then downloading them into a file in MedLine format: \begin{verbatim} from Bio import Entrez Entrez.email = "history.user@example.com" search_results = Entrez.read(Entrez.esearch(db="pubmed", term="Opuntia[ORGN]", reldate=365, datetype="pdat", usehistory="y")) count = int(search_results["Count"]) print("Found %i results" % count) batch_size = 10 out_handle = open("recent_orchid_papers.txt", "w") for start in range(0,count,batch_size): end = min(count, start+batch_size) print("Going to download record %i to %i" % (start+1, end)) fetch_handle = Entrez.efetch(db="pubmed", rettype="medline", retmode="text", retstart=start, retmax=batch_size, webenv=search_results["WebEnv"], query_key=search_results["QueryKey"]) data = fetch_handle.read() fetch_handle.close() out_handle.write(data) out_handle.close() \end{verbatim} \noindent At the time of writing, this gave 28 matches - but because this is a date dependent search, this will of course vary. As described in Section~\ref{subsec:entrez-and-medline} above, you can then use \verb|Bio.Medline| to parse the saved records. \subsection{Searching for citations} \label{sec:elink-citations} Back in Section~\ref{sec:elink} we mentioned ELink can be used to search for citations of a given paper. Unfortunately this only covers journals indexed for PubMed Central (doing it for all the journals in PubMed would mean a lot more work for the NIH). Let's try this for the Biopython PDB parser paper, PubMed ID 14630660: \begin{verbatim} >>> from Bio import Entrez >>> Entrez.email = "A.N.Other@example.com" >>> pmid = "14630660" >>> results = Entrez.read(Entrez.elink(dbfrom="pubmed", db="pmc", ... LinkName="pubmed_pmc_refs", from_uid=pmid)) >>> pmc_ids = [link["Id"] for link in results[0]["LinkSetDb"][0]["Link"]] >>> pmc_ids ['2744707', '2705363', '2682512', ..., '1190160'] \end{verbatim} Great - eleven articles. But why hasn't the Biopython application note been found (PubMed ID 19304878)? Well, as you might have guessed from the variable names, there are not actually PubMed IDs, but PubMed Central IDs. Our application note is the third citing paper in that list, PMCID 2682512. So, what if (like me) you'd rather get back a list of PubMed IDs? Well we can call ELink again to translate them. This becomes a two step process, so by now you should expect to use the history feature to accomplish it (Section~\ref{sec:entrez-webenv}). But first, taking the more straightforward approach of making a second (separate) call to ELink: \begin{verbatim} >>> results2 = Entrez.read(Entrez.elink(dbfrom="pmc", db="pubmed", LinkName="pmc_pubmed", ... from_uid=",".join(pmc_ids))) >>> pubmed_ids = [link["Id"] for link in results2[0]["LinkSetDb"][0]["Link"]] >>> pubmed_ids ['19698094', '19450287', '19304878', ..., '15985178'] \end{verbatim} \noindent This time you can immediately spot the Biopython application note as the third hit (PubMed ID 19304878). Now, let's do that all again but with the history \ldots \textit{TODO}. And finally, don't forget to include your \emph{own} email address in the Entrez calls. \chapter{Swiss-Prot and ExPASy} \label{chapter:swiss_prot} \section{Parsing Swiss-Prot files} Swiss-Prot (\url{http://www.expasy.org/sprot}) is a hand-curated database of protein sequences. Biopython can parse the ``plain text'' Swiss-Prot file format, which is still used for the UniProt Knowledgebase which combined Swiss-Prot, TrEMBL and PIR-PSD. We do not (yet) support the UniProtKB XML file format. \subsection{Parsing Swiss-Prot records} In Section~\ref{sec:SeqIO_ExPASy_and_SwissProt}, we described how to extract the sequence of a Swiss-Prot record as a \verb|SeqRecord| object. Alternatively, you can store the Swiss-Prot record in a \verb|Bio.SwissProt.Record| object, which in fact stores the complete information contained in the Swiss-Prot record. In this Section, we describe how to extract \verb|Bio.SwissProt.Record| objects from a Swiss-Prot file. To parse a Swiss-Prot record, we first get a handle to a Swiss-Prot record. There are several ways to do so, depending on where and how the Swiss-Prot record is stored: \begin{itemize} \item Open a Swiss-Prot file locally: \newline \verb|>>> handle = open("myswissprotfile.dat")| \item Open a gzipped Swiss-Prot file: \begin{verbatim} >>> import gzip >>> handle = gzip.open("myswissprotfile.dat.gz") \end{verbatim} \item Open a Swiss-Prot file over the internet: \begin{verbatim} >>> import urllib >>> handle = urllib.urlopen("http://www.somelocation.org/data/someswissprotfile.dat") \end{verbatim} \item Open a Swiss-Prot file over the internet from the ExPASy database (see section \ref{subsec:expasy_swissprot}): \begin{verbatim} >>> from Bio import ExPASy >>> handle = ExPASy.get_sprot_raw(myaccessionnumber) \end{verbatim} \end{itemize} The key point is that for the parser, it doesn't matter how the handle was created, as long as it points to data in the Swiss-Prot format. We can use \verb+Bio.SeqIO+ as described in Section~\ref{sec:SeqIO_ExPASy_and_SwissProt} to get file format agnostic \verb|SeqRecord| objects. Alternatively, we can use \verb+Bio.SwissProt+ get \verb|Bio.SwissProt.Record| objects, which are a much closer match to the underlying file format. To read one Swiss-Prot record from the handle, we use the function \verb|read()|: \begin{verbatim} >>> from Bio import SwissProt >>> record = SwissProt.read(handle) \end{verbatim} This function should be used if the handle points to exactly one Swiss-Prot record. It raises a \verb|ValueError| if no Swiss-Prot record was found, and also if more than one record was found. We can now print out some information about this record: %TODO - Check the single quotes when printing record.description here: \begin{verbatim} >>> print(record.description) 'RecName: Full=Chalcone synthase 3; EC=2.3.1.74; AltName: Full=Naringenin-chalcone synthase 3;' >>> for ref in record.references: ... print("authors:", ref.authors) ... print("title:", ref.title) ... authors: Liew C.F., Lim S.H., Loh C.S., Goh C.J.; title: "Molecular cloning and sequence analysis of chalcone synthase cDNAs of Bromheadia finlaysoniana."; >>> print(record.organism_classification) ['Eukaryota', 'Viridiplantae', 'Streptophyta', 'Embryophyta', ..., 'Bromheadia'] \end{verbatim} To parse a file that contains more than one Swiss-Prot record, we use the \verb|parse| function instead. This function allows us to iterate over the records in the file. For example, let's parse the full Swiss-Prot database and collect all the descriptions. You can download this from the \href{ftp://ftp.expasy.org/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.dat.gz}{ExPAYs FTP site} as a single gzipped-file \verb|uniprot_sprot.dat.gz| (about 300MB). This is a compressed file containing a single file, \verb|uniprot_sprot.dat| (over 1.5GB). As described at the start of this section, you can use the Python library \verb|gzip| to open and uncompress a \texttt{.gz} file, like this: \begin{verbatim} >>> import gzip >>> handle = gzip.open("uniprot_sprot.dat.gz") \end{verbatim} However, uncompressing a large file takes time, and each time you open the file for reading in this way, it has to be decompressed on the fly. So, if you can spare the disk space you'll save time in the long run if you first decompress the file to disk, to get the \verb|uniprot_sprot.dat| file inside. Then you can open the file for reading as usual: \begin{verbatim} >>> handle = open("uniprot_sprot.dat") \end{verbatim} As of June 2009, the full Swiss-Prot database downloaded from ExPASy contained 468851 Swiss-Prot records. One concise way to build up a list of the record descriptions is with a list comprehension: \begin{verbatim} >>> from Bio import SwissProt >>> handle = open("uniprot_sprot.dat") >>> descriptions = [record.description for record in SwissProt.parse(handle)] >>> len(descriptions) 468851 >>> descriptions[:5] ['RecName: Full=Protein MGF 100-1R;', 'RecName: Full=Protein MGF 100-1R;', 'RecName: Full=Protein MGF 100-1R;', 'RecName: Full=Protein MGF 100-1R;', 'RecName: Full=Protein MGF 100-2L;'] \end{verbatim} Or, using a for loop over the record iterator: \begin{verbatim} >>> from Bio import SwissProt >>> descriptions = [] >>> handle = open("uniprot_sprot.dat") >>> for record in SwissProt.parse(handle): ... descriptions.append(record.description) ... >>> len(descriptions) 468851 \end{verbatim} Because this is such a large input file, either way takes about eleven minutes on my new desktop computer (using the uncompressed \verb|uniprot_sprot.dat| file as input). It is equally easy to extract any kind of information you'd like from Swiss-Prot records. To see the members of a Swiss-Prot record, use \begin{verbatim} >>> dir(record) ['__doc__', '__init__', '__module__', 'accessions', 'annotation_update', 'comments', 'created', 'cross_references', 'data_class', 'description', 'entry_name', 'features', 'gene_name', 'host_organism', 'keywords', 'molecule_type', 'organelle', 'organism', 'organism_classification', 'references', 'seqinfo', 'sequence', 'sequence_length', 'sequence_update', 'taxonomy_id'] \end{verbatim} \subsection{Parsing the Swiss-Prot keyword and category list} Swiss-Prot also distributes a file \verb+keywlist.txt+, which lists the keywords and categories used in Swiss-Prot. The file contains entries in the following form: \begin{verbatim} ID 2Fe-2S. AC KW-0001 DE Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron DE atoms complexed to 2 inorganic sulfides and 4 sulfur atoms of DE cysteines from the protein. SY Fe2S2; [2Fe-2S] cluster; [Fe2S2] cluster; Fe2/S2 (inorganic) cluster; SY Di-mu-sulfido-diiron; 2 iron, 2 sulfur cluster binding. GO GO:0051537; 2 iron, 2 sulfur cluster binding HI Ligand: Iron; Iron-sulfur; 2Fe-2S. HI Ligand: Metal-binding; 2Fe-2S. CA Ligand. // ID 3D-structure. AC KW-0002 DE Protein, or part of a protein, whose three-dimensional structure has DE been resolved experimentally (for example by X-ray crystallography or DE NMR spectroscopy) and whose coordinates are available in the PDB DE database. Can also be used for theoretical models. HI Technical term: 3D-structure. CA Technical term. // ID 3Fe-4S. ... \end{verbatim} The entries in this file can be parsed by the \verb+parse+ function in the \verb+Bio.SwissProt.KeyWList+ module. Each entry is then stored as a \verb+Bio.SwissProt.KeyWList.Record+, which is a Python dictionary. \begin{verbatim} >>> from Bio.SwissProt import KeyWList >>> handle = open("keywlist.txt") >>> records = KeyWList.parse(handle) >>> for record in records: ... print(record['ID']) ... print(record['DE']) \end{verbatim} This prints \begin{verbatim} 2Fe-2S. Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron atoms complexed to 2 inorganic sulfides and 4 sulfur atoms of cysteines from the protein. ... \end{verbatim} \section{Parsing Prosite records} Prosite is a database containing protein domains, protein families, functional sites, as well as the patterns and profiles to recognize them. Prosite was developed in parallel with Swiss-Prot. In Biopython, a Prosite record is represented by the \verb|Bio.ExPASy.Prosite.Record| class, whose members correspond to the different fields in a Prosite record. In general, a Prosite file can contain more than one Prosite records. For example, the full set of Prosite records, which can be downloaded as a single file (\verb|prosite.dat|) from the \href{ftp://ftp.expasy.org/databases/prosite/prosite.dat}{ExPASy FTP site}, contains 2073 records (version 20.24 released on 4 December 2007). To parse such a file, we again make use of an iterator: \begin{verbatim} >>> from Bio.ExPASy import Prosite >>> handle = open("myprositefile.dat") >>> records = Prosite.parse(handle) \end{verbatim} We can now take the records one at a time and print out some information. For example, using the file containing the complete Prosite database, we'd find \begin{verbatim} >>> from Bio.ExPASy import Prosite >>> handle = open("prosite.dat") >>> records = Prosite.parse(handle) >>> record = next(records) >>> record.accession 'PS00001' >>> record.name 'ASN_GLYCOSYLATION' >>> record.pdoc 'PDOC00001' >>> record = next(records) >>> record.accession 'PS00004' >>> record.name 'CAMP_PHOSPHO_SITE' >>> record.pdoc 'PDOC00004' >>> record = next(records) >>> record.accession 'PS00005' >>> record.name 'PKC_PHOSPHO_SITE' >>> record.pdoc 'PDOC00005' \end{verbatim} and so on. If you're interested in how many Prosite records there are, you could use \begin{verbatim} >>> from Bio.ExPASy import Prosite >>> handle = open("prosite.dat") >>> records = Prosite.parse(handle) >>> n = 0 >>> for record in records: n+=1 ... >>> n 2073 \end{verbatim} To read exactly one Prosite from the handle, you can use the \verb|read| function: \begin{verbatim} >>> from Bio.ExPASy import Prosite >>> handle = open("mysingleprositerecord.dat") >>> record = Prosite.read(handle) \end{verbatim} This function raises a ValueError if no Prosite record is found, and also if more than one Prosite record is found. \section{Parsing Prosite documentation records} In the Prosite example above, the \verb|record.pdoc| accession numbers \verb|'PDOC00001'|, \verb|'PDOC00004'|, \verb|'PDOC00005'| and so on refer to Prosite documentation. The Prosite documentation records are available from ExPASy as individual files, and as one file (\verb|prosite.doc|) containing all Prosite documentation records. We use the parser in \verb|Bio.ExPASy.Prodoc| to parse Prosite documentation records. For example, to create a list of all accession numbers of Prosite documentation record, you can use \begin{verbatim} >>> from Bio.ExPASy import Prodoc >>> handle = open("prosite.doc") >>> records = Prodoc.parse(handle) >>> accessions = [record.accession for record in records] \end{verbatim} Again a \verb|read()| function is provided to read exactly one Prosite documentation record from the handle. \section{Parsing Enzyme records} ExPASy's Enzyme database is a repository of information on enzyme nomenclature. A typical Enzyme record looks as follows: \begin{verbatim} ID 3.1.1.34 DE Lipoprotein lipase. AN Clearing factor lipase. AN Diacylglycerol lipase. AN Diglyceride lipase. CA Triacylglycerol + H(2)O = diacylglycerol + a carboxylate. CC -!- Hydrolyzes triacylglycerols in chylomicrons and very low-density CC lipoproteins (VLDL). CC -!- Also hydrolyzes diacylglycerol. PR PROSITE; PDOC00110; DR P11151, LIPL_BOVIN ; P11153, LIPL_CAVPO ; P11602, LIPL_CHICK ; DR P55031, LIPL_FELCA ; P06858, LIPL_HUMAN ; P11152, LIPL_MOUSE ; DR O46647, LIPL_MUSVI ; P49060, LIPL_PAPAN ; P49923, LIPL_PIG ; DR Q06000, LIPL_RAT ; Q29524, LIPL_SHEEP ; // \end{verbatim} In this example, the first line shows the EC (Enzyme Commission) number of lipoprotein lipase (second line). Alternative names of lipoprotein lipase are "clearing factor lipase", "diacylglycerol lipase", and "diglyceride lipase" (lines 3 through 5). The line starting with "CA" shows the catalytic activity of this enzyme. Comment lines start with "CC". The "PR" line shows references to the Prosite Documentation records, and the "DR" lines show references to Swiss-Prot records. Not of these entries are necessarily present in an Enzyme record. In Biopython, an Enzyme record is represented by the \verb|Bio.ExPASy.Enzyme.Record| class. This record derives from a Python dictionary and has keys corresponding to the two-letter codes used in Enzyme files. To read an Enzyme file containing one Enzyme record, use the \verb+read+ function in \verb|Bio.ExPASy.Enzyme|: %doctest ../Tests/Enzymes \begin{verbatim} >>> from Bio.ExPASy import Enzyme >>> handle = open("lipoprotein.txt") >>> record = Enzyme.read(handle) >>> record["ID"] '3.1.1.34' >>> record["DE"] 'Lipoprotein lipase.' >>> record["AN"] ['Clearing factor lipase.', 'Diacylglycerol lipase.', 'Diglyceride lipase.'] >>> record["CA"] 'Triacylglycerol + H(2)O = diacylglycerol + a carboxylate.' >>> record["PR"] ['PDOC00110'] \end{verbatim} %TODO - line wrapping? \begin{verbatim} >>> record["CC"] ['Hydrolyzes triacylglycerols in chylomicrons and very low-density lipoproteins (VLDL).', 'Also hydrolyzes diacylglycerol.'] >>> record["DR"] [['P11151', 'LIPL_BOVIN'], ['P11153', 'LIPL_CAVPO'], ['P11602', 'LIPL_CHICK'], ['P55031', 'LIPL_FELCA'], ['P06858', 'LIPL_HUMAN'], ['P11152', 'LIPL_MOUSE'], ['O46647', 'LIPL_MUSVI'], ['P49060', 'LIPL_PAPAN'], ['P49923', 'LIPL_PIG'], ['Q06000', 'LIPL_RAT'], ['Q29524', 'LIPL_SHEEP']] \end{verbatim} The \verb+read+ function raises a ValueError if no Enzyme record is found, and also if more than one Enzyme record is found. The full set of Enzyme records can be downloaded as a single file (\verb|enzyme.dat|) from the \href{ftp://ftp.expasy.org/databases/enzyme/enzyme.dat}{ExPASy FTP site}, containing 4877 records (release of 3 March 2009). To parse such a file containing multiple Enzyme records, use the \verb+parse+ function in \verb+Bio.ExPASy.Enzyme+ to obtain an iterator: \begin{verbatim} >>> from Bio.ExPASy import Enzyme >>> handle = open("enzyme.dat") >>> records = Enzyme.parse(handle) \end{verbatim} We can now iterate over the records one at a time. For example, we can make a list of all EC numbers for which an Enzyme record is available: \begin{verbatim} >>> ecnumbers = [record["ID"] for record in records] \end{verbatim} \section{Accessing the ExPASy server} Swiss-Prot, Prosite, and Prosite documentation records can be downloaded from the ExPASy web server at \url{http://www.expasy.org}. Six kinds of queries are available from ExPASy: \begin{description} \item[get\_prodoc\_entry]To download a Prosite documentation record in HTML format \item[get\_prosite\_entry]To download a Prosite record in HTML format \item[get\_prosite\_raw]To download a Prosite or Prosite documentation record in raw format \item[get\_sprot\_raw]To download a Swiss-Prot record in raw format \item[sprot\_search\_ful]To search for a Swiss-Prot record \item[sprot\_search\_de]To search for a Swiss-Prot record \end{description} To access this web server from a Python script, we use the \verb|Bio.ExPASy| module. \subsection{Retrieving a Swiss-Prot record} \label{subsec:expasy_swissprot} Let's say we are looking at chalcone synthases for Orchids (see section~\ref{sec:orchids} for some justification for looking for interesting things about orchids). Chalcone synthase is involved in flavanoid biosynthesis in plants, and flavanoids make lots of cool things like pigment colors and UV protectants. If you do a search on Swiss-Prot, you can find three orchid proteins for Chalcone Synthase, id numbers O23729, O23730, O23731. Now, let's write a script which grabs these, and parses out some interesting information. First, we grab the records, using the \verb|get_sprot_raw()| function of \verb|Bio.ExPASy|. This function is very nice since you can feed it an id and get back a handle to a raw text record (no html to mess with!). We can the use \verb|Bio.SwissProt.read| to pull out the Swiss-Prot record, or \verb|Bio.SeqIO.read| to get a SeqRecord. The following code accomplishes what I just wrote: \begin{verbatim} >>> from Bio import ExPASy >>> from Bio import SwissProt >>> accessions = ["O23729", "O23730", "O23731"] >>> records = [] >>> for accession in accessions: ... handle = ExPASy.get_sprot_raw(accession) ... record = SwissProt.read(handle) ... records.append(record) \end{verbatim} If the accession number you provided to \verb|ExPASy.get_sprot_raw| does not exist, then \verb|SwissProt.read(handle)| will raise a \verb|ValueError|. You can catch \verb|ValueException| exceptions to detect invalid accession numbers: \begin{verbatim} >>> for accession in accessions: ... handle = ExPASy.get_sprot_raw(accession) ... try: ... record = SwissProt.read(handle) ... except ValueException: ... print("WARNING: Accession %s not found" % accession) ... records.append(record) \end{verbatim} \subsection{Searching Swiss-Prot} Now, you may remark that I knew the records' accession numbers beforehand. Indeed, \verb|get_sprot_raw()| needs either the entry name or an accession number. When you don't have them handy, you can use one of the \verb|sprot_search_de()| or \verb|sprot_search_ful()| functions. \verb|sprot_search_de()| searches in the ID, DE, GN, OS and OG lines; \verb|sprot_search_ful()| searches in (nearly) all the fields. They are detailed on \url{http://www.expasy.org/cgi-bin/sprot-search-de} and \url{http://www.expasy.org/cgi-bin/sprot-search-ful} respectively. Note that they don't search in TrEMBL by default (argument \verb|trembl|). Note also that they return html pages; however, accession numbers are quite easily extractable: \begin{verbatim} >>> from Bio import ExPASy >>> import re >>> handle = ExPASy.sprot_search_de("Orchid Chalcone Synthase") >>> # or: >>> # handle = ExPASy.sprot_search_ful("Orchid and {Chalcone Synthase}") >>> html_results = handle.read() >>> if "Number of sequences found" in html_results: ... ids = re.findall(r'HREF="/uniprot/(\w+)"', html_results) ... else: ... ids = re.findall(r'href="/cgi-bin/niceprot\.pl\?(\w+)"', html_results) \end{verbatim} \subsection{Retrieving Prosite and Prosite documentation records} Prosite and Prosite documentation records can be retrieved either in HTML format, or in raw format. To parse Prosite and Prosite documentation records with Biopython, you should retrieve the records in raw format. For other purposes, however, you may be interested in these records in HTML format. To retrieve a Prosite or Prosite documentation record in raw format, use \verb|get_prosite_raw()|. For example, to download a Prosite record and print it out in raw text format, use \begin{verbatim} >>> from Bio import ExPASy >>> handle = ExPASy.get_prosite_raw('PS00001') >>> text = handle.read() >>> print(text) \end{verbatim} To retrieve a Prosite record and parse it into a \verb|Bio.Prosite.Record| object, use \begin{verbatim} >>> from Bio import ExPASy >>> from Bio import Prosite >>> handle = ExPASy.get_prosite_raw('PS00001') >>> record = Prosite.read(handle) \end{verbatim} The same function can be used to retrieve a Prosite documentation record and parse it into a \verb|Bio.ExPASy.Prodoc.Record| object: \begin{verbatim} >>> from Bio import ExPASy >>> from Bio.ExPASy import Prodoc >>> handle = ExPASy.get_prosite_raw('PDOC00001') >>> record = Prodoc.read(handle) \end{verbatim} For non-existing accession numbers, \verb|ExPASy.get_prosite_raw| returns a handle to an emptry string. When faced with an empty string, \verb|Prosite.read| and \verb|Prodoc.read| will raise a ValueError. You can catch these exceptions to detect invalid accession numbers. The functions \verb|get_prosite_entry()| and \verb|get_prodoc_entry()| are used to download Prosite and Prosite documentation records in HTML format. To create a web page showing one Prosite record, you can use \begin{verbatim} >>> from Bio import ExPASy >>> handle = ExPASy.get_prosite_entry('PS00001') >>> html = handle.read() >>> output = open("myprositerecord.html", "w") >>> output.write(html) >>> output.close() \end{verbatim} and similarly for a Prosite documentation record: \begin{verbatim} >>> from Bio import ExPASy >>> handle = ExPASy.get_prodoc_entry('PDOC00001') >>> html = handle.read() >>> output = open("myprodocrecord.html", "w") >>> output.write(html) >>> output.close() \end{verbatim} For these functions, an invalid accession number returns an error message in HTML format. \section{Scanning the Prosite database} \href{http://www.expasy.org/tools/scanprosite/}{ScanProsite} allows you to scan protein sequences online against the Prosite database by providing a UniProt or PDB sequence identifier or the sequence itself. For more information about ScanProsite, please see the \href{http://www.expasy.org/tools/scanprosite/scanprosite-doc.html}{ScanProsite documentation} as well as the \href{http://www.expasy.org/tools/scanprosite/ScanPrositeREST.html}{documentation for programmatic access of ScanProsite}. You can use Biopython's \verb+Bio.ExPASy.ScanProsite+ module to scan the Prosite database from Python. This module both helps you to access ScanProsite programmatically, and to parse the results returned by ScanProsite. To scan for Prosite patterns in the following protein sequence: \begin{verbatim} MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN \end{verbatim} you can use the following code: \begin{verbatim} >>> sequence = "MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN" >>> from Bio.ExPASy import ScanProsite >>> handle = ScanProsite.scan(seq=sequence) \end{verbatim} By executing \verb+handle.read()+, you can obtain the search results in raw XML format. Instead, let's use \verb+Bio.ExPASy.ScanProsite.read+ to parse the raw XML into a Python object: \begin{verbatim} >>> result = ScanProsite.read(handle) >>> type(result) \end{verbatim} A \verb+Bio.ExPASy.ScanProsite.Record+ object is derived from a list, with each element in the list storing one ScanProsite hit. This object also stores the number of hits, as well as the number of search sequences, as returned by ScanProsite. This ScanProsite search resulted in six hits: \begin{verbatim} >>> result.n_seq 1 >>> result.n_match 6 >>> len(result) 6 >>> result[0] {'signature_ac': u'PS50948', 'level': u'0', 'stop': 98, 'sequence_ac': u'USERSEQ1', 'start': 16, 'score': u'8.873'} >>> result[1] {'start': 37, 'stop': 39, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00005'} >>> result[2] {'start': 45, 'stop': 48, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00006'} >>> result[3] {'start': 60, 'stop': 62, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00005'} >>> result[4] {'start': 80, 'stop': 83, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00004'} >>> result[5] {'start': 106, 'stop': 111, 'sequence_ac': u'USERSEQ1', 'signature_ac': u'PS00008'} \end{verbatim} Other ScanProsite parameters can be passed as keyword arguments; see the \href{http://www.expasy.org/tools/scanprosite/ScanPrositeREST.html}{documentation for programmatic access of ScanProsite} for more information. As an example, passing \verb+lowscore=1+ to include matches with low level scores lets use find one additional hit: \begin{verbatim} >>> handle = ScanProsite.scan(seq=sequence, lowscore=1) >>> result = ScanProsite.read(handle) >>> result.n_match 7 \end{verbatim} \chapter{Going 3D: The PDB module} Bio.PDB is a Biopython module that focuses on working with crystal structures of biological macromolecules. Among other things, Bio.PDB includes a PDBParser class that produces a Structure object, which can be used to access the atomic data in the file in a convenient manner. There is limited support for parsing the information contained in the PDB header. %Note the \verb|Bio.PDB| module requires Numerical Python (numpy) to be installed. \section{Reading and writing crystal structure files} \subsection{Reading a PDB file} First we create a \texttt{PDBParser} object: \begin{verbatim} >>> from Bio.PDB.PDBParser import PDBParser >>> p = PDBParser(PERMISSIVE=1) \end{verbatim} The {\tt PERMISSIVE} flag indicates that a number of common problems (see \ref{problem structures}) associated with PDB files will be ignored (but note that some atoms and/or residues will be missing). If the flag is not present a {\tt PDBConstructionException} will be generated if any problems are detected during the parse operation. The Structure object is then produced by letting the \texttt{PDBParser} object parse a PDB file (the PDB file in this case is called 'pdb1fat.ent', '1fat' is a user defined name for the structure): \begin{verbatim} >>> structure_id = "1fat" >>> filename = "pdb1fat.ent" >>> s = p.get_structure(structure_id, filename) \end{verbatim} You can extract the header and trailer (simple lists of strings) of the PDB file from the PDBParser object with the {\tt get\_header} and {\tt get\_trailer} methods. Note however that many PDB files contain headers with incomplete or erroneous information. Many of the errors have been fixed in the equivalent mmCIF files. \emph{Hence, if you are interested in the header information, it is a good idea to extract information from mmCIF files using the} \texttt{\emph{MMCIF2Dict}} \emph{tool described below, instead of parsing the PDB header. } Now that is clarified, let's return to parsing the PDB header. The structure object has an attribute called \texttt{header} which is a Python dictionary that maps header records to their values. Example: \begin{verbatim} >>> resolution = structure.header['resolution'] >>> keywords = structure.header['keywords'] \end{verbatim} The available keys are \verb+name+, \verb+head+, \verb+deposition_date+, \verb+release_date+, \verb+structure_method+, \verb+resolution+, \verb+structure_reference+ (which maps to a list of references), \verb+journal_reference+, \verb+author+, and \verb+compound+ (which maps to a dictionary with various information about the crystallized compound). The dictionary can also be created without creating a \texttt{Structure} object, ie. directly from the PDB file: \begin{verbatim} >>> file = open(filename, 'r') >>> header_dict = parse_pdb_header(file) >>> file.close() \end{verbatim} \subsection{Reading an mmCIF file} Similarly to the case the case of PDB files, first create an \texttt{MMCIFParser} object: \begin{verbatim} >>> from Bio.PDB.MMCIFParser import MMCIFParser >>> parser = MMCIFParser() \end{verbatim} Then use this parser to create a structure object from the mmCIF file: \begin{verbatim} >>> structure = parser.get_structure('1fat', '1fat.cif') \end{verbatim} To have some more low level access to an mmCIF file, you can use the \verb+MMCIF2Dict+ class to create a Python dictionary that maps all mmCIF tags in an mmCIF file to their values. If there are multiple values (like in the case of tag \verb+_atom_site.Cartn_y+, which holds the $y$ coordinates of all atoms), the tag is mapped to a list of values. The dictionary is created from the mmCIF file as follows: \begin{verbatim} >>> from Bio.PDB.MMCIF2Dict import MMCIF2Dict >>> mmcif_dict = MMCIF2Dict('1FAT.cif') \end{verbatim} Example: get the solvent content from an mmCIF file: \begin{verbatim} >>> sc = mmcif_dict['_exptl_crystal.density_percent_sol'] \end{verbatim} Example: get the list of the $y$ coordinates of all atoms \begin{verbatim} >>> y_list = mmcif_dict['_atom_site.Cartn_y'] \end{verbatim} \subsection{Reading files in the PDB XML format} That's not yet supported, but we are definitely planning to support that in the future (it's not a lot of work). Contact the Biopython developers (\mailto{biopython-dev@biopython.org}) if you need this). \subsection{Writing PDB files} Use the PDBIO class for this. It's easy to write out specific parts of a structure too, of course. Example: saving a structure \begin{verbatim} >>> io = PDBIO() >>> io.set_structure(s) >>> io.save('out.pdb') \end{verbatim} If you want to write out a part of the structure, make use of the \texttt{Select} class (also in \texttt{PDBIO}). Select has four methods: \begin{itemize} \item \verb+accept_model(model)+ \item \verb+accept_chain(chain)+ \item \verb+accept_residue(residue)+ \item \verb+accept_atom(atom)+ \end{itemize} By default, every method returns 1 (which means the model/\-chain/\-residue/\-atom is included in the output). By subclassing \texttt{Select} and returning 0 when appropriate you can exclude models, chains, etc. from the output. Cumbersome maybe, but very powerful. The following code only writes out glycine residues: \begin{verbatim} >>> class GlySelect(Select): ... def accept_residue(self, residue): ... if residue.get_name()=='GLY': ... return True ... else: ... return False ... >>> io = PDBIO() >>> io.set_structure(s) >>> io.save('gly_only.pdb', GlySelect()) \end{verbatim} If this is all too complicated for you, the \texttt{Dice} module contains a handy \texttt{extract} function that writes out all residues in a chain between a start and end residue. \section{Structure representation} The overall layout of a \texttt{Structure} object follows the so-called SMCRA (Structure/Model/Chain/Residue/Atom) architecture: \begin{itemize} \item A structure consists of models \item A model consists of chains \item A chain consists of residues \item A residue consists of atoms \end{itemize} This is the way many structural biologists/bioinformaticians think about structure, and provides a simple but efficient way to deal with structure. Additional stuff is essentially added when needed. A UML diagram of the \texttt{Structure} object (forget about the \texttt{Disordered} classes for now) is shown in Fig. \ref{fig:smcra}. Such a data structure is not necessarily best suited for the representation of the macromolecular content of a structure, but it is absolutely necessary for a good interpretation of the data present in a file that describes the structure (typically a PDB or MMCIF file). If this hierarchy cannot represent the contents of a structure file, it is fairly certain that the file contains an error or at least does not describe the structure unambiguously. If a SMCRA data structure cannot be generated, there is reason to suspect a problem. Parsing a PDB file can thus be used to detect likely problems. We will give several examples of this in section \ref{problem structures}. \begin{figure}[htbp] \begin{htmlonly} \imgsrc[width=650, height=750]{images/smcra.png} \end{htmlonly} \begin{latexonly} \centering \includegraphics[width=0.8\textwidth]{images/smcra.png} \end{latexonly} \caption{UML diagram of SMCRA architecture of the \texttt{Structure} class used to represent a macromolecular structure. Full lines with diamonds denote aggregation, full lines with arrows denote referencing, full lines with triangles denote inheritance and dashed lines with triangles denote interface realization.} \label{fig:smcra} \end{figure} Structure, Model, Chain and Residue are all subclasses of the Entity base class. The Atom class only (partly) implements the Entity interface (because an Atom does not have children). For each Entity subclass, you can extract a child by using a unique id for that child as a key (e.g. you can extract an Atom object from a Residue object by using an atom name string as a key, you can extract a Chain object from a Model object by using its chain identifier as a key). Disordered atoms and residues are represented by DisorderedAtom and DisorderedResidue classes, which are both subclasses of the DisorderedEntityWrapper base class. They hide the complexity associated with disorder and behave exactly as Atom and Residue objects. In general, a child Entity object (i.e. Atom, Residue, Chain, Model) can be extracted from its parent (i.e. Residue, Chain, Model, Structure, respectively) by using an id as a key. \begin{verbatim} >>> child_entity = parent_entity[child_id] \end{verbatim} You can also get a list of all child Entities of a parent Entity object. Note that this list is sorted in a specific way (e.g. according to chain identifier for Chain objects in a Model object). \begin{verbatim} >>> child_list = parent_entity.get_list() \end{verbatim} You can also get the parent from a child: \begin{verbatim} >>> parent_entity = child_entity.get_parent() \end{verbatim} At all levels of the SMCRA hierarchy, you can also extract a \emph{full id}. The full id is a tuple containing all id's starting from the top object (Structure) down to the current object. A full id for a Residue object e.g. is something like: \begin{verbatim} >>> full_id = residue.get_full_id() >>> print(full_id) ("1abc", 0, "A", ("", 10, "A")) \end{verbatim} This corresponds to: \begin{itemize} \item The Structure with id \char`\"{}1abc\char`\"{} \item The Model with id 0 \item The Chain with id \char`\"{}A\char`\"{} \item The Residue with id (\char`\"{} \char`\"{}, 10, \char`\"{}A\char`\"{}). \end{itemize} The Residue id indicates that the residue is not a hetero-residue (nor a water) because it has a blank hetero field, that its sequence identifier is 10 and that its insertion code is \char`\"{}A\char`\"{}. To get the entity's id, use the \verb+get_id+ method: \begin{verbatim} >>> entity.get_id() \end{verbatim} You can check if the entity has a child with a given id by using the \verb+has_id+ method: \begin{verbatim} >>> entity.has_id(entity_id) \end{verbatim} The length of an entity is equal to its number of children: \begin{verbatim} >>> nr_children = len(entity) \end{verbatim} It is possible to delete, rename, add, etc. child entities from a parent entity, but this does not include any sanity checks (e.g. it is possible to add two residues with the same id to one chain). This really should be done via a nice Decorator class that includes integrity checking, but you can take a look at the code (Entity.py) if you want to use the raw interface. \subsection{Structure} The Structure object is at the top of the hierarchy. Its id is a user given string. The Structure contains a number of Model children. Most crystal structures (but not all) contain a single model, while NMR structures typically consist of several models. Disorder in crystal structures of large parts of molecules can also result in several models. \subsection{Model} The id of the Model object is an integer, which is derived from the position of the model in the parsed file (they are automatically numbered starting from 0). Crystal structures generally have only one model (with id 0), while NMR files usually have several models. Whereas many PDB parsers assume that there is only one model, the \verb+Structure+ class in \verb+Bio.PDB+ is designed such that it can easily handle PDB files with more than one model. As an example, to get the first model from a Structure object, use \begin{verbatim} >>> first_model = structure[0] \end{verbatim} The Model object stores a list of Chain children. \subsection{Chain} The id of a Chain object is derived from the chain identifier in the PDB/mmCIF file, and is a single character (typically a letter). Each Chain in a Model object has a unique id. As an example, to get the Chain object with identifier ``A'' from a Model object, use \begin{verbatim} >>> chain_A = model["A"] \end{verbatim} The Chain object stores a list of Residue children. \subsection{Residue} A residue id is a tuple with three elements: \begin{itemize} \item The \textbf{hetero-field} (hetfield): this is \begin{itemize} \item \verb+'W'+ in the case of a water molecule; \item \verb+'H_'+ followed by the residue name for other hetero residues (e.g. \verb+'H_GLC'+ in the case of a glucose molecule); \item blank for standard amino and nucleic acids. \end{itemize} This scheme is adopted for reasons described in section \ref{hetero problems}. \item The \textbf{sequence identifier} (resseq), an integer describing the position of the residue in the chain (e.g., 100); \item The \textbf{insertion code} (icode); a string, e.g. 'A'. The insertion code is sometimes used to preserve a certain desirable residue numbering scheme. A Ser 80 insertion mutant (inserted e.g. between a Thr 80 and an Asn 81 residue) could e.g. have sequence identifiers and insertion codes as follows: Thr 80 A, Ser 80 B, Asn 81. In this way the residue numbering scheme stays in tune with that of the wild type structure. \end{itemize} The id of the above glucose residue would thus be \texttt{('H\_GLC', 100, 'A')}. If the hetero-flag and insertion code are blank, the sequence identifier alone can be used: \begin{verbatim} # Full id >>> residue=chain[(' ', 100, ' ')] # Shortcut id >>> residue=chain[100] \end{verbatim} The reason for the hetero-flag is that many, many PDB files use the same sequence identifier for an amino acid and a hetero-residue or a water, which would create obvious problems if the hetero-flag was not used. Unsurprisingly, a Residue object stores a set of Atom children. It also contains a string that specifies the residue name (e.g. ``ASN'') and the segment identifier of the residue (well known to X-PLOR users, but not used in the construction of the SMCRA data structure). Let's look at some examples. Asn 10 with a blank insertion code would have residue id {\tt (' ', 10, ' ')}. Water 10 would have residue id {\tt ('W', 10, ' ')}. A glucose molecule (a hetero residue with residue name GLC) with sequence identifier 10 would have residue id {\tt ('H\_GLC', 10, ' ')}. In this way, the three residues (with the same insertion code and sequence identifier) can be part of the same chain because their residue id's are distinct. In most cases, the hetflag and insertion code fields will be blank, e.g. {\tt (' ', 10, ' ')}. In these cases, the sequence identifier can be used as a shortcut for the full id: \begin{verbatim} # use full id >>> res10 = chain[(' ', 10, ' ')] # use shortcut >>> res10 = chain[10] \end{verbatim} Each Residue object in a Chain object should have a unique id. However, disordered residues are dealt with in a special way, as described in section \ref{point mutations}. A Residue object has a number of additional methods: \begin{verbatim} >>> residue.get_resname() # returns the residue name, e.g. "ASN" >>> residue.is_disordered() # returns 1 if the residue has disordered atoms >>> residue.get_segid() # returns the SEGID, e.g. "CHN1" >>> residue.has_id(name) # test if a residue has a certain atom \end{verbatim} You can use \texttt{is\_aa(residue)} to test if a Residue object is an amino acid. \subsection{Atom} The Atom object stores the data associated with an atom, and has no children. The id of an atom is its atom name (e.g. ``OG'' for the side chain oxygen of a Ser residue). An Atom id needs to be unique in a Residue. Again, an exception is made for disordered atoms, as described in section \ref{disordered atoms}. The atom id is simply the atom name (eg. \texttt{'CA'}). In practice, the atom name is created by stripping all spaces from the atom name in the PDB file. However, in PDB files, a space can be part of an atom name. Often, calcium atoms are called \texttt{'CA..'} in order to distinguish them from C$\alpha$ atoms (which are called \texttt{'.CA.'}). In cases were stripping the spaces would create problems (ie. two atoms called \texttt{'CA'} in the same residue) the spaces are kept. In a PDB file, an atom name consists of 4 chars, typically with leading and trailing spaces. Often these spaces can be removed for ease of use (e.g. an amino acid C\( \alpha \) atom is labeled ``.CA.'' in a PDB file, where the dots represent spaces). To generate an atom name (and thus an atom id) the spaces are removed, unless this would result in a name collision in a Residue (i.e. two Atom objects with the same atom name and id). In the latter case, the atom name including spaces is tried. This situation can e.g. happen when one residue contains atoms with names ``.CA.'' and ``CA..'', although this is not very likely. The atomic data stored includes the atom name, the atomic coordinates (including standard deviation if present), the B factor (including anisotropic B factors and standard deviation if present), the altloc specifier and the full atom name including spaces. Less used items like the atom element number or the atomic charge sometimes specified in a PDB file are not stored. To manipulate the atomic coordinates, use the \texttt{transform} method of the \texttt{Atom} object. Use the \texttt{set\_coord} method to specify the atomic coordinates directly. An Atom object has the following additional methods: \begin{verbatim} >>> a.get_name() # atom name (spaces stripped, e.g. "CA") >>> a.get_id() # id (equals atom name) >>> a.get_coord() # atomic coordinates >>> a.get_vector() # atomic coordinates as Vector object >>> a.get_bfactor() # isotropic B factor >>> a.get_occupancy() # occupancy >>> a.get_altloc() # alternative location specifier >>> a.get_sigatm() # standard deviation of atomic parameters >>> a.get_siguij() # standard deviation of anisotropic B factor >>> a.get_anisou() # anisotropic B factor >>> a.get_fullname() # atom name (with spaces, e.g. ".CA.") \end{verbatim} To represent the atom coordinates, siguij, anisotropic B factor and sigatm Numpy arrays are used. The \texttt{get\_vector} method returns a \texttt{Vector} object representation of the coordinates of the \texttt{Atom} object, allowing you to do vector operations on atomic coordinates. \texttt{Vector} implements the full set of 3D vector operations, matrix multiplication (left and right) and some advanced rotation-related operations as well. As an example of the capabilities of Bio.PDB's \texttt{Vector} module, suppose that you would like to find the position of a Gly residue's C$\beta$ atom, if it had one. Rotating the N atom of the Gly residue along the C$\alpha$-C bond over -120 degrees roughly puts it in the position of a virtual C$\beta$ atom. Here's how to do it, making use of the \texttt{rotaxis} method (which can be used to construct a rotation around a certain axis) of the \texttt{Vector} module: \begin{verbatim} # get atom coordinates as vectors >>> n = residue['N'].get_vector() >>> c = residue['C'].get_vector() >>> ca = residue['CA'].get_vector() # center at origin >>> n = n - ca >>> c = c - ca # find rotation matrix that rotates n # -120 degrees along the ca-c vector >>> rot = rotaxis(-pi * 120.0/180.0, c) # apply rotation to ca-n vector >>> cb_at_origin = n.left_multiply(rot) # put on top of ca atom >>> cb = cb_at_origin+ca \end{verbatim} This example shows that it's possible to do some quite nontrivial vector operations on atomic data, which can be quite useful. In addition to all the usual vector operations (cross (use \texttt{{*}{*}}), and dot (use \texttt{{*}}) product, angle, norm, etc.) and the above mentioned \texttt{rotaxis} function, the \texttt{Vector} module also has methods to rotate (\texttt{rotmat}) or reflect (\texttt{refmat}) one vector on top of another. \subsection{Extracting a specific \texttt{Atom/\-Residue/\-Chain/\-Model} from a Structure} These are some examples: \begin{verbatim} >>> model = structure[0] >>> chain = model['A'] >>> residue = chain[100] >>> atom = residue['CA'] \end{verbatim} Note that you can use a shortcut: \begin{verbatim} >>> atom = structure[0]['A'][100]['CA'] \end{verbatim} \section{Disorder} Bio.PDB can handle both disordered atoms and point mutations (i.e. a Gly and an Ala residue in the same position). \subsection{General approach\label{disorder problems}} Disorder should be dealt with from two points of view: the atom and the residue points of view. In general, we have tried to encapsulate all the complexity that arises from disorder. If you just want to loop over all C$\alpha$ atoms, you do not care that some residues have a disordered side chain. On the other hand it should also be possible to represent disorder completely in the data structure. Therefore, disordered atoms or residues are stored in special objects that behave as if there is no disorder. This is done by only representing a subset of the disordered atoms or residues. Which subset is picked (e.g. which of the two disordered OG side chain atom positions of a Ser residue is used) can be specified by the user. \subsection{Disordered atoms\label{disordered atoms}} Disordered atoms are represented by ordinary \texttt{Atom} objects, but all \texttt{Atom} objects that represent the same physical atom are stored in a \texttt{Disordered\-Atom} object (see Fig. \ref{fig:smcra}). Each \texttt{Atom} object in a \texttt{Disordered\-Atom} object can be uniquely indexed using its altloc specifier. The \texttt{Disordered\-Atom} object forwards all uncaught method calls to the selected Atom object, by default the one that represents the atom with the highest occupancy. The user can of course change the selected \texttt{Atom} object, making use of its altloc specifier. In this way atom disorder is represented correctly without much additional complexity. In other words, if you are not interested in atom disorder, you will not be bothered by it. Each disordered atom has a characteristic altloc identifier. You can specify that a \texttt{Disordered\-Atom} object should behave like the \texttt{Atom} object associated with a specific altloc identifier: \begin{verbatim} >>> atom.disordered_select('A') # select altloc A atom >>> print(atom.get_altloc()) "A" >>> atom.disordered_select('B') # select altloc B atom >>> print(atom.get_altloc()) "B" \end{verbatim} \subsection{Disordered residues} \subsubsection*{Common case} The most common case is a residue that contains one or more disordered atoms. This is evidently solved by using DisorderedAtom objects to represent the disordered atoms, and storing the DisorderedAtom object in a Residue object just like ordinary Atom objects. The DisorderedAtom will behave exactly like an ordinary atom (in fact the atom with the highest occupancy) by forwarding all uncaught method calls to one of the Atom objects (the selected Atom object) it contains. \subsubsection*{Point mutations\label{point mutations}} A special case arises when disorder is due to a point mutation, i.e. when two or more point mutants of a polypeptide are present in the crystal. An example of this can be found in PDB structure 1EN2. Since these residues belong to a different residue type (e.g. let's say Ser 60 and Cys 60) they should not be stored in a single \texttt{Residue} object as in the common case. In this case, each residue is represented by one \texttt{Residue} object, and both \texttt{Residue} objects are stored in a single \texttt{Disordered\-Residue} object (see Fig. \ref{fig:smcra}). The \texttt{Dis\-ordered\-Residue} object forwards all un\-caught methods to the selected \texttt{Residue} object (by default the last \texttt{Residue} object added), and thus behaves like an ordinary residue. Each \texttt{Residue} object in a \texttt{Disordered\-Residue} object can be uniquely identified by its residue name. In the above example, residue Ser 60 would have id ``SER'' in the \texttt{Disordered\-Residue} object, while residue Cys 60 would have id ``CYS''. The user can select the active \texttt{Residue} object in a \texttt{Disordered\-Residue} object via this id. Example: suppose that a chain has a point mutation at position 10, consisting of a Ser and a Cys residue. Make sure that residue 10 of this chain behaves as the Cys residue. \begin{verbatim} >>> residue = chain[10] >>> residue.disordered_select('CYS') \end{verbatim} In addition, you can get a list of all \texttt{Atom} objects (ie. all \texttt{DisorderedAtom} objects are 'unpacked' to their individual \texttt{Atom} objects) using the \texttt{get\_unpacked\_list} method of a \texttt{(Disordered)\-Residue} object. \section{Hetero residues} \subsection{Associated problems\label{hetero problems}} A common problem with hetero residues is that several hetero and non-hetero residues present in the same chain share the same sequence identifier (and insertion code). Therefore, to generate a unique id for each hetero residue, waters and other hetero residues are treated in a different way. Remember that Residue object have the tuple (hetfield, resseq, icode) as id. The hetfield is blank (`` '') for amino and nucleic acids, and a string for waters and other hetero residues. The content of the hetfield is explained below. \subsection{Water residues} The hetfield string of a water residue consists of the letter ``W''. So a typical residue id for a water is (``W'', 1, `` ''). \subsection{Other hetero residues} The hetfield string for other hetero residues starts with ``H\_'' followed by the residue name. A glucose molecule e.g. with residue name ``GLC'' would have hetfield ``H\_GLC''. Its residue id could e.g. be (``H\_GLC'', 1, `` ''). \section{Navigating through a Structure object} \subsubsection*{Parse a PDB file, and extract some Model, Chain, Residue and Atom objects} \begin{verbatim} >>> from Bio.PDB.PDBParser import PDBParser >>> parser = PDBParser() >>> structure = parser.get_structure("test", "1fat.pdb") >>> model = structure[0] >>> chain = model["A"] >>> residue = chain[1] >>> atom = residue["CA"] \end{verbatim} \subsubsection*{Iterating through all atoms of a structure} \begin{verbatim} >>> p = PDBParser() >>> structure = p.get_structure('X', 'pdb1fat.ent') >>> for model in structure: ... for chain in model: ... for residue in chain: ... for atom in residue: ... print(atom) ... \end{verbatim} There is a shortcut if you want to iterate over all atoms in a structure: \begin{verbatim} >>> atoms = structure.get_atoms() >>> for atom in atoms: ... print(atom) ... \end{verbatim} Similarly, to iterate over all atoms in a chain, use \begin{verbatim} >>> atoms = chain.get_atoms() >>> for atom in atoms: ... print(atom) ... \end{verbatim} \subsubsection*{Iterating over all residues of a model} or if you want to iterate over all residues in a model: \begin{verbatim} >>> residues = model.get_residues() >>> for residue in residues: ... print(residue) ... \end{verbatim} You can also use the \verb+Selection.unfold_entities+ function to get all residues from a structure: \begin{verbatim} >>> res_list = Selection.unfold_entities(structure, 'R') \end{verbatim} or to get all atoms from a chain: \begin{verbatim} >>> atom_list = Selection.unfold_entities(chain, 'A') \end{verbatim} Obviously, \verb+A=atom, R=residue, C=chain, M=model, S=structure+. You can use this to go up in the hierarchy, e.g. to get a list of (unique) \verb+Residue+ or \verb+Chain+ parents from a list of \verb+Atoms+: \begin{verbatim} >>> residue_list = Selection.unfold_entities(atom_list, 'R') >>> chain_list = Selection.unfold_entities(atom_list, 'C') \end{verbatim} For more info, see the API documentation. \subsubsection*{Extract a hetero residue from a chain (e.g. a glucose (GLC) moiety with resseq 10)} \begin{verbatim} >>> residue_id = ("H_GLC", 10, " ") >>> residue = chain[residue_id] \end{verbatim} \subsubsection*{Print all hetero residues in chain} \begin{verbatim} >>> for residue in chain.get_list(): ... residue_id = residue.get_id() ... hetfield = residue_id[0] ... if hetfield[0]=="H": ... print(residue_id) ... \end{verbatim} \subsubsection*{Print out the coordinates of all CA atoms in a structure with B factor greater than 50} \begin{verbatim} >>> for model in structure.get_list(): ... for chain in model.get_list(): ... for residue in chain.get_list(): ... if residue.has_id("CA"): ... ca = residue["CA"] ... if ca.get_bfactor() > 50.0: ... print(ca.get_coord()) ... \end{verbatim} \subsubsection*{Print out all the residues that contain disordered atoms} \begin{verbatim} >>> for model in structure.get_list(): ... for chain in model.get_list(): ... for residue in chain.get_list(): ... if residue.is_disordered(): ... resseq = residue.get_id()[1] ... resname = residue.get_resname() ... model_id = model.get_id() ... chain_id = chain.get_id() ... print(model_id, chain_id, resname, resseq) ... \end{verbatim} \subsubsection*{Loop over all disordered atoms, and select all atoms with altloc A (if present)} This will make sure that the SMCRA data structure will behave as if only the atoms with altloc A are present. \begin{verbatim} >>> for model in structure.get_list(): ... for chain in model.get_list(): ... for residue in chain.get_list(): ... if residue.is_disordered(): ... for atom in residue.get_list(): ... if atom.is_disordered(): ... if atom.disordered_has_id("A"): ... atom.disordered_select("A") ... \end{verbatim} \subsubsection*{Extracting polypeptides from a \texttt{Structure} object\label{subsubsec:extracting_polypeptides}} To extract polypeptides from a structure, construct a list of \texttt{Polypeptide} objects from a \texttt{Structure} object using \texttt{PolypeptideBuilder} as follows: \begin{verbatim} >>> model_nr = 1 >>> polypeptide_list = build_peptides(structure, model_nr) >>> for polypeptide in polypeptide_list: ... print(polypeptide) ... \end{verbatim} A Polypeptide object is simply a UserList of Residue objects, and is always created from a single Model (in this case model 1). You can use the resulting \texttt{Polypeptide} object to get the sequence as a \texttt{Seq} object or to get a list of C$\alpha$ atoms as well. Polypeptides can be built using a C-N or a C$\alpha$-C$\alpha$ distance criterion. Example: \begin{verbatim} # Using C-N >>> ppb=PPBuilder() >>> for pp in ppb.build_peptides(structure): ... print(pp.get_sequence()) ... # Using CA-CA >>> ppb=CaPPBuilder() >>> for pp in ppb.build_peptides(structure): ... print(pp.get_sequence()) ... \end{verbatim} Note that in the above case only model 0 of the structure is considered by \texttt{PolypeptideBuilder}. However, it is possible to use \texttt{PolypeptideBuilder} to build \texttt{Polypeptide} objects from \texttt{Model} and \texttt{Chain} objects as well. \subsubsection*{Obtaining the sequence of a structure} The first thing to do is to extract all polypeptides from the structure (as above). The sequence of each polypeptide can then easily be obtained from the \texttt{Polypeptide} objects. The sequence is represented as a Biopython \texttt{Seq} object, and its alphabet is defined by a \texttt{ProteinAlphabet} object. Example: \begin{verbatim} >>> seq = polypeptide.get_sequence() >>> print(seq) Seq('SNVVE...', ) \end{verbatim} \section{Analyzing structures} \subsection{Measuring distances} The minus operator for atoms has been overloaded to return the distance between two atoms. \begin{verbatim} # Get some atoms >>> ca1 = residue1['CA'] >>> ca2 = residue2['CA'] # Simply subtract the atoms to get their distance >>> distance = ca1-ca2 \end{verbatim} \subsection{Measuring angles} Use the vector representation of the atomic coordinates, and the \texttt{calc\_angle} function from the \texttt{Vector} module: \begin{verbatim} >>> vector1 = atom1.get_vector() >>> vector2 = atom2.get_vector() >>> vector3 = atom3.get_vector() >>> angle = calc_angle(vector1, vector2, vector3) \end{verbatim} \subsection{Measuring torsion angles} Use the vector representation of the atomic coordinates, and the \texttt{calc\_dihedral} function from the \texttt{Vector} module: \begin{verbatim} >>> vector1 = atom1.get_vector() >>> vector2 = atom2.get_vector() >>> vector3 = atom3.get_vector() >>> vector4 = atom4.get_vector() >>> angle = calc_dihedral(vector1, vector2, vector3, vector4) \end{verbatim} \subsection{Determining atom-atom contacts} Use \texttt{NeighborSearch} to perform neighbor lookup. The neighbor lookup is done using a KD tree module written in C (see \texttt{Bio.KDTree}), making it very fast. It also includes a fast method to find all point pairs within a certain distance of each other. \subsection{Superimposing two structures} Use a \texttt{Superimposer} object to superimpose two coordinate sets. This object calculates the rotation and translation matrix that rotates two lists of atoms on top of each other in such a way that their RMSD is minimized. Of course, the two lists need to contain the same number of atoms. The \texttt{Superimposer} object can also apply the rotation/translation to a list of atoms. The rotation and translation are stored as a tuple in the \texttt{rotran} attribute of the \texttt{Superimposer} object (note that the rotation is right multiplying!). The RMSD is stored in the \texttt{rmsd} attribute. The algorithm used by \texttt{Superimposer} comes from \cite[Golub \& Van Loan]{golub1989} and makes use of singular value decomposition (this is implemented in the general \texttt{Bio.SVDSuperimposer} module). Example: \begin{verbatim} >>> sup = Superimposer() # Specify the atom lists # 'fixed' and 'moving' are lists of Atom objects # The moving atoms will be put on the fixed atoms >>> sup.set_atoms(fixed, moving) # Print rotation/translation/rmsd >>> print(sup.rotran) >>> print(sup.rms) # Apply rotation/translation to the moving atoms >>> sup.apply(moving) \end{verbatim} To superimpose two structures based on their active sites, use the active site atoms to calculate the rotation/translation matrices (as above), and apply these to the whole molecule. \subsection{Mapping the residues of two related structures onto each other} First, create an alignment file in FASTA format, then use the \texttt{StructureAlignment} class. This class can also be used for alignments with more than two structures. \subsection{Calculating the Half Sphere Exposure} Half Sphere Exposure (HSE) is a new, 2D measure of solvent exposure \cite{hamelryck2005}. Basically, it counts the number of C$\alpha$ atoms around a residue in the direction of its side chain, and in the opposite direction (within a radius of $13 \AA$). Despite its simplicity, it outperforms many other measures of solvent exposure. HSE comes in two flavors: HSE$\alpha$ and HSE$\beta$. The former only uses the C$\alpha$ atom positions, while the latter uses the C$\alpha$ and C$\beta$ atom positions. The HSE measure is calculated by the \texttt{HSExposure} class, which can also calculate the contact number. The latter class has methods which return dictionaries that map a \texttt{Residue} object to its corresponding HSE$\alpha$, HSE$\beta$ and contact number values. Example: \begin{verbatim} >>> model = structure[0] >>> hse = HSExposure() # Calculate HSEalpha >>> exp_ca = hse.calc_hs_exposure(model, option='CA3') # Calculate HSEbeta >>> exp_cb=hse.calc_hs_exposure(model, option='CB') # Calculate classical coordination number >>> exp_fs = hse.calc_fs_exposure(model) # Print HSEalpha for a residue >>> print(exp_ca[some_residue]) \end{verbatim} \subsection{Determining the secondary structure} For this functionality, you need to install DSSP (and obtain a license for it --- free for academic use, see \url{http://www.cmbi.kun.nl/gv/dssp/}). Then use the \texttt{DSSP} class, which maps \texttt{Residue} objects to their secondary structure (and accessible surface area). The DSSP codes are listed in Table \ref{cap:DSSP-codes}. Note that DSSP (the program, and thus by consequence the class) cannot handle multiple models! \begin{table} \begin{tabular}{|c|c|} \hline Code& Secondary structure \\ \hline \hline H& $\alpha$-helix \\ \hline B& Isolated $\beta$-bridge residue \\ \hline E& Strand \\ \hline G& 3-10 helix \\ \hline I& $\Pi$-helix \\ \hline T& Turn\\ \hline S& Bend \\ \hline -& Other\\ \hline \end{tabular} \caption{\label{cap:DSSP-codes}DSSP codes in Bio.PDB.} \end{table} The \texttt{DSSP} class can also be used to calculate the accessible surface area of a residue. But see also section \ref{subsec:residue_depth}. \subsection{Calculating the residue depth\label{subsec:residue_depth}} Residue depth is the average distance of a residue's atoms from the solvent accessible surface. It's a fairly new and very powerful parameterization of solvent accessibility. For this functionality, you need to install Michel Sanner's MSMS program (\url{http://www.scripps.edu/pub/olson-web/people/sanner/html/msms_home.html}). Then use the \texttt{ResidueDepth} class. This class behaves as a dictionary which maps \texttt{Residue} objects to corresponding (residue depth, C$\alpha$ depth) tuples. The C$\alpha$ depth is the distance of a residue's C$\alpha$ atom to the solvent accessible surface. Example: \begin{verbatim} >>> model = structure[0] >>> rd = ResidueDepth(model, pdb_file) >>> residue_depth, ca_depth=rd[some_residue] \end{verbatim} You can also get access to the molecular surface itself (via the \texttt{get\_surface} function), in the form of a Numeric Python array with the surface points. \section{Common problems in PDB files} It is well known that many PDB files contain semantic errors (not the structures themselves, but their representation in PDB files). Bio.PDB tries to handle this in two ways. The PDBParser object can behave in two ways: a restrictive way and a permissive way, which is the default. Example: \begin{verbatim} # Permissive parser >>> parser = PDBParser(PERMISSIVE=1) >>> parser = PDBParser() # The same (default) # Strict parser >>> strict_parser = PDBParser(PERMISSIVE=0) \end{verbatim} In the permissive state (DEFAULT), PDB files that obviously contain errors are ``corrected'' (i.e. some residues or atoms are left out). These errors include: \begin{itemize} \item Multiple residues with the same identifier \item Multiple atoms with the same identifier (taking into account the altloc identifier) \end{itemize} These errors indicate real problems in the PDB file (for details see \cite[Hamelryck and Manderick, 2003]{hamelryck2003a}). In the restrictive state, PDB files with errors cause an exception to occur. This is useful to find errors in PDB files. Some errors however are automatically corrected. Normally each disordered atom should have a non-blank altloc identifier. However, there are many structures that do not follow this convention, and have a blank and a non-blank identifier for two disordered positions of the same atom. This is automatically interpreted in the right way. Sometimes a structure contains a list of residues belonging to chain A, followed by residues belonging to chain B, and again followed by residues belonging to chain A, i.e. the chains are 'broken'. This is also correctly interpreted. \subsection{Examples\label{problem structures}} The PDBParser/Structure class was tested on about 800 structures (each belonging to a unique SCOP superfamily). This takes about 20 minutes, or on average 1.5 seconds per structure. Parsing the structure of the large ribosomal subunit (1FKK), which contains about 64000 atoms, takes 10 seconds on a 1000 MHz PC. Three exceptions were generated in cases where an unambiguous data structure could not be built. In all three cases, the likely cause is an error in the PDB file that should be corrected. Generating an exception in these cases is much better than running the chance of incorrectly describing the structure in a data structure. \subsubsection{Duplicate residues} One structure contains two amino acid residues in one chain with the same sequence identifier (resseq 3) and icode. Upon inspection it was found that this chain contains the residues Thr A3, \ldots, Gly A202, Leu A3, Glu A204. Clearly, Leu A3 should be Leu A203. A couple of similar situations exist for structure 1FFK (which e.g. contains Gly B64, Met B65, Glu B65, Thr B67, i.e. residue Glu B65 should be Glu B66). \subsubsection{Duplicate atoms} Structure 1EJG contains a Ser/Pro point mutation in chain A at position 22. In turn, Ser 22 contains some disordered atoms. As expected, all atoms belonging to Ser 22 have a non-blank altloc specifier (B or C). All atoms of Pro 22 have altloc A, except the N atom which has a blank altloc. This generates an exception, because all atoms belonging to two residues at a point mutation should have non-blank altloc. It turns out that this atom is probably shared by Ser and Pro 22, as Ser 22 misses the N atom. Again, this points to a problem in the file: the N atom should be present in both the Ser and the Pro residue, in both cases associated with a suitable altloc identifier. \subsection{Automatic correction} Some errors are quite common and can be easily corrected without much risk of making a wrong interpretation. These cases are listed below. \subsubsection{A blank altloc for a disordered atom} Normally each disordered atom should have a non-blank altloc identifier. However, there are many structures that do not follow this convention, and have a blank and a non-blank identifier for two disordered positions of the same atom. This is automatically interpreted in the right way. \subsubsection{Broken chains} Sometimes a structure contains a list of residues belonging to chain A, followed by residues belonging to chain B, and again followed by residues belonging to chain A, i.e. the chains are ``broken''. This is correctly interpreted. \subsection{Fatal errors} Sometimes a PDB file cannot be unambiguously interpreted. Rather than guessing and risking a mistake, an exception is generated, and the user is expected to correct the PDB file. These cases are listed below. \subsubsection{Duplicate residues} All residues in a chain should have a unique id. This id is generated based on: \begin{itemize} \item The sequence identifier (resseq). \item The insertion code (icode). \item The hetfield string (``W'' for waters and ``H\_'' followed by the residue name for other hetero residues) \item The residue names of the residues in the case of point mutations (to store the Residue objects in a DisorderedResidue object). \end{itemize} If this does not lead to a unique id something is quite likely wrong, and an exception is generated. \subsubsection{Duplicate atoms} All atoms in a residue should have a unique id. This id is generated based on: \begin{itemize} \item The atom name (without spaces, or with spaces if a problem arises). \item The altloc specifier. \end{itemize} If this does not lead to a unique id something is quite likely wrong, and an exception is generated. \section{Accessing the Protein Data Bank} \subsection{Downloading structures from the Protein Data Bank} Structures can be downloaded from the PDB (Protein Data Bank) by using the \texttt{retrieve\_pdb\_file} method on a \texttt{PDBList} object. The argument for this method is the PDB identifier of the structure. \begin{verbatim} >>> pdbl = PDBList() >>> pdbl.retrieve_pdb_file('1FAT') \end{verbatim} The \texttt{PDBList} class can also be used as a command-line tool: \begin{verbatim} python PDBList.py 1fat \end{verbatim} The downloaded file will be called \texttt{pdb1fat.ent} and stored in the current working directory. Note that the \texttt{retrieve\_pdb\_file} method also has an optional argument \texttt{pdir} that specifies a specific directory in which to store the downloaded PDB files. The \texttt{retrieve\_pdb\_file} method also has some options to specify the compression format used for the download, and the program used for local decompression (default \texttt{.Z} format and \texttt{gunzip}). In addition, the PDB ftp site can be specified upon creation of the \texttt{PDBList} object. By default, the server of the Worldwide Protein Data Bank (\url{ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/}) is used. See the API documentation for more details. Thanks again to Kristian Rother for donating this module. \subsection{Downloading the entire PDB} The following commands will store all PDB files in the \texttt{/data/pdb} directory: \begin{verbatim} python PDBList.py all /data/pdb python PDBList.py all /data/pdb -d \end{verbatim} \noindent The API method for this is called \texttt{download\_entire\_pdb}. Adding the \texttt{-d} option will store all files in the same directory. Otherwise, they are sorted into PDB-style subdirectories according to their PDB ID's. Depending on the traffic, a complete download will take 2-4 days. \subsection{Keeping a local copy of the PDB up to date} This can also be done using the \texttt{PDBList} object. One simply creates a \texttt{PDBList} object (specifying the directory where the local copy of the PDB is present) and calls the \texttt{update\_pdb} method: \begin{verbatim} >>> pl = PDBList(pdb='/data/pdb') >>> pl.update_pdb() \end{verbatim} One can of course make a weekly \texttt{cronjob} out of this to keep the local copy automatically up-to-date. The PDB ftp site can also be specified (see API documentation). \texttt{PDBList} has some additional methods that can be of use. The \texttt{get\_all\_obsolete} method can be used to get a list of all obsolete PDB entries. The \texttt{changed\_this\_week} method can be used to obtain the entries that were added, modified or obsoleted during the current week. For more info on the possibilities of \texttt{PDBList}, see the API documentation. \section{General questions} \subsection{How well tested is Bio.PDB?} Pretty well, actually. Bio.PDB has been extensively tested on nearly 5500 structures from the PDB - all structures seemed to be parsed correctly. More details can be found in the Bio.PDB Bioinformatics article. Bio.PDB has been used/is being used in many research projects as a reliable tool. In fact, I'm using Bio.PDB almost daily for research purposes and continue working on improving it and adding new features. \subsection{How fast is it?} The \texttt{PDBParser} performance was tested on about 800 structures (each belonging to a unique SCOP superfamily). This takes about 20 minutes, or on average 1.5 seconds per structure. Parsing the structure of the large ribosomal subunit (1FKK), which contains about 64000 atoms, takes 10 seconds on a 1000 MHz PC. In short: it's more than fast enough for many applications. \subsection{Is there support for molecular graphics?} Not directly, mostly since there are quite a few Python based/Python aware solutions already, that can potentially be used with Bio.PDB. My choice is Pymol, BTW (I've used this successfully with Bio.PDB, and there will probably be specific PyMol modules in Bio.PDB soon/some day). Python based/aware molecular graphics solutions include: \begin{itemize} \item PyMol: \url{http://pymol.sourceforge.net/} \item Chimera: \url{http://www.cgl.ucsf.edu/chimera/} \item PMV: \url{http://www.scripps.edu/~sanner/python/} \item Coot: \url{http://www.ysbl.york.ac.uk/~emsley/coot/} \item CCP4mg: \url{http://www.ysbl.york.ac.uk/~lizp/molgraphics.html} \item mmLib: \url{http://pymmlib.sourceforge.net/} \item VMD: \url{http://www.ks.uiuc.edu/Research/vmd/} \item MMTK: \url{http://starship.python.net/crew/hinsen/MMTK/} \end{itemize} \subsection{Who's using Bio.PDB?} Bio.PDB was used in the construction of DISEMBL, a web server that predicts disordered regions in proteins (\url{http://dis.embl.de/}), and COLUMBA, a website that provides annotated protein structures (\url{http://www.columba-db.de/}). Bio.PDB has also been used to perform a large scale search for active sites similarities between protein structures in the PDB \cite[Hamelryck, 2003]{hamelryck2003b}, and to develop a new algorithm that identifies linear secondary structure elements \cite[Majumdar \textit{et al.}, 2005]{majumdar2005}. Judging from requests for features and information, Bio.PDB is also used by several LPCs (Large Pharmaceutical Companies :-). % Perhaps this section should be updated for other Biopython modules, and % moved to the Biopython FAQ above. \chapter{Bio.PopGen: Population genetics} Bio.PopGen is a Biopython module supporting population genetics, available in Biopython 1.44 onwards. The medium term objective for the module is to support widely used data formats, applications and databases. This module is currently under intense development and support for new features should appear at a rather fast pace. Unfortunately this might also entail some instability on the API, especially if you are using a development version. APIs that are made available on our official public releases should be much more stable. \section{GenePop} GenePop (\url{http://genepop.curtin.edu.au/}) is a popular population genetics software package supporting Hardy-Weinberg tests, linkage desiquilibrium, population diferentiation, basic statistics, $F_{st}$ and migration estimates, among others. GenePop does not supply sequence based statistics as it doesn't handle sequence data. The GenePop file format is supported by a wide range of other population genetic software applications, thus making it a relevant format in the population genetics field. Bio.PopGen provides a parser and generator of GenePop file format. Utilities to manipulate the content of a record are also provided. Here is an example on how to read a GenePop file (you can find example GenePop data files in the Test/PopGen directory of Biopython): \begin{verbatim} from Bio.PopGen import GenePop handle = open("example.gen") rec = GenePop.read(handle) handle.close() \end{verbatim} This will read a file called example.gen and parse it. If you do print rec, the record will be output again, in GenePop format. The most important information in rec will be the loci names and population information (but there is more -- use help(GenePop.Record) to check the API documentation). Loci names can be found on rec.loci\_list. Population information can be found on rec.populations. Populations is a list with one element per population. Each element is itself a list of individuals, each individual is a pair composed by individual name and a list of alleles (2 per marker), here is an example for rec.populations: \begin{verbatim} [ [ ('Ind1', [(1, 2), (3, 3), (200, 201)], ('Ind2', [(2, None), (3, 3), (None, None)], ], [ ('Other1', [(1, 1), (4, 3), (200, 200)], ] ] \end{verbatim} So we have two populations, the first with two individuals, the second with only one. The first individual of the first population is called Ind1, allelic information for each of the 3 loci follows. Please note that for any locus, information might be missing (see as an example, Ind2 above). A few utility functions to manipulate GenePop records are made available, here is an example: \begin{verbatim} from Bio.PopGen import GenePop #Imagine that you have loaded rec, as per the code snippet above... rec.remove_population(pos) #Removes a population from a record, pos is the population position in # rec.populations, remember that it starts on position 0. # rec is altered. rec.remove_locus_by_position(pos) #Removes a locus by its position, pos is the locus position in # rec.loci_list, remember that it starts on position 0. # rec is altered. rec.remove_locus_by_name(name) #Removes a locus by its name, name is the locus name as in # rec.loci_list. If the name doesn't exist the function fails # silently. # rec is altered. rec_loci = rec.split_in_loci() #Splits a record in loci, that is, for each loci, it creates a new # record, with a single loci and all populations. # The result is returned in a dictionary, being each key the locus name. # The value is the GenePop record. # rec is not altered. rec_pops = rec.split_in_pops(pop_names) #Splits a record in populations, that is, for each population, it creates # a new record, with a single population and all loci. # The result is returned in a dictionary, being each key # the population name. As population names are not available in GenePop, # they are passed in array (pop_names). # The value of each dictionary entry is the GenePop record. # rec is not altered. \end{verbatim} GenePop does not support population names, a limitation which can be cumbersome at times. Functionality to enable population names is currently being planned for Biopython. These extensions won't break compatibility in any way with the standard format. In the medium term, we would also like to support the GenePop web service. \section{Coalescent simulation} A coalescent simulation is a backward model of population genetics with relation to time. A simulation of ancestry is done until the Most Recent Common Ancestor (MRCA) is found. This ancestry relationship starting on the MRCA and ending on the current generation sample is sometimes called a genealogy. Simple cases assume a population of constant size in time, haploidy, no population structure, and simulate the alleles of a single locus under no selection pressure. Coalescent theory is used in many fields like selection detection, estimation of demographic parameters of real populations or disease gene mapping. The strategy followed in the Biopython implementation of the coalescent was not to create a new, built-in, simulator from scratch but to use an existing one, SIMCOAL2 (\url{http://cmpg.unibe.ch/software/simcoal2/}). SIMCOAL2 allows for, among others, population structure, multiple demographic events, simulation of multiple types of loci (SNPs, sequences, STRs/microsatellites and RFLPs) with recombination, diploidy multiple chromosomes or ascertainment bias. Notably SIMCOAL2 doesn't support any selection model. We recommend reading SIMCOAL2's documentation, available in the link above. The input for SIMCOAL2 is a file specifying the desired demography and genome, the output is a set of files (typically around 1000) with the simulated genomes of a sample of individuals per subpopulation. This set of files can be used in many ways, like to compute confidence intervals where which certain statistics (e.g., $F_{st}$ or Tajima D) are expected to lie. Real population genetics datasets statistics can then be compared to those confidence intervals. Biopython coalescent code allows to create demographic scenarios and genomes and to run SIMCOAL2. \subsection{Creating scenarios} Creating a scenario involves both creating a demography and a chromosome structure. In many cases (e.g. when doing Approximate Bayesian Computations -- ABC) it is important to test many parameter variations (e.g. vary the effective population size, $N_e$, between 10, 50, 500 and 1000 individuals). The code provided allows for the simulation of scenarios with different demographic parameters very easily. Below we see how we can create scenarios and then how simulate them. \subsubsection{Demography} A few predefined demographies are built-in, all have two shared parameters: sample size (called sample\_size on the template, see below for its use) per deme and deme size, i.e. subpopulation size (pop\_size). All demographies are available as templates where all parameters can be varied, each template has a system name. The prefedined demographies/templates are: \begin{description} \item[Single population, constant size] The standard parameters are enough to specify it. Template name: simple. \item[Single population, bottleneck] As seen on figure \ref{fig:bottle}. The parameters are current population size (pop\_size on template ne3 on figure), time of expansion, given as the generation in the past when it occurred (expand\_gen), effective population size during bottleneck (ne2), time of contraction (contract\_gen) and original size in the remote past (ne3). Template name: bottle. \item[Island model] The typical island model. The total number of demes is specified by total\_demes and the migration rate by mig. Template name island. \item[Stepping stone model - 1 dimension] The stepping stone model in 1 dimension, extremes disconnected. The total number of demes is total\_demes, migration rate is mig. Template name is ssm\_1d. \item[Stepping stone model - 2 dimensions] The stepping stone model in 2 dimensions, extremes disconnected. The parameters are x for the horizontal dimension and y for the vertical (being the total number of demes x times y), migration rate is mig. Template name is ssm\_2d. \end{description} \begin{htmlonly} \label{fig:bottle} \imgsrc{images/bottle.png} \end{htmlonly} \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics{images/bottle.png} \caption{A bottleneck} \label{fig:bottle} \end{figure} \end{latexonly} In our first example, we will generate a template for a single population, constant size model with a sample size of 30 and a deme size of 500. The code for this is: \begin{verbatim} from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template generate_simcoal_from_template('simple', [(1, [('SNP', [24, 0.0005, 0.0])])], [('sample_size', [30]), ('pop_size', [100])]) \end{verbatim} Executing this code snippet will generate a file on the current directory called simple\_100\_300.par this file can be given as input to SIMCOAL2 to simulate the demography (below we will see how Biopython can take care of calling SIMCOAL2). This code consists of a single function call, let's discuss it parameter by parameter. The first parameter is the template id (from the list above). We are using the id 'simple' which is the template for a single population of constant size along time. The second parameter is the chromosome structure. Please ignore it for now, it will be explained in the next section. The third parameter is a list of all required parameters (recall that the simple model only needs sample\_size and pop\_size) and possible values (in this case each parameter only has a possible value). Now, let's consider an example where we want to generate several island models, and we are interested in varying the number of demes: 10, 50 and 100 with a migration rate of 1\%. Sample size and deme size will be the same as before. Here is the code: \begin{verbatim} from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template generate_simcoal_from_template('island', [(1, [('SNP', [24, 0.0005, 0.0])])], [('sample_size', [30]), ('pop_size', [100]), ('mig', [0.01]), ('total_demes', [10, 50, 100])]) \end{verbatim} In this case, 3 files will be generated: island\_100\_0.01\_100\_30.par, island\_10\_0.01\_100\_30.par and island\_50\_0.01\_100\_30.par. Notice the rule to make file names: template name, followed by parameter values in reverse order. A few, arguably more esoteric template demographies exist (please check the Bio/PopGen/SimCoal/data directory on Biopython source tree). Furthermore it is possible for the user to create new templates. That functionality will be discussed in a future version of this document. \subsubsection{Chromosome structure} We strongly recommend reading SIMCOAL2 documentation to understand the full potential available in modeling chromosome structures. In this subsection we only discuss how to implement chromosome structures using the Biopython interface, not the underlying SIMCOAL2 capabilities. We will start by implementing a single chromosome, with 24 SNPs with a recombination rate immediately on the right of each locus of 0.0005 and a minimum frequency of the minor allele of 0. This will be specified by the following list (to be passed as second parameter to the function generate\_simcoal\_from\_template): \begin{verbatim} [(1, [('SNP', [24, 0.0005, 0.0])])] \end{verbatim} This is actually the chromosome structure used in the above examples. The chromosome structure is represented by a list of chromosomes, each chromosome (i.e., each element in the list) is composed by a tuple (a pair): the first element is the number of times the chromosome is to be repeated (as there might be interest in repeating the same chromosome many times). The second element is a list of the actual components of the chromosome. Each element is again a pair, the first member is the locus type and the second element the parameters for that locus type. Confused? Before showing more examples let's review the example above: We have a list with one element (thus one chromosome), the chromosome is a single instance (therefore not to be repeated), it is composed of 24 SNPs, with a recombination rate of 0.0005 between each consecutive SNP, the minimum frequency of the minor allele is 0.0 (i.e, it can be absent from a certain population). Let's see a more complicated example: \begin{verbatim} [ (5, [ ('SNP', [24, 0.0005, 0.0]) ] ), (2, [ ('DNA', [10, 0.0, 0.00005, 0.33]), ('RFLP', [1, 0.0, 0.0001]), ('MICROSAT', [1, 0.0, 0.001, 0.0, 0.0]) ] ) ] \end{verbatim} We start by having 5 chromosomes with the same structure as above (i.e., 24 SNPs). We then have 2 chromosomes which have a DNA sequence with 10 nucleotides, 0.0 recombination rate, 0.0005 mutation rate, and a transition rate of 0.33. Then we have an RFLP with 0.0 recombination rate to the next locus and a 0.0001 mutation rate. Finally we have a microsatellite (or STR), with 0.0 recombination rate to the next locus (note, that as this is a single microsatellite which has no loci following, this recombination rate here is irrelevant), with a mutation rate of 0.001, geometric parameter of 0.0 and a range constraint of 0.0 (for information about this parameters please consult the SIMCOAL2 documentation, you can use them to simulate various mutation models, including the typical -- for microsatellites -- stepwise mutation model among others). \subsection{Running SIMCOAL2} We now discuss how to run SIMCOAL2 from inside Biopython. It is required that the binary for SIMCOAL2 is called simcoal2 (or simcoal2.exe on Windows based platforms), please note that the typical name when downloading the program is in the format simcoal2\_x\_y. As such, when installing SIMCOAL2 you will need to rename of the downloaded executable so that Biopython can find it. It is possible to run SIMCOAL2 on files that were not generated using the method above (e.g., writing a parameter file by hand), but we will show an example by creating a model using the framework presented above. \begin{verbatim} from Bio.PopGen.SimCoal.Template import generate_simcoal_from_template from Bio.PopGen.SimCoal.Controller import SimCoalController generate_simcoal_from_template('simple', [ (5, [ ('SNP', [24, 0.0005, 0.0]) ] ), (2, [ ('DNA', [10, 0.0, 0.00005, 0.33]), ('RFLP', [1, 0.0, 0.0001]), ('MICROSAT', [1, 0.0, 0.001, 0.0, 0.0]) ] ) ], [('sample_size', [30]), ('pop_size', [100])]) ctrl = SimCoalController('.') ctrl.run_simcoal('simple_100_30.par', 50) \end{verbatim} The lines of interest are the last two (plus the new import). Firstly a controller for the application is created. The directory where the binary is located has to be specified. The simulator is then run on the last line: we know, from the rules explained above, that the input file name is simple\_100\_30.par for the simulation parameter file created. We then specify that we want to run 50 independent simulations, by default Biopython requests a simulation of diploid data, but a third parameter can be added to simulate haploid data (adding as a parameter the string '0'). SIMCOAL2 will now run (please note that this can take quite a lot of time) and will create a directory with the simulation results. The results can now be analysed (typically studying the data with Arlequin3). In the future Biopython might support reading the Arlequin3 format and thus allowing for the analysis of SIMCOAL2 data inside Biopython. \section{Other applications} Here we discuss interfaces and utilities to deal with population genetics' applications which arguably have a smaller user base. \subsection{FDist: Detecting selection and molecular adaptation} FDist is a selection detection application suite based on computing (i.e. simulating) a ``neutral'' confidence interval based on $F_{st}$ and heterozygosity. Markers (which can be SNPs, microsatellites, AFLPs among others) which lie outside the ``neutral'' interval are to be considered as possible candidates for being under selection. FDist is mainly used when the number of markers is considered enough to estimate an average $F_{st}$, but not enough to either have outliers calculated from the dataset directly or, with even more markers for which the relative positions in the genome are known, to use approaches based on, e.g., Extended Haplotype Heterozygosity (EHH). The typical usage pattern for FDist is as follows: \begin{enumerate} \item Import a dataset from an external format into FDist format. \item Compute average $F_{st}$. This is done by datacal inside FDist. \item Simulate ``neutral'' markers based on the average $F_{st}$ and expected number of total populations. This is the core operation, done by fdist inside FDist. \item Calculate the confidence interval, based on the desired confidence boundaries (typically 95\% or 99\%). This is done by cplot and is mainly used to plot the interval. \item Assess each marker status against the simulation ``neutral'' confidence interval. Done by pv. This is used to detect the outlier status of each marker against the simulation. \end{enumerate} We will now discuss each step with illustrating example code (for this example to work FDist binaries have to be on the executable PATH). The FDist data format is application specific and is not used at all by other applications, as such you will probably have to convert your data for use with FDist. Biopython can help you do this. Here is an example converting from GenePop format to FDist format (along with imports that will be needed on examples further below): \begin{verbatim} from Bio.PopGen import GenePop from Bio.PopGen import FDist from Bio.PopGen.FDist import Controller from Bio.PopGen.FDist.Utils import convert_genepop_to_fdist gp_rec = GenePop.read(open("example.gen")) fd_rec = convert_genepop_to_fdist(gp_rec) in_file = open("infile", "w") in_file.write(str(fd_rec)) in_file.close() \end{verbatim} In this code we simply parse a GenePop file and convert it to a FDist record. Printing an FDist record will generate a string that can be directly saved to a file and supplied to FDist. FDist requires the input file to be called infile, therefore we save the record on a file with that name. The most important fields on a FDist record are: num\_pops, the number of populations; num\_loci, the number of loci and loci\_data with the marker data itself. Most probably the details of the record are of no interest to the user, as the record only purpose is to be passed to FDist. The next step is to calculate the average $F_{st}$ of the dataset (along with the sample size): \begin{verbatim} ctrl = Controller.FDistController() fst, samp_size = ctrl.run_datacal() \end{verbatim} On the first line we create an object to control the call of FDist suite, this object will be used further on in order to call other suite applications. On the second line we call the datacal application which computes the average $F_{st}$ and the sample size. It is worth noting that the $F_{st}$ computed by datacal is a \emph{variation} of Weir and Cockerham's $\theta$. We can now call the main fdist application in order to simulate neutral markers. \begin{verbatim} sim_fst = ctrl.run_fdist(npops = 15, nsamples = fd_rec.num_pops, fst = fst, sample_size = samp_size, mut = 0, num_sims = 40000) \end{verbatim} \begin{description} \item[npops] Number of populations existing in nature. This is really a ``guestimate''. Has to be lower than 100. \item[nsamples] Number of populations sampled, has to be lower than npops. \item[fst] Average $F_{st}$. \item[sample\_size] Average number of individuals sampled on each population. \item[mut] Mutation model: 0 - Infinite alleles; 1 - Stepwise mutations \item[num\_sims] Number of simulations to perform. Typically a number around 40000 will be OK, but if you get a confidence interval that looks sharp (this can be detected when plotting the confidence interval computed below) the value can be increased (a suggestion would be steps of 10000 simulations). \end{description} The confusion in wording between number of samples and sample size stems from the original application. A file named out.dat will be created with the simulated heterozygosities and $F_{st}$s, it will have as many lines as the number of simulations requested. Note that fdist returns the average $F_{st}$ that it was \emph{capable} of simulating, for more details about this issue please read below the paragraph on approximating the desired average $F_{st}$. The next (optional) step is to calculate the confidence interval: \begin{verbatim} cpl_interval = ctrl.run_cplot(ci=0.99) \end{verbatim} You can only call cplot after having run fdist. This will calculate the confidence intervals (99\% in this case) for a previous fdist run. A list of quadruples is returned. The first element represents the heterozygosity, the second the lower bound of $F_{st}$ confidence interval for that heterozygosity, the third the average and the fourth the upper bound. This can be used to trace the confidence interval contour. This list is also written to a file, out.cpl. The main purpose of this step is return a set of points which can be easily used to plot a confidence interval. It can be skipped if the objective is only to assess the status of each marker against the simulation, which is the next step... \begin{verbatim} pv_data = ctrl.run_pv() \end{verbatim} You can only call cplot after having run datacal and fdist. This will use the simulated markers to assess the status of each individual real marker. A list, in the same order than the loci\_list that is on the FDist record (which is in the same order that the GenePop record) is returned. Each element in the list is a quadruple, the fundamental member of each quadruple is the last element (regarding the other elements, please refer to the pv documentation -- for the sake of simplicity we will not discuss them here) which returns the probability of the simulated $F_{st}$ being lower than the marker $F_{st}$. Higher values would indicate a stronger candidate for positive selection, lower values a candidate for balancing selection, and intermediate values a possible neutral marker. What is ``higher'', ``lower'' or ``intermediate'' is really a subjective issue, but taking a ``confidence interval'' approach and considering a 95\% confidence interval, ``higher'' would be between 0.95 and 1.0, ``lower'' between 0.0 and 0.05 and ``intermediate'' between 0.05 and 0.95. \subsubsection{Approximating the desired average $F_{st}$} Fdist tries to approximate the desired average $F_{st}$ by doing a coalescent simulation using migration rates based on the formula \[ N_{m} = \frac{1 - F_{st}}{4F_{st}} \] This formula assumes a few premises like an infinite number of populations. In practice, when the number of populations is low, the mutation model is stepwise and the sample size increases, fdist will not be able to simulate an acceptable approximate average $F_{st}$. To address that, a function is provided to iteratively approach the desired value by running several fdists in sequence. This approach is computationally more intensive than running a single fdist run, but yields good results. The following code runs fdist approximating the desired $F_{st}$: \begin{verbatim} sim_fst = ctrl.run_fdist_force_fst(npops = 15, nsamples = fd_rec.num_pops, fst = fst, sample_size = samp_size, mut = 0, num_sims = 40000, limit = 0.05) \end{verbatim} The only new optional parameter, when comparing with run\_fdist, is limit which is the desired maximum error. run\_fdist can (and probably should) be safely replaced with run\_fdist\_force\_fst. \subsubsection{Final notes} The process to determine the average $F_{st}$ can be more sophisticated than the one presented here. For more information we refer you to the FDist README file. Biopython's code can be used to implement more sophisticated approaches. \section{Future Developments} The most desired future developments would be the ones you add yourself ;) . That being said, already existing fully functional code is currently being incorporated in Bio.PopGen, that code covers the applications FDist and SimCoal2, the HapMap and UCSC Table Browser databases and some simple statistics like $F_{st}$, or allele counts. \chapter{Phylogenetics with Bio.Phylo} \label{sec:Phylo} The Bio.Phylo module was introduced in Biopython 1.54. Following the lead of SeqIO and AlignIO, it aims to provide a common way to work with phylogenetic trees independently of the source data format, as well as a consistent API for I/O operations. Bio.Phylo is described in an open-access journal article \cite[Talevich \textit{et al.}, 2012]{talevich2012}, which you might also find helpful. \section{Demo: What's in a Tree?} To get acquainted with the module, let's start with a tree that we've already constructed, and inspect it a few different ways. Then we'll colorize the branches, to use a special phyloXML feature, and finally save it. In a terminal, create a simple Newick file using your favorite text editor: \begin{verbatim} % cat > simple.dnd < (((A,B),(C,D)),(E,F,G)); > EOF \end{verbatim} This tree has no branch lengths, only a topology and labelled terminals. (If you have a real tree file available, you can follow this demo using that instead.) Launch the Python interpreter of your choice: \begin{verbatim} % ipython -pylab \end{verbatim} For interactive work, launching the IPython interpreter with the \verb|-pylab| flag enables \textbf{matplotlib} integration, so graphics will pop up automatically. We'll use that during this demo. Now, within Python, read the tree file, giving the file name and the name of the format. \begin{verbatim} >>> from Bio import Phylo >>> tree = Phylo.read("simple.dnd", "newick") \end{verbatim} Printing the tree object as a string gives us a look at the entire object hierarchy. \begin{verbatim} >>> print(tree) Tree(weight=1.0, rooted=False, name="") Clade(branch_length=1.0) Clade(branch_length=1.0) Clade(branch_length=1.0) Clade(branch_length=1.0, name="A") Clade(branch_length=1.0, name="B") Clade(branch_length=1.0) Clade(branch_length=1.0, name="C") Clade(branch_length=1.0, name="D") Clade(branch_length=1.0) Clade(branch_length=1.0, name="E") Clade(branch_length=1.0, name="F") Clade(branch_length=1.0, name="G") \end{verbatim} The \texttt{Tree} object contains global information about the tree, such as whether it's rooted or unrooted. It has one root clade, and under that, it's nested lists of clades all the way down to the tips. The function \verb|draw_ascii| creates a simple ASCII-art (plain text) dendrogram. This is a convenient visualization for interactive exploration, in case better graphical tools aren't available. \begin{verbatim} >>> Phylo.draw_ascii(tree) ________________________ A ________________________| | |________________________ B ________________________| | | ________________________ C | |________________________| _| |________________________ D | | ________________________ E | | |________________________|________________________ F | |________________________ G \end{verbatim} If you have \textbf{matplotlib} or \textbf{pylab} installed, you can create a graphic using the \verb|draw| function (see Fig. \ref{fig:phylo-simple-draw}): \begin{verbatim} >>> tree.rooted = True >>> Phylo.draw(tree) \end{verbatim} \begin{htmlonly} \imgsrc[width=666, height=530]{images/phylo-simple-draw.png} \label{fig:phylo-simple-draw} \end{htmlonly} \begin{latexonly} \begin{figure}[htb] \centering \includegraphics[width=0.7\textwidth]{images/phylo-simple-draw.png} \caption{A rooted tree drawn with {\tt Phylo.draw}.} \label{fig:phylo-simple-draw} \end{figure} \end{latexonly} \subsection{Coloring branches within a tree} The functions \verb|draw| and \verb|draw_graphviz| support the display of different colors and branch widths in a tree. As of Biopython 1.59, the \verb|color| and \verb|width| attributes are available on the basic Clade object and there's nothing extra required to use them. Both attributes refer to the branch leading the given clade, and apply recursively, so all descendent branches will also inherit the assigned width and color values during display. In earlier versions of Biopython, these were special features of PhyloXML trees, and using the attributes required first converting the tree to a subclass of the basic tree object called Phylogeny, from the Bio.Phylo.PhyloXML module. In Biopython 1.55 and later, this is a convenient tree method: \begin{verbatim} >>> tree = tree.as_phyloxml() \end{verbatim} In Biopython 1.54, you can accomplish the same thing with one extra import: \begin{verbatim} >>> from Bio.Phylo.PhyloXML import Phylogeny >>> tree = Phylogeny.from_tree(tree) \end{verbatim} Note that the file formats Newick and Nexus don't support branch colors or widths, so if you use these attributes in Bio.Phylo, you will only be able to save the values in PhyloXML format. (You can still save a tree as Newick or Nexus, but the color and width values will be skipped in the output file.) Now we can begin assigning colors. First, we'll color the root clade gray. We can do that by assigning the 24-bit color value as an RGB triple, an HTML-style hex string, or the name of one of the predefined colors. \begin{verbatim} >>> tree.root.color = (128, 128, 128) \end{verbatim} Or: \begin{verbatim} >>> tree.root.color = "#808080" \end{verbatim} Or: \begin{verbatim} >>> tree.root.color = "gray" \end{verbatim} Colors for a clade are treated as cascading down through the entire clade, so when we colorize the root here, it turns the whole tree gray. We can override that by assigning a different color lower down on the tree. Let's target the most recent common ancestor (MRCA) of the nodes named ``E'' and ``F''. The \verb|common_ancestor| method returns a reference to that clade in the original tree, so when we color that clade ``salmon'', the color will show up in the original tree. \begin{verbatim} >>> mrca = tree.common_ancestor({"name": "E"}, {"name": "F"}) >>> mrca.color = "salmon" \end{verbatim} If we happened to know exactly where a certain clade is in the tree, in terms of nested list entries, we can jump directly to that position in the tree by indexing it. Here, the index \verb|[0,1]| refers to the second child of the first child of the root. \begin{verbatim} >>> tree.clade[0, 1].color = "blue" \end{verbatim} Finally, show our work (see Fig. \ref{fig:phylo-color-draw}): \begin{verbatim} >>> Phylo.draw(tree) \end{verbatim} \begin{htmlonly} \imgsrc[width=666, height=530]{images/phylo-color-draw.png} \label{fig:phylo-color-draw} \end{htmlonly} \begin{latexonly} \begin{figure}[htb] \centering \includegraphics[width=0.7\textwidth]{images/phylo-color-draw.png} \caption{A colorized tree drawn with {\tt Phylo.draw}.} \label{fig:phylo-color-draw} \end{figure} \end{latexonly} Note that a clade's color includes the branch leading to that clade, as well as its descendents. The common ancestor of E and F turns out to be just under the root, and with this coloring we can see exactly where the root of the tree is. My, we've accomplished a lot! Let's take a break here and save our work. Call the \texttt{write} function with a file name or handle --- here we use standard output, to see what would be written --- and the format \texttt{phyloxml}. PhyloXML saves the colors we assigned, so you can open this phyloXML file in another tree viewer like Archaeopteryx, and the colors will show up there, too. \begin{verbatim} >>> import sys >>> Phylo.write(tree, sys.stdout, "phyloxml") 1.0 128 128 128 1.0 1.0 A ... \end{verbatim} The rest of this chapter covers the core functionality of Bio.Phylo in greater detail. For more examples of using Bio.Phylo, see the cookbook page on Biopython.org: \url{http://biopython.org/wiki/Phylo_cookbook} \section{I/O functions} Like SeqIO and AlignIO, Phylo handles file input and output through four functions: \verb|parse|, \verb|read|, \verb|write| and \verb|convert|, all of which support the tree file formats Newick, NEXUS, phyloXML and NeXML, as well as the Comparative Data Analysis Ontology (CDAO). The \verb|read| function parses a single tree in the given file and returns it. Careful; it will raise an error if the file contains more than one tree, or no trees. \begin{verbatim} >>> from Bio import Phylo >>> tree = Phylo.read("Tests/Nexus/int_node_labels.nwk", "newick") >>> print(tree) \end{verbatim} (Example files are available in the \texttt{Tests/Nexus/} and \texttt{Tests/PhyloXML/} directories of the Biopython distribution.) To handle multiple (or an unknown number of) trees, use the \verb|parse| function iterates through each of the trees in the given file: \begin{verbatim} >>> trees = Phylo.parse("Tests/PhyloXML/phyloxml_examples.xml", "phyloxml") >>> for tree in trees: ... print(tree) \end{verbatim} Write a tree or iterable of trees back to file with the \verb|write| function: \begin{verbatim} >>> trees = list(Phylo.parse("phyloxml_examples.xml", "phyloxml")) >>> tree1 = trees[0] >>> others = trees[1:] >>> Phylo.write(tree1, "tree1.xml", "phyloxml") 1 >>> Phylo.write(others, "other_trees.xml", "phyloxml") 12 \end{verbatim} Convert files between any of the supported formats with the \verb|convert| function: \begin{verbatim} >>> Phylo.convert("tree1.dnd", "newick", "tree1.xml", "nexml") 1 >>> Phylo.convert("other_trees.xml", "phyloxml", "other_trees.nex", 'nexus") 12 \end{verbatim} To use strings as input or output instead of actual files, use \verb|StringIO| as you would with SeqIO and AlignIO: %doctest \begin{verbatim} >>> from Bio import Phylo >>> from StringIO import StringIO >>> handle = StringIO("(((A,B),(C,D)),(E,F,G));") >>> tree = Phylo.read(handle, "newick") \end{verbatim} \section{View and export trees} The simplest way to get an overview of a \verb|Tree| object is to \verb|print| it: %TODO - make this into a doctest? \begin{verbatim} >>> tree = Phylo.read("Tests/PhyloXML/example.xml", "phyloxml") >>> print(tree) Phylogeny(rooted='True', description='phyloXML allows to use either a "branch_length" attribute...', name='example from Prof. Joe Felsenstein's book "Inferring Phyl...') Clade() Clade(branch_length='0.06') Clade(branch_length='0.102', name='A') Clade(branch_length='0.23', name='B') Clade(branch_length='0.4', name='C') \end{verbatim} This is essentially an outline of the object hierarchy Biopython uses to represent a tree. But more likely, you'd want to see a drawing of the tree. There are three functions to do this. As we saw in the demo, \verb|draw_ascii| prints an ascii-art drawing of the tree (a rooted phylogram) to standard output, or an open file handle if given. Not all of the available information about the tree is shown, but it provides a way to quickly view the tree without relying on any external dependencies. \begin{verbatim} >>> tree = Phylo.read("example.xml", "phyloxml") >>> Phylo.draw_ascii(tree) __________________ A __________| _| |___________________________________________ B | |___________________________________________________________________________ C \end{verbatim} The \verb|draw| function draws a more attractive image using the matplotlib library. See the API documentation for details on the arguments it accepts to customize the output. \begin{verbatim} >>> tree = Phylo.read("example.xml", "phyloxml") >>> Phylo.draw(tree, branch_labels=lambda c: c.branch_length) \end{verbatim} \begin{htmlonly} \imgsrc[width=701, height=465]{images/phylo-draw-example.png} \label{fig:phylo-draw-example} \end{htmlonly} \begin{latexonly} \begin{figure}[tbp] \centering \includegraphics[width=0.7\textwidth]{images/phylo-draw-example.png} \caption{A simple rooted tree plotted with the {\tt draw} function.} \label{fig:phylo-draw-example} \end{figure} \end{latexonly} \verb|draw_graphviz| draws an unrooted cladogram, but requires that you have Graphviz, PyDot or PyGraphviz, NetworkX, and matplotlib (or pylab) installed. Using the same example as above, and the \verb|dot| program included with Graphviz, let's draw a rooted tree (see Fig.~\ref{fig:phylo-dot}): \begin{verbatim} >>> tree = Phylo.read("example.xml", "phyloxml") >>> Phylo.draw_graphviz(tree, prog='dot') >>> import pylab >>> pylab.show() # Displays the tree in an interactive viewer >>> pylab.savefig('phylo-dot.png') # Creates a PNG file of the same graphic \end{verbatim} \begin{htmlonly} \imgsrc[width=400, height=312]{images/phylo-dot.png} \label{fig:phylo-dot} \end{htmlonly} \begin{latexonly} \begin{figure}[tbp] \centering \includegraphics[width=0.5\textwidth]{images/phylo-dot.png} \caption{A simple rooted tree drawn with {\tt draw\_graphviz}, using {\tt dot} for node layout.} \label{fig:phylo-dot} \end{figure} \end{latexonly} (Tip: If you execute IPython with the \verb|-pylab| option, calling \verb|draw_graphviz| causes the matplotlib viewer to launch automatically without manually calling \verb|show()|.) This exports the tree object to a NetworkX graph, uses Graphviz to lay out the nodes, and displays it using matplotlib. There are a number of keyword arguments that can modify the resulting diagram, including most of those accepted by the NetworkX functions \verb|networkx.draw| and \verb|networkx.draw_graphviz|. The display is also affected by the \verb|rooted| attribute of the given tree object. Rooted trees are shown with a ``head'' on each branch indicating direction (see Fig.~\ref{fig:phylo-rooted}): \begin{verbatim} >>> tree = Phylo.read("simple.dnd", "newick") >>> tree.rooted = True >>> Phylo.draw_graphiz(tree) \end{verbatim} \begin{htmlonly} \imgsrc[width=432, height=368]{images/phylo-rooted.png} \label{fig:phylo-rooted} \end{htmlonly} The ``prog'' argument specifies the Graphviz engine used for layout. The default, \verb|twopi|, behaves well for any size tree, reliably avoiding crossed branches. The \verb|neato| program may draw more attractive moderately-sized trees, but sometimes will cross branches (see Fig.~\ref{fig:phylo-color}). The \verb|dot| program may be useful with small trees, but tends to do surprising things with the layout of larger trees. \begin{latexonly} \begin{figure}[ptb] \centering \includegraphics[width=0.45\textwidth]{images/phylo-rooted.png} \caption{A rooted tree drawn with {\tt draw\_graphviz}. Since we rooted the tree, we can see the root must be along the branch with two directional ``heads''. } \label{fig:phylo-rooted} \end{figure} \begin{figure}[ptb] \centering \includegraphics[width=0.5\textwidth]{images/phylo-color.png} \caption{A colorized tree drawn with {\tt draw\_graphviz}, using {\tt neato} for node layout.} \label{fig:phylo-color} \end{figure} \end{latexonly} \begin{verbatim} >>> Phylo.draw_graphviz(tree, prog="neato") \end{verbatim} \begin{htmlonly} \imgsrc[width=499, height=348]{images/phylo-color.png} \label{fig:phylo-color} \end{htmlonly} This viewing mode is particularly handy for exploring larger trees, because the matplotlib viewer can zoom in on a selected region, thinning out a cluttered graphic. \begin{latexonly} %Can't reference unless inside a figure (See Figs.~\ref{fig:phylo-apaf}, \ref{fig:phylo-apaf-zoom}). \end{latexonly} \begin{verbatim} >>> tree = Phylo.read("apaf.xml", "phyloxml") >>> Phylo.draw_graphviz(tree, prog="neato", node_size=0) \end{verbatim} \begin{htmlonly} \imgsrc[width=519, height=400]{images/phylo-apaf.png} \label{fig:phylo-apaf} \imgsrc[width=506, height=400]{images/phylo-apaf-zoom.png} \label{fig:phylo-apaf-zoom} \end{htmlonly} \begin{latexonly} \begin{figure}[tbp] \centering \includegraphics[width=0.65\textwidth]{images/phylo-apaf.png} \\ \caption{A larger tree, using {\tt neato} for layout.} \label{fig:phylo-apaf} \end{figure} \begin{figure}[btp] \centering \includegraphics[width=0.6\textwidth]{images/phylo-apaf-zoom.png} \caption{A zoomed-in portion of the same tree as Fig.~\ref{fig:phylo-apaf}.} \label{fig:phylo-apaf-zoom} \end{figure} \end{latexonly} Note that branch lengths are not displayed accurately, because Graphviz ignores them when creating the node layouts. The branch lengths are retained when exporting a tree as a NetworkX graph object (\verb|to_networkx|), however. See the Phylo page on the Biopython wiki (\url{http://biopython.org/wiki/Phylo}) for descriptions and examples of the more advanced functionality in \verb|draw_ascii|, \verb|draw_graphviz| and \verb|to_networkx|. \section{Using Tree and Clade objects} The \verb|Tree| objects produced by \verb|parse| and \verb|read| are containers for recursive sub-trees, attached to the \verb|Tree| object at the \verb|root| attribute (whether or not the phylogenic tree is actually considered rooted). A \verb|Tree| has globally applied information for the phylogeny, such as rootedness, and a reference to a single \verb|Clade|; a \verb|Clade| has node- and clade-specific information, such as branch length, and a list of its own descendent \verb|Clade| instances, attached at the \verb|clades| attribute. So there is a distinction between \verb|tree| and \verb|tree.root|. In practice, though, you rarely need to worry about it. To smooth over the difference, both \verb|Tree| and \verb|Clade| inherit from \verb|TreeMixin|, which contains the implementations for methods that would be commonly used to search, inspect or modify a tree or any of its clades. This means that almost all of the methods supported by \verb|tree| are also available on \verb|tree.root| and any clade below it. (\verb|Clade| also has a \verb|root| property, which returns the clade object itself.) % TODO - use dia to make a class diagram like images/smcra.png \subsection{Search and traversal methods} For convenience, we provide a couple of simplified methods that return all external or internal nodes directly as a list: \begin{description} \item[\texttt{get\_terminals}] makes a list of all of this tree's terminal (leaf) nodes. \item[\texttt{get\_nonterminals}] makes a list of all of this tree's nonterminal (internal) nodes. \end{description} These both wrap a method with full control over tree traversal, \verb|find_clades|. Two more traversal methods, \verb|find_elements| and \verb|find_any|, rely on the same core functionality and accept the same arguments, which we'll call a ``target specification'' for lack of a better description. These specify which objects in the tree will be matched and returned during iteration. The first argument can be any of the following types: \begin{itemize} \item A \textbf{TreeElement instance}, which tree elements will match by identity --- so searching with a Clade instance as the target will find that clade in the tree; \item A \textbf{string}, which matches tree elements' string representation --- in particular, a clade's \verb|name| \textit{(added in Biopython 1.56)}; \item A \textbf{class} or \textbf{type}, where every tree element of the same type (or sub-type) will be matched; \item A \textbf{dictionary} where keys are tree element attributes and values are matched to the corresponding attribute of each tree element. This one gets even more elaborate: \begin{itemize} \item If an \texttt{int} is given, it matches numerically equal attributes, e.g. 1 will match 1 or 1.0 \item If a boolean is given (True or False), the corresponding attribute value is evaluated as a boolean and checked for the same \item \texttt{None} matches \texttt{None} \item If a string is given, the value is treated as a regular expression (which must match the whole string in the corresponding element attribute, not just a prefix). A given string without special regex characters will match string attributes exactly, so if you don't use regexes, don't worry about it. For example, in a tree with clade names Foo1, Foo2 and Foo3, \verb|tree.find_clades({"name": "Foo1"})| matches Foo1, \verb|{"name": "Foo.*"}| matches all three clades, and \verb|{"name": "Foo"}| doesn't match anything. \end{itemize} Since floating-point arithmetic can produce some strange behavior, we don't support matching \texttt{float}s directly. Instead, use the boolean \texttt{True} to match every element with a nonzero value in the specified attribute, then filter on that attribute manually with an inequality (or exact number, if you like living dangerously). If the dictionary contains multiple entries, a matching element must match each of the given attribute values --- think ``and'', not ``or''. \item A \textbf{function} taking a single argument (it will be applied to each element in the tree), returning True or False. For convenience, LookupError, AttributeError and ValueError are silenced, so this provides another safe way to search for floating-point values in the tree, or some more complex characteristic. \end{itemize} After the target, there are two optional keyword arguments: \begin{description} \item[terminal] --- A boolean value to select for or against terminal clades (a.k.a. leaf nodes): True searches for only terminal clades, False for non-terminal (internal) clades, and the default, None, searches both terminal and non-terminal clades, as well as any tree elements lacking the \verb|is_terminal| method. \item[order] --- Tree traversal order: \texttt{"preorder"} (default) is depth-first search, \texttt{"postorder"} is DFS with child nodes preceding parents, and \texttt{"level"} is breadth-first search. \end{description} Finally, the methods accept arbitrary keyword arguments which are treated the same way as a dictionary target specification: keys indicate the name of the element attribute to search for, and the argument value (string, integer, None or boolean) is compared to the value of each attribute found. If no keyword arguments are given, then any TreeElement types are matched. The code for this is generally shorter than passing a dictionary as the target specification: \verb|tree.find_clades({"name": "Foo1"})| can be shortened to \verb|tree.find_clades(name="Foo1")|. (In Biopython 1.56 or later, this can be even shorter: \verb|tree.find_clades("Foo1")|) % TODO -- introduce these / segue and clean up the descriptions Now that we've mastered target specifications, here are the methods used to traverse a tree: \begin{description} \item[\texttt{find\_clades}] Find each clade containing a matching element. That is, find each element as with \verb|find_elements|, but return the corresponding clade object. (This is usually what you want.) The result is an iterable through all matching objects, searching depth-first by default. This is not necessarily the same order as the elements appear in the Newick, Nexus or XML source file! \item[\texttt{find\_elements}] Find all tree elements matching the given attributes, and return the matching elements themselves. Simple Newick trees don't have complex sub-elements, so this behaves the same as \verb|find_clades| on them. PhyloXML trees often do have complex objects attached to clades, so this method is useful for extracting those. \item[\texttt{find\_any}] Return the first element found by \verb|find_elements()|, or None. This is also useful for checking whether any matching element exists in the tree, and can be used in a conditional. \end{description} Two more methods help navigating between nodes in the tree: \begin{description} \item[\texttt{get\_path}] List the clades directly between the tree root (or current clade) and the given target. Returns a list of all clade objects along this path, ending with the given target, but excluding the root clade. \item[\texttt{trace}] List of all clade object between two targets in this tree. Excluding start, including finish. \end{description} \subsection{Information methods} These methods provide information about the whole tree (or any clade). \begin{description} \item[\texttt{common\_ancestor}] Find the most recent common ancestor of all the given targets. (This will be a Clade object). If no target is given, returns the root of the current clade (the one this method is called from); if 1 target is given, this returns the target itself. However, if any of the specified targets are not found in the current tree (or clade), an exception is raised. \item[\texttt{count\_terminals}] Counts the number of terminal (leaf) nodes within the tree. \item[\texttt{depths}] Create a mapping of tree clades to depths. The result is a dictionary where the keys are all of the Clade instances in the tree, and the values are the distance from the root to each clade (including terminals). By default the distance is the cumulative branch length leading to the clade, but with the \verb|unit_branch_lengths=True| option, only the number of branches (levels in the tree) is counted. \item[\texttt{distance}] Calculate the sum of the branch lengths between two targets. If only one target is specified, the other is the root of this tree. \item[\texttt{total\_branch\_length}] Calculate the sum of all the branch lengths in this tree. This is usually just called the ``length'' of the tree in phylogenetics, but we use a more explicit name to avoid confusion with Python terminology. \end{description} The rest of these methods are boolean checks: \begin{description} \item[\texttt{is\_bifurcating}] True if the tree is strictly bifurcating; i.e. all nodes have either 2 or 0 children (internal or external, respectively). The root may have 3 descendents and still be considered part of a bifurcating tree. \item[\texttt{is\_monophyletic}] Test if all of the given targets comprise a complete subclade --- i.e., there exists a clade such that its terminals are the same set as the given targets. The targets should be terminals of the tree. For convenience, this method returns the common ancestor (MCRA) of the targets if they are monophyletic (instead of the value \verb|True|), and \verb|False| otherwise. \item[\texttt{is\_parent\_of}] True if target is a descendent of this tree --- not required to be a direct descendent. To check direct descendents of a clade, simply use list membership testing: \verb|if subclade in clade: ...| \item[\texttt{is\_preterminal}] True if all direct descendents are terminal; False if any direct descendent is not terminal. \end{description} \subsection{Modification methods} These methods modify the tree in-place. If you want to keep the original tree intact, make a complete copy of the tree first, using Python's \texttt{copy} module: \begin{verbatim} tree = Phylo.read('example.xml', 'phyloxml') import copy newtree = copy.deepcopy(tree) \end{verbatim} \begin{description} \item[\texttt{collapse}] Deletes the target from the tree, relinking its children to its parent. \item[\texttt{collapse\_all}] Collapse all the descendents of this tree, leaving only terminals. Branch lengths are preserved, i.e. the distance to each terminal stays the same. With a target specification (see above), collapses only the internal nodes matching the specification. \item[\texttt{ladderize}] Sort clades in-place according to the number of terminal nodes. Deepest clades are placed last by default. Use \verb|reverse=True| to sort clades deepest-to-shallowest. \item[\texttt{prune}] Prunes a terminal clade from the tree. If taxon is from a bifurcation, the connecting node will be collapsed and its branch length added to remaining terminal node. This might no longer be a meaningful value. \item[\texttt{root\_with\_outgroup}] Reroot this tree with the outgroup clade containing the given targets, i.e. the common ancestor of the outgroup. This method is only available on Tree objects, not Clades. If the outgroup is identical to self.root, no change occurs. If the outgroup clade is terminal (e.g. a single terminal node is given as the outgroup), a new bifurcating root clade is created with a 0-length branch to the given outgroup. Otherwise, the internal node at the base of the outgroup becomes a trifurcating root for the whole tree. If the original root was bifurcating, it is dropped from the tree. In all cases, the total branch length of the tree stays the same. \item[\texttt{root\_at\_midpoint}] Reroot this tree at the calculated midpoint between the two most distant tips of the tree. (This uses \verb|root_with_outgroup| under the hood.) \item[\texttt{split}] Generate \textit{n} (default 2) new descendants. In a species tree, this is a speciation event. New clades have the given \verb|branch_length| and the same name as this clade's root plus an integer suffix (counting from 0) --- for example, splitting a clade named ``A'' produces the sub-clades ``A0'' and ``A1''. \end{description} See the Phylo page on the Biopython wiki (\url{http://biopython.org/wiki/Phylo}) for more examples of using the available methods. \subsection{Features of PhyloXML trees} \label{sec:PhyloXML} The phyloXML file format includes fields for annotating trees with additional data types and visual cues. % TODO % annotations -- see wiki and epydoc pages % - on wiki, discuss each class See the PhyloXML page on the Biopython wiki (\url{http://biopython.org/wiki/PhyloXML}) for descriptions and examples of using the additional annotation features provided by PhyloXML. % The object hierarchy still looks and behaves similarly: % \begin{verbatim} % >>> print(tree) % Phylogeny(rooted=True, name="") % Clade(branch_length=1.0) % Clade(branch_length=1.0) % Clade(branch_length=1.0) % Clade(branch_length=1.0, name="A") % Clade(branch_length=1.0, name="B") % Clade(branch_length=1.0) % Clade(branch_length=1.0, name="C") % Clade(branch_length=1.0, name="D") % Clade(branch_length=1.0) % Clade(branch_length=1.0, name="E") % Clade(branch_length=1.0, name="F") % Clade(branch_length=1.0, name="G") % \end{verbatim} \section{Running external applications} \label{sec:PhyloApps} While Bio.Phylo doesn't infer trees from alignments itself, there are third-party programs available that do. These are supported through the module \texttt{Bio.Phylo.Applications}, using the same general framework as \texttt{Bio.Emboss.Applications}, \texttt{Bio.Align.Applications} and others. Biopython 1.58 introduced a wrapper for PhyML (\url{http://www.atgc-montpellier.fr/phyml/}). The program accepts an input alignment in \texttt{phylip-relaxed} format (that's Phylip format, but without the 10-character limit on taxon names) and a variety of options. A quick example: \begin{verbatim} >>> from Bio import Phylo >>> from Bio.Phylo.Applications import PhymlCommandline >>> cmd = PhymlCommandline(input='Tests/Phylip/random.phy') >>> out_log, err_log = cmd() \end{verbatim} This generates a tree file and a stats file with the names [\textit{input~filename}]\verb|_phyml_tree.txt| and [\textit{input~filename}]\verb|_phyml_stats.txt|. The tree file is in Newick format: \begin{verbatim} >>> tree = Phylo.read('Tests/Phylip/random.phy_phyml_tree.txt', 'newick') >>> Phylo.draw_ascii(tree) \end{verbatim} A similar wrapper for RAxML (\url{http://sco.h-its.org/exelixis/software.html}) was added in Biopython 1.60, and FastTree (\url{http://www.microbesonline.org/fasttree/}) in Biopython 1.62. Note that some popular Phylip programs, including \texttt{dnaml} and \texttt{protml}, are already available through the EMBOSS wrappers in \texttt{Bio.Emboss.Applications} if you have the Phylip extensions to EMBOSS installed on your system. See Section~\ref{sec:alignment-tools} for some examples and clues on how to use programs like these. \section{PAML integration} \label{sec:PhyloPAML} Biopython 1.58 brought support for PAML (\url{http://abacus.gene.ucl.ac.uk/software/paml.html}), a suite of programs for phylogenetic analysis by maximum likelihood. Currently the programs codeml, baseml and yn00 are implemented. Due to PAML's usage of control files rather than command line arguments to control runtime options, usage of this wrapper strays from the format of other application wrappers in Biopython. A typical workflow would be to initialize a PAML object, specifying an alignment file, a tree file, an output file and a working directory. Next, runtime options are set via the \texttt{set\_options()} method or by reading an existing control file. Finally, the program is run via the \texttt{run()} method and the output file is automatically parsed to a results dictionary. Here is an example of typical usage of codeml: \begin{verbatim} >>> from Bio.Phylo.PAML import codeml >>> cml = codeml.Codeml() >>> cml.alignment = "Tests/PAML/alignment.phylip" >>> cml.tree = "Tests/PAML/species.tree" >>> cml.out_file = "results.out" >>> cml.working_dir = "./scratch" >>> cml.set_options(seqtype=1, ... verbose=0, ... noisy=0, ... RateAncestor=0, ... model=0, ... NSsites=[0, 1, 2], ... CodonFreq=2, ... cleandata=1, ... fix_alpha=1, ... kappa=4.54006) >>> results = cml.run() >>> ns_sites = results.get("NSsites") >>> m0 = ns_sites.get(0) >>> m0_params = m0.get("parameters") >>> print(m0_params.get("omega")) \end{verbatim} Existing output files may be parsed as well using a module's \texttt{read()} function: \begin{verbatim} >>> results = codeml.read("Tests/PAML/Results/codeml/codeml_NSsites_all.out") >>> print(results.get("lnL max")) \end{verbatim} Detailed documentation for this new module currently lives on the Biopython wiki: \url{http://biopython.org/wiki/PAML} \section{Future plans} \label{sec:PhyloFuture} Bio.Phylo is under active development. Here are some features we might add in future releases: \begin{description} \item[New methods] Generally useful functions for operating on Tree or Clade objects appear on the Biopython wiki first, so that casual users can test them and decide if they're useful before we add them to Bio.Phylo: \url{http://biopython.org/wiki/Phylo_cookbook} \item[Bio.Nexus port] Much of this module was written during Google Summer of Code 2009, under the auspices of NESCent, as a project to implement Python support for the phyloXML data format (see \ref{sec:PhyloXML}). Support for Newick and Nexus formats was added by porting part of the existing Bio.Nexus module to the new classes used by Bio.Phylo. Currently, Bio.Nexus contains some useful features that have not yet been ported to Bio.Phylo classes --- notably, calculating a consensus tree. If you find some functionality lacking in Bio.Phylo, try poking throught Bio.Nexus to see if it's there instead. \end{description} We're open to any suggestions for improving the functionality and usability of this module; just let us know on the mailing list or our bug database. Finally, if you need additional functionality not yet included in the Phylo module, check if it's available in another of the high-quality Python libraries for phylogenetics such as DendroPy (\url{http://pythonhosted.org/DendroPy/}) or PyCogent (\url{http://pycogent.org/}). Since these libraries also support standard file formats for phylogenetic trees, you can easily transfer data between libraries by writing to a temporary file or StringIO object. \chapter{Sequence motif analysis using Bio.motifs} This chapter gives an overview of the functionality of the \verb|Bio.motifs| package included in Biopython. It is intended for people who are involved in the analysis of sequence motifs, so I'll assume that you are familiar with basic notions of motif analysis. In case something is unclear, please look at Section~\ref{sec:links} for some relevant links. Most of this chapter describes the new \verb|Bio.motifs| package included in Biopython 1.61 onwards, which is replacing the older \verb|Bio.Motif| package introduced with Biopython 1.50, which was in turn based on two older former Biopython modules, \verb|Bio.AlignAce| and \verb|Bio.MEME|. It provides most of their functionality with a unified motif object implementation. Speaking of other libraries, if you are reading this you might be interested in \href{http://fraenkel.mit.edu/TAMO/}{TAMO}, another python library designed to deal with sequence motifs. It supports more \emph{de-novo} motif finders, but it is not a part of Biopython and has some restrictions on commercial use. \section{Motif objects} \label{sec:object} Since we are interested in motif analysis, we need to take a look at \verb|Motif| objects in the first place. For that we need to import the Bio.motifs library: %doctest ../Tests/Motif \begin{verbatim} >>> from Bio import motifs \end{verbatim} and we can start creating our first motif objects. We can either create a \verb+Motif+ object from a list of instances of the motif, or we can obtain a \verb+Motif+ object by parsing a file from a motif database or motif finding software. \subsection{Creating a motif from instances} Suppose we have these instances of a DNA motif: %cont-doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> instances = [Seq("TACAA"), ... Seq("TACGC"), ... Seq("TACAC"), ... Seq("TACCC"), ... Seq("AACCC"), ... Seq("AATGC"), ... Seq("AATGC"), ... ] \end{verbatim} then we can create a Motif object as follows: %cont-doctest \begin{verbatim} >>> m = motifs.create(instances) \end{verbatim} The instances are saved in an attribute \verb+m.instances+, which is essentially a Python list with some added functionality, as described below. Printing out the Motif object shows the instances from which it was constructed: %cont-doctest \begin{verbatim} >>> print(m) TACAA TACGC TACAC TACCC AACCC AATGC AATGC \end{verbatim} The length of the motif defined as the sequence length, which should be the same for all instances: %cont-doctest \begin{verbatim} >>> len(m) 5 \end{verbatim} The Motif object has an attribute \verb+.counts+ containing the counts of each nucleotide at each position. Printing this counts matrix shows it in an easily readable format: %cont-doctest \begin{verbatim} >>> print(m.counts) 0 1 2 3 4 A: 3.00 7.00 0.00 2.00 1.00 C: 0.00 0.00 5.00 2.00 6.00 G: 0.00 0.00 0.00 3.00 0.00 T: 4.00 0.00 2.00 0.00 0.00 \end{verbatim} You can access these counts as a dictionary: %cont-doctest \begin{verbatim} >>> m.counts['A'] [3, 7, 0, 2, 1] \end{verbatim} but you can also think of it as a 2D array with the nucleotide as the first dimension and the position as the second dimension: %cont-doctest \begin{verbatim} >>> m.counts['T', 0] 4 >>> m.counts['T', 2] 2 >>> m.counts['T', 3] 0 \end{verbatim} You can also directly access columns of the counts matrix %Don't doctest this as dictionary order is platform dependent: \begin{verbatim} >>> m.counts[:, 3] {'A': 2, 'C': 2, 'T': 0, 'G': 3} \end{verbatim} Instead of the nucleotide itself, you can also use the index of the nucleotide in the sorted letters in the alphabet of the motif: %cont-doctest \begin{verbatim} >>> m.alphabet IUPACUnambiguousDNA() >>> m.alphabet.letters 'GATC' >>> sorted(m.alphabet.letters) ['A', 'C', 'G', 'T'] >>> m.counts['A',:] (3, 7, 0, 2, 1) >>> m.counts[0,:] (3, 7, 0, 2, 1) \end{verbatim} The motif has an associated consensus sequence, defined as the sequence of letters along the positions of the motif for which the largest value in the corresponding columns of the \verb+.counts+ matrix is obtained: %cont-doctest \begin{verbatim} >>> m.consensus Seq('TACGC', IUPACUnambiguousDNA()) \end{verbatim} as well as an anticonsensus sequence, corresponding to the smallest values in the columns of the \verb+.counts+ matrix: %cont-doctest \begin{verbatim} >>> m.anticonsensus Seq('GGGTG', IUPACUnambiguousDNA()) \end{verbatim} You can also ask for a degenerate consensus sequence, in which ambiguous nucleotides are used for positions where there are multiple nucleotides with high counts: %cont-doctest \begin{verbatim} >>> m.degenerate_consensus Seq('WACVC', IUPACAmbiguousDNA()) \end{verbatim} Here, W and R follow the IUPAC nucleotide ambiguity codes: W is either A or T, and V is A, C, or G \cite{cornish1985}. The degenerate consensus sequence is constructed following the rules specified by Cavener \cite{cavener1987}. We can also get the reverse complement of a motif: %cont-doctest \begin{verbatim} >>> r = m.reverse_complement() >>> r.consensus Seq('GCGTA', IUPACUnambiguousDNA()) >>> r.degenerate_consensus Seq('GBGTW', IUPACAmbiguousDNA()) >>> print(r) TTGTA GCGTA GTGTA GGGTA GGGTT GCATT GCATT \end{verbatim} The reverse complement and the degenerate consensus sequence are only defined for DNA motifs. \subsection{Creating a sequence logo} If we have internet access, we can create a \href{http://weblogo.berkeley.edu}{weblogo}: \begin{verbatim} >>> m.weblogo("mymotif.png") \end{verbatim} We should get our logo saved as a PNG in the specified file. \section{Reading motifs} \label{sec:io} Creating motifs from instances by hand is a bit boring, so it's useful to have some I/O functions for reading and writing motifs. There are not any really well established standards for storing motifs, but there are a couple of formats that are more used than others. \subsection{JASPAR} One of the most popular motif databases is \href{http://jaspar.genereg.net}{JASPAR}. In addition to the motif sequence information, the JASPAR database stores a lot of meta-information for each motif. The module \verb+Bio.motifs+ contains a specialized class \verb+jaspar.Motif+ in which this meta-information is represented as attributes: \begin{itemize} \item \verb+matrix_id+ - the unique JASPAR motif ID, e.g. 'MA0004.1' \item \verb+name+ - the name of the TF, e.g. 'Arnt' \item \verb+collection+ - the JASPAR collection to which the motif belongs, e.g. 'CORE' \item \verb+tf_class+ - the structual class of this TF, e.g. 'Zipper-Type' \item \verb+tf_family+ - the family to which this TF belongs, e.g. 'Helix-Loop-Helix' \item \verb+species+ - the species to which this TF belongs, may have multiple values, these are specified as taxonomy IDs, e.g. 10090 \item \verb+tax_group+ - the taxonomic supergroup to which this motif belongs, e.g. 'vertebrates' \item \verb+acc+ - the accesion number of the TF protein, e.g. 'P53762' \item \verb+data_type+ - the type of data used to construct this motif, e.g. 'SELEX' \item \verb+medline+ - the Pubmed ID of literature supporting this motif, may be multiple values, e.g. 7592839 \item \verb+pazar_id+ - external reference to the TF in the \href{http://pazar.info}{PAZAR} database, e.g. 'TF0000003' \item \verb+comment+ - free form text containing notes about the construction of the motif \end{itemize} The \verb+jaspar.Motif+ class inherits from the generic \verb+Motif+ class and therefore provides all the facilities of any of the motif formats --- reading motifs, writing motifs, scanning sequences for motif instances etc. JASPAR stores motifs in several different ways including three different flat file formats and as an SQL database. All of these formats facilitate the construction of a counts matrix. However, the amount of meta information described above that is available varies with the format. \subsubsection*{The JASPAR \texttt{sites} format} The first of the three flat file formats contains a list of instances. As an example, these are the beginning and ending lines of the JASPAR \verb+Arnt.sites+ file showing known binding sites of the mouse helix-loop-helix transcription factor Arnt. \begin{verbatim} >MA0004 ARNT 1 CACGTGatgtcctc >MA0004 ARNT 2 CACGTGggaggtac >MA0004 ARNT 3 CACGTGccgcgcgc ... >MA0004 ARNT 18 AACGTGacagccctcc >MA0004 ARNT 19 AACGTGcacatcgtcc >MA0004 ARNT 20 aggaatCGCGTGc \end{verbatim} The parts of the sequence in capital letters are the motif instances that were found to align to each other. We can create a \verb+Motif+ object from these instances as follows: %cont-doctest \begin{verbatim} >>> from Bio import motifs >>> arnt = motifs.read(open("Arnt.sites"), "sites") \end{verbatim} The instances from which this motif was created is stored in the \verb+.instances+ property: %cont-doctest \begin{verbatim} >>> print(arnt.instances[:3]) [Seq('CACGTG', IUPACUnambiguousDNA()), Seq('CACGTG', IUPACUnambiguousDNA()), Seq('CACGTG', IUPACUnambiguousDNA())] >>> for instance in arnt.instances: ... print(instance) ... CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG CACGTG AACGTG AACGTG AACGTG AACGTG CGCGTG \end{verbatim} The counts matrix of this motif is automatically calculated from the instances: %cont-doctest \begin{verbatim} >>> print(arnt.counts) 0 1 2 3 4 5 A: 4.00 19.00 0.00 0.00 0.00 0.00 C: 16.00 0.00 20.00 0.00 0.00 0.00 G: 0.00 1.00 0.00 20.00 0.00 20.00 T: 0.00 0.00 0.00 0.00 20.00 0.00 \end{verbatim} This format does not store any meta information. \subsubsection*{The JASPAR \texttt{pfm} format} JASPAR also makes motifs available directly as a count matrix, without the instances from which it was created. This \verb+pfm+ format only stores the counts matrix for a single motif. For example, this is the JASPAR file \verb+SRF.pfm+ containing the counts matrix for the human SRF transcription factor: \begin{verbatim} 2 9 0 1 32 3 46 1 43 15 2 2 1 33 45 45 1 1 0 0 0 1 0 1 39 2 1 0 0 0 0 0 0 0 44 43 4 2 0 0 13 42 0 45 3 30 0 0 \end{verbatim} We can create a motif for this count matrix as follows: %cont-doctest \begin{verbatim} >>> srf = motifs.read(open("SRF.pfm"), "pfm") >>> print(srf.counts) 0 1 2 3 4 5 6 7 8 9 10 11 A: 2.00 9.00 0.00 1.00 32.00 3.00 46.00 1.00 43.00 15.00 2.00 2.00 C: 1.00 33.00 45.00 45.00 1.00 1.00 0.00 0.00 0.00 1.00 0.00 1.00 G: 39.00 2.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 44.00 43.00 T: 4.00 2.00 0.00 0.00 13.00 42.00 0.00 45.00 3.00 30.00 0.00 0.00 \end{verbatim} As this motif was created from the counts matrix directly, it has no instances associated with it: %cont-doctest \begin{verbatim} >>> print(srf.instances) None \end{verbatim} We can now ask for the consensus sequence of these two motifs: %cont-doctest \begin{verbatim} >>> print(arnt.counts.consensus) CACGTG >>> print(srf.counts.consensus) GCCCATATATGG \end{verbatim} As with the instances file, not meta information is stored in this format. \subsubsection*{The JASPAR format \texttt{jaspar}} The \verb+jaspar+ file format allows multiple motifs to be specified in a single file. In this format each of the motif records consist of a header line followed by four lines defining the counts matrix. The header line begins with a \verb+>+ character (similar to the Fasta file format) and is followed by the unique JASPAR matrix ID and the TF name. The following example shows a \verb+jaspar+ formatted file containing the three motifs Arnt, RUNX1 and MEF2A: \begin{verbatim} >MA0004.1 Arnt A [ 4 19 0 0 0 0 ] C [16 0 20 0 0 0 ] G [ 0 1 0 20 0 20 ] T [ 0 0 0 0 20 0 ] >MA0002.1 RUNX1 A [10 12 4 1 2 2 0 0 0 8 13 ] C [ 2 2 7 1 0 8 0 0 1 2 2 ] G [ 3 1 1 0 23 0 26 26 0 0 4 ] T [11 11 14 24 1 16 0 0 25 16 7 ] >MA0052.1 MEF2A A [ 1 0 57 2 9 6 37 2 56 6 ] C [50 0 1 1 0 0 0 0 0 0 ] G [ 0 0 0 0 0 0 0 0 2 50 ] T [ 7 58 0 55 49 52 21 56 0 2 ] \end{verbatim} The motifs are read as follows: \begin{verbatim} >>> fh = open("jaspar_motifs.txt") >>> for m in motifs.parse(fh, "jaspar")) ... print(m) TF name Arnt Matrix ID MA0004.1 Matrix: 0 1 2 3 4 5 A: 4.00 19.00 0.00 0.00 0.00 0.00 C: 16.00 0.00 20.00 0.00 0.00 0.00 G: 0.00 1.00 0.00 20.00 0.00 20.00 T: 0.00 0.00 0.00 0.00 20.00 0.00 TF name RUNX1 Matrix ID MA0002.1 Matrix: 0 1 2 3 4 5 6 7 8 9 10 A: 10.00 12.00 4.00 1.00 2.00 2.00 0.00 0.00 0.00 8.00 13.00 C: 2.00 2.00 7.00 1.00 0.00 8.00 0.00 0.00 1.00 2.00 2.00 G: 3.00 1.00 1.00 0.00 23.00 0.00 26.00 26.00 0.00 0.00 4.00 T: 11.00 11.00 14.00 24.00 1.00 16.00 0.00 0.00 25.00 16.00 7.00 TF name MEF2A Matrix ID MA0052.1 Matrix: 0 1 2 3 4 5 6 7 8 9 A: 1.00 0.00 57.00 2.00 9.00 6.00 37.00 2.00 56.00 6.00 C: 50.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 G: 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 50.00 T: 7.00 58.00 0.00 55.00 49.00 52.00 21.00 56.00 0.00 2.00 \end{verbatim} Note that printing a JASPAR motif yields both the counts data and the available meta-information. \subsubsection*{Accessing the JASPAR database} In addition to parsing these flat file formats, we can also retrieve motifs from a JASPAR SQL database. Unlike the flat file formats, a JASPAR database allows storing of all possible meta information defined in the JASPAR \verb+Motif+ class. It is beyond the scope of this document to describe how to set up a JASPAR database (please see the main \href{http://jaspar.genereg.net}{JASPAR} website). Motifs are read from a JASPAR database using the \verb+Bio.motifs.jaspar.db+ module. First connect to the JASPAR database using the JASPAR5 class which models the the latest JASPAR schema: \begin{verbatim} >>> from Bio.motifs.jaspar.db import JASPAR5 >>> >>> JASPAR_DB_HOST = >>> JASPAR_DB_NAME = >>> JASPAR_DB_USER = >>> JASPAR_DB_PASS = >>> >>> jdb = JASPAR5( ... host=JASPAR_DB_HOST, ... name=JASPAR_DB_NAME, ... user=JASPAR_DB_USER, ... password=JASPAR_DB_PASS ... ) \end{verbatim} Now we can fetch a single motif by its unique JASPAR ID with the \verb+fetch_motif_by_id+ method. Note that a JASPAR ID conists of a base ID and a version number seperated by a decimal point, e.g. 'MA0004.1'. The \verb+fetch_motif_by_id+ method allows you to use either the fully specified ID or just the base ID. If only the base ID is provided, the latest version of the motif is returned. \begin{verbatim} >>> arnt = jdb.fetch_motif_by_id("MA0004") \end{verbatim} Printing the motif reveals that the JASPAR SQL database stores much more meeta-information than the flat files: \begin{verbatim} >>> print(arnt) TF name Arnt Matrix ID MA0004.1 Collection CORE TF class Zipper-Type TF family Helix-Loop-Helix Species 10090 Taxonomic group vertebrates Accession ['P53762'] Data type used SELEX Medline 7592839 PAZAR ID TF0000003 Comments - Matrix: 0 1 2 3 4 5 A: 4.00 19.00 0.00 0.00 0.00 0.00 C: 16.00 0.00 20.00 0.00 0.00 0.00 G: 0.00 1.00 0.00 20.00 0.00 20.00 T: 0.00 0.00 0.00 0.00 20.00 0.00 \end{verbatim} We can also fetch motifs by name. The name must be an exact match (partial matches or database wildcards are not currently supported). Note that as the name is not guaranteed to be unique, the \verb+fetch_motifs_by_name+ method actually returns a list. \begin{verbatim} >>> motifs = jdb.fetch_motifs_by_name("Arnt") >>> print(motifs[0]) TF name Arnt Matrix ID MA0004.1 Collection CORE TF class Zipper-Type TF family Helix-Loop-Helix Species 10090 Taxonomic group vertebrates Accession ['P53762'] Data type used SELEX Medline 7592839 PAZAR ID TF0000003 Comments - Matrix: 0 1 2 3 4 5 A: 4.00 19.00 0.00 0.00 0.00 0.00 C: 16.00 0.00 20.00 0.00 0.00 0.00 G: 0.00 1.00 0.00 20.00 0.00 20.00 T: 0.00 0.00 0.00 0.00 20.00 0.00 \end{verbatim} The \verb+fetch_motifs+ method allows you to fetch motifs which match a specified set of criteria. These criteria include any of the above described meta information as well as certain matrix properties such as the minimum information content (\verb+min_ic+ in the example below), the minimum length of the matrix or the minimum number of sites used to construct the matrix. Only motifs which pass ALL the specified criteria are returned. Note that selection criteria which correspond to meta information which allow for multiple values may be specified as either a single value or a list of values, e.g. \verb+tax_group+ and \verb+tf_family+ in the example below. \begin{verbatim} >>> motifs = jdb.fetch_motifs( ... collection = 'CORE', ... tax_group = ['vertebrates', 'insects'], ... tf_class = 'Winged Helix-Turn-Helix', ... tf_family = ['Forkhead', 'Ets'], ... min_ic = 12 ... ) >>> for motif in motifs: ... pass # do something with the motif \end{verbatim} \subsubsection*{Compatibility with Perl TFBS modules} An important thing to note is that the JASPAR \verb+Motif+ class was designed to be compatible with the popular \href{http://tfbs.genereg.net/}{Perl TFBS modules}. Therefore some specifics about the choice of defaults for background and pseudocounts as well as how information content is computed and sequences searched for instances is based on this compatibility criteria. These choices are noted in the specific subsections below. \begin{itemize} \item{\bf Choice of background:} \\ The Perl \verb+TFBS+ modules appear to allow a choice of custom background probabilities (although the documentation states that uniform background is assumed). However the default is to use a uniform background. Therefore it is recommended that you use a uniform background for computing the position-specific scoring matrix (PSSM). This is the default when using the Biopython \verb+motifs+ module. \item{\bf Choice of pseudocounts:} \\ By default, the Perl \verb+TFBS+ modules use a pseudocount equal to $\sqrt{N} * \textrm{bg}[\textrm{nucleotide}]$, where $N$ represents the total number of sequences used to construct the matrix. To apply this same pseudocount formula, set the motif \verb+pseudocounts+ attribute using the \verb+jaspar.calculate\_pseudcounts()+ funtion: \begin{verbatim} >>> motif.pseudocounts = motifs.jaspar.calculate_pseudocounts(motif) \end{verbatim} Note that it is possible for the counts matrix to have an unequal number of sequences making up the columns. The pseudocount computation uses the average number of sequences making up the matrix. However, when \verb+normalize+ is called on the counts matrix, each count value in a column is divided by the total number of sequences making up that specific column, not by the average number of sequences. This differs from the Perl \verb+TFBS+ modules because the normalization is not done as a separate step and so the average number of sequences is used throughout the computation of the pssm. Therefore, for matrices with unequal column counts, the pssm computed by the \verb+motifs+ module will differ somewhat from the pssm computed by the Perl \verb+TFBS+ modules. \item{\bf Computation of matrix information content:} \\ The information content (IC) or specificity of a matrix is computed using the \verb+mean+ method of the \verb+PositionSpecificScoringMatrix+ class. However of note, in the Perl \verb+TFBS+ modules the default behaviour is to compute the IC without first applying pseudocounts, even though by default the PSSMs are computed using pseudocounts as described above. \item{\bf Searching for instances:} \\ Searching for instances with the Perl \verb+TFBS+ motifs was usually performed using a relative score threshold, i.e. a score in the range 0 to 1. In order to compute the absolute PSSM score corresponding to a relative score one can use the equation: \begin{verbatim} >>> abs_score = (pssm.max - pssm.min) * rel_score + pssm.min \end{verbatim} To convert the absolute score of an instance back to a relative score, one can use the equation: \begin{verbatim} >>> rel_score = (abs_score - pssm.min) / (pssm.max - pssm.min) \end{verbatim} For example, using the Arnt motif before, let's search a sequence with a relative score threshold of 0.8. %TODO - Check missing ... lines, make into a doctest? \begin{verbatim} >>> test_seq=Seq("TAAGCGTGCACGCGCAACACGTGCATTA", unambiguous_dna) >>> arnt.pseudocounts = motifs.jaspar.calculate_pseudocounts(arnt) >>> pssm = arnt.pssm() >>> max_score = pssm.max() >>> min_score = pssm.min() >>> abs_score_threshold = (max_score - min_score) * 0.8 + min_score >>> for position, score in pssm.search(test_seq, threshold=abs_score_threshold): ... rel_score = (score - min_score) / (max_score - min_score) ... print("Position %d: score = %5.3f, rel. score = %5.3f" % ( position, score, rel_score)) ... Position 2: score = 5.362, rel. score = 0.801 Position 8: score = 6.112, rel. score = 0.831 Position -20: score = 7.103, rel. score = 0.870 Position 17: score = 10.351, rel. score = 1.000 Position -11: score = 10.351, rel. score = 1.000 \end{verbatim} \end{itemize} \subsection{MEME} MEME \cite{bailey1994} is a tool for discovering motifs in a group of related DNA or protein sequences. It takes as input a group of DNA or protein sequences and outputs as many motifs as requested. Therefore, in contrast to JASPAR files, MEME output files typically contain multiple motifs. This is an example. At the top of an output file generated by MEME shows some background information about the MEME and the version of MEME used: \begin{verbatim} ******************************************************************************** MEME - Motif discovery tool ******************************************************************************** MEME version 3.0 (Release date: 2004/08/18 09:07:01) ... \end{verbatim} Further down, the input set of training sequences is recapitulated: \begin{verbatim} ******************************************************************************** TRAINING SET ******************************************************************************** DATAFILE= INO_up800.s ALPHABET= ACGT Sequence name Weight Length Sequence name Weight Length ------------- ------ ------ ------------- ------ ------ CHO1 1.0000 800 CHO2 1.0000 800 FAS1 1.0000 800 FAS2 1.0000 800 ACC1 1.0000 800 INO1 1.0000 800 OPI3 1.0000 800 ******************************************************************************** \end{verbatim} and the exact command line that was used: \begin{verbatim} ******************************************************************************** COMMAND LINE SUMMARY ******************************************************************************** This information can also be useful in the event you wish to report a problem with the MEME software. command: meme -mod oops -dna -revcomp -nmotifs 2 -bfile yeast.nc.6.freq INO_up800.s ... \end{verbatim} Next is detailed information on each motif that was found: \begin{verbatim} ******************************************************************************** MOTIF 1 width = 12 sites = 7 llr = 95 E-value = 2.0e-001 ******************************************************************************** -------------------------------------------------------------------------------- Motif 1 Description -------------------------------------------------------------------------------- Simplified A :::9:a::::3: pos.-specific C ::a:9:11691a probability G ::::1::94:4: matrix T aa:1::9::11: \end{verbatim} To parse this file (stored as \verb+meme.dna.oops.txt+), use %cont-doctest \begin{verbatim} >>> handle = open("meme.dna.oops.txt") >>> record = motifs.parse(handle, "meme") >>> handle.close() \end{verbatim} The \verb+motifs.parse+ command reads the complete file directly, so you can close the file after calling \verb+motifs.parse+. The header information is stored in attributes: %cont-doctest \begin{verbatim} >>> record.version '3.0' >>> record.datafile 'INO_up800.s' >>> record.command 'meme -mod oops -dna -revcomp -nmotifs 2 -bfile yeast.nc.6.freq INO_up800.s' >>> record.alphabet IUPACUnambiguousDNA() >>> record.sequences ['CHO1', 'CHO2', 'FAS1', 'FAS2', 'ACC1', 'INO1', 'OPI3'] \end{verbatim} The record is an object of the \verb+Bio.motifs.meme.Record+ class. The class inherits from list, and you can think of \verb+record+ as a list of Motif objects: %cont-doctest \begin{verbatim} >>> len(record) 2 >>> motif = record[0] >>> print(motif.consensus) TTCACATGCCGC >>> print(motif.degenerate_consensus) TTCACATGSCNC \end{verbatim} In addition to these generic motif attributes, each motif also stores its specific information as calculated by MEME. For example, %cont-doctest \begin{verbatim} >>> motif.num_occurrences 7 >>> motif.length 12 >>> evalue = motif.evalue >>> print("%3.1g" % evalue) 0.2 >>> motif.name 'Motif 1' \end{verbatim} In addition to using an index into the record, as we did above, you can also find it by its name: %cont-doctest \begin{verbatim} >>> motif = record['Motif 1'] \end{verbatim} Each motif has an attribute \verb+.instances+ with the sequence instances in which the motif was found, providing some information on each instance: %cont-doctest \begin{verbatim} >>> len(motif.instances) 7 >>> motif.instances[0] Instance('TTCACATGCCGC', IUPACUnambiguousDNA()) >>> motif.instances[0].motif_name 'Motif 1' >>> motif.instances[0].sequence_name 'INO1' >>> motif.instances[0].start 620 >>> motif.instances[0].strand '-' >>> motif.instances[0].length 12 >>> pvalue = motif.instances[0].pvalue >>> print("%5.3g" % pvalue) 1.85e-08 \end{verbatim} \subsubsection*{MAST} \subsection{TRANSFAC} TRANSFAC is a manually curated database of transcription factors, together with their genomic binding sites and DNA binding profiles \cite{matys2003}. While the file format used in the TRANSFAC database is nowadays also used by others, we will refer to it as the TRANSFAC file format. A minimal file in the TRANSFAC format looks as follows: \begin{verbatim} ID motif1 P0 A C G T 01 1 2 2 0 S 02 2 1 2 0 R 03 3 0 1 1 A 04 0 5 0 0 C 05 5 0 0 0 A 06 0 0 4 1 G 07 0 1 4 0 G 08 0 0 0 5 T 09 0 0 5 0 G 10 0 1 2 2 K 11 0 2 0 3 Y 12 1 0 3 1 G // \end{verbatim} This file shows the frequency matrix of motif \verb+motif1+ of 12 nucleotides. In general, one file in the TRANSFAC format can contain multiple motifs. For example, this is the contents of the example TRANSFAC file \verb+transfac.dat+: \begin{verbatim} VV EXAMPLE January 15, 2013 XX // ID motif1 P0 A C G T 01 1 2 2 0 S 02 2 1 2 0 R 03 3 0 1 1 A ... 11 0 2 0 3 Y 12 1 0 3 1 G // ID motif2 P0 A C G T 01 2 1 2 0 R 02 1 2 2 0 S ... 09 0 0 0 5 T 10 0 2 0 3 Y // \end{verbatim} To parse a TRANSFAC file, use %cont-doctest \begin{verbatim} >>> handle = open("transfac.dat") >>> record = motifs.parse(handle, "TRANSFAC") >>> handle.close() \end{verbatim} The overall version number, if available, is stored as \verb+record.version+: %cont-doctest \begin{verbatim} >>> record.version 'EXAMPLE January 15, 2013' \end{verbatim} Each motif in \verb+record+ is in instance of the \verb+Bio.motifs.transfac.Motif+ class, which inherits both from the \verb+Bio.motifs.Motif+ class and from a Python dictionary. The dictionary uses the two-letter keys to store any additional information about the motif: %cont-doctest \begin{verbatim} >>> motif = record[0] >>> motif.degenerate_consensus # Using the Bio.motifs.Motif method Seq('SRACAGGTGKYG', IUPACAmbiguousDNA()) >>> motif['ID'] # Using motif as a dictionary 'motif1' \end{verbatim} TRANSFAC files are typically much more elaborate than this example, containing lots of additional information about the motif. Table \ref{table:transfaccodes} lists the two-letter field codes that are commonly found in TRANSFAC files: \begin{table}[h] \label{table:transfaccodes} \begin{center} \caption{Fields commonly found in TRANSFAC files} \begin{tabular}{|l|l||} \verb+AC+ & Accession number \\ \verb+AS+ & Accession numbers, secondary \\ \verb+BA+ & Statistical basis \\ \verb+BF+ & Binding factors \\ \verb+BS+ & Factor binding sites underlying the matrix \\ \verb+CC+ & Comments \\ \verb+CO+ & Copyright notice \\ \verb+DE+ & Short factor description \\ \verb+DR+ & External databases \\ \verb+DT+ & Date created/updated \\ \verb+HC+ & Subfamilies \\ \verb+HP+ & Superfamilies \\ \verb+ID+ & Identifier \\ \verb+NA+ & Name of the binding factor \\ \verb+OC+ & Taxonomic classification \\ \verb+OS+ & Species/Taxon \\ \verb+OV+ & Older version \\ \verb+PV+ & Preferred version \\ \verb+TY+ & Type \\ \verb+XX+ & Empty line; these are not stored in the Record. \\ \end{tabular} \end{center} \end{table} Each motif also has an attribute \verb+.references+ containing the references associated with the motif, using these two-letter keys: \begin{table}[h] \begin{center} \caption{Fields used to store references in TRANSFAC files} \begin{tabular}{|l|l||} \verb+RN+ & Reference number \\ \verb+RA+ & Reference authors \\ \verb+RL+ & Reference data \\ \verb+RT+ & Reference title \\ \verb+RX+ & PubMed ID \\ \end{tabular} \end{center} \end{table} Printing the motifs writes them out in their native TRANSFAC format: %cont-doctest \begin{verbatim} >>> print(record) VV EXAMPLE January 15, 2013 XX // ID motif1 XX P0 A C G T 01 1 2 2 0 S 02 2 1 2 0 R 03 3 0 1 1 A 04 0 5 0 0 C 05 5 0 0 0 A 06 0 0 4 1 G 07 0 1 4 0 G 08 0 0 0 5 T 09 0 0 5 0 G 10 0 1 2 2 K 11 0 2 0 3 Y 12 1 0 3 1 G XX // ID motif2 XX P0 A C G T 01 2 1 2 0 R 02 1 2 2 0 S 03 0 5 0 0 C 04 3 0 1 1 A 05 0 0 4 1 G 06 5 0 0 0 A 07 0 1 4 0 G 08 0 0 5 0 G 09 0 0 0 5 T 10 0 2 0 3 Y XX // \end{verbatim} You can export the motifs in the TRANSFAC format by capturing this output in a string and saving it in a file: \begin{verbatim} >>> text = str(record) >>> handle = open("mytransfacfile.dat", 'w') >>> handle.write(text) >>> handle.close() \end{verbatim} \section{Writing motifs} Speaking of exporting, let's look at export functions in general. We can use the \verb+format+ method to write the motif in the simple JASPAR \verb+pfm+ format: %the tabs in the output confuse doctest; don't test \begin{verbatim} >>> print(arnt.format("pfm")) 4.00 19.00 0.00 0.00 0.00 0.00 16.00 0.00 20.00 0.00 0.00 0.00 0.00 1.00 0.00 20.00 0.00 20.00 0.00 0.00 0.00 0.00 20.00 0.00 \end{verbatim} Similarly, we can use \verb+format+ to write the motif in the JASPAR \verb+jaspar+ format: \begin{verbatim} >>> print(arnt.format("jaspar")) >MA0004.1 Arnt A [ 4.00 19.00 0.00 0.00 0.00 0.00] C [ 16.00 0.00 20.00 0.00 0.00 0.00] G [ 0.00 1.00 0.00 20.00 0.00 20.00] T [ 0.00 0.00 0.00 0.00 20.00 0.00] \end{verbatim} To write the motif in a TRANSFAC-like matrix format, use %cont-doctest \begin{verbatim} >>> print(m.format("transfac")) P0 A C G T 01 3 0 0 4 W 02 7 0 0 0 A 03 0 5 0 2 C 04 2 2 3 0 V 05 1 6 0 0 C XX // \end{verbatim} To write out multiple motifs, you can use \verb+motifs.write+. This function can be used regardless of whether the motifs originated from a TRANSFAC file. For example, %cont-doctest \begin{verbatim} >>> two_motifs = [arnt, srf] >>> print(motifs.write(two_motifs, 'transfac')) P0 A C G T 01 4 16 0 0 C 02 19 0 1 0 A 03 0 20 0 0 C 04 0 0 20 0 G 05 0 0 0 20 T 06 0 0 20 0 G XX // P0 A C G T 01 2 1 39 4 G 02 9 33 2 2 C 03 0 45 1 0 C 04 1 45 0 0 C 05 32 1 0 13 A 06 3 1 0 42 T 07 46 0 0 0 A 08 1 0 0 45 T 09 43 0 0 3 A 10 15 1 0 30 T 11 2 0 44 0 G 12 2 1 43 0 G XX // \end{verbatim} Or, to write multiple motifs in the \verb+jaspar+ format: \begin{verbatim} >>> two_motifs = [arnt, mef2a] >>> print(motifs.write(two_motifs, "jaspar")) >MA0004.1 Arnt A [ 4.00 19.00 0.00 0.00 0.00 0.00] C [ 16.00 0.00 20.00 0.00 0.00 0.00] G [ 0.00 1.00 0.00 20.00 0.00 20.00] T [ 0.00 0.00 0.00 0.00 20.00 0.00] >MA0052.1 MEF2A A [ 1.00 0.00 57.00 2.00 9.00 6.00 37.00 2.00 56.00 6.00] C [ 50.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00] G [ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 50.00] T [ 7.00 58.00 0.00 55.00 49.00 52.00 21.00 56.00 0.00 2.00] \end{verbatim} \section{Position-Weight Matrices} The \verb+.counts+ attribute of a Motif object shows how often each nucleotide appeared at each position along the alignment. We can normalize this matrix by dividing by the number of instances in the alignment, resulting in the probability of each nucleotide at each position along the alignment. We refer to these probabilities as the position-weight matrix. However, beware that in the literature this term may also be used to refer to the position-specific scoring matrix, which we discuss below. Usually, pseudocounts are added to each position before normalizing. This avoids overfitting of the position-weight matrix to the limited number of motif instances in the alignment, and can also prevent probabilities from becoming zero. To add a fixed pseudocount to all nucleotides at all positions, specify a number for the \verb+pseudocounts+ argument: %cont-doctest \begin{verbatim} >>> pwm = m.counts.normalize(pseudocounts=0.5) >>> print(pwm) 0 1 2 3 4 A: 0.39 0.83 0.06 0.28 0.17 C: 0.06 0.06 0.61 0.28 0.72 G: 0.06 0.06 0.06 0.39 0.06 T: 0.50 0.06 0.28 0.06 0.06 \end{verbatim} Alternatively, \verb+pseudocounts+ can be a dictionary specifying the pseudocounts for each nucleotide. For example, as the GC content of the human genome is about 40\%, you may want to choose the pseudocounts accordingly: %cont-doctest \begin{verbatim} >>> pwm = m.counts.normalize(pseudocounts={'A':0.6, 'C': 0.4, 'G': 0.4, 'T': 0.6}) >>> print(pwm) 0 1 2 3 4 A: 0.40 0.84 0.07 0.29 0.18 C: 0.04 0.04 0.60 0.27 0.71 G: 0.04 0.04 0.04 0.38 0.04 T: 0.51 0.07 0.29 0.07 0.07 \end{verbatim} The position-weight matrix has its own methods to calculate the consensus, anticonsensus, and degenerate consensus sequences: %cont-doctest \begin{verbatim} >>> pwm.consensus Seq('TACGC', IUPACUnambiguousDNA()) >>> pwm.anticonsensus Seq('GGGTG', IUPACUnambiguousDNA()) >>> pwm.degenerate_consensus Seq('WACNC', IUPACAmbiguousDNA()) \end{verbatim} Note that due to the pseudocounts, the degenerate consensus sequence calculated from the position-weight matrix is slightly different from the degenerate consensus sequence calculated from the instances in the motif: %cont-doctest \begin{verbatim} >>> m.degenerate_consensus Seq('WACVC', IUPACAmbiguousDNA()) \end{verbatim} The reverse complement of the position-weight matrix can be calculated directly from the \verb+pwm+: %cont-doctest \begin{verbatim} >>> rpwm = pwm.reverse_complement() >>> print(rpwm) 0 1 2 3 4 A: 0.07 0.07 0.29 0.07 0.51 C: 0.04 0.38 0.04 0.04 0.04 G: 0.71 0.27 0.60 0.04 0.04 T: 0.18 0.29 0.07 0.84 0.40 \end{verbatim} \section{Position-Specific Scoring Matrices} Using the background distribution and PWM with pseudo-counts added, it's easy to compute the log-odds ratios, telling us what are the log odds of a particular symbol to be coming from a motif against the background. We can use the \verb|.log_odds()| method on the position-weight matrix: %cont-doctest \begin{verbatim} >>> pssm = pwm.log_odds() >>> print(pssm) 0 1 2 3 4 A: 0.68 1.76 -1.91 0.21 -0.49 C: -2.49 -2.49 1.26 0.09 1.51 G: -2.49 -2.49 -2.49 0.60 -2.49 T: 1.03 -1.91 0.21 -1.91 -1.91 \end{verbatim} Here we can see positive values for symbols more frequent in the motif than in the background and negative for symbols more frequent in the background. $0.0$ means that it's equally likely to see a symbol in the background and in the motif. This assumes that A, C, G, and T are equally likely in the background. To calculate the position-specific scoring matrix against a background with unequal probabilities for A, C, G, T, use the \verb+background+ argument. For example, against a background with a 40\% GC content, use %cont-doctest \begin{verbatim} >>> background = {'A':0.3,'C':0.2,'G':0.2,'T':0.3} >>> pssm = pwm.log_odds(background) >>> print(pssm) 0 1 2 3 4 A: 0.42 1.49 -2.17 -0.05 -0.75 C: -2.17 -2.17 1.58 0.42 1.83 G: -2.17 -2.17 -2.17 0.92 -2.17 T: 0.77 -2.17 -0.05 -2.17 -2.17 \end{verbatim} The maximum and minimum score obtainable from the PSSM are stored in the \verb+.max+ and \verb+.min+ properties: %cont-doctest \begin{verbatim} >>> print("%4.2f" % pssm.max) 6.59 >>> print("%4.2f" % pssm.min) -10.85 \end{verbatim} The mean and standard deviation of the PSSM scores with respect to a specific background are calculated by the \verb+.mean+ and \verb+.std+ methods. %cont-doctest \begin{verbatim} >>> mean = pssm.mean(background) >>> std = pssm.std(background) >>> print("mean = %0.2f, standard deviation = %0.2f" % (mean, std)) mean = 3.21, standard deviation = 2.59 \end{verbatim} A uniform background is used if \verb+background+ is not specified. The mean is particularly important, as its value is equal to the Kullback-Leibler divergence or relative entropy, and is a measure for the information content of the motif compared to the background. As in Biopython the base-2 logarithm is used in the calculation of the log-odds scores, the information content has units of bits. The \verb+.reverse_complement+, \verb+.consensus+, \verb+.anticonsensus+, and \verb+.degenerate_consensus+ methods can be applied directly to PSSM objects. \section{Searching for instances} \label{sec:search} The most frequent use for a motif is to find its instances in some sequence. For the sake of this section, we will use an artificial sequence like this: %cont-doctest \begin{verbatim} >>> test_seq=Seq("TACACTGCATTACAACCCAAGCATTA", m.alphabet) >>> len(test_seq) 26 \end{verbatim} \subsection{Searching for exact matches} The simplest way to find instances, is to look for exact matches of the true instances of the motif: %cont-doctest \begin{verbatim} >>> for pos, seq in m.instances.search(test_seq): ... print("%i %s" % (pos, seq)) ... 0 TACAC 10 TACAA 13 AACCC \end{verbatim} We can do the same with the reverse complement (to find instances on the complementary strand): %cont-doctest \begin{verbatim} >>> for pos, seq in r.instances.search(test_seq): ... print("%i %s" % (pos, seq)) ... 6 GCATT 20 GCATT \end{verbatim} \subsection{Searching for matches using the PSSM score} It's just as easy to look for positions, giving rise to high log-odds scores against our motif: %cont-doctest \begin{verbatim} >>> for position, score in pssm.search(test_seq, threshold=3.0): ... print("Position %d: score = %5.3f" % (position, score)) ... Position 0: score = 5.622 Position -20: score = 4.601 Position 10: score = 3.037 Position 13: score = 5.738 Position -6: score = 4.601 \end{verbatim} The negative positions refer to instances of the motif found on the reverse strand of the test sequence, and follow the Python convention on negative indices. Therefore, the instance of the motif at \verb|pos| is located at \verb|test_seq[pos:pos+len(m)]| both for positive and for negative values of \verb|pos|. You may notice the threshold parameter, here set arbitrarily to $3.0$. This is in $log_2$, so we are now looking only for words, which are eight times more likely to occur under the motif model than in the background. The default threshold is $0.0$, which selects everything that looks more like the motif than the background. You can also calculate the scores at all positions along the sequence: %Don't use a doc test for this as the spacing can differ \begin{verbatim} >>> pssm.calculate(test_seq) array([ 5.62230396, -5.6796999 , -3.43177247, 0.93827754, -6.84962511, -2.04066086, -10.84962463, -3.65614533, -0.03370807, -3.91102552, 3.03734159, -2.14918518, -0.6016975 , 5.7381525 , -0.50977498, -3.56422281, -8.73414803, -0.09919716, -0.6016975 , -2.39429784, -10.84962463, -3.65614533], dtype=float32) \end{verbatim} In general, this is the fastest way to calculate PSSM scores. The scores returned by \verb+pssm.calculate+ are for the forward strand only. To obtain the scores on the reverse strand, you can take the reverse complement of the PSSM: \begin{verbatim} >>> rpssm = pssm.reverse_complement() >>> rpssm.calculate(test_seq) array([ -9.43458748, -3.06172252, -7.18665981, -7.76216221, -2.04066086, -4.26466274, 4.60124254, -4.2480607 , -8.73414803, -2.26503372, -6.49598789, -5.64668512, -8.73414803, -10.84962463, -4.82356262, -4.82356262, -5.64668512, -8.73414803, -4.15613794, -5.6796999 , 4.60124254, -4.2480607 ], dtype=float32) \end{verbatim} \subsection{Selecting a score threshold} If you want to use a less arbitrary way of selecting thresholds, you can explore the distribution of PSSM scores. Since the space for a score distribution grows exponentially with motif length, we are using an approximation with a given precision to keep computation cost manageable: %cont-doctest \begin{verbatim} >>> distribution = pssm.distribution(background=background, precision=10**4) \end{verbatim} The \verb+distribution+ object can be used to determine a number of different thresholds. We can specify the requested false-positive rate (probability of ``finding'' a motif instance in background generated sequence): %cont-doctest \begin{verbatim} >>> threshold = distribution.threshold_fpr(0.01) >>> print("%5.3f" % threshold) 4.009 \end{verbatim} or the false-negative rate (probability of ``not finding'' an instance generated from the motif): %cont-doctest \begin{verbatim} >>> threshold = distribution.threshold_fnr(0.1) >>> print("%5.3f" % threshold) -0.510 \end{verbatim} or a threshold (approximately) satisfying some relation between the false-positive rate and the false-negative rate ($\frac{\textrm{fnr}}{\textrm{fpr}}\simeq t$): %cont-doctest \begin{verbatim} >>> threshold = distribution.threshold_balanced(1000) >>> print("%5.3f" % threshold) 6.241 \end{verbatim} or a threshold satisfying (roughly) the equality between the false-positive rate and the $-log$ of the information content (as used in patser software by Hertz and Stormo): %cont-doctest \begin{verbatim} >>> threshold = distribution.threshold_patser() >>> print("%5.3f" % threshold) 0.346 \end{verbatim} For example, in case of our motif, you can get the threshold giving you exactly the same results (for this sequence) as searching for instances with balanced threshold with rate of $1000$. %cont-doctest \begin{verbatim} >>> threshold = distribution.threshold_fpr(0.01) >>> print("%5.3f" % threshold) 4.009 >>> for position, score in pssm.search(test_seq, threshold=threshold): ... print("Position %d: score = %5.3f" % (position, score)) ... Position 0: score = 5.622 Position -20: score = 4.601 Position 13: score = 5.738 Position -6: score = 4.601 \end{verbatim} \section{Each motif object has an associated Position-Specific Scoring Matrix} To facilitate searching for potential TFBSs using PSSMs, both the position-weight matrix and the position-specific scoring matrix are associated with each motif. Using the Arnt motif as an example: %TODO - Start a new doctest here? %cont-doctest \begin{verbatim} >>> from Bio import motifs >>> handle = open("Arnt.sites") >>> motif = motifs.read(handle, 'sites') >>> print(motif.counts) 0 1 2 3 4 5 A: 4.00 19.00 0.00 0.00 0.00 0.00 C: 16.00 0.00 20.00 0.00 0.00 0.00 G: 0.00 1.00 0.00 20.00 0.00 20.00 T: 0.00 0.00 0.00 0.00 20.00 0.00 >>> print(motif.pwm) 0 1 2 3 4 5 A: 0.20 0.95 0.00 0.00 0.00 0.00 C: 0.80 0.00 1.00 0.00 0.00 0.00 G: 0.00 0.05 0.00 1.00 0.00 1.00 T: 0.00 0.00 0.00 0.00 1.00 0.00 \end{verbatim} %Can't use next bit in doctest, Windows Python 2.5 and 2.6 put -1.$ not -inf \begin{verbatim} >>> print(motif.pssm) 0 1 2 3 4 5 A: -0.32 1.93 -inf -inf -inf -inf C: 1.68 -inf 2.00 -inf -inf -inf G: -inf -2.32 -inf 2.00 -inf 2.00 T: -inf -inf -inf -inf 2.00 -inf \end{verbatim} The negative infinities appear here because the corresponding entry in the frequency matrix is 0, and we are using zero pseudocounts by default: %cont-doctest \begin{verbatim} >>> for letter in "ACGT": ... print("%s: %4.2f" % (letter, motif.pseudocounts[letter])) ... A: 0.00 C: 0.00 G: 0.00 T: 0.00 \end{verbatim} If you change the \verb+.pseudocounts+ attribute, the position-frequency matrix and the position-specific scoring matrix are recalculated automatically: %cont-doctest \begin{verbatim} >>> motif.pseudocounts = 3.0 >>> for letter in "ACGT": ... print("%s: %4.2f" % (letter, motif.pseudocounts[letter])) ... A: 3.00 C: 3.00 G: 3.00 T: 3.00 \end{verbatim} %Can't use this in doctest, Windows Python 2.5 and 2.6 give G/1 as 0.13 not 0.12 %TODO - Check why... \begin{verbatim} >>> print(motif.pwm) 0 1 2 3 4 5 A: 0.22 0.69 0.09 0.09 0.09 0.09 C: 0.59 0.09 0.72 0.09 0.09 0.09 G: 0.09 0.12 0.09 0.72 0.09 0.72 T: 0.09 0.09 0.09 0.09 0.72 0.09 \end{verbatim} %cont-doctest \begin{verbatim} >>> print(motif.pssm) 0 1 2 3 4 5 A: -0.19 1.46 -1.42 -1.42 -1.42 -1.42 C: 1.25 -1.42 1.52 -1.42 -1.42 -1.42 G: -1.42 -1.00 -1.42 1.52 -1.42 1.52 T: -1.42 -1.42 -1.42 -1.42 1.52 -1.42 \end{verbatim} You can also set the \verb+.pseudocounts+ to a dictionary over the four nucleotides if you want to use different pseudocounts for them. Setting \verb+motif.pseudocounts+ to \verb+None+ resets it to its default value of zero. The position-specific scoring matrix depends on the background distribution, which is uniform by default: %cont-doctest \begin{verbatim} >>> for letter in "ACGT": ... print("%s: %4.2f" % (letter, motif.background[letter])) ... A: 0.25 C: 0.25 G: 0.25 T: 0.25 \end{verbatim} Again, if you modify the background distribution, the position-specific scoring matrix is recalculated: %cont-doctest \begin{verbatim} >>> motif.background = {'A': 0.2, 'C': 0.3, 'G': 0.3, 'T': 0.2} >>> print(motif.pssm) 0 1 2 3 4 5 A: 0.13 1.78 -1.09 -1.09 -1.09 -1.09 C: 0.98 -1.68 1.26 -1.68 -1.68 -1.68 G: -1.68 -1.26 -1.68 1.26 -1.68 1.26 T: -1.09 -1.09 -1.09 -1.09 1.85 -1.09 \end{verbatim} Setting \verb+motif.background+ to \verb+None+ resets it to a uniform distribution: %cont-doctest \begin{verbatim} >>> motif.background = None >>> for letter in "ACGT": ... print("%s: %4.2f" % (letter, motif.background[letter])) ... A: 0.25 C: 0.25 G: 0.25 T: 0.25 \end{verbatim} If you set \verb+motif.background+ equal to a single value, it will be interpreted as the GC content: %cont-doctest \begin{verbatim} >>> motif.background = 0.8 >>> for letter in "ACGT": ... print("%s: %4.2f" % (letter, motif.background[letter])) ... A: 0.10 C: 0.40 G: 0.40 T: 0.10 \end{verbatim} Note that you can now calculate the mean of the PSSM scores over the background against which it was computed: %cont-doctest \begin{verbatim} >>> print("%f" % motif.pssm.mean(motif.background)) 4.703928 \end{verbatim} as well as its standard deviation: %cont-doctest \begin{verbatim} >>> print("%f" % motif.pssm.std(motif.background)) 3.290900 \end{verbatim} and its distribution: %cont-doctest \begin{verbatim} >>> distribution = motif.pssm.distribution(background=motif.background) >>> threshold = distribution.threshold_fpr(0.01) >>> print("%f" % threshold) 3.854375 \end{verbatim} Note that the position-weight matrix and the position-specific scoring matrix are recalculated each time you call \verb+motif.pwm+ or \verb+motif.pssm+, respectively. If speed is an issue and you want to use the PWM or PSSM repeatedly, you can save them as a variable, as in \begin{verbatim} >>> pssm = motif.pssm \end{verbatim} \section{Comparing motifs} \label{sec:comp} Once we have more than one motif, we might want to compare them. Before we start comparing motifs, I should point out that motif boundaries are usually quite arbitrary. This means we often need to compare motifs of different lengths, so comparison needs to involve some kind of alignment. This means we have to take into account two things: \begin{itemize} \item alignment of motifs \item some function to compare aligned motifs \end{itemize} To align the motifs, we use ungapped alignment of PSSMs and substitute zeros for any missing columns at the beginning and end of the matrices. This means that effectively we are using the background distribution for columns missing from the PSSM. The distance function then returns the minimal distance between motifs, as well as the corresponding offset in their alignment. To give an exmaple, let us first load another motif, which is similar to our test motif \verb|m|: %TODO - Start a new doctest here? %cont-doctest \begin{verbatim} >>> m_reb1 = motifs.read(open("REB1.pfm"), "pfm") >>> m_reb1.consensus Seq('GTTACCCGG', IUPACUnambiguousDNA()) >>> print(m_reb1.counts) 0 1 2 3 4 5 6 7 8 A: 30.00 0.00 0.00 100.00 0.00 0.00 0.00 0.00 15.00 C: 10.00 0.00 0.00 0.00 100.00 100.00 100.00 0.00 15.00 G: 50.00 0.00 0.00 0.00 0.00 0.00 0.00 60.00 55.00 T: 10.00 100.00 100.00 0.00 0.00 0.00 0.00 40.00 15.00 \end{verbatim} To make the motifs comparable, we choose the same values for the pseudocounts and the background distribution as our motif \verb|m|: %cont-doctest \begin{verbatim} >>> m_reb1.pseudocounts = {'A':0.6, 'C': 0.4, 'G': 0.4, 'T': 0.6} >>> m_reb1.background = {'A':0.3,'C':0.2,'G':0.2,'T':0.3} >>> pssm_reb1 = m_reb1.pssm >>> print(pssm_reb1) 0 1 2 3 4 5 6 7 8 A: 0.00 -5.67 -5.67 1.72 -5.67 -5.67 -5.67 -5.67 -0.97 C: -0.97 -5.67 -5.67 -5.67 2.30 2.30 2.30 -5.67 -0.41 G: 1.30 -5.67 -5.67 -5.67 -5.67 -5.67 -5.67 1.57 1.44 T: -1.53 1.72 1.72 -5.67 -5.67 -5.67 -5.67 0.41 -0.97 \end{verbatim} We'll compare these motifs using the Pearson correlation. Since we want it to resemble a distance measure, we actually take $1-r$, where $r$ is the Pearson correlation coefficient (PCC): %cont-doctest \begin{verbatim} >>> distance, offset = pssm.dist_pearson(pssm_reb1) >>> print("distance = %5.3g" % distance) distance = 0.239 >>> print(offset) -2 \end{verbatim} This means that the best PCC between motif \verb|m| and \verb|m_reb1| is obtained with the following alignment: \begin{verbatim} m: bbTACGCbb m_reb1: GTTACCCGG \end{verbatim} where \verb|b| stands for background distribution. The PCC itself is roughly $1-0.239=0.761$. \section{\emph{De novo} motif finding} \label{sec:find} Currently, Biopython has only limited support for \emph{de novo} motif finding. Namely, we support running and parsing of AlignAce and MEME. Since the number of motif finding tools is growing rapidly, contributions of new parsers are welcome. \subsection{MEME} \label{sec:meme} Let's assume, you have run MEME on sequences of your choice with your favorite parameters and saved the output in the file \verb|meme.out|. You can retrieve the motifs reported by MEME by running the following piece of code: %doctest ../Tests/Motif \begin{verbatim} >>> from Bio import motifs >>> motifsM = motifs.parse(open("meme.out"), "meme") \end{verbatim} \begin{verbatim} >>> motifsM [] \end{verbatim} Besides the most wanted list of motifs, the result object contains more useful information, accessible through properties with self-explanatory names: \begin{itemize} \item \verb|.alphabet| \item \verb|.datafile| \item \verb|.sequence_names| \item \verb|.version| \item \verb|.command| \end{itemize} The motifs returned by the MEME Parser can be treated exactly like regular Motif objects (with instances), they also provide some extra functionality, by adding additional information about the instances. %cont-doctest \begin{verbatim} >>> motifsM[0].consensus Seq('CTCAATCGTA', IUPACUnambiguousDNA()) >>> motifsM[0].instances[0].sequence_name 'SEQ10;' >>> motifsM[0].instances[0].start 3 >>> motifsM[0].instances[0].strand '+' \end{verbatim} \begin{verbatim} >>> motifsM[0].instances[0].pvalue 8.71e-07 \end{verbatim} \subsection{AlignAce} \label{sec:alignace} We can do very similar things with the AlignACE program. Assume, you have your output in the file \verb|alignace.out|. You can parse your output with the following code: %cont-doctest \begin{verbatim} >>> from Bio import motifs >>> motifsA = motifs.parse(open("alignace.out"), "alignace") \end{verbatim} Again, your motifs behave as they should: %cont-doctest \begin{verbatim} >>> motifsA[0].consensus Seq('TCTACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} In fact you can even see, that AlignAce found a very similar motif as MEME. It is just a longer version of a reverse complement of the MEME motif: %cont-doctest \begin{verbatim} >>> motifsM[0].reverse_complement().consensus Seq('TACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} If you have AlignAce installed on the same machine, you can also run it directly from Biopython. A short example of how this can be done is shown below (other parameters can be specified as keyword parameters): \begin{verbatim} >>> command="/opt/bin/AlignACE" >>> input_file="test.fa" >>> from Bio.motifs.applications import AlignAceCommandline >>> cmd = AlignAceCommandline(cmd=command, input=input_file, gcback=0.6, numcols=10) >>> stdout, stderr= cmd() \end{verbatim} Since AlignAce prints all of its output to standard output, you can get to your motifs by parsing the first part of the result: \begin{verbatim} >>> motifs = motifs.parse(stdout, "alignace") \end{verbatim} \section{Useful links } \label{sec:links} \begin{itemize} \item \href{http://en.wikipedia.org/wiki/Sequence_motif}{Sequence motif} in wikipedia \item \href{http://en.wikipedia.org/wiki/Position_weight_matrix}{PWM} in wikipedia \item \href{http://en.wikipedia.org/wiki/Consensus_sequence}{Consensus sequence} in wikipedia \item \href{http://bio.cs.washington.edu/assessment/}{Comparison of different motif finding programs} \end{itemize} \section{Obsolete Bio.Motif module} The rest of this chapter above describes the \verb|Bio.motifs| package included in Biopython 1.61 onwards, which is replacing the older \verb|Bio.Motif| package introduced with Biopython 1.50, which was in turn based on two older former Biopython modules, \verb|Bio.AlignAce| and \verb|Bio.MEME|. To allow for a smooth transition, the older \verb|Bio.Motif| package will be maintained in parallel with its replacement \verb|Bio.motifs| at least two more releases, and at least one year. \subsection{Motif objects} %TODO - turn these into doctests... Since we are interested in motif analysis, we need to take a look at \verb|Motif| objects in the first place. For that we need to import the Motif library: %doctest \begin{verbatim} >>> from Bio import Motif \end{verbatim} and we can start creating our first motif objects. Let's create a DNA motif: %cont-doctest \begin{verbatim} >>> from Bio.Alphabet import IUPAC >>> m = Motif.Motif(alphabet=IUPAC.unambiguous_dna) \end{verbatim} This is for now just an empty container, so let's add some sequences to our newly created motif: %cont-doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> m.add_instance(Seq("TATAA", m.alphabet)) >>> m.add_instance(Seq("TATTA", m.alphabet)) >>> m.add_instance(Seq("TATAA", m.alphabet)) >>> m.add_instance(Seq("TATAA", m.alphabet)) \end{verbatim} Now we have a full \verb|Motif| instance, so we can try to get some basic information about it. Let's start with length and consensus sequence: %cont-doctest \begin{verbatim} >>> len(m) 5 >>> m.consensus() Seq('TATAA', IUPACUnambiguousDNA()) \end{verbatim} In case of DNA motifs, we can also get a reverse complement of a motif: %>>> m.reverse_complement() % %cont-doctest \begin{verbatim} >>> m.reverse_complement().consensus() Seq('TTATA', IUPACUnambiguousDNA()) >>> for i in m.reverse_complement().instances: ... print(i) TTATA TAATA TTATA TTATA \end{verbatim} We can also calculate the information content of a motif with a simple call: %cont-doctest \begin{verbatim} >>> print("%0.2f" % m.ic()) 5.27 \end{verbatim} This gives us a number of bits of information provided by the motif, which tells us how much differs from background. The most common representation of a motif is a PWM (Position Weight Matrix). It summarizes the probabilities of finding any symbol (in this case nucleotide) in any position of a motif. It can be computed by calling the \verb|.pwm()| method: \begin{verbatim} >>> m.pwm() [{'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}, {'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, {'A': 0.65, 'C': 0.05, 'T': 0.25, 'G': 0.05}, {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}] \end{verbatim} The probabilities in the motif's PWM are based on the counts in the instances, but we can see, that even though there were no Gs and no Cs in the instances, we still have non-zero probabilities assigned to them. These come from pseudo-counts which are, roughly speaking, a commonly used way to acknowledge the incompleteness of our knowledge and avoid technical problems with calculating logarithms of $0$. We can control the way that pseudo-counts are added with two properties of Motif objects \verb|.background| is the probability distribution over all symbols in the alphabet that we assume represents background, non-motif sequences (usually based on the GC content of the respective genome). It is by default set to a uniform distribution upon creation of a motif: \begin{verbatim} >>> m.background {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25} \end{verbatim} The other parameter is \verb|.beta|, which states the amount of pseudo-counts we should add to the PWM. By default it is set to $1.0$, %cont-doctest \begin{verbatim} >>> m.beta 1.0 \end{verbatim} so that the total input of pseudo-counts is equal to that of one instance. Using the background distribution and pwm with pseudo-counts added, it's easy to compute the log-odds ratios, telling us what are the log odds of a particular symbol to be coming from a motif against the background. We can use the \verb|.log_odds()| method: \begin{verbatim} >>> m.log_odds() [{'A': -2.3219280948873622, 'C': -2.3219280948873622, 'T': 1.7655347463629771, 'G': -2.3219280948873622}, {'A': 1.7655347463629771, 'C': -2.3219280948873622, 'T': -2.3219280948873622, 'G': -2.3219280948873622}, {'A': -2.3219280948873622, 'C': -2.3219280948873622, 'T': 1.7655347463629771, 'G': -2.3219280948873622}, {'A': 1.3785116232537298, 'C': -2.3219280948873622, 'T': 0.0, 'G': -2.3219280948873622}, {'A': 1.7655347463629771, 'C': -2.3219280948873622, 'T': -2.3219280948873622, 'G': -2.3219280948873622} ] \end{verbatim} Here we can see positive values for symbols more frequent in the motif than in the background and negative for symbols more frequent in the background. $0.0$ means that it's equally likely to see a symbol in background and in the motif (e.g. `T' in the second-last position). \subsubsection{Reading and writing} Creating motifs from instances by hand is a bit boring, so it's useful to have some I/O functions for reading and writing motifs. There are no really well established standards for storing motifs, but there's a couple of formats which are more used than others. The most important distinction is whether the motif representation is based on instances or on some version of PWM matrix. On of the most popular motif databases \href{http://jaspar.genereg.net}{JASPAR} stores motifs in both formats, so let's look at how we can import JASPAR motifs from instances: %doctest ../Tests/Motif \begin{verbatim} >>> from Bio import Motif >>> arnt = Motif.read(open("Arnt.sites"), "jaspar-sites") \end{verbatim} and from a count matrix: %cont-doctest \begin{verbatim} >>> srf = Motif.read(open("SRF.pfm"), "jaspar-pfm") \end{verbatim} The \verb|arnt| and \verb|srf| motifs can both do the same things for us, but they use different internal representations of the motif. We can tell that by inspecting the \verb|has_counts| and \verb|has_instances| properties: %cont-doctest \begin{verbatim} >>> arnt.has_instances True >>> srf.has_instances False >>> srf.has_counts True \end{verbatim} %TODO - sort order and formatting for doctest? \begin{verbatim} >>> srf.counts {'A': [2, 9, 0, 1, 32, 3, 46, 1, 43, 15, 2, 2], 'C': [1, 33, 45, 45, 1, 1, 0, 0, 0, 1, 0, 1], 'G': [39, 2, 1, 0, 0, 0, 0, 0, 0, 0, 44, 43], 'T': [4, 2, 0, 0, 13, 42, 0, 45, 3, 30, 0, 0]} \end{verbatim} There are conversion functions, which can help us convert between different representations: \begin{verbatim} >>> arnt.make_counts_from_instances() {'A': [8, 38, 0, 0, 0, 0], 'C': [32, 0, 40, 0, 0, 0], 'G': [0, 2, 0, 40, 0, 40], 'T': [0, 0, 0, 0, 40, 0]} >>> srf.make_instances_from_counts() [Seq('GGGAAAAAAAGG', IUPACUnambiguousDNA()), Seq('GGCCAAATAAGG', IUPACUnambiguousDNA()), Seq('GACCAAATAAGG', IUPACUnambiguousDNA()), .... \end{verbatim} The important thing to remember here is that the method \verb|make_instances_from_counts()| creates fake instances, because usually there are very many possible sets of instances which give rise to the same pwm, and if we have only the count matrix, we cannot reconstruct the original one. This does not make any difference if we are using the PWM as the representation of the motif, but one should be careful with exporting instances from count-based motifs. Speaking of exporting, let's look at export functions. We can export to fasta: \begin{verbatim} >>> print(m.format("fasta")) >instance0 TATAA >instance1 TATTA >instance2 TATAA >instance3 TATAA \end{verbatim} or to TRANSFAC-like matrix format (used by some motif processing software) \begin{verbatim} >>> print(m.format("transfac")) XX TY Motif ID BF undef P0 G A T C 01 0 0 4 0 02 0 4 0 0 03 0 0 4 0 04 0 3 1 0 05 0 4 0 0 XX \end{verbatim} Finally, if we have internet access, we can create a \href{http://weblogo.berkeley.edu}{weblogo}: \begin{verbatim} >>> arnt.weblogo("Arnt.png") \end{verbatim} We should get our logo saved as a png in the specified file. \subsection{Searching for instances} The most frequent use for a motif is to find its instances in some sequence. For the sake of this section, we will use an artificial sequence like this: \begin{verbatim} test_seq=Seq("TATGATGTAGTATAATATAATTATAA",m.alphabet) \end{verbatim} The simplest way to find instances, is to look for exact matches of the true instances of the motif: \begin{verbatim} >>> for pos, seq in m.search_instances(test_seq): ... print(pos, seq.tostring()) ... 10 TATAA 15 TATAA 21 TATAA \end{verbatim} We can do the same with the reverse complement (to find instances on the complementary strand): \begin{verbatim} >>> for pos, seq in m.reverse_complement().search_instances(test_seq): ... print(pos, seq.tostring()) ... 12 TAATA 20 TTATA \end{verbatim} It's just as easy to look for positions, giving rise to high log-odds scores against our motif: \begin{verbatim} >>> for pos, score in m.search_pwm(test_seq, threshold=5.0): ... print(pos, score) ... 10 8.44065060871 -12 7.06213898545 15 8.44065060871 -20 8.44065060871 21 8.44065060871 \end{verbatim} You may notice the threshold parameter, here set arbitrarily to $5.0$. This is in $log_2$, so we are now looking only for words, which are 32 times more likely to occur under the motif model than in the background. The default threshold is $0.0$, which selects everything that looks more like the motif than the background. If you want to use a less arbitrary way of selecting thresholds, you can explore the \verb|Motif.score_distribution| class implementing an distribution of scores for a given motif. Since the space for a score distribution grows exponentially with motif length, we are using an approximation with a given precision to keep computation cost manageable: \begin{verbatim} >>> sd = Motif.score_distribution(m, precision=10**4) \end{verbatim} The sd object can be used to determine a number of different thresholds. We can specify the requested false-positive rate (probability of ``finding'' a motif instance in background generated sequence): \begin{verbatim} >>> sd.threshold_fpr(0.01) 4.3535838726139886 \end{verbatim} or the false-negative rate (probability of ``not finding'' an instance generated from the motif): \begin{verbatim} >>> sd.threshold_fnr(0.1) 0.26651713652234044 \end{verbatim} or a threshold (approximately) satisfying some relation between fpr and fnr $\frac{fnr}{fpr}\simeq t$: \begin{verbatim} >>> sd.threshold_balanced(1000) 8.4406506087056368 \end{verbatim} or a threshold satisfying (roughly) the equality between the false-positive rate and the $-log$ of the information content (as used in patser software by Hertz and Stormo). For example, in case of our motif, you can get the threshold giving you exactly the same results (for this sequence) as searching for instances with balanced threshold with rate of $1000$. \begin{verbatim} >>> for pos, score in m.search_pwm(test_seq, threshold=sd.threshold_balanced(1000)): ... print(pos, score) ... 10 8.44065060871 15 8.44065060871 -20 8.44065060871 21 8.44065060871 \end{verbatim} \subsection{Comparing motifs} Once we have more than one motif, we might want to compare them. For that, we have currently three different methods of \verb|Bio.Motif| objects. Before we start comparing motifs, I should point out that motif boundaries are usually quite arbitrary. This means, that we often need to compare motifs of different lengths, so comparison needs to involve some kind of alignment. This means, that we have to take into account two things: \begin{itemize} \item alignment of motifs \item some function to compare aligned motifs \end{itemize} In \verb|Bio.Motif| we have 3 different functions for motif comparison, which are based on the same idea behind motif alignment, but use different functions to compare aligned motifs. Briefly speaking, we are using ungapped alignment of PWMs and substitute the missing columns at the beginning and end of the matrices with background distribution. All three comparison functions are written in such a way, that they can be interpreted as distance measures, however only one (\verb|dist_dpq|) satisfies the triangle inequality. All of them return the minimal distance and the corresponding offset between motifs. To show how these functions work, let us first load another motif, which is similar to our test motif \verb|m|: \begin{verbatim} >>> ubx=Motif.read(open("Ubx.pfm"), "jaspar-pfm") >>> ubx.consensus() Seq('TAAT', IUPACUnambiguousDNA()) \end{verbatim} The first function we'll use to compare these motifs is based on Pearson correlation. Since we want it to resemble a distance measure, we actually take $1-r$, where $r$ is the Pearson correlation coefficient (PCC): \begin{verbatim} >>> m.dist_pearson(ubx) (0.41740393308237722, 2) \end{verbatim} This means, that the best PCC between motif \verb|m| and \verb|Ubx| is obtained with the following alignment: \begin{verbatim} bbTAAT TATAAb \end{verbatim} where \verb|b| stands for background distribution. The PCC itself is roughly $1-0.42=0.58$. If we try the reverse complement of the Ubx motif: \begin{verbatim} >>> m.dist_pearson(ubx.reverse_complement()) (0.25784180151584823, 1) \end{verbatim} We can see that the PCC is better (almost $0.75$), and the alignment is also different: \begin{verbatim} bATTA TATAA \end{verbatim} There are two other functions: \verb|dist_dpq|, which is a true metric (satisfying traingle inequality) based on the Kullback-Leibler divergence \begin{verbatim} >>> m.dist_dpq(ubx.reverse_complement()) (0.49292358382899853, 1) \end{verbatim} and the \verb|dist_product| method, which is based on the product of probabilities which can be interpreted as the probability of independently generating the same instance by both motifs. \begin{verbatim} >>> m.dist_product(ubx.reverse_complement()) (0.16224587301064275, 1) \end{verbatim} \subsection{\emph{De novo} motif finding} Currently, Biopython has only limited support for \emph{de novo} motif finding. Namely, we support running and parsing of AlignAce and MEME. Since the number of motif finding tools is growing rapidly, contributions of new parsers are welcome. \subsubsection{MEME} Let's assume, you have run MEME on sequences of your choice with your favorite parameters and saved the output in the file \verb|meme.out|. You can retrieve the motifs reported by MEME by running the following piece of code: \begin{verbatim} >>> motifsM = list(Motif.parse(open("meme.out"), "MEME")) >>> motifsM [] \end{verbatim} Besides the most wanted list of motifs, the result object contains more useful information, accessible through properties with self-explanatory names: \begin{itemize} \item \verb|.alphabet| \item \verb|.datafile| \item \verb|.sequence_names| \item \verb|.version| \item \verb|.command| \end{itemize} The motifs returned by MEMEParser can be treated exactly like regular Motif objects (with instances), they also provide some extra functionality, by adding additional information about the instances. \begin{verbatim} >>> motifsM[0].consensus() Seq('CTCAATCGTA', IUPACUnambiguousDNA()) >>> motifsM[0].instances[0].pvalue 8.71e-07 >>> motifsM[0].instances[0].sequence_name 'SEQ10;' >>> motifsM[0].instances[0].start 3 >>> motifsM[0].instances[0].strand '+' \end{verbatim} \subsubsection{AlignAce} We can do very similar things with AlignACE program. Assume, you have your output in the file \verb|alignace.out|. You can parse your output with the following code: \begin{verbatim} >>> motifsA=list(Motif.parse(open("alignace.out"), "AlignAce")) \end{verbatim} Again, your motifs behave as they should: \begin{verbatim} >>> motifsA[0].consensus() Seq('TCTACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} In fact you can even see, that AlignAce found a very similar motif as MEME, it is just a longer version of a reverse complement of MEME motif: \begin{verbatim} >>> motifsM[0].reverse_complement().consensus() Seq('TACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} If you have AlignAce installed on the same machine, you can also run it directly from Biopython. Short example of how this can be done is shown below (other parameters can be specified as keyword parameters): \begin{verbatim} >>> command="/opt/bin/AlignACE" >>> input_file="test.fa" >>> from Bio.Motif.Applications import AlignAceCommandline >>> cmd = AlignAceCommandline(cmd=command, input=input_file, gcback=0.6, numcols=10) >>> stdout, stderr= cmd() \end{verbatim} Since AlignAce prints all its output to standard output, you can get to your motifs by parsing the first part of the result: \begin{verbatim} motifs=list(Motif.parse(stdout,"AlignAce")) \end{verbatim} \chapter{Cluster analysis} Cluster analysis is the grouping of items into clusters based on the similarity of the items to each other. In bioinformatics, clustering is widely used in gene expression data analysis to find groups of genes with similar gene expression profiles. This may identify functionally related genes, as well as suggest the function of presently unknown genes. The Biopython module \verb|Bio.Cluster| provides commonly used clustering algorithms and was designed with the application to gene expression data in mind. However, this module can also be used for cluster analysis of other types of data. \verb|Bio.Cluster| and the underlying C Clustering Library is described by De Hoon \textit{et al.} \cite{dehoon2004}. The following four clustering approaches are implemented in \verb|Bio.Cluster|: \begin{itemize} \item Hierarchical clustering (pairwise centroid-, single-, complete-, and average-linkage); \item $k$-means, $k$-medians, and $k$-medoids clustering; \item Self-Organizing Maps; \item Principal Component Analysis. \end{itemize} \subsection*{Data representation} The data to be clustered are represented by a $n \times m$ Numerical Python array \verb|data|. Within the context of gene expression data clustering, typically the rows correspond to different genes whereas the columns correspond to different experimental conditions. The clustering algorithms in \verb|Bio.Cluster| can be applied both to rows (genes) and to columns (experiments). \subsection*{Missing values} Often in microarray experiments, some of the data values are missing, which is indicated by an additional $n \times m$ Numerical Python integer array \verb|mask|. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing and is ignored in the analysis. \subsection*{Random number generator} The $k$-means/medians/medoids clustering algorithms and Self-Organizing Maps (SOMs) include the use of a random number generator. The uniform random number generator in \verb|Bio.Cluster| is based on the algorithm by L'Ecuyer \cite{lecuyer1988}, while random numbers following the binomial distribution are generated using the BTPE algorithm by Kachitvichyanukul and Schmeiser \cite{kachitvichyanukul1988}. The random number generator is initialized automatically during its first call. As this random number generator uses a combination of two multiplicative linear congruential generators, two (integer) seeds are needed for initialization, for which we use the system-supplied random number generator \verb|rand| (in the C standard library). We initialize this generator by calling \verb|srand| with the epoch time in seconds, and use the first two random numbers generated by \verb|rand| as seeds for the uniform random number generator in \verb|Bio.Cluster|. \section{Distance functions} \label{sec:distancefunctions} In order to cluster items into groups based on their similarity, we should first define what exactly we mean by \emph{similar}. \verb|Bio.Cluster| provides eight distance functions, indicated by a single character, to measure similarity, or conversely, distance: \begin{itemize} \item \verb|'e'|: Euclidean distance; \item \verb|'b'|: City-block distance. \item \verb|'c'|: Pearson correlation coefficient; \item \verb|'a'|: Absolute value of the Pearson correlation coefficient; \item \verb|'u'|: Uncentered Pearson correlation (equivalent to the cosine of the angle between two data vectors); \item \verb|'x'|: Absolute uncentered Pearson correlation; \item \verb|'s'|: Spearman's rank correlation; \item \verb|'k'|: Kendall's $\tau$. \end{itemize} The first two are true distance functions that satisfy the triangle inequality: $$d\left(\underline{u},\underline{v}\right) \leq d\left(\underline{u},\underline{w}\right) + d\left(\underline{w},\underline{v}\right) \textrm{ for all } \underline{u}, \underline{v}, \underline{w},$$ and are therefore refered to as \emph{metrics}. In everyday language, this means that the shortest distance between two points is a straight line. The remaining six distance measures are related to the correlation coefficient, where the distance $d$ is defined in terms of the correlation $r$ by $d=1-r$. Note that these distance functions are \emph{semi-metrics} that do not satisfy the triangle inequality. For example, for $$\underline{u}=\left(1,0,-1\right);$$ $$\underline{v}=\left(1,1,0\right);$$ $$\underline{w}=\left(0,1,1\right);$$ we find a Pearson distance $d\left(\underline{u},\underline{w}\right) = 1.8660$, while $d\left(\underline{u},\underline{v}\right)+d\left(\underline{v},\underline{w}\right) = 1.6340$. \subsection*{Euclidean distance} In \verb|Bio.Cluster|, we define the Euclidean distance as $$d = {1 \over n} \sum_{i=1}^{n} \left(x_i-y_i\right)^{2}.$$ Only those terms are included in the summation for which both $x_i$ and $y_i$ are present, and the denominator $n$ is chosen accordingly. As the expression data $x_i$ and $y_i$ are subtracted directly from each other, we should make sure that the expression data are properly normalized when using the Euclidean distance. \subsection*{City-block distance} The city-block distance, alternatively known as the Manhattan distance, is related to the Euclidean distance. Whereas the Euclidean distance corresponds to the length of the shortest path between two points, the city-block distance is the sum of distances along each dimension. As gene expression data tend to have missing values, in \verb|Bio.Cluster| we define the city-block distance as the sum of distances divided by the number of dimensions: $$d = {1 \over n} \sum_{i=1}^n \left|x_i-y_i\right|.$$ This is equal to the distance you would have to walk between two points in a city, where you have to walk along city blocks. As for the Euclidean distance, the expression data are subtracted directly from each other, and we should therefore make sure that they are properly normalized. \subsection*{The Pearson correlation coefficient} The Pearson correlation coefficient is defined as $$r = \frac{1}{n} \sum_{i=1}^n \left( \frac{x_i -\bar{x}}{\sigma_x} \right) \left(\frac{y_i -\bar{y}}{\sigma_y} \right),$$ in which $\bar{x}, \bar{y}$ are the sample mean of $x$ and $y$ respectively, and $\sigma_x, \sigma_y$ are the sample standard deviation of $x$ and $y$. The Pearson correlation coefficient is a measure for how well a straight line can be fitted to a scatterplot of $x$ and $y$. If all the points in the scatterplot lie on a straight line, the Pearson correlation coefficient is either +1 or -1, depending on whether the slope of line is positive or negative. If the Pearson correlation coefficient is equal to zero, there is no correlation between $x$ and $y$. The \emph{Pearson distance} is then defined as $$d_{\textrm{P}} \equiv 1 - r.$$ As the Pearson correlation coefficient lies between -1 and 1, the Pearson distance lies between 0 and 2. \subsection*{Absolute Pearson correlation} By taking the absolute value of the Pearson correlation, we find a number between 0 and 1. If the absolute value is 1, all the points in the scatter plot lie on a straight line with either a positive or a negative slope. If the absolute value is equal to zero, there is no correlation between $x$ and $y$. The corresponding distance is defined as $$d_{\textrm A} \equiv 1 - \left|r\right|,$$ where $r$ is the Pearson correlation coefficient. As the absolute value of the Pearson correlation coefficient lies between 0 and 1, the corresponding distance lies between 0 and 1 as well. In the context of gene expression experiments, the absolute correlation is equal to 1 if the gene expression profiles of two genes are either exactly the same or exactly opposite. The absolute correlation coefficient should therefore be used with care. \subsection*{Uncentered correlation (cosine of the angle)} In some cases, it may be preferable to use the \emph{uncentered correlation} instead of the regular Pearson correlation coefficient. The uncentered correlation is defined as $$r_{\textrm U} = \frac{1}{n} \sum_{i=1}^{n} \left(\frac{x_i}{\sigma_x^{(0)}} \right) \left(\frac{y_i}{\sigma_y^{(0)}} \right),$$ where \begin{eqnarray} \sigma_x^{(0)} & = & \sqrt{{\frac{1}{n}} \sum_{i=1}^{n}x_i^2}; \nonumber \\ \sigma_y^{(0)} & = & \sqrt{{\frac{1}{n}} \sum_{i=1}^{n}y_i^2}. \nonumber \end{eqnarray} This is the same expression as for the regular Pearson correlation coefficient, except that the sample means $\bar{x}, \bar{y}$ are set equal to zero. The uncentered correlation may be appropriate if there is a zero reference state. For instance, in the case of gene expression data given in terms of log-ratios, a log-ratio equal to zero corresponds to the green and red signal being equal, which means that the experimental manipulation did not affect the gene expression. The distance corresponding to the uncentered correlation coefficient is defined as $$d_{\mbox{U}} \equiv 1 - r_{\mbox{U}},$$ where $r_{\mbox{U}}$ is the uncentered correlation. As the uncentered correlation coefficient lies between -1 and 1, the corresponding distance lies between 0 and 2. The uncentered correlation is equal to the cosine of the angle of the two data vectors in $n$-dimensional space, and is often referred to as such. \subsection*{Absolute uncentered correlation} As for the regular Pearson correlation, we can define a distance measure using the absolute value of the uncentered correlation: $$d_{\mbox{AU}} \equiv 1 - \left|r_{\mbox{U}}\right|,$$ where $r_{\mbox{U}}$ is the uncentered correlation coefficient. As the absolute value of the uncentered correlation coefficient lies between 0 and 1, the corresponding distance lies between 0 and 1 as well. Geometrically, the absolute value of the uncentered correlation is equal to the cosine between the supporting lines of the two data vectors (i.e., the angle without taking the direction of the vectors into consideration). \subsection*{Spearman rank correlation} The Spearman rank correlation is an example of a non-parametric similarity measure, and tends to be more robust against outliers than the Pearson correlation. To calculate the Spearman rank correlation, we replace each data value by their rank if we would order the data in each vector by their value. We then calculate the Pearson correlation between the two rank vectors instead of the data vectors. As in the case of the Pearson correlation, we can define a distance measure corresponding to the Spearman rank correlation as $$d_{\mbox{S}} \equiv 1 - r_{\mbox{S}},$$ where $r_{\mbox{S}}$ is the Spearman rank correlation. \subsection*{Kendall's $\tau$} Kendall's $\tau$ is another example of a non-parametric similarity measure. It is similar to the Spearman rank correlation, but instead of the ranks themselves only the relative ranks are used to calculate $\tau$ (see Snedecor \& Cochran \cite{snedecor1989}). We can define a distance measure corresponding to Kendall's $\tau$ as $$d_{\mbox{K}} \equiv 1 - \tau.$$ As Kendall's $\tau$ is always between -1 and 1, the corresponding distance will be between 0 and 2. \subsection*{Weighting} For most of the distance functions available in \verb|Bio.Cluster|, a weight vector can be applied. The weight vector contains weights for the items in the data vector. If the weight for item $i$ is $w_i$, then that item is treated as if it occurred $w_i$ times in the data. The weight do not have to be integers. For the Spearman rank correlation and Kendall's $\tau$, weights do not have a well-defined meaning and are therefore not implemented. \subsection*{Calculating the distance matrix} \label{subsec:distancematrix} The distance matrix is a square matrix with all pairwise distances between the items in \verb|data|, and can be calculated by the function \verb|distancematrix| in the \verb|Bio.Cluster| module: \begin{verbatim} >>> from Bio.Cluster import distancematrix >>> matrix = distancematrix(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| (required)\\ Array containing the data for the items. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|weight| (default: \verb|None|) \\ The weights to be used when calculating distances. If \verb|weight==None|, then equal weights are assumed. \item \verb|transpose| (default: \verb|0|) \\ Determines if the distances between the rows of \verb|data| are to be calculated (\verb|transpose==0|), or between the columns of \verb|data| (\verb|transpose==1|). \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} To save memory, the distance matrix is returned as a list of 1D arrays. The number of columns in each row is equal to the row number. Hence, the first row has zero elements. An example of the return value is \begin{verbatim} [array([]), array([1.]), array([7., 3.]), array([4., 2., 6.])] \end{verbatim} This corresponds to the distance matrix $$ \left( \begin{array}{cccc} 0 & 1 & 7 & 4 \\ 1 & 0 & 3 & 2 \\ 7 & 3 & 0 & 6 \\ 4 & 2 & 6 & 0 \end{array} \right). $$ \section{Calculating cluster properties} \subsection*{Calculating the cluster centroids} \label{subsec:clustercentroids} The centroid of a cluster can be defined either as the mean or as the median of each dimension over all cluster items. The function \verb|clustercentroids| in \verb|Bio.Cluster| can be used to calculate either: \begin{verbatim} >>> from Bio.Cluster import clustercentroids >>> cdata, cmask = clustercentroids(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| (required) \\ Array containing the data for the items. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|clusterid| (default: \verb|None|) \\ Vector of integers showing to which cluster each item belongs. If \verb|clusterid| is \verb|None|, then all items are assumed to belong to the same cluster. \item \verb|method| (default: \verb|'a'|) \\ Specifies whether the arithmetic mean (\verb|method=='a'|) or the median (\verb|method=='m'|) is used to calculate the cluster center. \item \verb|transpose| (default: \verb|0|) \\ Determines if the centroids of the rows of \verb|data| are to be calculated (\verb|transpose==0|), or the centroids of the columns of \verb|data| (\verb|transpose==1|). \end{itemize} This function returns the tuple \verb|(cdata, cmask)|. The centroid data are stored in the 2D Numerical Python array \verb|cdata|, with missing data indicated by the 2D Numerical Python integer array \verb|cmask|. The dimensions of these arrays are $\left(\textrm{number of clusters}, \textrm{number of columns}\right)$ if \verb|transpose| is \verb|0|, or $\left(\textrm{number of rows}, \textrm{number of clusters}\right)$ if \verb|transpose| is \verb|1|. Each row (if \verb|transpose| is \verb|0|) or column (if \verb|transpose| is \verb|1|) contains the averaged data corresponding to the centroid of each cluster. \subsection*{Calculating the distance between clusters} Given a distance function between \emph{items}, we can define the distance between two \emph{clusters} in several ways. The distance between the arithmetic means of the two clusters is used in pairwise centroid-linkage clustering and in $k$-means clustering. In $k$-medoids clustering, the distance between the medians of the two clusters is used instead. The shortest pairwise distance between items of the two clusters is used in pairwise single-linkage clustering, while the longest pairwise distance is used in pairwise maximum-linkage clustering. In pairwise average-linkage clustering, the distance between two clusters is defined as the average over the pairwise distances. To calculate the distance between two clusters, use \begin{verbatim} >>> from Bio.Cluster import clusterdistance >>> distance = clusterdistance(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| (required)\\ Array containing the data for the items. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|weight| (default: \verb|None|) \\ The weights to be used when calculating distances. If \verb|weight==None|, then equal weights are assumed. \item \verb|index1| (default: \verb|0|) \\ A list containing the indices of the items belonging to the first cluster. A cluster containing only one item $i$ can be represented either as a list \verb|[i]|, or as an integer \verb|i|. \item \verb|index2| (default: \verb|0|) \\ A list containing the indices of the items belonging to the second cluster. A cluster containing only one items $i$ can be represented either as a list \verb|[i]|, or as an integer \verb|i|. \item \verb|method| (default: \verb|'a'|) \\ Specifies how the distance between clusters is defined: \begin{itemize} \item \verb|'a'|: Distance between the two cluster centroids (arithmetic mean); \item \verb|'m'|: Distance between the two cluster centroids (median); \item \verb|'s'|: Shortest pairwise distance between items in the two clusters; \item \verb|'x'|: Longest pairwise distance between items in the two clusters; \item \verb|'v'|: Average over the pairwise distances between items in the two clusters. \end{itemize} \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \item \verb|transpose| (default: \verb|0|) \\ If \verb|transpose==0|, calculate the distance between the rows of \verb|data|. If \verb|transpose==1|, calculate the distance between the columns of \verb|data|. \end{itemize} \section{Partitioning algorithms} Partitioning algorithms divide items into $k$ clusters such that the sum of distances over the items to their cluster centers is minimal. The number of clusters $k$ is specified by the user. Three partitioning algorithms are available in \verb|Bio.Cluster|: \begin{itemize} \item $k$-means clustering \item $k$-medians clustering \item $k$-medoids clustering \end{itemize} These algorithms differ in how the cluster center is defined. In $k$-means clustering, the cluster center is defined as the mean data vector averaged over all items in the cluster. Instead of the mean, in $k$-medians clustering the median is calculated for each dimension in the data vector. Finally, in $k$-medoids clustering the cluster center is defined as the item which has the smallest sum of distances to the other items in the cluster. This clustering algorithm is suitable for cases in which the distance matrix is known but the original data matrix is not available, for example when clustering proteins based on their structural similarity. The expectation-maximization (EM) algorithm is used to find this partitioning into $k$ groups. In the initialization of the EM algorithm, we randomly assign items to clusters. To ensure that no empty clusters are produced, we use the binomial distribution to randomly choose the number of items in each cluster to be one or more. We then randomly permute the cluster assignments to items such that each item has an equal probability to be in any cluster. Each cluster is thus guaranteed to contain at least one item. We then iterate: \begin{itemize} \item Calculate the centroid of each cluster, defined as either the mean, the median, or the medoid of the cluster; \item Calculate the distances of each item to the cluster centers; \item For each item, determine which cluster centroid is closest; \item Reassign each item to its closest cluster, or stop the iteration if no further item reassignments take place. \end{itemize} To avoid clusters becoming empty during the iteration, in $k$-means and $k$-medians clustering the algorithm keeps track of the number of items in each cluster, and prohibits the last remaining item in a cluster from being reassigned to a different cluster. For $k$-medoids clustering, such a check is not needed, as the item that functions as the cluster centroid has a zero distance to itself, and will therefore never be closer to a different cluster. As the initial assignment of items to clusters is done randomly, usually a different clustering solution is found each time the EM algorithm is executed. To find the optimal clustering solution, the $k$-means algorithm is repeated many times, each time starting from a different initial random clustering. The sum of distances of the items to their cluster center is saved for each run, and the solution with the smallest value of this sum will be returned as the overall clustering solution. How often the EM algorithm should be run depends on the number of items being clustered. As a rule of thumb, we can consider how often the optimal solution was found; this number is returned by the partitioning algorithms as implemented in this library. If the optimal solution was found many times, it is unlikely that better solutions exist than the one that was found. However, if the optimal solution was found only once, there may well be other solutions with a smaller within-cluster sum of distances. If the number of items is large (more than several hundreds), it may be difficult to find the globally optimal solution. The EM algorithm terminates when no further reassignments take place. We noticed that for some sets of initial cluster assignments, the EM algorithm fails to converge due to the same clustering solution reappearing periodically after a small number of iteration steps. We therefore check for the occurrence of such periodic solutions during the iteration. After a given number of iteration steps, the current clustering result is saved as a reference. By comparing the clustering result after each subsequent iteration step to the reference state, we can determine if a previously encountered clustering result is found. In such a case, the iteration is halted. If after a given number of iterations the reference state has not yet been encountered, the current clustering solution is saved to be used as the new reference state. Initially, ten iteration steps are executed before resaving the reference state. This number of iteration steps is doubled each time, to ensure that periodic behavior with longer periods can also be detected. \subsection*{$k$-means and $k$-medians} The $k$-means and $k$-medians algorithms are implemented as the function \verb|kcluster| in \verb|Bio.Cluster|: \begin{verbatim} >>> from Bio.Cluster import kcluster >>> clusterid, error, nfound = kcluster(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| (required)\\ Array containing the data for the items. \item \verb|nclusters| (default: \verb|2|) \\ The number of clusters $k$. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|weight| (default: \verb|None|) \\ The weights to be used when calculating distances. If \verb|weight==None|, then equal weights are assumed. \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose| is \verb|0|) or columns (\verb|transpose| is \verb|1|) are to be clustered. \item \verb|npass| (default: \verb|1|) \\ The number of times the $k$-means/-medians clustering algorithm is performed, each time with a different (random) initial condition. If \verb|initialid| is given, the value of \verb|npass| is ignored and the clustering algorithm is run only once, as it behaves deterministically in that case. \item \verb|method| (default: \verb|a|) \\ describes how the center of a cluster is found: \begin{itemize} \item \verb|method=='a'|: arithmetic mean ($k$-means clustering); \item \verb|method=='m'|: median ($k$-medians clustering). \end{itemize} For other values of \verb|method|, the arithmetic mean is used. \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). Whereas all eight distance measures are accepted by \verb|kcluster|, from a theoretical viewpoint it is best to use the Euclidean distance for the $k$-means algorithm, and the city-block distance for $k$-medians. \item \verb|initialid| (default: \verb|None|) \\ Specifies the initial clustering to be used for the EM algorithm. If \verb|initialid==None|, then a different random initial clustering is used for each of the \verb|npass| runs of the EM algorithm. If \verb|initialid| is not \verb|None|, then it should be equal to a 1D array containing the cluster number (between \verb|0| and \verb|nclusters-1|) for each item. Each cluster should contain at least one item. With the initial clustering specified, the EM algorithm is deterministic. \end{itemize} This function returns a tuple \verb|(clusterid, error, nfound)|, where \verb|clusterid| is an integer array containing the number of the cluster to which each row or cluster was assigned, \verb|error| is the within-cluster sum of distances for the optimal clustering solution, and \verb|nfound| is the number of times this optimal solution was found. \subsection*{$k$-medoids clustering} The \verb+kmedoids+ routine performs $k$-medoids clustering on a given set of items, using the distance matrix and the number of clusters passed by the user: \begin{verbatim} >>> from Bio.Cluster import kmedoids >>> clusterid, error, nfound = kmedoids(distance) \end{verbatim} where the following arguments are defined: , nclusters=2, npass=1, initialid=None)| \begin{itemize} \item{\verb|distance|} (required) \\ The matrix containing the distances between the items; this matrix can be specified in three ways: \begin{itemize} \item as a 2D Numerical Python array (in which only the left-lower part of the array will be accessed): \begin{verbatim} distance = array([[0.0, 1.1, 2.3], [1.1, 0.0, 4.5], [2.3, 4.5, 0.0]]) \end{verbatim} \item as a 1D Numerical Python array containing consecutively the distances in the left-lower part of the distance matrix: \begin{verbatim} distance = array([1.1, 2.3, 4.5]) \end{verbatim} \item as a list containing the rows of the left-lower part of the distance matrix: \begin{verbatim} distance = [array([]|, array([1.1]), array([2.3, 4.5]) ] \end{verbatim} \end{itemize} These three expressions correspond to the same distance matrix. \item \verb|nclusters| (default: \verb|2|) \\ The number of clusters $k$. \item \verb|npass| (default: \verb|1|) \\ The number of times the $k$-medoids clustering algorithm is performed, each time with a different (random) initial condition. If \verb|initialid| is given, the value of \verb|npass| is ignored, as the clustering algorithm behaves deterministically in that case. \item \verb|initialid| (default: \verb|None|) \\ Specifies the initial clustering to be used for the EM algorithm. If \verb|initialid==None|, then a different random initial clustering is used for each of the \verb|npass| runs of the EM algorithm. If \verb|initialid| is not \verb|None|, then it should be equal to a 1D array containing the cluster number (between \verb|0| and \verb|nclusters-1|) for each item. Each cluster should contain at least one item. With the initial clustering specified, the EM algorithm is deterministic. \end{itemize} This function returns a tuple \verb|(clusterid, error, nfound)|, where \verb|clusterid| is an array containing the number of the cluster to which each item was assigned, \verb|error| is the within-cluster sum of distances for the optimal $k$-medoids clustering solution, and \verb|nfound| is the number of times the optimal solution was found. Note that the cluster number in \verb|clusterid| is defined as the item number of the item representing the cluster centroid. \section{Hierarchical clustering} Hierarchical clustering methods are inherently different from the $k$-means clustering method. In hierarchical clustering, the similarity in the expression profile between genes or experimental conditions are represented in the form of a tree structure. This tree structure can be shown graphically by programs such as Treeview and Java Treeview, which has contributed to the popularity of hierarchical clustering in the analysis of gene expression data. The first step in hierarchical clustering is to calculate the distance matrix, specifying all the distances between the items to be clustered. Next, we create a node by joining the two closest items. Subsequent nodes are created by pairwise joining of items or nodes based on the distance between them, until all items belong to the same node. A tree structure can then be created by retracing which items and nodes were merged. Unlike the EM algorithm, which is used in $k$-means clustering, the complete process of hierarchical clustering is deterministic. Several flavors of hierarchical clustering exist, which differ in how the distance between subnodes is defined in terms of their members. In \verb|Bio.Cluster|, pairwise single, maximum, average, and centroid linkage are available. \begin{itemize} \item In pairwise single-linkage clustering, the distance between two nodes is defined as the shortest distance among the pairwise distances between the members of the two nodes. \item In pairwise maximum-linkage clustering, alternatively known as pairwise complete-linkage clustering, the distance between two nodes is defined as the longest distance among the pairwise distances between the members of the two nodes. \item In pairwise average-linkage clustering, the distance between two nodes is defined as the average over all pairwise distances between the items of the two nodes. \item In pairwise centroid-linkage clustering, the distance between two nodes is defined as the distance between their centroids. The centroids are calculated by taking the mean over all the items in a cluster. As the distance from each newly formed node to existing nodes and items need to be calculated at each step, the computing time of pairwise centroid-linkage clustering may be significantly longer than for the other hierarchical clustering methods. Another peculiarity is that (for a distance measure based on the Pearson correlation), the distances do not necessarily increase when going up in the clustering tree, and may even decrease. This is caused by an inconsistency between the centroid calculation and the distance calculation when using the Pearson correlation: Whereas the Pearson correlation effectively normalizes the data for the distance calculation, no such normalization occurs for the centroid calculation. \end{itemize} For pairwise single-, complete-, and average-linkage clustering, the distance between two nodes can be found directly from the distances between the individual items. Therefore, the clustering algorithm does not need access to the original gene expression data, once the distance matrix is known. For pairwise centroid-linkage clustering, however, the centroids of newly formed subnodes can only be calculated from the original data and not from the distance matrix. The implementation of pairwise single-linkage hierarchical clustering is based on the SLINK algorithm (R. Sibson, 1973), which is much faster and more memory-efficient than a straightforward implementation of pairwise single-linkage clustering. The clustering result produced by this algorithm is identical to the clustering solution found by the conventional single-linkage algorithm. The single-linkage hierarchical clustering algorithm implemented in this library can be used to cluster large gene expression data sets, for which conventional hierarchical clustering algorithms fail due to excessive memory requirements and running time. \subsection*{Representing a hierarchical clustering solution} The result of hierarchical clustering consists of a tree of nodes, in which each node joins two items or subnodes. Usually, we are not only interested in which items or subnodes are joined at each node, but also in their similarity (or distance) as they are joined. To store one node in the hierarchical clustering tree, we make use of the class \verb|Node|, which defined in \verb|Bio.Cluster|. An instance of \verb|Node| has three attributes: \begin{itemize} \item \verb|left| \item \verb|right| \item \verb|distance| \end{itemize} Here, \verb|left| and \verb|right| are integers referring to the two items or subnodes that are joined at this node, and \verb|distance| is the distance between them. The items being clustered are numbered from 0 to $\left(\textrm{number of items} - 1\right)$, while clusters are numbered from -1 to $-\left(\textrm{number of items}-1\right)$. Note that the number of nodes is one less than the number of items. To create a new \verb|Node| object, we need to specify \verb|left| and \verb|right|; \verb|distance| is optional. \begin{verbatim} >>> from Bio.Cluster import Node >>> Node(2, 3) (2, 3): 0 >>> Node(2, 3, 0.91) (2, 3): 0.91 \end{verbatim} The attributes \verb|left|, \verb|right|, and \verb|distance| of an existing \verb|Node| object can be modified directly: \begin{verbatim} >>> node = Node(4, 5) >>> node.left = 6 >>> node.right = 2 >>> node.distance = 0.73 >>> node (6, 2): 0.73 \end{verbatim} An error is raised if \verb|left| and \verb|right| are not integers, or if \verb|distance| cannot be converted to a floating-point value. The Python class \verb|Tree| represents a full hierarchical clustering solution. A \verb|Tree| object can be created from a list of \verb|Node| objects: \begin{verbatim} >>> from Bio.Cluster import Node, Tree >>> nodes = [Node(1, 2, 0.2), Node(0, 3, 0.5), Node(-2, 4, 0.6), Node(-1, -3, 0.9)] >>> tree = Tree(nodes) >>> print(tree) (1, 2): 0.2 (0, 3): 0.5 (-2, 4): 0.6 (-1, -3): 0.9 \end{verbatim} The \verb|Tree| initializer checks if the list of nodes is a valid hierarchical clustering result: \begin{verbatim} >>> nodes = [Node(1, 2, 0.2), Node(0, 2, 0.5)] >>> Tree(nodes) Traceback (most recent call last): File "", line 1, in ? ValueError: Inconsistent tree \end{verbatim} Individual nodes in a \verb|Tree| object can be accessed using square brackets: \begin{verbatim} >>> nodes = [Node(1, 2, 0.2), Node(0, -1, 0.5)] >>> tree = Tree(nodes) >>> tree[0] (1, 2): 0.2 >>> tree[1] (0, -1): 0.5 >>> tree[-1] (0, -1): 0.5 \end{verbatim} As a \verb|Tree| object is read-only, we cannot change individual nodes in a \verb|Tree| object. However, we can convert the tree to a list of nodes, modify this list, and create a new tree from this list: \begin{verbatim} >>> tree = Tree([Node(1, 2, 0.1), Node(0, -1, 0.5), Node(-2, 3, 0.9)]) >>> print(tree) (1, 2): 0.1 (0, -1): 0.5 (-2, 3): 0.9 >>> nodes = tree[:] >>> nodes[0] = Node(0, 1, 0.2) >>> nodes[1].left = 2 >>> tree = Tree(nodes) >>> print(tree) (0, 1): 0.2 (2, -1): 0.5 (-2, 3): 0.9 \end{verbatim} This guarantees that any \verb|Tree| object is always well-formed. To display a hierarchical clustering solution with visualization programs such as Java Treeview, it is better to scale all node distances such that they are between zero and one. This can be accomplished by calling the \verb|scale| method on an existing \verb|Tree| object: \begin{verbatim} >>> tree.scale() \end{verbatim} This method takes no arguments, and returns \verb|None|. After hierarchical clustering, the items can be grouped into $k$ clusters based on the tree structure stored in the \verb|Tree| object by cutting the tree: \begin{verbatim} >>> clusterid = tree.cut(nclusters=1) \end{verbatim} where \verb|nclusters| (defaulting to \verb|1|) is the desired number of clusters $k$. This method ignores the top $k-1$ linking events in the tree structure, resulting in $k$ separated clusters of items. The number of clusters $k$ should be positive, and less than or equal to the number of items. This method returns an array \verb|clusterid| containing the number of the cluster to which each item is assigned. \subsection*{Performing hierarchical clustering} To perform hierarchical clustering, use the \verb|treecluster| function in \verb|Bio.Cluster|. \begin{verbatim} >>> from Bio.Cluster import treecluster >>> tree = treecluster(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| \\ Array containing the data for the items. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|weight| (default: \verb|None|) \\ The weights to be used when calculating distances. If \verb|weight==None|, then equal weights are assumed. \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose==0|) or columns (\verb|transpose==1|) are to be clustered. \item \verb|method| (default: \verb|'m'|) \\ defines the linkage method to be used: \begin{itemize} \item \verb|method=='s'|: pairwise single-linkage clustering \item \verb|method=='m'|: pairwise maximum- (or complete-) linkage clustering \item \verb|method=='c'|: pairwise centroid-linkage clustering \item \verb|method=='a'|: pairwise average-linkage clustering \end{itemize} \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} To apply hierarchical clustering on a precalculated distance matrix, specify the \verb|distancematrix| argument when calling \verb|treecluster| function instead of the \verb|data| argument: \begin{verbatim} >>> from Bio.Cluster import treecluster >>> tree = treecluster(distancematrix=distance) \end{verbatim} In this case, the following arguments are defined: \begin{itemize} \item \verb|distancematrix| \\ The distance matrix, which can be specified in three ways: \begin{itemize} \item as a 2D Numerical Python array (in which only the left-lower part of the array will be accessed): \begin{verbatim} distance = array([[0.0, 1.1, 2.3], [1.1, 0.0, 4.5], [2.3, 4.5, 0.0]]) \end{verbatim} \item as a 1D Numerical Python array containing consecutively the distances in the left-lower part of the distance matrix: \begin{verbatim} distance = array([1.1, 2.3, 4.5]) \end{verbatim} \item as a list containing the rows of the left-lower part of the distance matrix: \begin{verbatim} distance = [array([]), array([1.1]), array([2.3, 4.5]) \end{verbatim} \end{itemize} These three expressions correspond to the same distance matrix. As \verb|treecluster| may shuffle the values in the distance matrix as part of the clustering algorithm, be sure to save this array in a different variable before calling \verb|treecluster| if you need it later. \item \verb|method| \\ The linkage method to be used: \begin{itemize} \item \verb|method=='s'|: pairwise single-linkage clustering \item \verb|method=='m'|: pairwise maximum- (or complete-) linkage clustering \item \verb|method=='a'|: pairwise average-linkage clustering \end{itemize} While pairwise single-, maximum-, and average-linkage clustering can be calculated from the distance matrix alone, pairwise centroid-linkage cannot. \end{itemize} When calling \verb|treecluster|, either \verb|data| or \verb|distancematrix| should be \verb|None|. This function returns a \verb|Tree| object. This object contains $\left(\textrm{number of items} - 1\right)$ nodes, where the number of items is the number of rows if rows were clustered, or the number of columns if columns were clustered. Each node describes a pairwise linking event, where the node attributes \verb|left| and \verb|right| each contain the number of one item or subnode, and \verb|distance| the distance between them. Items are numbered from 0 to $\left(\textrm{number of items} - 1\right)$, while clusters are numbered -1 to $-\left(\textrm{number of items}-1\right)$. \section{Self-Organizing Maps} Self-Organizing Maps (SOMs) were invented by Kohonen to describe neural networks (see for instance Kohonen, 1997 \cite{kohonen1997}). Tamayo (1999) first applied Self-Organizing Maps to gene expression data \cite{tamayo1999}. SOMs organize items into clusters that are situated in some topology. Usually a rectangular topology is chosen. The clusters generated by SOMs are such that neighboring clusters in the topology are more similar to each other than clusters far from each other in the topology. The first step to calculate a SOM is to randomly assign a data vector to each cluster in the topology. If rows are being clustered, then the number of elements in each data vector is equal to the number of columns. An SOM is then generated by taking rows one at a time, and finding which cluster in the topology has the closest data vector. The data vector of that cluster, as well as those of the neighboring clusters, are adjusted using the data vector of the row under consideration. The adjustment is given by $$\Delta \underline{x}_{\textrm{cell}} = \tau \cdot \left(\underline{x}_{\textrm{row}} - \underline{x}_{\textrm{cell}} \right).$$ The parameter $\tau$ is a parameter that decreases at each iteration step. We have used a simple linear function of the iteration step: $$\tau = \tau_{\textrm{init}} \cdot \left(1 - {i \over n}\right),$$ $\tau_{\textrm{init}}$ is the initial value of $\tau$ as specified by the user, $i$ is the number of the current iteration step, and $n$ is the total number of iteration steps to be performed. While changes are made rapidly in the beginning of the iteration, at the end of iteration only small changes are made. All clusters within a radius $R$ are adjusted to the gene under consideration. This radius decreases as the calculation progresses as $$R = R_{\textrm{max}} \cdot \left(1 - {i \over n}\right),$$ in which the maximum radius is defined as $$R_{\textrm{max}} = \sqrt{N_x^2 + N_y^2},$$ where $\left(N_x, N_y\right)$ are the dimensions of the rectangle defining the topology. The function \verb|somcluster| implements the complete algorithm to calculate a Self-Organizing Map on a rectangular grid. First it initializes the random number generator. The node data are then initialized using the random number generator. The order in which genes or microarrays are used to modify the SOM is also randomized. The total number of iterations in the SOM algorithm is specified by the user. To run \verb|somcluster|, use \begin{verbatim} >>> from Bio.Cluster import somcluster >>> clusterid, celldata = somcluster(data) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|data| (required) \\ Array containing the data for the items. \item \verb|mask| (default: \verb|None|) \\ Array of integers showing which data are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If \verb|mask==None|, then all data are present. \item \verb|weight| (default: \verb|None|) \\ contains the weights to be used when calculating distances. If \verb|weight==None|, then equal weights are assumed. \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose| is \verb|0|) or columns (\verb|transpose| is \verb|1|) are to be clustered. \item \verb|nxgrid, nygrid| (default: \verb|2, 1|) \\ The number of cells horizontally and vertically in the rectangular grid on which the Self-Organizing Map is calculated. \item \verb|inittau| (default: \verb|0.02|) \\ The initial value for the parameter $\tau$ that is used in the SOM algorithm. The default value for \verb|inittau| is 0.02, which was used in Michael Eisen's Cluster/TreeView program. \item \verb|niter| (default: \verb|1|) \\ The number of iterations to be performed. \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} This function returns the tuple \verb|(clusterid, celldata)|: \begin{itemize} \item \verb|clusterid|: \\ An array with two columns, where the number of rows is equal to the number of items that were clustered. Each row contains the $x$ and $y$ coordinates of the cell in the rectangular SOM grid to which the item was assigned. \item \verb|celldata|: \\ An array with dimensions $\left(\verb|nxgrid|, \verb|nygrid|, \textrm{number of columns}\right)$ if rows are being clustered, or $\left(\verb|nxgrid|, \verb|nygrid|, \textrm{number of rows}\right)$ if columns are being clustered. Each element \verb|[ix][iy]| of this array is a 1D vector containing the gene expression data for the centroid of the cluster in the grid cell with coordinates \verb|[ix][iy]|. \end{itemize} \section{Principal Component Analysis} Principal Component Analysis (PCA) is a widely used technique for analyzing multivariate data. A practical example of applying Principal Component Analysis to gene expression data is presented by Yeung and Ruzzo (2001) \cite{yeung2001}. In essence, PCA is a coordinate transformation in which each row in the data matrix is written as a linear sum over basis vectors called principal components, which are ordered and chosen such that each maximally explains the remaining variance in the data vectors. For example, an $n \times 3$ data matrix can be represented as an ellipsoidal cloud of $n$ points in three dimensional space. The first principal component is the longest axis of the ellipsoid, the second principal component the second longest axis of the ellipsoid, and the third principal component is the shortest axis. Each row in the data matrix can be reconstructed as a suitable linear combination of the principal components. However, in order to reduce the dimensionality of the data, usually only the most important principal components are retained. The remaining variance present in the data is then regarded as unexplained variance. The principal components can be found by calculating the eigenvectors of the covariance matrix of the data. The corresponding eigenvalues determine how much of the variance present in the data is explained by each principal component. Before applying principal component analysis, typically the mean is subtracted from each column in the data matrix. In the example above, this effectively centers the ellipsoidal cloud around its centroid in 3D space, with the principal components describing the variation of points in the ellipsoidal cloud with respect to their centroid. The function \verb|pca| below first uses the singular value decomposition to calculate the eigenvalues and eigenvectors of the data matrix. The singular value decomposition is implemented as a translation in C of the Algol procedure \verb|svd| \cite{golub1971}, which uses Householder bidiagonalization and a variant of the QR algorithm. The principal components, the coordinates of each data vector along the principal components, and the eigenvalues corresponding to the principal components are then evaluated and returned in decreasing order of the magnitude of the eigenvalue. If data centering is desired, the mean should be subtracted from each column in the data matrix before calling the \verb|pca| routine. To apply Principal Component Analysis to a rectangular matrix \verb|data|, use \begin{verbatim} >>> from Bio.Cluster import pca >>> columnmean, coordinates, components, eigenvalues = pca(data) \end{verbatim} This function returns a tuple \verb|columnmean, coordinates, components, eigenvalues|: \begin{itemize} \item \verb|columnmean| \\ Array containing the mean over each column in \verb|data|. \item \verb|coordinates| \\ The coordinates of each row in \verb|data| with respect to the principal components. \item \verb|components| \\ The principal components. \item \verb|eigenvalues| \\ The eigenvalues corresponding to each of the principal components. \end{itemize} The original matrix \verb|data| can be recreated by calculating \verb|columnmean + dot(coordinates, components)|. \section{Handling Cluster/TreeView-type files} Cluster/TreeView are GUI-based codes for clustering gene expression data. They were originally written by \href{http://rana.lbl.gov}{Michael Eisen} while at Stanford University. \verb|Bio.Cluster| contains functions for reading and writing data files that correspond to the format specified for Cluster/TreeView. In particular, by saving a clustering result in that format, TreeView can be used to visualize the clustering results. We recommend using Alok Saldanha's \url{http://jtreeview.sourceforge.net/}{Java TreeView program}, which can display hierarchical as well as $k$-means clustering results. An object of the class \verb|Record| contains all information stored in a Cluster/TreeView-type data file. To store the information contained in the data file in a \verb|Record| object, we first open the file and then read it: \begin{verbatim} >>> from Bio import Cluster >>> handle = open("mydatafile.txt") >>> record = Cluster.read(handle) >>> handle.close() \end{verbatim} This two-step process gives you some flexibility in the source of the data. For example, you can use \begin{verbatim} >>> import gzip # Python standard library >>> handle = gzip.open("mydatafile.txt.gz") \end{verbatim} to open a gzipped file, or \begin{verbatim} >>> import urllib # Python standard library >>> handle = urllib.urlopen("http://somewhere.org/mydatafile.txt") \end{verbatim} to open a file stored on the Internet before calling \verb|read|. The \verb|read| command reads the tab-delimited text file \verb|mydatafile.txt| containing gene expression data in the format specified for Michael Eisen's Cluster/TreeView program. For a description of this file format, see the manual to Cluster/TreeView. It is available at \href{http://rana.lbl.gov/manuals/ClusterTreeView.pdf}{Michael Eisen's lab website} and at \href{http://bonsai.ims.u-tokyo.ac.jp/~mdehoon/software/cluster/cluster3.pdf}{our website}. A \verb|Record| object has the following attributes: \begin{itemize} \item \verb|data| \\ The data array containing the gene expression data. Genes are stored row-wise, while microarrays are stored column-wise. \item \verb|mask| \\ This array shows which elements in the \verb|data| array, if any, are missing. If \verb|mask[i,j]==0|, then \verb|data[i,j]| is missing. If no data were found to be missing, \verb|mask| is set to \verb|None|. \item \verb|geneid| \\ This is a list containing a unique description for each gene (i.e., ORF numbers). \item \verb|genename| \\ This is a list containing a description for each gene (i.e., gene name). If not present in the data file, \verb|genename| is set to \verb|None|. \item \verb|gweight| \\ The weights that are to be used to calculate the distance in expression profile between genes. If not present in the data file, \verb|gweight| is set to \verb|None|. \item \verb|gorder| \\ The preferred order in which genes should be stored in an output file. If not present in the data file, \verb|gorder| is set to \verb|None|. \item \verb|expid| \\ This is a list containing a description of each microarray, e.g. experimental condition. \item \verb|eweight| \\ The weights that are to be used to calculate the distance in expression profile between microarrays. If not present in the data file, \verb|eweight| is set to \verb|None|. \item \verb|eorder| \\ The preferred order in which microarrays should be stored in an output file. If not present in the data file, \verb|eorder| is set to \verb|None|. \item \verb|uniqid| \\ The string that was used instead of UNIQID in the data file. \end{itemize} After loading a \verb|Record| object, each of these attributes can be accessed and modified directly. For example, the data can be log-transformed by taking the logarithm of \verb|record.data|. \subsection*{Calculating the distance matrix} To calculate the distance matrix between the items stored in the record, use \begin{verbatim} >>> matrix = record.distancematrix() \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|transpose| (default: \verb|0|) \\ Determines if the distances between the rows of \verb|data| are to be calculated (\verb|transpose==0|), or between the columns of \verb|data| (\verb|transpose==1|). \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} This function returns the distance matrix as a list of rows, where the number of columns of each row is equal to the row number (see section \ref{subsec:distancematrix}). \subsection*{Calculating the cluster centroids} To calculate the centroids of clusters of items stored in the record, use \begin{verbatim} >>> cdata, cmask = record.clustercentroids() \end{verbatim} \begin{itemize} \item \verb|clusterid| (default: \verb|None|) \\ Vector of integers showing to which cluster each item belongs. If \verb|clusterid| is not given, then all items are assumed to belong to the same cluster. \item \verb|method| (default: \verb|'a'|) \\ Specifies whether the arithmetic mean (\verb|method=='a'|) or the median (\verb|method=='m'|) is used to calculate the cluster center. \item \verb|transpose| (default: \verb|0|) \\ Determines if the centroids of the rows of \verb|data| are to be calculated (\verb|transpose==0|), or the centroids of the columns of \verb|data| (\verb|transpose==1|). \end{itemize} This function returns the tuple \verb|cdata, cmask|; see section \ref{subsec:clustercentroids} for a description. \subsection*{Calculating the distance between clusters} To calculate the distance between clusters of items stored in the record, use \begin{verbatim} >>> distance = record.clusterdistance() \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|index1| (default: \verb|0|) \\ A list containing the indices of the items belonging to the first cluster. A cluster containing only one item $i$ can be represented either as a list \verb|[i]|, or as an integer \verb|i|. \item \verb|index2| (default: \verb|0|) \\ A list containing the indices of the items belonging to the second cluster. A cluster containing only one item $i$ can be represented either as a list \verb|[i]|, or as an integer \verb|i|. \item \verb|method| (default: \verb|'a'|) \\ Specifies how the distance between clusters is defined: \begin{itemize} \item \verb|'a'|: Distance between the two cluster centroids (arithmetic mean); \item \verb|'m'|: Distance between the two cluster centroids (median); \item \verb|'s'|: Shortest pairwise distance between items in the two clusters; \item \verb|'x'|: Longest pairwise distance between items in the two clusters; \item \verb|'v'|: Average over the pairwise distances between items in the two clusters. \end{itemize} \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \item \verb|transpose| (default: \verb|0|) \\ If \verb|transpose==0|, calculate the distance between the rows of \verb|data|. If \verb|transpose==1|, calculate the distance between the columns of \verb|data|. \end{itemize} \subsection*{Performing hierarchical clustering} To perform hierarchical clustering on the items stored in the record, use \begin{verbatim} >>> tree = record.treecluster() \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose==0|) or columns (\verb|transpose==1|) are to be clustered. \item \verb|method| (default: \verb|'m'|) \\ defines the linkage method to be used: \begin{itemize} \item \verb|method=='s'|: pairwise single-linkage clustering \item \verb|method=='m'|: pairwise maximum- (or complete-) linkage clustering \item \verb|method=='c'|: pairwise centroid-linkage clustering \item \verb|method=='a'|: pairwise average-linkage clustering \end{itemize} \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \item \verb|transpose| \\ Determines if genes or microarrays are being clustered. If \verb|transpose==0|, genes (rows) are being clustered. If \verb|transpose==1|, microarrays (columns) are clustered. \end{itemize} This function returns a \verb|Tree| object. This object contains $\left(\textrm{number of items} - 1\right)$ nodes, where the number of items is the number of rows if rows were clustered, or the number of columns if columns were clustered. Each node describes a pairwise linking event, where the node attributes \verb|left| and \verb|right| each contain the number of one item or subnode, and \verb|distance| the distance between them. Items are numbered from 0 to $\left(\textrm{number of items} - 1\right)$, while clusters are numbered -1 to $-\left(\textrm{number of items}-1\right)$. \subsection*{Performing $k$-means or $k$-medians clustering} To perform $k$-means or $k$-medians clustering on the items stored in the record, use \begin{verbatim} >>> clusterid, error, nfound = record.kcluster() \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|nclusters| (default: \verb|2|) \\ The number of clusters $k$. \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose| is \verb|0|) or columns (\verb|transpose| is \verb|1|) are to be clustered. \item \verb|npass| (default: \verb|1|) \\ The number of times the $k$-means/-medians clustering algorithm is performed, each time with a different (random) initial condition. If \verb|initialid| is given, the value of \verb|npass| is ignored and the clustering algorithm is run only once, as it behaves deterministically in that case. \item \verb|method| (default: \verb|a|) \\ describes how the center of a cluster is found: \begin{itemize} \item \verb|method=='a'|: arithmetic mean ($k$-means clustering); \item \verb|method=='m'|: median ($k$-medians clustering). \end{itemize} For other values of \verb|method|, the arithmetic mean is used. \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} This function returns a tuple \verb|(clusterid, error, nfound)|, where \verb|clusterid| is an integer array containing the number of the cluster to which each row or cluster was assigned, \verb|error| is the within-cluster sum of distances for the optimal clustering solution, and \verb|nfound| is the number of times this optimal solution was found. \subsection*{Calculating a Self-Organizing Map} To calculate a Self-Organizing Map of the items stored in the record, use \begin{verbatim} >>> clusterid, celldata = record.somcluster() \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|transpose| (default: \verb|0|) \\ Determines if rows (\verb|transpose| is \verb|0|) or columns (\verb|transpose| is \verb|1|) are to be clustered. \item \verb|nxgrid, nygrid| (default: \verb|2, 1|) \\ The number of cells horizontally and vertically in the rectangular grid on which the Self-Organizing Map is calculated. \item \verb|inittau| (default: \verb|0.02|) \\ The initial value for the parameter $\tau$ that is used in the SOM algorithm. The default value for \verb|inittau| is 0.02, which was used in Michael Eisen's Cluster/TreeView program. \item \verb|niter| (default: \verb|1|) \\ The number of iterations to be performed. \item \verb|dist| (default: \verb|'e'|, Euclidean distance) \\ Defines the distance function to be used (see \ref{sec:distancefunctions}). \end{itemize} This function returns the tuple \verb|(clusterid, celldata)|: \begin{itemize} \item \verb|clusterid|: \\ An array with two columns, where the number of rows is equal to the number of items that were clustered. Each row contains the $x$ and $y$ coordinates of the cell in the rectangular SOM grid to which the item was assigned. \item \verb|celldata|: \\ An array with dimensions $\left(\verb|nxgrid|, \verb|nygrid|, \textrm{number of columns}\right)$ if rows are being clustered, or $\left(\verb|nxgrid|, \verb|nygrid|, \textrm{number of rows}\right)$ if columns are being clustered. Each element \verb|[ix][iy]| of this array is a 1D vector containing the gene expression data for the centroid of the cluster in the grid cell with coordinates \verb|[ix][iy]|. \end{itemize} \subsection*{Saving the clustering result} To save the clustering result, use \begin{verbatim} >>> record.save(jobname, geneclusters, expclusters) \end{verbatim} where the following arguments are defined: \begin{itemize} \item \verb|jobname| \\ The string \verb|jobname| is used as the base name for names of the files that are to be saved. \item \verb|geneclusters| \\ This argument describes the gene (row-wise) clustering result. In case of $k$-means clustering, this is a 1D array containing the number of the cluster each gene belongs to. It can be calculated using \verb|kcluster|. In case of hierarchical clustering, \verb|geneclusters| is a \verb|Tree| object. \item \verb|expclusters| \\ This argument describes the (column-wise) clustering result for the experimental conditions. In case of $k$-means clustering, this is a 1D array containing the number of the cluster each experimental condition belongs to. It can be calculated using \verb|kcluster|. In case of hierarchical clustering, \verb|expclusters| is a \verb|Tree| object. \end{itemize} This method writes the text file \verb|jobname.cdt|, \verb|jobname.gtr|, \verb|jobname.atr|, \verb|jobname*.kgg|, and/or \verb|jobname*.kag| for subsequent reading by the Java TreeView program. If \verb|geneclusters| and \verb|expclusters| are both \verb|None|, this method only writes the text file \verb|jobname.cdt|; this file can subsequently be read into a new \verb|Record| object. \section{Example calculation} This is an example of a hierarchical clustering calculation, using single linkage clustering for genes and maximum linkage clustering for experimental conditions. As the Euclidean distance is being used for gene clustering, it is necessary to scale the node distances \verb|genetree| such that they are all between zero and one. This is needed for the Java TreeView code to display the tree diagram correctly. To cluster the experimental conditions, the uncentered correlation is being used. No scaling is needed in this case, as the distances in \verb|exptree| are already between zero and two. The example data \verb|cyano.txt| can be found in the \verb|data| subdirectory. \begin{verbatim} >>> from Bio import Cluster >>> handle = open("cyano.txt") >>> record = Cluster.read(handle) >>> handle.close() >>> genetree = record.treecluster(method='s') >>> genetree.scale() >>> exptree = record.treecluster(dist='u', transpose=1) >>> record.save("cyano_result", genetree, exptree) \end{verbatim} This will create the files \verb|cyano_result.cdt|, \verb|cyano_result.gtr|, and \verb|cyano_result.atr|. Similarly, we can save a $k$-means clustering solution: \begin{verbatim} >>> from Bio import Cluster >>> handle = open("cyano.txt") >>> record = Cluster.read(handle) >>> handle.close() >>> (geneclusters, error, ifound) = record.kcluster(nclusters=5, npass=1000) >>> (expclusters, error, ifound) = record.kcluster(nclusters=2, npass=100, transpose=1) >>> record.save("cyano_result", geneclusters, expclusters) \end{verbatim} This will create the files \verb|cyano_result_K_G2_A2.cdt|, \verb|cyano_result_K_G2.kgg|, and \verb|cyano_result_K_A2.kag|. \section{Auxiliary functions} \verb|median(data)| returns the median of the 1D array \verb|data|. \verb|mean(data)| returns the mean of the 1D array \verb|data|. \verb|version()| returns the version number of the underlying C Clustering Library as a string. \chapter{Supervised learning methods} Note the supervised learning methods described in this chapter all require Numerical Python (numpy) to be installed. \section{The Logistic Regression Model} \label{sec:LogisticRegression} \subsection{Background and Purpose} Logistic regression is a supervised learning approach that attempts to distinguish $K$ classes from each other using a weighted sum of some predictor variables $x_i$. The logistic regression model is used to calculate the weights $\beta_i$ of the predictor variables. In Biopython, the logistic regression model is currently implemented for two classes only ($K = 2$); the number of predictor variables has no predefined limit. As an example, let's try to predict the operon structure in bacteria. An operon is a set of adjacent genes on the same strand of DNA that are transcribed into a single mRNA molecule. Translation of the single mRNA molecule then yields the individual proteins. For {\it Bacillus subtilis}, whose data we will be using, the average number of genes in an operon is about 2.4. As a first step in understanding gene regulation in bacteria, we need to know the operon structure. For about 10\% of the genes in {\it Bacillus subtilis}, the operon structure is known from experiments. A supervised learning method can be used to predict the operon structure for the remaining 90\% of the genes. For such a supervised learning approach, we need to choose some predictor variables $x_i$ that can be measured easily and are somehow related to the operon structure. One predictor variable might be the distance in base pairs between genes. Adjacent genes belonging to the same operon tend to be separated by a relatively short distance, whereas adjacent genes in different operons tend to have a larger space between them to allow for promoter and terminator sequences. Another predictor variable is based on gene expression measurements. By definition, genes belonging to the same operon have equal gene expression profiles, while genes in different operons are expected to have different expression profiles. In practice, the measured expression profiles of genes in the same operon are not quite identical due to the presence of measurement errors. To assess the similarity in the gene expression profiles, we assume that the measurement errors follow a normal distribution and calculate the corresponding log-likelihood score. We now have two predictor variables that we can use to predict if two adjacent genes on the same strand of DNA belong to the same operon: \begin{itemize} \item $x_1$: the number of base pairs between them; \item $x_2$: their similarity in expression profile. \end{itemize} In a logistic regression model, we use a weighted sum of these two predictors to calculate a joint score $S$: \begin{equation} S = \beta_0 + \beta_1 x_1 + \beta_2 x_2. \end{equation} The logistic regression model gives us appropriate values for the parameters $\beta_0$, $\beta_1$, $\beta_2$ using two sets of example genes: \begin{itemize} \item OP: Adjacent genes, on the same strand of DNA, known to belong to the same operon; \item NOP: Adjacent genes, on the same strand of DNA, known to belong to different operons. \end{itemize} In the logistic regression model, the probability of belonging to a class depends on the score via the logistic function. For the two classes OP and NOP, we can write this as \begin{eqnarray} \Pr(\mathrm{OP}|x_1, x_2) & = & \frac{\exp(\beta_0 + \beta_1 x_1 + \beta_2 x_2)}{1+\exp(\beta_0 + \beta_1 x_1 + \beta_2 x_2)} \label{eq:OP} \\ \Pr(\mathrm{NOP}|x_1, x_2) & = & \frac{1}{1+\exp(\beta_0 + \beta_1 x_1 + \beta_2 x_2)} \label{eq:NOP} \end{eqnarray} Using a set of gene pairs for which it is known whether they belong to the same operon (class OP) or to different operons (class NOP), we can calculate the weights $\beta_0$, $\beta_1$, $\beta_2$ by maximizing the log-likelihood corresponding to the probability functions (\ref{eq:OP}) and (\ref{eq:NOP}). \subsection{Training the logistic regression model} \label{subsec:LogisticRegressionTraining} \begin{table}[h] \begin{center} \caption{Adjacent gene pairs known to belong to the same operon (class OP) or to different operons (class NOP). Intergene distances are negative if the two genes overlap.} \begin{tabular}{|c|c|c|c|} \hline Gene pair & Intergene distance ($x_1$) & Gene expression score ($x_2$) & Class\\ \hline {\it cotJA} --- {\it cotJB} & -53 & -200.78 & OP\\ {\it yesK} --- {\it yesL} & 117 & -267.14 & OP\\ {\it lplA} --- {\it lplB} & 57 & -163.47 & OP\\ {\it lplB} --- {\it lplC} & 16 & -190.30 & OP\\ {\it lplC} --- {\it lplD} & 11 & -220.94 & OP\\ {\it lplD} --- {\it yetF} & 85 & -193.94 & OP\\ {\it yfmT} --- {\it yfmS} & 16 & -182.71 & OP\\ {\it yfmF} --- {\it yfmE} & 15 & -180.41 & OP\\ {\it citS} --- {\it citT} & -26 & -181.73 & OP\\ {\it citM} --- {\it yflN} & 58 & -259.87 & OP\\ {\it yfiI} --- {\it yfiJ} & 126 & -414.53 & NOP\\ {\it lipB} --- {\it yfiQ} & 191 & -249.57 & NOP\\ {\it yfiU} --- {\it yfiV} & 113 & -265.28 & NOP\\ {\it yfhH} --- {\it yfhI} & 145 & -312.99 & NOP\\ {\it cotY} --- {\it cotX} & 154 & -213.83 & NOP\\ {\it yjoB} --- {\it rapA} & 147 & -380.85 & NOP\\ {\it ptsI} --- {\it splA} & 93 & -291.13 & NOP \\ \hline \end{tabular} \label{table:training} \end{center} \end{table} Table \ref{table:training} lists some of the {\it Bacillus subtilis} gene pairs for which the operon structure is known. Let's calculate the logistic regression model from these data: %NOTE - can't use this as a doctest in case NumPy is missing (Jython). %Also the ... are missing but that means the user can copy/paste the example. \begin{verbatim} >>> from Bio import LogisticRegression >>> xs = [[-53, -200.78], [117, -267.14], [57, -163.47], [16, -190.30], [11, -220.94], [85, -193.94], [16, -182.71], [15, -180.41], [-26, -181.73], [58, -259.87], [126, -414.53], [191, -249.57], [113, -265.28], [145, -312.99], [154, -213.83], [147, -380.85], [93, -291.13]] >>> ys = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0] >>> model = LogisticRegression.train(xs, ys) \end{verbatim} Here, \verb+xs+ and \verb+ys+ are the training data: \verb+xs+ contains the predictor variables for each gene pair, and \verb+ys+ specifies if the gene pair belongs to the same operon (\verb+1+, class OP) or different operons (\verb+0+, class NOP). The resulting logistic regression model is stored in \verb+model+, which contains the weights $\beta_0$, $\beta_1$, and $\beta_2$: \begin{verbatim} >>> model.beta [8.9830290157144681, -0.035968960444850887, 0.02181395662983519] \end{verbatim} Note that $\beta_1$ is negative, as gene pairs with a shorter intergene distance have a higher probability of belonging to the same operon (class OP). On the other hand, $\beta_2$ is positive, as gene pairs belonging to the same operon typically have a higher similarity score of their gene expression profiles. The parameter $\beta_0$ is positive due to the higher prevalence of operon gene pairs than non-operon gene pairs in the training data. The function \verb+train+ has two optional arguments: \verb+update_fn+ and \verb+typecode+. The \verb+update_fn+ can be used to specify a callback function, taking as arguments the iteration number and the log-likelihood. With the callback function, we can for example track the progress of the model calculation (which uses a Newton-Raphson iteration to maximize the log-likelihood function of the logistic regression model): \begin{verbatim} >>> def show_progress(iteration, loglikelihood): print("Iteration:", iteration, "Log-likelihood function:", loglikelihood) >>> >>> model = LogisticRegression.train(xs, ys, update_fn=show_progress) Iteration: 0 Log-likelihood function: -11.7835020695 Iteration: 1 Log-likelihood function: -7.15886767672 Iteration: 2 Log-likelihood function: -5.76877209868 Iteration: 3 Log-likelihood function: -5.11362294338 Iteration: 4 Log-likelihood function: -4.74870642433 Iteration: 5 Log-likelihood function: -4.50026077146 Iteration: 6 Log-likelihood function: -4.31127773737 Iteration: 7 Log-likelihood function: -4.16015043396 Iteration: 8 Log-likelihood function: -4.03561719785 Iteration: 9 Log-likelihood function: -3.93073282192 Iteration: 10 Log-likelihood function: -3.84087660929 Iteration: 11 Log-likelihood function: -3.76282560605 Iteration: 12 Log-likelihood function: -3.69425027154 Iteration: 13 Log-likelihood function: -3.6334178602 Iteration: 14 Log-likelihood function: -3.57900855837 Iteration: 15 Log-likelihood function: -3.52999671386 Iteration: 16 Log-likelihood function: -3.48557145163 Iteration: 17 Log-likelihood function: -3.44508206139 Iteration: 18 Log-likelihood function: -3.40799948447 Iteration: 19 Log-likelihood function: -3.3738885624 Iteration: 20 Log-likelihood function: -3.3423876581 Iteration: 21 Log-likelihood function: -3.31319343769 Iteration: 22 Log-likelihood function: -3.2860493346 Iteration: 23 Log-likelihood function: -3.2607366863 Iteration: 24 Log-likelihood function: -3.23706784091 Iteration: 25 Log-likelihood function: -3.21488073614 Iteration: 26 Log-likelihood function: -3.19403459259 Iteration: 27 Log-likelihood function: -3.17440646052 Iteration: 28 Log-likelihood function: -3.15588842703 Iteration: 29 Log-likelihood function: -3.13838533947 Iteration: 30 Log-likelihood function: -3.12181293595 Iteration: 31 Log-likelihood function: -3.10609629966 Iteration: 32 Log-likelihood function: -3.09116857282 Iteration: 33 Log-likelihood function: -3.07696988017 Iteration: 34 Log-likelihood function: -3.06344642288 Iteration: 35 Log-likelihood function: -3.05054971191 Iteration: 36 Log-likelihood function: -3.03823591619 Iteration: 37 Log-likelihood function: -3.02646530573 Iteration: 38 Log-likelihood function: -3.01520177394 Iteration: 39 Log-likelihood function: -3.00441242601 Iteration: 40 Log-likelihood function: -2.99406722296 Iteration: 41 Log-likelihood function: -2.98413867259 \end{verbatim} The iteration stops once the increase in the log-likelihood function is less than 0.01. If no convergence is reached after 500 iterations, the \verb+train+ function returns with an \verb+AssertionError+. The optional keyword \verb+typecode+ can almost always be ignored. This keyword allows the user to choose the type of Numeric matrix to use. In particular, to avoid memory problems for very large problems, it may be necessary to use single-precision floats (Float8, Float16, etc.) rather than double, which is used by default. \subsection{Using the logistic regression model for classification} Classification is performed by calling the \verb+classify+ function. Given a logistic regression model and the values for $x_1$ and $x_2$ (e.g. for a gene pair of unknown operon structure), the \verb+classify+ function returns \verb+1+ or \verb+0+, corresponding to class OP and class NOP, respectively. For example, let's consider the gene pairs {\it yxcE}, {\it yxcD} and {\it yxiB}, {\it yxiA}: \begin{table}[h] \begin{center} \caption{Adjacent gene pairs of unknown operon status.} \begin{tabular}{|c|c|c|} \hline Gene pair & Intergene distance $x_1$ & Gene expression score $x_2$ \\ \hline {\it yxcE} --- {\it yxcD} & 6 & -173.143442352 \\ {\it yxiB} --- {\it yxiA} & 309 & -271.005880394 \\ \hline \end{tabular} \end{center} \end{table} The logistic regression model classifies {\it yxcE}, {\it yxcD} as belonging to the same operon (class OP), while {\it yxiB}, {\it yxiA} are predicted to belong to different operons: \begin{verbatim} >>> print("yxcE, yxcD:", LogisticRegression.classify(model, [6, -173.143442352])) yxcE, yxcD: 1 >>> print("yxiB, yxiA:", LogisticRegression.classify(model, [309, -271.005880394])) yxiB, yxiA: 0 \end{verbatim} (which, by the way, agrees with the biological literature). To find out how confident we can be in these predictions, we can call the \verb+calculate+ function to obtain the probabilities (equations (\ref{eq:OP}) and \ref{eq:NOP}) for class OP and NOP. For {\it yxcE}, {\it yxcD} we find \begin{verbatim} >>> q, p = LogisticRegression.calculate(model, [6, -173.143442352]) >>> print("class OP: probability =", p, "class NOP: probability =", q) class OP: probability = 0.993242163503 class NOP: probability = 0.00675783649744 \end{verbatim} and for {\it yxiB}, {\it yxiA} \begin{verbatim} >>> q, p = LogisticRegression.calculate(model, [309, -271.005880394]) >>> print("class OP: probability =", p, "class NOP: probability =", q) class OP: probability = 0.000321211251817 class NOP: probability = 0.999678788748 \end{verbatim} To get some idea of the prediction accuracy of the logistic regression model, we can apply it to the training data: \begin{verbatim} >>> for i in range(len(ys)): print("True:", ys[i], "Predicted:", LogisticRegression.classify(model, xs[i])) True: 1 Predicted: 1 True: 1 Predicted: 0 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 \end{verbatim} showing that the prediction is correct for all but one of the gene pairs. A more reliable estimate of the prediction accuracy can be found from a leave-one-out analysis, in which the model is recalculated from the training data after removing the gene to be predicted: \begin{verbatim} >>> for i in range(len(ys)): model = LogisticRegression.train(xs[:i]+xs[i+1:], ys[:i]+ys[i+1:]) print("True:", ys[i], "Predicted:", LogisticRegression.classify(model, xs[i])) True: 1 Predicted: 1 True: 1 Predicted: 0 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 1 True: 0 Predicted: 0 True: 0 Predicted: 0 \end{verbatim} The leave-one-out analysis shows that the prediction of the logistic regression model is incorrect for only two of the gene pairs, which corresponds to a prediction accuracy of 88\%. \subsection{Logistic Regression, Linear Discriminant Analysis, and Support Vector Machines} The logistic regression model is similar to linear discriminant analysis. In linear discriminant analysis, the class probabilities also follow equations (\ref{eq:OP}) and (\ref{eq:NOP}). However, instead of estimating the coefficients $\beta$ directly, we first fit a normal distribution to the predictor variables $x$. The coefficients $\beta$ are then calculated from the means and covariances of the normal distribution. If the distribution of $x$ is indeed normal, then we expect linear discriminant analysis to perform better than the logistic regression model. The logistic regression model, on the other hand, is more robust to deviations from normality. Another similar approach is a support vector machine with a linear kernel. Such an SVM also uses a linear combination of the predictors, but estimates the coefficients $\beta$ from the predictor variables $x$ near the boundary region between the classes. If the logistic regression model (equations (\ref{eq:OP}) and (\ref{eq:NOP})) is a good description for $x$ away from the boundary region, we expect the logistic regression model to perform better than an SVM with a linear kernel, as it relies on more data. If not, an SVM with a linear kernel may perform better. Trevor Hastie, Robert Tibshirani, and Jerome Friedman: {\it The Elements of Statistical Learning. Data Mining, Inference, and Prediction}. Springer Series in Statistics, 2001. Chapter 4.4. \section{$k$-Nearest Neighbors} \subsection{Background and purpose} The $k$-nearest neighbors method is a supervised learning approach that does not need to fit a model to the data. Instead, data points are classified based on the categories of the $k$ nearest neighbors in the training data set. In Biopython, the $k$-nearest neighbors method is available in \verb+Bio.kNN+. To illustrate the use of the $k$-nearest neighbor method in Biopython, we will use the same operon data set as in section \ref{sec:LogisticRegression}. \subsection{Initializing a $k$-nearest neighbors model} Using the data in Table \ref{table:training}, we create and initialize a $k$-nearest neighbors model as follows: \begin{verbatim} >>> from Bio import kNN >>> k = 3 >>> model = kNN.train(xs, ys, k) \end{verbatim} where \verb+xs+ and \verb+ys+ are the same as in Section \ref{subsec:LogisticRegressionTraining}. Here, \verb+k+ is the number of neighbors $k$ that will be considered for the classification. For classification into two classes, choosing an odd number for $k$ lets you avoid tied votes. The function name \verb+train+ is a bit of a misnomer, since no model training is done: this function simply stores \verb+xs+, \verb+ys+, and \verb+k+ in \verb+model+. \subsection{Using a $k$-nearest neighbors model for classification} To classify new data using the $k$-nearest neighbors model, we use the \verb+classify+ function. This function takes a data point $(x_1,x_2)$ and finds the $k$-nearest neighbors in the training data set \verb+xs+. The data point $(x_1, x_2)$ is then classified based on which category (\verb+ys+) occurs most among the $k$ neighbors. For the example of the gene pairs {\it yxcE}, {\it yxcD} and {\it yxiB}, {\it yxiA}, we find: \begin{verbatim} >>> x = [6, -173.143442352] >>> print("yxcE, yxcD:", kNN.classify(model, x)) yxcE, yxcD: 1 >>> x = [309, -271.005880394] >>> print("yxiB, yxiA:", kNN.classify(model, x)) yxiB, yxiA: 0 \end{verbatim} In agreement with the logistic regression model, {\it yxcE}, {\it yxcD} are classified as belonging to the same operon (class OP), while {\it yxiB}, {\it yxiA} are predicted to belong to different operons. The \verb+classify+ function lets us specify both a distance function and a weight function as optional arguments. The distance function affects which $k$ neighbors are chosen as the nearest neighbors, as these are defined as the neighbors with the smallest distance to the query point $(x, y)$. By default, the Euclidean distance is used. Instead, we could for example use the city-block (Manhattan) distance: \begin{verbatim} >>> def cityblock(x1, x2): ... assert len(x1)==2 ... assert len(x2)==2 ... distance = abs(x1[0]-x2[0]) + abs(x1[1]-x2[1]) ... return distance ... >>> x = [6, -173.143442352] >>> print("yxcE, yxcD:", kNN.classify(model, x, distance_fn = cityblock)) yxcE, yxcD: 1 \end{verbatim} The weight function can be used for weighted voting. For example, we may want to give closer neighbors a higher weight than neighbors that are further away: \begin{verbatim} >>> def weight(x1, x2): ... assert len(x1)==2 ... assert len(x2)==2 ... return exp(-abs(x1[0]-x2[0]) - abs(x1[1]-x2[1])) ... >>> x = [6, -173.143442352] >>> print("yxcE, yxcD:", kNN.classify(model, x, weight_fn = weight)) yxcE, yxcD: 1 \end{verbatim} By default, all neighbors are given an equal weight. To find out how confident we can be in these predictions, we can call the \verb+calculate+ function, which will calculate the total weight assigned to the classes OP and NOP. For the default weighting scheme, this reduces to the number of neighbors in each category. For {\it yxcE}, {\it yxcD}, we find \begin{verbatim} >>> x = [6, -173.143442352] >>> weight = kNN.calculate(model, x) >>> print("class OP: weight =", weight[0], "class NOP: weight =", weight[1]) class OP: weight = 0.0 class NOP: weight = 3.0 \end{verbatim} which means that all three neighbors of \verb+x1+, \verb+x2+ are in the NOP class. As another example, for {\it yesK}, {\it yesL} we find \begin{verbatim} >>> x = [117, -267.14] >>> weight = kNN.calculate(model, x) >>> print("class OP: weight =", weight[0], "class NOP: weight =", weight[1]) class OP: weight = 2.0 class NOP: weight = 1.0 \end{verbatim} which means that two neighbors are operon pairs and one neighbor is a non-operon pair. To get some idea of the prediction accuracy of the $k$-nearest neighbors approach, we can apply it to the training data: \begin{verbatim} >>> for i in range(len(ys)): print("True:", ys[i], "Predicted:", kNN.classify(model, xs[i])) True: 1 Predicted: 1 True: 1 Predicted: 0 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 \end{verbatim} showing that the prediction is correct for all but two of the gene pairs. A more reliable estimate of the prediction accuracy can be found from a leave-one-out analysis, in which the model is recalculated from the training data after removing the gene to be predicted: \begin{verbatim} >>> for i in range(len(ys)): model = kNN.train(xs[:i]+xs[i+1:], ys[:i]+ys[i+1:]) print("True:", ys[i], "Predicted:", kNN.classify(model, xs[i])) True: 1 Predicted: 1 True: 1 Predicted: 0 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 1 True: 1 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 1 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 0 True: 0 Predicted: 1 \end{verbatim} The leave-one-out analysis shows that $k$-nearest neighbors model is correct for 13 out of 17 gene pairs, which corresponds to a prediction accuracy of 76\%. \section{Na\"ive Bayes} This section will describe the \verb|Bio.NaiveBayes| module. \section{Maximum Entropy} This section will describe the \verb|Bio.MaximumEntropy| module. \section{Markov Models} This section will describe the \verb|Bio.MarkovModel| and/or \verb|Bio.HMM.MarkovModel| modules. \chapter{Graphics including GenomeDiagram} \label{chapter:graphics} The \verb|Bio.Graphics| module depends on the third party Python library \href{http://www.reportlab.org}{ReportLab}. Although focused on producing PDF files, ReportLab can also create encapsulated postscript (EPS) and (SVG) files. In addition to these vector based images, provided certain further dependencies such as the \href{http://www.pythonware.com/products/pil/}{Python Imaging Library (PIL)} are installed, ReportLab can also output bitmap images (including JPEG, PNG, GIF, BMP and PICT formats). \section{GenomeDiagram} \label{sec:genomediagram} \subsection{Introduction} The \verb|Bio.Graphics.GenomeDiagram| module was added to Biopython 1.50, having previously been available as a separate Python module dependent on Biopython. GenomeDiagram is described in the Bioinformatics journal publication by Pritchard et al. (2006) \cite{pritchard2006}, which includes some examples images. There is a PDF copy of the old manual here, \url{http://biopython.org/DIST/docs/GenomeDiagram/userguide.pdf} which has some more examples. %TODO - Leighton's old website is AWOL, put this link back later if possible. %http://bioinf.scri.ac.uk/lp/programs.php#genomediagram As the name might suggest, GenomeDiagram was designed for drawing whole genomes, in particular prokaryotic genomes, either as linear diagrams (optionally broken up into fragments to fit better) or as circular wheel diagrams. Have a look at Figure 2 in Toth \textit{et al.} (2006) \cite{toth2006} for a good example. It proved also well suited to drawing quite detailed figures for smaller genomes such as phage, plasmids or mitochrondia, for example see Figures 1 and 2 in Van der Auwera \textit{et al.} (2009) \cite{vanderauwera2009} (shown with additional manual editing). This module is easiest to use if you have your genome loaded as a \verb|SeqRecord| object containing lots of \verb|SeqFeature| objects - for example as loaded from a GenBank file (see Chapters~\ref{chapter:SeqRecord} and~\ref{chapter:Bio.SeqIO}). \subsection{Diagrams, tracks, feature-sets and features} GenomeDiagram uses a nested set of objects. At the top level, you have a diagram object representing a sequence (or sequence region) along the horizontal axis (or circle). A diagram can contain one or more tracks, shown stacked vertically (or radially on circular diagrams). These will typically all have the same length and represent the same sequence region. You might use one track to show the gene locations, another to show regulatory regions, and a third track to show the GC percentage. %Talk about cross-links here? Maybe better later... The most commonly used type of track will contain features, bundled together in feature-sets. You might choose to use one feature-set for all your CDS features, and another for tRNA features. This isn't required - they can all go in the same feature-set, but it makes it easier to update the properties of just selected features (e.g. make all the tRNA features red). There are two main ways to build up a complete diagram. Firstly, the top down approach where you create a diagram object, and then using its methods add track(s), and use the track methods to add feature-set(s), and use their methods to add the features. Secondly, you can create the individual objects separately (in whatever order suits your code), and then combine them. \subsection{A top down example} \label{sec:gd_top_down} We're going to draw a whole genome from a \verb|SeqRecord| object read in from a GenBank file (see Chapter~\ref{chapter:Bio.SeqIO}). This example uses the pPCP1 plasmid from \textit{Yersinia pestis biovar Microtus}, the file is included with the Biopython unit tests under the GenBank folder, or online \href{http://biopython.org/SRC/biopython/Tests/GenBank/NC_005816.gb} {\texttt{NC\_005816.gb}} from our website. \begin{verbatim} from reportlab.lib import colors from reportlab.lib.units import cm from Bio.Graphics import GenomeDiagram from Bio import SeqIO record = SeqIO.read("NC_005816.gb", "genbank") \end{verbatim} We're using a top down approach, so after loading in our sequence we next create an empty diagram, then add an (empty) track, and to that add an (empty) feature set: \begin{verbatim} gd_diagram = GenomeDiagram.Diagram("Yersinia pestis biovar Microtus plasmid pPCP1") gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features") gd_feature_set = gd_track_for_features.new_set() \end{verbatim} Now the fun part - we take each gene \verb|SeqFeature| object in our \verb|SeqRecord|, and use it to generate a feature on the diagram. We're going to color them blue, alternating between a dark blue and a light blue. \begin{verbatim} for feature in record.features: if feature.type != "gene": #Exclude this feature continue if len(gd_feature_set) % 2 == 0: color = colors.blue else: color = colors.lightblue gd_feature_set.add_feature(feature, color=color, label=True) \end{verbatim} Now we come to actually making the output file. This happens in two steps, first we call the \verb|draw| method, which creates all the shapes using ReportLab objects. Then we call the \verb|write| method which renders these to the requested file format. Note you can output in multiple file formats: \begin{verbatim} gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4', fragments=4, start=0, end=len(record)) gd_diagram.write("plasmid_linear.pdf", "PDF") gd_diagram.write("plasmid_linear.eps", "EPS") gd_diagram.write("plasmid_linear.svg", "SVG") \end{verbatim} Also, provided you have the dependencies installed, you can also do bitmaps, for example: \begin{verbatim} gd_diagram.write("plasmid_linear.png", "PNG") \end{verbatim} \begin{htmlonly} %The blank line below is important to start a new paragraph \imgsrc[width=550, height=400]{images/plasmid_linear.png} \end{htmlonly} \begin{latexonly} The expected output is shown in Figure~\ref{fig:plasmid_linear}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/plasmid_linear.png} \caption{Simple linear diagram for \textit{Yersinia pestis biovar Microtus} plasmid pPCP1.} \label{fig:plasmid_linear} \end{figure} \end{latexonly} Notice that the \verb|fragments| argument which we set to four controls how many pieces the genome gets broken up into. If you want to do a circular figure, then try this: \begin{verbatim} gd_diagram.draw(format="circular", circular=True, pagesize=(20*cm,20*cm), start=0, end=len(record), circle_core=0.7) gd_diagram.write("plasmid_circular.pdf", "PDF") \end{verbatim} \begin{htmlonly} %The blank line below is important to start a new paragraph \imgsrc[width=400, height=400]{images/plasmid_circular.png} \end{htmlonly} \begin{latexonly} The expected output is shown in Figure~\ref{fig:plasmid_circular}. \begin{figure}[htbp] \centering \includegraphics[width=8cm,height=8cm]{images/plasmid_circular.png} \caption{Simple circular diagram for \textit{Yersinia pestis biovar Microtus} plasmid pPCP1.} \label{fig:plasmid_circular} \end{figure} \end{latexonly} These figures are not very exciting, but we've only just got started. \subsection{A bottom up example} Now let's produce exactly the same figures, but using the bottom up approach. This means we create the different objects directly (and this can be done in almost any order) and then combine them. \begin{verbatim} from reportlab.lib import colors from reportlab.lib.units import cm from Bio.Graphics import GenomeDiagram from Bio import SeqIO record = SeqIO.read("NC_005816.gb", "genbank") #Create the feature set and its feature objects, gd_feature_set = GenomeDiagram.FeatureSet() for feature in record.features: if feature.type != "gene": #Exclude this feature continue if len(gd_feature_set) % 2 == 0: color = colors.blue else: color = colors.lightblue gd_feature_set.add_feature(feature, color=color, label=True) #(this for loop is the same as in the previous example) #Create a track, and a diagram gd_track_for_features = GenomeDiagram.Track(name="Annotated Features") gd_diagram = GenomeDiagram.Diagram("Yersinia pestis biovar Microtus plasmid pPCP1") #Now have to glue the bits together... gd_track_for_features.add_set(gd_feature_set) gd_diagram.add_track(gd_track_for_features, 1) \end{verbatim} You can now call the \verb|draw| and \verb|write| methods as before to produce a linear or circular diagram, using the code at the end of the top-down example above. The figures should be identical. \subsection{Features without a SeqFeature} \label{sec:gd_features_without_seqfeatures} In the above example we used a \verb|SeqRecord|'s \verb|SeqFeature| objects to build our diagram (see also Section~\ref{sec:seq_features}). Sometimes you won't have \verb|SeqFeature| objects, but just the coordinates for a feature you want to draw. You have to create minimal \verb|SeqFeature| object, but this is easy: \begin{verbatim} from Bio.SeqFeature import SeqFeature, FeatureLocation my_seq_feature = SeqFeature(FeatureLocation(50,100),strand=+1) \end{verbatim} For strand, use \texttt{+1} for the forward strand, \texttt{-1} for the reverse strand, and \texttt{None} for both. Here is a short self contained example: \begin{verbatim} from Bio.SeqFeature import SeqFeature, FeatureLocation from Bio.Graphics import GenomeDiagram from reportlab.lib.units import cm gdd = GenomeDiagram.Diagram('Test Diagram') gdt_features = gdd.new_track(1, greytrack=False) gds_features = gdt_features.new_set() #Add three features to show the strand options, feature = SeqFeature(FeatureLocation(25, 125), strand=+1) gds_features.add_feature(feature, name="Forward", label=True) feature = SeqFeature(FeatureLocation(150, 250), strand=None) gds_features.add_feature(feature, name="Strandless", label=True) feature = SeqFeature(FeatureLocation(275, 375), strand=-1) gds_features.add_feature(feature, name="Reverse", label=True) gdd.draw(format='linear', pagesize=(15*cm,4*cm), fragments=1, start=0, end=400) gdd.write("GD_labels_default.pdf", "pdf") \end{verbatim} \begin{htmlonly} The top part of the image in the next subsection shows the output \end{htmlonly} \begin{latexonly} The output is shown at the top of Figure~\ref{fig:gd_sigil_labels} \end{latexonly} (in the default feature color, pale green). Notice that we have used the \texttt{name} argument here to specify the caption text for these features. This is discussed in more detail next. \subsection{Feature captions} \label{sec:gd_feature_captions} Recall we used the following (where \texttt{feature} was a \verb|SeqFeature| object) to add a feature to the diagram: \begin{verbatim} gd_feature_set.add_feature(feature, color=color, label=True) \end{verbatim} In the example above the \verb|SeqFeature| annotation was used to pick a sensible caption for the features. By default the following possible entries under the \verb|SeqFeature| object's qualifiers dictionary are used: \texttt{gene}, \texttt{label}, \texttt{name}, \texttt{locus\_tag}, and \texttt{product}. More simply, you can specify a name directly: \begin{verbatim} gd_feature_set.add_feature(feature, color=color, label=True, name="My Gene") \end{verbatim} In addition to the caption text for each feature's label, you can also choose the font, position (this defaults to the start of the sigil, you can also choose the middle or at the end) and orientation (for linear diagrams only, where this defaults to rotated by $45$ degrees): \begin{verbatim} #Large font, parallel with the track gd_feature_set.add_feature(feature, label=True, color="green", label_size=25, label_angle=0) #Very small font, perpendicular to the track (towards it) gd_feature_set.add_feature(feature, label=True, color="purple", label_position="end", label_size=4, label_angle=90) #Small font, perpendicular to the track (away from it) gd_feature_set.add_feature(feature, label=True, color="blue", label_position="middle", label_size=6, label_angle=-90) \end{verbatim} \noindent Combining each of these three fragments with the complete example in the previous section should give something like \begin{htmlonly} this: %The blank lines above and below are important to trigger paragraph breaks \imgsrc[width=600, height=700]{images/GD_sigil_labels.png} \label{fig:gd_sigil_labels} \end{htmlonly} \begin{latexonly} the tracks in Figure~\ref{fig:gd_sigil_labels}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/GD_sigil_labels.png} \caption{Simple GenomeDiagram showing label options. The top plot in pale green shows the default label settings (see Section~\ref{sec:gd_features_without_seqfeatures}) while the rest show variations in the label size, position and orientation (see Section~\ref{sec:gd_feature_captions}). } \label{fig:gd_sigil_labels} \end{figure} \end{latexonly} We've not shown it here, but you can also set \texttt{label\_color} to control the label's color (used in Section~\ref{sec:gd_nice_example}). You'll notice the default font is quite small - this makes sense because you will usually be drawing many (small) features on a page, not just a few large ones as shown here. \subsection{Feature sigils} \label{sec:gd_sigils} The examples above have all just used the default sigil for the feature, a plain box, which was all that was available in the last publicly released standalone version of GenomeDiagram. Arrow sigils were included when GenomeDiagram was added to Biopython 1.50: \begin{verbatim} #Default uses a BOX sigil gd_feature_set.add_feature(feature) #You can make this explicit: gd_feature_set.add_feature(feature, sigil="BOX") #Or opt for an arrow: gd_feature_set.add_feature(feature, sigil="ARROW") \end{verbatim} \noindent Biopython 1.61 added three more sigils, \begin{verbatim} #Box with corners cut off (making it an octagon) gd_feature_set.add_feature(feature, sigil="OCTO") #Box with jagged edges (useful for showing breaks in contains) gd_feature_set.add_feature(feature, sigil="JAGGY") #Arrow which spans the axis with strand used only for direction gd_feature_set.add_feature(feature, sigil="BIGARROW") \end{verbatim} These are shown \begin{htmlonly} below. \end{htmlonly} \begin{latexonly}in Figure~\ref{fig:gd_sigils}. \end{latexonly} Most sigils fit into a bounding box (as given by the default BOX sigil), either above or below the axis for the forward or reverse strand, or straddling it (double the height) for strand-less features. The BIGARROW sigil is different, always straddling the axis with the direction taken from the feature's stand. \begin{htmlonly} \imgsrc[width=425, height=600]{images/GD_sigils.png} \end{htmlonly} \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/GD_sigils.png} \caption{Simple GenomeDiagram showing different sigils (see Section~\ref{sec:gd_sigils})} \label{fig:gd_sigils} \end{figure} \end{latexonly} \subsection{Arrow sigils} \label{sec:gd_arrow_sigils} We introduced the arrow sigils in the previous section. There are two additional options to adjust the shapes of the arrows, firstly the thickness of the arrow shaft, given as a proportion of the height of the bounding box: \begin{verbatim} #Full height shafts, giving pointed boxes: gd_feature_set.add_feature(feature, sigil="ARROW", color="brown", arrowshaft_height=1.0) #Or, thin shafts: gd_feature_set.add_feature(feature, sigil="ARROW", color="teal", arrowshaft_height=0.2) #Or, very thin shafts: gd_feature_set.add_feature(feature, sigil="ARROW", color="darkgreen", arrowshaft_height=0.1) \end{verbatim} \begin{htmlonly} \noindent The results are shown below: \imgsrc[width=600, height=700]{images/GD_sigil_arrow_shafts.png} \end{htmlonly} \begin{latexonly} \noindent The results are shown in Figure~\ref{fig:gd_sigil_arrow_shafts}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/GD_sigil_arrow_shafts.png} \caption{Simple GenomeDiagram showing arrow shaft options (see Section~\ref{sec:gd_arrow_sigils})} \label{fig:gd_sigil_arrow_shafts} \end{figure} \end{latexonly} Secondly, the length of the arrow head - given as a proportion of the height of the bounding box (defaulting to $0.5$, or $50\%$): \begin{verbatim} #Short arrow heads: gd_feature_set.add_feature(feature, sigil="ARROW", color="blue", arrowhead_length=0.25) #Or, longer arrow heads: gd_feature_set.add_feature(feature, sigil="ARROW", color="orange", arrowhead_length=1) #Or, very very long arrow heads (i.e. all head, no shaft, so triangles): gd_feature_set.add_feature(feature, sigil="ARROW", color="red", arrowhead_length=10000) \end{verbatim} \begin{htmlonly} \noindent The results are shown below: \imgsrc[width=600, height=700]{images/GD_sigil_arrow_heads.png} \end{htmlonly} \begin{latexonly} \noindent The results are shown in Figure~\ref{fig:gd_sigil_arrow_heads}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/GD_sigil_arrow_heads.png} \caption{Simple GenomeDiagram showing arrow head options (see Section~\ref{sec:gd_arrow_sigils})} \label{fig:gd_sigil_arrow_heads} \end{figure} \end{latexonly} Biopython 1.61 adds a new \verb|BIGARROW| sigil which always stradles the axis, pointing left for the reverse strand or right otherwise: \begin{verbatim} #A large arrow straddling the axis: gd_feature_set.add_feature(feature, sigil="BIGARROW") \end{verbatim} \noindent All the shaft and arrow head options shown above for the \verb|ARROW| sigil can be used for the \verb|BIGARROW| sigil too. \subsection{A nice example} \label{sec:gd_nice_example} Now let's return to the pPCP1 plasmid from \textit{Yersinia pestis biovar Microtus}, and the top down approach used in Section~\ref{sec:gd_top_down}, but take advantage of the sigil options we've now discussed. This time we'll use arrows for the genes, and overlay them with strand-less features (as plain boxes) showing the position of some restriction digest sites. %NOTE - This *just* fits on one page in the PDF output :) \begin{verbatim} from reportlab.lib import colors from reportlab.lib.units import cm from Bio.Graphics import GenomeDiagram from Bio import SeqIO from Bio.SeqFeature import SeqFeature, FeatureLocation record = SeqIO.read("NC_005816.gb", "genbank") gd_diagram = GenomeDiagram.Diagram(record.id) gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features") gd_feature_set = gd_track_for_features.new_set() for feature in record.features: if feature.type != "gene": #Exclude this feature continue if len(gd_feature_set) % 2 == 0: color = colors.blue else: color = colors.lightblue gd_feature_set.add_feature(feature, sigil="ARROW", color=color, label=True, label_size = 14, label_angle=0) #I want to include some strandless features, so for an example #will use EcoRI recognition sites etc. for site, name, color in [("GAATTC","EcoRI",colors.green), ("CCCGGG","SmaI",colors.orange), ("AAGCTT","HindIII",colors.red), ("GGATCC","BamHI",colors.purple)]: index = 0 while True: index = record.seq.find(site, start=index) if index == -1 : break feature = SeqFeature(FeatureLocation(index, index+len(site))) gd_feature_set.add_feature(feature, color=color, name=name, label=True, label_size = 10, label_color=color) index += len(site) gd_diagram.draw(format="linear", pagesize='A4', fragments=4, start=0, end=len(record)) gd_diagram.write("plasmid_linear_nice.pdf", "PDF") gd_diagram.write("plasmid_linear_nice.eps", "EPS") gd_diagram.write("plasmid_linear_nice.svg", "SVG") gd_diagram.draw(format="circular", circular=True, pagesize=(20*cm,20*cm), start=0, end=len(record), circle_core = 0.5) gd_diagram.write("plasmid_circular_nice.pdf", "PDF") gd_diagram.write("plasmid_circular_nice.eps", "EPS") gd_diagram.write("plasmid_circular_nice.svg", "SVG") \end{verbatim} \begin{htmlonly} \noindent And the output: \imgsrc[width=550, height=400]{images/plasmid_linear_nice.png} \imgsrc[width=591, height=591]{images/plasmid_circular_nice.png} \end{htmlonly} \begin{latexonly} \noindent The expected output is shown in Figures~\ref{fig:plasmid_linear_nice} and~\ref{fig:plasmid_circular_nice}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/plasmid_linear_nice.png} \caption{Linear diagram for \textit{Yersinia pestis biovar Microtus} plasmid pPCP1 showing selected restriction digest sites (see Section~\ref{sec:gd_nice_example}).} \label{fig:plasmid_linear_nice} \end{figure} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/plasmid_circular_nice.png} \caption{Circular diagram for \textit{Yersinia pestis biovar Microtus} plasmid pPCP1 showing selected restriction digest sites (see Section~\ref{sec:gd_nice_example}).} \label{fig:plasmid_circular_nice} \end{figure} \end{latexonly} \subsection{Multiple tracks} \label{sec:gd_multiple_tracks} All the examples so far have used a single track, but you can have more than one track -- for example show the genes on one, and repeat regions on another. In this example we're going to show three phage genomes side by side to scale, inspired by Figure 6 in Proux {\textit et al.} (2002) \cite{proux2002}. We'll need the GenBank files for the following three phage: \begin{itemize} \item \verb|NC_002703| -- Lactococcus phage Tuc2009, complete genome ($38347$ bp) \item \verb|AF323668| -- Bacteriophage bIL285, complete genome ($35538$ bp) \item \verb|NC_003212| -- \textit{Listeria innocua} Clip11262, complete genome, of which we are focussing only on integrated prophage 5 (similar length). \end{itemize} You can download these using Entrez if you like, see Section~\ref{sec:efetch} for more details. For the third record we've worked out where the phage is integrated into the genome, and slice the record to extract it (with the features preserved, see Section~\ref{sec:SeqRecord-slicing}), and must also reverse complement to match the orientation of the first two phage (again preserving the features, see Section~\ref{sec:SeqRecord-reverse-complement}): \begin{verbatim} from Bio import SeqIO A_rec = SeqIO.read("NC_002703.gbk", "gb") B_rec = SeqIO.read("AF323668.gbk", "gb") C_rec = SeqIO.read("NC_003212.gbk", "gb")[2587879:2625807].reverse_complement(name=True) \end{verbatim} The figure we are imitating used different colors for different gene functions. One way to do this is to edit the GenBank file to record color preferences for each feature - something \href{http://www.sanger.ac.uk/resources/software/artemis/} {Sanger's Artemis editor} does, and which GenomeDiagram should understand. Here however, we'll just hard code three lists of colors. Note that the annotation in the GenBank files doesn't exactly match that shown in Proux \textit{et al.}, they have drawn some unannotated genes. \begin{verbatim} from reportlab.lib.colors import red, grey, orange, green, brown, blue, lightblue, purple A_colors = [red]*5 + [grey]*7 + [orange]*2 + [grey]*2 + [orange] + [grey]*11 + [green]*4 \ + [grey] + [green]*2 + [grey, green] + [brown]*5 + [blue]*4 + [lightblue]*5 \ + [grey, lightblue] + [purple]*2 + [grey] B_colors = [red]*6 + [grey]*8 + [orange]*2 + [grey] + [orange] + [grey]*21 + [green]*5 \ + [grey] + [brown]*4 + [blue]*3 + [lightblue]*3 + [grey]*5 + [purple]*2 C_colors = [grey]*30 + [green]*5 + [brown]*4 + [blue]*2 + [grey, blue] + [lightblue]*2 \ + [grey]*5 \end{verbatim} Now to draw them -- this time we add three tracks to the diagram, and also notice they are given different start/end values to reflect their different lengths (this requires Biopython 1.59 or later). \begin{verbatim} from Bio.Graphics import GenomeDiagram name = "Proux Fig 6" gd_diagram = GenomeDiagram.Diagram(name) max_len = 0 for record, gene_colors in zip([A_rec, B_rec, C_rec], [A_colors, B_colors, C_colors]): max_len = max(max_len, len(record)) gd_track_for_features = gd_diagram.new_track(1, name=record.name, greytrack=True, start=0, end=len(record)) gd_feature_set = gd_track_for_features.new_set() i = 0 for feature in record.features: if feature.type != "gene": #Exclude this feature continue gd_feature_set.add_feature(feature, sigil="ARROW", color=gene_colors[i], label=True, name = str(i+1), label_position="start", label_size = 6, label_angle=0) i+=1 gd_diagram.draw(format="linear", pagesize='A4', fragments=1, start=0, end=max_len) gd_diagram.write(name + ".pdf", "PDF") gd_diagram.write(name + ".eps", "EPS") gd_diagram.write(name + ".svg", "SVG") \end{verbatim} \begin{htmlonly} \noindent The result: \imgsrc[width=565, height=400]{images/three_track_simple.png} \end{htmlonly} \begin{latexonly} \noindent The expected output is shown in Figure~\ref{fig:three_track_simple}. \begin{figure}[htbp] \centering \includegraphics[width=\textwidth]{images/three_track_simple.png} \caption{Linear diagram with three tracks for Lactococcus phage Tuc2009 (NC\_002703), bacteriophage bIL285 (AF323668), and prophage 5 from \textit{Listeria innocua} Clip11262 (NC\_003212) (see Section~\ref{sec:gd_multiple_tracks}).} \label{fig:three_track_simple} \end{figure} \end{latexonly} I did wonder why in the original manuscript there were no red or orange genes marked in the bottom phage. Another important point is here the phage are shown with different lengths - this is because they are all drawn to the same scale (they \emph{are} different lengths). The key difference from the published figure is they have color-coded links between similar proteins -- which is what we will do in the next section. \subsection{Cross-Links between tracks} \label{sec:gd_cross_links} Biopython 1.59 added the ability to draw cross links between tracks - both simple linear diagrams as we will show here, but also linear diagrams split into fragments and circular diagrams. Continuing the example from the previous section inspired by Figure 6 from Proux \textit{et al.} 2002 \cite{proux2002}, we would need a list of cross links between pairs of genes, along with a score or color to use. Realistically you might extract this from a BLAST file computationally, but here I have manually typed them in. My naming convention continues to refer to the three phage as A, B and C. Here are the links we want to show between A and B, given as a list of tuples (percentage similarity score, gene in A, gene in B). \begin{verbatim} #Tuc2009 (NC_002703) vs bIL285 (AF323668) A_vs_B = [ (99, "Tuc2009_01", "int"), (33, "Tuc2009_03", "orf4"), (94, "Tuc2009_05", "orf6"), (100,"Tuc2009_06", "orf7"), (97, "Tuc2009_07", "orf8"), (98, "Tuc2009_08", "orf9"), (98, "Tuc2009_09", "orf10"), (100,"Tuc2009_10", "orf12"), (100,"Tuc2009_11", "orf13"), (94, "Tuc2009_12", "orf14"), (87, "Tuc2009_13", "orf15"), (94, "Tuc2009_14", "orf16"), (94, "Tuc2009_15", "orf17"), (88, "Tuc2009_17", "rusA"), (91, "Tuc2009_18", "orf20"), (93, "Tuc2009_19", "orf22"), (71, "Tuc2009_20", "orf23"), (51, "Tuc2009_22", "orf27"), (97, "Tuc2009_23", "orf28"), (88, "Tuc2009_24", "orf29"), (26, "Tuc2009_26", "orf38"), (19, "Tuc2009_46", "orf52"), (77, "Tuc2009_48", "orf54"), (91, "Tuc2009_49", "orf55"), (95, "Tuc2009_52", "orf60"), ] \end{verbatim} Likewise for B and C: \begin{verbatim} #bIL285 (AF323668) vs Listeria innocua prophage 5 (in NC_003212) B_vs_C = [ (42, "orf39", "lin2581"), (31, "orf40", "lin2580"), (49, "orf41", "lin2579"), #terL (54, "orf42", "lin2578"), #portal (55, "orf43", "lin2577"), #protease (33, "orf44", "lin2576"), #mhp (51, "orf46", "lin2575"), (33, "orf47", "lin2574"), (40, "orf48", "lin2573"), (25, "orf49", "lin2572"), (50, "orf50", "lin2571"), (48, "orf51", "lin2570"), (24, "orf52", "lin2568"), (30, "orf53", "lin2567"), (28, "orf54", "lin2566"), ] \end{verbatim} For the first and last phage these identifiers are locus tags, for the middle phage there are no locus tags so I've used gene names instead. The following little helper function lets us lookup a feature using either a locus tag or gene name: \begin{verbatim} def get_feature(features, id, tags=["locus_tag", "gene"]): """Search list of SeqFeature objects for an identifier under the given tags.""" for f in features: for key in tags: #tag may not be present in this feature for x in f.qualifiers.get(key, []): if x == id: return f raise KeyError(id) \end{verbatim} We can now turn those list of identifier pairs into SeqFeature pairs, and thus find their location co-ordinates. We can now add all that code and the following snippet to the previous example (just before the \verb|gd_diagram.draw(...)| line -- see the finished example script \href{http://biopython.org/SRC/biopython/Doc/examples/Proux_et_al_2002_Figure_6.py}{Proux\_et\_al\_2002\_Figure\_6.py} included in the \texttt{Doc/examples} folder of the Biopython source code) to add cross links to the figure: \begin{verbatim} from Bio.Graphics.GenomeDiagram import CrossLink from reportlab.lib import colors #Note it might have been clearer to assign the track numbers explicitly... for rec_X, tn_X, rec_Y, tn_Y, X_vs_Y in [(A_rec, 3, B_rec, 2, A_vs_B), (B_rec, 2, C_rec, 1, B_vs_C)]: track_X = gd_diagram.tracks[tn_X] track_Y = gd_diagram.tracks[tn_Y] for score, id_X, id_Y in X_vs_Y: feature_X = get_feature(rec_X.features, id_X) feature_Y = get_feature(rec_Y.features, id_Y) color = colors.linearlyInterpolatedColor(colors.white, colors.firebrick, 0, 100, score) link_xy = CrossLink((track_X, feature_X.location.start, feature_X.location.end), (track_Y, feature_Y.location.start, feature_Y.location.end), color, colors.lightgrey) gd_diagram.cross_track_links.append(link_xy) \end{verbatim} There are several important pieces to this code. First the \verb|GenomeDiagram| object has a \verb|cross_track_links| attribute which is just a list of \verb|CrossLink| objects. Each \verb|CrossLink| object takes two sets of track-specific co-ordinates (here given as tuples, you can alternatively use a \verb|GenomeDiagram.Feature| object instead). You can optionally supply a colour, border color, and say if this link should be drawn flipped (useful for showing inversions). You can also see how we turn the BLAST percentage identity score into a colour, interpolating between white ($0\%$) and a dark red ($100\%$). In this example we don't have any problems with overlapping cross-links. One way to tackle that is to use transparency in ReportLab, by using colors with their alpha channel set. However, this kind of shaded color scheme combined with overlap transparency would be difficult to interpret. %Again, HTML and PDF versions for the figure \begin{htmlonly} \noindent The result: \imgsrc[width=565, height=400]{images/three_track_cl.png} \end{htmlonly} \begin{latexonly} \noindent The expected output is shown in Figure~\ref{fig:three_track_cl}. \begin{figure}[htbp] \centering \includegraphics[width=\textwidth]{images/three_track_cl.png} \caption{Linear diagram with three tracks for Lactococcus phage Tuc2009 (NC\_002703), bacteriophage bIL285 (AF323668), and prophage 5 from \textit{Listeria innocua} Clip11262 (NC\_003212) plus basic cross-links shaded by percentage identity (see Section~\ref{sec:gd_cross_links}).} \label{fig:three_track_cl} \end{figure} \end{latexonly} There is still a lot more that can be done within Biopython to help improve this figure. First of all, the cross links in this case are between proteins which are drawn in a strand specific manor. It can help to add a background region (a feature using the `BOX' sigil) on the feature track to extend the cross link. Also, we could reduce the vertical height of the feature tracks to allocate more to the links instead -- one way to do that is to allocate space for empty tracks. Furthermore, in cases like this where there are no large gene overlaps, we can use the axis-straddling \verb|BIGARROW| sigil, which allows us to further reduce the vertical space needed for the track. These improvements are demonstrated in the example script \href{http://biopython.org/SRC/biopython/Doc/examples/Proux_et_al_2002_Figure_6.py}{Proux\_et\_al\_2002\_Figure\_6.py} included in the \texttt{Doc/examples} folder of the Biopython source code. %TODO - Add a link get the file directly (for Windows users etc). \begin{htmlonly} \noindent The result: \imgsrc[width=565, height=400]{images/three_track_cl2a.png} \end{htmlonly} \begin{latexonly} \noindent The expected output is shown in Figure~\ref{fig:three_track_cl2}. \begin{figure}[htbp] \centering \includegraphics[width=\textwidth]{images/three_track_cl2a.png} \caption{Linear diagram with three tracks for Lactococcus phage Tuc2009 (NC\_002703), bacteriophage bIL285 (AF323668), and prophage 5 from \textit{Listeria innocua} Clip11262 (NC\_003212) plus cross-links shaded by percentage identity (see Section~\ref{sec:gd_cross_links}).} \label{fig:three_track_cl2} \end{figure} \end{latexonly} Beyond that, finishing touches you might want to do manually in a vector image editor include fine tuning the placement of gene labels, and adding other custom annotation such as highlighting particular regions. Although not really necessary in this example since none of the cross-links overlap, using a transparent color in ReportLab is a very useful technique for superimposing multiple links. However, in this case a shaded color scheme should be avoided. \subsection{Further options} You can control the tick marks to show the scale -- after all every graph should show its units, and the number of the grey-track labels. Also, we have only used the \verb|FeatureSet| so far. GenomeDiagram also has a \verb|GraphSet| which can be used for show line graphs, bar charts and heat plots (e.g. to show plots of GC\% on a track parallel to the features). These options are not covered here yet, so for now we refer you to the \href{http://biopython.org/DIST/docs/GenomeDiagram/userguide.pdf} %\href{http://bioinf.scri.ac.uk/lp/downloads/programs/genomediagram/userguide.pdf} {User Guide (PDF)} included with the standalone version of GenomeDiagram (but please read the next section first), and the docstrings. \subsection{Converting old code} If you have old code written using the standalone version of GenomeDiagram, and you want to switch it over to using the new version included with Biopython then you will have to make a few changes - most importantly to your import statements. Also, the older version of GenomeDiagram used only the UK spellings of color and center (colour and centre). You will need to change to the American spellings, although for several years the Biopython version of GenomeDiagram supported both. For example, if you used to have: \begin{verbatim} from GenomeDiagram import GDFeatureSet, GDDiagram gdd = GDDiagram("An example") ... \end{verbatim} you could just switch the import statements like this: \begin{verbatim} from Bio.Graphics.GenomeDiagram import FeatureSet as GDFeatureSet, Diagram as GDDiagram gdd = GDDiagram("An example") ... \end{verbatim} and hopefully that should be enough. In the long term you might want to switch to the new names, but you would have to change more of your code: \begin{verbatim} from Bio.Graphics.GenomeDiagram import FeatureSet, Diagram gdd = Diagram("An example") ... \end{verbatim} or: \begin{verbatim} from Bio.Graphics import GenomeDiagram gdd = GenomeDiagram.Diagram("An example") ... \end{verbatim} If you run into difficulties, please ask on the Biopython mailing list for advice. One catch is that we have not included the old module \verb|GenomeDiagram.GDUtilities| yet. This included a number of GC\% related functions, which will probably be merged under \verb|Bio.SeqUtils| later on. %TODO - Deal with GenomeDiagram.GDUtilities \section{Chromosomes} The \verb|Bio.Graphics.BasicChromosome| module allows drawing of chromosomes. There is an example in Jupe \textit{et al.} (2012) \cite{jupe2012} (open access) using colors to highlight different gene families. \subsection{Simple Chromosomes} Here is a very simple example - for which we'll use \textit{Arabidopsis thaliana}. \begin{latexonly} \begin{figure}[p] \centering \includegraphics[scale=0.45]{images/simple_chrom.pdf} \caption{Simple chromosome diagram for \textit{Arabidopsis thaliana}.} \label{fig:simplechromosome} \end{figure} \begin{figure}[p] \centering \includegraphics[scale=0.45]{images/tRNA_chrom.pdf} \caption{Chromosome diagram for \textit{Arabidopsis thaliana} showing tRNA genes.} \label{fig:trnachromosome} \end{figure} \end{latexonly} You can skip this bit, but first I downloaded the five sequenced chromosomes from the NCBI's FTP site \url{ftp://ftp.ncbi.nlm.nih.gov/genomes/Arabidopsis_thaliana} and then parsed them with \verb|Bio.SeqIO| to find out their lengths. You could use the GenBank files for this, but it is faster to use the FASTA files for the whole chromosomes: \begin{verbatim} from Bio import SeqIO entries = [("Chr I", "CHR_I/NC_003070.fna"), ("Chr II", "CHR_II/NC_003071.fna"), ("Chr III", "CHR_III/NC_003074.fna"), ("Chr IV", "CHR_IV/NC_003075.fna"), ("Chr V", "CHR_V/NC_003076.fna")] for (name, filename) in entries: record = SeqIO.read(filename,"fasta") print(name, len(record)) \end{verbatim} \noindent This gave the lengths of the five chromosomes, which we'll now use in the following short demonstration of the \verb|BasicChromosome| module: \begin{verbatim} from reportlab.lib.units import cm from Bio.Graphics import BasicChromosome entries = [("Chr I", 30432563), ("Chr II", 19705359), ("Chr III", 23470805), ("Chr IV", 18585042), ("Chr V", 26992728)] max_len = 30432563 #Could compute this telomere_length = 1000000 #For illustration chr_diagram = BasicChromosome.Organism() chr_diagram.page_size = (29.7*cm, 21*cm) #A4 landscape for name, length in entries: cur_chromosome = BasicChromosome.Chromosome(name) #Set the scale to the MAXIMUM length plus the two telomeres in bp, #want the same scale used on all five chromosomes so they can be #compared to each other cur_chromosome.scale_num = max_len + 2 * telomere_length #Add an opening telomere start = BasicChromosome.TelomereSegment() start.scale = telomere_length cur_chromosome.add(start) #Add a body - using bp as the scale length here. body = BasicChromosome.ChromosomeSegment() body.scale = length cur_chromosome.add(body) #Add a closing telomere end = BasicChromosome.TelomereSegment(inverted=True) end.scale = telomere_length cur_chromosome.add(end) #This chromosome is done chr_diagram.add(cur_chromosome) chr_diagram.draw("simple_chrom.pdf", "Arabidopsis thaliana") \end{verbatim} This should create a very simple PDF file, shown \begin{htmlonly} here: %The blank lines above and below are important to trigger paragraph breaks \imgsrc[width=650, height=460]{images/simple_chrom.png} \end{htmlonly} \begin{latexonly} in Figure~\ref{fig:simplechromosome}. \end{latexonly} This example is deliberately short and sweet. The next example shows the location of features of interest. \subsection{Annotated Chromosomes} Continuing from the previous example, let's also show the tRNA genes. We'll get their locations by parsing the GenBank files for the five \textit{Arabidopsis thaliana} chromosomes. You'll need to download these files from the NCBI FTP site \url{ftp://ftp.ncbi.nlm.nih.gov/genomes/Arabidopsis_thaliana}, and preserve the subdirectory names or edit the paths below: \begin{verbatim} from reportlab.lib.units import cm from Bio import SeqIO from Bio.Graphics import BasicChromosome entries = [("Chr I", "CHR_I/NC_003070.gbk"), ("Chr II", "CHR_II/NC_003071.gbk"), ("Chr III", "CHR_III/NC_003074.gbk"), ("Chr IV", "CHR_IV/NC_003075.gbk"), ("Chr V", "CHR_V/NC_003076.gbk")] max_len = 30432563 #Could compute this telomere_length = 1000000 #For illustration chr_diagram = BasicChromosome.Organism() chr_diagram.page_size = (29.7*cm, 21*cm) #A4 landscape for index, (name, filename) in enumerate(entries): record = SeqIO.read(filename,"genbank") length = len(record) features = [f for f in record.features if f.type=="tRNA"] #Record an Artemis style integer color in the feature's qualifiers, #1 = Black, 2 = Red, 3 = Green, 4 = blue, 5 =cyan, 6 = purple for f in features: f.qualifiers["color"] = [index+2] cur_chromosome = BasicChromosome.Chromosome(name) #Set the scale to the MAXIMUM length plus the two telomeres in bp, #want the same scale used on all five chromosomes so they can be #compared to each other cur_chromosome.scale_num = max_len + 2 * telomere_length #Add an opening telomere start = BasicChromosome.TelomereSegment() start.scale = telomere_length cur_chromosome.add(start) #Add a body - again using bp as the scale length here. body = BasicChromosome.AnnotatedChromosomeSegment(length, features) body.scale = length cur_chromosome.add(body) #Add a closing telomere end = BasicChromosome.TelomereSegment(inverted=True) end.scale = telomere_length cur_chromosome.add(end) #This chromosome is done chr_diagram.add(cur_chromosome) chr_diagram.draw("tRNA_chrom.pdf", "Arabidopsis thaliana") \end{verbatim} It might warn you about the labels being too close together - have a look at the forward strand (right hand side) of Chr I, but it should create a colorful PDF file, shown \begin{htmlonly} here: %The blank lines above and below are important to trigger paragraph breaks \imgsrc[width=650, height=460]{images/tRNA_chrom.png} \end{htmlonly} \begin{latexonly} in Figure~\ref{fig:simplechromosome}. \end{latexonly} \chapter{Cookbook -- Cool things to do with it} \label{chapter:cookbook} Biopython now has two collections of ``cookbook'' examples -- this chapter (which has been included in this tutorial for many years and has gradually grown), and \url{http://biopython.org/wiki/Category:Cookbook} which is a user contributed collection on our wiki. We're trying to encourage Biopython users to contribute their own examples to the wiki. In addition to helping the community, one direct benefit of sharing an example like this is that you could also get some feedback on the code from other Biopython users and developers - which could help you improve all your Python code. In the long term, we may end up moving all of the examples in this chapter to the wiki, or elsewhere within the tutorial. \section{Working with sequence files} \label{seq:cookbook-sequences} This section shows some more examples of sequence input/output, using the \verb|Bio.SeqIO| module described in Chapter~\ref{chapter:Bio.SeqIO}. \subsection{Filtering a sequence file} Often you'll have a large file with many sequences in it (e.g. FASTA file or genes, or a FASTQ or SFF file of reads), a separate shorter list of the IDs for a subset of sequences of interest, and want to make a new sequence file for this subset. Let's say the list of IDs is in a simple text file, as the first word on each line. This could be a tabular file where the first column is the ID. Try something like this: %not a doctest to avoid temp files being left behind, also no >>> %makes it easier to copy and paste the example to a script file. \begin{verbatim} from Bio import SeqIO input_file = "big_file.sff" id_file = "short_list.txt" output_file = "short_list.sff" wanted = set(line.rstrip("\n").split(None,1)[0] for line in open(id_file)) print("Found %i unique identifiers in %s" % (len(wanted), id_file)) records = (r for r in SeqIO.parse(input_file, "sff") if r.id in wanted) count = SeqIO.write(records, output_file, "sff") print("Saved %i records from %s to %s" % (count, input_file, output_file)) if count < len(wanted): print("Warning %i IDs not found in %s" % (len(wanted)-count, input_file)) \end{verbatim} Note that we use a Python \verb|set| rather than a \verb|list|, this makes testing membership faster. \subsection{Producing randomised genomes} Let's suppose you are looking at genome sequence, hunting for some sequence feature -- maybe extreme local GC\% bias, or possible restriction digest sites. Once you've got your Python code working on the real genome it may be sensible to try running the same search on randomised versions of the same genome for statistical analysis (after all, any ``features'' you've found could just be there just by chance). For this discussion, we'll use the GenBank file for the pPCP1 plasmid from \textit{Yersinia pestis biovar Microtus}. The file is included with the Biopython unit tests under the GenBank folder, or you can get it from our website, \href{http://biopython.org/SRC/biopython/Tests/GenBank/NC_005816.gb} {\texttt{NC\_005816.gb}}. This file contains one and only one record, so we can read it in as a \verb|SeqRecord| using the \verb|Bio.SeqIO.read()| function: %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> original_rec = SeqIO.read("NC_005816.gb", "genbank") \end{verbatim} So, how can we generate a shuffled versions of the original sequence? I would use the built in Python \verb|random| module for this, in particular the function \verb|random.shuffle| -- but this works on a Python list. Our sequence is a \verb|Seq| object, so in order to shuffle it we need to turn it into a list: %cont-doctest \begin{verbatim} >>> import random >>> nuc_list = list(original_rec.seq) >>> random.shuffle(nuc_list) #acts in situ! \end{verbatim} Now, in order to use \verb|Bio.SeqIO| to output the shuffled sequence, we need to construct a new \verb|SeqRecord| with a new \verb|Seq| object using this shuffled list. In order to do this, we need to turn the list of nucleotides (single letter strings) into a long string -- the standard Python way to do this is with the string object's join method. %cont-doctest \begin{verbatim} >>> from Bio.Seq import Seq >>> from Bio.SeqRecord import SeqRecord >>> shuffled_rec = SeqRecord(Seq("".join(nuc_list), original_rec.seq.alphabet), ... id="Shuffled", description="Based on %s" % original_rec.id) \end{verbatim} Let's put all these pieces together to make a complete Python script which generates a single FASTA file containing 30 randomly shuffled versions of the original sequence. This first version just uses a big for loop and writes out the records one by one (using the \verb|SeqRecord|'s format method described in Section~\ref{sec:Bio.SeqIO-and-StringIO}): \begin{verbatim} import random from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio import SeqIO original_rec = SeqIO.read("NC_005816.gb","genbank") handle = open("shuffled.fasta", "w") for i in range(30): nuc_list = list(original_rec.seq) random.shuffle(nuc_list) shuffled_rec = SeqRecord(Seq("".join(nuc_list), original_rec.seq.alphabet), \ id="Shuffled%i" % (i+1), \ description="Based on %s" % original_rec.id) handle.write(shuffled_rec.format("fasta")) handle.close() \end{verbatim} Personally I prefer the following version using a function to shuffle the record and a generator expression instead of the for loop: \begin{verbatim} import random from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio import SeqIO def make_shuffle_record(record, new_id): nuc_list = list(record.seq) random.shuffle(nuc_list) return SeqRecord(Seq("".join(nuc_list), record.seq.alphabet), \ id=new_id, description="Based on %s" % original_rec.id) original_rec = SeqIO.read("NC_005816.gb","genbank") shuffled_recs = (make_shuffle_record(original_rec, "Shuffled%i" % (i+1)) \ for i in range(30)) handle = open("shuffled.fasta", "w") SeqIO.write(shuffled_recs, handle, "fasta") handle.close() \end{verbatim} \subsection{Translating a FASTA file of CDS entries} \label{sec:SeqIO-translate} Suppose you've got an input file of CDS entries for some organism, and you want to generate a new FASTA file containing their protein sequences. i.e. Take each nucleotide sequence from the original file, and translate it. Back in Section~\ref{sec:translation} we saw how to use the \verb|Seq| object's \verb|translate method|, and the optional \verb|cds| argument which enables correct translation of alternative start codons. We can combine this with \verb|Bio.SeqIO| as shown in the reverse complement example in Section~\ref{sec:SeqIO-reverse-complement}. The key point is that for each nucleotide \verb|SeqRecord|, we need to create a protein \verb|SeqRecord| - and take care of naming it. You can write you own function to do this, choosing suitable protein identifiers for your sequences, and the appropriate genetic code. In this example we just use the default table and add a prefix to the identifier: \begin{verbatim} from Bio.SeqRecord import SeqRecord def make_protein_record(nuc_record): """Returns a new SeqRecord with the translated sequence (default table).""" return SeqRecord(seq = nuc_record.seq.translate(cds=True), \ id = "trans_" + nuc_record.id, \ description = "translation of CDS, using default table") \end{verbatim} We can then use this function to turn the input nucleotide records into protein records ready for output. An elegant way and memory efficient way to do this is with a generator expression: \begin{verbatim} from Bio import SeqIO proteins = (make_protein_record(nuc_rec) for nuc_rec in \ SeqIO.parse("coding_sequences.fasta", "fasta")) SeqIO.write(proteins, "translations.fasta", "fasta") \end{verbatim} This should work on any FASTA file of complete coding sequences. If you are working on partial coding sequences, you may prefer to use \verb|nuc_record.seq.translate(to_stop=True)| in the example above, as this wouldn't check for a valid start codon etc. \subsection{Making the sequences in a FASTA file upper case} Often you'll get data from collaborators as FASTA files, and sometimes the sequences can be in a mixture of upper and lower case. In some cases this is deliberate (e.g. lower case for poor quality regions), but usually it is not important. You may want to edit the file to make everything consistent (e.g. all upper case), and you can do this easily using the \verb|upper()| method of the \verb|SeqRecord| object (added in Biopython 1.55): \begin{verbatim} from Bio import SeqIO records = (rec.upper() for rec in SeqIO.parse("mixed.fas", "fasta")) count = SeqIO.write(records, "upper.fas", "fasta") print("Converted %i records to upper case" % count) \end{verbatim} How does this work? The first line is just importing the \verb|Bio.SeqIO| module. The second line is the interesting bit -- this is a Python generator expression which gives an upper case version of each record parsed from the input file (\texttt{mixed.fas}). In the third line we give this generator expression to the \verb|Bio.SeqIO.write()| function and it saves the new upper cases records to our output file (\texttt{upper.fas}). The reason we use a generator expression (rather than a list or list comprehension) is this means only one record is kept in memory at a time. This can be really important if you are dealing with large files with millions of entries. \subsection{Sorting a sequence file} \label{sec:SeqIO-sort} Suppose you wanted to sort a sequence file by length (e.g. a set of contigs from an assembly), and you are working with a file format like FASTA or FASTQ which \verb|Bio.SeqIO| can read, write (and index). If the file is small enough, you can load it all into memory at once as a list of \verb|SeqRecord| objects, sort the list, and save it: \begin{verbatim} from Bio import SeqIO records = list(SeqIO.parse("ls_orchid.fasta","fasta")) records.sort(cmp=lambda x,y: cmp(len(x),len(y))) SeqIO.write(records, "sorted_orchids.fasta", "fasta") \end{verbatim} The only clever bit is specifying a comparison function for how to sort the records (here we sort them by length). If you wanted the longest records first, you could flip the comparison or use the reverse argument: \begin{verbatim} from Bio import SeqIO records = list(SeqIO.parse("ls_orchid.fasta","fasta")) records.sort(cmp=lambda x,y: cmp(len(y),len(x))) SeqIO.write(records, "sorted_orchids.fasta", "fasta") \end{verbatim} Now that's pretty straight forward - but what happens if you have a very large file and you can't load it all into memory like this? For example, you might have some next-generation sequencing reads to sort by length. This can be solved using the \verb|Bio.SeqIO.index()| function. \begin{verbatim} from Bio import SeqIO #Get the lengths and ids, and sort on length len_and_ids = sorted((len(rec), rec.id) for rec in \ SeqIO.parse("ls_orchid.fasta","fasta")) ids = reversed([id for (length, id) in len_and_ids]) del len_and_ids #free this memory record_index = SeqIO.index("ls_orchid.fasta", "fasta") records = (record_index[id] for id in ids) SeqIO.write(records, "sorted.fasta", "fasta") \end{verbatim} First we scan through the file once using \verb|Bio.SeqIO.parse()|, recording the record identifiers and their lengths in a list of tuples. We then sort this list to get them in length order, and discard the lengths. Using this sorted list of identifiers \verb|Bio.SeqIO.index()| allows us to retrieve the records one by one, and we pass them to \verb|Bio.SeqIO.write()| for output. These examples all use \verb|Bio.SeqIO| to parse the records into \verb|SeqRecord| objects which are output using \verb|Bio.SeqIO.write()|. What if you want to sort a file format which \verb|Bio.SeqIO.write()| doesn't support, like the plain text SwissProt format? Here is an alternative solution using the \verb|get_raw()| method added to \verb|Bio.SeqIO.index()| in Biopython 1.54 (see Section~\ref{sec:seqio-index-getraw}). \begin{verbatim} from Bio import SeqIO #Get the lengths and ids, and sort on length len_and_ids = sorted((len(rec), rec.id) for rec in \ SeqIO.parse("ls_orchid.fasta","fasta")) ids = reversed([id for (length, id) in len_and_ids]) del len_and_ids #free this memory record_index = SeqIO.index("ls_orchid.fasta", "fasta") handle = open("sorted.fasta", "w") for id in ids: handle.write(record_index.get_raw(id)) handle.close() \end{verbatim} As a bonus, because it doesn't parse the data into \verb|SeqRecord| objects a second time it should be faster. \subsection{Simple quality filtering for FASTQ files} \label{sec:FASTQ-filtering-example} The FASTQ file format was introduced at Sanger and is now widely used for holding nucleotide sequencing reads together with their quality scores. FASTQ files (and the related QUAL files) are an excellent example of per-letter-annotation, because for each nucleotide in the sequence there is an associated quality score. Any per-letter-annotation is held in a \verb|SeqRecord| in the \verb|letter_annotations| dictionary as a list, tuple or string (with the same number of elements as the sequence length). One common task is taking a large set of sequencing reads and filtering them (or cropping them) based on their quality scores. The following example is very simplistic, but should illustrate the basics of working with quality data in a \verb|SeqRecord| object. All we are going to do here is read in a file of FASTQ data, and filter it to pick out only those records whose PHRED quality scores are all above some threshold (here 20). For this example we'll use some real data downloaded from the ENA sequence read archive, \url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz} (2MB) which unzips to a 19MB file \texttt{SRR020192.fastq}. This is some Roche 454 GS FLX single end data from virus infected California sea lions (see \url{http://www.ebi.ac.uk/ena/data/view/SRS004476} for details). First, let's count the reads: \begin{verbatim} from Bio import SeqIO count = 0 for rec in SeqIO.parse("SRR020192.fastq", "fastq"): count += 1 print("%i reads" % count) \end{verbatim} \noindent Now let's do a simple filtering for a minimum PHRED quality of 20: \begin{verbatim} from Bio import SeqIO good_reads = (rec for rec in \ SeqIO.parse("SRR020192.fastq", "fastq") \ if min(rec.letter_annotations["phred_quality"]) >= 20) count = SeqIO.write(good_reads, "good_quality.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} \noindent This pulled out only $14580$ reads out of the $41892$ present. A more sensible thing to do would be to quality trim the reads, but this is intended as an example only. FASTQ files can contain millions of entries, so it is best to avoid loading them all into memory at once. This example uses a generator expression, which means only one \verb|SeqRecord| is created at a time - avoiding any memory limitations. \subsection{Trimming off primer sequences} \label{sec:FASTQ-slicing-off-primer} For this example we're going to pretend that \texttt{GATGACGGTGT} is a 5' primer sequence we want to look for in some FASTQ formatted read data. As in the example above, we'll use the \texttt{SRR020192.fastq} file downloaded from the ENA (\url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz}). The same approach would work with any other supported file format (e.g. FASTA files). This code uses \verb|Bio.SeqIO| with a generator expression (to avoid loading all the sequences into memory at once), and the \verb|Seq| object's \verb|startswith| method to see if the read starts with the primer sequence: \begin{verbatim} from Bio import SeqIO primer_reads = (rec for rec in \ SeqIO.parse("SRR020192.fastq", "fastq") \ if rec.seq.startswith("GATGACGGTGT")) count = SeqIO.write(primer_reads, "with_primer.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} \noindent That should find $13819$ reads from \texttt{SRR014849.fastq} and save them to a new FASTQ file, \texttt{with\_primer.fastq}. Now suppose that instead you wanted to make a FASTQ file containing these reads but with the primer sequence removed? That's just a small change as we can slice the \verb|SeqRecord| (see Section~\ref{sec:SeqRecord-slicing}) to remove the first eleven letters (the length of our primer): \begin{verbatim} from Bio import SeqIO trimmed_primer_reads = (rec[11:] for rec in \ SeqIO.parse("SRR020192.fastq", "fastq") \ if rec.seq.startswith("GATGACGGTGT")) count = SeqIO.write(trimmed_primer_reads, "with_primer_trimmed.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} \noindent Again, that should pull out the $13819$ reads from \texttt{SRR020192.fastq}, but this time strip off the first ten characters, and save them to another new FASTQ file, \texttt{with\_primer\_trimmed.fastq}. Finally, suppose you want to create a new FASTQ file where these reads have their primer removed, but all the other reads are kept as they were? If we want to still use a generator expression, it is probably clearest to define our own trim function: \begin{verbatim} from Bio import SeqIO def trim_primer(record, primer): if record.seq.startswith(primer): return record[len(primer):] else: return record trimmed_reads = (trim_primer(record, "GATGACGGTGT") for record in \ SeqIO.parse("SRR020192.fastq", "fastq")) count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} This takes longer, as this time the output file contains all $41892$ reads. Again, we're used a generator expression to avoid any memory problems. You could alternatively use a generator function rather than a generator expression. \begin{verbatim} from Bio import SeqIO def trim_primers(records, primer): """Removes perfect primer sequences at start of reads. This is a generator function, the records argument should be a list or iterator returning SeqRecord objects. """ len_primer = len(primer) #cache this for later for record in records: if record.seq.startswith(primer): yield record[len_primer:] else: yield record original_reads = SeqIO.parse("SRR020192.fastq", "fastq") trimmed_reads = trim_primers(original_reads, "GATGACGGTGT") count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} This form is more flexible if you want to do something more complicated where only some of the records are retained -- as shown in the next example. \subsection{Trimming off adaptor sequences} \label{sec:FASTQ-slicing-off-adaptor} This is essentially a simple extension to the previous example. We are going to going to pretend \texttt{GATGACGGTGT} is an adaptor sequence in some FASTQ formatted read data, again the \texttt{SRR020192.fastq} file from the NCBI (\url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz}). This time however, we will look for the sequence \emph{anywhere} in the reads, not just at the very beginning: \begin{verbatim} from Bio import SeqIO def trim_adaptors(records, adaptor): """Trims perfect adaptor sequences. This is a generator function, the records argument should be a list or iterator returning SeqRecord objects. """ len_adaptor = len(adaptor) #cache this for later for record in records: index = record.seq.find(adaptor) if index == -1: #adaptor not found, so won't trim yield record else: #trim off the adaptor yield record[index+len_adaptor:] original_reads = SeqIO.parse("SRR020192.fastq", "fastq") trimmed_reads = trim_adaptors(original_reads, "GATGACGGTGT") count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} Because we are using a FASTQ input file in this example, the \verb|SeqRecord| objects have per-letter-annotation for the quality scores. By slicing the \verb|SeqRecord| object the appropriate scores are used on the trimmed records, so we can output them as a FASTQ file too. Compared to the output of the previous example where we only looked for a primer/adaptor at the start of each read, you may find some of the trimmed reads are quite short after trimming (e.g. if the adaptor was found in the middle rather than near the start). So, let's add a minimum length requirement as well: \begin{verbatim} from Bio import SeqIO def trim_adaptors(records, adaptor, min_len): """Trims perfect adaptor sequences, checks read length. This is a generator function, the records argument should be a list or iterator returning SeqRecord objects. """ len_adaptor = len(adaptor) #cache this for later for record in records: len_record = len(record) #cache this for later if len(record) < min_len: #Too short to keep continue index = record.seq.find(adaptor) if index == -1: #adaptor not found, so won't trim yield record elif len_record - index - len_adaptor >= min_len: #after trimming this will still be long enough yield record[index+len_adaptor:] original_reads = SeqIO.parse("SRR020192.fastq", "fastq") trimmed_reads = trim_adaptors(original_reads, "GATGACGGTGT", 100) count = SeqIO.write(trimmed_reads, "trimmed.fastq", "fastq") print("Saved %i reads" % count) \end{verbatim} By changing the format names, you could apply this to FASTA files instead. This code also could be extended to do a fuzzy match instead of an exact match (maybe using a pairwise alignment, or taking into account the read quality scores), but that will be much slower. \subsection{Converting FASTQ files} \label{sec:SeqIO-fastq-conversion} Back in Section~\ref{sec:SeqIO-conversion} we showed how to use \verb|Bio.SeqIO| to convert between two file formats. Here we'll go into a little more detail regarding FASTQ files which are used in second generation DNA sequencing. Please refer to Cock \textit{et al.} (2009) \cite{cock2010} for a longer description. FASTQ files store both the DNA sequence (as a string) and the associated read qualities. PHRED scores (used in most FASTQ files, and also in QUAL files, ACE files and SFF files) have become a \textit{de facto} standard for representing the probability of a sequencing error (here denoted by $P_e$) at a given base using a simple base ten log transformation: \begin{equation} Q_{\textrm{PHRED}} = - 10 \times \textrm{log}_{10} ( P_e ) \end{equation} This means a wrong read ($P_e = 1$) gets a PHRED quality of $0$, while a very good read like $P_e = 0.00001$ gets a PHRED quality of $50$. While for raw sequencing data qualities higher than this are rare, with post processing such as read mapping or assembly, qualities of up to about $90$ are possible (indeed, the MAQ tool allows for PHRED scores in the range 0 to 93 inclusive). The FASTQ format has the potential to become a \textit{de facto} standard for storing the letters and quality scores for a sequencing read in a single plain text file. The only fly in the ointment is that there are at least three versions of the FASTQ format which are incompatible and difficult to distinguish... \begin{enumerate} \item The original Sanger FASTQ format uses PHRED qualities encoded with an ASCII offset of 33. The NCBI are using this format in their Short Read Archive. We call this the \texttt{fastq} (or \texttt{fastq-sanger}) format in \verb|Bio.SeqIO|. \item Solexa (later bought by Illumina) introduced their own version using Solexa qualities encoded with an ASCII offset of 64. We call this the \texttt{fastq-solexa} format. \item Illumina pipeline 1.3 onwards produces FASTQ files with PHRED qualities (which is more consistent), but encoded with an ASCII offset of 64. We call this the \texttt{fastq-illumina} format. \end{enumerate} The Solexa quality scores are defined using a different log transformation: \begin{equation} Q_{\textrm{Solexa}} = - 10 \times \textrm{log}_{10} \left( \frac{P_e}{1-P_e} \right) \end{equation} Given Solexa/Illumina have now moved to using PHRED scores in version 1.3 of their pipeline, the Solexa quality scores will gradually fall out of use. If you equate the error estimates ($P_e$) these two equations allow conversion between the two scoring systems - and Biopython includes functions to do this in the \verb|Bio.SeqIO.QualityIO| module, which are called if you use \verb|Bio.SeqIO| to convert an old Solexa/Illumina file into a standard Sanger FASTQ file: \begin{verbatim} from Bio import SeqIO SeqIO.convert("solexa.fastq", "fastq-solexa", "standard.fastq", "fastq") \end{verbatim} If you want to convert a new Illumina 1.3+ FASTQ file, all that gets changed is the ASCII offset because although encoded differently the scores are all PHRED qualities: \begin{verbatim} from Bio import SeqIO SeqIO.convert("illumina.fastq", "fastq-illumina", "standard.fastq", "fastq") \end{verbatim} Note that using \verb|Bio.SeqIO.convert()| like this is \emph{much} faster than combining \verb|Bio.SeqIO.parse()| and \verb|Bio.SeqIO.write()| because optimised code is used for converting between FASTQ variants (and also for FASTQ to FASTA conversion). For good quality reads, PHRED and Solexa scores are approximately equal, which means since both the \texttt{fasta-solexa} and \texttt{fastq-illumina} formats use an ASCII offset of 64 the files are almost the same. This was a deliberate design choice by Illumina, meaning applications expecting the old \texttt{fasta-solexa} style files will probably be OK using the newer \texttt{fastq-illumina} files (on good data). Of course, both variants are very different from the original FASTQ standard as used by Sanger, the NCBI, and elsewhere (format name \texttt{fastq} or \texttt{fastq-sanger}). For more details, see the built in help (also \href{http://www.biopython.org/DIST/docs/api/Bio.SeqIO.QualityIO-module.html}{online}): \begin{verbatim} >>> from Bio.SeqIO import QualityIO >>> help(QualityIO) ... \end{verbatim} \subsection{Converting FASTA and QUAL files into FASTQ files} \label{sec:SeqIO-fasta-qual-conversion} FASTQ files hold \emph{both} sequences and their quality strings. FASTA files hold \emph{just} sequences, while QUAL files hold \emph{just} the qualities. Therefore a single FASTQ file can be converted to or from \emph{paired} FASTA and QUAL files. Going from FASTQ to FASTA is easy: \begin{verbatim} from Bio import SeqIO SeqIO.convert("example.fastq", "fastq", "example.fasta", "fasta") \end{verbatim} Going from FASTQ to QUAL is also easy: \begin{verbatim} from Bio import SeqIO SeqIO.convert("example.fastq", "fastq", "example.qual", "qual") \end{verbatim} However, the reverse is a little more tricky. You can use \verb|Bio.SeqIO.parse()| to iterate over the records in a \emph{single} file, but in this case we have two input files. There are several strategies possible, but assuming that the two files are really paired the most memory efficient way is to loop over both together. The code is a little fiddly, so we provide a function called \verb|PairedFastaQualIterator| in the \verb|Bio.SeqIO.QualityIO| module to do this. This takes two handles (the FASTA file and the QUAL file) and returns a \verb|SeqRecord| iterator: \begin{verbatim} from Bio.SeqIO.QualityIO import PairedFastaQualIterator for record in PairedFastaQualIterator(open("example.fasta"), open("example.qual")): print(record) \end{verbatim} This function will check that the FASTA and QUAL files are consistent (e.g. the records are in the same order, and have the same sequence length). You can combine this with the \verb|Bio.SeqIO.write()| function to convert a pair of FASTA and QUAL files into a single FASTQ files: \begin{verbatim} from Bio import SeqIO from Bio.SeqIO.QualityIO import PairedFastaQualIterator handle = open("temp.fastq", "w") #w=write records = PairedFastaQualIterator(open("example.fasta"), open("example.qual")) count = SeqIO.write(records, handle, "fastq") handle.close() print("Converted %i records" % count) \end{verbatim} \subsection{Indexing a FASTQ file} \label{sec:fastq-indexing} FASTQ files are often very large, with millions of reads in them. Due to the sheer amount of data, you can't load all the records into memory at once. This is why the examples above (filtering and trimming) iterate over the file looking at just one \verb|SeqRecord| at a time. However, sometimes you can't use a big loop or an iterator - you may need random access to the reads. Here the \verb|Bio.SeqIO.index()| function may prove very helpful, as it allows you to access any read in the FASTQ file by its name (see Section~\ref{sec:SeqIO-index}). Again we'll use the \texttt{SRR020192.fastq} file from the ENA (\url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR020/SRR020192/SRR020192.fastq.gz}), although this is actually quite a small FASTQ file with less than $50,000$ reads: \begin{verbatim} >>> from Bio import SeqIO >>> fq_dict = SeqIO.index("SRR020192.fastq", "fastq") >>> len(fq_dict) 41892 >>> fq_dict.keys()[:4] ['SRR020192.38240', 'SRR020192.23181', 'SRR020192.40568', 'SRR020192.23186'] >>> fq_dict["SRR020192.23186"].seq Seq('GTCCCAGTATTCGGATTTGTCTGCCAAAACAATGAAATTGACACAGTTTACAAC...CCG', SingleLetterAlphabet()) \end{verbatim} When testing this on a FASTQ file with seven million reads, indexing took about a minute, but record access was almost instant. The example in Section~\ref{sec:SeqIO-sort} show how you can use the \verb|Bio.SeqIO.index()| function to sort a large FASTA file -- this could also be used on FASTQ files. \subsection{Converting SFF files} \label{sec:SeqIO-sff-conversion} If you work with 454 (Roche) sequence data, you will probably have access to the raw data as a Standard Flowgram Format (SFF) file. This contains the sequence reads (called bases) with quality scores and the original flow information. A common task is to convert from SFF to a pair of FASTA and QUAL files, or to a single FASTQ file. These operations are trivial using the \verb|Bio.SeqIO.convert()| function (see Section~\ref{sec:SeqIO-conversion}): \begin{verbatim} >>> from Bio import SeqIO >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.fasta", "fasta") 10 >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.qual", "qual") 10 >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff", "reads.fastq", "fastq") 10 \end{verbatim} \noindent Remember the convert function returns the number of records, in this example just ten. This will give you the \emph{untrimmed} reads, where the leading and trailing poor quality sequence or adaptor will be in lower case. If you want the \emph{trimmed} reads (using the clipping information recorded within the SFF file) use this: \begin{verbatim} >>> from Bio import SeqIO >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.fasta", "fasta") 10 >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.qual", "qual") 10 >>> SeqIO.convert("E3MFGYR02_random_10_reads.sff", "sff-trim", "trimmed.fastq", "fastq") 10 \end{verbatim} If you run Linux, you could ask Roche for a copy of their ``off instrument'' tools (often referred to as the Newbler tools). This offers an alternative way to do SFF to FASTA or QUAL conversion at the command line (but currently FASTQ output is not supported), e.g. \begin{verbatim} $ sffinfo -seq -notrim E3MFGYR02_random_10_reads.sff > reads.fasta $ sffinfo -qual -notrim E3MFGYR02_random_10_reads.sff > reads.qual $ sffinfo -seq -trim E3MFGYR02_random_10_reads.sff > trimmed.fasta $ sffinfo -qual -trim E3MFGYR02_random_10_reads.sff > trimmed.qual \end{verbatim} \noindent The way Biopython uses mixed case sequence strings to represent the trimming points deliberately mimics what the Roche tools do. For more information on the Biopython SFF support, consult the built in help: \begin{verbatim} >>> from Bio.SeqIO import SffIO >>> help(SffIO) ... \end{verbatim} \subsection{Identifying open reading frames} A very simplistic first step at identifying possible genes is to look for open reading frames (ORFs). By this we mean look in all six frames for long regions without stop codons -- an ORF is just a region of nucleotides with no in frame stop codons. Of course, to find a gene you would also need to worry about locating a start codon, possible promoters -- and in Eukaryotes there are introns to worry about too. However, this approach is still useful in viruses and Prokaryotes. To show how you might approach this with Biopython, we'll need a sequence to search, and as an example we'll again use the bacterial plasmid -- although this time we'll start with a plain FASTA file with no pre-marked genes: \href{http://biopython.org/SRC/biopython/Tests/GenBank/NC_005816.fna} {\texttt{NC\_005816.fna}}. This is a bacterial sequence, so we'll want to use NCBI codon table 11 (see Section~\ref{sec:translation} about translation). %doctest ../Tests/GenBank \begin{verbatim} >>> from Bio import SeqIO >>> record = SeqIO.read("NC_005816.fna", "fasta") >>> table = 11 >>> min_pro_len = 100 \end{verbatim} Here is a neat trick using the \verb|Seq| object's \verb|split| method to get a list of all the possible ORF translations in the six reading frames: %cont-doctest \begin{verbatim} >>> for strand, nuc in [(+1, record.seq), (-1, record.seq.reverse_complement())]: ... for frame in range(3): ... length = 3 * ((len(record)-frame) // 3) #Multiple of three ... for pro in nuc[frame:frame+length].translate(table).split("*"): ... if len(pro) >= min_pro_len: ... print("%s...%s - length %i, strand %i, frame %i" \ ... % (pro[:30], pro[-3:], len(pro), strand, frame)) GCLMKKSSIVATIITILSGSANAASSQLIP...YRF - length 315, strand 1, frame 0 KSGELRQTPPASSTLHLRLILQRSGVMMEL...NPE - length 285, strand 1, frame 1 GLNCSFFSICNWKFIDYINRLFQIIYLCKN...YYH - length 176, strand 1, frame 1 VKKILYIKALFLCTVIKLRRFIFSVNNMKF...DLP - length 165, strand 1, frame 1 NQIQGVICSPDSGEFMVTFETVMEIKILHK...GVA - length 355, strand 1, frame 2 RRKEHVSKKRRPQKRPRRRRFFHRLRPPDE...PTR - length 128, strand 1, frame 2 TGKQNSCQMSAIWQLRQNTATKTRQNRARI...AIK - length 100, strand 1, frame 2 QGSGYAFPHASILSGIAMSHFYFLVLHAVK...CSD - length 114, strand -1, frame 0 IYSTSEHTGEQVMRTLDEVIASRSPESQTR...FHV - length 111, strand -1, frame 0 WGKLQVIGLSMWMVLFSQRFDDWLNEQEDA...ESK - length 125, strand -1, frame 1 RGIFMSDTMVVNGSGGVPAFLFSGSTLSSY...LLK - length 361, strand -1, frame 1 WDVKTVTGVLHHPFHLTFSLCPEGATQSGR...VKR - length 111, strand -1, frame 1 LSHTVTDFTDQMAQVGLCQCVNVFLDEVTG...KAA - length 107, strand -1, frame 2 RALTGLSAPGIRSQTSCDRLRELRYVPVSL...PLQ - length 119, strand -1, frame 2 \end{verbatim} Note that here we are counting the frames from the 5' end (start) of \emph{each} strand. It is sometimes easier to always count from the 5' end (start) of the \emph{forward} strand. You could easily edit the above loop based code to build up a list of the candidate proteins, or convert this to a list comprehension. Now, one thing this code doesn't do is keep track of where the proteins are. You could tackle this in several ways. For example, the following code tracks the locations in terms of the protein counting, and converts back to the parent sequence by multiplying by three, then adjusting for the frame and strand: \begin{verbatim} from Bio import SeqIO record = SeqIO.read("NC_005816.gb","genbank") table = 11 min_pro_len = 100 def find_orfs_with_trans(seq, trans_table, min_protein_length): answer = [] seq_len = len(seq) for strand, nuc in [(+1, seq), (-1, seq.reverse_complement())]: for frame in range(3): trans = str(nuc[frame:].translate(trans_table)) trans_len = len(trans) aa_start = 0 aa_end = 0 while aa_start < trans_len: aa_end = trans.find("*", aa_start) if aa_end == -1: aa_end = trans_len if aa_end-aa_start >= min_protein_length: if strand == 1: start = frame+aa_start*3 end = min(seq_len,frame+aa_end*3+3) else: start = seq_len-frame-aa_end*3-3 end = seq_len-frame-aa_start*3 answer.append((start, end, strand, trans[aa_start:aa_end])) aa_start = aa_end+1 answer.sort() return answer orf_list = find_orfs_with_trans(record.seq, table, min_pro_len) for start, end, strand, pro in orf_list: print("%s...%s - length %i, strand %i, %i:%i" \ % (pro[:30], pro[-3:], len(pro), strand, start, end)) \end{verbatim} \noindent And the output: \begin{verbatim} NQIQGVICSPDSGEFMVTFETVMEIKILHK...GVA - length 355, strand 1, 41:1109 WDVKTVTGVLHHPFHLTFSLCPEGATQSGR...VKR - length 111, strand -1, 491:827 KSGELRQTPPASSTLHLRLILQRSGVMMEL...NPE - length 285, strand 1, 1030:1888 RALTGLSAPGIRSQTSCDRLRELRYVPVSL...PLQ - length 119, strand -1, 2830:3190 RRKEHVSKKRRPQKRPRRRRFFHRLRPPDE...PTR - length 128, strand 1, 3470:3857 GLNCSFFSICNWKFIDYINRLFQIIYLCKN...YYH - length 176, strand 1, 4249:4780 RGIFMSDTMVVNGSGGVPAFLFSGSTLSSY...LLK - length 361, strand -1, 4814:5900 VKKILYIKALFLCTVIKLRRFIFSVNNMKF...DLP - length 165, strand 1, 5923:6421 LSHTVTDFTDQMAQVGLCQCVNVFLDEVTG...KAA - length 107, strand -1, 5974:6298 GCLMKKSSIVATIITILSGSANAASSQLIP...YRF - length 315, strand 1, 6654:7602 IYSTSEHTGEQVMRTLDEVIASRSPESQTR...FHV - length 111, strand -1, 7788:8124 WGKLQVIGLSMWMVLFSQRFDDWLNEQEDA...ESK - length 125, strand -1, 8087:8465 TGKQNSCQMSAIWQLRQNTATKTRQNRARI...AIK - length 100, strand 1, 8741:9044 QGSGYAFPHASILSGIAMSHFYFLVLHAVK...CSD - length 114, strand -1, 9264:9609 \end{verbatim} If you comment out the sort statement, then the protein sequences will be shown in the same order as before, so you can check this is doing the same thing. Here we have sorted them by location to make it easier to compare to the actual annotation in the GenBank file (as visualised in Section~\ref{sec:gd_nice_example}). If however all you want to find are the locations of the open reading frames, then it is a waste of time to translate every possible codon, including doing the reverse complement to search the reverse strand too. All you need to do is search for the possible stop codons (and their reverse complements). Using regular expressions is an obvious approach here (see the Python module \verb|re|). These are an extremely powerful (but rather complex) way of describing search strings, which are supported in lots of programming languages and also command line tools like \texttt{grep} as well). You can find whole books about this topic! \section{Sequence parsing plus simple plots} \label{seq:sequence-parsing-plus-pylab} This section shows some more examples of sequence parsing, using the \verb|Bio.SeqIO| module described in Chapter~\ref{chapter:Bio.SeqIO}, plus the Python library matplotlib's \verb|pylab| plotting interface (see \href{http://matplotlib.sourceforge.net/}{the matplotlib website for a tutorial}). Note that to follow these examples you will need matplotlib installed - but without it you can still try the data parsing bits. \subsection{Histogram of sequence lengths} There are lots of times when you might want to visualise the distribution of sequence lengths in a dataset -- for example the range of contig sizes in a genome assembly project. In this example we'll reuse our orchid FASTA file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{\tt ls\_orchid.fasta} which has only 94 sequences. First of all, we will use \verb|Bio.SeqIO| to parse the FASTA file and compile a list of all the sequence lengths. You could do this with a for loop, but I find a list comprehension more pleasing: \begin{verbatim} >>> from Bio import SeqIO >>> sizes = [len(rec) for rec in SeqIO.parse("ls_orchid.fasta", "fasta")] >>> len(sizes), min(sizes), max(sizes) (94, 572, 789) >>> sizes [740, 753, 748, 744, 733, 718, 730, 704, 740, 709, 700, 726, ..., 592] \end{verbatim} Now that we have the lengths of all the genes (as a list of integers), we can use the matplotlib histogram function to display it. \begin{verbatim} from Bio import SeqIO sizes = [len(rec) for rec in SeqIO.parse("ls_orchid.fasta", "fasta")] import pylab pylab.hist(sizes, bins=20) pylab.title("%i orchid sequences\nLengths %i to %i" \ % (len(sizes),min(sizes),max(sizes))) pylab.xlabel("Sequence length (bp)") pylab.ylabel("Count") pylab.show() \end{verbatim} % % Have a HTML version and a PDF version to display nicely... % \begin{htmlonly} \noindent That should pop up a new window containing the following graph: \imgsrc[width=600, height=450]{images/hist_plot.png} \end{htmlonly} % % Now the PDF equivalent where we cannot always expect the figure % to be positioned right next to the text, so will use a reference. % \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/hist_plot.png} \caption{Histogram of orchid sequence lengths.} \label{fig:seq-len-hist} \end{figure} \noindent That should pop up a new window containing the graph shown in Figure~\ref{fig:seq-len-hist}. \end{latexonly} % % The text now continues... % Notice that most of these orchid sequences are about $740$ bp long, and there could be two distinct classes of sequence here with a subset of shorter sequences. \emph{Tip:} Rather than using \verb|pylab.show()| to show the plot in a window, you can also use \verb|pylab.savefig(...)| to save the figure to a file (e.g. as a PNG or PDF). \subsection{Plot of sequence GC\%} Another easily calculated quantity of a nucleotide sequence is the GC\%. You might want to look at the GC\% of all the genes in a bacterial genome for example, and investigate any outliers which could have been recently acquired by horizontal gene transfer. Again, for this example we'll reuse our orchid FASTA file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{\tt ls\_orchid.fasta}. First of all, we will use \verb|Bio.SeqIO| to parse the FASTA file and compile a list of all the GC percentages. Again, you could do this with a for loop, but I prefer this: \begin{verbatim} from Bio import SeqIO from Bio.SeqUtils import GC gc_values = sorted(GC(rec.seq) for rec in SeqIO.parse("ls_orchid.fasta", "fasta")) \end{verbatim} Having read in each sequence and calculated the GC\%, we then sorted them into ascending order. Now we'll take this list of floating point values and plot them with matplotlib: \begin{verbatim} import pylab pylab.plot(gc_values) pylab.title("%i orchid sequences\nGC%% %0.1f to %0.1f" \ % (len(gc_values),min(gc_values),max(gc_values))) pylab.xlabel("Genes") pylab.ylabel("GC%") pylab.show() \end{verbatim} % % Have an HTML version and a PDF version to display nicely... % \begin{htmlonly} \noindent As in the previous example, that should pop up a new window containing a graph: \imgsrc[width=600, height=450]{images/gc_plot.png} \end{htmlonly} % % Now the PDF equivalent where we cannot always expect the figure % to be positioned right next to the text, so we'll use a reference. % \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/gc_plot.png} \caption{Histogram of orchid sequence lengths.} \label{fig:seq-gc-plot} \end{figure} \noindent As in the previous example, that should pop up a new window with the graph shown in Figure~\ref{fig:seq-gc-plot}. \end{latexonly} % % The text now continues... % If you tried this on the full set of genes from one organism, you'd probably get a much smoother plot than this. \subsection{Nucleotide dot plots} A dot plot is a way of visually comparing two nucleotide sequences for similarity to each other. A sliding window is used to compare short sub-sequences to each other, often with a mis-match threshold. Here for simplicity we'll only look for perfect matches (shown in black \begin{latexonly} in Figure~\ref{fig:nuc-dot-plot}). \end{latexonly} \begin{htmlonly} in the plot below). \end{htmlonly} % % Now the PDF equivalent where we cannot always expect the figure % to be positioned right next to the text, so we'll use a reference. % \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/dot_plot.png} \caption{Nucleotide dot plot of two orchid sequence lengths (using pylab's imshow function).} \label{fig:nuc-dot-plot} \end{figure} \end{latexonly} To start off, we'll need two sequences. For the sake of argument, we'll just take the first two from our orchid FASTA file \href{http://biopython.org/DIST/docs/tutorial/examples/ls_orchid.fasta}{\tt ls\_orchid.fasta}: \begin{verbatim} from Bio import SeqIO handle = open("ls_orchid.fasta") record_iterator = SeqIO.parse(handle, "fasta") rec_one = next(record_iterator) rec_two = next(record_iterator) handle.close() \end{verbatim} We're going to show two approaches. Firstly, a simple naive implementation which compares all the window sized sub-sequences to each other to compiles a similarity matrix. You could construct a matrix or array object, but here we just use a list of lists of booleans created with a nested list comprehension: \begin{verbatim} window = 7 seq_one = str(rec_one.seq).upper() seq_two = str(rec_two.seq).upper() data = [[(seq_one[i:i+window] <> seq_two[j:j+window]) \ for j in range(len(seq_one)-window)] \ for i in range(len(seq_two)-window)] \end{verbatim} Note that we have \emph{not} checked for reverse complement matches here. Now we'll use the matplotlib's \verb|pylab.imshow()| function to display this data, first requesting the gray color scheme so this is done in black and white: \begin{verbatim} import pylab pylab.gray() pylab.imshow(data) pylab.xlabel("%s (length %i bp)" % (rec_one.id, len(rec_one))) pylab.ylabel("%s (length %i bp)" % (rec_two.id, len(rec_two))) pylab.title("Dot plot using window size %i\n(allowing no mis-matches)" % window) pylab.show() \end{verbatim} %pylab.savefig("dot_plot.png", dpi=75) %pylab.savefig("dot_plot.pdf") % % Have a HTML version and a PDF version to display nicely... % \begin{htmlonly} \noindent That should pop up a new window containing a graph like this: \imgsrc[width=600, height=450]{images/dot_plot.png} \end{htmlonly} \begin{latexonly} \noindent That should pop up a new window showing the graph in Figure~\ref{fig:nuc-dot-plot}. \end{latexonly} % % The text now continues... % As you might have expected, these two sequences are very similar with a partial line of window sized matches along the diagonal. There are no off diagonal matches which would be indicative of inversions or other interesting events. The above code works fine on small examples, but there are two problems applying this to larger sequences, which we will address below. First off all, this brute force approach to the all against all comparisons is very slow. Instead, we'll compile dictionaries mapping the window sized sub-sequences to their locations, and then take the set intersection to find those sub-sequences found in both sequences. This uses more memory, but is \emph{much} faster. Secondly, the \verb|pylab.imshow()| function is limited in the size of matrix it can display. As an alternative, we'll use the \verb|pylab.scatter()| function. We start by creating dictionaries mapping the window-sized sub-sequences to locations: \begin{verbatim} window = 7 dict_one = {} dict_two = {} for (seq, section_dict) in [(str(rec_one.seq).upper(), dict_one), (str(rec_two.seq).upper(), dict_two)]: for i in range(len(seq)-window): section = seq[i:i+window] try: section_dict[section].append(i) except KeyError: section_dict[section] = [i] #Now find any sub-sequences found in both sequences #(Python 2.3 would require slightly different code here) matches = set(dict_one).intersection(dict_two) print("%i unique matches" % len(matches)) \end{verbatim} \noindent In order to use the \verb|pylab.scatter()| we need separate lists for the $x$ and $y$ co-ordinates: \begin{verbatim} #Create lists of x and y co-ordinates for scatter plot x = [] y = [] for section in matches: for i in dict_one[section]: for j in dict_two[section]: x.append(i) y.append(j) \end{verbatim} \noindent We are now ready to draw the revised dot plot as a scatter plot: \begin{verbatim} import pylab pylab.cla() #clear any prior graph pylab.gray() pylab.scatter(x,y) pylab.xlim(0, len(rec_one)-window) pylab.ylim(0, len(rec_two)-window) pylab.xlabel("%s (length %i bp)" % (rec_one.id, len(rec_one))) pylab.ylabel("%s (length %i bp)" % (rec_two.id, len(rec_two))) pylab.title("Dot plot using window size %i\n(allowing no mis-matches)" % window) pylab.show() \end{verbatim} %pylab.savefig("dot_plot.png", dpi=75) %pylab.savefig("dot_plot.pdf") % % Have a HTML version and a PDF version to display nicely... % \begin{htmlonly} \noindent That should pop up a new window containing a graph like this: \imgsrc[width=600, height=450]{images/dot_plot_scatter.png} \end{htmlonly} \begin{latexonly} \noindent That should pop up a new window showing the graph in Figure~\ref{fig:nuc-dot-plot-scatter}. \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/dot_plot_scatter.png} \caption{Nucleotide dot plot of two orchid sequence lengths (using pylab's scatter function).} \label{fig:nuc-dot-plot-scatter} \end{figure}\end{latexonly} Personally I find this second plot much easier to read! Again note that we have \emph{not} checked for reverse complement matches here -- you could extend this example to do this, and perhaps plot the forward matches in one color and the reverse matches in another. \subsection{Plotting the quality scores of sequencing read data} If you are working with second generation sequencing data, you may want to try plotting the quality data. Here is an example using two FASTQ files containing paired end reads, \texttt{SRR001666\_1.fastq} for the forward reads, and \texttt{SRR001666\_2.fastq} for the reverse reads. These were downloaded from the ENA sequence read archive FTP site (\url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR001/SRR001666/SRR001666_1.fastq.gz} and \url{ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR001/SRR001666/SRR001666_2.fastq.gz}), and are from \textit{E. coli} -- see \url{http://www.ebi.ac.uk/ena/data/view/SRR001666} for details. %Originally from ftp://ftp.ncbi.nlm.nih.gov/sra/static/SRX000/SRX000430/ In the following code the \verb|pylab.subplot(...)| function is used in order to show the forward and reverse qualities on two subplots, side by side. There is also a little bit of code to only plot the first fifty reads. \begin{verbatim} import pylab from Bio import SeqIO for subfigure in [1,2]: filename = "SRR001666_%i.fastq" % subfigure pylab.subplot(1, 2, subfigure) for i,record in enumerate(SeqIO.parse(filename, "fastq")): if i >= 50 : break #trick! pylab.plot(record.letter_annotations["phred_quality"]) pylab.ylim(0,45) pylab.ylabel("PHRED quality score") pylab.xlabel("Position") pylab.savefig("SRR001666.png") print("Done") \end{verbatim} You should note that we are using the \verb|Bio.SeqIO| format name \texttt{fastq} here because the NCBI has saved these reads using the standard Sanger FASTQ format with PHRED scores. However, as you might guess from the read lengths, this data was from an Illumina Genome Analyzer and was probably originally in one of the two Solexa/Illumina FASTQ variant file formats instead. This example uses the \verb|pylab.savefig(...)| function instead of \verb|pylab.show(...)|, but as mentioned before both are useful. \begin{latexonly} \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{images/SRR001666.png} \caption{Quality plot for some paired end reads.} \label{fig:paired-end-qual-plot} \end{figure} The result is shown in Figure~\ref{fig:paired-end-qual-plot}. \end{latexonly} \begin{htmlonly} Here is the result: %Blank lines here are important! \imgsrc[width=600, height=600]{images/SRR001666.png} \end{htmlonly} \section{Dealing with alignments} This section can been seen as a follow on to Chapter~\ref{chapter:Bio.AlignIO}. \subsection{Calculating summary information} \label{sec:summary_info} Once you have an alignment, you are very likely going to want to find out information about it. Instead of trying to have all of the functions that can generate information about an alignment in the alignment object itself, we've tried to separate out the functionality into separate classes, which act on the alignment. Getting ready to calculate summary information about an object is quick to do. Let's say we've got an alignment object called \verb|alignment|, for example read in using \verb|Bio.AlignIO.read(...)| as described in Chapter~\ref{chapter:Bio.AlignIO}. All we need to do to get an object that will calculate summary information is: \begin{verbatim} from Bio.Align import AlignInfo summary_align = AlignInfo.SummaryInfo(alignment) \end{verbatim} The \verb|summary_align| object is very useful, and will do the following neat things for you: \begin{enumerate} \item Calculate a quick consensus sequence -- see section~\ref{sec:consensus} \item Get a position specific score matrix for the alignment -- see section~\ref{sec:pssm} \item Calculate the information content for the alignment -- see section~\ref{sec:getting_info_content} \item Generate information on substitutions in the alignment -- section~\ref{sec:sub_matrix} details using this to generate a substitution matrix. \end{enumerate} \subsection{Calculating a quick consensus sequence} \label{sec:consensus} The \verb|SummaryInfo| object, described in section~\ref{sec:summary_info}, provides functionality to calculate a quick consensus of an alignment. Assuming we've got a \verb|SummaryInfo| object called \verb|summary_align| we can calculate a consensus by doing: \begin{verbatim} consensus = summary_align.dumb_consensus() \end{verbatim} As the name suggests, this is a really simple consensus calculator, and will just add up all of the residues at each point in the consensus, and if the most common value is higher than some threshold value will add the common residue to the consensus. If it doesn't reach the threshold, it adds an ambiguity character to the consensus. The returned consensus object is Seq object whose alphabet is inferred from the alphabets of the sequences making up the consensus. So doing a \verb|print consensus| would give: \begin{verbatim} consensus Seq('TATACATNAAAGNAGGGGGATGCGGATAAATGGAAAGGCGAAAGAAAGAAAAAAATGAAT ...', IUPACAmbiguousDNA()) \end{verbatim} You can adjust how \verb|dumb_consensus| works by passing optional parameters: \begin{description} \item[the threshold] This is the threshold specifying how common a particular residue has to be at a position before it is added. The default is $0.7$ (meaning $70\%$). \item[the ambiguous character] This is the ambiguity character to use. The default is 'N'. \item[the consensus alphabet] This is the alphabet to use for the consensus sequence. If an alphabet is not specified than we will try to guess the alphabet based on the alphabets of the sequences in the alignment. \end{description} \subsection{Position Specific Score Matrices} \label{sec:pssm} Position specific score matrices (PSSMs) summarize the alignment information in a different way than a consensus, and may be useful for different tasks. Basically, a PSSM is a count matrix. For each column in the alignment, the number of each alphabet letters is counted and totaled. The totals are displayed relative to some representative sequence along the left axis. This sequence may be the consesus sequence, but can also be any sequence in the alignment. For instance for the alignment, \begin{verbatim} GTATC AT--C CTGTC \end{verbatim} \noindent the PSSM is: \begin{verbatim} G A T C G 1 1 0 1 T 0 0 3 0 A 1 1 0 0 T 0 0 2 0 C 0 0 0 3 \end{verbatim} Let's assume we've got an alignment object called \verb|c_align|. To get a PSSM with the consensus sequence along the side we first get a summary object and calculate the consensus sequence: \begin{verbatim} summary_align = AlignInfo.SummaryInfo(c_align) consensus = summary_align.dumb_consensus() \end{verbatim} Now, we want to make the PSSM, but ignore any \verb|N| ambiguity residues when calculating this: \begin{verbatim} my_pssm = summary_align.pos_specific_score_matrix(consensus, chars_to_ignore = ['N']) \end{verbatim} Two notes should be made about this: \begin{enumerate} \item To maintain strictness with the alphabets, you can only include characters along the top of the PSSM that are in the alphabet of the alignment object. Gaps are not included along the top axis of the PSSM. \item The sequence passed to be displayed along the left side of the axis does not need to be the consensus. For instance, if you wanted to display the second sequence in the alignment along this axis, you would need to do: \begin{verbatim} second_seq = alignment.get_seq_by_num(1) my_pssm = summary_align.pos_specific_score_matrix(second_seq chars_to_ignore = ['N']) \end{verbatim} \end{enumerate} The command above returns a \verb|PSSM| object. To print out the PSSM as shown above, we simply need to do a \verb|print(my_pssm)|, which gives: \begin{verbatim} A C G T T 0.0 0.0 0.0 7.0 A 7.0 0.0 0.0 0.0 T 0.0 0.0 0.0 7.0 A 7.0 0.0 0.0 0.0 C 0.0 7.0 0.0 0.0 A 7.0 0.0 0.0 0.0 T 0.0 0.0 0.0 7.0 T 1.0 0.0 0.0 6.0 ... \end{verbatim} You can access any element of the PSSM by subscripting like \verb|your_pssm[sequence_number][residue_count_name]|. For instance, to get the counts for the 'A' residue in the second element of the above PSSM you would do: \begin{verbatim} >>> print(my_pssm[1]["A"]) 7.0 \end{verbatim} The structure of the PSSM class hopefully makes it easy both to access elements and to pretty print the matrix. \subsection{Information Content} \label{sec:getting_info_content} A potentially useful measure of evolutionary conservation is the information content of a sequence. A useful introduction to information theory targeted towards molecular biologists can be found at \url{http://www.lecb.ncifcrf.gov/~toms/paper/primer/}. For our purposes, we will be looking at the information content of a consesus sequence, or a portion of a consensus sequence. We calculate information content at a particular column in a multiple sequence alignment using the following formula: \begin{displaymath} IC_{j} = \sum_{i=1}^{N_{a}} P_{ij} \mathrm{log}\left(\frac{P_{ij}}{Q_{i}}\right) \end{displaymath} \noindent where: \begin{itemize} \item $IC_{j}$ -- The information content for the $j$-th column in an alignment. \item $N_{a}$ -- The number of letters in the alphabet. \item $P_{ij}$ -- The frequency of a particular letter $i$ in the $j$-th column (i.~e.~if G occurred 3 out of 6 times in an aligment column, this would be 0.5) \item $Q_{i}$ -- The expected frequency of a letter $i$. This is an optional argument, usage of which is left at the user's discretion. By default, it is automatically assigned to $0.05 = 1/20$ for a protein alphabet, and $0.25 = 1/4$ for a nucleic acid alphabet. This is for geting the information content without any assumption of prior distributions. When assuming priors, or when using a non-standard alphabet, you should supply the values for $Q_{i}$. \end{itemize} Well, now that we have an idea what information content is being calculated in Biopython, let's look at how to get it for a particular region of the alignment. First, we need to use our alignment to get an alignment summary object, which we'll assume is called \verb|summary_align| (see section~\ref{sec:summary_info}) for instructions on how to get this. Once we've got this object, calculating the information content for a region is as easy as: \begin{verbatim} info_content = summary_align.information_content(5, 30, chars_to_ignore = ['N']) \end{verbatim} Wow, that was much easier then the formula above made it look! The variable \verb|info_content| now contains a float value specifying the information content over the specified region (from 5 to 30 of the alignment). We specifically ignore the ambiguity residue 'N' when calculating the information content, since this value is not included in our alphabet (so we shouldn't be interested in looking at it!). As mentioned above, we can also calculate relative information content by supplying the expected frequencies: \begin{verbatim} expect_freq = { 'A' : .3, 'G' : .2, 'T' : .3, 'C' : .2} \end{verbatim} The expected should not be passed as a raw dictionary, but instead by passed as a \verb|SubsMat.FreqTable| object (see section~\ref{sec:freq_table} for more information about FreqTables). The FreqTable object provides a standard for associating the dictionary with an Alphabet, similar to how the Biopython Seq class works. To create a FreqTable object, from the frequency dictionary you just need to do: \begin{verbatim} from Bio.Alphabet import IUPAC from Bio.SubsMat import FreqTable e_freq_table = FreqTable.FreqTable(expect_freq, FreqTable.FREQ, IUPAC.unambiguous_dna) \end{verbatim} Now that we've got that, calculating the relative information content for our region of the alignment is as simple as: \begin{verbatim} info_content = summary_align.information_content(5, 30, e_freq_table = e_freq_table, chars_to_ignore = ['N']) \end{verbatim} Now, \verb|info_content| will contain the relative information content over the region in relation to the expected frequencies. The value return is calculated using base 2 as the logarithm base in the formula above. You can modify this by passing the parameter \verb|log_base| as the base you want: \begin{verbatim} info_content = summary_align.information_content(5, 30, log_base = 10, chars_to_ignore = ['N']) \end{verbatim} Well, now you are ready to calculate information content. If you want to try applying this to some real life problems, it would probably be best to dig into the literature on information content to get an idea of how it is used. Hopefully your digging won't reveal any mistakes made in coding this function! \section{Substitution Matrices} \label{sec:sub_matrix} Substitution matrices are an extremely important part of everyday bioinformatics work. They provide the scoring terms for classifying how likely two different residues are to substitute for each other. This is essential in doing sequence comparisons. The book ``Biological Sequence Analysis'' by Durbin et al. provides a really nice introduction to Substitution Matrices and their uses. Some famous substitution matrices are the PAM and BLOSUM series of matrices. Biopython provides a ton of common substitution matrices, and also provides functionality for creating your own substitution matrices. \subsection{Using common substitution matrices} \subsection{Creating your own substitution matrix from an alignment} \label{sec:subs_mat_ex} A very cool thing that you can do easily with the substitution matrix classes is to create your own substitution matrix from an alignment. In practice, this is normally done with protein alignments. In this example, we'll first get a Biopython alignment object and then get a summary object to calculate info about the alignment. The file containing \href{examples/protein.aln}{protein.aln} (also available online \href{http://biopython.org/DIST/docs/tutorial/examples/protein.aln}{here}) contains the Clustalw alignment output. %doctest examples \begin{verbatim} >>> from Bio import AlignIO >>> from Bio import Alphabet >>> from Bio.Alphabet import IUPAC >>> from Bio.Align import AlignInfo >>> filename = "protein.aln" >>> alpha = Alphabet.Gapped(IUPAC.protein) >>> c_align = AlignIO.read(filename, "clustal", alphabet=alpha) >>> summary_align = AlignInfo.SummaryInfo(c_align) \end{verbatim} Sections~\ref{sec:align_clustal} and~\ref{sec:summary_info} contain more information on doing this. Now that we've got our \verb|summary_align| object, we want to use it to find out the number of times different residues substitute for each other. To make the example more readable, we'll focus on only amino acids with polar charged side chains. Luckily, this can be done easily when generating a replacement dictionary, by passing in all of the characters that should be ignored. Thus we'll create a dictionary of replacements for only charged polar amino acids using: %cont-doctest \begin{verbatim} >>> replace_info = summary_align.replacement_dictionary(["G", "A", "V", "L", "I", ... "M", "P", "F", "W", "S", ... "T", "N", "Q", "Y", "C"]) \end{verbatim} This information about amino acid replacements is represented as a python dictionary which will look something like (the order can vary): \begin{verbatim} {('R', 'R'): 2079.0, ('R', 'H'): 17.0, ('R', 'K'): 103.0, ('R', 'E'): 2.0, ('R', 'D'): 2.0, ('H', 'R'): 0, ('D', 'H'): 15.0, ('K', 'K'): 3218.0, ('K', 'H'): 24.0, ('H', 'K'): 8.0, ('E', 'H'): 15.0, ('H', 'H'): 1235.0, ('H', 'E'): 18.0, ('H', 'D'): 0, ('K', 'D'): 0, ('K', 'E'): 9.0, ('D', 'R'): 48.0, ('E', 'R'): 2.0, ('D', 'K'): 1.0, ('E', 'K'): 45.0, ('K', 'R'): 130.0, ('E', 'D'): 241.0, ('E', 'E'): 3305.0, ('D', 'E'): 270.0, ('D', 'D'): 2360.0} \end{verbatim} This information gives us our accepted number of replacements, or how often we expect different things to substitute for each other. It turns out, amazingly enough, that this is all of the information we need to go ahead and create a substitution matrix. First, we use the replacement dictionary information to create an Accepted Replacement Matrix (ARM): %cont-doctest \begin{verbatim} >>> from Bio import SubsMat >>> my_arm = SubsMat.SeqMat(replace_info) \end{verbatim} With this accepted replacement matrix, we can go right ahead and create our log odds matrix (i.~e.~a standard type Substitution Matrix): %cont-doctest \begin{verbatim} >>> my_lom = SubsMat.make_log_odds_matrix(my_arm) \end{verbatim} The log odds matrix you create is customizable with the following optional arguments: \begin{itemize} \item \verb|exp_freq_table| -- You can pass a table of expected frequencies for each alphabet. If supplied, this will be used instead of the passed accepted replacement matrix when calculate expected replacments. \item \verb|logbase| - The base of the logarithm taken to create the log odd matrix. Defaults to base 10. \item \verb|factor| - The factor to multiply each matrix entry by. This defaults to 10, which normally makes the matrix numbers easy to work with. \item \verb|round_digit| - The digit to round to in the matrix. This defaults to 0 (i.~e.~no digits). \end{itemize} Once you've got your log odds matrix, you can display it prettily using the function \verb|print_mat|. Doing this on our created matrix gives: %cont-doctest \begin{verbatim} >>> my_lom.print_mat() D 2 E -1 1 H -5 -4 3 K -10 -5 -4 1 R -4 -8 -4 -2 2 D E H K R \end{verbatim} Very nice. Now we've got our very own substitution matrix to play with! \section{BioSQL -- storing sequences in a relational database} \label{sec:BioSQL} \href{http://www.biosql.org/}{BioSQL} is a joint effort between the \href{http://open-bio.org/}{OBF} projects (BioPerl, BioJava etc) to support a shared database schema for storing sequence data. In theory, you could load a GenBank file into the database with BioPerl, then using Biopython extract this from the database as a record object with features - and get more or less the same thing as if you had loaded the GenBank file directly as a SeqRecord using \verb|Bio.SeqIO| (Chapter~\ref{chapter:Bio.SeqIO}). Biopython's BioSQL module is currently documented at \url{http://biopython.org/wiki/BioSQL} which is part of our wiki pages. \chapter{The Biopython testing framework} \label{sec:regr_test} Biopython has a regression testing framework (the file \verb|run_tests.py|) based on \href{http://docs.python.org/library/unittest.html}{unittest}, the standard unit testing framework for Python. Providing comprehensive tests for modules is one of the most important aspects of making sure that the Biopython code is as bug-free as possible before going out. It also tends to be one of the most undervalued aspects of contributing. This chapter is designed to make running the Biopython tests and writing good test code as easy as possible. Ideally, every module that goes into Biopython should have a test (and should also have documentation!). All our developers, and anyone installing Biopython from source, are strongly encouraged to run the unit tests. \section{Running the tests} When you download the Biopython source code, or check it out from our source code repository, you should find a subdirectory call \verb|Tests|. This contains the key script \verb|run_tests.py|, lots of individual scripts named \verb|test_XXX.py|, a subdirectory called \verb|output| and lots of other subdirectories which contain input files for the test suite. As part of building and installing Biopython you will typically run the full test suite at the command line from the Biopython source top level directory using the following: \begin{verbatim} python setup.py test \end{verbatim} This is actually equivalent to going to the \verb|Tests| subdirectory and running: \begin{verbatim} python run_tests.py \end{verbatim} You'll often want to run just some of the tests, and this is done like this: \begin{verbatim} python run_tests.py test_SeqIO.py test_AlignIO.py \end{verbatim} When giving the list of tests, the \verb|.py| extension is optional, so you can also just type: \begin{verbatim} python run_tests.py test_SeqIO test_AlignIO \end{verbatim} To run the docstring tests (see section \ref{section:doctest}), you can use \begin{verbatim} python run_tests.py doctest \end{verbatim} By default, \verb|run_tests.py| runs all tests, including the docstring tests. If an individual test is failing, you can also try running it directly, which may give you more information. Importantly, note that the individual unit tests come in two types: \begin{itemize} \item Simple print-and-compare scripts. These unit tests are essentially short example Python programs, which print out various output text. For a test file named \verb|test_XXX.py| there will be a matching text file called \verb|test_XXX| under the \verb|output| subdirectory which contains the expected output. All that the test framework does to is run the script, and check the output agrees. \item Standard \verb|unittest|- based tests. These will \verb|import unittest| and then define \verb|unittest.TestCase| classes, each with one or more sub-tests as methods starting with \verb|test_| which check some specific aspect of the code. These tests should not print any output directly. \end{itemize} Currently, about half of the Biopython tests are \verb|unittest|-style tests, and half are print-and-compare tests. Running a simple print-and-compare test directly will usually give lots of output on screen, but does not check the output matches the expected output. If the test is failing with an exception error, it should be very easy to locate where exactly the script is failing. For an example of a print-and-compare test, try: \begin{verbatim} python test_SeqIO.py \end{verbatim} The \verb|unittest|-based tests instead show you exactly which sub-section(s) of the test are failing. For example, \begin{verbatim} python test_Cluster.py \end{verbatim} \section{Writing tests} Let's say you want to write some tests for a module called \verb|Biospam|. This can be a module you wrote, or an existing module that doesn't have any tests yet. In the examples below, we assume that \verb|Biospam| is a module that does simple math. Each Biopython test can have three important files and directories involved with it: \begin{enumerate} \item \verb|test_Biospam.py| -- The actual test code for your module. \item \verb|Biospam| [optional]-- A directory where any necessary input files will be located. Any output files that will be generated should also be written here (and preferably cleaned up after the tests are done) to prevent clogging up the main Tests directory. \item \verb|output/Biospam| -- [for print-and-compare tests only] This file contains the expected output from running \verb|test_Biospam.py|. This file is not needed for \verb|unittest|-style tests, since there the validation is done in the test script \verb|test_Biospam.py| itself. \end{enumerate} It's up to you to decide whether you want to write a print-and-compare test script or a \verb|unittest|-style test script. The important thing is that you cannot mix these two styles in a single test script. Particularly, don't use \verb|unittest| features in a print-and-compare test. Any script with a \verb|test_| prefix in the \verb|Tests| directory will be found and run by \verb|run_tests.py|. Below, we show an example test script \verb|test_Biospam.py| both for a print-and-compare test and for a \verb|unittest|-based test. If you put this script in the Biopython \verb|Tests| directory, then \verb|run_tests.py| will find it and execute the tests contained in it: \begin{verbatim} $ python run_tests.py test_Ace ... ok test_AlignIO ... ok test_BioSQL ... ok test_BioSQL_SeqIO ... ok test_Biospam ... ok test_CAPS ... ok test_Clustalw ... ok \end{verbatim} \ldots \begin{verbatim} ---------------------------------------------------------------------- Ran 107 tests in 86.127 seconds \end{verbatim} \subsection{Writing a print-and-compare test} A print-and-compare style test should be much simpler for beginners or novices to write - essentially it is just an example script using your new module. Here is what you should do to make a print-and-compare test for the \verb|Biospam| module. \begin{enumerate} \item Write a script called \verb|test_Biospam.py| \begin{itemize} \item This script should live in the Tests directory \item The script should test all of the important functionality of the module (the more you test the better your test is, of course!). \item Try to avoid anything which might be platform specific, such as printing floating point numbers without using an explicit formatting string to avoid having too many decimal places (different platforms can give very slightly different values). \end{itemize} \item If the script requires files to do the testing, these should go in the directory Tests/Biospam (if you just need something generic, like a FASTA sequence file, or a GenBank record, try and use an existing sample input file instead). \item Write out the test output and verify the output to be correct. There are two ways to do this: \begin{enumerate} \item The long way: \begin{itemize} \item Run the script and write its output to a file. On UNIX (including Linux and Mac OS X) machines, you would do something like: \verb|python test_Biospam.py > test_Biospam| which would write the output to the file \verb|test_Biospam|. \item Manually look at the file \verb|test_Biospam| to make sure the output is correct. When you are sure it is all right and there are no bugs, you need to quickly edit the \verb|test_Biospam| file so that the first line is: `\verb|test_Biospam|' (no quotes). \item copy the \verb|test_Biospam| file to the directory Tests/output \end{itemize} \item The quick way: \begin{itemize} \item Run \verb|python run_tests.py -g test_Biospam.py|. The regression testing framework is nifty enough that it'll put the output in the right place in just the way it likes it. \item Go to the output (which should be in \verb|Tests/output/test_Biospam|) and double check the output to make sure it is all correct. \end{itemize} \end{enumerate} \item Now change to the Tests directory and run the regression tests with \verb|python run_tests.py|. This will run all of the tests, and you should see your test run (and pass!). \item That's it! Now you've got a nice test for your module ready to check in, or submit to Biopython. Congratulations! \end{enumerate} As an example, the \verb|test_Biospam.py| test script to test the \verb|addition| and \verb|multiplication| functions in the \verb|Biospam| module could look as follows: \begin{verbatim} from __future__ import print_function from Bio import Biospam print("2 + 3 =", Biospam.addition(2, 3)) print("9 - 1 =", Biospam.addition(9, -1)) print("2 * 3 =", Biospam.multiplication(2, 3)) print("9 * (- 1) =", Biospam.multiplication(9, -1)) \end{verbatim} We generate the corresponding output with \verb|python run_tests.py -g test_Biospam.py|, and check the output file \verb|output/test_Biospam|: \begin{verbatim} test_Biospam 2 + 3 = 5 9 - 1 = 8 2 * 3 = 6 9 * (- 1) = -9 \end{verbatim} Often, the difficulty with larger print-and-compare tests is to keep track which line in the output corresponds to which command in the test script. For this purpose, it is important to print out some markers to help you match lines in the input script with the generated output. \subsection{Writing a unittest-based test} We want all the modules in Biopython to have unit tests, and a simple print-and-compare test is better than no test at all. However, although there is a steeper learning curve, using the \verb|unittest| framework gives a more structured result, and if there is a test failure this can clearly pinpoint which part of the test is going wrong. The sub-tests can also be run individually which is helpful for testing or debugging. The \verb|unittest|-framework has been included with Python since version 2.1, and is documented in the Python Library Reference (which I know you are keeping under your pillow, as recommended). There is also \href{http://docs.python.org/library/unittest.html}{online documentaion for unittest}. If you are familiar with the \verb|unittest| system (or something similar like the nose test framework), you shouldn't have any trouble. You may find looking at the existing example within Biopython helpful too. Here's a minimal \verb|unittest|-style test script for \verb|Biospam|, which you can copy and paste to get started: \begin{verbatim} import unittest from Bio import Biospam class BiospamTestAddition(unittest.TestCase): def test_addition1(self): result = Biospam.addition(2, 3) self.assertEqual(result, 5) def test_addition2(self): result = Biospam.addition(9, -1) self.assertEqual(result, 8) class BiospamTestDivision(unittest.TestCase): def test_division1(self): result = Biospam.division(3.0, 2.0) self.assertAlmostEqual(result, 1.5) def test_division2(self): result = Biospam.division(10.0, -2.0) self.assertAlmostEqual(result, -5.0) if __name__ == "__main__": runner = unittest.TextTestRunner(verbosity = 2) unittest.main(testRunner=runner) \end{verbatim} In the division tests, we use \verb|assertAlmostEqual| instead of \verb|assertEqual| to avoid tests failing due to roundoff errors; see the \verb|unittest| chapter in the Python documentation for details and for other functionality available in \verb|unittest| (\href{http://docs.python.org/library/unittest.html}{online reference}). These are the key points of \verb|unittest|-based tests: \begin{itemize} \item Test cases are stored in classes that derive from \verb|unittest.TestCase| and cover one basic aspect of your code \item You can use methods \verb|setUp| and \verb|tearDown| for any repeated code which should be run before and after each test method. For example, the \verb|setUp| method might be used to create an instance of the object you are testing, or open a file handle. The \verb|tearDown| should do any ``tidying up'', for example closing the file handle. \item The tests are prefixed with \verb|test_| and each test should cover one specific part of what you are trying to test. You can have as many tests as you want in a class. \item At the end of the test script, you can use \begin{verbatim} if __name__ == "__main__": runner = unittest.TextTestRunner(verbosity = 2) unittest.main(testRunner=runner) \end{verbatim} to execute the tests when the script is run by itself (rather than imported from \verb|run_tests.py|). If you run this script, then you'll see something like the following: \begin{verbatim} $ python test_BiospamMyModule.py test_addition1 (__main__.TestAddition) ... ok test_addition2 (__main__.TestAddition) ... ok test_division1 (__main__.TestDivision) ... ok test_division2 (__main__.TestDivision) ... ok ---------------------------------------------------------------------- Ran 4 tests in 0.059s OK \end{verbatim} \item To indicate more clearly what each test is doing, you can add docstrings to each test. These are shown when running the tests, which can be useful information if a test is failing. \begin{verbatim} import unittest from Bio import Biospam class BiospamTestAddition(unittest.TestCase): def test_addition1(self): """An addition test""" result = Biospam.addition(2, 3) self.assertEqual(result, 5) def test_addition2(self): """A second addition test""" result = Biospam.addition(9, -1) self.assertEqual(result, 8) class BiospamTestDivision(unittest.TestCase): def test_division1(self): """Now let's check division""" result = Biospam.division(3.0, 2.0) self.assertAlmostEqual(result, 1.5) def test_division2(self): """A second division test""" result = Biospam.division(10.0, -2.0) self.assertAlmostEqual(result, -5.0) if __name__ == "__main__": runner = unittest.TextTestRunner(verbosity = 2) unittest.main(testRunner=runner) \end{verbatim} Running the script will now show you: \begin{verbatim} $ python test_BiospamMyModule.py An addition test ... ok A second addition test ... ok Now let's check division ... ok A second division test ... ok ---------------------------------------------------------------------- Ran 4 tests in 0.001s OK \end{verbatim} \end{itemize} If your module contains docstring tests (see section \ref{section:doctest}), you may want to include those in the tests to be run. You can do so as follows by modifying the code under \verb|if __name__ == "__main__":| to look like this: \begin{verbatim} if __name__ == "__main__": unittest_suite = unittest.TestLoader().loadTestsFromName("test_Biospam") doctest_suite = doctest.DocTestSuite(Biospam) suite = unittest.TestSuite((unittest_suite, doctest_suite)) runner = unittest.TextTestRunner(sys.stdout, verbosity = 2) runner.run(suite) \end{verbatim} This is only relevant if you want to run the docstring tests when you execute \verb|python test_Biospam.py|; with \verb|python run_tests.py|, the docstring tests are run automatically (assuming they are included in the list of docstring tests in \verb|run_tests.py|, see the section below). \section{Writing doctests} \label{section:doctest} Python modules, classes and functions support built in documentation using docstrings. The \href{http://docs.python.org/library/doctest.html}{doctest framework} (included with Python) allows the developer to embed working examples in the docstrings, and have these examples automatically tested. Currently only a small part of Biopython includes doctests. The \verb|run_tests.py| script takes care of running the doctests. For this purpose, at the top of the \verb|run_tests.py| script is a manually compiled list of modules to test, which allows us to skip modules with optional external dependencies which may not be installed (e.g. the Reportlab and NumPy libraries). So, if you've added some doctests to the docstrings in a Biopython module, in order to have them included in the Biopython test suite, you must update \verb|run_tests.py| to include your module. Currently, the relevant part of \verb|run_tests.py| looks as follows: \begin{verbatim} # This is the list of modules containing docstring tests. # If you develop docstring tests for other modules, please add # those modules here. DOCTEST_MODULES = ["Bio.Seq", "Bio.SeqRecord", "Bio.SeqIO", "...", ] #Silently ignore any doctests for modules requiring numpy! try: import numpy DOCTEST_MODULES.extend(["Bio.Statistics.lowess"]) except ImportError: pass \end{verbatim} Note that we regard doctests primarily as documentation, so you should stick to typical usage. Generally complicated examples dealing with error conditions and the like would be best left to a dedicated unit test. Note that if you want to write doctests involving file parsing, defining the file location complicates matters. Ideally use relative paths assuming the code will be run from the \verb|Tests| directory, see the \verb|Bio.SeqIO| doctests for an example of this. To run the docstring tests only, use \begin{verbatim} $ python run_tests.py doctest \end{verbatim} \chapter{Advanced} \label{chapter:advanced} \section{Parser Design} Many of the older Biopython parsers were built around an event-oriented design that includes Scanner and Consumer objects. Scanners take input from a data source and analyze it line by line, sending off an event whenever it recognizes some information in the data. For example, if the data includes information about an organism name, the scanner may generate an \verb|organism_name| event whenever it encounters a line containing the name. Consumers are objects that receive the events generated by Scanners. Following the previous example, the consumer receives the \verb|organism_name| event, and the processes it in whatever manner necessary in the current application. This is a very flexible framework, which is advantageous if you want to be able to parse a file format into more than one representation. For example, the \verb|Bio.GenBank| module uses this to construct either \verb|SeqRecord| objects or file-format-specific record objects. More recently, many of the parsers added for \verb|Bio.SeqIO| and \verb|Bio.AlignIO| take a much simpler approach, but only generate a single object representation (\verb|SeqRecord| and \verb|MultipleSeqAlignment| objects respectively). In some cases the \verb|Bio.SeqIO| parsers actually wrap another Biopython parser - for example, the \verb|Bio.SwissProt| parser produces SwissProt format specific record objects, which get converted into \verb|SeqRecord| objects. \section{Substitution Matrices} \subsection{SubsMat} This module provides a class and a few routines for generating substitution matrices, similar to BLOSUM or PAM matrices, but based on user-provided data. Additionally, you may select a matrix from MatrixInfo.py, a collection of established substitution matrices. The \verb+SeqMat+ class derives from a dictionary: \begin{verbatim} class SeqMat(dict) \end{verbatim} The dictionary is of the form \verb|{(i1,j1):n1, (i1,j2):n2,...,(ik,jk):nk}| where i, j are alphabet letters, and n is a value. \begin{enumerate} \item Attributes \begin{enumerate} \item \verb|self.alphabet|: a class as defined in Bio.Alphabet \item \verb|self.ab_list|: a list of the alphabet's letters, sorted. Needed mainly for internal purposes \end{enumerate} \item Methods \begin{enumerate} \item \begin{verbatim} __init__(self,data=None,alphabet=None, mat_name='', build_later=0): \end{verbatim} \begin{enumerate} \item \verb|data|: can be either a dictionary, or another SeqMat instance. \item \verb|alphabet|: a Bio.Alphabet instance. If not provided, construct an alphabet from data. \item \verb|mat_name|: matrix name, such as "BLOSUM62" or "PAM250" \item \verb|build_later|: default false. If true, user may supply only alphabet and empty dictionary, if intending to build the matrix later. this skips the sanity check of alphabet size vs. matrix size. \end{enumerate} \item \begin{verbatim} entropy(self,obs_freq_mat) \end{verbatim} \begin{enumerate} \item \verb|obs_freq_mat|: an observed frequency matrix. Returns the matrix's entropy, based on the frequency in \verb|obs_freq_mat|. The matrix instance should be LO or SUBS. \end{enumerate} \item \begin{verbatim} sum(self) \end{verbatim} Calculates the sum of values for each letter in the matrix's alphabet, and returns it as a dictionary of the form \verb|{i1: s1, i2: s2,...,in:sn}|, where: \begin{itemize} \item i: an alphabet letter; \item s: sum of all values in a half-matrix for that letter; \item n: number of letters in alphabet. \end{itemize} \item \begin{verbatim} print_mat(self,f,format="%4d",bottomformat="%4s",alphabet=None) \end{verbatim} prints the matrix to file handle f. \verb|format| is the format field for the matrix values; \verb|bottomformat| is the format field for the bottom row, containing matrix letters. Example output for a 3-letter alphabet matrix: \begin{verbatim} A 23 B 12 34 C 7 22 27 A B C \end{verbatim} The \verb|alphabet| optional argument is a string of all characters in the alphabet. If supplied, the order of letters along the axes is taken from the string, rather than by alphabetical order. \end{enumerate} \item Usage The following section is laid out in the order by which most people wish to generate a log-odds matrix. Of course, interim matrices can be generated and investigated. Most people just want a log-odds matrix, that's all. \begin{enumerate} \item Generating an Accepted Replacement Matrix Initially, you should generate an accepted replacement matrix (ARM) from your data. The values in ARM are the counted number of replacements according to your data. The data could be a set of pairs or multiple alignments. So for instance if Alanine was replaced by Cysteine 10 times, and Cysteine by Alanine 12 times, the corresponding ARM entries would be: \begin{verbatim} ('A','C'): 10, ('C','A'): 12 \end{verbatim} as order doesn't matter, user can already provide only one entry: \begin{verbatim} ('A','C'): 22 \end{verbatim} A SeqMat instance may be initialized with either a full (first method of counting: 10, 12) or half (the latter method, 22) matrices. A full protein alphabet matrix would be of the size 20x20 = 400. A half matrix of that alphabet would be 20x20/2 + 20/2 = 210. That is because same-letter entries don't change. (The matrix diagonal). Given an alphabet size of N: \begin{enumerate} \item Full matrix size:N*N \item Half matrix size: N(N+1)/2 \end{enumerate} The SeqMat constructor automatically generates a half-matrix, if a full matrix is passed. If a half matrix is passed, letters in the key should be provided in alphabetical order: ('A','C') and not ('C',A'). At this point, if all you wish to do is generate a log-odds matrix, please go to the section titled Example of Use. The following text describes the nitty-gritty of internal functions, to be used by people who wish to investigate their nucleotide/amino-acid frequency data more thoroughly. \item Generating the observed frequency matrix (OFM) Use: \begin{verbatim} OFM = SubsMat._build_obs_freq_mat(ARM) \end{verbatim} The OFM is generated from the ARM, only instead of replacement counts, it contains replacement frequencies. \item Generating an expected frequency matrix (EFM) Use: \begin{verbatim} EFM = SubsMat._build_exp_freq_mat(OFM,exp_freq_table) \end{verbatim} \begin{enumerate} \item \verb|exp_freq_table|: should be a FreqTable instance. See section~\ref{sec:freq_table} for detailed information on FreqTable. Briefly, the expected frequency table has the frequencies of appearance for each member of the alphabet. It is implemented as a dictionary with the alphabet letters as keys, and each letter's frequency as a value. Values sum to 1. \end{enumerate} The expected frequency table can (and generally should) be generated from the observed frequency matrix. So in most cases you will generate \verb|exp_freq_table| using: \begin{verbatim} >>> exp_freq_table = SubsMat._exp_freq_table_from_obs_freq(OFM) >>> EFM = SubsMat._build_exp_freq_mat(OFM, exp_freq_table) \end{verbatim} But you can supply your own \verb|exp_freq_table|, if you wish \item Generating a substitution frequency matrix (SFM) Use: \begin{verbatim} SFM = SubsMat._build_subs_mat(OFM,EFM) \end{verbatim} Accepts an OFM, EFM. Provides the division product of the corresponding values. \item Generating a log-odds matrix (LOM) Use: \begin{verbatim} LOM=SubsMat._build_log_odds_mat(SFM[,logbase=10,factor=10.0,round_digit=1]) \end{verbatim} \begin{enumerate} \item Accepts an SFM. \item \verb|logbase|: base of the logarithm used to generate the log-odds values. \item \verb|factor|: factor used to multiply the log-odds values. Each entry is generated by log(LOM[key])*factor And rounded to the \verb|round_digit| place after the decimal point, if required. \end{enumerate} \end{enumerate} \item Example of use As most people would want to generate a log-odds matrix, with minimum hassle, SubsMat provides one function which does it all: \begin{verbatim} make_log_odds_matrix(acc_rep_mat,exp_freq_table=None,logbase=10, factor=10.0,round_digit=0): \end{verbatim} \begin{enumerate} \item \verb|acc_rep_mat|: user provided accepted replacements matrix \item \verb|exp_freq_table|: expected frequencies table. Used if provided, if not, generated from the \verb|acc_rep_mat|. \item \verb|logbase|: base of logarithm for the log-odds matrix. Default base 10. \item \verb|round_digit|: number after decimal digit to which result should be rounded. Default zero. \end{enumerate} \end{enumerate} \subsection{FreqTable} \label{sec:freq_table} \begin{verbatim} FreqTable.FreqTable(UserDict.UserDict) \end{verbatim} \begin{enumerate} \item Attributes: \begin{enumerate} \item \verb|alphabet|: A Bio.Alphabet instance. \item \verb|data|: frequency dictionary \item \verb|count|: count dictionary (in case counts are provided). \end{enumerate} \item Functions: \begin{enumerate} \item \verb|read_count(f)|: read a count file from stream f. Then convert to frequencies \item \verb|read_freq(f)|: read a frequency data file from stream f. Of course, we then don't have the counts, but it is usually the letter frquencies which are interesting. \end{enumerate} \item Example of use: The expected count of the residues in the database is sitting in a file, whitespace delimited, in the following format (example given for a 3-letter alphabet): \begin{verbatim} A 35 B 65 C 100 \end{verbatim} And will be read using the \verb|FreqTable.read_count(file_handle)| function. An equivalent frequency file: \begin{verbatim} A 0.175 B 0.325 C 0.5 \end{verbatim} Conversely, the residue frequencies or counts can be passed as a dictionary. Example of a count dictionary (3-letter alphabet): \begin{verbatim} {'A': 35, 'B': 65, 'C': 100} \end{verbatim} Which means that an expected data count would give a 0.5 frequency for 'C', a 0.325 probability of 'B' and a 0.175 probability of 'A' out of 200 total, sum of A, B and C) A frequency dictionary for the same data would be: \begin{verbatim} {'A': 0.175, 'B': 0.325, 'C': 0.5} \end{verbatim} Summing up to 1. When passing a dictionary as an argument, you should indicate whether it is a count or a frequency dictionary. Therefore the FreqTable class constructor requires two arguments: the dictionary itself, and FreqTable.COUNT or FreqTable.FREQ indicating counts or frequencies, respectively. Read expected counts. readCount will already generate the frequencies Any one of the following may be done to geerate the frequency table (ftab): \begin{verbatim} >>> from SubsMat import * >>> ftab = FreqTable.FreqTable(my_frequency_dictionary, FreqTable.FREQ) >>> ftab = FreqTable.FreqTable(my_count_dictionary, FreqTable.COUNT) >>> ftab = FreqTable.read_count(open('myCountFile')) >>> ftab = FreqTable.read_frequency(open('myFrequencyFile')) \end{verbatim} \end{enumerate} \chapter{Where to go from here -- contributing to Biopython} \section{Bug Reports + Feature Requests} Getting feedback on the Biopython modules is very important to us. Open-source projects like this benefit greatly from feedback, bug-reports (and patches!) from a wide variety of contributors. The main forums for discussing feature requests and potential bugs are the \href{http://biopython.org/wiki/Mailing_lists}{Biopython mailing lists}: \begin{itemize} \item \mailto{biopython@biopython.org} -- An unmoderated list for discussion of anything to do with Biopython. \item \mailto{biopython-dev@biopython.org} -- A more development oriented list that is mainly used by developers (but anyone is free to contribute!). \end{itemize} Additionally, if you think you've found a new bug, you can submit it to our issue tracker at \url{https://github.com/biopython/biopython/issues} (this has replaced the older tracker hosted at \url{http://redmine.open-bio.org/projects/biopython}). This way, it won't get buried in anyone's Inbox and forgotten about. \section{Mailing lists and helping newcomers} We encourage all our uses to sign up to the main Biopython mailing list. Once you've got the hang of an area of Biopython, we'd encourage you to help answer questions from beginners. After all, you were a beginner once. \section{Contributing Documentation} We're happy to take feedback or contributions - either via a bug-report or on the Mailing List. While reading this tutorial, perhaps you noticed some topics you were interested in which were missing, or not clearly explained. There is also Biopython's built in documentation (the docstrings, these are also \href{http://biopython.org/DIST/docs/api}{online}), where again, you may be able to help fill in any blanks. \section{Contributing cookbook examples} As explained in Chapter~\ref{chapter:cookbook}, Biopython now has a wiki collection of user contributed ``cookbook'' examples, \url{http://biopython.org/wiki/Category:Cookbook} -- maybe you can add to this? \section{Maintaining a distribution for a platform} \label{sec:maintain_dist} We currently provide source code archives (suitable for any OS, if you have the right build tools installed), and Windows Installers which are just click and run. This covers all the major operating systems. Most major Linux distributions have volunteers who take these source code releases, and compile them into packages for Linux users to easily install (taking care of dependencies etc). This is really great and we are of course very grateful. If you would like to contribute to this work, please find out more about how your Linux distribution handles this. Below are some tips for certain platforms to maybe get people started with helping out: \begin{description} \item[Windows] -- Windows products typically have a nice graphical installer that installs all of the essential components in the right place. We use Distutils to create a installer of this type fairly easily. You must first make sure you have a C compiler on your Windows computer, and that you can compile and install things (this is the hard bit - see the Biopython installation instructions for info on how to do this). Once you are setup with a C compiler, making the installer just requires doing: \begin{verbatim} python setup.py bdist_wininst \end{verbatim} Now you've got a Windows installer. Congrats! At the moment we have no trouble shipping installers built on 32 bit windows. If anyone would like to look into supporting 64 bit Windows that would be great. \item[RPMs] -- RPMs are pretty popular package systems on some Linux platforms. There is lots of documentation on RPMs available at \url{http://www.rpm.org} to help you get started with them. To create an RPM for your platform is really easy. You just need to be able to build the package from source (having a C compiler that works is thus essential) -- see the Biopython installation instructions for more info on this. To make the RPM, you just need to do: \begin{verbatim} python setup.py bdist_rpm \end{verbatim} This will create an RPM for your specific platform and a source RPM in the directory \verb|dist|. This RPM should be good and ready to go, so this is all you need to do! Nice and easy. \item[Macintosh] -- Since Apple moved to Mac OS X, things have become much easier on the Mac. We generally treat it as just another Unix variant, and installing Biopython from source is just as easy as on Linux. The easiest way to get all the GCC compilers etc installed is to install Apple's X-Code. We might be able to provide click and run installers for Mac OS X, but to date there hasn't been any demand. \end{description} Once you've got a package, please test it on your system to make sure it installs everything in a good way and seems to work properly. Once you feel good about it, send it off to one of the Biopython developers (write to our main mailing list at biopython@biopython.org if you're not sure who to send it to) and you've done it. Thanks! \section{Contributing Unit Tests} Even if you don't have any new functionality to add to Biopython, but you want to write some code, please consider extending our unit test coverage. We've devoted all of Chapter~\ref{sec:regr_test} to this topic. \section{Contributing Code} There are no barriers to joining Biopython code development other than an interest in creating biology-related code in Python. The best place to express an interest is on the Biopython mailing lists -- just let us know you are interested in coding and what kind of stuff you want to work on. Normally, we try to have some discussion on modules before coding them, since that helps generate good ideas -- then just feel free to jump right in and start coding! The main Biopython release tries to be fairly uniform and interworkable, to make it easier for users. You can read about some of (fairly informal) coding style guidelines we try to use in Biopython in the contributing documentation at \url{http://biopython.org/wiki/Contributing}. We also try to add code to the distribution along with tests (see Chapter~\ref{sec:regr_test} for more info on the regression testing framework) and documentation, so that everything can stay as workable and well documented as possible (including docstrings). This is, of course, the most ideal situation, under many situations you'll be able to find other people on the list who will be willing to help add documentation or more tests for your code once you make it available. So, to end this paragraph like the last, feel free to start working! Please note that to make a code contribution you must have the legal right to contribute it and license it under the Biopython license. If you wrote it all yourself, and it is not based on any other code, this shouldn't be a problem. However, there are issues if you want to contribute a derivative work - for example something based on GPL or LPGL licenced code would not be compatible with our license. If you have any queries on this, please discuss the issue on the biopython-dev mailing list. Another point of concern for any additions to Biopython regards any build time or run time dependencies. Generally speaking, writing code to interact with a standalone tool (like BLAST, EMBOSS or ClustalW) doesn't present a big problem. However, any dependency on another library - even a Python library (especially one needed in order to compile and install Biopython like NumPy) would need further discussion. Additionally, if you have code that you don't think fits in the distribution, but that you want to make available, we maintain Script Central (\url{http://biopython.org/wiki/Scriptcentral}) which has pointers to freely available code in Python for bioinformatics. Hopefully this documentation has got you excited enough about Biopython to try it out (and most importantly, contribute!). Thanks for reading all the way through! \chapter{Appendix: Useful stuff about Python} \label{sec:appendix} If you haven't spent a lot of time programming in Python, many questions and problems that come up in using Biopython are often related to Python itself. This section tries to present some ideas and code that come up often (at least for us!) while using the Biopython libraries. If you have any suggestions for useful pointers that could go here, please contribute! \section{What the heck is a handle?} \label{sec:appendix-handles} Handles are mentioned quite frequently throughout this documentation, and are also fairly confusing (at least to me!). Basically, you can think of a handle as being a ``wrapper'' around text information. Handles provide (at least) two benefits over plain text information: \begin{enumerate} \item They provide a standard way to deal with information stored in different ways. The text information can be in a file, or in a string stored in memory, or the output from a command line program, or at some remote website, but the handle provides a common way of dealing with information in all of these formats. \item They allow text information to be read incrementally, instead of all at once. This is really important when you are dealing with huge text files which would use up all of your memory if you had to load them all. \end{enumerate} Handles can deal with text information that is being read (e.~g.~reading from a file) or written (e.~g.~writing information to a file). In the case of a ``read'' handle, commonly used functions are \verb|read()|, which reads the entire text information from the handle, and \verb|readline()|, which reads information one line at a time. For ``write'' handles, the function \verb|write()| is regularly used. The most common usage for handles is reading information from a file, which is done using the built-in Python function \verb|open|. Here, we open a handle to the file \href{examples/m\_cold.fasta}{m\_cold.fasta} (also available online \href{http://biopython.org/DIST/docs/tutorial/examples/m\_cold.fasta}{here}): \begin{verbatim} >>> handle = open("m_cold.fasta", "r") >>> handle.readline() ">gi|8332116|gb|BE037100.1|BE037100 MP14H09 MP Mesembryanthemum ...\n" \end{verbatim} Handles are regularly used in Biopython for passing information to parsers. For example, since Biopython 1.54 the main functions in \verb|Bio.SeqIO| and \verb|Bio.AlignIO| have allowed you to use a filename instead of a handle: \begin{verbatim} from Bio import SeqIO for record in SeqIO.parse("m_cold.fasta", "fasta"): print(record.id, len(record)) \end{verbatim} On older versions of Biopython you had to use a handle, e.g. \begin{verbatim} from Bio import SeqIO handle = open("m_cold.fasta", "r") for record in SeqIO.parse(handle, "fasta"): print(record.id, len(record)) handle.close() \end{verbatim} This pattern is still useful - for example suppose you have a gzip compressed FASTA file you want to parse: \begin{verbatim} import gzip from Bio import SeqIO handle = gzip.open("m_cold.fasta.gz") for record in SeqIO.parse(handle, "fasta"): print(record.id, len(record)) handle.close() \end{verbatim} See Section~\ref{sec:SeqIO_compressed} for more examples like this, including reading bzip2 compressed files. \subsection{Creating a handle from a string} One useful thing is to be able to turn information contained in a string into a handle. The following example shows how to do this using \verb|cStringIO| from the Python standard library: %doctest \begin{verbatim} >>> my_info = 'A string\n with multiple lines.' >>> print(my_info) A string with multiple lines. >>> from StringIO import StringIO >>> my_info_handle = StringIO(my_info) >>> first_line = my_info_handle.readline() >>> print(first_line) A string >>> second_line = my_info_handle.readline() >>> print(second_line) with multiple lines. \end{verbatim} \begin{thebibliography}{99} \bibitem{cock2009} Peter J. A. Cock, Tiago Antao, Jeffrey T. Chang, Brad A. Chapman, Cymon J. Cox, Andrew Dalke, Iddo Friedberg, Thomas Hamelryck, Frank Kauff, Bartek Wilczynski, Michiel J. L. de Hoon: ``Biopython: freely available Python tools for computational molecular biology and bioinformatics''. {\it Bioinformatics} {\bf 25} (11), 1422--1423 (2009). \href{http://dx.doi.org/10.1093/bioinformatics/btp163}{doi:10.1093/bioinformatics/btp163}, \bibitem{pritchard2006} Leighton Pritchard, Jennifer A. White, Paul R.J. Birch, Ian K. Toth: ``GenomeDiagram: a python package for the visualization of large-scale genomic data''. {\it Bioinformatics} {\bf 22} (5): 616--617 (2006). \href{http://dx.doi.org/10.1093/bioinformatics/btk021}{doi:10.1093/bioinformatics/btk021}, \bibitem{toth2006} Ian K. Toth, Leighton Pritchard, Paul R. J. Birch: ``Comparative genomics reveals what makes an enterobacterial plant pathogen''. {\it Annual Review of Phytopathology} {\bf 44}: 305--336 (2006). \href{http://dx.doi.org/10.1146/annurev.phyto.44.070505.143444}{doi:10.1146/annurev.phyto.44.070505.143444}, \bibitem{vanderauwera2009} G\'eraldine A. van der Auwera, Jaroslaw E. Kr\'ol, Haruo Suzuki, Brian Foster, Rob van Houdt, Celeste J. Brown, Max Mergeay, Eva M. Top: ``Plasmids captured in C. metallidurans CH34: defining the PromA family of broad-host-range plasmids''. \textit{Antonie van Leeuwenhoek} {\bf 96} (2): 193--204 (2009). \href{http://dx.doi.org/10.1007/s10482-009-9316-9}{doi:10.1007/s10482-009-9316-9} \bibitem{proux2002} Caroline Proux, Douwe van Sinderen, Juan Suarez, Pilar Garcia, Victor Ladero, Gerald F. Fitzgerald, Frank Desiere, Harald Br\"ussow: ``The dilemma of phage taxonomy illustrated by comparative genomics of Sfi21-Like Siphoviridae in lactic acid bacteria''. \textit{Journal of Bacteriology} {\bf 184} (21): 6026--6036 (2002). \href{http://dx.doi.org/10.1128/JB.184.21.6026-6036.2002}{http://dx.doi.org/10.1128/JB.184.21.6026-6036.2002} \bibitem{jupe2012} Florian Jupe, Leighton Pritchard, Graham J. Etherington, Katrin MacKenzie, Peter JA Cock, Frank Wright, Sanjeev Kumar Sharma1, Dan Bolser, Glenn J Bryan, Jonathan DG Jones, Ingo Hein: ``Identification and localisation of the NB-LRR gene family within the potato genome''. \textit{BMC Genomics} {\bf 13}: 75 (2012). \href{http://dx.doi.org/10.1186/1471-2164-13-75}{http://dx.doi.org/10.1186/1471-2164-13-75} \bibitem{cock2010} Peter J. A. Cock, Christopher J. Fields, Naohisa Goto, Michael L. Heuer, Peter M. Rice: ``The Sanger FASTQ file format for sequences with quality scores, and the Solexa/Illumina FASTQ variants''. \textit{Nucleic Acids Research} {\bf 38} (6): 1767--1771 (2010). \href{http://dx.doi.org/10.1093/nar/gkp1137}{doi:10.1093/nar/gkp1137} \bibitem{brown1999} Patrick O. Brown, David Botstein: ``Exploring the new world of the genome with DNA microarrays''. \textit{Nature Genetics} {\bf 21} (Supplement 1), 33--37 (1999). \href{http://dx.doi.org/10.1038/4462}{doi:10.1038/4462} \bibitem{talevich2012} Eric Talevich, Brandon M. Invergo, Peter J.A. Cock, Brad A. Chapman: ``Bio.Phylo: A unified toolkit for processing, analyzing and visualizing phylogenetic trees in Biopython''. \textit{BMC Bioinformatics} {\bf 13}: 209 (2012). \href{http://dx.doi.org/10.1186/1471-2105-13-209}{doi:10.1186/1471-2105-13-209} \bibitem{cornish1985} Athel Cornish-Bowden: ``Nomenclature for incompletely specified bases in nucleic acid sequences: Recommendations 1984.'' \textit{Nucleic Acids Research} {\bf 13} (9): 3021--3030 (1985). \href{http://dx.doi.org/10.1093/nar/13.9.3021}{doi:10.1093/nar/13.9.3021} \bibitem{cavener1987} Douglas R. Cavener: ``Comparison of the consensus sequence flanking translational start sites in Drosophila and vertebrates.'' \textit{Nucleic Acids Research} {\bf 15} (4): 1353--1361 (1987). \href{http://dx.doi.org/10.1093/nar/15.4.1353}{doi:10.1093/nar/15.4.1353} \bibitem{bailey1994} Timothy L. Bailey and Charles Elkan: ``Fitting a mixture model by expectation maximization to discover motifs in biopolymers'', \textit{Proceedings of the Second International Conference on Intelligent Systems for Molecular Biology} 28--36. AAAI Press, Menlo Park, California (1994). \bibitem{chapman2000} Brad Chapman and Jeff Chang: ``Biopython: Python tools for computational biology''. \textit{ACM SIGBIO Newsletter} {\bf 20} (2): 15--19 (August 2000). \bibitem{dehoon2004} Michiel J. L. de Hoon, Seiya Imoto, John Nolan, Satoru Miyano: ``Open source clustering software''. \textit{Bioinformatics} {\bf 20} (9): 1453--1454 (2004). \href{http://dx.doi.org/10.1093/bioinformatics/bth078}{doi:10.1093/bioinformatics/bth078} \bibitem{eisen1998} Michiel B. Eisen, Paul T. Spellman, Patrick O. Brown, David Botstein: ``Cluster analysis and display of genome-wide expression patterns''. \textit{Proceedings of the National Academy of Science USA} {\bf 95} (25): 14863--14868 (1998). \href{http://dx.doi.org/10.1073/pnas.96.19.10943-c}{doi:10.1073/pnas.96.19.10943-c} \bibitem{golub1971} Gene H. Golub, Christian Reinsch: ``Singular value decomposition and least squares solutions''. In \textit{Handbook for Automatic Computation}, {\bf 2}, (Linear Algebra) (J. H. Wilkinson and C. Reinsch, eds), 134--151. New York: Springer-Verlag (1971). \bibitem{golub1989} Gene H. Golub, Charles F. Van Loan: \textit{Matrix computations}, 2nd edition (1989). \bibitem{hamelryck2003a} Thomas Hamelryck and Bernard Manderick: 11PDB parser and structure class implemented in Python''. \textit{Bioinformatics}, \textbf{19} (17): 2308--2310 (2003) \href{http://dx.doi.org/10.1093/bioinformatics/btg299}{doi: 10.1093/bioinformatics/btg299}. \bibitem{hamelryck2003b} Thomas Hamelryck: ``Efficient identification of side-chain patterns using a multidimensional index tree''. \textit{Proteins} {\bf 51} (1): 96--108 (2003). \href{http://dx.doi.org/10.1002/prot.10338}{doi:10.1002/prot.10338} \bibitem{hamelryck2005} Thomas Hamelryck: ``An amino acid has two sides; A new 2D measure provides a different view of solvent exposure''. \textit{Proteins} {\bf 59} (1): 29--48 (2005). \href{http://dx.doi.org/10.1002/prot.20379}{doi:10.1002/prot.20379}. \bibitem{hartigan1975} John A. Hartiga. \textit{Clustering algorithms}. New York: Wiley (1975). \bibitem{jain1988} Anil L. Jain, Richard C. Dubes: \textit{Algorithms for clustering data}. Englewood Cliffs, N.J.: Prentice Hall (1988). \bibitem{kachitvichyanukul1988} Voratas Kachitvichyanukul, Bruce W. Schmeiser: Binomial Random Variate Generation. \textit{Communications of the ACM} {\bf 31} (2): 216--222 (1988). \href{http://dx.doi.org/10.1145/42372.42381}{doi:10.1145/42372.42381} \bibitem{kohonen1997} Teuvo Kohonen: ``Self-organizing maps'', 2nd Edition. Berlin; New York: Springer-Verlag (1997). \bibitem{lecuyer1988} Pierre L'Ecuyer: ``Efficient and Portable Combined Random Number Generators.'' \textit{Communications of the ACM} {\bf 31} (6): 742--749,774 (1988). \href{http://dx.doi.org/10.1145/62959.62969}{doi:10.1145/62959.62969} \bibitem{majumdar2005} Indraneel Majumdar, S. Sri Krishna, Nick V. Grishin: ``PALSSE: A program to delineate linear secondary structural elements from protein structures.'' \textit{BMC Bioinformatics}, {\bf 6}: 202 (2005). \href{http://dx.doi.org/10.1186/1471-2105-6-202}{doi:10.1186/1471-2105-6-202}. \bibitem{matys2003} V. Matys, E. Fricke, R. Geffers, E. G\"ossling, M. Haubrock, R. Hehl, K. Hornischer, D. Karas, A.E. Kel, O.V. Kel-Margoulis, D.U. Kloos, S. Land, B. Lewicki-Potapov, H. Michael, R. M\"unch, I. Reuter, S. Rotert, H. Saxel, M. Scheer, S. Thiele, E. Wingender E: ``TRANSFAC: transcriptional regulation, from patterns to profiles.'' Nucleic Acids Research {\bf 31} (1): 374--378 (2003). \href{http://dx.doi.org/10.1093/nar/gkg108}{doi:10.1093/nar/gkg108} \bibitem{sibson1973} Robin Sibson: ``SLINK: An optimally efficient algorithm for the single-link cluster method''. \textit{The Computer Journal} {\bf 16} (1): 30--34 (1973). \href{http://dx.doi.org/10.1093/comjnl/16.1.30}{doi:10.1093/comjnl/16.1.30} \bibitem{snedecor1989} George W. Snedecor, William G. Cochran: \textit{Statistical methods}. Ames, Iowa: Iowa State University Press (1989). \bibitem{tamayo1999} Pablo Tamayo, Donna Slonim, Jill Mesirov, Qing Zhu, Sutisak Kitareewan, Ethan Dmitrovsky, Eric S. Lander, Todd R. Golub: ``Interpreting patterns of gene expression with self-organizing maps: Methods and application to hematopoietic differentiation''. \textit{Proceedings of the National Academy of Science USA} {\bf 96} (6): 2907--2912 (1999). \href{http://dx.doi.org/10.1073/pnas.96.6.2907}{doi:10.1073/pnas.96.6.2907} \bibitem{tryon1970} Robert C. Tryon, Daniel E. Bailey: \textit{Cluster analysis}. New York: McGraw-Hill (1970). \bibitem{tukey1977} John W. Tukey: ``Exploratory data analysis''. Reading, Mass.: Addison-Wesley Pub. Co. (1977). \bibitem{yeung2001} Ka Yee Yeung, Walter L. Ruzzo: ``Principal Component Analysis for clustering gene expression data''. \textit{Bioinformatics} {\bf 17} (9): 763--774 (2001). \href{http://dx.doi.org/10.1093/bioinformatics/17.9.763}{doi:10.1093/bioinformatics/17.9.763} \bibitem{saldanha2004} Alok Saldanha: ``Java Treeview---extensible visualization of microarray data''. \textit{Bioinformatics} {\bf 20} (17): 3246--3248 (2004). \href{http://dx.doi.org/10.1093/bioinformatics/bth349}{http://dx.doi.org/10.1093/bioinformatics/bth349} \end{thebibliography} \end{document} biopython-1.63/Doc/cookbook/0000755000175000017500000000000012250104773015370 5ustar tratra00000000000000biopython-1.63/Doc/cookbook/motif/0000755000175000017500000000000012250104773016506 5ustar tratra00000000000000biopython-1.63/Doc/cookbook/motif/Makefile0000644000175000017500000000112012250104543020133 0ustar tratra00000000000000# create pdf, txt and html documentation FILENAME=motif all: ${FILENAME}.html ${FILENAME}.pdf ${FILENAME}.txt clean: rm -f ${FILENAME}.aux rm -f ${FILENAME}.log rm -f ${FILENAME}.out rm -f ${FILENAME}.toc rm -f ${FILENAME}.haux rm -f ${FILENAME}.htoc distclean: clean rm -f ${FILENAME}.pdf rm -f ${FILENAME}.html rm -f ${FILENAME}.txt ${FILENAME}.pdf: ${FILENAME}.tex pdflatex ${FILENAME}.tex pdflatex ${FILENAME}.tex pdflatex ${FILENAME}.tex ${FILENAME}.html: ${FILENAME}.tex hevea -fix ${FILENAME}.tex ${FILENAME}.txt: ${FILENAME}.tex hevea -fix -text ${FILENAME}.tex biopython-1.63/Doc/cookbook/motif/motif.tex0000644000175000017500000004755112250104543020355 0ustar tratra00000000000000% Documentation describing writing Tests for Biopython modules \documentclass{article} \usepackage{url} \usepackage{fullpage} \usepackage{hevea} \usepackage{graphicx} % Make links between references \usepackage{hyperref} \newif\ifpdf \ifx\pdfoutput\undefined \pdffalse \else \pdfoutput=1 \pdftrue \fi \ifpdf \hypersetup{colorlinks=true, hyperindex=true, citecolor=red, urlcolor=blue} \fi \begin{document} \title{Sequence motif analysis using Biopython} \author{Bartek Wilczynski (bartek@mimuw.edu.pl)} \maketitle \tableofcontents \section{Short introduction} \label{sec:intro} This short tutorial describes some of the functionality of the \verb|Bio.Motif| package included in Biopython distribution. It is intended for people who are involved in analysis of sequence motif, so I'll assume that you are familiar with basic notions of motif analysis. In case something is unclear, please look into Section \ref{sec:links} for some relevant links. It should be also noted, that \verb|Bio.Motif| is based on two Biopython modules, \verb|Bio.AlignAce| and \verb|Bio.MEME| and is meant to replace them. It provides (almost) all of the functionality of these modules and unifies the basic motif object implementation. Speaking of other libraries, if you are reading this you might be interested in the TAMO \cite{tamo} (\url{http://fraenkel.mit.edu/TAMO/}), which is another python library designed to deal with sequence motifs. It supports more \emph{de-novo} motif finders, but it is not a part of biopython (so requires a bit of work) and has some restrictions on commercial use. \section{Motif objects} \label{sec:object} Since we are interested in motif analysis, we need to take a look at \verb|Motif| objects in the first place. For that we need to import the Motif library: \begin{verbatim} from Bio import Motif \end{verbatim} and we can start creating our first motif objects. Let's create a DNA motif: \begin{verbatim} from Bio.Alphabet import IUPAC m=Motif.Motif(alphabet=IUPAC.unambiguous_dna) \end{verbatim} This is for now just an empty container, so let's add some sequences to our newly created motif: \begin{verbatim} from Bio.Seq import Seq m.add_instance(Seq("TATAA",m.alphabet)) m.add_instance(Seq("TATTA",m.alphabet)) m.add_instance(Seq("TATAA",m.alphabet)) m.add_instance(Seq("TATAA",m.alphabet)) \end{verbatim} Now we have a full \verb|Motif| instance, so we can try to get some basic information about it. Let's start with length and consensus sequence: \begin{verbatim} >>> m.length 5 >>> m.consensus Seq('TATAA', IUPACUnambiguousDNA()) \end{verbatim} In case of DNA motifs, we can also get a reverse complement of a motif: \begin{verbatim} >>> m.reverse_complement() >>> m.reverse_complement().consensus Seq('TTATA', IUPACUnambiguousDNA()) >>> m.reverse_complement().instances [Seq('TTATA', IUPACUnambiguousDNA()), Seq('TAATA', IUPACUnambiguousDNA()), Seq('TTATA', IUPACUnambiguousDNA()), Seq('TTATA', IUPACUnambiguousDNA())] \end{verbatim} We can also calculate the information content of a motif with a simple call: \begin{verbatim} >>> m.ic() 5.2735010263278932 \end{verbatim} This gives us a number of bits of information provided by the motif, which tells us how much we are different from background. The most common representation of a motif is a PWM (Position Weight Matrix). It summarizes the probabilities of finding any symbol (in this case nucleotide) in any position of a motif. It can be computed by calling the \verb|.pwm()| method: \begin{verbatim} >>> m.pwm() [{'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}, {'A': 0.05, 'C': 0.05, 'T': 0.85, 'G': 0.05}, {'A': 0.65, 'C': 0.05, 'T': 0.25, 'G': 0.05}, {'A': 0.85, 'C': 0.05, 'T': 0.05, 'G': 0.05}] \end{verbatim} The probabilities in the motif's PWM are based on the counts in the instances, but we can see, that even though there were no Gs and no Cs in the instances, we still have non-zero probabilities assigned to them. These come from pseudo-counts which are, roughly speaking, a commonly used way to acknowledge the incompleteness of our knowledge and avoid technical problems with calculating logarithms of $0$. We can control the way that pseudo-counts are added with two properties of Motif objects \verb|.background| is the probability distribution over all symbols in the alphabet that we assume is found in background (usually based on the GC content of the respective genome). It is by default set to a uniform distribution upon creation of a motif: \begin{verbatim} >>> m.background {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25} \end{verbatim} The other parameter is \verb|.beta|, which states the amount of pseudo-counts we should add to the PWM. By default it is set to $1.0$, \begin{verbatim} >>> m.beta 1.0 \end{verbatim} so that the total input of pseudo-counts is equal to that of one instance. Using the background distribution and pwm with pseudo-counts added, it's easy to compute the log-odds ratios, telling us what are the log odds of a particular symbol to be coming from a motif against the background. We can use the \verb|.log_odds()| method: \begin{verbatim} >>> m.log_odds() [{'A': -2.3219280948873622, 'C': -2.3219280948873622, 'T': 1.7655347463629771, 'G': -2.3219280948873622}, {'A': 1.7655347463629771, 'C': -2.3219280948873622, 'T': -2.3219280948873622, 'G': -2.3219280948873622}, {'A': -2.3219280948873622, 'C': -2.3219280948873622, 'T': 1.7655347463629771, 'G': -2.3219280948873622}, {'A': 1.3785116232537298, 'C': -2.3219280948873622, 'T': 0.0, 'G': -2.3219280948873622}, {'A': 1.7655347463629771, 'C': -2.3219280948873622, 'T': -2.3219280948873622, 'G': -2.3219280948873622} ] \end{verbatim} Here we can see positive values for symbols more frequent in the motif than in the background and negative for symbols more frequent in the background. $0.0$ means that it's equally likely to see a symbol in background and in the motif (e.g. 'T' in the second-last position). \subsection{Reading and writing} \label{sec:io} Creating motifs from instances by hand is useful but boring, so it's useful to have some I/O functions for reading and writing motifs. There are no really well established standards for storing motifs, but there's a couple of formats which are more used than others. The most important distinction is whether the motif representation is based on instances or on some version of PWM matrix. On of the most popular motif databases JASPAR (\url{http://jaspar.genereg.net}) stores motifs in both formats, so let's look at how we can import JASPAR motifs from instances: \begin{verbatim} arnt=Motif.read(open("Arnt.sites"),"jaspar-sites") \end{verbatim} and from a count matrix: \begin{verbatim} srf=Motif.read(open("SRF.pfm"),"jaspar-pfm") \end{verbatim} The \verb|arnt| and \verb|srf| motifs can both do the same things for us, but they use different internal representations of the motif. We can tell that by inspecting the \verb|has_counts| and \verb|has_instances| properties: \begin{verbatim} >>> arnt.has_instances True >>> srf.has_instances False >>> srf.has_counts True >>> srf.counts {'A': [2, 9, 0, 1, 32, 3, 46, 1, 43, 15, 2, 2], 'C': [1, 33, 45, 45, 1, 1, 0, 0, 0, 1, 0, 1], 'G': [39, 2, 1, 0, 0, 0, 0, 0, 0, 0, 44, 43], 'T': [4, 2, 0, 0, 13, 42, 0, 45, 3, 30, 0, 0]} \end{verbatim} There are conversion functions, which can help us convert between different representations: \begin{verbatim} >>> arnt.make_counts_from_instances() {'A': [8, 38, 0, 0, 0, 0], 'C': [32, 0, 40, 0, 0, 0], 'G': [0, 2, 0, 40, 0, 40], 'T': [0, 0, 0, 0, 40, 0]} >>> srf.make_instances_from_counts() [Seq('GGGAAAAAAAGG', IUPACUnambiguousDNA()), Seq('GGCCAAATAAGG', IUPACUnambiguousDNA()), Seq('GACCAAATAAGG', IUPACUnambiguousDNA()), .... \end{verbatim} The important thing to remember here is that the method \verb|make_instances_from_counts()| creates fake instances, because usually there are very many possible sets of instances which give rise to the same pwm, and if we have only the count matrix, we cannot reconstruct the original one. This does not make any difference if we are using the PWM as the representation of the motif, but one should be careful with exporting instances from count-based motifs. Speaking of exporting, let's look at export functions. We can export to fasta: \begin{verbatim} >>> print m.format("fasta") > instance 0 TATAA > instance 1 TATTA > instance 2 TATAA > instance 3 TATAA \end{verbatim} or to TRANSFAC-like matrix format (used by some motif processing software) \begin{verbatim} >>> print m.format("transfac") XX TY Motif ID BF undef P0 G A T C 01 0 0 4 0 02 0 4 0 0 03 0 0 4 0 04 0 3 1 0 05 0 4 0 0 XX \end{verbatim} Finally, if we have internet access, we can create a weblogo using a nice service at \url{http://weblogo.berkeley.edu} by Crooks et al. \cite{crooks2004}: \begin{verbatim} >>> arnt.weblogo("Arnt.png") \end{verbatim} We should get our logo saved as a png in the specified file. \subsection{Searching for instances} \label{sec:search} The most frequent use for a motif is to find its instances in some sequence. For the sake of this section, we will use an artificial sequence like this: \begin{verbatim} test_seq=Seq("TATGATGTAGTATAATATAATTATAA",m.alphabet) \end{verbatim} The simplest way to find instances, is to look for exact matches of the true instances of the motif: \begin{verbatim} >>> for pos,seq in m.search_instances(test_seq): ... print pos,seq.tostring() ... 10 TATAA 15 TATAA 21 TATAA \end{verbatim} We can do the same with the reverse complement (to find instances on the complementary strand): \begin{verbatim} >>> for pos,seq in m.reverse_complement().search_instances(test_seq): ... print pos,seq.tostring() ... 12 TAATA 20 TTATA \end{verbatim} It's just as easy to look for positions, giving rise to high log-odds scores against our motif: \begin{verbatim} >>> for position, score in m.search(test_seq,threshold=5.0): ... print position, score ... 10 8.44065060871 -12 7.06213898545 15 8.44065060871 -20 8.44065060871 21 8.44065060871 \end{verbatim} You may notice the threshold parameter, here set arbitrarily to $5.0$. This is in $log_2$, so we are now looking only for words, which are 32 times more likely to occur under the motif model than in the background. The default threshold is $0.0$, which selects everything that looks more like the motif, than the background. If you want to use a less arbitrary way of selecting thresholds, you can explore the \verb|Motif.score_distribution| class implementing an distribution of scores for a given motif. Since the space for a score distribution grows exponentially with motif.length, we are using an approximation with a given precision to keep computation cost manageable: \begin{verbatim} >>> sd = Motif.score_distribution(m,precision=10**4) \end{verbatim} The \verb+sd+ object can be used to determine a number of different thresholds. We can specify the requested false-positive rate (probability of ``finding'' a motif instance in background generated sequence): \begin{verbatim} >>> sd.threshold_fpr(0.01) 4.3535838726139886 \end{verbatim} or the false-negative rate (probability of ``not finding'' an instance generated from the motif): \begin{verbatim} >>> sd.threshold_fnr(0.1) 0.26651713652234044 \end{verbatim} or a threshold (approximately) satisfying some relation between fpr and fnr ($\frac{fnr}{fpr}$, as proposed by Rahmann \cite{Rahmann2003}): \begin{verbatim} >>> sd.threshold_balanced(1000) 8.4406506087056368 \end{verbatim} or a threshold satisfying (roughly) the equality between the false-positive rate and the $-log$ of the information content (as used in patser software by Hertz and Stormo). For example, in case of our motif, you can get the threshold giving you exactly the same results (for this sequence) as searching for instances with balanced threshold with rate of $1000$. \begin{verbatim} >>> threshold=sd.threshold_balanced(1000) >>> for position, score in m.search(test_seq, threshold=threshold): ... print position, score ... 10 8.44065060871 15 8.44065060871 -20 8.44065060871 21 8.44065060871 \end{verbatim} \subsection{Comparing motifs} \label{sec:comp} Once we have more than one motif, we might want to compare them. For that, we have currently three different methods of \verb|Bio.Motif| objects. Before we start comparing motifs, I should point out that motif boundaries are usually quite arbitrary. This means, that we often need to compare motifs of different lengths, so comparison needs to involve some kind of alignment. This means, that we have to take into account two things: \begin{itemize} \item alignment of motifs \item some function to compare aligned motifs \end{itemize} In \verb|Bio.Motif| we have 3 different functions for motif comparison, which are based on the same idea behind motif alignment, but use different functions to compare aligned motifs. Briefly speaking, we are using ungapped alignment of PWMs and substitute the missing columns at the beginning and end of the matrices with background distribution. All three comparison functions are written in such a way, that they can be interpreted as distance measures, however only one (\verb|dist_dpq|) satisfies the triangle inequality. All of them return the minimal distance and the corresponding offset between motifs. To show how these functions work, let us first load another motif, which is similar to our test motif \verb|m|: \begin{verbatim} >>> ubx=Motif.read(open("Ubx.pfm"),"jaspar-pfm") >>> ubx.consensus Seq('TAAT', IUPACUnambiguousDNA()) \end{verbatim} The first function we'll use to compare these motifs is based on Pearson correlation. Since we want it to resemble a distance measure. we actually take $1-r$, where r is the Pearson correlation coefficient (PCC): \begin{verbatim} >>> m.dist_pearson(ubx) (0.41740393308237722, 2) \end{verbatim} This means, that the best PCC between motif \verb|m| and \verb|Ubx| is obtained with the following alignment: \begin{verbatim} bbTAAT TATAAb \end{verbatim} where \verb|b| stands for background distribution. The PCC itself is roughly $1-0.42=0.58$. If we try the reverse complement of the Ubx motif: \begin{verbatim} >>> m.dist_pearson(ubx.reverse_complement()) (0.25784180151584823, 1) \end{verbatim} We can see that the PCC is better (almost $0.75$), and the alignment is also different: \begin{verbatim} bATTA TATAA \end{verbatim} There are two other functions \verb|dist_dpq|, which is a true metric based on the Kullback-Leibler divergence and proposed by Endres and Sendelin \cite{Endres2003} \begin{verbatim} >>> m.dist_dpq(ubx.reverse_complement()) (0.49292358382899853, 1) \end{verbatim} In case you need yet another way of comparing motifs, you can use the \verb|dist_product| method, which is based on the product of probabilities which can be interpreted as the probability of independently generating the same instance by both motifs. \begin{verbatim} >>> m.dist_product(ubx.reverse_complement()) (0.16224587301064275, 1) \end{verbatim} \section{\emph{De novo} motif finding} \label{sec:find} Currently, biopython has only limited support for \emph{de novo} motif finding. Namely, we support running and parsing of AlignAce \cite{Hughes2000} and MEME\cite{Bailey1994}. Since the number of motif finding tools is growing rapidly, contributions of new parsers are welcome. \subsection{MEME} \label{sec:meme} Let's assume, you have run MEME on sequences of your choice with your favorite parameters and saved the output in the file \verb|meme.out|. You can retrieve the motifs reported by MEME by running the following piece of code: \begin{verbatim} >>> motifsM = list(Motif.parse(open("meme.out"),"MEME")) >>> motifsM [] \end{verbatim} Besides the most wanted list of motifs, the result object contains more useful information, accessible through properties with self-explanatory names: \begin{itemize} \item \verb|.alphabet| \item \verb|.datafile| \item \verb|.sequence_names| \item \verb|.version| \item \verb|.command| \end{itemize} The motifs returned by MEMEParser can be treated exactly like regular Motif objects (with instances), they also provide some extra functionality, by adding additional information about the instances. \begin{verbatim} >>> motifsM[0].consensus Seq('CTCAATCGTA', IUPACUnambiguousDNA()) >>> motifsM[0].instances[0].pvalue 8.71e-07 >>> motifsM[0].instances[0].sequence_name 'SEQ10;' >>> motifsM[0].instances[0].start 3 >>> motifsM[0].instances[0].strand '+' \end{verbatim} \subsection{AlignAce} \label{sec:alignace} We can do very similar things with AlignACE program. Assume, you have your output in the file \verb|alignace.out|. You can parse your output with the following code: \begin{verbatim} >>> motifsA=list(Motif.parse(open("alignace.out"),"AlignAce")) \end{verbatim} Again, your motifs behave as they should: \begin{verbatim} >>> motifsA[0].consensus Seq('TCTACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} In fact you can even see, that AlignAce found a very similar motif as MEME, it is just a longer version of a reverse complement of MEME motif: \begin{verbatim} >>> motifsM[0].reverse_complement().consensus Seq('TACGATTGAG', IUPACUnambiguousDNA()) \end{verbatim} If you have AlignAce installed on the same machine, you can also run it directly from Biopython. Short example of how this can be done is shown below (other parameters can be specified as keyword parameters): \begin{verbatim} >>> command="/opt/bin/AlignACE" >>> input_file="test.fa" >>> result=Motif.AlignAce(input_file,cmd=command,gcback=0.6,numcols=10) >>> result (, , ) \end{verbatim} Since AlignAce prints all its output to standard output, you can get to your motifs by parsing the second member of the result: \begin{verbatim} motifs=list(Motif.parse(result[1],"AlignAce")) \end{verbatim} \section{Useful links } \label{sec:links} Wikipedia definitions: \begin{itemize} \item \url{http://en.wikipedia.org/wiki/Sequence_motif} \item \url{http://en.wikipedia.org/wiki/Position_weight_matrix} \item \url{http://en.wikipedia.org/wiki/Consensus_sequence} \end{itemize} Motif finding and comparison methods: \begin{itemize} \item AlignAce and CompareAce\url{http://www.psc.edu/general/software/packages/alignace/} \item MEME and MAST \url{http://meme.sdsc.edu/meme/} \item BioProspector \url{http://bioprospector.stanford.edu/} \item MDScan \url{http://ai.stanford.edu/~xsliu/MDscan/} \item Weeder \item STAMP \url{http://www.benoslab.pitt.edu/stamp/} \item WebMotifs \url{http://fraenkel.mit.edu/webmotifs/} \item Comparison of different programs \url{http://bio.cs.washington.edu/assessment/} \end{itemize} \begin{thebibliography}{10} \bibitem{tamo} Gordon DB, Nekludova L, McCallum S, Fraenkel E: \textbf{TAMO: a flexible, object-oriented framework for analyzing transcriptional regulation using DNA-sequence motifs.} \emph{Bioinformatics} 2005, \textbf{21}(14):3164--5. \bibitem{crooks2004} Crooks GE, Hon G, Chandonia JM, steven E~Brenner: \textbf{WebLogo: A Sequence Logo Generator}. \emph{Genome Research} 2004, \textbf{14}:1188--1190. \bibitem{Rahmann2003} Rahmann S, Mueller T, Vingron M: \textbf{On the power of profiles for transcription factor binding site detection.} \emph{Stat Appl Genet Mol Biol} 2003, \textbf{2}:Article7. \bibitem{Endres2003} Endres D, Schindelin J: \textbf{A new metric for probability distributions}. \emph{IEEE transactions on Information Theory} 2003, \textbf{49}(7):1858--1860. \bibitem{Bailey1994} Bailey TL, Elkan C: \textbf{{Fitting a mixture model by expectation maximization to discover motifs in biopolymers}}. \emph{Proc Int Conf Intell Syst Mol Biol} 1994, \textbf{2}:28--36. \bibitem{Hughes2000} Hughes JD, Estep PW, Tavazoie S, Church GM: \textbf{{Computational identification of cis-regulatory elements associated with groups of functionally related genes in Saccharomyces cerevisiae}}. \emph{J Mol Biol} 2000, \textbf{296}(5):1205--1214. \end{thebibliography} \end{document} biopython-1.63/Doc/cookbook/Restriction/0000755000175000017500000000000012250104773017675 5ustar tratra00000000000000biopython-1.63/Doc/cookbook/Restriction/Restriction.html0000644000175000017500000023124212250104543023067 0ustar tratra00000000000000 Restriction.html

  Working with restriction enzymes


Table of content



1  The restriction enzymes classes


The restriction enzyme package is situated in Bio/Restriction. This package will allow you to work with restriction enzymes and realise restriction analysis on your sequence. Restriction make use of the facilities offered by Rebase and contains classes for more than 600 restriction enzymes. This chapter will lead you through a quick overview of the facilities offered by the Restriction package of biopython. The chapter is constructed as an interactive python session and the best way to read it is with a python shell open alongside you.

1.1  Importing the enzymes

To import the enzymes, open a python shell and type :
>>> from Bio import Restriction
>>> dir()
['Restriction', '__builtins__', '__doc__', '__name__']
>>> Restriction.EcoRI
EcoRI
>>> Restriction.EcoRI.site
'GAATTC'
>>>
You will certainly notice that the package is quite slow to load. This is normal as each enzyme possess its own class and there is a lot of them. This will not affect the speed of python after the initial import.

I don't know for you but I find it quite cumbersome to have to prefix each operation with Restriction., so here is another way to import the package.
>>> from Bio.Restriction import *
>>> EcoRI
EcoRI
>>> EcoRI.site
'GAATTC'
>>>
However, this method has one big disadvantage :
It is almost impossible to use the command 'dir()' anymore as there is so much enzymes the results is hardly readable. A workaround is provided at the end of this tutorial. I let you decide which method you prefer. But in this tutorial I will use the second. If you prefer the first method you will need to prefix each call to a restriction enzyme with 'Restriction.' in the remaining of the tutorial.

1.2  Naming convention

To access an Enzyme simply enter it's name. You must respect the usual naming convention with the upper case letters and Latin numbering (in upper case as well):
>>> EcoRI 
EcoRI
>>> ecori

Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-
ecori
NameError: name 'ecori' is not defined
>>> EcoR1

Traceback (most recent call last):
File "<pyshell#26>", line 1, in -toplevel-
EcoR1
NameError: name 'EcoR1' is not defined
>>> KpnI
KpnI
>>>
ecori or EcoR1 are not enzymes, EcoRI and KpnI are.

1.3  Searching for restriction sites

So what can we do with these restriction enzymes. To see that we will need a DNA sequence. Restriction enzymes support both Bio.Seq.MutableSeq and Bio.Seq.Seq objects. You can use any DNA alphabet which complies with the IUPAC alphabet.
>>> from Bio.Seq import Seq
>>> from Bio.Alphabet.IUPAC import IUPACAmbiguousDNA
>>> amb = IUPACAmbiguousDNA()
>>> my_seq = Seq('AAAAAAAAAAAAAA', amb)
>>> my_seq
Seq('AAAAAAAAAAAAAA', IUPACAmbiguousDNA())
Searching a sequence for the presence of restriction site for your preferred enzyme is as simple as :
>>> EcoRI.search(my_seq)
[]
The results is a list. Here the list is empty since there is obviously no site EcoRI site in my_seq.  Let's try to get a sequence with a EcoRI site.
>>> ecoseq = my_seq + Seq(EcoRI.site, amb) + my_seq
>>> ecoseq
Seq('AAAAAAAAAAAAAAGAATTCAAAAAAAAAAAAAA', IUPACAmbiguousDNA())
>>> EcoRI.search(ecoseq)
[16]
We therefore have a site at position 16 of the sequence ecoseq. The position returned by the method search is the first base of the downstream segment produced by a restriction (i.e. the first base after the position where the enzyme will cut). The Restriction package follows biological convention (the first base of a sequence is base 1). No need to make difficult conversions between your recorded biological data and the results produced by the enzymes in this package.

1.4  Retrieving the sequences produced by a digestion

Seq objects as all python sequence, have different conventions and the first base of a sequence is base 0. Therefore to get the sequences produced by an EcoRI digestion of ecoseq, one should do the following :
>>> ecoseq[:15], ecoseq[15:] 
(Seq('AAAAAAAAAAAAAAG', IUPACAmbiguousDNA()), Seq('AATTCAAAAAAAAAAAAAA', IUPACAmbiguousDNA()))
I hear you thinking "this is a cumbersome and error prone method to get these sequences".  To simplify your life, enzymes provide another method to get theses sequences without hassle : catalyse. This method will return a tuple containing all the fragments produced by a complete digestion of the sequence. Using it is as simple as before :
>>> EcoRI.catalyse(ecoseq)
(Seq('AAAAAAAAAAAAAAG', IUPACAmbiguousDNA()), Seq('AATTCAAAAAAAAAAAAAA', IUPACAmbiguousDNA()))

1.5  Analysing circular sequences

Now, if you have entered the previous command in your shell you may have noticed that both 'search' and 'catalyse' can take a second argument 'linear' which default to True. Using this will allow you to simulate circular sequences such as plasmids. Setting linear to False inform the enzyme to make the search over a circular sequence and to search for potential sites spanning over the boundaries of the sequence.
>>> EcoRI.search(ecoseq, linear=False)
[16]
>>> EcoRI.catalyse(ecoseq, linear=False)
(Seq('AATTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAG', IUPACAmbiguousDNA()),)
>>> ecoseq # for memory
Seq('AAAAAAAAAAAAAAGAATTCAAAAAAAAAAAAAA', IUPACAmbiguousDNA())
OK, this is quite a difference, we only get one fragment, which correspond to the linearised sequence. The beginning sequence has been shifted to take this fact into account. Moreover we can see another difference :
>>> new_seq = Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA())
>>> EcoRI.search(new_seq)
[]
>>> EcoRI.search(new_seq, linear=False)
[33]
As you can see using 'linear=False', make a site appears in the sequence new_seq. This site does not exist in a linear sequence as the EcoRI site is split into two halves at the start and the end of the sequence. In a circular sequence however, the site is effectively present when the beginning and end of the sequence are joined.

1.6 Comparing enzymes with each others

Restriction Enzymes define 4 comparative operators ==, !=, >> and %. All these operator compares two enzymes together and either return True or False.

== :

It will return True if the two sides of the operator are the same. same is defined as : same name, same site, same overhang (i.e. the only thing which is equal to EcoRI is EcoRI).

!= :

It will return True if the two sides of the operator are different. Two enzymes are not different if the result produced by one enzyme will always be the same as the result produced by the other (i.e. True isoschizomers will not being the same enzymes, are not different since they are interchangeable).

>> :

True if the enzymes recognise the same site, but cut it in a different way (i.e. the enzymes are neoschizomers).

% :

Test the compatibility of the ending produced by the enzymes. (will be True if the fragments produced with one of the enzyme can directly be ligated to fragments produced by the other).

Let's use Acc65I and its isoschizomers as example :
>>> Acc65I.isoschizomers()
[Asp718I, KpnI]
>>> Acc65I.elucidate()
'G^GTAC_C'
>>> Asp718I.elucidate()
'G^GTAC_C'
>>> KpnI.elucidate()
'G_GTAC^C'
>>> # Asp718I and Acc65I are True isoschizomers,
>>> # they recognise the same site and cut it the
>>> # same way.
>>> # KpnI is a neoschizomers of the 2 others.
>>> # here is the results of the 4 operator
>>> # for each pair of enzymes
>>>
>>> ############# x == y (x is y)
>>> Acc65I == Acc65I # same enzyme => True
True
>>> Acc65I == KpnI # all other cases => False
False
>>> Acc65I == Asp718I
False
>>> Acc65I == EcoRI
False
>>> ############ x != y (x and y are not true isoschizomers)
>>> Acc65I != Acc65I # same enzyme => False
False
>>> Acc65I != Asp718I # different enzymes, but cut same manner => False
False
>>> Acc65I != KpnI # all other cases => True
True
>>> Acc65I != EcoRI
True
>>> ########### x >> y (x is neoschizomer of y)
>>> Acc65I >> Acc65I # same enzyme => False
False
>>> Acc65I >> Asp718I # same site, same cut => False
False
>>> Acc65I >> EcoRI # different site => False
False
>>> Acc65I >> KpnI # same site, different cut => True
True
>>> ########### x % y (fragments produced by x and fragments produced by y
>>> # can be directly ligated to each other)
>>> Acc65I % Asp718I
True
>>> Acc65I % Acc65I
True
>>> Acc65I % KpnI # KpnI -> '3 overhang, Acc65I-> 5' overhang => False
False
>>>
>>> SunI.elucidate()
'C^GTAC_G'
>>> SunI == Acc65I
False
>>> SunI != Acc65I
True
>>> SunI >> Acc65I
False
>>> SunI % Acc65I # different site, same overhang (5' GTAC) => True
True
>>> SmaI % EcoRV # 2 Blunt enzymes, all blunt enzymes are compatible => True
True

1.7 Other facilities provided by the enzyme classes

The restriction enzymes class provided quite a number of others methods. We will not go through all of them, but only have a quick look to the most useful ones.

Not all enzymes possess the same properties when it comes to the way they digest a DNA. If you want to know more about the way a particular enzyme cut you can use the three following methods. They are fairly straightforward to understand and refer to the ends that the enzyme produces blunt, 5' overhanging (also called 3' recessed) sticky end and 3' overhanging (or 5' recessed) sticky end.
>>> EcoRI.is_blunt()
False
>>> EcoRI.is_5overhang()
True
>>> EcoRI.is_3overhang()
False
A more detailled view of the restriction site can be produced using the elucidate() method. the "^" refers to the position of the cut in the sense strand of the sequence. "_" to the cut on the antisense or complementary strand.  "^_" means blunt.
>>> EcoRI.elucidate()
'G^AATT_C'
>>> KpnI.elucidate()
'G_GTAC^C'
>>> EcoRV.elucidate()
'GAT^_ATC'
The method frequency will give you the statiscal frequency() of the enzyme site.
>>> EcoRI.frequency()
4096
>>> XhoII.elucidate()
'R^GATC_Y'
>>> XhoII.frequency()
1024
To get the length of a the recognition sequence of an enzyme use the built-in function len() :
>>> len(EcoRI)
6
>>> BstXI.elucidate()
'CCAN_NNNN^NTGG'
>>> len(BstXI)
12
>>> FokI.site
'GGATG'
>>> FokI.elucidate() # FokI cut well outside its recognition site
'GGATGNNNNNNNNN^NNNN_N'
>>> len(FokI) # its length is the length of the recognition site
5
Also interesting are the methods dealing with isoschizomers. For memory, two enzymes are isoschizomers if they share a same recognition site.
A further division is made between isoschizomers (same name, recognise the same sequence and cut the same way) and neoschizomers which cut at different positions. equischizomer is an arbitrary choice to design "isoschizomers_that_are_not_neoschizomers" as this last one was a bit long.
Another set of method one_enzyme.is_*schizomers(one_other_enzyme), allow to test 2 enzymes against each other.
>>> Acc65I.isoschizomers()
[Asp718I, KpnI]
>>> Acc65I.neoschizomers()
[KpnI]
>>> Acc65I.equischizomers()
[Asp718I]
>>> KpnI.elucidate()
'G_GTAC^C'
>>> Acc65I.elucidate()
'G^GTAC_C'
>>> KpnI.is_neoschizomer(Acc65I)
True
>>> KpnI.is_neoschizomer(KpnI)
False
>>> KpnI.is_isoschizomer(Acc65I)
True
>>> KpnI.is_isoschizomer(KpnI)
True
>>> KpnI.is_equischizomer(Acc65I)
False
>>> KpnI.is_equischizomer(KpnI)
True
suppliers() will get you the list of all the suppliers of the enzyme. all_suppliers() will give you all the suppliers in the database.

2  The RestrictionBatch class : a class to deal with several enzymes

If you want to make a restriction map of a sequence, using individual enzymes can become tedious and will endures a big overhead due to the repetitive conversion of the sequence to a FormattedSeq. Restriction provides a class to make easier the use of large number of enzymes in one go : RestrictionBatch.
RestrictionBatch will help you to manipulate lots of enzymes with a single command. Moreover all the enzymes in the restrictionBatch will share the same converted sequence, reducing the overhead to

2.1 Creating a RestrictionBatch

You can initiate a restriction batch by passing it a list of enzymes or enzymes name as argument.
>>> rb = RestrictionBatch([EcoRI])
>>> rb
RestrictionBatch(['EcoRI'])
>>> rb2 = RestrictionBatch(['EcoRI'])
RestrictionBatch(['EcoRI'])
>>> rb == rb2
True
Adding a new enzyme to a restriction batch is easy :
>>> rb.add(KpnI)
>>> rb
RestrictionBatch(['EcoRI', 'KpnI'])
>>> rb += EcoRV
>>> rb
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI'])])
Another way to create a RestrictionBatch is by simply adding restriction enzymes together, this is particularly useful for small batches :
>>> rb3 = EcoRI + KpnI + EcoRV
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI'])

2.2 Restricting a RestrictionBatch to a particular supplier

The Restriction package is based upon the Rebase database. This database gives a list of suppliers for each enzyme. It would be a shame not to make use of this facility. You can Produce a RestrictionBatch containing only enzymes from one or a few supplier(s). Here is how to do it :
>>> rb_supp = RestrictionBatch(first=[], suppliers=['A','C','E','G','F','I','H','K','J','M','O','N','Q','P','S','R','U','V','X'])
>>> # This will create a RestrictionBatch with the all enzymes which possess a supplier.
The argument 'suppliers' take a list of one or several single letter codes corresponding to the supplier(s). The codes are the same as defined in Rebase. As it would be a pain to have to remember each supplier code, RestrictionBatch provides a method which show the pair code <=> supplier :
>>> RestrictionBatch.show_codes()	# as of july 2004 Rebase release.
A = Amersham Pharmacia Biotech
C = Minotech Biotechnology
E = Stratagene
G = Qbiogene
F = Fermentas AB
I = SibEnzyme Ltd.
H = American Allied Biochemical, Inc.
K = Takara Shuzo Co. Ltd.
J = Nippon Gene Co., Ltd.
M = Roche Applied Science
O = Toyobo Biochemicals
N = New England Biolabs
Q = CHIMERx
P = Megabase Research Products
S = Sigma Chemical Corporation
R = Promega Corporation
U = Bangalore Genei
V = MRC-Holland
X = EURx Ltd.
>>> # You can now choose a code and built your RestrictionBatch
This way of producing a RestrictionBatch can drastically reduce the amount of useless output from a restriction analysis, limiting the search to enzymes that you can get hold of and limiting the risks of nervous breakdown. Nothing is more frustrating than to get the perfect enzyme for a sub-cloning only to find it's not commercially available.

2.3 Adding enzymes to a RestrictionBatch

Adding an enzyme to a batch if the enzyme is already present will not raise an exception, but will have no effects. Sometimes you want to get an enzyme from a RestrictionBatch or add it to the batch if it is not present.
You will use the get method setting the second argument to True.
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI'])
>>> rb3.add(EcoRI)
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI'])
>>> rb3.get(EcoRI)
EcoRI
>>> rb3.get(SmaI)

Traceback (most recent call last):
File "<pyshell#4>", line 1, in -toplevel-
rb3.get(SmaI)
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1800, in get
raise ValueError, 'enzyme %s is not in RestrictionBatch'%e.__name__
ValueError: enzyme SmaI is not in RestrictionBatch
>>> rb3.get(SmaI, True)
SmaI
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI', 'SmaI'])

2.4 Removing enzymes from a RestrictionBatch

Removing enzymes from a Batch is done using the remove() method. If the enzyme is not present in the batch this will raise a KeyError. If the value you want to remove is not an enzyme this will raise a ValueError.
>>> rb3.remove(EcoRI)
>>> rb3
RestrictionBatch(['EcoRV', 'KpnI', 'SmaI'])
>>> rb3.remove(EcoRI)

Traceback (most recent call last):
File "<pyshell#14>", line 1, in -toplevel-
rb3.remove('EcoRI')
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1839, in remove
return Set.remove(self, self.format(other))
File "/usr/lib/python2.3/sets.py", line 534, in remove
del self._data[element]
KeyError: EcoRI
>>> rb3 += EcoRI
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI', 'SmaI'])
>>> rb3.remove('EcoRI')
>>> rb3
RestrictionBatch(['EcoRV', 'KpnI', 'SmaI'])
>>> rb3.remove('spam')

Traceback (most recent call last):
File "<pyshell#18>", line 1, in -toplevel-
rb3.remove('spam')
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1839, in remove
return Set.remove(self, self.format(other))
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1871, in format
raise ValueError, '%s is not a RestrictionType'%y.__class__
ValueError: <type 'str'> is not a RestrictionType

2.5 Manipulating RestrictionBatch

You can not however add batch together, as they are python sets. You must use the operator | instead. You can find the intersection between 2 batches using & (see the python documentation about sets for more information (or import sets; help(sets)).
>>> rb3 = EcoRI+KpnI+EcoRV
>>> rb3
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI'])
>>> rb4 = SmaI + PstI
>>> rb4
RestrictionBatch(['PstI', 'SmaI'])
>>> rb3 + rb4

Traceback (most recent call last):
File "<pyshell#23>", line 1, in -toplevel-
rb3 + rb4
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1829, in __add__
new.add(other)
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1848, in add
return Set.add(self, self.format(other))
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 1871, in format
raise ValueError, '%s is not a RestrictionType'%y.__class__
ValueError: <class 'Bio.Restriction.Restriction.RestrictionBatch'> is not a RestrictionType
>>> rb3 | rb4
RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI', 'PstI', 'SmaI'])
>>> rb3 & rb4
RestrictionBatch([])
>>> rb4 += EcoRI
>>> rb4
RestrictionBatch(['EcoRI', 'PstI', 'SmaI'])
>>> rb3 & rb4
RestrictionBatch(['EcoRI'])

2.6 Analysing sequences with a RestrictionBatch

To analyse a sequence for potential site, you can use the search method of the batch, the same way you did for restriction enzymes. The results is no longer a list however, but a dictionary. The keys of the dictionary are the names of the enzymes and the value a list of position site. RestrictionBatch does not implement a catalyse method, as it would not have a real meaning when used with large batch.
>>> new_seq = Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA())
>>> rb.search(new_seq)
{'KpnI': [], 'EcoRV': [], 'EcoRI': []}
>>> rb.search(new_seq, linear=False)
{'KpnI': [], 'EcoRV': [], 'EcoRI': [33]}

2.7 Other RestrictionBatch methods

Amongst the other methods provided by RestrictionBatch elements() which return a list of all the element names alphabetically sorted is certainly the most useful.
>>> rb = EcoRI + KpnI + EcoRV
>>> rb.elements()
['EcoRI', 'EcoRV', 'KpnI']
If you don't care about the alphabetical order use the method as_string(), to get the same thing a bit faster. The list is not sorted. The order is random as python sets are dictionary.
>>> rb = EcoRI + KpnI + EcoRV 
>>> rb.as_string()
['EcoRI', 'KpnI', 'EcoRV']
Other RestrictionBatch methods are generally used for particular purposes and will not be discussed here. See the source if you are interested.

3  AllEnzymes and CommOnly : two preconfigured RestrictionBatches

While it is sometime practical to produce a RestrictionBatch of your own you will certainly more frequently use the two batches provided with the Restriction packages : AllEnzymes and CommOnly. These two batches contain respectively all the enzymes in the database and only the enzymes which have a commercial supplier. They are rather big, but that's what make them useful. With these batch you can produce a full description of a sequence with a single command. You can use these two batch as any other batch.
>>> len(AllEnzymes)
671
>>> len(CommOnly)
589
>>> AllEnzymes.search(new_seq) ...
There is not a lot to say about them apart the fact that they are present. They are really normal batches, and you can use them as any other batch.

4  The Analysis class : even simpler restriction analysis

RestrictionBatch can give you a dictionary with the sites for all the enzymes in a RestrictionBatch. However, it is sometime nice to get something a bit easier to read than a python dictionary. Complex restriction analysis are not easy with RestrictionBatch. Some refinements in the way to search a sequence for restriction sites will help. Analysis provides a serie of command to customise the results obtained from a pair RestrictionBatch/sequence and some facilities to make the output sligthly more human readable.

4.1 Setting up an Analysis

To build a Restriction Analysis you will need a RestrictionBatch and a sequence and to tell it if the sequence is linear or circular. The first argument Analysis take is the RestrictionBatch, the second is the sequence. If the third argument is not provided Analysis will assume the sequence is linear.
>>> new_seq = Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA())
>>> rb = RestrictionBatch([EcoRI, KpnI, EcoRV])
>>> Ana = Analysis(rb, new_seq, linear=False)
>>> Ana
Analysis(RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI']),Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA()),False)

4.2 Full restriction analysis

Once you have created your new Analysis, you can use it to get a restriction analysis of your sequence. The way to make a full restriction analysis of the sequence is :
>>> Ana.full()
{'KpnI': [], 'EcoRV': [], 'EcoRI': [33]}
This is much the same as the output of a RestrictionBatch.search method. You will get a more easy to read output with "print_that" used without argument :
>>> 
>>> # let's create a something a bit more complex to analyse.
>>>
>>> rb = RestrictionBatch([], ['A']) # we will explain the meaning of the
>>> # double list argument later.
>>>
>>> multi_site = Seq('AAA' + EcoRI.site +'G' + KpnI.site + EcoRV.site + 'CT' +\
SmaI.site + 'GT' + FokI.site + 'GAAAGGGC' + EcoRI.site + 'ACGT', IUPACAmbiguousDNA())
>>>
>>> Analong = Analysis(rb, multi_site)
>>> Analong.full()
{'EaeI': [], 'CpoI': [], 'AccII': [], 'Bpu1102I': [], 'HindIII': [], 'BalI': [],
 'NaeI': [], 'BssHII': [], 'HapII': [27], 'BamHI': [], 'XhoI': [], 'EcoO109I': [
], 'XbaI': [], 'SacII': [], 'AvaII': [], 'BbeI': [], 'FokI': [47], 'Eco81I': [],
 'BanII': [], 'KpnI': [16], 'NcoI': [], 'FseI': [], 'ApaLI': [], 'NheI': [], 'Ap
aI': [], 'AatII': [], 'DraI': [], 'EcoRV': [20], 'BstXI': [], 'HaeIII': [], 'Mlu
I': [], 'Aor51HI': [], 'EcoRI': [5, 47], 'AvaI': [26], 'PvuI': [], 'EcoT22I': []
, 'PstI': [], 'MvaI': [], 'NotI': [], 'HinfI': [], 'ScaI': [], 'NdeI': [], 'AccI
': [], 'MboII': [], 'SnaBI': [], 'SspI': [], 'HhaI': [], 'BglI': [], 'Cfr13I': [
], 'SpeI': [], 'AflII': [], 'HpaI': [], 'Van91I': [], 'SfiI': [], 'SphI': [], 'B
sp1286I': [], 'SmaI': [28], 'NruI': [], 'FbaI': [], 'AluI': [], 'BglII': [], 'Hi
ncII': [], 'StuI': [], 'Sse8387I': [], 'ClaI': [], 'Sau3AI': [], 'MspI': [27], '
PshAI': [], 'AfaI': [14], 'MboI': [], 'PmaCI': [], 'SacI': [], 'PvuII': [], 'Eco
T14I': [], 'SalI': [], 'BlnI': [], 'TaqI': []}
>>>
>>> # The results are here but it is difficult to read. let's try print_that
>>>
>>> Analong.print_that()

AfaI : 14.
AvaI : 26.
EcoRI : 5, 47.
EcoRV : 20.
FokI : 47.
HapII : 27.
KpnI : 16.
MspI : 27.
SmaI : 28.

Enzymes which do not cut the sequence.

AatII AccI AccII AflII AluI Aor51HI ApaI ApaLI
AvaII BalI BamHI BanII BbeI BglI BglII BlnI
Bpu1102I Bsp1286I BssHII BstXI Cfr13I ClaI CpoI DraI
EaeI Eco81I EcoO109I EcoT14I EcoT22I FbaI FseI HaeIII
HhaI HincII HindIII HinfI HpaI MboI MboII MluI
MvaI NaeI NcoI NdeI NheI NotI NruI PmaCI
PshAI PstI PvuI PvuII SacI SacII SalI Sau3AI
ScaI SfiI SnaBI SpeI SphI Sse8387I SspI StuI
TaqI Van91I XbaI XhoI
Much clearer, is'nt ? The output is optimised for a shell 80 columns wide. If the output seems odd, check that  the width of your shell is at least 80 columns.

4.3 Changing the title

You can provide a title to the analysis and modify the sentence 'Enzymes which do not cut the sequence', by setting the two optional arguments of print_that  "title" and "s1". No formating will be done on these strings so if you have to include the newline ('\n') as you see fit :
>>> Analong.print_that(None, title='sequence = multi_site\n\n')

sequence = multi_site

AfaI : 14.
AvaI : 26.
EcoRI : 5, 47.
EcoRV : 20.
FokI : 47.
HapII : 27.
KpnI : 16.
MspI : 27.
SmaI : 28.

Enzymes which do not cut the sequence.

AatII AccI AccII AflII AluI Aor51HI ApaI ApaLI
AvaII BalI BamHI BanII BbeI BglI BglII BlnI
Bpu1102I Bsp1286I BssHII BstXI Cfr13I ClaI CpoI DraI
EaeI Eco81I EcoO109I EcoT14I EcoT22I FbaI FseI HaeIII
HhaI HincII HindIII HinfI HpaI MboI MboII MluI
MvaI NaeI NcoI NdeI NheI NotI NruI PmaCI
PshAI PstI PvuI PvuII SacI SacII SalI Sau3AI
ScaI SfiI SnaBI SpeI SphI Sse8387I SspI StuI
TaqI Van91I XbaI XhoI
>>> Analong.print_that(None, 
title = 'sequence = multi_site\n\n',
s1 = '\n no site :\n\n')

sequence = multi_site

AfaI : 14.
AvaI : 26.
EcoRI : 5, 47.
EcoRV : 20.
FokI : 47.
HapII : 27.
KpnI : 16.
MspI : 27.
SmaI : 28.

no site :

AatII AccI AccII AflII AluI Aor51HI ApaI ApaLI
AvaII BalI BamHI BanII BbeI BglI BglII BlnI
Bpu1102I Bsp1286I BssHII BstXI Cfr13I ClaI CpoI DraI
EaeI Eco81I EcoO109I EcoT14I EcoT22I FbaI FseI HaeIII
HhaI HincII HindIII HinfI HpaI MboI MboII MluI
MvaI NaeI NcoI NdeI NheI NotI NruI PmaCI
PshAI PstI PvuI PvuII SacI SacII SalI Sau3AI
ScaI SfiI SnaBI SpeI SphI Sse8387I SspI StuI
TaqI Van91I XbaI XhoI

4.4 Customising the output

You can modify some aspects of the output interactively. There is three main type of output, two listing types (alphabetically sorted and sorted by number of site) and map-like type. To change the output, use the method print_as() of Analysis. The change of output is permanent for the instance of Analysis (that is until the next time you use  print_as()). The argument of print_as() are strings : 'map', 'number' or 'alpha'. As you have seen previously the default behaviour is an alphabetical list ('alpha').
>>> Analong.print_as('map')    
>>> Analong.print_that()

5 EcoRI
|
| 14 AfaI
| |
| | 16 KpnI
| | |
| | | 20 EcoRV
| | | |
| | | | 26 AvaI
| | | | |
| | | | |27 HapII MspI
| | | | ||
| | | | ||28 SmaI
| | | | |||
| | | | ||| 47 EcoRI FokI
| | | | ||| |
AAAGAATTCGGGTACCGATATCCTCCCGGGGTGGATGGAAAGGGCGAATTCACGT
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
TTTCTTAAGCCCATGGCTATAGGAGGGCCCCACCTACCTTTCCCGCTTAAGTGCA
1 55


Enzymes which do not cut the sequence.

AatII AccI AccII AflII AluI Aor51HI ApaI ApaLI
AvaII BalI BamHI BanII BbeI BglI BglII BlnI
Bpu1102I Bsp1286I BssHII BstXI Cfr13I ClaI CpoI DraI
EaeI Eco81I EcoO109I EcoT14I EcoT22I FbaI FseI HaeIII
HhaI HincII HindIII HinfI HpaI MboI MboII MluI
MvaI NaeI NcoI NdeI NheI NotI NruI PmaCI
PshAI PstI PvuI PvuII SacI SacII SalI Sau3AI
ScaI SfiI SnaBI SpeI SphI Sse8387I SspI StuI
TaqI Van91I XbaI XhoI

>>> Analong.print_as('number')
>>> Analong.print_that()



enzymes which cut 1 times :

AfaI : 15.
AvaI : 27.
EcoRV : 21.
FokI : 48.
HapII : 28.
KpnI : 17.
MspI : 28.
SmaI : 29.


enzymes which cut 2 times :

EcoRI : 6, 48.

Enzymes which do not cut the sequence.

AatII AccI AccII AflII AluI Aor51HI ApaI ApaLI
AvaII BalI BamHI BanII BbeI BglI BglII BlnI
Bpu1102I Bsp1286I BssHII BstXI Cfr13I ClaI CpoI DraI
EaeI Eco81I EcoO109I EcoT14I EcoT22I FbaI FseI HaeIII
HhaI HincII HindIII HinfI HpaI MboI MboII MluI
MvaI NaeI NcoI NdeI NheI NotI NruI PmaCI
PshAI PstI PvuI PvuII SacI SacII SalI Sau3AI
ScaI SfiI SnaBI SpeI SphI Sse8387I SspI StuI
TaqI Van91I XbaI XhoI

>>>
To come back to the previous behaviour :
>>> Analong.print_as('alpha')
>>> Analong.print_that()

AfaI : 14.
AvaI : 26.
EcoRI : 5, 47.
EcoRV : 20.
etc ...

4.5 Fancier restriction analysis

I will not go into the detail for each single method, here are all the functions that are available. Most are perfectly self explanatory and the others are fairly well documented (use help('Analysis.command_name')). The methods are :
	full(self,linear=True) 
blunt(self,dct = None)            
overhang5(self, dct=None)
overhang3(self, dct=None) 
defined(self,dct=None) 
with_sites(self, dct=None) 
without_site(self, dct=None) 
with_N_sites(self, N, dct=None) 
with_number_list(self, list, dct=None) 
with_name(self, names, dct=None)   
with_site_size(self, site_size, dct=None)   
only_between(self, start, end, dct=None)   
between(self,start, end, dct=None)   
show_only_between(self, start, end, dct=None)   
only_outside(self, start, end, dct =None)   
outside(self, start, end, dct=None)   
do_not_cut(self, start, end, dct =None)
Using these methods is simple :
>>> new_seq = Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA())
>>> rb = RestrictionBatch([EcoRI, KpnI, EcoRV])
>>> Ana = Analysis(rb, new_seq, linear=False)
>>> Ana
Analysis(RestrictionBatch(['EcoRI', 'EcoRV', 'KpnI']),Seq('TTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAA', IUPACAmbiguousDNA()),False)
>>> Ana.blunt() # output only the result for enzymes which cut blunt
{'EcoRV': []}
>>> Ana.full() # all the enzymes in the RestrictionBatch
{'KpnI': [], 'EcoRV': [], 'EcoRI': [33]}
>>> Ana.with_sites() # output only the result for enzymes which have a site in the sequence
{'EcoRI': [33]}
>>> Ana.without_site() # output only the enzymes which have no site in the sequence
{'KpnI': [], 'EcoRV': []}
>>> Ana.only_between(1, 20) # the enzymes which cut between the base pairs 1 and 20
{}
>>> Ana.only_between(20, 34) # etc...
{'EcoRI': [33]}
>>> Ana.only_outside(20, 34)
{}
>>> Ana.with_name([EcoRI])
{'EcoRI': [33]}
>>>
To get a nice output, you still use print_that but this time with the command you want executed as argument.
>>> Ana.print_that(Ana.blunt())


Enzymes which do not cut the sequence.

EcoRV

>>> pt = Ana.print_that
>>> pt(Ana.with_sites())

EcoRI : 33.

>>> pt(Ana.without_site())


Enzymes which do not cut the sequence.

EcoRV KpnI

>>> # etc ...

4.6 More complex analysis

All of these methods (except full() which, well ... do a full restriction analysis) can be supplied with an additional dictionary.
If no dictionary is supplied a full restriction analysis is used as starting point. Otherwise the dictionary provided by the argument dct is used. The dictionary must be formatted as the result of RestrictionBatch.search. Therefore of the form {'enzyme_name' : [position1, position2],...}, where position1 and position2 are integer. All methods list previously output such dictionaries and can be used as starting point.

Using this method you can build really complex query by chaining several method one after the other. For example if you want all the enzymes which are 5' overhang and cut the sequence only once, you have two ways to go :

The hard way consist to build a RestrictionBatch containing only 5' overhang enzymes and use this batch to create a new analysis instance and then use the method with_N_sites() as follow :
>>> rbov5 = RestrictionBatch([x for x in rb if x.is_5overhang()])
>>> Anaov5 = Analysis(rbov5, new_seq, linear=False)
>>> Anaov5.with_N_sites(1)
{'EcoRI' : [33]}
The easy solution is to chain several Analysis methods. This is possible since each method return a dictionary as results and is able to take a dictionary as input:
>>> Ana.with_N_sites(1, Ana.overhang5())
{'EcoRI': [33]}
The dictionary is always the last argument whatever the command you use.

The way to prefer certainly depends of the conditions you will use your Analysis instance. If you are likely to frequently reuse the same batch with different sequences, using a dedicated RestrictionBatch might be faster as the batch is likely to be smaller. Chaining methods is generally quicker when working with an interactive shell.  In a script, the extended syntax may be easier to understand in a few months.

5  Advanced features : the FormattedSeq class

Restriction enzymes require a much more strict formatting of the DNA sequences than Bio.Seq object provides. For example, the restriction enzymes expect to find an ungapped (no space) upper-case sequence, while Bio.Seq object allow sequences to be in lower-case separated by spaces. Therefore when  a restriction enzyme analyse a Bio.Seq object (be it a Seq or a MutableSeq), the object undergoes a conversion. The class FormattedSeq ensure the smooth conversion from a  Bio.Seq object to something which can be safely be used by the enzyme.

While this conversion is done automatically by the enzymes if you provide them with a Seq  or a MutableSeq, there is time where it will be more efficient to realise the conversion before hand. Each time a Seq object is passed to an enzyme for analysis you pay a overhead due to the conversion. When analysing the same sequence over and over, it will be faster to convert the sequence, store the conversion and then use only the converted sequence.

5.1 Creating a FormattedSeq

Creating a FormattedSeq from a Bio.Seq object is simple. The first argument of FormattedSeq is the sequence you wish to convert. You can specify a shape with the second argument linear, if you don't the FormattedSeq will be linear :
>>> from Bio.Restriction import *
>>> from Bio.Seq import Seq
>>> seq = Seq('TTCAAAAAAAAAAGAATTCAAAAGAA')
>>> linear_fseq = FormattedSeq(seq, linear=True)
>>> default_fseq = FormattedSeq(seq)
>>> circular_fseq = FormattedSeq(seq, linear=False)
>>> linear_fseq
FormattedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=True)
>>> linear_fseq.is_linear()
True
>>> default_fseq.is_linear()
True
>>> circular_fseq.is_linear()
False
>>> circular_fseq
FormattedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=False)

5.2 Unlike Bio.Seq, FormattedSeq retains information about their shape

FormattedSeq retains information about the shape of the sequence. Therefore unlike with Seq and MutableSeq you don't need to specify the shape of the sequence when using search() or catalyse():
>>> EcoRI.search(linear_fseq)
[15]
>>> EcoRI.search(circular_fseq) # no need to specify the shape
[15, 25]
In fact, the shape of a FormattedSeq is not altered by the second argument of the commands search() and catalyse() :
>>> # In fact the shape is blocked.
>>> # The 3 following commands give the same results
>>> # which correspond to a circular sequence
>>> EcoRI.search(circular_fseq)
[15, 25]
>>> EcoRI.search(circular_fseq, linear=True)
[15, 25]
>>> EcoRI.search(circular_fseq, linear=False)
[15, 25]
>>>

5.3 Changing the shape of a FormattedSeq

You can however change the shape of the FormattedSeq. The command to use are :
FormattedSeq.to_circular() => new FormattedSeq, shape will be circular. 
FormattedSeq.to_linear() => new FormattedSeq, shape will be linear
FormattedSeq.circularise() => change the shape of FormattedShape to circular
FormattedSeq.linearise() => change the shape of FormattedShape to linear

>>> circular_fseq
FormatedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=False)
>>> circular_fseq.is_linear()
False
>>> circular_fseq == linear_fseq
False
>>> newseq = circular_fseq.to_linear()
>>> circular_fseq
FormatedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=False)
>>> newseq
FormatedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=True)
>>> circular_fseq.linearise()
>>> circular_fseq
FormatedSeq(Seq('TTCAAAAAAAAAAGAATTCAAAAGAA', Alphabet()), linear=True)
>>> circular_fseq.is_linear()
True
>>> circular_fseq == linear_fseq
True
>>> EcoRI.search(circular_fseq) # which is now linear
[15]

5.4 Using / and // operators with FormattedSeq

Not having to specify the shape of the sequence to analyse gives you the opportunity to use the shorthand '/' and '//' with restriction enzymes :
>>> EcoRI/linear_fseq  # <=> EcoRI.search(linear_fseq)
[15]
>>> linear_fseq/EcoRI # <=> EcoRI.search(linear_fseq)
[15]
>>> EcoRI//linear_fseq # <=> linear_fseq//EcoRI <=> EcoRI.catalyse(linear_fseq)
(Seq('TTCAAAAAAAAAAG', Alphabet()), Seq('AATTCAAAAGAA', Alphabet()))
Another way to avoid the overhead due to a repetitive conversion from a Seq object to a FormattedSeq is to use a RestrictionBatch.

To conclude, the performance gain achieved when using a FormattedSeq instead of a Seq is not huge. The analysis of a 10 kb sequence by all the enzymes in AllEnzymes (for x in AllEnzymes : x.search(seq), 671 enzymes) is 7 % faster when using a FormattedSeq than a Seq. Using a RestrictionBatch (AllEnzymes.search(seq)) is about as fast as using a FormattedSeq the first time the search is run. This however is dramatically reduced in subsequent runs with the same sequence (RestrictionBatch keep in memory the result of their last run while the sequence is not changed).

6  More advanced features

This chapter addresses some more advanced features of the packages, most users can safely ignore it.

6.1 Updating the enzymes from Rebase : rebase_update.py

Most people will certainly not need to update the enzymes. The restriction enzyme package will be updated in with each new release of biopython. But if you wish to get an update in between biopython-releases here is how to do it. Each month, Rebase release a new compilation of data about restriction enzymes. While the enzymes do not change so frequently, you may wish to update the restriction enzymes classes. The first thing to do is to get the last rebase file. You can find the release of Rebase at http://rebase.neb.com/rebase.files.html. The file you are interested in are in the EMBOSS format. You can download the files directly from the rebase ftp server using your browser. The file are situated at ftp://ftp.neb.com/pub/rebase.
You will have to download 3 files :
                emboss_e.###
                emboss_r.###
                emboss_s.###
The ### is a 3 digit number corresponding to the year and month of the release. The first digit is the year, the two last are the month : so July 2004 will be : 407; October 2005 : 510, etc... Download the three file corresponding to the current month and place them in a folder.

Another way to do the same thing is to use the rebase_update.py. script provided in the package. The script is in biopython/Bio/Restriction/Scripts. It will connect directly to the rebase ftp server and download the last batch of emboss files. From a DOS or Unix shell do the following :
$ cd path_to_/Scripts
$ ls
ranacompiler.py rebase_update.py
$ ./rebase_update.py -m your_e_mail@my_address.com -p http://www.somewhere.com:8000

Please wait, trying to connect to Rebase


copying ftp://ftp.neb.com/pub/rebase/emboss_e.407
to /cvsroot/biopython/Bio/Restriction/Scripts/emboss_e.407
copying ftp://ftp.neb.com/pub/rebase/emboss_s.407
to /cvsroot/biopython/Bio/Restriction/Scripts/emboss_s.407
copying ftp://ftp.neb.com/pub/rebase/emboss_r.407
to /cvsroot/biopython/Bio/Restriction/Scripts/emboss_r.407

Some explanation are needed : -m stands for e-mail, in order to connect to the ftp server you need to provide a your e-mail address. So replace your_e_mail@your_address.com with your e-mail address. -p is the switch to indicate to the script you are using a proxy. If you use a ftp proxy enter its address and the connection port after the ':'.

6.2 Compiling a new dictionary : the script ranacompiler.py

Once you have got a the last serie of emboss files you can compile a new module containing the data necessary to create restriction enzyme. You will need to get out of the python shell and open either a DOS shell on windows, or your prefered Unix shell for the others.

Note : if the emboss files are not present in the current directory or if they are not up to date, ranacompiler.py will invoke the script rebase_update. You will need to use the same options as before (ie -m and -p). See the previous paragraph on rebase_update.py for more details.

For simplicity let's assume we have put the emboss files in the same folder as the files which contains the script ranacompiler.py.

$ cd path_to_/Scripts
$ ls
emboss_e.407 emboss_r.407 emboss_s.407 ranacompiler.py rebase_update.py

We will use the script ranacompiler.py. You may have the change the mode of the file to make it executable :
$ chmod '+x' ranacompiler.py
Now execute the script :
$ python ranacompiler.py  # or ./ranacompiler.py
You get normally the following message :
$ ./ranacompiler.py

Using the files : emboss_e.407, emboss_r.407, emboss_s.407

WARNING : HaeIV cut twice with different overhang length each time.
Unable to deal with this behaviour.
This enzyme will not be included in the database. Sorry.
Checking : Anyway, HaeIV is not commercially available.


WARNING : TaqII has two different sites.

WARNING : It seems that AspCNI is both commercially available
and its characteristics are unknown.
This seems counter-intuitive.
There is certainly an error either in ranacompiler or
in this REBASE release.
The supplier is : New England Biolabs.

The new database contains 671 enzymes.

Writing the dictionary containing the new Restriction classes. OK.

Writing the dictionary containing the suppliers datas. OK.

Writing the dictionary containing the Restriction types. OK.


******************************************************************************

Compilation of the new dictionary : OK.
Installation : No.

You will find the newly created 'Restriction_Dictionary.py' file
in the folder :

/cvsroot/biopython/Bio/Restriction/Scripts

Make a copy of 'Restriction_Dictionary.py' and place it with
the other Restriction libraries.

note :
This folder should be :

/usr/lib/python2.3/site-packages/Bio/Restriction


******************************************************************************
The first line indicate which emboss files have been used for the present compilation. You can safely ignore the warnings as long as the  compilation of the new dictionary : OK. is present in the last part of the output. They are here for debugging purpose. The number of enzymes in the new module is indicated as well as a list of the dictionary which have been compiled. The last part indicate that the module has been succesfully created but not installed. To finish the update you must copy the file /cvsroot/biopython/Bio/Restriction/Scripts/Restriction_Dictionary.py into the folder /usr/lib/python2.3/site-packages/Bio/Restriction/ as indicated by the script. Looking into the present folder, you will see to new files : the newly created dictionary Restriction_Dictionary.py and Restriction_Dictionary.old . This last file containing the old dictionary to which you can revert in case anything the new file is corrupted (this should not happen since the script is happy enough the new dictionary is good, but if there is a problem it is always nice to know you can revert to the previous setting without having to reinstall the whole thing.
$ ls
emboss_e.407 ranacompiler.py* Restriction_Dictionary.py
emboss_r.407 rebase_update.py*
emboss_s.407 Restriction_Dictionary.old
$
$ # complete the installation by copying the new dictionary to the Bio/Restriction/ folder.
$ # You may have to become root to do this :
$
$ su -c "cp Restriction_Dictionary.py /usr/lib/python2.3/site-packages/Bio/Restriction/"
password :
Enter your password and that's it. If you whish, the script may install the folder for you as well, but you will have to run it as root if your normal user has no write access to your python installation (and it should'nt). Use the command ranacompiler.py -i or ranacompiler.py --install.
$ su -c "./ranacompiler.py -i"
password :

Using the files : emboss_e.407, emboss_r.407, emboss_s.407

WARNING : HaeIV cut twice with different overhang length each time.
Unable to deal with this behaviour.
This enzyme will not be included in the database. Sorry.
Checking : Anyway, HaeIV is not commercially available.


WARNING : TaqII has two different sites.

WARNING : It seems that AspCNI is both commercially available
and its characteristics are unknown.
This seems counter-intuitive.
There is certainly an error either in ranacompiler or
in this REBASE release.
The supplier is : New England Biolabs.

The new database contains 671 enzymes.

Writing the dictionary containing the new Restriction classes. OK.

Writing the dictionary containing the suppliers datas. OK.

Writing the dictionary containing the Restriction types. OK.


******************************************************************************


Installing Restriction_Dictionary.py

The new file seems ok. Proceeding with the installation.

Everything ok. If you need it a version of the old
dictionary have been saved in the Updates folder under
the name Restriction_Dictionary.old.

******************************************************************************
Much of the same really, but this time the module has directly been installed with your other python modules, you don't need to do anything more. If anything goes wrong (you have no write access to the destination folder for example) the script will let you know it did not perform the installation. It will however still save the new module in the current directory :
$ ./ranacompiler.py -i

Using the files : emboss_e.407, emboss_r.407, emboss_s.407

WARNING : HaeIV cut twice with different overhang length each time.
Unable to deal with this behaviour.
This enzyme will not be included in the database. Sorry.
Checking : Anyway, HaeIV is not commercially available.


WARNING : TaqII has two different sites.

WARNING : It seems that AspCNI is both commercially available
and its characteristics are unknown.
This seems counter-intuitive.
There is certainly an error either in ranacompiler or
in this REBASE release.
The supplier is : New England Biolabs.

The new database contains 671 enzymes.

Writing the dictionary containing the new Restriction classes. OK.

Writing the dictionary containing the suppliers datas. OK.

Writing the dictionary containing the Restriction types. OK.


******************************************************************************


Installing Restriction_Dictionary.py

The new file seems ok. Proceeding with the installation.

******************************************************************************


WARNING : Impossible to install the new dictionary.
Are you sure you have write permission to the folder :

/usr/lib/python2.3/site-packages/Bio/Restriction ?



******************************************************************************

Compilation of the new dictionary : OK.
Installation : No.

You will find the newly created 'Restriction_Dictionary.py' file
in the folder :

/home/bssfs/cvsroot/biopython/Bio/Restriction/Scripts

Make a copy of 'Restriction_Dictionary.py' and place it with
the other Restriction libraries.

note :
This folder should be :

/usr/lib/python2.3/site-packages/Bio/Restriction


******************************************************************************
As you can see the script is not very bright and will redo the compilation each time it is invoked, no matter if a previous version of the module is already present.

6.3 Subclassing the class Analysis

As seen previously, you can modify some aspects of the Analysis output interactively. However if you want to write your own Analysis class, you may wish to provide others output facilities than is given in this package. Depending on what you want to do you may get away with simply changing the make_format method of your derived class or you will need to provide new methods. Rather than get into a long explanation, here is the implementation of a rather useless Analysis class :
>>> class UselessAnalysis(Analysis) :

def __init__(self, rb=RestrictionBatch(), seq=Seq(''), lin=True) :
"""UselessAnalysis -> A class that waste your time"""
#
# Unless you want to do something more fancy all
# you need to do here is instantiate Analysis.
# Don't forget the self in __init__
#
Analysis.__init__(self, rb, seq, lin)

def make_format(self, cut=[], t='', nc=[], s='') :
"""not funny"""
#
# Generally, you don't need to do anything else here
# This will tell to your new class to default to the
# _make_joke format.
#
return self._make_joke(cut, t, nc, s)

def print_as(self, what='joke') :
"""Never know somebody might want to change the behaviour of
this class."""
#
# add your new option to print_as
#
if what == 'joke' :
self.make_format = self._make_joke
return
else :
#
# The other options will be treated as before
#
return Analysis.print_as(self, what)

def _make_joke(self, cut=[], title='', nc=[], s1='') :
"""UA._make_joke(cut, t, nc, s) -> new analysis output"""
#
# starting your new method with '_make_'
# will give a hint to what it is suppose to do
#
# We will not process the non-cutting enzymes
# Their names are in nc
# s1 is the string printed before them
#
if not title :
title = '\nYou have guessed right the following enzymes :\n\n'
for name, sites in cut :
#
# cut contains :
# - the name of the enzymes which cut the sequence (name)
# - a list of the site positions (sites)
#
 guess = raw_input("next enzyme is %s, Guess how many sites ?\n>>> "%name)
try :
guess = int(guess)
except :
guess = None
if guess == len(sites) :
print 'You did guess right. Good. Next.'
result = '%i site' % guess
if guess > 1 :
result += 's'

#
# now we format the line. See the PrintFormat module
# for some examples
# PrintFormat.__section_list and _make_map are good start.
#
title=''.join((title, str(name).ljust(self.NameWidth),
' : ', result, '.\n'))
print '\nNo more enzyme.'
return title
#
# I you want to print the non cutting enzymes use
# the following return instead of the previous one :
#
#return title + t + self._make_nocut_only(nc,s1)

>>> # You initiate and use it as before
>>> rb = RestrictionBatch([], ['A'])
>>> multi_site = Seq('AAA' + EcoRI.site +'G' + KpnI.site + EcoRV.site + 'CT' +\
SmaI.site + 'GT' + FokI.site + 'GAAAGGGC' + EcoRI.site + 'ACGT', IUPACAmbiguousDNA())
>>>
>>> b = UselessAnalysis(rb, multi_site)
>>> b.print_that() # Well, I let you discover if you haven't already guessed

Using this example, as a template you should now be able to subclass Analysis as you wish. You will found more implementation details in the module Bio.Restriction.PrintFormat which contains the class providing all the _make_* methods.
        

7  Limitation and caveat

You must be aware that Restriction is a fairly young package. Particularly, the class Analysis is a quick and dirty implementation based on the facilities furnished by the package. Please check your results and report any fault.

On a more general basis, Restriction have some other limitations :

7.1 All DNA are non methylated

No facility to work with methylated DNA has been implemented yet. As far as the enzyme classes are concerned all DNA is non methylated DNA. Implementation of methylation sensibility will certainly occur in the future. But for now, if your sequence is methylated, you will have to check if the site is methylated using other means.

7.2 No support for star activity

As before no support has been yet implemented to find site mis-recognised by enzymes under high salt concentration conditions, the so-called star activity. This will be implemented as soon as I can get a good source of information for that.

7.3 Safe to use with degenerated DNA

It is safe to use degenerated DNA as input for the query. You will not be flooded with meaningless results. But this come at a price : GAANTC will not be recognised as a potential EcoRI site for example, in fact it will not be recognised at all. Degenerated sequences will not be analysed. If your sequence is not fully sequenced, you will certainly miss restriction sites :
>>> a = Seq('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnGAATTCrrrrrrrrrrr', IUPACAmbiguousDNA())
>>> EcoRI.search(a)
[36]
>>> b = Seq('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnGAAnTCrrrrrrrrrrr', IUPACAmbiguousDNA())
>>> EcoRI.search(b)
[]

7.4 Non standard bases in DNA are not allowed

While you can use degenerated DNA, using non standard base alphabet will make the enzymes choke, even if Bio.Seq.Seq accepts them. However, space-like characters (' ', '\n', '\t', ...) and digit will be removed but will not stop the enzyme analysing the sequence. You can use them but the fragments produced by catalyse will have lost any formatting. Catalyse try to keep the original case of the sequence (i.e lower case sequences will generate lower case fragments, upper case sequences upper case fragments), but mixed case will return upper case fragments :
>>> c = Seq('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGAANTCrrrrrrrrrrr', IUPACAmbiguousDNA())
>>> EcoRI.search(c)

Traceback (most recent call last):
File "<pyshell#110>", line 1, in -toplevel-
EcoRI.search(b)
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 396, in search
cls.dna = FormatedSeq(dna, linear)
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 137, in __init__
self.format()
File "/usr/lib/python2.3/site-packages/Bio/Restriction/Restriction.py", line 153, in format
raise AlphabetError, " '%s' is not in the IUPAC alphabet" % s
AlphabetError: 'X' is not in the IUPAC alphabet
>>> d = Seq('1 nnnnn nnnnn nnnnn nnnnn nnnnn \n\
26 nnnnn nnnnG AATTC rrrrr rrrrr \n\
51 r', IUPACAmbiguousDNA())
>>> d
Seq('1 nnnnn nnnnn nnnnn nnnnn nnnnn \n26 nnnnn nnnnG AATTC rrrrr rrrrr \n51 r', IUPACAmbiguousDNA())
>>> EcoRI.search(d)
[36]
>>> EcoRI.catalyse(d)
(Seq('AATTCRRRRRRRRRRR', IUPACAmbiguousDNA()), Seq('NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG', IUPACAmbiguousDNA()))
>>> e = Seq('nnnnGAATTCrr', IUPACAmbiguousDNA())
>>> f = Seq('NNNNGAATTCRR', IUPACAmbiguousDNA())
>>> g = Seq('nnnngaattcrr', IUPACAmbiguousDNA())
>>> EcoRI.catalyse(e)
(Seq('NNNNG', IUPACAmbiguousDNA()), Seq('AATTCRR', IUPACAmbiguousDNA()))
>>> EcoRI.catalyse(f)
(Seq('NNNNG', IUPACAmbiguousDNA()), Seq('AATTCRR', IUPACAmbiguousDNA()))
>>> EcoRI.catalyse(g)
(Seq('nnnng', IUPACAmbiguousDNA()), Seq('aattcrr', IUPACAmbiguousDNA()))
Not allowing other letters than IUPAC might seems drastic but this is really to limit errors. It is not totally fool proof but it does help.

7.5 Sites found at the edge of linear DNA might not be accessible in a real digestion

While sites clearly outsides a sequence will not be reported, nothing has been done to try to determine if a restriction site at the end of a linear sequence is valid :
>>> d = Seq('GAATTCAAAAAAAAAAAAAAAAAAAAAAAAAAGGATG', IUPACAmbiguousDNA())
>>> FokI.site # site present
'GGATG'
>>> FokI.elucidate() # but cut outside the sequence
'GGATGNNNNNNNNN^NNNN_N'
>>> FokI.search(d) # therefore no site found
[]
>>> EcoRI.search(d)
[2]
EcoRI finds a site at position 2 even if it is highly unlikely that EcoRI accepts to cut this site in a tube. It is generally considered that at about 5 nucleotides must separate the site from the edge of the sequence to be reasonably sure the enzyme will work correctly. This "security margin" is variable from one enzyme to the other. In doubt consult the documentation for the enzyme.

7.6 Restriction reports cutting sites not enzyme recognition sites

Some enzymes will cut twice each time they encounter a restriction site. The enzymes in this package report both cut not the site. Other software may only reports restriction sites. Therefore the output given for some enzymes might seems to be the double when compared with the results of these software. It is not a bug.
>>> AloI.cut_twice()
True
>>> AloI.fst5 # first cut
-7
>>> AloI.scd5 # second cut
25
>>> AloI.site
'GAACNNNNNNTCC'
>>> b = Seq('AAAAAAAAAAA'+ AloI.site + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')
>>> b
Seq('AAAAAAAAAAAGAACNNNNNNTCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', Alphabet())
>>> AloI.search(b) # one site, two cuts -> two positions
[5, 37]



8  Annexe : modifying dir() to use with from Bio.Restriction import *

Having all the enzymes imported directly in the shell is useful when working in an interactive shell (even if it is not recommended by the purists). Here is a little hack to get some sanity back when using dir() in those conditions :
>>> # we will change the builtin dir() function to get ride of the enzyme names.
>>> import sys
>>> def dir(object=None) :
"""dir([object]) -> list of string.

over-ride the built-in function to get some clarity."""
if object :
# we only want to modify dir(),
# so here we return the result of the builtin function.
return __builtins__.dir(object)
else :
# now the part we want to modify.
# All the enzymes are in a RestrictionBatch (we will talk about
# that later, for the moment simply believe me).
# So if we remove from the results of dir() everything which is
# in AllEnzymes we will get a much shorter list when we do dir()
#
# the current level is __main__ ie dir() is equivalent to
# ask what's in __main__ at the moment.
# we can't access __main__ directly.
# so we will use sys.modules['__main__'] to reach it.
# the following list comprehension remove from the result of
# dir() everything which is also present in AllEnzymes.
#
return [x for x in __builtins__.dir(sys.modules['__main__'])
if not x in AllEnzymes]


>>> # now let's see if it works.
>>> dir()
['AllEnzymes', 'Analysis', 'CommOnly', 'NonComm', 'PrintFormat', 'RanaConfig',
'Restriction', 'RestrictionBatch', 'Restriction_Dictionary', '__builtins__',
'__doc__', '__name__', 'dir', 'sys']
>>> # ok that's much better.
>>> # The enzymes are still there
>>> EcoRI.site
'GAATTC'


biopython-1.63/Doc/Makefile0000644000175000017500000000174512250104543015224 0ustar tratra00000000000000subdirs := install all: Tutorial.html Tutorial.txt pdf $(subdirs) pdf: Tutorial.pdf biopdb_faq.pdf Tutorial.pdf: Tutorial.tex pdflatex Tutorial.tex pdflatex Tutorial.tex pdflatex Tutorial.tex biopdb_faq.pdf: biopdb_faq.tex pdflatex biopdb_faq.tex pdflatex biopdb_faq.tex pdflatex biopdb_faq.tex Tutorial.html: Tutorial.tex hevea -fix Tutorial.tex Tutorial.txt: Tutorial.tex hevea -fix -text Tutorial.tex clean-subdirs: $(subdirs) ( for f in $^ ; do $(MAKE) clean -C $$f ; done ) clean: clean-subdirs rm -f Tutorial.aux rm -f Tutorial.toc rm -f Tutorial.log rm -f Tutorial.out rm -f Tutorial.haux rm -f Tutorial.htoc rm -f biopdb_faq.aux rm -f biopdb_faq.log rm -f biopdb_faq.out distclean-subdirs: $(subdirs) ( for f in $^ ; do $(MAKE) distclean -C $$f ; done ) distclean: clean distclean-subdirs rm -f biopdb_faq.pdf rm -f Tutorial.pdf rm -f Tutorial.html rm -f Tutorial.txt rm -f *_motif.gif #output from hacha .PHONY: $(subdirs) $(subdirs): $(MAKE) -C $@ biopython-1.63/Doc/Tutorial.pdf0000644000175000017500001116451312250104652016070 0ustar tratra00000000000000%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 810 /Length 1312 /Filter /FlateDecode >> stream xڕVMs6WlOgژ ɤM؝^|(bE* [~HAiP{E(HS(4%QHHxMIFDFR$u4d K s9%@i%$(NH0NIKҘr5K$i %t(A$$Q4M)+<:i 1FY1"p*BidHW$ 'LbqcvsŘ́xFDS@UB$iD ݯF0 ݇Ȍ|O HO& "oB@)b<%sP$QC@0,B)87259^4g9@9E3@N"dd! t&@LrM(& + ͤfJԈE@5E"R.\3$S3xQj&L9T#3)L1[@2&9S "dS̴(]  _6{.n⣻ut;+y#ݻU _oĴTtgro!#gT辬TWvAS̓ AS7UU;Y2]6־zyKlKZ;_ߝ%jL+5xx㦲utTիxmmSj}"wOOL㾖Kۆ&]f^8>"l8r:dMeC#MӲ d5c؃)]on稀x c0@{S7TTTAu.Mkkֻ z~uQj@ꚿM,JWK. WYm:&t3+"ު1 yY [\[ iU=Z w55!z yߝ066!\WtcTlT@tX+*ړHqijǰ@#% x1i$AՖ#1G~9m~دqc7/pAY7}|흞9 OO?l=>OGO endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 866 /Length 1328 /Filter /FlateDecode >> stream xڕVnH+c@Z^Xܥ8Z>ߧzHіbA"9ꙡ$E$TKBƐxp$b!i\S.XJRQ2R2 T⚐Fc"W GSL R TWKJI(a)y:JH!`hJ3zԥI)\wYX$n)I'IPeEkTj^l%Qo 7xRęLPB0 a30 Åf`59Nx tRS$\E"eiaHQB"M5nE< 2`0gAQdH-i9SKFPQ&cp`3U$;0PJ `2&kvB)C3D`Ojh `fbs9:3"P1?epĄ[0aG tVpV * ~O3T_k Bk$aDRAP7cA!X>*nPG0_nkhr_Cqӧٻ-oii{;lqa֕ WMWu-&/\=ƤF;Gk+Pb+m/Unvju}Qf^y [i*Q Mq, KZ'I[Hamb?)֎7EU iC{6Nz5F<'2>lmӐޙ_5ΕC2W+LlGot㹡 k Z+;5ѷ u07@sjQ޾@Uq-< T%!~ݽxwc]:2r\JxPho:m}[cn۽Mcg Df/us6yf|mGǼamyũ۪]y_LEN'_&g糩ff_%r/I˞};>XuK-6w=_.z2mYr~a>y4x8KpFm/lQӚB/0>ٜ d/yr|cU;:^ԼOJEK6vT g>hQغnNcC|ayw5@-~]ؼ|߸f*m>;Q׵E1HU[N' _9]nԩ"›ֽxLx 6/ϛ;:yxy1 YtE]6;vU[-Yt?^O*ɍ4DVzO_/]3` 쨒 endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 864 /Length 1418 /Filter /FlateDecode >> stream xڝWrJ}Wۅ*MK cRŒKcy⨐%_-$9- 5#t9=u( D" 1iEZRHC ! 6 0!-f&hIF 4Ƙ!.!`2GE&'Zk 5?GF1E AA\#)b\c(LHqcBI1J`CEI':$N 0   L 4" hlP#ӱDYY%%8NȆ S<"B%'< A< G@$1gI04,Tc*ZU+30K@/)&L 6bR*LB)& 4@*TaTh&7@f ~RG2i H;ē]ɠX?94~ GJLLCe- 14HW! TBt((d RFPP&ѡChbB f *8 *PD#:W+V!씂Wf%KI/NIk6YYGH>W&Oe1SM/GM˕+C^SQ6l[,l #e 0|]dŒjgeAo9{_gZǀ6bn`<k6ߪam9Usp]7:J> stream xڝVr6W!+b@.U>\Ȅ`@Ҳiᕬ\ 3==*)"$S\2JpLEQH3GYט8XS,e$$/%DH|)N488C^,(>)J %NR!?!!0ó"K3A+RtcJ9^)P =X*, hpEP G`7S,V*MpiP ^ d3TBHF 2!KV:r"7d% A, t(<`. " 6 >TQ" HCuX%ѭ`Y"ӈ2]o3o0* 4,л9YBDOka"4\4C6>r"y{̙F@XHAD dbV4PPAAgi 9 ! g ga gAL8(#Lc eN᠌P0RӧtvEgGGgzt;Xu=[=˶<\sڕm<u' rC_KG~'\uvMXMv=U?GXGG\2zLw4/ޘjGW5 ,NU:}_C;l=2]بmm;u{`<̞JXi_~5qx/: Xq_ۨ;EuL rzn-M.7P9؇"C䀄deQ߬r9]}/ǡr-Ĭdo,Ӣ$wC7E&_ҭAe >bLӆ=!omڅpMWηsax.ʼ9pN+ܣ~v~E^+z-F}9/O,khYP12Ԕ||&|yK,?t~ z{> stream xڝVMs6W19&@f2Qi'5 S"X~$v}RRz"}RHGbMZDI+Go8>U:mm?\ @ƞuw__' :v5d kZlL7]Y2uumUC)j#/[ɘl(㊩*S9P̙HFy\;څ֯!-PkڇTz6Hő1'C :tℸpw8T6a!ׯRʱmoo//&|?Ծ,1b}Ϧl[ms7~\G~ }2ƻ{ 38| c~uX.As8dqϘ}GeSK>2Lj1p70oyN4ܺ+dž#ZPm?vaGe:;}ȉq ܷOwA  #9o)a" χU*WM# ,,\֟bSnwӡ;K{irOop/-SXMH XP),T'$:_^ֆYpyowU(g8w~RƩAO+pz~|'s-Ի5 _psQP76C+)_K]]g?."P endstream endobj 1007 0 obj << /Type /ObjStm /N 100 /First 967 /Length 1447 /Filter /FlateDecode >> stream xڝVMo6W̱bG$ v$AMK.K$*}Õqf͌((D$"R97&!26YFNRH6 !%)H'g02%"Q3bJS9S)erQI"R)G̕Ĕ+5I(O")')8TR˩"Lf"e3Tw [\8%\pl)rr$)-(=R)U . + 'WP/'2$+ LEv )j)`$[p n&9 W?p9+r +g6V X1{EQAbE $++S?#@hR$|̑5I+T2tRqԖd6 pgHge‚&T14iǡ.Of ˌ%\!$A^4E H8BgŔE!RB3+B2JO[-͕,%4WJeg/_ҋ-_ו7酸ի_>ҴݒiTص©ܧ~6QU8ژdyvޚVM_9Әl=]e}ߛ9VCYO@]Ys=u6ݝu\B|_~8npH5ޔKZ#iH#si4#J^3Uu|W~7Яw?L.no;'ծv";~ngL[Úխm)lNPf~s?T>i=T=H~]]^>xc\j=Ow{-op+efةԚJ/^jo1q+g oӝߴncv38gGviaOWQ*L)v6$r7pAI#eZ_z>}}QBxC=3?p>u{.RpAhȍa]?G{XB=lczd6ڂ0vu\>^(nzE,;t? kgU w:>/>}CTl*i0) ux@FnjQ򟠔kt}L}R.Ӻe}t1#OC>~+Cs}Xڴ~lus|l7k܇wؤNᢰ=&l5u[WpW$tSW[?q;ֱknn4|p{9y*7Tެ5_B@f,_b + u˓Ec@)m@ٰT٫qCӔ-n? endstream endobj 1328 0 obj << /Length 428 /Filter /FlateDecode >> stream xuRK0W(AH%}6=V긅# e1x7AvDxCb$)d+ɶ~fF)JB d1Y{ 3~ d+u<&`][rk5Q( y6,e܇JHZ3S_cZuEmRm`9օCOV?!uIxyax*[U&'n߭nzp{\Jcӄ=0 th} nNsp?-Ì*vEu|CrP*ljS;[LDsLD'B]ϰxta~@ĬćgvRs7B*|h)ʊkKrܵ=~t1|9MM7*77 Yw~AERD^ױZ0ۈD Al㾯9 endstream endobj 1326 0 obj << /Type /XObject /Subtype /Image /Width 1024 /Height 288 /BitsPerComponent 8 /Length 121222 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIFHHwExifMM*bj(1r2i ' 'Adobe Photoshop CS3 Macintosh2009:03:30 16:22:51 &(.AHHJFIFHH Adobe_CMAdobed            -" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)%3u;ck!Ƽz+xebZ&fVVʺ26R+c[  NKSޡ WQ}nuVxWg[g~nVTdXkDp3/}U7}-׿I9tweՋ Hٔ[q_XΥ22i6OGP儲d88Yq0Jw_#YcG/d%ߟEEgŠffp隯h1fqc3_OfQ`.eWCj9l5W Cx36<#epYj])HG kC>U,g_߬_=٘ 9 ?k7;;.2#z]pݶRaH%A>~u"gI>l_iMX7Gϡo;P_̣$pl8%cǧ[5J>/ދNMPe74> \75ȋq-9_KN ͕*z8i/U:ّ]knpg\QYqJ 2 ~Zl}dNTki{̇w>c"=W\s1i Ʒ15ŏc.+m~컘|l,"׿YJY7=m'׵S${WYp)^޹1cVXߺ5cٌܶXӎza#v-ڱՏfϘ5=\[7iɱ =W_EX}Xokr9e[ `t&Vm88-yx2\ݛ0_/g 3b"18_j"$ <}96+w{LEŖYomŶڜXZnc­k,ŦgG[_ZΚ6E=ޭDn#7m6<\QFQdS_֋`dHuO];Yp>Y.m66Vw]C&f~_ҲS_Penw?BۍΩ-gF5UMwZ;ŮT2 U ~ej5K=0} ~}?5K&zeXk_PX\1e .f~+?ȏT|2C߿G ^6Kj}N7~?O0Ο;z_ zF+0įcʛcCR\U}dX*myWѷ'ƴ{g;}>+f^P{KnU7moXYZZpz gMXSoQœ\qf0_ 2_Vf0$b'u^Ctީ6;2_oc~:~vKv1.X̵ߏQ#^1}W԰Ь z-ϩ={:]Ym-ۊ[ߡK?+?Z7c;gzdE1_i佥d)7e[F`>mZuiOkF5Ωӵ7zߪe펗OfUGEԮ5--mol7odz?V&L\ϕɖPC("xpf`R>ޥO,5dhJF[zG\cŮ¢6v6[rfN#WW[ksMuݻO޳e6T_ڃրV7ccj2z8xl1F4{]^}_N!|\oaY?_+ ~eіDgtv]_6V>Mxؖhs5Z;?WZzGP9eLعmCںfC\_UߟGUn=-%驦ho15W\3g+O%wrX1<3m\dbTG*umx[;7fWPOŢy4?1m݊Lg\s11ICi|vcd3z+zgPǝ_m-fͿW.RQY?%S2cFX8|A+ %o~G䍣uBCt=Ih`u,>Y~3m:9'G9G$e1 X2q?{o>E#"z})[غE6r1d2 `/1x>龎?W"<646e~?gazYUͬ]k]{փ茟\Go]gM>>?c=_etCh~18:LKjSJ8p SGı^XˋHwFS~@q6ӓ`.7 ʝ1XNaSoYo/EuoE{4IgOѭtBtO+2~!" t^m}_WvsKN=yXM~cLk?GoB9E6EmjmlkZqmu\?woO{}OS>~=O*://_3#,?;w8͙r81@f;}jksp O1f5ѻnKUXXۚ,cQ{?mȫMWiW6w1}_UfEMgWꮫ7ogw?Jom}8pS(P$V3_'g҇xZ)M[CXl5ebmWtzэ͏cJVUJ='dl~?mg/OW`T}g6ҍ~ٵK Ra,A()~YbqN8r޽yS=lmi|w3s[gXV62>u~׿KLޕ_sW{_=nw7}x>J\A@o ?Kb)GC(YYW鿧}-hc78=̲~wKo+ueo-en{^ \1ǽg>[+tQhJӔXc0kp_m?jh]a7.`XD8Kp "Rz+WsMPp2i.'쑏`}gm2{otF-Kw>=7;ݻh ?ۓ猠\a)w?}kr}?g'oGg{fg{z Q13NC:0BPhotoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName A4 com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMG  biopython nullboundsObjcRct1Top longLeftlongBtomlong RghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong RghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM ]-T`AJFIFHH Adobe_CMAdobed            -" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)%3u;ck!Ƽz+xebZ&fVVʺ26R+c[  NKSޡ WQ}nuVxWg[g~nVTdXkDp3/}U7}-׿I9tweՋ Hٔ[q_XΥ22i6OGP儲d88Yq0Jw_#YcG/d%ߟEEgŠffp隯h1fqc3_OfQ`.eWCj9l5W Cx36<#epYj])HG kC>U,g_߬_=٘ 9 ?k7;;.2#z]pݶRaH%A>~u"gI>l_iMX7Gϡo;P_̣$pl8%cǧ[5J>/ދNMPe74> \75ȋq-9_KN ͕*z8i/U:ّ]knpg\QYqJ 2 ~Zl}dNTki{̇w>c"=W\s1i Ʒ15ŏc.+m~컘|l,"׿YJY7=m'׵S${WYp)^޹1cVXߺ5cٌܶXӎza#v-ڱՏfϘ5=\[7iɱ =W_EX}Xokr9e[ `t&Vm88-yx2\ݛ0_/g 3b"18_j"$ <}96+w{LEŖYomŶڜXZnc­k,ŦgG[_ZΚ6E=ޭDn#7m6<\QFQdS_֋`dHuO];Yp>Y.m66Vw]C&f~_ҲS_Penw?BۍΩ-gF5UMwZ;ŮT2 U ~ej5K=0} ~}?5K&zeXk_PX\1e .f~+?ȏT|2C߿G ^6Kj}N7~?O0Ο;z_ zF+0įcʛcCR\U}dX*myWѷ'ƴ{g;}>+f^P{KnU7moXYZZpz gMXSoQœ\qf0_ 2_Vf0$b'u^Ctީ6;2_oc~:~vKv1.X̵ߏQ#^1}W԰Ь z-ϩ={:]Ym-ۊ[ߡK?+?Z7c;gzdE1_i佥d)7e[F`>mZuiOkF5Ωӵ7zߪe펗OfUGEԮ5--mol7odz?V&L\ϕɖPC("xpf`R>ޥO,5dhJF[zG\cŮ¢6v6[rfN#WW[ksMuݻO޳e6T_ڃրV7ccj2z8xl1F4{]^}_N!|\oaY?_+ ~eіDgtv]_6V>Mxؖhs5Z;?WZzGP9eLعmCںfC\_UߟGUn=-%驦ho15W\3g+O%wrX1<3m\dbTG*umx[;7fWPOŢy4?1m݊Lg\s11ICi|vcd3z+zgPǝ_m-fͿW.RQY?%S2cFX8|A+ %o~G䍣uBCt=Ih`u,>Y~3m:9'G9G$e1 X2q?{o>E#"z})[غE6r1d2 `/1x>龎?W"<646e~?gazYUͬ]k]{փ茟\Go]gM>>?c=_etCh~18:LKjSJ8p SGı^XˋHwFS~@q6ӓ`.7 ʝ1XNaSoYo/EuoE{4IgOѭtBtO+2~!" t^m}_WvsKN=yXM~cLk?GoB9E6EmjmlkZqmu\?woO{}OS>~=O*://_3#,?;w8͙r81@f;}jksp O1f5ѻnKUXXۚ,cQ{?mȫMWiW6w1}_UfEMgWꮫ7ogw?Jom}8pS(P$V3_'g҇xZ)M[CXl5ebmWtzэ͏cJVUJ='dl~?mg/OW`T}g6ҍ~ٵK Ra,A()~YbqN8r޽yS=lmi|w3s[gXV62>u~׿KLޕ_sW{_=nw7}x>J\A@o ?Kb)GC(YYW鿧}-hc78=̲~wKo+ueo-en{^ \1ǽg>[+tQhJӔXc0kp_m?jh]a7.`XD8Kp "Rz+WsMPp2i.'쑏`}gm2{otF-Kw>=7;ݻh ?ۓ猠\a)w?}kr}?g'oGg{fg{z Q13NC:8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMhttp://ns.adobe.com/xap/1.0/ Adobed@          s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]4yBpտaXVB{(9NwvfmY KpyPO1h(yAyMVAńpeokO?t}%[#&XJ t?]D?i25 a{jJH%!O%_ͮL$cv{c𸚏g)<t98yfCE3_ Ń:QGמ8q}yc,ڲj Ե%6 UuZ~hqO;!= YYC)XT ׷v*UثWb]v*UثWb]v*5'E7Z66q"ƦU,1h6c)mor lKƳx:-f8%)9O\BxG!/>#qy=@V nYLc_Ǩ K%'r&< Q~Ě?jsg&LF9Fz]YA_n,>lh;sWfpp{6-̖\o@j e?1WQLᘣM3-v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]v*4`ct%nҪ쇌Hñb7>8Onjxևv\)y?8k!޽N ,<y-~SGjz]GlQ˻Lљ{p=(δ?NaC5R7)}wpik%77 ʲokQ5HKP>{?}N2.\QUlѸDŽ/Ό40$4[7zehd;}^v*UثWb]v*UثWb^a՛Kx\_ſVyoU98tw> Dz;欙H?}/Y5i. H\0y^M۶sg/Q?澉D j_OgXR! (7aACP%BR轝\-+2*wlRpȃ $[; ^ILL/hJzh[LeS|@ycJִSyuoGI,C*5GNͮˆ@<櫳1׫_[U~sysB޺R>wZDؼGniUhgԍ?m8$'(sU54}FJEh[J)^P[6Z>ˤߥhcYN/ikqZZ]1lX~ǬͻSGx~wF/)}m(GI%%;;Uf ҋA TjgO6z= ny'VS)TdqEXvjO]aO@l^ rL=H8h^Hz09g<.L hv.cWe Z26G26{̵,ŧ:d/.V+BpjX=H7d.}4*=oqwy Z4d]ML!cJ/Wop3.]#h5&#kS"91,U T9DcL%^p[Ȫ'z0ܐsY)Wfڤkrhm.Im"`YJ@=:O|h`gQ4Qq9K_/U m*p0 &Vo-(9|$=c 9bl/R t3T[5fQz68@d-Jm*]Xar"]jH%M%vx N.XH⺿В7z:Ɨvm5KskP=7y:dR_viP5;%;6}hQ =GC;h姗ںb]v*UثWb]v*/)Be 抪NW$q[ #ek+In&$}Y! UlϏ(2 b@zJhGjѼU 44pǗ=iJ7(WHm(Gkhl2@( 7+%DJ6Fi0nmZPh mVXr̘zek%Gt55yiW)oɸ-c]y&$=7Rnm8mnmO/[/hc ywq_IL9UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]yϝc֐ISFT#$Cfo7~:\#?'/!=?`vosq?_ߚiid)XBj;S8Yd0`9KxezZXl|e3O.zNfQ\ (GӬ5_[K(tvIE-WA/\zdS1][Xe5Ů BcR$oOd!Ϲ Z ktKO[Nٖiؚңj% @|R% 6!mFxшȶή)jfXG?"7 Khk_=FfR6;03O^Nb : <~T $'$䡾OCV05e΃Zictrcy}Ͼ|-3Ϟ[i񸀚3{߸giu1όN=_7`K#̧ثWb]v*UثWb_&E~o[Mm2F' ֌] QN:swY-NOH{H0CƟyyPy,r4Ĩ2+٣ť"X,rӯB7= &s"ѵ}ऐ%ܓ9٘-R{m\jpea63= Gǥ\{y+KP3ƣAywdHrlQM=X <f xxҐ]Gq:]i䉕=jh659  yYA\Rrt*AXԈt.nәPIBI[PSO4+eg yެrKoHIVvhhG|9GZ#WԞI> (V6qiO!іP&8OW~Arbe;"- rC0kw-קj>e=1~-vO,UثWbT縂a1Id!U@I`R;~FѤh,WPI[%b27Ϋ=.?޻7ajr"cž+q3HĞ*,K#@K8qd/ ?i+M`>Uل=O$-9|jz$F{ /㏓Y 9<|x%Z4KGųSeuK%]? I=,Ȅ2**UثWb]v*UثWb]v*UثWb]v**UثWb]v*UثWb]v*UثWb]v*UثWb]\em5ˈѥCQ"O #O 12 e?*/{pލ@`jmQ kZ<⒕(= jU=T2z-ݲ nvs)BN&)F]ë%W{ F%׍$^]:-$$t"7imi2^K%Z_&T5wVua$W$y_ߙ;hڴȾqҐ-TsNǴoѳ;7]z|]g^͛wZUثWb]v*?%zXe@)ks|vh >gGyc)j_{7sZ^ٲh2TM_h쬧B*S^Hp̶B\G=A-e+{T|5cS+yOATO^oZnΐᣴ~YO;"A9HXԧՕRGlQĂ$.BW1 _ cm];LI.!i,Ȣ׶,Yqj;/>iss>55Hx`1C˿mХ:ZeGu#UqFn ✶a=Bx3s=є6"_ 4`1qDy9qw%K}Nm[Y"_A7o#qd"GYU川'ӵFa}Uj( wc.2u2yМE::Ȫee5=!b]v*UثWb]ϩ)Lm)ja.ՒQ pz~}?wm>)Mu)d^W{8)s<$ykZ3,Me6iMHgE!gG3Ƀ_jNHg,Hcb9ӥɔeMOMg` z|y;>a]8c4.norP7]\uHP{ ǎz:Bm{K\bNqx_,w4IJRfrr;Qȓ " vN6~oBU6x\^\piDG F[=O6A* l K)HJ>/ZGq=Ŵ&,j@J cêΦ;{V6"[x'[ňyʑHD۪^!n#$ ZE*73v6gȿYG ƽ޻#PɻKDt6O'fԻv*U濘?_T[SRMmDn>_,{ShThyݑVow_'?/>{}cO͵FC`t}  8͐iG5g&wV-:@:A xY3S7`8T6?ɱ~?RߕQY( BO+wvǹig ԢNzk2vPH3-wG+ȱԏυZYwX|O)מUkpC6kISHO?fA۹td+v>-P>@yBDbt/2R=mn)B^YۘuR$>wJo{oZ΍ѻv*UثWb]v*UثWb]v*UثWb_*UثWb]v*UثWb]v*UثWb]v*UثWb]kykTD}cRV;}[ >tLOs{53q07.g,Ta X?ǚ;oZrd!0C% m^þvx><ǙuoSʞXdH7EPYcofװO.iyjo/kqY4B0ť>#o(͆9c[e8Z凛#d5|ڱ&7ꇪ|K<{>qod! A**DCHcUҊͥ4Pٕל26Q^b%3h2I%h Ga;gcF<8ۺZm6f|>\%fKCWb]v*cFTPYIH@x~ 夬,cUxoJRLIuDǴ?p?Wx X#%UCCJcw&:bޘRk[HjmG!u#O2y5}UOdpR@>R})Q1J>jv#$((er7hN'~_'ybB`hEnI=G,qe#=n&9Gzǖj^0BX"`rhJpH]=># n@Mհ)xvއ#zr?y=QݗZKũ.O"+_&^(C_I2 K_BƋkBkQ~WO<2Bu]#LՁcosj stz`%2`1/LͶН93cRv={gI<ĹkIߤ-X.#afF(Ѓ^37r5m8p![\8)sseF^`F@-It6!6lk!E1b?=һ _'x>ǁr{t΁ثWb]v*UثLT v UgCڌHa|FE뼭&;}'W zo0\j pKd(+%XZXNLA$a@ Ww9#n)iޡt씩'6Ͷ2u\j3 \Y vMwz{0 J;>e. !(֠ 1AdZ+Sڝ0{;|`:K+){$M:.9ǎ5#nRlK,Ӣ"PRـ71)TӸ| zO (f*Aw4krHN`WSMvI$b, 4wGSm2M A"Ҫ|@︮N懨WqFx}Xkz\Di"x+Px2ZvYc@^sRO#`I5nR'rfq _󽗚4:G-d 5D|Cn-="D?Οt_wB֬<ţkdK4-ލx"nLgO0en_>rx_4w:n#=*ۇ~ň^ FȾ\uXO4$wwjnI'8\xy#0 W wu-L EY&`҈D tY[fOy?]=X̀JI9NNϕl ll3= OSG$_ך=N 4([7I\SH}9*Cwf8E֬4/i#!(4Q-LOaNx4wz^|;|âWcNLdd_;n0&x_'1MI<C"D!AlA į®]v*UثWb]v*UثWb]v*U*UثWb]v*UثWbgS]͎=-TEPK(jPi 4?O73Կ7OwS??SM5?II 4k>Z&):~r6SUdn_˴6ysO"FmF_aTv*Uثssii/x!L2Kjq*|qM%PII 4`TVRYў%U\Y_I ޷CV`;⯄$1KVޑYFkfGQ|!Qq<$hWBZT~7|]\^]I<ח&a@噔/X˭恦Y>uXB\*d496c"w?CֆX_Q?ڝ\DZח'4{2w.@xjobx#ow]=>|9#@Ь,\ i6m8#$|1&*̷]՗I?[.~ЀTz(.]?-^^eRXԓjOFN?7 ZivA?>ԺV[11Q6iFhm)ɒh7.VRw,*֖#YpxVڢ> [UVd{6$Jӧsăe?Ě6m,ZD3+(A@QtpRU{h]\+qXYvs8r<{ uNc&iv&ͯs@E=Odsb/g ط;]667Tccm/ ηOJ=KSOV_2hdӜzot3eJJͯgf9ØFHpˑ}OB]VP[P)pu0X Ǒ|.#f'E$Sښ?Y x_/[Kx-Yo18\FZ>A DqWNOcjTS.&0ɜbwvϥsa99ҮG-upХ [~aH%Ǟ//k!?oIY^AB_gq%]J A'dM NJx93nQE*Yn]Bڤ,X!:0f%njп󏟐fœZմcc۲4w9Gn|7f0-Ș{ Ontkִ= B igkÔtsZ=Dsc?c?:ģ@*^eJ@vy'FKK;,j $ZTwsYK<^|r.]A,oq#^Xsr)]l]`,Oއ47P6:pZrZ uRԯQZS-&!(n:3d#(Ln:%׺ᶰxd+#U$XpN7(ɊOmؼ3[K$q) f3Hb'iW:~qs\~Gf 0J͞޴ׅ.Ox.Q#w}KǼ#Vkc?|#ǩդN_gq=^_kvGfď79~Iiߖ]CЩ/9[' M<_ِ7#Z=|OǓnjzh2aVcC8z̘Q<S$~qǩ!IrZ _'OힱnX˧ؾ}D>ktO6t7\R\E#U%2ySFPUثWbSϞe|As[Cuu4=)@Rq#}Hy CIVҬC -5AN(Z"J)U@Cy:o]6Y1WN=)즒^=MD=+qq+__!K?Hk]ētz<"r/0"ud|ȭ+ERHURŠ\o/6Sk=XsAe6P$`J-iV R8y+NCI N%bP൏v {{|1m7̖ژ\p_@WSRS &KN}QTAƂjKۗngKٶu:nd>+.?7ti1WBۂ>逷Ah8ut?5xJ9lG~G ڋ~tiSi_¶ߝ(~ ڴ7 SV:I6 ႒4/wQA<}c ᐰ݋4K& ?IѓNе(?%<7(?n 8HG׉aeH-)5DNjҤk#@'I/u ]kZy3FR ouw_z}M4BRB, wq%z(Zj0zT{ ^\(2LJWӞ} ÐK 1^VG{]B =M!auj ")^4x'_{Ɉdss4 rT}9x98gdOg$x=hx]DyQ׏|Fٍ@JƁU.InIў9. Voݼ~ޙyS~ rme,P}_F#=YdT7hh nzd(6wz I?9xhr[G,2Α(ǥY{O|jh^oAuX%H].#G*1OIBnxӮ2H}G~inm HidOX,(YzaL&pK/XPGC14pO~?ci+OvZ;_?-ݢk_يڙһ\ߊGK[hu1[huԸӟ=?]Rp.`aĈFVxd%ɜ9m4j߯M=/[򨉐e<۱F[vIqtھlqyG[f"8.!Vۙg?B>~X|sVM7E~kk_N+1? P> e{\ܱG^DNN؎` 'xUPO ͖r1cهy^M&2[@79O˩=`)<Țg忓t)idg}?ɠΟ!!9%^19)P.VjJT\ZGg1~;dk|'xn{ڋshY Knu"Iބ>ya+_7ӱJV_Ӧ2t %Qr +NիO0.8([a'휦i+/'dˈw3Y'B mFl &AQ3S;Hi_ĕZʹ\J8aP*W34&).]99Ye r7—[[VǚXV9q(8 LL{^z/ce)$dmcONf ȥkLq,J5ו7|<&S2 65&zN/C Oo4s_o1]jBFs>)Н{$UI}9h~zР״[i~bj a}^? v*wqL]a@3j,Cwa~&,ʍ_hGa:ӈ˓ż/mMחrxkvwL~;K|Hn5IQ$˛2L]v*UثWb]v**UثWb]v*UثWb?%$g,+?d:~\_ߓFO/i׷N9XLâ>oC~B՗*d _Rx+邖~C RˎStSOm%?ZF}N:T(OC~Zߕ^jVs*X]ۡ4boUiy't3\A*iq<71jA B_f~P~aC=7DZV^^E :ˈ(!aCW>Mp/48 8{W;M/i[]B9.ہOMI/6>-iƣ&/̱ثO/1X].q!kM?RHՈisP)s}O68!KF-,O|8+oؙO^%DIcel;/OȏȀ yzzTgdtnJ wqTyiȞˈ.ħL֟YJGo z [uQihLwsK*Κ}Cr#Wdž?|jOsqYbm1IoREQeEM?QO1/$ƵWm?_|x}me_e.W7B~φ dYf2s`|藟PUXax6gvfn?ovf:@oLvq;Tn'X[`ῼC= 4Lh?kp$*\KMMY8 7p}է] <>?|7|6|ǧ=),2xMY3$@ى~ey~~Awt0跔#@X杣:IJ<oh5#S.Rr\Z.W귒 GQoO^HsE) =^-nEaRxN5?hPvqںiq.a,,=mY K xCĨxM[FЀIߓfbF&E_oD&#hetv~(7;?~W~ >D-ʗAW O쳋')K㛨瑘ep}sk~AɚM/jj6s,wVMyS=W|bAmV!.}_ Co[]PZ0=7mT1T'MϣǗѸ4\M2ЧbvGLU&8V..b|wp ywp * ?.7' \Bg ZMs+*w}?,pLhFYrzg8(Z M'\/aҼ Tjv_*-wߖ5i/+Ś*9s6rݳ$Lϯޏ%˧-ľuћDnLWʼR59<,E{%? W;Kn-n㯪$+b(sqٽEm9$rÈug?rK%^K0)I`+D  V!.& !ǧGyu]`CL>_RmaaAj7p&g\F 0"*~vZvomB"vUQƣ_(<.#7UثWb]v*UثW*UثWb]v*UثWb&dey}?=vҚ5}ˑ$Ϛ'YFb=H %kA,(s4Tx~1Q/ڗO^]`jafیЏ35dkN '?1M.-fHbE4hAgf Hg'ZO)oqpS2YOpcGS( r|K2l+Z/Fi3T0e?f/NR;Zr:@{guRGˌ^M% Q:~[ь` O|g s?v"2"P:=W JIfP3!Ô=1"Xl"OEX* KiwW:]Peb8 z01mkeґդ (m'&):,yIcR?Wm;}>Pe xjOmP m$~7a6?PyVx/T u2Oo:-6~1.qu8*YWs1shrTnBWp}}iǒ'M',s-N*wa2|VкO.7]L!ncՊ0o+qFw<%,rIqyKκuKt^jH,U`?ݠ}8o;WoPf+bKΑyM2{9)&QZ]򔰠rY@ghފz :i-K#:G$3{BoRo8O~r$D| H~d%9"32iτv|8y?>v4jvեDi&>Ƞ̆0_^X//iZ#d m7cƬ}wDDtxD,`U~g _" 2[ j,;l| G64gTcJ4,SgvgdC ~-'zgk4Y7M2;R~DgGna7_ZHiW5 CL̸ i%A,c Uӑ OP<2"Tvv-,Wes-[fDrJטr!QK;ohZRh:e*ʒ8S)ZZl؏p>K2q7O74G))&3GLϒ wr_7_^yZXrKv6 bV4gb;(=72Ko/Xxs־JSF&֊yލ!s՘aBysK!ߜo$3OV$ E4[?wnޡ0yDOŸ:SY~ՑLn E=̚H/]5*s'FSdYz>Oȟ#ky&G=>bcDd|XAWϾgg="ִ):)Ȟ*j0<(7:{ $f;#J<2%IW_JªbzFZfKAk1%UX涙h_r__<OI~;c]?wDok1q*P%xtcay61Ó.lYOЌb$ޚ~ɞ=;Ro-0LUz ׶_?2H~dYۯlOzh"m5c9b{}'c+xuaE,thE;)1Y얄crwWe'~hy~pbhLPlG4UҴ`L4 @zn77Tn(5 B#-iﺧث>FY~[4h;k8#b?N*Oךa1k>[x\ !"Ya*:Oߗ]iu(^Y IrG6xכt E"XxgۍSy+V?KZ+n7 (!.Wqy>vhjټ层6(!&1K齁#.. O5M>#ln\=k 4(zsβl~2"\y)=KF`cg,j qjh/_gq~Yi~PSwGM|v.Yj#vf. kto&_JE64Cc~lͷWu/%^nR nqTzekD|۴t X<sQV[H"#,Hb @E"<8kK}FS& ЩCG~g5ڰ9-zX8&=mBJq$qAD ?wr=8ezȏE͔P1"Xo _Gv[QdMOazuǓx|kњݨuxq~bHc{K%'/?13~$ %ҼmlF7KoqeU#Ӵ"1$nOĄ}#[rsz.rC Ӥ%Ӫ9 ΠuGVXy4r\- \FS9C "N^yȾGŇ_*?9rĞ{>?d=qOͭ}zzhn,VJVly&ZAŠ_'I} ݧ>+I@4Xdg~smGʺoynb֡YnIe@$r(yb3hJqYc۠cf;gR{~Ռ/,5Vm.U-.@<$qP9F`8:z|:b>3i:6]/^T8n$yEja;Inu)M +$#$,Hw2db9u nN˾bEi^)!i} N fb2"=L̾VJNRQdbN:1WGu]+yQRWFFf!5^ú0ꭾtxhGE0,_W~U)yKKBZO:vopjdI,IdXT)Y静zo_)&x_Q"mms imwM:[i}05Äs~; L79|cO7^^O7yɞT[(uk nƳ"Pv$VQV7[m4BQ cs]`kmk3zv$`#3 "9k8Iw#v(|YhG,wwuz)G$Z) /rPۦHdx >hWf^M͞MA )MJHT=!=_O$v1҈L!|ͣ~ў~s_W|_H'6\Sؐ ;V8 ]Z;LmJ_b }c8oy,Pj4yeE-R|od&΍ѻv*|*;BWKQci}ҴE ~Tm[TJrԪxֻK)/q~#!17;U4嶵IІqSSăQ}8%%t519mތ=5AQ_Wq ʹ} zKv.ꇱ5J2_r85?D4:DZrQTU~ 1 D\C aY[ DG_o4zaewX L~ZcXVZKPTnXMQa=ٝw_IDNo(yr7pSM_7CJ1QR: =/GմFDV֕Gȷw.e G0RFҞE O RUtN,6:մ[KnĴ`H1 _栺fGbV$Dr$F.ic_6_?4Xsh>j Ɉ懵@0Y!斋y:/4$Xmz^^ØɄ>dծP!.*3fBFBIϼFWӭ5[,AQʡ${y|?P=>WK 'P1-UKBHkٰOW#S 57u.y'cUG&ؓZ<}?\? cNL0tїvwR`9[OpEoj'7(9oBY^+(] )oM'@ qmKy>qzN 'y<ӱWb'+9OlUߕ Y&N[:G/$rSxAz;v*UثWb]v*U*UثWb]v*UثWb(f1cI1<ɡqC]6\927hI_CNfϣ(}5;v*=A_"~}RJY-Hq(a)f󉚇{g.t.-#`7Y[!LMciw)2*0?G#<ߡ]ѽ,I)"WF^#X 'D~qBoV]6F.o=|7wLnzdڟy jZn0#}^(crS\fFF"Ł/tKCʼѼ 𻼏տ~~Zsؼ,Qp|Qe/_!̘/дSTV,a=?0eYpŊQhIQ6S֤~&/'ћr^8O?k,52(e??g‡bV$ȡpUAb8o-r[['-|zyb?{m8R4O/4)3^"ZI!ȧz_`]{k}U=x-T]8o_`jKS񳝠6a>>ŧK;g* "^6cZox>|ya)>1OO%yLLA^jPT}>u8&.1<>z槧Xt*ʮ+08cgÖX2:<>U/ & hIgBfD54z6]3bw `WhV?{,d|Oz?ekN{tW~~ѼWa VBTsZL?u0Qj<\G7 ']yUf֧.*t>i6M>'gA.Owi)@}sBVX`E[by7fHۉ#K<ժ; #xC%Ga;fn6.+;ϗ5=VXUn6Ze/R~"Z]Dp5ͧ>F3o3/`Քr!ŘvTa8]'|~Czi7=+f)+J휖Ŝ7tӖ\4^hg^ǿ^_6߃g1qyhl^sgu~gy@ѐ]x[)Mqx$eq/YeXnPz\U|A!7sPys0m*u<} K]Dgwnk.-ƯU_U۩o)¹1 s\x+y>ͶcM X9 2U<ö;2XH-vLxyXPYCc4(< _ŷt&|2$omEԦ07DSf/AAQN/ӖٰȚWEuYHw#*\ӭ *{S8sK8(zQY[HЪ-$ 7w r]F_L9#V9EkVE RM[*ƀPsf*vPs#S:c0_䑧îyr+uyO*ВEw靗b^//-ڢ1[9#o302 J}Z,WR* Â=f,QgEj_[Qp%G݋9u؂jRvfK;D;H}t~<ݨ6MO/jK6Rcp)Ŏ.睡'1),lt1NNv  rH5&'XEYNXj7eCDe;l0#.Q<ow?&1䧛9"״}}X W+O6Ca1oIھ z&~^GB?KoWx|HϜ8!?͟6p'y7W 4JZttjvu%XgsiFC9|d>c]^ӛ+4^#U>j=h怜y28by.jv*2,O̶^LuImˢa4 ^I qd7p?LCWb]v*UثWb_*UثWbT./--EngHG_&hc3%.AE5*D,H또<%g DZ:H`ªZH]]v*rk/b?tfI <Lkֿy9䘼5]8E?2&UثWϿ1F4ٿkzW&4X<v#dbONQԡo)I|yj6˺DO[(8C Jo-)0OKnO\2͂.o<9~m{0KL}q*"\@. fb[G" J[G?Cm'51ܾG_dz+Us'|$QwjjSͩі|1qNJT~\UYe/ -;d5Z,f0̹ܨr$eKUƇޤ#DйMp?B2Hv*UثV5/<{`k3O Y~|)ƙ{y±$WQج '#6qSO=/Ͷ![6EMxprAsWZ-Ŕne3 >IuGcǎW_=ϳݧ<z'wp%ʑq܂ud w:|˸_{^zZ_C_ #$܏LSNx~eGqM24GJ,& gϣGdjAxepoeKlU1E5RL radYsYr0^+<ڿ8? )FDCqGn@[׭m Jh%HRڭm7|ir&0JAFϩ? yүn_u iֶC hUg#JF*XL8X((cQ`lGt7!=>Y@_v-]"zu?e'CoN$$bxYBڭ6˦<7 ,˒# B IMp~b][Fn\~*FZR05/{krHV-IլĖڴOjE2%|E= #w ?DžON;aCk\^y~K@I mrO_n Oi579Auq;1}Nlnآ dL꥓ј5 NNl'Y.< zXo4Sbt{hrmEQ@ۋVsy.> s,s㸉O:Ԭ;iOZWi.{cˏn/o ^M[B]52Ov\x7 7#Ͼ7B\۞N=SqBw y$x?(ߝ_U!I!Iu mԵӹX "0?~}aa<[IA?TaVqtgs&:9LYLbywdIKkKYN %r6g ݀ J01L$0IsW)o---ڌKgn(Evݕ!Єc7/+ E)Kj9O2詿мzGh'ЏE~D?0[b$~9 0i}uXߌ|~Lx@Kt!};v*U 8_r%ɐϟ&'+4Mj/شX䲑bz 5]$ug <4sXXG{s2l=|n"=6a(н>f&һT#- | +ih'VHspGcrzͺ,Ȓ1qs$IdO"u lQք}wͳh|{o(F0I~cV;'Q h͈UثW~uyyg4 b芞VW!_;y;RwhBiߣnIVN-;C=FE,5`G} uXa8ө6?)C}b$fӑT}mbO7_ˢ37uu 1%Ę%/f‡b]v*UثWb]*UثV]7˜@D #Y3j0 Ǔƾ<2vgbe0bkWn EoݥO@ҿI&v]2%=;iM ZWiwjq$e,jWs7 I~AqٜFk%\"O;Ec,K~Z-XżPg^wV^^khb! e.fC@L`u_97OW34USH 7nx03o_/Y-|s;Ǔ{3j띊|]9J\>7~ 6){gx4y$|ro8$7H}`UثW̿zQhCe{oQ*I56 p-?نȄ~r^o&7z$?D"bAD@G ثOɗO{odǒeβ__,{Oh0K!X6ʿSTf'1Ǐߞ%펼u yb#w:1y5 {ZM63cs;ec+|Lуy'ɗiҡ a9y~lÌp)pV@Qi]#)Z}z@ 2y8_pK|{\u#k +q /v*UثWb?>ȭ5SqBv2'Sď0uqǨ&>8/Hߠ.k|l"7_v]GynG1rI] V6}+#) O_m4/f8ǒo1w4C`0ys *G%3E7|11ojkFM,5~s7|igݣ%]ёhO'9dj=e+#}Cm3Im׊(.V.kNU0f 㹶. a榞[1XIBÖؓ'?HAy]A|ѦS2^̷raNv]~v+vIFsL_1i+hxql}GH _'s  >muhxBҹ*Nǵ$?ӿDy>1v*UثOqWN??`&qt #K?31|t/}^Əu%ʹ5Lӧp}1!7FBsak/ȎH^~d<=Cd2PyggʑiKи!\4qz=8q\?UZ n_mSU;;sxWbo4ִ=CJq_@񯳑🡨qWߚsEj土 wG UytW厝(I v!r>[I[ѴI͐}`Oy1K&)E~P_^v>BL_>RS4J?țg`.LRl{{C$}Q9O!kk-[A ۙ6ޠO|GC99Fe5ccy{h:ݷך\wnc B<3Lp2 9$6}?2ioޛ]1Y0,;*~Yx2_!ˌ㙉L'78^ B JjCշ82&ߞ_"ɱf[FosQrR(v*UثWb]v*UثԳ p빅X+0ĵ~ddI#(N_MkӮX54oZ?mWIez>E'V֑v+kåc[<W Xg`ooіyhVTVcAn8?iX8N_] H<_cv/c2@>[-5KCw. EŠYYRxSk00Ϛ|t2{{Tn5[)Ui}Ye_y0d'?,2|k|%}{Oe(.@5zJ1߭jqde21nP^3N(BF`sQk[';? #JRjK'o1mMOkÖ$qF6HhkVy]*So+M jYw";o\yDGW6gK?0k*Bu&e3IB|]W`剼~|ݤyѵ+{RHΛqp6>?ib51E6̷OWCO|O&]^x?j8%<5rw)$FG Kgn  sQ˝)o$ů񟖇[%/ъޣ8Cמ|A_It PJrX)]mCsy3(YGHa(vmѓC}#y(kZ#oU‡b]v*rK%T]饎߷o૊ E'E YɀC鞅aG+KaK"wfMO;~C7͑kNҢBZ@L<眇Z=7ak<06>Zx/-dK+ru kes%) xc} DWyiN,kWif:U$-0܏Rช?4 /Kqir֚K(&ROGk9L:(5I/]_@9cU` &nD~PzO?';I]ۅ7'W2XȣA,f  qSlGwY5wz/& }t'+4 `z>E2I?%Fc/o $M]F*z t.s9rNLAFu˰9%N& >KC+eOoDE ?VI*Ƽ7וگgb5S (`upqny)߾~ A5֩o9c0`KD)smTSG 9Iw1y҅.,qہu=`H}_-m/?T]fj|,2$n0KԆ錐lvD ZE/ڹ`;y=!՗k>fYKrڮ(BRzoRjvk힇:u} ˏg ٫'n'Ry?J?駓#~z}7ɐ3ZX!Z_˵os՚(_g /)?wby]&[nnME"!K{gdYK(5uѠDd3U"f H䑲@~I1 Ižc}OD>bJ,W~\NevslsQ]Α HUU˹ gbC!b:Ԕ$Ato_3i=8j|OuxGiv%ޣ"R`rI S5!"z g:~Pޜvղەbyc`O:7B^??t>-QG ՞_N*7B8igiZo4?C˸qW_phD01v5"?,37֞d5Ov_C>|~j j8H̭ho(Ǧ-#ɨyOnlDUmSUu6ϡ5f;gOͷOk2;9բBa"(7k91y~Lȃ=Oy6]ԑ͹XT:ik N_>.' ARJ4Y(q^>$+.gov;㐚'LFYh΄:*yR+Ȍ|Cx{|XŮ`%Q]&:>2;e:/?!<..BN?VGHTyǻCǘٴu]|ɣ$v~cQt=ېsby$=GvyqKud}GܫrIAFjX7pK5t#0> ߚgͿ_61J#w Oa{Q`$o3ޝ.($+ $ʤSq) k337)K>GnQ;=X@4Ro4.V&s | xO]|CFY/ǹ~H?G=XT?e;hs~ccbԶ.fK h;?_sc8qK}pKď>Whk1i|!_>SMjKmNV]aDhe濑^kO ^גCWb]v*UثWb_ܱ,>'+nE,oǎ@$k<,w$Fހo9Ӛ<#a /tr-FVQD suZc[l_Ej8ȓGgct_ӧ 7|upV_.Mf6 س|CڝNB^KzL=_~ LG 8o | ^`8:h##y3)y?8Dfvړ;4]_!vW=_>g=9QSڀГ< Q Ȳ ]VP;>'=gX;‹kWmK bPHbNl^-97vGany^G$oh,< Eg)B CaCWb]y/] ҫpxE;Xmk7x݇6gEH)V7kɖ!7 Gh΢HΌ*>-A6@ .@yRjhJbcک_s;ricsdv?iGQ _:1/E畵iâoqvj7,ShE#}] [kmRs.wY~MB#`MsYR *Qc=HD0ipRYΝ2 O|]ć/f,8g5Բn7"W:^ݟzmJ_(kI=aU5>?dRb8rS38&2G{t%`R(iKecO$'ʆ[&֮WL9$93Ͽ7|O?'H`_M[Ԝ ߑ^E>@4+frRpn ~T?aGW3hzw5Ft z16=*&/EIϛ,fdI2r q<loO,cle<&Pd{hа4žru[k,/^{k 4m:^w4I D+abs&g]H7Ϲ{P2O5ԖHK%i(\&Z9Y5%)$IV.I'Վ, h>0+myXvh$yy.wOԼԌЯnRH§F=[[Y1ǟx-,2y=j>O--7HYڮN_ѣ&C9CI4jMrhsYBW-/)kW-/*VrBb c2rbׯ2%N?1?.lՒIeh*=CR|Sw."kad=H~? /On4N x}KML..^-Kz!^$NƯ\8-<%kw:oҴwVsq_WR=3-IO*d삄-6܀~a5i҆6zB~`q9 $9&0ƦdͷiAPasgGџ:ԾPʻ3$ދa_d{@K}i6GUثW_*~bEjȈW#QRL#h/xj~x^5a5ͭ٦u6;~ nc$Bmot_0nޓz)ub'Vp_Ee_}gPI)~1\xvC~R r}2c74h i 2۱I3_RVOhJ##v3b:е?0:ܬ#"C:|LYHE0gp-?Ld:=#,y42_KO ^ےCWb]v*UثWb_*UثM/~mkc[il.*-n;V1csOqh<ݞYƚ|J%Q\Fu?̬Fs:f= bWPl j[W5A SlreWgـ ́~Y 'm,0Dۥ˥ [qWeWaŖtM10U6l[A&&'+@gxqñpz_Mq$#$N*9=&OI+{{ V3o&!q zM3@uiT?Ucզr|x5̱Ǘ7_-kFUM$Ǜ! T !v*UثWb6@i=}BzBn?nt:p?3?V9]֧im)Nݶ +~/FOpʳj`_dƟK՝ԝBK쬓b^uŠ~JE*`j N7!/=B>}<.ʭHxdT%mt򓵁,\f}fB5c%6q~%;s %ac_N>0c苠!zmY7;>kߔڧoX.8ӻI ǃۇzoc\\'^N.x+uWX\nˇE~Z,Te\A,ד0 6NW1ھ?/GmwdiUgX flW}?89-Ե3 UJpXwܩTѝD9`ԾKzN ^ fG|'Ä;h%1?'X\MFmUKaWBMMU{gaFpb;Vom˧?~@|s֋?0U7O̝?L9MNEN!QY׭:bw,xUƕoO<#һTKW\*R_c+*R}þW\%8Rt?WWʔT;=Џ.ViuXwMQg47S O*HB'|#d9ʾGP%aZ%3g1{M"~c֛qK-no"nD` EAϞ;\Y<{=lDVv; aS)ܭ+Av˒~qyxMp Q-.*H-N$uj ㍊޷krˋe=E-2TJF얨nH8a#߳c<܈e(Dz?#DbѤfg ZqW"-H4m2G|:^ڼF% $;|w]yĪCӜz>λk/`?w ?J}N}0ˌLr/eqMrb^%}OP?.?) |[GLT5Y%R4@=J9}Y m"Fɀ Wep5&G|mZL!|g(.]=[7?q:CrLbi2JpK~1O'j<doЯ,MY kۺ~cS38Vθ@){vI]v*UثWb]*UثT~M44_5ijz{։2գcQ#RBpqg#q'NrZEui>wI7esO)8w4cGKn?#cmu 9+KxcQj+czo澖HAݢ~U;;,z}߭3O=ִ6Z\k-j\"Y1Sw&VͿl7-fISeVQܨGfpg\ߡE1$0 j8UUf p8FU 20H=8U~pxש&? PmlOθ AH4kcoO/EO,CNX\(HJ5zz؎K&п5ihqCshHP:$zJxbhqG^I"R/dz/5K{g!=#{N;[B1\[;byJf|0~>LS8/a;-5N=y ` W:NLCx뵚,SXf_]ޙ7%03@>6_9}=UFc}؀h&M?'=Ou"?X( ' R#XK*$y8>T?iˏ/BBdp<E+Jeށu=ϗF#VJC;)$`="$L^e?,k++{xy_]EvT>vhVmR z}d=7w,N>gM*O>ᴭdkDDWd6l;kEӛvFp2uCȾvSM|q8O.$x ֬5WpTlȭŪ9Oa#b-,B=@I{Sј,v&o|ooi77wLXb|ͧ*dIJ0V#ɔFd|<2Ռ~L(P2DF@%3j>_OWGɣ;8/<7a95ԂފVSc;'$|.b{{ĚtS̻?}e%t,IV ?4cR ㌑]C;Oaƫo晩h&-hX8<=TiPh#9_C̶>gӠY-gNq<7'F }9̝ K;: )]ܖHmdTYUާ|C2]l H=sg{\ވJH v=z0o.=ugR#?oB\ +<-\ؕn_ y(5?bJ{-9258n1Oxx˧ɊC;BjMGUd NY#f<҅wk$ 66rgJjRS֫OY蝏>M=c%n"=gMx̓}m~]{-^CCX?F8aS2‡FOF#>F\ǘO/^?WV"._T 3tS#W*Z"#_C-JR(tRsܵSSpW̺qn'ubD܏| aJM930K5EO㙇*hP6ǒe7ik-R#;JrLyC g)u¹& Wb]yo5vXHx7eK>jHkڲ3 )ЏK֚nE8J'ɧߛfXϧTQ7ljcxqHT|;](Lt: Hd??~gqhzlR]E[~sG,r1/x`w3El4F7 [. OpWb]|m\ P (l~_6˟C{u]"Jө4SfăRC@*XU|Ew96/?|u~gkiYuKC T |l̸%E5xn AqVAAOc8E&a G0/Cɺb@0K /Ξd}Exzٵk.^]iaĺ{L(6U@ONYaDzlog~V2 㒞]v:}Nf8eӓ6Z>{x_`ݜRf0O@=LkKILI$zcC:FP4M9DmXi|qo_I ^\<]7c慨Y:z~~)2y+!j6]N&X_j6-wڹ W:^sGF7`8"c}ʖQ@ yCz"{3ӐOFd3;ajrzr2ȪFp3{Eq8EyU}nAced0 anja\Vi"~O.յ+}6PҴPѤ1 zqF^IXr~y,I|szǐ?XbRD,7 ;|7z׳>ǜ<l긤1A'_ uMqAߚӲ?p/ߝ%|n ծ^2Jq5pZ\_Ie8Pv qVF.rN)wϟ[.O)VߟK̻c@M Ujf~Mm#Nз+yi".Sv`&q|\D=u3"Xճ}2=靻CC^0ySԗ@[{c_Ӿ<|<ìHIgx\'W${ N3B$+XHwC^S3n/W_V^myg]Uѥ#"~,i'4ӁvV2.a5ЧGt_zY$,ֲl*:}3)0xzty,r_ v' ~d ( a-쌆bXu؊a2)O8{/Nm[ܪF&,8 졥o yDݡ0]Nl*ݐ^q_q9y:.%辽Q={M^+(cRKT=.ǯ$I2!K?>pFX8R94UOOGKmbk`ox *9/QpI/ɥK̲O-mq3z`t )ɱ|M9'(~w%&CM? y&\tn.#iйZiUG53*ا-&kVxNd1伢M(?Fz^@c[C)Հjnkagw_Il5I@hb"H9\YIlZPD~q>Ko~5_&{RS_s$8G& v*UثWb~, >O7>_DcѳȆEPU!+@ <( 坎e ͌SZB-ʾ&XLo '-}OGO1< +EIpRJwf3udWm{c1˖< I\ܢ[<ʨbX@;ҝG|pPC 8#/͋h-Nՠ6RݮT)CC+T~4?䷶w]&@|UfqB_}RMB!y؏<3__@1#Q-iZִ[F\}~wC<|HF&n%WO=5+&Ԟ}BM ߿9rF#Q(jl#Xaw} Nq) JN \qe}?m6" wXj+!D-p%`Q;<+qg__r7cʲEqbME%khq{faPEYTIUϲyKv=NPK+kyUk4ݩ~vgG<ZHu[;A#4qLպ#pc>a+dywwLKIJ,$Ho`cs.('^ms.x8mdZGfl2xÖ3 <~UO;iIZW4?8s0˂˧Vo=ŵEh~2dR@s#)-6< ЫtTzyb4ڭkGQ ;&/G6wiioQ6cĈTtXKQK3\#`a{җ;<ځ=n ܤy Ja3҉FaF#Ĵ*\y[_(iS/NDG JWESópSG c zcӡv䤈*i>q򙜸29 ̿nl=TP?9$~c<)!%&IWbVKV*;r+HGkKOm,d,߉`#Oa<*4!Z(lVUVu=KZ-_M͚ūSx[_*8vnփs9 yHY{彣s=wZUm쟶ES{Wҿ!GQS@zLu3\H@KAo-[@B l4O0BWI9?\r?.,(`CL HpA_!iVMi_xkUHa y᦬m:ya-Yeq\O9 Z?kJnAergOm}uɽ>&ӧPm<dǒe&.]v*UߘBߝ>pF݌p!+iR脛S{Xo#Z|6_9K޽֣h˄^/q(\YD ,,Qi64 (% qnh?]3>kbc Kkz^yE+H`HX 䚚оiBcy^ӌn_qdzAjr>s^݉o wqpӪ/!򆞈GT}5=Oox}F( t9.[>x#Vh ݞ1#pߡY>jM֏LTq 1b>Ug -Q85oz7MuVB>!qxzsrK\rpMm=_˲ςח %+ʔon,r8 0%Ǐpy a=2[,h?{O:v5f(\ِ+nLU B LjPlpf.\|CKS__8\p)~[?ܖ="9ln@;tS>/syb]b?7gSWr9'z={i#.I {pΙ&#IWb#* 'n>P#b9쫟?/:9B~,:oejˣc ܓ%M,ɉieLsf,S=C(a MlsPA9Ofl"Mv̺Tܧ/1U_4!š)`1BV.%)4<ǥɧq8 I *Nٗ1$"f|h%(_y{RQJ#9 q_KQUx/O]c))lX]zMϟq;]:!YG'9ovά̌>+}O&u:).B56/|{g$7MisdBԙ&.]H<;o*ygP.dBxN`CM=+/I9?j!d&3|U'iol_KZā:=Ss_EUjIcè3rGߣ )IIz8'Ϡ?|Ve!z<+|槊Oν1Ǚ>1,NvY7^0H͠H[2[)P1Od"oϗ:^c[ܟnknYvƊa;3U+<\LO$|dA18Ets){އiVZlJєԀG*g7L2FQ?T~m fޥ݋z5GPkLN)1ɬ{EZ].ZO!=&^찭|3W9qN9?}Tykm O 8}r.{=w.g{{9G8easDE,EN*7r?Wm7aXQe |?$<9ivv:V)}ء~#<c_ݬ޻X}?ap!m]S"9$y_˯mV}Ck;y_g>yZNB?"B_*=yzԈefRtO9JL,Mbvg6:Qƥt/A, ToՐWNloW%->[uخ(t.9ٰ *=\W7m$ i\CQ3|[8r/V$ͣN &DžLbUثWb]v*UثW*UثWb+ż -G 96WM@xNaAR*Fd7v*UثLh _KNA\ouGO K@C9I쫨a#vC}ϓ`Uث8%<rwQjAQNq/Li!4yzmLo0]>c{MVԓ$5~̐ѻ%/fl~>}yGִ55tJe@ݞX?h G*.,x$[0:^|Qc$nOz=td?5h]pâyͺfsW!y kԨ vkӎyKA-<oin1]#O-9RG?i }{C7>|ޓEZcc>|9 ʺT gה?} "F#?*%//}-V8_c(i@ґ@cCs5z*70&t]NY<FM?v"/[_RTԘ?\!_*Nj?->^Ik%h+6WǕl=A3jg=~c8|//]414/dĩScNMWb]u{t_HJl*roXV4&Rp~|i)}7w :&&B4-Z[^̓[īğb9qtqߋtxӿCå9eOWV?ytQ= ===99/Y^>:B?C(}]]-̦5oCSPesFaN>agǔ~>'̱v;/j6ѿ%ry1q V>fz3/?^7緎~JZCyѼ'Vڕ`] Sh=ap#;g`Nӟωyh|ceiYsִ1<,?45;CbA諞0 (3P||xe0_{DLVR5;#i{idU:QF nz;Z쾧\Mj) o+NiŐ r8}k}r e,Um%utz,$]XI·@5$bfP12q<2[bc19Hw.[n?w{`6#TJ~eLH7]BMV(2 rEj;u.[¼S5~w?,o3إ4;_ڠݨ::6zgfkhcx'u.]aߙZSbch=Ӭz?=WOY2HI 1~I2e'6];?H5+kI>"@x]TFFV\Qr-HHs7h寘5?*y`GZI9纝z]$ì,-YO H@VQ5:&5!\O&G0hYk q,w!{W;Wa2qy=[K-e 2eYS'y%?iM*;ҹӜX_IsB֣iceu2zqIp]{3*u8ÐX0l/uH>9&){BhPA͏鏹[E)m%"e{E G89 n(6où#Yu׍z*O IS!cZrv5sOGx$IMi]N\k*Af$Fm:НFXba:nfO&YeF" vH1B"#|s2$e'׿8eC(!ɩ'd:dnѿg$Ñ"ȅ/rL]v*rPO{ch-G+SFBNϞcV(Q<&=>`sKIj;H?L ~aelRGYa}vr~0=0Jx'ڸGnCļIy*^Ww,\>dvoK!v9@>oH#ȁf=QNW2SL@͞0u6YO?X%IRh#:xq}8'kUǩZؙ-->aO$O.N*JV7!d>2c8 Ɗc#aqi2s6@=?ɐg1huQwzN?wߖo[k;N^cC>aFLƌ.H[€#_0=K/.[]ꡊH=abo1?C)['FˀrI< VILm;:q<3!8/,Mot ^d0w oTm[ʚ^$Լ*h:)Vr_ONp8dzl0ßo7oWÔl_OKO,`P8"y$ثWbgx5X5KMc$Q^<ϧhoÚXaOu9t^eYё6(Zr*z;}1?;3V%{uz̍OFz 󙜸eR`Bb<}muLer_O%[zo)[_im_@B.Zܦ݀{=?g9kFKw7)O7xHmĵ|J_ןK'ne&4USLIEӫ3\'w< `K:ϖ=9G)eB|iη[3iyn] [0# 'wp|{G":o XMS?9hՌ{na$d&`YOBC'yIǖ4hz~Tl{v*U^ct۫ՠi>(ߗ3y_8]mGl<g-lGW_IsC}%jmycSo+A%6SԖ*3BczsG7sFY#?B]p!]%c20(*e>A<ιxx\gC,IrrPmDH^g)neҔhkS˺6kH+S@ Is<7.wK^OֆjJhZ(nHI,f 7PN hv.}x짗165O,nƴ~=zȎƍSծ -ctO% Q0y(ǯ4_wGj(T~]$xsotyfmrk9Oq[9"7*HFvl&>7 ēk:G-囉 0C$mKy<;mt|2W S'_ߝ:?JXS\F6/'zYu_[r{lbXgyG!W9MuN?Gz=c`ڴ_$pPO17#R}+`UثWϟ /,),$4G?o57Ûʏ".ض{2 ȤVXSfv/ 㸞o[R7f顾HiЀ?Aql#itĎ~U14| 90 ]Yn&|IKW4 ]|$7a <.̶N[]jT =2 rp~Z`L\$@7xLպ:NZz>]EK{Mi]C2,yDՇ\F<^iwic4QP)4 T}93$t/f/5 q dR9_UW=GŇ<^&N/xέߟ?'1DGy~9$u{H~$/Sɿ0iHˑKlbRYyݚAiHGvnܒbj1Irrt%$qǜjzj z4顒@P9|4\}8iϑ_,i&}!#2?(2 'HPIĬBzY);zC{|k6Õ2^p")e@}(_͈d|C 7ݙ0]uԙɒjԟp| &*/|زϢ?;4hh_:ЩVzpAa|?4MtBOz|Qo9~ ҟ$(vj>8OP}s5zcu\M`{}^;ΜŚj.HAv9|FQCw^,e/Uo(.;fq1=Tz~ nxDdMiptҵ m4u`r<:#l՜nNyւilȬ֒R`#i$#‡ߛx,qq6QrO7mVN $>0v*U_]XlޯF9Z'?1~v큓ib"=lQz kI[֡t0^E,zdO%=2FhG{>׭|ѡayu+ k^Z!V}(ˌLr/eq qxjwdɮOw1A꺝es3l8INb2<(DȀ9x|w?. gGv^^ϔ#Yŧ%=}=H$[$D(MnztFAzL"+]oPU X*mb<*7͖>c7 "~O4>Y4Z-f?UaOf\k/k{A.XLԛz^ԯ;5{Xx`Kxޯdu5 &E.‡b]*UثWb_2vIu=9=J;V X Dk?:9=q0})kso{m 夋5,J+Aln[ v*UN O7__/M2?O4cdd[rwR sJKTUTy[W;_ՅOCv>?hAZSۨKhkvsM㞞<>;}ثO?>G _cOpb<6/5w{ӿ1-|2+Y,"侭 Ia&bj493˦[O.4=Y}+W!'Қ:2lW<۴8&2}yqGz>{~RDӘ}lV@>6py'[b~c>lncQHWFst1V- &!7273Ij쀭!څν7>n5װu >\^\ %| mqvVn=#ݘh$ ##;=!#ӭdR/X4J5{u5^AUxX~8bAoo?$j?~q>&A=סeAyjhN Q^㳵48e͈* 4mNPas=7Y dHIkVr%;W5 SqL D"Dv+jjЛKǪ[O.FBxN#>9FQ~t0~M^nQMsUK.^<' jd-iYZs<ON.l3Tӵ/"|&i!5^>6~f ΒOve}=SG9M,2qFbc*srVaˣտ 6Y?_䐕_xqR_J䘻v*UثʯN})KEא`ǃis-0G|RI[7$#9FU'oW %b6~ɽi|1Kq8Oz!{9Uz@ex7RNJUq,y+<$w__e]S4bߏ7{ FvK&mKqܺé#f ҬiXo8e"Cx EJX$K+~*4$rSK.!!Ey_y@kTBki%.c7])}6a/?0>ɶa t$K-Ben1jyX͊nxY,r/Yìc^}ZL$>QCYO̿j\O4Ca1@yy`~t2b$ثW{ko)YEzts<ii=>hy>y,'MM:IR;77PC$+"@=܈H>E|`ݽS\x}eQ1k9kHeՔUsPp_Y~~w$ߕfi<9k& XAiZm ow " TU7?6V7K%)Z)"۸!a/h%mϑ,cO,k)[M8_O|JK{+V3[]t]w&EV-ki!oICEhTF9'͛sYz*mwNtp)?q'(׻<&>zD)QIbHtr9Hpˣٞ+}g@ZM#\* *O"Q WW&ܺM"M ̚~vǮqn߼" ]|;'=ND5s/ߟ5#y*7IK=>ss)ذ%Q|`VM`3~uO)!d7r͟;13?V丐:YREV6//IH>;?y;mֲ3a Y~(|R0B_c}\}RdG$o"提OaQ'rH bRo51y, s92Q Gynl~bf~K_f2,Z9ڔ'L jZr2 _-Bx/cVjX.q*R ,EթccWO_)~g6FcejY)QK==p˄<|'Lr)?柘*_FmD8|]0˟RQ*Aja(RRU ~}3Ms&0~?d0*ߕZ#WݍˢڙOVn?Q^*з_N8;,Lp]ѯn  q$* tu[A,cr]W\]+tY"Vt+O@Zextܝ>3͐yW[YQ6 *h@&_:}NTepove` IΏ/ⷖS3BZ {g=f>(|.rig?'͛Uث*UثWbX柑,22u+f[Iwӄ!8 e pxe^UOO;R[xi -:L#oKZF fzH5{j qϩws}{*VG,Ȁe@pYPcH? 3uf4R/"@䘢$v4cϟt٢Ѣ9PTl@fw9Mh ִPZqc#J /~U΅ [[t(Rw~p]R_<mGM2̓vb?d*柵idɴcn,Gv˗['o`JٔycNsS}ij ׳َo~&##wG@&ث˿:oth|m;(ZJh,!_!jO-'XL.%U&Ձ*NDO}}  _0ZTni%m7cPTWRuG1(wii塩~uğnKY uo@Cۼo8ވբe"oBe=6$M V(?ZW _7zQGa7D?hk;w1/6_]`yRG!ޤ̒/N1R\襤z:q0:ȩ7,q9|,-G l*(6|\!nZ@m|qoڌ48K~ ?8 jo/ I к,FR3̈́cQzY%ѹЮh\ZHŚGU g#,2lnnFJY$1SR*Zޥݼ:K%…9l*zО hdØLsJre^^5sv>@juZh$v{, nFүd`]QBhJt.YHL) Z~kG>}oG.Mb- Cp?I_HWY'p~?"'ҙ&.]v*yTլ| h6,*]lӇS15zx1K&CQr4 ,|CbMY-&KOPi sJ op=V-n.<|btXBzɩq<_v%|4O Ϳ y"_T䘻JŭywEnc.s~[ ϔ\.Y q_\j:αj%#R>6`Ϟsz}O8q&t X7vgۈ$ӵsy,pIo:}0>QM^9m[ 6zr5N>AGV2tV5w 6zby$@h6[8x |1j^xrџGSSAsbr_KSـI~byV?v_^Cuſ4hra`zJkUL(>bb-]$t٣u;ӉQmŐ㕼˚񶛋FT Pc8-n/eԍZ!oL-k4aᜮJc"oOI%=oϨ7hdD7NOHԨ5x#8;v>K mOLeNOk vSw''sTǔcy1YDi*4S32[>W_/|'sRj,*κzV:ip>Ū>w#\^}䮍}uaL$dv>S^OثO 1HQ?7:EII/!C~ڭD`$o0v*UkM-]T֐iv\Z@ôHTdyMlL_]e}nX|krV5 >-77i8P0;Jje~Qr;O|WWxʹ~{~W–Gėq0پyH cϠv_{oK[SpGz;7#Y L8J{my@ԉ-f`@kfپC!v?wsoisaHϖ|m`VgɊRtfmV*ο5æ;,:-[@SMFrqo?wR,$sS̐N&ԩhObd?˭7| Z4pKE}1!}_;76 ?i2ybKF(YîoJ6da"Dkwr2D-4#|gj9a_078EY5^3yNÓ3@s@ t5Q'!ˈ̜\9N{L張yk:Ήq6x-)ѳ3i8hæw]v`qV{hrpCZg'#u(&j(@m`r0 y)> ն𻷖ݨ"bBe`hg4*UثWb]5/`åPD_`^2#ljbD9i"3>i|;,]?Qf UlŐd䁄ykbPځO_״HHfBmOWQ>YӵФ܈bƤz`rZT_MpZ^{?Mmxt/OÏ1O!?0!'XU36CPMKκާ斌0$Kg#z WM<&i[ڎ0YXmMݗjsg&ϩt B)ʝ*rn_q7KU'5q&4 Fv'<-XJ:!N@||Ϥm.3,_puIN_L%Uo';x成|6Ff8T+dJۆV _&cy{W@RtW-ޱB:%yC̾e1t?C-Uҝyk2/?*}֙u9]kTg@W#N P4~Vq.v6Kkx[V*)jHaw>i:ЪlgH+$H~gN5[9[7w%M=FsI?/">yؼc+5oϷy7. aku#O;G#OĘ#RN4+^U<3f{ɟ-36n8c(ۑ힇9D9Hv<4#3GZY7)Ϡ~xkkhkIza;!ӈy7 UKԥsЅRIsE)䈱i/|.4zۧhBvu9yn1ǹP?-5Ry 53oagL :>kڹXף G t~;yGo.[?}fQl/op҄,/Jt4랇ݪLD'CG&Ǔ] OJ=ڬ ?n&zF=,J$?-ħA=|F)9>]/Gz=r)2J8Z?\~AIWbVhH#@YrIH@|4Uev rs$?Wm[. GoٟrLzyBM3Ru6Ɯ.PHn3H Gx˓NeKKA,tdoeO$uô^Z<2v!,^2PM .8z2lɦYQ>dMZ4ȍv"i+%ͪl11qضG!Űz5+)ІCRhk~>yk1J\"1J2wϞח˚B%gw.:GIs>{K{0GKSUc t#\Z+_̸4󭸿uB|YK}U`U篛5]F*i7 azLƛԚ}}H_jȾgp9}?o4kԸY*EPvJC,綠yClmm1[8!]"e/'k1!?=6}-/_gRh ꐑ4ek>W9vgk."5Oʣ_[oǨ4֞o69>ɰv*%{Q^V܍I]OfSF/;yfH5M<9@}VCnR;XQ|w mCJ5:Gr|eO 7e}U40Jwy0J{c+Pz֍BfT]f.\Ҏh5Ah&K! MӐpڭ8Uz5kx%G,tSـC0ʮ;dGcC0ȾN`i0 G2×L! X.-J98i{r 5/OsMo5ɴ[tW_a#翝?槙l|w8Ҭ#4$mQs]?UeAկ MC,J(;"3Uث?7i1P PW?&L%ߘ !Kȣ֖\9 j:Upd"$", #C_?}^yi4O%6ׅƪ> hxOM?sg) ;w]sybiEyw$$s)o9"8cǥZ9MJ8: rUi]|{5dg|{c zcߘ:kMޞd,ʛ*n>=>(偌LbA(lW׭^ ;XiANYbE֍O<;,e[~YXg>!R˯ MeKQIQ5)8cSs}ɏ_'Q.OJpj0X9t/)&3 #2w ?+o{-|K"~$,oZ|=r40<ǛFޕ v / XSR82\H1n]cWbMLM>K8+<k^{JMq*y4G)xx>xղD8G%4H?4F$)Z7秙$pUguNdE4`W[<(^X.4Kvֵ%ڧTbR֘i^C9C(XeNvzVd+MlYZ%9$wvc90 #>},H\ƿ#!bӟ;Xb֟ĢbŊ?oo rG7nIbHcаbW|ժ5x%xS#]Ϯ4?<%_9^(toN;hM^Bv֧ HDy&F2g{o5ϋWԥƒs=Pnݺgv13_8ݏFIRc4!Wm/L^ 3sYmN9ƒX̲c 6ouE0|"쀨ȴݙf4!Ze\y~oSы}gSAZ4{bOjvdԇ_/{K^ߘ~PyO6 >MANUw&|sq9o>0_@[h< N?/מa4:gBıJ-f\?5cQMNfV*N :x|/gv0,aB hApAힽAV(- VGC֝ *\Cq QΣC$LMLEZQhSjuc4Ӯ`{yHx]4Yq.ņM_[p-.n?G & VغTjGG99xսQHi2q]Ы9Hsô<'9~\MFB4=BBIOe`_{`u>|7‘yu[7MW&]U [edZl ;j_]5X4^Bo8Tsd"}Yb?3ɰv*Uh~\[yISliKϥߑOچJnc~~!7,.RJխO,ۍͤ<OFF68HT5m3P 5P8 U +Ge ,yFtJH(IHPT-O}2^d[42[39v4zC$/u[No,@+"n\sDrz\9'#c/EZq\ C5//t8d.}o5sgr .Udi*syD'=>"yǿ?)hZ|!2Ac0m,'P-8pg{+ڃY^=]ϘvΓϷ._.vثWn0~H?*,ZlO=_ZF^LqEi-!5Tv "+䑂\"w}wumcm- dg4UE$#O 12 e懟1eӭN 06E;K'⨟goj6wcv(9c=FU_[@g ^wz9LF4y!2[zkgŬ\cµW;/m{7%HmW1gfkd]o_QvSʹM>S֓\nM??<cQ_/xWiGby&ږkX-1[If p '^8HFwy5{)\y|޷l/R FxMnjY k{CF58%sZ4f:3_짻{UjvFߵq;8/fyO6w._MOÿ,=98ΛNӎ-X|?mi|}?f{.^e#fm+Vkʭ!A He\h#0iS.(e毗e]* RM! |FJsvlRv?jDʼk+O)ǃSԆuu*>.G-2ɮ:ȴ_IɏT^OPg_9>b_=<S|8^aI/3i:an;b?Ql4݁/쓃e!P4}J44+6xmE!ԞS vs26yl]v**UثWb]| 9Qs3Z~wybniݍm.V18_pzT+V;ـ<]vY>hc_Pla!X$=AZr<<ܣE+.4˭,"}b+w94;^GIs#%nZGFsGJh'nb̏͟˿1y̖Aՠ,N*9AnKL_B֭MԔī#gjҏ?P{6g&m1I@ԕ5 S3D3Hyo,`;y{@m"=F̚Aq?b@+~~'L%]{GB'_{~^ao/˰ywH^uj Lrb;7sG,xqKث󇒼/W-X󶸌JSN7S/:Pb3hIRK*{oըڏ/8ȆSot1IȧRHOaӗry+G\Wd?Xw$&o;H7?6[K1j,as@PohAm9\Gmwߖ-(Օ[Y_8ͻWp1k!ݥ/{':]Ɖ^kpZ[5K z3:0dE_vRGFCGaljTPU5yc3{Ѩy?̶B=L *I!*Ա=3H3/{O*,to+áiM/]G,{^=랻 8CK"N򶩫 R[I$ E2ݾ/{_e9KtX5VO(/---27RDP®]0+eAg?OK%?7y>/-@u7qFX ?#!G!`>/u0Wu5O(r%Oz%#"KUق^|8M;6k)r@:yc\M% T?uZM拨IO/nyqBT&@d@jΙZ5roԟaV-48`1 %5dTsXZh%-n.d`}gﴙuG8qH>]5d_Oij/>w1]B81qq}?lli]x֋tnCNW<'8͆Pۢbso;h$3x%F`(Lç¸ YFkm2K=ԊJ"dWpI<'o1~6_t|Z 6%c *(;3~~jpCbL z^Fn.coR&O뙦6+Xn 6b6#lGtXіJ݇^')n Y.W sk'y{|j0آ0aipU5"s4 7㐖f>Y:i;z9e +Cöi5!0d6$DN4-5eX.`:PbO+oS׫`Iw ռWKaU\ϫ>̖/\>ǚ鿞c}M]u4gP? 5izO%Vh7WW6m:''i7CF&\,Q-DHȀ?15ig_ yG~7,Z+8Kd_j;GW[Y%YiqqFI.Ski#2kon+؝'lӜ]ܐ6UW#rrv2!Y?'`ޕ;ig֓n>7}$I'/6\9b2LqxcDa_>v5GYkKeD_s4X` _:Ϩi\e3[s\nIDUPY!\(S~vچ{{!gxbu„#dE aPntZhA^%t3^ .~kLg^Mg{5؇ ~q^8GGП~c\YWћzAX>I/ʻWI|G9Ή;v*UثWb]v**UثWb]I~\Լ quj='8fSFSمqW喣yqu-ͧ/,9i$<9r/͝_Qvm`霪OQ؟f~S`8E虘;v*UثWb]GQҬ忿EmmNɐc݇ B|4K $mV-i pvX>~9v>_`征٧8DZIgc@eexKlDMMPZ~]POּx1momG]4Q-깽un]|w9;82=ݩ2(iǡmzʃukB`sv=W|3|m%eqIZFp9U[}^qt$V9Xva9 _51GXA5ϟC#F1==?-}cK٘pÄswmykx~k}2I\ ƹF|W3QHtjpCEalU};G@<\W__.1azq]kZlvEB} OsC?ޮII߫Ϳ4<>ym#[ޠdH-,qǜe.굚Q~B~J[~U?\x\SEmVhxT٢ |U9ظN]v*UثWb8WgζOjn//22 _5y3vfYn"P ?bh~ˈNPy1bCDX G˅I$8GW W anq=Ubu6FTu?'9BQrc1&wO1j~Vu=41봰Ԏ v|&٥zmeiz(ې̟ wW?ex}ޯڞ:Kimi7'-OY#օfOpWwחKŸݍsTG-|s\<'SCgWŒF.GgО\%)oT6~צ"%~Yި:rv&}__P ?2% ~L{d_gy տ(ۨiKy@^*+SmWc4݁o!~&Ry 4pҔ#OM|\@}"&\B#&׬O[=fĤxm(@_ a<ʶE`Wе)۳5)_#\zF8hTVOl_6c߿pY}5{$5=K ÷Qfe7ыӺRʒkքFhsb049;,r߫;KiS*ME~KIDE#r?EWǚ4` oBE-gDf/v4dxkOyf|mo#׿cyLJ:ba~}|ML%s$HB=Dnz~i1xacRʷ) Jc@bsSND@]<+D\j\|9IZ>\1G.OR`+EumC7sD@?qQvuK񴚵[akq%j* 3+CQy8G~ENġDGP >=E1>esd2fv*UثWbX?,/߰??L.]|og%אp_R Y aoP~6Ӌ%>?=0٣$\!/6mHFwҔJ<3>,2X-J6w$ZۮJm쬝H~C_ >3.'Mv} G\\0,æ{M >1g,323)ثWb&$s LFO2q=%>qu 0.vRpe<,%xY^0QN߿ N&W4ڟX/ b_=~b[$D-6Q5]SV=ۢvl*Fb>j/vodC #_X0ْN+icH–r7li61}y%M9b2;D>Uji/^eVG+~h=˙来GS*@~;3v*UثWb'?e'̾5ws\ۨHk֚mfKnK17 ONZj)WQٰ0k.jk h䨊9`%=({P#ͪcߘkL[F 2y(EA$m\.>9HٝE[aU QޜYKjJj+]ڀu9cDG*Ot .\\<=9T>9;Pfgşfڃ|汮O&ت:^:xkn,\CK\o0rkZ m 3΢{}#C[GEilZ=ppD-U<8LxDP𲑑MRd~YYWvi-%Xn`Sӓ!AV4aCNNarꉬ&CncaͱYb' \Ϣ1_?= =B( dzz}~eE@|'9y~bkIc .# !ZSUa3h`>_}S7_Tn џs?Kb{Ocq3Lw領3s6KyoUlZJ_$}nc1!aJ&&mbqsoi \]J@,@'l",MZHk]-WP?ii1^˜^oƥ~.hm UFy&6]?7/vKOipPǷhOּ}-QCB(JӜPov.':V6N~!iW-ABꝊv*UثVUŒZJ+̾G^>wxI5/ >|yG1lQCD'Z}_Ǔܼ'4ֶDkY 'kG~z|55sCѰ+?gʞwkK؉k;ũ ae?zmxO$I%S""z+zFT2=#rψH&6'Lc-QQs{܈n6MS Ѿ XD) (,i&f' ɴcI!q=9*mWMlbDQzh7A ޥ4#AӗS׋g9M维XJ4Bޟ_JRԽH!X* y)Aj\2dFS;BD/2ޤ fq˱r"XU#;zfЩ$Ų0 m -K=+P -)Sփ%=To86[k=Q;L x4*Ƽ~9ܻ5{"_WDo丼 W)#0G@TrhgSJAVVSB.X < GcBaݽ:5 S1 ئAݒC³R:u\ěvP*ށyR9Z)obz%9HFDè;Eq<@RDƵN5F ğs$Hlq'H*J:Føc#m1\DIq^GU;+ $,]Wo-8py#(KxKqgޤGŢkyO֌p חt)V]>%M:Ƭq &g##̦k[Wb]v*UثWbXG8{uJ+-T>i ,$~L`m|hmum2BrDۤq)9`e5'.hSS* \Os:2z A}e ^ ͤG`A?ylU~&/KPg@3ռYs.7Ǎ唄Sű6VUw儊;i 5ߟO/_w/u;4a<I jnFV{oM6eG{+<%@_~`KvqKao "}nB҄?#4_d=g/_ RPoivܽ̕䖡C]wL.#5H}S]v*Uث>+B,/\KA#ek_3`b[8$v;E$7oyj!Y|A5zl\$^ C4mD/X3Gy8ruZQ~;Plm->UX%^*3HG|p0&'Dbby?˓1Ni3^xDo]&$| f]z9zL6A'h-.sgU3_rf2M!2. V$̓q݊v**UثWb]v*Uثſ=e:Gӎ;ERuՏ؞K 0iycB;rǗzqffVLMms}8_GEch~v,ɬ]IzjITCFh5ZWw|\?LkZy?M{6iO/7c쫚hsjq|@tq){/'8\^OYQ[QɄcKWd5Ȗ{wo'Gl;Q{6R-(3Jļ8$Vcl=.njTG~\.))e4v*UثWb]|s98ܗ~H5>Wlwy-ʲ?Ѿ&m8.nN,/1R0ld1ZȬFifõ3q{2(1AySҙъW:Q[yz)oA#V5RaɐZ66~Ϩֱ?KCP:GlOO)t2O&3Smdq0ۏVIaANvob;v8cC>qO|y=AWM͞GyFXrEfֻv*UثWb]v*UثWb#GZ>s6Q.&BTU8ȍJKU#K'/0ۡ(f;~v2c[NcM±#bT֎b!m&V*XE| ^q;SRiw:$JrDn,ߖ1e q;R#dWf<140EM3& BV/lUní-Պ4$'"] Z|QQ?{;l<ɯK-CJҹ,Cq̺L' Q6 27yu x&qBg ?@|:rGr|z|%ZL_$gmК~˕OI(< [t[SP-5M9.UVdQZѕ*(J'BCCp9{P(U^& w96-껆$gN %H 7NٝAԓme^`aDMCVO)H' 4*ïfYQn_HF/[)iiC$ݏgy0,#̆b]fDּ¨d?p\$2!%]˾rgѵ sG*e$fbB`?[z)P\/ KY@-Q|ãͷDᢜut#5ٰYEn-<#[džuZUUz=CU6My'}idV֠ 3UѐHH L_\H!v $sHKק|x_wڡ/;\+I_UkTtY0rbu4vȾ] <ӽt}?UB- x=Is#AyFGGv*UثWb/).<7?-kHk9S9:Gb]*UثWb]v*UثU3 b;qWqS37_]y^-+S#=IXH 2# >K/>e"=ڹٺ|2~Q,y NGW׵R Јӱ[H4r>?Z_`OQߑ)Nf9޿+UfcN JfY\UثWb]v*UثWbXWLjt>"U'R0Gx$|9Y m)f"U܁2Wh^VVd[14?.@g=lG]]ʭ3 LЧO5|Un;&y{[wShF!y󕵁14!X²PV"hkє9lu")ukGM&\+Ew- P*ٺH>?]B|pOBK][/?5Μou 7.|&96Ywzf8]v*UثWb]v*UثWb{ -R}?R W"6YA8Kn|):i׮LyVi!'qm+WG<2@IfC}wB:i:[FbjxYs_ ǐk-8 94l1Z8Fhǒ=g̍&`p/hQɷ?ދZ1Qb1$)бXfyai]MB)4yd=oݛ)ʡ; ^8rsFhjR]NykD:=(Z|EfsUثWb]v*Դ ^J-ӯ"x.P+qW. k}Bbl.lVn!>D2G7i՘Ɉ춡nm%Pe5g m'Ş*?'< E}GA,#Iߢ4dݳeݣL8&89r?!h!RHZ~|SZ-y `Ԭ7 $r=D;WM!b_dSgg~!|rw$b'IJB Uz&n˞zF+}y~x=^\ҼZh," 411ݎn`Gu9,̥̦{SWb]*UثWb]v*UثWb]v*UثWb]v*UثWb]5G>X[zUʔf#|/0\KP}>=)YiNBPdCOF k? %ͫ:U}0Δ]$jTD֟^bh b7x'~v=ߖ\CW>l"GsKk ior0'2q{NO4 *-?L ,Q"*fp)6‡b]v*UثWb]v*UثWb];]y#Km%dk鋄Xt>|>*5Xh:YGJ,Wq#H|ɄK >eWYN &qAvM-C)9q|\\kotIuboQ(3ٰh\kG28JX{n'jGE[%P-CJ@~5/{x 48Wm̼xOWKߘ2,X/~!&zmjAolǦ͔mi>_^~U%32CǙ5Krd i6 fO7].mdvU"`3h]v*UثWbXǜ.h,Yk0muiSIE: ZAkէ7>W5?/HkH %`%%?Q,-4|ߥ'Mk=SB41%@WE};p/kpcj ki#ƜYy>l9'Yy~XuyY!3ihH#=jylGt/iZv kJ:ls>12I6Q$;v*UثWb]v*UثWb]a?_Bю";Rwwl~%>dҜ|8۩/+u|Tiw:s'̘2`1ϭ?%?!龭?5Q2!)27f v3=wȿ󋿜f)|-0,7j+Xiuf6>{۲v {c^Y[KnZP]ԧ]\2vUtX` Ϩcr,3gb]v*UثWbPaiWu4W6E$l(UU'͜jߔz34LI5')#謲}I Xu2˓#EeJ_8ϸ1?َ{WᶙM H2AfYH I#=Ǚ8{*7-9 ߏs -.?NDp[¡#DfTI&#$b]v**UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتUudu e"_pw\~o^WvOs%sgy8?ItKi7֐nRlŖUuHpChnդ+lM>aʿ!hiy4B/c<~s +B~QAm'yٻ }0>! ?2qÐhyϙz:PP(:- ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*U endstream endobj 1374 0 obj << /Length 1529 /Filter /FlateDecode >> stream x[MS6+Uڵ>,۫03<tA n ^!=lyŦ>9Ӈ}.؉ @ԗf4q`hOu5k{‹@ 5ȀpfYߴ-v Sv@$0 sD.sɿE:, fb|JEe6ȹCֹ</޿9YUpg舙 clPBA-i4Q6H]Z(>T&/=\{R|b> ZX|ۿ`#,g4r,w+Rv_ S"^)1+{Oó j™ӆi WYy”LIz8,j*g`,%|xg1bZ&tp+`L13yqKE/xoJ,sX@(/'J<EZHI7.F2O\F`w J:Ɩ}Di]BEo|?3 }V^yj[)u;-$V[>ŭDnWisQg~-8ƻpML!%+Kx1n~vws.h`qZ} d%^{ QD\-WH^uෆjDiūxA mM(Íxƛz3TQv[ml7X: dY*K'xɫe+0}MleZ{:X̗- mr`j?-0 endstream endobj 1208 0 obj << /Type /ObjStm /N 100 /First 965 /Length 2169 /Filter /FlateDecode >> stream xڵYn}W.06e(1FKn$#rLrbsgZwPzȮӧVZRd"uT'48T-a`H[Kڳdd8 O dZ7l0>@ƌo1gl#xxƃ(Fv\`%XfD5z^3xYkG(:<=ҠHiȧ`twTTvjn GybQ_5{L6c v75{eñ2?uRQm۲( UkF)K6jW`MҿڶȢX_PBV-MkxOcFײꇺW9(#e9j'}\/],vSm:vg7Fnx`êP~ǁD'8w[qěY8+P[oI[Sa#Wr':Ãe}??Wu}x}w ״;o^a3;<)D=td:=o-bU'z7W5ꊪn;+| 7՘M99!qJӬ z~: UDrV '<m#I/t~X/\zdE.NRM^ZDc'x<62~I5%E SCB"bhB.]T("Ά5^ ꈂ z֋<)tzyh"WvA> stream x[IsHWpD)t xL+)KS9dEai&qOͦ&@v,,] h{EqoXՉ@>Z7'7W'gw\3X3˦7hfd B{9qly"l2mیo'SL̿R$Uh|9-u=_ 6mΙqTL|@jI 8J "/d s>R|oς3EdɃ|?Amw-Q^6;p2[7 c͐ѸLpoݨ6+"lU]W({}-9G:^#RrDG0X}+,XvÖ1 GG{iS߯Q+&/\۳{TY,${¦xb7a6uްE$KH,BZ=Tȃ)v]٪y'6yy)#㉢Uzy-?M% ?# QkwiAFU6`ooۼ BGʡea[:eA02(¡rQJ>G=UQK_$- Fc@aweyD* Q9+.(.m3ht[=n/R^|[*wT!V|x9翸>8+/+ or(O39ĽvU]=#Sǚ[H\k endstream endobj 1482 0 obj << /Length 1980 /Filter /FlateDecode >> stream x\]s8}mlM-Y}k$Ndtvg}fѦ+[%m H{՛3K>hiO\=;y=2 tz7=\` ,Lz o7/oQ~Xag_z8[|!0Lc9M`Ah\eaӾi۶"#C?X`<Ϥ,YZLAƠobҟ!kSXQ~Xn!&GzLk}L6%lHX ilQXww#F_+j9Ni8AJ9z>"8,a%L @:g";pf2 \S h8YȴK< hCӢ̘FDQ<&I}Pd9O5ߟԚ,9yF͂W0KjwsItIIZ?~h.S' z"H@yx4|#,h0q6 -, lj֜ %I4g_ Ș:]2P HF)5%Z_t&l~gCK:'XVk p7puy#yUL597Riyϳ89_1Sh<И ӈ?C# q_A&}Lx>YRg>(?1a3VXC#@@ ,p"$dZe++a.BF'1ecsQ暰@Ǎ8aƹ) ۟^$ ȆF3k_cȱrP\RV[ܯ$IBKN olqsvWU /5rӴG-W>sakd4"6؈:tɱs:hT^i}蟱-:(>B\>E\wcoUvگ$8غ>]M?ʆmk:CeFoU}H_ϰ-xX߹VT.K\ˮ@gE<|TxD6)` $B*$OhicFz\9M,$@l뙪ڄ U(OTq7Rե`ͥ7pZ`#h?k\i+V:rIF."n)"K@D_HzltOs EGIqZk/d{?}.a)mcm4 g<zI endstream endobj 1379 0 obj << /Type /ObjStm /N 100 /First 1023 /Length 2726 /Filter /FlateDecode >> stream xڵ[M1p*V%@tp" ˋĈkH+yřڕ {a4i3,.'_O^RIo\ QQeJ*~m~0 FB+g m:#Q3KT?3,J&j}D2'DC:dk&0'yG6@X߶RJM}D G0aZj FHS>iڠ#K>Z-IgX\]Ppr.$*5$Vo{27jRД}_6׀JTDI\85^d` \ҩѼse2ԇΑQ4B# :&niȼ_PS_sW sM} (j3 &}1Mi0%S5'lkd6ͧ~# UG0 p}iSͦ:pUOvk\׺Q:\K:?j> TSV{LaSLaX\X!M=X&@vhT7@7\y\lNs?!K+pwuw]{ortw6LKgnNm:}ywwpsz?n߿Q;o|sszy!m]2 s᪙/ӳg*r>Iy?/na|4Ct}?]\a |z[kU7wzݫ[`M%hiĐ*;"FjК=fKFڀ!h=3|CgK ˘dB[ XerH8q8zqDKx0!G d+3 CeA F"DrU"I-t؝Ae  @<+xVA A1oy7qh#Ry PN{c,wT4`6%d}|x(*BPC!42: +6e16 ьe{o(hڑOi As#hzآ@+j\+ j6cZJ[G $FvCYܧ ϛY =:6kn8SCe=wf =Զ]9h@#Fe×xE5v5:Ph[)K*t󙋟Q"y4 \;|B7(wGbBG[ AX-JQ9PAh6K]Sx3Jh b*L@4 |P#]MS\8K=h?֠yB'_C'ubVh%>W3h!mVhŐx9{=k{_d84HGأg 9ɹVʒ>9Ve ͂-(s*e\͂S6BS_T'0[H:B!atnPx."E* _s01WC}B}a*̏}NŝY?D9}F(h$|1c? Ԃ|jA>Br -$Br %$KH,!YBd %$kH֐!YCd 5$kH֐CrP_!{H!bVZwtş[q+8[7ԮV l: ]e.ڏQuΣ^q CoLSkJGU:9mRW LL?6Us4sNj00PqPwPu}[khI\Ό2AXp%Vyj!^+,Xvn@lL,+8.=!c˜?D>bxta.ǟ1 JEލ2$l臟9IGU &"j.(:8A+{8m.@/vtc͉[C2PūMnXsP|1LhtMG5TwPuT:?]9> !{ uI="Y@^8:r6=8>;Ǭg;cͧ25˙s-}Q։Rj{FY;@e2@+7+jt<ܑЋ;493m8[!cFxoa&FBcK{Ko,O;oO8dp=/#jt5'AS)ik#㫴GʭVmmO@V5 T9%Vpm !ɵM4lL^mulq&xip^g۞uLl5}´VȶiphƈZ^mY5HFR~?6_9UZI*M_z,z endstream endobj 1539 0 obj << /Length 1745 /Filter /FlateDecode >> stream x\[s8~ϯ?A$طtw6Lݙ>XqIW ; ܘ%6;GG9G>sQ>]9:> G!Ĺu(t(Fo0D^Y6i.eɸxݳAHܓ?7Ur> pŏσ < 1vB7Їнe",O!o)ɯa}8~_ v+q M`bd'=-{a ݯ PoR+F,Tq6^d\]݋8'YΦ:b }IVִ˦Su +ɯI ^l/Ĉg!Љb6{:>yz %%qR\=]=MŌ54Fx-XgQr"nYӽ,en>`z}׫ɳswT7h v3̐2RAt`MjT=16{w COatFԢ^W?؈H1XwF|C'e*5 m"u(r^g2A(.uT\G&]~牤Xzd<^2r_:Z7084>TSO)$%# qqs~nN;QVg\13[6'½P]6j|7Q|X TUL 4S&]jO!ͻ,-\ALر<{`E0Ss ;eƳ̓2:Ezo~*laO.\.. n,V7>?"?uK6Z^ܥcL8M>~Ԩ{̄Tzc(d% `TC"6*3"+lꙙCӟ5 D#g:V> stream x\KwFWX5!~NCchs.&bBC$'3 iɶ|wlwfVGڝt֑/nߜ^팧`};6:I@ne̺=EY1o$C_El*?T9-Ϭ i;zs~8övcl}lZӃq SZ;?B Mh*O+K2B9Lc0݇RȘugI'OcZAy&u<~ލ! @6OIo[QnX8##ĕT%l\U )KikVLR,Q ,G01&~?gW*/0iz GhVrli.[XULDܣy9ϹGx MDl1408HSQ8ݧZB&M(f!MDMS2JDb hwR{N$ʞqdv$GWókwhx s{f(NkdZ"eؑokŷ7sƬc$|.>P ~a>lιtTܽyDE qdJ)xzN3qcS27dS"Tt T9z7OfdfZZr*$$ .m?]5URDHdWvGQ߳2{RA,&_GM{f Hа`]ZFsU>4 yJD,4srT:1q#SfZJ,]uSȩzQGxmP ii`QN/1PAaˋEq|+axs&KnpPb}5(jJjUk ؝1(`GdLx95ؼV:]řXɿ֪5#W3Yf3\Qc1/*i+V5ӜO5 $]?e endstream endobj 1485 0 obj << /Type /ObjStm /N 100 /First 1024 /Length 2778 /Filter /FlateDecode >> stream xڵ[M1& %@|pb ˋDkH+[Cqvd,r4j6_!lChA4t6R0Ǚ-㙊y)@;ZzJ0~29^x] Y "ƖQJuKf;M*)$lj- z%4kb˂V>@yR`4jT Z= I\2[9X-4K7% ^|FP2,V Ea>3r Z3pIi$O N.8y>M48Ȱe [:jbifxj" QC-mPyf&ZhiC=>$<9 ][{zxxB6#Sk`>tHGLN7._Yܛ8->.8K϶a@`6Xq<-Aox{$%1Tʵ9hĆݤtrpHq>0؈@kkJ|7Bx L܊{dŇBZ srcx42q\ኛgn._p÷oyswI#ҫ/|M7/o\{]1>'?k_#% oƇ|._oڡbEsg;˟7#wy[p_<n|~m~{sw9tϷ}ݛYawo_vcH wT0͌ q#,:m65=F 2O>#2Cc#φ̆ΆF :m6&ry"牜'ry"牜'ry"D,Y&Ld2e"DY'Nd:SsL0tM5f'X=~snq+;*$혛k^{?vLo4R Ddf1'$I@X +I[#w%96vC GD|"0Ri+#Z'" s VբEs$T\$j .E& A9 z4 dhIhؠKoіȜ037PhV\^D@\-"l>+ )d )"Qx[f}(XÈT jg'AEfHAADwYcA4ʑܸ:fO8ą:Ee8d0?r昸~%z#Kʹzb6(Μ;|soDgqE.0Nqj8;3֌cpE!sK lA+`S&J$i%:~N}GvT1cRA)2USV;F7/>p]a.Y"al+ԋ"kgfΏ |1J͊_ُ\fèV$&\|sM1-uKA(:-/Qe5iv &k}Tܩ!B3-pBc0r%6q՚ۇNZ(ZwϪ?UZYYYYq.WW2+eV\D.L2D.L2}"D'Od>}"DN:DN:DynDnM6D;APչe3dѢjչa,֪Zuar/֪3U+C6uZ5lX>YΆ䧒.=Y^rs/kXvzⶡu2S`v}z(ZDMp]PR؟yl)Ȉ&'N/I ٫) xG>\؜- ڡU⢵Co0gZCR| |yk.&=%Wna f9GC۳M! (y J}l(:_ਏՊuӎj_5ƢB6lIA 0 46G35]b8P ssGlu8PeFsɮz4@  ťJHTkyXrh g/mR0~h%V0)E2~~qߡ endstream endobj 1647 0 obj << /Length 1775 /Filter /FlateDecode >> stream xKW8Y:K 9SnYH48vhg3}$Kv.6 +)LU> |<} B: q xx }wr#'KFE>A>A>pn,@<6,BB@\,BMU21xwf@%y!H !ŧ v[@Q:Y{3'->P:϶?6:8ARC`Ĺ^u߱L:7/<9 y_!kYw=N [2o dC pHwy!MJ{K#H "P]z2l#2 $b;V6VZ',!"B9!ۉIvґ2E*BS+}$́K,}=);6C6C0Ȃ0F[T(I)ͤZA> ;-_̪Ґ0E ۑ(/+<\A*R9{6bgbr>S.|i: **mLymQ.۹ROh%q8+.̤_]>@L9BG'-~y Յ}{\cP_WaMJdߝS&a8djfja(uNJm{^脠6U.Ƕ\I̱74nS~(? m?deк:O~Ntg";>I&ܸ<*ejo1۹RsܫBG^ AA1ވJdiE}\v[%qcvhnk(jW|"[٭>TxĄ/#o|gXiت42\E tQgF[#.Gg_[SⱪTHm(S3EgJxUF0kc> u"Q|&JtHdmf`1$<K$ޫt^HK5ߙwnc^x 3௉* {`ג!/Ɩ|̀_7q/&὞mCj.:ND?:Ax/!%p!8Ui7$չIAf@753ʙ֖LfR1"5HM^%Z.F~1ݩz6UN31(rJ7zשLҙKg״ZPȜXk8VUK)2~. W;6]?׎+ z#cqjLyͭfmtYچ^zzMX txn e$6$%qb:LTFQ4-٭Ν˿nlOB;^}gM[v]wN3}$6ÞB"WndRy&ioCeUyse|<4JNT$U% ѯ լ[tm c׆@*iyyy5Sf+U(r'u7$-,:1v43M}6*Y1n$0f{b3 <)]zO;"UVS}o-`ެi> stream x[r6+ 5)ăTi:M'"&acP R(GjG19{qis2ޞYr _ع|{zvj ]ßtٍBB1/&Fcd[e[hkGl!;`bԅD)q:M"*b!b5/c]2T~51`۶z m#ݲ7aC^N$ ? 7ű=s~ʲy}if`lZtyq06qRL@IJ6_e%P8q`u26gFeXό,H#s N$K}F`c$0qaIP `_{y(D qJLG";xQ㻻xZTiJ.%:k\ E-=~ZUsd8 rML; g[ {E^;z rHJ2Hwb~ &"fma2"q/MH<VuNBMT}v:UA5tINa}e5U%u|XOoQw֜3b?۩23.fȲҠv ]o{`kh#?Wbޛ^y>՜HEF3T4I51 :~^b%A:oMAѬֱtID[G=<3"P/$, lrd*ْ]e:v9L=zKHEO @G~+Ά4IQEMbSg S?q5E)0g(O A"îJ Jփ,0AlU`Z-%[Slo@cw z'X&u^Eٌm#wp +7*r~kyr5[زwV*r2܄{.3+EݥʦtMiԘx`iʳ;V&BB%^\M.bAV H9$I\w4Ex$Q&19V퇐 Tۤ/&gU*!jy_,ț#I.Ǯ'+wk7C*}yYiͲTŻWH24NF pe@U0$_>Zo'煈؁`܉g{yA2 qNU]~؞GC؉!Ǚ^M~ovm/BbR. _pM*jpdETI%/t2ayo8o犃;wAU}CJKHZ0;*4䎒Vs!,ssQ= `*[ⷀw7*]| Zl.1Q(Qu$(9`.5c=[ `)2VN"{P4} I;y ڍ8e;fNn?ͽк endstream endobj 1596 0 obj << /Type /ObjStm /N 100 /First 1022 /Length 2756 /Filter /FlateDecode >> stream xڵ[M1l6 %@uHb ˋĈkH+[n"#!!`kdw5/[!lMB.ʆi+{jдB-g^%d1A+ůOOv'$IQoArcQ))$kcܠU8 ݅xsJ<BB.C-4q+T\d+ηTPeާ<Մ>pfu RAQZpl3-)dΛ(Uɡ5t-zdis(pЋ6z3Bd}ᖔ9z)=DrJe6tPUOjcpiK󵌫x6_ޅU@spesAoelr1H\9/Ηu&E(b6ry7ie T.y2fU*W*.%N*6i} /p.X \Eky?݆ww7o>~0\o/^7U͇}?\bg7D:c,kq̈'Yi;[Lm%t 0οDGrv>$0M0NcNJLzha0aJD1o`#IdŒY92ЍDhA|"ɢ"^Fr=d}3#p_0 wͼÀ|Iߋw 7Z7| ۻ@~kDto9 PX޾ uzt< ahѯ F 26u6|6lLd b11H1i@GD 40w +5TR[~, x犨fKi}"DM6DnM6DnM6g'rȽYH{LNht)hOۘO322y|6WmRț3ZbNf +gmOvyPsI5\^XCgDgCvR>n3"K5lNh,((2\a(u:ғZ.hQuy:jRA/E5lHP R)bY"!=1ȳ3!X9 fo:n! xFgS6 7I4]4l{?H`蜟xk&״*vw؅%WaĮjuelN,)>x܂줶%6;Ó\p2ٚmv!@f[*Kl6j8irU$K?;bӂY \4Fv\Wm͖ꤌmt{̲J%:; z&Ǩ Å%k03ϴq~(z47bPq-V: X..ё EJxSOE3ٱ(w(R"& 2T!%NDPx{ʃzp"o8P 9HGDvQM!?YM9}jz eARsE01,_,H6<狞|X*<?DnGi@-8 HV܇] ?Ŷk3#"T132'Xٓˎ#fFNSQz' f endstream endobj 1705 0 obj << /Length 300 /Filter /FlateDecode >> stream xSN0+9\ ZBA @Ҧ$U=NS6 ?Ћwwvdwlk![9Tk蓧w{0` E Cqi NaBov;̊t}ln) [M_?4yYoàP(Eoͣ#aU "fI_;KJlKه/"MݣI_In$c"dnGλ=./Lo4& »*KMWUuҬH/ҟɩxh,?N > stream xڵXK6 WyV~YoIvv&LLdѡ}$ɏ;ÞD Ph5 FoΞ<e(,JG(FYqXfZl4I^8w;HC&IaB68Ѱ%]en}aI4)1 p< (>TKߩ[zg׺/3I/DrpWUu-qS-K1u*[v1ɮmX ޛ7[Hw^0[XAeeIy/.TwWvz!Yç['t\0;%kIa?qE]g\QKz ,eZk C`re0,pXpmD`DFbi}pT3Wg^EW{K irס%án= _9$(ҢWr!)wH;8OG~Z SO  1‰.}ǯZڊjGqA{)8'q} wj{[ܺZ[+ˮٗG:io20Ъz/ We'ާ+5ټr;9a4Å"nuI> u]_a؛Q~QPC$?k?o hU,tXS Ѷ֍<ʑO>рߣFѯ*ޗG> stream xڽXKs8WhoTUD8ޱff@5Er 0'~W\SFh4`v; f? ڳ囓a2+2fVd~$< gzG/M;PL`/9拨j5_qَZU ^ ztѭL]N7ݰ^\+cu ͸Bje~85'Ɔl~>s8Ctޝ]6_yﳦ2-[4OښեQgV9"L2—yj^ػ,7tF[Cheފ{PM/ݛlT5]@C8삍TM$v &"?Kڂ׫s']7Ce!{9ro-zYKb^ikGqt* [;v-+vSYGCUbGgnaH(A1(S] Nw@ʎ2,BhX"Ss"3;)tAAGw h d"fYi=02+@k5 -C`{bڣ,PsInpk_Uyu$&YIXƖ%. K'ki$nlŒѐ{'`ZԁܱW4FBaT3yUGҖc/Yy,D-hqe qfͥEF" $QjD^ ݮfmIBB``=@88U mm(v<2E/"l;_$0U{IP5jժq\;ɥ+TY@!5LzX**i,jiAQ>d#;В>^/UŪ8N : :wt8 \R (mTsO n˶aΒihÓ%Z%;;Ըű0;*a_ t5#ztu}Ut0%T쟤w~|eB!9“ V21̚p0bGW`ΏB54y !:S?2u)|sִ2{{I2sιEr^4`jvʣVA p!1}Bv8m>xR:pcj l&~d vqe`ApX( Ơ:p _E$)>2aK X"'CsG̣WE QB-$9qdBzj׼#FD0oZKvA UeN=̻mS*q WAHLp6``cgzĔԏx3lnONwg8yq#Bh!–,. ? \$xt2!zZI5 ?ԓ0@V4C$*e"C0-ᄐ']WhF=l][ ͍ʜjGQ ǖ *0٠vZ!d 9 b 3UŻi8gއyP݋s:*W`{Y^r-#["Z`?zPahXrwyJoFsuU \ |2{ya2b+<z'2om!!@>oEP.wr߶4?+T.+s٠>?} =O.@:8ǟ1Tmj ӧg? ][/O#|ڱZoN6;2ÌHƨz_&?:7z-GY ۖ;Zڛjmgt=,SC$c1QF,K@{]vwX(jmmHMRz3ID8HOI!֏U:5O(#< 󚮽X T`1t q2]?I"|R ޓLyɘD2 Q b]Xua:8X7 GDѳyDsr1nd7p%ߗY N>tm9CTF~QC|!y ̰cG`O|Cʄ endstream endobj 1732 0 obj << /Length 2175 /Filter /FlateDecode >> stream xڽY[s6~ϯe%^3ԩC,qC*HQ"%YƳsb?m" Q,F2=΂sz4UXr)6㉌CUjNO*k~C|߿U`_X<, 8 x4%;v>X„YcěW^`{QDxWMJh]=U}hblr/[ YGKÐX,TVaIMWHz PVn6Gz1/!>I# \S$l,b+6',G5Iۿ,R{弦YZ~WYnlr*g'az9^92r# \[E[X2hHՊzACBhQ-ʽ"o뵆jQpsw3'egmi؞Qik#5ʄє o lS1bj`iUiEk[9e,nmՖsZ>=njMŎMIK#lzNh 8 5BV`hg1KzV(Y*ZRFApx!끓>n^92ԛeV.B?A3NxҀ?4*E=fIu}Xo (APCRܯ$>"V\<{UV+6:[߅K%IOY<L8o",[t^n P+d),ZR&c|_;ƒ %s=P^;r Sţ,H, 6arUνWWןhѻslOvM H3C,iIKLbK8Rʐx7`Yĸz1H+"q.L2ex(/e s ~b>LMΛig.m} +.{+ӟxmHsg֔1245N?T b Sw&edX~f5YKI]PjJZX-5(JZFj=UdrW$AUVyaVSr ^rA 0jC ָmVSA5mSi⨬8HVnvZFVVaWABI[u-gF3EAʯ8H[bqb)":1ŃarCfiK0dOv`IKpQ؏ɀprUauSQjk* !o]8J )F2H8 Ou>Axܿ d|č-!!EazS>Y0'L&p9(ԷlsW+ 1/ W<7,T_iE%bXLnm|A,%K(DhPBt1!5%N7.68`ӿ|]P1hWɾӺzZaH> ͯp֖{HI)1`: t\ra4.Mؖ8}L1+Kc@N`(h/jnƭvg9ZY4\Jnb\t9E2׮8,Ty`P*z>UQ zlϨ[y1],83E;MӨ\9X P@ { "#ȁ HѡЀHZ)PFg# J;y>HĝޠO2%/cvQXE؇H+ W5Fpڽսs^ ]fihZ0 +maQ6Yr;E0V\f)K(篵F̅9K[p{H?]=*LCn1vN*!0qa l~p@ endstream endobj 1754 0 obj << /Length 3099 /Filter /FlateDecode >> stream xZY~!^M6i 0,˲I ;8$CM|h^]IewWw]_Uٸ>s&IG&D⪍\j6]$Nw4\xrW/d67.Out]γB_8 /]ZE֏Xܝ-6mdbw֤U=Q ǚi|KqGb)B/T =%^yrD8:5䒬:-uM︻n[!L6&z#o쭮xĝrʥ}A2rҠ>b !ZDpg'uRww.@`.ؗ‘-Uњ)Cms(󻊉1ӫKn ߑzDx]y؟-aI xeoM}8z^(3c>rnEa]@!p%+}j 5+Ҙr ?!.`V i]GV['h+=Ӗ[`E7h@WnG(U-ȸŠjNNݍ?Z9ʒ{D,k&|@| Ktⅵ׈-lp0jA8ƿ]&Cb\|\]/rE5#&*kP%h}ZtjXmYu= `Y_a,x-)IIyvC3e*mc 3d6ϵ!bIoz>RVÜD$,lc_Q(&o4 P&7$?Lg ! ׀eR&v8R"Py`mr @,A!H;-BКKy 먻s:0d%m0θSO, oC*#$5yvx j"nЃ!Gr25'X}Da/-mBݣA-C/|s͙?ZՅ#sm7^ƪDzM=W >{z~b"8wEțSbKaX0@p6'qm}E/2 8Şw- ;Жn ;&~|R^tun*!(B/1KGS2Pl4,/^h7¯`KZEz2|{oqJ1'T7dlǙ:P)%@0NuSY ˆyPfW^3Umpv^h,KO0Af!·eט r—h%&4f,g  3lDWi~HϿCo# &kӥq/DM^4d/6^)^(,udHе6b'?CV۳p+YAh,;Lrzcda d94n8}9+OEvoatay/\4t^MRzh*I.D` u_t\iL7%O(ó.SFΎ&3P>Pp [$q |u:p2'畊D4aY DObb*4 /H s<{ )'d@-eS ֏D |BA9Ggbh ߗ[.GnLvTG7j/b婚u{hOzM ZrTk:N) xf9|*Z8bз #B endstream endobj 1773 0 obj << /Length 2667 /Filter /FlateDecode >> stream xڽZ[o8~ϯKfDR})b:袳6v -DIns!e˖Ӥ-!|ğz=/O^'T&I X2|d(NgwXRMx}:ai(=V޳8{ҝa$-}SSFBS)ELOX^eLέg>3bqoGxbRUZ~>4K%N[tfi svwuEޮwH]9HeUw+p)/-.}Sܘ ڂe&}'f+ky->&IZuu58=/T$=. h*򕩺QL0B(pa0EǸ.}q)vD{k<, Ėp%{ER$QdE;9rp<27caB=ců2M1{ː)Hy(؃ϧTɭKA.Iԭ\)MWT<]zN>  noç7S6e4-߫n2%vFIeZ^ ]v]乩TH)V@.mj~ޠ&dFIG"1[:R$I_]U]]!ɑ02 dSY!HVÔP{@ݛIT»F)ag`$G2wJQjBc/yft_ ^DEBevhL֒!-{S0<tvd=`^-Ra씜*]ug6 ) -$3[pht%XݍI<+ zݓvr H[i ɜBDz螏}CHCl>vMˁt *i`+ zaT߃6~W% {ifsݺa ?mWm| E¦ٌBnD,%tᏙ/add3n`:iu P3dKSlX~Opn,./_wp1~elMlm7"!`Ie‹jonX={>v36Ry/> stream xڅX[ۺ~ϯp2pV)6i'ڦI6m3+K(YwnūDr8of`*㫻D* ,~G,N8,Vկ:w]yEfGxA<>-[-`?tJp\zqϖ^)?i Ujr(ya$u?].Lpkw"uJ!`jYNmX~Es?zcxpڞȔi`0UarK6s#ST5 bR r:Q1^L6ֺC *yN{9kI2?@G|چ{if1fA ea'Piwd unki*8 Hœ9s$Ce#=Uqj7H ʒd.Zu:ۆ)FH "@:"_}kkm4IFd.)gs[JuL[g; KNIN2' c$,YenEō5qG|9`roGPQz{͔ 1`l:$`ϴPo LLڃKy@ \upՎߨ˰S_DYMvV^-8:+E$ iO.Br ')wy1).uufʆC~k$|ÄG}r9"Mi[E7Vj'$x䦛Fe:kO^s5E}-ecviu_ &FS3+e`3&W #{4LNDm{8:3UCi}a<}ՙs%Lr;BƮ< Nڑ;y{eCm : S2Pkn[ՃkҘnRCf"W#t(9)Ћo}PtW (#i{liJb,wӚÑ,9yfC oϒhWDwbNi4SF*)Lfkxh[Ee9R~d1F\tB\(A  :( g(10q)_(ɲL&kZDb[;?h<S( ؂=\?CbعG(ȕF4'_K#Ko7 yrFh&%boxJ d} je,+f=DZC M=J[8{nհ 6+)Z?,mCPʫ_1,f/EebxZ*w%3gGMpœ-FA(N7 Aa&'t‹M7XgliN= eCͨٯY<$Cv@ڴ\sc5mp k5UU.m'CY]ຜe]&c~zgk? E `UO}4\/+3p9 (0"L͹Z<7sO"ZBlAᦒ98S9S. bйNNIQƞ,t_9X%~s̱3ҿ pM 偩9r GtNj-{m_?7ȿ5X3$k刉 NIG;*&0$M5- La2O]'zx˫Os?z#~s $ȥKT!|#/u*?J{!tvBނ7w<MUq"ln+po g۷oN gzZ}nVM$ x\HA"s72w@,?LfL~|Nc endstream endobj 1807 0 obj << /Length 2971 /Filter /FlateDecode >> stream xڭkoF{~/b]|9\CWW#k)Ҧz_ٝb7/^jQEevG< r񫷵Ue/rljwc^u =!I%;:q\Fd/&*Fe(f^zuL66'/˰ Y_]_]on :3(BbD%o{u;\=ؘGGMY}%l̒z"L%L"I f3<ޫK1D722-^Ywo}Gt{O 7Wpbfkݘcԏ¡+vwr̒?-S8;t{l6.EW \nUW~R=2_%h$ pybl FEHӿ|s0N%LSO T8.2GmY`ŀ22:-*UZB:mp>HWT])zhKC//Q{:KZ0;ue {utC*E[_tz⅟3O y dM6˽Zxt S6gަRm+(}@GI62_6cRh$@&a{AU${~U)3şvE 𫆼Lȏb*gFF}8 U!(\M- 5CONA;Ēn79"Ex,*H/R.*iw3 rWZ"d .%O%ѕ&6Wsc$$$@ V2ZE1"oVHv'ߦmaNrNb(0y0`$'%ԸPpr=;"QL= =o.d)#A\%$@;ïK=є?q`[т1\of#݄C=E%ŐbkR,gA* JzWP%@7Dq̷̇[2wj h٦he!ܫn#m_ -ezNTwGx mq&Ԝݙ y.P2J"&b'Y$=D 8NP#lS<_FF`⯢P|ޒ $\R=F)5f7ODZJbsiEA$X!j5὜$Cғn $"vt)f| j9L=e\4BcOY,GD|1en1.pb Q 촶iNSW@nq(qfCvPPVVD'ΥacTZ!<8񈳵LCq֝%Ήg"I3>bZC}Q~7=J { GvJ\|3"j˰Iγs.D6PsmS?d FׯI81'"c,t i ye~ \~rkoc5 SLͽH|>6P}ՙkOd2 ]coyp sHl j;/ endstream endobj 1700 0 obj << /Type /ObjStm /N 100 /First 972 /Length 2374 /Filter /FlateDecode >> stream xZo7~_(ȝ;\~Pl5H,7PZ_$Yڭi $H;$ÙߐcNs6Eb(yqIoB&MY1%!E=RՠŒ?ɡ$*kɡE 7Ɵy|AJ)!$ QaɐH6x$9d(:a6vKN祭}0aG)&(dkC^0}@ Qbo8Ū!p' FoGmKHpږHG(F:'1)R _p\pcqTtN&xzRm:DQA_At1B*y5 ,)!A + VX[@++Q U0$&/6%HQۦujU*j/X0IJD.&Y1!23Ϭh+I@JPe H-g),^q: YU|-J2lLG?Xbm'Q3T(OOOcӜMIsnQc2p|?ߎo]7o.y3Y[N.uC#/,3szjKmv53͹n-owߝV`GNA%M,|h8Ma `]Q 0@q ?.;hx;"[?4rؖnY 6hjG;="򏊳Lȹ˝ BX `3sb!qxC`+ 0bw2$}iȹy-[i?L[WtiJ/l^g7cgLs5uaקz~|ţnAgO9j3"%&R:WT ~*㓀Y3,{?nX:$AL8+u#;iH.[% 1RvD bHϧw_nF?,"!"vۈ{"%/rW0|^a5fnV.cEp:FaF)WQ/6PK6az7hZ\G2`׭$ԩȢ3_H< Wߖ哴ϾH3^,Df}\ ԦOG:x U$L (lf-`O|iz?X-qZ@hQPiUs;yl&X~*l?t4P<utV&Vsٗgu],[|5XYk;:| 6<;r -`3`3=+GV,ؑ e~3Y.?mXfǀ65UNS@_? gGGԓh%=§c~zGG݁R!juK~cn6SȀ;1!D=#8!1a>Y`淰'iON `MHC 9PPƿLny0xȁaxTy&˹tew[Hm(Ţ{w+f+(;%cjDxU @Ч^ZX֥uia]Jn%gW:Z4 #*Ykr21G~0ZxZ}s69v;ԍvGu?ZfGVVF];18YkA]A lQ^xۥmjk (4HAt9_X-^0yzOvWo> H.]BJiH '炙m'{"b \H$=V`laAuXw=5%=TtK^`݊ PDN0QؒYe =+lGr8N=u) {vSIBm$!L L !/HVDO@BS}Ud]Ȫ! a[k3DYbM7AZtqnsOD=0fMiPYSEVߍV܉!.PĦ+IECY 2T݊Ҵ(d=J^RVìef1+[*mRBU/P` :R9,)DB"Sc$)goX7({^}[DJj퐢{ATev (Y!ɀo'dOm^_,הv8Ǒp:vP.mLnߠ8`J{NRZ)+Yp[Z[ARL`#cc{:.rD endstream endobj 1820 0 obj << /Length 2755 /Filter /FlateDecode >> stream xڭkoz_L5"h S\5PwAWkԑT;HY\9;;Yͯ\]\ݾ b=*7p|y~&/7`9t0녅d4S;=xnݍ91˼K>"_5{~Q^OUȺMy+$ۭӴ(hz܏oc){ul#|9dBBa (bU!y*Mt&cg5a, t N]Jgx.dˢhMmiO{ `:i^ Un*tQr#.{1 E,\p xƞI{V,Ăx %ik/-KkLkj-JrY>q鐷B6h]IF\@6ro:.z!hfV[%6;$k˶0mN26_n 6wd#FnD|Bd⚰aFK 0wd,9 6 d]ֹFGySvX 2EI?I/qU `ۼR_0U؅;K]`"=ɖ]e9el-['z3b-h L$to0R|cur=QlAMtIUB6k|PE 2k^E|/ۇW,yy?lWֶݾ0r \r`CwBOqwb"ˆq;ߛa% 4xȂ]=2aËJ<31 /鮯/hVDgcT2þqэ\13 ތ+<"[lvIeb|6o֔x[(fZ6O-{}*?9pA),LY)ĝ!qVu_j-\AGMAܔouȸ/s{G*Wy?tm.>IFA4FQbjwGw$8 dDKw@yAP1ztp7NDj)'_p8Va%8<"j]{*̡Ir"_nwIQ, +#a&?4\̖/Đi %Þʮv[Iu@z\Jiá8ǟ 6^boUzEckn&*?MME*q']UW>g p[E|H)%⹦n[JeeV쬡P7QHF]Qp5}$ɉTO:.8qh47"hc0nMM^NIs-3}XӐe?.>x ƩscTR]r/$~]è \)HaCO?;4JR|C@O"X(X. w2 (l#䧱KM|WzvZ*jMJ;G@+}3`@:BNIQ얟9I$yv c0Ιk7<䁡)C  Ń3Ve6_Lt>_,34l181]̦ |K 3b~2!9mE ("˜.p ,/RVJ]H’`#&+fͪ{NO d [UR]*;C#wЂ2wSݚ 䳚cUuaݣYX޲3"0@,RvE'Ŕh">/A hǐ^[ ݋ѹP+XٲT.U4?׫׼Pt| ^l0g]Knum.q۳؍q_GĻmu(jg0nS;oܼmj {B|v-~ f^/ke/Dspš0 R[/8rx#3 ^@{"P$^Q}\]M%&O3./q> stream xڭYYoH~%4l̛M0Ivb73b["LZǛ?u5ELQ뫪7μ“7닫w~b|/5N[;[](#'qwYsg]]*2 4zQQ_]odŋXm]^oF|H;3t*ƺh<Ȧ'ێW&nkrA<)  LF0u")9ZFoLSzXԿ{j<9ߋWb[3s3ߚ: ]sL]n9[C\R0xp8Zj]̱BK-~PI( I\֋rX`rZV8X/kYV+uK1??r{4otv"a7\ x%Xd]/k8py1j[YN6XF #7R VnEg8a3rٖ b^9@R_?x_Ydܭ۲_W+78hɋ{-/C*Š8GL_V\j 3%X}!t.gQKç8!$L|y-?Qj4go[ծ2Jn RuMMe M@-ڶ/QTV Sxv.EhQ~yW<"#/TE.L1{䍈YYlL) P:Pܜ@ǍN3@rIM0Q $([ama\'>'7> stream x}VK6WZ[V -b-.Iжv|it"vQV&EY5ydiM/qUUG/rU4U4n^DmրHiʳdg^ % P(ӻoxJEǔrᾲDyBj,IriQVƽXM,8j#4vX'NGCp;aΕxg둽V eI[UTafSFH_I8T7E{8n*\1OmNrUu|G% E ox{tkf̀!pMN%7EUu$? 0WdĈ$&Hbr )@悔VOf/I'N> h`cʑ92; DG9J#|;OgIf-Fe]?@jW/j&7}y5l[Ĭo  4%W`1FIK _P8_67ax|1,i"J݉S̢y3 *:{d;?#״J?A ^'1"ϋ苇6^ \{zbOLoq|$y4 x2 :A] \gcT)_ML@ ۧ,>7~㶘__ʴwkb|$nHH .XpG a²Aʁ8}e&X}0-">^-CkSb}C=&.{.?;Љ6UhЍÚEn l h)FTFa둾P{9\H6qyNڶxv}Z! ѩsbv p{m`'Kc:_jpg/5Ն*ApGgxzxc$hwlQ<8 /6~@ҦVL%v/?) endstream endobj 1850 0 obj << /Length 2834 /Filter /FlateDecode >> stream xڍYYs8~ϯP%tULyȖ㝸23SD[/PE%l4ЍF_jVw<}w}ύ Z?`Xn7UDNx_xr4qR1:7Y_^š?/NWŰ/|7"^lfS溂itU[tno 禾 Roz$ e͜ v2\^)st],seǣ2H@xBAuU+Hpsy|͢NJF!CmPV8;#e1sUYoT[&w}Fl lb @7tz~^hY.}{^@Ğ-nʇEުݬxwRPѴ5"d4-e}4Sk*ݛb@`c1o4ɛ8=\*SExM"i[5g[5PX/&GHtj!`tu]7=:SFݍڰ;o``cά^Ӹ o%\W_R'Vc0V00]'VB]߂ k$BG %/"7Nb{K7w77ww Q8zޛo0Deىo$-k#dPFW -u(ft=eD.ߔ7:i I[Y\z \wv3M{j ݞbi{v՞W% aHkl{z~x1˙&u8:i:V1@B?ڤI3nT9˶UPR9U`tY&9m H#Ұ2r*UqTݰmu ^_™&+[qޙS/+IEX 甶|&n's߃\wz yƣvHJ!'=ܓ,ȍh#zT #GE^ǽ+ |aCI2 3#*㬗,f(vd|SBBWfg }O7VutB?%N! 8dA(`$9|-zR!bRvk ˇ޼Y @q6&]zmS@GcS8ݏ 7^ J^L^2= #.721.oe1PvoΥmeL7xǚ 8CE%c%#^]`Χq m!;E,PIl725o$pޣ VPͳ&*$@ZmRߍfǁ$uiVް)%h6`^G&Yo`BBy^``n@U씦7Rm N Mw!?CСRcamkZ{ 0( ~K! ], xi z*`y%h0=``بsuU,+Qhe"(cpE?ML1S <<l Y3ksBa ,|1=OH@#Z8(Kl}@YLUYyuh\ܸ}/`>K@XD)p tȯH2fGɼ)=wpу=v+67 T3~\=8쭍ǿEf:=le4iw)?驃-$C"Q;>b}TM._yFbri_pp;Oh2 yC%/SRi!iSaljͬ>}-F@m6 :> stream xVQo8 ~zgٱX,fá܇n\GI̖f~ȸNn{&k--ך4JN_x;qV"ϊ~d%s}~~>^`O5K/{:%df)(c9qL!ggghW5Wڮ=Ii]}L=Ÿslģ7roCf5Rqg[kѷ׃ٲuN+ZdI֓& jԊ lè:PuZU%jLm3x nN?$OU Ap]˦wgIq!Z7c@) 8h]߇ʼn>]C[g6;9}`>ˆR=je@>iL> stream xXo6޿0TbUU`Ro1:`E臶(Hb&QIGJv" ;;2]͂I`/O/(/gyͲ087z+ֿ=;=(YCVI4Bh&B]I}/B2o;j !I,s,R$QBo|$$J^aB`/fӭl"krJokm8LwΈwFs P`? zS^C#%a{ʊc][׎&`jhTP 0|,AF" p{YIgE:[/^qĻlUMR#jj[OXd45O/,L= {>cO`yBgĻRWКaPêcoGx{^U;CdS8F0L #z<x1s/&Фu*Wn+o*aTDoE3NDi[yiP%] EkN(ةRȏAV4.g 9/Dox%>Q `lxAu)G)Tڭ ..fɀ ?s挍<*F5 HSV K8,iXEƺPнlܓ[AhR( LJHLOqPأp83O,`Nk1cHvO,2)6T^o)޾Pn,NLX5NA|b4k5'αwȽ/Pzx2d [{b 5/ЍMtaV<]ѯ' Ѵ4 endstream endobj 1865 0 obj << /Length 2087 /Filter /FlateDecode >> stream xڥXm6_aVjUw 8^4CRMjeɕm}獲f7l )3>Foy+O7W?KFF:-6$r s=?-֣bg_i1\3r+dmYJ ӎZgn9':qL6Uiu2q4]L;<Js/.Ǔ0r~3vDtRn|C],} N35N{KAe<]vJ_~vڴY^@N]dUɺDemNڂM]/Uuˬ\'zIw#?ow<}m:G.ΎAsk:qi'/Xm񀝟DU\?|}>z(\CQl1_Lt~=/tKX B7%[|>.70[[8 :f,ήxIikDIhh~k˰1S76P2n[~GF,ߝpl@uD [q[kq'=K/Yža]<|CW%z)azMTt}=Q_׌5%fq7*Ё\o?عA| Z9%qH"b˱8وCn٧$Z1[tU:&+*&;6-S * H8#gC&g S=C~``od^0Yf6R&Ui<0zM<-Ďmp/({^fdf2 ?hfWO-*(S(B1 n:SWyTtP O(xqgH w!9SLh<6~6!_ lCwwWIzn]$$z$ctxz`H%#~=y>'qȸ4;f+1NK;0q0bh\w[IiSNW%vd\ɸ h i7,ergb('Z+"/*}I 3s@y0 ϸz+02wddžÉ>H6Z=R&#r5l5kUֱY˫PBPq%^?>sjWvfsc>d|6滛lo>)?(_7|^/&x=#ס<%p?4Owoo3b\Jd()IBa&SލT{ 4)y.XDEШ!+`=5AR"`~7J@zR!|`V!<;Q1#TdxmU/$ c7CE(Ti#\?JҰw Z||:[}lF ,:S6yZaiS.k~8@=Ψj%{:Uݚ콰 B5_ucz(A_5#/) #UOܽ_wCWO`&]"qN)ջ,^?ֿaZR5%6LMՋQnHMXT%l HcđrC}Ir+` m IFXj3̪$p=| vO1z pxq۪O練{BnTS֡#"KfrX6˃Psb N a|e]uc2/|MV yPV804hA\W>يW endstream endobj 1869 0 obj << /Length 1284 /Filter /FlateDecode >> stream xWYoF~ϯ%j1\PTI F)5Pî}gvv):,{͹38Y]s݇K7q퍧Eܱ/'?gVs7`"OD-sQ{Qb2i*y"+/.؎C^ZM)le i|!*ĜEBHNbAOia)t,J=f8ڥN*b2C,_n+C?~i`=^xk]:kgoiӦ.mHR$N$$*(*R&2FjTl.mZ,L۷"Wܴ^ut=u"d2ƾ~_+1 yNр1|i03@-And'T" ;zb P= fF7" ()9Z2e2quZ[sF-6X~|7 o%٦iu`Ÿ72||%<P+~.-L)&hiBI2YDҁ A87Ψ@i#n!NLڄt>ƈ gi}cfuLX t%JRC@X1oP%K#: ֫KS&__[ݮN poɺG\5u|֘Ym:x/COkmW-~^wυ, Mwb.YD$}o$\?*n+:TrdZx' > stream xXmO8ίTښ7E:n*$-­IM#M3mJ),']Pex晗XS˱?5dȋފ#6 k:V:nt&}߷y'Hqx_4Ty9$y)E)s?6s2|IkJv<>z@+\6tb~8%4K'%2}ˆymnogȚB9?wn4e;eԌ+2TubIr1-54zoА b1w@2f[~W: o(3!i*A񡕌[9>?狪V4r^H\|Ld/*וt(68|TʗP3F 9y-Q gݢXQ=h+gS Ak#Dx٠eR4;xW^Nhj]ZȪsQ Y9Pg"щ] ۵\fǵsJ.s >Wwf]Gr4jV%PW5^fޥcz3aȇK^ۑWbAx#0-+SĽ? Y]ʄ]yZYmQ0> q#<0$? =dZU"*ڌ$ * -'*sۖCv/Y{,zAco*ń\ 1p6%?!4aTEG0nEgd\ؕ"d$\xpXB =ȸzEwXPEuh5G`=04q{EU]BX,iDsTCń!йA!nxɍ @RYEUXw[c[ l]"L*" ĹN_ ŭS:DD^^Em :mOPc1Câ.-xmC_5z/V/.Gt뚡y5aofoi3qdzbG4E4tY'cl/hY]W 1"M+HGa䮮!y[ħ~g8⋯ EA䂚UO-|X7PBw7wALK`^8f(Ǝr82:e(э!86=w)NJ5psBJj1go:ZqV?tj/:Kp endstream endobj 1879 0 obj << /Length 1998 /Filter /FlateDecode >> stream xXK6ϯf-#mF[ dLA!2ִ,9zd@~|XEٲXldX*ʞflwo;Lzg>BgJ[n8K,WD󅔎oسj8vE]h8!ٞ-)"Gwn|:ecQpZfZwx.he7̵Ҫ-Q2k'^+ZnQ:sm+1_xc--GC]5ՍoBF)EdcU |'.Ù{"M&PGBg}cB/"SDWUfj}t4b<#kK6zK7{> *[|Z_K팫칀tщ8PNN,IZ-I0Y-U$0Na\%i>alSG- (7e#>nchڙI+j)%&U;G)m`Ր:ˬKK]f;dAdyXY6 HLDj~m{BP`pYIo&CH̑ & ?O#Q a3_: x"" sh?'D3z3z^^sF)#іQ "ڿ3DIqmU?CZ\JaE!%,zWf>u$yֱ!`b^7<}h6GpsuQAXiiyK^uP\C.Z qr8vq)Bņʕ!tf+yp ~OG@ Z [T񮨏k&ѝ@!늼%ٺSj!xO#v#.ʟmѨ+h +{j]|Y*hMfBX01TwqPP>o;s<,jTmm/3<ðHDŕ i[VuLɖTG瓦kq/\:X)'Ti;}A7 o5NdE>9QC}rm )J vgŽq0N!y#E)hht)H\޾} (#p@ 8uc62m}Qݵ럒勒m2;(Ս-Wg牾b}MtaBUVFUUY4TJK_天BEӀ]=vk [%qq߰-sS%aҁ7<rc=RYgHҐ|mgͅ!}A? xd冄m08@mj1i@ Um[Fi-ՙp> stream xXK6r+zY u7-v")ZmuelwCnCzp8Aưrqn`,Fc[h|r4s];.Һ_heU?Xdi߲^մBbëU=ϧ|6.igt:z |ϟV٦)AfT\hEߚeg)A{l Zs]B$UZˣ.|1EZںP.öthW݃[1mszndJŖ 2ZDApʼnrO?y2;f}!+=ߡĚdEzDs]ɡȱB';^o؍Tƞ#KS"YA,w)ck4}|5<$nXo2Oy<ϬxΙำwlhJQ61S2?8uIDG ុK 3^{-;&ԯ"Pì5gS2Fpe5BmQm "gG)_ΕlÞh|yGKq(M]Qp%›؀kf(t)؎c}i&?D n G:KPn-E/:YH-I弖zm&ve,0I866E` R<' $U!i~Lk؆ @?iU2#F\շ3@qzgQw' A ?Չrm*ʼd ˉq? $A9{V1?_P;~f~ꉶ&r?+Ӳ@)i;0T^<H)wY_THXAEjB/QDUw;%V $ !% ܿ4HI0 ?txCqZp@'Dφm<)?`( FuSlWJB^6z*yU6LO,k:<^;<`Oq}-BlRoZA' hû,m&}H h` =,_- j^(IyGbYT "&g$iHʗY!~rOÀ#ɿa 2w "' dKl$9) ZT#J4+6Rf@ՕDmė2 C b2G-۫o!bpز/2R/)78 E endstream endobj 1895 0 obj << /Length 1986 /Filter /FlateDecode >> stream xkSF;+z iC TLV#K$Cޞd @6|}>=h[7˷T1^8F5U3^>)^؆DydqԪ`Y{mKg,xq/옕Uq!st^OjG%:%"5]\=vc‡L]Ħ ΟokvHaeH*p4f3=U%-e sˤuUiSCY 9q[Ћr DtiKMǴ0 Y(ĵ C P3M$Y.c۬Qcɓ|Bʗ/_<*YAaT°ER~e؈lfȈF6 ~H;Rp<4%>׬P+q /T{va@ʳi"ք稨%UH%ԕcB= Px}1(ø#`U6;K1<e1+by y yk)E&y!76Jh.ky?,URy^# iYWxfS~2 ĉ{)hRsIrr-"G7*(t1c׼#)0=4 |a0p_#oF0`_ ]B Ń 8)ч@*@!~8&F4#Ĝ b> P"'PG)rAA?,Ѐ)r-h @AyAD_"ħ‰>!705kzIAخ ktѪ?<:|ӫ˫E 8pqx dG*H<~)>){Η|Hܭzc7ב&uNiu:suԽCu5qZ$]dnl(cSvܴFY..kqeg,EI]"Μ}%R. P?Ъ,Md(oSƘ$n &҈E Z?|K/@+C*~㛌TVB|ӁGRv0hbڣE$ ~ry͗p7iwGaӟ@|o~u%55Ӂe .up`:5k^ɇ Djjoo!?ee2_V0mujn (42 endstream endobj 1899 0 obj << /Length 1477 /Filter /FlateDecode >> stream xXmo6_!dEY *ӪbkEVJTl;-^ [>D䉼{'&2l#9d Y8Ƙ;ٖ΍Ҹ4] ٓ)Bo.&giݕ))z2u˜^y7yv<4"+ 'A9#s>LEw,fۉb)I_td Ӧ'{,в0C(P% }}A&snd4Drn۷Y5EKwHĻ}q;3-9DPd[<D3 t55GHfhф=r]•ȣ/sׄ9m]|:91."PVHegYS6N%k+,w9w"d&0ɴ _\-)8țu@|ӑ 4m% R"!ve ہ/! ~[uv]XuYYuV,I>.-SViɀaY>Kߏ)245c '! @dyU/5mloMTwHQv-je<+tCu͔></6OB`/SnϿ%NYa T#s"*3K)>Xpex[ȐrYޝ,O ^]^{6j0(frr@Jo&/oI~ݦD "^EZwgbkP}|?z7(Q* 3#+Cy$> stream xZmo_/ b[ 'p5дm #8SeޭNio~Yr8>ژ2Ɯu^draIVEA*1IéK+?҂$yR2|bl.c"o1N$:esȲ"+zEi"f#(\IQIx+EsPSΕى(>\HɗA5@i/)vE7ʊ9JJe q8jx>#Lw 9<8&\p{gYLBW/USeDC*yFe@4^E"hEY[0.h Ť1*_ǡb"p3bSn+'MOc0%!M#Fr OblM2 eG+R>5Ʋ ̩9[KT6dZRCAVZr_WDSdqvWZUO&::?^7wOI=mp͛o׶\T/R&&clXv8skk rOᡪT髩ogٲkHPcۼYُh-'ﴜaFgX17RVR=9<,3TOf:__>ߞ-B5ws=E=Ϫ? N.[٬7Egsq3Y~G \VEj9_DMN>Uf<8t:=e DfVM{3p: pHAB:ՁuY&ͷ&kODx2lm6ӝ)[Fl`:*haMjE8Ig/|4k{U0o%0ꥪHlhv!a$p dY0u1x&˳]_ y 1Jb>X^<}Wzi8Ϙ,B`/D|X/VR4Tj@؊Y`A`ّ&.J)|jpmۆo+B*p F7-jZ8 6Emqs17z2IsT0z^/iGtٜqqB&2RDpLQwlB,% @̞ٗL_4 yTŰ:,lSt[xVO3*XVm#x endstream endobj 1905 0 obj << /Length 2195 /Filter /FlateDecode >> stream xڵXm6ȗq1+z=Q{iH@kkjmi#3RdimÚÇ3 gw3{\",7[|1lϖ{k9_µC?˥/屖#-m O<d Y xB< !BD FޔZ퓉퓉퓑퓱-VOG ؐh?6$z;}?r xB< !B4!?!DK $ dW&V2vq3b@L1FAē ,_b D4B9qK$ ӌ!S;AbȆJ@nj 7TJ.LCxB<!y!M@Q%V_TJ N@$ Q_N߼:wX8DBmH.:`GXlkh6Y v[ԇUy-pÚ\5kZeTϾ֝ߒ J6աݲ)I.{+*>z(sYTh4js3f/G)?56c5$Or]_CuA;iې:ӪytKzqry|{pCZdgkDDS:@,)ڤqd}Z)'Kwgj7'߳USR IgJܳV.\+I}tDet&[#C+p1<*]4Viz:[LCc*IPZt`p 6_8n›WԄ(wP1wYZSFYd^O[ Xɾ4$Xg:I댆Hk*=Y:g]cӷnL8 IMZhs 2MNBsgKe  dVAVn7)͡z4I'D ,]7:^>Ơ8!Ȧ)͵mKV^B*/޸䭋!wiEIVèh{z b>s ;͚ӺeX S%੖QȢ9^طcRZujtrvdn vZ؀5SǠNJ?`>䵺+Mm/Bw7^٤iQ7?!˝s^q!YQ(H+bL5?m}n}WZ[^}Bv3>s Lx y8[gkd .@k;{w'#~T@Ӄ.W RH|p=Ptm zTX /jc"lKk@XE,*Dzݩ+q 石kЍ p 7% Sqaà *q W l`xKȑ9svvLxQ!M h(S> d{e&,[]i*(o&3oZO%/!?)ByޱޕO=N_`DA"@$^#DhU YuW%HeR}ƃ)9Rs|Tؙ$ U-f<6?AAн ij&%ݕuC-MR}AfH5ML~ߛEЬ*Xx+4-: w컦.%+lʑt_yP (c8pDgfalz#A%1 TAEm0:ā*߯D੯#!snrG-x2;` 7lP_E.Ѭ9գ&xqj}n}>?ujZ> stream xڭXێH}xG4_`f! Ҳ rNKnoUWcg!SʶG=]غ}>x2%, p4_%?^4Fj<<Ϻۦzr~&/ڠzl?$՟={Z<֡ӧ팫l_22 rzGQHkmQ՚Fe))Z'-pz0Ile] j]&* AԢ[oǎzY2ύUb5zEkvb)EY\܉9>Ov`/=P檵;䟏7%:<6QZqdR\~hb ݉,ޮ*"ӲR3UB"Z"Òt{M5VqR, {2*6)#$}@Gړ~hkjnDCeKaj޵SJkߨ;Vtߏ:AL;  X'(n'4Z̲wĤ0m q ŦKU')aF'!pXt ~2Ȏ&KU˿K^ԢCtj5qm1z9jR ^ `O7 xo#fa-ko*H8-܂C Th-PbT4ps>3z Uu.F&=dL8DXs5NПz6(joaM iʦ*RaZԼjk1tmPMd0 ^S|(pډgn2TcgGGÙ:]EFвyYkT| _ {Ԕh'C` ^UUVOH%x傾U*ž Um4`Xi]MzgP1o+t۩&DW bqQT\uF?a:>f~QB꘭%k^3*XWvċſMw endstream endobj 1916 0 obj << /Length 1739 /Filter /FlateDecode >> stream xڽko6{~/րp؀eڢP$V#D%-[uC'b`f_<%,`0D=orn8g\-E5k=JFNhm / Z-{ mQ6IYڈ25f4HaSZv<*Hʅ~}5>ʼn sO[4sK|d;jTrSϠ2cY;_m߾M|6Llfl2zlrdLV7Mj ?^g8>Ϛ鏳Ub%#ໍ܋-薉V@Ae`t tS~#!|*tTD)nd2Ob/nM 1s\ޢ=#}Rn阿,;?9RuYE+R@}Xn2պ+Q}kG{aKYC xq7zTԤ-y9s ,cei\xݧ7B牱:E|IbyrY&Ն@gQZo4v8P몯VU^.h-ǭt"{.99w:jߠyƺ܈U˼l``Gkgf2qAf;3Ʈ+z)2ڋ,WdqW]i `NTO?4CR9AmzC+%7SCIV"Ʋ,6}FPl"ቐ$yqHKфY*lb1 ٕA7eq*YS;6[N=8?W hiRԒN{I g\=N\ l _ڬYbXFJaTRb.~:ۃj1ş2hr:GwK pze<+C3G@H9E'^āgO-9Qό=3pW ҴHjs"o! IjxD29["|/8*4UMuSb6Z@d4TXWxkx5 *F01=BރrB- PV`jpn`UrGIP5kFeaMMe%€Hv VjaTف8U׽ԋaZ8%nAxH*Z CP%=g ip][M.V-!8ϋ"F׏tnx .EIAOwph +ѭQa*E)KZf@Lyv@ :Ѓ&imb!*=m1^] siݭ6ɦ4Vb|E=|L+M2#sbmS5i˳5=fICgX:Q >Ќ>Up|(XhQzy4%;5+]\[=kdkBHg-oStkRLbmEԃW΅yYSr _gt*8C.|٥*"~SD[t9M:1N'#sV&'S u^hl;"STLբ'=s锽<~ʞ n9N11vXk endstream endobj 1921 0 obj << /Length 1752 /Filter /FlateDecode >> stream xko6{~/XE=BR{-3=\INGٖ#;-Hgr` 3Kӳ篂Ah ׃3C2-gQr3;7Q%!(J[]Xh!+Lfr>p738YZ3'<Էlx UZ#87"A즽1/{kd%p6-=3-wȬ)ʻW\ 13tczOιq$PURѴu1Q2|$r5}!T~[+;Ȥپthb 6ŋ jQ˾ZuN_ls-gI?GJT"idjng h&ed.#{ߣM%:ҹ} 1ȴ|%:Jm=齧ixAB WZԿ gxeüUH:e[HeJ)i"晆0bNлuYP~zjM02뚜هGbчpW3-[.Ioo۵ֺ>KoTI[%D=97u~bCOU7@-)sIdTe] BEL?t*LjZ~k-%D%!qN/v&p|c+k֠Z8n̄jϙakZ~";f+"IZn댢=8OZ3sr:j\'NЉOL cP. T<˪ ÿu跛[cj=i7}/82_WeNP IuYv[ݐ s\=n珓mx~E>Йœi> stream xڕYKs6WrTY郫lVRڃErfq1֪p(l_4@hx;/]歊=8Vwb ->?Pvkm"?u/Z +:LE"CZ@#dž?˼xmkR!C]K)(v+ |l_/6/O fhfM. ESj34JDq&ZkbKIvFյn{KRMC2ƮPL!ۉ*J ^v k O!mOAd=$toi")20iE|D熖~)TÞypV Vhu۷@6F(\،tk=2Bs6BHF0ZW,NS}UlkYo L >y ~v[\툝V6lڪВhr 6ึfp^_5+,!߸R?nuҘ7Mvk;(}u$`3[;H1mhh+JQ0@(~9TllO1Ɍ8Úl>EX 8c*7ݐQPԝY AGخv ϪXGCfsEK};k-_U o]1@9©8WJ /cxiIݿMxga؜p/>40uR$X ZKD >k%r}EzَV y[|Ț2jþmDn7gۙo` %mRU7,n`k> Z=A|sUPIHEx_W 8 V=ةO hއ9+1\DU%AevUlg[=5g5zN lfʁtUaЇuq]Vi޼j45)t6 }gOQa6!gZ6%CKv/tsDXy˷Ɋ_~FOwlDxKba 9udjϰS > stream xXݏ4_Jn8_N:N Z6%lߙjOv{w>j  nK:!d+wQ4UlaU׌kq 8/of<8l9U eX( rAU}!pUc1h`B! xy-L = F-4yW:pѺ_)Q̸Hd=2BK"56A sHw%P{(r6TdPڐȞ۠68Ϣrb}h)K)P0XIS Y fh0 } S̍(ՑzղM$1;\ouYj=Rϟ%y*#GλrqTv-0#c>5҄;pygKlQI&I'Y,b\{ܾոu:L\tU7m~ѫa:CH/Ջa`pm.7K=u} |-\L[\f) *XU7N@#R<3V'p+'SVE3H6E-apߕyCDƸӞtt3ܙq\g94&Ծzm@"ƗVj*Fm_K[sAQ *z\&#N{ Bv:w wza"֟#ܖ`%x"Ol$͌󂞦pk9])}j<#Đ2-Lࡃ6 䵑6ͫn%)ZH~2b2 Y[ͩk{dzp O܇2|/lPN}'$ёhn-`O/Ē[`C*K6@&w{P.04*B$?.sˆ_-+"kA? 1ďhvAt|;ᶴ)Zm# r#.*f2_2N?(<q>{3&UE!KUuXq'XGVQm]Oݍ WgH@\?,iJ@L2לg.U56<&TJ6wXoϫqkGiTĎ}ke &KY^C[2I/`ճߜRu4&ΌcCRwȒXp-~i?mc/g瓍z K..}1ٟh endstream endobj 1947 0 obj << /Length 2279 /Filter /FlateDecode >> stream xڽXo8Bȗ@̥-.rݭ"E(GSc{pHYKp8|p8wnqӾ[>u2~,VN, ȝ ߓ4pV7iyjHf2WB-4,V*ZҨ;Utr~68SѧNWÝY.P(A'jD~n'(#Dk%yXO5+ai;ScY(@0Aш⚪NꊦQ7% Gmוh}'˥,IEh@]f]uENU٣'}=WѶ2+ڊΉ5lp*{RP@Fr"Z\5ˮiP4dJbke擧 5PyCz}Fqmb$:F:o2W*U%?z񁳪;Opbxs/,,:e=rC_z vka bAFQߘyp4@: ΈGGeԱ `a] +@\-x%(A$e7^YjVgQ?ղF.ej{\*1>$yCB4w*7N aV7Wn^y(J0Ma+}+:GA)NBiW439R/fR u Z-f ~? g XQWe#})a耇B/p`&g#Dcl+~Tyx) $O wrw ڛD7'3*ř#Yj>lyB**\\>#\ h.Ё#) nK-<zsjNp۾V T3Rk0҃}E\}VyG9'5}{XҤ.|#<ۿ'R"~Lh-^Nt4"3Ϗ0bOzH*쁬̓\:yř7^MC./.x@}AqW+Z]{AsL({#KYuGh@K%&YN/dG^ⷖRdE_SaE*mIkQ8Mgyw]g`nVX@o"gPCϜXSï.=tNtGqa.dh%DC<_g7K`$C NHl & o "*sH_{CKv^% l0Rbk} GWd XwZK-xgxp,h7/Xˎ endstream endobj 1954 0 obj << /Length 2323 /Filter /FlateDecode >> stream xڽko8{~_"VGpm6nk^%E\QN gȉp"9狓^Ni:^Ne΢r>3=FyOm8R4R@,'0s "<"u cNDP*ZjW7eד b32GkI jS_z4@rV5k<;)~xLa^$$}E"xM༆sؖDkGU4[ x\Lh8a1|f^Dsg 򊬰)$(ʧd؋` Z{4cwa$|mښVIl #籌+d,@yq#B 2|` ,,gXal$ZI]"vԮWmLK~+Y+a`;=a=m)Jd]tvZZ~oYmxe> E`G T [qcgp3PNyGƄѕڞEvkچaʮd!?hh<kvVw"F60<i*j;(bmV.K9W-vrci"!G?CkAjo\p ZxJ'WՒ&=a3qIvkW3BŌ`it"w%TW39B5*7ii4C-?͌x8DR|H -XV ZE0&K) JaicDG+P)hFoǞ5AG}'ʞ&0~Ό°_L)e2CXTɫwĀܙ< H3Uc48$v&hc' d @*9sX\ C iHdk/<8GL0@bZ56Q ̴[QIgE aTEs XVL0DAѱU4:[ ՜}\Qc SMYS)c[&jw7Camߘ @+*n㇒]ں2%Տ@m fRN$(!)[N^-N)NSh@ 4ȝr{TF;u"/rߩ <8-N /H C*m|?Ƀ[/CJ|/¨d8μ,;TI&LKziBs,,P6`GYv"Zgl'6JRl&VAs1uS=tOVT!]B亚NҝLE\8cxot*UWB1|A0433c/p' ,}Qs$O@N$uhǫj4z_y h?7Pf;pOrv07)H&M&XsEYlYEC4 1^}z8]Ql:ʋQ013dљ^*+5/8$9*_Nl3\E\YFO=w7M|zF$X@u>Ɂ`pp%!#j ˪jkƃnӧh[?{;3(–  evz4g_~x[KC!AA񏯤#>e0>wA=8 C ݹ~ ~~"tc?‰0:aH=lP)Hvȶ&\Q Rh1%!'^5pJݪjoF`C$^Pml7ezI)NE9\-LA K, oS?C+~ʚC`h!4o@8)Ü2d߷؀\_Z m;O$aQ=w%_00$8$(i U endstream endobj 1962 0 obj << /Length 2092 /Filter /FlateDecode >> stream xڵXmo8_ae fEk?p&nC[,hy%W7 ,Y{kP<3mGfqKG)K#/-6e͛7iN)WEfZ~|[ 4 n1nq73g|XaV3ZcNK=Ga69ј, K}RgرsY^KeyV^ԏDJڽQ+ȟ(D 3|\N l;(rxdjP55*YҤ}QԧC96!_bCfYv or/lBVVQ\׌m mgHWe dYj||$sMNDQp}/f3c?Ѱ.D9.JJX8mQ@x| fTSI!!DğUָ~rUO.˩[,1ӃmN4M"3 pR|{"s@,$EBҦRIHrl%-T*PL$b]-'vV6N~ ]I&Ij wh"ހ :[w0dԜ9'}I(asgƓjV&Jls=TVAt* F*tAثƢ܊\CUU Ve7 ;RIb_@,MuV ǧ@- '/ʃSoGIF/\Q5Xgt_ZeƵf4+4!h]".NOMOXA3~'[[zVݽ*ڞU|vNG@(X ~ij*1`;ִ2Q ø|"F;- ']ܤwNg9 Һ"c8:9&2BƪmNvڸ"'HۧwnWs[RC(|gmhl!8%V+̴ >wC>' +ZiLC˧c]ժ~TUjoWlwMfʠ3joΩd4|S+d >`Q\$uF j\ǪW-6.aH]g$# 5Q&1ydL0 |IcJؚ YܳvD , ~ڳIcW?^|+5沒 (#4QWp>է)Rv'p_OC^eXodagl9B  t `V0M _2e ޠL0S%RkD݁Rn .zi3?z(D9Qx`!tiJwq)ʧ,}+]*hmEܰC; U9֑ݪ)j@B V(Wȃ))K~az7| endstream endobj 1966 0 obj << /Length 3141 /Filter /FlateDecode >> stream xڵY[~_!e)93, "7OqPsmyz?s^$yE͕gf;G~NW7W/tvusJ*UQtuS~ ~mtx\oqn~?~&}hPgD7o ltл/Pytݶ} {fAz=U1HɆn;2BѪ_q]~MqhB05peHCd"3$IC3E#CJwE@bPZvHZxCM_c H^j} O]a|z0-<&ՇYqzE_IS`P=U}*SeՄQIK:&9J/?H׷'WddՒ_5T⚎<V$p$E}F0i| wĂnݺRlQgpC'Лu3xw_6POzwMs@*5 nY_yA&B.٫9KJm. ?إD15Rn9J'+EDAuf$Z{ljCHP5ÞoP)rE})@=2EjTZժJrXׂıƌTf(:, ;a&aA{c>%1qe 0e,uKuf*`cCĥb> Z)W5 ?,X4ISp1F8qy!LdžuI%ԣ <nK^\&=*z`_'"gU(@H胈61ڪPң HoipJn]t2[CeݖQ%s  _g.lbWS>B= [C`cK[,nZt-|gbZz!H?5]ʼnG߁FY=M3 M3Y.E,SwV!,"9"TtnOg&2XgN#%E''Q5@$v0M5(EhWO;L/yNS1*qr`8f$V/NgaVXE)oJh΋0~)F@'j Y \~ZOcfW,m3M:~V#}_@gD7yMAAğџ<Ù#mBWm񐧸rWIB";5ch,:d> stream xڕZY~ׯ< ,!)MISDZ :>}  g .v)xe_QzqȢ, .7?{ʏȏW0LHܯq8 m/|6\܏]Uz۲Jݭ_Em{WönkvZZ*5[0T%v\pFivܸ3^N{iܫpN֩[چǵT^#nIg z]3xnrۆ;oL[{nQ+CN7i`:]2 yCLZ,#`n̒:0]8Rb-ޮ@ڎMeSKlPG^`v{ⓇnZ&4 Vv03xl>ilŲ;~'M,0 (<8z7pry6teWf{vV 9_a#Н2 BQ]#G{dd%[uXc= o@}bȽl?2ҙc=Xv(cY ^{^׷\;D4jmGPX&r#yJՂHPna7f.8UŸ4z1T7dd墈=ݱq%YrV* Pe[UX8@bA\Vs ¨ :hc53)Iq~.k|B#/:*'hu8Ȅ^2(D"-W#B[p.kUJ-"X\ߎ +Na1qK$B}9qfrFNUpeep B OF VvX g*J0Dzn "bN ?jSuqLR$y駪fG'Ռ/ /hچGY#R@",ձY8-Z'ITp`ufLb0…ͿCB~:V8<@,QGYJrD&$gͮ1qb2!ٙ'BgNHQz:|ZJ,YWzKlp-x*$8z€zaَ[ DM K3lSIqhe; ?G+$ Pdbij{L2*-+cWRS $ <)\J%'JfZ`1~.i% 壣bͱxjOVN54ba*  fȍgo) c;N + Xg7 `G܃R~_tYj|[#TF$Qhjlg$X }?l7TIH}ge=>Sg \}59\sɠ=}a|{rh7lUaP|ӫH`G:ަtXBxNb5YC\ug40{V,|)>(mv5X@bߟ$Zd ]5"kЏyߵ'\Q챼A[/.ߚFbkvN˶<̔!sf[7rH5#=SIj@0ğ?Hzad۵]+pۢEb[kW!}%6_.'!6ڏ L? Y\Zo4:dt׺7q~K)ash\-T62 H=߽( 4SiB#%-=l{`YH ft XlvqEf9z4s~߯,)HE5&Ӈ>v~]ٷՄC,8/4Œx蘸`~/xLY&u2BP`QiBa<7X" u/E $TYO@RBz9ʧyS!w'!s3"9w6I_;OC]kbʳܒ̔c6X|O ,K2jǩ,HJ[phL%h?̰b-)!K0 <Ƈϯph_r> stream xڥWێ6}W8_$@Sd-MKm6cYtE*;!eK4ۼh8 g($8MTJ̢lt(?|{xF}i!k_i?$ 2MIׅ;} fgwۈZg +8ZB+/ ;ir_BT-^7&~$IaЂxG'[eLGg%Z9+-w$܎'AAЌޗV~웽 J`#x jIXzzŭupfeUeŪmgS+R s0^4ȝ9O]u#}dBlڭ "U֌CʺVL;̓=.N"Nj1+]'! -Ouل)!-kW$Yb`; `SQ *-bqxaJzB3#ӛ5iH4<8wjҶD$-FXi8o6=>ljUmq`E51;2>X@2dCpgsA?:<0uO3 U5TXN2 :SЕ^{ oX5è,7y+uΒE};Y`/?Ogy] Բ3F*+1B~es8 sjTLŮA5gk(3 jCܻW*Z5M\eytJ 8N)a5WR;P@ΆuM#*J%ۺ>uP4=B$*_J6_A8r iS3gJ -Li{zxtp(_zz4;Pmq;TN22di6/sll'(yґ=[MS,;DmϴTeD,a2ůyk% $M~f“=Mbi:$c44>b y VjcIbzCEpL䬄%8]&I3GP;RGB##M_z=-Ab%JޞԆ@*19BAE &@aW\cСm ]02"+.|#Q tlc؀P8L84UӦ5Y(*Yo Ê#6w=[6gM-a ٬KBnPmLqn 6YY#?4Y4rC#hFo5oAm ;3}Wtpu H0+˞z}Ł0E%8\EQX\z+^?kG endstream endobj 1983 0 obj << /Length 1776 /Filter /FlateDecode >> stream xڵ]oH=EbkHDhԻ+/X)؜mٙ5@K3޸Y \^Ggon$hQ^GIW&;۷^δ(i.5mRr"V]v?~ =)EJy~5*_91Veן=UwshA"f_؋"fLNRO/`#1-b],wu\䗞Ŀ:ΛCo]z*RJz{e*V2{d&q DLeLL,jP\5ABi>A@lX,4B\qO m'}9IyJvih:ϊEL4U^nb\|K7EMqb+hi@|. ۂUIoyJ16gs _pj\fҤnEa]qZ%^x#&~}s7!׃hvr^0 C=xI`4;U]xj£~v@0@^lظ ˦KijZ8r5TgvYg;3Gl] 7ߋBQ;y'b?v&p $yVp;YPTn M?B/0^M4RZEY;sӻig@ٳk&Nx)ccDb@1eDUX; (lכ9c\5P@ u3e!0]p3.dbymL"!dlΆ8lxM5a}1_FvӡZxhMx t2r%vMg91>sT G⽉^fx5ݹ? `8}?2h@?_D@Qp~P5\Uڻ B;783\cޜ3'GȡI5Għ -- "3Mxe| 33|MǜÈhR((Lvzn()ҒœƘ1+<禕U0!b}wֺ|Ilgn6_in8m~^m29¬eÈ xMi2h7P$6`|qtAaMN4!T3M#ԗ} `c2Dme,uUm'p[0;> stream xڥYYs~ϯ2Ph/*JxLrH,P"$%͏gSy|gAmzzoLgMgؚefoyf3tMb{߷5{04 Z"E9sch ao ڊb0]q;`&/DUbŝ*S/5@'ekP),J{]i_ߧIU? L}wS C Qd2CRmn)v_NmHğuܟ~X/'5 /D)2Hj+,O2~{"Ums9ϏXfp$l_s8F/cUu!et0Ͱ 1Ndj03e*Q Puภ=Mu^.@t?"j R"I="+u?4,O, x'W- lx%t[G`?^j r OGIkZ銻=<ŬB OF~:0gJ:ʂΤhkje%O fATi.X:,rԢ([upNDQ>.hpJPC ,hv?J[V?&6G~c Vciޜ+1Yq4؄pp v5#ht4=~EVu0,E\l=>8"僢XJ*n` j sS9(lqQΔ{lpRxᅰ[oJ0Ŵ 0-cF3َfѽ>%WIX܅ (SN֏NGEu# bs0gGt*Ch[a(&= ҝbHiȳñ{Æut?pe!#jYU \)!ӣ\OBTcz" G? YI1MӬ,!U!ź%gӶ,b+Rd dh[ATEVDlWR3_<ƱINV%slUEHbM5kWX<ZTOr++X1 4MKPųqmn endstream endobj 1995 0 obj << /Length 1481 /Filter /FlateDecode >> stream xks6 &_ ӠvɌCiq;s0PclbwG}W^@_ZV}h2Z0x}xۊ-%mxZ * iO]Oʣ!8+Sp4՛E Zjxp<(Wop]Gּy"|Dm2 C ay0>$dCϥv 7,˫R閂gIZͶ e,;/-SO#ɺ.~Ḻ'?eK V9z*L5J7{[|&ǖty"FXZ]{{^j_a|JLT+߸ /WO_p`W쳯اl1h[Mw"(ǭx endstream endobj 2000 0 obj << /Length 1596 /Filter /FlateDecode >> stream xX[o6~ϯp"cJݥ`MP![V]J ;!} ذÏ939rNb'vFNv"ċ:sou{X9-?d\)29݇s; <Ҷ|ȞT4!rUۉwz.#"~in< {-:V9@EZ@tu#QD/(BiIq)-3\-%ը3^[uCx7^]ޑ`q~dh%x*<ȎmLX)<xZSDPW| K-vﻧ~`6ifVzZTN\g[>il2^ ~Ot| Zݼ;u05|C+̒/w6XV/5LI?^V{{Sr\s^29?#'<χDAvjVf%K7HW ㏆}`S <ީEe(qq< f0G0b =n> stream xXo6BX̊*ZEc1Yr$9n(EvÀ:ўsxwzvO9N=3˜ ˗InTyYe,SF@UպВkU7&Jw"7=fcWbD=z3;x3}O--F˜Ɨ_ Y{+]4)(4kU\fCc8, L|"wJ'B@"5;sk'΅YlN+Ȏ8 u2D٘s}n'/rUMۥď]pswDFY޲(FsAsv *% N}ndIn=G %2Bk $Q9Cup\Uf}| x.Y&$HyA2,5;oM аO >3.N|N?-7pK?r Bfզ?lpR9 vZIBS^+nuMk}gc'vxUx2DG"bA1R6$L[} c$5` Sogӝ~0H.Wդ̙,S))lbWJ6JT{| S]ߍ13ZfV4ybZ9yMݨ tT0).[i3lCs"poFqo=5B"Usd)fs$|-`6A !k0kox=C/jG(ʦ7ڪ'i㹂8ĝ.U9(|x_ <.\8Cqϟx>$Cn.6U; =3l{UrQ+^pHn;}(bj9̠Zʔ\'l!vdFONV0<=yhؖV8M WAۂ%}zb^V*D~tyH ?f!E2D$Wf`ɰ/|8Cߊt Z_D]堣|HGOzʖcYs~Ki~? Bg;Y|}=n E=> stream xZ[o[~</@.6@[,hk㨉 J|">E7<$!)Z@|S J`3ZP<Šc! 9s lOj(꧐ MlXl!oN)r#H5.mLQr@k[9H0,q s-puM ɠ!$9Y,$8;r_EA89UA+C,&9 ISPT\$ 8v)w)k)@Uʹ!A]5+GkМ1'0EI}aaC^-&hg80 {}ۥea[jڏr"Z qlN?K! `0s>옥A+@=[W9- sN}bnj1sF V5 -]r()9%^V;]1𧰫tS@¥ˮDXrWS\*+*myH 55g<$ &V!; PŵjŨ UWC5k5׊pJ8=(ԃÃE8AWD0ŧ|}_t4X0Gmf`ſax'aQ^~^Grgs?X\{r00]?]ͮ)ep mNqkE%E2X5l}5"ľ[b~r<7r#v کӴ0>㴓e*v~" ǟ.?_t0<_]ӛO /$K1'yNƂ,X8 ?_5v/D}zM]NYUcmon DOiHJ?kHK6@bA: Ĵ@mսH% Ѐ (AyD#bvm<&g)EPxyn/Y7e4uw3 e5AHڧ f^નD (ܶIU 4 0&K4Fll 􅮶BCE|@jTo>㇧= ^}X,.8 o痿,> Mͯ;|8ƓY5GE;TTnޑ/_g|?se􇳏?i^hvt55  6@H Z+<] gNJePxڑbo2|k n[hcɛ N`=!<~mh6- eڱʎEm(2e"#"y3GRT[#94)fwb7ݧ®u!*ҋ%?Hc4ٵ k4t[#O-~p/}n+xzM{ fBBE ۨZ1_=2]/fNq_+%o9to}73_7K Йf+X u]*KP/.02cez`jEȺuc4]JQiy=*W͂Հv FEZwК_ О{E&i`O&`~c G"'b@ޒƀɄ-r@iU m{AW 8_zED> stream xW_o8@}IЕMZnQO^u{XuQeކ8| 4t>3C:LȁE|vB'zNzS8ډxy>!7#L5sG4`ǀ;wznx`2r%^`?t{o/DoL?3])'^iѢL`VybF~LXvA{-F\?eNnzURϽ8zhˤLqv2b#0ŸMR4u&*p'Z=u`O#S"G2:F*%dCg9;>Sa31p[wQD[|UB40I<GMI4cx(AEI4ւqY'm._T^f|~fmZ3H\dgW&8s 4=K?x"EQ*%5KSV$+kW%_0=,Ksٳd uvc]K%%~`Mߟ˔e8YgmIj 68uRoglmv߃˚~~e`ܳ "$hŲ!N#ֆȶQʄm} L=ya.DU=M@6k洠 9 ZrI3Vƒ[oݠo@o'56;(4wKn) 'N'@de0!hwVFm=`xW5@8/"Z mh;m2[)iԠh* S_'\$iCsS޵mGKy׵sN Us;}FaC =\Y*[]m턣kݾ?׾qZ1tڸ&tXBo}r<| ͩB^=Uj5+7ix׹#55 Bz&TCBjJUL2 dw&``A=Q> stream xڵXY6~ϯ0*"JU 4E$~)%zF͢3RpoFf7hI'2,8-׳" Kg9(gzG|8h;#2aJGQ]5<.I[͜,qhtCS뻕X54qlD{3^V]Z(ΨtVmuz?۷. 4r-{ PBIX( ?D+%1ՊzuZC'y7[ פxMWh}@%B:'Aׄg1JX$ -$sxI8-b1>hȘݚF:^+XKaZf6F`|l:b`-4MF#*qÈ{_qsqYހ}OzBlyݽE5Μ/0Goo%` aNAƣ"y~eW҅qpR{aynNE x&\fލ9/S!cZ[e2urn61ߘc|FZO`Ȇl* x'$Yt]dc X)vXB׆3qShګ xAdWv=4hzj@Wu/" 4l*ob( j5u4P401hFQC;x8FT vV4#f=D؞+wJV6bJmFt;FitQ7G^wxZukk NۈJ;8>*Q=2.!F va$>tx&Xp">:cfm Q6¹8؉"V@G1V6—"Pkb[82"STP4$Q|[%H[hZJrb'0gqJ Ę!T|⒪}oڵrɇkCchr*m-&QaelZA\y?쬇' !$xL%b~ + >\yE)49XÌG2Qjx"@@ZWkB8 œd$NkN[# 51gocEgr(}L,N^NZP [.5 i6#M&59!&L1Ű+` uB+&T^8߳Zc̦,K`PLے&@m:Q2|DcT,A[YD΢sph!nT37AF|A{(8DOc =6,8{]hNp ;r?¹̞N g X0@o! -D涖>NuZQ^6 H@k0nrPFX>?ԏ'^k|K^| -QA i_~qp(:Pcs_Q, oVWhՍlWvMȃwPT空4^9<Ҍxll{zA=o{0TfQIw?r0vw )lV_'ijYEDb!^A]߻8|o )#FRwZP;qeb =fK`ؕHt @aC?* WGI">~q|eyy6T\=P=*]tpR2e,> stream xڭXK۸W(,Ueac--nv C d*>h"5gj+ F?~1]WweW"ey.j{Xbge\moNbMdJ Ɋx#]mdJ.½hڝhフrX 2z#2zn-$p O`~ja7pmcus_M8iʲN>y+(E8x*<06=TF졯(l>ؙ\t`'U\V!ᶃ)WR&j9"6u 3&:kZ&{m J;r跄72W֙̽T/ (G7;Kc"//" OHwj{Ćmifs8#ԦgmѪ"ET c[6MȎ.37ж+ŋ _Tp~E =UW +un^Ywwuwye]"+Ѣsx.<8]r倅jH/vQ,˒n,%)x6dsmNR"T6ukn<[4S A!}aQB%;D(`QWPN$t1\ l?k:LLWZsI[=v7`Gޗq-U0;~4 PJ~7;$vGP%.[ ^Kf~C$[ZӋ.&-أdWqR@qk53_dKK34m]E&MKTPc ;v}}Ab,s@`&1;1'n8|x0$Η_Őt/ <+9Xt۝w~iR4@`Vu F.]ȅRL 4ҞA4BEEC"@nvv2HdhŢqIYަ1aVBwQc g7`ۨ4vHK`iihũ,NSpŇ)ǡM1/ qd:UT쑪iX ^@縈<7guF=>rxZyRyPRXpKW}k| AC("QIHzwi@hAu1" #(88\s#>W/47^ڦ`DD5yɗ-i*c<8>ܛ衯E b|C;I˨[b0BPݍyBp +]‡;)4fOJI@65Y&BoI3UvCK.}w-ػG3 ~[=(`S-J/hBLaJ'Nl yrL?r7DI 3+$tW%^\6s!eױhBw,ANQ$58#E[1s&&!Cd"#Aq-Rq^AXQ!iZۨ'R@(zS|5i&<=Nvd|CQIy|QQ$bǾEp[K(mܫm/d_@U_HXS0,S[5.EWg`HFp˘7 ^+>n0/&C@*ftg`_K ' ̾~P$l}w6>}9: ώ`@+{F0_0&P&Q>HB *2~]9dSHi*dQU^H_X`ZOegk,쉤=<4+1E>J !ഁB+N~/}*nZj}l<~2{_3*/bLem6 z/UFKQB3kյAt p "d +2S\lin^i 鮮chR;2O k"O ΦX`>\Bȷo(o EMY~|TJrjbb)˂yFe9;8N endstream endobj 2042 0 obj << /Length 2199 /Filter /FlateDecode >> stream xڵX[ۺ~_!( \^t I)zIK ͵yVf}g8,$9E$p8& D,̢(Q.8*M|׵2iʴ1}Y_xWi׵qNnW7l_uS?jkmF"}$gi,J9lלSm;Z]\ͥn+..SVy Gx9[X&YW,v.d{R2}^],,c񮇕5mJKۅqTpTu:?n8\ǫ2ăkڻnL8Zs/x, +dn_砛+8}uW"~yu(T&v\$`5җYMD:׽}}ٟZDR,M(Y]|&*"ʢ^]]hzR8I*AlPģsiTS >v*`Wy?*xWةwl$؍d{"g7wΪyd F__aB2Y$N*M7G]*kIc ѣ 7!kbZڥj6z٬v~…Ìc0{ c|ghR/2Fy8y:fnnçwɽޒWfgꪫ1 D^,DC/s=S 4jZ/G;֫B^c\De p:x;'̡ $y]TWeR;44e=yo}')$_kᦡ=d.Ɂqj,8 T?6ʥw=Bd{<آ(CogD soԳ$svw&\y!en[I YC7WHd\ [k//oM۶am.Y1H1ʰsiuT|;'>s0Ua [.Ap'rzB6 B}2IJ(JՐSh]p]]8U+K*HnY>AA\wl֩(~(N8o֚A'B9 I)GHŜv zBovWUx*菾Fhk3Dͬ~;w"Ul"c8&#, L% y?VA~ h]K4PO?_EVqXۥ ?MSF݉.aw;/ &s)%it(=Bfuk= G`mc>«6X2H (Hv i;li#GB HJRByx+:~;U!BiLt<@sQ2qk=s|XZ܍ CD0E:f-\Kd#MCY|{:T R0;n Ư$7"d6x.IrTơϽЫjp̚=N캢{__ Lf/z1M59nV~hu8|8{䂺l a1C0 j]Bf:Q4DGΤ4W'xeSTseCNFh۔O R$3ɨYNL|Cp-BJn 6ڛƶ).E;u5* BwB@(S@h-~ #9I,-8= C$V6JL U ,Gl܃PC z&hb|frZՔbkШ:cXUSOI!pL# s}& ˧$wCj:%1+p}ЦkOSlEߦ6պ$G?C%dPQ(($?t8Rf^1vpKG|T_B׺_ufoK猾=06R5]pFi(8$l endstream endobj 2049 0 obj << /Length 1944 /Filter /FlateDecode >> stream xڭXm4~Z.qޑWj!Pݰi\<3qe9!]yy9NdB/ޤLd'$EėBd3΂Hzm(̼rCJ=sV;CC-2|%EŠ=_e$OCPqxz4э&ay,ugRCյ:]_Vm5Og2FW*2o;tw/5(EEI,71CkT'KOձ"o)n˵nhVz;=vfk]|ԯ-q\;7}50:tx 1u@{$T%^Gt;`6Ti3-@Jy75Q[k*ڲ; 4TAe%Ra?ךX d]Ts1,R44(w{t4~Z-Oݔ`Rb~\z؝b7Un\1_mu+Lr*}Y83@F po9yG)Ǻ9_.^w.",{bI9A4TbPmm~ 4YK<:Jf"L;*Q qiE >xJ5KK'Ye Ia Dvc@gpsI*d>g9У5;͙I jAYTw^*4E%@X^9'ԉ(Bׯ!`F΢%1Bask$ 2͠%hoMi2Yg~DZPAH踩 boI>e7AG!tt e A᲍FMN^Eݴfmw}OHru,i*Evp uId#T9:J؄myژb~X-Jshjw0wal]^ݡ+?`T6yѓDJHPɔTےR>6J#R#%B3ÅH8Ui1qY:4*)*sN 6L)T6UPiT"Rx?MӐ;*7sN N"nU(t>Wr7IӍ K C[D*\B(uw6-!'001E=&6mc(TjlF>a\53H {\(Z)/i4=H,TÍFCEǘAea;OJrx+__fGEfz]$DEךg!@__Ltgyڑ}Sī7P3_מu&7oWíC1R߈ )*^GWѨksq@(Z7zߜovqQQ>D xڋtpn΋ 4. .:1ҍy̡ғ}ѧýseDЧ'S$c%I VN/5̮@\d\paK̗B|/s*@M_wceI. 8H`,"\t,`| ֱ${a P|??4<{Ґ4ܫ,NFm_kؿUZrV_|(^ 'T2[^]gY55`ki`. vРɉ,r 45 ![S.'kx? eB*h?kJ? T 7 և endstream endobj 2054 0 obj << /Length 1841 /Filter /FlateDecode >> stream xڵko8{/qFȲ-0t57:5Q]('n0IQER|ıVcM}9;z$5[Z"aYuiep<_K1U(/V’$1֒xxa BB~(E/-pE-cq=נ"_ mUW #D^-E 0v' ,iۍ@]T 6vf_yT~x퉺ԭ6kE5Qh*"h$hö^kixz)aNS΁ ֒>.I. 2:ބh4N͕nv-kcwp'wY I-SJ[~ԣ!'./p/%Ҫ8]]_jY(8NO-GNH_K1;,z᮷=[dրd JQԈXn@~)v`|Ԩ!moRV~Zzwu,EzBf40A~5~2#RoT\amG\TfMka$m'GnLѰEDQw'XaOE[9O}d#ا aƯyATQr1 8&ԛFhhp2=0] \p-_ȼF1$m-t$JKD[)C%*_\fLS=D'Յ8ЇɍmIr'@<[]憻*Nm0`bԶŹ o t4.k )Ưݭz[o ;z0\m8ЧmLKQGI/^F?1M._Zo[WfΟQuCSԽ s\p|ؤt_tL< endstream endobj 2060 0 obj << /Length 2024 /Filter /FlateDecode >> stream x]oݿ))Ss4ic4>"W#sߙ!EڼwCk:r՛JDyn8IX ܺo#{JUg תrں9}fD|jbsn^dZ3oaaKyNv []J>%HeX^μȮgkˍΫcc؊_Z<^w.3kSL]nk'6]W$aHuQ"m^l+“Ȫáb ~8`0J y2K1ŜgMBЖϐt=Su*r>N<[ԙhrcK#+:؅ji4B߮UVysMI.wDt:. ݴU'4G _dVu\uhIy߶c{Wod`]^aw.~+X-OSk>R~K=\nw$@#neѼ npyMDY>\'[#ˢg y<2#7 YU \ݥ !?.Tѩc{񔘗p^դGԳD~Z,Ժm} Yel%bkԤZU[luAh6o]?07/bܦvS\XxugALJs*XoytwlUO/]ˣp}NRK?q+Pt;6_fZFvF%2XiۢW|baLZAay"(CFEA!@:u9򖦕e.\7*rF2m!(%ɜDjӑ"{IDt6e)qH~kk#_F172.#u={y;DDckIFi_g/u0mXna72'T Adz0`Bu B{#3Pc4TqH{ ";nrʩ N(" !dJQh:E9[1rd+h]Slx0Bf/`ө&$b ٞ aDZ\Ƙ^b~^plhZ(qpqwX9 ֣C WE|KPK!778Dj.rNt3րZz tL% v-Wt=e@fD9th+<ſHM}J%+3<jӕPCʯ{=([QR3mWII > ~ ]>48ǀdA͐q jlx #xALŻ=xb%E $ ePP ^F#S _LcQ(nbӍD<#FE9rL*l^t$$%׮V 7\GOs .# n9fߪ30a9w>y?LXj>m`9%%_k֞9훮JW_[[Lۀie*LU}F$CPGMKK3qB*jY.&0Swtթ+6㯴s>nI}i"_s~?:}r0'fKt z$~bc,TM=|@ɍ 4d_DcH,E=fKtɒhBF.'φ?!GFIe=4}0=WfjIOk)4'1`g;bh=kb&t2;7˺rɕ,=ur@*.FDP>g endstream endobj 2066 0 obj << /Length 1808 /Filter /FlateDecode >> stream xXmo8 _aK,}ko6:Pؙ_vHQr]v؇DMQxK/;<9#F^*,S|}c&&SE쿙ܗudߨO*g颮DͪVM4ry96 ,zYNQJ! 峮7j< )zSTHj+.-8IL,sJzN#%&$X*9'jAVbL8jZS5:4s1|&!Rs[|`0c!X*'boէZ5B(IJB1F[*9@W/="<;>S p $Lc+eFk㟣iרrvE[ш~SN*14XD{b0 { *fVhosT!1JS'] TDX&`I%W%Mz";<]4`a& `EyPAjCstADŏxOUa3B6+.X.'&ӃUPٍ4з{p6z := /{*F"CtГliMA/7`&yƫ_TR}!k+D׷uUS4hB C$bX$=Vmʣf$Z9y_>,וܼs!ЅʊLjJ)s?~Fzw Vf,3@UbYj,]p\ endstream endobj 2072 0 obj << /Length 2149 /Filter /FlateDecode >> stream xX۸2D=,@nln 49m?]h[];Cp7C"X pśpq["D\%~Z &Hxi+_4ZstZjs$;("V" ;u(,Y̓;5Seح*4 3OQWmVkh+);^e.BRA,2N@51H~\c6B#2 R9%6+' m)mKrKm&+ CZ'Y}E~w][EF8#0r@bs{%WǪ;Lڀjt0N`zfG]DCt(4V_00j+ Py/tmdI=xK (5uh;tt ȁUTn[Y .8Ktv"OU#1BZQink47d(O<:wIZ};*15[HIT$NcBR)Y3F.L_Scr[?QLyA)٠m +/D jD|rg8τ3)I-L(pLm oS?ɀx )Fj4'$n Vgϲîf wWq{\bv'I%Hn?}V]NbJ &7c6hGjԪfbc(Tof{{Ml vUbcx3ŝn hxS`i>ཟ Ոa6#T-I\\b{XNn /`=vܣ[\8c_FsgFLN4{ s?9>RC,x{/@Tt endstream endobj 2082 0 obj << /Length 1695 /Filter /FlateDecode >> stream xڭW[OH~WD*-x=ʖhW"ؓ™I=B9crs^i.>9Ngq:{Y{q' ;qvı;k #\LV̦_GG]Vg%i**bNՌp%l.ױ8bA}ύQDsyPьW9 zviJPjRV+od]*T`]NEVsYpv6p7ȶVKk2Mq5ʙzp[7cʺ5vC-qgo@.yEdz%q2ڽ?Jkh%3`y޷&ŷYȩٌyY۷ 6+^y-uNPnQLbԜa`r^3Yxen5/I efӒW|^B.5yA*bwĎkۈ9.e@-ڍ~Y~Ke{y?iU 6]Js8_p+^n1nX\JN5ts2:j3 E#+UڠZ$~hN5qm k y 1#}T" 0qhoXb\;>ݤY Hϸ5T#I>cռ774S}t3+&xm0ff};M7 lv{`U#P4cdJ1a q"+/zׇIuyYU9dC>^^]6q*,nq U1;dpPu3#W lWUlvנw qb ?\DzcjrƓjq@ 33D4Q!px=@()Fih.c涶7Y۳]R`,oPX09M9yf 0҈MRMA)WَT4?%Wɧs:^%_fxuu~N^=>~|8?;M ĢK4QTڮTZI/HlQ*ebL+pQ3^1*B W=&k~|HU'f}_,GdՈjzAh4ÄcV@a(Yq=:3|rZQU#Lpߌ n <}/ƀjsi iT&i.V,qk<x_h[XD(zšX+h# ZuXCZ or)KAً>,ׅL> stream xڥY[o~ϯP݇Ѐ5]64($(qd͚"^=(YN33gs?gً:*OdXϲDQ4K0-O^B/m.͗7P}󹴫ӸËdC[iyD^9՞azt=SDle\4zE5n\{Zf۴<4ۢ.m}CMoidÅFv49=;^Zy'ӥmV"́mah(X?icH0Cݣs`vE&C \r#=oSu1Th L1ҷ !b`20 ^bLħ`@:&L>'i}kSx,CJN_MxIn4V %0ˢv7AemD$@t駟s\͖) v{ӀrM9㯓Sqf (*>Zu>9U'W^5OP UT~U> @55 e.R+,!>DD?Rr3)jYk;9znޕE'UDOȒ(eC~L2O(DzS8jrx(M;mX3 R ,drIJѸ93HkCD]lꆫ+@q}zEH"k4wY=n/-ǜ~&)<idT Wܟp,[dl\+sL^=*Qkٺ/xƚwGV{au} 2|a+ѓ,iL9SCcGGytɖ.<5I!t8H; ش#%C)5J5 }kY3\y5R xv6qh$ȁ^/-)a6fX;H.&ý+㬞F%dG춨{4s`Y q|yK֞Sqie{,$3$ŘHEꦗm oCL{ &"e0%NBc=K&4?N@EId -]پ86R)\ r5ݗL1 +H锕qE #XjָJP̂ Wa\e8ٛų endstream endobj 2095 0 obj << /Length 1981 /Filter /FlateDecode >> stream xXo6_%2s%YҀX&I(Ȓ>HE5(6`RwGx?ڝ'k/x.I"\LWHN"Mɍ@x›=/tlKG-^kľ e2q7Cfw2b +yf&(&-\Nfi-#g NYkyj5<gs0|]6JĽƚRD^.K! B_/6d+jloUa l hX- f,W`2S2F"o$e?7W o/_x?>wMO(#CC.=Td@<9pmax/NE-G{z \IHO P-[>2 !jj0z #K9%`=7A+A<^դ}8r7O5iL[Ճ$ի&c0* lo8hTVLa:jyۙE3xGjԧNr=[oND昪It (uep^32 j-F:եQR>fsʗiy\im͞_ju޶gnsS֝>!r%5]תL-|ó 8pÖ1pH7ncf8M!F+^_?# endstream endobj 2102 0 obj << /Length 2387 /Filter /FlateDecode >> stream xڭY[o۸~0_8\ISd,٢`,f-K$7?3RlH!05$s= [xyn8> "w96h0Mwt!O殱;]hdz }3e0#^1N( A&,حvV_R9m^`v>lY-9YfRl|ÀkrYuI ~VWD6q!gkߔ x, xLGF1+PՏBIpn(৪K;֜ G>سx~%4W*1N : a$DpXuay#Ԃ% Ȩb27B;kY<;麨 {Vc--4@QҘOD枣Uށg$byFKF鏃m8Ӯ$i:.2d!f%O_Enxe"%MZDXyU_r)/Oh\<_mώu@hxRU׶Xx̰J|CaG)|hwwnvאm`J6[Mvf\cSr ɇ:`FA#kS\MoCK1;̂..x}PqVA)]k0f현koC7:sgEݴҔzӰ 9'STB tDPJ踀 ,8ϐShN}p{.U`M~T<)㴶߉2ƎieȅeYYgO|Vb G-Y&eT@GŻ.NI-N[Iރ2ŭ~ЍqM9AE #hy+!X e۱*6;~#YPJ\Q }$+YK\oiB+ifV֛Zzۇ{WtrjLgg&Q"DQg[M4U"]'R_w],J8H~@ "V*|9z;WDklR)l+JpYǃ1Yℭ{qBkZfaz$7uXnRٿw'5\|ê R*->ՈX魺اx<//`t rrydqu/@ h」+y%}oZ!;mNQ|9_~`iQ7z*eTr(S ;`QjKrNPx0%Z)xUSiH뤓t qU߀oN?T-g(ct4\MpoOq4 Z n]q}p'-yv8OyW749&xUaI}E[.d7mpN Uk:렦U!("Zm! v1k2w ^Ըkۉ1##~ֺli~T)x>k {ixҔGwBa1mG?q2΢7% endstream endobj 2109 0 obj << /Length 2225 /Filter /FlateDecode >> stream xXo6_a%2E}kn^ҍi02m%W?f8a%Yp~pǏg=|a?}X}rY f,tf!톳fvc{nږŁZӂX5v]rb (dn6i|כ|#n<mEUbSXj2޷= h.}rI~ #/?]z-cFA22Ɣ&9p02]5P뚚c~1Gj^ޢ2 KP}1,ȷb:LcV,\Z|>V))BkF̍bRrAYEDqq:'k}w5pz@~ԮzB-J=*_944OkNkMGd~qP9@wt(9duIFn)vIk]6%.PIj_e%A|E&EI>\u)ӕa$Uyso'{Hk-,)ヨcķis2̧%x|AUͪcЙ?=EUɶ d(Z-k*vO2:cFGCS_z.3Tډ]W}ZSƧ2B%y2ux:O60R=pߤن_)ܡ`k]^.Gz^9 7* ɛ`LsuS\և$!7ռwBEY(?vO4xĞ""e]cR 8u#jAdD))L亼B[kkNĠ;+ m6h=rKȞ5jǠ+ 14$-Ʒģk(֏l1B7g؃ГS009~hUAAVDԲm2jcAp*IbGg?`]!H)tB!C$CinA&R( $!H$ǀgЯ%햬4=UL"TQl' F nO ăqD ^2(5فjB]]iDcQ 7-r_^4z9:+X:IVƖk+O ESS9hU%WF{,s:nj!8 AiC#_TDR$hj+c@*!(z YԚ%ESw9Py0fv4Æ wrT:>b VnVj6:'hI36mHѓuSP`Łu}J,٭Jsmm.➤rTcW4* Z 5A #Gt l P^4D%>gMi> stream xZmoS;_Ꮧ\.ҮQV]Jɥ)M}A MCz H29=y{fC.;6B\,jDql@ȥBF\.MrI +kjbqR[T6:"+8&g-WQdT0`m~ $ ǤX"D ;жAPm81*% +A@6Al\RL+jLrjJEN j90% #Kb* `l )dDaq fJ.1%1HҒ8,jb0 TnϲӐ۳0ShjT՜vQ BFULlfvmX(3ES$Il0Gbbri嚌^BHx^(ܥPB4W**4%6.mKMpc*Û?`MsJ`QTmEԜ0 m<`M5`Fd\(XDE{b⺇AwtzѾmz{4|3|UiKj_瓓{I"||'&uGu/sL=O>?pzĩ7oZcM28#v?xj-lj|эҜ_,&>]{4X \F;:;{}'ENIh9 LjF|[yݳ{rݳO\bi^A/斦 +6泫˓|۳OL>@8*yv|ٖϖh l膽smYmz̀lXskgo` Qp[d}I'''RO,wjf6("z#&¾h¥7N1N1dm})x+^RO(",.Q}tÖNϟ/ştvyqL;|}vGO`o"%$xTC< .>~z{3;wt更z?{su6g20PPyAe(Pps{,VQ E/Ūl{vJcz;Z}m^a<-04 hO)⭨"JCˑx@AI|;z'6yA\ †cUt#E)[Ask": "?hrkO!_uL}by60 S#Ar'tB#PcBv0E߈5W|:~q6wgg'7xEQMPe(;E吿޾~[*/g+J,X`e%Pdk{`q|ӑ Qg5(hEe+yK{7z]06ȀCz]7CkIJuI H IrS!)u#hLEF% |U*9)[C /:Czv}zvYP[d$>k6?J԰!tv Qk5bn=!>$֫COwqU`tKyT:vS+ԧho3kW {4gjg.sȐ+5wW.F+m($_LBhKn#,(+4&\Wj9;yCךv9oQz~]BYvdNFzd, +=U~џ|zAu&;1Y'~?]{F;_:6U|6B" 2 8j()lrp}{\YI?Vّ")zlH{ "ʹ{Gbmtb|Kӈr)*uH>vz-b}WCV!>_Y_O:=1aL{VcT {ǙzQ:F> stream xYoB0`F4}h8s> %ծnq|wCv^[5!>[#W.d2q,gW׳TRj)Yӹ2_;]._}vr'gs0ˉsSNeܵ<Sjں:w-0(PERLAD%<0#UMW[n.MH3L}فs)9<:?vP˶}s0Ƞ,kIps3ouM ao)4-ًr{[x_]3 ɈdLS{h6m7lgc8ߔ#G#E!f'4-~b@,Iȴ!V ̡,XVeTB~Z窼!*9Fq6|Vh}q~IрZ?q/gbVa'|Xfo[gra܅8ǦQ [W_ֺ\%P,dI-IyUeb_"X9˼3)[bNdHRqY?u|Y?ţU!LGIA3e=SR$cawa.~l#aiajC[L*ǥޮA!54HD܆[q ,c2U39u C} Lfc !Ipb>> AFbP+VcuM<H~\#YDLJ8_նP;zh *(U*ȐE> stream xXێ6}WA@.@S mMڢY -ѶHT6Nsjt$/֐ΐ3gH,} ㋨~Er=ˣY~jɓ"RoݙKOkBۛβ\z" "M Ջ.eʗG3?4x/X߬>bݮT{Twitf5HhaI2[D.Y20_DqEk*쉽{nm-z[7WhiۍӔ՛U ;3FӚiT3uS8oV^,G7k4^^lcv{E zxi?J; &XGH芕y+uGMucGq{i wS}*I ~Ѫ' 4NRbd)2]~nw.-CU”נkv ^dOS؏>@/ 1JR,N[q i5q-HLԠBYMmxꁍ zi;wC74c9Ev\\j#-0Ya'+)P_DQ)fz`/aTB#X#3TFeX^JJf1U9U$YEc/܅DhxqP+CUUڴΜ[8۾t\rnaG]DNn\?1mJ'\_.ByQ}c;Uڛ'!&wCkXÒQ"?yMTF3sÃ8}#>4gNR\_*K[na`8ܳ Z"i&RTƇ 0W)\KSQXΆQWDɣ (RhwbYY2a=|I- endstream endobj 2132 0 obj << /Length 2159 /Filter /FlateDecode >> stream xڵX[s~ϯxY6(@[$Y+RE%d $uӭq =zu l)-r6~߼s޲dTV|꙲.SdEEIaݫk4XώꪣYI7yH:dUiVWLJ4#_)_[ !5Tܽ+ R LJvAeM ^eN韻t;϶Kp)*Jt- eMUhd59[ŔYM&߾ʼn%ZXݕ0U#3%VcY.Gr]}R ~X_ 5|K STjއZ厦2cTZ5M ]+”`YE'Ң$sҥcB>8PTu%q!]BvM CmIkṵʯhL gn^YW${]rE[l [B !-xoy#%E\奰\eZx*C몺N iqFmNj]U l'Vb MP.]4@bI D1Cm 8vE*V<߭љ`a \.؀dBcP|wRxzUv_M;$̔|bZ W%(a2g@/xB 8:C+> )RW3DJ^VD5.7*iRu]V1)?~H~5f.*k`0^ꀫh5sS+J&6[L5Tkϩl)]O! Rd>#Q$hfkSO@z5&4yw5!Â朜ϰ>sA}EhPy) ,}t x:@" nmsT&_8]S_-.kg>.HX<"ǀȺT!`5XHc\wU2^e fA6 \&03VE*rI 7r!tJ{ RYa Upk NGE6YgꩻSF,2_|ꍇ]VG¡ȑy5H|U{}u:o:ࢬA bc ۱!t.)l1lrѕ8@l F:jMoMŠ@ ՉY@D5;Q'MHbMaK1{}i=s!/*=t$NPz}.&8d]$v0mg4z4 9~l';Ƒ_hx;tA~b^]6+k۳=;/a8q8s&8 ǃl]S'ؽ`Џ'S$= vqfo_=ol`8vzp S;WșysGohpu 3ڢ3pPzZiydہzOfO 3Ӵ/ˋZ`31%1-G)fnR|ەMiuz=JӸP_x0S?Mv|; A0 ga8>lѰ̆8 tػn0L87Y\4×?[%/2NopO-2TZr'$5ՓN} endstream endobj 2137 0 obj << /Length 2562 /Filter /FlateDecode >> stream xY[sJ~ϯP⪈pgHkA:Hԩ48@Wo&}ڲ|ަw|~L}=OƠ>蚪N/]>+~雦U#Makz֎ӎ\ʝ؍(O7\4e%4ޖǝiWG9'? 󏛯NʶcûPY ]tonwߏlk`@7?mjv4_fj9<<{cMt==k}'wgo{{+/9+DASrnMW}}[%*F= (Z]sz@6VE^l݁%Ũ2C۪u((0u[sbpUӓH%{yIB v.y%WUM47>O: {Qv{Ab({P-Z]>O^9]L2﬐kŋ協ڏ4[6 vHσg+` F0wh 1o~J^k'zߋtQˣAIyQ7[)CPV{&2+7㊷GrZTV&/؎Noc{xOS]&r5pSįI^wfu>(pk|DAJ j5V< O9`={SLZ:qs8tO|rJ^z3>7+~޸L GQל@Wb+_exu)""Y&' l|CvAr+:%LڽoprKcr 29Q_H9!Wl9 @Ȑ9#MP^U׈L*ijz!Qd]/\BKu|GHg/DdN ¾ פQq ȿ$7$?F5`]C4Џ1I& Pak5]!o |8shԚ/4FP'߶LY}`+\CͰ8'doR0M_<>J ,& X'乂Xq^IF RvX-%#f$x_ <t%GV<:fחe!(忯@}8ӰVbOu ``yD6DC%>4{[.زs ԼݲR53 ZAwKN:a^2|,٪B#uU Q?&͜e mxGŞsw /|Ьl~tRy8Śqhsa%Vϝ8[|մ5yM Nʬ3k9_բ }o} endstream endobj 2146 0 obj << /Length 2702 /Filter /FlateDecode >> stream xYKoFW0E$  j%ccYȟz53,i]U_} /ޟw&VyK@a]n~beVkMW?e}Zi_~ om=|r@GvW_yPT,\) }k͡ZTW&|KTesfa&HIBI؅4T8PQ58? ߋR7{kFAV}[6 47uߖ+ӧFa]M_690[Gpt^ ʪ’kl쾗uDEI a[蛖Tʤt]:ycE-Vb־hN iXle -[9\m~!}9 cpL C,-We.AtVxt 7 БʣH$$,*#o n:xM }-Qn{[-;Nr@FiEϼ4">0LTF^d>x[ Tg= yT H \IH+_ݖ[usu'1RE-{%O͔srVZkNjK<O.&IIǵAK$#^ǀ`\(wLKm%xԿ'G3UudyЫ[_-r^0,6iu6"ڭ{(/A\;#طeݓ.@@@y*WļV!?n&~!te2W:'jU=9FoMj: sc6Ł\+, a(g*Hy^k:gՉ%KntA6Qz@ )MAuYgJ$YP 4/#թ0hzlSroO\FQI'ˆ e&w#׃5s5R#Kg[E@zg u\I]YU{.-h~S[ liS:LEY8i> ( g5m칱[eIlvAVnS$jpp ȶ9m#qN1Rt\!,+ݴRT+*H pXR c,2QBC"$ZD#cG8DI9-yo&fѓM JC2HQK Yz<#w.76#\e/sLH$, t&Cd"bC>E̼aq`—kXR6 ^wX*O%s?sCO |c@J UA$(FF;qRA3ϧ-9ss ă@sc0%>[a9z"1$AT>VQ?(FHd/DH,"+Dl pv q}7z8[A[0Ц}g`A ͅDA?].& endstream endobj 2152 0 obj << /Length 1856 /Filter /FlateDecode >> stream xXKo6Wl}Y6@4i{hڷ0h^J[Rk gX[O$9Qj W'//|*.V(6fuyU"Lez<|}.cnG;Bݏ_.Q$ )l>o`RX}We7zm(CS}}f˫ϑThC]i;7]{$茅5I:QMtIA!|apQUa;+8u;kUgTF^vgDᙿnQ^x}x,@!,?t8Iq=ok:0Z!:M3>)5 )-<]kci5Z"vh窖EW-A25հ^!T(8D&<D٧W2x8µ07.]"M9] -3@MEdi5x5]giL˛<8Lqt-qJ;d .뙢J[ozs35!V0V'H앱ܚn[N=T^GŴH#EPu4WeUvΠ8Rխ8`EpUݮDoV/9k(Qg,LPbc!t_h;$LKCL-_ GO,kiÉ68ɏR|J.߫>Z׳FlQ:6-UR!Cx1cK ]z`E@ ~~d3EDrp,hZǘvK"PT@CHW(< ^0J)ӃC7/0w;ڙT+M[lH\P2B:My{uADdw (BxTOa:3l2E2hsqﱙfI%Cpt@dDյOyGwȣwMnFKԱC16w,k";YjXdZkU{0׌;@`LKմf7>L B,Xa{Seiz 9ȼI&d:^ (bޓb`47 +aǺ<#0}_SfTqpX v6czu6=1/$Շkk0=ǫfug[- ;9V<8މ@ M&\O6%=fmҹ .S/y[nFF,rJyT h.`r8$lD`TYW*ի#=&1b[TڃM>^&8|>qOjH^$o;c(}x[7S @IgMD?asmgu81P'騵&0SK{YLze[|c ӌPN&lI87&〹я}ӓ G]0SQ Z*pqKed߅B&"L?PѨb(.ȃ,ETdjWmqfb]R )p]Lp6B>ĺ Add Guۚ;9cl8m xҠM6BdHzʵ&ޯߒ;XdS}. fΧ~"~xC9Mm ͒ckO+~BQAVx l]?D endstream endobj 2156 0 obj << /Length 775 /Filter /FlateDecode >> stream xڥT[k0~0yaQ%-c1X {XGql%6Ԗ'i cIGҹ|xxCsOfA3&;X k47IX+7ݲ{wFg'9BBhhn ay1;/593Ad .)k;_K3a&0A' P[W%/%:Ic|<Ns&z3HZ5caSXe`Qf6JPrR*> stream xڝYݏܶ_}"4.b]iQV]ZiKIYw3JZRp>~3mh{mdfL7\n8 cQlͯ: l< H¼~mI"ޏPM_충Q7"u7LŦ SQJg>DEY-D`3;7"Dp3|3/X8{ C}c˃pƱQ)k=F<X+5 *DX 7AAq;D!)niP ]dz8XɃU<\|2A00|g{u"i@PlJͪ33ړK{Aҏ^@jHHwN^7|27ò:~874ɂm SX vF6QF1VTK[k਀/DڂFN iA+,'gZăn*_D[NJGYY!>]gkK0.Ft4 ~#_[v҉6"B+ViB\Ks#>BƝ[ۮ(03s@õ4"C)L#5gx8=tM;Nꞈkwom '_@Z5ۢìj!'VY~E.z^ 0*co2 !j^d%I`TG7nR4EwB@P/x&0%ாF5PA:t\Y '>c^!enHjN∽R. ukƊk»"J<My#Y ͚YX^+LJV(a%gY~U cޭ͹*X$(Yyo߿N5kE+3)t+9We~ -UW"ʩB#bI@ڿ2Fc]Ju[dv м$WMiz̾eF]QcR%k"WZQ+pCtJd>شk@glや>|AS~AerVhL&AB pq}xVg"oB>Nҩb8KF]R"^|;S/ mwtz\ǣhtx EjߥYn!`"uF ӳiٚK!w;X02ڱ%D.)sQh\A"eTb2"U%L^kw=GT Zj1 >Y*DžaH(WP$fg/O B Ѥ@73|d6K x!\͖Uq,Uto>ͶZDrn:q^9B 6=s_ [$bOG@KC| F=<T^daE'⸇z?rp.y8wܿX`bsm\Sp4uVRo, *Ykxn`/fQ"3"ǀ8v|˼} endstream endobj 2171 0 obj << /Length 1751 /Filter /FlateDecode >> stream xڭXYsH~EU1 e)X6oJ,@ͿߞABUbo4NҤ&'Q[!kO%[laKD"[*QIK!D7e/N)$KQ2\ovϑ\յp4I!j8.Тtt[R|FEa$qEa,I`c 4+2N-ݑg[Yb*$r"rQEv3!Wf-!~%sF:Uġ,6&z.9xUK1v5m]?~2 چ84`H3,؆ {-P'o@4V5>~ڕ#8_:( ]q멚^w.r(|G/Efde0y~d.M 8؉i0t}ib A\UJg=Ck,)w6Dg+:+f4x<7eU[(MTiU{A6}!'+1e\NvG!=lu;z}B~GRw͑(SF)|?m:IM3jDh/#̪v Jl?رbAx:7.UO. @AArʪ=6~e4 xuwt<" &ItUwd8Ώ|Ӥ L:Ҋ/KBѫI]annɪ,(6u,q?rM u 8iahf,fkmcȯ٘ 4ɂI$x1H3 Dz%ΐV;MB'Arl%LA:+W3̒<-}Nmyo95=tnS"7J.%gO7Ug+?W6`?b>I-K;򯄹)KeP C)61B#,`Wk! ,`9[Fi؝L(8u؋2 !OXvt:o}˄gEhiQF?c%N0c, Db7JK(O"ۙm endstream endobj 2177 0 obj << /Length 1653 /Filter /FlateDecode >> stream xڵXo8=4Hش襉~Y۠Ln\ W&3YȷT~=&IhyscC6iu &m}\3$9 mggq!VN`+qIVJn~4I9@ C_&pwajŽEE Ao4r@_VQ[?8/th7罳pxDܟ\ N[ir&QFÛ:ʵ׮vw0!\JQ e8.,bv]a8ʵ?䀷ɿ F}?.. lmt(Q](} `-+Ȇ*-Gu7A&=vW+^9JшqQ^!FGzsW2gۚALD:po狦acWXd9,A9+&q.L[;CΉT=ٖm eY`FMy6js]rY8Aj&*oĤH&RXiQ&"?N>J yXX: <˭legbGs1Mh07;ò,A]I!Q\$eH"U>؄kL<["g9$R|obR))vi\p&Iol\qw|]Y3'Y."EhI(S3xt8(JnS{YԔr10ec&uz`3i=h TV\ܱ"+b9MۚZܚPe, Rۍ>dw־=E/A+|uK2;ycSU /HH8Xcg{lƭxSljl;g*\*V1z3 YFf9T5B ? Q*jVJuU=Iʜ#u^} q  L| i6EVow8oJbAdg2a'i$PbLP"capa qFMr՚ 1)!ZAjkGl4MB!TIp'ˬi:NnIʳgQxIJTL4=6J* * b!aV˳b*OSV>+w%4yTA*@U/[&Xs1^s۾Po{TG6j_Xؒ1_an[_y;tۮW{K2/Ņ2Mx*"iHe_h3y7*$OT- SM`ÄΙ:`eΧEMԃ@-hN߈i, 왎pY[A\9ż=4S[@l9#ssx$VXt,FRa;E}ƖZDNWe{DüF6YE@jOrL#s,ՆkA"21d!׶@uԘ҃J8FLB֕1AzJOCRtR=\Sb,}u43Ce4ǹzu]`xMfrn! endstream endobj 2183 0 obj << /Length 1815 /Filter /FlateDecode >> stream xڭWY6~ϯ0Z: ह@v6Hi,*M}g8#6hy fFd3 'g~ 89WbŏDxVU@#OqS`S^=#Q$dIF3z;/iAU-`-/쪍^сݚD+Mqմʤԕ1VGKfG`FYŁ~uW_;dm5n{ged+׶8.Y< jmIWX4zi^-At6c 43^X|q/E'a7<ڮdqk ^^Neвf}EKOZ. >JkYy'kBy.]J) &МM΂DY(<(qm=Bj N3\VdrOM =X8b&FbO$]Rr RDT"(2%8Y(bWKP i{mT$D2;ruK%pkݡ{qnNv@_;w?~f6=>;G()$g`}{#W{L)O_Q7װkt[:,Poo8Nvq-Wt85 jgh L*DNWp3!mWW coV6+.S\¯0HPcAإ~P>}G,vl{7yR8yxVg |T*MGJG{CF)4dУGhqo`e0N^IAI )#[PQ75;2 ʊǺ";E\v'X˶";EvD4t_/q)6>h\)5fN-4uUӅc[DYkњyr[>B}CʈUV׎n)͠8P4qC0<8kʊhġ@zK-yN i"t#ka0ƙdԓ̠~ ǹ, Ыci&5s>-!E_\nñfx[DG9|.Dq^!y)jS=jCVcԞ1jT3{y+/fk}j̜߯1?3FQ!BY |lƝ%G/<9 endstream endobj 2188 0 obj << /Length 876 /Filter /FlateDecode >> stream xVK0﯈zJ%jl'c%!<Bⰽoy8T'MJqXC؟y<3;yz} :}[52+劰i&IA1cCu[h@t$ɪDY% 0jDz mQoDzTڹ5~]4(}>I"8a <[q\Wbk|WW :䒸LF{P=/|=ǖ Y$ 0CO 0w7eYm#!FBzy,|bTm Ld^ȶKE@3E*[TN[y&F9黲W\,7Wøe  ^ܭwqbi.K!vefhB+[U|=6zc-~Jn>d+*F鏮Om~Ъ3I(% ?9R``ˣq^la)6/9bR5Pjd9Lc&جׁ oH@VR6,zg+'3_UFT;_ÍWC) |_}W4vPox$U<4nfYf'#(™)cڟjº pR᪬r{5z菡 ]-{SN1{WDex,]ZW ^WW/m b# Sv1`({yF4`S>6 ɪ:5B si 7pj> stream xVێ6}߯0IbUd mM"mVH^3Jvi,>e̅3؜|/ﮂdx:X/E,b{~/s֥\+B4PeSiw\2%i *e;>[Mm'qἕ(B&8E0.Ts s ?jI74ǃpB1#2g}Calp0x$Bگr I㛺-';ЄA&sAwJukqsҊ36 "?qD խTmF;Hs?W'6hwWHz>"l38w9AyAd+ tS/ِ:Sh k0 H粕SښwVn`"ttJ4r8NhWIkx ofJBS˔Miws3JiPOn+1椿e.R |zs_> stream xڝ]6=X8U> 8f![ Isk 'K(%Y g(KaWp8j Vw/zxkr?Odzx\rtP~~z?~>lon[-!{f$ ng~|M$|f}ep+ ñ/agxPф> (uW5;Zu)CWi{#c }U|؊ 5jt=--T Suބ!Rtvכ(_Z$uCݽ UOߢ]o7WDB~iMGUu_+ ]u5<ϣhZ~r"yby¸eQm;~VL 8NEISiUHBoaޖ@Q̈́uPjUܤ8- 5^=Bہt ?]A7Cilf`QU؜5('3Pĺ!󟹳LÒ~UsWp q./hr LZ;á学W4ͽ{1k|1ad}>@!łhqEG3Kj8vёayi!\Ό 4%m].9%>D,AU=SRL…>v],2 aΓɓJ`^ypz֋6 _Hh]<YTS.,qBl. އ Ua'эw%대2Z+ \C [t,}&16Q"sUL1 M;ӣ@8*EGM6Co01sG"v[cnh+?ô Glc6jmCƳCkݱ=N[͢HX fC^8L.< wAa RaI_N1c'. OY0ʔ">qA ,Fh<,Fm[uᔵنCkDd%`,A5G)3܂pQaïVj"-8e˹PJB_ɹ!'ԔBb00fk;%Rxϱu35j1?"[%`8 Dv$\9cZJkжdXȯ֜Ҷ ?3LR]BM9';\oݘNtwzEU:yo{oypjSW5#m' @E5u)T/ ɂPmtGeCM&`RQC[wʔOyg -_͕ifW"? \j>ٹS p4rû]]PyEk]qvo;^;QX%bax+]2\UH4j׹CCKXOAgeV̤ð(]ײTf{w؃Jn4nr?SrS $h lOEN_SyMkFxhݸM6TYfL,0~y&Oq̦;9()>ik8g ɱVN +,uk4Q]ߩH:`Ɔ*(jamuJHz@i?&RZ߽VmS$]O2.1y+>Ti`a| eAy; hd Plc^|Oo hy4#\bmNJig&8p >q(0_elQeY#m!EjLUZۂ,UJHĩ{~lM^d_b3յo ^ΞrQ=겪[+r%@Y |Ǯ6>cD"矑pË/!K endstream endobj 2201 0 obj << /Length 1430 /Filter /FlateDecode >> stream xڵXYo8~ϯR XYmMȢ+qwɖN}0ko3C{֭Y|&'o޳Т>~ȬŠQx<&s s\JY`q.:+nG}gJv]97oVBX+r%1'xu]<:.LMct8SO@|I"~t_$&ob>yuZV0oq\bݘPgcr#QX:I@3Q? ~SCnaՓBUԷsӻi=% ݂$2UZv`=Qζ.L7=YjS c1A܇l)fu& 8Dڝe)AyitނGxbWr%pZku_Gs !"Ө!AhPԞՕW8x ={|ssv&WΦYո% QB$!E=d [?aL][ф%G3Go+{x"] =GkDpVˆ oWF3C (Қh#Nd|%Vo C`4>&^M1B:ҽ%ģ dRxƱ=ɿsSN endstream endobj 2206 0 obj << /Length 2286 /Filter /FlateDecode >> stream xXo8pXz/p8qxZ\[Jr7á$V6{_HL7o182t:<:xpsoY0ANddy0 ={4hʩݞoe[Ѫz&ɣ%"GU=$~R []ʇNFxIt~\E^>x֚辒u<qNɇ[#Ιot4&e0i 5/dQEq䶤KNF|'pMLwlk%'lw }"+4bCҖ'jA*&RNkZ q<}˶E\ ۀN[wp)өwonQ2Q6"٘21{@5>} hp%6d[V4#eR aG)}MH8 ZdI?65MهiL8)b>}/RVbE,,(mKK(2zەD sp/"/ yJc52ET)0^د}"ꭄh6E- th'YMӂ]9䦒.*7.$ɈKص_BVG@|2h[5IBqLpиMU4CPO(5J|RhD*0ؾ\tJRtmf٢6VԵP tU#RI([d:J p2` sayA"k#K8R/؀R~l!Q1XWѐ٤ށ%1'a5\v wZ. 50Ex2p&D኱xc!BFtSm.u><fv;X],W.TL~C6w$ gL !ƠxP׋{ńl&Ԓ:]N)[zp|fXn_@G|ƞ[d݉S_z9AE@-CCYkK0ɱ.U\yCLLN8Lp}:S /<"Oi- k>ʨHb٣:{5ĚJ9K@f'ᯓHO >P6yQQ)s>^]M86xKVVW*Of4JfbAjpa]vF'$p?bj۬XOPsш+t|["?,yg u=3/0}76ĿKK V-V=r*dO҅%.8s{a&EZy?%hdCE}AYŪ {@v u`V[j݋Ƈ,U+ۓ6[~}[^5TVW(T\A 6ߵJVv&^SaA t(*U Ͻް@ZNЭI>*nkT2sW0*06חY3Y췬`ϟ b8bK%w"; nʦuW/{/n$&0$O]ԛ9wt9su8_ oÞy{`7՞OV/>U+\fYXM~ z&;jbyxYWU|`3[7XG?%LP[{Z=U%ݲ}x$ꚼrOzk_s"?j1]6 +ATHIt\¯ZLyfmfzy~j#͛ ߼ z< oj: n0|r2e+~hz<n~>Lûy>pF5<@A?{ԯy*~1ߌF2&@6A/pzyI?yP=g>W ~*ȭqx p?)W9ŁTa ytgU@}L- lj3v " endstream endobj 2210 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڵWoHYayW뤵k*Fx^Ԫ\zRv^;;3hҝIӞ&~ςp=OChy9Ꙧ 8(q42א 0=ee;0(O{!g.]͊$8EX@$'|qcL3a.&e8:7zz:Id6rU4(]]k6!:#&R=*V%Of'ՓߥmδW%MUMmhQ}ZjߦBQmжWlzl=-X=_6Ej{޷6m{_km6%Z}'9tj9Tk?)-e570ݐ.G0/)_Jj&8⬺PnI&e-$XG(\saQDLVڌIU(0&B 2FD6,א9 ݸTi,`^IcڞMh{lB!}sN]\iCWVucRlnXD˱l9(rd>U{*p ob ZpaQhC@N[;rN31?`ӑuUYp$Ɣ.*b5 !j{qW&+1-)5V%!4|ĬobTJYBz2x BazL#T)I% Ҹ){徬pBʹޔo!FYslڞEo:)"+\[GY!&ɎTqC!Lɢpd yt4GJs#[=j5 9Pg%&s@Cx))aA;@-`ѓzHڎ+r2Pɦ7GP]_>_٥=DeoӌfcAW`uvϖ;x4%-,#ۦEW,ҐCB V5V{N.x2 q?CFW7@ )Iø+N_K+$d>㡡)Z^| Fޘ-"#AkNy%B5[]EFBS5FU+8v ߭A endstream endobj 2114 0 obj << /Type /ObjStm /N 100 /First 974 /Length 2179 /Filter /FlateDecode >> stream xZ[o~篘s;gf 5C,HkE%Wॱ!"%.L4;{̹HgMPF9kH^de ;FE*8< LT)2ΨLY^-+/-/1Nٌ,\Jn 6& fq@(7`% -*J.Ă-[эYv(,{[^bgكHD}0 eHR&"at9Yv-Ca6XmŢ\ \¦$"\",v΢U2bLQccrE;` y+C  +x s `TK$.0;/(xUu XP{*[KʰxKX;9Uo?ת:Y_㏽e3' <\V^W?W3^C1@e=%U]FUwkA[m_gm4et `Y/lӓrCuZ.޼}[I3䦺_UY?M5O&x~Rj>_FM-`ՠճz~ZEgNƈ=2 aǨ|aOV,7&-.f+[M0zhaTz_ht4D&v"F]"rFDA}Q`Q4-,X I/qX|Ѹ|5!o# jܘ`އ.=\ xxoU7QYkFz!&c mPEh# G@ 26;!49H-gngEhݬiFS0[׳JI$$IDd~ţPLPN !݀O+ěq("8,m2Ų5ca5FHx$P<L!o YQ%Y7gx $nuv><Ä%FiKhV R@B'Fqn’3Y醏z e)jaW Z4:{j'֥eeWJ닷u3V ԗ{Zvxo>F@A"j P|J:vu~>؟\+jQj'=x7=dR|1g;[Y?9mlcV_Lm˦6G3:*cE[MR6-{< g69cgVW1%dh'O[u:@ӧiD;d$BȖut`eqX7?-ORDH : UqP)˾3=7IUjR r@g-TDq8swOFmWUp 2Á( CNOz=_a6ckKCjjYZ#p4P$n?l+jp2ZKh"> stream xڭWYoF~ϯ 6}`!UmNĪ0"XK+5E*$e3;C6H s7ǚ9|c!yŽF|%Q)L'%oF0xgxCeR_ψo?q.Cy|3__%iϦ׳[/IX,k>]_\]]Zy"]iA,hz̓8w} J@д'hi-No' 17fwq2%[ MAPE,(yMς.x:;; E_ 縣"aW !WU"Ղ5kƃU)w0-~nlKD,#JZ|E#e2y-jYdE\׼Z_ ( ` Ap['jg@aHg}a d(Wu}@ȼ3.߱ 1TK/M_rTV4VD3BDI$}`!jBĨSv^$BlZ@IM=eM0l2'eG>٨*ua.^4ۨBx=ӊ PA> stream xXmOH_!UHz2 / ةofgƉENBx=;;3>㨽Q(xs0힦)e=GSpzAԻlPi%Mddw}p,)LlIU?=Ol0Ԟzdge+mWo逅tm9RGR`e%+iM34nu {7}ٲ*H{ԯM׽uU\<4bV@Vm/TG6ϋhۖ*件 ?6y(rDPPSdO6\Kq5I.*&0AC'- # O?ʓ,"I/ ]#͒k&y&lu"סg6dƎv$SlQl")(@a= $ kIŊ$9eE:p#=HMFMW5'i:k06Ð=dw!nc @uU1lݻwMPFGINd̋>C6D}Ē[+o|Z}.Iq}č+{ղH[;[-n(zCMĀb5-o3'q2mdˆ(M̷% uȑR/랕$z |~ٕ$ǃ"<͂`6p2Nʟxr|`^&l W@Ե=` G/Xte2 eY'?/^GW @ƳGK˩f{<:$^^ ; }0\Nr|:NNf3'Ѯ7Uj.;]gRCX4G 3z 8UV%'  M w(0v\6FV٠7菴Z}~҂AA[0h nv Bn1q-ՏXҿlA&-ECX.UD:\x(E; "<]*RFedN7?qJ#ң RNb'dup&.aBPSsʨaI(y0``{P||aZ{ AH W?;ZuZ,uiNX].UM<6سS ?yZdϒisk:WzSTgL]ƻ ~9Wt-Z^Nmk skw}eVQ/qToE(8o1 oP@wkRHH#6ba-WJh G#aU$߄傞aQkQ?z9<,k,@\px檚,A2 H*ޣ|u M}S^ueRdαs@`Jvgp>@wb}(@E4^k$;rWO}p-|鞢j8uiVo endstream endobj 2225 0 obj << /Length 1157 /Filter /FlateDecode >> stream xWio8_2uYdžk'Wl[,hRVߗ䐎  r8|ޛ!MmȔ|ZԎ|u2ۦhx}/[D>#9/:ɪLh˰Y u%,fE^Uen .'YdCpH%M:kف~-a5ˢYQe,,E \8U%t?iՎ<KId3qG1O9(uUC^Ҵo^? #n6^;};~S3lm0ᱝ)Ӽfz&EygMX8Ӻ%ndJ7PK%EϡO.a׻?B䟓3خM;X?9X~oiu[;;-y˖gwi> I;'f1t ppyj_QW8P"ɲ `čcXN,1oʞ?]2 G4yBbF pGc$^o}cF4R^O9ki sJj0qN]ϒ nUAwEguZ,껡u:ТX qHeg^nsA/es)1FL%'_Bw䤂ey{ލĆW(0W9mڑxX]A$ i.o:\82P;Td%KIrcNps!q}^< x\$ I8~G~+"H&dz$j 볩iPNP.t&:LrQ{/G aM2ňY,@I> Ϊ4+y.JU 2e JܧR&?Y)OP"niʦ?ZWKdࢼ)Cg*3sFU߇p*b3_ 4Eh<2?إۭ'4͘y9={F'^پBᏧ> stream xX[o~K) @0ev\;"i0J / /5eXN@`w3̮=XՙW F(pA e Ydqr\'q2wy2&\_Ofxhosn8cF'X>ˎ/:' >2W|>_jzM'_ WeOds!LoEԾ%dOϊxkI ־|=#79| zEgo=cdIw³F70XMDj#end=45UQT%FrZaiBC'4ZEZ.63NdT]ǡ c%cV;6L[UJFtY9ٯpelȒ=3EmM͡)`0H154=70#Я] mӪN" IgK*ɺar)RMV$<»-ھH%l&daޙWz7WgY!1Vd#t6zK2+ 3\T/<@d}wK"6@GF{Kg-3ld]u9rnZ4"lUj {\fS4aI"s^+v2Ax|SBȥTu8=JOuBpm+6#wIAÇp/䦮ĉ*9翙I|w1=fLtpm3,&RYl"/CjUȷTE##&/ҒUdCRqs|RJD^P*+:MZHF;N;5P(Ks0`:zۡEjہZZcWD ۺN؜,7[Va:#mğ!(zV>_O߬ӒO#N5:l8rvy[׾T7*Mqo 8uD``0wm[H˥Na'uVM '[2܄J&k:Z_t!t=~ d% YCR\#`V>SLLn昢@jՍ8/.Vjg4}?Y:V3w*_sNnA*К13* OC0@=J_ABj_PRp橄C )WJ۪.Ȫ'vWy;"@8C+o] B->^-?֐K&S.ڕyĀ+Fx JE=3,ll&@ F> stream xڽَ8=_aXD LεfҘn dAm6eɫ#EY`"EXV3o}uŻtYī* ]?IV﹞JVcE#mnVkw(S?4H*Dlp=BXi7=0şom7K"9['NwKa$ζlXW(Qe 4fWiYu!؜8}kR]F1,$s ~nj!>7pdȍT%YbN:c۫5L4[ A WƮFz|[̥>R;YmD5uY|{)F?v>_ YFrWj:0ZQ7Z9l須Rؙj/R; *TQ:pE!ZOkl]N+EI+:7T`.P{r=5: ̦C1o`,VWܭƎc,F#&hPFn$V!Y3" -K=vPWyɔ/c"*Vξ`F g‘-Wc T>? lW̨Ď|8s8M) 00hJٮN_.^} 5K!OCxiCv})td&n diu< 漢d&[G-( h}U`nlf%C:M,}MKNS߹TpAgEx{z94d RA0+c7m"& Tߐ#-U(b@ķ^},p8)b١QѠօP` mJCޱcĮ 1 :#7PypVVA֪4.,Ij'|\''D h{Ai Y&4CB 1_F,,M˾5/)6K>D~(H?V[ =<D _qϣMMX3N)dZVݛ`tBY訔 HA5!t1Юfo!OQ@]X֍ {p!X2: ϝ#,^?qϾ%$ƀh tn}K{l@g ̴,#ŋW @ Lg)SҌ' 7OB6 .ؗybQ /bq8 Ó1Ħ"*źcOë;;{bw,,K…E=' ]/`;eFc7D@r<X$h="7z̄CN:VUESj~{ >'zK*@N D[I8ED4 doabCX˂0dmPdOn4}UֈjX8+;4. N왊pn/s40e\)7oL+SmNtDV+&gb.;vV+Js# m1#-d59ٶJplMY>|,tP=|'? B&{]Qe来$-)1ݑ6ġO[p[ IC w0liNޛ0K[J&s͡ h;a)L?&6ͫ]>X"3-8|aHFnqȶu휦S{8-(F7bmܑo.|Q1:$FGpwI Q#j -%cq-zeC)ʙRA+5:}0g*o{%Xv҄MlT*< q,pgdc K3{9,S@LM!QyBKK@[Xj eZcVS9S'ETVJp\BfBs(~gJrŝ7lHՈ!3.bYF+iLqVf{HČQn6Pn7vذEOJ|#๔]L5?YOU1+p͢ƓֲdsQ֝AԦ@a&qZXΜT 17;*bɗ jcqHjZ] ZBF8w\GS/H"Bht"@9 F@'OδZ}O;! u[mQ8g|7 1lBD5ٵB Or?JIS7wd'l,WzHZw_βi&?b wɞR pM!0 '"f =6gОP}Ҝ V~geHP!x4J5QYp ϡSp[.d(AsϽc)z 2rbH+0$0$Dj ̸lEF9`;hU.נ Ԏ-@ؠ8WCɽk"<N4(Knkc].wo4҅'UL3IJ$='xt\ْT'HZw)%'-anÏqHC`'VW.aodGNQ[kG&2im}aQ Џ7sXS#c{t ew=ArH=qPri7s=?S :M?Az{?. endstream endobj 2245 0 obj << /Length 2554 /Filter /FlateDecode >> stream xڵkH{~/ޏ xMq;C8.GڶndIu.?~ղdkB CQ]ﮪx7 /? ͓ n&= ӛMq//_AǶ1=7 |tg#~)w]]mUnU_6uw^UxTuQ~V?ϚW~Y%\)+jOfQ.Z}-18 G/|ފyմCݗ)X,xP]p[ܲCܗ_ <Dcue^]_4C;N13u,Y|M͊0> 2+(qZo #j͎qΜ7)y[ ܍gxe<وhxdN SC;6ѽ.xQu8gGaӡ"Pxt`>Жs$;vySx1*d[Kߑ`q#˻dN-g[LeW`Uwb$I.׀3ٲqRg3^ڨziC~ſ[}EBԪF!x[ gRwf`O1.3=)d=?1Xc|ݹĆyMκJ-xUN(5^~b=u]paYȣg foy[Р N57z qP 7Aj'Dov4pB3`(CdVˬ joZ@^<[V"D&7}c- ؜gЇ}mZ]e@棁vC%9u7v[&O, ሡJ:0l=ԍ8>7=p -'Aޑ&L%hB׸1+2a|~ 3.ә+/q*C?pJq*+DAR ,%g9^jQ|MqpH[59h8:(n HJHƳm?>aX " }R-Ű.Ru[u (tׅ2Ïrz:lԍ9b@Fw:ڽB vv2})_*C,WU]ã)C[*](+`# hg$BdZ)w`HRňaA^(9NS0a)ORa2=KML¼u#JrϡnJU)ٲ^)A)+<%'ٹLۆNAAT^6ث0[qO'U 1P4CLfCLiU cY8SmIc,xsC- ,U,음jI'wX@Tz$fs4$Z(HEk<C^ ڙȵv ^o6+6LG'[ݲ؍*;]TQJ(+/ ۗ,3) Yelle$"k(vp灭 bRpz:J9<2Kù6 2熅Fgm3 {5G=;!t oqA^o8}0>&G³c|NO +"xƏD0\Yφ^ 0twqin,OdlΌw_ sX{ݬ!bEjypd[ğ5䔋:вvezmۈ5XSBW?@u~U{Pg>L"ک[BTIڼ?p{j8֋fY߭7zzai_\($H ↓ĹP&J)=SJfJɄH)7Pʽ k-|B)rB)RhK⛆*VlNǺ)WL#U]uaȡe.'< SYlrWg"9 eU[P"6l?3;y7}7胴vh_ IЛǪ=rl c{RRze'`vuIF5>J"#nFUumYRC }(lnO󿯹j0%|z g@9&GEfc rh.]r0̅^f w,c*Y0;şT endstream endobj 2251 0 obj << /Length 2071 /Filter /FlateDecode >> stream xXoȗ5Wԓ* $e{muQŁ[=YRl eY闾!p_lÕ [d"Kd~\E*}bY,bJJ1 o/IJ_/72I"I+T Ϙ'AV3qU };$(9.G_dA0Xr4 x{&X1 27-ξh "j* COv9r#/?vK;v^Q7|wu tCӀqW=q떈fggT/޷ڢn nLG ` xD:I0?}S[ C @krS-0}єvrb[qrKQҌ~++jC[kהJ,]v5YlprQ^\5COg_F۴rc{n "qi 9Pe$?52N<]40ZLX"4|-y|{Ď@i) &.y-]Zm9u=H uA!GtR#6DNkfZz .FgE,=8޸d:`ǖҫ\꡷GdWefI94mQ(65 [Eh i7jcC?BC,CȰџI #P'@X6؃<5l+Vz;ΝW-Wn՜'E৺ Wzo:l[srEK2nrMG4G>Ӛδ_I\M;$1c[GG`}jc5rc>%wkC7>OO{?G9N0 pʎ/S0ๆ-CIgCƳ9tk`AxݮJJh ˶_PcT z|7%E Q| ^-hKmuD9|%ɠ(:0qy|٫P:ϡ38t>TPl֮d#x{StqSAhD%&TUH@NJv2ҡ#1>~')DiIUFCLj@q2ViӃ5 m ͇3Y#k׉F y= = > wGP&>m̬1=ĻWX,|?֋T;0*gk~?v4D246ݘ.mWx#M?룇ve/fe/kzEi@v`5-Ʊ7E@L(H:~0v}ר endstream endobj 2255 0 obj << /Length 1467 /Filter /FlateDecode >> stream xko6{O2Pjd)ZXT: EB0()ni 05̬3Kg//lƘy=Kֳ2-'%O7]ә/=݇ ' m&fWE8ʚ-Xh:aD>%!hU/SȳRh̚ YIf/g^ZnΌ\KXC 02k4<۔(Dߏs{q|H\^[!:D@9|@J8a`eEkVHyN/ו,xU%ЄFCopSueJ'|*!21׌\W{0$>WQglKM;0U˜؈(|OX T+ bC\im* L*KPŁI:-:]{_vׁke*6VbBFg A2*:}^,`VRp-,ũpu'CŜ1f Uvrҳ[h'YhuE1uPWNSIv3],uQmgb2)i25'v)y_\08mR4GuKj L:j")5t&|ڬ- N$>$K8<_%ŹZLӌ/cbɾvae_c~"6 ¼c¬0w~Ͳ{Aaw G¬A(y0/yѣsGAXY'Gr8nd@c-a 7k`uSȞc,U#G5a"Ӫ (T߈rFW5?)rIF|bhPzhptN#}zK4P8vq^T ZxEK #dW D*(VNS'\UD2Qv \wj06I?N h`%?8ͤX5uPn䩵?˺CcMM{XN(mj'JjËcYO4:Vp:xRj+T){[78>?=gc+GqOd4 }(4 =BGFQw=ێLEc̲IНPN endstream endobj 2260 0 obj << /Length 1739 /Filter /FlateDecode >> stream xڵX[oF~W,y+eA2f+ڪrݡ^bD\fd B̜˜Mor3gA2}7`2$= |1Iȍ3b^Lga;}'%^ȆɲY {ӿ<=&'{aw,tPdY龬s,9߈i;⮲ pܷwbr4ȬfշLM}w9Ul6=9ЋlZ)[Rɟz~TcH Ue uoUQAgle]8qZQ8eݰWnѰg惫V;`b;{a+1)=>/joi )"E:% NQ0Sƪ0rЕF3ojљ&*w Ig߃7XݹY"ߪe4T3NXɚA  P,g{rP|sk ue jRk{垕),{.E#D,%!); } b;g`{wN~:>\؉k&?!PIz+ 4~B={aJisj5j*:8=fA ]ZGj7ZU /zp_ZtN~%<ڻR_c'W$ ՜Ė1^P5QˆjkFq=mr`4lAeJq_X.f\UDzS/(5U:͢dvE[Yi>=en.5ӥoۀW~-fSˊ Fw)Y]#@Uo''g ߴ8xc-qf 7 ỽ/Cǣ/&bw[n -/7͵y ,1x0M&0`{rJ֋=x씸oՆDAb||HBRa{쒓o_3%g:JWsD]n:wSV6a@Ukj-`R=3ik6Wcͮ|gM: ȒZcշ J1q{C.$GViQo%y퉳FbeZ{m7͋V]͜궕i#@{=IܪVJ0r41`(U2rLCxK@cPAX e"x$pl@Nh9 Aa7N7ǷZ0fU6M0F468+xi~oh6fO_G9Hϝ릟\@XkJhHެKݙyE*1üښًBb&oSTݯu^̋b>/Ÿb~~V<8Qq^ȥiާ$\ߒ?BWtU|tu%#]~W烮([W4ҕ%$>Nj]m endstream endobj 2266 0 obj << /Length 2476 /Filter /FlateDecode >> stream xڵioV7_J6(˖\ɮ1 (hY▇#;fHQ2w]C;9teDutZ+x閧Dkn[j12}3dzh+J1:c*piITs-.i˵(xbKE&-r$d3(eNjگRal o gq6#Hd-bWsMw͖OpfO7(ktlm±jvh@TpӇ boު,EPe$TU#چK5Y=CezHi>#4W|}Ko},3IFPnIjU&y WC'dxUޞ ۶WA2c +2fsޗEFWci6pWW[S0q#mO^ )aEڶleaFLV{\&l FIcMж4}2sM<t0^e@pʹ {nA.We_A/ b"4w+QUt[&:GCU+ @kKDWC\ǩ uBv 1\fTu ~FlQcRRJYh 웖fXnSTTƉb(i(.( e|]WpY<ȫ|W*m[OY. T%r^0ՃjǘO> t.0:kn$-24 Ҳ-{HIib-ZY=8%+mW3Iޣ2i-K#=r L9? ȁ\6rB(Иm ے }U%4f*GaH{4o*>գmNgP /O%x<P DJAQhfr|45&`xD4q0|"⧟~pR@ *ʚ 8;N.i# b zkJbuk1xܫSV>{SK]x=˝Sq Bhʤy]?=KLj)}> Wѐ$FԟJ<2Ekr#-hIR mjzoW51X Ttt_)p!A|-Q9 ?"$0A? 6e㚂JI+R!z759'^OaHe+~dǧs H˱Qkz33 WBd|cA ċ׿,ȯB܋sBagᛀ(Skm', \lfܒz#y)!殥SoC}0y^⷇cH0a<@0x?2"}&]L&t`0FוM6)AZI}a,MF ^aqe*_C5"R''W.|(:f>xA|JZ7G~6(KME;5O_4viSo%{R*un^~I/~J>`KW'oEl|H*nю;gz -+Ib4CD!~s#M=qs:c:J6Ϣ, MfI8 ''E8xs}9_\F,zy;"u9L'Cfe8M &/7Olf9]\|>_F0oËv^xv9EG7/6 q,_~,Ĥ랉b,&x%4AvW zGvy)0tCsJ)05k8 mXʙcie\N` endstream endobj 2270 0 obj << /Length 1868 /Filter /FlateDecode >> stream xkoF{/XӖ SpϱVYtR~$ˎf؀uL<FeFg~ ~VشzVgaZuW/W'81MD |0\Ÿތ&,>LAp;Y0b~W|$/dLGr4t2Z z0_\Nr> AhLQ`σ~(g>OnfL78ef#SmۚY#h˶i^ea|G.x{ b=.@ގk1ےe| cbI()6ۿ{-WdɎ0e"i$D wi.Bx& S]@^}E!1 `YxNXna,%KRݺ;fs 펥I3PBr U7abIW=O@vYr' v)vEٛ^Z{}H 7[$G쑀cHη vh+,/8!Fl ?;im 6MHq ΆJ:ߞ}2,C iɲP$4vUe|dkA%UUi\f":GtƤw<݁^>绮޵*N'׬QT&&wpӛ$1 JSW^ia%p3pC-kÉ0"x$E| c$|Gq7D__مwf ` 7vO3 6o{c-"=&s%6q\&TKUX\۶3B{r^)W9:F)=gtZ(",4T|2 U6o y"e#Yrnǧ*JN&k?kvr# !U?j'k͇ >aPs@Gy&Ql+3pO;ezUuym׵J&X9u93rS1r,#"!_~flDFa4)'e[}V \%>5jIeLVrL3eQ5j~JG:쑀j "ᜀ}{v5~eOhCn᪑ ! m|EYxmva*[ YIZKRNRUSNI4RNKEjrORʮ \w E]86UL s zXR9qrP0pl2*A qR"E* ?&8tU$S(^W6k6W7v|Fw.}/;\wgߩр_7ykJGnOu&,NBCI}G!dCCH s\Di5 HNR/ c/&f<-+f8GQxg ~qBg2WC\t@5b ;Պ ѰbtӨ8wT E$5p@TCE3 _sjrt׶c튲wA EP=>x4^I&uω* aع)bڪ >U7"BIM6'Jnq״n}pG_> stream x}WmsF_KLԙdƎk29kDS'/h 鹽+>/Wo^’ȋzG, ސtù?tǞs{#ȉbEJ"Zk{˃Jo|șػTejD§F FTTxe]U:"E)Y*oSVzal^ pM (r(kXހs!Ir'/(ަy> uY숂vD UoU!-VJE.*LoH"c5*1f~&>S&S!l i.; \ ѣ,WD !bYd. כn~3}'d8Gtvu7#cT^_|;;S5Jx|3w_NKÕQz(<*=Ll}DA:3ucK‰.Io/?ffARi(6j;W[QAk -jrOh)= >s,ʊieY&z{.1f ^$4D]]u5 /ZӤ_Bݾ?(>9iujEbM>v#?8ig E.-k1.]F:؂b~|LBXI[]0VYU?aa;/EMΰP*2᱃3\ [yi0EVh;DP4p6sEsV2_wK7Zu-D2Aüմ?p2iz߮7R <0mgIR /?ߍ~L~4x 38Kf- Ƴ\$.U"q[zBL }g*\G~Rf XRr&P"/,M pO .vLQM4K ԋ$ˋ#Ra;EoL86%TN'L} @VЭfXthP/;o+TW{P8AQ j<2nܭ~B[ݳKOzUˬ^aD L@ٷQ: ,Ϊ:MD%>7mﬡ:ܴϻfAl(÷$ %NE04ఝ1"@ }3 v)M`E-DL8HPz6F *?wd- i};u;vkS 0Re2Q(f N^h䲰Gp43q *g&zR}6 Z= Uϡٞ>xk $oF-=y񀯚M `4!8},] endstream endobj 2282 0 obj << /Length 2669 /Filter /FlateDecode >> stream xڥYY~Л)`}%X;]n``A#)lzVɟO]MJq㫪Vگ/"~xq6)VIEv2YiqzhVotޤe=WdaY1V8݇W.`6㰊r>4}(ПI&:<8'L⣨֛ٛ,˂w@NUGg^J@[=ʭ긱׎3283U<`Y6Ifp}mמl"džѶr`B}~y-zBs<-0@*kxֺgx(3*t{fIä, S9Ҏ&"ܭBG-{Q,)t#s'N2LE[&dj‰bX[\+{=.@Eh05 LN-9-Sg48`֒:a#Ӑq\lbl oM?ǿЧ:6zj YtQzkGIJ#+xko@C;Dzk+eyނy;Vx`wnajσ%gQ\f >{FBkpAG{`_SFt|pCmwٔXY|_6{kYAJz76>a=JrIw+/azBbdޜ\A]K?$( X9R,Qٶe`ðb`1,V~ō?XB*< RԗI@A~{xsan9ϽcT $LfOu?C3GVMyuS V2jrgY9R 5G%~^Zi:M"Z4[YXTɥ_jp "InJFs8 3ћF NJ${ήWG-5'Ha euPKRT6{rڍX,(WG;׏+\~*#5z 9ē(e9;W!tѤ4k"8 H@@v2Jb\,(?2EQ٢SZf,t}8ex&0pH]1Ĕ8Ƀ>XkFhu IlrL [|OOW%U/JHpz#: "Q0> stream xYB/֚GuqH cOZI)R>w^"u:0_汣p]'߫GOGRU͢U" U0*.}7ri'j2%UUnFہM7JRoPw2 `( c/0#n܎`.,}ݍ2chEqpWqx2.n1HrVÎ |2KUXF$9TE~<4v;CU1w$lib_~yqFJz|f\Ekqm<{JEUMY&I;_T$bEn\YD }`m6ڞaRũN/IeFrNh+̚nxIsU_LyUf_kآЖQ'.GhB%3c$%U'`C||vܛMs8L[W)B5c5f-r5Kvh:p1Y+(Te e[U0oBq6ɀwwF+ `20 eao6FxE;w'^x;+[n٥<RrG qS 3ތ5A-fګ;b]~?#fwegL53y "v9fU':L)uQNSA_u(:-"x˻lZlm6bJP$ vQ^V|{^$d/6X Lk0dS2*֠B 1_>d< rDNڂyVW7n٤w;_,.Nߋ,z`Bi;$@(?4m,Kzpv@cA,{4ȾUc^ː5GӮ̙}9{6iYײV-ZJvk=mh4BԫǬJo21t;I ^bWn7C?+@֕p1\њo[݁]?VWxAT{'\'$(p7yL߂0;į,cDdP&#Vqnz2TKDy~EQ>X?>N(&$,1ځ9Q5.2vc|jՒ\࿀'H5/C_`S2\ x0Vt &O4P8P[T/77BU7XuN<6@ TSlcd/ӐpڼŬiΑ*˃ h0lj`: .xfEXL7SQX鐛nt ϋV)hF~8]U|9r_%7wdqyטA6Y7LB?IMÔ޶B˷^;n S”(3f} ؚЁfn8쨇(]\̓"ؿs%xg"ŧMJ7$2? 7ry R8Z wg9-Ώ"Bl7Tݮ5Ϻ*ڵ]" &ߤee3ozd^ e aáGKxJ5-3c~W'-z|Qjz$.k]߇=)Y"WDO]!hjp L(TQ;Ez4}*я;},줘߉*SYϱ\a]T% :>2jpǖy~sb@9ox'S* 7u Ny[9!7łH5qT4NJf]KN#_Mc.n`^3p~%wx+RrÓ`Lݲ1PMypr<9t nl;)?2#t 89jk{1{Ӈϐ`xL?KNVSfPpEtΤDhCbWR:G: ˉ iUDS(V8! c]܃fCʰo9sb7v7{'* :*R8GI,v sǧ|GwX937~l[_m\ ,/5._)Xi+.ÝRPͧbMUfwzRJGszId*wk7@]p+Y*Hs޽U6'8,eyW`)eL eiyȣřNJXՏi1|Q U>Ҡ{߯֕-$S"Zd%S™ F* endstream endobj 2299 0 obj << /Length 2777 /Filter /FlateDecode >> stream xYY~%bѼ bN2`[mZ93B|jͬ$:jz[}{ū _nfJU{b&bWw4w˟ػOo+^ NSۺ]i4~j wZHŝݶUk5{uGnESi;ݭ78E[6{l9=!shjz: i?y~P5?jm4\;mWFULf A(TUPidPFf7AI,LF0Oir~d6)\7I8lqO[;'A3Yfo=׏Uzvnhl>􃍷|&mMvzY<୺'uC` +CWլFf>*TW0rZ`)/zk^"%tH02*h[0&G.+dnmڎesw 좼\vo2Ĕz+Ww$[M!fɃa⺯<bSV{U6h¡?^;9CIn[v}[k(\|_d 3k8ˏF !g _gLJdP,!Q}g^[vr- >>+ű*8 130򁏫SNL f&PK+XA20')ǁ(A $7d `vqh0 O+4mH hewVw(QK` w 22d>13#47G#8jZA=Y'/Q4]1*9ؑ_)uˑw8Xp6xoT+m}3\wk 6_ưWנ %u#?qzfzl6FeKcwv 0K`g;[Ty70h-I_lE{I|Vd&Sx"vAA\* H"ݥתYQMRy͖,lBZ[V{lqԥֱk]NL;@@D -'Z2 A, ibaj;s(VQ2D_v K!n 3F:x| eo FUJ{3y{Bim]#V-V?~RN KSO|lkϣI\Oy=HUZY #x<>sZTL;)2=Ȕ#DR A+`فk5ICY8@V2,@4 [bE|[n2X-8f^$wͩ#|G=x pfd8wC'! :۶ hy!xk $Gyn'(#E(``4Dkp4޲%gB4籋Ȧ 1ӈ(_x^b􍀗rztj,-;̍{=]M)i5½M"grET"x*s_bP'ػ#+`K2:Ah{="]@,%ד9`λGhF9GR6EgS }SO= cJѣ17т6v"lD4iW΢ȹ.>,XZH,cr%KV2歄OqE ]*lN LKlb$|XXQ;vcJ|G2E0[FdQ]BgޣV2[ ֐9kQĠlwj|U_K#BLy}%i k!"KnMYsB1dqB==`w|H-Ki -,+J:'d(`_ طa6m?7#l>4; uWh2pn×Ϊ<n_2%UnXu(v>:(CTU V9ŸZ%z(=*=ބ'ox^shX+.ntBh"g?;U f깞OKvT/{!#|"$CkuD ' T( =[B̅(EǓyQ: {,ĉ@4,&?t]/e~ m` ݤH3k[P ZFlz<#?X l+o)-aj9z!}oAM9BR\V|jHf7eyK)Lbs(lOX[`GUަ< )/7ypPQH)abmCḻLi+]xD何.n<0z7rk9rK>?v |w0> stream xYKoHWXF,7Y&3bASm>4MN~$%QNn{RUU_}W+ |{y$UR{~n?o޼Amҍiz~_Mt׺zyb_! {XO/VAeU!( Len;& /wh!snR)XF>YJaݫWshdDEau68%>vUQZ;N*Az@֤g"@?巗KD: C۰; ŧa6-VmGY"4 Է-z HI⸗)E]p+,/o_>A1QX|W`wŸ4T '"Lm%V쵐 ) G:yp&a7s-o ORn53" },58LXh|ux|*:G MKCⶎsIMz,HYWk\' =H^.8g b+ S=[ '[ S/$X I(d!q1Mǐۻb~3ܺN*13x+2= vM g"s Pcn`<%# a^k]Z#`~)O:M+UcV $BC8%l3$5*-),]b"pE?,mNju>Xs~nv14P?l*@RG` iC&?%XKګZE#n/(3|JaVᲚ V296@~]1ANX8~JԮlI0ތJ_.d]0Cijj\q~BP[\y*LFX6Ltf> '0,Gƅ`yA2Qq.OJzG O(%r$j*@;C#]oƎha~`@ Ŷ#v(߿K$$wiW[{:YwoQ}S,=|כ\>foD0'{NLnv$`G.#̱҄< +< 8AH=)Þ IwO ᅢDRY yĎvT۸ 3vm3(`)10(h՝_uwh;F`~4Li7_=h~صaz.W̠!"^ g'GRKmlݘ57 bUT $i?P| c.HFQ0 Hg`r0 S!# v3X"*g"9X >Rӫ"q.F=*pGC0%Ez2^n0O/\Fwm_}m9#4N}iv;-;w>{gOp3YmKOg endstream endobj 2316 0 obj << /Length 2399 /Filter /FlateDecode >> stream xko6 7 A^M,R{Eh ƦmueɫGEYn 9$=7̼xxW -ֳ4v3f^/\kMm:XPxe:Uw9YYU<[ͷ.xR(,/2 ᪫SSGL|ysPQ,;6[F~{+|hL}u9Wrtw=s~u( ,|&;im\'i4fP[D~[5e@72{ ⺪we8/y|h̼6KR4=#<* WH 0zUbJVa 2/F%+Jsv(w !'Dn h #E5>G) x¸G>r9܇1}q^4CuW2 pRPa9n[u-(7yGI>۪Diƙ5f&֒ Rukor͟V4(W3Ժ-^DΧDwIB鍝5Jġ8&6w;X|C:f^"ڌ r;tl"7LkZ04@@C ȅ`)nHHأILiuo}mC,*g[ͨ\W =JVb:d`tgD0o0b9_D ":"RHLG8!ASd&<5f '.UEDh`[ɇ8ԹߋLŗx=SI0 w?d^/eƔ  ]0 }yzȅ{?lvFpb $d6mՔ 8m B\^WNq&a!S~a yi"7eWecz5F[C$4f޳/r?Y "!<7#9ܡF4c]'0 `c18 /9Sae.5} KNaޢ5Ѓ: L#M-POL8GBCl>^\D+qfY-0B!'9^IT*tn/S^L2Z4=>]Gi[ JFTnpcttHc̗RrhzCݛBc|l0޽b|hBcx .*/xE`f? 96-ko``@uɀ5V0U >\(*rl)Y<ΔE3x\6.'1"ֿ{zOtwńn+O$B,z1ܕӜ5 =pg+x\[Y7%P1x#1.IBmhDԦ"OÀhcF+l`q;grVTlG%:;jIlvdhHlZ ~GR `Q0YU-!审pM ը9 Ȧ~B=^|`C1zFdLJ$b#ۜ6V8dǣEՊ'N94VQ!z#>%=7"'̧.o,j 幉m;59Q䡒D^|SNq}7VkHKx2oVof g S[:*GL>!#~y'wS-'dG9YW+?J?hlmν)0r=hYϞhU5[\>=q eK-@'jbWrsH]EEFY1ڿg7H72 qnc}/lHp7=S*~RYo͡)k/1}ʟo# :zgv"yekF->4:x[+%cYq*K'J rK/.) lPqR֍iEK$Y6.}u].J2Tĥ{*ڣ17q $Rۯ]}d鄒b"Qoz|%g\n|D@{|+ֹ|} %OlXKEEAq c'"*5{.?DnΕ畭);9̬j mPÇ3c{di7|x `#vɟLs|_|^{kqݮ?J#$o+\CqU쏕rۖ⋦ھB`0FŮZuqUw0EBvUʼnCznMpŋk endstream endobj 2217 0 obj << /Type /ObjStm /N 100 /First 967 /Length 2234 /Filter /FlateDecode >> stream xZmo7_OEKrCu/@ZÒ3Zb+%i!wf8 7ƙ|0 ?2!b}uP njA&R\g#zx&ydu@&N"gOz'X A SrE )_Tx& FI Ť܁E(S] "8OYEt:=%:$ԛR,V}TqJfsU1(P>,]De[ %<bQ, n(9]M%K T!.$P+09g.Rk2$ D5-g)*+tʉTk=I 'GtU;l"KA& E)JV)g:ĜTLՔr4U!Pͤx#U ov%RHG'; Et`w:qr/']퉡nu63M-$Uj)Mʥ(O=Ģ/`#`M5GrpVLޙ\@L0\XYn2ũ$8NB|P.^s4o^MX}2¿wq{w>O]qp1j?Sua{X <QN@[}oIa8_y] }M |bN}.6±Ȳ:c R7}5͡zvd=.f0Ew/65QG^ <+G Ktʑh0\I¼]{~<ذ#Ӝ >Lti'[yĿJ ]DWeA L|LG2>fu?1$۽,WR^&c,(?5;止 ox}XwnHg9kP,ڬE^Uv2[60Һ.i5%U[Ise%dY6HJ xfy2WY2O 6!( 6!S$egfTզZcsLn4vi.q3wu3п~4o&9'D?[48}]:W4"b)jcg~1<<<Ўohxe/ߛW? 8F]{y׿^w܊L/ mVCmBmhVr=I?88@z 9w4GvQVyr!歌,D"T$IՆ;E *7ْ6 *F=d5S߼ɶ-=c \>f+'ӿ.DS8?O=fB##xG@ h XٜFI}pڸ<٢dMyCdE/|7}~=wgß^OoS,<[* kecY"qP{H v:dqQiS#||6|烝Vl VH͂t$."r!/j{Tϴf:xrmM4OEv/~?ͭݹKH<FL u'eCYWl֯c8۬D?os)kkY#YZiRovL@dQĝAN6=Mn]8 OZϞ"Q5Wpg˝LxoN;TK24~8p-s]-\d]9i&B endstream endobj 2321 0 obj << /Length 1867 /Filter /FlateDecode >> stream xڭko6{}%^b tڡKE@KEOۏ(K^63g#׋؎C/-׳EhA0\vhLgݱ7]+ ??~C~ 9h"ݹƮ!9-S}fM Aqvvv|:ZVhu#I W' bͶm(oʏ5m]JՆ&h.ɸD#Keu^|ZBѦw>Ri#Urk.6&nū7K"e _Wŝ ^lm;Q~[^Z. *c!SbS,c6EJVY0l ް*+sAhT4D+HpMjph`X/W>jV]S'S4?I]rT? `PzGjD$YzP8ddޙ;# @aRFEo펴ݸv# D- иL"EP;(4ZbAXb"SL lh7PKY 6r!ND H1cMJJјŽNV.@o-3YHad<J 51×ⷹyCn˧@,YJ_X-ukg9<EvĦ3m/B 0@/P:r[7 _>x/b%o[Ѵ+u+K$J~cj%䑤p/Sj>lF7??P$l:]b ALu W[]!uv.gW޼XvDo Do*Hu?Ax߃knz6˟A=[~ʄ~üc ![5psthr?;Y%}TOS YmT6XYIbQN߾@+&6w'q#?B^PtծHxMOYff l( U& ja5-D ẍ́{:LD/6ϟ{ qA:> stream xڥkF;b/x$@wHp@],IӪqcOlJWO_Zo]yy}y _nzJU{rSf;잭 v,\znǼFgU*a Ԡ7|R8B-B[5`#K7n~?X_^9KS CyDž@e– 4.x0LPBX&<}MGnE3B: '0u9jeaaUl}ܯT d}5vf#"S݋ v+:9m @N3z]]3ʰa]yT5vè=1,ݔ<6q,QƁb=J&6m'ke-;];Z}Bh٢_! [CP$ '>EknD: fNPU¥jZ92tp!M+s])={y hF{ 6;bIΌdN"!zC!? mU[Zz_ȁW``m9UpJp2͒L}Eە^! Y5>z@n$qS`~Y~Xs.nfo/$sO$HV45v 8Py)lr18\{J?Ϗ}qlruM%AdEYߎ `x0\/>Q76fKàz(TTm;%.B\x8;D.(EfQu"7 v' cGg9rwAIp6LlhY 3 Vk͘}"Q\a׎igؙ$ԦgJ=^n˺cq g| eEy\4*CwD}cB6ؑznbVКi+4 ]uKa̖= zp袾ÿ;I"/r8 ! ԑUˆ25l Rr I~iU֣RDN{*~Z]\lZ0؊S/bd^I*tEЮ=+qx u,'p'QWsg+zk! |o8cyeG$UPYK \y |Rm:AƁ(in琌֛d.$1D~K* Y!-nj{C2MY !ᐌN~R~~C"‹yo:rc]sf)}BvCQcʺj="!+ ty{|LA6ŋsK,NV{#|D,@,7ܴJ;0dQD3ɿ*bAK[Tf~KI%_x⥣Åͱ!?3UݱNd- M9EaNvx7vn \#AJ++ʝo^HCrAOiG@!XȗB4 o) 7sD<xL]SV  $H-&7"*S-"ࠊH# V }ۍt#5̌e2':H鍧Xt4ӷ7Jns@2uVΛ݀f7N Tqp4F㞱rTB@w'XR֔#;;GpdȦअnأjۘE-$ff7鮭%|^߱W7?x>يzџZ501Π9B׮- 驻0?1(M{(??=w' w=?A(lǫG endstream endobj 2336 0 obj << /Length 258 /Filter /FlateDecode >> stream xeQN w .9qe>mFgB¹AB> stream x}P}O˲kc ނLDEsTybr1XU`0 <TTG(:#ź VR'AG#se, G8pJ]if.|?P3===vٟ=lkn6q??BS'6;P,1m}nۜaܿeq7ma@pn}n`F p76[?|uuG}/~.8vC {K```rrrBBN!ՠ:m06ӽO}S.]Zl7y=z}vvG6٤^fddm6+9}nq݆MvŴWWmX=?O=D㚂<[]XXo}+,,봴~y__SCB '?y_|bvܻwRJLLC ~M8v؆|`ޔn#=v}k_Mv@,m=ޣ_o6w6tl߾]-h4FFF:ݻⴓ 2*>??Ll<M/ɦ(+_Jjj*mp p|NKJJmlN>/O +++i`Φ}Mm&Iզ TJm(]T/| ,fghh<ځM'=6~1M~ҠmmmgΜҗrEEEI݉u-:~_aWe&$$'tEl۶?CJ~:m3_ ҡ%]tWsNuuuGG7F9̪IRP:p54G3 e)!uu;kLX=iOJy^|EtUuGC q$oO|/^?&)$ 'BW M|ӟw' gjyzmлFNNG0~TA:4/#==N!3hՖ;rGb$+qhͧ>)6/X~?9% j6tO>z'?L|۷oǤ)钤m&H$H6ҿ/Dy R~)_2m$%%I7xCs ͑F_mӐQ=776Ν;GoxGmhH   vb۱4d 2+gmdz !?~̪AEg(qvvVZ'>m6m^xJ+kۨ U=88xiR3 ҡiFW^^N###Vjj*wzt,wTgc,{u<ܣ6kљ_2d'?ɶIrۨeVڴLi -{J-Jn#6pM6tQÇ?o۶6jynp8t:]XX+b6:J,mA~h;vPgffFii)݆;rGuKu<ܣ6ޙ].׷-zo[Az;k22dbbb؄LӃ(] K-6a;G? јP{4fu+HIIvx6'SB}k_lYYY333qgmZ{Yz2^zijj?g>[BB[ovQ˧6lejzSS9 ̙3g;2 bVSph7  A߀ 8vn60 o h7?pIb"v 6n6n`\N40mvlJcb o Lnsqpua@pn}< a>685nqݚWkkkqpMmVҼ85we-/nfָ7,\Spy;<33!88877ҳRSSL&ӑ#G(ݱc%knOJJ7n(o44IX,/"m?x :::''nʱe"ënk6eggml6u:%?~{=^/(nzzz޽]rhxxޫ n)pn366F3;!q:^ANfШgJq:555եhK舋pSSځf5ros_J̹s=JS~:faa6FFF}{ }NFR9dCTkkkzz 'ׯ/--v^^^p8/_LǂXZZ:::o6U5{u X}>CCC޺J^nV6hСC|/ȎpYPPN nQN(QtR-''""^fgg rfddܹSǷQbcccBB%Rf {&öΚ4n6O#2Q6a!e&)))1j;>L&dzʻaܿ .<h1`F >6YYY`ss8`F 60 o h7n0fzVHpq76=0pqZj='5n#hQ Lnqx3bW1pMtww'&&t:r \9b%+έHܣyJLL %ٳ}fS 8- 5ʲnEvNgZeV;9բsc%ejFvtrׯ/--v^^z .s[m&Iik;SƈT1::5nn 0N܆ S{PfWH9բsc%e~fQ;zcccYY]`=݆Ē^n߾qrQ)gN.ٸ.]D1b݆;IW$S|yPmVTTd斝Jps15uSNQ u]:00e{S-=7ZPgvIǵk׎;F F h~uEIeF<ͽp1Vn$wH_J^mqjnv%'ܜjsLG6m'S$exTSm:iiiu:]NNKY$z\\\TFW<:73;Hܣ;w6Z!ܹc0n߾믿1;D-ydDC7an1I,((P.'M<&tjsV! 67SuݻwSOO͔]Q,+@',1%,+X̽m0[q'yyy&I,cB6w닎joo\RJܜ\S6tA$&&^pA-ˈ v;fJKP+xܛ!at5rr6 pMm>G`톩 8vn60 omh7nqƦwZɅh7mn 8v{f?m/VÊg⸦m֡y6fG-qxCs^lJF@f,C}}=~wh<332PfG$z򟐒~MlYQ `v[ϻ'n^*# s6:;;mf߿'Q- _lYCY"0۬tRy YSSI䮮.$7[\Upl;6ccc999F1""BIVVVjjjPP89"5+sFkoo~Boo cr[ Z'ed5R~I-{ 3جnQ˫m6vf-ʝTTT-8˗/?uuu,3F4"j9N?6ݻG#SSS邜ʏ)h%\Snýy"xqtmV2jy5ͺۺM'; 8[mTf U ɭm-lTKp r---wޝSژO-ާw9jdڵkŋY{/={,;SqjAjrR1_Yɨ0۬p:PSSC/O>Е544$N*Źl&==&Az,1((pP%vcrs Jlłʏ)h%\S6r!+x6+afm-߷a /..666&$$Ьb_9T&rK>pK___tttTTT{{;k%Jj 1mN4b4(FmCf\9ixlii{.m3Gkj=FZ|y*K].^Ȃ2gٳgٙDnǂ,j!46 + 6vF㘹9Wqx66%(R|Ax;sp8hv]^\ tU9Yn#)3W= 1F"""X"Yt^^M8َj>sɠZ9O~8۸wm!hT┹XvS-'wފ)_j `2#ONw±Z,E1D*(]2ۼ /m V%^vرcUUUr+qʘ\) 2~nuuᅬ3qx=Mm:ꫯ2m`̜;wѣ▗ޥ(.N 122"ɝbkjMHHȍ7>|ȞTm'S$ _?qi2J),QԂ2_r_7!742$4JJ͛7-n+cs!XS㕕lu}rru-qmsݻ݆z5MŕT1w5Gn#G-25Lvx" yϾ8={,;SmZZ;:.''%n=%V&EGGGEEs ̞% 4s'! Zn/CBssN*ֆ.uʘrPX<ĝ;w ۷tq:0|;III9v6&q]qsrs7\S6rsݻwCCҲvm+cC6Bb~~~EEEQQa_h&B;v`'O$oIVYYM6<ʏj9歘ڲnFaad HLLpfًceL*~]mSƉJr aj7  n+'m<ժ~XPPqxs[VV;Dss3Z}n_4o&osq76h76n0 8vp_]n0ffFgÛݤqv76lmV&n7M-6,@GGG\\\pppSS[%2L@YBLL^ݳg[%|[\[ۣ۫v ?MfDŽE[A1b ZrvvvttnnC/KKK7< #۶mltj6Lׯ_gQn᛹џ>Tkkkzz{8^Ls` 8nݝH`HII9qɏ򥦦wi1w&z5s6ۨ7k_rJ.1ҭYY|ٻ )D``{8ޒ 3DPn#ny8]?ԾFVL)۷ow?։SJÛm:::hȢ?6ݻG=cvy6w&z5sκ Wc؆٭+V ۯ]vر*zfngeeoFtq@Pn#nO8&&&ٻvY@ ŝNGnC6r̜;wѣ/ݼqgVvee܆ E7oޤQݭYY\|3m-m4BÈZa=ۈ|8^-UVVH} >WVwPB%Mns)Jijw+4wjB6s6a*ȶٳ$ٳLQ"w;w++>>R*џ%""$;;{llLp 6s$K4%zf6;+ZXs`}6UzWn *1oٷo(p8_>wjBǝ9\S[mVd)ϼ9~v wVz_QQQTTm\@ 7+--et999,ɓ4!*++mͫ ̑8A6F~6pW. P+W cxxx=/Tbݻw;!===dNp^6 Y?,((^چqxۭ= 11… jhFS?q"5fuW|M7x0 omXn}m`F pq76֢`FM6nG!nNo5rAavvvttxR+?4n"}а`}ܦ#...88Ix&fۣ۫ +<AwS+ :6T^8筘xþw?msӻF1;;[*50V;JhLe%NKKc}Cē'OBE1Q؇ u!iaD+5RO\S6ޞgC-߽{7])===$B+')IOOommRI\fffH98ӧ?<44qݚ(VVVرmsijPݔťg句qsg߳gϲCPy+&mةinnސSXXh2/\ƃ訨v 𫫫%Ijv Tdэ H o7YLGx$j(LT<7u]⮡qϩ6nNxŹSԊsWYX {ʊq4wkdF[宯w?͍nύͩ6Zz%,}YbƣGس$Zٳ츔ȭMrYANGV&ƺͲK[54h_mSۧxP܏)mRŹ@*}n6/Rjj*[[m]n}Uٍ.FJwv8$$===~v 6ܥ-A>988ȞmܜGҬ4~L{$>dO sСC|5YWW֓;::p.+ O M&S@@@bb o~"?rK[54^jzͩ\~T[㢽ǔZ].^>;*tIIl6 Ԏ*+lE֓t`C/X݇}M6`s,ڰYn6m痳6l},m2װE2999?? p N_EK7p6 /E6+Y6q/*Ox,0to?Ҳ g&uϰO AhͦwA̅6puU\Z5I"hVsedae`aʨ# sK1v{xx81qey1Ds<33J*77WV݉:`08q͋ͭ<7Q{g54F&rmnS'zue3klo^n6Ӣ n(# sKQϟ?/EU*8Kf?/1Vfggml6I]ԪEOY(-2ѫ\GV& G+Dp:S'sn`mtF-̓207^07WYmmXACtXXnw:t돍e#J+E{ke8xGN}jD݆qBͩ\~.+-+\sj_;ۀh-n68{ FUv{Y[ܣ> ԩS.VKQZUg.#_ko:nthD݆}K*Mqs*vNA,)9Z;ۀh 7^07Wŕ_^]ٷo_GD?sZ(uиO6CBU,mܜGn#(%8:WkpmtFZdan`nTe" {_.pC1<<,#,={,;.%r t=2Qcg䚋D4S'Ҿn]Ҿ}MmˏeFP|%Kpj5m^kh(vglTSU:wOO͔+lJ'6܅ XW۸9ˏeTP|%Kpj^qn63MVV _|(,,4L.\|thpBU,mܜG+%EEAg^szv @#<[_um _m[O /POp6[2p6p6n6nmͧpnnןU( Vm߁ 6Om6w<6nm1֍Q͖rM pttt755DedaAUY{ DNg0RRRN8eQmmq~ϟ*kAEΤ$(,?2Q-V274 ۀ6ja\.p# s*kAf۝N'Mll,KY+Qmms^-207[s SNzj`7+b%s#J nÍ,̍=}=oV&JF6p6r3?öQ NKKcNa7+B-s#J w߷nmBX6H޽p􄄄x{ s1Err2pn6dee1Kinn~=L .xul`'D;  ]Ap p _3h 6p6~ [  pV6n `6ǏOJJ p mh6==ֆ6p45lOOi> pw]_ҨnmX nm|~SwX"_a` RQ f3\a` Fp1-[__϶NgMMMdd^ONN^{}di.Iyyy}voⴻ @Jদ&;11Q 'N>|X{;v,6>rц6pl9[$c~~a䱶h^fNLL?Ha1}nv SZZ:::J{6,sTT edf%XQp\ p dX<@6!!!eoݺ%eXXXRYYKVU~8цOþnw:6bQp\ pxFW`<6vhhh[CΝ;T>F@J"N:EVm!^a` ܆{gOOOomm qÇ+=}4ur!*WTTi|jɾ}/ /0tnå/:::**] QYɴk׮/RbCCM zbaK+ҳvxo=K\__OvZZ+rrr=WWWPZn㿋6Xnvd|=sY!wv84􄄄m6l楗^j]z`0` F [ V~7|7XXXXh2/\Eo p pٳǗeUzm6mԘۿnAS  p6p6F?v}ngY' pZnX6>ηU?8dmrf+(nnmrrrFcDDVVVVjjjPPd:rR ʜOlnn{YSSI]]]^ 82www'&&t:r -6p6ݦf:~8۸wI`wjj5==]}z#emԊsd߾}*?&nn|m<닎joo xPRVVF7zi'zje)ܜz=66&șsN^F) Hk8߷a sgOɇm:.''GڳT+6p6/xw{nA:>pd2$&&^p p6p6n6nmnn m6m  dnsҥ4AY_mmL?l-*ASm111W^u\ qCfC{w pm4kVxpnmNgMMMdd^ONNo~M' oNoڇݱc%޸qC]O^^_ũH@:::TpppSSKlnnT={FRhoo~}܆[%Oѻu:`HII9qA*p6@TTTmp_|2&`UAxnnnIIĄI̦e%TnR˪A={+--fh2_II355utFJܣGEEPΤ$Apm ຍ2$SHHGʭ[Zqqgvv+!*++Ɏhcrr=#'wo.cύeee]]]Ruz6jU=,,n;Nr%peq mBCCmkqfY޺͝;w ۷_~[\Ov=<<VIpĪA njjbu:`HII9q!6pfMEE˗<~XZܒ PJ.5өݬȒUUUz*)**lsss=+cP?{]]4Q_ۨ򔖖Ҟf3EB:;;塸6p nF))$$#֭[Fdgyfggr6&''S=z*X,SSS{V/,,ȈJ6pj ?,,n;Nr%peq 6j1Zq,ͲT߹s`0ܾ}_T땫OKUVm-ԩSMj fنmmӧOө'mԊ:tn\zr-..Nj0+<*sWpk?p pn SplQ  bK鬩]]]nEx-Nn߾bY'p R%u?&..N@\999F1""BsVVVjjjPPd:rZ9YG?> gsssLL Փ>={Yp 8MMM,swwwbbN3 )))'NPp pnSQQAw71??eڂɾZܒ IˮөmxUUUz*)**lsss=?~mܻw$AP%nN֒SSS邜9ׯ_g!>čmԊSQj+2GEEPNy$/8n(xܺuKۨ83;;dG199ɞSb! ̹s=Z^^.)m6 r666uuuI-U啵R+N.#XXnw:6lL6p p6j1Zq,ٗݧ2Ν;ۯo-^\}ڻwoKKݻw'&&n)mnQe$vڱcǪsNmj:00 ve nӧOө'mԊ:tʼn钒l0O}TWWM:juYbƣGX΁zyA=닎joo444Pɓ'CCClYYAj*DDD챱1AΌ;wR=ڼmYz_aiiiNQkyp pnVUU ꩄ,&ǏgEݻG O]]4 |([ii(l6 ΅J8ϧDnGA6p6`2QHHGʭ[Zq<^ QYYIwsژdOꩤKZ񙙙s=z#.mHrDr?ZEHK6Jʣ{ p pumBCCRkqfY~mܹc0n߾믿zrq:׮];vXUU޽{[ZZ޽;116Z>J"pTCAGA6p6`MMM <}4Ǐ y6j:t,--э[o4)qffF<{A=B].͛7c 9JbQ~"nTnيURݫmۀ6rzbaK ߿_-[.))1Az&fZ#s``^9sFPO5222vI9O<J)eeeT1j+YbgOw?yTXX%6t챱1*qUm6mq9~TpӇm!++Oss3m mp p pnn6m6mm X#tRBBB```RRArW[[7|p p;nsU˵Ȃ:%nn:g->2nhhm6mO鬩]]]nEx-Nn߾ފÇ˲p R%w}ĥ9&&rҡ٣1O~@/555((d29rR v=<<\ D%;::zMMM^Ulhoo~5ZG @l^Jt>6tkv8/_nc6jsssKJJ&&&h[X8TTS YYM2%A=?ΊܻwnMOOjRmf\(Ċٙ:|zz:KVIytS{+l9m_se[niwtgyfggr199ɞSIcccYYYWWT333Ν;zhyy,,,ȈdOD\.UI^"00msM_CCC^ZCM݉2 IjD].͛7t قn#S,'O X,eeedg,1 ={,ӏƄ^O5;wRb|||[[444Pz'ٶYbƣGdTWWSe[Vt nnmm ppn6nm6m6m  q]}XgppmpBݧ ?np nd6nnm>,e EX펎দ&,nOJJr?}YSS듓X昘Jݳg>P )((.XNNhnm6EnJiihlMOO*c~~ԋ?~L&KKK'g~~~UUpjjW_j***lsssnm6 -x p˥|hcddx֭[XVVgpp0 &+keX(ZnlA Em |{t:]vر*~it^6p nh\ZZmjjj(sHO%3Lҳ߷a Sξ訨vJm6   p6p6n6nmnmm p pn~fbQm6h 6pu;"bnnm^mۀu~)))˷zbtww{ w? rrrFcDD||ԩH Iq=hnn{졔7n(xd/}K'1:kjj"##xrrrWWznl!׿Nd,7EEEܜeiihlff{Dt%SIO<<yڵcǎUUU 棏>r)%44T G6p6p6DBBBZZ")>Gy6魭.555RbAAwRyw^rn޼I=SP#Gdff.,,v@@e8}4uf!  nA^^WcbbpAž%w?5NYbڭd%H;w6*߲Q Scc#yX,XÁm۠)l pn6nmnmm p pnn6q:lnmYХKW\?qr6pn \zr-..+D~|~F56m6qfoC{uP/q?mp-6ccc999F1""kv{xxxRR9>>~*R$= j9oz0e&z6111z>66vϞ=rawء+geeL#GH-m6mƺMQQfs+aMOOȕD~~2&;?>==]sm[zIq%xU[Ǐ{vt6MnJ%mI###,%88tmS[*@AεpƲ.FYs=z\=nlຍ^;;mD66?)NڵkǎzfW~޽---wޝ{ n"mۀ tV2pb6Xs-܆}_rn޼)a4fffu9JRݸR;:mۀt)CC,dzyyy&IzBADDDvvؘZNdžOٸ\y|􌌌;w6)uu5Uzj'O X,eeek@Ԏ6p6`f9kOv6p6n#'++yBssߵ_Wnm6m6m  pp6n6pnk477ztRBBB```RRRZZ m6mfM0&&ի.kqqW^$  #kfggGGG7۬<mwDNg0RRRN8~vAAA&ȑ#@ۣ۫vf/(sNNZ汱1zh4FDDIv{xxxRR9>>~R*)szw (37nnm:::?~)ƽ{zT655ut\cǎ{Rf͹QꦧY\sy9@P6SL1 0ࢧ 5g˺ٳ[76dd4VcgݒT )))$ $m6W=d @ ېm 6 ۀlm@dl 6dlC!\-%%%}pv7c /ٳ O! ېm#""~ΎhtWm6نR lbikk٦\#ۀlmзf޽>>>SN]~}ś6mV]rɂeee.;p{.̜9SO>-]sA UfBeeTƥKʎjMis{!6:H=>Ūz#G;?{oAA vs%&&%K8W&9mlevŊ555.I ۠Ǝ[YYi2$DFF[n]zuVV}.wڟ.]r-((H(//^Ǐ+jZ=&99٦!$ۀlmm6m$-&!!СC111ĉMMM٦Y_1p vl#X0.&99~a=6 dG7o^MMM??? &HcAA]ޒjnzE_~YH~~l&9yuzm@6lccƌC7nAAAIOhh.\taa, ʤgQQ"88ҳ1%%EZ>!l{|jtaO+gϞU%Q}ȑ#dm zmLb0:::'a['.F9lY7{vK#|'dl6iiiZ+66vǎκ%%%dp@!d\lm6dlC6 ۀl @dm 6 ېm نls0m@6ن d @dcM[[[}}67d @06{:u.,޴iZʕ+EMlepތ UMIrqqq]_m7ɾd2燅i4ɓ'WTT8[6dlmˍF],I`ݺujɓ, ʳl۶->>ڝݘrڵΝKLL&7fggGEE *هo)pE ېm SqxcVVVL& gkk֭[W^esYxL?~EgdߨlG^6dlmM6IFIHH8tjLLL,--=qDSS}inn=6tvI gv ېm FB7o^MMM???`4+++m4,_}}}fskkkwMoϗ7o,lÇ6d 66f̘.xzz&''ƍ7LI)IOhh.\JOٯ>ktqW?K={&7vtth4Tu@!dl3e 9a߾}:EOAj#rvlC@&--MzyyرY$]JJJ{n fglC6 d @dm 6 ۀlm@نlm6#0۬Y~ٳgO~ؽ{wLLw\\܌3\4lC6N٦OfT猈x;;;;::ϟd @P66cͰ6ݺ6dlam&\v=MjW\KJJ"""4Mddӥ%##g]!--m̘1aaaEEEigظtR{u:]jj?d6m65H_~9>>Eu֩'OJQӒsfLt$ɢEӛ.1~Ygʒ%KrrrΝ;'ۿj*uvY  `e~ =FEhmmݺuի,gffVTT466 HH4,l/FMKݘlC! یlp677z=KKKO8ddڿ^^^NNNwD``M(^ulC! ېmgFcAA]3 ҳBjkk-BՙVy}-[S•jt:+"[cbb8Q__O66'u5 ^{5^=x(zG{pmϟϭŋmpm(y`/ %d0P@ ^2(KeXwhyhz#G|駼dmb 3i$uz٦@ٷƒF>36`d2o!pرfƌ555я>oFy(//ҥKVpp0/dmI3W_YfDllzTr.^xڴi2K/=3*Hx \lcSŒu~qgggxx4Gƍ_;v,77kRmAQiD| %..K.⋩&MRG=z˴F?d2m lxzzZ?TPP zkiiitt%۴Ϛ5[|A dAmN<)A%,,nA&.\`2z6ǎKIIʒǏKi"&M%ls2gmnVȘ={6ue;;wLXpF]PPKje{:ۼX֬YswXIfRSSկgggk4d0P J@K%x`/ %o=2PI"ƍ'/w  4sL^@9m"/^,/Yzz:{// %d0P ~(KJJԗt{zB{{|_7l@W%9 -髭rgY =(] d C=444$''L&S~~~XXF}l6K>Y,_[WW'bTפ;xK>&lE" 66} &I☘Fd93gΜi޾}j\>6l,f?y={VP.\`٪\ilbƔVkY®/GM;x7(GqIVdmlsu z@IIIGII J^2(K%x`/ d>(aAgmׁrŘ~ڞ&lED`7L(GrYY|ƌj399v]V%` nٲE☘F#8\\mjnnlD2gΜY<::z63~6\lKSL1 tl(ҴZWll;(;J@K%x`/ %`ֿ"Wكvӝ6 ݁>>0Gl1Ɲ!Ѓp6mmmdtQBʚ;wnQQE]TB7Ȱ=App4Z߶S=gYYل89M&S~~~XXFt>|`0HdyԸNl;gU"lcM}JVݲeQj'NܹsYnr$2p$$$t}ٳg3Jυ 644t}h,Q\\h\ٸq^n:|Ng4c 5陜凁 eDM;REEv:\a6GH(GzISL1 ۧx ۸)))IS4Vc^26%dt<< Cĸq%{`QfΜ <(ϟ Cŋ%KOOg%d0P !o/Y恩$`X~nH)z/6?)77= 3V2::-lٲ^QBB6&L0׿u~+f(ŋ'q@@#/?c<󌧧T2$$d`}7Tmٲet-x6mRe8v鱌 U_t "ҥK)H}ߴTrgF1c޽{ }8$$DFJV{yǏK=oFj3w'?+VP?1e5kL׿,=Gޮeȑ#RSSz6l.AAA&Os='w}7e遛nIWQQau(Kw{xx|gw2w؜amnn8[a뮻tWYY[nQ' Ҩ e>}e޼y[ n|/ m޼YZ>{FK/$-III[Nj󍞕+WJˏ~#㾖ѣG{yy_4&&&J%˩ .t:_billh4gϞDn2 Ģ~5k_Zgg'%r/K) ԯ-Z\{dȸm,X [lDn*((=C֍f9""B{=JK^|E󟞞G>w%"HIIM+"z+%rӵ^+{wl]DhhhL&lQ*){&U8'o?sݱG2_]w~䡈nf_|Q5|l"-X*"44ӧOT \{VwuC.]G)=~>vǍ'_WN:Jرc:… 6Rn*㷿+!!PFFUCxQPP`ӾqFi_x1%r7,{lӥh4J<4m4i7wyGƋk֦}̙S"79L.Fj80 ~G|EJpl6O0AF駟:g>sx.?R믿޺l\5yKSO=%-˗/82g۫jiYd8xرcnuuuƸ8iӟD}WTSS#FddsoFi8RZZ*u[p=V'Nj*pU4MdLd$f___///~g$iK%%u_xF2i$W7$$fp_SSF~&۩I8p@ BΚ5k [x AF-\Xrr/HK%kkk [F}(Hꫪ>>>yUɨ(+))Q^Q/W1[&ktܱ7ե7t uwuj LKNY7 ^RS{mzL}<==}d{\o}K`L) ɾ4d2燅i4ɓ'WTT%%%(ǧOnY<--m̘1_ڥS#?~|\\4me}j[rȑ#֟%VΞ=uqj399M7$ӱwuL>nٲEA111F6@ñ^\V?'$$9s愄۷o' lce: am0M2`0ttt۷O<ġTS$8i/>9(7/Y O_@%--M;///va={6]&H6]&D=Kj鬿 _@øq66_l&l~0ʦ/9ԯ_꧰t6٦ n=66?eoX/ӹ(K_} Lty_|rQ6=C>>>?t[nչ ӧ?3.XՄlLlmlmmĤ駟j'Nܹs9%ی@2 @T$̟?Dw Qdlp`/9~ll 6 dmm 66 ېm@@d ۀl @ ۀll @W__A~i ۀl ~z٣>ʞ 6@fЛ"""6 ۀl |aϐ${Οa|mO>:x_5k07ovs8 ww20?r@/()>[QmbccyO``  R daإ OE8S^O)6d(/ŧ d(/ŧ N=/^{w-UӮֹWtJKmΟ?f_{ooď>H57߬hƎw%i|"""qΜ9~qYH钒__[oYՏ`Ε_WttŲh``c=6zh'0}[:Y055=2sW/lc)u-u1ڝWsHdp%\sLD$ --ۥ}ƌŋM&/RUULR7xLHRGeqy1cgF.gQG-{=Z R0ҸsNK5Hfےeeg߱ C7xxxȿXu3tbvdpb^{dG-c޽2-Ǎq}ǎ-//_t>^6d2p rg_%FQ###,\2f94zhl#:;;Er/KʿO<񄋡g; ?,ҮJA2_ul6\_+..ŋFig^` ۀg2o~S.{t9͚5K Sr\&5qDyg=ul6Ckߖd._|!~p6ٳG&2*yzzjZMi5,,LvYdѢE223ge2ʄvRd}SneؒJ#m=&%y+d6+**6]_vVa?m񿯲}"00^ MϗѣG:u… YysΕ+V˄a?\gyk#k׮U]Ye.Ie]dmb@_ycy9CBBl2뛪2KV$r~ٳ l{n?CUo|zm]vVa?m񿯲ؿ_]J¹, ȬY|||RSSSO=%iwgm %Svm---CvvF?AB__g#۰oo}[6=p,S7- S\K-.:{am GyD Y {w+Ί?  8Q)/z\& ޾Df%oڌejki9t5e/ں,\eQW住.oLzdze].\[Ixdp'Pޑo[nE c&u}s'Pz39h٬/l#3gΔ+WZ7_Ċ0_r~ZupX?mlCyG򾝑!XZx iYn]K/„ |||rssz9u9h٬/l)-퓲p/;6/F;rm`_?miϞ==!Ǐg?l3 lMk&=66W36v ۀ?(/wӥK{ &*BCC~a]l3h F&u999y'AZZÐ`@  ,~f#').EvhhMvcOc@ Oy\o{YfVG??7py ; pu_Uxꩧ8 wz͵nmP@v@'00Pi&`Q pdPd`zWE={X.R^P|JKArs?8Iŧ Z=Baxal lau`id h4'O`L`+:뚏7PdgAg= C{{{UUU@@hdxU)?'9, }l6#t:=zlA6?plpQݝz~ٜ:ݷG֡mMjmaK&3uI( 6H7xCΝ+}ѢE_G76`6uuuf=!7o>h<|0#C7۬[NMK\[[+nٲE  Amܔ)S }tғmAS4즥iZ//;vmzR0mzRc֬YU?яvp Rݻw@y)>o0 z)(/ŧ-22R*66&@)M_z])C|"W7۔DDDh4y5}tА6f̘0766.]4 @ӥc=΋VVV?^eOuRuc֬Ys/m6V62-Zu7T%KrrrΝ;Ҳj*<ڵk=11kPOl35mW)2=w+..̬hll<ٶ65/FMKbyڋ/ǻ6#3ad] dڿ^^^NNj :gƺ نlc////ay޽>>>SN]~}FFuh~q .E_]H쬭ĕoٲeO6ͪ1555)'$ېmgLϊ+kjj$ثXî]g\_lSZZ6̜9sBBBmlttUt9J;VQ1%%E= fV(삩LH?vJ$zg~q AyGygLfM6ɴD􄄄C6a+WgFMM pSd޼y__ߺ:JzS|߷Q9,qaaa{LϘ1C-陜ly\7 .g?zSL1 ۧŐ.~ZZV򊍍ݱc!pУ8Q^P|J(/ŧAS x_?P|Jm:)àk֬1u c?˽[1e06,!~Ϛ[1ev 㿳[1exd( 6ƒF9}/oPVV68i6/Tٯ(##Gpp0!ywv@mGYbE}}}MMM``jjfYSRR,=ZZZmgoFg+ ց _oU69Av̊F! Er'8[8Q^|zrrrlmnn.zGq" pУd+fD6 QXPP|r=-𚔳ՙVCGyGx' .X2=gΜF}vK ,p†谧m#GXX9{&IIHH`?zoX7!FRR:RRR~(/8Q^O:ߎSվ-;C뭷ճ Xsv?AYVN8Q`JtSܕ^ݲeJi7nܨ냂233%<6tց3fPζ&UTTh4uٟv.HT%\>!!M_qxN2`0ttt۷OӍ™_Ch&M\s5}6mb@ҴZWll;(/իWlï/Pg6{xxx{{+q?~= -}&&&f2/R'= 1|ߗ}?ebܹ = ͛Ǟw\ti/iii=z׿/*!GaLf>Keb(zdy'lYYr-T|)/v^/;Z=<Ky1s=_޺qO}[C;xxx;v̺d23FGR%p?۠_mpE*7|CCOJC~C_nPee=ztlld*jo}[.!!!.] `Hۼy6?Cӧ6%ۜ9sRa @ٳg)6`7nm6=f -d0lm`f( 6ƒF9}tmDYYل8'W=۬X&00P5jj,)))l裏l۶->>aO zL̊Ʈ/IY5{\lpd2߿?///''&477z='&11Q쬭 6F`{ROpIb),,`9sBBB4ĉ===G})44w… ,=oNI`vQV(& ;P񦤤m(CT}}һ+F~i ~z٣>ʞ@fЛ"""6 |a0Ky/ _P^|Ay``='Oʴ&iڵ&L׾qNE@@@nnK(/dAmm۶EgLL}g)/dAmƍP__ٙ+mٷoΙ3@k.\>l˖-eee6\xQfS^6$ۨ LL[7 krssyl]f fd{?pҤI)S|'q(..N)/dAm]fWcl3$MhhF.~mm6?hwl^y ҥKO<]b7=w6 / 0R^|)`x'dMNNމ~p=HyW\ɞX`(3g00.]*ohhMCB(/ 0R^Ky/_P^+lp6%%%&22r骱!--m̘1aaaҮ.]RSSeS?[YY9~8f2eAyɓ'WTTmeV[]]m6e:%%E5.Z(==Ig̘,YsܹUVɬ ׮]+퉉2e0۫$ F vHX\\YQQhx,mmmj_x#/^Ǐ˿:f-G%~|?oc2ߟZ"aYgϞ=b nQ:;;kkk-q[lӧfsssjLMMuvM eϟ7&|̙ho߮%Ow],qJJV,V:::cbb99 0R^Ky`_ |)/ .Ymc8!7v+v6 &m6 lSVV6HodddXrF9}t z>---/r||[Zmuul锔 le:Foof̊F#mz}w0Lɡ`0dXPP|rI׷l6D6 ;JP - .lhhggϪιS2LBBj3gNHHF޾}; 0R^|Ay`_ |)/ 0[6P^Л* lc24ɓ+**$((h̙2} &$''ɂeee.;pECCCZZژ1cHiȰCpp0yΎ2 UUUFQz-Gyw~a˂l---۶mwEӛdzƌWM|Gt6-GU%K\t&H gkFչloz~ls 7vm٦Ytx``%8[5yϗ͛7?h4>|X[˗/Ts?C Jyw߲eN>m6%YV[WW'doGGGqqqLLF R'agKKKeP$99YeP' .lhhp8w\zzz``O\\eux@@@BB\w8]Q"0ߤ$iᒒjK_ |)/ 0R^J|c/Cd|am$ꦋl6EEE2[^^aK oLdee͝;W:HE9[uRRҴiZʕ+/Tݻ766gԩׯw7d2燅i4ɓ'WTT83322`^RR!GFFN>l6jvŊ555},2k.SNIpu֩'OJHyp!FQVg٤l 0* @GXuul锔 6ی;;;cl#=-]\immݺuիرc+++M&H_qt:xQg;ܞ̊DG0`h,ƨ 'NhjjAٴih4C]q;gzvW3mĪmFd[XXu3iYVN8qΝ(wel٢4:|ڍ7L  ֿo9rٳge3fYOOdgp***cbb4l:aT˜9sBBBd۷mB٦F92e`طoNcMKKj^^^;v젼 / 0R^|`?ս_9:,c C`d C%XOCCCrrohhzd2燅i4ɓ'WTTt}y/( 6HEppڻ._5ӧmY[PPpC` C{{{UUU@@hTX&00ZڵZmuul锔 #*۸M jii~H,{Qhggmq̊Ah4Ĉ!^b6urrrr6m6ǿ---!5yK9|<[WWg6[[[]ݝ֞(vvvmƚwgJ;a„2i,**(..h4AAA,,qaaaח?Enn .VfOks ۷m_P^|)/` / wl|M!0߁Id0F4leP퍍K. t.%%%&22r]_?9322gJJ̎3F#QQQ&)???,,LV4y䊊 ~d6]vgTTm۶ǫ%K;wNWZ%Ҩjf%.˽{755ԨYYC% *W.N`dfQvÆDooo5-Cxn]\\YQQN>ۈ~xѢE2<|t6yQk'02tatմl#L&rrr$;v~w"`ͷ gk'@5˗/WפZKqd|}}fskksUכ͛ϟ?/[ua6lcuBCC%,\A5666hZϙ3'$$DDGGo߾뫟VΞ_H>cL&*P68ńna2P\ڋ GEH"$ zaF+X&.j)t:.&)A.E)UE[~1&mRw!DV>|>M"? CS+_U>tUUUBFQ 'd6fjE`4_*?Ex/lS^^.WF"^ݮf!u PVVnz~d7s_~E(R__???/'-r0L6kkk&I=ESSS}}}===mhZF}>_RN]MA1/,,z 233d26Mȓ5EEEɓ'\PXX(Jee8{|?3߿Y)/HokkNO;jʏw<%@Ky͗@Ky)z<u v~Aa ېm؏񔕕)R^^^SS#f:;; .\O}>_AAl[jV麻Ōˮ_^QQsE2466j4" @Fd٭-1nnni:900.;{ӧO lkks:/_|6}4#)Ĥl^wuu5MR'766`iiID"^ݞcx<O:h BiNN曚+bT___OOϿf222 M!DQ F~z:h"Hlj~->/} BdoCCCaa(F wK&h4l6^\NK<44?f#333%%%bR,#/ /4_ h/(/UUUYYYfґmͷ쯿㛛| #o~` dL|zzZ^fjVWWkZN-fnݺ%'N\X,_\\(ǽ^/NiFN a088(+++"n޼t:?~UQQ_z5996=6#)g 1XZZ3Hdttn'|tmjoMҌbY^^I(d/my~6ZGQϗ&K.=\,>NMB~~xxxd2Fͦhę ʕ+2x^]UU(X|P?!@Ky͗@Ky͗/K)(/4_P^Evm8&466j4"R q,/..V^u >l6f1'Ʒo㊊ ؝lt:_|nyKDիI^Fpb`0''gnnNp8ݻGI!&Fc(J4&777 666`iiIΜ;wI ZZZUt|>Q%A<cɴӎީ7l6f1'Ʒo㊊ޤ)++,//3rԭVkuuVt;]}6lt:_|z}qWW(~իWz>qp8lX`0377'_u8M2;;%CNoRW&^}6ls$4P()fܤc|(LŦzzzҜb,//ol!6uuucccP_})77ݻϞ=K?.oR~$‚^W5V$3ZK|6m8&LiiiIIĄı:ѣ׮].kssvWUU)b4g8ݼwϋ;wzCCCaa8gee:p8D>i^ L&qi&^4WO=l!6W9/^8uT♷PZx<2oXwիW._Ly͗/ /?~}7C|0m5w d suxjO8rrrrVZtn1#7J ~zEE8ŋ6`w|z͌ L1988(_]YYQec:::֪Ξ=ӹ9@nxQM/Hdttnt[ӭL~lG|S?I222 gfmmgVѨK\h"9sӧ&lC`fSVV(JyyyMMfbb ĥ@ ښW\\, f:;;']6:nvvvkkK5P(466VWW MMM`Pkkkw {$t6&h4&ۈhN|SSG,IZf2Ҝ`0$" lcXc<_XXkѨlooOs3gΜ>}ɓ'[[["fqqQLF" صPXX(Jee^D>9yd H\> !;;l6C.R}}=|ͷ=߸qmh4WVVNNNR^ ʿ/4_ h/(/?> &pﻧw<N`e7d 4x<2EQkjj5VW&n .ּbq1ٙx~~~7zZZVuww .5>@VW'p𲍈 w5P(466VWW MMM`PkkkwNʊB+N`_g#)Ĥl^wuu55DѬ4FM^}#hoonO|U766`iil6;X,655ӓfmmd29`H%o.Redddyy9 &ew:mW9x|aaA'FN=Μ9s'Olmm k4E1DҼmZ5ۼ6lPQq50p@ ~ss3##C};:: CvvWr8pW><> stream xeP@ Wه܌¦#qK}mJkD~"= XT ,F7L8TNIlЮ Y4C0(@CyT0ы/գ-si~ ~wVmZl;4Ce"kQaOv)Q?[IFV=Mb endstream endobj 2326 0 obj << /Type /XObject /Subtype /Image /Width 756 /Height 1043 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 33489 /Filter /FlateDecode >> stream x}tTqBƒ4<  X RJuQ{4PqZKQT|DP Hi'ĬKC WTrRq%>Єf~={~3Lfμ_pܹ3&3{qa??{>:D4׾[HIIm<]B<4\ֳgO?CN8q"mې[`CKs=!dgg6 hMJJdرcimPDom@mnH6 h6 mCۀmچmh6 h mچmCۀm@6mh mC6mhچmCۄ盋!&&fNn{h6 m[s /){{ ;-ӧƍx Y6lXpn4P? mMOKr"mC"f͚={ض1ReeE̙3@D[ۘϱ츸tM yyyv26$eWܹse#lyQ"lޥ/ő#GzRoʍΚ5kdF`,3_A%چX8qW^Ç㻫|c3yV̘1xN_u뒓egM|rAؾ}\e˖O2~կ%|5###''m6~*a/ hN6''/,{1o[zJH{gdaΜ9orii Fhڦ~LoƥK~?7SC y6޻Y3ydϛ7wϟeo_5neyo m#9nIF}T=mCDޏS~mCۀ¶6 mCۀmC6 hmhچmCۀm@6mq3_mhM7.]mCۄ{G}^ӫW>[NfzAq6{`ϙ3]ӈT?|FmVnn.C1q"6 h͠AV#~_TTm"m@mMyچmچmh6M^yiM8͡C̉YjM OoچmhgW_ym6~v^zkOwA6AMgۦ011177\kt-[hyIKKW{xرSʭU6nܨ555ŋ'''ϟ?_u;=6_|Yg?tR=Ro6m4i믿zj"hl:B6s@+Bee3g$l&##ѣ˾9vnĉ}9wglmmmccw({mmmbŊs>CM#GoVWW[x5XN{1BKե_fܴqbۨ/gϞ<켶ۘ Ä6 t9|\[3vw({m8oMRR=111NTS}͚5~{YYMķ^ W]caذa.]3ʜ;vl߾]86q&;;[jK6VymW1.\ Y./ miNjj,Ι3>gʲ`ٳesϴMtL)9sSV.\P^M&n|m֭[-bԩk׮߿_~{n96M$^y1x5vF~d{v&66eCoo.$322W^-UWW_۵.I^ی?^n+%%D.~R .@{ӆsN=\he˖LDyM9Ui2 2D=oCDdۄᏏmh66k.ƌVNʚ{oqqqf9W#iiiXi mچq׀m@6m69{[چmCۀqJۀm@6mh6 hkou56 mCۀm>B6 hlCuxjg6lܹsOm@ۄCmB6{]?馶)++KII:t͛6⨷nNkp kK YmƏ Uچ ۶IJJڷo޽{{m3GF;é:ocޖe.-hh^il1eXz KG &77_M^G :lo7n, 0`UQ6iN}meK ڦ[F^eL= 9mٲeӾ#k~7m61:,U{ ȱ@ɘmt8U{J6SLaϯ4mZ;-f|ޖe.-hnm?0;;ŋ|rBmxsqGn&8m=nUIac@z(kΞ=ӸM^G 췍,4ydc8W~m9N}5nKhPve.-hD^_z ȘMۄT=@DyqÇ޽P[~R`ݴM[XR=rdddȵV^mĪvjRi6,ByͬncgrhlӧϞ=XV_'0Dn&m hMm6m¤m8ޤmhmhHj6 @6 mچmCۀm@Dj۔{+mh6 hǵ!uhc٫t}.U86Mw6 mO666_ ;iG:Ƙ& [nȟK.u\3gΜ5kѣ[Xh'z3 ȋ'hۦ] m㠶qX~/677¾}||F;(u6nS\i&TmV˞!q6GǪ,GvF7\x,m,߅iNY ]Dou66xGy@ZcXo.vs1]]]1ߜ yBBBɓ'mcʹn&2ƿO?^hmӭǭ7]b%nc.6洍mc)..v\K,5%%%lf9r8ig?X2ћiݴF}+ӏ=ղoC`-ǭn{3mb7\:]]]1ߜb"d4چ6xGGŘ1cM;mstrlgtsɵۨm,߅i h& /~66qoچmm& mچmCۀm@6mh6 hچmh hچm@6mC6ov2: rdmٰaCjjUW]6a6 lx5&myjNSXnK{-{1"%%en/Cy0Nۄgdeeٳe„ ^wNf66[UטX{29<OQGmB6Sp:eq-ے[Qѣ8a8m}mm`lL&۸qb!C,mǀǹjR-Kۄm~$2>?FDys u@d&mmcyX&Viii kXƉmo<(..oqzۘ/ԖhOf66ApmچmCۀ 󶑃G#3cE6mC6No6 @6 mچmCۀm@6ScmC6 hڦ8BچmhHjUVFD[tsܹsOmhMچ5&&sRRRbccyfn.ekXk^s_}eO>kwu6 mܶ6MT;ps{ݻFfYcgv,ΦM&M믯^ZMu6j>h0oٳgY$nvzZ8W6ގ9rmmuqK X~FfYcsv,9<[gz8m_ۨ-@ݺӉۄl ʤeA.6~-Z6h'qOipoq6#bi ,7|ʔ)FfYcgv,~`p:iF{в`g~(̋/ˍ1@m|ӧU=VѾkpHtwxFBgee?S'O6֨s,k\S]_~ݻ|ILkwu6vF}+ўTOv8[{K/$Ǽ<;mӕ6 7[okm9=\{-,hۆ#G&hmżymֶk.63#hOZNڙ-<8|pC vڦSmco+_O>ky^&qFp˵qm-Z="ȑ QI۸\؜*v&Jd9 h<*/v~O.?S<洍m$G mچnz*oעmhpxmmhmSVV&GvCݼy[NVh&|fٲf8Q=r\K;PsW.]*ǿ3gΜ5kѣrlK66瀫cyjm.3eDv-滁 mۨs՗eu7mBM6|EގsˑZm_|YXXi爘c[&m, uݞ C @ۄms)xK7ۄ޴MӧUD摣Z=XV9"ؖJۘs1<Gh,?r6wm̶9܏7 d\,o&z6Q~w߽z-oljQ{-,h1ǶM@z1F@ۄvM2KmDo&V*/|5\sisˑZځ,Zkȑ# ]ؖ Zsz@ۄmL9ƉJ[e6nuۄ9MԶGoMۄ#m@6m¤mVlU͓mhmhڦmxk,csW;^Kc=>o0oez#imsm6˗//DaÆ6o6ϭjgvZ붏sd-k{H6zSUUUs)%%EOiRuˉS@=ux-0Nf֭[Z`\_91b|v;;]Z=oǀd-k{H6zBtq:Qr)PO^K]XOyt钼{ӿ7RϠ;=S}]tiHngIٶ1\rDsNs:UggZX?1cƸ=>o#$f[oez#ihk K{BO=UӉCtĩS:,hoK8..N|sAWgC ǵW7y|ԁ-zPĜ:uSm,'N}ᵴ߅ɓ'kkk5R&//8ZvN6 y0eVl;ɂƿN'%fiI{BO=U(b~~qDuˉS)PUײ|υld㔩z-{oqqq39K 'mϩ>o}SC|; &>>^x7m@6NgbQ8is / me1E󜺡m@6m\'m q\0?NL6 复S7k7sx'/mhS7h6MwMvR^N8uĶaxw8HH]c-wwv9my0y6IN8m9v Y֨N=>rN8q8mt n¼m9v uhhS?Uf6jGgZ~`5)Ywgf|66qys> !|Qf6jGo F33iIyknϞ=8umcbx73HȲr[mTϾwv9mm:ܲo Fm&'mMW79]ؿ@m:us-۵:{Q̴?㛶Aȭ[aw^#NۀmC8mŸ]? /bvƉi6mh'M7Qxޢmd̙36nqQYشiGw8qz8m mmsWX!z衇| ;LHHnPSS#asaPNNۀmC8MOJJjll<~-nc,\p\ʵTTTj||z8m m㠶1Epc… M&7g~ r6r\8i$6ǏJII)))y1=mچqbۄ@{ni6mh]ni6mhmچm@ۀm hm @6)۴ hA0)sm@&b6 hm72{ǎM/[_~7erv[nSi6mm9n{M/--5.Δm˭=y'nNm@ msfsۙ g;(-o#NCQQt~~> hm}m@ mچmچmm@ۀm6m@ۀhm@MTiݝbs?mHh6mڦ_nI6m6ۦm 6)ۖidp~ե_eihh(,,=6 hAgEuZdp~H)m߾]wn6m9~OpY\\egϞ+6mn{m,S;l~2yJچm66SidO?Կ-iii13fl!^ڼh6mN @ۀh @ۀm @ۀmm@ۀm6 @ۀhlLN6mm"m@ۀpJ0Hhm@ |?A]]3gs8+mCۀAچ9چh6pPDp6ץY^xqrr󍕖LJh69~rmmmccTLJh6I0ܿ,m6m>m|m>> @ۀAhSnc~FL:ܷ;wY\3m6UDޟ(AۀmC8m @DL hm@ h6m@ h6ma6% @mC6mx(@ $mMs6s.9h6m1m9UUUēL޺eͱcǦN(7m`Aۀh9n/>>  @DUh"PsELL̩S:6[Ι3>SMm@Mt76nOxL޺eͧ~*mr  hm9m6mچV!޺ @6\mmh6 h6m@ۀh6m@ 6VRSfffWSplذ!55zᇽmmm m={L06m&J36111׀m66ߞX& \l.Z[[Ambcc/\&Wmh6mC:su2xEEQ8fpϛkN]~|8um3NL4i场m6'm|ͦTN݀h̓6EN݀h̓6EN݀h,'m m6CYN8um'Ҟ1p @=ic hIn@ >N8um𤍁S7mpMLLLOdٌS7mg~7Ș_zm۶ :466vUUUWmx Zӟoݻw?ө<oqw$$$fٳ'?6vmmmda{k/_~f|/k^W_MOOɌG}TGvrJfԩi1G?ںu7سgA]oR⮻2p_o,96lصkWqqq{{;m@>,mΜ9FֿfWeYό5R2f2Yz׾m@Ƽ8p7WZ/yW^y%&&櫯2$%%ڵ9sosNhlFPݻ޳gHXM*!!ļwow޲fŲЫW 755edd̚5Akmmh@6mmC@6qnVy+eW\qEFK.y+Wp m, mh6 9thmcmͶlܹsOm@f޽#FHIIou֝;wBuugϞm,R).yfYYYƚɓ'k%7!7zjۢmͶ ym۶m׮]mB T۸\؜*8mmmCچ m¤m2;33S@ڦS!~Uh"mu8mB6iݖ9[n5 ,p\iiiyyy-lW*˞߁Bmc^֭.xN8z,lڴwm{ 69jؙnYnhh8|p`Fghko`OHH8ydmmﮨ0:$555msLL̩ShmLiݖ9ࢸr-YD62\;{&%%GX\3y1uTo{.**ϧmڶB mh7,o剉pYϞ=ikk3Fʓ{Xy@.]s'ߤ,7)h6 mhm?jp Ns7_}mJJ m QFI<<際{%mshٳgLLLCCp[oU?:uTBB׿0j(\/z3̙3e>a5m4c6yX}qqqcǎ5.oիWnn. p=zZ\|G:t8NAAAϞ=55556<pI ϕW\q׾v" Vѣ /`Yw}ַ% ?~!Lܲ~ܹ(p5+W4yyp|W7pq)11qȑ<2oѣ\YY)O= p_~Yz'o|GynpСXw餤aÆ}qqqhs̑tϲ2;vlٲ~+/۲e\6re֭111}ݗ<|RCCCaaabbbnn6 ,p\iiiyyy< hFKKK999<۷ossAz(F)ϟ8##Mx@0bllԶ1bgZ6nhh9|02U 2r&!!ɓɓնήomm5o񥊊 pRSSy@[n5VJ.kɒ%Y޽w) r ի5r˚j.ӟC"mhmm@6 Q{ bccoӦMy@L:G\sMnyϞ= y(Bo߾ mh hh6 mhh66 >z-mmӧƍ+++-Z$gΜI綍䇱|E8rȶk0`Oc<,̙3wݷ-Y.--66)))?\`O>iSmm4bĈǏ_~)| MƼ8tP={,?s䤤uhYVXI@ۄmb[[/ #>gzꩄ[njۜ>}z̙rݛn)++mmچ mhs7KmE(\s5 y@\}=R<c0=3rRSSy(|& mh ͪUj%mmE m@M˄möŋ'''ϟ?_TWW_ݺu,8p@\t9sYFm졼<===33s˖-ǎJLL7n vae˖׏AhcQUcA|ea߾}3gH 8pرv[SSӉ's9s xۨԒѶz\yلx~jD6 mc,H===%%D{- fqUgͳ+cƌq{|FmEEERw a6_:= 6]abچ hh66 ڶ Doڦ[96mbhaŋϟM~PWW~;̙3>"~7m@\[[(MJ_n"~7m@veƷ:߾|ٳg?wPOmѾ[F$oeee+W߿W_}Mmc2>ou֝;wӺs wٽ{wFF޴ 6Ή޴ 6]܉޴ hh6 h"m4e; MK&7Nm-ܹsOmh¤mf̘!oqqqEEE޶Ql:t͖yK.u\3gΜ5kѣrnG mr:tHliiԂO$%%۷o޽{69O\.Ͳ [ʟdpZڛvpk+V̝;Tی7N.0`jNj˟dpu3M;zV8m@;))j)S;vLUomN6iݎNpiӦ%$$3e;++˸8yd2O|4Zȑ#-[,)]Lvp ͛m۶]vmsrTUU 68m@@6mmC@m6 I a6r;$U TN 6TNN뮮6uVo1mm짼<===33s˖-~Z? ƭ2m-eeee3gn I !i:ooc5!!A] I !iYv/rZ- 'Nn I m˴nYY\\r,Yb~UVeSe!77W4iRCCO?2\+'6Ct7??2TNmS\\l]Ϥrh6t'9PxʠA;\B^J ->omCچ L̸h|pW_ĉcbbN8a׿׿v444S5΃'O[n\3/~ a5J=cSW n&ϏI,afΜiY>޽{_xѲn7C_]* .onn<5j Ӗ-[uIUVVƃܹs7n+V}덋&M#뮻rc~my|ߕO>gϞ7|3 T}Qycm|Lb̘1<&[W^yٳgӟg? T}y35k1Rtŋƍ_c#G1 6rnf]ooNJ۠m3o< m4>ᖾmm?6 mMKMܹsOm u?m\Yt9sYF]]]m-oݺ[TUU?))){>gi˖-~;&ϓD`ƍfƌQߏ︻GRcJ D!?&̅bÏ jc> (k;!tb6GMb+•pHMMIM"%%hFP~1';s87{{䞹;xmYYYS4*.Ǧ9p8ĵš=V|ǣT_;G>+sl_oɓ'._nUUU QQQ}v544ۻbŊqͶimm###W}[L&ZZZ.]*_[__/Vԋ׮xm4_m|[Z56ؘ`Po rݭ6999EEEj-[իW:th/uUh ~>-kbd^^/((n~-tۈ9|}}-<88xն}w9001LbgVmm6v/uUh 3<3/GDDttt:_6"/vqy鼼!//OSNw~\l6tؚh5(qy}95djXJJJ~>OA<1=s+6h_i6Aۀ6mm@@ۀx_Wz=,.~W|i~&͏Iw6m_-7};v>m8@6m m@6m m@ۀ6 hmCۀ6 hmm?i~||W^yqu믿^qxм 6 `ڦ_܂(a׶tngϞ7^|YZv]} `;_yچm 6޴iӻWZOk۬[w~~o~SDо}D8i399I6 `!&;;?,{Q|nbo}7|/ EDD{mhm3^{mrrmXX~ hm6!!!Gq4 mCmsΉ'EJi6@ 69\|G> m~G?罠 ㏋nm\c#--M,䛦m 1Ux0֭[j0iHOOni~1_u:7.]ZWW'*e8}am~Izr'6ms644Ӵu7MQQWUiU1, 8hK|&ۦP˜m.]ޮUŰ AmC_455]{ߤHCm#[$]K?Occc5e0hڦ[\J/-_|+SXr3ȣ.\$33K_R}} AmCS۸m%8hm\M)}4m4q6m3'2}hly 8hQ4 mC%mjjj_X,Ƙ4QOgggFFhmh(m>IIIv]b8mC6nj郣nf]s$PH|+_moIOO߹s"~ m#ɿme0U6@C}6o/&44T<66'ޓm@ۀچmhmC6 m<6S ?HhfVd!hmhj'e' ?f&zv?rۈh^5>QByybtGq8ӧOս{;vdgg'$$k(nvHm@IK۴O \L'O,]TOԋza 5Z>m6S׷3hҜY͖-[ի:VZPjAmfSv[6so^Ul۶M|5m4kh34_QUAW۸*,,'933`0HErJiu֭r677?~\Rq)6JvqبUmmC:hBTsW Iy ~|Vrss=:99y @' }L!ΫMVW ml6tؚm5tP!q}b*h/i@@@`{·3mL&SLL_0KďDZZmsն·3u +<<E6V'~$whچ۸mC6 mh%miS@ۀƹ3 8LnmqYzwhYyʹmïrlŴnjmmn[F>=kNpO<hm!}FGG4ˋ0[49_m9\=ѲphkkS\566f04ѼgF3mSYY)5FXXUv=55Usj{VLmm4՜֝lZ-KIIqqq!--MT>9t1=Nmm;yhmm;sarJ%_~Wtu:Kgg'' o_nk`0lܸ||.DpZڿ虃_~Y,?#l6^pX^d 7i ھ}eb[o>TLuu^+ʜs֯_o4-/^\t5k._> .7#yW_}US|3<#׿bÇ2N!:.))I=###88S|-"2KOM7> z-O?rN9`شi_5\syNE;v zwrooopppZZ6>X~'>i>O?]dI\\XNLL};#((H$u뭷rBOs8j / >mllkac09!|͢m6nȩ~ࡇmsr*"]_;8W'L6/DmS\\/m)((06Mjm)ب؇smF%""C,mSUU5::؇sm ]]]CDK[[6UcccAxsTVVJ6v=55Ux iBssBmmؘlZ-KII4\3 iiigp(++s}O ?F8u'AH @6 s%뮻NMttoG<ׇ\0BCC~'r-mp*f>mmh@6mm@@6mmCچw}W<s=CW >6~iHHȾ}rrrFtK/TTT$Flm{'.\_ZZWMLL^6? Efϛo醇im|gQ8VUk=ihb?ҥK@ݗ/_mȈdz衇JJJ\?K 'mUUU˖- {W6k66 mh@66 ?p)4}w 3]T~~6#nY|9??xGoۘ\qbccy7yh6 mhhNmmCo3CmSPP`6m6eÆ %&&F`Q;vLv[jٙa4###iXm!-֭tRYY%66V믿ĝ455߿_,'%%ڵkhhwŊ XQ6&z~llNt:*@ qn,thfIeeT8aaaV^^.}֮]s΁8i 6Vb)))={6!!A%, 5))) XmmCچ mh >6O=Tym&R5Th?knZ###?;#OjjjBlX 𒶩azU==n9r\x`0̰mi iybbnN3zz8mmg0D8]>o#dddHeee}UpxCۀmmCچ mmچ6>:acAOMgggFFh[}%K6U WJhiiٰabqN1= 6IIIv]bhﴴҬ([[ҥKeee6`F=<$$u[UVVƍՉ266f04oŵ6`F;wpp<ӻw.//w_y+&UQ1= 6~Q)f9%%y6_ {̩pلqXim3C>mm'}ԩS @ mh6 )}Y늶"ۇmdoX| m6C,-o,N>-.k6wؑy۷GGG#&&F.UyybtGQ<ͣ )~m6m_\__'jAq .<8<<,N<9Ջ!rddD1L>[ZZ.]xGלB*ԇp^tNm.Ͷ\U(--)**UlٲE^СC3<rWpikkm|WW`8|}}d2̪mm٩yTGלB6)䕕Rᄅ6SȤO477?~\,: 2{[JJJĥMʆvC8*,,4"ȿ.l޼y!##ClYruV)..VQ1\p'''[V"(lhܣGNNN8qB7m/mfNmOעmmh@6mmMNsi}h6M_?hm>6]]]F1..Nm=dM@(v.ot{ǚnlW"l"""VkEE4S߽WG},lw66mmh@6mmC@ۀm Ǥmm#chm(BhmS[[+vjlllWHBAAllyVZSS#NX,ddd!iBgg4S3lijttT$MTT{ر_],HDDDtttyΝ[f.}Q6IIIvۻbŊiEEؘ` :n ^/]p8Dl6BNN΋/8<<_>iE^dv{jjX^vuJ:¦i̙3ׯ///omm;wpc69ߓ 4QbKSSSxxmŪb)))ȟ>9#m8>v.- 5)))SjmM^^ʩS8W 6mmh@6mmC@ۀGFoڌ'1nrŢ9"l߾=::Zgee9 ӺihuۘL'O,]T" {wS iݴ 6sl"V^}!&999EEEm#-ȳ½aZ7m@um۶uvv^k2zzzm:+u66j+W^ٺuh4fff j֬poM@(=ztrrĉmmV8mﶍlt555pm66 mh@6{ڦU# XmUcmѶQLMY,رc}VZ%J1+pCCCW1Ƹ8xm4'zkDlijjڿ9+OXMII"nm4kNlifK !!!/^h0 ͉ӴT5k455UUU6`AƕDשּׁ,t,.}F\{qP[[+&""BsEEh66 mh@6mm@mχ-[?1gfʕ׿FFFnfmϵ_|sEm?uO?}թߧOݻl6ر#;;;!!3##h4FFFVWW6`QFsybɓ2))i׮]CCC+VmBp~+n(.CBB\ﶻ 6SUF1[6;wF[m#S|9?UCvq(&44l66`Q mh6 mhh66 mh0mCĠmJOO7qqqZiYZPV ;! ViIIIܩ%/L5uVs֬Y矋G}T$mmsCBB.^4T3ol>4h%k֬ijj7 K[h3gά_'loom'F&&""jVTTȭg6#W֜.vm~ph|m\y3g6`qۦUz&//}[p6`q mh6 mhhswt'moWm|p&VkjjolX}o볲4y+9bN`$rddu4oEmsE86mmmSUJii"E(QWVVJ&o WM&S___OOmm@ sű,KII1++KTbbZXXh4333꩎mm0sIma8m? hh6 mhɶP 6WM,V۸! 9}XػwlޱcGvvvBBS5[svKKˆ jLL|š |H  'OO5֭[WYYyҥ2y>HMt.g2[׏MK @L!m9[1wfmDᐂ]\IΊgϞMHHbU܉4bn66 mh@6mm@mSOMjibm@\o⇶fmh|m fsxxfV522Qls>TלNϷMDDDGGXay+p'϶.!¦M(/^4 颞NfTVVJzĄnOMMռzS5+iWVb g0DH/_,EbD1+o8poyImIHH0͇mMmmh@6mmf?sim[6expcxrXھ}{tt^ǎvطoߪU9Nm9co*.GFF\妦X ~6>\},JKKsrrm3c6}h'瀫d陾mt8mo+OWK}Bј)6VWW˟g~,lpc_ۆ9&6xӧO;4f7'---[/_ަY> stream xڥr6_>Ij-DӦwĝ41d<PJv|xȢ+7zb k6{/hY̝ AǶl/W#˲ƓYNG"{j,[+ aL'cEiR]|).PaeTe)2oTr#J08ђrg;TO`}L?23ښ=ker2*x}"lY[КMU\ GdŃ8+%CW D0PS#3fgDXӰ(|Ão kdv62FRKaĊՁb<RJӒ=y9}bԛNGJw6 qw-|45\qFQ#qrCRnJH= K"y3M!X2eY >䘍(^+#-ܨ1HZX/c enҜv`HFT܏`$ Z[B(=c,Nb06JV2 cB.aQgS"V:+_piMh> !TD+Yh>_U ūO(r)Nr18pF~w4k:OELަ `ËMtC iQuRu C7vl0Y+e]_ }J ymE<&ѺUw$tsqoJXD'gCaVnY<kppYA )UqE*#4JC8@+̪(+3L朴F<(L? xО7M0[$f~Hq썦e7"RbVf6Y8w)+T0tIU1!`{[/z; nxwW7:e[Jŵ0u$,UӔ\5)w]~M?P>G>t+^u^2;/L586P$fR+EV~;;Z$J^:+F@l5]FDl0 Q! B endstream endobj 2350 0 obj << /Length 2717 /Filter /FlateDecode >> stream xڵYY8~ϯ0,"mFaIlE"cӘybۚ%GG::vXC7E,v/ėWz8X\,`h_aD*\bUQE]$ 7&gngݢ}[2x(MQ:bO_G]W"SdJ*L3 t"g:ץsۙ9 lX^+o^?+KԓӴY~ tH^V֐C}S7vEi/T۞T@{S>Ļ+P0JIīK̓u߹YݎgfLa_j<^4u`4v[ԽzA0acye{lLL/Qa{DtiآhZZD2f21r;YP1}L#Oٛ%<[S kgiHjՋ܊|}D !ؑq0c=Isgkp'Wv(eP(S dA9~ez R8dڠ ;`^w<Ⱦ`O5mag2?9+*\>[ِ-w,=SX[%hчrf҉yNik1آxO-sy,ɾ Plìgs1ߕhe;@gJxlc:;x`?Pp@n݀@U^@VgX0=olB3ܔ [[a= Z2pa$'-UH xid¶9|2)X):w?SH\`q,?"C2#Z/^,W1$u{*@ S)pSAw:n>l7w9vO_=1ON@\\{*I C? Zn)>nt\? z5-I4BQ\*߁Zo}nH9c+BMYWQ +;XFݍ} S쓵c=۲\s]A T 2%w9d)أNueJ6~o,*@#ܰ|G|$@rTHCU34"?8ͻ玫HĖ;,. ȣ-g@ g^k+(ʠ[{j{j jitd@o& s "<$?'SC$)=lS orɍ ױp)0l(#i_lwqGJPHq6Wդ #)xT ]Maܺе\|㱺H! XH{|TWfRޥY R$li]5=ƶ}=~c@*=te.=n~;r-XH4vJcACw=TfZ:.l%MehJvbZndI#kһܺ&Ʉޥ3CUFs޺Ƽ% z(lWA=Mxb4}v%7p2 Pozw<ѴbMAMQDO/njEڧBOWX;^52j-{WPr$ }~ )`5{.8M#`MT&I1c5,̱ZgIVVL3H3$XXG0P:aVCeɲHК]e_D3 ݩ~󖇯/ȻB4ZHf/rR㈫q!@.?U .Z="Gv3⥜s$pL0B@9}/)h] ޘS!jX{Ny:fOk2(eO(0;>=#çNQ tg'6]J{s[9!-?QEjTlӱ 8c+ 9bA<3˶GC] MuY#>b,PeA>t“ѝ,b)-0 [~nʁCuu/`~М%fsGND*d#2Ϗ2hK:wa '&mb#9ͼkl +dA"+\ڔJ[G/Ťfk6$0SU."M{+.яN'"6WO%X(Ǜ[jq6_`n%WQ0L& -.BDy+#@jcZ'$ց$sT=ˢ)%4|o=sN6%=ȴIY2kMbXHU7d:kM6`NH !IG* R%zr׽Av}S_BJO+ǔ8'C/! $8Z~:G/RߟH׀ )LW%޶َZ jP_Rc{&z_X endstream endobj 2354 0 obj << /Length 1687 /Filter /FlateDecode >> stream xڭXK6 W3kFqMtLC:Ii[.%f'J~mb$G|v~y7g_F,y%f&LHRPz!:m\+" sqeo.x2;Pӡ@ ŅJT5Qnߏ~.5֮Jb k[+XijPQU$P<GYyN/{[ pR<)q).R>f9\`yc*-m{WA`Nu'ȹ"f|ˌ|_A kC-Ƭ`,NѬ)V8{(`kcd[\.lg,~(1D'ٲ=j( P*Ӭ]0hi4.&EqB|NͪSaZHj.џYWI$dq1ϔ;o}BbiR[LfYzպΜw4լQ;;a#}g/C%4;N 0?$TR )9 [ 0Aڴ[Kъ!HHxni G`H4ءʆ9 { SܾZODW蒕|xC6nKP\u)cx=+0_(LcKӬnS`k88̀X+ЃG'q,az} TwvlYV8St%%AHf^NUݲ>$V `BN"B&Z"RBNEQ ^wһW׷CWH.L]FAȊ J$clE\цvr8d#QPmz?ݼbm]SڠѰ2&oDuUCtox"գ9WtUwLL*!U2.l"E]9޳  b52݃-|1 e 04¾lCrU u[2 xTCe@dX>= endstream endobj 2361 0 obj << /Length 2870 /Filter /FlateDecode >> stream xڥk۸{~)2V~CeEkqWhȒno;/Ar(X p3~,^[([DeQXyԏb?yuY<y;*)"LxݻkFWm@7,^:vH2RFR*뚞@8(%]2-=mn,WIxeZx.T!"pThq(2lZAaX1N2 w8r3Ehxtv Gf&b_m%~_UBV OޏlF{ #3@_ڳahy;H/9WXl+`3:2*Ehdž mw2 Ȕ0sP}ej[NZ$l++لέ%Ս=8ED ˟!PÈ"{p#*^Stkr$R=oOx{!:T؎aLL;S /^G[djÁOAFNa%ԅʴ5t'k 60nc-DQ P!9 ;K+M|qWjtj:Tt{ ]ztEyv$(< ) $FyYc^7.υIVuŶ#TpPxyPv;ҹ@hZ qr nes`]U̢NA+BMqO$bSiHr}Pjۑ$)JR 9s]:Ehmc} `9Jiv!k.%MuN30k3!I@KЏx>t9#7{^:rtWQZ gKX"k@,PnFwv4GU ɝҪ,px%؏ynqwGO50TwJ6찭@@ї(kyUnPB{P33WYct+sBNzGrOGvy.,FHDt{Cbd4c?,\_Uh)G(q~n";2 CUW rw 5%!=WH9U÷ l<] U{-ԏ,2+.Ngc.ԍD(38ll53rs_ۍ_#Rf?'+>a :δaPIt M!X<9.^:`!bCEDI\a!n8|h{rᄯ ˧ ZZ73zV9>"N_߯oonokxX|naV=q0.֏) k[pl;>VLr;< ^V( |lƉkP +wyBaJ;P/UW~H,rwrcr_Xcѥsp9G\wK~S>Nǫ8$^5ƅN}X^J%~V~$Q`)RQP6HdI&' ö2(Y4wُ}‰+Y3UcW.[OnaMpfO8 ۥ {Ѝ8DK4Yn{a"}0 ")q'Kpij Gۡ n0WzzNc΍5eRjr]^=qGɼ2IA8V(d_SWnxyH'x"ۭ!@]A,sZMd @lkHaN/]* 0yj~pe^EF ?4z}7`Lt nްS^DqQx"|ipfT endstream endobj 2365 0 obj << /Length 2725 /Filter /FlateDecode >> stream xڵk6{~*"EIT РɥEKhmV#K$7qpz#)1l= fzˇ'^x&XVDAz{!d=l>L"<z,Zl+=쵞~&G2ڍhK^,oMkTvoia0 eۊiov&yoX`apa) r>eӡu5/ $#Bi P;a *ɷyqC'gp D*eY!v$G{ QpH1+ }n3Α,/ Pf_ }jK\ﶪ!sq_/yOok^1o@5\0סVjW*-!i0N?)G7n1kSˡƯ@Q&Nr YN 9BWʚKĊ"Fܐ-}Vp`8Srkh/-xiL顑]0uuNdHV=GHTo͇jպζ }'Ͻ凹V~1+Z^ԙ/~5 ]am7 +f#'~Wa/Q[X(L߂(kϪᧆ`d!I:ޑGnF3_n3,/JHy[ſeҠG?~d$nFP~ 5AXG*WTޭZ+;%:@]LAF6Sp,YǾa(* f|V(A,jL WiTe^6W<$ c_ bNI|- $ 8m< e:&LF0[74-ǛxBwvS cܐajM~.AP5g-OG}ؤK΄1V sf[.#:F_Yéأďn)Mgu3.U*ׅ9)+ÎM>A8z$zTӣG_ u_ PL$oq׌c/'[B,ԛD@KÓS#ɝ1Sed#a3OSW)4 @)^V9Cײ :u4hr:16%yll5{O,1Zb`K%>XY )EH 2Slg*4L 'iv -xs\rL9Wx6htEYS^פK]ХhZ~MƧs-D"&D:k&r[‹T4\'.%cqW%_}ˎ_y uZ:ӄ+E*t8 A"ZL2|M@qXŒפ8}ufsyE49VMKx՘<;C߃\N->,a*Tcf>"d )n8P]50f׬9xfU@ W2Ĥ= 7Uo%&9nK.BCPT8ǙNj:nbLXUn偸&M Xo`Ǫcld@+'XlFזSlمվVRxwJ,h)\QB|60ЪOk}|N c.z0\&8 V}l?vMi8A:`(UZ}Lߘrb3SExc},c0Q"TQ@ +li+'>[-lfd-ä|byz"T 6j)/O˥z9qxz`r $U԰G, j5L'N?:[D} 5ϱπ =p;&خe"чs$0k)JW3mlR݅ktɑR(T] "}㤽` c pm.6i 8 > ϣXt pgKʕ]|_ו}svNקl0$$/1j "EVP9獴ѐXX#JM3|ʞR:#xotHnc1n2Z-a;)TDA y4\9l锈E;m[%$i\Vf5S.` >>77RyYN l _V CHI6D@ d?Cҽ_L! wT =xLZ TѳVc1la74}>to{#W +ElVоLO.3 Unݫ 앥?/(> Nŋ@qK|A5"kڏ͟@o1n`Kn{h_SZug!Kvu^xm%_n|~2WR -P~K D G[^=> stream xڵX[8}_R1 6o\fVҮN M:*F|I'f]dۇڎEE/}8zH%*%i0V 4%hś]fc]>,~ 'hq8w^gٜLXھX'ysqdA> $Ms'o_ӧnYeͲηm^1I~`,;@J)Ck8~uQOsRm*G<+˺:{8I¢D.yzZj[WZ0r@R ހKz]V"8H="EӒ"̼PxLG,"(F*M  !d*zj9 EyB~Ȋ *@P2)JTRYQ3Ά)<Q5 {dh2H> 5Sh:eQ0r0bbT嘦 e7b5^wEPwTud N Ò zd,haSNCAp %Hdjh!aMiH: s:Dr 41ƂK89*dX!]N5ViyʱE# Py}ogOn_;:7*!1>[4@AqUmrOպWr48pf8gmu7K\I|(3I1(C?uMZ糹^wq[q匈 ݦ/f8KXfoo* OUV@Jǝ38U:KX7nXuW;j(m+`&q^^TF+d6g'F&U9/NULam *aҙ7ݶHQzw5]q,%O2s#Ѫ=v ;uM=2Lc6tdBq#8jo cZ{%vs [5+vs/=y W=v<5^u3!8.`ҵ [se/2;﹂Io.; N CʤGѻ(ZCR U2jn"(UDo޸ǡ.k/yMjL&#&4~nRUMC@.1>KnuklZnfUmL7ls:BPFlfH>/2#"Ѐ <̴ܬk_aeeh袩\KWhޝ라}%Po8-ň endstream endobj 2376 0 obj << /Length 2576 /Filter /FlateDecode >> stream xڽYmo6_hQXF(5IC!-YwyJk ?f8Cʹ4@3 bp}:z2^$" p^ġH|IW*Z{M}R))ER97Pokg'rVjvWv-ٝHHh 51MACt[붩O^dEktŎQ+W/}KF[JloIH2Lˏ+q~E6կ)7p8Zܶ) :F0B6RBAmW<ЬMnAGp?vMUWĹ+VY/ Toy`aۇe[|dBJo:d^Yo;\LYRľYͺxѩt6;]n*rB՟Yԏ=>xˌW?ǃe dF\Ԓm0s{%1 7s;.8m+bTun^JT03D[oT0ʊV,$q.Ne$N"'C?{d}Ox00ulSWCP;C`.e v?.8(`#9+ @%AV>0{uQ!{+f *'9>.JR3 214A(!(L68[g +^\[DFJȥ&.*E{s^>A*EAe<{  >V--D>kSH7g ;Sj^xf׻:z~'gKΒVx23_]'#(q]M2-4ZqM!| @C6xcFGqv,>K:륄|w x#CtY`9FÃZeQ DyІlx׷* P j4Y-ܕhn\nj8cPC0z=/!xcn{j[Į zE̠{L`lbuH&B.-0җl{OwC*T/IU..~;,*M@R ( i{`c2(">2}/I$'O&ru8brLWPJ >M|4bLgԸ,rW\vnj_ǰ_ےmki;wM}i^>L >QmGݔ>}U}w촉uءӇlF>n*j釮IQS<GpPLY/G&zc8~̈X5*RJsSAH7&}4:00n"bboЃ߾n9syh}Gɇ/ ܬa:@s}enZE&2t~w7+ Al!{(=JA$՛⟀qBR4ۖHzيynuƆ*> RqUSlE9(tTъj20T'PJUK7E=D>m׺g{m=FIex>Tھ.k{#m k{/pUHL$L$zx(s1_v  G7+OA8/´ә Fe3["\Ϩ*cˉrX8y0(FsL}: F>D,Ok Fznd)?yw*W&/aviْ5loʅJ WFRI9A V"( R_#n E@!dʋS l endstream endobj 2380 0 obj << /Length 1550 /Filter /FlateDecode >> stream xڵn6_aњ/h ] ku+զc6t3Pe˱t1Rpp3< ɋ7,d$Y< $4$!OCp?a˳uCJGiz|8X|Yz}m 2ڀsԀ?F,SbqҡDS)B,śtKp*H&`(IR/x8d`.aH[+ ÏE^ڥ5~)#V2 @D#)&Xu½zU}V㐤hs)- VeFjHWyukKv6<}ŌЬ子e2RlYH@6:\3P0%"S+4&PZT\ZaqTGijQ8=? ͖}RoO-M-8fu8FgrzE֕V 0sψ.ĻGYܨ<͜w@njÑ`alq&h01IyGS y7mr9 3r\ Nr-;c$Y|M̈NE{IE_(  a|9A0lA/j`ӂ& I+^9Xmc 1Z6xṬUi6uá>WuuS-&K[/yIĴT'yLb(ڋ66z&(In4Mfw|qQHH0ԣƼ._#S'Z0tӈَJt!x>ԓx~=բ./,.Ԥ޿"[bo)4U=ҀtmXxP>8gbgQ7y+L'`o'=HY7/lH1󽦝`&r(3V'&;SnOpeij`zv l)rFM@eKXYi9[fk:ntb_K]~@n6ⲍ ڦw jP9e^m7uƦwxR{vxfo׼ށ nahWXSrWps̱KNEE՜ƼmQ4c@7HrB[_uhOĻ9|<Ӝ Tjbh+ Vyn `$ > ?LRlss b*ݻ{H<[#GK@fFa,hM/K˥`8d, Lf)tс#7?> stream xko 7E`}p5)6h$0xJbL IRDKݝKW+qo^|6*{ul'U*E,tzu!zl\_n\w{3VGusCY`ч׮IAuӠm]jbU$F^ T9|\@‚nk :!:1?~w%9+|P ȮfJF[_(U}Qq*?i!e*~j߾dk9bZN ۸ '+"EO(,w::&~L;y|;*>fIu9ǽ5H72jp0{á[7Dg:o\Q1Ƥ0(ǝ!σƒ,r H۰[J^N]LDxXJ#^x GIsе\@} #R5BtA{OiY2">1⽉~vs<_ލmj,S \y(&czpұf3|G AA21aVܝ2+1pL⋛Iof[Hd{LB][HAK%IP9iCAQN 137j2EpT?QSȋbTY[R[)' K;)E ywM|۱ ͂0 1t_Gaٯ$zEdXLK4$8槗  9c~mׇ0rk9A-/̗<nbSbKc@\oL< ,Ͽ x_q&'ʻe06C:TW穑H 3.9RBΞ"1tLf⣉>wTNND;mi8:mT<N'|s )Y5bXO໦XnY(T eQ}1d%0bZV(\_i':(XDptK>1)GT{f FyD"5$Ū@c 2F*[7jA@T ɝC/ܲ.'V @E`T!1P")ֱgXhyŵ-)_M~NȇPlkqy" K8o=ۀFz_Z]2;el V'o}V'BJ8MRס+K-HTp~=h0k9|ǔơ?k[Ut.AYwz\#K&ϫJ>pDu d8ؔձȏ@+L3u^<6 FJ}i)P VUH5lwDZ ^Y .]f%8_z6-V܍zUFgcK#j `|oʨBBF#6'oDݯlpq($劮t}$֌ fjl*pw/Qk3b3`j(e bN?3}y,Tcc׉MO|ؙ rfYlʪ }Kh vl ]ݕMq'ij}÷Sq*t_8m}%YYv8Y ]实L$3-}y<""r`@0 {df%@*K&wl`,h灀 gDa'sSaJ ea8d*P=ox8B@?Kuք=gCN1pu>y4{C{DJ!49׷!.l} Er_bpik[ h|, \+E'DC ˧LDH 'GJ}b$>vZ.f옪l--ǭճKH8U>P{L*)3 Pޟ@PHrFu|[vA֪uGheKú0-V>q>aW6DS?@ F_cgى{JDO{>Ge w}S$tz1ϴS0Nwg; kkȩ)ӊ,!e&ܫ-o솛KEâȽ3Iba63IQbMgӵtJ`qՑ$&H8'ph:[4d*LtR)\TcXar89T&[c2*eF;FJ 7+aOw/ Y endstream endobj 2388 0 obj << /Length 1996 /Filter /FlateDecode >> stream xڥXY6~ϯ0Zk MiZ][r$;!e+N9#n'?>ٷIHFjD,z θ'}iLI !fmjCc[Ӭ˫LeMyA3٢?tp ,q`ȋ;b7}-ӎR$G1hhfoSoWP2ŕdW3E0_Nn4-vW`3*Ef+`'վ l2%d&KÐ$6T0ֆ4i AmV ) 2fI&oZ,R YJpk\ʩ$,C,5Ȳ=%@mS(pi$[Sz{845 M&ttݶE)megid5tpo[D a1C^$"=E.dϋQ7J /XQf_Dڛ¤fRU'$מu!حP#1q~n,mw7YhrJD1d')I_\hoŔf@HX,/:-3.Ѱb@:0sy79k =q& (3)XSV/^& |~6v {FM9 u4v/95}ڼB{'ebN&)r/(Nך[*+ӵEʱHIMhYz-z~aw|k5cYdq#U3Clul^!@P1J7%~ڈ6ԅ+!`2D3_Ek&Dr~9B"􅷚妊܅_[t!^"nغ1|rb1(\簒 [+ź%ž4;xkGýHk#SX^x4 }[X@gm,;Epj]m局QR<59eƴk98b'E{$^v-LDKj/CSloOcB=PHCm|8ōޫ},G9D3= A?37=OXFO!Bpb hsǑ;Xh&)dĴ cuzu|zZQb//ﲼH*%Xrׁ^NuY/jajIEo\ӆ{VR)@/炗tۓSQ!ܾфUҢ" %kK g"h5$,B SiJN#$ qoφ֬rXǽJYz5mV/1l(R`n]^96&{l ZS6϶j'Gu^iFP@Fʦj4tFeƾFFXVK.0BލZ(d̨SyLh&UpPO|͆,t5P%~Y:  >9Ge[ |š Smػ7W?|7|\% B u\whS^Y΂Íegn7S1#39ۀIV}E.gxgW|դ߭Jcq?1${K~? w endstream endobj 2392 0 obj << /Length 1699 /Filter /FlateDecode >> stream xXo6_a`X7%cЬa40E؊-TIn xc)JRl/Ct<ofň~~˷"al]8Br2iGgy_FaBhykMBf:hEv'K!:6w$iއ ٦*y9mҚlV_ lv)0~B 䡌DOj@vɧ~P6dVvVi7II=q֐f)8c5Grc!*) a%ߵˈL:4qhCKv2ooDH j 2|j$R`9S+?;`S20aeM |6)1d=#q$rRu,)܌E_݇XixZi16h$7+q 9-]9EͶ-W;:v=]wgb<4B_&VR̉1OY,h&黮RgC4xb ^I|55Y:٦R4AAo?tB{wA8tpg)@N e-"ib{\RӷU9`U}Y{cm,b`%d9ـp&FWU|ژM!5]vXŦ "?fVm0&J@sRI<MSeS C<z3cl+"e+ɶs.8)덧q!qvLde6yNBpnbAX4KӅ.HltĨc#0JadtkP@VT,@wd Rރ4,BngI.8LqzYqUVZ$2yi>L]ee=%"057Ĭ2L'7^yK*w^u!!%6Vj)DS'3 d [xVӿmk8%,lawǁgkwi׷3ɳEJ[1rכ PѬ9$ɺWDQ7{gxNtPVt)nLжqdiUR7MqlL'.G*8:M*lHJ*]!÷pȊ Zɜ 7ZeީXE͒ϰ~_Nӻ2Ok%xGT{y{X`u{dl#n̺~Iwο]ПHEMUV4lcjk_hv_ƿvue7H>{nbM>Ĕ t2Jciܾ,>J0"6uV~Rr(ewb_L1;|09D17v0y)k b}m7p'}}1 /+P&S"ahO=y 3;Fhbd-9Ť1b+Ucjbh*[.ϟ-)摲p|p8ژhU}*ã)T>σnÝԁJx=jt[S@Ĕ> stream xYo8_1OI n[l⮷bq=Vl^ekI%[b'pQCj8!d~O盫/'T'W7'yʬ'jv)yW󳉴Yrw&<=YR)ϓyҠwKWkzEE =ge[H+<=\Q| w! VqG/e\fg-mr78߹P'!5{5kK)Vg" Wz~Nvl Ls,W87^zX{"h-IDbQp`kRYD6fY3;&8O~4V>UrEo.?zxnZ", mtRʭ4(NމcIҚע3WU~fUbS>!_C[EB+ ]PIeMWEM$I]aY k &YoEqe*y83Mq% X˧{nyO|UE𜛑s: /b`?-~HȖ%epj S/A4iˎY"< 0u!{,rc&p5r :FS1sUZDHch@ֺ. ( ^vBtyv gxZ 4eBdZT$F&lԶr_up֏_Fަ݀# i  8&YtvF >ǜk>CJ# Ar1g(R!;Q@rf\ v3}j j#8*[LR9rM&~;m0P)FڲT^ˏH#'bj1)?oj]9 >i笛*Va\iMt4 eb=m6o M2N!;BJWڰg- '>|" 5(;7f?w! %uy|&c9mǦ\߇ZJ+:9T_rg#GaSbWnj0I-i8VEI^b e]eEuI_pbED`KeYg`=B0#Lj#\2#3$l`KP݃4s 5cMŤ:Ԧ\s,-Jbi nYQhRۗ&nDXVd}cW$c }pFL>w/QŨVb!n9_t$^qŀ6 a24iSJyrI#LE=3"R3r@c[s(QH:Ҍ3x~)B,ϣG';z+ġUh7h";cǑ{[5nenVS9k.-^br*-B9ZIt=tJO;lo9m-f4=HjӍ\炥lƛ n^iGܘ=T7~ꢢ g!2`DPNq6Whޯzc3%5b5 %[x KL6 eR86v;m+n_-f$yݬt;K:M{xHk(6Dn/L65Uh.vEWOm> ͲxRS5{܉W; {J˙0Z}AlGDɛRr^Awt$AHZ2q\no|]w']wf> stream xYo8޿}\Qouq5bwo5pEȌ͍,ԇ7 iQw{+c5Eѫuf]}<댜'/YnH .+;U1 <ޞN{Zˈe3 ЪתkEzՈ 7GD aү}qBVʶYG, h+=vȣY,!?J}BZҩ֮ ...fs h30LSqG'1UN+x,+mO^VG\9xm9mWF4,yi(̢lhؚ0]bssĨUE4I擎۞k#զ`=[ʯXPj8$sקٹI7R n5 ^Iw<Eک)GKGHޫɣ-6Dp=eh)F[AxLHpڤ /<[l.AS:4UsvkgF:>r|:@|ك?l|&dd F]4@Ꝫ)IR.=KjDhgm4sgbFԵ}d{wPqz[-l5 (1y1[X [ %‡d{9THfHQЋԠ o;DS&2P,J/wzYa aLaX)_qmTexFTXeܔ#عĜ%C e FCкS[t|Ŀxn+ l,cz.c,X3IjI|dw#FMj aӹi4!Jr܁P%fkʵ:!Nj>j{J~Qù˱72{}~\A2'HXPB5do4_k:AeO$tqWI YwP WCJz@00˾d^xDݐ\@(W8oGH􉢌QaBp0Wk endstream endobj 2407 0 obj << /Length 2626 /Filter /FlateDecode >> stream xYm۸_,kF/n^IqIsF^6m3+K(eopFl+rH gf({؃g6?_M=n8q(D-l/L;j##7Gc󭢮YF>Nt8w~9 8bHqh V(J+Ü4VEIZӪ2jeJŊZiWʥv\.J3BeY) cODa2;H{==.[-Jy%SQdmZZ~e@i~4ъWd4\:ͲG[]]IMCD.=t$o4E5`Sy/0eҨ*R~C|M+B&+?H%%9^M'Wj:1ڄ]Oq '!`~2?L&˪`]4rn4t+/i&Cm 6R/JC\n5 &Kҗwϝ;YiBTwsofg;I ߰{Sl 5ujQ7' \{N- >o'# 1 ۂ~%GDAfX0EE- 6;@˔$`$@qL5nLh ,Kibi *P JtQV@p;JP{ yR8W%Py&EH$<(ރ5K&`BEo< rA6v¹R/G} na`hL\*S䆦> stream xڵYYoH~ϯ$H0ML#im0E*$eSTl`g Y]]WUmk]Y?|\=b3`uu Uh[冫txz;qSk,oy$o[UƶyU}X?%뇿*GHS?F=3ƱL'ee\?2jqBCKZn?- Bj3]D͡s\ͪ635;4ޮ#רd -NdTJTɔ\hbm$vX^VrfŽ궪w[O )㏜ݒj)Jh*g&K${-iE>졵E"]{[OlvFM,O|mx?xARlJ;x-9H`?m@r?<3'nM[rKxn05Oe`s_M\65=.hSY5I, #Z.6xP.oH_AB%K+[ejn "mo Cmouv$l .5t ꎻJQ|_h>g0i/x .?2+S;d>yo>F$‹8mP?֑Gj6S2'wJA+dN CN3qQ $]l vVNSQ>3@:0+#^5[?96|0,G ZmCK%;%AN!`&^REFI9GXdo|%I30Zu׋ ?!Aіw A.B>7Py)Z!3ow\6 #7[jUy4,th;} \ZqIOs7ax*_: <l˰kI':\/y=ЈbfGl^= Mߞg@BV7KrMcC5K^GMؒ QR JlVC u VL‡Bd|rW*DN)QAVM(Wwy{@ ᢯1aK $Ў7v,*{D(GnC 9ն5ݹ+%J9S^Y•lF%P}r}λDGU)dG0 }PTZS5՜ ܏"ĸ>4"ua;\VNΨgA3உ2Q!ײ{'yU!J;Fv(Y4`Hs#<׭T>cH.kxbo~LONDfDs5w01Gx@Vl6d(QYu CaZN["6Av iA H$jnP( YUC ?kҩ! r3œ*6Щ˕rF,QT`c\B>_!ɺkS:VmlqJ[ $:l̘A ˹nA 'ƒGflN?ON0[!HQ~х&`NO89ĦkSx;e ;YXOvt[P0׋ }̋Y1^n qhv0}v1Q뎦 \A:@1&v{tdmmJuaSEx.{&H_} tv[* ʼ^)]x<}.ڎicR."l׌@Q~:t-~' ı9(XĎb s&1:4r҈뗸$-"v>9e[!{?mIT'yEwKlo^biz-ڭ# O#jX>fyg6|v1n|<=l=,yw\wxSaPJ^z2Pa.&u ;ARIS+#| .lg_Wbq endstream endobj 2416 0 obj << /Length 2620 /Filter /FlateDecode >> stream xڭYmo6_}|Is鵎JF53Vڕ(`E3o\Y=_]>\eLd׋D-P j>x2RQʻ*.6o$oD.o'iWewKeO?\.PdQDB&#u(ؘXëpʫtLkf͉~^ xT `픜Quۼ|yhi<({ du>JGZ4LBF?.eٖ ^?.blj׿=0^oeg~-JMpSq@Q(plTF{P!KߝX* 9mlċsXy׵ǝwnEtJO#pfYOàm6ƫ~$7~- ְ]!4QHIN&&+x^xgX HD@"]v\4ѵNE"PfGܦ&W OtG3lb*&s`?2KokkWHMфH4/[eXMDԀ lL{m I RAKlrI}'|KcN7#^e&-\{nap`Ϧ[M*F)vHyoHC=T_wL;ڣwkΡW{{O>a&4$Ix$Ѥ"A޴`:Gl5v Hcsm n~;zI(Pq@︗a" .'F'x"-Ve$`ei,2An8j0z {α*\ ,)ZaD̈-R-s&-So"BHr tU#Vo[~Oqv.RF2Y|Mg5%ORaƯ]Gɸh6m :(S.!o rC`e+: :CY&tb*Ba@b43_[ z4{zH[mGߏzhʛ]u|{BID?1T%5y|3;M,(]-ՙM?1:ejj+`}=f`wOE.%q:,mۭ, ⮇2VL$k1y{7Is"~~QN+]aA߱"WUh&qeLX-uoVh^OhJ~0P 1*iʈ C=?߅/ endstream endobj 2420 0 obj << /Length 2742 /Filter /FlateDecode >> stream xڭYs pF8Zdwǵ98DEDxв2㻯'G{~ћ\O#O_$s8'$ &^L[?;m( zOb"χ?b2}7"y!q _WZR^6宪""71Ɍ?|~yy9__/ \?A6? lMZ䬧C'7N=l3572އ]mQendμ͂k U渪(ucF>ż^qa%͔fKԸP9Tĉ6( h.M:[[Y6=8OlO>*lWɟrg|QpRݽGmwۖ't  Dh,zy_Ye]VF{/,rv:I^׵^=`;@MՈZ-t-6i^s- }05 i>B۳ 8nS7x+R ͥ b:lͪfrG. `{'<i4dbKsKԁ`" Q:%nR iZ%MKHPŎUڦ@WCP|4;nkv"4Ab@v޲ B}:Y]2l<>pgEL}Bq±Adr΋5g}bۮ17DqVw[t.U(d]lGp : +hV7XUMJ`Me#0CScɪC8Ϟ.FNZG\6y%#"DK,uEZ7!BB7[D@$RE'$6 aѰ#8*߁S[}BDr?SȚ@O d Ar} q~qgTp#|-ZFO3bB5vm?S0ǧޛx!v]MXq7;$m<.ȗy6\M+C⮒ؑC8 F]:.$Ihm dV,-atjHءA"16Dm'n0ptM;-K?յFo9 1̴»ӅA%w\&G.VE5e`eȪa%䞉%8luAֲXfuڶjehqC)@!N0NI v'@c|S|yݲ+ҦF%yg)tEQ(ɲ0!K!fKr~%}8^22G)UT% Q%% A @8H"j L,8GG#II#ؿ ~a B_8P ,Vm$n2ZJ^Ϋr^B 2É)mca"XrFr6<-o 'nj|l: Y30 vdU?M#7o_9Nx8-6;".g޼pF,vQA 4g>6n7pH2FU񅯆aרP=^ԣ\[ei*MR:Et- K2nd2gS^u,(κ)K3 ? ? f,=%l;\G.CaM^YԈ!\a֋|/4%(O?$rN2Eҗ`h`h`x H߼\]yǢ[R4$+'O0GP%nFK`؅e8Cv6f6 QG4'fHZCپa#EGF{Zs=u6MBt.WS{.3KP^*#΀%("w ,X k4X'B.>[Ŋ!j/Ye gk%@D(= Q5+PEI &a@FKhddEyI)g@x`˅rU'39q&c *Ll>px,^Y$:ȴCȢЋKKht%nK;͵axۅ 3oCVߎ> <ߍ1!HT}5x5 endstream endobj 2425 0 obj << /Length 2498 /Filter /FlateDecode >> stream xY[۸~ϯhM i6b`QE[r$9){.%l ")<<|ۙ:5Ȇ*2ļ2WJqܫ/K c2N-{(#Pp dsy~&wM9؂ws#2FJf¦Yҏ'i#0U}&05f07 N&'!K2=n3kdZblocްF;wj۩S+,3Kw*Z4XL%g G-E:+ 9Uyߡ*bPºk`ہED!Z~:pB4S+?NMatm}qD/URh,zb1/5Ȳ]SvnB!$oޒz ~xOAn︽mM(5("3]{460 a~- 56z3\ݪN;]j h+R 9O\ڤAlEjBBb' XEFA& t $ziT~ol%ƌȴ `##5Cܑf]YW-w lh657$Cea6 A>ɒ'G@mϜHȇ,+=kd;^3{rܔ(B%GyplpIkj*=zSV"lf+~鸻(ZNZ^Tyu2t(nGyIek48" Amx*Oh13H1x o (XchbZ>1iR?v]SpK Í#7m}S)JHS&H3knBB,-{T "$bb@2nܫj ќkܗ $1@nC +1H|~._]$,~oY=A[-6m[uŠ0*6 wBͲ/nCLa4|>C0 ȼ EPmFmZ֣[!XWR};%43<9~} [E)&o~x)nXA{cBfqydV![f<*fx]>6ߥ%L`B'RoDKӘ?1ufJ ҄t7xT}҈kw񜿸9L )}8!xqrDO d;kn2d3տr׾nbZ85U7C(pDq"5 \%p,N>i?Q5D^,Yw!a>#(Wu)N? ሷSuB`4YQz =v|i)N'T&9 pܧ7)08t\ǭq0xs8tsł 'ҳyjM/8.+ y8MB "wL. S8fmaR0zȝA(R)ݴ?+nqs 7*CfTXt5K9ц\.}y‚W;&@"Ю#8]/魝{ sx7QhVtDWSr !(p@Iry.<y\'eV 3e>Mj6ߥW~hôwv&ܑzj -ईO8=+؅{(iK'F3 GX _]ԇ:rt5 O6bEYp9"ղqwE W< .R :c uĿ/d2扭 @3ҹ6M;I_q~qݐ*}[͒p綩ۖ T(CDpgs)@e&,`_  endstream endobj 2430 0 obj << /Length 2341 /Filter /FlateDecode >> stream x]o8==Db(QT͡w6EXt,uI;!eQ] ܽXCr83/zl\Frv,! tvQ>|GI`Rw:7uuVҷnev5{ݖcQp. j@/Uo4dDdVj= 9HeUB'A&;\(OUӺerKkf vB)f Y$Q=qlybAF [f qrq@1ԈzBh$<8_/ *2MrnI;#ܸuw$ we}=e$fa2uٰs=#KKi'<{eq,s]ӅJDqgA6hv뚾.hv6eU5wHjw9kk4 XJ5Af=5چG{NI1*<t'y~4ʱ# #V-vzhǀϟdׁt@aO΅y_Wd_Zp!r?^#uWi"NҘ>t<Ύ{wuQ@yWv(b 񰃈dG, hm|# c7c7'2,"A͗~{GJfwb8B *pR::վ[WjsU(o`v[n< 8'VҨ76/ndu]ó|{sXw?h V&qTWD=9BQqӛmo&J AeD1|[.…":XԓXYЬz^wuaU۾R͓ҸSgit8u^``hVe=BMJQXkc:Ék a.o;'cGKE9d(w.cfu6i4B4hKX6̸)E5#ܷ4{7ǩ]+q&pڅô+I̦o> Y$``Z^}p$ ~_`> stream xZ]O7}__׮P$ Ejm%,]\/$E\/@b_ y}MHl|*Q/Im&E 1@sHٔ 9G*by38ZIl(8R(Y[%P GA/*EGa\Ub _鴌^.l2!4 3MNSU8~VRC*cL;D!R*RP7AECQ-jU˄iE $QBuRՊLPH!PB^.,SR0 6huVaJZ 'w (ɆS3fQEt7ёΑ=rdU9IUi1O :u81LS0JRzE),sŇ y}A..c:\1ve2̖z.#3)Q35+j" SV`MEUfاWBR4N -@ ^?fj V2F\2ûtZD@ ط%[_( .o^XJ½lӚi~B| ߊ0 c':w!zL6 plIVW. ベ{AH$pW?51tfAHdR~T-{y#*X{}LOF^gul#=J8Fpl޲mVi }>3&A}E77 GQgh6kj?vtzsӜ\NFO6k247dj||[m0Nm-ӒV{j'ZW'H]crZp )Qg83)t$K&qjajڄ<(?u&-+X+]7yTNOC6C߆Nyz3.H8 QPk')+zlt:i/Ow-\~<:*1 @@x,C5@|ӱmŵdג]?R.XrXyc-X XCX>R'lwdבKD"- R/C]ffzf^ʆےÃ[> stream xڍVMo6 WdآEؚXN%;(;3ɔDQ&Jϒܝ}*Uȣ>*sVI dp;CZ5hE4PlRh4깭q"|Vʫח6]X}pX|4z@.4d9`q|Hh}}V 1Mɍ*}]ԁul}!K^.(SwFaG(au +?37}@˒硥.BdX7@&ȪdV΋Og; endstream endobj 2442 0 obj << /Length 2859 /Filter /FlateDecode >> stream xڭYK6W-*F̞f+^qU=piR(y29/^ԣLU$B |nm^oMY&7NCnK_muտo+0/r+6)B%yUY?~x*z;wf0YjM(g+`e\$_4Eh6=n_ʅ"y}Vu6ǰ]UKY+gmб6(Fc ඘ۡ4 LL{p0 7Y5:;fVNCFnJ46[2M٪ߙZn#E=I ~Y~ vǫN"x 2ڦ@U *<^".QuwQ^߄-*4s,࿣Cp&!kA*x)/ák]VaN 9ցB>Kpмtzs<(qFE.X9Bg<Pp.Ie C86O=ZrL DfgM?9XytfRYm;ǜ=ȓz8:xG'$pU_!JSe'ץcat4(\O)tpw8\=2F"P7P{Mnq>KzbvFAյv*X) phYRdLˈOqXHBι󾏤8OY*(}娀yf W@g?556ez;ol;\s `QG8ȞQ KYc'[O/KYMZea/ r 8΀6ipdj)6e£G CY*W;N<çEqOv)HFd3s%,ƋGzu[ոbZ%;V˻ٔ/#=nn? Nn=ba@7 C&sL,$a4vQ2`̃ 5{?ۮc+q` }ᶒE:%zcu{ h ^&UC' gdzL]> s|D>hH9ʈ"Uxrq@eW)0hJqc^t />QHZʥBz"|\#3IcSƻ̌ڿzhgcF.0A.Hsг$F VYw0*٬z]ț*h;9{z/*e^%֍F t88HDv$SFT "RK5 a,ck@L"?&'c^ - *G0ptC)RTB/x:%- CWv{2'7kڅ7~'@o|5Hf>93~paS3[ YT() N7l}{D,gODŽxгZI)Mw<5B:"u~8@-=\ro\=ux ܞda Ԑm7 㱺NZSqMAF\WCwJ淸,PySZ ԓ{?HZ}Ok}#[?Z9pYt_q)1ueH?Fz z:y u, 1}_'{ \ܒ`\~!2hl/x$>pDΥ#gwhlxգl]vՀ,cpY ӍnwFRMC L.1X! |1ZYQPlPD(Ϡ܎"U_#S*,_txsJ'#P {+Q -rV`IFE1elUp?.7,e6;3nVwn'K%4ޢ*VRnJ!M endstream endobj 2455 0 obj << /Length 2439 /Filter /FlateDecode >> stream xڽk6{~_NbEGmr E^8(hȢO6ٻ?3,{[Opf8/E"Z|ѓjQunQae2(-fK>*EL4~}/GQjUVthLP8Prm'p t\@X B<-3lZղk헿\pat×{&UQI a -iȞ#? 2NK s+pk͎uo(la|(^4J4MZ;\(EѢ/Xu'n "-͊IbA>Sh iyrPlឆL- $qX%1y&p$+8J v3bÚeonGj 'n.ٲ&h̢~QmK{Z@&7Gһ_/4д$zq: ogrgw̶+.o-B+w,:g4p^Mq&*' nPE肌ubhRKO8I̬JO  g`sҀQdx:NhLG":ާ u7)>;J^-aZ`'O΄v®=:{}}q^e{:i#ȕweD}CQpJInhP!IbI!86=[ >(g"~fCuq]* b#qKFzçv &tlWG0Gm.NӿH~d#O'Jѷ7$$jt,xًjVwaJgJS5DF>a6!Z< :ѣ. f}W7GE43UB4P`4<9C*_W3>($Aza~;ӛ @>+jQR0FeG,gqţ^пm/*%[}n/)h~iMXJNMsdG|}ވJ&eg϶86-1SE Ӥ<{K9]4G $d}M̰|y )U" v `#Cs VyyЄ9XTQDz&arNq'{"24E(!'SH4ɋ6i9*O.[wJ"D+j>WS='DRD;|{@?5a<yI[q`vcWz.M("w9= N r+)VM9#ff|B)c1zC8tL[N8B&4xXG] _m#T&R $W"'nJd8zɋ}J(kl/ǧ^Gcŀ`φ{?S2V9j͏?5{",G\r +Y"ݕDEl N'BDc"}͠fU)J.!&4&+ipEU/]7rJϡ<16ι`!9\E ewǡ-¹[> stream xڕVmo6_y&.AI!ClX[D$;̮`xx/ :?z< >ƹ$IY;G! ,?)=?̝_{qYw+M+^'̭"+QAWF40d㾤bssqL4 L4LV /UE.8\a4Գ ͚mO\ހ"ݚ*|pޖx#^U5] u2„G!̉Ľ&(",ìiYVJ$D :I݂rv0@;2ES e0QdžxN")Ul4bMX[l2:]ՐS&gW 8A(TM+Fy _@P w=Ѧ)D3"`A-)5(m7CT; #P3 0T }E}~ёG>-.N^a!eӻ?uԜlL&yS'Γda;V 9ꀕ "㿳"SṮ?IO_aV++M0L*xF Gg/\i'y4ӯ7ח X5Q-ݡaŨ=#qrLF<-Ū"n6d-,131R#L?O 3Z@3іOfʬV +_BãxcyWLdV^i]+e eJ[A];֌YUb%ă]_R0Y8oJik+Ecm슀j[jKÕvmx=o_D'9U;¤PuSࢩ-Jm "ZŴY3Smi嶠Jѝ%>CZV-jQnyvs=KM!Cu\郿τh|9~4JOGG˳Fi} endstream endobj 2464 0 obj << /Length 1855 /Filter /FlateDecode >> stream xڭko6{`$\-Y$8؀(ʢ'Rm_#oɰޤ7YOɯ//MI]9LFH.6/ t,,rjK}afJ5ksմ}۟4Cg i`zeS:صF紜<}u{w(JG*Μ{LNSB+ۈrbn~&I#h :=gxŹ5 ƐrD~7߾b-|FSspT`7WIam-NdzfM5wgD⼆f5XDRM<ǓWpriZJ3؟_^ZY Ѩ fv[QXW\C5㋩J`l5ykN!5"L7O*Ik8Q{"Th6 h^>LքIH۔_Dq:Z?7VKD)5M4:5ƶЍ }" K`# qQ0рbo w endstream endobj 2473 0 obj << /Length 2403 /Filter /FlateDecode >> stream xYY۸~PMDUY\)c$ueg+#b$)R&A˓ǧ Pvm!3G7}|hE"Z}'߽ɂPȄ/)_, #.MbfZ`:x+j-80;MKX8hZ/ʨ[n߽y'F5gaq^e"h`HrYsO掾<~qv,o elegG"&Qꗆ%y?TISiV} j.a"E1;UQljZ])Ce`"Vgf~F:sqS F?46i M%vݫ"3\߅?=r 7b &꾣ѕݫW:TMO ߔgI}qtSϼ?Z^x$g|ZibOULHų\\-;san͒"Y-K%QR~"$2AiF3`X6!%It"p.Hd=6+0n͡734iM;:[\+M6!fw2,;/?^&:%t9sV@1 w+ \fނi~kO >I6!٭p~7V torFv>YyL҆lr)bddž[Q-ɥh 7;KUPGinԸh+|?oJWF(rjl{ehEOډV3CA?a(~.!O3ϯq'* r|+\/?^Vǭ˫mԚhLa.lyY7tqW+u1{/Wls hT_0Xhߚi,7n \4kqo~j޽Z 8p1^5}HXxN2dY2dr$='$0C XbHr(cf A R>Ep^i7n#cI:$6fBh`ҦX#܈ o0miE8i_ ܸmZ<+#$C1{Q 2|I|A2ÂRmXV:eK/uM;^XU~ r§!`J}qa&>;E-N)1NґB u}묗r4{!ȳͭQ u+ƠkkόW$»wL)Q)ўw6QM?>8]z!Vdsҧ/6>rBv'o˵җkc+r@@7j}\\1|-C_/'!YFu}3{@pEUasL[ N!G%X@G8q|) g'ufB^W.C:W1\EY5UXTmM 0di2W>di(!f<4<2JmA H{0xi7jТo}Y(Fz4a)sN@X|gy#T9<"$n_HAO&zYm=uzyNݹ'vZ`zC?VH9 %~Duo/T[Kuŗt(G3$~F@1ک3p3,K&֠.  endstream endobj 2484 0 obj << /Length 2047 /Filter /FlateDecode >> stream x]s6ݿB{05cS!)N6qT^x(6P Vt绋]ФbX.vx7`z:HF`"Ṟ?̓gU=:':h:uT*xW PY(?pU(ˀq*kA?02.hqUpS=S+E$k]3?'eqXڲ\%{+E΂eQ*NPY`-$Y.\SadsX0qbvfp_W'mm8Ɍ9 cEx>qHǁT-ŵÒ:U!?ާ±"rt*]nGS%DSƨt0eA,3e\ Qp؋|$@sB6 =OWC{J/0xٸrEr,uˇ2(]f[OMdHJ=vN?#T[x/jqQ<^]zVz4,BlI <d|ӟꤕzpOTe$Xӊ*! B<2A +u:"1zCn1bX3n./1u!t, gb&-&(f%ESKq(̂EÙ-g=|A*>FB4hٮ9ϵu[*0v*pJM4MkX$q~A瀩;:boƦ1o,g 2?_X/[mB Ƴ?* _Ph )Bo?l f&_Բ4~i;"yCp}Tz?uJ-iκ}!*UD%Mi37l)~iVXo_> stream xXKsH D@Y7c-0 aw8f6TD_/=_>JVjR|Rfo:cfm&z͢ Q46k4M[kiVcgXK<>قevnofǁř "L%'t:`x}( u:seI;}:Gb6*D7t6M?ӈ:o,9MHi`_3.i.TIzgs6 :SyI CqL=U m ! A $ezk8Xq\ G!I̜3s&X=e*` 0BL\!}V{OgT:EjEu9Z_[;K qK @ŭ#Üȇnx>Àmք 0 qrEF*OؑUޅ1oWB6x¬3{K$2;nYd_H& sla/oU=J?Pg@WbdY H~͛sSCغ-?EI=Gwfq)}PRPUIlk, %<+'I,jRڶ ,p{+3 7ml@W|K^=mY,0UMB T4'FL`B!̶FL8eolӭ]O02.7b8Wz7yOV, { =B?O^dQ-/~|  V Stڮ wGuETA+a4~e9_:vyeaTh5OˋoFK97tE Ȼrah<8n2re4糇קI> stream xڅXrH}W8m$$.=AdH,>\(K *ǻ?%d˻.Yy=yT߷7={r;1&C{x}Ɩ1nGi=[/\.zWw?"?c0VjAۿ{2&KO8 a_~1[CoQ}8^pmW~.m`uֱp{Xw~ ~86Ç xp~l⽷7_&؋px.px70=_6֟>etͶp Gvxȃ͢u8xAم!i<}Hqhz. Гb.Ut{@húx .B5y"ZЀX"OtCjԄz,4iԲA MRIRӇ zȬTֺd.Ze0J. "L&fD"J' m"Y2t UOf'MHaeYUK= L#n}kqD6ىf)KY.E`Do6LZ 3횘g+]6*#SW]S\?mh\F&fˬ?n#kuH|e{XYӮ +>I%z6o%,aZ,^M6#)KӢB?xe5.D]в졥Å3}+fEzԼB>ƽ޸U1& gIn{L yDIg[CccZ%:4 #%}J9}-PQg~*؁V1S{4).j5˫][wV J=1u!kDD+EzmO8tEUqI^RX>o|[ (L{h*ۥ5p8U ⹣UVV*1HE~=#U^ \"o. :dɰ}ireV htYi>^nZ$c'>LR?ӧ t"3N혮ْ:j| iVVv!-KDN!o E:REV%ՅYI#o% 4€ȟ}z$;'ERhHT9wHUe0ϟǬ-J*x%UN#sx!{(ed0hmWF.>ƹ5p,n]y4,r)PR%a1+ԅKyz$Ol4\gx}! X{Ubώ,渱dF!4ܷICD: .sqzX1~c0~j *UFĩXu=m:U(oDOw1;# */7;o~W׷o G8˹"GDov 65)bU:<}˯)-DvH'#> stream xڭXoB`?=W88_Ph\PJ\"y|Qwfg&%I {^Z̚^X}~',`Bgpf{o],^-z V0^-c K,/|7o7bW}n'D#VlŞ7[8ݘع:>_ovyP=5w"P4)hoT}Qw3_@_直m\e>?z^%]2ݪE%ݲ52#Q]k$z̲b0n,O8,N-Px]N&6]xbP[ߧD^ ]}Ý\%*MJ"T#R0urRM6|U8PUɜC"=5+xVh!4/-Uy*i 'zm:_f3MQw(9h(p]׬$(o[Ul%9b_^ehԴH75MuFVg#;Zӷ utVbM6՞D7 }7eO6f'WKv~%5S`fBCrhxN@+faH$nQJ7(CǍ=|6m[Z]VfYt9-OGԒvUbǞdz]_ݧU](U'2n\1.u_UCdW5/Ҫ3ӃC#:GXÓ慥Ery}{m݈}g",d'nxZ5DsY oMR~6*q-a ƍhՠ({K۪' /TS~RG"?* ٷsmǵF'ws]TeNm۾L;QK OD:S0N BǞ绐xL KçtŸu q#{{O=#):n`}`^3(xn=%j^<MJ57IzR į)9/SRpoO4k R1AZ@Rc5<+})gT͌'"e()b~(?I[U[jkF iЄ$juRTemT( $5plGsst)kVT):#$I趨q=}i]{`kT9+[}o iN#Q11|NŸ<Z>{ZI ]WwĶJކM2 3Sc{4h9Ibk_#.Dȗ+7! ~S6"Q0G.+J 6"md> stream xڥXKo8WXbU[=MSdҠ%:f+K%(;!eQ p8oF{wޟf|>{u9'A⬷Nxy9)=?LuܺXޭ|u#ʀyAMDѨ؋Yfqr%UhV]m4r>vMM .`&nS 6& sw$I#N` Rא+:\%~u!pV)8qVyyӣrHdfoԅO>K V9VK&t\֭H릵%;gA஗+j0W33]i(dSslD`j_0+q#r,MѺQDP :-Ϫr|Z x\kix7*Cmz`!ux! ~rqխw{~RN˟iq7{Q.d]7n,(KaOd%N7YtBߵ!8HmN47F}յakpi@P#PlD#6A[5prD W/O"آ fI+Y@1el<8>ЂPF]|'5 ¹F,0~cWΨoV|ex\Aw%jTf8CsǓDv ZѕZ}N`t빋<$tPPA(&98~{qJнz^<?JA8WN.0[XтZ,ȻyD / $ϖ4O0 ]4 C67u1 r+(G3&B&KICȽʺj2H qJQX!bB UmZOBW.Iȱ14fC+ )T'J{S'QFtVeC b[/v:So.#}O1Rچz ]C w/MJ :'f??:ȉ$?㛏9pl m]qw\#me;˷j EXnQi14[AB9(或bEY[ Z%٤>- M3㼹PbY?ϗl dI',= $ Ǚ:>_&`! ,ns&7qµeDM}?Q6yP#ZMpdjf{~miCjJ"&J !#*̽R4nt#ҸH7IZ\%xk7lxeRC-!(7ل |ᆪ̹bs^8:xF 8B@@E(vw@"0m oA8C%Cg"ATKpũÀI8rБ? $֣qOr-+8QI?6pKJnqTp`uަĚ"X 6kNTӶnQJ> stream xXݏ6߿b0}ȸ$hpIn=Mphgcn#Ec:ý݋MQ4IQO~,.~nE~ nqe~Z˫_{Not Z'Q9@HEn]43 ,h9* wMoB7q-j} BU툮 =I::Δ-M< 'pbI؝(vF.4$sw_A"-Wo^D)w\Ai`ʼm Ie79θu=%$z$SkKc\X8z/pu"+"; x=m63 W9vs^݃٨@ #V/+LP] D>lByE696++:11H| G^$(}ZWVH_| s%Q8nXsۥ!`ھ薟^>UA4O7PkKDU3c) /8(<+@] 玡!QAB40,>f;WD~*cwLgFc! QG϶ RO~7-zY|@]?T|DD86E) 054@L,<D3 0PA"'f nm(:QMs||ZF&p ՓP2?>vp  .m5/?a˳gϞ %iδ'T̵p &n Ф)4UYBT> k [ 0ASÀރȻ;m-KT[? 꾫щ\ƀ64 _M;;~ohtIpϿDޞ {sE;8r5b*tw}P@k`QX0t[ߣPtpf6b̸QqNF>9U'~ W(~xNh9[{OZJ-ϱcnE@>R+niۧ9mRZ6n&;ۛӄʃcM [C|٭fy=gŝZϥљ, Dg t.MX9YP*$keژZMe5 OY2AwnjThl 64 IKE8.ɐ+u̱.Ip")j:F:dQ# ȣ >y΋0du^.Qێm'xfbz]y24OЏҡs!+L3ml!dyǽ('lL vf"$dzӷ[䷶P)p(q?/hV;Q5Drn M@MU;L38s5g{'euUޖ,Nd]X=ކޕqέW 0LW֡4;h@=7 GX+}6 jDA5`)QɆ_YA'#? W&@[qf/! PHHyQ'c1R?T G ybwL#$_X=0$&}">EQamtj?Q8G2|J§"`p46RE&(8qtx˄N"ї]a֨w 9(\v"(PÕn{FΦmFْՂDKN:N掀XOqjΖb ox> stream xXo6޿>bZ[itCS1tH阘^ _T$GiľX'^dot;F<<]>dQ, G $ft5YtfDrϵ(o$>y4̭̎)$>j91H\$S?h͋Q~e~g8%a@ơRKH6(܍ IGN*ф ;А' Hf,%/*y&e%H `R}oɺ*R4}#x ~`.N ZZ)V ^*{&$ZuU*Bc͡-9p&s~KJn1ф!8z:HK ueS: OӬ IYC ,L2D$qxPP5`L"Z h MWGbŸRX9y"4Vj)0l=hV K|KJr,69SIVE imgs&V9go:E-2,L|HS)6y+ÿaPj-E0L;ՠ_BG/ٷjhxPb,4E2V[M[-3בYY?ڳsa{wAiC| bNNNhUԩE]I4@/сnnNCGUyGҡiIQnLTʞC% 4/j>dg j|KfBeo[҄iVn`gŋF(|3~:0ENp(fM b/Eʾ2=5 Kjզpбc4:4l6M;kmMDS]8sjiF EYӋ8|/0h6bf|X!6Z?w/^rZ?E0xx9(:i@'T TMUa 5IJ3KbA)hzm'p  9-ɹ榯lʍ;DhnF;QdBKoFL/9  LlKtC0T P݂F[hf|m~m6;`Vߊhf蛉&"HQz߾@Yȃs@y'HZʹ7VA- Dd-[U(W 22m 0UԷ`oH2xcLqh-X+j~=d-^RiF.[ubkQS\oзGi  q aͪ skM\M(Ȼ6m޾\y^ҘlKx 瘡o.~#B? {J k6ҭr^ZzmCQ؊z$υKOJçɑp[=Οjɐ}s6,f^]U$+Y [pxs|Ы{G!H1|8;/N`>e$MHޖ?ެ endstream endobj 2528 0 obj << /Length 1433 /Filter /FlateDecode >> stream xWn6}߯pRPw_\-4(hnc)uCeKuEч>&rf83:{˞wWU8Md{$$0Ѩ7zKs N0eEe&"죟vwSPd$h '^U*O) U.C2JiAGdޥԊQUb{m.`3.q5,)KreBh}"!80 3xE!F(ZawrPMF5ŝAPn7km"MsQ]Mp'ە! EP)!~՚jb]C&$Job6J*JBL2L~qb[U 5=}i- !H$Q-l^͊pw?DcG8̼ij*i8%ȼ)5UJe}@I@ K(c)ϘqE͠״Rؽ4F xp̝͝ .04~$uYQ;0U恢ayj0wʨ2re Wi" mSg'>DׅAPlQɌ%Jdk?>~f^x♸BA &.oOřm6"'R+̟Vz3eYk(R*5%x|}"CR2TK0_4k^+p{F ST֨a Zl(kES㗴l6qusg .]s:ʱ*Pٞ/ia:ݏX=\w0qg/bϬ3U:&zWy%Dvo3YːУ Fd3n 7(ٙ%AVBQ8&;8;p<*gx^1:/лxܘdžYq?vk)r~}`HpR%ڠӵͦniR.K'Ofٜe91fEӠF66J2U@=Y%{54rU6?0òx- v$ HgLψ}o]1»nz/=XR° _)PpSTB?a0w5|?0=YND+Dv@.YX33C|pB1RF endstream endobj 2535 0 obj << /Length 2168 /Filter /FlateDecode >> stream xXYF~ Z q&XHEF)fv_:)gX>jڋDžxͳ,n[^-!/a,V# ൗBmX}׸u:eԙu#4 AM}I;r+w.⢺'ƫ(SaoU$+rkd币x࠯HvKT}>Xœxp|>똸+n_(\KcgU}SzKY:+lLg pa((avZ\K7dFt3*S!;*]1zB-* ~_/X=U.kf]usuhNP$}j nYEUt9^Jљhbs9 f_=Q'],wUSio5pLեmw[l:OQDCjUA="qςD:uglgw)hɿ+a1NeNBH 6X4L p.չa {i# .ӶmJ(<'S0$2<Bg.- H5hU},^YǥYu:1ީd_Q}zL80#pPMg+w pyhްO~R_T=wBTW8ߋ S6=ݘg[wyfkHYԠ=P) rS1.S*^C`B &yjDqeΑ#Q|^`Vv}KcHԻ n~SNqa "9ȃS&@2~P;ۛ É΀i9A4*뫌=1íFw>)8e~'hCo(r w8?qG"F'9jx|*#%`q1jߋ Ƒ>C)$&&c\\gT` C!Tm%ѕ~l7OeO(T-vL`}І>C 87f<_DjM@$hSa6e@ 7.= ,@ً=2zw59":W*<g?tƢyЗF(2Q[XGkL ?=1(B5*|. +lGIGm*CNgbyQ,?1pkڥ[j1 ,,:/P텳h#g)ht}QJ sm f@~o/nsQI bPz<1aekGn4i+ ʤfGٛ ]L-X?~`#/֚+Y]5|4jӠ_'BC)`L0 hJ{TrE4G8M;CGŽ0ત8эD XPsi:8iC}#n7l%H*1Z.[ <'CP[4>S;C `m!x茭ۛoo/> Vj߾[̶ Dg<r endstream endobj 2432 0 obj << /Type /ObjStm /N 100 /First 980 /Length 2341 /Filter /FlateDecode >> stream xZ[o[7~ׯ / pȅQ ib/( l,TIn Zlݎcupoc L1>l$3DC碍`|ɄD ;lR1`ȹbtX1Z9h+"%hչb6]Ъ#2_.b#Ja FRj PP@P'fy)+q.zJy]#Q Rg*rUA8'%\FTTMA!Q eF ^T-:y[dPUBTXHGd*0jb&*[FRcH(ppubxW&ũ69DNbX2)k`יaĮuΤD,0Q[)S"#XxU4aɪ2SZ3٩&+C>#g23ɲlyD ~drQ)DghZt*p(pO삁ډ2ZIx&`P֕:FLU.OѠͤMuIֈ:e뻠prG3 KA31p+䓛Mb3Zx>,ٙiSGꂫoIK5?Ϧ¼4?Eqa>Ou.޵{LNstY;̆|*x V`7T6!0 rH#JB@ےT֭uE֐e` 'BK-'$ڠ:1H~ǫ¾Lo}/oiv.6u:LY"U*HKK]g|P@-] {Ppo{ɚ*K#`1H1ԁQ rGXE`]ѳbf+|>5b4ly{1^lrq5>>IR?<aAa#Hx@V *F":ŏDX'D,mε§QނFt$+Cu3A϶ȳRPRHd 'rVBVBE4n.f6JTÎl+֋n̨q _@ ݑÏvVUܖ8'YK+sW$.tH+ 2}W5FݞsܱKu{$Tfz l(`8Rw8*6-ƣE/H~WRi2o;U&3+j[ÉwHp Imɵ7otpwalPN>J:>5e⫷i&׻3^oK:`᳧p]GD 26q40 :! QX܉Et8%Y]q wˑ_G;ay{E4;2j{ѽk[=iO8?|(,(6KN*tzjt$Iji*חw9ЪHwzU,pB&fJ %b 6r շj} 0>Ry\~4|r*5*9VIdUMuoUz3 XL)u 7Z3)Ś֒m% ўt:!Co0*5 < 1Y_{)r]Dk`}qm9Pa~ݎwQ{_ ݇_vPdwǚ8[2?03qIYUiGyjitAny 5 PRs-(ыhC&j~WAS'P` *z0^i6OX$ endstream endobj 2540 0 obj << /Length 1413 /Filter /FlateDecode >> stream xWmo6_aK!bE Mk,ފ Fm6T2")Ke؇~Ixsџmg __| "4[of %~< D|sA h~EVL8vwY XV: XFe0gy+=@UnrG׃~Z+˄1(i+{ ʀSp)J@N,0z kqfB~zz*$~]I?9M!!ci`83/##1Ӫ J?FNvŇ/m`F :֮R+ݽܱTLxAt>aJ|ĝ9Ux%{ Ԃ^CT0{aX KFC zB&j;87u\Q)e*[]]^n D(`ٚ6?}hWSb󵕸zǷSRoZ?2Oa<ϟb !ɔ ri%d.`'^ƁިO^5S&%XeFפҺncIƊ{*ap)٘!{ G0I4gBb(jx%̈́YSi`̌U2Ün64SJ7ceIxFqaB)yĜcU:G];k׬فaf3:XsU]shN`c,E gH i&푞K2zEoV泫jf(0^~m|pVvظ569>0 ZՍɞ"}NS7SgJ@E8Zt{ ˃$u> stream xn6=_axQX͒\ ŜKdI4: -6Jt%:;G$e)3 ؋M/|WLڱD!Zk7fqC aXf'"낖BN,GK WGgj8\-х{Ď 6%%E2t|Н/MxtǠJ]rߤ췎ND'. ^t=K/X)w (qna6~n.c 0tVǏw^džvڗsE%]z-Bqٞ_:2fl4+ *;UfrEDBR qJ!)rNg"OԞϼ yo*фM֥ȳ}7َ55)>af-ƒ`N@rEh>As7~/ɔXËMrl8oUqin.$0blzQ:ctȠk g Bkh.8D(W0/ْ5>bin4#$3ۮ5o9AR m 9{֬$o:ZXeiwꟗj2},O߶+S{i,ᴱ1M )'cc\ .+D4Y[mb\=y>}p4+dIӽf$^f|Gպhf4&ht'&5#cR'FQ2<4Oozf?~b%e ,#kKGF'iɲӚjZ<08J`g辚@Dj,G5fت+6-'tɍʎ/QP0YMԱC 0K1TANn5fRx| ]? \Jk3( T5 ĵ*>‘kT}O#J=j_71]R!L(AG%G,0'ߺrXc]pSL;jts[! lߪ`&pl/(: yd endstream endobj 2553 0 obj << /Length 2013 /Filter /FlateDecode >> stream xڝ[oH1R1+ͅPKmVX TߏsM<3̹j,Vߋ5,Ӳtl&&o1nEgV]Ѣy([_vFhzVB". 0X `] EYx.,mJ}Ԁ @х$DAEƅ̋-G-WEYINH -hj!)IIiQBၭl[dڎUD&|d*E(nZ]nI"b3-f NcSF :9}P "RVX$,*YN]5T}x̓$G%Tp\KTabFYrE7Jn%jp)+^w9)sږ WvOz3wܠNh{8Cq*9}(ID иd'۷L 5%<(p=ˆ S iX) 6h뼐r+.}uaF6wi:$R6ǐyFXCZ) Y=BHdI˺wcMO6Q”(+)0Y.&e L S9YSFOz"UQ>%kc"'3JEԜ<7/gIs<%b@jVƅ(_JBz16o+Eڥm4ìΠ}n^L6J*M\Sȟϸ~;ڞ1:ׅ5 8:Z 1͠?FoUf+aiuiֿ0Vˇ\r :[ŒΐN&5 ,cIUJCc!6j4vZ73M-C_sqW8%M=C0Vg}("ʎj(8ٚe(1 =0bTT.C■hed\Ox Y45 8x/TR]P,QчjO OCs SY9/STB[B #1њz؆}VEPCSlB^r% Yhnbd|nCq_O5cTIę,/"T=\x.wz<쭂!nUo=[yh`ӇA2>&?e`zӰ-&ӏQbN(6<4ĕ~op0ӓ| F%JjN܌.'7ʮևFk79e]o2Q#e,?>ϳ,6rS0jTЊõI86 CtSΓyJMP`zhkyL2݂NaM`Gew|{i3 vc}958svq\na&}|3.U蚞}n4 nu8]#?B9~e嘬\Ngޟ <^6CΕ9p& |~hu֡yYG9HʡA۶iZ,xԮoquF endstream endobj 2559 0 obj << /Length 1710 /Filter /FlateDecode >> stream xڭX[o6~0b")1 fh/QmQ(ls%Oe~"%K~qgW ^#Ttyǣ`]:MpwuSAss{9zj@(9-_'_1&sT 'v~a<  As!ԶbE "1fM>Nr"K#}Dvs$1j7w ǎ4X#GL#;Cl_?3sL\\5> ַ㋶(_C!PFf. ҦcHFx]Q"~R nBi"DC>#k'6elB#7 aK%Jw/{B2+7rtΠ,wF޵pUHߚ]`Wۋhxb=pp>vS6>Ƈ6qvW5>$ Iƀ ͹`^Ql4W*L:i4Mҙ˖I7{4_FLf%< 3Myf>cK9b{ 6Jǚ=p xY[8@)M s$IBay!ȕn3~p6x"w#NOHT0'"{gHe=tyY .HiqKʷ(mo6M䑊7/)gL|s@e3*Z+2}yHC^}[FiffҞc\IV%9kD}\WgmeH$M>,E<\,19Sy)Ntb::2'C͐Hʬ4P):(aٖg+ERAhF>bvUkTi"F98Rׯ R3PMf\3j|**lI6QdZEhIQω+)&Zh3-X j2{텇 z sw*ߦq+"S 9CWɭ[ߒ]4OkѡJei4 ~YBakpAEV0ȍVȄ 1Km|;`9Ƙ( כUtz Pү޶}xBW8>);o0I͏F\>µN Ǔ(^#* >NnGw-D !w YHzx( ^EAY 톩Mn'QXRYnuPp0@1^d|DQD;M0Umw*vaGܮFpUMdt&%.λ_;ST+,+ "z=҃'O"BeqHݗW [Nխp"a_^ =ڈZGT]&wlz?P'it'C`=ɬ8xYuILt#`2kZ%LR}!T@#"EXx/'ީ}d*zȵn!fqY|h~CX3K%<U\/H ~{>TˣDZ4|$#~74AξZ"}䓢jLwDMS?6^ZRk-SSD!Y<ƕQ?SK endstream endobj 2567 0 obj << /Length 2231 /Filter /FlateDecode >> stream xڽXmsܶ_q|0oF|g䩝8:&t:C;I>]}v_t'W~",g]_l+>߾>HZ+NXs'w#Nѝ.ڲP%Mx;LT:3!Y4ЫOcNA*:l8jር\yȲ8 `:ZU]h";aiD8KdX—DPUU)$nzo湬(D,,_}m{%f { L؏u$pYOL&N^nIL[Rֲ(gm`8л6.@Ym |& DİC$/\L`{ᐣ Ḃv3E` :ׯGy5u-F%{ڰm?Hߛo Ė"G/KA(8gc%B;Y^4-S/_w_`D!MpgӉ DL'xfL`9#O'1dwM'<Vil"8O$L䤯?~J.qF2wq.'Bb67ص$HH.}g6㔖+zrhKs 'L k "*67&0̐i yaEOi`^N,јQznGN\56<]'S!tٌ~՜3ERւgew_iRe9 pvNVԼE*6{ql9 x>?,AVg=N֍nf3=-|A ~َ~AJ endstream endobj 2572 0 obj << /Length 2299 /Filter /FlateDecode >> stream xڭksG !$AwVHv#utNQ!82볯A=u?noowoߋn2z2'?\fUZċz-UN,%u1}w}1=K(8χi4^AOwӳ(0 [ˑӍjUN4΂ /ֺ7OqF} *9.JnY-mϛ2Bg*>MsvNOoE)),|Ίk$$i1omS z[ӳ4WZܟD`٤WO& iFsB׺G,|+zA".IXf@:mo&*ȣۀ.`iےY>Ry{9Iй@8u.ae[1Hz <P1X94MF~R `x6{ )x%L3Sg{G谋ӳy<,GS6 Zv՟uw*[[Ƀx`:؝=m%;anZ# 0]VڶŋEԐ1f_CTǺ5HĆ00'o$t+7'honc[w?D{q}7}w#dZZ{7/W3/IT& 0vr}\@+5R7F\ aMuol)@:X:Z*w-ZIsEJUW=rƖ%pן{Uйnv>{F;! ރFSrN}>/v:]t"j缴/~@7mH0ܽlUߋNoő $mՈV6[g< /l&/Q@X2@p~ܨ.Y-ɲGw $ZB:hNN(큯 FPL7fH%䈮ok]uAn ɚq!D56RH{ Xj KR>Ҁrޱrda7(T1ÔG;aDpjjSc/RĎڝCqiacKi;nz\|?k|H̡GPf39hƃɸ`:ᐳϨR}^^Cְx쾩m!7Œt'^]q6R!<;Cq;}nQ]=yuM ў OC/'VҺ|u!Kc;2j3- xEO_F/á }Y4ןͭ)M7% ]plEPkȫkux%voPHl%zZg߂#im1aQ ,c^0a -qD &$$9i9|@KE$I5eQymg(,LJCt,L8U>-K޺A#*ƼD@S5f&"3W5P$`*ACؗsIrFj[`/iBsKA("k5fIl{֥i)GJ0yq!SRJI.až_!۝s!ꚿ*ތ>zJ~ı!243 I/!'AB_ak{ '%^$052 |ƿ0!.'X.8?( > stream xڭXKo8WXlUo]i[l=BItI*CY,7Y3<gt7rF']z-F {yz=Q:ǣll۞ν -Crd|sz:Պq2~=Zk/°s<؆J~wBGJo`K@_O:\^M羻^b,c$$SAZ]:*9UA $<BnHFYO>ǒwgfΐ LݏF6Oы{}F?$jtJdV-]RV|{/y@**$Dԅl\%EhAnHjxttqd`6lΐR91,NEvom*0U`5'yd+VDA_=JS>Q_?w%Sޡ| v'7=Bџ{$@,.(]b"'U1 \8NW?o'Γg_WZ`7Tl3asNTs&{Z׍lʰ8(RN:Pǎ:l 2ķ"s? l?k RuWAO  m7*dϧÛI%M){(S oG|&~rZEKǦzlF *!Mv jȚU>m\OF F [N se;)CY]LN&+CmJ UJA/%(Wp\+٥X$E8 3I^ifUjlS#^W]۾Pʞ"-iI!"G)EcK {!,Me^76BUܚ.(u@F>Ur?UiM-pthkf,5#&lJĊS=hTMMm "9vΈߍpdB "^#eusmg *h7,L<;.*?&+,]A lW@vhOI1Y)fhhg0f9?xp|T^6Ӎym?b?T#Ow6j +,.HuVԣ8؈s9dnH;"Y!IJgh{IJjEPdOSFApvGPZQ`dVm_ N})(s?$g𧯅A3q0@zVOb+7Yǜ]ZQQ8B¸<1cT=^σm9>#޻/~LkAv̻~w?-. endstream endobj 2586 0 obj << /Length 2075 /Filter /FlateDecode >> stream xXo6_ab1#[[df?Yt7lѶHT\_)Ksӽ!9A9ݜ9?&%I̜g۷o &:ԯNb!yp7_oRE=kS5Gç f$Hj/;2o<\/a|hKu2r!ymIih>v'97|Ǜ9?QSFP5gD%6i0flSJ.ֲjY@֫ʛ/ٗ߇rMco"BEFd<h2d)IS/n'Z2Q0s'۪iUF6unDuV_c.F2cY pZ'ءDD`RvzpЕHkBYrIZ[ h 5IÚ bvmq'0Q'G4Bc]3b;CH,vmaDz>k@N!XW:: $˫E=irzSp#ǖ"p仂4D57Px_PϢi 5~|sbN.-j\ 'oNiI0O*\v,{'r3T䍩7)Z^#hl7Vod$04~<#'g;Nv?2 wЍ<7`O4GE)ڬ2@#3A')VaF\w-jZiެ cF0{_gh^.,v>!3qmn6'뷠ɮ, x &tCŝT[j#%jEobP|զj]bLT9fq$D BxNp^p?6~^Ȫ+Dmֽ0f翔tcjT=Lc+nu/{MZ bʳ+RFvq5^{V)3`)iv)[ng > stream xڭXmo8_a(NbeurvE=ht%/%5 m+Q_n{Sh=rFW'~/N~Qb'G7]vxt~^~=^hsK+EVRdЁ?wu$ lUQȉH_vn9QZx2M`?#v<\DZܜTYTR a_nu&oq⡳/oomWMJHmK7"r-+yF$\H4HVMkw>͗K:-<1oDĩog8m~^Nś%iPlvHty5! &8J}W;B4խ`V"+@ʪ疭۶=|]3wJ4SCJ}_źˢ7'HvWʬcZVa&Vr)úSCj$N"ώrߠ[F6 5Brȴ~X2E׶R=֪fMx/<[KtҶOӣv<`tx]ECT 8#qŖ$Z(MD:fZ˶-`F%@.0ö́wH4(X.A?Z1]ص&/UHȘ;ZFK"uW?Q* k$)N)8f(j{)}б#'1ht H"@\BT4tD Bo^ `-)x Jm8%-!^Ϗ:vr)E)9pLhOgǀ$N+a@dm1Կ':9N\uFj="bqu2,[^6va8M's޾/墳Bq3bե*+sZ򿶼mիӪK1ʖZc!WajSg05Ghm(xc9TjL 4hZ%Uݭs3л)!Qbmo~1, Q,,䛘^@Y^pa=U*Hp]ӕ4r0SN_4lRV6'Ea lNi>3p*IkWb#ms82A{v7 CS/!^EI?!F=p1q11D "1L@"F߃84<NjteIѵ5-LA^ZtRhR:4)PEI]beb&cNl45oˎWjS>Hf\b'q/f/6HYkˌXѐ3xb.F|6J2 j 1o C |*W.Z~24!4Q`EL-^K(0f.%Rf hOka勩,Yoaw/WؙVFDԇH?K)t#cm6u(]p,RNP[{`0DF"8 >Km%WԥFo-Koo}@vp͇b Lg@|*0v4*Ep3d*kђ~ [4qY@xZ=:` sg@@NK)Zkq _9aМ5]8$7E=S|s֪H~6 ؼAzCodV@1 "ü{=%6ŏ+_3t z/l|p%]ږ ^W|6WML/PRM#ϋЛݷn@t5;S endstream endobj 2598 0 obj << /Length 2317 /Filter /FlateDecode >> stream xڥko6 !6zY;dq٭bE^QhYJT)Kh8h3rF^9{ݍ^8["osht'_|ȂrW"Wcp#.K Ďˌ W7fg?W+3Vn-Bb(pW4YSi%rZUbDps7 "W|kak W04ߑӳ:px |>u jL6J]]v; eAUQ cPXDq%E:=qS٣8(st\|qa\|/d <!?A(}63_W͙\*?wBg?wD.\+ ȵ\};a;(U1x2L<ufhW 2+nb`#`HTf"F?8L᳖3 jEՆ0>:ɴC!R, HwP#3c sSP'x/7@(`%@N}ȧ`Ч:,\Za!V=KԒ^!8Ѣ?nwjA2U%jWh$F^-a8r3Hv':j\Mgp!B0%|-/ @ b]7Ȁ9Fa۫H -D}* N3a,vd Ŝ6TtLsj:wQgs!ТNX-mj@N rh2$ SC03 F|r7t7 O~ԢIV3;mthݺnt#v<}Ɍ VHCÑ !3ym M<-n6b *:_ܠ>}438]'@;bXhckGas" @,R5Gnc'KHWXOՆ=otH^snu!ɛLA2!?,/AX췲>ՊW=ŞGM! ŌGn86lFK%p_QCɥ Ml⁶N^k@HEIKOqRXj Y r=NѬyD̋ca:>z>:݂Z=33h,7"_|%lp'm"8::V(hF^?#0Iwgiv? |`NXD*37$9uq(Dzjյ>tGڬ;5y9 u3u]wr}kI 2 -tAjڀ{ (36#Z^#c)b~oހQ/9hƁE%=N:ogmI|# v4\c`3k=-!>:T~|~_boDa ɣ^R~{ޖ%=Rv_T> stream xXmBF֌HIq{Ms!-XwM^=߯ -[Ebe8 y{U^}uy9x^*,S>,~کz pqXl؉Ш)j4f߻ٍ⪧knE%:36u-B䨶z9*قt~4˻ۿ ߯nD~Vg9w^zjEx uw[pTAQ)6}=UksLL:՚KN{jMc984gj!6qp!ˮ mhk0VEnjzihyai+ Fz0[(HQm^ϗ s1Hu@1m'.[DDi\~U{^.8ˢpweʭg(ps)Ip |6N)#GYI FUvqEe y\8}]OrSex*XG/Wf{"OXF^F,bo[]} &PXgދ0V齿4(yPPU643,H0f\YFĥa.8ELS |<ۡ`T҅ΊdG߽lejm઄YқhF 7VB.A93G0Ȼ%O",`\”űl'9SBNTqg73TUldAr`vtZz-La,Lnb&kF BſYH^e 4kjB6WU3,feqvghx6Iڒ }=V?heMM7\FvRb "9$Xah γ e x>6"tQ+w'6hmn Hw8+wf6KJ(0:xh4eDDYfRQV? e1v&΁xVNe="}/y$M"kh6;oikƮ֢: X>J[ Iv_Nٷo46pi[4UmӺz*]>c}ɝA`3{/JzYu-Uc! 2ZUn 5my,..vmOˏ^NjM3[߫ i`-)?&۲ԬEV+-媋>B%q9<δџB(-M!$X; 6OS M,9oC]a[En Lu% 1V)D$Ocl^l.!U5j6U$}*t'NY'dy"͒K>vx,-f1sxd,sAB36qBp!Olߡ t{jY4 @3@yJPp&!"_7f7< [Έ+'KX9G#^; l'>l@`Ͱh} Xv$0PH`+=Dǰ" #-;C`owA$@xk7H 8~tl݁ao`Z?w.'wf?xmSsj9j!pR62ӇjΟōVPuC yʕz9PWQ!y dJΧDYZƃ9A}Ww .2-;ou>-E"TÃɕeɒ׷Wr endstream endobj 2609 0 obj << /Length 2081 /Filter /FlateDecode >> stream xڭX[s۶~Ԍ8$&iO郫@",E%.v)f:}bzě=7$s؏'7w3_L^LnɭsjsU^<#+Ө?\e~"/_^NݲTbDD\7"R(cv[u9BW X6ut {D[#sirr)VN>>_J6֨+L{;E-I;O?.GgIC.].Fmh[%3=cuKRvt A뙟:f611TDj <uKk%$\8L\ڨsYvKɕZ۠BYr%*Wбޝ92E1>Ъ>Ϣؑn;a5A6vh6:GZ?u&zB=Z+|:ev%p$iyAzwxJnઊlfiz8q$}Opjjh+NHkNiQ[m't>*~'n2*"7'@8hL +m$l{"uO'-@LkS&ϜG5K貇10@7& Yu?cBtJT?"L_Zm&[N@sLWASئ+\#H7J̫!ОI`BϏ}O/l֪ə͑,@=6H(xZ*Y:$!huø-Apwcti]s2W5X 2 lj=WohlXÁ?*]c_#tG~_zŪKy42,nrJQv?ԓ,X~rEeRc%),UTWNHp͌M:MԻ._9dz;Nx$DK5}p՝gEko"pPbU[NѼO\-|X|'xn$ /9܋88ԏ!2Oyo_Æ vjp.1,f]bqgqcTmd[Zq&Bl%6+漯*!Pn7I^&)߳y 5l&TQaVIK>CBz,ghLNy tLBR%K=e?jÔ 5hoSywrMw#6.6gÑS@NA}'YH +;l[sm0]z ]S B!@j )C+;&Ow9Mn:C$q4y8%@2?L en^p(R:)/Xm_?JFϹDn(HFkHh 8b6VntݼØGΪ&-vW6zʺ27 6`ma{J]2z nXztW<u [z"l5!?Ձg\q^ vnVɚUޛy.F6=Jl3Fbzp\Um?Q 0(PG:> stream xXmo6_!d`fDz+ ][4h}j:(&m?M0#_L)v{{*3.Qh0^95=>hMYBX~ t!<(UeT {,qF/`j.utIlMž0,V Rh= b G mML۠S {ZNYeZ6ǯ8+ nw9UhM'( 5E-zfsVٶ-UYZÒct86Ŏa7O}Eڭ5z&f{[7 ͩƻqNFə,Q+?>=SaEz. sW!\;Oc}.Z6U Ms>W· > jW]"ٳ> stream xXo6޿ȗ@Vh$[vElb`l&*K(=?w,ry}#yߑh5G/o_|sfLdii8~1z^z5$a-rC7l˪ݓ6cU$D$L*5/___b+뛛YGXnp:;6lZ~d2scbsmTJC}l}V.wMs`܋rq7Yt{TZ * 龔Y^[v}t>J_IѶ7*]N]9ep|<ʩOOWU 5IE6WC P@̸X]/Dik4\kcYʽ"wݲg( B뙑Av]߿/@9 endstream endobj 2627 0 obj << /Length 1734 /Filter /FlateDecode >> stream xڥn8_a%2)lK)@4lm.`$:&"HPC]hw0q'_|//ήx;ܟOŸ,ogAcbb SL< |rHYM(*e#%K+9A xxP3)p2 v>)r#3ЍbPzb;y|]kfMk4 WUtj;؁ ]$̉dߝ9 Jo/7wU=S7-E7e" 0d:~Ko.d|'.3pEmvtx|j;:\38vlp zfX!,7Jb&Bp[ٺ4XAo"J䲑#f􉚑N!%!Rͥ;mqsL@ nhݫ[4/n5d21n`F=[n[u^8&%F[ ;et:70o@T* 2΂3^6#5viuE~̎ =NU$&̀(M҆[&Nc CM̋AH6eAH}A) (z!q[#iGsR<פ~6MдM;Dt90!a0 bI wCA0bDhmեT[EzVHƉjKM9IXF֊ˋ Hxؕk %j/pU0TJ3y<̗4 $\nbF g,PxBW imu[}֐4!Q9xkٟ؉1X_>:p| ŧ1ؙ-NZ}҈`؋6b0`l[ $Z 41+^l'RA/|Lώ|?qUG<όF-ؓ`7Lj#)M@(6g1L`EfTwj7 endstream endobj 2632 0 obj << /Length 1425 /Filter /FlateDecode >> stream xڽWYo8~ϯbUain1jE#ѱP$7ᐉ+iPt |}=޻S>q&$3_81wb{y\QCwQWg7˚fZW--eŪot5/02b̛mKYVojso {QSN-Uo%FRCej5[4x7VuVhįǃ;;>yV&:VFL[U*('PI`ihHs,vylZ,ȵK+p[g qer^" `y FYY/Vc U@S呉Gz4I++5"rSnҤǡ߃AN8I+<]ԅQ}7j828wS㍇g{Ε|ӁԺݪ,D}k7~, "c]_nA:̀EpCͱ@6: ۃFX%e1&k !f%mHHɈ%h!=lݵէF WuY7&v|-\C$ycf3aB(`PRѤV?5_nvC߈AihN͠H4@d.$Ј8@.E @w럥!gCKUrc%oIP;Hi>y3;<Tãy O&j43ؠGSM,z398}>|t9|q8?0xcJ}:> stream xWKo8Wx{֬DQ-&i` F#ӱhPrZ I)MI/ H΋3͟zOIFƓrI|1}v:h)K _> E;kv}>?;rQK,dvzyOżzIj1a̓cSxr; #% MQMi5BJw暲5GWJE#̑CmJt/{)*۹ܖVӶ>=bwyK%]!ُ֬FƼw>8yȍ|cɂ7a#xD<$kpU iȊdU)zR`P zmžx!AIx̀a4dn ~)Qx(9`l:ū{hu4 E0hAנPF;ʛBVYg$.RXZ;a:Di*!uV]ehN~GU2^Eئ)AӢrT7VBF3pOܻ1j+]i [#[Pp$Y$a{"&4MayR3=vV:>T0?„(R%d$=#[*X,k2ͺAO"]n8)_,v̀H&(!c$Qgv-6Mu=2h/a7BSJlRfi 9(#̺ຼV#f{n nX9:&$z0jYo)sCo\yzf.5K؀e[Rps ץcO mBr/>3< Tvrlʡy|̤gsu#'V쏙.@VSr )_\˛QN([K}>F[axOxu2(IDgҌ;Mntr6q endstream endobj 2537 0 obj << /Type /ObjStm /N 100 /First 964 /Length 2178 /Filter /FlateDecode >> stream xZYo#~C,Y$cNY  |ʒ#3ίW4,nI xfd#q&d2&e_ aQ/_a@ዘ@:D:F`M"MJE?S8Q|#g(W{`(3`,ȒM(l#aJb#8*Q%Bp+Y"lq : :%;+) "W7 = .bJƔHɠ!aiʊP#yekt-DMIQl<% SGސ+ Jek@|TQ9U?aTy`DJT` V{ RRy $IGl60RƋp tQ49lS/,)P1UV)`>&PUA)TL(@3$PHWOŃ"uhS 3~Nɾs^z8"vH.)nE-K(u+è(U!4L3?7Ɍǃ~zr [Z<f4@uq6]@I}úd|y̙i޿;6iufmyzu{lC;'ԹW_͙U)OZ B]‚‚>G#3ɇmE~s4ك+V|[Ŭm0yw;::#;aryA@h9 '9Il7V6GJ9i7f6s|Ŏ./v4n͏ӖلztX-pe+1tGs~ {ȪF\fxWDY+|"U jᒅ}c94m'vz緃Ὕ?gxbx Dlx?bSSPb І Yž9F'MweKG֘wˆ0){I:Z$tHI=ʓb=Kg7us5lv|5Ox7q F}Opy?xu'$G:""b,ق "{9!`9Of5?'@ɯVr{2)g"0/kb;hw/5tOD@h+ZkQP-(g&ꠁ+@T9C~Ng^,li3N]q*k:BXxbSGqЖe%aŒe9,K2e֍ E*6bf[k8 _JP@X}D#lR;Esd~dUl?(2Rx_rJۛN\ UPp޳S]6t ayimˎAq}iR66hP$ F^ޜډ1Bzx^mYv/5-eF]/Ҟjsu.]ƲZRvP S.y:'Uhݣ,/†쪤.2KE< u@/FW[Ofe+>Ul^*׫0e:}1l`HYJlZ Wwkj9$ L^'ܵx%w yy@$ȃY/.`Cr^9ڇ cOR`%iҫNZ-մz1 #/p!$D()Q2vĦwD^q`BSDb/,($DB 7H`k^:"ւE֬Fn@ϴݞI:`TݩPZXF F~ +` jew9;]<2ܫ6@OOvChe^] \o]o͎6㭺57fk^j5|ysoHBe/E3 ix$1QFϽ)2r:.n>ULN3=qfXs|3aa_h-6 endstream endobj 2643 0 obj << /Length 2097 /Filter /FlateDecode >> stream xڽr}bv.L3fmyp\jD\%)ֹ_ϑѳz_>Xy"3 7_Bږiao=Cep9eejE3)yHE~d8}yw2m3}f7Wfw7]ݍ-˶ߺj"۶}Wnqʶ|&x8;B ,t3C#[nKxt tKӖ_?LQ /l~x"+HH /f/JJ[@߁b?הw'p31Gx=l$홑 \7/*-Jz% sq?Y'ˊYrU\:Cld|k[q^%`FZ6"5rd]4RK~hYTI׻LJ>Amv=EC,ALeBUVED5jOlq0:jAXH,2r)⪐M>ۍ_?phLc!>| %g'ˏj%/|$W5\Ae%dE5Y, | q;Ʉ^<>^3ZAa0?MӇH_fV x3Ukyӫs ״zgԿ`s)6c;b\w,I465Gi M糜}s!~` ]+$/.չ~YM=*8i뛃j;C꼈WX,rg~&R^VIŮN& }x{uK]\΋{4d֒cųS8n688d"NGMm -\ilhy݁d,%ׁq&W&84Oq`<~9)G6> <@1hx~>T0tVR%[xыlL,$K~N$,@۲;bG٪F)MB*>J( q7w2n(2/i ѧ{V8\e InK"=Zz"CC-xNɳB,ɂ=WF]RsGp#PGN\ QwLת[DnJR VI<_CM~a|_?2ijٰƳVz>MaP&n2˔xK#pUycYnIs#QncZ/۬J7\gE:բz'ZІ:2qFRqTT#_PgNA+3統B;> stream xY @Q'^ wHIuP䂃֞]"KHw9 5O!ǁw}X\<}%"+&U$ō / d-VGlι˥뼼eZSYWԯ:fiW46@>悳Dp~zT <ϸo894-;\aCqJ 鯪\r MUI ^VfUSgn跋ߗEc 茰 ϘgwkZe$ Z<T56>Fecep0$ef~6Yen%kK,fs߁R]J6i>3F34̀JS~BC&C#$$!$UhPr=r+=4bq~?H(tfT,9O %W1q='0h*K8Kc$ T$[:3Kz-)Yg-c&%h*SHȠ5)u3cT أ>fytgH8~ p2V4lJl@ۚu>eF۴9yp}n#l4V )Z]\[)e=W Yj0dQc6WB3G %Bi.jJCHD dҗKn UL}F~٣Z |I&)Y7 ˆ-,Ed4PF_gbS }Xʊe(DmڱrfTTDoAކhdPP]$X 6`[ղn~GAM-UB1cmR mx5UV#ȼ?5ckT^iPk4bMq dnƮ+Ϋs'(hFPTU1*d~T9Zc-ΌŜp}6m"^VEe#*ܡ_h#4L{_*5 `ul]ߌ>J ƬwEDXeev6֨!gݔ;/kmAG(k@j`wKN6{mիAQ6NHJ`AL4M+TY,63Xa8%3W!uުWܚmGӎV 90 m0. p*75b$b+uO40{{J.E.C~7CqLN 6ٕK81*']?@O(H]@}+Qwޓ(fp|J*@FyC#4#v 2#יnfװp\2)7黆fFQ۵qLlV[ T /.B%鈞2;{Xr26N8L00:Y:QFdva&'IZHgT˛wHI;Y{F} eΈ tź} t}m)Y]XmE^u3w1?vUt?=z6%P#l+PwC[8B|KєР<"_R w姩=d zL{;r*}6zRΤPv2;m|jcBzTb5˶[]ڝ42kfhJgx 8Ns84qmDKDȀWX?,jʕcaJmroReVDHr{m e)''!̰%gKe \4F&k>Mր/Y/ W"[i\(\s/LRoۊ(h*jWv d@lE ?\M!?WQ'RlM^6޾yy1_]FߕK7y\=,",{yіbw endstream endobj 2656 0 obj << /Length 2208 /Filter /FlateDecode >> stream xYoܸb`-EzɥKhQ@^Q)iwv(b<~v^=mK8girY}캘:db\|poUַEЮl;t_e2KYOLC;::ӿݭZRL)>otўS/sնeSSF\|niV.|{]JHGڀ,!heUvz?`>[@1PDJ8h4Zzνl N|c?jێntԠJ5hch>\WT/lAr > mM7w1x=63gep[},i; 3rr[=:f2Y/uށ[66`\hJRv\)C$^ ŕ%^Ԃ+bR'hjx ȶO{|!UE_|.UUf?W'/vETAl ΟƠWOH&9wnr1u{\@𽛲4f.نB )H)zc{YKJ[>$8O {hn(IHQ1;gTho(۶suo,e:]vS{g8 1ճgP,u&yQ7{SI0^[*¹_iRD?ހMDڳ@-aUIKp_ZuIᾣO?e'g鞀&Z#iQ+G8p=H,UVi,={]`bL`[Vչ[,m]cA&''žZeYPR}ߟ]n xi 8;8Hh'.VURVK +ֺM_>CJC2.[W.}w[[ DuTUЏVm Dn(;h7F l4&L urDC?^@:,K〪~p(V"O`i,c~ءr GA@uJ )qΙtvQ17&uƨ/PYvl,C#T 7Ft8 %p×BcMHosojZ^t™B\K LG(8/,0 ̵z@9Q5s.]8<4jơ_rGCtڰ2侹M+x|,Rc>7&QڻіVwzS k톬[K ɨ7rmiY mq q_(MWb4r+4#0;tGM`b9r1CMfy)gWgCf=eF@D$7<@9rޡv 45R6T!}!$jZeR;}x #)-vk2jz`7 vqbIĮ܈ r*&b[h ߵ8X& NU_o*}#ثzʶ34f5{Q|p41Z+ 5δH#T͔N7mO}H0>WirSnI'RD`.9 }GcM >y2cDɈ;J|!DiuV %pڪ+ 7liE4ϳξB#|=Vrs7XK0eD թV?JW9{Ձ)=Pؚ8,=aԈhx#Ru%9&;1i° >)HNQYGl 5 ׏3,?`OH?tH\bUW0/Kp:ŵ:YYfE(%%L0&6j$d~?]bU endstream endobj 2664 0 obj << /Length 1627 /Filter /FlateDecode >> stream xX[oF~_#$M!inhZ9fM=3glU⹝wΜAmUeB7bU㛩?&~t6آ$ ьqzA^UE,r-4+H3 ;:CGOGV `2DN;Q%[qb[oYc! 3MS)eFEfSKGAp2WKua@#ٿ0/ೃ^C!,Av 4z"BWYPQ . ]Q48&e)0d*HHsRHpѪJLqE.%z$I9o@I`i9FAas0p4,k3;qM "=Dľ;>LЍɬ:/iUiΜTv||W89~˘@$bR8ͳ4J%YI(6gLFQWk8K#K m b.(L䫦[> stream xڵ_o0)x 16vVڤ^5S[U 6˪i}6:"1ˋ]|ozjvz1D[=yI%%*|xX}4!)/../ }Ƽ~U.x̅%,(f;=V|E]^~\IN+)a4 rGx쎇P2Ǝ?)0?FShc> stream xڭX[~_!ee j4hd@4Y 4JnߗrdMp^6GҡBUwW߿R/ 4ne$"*F%w?ӕ8Lл 1xݞW?i =|_M&WE b"I ;uW6SLvߣjQ舡ptq3 Y1͢l77IKBYhJ5~80sozf"|ehJE[o%<#70|C{:=p qp$Fmmt<>_ `[lu[ejt+)̨,dLzY9hU.D88"d1 }"Jpi8U4j3q0%'V3 gu)EȂ轮ѐ堕b, RX=#nIbwp?͍ $,"2s  iı$u{.㕐?<dz;Iû?Ⱳ*E; 2f͔/0 P𨉂# QO-2: 0ʾm1Dp ii_! >>C`?,Bq>ZFV鸍qSDg ߬FwBނDy;fطΫF:XXWӿmADD NCY)D E$=bgzwl_J} <98aQ,ʊsZ$kO L0U{Ά@aTؑ5OAuJaVRʉ0]`-XS ƍ6 tR|4Ym'3B*-L.ݤO8 S <9٣Kl|j=5A;eN5.^/+7QUcd (b@3F7~ALZw(w*SMR.gqu}Xٚ7 {ljÁbkVPBc[oAS^bAlFSf `CFncJ疕SrVyia28 bH^`v@wWq^,-z9*؄#֓9կw- !-) =eʖ~П,cEYU#BD0 d-sGeh΍0D&/>i`6<~poZeQa]"dQ3]kYFo 'YDyzqP/Lhȗ?7g4{mG_0N pļQ/E5 jmk='ݕhq4r R X*Rs 4P&ugpKÙbѹm<1bgt ̎>Kڕׄ/—].#)8#k](O@Y2Y3A^EgO2 5WC|/zKfUѴMufV ~G8s8zsϙ g $lWIO0h.(#xG:>hߤ=ݙj0 b(%UfbE+3{K1S`A8}.J\$Aʹ]A")n\ύ>IejxpUkZueZtoXR}t K_"76ꄹ,6o&E}2?K@>BOpO~;F/%ur&A"WW "p endstream endobj 2679 0 obj << /Length 2003 /Filter /FlateDecode >> stream xڝX6V֬HKR4H +k%hPr3R/˻n?ip8_<.ſ^v"gy$nzr -e%*;幱\A>0 Z pkgds`/ n~+)R՛hgdJ3촬h^I$~MOE{rs^5 Y%73ԲQ /{*X?+*Jbb9A'!I-bYuZ͏}Yk;#O{{HAsUٴD}`Irީ:ZTɘe s ZXZıE{: l,^`aO?%7GׁNc.AaFy$ boW"#>(k @;}v0fx!JACX<;n6±`NJJ5w~ɂ i7p~9p$Kgû$=^ % skJ;PhD`pPi0{d~=ﭩYs C2P3H,3BBshot <ȸ)RoKl((W8b& `aHgB;ch^>?ъ>[ Tbo4"g /c] ft P/w|';Êrw7R\nuB?9(Rw͈^:(-iUpՓ1E[*Z) ȳ ѭh$Ua‹|D`f XѰՈa1~@@DEiFE%' _]y$3dE2!ld@J&~xxnYZf~E9]ipu(vm ||8υ&VU~43r{$p L3P.mD(%{'t[oΗѮ ZQbgUmz ·<S2𸯦 ѐA,gXN&֐F(\ݬ(cazrK) h&uU$[yζoҢaoP| `3fv ϼVh+كbv>yt|5wxuH`?7 P#; Di.8X+3L{)c5}(F n#8Ɩl+k(u!k(tܦGW#v'E؈FM _yC׸ s{V jU[ Oi WR)TGǟvj!j*D4ja?h/ qd=MAb+Q1+Q*6`z&^Xd3bNT Z^-SNH}'ـU8eth+7eY)ݺqAsPWAFwLǹ%ÿ-QiR}c\9@0Wx!E]16c߉3~P'?4axJ09`lf,mBmy͋6ߨE3hnL焟'Ԏ{⌵'dO }ЂvL>h\);W  :Yɹ 'rEsY(._5nXZ TC4;W[9Ӯ P@=Rc9Pϝ"W4{Q)GLO?sXٻ8mqOƴT endstream endobj 2686 0 obj << /Length 2620 /Filter /FlateDecode >> stream xڵY[۶~ϯ[d ~ I rEd-LldG?3!%-zpDÙ\b'߷nndQee͢2IyA/׋߼߃0_q/6*'{pÂ!U%NjALجO.X׈-/_)~{\ r#ߖQɎߵLi5~A;UΝ',Q<njd}CB57lTSMUkNCX}<3epl<`ZfK5+$H]?ZVOYY2 2^%Q4 еN^OZ &gc1h2 Is*"oӡ q p|]hq{(B9]{o (Hq= = - ~ Q)|6Cwp5S~M}$NR󬕹jǍ~9˖+Y#U4Pn}8[.~Z֛8(fK#!n}R.Yavc@nO˄ؒ:cx+igl}~ǟb . s/\a#y:AqVB+uM}kr_U?Ԫ_ݦhQ3+/lʞnX~dr~PL=mgCcBjMgE =az_ՙŠ*FͯzN :>ONLzJKFϭFa K0&„}DVN nJQv=&1bLgX#b56n;LЫ5Nmgmoβ; %h=^ 쬋 0%l¹]P 8Ap<Cbx$p1ܯCw5 /fk[Y> B̬`H;A o,4c2EG),)bR⅐[8Whq5%mMQ1Md̾y\A U5ʰ2N^(GIKSrYYI;Yŧ 8BNgJq~9%LAŎ?hޫ'q͓'?{&L Lm93,QiTm>ΦٌF endstream endobj 2692 0 obj << /Length 425 /Filter /FlateDecode >> stream xڕSˮ0Dz<:F=l ZzrB{CkvDیdNC5G%s=#W=VXYmin.k}aXD%;Ԓ[GɈdqա/lc{q+|!aQW {E*9oh;= ә7,I)y En۴֔POjYu6.==|]D%fVڻM *-I%*Tġ[)S| ^L$/dC9oDNn cIv;ށuàqYDZ[):_> >> stream xݿJbq:7-.6bUxނpF[\Tt`NM@W+0?$GGCp9:C~ %RYԭXF@f/eЏ@H^+BlsyWwñœ+E![ ](}MpqP斞:׳n<-=NKP{=Ź:<ͺ*hԢ/ oS#j߬ɘ0k?ycwՇ7+\2@be'u.eP{ZF= }Os6]y'8؁j}|Þ 'G(aP{a|y2 z>{&,=_'G(_=o= wy< z^{&,^ܥq|j8y9q_(ݰ#'G^P>]l3avN=P9_}JOCCP~_= `?TCk%~i,5',~u׏GOYx 6        ٨ 6l0HHHHHHHHH^dq 陰PiQp 8r@@@@@@@@@@/Q Q9.== m>          ٸELX(q(HHHHHHHHHH8|@@@@@@@@@@@/Q Q9.== m>          hv\{z&,@8|@@@@@@@@@@s7*#똋ƺ/e߻*eܾw]F˨wMpڸ:}wFV*b e]F2]Fhy{QE M[#Ij = = R JRk{Q}2D(w.eT߻:e8m`}E%Dz@z@z@z   ٨0ٚAz@z@z@z@z@z@z_ȢH>Jz-lznEQ:.lz& =@tHHO"ODzgN\ $D E'zd*-"= "= /DzH!=@?|!@zHgo?>ew+!ʪ^@zO/v~o>q&$HԎ#҃}"=cz0S{{Μ>1=9B[zEzt_4eݶ0%ںߺ[}%Z]꯺yYٴB yͶR+!JhoBn5/ſ^{~%x_*Ć$Μa"Cz z~`؃uO0A\HOҺAO, {Hn#4 {H|r#?{eL"ozGͩSԠGcLDzfS=Dg.=1/b2!=sAI`3obLBzf2>= {IH6 HO< =#=Iݿe߇ғ˲߆ғ_fٟғkֹW'qgs{|EzU)b[c9G7,;FSUnu)W[|mqӑ,-3.`:3_Mi)3.`:3_eG/3.`23o1f =3.`3[??\)HG|K =|| ukf\ I:3.DfO^bƅl6=4=:~w2-V@z%Z￾q0ąl%q!=Z3G\HO-Ć$le1BlHOƱ-Ć/-`23_?bLFzG;;|8yZw7=fu{_3>Aϴx3.[tLJq1f =>gQ0f =>I{o3/Ǯ=̷HL-`2wpЏ ;!!"=~l؉>JzHlQʲr! lz&H1=ńu@*_HϣI)'|hRFzMJO3_5hRzu@*_H#҃͋]#=H6/u<"=ؼ5`6{ zGzLO-(.Kb[E鸄S,~TٳfTq# BoQg Fzwcz԰LzoCz='۶SWx6t?m+Iz'T>aPnR~W\4F[|Ez}MI}{J\׹IOszmIy5=KF=#ʤF<┙/Du.&=KYg>.ba}DAzFڷ'9_#9ˤG=7uk;eBaĿK"gz[s6Wd-`mku[ZZ7ã3)"_:9+U[/Էm\-AkW?Ʃ^\S(RaMjHDzDy1=meSxPQiwfԶסL-Ak瑝yaW=~S584g}U׃_H#R͋]#=H6/u<"=ؼ5`JPH#,<"=^l ꌟnH3%=H#=H8(zH"=<GD<"=Hϓ?_?\=c"AzOc&Ǎc=)p;=evv=#{g1VzZƒh_ȢH;=@46{(qDz%ғ:҃(m6= :'uQ"=#=IAHOHDzRGz%ғ:҃(ԑDiRL@zLFz`ƭ(J%qBz`?!=,f!=~H0 Cz>JzD JMR8"=f3CzRGz%ғ:҃(ԑD J'uQ"=#=IAJPH,w"'~ }-zj%:=,1}G,/yD׮V]wk#=|mY1H陏x[m{ɲSH:!<3="=w,f\;Dz#=2<=ƵCCznr:de>WIH֪WKXlTǃwҐ8 }OOexRzqw[f .Ta|m3czZ9bKxLzz^rMzj!\~=KOv?{Y%=7=z~+ RށT㌋.}ML04Lb;vTZsT}SY0'_8"2.낃YuoGtזUꑍ3Ka *;>6.$=^5.[GQom~hשּׂY_O7n6I+kg=ENZsW^vN?DyNi)w#[ӏPrf8H$|SUn m;^آ~E^tn꣕1D*=^/W._ս~"8Oݝhjju31[Euͭ;{ߚ ݚ:i#r5|k>GnszwJoo&\ըG-\fnv[]L޼¥;7PB֯_J6앖9պj5>VaeEf5ɇHeTp֩\m㾙>ոLh˺KnCf̥ Cz~'cӨߜw+'i8+3!kar7(~Ǐq|.=6ce7qχ7㐞1)Fo祵fݞˋ1]n)=rA.<ntR_ )w9w¤2WT1 5g\W>u}s^ZTױ="\G=aV<cc-AJw^jsv4Uy0[meNMԆ* %gG3ޢ"Wht*Z\Z]`ΛNO=kqF=긌z􈭹{0کfV~QTUuFok㭏ecku)yf Vn\\rH5ew7VzWw}Ro=bl1ХΪQKͬ n6ό:|+61%SÉoo^Iqkj{6t0^tcU"=n:L*g)kIzܟm$& U|?=fX$S|Dzn)fyow?W慓vEғ$ymM'5g>{zHOrH| ov}oI 陏2!=HOjH|os+ ޤ IMqwEzRCz߇F"{7]w],9}xx>|W+9bq+_#'7aqx{}/G~qw*;Y|~ᴺ҃-=|W,ax>|W,o:E:!=!=;cχ ="=gi?~ ~B߷G"=gMx>|Wlngeg_|9H߇BzZTYNϿeoC߇]lz@zHgݝp Klz&H1=!w׫ve,$;4bOHO>I!>Ч[cƵғ6u0=铭1ZI9ÞO,;\q$Mz;ÞY&jf\k"=IOϰ.7Q̸VCzRO k=\i;˝i]'e,={A<̰5Rx }Wvc驅#B{W1 ݌fӳG]A:ÞfebƵ"ғ.} ? {3-f\k"=҃}0=,f\!=2R˰qÌk='Ufc{ʰ57̸VCzR՟Tð5{u}Hp,$g{gHg㌅D gy72y9+!=i=g0ye!] I6 {^V9qjHOA~ {^eYVLX7|Űk|k5'E֠6kcBzRNO^y4Np^gғOf~,=Y^EIV9&nO3 LAՙ?52"=mlnB9h.(NBo\g3'Q}M]j"Bo䒪^.D?e_2Wwȳ /7bϷ>=ewpMo"wlz8|V'1l Wۧغ~8!Y]|S̍ndw1 *^3a^^}{ ;n[_軐ml~Y9&bE>D]ZlM 5oU|ɕ@gwuR YCq02>%=v{6.'uMդ0~󛣮BN}tIYX9.)˅8ߚ.IFpڹiVzBbɲ2Mz.b7}z5 *0~Y.ҕb#O/( :=67{|pχ|BԥëfУ|6MG粗_Uϴ\ h&Vo?Ug=ғ$sKݒoC1~A:=7k"럪ӰFE%x#*k6%n^~;3+v;tq{"=Q"=~RHAF>.=qpϬ}҅P_sS+OGS s~:v}wDI!=go)l┫yhqW~Aj\֨xTĘ(sm5w344VT;uQR][[3까HOHNC?=_\W?m3x[+=ɕ0zdNm'&9UvYZ9._jNNE.^3ߗDxzf'n($Ȍ#r!̔lL*̰㵺Cv7Q]E=G}Y];;nG;=w=ߪC=fB?1͒I#=$.WU7o!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7K!=+$=~Hҳ7KCzܐſYr,͒!=nH,IIϺ,I鞴!=k$=~HR%3?=9FzD)5!=RkCz0 JaA_8|A_H҃(ſ?Q #=~HFzD)5!=RkCz0 JaA_H҃(ſ?Q {qj!dH~f~Ұ7K'j~' ˋ$=^,=?iXA%Rf3n+sݗfIz\#eoLJiȱY#eoG)ӓ7SoVě1ZſY'Րr.(͒x-e;1r,Inu3.u3.,(͒)<ru<ȁ`ƅſYr|zsZſYԆ3O,Il}rK͆≮7K3ېS]o6Ō ˉ$=s& oaƅĿYAˤ:3.,&͒eyʌz+!3.,&͒d%pʌ*3.,&͒d1a=iwo>: 9MpfIzfʳ6|sv$]jofIzfk]޺2,ILvC^JM|4.͒u?}uw]v`1og.%.fIz3mo)[XN%mxy}|˺6-,'͒ϸ&^1-,'͒ϸ^̌fIz333ZU~HVw+ 92ybFK2 tC-V%[ǒ,I5pX8YfIz<|[FK̷7KAN.3ޝsP7cĿY%1zf̷7KC]f^nf̷7KCθ^8$=Z-f]B8fȬ3;/͒ xeW; fIzЏI@ KϹos_'!^o>M)-$4+͒hs{wNOFziDƓxſmvzIIC_HFz0ң$%5hI #=AR_HFz0ң$%5h3S6!^a> }|g^']ǁ:Ɠxſ\ G7#=Sky|cz>~>h%<9篳lfIzprBRWRk.8כeE\>=ټnOK.;Z@1Ys^ſY~Kz{߶9+Dvpyi]*5¾Dz,ҳ!􇣷Mno3퐞ZLuw2;5!=H_-o6nJ!=G%:WS+bV~^!=ixY]$?X /|Q#OY4=~9W~ġn #5<>!=(;ȑQ^mR52Zܬ_U+0e#שJkGN ^ccGiz>bq([ˆ #=̓Nf,3z$ʳNJ}IO~?XV0_^ܿZjڂ6Iz [Gc>*i uzZXuq5>c1ga߿ǿb,Edr}/Fz7>x9oA?x'˃haңF([PI;=ݖ60R>\>!NI6=s\GN}&n篗zH'=~MOoG>Z{N붹|scCTZ)EQsRT'OE k[K3&,_\ڹqGʻV6r9M+{>݉?)G}B>3j)3.'"+jg=Zs3\Ou^IūWp'WɿʗQݯwzv'r #/?EZCnЄ un@2'yqq:2{6?swDľ!N>#|M$8֤GͺȌ"qOt׻ɽrGлU=bR9ɥrgEU*vNب{~ַ ғqոG߃./69^CZn4CT3^̥_0̮zkr8e[X3_E-n'\TT [%R-S34ɚe^ˋC;J+Cz.ӿu =K<==gKn&4yoT{JO/իYoV{y;HO;v?$i|ͳkݪfO'_\鉺rx=ڋ?N3H][z$CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ CzCJ RzYkZg?ɤGu<'pyJ&=jP!=S(陊@!=~HT Cz"=PH3BzHLEz?g*!=S(陊@yY|Dz"=P8|陊U CzbՂBzX?g*V-(陊U CzbՂBzX?g*V-(陊U CzbՂ~HT !=S(陊@!=~HT Cz"=PH3BzHLEz?g*!=S(陊@!=~HT !=SjA!=~HTZPH3LŪ!=SjA!=~HTZPH3LŪqLO%`Y ?FZ =H ZxZ*]\*u"~C CzYHBz`?!=,f!=~H0 CzY^nH0 !=,f!=~H0 CzYHBz`?!=,f!=~H0 p!=,?!=,f!=~H0 CzYHBz`?Ezj!T\`CzYHBz`?!=,f!=~H0 CzYH"=(CߵM =,>?!=,f!=~H0 CzYHBz`?ɲr?zi.ck Ąx), rʲnpeM; DPI9}^% C%a8srLLJJ1,CD8 gȌ .;p].̸ F23N.̧ky8Q0Fg>=.;|Bc /S 1GܓjMe:]bᣳÝOÙ~F)Q|q#3̰/0"=sݲ,_Ό1g.egf\uȲpf1Fg&+)o3mϼ[ 0HLvRp,;@HLvR gQv@HLw!=D/T;D߲'\„ xGg3nf35y;Q̷μMʘ([z Ř([6 g5&0 =ÙOG.`Dzf3* g3 ̧3ig>=([xPÙIQb8˃θ$E&`ur8#>K]&`#=>LyƵ-`Dz|\TR+>!=>jǤN#`GHspS?~? =w y/\fr̲8]̝vሮdkzHpV M5=V9 H(Ez#=HsXy"=ϑ`Q9,<%=M.?XL~%\ ynLO3\P bԕW󛾰n7$== Ez#=HsXy"=ϑ`Q9,> stream xڽXKo6W,|*z?4:E $d/EU-KčyQ/E{Y3pf~~~=qś _nj[*= ն\}t^zA.T)?Vu@G__&ͣh |7Eo,tzfS7oq;{mxSWڝ0jR9t?]YU}d(Iep=Wp]ƅQ;ZYg^%mgt)ƞX`8a E#0JS>y=@"8OAkUG1-ho W%Hi>c]+2AL&i9o[\N>pysX8[1sGH;~` c9hä0v]{#S|ʙZ,N>;`OOļυu0Am]+ruMs[ 8޾~C;q4*  \/xyw Zp0G b7s@ckqp@{تoo!-DO Mbժ|ڢ |)![M…9x鎅9v.8exaL|& 8%s dk Hȇb{WQ?\=hoq~}{!)TTWP/N* I(t@0X8`E'șs^RHN u>=mvE (@۔B5x/F.ħp :_]eK%Vq-,V?K7a<'rtc$'a2IqxOt}qV*j R݀LlZSL?hv3 7F9.z@VRԱTWjEn|>t.[n mM-?Zg!TM)% GUkxZ񧢥#z nokV" -.,,R"GU,|aL뇁a^=̆zz '>Yzd͓fyL.T_%v43ٝkhn-f'}ճԢI|AA0`C MhaJxjmnw62L\bNfZvU EA!jK!zfjmq_+bꊪL9s 5 6NTYH,7hXiz[zf\ֳ7X?lru4ԶTRw*SN Q5E},V쪚! RW$R4ҞiOJa">:R JF2A^Qac8qȨ*JFOB9*[tQ==ׇK)Xh؆F_c̦*P|)QԪO .z;%`{`9R0X>u!7sD7#a^ut. kvZ2.cu?toi(# ɞi_nӆuw[1MSv%'+ت:u,g \jdF.y%0]эdnBqi%~gCbۛ9ч<꧿X`|!7"EB!iܟY+ILܙt"Nk(fPd@(\t_$ Ŷ38^ŮZT٣H_LLJ3 ns> stream xڭ]ܶ~>EE ݜ)Z{<NUHjg3JSp82v^轻y|xy#SOHmLz0ʼֻaKj%LU$j6?ɽ"(R Co% :+M_oq~@ks%|dn*IքXvdS5BRi_WW@c6ꚠq mS(F,J9،6f?(>ղq^ވ2%$r7";:3gZg3q6U뽂@WR蠳"F-`lW'f_sqUZQ-sτ> ϗgB!sg}WV|? mP4,FYddR 3(IizdiJE=4S䎸ʖg@?4Ш*gZ0j9Q`,`,`zKF{3*2HD,6rۇM >Mm?ԄJư>ufsnq3<= 8G$)V%mhsa>*u1 P \nÅ!!@vM>n-2h<BY[\ZQYqU,2֕o,,px o2z鿦++r(mO-A@NqbiћSBprM>ZI8e4`f5jlԆdns")4lgr{}rZךrA I>D|Xt=Bh m>ba {U34$Yne[ Yט u+|oxd |aآ-v<0ﰹghoqm&:5aƎDe䜍8x;_^ć{(#U)h>c|R'_ЛG{gz-$[0;WA/d߱4XS:H?D.q‹ Jdڋۻ&(L=Y֋ajw<J\+W-Nӳ(i}q|5=59nƆ>;I}o[ky%x@sܝ#wFs᲻g )i4ȝ")Geg4 endstream endobj 2707 0 obj << /Length 3358 /Filter /FlateDecode >> stream xڥko6"2"M$\K\iP(+WWuo^Rk9q/5$FUzq볯WEX:]]oV^e* #zk/.M-ex ֎.TRP=8rdhW:.r\8qTX$ \B@% J~cv1Zr;o@SY0C#K[#~ccweF؎2FV!Ua~C4 etHoFx ]ude`GAɣ(sn3Uo2_ɜ:Xe~t$UV% oTL[fA%xVs%Y"¤*d;]xIh Vt?姊8gi:9-{fBUnqxX Yp#&wEc$5X?-g&:9!in>4{rruBOB"a͜b^~. /B~HKf grxG1*Li&k8_"ٷgܣZTYW0+wg?D W[Pfʚa^(Z$ƞ`W-tr *ѡM@:"Vf4T*Yt2v,/@{2,_%쭎Ɖ'5JY#y ߗEjָⶬ0H_rҳ<% ({apdgId`Vm]E> ӷ\̙̙ hħmM ƏlŴ (.ΨH=w~IT6;Mֹ" U6NS8`Rc]>Va"4 rbzL`s 6NN :Ozv%IߘC`z9ճgϞgP8tmkTLJ25 %*E9mv6^ fGnbadB5Hg3w_2ҡ;z{r:x!69Bszq`]_ٞ{$kʖp*<1sIٔ_̼1VvXYi!$ǤfgPeB3[2ŇGsa|2\vx1::)ʪVw⻆GZ Ԇ7v`L+J$bY c/dt~bM\u KPUHN2J|S4K(Gхh3Ƽūo3[Lp[ Yl;a3b yǂyb;̢!Wx?& jJ~yAF /*3ZJ;j&|Xi^ E<[clv&-| ;u]g!fzE@27zʇ1$9o,ā7*Ut݁aEj2l멈!@Eԑ!0a:'` \@)8y1+);Ha $i?`!"F2I;`T0 G}Z#G+Hɍx>ii3ʵlJJp4kgbddR9 }nXB5!9ch?RS@dQe[מ]4C/,lGإ7Fc=Y.8)/2eyJ \؁ (|DLV58.,\F:44ҝvcak2E8o0Ϧjc +%excɝ0ϧJs@%2^L9-řs(j,V> stream xڥXoB~0Zk. rh46G vwfgH->8o]<-+d$jyHU>_<8o߾Z^Itw~j(pjC3R64 6ۭίiœw?X-Ij`|?&_h:SHVUH;d4dL[04gU^p+}7ˀgX!q`iw4?&YUu۴̾KwjE[T+)Z]?3+UU̬Ә̋iڴӚQHH: 6Hny;{$gG#/UW Ŵ>&Cj)*ADľ"bTpcrju+/vZv) `r״MẦM_a|'16[i:ˆ5}9/߃I\@jIHr˅]w!A "\<|t9|B%ŒnJH̊ůҋK*V(Ø@HU˱&o" I%Z7f,]!A]ogIᬄ+;QB\P8aLY ^['5p*UW~"5Hꆈ2 x1glz=l arPm5e++ Rn$Y|G Il|9lofBZ%*`rMEgUtҖ.{I袠?$298C[ڴFNm`inTL%#/"8 ]do^ENfnZ3D'U\,=EA"nꅚ>!A˟o`N_6GvJ9I{py$Z:#T= ޫkboXi:eRCa{9X_.O; Mx(R2z GfCB;NS޼HǦg{kYJϥYjM5[=v-o[wX :FEY+SMŬgq<s(h kXup<ƗTBA9xC-2ykife"D^`m>li+&EkS1dlUp 7!e>!tݦ:){U EN(e<-7;=a>2\EH[_m .?58eVgboelu;(«ܱs_LM 8b5.4G9[mR&WoQ ǘ,F~vN-n1:/>Zj)m?q'>m,*K;-5Ѡv 7e}Da,=+{~m0j`Ѭ 78z8Ҙ_6$a3-Oˊ smh?d@%n4yڦX"٥wQ1Q1EL.fGi%V:ܵ7ß6tb 1l!jpnrV@ zfp`Ą6"@bZ }큨|]}n3A"?&m}ʼnsAq7ϡ|_; (|lՕd+w('3Hz3U4YK&w=*oPJ\aLg , :so/OF:k ;W&Gm'-AvcpA,h~"$^K0o ׶N3L5>!dsF!GxY _Dn~!Tqs(x*ŜZ2܁Um_-j=iXdx5kۮkD8e\Y^Njep 8;q=Cf=!sd*/Tʏ_&z|&n.X0Πɛ- ?gPNk endstream endobj 2719 0 obj << /Length 2852 /Filter /FlateDecode >> stream xڵˎFSawc&HX,E@KcԲ)^͇L؋Ԭ.vU׻~>wuRqhTnV^e* #nBRJ'km٭}>U) /E+BsS?ܬhx+m]:>trro%^Ua{\GITe xǓӘ<+]=P N؃I·\\yPZ;5T"OeSvE $(-6kݢ MΧ &cMD%?lˢb]yG)>OˀkE ;ZߣtS/Ż"Dg'gtdžY2oN)HHUdMi-fSܱ.7iVH] ~W1TPoz;?@(b0 {ub?c;ިc l%JM$ U"!)ԒP 9[#&hڞ+yrkceS] ZSs lyWT ,j<͒_ЁbA؎lWUϛTZڕJ>==8>"$u`k;Jm$f%GWn1yS<Q(&1 ) 'v/Ξ,1eN{:<g2^a TM= P%^f%H |At Ne*ABԧճ"(2a3Î $X (9@abg{%$R3$3︛ R8XݓɽBD~ŋ_>Z·hm0|L9<΃D%u3bL's<_RY_*#afYrZIcSXrUmo\cTˊ+?֦k(9dY*-US7ҩ Smzg$7rNMI2LN\[ZgK!Pn)SoMx&J-@FSIc*>5H[l[D/8+ih4r7FzPx 1ƥnTk`SǑG5Drzޝ$jb, żZľȶiDu4&h|Ǝ/#6,!Rb(+R$c} v9(D]W_֣^9sU &&ܞ܏:O,\)4,r%wp,5P8yshD񮼉mx}=wCW5t8/?!1"pϽp}ח|D3MĴsvo1Y,\c:ط4R4<#pGЊR7H`NFv1D& uYy҃_^V ʂ&e$ иE=(f] Ջp &k8J/"fȤVem"'CFy+L#oϧlR~+RuTxoypWM?4 /K J$ј؅oYH Ꜷf8H!NL be"/x"ap A9Lc]YOW&o (iVҲiӆ!^K]*Nu×gB5O}`kmaW6ԨS>k/4~A'͓$trY]v]֜|>~N2òk3kG)=pI2=&U6j_&_,oX^'iΏd@vR޵G Z2Lü>C/r_fCMd91zuKC4'8[olۏG 䩇z6ό N574>DXk;)|yq6a݀R.`2Èi7|T/U9cA#2yًc&&|ogro2^b?Z<,Y1WXc,|z+eW'&~*&mh|ȈFfT{$q­sjW: daxdA#><3h4ɅA#^-T&&ky|qiL̸gf̜ J>o6`~Q7$i,N=X,Kimx+AYlv_NEFO;:~:!]X}M&XbⓄ-63:O!Rl#4+ᤘ[BQB*#R=Cp꿘 endstream endobj 2725 0 obj << /Length 2162 /Filter /FlateDecode >> stream xڭX[o8~ϯ0H8"u @tm.bXL,y$9=P[t>&)\s!_|~R"i"QDM~,ںMc-Y}?ёTD@VQw%=޺[]]i}U7V+>24;Z4,T`rQ^ojl̶\, {rRQDj]vԋ}BZi& `/e^ęVQ>kɉe8-~o*)Jh0LߠX$q2֍~x-ԚXPb!8[w1LD ;iA,AEf8Es`sȏ= MѲ9/}'{K| eݎ ܂*L(#dgE[6Y;{H!‹ֶ8wYWo&[' %umWTtbU>`qsF#A" B쳃7Y1c ҧEdjlg:'1[`2+ HgO ԀNPW^&T4HFnɚ{8NQяsscl:I;YR}_()oitѼoӂ50)˹H!{rP$*83QzzUEDZ:4Iөffek 0? ]W Yq꽢ʋGp[6'Mm%Υz@cFZ 9~{sǙU!/"Z z{v_ )T/0*gT8-0v ݾg ˄]{mMmFȧc8D";PN9Y%D*^@ XJ>k_*B8#!+b: l,g z B2mEن 4v>hqP ۺ1Sގ6NVY.kh1a"谭'84L+vM=\ҵpBTt.jk3$2TQ9M1# x8AԘ4̓$kkiq_AI@_8-`9M􂪝Uz5ؠӮ1 =nrQN oٲez۾p-GCa7vy̐Wr/RJ^C߁֝e։ΓbB"`8Með2Т+3-!KlZX~%qB WKۢyh ܯKS˺[]nW`]ڮb 2H;(Ps2֡_-"J}`^s5JP,@ixOT LzVst&+$0Š&% r05a5`iWm6z$K]}J0SI$fs/DW$`؜,r%O8wUdoxHjt2k:SY*q_ddDД:5RBCGB_2=UXlIY`mkcXSPtՄɶkƾcgxY}lqZ_-i!ևԉx>*LoN#Kɏ( ٠ tLsgoN%Z@LDA0_%$UX !$xO4Gx}c4aCf^O`XQ&~4ĕUլimC%LC{Wk2z ..~ ?Ękd6;t7Q Rћ ޣ -]t4>=t~yp5F4$L!pRgw˿䲭=ۃǑg55룣^Uc?uM/'nWsRXw6:",5zpa#|vh89CP``Kmi>qŜB@Uߒ}11E4d8-DqHj endstream endobj 2638 0 obj << /Type /ObjStm /N 100 /First 957 /Length 1961 /Filter /FlateDecode >> stream xZ]o[7}ׯc[ .Ib8 Jn"$ -mG׺J`{.9Y\p\er4o [Cu&kaʮju¦SM#QXppDb3B]Hڴ2IMJ0MHM cctNN\q!FT[<<~ӫd^Ϗ]|q?O'x1~=u?at17H=gW _'GE@0u/1 oF{qCVfO#+6obrՆ /tO@^%!z'0ֳZvEN?Ó6C|q9voϞwu'ߏuw1^ɼLdǣ{{B2<\*78U nB/$z_lMML[ha2MЀqiDr4{?6o-8>|ӵAw[Iae%6,mtصչP{v꺿Ϟ|Lѧ&@VBH@{8.TݢMZhdl#~08.i% Ef3{T yG3zgnjx0<NbLH ,~Is_]L(VQ+ayQ aj=RmC)skgWUZUeE셎A칈v88BCλx/n0LsNSM:-0ޒ\Ż9fp[Z/bƟB~z#?-MJpkJض*2VvQQ) ax;VҊ|zpK+`{Ԩ {ml^ ߮A&3غw}x L.U;$/qw{}q UJAkJwJN F)͕WOH4 ґ{Κ}~Z(} ݯ"N1*#S #Z,Tw1)N=>vl*`zv}fM!D_1"x耭g#-y7`+-b_Z<8+!2"/; ŜQpگTHW1Nl( qu}`?&r endstream endobj 2731 0 obj << /Length 1129 /Filter /FlateDecode >> stream xV[oH~ϯ@~))3)k5iW]JRe8 Cʥ=g cGJ03g;7z﫳W""Zm@Xwjmڌ oor:L+nRȜd`Px1 r$fMuủ|NIfiR"gM)}ײ࿡.<4z׍0E&o)1uXxqTwɪ?j$Ҋ?'77o DT`redkN0~~jw475WzZާUNˢL7ƕ&<.sQEW?*=ˢda#R,}BxQD ;[=“#en(Lk:aO魄*WRO/BۚB Tuhrm_<D[{+.!B +*)Oysnh&)*)3n_CT~Q/wlfODC[򶡟RNC r亇'j5yq9ѠqGLbhzz2a@?D2A> WDqc YLH&G!+pFQFֹ{^|ɸg3q{B=EGЀt{nu/j0 endstream endobj 2739 0 obj << /Length 1389 /Filter /FlateDecode >> stream xXQo6~ϯ0$5+R$%h$H 4Ð"ӱ:r%ix,rv{he#ᆪF=ϧ'oދpX =Gg~эwUfq z< +6!KZSxE9VIm*7oNӒ<'ř3`LhMZoJ uN$L_^$+6 !ƝфG,bt:\Edɟcyh'A4]tFYR'd4>=3.6`b?xrBؕvR:sv=pns`z^q‡{?'q--<>>,Pj -DQN<wKȱ;Wb s.^\OìlFn%n-)wkxnu\wКԯ=].$/P3HdOQZ0ѱY ښB/1da7+G!3?r%J6\rY ]i˘dq/woVL+~`F{i3NHgSaN ˄zr}qȤnW&DX䠱pZۗ愋Pv!5Uٻ ^%-w ͝Һxu㰯PLhz{S;*Rv&yLSkMUhMrm,^QrN?5 S֗A´؊R뜦#ݩlzȝȱdobn-\?ʐmŰs b?mh _v,O'MUe8$/?#%@AO~D1ucVgҏ=ЌGkϩ:豱ۈ'@X 3  \s{a"jσת , l> stream xWMo8WC fIb . E^ڢe&B\In;á$˖i )3y|oH]/O#'/D,EP&20lh;^ߜ}ysYE7ӷombiaⶪ;Sjwn|i״6kE?OyfElhaw/[[fXlaw8>x\ "O^k5o֞ͥ gʴiODgz&L{UYSo]K[w{6eU6Qm)HXk*=SO*,] wٯ}+Ip54GvC4M(, [0no0EgywE35 ˡKqYSl(\b4Tڕu+jEmm2og:d' ͹CwGDR(C}`LJZMU"0"x Ԑ:Y䮜@AQqAwy ~ !c hdmġ"p]6!a[MmHRm 4O%ӡ,6ht߮r"Y4H~9rq\&XMN88RlVmܔ4%axB)3%D4T=5,yy냐5gPG |.Cp=n֛ºKyԜ+*5;Α:OU=Pd}`ul O߼s%+LP:cH3 7b/cg 8rpwYOhP({7`FA0Yn2oZ4GޭzȠ5xS6-ppenh>F2ˎ잮7?rܢC+h5*O|=y|h }"sԫ֖zC /_n-pzuyiѻc*Lń84vc._!pâܿ{Jq8`!9&p{ DD5]K=IKV2MwPݸv <~V\/ҴTP&n.x(3E( 0L&@(H>A>) 0 8Cb:斮ɸO~)e,\)pm!l2d]h2yqپ'pv+*#+z}u']ŧG{Z*H8?r/v:F>Q/9_֛i#!>>R_pbP_ҫS|װSfę]ɨ{y 阩h/* 8_iDJI2_em&~XI1!?L?&C&?> stream xڝko6{~jXH= \'N^w/mP+ګF+-$N߼ڕp8v->z*eXf*[\,r(t_^* u}̓ǸnΫEi?YeR'ԟ#O?G(9!|+!6vBfeUUo!b|9d' -T<ߪke8tph?-1 l:_ IcqVa }_;g[q|' ;'ʼ d'7utq{C1*ԑ/2 s LӋy$<1CGA0yWXف m[X+8['m%H>Bak~`:8_$6x+;aU=8Ӯ,ϺFfgֶk0% X e3 *G0~\2D<*C%I lJ6`Q;P4 zr||ћP\#+$ЉUuk`D 2yTՑX>V(n-$Wada%wiFujm\_[#ZM 般COu[)QNJPT"ֲcwZ `?_'\"ck2PM?[Ӹ 8,XR+B8xJ:OM l"a%B'9tڬ$,Yk>$I鑣]ԧDv|!^E^M:F2 Tg>bqSs0?ğOX@%lRͱq548`I3:W*#")cB0.ˆ#TNfNP%Dءĺ8~2FasAΰGAJB SIC g|am;#]/POE/0@K`ߘ/ e?;~b863! '[/b>zXCOn e V[-1^Uͭ "jRn,¹'[ZuS_.8,w{6AAKST}1~ {Yej0ˎK7Ck*[o $qyxw7[}KJ^݃{{H=ߝ]c1=+uc{V} *q;:!ݐ>X2 J_2׭DW< Pp\xb!G{Q!Eݑ O)IR4G;2Z$}0N<6Vl\eUppnuTk*t qo[Wx b ,ׂ~ @p~IJz0l~Oiy;ig%*/\һKsaĝ^,(ݕ uuxA'ryH[J; vcH#ט՚5n`iV\Xҩr`Q-@}8I*Ӏh h|?\#WF:O@]ƚNNul=ة8itoP|NFpM[LpD}{qlWnJ" ޲d!5>p蠢-UZmrH݈N* _q{H%([W0%!tT:dT(1c ~"4Bš&Y셥H30aC1R.%HQ$t M׫qL `vۊ {ߘwJ|NXχöEE }УF'4Ghqjvq! "2 4B]p ˰P'3\ߔ(dk #prsgNP7q8lnd"iQc%([] s *)7Dx5H=.2L[)_ 77& <{8C$ )U>hawv{yLS }UE>ua+ 6pxE!Z6m3zn endstream endobj 2764 0 obj << /Length 2336 /Filter /FlateDecode >> stream xڭY[o:~ϯ$")3 eyp< op'NcyIWw_=g9y4V$"Tx\4TLj$ `>9̗Pu'3!y<&yfU6Дy{"?ў yTĂxl&rT(c./sIq(򦩒b~g3˗:5xE pO Ce" (æس7 F@#! b(٢l"r[T `'8oOzD@sGdmU0ْLrSCˡcj,0PH*y%=]_> gK1Szr3#!GG Kςh:a泥IF= @ƽ|Lf-@j"t|Au]ݚf=}~͌#9(N4)*5o^M뜚o豹yy_Q l:1S;K,uY/^,9M~ifmɡ>M2AV^c9廿gk5(5{s"gI]ge5ϊw](Gz \ԇ83~-ʊ߻>7CỺ\{kĵy,0a3n#@pntʊx  u3C ?3 łYGݲZH I5WO8 -Bm([XhA+tFn #Lu̮sC1҃LuHꎓ65 *jny o;Ij=؇_$$NCHۥPVJެF1<9t/,D5 ;3 opecoI ̺zGUP%WDH\:t WԒ24LġIQ*08ڼ'fk@\y7&,rh܋gA\Hh^ EYap^`6% ʅkp#mHXm\S4^eXL.hi(A-It$Og\!Cn 4k"7 F]%HÚQic V_4)iʕ{Q+H˜dK~IWDX_˺'H$ɪPQQGy66WG:i:LEvc5'vSԄQ=DౡfLԌ{f?[jƉDfqI#5OH ~7"$եO7n%:LaĮ#Y.#&> Yb:fzNlZB$GQϦk]Mkt٬^ݶ,b8!ːy*Tc1>VSW?Z @n#R-@ vPƒNJ'Mg8L,!#,/c,h :LңXgZV1 dO`3[*R|bz00)fGKvQ JR9D/68&)HILa-pYW+mY}jJK o[f&5앋0jK~23h0 ? endstream endobj 2773 0 obj << /Length 2711 /Filter /FlateDecode >> stream xڥYo6_{ x7ԷTv4QZwuJ>VKї9Ù j]+%W/h?*V6ʏWwWu7uy[uuyj[Byw΍ߔ=ח*ݤ,jsYuw)Z~>ǔ%+v;-{]3h LUBNWND4u#3~S.fdZY7V. [S~"MS ʹӊ;ۥa;m0SW!Mb:h&@w2c缨7p Nj&tFwE;ܑ jk_++̠ H7`"䂁x?Yu,&Ӳ )v$ͲdY'}}z4f] G͔yDf=>;hB!wNEޮȐc&6珍<6'4OȲ_tk+D?^7Ve'ݴfї޼y3aw"N7?w.:F, `{i!hh[:ٯ);¿†U` _#8;4ZZiJ..O\u5$ ;\YxI !X@>uoZ̠  04du@D͊iYƢ{#^7G] חn0:#ų93ÖtU8ǹ (/ؑOFqKVDhY|̓ nߚ)"1L1u"%@C_NDK[_}0@%R06<ܺ*(ecƢ(u~ rǽhN"vWP' U]t_ &f!y!кxçC^={(dTz 6(M@'e)yK}E//un]ȿB* - B㍆1 (1>09:-ö@m[22,B `4FS RF3ZCQ]@=ޙ|Tb@t{:L3u|)d.jKi$X.@)awV_qFĩa:eM`gaXd !*]Tk/8 $TQQMkƈfV5ȹ5ڮ22bΐՃ4%U'#eXTK`B᪓qUBa C3y[N Vg8@nJPb d 0XQ60!V O:)((.892vE < /1"PD8 0_{KU|-8=勼3 I9hNkh`P5C|:)`K[D=͚V΍cW;yhx?B!Ib"2 +lEssT-T7M4 bxLr xWW;$1 ouL<򧔟RV)a^X*j|֢be2 iـ2a7W,ѥCY5j / ]O.?%$/!T˂o sp=!'GGYh/V g o0GD-G(twZ4oM0Z1;y҅ROVN5ֆ3.gf "8u>Ylاdx mT> stream xXKo6W9IWf#u4Y$D殺DG Xo)zȉ!9~ί׻7Hݭ ' ?2gW:(o1PUTA7D'v;f ݣSH{"w;S%qt8B\\ٯ&B;/GE׳nI{uU˲fm\] ?hw@d6I"5UC8gW#!Z6iB} QuI]e/Pja}ɞt|mA Z20⽝2f@rTCoWYp!s6[J -E EQ!h&CĨJ~\@Ǜ߀U.9] +CxʡByYT1T%AKEs?ڒwAU];4v^O7nG%)["&kQVVEDFMtUQ7jē, ZA63HDG^Dv!{5:U?YfᳵGQ$~MC4HW5 FM0ƭANuWΨ04dœmZwpgK8XCGGȄf n7oKEc}Ey$@l9n,;nloJ[MdwkS`DJlH D.#S@ J6B\25'lX1Q+Tq; RJຽlln {.nGi \FWpk>*<u<Ւ^Q- k 84q445A n"r*(* D~{0yf&$sJ+8 0qaC.jȐiݓ =+A+X ;q<|˝=k‡0hep$b5>;ys>Y G,x[ k*\⾖O.e0yyM2DCVV6:zMemHo%E %459X"g. <ۤp< uo}N ժKN(coRI Mn;XF6pS\,Ƕ,GAYr! O5kR`C< 035JFY\=).ss8էQNq.ObH2&u_2}< ś1r N,a@*ٻfZ8 , T?׆nل0,ٽ mzV"$~Ї@z4B 3r˦%X.c&[䶮>cG_@’%Lt?N~TPCBL/H'sui]HI),SHANMF%͈T 1k+* _vXqSTg>ͷ7j[#<-WgܙuCdGѠ*"J~b7OV{YM9eFvz > stream xڭYmo6_o,-ITH!6 \[JkѮ$m ߯IIKk٥(3ό:J%F\1R]nLDOX"貌~9g|Źzw}v]/F/8˵'$JHf`=<5mQ;CWt_D9SI_&ۋ\bG+..nwlz@3pS4?=aRෲemnf<+9B_%`Mqo޼774fѭ7g3hK|`b@\ ';sUZ x0-$n~/OI\+d%,=Kdv+=iVȡ`9l1;^ ]0"ׄAn+s󮲮7w΍[xZ`͎Z ȘG^Z;ԉ;Rxߵ]YwL0ۮm|&+|ZV,T. ^FO@~!rafz?wѭ8P -)HKn KxHKFd՘@#N~CQ>feBLi>“* <mWS_ +@`\~tNTPqj#kjzvNp).F_NK;罝PT]:Kׯ+}S 1  Vʁxa߳2RK?V> kV"&vp~GW6ZOa4izĘT9S;$$N.;<$F?ރQqN(5Ή,r/5B!FjF#!/ȋ +w=`\vě6\Dh "ۗ\#{{̒,&a<@~Un%~osΥFTu6Oc&_t4NԆii:ljɑQ.v:VU_!7@]ZNaʠU@إ8;92|ZkFۇjhW5K A^9#cșY6+7|k_Cz]-3-, *ox(tfK*If".~}zZVJGG2lp<1{> KZݖ *v*X`;M#f#wF+@t} ջ b'K;XWud(f3Y*o,>jp H#HԖu+,}'?I: endstream endobj 2804 0 obj << /Length 2307 /Filter /FlateDecode >> stream xڝ˒6T"/[;8xQ%!"! >d>f۷ݤlsP h4FĝWw^4țܯ'7+\??)E:IΏҍ*3?On;SWOD0q'34d*/'k]0H֦kS5$i%2~%FwKtx#+QY׫OYiBߪ h]V5HY725#VZ5KmpsKZu[M fsf.QX+4")~ZVYjgiSM; duC}?=gQ7Nf:Cl]SF2bT%oLRu&cuʼnd!I6~E.Nd3Smtb){ځ:B50r@d]K'j0jUh@zs׭(pvaJA-!2ŀ_!$v%#v8sJp&"whƜ/8AIҪiˎr%5ff}@;Vj,G@1,a[zW6h`CL)S95DK懣.d7%r$w@hZ,o[v[7Pc%hQJP~0&4m!&S5ӣ9o9< X @bXulFMv`E?5 ͡aŏhق V׸d?wcاt kqX-pRXB2@#(_#T,gʩJm(t1\,mu#7v <6{?Vw' ignu,B1ݖ+c%9#}y5wOCHftep_iI: s Z  TsH `57!,Sl}m3s*+|Acs>'#χ= 9-9Ͼ9\c5D% 79i\ߝQ?./]{3MD[M!r7ZT\Ǡy~5%Ԙ 5Fϸzz٦}֮yF4/ ,@/~y/Aa۵wg/EZ|99@[U 쇮|2o |Írw؉vU=tBe`h{dmuz?BOI`z ͥ.2\vs!mWpF/;4@SLY L _oB9gVlB/9^.bqR R:N%h;迷f'(SXg~oϟ1s mxnp/ /}[֐59n;ӎ!="p68LG:"m H~ ծѹA}h[794H7T\E@ghz'B3$~4KsWGO]1ζȹc[UK-s<WvoByPSwebd6G=@LT\*WjbN~ +ԗGc4a S"x6AWx@'ъ6S&dot! ܟNMi 5  "q\513uք`IZ%1!'zW.\s]#i/#Myӄ*Y0+U1 3]]56]0uK}Wsp_}+YI;/B|3=OqPc΋ KGyEE"l"mC-_Mx endstream endobj 2812 0 obj << /Length 2134 /Filter /FlateDecode >> stream xڝXKFr5VJKaH&$&s(KvedFt×lm_bHYd)sby~tGyilu'Y"xOmIYyKm-qI˨P)D`,C h LoY۳m誁uA9hf8[jkI{4HPCE7zSc0L]G$ߏ}fP|VnPYטKB޴4e&P? Til,g?6t6w,V"zڏ~7rġ80նye4ؚ ь4SU.lښڬ D5;3X}&%8JT>)fF5=5zB֔(E!m;6bi|wdI<-@ 'ȚȠ־Śqꭜd8%F6[ӓO*Ȇy70;SYCZ0>N) !EVG|Ay%A"W Юq#%#)!? qrO|zo9< \E\7.Ar?@ʀy9\vhq4e\zLnzYa~7 Eb1tٱb-M&ᚷGKc>Is-ؕh(i#tvYƫm,K',q.8PA_? MiY LRt#Y /Qr3XGŬ+>f'> ?ٟ)MuD1V6 ߿M? q Tj 16&r~l}HB wc@lӰqN琶:Az@^zPm/.po` ct;m<2Aۤ@\C:$| P7Ua`ȓ :6Toj=SW[CV{w1`A?pTϰ@ԮANM Q(W@ݢvlk<֑kG +? %UTiA klE`Y,I [~ڿ̱kx#DN὚zuU`>YI lښU֯:<+bfa="K2A0>Gz}yU:U~ZΟ1A<ܡ;HAw#A ?FyfᥡfwUP&.ZdyրQ NFJI T0`$c"FOrT]cL8e ӆޝrxӂIT4k>^g@M<>.9$M n$0 { dCθ2,fG8-v 7 9ȍuyvg{h${thd,>Rm:Ը(W* F `e#M8a)28Ty@GGeԷU8Ff.)_~jk‡+6)3 S:."nxs ^H@_H6YV^HQ)hBlp"ߌ"sO՗ل-;@oftS+69Myf‹B,a_u@[^~>&% `= &aA7"*g+BYag\ϫUΣ*iEU +?@.`ԙʡqhIbQQ/"FIM'|d4IiAL]yuC}lk;'(yVqL0aX!9xWִB-{(zK,nV^]q)/&-Lnt` endstream endobj 2817 0 obj << /Length 1417 /Filter /FlateDecode >> stream xXK8 Wa qk=^V&BeɐKRb;L[`'E>Qa({Woh|ގVY"M$_Sie(K`&M4^f49%w;nһx:f'Kr cθ@dz$H8e6^Kg*2QZīs0KdQr}gˈc:#-`yPdBjA49I c[[e#T%3yR EǃV$EWw=&B]v<3|>&IbFĒI+Z^Ux"pTƅjSwoa6$sV";23rҥ**[-aqH3(aq$B/fİh=aF!$Q-_(swQ?NùN_- g ~- _1W(iכ3Voῶea\5ص -7~ooa9!qs y~Obq\a¶%kFg4gpuL+oN+ͭ¶Pe U+hLY~*m)A=zH^1'@brAP%XXX[V/m4~SuÛ ϴ00Uڛدnퟃ(>GR Gf> ؆|dLd ϱ;0'ڝn׉w8Mq[^H?GxG/ߛlDdAGJO>nN!f?vO-H mìv<= >3~FA|uu|I[V*ᱠfUdo!=% E17DdQWI)5X]Fvy/+'vxK:]rNm|"|àg)˽15|9W)wPq&_&Il~VtCp{@)zxk G  FU1,Q`ۚWNmԫ'$]N[꽬|8jknjt56-A-7Q[y9GY6gr4-,Q(zV_0& endstream endobj 2825 0 obj << /Length 3570 /Filter /FlateDecode >> stream xڥZKsFWjLgVڮC-ޑH_|IvIh |xPb]S-ď,Z?.h~ #? (>6tKS_ơ_^yuvwGa[/bQeFr* " erX)*x%a(V"ZN*y`iUꮹl<ȹ'+ԦK]if7kwƿJiNҽq04Vt}|yDr$ USv+t3za5,föhM+s~ [,|@+LdF)G)t?wkly8~_zUW/Yv"xV~W[eƩ Fj5Y5Rme{tTJg:^+%h[~N Dh~$r Jg|˼9;,{jm슏=66eh|*qO.wl׹m1T"i+fÞ4"ew-18fu3>_Z|iʂuY.J*Fq[ag=2VO&83ѓwmw˶H][ۻ\q釟;XP fl] LQVae<( Y'DF ھn0$pgYz?5}}cUԭRFh-yqAix3I*tܕ8|Ms53z'+PLI.Hi>_x蕉2Om?0~E \(l ..ܖ8#VL#0HΠ &з9zCt E8bb(ڏE,m| jA£qq._sPM,Łա`S9t%`=BS( Ⲫ  UB b'N 28FJ8{4jM+ʼC=*pS|'v/lTŁ;ɱpdMIYEy\% '6?)X4[/ńM#I{;-@oUqYjh"1 LI@[ V( gcfb0ʯN0Ub`jԈr? 9SB* }tN°L+ua8+ݩ3\CljM0e)4mUkN%b_3 C-+M1Ao~/l G;W, ?.5yA͖VBUa :qnX!*.2xl= TW$,QEu&|ȞXW#ۚ,~/]?:}m?22>j,SRN *.&Ri5R&(YN$V?sKZ7+3pbf0ݷUqrJ0ѥCtws4A1,?K;"YڌV+=3%t_:K1Hx@ћO.1"f-+ Db~;yM}ftb9'2`y2@4&ȂPk S<CkVlzF۾#s`Al_k fu\T|9KrrJ&0uh E0̝$4 $6t0FY977L$B=t%.%MC{fqgu15]ה_ԃP~KiH3TL7$4R/PzM1!'FٮҸb s;Һ$0y0MYpLc#QE~ #!Cy-8& #aR^)F&Iө%Q&;{`yUQ~͗}UwK{k .l4ؔHB1gW)H$dۊҶr܇Æ/ey6-SO3]PiIEC?Mc^)f">ص~quW I\9$zV%eQO."+RJggFdX)½$35:+SnJ)"7&)P) D{0IootݫK}z)}Sz'SE+jiF3xAe_%GZ<Ґ$1E&.I |mZ5[$/km/ |ڌ|_9I%ŸS;P]q V5WT=9P1 >"ś| !YCE$:dvE錋NrYg endstream endobj 2736 0 obj << /Type /ObjStm /N 100 /First 953 /Length 2297 /Filter /FlateDecode >> stream xZKoGW19@$nk @v cXҊro߯(#c"kU_EjEK"'Xτ&&,G~u<(g+̎7a _~7sf~D0 ?~h! ?AEF,L0#y:M&{iqu%kxgvC^-`)'Sj#>@u?}F|NNmtNӞ $3g'M ݌Αv3R9/@T-u\g m`{-kݶcD2໓U:mR[HrG2x  h3z\֘.<%3h9PﶣMyly3P?I.0Gl-!Jd&d%"^/Z@ߌgJ^䔿e,([9g/0gs\pQw?uS7P3 pbJor7#KnF$8 5"OxT|t[4M`Z"=ch2_ K( 0NF/-T x3_f^[9^ff˹&MR R\dJs'W4塕יAr!lbE+4F>ab_VmjN\#َhE x6,K= 1oaE *Q|5ljd5٪vyS/FjUիyrYtEh={x>"iKVF ᔠ Zn{ܧ>uu2h-1P}q<0GsyZ F]|<.U 4jD;+)Kː? ef$n7IaCS_lܔ!^thxP) 7[>ԂOy{d. 7Clf5}MIq6I1 BJ]2Dh3iR%}X0mQۢ>SKؖp-["D%op%L?ZT}9"|^ nίWwz.wjVrYmz4 u&>&ı,픳VF.kr;n>m<-  :d\DwI}LGPD'Í EZD+f$}.\9Z4N뺟ՁFx ̲n5t 2gzqӳ0( BLI4ˑͣ_GZgt%UsPr\^՛Fngq*g5\bGLᬆ|b85-fl%wT8^Wj:[6Ryo}N3,ph}+G(ETIh|Of:zR}/z]ߡ %[ۀ# YiVw'WƎr(ch wÆOlF/wRL(ߡ* C|8t8.bb2\?uRwe>ӑ212HH٥nF=}^4tXl}qwѽ @}:?('aZm8UuVJlɉA[J1=br>l}H˔;| xAO*<⽐? v3[_[5.JNKA#xlTI8Misf9O>{\ endstream endobj 2833 0 obj << /Length 2162 /Filter /FlateDecode >> stream x]o6=/x"Y?p"],3JƨǞ)R;-nKDR$#x!|PO)%RE۽^<-MH4S<"[!$F7عZkDVkcl V$a]6+pgbEk&:Zk% P2nǎJe~{,]̚;<*V*k;4hhKZ28 VLefaU0 nElP!l7[ca8f@FW²zPR)Aol Q|aǟ< uc&HGS 'UI ^IhTNjm_]{5ڿnZNvkVc_7#8Y 40">/oUZy ߝHQX(=.SW$\2#)8K ={IVHj{rthJM][QE]Gpcc^ras@Mu8xP5¥A/ wf ;lƮs& f[un3gƗu"x#ũȤЩD^`zAF[.GB`ٳfBh=4 ś@n,5\C oQ֯}b֮,TJ92Ç>ƕ=0ZݼWJP=GcE QTl̃츕Cx{6Pbq]L䔎BM][@M[L{2=a1AvIxQ8;1aM)pn& jSڞ}L<[> ޽M~:=xn vvoЍ+VjW ま|4n] &W5e=-9'R(s>CHQ>mE R) A~.sO25dH5ӦaW N8~<<ӦLƹ-ӄVN&/uGZK2I 2OH! nBq\e09DQ&&K⫑x{է:a![գeK$2r-LĮ:̟r>f-Ҡ?Qjhn3J [BkM| >ͧ>e@|BJ f^{|W ۼf=K˨lb2m0΂\?K="gu}$Ob]8򏾀.Fx*J !8B%B% qJz3P 6a .ǂuDsnQ<_gqRs wbXX޷N J _"OC055ֈ,.el&255=uNYOsxëT#߲N=P4Rªo0H e (H8*dyT:L9&5Y2=œ'y6JC:T̀CQJe/*Ӕ\a f/h6C.;_4+f֟YɉUR/m[ȩfS;ٓ<~,?akoq64;!lz0wՏ܇ZQ1w+5frx>j%=kv`΅wS ÌHљqoO_~#˿zhSߑؓ$7c?05سl(SYY4g4a|qiBO8L> stream x_HAgvn,S'ό2LzJ3=#JR|z)zHQ—z8"$B8ć9~ݻ٘=fgof~3 `bӲ<2I~]* )036#̌2(.kT觞:|<ѭ/וo빒gd:ˉ>1 ژ#hv`ҧ%E.}] Vk u))%RRIQyv0dVQRoPp'k3I1UI!Г̯?E4$}A4)\o?1;`Ҩh#J-'4Q.|nOMt6j>XR,o'RE0m" 诚usu<#k5f|GֱVMCoWM|_2MOWilAz{jx*h$ӔT +(JJJI))%6&&GT@#ӣc8iΤ)X2=J;3T2RÙM ǰr=J+3vWrFHzV g:RҊ%5ݠУ4cBkԣc88JFQae|=>oY:s-N>?ʜ&̀vēP#t 6 pǦRRJJI))%dukH|W"\g{䑩lOv) g2RQBО;5 A"Vކ[l8kiut"Zm,{qǟ’mf(̠ 0:L=!8&?G?%_4Y_Z endstream endobj 2837 0 obj << /Length 2707 /Filter /FlateDecode >> stream xڭYIs6Wfv!}.S'تԨY??o5T|~C ^*ʠT]y( 8?R @QSmfn< 0菝\ł["%2Ql{ߙC[4GGG~zN)vaMlMYdXUL:v&V ]c]VCҹLS>WͲMEYpRY@ce`OUhx`8^9Ildy۠uaeɩ9©[+F>["QaRc'V" $Ptw`^3in̲z틳omeB$(DDP-0y7`3oIB&RҸ5R5OVi&8#`?xJxݻylF\nm#6G ])n:9A'gNwFL\dYQ))$mlk&u45IXv¢Le.x =(llݒx4[%Ά+'k=_n ӐB!^n{sy2\xk,ޮvNݛƐIA~@Ћ<A by/7wA8^@SkO%ЫWጼL4V) ΤևR},PE=M@z;M0r"Ⰳ-QEV.dWEQlSD9R+GP8L ?O ZHJ#qr{*xHACFн-=tmOUd} >]re>t ѸE&Vdi+c1؁Ie{YMvd|(N'8 /CiZ&8Y^&iܞ[ 5pʝKp{…s4v,4^'^Pw57 L`ӊYt>8av/,A ˦r* ]0f==gZ4=_AP<_~zs]piP/?(d|P2$p"E5?Vl-hmٕKe%<(*J*|BV+Ws{(nݥūB?FsS|RyPAq>-B46  r1 [?+T3}'QY9'76> stream xڭ]oܸݿBe U\g}H ^ѻDG|3᮴/'qÙ|SQ ো?^JQfq>E&J\F"J >ǫ$-B;wua7(Cp%ѷZZܼU\ H0q<<\kڎEoMkz=ieٍw dUtX?8C[Ȉx`CoGvwZ*wk)Et} t F?m='Zt[$|F3,ءBٯFd$'d×75F@A6#^i_ZL(.!:Ҍp d,K \dA\N4vniōmt %~` #ӯtwuN<43枤2`d]8;GROnLeg;x>}EU ϩ.o~SƊWёwة3iw"ܺIviG etRjL${.uw?,oo^~*2&W٢w~Pr9jD߹/OȈ.ՌP:|p˙pd Ԙ%=pDJ*Mg6k LkJz"^B +[7Uf3v=$aG-4Q'+ړfߚƆ+P![=鎨2Xl+hsRsALP%TӄkN-ahjo( QKK npkO4mT9.O%G.tX^tX i Ao/^HH(LfA"`\| DRQ6A,ʢU\&RHU:NIފTLsg")8ڙpp֙WH+` }U$92gN||{#>nkMʤ1q4"Ƕ ggya0HàaVٻfؖP:AQZ%+VFPظj;*@9!7y+|x['d_|d)MGx65>j+b@Q_0v2tY?EzR]UhL%J";`OK B@~\si0N ȏXH$_q޶ {5O}8(]1Ʃgp5+jc; ioמ1`m G]|\戝d)f+Y ={!4lY\P_ nŖH Gu2< W4RHujsL'07qd0l /mw20&l?4lkʗZOu`FNw]m^ <3 q.8YZHva^I(| mv`j)_S_ Rxn]THfXs,DIvpNhRo>sYVs(s!%޺t AtaX*2*S>n,՚iuϴŎMtc֜r oW)K{{;o)ȓx}" 2Q"(2 D U*v*M"Q9wm7X8,? Ha4(vHZfl}CCP6}7@W! a\sx ZtWQ$d|0vBL0fm it_^*U+@,Rl {!1Շ>Ԟlk&JzbȿT8̵:}e.rE4 o~!8QhMFUOX8y`GR!6m7mw̾#ZlC`5 קޚpWȤ^8pg">)'D;Nt_cd?Y@A&%+9$(la4!2P׻?o((~KPe%'?78DL QdDł V@W endstream endobj 2846 0 obj << /Length 2636 /Filter /FlateDecode >> stream xڭ]o6ݿba8-UDQ=Cu >CRk뢕TQ vh8p83Vdz\fϓ0Y]ViJE2]]}]wބ{U] Rzm4U A1ݩ3ZxN?4 ohik Rc-*iS8=) BzWEWBJ߮&l8^AOw d}  7DQ4?|oy*xv^Q;njJSi `m]Hԃڄ~05"#jM Ly׷=_RPpsvϻ w !D6H &-Ђd7([ Ow,}Kҳo.pT6~fd`y*3H(?#" L0VDQbXV e0uFnFWD ֨ K~lD2sȓl#F0}&^iZ`%c8) J\J˕U4%Qs(c*֨ոG~O펟0e!k 8`; uJ 4 ؄%mϒmK+&;mH` iGV nS R5[b Tue+y♥UO0ޒ}MY/.M973ay)3Gio-k2hDT6p5oUc}uGtp˭ 'J#)pa$~P #Cw@іJOWFYimaiT=X'14 MPFFNHjRTAm>ǡKz.n8~ R #4A'L!eڠK@u&1 Y=TuM"%}nG#L‚-=Ξx z@ohE=K?*vF3t*{{pXlmՐW.w͜jl"{yFPTj;m0cϥ4҄Rqqf69>GHjpǸّn+T-Cǚƅ@\Hqb5-ItlѪ~=ɫ)2[X;`Nh ؅3R!Y`&}C}4'h/טKT?rL(E01iwQ,9#Q5y`[leR-!3tMMG{{gG9k8}u'q3j4yRm7ad2c0FCվ3I6 Ӏahzb+%m3PC&?CUc|,_@InS] B= I1s1UQfjpG%CV57 mjp_?ՠ(J{K'uI HY:~Jl:e"Ta}U;0uEլ dNul68Nx=LyT**B@ۗ9$䬂x:Kt9*< ZOȍ&yQX⊂>JH t|}%01 )N$N 3^bW@>JW>fSrU _̳vBMSbZdé&)L:QȡMZ7)W/uQ۷70Sh Ĭg>U 104XD2[0cL&:wgaJBPbݟ}-X <[=*,YnO`Jbv܀0YiʜN$XBOLPs8H,RS*mdhgYF@'tI5[?zH!d$< jLI 3Lfu |Azd&EeN+d.*( de0;2ޅhY7v=꣒ijn*^8@jڳ(b`RHƞƒ8"]tM~ڨ֘;}8ĿGYgeshJ7-v=[ R?ԫUB?F;t׳DRwv3K!}7H<k~ln3粚Mb (Fqᣮ^~Xr| ϷG] :/,ikJNs'0 V"v(iGᡥ&^عj13,WlUZ5Vf5!&7m4;Efx.'xLp`YS(8tǬ%`~T2(߯wܞz%M^cҎ3VX9:ua:&7}l>Դr#K$r?_qu^.ۮ #:IlRIH"I,uԹEyӺz_OGa>)h" bŖODcPerif+ lt6=jU^?knv-S@լg0"f'hT͸(5{L@buB{>Hi`邻qs`Ջ0mGF 8i>;'[ endstream endobj 2855 0 obj << /Length 3190 /Filter /FlateDecode >> stream xk 6p`|H\M[dNʒn.{^ ˚"gjsبW/o_|:L76Iln6iI Tnnumo6~:[lLhwif۷:EЅ)|(YKe}`ز:c=Ct.w<)Km_shL㏪Aw@w8BV*8c7r sa,lS[ W {̅#|?CR]ϐ 5%40qoKc}-j62HR8t>|}fIY=8\]J۾} ;FoJ`)N/~QmXc#6Q`"xؘ߯cK$s_3 @ 7YMˇr?ZJt8Ίb݉:Xؙ0x9= c6/@'1=Hػ3cŔ7JĎ80?0I~p-c 4qK럽pRQ,t?NMl""ZrzΧIW1*$0*BLtɩ$zje]ӝ&"޵ertUhkzc@tz*MQW2 *CR}HInl,88hH9.ϔD(v8}pbk{yp,e E \1U P[57:]1hMԎ7]9_\<%E(qm˺X3R~<0z( j%`f:~AUJ X^Bx0ΐMwcOg)ϚnO| 0;'ڎF>rTyVad'OlӕF"T< fr%mQ* ωuU~XM4_?Ptt`#OeAQw/< 4y_tN~{t1{I@/wQb;Q,Mh<$w6QdQ9UY;)D4Sg)۳ 1k1~נg oZCZ˓\D%8NLnθY AUH2 E[Tֈ ]k*,^(?WtK#,&}N+KLyd u5EFA< p߲ZO*se%.l F~fAA`3L*vlF p7CNT9<_B]+9wS+*rL7~@frO~;`UBxwxR*8o5iZC/yeYN`?x쌟g憭Q9?(rO N[ jڇȯGD* P0*ý/F5q ,4f ~nF`=i0+دc1f1)T=B4'*U$*/Q&=^ɪ7J3ƛH30]wVZAӆ0őEZ%#|N?MhB8F\Sr4Za/_dh-6\f. d._.p7gJCϗΜ?) v@*3XI`ɝ7(%,.ra(AWDL[@qtK fQއqV_rGu1 j\M^x)7PҳBp3ۃ[fω(=]ԶQMa]T#;nD]Riù {J˷P"TH@Hv  Jii^O7m=q/6c,s g 4~uߜJ 2igNAo^p'gkGo_'NĿamJCpԅAYM+\G/ ij#,3s(ۼCnTn:JfŬ,3˷˄ڍW> &pIq ~{$=%h_/, ۨ'o~~D1^'XУ{~@ǮK }B4d}_%D/>MY jkOxpv$@gqabVE?]\WTdck *c/Ú/gėzF9뱤.9OS6g=! t@G:V/o |2a+vşj!d]&M%6 ^7J~-Ʒ5SI @7I}6* l.'Tz}84e ݲXm당Os>ύTi[0 )d|ϥrU@ WM+`#;^t{DscA7,j+'U8N| HŁt<, .+[BwֆD࿒> stream xڭWK6Э2fDzyl=%B+kzEvpFupU7Wn2/y&feȕR JMkW(J~(є>wNӢ]?5nz@Fw[V]?hX|tӣVotNOkQNh+rfW>l~R9R7R]_4Lb]>:ԥˈ: ZYI=}P48:iЕwq #>eGOˆ\q`zesCUOEgޣlPVc%RDqTr"O#zܙÄI̓.N&P_7 M0͝E:0tEEyqTఔȠ?QS,yH]|#;|\ >F*1Ytd/#@gypgā,*}w]ع^/PUXpݬr88csr\pe<-h8QO@wO+l<(5uEsQ f҅TT2X]oiOǡKOKxxd06CfmJDן0vb n$4M9iyixu9N;($`!?Vm > #z,ZS%ڸ;j@z"edͧ4/Hkѿ)~cxNhѺBU3pڮᚱf~*)= k͇ 4E!&>Z+{A, nt%#IɅ\}[ endstream endobj 2867 0 obj << /Length 1676 /Filter /FlateDecode >> stream xڵnF_!(B!Ri9HcIPl1E2ҪٙeHi}c瞡~L^>_<00w4,ďD6Yo'j(M<M?&OT I0K?1Q\HxEW2zQvuH0,DYu, YY2{uۮ`#eK]4i=q-?W|%$8i{Uo)H_ ?W(,/Kʒaޗ?n-* /kP(jd[E+-\V:b k>鑩ZBV^ vd`VGXMUlJ#vW5ift-^SE1Ҙ=L8)e[ÏjE@`N7ǗXF }A2܍4tKVF"F[J^;C9TZx-S:S4`Ypx94 m~}}--"\Ͳ[O, )E`#Q @,ЪL~""o?ķ6v::>w~@Պfi46@6/*]Q'Q9ţD 0:TO$w4x3",OVGȬ-I'7_:8G`G tre!I*@h .$'؅j-0Mm@( ]ChC)SGBm5$R ¾lmk]Uգ*FĩzYRШvư֮eIK/̳BnvJQ̉'YPNmrTV40nՇ૷HIqM0Ads%(>}0^Lm'w+drstrReagO_]^<!Hw>{%쵻 q>[:8%%_Ш6RLxUPqc`c1yso[7eKr/ W.B0' ZEu!qآ9 S6󂌖: 0FBف*E5%BP݋O=hZQn)ʗoٕ}or3S9K5uhTĶ#DVoٛPVq9# Q%üEs/lg-) 7F& e[% |=ĀA&ͪ X"C=, V-m`<aA|%eQ%Pˬ LґxV)̓Oa:5qQ"1ɋöp[> stream xڥX[o6~ϯ0RY/ZI C[C@˴A>I guCh)ј>Dvy>0%~5 dRIŝ2ˤ2d>~W̠eARG^'f|4'HcZB +K:v]^ى)45&ՊօiDž2$~qax`1Q q#WTTf5c Ax ְ.z55!\xKc=R(K$0'tǷ%P:QCkᦁVt sQb,Hv]̝XXa7(rA -l($_`OUm Gq˦kf/G*.ø\œ/D`l6P4(#iR׹.]PgǢ 33^#e}FG9oZBE-ZV-fuFm,18"CUz9]h#XCXؗVvyّX[ϕ{\P 'fHl;6*K2 /;V乎M)8!X f~ВL %d#KtK˸f6,?h\m74FP pTQ&F6nؘwQ-,Tlpf>2 id0hmUMׁ,z=hzlϼhMEk%'#CJ(( BK2e~68/o΃]21 D2} K @i \=l+|]!{,;gR :g3 ڶd}EӮ&r+'.jp8,ͧgؑk =Xx6i{Ӄe] endstream endobj 2880 0 obj << /Length 1567 /Filter /FlateDecode >> stream xڵkF +#]H@9+"E/.}Ҋy:N@U);;;; gE^@'y r孶gςTH8˃D^(HW;~2Nb" OE-^@̋ekoYzz3zR GE'Ƙn]2b0cG)"oZ>j~ OfQ %o})nva"JG z ) NXYhA$dQQXxݙm1d`mowif2EK *ޯ3bgxˡq= ^Gݎ7~Enyy0j7h&_S$"io+>=Hiݵ͞qWdftqXh4aѧyE;Dy͘53[tALBϕ* UXcaTvT'9'|{WC16Izv ~_%W2KnQn>-6&0e~1-_[ R |B+mPȡ H ܙ r*6# CurN:J (xu(ϔ1uiI /_C2mYCJКeepԑmcQkOlb ~-FDA8!)^^ʷTn%y[J ;7ߞ=%,vrKmUUZ b0%xwy2wkRǞꡲ ֏q21V+$Chԕ"ZjixƢ!N)Up5࡫lHG9T:/yf=Mhydp'? [*q<&?3̑#>Wby_p$ju=洢8B0vR-383` l$Tb54{ Nuݑ::ik-xTJM+LOd/v[̕ƪY%EHCۏjlnd$nK}^hpo#7D*Pp]xhΓ2uDTT =rdHO7ez;s|}Rv6W'D 4WJHGTϗgo endstream endobj 2870 0 obj << /Type /XObject /Subtype /Image /Width 666 /Height 530 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2882 0 R /Length 9322 /Filter /FlateDecode >> stream x{t_$ܼT)͢TʊA9AyUs_Vc8c8ec>c8c8昏Q 11IԎ@"SsPs55\@PsPs55WsPs@@\@55WsPs55\ qjo߾{wލ7NJJ;v@||˖- 4ٳСCCǍPqmڴIIIٱcIyԇ~P)333/x&|׮]j2dȐO:sUs;qVV/\TTT~˗9@59sf[*oذaӔ)Sڴi|뭷4(.j#??w 4o޼wyPy/.v__˫V[޽{_!% aunPYZ=z9p6lɓ'ss5"Fճg 1~wEԜ&MT^zz&OMӮ]< 9jnԐ@x5Ws555GAAQs\QsPsPs55G5G5GAAQsPsPs5Ws5Ws555GAAQs\QsPs\Qs555GQs5GAQs5GQsPsPs5G55G5GAAQsPsPs5WsԜen;^zݻw衇{=5GQs8K.8qҥK:vXNW^yEQsʱ|4j(tܹ';w}siii Ps5|ӦMo}ݗԼ/ .Ps5|޽-7~jBwޝ9x`5GQs8j.۷o驩oVMBy5GͩzQ*oذaekuHJJJHE* OD^=G3ė<ŋ믿yk>G-c!!Ƿcƌ Unnnu>jĩ?7ߗvzǎ>￿: 5jS о}ULJ'W9P;jq>/?>eʔR󼼼oիb9jPdeeGOJ{왜5GN4u57@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@kͽ{:t怚ׄ~ְa|O>.L2o߾III&MRs͛we5k֬A]t O|-Zh۶ )))}_SO/\<ܹsn5(ǒ%K}؍裏NVKJJ|1cƤc 5G1hРpb^XXx,Wr|zm%R/VCjSfΜU*oذak颋.*Pɭ￿vکS^{՛2eao.;;;'FSx5Gͩ7o޻w<ŋ^Z[s=z4mQsjVZ=8vNNNQ IIIׯWs5#< nɱObu)-->Ss5r 6,7̙sP:t~ٳg/[,77W^H#\5GQs]e]vgz7~RSӧѣI&aEUCj$8u575Ws55Ws55Ws5G55G5GA5GAAQs\QsPs\Qs\Qs5G55G5GA5GAAQs\QsPs\Qs\Qs5G55G5GA5GAAQs\QsPs\Qs\Qs5G՜{MOOVjN UҰaC5GkiGPsPs5@Qs5Ps5\55Ps\55Ws@APs\5Ws@APsPsj樹j5%%%??<_95O.袤Qs5'.j>{6mڬX";`ns{Us5'.j|TްaÎZ~:lܰaCkW\ρ~ӟs=,N:ovEj#??_́RXXUx|a_#ؒ]?s߾}M6{>u]jgϞ"p$ RSS|n^[lI:kV5-Z߿ůHyݴiӢEf#]^PPW+2333\.@ٚoܸqΝjۺuf͚70`aO+~N#MIIiժշxKW7oOk3gΤIw޹spP2dׂQ67xرcC׮]ءCQFSs8y=Ӗ.]ZRR}ј)SkN .jެYg}6\8묳"/k֬LJ [nmݺuv;v\~@\Լ?\.**ZlիK/9EÙ5kJꫯ&''9ozzz@M={m۶uP l}sQs5;vlRx5\+W;W1{UVߛSs85n3fj95W55WsPsPs55WsPs555WsPs55WsPsPs55WsPs555WsPs55WsPsPs55WsPs555WsPs55WsPsPs55WsPs555WsPs55Ws\@\@@\@\@\@@+kIeYF j&FQQMrrraa5?~ܜ56m*QRRb2c͛@|޽FA-yӦMҚ7oo9P5߳gQ5_n]wݵpe˖9e˖!WVsj׫W>T^n<+F۶m}w5/OIIڵao.;;;'F~~sR׮]<3g믿+۶m%Ɖ[W]uUFFSkͩ摚gff9jC|֭ɥ~97n Fqq_5/^;83ԩSj5V*(((1e_jxsss;wܠA֭[p N<9 jjj5\Qs5Ws@5PsPs@5Ps5G\Qs55\Qs5Ws@5PsPs@5Ps5G\Qs55\Qs5Ws@5PsPs@5Ps5G\Qs55\Qs5Ws@5PsPs@5Ps5G\Qs55\Qs5Ws@5Ps\5Ws@5Ps5G5Ws@5Ps5G%jj99j怚9jjjjj99jPy}7}-33uǏWs j>u^s5O=˧M9#|KWG6{mܸM7T9jNMM RTTd,W|2VsԜDy81 XjU==ܻO?UsԜ={yΝ3334h0xE 2$Ľo߾SiӦ5jԨ>T^JJJjj9Pݺu+[w;v on9rdزbŊ\vvvNc3fȃkw9P3g,[_}WJJJ$'3!^+2,KFa~j87SCiss?ak>yd5GQs[.,ÇG1"lYv9E̓n!--뮛7oޠAԩ5<99Y͉ :v옛{A5G5@5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@M5PsPs55\Qs55PsPs5GPs5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5Gjf^o馤YfqQ͛7z&My%%%j ϟ߫W-[feeo~ĈG5/ ?5:thJJ_>}^x'?ɐ!CLê޶m${.w3 jMٓ٧Oj;x54hP8ZSɓ'cٳg95ܽޛ^*[nk颋.Ko1"됖-[B#NkޥK&M߿H7#??'KT̙3Kռk׮7wڵy_ 4UƉ[[7x#u]vp 4(99#ӧOWs; 5߰a#,GyDͩ56lp oNIIի?y悂+I&&C|֬Ytڴij$9s愚7o޼~\p#on,]pQQ@ּ99jj9jjjj9<9jjyD~~J11IԎXc8c>Qsp pp\}Y斍/+11󉣚\2O a y]bERھo~SLYpa>}b[jDf̘&FX-Ζ-[ANϞ=q?.JS$8p%\.]ױc:u+VNh`O>dDt&MxV^FCtKӾ}ŋڸqSN9%A'W$Xx*5D^<_zvJ;cTa>xnB_|Ev*Sʊ+ž批x*5D^S$y׮];uk^zSLxN:n)m&#a;<5Os,5O3f̘0\+I<=zhڴ|?6}YtK9ϩꪫ(aZn批x~;6L/]9O" Z~}/pߑ7KJJzٱcI7#k"pJy^jXjg>oG31WNy":uꔖ{ڕ's'>a Dp778p~SN]`W\zZN*>/|„ .\hN;aÆV=ܹs%~w!x*>D[<~*o;UO-CG?={erss{È_ou֍5۷oɂ箻j߾)yÇر}ّgQD/DfbT|8xzITNhg=zhҤIzzzVc4 K[ ̖-['CUp˗_zj6lfu؍;t`jWk>wܲj^.Sþs<j@M;xVZlrذaEEE:묫^ {aoO?iӦÇU-))m\~I&\sͳ>[`7•/e#SNҥKU7n8p9sꩧ~[ߊ}m_[zwݺuvM8>p]9\UC ~l3fDk^=jy۶m{5gΜn!55[n>P38㮻z#6\~G,Y???OB:G={,yO?tNNN?ϑ߿ /  o!\[r桳:u!{n9{T_y&LѣGrrck޾}+b֬YO[n^ۭv s4hPHiC H˹P5'-5lF0D-r~x8%/..~",Ҹ!͋yI}_*zn[J 6 $lyw*RΝ;3/"C8qG#5wqG-'!vG7 GSΚ3薷~;l5jT5} =x7spUׯ6~?ak.+2##?>Roݻw-$5a1"nΝњϜ93l:ly뭷=\CԼ{ YR?>SB5ׯ_{wѸqۇ>kh>7즛n#]v='sg-ƍ;j_y啤 y_xܲs8SZr)Tg͟|薿srrb?dڴia^x!eȑy87Sξ}o n2"U~#O=T(xA[~_yϚ5+Gj9 y6mz2yN{#ek_4nK.2ݹsR^!-^xaZZZ̙pQF>5[n.]ӟ3L0+R`С紇dÛpҠA[o5۷\~/~W#_=1vpZ^-ZhٲeW6ybŊp<~s={:c ;Ǟ~g?©toӦMoܸj5`֭7xc88h֬Y)S5;y쇇pкu w͚5a>M9l>'8"Ox駍??nܸ?<7пo đ5kt=D<##m۶wqǞ={r endstream endobj 2882 0 obj << /Type /XObject /Subtype /Image /Width 666 /Height 530 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 709 /Filter /FlateDecode >> stream x :H<$ endstream endobj 2886 0 obj << /Length 1186 /Filter /FlateDecode >> stream xڍVo6_2ӢD}nk ~b1Y(;H[mЃ} x&+oW}{9ɓ0VO^z) Hުr9a+9Y7E$d-!qwc}6PL!%4h,|PEUbfwz`D!{xt_o6Qɍ_?L9ç , z;"Y>>&Rb})ҊGz߯gR0^E$N$`9KsҜġG%;YMgcVLGR%^rL b\KH1)XZUXQ)S[]$ID\M8(È$a? ^8UU(J o:Aeݮ2?ʢ]*7(vc ǍFv@02ϛƺaM.暷%oՑ< ('1nEixm7zvW&8=5$E/0Bݜ1Eu `tʎkլ m/ZБwCp֝w-c%ֿ7_055{]e@" %} 0eG44QCYxxFJ5Bcd >v|D[ (͡)g}%iZ af|۵ ة9 -HY0>)ktD[TT@Bp+b%5AS;",^z 4Gp[=v^̉bG43^AWTar@yg܂t:0&NmsQFICkD~QeBwHB?`aA%]WoZ^\-Z\&ukkfwKlJ""E+%iu'!0=]N-)./1W9@;#[AyD=r۝ ݡ6n{T9JN@ּVA`,Sc endstream endobj 2883 0 obj << /Type /XObject /Subtype /Image /Width 666 /Height 530 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2889 0 R /Length 9376 /Filter /FlateDecode >> stream x t"Wur(URS](([v-Z\XhA@p R\7;q4x&o&3_!ٿ"l߾gYd[Q"[!1@l|ҥ;$YYYp | 'a9Y{ w{togϞ111D1ʫ21A-1115| ppd~W_}怚͜9355Gmڴ4hq駟M69pL+j9jj樹9j怚99j樹jjj9j999jj9jj樹9j怚99j樹jjj9Uϧ~:z1PvFRs rssǏ݃>樹SIjv\Qs555GQs5GQss@AQsPsPs5Ws5Ws555GAAQs\QsPs\Qs555GQs5GAQs5GQsPsPs5G55G5GAAQsPsPs5Ws5Ws555GAAQs\QsPs-:묚5kv裏5G!jާO /pر .iݺuj|M5GQs8ŋ'}O=1c֭[cܼysZZZ޽5G5߶mo}V^O?=.5/ .8s5G5ߵkWtOݺuP;vdddOQs[;w˻w2eJjj{Wj޻wP>@Qs~(_|d3R>wܲ.c{7|b=.++g 9q (5_fWZԪUM % a=5>|x+Ps Nys#§tWS@Uy޽[lyj>jԨs ;x5F׭['}G'Nx\j>=z,_|Y 5G!///c233{5~oԼsI,QsXWWPss\Qs55PsPs@5Ps5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@5PsPs55Լݎ;}1Pv#GTs@+ݽ>PvǏWs@+Iǎ%v@5Ps5G\Qs5GPs5G\Qs5WsPs5G\Qs5Ws@A5Ws@5Ps5GPs5G\Qs5Ws@A5Ws@5Ps5GPs5G\Qs5Ws@A5/իWѣiӦg},X9@l0qݻ'%%7NQsÚ9s_ܠAڵkk.6jԨEjZ8NII֭[xDsυϙ3=55iӦ;v5jݻU_} Gyi\q{߿ss@͡5OW^SO?8S6o|5fϞ]zpw޶mJykÉ-[jyC)((hܸqݏ慅C βg̘4hy؛ '|rߪ9P)))d%zEwu֟'6eeeE.9Puzjlen5εkז~ҥٻwo~CN8V_@|ٶmNVm|֬Ya_׃ؒ/ns:t߻CwYPP53fLjjjaaaaÆ IqUW9QFz*,s}F曼׾._verJ|ݺu[nPf͚5h y$5߳gO޽x]*8(p lJJJ&M~=X/k?5lg <}quرm۶ᰡ7ۿ *Fɼ^wu#F(,, 5_jUdgV r,NNZpaQQQzzzL8sQs7h`޼yin?9Eͻv  hܸO<1{-ZWRsO:uԨQƍ5ky]֭y5y^^_|\PPhѢ˗޽^Ss3+Vʕ+ ===]2|Ν6mڸqcٳ7q/~qg9T暏1"FPkt'o}|ٲeGzͣ{NU@\@\@@\@\@\@@\@\@\@@\@\@\@@\@5WsPs55WsPsPs55WsPs555WsPs55WsPsPZxqR +VPsgggQPP@"(yFm6!k>k֬;5*a(**23gTs akk. Լ~iii 6ٳo@B|ΝFA\|wqǜ9s-Z4xƍ/_\ͩ̊>ݺg{cu+|K<3F-|w5/?NIIi߾.++g\5(̝g{ȳʺ[d׬Y{6m-Ʊ[c/ի۷Ϲ9a3S%#5Ps58ƍ;tPw9֭$Faa_5kYf͟?n;SUVf5J+cJ>L5n۶mڵCě5kv~T怚+99jj9jj9j99jj99jj9j99jj99jj9j99jj99jj9j99jj99jj9jj99jj99jW怚9jjjjj99j怚9jjw}O>/ѬYQF9jG55kV5{nœ'OVsԜٰaÌ]֭{WSjSj{B|,c5GI䚇S ~kާOի/[SNgywW_9jNB|ΝFAּm۶kׯܹs޽{yOoϘ{l2o#s]`+Vyf;vH U֭[e|뭷F <8Yd.++g#*Y<۞lNɚYf$c'3!G^.,, Faϣ>Zv*3~nN\k>a5GQs^:,F 4(Yj9E̓k6--ꫯ9sf߾}U5<99Y͉=233[no>5G@5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@M5PsPs55\Qs55PsPs5GPs5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G@A5Ws@5PsPs55\Qs5Ws@APs5G\Qs55PsPs@5Ps5G*g^YbqQׯ|z5mڴHQsĬYtҸq̖-[4?4bԜn)))\rɔ)SB_y啻ᄏ&Cּ_~aUoڴIQsK/Na}Q|ΝݺuPs}SO>(250aB8F6mS]4oϨ{cu+|cEE4hPw7n8yvիgϞ]VVVGp܂FVmߚj޾}۷o_~~ڵk.X-iѭoN ;x8훜\)S9qzn~]V́y՜*PoN:O79 nᆔ.]<ׯ˻իg2]ͧNN'O@>}zyÆ kժu4hBռ[na 9i+9jjjj999jj9jjG_i>c8c8 ;Q={Zc8c>Qsp pp\}[斍o+11󉣚/]43 a y]dI#+|Iųz=z4m4##rC%)pm / V .iݺuj|M+Iœ7pg}6\K":|ƍx/_FCtOxiٲ|5jѢs뭷cXre+38#vÓN]U9ھ}ahLIq{VN9cm۶Cϥ^ZlUK^yW^ye잙3g+)N{SOMMM=Ӯ 6y.r<1Ocǎ~Y9Ob.w}79==`4OVtgӦM;vl+gffx㍱{^{p^xJ.2 gÆ 7o PnN8!AKD[r1\#, ^)pmt9:N9hgʔ):uW^zzz&Muc4 ȯlذ!|2=P)xp^{>k׆Ymܸ1vO~VZYEyTšϘ1}w@s<+V?_~M4iܸ7\PPivW+?Ok׮}=N980T(qZz/z]y+vH0lذFz?I&k׮aÆC [knݺ>}q'x-~˗/;5kv9;?^a޽w_xWs7G?6SO=!RhѢK.ӧOkSSS;t駟*ꩧqjۆǏ_`/xwt<8!;wi Y۟={_y={;p/ !+[ ]zn[Lu n$JSmۆ3o6zpFbkoFEOC#p螃_)TdÙlt 2$ZO>9w/~)vOV;ժU+'W^y|eU^/8Xo;v=$5a_ׅ1"_֭[5駣ΦÞ{/\p}o8(M@EּϦO8h{-[ԭ[e˖yyyoV46Z g}vUpaȑ#[7|3@aoy_xs8[C|P5g{;7ٳgL<9\W^}9s r> stream x :H<$ endstream endobj 2893 0 obj << /Length 1755 /Filter /FlateDecode >> stream xXo6޿ȗɀMzZ MCkh@K,yz{d+!x<~w<F [_]9(Q둔{(pt}~$wWe/L:9u4OwV/xx4{::fD,)@lq dDZSi<*['ig-JMJZc'![WZ(&_iYZ ^DVT:VTqRqԷ}l<+̺MnAAFjTF4$`OzzCx0]G8Ú!upt|,6>wTi8Koα>ޞ3K&t=z& !qŖ^F曦T4uˬhV elyϯ\M\VjN /d@O 2[D֔mj(=p7COFBz펋"z_@v ҷ,C̀6I fa5s8%(ICQjR1۽? On >riXum*e̍uIZ'"7Zq3u ꮢ{9u;bksK}uݏ A]#lQep 6ؒZ1fqinEN I4cr6Tq7*>9Kud/ـmJQqZʒJ56j [ś&XA7S=u- 9)&t޴?pDBv*e/r;.!(ef j;zCY4⡻U1B@\fmSҼ̋+U"LxA9us`|tM ZP3nlkavL0|6^o0"T8ܘX)i~(W&CڮAzÕ˝G}}V(*#ψ/R-Lp>@c<1G( asD}/Ӫ.ӫ3W/XFR߁L1MN7 ,G:`tS?<*\ Z" -p1A!̗k`\4v̕96_H}up$=R߮Hb~tUPxQ7qƴ$^ϞC{ ^#o」x;2&5Y4< MC)R9OgkK~{ZnzP:Ԭ#> stream xYo9_a<bu? @ӽ]^P3xfv>H=ӦK#QE?;[.7w/^ js$b"\x9jwȑUA@s궧Uݯ/ߥLd1pl{"=bzQ@NM:\O?4DV=udE5jI,W4+I?;K} HBbCE;S9;jA "_]ڴDu I۰ㅟ"={y5HƩwM汬Edɍ܋;Po TU.-hp`"}yYmf΅lqꈨ^kU="a[׽*waMzްd4%˲u|ڡ*oT˄,U\jo.Ή#ˡWB+A%zκU[oYmwTJWsoY_XJpQA+2XoKY )sOVz?ÛS4?X8ۑw~,,c/H-7Uӥ8[zAC_JNJ~c/=F<Ǹ=oje#l,8ojj`䂑V52-xXYSۺeYJŠ ++tS>"Y= ]XPch ku,F[Aq\'ݴjrtnskK;as,o:GFq@ᖮY)qBWٰSm}u!ladκ,\Sb'!p(w4Jeg\QkF/iYKPfWra<|i1 !˶@1w3K~A@AL6f[ş\/Dؾ^Q\+x?s>=+KfȔfB28ԥ\Un%-ICĀ4ftvw9\_6,sАzAP/bošA8}FNpn݂s1IzVdWPx (PU9Ï2w z?#l:'a?ND?b8JD'ƶ1!> 0|\7kk۹ mr2x i330bؙsJ `e:P1Ig1km쒗b7e atI&P!\x/)aAaȠVd&^d925Cڊ" D^iyؼJ.!U.vYpVLrq+Oc~fs]= Œ-l;! @'(4mZ[Lqpca1FޣfPeԼ'|ZHl#;`;9t0 } "(㐆B*HY8E_X-;n9n+_u?!!ta&jiZsUd UpAƏuCn$ Ob\QcN=ޝu~{bYY^8qU/U{92z4a9yy1⾻TƲbm߈5|F+oS|W@3'П!W+FA`MbsٮmDnr(MCwbe f&q|BT>@q| 3ϊ7Cz+8/n*Z jZr`99@ )8~:I>%UVp99#0yRB2BU3!}΅9ȘLo)qta&p~bԧ1(978MĵCW8&B}$IM$Is+If_ `Lr]pK1bCoدU1lS @^6; 6 }l4ڍO~Ib\RlK^Zzxdu+5R1%>Ք in*Zyf(ׄ!OQhبAj[w)̳SyYZf殓]OEر 7+`8'`ޘvw"ƣF4M<އnthW4~#ˮ t"MB+=qHp&/q61n0sLo3H6[x fdA'jy8a<Վ^oi$ 2.c4LkU;t3<:g~6m"S0X^L~ endstream endobj 2909 0 obj << /Length 436 /Filter /FlateDecode >> stream xڍMo0 bia׭i0[P>醈Ѫ(CL_=.G.푹Ӕ槝$?&.SkZcFrMQ ¶,tᔈt'oUټ<0gȹM:{O @CGû=0 yUVeyS /,sttJcҴ!c0G!7}!e9sg Ͽ endstream endobj 2896 0 obj << /Type /XObject /Subtype /Image /Width 701 /Height 465 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2912 0 R /Length 17441 /Filter /FlateDecode >> stream xy\U3Ƞ ]1"NQsD#EMKqr.Dr9"8d8fy5LPKMJ>s8g}sohʔ)666T״ij׮(ϙ\z4/M:ҮRߟr[.&> Ȼ;wnիW ,;PcìYԌkINj?*Tx"y5_+;A9GQb8e0`K.\6m (" /[LUV$--n3))IؤI'J6˕pVY yu7)O>)~?68p੧qttZ/\ۭ[7i˻ᆱk& n_^ǎU$Y_͛Mg7o9J*rܨQu]f̘QV-ggGydcI}˗/޾}ÇN:%@^NZ'm|g-rWgԹgϪs]޲Y 4mUXpa^^ajݺuVVW6ćK5Jz^Ak֬)\ŔWy뭷lٲM6Iwi^:~ڵkKW˖HMM-۶mɋK_v@9t0aBzdHƕM,"F:|ժUӧOT͚5Uԯ__vÑ]BBlJygggn+W 4HfWixPPG}dx{y2yweN[9 jCWݻwŊ4ia˱AIN*U@ZZO !6̞=[>[5kX3fIe7L;w~wyaÆ 5[nzro{w(sرa)VXѸqcyʕ+wċ/( _z%}lKe3JJ=%CKތ̨2׭[w2DCd:6̙3G2vڵ]zLmM|K+ 8PLȖ_ Ӿ\HHܔEιsTɬ8zh~</fRV_Ηx 2ʸ{2H1Ce ㏫PRmk٦K̠v(:ƍ%xS}$-2l]j͐V* oRd'1Lr,s_l0 . 3 O(F6dlmR OJ>׮]-vf2ꇥٗovu~mm}I:tw`%InblVm ^RJR2 WΫm-mFlud;ĕ+W,o+ٳ b:20Tϯ{e G5 OV*6HOJYӊfR;K.VϊꢈBo, bCӦM4.}%!Yv+Z3g7?kӧښ>_&*;S>(du$l럼_~PEͶN'yWj*YGk#*::ZH-֑q+iʹ j>.Ν;$B]bTB\iDbriƍڒxYSrTv M^Ys׮]/OctY(A!ڨPcIr%$4qCl\n.Zl ' ̣_6uBFJo2]HҟlHb/@kS`D] 5oRd1I_S$6̘1CvҤIT[Uy:r\izP} 1l-2c=fxDf;D"5ADP0(;& ~Hb;LP0V&U;""° cUN8Qw%O%Fd~ Rde9^b_hy[!AܔCByK))){ViA6H_~(C~26XOVׯW9Å+ELwW_}UV۳gpWs Sŋe+VwFљؠ 7xp&ٚ^R-;M}3NZ*g%%oҰβeOeTfNõ|2daxxx~Jjyz)AԧfXҟ(Z~!߿_}'{Dlltl,ђsC3fQX ְ !6Vк?Ae"g~[b ZtW9詫qEɓ'>5^u (::p Zj:KWۓVq\6o20%hF'5!m66Ojɱ/ulEZ9߭$E.C" 2*μezN~ fgmogzWkL{2ԵC"9CIE/V(u=S۩ R4iD0"?ICeЇPU\\\Ɔ=SOo=_l0{?,z0;۹s;`ZhgoQ~qFyѣG[stlm/ٚr0k֬*Uhn~ϧ7fMl\tIeSf7Cb񫌐QFɡLlan%)QV2|pcC6V ԕ*rHb-},?}Y l$֜mr)\l7 Ç 7v#H}nݺކG506ȤjpVg-F18MY( X)Iʕk8%>i$ET7\pUy>>|пRep_opWp~[nfÆ ,|A3.׬YֱrHmlШC?Uf~m jr[jU76ncݧؠ\|n EFH/^C,Lm%oh6OeTS`e%<~ dC?P}=QףvAq:SAOKY_F鯿*crʆOU б!!!o)XP*VAdj?jxcׯ_c7b*T /aK6'dZdd8I/t'˱d4඼0G!YFIٽ{wj$_+06W%:U8X^NY9$6~d86lk s~5Urrk~_ lYu W' Գ^Q`_p60BCCm̥nJA7nq,;W/'O.[M^];O(!20d !CTnp.Lwr7m$ĉ޽{ٲeR9thɆ6(DKY_:uK#\{t2d#J(t4}bvM6Q9;kN\[!f?L;_#W@=O?gxc̶]J*ᤄD4i&Q͚5;wxb9NCx9mѢ:.g޼yڏ(:dFr)^ކh eۓH%BBB뿛ov[뇴5gV*R |iR-]}8 O~CH[zhy(ɴk^AXJ*}sWT~t'5j̻X.7-f_ '4nX ~]p!((5f~Ͳ\6iW"ʾ&E9_<r+Ə?XL;N5͜fvXO/(*eK\d6IDu ,rL= x(ox"H.T̓!_s~رcnnn*U3 6xhxX-Z$eg7n)ӦMXa=z _˖-:fy ; (>jԨ!E~)OGٳg```;&Ol򡢥~HB }pamH 0ҵkW|+("RX'A}Gc޽{U=Y/ AWs\l) 4i.)FWt5S^ jt58aAW 60jt5 E.tjv@l](( +J 6. @l`@y%6@y]P^iWvb.( ʫnܸ1bgg\t,be$6k?LKK4h$ aurrr ذyfI3 ņ0R Vlo߾bÇ мyǏK6Xxq~+22RV&6PFbCڵ;v_r+L4iͻw^`AժU܎;Fl`ٹsݻwn]aaa]t%S_I)5k_bC S:tlelCLL%26( a֭%۷RJ^^^=s挫kdd$C ^^^/޹s瞢333𸸸;v̝;߿|'N 6PFb͛7G?0`[[ی u3666((! **Ŷ]h JlJ.( b@l 6@y%6@y]P^iWvb.( +@ 6.@lWbWv@y]h 6++J.( b@y%6@y]P^iWڅ5ի;;;:tt/ӧN:#G4ܻzu}-[h6m^rݻwt5P^ %ZbbӲeN:y%:Ν1b'|ҸqX]{3gη~;i$GGǏ:t|'O=zSNL:(ĆYf/;/// >>>[nm zҥvyC 1}˗mllvMPBegg'''kK߭[7cCj͛ݜ2eJFLxi 'O7n;]v2O:YYYR\drʅرPB?^%2BBB  ׹s-[8vt/@lٳ*T0h 9Mfa[n5lP1o޽{wiӉ ĆbðaêWO?1bݬY ָrJAꂾܾ};((ȴJ)$ Z RL<988XëV?~Xb>}ZjUn]b5ukcCxxxKfΜ)p$ȧ]`p46[IdhhСCyyyÆ 'y'$%%޼yŋtcT M6ɣRSS %TLgggMɘ/// &DEEiI&}?N8۷᭷:uԔ)S$?TP!==-QR۷oo҄P$Q; 33SSjjj=wEl 68SNLjҤbz T``:1kkk!w 0@[Q?.]bE-ZĆj޼y27l`z| w_^@l]vEl@l+b@y%6WElP^i@y]v 6 +"6(.b@ b"6@l@y%6WElP^i@y]v 6 +.bJ +"6( 6.bWb@y]vWElh@l 6 6 +v͟?z!!!2_|Ѹqc''Zj-[LիW_|E???N:[l!6(]R% :u*&&ҥKu~rʍ3oaoo矫6mڹs}eddڵѣTYf/;/// >>ްθq}Q3<ӡCEy۷o["6 Ű]ڒwͰZXXXllvsɒ%˗Wwر_~C mذa\\\nn.P7Ǝۮ];oooSZXyҥ6&sl8hK!!!ԩ?yfyԭ[u:;;8믿NJJXӉ 2Ξ=[B֭[4H i ˗/?ScCڵUz뭷 24W\26QQQݻw7ֲeˑ#Gj7Rjժ]v][lN0 K@ى /_26>|KhD̚5˰Dӧcǎ'jgΝkggy/_~ɘy &LR={uܸqNZ`m]?nӦM>>>qqqrlHII4i͛w-jժnnnǎ3ۮ.: xW+V\=sww#bŊj I Y|y.yK,ߏ'`N}%Zbs^'PqHuxxR'6JS:tc׮J*o!lo# bT=WWHbPFbÖ-[֬Yd zZsǟ)wEGGgff5⒓!/_ĉbĆ@3Ѷr׀ElllPPC@@@TTӧk PEl@l 6 b@l 6 b@l 6(b@  @l @l @l  b@l 6 b@l 6(b@  @l @l @lhb 6 b 6 ʫaÆٳgO Aʕ+ճ1@l!9O3fLݺu'b@lЫU#jazMl 6 zλv˳KOOW SRR AJ*竅V 6]}"?8111000""@lի;;;:ttuօjҤI \]]?@I ۶m[hըQ#Zj:u@lFⴓӲed׈ta#G曇&NxuWZZg}wͳOIIWؠ{cǎvP5kK/-?$((hfz&OL(ѱAﯿ"6dgg۫wr^… %rl߾=--PbC~s΅j׮]\99ʒ9[ Gl 6,ϟ9pdر1{+^|Y[r5WWWGGŋӫٳg?sѨQsJs@l0%~Ǐז_S{HϞ=[n-Qk׮$ 3Ν;ͮ|֭ VV-!!AFee훞bC V=k۶m =[oɽ7ocOl1b;>_|Q= AG}_˲t~p@͛fW^`~}vPP@l(L? lvDI7noC [lO`ѿqd7qtt4>hӦMz%scKfΜ)ub]0k,\\\>3ݶm[zƆΝ;9 6Gf9gggw{1Ʉ]v|O={}}} Si&yTbIJJ}d'OR_0aBTTZgʕ ,?ׯ_Wwɘm' tRzĆٳgqʕ>H6ФILn2j(k$]Yr~~~]`V߾}k]C/ٷo\bbvuёc7b!6,\pВRNYfmڴiذ;((V}]۶m]O?Y;իWoCaz"pI%(t+" FI Zjegg7m4kk.&Wp i׮PXfcCllWwϜ9S]^>l*UݻW'NPcN*b֑#,>(B7o=0 6BσEr=w &""%/^$6xƆ͛77|HHZ}ʚ_]hyAu3'''(((44^bL p f}7W^9sdر{333lRSS{k.b^~e5m߾}ƌ5jԸqbѶm[s{H֭ Y0`~\bŊ...-Zǥؠi2MիWoԨQwUtĆ &ԬY3==]ק>uߒ.b#6ԯ_>ɑؠ=3<Clؠk׮<[[ݻw7n\2b|}}?#p?BldžvڽG>}jժk׮hтA/11qƌǙ3gյ^^^* ]}ƍ 6ddd 6Q_j@l`!6۷Ϛʊ@Y ׮]8wĆ>,CԩSC  6@l'N$6@l{}殮vOUL2.e"6p?bClbbbbb+b"6@l 6@l 6@l 6@l 6@l 6@l 6@l 6 6 6 6 6 6.bbbbbbWbEl@l@lLņ۷GEEծ]\rݺu~.]jc"++@Y ={lݺ… ׮]sN aurrr `8WpM__p 7LlTSmڴWpabĆk׮/_|}}켼"##?NllƆ}:::~fMII4i͛w޽`U;vlº$$$N}%Zbkfcc#yϝ;޽{w6P6L:U2̙3Q:t%6Pvb ӧOJl#6PFb 'O9s522@Y s̑бcQFGGgffqqq;v;wO8Al,Ć֭[~/Z{  gddAAAQQQO"6P|bC1obbbbb+b"6@l 6@l 6@l 6@l 6@l 6@l 6@l 6 6 6 6 6 6.bbbbbbWbEl@l@l@l@lJl@l 6@l 6@l 6@l 6@l 6@l 6Wr! kٳ.88N@l 6 JLLtrrZl٩Sbbb<==/]dvͫW֬Y}7 (5kK/ͮٻwɓ'O: Aڒwt%KN2dž#G<ժUsqq ]bd.Wcb`666Ж;Va7/2~ 9;;׮]{GgJblHKK2dʕ+M6G_ʷnݒ.#!!aݻwwppHOO'6 onڴ￯nP*=55UJ|I`y ޵`L(^PP0"**J~We?_|At~o%HO:uTfMwׯ__d̙2]pH. 5k~:/bz?C0gIIItE) 2}\tirpBIhݻ~ɦMdH*/_~ɘ/// &DEEχ(}"""Oņ!aܹ8tP}ɣ_G-PM4) @vk֬Q {b4h@uaW?ņLy[nT`kk߷66uIHH({{;uIWR) fHqb{{{>(}g,Y"If?2{Iŋom4JSlׯ+W޵h"} -<`ׯ_V0׭[G0hР1c$%%]w Ənfggk?ڣGGG]vf:tHm۶IYxqV蜒.]ڲeK٦mڴYrvlmm322%ǥ+VҢEM DŽ UСCO8Aϔ@.( b@y%6@y]P^iWvb.( +@P^ P^iWv@l] &JlJ.( b@y%6@y]P^iWv@l](( +J 6.P#G|jժxyyX".]jc"++@Y iiiC YriӦ>}Hx-Ć˗!6Pb͛WVBl( (#SN5kִ>LlƆK.-X~…bWddlj 0x`u}dsZJJʤI6o޼{n UVuss;vvuIHH``=)J*ĆLy:tm||5:w{9@9۠'ҥK֬ܡC___be36,YV???be36ʕ+yWWHbe!6 4h̘1IIIiiik׮ݻս!233𸸸;v̝;߿|'N 6PbҥK[lYR%OO6mڬ\RwflllPPu. b@y%6@y]P^iWvb.( +@P^ P^iWv@l(JHH`<t5]MW&6vu҅q`t5] @l]MWՠ)ՠjbb(ՠjذw^i׊+gaaa_ၠjtu1'U={JYlPENl) /_FI"PT+U,C7n1bspppbb]\;vЁ'Ye˖˗Ylwz{ڵ={ tqq{i:~tujjjxxTrmnٲsW_9aÆt Jv<==?ôACu떌jժ ۷o޽Czz:}X]_TT)""gՖ/_Nݿ ҥ˒%KvڵbŊ 8q>,NJJ]zt۷o/+/=~9rD2>JHl޼Yƞ>J 5]y۷oɔK7yW?>Ll߽}% .8::8n,6ɩRJ˖-ҽ#Glݺ5EEF[j }^~}3g2ғE՚/z[SF:ЍУm۶t3f޼yUV͛N?~\ŋMWݻ~ɦMdTzhPz[9s挝ѣR@'Ovppظq#X| gg[ڵkwQ… 2MWvtt:t~]y3IWJo}缮̱*Tzjے1n@l 6~GEE էO>|ƍ{%%Eo͛7kL‰/???>x0]Mlx𽝗mggrJ:~lBOOO9##޻??x ]=qww7f+GDD$ŋdv5 Dƃؚɓ'YYYdQ_|aXzh֭2%۷R@ET7srrBCC"jbÃmY /HfM=|V&le?_v-]'---88f͚?@OEDDnx;w~BD333lRSS{k.ȻZc֬YM~t+믿v:yuI-u䁲ЇE>I6W"Qn޼9b???''' 4;`9ЖXK-qyEYAޏ :YSF Ȼz͚5'5ۻcǎ}@'@L2_-oٳf̙cW{;qչs ƆzƆ5k֘s"`}/lHKK#6xl8rH=<<<ʗ/s]|Y[z;w^n]pp+" ϟVreWWWgӆ :t'(W\͚5իWGUF '''y'|o[!$@77X.]xyy[mܸի.]*+C ]b .h+ܺuKޕ-[>|X>`zO+ 5z񩩩{Lr#gn۶l}Wo>o޼jժUPAD5sLJʕ+*6Xh)26=Z[ KV\mZ(+C k׮ig_[MrBӧO{/o*64jH;`W1zbb5^zM6]ṭ Ç}7eIVVwxչE^Tw6Xh)26l bC&M "WXQ1VLb<3WJ}7fTl8q֭[dƆӧO"rt.\( ' *6l۶M{xJJ,9t6;wmluԩS~-Ե Ǐ]jچ 6ͭ[jԨ nܸq۶mSߤhܸM NNNmڴ駟kN!6~;Q_uww7%IQ 7۷o/__>..gϞO8155uܹ/>c_~ -:u#Gv*ão߾m"h bӦM...UT#ynp >`1kF#.6_W;vw~~~~deCl?<;;{XiW-<(AyլYS[ ʂ{J> stream xA /Rx~~Ӷ endstream endobj 2898 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 312 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2913 0 R /Length 8482 /Filter /FlateDecode >> stream x \MpYJuQ$K(И c!c:!ƚOd4&3!j&ZeRXTn뭻q~sNiι~r>*4<trr_g;w. hVk׮&aÆ &aw3fJ/KKKQ+t...Azb=[,D%%%΢wGYGGQQ)D~￷Cd@011)**jIСCC@;+qԨQ-/l…!H-VZe˖]33DTV?Ex%JGG<%Uʫd>ߞīPVVw谰***b<ZFFF^" $"a $0f. $"ªw7ǥKnܸ2}Ç#@"|||:"Ν;33L;'';d#ٺ:%%'Oz__WWWx8) ڐW^RPPp8ƌ~;2@KJJ 7n" Z' - S~ 򿳱IHHX߼ys'pAZZXѱs3lvUUFΝ;ZZZ"vD<{ikk{- 4ˇ&uuuZ=tŠxɡO8O#,,l#H.>>72֭[k.:?Çg8 YPPФIҪxٳxϟ?WPPx%XrĄ2%>|haa 8țnݺx)s ?ģӧO<==Ex@>1**S|˗/ h|X}G~~~ݟOo߾IIISHwwwLO^SS2͛z 20onox|mmFYutt%|>f޼>}ɓY"]zUf4X ܹs=;/Dd0ږd{"ߚ]ZZFS8,,|;:oZCC\"UUU)++A\b}}tvv)Ӗ)UUBX~W&Lw&LX˗/sV^ݹ|լY+SYaÆkbx}HY,DX/޽755ѣ-.q<>eTbŊ֭. dψ;6..#ljlذaҥ>jPg̘z R !''W|SSSpQYYD^>zll%6 W^#DDD#@nʊX12^>>>6gϟ??((`֨؜>}K UۇΚ5 mı344$߀ycii) Q &p8=z(}bif4b5550 q+ypܹqdug444>|jh/FdL=z4y7aDWvB5@{ҥ+Y'''d<8}t櫪 aկ_?  jjjx(0:JKKwchhU պϟ?G5?8l0D0ԠARRRнc~~~,`}XX!oj^Y9diiF8qɓVrjjj211)//G5׮]ω Vmm D`llfnΜ93m4ThՖaaa 7lp!@}vצNjMŪñ!t={yյkײ2>|˟F%YIKgCC2ՍYYY( ߟjDt>ȑTZeƌTU@8o<׬Y;`ffF5LBBR ;wRG첰\BKhjjRms- 99:uu&Z̕PpA+\ZŋTl:n|e=~{.Gh`ۗ괸8v`8sL/_ cǏGA{8;;St!$V˖- al*@`aaA5UTT $"$$+H$*++7s,ΝU||<V+ݻE|k8@;IAAʫ $ &%%Q ' Bp\3&g&N=<ͦĉ( t RͶdDjgƍ377Zرch9haXHYccx kX`kkK^ )xⅪ*~=xb]]]@i)))Tjkk755᭭cUzA^(RR}hii&7D(jhhP}>Ί GVf2p@iHwww!n݊&L@Ɔ PC[2jpw*4+zC4ƍhN9wICBhO%%%H-9\iiiT3Ԡnn޼Iu*۽kۤNNNǍt1V[[Bݬ tvYJ:FF2*EןxլAWVV"drsrO$&Z~Z{cqwU5Q+ +/7@ z¿ŔDž=ÆTLjѢETXZ aoŋ6RIE|\$J&Q!J+]3N&h23۶meF0Qa /,Τo[o"tXd96++ wUWW'ب _TTךq_Jh5&)9_#tr{hL ȰRTTAM>px`h)**IEm#J<[I'h2p0x 0<_/6~Kk3t)))־d(0R糧_uJPD^h\ݹsGSS$j׮]( 0Ņ c9bP;=!1d^g`7k0Z>}n޼I WVVCqؗ:ϊ|sb!yir(L;+ ]xͯ BE^ПĜfo +*rO3s-[ѣ7^]'y=b%k Qg>2REU᠟*((A;/""C LwOo޻o~ VZY__Nfa`RRy-[l۶  LmBddE^Əc; RUUђ$ˆ AQPP(++k_:77feP^^^/FFFN:njj* ۹/"vZ@⇁,KO?!@8?~R099#%%Rla5}ǏwRXݑ|>" VŋEy] uBCC'L@dff{)_۷Vp8ZZZ^kJdcc@ sAEE^Td"-@lrܹ# ;2-1 qԹۛ﫪 ljǎ 󮮮8*յk׆N ʕ+Y,rrri̙g! /^p7nܸD o߾M= yrfAA @wVI|%%j3//0_ "Ǐ0^rÞ"ڿM>#F;VVV̚۷o_f " @ªROOYq3gYrWMMM]veM;t @Ê߻w355-**Bd`G_]:HAAQİjXy{{^Z$/ܾ}[__pI ,"I&addLffA+yE֪U6l؀={,~A3dbFkiiq\l6Ɉ,e4ٞGAAyܰruu%,555r e{{gϢh媨|>Sa>mڴD@rUUjTB{LA5](.kddT\\jtVX 2$22R~tӞr[nݺz ~XGE5ZPȑ#ޘz 3gΌ5 u8̘tmdT@ ;b}}}T=56mnj ={|%Z{T6|>_[[ۨFx<"tjH%%%FFFDp 5k֬Z -,qHHp N(EG,ϟ3f  o AjSqqrCCªC#)44@&.]55FD effD@fwbIGmmm݉GTax14hjjա-۷oܸՐ$\Ybbb0e:k twwGu BT#o;<f:DɓcccQ <@X$nݺj9;333Q ZQSS#p"@JիWc-Oݻ 51<<n #GAߞ={PxwE5*EY@:[d -YRSSӧX ۶mu"Z:te``@[jj*-l>K5Orr2;輪?--777moߎHKKOOO'P=Cޏ aRIޱ ?{'~.$;;::eݜ0aՊwFY2CzQYY@'F-ՐejjjT{\reɪ*k8dee,@7| Y/_$D,x? @Ч9ܹ#~4yŋݻGΧ~JԩSV@:rբWKJJ.]\SSZ҈15eglT'XYY!֯_O5Yon>ǺsۤFd~hn5R?PtJ#y%,uMb(y͵#{[Ƨǵz֢b e0ۡkwO*x|oj:xf/4,d''~b| D_ךϮ?m>kȬ+W`΋occ#qpL<G]7cr8bt)'>ly">4p W@g[n%zyTWϤ:H); s:2rŧ%?Vn9@2!Cр|~n6RM 3ODK|Z| :EcE^ (џ{ːj(SVV@ŗȫ|J/N\Q)bh<%o}el֭[Lf:yD )!!cj") wpRzh#,cǦ>[^ُOɏ$w(Ӆ [,[sF ,u#ש/( w@јeY5ߥ<y?D +Օ[==|Pq96/kl;8k͵?_Ȩ6I&>.k_o><+rg:uH*aNEꮨK/y>㨴(j+cP1߹\.6 Z{"i_hhg;zmNRy9"R?Tg3*''8IIIxCOؑC޽{_zN-}G'C~?o.*!&|Bf/SK|A8NOeu|?N^8R`/bilF-ٕV9*>jh^| XE!c=`G7hfh戤~6#ΝClP+rYYG <`8롣[__7|=fc3f褉^fQ@# )x2 endstream endobj 2913 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 312 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 265 /Filter /FlateDecode >> stream x1 g /$i endstream endobj 2923 0 obj << /Length 1340 /Filter /FlateDecode >> stream xڥWێ6}W~#.Eyj~K+qmg#ږ$(1p̙3(Qn]r? xGK#($( 4[\4vB g~՟ ߻h,YIy K2lmYBLeVҌa41X3m.^ҡC5֟6_x37-@pGHŒ$w~eYn%,"&,8M AC.uq&tz!edu_#4߂bgN0(M!;8ڢOB. *!<.J]!r`u[-|Жu<9DYYS U~B.ah\. Y8wDeeHz6$*9$QYHͨ=/%+³;y’\"JT VCY-0StugH8-tƙw [穓H/p@j<.coZ$h$b=9B`ڲ:-Ѫv:W-wzrGfƞZV[b/RMz: פ#hY5 MFbаNqN3-:džmy pgFBuO.4$v:\q[017oj.>LAR^4}W)gڶOcb5m-q"G97SbWmI/{Gܫ?]?Aj׏KSqUb4vz:4mhZ 'Ht9BgG:w endstream endobj 2914 0 obj << /Type /XObject /Subtype /Image /Width 432 /Height 368 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 13254 /Filter /FlateDecode >> stream x 8}6~QYk"BH$I(E%I6))*H*TouET*BҪ-d}?ڒ[\93̜k?muuuIII[no`Թݣ+++ǎ0PZZFn"-n?bc dii)1c5Fi:`O>E\K\662dnvхbbb2akބmB tD,]<.}Hv#:`%t!Ňb§w2viQӪI$;XƮݻslT5_.>`P_N~|:SĤ5šg#@`wl:{YSfِV$E’ iUUUX//_Xldd:| #.)[d,Ǐ{f6a0:jc rf9lڇKn#>~ˏ҇:+7dZZ2֠;_atZ@Y wȡхjjj!}۴҇W)"+8o5WM7Hnl{'_۟R>|lٲUSw/p[h SYY9Z}̼nm,íDsrr>>XFyyyfffnnnUUҀߒ %%U]]([{ѲNJspp #Go扳B۩?9@7GcS!aQ[mǮ?M?~g[/ϟ ~ԩSZZZZ/pUiK^1cRLL,%%Q@3~AC[jBQ;Ui2η ammDuO ,fAtкEN5ۇ[TԵ$:E:RPDIއ4ۇr% UizY6NZGe22Q)q ~Ӯ;v'k}F:6[֮] <==ϟt&m?o-d[汇{YMbǎ~˗/yyyfրƯU  toRjړM{rh#kkkT:^ϨQm @InwAx}'%%;}]F0ajL4aW"_ͳ'$MΑYBۍ?ԩSd}߬W?PK CzvϟWUUE@eEEE78>4t:R]]-%%oԼ_6a\f͊MCJJJ. %wzSR^J12B5;;A;|򅏏Ǐ(.==]wxhxÃ,V .Y YAc.bcc )$"Ob/)͍& Q@72i$##FΝ#(W\7н,Zه:Jmm_nt I7"@v1crbÆ >3gT\\,((a[ d6JѰ t 'Odȑ#t8#G  .0pС:\xxb]]q%%%tZYY۷o# 3P@@~SSSsf#x : !NNN...,??a~@4Qeg>B&߿9ܹs"## ͛7o₃I%"H*((VD@e7޼ 39]vm„ Roݻ7j( 9e=yDAA9@' C~~bD (+77o^NsmYYZDTRRs)**^rQ5lll:Ǒ#G Pׯ_tr:(?|Ӹ:88  ii/^ 4ق(HYYÇ:ٮ]P͸q㢣t8)))xT3ydOUUw<3f d:::(:Yyy9xXdΝ;t>{{{yf/''2ضm+r.aaa}vGFf]"!!AJJQYZZ"*jjjϟG@!!!&&&ʩSƏ """tJqqD].66VCC9@𰶶F=z " Z^B%󽽽 ɉ`eggt.::z֬Y}aIII}}իW:u*%%AA'+**"O:GAAΝ;eeeٚPQQpƍO>x`RÆ ;wsrriUUU䮈bO/̙C|Z_{|||PPВ%KƍO''G&%%!Xp}-))A'|oС-`~lmm=zឞd)''Gm۶KI"ph4Zvv6rusqqԄ~.&`gg'#YCjjj::::td[~ׯt+))Td:77ƍ;v찴$eK 255 MKK #wݤ$Rbb… IݵԄ d鱗ӧO^fϨQi t#qqqڇTQQi999ɂݻ]޾}FMM744tss yEUUnNWWڵk~WrrExyy[jB99]vQթu댌;bĈܹ3***??jsyyիWW̜e;iyV7nLHH ;1N),DDD>}XXXt|:6 ~̘1ꅅ\\\N8ɓ.yhٮCV{c*#_r#GܿGf$rÇc6jH]/^ܼy zEEٳgo߾LUcYKL6 K?M7qjc4RpM۽8::ٳ9@[ԄE ;;{ŭ[X~j+--%tKjii _˗/'DrO_.Ho m [lF%n%SFfOOO!$IIÇ7pBrSO^'GDDx{{g ++;s-[\|,/cǎm_z%z275ە);i&www-͌d}bbb˻`:B&xW\`0Hnd #O"wazNO8qŊ͖XΛ7[}7S^J02&N~SJASd5p@EE}!v˻y&yYYYECNNܜ,\{L$BFMHJoM\<$d䆍ў23: sBϟ?#v8x N n233# w2(df {4]ڮF;[-Eyi9o3g̜99@AAݻ~L:iKûp+Eqք}YȡǪ={6Y?cccqNp=dXnڇdش]N$J^|+Hqۃ G8c#kB___o;jz9Tٵ(ME+}^ޅ{w_8TOs=KKK 9sfTTEAΝS޴'><{'>Nիι/^\RRr˖-m|OPy.^Aͮe&hn*->ۡ 9$;;;>>>##;z}lDv: CX'Ej7vvvJKKTUU%$$<<TQizg`i߿SNijj2 WW״4dTUU|޽{W\9~8Y­_~ɒ%g9rAHиİaôOnkkzjooCE qǽ^z̸}vWWW`3f̘0a2i6RSdUSS#gaaxb҇;v]Җ;x»wx=]yverrrXjkkjdd$s\uvvne\И:uj7o޼o߾3gΐiÇo߾-,,̑ه] -((h:řɷn:w\\\lllLLLȐYmW7lWGp\q Ȋهd@CV5d`<}M͛ghh8f999Qo!=ʸ:i$渺k.ŋvTsNf***kt;ddh ;\rpbkn >ܸqc ϟ\\\pn$11QFFFWW-)..8~xOOsݺu+)))##F:n8f\6m} EO>MY))#Fb9sѣG/]?mvZf<eggO0ACC#33itpfVWW# e06lCO(,,lǏ# *--%1G3pj,,,zc…>3g;vhcǎ!NCIII@zzzG~o޼i+ld._,,,VUU4:M]]iB/^ .TVV@\ruеRRR̾~4Lrr2rIm4H͟?9t|}}}557o * 277G,""BDDϟH"^|sutKJHHDEE! JBŋJJJ&&&H /G۷F5yzz.[ 99d1|W^! *T7n9;;WTT +++;XI 2DŨQR@JMM%2?4th}ᥓn'44tҤI+,,411QRRz9rssyyy{h K#KZZɓ'}~*""4;KK vx捚~^^`8 @;9rF޽/gϞIII!СC&SSSϟ("66VRR i}}s!UUU _|i[:99!V{nѺX[ttȑ#@K?NvQ[[4X[iii߾}ɟb !Ck=۷@CwޕjGYl֭[@j4zsM<9H"~W p:dϞ=Cc}rH3gL4ؿr[n:{,Ҁz?&Ϗz>7NSS3++ i@gI^^O>! !Ν;G7oFЈ gd zҀfmڴ9KErrGddd̙SRRX%7oTWWGzn߾ݿ666AN:Luo߾8%*777vvv177G,***qqqXCZZڨQ_~iɒ%X@pp0//o2?K|Ƌ { [?988#^%!FPPr.WSSiE]ˬ?MtÙCbcc5S$ w^kkk]n\K1O4ۄ ;9x^nn.ѣGώ! o E\_%ψ YфńOgdRb^ |!''cdEGG%74]*/H,@cp:3 @@ׯwqqA%jjjht!l6'nlx͉/^DЁ"##544t((5K†}^ӧ/ސ؆Wpf!2TTTUQQ(;vLdNK}8rK@fGkEU6ߙhu MdKIIݻ:ʖpTs)3duE>$ cY&009@ۿ4 ۶2C3?/>6|2uIccc˚6Bt^+l>p~i:Vzz˗/o҇h+6ŒKvލ Éy9@5+(> Go1IiͱKII7cƌ`ڵkJ* -۲ ~&3 ~~~ bW.%^oхRSS DNNm)Rd9jzaVKthBbGikk_r9@W铎^dxiQM8 ֮]kݸqcQ~ jZƳh a÷o)--ED """45nP={ĉ! t_rssQ :4>>9ܹ9?~|۷ }LMMO8|}}w***}(455^֬Yn: +++\bb"rCG533CbbbNgdd iӦ>}9l߾9ܽ{wذaQ3&229lذ9\xqĉ ??Q$''## sss#ZAA,D`hh_!//K"PVVwD0jԨ(i&:i$ @w[SSS[[4ÇN/ ӯwr W>~PYQQY6LCCY:tHXDtŇw.'Z/56{d@Mwa2is+8x)t`ۍW 62EbccӇY111wL5=ٔ4^Kev. HGnm۶!QYM#:eXyLꂂD@5Vb)SoMqQ~޻Pأ/}BϑI2ݨ\ڮ72ېoj5Y6N;|}q f>;kzzGnܸm۶+W1667n饾}KHHhȐ!cƌ!Mnii|M6:uիW_~窪`͚5>>> 9&&-ien1y끦/=& '~*c&\owp g!)gWÙҥK㪌L)..4~xOOsݺu+)))##:={LDLw._J ^n;f^@ ˩wm˸JZ~\%*渪h\8p s\uppWjNNN=|z,GlBXPȑ#}HfqА937oָ} U<00k".. 49jkkJĄwޔZ? @򒖖VPP'1}>>>-fΜIݣz)cccd |}}eddvt:t'g#tE@W'kB>v?Ypp0nJh{YYY>uV= nP]STT8pקOO(''[.!!adAhbbr59tee%Waa!nbh]III``J7oޜz?vXXnkhIrrE ՝]8?sNǥGQSS߰aCVVduuu111}MJJZxŋ$׷o߸q` 9^vYdE[/~e׮]C ak@@@=0UJhZWTT꺆_@kҴUwy$n<>x6Bۏ?Ғ'l|}}q={6@jy˺?M'_,lW 1oݺߟZ@F[[[~Ѥu'N055 it!'m†Q4!ƅ ֤ZjB%%}҄qOO>Kl eo.' H (++Tdd>G۷,[-qo{>pc^0/@KM(//G&hdӏ?(¢7^6CQ9h̍yQlFL9sbccqf!rsw_റٹZf'yxPFF<ػ:S||СCe)()Ў> K.effa[TTTpssT[[ۻw~ԇZ3V{߶^ht!aўsuijjFDD  37OV+L5f/Z G=eڵJJJJ2/mdvW\F/,}}/@VȰ *++NR.X"Q˼҃dOHH@t)fV-a= ?f^y w-\9PPII CXt6Y~HFgv1cr]vPV2ˬ7xRDo޼ETSSo0eMlzM[n0?~ vS󘱚S>-j o.7t"Nz> stream xTW`R{&hKF JA)JA@R 4"H2iqwߙQY{M{Cȷd=}&GQI[cǫ<}m _Җ\YEu᏿wxlpGϚt;Κ37!!A;ŋ .xRdq:/y}Rsr:wvvF\bݤojݦAc&N1vR~[Q`"xKmUZUK;v>mmР|CGhST u3wzN8)33Y4Lbb"8]~mW,6~qtN74SRnrS{,0|w舷@̜=gޣ>YnᏜBpٯ` VVQ=)
 r 77֭gdAv[QYEvU*A_D Oko+!]61裚a*>nS4s#s|3!0cTTۧ#F)sB8_}0մc:u힘 V]6ǭt6sI>-_PR1}|A~[!,Z߭@xif*b RWtΝ;1k<bv4ܼ߬O]]Hy1};i ~tsd;^Ob߰HǮ=_ oDR2u z>nL]mr/1[gDn:mzQ?yAE% o,++C\0]vuۡzZd7#G`|>_SSs˖-FAG~&Ϟd儩sRI?޽{A[2kT|>h ZݚUedۓ'O̦LޱSO>䳦Mt>{>;ӤIQ&.?B$IZ&~VRtcx͛7׳ |@yyDAG$oF,;vL>8-b <~XGGGRq d@a!i߾'ND$o&;;СCޭW~~ =}i(+#=z&*mұ:Q%cƐٳɖ- б:C bLHpt)v n%W#yzz"qyyDY`"*-- ȢE5BCC]]]ȅBҮ@u*//700MKA)S@œȑRҭ F Gd_ wN&FAݸq}|IIB$?xQ<:|2};LaȈl9~xrr2u;?XY`[YY!w'eaa@ED&%HLL477gpp¢E<ɓ'pC|Dedd=zT:s6m"!hΜ9 O)ڢiҮO+W".w +O ȋSN"w+%%G^WpZW]| զ/1r]޽+3,OKK311f`TAAA66%KHxSNDR>?iŗ?;wڽY:wY7>ߓ ؛ HdQaa---좢ɻry?*MW,IGO44<"((mBRD'9Nv:͘5)c++5>}3g4]~XO71++tٳg%%%-\mWš~vShZNkY]O:I3?kPj>TW\ %]'O9F0 ~ai߸qyhh(v????{,]:uرc&&&t][:~̌>ښ>ܹszyyt}N>O~Z}teAWteQTTDW)~kwں.kҤ Z:mroF;o+7Ƽv@r[h-:[d i҄|1QS#Ǐ,ڙusx;UL 2-gi]ҦM[8-sZiӒUO >- +:+j+ɦ]q?ҕ} ]U y誇>'秫$~S߿O_Ivv6}U/^Pw&C_]pQ,--˰/pEBBBkn۩s:Y1M5?nYzN:W5{J{gQ.]v5|IrrHZy__JN$EvO?ŋԩdHGvbO>aysҺ5B~Xr(@СիWia9iiZϧE܏XڟKix<ڱl]\\h^FFF:T_'juŞ(Zt+F6 J6-#,njPR٭Z5ѧs&=j_d9&'dCB{9rhj;Ⱥudrv*)S_H׮l9WT{WӾ}/MmOHH` -If&{C%qf^)vGܿwևtlkk[O|*/`/"55,*DEFFJDѵC}ڵ=zCM5qi̧}VXXXMV̵WyV?-Z\R]mU&UB6$}rږ $*OOOr,ۨzzd>u+۴oi ܧؑiOҖ֍ ~,`adN6<}*<|-v޷߂yFtPkKtuo "޽{tة]O:uvK b_fM߁kf[\{AnZ͛yٜE%dA:Zޖ6]~WԦ>화6[p0&αghX92o<كJJֻd˙Nihl9{{ba/dR2c?woҮiْ}O?e˹gO@dJvÇ 9uOG^%" 2Gj%Yյ J1?4233y<~==sرO"7]*9dPիW> @rIr`mUll0:ƽG?cj3YӦ5_Ț8}A=0-Zvت=7mgiՊlHVf˙d`i!WZYEZ_cǒiGYC6mb˙ֻ)a˙mbrv/=/s veJW5_|6v=}N۞v>!>JmnV;M]QYf/X:wOj%l2lx<|ҟM4qQkhzz7-' r$wر:.թ@֮%Iu@w/P822Kbb0;xRu۪e~^Y}չvԭWHÖc5pmlծz}Ƃ((}QOak6`ɇ%kȟSt- 8ㅎ;((i=zɦxE%sR.]l999Jm<1ґ3*E觍oT}===t'3qMQQN>})%K}{Ke!9$$$!l׾׻G<Xا_*44G~^yJRs={VZn @ڷg2 G򪸸===td ?mm&XAs=k{6h~3n-^) p~]nkB|<9p=]EחGa»w;wNGGٙp"'-/{{\5^mҐ_M:}<<.:涴4vɑ#ن_׊--- }}}>|Lmٻwaj;wi.ݺ{ 4Ȉuk3ggйv{dtqc=bbblmmuuu===p?Ȭg=3scɓ]eg#H&qttz0/^+m٣L=\VVV[ Za!{%ْcccF,44 8ʲeMζ9ƍsy{{cb.༒v+kZVJ _>L\ؔoov1%%2l; ٽ{`sH3Y@?^RW\A ]RAAA2IpEpIPP=<<ȻP;|I;::";ȔHI;88 y%)v bbb ϟ?@"##9pӧQ\bccT3=..9pƹsP\TQQQ3P\Ñ#@pIPPPpp0rRS3|>cg$**9pݑgĠ$..9pg$&&$999pmllg$##9pFff&Krrr͑9pF^^K ]WW9pFqq1K<T욚3Ap -v:nG(vM%%%K^PP8%KŞ8%>D\* OFpMJJ rR'''#pttLJJB\*8ΝCp [7g]đ|bw=' 8C{!{U+rNG"{\5rN'DOZ"{!rN<;SG (*F QV*܊-vA9rNV'%/w`S 9pXF)v CQ&rN2aSwΜIN@)vS;gķ"w5b.#{O8C|5Pp9pدxn;&r?Sq"gb/tBژ"{} Cby,<SyB#-b/|!ݍT 1ph4IpNRZSz{g3Lb7gg!Ic&>rNۘ1 ;xJ|79pqlrN{G!;M|-9p؃x3ġK>;vYsC)0#r&#M|Gx8&"y'4hnXp)L_R⻷b(vb(vS~-;q)өq);ϭq)=Чq)Tb b ,vS ~fe[E r_ +L;&9؍{}I /쇕Ůȷb0@G]px8 @nLF(OxXphB<ٛzcoSxD)a=Ef2c{@w7|=ᕗS7J|ti ( `'+0/r_ d'R ŋxn:E.vy~-B:W Osŷo.[y gr #Fyh02W. mv Oovy dZIB}eAB|Q|yYY(DΟ#s!:Jpw0y#} ĉqK>B3au[9}6G`ޘIN{;u4Dő|Z yRL 8 -ϰ v|XtIO#"ۮ%$EJ=5Ϯz*{zY(y8 iaa6GXq @c"2SD>BK#vp`y ;oG`=}?y&/8{9-s C%o&~A˅G`#23pUI- {~Y?={1~GQq  |^ {i{i?80y9`_QEKMX̳ _oZ*r#Q\-92~ZGuz{?\v,ͬ%G`]FG`O,e^!_Ic9#=vX68@ꅽ?~oti|y9£9cY5c"rfŝtiO>cS077 >22JPΤ$}iߗ?͕EKePI1 ^nD"C#*&Ln`{&07nِ.,WPTڽgOII >C22e^Kyv_}b:Pf{ףk.DTK^r4[?IpLUco׾Ama$mӏïЭ7Rb;z7ӧXXž|ݎ d o1nkO*X<\K`uzOMK{JMu9{ r:/1{?hno$ڸb0cѶVK˖@Uׯ_إwӚ׳=jrr2X|Jphwj[LCΤ% O *+ݼX]{IV,5>yAmd \5qdujoTlѲuǮ=gm}fuC KF|%ՙ fz"?Ot]{bBo㯭[հ]1{:,X'Ph/[iݒ\ٱUwȴn2O}c}Wj'` !ڽ,څކɂV7 ?>_kcz>~4s+v%&+wLbo#..[> +jӼ!p/v/],Û4ir-binu촊<7qB\L(S<6z}3MCE%eL\5{.z09p- 9cpKe e1?HS1"W{L]9rN?!;DBV"a;q|@k.Lbq+LbO]Y옘@1%.@ r_yŮȽҪŎ8_~]=gyZ۫ߘ1Ǐ2Z?aP(DD"==} {ݩo_ƲwYz>߀ @mAɂw X.1{*UqttDb,%%ֵ*r'FYE5 &H67+#@"Ez2qk[#дKկ.y? =Է3>xf[QT,UܶȔN]׺쐙0u+2)[հb߸k!C{6'XUR󜙃n3fF2eMү{> stream x}N0EY&?؁@U,"H4] MHwB  =YYxS` 2E* gIj~ -P3C8)<d 2g,Z+`VKXv.#B Ho^u;vRM1&R"4vUcմ nQj>|7Feܤ_שwFt\\U`am̑ĊpD/gI9\QА!]k~}떤YG#Z]WzEZwUH/<= |Ha1KvkK{ endstream endobj 2918 0 obj << /Type /XObject /Subtype /Image /Width 519 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2932 0 R /Length 46070 /Filter /FlateDecode >> stream x]uX})iET@@TA lN@l AEQ,TlT@z~<.+*0sܙ `0 `0 `0 `0 `0 #Hwwfdm) sll… Nx└3gN2%88Ր0{)r̝;ɓ|}vf͚g8ޯ]"544ttiӦl۶ wŋ ?~}=={\lt7n`*U@+ ^z 4"sŊހ%8Rݻw~0ݻw߇)Rdՠ!!O@ Qo`0D񣓓ӀH)XXX W_|KTE jݺu.]H)vEbbbXTTTBrJ"jhbR`0 &L177ׯ8qCCCLMMjy988/^ " *:tgwkccժU+˕+ȢDnݺT`I.\Xd e˖);wn*U޽{ץKzjrr޽{hR]?PHgϞ IbGR\&~,4BpE/\˗/"3g A::: %KRu5f̘YfAGŽ;.`0 &MT_auʕ+یBbb"H!..Nh555~:Q&uԙ6m.ϟA iI< YHJJ޽-[ߏ]]]}͚5ګW>x`PPzTVÜ9sN<qFss6m`ժU/ԬYS&ф|xƒ%K.)vڭ_vڭ[c0߁/^̜9e˖C>}4 .]e@ߢE 95kZ8 HA__ܹs޽8p hHǏ //SN)\b„ [n1 ƟA\PhQ C QV N`0?>|_PWtCcǎ%FSѩAC]Q$ * ̙3U?}6mx~޽-[DDD\xQ["##U̶l޼yӦM۶m;~8ƍ^V;x ;ϝ;P;_o>6 Oϟ?7򥍍͵kTҥK۷o?f[[ 6z۴i1i$e?yĤwސ'Cauڕ͞=;O>>iĥ-/ZfLbnn.ܹgϞzzzNi…!%ZZZwܑɇETZ1\Qgǎ+MuH Ғ-`0~ᮮ2-HC#FpvvBI-[Dh]hh(HǏTDCWD{9r$(OL )xI.\XLLL:u*U.{'L cccդqQre[fMD۷?~ذa͚5[ '99=v옙٭[=z{Y߮]; pgΜaR`0LD׮]5jZ,<~ĉaaa X /_M *uSN]r@SSSCC."?mԮ]aÆTHnϝ;w8I`02 /_F|~R8r ߼ya۷Hk Fw^xΝ;W^ԩ2|])۶m!KSyyyL pss .# ۷o޽ ]R5k(tys7lrԫWY~С6l{KP ̤`0ۇ.U Hnݺ[ׯ_A&o> )esӥ ggڵk֭[UP[Æ iH2Rȓ'OTTTG$ ./ ,Y2...K,AFZj-_<|pww_vݻw)))>>>島655%"044hܸ1ݻw'@u6i׷z D 6ƌC|!H2eJ~T Y9Rl6w wG:|H?|XfͩS:t*n#KL ?~*1VZ,11W^&&&;v␎AFIh,3 #KǏ7n/|'N2dHѢE<==߼ysKKKsss39@UVg`0 3fHG\vm 4(Qѣ߿P~4`08)|9zgA4РJ*˖-{~FZ`ɉnR?~x億 .͛7E7~XK^J'\x155U޽{t p;wWPL QtN:ϟ̛7,`dd8k,Aў`0㝜6m]dɐt#$ACCQFڵ&M"^@6m nҤ MG} !/\0@DammmmԦm۶-[6hv܉ooopB???\tΝ;^ #] 4_| SWWOl]]]PutR|h6ڵk_l!:@RfAƈ۷o!JcL>5@s>DFFb/]СCƸPDѣqà*KP#GF*H!55zjBh(iffֿ~ru͚5y4HZj ERAԩSZZZbqϞ= #@ٮ];ʕ+ݻ7 R011A}vyJ@ գbǏG^j{aeqܹs6nݺAh 0wYJaPG`0,`mm=g󮮮4P`hhнiӦ&MԪU,Y7UV-VP>}ڷooߖ-[vTRxݻw7Sj Hnݺ k%3 C-~zھw'Sh>ETT,Xv֭ .8;;h"SSӐ_tXB7}Fق`02sssDcFRsׯ_W\)7yxx}SK.0}C˖-===[n)t'ΈL_܏n6mh'3`dC-RϷh"w)Ā _&|uKKKR@S9Ž; {=,0µk Lf͚ESX3#0 FƁ@+++33͛?y$X .ptt466622ʓ'OڵO~/]`0~޽{H2>%%aÆbtbDDի 7AE^:2`aaѼys ?Q'7oLob0 f77|;v hT= /P" .,X`~Sjgܕ+WҀ;fkxݻ  (!V#A|/Ε+B!ԋ,Yya 7nԯ_Ύ$4  F8r3`neeլY3(6664[ #P˗/kժ;wÇ?a== .Sb0 2 0 55u񶶶4 i@]vptt1c3BW &Lw/)U,NTS6Cddg\T)rʭ]>y{e˖~''Ǐ+%K9s&߸q#B oӦǏ(@hѢŋ_Z>fǎ$N8*H!ݙ ߊO^t˗^ڵkW>|Ç֭[0޽{o޼y4t+bԩ?F={Z۶mCHSSSmmm(HJJյ^h*::NZ uʕõk׌)? C(t ۷EIe-H Yf[LMM_.HAѣG!C-[֩Sg wRpuuHgR@(HAL`0rlڴۻo߾}||J(aiiϟ+;@;wޱc͛۶mۨQ#/%ggcT JD]]Tl޽E á-[ R #AaD3f i|-X)1 4A jjj^ztD-Ÿ'ÇC޽K FΉ߿/_<@[[ZoiӦ o58*URhԨѧOVZP]!9lmmMLLssƿ)pm/^1ڣF:tݕ^zcǎA0 . QKڡXllGH5}ۻq#Q>\yIԃ$) M+}/_8QԉtĉŚzꨨ('L}g֭SSS?'Oɓ'+2ٳwƍh|(S iEA7SNRʓ'O^ eso eV <@LY_޽K,9~ϟ?2wߠAڵk8ժUe"S?_(VRlweг111ؿj*ϛ7/e8@bb"тAnڴ wܑ^ n8#CAQLBٳs7@8$R_"5UCꊑ1΅ ZTt1ipiU,Ë//)O^6m֮]߷o"!OHHx𡙙ru:4i$XТE hѣG+\,wONވ`L$HO"D.m)E12 0N:ٳf͚nnn7o~(S9FtEa///GGGdx۶mD'N^+=͚5C#G:t۷!i/Hy~f{#D9 ٳgt^(xBǎ7n@Up-[ c&Rz,(ڤbŊՂ&'l#~ٻw 8H֭QaӦM.\JKP;d2e)#@#/^XY q |=R@mtCBB qdyHpbŊQٳp ---MMMTBjնn*ԭ[,aaa0HЁLޙTRBGo߾T lԭ[~]dɈ# )طo}&RFVp-8 C RB}PUxxx@ Æ Ged Іr9*,mرb  R8pB+W. qhr ίZɓ' ԓ>~BN=N03gMw@GfI;Q9⻤NHax&HpŻw R yRpaDHaʕlNży󼼼*W0+b,ٿ7&L`llܹsg8|ŋǏb:t077i/ $ ԕ}͛7 5(;iCd]vp X/}7o\pF' Ĵ-iI鐋Kƍ}m))Pƍˇ\H\<͉HHHB|7=;v ZxŊHfϟ})t&###kkkjǡGGbbb`Be#؉lɓPP ??>}˾!e5NG0FB\=111۷G.U!DtISΟ?wM`iiI#L]tժUQFJ /_N|Dy{Æ EI&m>9'O^GAAC(!CR L__իW544] >zVLc aQfie˖*U?;Fzhv9? χDR¢!yĉ8}b>[[[PB ƌS~}j,# \u.@ NBJ#9::"*[,DD6m}}}kԨaffF}SNIEV5k/1P__?KuxtKހ̃G///m1_YUXFQV(w4bd:?nܸcǎ!GGi&:U_*Vݽ{ҥK111ȂZn ZYv-DL؏OիWO%5kk׮o0[Ądϋ/.VrN:%$$@ i~׌T1"9'0C&/^ˁzFICl޾} vӧTp-[nԂTHRҥK9,,,u!7 fkםzH}!<<\1̙34p#?#6~phpFWZUn]r\rըQc͚5NV gĉLKֶ>f̘l,G4h@jՠa!O5;`d5 Ν;WbšCBDlڴb%T[nj短],Ǐ3gδʝ;BBu!`0|PGGGWyիWCtڮ[N:pF܊kf֘:u*%xE|||aovvvK,`J&u4!%J=zvQ0!%36d8Uvʳg=z;<߯_2e8999L д^^^ھb1;wI!Z˨QLLL7G1qYf-Zhڵ۶m =sLrr7>| Wqn.]A .R u"$1~x˓'ϐ!Ce:`0puV555o߾geHsݻ*#&+WxyNCCC}}}=== ` uuu5555»#jQ̦y(vڧO󀀀)S̙3gҥVBG%:ԪU+\lٲ҉y6n@t Y7Ff[FRovʕ P;wTv"RwhǏu^t… N:rHLL̮] +֯_bŊ Ξ=;88x„ !5:vئMM1ԫWo4(,i`0~:zP؟9sf|J*Pŋ߻wCxMÆ FTW BPbE\yq.]6mRXZ|ҡiG4K FvdaSL144tttDr{IK^| >ÇŊS7O˗/@x` >}:(iذa;wi{p鐐2eʈۆGl߾ŋ,^8vΝ;Wu.XX:ɓ'8ٳo 4khhh!C`{B%qpp4jԨF W7oL>3ˋ ׯ_Ϛ5 COS}7釢M:@/p~&b)R![&_jݺu'N kРDK,inn)h߬Y 6?~\aXQ"94Hv|ᚬw͚5UV.~*ڬ (PzuJv RlgϞ r-.… JOAa]r㯑 p׮]e̘14Ϥ(4er ҉ ݻSgtћ7oP?2.[[[*[:uVoooߴiDi%֭[}bI:lllph;=rȬMܹ 6eKr" 4`{MB[ݺu---a֍7FI!la{FFF0E:tHGG:`=dAZѣG 8pKe˖ AB"_#FNȗ@iҤpϟ@'իv۷oƌqqqZjEWWp;b>WRZMҨG:+Oklbbׯ_ڥK>uOΝ?BB+^ӎ;0';… F&_L9""bРA( u ?XZΝ;v9D D +VEKmۆId&Tf(@q]TH+A *97nț7/xGjjBUV=itIʊ48 vB /5jt٩S'%zR4Y+3gͣHaΜ9(AAA?s)RI}y'RwtcӦMǎ#R 500u'O'O*rff0J@G+hyQّ'ru@4sL333e}Y\]])EY~=2Cm n aPm0"CeLCCC,钂¿IO>!U @`GGl8z Zj( /Njhh@S|CڑZ={@Dʕ ק VSHI:oP7E-P\GAjkk f$$WENc߳gOjeVRaҥKߚM9XH[xqdݻw/Q)ڤ f@*H:B|||vWg Oٳg+ƍ={oE*%NA1wSJޑwbccO:R/_lٲzzz ,gÝ)7FL@hĿDAi߾= xر94E642 N8*:8886RzD֭ͯ_N)B ZYA)|dɒZvɀѢ7oB)_0=/ KEH?)) {-He*.^(Aඹs#רQÇo߾EC`$;.]TRեV&x}څ>RgG0 ~ݻoKQo2LMN:4PZKK 0~xe5,XpҥXS V -Z>>> @x۶m>m2H@.9ȃhO}}+WR {(Eydڴ2RPalV+ad$2B?&B"iڵD șoȾS:i[Z2݉3(wnVqG43}Yn-޶m[ YM=B5S;;w˗/Ƀ`>tЁRWի788_$ __ߴIg͚v]Œ3ƍ^#K|jjÇK*.k8}t$Ev`0m֤I2eʼxBN>ACCC:?ለ<H0y2p`d}ܼG4wc;5kVʕs,E%%55QFԻ璴_ỶCլ?ݞ*?qQkwiذϟ[YYAeڷo… >~#͏zJeG$&&hhhhii˗I&aÆtL 0`skzN:r5oޜ}vggg]]]kkI&:g``( yRJr@f(fe>֡C H*-^^^m۶21cyw6Ә1cXl5sL)xSLJ_|ijjo]H%R,d9rtz`RR6L<={[n!m׮%Ϲd@:KjNdh)#-Z_H _qy]/@ŋA`7oh񂐐$rD xe?G g!zرF,լYzꩨɓ *-V##kOބ{!@lܸ+<^ÇkԨ!%\jdz*]^FǛ7obbb 04ԩSHE/Y)))\%v3||| Udwprr5! j#RyTRxxxo *b6m@@үu qxqx;˖-Ssv… N~ NKY!ca4 'TLlaaA>&((to7,YWXQxqƍjjj7'>ik_"?xY^t͝;œ FNtOݻe?r+U$FN3n_Y%`8zzzԔDsJ7lӸ9\zꨄj@kMw /_>TmCR+([yJRLܹFhРGAI3g߿ŋ#uW6~DD/Rn]`:u )}h&&&Z 7o.X`.]pTd={ =q!z'@:m4 6ȲbHP"3\&_4 6 oMԧOS95j$U8͚5_t'bfpp޽{)7o^q 8j(\M 8;;+\4!S6.㗞o߾>-$Ai=eq4-wcg^={x˹f)N:adpk׮N#ӡaAۿ?𫬆6mԬYS(]`A///Xv۶mbgϞG"""hg|!p|,ޯ_?ܪ%}M7%YHVz49^t4!w lْS TB>}3C-ܭ[5j RH"3g*Ni|ǎ2j̿|ҼysZYU)z̙3GCCX1(,00P___1!UhUe"Z5kȄK*&,cooYC^رcbF6X9th_t\T'O 2n :jD3:55rӥKgϞUWWGl{-Zã~%J066޽AϟqH+)(ÇCSpPl*U)-J3!&2 .'O \6ߨQ#Z FE=7n܀$:m?sL&+d1 4is(E C ÀD4ZnذA5)H?4ð_1*H ϟ Ğɓ'o޼yȑ`qF ի{` oo-Z/8\VB''%KpdhSSS##t xcƌqj0Q]5 ip)_ D4F啣TRм:x" <$ eA.aBHضm+l[L 2g>}  ۷_Z577+VϟY).]ɓ{쁌E/MA7*UرcV# C-[G85B /=~8=GݻwGEEqcҼH8PBK=JRdd#:X"WhѦM6lʕqqq&6cYĀttt`P"eڳ]v-[mܸqS(rH؏n:捔 A.ȯV=n޼ˉ^:dHfHZ~ѨKm4;wX"DN4ydsurӧOMc~\2)Ffׯo [rrYݥرc+T8пW^g :2!{{{hvl={SSl=WCCbܹ߿. @~-[...4-9+x;#,--˕+,k۶m;}ǎ5_0&ORRZǻw{ 2dH6+/XjUڵ .yf4ϢEi21fd,~HaB4݋AG4j " ??իW+|'0Nò).]Z|_͹W\Yb!_|-[?>~u^={Ο?W ~xrrΝ;wqСOS}ݼyS[\ʥ^?~Tݻ߽{KGGG+Q.'ehh[ >5!2.]~J2@ӧʕ+yO8uɓ'{yyUR޾VZ{F . 8pØ1cWԶmۊ+>|ذa98K,'m߾=n(]Ѿnݺ(~z)`O@@p9ƎKvҤ /ٷ^.wիt ڮSU>W^AikkXB b: !7Ξ=[<=,ǵk@]t;P(6 #.\ةS'yBW޵k  ONJJBpN;*m /NA&}D >~hdd@C EکS6k,%%,U ,&x%wMfcbb Pti\΋/f MylllD_/~T TbEe3힧O"޽4ѻworTPM6SL*E? CƜ3÷mF 8pĉʼn`Kb|ƍzzzM6mذa'LV&8'N AL}W^-Ye '6L0ӧO0o"T֩S:l#B8O<944T Pϙ3ϽJ*n:yefӱc{zzſ455561Z&ۛɿ@PLaaa`P gϞbcc)cR`z ?~\7!NCqFϞ= !A|%D'OܳM{ʣG]GUvm]]]իXYY>}W 4۷oA@>?~III`mתUCkU*W %%EL{k$sDۣzv=`meaYSS-,,ʕ+{@|(Gm4v7իOQ8븃D#Gԭ[[n+ {@£G`E"@aܹS)~ ,=K.U0DxRR܄΂RXldB .DD@Kc "֮][HjwB m$jVѧOBp1gɪxWZE;89;;]k֬)YhR.]b{}C\ny&E[[%i2isGSҒXFS3f @E+ x:u(!ݻ7 C:JZR@߲e rRM4iSl~eʔРrچիm^[n%&t5j*UJ4s0~wBE63MMM966VCCCu%`RTR͚5_PWW711і>`d2g/[ب_>"bŋȸŀ}DUT!G:bjժA-hH'O@00M2]v ׯ_# GKF2ߪU+d5P-M-H%ö ٳ@X5C#$*4mڔ7yԛbѢE!ZWW755;wvZRP1 8b„ o߾E#F(*Vd liiZk :ۈ 6663f̵kפ7g\@ШP7/}S6:ܹsKMȌ.\ظqcgߩF4>}RZْHznLM\899IoHqe@" I*A:=nb{ Ȗctgw^}-ZItb@|`W'N3ʂ`Չnnn}QvGGG|(8ݰaA.^7DJ 6ERy h3Y Zw+30rZ o۶-6DhIJ\j֬iz _~ 96/_>SSSz* tgGܹ3X:$$D H6=zDٳ~+6oތAKK eۊ/7noo?gjI-={&:p^p+PV _0 @G)J%ZlI {&T4Nb*ĝO:U ]6͉./\d_~ C0B qG%O(k7@bӒ=84Ilq; 6mڿG=zQRhҤ aÆpIdk4! D $pm۶шXǏ"[.Z{]s0!zH qQZ N32tTA *P… Ũ N_ xJbg52= 6?n8tO9sf*UPl%JY%6mڍ7 rHyyyihhnZTN>}YK.uֱ4{zzN$aNyJ*!#eBGHi6. rLmNhrխ[7-%g͚)]gXM`ȑn2eUR 3f899mmmSX1){PY,:iҤt 4h RH*o֬t5?)Ypp0C,R@2I!g):L}<f;06#5o)ͩP8A\zV|}p)~[ ٳ'-ԫ,@۶mAORlѢ~{▢ BKϲg``jD bHÇӎ[ltJH$)~L LO:TV-uuuf[nOI'6]v~:g.@qEPt%(t2-.i!Z^@alaذa8Izr!KKK 塠Y)02ɓ'O8q7_)IٳkԨQDVZ]I^EaZGoB#QAV*wwǏCʗ/] O]]]M9,, i_p}#@xGI3)0>>Iiȿ#bH׸IMM]zI:u*WZn} #)%OOOgpܹ#R7PTiӦۣG+5IgfR`peݳgO!̵7n,F102߿ RHHu)ԫWk m۶ӻpϞ={Zy*Tݻw%F2yo[د^`߄C8իL߄p]t֭[ZݥyIb=zhѢ+W!¦M`oϟ  ;w޾}i5+II;[jղeI& FNG/_رc<w۷0G&$$ɴ%#p 8G%?NQ Ϟ=KIIv횴* \ pF*N܉JRRi xMٲek?![q:uHgUb0+`\߿Ϗ`0066`0 M ѦM???&`%JX`?`|/X3`07oʕ'`0 ?~P`0 Lz5k2)0 C&_ G #'C??a0+={V&Y`09#FPCWWVZ@ #gAݺul[3``XYY Rj`09/^033τ`0r,r-HY5debU%0Unc0X?{ Gk.9s̐!C}Ciwq9~7JiѠ !eeK"#&+3[T${&"MHegdE%{=po٥q:׹εޯ\9'.nĈӧO 3l _իfb=v0*0nܸJZX"+++;;{<}СK.  (\p\rPUUUMKKu9+gѢE*T2e޽{W\ill{nmm_w2۷z;wloڵkԨa 8<AX4m4erssQBΝyСCJ/^DΏ?Z%BΟ?N&Jx5WAG;weŊ`5jԷoߙ3g~WOLL{TCRDxHXNfE9W\ٲe dЂƍgff֭[7i)|/0fT@Q`N>}𡊊 A@Ν;w!$ Ak+UcS‡0aB^7oneeHDǎ͛uֳgB,9O< >L0¢m۶bqFE˗e˖vX777/D7; &E8w,dˁ_J&ػ3aʕ0Xܼy3Bm۶ڵ+$$SN555=~ _~]###(۷ccc9s&<|ij߾cǰ,sQ qܲeKPP$!~EQuJ*5=X׮]7nQׯ5r={yϟ*}Aj֬9e@X0aBǎaaÛ6m u3fÇ `dzke ,˗_իWQRv/Vŋ8dddu^G!v6OGU٫sy @A@Dׯ_8dݻwauttͅ/rH $UVQ4n8?F`bbRrs2j~vKw k֬RJ d'=zv/^癥"&i wA) 0̙3EǬ={lW^n"Sttݻ TP 7Yb^^s炂x 2Q@۶m2yyÇávիW_|/pbŊ***O>e?jժsҥKGFF Ī}ؘi3f=z4y)>vĕ|"hʄ5FU_zUxQ8~8\/^`<A1tеk(8\zQ`ʕ+y 2DAGGׯq#:uQ@+ŋf-YpFEIQpppެY3IQyFRWiܸ1 9ex1,#`Au}Ep:u8\#ͮ']^^~ɒ%x0'''SW +-^x}i&Vwᾂ]׶m6m0OF&Olgggoo?c Dt钔$vhnso߾~ "6PRV.o"91o (c<2"& fݺuBQZZZb-C a`/࢐/gJUU 9>a"(BKY|'N٪&QF j(p( ώP?~ YfFe#(J3g"3|0(|AڵkA[LΝB+]k2u1c@F"nҤ #5Fi׮ Зf͚Vl޼9_-0D5G!NIIA j޼yHAN̙|r>{ׯ||b⺺F2>#|ݻwر#88}H8HgJ{Ϟ={^Ν;YGwޡLg!.\23)p8G(Դo߾P"*&&F۷o2AQz{{kkkÑU./^X[?ȟeI”#{ ξsΔ)S 0H#A& bdQoICCCPy99jժ .lUҎ?~L@xxxrr}$iҤ  a=`ȑ#*UB4G:_¯^jUzT8u#F b?~<cajwa5k$; }ʕ+[l)EQQ'~F__^n]֭`4v.ظ٬޽{ͭ[J@D X"̎BJJJVVVff (P#4h@EE 9ZXX899͙3gϞ=~up"(%>gB Ϭ%L2M4)Mo7!!!..NvW^6짧~ڵGš-\ãW^FA,,--;w 9fVZ 0(#\tOOOV?el|{yyyxCCtᶁ  ~HJJ۰aùs9zCDKc+le& O' &ddddԪU SMMm[r J"w~{޿D 8W600`;I{S^~`]\gΜwU_D HSikkûpwwWN&9 y~8{Nu$#pte¨Q&M,ZBTT[':33 O2ϤAbќEQ@p=~X___wPЅ-[ HIIg B,>>1 k*:ݻwǝ N:ڵc3!XQvmZZZrrr2<Ϟ=Cܱm6@TUU˗/߭[7iܹ7'.nWǏ Æ***ʕcsBwL[nE "tɒ%ά Va3(|3cEEE3$ At҅gɹ{ۚ5kh۴i3k,Jسg<|'ԌG1r:tՂF`AǟJ,.7$`H*ƸqX6!2`_ݿ?ZPJ[[[D Q<7pe6m߿ؙA7dȐؤ$Ɂ/& |XX &pQVU@Ÿ/+~ឱ$,)2DL2DѣyViӆ!:p;ϸ l[n~]]]6DOXd%c jjjjbvֿŃSjݻô Kx-vp۪W.iJiii-|҅#N,YY$A:OZH! &RJlzPTFw,3:S8i8d{_8yB"]C LښM@4w1$hh(W O Zw7ni'7/_M.|7~o#z&''sbYAdmO~uaw;ŚD$FM} Ba#Da.>wߺ7OHfffΝԩe,y- 3!E9[;w.Vc% mۮ_vY$]5j>#|@ŋa!vZo <|Xi[[[DIIICKXrw LF@"\&NQn .6|Aq'yA,}n[hvׯ _,K_5_~Xb1L ʖ-gݓOb ttt<( riӦ5b/L.ڕ+W~}' ~Xw B2jѷnݺ}W§X'}}6l-->}9ʗ/U)8::"`V' .ls`ӧѣ+WĹ~9=88?μXBvޭ:nܸիWoܸuAi D,[lҥPp삽qƪUV!).\{9-=޽{#<۷oOHH +APQ~(##EdL eiRO7$A {^^^HaM0|NC8vJ"ʔ)ػwu낂6mڡC>[G[eͬSN/֯_?d8(ϙ3Gx|2Qݻ7glf+`X:thΝחMM`!7//^aX *, , Xطo,Yҷo_NdΝCh0ydB b~@[n ,N>}RWWq *OːoegAS>|xGZc-B5jޅk׮$:eN: 3~x<н{|р'NߎUxeZMOOߴiӨQnnn!!!œiii۷MDeaPh~ UEp ?'cC¿{ LH;?FUUU+!Ç=zp:v[Ɔ/F!qttAv-Y3ZiC"آnR~U,,+Dy>|x" xҤIP mlXTO D:u42ʊBD999!ZDHn:" &Z^,gϜ9 ԩSuttdׯ.]joo>žBiXhժn VBMFGk:thF`ii;#jׯ/.1pFbgk=ZgA٭[x;"QF 3Q@ ӧOnڴG e˖}wpss1c0xY柚 &;;gO. |K)aA%a4hÇǎ۸q:ucŊƍ366f:iAdffؔ-[VGG… o߾eT兇+))-Xt Sׯ_-YPĉ"mÛ7ow5--- (Z/^ܭ[7333kk#Gnݺ26)C 111AA!ADٳJJJ:uڲe˫W222ȶlmvvʕ+AM_2}rtt''Ǐ&MRSSx"Aϲ 777###%%%**ӳN:b*[nݹs>~Bpp\PPK@Zp*jժA5iZвeKݻwϜ9S___GGyG޶mۓ'OC033sppHMM%] V-oذ!X^z'%%}i׮ݲe˞={[EbA3dȐ*UҼ$ABKϟ?رc9M6]dIBB  (3}e˲I\vm̙7"ӧOUV-SR HbUUUϜ9S =z}:Eo4_J*qQV#lxmQ@ mw G5k֨zJX½{2QCv5eʔ6mڔ/_VZ 6 bDd{ُ7R?u.Ν%;_;w( +E@fD,_!DARPV-i׭[סCaUT:t(b櫱W\@J.]`͛7#`|7pBbm??~tR Çׯ_sNuu>}޼@QN:uzUTTV(DGG#'"[bU2e,Y lNNNzz:X# XtR₟kݻx/위1vP@%GĞG(!ʐmo~SNijj8ɓ[@`̙3׮]]F-\A9;; FK. Нva>*jժ!$6l؆ #,[QNҼxणo>z^E b"z667Bڵ׬Y#[a;waH-['L```bΜ9[xu|}}˻v킍B\y̙s]|[qk8Zs…7?H;wXZZ"))BvO8GArQxI^^ke/CCCuuuCn*1q]|l2<{l lȚ^*''wiV7&aЩ{hPѣGC>?w\XiIu >rqqF/G+))\eիWIo&::zСzaͲ#] "{<>'Ne>>ƙ_|2v:k,1..p$¢VZU8L ,-!2_վvZEs-J/=.]2770`Wov,--YdDA(͛7[̙3[DZzuU1ϟ_a&DDDڵk Ϗ,aYX999;w–q>+T WY|9?00 [5~ZjC Q@`=<}z BBZZիQBǎ! W^e@ \X=m4VTHן?Ǝ>~(9*Q Ţ9//_\vǿ{NFi߭[ ߿?>I"⷇ L?)tڕ5;8T5޺N<7j9E ,5L0aСC!vX%a͚5HWTTD!6G sqҤIDXX~=0dSX"K}}}E$u @G!4:tj(Z.\XZom59p{ ,ZZZBsHaQG ,[x1P}B 7oܹaLԯ_Ө޽{:t bԄu Yjw, @EE%555<<򍍍ݻ+++Ck&p~PaV%uuuIQ`CgH@X]$ҘIOO۷oxxʕ+<\rbܹs(… ̾6}W^ݺuʖa[n!!!=ˮLf͔QQzIi)S`᫢k°+ʁԭ[X6l|qRd.P8_] b6+GV Af_\>6xXrS ,Y"3go˖-SV@y%Baj?"cΝȃ {ӧPI֊)6m4!C`Ο;wƍxJ8K7x5h<(bƓaŊϞ=r4=񅑑3>jjjp=z2 N&$F0 2eo}NX+(oذܹs|vxl={6o\#Ž;X:z(k{y<4_ԅ}f_| :t>>2D7n dUœ=W?8):? wPڅ0#>6TXiȍ7Ο?ٳg} "‡4}%) gϞes| QC]`эD?˭ ...dg?tX( D IhQbAޑt'ķҩSr)}AAA^ztZJ,~~~[raC޿#{n$6lҥK诒fjjڵk׀pOR(NNN,=&&@.]6lذqF(STT %khh݋ i O_$#J׮]kܸkbL|ǻPqM4 kY;i["Afϟ3326<>>~̙ڮ]|Q@(:{nΜ9|' !=)52]533{o~0t3A|75zҷo&/dFMAM>}ԪU+.*DPPPǎ;prr (8;; MR5A;`gϞկR ¦Mhg PAq=555:ADTxADI|ƍt J8=[>V  }}}4h r%%|rt6 J, Ν;7p@6Ӂ' , >>>|9!(ڵOO J0QQQjjjL (|!--Giijj9ٳg| JKz_){d9قk֬٫W7nދؗ1.AHfnn>urʭ[%>|wPRRLH3Ȭx9_~}jn޼2 DAAa***JE 00aD۷o={3&c2C}3gBn;z&i 3pݹ(; @Z!jrrr†epD(SSSDRDE3gxEnnn(GJ׼ys^^z=x 13Qkr\w8nuuVޏX̴!/%##D(?^lGkNJJI~Dڴi#2t BL1''g̘15f0CBBʔ)cU^RTT%%nݺM<9#GĂPtuuaUETZ6&&ֈ0p8Xځ ӦM311a-Vtjjj rJ& <66E)9r셂CÆ W&+WӅ*Um@Q`/}bŊO<Ѯ'իWK^D b֭[X|rj PQO>Ƕb9**W͛7C mС9 J0999WZKHAl3&jԨ`ǏYYYa?~xrʭXNclmm{-& JYYRJl ;& N{ VQQw^7oBG#vbعs GQQI&ᤦ/WI&(9tҥm۶0-Zፉ_+++pnݺ. t s`=zTV->`)E_d6c拆rxx8,TI'O"OJJO9|ߨQDwnܸq^֭kgg7cƌ#GVBWr}`EqWĝ;wVQR\z %`D ,x;;*@| >g}!*Vd (w '_4( 4bܹ8E8Aŋ]]]A$%%!@tS~}D() P+V³L 8uKNN~2c-O2DVX4l })u@!P XEEį͛3f̘.3{],--o.L𰶶n׮m˖-UGmѢE.]uPSSA(yf444Gֈ#tRcƍ찋m^|ZlYٲeي`˓&MB\ڷooee*E4Ժuk{{{;$ A:?~u-v |rh8SNXK8۽{7"k+W GKMܿZ&",ZȈ7.SN)((!y0K.%pM<<4hPf͔"0x"ϟDXt钜܋/ZD+s}z*KDD jA@Qx`-_zennKɵk֬9x ,35ԩS0 ,xy۝(>4zQtaԨQpE 5j;پ}k׮ݹs9DE@@@~~֭۳gO& SV$  hڴ)5&FFD0o|ܹ "XMs}Iaϟy TsVVbŊ.]pzaà ;ɓ'3azAڵyd@A&䋆l0a 2~kÎ1dEGASSCx9AD|Q;zrrاOϊUFAĵP# զM}O>~A8dKX Ap;tﳇp=ھ}f͚ݸqC'NsvvQBhhhƍUTTtꞞlK.z{eedd 4SNܞ2O0|puuR;vlR8ܰaĶ"(*UرcÇPW .h۶- oӦMU&]tM=ZÇ+** C;XL{_h[my J.}y^vr4ua A@<~ L7K:rȳg߻w/K#+L4u8lfׯ_3/_}:}zH׮]FAn&OkQX"4ahU J8{.|i"%55u^^^Ç^+WE#Z5 vFޞ5D9P-ZM6m͚5+˜RjC>} /~V&(Ave»0d. Wfy`!o͚5Yh{uu'OH{+MXBeEaDѣsD @`gg9c#""P=ŋ/ d6DRB@1i$nׯ_ݻ7o@)^###Y>BTUUkt \ ')dgg{P@i_HA^^^2bp12 4D:l6DL[ɸ(?~\MM w AX`-aQ;ٶm۶n0CPN>D! aÆ0lD˗/ӧO2;w ) 6l`/|@O>!`pIVμy\\\^5j7\P>ccca)$\EC.Y" J20ʇ:!c~`9x޲6[h7YjPOnëW.1x`hF/zdR P֭[cxJ*9RLbbbJ  J,Cݻ0͛***n݂oѢŌ3ƍWre6;̕+W̙no蝂"]?~%4mڴ\r ,߿pH>4kl֭5kP OO 8884oޜGïÇJC&6DgٵjBӫW/ѣ d?7~ǏEEӧOݻwƍܫrppmRRRn߾͚hvUш8P͛~.\v" gc]C#֯_І\cJ 9`DDD\t kQ[$'۸88K߲e o4#(Q輜*//A,7 U]E8>jK,Ri !Û7o'|:uJAQ4#_3}vС9t JJ@-6AAAAAAAAAAAAAA/T^ endstream endobj 2932 0 obj << /Type /XObject /Subtype /Image /Width 519 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1595 /Filter /FlateDecode >> stream xmlgePJf2Z#[JD QgƤC&_,eEKbdd[Ȕ.[DB !v==vk+/nKNwχ;s}Ns9x0WK@yW|hNro%ش>*Λ~5ͩ#ұL&پ\,[_Oo~vC6`.QRѴqmX[QP8|梾ᓱiCV@GGG|p|XUQ;hX8]<+X\>;&ݷ?ʋ77x7|3ƍqСT5dδ3cMV#sL^6q|\yC#&_0"rnHaa~]ݷ-_1h_ied~Љl6K2vپfΙڭڣO*97K2c1ur|l?=;ki^qIi|K?cp_:Xe]4-ڶ=ɡ.b\]㆛WELJ/Nׁ?[DέYȜYPvťc۞llyx|_UmM'%۷4W.0jjjW;ɷ:~:x0쎘]Hn3fZDV&͍$=jxo\ƘaGs8 ˯߶ix[wOطx?=b.󯊺E'k,K_n/jkk.g c?\>]5چJ>rqh5k c Q{c:?Ֆgbwxp'(9뢯:nsM"sorf ;zh?uj<֙~#-anAa&v.3N'jԿ$(ym~ds,lz\yɔhD~#F]ȷ^?O˧צq w!qjsQ^qvWRFckG 8dx{ۙ3+ٝ_2!)Fhѧbw^=$I=nذ>]6NdlBg#z_ 'NJny.ϐul {UnhTt pVc S_]6]/6³ endstream endobj 2919 0 obj << /Type /XObject /Subtype /Image /Width 506 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 2933 0 R /Length 18185 /Filter /FlateDecode >> stream xwTgp)"M)4bCTPPWB]h]Qb bbts2g?Z)p,3^=S";;4ۿ{Mݻwbb"iwիWh ~;v옙w!xh~>iߡCt4^WWi?.\ڷo>-- ˴oѢ>g9Ϣ>77\ZZZJJڵkEEEh޽{9r$|>}fΜ=M]aa@ |}}w"zIO[jջw2:.\PQQA[4ݜ/-- ޽ŋ+tcWW!Ch)mll /133" !󱱱Æ SPP8p@zJ***hI) `hhwޜ/z lmmјB7;;{ɢ7nz233;way?55/@J Pz7oA 4zȓ]v :իWeoS }mժ{llld999/_D4ds2 244455}Q|Nj׮'O'$$af:f 8**RUU544箭fz>,,l.e֐p-MM?K (f/--}ʽ@C.Ɍ3vnOΞ=[[[{ɒ%euzheXYY߿ s(Ǐ/%%믿Rm(|  jJJJ|M^^./bbb Qh"ee9s氳~vttByE!_PP_iޞj{_Bx>gFOǎG&|%+--G P9/MCmm:?eBp͗rvv?~<{ Ȇ\xO>g|GTC0<ر֭[;u꤮~5v7&lCBB@3IDDĈ#D[|8qD'''l8::lRghiiy >4z>))i̙"ܹի6m|ySLQTT?cTTT~7}܊+,,,&y[RRv!/&&ַoߌ 7զMq6lPWW#F`{xv{\>)޽{+|N>}|N5e Ӯ];' tDϙNNN(O`Ϋ]r%7797KAA.w--tC>++]v^[[{h"ŋM+Y-]]v...7nlݺۗRGh}"5 дy*S_dd>}/ۯ_?|uo44|!C ,X3n+V,^ U]=x6D|hhcNJqƝ:u UCΝ;o޼ٺuo#S311V3jm۶aǷhb„ /_,,,p󭭭3))IMM]8[ݿԩJJJƍKMM.999T ь›7o644Dk@FѣGMLL>ۚsCjqHgrvv?>{h&33ɓϟIݼys̘128_J]]=:: V̿zj:::?-Zڼ ݻw^;Ǐ߽{7 2d(rI}^:--˗_cǎ\!~ܳ_5"""ϟ?G;'rmee@Bŋ򋎎N^_^ْ$..ŧٵkΝ;+ӧO֭W^#xիW T|%%%-bRm_999}7ovvvF]Z ߿ҽ{ws9ZSiiu._L4iŊhڹ{ p\Sggg]VLLgϞ/_jqBpΖ-[¾:̘1 e巯>SuqiK[dH{LpCCC{rלoH)))NDm ={fP>|K.&&&v՟/^Dj@J...#>? n@@P}XYYݻwcjzz&!xS9ruTWy%%ӧO ]NN۹uJDDDVB4*F(**'.\UPjeeŭ999([[[[Yp!K555;te oo6m2224{HHYNNNs333z*aPy)///!!gϞQFK,ԩMȈ7o6WgȐ!U<-Gffo|޽{imDڃ:I)jxaȗSQQQPPԤʹGRzSh6a(),YBsΣGR_pu^x{vkKh2yjYӆ00iO8?қ7o-ŋ`:uGu2)aakkj^V!{L,d233uK*>>d={FU>kZ#-\po_hc^pԩSи~'Z9)l Fa[TTD 5|={s4s皛SN%kܹDO?ܮ ÇGgL:;v˗.]:p@*x/ {7B›]p@N0e'ІrFFZ iwޥ5311JY7***//$55U,Z{hY=zDD4{ӧOH{P\\Lԉ|}T=ri_Ƞ|.((PSS۽{w]MtذaK.E4?h͚5\ϙ3{We˖ٍ~*55kO<{?~h *?~ɡP(G@Ϟ=ې]ѣG555z&FI_c?Y۬YS!I:8YOII ս'N<~8+O[hP;vWBBѣG̦3gdWSѣ] u(4MQQQqzп {r^zE;}{m2؛u ?w(q 4 ??={ Ǐqqq۶m/)))33 _fMΝi{HIIٵk;FFFlp*ݳ7qTi8Ҟ+h===>!!!;iO]R'LPhhV=BٳgBTls^٢JII KTR>קc-SggccCE{B?99{˗/>|I=x"_W绸f`c$ԓ'-@ݻ7}r`;mr͛7%%%iq?ӧO;88`g@-dddHHHܽ{=GR=obbrmgv6]Mhex1cӱcG谣Q3꽽G!$+IHHtR Фi߾}zz:?Ҿk5Q{JIIQ ]ܦOO-Y[PeaO}/fffBuFBBB|XQQQ!!!-Z~֭Bl1H{1x`\KE-^aa P &pQ߲eKvlaCCCUUUP԰!r䈴9r4sF_|V*O?33!-[`455Vi+++(o8p =(**b{ګ (ةށ- }ž.&&h"yyL{fggmddD3jՌ]<_~9 q7nCVpO=ESr ԩVu+)Ȉ?(=z`q||֭[kN{6^zܹ ڷo>ʿ}k4s5CCC m ׆J=N+R i!##sСΚ5^`k[Z}}ϟ hV9ڤ\ڟ>}=VVVf_>>>#x=4[nܚfiVrssnƍ`~uk.>;jݧ e͛5_\\ݻw܁nݚPҮ];k('N8wؐ6mڬ_M„ gfG#+Mț7oO!gWDy[\2tP|||ƎkaaQÉ&++k.iF...#&@NNΆ %С&"Z= mfff"q?K{Z)YAniiYs޽*y,{#߿*//Oq]V~xJ{?iH{*i_pUڳoPmT~fi/&&feeŭޚ>LNN ϝ;G}vԥ)O2e7o^lիWh `O4mgɫW2 $ \\\eO(Ҟj{V۳ ݼySFF*y'''Z;ڵ+}JJ ܍hHPPm_Iʇ^KzY 4-pvvpU@B +QV~@*)utt$%%/_^ݞ={<ڞKJJRUUQP',߸q#{={Ǜ6m▊\t wWe؟ .==ݻ7o3%snnn^^VӾ|/?fGcQOéboٲĉiv111KKK m۶q6mmF***Ƞ)W޷oiRSEJJ8`*{-n9K[^ZZ:w\}}v <ݷ7ow+jw^*Q0p@555kk@|^tQ~" Y?c GM~nnn7n܈._嫰Cϲ𙁟׾}{mvY^^;8SEE[n~e>>''e2۾Xl٬Y5˗//_sΟz111 iii)))z]v-wj~ipv)NzOx{ekkKܣGygRD΋2o7mB_bũS~׉'r#0Yh[XXpG`8q[nr/wfVF^^ wttX7O&O}~9 XvS͆UaG,vΔ=˞ ]ESfeN&Ž7/_.x^tZR>>>{/ڹw-ԭ7o޴hsfMWIIwFiS_aaah ~}xo9p,Xi&m۶m…h~;wԩSqEFF6` ,--ޞxӧOݺu999]tO^^- lll|EU}.]v۷/h铟.﨧/^1bZn޼9o88 K7nh^ڿ?+WDϧON:ťɓ&t N oonٲ%K{4/=yUV,۴i֭[WTTCǏ.\(##XXX6vUWWW{{{777 /Ącǎ2\ _Q秫;6011QKK֭[|D?~,ŋbbb//OAAapB4@zߩSK0ZIIIϞ=MV9M4hмyT7rǎ;hrQ?c [[šm[l*((ܼySRRŋH{&!((HQQ155a;v#\ՇRѣ/Ml6izPRRz]v3gNii)*|!MM]v:٫ :>??-ŋbbbW^E)S|uR)khhšN4ں.w&~===420D=e~=MͭgϞ(mȑ#ϟ_9TՇhтoY3j۶ɓ' ޽սrJTO>mٲeHH*|׺u?722RII)''U=)..駟xk~g#F2eJ\`̙+))AyPQ?g33Z^zmܸ@%,--k_ [4UU-[a>@=lhhh˖-=c߾}+''ۨw̝;w=`ܯ^{|@u%??u7oZzyyy^zz:Uћ6mPeK1rȲ ŇPD---S888̛7=ט5kСC9KSSSUTTߏ]'6II4%&L?ÇeMm-mAA?\9SSS[fMM˒UUU>@咞=8pGIر@0wMǎ;jԨ&lϜ9#--;wQRRRWWg7(ڴiS׮]UtpihQeqqqrwӻ2eʰa聯o@srrr<{:::كf^RVV^AAɓ'pnʿ doݻRRR;:/KKK;?x~/&&&ƽQFzWWWG{k, иTaH?@Bԏ3?YMw6m{߶m*|hDϞ=stt`www---ح[ϟא߿֭n߾7n;@=zĦS]]݂,1[˗/gϞmhNN }=~%>>gΜ*))alÇSLT6m|!--ڵk>>>{ FGժU+6G:uTXX\6.]уz& \#Pȿ il777dK1ŎLNNnÆ U l\ʉ%%%Ç1BSS~)kܺuK7nѢETTfzzzS,O(&! =+-wA㑑S2 7ofOQϜ9sm۶-..L{2eʔUVyyy]tFޱcG>}聓=[!m 7g1ELu(ծr7ߌ3Ҟ嶉ɉ'^MMm˖-W^ơvZYtw傁?uTriϒӧTp>;wSd֥K}u@i?ydzAK)'Ν;UT=z_Mcǎ Ca4 W^˳=*U[+L,^޹s֭[6m$={mmm+g31b=Eim6ȸq\]]nړ? >maq [JhHE;%cJޞ2LJ"zԩ4)z0tP׮]ģײWRRy&@O]|MMJJ*??I75 999;w.** &++ȑ#Ǐׯ_/((~~~bi_qA;TS@㇅^oSBܸq#""~ԩ`r/00;3))ߟ͂&{Ԧάܹ#))٣GeeeK Uæ@$Pֿ/R+++KO#?SS޽{={u>@T]GMUcp{.ϟ?ߡCN:]t);;дpW!Y_[[]$deeihh|ib?رٳg+!V||e57+W .CE! gA-8rbb޽{Q˗/Ϙ1k ,,l[l8֭۳gOL$>>]BBbŊ|zڵ:dn"юm۶ݱc۷oůudddF17gϞ͚5KQQq̙hpFĕ!;;{Ȑ!RRR7n|FŋvCY ̙9uwޡÇmmmlv3g#*|1m4 ކqqqgxig5ImܸQBBbiii|zRTT$//ŋ5w3gmۖ61|-˗:'%%͛f͚ϗ@___.].޽{'$$4̼uFQ|ÇP>|ٳ&LGXremժFrr2ٲeqQ]VBBɓl:;w' .d[Ȑ]jUHH=z`ݻCCCC@,55Q۴k׎bVp۷o)~+_Tx+>%-[腶/p/9w=iO,Xy9{C!TZ=* 99[n iV7553fHUTUU}uiK[]SOEix#((ѱ=;٬m۶]vmu/477 3gȐV2ٞFP"&&fiiyy$ʩ:u 4i^^^ӧOo駟zE[իkx-ٳgSRR(MLLN*.%%%7oLlmm+=M-55ɓ'vPڞ2 ʱn"tTܹgd}}}z.)W)'O\ )Ϝ9CKxY5є/ǏiK ǃ n{ݝ݄F -Y߻w+ 7lvK.{yFFՔ󹹹=z7n IKKKOOfiO}<<<ӿ~~~{쑓;}trr۷{=sΝ>P̎M|Cԡŋ{yy 粙kkkWǎٞv"Gzp.^a%(j;wFSX^^MQQjfk׮h rqqi+@7ovĉwڅv+V_ro}űpE^[p::ggx?[jj>}ץK4EFF:Wyyy7nػwܹsq%/EGGKKK(**bg_ݼySRRR)N:%ӧAxi\9r KG>66 KFFF\ڣ5z}/pi?f4/rif4/M>K4ϰ+$y&.P[q]MȰoݺ/>gIj T˗;wk׮]k``^RR 9s|all,BȠ:u=7n\xx87c<==A\\ފ+􎌌NeIϽ&ES߹!XnvϞ= ,z E2mڴy5E86lQNWWʙHHH711ai:III.((Æ @/QWW"V2:t166 )fff!ׯ_ǧecaaǏ)𩴦EEEF4vss=z'OMYfQN0 lr] VDzo߾W9P;v,9i/##ӣGJ ;wvttFn׮i[nqiO38q"w 7o޴m۶d˗/!VVV=fwxÇ=zk.111*srrN8ѩSO/~U=l2+Wfgg=xs^VVѣ+WKecDJKK]]] $sS4#=4žN|HsaiOCL={Fc}K{z@s1bB@߽{xȑb*8>#NNNϟ m<~=i&qqq7ҞfAҞ^@^zW^ٺu+p{qΧaҞ6Lݻ{Y'ԩioֲe=zX[[wؘb׮]cPȳbXLL˗l`S޽{_i+K̙3g:um۸===W\ɥ}rr2u 6lL[n;bU**=_ӧORƆjIE~QQe5瑑wٷoMPrRN~Tc Ç_OTW' `Ȑ!UÇ?|g϶oN=ZrWnݺ-[_42?F å=-mb5ޣlp"UԁTSӇJ[~~~s)+?Pgĉ'~% lmmz_n]4o<7ooxxALLLFs60>>W^Vyyyx v+Ǐ߱cJ/F `5BSO6eo_@*Z9Nŭn"pڋ/v[׹۷oO> stream xmlgePJf2Z#[JD QgƤCLC ~ٲ([M]\.!a 73I-dJa*5]0F]A&Czz<ZW^KNwχ;s}Ns9x0WK@}O|hNro%ߴ>*Λ~-ͩ#ұL&پ\,[ݸk_MozɸvɭC6`.QRѴqmh[QP8|梾ᓱi/2Z- vѰpqLxV{$4.|vt:lyGEMػoEoonn$Jg?1fE׫ȡCQ9jȜigƖ2Gr7Xl0 _GL`E:{XpsneeD~Љl6K2vپfΙ7|'KΥQsqȱw:9J6kO4}4>%q18 2.m۞P`xR1n|LIUqӭ×kT,"ց,\xu_6NdlBg#z߈ 'NJ;y.ϐul {UnhTt pVc S_]6`TE³ endstream endobj 2937 0 obj << /Length 3687 /Filter /FlateDecode >> stream xڵZ[~_azVԕJ"@; $A8PLuhf4})"; 7M*/n޾ӛ"((mtIUq6m{Kd;̀t{L[^Gz{ƶq2dzUL,˳3mu}^|kKs-OʙXml7쑻?l}f7TB)iʧ`jD†z[HfC\too3puv0uKFeOY8378ke~1pOD/Ot-:nZ-WAR?YxH:w(f e08"K"9?*k<8dqno \OH5ҘJҲ,L])]S|=Z&PCƝɖ8I''‡[Ç 3OkAZ/J%s |Bö[r!:9[ : {Xݡ3 cB 1 aG@1x8 tjKyO N3A!ﶖM, _/VW_\|6$Qdy)Wn*탸ЛO4+`j6eK+NҜVJr_aXYgJ(i?B@rN,qVa/8v hy-uc k_IsĈ *0 4x?Rۮ-|r@m55C'9 dxP7g?9s-vp̨yn; EN_ttzhRKUpNk.p-(pWՏOթy2p-D㸄!O\zQ+;5R(HZQj p0Ȓ -hڇb1F<e蟂6zsVI(AyA[4 5Ҟ'ւ]2}90_qcS 4e{',n~&ؘKPN }BJ~"Kd2 {$`EWcmMJHeQC=iz/b`\59Ԇfe9NDΎˬ03r$Ij_A9Ҵ<$<Ϊݓےѻ'ۃ#±2d@˵,3~[:Z($S!S!GXSXxl^*AsX;S^nYSsHfrҭg$L}fLD(y̥YpLjQ U)xN%P-m(mE 7#2Dc- hJ},KyZ̬p~]=9,Qpjy<71N0O<}ݯՃ"Hwf2ot:! MBJ1 l,^I}K-G6ͦdqyYVZ7 ?XaO$_-GSY:,[K9#pNz?Z'of&KIsohJoQ>]? BN+_ˁy9i0"p̦zyU3p+X&M!=5JDjsC)Ei ۊ|ۜr]Q' ԵC&ۧ譙'e>;ZZ8/RKoBp sa0 XVRrhQj_˱x0#[xh1 K³|6b e%셭gx˙-bYP<]i# p11%sH[f-BE=liαfoǯIw;LWcY֗'~PJymÏϱVqC$K`~[sI0Y\ߠPkJ"_Ijs,$Da ()D@86:+~E9\mhg=B愳Wa%z~Y|$:4ڽ /1-b(mW2/#7w?4h>D: 9A:0xFrIŁ1G3 _p(pFa+{CNX'0R% vV]z~N8Cn0k*QBuL8^TC<[u`1p3ɿ{QXd]*f@\HXZx@E{`V}B3І(ݾzuկ@y[V1,b/N ѩO~}{a=kv*zW[oh)iTy `>9ĬCkNQyuxi,xYBި.*3+)b֗7W_= endstream endobj 2941 0 obj << /Length 3210 /Filter /FlateDecode >> stream xڭZYo~_1ы994YEafz48&Uyb/fU_hs6|w_^7eXq9m<,bS(bss||( ~Tjv]ڪ£aUbpkazm/w[՜5X{/'|9ǶBÃAO\Eow Qa 7:.'LUF* O5\Mʔdqf&edS*,ǎUg}'Aeq|#ҟ`(;S#[K2UE: nPY9}_t@<g js1^ziEMt-OzfYAnQ5kY9TiDsۡ7#Bn-{[+Y+^n3~ O]6<3~Lzɳ;0Z9|9)7|,UT'ځսC+= ADs v3B?' A4ۓv}6-몱Cdu_=ԲFUŅt- '(<} oּ\db Qbwڔ%9Е2I lW5A%nWyBc]yZMa50V,!ZT /4M<-{7懅Xvn !rzZ5Bh,IH Rб`ht rCZ A+'h˲P٤Ci\L][61 `'GeXCױjQyvzᆭj<(*ԨeXxVLï`؏Z't8TW$8 l%q6ߘgwe)[#!۠kŞ{M:,I{3?+T N"`{}BO -5u=yT8nmŐZЊeGe8.baee"x< > 47$Fe<PDE>S;:#~ "dwVBM 9Z$n=W/ e_z 2 1l5yAZ2cKCP(T#H"x $u6J1<;@@gw΄{[ 忩Ά0\E=(pFyG2$XOiL[.}!G+T ;@%cGW+@({V8"$-7Qº3Z@)m'Ijj"YJ>ܼ8ڨ "3-7Iiowm0* ohe F.כO١evDS7~a82F 68A|ÖǖB*ؘԈqTH}G"Va~8LHȣt-kj2T]zg%-ɇ(l]b\;SQs(h5mj_E1?rCspa9>e« ]7ܱR ܷqb)$DRфxȓk.T'.[!hibOiJO%|q'M_n *Y"gի7Es2Nu,sXXGAϏa%prʞڨ2-OQFg@eca endstream endobj 2946 0 obj << /Length 3012 /Filter /FlateDecode >> stream xڭZYo~_Ae)@Cys~ 8<؆Aqz4r1\I|j^ݬ^}VwWW}u΍;W_G)/:8i0uϮ .vJ]shSWms =BQ{s_Ϝ |g2/r&uuF0y@ʅAӡ#r]{Տ^FV% s?jz{lkwZJvu0$1?|б+%#-yQЉWhf{.Wfƾ*Qbv2T>Z@vã#hD'K`$~൨;3U1yGZ'ܬQȵr/PՔKQ-GDp1 :1 Byw=I0qu~z~,{.(A׃l~Gڟsh77^|} +ˢ܊xK&6JϞUcU5S PTjŗ@Tš(PtOpuw{b ty⢡.NvKz-/0C?F?'|rA(W 7z>˕6xQ69^joMZIx0jV1GK5$Fl8!X }uCv0?c]6E/Sr ,zB_F B$P!E$(o44Ln0qύcIJX+letFp;4-$Ȥ|$ׯnot4hVBA@~##?}w9Mq vv՞ʶ9 je#{-fiaYzp] 9.=P0F]y4FNFryYYD!(f|bd!8: ] M#ʑ^bWg4`'/64M$;pHuZx|Vl)2 -|MrB-؄7RR^YX.OTyYM$C˨V%nC|H2&'y%^QÍahV@+:N˸sRN8~VW+gpJ1Q@Pݿ*.s&eNXB4Kx)gYgL>zBqa6`#1ʎYdZ4 Qn̽ނ=918[ON{d怵ST R*0yUa-{}TEQem./% ƆmJ28MEi'KjS& 8Z'u-~kqrR>X8T}E?RhdnX)h*fyCdSbKh= \XiЄR,!U o!!:7\i1#%_2gE?D j-uoA:M)̢Rvoy<tr <Egkxrg3R5,fog dzB 2"U8SւMݹ.JrS|Ox#;`J0u ~>K%vՍWѕeO=FT;/aVv,ZdUԙ+`5͖ ',~a"/2z2{4K"OeD;G??zl4߯]\NKȝz.9[t >(1}6pX,[΃к.vjfCku| ŁE^s8] !-)wB69W=Q ,"R/XER*녠8oK&w$xD}?LBepP@C*1ǃ$$8?#i4:iu=~ e[N%=$S؟2_s12pt/ުJ]}ΡZ>|;ghٍ[K(?fWY׵Sы[= ~^w'?1D9- evU~k1$4l[ĒHIG8yF ߒB*#4Ф.L/x#*=UpIbAa$Ry?%5S endstream endobj 2829 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1907 /Filter /FlateDecode >> stream xڭYmo7 _DQ/it6,H:[P i5^[;p{$_.}@(|"B8C!xr.DA0$@}~&0H&o)~Sؙ\ȔE4uxYGx DƳ,Q1SX#Xeek.Y>V"f(:)$U.*QEEl[DXY$* xSNm %P0שxNş( @qX,יI#+u1.PM RY3aT u~&pVbPr(PkHUgeR[P#QIJ)]PTz#bflY`++8#Z [H6"bHүG R~,H!Ԃ[ĠXV eY@Z׃Q-ТIUF!c`doHD:R`LIMI("3%4 #&!{Z0kԡ2U C3W9Q`9ݕUa!8zbԼ~=6t:[dyԼ?7?7os_Fra΃+6Cd XQ N iLzvf#ɧzyrȑ9!3?5ͻ?Л/'c>nB8uix6]T9B^r\?O^,Iey>ad><NӜNC'ƣ A"nf](~\}3UwI2N.昭TVpQuCL\DuQH%ۇԐh;, -=I}I=,so]~ޖLe-6Ŵ A{n+h+Dl)لM Sn݉qL-88>8xR.z7aa=C!YKcf­uEAs80MSl09YE]b684oNv.ЭE\nBABsj9R|wi 6Յm<Fh5FiEe ntRlM/']\|;"i#L}]#$֭^96$˼L{YSj Vcq6 JwykZzwVj(0W݊FVS}e'*|v{}W|u/Yv~1։MsxӌO_B:l b%"b^HW]D\~ /{ȽI !B6h{ `GAcƕٌOLDMQ`7TGTfma)-E-Z%n(O=vlڂ U[nKzS^U_\.&)7{vX\4&柚&'/.g{\Sr!oӖpK TvvW߀n]Dk K8=IG6PmL[B,  9i0D-ѓYK~>p,IR#û}Vd&}2H`jK/^RAe;A"Bco&wxFCX;Ao+`zGwy8F2#fl +<ޗ8{D^ZPCAGFq=~h] j 4jB5B,ħޤ),WzLeCvAMH9'^!ɘ/?L@H-2^)(osjhAROs!k7 1NBFJٿ3ԍ\/h [٩ wt*{aԻ˹YCKV9{T_C# endstream endobj 2958 0 obj << /Length 3197 /Filter /FlateDecode >> stream xڭZYF~_!e$a7 vM`#RRy`VuUS$3v~R]WWSV?]ynnުt4Rv*xu>To>yRH߇ 6 utA]m]#m6<fMGCnpŽٟڝM]lC/q'}uUTQ՛JOMQ sm$0RaHۥ2HᠢMg7LTn4Qա2iyTD_JF397*^:-'dk˝7e5޼?u܄Z'n 2*Qj뺷^q%aa(Qv߽Us@du+˕IU>\s)ۓ8y6 'wJG_R`zk}m}j^  -[R#Hh,Q8VHlN"ceWp3u0nHr]ny߽B"@=,LX )Ny-/_iP<6#3 Qb]֦; $X[!aHBPB?|:1<qʮ˺Eس&YNr5;k./b+! G ǧ[wݩQ~G\~B/>mќ;@ 21laת~V*j&"L"-Q /37r.b'Gp.6x溷hoo~sωii툯Yvºl8l34ty;ȽQϮםKJGsYNjzۉDcBwLMױvñ3(vY gl`B+1Ԇnb(clk q&S^-:kK9TB-Jв|OEOۦ 'ZwXeW3pΠ7Tf9i谇N.['`'+]++hql ؄%cLfp!I9K pQ"vǻK 4/؉2܀Sԍ] 93ϝ'C([6Y큃'6/S%ȱoonp{ {T=drdh!ye2ZQj375|ϋI@=0$BNڣXdŔ/ėA=2LY'7o^[y?O. s5SZ*/n QbfARLl6=sft'HNLT=Dr`bв@/r+C 1t8f0jHаWؚT%ž{ؑ䧢@D GI\wN5 Za:, fߡ(#~9$hjm,=-[xDI:_Gc!/#T:X]T{( ҅9T%`5=e.- Ͷn{'Z]vvFjIKXF0n~,N6DZvycSѯSCcSujB im^u2$/.(R4k9Pgwdb]w0<ޖtw=^0oa_(1HK; C3y䃇Yԍ9?Nƾ*~NtLqR.'/-0j'F!|`Kj̲.KHaʌ-oF[}w}w}gcinPR]9-mɭ@^NKc3tPؖ9zN"BpPS -8/->E*֚݀a@~Vf*fO$%kNw;cwþpt6[qGlhX gHL[PyaLw 8eBU*7,!)O8h!atCIF.Hv -~Vxon>-,dٵ}:_+zK|^ GyH)|RFVR"|n[]]1ͪ9p`i1QJj@p]9͎|DX4 :y[J 'dXIVz$VH.КO%!21pUH@ï>dbn<48W"G[|#֍U}Up\X#S3/ .8p{ěs%{c%;Π>?G9~=+0xx(Mo>^c4J\&f>9)C7' ;J7R|)b endstream endobj 2965 0 obj << /Length 1952 /Filter /FlateDecode >> stream xڕn۸=_!2Ӻ_ @by#6OtH3áKp87Eupzg35Y2lkkųTzNEн5/Kʖ!M#/|3^zgѠ!;ocA5E1i4 CY{@6WlhN5”/,Н|s?K{=ḵ"¤28ƐA҄H_0+כ7o @C9!Ȁ.HhQ?pѬe/1+`G;wy=ĥ'jF ւȓv$*! "a#;{Ş)RTbw$7}h-tb'<=).F[ /tu#"'ۺS6E  H᳂>Q~nHY_/0kN| .(d\?^˔Ohۈő%|L&ǯ:Kgi`ښnw[y>eq*2陏T(NudTb eTm,}&:4cz0Nا5M{#ʒj&ԉz$) ұaM_s >$3d(RD:N|E$ /yЖ=0KO*4Čn{M/f `ώة@HebOG#D1/(F`x'fGzlX$b~4Ѩ Ӝy٬hj/ql~/4~uoXےg}@/aik3;h*Aiav6j*{l#87yM9/X䠘i((^ fg025S$ Y+ߋZtqX$7H1X쾉_a6!I#`w%_()c3SZDλ)/ i?4M!Yka(vJ"CkCX)LvfJ'tm)! gDEqCm#GcTmR!T z~ ?O>ad:_)E<=Ln||[F9?`$LF{ endstream endobj 2972 0 obj << /Length 1289 /Filter /FlateDecode >> stream xڍVK6-4Pk^-l, @-2YtI*P]Hp D}Dog׏W׷Y5qSfe,$N*zO>:sv_ƴq;*46Sj[2ezKS5+M$ KrOF9'GZtQcO[g9lOiaĝ֗ݓ@{(N "n8ٹ +(/M9k 5{,[npA|Af'7Sv$t Ŕhw5jC .,YR`9cY]V 4*댔jͳ{'Z|NRFRv[(Ba=ɬb>`< ^B͍?0'HazCW6#sN0ơG 5"_y OK]7v{i1!0Ip ȠпQˠ1 v[S(2Zy yjJ]JLp.4'2YG{%0N9tLQcOT?9ύ/|DWr8z fiFXI⭂S*%Oΰ(}Li.ߓjlU)\`,ې_1vin@zH(.SAti,-e$bi|71(WpDtrN~s~BpW9vFx˅+u5I^qdwo/-_TVq>@^$?`al GPeq\4qTK`VM9V7Ud%9.`5QW ut: 0L7ǕT/bΟί W ?∙#RX5I3b[ih'< םZ`b@S BP~΄0A~{qA߳>^A[1|eYYyY%н)/<^ "+ endstream endobj 2979 0 obj << /Length 1724 /Filter /FlateDecode >> stream xڭWK6r ĬDzhg.R`[k$Mʒ#ɻyPMbS373d(Ͽ4HS*d&Z$q̗zcvm&$a&_%PDH~כsxcK8)1\5 7֭'Ӂ/&Ҷ3{ړ 3$ΤHJ"g O"g'1͒YX;9$ w!rvW1?g6.&[۹ϑ+>9Ug(y Btj9Vv?!G,Ҷ!y!cHzk{/-uT&YlaρLS)^TK"IxY ZJz9ዕϧ]=-9Џ,N!,a JmErИw*u9}bdWCo* I$* -erxkхO~vߘax*!i/7b[س,ӧȏn!+m᏾g5kjAl`|pvI zO# zS:t&XqdJ -gM#|Qyq@ "~Mr'sP@vZՏ9S :p.C.v67;tR!^Ίr6_G7:t,b! G"*uQ&֍\>KCU VYi&i$X5}n4Vš<J$ˎnBQ:'7ݻw-a p 8~Aǥ&6kt,dmsP:|P@YP`a5`XG/d.#po#E>C'J׻Q{\CV[1i"ӂh%< cWc댫x1Bj4N^og,ChH8[@.JqXmR7nAYox@dwypV>ϑg׳o/#awn]ڐ4̾oHsQOVB* ti`;Ȏ|_l endstream endobj 2983 0 obj << /Length 1209 /Filter /FlateDecode >> stream xڥWKo8W U,) z۠mу/E#we)+Ruaˎȉ!9/|3{/"]y{EXL[xYQyw㫊7$I.egJ3 Sʐ]0I߼T9 bEnepsk[߼'țERc&6 И-J#HŚKQϾRRdS_24{@r/QCg]Qy+"4-%% %s97|߄$'\o{e'LUzUȐ(GDk׆D?AOݞdu}U*˵ǭ&lvdz~|hؘޘX\oo?>wWǫk:.7: Zm~PHoQLx}F;ހ y(‚֠^dc@DElmVmguֵ!\Ny2җA.{ wq([tBK/aA~~f3+E$|.=^٬eÐ{|QMLQ6ngc$dfȮĮ[{B3 "AeqIA4n {Uǁ8B]@8h]¶tҪZ5oiB.!=7:H1mjx }Ź{7c5qJ CƘ$bg;ܑ1iFwXHe[ƖAj+q :}y.|pWb׎l>}"5u X %y)>#s$L̑%?)%q\]D]spH+;H4YP1;ǩ#O)ɽ ᐂaqz8 S> endstream endobj 2991 0 obj << /Length 1312 /Filter /FlateDecode >> stream xڭWmo6_!i VjK@Z[`HB[,9T/~G)K:[?$OhXYGƫ['4B3:S#y0f1-rgF0nx;>YiY%m2]˦joW˷gX5 Zה!Q%ѳxjgNs|P{N\7Y2B @@" GI4jzNJG'AHZRA F\x*UbF:F0aiQ jWKwAcJC=6a1h~JOBu/]-!d@q,HP > I& "foȲtIKRrpĒKx=Ih`yDyKk5(ydrXP%L:Ⴞz@ +h[LFe҇M> ԶyHi/W(2F=Q.NJh_Mw1PˢE뇪(*q-ly8H$~蔽'g"fD&@ .xHCE!OaFrkO-Dו2VfCP,- | 0$w&n;صc_]埋=fMM\B$%5H "rцGuAkwaQxm홡~#DwTa$ǒ{QWߚSUpZl}[ïǷօ3;҄{=y/e*NnNfoX!aT8A^~(:33S?]CZJEi1BېxwO+P7fj`^-83ԅ@f Mk|x|Yl0t|UQ-cV꟧*׭ ꑚu{PQVjRHr~j$/!d`[IY]o-Zj$#nn嫓k j bFFQRqROy=:V2}> stream xڵYK WfNՊ!U-o:vrP-TȦgHxj@ |x4&Xlͳ\={qPHjȢE~gzC2 Z۫e%޾1z]k|QE `B?BZUТPE޴͞(]_pCH$K${WQ}%z'5/M$j7-rrkxykNmhã;8VI_S=So_gA@4--+ CHI]pejIzj%W795>ਪJ3PxUU:#o+ZIZ˷".z#'pfW6 q5jK!6-i56x6ł ajO2?#JqW?3ek8]Wx63Mgu HJızik Gup`.Z1$>yN1K6!H~ok뵶#t :^%k8,;(kf5d).H,2eS! ڂ߽2r9:\H(Y"Zw<ek8ov}XqE(@v+/$ecH]W@%F"?SUthapRJPXVfd";߲;L4!/A?|R8>jw\{u~+PX$KkFo49_5iMb82H`*UZ[)袕N-3ډ&6c ga}<-yU[S`&^I=A fycNuЙ/M/q d˞>pDi+aB tߍk隼j3Aju-IU~~ 9s؅Er.lQuBT6¤:hBu/:Jɵ쇫.GEr\A'^@Ǝl4Wr;q~NM]Aoga* "xV'@U޶P/>|0w45o Rd֨VBj+\[^L?DuCpA;3[7'aXxJ:F}Cgiգ/$,,?h<4\z )ʟ`נ*Ժ"b ICw|j*mo6Xo^GexdpI1K(' ?/w֧Y_݃njXcok_Scj:5-~={Ax<W71&eC]~j۴JPWwUucJ|ޜvp!E{ed{CF<&G$~"{TmCs% X[UÄr4s^89*@xd nl]|ܶkRI ;hWx:IqڣqcgGx#^;4\T@{s#KY<$nF7rr0v 5LQ "aB\r"HH? FqʷXe쳛FݰzdmDiQN-o|ˠOG)Is6e !svtu,|MO:❨Qbdzguv*&ܻ cSdJ]7OPzmƵ79׉t鎛t%o]8 ڡNEț$Sf'Ć!D-; E2(O[Lq0:mܣf5" ,<, ,g^ l7%Ǎ:Y^T#zc#ҧg ^] Ѹ9{6S;,`~}qvyb= > stream xV]O0}WDHqjTlPM[&u[Oi%~vl7iؓ==К[AݞeG((!+r!^deSNq69yܹ> ׁ$& @~d&} 0< >c@p7Vq* AM9}ۙuōqAI ZhTu96se}QhKPЯ-W[9q"a<&I檢%\˜gz4}#ySrNtVn%^>돓TZIN_8cV܌Z ")aJG`غ d%|7gK_ǜ`lVWSrMu¼ULHe*^s&h׵']pm=/;Aeg ?SodPmnmWHn}  "x(} %\rР{~ry<ܷuݣAΆ/Mz.tjr1:@t7S_7-Nj7wI_±yqe%RP[0nt.?H endstream endobj 3008 0 obj << /Length 1708 /Filter /FlateDecode >> stream xڭXoF _aIj>lܬ ڵz؀-'Zmɓ;e9qx$w<i6 F"~`XOB1 9 '䓷O3IX{;XViPi[j汯Y6Q*bG\Of1U#@|.\8$"ҺVKo_׺g;D>kcͥ?VJ',$˳ܑL4"JK8|o(ZٮΊ?%ʙqv5 b_)^L HDҤDެ\#ĨS4>=j_H2!yJSDfPmH \uϺҬ>idsZ Y&0T /s(@0,fA']D]F:)XsVU fZ<^}f47%ݱ0PTc`WfymT%l5 588f҃f&2,D%QET D#g"0C19ft~IK/>c-Z#ˌGa~Vp݊ŒوE}w,{ǿՙ(X>UClG[8ԨoyZ1n\|~|~~o+aP`ABߩܠ4u˩/ pSG'W(Q:w9(/hS+W*,,Se95)aIcX.YlG6l*u$k,y՞`ҿ)8ź"5jkP?$e^Sǎs1Z\}o~B/eF YJǷ[TB ´N8T)Ͻ8^9ᛋfc~}nԯYY?j#ERZ;(L>P*hZJd!Or[{l"bn .pn̠.3cb8bnLN1ze; %9:iҴ_0:mVSZFV8{U5&. JK7$˭aXx6{3fHB:k*5Ì$ffd3ƌl1B;qHE~63.y=)1n@Ly6-d[h郍0&&o/rj3' {VŤC|5H=/|oI-DSv*dk#4t["vHK,<+QKp` >!jteJr,K\cRލvB_AlV?}3ƔO P OԱQ?gv/ŵSɃ.m;ؔUQqGxh MsslL 1/~4-|OuxS=jrSOT QAKG]Q3w8`nG"@"A7` o IȰ_z|-E)Doɛŋ` endstream endobj 3015 0 obj << /Length 1281 /Filter /FlateDecode >> stream xWmo6_! *Iz n)bK]`@Z dɐ;N6eKNا;R{}:2a#f~R$N% 'c~3};r&{'q{J!//Ĕs/]uPGL&#:iКT Npش122JtWj2}]Wm~h>pӚ6kfȥ*j"b9ʷ^A;s!@WHFRmTWlOk`enY#KZP(~~ #Fv&SV_/QoVM7͌1x|\d >}|B}]`  JaSA&fೌ\6Wf/b|{i kW燲6vCfK?}ZU =y@#MbߝZ"kp{yVSL#ꥁ/K[RYOD-u"C7͋tQZ4/a.[m^F)"+i' q5r;;q!%!OQm 껆I0y\R'܅0@W 43R}q2t<,Зeڙ,2S+lWKZ $v.܏!~*o2ǬKۆG6 Olvy6t;ik2WVPEgS9 xdUFdVZk,C-e/l5+L4"Fk F-r%oW ]jn1[ K;po<^9wF_3|7M'ǰ{5歩[SoQOHl\u?G1:7y^YI;c4Ps/э3R-ieiA`z]k`Eޏd@٧UI]a;7{vΪٻ.E*OA 1c/}SM &MUkWt#O~ۓ~Rԇ_ Zޑw?6 endstream endobj 3020 0 obj << /Length 1356 /Filter /FlateDecode >> stream xVYo8~0TꖂMM-zdc/v-ѱ YҊTPemos8q83lr=aߟ0XS/1٧L_֛>|c$25gV߬YQ؎qhC.CC)f"!ϖ?ޗu=|Ǐ#[;al_8fJ |l&5]p˪$%[n@`ײTK+JlCg`=g;T~D-D#Fv`\ui1SQy/ɏVɺZte3V:wF?-CEdQ7d T!w]wL藏j2Cmh&сv'CZO,vTЅf:N@ i`fʀAU}z6z~$ =ݾDϋR'I`rx/ endstream endobj 3026 0 obj << /Length 2436 /Filter /FlateDecode >> stream xڭX[o۸~ϯ0p"5+8nEi A@Kt.^]ߟ)K/p8 ]?q,^Xo\-Y_.W8[YVEPn.o׿, ZwWiZZ]7q2O=5SFvcfy늨oNOD=VeԺpdYH>+Cd?/?w}ꟘW:G5ܔ\ 7_|̪lA8>swQBmv9wg[l{sZ{o6Ư/q%X0[N|O@*MU]+.߶ϙsҖ˕;`þY-Sj8 ھ" vr_[Q7mN5dU'xV+.,Ӌ԰N^E) exngg7 M(7$4jDh tf7XrM); SKdzn2F27Mj(4`#3 8wʼK$K#ѐ":E8cQ<`'yu̚سThI=r_(T ؗ3:ZV*$2'NnGmVE&H★L5Ne:o Y8mC zZۮӎ$̓` Y8Upz <,67K:͞F6 E64ELl[0x`lPH7ugn@JU6 CPw&zY^Y30. [ 5צO6{$^\Dbڛ7o(΁l!3셰"pGN>^zs:"˫iOo_}_}ZhK;X)^CR|2q=HyY7_wJf? 1'F#q>1'5j|g߿'֘c\ N$&,!wm"CoX8W8z˷DQ"{Nj&2'&MFoJ"'/`@"1GAqQk4"#Lz~}a\|/aG<(d9@4HJ c8RL& 'Fe>$1b1.A'p:,c:nK b_;*:ul"hHb ҖF%;uXUYQ3rHڿcL*#joUёR y'щxtgc&v'(ƙRvN%aeWUZە R#v-X@in$J3nb4))d#(}_'x&.pѹ Π e))S '¶ߴ4ڗKj::Z3#l }=!\ p+F*;q T1W$ 'ZyСQfx]PC434޼p -pY/i~nlqYuDc uAVM}rLˍ>hvͺ7ِq0jw&1d7 >v/"Ct ޞvGԴѕ (0GJ PXUlqIʎ/@5$L\B `:/ endstream endobj 3032 0 obj << /Length 2425 /Filter /FlateDecode >> stream xڭYoF=BP& 7vS EP-DYP#~P$Eqo39|Zxun8[fI'EQ_&],=ߙ7{HϳWҍe]gwʞJhS9t0M}{p<`H?&EHC;8-6iGSVV{f@/* xSbܚwN- (z0=4YYB[e8RO"!i7ly$|8UR';jՔp?Wb RM TH4O &J'.EYL'eȾ ktcRóK7 G<¹[A5-,#K!NA7N} iC4|p D(d8"};1hCwhAʠ;=Ȣ>/lNzO<p楕LwUy,}dh+' 3~9wW-̡$m Iac x#m,1>( 6N2nңl[/VfB%Ț "XD>E4`'(X&a$Z2UK ('|vR*bh%'OJL !kxj%]0-kI\mk>9ݓw^\/>4{1`8l2PDzPM7Gwmn6e `ΘA/ɛIDm@tj}5;J]4ByxC?ᑟ* _j3貸KRۆWU-s<ߥ("RtΧ|e{~Bd< uqc~)DDȏ.rLQ ͨ?Y-JiKP_>*K%<:/iCO&Iywd7AI^ i-,; u5#=-}6|z/]&ޚۼɎyjWXzmsi)9['()68(< ii{G[y|ieY=vʀOiyڀR" /Y ׄ|@|{fvxɘn748w endstream endobj 3037 0 obj << /Length 1193 /Filter /FlateDecode >> stream xWmo6_a=T Iɲ$`\N=NhuȢ*y;''&ڴ`{#yܑnzwvD~gw W%¸O-ƈ?b:|طgte8"u+3ʺTO lB ̤$.jSSyfL@u"n4@ߔu"ˁev?Vf pi^lj3WI$ʬեH3Q/G2|ieK"7)oIoxCx/_Mß*p> stream xڕW_o8  qF-{BDX,]I؉&E")GRˁ=>{_ggd0AbAmd;` #8r31z41Fѡac_GB k֩܄Q,MHZѕ8XeFDPٳҳ1H/1jʨ,9 MכKǷiCtΗeVʿ?mV?|j~LLv ? Nhlw$vi8;ۍ3|Ԗ>] iDfg+eq\yo !Rh^w\aL%k4Q8Axv?6FGRu]puZpu \]\,aq?BdW U JAe/'Fj^j;ӼJzՄnZ*=Z(91@cY;܏r[V1=kC5ƶtJ@\Ȃ5Ҷh↵ /VJW/i8ܸԜ[dй'Dd'L Łⶑ+ku'5L=Ÿke`wZqƢR7'Ξwc97w.{x}5W2|Y>"Q6>YGBh0 [G.ggԛ endstream endobj 3046 0 obj << /Length 1047 /Filter /FlateDecode >> stream xV_o6ϧ !)Q ,&F(͐恱i,e4~G4Æa/3~w;ޝh h09<=:>EP"i0]2F `:Bƣ{P1F !$ .?eQd]wzAtv^FWW*苗xr H#P#&۹ hrA4A㋩J45J[ $ ?^EG1 ߠ| ^ |@0b< [d!,\*Yey'M#;5?s* <YFvPnW(iKխTw[YJKUk=]ue՝2!E(92o?p'_)KAʘ;b`2@|rFyˆ''$/+]*CȠUuVـt@|t ʝsi}K,q> stream xڭZ[~_A<,0ܜ:؛rj:ZQAz4"E__wEmhݜ:{{jlbk2LG[ڽi;?/"q鳆꫻ŧ c/f/? Lqw~!56߿-b? H\[4.J0,Mi KȳIydyؒx] aLA<|#nqq,V*$rڶ=F3G/$򾈳T:e-}Cix]XljP3BBQfyʱЯ1 d&(CK-1!V5kXxdWZBMQ󫯋_n{%{?7ؒb_ٖ H7g OqbM\p5Dhn b tdȵ{HRRzY )AXHe$*(|g%l۩,gLA"t[*<ۗ⾬ڻ1)KhAƷCaAQZ _GqɕfGt 22bqs72?v ۇqO* 5?xy |4\FiG1oR7 vN{#>gѵenBd(\q$E%#(Pd~rsIV,)k^}^3Sgf/؅pܣXji6 Z3ힿ-O\= mbŬ:JBqd`!7=sIE |v0`Sn:F:z5 7l//n.>`J3vlԎOB0}}T/ְK Yb>Ղ7C !=[6\$іgf{B dcS#[$Xx(f3 6J *:Y*Qb!Ujp JQai0*ha#!\0m'ꭤ2*L"0dzXG-N4SEPrYBf/J6 ".NS_c Ȩ)p!4r;8䠅!yX~vQ[ #d8"DQOHktJ|bfvA$HN{ rF(A&dd &RLokz:H譇2jg`V_:H$Q,%a*:*)!.((!n䣅G(oTv-5S2BFM ,]{01lDiUk{-@0ş"auؾ7#dTgviB{QOׯm?TevWU1ic+ PESf5[d~' N /d%lxXD{TIU«"z2nUQxB *Vlp8vUeCb*E!)Χ׎Wbb[^OBrTPVCɪ9Xu>}Z0Ūp,QՒQ$:>`+FԥX oi *GUJ+v!%{[*|(U-"&t^I endstream endobj 3059 0 obj << /Length 920 /Filter /FlateDecode >> stream xڵX[O0}ﯰx!Vk.hC* U BBa;ω7){|ל+Z#ww(ZQ+|DvRjaɮeYGh2L̚P9XHh%l4eudcLM\@f{.0`yyE8>q`ڹG`(A{%wf V :/sQr0ԋX-Zŝ.D>j)Pf@M<(u0MO(ǂ׃!Myk ]Q#!uB¹x0A  "U_;vE$jI"l``& lcD/w[2h`]Q#uXWr @90)"0}J 8(hWHAW= ௝v α"A~wgtW>g#i,#lrE. ^q\r%Zf2FxI1Vy=Lw?BYʹΏ%ϫ?9cȷITcmt3c4֢]RXczT#%HVOMDD60HDl#V"%WR $\MD g'ý\_g)|o9ҜZ0{9|,)R\YΧq1.l\rۣ8ElJ|+=y2=*74.slck.uTDŽHì 'XBau5@moor- uC-;D8+lm$ 㢒 ~fYHY: $r\_?d%(K5j`yPPAv#]#Xq&"~R endstream endobj 2948 0 obj << /Type /ObjStm /N 100 /First 976 /Length 2239 /Filter /FlateDecode >> stream xZmo7_͇rFA 4 AVֶ.֐縿Td[owgCr8/p%g0:P 3%z|TLD0%&%xO*HBQHY}]*s1%Œ3^\} D^&,N0x0e( CT#ʏ*m!^Nb /;*JhB*]N&oq JAX@K$g zat+QU 6(P.Eav*duNl$8+.1թ%d"I9 *9e#NwJS%X01;V 4@W(ULr.a@ŢI,uM:ÓIRxRgd:R)BX/3*X4Aa*T6ٓJJ*V>6 ϡX09BgȌ-0ԐLƠRXNnR@ >`Pd%Wt.|N|Ј˂R=]8 0!"ý !&.ȒReRAl PbRxt||Լ4q4v я?VWݤ7ǦyE:?@g>O׼vwmo>Wy~%^x18o|;guum;뮧vvuui4b>8 k^SV( w'I>ܡSsD\%jGOS;[__qNul `&s wק=l~M>7'ud؏I_w}CӜnz܌>7MBՠdZ6HJ0I_ҳu ;](ٔBA>nvՎǣvjϦ]N"o5+qDjm@yk1g^|?gUv<25ۋr^|<)y.NJ )u2M*`Ӷ}Tz}}*x DһbũǞT`zgt;LnVm)GE;`hGxtLl ,_( cйKЉ\@;i@@=H9<'\"YP$2M`x=-\z85xXB[;PsddLQ9DOC]FTT>-xh! -fŒăe)X&y&"g"z OY?jg{y<)ODp]B0(l#83c\קsC6u;mq2 ~[K$EHzuwO37){`SV@=뵯 rO۾iOygO)U8X6L4*B;tuʚR^96֛~{b:LsWI̮ڶMs;i Ţ X]7HW? hr֭8&lYb"yPbfl޶ Z.n@c6- "kΒ8PKL8~x1m6,+WuîU?ThFR.H>j#U5 뗯P!r%"Vɭld3L*ճowEU~$4 8fw le~Ҷӈ'h՜arȂޣp$=9BS|>P?RO"lJuT?H Iݱ%o-ל~v,kpI ,lF4Z%R6ɡO_ A;#T+qś!RҸ 02̛(;icX5mv{z@~,#CT"3^³lɮZ7]dam.~^N:D endstream endobj 3065 0 obj << /Length 1070 /Filter /FlateDecode >> stream xڭWmo6_!K$b&J6뺠h@ Z"9Zdɐd$#uWn E=wG>w7Je317yĥu BbI lؔ Z6(|M[#-YW}^~HqAs䝔7jHᓦ:(e#(zO w{pt[tl4,93 ҳҬA~ K;p^NeJ'A~Ew6,&!;%Ty5v> stream xڽko8~E0PX\I_ŭ@VǺ9lVim0E+"Lr͸I R`R)$G>suQfQ}dmj6ߑ` K4Og.x7%}>De^ 8"1ūr_&yD7kaa)6sƘ!a-&UI1 QŞޘ_ýnT%_ m⨂GArEחbHZt`/^G+ސ qu;E{oL =tԖQ=0e nȸ]=.v(҆.9VQ%uRwPZqrAd d^Gu,감P- sQm?lk,ymvWTn'ϵ5~޹G֧xY@v-S9qč rsi WZgteҨČdA@mgZwdBP;̒(M,Vk{:g2v+&_4$mdτE1{¯d4H!nq_$ 6$yUG9^UUcB dž΅U"5SnA qqxmtI w6ƑBJ ˘RÂ:,݇!a_T +[,ʬL&Z6ۡfu:`/:aE"!KIzQHYaQ%RޤeFP51( B*m7BDXb <9v MLm胊2ȸ\I,J`#zjm6ҸTN!xTmUBmeP;"WtQɊA\x*;+*}NVjn>Q*} DmZHs&&TdqEKU.mVQ=zmE.ebp3M2ȡa%@QFWKSs x\Kd\+ReG/cq[WUb. m(%. r !zsqm:O|j JSKjjTIh=C1 \+.@M2itcڃ#ZuymGW.2=1mķP—v>^U %0Hg=/rXg@-8ݘ浠ZRyqfb7 q43ٶ沯m[;`ЧN7ې0vf&@PW>d2*zOebtsA+ ]K` / J!.UUj?t-Q4VSid8\]` *XM UH5v7TQ"=LyDL9jm F3Mjo 4MQ*EL2wgCrEK!p NO*MդN'gpIO5''g1[6+ns@Bs dZ$Ppgz?B endstream endobj 3073 0 obj << /Length 1591 /Filter /FlateDecode >> stream xڽX7_/)Y>Q{RH! P> ܊d7샃3{^U?Da37NggGO^dIzI<dNvOsD㹾גߒ^Ԓ'/lơ{sa:STY9sN 5 e]fߐ΍Ն(P67)޴uA34;YbSʫw\[N))LVDM#.a!JaP_OS U=mZ(7[wqq1~j%oH&~jq_ʌ$Qi+3b`pEǖa=_h\b?N'"6ֆ{ [!d]%Dp28ѷSk "uWwN}Ko Č]Wx_?p9WrOfhjtO9N nf̻zaJgT*Y}74b7:rkWlJG .+*bLv:4?Njouؑ"VPOΆ#D![p%t /%MW"P3J la q(6 SA߸X":FB |Ƣ@_\؅OއaAט" H;|Bԅ(cNQt,UZPan 9Y6JrkLKpҤ`uq0^Swڠi> h2ېTxՅ7t?@w嶱O>nᖼ;^R֨o.)aҼkFдYBjiAf?k*͠N8݀C=倚qL~r " endstream endobj 3077 0 obj << /Length 1694 /Filter /FlateDecode >> stream xڝWmo6_a("+z n[b@ :L\e);,KN}#܋,}x[zed1g,a$l]\\Eލȿծ\[tqz~vz_vv}F`˧dQtzvw%Eu{]VKUѧjU6A;퐒4-4 <}f?uq>iD^@B憔 3Bv $x[nltdʧ.Sp@<ϛ$rdgw?~}G>, aXF}%V|W9K RѬWRz:ji*MrJM oݥXY=UZ%4[^8 Nєt>sWWwZɺQR(!$N;됰w,ce/<"i< n`(j7[{%Uu0vȽA޸3趵K@ !!|:^.|WFl6n폐8?KlNxc>e$L3Oh> stream xڥX_6O(YwE X`R- M$u4߾(y\ER%/7?ooa6Zz0ba8K4v)yr,5-{ +GDYu׻zStiWvsX_t 4L8Om4M+Qw[=T~}ϰ5M_I  %yR%IqKɓCY+iB8Dr(:d B Ǐm h<MGJ%.p ]_I'bwe_65+t[v U?U5nnHs>sKM_`ؐLT)Ba|l|'zEx=IEQWtYGN6s_GRPbUFɈce(6wfUh(& eUcFm,MV B=jQ{aZqX`;537QUn\9WWFj BU$^jWV;g/'sy]P$2Q$!pV2V[krDdeP,2dS9˕cKM"eir:DrdOgLʇZ' ˙M3oˤY<=Eik&ߞq\YcGn#1k5Nipo@ 8i 'jY* y`n*E^{:tnqs&W[.%mySmK},r47BxIyufs>b-8-X`y*Zi P"өf&B+QG QuMnx)^.42 9ca"&U0Ԏ095r$_;J9&4쏆G27~ fc{ z!sa+&uBqGjF^sh="Xܓonq+8U u8--3]!0P߱GEUka@o}q: =xE*4habޠ63ճs:G^#.:|Ѓ_" /aV|$/N<#&>gn{mqB4×8-Կo) endstream endobj 3087 0 obj << /Length 1637 /Filter /FlateDecode >> stream xڽXmo6_!(*5+@ @a@ɰmQ(6mk%Wf~w,9v!hy<>{x/eE'g/.U"OT\/TDz_z5*kfזuE\аun#8)f,zW/缡ҁ=3 .'q pDT— ʒDj2#w&ӬoKmgd3&S}B:9;Y[8m6e 67P/x[!6KsXs'Qÿ&鎞 -in7H0R%Eyg]qk.SRQ-LzڄMZCm)e"/oISjyNk -Y&2thζ,QV4'P?-me vxjf/w{@-b B7~+7`?oraw4k캠0_lz7UwN3ǣ6"1:U!gF!&h7yJ>|&AE OX3Y0ۜsXCzM 0n[WgP:$m[ $e"1A,cOYJI2ڻ^"`CR"3cxSy"]#Eяb?I2aי'sZ\A>XW?a3T7@|_P +f#j>lF')P0߻<&iQX/MLg{Y-El :D*Wf5@Er_nYN-^t&+l%tG1l'xs;&90#r#_NCSJof+!cK0O8ZoSҶ4'PrY~/*_ՠ9~Y!OX.F^;]hPT2;>/8y|z?8U}!#0(b(u'UD~RDH@> stream xVKO0+JHDJA.pS"$β_8vM_,aO33XjX`E/kk>hATs Ft`A kXlcb|x!ȷmrP{s6 1`ӖwxGU%Ho7wW#oy$F  2WBX+V*j*j)jW.dT۟~iC>4whZ痓YSaO EuPpZP602DT~vrc.lit+;gk5 zʦ!yɯ>uuHL4 +|*0s)xf2~, ˂IDYb^d$IR>HxI*9!sZ4ZHKJM%u0Hp←[%EigyIVee*nI\H~ⰜA稭 EXQM^咙1ΙEF7!9yB4)^a CIA=RQ$/QLr;vG*wr5[~E{DoY)?"ѷ02-pU9ZW`q 8Ŷog3K8qO%gf \` ,5 {-k.&BVc[*(ILz|F,`+ڄ0ɨ`΢rr6Qg`|8 d p\U11w1mzguLj6AK6AdYp`wov1~o{ll =<HlGb;ȿ\[F%% <oUp;2N endstream endobj 3095 0 obj << /Length 1194 /Filter /FlateDecode >> stream xWKo8W@Ē2vAk /Eam)GSbh(YG[6GᐜG#>qӾ~'QBOz|ˑ/8?%Odl rL k V Q07LsAe2Ț(m^)+m MRhaJJN2+,Lz6RzN t ҦS % =͎`ӠY0ܟɂ&BFV"m^aC$,QEҚҊQ׼#k^Ydv ˇa]wwyӭ![Al.B7kܬh">sLNW0ΗOr5 㱦:kb>۪P҃=dȂSpcO; endstream endobj 3099 0 obj << /Length 1805 /Filter /FlateDecode >> stream xڽ]oF콿PbUߒ5@A6+V{XAꤴ>ȓ%Yv Cr#y={bz3}eIy!X;<, X樬 Z)홒( 6YTSrCx.d ԁsyM8#fzk@69l.u1>+j`"!<ϔT߉O(n:;g޿}%LR?_#K֠JUa-!DN`^]^=^}^^C^#^c-֬%tLy38{ ( ,zw]rkd;'kq>Y [6iS9I?ܼWM9mG.g+F$0M]/ӛF4. ,r[ f[{vD FĺI;]霍a4n{ݶ8FZ@c'ơ endstream endobj 3103 0 obj << /Length 1822 /Filter /FlateDecode >> stream xڵXmo6_a5+[H.f`ڢl:*KD5ɿ%[yA~1Oxvg73wvµ_d$r3Yl}tgs \g$者A8>F wjy, :n4 S/{끙̑?&tcеǿ|ww{˯B^-_1wZbllh@0 |IS/@\~ˈ요C [@b@A IFI }gvj%\Dɠވ hYeGb)]I7STR.-.:@.Þx76O -p8g>~C7MC]xB)tG6MÛ{. įo]3V$aJ;Ө[AR0Z51Ьmعq8e %@zCaܿCJiȢ4f FtrUɧn(.kFA@D/ 8 c G=V5P}GlIl(3cLXmPf8{xEZ өbYg]ċM],$"U@f?9fty2Ilk&OȐUPY-̙:NQ+k{A矏ZXdMQ#l/qʴ9syFTď DuRB|y )_ ƶQ6٬kig^1V\*4YweMoMOC V%]'֙ص4f\R} pA5^nj1O`i <47x}ӷs7'$7k%Evf%Ϻ46=P *ꉀFY1XгI֔}+3[G}-;]Ki5<49>ͬmbֶ4/=:XUꃿGfHw6Jho7WGCAN endstream endobj 3111 0 obj << /Length 1406 /Filter /FlateDecode >> stream xWmo6_!Kd,Vf-[\CZD\dfQu>#y/<>bZ[uk?b'ZoMz<9ozW׽: GmheLƊ:A,%XIInڂ :ALBQ8DdkS{ZUb+rVVz(֊{ T1ȃ? Zٕr]3M}N@ƞGK&e'=uI]]-YzanIeK)I> ahB' `AhX8[nBSd)DxLJī5<{MS>zpqpRnz%$b-< 1o@xA;6M>Cf8 ZX.dS`RYiAm`FHN2_&erj+VD( Ǭ BLbf &}@k*H.hL(^-oaU2۹Qoٱlat*rEKHKv-ҬFaE ]'}ʃ?U'B?DG sȡ QXy3bUWG \S[(i4ҸDJUfITD*Ge )(c;Ե6HH1w2|8~<7bAx"E> 0,xsNm|Ěb1*IL+FAQ#.tclN#}C[fF?j/Kx6GP3\]uq+ |1xqlPqU9+6{cz r zܿO64y|/863>o]fvY^,Ndz\> stream xX[6~ϯ0V]&=uчhRzpFtl77ŤyOC_g D%b["t.?x0%N M; 4̎V +R/Zl< _Rd$k;K cxZOE&S)xqwm^[StZ 8$E샽aLu3;A-6ꂍ52 .x2r]ޮi+Gt!&W"f^\f_W$aa:Cח"H( G8 ƮY޸|XY63qj,̙ Ĉ`תښ45) BBV'7%ZYhI!LYR3T1-!U r@$,)"O?$]I>- #JlGPlohjZMZn/ĭQ5͝V@2G`AݩHe4t1sz?mgrЁ1Cق1; Rܢ*O8e0UkRߩ(OP4YR6X97 "G3 LM ΏZu00޸kY鵸 9F!l4D d`ˡa9Dٴ=}g_} cHW^]T|Sv#Nb"1Q)osTim蓅ptFht׺{a^Q4oV!cݥ~n?(|>(~+#ZU޾/j+GvC%o8ǁz`?! qӉԜYeFLY(#`/vs siԷ oHEM P0.zzr\ cR?"7͈$<+y$pY JK>RKy`"9 ɏ Nמën:*VXN*h`t@[1|L*TT Ӳ2gC 0-ij:N( /'ݙOzXfwS@U4(2[Q4jhv؃T#=P#ns[%@<=|,ZNo28~C"Ϯ$H@ȱ5qubx"؎ab1({6n )UKFb1ALWP31չ{ytGY> \w,9'vi!f1dpxjd 7㡞[ED;`KQnLg#9:RrJ9FOEƽ̸}C %̹} {eiiUdmspePܡM@WU'Wm )H[",vU8 Xl1xGZ5lv.a2{a~nY(o-յ. K޲*՚iKk=nʼnژtƕ= b7G.8OǞ&iap8DV94s귥ڍf=^D)joz%~|"éc{ *2ۀwxLO;00?tw9,$^E ,hyUp& endstream endobj 3121 0 obj << /Length 1728 /Filter /FlateDecode >> stream xnF2C&h(ЃҠ]K+5Ud ȿwfghqЃp;o"\\? /^={V2(3-VE.ya/V{իWK?0 /Z~X ( 4%_}wAWo怫#ק[!i s9gb' >"k2ēdd>oxAYjY:}#o+e{UK4K?/+&τH6ZR^oAr XFrBM/۵2`UIfmb~/P}bk|mjV4e4 v8M7Č2ZXS%5}UtK;Ku,TŘj*֧ף&,pI\xkTH7tCQFJbPy_yOTe%R; lKU"1Xѭ#llXU?FV-1jS۝fՂCz*Ǟo#țJՆp"j-kB'ԪawU'R XpBz';@7]BLenY CCM#L lfclrct} qКLenޟj l9kPqB3khp#׷;)VdĽ(["N`7 JEekcNuD#m71k` Zd_9%ѩ-1z6%7fhܩCYwtHMWUd l.jQ5`0\s#/\_OSo'Ԡ2\IBNP5p {z2CF0pjf;!=;%HbŽDFIx y>: N-< \(r Tc#ddU9~QS|(LdA9jivZ=4Ƃe !>Wx[&}P4<ɀhGDiM.Kf/}YtQW6[(QieN9eM eٿ'Y}4@ܦg^Jd;]줝;O7m]0$afohmgdŻ`պQ9qs^h?Cvr\ fժ+dF]xեm 7o#~R'*pfae)nCVGɖ5QaG~yl]Zݳ]k^ZYOMLWlMYOmLadG=Oc#40lwN?VWon@D-a4<bQ[N[BZ2( j(DrF? endstream endobj 3125 0 obj << /Length 1842 /Filter /FlateDecode >> stream xڭnF=_!E`1cX?`,-vV$Jg/FWvz~)x3GC*>} `fQ #NyD[͑Sۂ7PՌ)Px$,,0xO>*Г7SzuB~Lz F(4BЛ`!Q~G*s bsϮZW'0vOOUT9/ 'xLxD|溺3)Wޭ!ZpC%ApB<0Bh#joI‍U8۱P-q3L0C,>iпre%PsGfo>HkDэh>L|<|_7lC g-Ay_w`-s?AZhh=Gc1<_9ĎcLы%@iR\[hvz㩦2WXݭXtZti{?d祂0dVK}kzx_(9OsB?:lNvD2p}) }d({kk6=cvŜcOʮӛh_Z\ O -~7(arZ 5*Gt>%D2UKI2v"-Ҟu2/t n %khgnK!0ZnXx > stream xVmo6_!$ VEI vsF@;CȴU\;)Xy> 0,ܑsyW.^-7xk/Ead^>wц7`/4a,O[,b1ѫ/-Ϋ%ىګe~d2J,g*$I__ c"sͤ_p HnˍIv*hX 5IJ[]|WX) +vs'8.L㩿S1h6$kq|mox4?&w:ΗiLJE$pO} ӈmFOfc;T1VQffi8O! uC$%/A8NHgęoj8/7$q87X*]<+?SnK>;;=W t|.͵YJ~׶7o4:IGD+ε U<8䠱Sp#z!Y vbkoy l3? a~EMhR ζeit:_`A+@w$D wJs0v:z9zլhMmz8.8/!"t OA8s5f^^I{m(Nc± ;Ⱥ,nƕTJnEe$7lxmW,F6OŒKwAva^nw樰Q2o6qmlMBS4}-JXv= H#V*luD:ڢ8|mڪ>"+;L@ώ@wεh"e-m7D*=sW+{U>|1K{uD+@>Cx1d,f M<H\\T endstream endobj 3135 0 obj << /Length 2214 /Filter /FlateDecode >> stream xڽX[ܶ~_!ˈKEݦ@Q^(j83uK>jٙfyG߹3vQ&Ҿ]ZE4QFLD&1~NuFz-uNL֌}g>CyE۟I)*N!]]c;sv)v´Ll)JrIY\<'SY$OeVVVz3g$ӗ^+}W.$*!UFu[fp˴;s 5 f4u(Vr'ގ:f|hhƦenVR.xLBJE* ['E|o&":eR-J;XD}.рP A%T^E=6-b0Z-=@DUVkGNdJyD*øAd?LA'KuMg'vCXlOx^.Wu}ˎrׁ6r6tmyk0çgn.Oe(>{I7vk-Q^Ι bRVًuQ$ ! 'M4_0'GY1CYȻb.@NtՌ *Ny(!e{)-~AF4hqиD`O4N |a@:^FT,hAL^5"_x$H)- ;b%i&76G sJ[3yZY†*^3ÖZ9`T"6拗0Z]{Q(:0wNeV@. fZoԨS/(|s{{ACQ3F'znbklu!auUAS@Ka4pt&?abLov<[L"ߜLj_SsM08߁2ieOg0&x`<\ow욞7jz!|~̦ Bsp Hkv G5d!bNmH3GH<0ܚvwSVxqy8<Аm] ߀b 5b~rΏڡ?;[j" ^ aLY^KFtˬ,\fUYUlq0¿;60#@% A!% ͳ2vOh&2Yceb.{*̉H\Bfh~̐.u+!> stream xڥYY8~ϯ0h+E]d͠q0;dnNt8Nbeɭ$=KQ, V|\>{6U4 JWAxlrG۽EMȼ~k+\]!R~E/7mz6ts쮭OE[,jj#霋w |+ݡe&uG2sdRHecHukzċgP) 3fh`@4ڴݯ7IͲ , !H`pޫ;I`% cW=-F`Zk:89yBG8_o<^wZ !u82+(Gnu+w ͱ81!ZOGZ)kAШhxJ~-aPkc/Ɲe֒? 8&zT;Sf4Vٽ4R C%| `=j%Z2b!>zjF4,K 4t a&_x]N!N7HN6{2Y Fq`,eIŷ:FCiӌ:b85ٛ'H+ @@(0U[p(v>mi&ctSX^; nρdfA2J8CIk|nY^|hǡ/^;\̣N5x15vFzAnQā5!'Y8pn@{=0$wk}茛W Rod1Vj~fb}gʊXDSC:u5:B)l+`, HQ3A2` Ëpni4G߅4dV$,OA,|$\~[ hZ$;P\D- i-̏/ttڷD,!qp9 .C2r@pG,;IpN&` aH~ Lz774$JE`r $rќ Jn/3܏ -BgZ'ڪ`Q'*<~9%"ݒRװR~Wo$v%F@g{Gr3MX4%vk7:TL.BF  2  0yRGgD(DTqfEz|q=$Ȭ`T;C&J"?#NUpbJ\2d`K ?G0 L"N3fPq\~L $?LՔ*@:8r`w UTu0lIa2OU}s5ɲ噧΋6ILb~9hAn *I1aynpFkiNa8?-asCєʹѣIEn`.ku4Qն0;I O*Z{.n'Xtݩ0sؖEAZ+tΝ xmtҮ  L/ney:^, CWłA{xɆ/o3=֥9܌  0BYaHƏءs±Yl¢tg, +״%1Dt횹ilKIj<2cxO!uguBTClNl lMMY`TZSS >}ζi6E̚ZxmNy@x̽h&K_f/EֺBpiBe]֔!Ŗkkǩ 0xbNy/nwsAE[ i07BoTz.Iɰ|$E\yQCpBҭ=A`^%Qu)w endstream endobj 3144 0 obj << /Length 1630 /Filter /FlateDecode >> stream xڵXmo6_aKd,V%Jm fib:0EA˴N]˿&i~HD;xC \> ً,Lɘ e4 J~o8 $..go_z((Т?9Q$׺))tS 9 IT؈Ɉ)'[#\8jI_IZ\PF[n-Zg}3 =^ #jMJxqۯ@_$I1yb; >a\r!=$]VG)JტC_ǡQ;8fyL\ltRpSݑFw!{RJV.UQ(uӍmS̟Dٞ:#ظMdB(m{CZ%gggQw+꼤O!$^k]~~E{-Z_En7ͣd<>d$C2Jh1Fδ! DwBB8hxC&hVD7E;s{o䐫AJJjb$R%7RUN?!mhֵjVkM66RDml,Hn ^q;x)n`xG!2 Blm5 s-?fS,KIyVZbh[غxUY"dSw3 ꊠrB;j15 DYAS 6-Mt{VWh5|DbbsA%Ôӆc$t'ɄK^hEf` iU $\6U iPNi],*rlzm+[NOU&GTqcҢ (8|7>9O7M?@QiEMtQi(FAtv'i8ywvrk76ǴFO,D.9q$*ݻg.{eN .u _4%/6XiYJ1knMmJ?lÛ `W+LjlD*޴e,ס]ƌz[މmY;r.Cpp71q%J$vgHbFT\q(rJޥ>|2Y<|ӗľ[vHbR;Da6]OrD[,g梅ة;> stream x}Rˎ +WcĕTUTWQ1X@T8sL;gR@3 t:%iIʸ܊F\Lva";s6ShXcX;hdm'J>z`~,uaR ;/R{#-r&?ts!>Oݥ~SI)FVM/fKͥs*d͘p)51 Iŭ"-  9F;([H[,kǴ߾ػ_rZ`<*ggfppqv^}J31`Bi־t-xDKsy,Gw\ A_-wKH9Ƶ3a\ȍg`I - H<5? endstream endobj 3157 0 obj << /Length 2207 /Filter /FlateDecode >> stream xڭXK ϯ-=UlKIaכczr}H~@Ԗgr$ )\z%͛8[RdY.n<^d:ZS{^/uF*rObID^ YbD(n0):_XUĕ*Q+Qoika}5[&m8븈$Lg7Y\JӺٟŏD}֬9h1Xn56mez^d5. f鎫,jgkK#mڮs lLoh4q'|yTIҼGy̒G#{_pR&Z&Gʾmpv$Ge2jCõuLYdkKӣ®A-Wa(Ė%QnlӤ?Ml?gzBkvY^ꇺmkzСDXԭG/]&`PZN$OD䠛"YNeJzHWpkG;jjL$C]/UԂ)aL 3rG=: }ܮ腥*bc7@ڌ f/| rpQp77U@xe([̱8]}~bmX);HFb!e/s4 @А*bOF1I,t숈3H և? zc9~I-]k'q[wG໐0R R,.K[?%-'JǙHYL!i^OHpE[_`I%~-t>BٺԅIWLmS fèGw@6CKӢm n"S/,UV\PoY'gY'I 7o9Hw&\&COqB8Pσ-+#%}>}J6n|ATxVb|6;,]pYGdƏ W{?8^auYYSC74GB4i>[y9D@"i^vsez|vݙ9;]?ek+$5t43f1bZ2d%sEQ07eL!MgWc WP䳡&SPA-6h]AAy XDՄU>r}!b,g(9RbcMPA"v|(ٶ fFxW ?1e[.z-s"]˿}ecǃ!fdIjt;fEM;n\F !,ǎ33*kPv!UئpxN.m] >` \qXqSM9 TW #0'u29P~ p||.u*Z(S9l,QQӀ١ 79`yT>_˞űox8--ŖZ18v,6+,>{\o;s  1p3U!i>ȆwGcB?zr:z}{?h endstream endobj 3166 0 obj << /Length 2906 /Filter /FlateDecode >> stream xZKsܸWT%oЮ=:vj7UɦVjjI,sHZV~}5fH. `|D^?go?UF2jJӔ\.կIU6o<ɦ$2|뵭m#6d5~ĿSWڶJ}GgmHl៯0sY8a|W6ug콻)7(&b.݄5$ooMTҞ$f_-<_ "~b M*aTDnQsș TaLˉf2߻7Ve'9_ AVit7y dMMJa{=Paݕ;:(!M쭃q'rkv̮e@!Rawڄ6Ӧmv'c$C@Hj9&a쩳aĵd{}qu q\LA^vB0ا :,!=܋Dr> %AZQ"sFDJ+0& RI)S&mi\; ĒdA:wףFb۶}- [^߸@_ppk;g|7>+ Vx=%*]˪qw`W^ӹд|M8k/ws >T4i|x,|ܭx>v˳`:^k1G\/$ A7􀡁A8}t)\Cy>۰ E˽6Ȧ׽A}{Aύ(D}ytn=aۼ~|`mO]_,zsZLϲ."ԍdnuI*!"Ld\j1M.\{)/=$.l~2\;PČVUY^t ]5SVmĨ9bQserC،!#Ǖ&q )6'#5ъ>pssԋX̨ƌ <f >IZPixg;\_w sBжM17d J!/bkGV_[W}ݰn<CwӴ;ۅķP3F$SuHd$! clI(rk`7e1ݮͧ<;yβeG lۼ@^>69ߝsJAUjAO+daQŶvOȸC;2H.S/;.0R2$î_&POHBK1dGvlIcMFRG֌`Y'mv@ =T]hI蘓IBѵ"B\?2#bZ[WȈ{"޺ t8aúbk'ҳY&1'|[l-] 4&S]szc )%;'f_ R3Ѷ/`c52fP̾YshK SAzZ|k! ׯq^) }!7 $Ǖy1!28^" Ȍ0 ,&$_۷2APJ^Nbv4GJqG4 ;dSZ ܃ N}^"9x&1<  ?iw7eSd$Lg,8La/1 pΈb :ⴉ{Ncf*{SIjX&ṾKt_M[q>;>?spFQM _>.L ~~ ?y}5~Ybz]4t`AcDODgp( bvpEN⩦pfc{.De\RXDP)dr؂5\AKt wH0=T1i)O" ’< O.ֳLi5`4pM8O̶pcz9Pϝ&I YdE lx7Ch22qUcLCmezJ1Ӑcwoç9h;h2HM,>JEOԣxY#e/K=GgufAu-ڒs qֱGJW؃bpIoioaN&p KB6:}ތAh T/1M(,5D;>=T}srnk([UoPtM],;re4ޥ:YVᮾj6\ m܆+qnxǬi*a1[~w?d:gQCq$^(8 2+ endstream endobj 3062 0 obj << /Type /ObjStm /N 100 /First 961 /Length 1750 /Filter /FlateDecode >> stream xYnF}WcF'-)0 YfmR3+%5%ʢE~3$gggue'Q.𿷂2&-b4B/@DD󛠄,A8׀n/ZxŊD 3o")b"X e7?ˉJVQKRF1,%Xc]{A.k CؐHNclib0H@\^H)&l@85P5療8 AX=7: #.]@r :ӎWh>q$ \`@leG*JƁDGoI3jhʺX5;l<"6րȋ.Ê;-Iր` UƂJybG$ cM@X6`A,wH=N;XTbs`A%0#IflyyMYyMtF!A|t&7r R. W"0A͛!,K!)=88 8"?_D|r#ܜ޼Gu586UG0ZS~gqR˙8G\7!nK|^lxTNdTNi#DᅇOOp՜|f\mB2f93iob~a~b~lia\:;C:vm@Q$~G`o4([2Rx)ԂUUkXER9GÐHRG/{"<[hzrO2Ir'|OBBl+:{e-^mi)ž--3tY=7N1GN+ 9aW@x HIs.&x:rb@+aLԂqd@<ê!d1>yd[+0xEvP'$oN;<SmIc$ocJ:kup^=1%=bFdZ̘Ӈ⳦5N3:Ԃ\DZ4A]+w!ZqoZ?7֮CgYӦھ„9UEzȩbҋ9[*`eZrs+a/r\LԷbBڣGh#?VcQX~5JyQ^uņT4 ȣD>r1U)GrB)b0Y+\eIdžNq2xxt0U7MMdvF H E,ڞc@3>uGsӈ2X aΨH/{9 endstream endobj 3173 0 obj << /Length 2933 /Filter /FlateDecode >> stream xZKs6Wpor 0S{lV:[Ɂh[ktHi<ίn4@!fn2^}󣴙,7FfqeZjZ` ̖nSԋ|r[`lx6)z.m>[;;h-D YQmʶ.6HSVDT7[t6icFLW bYUlRs95DsaVr#cIX%Iq9#8-L.- ^o US?LYn]ݪ\{5{?x(Ⱥ EE))eGC#& @b0:~6- |pf6|ݪaWLX.Q==4ޢN 8 }RԹ q\o4Қ nbl"ںoIB $ rɸǴCI9`Koa9!^9M~ 3I*3_y9P.S^:3 :<_h=#3ѢMNp Ō\Lz7&kV8MFdflD䣇R d ZqI+Ѕdκv U33h1Ìـ=|b9l*}XN3/nJJм)&p5i*ymQ9an ncp9 v;TnpzE09lm6mؠ T\lY*zBX"RQ3PVq,Pqj]< i| 4~JcE|np8W7VK!hqh>~ah0bV! ,M\ޅӥ``@ `AG HEM?pN-$mg9"'OLq'@y.3rB8E/ CBb~_vb_sάR#PStΙ@@ ދSJG~ϕ:" 5 xfR2lNܺc@H5Rp"^ ?*;P >yBJ+ 35: hb&5ĵQo'nO13 M^ &}l$ 9*P2YcWN^n5!jﶢ _+>yQKYi_$heM$U-NrSnE8JIQ$s{cbh '݉$5vF]onwVu'3EL܌1,$`!ra!7 ' /)jp.5V+',{n) ~RI_v0d":M&U(mSwןԓVMcA("hxB$LRELوBEdFL|2 p Nj*qPvʡ&dXPDPD(Ϣ?"2L*E@T(xf>g>. Pv 0k*P0RNV! qD8! 鳔obHJT2@ˏ =db0U퇩։ cn}v pL`-|ţzƱ:4K CRG=|p؏ F Ț8s۠P4w]rh*0`%?~]fy≵>|(!n$!8f{Pti# g=fg0Rz7#, 8jp9]JQLjXRmPZ]4`[ N]9;`e[Ul d^#rż}605,!1gak4FΎFgBϫ۔Œ6nJohˇmUpT_,uACAƷ b R_pd> stream x˒>_S"U`Han%8I9U=p$,)>F7=2FoL^E.u+)ɓ]v}Uw7R<24\EAȿHc7O2Q!j&dX XG1Y9Ha1ؙ̍Aah ac "ɧ&VB`#ej7~1F}EC;rA$`Y?ڙ( ~مa &)>y}xi%S8z0PC?o7g~˺?zm]\2TwòѠdy [2Z֐[4}ʦy M8P6!i]Uj;-1fN#k/e,!Fդ8:t ?,yiȃ lf~Nh@v!2 r24rpFܑOIpTR%#IݏNM8jvR1e,dlRҏ/S+a@5U @geeB9(kkX_m#܂L; CsKVdC C7L8I=vh jf^Ā4!$SДT4(SPk{`QگsC<\Oь`&a.̓ممe2`P ArޮVp,XL'Gs2<@-C"=fԋYv׆/|q %Pjթ~kBp)\d8HH͈}QvQ)pW9R ai?bXGnwp]6P#17UOCjxK`DG_`Wt# 8X޷.xwu4YRf15I۶w='9bP6L*eM)tA%AYͫO8$i6cׇٕbv}[TE@dǧdDN~[Echޞ{}%=<M^6'lJ,ʶm7@2j̛a`I֜o:p?ȣحY.fC;U[\[xOvڙ m;qUwo d#pu &5V[̓(쩩Ñֻ?7lCv=A3!`˟!Ħ9 #)o&!~RbсGGTv6|SE/RB`lI_,y}  ,1)'1ې֌{XSn䑊Ʀâ9\ `Q'q)w1>c_3;t3^?ZH淼2T/rpH-^履NX؎~ڿ)(7} ‡vMR~0 endstream endobj 3194 0 obj << /Length 2190 /Filter /FlateDecode >> stream xڭɒ6_* Ulj3Kfjmh K|P8 _twdi*Ww\rWnO.ubZdX(ᫍ(*J:a]XI~`ViohaWSm -?THZɯ4K>7LzY%/YZ@}ݳapNkT)z\2K3⴬F(7 ⪴qԃݡ1ov'x#,Jo߾]oR&C,.Ds֭YozfT*&9\Wdf2/N֠)ȝT "U Qx!7n1Yz HQ.b7&I*;tE>"9?+8( GۗfJg%s8a  _=mc~< Sm5 4/<-.ނ'C_״֭xVl)m܆J?Mok HМVFM\N,bG T.qH&V wIE8bo,;VԿuS0s'u,b)Vz|/:,o*P9>3pAߴ A endstream endobj 3201 0 obj << /Length 2229 /Filter /FlateDecode >> stream xYY~_7S}M@|<2ȋ⌘ Ie$5f _ľT]Uu]o77Wo}P&Y&UT"v)zvgDZ|}]@uzMkjn lRdhryNJ$0{(C:P6vo>rcu3v-˟ciKmٻLFdƀ0X@_:OdliQ8eTEo\⃼&ퟛ&Gi~'dK.΃̬M;f2jUWZ;eg]~9v_ڀBi/>+coJ3 L 4qwFii=LQ8t.Id݊8Jg¥~x)WD E2ʟyAl :OwIJ!@ҾvFHD nn*c=yx<@4CZO#T߀*[j"|n%^TQYtxUf=b"G.*kvRi_8ޒX&^;Tc %a ~uzui߼mE5O Gd[ OllpXSjj# __,I+lr@p)*%*(tҠ:^e2? «Lƅܬ2mSa cth_umMb+Z"¼j󮇦E_%C(n,b`}E>mY-⊛0D8;7%H}Υ1tC;iȯ+Oy>װl"hB<_iq\TooY&&j.r&1uQ/sKJ\n`"̊eALlۃr@%wsU3C/4ghwy8k0ZdSzjpNJS+8bCKm9z"k?h%dN;1 bKqX/k"USg,%݁sPI|&.xQ8{$~GD?&TO <s Wo 8x2 UuZfQVgg Vk?K>dBAT 8i觌!Ǯt= ״Ѓϧ<>џ0Z!f]Œ^8͓G3*[o>[:U[Vi / vJBM~9MXV[[K 1o @OC^MS`gP=wH)$>Z!0Kk@dCV}].q]kth㴷)ζ~E_~U,ܬ(.H9]gb F=:48}cAWh!7uiTi"mZ#T'`I:q^cA4CS!3Av$Q98Y&t:Ú*1b?CW) L` RZ|gX@3,yZ&3X?nm h"jW ːs@%}\ٱHln8}F=ħi@ϩO}j89! B9,,{a68 pH"-H+=F^ȋ ʶx؛()_#$M5!lzoc>Ls"?swn ELOH"IeZ58:vH(E_e2YF,4wNŰ#N  s&\Y4Šs90{_ǣu2*40'}v{fylgi 럔W}jb=X 0|/`#$ZŻ༲/O= -gw?gρ/ρrM}G׽25`b.<ٱAv%W͊ GkZ3];T0 m+zQ z=΅핣dipA`շo? endstream endobj 3207 0 obj << /Length 2462 /Filter /FlateDecode >> stream xYK6ϯ蛻,J(9!q6ii+?UD5{IUE_o\^n^*J CVBmǰ u`+3AogR(=#?ɎRxA(d|Ɲym"<V/"~ e.֮7AuQC/vyGd4]}^f eSyزv878Pts M2No;x*RKf>?3T濿7zcwoT]lO!ƄxH. Hl@])?'Ӯ,\3P(/n?f*ݩEc܌lluI4FWWwfFJ(S?&fkהf3(Aϓmb/q`]0F ,@AmnJYֺ7&6OD'^p9@Pʊ{006#&&B$Sc ANx 'un|SSE=&D:1J>Y' )t1ľfؽhIcD WTcL Cr Ϭt5(^ߐ(JjuAF ,Ue,c^lFƔt4$[$#{KrSe"Mob 8S% L@BЫp&*2h4 ~Eo|pA#`<(G=7]?| ' o$q&Wɲey\5~*B=q\=_D"GxpCC{8ځ,)ƿSI4IqY3Yʇ4Rh E@`l I&Pm Ӵ,zngT¬]3|FMpp*ݷ5Y4϶:K["wcMRrQ?Xr0Nr)~ya[=dU\O.i+*8L  3`Cيt)Õm`haq fv׿l+*qeݔbjŶ};8#Xp<p9;:~^>d3 Ngy5ТˁPFi*t\J߁s]8ɐueMEvK&cNFNe+LeSrv:6uY\ %gNx6; aqm,6jT)n @)7X:lζyesk'lrdP̥0 %1?S;VKU L$r/f5MpX? ZC}O_H *6*w1em_2dmrY~O$ۢ,z_f`:yTǦ*0uܟtw^`.zkis1 Di&y,Tq,5pn$ChL)7f$beCT}}ޘU}";s*ORUuĠnu:yߔ@` EB4뛫 endstream endobj 3211 0 obj << /Length 3018 /Filter /FlateDecode >> stream xڭZIW̱bq!V`%r}iVO3梱"le2]_&{ &滏+"U.OB, 0˻wQg}̽O8]8Ysث|wžU>Cky훪}9UC= 0swU)z`"UɷK/kzn:LX ^5چ[cFnkA t0` $-h؝δ{3Vl\SK5nљp3Oص(4EA2ε9؀ftHV?(лA"Qd Xj6,Cii%T'iSv3lCZ;AP!upXaΓbtdk$Ѡ,6{{f1%vd3q#}\E>36яyeʕ焸}h ,.v'rύ@pqOe z>"p窞 BxFׯ;Yzf;XFš\.TS;|'@62o9+Ԣ%L*% wz;N=+ {Pp*}'m[$^IL&G 4(׏=n1la'@(x(ϴx `K`K}B>A֙O5*|@?(2ЅL tdE%y̞$鎩m`&XCQa{D9nR0 !0@8ʡvߪjεm\t2zMO!CUFFu^ =@Gl6"9lK@cNxS[Wg# \, ?p^ QZtl .̇r sDv}TκE~UZ#88HcTAju\ḯQ/8KNejLFkŌ"S,؂@; 6/a6`Sm 2Gѽο:K`c2=LC Dculp</8Ӊ!Jayn/'o:]o\PTHUԓZ!WߘJYGu mC;X ͖,b/(L,tkQK{4U-[Q`ɮ]vXdtP4vf ]&_8H_Qut9s9)>ar >V/:Yϖar\ JGyN/c^𰜜T752wǂmIEDuю,mig ^p^ Oeok: d4o7"CGZ]mE84ȓ|D9]{ʖB=ng,^H_Wt*NYcOqWkxsM0Ե̙U|E}GN^;2NPPSA]LiaEg+\wkRd,;Slt[Mt7Q`H ֱ "8WD ޽۶KxysbPeyTTxiΧ,lg^hCC]$- JNJ1a!%4FR&A](薩\5"gj&HM(]"! 0XMQ> stream xڵZKmd)"gs";-RG3H~|X$jcHQǯ/vxU]WC8=,1=NMO ϬGkqXt+ΙISXVE\%I[|ʨBG噑CkjӕZT_s&+Yݐp:VUYgMAw5u/Wé{6W€, "}'Vy۞ - xϨ  oaTT-E{N1 }#0Y8-#{͉] pؔyuF(mvuSv#5K7ȷ~ eTk}$ai#̧:6%+))sJV `e!1c79`ʮXuŖ+)yʌxpmZƀ0(&;Z"6}_SA͍`ϻ`宪!,h/Lfՙ@`$;u*ZkdGtCS堤:oūUvAs4wSeە*>Tmq9)TǢ36M$ML֜q5 MѮҩa.{ ֙!GgҶ>USd&0PMڼyQBҤW =pPfI(3)KZX@bTCtUǗяG%JR|J/bvh=(ipsL_ڳxW[w1aY[ǿCHF>GPLd@`j|%R 3^ hi 7N=%p/C'ΥiSlޞ5^(S,cKxma9/݂^@UIO;i ##ػ=5 ;_~^LTZ&#;DEۦPrP*\e`W` _[zzpwݨz|`dY`0rl*?Ij^Eȱ$b]#v ?`u1-F(3pc3` pﭹu5O\= _q8Aو&![mЫqg>mKЯuv*3f^>jre^Z)lV̪$%n r`=L קÆzFG8dqlO49az@٧S18:R !qė{JENx6I0+XLݠ^c=?90MkuT_Psa 0àZlLG+:tlNaHcOOb ̖e)& tv&=ݗVC2uTu8NGVbHTbvrVyBA<[Є bQKMB/CW-F=AՇz-OFuM늳$rX9/;$}'^Zjy{Y Ȼ ̑E Bdt@1 .7h,B-u!W^}d=WkS*Wt hˣ 'R6YJ(&TK=QRGm $U[WzbpMUL2&ӕ*b[TFt/;n}۸ƕ{VnK-Ͻ׾Y>Dr3W•mqҌp*61˦،h9y֚+_B0rY*Oӓ#z3l9/w|MIӸxp YmXPyyW<j[[d&+8XCElGC!TO(,Rȁ@:l[E>vx^ʁ{'s^V endstream endobj 3222 0 obj << /Length 2769 /Filter /FlateDecode >> stream xڵ˒۸БʇlMUً'SBRO%nt($'h&Md?bSU.q#2""6m?228IR]Əziaߵ[YFۺ}q#Bc!,"E$uGTtugg=FfdqlvTK3Lf|}~KF\EYWY☠D,>@l`LkAř=`wY,S;.vE `M2 ɦ7,қavp a݁}/^v"OӐQ,#l[[Ƴ$N+Qsf`J0'` =\*ˬ {ҢQ^8)h"C Y"p$KFVv_%V, =b(*"+BSbVEr]1n;g30F](}mޝ͡g(wtȓLz8N- =rp %p4}5+55hTU(BCw2)UDcZ74{Gx+,zw\їHXɉiÊhDɁ,pCy3k* 6>o3ҕ#b~i\[?]o%lgWvO]V)h>;Tw15pN1 zԭz$̷GwK׮5+~Wq-&Hr G:M|w6N x́FN)U֍\V"VFoެ3^pKƋJ%4;k5ͫP6xJRHRָq1:ƥC"8VM O\W* 䲤JY2zFЊ٧beMݸujb== ڃ "Nݵ9du81~$[$TP2hyYJgr6tZ}^}tZe@D E1Xq \SzRTZ Ru TZR,[mXm 7e6ؘ1(Җ聇hKEr{pm+aSA|"]z-c\IR藀E±*S5z3^{5U6^/YM2 Jkn*Lw=cwmN.*Og mM.lPљSB Â~4 cC6N]2_q5 WyDz{V9CDgk|eջmsmWS$_Q,@N>s=-%'{! \hmꒊ ~g\ 6ߍ[Z")A6ˈ׭nzqpiAJ5AR+Qi%]W=+h.l "AVJu|.[[mYVPZ`z|8 lrfkܭ6t%\mzGɃ4}BE/#&{cYűOY a%?:rlԱH} ,Yz?@O o.#dB}.& ْK/SOF4GP?5 Ƶ< JVfMGS9Jv*E`H u!M)UӻIUz'z_;<*}(X2GaPެq~6YFkӖ8.y6y<&3ڈ Deߗ[ xp;CS82ElOEſ-~] $ O"s/x@HL=ʊݠ %hu2_xʕ_=Ygs/gpg^kw  XZT6= &h^mky.#_yYC n@[d/^]vn??|fO܉*y!) }߼dmRg^ѩ*4$Q帾G]T! $lTW-skappYt!Ths.Oׯ{9aW$?Cn,4[zz$jzu/~4R5ȱ݅&E-fz\O\Ôtqkԛe^h62.6SG4MmTEX IPF<[sOKF&"ΡK@o^R( endstream endobj 3227 0 obj << /Length 2867 /Filter /FlateDecode >> stream xڵْ_1RՈK൩l&S.=ΡFi7"3"V.qFKzѭ=i<_h]鷉#SyG׻$,cM WzaMd$&J d"IS%it@;V.owՕϛfckC@w"uN-.zy-(41i7\^uBҼuÜy `ľөdӦw{Hi$&4f$ qg_Rd#/6'kZ^<@!WĔpchM③4E #kH#Z=t 5Ab D; 3pf1h57>u<ٛf?pȌ|H.d<"D464 uUd]W KHGGٓAZ^x"Ǔ>5ް5t<-b[Zy!,*$Ov|]o[ RM_pz%B}#>Y4,ԾQ"0ֽHo޵*c?~ļ][{ݵpiB1M;_2p6 Eb3} G+E'񹖏wE_иW:'MsN˳eBP#IaD7 O%I _ZbC̃ #Zwȡ8Bd :  `9' :TRlFjpXl%<ȠX(k9 ?7X 'sn>pR&SWN~J̙t\PU[ozί;WnyWrwA $%~Ȫ/c`:ihqFQ<'#W@yŞxiOD0;ŅI@Ud ´f7T{&2*{P {^:#!GrWf1HtuE IX*_WQNTR՞~[2UZc|Oӹݞ.)]OEL'Do92HF\ +ȴhXaCǗ2ID.H 06CllNsb$nFO IoeQjyUH tI2YB˄lکUQHb}8Kkf rxWQZviϒgԯ>bo+jEzҨL 3Uw\/sRCD <iy5ҪHGI6nM"RYڏR'~B^I[28aݻw 4Ñ_> stream xXKo6W{KRA"[l%" J%:Awd# g|fxvkZ T4W2|9 .//ÈQfQ+]h.濁T06*e==Wpz ~7e _B+_0qmZ=٭_ڹXYK^f %yq4F(SR B^ftP( :&弖!xA2bB!)b7ιI z, #8Q ó[N5֍.bšR y= smDew!K^sd""ړFyU]7us1A[>8MP?Z/Z׵ ޖm UYN;[خ^+H0͓j?JsD؛l: IJcKnK}3&qC]~Wmql⋓l؍f H@9+z7~wE*M趫!^R݅HNLgD~IiKiYi=8GR7Z] 'C=!Z u &(>g9ӽcБ`@hm] j=Mٞ|j~IheohǦsK7,v/1/|J|_և:s}C'Ό?Y9g݆8~U#;D~ȥxu;=p&:XLނ]BwP3OL'H?+U `g94A6-؃`zS Hǜa~IqmFqX_%M $Q,`tˤѨP>e5N( ^BbPl)7Q}fv24GqN#hLYh^tp׎!d6PdJؿmY)v6{1=C(kn4rJG{S_;dI=@ 䱯'aKQy:#mqBX丩ps Oxuu1MpH endstream endobj 3237 0 obj << /Length 2230 /Filter /FlateDecode >> stream xڵYY~_᷶1Wt dE!~֦mȒ{zSEuYx;)G_U}~,~ ǻ~ KB.w8dR,q|IP4ϓy5VileQh6 qFXTW{\rࠡTW 샱6'c :s޴aGDGbʪ+R`O4Y3$YeӃd=d:k'K0rE5䦮] FZeZe³:;-d!ʃ DaQ VUz*[I ϶scR:Y1-6Wkc7I//g(yD8ۤljRbҠjp ʓ"b\IHRo'zz+4{Dgsp 0uDFgF\+vTyv_ST^G*J@9W@dCsTpt V~$t?7]NH!X\m<b_;U͂hbK>ܻ6xTH75#U(p`Z׭Ul%xCZjOemfR2Qrwp颧f%!EyfRcu 9tH2*eM=kM> t_\3.>*9Jozq1m+V(8)&۽)HqO {(s?~b܇i \8%T mx?r endstream endobj 3244 0 obj << /Length 2792 /Filter /FlateDecode >> stream xڽr8୥MA*2S=3T &yqD;'3 C?]oLLdIDc\zxGj;bX47e٬#+-Tz,]oCj{~wojT"S*TT:pΜŰwEVyx̧5ȴ&끚!KcE4ݮ7r3ޯ7wt4Hj1r|^㟇C(LL>;0hlE2Bxil}O_@FmK?65mKhPo!ǵ\!3c6uɰ0("GDۖo[;F<.JFv7BmД>aH^>܀IE)$"{oR_n&) \6L޽Cҋ Hu󅚑$N3t05!g!+ϋ:=G%Pa0Gl~.%E=1'z#Г9"ʆz)LƟ!4'FfQdt. d8n|ٚ`-֙+fiR2$&Ѿx"-g&U"I#BK5q:/wmQ+@4)&p&AܽXoR:Bci,c3A%RjTjp#N!77yk NR!ՆD=j6p^\ QJQ65w3p./(ɡٲkby]7 ޑߎK7ʵ0aRXMUb7Fʩ'4Kb$B؜ʝ_7^/ DCE]0AB'Z.E*YOZ۟ښ%BC)޸ƤXē}6@Çۂ.l3$^}۞f+].hۊ!/EaEو0 /$/l%X[ LQ{x8|iȿd0Xm g;_\̝d; K6婪Ϟ?Q,bg&m[05󰰈|"lY*2I{ BX$cpqT:"c~ѢH̨>'i8´t 'Wb=b,ęeq&ĉ*"t#&~ܣI}%a1?ӳfSW؁8gl6>"\-U 1- 3aYȎ&}ѨG*V/3SCCY3H+y\Cc|Lba'SSsŒc`K+ э!%*BZh^BƖͯ!?mXA_rqRe qxܛ<q(pPA™5G6\y8Z6C2{4Z\hhb(,3$hcl ?]HyI8# ,z-@"φ@aݨڡ-ޖŠbO =z5ۆǾP{67z8 Beaj$꼧u6\LXm*K+}9< _տ|j!Kaz#QNJ@l-D%xɀreCp 0Nc X-w4\\x~Q5=-j4+oIsCI3y}pCŝ|gv]QuPτV wJ[T=E烷BYx=ؖ4`v/z>Ht3eVǕrJ[Tq lap>FJwLDx#MMY/Eu;䫎X#&GshsR yMqgOoW$ܗu}v7^F=ɞ`:fUPPDF K|7Ϳ(ׂB; IG$@4$q04|0*6]lw#Do8_wU agjE0ꙧ3=Թ"K#v#㩛}nr)@̠z78)WPi ~:ԓ! Y'RxP 97*\wk"ÈQrL+TWpȖA#a8P,ͻ0&KY9*"ɰJ*7W߅HB$'d(UX$qP)7U_- +Ce2Zqy;P={DJ }hNtbHJ] N/)B L>I/}W!@ŎK~&M3yR=`&O|$=MS:)?e$B endstream endobj 3251 0 obj << /Length 2617 /Filter /FlateDecode >> stream xZKs8W6B$L9U3NUvj!Ɂ#Rg)CRq_xP$;39FяAh ~x*2%Ш_"JDF7aۋh6r҂; N"NI Sp%~~uB$9.Š՚݊c•q۠T& V9)MJ'Tb0`,Gjۧjأ8폑}0qA>ɛsV8] l̈Ǧ0M_Ζl5IYxZbq' Z͏iכc=)p]޲A `8va;H=ؽ )p"OÙIBT&I"o*tS` APHz^*U7 ]a~.w-J:=2ٝ s9w &H hE)M8=)2"Z9LOeZ$Q@0CjiO3:!i aL}3dB6Piai0I=6" 2DiEJ]ٗ0* [.~Ec>E'%:)4i6gͪݤա:bZS']^,L1 Emn"h7gv@3mA*@\=W%`\o~g׻ ~pT#rSٟe]lk;0Eۊ)Q)cgI`xUtI~o+x^}6{ 3`_P{hY"P+H{'IӚ*J˧ȇNX5NQ{4AYDFe Eo Oc B:~\ h զkMwۗV~bۿs6b,cdD'jQ/_*ʃ;رIeYo.k J!?^<(*i)ztqd(%! ŋZ;n;,TN;K7]h{.F>].ya9iTϴs'edU y2nQW 8=OUCc$,6tꙁUOpyI/`D@@M FKiRE2L\΢s f*W0݁w lAeq~OS$0)~8A;W9+;w,!Z8 Ԅ7f/7dsr@KI_ 탫ϸƚ^M jjSBBX+(atn8LKc!R"11yCc\b_}ȳ1䣼" 9lk*:ec5qʯ֮3KF'"i㡹_\p e:N/!MXOl>N0ŇABT_#1wԔҵ:6)|ڛثd3o:"$4dj:(=%3V:I{/sy 1N4=-]6Ķalis.FqȏC1xL}6xA_+GGǁH] md-[t5}>l3!pΊ6CW%P%&lCE߬<5Sqޏf1i_ܼteczg?Uy3o#TVgDjZF_ ]C"yZa0I$H%> stream xڭZsܸ _LH>v$wt~ K3Zɧ__II+ǹ/+$AȍCtE߷W/^2,$?\diz((Dqj[=^\ !'wXKAME HVQik竿z 汐leQݼ̒,U6TA[LQJ{zI*<;\@K2;e\l$Ēv.HZQ!Vr.xao@Wi0T *{=RÄz"};epEczGC_5P: a:UDUU˓Od &:1鶚dFpz<ՄWUa"*T{3TicI@AxiQbp-2,T]Ǥ c>{ Ȃw7h߉o}x. ȑz/s qL/tppfPQ^7}$55K@yC ` 9CuBh GAG7ݾ VBAJ6JƖMiiVP*1z5pCq.dي>_{H(@dKa8YY jg6:d`Ck+ 2 4_D[i6TM!(8# r5htl9B @&ciuY.;d"(8?Ÿ(נ FQDbGتNMgN#-| "25ѣa8/y@ƒ4SO ܵ B'ґޙjE Ҏ(]6:,XIy"..Rحn܎0 C]dN|0=[)!x5|8uPKGnȄҤx %`mF8-@CsCmv2Vגy\f٪h sORDr(IKȰz8ѐ C[sPx2iƉ =AWDQAH&dbkMR<-HefϏI8 n>RxB&(lQqg daWɻ-`\6a,9iʀa'f$'p㬧]g|^p@В2 \p\sT5_|/09N 9HsSޚckrazbh+ކlb&D)]-@(zcxOa3@m:][65P GS&P졆qC%R ]b:/m0NcX5Aᤌ%^i1v J&FI|Ɓ!7eBC) ɑ=%Tgޓ=˂{3 wf,Xf.Vøg\` ·P撳oĠYHFk[w5j}u|eA0'bDPv`m^`v`ui'Ѓzz&TE>o#/ wB(LQ;t;cDnԤjf Uy9!pYaKX)Mc֑n%VyWݯ k;+Cq*bry!VӚ4>l[`i=Ofs.Y2vye(.(q~vq$ZZ 6Co Zc__ @L@õ`& } ty)pIĞp%iWiq`?,֙54fTTaHycݒEi # Y^P?PrII+r#YT5:i﬋ЋǠSu47xrdwH~!ċ1M/BF9cy6D*+$dImZiwl=Ej8DX¿`nDQ!v C?tf,D1#:P]  Q]3Ոm~z$S])X&n/%DU{2O2]~7@ی$ Ywlz'K0] ssEfk,ٿYT"rV[&fqe aT_gdpFy Kux@"nM*WYQ?e3[GJy<֮ܓ_`M!SZEh% _݁hbqgq(4Ki&RҌIX?_/Xƥ endstream endobj 3268 0 obj << /Length 2370 /Filter /FlateDecode >> stream xڵYK6WP >\eW%[ש͖3=89`$HM ÿ>h"%3ΖO Ƴ,}?\?zŬdedX),1|v}~y>~՛^ nZ׶-WoxR뭞/4f*. "#5v섇 bbM_[oUu_ۄefBӶp76؊HYW{ `"sl]"lLDpS5t 8U$)Qƪ&7+\VV@JYJ&AaW4"!qjo.@-8 ,>,d3.XL$ J/h.Ys8䟪^U$\Fpq_v$uQ gE#" NI4zō^.g+q0^7-mX)b&@C=}LS8/DZ<;T3TXkhmy٩ː+]G>BF_pPEMmg,q)5+s`a?OYN#Fևzi0t : @ah_}eɸL=>Yﳜ,ości.8ƕ_Մ՚:.nH/ ~;^A+<մrZkЎ[096)gz@ b$)QdAgt%S=MBY7K1ڗ#㼐.,a(\nPr~~u:2RzǓbfk̫Pk!:ub=,09ҤDزj:\OqiFn85 8~r n;n3?|p;$*1U'>TBDo `W}_g`OQ8z0*l5ydS+$XOHxBlDIUQzjj#(q7ަ}"bpC[3:Ac;jnAAK}ʣJAW*;rغnHk1z.&RyQ|TaCϫC8yu;nCG]4vb+3M,3BZ.(:Ʋ;g-YO{_(nm "$$Ag ?/ 3ʳ:\Ra'C'I$CR >xG}?aZ>M8@!WÚFޭw>8M~W:KD@h\@J4Th!g2Oą{'&Jb2Fh^* wո ?)k[ss{g=!(qw=,ڶ/X8]<oQb[8ԕ!N ^,/G^83}: %"koMz>H"N zb.s1΂bW3T_p9`+XxWG~bYZC.}kZ7"M S|L:ԡ!)C_Sy/&C9@,ODrnLNA?wS'! #¬ +AM;4|jq ϕXBl2lQƆi߿ڀvՋu/֫ t'z4O_zw͏hB :ܡ#78NN-Ა'cuci:> stream xYKs6 W-L̈ʌ36IiH]5Zɑ:R6v&+DnvpQxW\nr'"\n7Yr)7)Yj>_מ"0wת5*VsYǴrΣTg" xz /4ޮ>ٹHEqP?-hʱ){koWVuKOWPww l,}tWeTvv'g ג .,y8yeY**o~{D5ZU>b?m5R7]QaX~dwî5a<ݪ ߆J "V(Hf=]>llLkV%p'jZ8tfQUn{UD-,WzR e jKqBڕ^j9(`v/a2&hNŧ`m1X&S$30K[)$r [!q(jS@Eʲ̢薩 c?:3FNcsx\t3 W @|ZLhR5'2h<1  'wr?}C*|:isbyzԚ0|VU;cXyΐDQh 87W 8qGM؏)Ǒ?Y'QSsLGG 0RK+Rd9-56e0S١E~(.4?;A}WY~3tzY$$Q"[wm%PROJ%X) 3q4'9mRK/ 7sis[UMޘ- ?MqAtk2j923N427s)x}3 =^^>X{ endstream endobj 3283 0 obj << /Length 1672 /Filter /FlateDecode >> stream xYK6-23H mhC-Ah[%gSwӲfӴŒ(fs֎缽&ןnԉPsrx"J=ܦ{guGȸU-C$^b-J1I7ٛY jB,1FQD#d^, lm6 $\DΩV͑r׿s9x_l_ 97XmdǍHͳlf߈ B=̠CV#9Qx 8k"M|Wq~?tlNq|(YhDQ[n7U`+&J\`e6;FΓ6sA8D ~nR}nŸF(J qV``J>KtJQDۨ&WڮMWn_czXbÒUeW{ÔRԳ*r@[QlhXGQl*2*`HrIdW}&nBn} ̅nXbvͲ9r.91D||Ccp Xa!"EZݞ#˜qj)"<=Uj2v g4ChKR9`ԃ! #n/DXWrͦJ)7Opp('Gw[c$S]X7&Njţ k2)W2sφz^ -C} 5(JW]kPQQfUȈc,$`,1".=`釈zP1(~, MHOUݦYƙ3۪{xWcV<_NU7\J{:=sS>U&2^[yu^N 9N}itfǯ&\:(C.7o^ē]gxʦy 7E)NiTcx/B/@%bZ >Jb/ D F^0p agtV7u)0ڱQY6@u;v&aD<|O*`rj_;iZjP֠It)EA\ G'ٸnUٶ۶ DdI nR &[vVRk'UӀFVh??.e' 9^w;/~ȥ"n!Hk$8<*<+?-F--ݯ;:,Uq[onfO>TLaAK"C.FXrҹb/.dbXTls w{f\d}!έ_4Mz}{7̙ endstream endobj 3290 0 obj << /Length 2286 /Filter /FlateDecode >> stream xYK۸Wf*$AC{kSJ*n\cXuԹ9?mw-K-0X}xF(pASJdI8`pHen Q/̬0'wi=R Rϸ&cVM2Nleef<*"1XD]o"lS s |D1 NQf?{ g,dE);BM38zK&Јd䶳gfKHNcAIHԊ4<|XzDkrLѯ(1K-f@Rښj||pQg}SƕWTq fEMQd nJ>bpW˱dSg}\igG3Dt^pFsmfm3ptWSl#hL Y\qj+7uי*w@EĖt:_OPxyF+Ƥ"28?zZ}hU%ӺXЀP"Of_#F`:]fSU)DP@)O82KwvG`c,'c3(d&yD#0ױtn[#df5pLn߶bJ=r_b[D]:´E;ռgCQXHF944z[ vG=ml6M}dDQv*dNrv.*ȌOf0vV vf7éWX<<?~/7b}v{ls/~ÔA\ySYrsEg/ d6"&I.?\" hg_s}h=Uy |D+ƭM⾐@L-~:b T|7JԑΚ 3ZIonqW  \3}^4߂^lzv}5׭{l4v) n)bݢXCY} |΀*>0\@1`VcUԮAYa*o+,^`.ߠ*6s{ȱ ˕n@׭BI9Q"scq:*`BJ6{aGֿL&iQb3JJ!E=u5]U1o[sk S*5U.8^wS/dQ$x`P7xV 聣eed VD3FxJ;r0? 8ُRh+B6Ua_bH_j8H/)(yxm:5GP;jG} 3ڂ42fӏ;'jjLn Q,.DP:hh4n52$ jة GFၔy+m LB X$]DZrd:]6ql6H\f.zN`su-R{{ml5Ң`D/"Ap%2kvBհ"%;dR 's3Itή_xg\.HEd U؂[HsΗ+_Daɀhq?.Oĺt] / Y:FXs]Agԇ_cVc)! )uIo6 ##;]!`_+jbQQ늚XVs+j4.=ZJۛ.І)ʦDq44g}{oJu endstream endobj 3170 0 obj << /Type /ObjStm /N 100 /First 979 /Length 2042 /Filter /FlateDecode >> stream xڽZMEWޞ.B AE %Idl/ 6=xlsXmtuwuS_=v2Qb+x2e(*I\Bdm!局L*Z7#q*L^MBIfP@6P"e"˻(  `܀}R"gPExqL8D  ¬$PЀ4uXcRֻ Ld(# Ų09eQ(f# ˑ-32-%;!,!JC.LiG\a6PX./\[8<Sވj3̀hyX5ŰP ,y$'ǀ}]P-HdQAVǻ "Jg2 _T!2THE*pA*$hbADb`(.NY &m*z(IbE#d$PvZMVplpH!~ѤR[8GJaldxMbq 7W@*nHvEtvEje! eޒ9ըzLJU@VOQ z" Pl~G Ϗco\ A-W_͋z^oe\]0$Bm=Bz2I)Gzڳm=bMcb=ݶg6=yd2iګEy6- yyn~T}LoiY\W*ynp' !5y'E/TmQ0g7wZ&m}LssQκI3:B$a|X(5{y֞z0"iNk!6V% |o#p14*+Yql~Z,Tљy'fxL4M[ cd-}qmÌppFrѰNZ(;!jM'RY Ks-tONÕ%P:t;B>_a؎.hFaʍǰmS&K; ;ؔD;Lyi> s~ڣԲuW > Z)/hp>>ŭ*ġa$<زvte[n`{ԅm& [[*ؗ7{6>0&#a@ȸ@Xp;N;%0;Ҹ!]"StZnGG 8y` U=-hH>ؒ~G]nٖQz̩/߼k&UzZ7ix9+M0Q3rAiO ٺ#[(ƨ}~=]1n MTQLz>r}*z 4r]˖d#҇>l-Cg#ڬS0WԢ nT?LޢŦEVGd4R n:c{5qځ>)(lt0mP8T.AW~E=0%kD4G ؐQՓADEw/j:{;vX(Bq!_ļAAB}>??oZOy5\DG]%K8ǣt>AVU{~V=Kp}ZJp],f23yS7nw ̚7?fqq1-&+_p. R؎}C"@Zw%b8tT1p.h!{jΤp\^V~7J'S wS> stream xڵZK6ϯԖ!H*W%;TySO DNHjۍ5Ҍ7'fאf~ Gϟns1KYDf= K)0VsGͯkb*+۲6{['C/#ʬîyCkBgQ.'|OE0-l9KٟMc}^z8AU#ܻQgBٻ YhT'YYrwOD,T?.VUnJ:_ uC aVlS?\D)`($a0/aSdPtϛ-ZFG*8yMxP|vZ[X]Vߥ}vGZ+jܡɗ~RyAsreMVlXQ~/QԖ~2jy ݺ#g%|9t < /C3_D,Nx4q!ģN'6z' n*#Vr&"թcU5i6k.5?f嵣ƫ鷏46tv psVlwV ly"LУ⡼&)c;s~G{X#.V63;xצxfcmUn.wXR&T"◦Q%!@3v)8j gM^E@to`rCĠn&)X$+X,I[+k$+'jL\`{-ix}(h'9>n6\̨/Wv|9u| 7[}mbP.Cvg8dHC1&Y?L[ |4%;2L۱"B2`+!U*Cz. ,M4b4 C$) A…X_9㳢84j:`.-OԞU4A"mJ+زj~"Nw1xHz ,,#DaSOu,iBHxkd]_e 4N=NMx-lix`X$=a0eS..v _+%:b q4|póqK:4t>Fhp{0Fh#Qc'V5(8@L԰Dp[~J}կ.#1m5bxh>R ,>pF F@G$,֊}ZbkytIV( {ֆiؕ!Bc`B\5Z8kvBՔ 992MTG2J_cs,)EAʃvgzRl!1;"~)78bh'p[n ikuY  83BUZJ IX$}S011 pbsm=:2.RLkMK?ew֎NwhxR'jX}!Q(,2܅ImnܱH82,<lodpo߾%U%Xk%c_$N ciN6#,J.w; W3DoI~Dž|9s[\SK1YË ϩ=}mnkV; ZD}8ư.k6D_D5^0r?s š¤s 442>*¶E@Bwcqnv VRtC6Hx|(":O$:m,oFlq$pI!,`3d¦|J gv[8x8Eە-cǴyאaqؕŦv_*xJ''+k4$z:!s:C>}C(kӏaZsw=V/cyG' )X717JL?<1gd^paFGAcY4)7x<k>UDltN;i^̢X&x*&2 ../sHy}G=,S| Qu'Jybfe8ۅ0}E{at Cm1 0=00'Pt PY 67|Fg#YP$dPtB`(ݝՋaY8 D7͖H^v(!w<4Bj1}@ j KȒ]4e\̈́:igNz^b6CJzRx1u={ |ʒpPd:I 3 _kס#H 2[C#]q:އ.FYHSW `KQm͔s!LF]:vË,̹"dڀ%eao66u:͸P/aۄ׶f JeJA+^ F'J%T`M"APqW\HCHxws?)n endstream endobj 3303 0 obj << /Length 1462 /Filter /FlateDecode >> stream xXKo6W,rx^ IiK4H`_]e}p8C/ ՛O2Y"fE*8QX,\ !j.4 ]ZUۄ-r' |eRjSuR%q0 8hoU2V"tA덭x\Ln\ހ^WM(0k3vZ"\ĚmE`yy[}_m~ IRTz%D 8=`wiGC7mSVhVeT𮣅~Q?* A˪uSK#|:8JD֦1sw#UG:mho`{N:J; #ő8ˢH92H<8XAS u?Ru]SB4iÜ2&Nx14%e#8E.4iff*K-xoWe`e)!̢KEF{~GP 1p@vNSQ*%>> %=]C7͒cI,? =tV OPwâ$&OH2|D Ȭ Pֵ5||$ E)sj3i AS)Kw񠛖c`\GAL*.}6Wvv7IhƲn!Aqgq,jC{jR.|]{-Uj7R}RZS? ǁ@l`;ؿݙ+ѥa(iZ[N`vp,n;g?3rpާښ~ӖWŋQ+/"2<^]/.Iv`x$u4wsأkk}ݿr ק\i|Q (\TP6fB+~g'Y9YĒl3 Y> y@G߂N3IT2D}1rNvj[RBJ:اРtXˤ-ı hLcr 7HBۡX~xI:Z ¥;?+= 9΢42nE3\fJp2&e"N9MJs&i8\N,\~'s<@Y,[$Df ,ᅑ8S).=x ǝ*(D/ܿ﫺o.3$O[SVڝyeouUaw{;$<_ǡI|Oŏ2X"3C΍$gM)sƹ> stream xڭ˒ܶ񮯘K*!H%WR$ު3Xrz}(J' o4.E"7/~mZ$.4?tWdyjw+㩹2T|DeU*kZ^'s(fDX;Lm3ʕ1ThӴJ,Hqz\ʋDm)dlU(OK4+J=_Ewy.xP0[X Ck8Isb~f=_Zs SW|$34Ͳg 0kQ=k(Š0@ALG?aE>|C/>AS#|wrĠ)tsiَ1 |-הI@ͧeS)ĭateW =pܥ89Y~hl֣Qf~K-PR"Tc3Hi͠AdkCRm<>|`ecèiyk-$)V02lͅGDPXFK$ N-$)6:Cv #` \#j+o%}Gvr%0$t]{,}MscTK7c`yPllȎE#1XȹjWU@veAA <$y\<&دR /ϙi}S7$3.Ԥ>tǫGmP480ZgEDE3(A,g ?/`9ˀQ t7ʳ}e,!B{8 èe/;o] ?`b:W Um`*XZ{G@0rJx|2+y}%{IMw0J{h\#1r\CFK蕕k_^T^,;<8ݓĻw%C]3q}r+6Ʊx c€Je9q9 Ի^Fȶ#J*[m&DR66h ;fV)HB?m8ߗ ېHnZ()6E9C8:9lf~2 0 )łcb<i7yz%NԀ/!z7^%ԯ'(UvB]lՆJ}|Y )ate%i\[@*T*P EAAAZ),AU<] dmֳ%HsP+{HV!wm7IW9X tQAݼ> >Tݠ 戼$ 5TE!9g %.ae.B0d(0{[sAIָA6 [$ˡbܺsc*͓EwAnxLdp0#9 /$Ti/VƳ _b3 !=NJI6^{{̭ ޝIPa$GCO~}R JGX=Q.핻־o})Cr6& 9fց~7R@]"!L|6V1o<[z뜅q '&Ԯ_ji RWխ ϽB (u\8깕W^Y`t]W_,+R0 WAYUrcW0p:%ܥI`b)W9/E_ʣ:' 4$SKB4+ΚjRq 0[uK*h>:qq})@E3L*i'JWٿ pJo GXۥ/Wqx,AIiG]Tگ@H&:ҟ}H%q}r.b9󻭆2WbjK.Cbo`@_bE,ztwW]" >)E*D0㪒j_z endstream endobj 3316 0 obj << /Length 3120 /Filter /FlateDecode >> stream x]s۸+xWy"$lf6id7N;N.hYWI9;= @ DL+Q$x ' N~>Kh3%7$a&rtq79M9ţⶨV|#rr[NX4jt=S>ʞΗr,|~>bO7.-2MV:xKBgb_/ɇ-ZW5ғ´VmxS`XKb%Lo.}6)'zi YnxeBSn3GV\P4Pzhav5r_be*h ~#eru<ͫʞ ̯+{Z5^EI]ٖwoȬkgZ~>^A婂(]߹+ҌNsvфJs;{u&3l3O>gh|(Ucp:&f\xW~a|FXOFdSK0|in×ʎ2|Pd2d[A {PA&1ƣ1M[V8c-b'CbW u"b;=D6nӣ/&tq'fE2\~5\|`ĴJꢳ4yvV՘#@R MV소{!_yC_H1ޖ{l bX,| @Hy̿l|GxV)hef+C1tgt|ޗ. ])R 0ju$inOS/sLGF72/֓dsp$ywk ץ'Z[uS{R{䡺;۲.q6߾õ.(-a?og0& V`{\8vJ6.njbڃH [.& \LP#vLgbVNO:-~{`Z)ȹUJS&b2_;E؝eNcM0Hi!Vwn̲j ۔Ј4&Cn%4S:e^mo& 8LWv)2ǙvS+Cq6V\D2G.";H#Hc2%:Ŝ\] ZQ'27כR-!n01Ʌd{򤼭 v1€p m,_ظ%s]N%t^qD ,0e0(1#ء+Q")C V>@q.K@*#;7dh+P(D2~&a#]yk9[…:h׵"A0<&}rNcpӘ4& ʮ -$k3wT@)4pyTbvQ8M?ذjYdVWB N-R"i( ӇRTh sS(vޚؠ 54 z8?d`M<)uhx l5StGF+͖9\Hu%DtNP 0/ _:~Nv}LI` ``5-`4d&L $Tec0AW a?D; a$6\%L+8Bp0_8JXoa2:&8.鲱EXxcÜN"S#h)5=H†kX-apޚ0&Ҩ7adպa7s>H{)9\%LHF>  G  qDL lI$3Ѳ2@xJ"|0wa5[|M ##lpK/%f0J0͌-Ǎqz д=BXv0Bp0_@Jkn˗ūd/$ P/`q!0!^a5[|bp1_8XomƨV€ mܚ *$p݌~hĂ$[֒)'H ;Js˞/Ke?"` f;{<1=%axOtd aєB-"A c8eEIhcS14Ha f$?>!_%RiB(Ȇ붐yqzk(|x6f 76oL$铌ܽuA| L' 拦@aÅ[|8bE Az`cІ3Ó~goD5DkE[|єd< nY &oȰN(&}Z9ڟp/_D8;A| ~і3_4el)p6\s[4 @M~bzz\$X @vm`0CKu,/"kTC eÅ[|8bEÈ1kοɈyshD؍黶ݧLz0Gբ~N/K>w;)7ѳ|\LOS]0v* [_n16}HlojUޏWU8C;>o&?(l㝊1;/$\oa)H]YpӗTw@Ym{9OjΊ=(fEo o}2=v7?o$0pn{Il כ\ K{v#Y[iE ؎9̬(И)^$.U^7|{I endstream endobj 3322 0 obj << /Length 1710 /Filter /FlateDecode >> stream xڵX[kH~0}!jnB >(lʒ&sdK43gl3g 7s%"]g\(&c939*4c•1E %y(ZRʨŊ+] u]^9YUqk:I<2J$k>0KFw[ p'$ 7[OjHuYHTf0g%&F)_1 Մ>Wf}u =WBzH=G̒0;p8۬M'!eXkÕJlpiXJ)#KBF'kncpj )T)a~B-K<% .M|bU*JQh]0lRz4۪n9FVﮠrV H܀㲯6/hZS 1 2j'ԝ^Bw.HtUA}Z+n*OɄe`QP4YQ5I>~xRRЖ[Lr`: 3n<>ɅI2r!lP2-2X#QJ.H仼ЅϛeUwrց6Í`lfp5 V:IkPtƠYȖqN}/UGѣ:YB.58Cjj_Wy><4UN{͎x[xyûwj th}(-֖'FD[Lzd6=JI \!fÀVFt|{0'P1Ocy}gK@3z8٫1}IN|k<[%-M ah;g>;kSc}9-A*}#ߜ v/J+`C-U7{~_Vjt0ȿ}˷6 Gl G9m#,0JG@muX'O8Ow"ݶ!vxrжB(Y_SK b'P ]JL>dw-`Oz.v=ݶw7|Eﺓu.8/goP^z8:P LT^nWN^e<^1y2}|f#]y>MD /}oy3v{@ƽVw?]rR"N7:kb@_ h0], dZz_ᆣ endstream endobj 3326 0 obj << /Length 1506 /Filter /FlateDecode >> stream xڕXM6W(7{k$HQ==(+D If}Eʱ@"@,7Ùy3m>a7>pq\o7XɄ<7fvW?t0W;UmYm=;)u[` ͹B$atlYi Ӓ<[`+ƸfƐ):[qcl}`f<9L(M*ۥc fO&n%FkKpaL$NrŸ!%SRD,2[ǘU?WY9 s%餪B& \*f9$2f3H+eR],ZYk2pO!A$,z F'ygѓ<ҁFIyȳۏڦ!b'heQJ,vrz)-UIN2!*-Y$#%.IgP ܰfPXF}EOd;\RY$4NjQϓ8$&mAN"(CINI-Nd1i!%ܦɳS4,2a9R4%1Td1r`$Hd17g`( PiyKق.Ń-$ ]+y-x{B=/Nj8؍Psns \ ,G wʍ%^;vk ܹc22W}'}W[x_q`4ī6_s՝FkU$䫵߂hV(( ?!wk!}%m|j0e) > stream xXo6_!e2&`Z4-V M-̓"+6Er$y;~HIŶ<~V0)Hbq{!(NMZ<GI0BHOH%wnxEi*d!Cc''"ő\Y6wK)3f:5vH#سNG {o s:\p~!ɐqv<%iC9J#Y.;2 oD1D82 5$T!E .\/A4v=?"գߟрg0 <Ȇ3mBA 1?{ 3ŀ!q|NʼnrC$dV3z]'{zWLx:Ƹ.0 :xƵq,!ua_c|{"keWYqC)BߍQw~Y4JYҤsZGPCqxΘrm_%o޼jOؔ+C'4 fgm-aPՃIbpV\BL:-p [zi`mEF@xjs@ܱSgIΓwkgp8 ӓU7HE\vs;hbjʴ4Gbʋ"/g/L|ӛU5H]uG\ vgtd6Ҷcۖ0k 48@_[?L} RB ZCSPVh<ۻtFd1|LmAImOXw->m{P1xG 9h`,gEN-1P*&j/tEQ$PrBB־z\/d.-Q6Oc'3_ʌS,!wOIdf]nf3h3hX.s?kEf`MYֲyO"x b:o VqX4%Pv(WΪUѷu}h fzfF22?%xp=ϓ4%ar)D/B ^ endstream endobj 3342 0 obj << /Length 2328 /Filter /FlateDecode >> stream x]o6=b-UE;HM")K/]zVQZ;7_J p[p87Y|zjQuԋR%q⯨wK]Ew-WYD  [\2鼷<Ϛa(S]kyrζa|/WeFouLz8ndw0O.?^ ^)yʞ22rRExCU^tY\wv׾;00f ?C:<1Қw ۻ RԀC{V6< F#ّ v?]_^|2?>eɷݾzA%4 ]aU9œQNsNeY!a5l8D8#h$ȏӜ㰱kǴC ľme OН㉤BIa΅%BҦ Ե~ s%sDo6G< Wl[S]t vXV3 WP DS@Dw5'tƻkhHUuNDoȂ9e~\dz QeFgP0e2UqU,Pvj\RiUO<--  O0ڣȢyIvd#:@v^A*z'4(ksZ dB@)S%SJnm֮q2M1t5 (CE!G]{$ [0/SiއD$=UyKI*=>=+u0WqY('ՆZJgY@JM<(+Hkt 97޷c*% )-i Oi_f]0{a(Wo9tI򸨳0O ;(d >IJ*}^uըfx89̧/8+y`ڿТִ=l:JnPLWVxj*zcER=:N杈ڭ۩dWEjbuZvZ3gJ1`!< :e$# t6߁1wB({NYGhS^W֝ r c  2ׇ^ dlH[{(6 PYprBeoZKp`n P#3BM NJZl8>.@. cX5#jK/ L^C,Ȑ@vaAcoG xL nW /R`#BDܯ ȎG?X]p ՗%9y.(tW~Wquꤳ!X\ 1ӃK!"TZh.lOޡvHr8]:iPEL% k-!#%G_tcEsb\ euA5cz>'٘R$YBI"U'œC7ɈY1XLf1 .xGOB=9f).(|)~2#O 7<:aa!|CO4nX,l셃Y<½:\a蹢f$eju‡=^uw޴N(_-xe-uv{0+v42x$gZ0O=vV~ `Lcg{Xx|UQяJ>s&@/Tct i0בm> stream xYmo¸O-v {m^6(R*ɗ3ѫ'nQMQp8yJ.v wNH#-n$i,b%4vCy Tɫ+,O*/PvoJVpixPUi6-Q|jU@˃E]׆:&d/Wa+,El0Ҧ[$\AÔ Z*1ˊyQZKhj;972JızbDtRJaHzc͇zqG}8rI--6=Mv.m]ԱڌY,k+7v;whw jw/nr#:ugA- m%3!<-IygE1x G:t$3.#qQ&Y(<:C78?2Z*F" Hvrސؠ/:gI#<庶Γ?+7Rl8yXZIpٍ#U[F VEQ֏ɦYtPBǫU 68d|C63G^,C\SkC:7 ` )ԀHP.oi %CޔH´^׬YY67۔[]-ݱ`GҦ*{p$2Jcp67@eq"|n @cN%/BAG/#!"DPEpɉ$?TcH~& G$ĉü4I"_t=3a38 2ذ퉞JH 6:c:9If!V _:ދ^YKƽ[<*%,,t.C9dqX;b/hs 9ǖ^'פ1Ng(P8CPg~ >'Vs 9m'z%\򭞂'SwąsV)LG-i { Pz:_8DA5|ps_BA6u"3P\eM}NԄK(tvUͩk0)[x1tAa^b+wC5.<؆e oJtx&'$XքS to(,>eǻ:~;{%z9!ɇR$?2MOyD"hRݧ`9R ?xzF8Ʒ&M,Q!6BHLEӺiR3~:\ &_/u^tu&wC)%.X {Br\ 5Jx##nO:aHS~ӫ-4HMyrzdxIjFvۃ2t=ZX(]޴K0 TupsPw!7ٟ \LOzPvԦd2_42#r%|)?Q(8~5ޗá,S×MEs8_f|N1v>H_sM_%F;,A'J 벘 In?s$~~ȁx(!+ Rˬ|4ϣEny%!B0*&GW6pߜhfǢEzPq]1F F Mk1c.͈_Fֹ; x1P)+Y  tP-_EO3W`%j'P`}ﮱUa5ޗ_ch%%ݵ]ZA}~#5u,~3?Djխv^O7m9Qi+áN,}[:֙kD=]Kqw rr.4C:|MZ,9=[df5p3l=7ʠ-2}x#fdq^p r=%X]B.BFI%vS(ybXdʧw&f[ endstream endobj 3353 0 obj << /Length 1403 /Filter /FlateDecode >> stream xn80rш)EvnBi[,yH %[NE,=$fyh5rF_8f8x+& ͖@0 Fb?M<777cLoWv]ZeT)3%waiuEu-`KOZcT)IsM ZҠZ$qY FBhOEܜloqF:.L+χkoֶ7S=C# "C܇[Ԣa8CUrgx2C> 8V;8`EA]Ƹ_p'PXʺR>TUAHN.bg(l}:g O09 ob*{\83'4 3wBM#lجjT9q?R ףx Xrw=pe;srNbSz-~4-.0 UB:ZamTV- |)"p0r\xM=C1 B2ˆ h.Cy.DhsBjzc}0CVs٦Z'/(6T`q}9}e :B:U$d *)X߃.~*q9~Ξ,?]us|,63Yh5A{hEb%-䙡 a:i̡yfka+r_\׳V"7d"{M:8(ksMK!Xym`b^X4 n<"Gw2ԣХFĈ}2!"J2~p쎪̄X4<([|MUˮl^,C>YgEgˮOd#wyd=[졃q͋E/c:l~1637=bs^cu$#Q.e u1,^mgpP q da<8a2E(` @qc$zH@/L-aQ'`I;@7Uf׺ 7BSG_lhҶCEL Wp;CpcorŠVnf#%N?`Y5OBm[2ͥ~C>#=OwWE@Nﰏ}GD`OMoO;뽦Bg>sw_d endstream endobj 3357 0 obj << /Length 598 /Filter /FlateDecode >> stream xVM0ȥ#5ĶĪnmnb!Fr_;B23=6?`竇#ɣhFQ3Xz'0ԪR*O_Wmc3vkz]c@;n  Ѱcv6.DkdJ$-{]eCpJ ge00eԖ<_a!<'BFM|s>0m5_´*BڴSgmԇY F5m־*]Hyc<}XytMiaPJAoΤ`Ц E18zρq=9Brti sh؊$cg~) "hSl'T001>0#xR_:!MA׵_.UWˠBx"h69>IWsyCplkP\$ 4P}1\0 ^>pb/HK endstream endobj 3369 0 obj << /Length 2699 /Filter /FlateDecode >> stream xڅYKs8WTEKܛS)W욪 PBx )th|,v`q.w׷*]OS,L-(px*_{}M\EYxJg,)b:y]ZwWL~,@ Om-nMQ*Xf>( ЂSI"Si8@OvytW)`H.'D0}*%.{B֑ B? U5Y_a|$tUMm8Ij~fR20mQvu0Ƈd}vVY'lA|y[Uhqo5Y>aSW&XF2A 5 $I<$QAJ!EܠbB,ײ`Yo}8ױ7!{;w$Qē */ta5KwrG qD.z&0.Vl6eW!B45s XqpEG|mo34e=. FP X1@ =R〭qد٪©(tı#yfr/2& i!JtJ0D\+4QxX8td^n"/+/ZWoLUÖ2LSfdYv`4[n!}Q`kjHwX;ߡIdS|qDrXM`TDΐ{ -S<2y oL#e3TuCh%pJzN/:U JVm7NڬL+J>xۉ+ (۠/=qlRe^ͮEXLdz( Vė%7@CU%ʹh<sVPU JWD`ZAOO:C endstream endobj 3382 0 obj << /Length 2391 /Filter /FlateDecode >> stream xڭY E؝QrdqEɢ!wXEi'K9dks{My>~C:r+Ub"ȺZgŮ#? K:=qoVY] C/pmeGcKɆfjL 6}̛fQ_Vhy `l`6]!RsTAE ^@Z@}Sr:TWC^,pҍ+|PB9C0pKDѬ|>%?gtbe;n_cGa}CGE6+ *K?Nq2%-D N.{38f:L| ۦ7&GiESW+.s"jbo A*<=S!DJ'ۦSUUCDMt>BF Ċv_ 4Pf.;|]`tP,d@A~at -8@t^#:,W [| i@ $Xj kڶkQ=cÛJU4$A zqu.iE,_Zs#PҏX܀>W>Or˴aCg_OrTyJ8s>,Bf(WO#B㺖i!FfZe.V >zsϺjo`c{ N :pԨU3qń8'8Ycqe2Ah]×z?0EWG8/Ⓚ+|㹙p]< 6)`wU^@t$0A7tБWj:=/mh1܈ 楥ĩyTsDm+p6/ 5W zJ'-.ʇ6.FxiϟVw1q nrӇV :z88 ȷܝ[1kit>`𺗎}^0D* ^0>;rwǵGzM!4Ye՜HtƩWwL!SCV%Ǘ ~l SACڼFCְd[M%0tjn 3Evӕ*lj ϳV6ɾ\?{~i)=Sz~?#nbUj'.X_(\/J)ʜQ{rWEz ^ ? Ol +oMn7BS)BV9y 㮩8ო"r)sٟ؉4T> stream x͒KO@|=.;d=ĤF.6@Ah.P͐0/f a>`g$1k&Y|cftۗb} %g$pyL,X5I~ہ$YW:w} #)}qe]҅i3+nIU%`2 ,Cch޴nRߦbZ i\;+C\tjo' ,(=.Ҷtazq@z~@]24rADimdr A :R@ւ"~Hl_#@Ƣ7Lg<_ endstream endobj 3377 0 obj << /Type /XObject /Subtype /Image /Width 550 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 5204 /Filter/FlateDecode /DecodeParms<> >> stream x{pg I0PESn@9V:3՟9:mm=?3N<+mm d "Z,$ls L>d;w6H~+V={v<֭[׮]̌ŋGqw Hdr=ƍGŢѨ@*))STsssϞ=@ k6lܼysmmmF7dD"[o:tSN\sM*߿@[Z555oV}}wQRR2qļ<'0`@}}}4ݻw1cP]X72Ç>ַL\_XK$?z裏>z !3%ɷ~'bٳgΝ; 6eÒ֭[7hР &vy,ܰaCFNcqi***ϟЭ[zý{6Ȧ,X`Ȑ!ojjJRoɓ СC-Yzu6m*,,,((0Ț{w}… sssW\~wȑfMFٺu7޸hѢc&rO[>c- ˗O_qҥSN!m۶G]n]>}~d*'=~ӦM2ӠA} & d*3555.Pt"޽Q%Ns=7sd2ylf0X8zj2 }HOsho.| 9HH 9HH 9 9HH 9 9H 9Hعo3#.W3kоx2lmrd<75. kH 9F 9 9H 9HH 9 9HH 9 9HӂI&=3hԌh0 MK@r@r$$@rr%zsɁvW^^xڵFm(fpT*UQQFg 9^Yz***^z饞={ H?p͚5 a<877L@r]:tѣ^{?A^^@+--=z)Stbm/ t:]YY#TUU=3h'#j\Td˖-_җ92xiӦ X@knn޽{wCCѣ'Ol 9^ˇJjӀW;w=z5jȑ#Ѩ@{7\ ҥKÇ Ho7n4jժT*D~I&E"cN;[|oCƠ $xSl_Y̞Ag!oJ>q|0A}^tΏZ}|…*Ӷ?6n nflA:fO?n!}gRo65rKX,̙+뮋[]3P 9f͊x@r$1$@r$$@r@r$@r@r$$@rL4gFf@ah \UH 9 9HHmc۶m֭3D"'477X@o~t9//@y%ih\dI*\YY\uU99~*hStW^em& ãG;v;Xzu^^ހU VUUEÇO>=77d3~/Fss?d2y=7@L.AX~q MZM6a8yAEQ3hKͨ͟Qjkkkkk7 9/Ϝ9&M>=J}l:8vؑ#GvܙJꫯ>䓒N{9vriC㟷P϶}0α3wx*8ζ}Eiqbg*8/C8akε?ѣ Fb]͈lH$JKKsk '7'XCF&.ׯ߳gOMMͬY:ud 9.,Y9rz+ \뮾}~GC5 py0HW$$@r@r@r$$@r$89uuuͫ1).R$ oH$ׯ_AAʕ+͛k^}r (///))D"=X߾} kak֬2eʤI M c9NZbEqq5\7^X{wf?9ީ>ݺKwgG[wmʉz5$$@r@r$@r@r$$@r$$@r@r$+@7;jpx2<$x<[~I$/|ͽ{v}W9pvy}=zȑ,Xalٲܻ;??퍍N%Hرc ,HR]tO~r^zM8W^|؛6mZre$9x3nN:9 9d_WǏb|O vm~Ibҥcǎmjj~ &8І<h4hСYq֭[fM>`,w*y,ֹs͛7766F"lM999avڵYo*Q[[k׮QFec!;wbtAr 9 9HW|% endstream endobj 3379 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 17315 /Filter/FlateDecode /DecodeParms<> >> stream x}\?W&$ A4M7X`[zz C=%k˷G5=GۡkCOMYdv V(^($G*n+\Iуu}>7" BAt T1pe 'F+ /k?IHTJP`) 1ΆRCGEPZF+?r9]Q ,BXJH$\DD@ LEGF<_J}uXLN*kMH⣂@ G2LRj/'#,"\ PCP\B*X>b׏6`ƅi< [$T*lق ,"x0jZP ˇ#cé3Lf)`@`߶DRlFEtzƖBGi*l6@hr@ X- ,mmm)K |;VKpv{]]穟\.ϧ)/zj|Wj.8 *7XdL&^0V-//OHHPҌ)ڰXƗmG\ͧ`XSa^o2JN[hf f|@P TWC )N}n0TT__iX%P(1\ &4q^~TT>tM|llhFO5jb Ksj4)A4Jl݊bZOL$ @gJno>,2fqUV5999??oK |ܖZFۂpA@*RYYYt}[ju: T@+04E6s#}jXz}MM 0U渭PlT^G|dWʖ(Fbl]ZZޥ܋{, {>P`~lEe,L&۹sZ|$`2+**, 5Xr%KD)1YXDUSShZp8fMXx|F=߀ ;2n[Y]';7(Rb"D" MLժRlRגZFh4KeHrղtqpYXWVVVQQ>77. OfYV(h086mߖ0gu~w(&Ef0 fBׄbi&p۸ ,~{_NUsu~w3bYYY]]]۷o"P(+++J;T;Y`(<2}Xzm}/|B5)**`6i$ݞsi jdÛґВ[K4>uϢ1VtAE+''gc~ dK#_ݴb"eϢ&zjkksrrJ}hK-Fcf^5g,Yۺ}XSiߴiSQQQ\\?"3Zd25@`Ëm52 ;&vjϢTZZJ#B Riuu`P(l,72^P>|_fIHd~ka555yyy===/@xQII޽{Jdk\vxdmЉeۆ~ 444'''ݻ6'^Q[[[VVhh n@ufn^$d_?>KSOQgͮ]j]h=}QQQVߺ\bV4oI/%osux7CC QLD$$JZl6o>uLm۶UWWTh:#_-]JyܟEMD_VqwWҘ}=|-yGRP] UeeZ....,, BԩS˗/?u4^n݆0^O* 'H%bj 鬨XfMss33f477WV\*|b @ϠG\TBEEEYYN(yꧯ; gJV͊  fЁ5F1y А4o_yM3N#)klիWj/խճt:]/ %-UDϑ bFZjٱcgAB|h,--yz?%|g:>:Y6Gm6۷-av޽f*礥tM^-,\y=ۍC%ѡS\ jfff:FZ r}|+N# `233رҊFV_\]uاvCjr:۷o~+r33z]893%moB&77q}awP`MVKU}8>e{*ĿYgl{6`d\Y?cqgeY?UVuvvcz[prgq#nw44H(o0 ?!,rHXqqq8m>1tEnh\:o9qrQ&GVݻ7.6j; >X&nuN޷n, Jp/tE>Npb(eӦM }M:[N۩E^/,,|~g8>z_XFqpWH7St?E?$J',@UUU555^PE1NDžtc=/{l6?xc?` ;tO]#Ѫ?)JD/^\N>N10Jt!_a ;v,++10=kZ͔O&p}= yZ3{\]_@l'|ҳF-|@*"~NP mO/}&;;;w5cvr쌙>w.O$@xրi- C3|1 v?0GZ?)}բۖs{qH,R9&eǎ~ٱssQ\T|USSѣ}DH]z#jҊi11o"Ok9|~^W-K_kUM+Vq{9rJ+JeAA-1w|ދMBݞcXع?隳/;ڿX>PɪYNYVVd׽GpzDI_òX,({=]? 9br\ڱwnw{{Ν)B))//k#s .r|u8"F@ `Ͼouaptl܌08ZvA"MC7mڴ?U]kf$p{pC.I z Oc2-8w4*.>98\vis)7͏\JW )~kOԕ'I'^9t#j655H+"@}5O:]Y>zIV\A.oݺuB߻;8dd Ųlff*_:}߿4o5/GD<ޜ/l|یɗfbT*\gÓ/bݽ|f 4jjjz wu "sh۞Z񡁋1!aae[gȨPr-gX}4*zK%a ,>r | =)wƻ>\3[綎n - !! վ%ΙF\q!Rɸ?B***ji[&sw|?ְE\'hKs]n! P$z lެP(G:r;'2SGpui\(z_,;7ßIC&3 R^^n;~Ώ쳀qY3YkhQBG|zׯ^ȃ#m#b|QP#d EqqcG?6<+߶ Z-=B&";;[VZ 0J`Y, R R*QP@IUl>󃏫'K(UYYpȁB>^X*uL\qq1Oc##UD`]{%*7zOcC]Ǻ jv>zrtT@IIIJJJso=;֮1A^4@GhPI#Jc]13uiݫR-RR#3ɜZ| X5"d0P.M97qcG9?)g}o> ƵJXΦFd9?ٻnlyLOX6ʩ*###O?4`w UCA g]~?ƻLJw<:2<}(Ht WR?sH89Bb*ZpO"zϟ=3W}~u$K9vS9V-c>?-;vnHT@1`>892 "?kn^z)zC~p5ua;ۭ}3)KԫHO$4̀ Pnf@&SRPRB Nw_n}q ~]ޮ7\.whXgHUߜvW+äڍ>/&":$x|#U[[0̶mZ-`)p3?/Հ 8*T"oڼLuXU52r!Y^]x벤yzspbD>4;.&=1f:>zi556Z]Xݺ&Sđ#~D$ppf`r*hUBx23>yVRs]]:}ՙq3vyryBåZv.:bdJYm B'D ao@ ||b#@t. l>v¡)e7DҨA㢣vꂴ2!qnK~rb\:r8 (JmW XMMK²N@(ρ7 *@DD"Or]#2l@kxYTU__iP] @Z[gf80cVxęfY6+~fdvr)tX, MJ.(pQRǀ HbET~*\Vki/4 -V(NV+z0Y-D<!^Ųl|||AA۽p:o7 ryRJf0L|CRJ+Bgp˲9kXZ[[N*++U"ߠk,+Ԍj1X)BZaf]C,* LךbZՑ&..Nkw&ᗽ[N/'M IqRYAg#=`8x%7wdwOu[;~26:7-Z0L]]T6 1{gu|4 X,ABP*JLfދqbX88H /yD:i߾} mS:A !XDBB!P`B|0 P`B|fvQ ,B5 !ćQ ,^1ΕBE!XBE" ,Br`544%F`fjB(!T*J"R^Xo}..!J %Xq1!c Dp8BE!0 Xee+B P1g.KH`bYZ8-.4!dz=9NGwE X|7tBBL&H$>XI4IJbI( H80"$XV+NLZp(M^Kl(.. W$΢GHiU+.UB(.roP.w'ϱ,Jijecּ3gM~n'!Y^m2vf`q}gB^Gh;JcYV.s4 TTB5,K~~>;)ќ WxGE:SPR$&cpЭ%x:yZƁ532,,e%hYSSSGGZBhu K*8<+wMBn'zhBB0 xD ,ΗmH7 !SB+ ,H$U|ZòlBB\.&4Vazt촆 ,xmXGBUDTl{L߰Z2c EN* iL*JRM}`]+>!BoO:̈́cbaXe+T^4T>,VU uvj%rݍbU }bթRSs0x?vnp'Qc۷/!!:!>*++d2AO $䶒HE+7<h2pǀ1,TA ef|vTU!/"yUUmx8{ahx狓H E<]YYi2x]“+Wn<#'%*JK1ɏ{oLwbƒ a iH\xg~bJJloo"455YV@?ֆ6ȀF<$$@*孆?RĎZ[i;!>J̀vbGΆR ܙ3%&~!7L6mڳgZ@DhT*CXb`]ѡ.ػlΓ̟vn^81ak(n!Ej!Lng٠!3c2#h;vٻ¥dؕIw$FnVZZV5!trAc̀q4 .{[JYpǮ1qYDvOlkkKMM-))1-K ,PpKp12y"y%ݮGL~BLVVnrI4|` ]8- SfN<';*bό$* b1\^]./&!-Zd2A񖜜ڦ"( طoLp/%7!Dl6=6u jXA^Ks3c;d@Eyy90T,&^h:y24dB dDR D.,8h.-ǤBFȰlk!!Bòh4Kk9 \Q`۩"fЍqm+)P`)ʂE W+xP`I$-[Փ dZSR(Yx$KRrssiL!¡Jekk=v8ј,B3Y{iB`L#$kDcͦ=O/o hmEA&H,|D!ְXr8BCȔp:EEEWhjxWKKCsDN5,4&)ih4lj\o,g|3!ְ55^ Z[SRh,Bͳj}[ j`:W­aaJ ?Cyԗ}[g`xx h\ ­a9ZdǏ( iiiTݾqFպo>儢FHSeTj M\ b XP̲!^UWWg2 ZgOXq ;vk4n:+`0܄j:ٳ%%V/Imʚ  `4BqٳG=3NWSSo߾t 'u),6W49۶m+--H$TW\YXXh0fób@`immMسPBȍ?,a8i:-abʍ0anԀ$LL]]]OOF`,jk \i;!|vo,`4㭔J;w&BȄ>իM&шLqVv:ɕT^lAiW`Yx<Vn-NBF'jjjjO4\xif?;vhZ*mL1Yi޽ Η@\@`.u "պeH+ׇ5CףʩaH$yv*---((W`)m7;B&V2,*xtý{xdž VkccZw[wx)eYYYT {Z655VZ*rs;ȧul4sss'q6 Gg[n۶"!gZ333NgccNM`Lشiؘ0\ o1YGlgee"!tVTT,[]] ύe `lY\UeeeYYcD`3V&!W0L2roG/Sx8G.])DPjRE8g\xFLlò'ClF-;mr lj:V/ֳT Lv}fy?}G_;'Hhp)nu~H 'P kLJK!tlv2''d2+8yzO 1[]ǩ_E(Fe%u0/* hH$6mcf;p|~pr=nUZZ?;ǯ6p\-,Pa0p~ԷDp\՞={lܸ G\_p]!q;?qZd&ou[ч̄!@9`ٲ1 Wp|p8}`\`Xaax @ tf`Fa^]\k^}{;3j9m97po@"-rs= U?^(aX7|9 dVxϋ$kT*}W?`dlZ744:?eȐ`1-SCF*''XR~ m@PfvEDDpuF=*k" ICʥQ!4zN+>#vKQB8>Xg8b`Maa/##b{` U¼2Qaq!e4VwC= Q[_j o%JX?ka>"~V?0L#.}]CҼ8R8,XhZT":y7z#GEs'ԳV˺BU rd2mܸQ"L_w :O`y\d2mڴip5gђcbv (%&B-A,\֟z/b {6l~Wռ%d:$o(,<+VeGV>XzVC˽}ޢ0yh3#hhjjX,sW_-yKi k8պaÆݪe+6?SY] C6-+p#\UZfGKAFkaCeee =i9LJ!{~+ ,ΰ,뫪Ϳ?vP?yIA4q\Vkff&˲F^ng4E'Mv.]>oEűxU_ y͊ov~ٻ?vn{ڵ'Qp8t:]SSjFsխO3d]4X"_6|k 677gei/t??3՞W92? >䦎0&V[SSܜ}մcpɮG_?2Ÿ'H5,o5%S+֎c!a֭#)6gjB(///))Su9֓}yHX;ow^[, 6\acǎIUbcbOU"D}_pZհZ+++=0n=#2lլi~gG*rN'v=~TD[+u-7|K&^7Lu gxM龍&I[V|nO1r>=׵"d;y8HNC ,ݷ寁uRYa#{cOeflNOus&4TGa'?H$ȰZO?.))BZyHs+y!aWvNIDhfME%&Fhxx7?%u[c6-Kmmnh4|Uݐ>3/9 njيH⠴at0-gK/^y6irFSZZ: l?ۿW-[/l HIjc] ,uuuf3'16XKTSU{oogμAidTbT򄘀tP` f3jވXYPRRR>g{uK%;bpc ,ojjjhhhiiqEDEm~<>!IKAD`1 3`5MrrryyyJJ0q̎ ĕ)|FKK ˲:pV-K_lŊ> ,]] vza4MFFT*FEzY? }:C&֞)K``0Jevv6+ ,;^V[[=P4/5+PmQWg?MssV"DEʳmbb`*j) ,)Owt hnVKŇLс S$$%̗m~"1)8KcvXNg n@] )%(("CE3S˸/|ȑ|SثQקRaX/xӍ*02^q*X$:Ղ  t)-d=;;wfP`BLDK$B(W"XDBE.!>!>lk@E`\ZP`"lN'28J/d"xQ!P`5!> N']A>,![T" pH&%.չs' o`dZ  P*Q`6m4@7pJPo,!R)22U` ,BH"הwDxDΦ!W | H7y jT(.{AE ȁPm╗C@\r 5 h8fKC9 /P =P)BE 'i((LveHjSʟx\UnTB"HEʟDDP#P 2bj endstream endobj 3394 0 obj << /Length 1728 /Filter /FlateDecode >> stream xڵXYoF~PiÛb=$ih KƊ\Kl(Î}gv(S"/sϷG=:?zyb#q(rGc ۋFtr"N8pd ԭ ]ΌT.QvsylK4NtjzGXrmg:⼔M >Wު2.=<w.sZ<hO>xse zu:!ӵ*Vrjl]K\Cb85HTE3dm֣+!^u T5/tφ#W4\[Į7iv"e~o>u $o~فadOtQgEC{!X*}Qqٚ,}\X!=SΈU8*;LlLȴ/bt)}jAh&I"F$kB+Jyj~48"Öh `xV"UP)0b5}w%@ >$)pBd2ir3vBa$g3EVA.t!OeZP-;MSC'Hp? 46 3`8M$f-n6`<`0 Y[9fy#Sb]Rؙ$5]Җ;vo*CDv } <@0?v䵄gP01%@`PQTPU嬀nJt'X *՚_/S  >>Sz!p umվlhb̯yC.ZEO[( /{v -FSobS&rp`0gFV@bMƁJ/%ZNA{B,BɮJ6oэ>-urڗnROJzuń^>MG[u襲A4نaAzՃCv(p)'m iΟ@\`[tmXx|Bz|%~R\V(ն@؞UN6;~Qee jG9tiq "!c*~W%mb($+19煶cʯ[`è%twn0^~F,~ {OgKU1'^=;g7\& u{p6ۺTwfqllWn( /K0y<zy endstream endobj 3294 0 obj << /Type /ObjStm /N 100 /First 978 /Length 2267 /Filter /FlateDecode >> stream xZmo7_.9ɃQ q^{) V9Og(ɕ䕴Ԁ,9|@3J0ɤ! %NɄ^!#"JI½ΛR! (LI'?9 >DAbw1:xllT2H%r.J͟(O!T&,(1`($!v*ECz 0/HFIudlgRR0GP AU؃ &;e ^t6QD)V^ }*=PlItx@!yH$G2QRѻKP5aZF 8눸OTX)o F¤Bu5Q UX (<+\ ŔI(&bx(jU[ջlT%rEL"_Gq&h`\R(08%AE1ż)GN A0wERё(sd?C*bj R9.فY&ub" HrAyy>>r-.p׼5`~ k:Xhvw[} VhjLNa wka_YoOX0ޓ=V| xϥ|`j.Mw8ujD7^s:Z0x&׃y>ߌ5TQ}D c,sף]ʳ1me5i?xr3ݧ*5V"r^4& |786P7xp8YW˪JZљW[nQvޒmŮk]*/ n*OSF'!VƕkB :FE-߶9ǚ)L>܂ZZ:Eljmδb‰^u FA}\8S j8Ji^+m>Aw)TZ-p%d*fy@eѷgyX-a4 mA!Xֺّͮ=OWw*fHײv2;AR {&nFOXRlIۜk;8"`VEܹJ/OC%.Gք.w -F"R9e`%Yጘ;+dI e R%6ʄ6j OnXbXհV $Ғ'\6:]خhݭm v== `ä9%XFć^wrl+˒uuQ(Lu0kLPL)6é2l)#\XRL\+[ {xit?YN,b5)EzA@ ٽQ:>\ߚbF")>2dtђ!$K@*&m^xQ^yas1m][/\emm&_=%D2OY% *L-GS:[1^OA^${s刘1W܂H-y"{%/e]-}h)]r#Zz n55 _74㣝 Ǔ]ʎ'qlXK%1k##"Q7㠓de{"=)1-SbZSnODCc!\]Q˥4ES[F`(KrdpaZ>Ōf:{ዞ>{.hvDL"~EKȁZz6żGWދźnrJ]NiWV/&o-r,SK' 7qWV[P_]7FSVI{2~n?i`Cz@5/lp.}܇ endstream endobj 3407 0 obj << /Length 2118 /Filter /FlateDecode >> stream xڽko|؊(QiC$@FDӊ{t 9c]ܵ4~СBYHξ 4JG/Ag]󷕾:/(7񇠕{-_$׻( f|窲NJ . ~:8TB}'Z:}Z}.a,(B7v#U $[Qre1Y W;7_D DU$Hb'77;:F^F iuH,fAdp}#IpDK&b},{BZ :F81bPJa'{ &i?Ԁ _}, j]*lF3n,)*,)/,QjhlM?%4ȼhꃳ.9iCNwxݪe"hY}cfIh{X! :Ɉ>焓$H#0xLZ&))B+YSLH>Zl;v{5`-v2|:+ݸ]O/rj'(X_|6L@qn9Ybܛp||{6r3Ȏ\L#{*u94hʉ h"DԟA󵪟t=d9_})xI_J} nWAcm:9QcL'=.KL (rCݚɬ* &~A,hݲLGQ;Ό =.pԜ=;VӲI,T䶦~ECZ$;76{4#t ӵ≃=qwVHČ,/ܼf/0i6'0Xqa*BR_X PvPбy8i(㨀422 e5axIN5vSKMEhQ$V6D0Sq`}a\/f5 l2}b !`0u'̭L-wgO:E+v>4eqq8l4 W1;=aL?R#6/ݟ> stream x}QMo WpRM ^zҬ[ߒ]EcHWpU%3yQh_N QD"RkĨ Brtׂ4\8&2^gxs?xmF]]pi;4т Ծ ;"aB{Do)F*L%i>o`yLn4n\!ɕLⳝ ϲb !9X7ylmO*9BSFm^8GGyކP>`w؜hBWJT dt{yMdNҕ);(?z` %A(=fZb=Hn[",k %%Ŀ| W{1A8SҊ]τG endstream endobj 3399 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 700 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 20381 /Filter/FlateDecode /DecodeParms<> >> stream xw|TUd2 KtYP( "MPDDt}W]eW`QTtAPz)R&b#uL#Lz#ܹmνss=r "@IF! Q'|ޢ(䢣 J} 8pՋ-3g@BD-f;tЎ;,Yk3&44tذaGݼy]vy{{^zܹ׮]@rW^U s-Sʕ+~J*WRsxXg4ߴiStt^[SO=Ł,vg}ֵkWM6 >… O=T&Mf̘O ܾ}kl6[tt?O{?Xʹ\[ڵk_|EPPƍm2("s9p￯:wˋaq "r]:u/㓓ӢE Mf9.._1cFbb/BCC%44Tִif͚}GZʕ)EQ+Uv}ĉ ,Xl cM8bŊ<۷vڳfZhۭV+?1^0͍7ꫯ~Ǐ7^z8rp8~a֭;s޽{UTUV+뗔Ծ}m۶M0?qD1o=O|uԉ۷oСC)%$cbb.]|GydԨQaaa0Ȋ+&N8w\^r7xի!!!tPb$&&>AAA&iѕ*Uڶms=1+fΜc:nƍ4L999oƔ)S~wk׮>Dl6O6aÆׯoӦͲe۹s簰0~h)^sE%$$ 4bĈv޽trJ3f4߿xO>×.]ի׊+UV\9@Icǎ͛7Oӕ/_>**GF5jԈTmذ!555===55UD֭h⣏>jݺ5qɉ-[̚5k֬Y3g۷?c,Xкu됐 6tܹy4ڵkylz$$$dff;wްa/[n_ݲe.::G;~ԬY"A=o޼/M4QO0`ڵcݣFj޼945kֹsӨQÇnzϞ=&MJII|x|Z֔w9Ν;lȘѣG ;uTttszꫯ~gM6]`A)w||K.u\]vWx:up` "SNMNNnժOu:ܰaC@@ۃSSǼu p9 a~aw{Cه BO ŸPFcV ClBBB(DGv횫PdZd]7doF5.]ApsGAg=e}ZZFx|^Wz}׮]ia[5 (ƻTG%%/Ar\9#u"qd9,Y0++DošsPU#̖l)6]$y|P@@@@@@@Pylv8.b 6t:bewK':JÃNt.ߡⰻ씹.)N€~c 'Aw}UhlX|vIG'IMM[|RI!C̘1!v#111$$LHH(;F:^bŊ+֭[|f_|/kŊ+VzGg͚GGG/x{{= .M&{キjժjȑ111+WNKK3 /A(֮][l uiϞ= (_ٳE$A󲲲Eٳ?ó>sFEFF](Χ`߾}ǎWF~M4))Hp%$$~f9999 `ȑ 4iՋ!9A 0`2epFӏ=*"ZÆ =n͛h"۷_~nݞxRVw4}Q`޼yeDSN< g>իϟ?ԩS#F|}}=인)S[8y M6V^q;?s̛wǎ׭[v… .\w:%fffjC_rE>qD5qĈΝ;שSA-[lΝϟ3f/xM&# 445Bm)Q@@h4z֗)S[ZChݛ6mͰnݺ~I5-ٳgݻwϵK.խ[n8q³JOApppRR{UXhx7toܲe˺uOjժzjK.mР'bzpӦM+4Rp'Nc/2iҤl6{=PކDiZ)R?СÕ+Wԩx|I֭>˗/ϕ#o;ײs{F^>}6Q[VArec/V~nذA-&&}Ujjժj <{f̘qvbX,CMiӦ}lٲkV{ԩӦM={j6kL]믿jnzR{< BuеN:<̮]Բ ҎݗMJJ{c޽{ +ԋ/t_~Q+ə={v6k,W!GGGZ`0aիWՂ۴iӪV_~j#<~zľ#FOժU]A /Ajjj7m4###Ǐ>uիWOOO]|jcǎW]T}eĉ:tH-ؠA +hׅ;yyخ] Bi޼s.ݶiҤIiTP}([{mK.cƌYvmo'HKKS%?iATm6[Wm6|P4hP&?rHJ9o߾y7:t[ _j?=ZV-_yp<䓪Rp¼e?huD5q޽~C=4o<J{ "9r\-?.]Z&Oݴiӧ]P I&OWz#O<5k 6Q駟滭۫//{]b!;wwO=u5o󦷷c=6f̘/\0<nkҥ+W\/E1}|pX'-[v9, 6 Rf|1bӽGhvvj 3"rȑ/j3hVEO>>3*/V[lwzllzZqZi.cƌܾ]e˖]~}u5WVƍM6a„5kvE v{[of?tPu>|{jKt|}}|_mڴ< .T, " /Pwp˗/tΝ;W5y507|om۶̙3/^>GZ Ė-[.ջw3gΜ9s/+&x|ڵ+5V(_B]رcr咒֮]{MF׿vC._6l8v예7n{=}tRRRxx 6{ k׮9rԩSS,"vU4hP~}k׮]v}nzرo/_vō7gŷ||_j߾V_E=?ru1/uK=D-իUON-tmʔ)E%>)F]/1c N믋ȳ>ꞦyjgѣG{%KaDkٲرco!3f ~e˖MJJRmS^-d=zTZ̙3'OLOOWd~>Z LmٲEEZ6m3=rrrϟ=ܶ|\?-aiOvڂUG_%رc-֭[=~z--[֯_9scj:lWnݺ_՚ 63=W-K/eݪuW Zp8|M7u^Rh`0,Z[n"okРAǎ4iҭ[7xgܸqѣ͚53   y饗jԨQ>:#ƷDQE沧~Z}W^]^=Q754iRlY//*UO>]Uݻw̛7oٲey߬jhԾ x믿aÆI&m޼YD.]Omر#&&&SwNa4%V,'phwyi޼ 7X,111111 4m۶t# 23fɱv}Μ9ӠAG}^z ^GWr%]DNT^=tf4ULL{,W #!!A7((H})QF߾}kԨ1u;vpvޞ.]m۶CUV 4N,zڵ|׮]U^=!;bĈr~gʖ-[s=;ߴiC͙3wZZG~N>sADL2dȐiӦY&---''GEl\\\\\_|s}kPH0_7V:z/Gj={9rdƍG_~VV/Q)gϞ޽j\ >|ѣ#&I]&Mt{]{G'7pB9h mx駝N;w#޳gOFO>cǎ+T=N7^cj0>ƕZhܷo_ ne4>tPߧ}׮]S3nܸ.]䪿6idfĉ7o>rO?BQ###GES1E$==<>-ZF!֭[N'OZ֋/^zUDj,YL#G/3ydK.5@L V4f+xZdҥJ*7 ByU1A,YsNP’%K5sg]tAAAjеá)EVV@aÆѣvo~=ٳs@pӤI5ʄ =zޤ'O~gUB~Fөj~'_۶mS]ԫWNl/[LUD5aÆj˗ZJ5DEE?f̘o 'CnFy9<%ߎ RPDx|Stfddw/HVVּy Ih Zg.dΏ?xܸqcƌcܹ77n9ٽk'imj=ƍ˻*7lؠZDΟ? o>/R.>UTgm۶&5jhAXvm}۶mqx ׏Bh j銎V7nC``ZC^Z%gцl6mRo{w)X;v@b;w}׵B駟pӦM}ڿ;3uԟ~I;Q9駟N:UA&/m`m曩SN:.ҰaCVիA"rYf;OTT>{o֭ íٳgu_СCm۶vϽ:p@_!AM6ii͛ ׿\㨝?^U׬Y=T VR|iժUjAAA+WԦ6|g}k!!!RZZJ uӆvs:+VpqQaÆ?{]|YUz-Z8qK)))&L*͗.]R>ƍ~iݺu֧W^a/0֨Yߪĸno (Fc<Aמx\K=3L^&G7? ݢY {L=jD^kqsR3xyy p!5k4Ƞ7HLJ;>w}uڡPx7tQ_t!)rsuO:먗TT\\_vYmm۶:S_o~]6ݙTBCC]nuv`ן5tA7QkNmSNj3?S|fߛ/Qoz+vUA0߰]wZ*|bo7jur 6]}qiެY3m5ҪUW!5E De˖>UWQ~/om{Knˈ^72ki8p 6∊wNDsݰaRh;P&r"";18,m7\\r~~s˱?=rUPZKǭg1d&d:vڸ q>"yfu U3f8 Ւcǎmutv99"׽ř65Ӛ-"99c֎ Q z|F$**Jr%"M/onk?/O"[gmvx}]̲w޽{igjKUz]qd)bTOKX|C*﮸{릭oy_2ef/wסC+Vc=+{FFFZӧ }GL9oQ*CDj' "gDhfʋi(RN$m*ߘ?)< rXD ԋjHޅHqmT"DqK}D8DޘH`zd]"Z@v"Dt"d\INڤVZƜ'O/GJ'znIpN14Iqw"{EzQy"q".H#HK 7R5Z"-D "3"olH;]$N!bi,bȳrCЍyx%'r^$JDtREH-L^S(/F R=ω*rJ~KgE"uD\7N\;s㽜qQ>b_?Kyn?=xMÆ kժ;@ +:+WcE7mﴱ+Ɗ j״Xo\nQ$:hr݆] !bɳ]E_D'bqѻ׍hkw[wcA\of+z rn'OA]"^"y.".kKЎKoBr~Dna1us܊]cM"<b~$Q5؍ e19EE~T XF?b.}vX\ZVXhAae;"v[$u#Z۷pov8DLC~o\wO[u>( :E,.-.MZ^ʋ2AXlZE@Dl".C˭M?bZz{ P㹊V+{xGs =8vvP4z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBBBBBBJ2_twu|}GćcQ b3܃KDG{N( x|z2uT??[mD ␄# 32f$f%#paf9r/4x`ooBR*Ta5B5dDQH35BOl<0|7ȒWaҮf߃MޛrBzzz*UNgVVG K3” 'aқIeue"G?{+&[f=b;7,rRSSi#}I=2^+v׃Б;Q̒]|v@FBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAA@EF ^"?Oq ](R:]PA S'bQ zQDZ:q7CA9cӂl6; :l"zq`SY,U /)[$mzsj"Y] "~"E~q,)./Up.b"y(@$[d~Dg.7[EfYmz}"5D,nowƽdHHS"Vݻ].WPPk/ށvװZjbJ:du@dv= bԽ{ݻhBlg]KG!22 ׳?7dumٶm>GLj[&v͖i+h=5#jf%g^#^G`Pk߾6}٩dddDDDW3(g.'Aϯ7<.]ɓjj|A!Cܗ0`ޢE l҉'}Yj5^vvYOa?\4z{w^ZbEVԫ=zw.\ s,ZvZjW_j/Y]vնm믿.J9j/ "--z"e˖3?~OD|}}īW֫WODN:w)޴iSuߴiSу0;;I&js+W̻˗CBBDh4FEEaժUj=`ݻVk6mϟo+WNׯ_ҰaJX@i_;wNU:vwu_Drrr?~lٲVZt 1MV?~llիW^ygX+""6>jFFj={ ~-%%%ͭ\r׮]"ҹsA!((7쓁 P]vڵkN=: /_w-Z5WZs)o]<=wŋst_UDVگ_zHD.]4}|WuQwyͩ"_ZH _׮]S111.ڵkVVm{7١CߺuKƍSVV:u? 5}ѣG>8JzWL͛2gttkDp_ 4hРG8p`Μ9ɪq:O>E]-[2o?.\PҬY *$$$\xq/iwZ?ߪjfԨQӧOOJJr:cƌY~믿u#ٳ~8fثWԩh"--l6[TT뫵%۷/ߙUq,WEM6YNi+We~\3WԥKV5jTF)"UTIHHpouV2P\m۶aÆ"}'O4[llltt>겗W۶m|PUJNN;ɓ'<fr7O2eD$33sĉyEQG\\\BB6F=>}z֭m.11qݕ/_&M4jԨĜ4(uBCCUhW.{IOOCj_~G̙3AnZjnݺBZUTw*v>ةp}Ԕsi#"͛7W.]ںuk~t__߲eˊHNNO@D:S Tp1b};vl!MSN]bMP|Zbaҥ>>>ڝ\c*fYtۿW׬Yc2˯s .Ԫky׼i&5wxxN;~xԔ)S}F(բB )))yܽ{-44499%YP󯻱cQ@iѭ[7unܸܹs8U_G__\>|XoQkwz5Tؼy͛_x___5g 4Z^z3gf͟?_m`0,\PMX,?_맟~RT{l65kN:ŋ̞ܹz n@1 C:tPMAEkoo7h=ɤݶm[F#Fh\+Z8TF6 ,pj z &zUBUڜ{lt\-Zj Bf[f;}fϞ)Y8dȐ|tk֬Y_]p_jܹ4={:tHY Boo!CfUD-ӲW^FqsװaC.L4=Xr弯;V5RN)rN>n֨Qt Թ\.ߥ~ 6hӦyş=^fiӦ'?w\mJj^xVZ?~"""ƍ~h)66Viܸq_T;vZk|###sÇ^2[kѣj<6ȼ3:u*66Vi6zMgΜ]U6LF5c F*'Ap8k֬)_|FFF֭kGIr)ɶRJ!c._>4%Jp ˗NZ2AHOO駟{՘ DF.ONd,c(-:uT|ƍS %U6m^y/txG yĉ!JK.M4f+Wj~Gн~, ìY̙zl۶( l6rݺuKJJ)##cƍ5|rLLLPL:uԨQ.\XzHjՊ{(nAjjE~.]P#;ñrʍ7hѢ_~R P#~又x嗉@5sLR# 3LK.ݿl!rX,SRR)x.d~~~KII w: :B |A&M.^H D tС3g>>%##c&Ir%ӵkkԨ/Sf9$$I Q2>}?\Fc6m֯_?eʔx {5mڴWPeff;v,i!'iii:e˖e+TN Dd2fϞu֪U:;Xr ><q |||ڶmp8TB@Zm۶u͞=ܹsB@kHHȇ~qFJ}}}v;OOk-[vޝ.pw…n:99aÆ<q rʍ9ߟy= ,Z^z B(ށ^N/D>|$ ,ⴴ&>>>ݚNS4p8)-@ZZݮ p UX=pƉ'Q/}';ѯ]tD3*bA iߦ;V2L7‚t7xCO { ȿ| 6F1R$Grudnrg6R_iif1iiaf1;A{3r2Pj!                                                   h^p8e8ӉN;SXtá(&/.+Gr\ 5qDr,$I_8?\(g9c= 9r9l_u~3|ރ*RṈ̚ƚ6rMYŚ]#QW'mտglَ- ϖx%1B# nEM81**B {nݺ5jJRjձcǖ+WEޔ B`r8nex6Ñ@uJ,_˔nexvupNz(J^,YUJD"ZIII}9B!`0DDD\ڵk׬YA]¼V'Q}7IIIBf ֭[ ( JŲp_ѣG)Jb4۷o=BJ//;8q`0ԩSAtX,k֬駟G P ezOl6-99Yח/_Ai@@@@@@@@@@@@@@@@@@@Py=;W>y6UVΝ=ҦMRO̶m:Ψ໷rT ."Sl xcb+Vk>=DdC"E<\bޘQyȑÇ;^%k4#Y%㍙Lb+:]>=v [$CȮJC)q:OcHK+"'4ET+2BD'2[ !(MDDDn08EDXD PjsE&""E([d/"ENlMaɳJ$M$\Cqi#V,Dq,+>8$7k-iSJfdcŠelTFaX,JLE?*R&YUIL-lY]K!mun6KG+I&w"yj[WWUu>_MF!1Vj}:0DukpBR[zj;]{?Z_ZG;>OuY}Ssr=S`WzZE@G?:S7!RWԙ:^-B8z~S'뉺"̷6֙.1L}^y_߭Ws4 :YߪձepwN˞,B8kg49=\ՓuE@Gl=Tߨ]u._4 x5u,ayz>R-|͵~~&,B8b&jSu·9D{]R:nX|..ᚩaG\ubQ2V<@^ߕtWTM+AG,_CUP1 \׾:UֽuC]@Gɇ>8Qm[[o35Vu`:Z[#`-h/TuYXӮz1zns?!d\zsႚPM׷jcM׬]ù{'6ո#'‘w>Yobz=VGojo B8>f^߶znݵ"\%t_]Q֥E@aP~P7tqD! [z=U?-BrK6֯=Bg`}  K}GE@aPVK_ueMטE@aPn{mu6y}5Xn% DBBBBBBBBBBBBBBBBBBBBB[nA?IY֮JcXu}ᇧ3xYŠtX-rW}ڲ ,իW_{V](v}GݰaXю9r.ə|pAOpmaEڻ/_;zycǏ{X*'Ncw!^' MBBBBBBBBBBBBBBBBBBBBBBBBBBBBXtL<]՛j-`hg꛵]1,4F/oԥuS}N[De}OUj Gp[Y-"򝚪[uZDz;B!j[f!w-+,5Qs8 Ji]i"Nr{mcuUB04kU{E`P^jU]Q/׌E`Pnסz~K-OX>YY7պz9zBhO}Og̱8\X>G`9`h,t.";BzOY7 !꺲^rC uzP;P/Css=5U-zqiTzTm ,O,@N> stream xڽXmoF_q rRHU$8 Tg8¿g'PnwvwMKQ^z6t̛ "!m}!_N=p$,k:})ڗ:w)tvE{A;<ˆ.d%hj N!B6(6v2YVBDB%e$u CN~yqB)c`_VM?HoMk`M']8F[?Ʃ?.U"ta8-|X @C#&F@>/f9pa כ|F7G 6v8i=MU\G<*Pl'10I"Ɉdc/$PO3cc^ w5\.4 mh GmV-ZsiC7Ю2X"n^4I"1*30!w1Xx{*}hm (Oҹ0eч׃rq< Q~T+2, +XO $253N$Q7NVm:z7\,}~ ,qצHGJ&?)YrnX]~bncO1)Lo: g-V;h,z$r fΦ"iKܔV+Eai5RDK6H LJ4- cMb<8`H[6-lX=]Fpi G&p{؇OGǃyWƴG^&鰍~];Xpv/Jװuc",Wd z_Ly2ztUz'?Itߓ/|}ʤOuL#{/!K`C7 S%u'D&7zLȓ;ؙ q#T;s/x&ᑆHb.\ %3:-g4I,;NW$0I:$9h=4"1hBys{C#P {-J!a}7=:!IB } ƿe g?7pUU Њ+loHx K7MSWG+d endstream endobj 3428 0 obj << /Length 252 /Filter /FlateDecode >> stream x]Mo Łqm=T-cHM%<_H(\(Ws6SMvLY>|3\=X%,oYm,8LfzTR(2ΰ;ϸRb!Zt˄Kߴ_ceM9%*e^*ƑF4K4\~25 ;T/"]1x+ 솎4bNc'cK4V ۶qw]O;a endstream endobj 3415 0 obj << /Type /XObject /Subtype /Image /Width 425 /Height 600 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3430 0 R /Length 9726 /Filter /FlateDecode >> stream xiS\ס$%N"JX|}sx8IN*b8vl!˖. %(f1 M &R[1?QKݽwUTku7c-d""""2p8ģv?o~f`:ZŸ6}B 髯xQU+'z(: _:}yV6/iޮu(|r^^^jfJ;}YG} >>AA}} >>AAAAAAAAAAAAAA1}} >>#>>>>#>>>>#c@1}} >>>#>>>>#>>>>#>AA}}}p}}G}}}}G}}} >>Aoen,F[gΞ,rXǷ~y,deeC߅ <hk,z~ƈu|Wgf{%u۽: ?S%?Ć9z4֑ge?;>>>#>A}}ǀ>>>#>>>>#>>>>>AA}G}}}}G}}}}G}}}K }}ǀ>>c@A1}}ǀ>>c@AAAAAAAAAAAAAgVVV^8gp8V3SSSۺί.DP Nm۽G&5#EEE}}}mmm BfZ[[uUIIHUOollWUU}S>胾ޮa>}LCCCGGi===.}KKKmϛӵ333NH8ؓufP}XA1ERhpp%ntt宬L޹sǝmyZE n/(uuu0}ɪFJ0-Sr>ܪ7>>~>w'VrnddĽJtbO7ӣM>cP(O(LKIERimmu'ⶶ߿?00ͯυ>c7jM\744$ƴiFX/{amr]t/h{.gffex1XyNt8F]-}8}ڮĕ{JBѷ@o`qyut(^}Vz{{{BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtpoopsQ?Si+\Ɩ_H_}}ŋTl7Y;F\vIZ-;ѡ._vU+4!F_C?3}& ?ý@hЏFB p?^ Џ@B s(^ HЏEB v(^ xЏRIB?CC?K }sެ=7a_,QjAAAAAAAFAiFAimn!{܋UqV/}^| .K{V./iޮ >>>>#>>>>#c@1}} >>>ǛLokwwֵ\ oU+gʙ>裀ҧ"_L=)>Ӈ~uE=>J#}.(_Z܃>裴Ӈ~w@=> }J?_܃>#_g~)sNH_ַΥN2o|R wYTΜ;QSXVV1]p'= FKwK*_wfOs]o [כH^bˆWw7"_rnE>s~G}b~RA#^>c>K~}4҇{.p/A1BW?>Fý}H1})n㷴1͢>b7XAC}}ǀ>>c@1GU+7Aբ}dO@Qpq/2wAAAAAAAAAAA_"u/Ug}*4r+nC_s[qBCoל5O=K{G^/AC4}+++/|(|.LOOGm{nnnvv~¡666tp8<55~yyY[[[~Aw^ɨ#===82_TT/JJJtǶ6,loowuuuwwv= .eeeoSSSMMVPPe{buixx8J_GGGCC>j%oiiyKguP7zCCCǏO:>^7=K{1ѧ5[uuj"%nttT 0]L޹sǝuy>׭0zYL-䑧twD!mow:spp/#CT}P]t 7LQj(mua^X###uuuP%%%ZiŨ =n'l`,**z/S3\Tw<}W\9|cK`"N 0=o[[[eeӌ;OI?wFKĆgE|'pZgj}$ެ3+L1 ;Z^aOSnܸ!UJԌ2}_|Wx`?(WCrNC""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""O>ݭt*nٟ5,OrԴd)eP=Z^^~!}/^t|܊|vɶ1gYvsv>|k]1X^8A]|9//{V37QzoY ==>=#==>=#==>=#==2>=#==2>=#==2>=#==2>=#==2>=#==2>=#==2>=#8|}^u~8a'2»a΂qC΂>Y/ςо-[WꚕЊQt<\xYк=@F=ςOwgشͲ>?:yhwx&>=#==>=#==>=#==>=#c==2>=#==2>=#==2>=#==2>=#==2>=#==2>=#==2>=ܣ@Зw~iW_yOګ==#=܃>==#=݃>=3=#=݃>=3=#=݃>=3=#=݃>=3=#=݃>=3=#=K|}> mnnnmmEof۶.D"]uKKKSSSљ5ͬ貎1jȑ pJ9ˢ5#EEE}}}\FGGpUWW766fӚw@mmmWW+,,U###za=ýѡI#⤙;٩ZooKoϛkooyܹ344:>> KE,ЮccczE9?ȓz=ý$ѷ,pӔB.qJ1].--յ̝]R#i'[SSkmbbB$$i.:ܻkXRR&pRNi)D]Q2yB}NkHmluG‚H3+++uB=bSSv^j BZp]855بu]AAa^A-t㢢]v)P 94/3bԮ\kF7oތ _{$o~sƽ RH;my[[[+++WWWls_XZi2bRũVS Xq ݭ:/yݿ vGȱȵ3FE؂3<+{ʙY%KZ} Bרs8 / vww큁osO,:WIo&&&B 髯xCZ9c^8rwj{._}IOokVG{VwA_CDӫ~}K%B>K># .}}G\/Џ/_"A_pCDC?҇~Ї~}K%B R؜qw.%H雰%zB 7}G>OnCdЇ~}g&}GЇ~f҇~}g&}GЇ~f҇~}g&}GЇ~f҇~}zY>#3jZWЇ~} mdË~}}GЇ{Ї~}w|[[1 [҇~}Ʈtl_^#3m+<_JA{Ї~}g>׺7>ЏRLZWUsG߱@Q3l)N_eC?җ_Џ/S>#K}isB_z/A_Kc>#K1}~=TЇ~}'Џ/eB>_eC?Зk]>Зu;W|ϟ>}#qY_ο]wN:_2oe|_?籶7l)_qw%6Ć7N⢳x˱ͳg}}F}Gg{}}}Gg{}}}Gg{}}}Gg{}}}Gg{}}}Gg{Y~c^#3=3OCpϨ >AVAQ9sZI?}{4ArݛAFAiAFO (I=5<ֻʠ(=agAC?#J}w[AW=> {}D\/J_f~ S$e{?K}d&}^LAe{'L/;~}d}&wq>#C3ͽз™ϯlnnnmmr$p8lll3˶m7ޞLhP(FLRO\92ݭ#EEE<::/tybb@A5\VV͕uuu)..v=uvxxXwA8JL?K}q}}}S ]]]Zt (>:'ڴlu˦ #K6@Q0[II\to399)޿_S뽡!='4#ý}OUWW 7\Ƅ.kakܹ D]r_nݺw^UU;/t(TVV6ѻ$ȳ6z,Sr3>{~ЗU2L.1%vQռ:LVzUsnVh͛7}NvigjjJ;_l~~^3Zg Z#kzJ2>;F?K }Pݴ+.1$6;LK=//.o^]]nxuY BK6mcwvvv7z=nnjOA_,߸GKATXaͿzKKKxK;::.tYm*I蚩7'1#snD>/ G?uׯKl⮶ѣGw'" N nNyi[˓OR ? !uo=2\YYy!}/^tkƙζ)#Nġ45 ,8x)v^^yyywܫV> K{zyl胾(}׬<}7Dҧo@Y@$羼}GC??Ї~seC$}w }/AO>=胾o@yAIC??Ї~}wBWA>}{}1ч~~w/V_AA>K=胾C??Ї~q}7}/>@A_3\8܃>K>}{}Ї~~@v+_"AyH>CK=>oC??З%A`>=C?3M?܃>>=C?3M?܃>>=C?3M?܃>>=C?3M?܃>>=C}Tχ1M?܃>F >_{H~p)|SNУ^3?<͈q9^s?8wYKYȤӧ_oҶ7[~Ӗa4jy֫psBg-z߫/[4hI~u¥KsXo]]vY_Guuo7G>yY#AOC?c={}}ro1R=>K{Op//{}}f~Ї{g{}}f~Ї{g{}}f~Ї{g{}}f~Ї{g{}}^~AOoy7+9g.@Cosϕ{IO_K1LO VCΠ߀^'N_`Зlpe{I/A0<[pe{}!}2=>>}WAyB>CD?胾=?g{}З } t/A@%A_3ܽ>苏>}~}qЇ{~/Vp^AD>K\?胾Ӈ{~<=>; }pC>}~}Ӈ{~<bomm WVV~ {p8vssӽc(m},wmll̸C菺///G&g}p/A_Lɓ/WWW+**WVV>x𠹹Y3paaUUUW]]ޫܽZWW٩ɲ2c{{fjjjt@ :{( .^z2w=9}p/IAI5q̝ihhzZM >:cŘu] ĥO( D䞠]t(Z.Z4hFуDaֱ͈1=fNH>K~ 4!jĉwՔs;\D@ KdKK{gG~Kq=-5]֌622ҳ>Zajmhqg;44p^R:::ҼVe2GkY͋iY;ҧ̺?NnA!k~}Bʹi~qqQGVWWu :.:$<7҇{~}#}Pp[[[G ),,K~}GҪWwwwCm%fYR %1οeV_LqK2Jg-բ]L:WK>ͻ3Rn:n٩hi p8 Z꩞5xXqB;؜3IF}7sO^Z )AЯꀈe endstream endobj 3430 0 obj << /Type /XObject /Subtype /Image /Width 425 /Height 600 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1303 /Filter /FlateDecode >> stream xKVY🥖ADBP"b;W&QaTPj-6QP u!]p;...Ɖ'bff&O799x`zze<{,qq8uԦzY{Y>^x9uuuťKR(?>FFFM6nDoooܼysl~~>jjjիWoKKKׯMq|Co߾qFz_XX)pbnn.axq޽3gΤ)x[[[qڵ(++KeJἝ'OD{{{ Gyyy\z5=zY,))M8p zvgǏS[cccQZZQ6gƱcygN}:R]paoǏ48|/[Iլs_1clջu+iݝ>?1e%w*'_-Ow 7o> -?mgvqV? {ʶ޽.[^^r_olz{.\+++Bkv@R/pڻL&w)0od; endstream endobj 3433 0 obj << /Length 258 /Filter /FlateDecode >> stream x]PMo0 WHHرꊶVn]K)R:/|i-;~F(!eo"+MB-&8VXiT!qx)zpVM>YCuV[ LbCv:JZB {-։ CNFF/":⻲^&8uuSMm^Pwn2^m/gAj ϔ~4_eQU߻25c@f( endstream endobj 3418 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 700 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3436 0 R /Length 4870 /Filter /FlateDecode >> stream xqѱv@'\A(zT!}{}{~A'O+PW#:?Gt0~B]Q` uE="zD@'O+PW#:?Gt0~B]Q` uE="zD@'O+:IO􈠃w#W4A:h\x="qE􈠃w#W4A:h\x="qE􈠃w#W4A:h\x="qE􈠃w#'4A:hx=%q9͌wг2A :hx=1y iR:hʷtДK!)CBAS@ AMz)_?c4-||<v׬ƼWNztk1BArv55R:_3BAΫ_F Aup)jLktP']-BA[p2RjLkte55R:ȲS)dYp_F H: :ƿGO FPutД#::hA4ruPAM9:AAAS )GPutД#::hA4ruPAMRAE]S"XAAE_j4:p4:n!ui G]wQE&p;4>< @AȞq3:VgtP!{B[AI7:{noFu dA^r 4:=vhtP!{íBۤAL:mFuw>PuG2Pu&PuPu졶@F!{mϒAȞhgtެq4F!{mAȞest7ٮA(G!{mAȞb+tw~<:#l9^BZ@!{{s=EA^](ٓk ~Ƨ7+*t}sEu#ozDAA:边:A7WT="N<"N<"N<"N<"N<"N<"N<"Nt}sE}'R:边)t\Q߉Ww"H!qE}'R:h\Q߉Ww"H!蠉_QO |E_ AMZy)4+jR:hWΥtДK!)_QۖBASV-|EY A)4:htA#_H!?ht'ct/jt7atL/|_ AMz)4||<tДI> ASu^:hWΣH@My )_6O4u|6|<tД7 L>$AS]^:hWc@M^y/)_*O4|f|< tДɁE|>BDߡAOQAר蠉GA5o7i&ARqL<_⚙x}<>N)3~|:;f DuG#+ .ɇ8_n ߪv9,>'sA.We|:Vqߕ c2>]ırI|]׫TΈL!1F9 >3@4:9>647.9>9(:" 8G"3:nC$@ 8A";4:Oh|9na{O+PW#:?Gt0~B]Q` uE="zD@'O+PW#:?Gt0~B]Q` uE="zD@'O+PW#:?Gt0~B]Q:zDA{PW#?G$~B]Q:Htp?A[tP\h-qE􈠃w#W4A:h\x="qE􈠃w#'4A:hx&q6w˂2A :hx2q֠awЋ:Nb'1w룃8o|B-S} j:{@ɞPkA_:hj:@u0{B-P}!j{:;̞PA_ `ڛf@'Tf;ǑBl%Bl5R:H! _F AwE AyT55R:ȲS)dYp_F AYVc/\#,1B80^/j}ߡ?}td#::hA4ruPAM9:AAAS )GPutД#::hA4ruPA M9:#:`|>Qdڰ ڭ ڪ ڧ eڤ)r:mFuO!{-tg d/As{3:ftP!{B[A1=:KnFug do5Ap4:ޖi 8i Vj 8ڶj k 8vk k 86l:J[ D۳% >[= 8۶U 2[ ,wn]:ەryk\^- oE:'+X.p!lF֢[~;A- 6tprbל\{.DǍ=| ` uE="zD@'O+PW#:?Gt0~B]Q` uE="zD@'O+PW#:?Gt0~B]Q` uE="zD@':?G uE=" zDA'O+APW#?G$~B]Q:ןwGWH!aɠ-w#W4A:h\x="qB􎠃wkg3Ao :hx,\Av<6H;AP1Ao ::zqtPP'1Aڃ;APw7R>t I=dO5꠯ Cm:= =fO頯t0{BM}3ji:(jc:(j]:(jW:(jQ:(jK:( F AA#KB#Nkte55R:ȲS)dYpt{QE܀FAA )GPutД#::hA)4_ :X :X :X =Du(wВ}:d;h:@֫:d;h:@:d;h:@V:d;h:@:d;h:ZBv d;h:Bgg0%::cnoFuތ d﹥AȞt{3:VgtP!{mB[AC;D!{íApIt2-OD!{JAm˴Ut&-칶FE!{zAj atW,쉶:{F!{ͪAgKmt,Y.;G!{Adytؖ,)"G!{=–A^` dϯx tN<:k!^յ BZwȞ\K._|3 endstream endobj 3436 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 700 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 837 /Filter /FlateDecode >> stream x O3D/5 endstream endobj 3442 0 obj << /Length 680 /Filter /FlateDecode >> stream xڵTn0+"CRrHH/E=E XD@]J!r\T rIPZoV+PhAC%ZU):ὩWߎGm^b}L۾G]5f:ؠ%ӊ?uӢ:)Z7&.SI28_ڡ7zoԂ9\v5o8 k=FL>6<>n(qVf,!F RJd U7OSh"953\d){trk=ڊ[Yֺ4649*+Cs U;ؘ>#|i6X{lࡄb3T;S(s )N}M Ktbt;%C^S/?z18)6U4ͬ]Vpl5ew'!<-"W`V  5Qh&X^''1>Ԇp|Z֍0ԣI#x~ReZ9=lxj3br2\,Ǘ*H endstream endobj 3438 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 700 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3445 0 R /Length 4738 /Filter /FlateDecode >> stream xQjA@6y %0RwU**9c2N8ϗ\";piD@P[%:_Kt0BmQ`|ڢ. E]"jD@+uW-P[%:_Kt0BmQ`|ڢ. E]"jD@+uW-P[%:_Kuݜ4w%[4A:hlx]"蠱Etw%[4A:hlx]"蠱Etw%[4A:hlx]"蠱Etw%[4A:hx#蠱?twЅ;3A :hlx].蠱'tŠfچtR:hʻK!)oE/&tR:h;-x\:h{]x\v?BA)dM5vktPDG A95R:Wfr#W])=6H! gTc_F Aup%1R:ȱBAT"U])n5vktBAVc_F A[])S;[AtPA>4}W':hA4ruPAM9:AAAS )GPutД#::hA4ruPAM9:AAAZJU RAEЋ2.2"ht2"ht.!v f5yBF`YJAl$/ wAph=wzFuA.sftP!AJwnFuܹAsGgtP!̝A&wFukAphtP!AvFuyAm):]S uP!Bv];F)AvvNvzvt~vnrvhNfvbZv\NvVBvPN6vJ*vDv>v8nv2.u,u&u nu. r{Xv{;xjНt@DjA]:Vt:h%Z.A+J^{D蠕h%f/ݽZVKtJAD+ѥ:h%ZKwVAuJAD+ѥ:+J^{GuJ]: Vt:+Jt頃%!CAc% +1A꠱utP{GuX::Jvн:hDAc%f;A4V꠱t+QAuXwtP:hl;:>AA4d;A467:(މ:h~މ:hY}މ:h{މ:hYzމW:hxމW:hYwމ:huމ:hYt:ȼA:8tIFAϴBAt f~FA9<43mt4::ᡙi#AAL)DrxhgH! :httC3?F AApv`K: :?_>xDM< :hAt4V:ADMǠUcЪCAS1hա)AtД Zu :h?:t4V:ADMǠUcЪCAS1hա)AtД OHAS1h"D+At1h<$63~ IЌFu 1ht4ǠAӌFA1htwЏAA A?:(F`7cAA::xj:A5::htPAA)AtPStPKïAA::xJ ʢ:<وN Am":::kttPA DAtvAA@uQAtADlttPAlttPAl tADAߺ:hաC@;pé' ;h]/8aAz Z N@wк^p:80utpx' ;h]/8aAz :;h]/8a@Az :Z NAwк^p€2ֵtP:hK׵tЖ.k -]^׎P7 A A A A A A :F/蠕etZYF/蠕etZYFt2:VA5PtATCA+KuP A,A5,aTCA+A:heY:@, ;QCARNt~H5,OD A靨!蠱$ :h,Fĥ; A+H<wA5ANtP-7TCAtP AuA5AKtP-+TCA+݂A5-%TCA+=G A5tftA5lttP A+TCJGtA5a- :ѹ/>:巍*`U X~ _2::7*` X~ _,::巊*` X~ _&::7*`5 X~ }[~ M[~{ y:6zob/S@ob)btl9N^AЛ1:vz9F6S@ c L%`wEyQAl- JMץ`SQxc:v턗N 4xu:͍ޞBsB?547x ͝^&:Hsۀ347 x ^,:Hsw'M0~'{wPߗD>N:t{tAAP=@mEtZ:!u]:hO[tA 蠵nAS)VJ@-Rtڨ:Tu:htЎA7e.A+W::h{AW]Z:"@uPuPAuBA5AYA5AMA5AYNtP5;DAM5d;QCAM5,pDA7{;QCAͮNt~5,aD A7;DAcz'j:hlQD A靨!蠱A46w {;*@M|ŹtOtBkH]:h<*AkJg:h#@4^#U+Utxv/tкAyZ:h S@4t+K=0A)D|&:$hYA|MApMAdYAUMAoEMAh E~MAhEZ4?|i:H_ /|D:4?aAlYA8;7QoJuk5QbuKgQ ؠ:|Y6YAҧlDO~>Y>d_ endstream endobj 3445 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 700 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 5218 /Filter /FlateDecode >> stream x UU3Ɍ"B"JD3PRi,jZi,f J HHbLmz ^@O޺{ξ{xOEpHΝ6nܘ.= 80n:~3fL馛R-:h?[nMsO 7ܐmۖҦMRNŋsk6'|2?>͛7//۷o[e]oٲ%Ֆ"5o}riӦ}, :4]tE騣Zl3gNKҔ)SR׮]\Jf۶mSϞ=,o֬Y9Bɓs]#F8sԹsbAut1н{ϑxDsuqFc4x~+ȉ@Vq2gF\s`p^jz_Z[]~wӾV/>eJÔ|8P- U}׮] z7Zmu5nݺM6.׳z}haZRt7.2(رcGz{ߛ>vTymذ!]s5j;wq@Ci}>]}7@r;Wk /|χؤkUcK8v \_pƍiӦM#H7vؿW4O]ZN?4ljJXӴ'3PZT2*M@%H!@!@ TRPP@%H!@!@ TR %P!H P%@ TR %P? R/RcݭnݚQfݺu}~ǎ_.ߟyb۶mRW^)ֵaÆT+WX^}6oޜV^]'!x|XWo J_ti,YO>SLI-J/N_W9E`?>L,9sfzNJ̞=;=Q6/_:?:t٪US˖-O<^|\Oert9}́$ڵ+`?>&NXl 0 Wls„ ySO=FQL={́*Ķַnݺ}n:(C3Pݻs|X16<4o޼x-Ryyy:thn u=/[ޒ{;, <:NPȑn^x!uԩxݴ髷ZbE:crs-|"u%5iҤzmDpׯ_/NڵkSv-O?="s8((J:`o 1iҤf͚,;w7p)mΜ9Gz;3s{G#E@y uS*l" 2$:cuE[Uu lْGK,`f#X_t5 UrQ;/D n.g]|oQ&!D)ZThĀ8-VZUTqYgaÆN:)$ dQ6^Ub4hP>uz?sЊUhR/9Q#@G:8U۲5["NtEҼyz`>#shiėΝ;sVUt=uE*VK#ZCq*,D ;SsW4Q.ZwL|QkϱO\#Fq+Nǎs]2Y,T)ZXQ}VeFR[ꐵٴ:2 Pƕ?'N+*e}R;ܻw[ƭN ]tL"90__#[ Hٛ^}Nl* mǖ9m;?ypYYܸrYmގ/}o[2dH{ҨQ@ ɓӌ3S-?vڥ'x"5mAզMvmiӦMcǎio ^z^8T_JGyd;ڵkSm2I&_~9=k׮s̩t)Z;\CPe?:Y8~=\fx@ 8?/ܹ3{ p@1Ƹq?y{O?MvA^RϞ=c=N:ZvX:th~/~Qe -լYy:m]}\AL7Ngyf?~Sy睷uY9G>/-[iÆ ߛ>D@'>}zz߿Wx}? g>񏧣:*[.-X ͝;77w|[J5J~z>rKC~}9n޼y:cSw{+zzV14a…iĈi̘19Ҳ҉'aW\qEwS=w#_>O$}{_KŋS.]/>ڶmw]3Lz{->ϥ;3s99qNAӷ|רHO9_F6Ȯl?vb>=Ҙ 1k֬!CTo߾y'pB_^agƮ~5l;V 3W^q1i&pP*_|q:c,bHFÆ KڵK_~NKGqDܹsҟIS )̋-Xb~鷿mIM7ݔ Zj>|x~oG?Q abҥK},bXȑ#2dȐ=.baDQycqD~V9nDAgwuWPTq^xa0cXݨQrbI_$h]uU5xsڣG|߮]c,uөntGwqGܕ}1[W\XgNKO=Tԧ>/ "è=o޼|%;vlNяVY~뭷'N,.֭[^׿uuV&@bWՊ&MTl޼2uL0lΝio~Os+cEvӦMO^\6`N:UlݺJپ}Vt޽2L]t)~++F]mݖ_ﯱ?u=nz4'zj{]TVYumoՋ8ӥnȧ,YRlQSԩS<{=zNKgau:qs8Ng> + cʕ5zSO!ێ-Dd]\}z\H4'*ի,aObld;J˗/7r+>+86aРAUx֭[iE-1 ݴiSfcbur7i(&ᄏӭ[|^zwobxԦFYz|㢞 Hk{I!СCqY2g{׸Xf۶mgJ\WϽ►1 Nq> stream xڝWmo6_*6'RpͰEj`"%Z&"K.)~/)[I}HDw=|x=pF)6fe96:i!vɺK̀z'An(1 VWB W=Tϯk~ v#p5U )HA3b6^":#EUCOz8492豃A(8 ݲ|u}2޴mDj.(}?Ye#=cSw~^}}]VݞFQJڴm6mmxik b6[.@La&ART|X-9 YAO^l/Uə3<r.9_nAo)!/NNnӧNy}VȺ|p<ീ aY"›r{jǦՏ\`aw))]rJYߘ&K__nKl{8MX1x/+*Y꿙v}+v$ mƺsNJoI3; 70}= _5'ŖV7^?F/PD&?;.Wq endstream endobj 3465 0 obj << /Length 1293 /Filter /FlateDecode >> stream xڭVn6}WyYH@ EZ]E]LDdId|9"pDs93#͈[^,p$X8I@P b\uwByb$I)$&Z^Š_es0OS8vRkoV4g2ojy]JRru9pz%/Mxۻg{ ުۼ;9*.2ΰ?Y^zYe' #?c\wl{*ߐѝt 8TdCtC>ק. ~w Ds&ɢK#PwMHQ߹jfCPrSlͅ3 @l\Y%*CZyjA4 (MȲev @Db5FK*D [F7p|l;8L8 7Koyhv:P\.k7kvXпB!ԭTg j˜"v6MQ@_TCFPb'3|ICUYzM}Uѩr5&tKݠD:DխT$w("2)% iS! "I#o$#MSMi1t^*JmY:ӻrʷ4Lm lB@M(Bt֕Gj]z4k =vއHmlmwt:-jؕUy#Ր^ˎ]ۅ XCp5:nQ<. +=Q[Saz:V-R֏R{Ma*Q(/ӂBlm'g`N%Nd;*Kꑃ7,}f*[bf݄{ KKSeOaG7KP`РpZ,Πzڢ$ݑ}; H(Ew,oTao}g ʵ?jU0:tP$|xn 'Q_~L-8VDu9#'o&dO?^݌ endstream endobj 3453 0 obj << /Type /XObject /Subtype /Image /Width 550 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 14292 /Filter/FlateDecode /DecodeParms<> >> stream xwXSIBE (8[[ժ:j(u娫ulU,u 8 "#ldxS*N$1^wB|N ˲~@r@r@r@r$WsRs@rtR4s320 Q1K$RIC>?82r克,:rL#k:sܲgOrdelu_r?gߟ~B Mݓu(el~eE phmֺh;)y))d.틶myoޓgN9oisLutwNTBIϒ^ja8\'EE ĎbGL@;%&λw4ok׈Ƚ8$/v(;j5c@mܒ0c:Q9?bƾ)vR*MBj306#x{v}8oݸqFo_J n'Ӭ ȟmCefKeҕ>+zB@keeVnNR4e^O18ӓ?Ȭ.ffEw M+|.!B,%%BY%YBry9Dob"lDZ׾a-!:1OΥK\\\JKKU{/6n511mv5cƌ֭[{zzkn„ Dtڵ޽{;99]VP[ǎ===۶mf˗/Z*22RTv(ˏ;H%J"ɹCt鎟j)++裏8ӧO0gϞK.oUBBGΝ]]]###(//߿cǎ...cǎ}5mյo߾?&'OO{UHCZܹsUw]rR)fS%=lqsM^U1N~j;8SViӦXBTFDDTVV^pO>,ܹsĉ >}YU( wuuz*˲Rw,˺,+Hrrrvzq//SN,7 <$55,e,(ôF\rGEEE>}4˲cY6++͛oO||+**X? "ɾիWrBvy,wYf,T*.\lٲ}nٲeΜ9SNU(gϞ9sѳgCf* -͗ Roۦo\YLTdϔ)]`2&y5@s\bEnFc==_mڴL&ׯ+m۶yyyp,--+**"""<<<܈H(߿U066 ѣ_}հarѣG'H9m90K^jozuKCws9\DMc:w?P(&/;tpƍѣGտ*YMMM}qpp0%:33iڴiVVVRRa@@@zzÇM֬YX???RZ"0mՅU{/77qU'u}T.id敁>gZE䲌nȶʸo$nP-111Ytg}xe˖)gϮ[NXBϜ9|=zݜDk׮f͚UeiӦUg߰a[FannɓaÆN'{) Dzc7[7- Yw϶̘1cȑ>)v_899<0 ~'B7|p˗,3sRaLLLTgD[*ҥK6ooee01Ǔ+WT;pepi >o75Wo"D Ğ=}0*4M^O6TBnk(;L; ?? ̜9a?mkk_s%KJN.]8NΝ322TLLLiҤ۷J:O?%?YfBȈ+**W] ӶU mx{[2y+~5$xqdEԊ?bEߘǴ>`:"1pd㫋3TQ&>_=-|>_,F8R׬Y33cccXljjjF/]GDR4$$a(333X u,ŵkUcEG/go;_ӫ~PNbK{Zܿ?77ٳgL* @@D666666wJO< _bjQպu봴ⴴ4RٸqΝ;7ZM=Ĥ,\:MJ9c;̻=EPܹs'77w۶m|K^khff{ٳgKRL6~޽{to'O4iR|~hh}qF荮P*yzzرc۵ki\nHHȷ~۱cG.~]v}:t(˲K,),,2 /*X|9טYf8pņLOˁGx8KڿQddJ*G3>W32((_ݮvu&æ{|U/RsFFF ǂDD}Wg;x3g~?cqK-Q'Kֈ1}PSuXy{_=zѣGcΨ>￧~R ײ7TP$TT'$cTЈ Q@uTP_$}">M CωV}˾E곤d/=[L~(8C^[q1Խ{P"Ϗ ˤ2?ҿ U^}#w [jc_3fOY4/`oQ{/ћP-b̫fCxt}Jҥ;MԈ(8f޵NJK\,7Eu>XUU0"է8†Y` V$P)aDGc  9R.^h2DQ 9r%u17 ި>vo8 ހfzch ȪUdO@o@`Pd \]iXy1'IiHO$}?51kԛU΢E+0jԩ%ƶCJeW%\8 zӰPЂz`z7ހ:7PO{x[7H:}ƀޠ7Z}˗c2^kn#x<,'ԉ ۃihLVD}vNfQFHN/$$@r0@r@r$$$$$@r@r@r@r@r$EuaYS@r@r$$$$$@r@r@r@r^ޑ 3fӧO;uuVe߸HsssOOώ;v-))FձcGggӧѲelmm===rss(%%e͚5G͛7Ϝ9IWDDD;s@r^o]zuQQӧOwڵpBP(9{ر=33mֻwׯ?~RtΜ9k׮_T={vLLL||P( ɓ6modggO8!}ݻw/h'Ous񅅅G޽]7nx{ j֬YXX͛\5 s?~K.۷߹s _mڴiEEEJJJii/0zzzC~2׸q .?~ܹgϞJr|Æ -[ }>ζ={vNƏ?a„:ab>gϞ[[[ҥ}ꫯ>ܨQ#H7t&M`\u6ȑ#ś6m211ILLn޼ R(FFFaaaiii$;w,]T*Ɔ B}}}YLLLLLLT>uT~~~^^^jjܹsW"266rgϞ522IMMmXd#F1bŋwѵkW՗ϟ?|Ç/[ CCrX,&LGGG"rwwwHԲeKR)J1egg7`-Z?V$z?eee/ Bgggӵk*9|>Yf999YYY888a0 SuX&99^ںukBXVV#a~k:cjj*_XP(RSSR) Xlaaڕoux˖-Ug744fff\]]_.ݻgll,"##]H;W9IIIJ2&&UV VZQRR2j(RYTT4|>h̙7~lHǎaP( 7qDkk뚧D?ӟڹsgRW_toݺu۷5k삃,Y2tP///7^"iIM ޽{\\\@@@2\1t bŊŋd2G4j޽k׮}siCӎ4e FXBCCoݺzjm0rYdj>emfǏ9r˖- g}#HDɓu[eAs /y__β,0,FQÁ\q!]hrciiYxlNQx8V9PcNZ{2p`U7_~I5:AA.:nNѠAH:;v` UɩQT3p FVAuPu__~P^^iԻ7j;ߠ^*SDIz_t7^9]BЗV)rt!9MUuZR^{R.WDa΀H: ArP@u4T$Ugv0ArT14=-@筪4PAC!+-yTArm!pt  zހ{syy/6,۷7!@o>ToAoPo p` v=\ ˲5Xb2WiC7 \^ D: Z/MCހfx S{zP9wAr@o4$@C!b^ڱL V9 7 z-_a"ReYy><'{b5s1$\\ ŨEPjgTm ˈX?V/L1Dl^t sLmr/^]1cIBܰO>7T%g+x.@r@r$$$$@r@r@r@r@r$$$y{{s8eYL>*$$$$@r@mCr@roȿjmAݭ>I@7d\ɸvRT*:~hآ{0+IRY^0F8rYrA?:wjQ$$Q+ZkUYmnOrnH4E[tQoNRT*3 剩'FoWΓ?(<&Uq l{W_,yZҴc-.xq薡?!r.'Ԥ]I&{Ie"0"bڐCt7X{, e% w$V'{R^f-͗fg\ܳ,Pׯ7-^sL)lAc?eߖ$$zaP'NO(999..nȐ!aaa XYY9䍻:w˲|>gϞݺucFTFGGGGG|-Z }ݿ ֺu4yƊDCfffӧI&ӦMH$bⲲ*++GݨQ#"rpp4hݽ{7!!A,?fffDdiiloop<==ѣʘеknݺڵkD2x: {o)+1jCfnla~v$0x޽....]:tjB8˗7nc#Je\\QG@@8}ˠ[[[UohԨQÆ aeܹSTTdee׳gOT*H&mܸ/04gOi;X%{%xFߔ}؍'~#Պ-[maa1f̘TsM49111((Ho鿮GcZEZmW~j'9rd=hE"Qƍ7nXCUM'cƌѣǔ)S>}JDǎ{!˝_P߿„ 3n!$+b2٬HԜ1teYMOU]]6gΜŋ>}Z6ڰJgY_dR(cttefjѱgϞ&L8qgBCCCCC_Ϛ5)44Ϗl+(/oʴsgYɓ'+V]p@__ԩSŪ"j:me8̡`jgZ_[~WoooP8::#D$ ]\\jOr{{{.ۼyhOid:11Q iFɩ ---]\\pJJJLMM%YYGI/<]|0yr6_֍UXX7Nj-jݺ50ZڵH$wޗ_~0ۼnse㕛ovoke“Oǭ|Q+V,^X&xXށݻDz,0,˚dddXYY}7o WWj҄"# 3 Nԭ[$55իZxg_|Ed.;_,,!okss}~vرc_ؒ[={FzѹsXn e˖>kZW/(gggG]{~z;w J :yJ$P 9@ArՁZU(*-/]Ugh΅wޗ"#woQ]zNLqa^R"P(7ͦM77^UrM [[Yze p}.9y֫kZh 75#p9#jSwާ7X&7H f ڸc皼Kox3g7t 9gj$Po@o@C!"b_f+B\^VР aH_eaYjKU(ERdB/_8'{d޿][q1Խxd Ð{o+1ly?~ƕ =^o׏r_kxb> ĥ Fh;@}VD'4G] rH_4z๜'gz&۫'I_|"Fo@ݫ44jݞycoR$%)SOss}>o@2ԼAo@Ao@AoO$ fj_82h 9|/sTԞT4T4T4T4TtW>w$iUu.屯8cZ`MKK:ިh 9DdNX:դRٳg0 Nگ`ڵxuUu0PмPÇ?suC Ȗ-[2 "L΢E-ZT )hX-,Yҵkר}͘1#44e˖3f̘7o^dddjj*ꆰ19/!"60PAE">_Ǻn |"eYHTZZZPPrJ yԨQ~i.]߿UN% 9c u6mA1lذ={~gQQQ ðfp8H@Z|.\8r䈿D"ݻ3lmm/_kHxӧOƎ+^0`==7FGG6s=@r@r@r@r)d2P;yvZ(@M i**MMv:T$.3nY2TJЁ]4ڶEu?~rL!n$b>eeڷC`f@ԉ\JVYqٍvv=Z@uoQo.^ۙ+؛79fBpNw0NW -j?qƢƭ[c>4ꄄ맪7ꌒUOܟZdZsr#-M0@rXoBC);JJԔz& c:ί 䦄 082/~Ԇ% 22b'wwG PQEѺKK?{J) `KPZ5jDOĉ ԭwOlsŋ54iBx7Xri流 6(>ٽB20 wwfꐒUV4myѹryB@o@#Gj Srr 'NdV$5^8u$BÝ13 #{4d@G>x# ܹLy9PL ̮]Kzu%_vR艵2Je!}CW| ;;ɓn3fjL&;tÇ|}}9,-i68 f(!?￁:Ͳ˦tp7+{\{9N0IZV9 p8ǏWm_`G}\^^OR8LJ]zD&$c^e>:{P;oa|i.Lm/ Z(_esE8!2VK zuy]gO>o2 ''&&f[nMMMussSmOOOJϟ1acI:>Th:y jLNTTԎ;gddTRRr}}}__VZj311Q*:tm\jB45e""ys[p@mrc4N^]v >|ܸq è69R3g{%ˢ͹7?_̘1^^gUuZ$ۻjS:H::HϽQ'p\""X"H\l/l_-a͋lc-:^<_@ɹSֹ :ra@rP$$@rP$NVi9䨝P@9 9j ޣ7HzHz7 >ܰ}]IeK!ǫOAAB7\@mp` @r$$@r$$_ؗY|9&jud쭠JOaaSЮ]4nۧWRW.W65t2-xvu+}O0xx_SFU7(@}^`:m>ܠ7HFW/7 zH_Ѓ 9ލ zԟ$%ҥIJ0ۧ_-Owtѣߡ7ŕ;Dk?ZϾgiWEHŽi&O={^wDJLK>|yMIN^عe2/k#.Z=N4$@os9Zm$W-X]BCCoh -4qb}"nHv۳>T'!*s!4@r:&0Q@rݨ 9::h!T0$i1BK?I|4uHNõk3-Y3kTLju0 PUgd85ӪHHhguQXmS+'33300,2 ò, C><ΩSΜ9cggMD Q?3===yxg;wz#˳haaoꔔM:w-uhÇ'%y㉊X իWϞ=/]‰u떒BDϟ޽{N\\\l"ϴ~'ӦM+++{% 3gNܸqU'_|8 ݽwr_ wrr!C q*Gphh|}}׬Yӷ+W*oܸqĉuֹp lڴ=//oVVVÆ ¬9b a?yd߾}{Z n:}ٳgϝ;gbb=wںl˗/8pٳ27Lt`}:AT޸q#==}ܹm۶uvvNNNnٲSNNNAAUVVV3999FСϜ9ȑ# JKKsss%R$v҅:88ee2L&{~葉e-d2YNNKOVRR0EEE3g411!ݻoŋUPPSTTDDJM6 xxxj#rrr*++6* Lhn:A?|ʔ) TVV B"GSN^k׮|>?++vҤIM6]|ťZl;f̘䢢Zb7Tϝ;m۶-[2 p^8Ji``srrˉhԨQOckk?uTCCC++۷o1 s޽VZ]rw'K.zxxGUerw 7n]H@ ӧi=;tT*srr BCBB<<<& [[[ ;;аɓl֬YZZڔ)Shܸq&Mѣ@ 9{֭[ U=ySRRzݻw_><}l۶Cd|>?%%寿{ӧ%Ɉ#;: X$$@r0@r@r$$$M;J endstream endobj 3472 0 obj << /Length 355 /Filter /FlateDecode >> stream x]]O0,tMLrc6l}t[!)sE-ई!4)A 5{q3=; Lf 1+TnPP*Q٠5^mq0+I3a;_&eUv1t>(g A'h0_>Jm]r?pq O!ƙDKyUع&9+ե\_oOuoOJ㽫{+Mab1RExZ&6 aߩXex6 QsF&HP&E~%/?N endstream endobj 3456 0 obj << /Type /XObject /Subtype /Image /Width 591 /Height 591 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 41813 /Filter /FlateDecode >> stream x<ǯ+T4ڡwJhHC{hG&M%% !eDdks]\xK.yy=ٞs9s{~DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM=Al8MA}Hq#_dR:dDQ}&; +2%SAJQ!O-Fi}Bus|O7FyCRs`û{U>7DŽFi΄D2\]r& R-~Ѓ i,/fgS| ҜBʍi% ڄBq@D_9ʓ*uF96&4 Hs٢nb"Õ?I=Bl4k0qE}n4Hw'h fGf v^Zb*#4sI9C>뷈 ЃL𰼻 V f3R 5LeAf )_bWv}b$b9q)XW;*0 V ghgrn0LbAR|tFr1e3Zc3rM!]A$FA̯M]@yKm/2Z#%dɑNi<Ĥlz^UC cHsKrw$"Vx[mSj촟wZ0o/EAY{ؕ]#O%6!>q8Cf5,snAG㬺DEA=.vNɨv#b5 A>&]}M9؋Cp0}A`2 dhitZ ;9&. £\8jo8csX6̄(L\AҥսPP:C0eAR+o-Mgnw  H#+'i?l\{~1zct͕5O ҬaIA75i13o}uV-ׁS;lBYDCidHauEt[@'yVl爄4<AEl )'byf}ݕ2Mm!P3'!Ѥ.wߍ],G(V:GuΕ! tvbz:Ȥ&bAf5'afh@Qؓ `o?>w ]qYnS\[y <AHXb 1hg ! f`epWFG{.3T*npxT6wĊH<}'F!@rE㭺ƦEbݗvSge"ycts K֑ǽ&4"$I.9 zwYLj;8 Rkkl"M@b_ԩH.zW4A&!ð1s1@V_o삂K T??sBR[qZjmln"5Ư뿳,ʯvQA+PZpb8Ap+~wlf+ O111....]ڿ… LܢE 111 "$$$***!!!-- )+++%%%..."";~*((cg^r;lmmoݺ *٘j?Y4B}68z'>k}ټO5Wzӏ(v"1r ,ThzsDb%|^vV-ggcǎ]vIVRR۷ɦM:ptF. jڳBu}0ڶm+%%󭭭]\\j`#`=e˖qƩ 槩ɓ'߿ff>@P䥵v+y箟H4,YY﷊.!P[!`W3qw( tw!.]'~iJlvv}Ǝ+//ߦM۷;::.t:LӧO/ZHSSSBBBCC삂8>99xo d$GU=\dM!$<NE< AirʨŧuRs@k&r_;* Zz޽{KJJ2dƍ%..%tQQω'fϞ v,C>|Pw28KuX`h.wdOuYȍ%^!dл/EW6̳8^UVu t0<6Nqq1u)wޅ枔Ԙ1clllk!dZ\XDG(L;y`ƑIV2:zAˊ5`jXb3Ǐ.-" <} ܨQf1}$##iҥ`)**߼y6V k&}K䕧 y`i'fB6)$VFO>QnԜxc'K,QVVرڵk>} Zk"##Ϟ=kdd$--=lذCW~J:-2#xkn$Mmh֮14o͟%N^Yq0hoߞ:uíCBB0^pqqYlYvt}v?? 9oԔnyOVd_Jʟ>)) 3  џ"ܗz}vRVlzB:0~x0:.\ W@)M6jff_!}ǛGDqy4znn***UDP~ט٨0L&gϖ3fիW0 [n[n l<>nWXD{acǏ)J˖-=<<0 @@+geF[uփ :qJ4j $+V@Ҩvms|wvc\}:TWRΏ_p8\YÆSK\\\Asrr=ލ7DEEg̘QTT9A9N^[u'IJJڱcG֭ ASNȢUslﻠeeÇ߿>5F.8ؠz'M0Yŋ333ꙗWg{ꕪjdd$fip8lӓ#A^ԗA@@˿}\@kDw=&0`55G>Mhx˂Ǽ :TLLɓ'CD  MOOOII8@pg;,̼:3e0vڕy.qETGx䉊B=A̛7OBBFAOvY9H|/\=MDr ӫJxxE_jgHH#Go_OƀSnɒ%U[!cc@8u(?:Pw^޽sM.!c}VZhtҘ>7XB|4_en$EmPW+ijgDDD]VP( pW(ӌdk3?XsNNNzׯu4 lkw]6o xbJ^F.9i7 nz""BU9m8zmi~fX~~~7DpqMMO|f߾}=z2הquNzz֭[[lfE<&XMLWz#B;v ikkNpkhh:h2hqjcbbp>N{w|\mq(E-@@J/^\yq4ləѠwN:No߾Қl ' q񀀀#Fhhhz/\c[[za ~QdQZOf5ȳ 365"eDʫȔ\lG&@^I.W^UVV5kV||<ɑ{Uw GGGUU &1?Yѝs1ex>Eب $雐 2_ ;|=*{kn0`@4=b!l6o`0,--[lyfV+dEHs'ё2$E֐+gA)9eT396 fÚPτٳgm:Bi&}2Wˆ]RR]Mm5p78z)ݛ"m"҂"݋28XȌWrJWw2XDʺ9Glmjj۶mipΔwg4𣏏Zמ׼n@E=Ev Ee;E~<;HzMWNtñE1cR+HJF_<w"-oܯDxkDGLZ1#!@R\\lnnޢe jYNEQChhh|ϲH]HPߠ ͪ@PPa̴>ZwX]tj>|ٳa\\S?(6\@gZto;?͛7׬YC߻r줴!9K5$:Looړ'QmT*z A^^ի۴iBwA4C?x1}Zv0:ӹ is tMD;kلڀMt;y|AEtjjjѿhSQD/$## {BRs`{Us3#=\UUu…</l7<z!s~)ڻw(ׯ˥K;BPD `XwVTT~\~}67j$fFCZo1=F;wn.]|}}'J:0ܤ1DEcĵdwQpN!IrȐ! 冱v꿬m!HcǏZZZIII:*}t s$wxr-)-F!!]8o߾Ȗ %%痚Rz6˃""矸Ex˻TDFիWmlle|al|n@6fgҁ9?6t́ءCiӦ9g,{3gΤP(ݻw={vbbҕGwΞ>}z=>\S;4(OH3v7p8[}v%ȨtnOOO_Ci^|e /^yƦc|xxx@uwŊ?+ kcu$;l컻 .:5L G]]$??:::enܸQAAYŕGJ8v|ε85 MWgklzCMHzf:>w\ rAx[%$$*4s?w~8?40Pŝ5kV>}~Q달zg绐| ܓBQPP055"ElNFWwai8FAggg֞8q/W~ L㏷m2P!Mw!%%e`efg8};î O3m4'4RAJJ M]]]\\\CCׯ >trpSBf}]va17/qqq/]Ij@tb} )=4t999%%%sss ۶m/?$''W$BY|׻ב&o+++:tnAg-`szn2p5 viߛsiӦijjΛ7@WWw̘1fl5/z{U/߽{o61[;\ #΋O4g GAt###ϟV8Jos6wRGN:զM//+@^Pܾ>ttmf+Vh׮\ի}W J 6lҥKKjv}Y.,FjdDCyM쵷355VUUS-zR;:yaÆUiw?';1tZ ݞ[MbuskL={޽=?YPAO^^ިQO^.mefdJ0`qIH8wMkvF xƍZs;tDi!ꏰ@(38g a|tCp,7]ppsjw56xb1il3 ziVлޗ1Qϐd_Z6#G}bccS 29Gt307"H%$%%u}֭a SgAbGg動եKh}v;;;87Glly"1t̐R!111:ulDro/=p*ouт/^i۶p~X,V%={Į]={433eՎwI A*$<v_|M`CBBήt˺u T?~0aBQasrr X;K/޹Fg4ǏW63sLFK6=`;ײe˝;b:uhѢ˫t:=X|N>.s"#׏ZUU,>W5 EP"?+ywءH*..ѩμjjjnڴv--zwH.]D"2%n1 BFBB)7?.\ %%[)5KFFFϞ=kI_AifKfff^v%(|*ξ1퐺pyqqqބ]vsqq%;6AIs_'&= h߰a=3`~㬺d0Z$$$\j 2DRRbdJ0X7 F;1>D#͋aÆ-]Tܴ|^--$&Mp\9|ǰH) ƻw!X.ӛ3gv~vXЄ # 5\ep8+WR(hVTT|;ti`޾}]p-̼qV]fSd`.B T,?\ -5Рr]6f" B\\֭[edd@?'޹sϳ8D٬_$/Řux9A}t:]SSs޽xZ߄LW5fac&DEEA} Ν|r㋊yfOצ5wV+0;!Err͛7kl9oy%@D:zf"ҥKw >} "ؾ'O.-4iRXn6d 8u/KO˗/5=wbR>@^^^LIYF\xk׮e-!N*ךA*--@>pppPSS̬`KbGBuuÇ7b iiґ8AAAڵӬwz#IY>er~`rv+_Srs@`ڵw R|{IŘH=ޣG[nݻn|1؀ 5Ezzc[]tjaIܼ҂IYeAłzo9d[gfؘY`Z ڵmt]RRR/fuuu~]$n?56&drp.97)))ڵjmMOWL&gcB ömſ}s0zuر۷oO6Fڼyv/yוrUH) xyyn:""'%fk6wDDD,--y?@۲eK6߻wCiiSX:Z4l@s) ޔ>|.: *аO>"4,A?PȪk;?wBC>3w\E3Ҙ ΢c* JNNN-Z0M%p/-Q8 $:^XI|kv{n]]*Cե7K^GE~ۺu븸ůLP̯)詂4:.\pI޺BbbbgyDkM% jĈ5yWȯ&%iJ@OFFFGGg۶m>TUUw^uN>LtB27|p)?84UF,100۵kd1kJŎwit&֭[,'㎊_4`\zuݺuƼq㆘۷oСB*=y"3+vUօ ִE}L?S0`&Ґed]f̘ZغjtR0ٜӹUo@ڷo_Ky@f/] OsR@u޽5:D*)w I0y8fA (wd5v|Ŋ/y޽{'&&6k,0b֓>h%/39Z[OCLW0*夐.yUIYXb_55Ө ===23jd --->&ȖN-Zs_p*s'lmmJ+`b܅׸/f}Iv-U.XnJvjYs93?nTOfAj:ȋ/(ʧOJDgyTAIyR^F}TwMaRp8,پ[韘 Bm?Dqq֏[ n o#y3g >g-Xe$ yɃGܽQu&L1e ;Nu %% &sroBf嗂03dI@iZZ);g/[ a&+)ұ趶9jtV;w̙3c+ Z+OYRl޼FDebUa,1"5j]K-INL2nܶ-faH\V普YhQNM!%R9ےsБOB"*&;qsPt? *#IJJjٲedddO*ÿn1 q6lX" !ھ}LNVhJ-z>m:\·o߄D[^ǑkBtP0Xm-KH0;d[Ig4{uw_s.nm6{U0: $ 0aBNYb5v#{20x(*ڿFI^ʜ6NOj"c4--ٳN';HEffV-y_]_Tp}nZm ?)4^l5?{6|_HT 5 CUUիW5(H=*zl ^N%yJM?}:g X|D78*w" {i=}s݋d %>#$:J[ ]($AcFAE۩uk%/*&nqx^]ou}26Ņ--7&;?%0aRO8::jhh5K}naQ(!ҡI3gڧjϞ쒰E1dvѣGE G+"k +sbětȢ3읥Bv]-fY-9{3\Cc~ DeiEbfo[1̙3?Jf}B?L̷Yڴ՝'-uk۶ѬK-ؘtSv% +VWW>zC5x'tEH0uKaa6g_,[%-# 6s isNFtIAꏀwñM/ڡC)mI[cb|||>\w~4,-,ZDu!//OQQǶ_}FW.am\f.ɫ&42Eeu12 <p4l2?99ꢃ H9LLL"Z:|w"Sʖ!@ I74LI^JϞo {qqIN2 ̠ O*Hj֬Y+{PۗYH ;z{{nعӔB9 "9kV_n,XP+oڴiBEZs87oޜ8q}!Zv2t;;;xquv:E.{D5ׁ>]v<kՕll6[BB Ipٿ?5 sN0׬I U"+k4p YYpA0*Q ֋ud*+At޽t; ū֌302[~P߾{Bv-P[ssswwwxiiO,??ʕ+F jjj50۶m+&&jGwÇl i}BIVR;qZ;ʏ۹wo G5cKA-dee?G{Ŧׇ[/הm۶M<$I8PCCV@x׬Yⲡ*ŋPƇFgϞM4 9N\:P}? CPPP O>Zt;+3LC$~J:>a8N^ͤw؞_sMPV2]EWӦ[:wsv1^c&Nԩo:8otㆲQnnn-jѢEVΟ?ilyw;'4 e@2;%3h;i}Bs Sݫ0Z3k\e~PDTt5矸_w]ӥ\i~Zͼv瓐Xg=~VҲr,-KJo~aaa<=~8oٳo߾~ϒp[t666>)._M((p8Fb9v;aA} uY9pi )+++//͛cǎgɒ%@7n KCgZa8oI. 1X.;OVRR*.. -++G^^~ڔH,IRR9ff*J_OäS>>3f\~'DDD,--a={ڶmď%6ZusSy6Ó@ o NМ ?~4j9sf[l);17,~sݰ`0FbYlٛ-[;t8T"eۮݏzֱcGwwMgEQ.jWOz'[d]AӧO/;T 1s9U~ʏGs7w~mڵ71qeRf3[7܏}O-}\LŋǍw0.\J׿3ft<7?EbY־=XyS)BB;vp}?(Nex/G5γ0h9^+"yJ ,ҥ oG,u.7rwrDA$!!{PV 4ȳ$,!͆z5Xj3fx!,ϟ۷/ԩS &Ȕ+3[anla5ys?Y[[H,˗/0`A>~c oܮv ((5E"ݛk I@nA덏~s#Y`4+1;pm]fmKό o|PcӪXLfyyuUGG'11ӧO2mg5EI""M^@8S(V^9W -7ܟ%I14f.҂vrqq5kphhh%gM67*X[~ \l߾UV5c +}M`%&5<v\lZϒL0[3FZt\}aWͭEadddMO 0`4H\I#DXq[[ LLLx3̜9S^^l)QTT$))Y߇c`}ŊPjKݾ}1].-2%Iw'~Rynuc}J5neg>2͓'O_P#puulϞ=9VqLRW48$ @!!C55VIW9rdiǫW@F5A.`A1X1KJڶ2oFr3g u|.81=>sYy'."57qe*'f6 jNh.D{\?qabuMW {Zjų'L ?1w<[lY:;55uڴiϯ.X@QQo߾:usfN:У:c|{iBm1{Ӫ96&.@N¯ e3{wʦWx)SW>f oС ;vINN7n&4gӦMP\jU錫7o.qxbBoݺ5~xQQ޽{x+&֭[.y>wdjCW}޽{ v;$eddɎjb9 ex8ޮwIHHT`ܹsGZZZOO*sԨQׯ/ ѮbToٳgSUUuHŗ,8E\ˠQ1J={ӧv /_nb|)~`艈dΙ rqqFC$((H]][nP/-ȳڶmvP~5kJgq۰ʖro-,ۿ V]w;z1ŘjH%%%5pϰ0II'T7oJI=HP)-{wH9 ucǎ(W8pmڔs KOO -M o^Ljua j.HL&F8;;SNB n7o>}ZZZ:t˖{ HÐ!""{GΝM>#&&걕1}ڵ+7!'?5iQQ O/8 {MQQI 3h3;;[]]A"cǎ:thO|_f4B9ՑΨŽ~A~egJYG|G-T:993js#ĠT^'O0 HY"w[[r?%dDRRRP KȠOcfdʗ:uիW#R!ylnlO8t׷|DCCÇ@.Hfl wŬ\Z*]icfF~QoJBTTAʖ I_9҆ŧunHUV5ޒ"I jOs(s˛4fk? CKJgDoe-_g޽khh^ 'f YR:qWpNiPs}m<:b_Pngp8|2)"Yɏ;r$+nc ΘCN&*5oJWwi̜?3g0!!8!q.{|0OhveԜĿH;v+YBK=hwJpaи323JQ!⿹( :U6H2:GwjLЭ[7???Li&6 4noxSdg={?=/bzpr]uaŌj4QB=Sa!Xvo'sǵs:$33O-`qS:0OU 3ʒDw_iV>2`w=Ŧ5h'NXh?Kڤ j$j?nD~=.y)ħtWmVgqM7WͽI{sNM鲢Lj\Ne/^6l4+~|||z $YnFm2~IG{4vj)Laze6検k/S,en`ΩIjyG/\fff(4$$$h4/Kr9XPSw}sȁڋT m´ afQ;b/g_,.ڪroyؑP]PGT,>NQܽM)U5n844舟~i޽*Vp4-Jo mɹҔ}h3溷^o#pxJ|(~2]SxyetK,333mjṔ0%^=۲V-mgr⺷:E֪,W|UHg`-w^^^ݻwǻ׷cǎG-M͋8*ýՙ}h3^k4V]t[ƋÂB"8"q*W@/0{Q$"ŤI sιs}񌍍b1-JYӂyw{s>=vƈ{yQw[$7Cm:,O*%qIYbҵZܽJf<3:9qn UY}h¹${qu'3Whb탙1sx{{eۢw[Iiƹڬp.7}0Tf8 Ah7}}RO_D>lL&mF %LoQ^\O{rz:ʧ`.h4vtrQ1hp|&a//o[]->6Υ ǺʲҲf,7//i/Sfj„ Ǐǻd i$;;mPɱ/*X{ov^aiړ]eʕxwW$QgJ>Qzzzj N&a>Եum=:e;*3W/Z˓Xe?^rt~U2G/=puGGG48͛Uz#1=}o߾Yf@7lccc WluzDe|"ggkע@gUV-==SXj;`&Q>}#G@glݻwh)tP'%Gu :kΝC;jVS4h/ڵ GX*S򉌌8tիWXv?4M9Wtsss ѧtݻΝv?&$UO5@ǝ]ѸqcS)Sƍ]TvmI 9gR92}t48責,333I媵]PJOk׮y@ G͕[ߦ*ݦMH̑ h =vil%hݺu˗/GR E;虄:Cӕ UV\ :jժ999h \u.,]ىիW@ǙeeeLza>Cٰ[lٺu,,,;nɒ%7nDYfjj*aZ9;;oذ :FiiihjabŊ5k֠@Ǚgff􌚽1 :$;;g$Tg8;Ra{}FFFgTh 68;;@|IQo7۷ob1Jh = Y'0EU80k,482cllv?g2Iy?>i$48?YF Yyt]]]G]S~}թ|2|"wwwGGG48-ZW$QXegٳ't_N/3;ZIu۶m]vOTzؑP'‘p}]d}O#%b@:thƌh^I)JT H$BڼyŋzI#SeYfJJ tӦMzQL:8"OԺu렠 48ɓ'hzE13wt7zeR:] G㏧OFر?A/evٹJ>ѯc48,++X^S7mڴh"48&Dbhh( z)!'WIT^%+ϙ3gƌ_NJ ՙ7^ٹ=zdccӥK/|F)?=ftt4f :rHJԚ \hVD"X,Fڶmۂ ՚#"U$)\B_OSg0HfPbo߾WǞfv\eǕϘ1hpAM6 F;豀d:1Y<%Hɤ2fD\JK,WRE ) :^f+D/^=Rߧt}~5YC.|hڕjϟ?tQ-m~ǐ .37ѥKǏC+OMRzU+VniI7r}7o}(» PYff&BH*~HYLLE\}sEnK fk7 )ai jꫯAx)G9͠# +tkvCg~{edX 4ŋC A;T}Tsi๋{E)!S&edd|nN7rY}?s/yIhGKzwt12Ϝ_rNX;v/t[70#; Wv,^A]Y}p).+o>㉻7.<|48xKKK%NrKEb֭7 wÒ/{nqfoxjAwݾi̱}ז@C.rZpiEmYۍ{F}k;06tŋv/|z޽t}ԷW;G.},vG];^~VnEg]_(*SHZwS -nK79 ^JФQFRR(w-Znڡ^ 7ʔ˫n/܂-&k(wu%vzI=nG ~j*!a|#%^K;88t0=zxxx*[']TS]1Ȍ +Ĝ5$Wnm#"Fucp$7v[lN[ =tlC7aɅ' UvUV-Ỳ̓qiӦMIMM&Ӎ~(vԞj>}IA~Us~Jg0Wmρ7oiYe*TvcӕQ, hĆ O iqWb@UO,WN-;L!*ݻ/X@q֭[ժUے8P8%'&`@RV:OHr/hرvV$D 3e2qϟ?WӤ+!씼Ğj1vJJGUH]b4ʐ!C.\$sᓤ+ȏٹʯZwVt@{ 4}\@ݸqSNoyy;tMEz@&&&W^%ׯ_G'0V:uÕ^Q^DWBbM6DT raBt%@988_o OX\9~Q$ĉ\.1b!!! 6>qww6R瑿TkfH.S$NʹXi |lt_hh(ٸ}:n_4v7y"t 7nƍtr}ww&M?&(#C~BO>K w?2=nmO\F"/Qpe |ud9;=-WEi  aΜ9+VvwŽqyuaaa}}}Iy{{KR++{v?$7iz=<kwUggyobL*/bU^=99=X]o;úh$rrvٲe䊓SΝɕ;w*deaʦbџ@ƼSl7:JYATۄ >m(3 =5p,!B*;OOς[.]@}w蠠ϝ'_E^~ҵz^?@ PD"ի}tS1'`4! ~ȑ?gV\ߺukBBB97oԭ[,WtD|i;m x -P9rD7k@ysU"^;{,V\IJ9gggssOgFw,>L&kѢWw{%_,Q&Io0Xy}]vS/M4)%ܫ[ǞǧBxb׮]3vtI9A3yc̙vvv:zyI-=8O}8*ﴄ@F:\rEX]HWf6WՓA+G˖-5^Ѳ<ۍw{I$H)yP"k -Ӱ#Z}0oJ,AؕÎPf6nܨ{NJpꓘ\#l;[777T`O*_ 1WShhξwjJ&P2ncC+gZǻ7]֮];*nfmlŘ3ƭ^#lll}OUk #j#@FaÆ/ލcn $tz7hGGvU4)<!}T\*2bSN-W0dbt(C)~ @%$$ԬY3&&FIK ޹ 8~ZNߢy9"6]^=7ҔD'%Pĸq/_rp/Z|Vf-OE9rGGIq4tgCT>>>43W'g j8-֭gUJ=f :vxY*7!-hʃ.]8qB؏&8޼ykժU/](HN:LBPe^zSU!1ǽBmPِڵk&X&"䇏HXN;v(bȓ~Wg&QkmmBbIop.Y pUEhʆQgAy[4_͛7[YY;vlڵ###ĉ 4K 8n},вeƏ_jiik.ŏ <-争Io%"i4뭥ɍ...Æ CT6޽UVbb( [nBPIM,Hܧ~[n}@ {9ǜc_%/ΙC"PydQa\ܹo)nz̙ݻI_w(OzͽIqܒ3eÓ'OX, سgO=4/EIFFFwU쇏9F #QF=p+777R奦8(&b}RF{i֫sΜ9ӦMCTj )p9 nݺhѢvڞ﫯*MBx4%b7'yKa4lP6hРիWk ۜ233ɏu]xq222 ] >G˽f_~r_CլYΞ=۶m[q֒m۶1GB =RJ%פBiVOJ,D R*[nvf)3 HU^=___zU!޴Uo>|oY%-ٲp.֥DYsvʗ>2O}5Lm9-z{gkΙs)>PL&vhj4iҤګR 9rǏoԨչ)p| CeFS2qϲPccv٘ YGI4q[EɅ`=n :WLX ޼ylgϒk߾%K^he' ₦]*|F|֐.=929)-΋qKNO/_Tbj?M_:1C=x*--MڹsHґ7n >56 ]Bi3Z&qiV?CqsGVߗ6_AxUc#e3Z:vIo[GGS$ݶmիqQQQh йcyټ[]ywHSR'BK;7GsQG:Vb`Kڊoڣ122J*[n4maa$ڴiٵY'ˍXȏdku%?|ti48^K1 =X꽰Zj{NKWM_? hܹsnjvA*8IvyQ'x$:m1vhդ3s&oBÇo߾l:J]~wl6M}5jL71G3kPJe"5kߜ\k%'}~_wtڊ*=6/?\#:88 ؽ{+WX,])**N:?FS@y&TuFn HIR30Kn)ДL_@>Ld4el3w̢ :drmڴ9xuVVV՝oݺ5b1{RlBO:|~O4/I=/ca tr mR$=%2,,R9 \\\ T޽{V:f̘E7oNuL8qܸqh(w2vFGI(tO<~Ҍ!*۳gOvrss -U|G&Hy:OȓLaLi2|)5\RT?$"## xaD|$ڵkGDD)@Hns( ܇#)~>H31g؏2ݢJQdvvv-*_w~m׮]B(:u*\U3,>/S@֯_M:Ef Κ^(ФTwTi_pfffƍ/\̝I͝;аcǎҥ dZYY 1==C ٸqci_Ln3y/"X,իʕ+k7:({[7Ng^z6/^XZZ^l͘1b@sss777#4hp=Dr}33R<;:$r?25!g(R={cAw/!|2*x N \]]IT%$$t3gάW^HHHG `0MMMW h ']A޽cPX*-[|7_]1,Ue?pڵp8ɉÇ nIIIVچ  -::'))TOMd{E/F TO T*.\_~||<HVƒ@J͚5kŮS@ :Rֵo>##hߥKH~;gpM:Ņ{^Q8c @S~]mF? .?T0cƌb[wqqqvvv;vRp8 ڔ]!22|nܸ/jqgaTr;tPdP+++ccctLbViָk׮_فlٲeiOyogj1)yذasν{nر7ܹ޽{U"@ 4P8!M!a2P+٩ɻ R3f#F(y'h JwObyy|@SƎ[^ӧOx#@\~DWSQW*ԩX+Y0;kk/E/{*DzFDDD0 __ryogQl%9UJ0h w6/Z;;;ŋ|fff^^Ѿ;Nk׮f͚%''yytKݗƢIUl$K>|<^h:gZkժժU+[y朜n;vo7o{nd)Evj%[fXle~{D|ӧkُ=ڨQXP"bzDfcYdiNj'?vE}HR]Hҵl^1ƍkԨf:w\pgҥ5klܸʧCګ)_!(G"wwM٭[7##UjyO8aee{DF=I]03uY[ӭl2rJtٔMϼ.8CLq) ۅ| 4ydRUV:K'A)6O2pTTsqioѢ;pr"ʣh/!㓙:icNT f=yȻ'ohPhmmM‹\)xcǎ,EG~uСӧo͚5YYY7onҤIAyep<`;-`sPVvv1c Ɣ)Sx ڧO ޲e_7sv-c9Tԇz,&ˇ jxjԻ첒/ Zj]o߾ vmb)nM瑿)xD|aFHGuvv.=11XT:V\ٲe,YHgO(fp(tO@O m"eo>#?ک#eTl|8ɻ_5((vJwzo^ZR_îJ|ݼyJw$Ν;FF*{Y%^Aet+ LQ:S*-]0 M۟ë|5q J*Uټys TXԵz>T`2lyʦ#[/67o߿jԨѧO^zٳ{>rG(1XdI & MgPyG}i*3W=ylT`q*$Ȼ*50<UP?\]]---lDLͥYr :-"3z,ڀ$7g|a'O,p8#F 9SXE?(at$;fV^ P_)jxa5jt~^SIŋƍ/ZH*U7 bVGӸt,ME:琿:J-44T1122޲e VL6hРҪU3g̩a$!!b1Bm$݋,,35J^i6>)vvviii?Zr~r<*eg %L=]*d۶mdZN}M6]|#.'z锞'O1cAR֮^:BaΝsqq)pĉ ;Fpō7/AD1?WpoYK=T!@x`n0/gt{Ņ\:Sbld#_te{!<(&~ d>IWFgptwp]e1L2ȯt *!,S~'ֺܹuiӦ^;OeMG {LB^O\Fx&'\dR*KiUv9eʔׯ_M#G`0Yj>-lmmSb"nՆd0%%6iy}vJc9t5##oo42z{1)9^6/۷FP$Q/,C*pD⒇OJJJ"IM۷I%/fC1y,9ܶm977kג/Q>'x, hcL ׯ|}mѢπlll}5ƌD"Y|9 #[(.w!STO>%IW( e`0oi *+8ٹsAib_$wt.+yg^Qt{NdX@`?A&]reݺuk֬pBzz: _)ֹkٲe]\\RA9997Gn=V$tetEX,D$;LMM=<<7nڼàw/?J:{jS9']k^d͛75MeH~WlN%uO'uԉl]۶mۡCQvmLq<o̙I-Zh޽7ҥK>ǏV8Pfxr{rzG>Il̟)99yjN$}H[hb2T`Kcׯ_'_4+;cccEnm&$bJ|بQ#RǑɾG퉉kF>eyԗȎ+W?2dݻ\y98}H:t =qrr$yRG_-rZR%G*z)/_$܀ e˖^߾}?NM1uB^H:5I):u"1>/OwwU"UiL&)1&Z`+rSV񉍍%[ZY>}:)+SRR0nŋԩsbZ[[+z(n!Ջ/͟ulݺ?! I)[٣G*Cλڵk 66m#KOlii9d/hH ي>MU)۷lҰa=z\p~э;tn``C~5__T!vi zMH}.:tu֭ZڵkW9ԓRTڰoMfaa1a |׏=h_,㷝lؽKH]Lc>LO8-< {'fQ\ G:oocǒ$T>{L^UOWLRis#G|$D6nX,UPdƃ 4no!IbŊN< K rQY4v@2Y|棘@\ rR"Fl*6mJjm۶P*fJ<|pԩd/eС7oެk5/_|޼y*XFIyi99_I*_V^+Il;dyB2uG!6 nݺծ]{ܹz9sA[bիWgr]SHLLܱcGN֭;{lzZ1 ."[INґfSW=IХD"^hQ˖-I=}twwwHϓTdiʕEn?|bΝ;7a^`7|IQt),"tL&{s޽;I2bĈuݽ{Wqo666sNxxxDDDddk׬H9U[b<oddDv{9杻ݻcR .lܸq{1cΝ;takVc@H]loo_Sh@  ̹6۷o ɿ$DƌhѢ;v>}Ã3%%EKif$j}}}^zȑkΚ5ѱm۶ff -Z!M^IHHI  ڵ#;tЪU4/1gя="iӦ_uر[Y& $ IsРAF4iٳ7gggR6ڰa֭[z+W._i޼y.7n?`.]4oޜh$a4hйs,[l߾}ׯ_( a?Kl{EdL&cX111Ǐ߿ׯ_fv$H-Ydj*z$:wESNݹsq!!!ɟ1!RU(s;mH$K.500իWf8N9P [Zv akqfĈdׅi򹎻qGoPfS\-C^yKJ:ri3a#!1䣤#Aev)trVD$h@Ѱ3GM"P'S3PKVT#cqKT!nU><*4l͉/?LX+v>,/HY}P1X͑&4݇.S\WՊN.^qT~|RpF?tK8 K+tCQx]zV8J/\'@q_/9z!d2:,>I22(-Knvu{uIt_R¥xHJw?ZM$!I([eJuLŅTjG%^Ò J/DTs}1wk;@ehRqxb؏ G2@ aV2hh v0Έ}H:heGp$Jarg;PM_tG=D&H&|YhmPN1ayw\(t1ȥtD*{T'eM%=G2~0 {w3p1'_Gq$">X>osIZCi[ha:(I:#ޯ_·3xC O7R5C]MJhw^F7^ɏL _i;:t~LH7:&YJ;w+GLvySSS^32h2UijSjOG͚5tӦMJDE QT o߾ ""P(T܍G<=u@{\/Η$ >v5S/v[=9iҤM]w|--MW^{tmmm\ȡ.~)Au+W;wnHiϻ#@׭Y9ĊJ1NAnYlٳg̘1y0tժUJǣΫFn6mڨQƎ;a„1cԭ[^z<OGU:ofx]FQԔ)Sxή\=èssG*4a:͚5+*u^Վ퇰@//SGs{H;|a:}EFjŋ*?`x866({W endstream endobj 3477 0 obj << /Length 1871 /Filter /FlateDecode >> stream xڥXKs6W!c1|?2Cn{H:g:GEDM Hb4iQ3b9I'ѫpo$u'eL.yfph/Y\P#)v0+,/93Q J)j%R[nj8f4$ֵ,# 7'*hr"X)-KD˼2 sgzy $JX r5D 2"#t/nX6JE JHW65 .:iFeq:Y@y JV(ʭ`8*3Hn}uMlz杬9b#QHBbq} ܽ}8,嚼00"MU8J+A+X].P#󚍷qF댚(>Af`AX PjL)nێQXd%w:`O(A1_չHb[m2lTc{3Y R$_b`;FdѰ7+329YJ B0}vev`:Fz}3=!iz=@@=7~\oc[+ 0^>Hfqw.jR[qzц1__=bi#vHȭ,ͦOЭKd1? hDЉDC+Ɵ #(I DaBgqqC $=|;JyE8[\Z(6mpj:jX'U8JGƄ3 |S0^00V$i $(Dv\hMƩLYl a a\כN _9M/s+ ]c!Sj֙j9)U]hҡm\emֵ9[I :d10gDfDEC;D5i=Tl Un3NckFc%sc۶yvkx{M~ny?ܱp3w郰9淖'H^g(}B4,=2zG_r$k3%VYKNr$lZTtSSJć.'XG J@_*DEqxq;xSW$=pJLhyB!_"7K#s`o}uVrU /kboP| \ƅwp)DPtp;dLk\$ӱKX0o{?}U#~TcfVs.Wéz~,qVpld='iD5,cK]m*i!84,~BV#kmٲ=C{/@yܣڨ>l&/ -F#yUJOtFI[@*u~02휽n~ر_39u$> stream xڥVo6Bȗh׀|+E`c_ڢ`$"*K.%G9vl(y{H#[}ZeT2YP*g\Ѫ>X~^%Zxn"+1ښ3V;S~;.:7Ɲ/T֬\<{ڭ3MO8 Ų"!Xda.xibc~|l;rlԠg49}ض=<젔uOkA׏wA^\GUttZP8D>@JZu;4@|?#-`y4ib;+ϭ_y݁tvl}p B@wY 2n ^DjxȄ lA8evc;DnAo XhV%rطx{Z}k !wosB͏ 8`3*,wBMx7x:Vk7crE1<Ř>fp򩷉(6^c(wS;41\xp p͍|SÉ׉ZeB/<(ׄ8s8A6C|i 5i!t1ñp1YJk,;l8awn09 Fa{d˻M3~p긲uP>p)3J@p m!<{ endstream endobj 3480 0 obj << /Type /XObject /Subtype /Image /Width 2339 /Height 1654 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 70935 /Filter /FlateDecode >> stream x]#r^VYgV0;sMK-Uge2qXvD H 믿"FBߵ-Z4&^sˣ#Asߵ?해!eo }g{_Ck-O胻`%Z9SևPz_ugo<.F^GdzS +2\e~~;{wx^ڿ)잙x>?81'U eu;~o^}z #O1_ ^ Gǖ۝?!/-LoQ| h߻Gow3`>=a/Wؖ[Үϼ_Da7;уR1鏚~= 5|~;ΉAsK%Ŀ)XDNGk_[>z5myX[t Yzchu?{?~wq!.k۝ulGφEq)+72;̀ˣûM-ұқ]LLr飾}4h$j~z]S/*ks IJ>h>jC1S j~?ԚyzlE#o?u\*Aw>wKk=ّ?~]%Xz|CAUhI/rOmڧcOovK Ѝ/??DKEs/ mNZ7h/7W3GBۺU)L8]XUC3Z}eӟ|\4~kK#8stnUɋ!kߥϫn.GgoN9 m-XkJsFPs$ mOd6g}sK70kطȧږPI߷nx\Q+O&dS[7oL%۬OӦkGW8ryfO}ciۻGʽ5;]آ1]U|_Prn|t꿾WO|Q:Jh+v__Jl?}LϳtOٗ<ծ"'#C[ ͣ{13}|T xP mVev%Wd/=z3]4-*cœq#=22g[KϨ/{__Ttӓӣ:#;{BU{Ļa/L=߸d yC7X[yot-NB` Ⱦi-^}y߅ZqdEC[aLw|Uӟ;ͷSqˣfIە3>L8'kk߅G[V ȣw*z~vpxzG mu|r m_1}2LŘE6⻗iWŧW{}XٶÊ#Z~HhKw ?Vܹ}%SOkg?3~b^ ~¨o>Xd`K,(=gmmU^O &^_??_ <яq\_v_[Pyo~Oǯơ_W?󯿷[yt^gpсmEc?[?kx5uybծ~h߻VScx} ?_0WC͹ {m>}';hzRU5o_,?zۋ|OJ_d؋~y.{[qy ͟yru>wָ_G׏5=Wl^jNYx7!P.(é~z6|y7nåhjxOCۇpUz0;|H3;^dhk98rp8tؾ~N;nT#znY[{k7(m2oĀƄuB???~)6kQuB~ $;倏?f2x7jۯ횢G<ߓXL m6 mC^] m1Mh8ggB[!_mUTˎnmB[؎ mBK_6m䞽 m 4. mWͱ%ڄ66V.5[BWB=mԍkzBvRhK53B[>ո#u[[J% my;R<m["_<_ BIMhCh`˕C؎mMhKڒ m[v>վ#E[[8m9[vCh{tB۬c~Okj-GR%wVYڎimBB"/2{:em^n\ЛUhxr<UeC[VnbBۊ]ڄK=jm1Eh8zN:wRڴ{v*l6E(ڎ9 mi)!QŬжu/edm^6cZ&}U mvF mZ[m+ж:mG+ ;mlBa@ڪ6 myB۬}_ݿ/V7.U mۿ1>}W+nhozЖ m76&KZm*4T?BD Ϋštk8ж]FFxOh[ڄ|RhژGwB#1O mRGh[Q̈́G^x= m{CCÛO-,VyBB[&!q^vjh2Ch"owMmݹ*l2 mx˅ȁ cQhKFB[VnRa7"mxmuU?34=B}fGZ mE[І憶魭{Dhv)5Emת4-m-_خ m͏S-k7&%imsIhڴ{&e Ep6EcaB[&!q0-#uPh\?&m+BۢG%q-fHKWM85ڒr{4qz m[<25vϯ)% pϞ66j6mih,Mh;$C[&!q0mh}B98/-S1 W7A4Mhڄ6m:u+U_ɚxzcF{;_mӯik۵6޹*Ch{ى֭ mЖڞڄSC[˕ mB[. %u:p^hrJ6 жHSBۊ%)G`uڂoZh'y-lYhj2%e۝B[uSe^m ms&U m?T74?w0N5BB& mmגڶ|C6͖7ËvLk+;BV4u_& mG6-shH~6>m[ІІ!`Rhڄ6Jh{:5*SB[Vn_&KBۖ&ھr-mhK{!?;v g{hڄ66 B& m- mB[24ehmeohMmz6Mh+wI'<]^ڄ66&]ivXhk?z'Ň,6r;" mIBۧ]\h mBCÞ Lh; m [ІІ6!yh2#[Yڄ6-ãXhKs߮BۮVnG&NB[dk҆2xB[Ж8my{*oЖ괓*ekmBBB&U mmzucB[DŽ66m>]m{ Yl]h{ڄ6&U I%mZ[Ж mmmuo?h{z(V76ڄ6m٦}xB[Xh;{B[L m[Z[J6m6vޯ&]2;%=!ڦ/ mK kG zh[>zhiVnGLbZ[yߧ"ڶ)B[аߩlZt_<ӆ$MhChChVAh+ mC[74&yw_6}W,ڂ[& m5i0-ɝrO&B۔ m26 Mhڦ0-2R}ܑ mBmu"[[8w0Oh hmUkڄ#[V=4l=m# BBBۢ&,Zۮ4-mhr0-}pж4K ma^mBۢ6U mDh6kNkCۮ[hآr%:n4gh[Ѥ6m]Ïń6Mhr3~)Ihr/ߗlږc>ڶ6 mMh"􄶴m KߗY*Ch;G6m}ԪU3Mh;>MBy!ȿ/F%ڄ6 6thpN!|ߢ1=]iB[ڄ6MhGN m3-:= m.57=*&B|O3IBۮ;BhЖDT(ŷ6 m{Mh"6m{h[V.w-fmsTv m9Cۊӣж.ڲO6節 m[vjh/HQ mZ-uI Mh; }{X*ZI+<7c" mB&*#t}6۽K mC[tVJvLdڦ6ڄ66o U-0-~Mжc7Yں,mRBߍ)% mϐuC`5+[ɖЦd6.n`[塭cTn%Ӷ򄶰&!! m{ֶk%HnmsIߕmԩ% mKOӦ\h뾔fm\ܖ{! mK[[ڄ66nmE /W m+#~ѽ*mEhh ׽cnNhݘ6}_B6+}hmB&i B[بv^{B[dkڄ- [Zưk%Vhp$/ mgDhN Rggč;ڶ$ж ^ge[ƕmzkȿ F趄]Mh@hC۷MhK-V0mDrO'%9 m{e|~CۯK mB&ٶ mK[[ж mmmBv^hv V҄t1U+)Mh mo.u]yF&im%Zvvkڞjm mZ[ж mmmK]0]m?|&mlmBwcf|f)Im>>"ق[Ц5 m Ж|>},!! m'/o\ޏ7n m<36MylBۣa mߍ) mSЖ-}NMkJ[CgvXk;#-jmBB-Ih\ڄmGڄC:5)ߍY=BۺS&_UnnmB mޖжV6 MhK.BۛamBXcˉWhےu|d/󇶯Hh+X1Iھ-#B-m\ж_5|!m m3᧷6MhMhڄmk;;ke7=kئ\&UR>mB[?[. m..َlmBP4E-?>MomBBBۮ-=3BW:&GsCCۣ#{B۬=*FΖBK m[l[tHnHh ms[ІІ&msk& mBvG>脶BۧKh[D*ͭMhu#6$v^hڄ66]Mh666b7-ặ67(ن]%;C[Rhڄ6`k۸myzkڄ[ۑmVkڄ6[YiQ_>mئ\&UQBھT  ^hڄ6[wk?lCZt+Bۮvjh:^ mmmSZ[ɶ#Dh8B miO1C!6lMh;,w"ق[ul [Ca mB& m mB%[>wж%\ڄ;&}ؗ?U mMhum m[m mmmZvCh{ڂCۇmBж mB[KQmNiMh26m"%!ж[ІІ&U m腶{ϝ- maO1G'eGI6Z})ڞ3ʵ-m&ٺ[C1?mok;>6 mWkҶSC:6MhڄeGI6fDkڄ666`[̯_*mm7&!! mBUk*>/ڒҡ msˎ(Mhl&ٺ[C0mck$6 mWk2/џ~ Fh;>Yi m! m%Z[<VklO[k[ЖRڄ666Mhڎ>BB۔];msmBf6Vhږ6MhMhKڄ6mckڄ66m{ڄ6}7R'Bf;m\_5%vBrWhChChں~/\u_hBf-[[EomnQ Xh+ڄ!ق[fn Bvyk-=jmBBBۮMhڄ6B[Xh~Jb m[>wOh{ڄ6a/UzRvahkomBBB& mP md`OBۺ&l⹭/UԤvdk356 MhB۟Mh;;XU m-ᢷ67yAMhڄ6ڬ۪1c'km׆&!! mBvM;C[j%hmBCklͲ/f|v6MhMhڄ6MhRC-aJ6Mh5sڄvsh mmmB&C66& mB&n,lB]޷6 MhbBۇ& mFZ[Ĥvm'ж)~omMhlB[#}h{z2mmmC[ߪ.#C6MhlB[gk+tfڄ6MhlBЖ mmmB&C4Mh;)=+=6Mhڄ6MhlB&І&2B&U,>Bfڄ6Mh mZcl6& m ! m& mB&ل6Mhڄ6fل6Mhڄ6Mhsk+\!6& m:R m6Mhڄ6ڄ6]Fhڄ6MhlBpڄ6Mhل6MhKUل66 Co0ڄ6 -IqV՝&lBfڄMhChChڄq~ mBg1f P'ж)uJ?)gflzچ߿%ІІ&2B& mC6vp bNBf N< m7mw Mhe6MhڄsIe;{Ok. mBf_ٴHepIms'Hh; mB[- m fl%"UڄuжІІ6 min~ m7-}Jh.١mŃn׾?JhKMoXyB97MhTل6Hev0/ m m +v|h~~lB۩mM( m>𕿲%:MhK/Nl1%"m V#?5 mym*ІІ&%mY2wh'-zvU ;OfzeFXGlMhS#ڮBB=nbΖ5 MhڄSCۊ m#7$ mB=*ύ6' m*ۖPPh OkжbZhChChڄ!i~lЄw{KKVph//mC:8PK+ xlmswV m*CЖpڒcBۢUh mKeY̹* fEڄҡmG^Wh|+seۻ1}ᄍ<Gl{hkO6[`e[P*&a-s[ 2XhChChڄm3p-Ce;s>𵺲 mB[o m# LhlBP.%ax_xMBBж%[2JhڄDhN lw0A݇:ϫYҡ:6Me~JerPhsږB mmmB[0!u~lд+&Xh$e"K?qJ mΐsfohisC[}*+Ц2m>a'CUh mKeڄ6Mh m+*v|eK& mB~XV[{ϙiTҡ-#3GܪT6B mm{ж}xp;gh[ _LhmG힦OmրcnʖsOrOھIڒϫB?k&W6cʐ]k–T3ŬB mmm7 ,=B&%m& mTYw0A'Znqze$=O6[`e[\U*-~a|e|\hڄ,E`.lW>6-Uh[}C[ mGhjjSІІ&]0Mhڄmː mu;Ԗ& mU- m#ڄ*u;&LVNߑcr5m-% mJ kC[{[Qل6mce;&;/拆6T] XJV/Mh'Ev^h+:yE|ڶ*666-[h[.J5L- myk[h;,-_ gu m13gWhos/ڄ+uk&LVҮؗcRhyj/\U6 mbh[\<ŇWmK6xM Bڸ0+QلC[y%- mŽ5w_h;)՝& aw*Oh+ںۿ\]C: P+[zӕOm) ^hlo0IC[J+ mOABBж:E.V/>.WG||@h~_]/ԫ}t[VжX4/Mh;>}Vz۝3RhK{I*666MhaKOV( mKK6}&myֽo m;&]Ж^u mbY}BWm+9 f;>lICSІІж m[Bۺ+]/tBۅ/6Mh+tbvphN m..VلB[S%ЖӞnlO66 m=noh۸ι%^|& |CCۊ6My{uyh5}tP]|fm%ж mCBWJ*=fP-ɩRhChChR憶!lKhۻ_vB+& m^o\'PI*ۢJ[ ~Qh[}cB[ꆶ&=qB[3OЖT)!! mS/nmKOV.VpMhڶ+ж=Ŝd+[׿"C# m% hh; mB[3OЖT)!!ml7uKB`eچNB[6r%Bۊ+~¬De[t޽7Wݷ( mBIMh+Θ<;U7㦼f;2%jIBBvkh {HږB['ńem_ mB[6}3<6-&jsm]Yzq6N~ڎ%BmO;B[SІІЖ6_PhVwhh=!  mx m-tlB! m;T&cVb^ܢV:yS!e}Vh;fvXhKגmMhChCh ms mKB[4}Vͥ6Mhڪwlm}w, mCT6Mh;_B[Жs*#ńBs 'ChK{옓BBBϿ">R$mOV7pm؄Zzbfx=UW+B%=f-mhK*[vܵ'8lmOBBB[肻B[>3~r uoO|1_(ͺ жkxB[Жe]ھmG[ mۜЖykEC۬lg-Ih@hڦ9Bжet; -:Be m;T6e3; m+ʼ!=|cek1KV1%}-yh;lT m{#U9 mІІvnh|Vжw mBܷWWCZOUP+ж7;lB[_ڄ- mCy'xfVTӞnlBBB[Gh۾sXh[˜ڪo󷅶 mIv@\w0ɻ6eSh[76Mh;u0a#-#C[Vmm\{\}>j ow]hky+:v-Vжn}z:C%l;q>;WB[@h[}.~k7u&v smsU Mh~$ӷW CZ>OUP+Kh[B[, mYqG9fiÃ쩕: mGN-;xshK>8ćJGhCh\B[E_h[ˌ\tm}% ma9 m+icmٕmdS;RUWx-mv_hyYN<%BshZ>: 7md6=%YIZ`cheFie{ m]GxWh[w7>ք䏗![Eoe+[zw,elv-Y4>#vx==Z'7U>}wsseȿB[9pI&8;8BB"/ן'q/mꏠ ms&a: mic&b.~k7ɳkMh; Ӟnl/ mys mt_]^B[ж}Mڒ i*xJ`wB[xl②mVY}b.~k7'_2ms35[9p&,<8BB<?_?ڎךVTh>of$k?K]:v0㥡mʧv@h6o ~h^x=Yɳq7Mh;ڪ s5Ʋ-% m*Kh:'5-eY2.[]^B۾6$:sE{ mtݳgWurͻ+C66K@h+|p66%E>_< m͟CIڶ/oF~Sh?8+B[e+x]h4՚WoQhsse{ mcO7#5'hl[VGhCh\B[=mT&~MЖg?g[tJ:=жq^MBۓ9Z_hu/l-fw77W{mlBa4& mmdVh˶!u*NΟCaȺ&%=8B}3;^V| mՊ[|_3Yh ]\^Bk 40y}͖pybYsRhCh -Bhu%uЖaѸ\hWh~p憶VGW&W+n1&={|e{-Ѩ'̄vɰƶhB1gu턃#!q)-bN?_\V_vBۢC[C[e+[f~w,%l[|:\h/?.l/m.<vVh0>, m s5&3mE{hһ1m\-ڦjmIr۫Жz!/*SgW׎ʳh׫C[y m؞y;\^˾ 3.<%B[yͶb|VY98BBm9sZB[63#o% mg$bB۷PL m mպ[ڄ\^Bahg$lc[4Xn#!q.-b{h?%u3B۔+ɣXhK29B㷴3[}Vn^Emuvڼ g/le9zt{&O΁O)Lh{zvnl0]) NWЖg8^a-{̲ѕ+2ώXپ:KoQhr.xr@mꏗg0UZ:{- m.tse{-[?z<mWMT?x͖dp><8BB ms CڄSB[ C[e+kWY)ͫշ>Tږܧc7!~NhyyUɓj v`Vh;7-x2ږwFB[!-Y ml<ʳh#EΫշ( m繹=a&ж66ڎ=8BBj g[*KhKv67%yd;fkC[ Ahmfv:B[e+kG3c]h]9/~+Kh{y#ww\hWFRhpAAh 7ڂEau6]~~a7w6->mLB@!BB[*ۺ̔gŧFKhCh'6ڂl2Sž`: -& m"!E^;>+mmal+2Sž%p -FKe!mL !hlLJ-G mzI6+١mg` mGMh(DhCh[ieRRmmmi*6E:*۩mg:BB }mbfӳJ#!M]ل6 B6鄶C @BB\#mVfӳ6&!M4X m{? mmW6Mh m$-I+uІ6Ŕ& m"!Uَ mۿ<mm =+ï@ m& m"![m<bmmݦW̔g mChCh&8 NT!!YQل6 B6*Hf޳JڞZWꆶ$HBBSBc @BB#K+[wf۳JDڭlB@!BB[V1L&!5J, k mm-b*[Ж3}OhChVXeR}y&ދlicІ|XBhCh{#=L{BBW+[ЖW` S[*&PІmW+uІ]Mh(DhCh`ceڲ}y&l$!}P"mY 6~ mBmmllC[/6dliK B[ @BB+Meڄ6 T߳rJl'qyhKU 66-qZ C[mfcpBڸ6%lB@!Bw-UhKІV%18 S m\V<-g B[ʖ$eLChЖLu66-!rZ {B[& m"qIh+QپLoHhTBBЖ(9-P Jeڒy&d#q|h+T"W @BgZmchK>HHhChy&$$qph+W"?h@9-PƩber82lB@!BB[pC%~r8/խlB@!Bҕ-8LHKhV< mOhChڄ6 qLh;,3 mІ& mAhChڄ6 7ڄ6 :m^T؎=VNT!qXh{oma;`ІvmhyBh"rZ #C۫lk ۋi*6N m-l(eڄ6 :m^[[.=PNT!qvh{UkmaO{Bh*(9-PІЖJߐ6nm:-li2Um\^EZ[%eڸ'*=DNT!! m2Um\^[["eڸ-ra=DNT!! m2{K\sV~t܂ӃxSvJR&1x%Q$*6 m­ml"eV!qfh{Umm- cC۫dk6enUmm y.;DvBhچp[`BW6lnˎ2^Z۰-;8vBhCh{ mnUmm mEnUmmBf- 3m- 3m- /KYvpXІ6qdXІ-m- [CÙ,;2vBhCh6edXІvAh?2vBhChP<=ò#c *6kB[`BB[Ba[`BB[{2ZmÆnUmm1b *6v5C[ߌeV!!"e2nڲnUmmw msUvLXІAheV!!ڒnUmm}TvLXІMheV!!=Q*ݚb *6[`BBCB[- :}f2BmQa *6B[Ԁ- -J8'eGnUmma *6XBѰ[`BB[ e6ʎ2 mOFnUmm[`BB[  eV!!%nUmmy[`B{6}9ԾmI?s1/b8|%Aez3?7`G촯k}ݭ}9:'u@AB'_߱v33v+ݽI: m0:%|G4Lˌ_'|_}9:'u@Bל^_+Or1-s\ŷkJk[ Y;}i}6e%:}9Sm^xxx;x] }۟6_g_5Su?ӽ*y u-;}]:sRgGuN6Nmw}?'uֶϡc+26|4oAEL<N k߫n^ھс}:`.B+CBB[C[҅6LU'x7=Ɨ^ׁ:;:sR!_h{{^ſ*ݫ$B€;::;:: Ta6 JQSۀT0}1KSUPـV|%6:L mu9h'IoY_vlg'5j%l475{`K|sg}~ukNy#V\lQ[ب)4pҷh[\WDN㰇LO\li6>:iFV?sst ;mN-;]c}ӪeM=X |ffg3ꑳ~׷5EcނP[dSw.N‡+)Z pf2mbSlÖuz^Ix:a|ǻֽ*w|i_os^pwr}DziF6C֊,N1}ͩeO}Wd֚>@Dv㘥q )#dsV٭K1}C,zgru2z_Kbȵ!q^QqP^M|[v4CyYz瀿8/iλn}p0vzҽݞoU'IKi<:&߾jao7 3wLywE眶{LO;%m<8 Z=|'^WîJB)uEhx֧yk r+瑟qOCz5eǧ [[yhu>=]\\+\~ɻAhy:OB[>mϑ$?'gϔ>knqߞ?9(B֦VjBh[nf9YpK m8-}rmˍ\UwB mp'cJ\,Nǂw?;ԄIeloߛv>Ӗm'uサŇy0}XGA^^õO>ïoU*1'?SjʙݙZg|CVkyS^ij kyͦΝϝǵ'O5{e">Pqgϱ+?+>ϲKyX3Wbf9p˷t|X_ κx1m/_2݉2}9({hnc(Œ>?v~?Kh?wwK,Ý!mݙn$zn[";+.{{LZM;-s;k?:B"o˿._cwqwIx"tg} X>xbo&,g}K;~}Ol/J-/o|~1Kѱ7{dx}÷Ҿ۷Րx^;ޮHvI'_ZW{| 5~~?ox?c-$]A+pɯT5{˷Ͽ;.*}!"=;Ioeh|Jv#o}1\_b l5&˖,u,ů0dK1cYvĬO6{1}y㕾N݇U= yr7@]ow!ナq_hstUjfKh:ϟP!_}yCc,KKhkЀz  m'O.nu[|^{>vg~k?wU-߲wkiб~?o^ԋOȹ[k!ZN|xēN~fϑOƙo\5Q{c6mO)G~fxs?;ف@ԩ]ifIZaa}BۀvM~lk_kynf{w+KںX߅Oz|-ؽrөclӞ6@Ofցd㢎#!W[Q;s0\d(nK;EgϩWn\_4[Bc@_>_Oo}˿ˢ?u~?.f߰lȪ?T2[ e.Ol{?=~6.nԓ5{=_/먾ûI_TD۩5n?׭_LqNziݻOl<>IG^sRZvi_?<1Z@l ߏ'nu'wn7w寄I|Zn&y4y*ݜR;0Z/"vS\ҙY0}Pw?Oo^ǎ:潞'%?OkU:6?O>Oۛ$|;ɩԟ6v6顭o/fVw=[&սfjmYyFDNYy|6)\_ƾZ}f.V\6>M2y7pL_=4ߔk}*ӽ)}@Y--v8ooJEgA~YJTh;}mt2{sYeFhX/ϧ2o5^tk?;j&-}EpZh| B[+.usim-жX}|1qfޛ~sZZ2n'ޱCQuVVUp&m[1mcNemЖ| ݡ-vYC[ m{˛FnF$ mIuvBklSdڒ߷FRԷ&xPmYhۦ mDOBֶhh=Жt7uLh aB[R_ָ̳ C[ȧm7T-O6[j dm1g='vv܈HtZh;IEQv;jQgoU m& ژFh0B[YWK)(͚+mK\熶[ޡ-vAvcCB[rtq;v  㷆=ZmL0 kmg/n mwf mYOO-tO ~V m*)6nm-жX}`̜2 љm֦ۙcxP:E mŎMB 1V6%MbCطf] m&nn m!yB[Fxvmm-жX}lm7,PoCƭMh 3ءڞ_fc7ٷm&B=mcZ[6TVhzz>[d%EO$j+\h˞O#!m6[Eiy8-rimސ;nCQuVwDŽ>6 m4Lh>2? m&z0F{2mS&|{ mYh{~Ormɿb۞wL:/| mı*f炡mֶVmKЖ4o'/!WeQyPm!^&m m٭6DGhKz/ح.*cG^hݧ%1fֶNc`̌mMhq3ױMhء(uP:+UU-ڄ6@hc"-tqކ6r@h _wI'Jhkm+]VжAklyIfcж߲bҖyPm!& ژ&06-cfR{Ж!ڞ'=e#+z6|w6cf&;6Mݡmeץء(uP:ӎ m}EE[mL˄awǜVmm%]=e|w-ڮ7R{'mֶ– mـ9-E m?fե͆ء:~& ژ&6嵶MhNy\ v m_XħLiֶV meJhklmBیmmB۔Ө;jQg[mLtThB[gЖf] m/!y)|a=T{ OmIBۢmM3CۀےBcYlz]fTsB[ǭvQʄ6-br"Thv mw& m+`h9P_ mowL kmBĺ;jBۖMh66mbh{uB[Rku9.B[vh#MhFTh[m@}4>B-*8g~X;Bۊm&BwS65U#=_Bɡ-`B[ mJh; mgB $ڄui=v(JԢΊ6 @hChK:K mo98eYBv7F.pЖsBBm%J}Bжbh[k4Nui=v(JԲC [}48-ڄ6@hZhݽX m_hZnh|B[ߧejeRBV'6[><ݖڄжЀmEҺ{PmLhڄ;#Cu7YB[{ڄlh[mC[2+w;,52 }X庴;jQgŇUZmlb[Жڞ& mG4 mo7[jꧭF}i~klI뇶"k mۄ%Dh+UVcBhڄ6@hCh:n mۇ6r@hx& m/ޅZۙonw%B[;*'GhۯmbKԥFء(uPڶlmB kh lmB[pmv/mzhk!y'ޓD|% m˵Sh˾'q[Rhچ##Kk CqZh{, mІ&=^!uBv mmr-_mOZy[S6m-C[ֶbN%mmm١ȜUbkեء(uP:+ m헙YThڄ6@hcڄ6Mhڞ'/[V m!Fh[4}𱡭fkl1 ms㙝Bu21Ghۯ me*|PmBmھ=B[y憶;QP6E6Mh;'QhVm[fVh8PoEhVCGlѺ8;jFMh6m!Gh+ںעp-㭩B>3=xim'X}<6&uC[_kmB[TCۭMh66Mh+BZV$EMhhC[ǔԊTkla-ΤЖmm#C[!:KVKŇء([$ڄ6@hc mIwCAhKڄ / mi_)im-cL4PB[c2EmVj%R>v(JԄ6 @hCh m}ah{ڎ mBBHh{xk־oS mEZf˸hh?PAT$ mujoۦ.cBhھlkBwS<Жt-pf8_mBaڄZf˸nh mQHh&жh]3EW<{bh+ mBBB[*ڞ* nmB[Ж=PkpھMfBɡmmaGե#PmC[&B& mڄcC[ mB[ֶҥNmB6Ksء('woꄶw* mF-چ5ڞY mIm`>y-2# cC[԰o>>4)ujmXkl6 my%UmqGhۯag֥P:>V mƁnkvtkN,ǜ mI|pI0Qpx1݌G* m͖nЖ4PcB_jmC۰ڶKء89ݽڄ6@hChڄnkڄ6Mh;<5N6mt$mھ&Ym;/4eR5m&Bg[MhގЖ=\(mD:f/< m͖nЖ |dmLhږkmBfui*8v(6m%Ah Mh+ 12׮v meCۓ m"' ~+*JTmMh["GB_(ڲGr/ ScԫG-[m[[jBQq3ڄ=Bۭ Rlhk$QMom-Z4PB[dk61m4?NkcvChB۟&ڮe>B[=B[Yh mTֶ٢ mEBۭ޼pNh*mf(zd׭7[XRhڄ6@hڄawhGԕg`L>px1ڄ6mֶ٢NжDh:B~MhNmCGh{RMh66Mh-iK憶Oʡ[bC[ N-vжėZC[1&imEжqk3^="mڄ6@hCh ?~ѾжMhkxhՂ-\*_ mG?1bVK̈́jFϿ(imBǰf(6Mh6ڄwhaWBׅ6MhYJcC[߻BEɮB"61j_6CQ#Q; m[mmB\١<,>/vxh{bˌrBЦmKhZfLhjmBvZhR/33 @hc mBۖzcv ]X&7 m }bJ־жPhmECZ 6 mF mo  Blm&mO^~\8-ۇRXa mOЖ/ mZ1j)BmmmmĄmk;}Dݱm̛:{"my3Vhk9dmB[ZEC[G8 mV<݊A61gh^6CYh{r=rHhڄ6@hChڄb6 mDhڄ6-i&Y*uv ykmBvrh{2^=" mB& 1>B[U& mI;BŌ m6}6Mhmm[ڵnk3B[6!BBIk[۰lm1o\>B|.T +cLh~T m_ж_kڴ6o(JzDh6m?d'ЖUm&&Ux" m33%չڴuVh _B[*X6M :׺PںGRMh66-q慶9Y.^ m| ڄ .~Bh-`vk՗ڭ gBV mB[P-iڦ'=CږڄEYhׅnZ & mІ& mBEkھΉ&Dڄ6M*D. mB[61a[6CQmBۖMh6Mhmp) mZ6wfۉf˕YKwZvneC[wSmӏ@6 mPT{WBmmB_/53g_|&Ux"жJh{ʅԔ%׻Ж<|bmmBh;m#\„Mhl%nmT6 ڒB[mmC[RXO Mh{\܆S|Zewiږ'Y3.5Q m{Wa䴏ܻmU=KSnU mB !uW6Zh aoҩm:]7m -EP<- mBGGmnuMhڢB؝z&lB[8lܪ1}Mh6ɐ mB6+|>nڞ6ڦ/c=6lpeSL*fn[%ٳnh?6m?g3*4|6m~ m# lKж=IMhSل6Mh[VɀYڪU6 ڄ6Mh \R<|\>B&MlK+|q/жYePLyWQmup% mfV˨lg/BÑIlcBuBЖBv5Cۓ־жze]ZBۢ$SW_h뎀C͛&ldžPi mu*mmB[^ڄy˾X.Jh m߮UmbXmmUbr»lAڒBp&ml6-pf]mfNhKN myzrBho v':b&ͪlBv`hjxhB۬;B ! mKִ m]"ڲĔ'. mGUޥuNhBЦeule[z6m̭ߓ6v m?'ˆ[W .jlڢfFhTTIV m}C:&lGAVƇ[nhxSh66~hK aBЖ:k @m!czfIٷkUlKKh; sOB[RΩlydwE^]w mB !其mֺNlIWI ^'7C+[ m/ӄYmx8o&ǛU=I/mU6MeӺxTlBfMh6[INh mC[;juڲfTjڄ6m&v':b&MlIdwEm_ mIϝ=B۰[UBmmmЖDƜ.&^$-& mB[^h˨'CRVd|-Nж=Roꇶڸ67imRʹ+[AmˤwAc7+ؖMh616Mh me-;o\*,xy?q-Wh :uPC+[F.9îufڙ-6rܪBmڒ m٧I!V:_-ɺ+2*B[CKm[V ^pqj_q#C[F*NlBۖ-C m{& ڄ6Mh{- mB[Yh;!7sC$#mV+9wvKۄ@r- mBsC[ϘBҡmp@.~^h[+qBЖQOv m#mͳ4%uONhe_{6mc+жYhPC[cmm1?% m٧I!,7 m然'%^%cmsO '+m\j{BV9-k] U:0 mBcCۭ$Wل6mbe "=e3C[f\06le5uB[Wv*жMh˸PVm#oU5p*6@hCh;49 aB[삇vp m:׶:vHh˨'{ ZB9$WmHh;V$=_w!ho#ۊ&7ڊIX& mFLh[7e_e(fmKV mMB ! mBΡ) mB6;eԓC۴{-` mB[oIBh{8 -?]x^Mhڒ}SC[ăB{Tֽ< mCE6bhvef{8~vlB !ڲwʦtfh{ҘNmg6`dC6rmbhٛl mޓ̘Mh Fn;l\@& mBa?BЖW^(e 6%=\/١-)|}mk-枤}*V3?}(o*[vh :96 mІ6Eh8}ڄ6m`FBۓ{)B۬[ [ ZԹڒfnsBۖm`uNh mBmmm9-T65@Mh m!c% m 7k16$B[l,v m#KEB@r}Hh[$BB& m7{CC[aVhřMhܓ& U䱕n%qaT! mCۏ3 m m܀&e62ͽ"~z.xh^˫ڞmnhK'eC2 Z~ܓڄm`uizh[hVRC[oXfh[$BB۠[SBșڄ6m*#\B8SB{C[Ƽ %-:*[VXkڢ.36 8$c˞~ve憶u'eaVhV mkISYh&9mжw0rᄺ41- Tl!gۇՎMB ! mB-l16-5ͽڄHoZ=YEgJhsOr@h e놶կ"lĭCҬж6 mB !?~+6xf mӯrϬ6^m{$mKڒC$ry*J RBȭCҔж6P mU6 ڄ-Eů%B[s`hK;akdh R$m B[ KUiﵰܓڄm`>9ui|h[w8'֓v5BF6^ж_h~E\'m+CNm kaK I)-iZRQvZ*2m!ږU3Kmk6@hcX&F_B[ْ2ģ+eC?`dzoڠu,6q-6=u{^B۳ +ImXyd{=؛l| xChsOO m7*JC߸;cB@rBۀ[`Qmϓ{ AB+ħЖ|mI.)6mX mgV1-rB{wmy6ڶl/-gmm@h n-+Kh6ڄЖ|ê_:M)6~7!SfhK'ޕ}W_ȉ9-ߞv]I^3; Tl/Mhڦ<;25-x+J_s+Kh_I.~%>o-H6*2pF~6~go dXٻ5.*Ph?VBk7v=Y'e[\ݔ!y7feS m\Al!Fj% mɡ V? @ :m~Bh[.}e#b4*!BsBY &o+r-iˁ6Hh'~lE)o m+OEef?6Khnۄ`. \W񷄶E m0mV6%`. jl `. 2ж/ &B-Mhڲ m0m+[FQJ[cMh 'tB /%ͼ6 mVeڄlBL'B[-(%aE)a6@h{-F~Kh 6@h{Kh +GBT B۵[ж. *BweڄTBT BOTmpb mPm?)ڒжLho=lBЖGh"6@hye+Ɨ;-EmUж4 /BVEmYTe )Jyk(?380mVʡmJڢmPmV6MhK"@B V-)ڢmPmV6*wB[ -6Ch-o mKd|`0 8<%U6Mh @)Bprh˫l5C m!6(Eh mIQ[B6(Eh6Mh[m- ms'(=!66u%Nhj66 mB[8 NhK[mPچUjm6Fh m#+& 8$ lE)oNpW(`B m*LPh{Hh66m&/ JڀC۔v(-mB${YMhb mPm{ DM^mMh6`6*JKhۀ5 mmneڄ@B$[镭HhO7 jmnhK[B6Ih m*&& ,lE)oNp'jG3c mжkh6e mNNeڄ(B%ۄR(e :, #UlC[6(Kh6z?Qτ6(Kh6m+ۢ=|a`0 X=լlBBhʄ6`V m|&@eB mKhۆ mreڄBT&mbh O䳏 &+(e-mB'B&$@qB\h[T DM"@qBVh[ mڦ8 X(-Tل69 mXQ:qA6`жVe}_ mP,ږlB m6( [BN6Ohꇶ+&=$@}BP<-ZƇu?Q>7Lh*u+ۯ "6@hڄj6X mKW_Cm< 5CNEI\` BP0mV5. B&`B mB[)BBh h&6fh{ߧYm< Bۀ4o m;` BP6om#%Eh%m@Z\ж Bۘ$ mmPme[ȥXhy mPm5[EXhy mP,^ 96> ڶ mK#o# ڀUBk6r"GFB' RmO mZNk9 mmPmRڶ!@qB\h{-F|*ׄ6(NhV mZ9Y mUU mPmBV mUU mP,^[Y mU鏜U.mPmSB[lO5 ڀ=B۫^k9<\, fyx:%@YBMh{km#g8|g B%;W6rn'>xV @YBYh{im#6|yAh6@hENh{Bh6`Fj*6Ih mm䬆O|ʬ jڀ]Ckvk92Dh6@hڄ6Ih6mm|OyʬrAh6`Fdg*? >&3>t#@AB m&(=$@ABpBh{hm#0|go mP^[9 rH: 8'ƶ>剳O6Fh6Mh[mQ5) #o7 ue[Q2#px^U"Esr Ih6`vjm3׭׮*/ mmBЖmf[%/_U^  3[KB"ۆcpkVݗ|UyIhP6@hVb*/ mڎmZu_rUmfUŎ{μwmmǘ6s/6ªqmvN.9ȪLh86@h+ZhJ;n9$@B }ښW^hFh86@hNhڂ  ھ ίOŎoμ mm?mm+/M#@B =*τ6BhcW}\lU %-ΪAm-ȪAmFvJP3 "¡b*?mmEmOzy  >ږ*?mmg mopUNh6 rhm'o~yQ3x}|泀ЖVFǁXwu9' 0 k]90@pQE mF?_gΊEmǰ;}ʙr?cݠKc:\.^b5u.Jhy_vx/<7 h7O.BB[]DZrƭ ]ݿZ3. t`qQqsQhB6}>~lřOqM?ᄶ= menR tǺ#X v߸Oc݄.Wk:Eu/u.Mhʇ32 m=c؇REhs2t3'߸OcdpQgcЋc:Fڀ/OS~:y=|t!'UI4,7XyQ:EuC/:u.@h m _T_~^/(}r/?@hKJhs2z#u7:9u:0ͼ:ֹc (~s߷Mȼ\ԏ7_k4+m]DZ vssnEݥU2. t`vQ0ֹc qíʙ۫?wB[ZB[A]Ay;|=&^u:0йuFEm@v_^w]Psk:Ä)c]A%nc]a2ցEuC/nu.@h;gmb6):s2@9;cNpQrQesQB-]:guJ'ھ' -MJǁX7} \ԙ\Թ\\1m7k>w6tBcݥ[3>uY.1c\X7袮X碎ф6 Th{*}oUN|\ԏl[3W?W2ޤt:us]ԭ:EݴE# Ο=/s|>99'W.g-#-}JXw;uK.t:0й3ЁE]EC miQNm0. mmSƍu\Ե P:0й3ЁE݈Em@O޺/~g.]GGh vD=EhLo{Gya~6Aӓbg5̬}5׆:>)v&PҜ1}aCh}IhJP=FZ*tp愶qKps-% m]y!}N\۫@ |3!NKAC`9c{/beAϵ} 0-y{ӈ*Akbvkm>i޸ s5v/e1|~ 8,{yi{҇>A=P58ZYDCkɷ lzl#C(ter~+8qίQ%k[7Z橃/u׽/]E/;<*|rG<7_XXn\5z/91~W eo=΋]=}?҈sz=9_<8?׭k6Pyix^KtY}^,pǗoQssLgD|b͟ȷ`I׽5n +MXx 'ͽ9VF-W-}78W~fw;){=a6<:<)zBM4^3CѤs4e57op ܲ=jNya^Ю~yQ7ZWh[n];_L3/~t'D2x?.{hyH<䄶Eʴڒ? 99v0 m5glv]c*\HWCFy͈5=ݠOoُ ad.݉O{%{r ok{͞pn<xwk_hKa?taKC8p5}e3|t犱ÒGLăb l8`^~X/6gK# M:ސ|P4h߽'GD*=}zos+}7znN^5'/&3g?ϼ&qжS ̈_./taCߏ/\{;9?/?2~e ں|8i#Pp?p;M͝)߫W?~|'W{o^hƢak߽FP*= "㚯%rf 7';f|ս/OYU}3Wg귴"~Ծ[ُ#[/ b# W.+"/NO7o~\-v<_ `c3-QqƒV c>v#zGo2 ̛}~N>/:y9qtz6?qڛOVm)W7Fل|f(] iߕؖ_ۄA#@zuzBw(}uϢ[^v||s۶de[gP$|hwmk7MhxtJ7vuNh; s_]BgEvN~2hԥ1yWus:s)u0q.2~F\ m^' f×u9]Cy[rt۶de=?~o'sh:dQM43s;GZ[sen1tʴvem>gCn7/oXہ.O]"Ro4 N|aR^?wNgwh=%q.< <7o_griߟ ׿ڮ>+}WGk%<,ݴxd2*նنZ{#״qx W7yz~?v2JmV@0<3?n{?mcyC~[Ʌ_`ˏG?bݶ!'wň'Hk6V| GMatNu7sWQWϤF3vo=O OzY_-o:s 3mſG~stQO/ΏQY7ERqB۝ۂtY{;0[i4|#u$Vo=v‡7g1w~wNXr br{>ɕι.k=-^j6{k[m;{V+w~qN(Z[#mڒG$޵._&|v8N^= ma_n'Oom̘}emW;a4m lVښ&жOk+C>Mhsf Mh9[lQvuPq.M/ڡ4ڱB]im}plmжU*mv m7llڄ6A'P;Sh ~]򣅶7;6fw-Mt6q)6ͱ13]Jfm8?y ]Vp-ڒD mU?_%v mmBw Co%Fv¾uMB.{zrM#hۡ+/'6m'cl m[foۮChChڸqPℶ8ph_WhKߠ(A+ʷ$U:0.,壌e䳼Ok+އڭ-DUbBBF]m%FۥWc-mKlmp[6h7PTh2_j*90@mdm[ΡpkKzQߍۅ66ƻm-Ρ׾քl?B[қmD p`Lm_v4^"ߧ.PgB[֖Bh]v Mha6+&L-k=}A{5B۠Dh lVښ&mmB[&۶ڄ6nLCJ/Bh.Ȏe|79}LZжjg m1bdk+CW[h{/ iߧOC[֖dhBmTTHwR8 8C+v>Zye9l6LrX#CzV/mُK=+ih^[ՓmmB[֖Ah]v Mhq*Wh;z1C[; ~!c[nm;^=yr懶+uB[V`#G4!\t6dkKzꝚB̤5S9IŜ:^ m?n6 m 1adSjq'}Vm]yb~hkr38'mZIk+B[&EUcІ&xװUhdΧJh!5?VٔZ67Fmʄ2& m7 mMB?۶6dkKzP8e lІ&| pI!=Cۏ^8s ΆCBv}%Æ& mIcږ\ թ9hmIjtcB̤;)waYB[*&hm5>r r@hsbMhp]\_4C[V`>cd|ߡ m%[[{z7;%! m45- m77Ah;GIڂm{έP;fhwoMhql:.^mgN m;RfhKڄ{Qxlڄ66 m3?,1KhQaſS񵶒 mf`⇶ԭ]\/),B?۶6'q!% lІ&6zV mZVr$k'6j&˜TI* mжgkڄ.jm6vz mw_m/ {hK5lJ~$fڄ6'wm3SBHsA?Wv#ڄ6m\-+5|ۈB' m[V%_3Hݴ%! mmkꅶ;#ݟ"ڄB[) Lqjk[iGZ>-fk-]]MhP69IvmF mmBB[6nF1ayh;BЧ^lmCoh-f mBsϊ~9Eh'EkmB[& mBB{Ӏs>,q)Uh/ɇΡ- VM mK$rh[rm#KBB۠# mZ['[B퐤7 hX`66Bh<$FMha1 |ytB[vu=-Td)CWl`yh[4m m%[[қ7,UȄ6žfZxJD(MhB۞Mh[¾7 mq"ж(Mhڲ w-mAIқdh[QBBІV)uפvh .8n=[[Feyж* KB[R`A6vkJ6-6Bڄ&wz# m_ۆ6 mB# mYZ[/&ږw B&І$U5o+,m0_dlmCc"7жmh[Y lcжK" mk[V%SBmfڄ6s_BVmt~ںl`6mlmC뜅-fO9,ۆk1!u,tBVVmIz&꽘BB0uDhڄDB۞m~h{TdmUh*m &#DhV6dkڄ%Fж<$)53OB&ڮzզXHzP#=oHڢU m;_ڄڭWEmKvN-BB۸f! m7"jֆKB# me[h;B[ж$ClIe mC&lmIoP[`66mC[i i)ԛiOh[{׾6m} mK.UhZ l`ж]YB[B' m[[#K&ڡ-ڰ&( MhChڄ6Mhچ#Mh05GPmrj<}\b& mZV%GBmBB9*Ӧϋжm2Hh;K6mUkedB۴]Ah$M( MhCh[; 2Lh+zuȡn B۞@! m%C۴R`넶Cۏ_/3Վж m%[[{- m != mB۠Gml|& m`_(ͯ-n8KJ6mUkJ6][@hChK+eahI6MhjێؽB[֖'† Eh ڦK1Khڄ-אmwT#B[؍ڄ6vmb:\&C[1yjmPkn:Oֶ$ j[[[Mh@h#Kh ږ m_' m]#m$>tmW`ڄ6?ZV%5H4h-v m !e m#Rq#Vh+~TX#ڄ6Mh \ ln{kgUk[ҌѭMhڄ6 6ӀaCm C[/ m0b? m qx7%M mszYriB&imna\HhChژ0 mBж3% mW24P mki٥F }_745 / m~ʷ%HDڒm@-ڄ69{Z*>& m^lmB[?)MB۝R` m[D6?ZV%/H4' m ! mC4 mwPpCǺ7c mB[" mZ&Iږ"ltk m@-ڄ6i ֞#w mBc3e<su m3..h>ZGhmn6ڄmm~*WB۞-Zh{,S mCK-ڄ6>mI*F7Bw66 m4`䴴\/ mvFhjIhr m mh mvkJ7z%F9MB[! m ڈy l&U*/B[v m Dh󳪵-D& mBBB6--< mB[av=/%jmB[̑Vh۶fkڄ6?ZV%#Bj" MhChڄ6m2 m}8m&% m.. -/6g# mBk9BmI$FwB[[- 66Ҭж04mC[ ݈ⷶ) mKn6Mh󓨵 m%[[;MhEBBІжk mBЖU ڄ,'.ϾжO& m~%H&v mk[[[$! mmkO^B&aڄZ[mڄJEhڄ!Yڄ->Kh Mh&?pB[&& >2J/8-ܛMhھ/GhsiU%[[MV-ڄ6BUgЖ"-C_m۶6Mh6iڄ6?6dkKz; @hChR\z0/- m1u^`IqX` xZo6!|m~V6dk0-lmB[-ڄ66<_6:MhE5Mh|Ж mBDM*j5BB`Mhb?^=[[M۶Pz~C<7[P=z֦OlmI6ws66 q^Bж|WEVcn~Ϧ&٧S%[fdhEBBІB۴fB^=[[ڹP m mBDM*G뻿[6žM2o # mB`~B6mồ6?Wd?#-6GhCh`A JR%OJ&-lmB͏& mBmm6M{PMhK[v6?~mmBGh# mLڄ66ڄ6 MB# m~mB&. 66ڄ6- m~jmBGh#ڪ 66 m m& m~mBGh# mBBB/fk6bڄ6͏?BGh# mBBBІЖA6@hڄ6?~6Mh#ڂW6Mh MhChv~(s3X`s6͏2Mhm~6)9BBІB&a6 ma}ďqMhm~6Mh@hChN m̮Cv֮Ǐ@h{?HI~6MĶs}Ŷ&mmBBl"AOh˻QF=oԡm- /vMhz&Ug">@hCh { 6wj"=Wڪ~aۻ% mVyebgUUmo*)@h9BBІІ-M;6܄ɫaWJm& m~U6deKz[tmmBBo/Ah3/K,<) mB*xSMhkB%Mh+Y2uYmMh@hChGDҀ&R^ *[Oks(Xt(7 mBqlB[&C lІ&! mB[6ڄ6͘& mB[MyW6Mh󓨲 m%+[[.]i2ȄBBж*f|&Eؽ^ BۆƧl8,|eEhۼ mmCh󳤲 m%+[[^-վj Mhc + mBWЖ}s=Phڄhŧ_n^ل6Oʶ${+fv m !el+i Qv O-iѨWg6T6-{h[t(ʋOڄɡ )3lB>--L d5oІ&! mҀ&Mϝжae;J|nCV;W mmCh󳤲 m%+[[-U mw6AhChN mڄ[mV6-]h[t mO^B'Ke߼Vս*ۑKzvJ(ІЖ:%z{-$oQHh ڲovqMh]2u*5ϒ&lBVfnnІ&! mk@ڲ%8{h m+Ж+}3̽MhN!{U#mo6žÆ\oڄ6mж4!?"Sٲ% mBhMh+YقŒXmQcCoІ&! mkB՗I_-]BZ|ձg^-Kh[t ms+nNf!oN,l3תae;~q&E MhCh9 ቲ㈵jU8ih[ m)NAgmжgSBۆ-Zh|#\ mӂK-6z mB,mNZUlGp" MhChڒJ8bm6-Q^2P mVh3+m)ގ!mIC[˂'6? *VmڊU m}7AhChUIxMhڜ9|"׊ۼ moc>z.evwN#F }Rh6?)*ۄ浪\٢ ]C[@hChK^$=GhUuZ!eoth3q8-Ӻmeڄ,5~lڄ6 m&6Mhq6mq{Lh|[{xmwKM6|N# mB[[ڄ C[|?ڻݵۮ)cІ&1*?J)je?4Fm˪^6lkC۴Mfiߴmڰ'5X6"m5*Ӻme[r~%І&mNhڄt-YOe†P mIgmmhk$$$ mB[V>bUЖqfBBІж&*ȡ m{\ruPB&o{lB6mo]6yXں' m)*[iݶ mJnBBжd}yCצ'8MvT;mhCڦWߺ+#mFmvs>YhڪG,Ym-vMۅ66MC$ mUhRhIz*&YB[W,6Mh\"O붕m}D˼bwmk.! mm5C[sp mB[pڲUm&d m^B۪"?C[s˄6R.B[V>"U}Ỷ%FםU>; mApNm cжļڲW6m{\m|u >졭czI3 YB[5*Ӻmeڄ5}lڄ6'_mMڄPXh+F+["Buqt)5B۲X#-^& mB[d-Nh+|p7k+]BmmB[04mͻw^@h+Pل6a}vm+o&O0BV5O\>V /۵blڄ65Q|hpB[6N?ڲtB[V>5#-bжx:]mń6-ie6Mh NIO mYB&嚁2餲 m7m'iB[ж~Zhn;UnYh[jG˾KnBB[TdZ#9*6MhE5&uYz/=C[ۘ79ƅA4B6t>yZ n[ wm%k.! m\橄'Ӏk.PkCۄ'%Thr+'8JqBےMڄ\mжږA4B6z>Yh[Gڄ6 6;<8nc -QhXښNJ m-xlj/ UVB[1::~& mԨO붕Ha۵zlڄ6-Թ~ᄞv G-g~潖6l}huyVcVhn[َf(Hخ`cІ&x p2 àЖk~[h}TжpbDKGR)e_ol0 =wIsvm7 mvգ(.! m4NgL^}Nq>H˓^5za m imvmC[ާ|v_5%_"@v? NlǔЖiݶi?Ph˾]v Mhq|жt6n,ym ma녛bIeH鞡mF mo[ڄz-|u-;rtB[}+!nZv}ЖtBBF]C OC۸$8oyۉ^EOE9p!_.Ŭ^mł4<+12}ZlG=B̤5S9IŜ ~& Ai 塭-7;Ϫ mz/ -9U.3n m]'+!5mZvm!vգ(.! m45m;L#Ozq~Wh}<=BXjz4±6 TA6{wƛաKRh+>ښ&+5yZlGD"ٮq&܄sB[ \9oxkv 2uy/ڒX#׆/i蚗l߳_چM mk'csWCh;iT#WWW mhʇ6'Dhlځ}Khrs٥'ȼY=^=&Bۑ?,P懶bǀ4(]َ~Ӻme;6{v= B\k> m;_z|-ȱ-}t 6^m_8CۨWmd$43[oC[{ Wvm'6mʖFLhs56mm46 B@sk'|zd2IBBv.s&:Q҅+sk26x<BB[Ŝ WfCPBwsn2l Qh{5.Sh  KpBm%=> ))B9pBm?=Ι󸫖j&Bۥ]L PN# mmC9jBm<=Ы)C9d Ι6ڮ>e mD#AnΣ/Y@4B m&sV`2~-3/ m0=ZY%kYhChίey!pC90Bm-=)B91Bm 5e mD#AajXlNx,x&AdΚL^6PBۣ9+3yB|Fڄk2bͿ>p "GWsVf2'c9_Cۣ93sB m6=># ~@hk[Hh1ƜUimN V0sVib}“|w?6i1Ҝ_8eB[ZM[@@B, mՈ6/aSwBm؈6/a³wBLm)ۜewBm+6bK9e3Cc96bK9eyYhChY9Hhi1ל5L 6Ym^„gY/Bmwpb0rBc9+9aB1 m0:=#ۼ ϗ_6Ym^„Y/BmǘeB1FzRssb2hTx&XmΪXlBBτ6YIhmУtYЯk[m'`Dh{0gmG,y!FE gBtm06/dШ(Lhɜ66,! mBB m`6/dШ(C#98~U·#pk#ۼABt mG6gG,y9FE 6ڎm:XlrB?m z ڄ6ڎxm:XlBB?m7Zۜ 6~ڠ{h;"9k;b4* m vbۼqBtmG6gmG,y!FE gBmG6gUG,y!FE gB mG6gUG,y!FE gBmv8KhqX6/dШ(LhXe m$vkmsVrb2rB!~8g m0:ZۜL 6ڎmXl&;Lh)ߖyߜ\<ƺ]au`sQgc:& ~ m?^߹Ԟ+yѝ }p P'rǺ^g/N[@0ֹNehx~v/v^讞 "ݧ获vx߄C❁0]zu(c\XX m%]=_?oo7;pgNGkhA:Y(Ό JRIw '<$=c{Ts)ALjx k2YoYWRI2K)3.qM&>=^uk2Y:YΠNЁ3FPAh<%>[TBcOmLEs2'課s.vAȺH%f] AgP:: EiѶj} vdӲ%^W޹h5Sf]m֝ILJ.bYY7ttuAAPhC)"WO=fnŋ[h{Sf]VE*N)# [*sz-d::AΠHhCY^RۮCR%Au͟:&&ΠΠdA )Prή^ 9 F9%olQ^;{'TBk/xU}Ƀ]K j]Rֹ Ϳ#=/dK<0`P:A 뀫֍-)÷9*'_m|9>b/Vv6h`E~C;7w̿(V6x9Dk+#v9Q Zg!YR<Z$IxrcI [ovfXD7Z' O> stream xڕWo(~_am_)qtIuStnU)I&vv/0;/Oaac((|X^eA I:Ȓ(4H1P[x[0C+dgql,ZV{$U[BWP&͒(냐7XVZ Us.FNqJ"P79o&3EndYJ"`Vjr+R<%x*LW8׫b(fG9c`(TNoaɹzTkWnQi2ӞmVk" 7*}8,'84ZˈFeJ4_E2IV TQQ[He6W^Ū@mBRU ga/6[C%SśF+$j2+K~GU?M۩CQf Of_Jm|ɾۭ(IA<>w=Di`j΍ۿMBhX{834V1GX@)A Ik.]Qw`+NS^Xq 4{!;iO%„Uo+W[TViĩo/j1lOGH uZՕjX+{.tԐ,؋]!E 2sK܆ByÑ,NRL 2ulW#Lh ~a|rO2vT$Nh8}Ǘq`z]@P+ky>O6G?u"Q6*9xѕ\p9 O1B#2qt8u<3 x1`JمK؃ƗK9s#9W0?Hևxlx3٠jq=5쑆T>'sH#x'٥'^I~Om/yW97wޫG/QժYٷr[^LMB_\;Pyؽ\Q> stream xڭko8{~š vnۻmk rDȒG`p%+pf8b<:{6AZ/dqU,n{'ˋeDyݬ#qnG(Nǿ+]Easo'3G$nqHL?t0t ^©m æh Ki[aT*Zׅ.4WMF-%,}䦽D0u'"tQjά[rݪfFCdOn'oqW:}AViClTsܩ@]{ ȹ2ƺ. ߩ/yՆ(JتroS -*t]r{ć=-Hfd73Q54-lj!T g1ؼN Sdݱh lº`/yYPw0lE9E 7b, M=FDf!>oq` YYTVXrȝ[4I;o9y AVS?*햂Lp$>wwh"ōGS_ ʛg>#wC?YIawg7ޢExήŃA- WI3dzR2s|&n)y!?ͰL+dnEcan?es p&КLdM87_D7[Z[M1򛚾țE޷cTN>CL^$huS(wou޺TU/`8ua5~f@Q+ԫS*y]M;G⧿GF;2_lc P9SM5IF{IqK|?tQ'Vׇi ~]3t/`# :  :QpGsF?s̈́bL(=YYnoPswHۯ\C`2ANJFJDܭ{R}*^P>ʲ1H-}թf_q 0VwVc<֍Z5:i[}Ǒ@@c{L(Lb綝lUU zɩYM\\~97M,Ǣ'o(yr'+j4 AP#! (j4|T7֨4=F/3~G'%Д &3UZ\"I9`;ɑ|J4nMDZ*Lc,)\xD/`v.@$Z)E[*ıvW`ւZR 3iX)q+ҴJ,ۡ>+b-OsOQ*Ev9K#IÕ0 xdžN]X[َ=Cݓ]s{B5yB64ѨM`q,-i 480᢮un-w|W1 5k/!@%P,D;6#`JYQE MAN"0(=*$SYj 3HGED\.m LgU兓o%͒UʹZ 56?B)˜{m>@ig%Yj3K3MQPs`b)&`ёhr+܀D4(/;]?}4iPBA3" tw4\*[S4Gm `4ܺ?q}oppvHWi3 )k#_j̶(RX]0'ނf66)uc;~ș>,ۮ>(iPc#yd2>:Kͷά蝂pJ(WKLv8" ~N-ibvFB}G| H3OC̦{s?84Jÿb0oq?~CZq]rSj>7f<髾vʊ5WU!b%PN-8ZVI}QѤ†4%:$?e F[cY{5}eyQ5# $ ?Ci'P19d/~L(bJ֍BZPenܘM֛CD/ endstream endobj 3511 0 obj << /Length 542 /Filter /FlateDecode >> stream xڥS0>T[mV*-6@jVmh 3of<@}|08ᥡ9%*T&P4Z= 3>K+WWj%^BBQZMvq] )S,/K7j>J_t9sruq~epir 5̘wUeZ >ecB (#'>i1H kF{ KBmԭ\ `"!!rE:$ 9cHw%*Yn-(K=* }gtsދNj-(3r8I贱gT[ҩ!,m.uLjKў% CI%% Q *{Qf)~GDq8G2En;S#x?]ck{aSU ͐InO>!"Z~jG7_AQP?B4̛ƕ endstream endobj 3496 0 obj << /Type /XObject /Subtype /Image /Width 2339 /Height 1654 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 80022 /Filter /FlateDecode >> stream x]#r^VYgV0;sMK-Uge2qXvD H 믿"FBߵ-Z4&^sˣ#Asߵ?해!eo }g{_Ck-O胻`%Z9SևPz_ugo<.F^GdzS +2\e~~;{wx^ڿ)잙x>?81'U eu;~o^}z #O1_ ^ Gǖ۝?!/-LoQ| h߻Gow3`>=a/Wؖ[Үϼ_Da7;уR1鏚~= 5|~;ΉAsK%Ŀ)XDNGk_[>z5myX[t Yzchu?{?~wq!.k۝ulGφEq)+72;̀ˣûM-ұқ]LLr飾}4h$j~z]S/*ks IJ>h>jC1S j~?ԚyzlE#o?u\*Aw>wKk=ّ?~]%Xz|CAUhI/rOmڧcOovK Ѝ/??DKEs/ mNZ7h/7W3GBۺU)L8]XUC3Z}eӟ|\4~kK#8stnUɋ!kߥϫn.GgoN9 m-XkJsFPs$ mOd6g}sK70kطȧږPI߷nx\Q+O&dS[7oL%۬OӦkGW8ryfO}ciۻGʽ5;]آ1]U|_Prn|t꿾WO|Q:Jh+v__Jl?}LϳtOٗ<ծ"'#C[ ͣ{13}|T xP mVev%Wd/=z3]4-*cœq#=22g[KϨ/{__Ttӓӣ:#;{BU{Ļa/L=߸d yC7X[yot-NB` Ⱦi-^}y߅ZqdEC[aLw|Uӟ;ͷSqˣfIە3>L8'kk߅G[V ȣw*z~vpxzG mu|r m_1}2LŘE6⻗iWŧW{}XٶÊ#Z~HhKw ?Vܹ}%SOkg?3~b^ ~¨o>Xd`K,(=gmmU^O &^_??_ <яq\_v_[Pyo~Oǯơ_W?󯿷[yt^gpсmEc?[?kx5uybծ~h߻VScx} ?_0WC͹ {m>}';hzRU5o_,?zۋ|OJ_d؋~y.{[qy ͟yru>wָ_G׏5=Wl^jNYx7!P.(é~z6|y7nåhjxOCۇpUz0;|H3;^dhk98rp8tؾ~N;nT#znY[{k7(m2oĀƄuB???~)6kQuB~ $;倏?f2x7jۯ횢G<ߓXL m6 mC^] m1Mh8ggB[!_mUTˎnmB[؎ mBK_6m䞽 m 4. mWͱ%ڄ66V.5[BWB=mԍkzBvRhK53B[>ո#u[[J% my;R<m["_<_ BIMhCh`˕C؎mMhKڒ m[v>վ#E[[8m9[vCh{tB۬c~Okj-GR%wVYڎimBB"/2{:em^n\ЛUhxr<UeC[VnbBۊ]ڄK=jm1Eh8zN:wRڴ{v*l6E(ڎ9 mi)!QŬжu/edm^6cZ&}U mvF mZ[m+ж:mG+ ;mlBa@ڪ6 myB۬}_ݿ/V7.U mۿ1>}W+nhozЖ m76&KZm*4T?BD Ϋštk8ж]FFxOh[ڄ|RhژGwB#1O mRGh[Q̈́G^x= m{CCÛO-,VyBB[&!q^vjh2Ch"owMmݹ*l2 mx˅ȁ cQhKFB[VnRa7"mxmuU?34=B}fGZ mE[І憶魭{Dhv)5Emת4-m-_خ m͏S-k7&%imsIhڴ{&e Ep6EcaB[&!q0-#uPh\?&m+BۢG%q-fHKWM85ڒr{4qz m[<25vϯ)% pϞ66j6mih,Mh;$C[&!q0mh}B98/-S1 W7A4Mhڄ6m:u+U_ɚxzcF{;_mӯik۵6޹*Ch{ى֭ mЖڞڄSC[˕ mB[. %u:p^hrJ6 жHSBۊ%)G`uڂoZh'y-lYhj2%e۝B[uSe^m ms&U m?T74?w0N5BB& mmגڶ|C6͖7ËvLk+;BV4u_& mG6-shH~6>m[ІІ!`Rhڄ6Jh{:5*SB[Vn_&KBۖ&ھr-mhK{!?;v g{hڄ66 B& m- mB[24ehmeohMmz6Mh+wI'<]^ڄ66&]ivXhk?z'Ň,6r;" mIBۧ]\h mBCÞ Lh; m [ІІ6!yh2#[Yڄ6-ãXhKs߮BۮVnG&NB[dk҆2xB[Ж8my{*oЖ괓*ekmBBB&U mmzucB[DŽ66m>]m{ Yl]h{ڄ6&U I%mZ[Ж mmmuo?h{z(V76ڄ6m٦}xB[Xh;{B[L m[Z[J6m6vޯ&]2;%=!ڦ/ mK kG zh[>zhiVnGLbZ[yߧ"ڶ)B[аߩlZt_<ӆ$MhChChVAh+ mC[74&yw_6}W,ڂ[& m5i0-ɝrO&B۔ m26 Mhڦ0-2R}ܑ mBmu"[[8w0Oh hmUkڄ#[V=4l=m# BBBۢ&,Zۮ4-mhr0-}pж4K ma^mBۢ6U mDh6kNkCۮ[hآr%:n4gh[Ѥ6m]Ïń6Mhr3~)Ihr/ߗlږc>ڶ6 mMh"􄶴m KߗY*Ch;G6m}ԪU3Mh;>MBy!ȿ/F%ڄ6 6thpN!|ߢ1=]iB[ڄ6MhGN m3-:= m.57=*&B|O3IBۮ;BhЖDT(ŷ6 m{Mh"6m{h[V.w-fmsTv m9Cۊӣж.ڲO6節 m[vjh/HQ mZ-uI Mh; }{X*ZI+<7c" mB&*#t}6۽K mC[tVJvLdڦ6ڄ66o U-0-~Mжc7Yں,mRBߍ)% mϐuC`5+[ɖЦd6.n`[塭cTn%Ӷ򄶰&!! m{ֶk%HnmsIߕmԩ% mKOӦ\h뾔fm\ܖ{! mK[[ڄ66nmE /W m+#~ѽ*mEhh ׽cnNhݘ6}_B6+}hmB&i B[بv^{B[dkڄ- [Zưk%Vhp$/ mgDhN Rggč;ڶ$ж ^ge[ƕmzkȿ F趄]Mh@hC۷MhK-V0mDrO'%9 m{e|~CۯK mB&ٶ mK[[ж mmmBv^hv V҄t1U+)Mh mo.u]yF&im%Zvvkڞjm mZ[ж mmmK]0]m?|&mlmBwcf|f)Im>>"ق[Ц5 m Ж|>},!! m'/o\ޏ7n m<36MylBۣa mߍ) mSЖ-}NMkJ[CgvXk;#-jmBB-Ih\ڄmGڄC:5)ߍY=BۺS&_UnnmB mޖжV6 MhK.BۛamBXcˉWhےu|d/󇶯Hh+X1Iھ-#B-m\ж_5|!m m3᧷6MhMhڄmk;;ke7=kئ\&UR>mB[?[. m..َlmBP4E-?>MomBBBۮ-=3BW:&GsCCۣ#{B۬=*FΖBK m[l[tHnHh ms[ІІ&msk& mBvG>脶BۧKh[D*ͭMhu#6$v^hڄ66]Mh666b7-ặ67(ن]%;C[Rhڄ6`k۸myzkڄ[ۑmVkڄ6[YiQ_>mئ\&UQBھT  ^hڄ6[wk?lCZt+Bۮvjh:^ mmmSZ[ɶ#Dh8B miO1C!6lMh;,w"ق[ul [Ca mB& m mB%[>wж%\ڄ;&}ؗ?U mMhum m[m mmmZvCh{ڂCۇmBж mB[KQmNiMh26m"%!ж[ІІ&U m腶{ϝ- maO1G'eGI6Z})ڞ3ʵ-m&ٺ[C1?mok;>6 mWkҶSC:6MhڄeGI6fDkڄ666`[̯_*mm7&!! mBUk*>/ڒҡ msˎ(Mhl&ٺ[C0mck$6 mWk2/џ~ Fh;>Yi m! m%Z[<VklO[k[ЖRڄ666Mhڎ>BB۔];msmBf6Vhږ6MhMhKڄ6mckڄ66m{ڄ6}7R'Bf;m\_5%vBrWhChChں~/\u_hBf-[[EomnQ Xh+ڄ!ق[fn Bvyk-=jmBBBۮMhڄ6B[Xh~Jb m[>wOh{ڄ6a/UzRvahkomBBB& mP md`OBۺ&l⹭/UԤvdk356 MhB۟Mh;;XU m-ᢷ67yAMhڄ6ڬ۪1c'km׆&!! mBvM;C[j%hmBCklͲ/f|v6MhMhڄ6MhRC-aJ6Mh5sڄvsh mmmB&C66& mB&n,lB]޷6 MhbBۇ& mFZ[Ĥvm'ж)~omMhlB[#}h{z2mmmC[ߪ.#C6MhlB[gk+tfڄ6MhlBЖ mmmB&C4Mh;)=+=6Mhڄ6MhlB&І&2B&U,>Bfڄ6Mh mZcl6& m ! m& mB&ل6Mhڄ6fل6Mhڄ6Mhsk+\!6& m:R m6Mhڄ6ڄ6]Fhڄ6MhlBpڄ6Mhل6MhKUل66 Co0ڄ6 -IqV՝&lBfڄMhChChڄq~ mBg1f P'ж)uJ?)gflzچ߿%ІІ&2B& mC6vp bNBf N< m7mw Mhe6MhڄsIe;{Ok. mBf_ٴHepIms'Hh; mB[- m fl%"UڄuжІІ6 min~ m7-}Jh.١mŃn׾?JhKMoXyB97MhTل6Hev0/ m m +v|h~~lB۩mM( m>𕿲%:MhK/Nl1%"m V#?5 mym*ІІ&%mY2wh'-zvU ;OfzeFXGlMhS#ڮBB=nbΖ5 MhڄSCۊ m#7$ mB=*ύ6' m*ۖPPh OkжbZhChChڄ!i~lЄw{KKVph//mC:8PK+ xlmswV m*CЖpڒcBۢUh mKeY̹* fEڄҡmG^Wh|+seۻ1}ᄍ<Gl{hkO6[`e[P*&a-s[ 2XhChChڄm3p-Ce;s>𵺲 mB[o m# LhlBP.%ax_xMBBж%[2JhڄDhN lw0A݇:ϫYҡ:6Me~JerPhsږB mmmB[0!u~lд+&Xh$e"K?qJ mΐsfohisC[}*+Ц2m>a'CUh mKeڄ6Mh m+*v|eK& mB~XV[{ϙiTҡ-#3GܪT6B mm{ж}xp;gh[ _LhmG힦OmրcnʖsOrOھIڒϫB?k&W6cʐ]k–T3ŬB mmm7 ,=B&%m& mTYw0A'Znqze$=O6[`e[\U*-~a|e|\hڄ,E`.lW>6-Uh[}C[ mGhjjSІІ&]0Mhڄmː mu;Ԗ& mU- m#ڄ*u;&LVNߑcr5m-% mJ kC[{[Qل6mce;&;/拆6T] XJV/Mh'Ev^h+:yE|ڶ*666-[h[.J5L- myk[h;,-_ gu m13gWhos/ڄ+uk&LVҮؗcRhyj/\U6 mbh[\<ŇWmK6xM Bڸ0+QلC[y%- mŽ5w_h;)՝& aw*Oh+ںۿ\]C: P+[zӕOm) ^hlo0IC[J+ mOABBж:E.V/>.WG||@h~_]/ԫ}t[VжX4/Mh;>}Vz۝3RhK{I*666MhaKOV( mKK6}&myֽo m;&]Ж^u mbY}BWm+9 f;>lICSІІж m[Bۺ+]/tBۅ/6Mh+tbvphN m..VلB[S%ЖӞnlO66 m=noh۸ι%^|& |CCۊ6My{uyh5}tP]|fm%ж mCBWJ*=fP-ɩRhChChR憶!lKhۻ_vB+& m^o\'PI*ۢJ[ ~Qh[}cB[ꆶ&=qB[3OЖT)!! mS/nmKOV.VpMhڶ+ж=Ŝd+[׿"C# m% hh; mB[3OЖT)!!ml7uKB`eچNB[6r%Bۊ+~¬De[t޽7Wݷ( mBIMh+Θ<;U7㦼f;2%jIBBvkh {HږB['ńem_ mB[6}3<6-&jsm]Yzq6N~ڎ%BmO;B[SІІЖ6_PhVwhh=!  mx m-tlB! m;T&cVb^ܢV:yS!e}Vh;fvXhKגmMhChCh ms mKB[4}Vͥ6Mhڪwlm}w, mCT6Mh;_B[Жs*#ńBs 'ChK{옓BBBϿ">R$mOV7pm؄Zzbfx=UW+B%=f-mhK*[vܵ'8lmOBBB[肻B[>3~r uoO|1_(ͺ жkxB[Жe]ھmG[ mۜЖykEC۬lg-Ih@hڦ9Bжet; -:Be m;T6e3; m+ʼ!=|cek1KV1%}-yh;lT m{#U9 mІІvnh|Vжw mBܷWWCZOUP+ж7;lB[_ڄ- mCy'xfVTӞnlBBB[Gh۾sXh[˜ڪo󷅶 mIv@\w0ɻ6eSh[76Mh;u0a#-#C[Vmm\{\}>j ow]hky+:v-Vжn}z:C%l;q>;WB[@h[}.~k7u&v smsU Mh~$ӷW CZ>OUP+Kh[B[, mYqG9fiÃ쩕: mGN-;xshK>8ćJGhCh\B[E_h[ˌ\tm}% ma9 m+icmٕmdS;RUWx-mv_hyYN<%BshZ>: 7md6=%YIZ`cheFie{ m]GxWh[w7>ք䏗![Eoe+[zw,elv-Y4>#vx==Z'7U>}wsseȿB[9pI&8;8BB"/ן'q/mꏠ ms&a: mic&b.~k7ɳkMh; Ӟnl/ mys mt_]^B[ж}Mڒ i*xJ`wB[xl②mVY}b.~k7'_2ms35[9p&,<8BB<?_?ڎךVTh>of$k?K]:v0㥡mʧv@h6o ~h^x=Yɳq7Mh;ڪ s5Ʋ-% m*Kh:'5-eY2.[]^B۾6$:sE{ mtݳgWurͻ+C66K@h+|p66%E>_< m͟CIڶ/oF~Sh?8+B[e+x]h4՚WoQhsse{ mcO7#5'hl[VGhCh\B[=mT&~MЖg?g[tJ:=жq^MBۓ9Z_hu/l-fw77W{mlBa4& mmdVh˶!u*NΟCaȺ&%=8B}3;^V| mՊ[|_3Yh ]\^Bk 40y}͖pybYsRhCh -Bhu%uЖaѸ\hWh~p憶VGW&W+n1&={|e{-Ѩ'̄vɰƶhB1gu턃#!q)-bN?_\V_vBۢC[C[e+[f~w,%l[|:\h/?.l/m.<vVh0>, m s5&3mE{hһ1m\-ڦjmIr۫Жz!/*SgW׎ʳh׫C[y m؞y;\^˾ 3.<%B[yͶb|VY98BBm9sZB[63#o% mg$bB۷PL m mպ[ڄ\^Bahg$lc[4Xn#!q.-b{h?%u3B۔+ɣXhK29B㷴3[}Vn^Emuvڼ g/le9zt{&O΁O)Lh{zvnl0]) NWЖg8^a-{̲ѕ+2ώXپ:KoQhr.xr@mꏗg0UZ:{- m.tse{-[?z<mWMT?x͖dp><8BB ms CڄSB[ C[e+kWY)ͫշ>Tږܧc7!~NhyyUɓj v`Vh;7-x2ږwFB[!-Y ml<ʳh#EΫշ( m繹=a&ж66ڎ=8BBj g[*KhKv67%yd;fkC[ Ahmfv:B[e+kG3c]h]9/~+Kh{y#ww\hWFRhpAAh 7ڂEau6]~~a7w6->mLB@!BB[*ۺ̔gŧFKhCh'6ڂl2Sž`: -& m"!E^;>+mmal+2Sž%p -FKe!mL !hlLJ-G mzI6+١mg` mGMh(DhCh[ieRRmmmi*6E:*۩mg:BB }mbfӳJ#!M]ل6 B6鄶C @BB\#mVfӳ6&!M4X m{? mmW6Mh m$-I+uІ6Ŕ& m"!Uَ mۿ<mm =+ï@ m& m"![m<bmmݦW̔g mChCh&8 NT!!YQل6 B6*Hf޳JڞZWꆶ$HBBSBc @BB#K+[wf۳JDڭlB@!BB[V1L&!5J, k mm-b*[Ж3}OhChVXeR}y&ދlicІ|XBhCh{#=L{BBW+[ЖW` S[*&PІmW+uІ]Mh(DhCh`ceڲ}y&l$!}P"mY 6~ mBmmllC[/6dliK B[ @BB+Meڄ6 T߳rJl'qyhKU 66-qZ C[mfcpBڸ6%lB@!Bw-UhKІV%18 S m\V<-g B[ʖ$eLChЖLu66-!rZ {B[& m"qIh+QپLoHhTBBЖ(9-P Jeڒy&d#q|h+T"W @BgZmchK>HHhChy&$$qph+W"?h@9-PƩber82lB@!BB[pC%~r8/խlB@!Bҕ-8LHKhV< mOhChڄ6 qLh;,3 mІ& mAhChڄ6 7ڄ6 :m^T؎=VNT!qXh{oma;`ІvmhyBh"rZ #C۫lk ۋi*6N m-l(eڄ6 :m^[[.=PNT!qvh{UkmaO{Bh*(9-PІЖJߐ6nm:-li2Um\^EZ[%eڸ'*=DNT!! m2Um\^[["eڸ-ra=DNT!! m2Ǒ]i;}"$@ m@+ )G3`+#gV'0x#ވx~ _[EF2$$s@6mͲ$I$I$i@mͲ$I$I$i@mӎͲ$I$I$i@@DpͲ$I$I$i@v|mӎͲ$I$I$i@6dmnӎͲ$I$I$i@@w&k6ifY$I$I4KMeeI$I$I,6@[Y$I$I$hh5 5մc,I$I$I%&vh>86˒$I$IYmmc,I$I$I%&v}>Ͳ$I$I$i@@sm,K$I$If eI$I$I,6凶3vdl%I$I$IچͲ$I$I$i@@A,K$I$If ڮaڑY$I$I$hh;ueI$I$I,6b,I$I$I%&VRZhb,I$I$I%&Vh6,6˒$I$IYmm>b,I$I$I%&V^Nhb,I$I$I%&v*=&6˒$I$IYmmmb,I$I$I%&vV1WifY$I$I4KM"7&6˒$I$IYmmuY$I$I$hh+cb,I$I$I%&VheI$I$I,6+Sv@l%I$I$I.Ͳ$I$I$i@@@[Y$I$I$hh^h+b,I$I$I%&$j4l%I$I$IښZ Ͳ$I$I$i@@[@[ᜤ eI$I$I,6a,I$I$I%&6vq4l%I$I$IږJf#h,K$I$If 5] eI$I$I,6@[P,K$I$If 5>@ڡY$I$I$hh Ͳ$I$I$i@@[\b(l%I$I$Iڴ_{ã9x~1zmR n \ uvq[wjCg['٩lIJhVWڎpNAwp& 9Ni{gdUl$-+|ۺ+'m$:;u6tm:ImZ ڎ?sR_upl`Jgǿ5lQm)=﹡&+h[Wl$:;ulIhJ·7zyۍ>~|yc6)q g7tG%\ u%m]:ɆN d[gN@vu?vmsUld mR㔶/ T)%ɶ|;yi:ɆN d[gN@ i}9J+ Ad;3dCLwސlr)mdCgΆNS')IMAǝVW|*hlgo?8wIKu4ߩlIuv$% u>N6lɜ*m]s2;uu ::ɶN6- moA[Thlg:oq̷[KuSSg['٩lIJh}s,}bwV򑕒?]m߃fY:{mCtNydHuɴکlIuv$e iUh;xߌxjmW6idN9ɶ.N]ж9ɆN d[gζN1Ц'qLv @ŷ+6ndN㔁:ImڞiSg['٩lIhnXw>+]mxw6i>mݩixdC'im]Ffku ::ɶN6 m~Y7{hkxrSPM~sCW{/ ?xjHu6tͷu;uu ::ɶNT6my ݿ?J3~;ǹj>A_v%.ɆclyjaCdxj ~ܪ\j[we.t$-+uةksxЬF>lCm]R79]@45|j#qh-ڞ?T7͎nc ?qJĆ㖧 I9&ߺϵ\L߇gn~њlw̹$7KJ4d͘r[huUmu-:h6wq?tCF\p@aRhs`;|5mxM+MGd w,)7mCfmoq^6fem$IM˜ 6 i7?筦-aM܂r]x{zk&tg|_˟y||ϳXO_2!kݒ Qwt\h{??SѾ=4^nNֳC|t?;;=?*%I6tS 7m2+{Sɶן GM[w/rr&IC[ڞo @h Q6|ʏ@[~hnm$Im&fhʯlEߌS6&Im8lp@hFlBۃ*IL*h[L@[m8h$Жpk8h5&~ [n-l-?6$)y(6IhkfqLlc~m=h;PC#6 mq Z[hAk$iQ6($TvjĆ(Wjw@[iښ+[rh&ɽ>M$fl eV6$ %5m@em-o$hX$Im\$ICۭ k@hm?:: mm$IZ$hlʹ6&Ih{f䢶{ml2 m@hs9[hk5IIE@fQ6mچ:k>Zgh}S[5} %m}#A[ ]!$Im&F\r6&I$-9=*hmA۩#lqhcm$6el m$ 6mm[h@h6ж0YAI:چiM#)[ghs`%I-?屶 @ۻyl 儶ղ}#A[Zhcm$I|$\FL.gm$@[h+ 6꾑myhkemn#)Ih3Q6eS6$ mA@[fhkhmm[h{P6ж 6&Ih36F Ihmmh{8ڞ 66z7 @b$IQ6fr6|lM@ی6@hmpՍ 6&ID@Q6J@$Wv{iZv|ж }A=5W66 X$IЕFm9$@hЧ,愶@k$IQ6Ӓ6&I I흲y~mBk$)?hlD@$ 6kښC[l p0Ak$ic,@iF6&Imh`m mo$h^Z[|{q$6e3m~9F6Im 6ЖF[ e[n!Ak$ (el.gm$@hm}#׀m I4]N6fW@h$@1sr͡Ah{w ږM_ݳ<6I.)FL\($-gh{Ic" F}M[FCۃkX$IDLlM@hm |0g1h %{$k$ @6&I 儶 -辑m[hcm$Q6e3%y 6Im {mm=hK{HX$IDL.gs9[6Im 6چCF6#]ILD\$ t&5Ymm%h+gh km$Im־i旳rHIm e#Жڲ76&Ie3Q6@h$@hmmhk~$|lA,R$@i=emM@hm 6@[ 6I@4lM@6q mgmUhkhmFa m٠-txA[fksII@el.gm/w$ l6P.B +vr6B[+e+ hmM$fm&澑^M@hm G A[fhcm$6elnr6&Imm[hM mm_9A@hcm$6e3l(Ihm ]Ч,~rU}#Ahcm$6h3Q66Ih[@hmu6X$IDLn @$6ڒ@ jvmUpk$6el.gsH&Im m#<V6&Ihmʹ\@$6Жk@YemAۨ5Ch gmZFznWPLQ6$I-` @hmA,6X$IʹQ6_澑SC7AIm rPAhP/hKm[x6$ (hs96c%I 8h{d e+/޴mAo~ӷ66I@elݔ 6Im 6ڂm}#A[[h&vvM񈌵I@e3-|H6Im6@[F~5tID(hl .Im @ۯAvd mf6TLQ6K@$6B[6 gAf_Ӷ! ncm$fmM#]$I 0 5mIL.g3 EC$@Xh{9h9m@_m u6&Ir(el $Im:hbm-="hmB[/h ks*Im&74i@$ 6m@[7h{XAhk>6&Im&\r6&Im@۽M m2C[Ckm-}#-mghcm$Q6r%7 Ihm-N86> hm+]6_&IZM`6榑m:h$ж-Mw^" @h m9mAk$ \fr9F6Ih0~M۶Vx9hkhmSCKkmg7299@ks*Im&fl.gKmM@hm!>kmUhsHrZ[l(Ic6榑 I@hm _C[F6X$iw=E@7I@hm@n󾑠 6ǰ$fl&r6&ImKZhm@Gnm.gmc򻲁6ЖX$ 4]Q6MlM@hKma hEmRhxHX$Ios$6_r6&Im 6ڎ_M0}-JǑ,F\66#&I jj mW9 e @k$9YQ6ڌ$}h{If ez5𾑠-'oꠍ$ \frH6Ih9 627B9)[[hsQk$m{\(es9hm$@hm-ڞhB6$I9xhl}#A$ 6 =- ڒ@[jmM$ \frHE+h$ 6ж$ oDXk$6e3lMږ6Жf|wHvڮXhkmM4mmh3z@[ڻGnm/XJn1h@b6$IS!-46Ihmm h{7ڠ A\m9$6L.gsH&I 6@v徑A@hJ@el&r6&I 5ٳm2C[Ckmr6X$Iqo[`67mm)h$жxQh{8; @2p56ж${ml޶IhmKhmC[F@k$6ellM@hZ@[=?`=C[l kkrI;$F@CmP@hmɡX2C[چ@F6f7Ify[66Ih[ںYhm嗳%~B[F $a{v6&IŶ(el I@hmסuh;=ڲAˣo@k$6F(F6Ihm 5hkmfo@h26Ih3 mk+ٚ(h$@hmɡm76lM4˻ll I@@hmK 6 $[rHF7r[h3b@[ہqʡ6Gm@[}#AhmML.g3i٦6(I @hmku4r߶!+hMhcm$fl& I@h{}\@h.72 @[IWI(esHes9h$@>@hmUmmFhhmX$ \frH$Im7km - mm\@hcm$fl&o$ m 76fo1^BkmM(h3Q66Im : @h0ڮXhcm$fr9M#Af$% 66;vPhoVgc$IQ67I@J@hm> @h[$I6es9h$@۶v @[Ph{9Aۛhk$6Ln @$ -35 =TS7r+hknm٠~]4< $F((>w$ 6N86ж ;mEmMLnilm-OYT?`mGy'p aJp3픵SY=8x$lQh;XgJV{k{X\vnxgݏI9N}\wvlLũ+ݳ|4wUc;ⴵ$6vf>;}! _VW_ZA۱ŽH˦@ԱvSQVRsgkGz)9bzR@۶+״B[{Eimx?Zx Yhx>mKчzylgWcMHm#qpvmmCh;Vv8WM^~ڞo~wYjtȈeqa+$v}"}=q-3]|pЖz1hm3BO\Do.d綇cc'\@h8,t<mrh{ud*h{KWMmvPhK.B[jYUwMfڎݹjh+?{O%[w}7yY>SpCVV6a>_*oamkW^o%޼J.m;Ύ6h$Jh Si=Ur"h{矹mqe5&k-y d86ۼ}Gp_G (Gh״5w\@wgRo]o始?~YO_?T>3= ܞN[k@[h⾈%}WSU[)h+ԺtN!H)ٗhڒCswkZ vqf_y|G݈<|ܮS@[ܿ:w}tSWڃ v.F:$:2>>x鞕mw_>9Ymǐm]mǦv^6nJ_ٿ___v4g\UQ%vҏ׾w/88o~x9:>{̓JA[9;dq]|CeV\v&SxZnyOW6<{pi"A[Am=k{ CMtHϗ=G{AYFJ@[1onmB[%]ᆪ~dmqC[@[+w{ߴPr+=@[ekrۻC1*Kh{`w#HucS'Kλ_Zvm|xu+޽ UtgB~^:zB &|+ [euK*R4eVdc x޹!6ImAۯȋ@1%u6סemh{ySVxCn<{wg+1:h{w{;JUm7n{x Ӭ>q<V mC4יir҃/\fy;C۩x>59CہCbl .R r%BMmUghCl@[wMmg=GϿ|&cw-m wW mVm;+Cۻ ZA[ɥj>ޙce+{k{l@^~;m4Vw |`hNV/:{mc;\,g̻:}W9uW,+Xr~Aۻvׯ!v{>0v^UWUlF$}֨aga/'NF_;ou+˟?iTy16y*?~:{Z~uj/gaU{ /Cq|زéoӧJO[[׮?_.% `-ж;F;|q>'sYN֭wPٞ%_>Y-+{7mֽZ-C[݂?/x{烑L3qVKkɒVvA>>ໃ_9_8G8>hΑ]ރݺ ` ]p<_y?^0&v0Yb \ھ~kXحr;+| [7o7cxexuh{^PxQ mY=<ʳo~6mu?E^Fp3?Va ~D;/٩~Imgh3viߏ]Gm>gЮlгsA_5YW?0B[lT<#K ,H$M] "Fp%XQׄ+ҩOP=[YbK,+UŦ,5.=z3n;[۶CM^q#f_/g3p2&hڴOH?v%t:H+a=~\:Րm#{-Xڦ Mm mSS 9|t4VGoۡHj~$6ImjތVv6EO-H5]dA[ƭ~7I-H7^BֶR.JcڂzCJ66TdvmUâkж6IMm=mRhy h :ښCh[ym ښu^QA[ܟ[jV2=fx֕2ogN@ݠmkCEmv(R+~ 5}om@:*hkmV~m\O\:ֶ킬4VBYk]p6NjܶmUV7h[@$Ц]nvۉgh+<w65bWE`Gϊdž6%  GrۡWCJmvkm@:X۞6QCz~h5Wm -fm;@[EXi@[мthk\X;6FrۡHj%{om@ڢt/]h;>.SG@Y*-3]頭hmmU^eP@[[ZNAbښnPzSkWMmmMh慶+gMAhk<-v>Mm Wԁcbж-mmAqrmbmb,bܶm59|c' IhS3-ڶ旜D,Xh`mD] v~ʶ#nӂ,om-o̯4V_uVnmm_ZhsۡHjɩl66IMmwVڢmhkqOkmh+١']-mk[lyAی$-nm-/Ym59|cߛ@$Цa5Pkm3A-hm ڮ?kgŽd?}qXMX>v}WL4mm xS5-젭.7E7V{ڭG5MjmMhʽ 5{vNlh Qtvhm7%w-䩠z@h[TЖy03A[+m-_.6JmUV %MMhӰB[669[Y VYLr?vvEiG c7am-l6hK;V@ۈ66DVm"՛ZⅡmFkm@~]h*8ku8B?W!qׂmM@X={Wյ;C[[6-'u8- @[[hwfĄ̆̃n;@[ũh;2&IM-6١pIAh[ ^z Aیֶ&Jsh}$gmm.1E75ж6IM 닟ڂm@sh;x hh~hm!am d!m[[+hqZ6--X}m;cPzSȧ}&6& )Km"h?,Yh?bVw8m%@[h[NK6 m hKKCfh$&Bτuښ[ۨq-hk5{ 6-ɡ-@- m~%ڎ-d6ˀbuiv(R+f6& iIhkkm-ڮhm-th@ǕԊzVO\6m7hom-i~hK2P_-m -mS hKK3C@h2C[}ж^O"ļjY>y3>rmíme ]VgBYmY_.%mb^h8;8{9rZhڔhqQrhk@[ ] V9mahkr#V`6@m3Z@h>\m:]6E75$ vj(ͫ ]6@hmm-@}5mgh{m^h;b wºj̷ ж%6& ih6w&9"wڢK]Ah;;@(k[l>:֊@ph8hmR]3EO\9{3#=h$&v)hk: U[nv]X:p m?lMPd!ֶmjmh{fU8l]J2ŶV~1e6& i+h6ж5bm Ж[mAg&A[cBېqmSRv(R}z6Imm^2쪕=~q@&:km "Q偶bv5^ھ.^mHfh+䭠=PsA[U@K2m;C[[[öҥ#PЖ@$Цݠ@h[ή` mnAhlm-]茭4P_1 mϿږΣХPȕ7yퟎ[AhڔEl hv]QVam-: ݤvÖ4l m}Ih iUD6hfm-b7P-3h[ʰ=uio;6{k my ImZ[>cg`z"Q5&/bv5 m @nֶҭmA5  hB[mҨv(v Imm 凶@hmC[#o mm %ж<=(h+ж-}aҐv(R% ImNYhmc Mm_Ƞb^=jm-ݒ|Emp@tӥOC}]$66Ж^ ʵ+NYhK mWm.m/ET"3ZhښWpA/U-z$W04)v(R}z-imMhӶVnmΚ6Um[A[j@vGBm-h@t(9x-imi#9>k}bsh;{@$ЦŠfamgh;I|@[fhl @\жYbڒ@۩88m-Pd2ǭ'-,چ[hڴ3Zhv'RW,8ghkn. mE V6h[@k"b hR$66Fim,u~ gȵ^|ېg?Z]A_jjіV+W@hcmI-lm"ۧG@ے$6?m@[>5a 5/omk1rJ>h9h[ h FYhڔ~ %<%Lx,mdz.hmɡ/m? -(6f lB6@ۼ62h׼f(@[h96IMmshbmuwf>uBn> 5 BJO}{)= h[@kmuC# Ih mreb- 9hsXۼc ښ?-o%rem dpyPm#!Ckm@@h ydNm5? ж%`jgh;ԧڬu3ڒ[h3H>B6IMs@[ 凶ڂ:6x!7hhI/[ nA[܀ *P6$66:@ہu9mm2hmLZ͡ym %6C2mж6IMװ+ťںY3h;3m,|pj6LZ?jڪyD omTam"ۧG8ZmMhhmk@m39}]3Ж|(@,vA25d@[B'f~6C6>$6vwֶ5T0 ~-hK m ׷ -0j@kmjk3>=@$6֖o$ hxdCKN_ mf)@[׀m ^ yP6@$&@hZ]*@%mmv8{Z[hm%[h3UX$ l8n3@Ҽ'im6qk@z6P.`ּf(@h`mMhhhm-s !*6FOBim Lf(] @$66:[ۨ/=@ m_M }'}‶[9XX1mS[m6IM6@@۶bq66;~Sh,6Sli6&IM m6ښUu<"/azG^@۞֖jCrZ,P$S :Xh>N 6&/azA^@hKD $Sli6&IM-6$Lmim ?2UXږ6& 6v`m-l6'</af AhmZ11UXqsm Imm 6$v|djkm }6% k3٠6h`mMhhm 6iUkm&@hmdm 6IM 6$L&S@hm&hӪ@$&@ہ6&3 L&@ L 6Imm 6& mA3Xdma/f26 mm Imm 6&6f2@hmdmmMhhm 6 muHf26֑d26֑@hm 6ڤU-%;L&@h3L 6I 6@ok)hmhm&fS7\LdZ ږ:lMhhm 6 6@hm&hm Imm 6&Q͠ퟎmሩ̏ B(6r>tv$l)h@h;T6Жd7_ɥm~dJF چ<tV٬6?@h@hm I  uS6@['*&ۛڂ ImmӨ!m I !yZK 6ЖYGʶjM 6Imm 6&Hy@GܒQm!O@W*۶]75$ 6@hhmb~-l$A[рŔ *m.ڲgo(h@hK m& xd#.ھ^Ld@hm9/'h kReK@$6 mcf>3^  62eq̀:m)h3U(n]7?&M@$&@[VhZp,h>@OIm"xقdMl[=wihm@@[gChmmgx I5mh'=lg?hm m.h[^@$&ЖڪtyB۵tu~N.xhm C[-h'bq2ڦ&*[1{QMoj?& @$&A@hlJ@h? zYU> hm m.hA@$&&.x̡Skl^>/ lmA/^V7oDŠO*YLzʶsT_@$&A@[yV)hm/C@ۻGFfAڲA[@h˦lTlk?wORM$6MmI凶vmm6@2ڲUZms QbWUJBg 6Im mIv@۞69msesUڪg M-]8{ס'eVr*h3U(۪J@>$6 h :? h mAR1 _ ?Lnp{ZsibWi mS muWۅh[[ٺn\[ٖ|8U=KCNU6& U+hm!Z:T hkY mWBгfWŮm ů:hFv";lm m!5my Imm-D@h裏頭U m/JlQ?V| h[L٢d6T&ڂ,6ImZښ6pFnڂAnMk';@[mNh[dU`hm Q dSv'Aۨ3MhhmS@[jY@}S>8hm[)bWim}6-&_M5eϩ hLJmڴ"5 =?:. m"j[mf6ʖ,NZd6h hkaO*r(Vv)[h;[B3Mhhm-@h ɹ-}άVzrlʶUZmmhsW-@>'&k_M5@$&m?mh+]K*[AЂ灶w?vھ[Kpھ6׃mhlQ࿽:PI:m)hl'Wz"^;ٔ -lMhSrh;Ermuؕm- VܵhlE- y m ,mmWE-KKB[kg hv 6IM m&guRhxD 6mzr*[ɶ89msnC[yEOBkKK'6W7{;`K*h9@hm@[2hmZs=®ʖa-mxA['37U.êTq2mOe }S9K}NUI$6 mA?B[lXK*[#ڮgVեe:Mٚi6&IMc-nYS65 <"8mA\||C[m=YmsmXe@\G*h[ ڞ؟w(mahK$66?%恶] &ж]yJP懶UU6Mm\lж9I2Cۤ`ՙUuihdSV}@~&IM})hmS{B[8!m@hKl<>8hk d-lmh8?P\f A[&& m mqAhkg;?]|@[7muUh@[m]t+A>$gTTJۙUuijhdS6$ ijh )S-)B@h >-9E?mve'muNdA[NE ڦP6жŝ؟k(,Mmޛ@$&@Vmmrh{^@[Mk'ySeăCn$A[(MwR v@[ghޕm _xֽaζ׃~*h›)[Ͽ8Ims%(r[e$۞yXU&hk{y ΚC[&& i}h9u.7]SA[( GV1O6ve|ZM3"dRh` Ph$hmám 0m,ЖaȦlM:u@$&v8oJ m^#-B B[6R62l mX6e-KS@[u-mߛ@$ЦšV+=" >2vq%|a+iz>hڲ7XkC06?'9[5hk(,~ΡȳdS} 6Imm-B!l7hm hmO)m3Bs-&=V@,6~¡H5-{h@h GV7B[u+Kh;;Wq>~hM-ngY$hж]Qm1em9-ɉC|Ȧl M$6N{/-b6Š](huJaIh~` [43g%+@ےж$9簶.偶hmMhhn?@[l(zS}0665+Ж&8ob6$㠭-mU0ram]JmSٔɞ&6{h@hm'z:C[u`8S@[ghsNrhkBEq 5QvVIpX^2@,hmogIhSh;Er EC[4G_SA['%|]^fh'imk-i _6$Ahm phhȦlJ,ڦzom@@[&L@[ϙm m WMn"fW > 6$B[ļSQ(HIǁe'\hku @$ЦMϤxB[E_0 @,694tA[Ohsm h[mABt@6ek<$66ڦ/ky @[(=mm,%yʂO8C9慶ُ"Ur%qa]m3 6IM:VLC[癙چ Q6V6ɩmsڠ-f?'afT Rmy0ra]mٔ -lMhhm-ԃZmjucpж:Mٚi:hzt_hSZA[+r'n6 ڢ_q7hm l@[mI?G*jz-lߠ-fж:ښfR}6IMCmZ1ž<-l758SC庑omy^29-HOV/N:>ߚ䴭+ u6`FCJ@6emM@omC m35^k}Jr%z< imQdùj5B[g?ze8Гn@.9Ɋ@[Iݡm#h|ܦPh[lm&om@2C[ܮlhWh y]łAȃQV ,Nmk?3g%k m-ke;PmցldO31zt_hSl}|gS[7A#'hkU,Ehs5e5\1p$v[ށdu_>03z ڎmK;@[ m76IMÚ.hkXNh򼶼B[sw~gQG *ڮ//hk}om-sNr̀ړ~BGД-0ж:Mپׅ3$ k6jНch|sah~D:9 .UhKrJmh[umEm3bNO*7hk:n ash[xm3X h[ Imh0-d-:*hm6I$I$ilMh;[MmA3$I$I6Il-oIzʘH$I$Im@۩ @$I$I4<& Wl|hkh$I$I$փmm$I$I@$V)em-:&I$I$ Im%U݋UE$I$Ih>VlS@[/}mmm$I$IR@$1p6 I$I$Im@quVh7&I$I$eImU+hm6I$I$)CMh{em I$I$Im@ۻ@[m&##I$I$uIm/l $I$I$6Iʖhkh$I$I$([+Q [m@$I$I$& =@[@$I$I$& JٚRU_38$I$IR@$ve!rZ$I$I<6I@[PM$I$Ih~mqkV6I$I$)OMhP6J@[@$I$I'& E(>$I$I<6I-!-6u_I$I$sMl E$I$IT6I;C[儶ښ$I$IT6IB[]fI$I$Im@hm$I$IT6I{B[%ڮ)C$I$I$uI:([(-6{M$I$IhQ6ښ$I$Il6I-m$I$IR@eڮ$I$Il6I@[OemyM$I$Ih uV Q [mW $I$I$uImC[mm$I$IR@- m﨩o&I$I$ IZچ(YQ [m@$I$I0&imhl I$I$I m@QSe$I$I6I C@e;%J -h$I$Ir$ mc 6I$I$)gMҒ6\ْ@[GM$I$I6Im,-жFM$I$IheP6$I$I6IA[e+QS?}g$I$I΁6ImUhkmTM$I$IJhQ6Z$I$I6I@[*e+un6I$I$)mMЖMنC[mm$I$IR@$ڎ5uh$I$I$-m (E-жF_g2\$I$IR@١-6$&I$I$eI*Xhk﨩@$I$I9& ږ I$I$Im慶@[@$I$I9&iRhKl:$I$I:$m@h[&&I$I$%Im I$I$Im)(u[5h$I$I$m((hkmxM$I$IJh4Ml ]I$I$Im@[7Q:=u>&I$I$uIR!6~zI$I$Im 6I$I$)Mh#Jh[)&I$I$Im3*hmm$I$IR@6y﨩羪2n$I$IR@6 ߠm@$I$I4EMhm-[M$I$I"&)-MlC?&I$I$MhV%$I$I)mBb@@$I$I4EMhm-U_:I$I$sMhm-UM$I$I%&)!}6жwM$I$I"&)'}S,hh$I$IImDm+$I$I)mBsAAZ6I$I$i@=\oжVM$I$I"& %N$I$I6Iɡ{Zk w@$I$I?&)?}im=aQ[h$I$I$MmZ[Eh$I$I6Imhb$I$I6I@ls&"%6Iw<{kaSND-RD6EH$MRDJJ;;y`2̋^^/u:={cOh& mTWI+ ڀB6Ok9ǿ mmmR 8 .m_}}&}B'3msʫϤOh6`жom=M*6Lh6Mh KhȄ6`жnm='M*6Lhm[sۤOhȄ6`жEmm={N*;6Lh!dWyk{ m@жlm={N*6Khr-^k9yR!@XB m-[{޳6Kh҄-Xk9GyR!@XB)mZ[ϩ>Γ ڀdm zNm[6Ih6%rBB$B#? & HڶVI bڀmzNgT> & ڄ6-8 bڀġmzNg1Tvmm۸s"|Ԥ m@ж jm='-L{2B$BaBEB$+mDk9G>pRyKh6`жuom=-I{2B$넶ok9y%@(BfhڷV}'6Eh m[sym-LXT  X9m-[[ϩ>+ BڀC֬my  ڶ6$UmI- m[)sIqm#Zh;5IGn^$@B m/u#@B =ڄ6ChGB>v͞: V6B[7B!B+-ΤJh 6@h{+Hhmyd?LETBۼ4*noΎ ^ъuԕm}b /u/uտbRGBBh+;yg*uLXж5)%6)GS us5Rwj[Kul||;`[KM m@vߝwwv?_<;-q ]mlĎ*`[Koku/u6t`[K]m/u&aC}'GvW5 m_+ mkTU܂mĎ)`[K]oku/u6t`[WK]m/u&Cۑx=f m[Rr'9NirNʿqu7tOЁm]/uuuњ meyrv]vqlOu:gu&'e:HiO2;omݸ/uţ|ۺ_*n| X*<| ^o/g)J_:U_+/ I mSZo>y#vqCg ۺQ܈Ёm]/uguс$me'dގI:>哆ٵr mKU]܈]YCnԗSd[RgCuݾl| ڎPuߟѶ1_^hۄi mRmo7b-㗺Ojζl|lNm1ʶuс mG'+mm;h;{SO浵]4aB[SB[ۺCնu6t(:Άl~6@hNVhKhsm[ 09+qNΗ: ȗ*:_@hS*xqUv+ mꃔۺ S.Η:d_||6@h8i~wtlBۺS/uR7j{RRmTQ m;o1'sGf${R}CWq[wʆuCԝց /u6t`[WK]m/u4%+ƒ#ݟ?|*JGחGhÄv6)u7bH>}O[r QyvpTGMJ̅|eC8͆Vؤ:SA.B C}]V>-⛲l6hm6iVl c kQ_Ah F?ڀ'f-e6+.u `)5;~ݛb0>pl:|n=|Z>'2ݰ?p?owۜ?W/G#?ç߶>3D>qHWB]RM0HVk۴6Vkˑڎ綂)%hmrf%F D.#^bj:P7 ιͥmZKR6Mk6K|eūT.fc.NB&m.m液V=}zv}m%-ҡz.b-*t}uHϝ$wti[Gyd6K4edh"]&Mn;Bm1Fm$66 GU^u$u' x-Urs'I-m$gimr;I\LWF}%1W mzP*c6#>Mk6ͥmH*Vj^[,$6Mkȶέ#\N.mEPZV j^[,ŝ$$Ҷ tIfpi:IҥmZK26Mk3xpAk$.ms'Ɋ l6CZr6lCm_Nr@;Ý$6MkPH6&6m;IʆBk fpi?6ͥmr[V#ڵ6l6 ֶڥm$Ye+mfp'IK6-knsi[MHAn3 ;mZ6Mk3xpm<\ڶԝ$]v}Pdm60w\&>xdGI6Mk[6wqpέͥmr;I 6-ensi[m6N嶁l fpiO\ڦKn^mn\@S6ͥm.my#[l rzk۴E.ms'Ƀl6\)}r&-Zn6<6sim/mڴ6;I\YrN.m6 \@1wIrmf6K¥mZK۴6 6ͥm.m 8Mk۴MksI;I\@wۂ6-m٦6KرszН$6wLmEr;IjmN*KۖjmusGlmrmr)66m֢$6 `Y;6wLp'.m6l3mr[&,+$6wtiN*'{d[mn3 2.m_ڶ$=# ܦ ZIHk\ڦ6l6K60K䶱ͥm)[Gimr6!Irmf<ͥmDN.ms'ȹԇ#&}QKʏإt3iRKufmnHݛ B_47]u[}bǩim>>NNUKt~ml|oِvǧcS{xj=S/wwA?MKy>~xJ:WZ1'Z[qn ~VdOqʉZ) `shjFڿ~U.tm_\?RÃIqg gux F~Gmv^=·}\_ӈ{=G_V4?N[lMAxOe{no/m{ɧ^_^ӟimrcD{ j;*=Olo{;\vc=}V~w.g{Y1=߷?)6O^K5=Fm8{ j?Tde$n|SD[u\utY߫vf|p5_gv5IG&W_4ȯcU6jUQ>8ݙF=;?28Zstvqvڂ^;oJlMzM#_H\'_ UTr$NC۩Kζx?O|F݀\^zk{j=}!<^C=5mv0սֺ<X?*8q1Vp鏌=p3/KgOu],;d=\[]mڊ?t۽ O+D5~;I>kh{HgġʥmABەv$۞2Kh;N6< m}lmہtm?5a#~~zS;R&䧛F mzniB[,t1jgRY iSÊ;9dڊLӗ>I_-y}j~*3Av6@uX!ω]2ח{z^ECh{siSMyӝ!_ Nh5s=ִx'{J{mjjO)A\G>wTOpR]l"龱%gA9ꡭ/ܿCf:aI#|#oЌ_߮+6~|@ɱ{y{땭ŭŗH[N#toɂNEtꯢ]ZٞBӃێOSzҶ:>I]V HVڞBڞצ-{'+8퇶?>ܶ"_v0M~K3_B'Ζ{ڎ\Y9_cXufg^m?VoYSK8?C|o /{?w3U6n_l-wOӃ?5B}JiK Escw{Kێ\f[Ufk{ԶOO({Nj^۹Emv" $Sמ3%wޔ\\xmǂTvxk{m\>r*lr]v\LtL/mWw׉+U>ӅY*eKzm&R&Ez>SO?_oj3.F|dSȕvXԶOmC&Kl1m[^/v+mqBKNgmhTٞwxn{{5ck+mmY{oKoTL#s'ekh;~i[jBK X=("Ksש[:c @J)5WS+/Pfh~.gJxbʄŬ-u7;{|_ Q|ewV~nijoC| mn{{?0kb;~'O~n{g#m' mWroo#zo0Im?ag m_/m*qOx mO_]m,պm8%rh;rx0Oh0,Ўaж4xvF&Ul}a+ m?V;rQglW%vѼ,:F+"N} m??m?=涷?Vl_/m"v/m;rʥmCX;O~1==mW]Sk{Νm$ 閒B;Itmo&U|jDt01o?5_gEO)<8 MW>a_K|{=2;_߻ol|;esv>z#ο?8FQ튛sT}W^x`TY ȫw*rz>;m?=}z2\{pɏyv~o>?~Spp_|~ _=}y:mg7\/f݊qvo{p^n7[hgu xZ6 a) Bn暈^Sç,?33IeWˑt)m9axda~ ۷vE_lvï3i$G~|տ}_^Ovٌ\- i[:gT pFੲNg;#W%Vex#/Zky'f[OO?#[?œmd.rOz RqBەqVmT9`y1/ͅe3[ILސ9{ gg:Sw~Bq aWAP4VGU2JRإm '[7~N{1?r*i mK))-&='Q[u68Bh :L&mZ[졭dϵMږjm gh}x9ڢ6 жNk/ 6j5b ;Ӂb'|-wh7;Z[6| mq:)^+9įn$eZ1N,;d໼NkKC[6D*1BBFQ -v񵆇!q*Y1Bؓmm+ĭm#K4:ն]hCh(I',uZ[t m.F֯ +|PK]|?`hk}.~g?,?&͵c1s=<;VYEh}2ײMhK&=|WmІ&Qxjvdb 6wh>Bۖ%} 㤇hmW{i߈Vh5Nd-\GmSB[:/AHkRI&=z&:gҊSI< (U$uhy"%eN-8K'C[֖8U֊nG~Ojiڴ֖8<4MhEBBFQRSBO;OvBh+~4-SjC[96&im fYhHh+:(=k&lm;$m3n̗І&Q| ,Bh;Bk >8}Vo+8 ֶ mB r'MJ\ m_6kpnš-AkK\C[6C66YhuΤMS~g mէ*Mh|ZXyկ-Bۚ'քkZŹE8%hm fԮJ*FZ.ZЖMz ty66⣆|<yMvqmPh+{B[mskeK 8 m&X7ZNZ='\ mSbh mavʵ(]hCh(< `hyYB[[]imW6+5 mOhKv&~h%ߦS*1Wh} 6de[Жr'=pX!MeN0SBBFsm/ ABWϗlVm>tm(\zB[tmm WhHh+:(=k֖7U mBmڄ6 Oں,1}&ж ^Hh9G /ڄSW-Jh%ߘmzh+xv#BkRY6Bm,u&E"\&:/mkBڊ'5=Zzh%-ʰ`h^U6OڄMhbi\mۅ66£mWh'􄶋Xyo N7XAv{жHh%-P%<-kh;5r>Qhb!Lz0QLC3%! miCN ?%U<)mB[ڍжfk+PKLh|f6Ek['M +R>IEh}2ײMhK&=dX0 BBFf14s_$tHj}gsv~m&]Թ֟*6uh,-pg m;?(ih ?ih &=dWmІ&Qx|K-B eLh\6,dXB,僥#Tl%S"z蹲tڄMhkiv MhZ:,]gSh {~;_lmBۨ][4w[~.hi֖`NN k²JL5fOڲ>l.ILc.! m<ڂ 7KK*.CNo Жu mC~$rhm#Kٜ1Z FGhKB|'B-Imf0L mmB-жxhk}'FMhna8;ݺr)%m"Kl:a+C[Bקm8MhK&=X%BB[ؽUHڄC[ жfkC["]7Ǻ mZ,-HkKl-2`AhKΔІ&!e m՗|)Z߁pVe}жfk+Y.FbHh Yc [a57AMhڄMhzi BmmB[k6-Bh;u\h:tGhf/"D( m&2=,NhX&=Rڄ6 6*;<%|15`-Ahy cͯжfkn}\0-Yhա"]65 mk MhKںs'-ڞ~0ZhtvMhK&=FBͯBB[ݱ*5:(Kh+|f 6-Th{ֿ$SUqB[BקmBۨ&lmB[|%І6ihxVK7b֭ mB&>mx,O mj6ukmb& mc[ۼ!:^P Lz<") Mhc4`V^tڄ^+ m'%5 ,m2Nh;RIZ6JkYTmmz66 mVvd m-Ԍ7 ߮5[[ v;uhm B m;#ڴ)Bֺ m)C[@hChbpn n'jCۗk5[vr6QW))C[`֚N  ڮ:͐ GZ6i/ 66m.5~h{ń&Mn}ptB[hmִ m}Dh3jmB[6сжfhk7SBBF6p_<4nUޑZh PhڄMhڄP%|-ڵS1Kh c[ېr$nmmf\h Mhڄ5Cc~چ -_kkx/6Mh3Lچ"uk[-mmY̑І&!y mB6&̣&e/B&0 m)[ۤB[, 66-wZBۭᄶg[l6-`-nͽڄΡq,{t`6-S| lB[Y ,-{XmmBBB[mڄ6sd&uP4mW6Mh3LTلmâ-]& fGhChy,|Y*`/`NYhڄPEyW6wm!MhKYf<,2B&ІЖ闈MhF}$lֲ`-/.ڄFRZ2lB[&9We$ MhChڄP- mBm& mS-^ل60QeRVaLvsANx m ! mc(/ڄwgAh[[˂oҺmW6zm!MhKY:5B[Yڄ6l|6-Zhfn!?ڄ6-Zyq+&&lCB׺ m/ 6m% L\)MZ4ՙE6*6{hv(ʋ_ mB[vd#)3lB:mC-%>* MhCh"MhwBۂmK6B[/ meCh3 lB[6!Lڲ+ ! mmcO m mB[Wg+6]hv m_f meSMh3R7QuoʶZ\f@hCh:Mty-dӿqBB[6uT-Dž6-Sv҄ϩV?6Ð&lBЖf.΂І&! mc7f mC졭$ůlB\m=c 1x+lB[vp#)9lBۨZeypPKh -^8lhpMh mvXo9M,B:m;d6Mh3DlB[d m > BBІ& mg?&ӝڦKH:+چB[1s Bi? BaHeټFս+6#glB[ڄ6'᧻<|bjmT84 |)vAB mHwж+[V۵ mMhKYلC[@hChb~~LB=SB&lC[؁>``h+91ڪ|NRkTB3{kVmG m@9ڄ6nmZ(;N6|:Ǫ( m'Lh6su6Mh3ĩlB[ʶM{guMh@hChڄ6Mh+S;%-X٢ȇ_=·A[pI0GˆZSMh3R4QuoʶMy-W9ڄ6>mZ%;ZMh([P m V;+%mS\!mӦ mO mMhKYٖ mU mugAhChULؓBVx-Th|;#|Q mWi?SM_:}eڮ$00EeмFս+[Cxh7_BmmӅ_Gh6YBhq?Hh.Xh3ZhYnw;G먄6MhSB´C[> BBFF^@h چ6MhڄIEhr/ . f m+ݓBa@ekݼFս+& mBmm}B[/ B[޼6-/-? Zς66E$jKZ*, mBa&lqa|_3囯 ! mmv'6mRcж`e;{g#Q UJGV6OhkYn $,"TkTSقtC[@hChڂжNh;b&Bی-Hh0 B6KmI0_M' }eIeJe֩laLЖf͂І&4Jk/7ohLhʗi+69:ז% mUNh ?Cִ mC[j7 BBІжNhozBotnmKSH-fh3 [Ǔ m#f% Z fYh+#BaHeRV0&[hڄ6Fh_[ЫuThv7񯖚6Mh;81WyVt\$lBiH_٢  3ViCʑִ=~Жo΂І&!-"녶!x"B[BۂņBhn mVJж`eں͂V ʡ9g-khY &zhkzuB[5*ۺler1[ Gm)Kh Mh& mӅz*6\mC:Ж~mcC[FҙIC[d-rhKy1[6|ڶ mmBBۘ4oDmg\h6W u, -r_gjжxhwz:o*, mB-Hh.[لdGm)Kh Mh3|}߼gShthB" 6 h륣BںNжThkzBB[Ж8bd mSWmІ&hh8 mBԡ-ڱ{=MhڮLj.YhYڄ6seV%;j7_}BBІЖ3׷{+- ;Ncm4*YB[υ6*mV\2)B[B[Ж8"ȷGm)Kh;+%+}h˷3 ڂhvm mHljy, ^لn ms1ӓ~=UL0-BOFҙYB[kT̷u& ma]hChh|& B[ l7*L~.:f\hvzn놶^& mӅ瓅8-q^-| m ! mqvB[ /uB[c-AeڄY!<_= mB(mYC[ɝkTطu8"5}9`;?f8a-}h+kZmgTDme& mV6-`h}[& m !]48'.YB&u~N*[yʦ& mW mٗv-ڊ7$Dm-'Qe+[h)kж]hChD)vB[00m+sX@hQل-b|tVX mL# m' mcC[㈀ꅶ5n.! mmB[rBOhVm4n('GhkqCڢ8 mBdm`h}1׼ٗv@h#ShؙmW MhڮQ~ mU&2||8oh  meV+ =eIb瓻ըo법-qhKԖrnۅ66TB;ӀÛ*U9wB[qBېYڄ*ۚm# mI瓅!-qDoB&ІvƃfVh & B[Chkq q m mB[j-gsj5Mh:OS⿭Vmڧ-RmІ&!MBڶc7rBsBۂ"ڮlmUJGR8E<_=l6VIC[.m9B[B[Ж8byT mڄ6B[ϦжThX G?R:!PwsC$%l-BRYڅ^& maC[jo법Mhڄ6 6-Ծ~7=mms_6-}h{zٜ+\Ɔ ڄ+6*p[ sblۅ66ʡ-N*i;S-`hڄ ʶu mf`i?UJGR&>_Rh[s|lhkzl$FWohm]m>5Lh4_1BBFIC[4Th|:6+ۊmr,lSnkZQ4mW_f maz蹲t_6ҬY/RWmІ&Qx|ж4ԍ4B6:58 G*[ E][mC4 ԡmW$S%+Hh`+I/m&z[l6NEڶ mmBG B _Ahvr#цBhڂ9WϟN 6V mMhmB[Y˴&=dX-H m=7 B:jX93 u#Ͳoy B[EyC-u[ZVmӜڲ/!3W尕mz[l۴73WmІ&Qx 3FmB[uN5 mg.)憨~k_j*W_N 6.ښ+I/)*&]d/_Yע`v Mh4_[ggFUSh_H>:l1v/Վ뫆W_")ցBSd6dܕmڦ{[l۴73fxv Mhm žn&"t[ÅmW$S1bh+0jhp> m)}ңuB[ֵ(޶]hCh(Og'4`=iizӻ/nmEm pY5cޡe S6爋`B[ՓBؓsWMh+mB.kQmІ&Qx 3*)C[y,Y-W?)-7!- ڒ" mB[@mع+,M.[ٶiEڦv Mhaж44+B[O6"Mz~;_|=ڦ 939_=E ]BؓsWMh;?k+6mIڲEBBFQggv_^6)=-8@v2mzMKy&`hKuzt+G`"9pqOTٶ6muʶMHkmІ&qh#_|*9iKPeOW6Pٶ,mu-j.! m5LzMJ3ĺ?|iu{lh{(*Mw,ٳ mVx=:H mWB[@mع+V5y[l۴Dh3_6 B:jV8&j'7ξANUyIw>cC[dtWGf''clvll۴ڬE6 B:jHL/]k*7NAΛzC-ՃS"m> *RЖlڊN mcO]ٶz-ۺleۄ6K|l568u|?oh[ڂB[؏[[8YЖS=:H&HBE=C[ {;Mw,a5yeۄNe@/Mh0j.,h.m46 澵n^<}fM8HhChڎqv唏 mv{k@MhCh+>r- y r`v Y & m]}^q86B@h;)7}^q86B`v;ϋ@(Bmcqe >@h;)id -rhuGSh  }^z86B rh祇sc)xKhK@4B mq mD#Av+gsc)xKhV @(BBv|E|aB m LCq mD#Av4@4B mLFq mD#V0)qBۭ>b?]ABۭ>SyB[@BDmzLLq mDxYhChڎOIx7'BDmLLqvk_DhV[9N 6n -O6ʦ86``hgz[hAhQLIj1_4І-Z3U-F[  m OUq m$vkTm:5v<ڠhgZx   m9ݺ3m}n_.GBmbceHhKik11tx2{=,! mL^q m$Av@@B mLa;eBە)l11tx5ڠChg";Sh & Z }&hGNh6Nl11tx5@hڄ*id Vh g:[x$B6hn-I+ [}86b@hk*Utem Z[ }hGh(JhF n14* mڠnhEg[x<-6B>Fڄ6Mh`uC->b#iUx"Av4mxm6mP+B3-F[-vN# mmC->b@`Bڽ@zB\ mL|nB mp%fP-x(HhvD_hJhVQhe6&6O BBvM_h'VU_wq(p'vP_h'vϾ&CmZg?ů"[E ; ~6 6X0{C[@_O# mmB[l6~m mKN`eB,nkhU!&/; m m N`eBmB[±XBVpDV&&/; m m N`eB,ڶ5Z[ " 6x؉,Nhmg?ˆS`8 mv/ m|%VU6!ж >B> ΆmVڄ6 mPڶZ[ʫm@heC[pm66( mTl fh;> mPڶyZ[m@hжMʶB> xTB6ڶZ[o1Mh 0 .-|k3-F m&жnm}h7 6ڄ)`|VYhCh;ڶϔmxm6mP%mQ[[n14* m<ڠVhB>biUx"U6?K7@jz,?ݪ dɑm0h+um9s{TThE[Yk˙pİ EL/J][l#'(ml(@Vb$.ml(`zVrf1l Ah`OE[Yk˙jİ݃ =Eme-gv6mh+Y8 ⊶rwז3ψa JEE{6-ʭ][@׺EtroЕ˷]8đd]Sʺu l::Y)`Jֺ\;Yj[]Q{21*Wu܅k2ෳ)yƳ~YΦNЁu0 Ί2F)uJv?JhuS k2gyi() nb#@ :u6u8EmoY/<ٝrZ0E:O%肮}ߤ<d]5Mݔu l::`O,xvs6pM&Lʹg8IYw5.@ :u6u"(h^пhk]/>V϶ 6X<%?JyTGWiOȺ (YΦNЁ)ڠh;\7h+yo;9E,xt dJ'|\qk2M:YΦNЁuDEź9e>OX]GYmyJruMf/ rnk2ӿCցllꀏmh8Gpwy i'Pߋ$O_h̠xM\uA<<&^u l:: ꋶ4HouxM%T?wmɣh5Sr)e9t Y7 AgS:: EǢ!o9$ɦeĿTmMwvmsk9O ֬'s/L :@Մج j::ΦhCVSլ{#롺?V_U>6X<%3fe]ĚyJCj5eHAgS'@S(P mהD2}{hV,Ert]ɀ[aS7uɀYgS'F6m/}J'p1CfbExm<77zb4]z<߻6K ^7%e S#xdAA rq%exܱ;|~7>h~5q8+h?K| 8xIu]H.)O|$mB&ޓ`E__i2qa3J$Z]_'wIt ],n7pg]RnFvc endstream endobj 3516 0 obj << /Length 1903 /Filter /FlateDecode >> stream xڭXIܸ%p-7/=@8s%VI(M?PBrO"QIt* ߷Woe~*e"Gu9nN,G:"䏶rLݏ8_îpzNzq3F7ׅinԏ{x{e r+ fN:ֵ!n9Il?I)4?bA2^|Xb~:I㵌m]wp@oTybX3Q pǿ7:"SzCۡuJ WnɈ @Y#`^K0v: ծ&dD&|G1+:W&owjb 8=Syȡv8x3h>8 m~_M-( qD20q*L1wշ+6QVdB#$Q D"z}DY/-T'BT 64HE_̴H"L\JuAf!zLM{X ^^Me!r3*)r̺8rY`"AI+iYjC-5pp\9^VbBnX_V,՘{?ɠvd}f LU W\k*Ӣ\e~$29\f a#W ] 8; ZX`s~x{5* ':ەHӴ(t2$Ra@E^蕉ޏ7PRTD^;_ZwukqL.|K v_:^*HŒiNwRCZ&]G\1PM+EDAh'ƛw$(v#J1T 3Qi76.A]xҷSyoM"zd rX2'B/a> stream xtڀqPĎ;*"&"H)*'!ޛHE齓k(^݌]gggnmn-^ [м#GȂ-O]V^*#+棓lϟڵk{H: Zٽ{>}OVwg2gUg@u/?3'<))CӧO˻᧟~:td| |W~-<<\v۷oa7No> ׬YS"8J58e;Yh cͦlzL׮]5ON^{MV1y>Y ?cy4#k׮`W+/5|9y8B{ɒ%1c偫~+ۜRJy O ͇?x9 '*>>- YXyGeʝ;#<"44gZ`הԥ9vhnluncmk[мk9@~͛WH+ _5޽{뮧zJ Y|Ay: Z)[Hyn5zfd;p}nvzwesࡇI5jhڴieʔ\2ϿYխAoq6m+X;\ҧIKLL5Jnԩ>saq4:N~gі|RR9s#]5aydDfW_3#&M0 ,ȕ+={O_~Vyk=z/ 'GCy5R#)xӦMrpBs^fMczիV:h ڵӠQ=F_ժUKlH\\r6'S!I?Ϝ9ĽdDΞ=@˧ '2dPcyf̘!o]ҪTt۶m7(NHH]%ּݣ,G͛7+qoKk֬$׭[Wg.~+в3 [}AaÆ:Pi|ԩSZ5 }3奱9+㿦. Fs;odsk[@/ނ]Ž;:ԳgZlԚN;C9Mkܹ:@sT{#C*ԂnUSD@?ԜU-Cm";zl۶MvEnݲwt 7V7Ye wGb̘1ߩj'M9sfxslX/ͭξ)xXZl黝~=㭩Yf:WS9~7#9жY#5/{,qE YzeV(YH|k#WpAo|p;w.Zs%ӗx?]ztL||sān3 ˗rގP'pރˡgYd'Y ~[lYy]`aKO

kzZm4_"E1Byidc(/%Y 46,Xk>!{ w_*dNlْKZ-X@e˖a?/r@/Z)[!ztOs&͹=e藟ۖ&»C]v;`y LQnǏϘ1J*ժU+w'MplCҧO-ҧskp <y}Qc?3$eWm޼y2d%\x{SY7~mSa]G  (QbƌM9EGU#eOOv7oޯ_7x#ʞ̓O>)ҥK\e˦ŋ СC;wޗBzdwږD6=7"ɤTzk{ᇽ6>|X~%ok<"ExSHozgdZ-7sιT#۷oOK޹d; ]R|rݲeKy&K:^#'L //w!ܽ{pBs%Ϝ9SC}ϟ?_vNR!k\-2gά!|Ӳ /,!CԪUKҟ~I5[4Mݻb}e]LYƎ.YhI;5R>-oínckzBtTw-G4UZUGyiӦ \UNuѢENe]Pjohke>}|z_Pͭjk|OsR9LvD;{- Ɖ|0MV=zfgղ}6)w֭[)S& 5u" Hٙ뮻֭éxe5jԐ-h&ks.dʽSNȒ%ˬY R>Iƌ:G[nw}ȟoܸciuQv|ߣܸ{rx.B/嫖7PB#S.Czk''{ʟ喲Ms#X% )ŪYf7|SLYhHfL`mW5}_ג1{|o>W~5l?Rr=gΜ|^8Y}Yy|dђHZKZP.\(_;ZJ%п}hwvyӧ?xAzT\Y9U?gYؚ4iR\9YѼo a2edUUM ͇{n9UΆrA/_n׮,f3gX[ܠ9vinl}o [)[;z*]ŔD}< كre7g611w_TjoӘ1c^}U7\y;ÛL۴ic;d 'd[tMM}J2)߭dF?%kO_|G~Dx-]{9y6z7o?,ok믿ʽl߾]X_~.Y䩧 4|pr'$%%yBY%UK>yMa/ y{\ &*}c-Z$ b޼yޥWq]I7l_y2˖--:f q|#Xi&rI|||5’,&H 7Ks;odk׮k>!{ vQld;4;+棓C6$+rK͗@Vʕ{~8SL_z٪n{S פ9)̪5o6CC졇ɋ >kկ__ K~M:kdN},;wM-Z BLw=29Rs.d2dߒOʉ돇8xP6O!K_ =x\iՅ /W^y%!!'Ν٬C=eȑ#e;s1svI&s='O]ny딽zd?s…֭ 9蓭eطo_#Gr-; !Ӕn]Z*+UyNXt?( yk=so*UdWQ~~ݻvLn߾}ܹ=TxO?['V-q㰤 ET~Uruʓ#ؗ_~kuscN]}۶mSXG}"wIJeVX!PM_I] F)S$#{Gѿ~,Y򫯾ٳ :uu]gv<[egVZ? C.ȟ? doMnʕ͛7UV8p@vx*V(1..N(UKrժU'OK U_#!r:uPƍ{!%8>>_Kn3c yhrϙ3G;v=zT - BrAr)(y|Ad_HK"@|geɵkה:+[ߝsEy\]MٖhԨQ)+Ue) :~\%Ae˕+,勈f֭IK/wWt:$l~Ce̙2W-e_Ϳx6䔕_:Z9IwA?c94$Y6m#Glu_Suni&9r4>'kw/k.G.e O"נAnjky˖Mk[ǎU˷Ob Y[_eO?,zb:XPn֪Uxsβ#O#CnݺliwΚyx w,Yė>]v6;3Yj 6|k{ \wՔWIM.ch&U?Ϫ}Igy Oҳgϗ_~Y|ed8y8pTK LvrѓOd_M eo\*7olv;q>~K/$a>@6t5k#_67㲼9W}h_ߕ+WHޒC_=stĽE6ŲL޾L̙3rx%u\k!#}o#[ozUmWd=?{_8QtpF|(?ނ4Ku&r)!k̙KcGٳN<#wwz<=%e xn Y:c+7+-[ħ̓G²dr82c3־}{ ͻ8]n&'/GyGn/(w_B6oެ^\ 2 *+ B1e [lom&.om-[ի̭ld%AVT (HG!wjՍeN3u{dg.V_R6}&,cYSZ5k*물F՗n29ga+y=XQՓ7^{ w)OΟ?/>''_|o>pK)} |B9^+_){9 })S{Ӫ̙SR?JjLꣶItndxe;'=]2Y*[G}3̜9sm}rFOIw[|=ҹVڪwp_qWmwYd ;7N^O?AK/YFnݺ)*mnĉaFn77gƊ-gt,]:*|}aNSHyݽv{c_>Iwݥ%K4go/&Oc:۶^3zY^)Q6{t-|u K?t%K{Ș9coȥmZkZ^&MHe{F1}2 jAt̀RD|dWe&wl7}[͹K{v6l2)1=l>oF_NF<+W};3WgG5Iιw,4@y]`ZxI;.kvSU<`/^Sm ˀF.id\5Ǐ3&N<ƈ},̗gʎDDDxjpm3zZ7nۯqU XUQn?w- X&즬1cqڨ~8yX+ݺ-ɜЧ6&&Fg7o_ϫkÆ}65kNy*I jСCg! A ?~\Ν;䳥;?'cՎO{~)ɉ!cܻw\鋛N/ MTgo(3;U$eM'NPR*ognظ^6f {I&y 'Gj6msmܸq۶m|6n޼ʕ+n?{.,S6rpy^qa'nc*vΝ[O޵k}_>sSmuB~bNej68Ȍ%n:U[uTn1p?o~ %.Rwю#KGOAvKeoOqz徖-[T}e5cc^Flʹ͞9/b R>2q>|_R0a±5k6Xbܹ<椼5r֦୑fykdF&Hzkȑ#MEo1`^gGfF=eѢEuJ$CC2*v~.gk䮅}H׭9ї:7Sj JwF6 FʈsxU |R#qnNj?}׮k쾃/]F\Լ霪oձp%sjTsᄊ꬙8^v>lݴwJ;NSgykS._uo32$[A?W0oL 524AR1:5AZARAF"Uj*EF*Y{wnCݣ2f}5؃뭑2ߝqRHO)99\)52U@5ْ5R3;5M:T#F=lFNNGƑ{'RLy_-Ǒ)bڴinӃRٷgkdwjȰ.]~fk֬1U#S#7kbFs}52:*ʕ!bѢEBFjdQ4$}kdI 魑5RƲvFSBL 魑2-.k5ryHC[#5r@\9ӊFjɖj9R#_)c_jAҷFX}GoU\A2Pt;HȔpbkXy^_|~sIF8y52UR#KT j$B_#Sdjdwj<ԣ*E]ZTF rFF5mbFF]~V f?jd.3)dFL_*kdr翋n2}a/˕{Fz)c՗ٌ}kFw4NFaٷoߠ+5sUd̒L-ө/Z#=4)45R$$$F3ƑY12_QjdZ nIfkdUvFVoF>HH+孑kVլzRH?FHڲHXv5RƲS#-HWFؘtvnARF$U5R9;AҷF8|{kd-ove#VT#C$)/#F"Hv>y(::`yS'uOS5r`ܗ}[#el:H\42H!fFސ#5Nko| 52ht/HHO8vۭF$k{AҿF$8T52W-~o绞jA[#^ qKDkdv<ע\z$s Z#Ovs# YgkdU_7VȰΝG~~YMݠFT٪Rl9|6kiFzS'\?{C˕vFFDD޽<Kj4Z#†|9R@5RڬÇ7[#c#"֛jdJ1xQ5RUH2L)֭[) Gj5V'5kd 52ARF$}kعs̤#52PI)[#eZZFNSHq5rE}'FnԹ22Wq527^0Z#e5Nt)HjHO_FZɠ5ҥ Y#ex l,ȁߌ5ҽ 魑-^x6PIobvj$BV#uR5֭|&^<+6{=5RfGj2ӥjVkdD^IFvmZ]#†/jFF~flHχm۷5;5յnڽpFuqF\ hdHωQQ)@kd_ X#¢۷_`Fbb(FzfQS5WHS^щNtF ٕuFm۶ٯݧ6sF F,H.IU4i)cOSHgʗK HHC[g,v@)ԾFj䚁H.0R#=W޳TbukOo1dokdNS#mH7d)#%j^4R#j$ 5RK&.g[#(&.Ioa&WkdȂFӇT){j޽W%ϚeF8Ω^sFz.IS~\7_Ul52];鹜lH+(+Y#S5RZjr^KlʧmHyd̫`ڮ:FzNn5Rfk؞kdl{ѡä T#E?U˦M e Ax5r3}kdbH%H.8)IFTȮ]?o贐@5BW%Y#;Of MԬ2+a65rvj^=qs42X#lXƮCگo5xԍSgvkARF.w6W۶F$ HǃNt7otoFF7mbF^Tvjdn}SFF1v9s#=_u-[2;5olnH{J<^4~N(ҍFɓ玥Vt0HHqa5svj=I)˳͓&ibF,/~=9ӊk޹r钩s#eq@24?!NP# Ak5G\qF:$H)cadijٳ7{t0HjNsCS#] 52>>H)ҍye68[# ϖhF^ڪn$Ϛő٭eQ5Ri92vkdi]#˕ tnŒ#rjHsKY#ei)X'|qm#5u˖9U#0d#52soiFWWȔuհtU^Fz*hd) Ȕ:5R9r`g qT}vl1݈.ȴ$ HTԬs?^Z#?Ϻ󈹯~ ~^ԯ2>qmF$He!|rS@5R#K## T0{nrf3'Y#˷xZOj5~4X#Ft5HZ)c3mIir6i/^IUqxp7U#] 5RpFMIfLL=@5D,fkw59Ov52ujdD52fHWGjHl*`Fz٬2|).+ˍ% Q#vj}\W)o)gnr Ȟ}^;P idkdlƁj̙3HnΜHC=yK52**u5k 缙$MH7i?HjHyf5\|kd~%nI#5RFk 25՚5rhBWyFfn@5ReKH-\Y#,~15sBfkHk iF"5rt$HZ6i3HHG%+|kHAҿF.`gH7F@$5H )xϻW# Cf)e H;o|6kdXN#s]#S̨7rjdXΣfFF~ܿFhX?H j(52 5̐)칑JQjKlʉCN]Ӭ3FjdTjdXK=7S;wK5RwNH1{ֻv 52cI」Y#hFK\qN9ѩbvj#\$Hǃi3HcƌqFʘbwy!EgkA`LM{@5RF?/Y#eZ8?hޗ9~] 52cjF:s#eHgk iFH<iFvj iFX}b Z#^ƿF4jpHAҿFhHkARU#̙CDjl<׺uл\# y_?5R[#ò΍CUȰmFՑ9T52o|s#=eCQS#ell5қ64JLy{Ķ"9ynC= ^#S˘1R#TlFzB6kغu)gOk52cQo6R#=_SG52<<tj=K鹠U~3S5k׮O\##|vL iF:$-H;A2PKY6-֚2\xt6H0޹ZT.F&Dt1R#6obFi`q|v5R'Y#x|܍Hk iF.wH5fY#-I 5r Z#~oa-T#I)LHgF2 k`}]Kzkx<'΍T瞲Y#5թ>,_#*lHXeSy;kVuJfMګe~gkwF}Oܨ=tK>PTzJyiU* 4T#S͚XÇP#=H׮j֨jFWWF _#Z5snA.\pFкY!$Hi9HH5^#eԈ-t 5rnH)㓨NP#'תS#藺A&<@5r@\}KF~߾٨),B)cQ#ւ)#~S15 iFZ jrA+&9u,έT#-I㘵rt0Hji~65NH;)yL#wgFzR䣏Z~kGﭱmhF}jT ;R#{ժbFzլfF<5٩26xޥ<:U^pFۥܨb„ Fޚu΍FjdlFjddύ ׹Ӝ_Zjգ9ѷ@N#52u@5rŊjE VT٫`pF0U,I5ҩ iFZ :52..Ω)m|󦪑3[T# j\tlF+Ɂjsf a26nFʌ?dHyi<й2jGnFm5ҍi!HZ2~k3S#+}957FR#Ik5RILW l٨Ij iF*6$ Hh_z5BԬ-_H6NHG\r%5nH)ґ'dqFd کv\#e;㤼9,ȈvFf8jk#P_9P#ºn_8)ckg]2sVWܨF.mFz2^#elnlIReKaaC?(c|mF>3^#ňnjţznk>}bˢEX#h~NV#/Y eY#I5lԯӦMsFeÞkd\^$-H5[# S#q5Rnv.11he9[/^0{no9oF875RFߨ.HSArL gn٨Ik iFXwck4#f qL\^4$5knMi?H)SP#xt$E*1NI'epr6mߝ9zTR'?@S5Tɒvjm'wK5eӬ:ΘQ#߁6tqU5j/?|ozvjQgK5RƩwM{752%HK9[Akd5Ⱦ5K:ͭ_Z)D[iE#5g&5R?l=hPHdT;kd||J+]^00,l=ʅdl|ʨׯ ;eٰݘARFFFF 5RF|'&2vݢO"kSxxxIk5L,kw-1U#g7nW#󼾺52F 3R#FF26kFh9ຝYkd2W~g eie#1]#G'eC0U#s//Zmf~rѨf|~s|y-GjdT5rH}>X#slFA[2vJFNS#e${R`nFvk_FhHioZ-{fkdψub-ȮmیΛ=h ibb5R@5Rl_8uk:u=@5R=E_FvyGҙAٰ!1kAZr6HHn:koGTtƣa.^(A+IT'Ê_#˕V^n9j%#5RjWCc*]ҌȌ%n> h?XxοnF#5RzAT^r6jd\ Y- jd|=^SI5vjdRyMMPSN=s52]K 97R K^xJE94kmKQ͛jd~L.^)0Xa5s?*ҹ8u߄B9?7L+ƹs 5d{&/_#:w[AkdD6_7P#Œfk2@ݣ,HAk*j%jc IЬYH1 5RkB_ɴP#|di0HFl1tQonHA+X)+hHϗC~~F8{W)ck=Y2>is#e4nHNL iFH sItg nH#Aҩi$Hg Mk Fؽz_HARFsFr e Z#N5;5rSyeK;5-}9epn[*Y#j4~?b^:wZ("MUY6^#Sٽr2{#5BkrSy_BQ.bF-BںU|ׂȸ4kرc-H]KzwF@5rR iF nH#A2hޭS5RƪFZ 6_I U>O ۴4R#W2R#4idFN9e ,'*ܸth| w$<| R $26$I5r6jy3-\#I9#bAHkARF.!HX!N5kqc}fkH295kjdV-GiNV]sjdXذqdTo>52VUZLpH%Hni+52%=| #1}]3Zk.s#-ز)֮]kFzNBmhȘ 5saiF~ٿ@52|RԪ|A2H 4H .tF~詿"99yT Y12̻T#-I QO K>{&h9 Ǐ ldHypHfFʘ52u#5RFS/_M5rZ5i$ݫA$-HlȰJ52hԩ݊ǥi!Hj1cP#aF>EsY^?>gfk鯞8aF}=4[#=ߝ[5WlvElґװ?γ2 )q@ύT6{΍71j7Ho52LNHNz_6R#rٺղŊm Jjd6WjCV#=,n-[Hei-'OP#eݝjX|S5Rlذlf*V> jN MFjdϞ=/dFzȇx>qyt)vyfN Y4$)WI0R#.22lFz.y3jwj3\#˶xwjdIj]J#5Q gHZ#u5RABT]FF}V󖯑ARF㞴P#IM*)RF^ٹw;Y#'O|97.]IkykdL:52*2Rƽ۷sFvoR֭Fxف֭M,HȅW#ϞuF]b)-ZdH{ӫ)ymAtwWjt8k'YmfFʊ:9Fz?߼y #F)V^Tݻ+WLTdZ.j$HewFzRF.4#5Tt\侠5Ș\5HiE5r@\gpno9oFQ$5R7NFftFXs䌪/Q# n@Aҍ Ig 52RN<] jȉޥ`Fms# fkdXN~n4v}v5AJH/ vnF^nq]bsjfkdt˿1Ez"ݫbp,Ç[B`52m[͟/Hw4R#ui4[#ʕ+o(H$CY#I5rnH gȡ FN x)c߲^!Lmׂyǘj[2F^7X#0$ l A .HhfF^FFƊoo" 5燃N4$HYP#S1EӦYF41{jl&(ks52,YƁΝ@L)r?BT>VZk #+F1޿/x ^^x35׈ 5feWH%ٹۅ1jd~ ֹGaFiF)KyvjdLLLrrU#5dڬA25R3H9{5bvשmkF ]'7vF.;ia-t9k52cjFf,k;_AL xT}fl MH?3Y2\FF-ڸ4ԯ߼9MHA2P7o5fkdH˅ 'lCu<)]}j?p3_fFFkgdܹiFhXߑs#=)cQ޲pnF8;Ι^uF]-Fya5;wnXFzFs1zŚ:7ҳ"7kF~uLfkd׈+W"oS#ô kL5R$C_#)dڍ)NLqYGTFگCy&TdfC2uGV#e|K5͓߯fFʍo zHZAҍ)cH7dj*HZ#UAN\zs99cZ F4Hq5kdHy}{;G291Kn?k52IƁwMi4T#sKHLVfoB3U Aq]SewF}m7jdXN:eFʘ70ȉ vF}f(s52e]g=jFcǦ ]ٳ~:wMW#UA2-H *5R$T#zFF8vHȠAWL,v/Y# r1r?hf削?lfH5~7xndʵl~VtFH:x e nHHϩ'/q n 7c $Hvj$kdZH5ʮ].^Q#LI|<5;oA iJ^Թ-^ _T y:45RFb=*u&Ofz.R 8}MStـ̟?5RFDG>3Z~٭kM6~5R̟?fA2HoL$HqT+/L$+u3BP#=eYE{Ksh| ONLt6HFzdj)Af~5ٗ9kV#}MZ#d)|s5:5rEi!E|`se^%-靝 n͙Í)Tz帰rzU}CS#e~֥'3m^Gka_P9rpFtrN`֬Yk2eJwWNڵSn iF*AVlT%HUƥ~4o0zIT:Aҍ]woYOV!~P#e{aVLX=F:$C_# xc玝ds"W}kY#A歑:ARF^5r3eJ )RU#O?AO\hIkCy]Z%fSF:yr`x_8C0jLOwb}=+tF+!872V7h ;5222rΝiFD;59o:}޹)f\K;3[b.]rF :W@AҍY 7uR;*sg[yIKvd4jSArɮ3Cv_؜¤멑dn(HiӦQ#F>5k֬\ܧS9]42>ޚի V)R{PtZ*gȐ*Oi9x5sʗ7W,)AAWXt E2܌O30|eVpay͛SWF yz-kSxjf^*P@*UdeOs^zէǸ%rZ6ʗ/,W(<<^F>^㾫RSeQPjժKo<+zw)s-.=!kK`齚{r%rWܱl%,jd|&j~53A'yb9wΰQ:ϛO6?H>a5O|'>O|'>O|j5OF~֗N\2dd/xCrL&Jz_vٳ %A}gqlᶛgVl{f5ya.\'fEVVV`[Y wﶦ֮]ZzSSSt,LZA^7YM044gŁ:[ɉ^J;Ɔ ,--k2n'oi[o ́M^EX灖>nYc>| $;vwΜgw|I\}THjl||"7&?ΆU>ndw~~3.ȸw~FM0zmHSSӁ0nd{DǍĆzAF2N"͸vvvԃ[lH777299ynŪ.5W ,WD+1? [q#}}}13q#IǍd3P_{9){g$~"ø@Ffr+[Fj){8؜̤$ָ|S;ԨHbj߽EE 3g گ6E3k#)๺x/RJ3WYeSFB Ulvݩ;\UimFljjҮFXYC@%YԎc111- hF[hWW ߔgS"X\#ٍ[h)GA=W# )RKijjPkĥUl*&'f1"l#vjPd$_bjgDfY7ڻZ\>61EHuIFFY@IF>YZz+.a4l C|)使&? ( VGqJYqoHH׍r6vტZ:Rr#Uf/ /3""Bifdk41-kkf+--e֕J#1Ȭ,ܚ VxkYGڰ,ZIW#A EKgIluA eFHmhv5)Z#ج{k{Km_/σBKjkD7=5CYFUp^JhuᕥFַIHW#I(\#ѷ3^#Q#}| $N#j'7p+6amo Cӟ]?0v8U46ir彧O gww̱ Sh$ž64<`P6eX;ѣ-66SCCͼ<-jҐ9Nc&6tWUlq52!$G#RX#F95RZѢHZ)g)eȎK#I(#rst`^i21g7~dNU# ~_(Am42ßH)R )2ph{}}@Xjd}GWii)CDAIVVVh6FFTHpύFB1IBDřFBTlI52CP˷' Qmit n5R*XOj(~c52w5h˙F*7m*dn5̬=%kd52RF-ңGv ̈í}_kiV)))4vvH u@# JV#q{TH N'9ȅ&Vz1;FtT(#ec-q6B/*_Τ"?3t YuRHA528'^#"m/R4GZH F#˛4ҥ[Ԩn%"I4H>1~Iu¨/3F*Aq8ml |^#k ~6BMaFڞ8O9HǎML#,m|(}-aˍF*`dn5ץFVgj5R9dh4ܹD%EzigjzсF*5a42߿9? hymmHOOOp7B# )r`j*EX# )F \[+B̮NԱFRH6:2hdoh-ʼnFlm<G;iP_{~`{vޒgkdQ$YxEF#U)R{J52QOF9t0"5jdkƠHs'f_ N#AzΥF8f H[#~Ç˟Ǎ1SH'GGoOD#w104d/JfMA]:QܙZG!=9|X5255wJPH(f8241>q{df^#"+ *!E@# )RKYFe4 -D#]7=h:ԨŷEHGGGlFF Hh6ekF4Q@yOy kw3 UTFZ;'F8#hpÚ@/[ۦGl4RI4+a-|(y=jdmkdp+Aq%saaaŶ7 =\#ʳB|J4M`BK "j$5h; Q(9? hdYYhiD"!)JFڄ94REL#I(Ffffr\fvvuhȵcT=ELe*)[<3<~Q#}Q#&{IQ# uF/v&D+O49G^#"9ݽy"(RyS}F5T4R4+$I˽[otN#y{=Hh$&'n8  rdDȑn ]43cwx#l7ZEE#jXHdFb@#/]_ ^S ţr&&{v-,?1Hmh#C\N4 J=== 4nu5Rdfd ERHX+c&&5HcF1Hs3YYA# 5.F޼yFF E($Hh$9ERHSSS\#AJU5l4.E?dk2idƵZ'Zk"F&_8 f'OK#ߜƏL5ƶ_okdQ$Wq^sH)RIBkdzd0xF4xoW[#)\#]#P:5OhA\#p6k$ù@ٝR# 3BҬ.G~E2QoC\h% Sh( V,~A,4iٔq5SF)ZHrgFxp9HLm5#TF68/HŴ5I{&|$FB 42K4^XJ:E ٿrEk "Fo!HhF_dejOn4E< UFFINU5rT4v~u[\L#9djHI#MOy6E%HN42QsH)R{INj$9E2HJiF"5nUcj$3ToFF$Oަ&Zl(i$Æq4}X#ڦ#uZQ# A{I#HУszN4yjFҢ GװHcc9FJDĒ"o)`5/JH{{{;%hhHA%MFڿ>^h2o6ג N#WX%_~HQMR&FH4sI4~DChH ]kwl420')y!౅T^HglҦdb"cx7a*6HsBrn( eU'?0T>O Er-Caej'L? {]gI51[ޞHB5OHN@F"l 6~ =UU5Fk*rt^WFlWmi~P6Ki}(aaaјok$(G:sFE#;649ߐ\ID+DGMd7O֠`+Μ4 id$<{ӪFvIt5E"HsH4R8sF̘́FIG}Hˣ5h$l<8}Z6y,K*EG!MHMAYjH$xJh5(Rݸ3RH+)|ȉF~4ZC64+̿Ҹ942ͅD#s]_W)_jN#/FcG< j Q#:U6r_ HAF~3Z#R$̸ya7 5CD#P$c,O5Q4?{oWI#Q$Fܤ~5CTHDB8|V#$3F[ rpP㧟jO#{1Mh$ϥVHp q;vN#M/]5{>|H;5ݹC-ERHcc9F mhdQ?44Bm6):;;_H?q(*is(ZI#HɼT48}5j$8T7FFؐP$F ֬THB4?>i$ᚓhS"ubkdvv6T52(P/L#9Hfɘ"I42$DCG*]@qe싞5CiTțH4f=Ry52)'z؏~#iǐ38HHW-iiAi͛7i_j42sP)YFZ=0qƶn4R$F5$ޞF_CH)\ZFPH;!Ej[#=<<;ɲBZE4rH+CK#"j$IW#YR:trrfGE# WilߨN#" H)FmD#׮ 5*"Ffyjd7:TUP*9Tn:-5Rߌ7aqtT#R$-k$F#P$],iϘ"5j$`/iS2}⫡,)P#ncS -Ejd{{;|҆FJG+nt/ـ$׿jQ#AV4~1(2F6Z/jaHˣU5۶jǂ9h$2hPUtӛK'O ^CY#M/\ΘB#!fn"h$,&ҦHr4774333H)63Tlu{'x4*ivbD*}Ft)vN6.F*4R:T:~U46V̛N#qq5,1Q)߿ϾN#]]]֊qyoK\`5ךOXdHZ )RFjF\c3.jddCER-NӨD!tsu=eBwC*ڎP#;n"iMy=-F"]H!E?QHǠyH#9HY@xLSz-6%E2HIK#Q$Fַuh/FZ695=Ej"RH-Q$N#k$pi`` CCC)޸M:n:E26L$o~μy?`5R:jxbс k׭jdOOgVVVZZZqq1&w_'\V#ˢ҂b+dGqoF~1"H҅)X%T%7FZ> i׌I\(\#aK7um#DBF6ؽ8ef<\zRm8tUgqpBWoGJ7~l^%KKKUO'''xR`孠 %%%??.[u9ƾvyi'ga2ht}>%655}b+i$j9F*OCP:UROff5yzuǏaw,V# k)tuUGHp+,//[N#2q3xJҶ6[?^QQj]Nzy{%MQHpւ%؊)$>^ASZ֫Ydw]t8v'\z&X.˷! EHqd }.`55RKQ#U@,F^RFU+}E>qcYrR@jktE$'<|G,=Xօ'yG />JMMur_t\`w7lp'545lzݾzqS}+V#o EЬx_xP^2s->AKت<ʥrUXSv R|Zn쿸bTuGe;̟̝ITħFx×D#ɃרHGmFrBgʲ@=iB5O5rΝ j8/i`t|F׮ZW-̜,^Bx$At eÇ,-N}ƖC}|\89 F BJqGMj?pq-~~P#I.db);4HQI*yoTܧ4|"5%5So|/FZBF:1F W6vNm.ZMU#a#ƴM#V[!ӿJK]ib2a,--= O |e+Rjy(Ydn P5|WWWxэ Xbbbt*«5n~xWlX|>3Cz,"[Z?u)jt 򶑂ӧ)R:$i4EvT(P#M/]LE]#ݷHp לP#ut$LfPN#ej$<գ߿&ClA-&[2taK \wrM=^މ%`wZ/VRΞ^fOGR^ Jd (+\Q$FErMg2F[k Ejȴe4muPRLE# >yEf{l,?tYK6a>Inb#UʀsB,$\,CIE\P$Fj ^N#=-Ej䭲, ZHFfff'Z ^Cbq F{tWXx )3$6j^=DYtthdA#d28P|EE(>2 3==֣Ç~~~YYːHFJEH?̈́[ 7bD$eO (j$ȕ\iݎHѴ 8Hy4Xgy4ⴡ|X mS$]z#b7W Hg"x^Fڂ+!DLm}@UA"dnX {j;88.H.7\OOpW2x eDRl~tbt2DzױϞ{ } 4xqrr%n&4x47C:CK#Ŗ)P#l"HU-]N#)j EjC#ɌSi$5Rǝ 4D`hX/qޣvZZ`7vp* @UxJzF <`M0vfvv6(3FrHI8*-<͢;*kHR$F ߣN# qQFnCDp98ה;; .dpV$Tڤq>nnQ#Glh_-3Bgt-.@=6!!$`"x)::IieamDPFktq#׸fѝ;wv ˿{.at44KԨٷۻ{YҫbP :zDFâ|Dر"B|/׸ 6^V vvVj$|7žAYTR[cqpbB@1}bŴ,1<)27z,[06"' eWz9!(YX;U 9Hl}H5 TVڥSj"qi<ف}5RH1xF w7B6@q.^NJ,Oԩ뵘COJA #AX܎~~08PTO씔 FS Y>*G]1%yOG$岦F>VQ8f3$HYS4hlPFXFIGUH3g j󚕔(D#Efo8 #׍P#;E.*.]ZYJoApLASO԰ v踑fff`YsZXXd}W0p]~|ɘHޕryUU72VtH!4tI_Z41p]r%22T}aA=q)  444|D ` ".UZh(Ön 9< I!/;$aeb+KdMM| d#\Fz-_N#͌b$5H7ssZFXh.ž?!<3 &-ܠ. x^WVVIZHl}5DF&!~|8 sV}Ϝ.8g!jmFpVB{;Gi' yFcE"%1B"|6fsS$Hk5k HmP$V#=9AF" kFF{Bb^#Fh$IŹsA.`ےYSD:y,:` tKli'6o]ppc9CCCF-̉jdR#"P|ZIH4jȇ XŒ"il,Ft߈HX#=&HMTFM"4I5&B5Oj$Ȓ{4c5vvvދ0(_> X;a5R ߐ%;aGcV2~NddjtŽ-m!צD_P(t&߷GlnX[[̘LQ#}gM#H%tˎKY__OK#je93H;4RKidn:$TF:84F#CG3ӪFwZokdOOO2?yyYj "m`m$㵭 VP#ح9ή>~vGյD#D8$_F^reP|Eigj(P#SJYj==y-9FFE8 {83T#eee8l|Zl+2󷘜ob ~Epout}sLT]}gsQLj w!5R[N#ovtquI~I"M֌jd֠L."O!"n>w0iFâ$r,E*fM;b47 ;[e_4 ڸa~ٻQE>%N+!q`#)RU#!HccIcFj")IKj޼FFYAZF͜ROӧ|TQ5+%fi6v0K mśi_R׬K)YRš̊-raAP;oIvTUUE 7hiT;li~8ZvZZ"2& Vp[$lz=ᇄbF^ `DD#Ϧ^f4צFZ8- 4ijz6a6 >HD?F"cHC%z Bk+eJ>s2"|\р"Fzzz?Ņ֜XܣlrEu%==]G )q<<{ e&=}䐟vtz7 |i(FEݝZ#V# QH=P$V#=l"HѨF:QiɉFL 477w'N# UtP#ךOߌHPE呑 h ;J 5f)HlYYYz цFj" $`W0E]Hcnfcit5LY$_G5kǝ52`+JJJQl EpppKUT#/#?df"HN8nqBōZw%| M"677[ȞB"0#PO#8piFf1ˊyTHRF6=xikW^#4`( ;V~UjkKQ"S|1"pm*bFe~Qq}ak#ߕ:5M,//߃(_\oX`Q QY⯐+D8FU#7 :*Ey3NHS$䇕H>k$bK|,QN&<{Z: #}!SFƔ^C4&)h<-=rH){rI娒/eϘ ޵%')H$nOOŬD^D52Q(7&QLFU#\mD5u/j$k$5ʲ/$(SvP 'G3 2g yA"T$LkGJڸQ4B ʉe% }|@ Gz9-yzzz څ LU8P˺sN\\Ll`I J`@@QvvEAAfRW*T^R[R>_ k|B\#5RwJrKҠFz $"#6f\vAp+ŕ' FF|W8C451Io-*K32;AiQ*)X, nna!3B.K Td%KBrHE"u9_)9D*qW&L ؋YYY#k(/.𦆻`Q쪫G{fd4Nhf,;,,34l\".11YH?p\ ˽]+a\ 9 j$Aa.x.%IIr^z:,Gu=[X@S,;88 ]UI%"llOI'Ysx)ՔUTPɵ( @j$W]zh%oYr#F< V#WvHMMM 4* wx1555bE] %'' 2cccR)(ÇOHHsҢi*j4<W+52j2]D5rٗw˹*j_ 52x:y=-UFzM߭`‹.I7y`@p35ȱ[Z}\\!!!2Hx222u u7n6ׇ,n׹/~֊]!776cիg4r'%ŵZ]Vs|ZW#(<60Vq#<>^hp E"0rddfDDJoQ\ƥD)gN ɏI Uh++/z!ii1פhPG^f؜ S$RF*ߵrB(??QF R3ލR\#3t%,6`5Rjdw6W_jߠyZZZA *h*++pn8[%>D~JTRII\._'_@K#StP_*[]]y*WJ@SH8v- m:U.Rbbbjjjmtt{5 Ҋi"M7o~\'''''䳁+lNoH%&ƚo ==0o-7CP`UWtNmy&o;^]cΠk/\`p&j$z|+**ՍpeHq)"e'{q]FЎcLԽ`4.֡ N PÖ B$ko666 dx!Z[[S|p~ՓzruuS_' x%X٤\NRR\\^{{/1b׏k$H.//E䔥aٗXHғ'O~BQT+ $t)8V$Xu>ܾE8O]F|\0\Z1 M>BUD"A0.}QǍk.+5v>fx %A}O$Bbd_:NjmՕ퍞f1Zfs2+CI}̓`qUF@Ճ *'s!'hĖ'ŵ^Vڤ뭩7Zvkg^Up҂:%ݤmPI RtP"પ*J/j^QURR8^2pZ5O0?kԅewww=LtCg4љpS֛* zצNPWC5ƍխ,lt;ks($w)It\| BK2vɤr\~駂l\!} U Lϰ9ST8_ JvZW, 3/H^sQZ]EYYT?5ollUeԋ(PsίJ`{YhVw56%jmY|}vxss38h}D=ǒ??_~ѣG $񨵶W&<`ū %Ic-8ɹjK?"%7ǏV?{Wî{nnO=Kk(U]nݽ W+w`Y5WԵnVx9G"Ld40߽~P #"2$ª)`옦2,+'>.#7/w>釟2:7t[+\rGZPu&?lqw4T4q[f͵ms͛g'lw tHY}y,޼J _ΖLיmȳg~z{ [6HCrkgJ$|l`oܸ{F9z>|tFnZC>bRV>W1R=~-*/.rMG%%p}E1G|+KpijQP4䄃;9֗SI@AsS|蒺,כ3x,xhY}{g1v-885)99?|ӀJq5@-W#F>(+ O>Ƒݴ_A#a{vZ[fo]8+uqvRK9?5(n6[4e >G'N4R:ztp<]j$Z[[,Xp!hk5tᅬI?~\#7斪mHu0u F!Mk7oR.ys+Je9F1ȒbD#̹ȍkiid=؝n5rL*3M6O3h i$̑[7S e'4sSJZApѣG_~ܫP9t)ro*-ea {Hg'YձvQ˞nw$+SXH]#o*ᴡr?r5R繽ת =x \;jFio]vv+|kdQ\,<(nk{UU#W/eO|\e5~---UA&!208VaPEid5k pnР SYVSSĈ k$lXv9@#Ȋʼn 5ncɡFFo^OO#cb5J52xln 3M{Ylz%EmRΟ!FGmUeX [i,58&o/4řF*cUC]#ܐ0Wۚkd[ZZ3FU[WWħn -5W5F-l7W9W}u:AU##69'>~UVM:8$ΛG Ξ2d.41F4F;?:nM)r7SQ TWu?J%){pV#Kq:Bk$lANfnO)Z#-۳s>}hdQ52~h)Z7y5 9'Vt #?Vo/pSR#gʍP?agpm:rT'>OksR#ґ/DHĈDNrYf&|O1E\UVJ>΀Jp(t[kUںz>OF"{wNiiihA>%s8b FF 3352jz5R#j[)o8'jʼn HX"YA]#Ln\#M2m9Și؝u\4b3&iI#agj=T(2tw}M,T7FȈWȄZC1H T{44(u^ڽ$+f>H'> Mw&^#uo+kELKGtRdRS$-$U[ !TU#cvmO|55oo?z8LLL~WϏ> 8OK"ož1I#G:YYV@#l֔"a1iȱ4rPhEq26v1 #U52F"m1Ȃk=7WQ42`vu.-բF*{.YFNOSljy9c a=Rup$:1\YD+L UR#v0 ]ZMeCMNQu:V>O|֭[k e Y* D9`;ܟ:ppCH1qnqwo|F~ۧ/X׿uݻw嗨L!oq6rSFr9sZoԿyɌ5Fڶc\Or (\_.}'FܹSOOɓAߍ 5$83fl^$ӣNيFFo̭)^辝4r}9~4$8HIJ2NCW,~s UL:ohdQF''*\f,37ss;-٦9}!++a+s`Ir]}A W1 5V4LFF+)be;8kA#'RtKتY.WPSZCG( O|4@@knѶ&G~!ekuw36QUL4D4557^>OD#^#ե;w ŹF2Hfc2;pi]'>@42-tʤ|V#2ae99Fp8q i@n>)S]]EToj)%O%D"F&8$d\JZ\1@iZ*V#c V22jr`X.bHw7Yhqfiӫۥ*n,(ו}'>O?ymnSjd]]+$'Iy>w52̩՞ExF&_8 x'>~4/k]#hdVnM FT gp΀ci\C`'#!Kc<=|̜#QTKX,#1ˠ\j䞝4i$bZi6߿wm$۾<}6΄afa33ɖ-˲,da8Ɏ3 NܮZm*ٚߧ쉷,ҷj$ogej~vx&:z,tGLJ5hTN|V̝ 4wHMCX}KQb, `0N=FG5߂7cؿ!ɰeZ=%97΢|ϖjdvx`0ߏFB_L&hEAFΙ֔ yf҅5ONm4,ёpuȁk'O>B#w E ELJ52@I6I{,L#'w?HZ51fpN{#GdjdN?t9I?kؤFҽ޶ VoA5'V-i&P77C{1}<ź^RtcH i3mDC51A9Ќ5rڤ/?,s| !Ez{ɡTW~̜}$M_Ikby_#eVi=m5qSK52~ߒU =6?FZ,ϱFΟ`W5)&ԣ6[{0Pڏ䤈}Hxe'bXFZigi$px2K|Ҵg^IN?~tHKT$T p9I77oބ[9jdʲESR4jd9;N iYN{3el _#,-;C̝2vNWQ:R} x-5룖^[_ze}=TRVdV,PH( _9q#s {HG_#UkXdc9\@V-a=:iCH|Fnr(XgT# 56Wl5RI ^|\ȪKGHd2bxk&ڣG jI~K1 jd_hda!o&=zZ#e JMyH2Wg0+D ,Nֳ||![ P GCy@Y#/_dECzڲ%4r(ׯ_uU#'gԔOoܸA} Yb00i5X__ Z"52mȄxYA7+: 555Z527Wx[ka Ҍk/JGU§˗/x`0V`_P#;y$TI#$2y55Vt+eSix^O|?3g5Ҭ61Ⱦ=V>]4LPIYaFvnU 7H1\F҈F^ 8Kida5{G^IW0O˨2HO+S#hspI/{9-3⨑T,bj$_EEE} , C栫? YVtd5+b0L SQCµk ՞KFD&#kVQwgOF-_5ĎR 5R{>~HN5ҤY#.DٱUFRoQCi8rvpk[>)R!e ZFB?e+u*ȁUWWЛFBk$#[F(P*S#gMK [rf ؟?O:jdD#hn<_'+ .Ȭ,(9ӡksG5~8jjjdZJG`0/ԣFzq465ԗJ $2' Ffnݤet[.5f`Fr.*RYYY#1 ޽{'iVN?kgz=| bo1? TҎ2DB#i)2K>GE42n-eO9s&E٧k6FB% ?53FkOx&Lr- 8f8rQ#sϜ"y&\T5vzȠ-kdD#ʚ;;WVS^:'b0L LFzqܡo-֭\d@O-aTAJz0wm[idNDK#鮇e?r'~i8".Ѝ3<ʹf}ϳF:oFw}˝r&0эCl'ui "W6+i>F:idȡ4vI]F2Hxgn"S#sϊ.^YmV(oF]D4-_姢S]aE#j 4r0k#Q4TPQ:ƍx`0VH/_謆ӮP^Xddn\/y-Pއھz RdH6*Ab0?F \欑95dcuMh53N k}$½-9{zvj͐M  PNmid^(F#i>4W78[fbF礑0Qaލ]Eׯ~Qj?ݤKi$OԤkV)CF^UiD#Ϝ#g,zPTt֖(1 ^V1jŋdlj*B"amŌ" F?~+gxZ"åڭ#j$>5֭[D#s |52h۷kMn3=Y#iwIcEܾE?9k$}LڥT#yh.mi.+NMadl5UgcGHj̻=j$\y2501.[FYܱQ#NމZ42kZbq^h` Ttj52KF܁ ޽@k KGs0;ū-X4Fzk,@u@D&o»u>EFs|s)8P}(y`P#y]Fy=Q&42cIq,瘿g ⧌غiNXQZ*V|tu0]#5[{y4UVN1J@Q41d@jfM6_Zr3|isuFZ"Hc4rz'& R)_8+_##Mj"hҕJ[AJJGްHֆb0Lʇ\Cx@5RrzMB"QBk[3t-02f`5Z6FF&ȁ}Tl2`0/\i .tMtel^#yD#MmдXyecg+Oj$l k~X2GGuKs6IdۣX#mVFMI#x?*cP*vYJԔr7azE6wȂ25:E#7oT Veۂ5h$//kdDxid^XE7l6yn `0[b^T#؁߸!(ẃWZD#Nԓ'OȎ=|MF 5O`}yy52[Fn^#R=5nL1YM+vpDQ#?}$j#rv&ܳ~8Wyt<3SkҲSbNJ|U9n8^E4rGx F #S#黷҉ӧ85IiMQ# !Mu,FH_>%ާ\={Fk+*MvY x-FzqܢWGqzMoGib'{[D#SW箥Hjdx{|)\Ɍ+?Fuuu*!tܾ)}=㙓5vgN5L#}qb.5zl%*JKIO-vܵM>i "?Y &P2FB& jD*#X0!<-y'i5Т[U|o߾M52DF&6̻zYFG ܱ-VQ).I?ϟ? .w2FAϞ=~^+'CK>2VT%-䋘09X>|Pqǩ`P# Uk ,52KiVȝk$]ǘ{G̓̉sN K;bCI .ʋ ]k$=FDN#sN#c`X5pRf@fM⥑*Z"#6(e| #cG%<-Q-_3}r:wXU%//H(Ѐ^ iwFRͫQ 517q8?4سFf))i$//.V-߼y:F椑ikV9j:MN9T#aûƙs9idar{|QxOB=dj1xKZᦢ3e{ ';j$޴QF;ȗ]$2RF5q152𧿉] ǎlE \W*[j 'P#5~fNoT0AHd2w턩T´I-]O>Y`$Ν)̝|E8Ad?+JE4Z }{%C=j^qz5r\Q#tH5Xzi52ux2f0us+HFm(HȸX3dlgBdjdޥHY eD&8)5omqG.ՂUqJ5ȩ;|'iRS#Ɋ*/pf%*³F+o?Q#+ꬑ-=j䯿J6;?#葃42e"Q#'Rͤ+wEY}ʁW^8X#u,_I#=G2>y%iLY,ı{OP8P娑~*MyzV0R1(9QF/'~8ʕ*K(sj F8-?Dx@5_d؋s B"E~ b[J# [|1#C/q`P#[F 52CO#t:-*ǏFaYYã~(Vh$Ι.jN}_~z iK}T#DŽ/1Tl7i:ܕ&^"yR,NKu<8r4V6=gNHȜF G q9U*ݔd̨ahdi3WiH3ݳ6t,-Q!b@Qj L !723xjd굑9ǎ27%+]Y#ɾ k4fM+d r4R$֣;qF&/'jq42mHFk#j%}42mrN vrklob  B"hOޮ ׾fIC)̮]{tYPh$](d\bZؤq52*H}1?y*R# KMMo5`0?_K&:wF x.„\xp[f&B"{sHHh%ɰ\w-[FZ"#z~1wz5k{S*N#R=jCغI)ŊS'8kdt#5ܶIs9%Fsg9k:Ln<ҡ }ʧI` 5rN vg Gj۷o喩L44,(p9O[KD^hdǟ?-ФT@i|jRegȤYӛ=cGժ_P+&tcO x?pQAhljaN{AxB"Q m1:k)BL^!ÿ)scASj;w5/qZh"ÔSvqZgP2oЈ4iD'K[5oX+Es5r4/sȦ Ԗ>x*6契WHܳk!\>C!<-f`ȈڥjȂ 6+jdD^_![FRIg4wxcVr>焣}@iH׏`0E5+Hik̷sOGHd2Jssɔ5%(Rũ)>gw>}5ݏR, 5k$,QŔ4)%%tP2wnЈ0id'KyRLYI#{P]3cd%I,=:L# ֑FFF(Hݾx[6rHcxFǰ6WHݺjF%ΘھC$kF*j9Z40<\Ţ>Q#kP^UF SA<Ns7ww JGޥ#t$`={F^wF޻wӫY[[K9K#$jsgIkG j$Ǐ}hˋ\j|F @mFҪh5ale=kd0߻@#fi'K)ҩEsvF6uNZ8GHFbeAX˧T#aFnK#i?r 5:)S#;ër4ayWvvjkȈ=H+ -I42*RF&isDKyj4r<7GX{ +(;VUQqOI*zě ӂ-9u^7U!nط&M}dnX3eȈTw"h{LY\jd%_| RcH{ TܱFB+k#?|C25pI[iϯ}Bڹ]##!YVQ#|s识I5}p4ROY4.?|5+t/)`0[^ no޼BHd2Gd2v԰ȘC4lMj+K,Y}n'Ad \SXTӧ^.]`nJGs3LI{4Go.d9nO$Ȍ42Gȉbʔ UjdS>X #)]N2o_G=+58!A{ ,EF9 Exi$.[?[-/+,U^:_kQ x ػS}<VMྦྷD&$;g`Ȕ [|kIR nOAl V+_lU,75edKJf{295tK;ksr։ݸqCå߷I#TFڛG%UFJ52knNi8zW f;2Hi{;%c˩Z6-kt4juȘC,,ԪIIry4Q4f#/usoZ^VtR~HaTѻ65`T ֣FF !$2Pt5Ra˗/T#C:J 5U^zEl^H{1`& ZwQgNâF'.V\sϟSCOx51HЯhdACῤZR#lj+#~2o!T#W8g/'>B䇇2mGnhh`7C25ҚWSU8++,t1#Q#)*>AaT y4)HK-ssSNZ^֯_Ԑ6JKGr`0P#{T#\I5Sō9Ffp=sJ"Ȱ }j$y*-媑Uz b6v)+,𬑧HœcbFҚ~5࠾R4v葃E\N#cƈ+#~t[HeIj:id}42~-5VY]]MJ!S#KyZK\NMdp~Fƍ'+ffiKO˗j42-MF"]*Jj$͘rէJ"i"ґ> `4 m:$Kvr)3%jV_FFOś5R|)(,/F(!A5XyqG9@4DFD"\d\M.H]h_׭RĶ;QC3ȍF*ȼK|IJ॑ێ%*#6w*̨e,4HhG ̟rgԔ먑CTb%acc#tymSL#Gi#lW\2Q[VtRܰ`0-XP5A'3 ܇(-EHd2 i9ql jtZ⦋)|5#dkj܋`O]**j$݁uܔ7MQ qQ#v^ᬑG۵a=:I5x$<͐ =jX2}u=Bl=l㖾~5bKWK5FB(I0HvM *"#֔i\N,Θ[o4%,5he4qk#ˊ Gi*7mSVU#_~Wa ~~#HNf8]RUCHd2̗/۬toAd{/OJ52z_1 jd+O>Wf/h R59mQș}vdeccc T#79X'p:ui5~dT#M^]CN v b?r5Խ{?}pb02vPFƍrVăPwȄPIvV=~YNQ#? 4֭[ ] 瞂@MJJG^]~b0 k)A<j7=-!!L5=Lss["ag[Ҳi/~:{1_|@]zG_Uh$Dg*=j^!R0iQ#{un:ڹcGj$wAdl٠R#mwbF ~RW.'OOW;id4&ıȵXi)S#Lkd.jE8gX5Ԙ-jdFz<~Lȟ@# FnX ҮULݿ_x6|EKG޼y ghQ#9GT#85oD6 {j$<*d/)w:ܴR4:idLeƶM42r2fp| yzYJ527sN㥑LQbGN[MVkN<]#,STUAOGL?Z5dRqJejcbՠ6P|QڴA9vDX]t,`0^|J#j$@5ܼySx| Ƅqdߒٵ< ᛔoX>|Hލ{vJ52a4`s"97238jͦk,ёM)礸ʣ"yFhM[;Yb5R_F懇:kd?Le掭*5r2vH-y(BX#):i N fk$]z]=貗"S#WCºwsÇ"|ȡHJtE,=MF*T5idz 8 !kdi.3 O0u~QErugK h O}ܥd6i%j˖_|֭nA$.ഞ_44409B{EEJKG2P 4}A?nŽxEQqM4-Q޹C8}r jd܄s H߰V0gFF޸qT⩑VuMDЋ@{Ӑ5oT ҩ}봓%fQ#nYAK,LsȰ2=;idxnbߓIcyH/fIF?N{4'L[hdzGNYXx;wh=zvȬ}{,3,DюjqRF,/,TQӧ} #3mqse`n++IWb! rI-j$q^?ur٥F#B"aH~ZP#Q}}=YOV`P#}T#oݺE42Q#D#_xٗu17,o_#'/j:󓌍ejdޥ R%%Ō,kuuo^*a bj$VGE8,֮]*H\kʏtW/VYYt Q6@<qMCΝEHd29? iYܾGۤn¹Rضau  1rbMɣ3~.'^7V#F}봓%f)֥H[Y#TfڧR#w{~NJ5p;y/rdQ8VdRq%-_*S#-RZ"#\N'ՁW GѻE15LF Z4Z+vk/_#m9QSK 0n)/c05dP#9T#Uʊ R[̩H~G gOj~,`syy<5TB{5|xtF.jtyikZ)KDFPطN;k$0"EI.5nFo$n >r@Fvm'j̩ 4r8HEE5VQyW/Ea10Yi8UҜ25R KizT-\{Ffl& "j$:6͑XY@#ztTlrb߻AN^0ma"XqDiH`0^BwmԲi:VxO<0$;ԦMjdĊ`P#~Y7sHӧ*525)ej^RW-#!ONd&XYR#篣Fw7V!GH=]q?V)V9q^UN fXb4dZFFԐq250ܡ>{T $͛E那Ffn'pIIӧO42GF@# '"Q_ j#UX hF}Gb5t_ Q.fU|G&<^DhY^Td'FвY"<ׯ_܉F&H>F `EMaG,,T752=Fnd^, n㬑8kk R#+JlN1}nsdߞa}W]E#y @y}0?)|~/n5Ç,YQS#hdIFZW~k^$O 4mVSV,xh(s6Fvbmd%]R#VW-c]5uH#3h gLLऑQC7uY=ࣘT25 owQC],ҽ< vtHsU:}JF׬R~vW3hdBc^F+KiyW))ytpƋ2p͗/_`zӈs\S]dg#$2ZV#uO(%bY)Haز|_~YO4ѣGJ,1R2Q#F4Οue =^+2ljdX.vnff؟@%+4Ҿ2m -cQ#Qדyw:8id䠾mF# .}pL49dꨁ}]֊\hhh cF懑fZ42k)Z[[R#-mI*ƌ*_# b'i$7P JKGbE q2yTӃ̉_`IAT$B"aCcow7ϝX޿OjZ\jdL8ox`0߭FoץqHկ4bAk^P,*9qb2'=ׯjdDY#i}Ȧ6FOW׀#~5Ȳ`swӥH&,517efCz`4atY#`PK5AuG ٴ2}*N4=s玣Gr^Īm`.m*}Ji ,s ۴Q# b˙kMmZ5@FƎ!_#-ё>.NM~lϴOt+ =-oq,11B/\j$|ATFF OTA祑yD#id^#"$"j2M4^qy3=j$KZ0GѣEwNYN7JX"k$۴ɡ1+dVsmGL^m'CqИɇ.qiե_Tl ^] ikV:jdQrChaȸIchdx(pC]ׯ_%#kP_\`0>/^ CysYʓ'Ox0(XKa٧Gk˽?>/_/qёR `7M ^iҦE5r,qa)/7v(N~h'&̚q i7yT#C#iӜ(IWelR#G Si+:4ڲyidӎ.yt뮮kOFS"7Xb]NբwrK5Ѣ9w,7obMIO@#uKϴLiH~U0 M}P#yZ:KyWmRB"aKMȰ|w !-R .s@KmN+̿r!(Q-уy)jd/ 5OPY\bǏFڬ5r4Q#'rOyڃMÖc ##9qDK`caRL=:id%GTkdy |Hhqݗ erDHd0&~α-0>Ebrϟj$ѿ F20K#s5idEI sJ1&Eqx.aFfgۅQ9uGHIgh.7 ()QF&_l46?FF.^ <Mjޫ c]Fe3252aJWҗ.oI k[\#RW5R3 1 jdH#\k6sHoӰ9UhB:F]1. ?\BȁxK,=Rk$탣߳FNH#Ss<8Qf٧ۇ Š .JLfC@B%/8kFBO쭛hd.U;kQ#KJhd5Ĺ3kddUsxwclX5H*S#n;џ~`)Yf'y4WYR4o<{j,?[uݒt۷o`0<-:wzk0WO?-Q0:)6[л52s;Yox^FOk>1 j$@'nI#+*Sc$9}{ nŃ?4RN421Y#Ǐx n݆v ȴ+ G] rr|R(myK!+/'5e"}ï[FX#w^L>q ejdvm\r۰֥ ޥ)HxKlXI#hNU#Ɋߤsk hoZNYe^JJGBKG o:c0 Hn:;={+RGGHd2JU7cl?ܵ]PUE/H 'HhU]TK#v'^9i,R)4'QJ&'9qb5*cF[ f묑RҚ^#NCjdI4rLF0Ȯk$* 𗩑Y52oZs+qRıYN)/kZ-w&,+Ӥcy52$iOShYuOT'ațt!nS`0(5ۨs7ox&oAx8B"f34l ipwo644O>cFF 3Xa0H!ϟ?'i-椑ijw@#0 Ŋ(65ǿi0LMqѤכs|Rm^R#L-K^#iW#(_Y9nӧ(ȤY؟f㨑tGyl6K;M!argL4kd.gk߰bǍF#i U4nQw^rd<~̮b=_j8**yPґ #Pj$P[3ܓ' ֠ps'_<@| (`0۴f㥑f.gQ#X#Ǎ5r _EBELJ"`ĉ#Hs_jd-pUrHZfVЕp0CWA52i4e9s ПI#g!~֮V252{+#&~fYAwWiH3d_[CCh$ll|4=E՝JKGVѵV`0w(H>!jN/ھ !QH[0&6-i_ LSW.jdښva0?Foo*-ᦑZ5OlM)fpx>H~`t1Zf[F晄';_<% ۴w`0Hy-Ȳ2^k}~ߌ5rPQ#qOyWDmPY#=X&juY"zOdR%:sxnIgK52SqOF4J\঑Y -t)E,[<σFoџ4 b'FnҼ4X\jdpY#SFkdQx,5rlE0eUVȘQCYl잎8NFڨC"hN˺:`Q%4iKڻSiHR 5mr _hOr_|I+-)ZJ`0 pD64S#7oސyr^B"Q ۗºoqC{}͛7iԩRݥ>AixSjdh綌5r@x䔥 =h_?{#lQ##F^#߽{G\]j!n0IK?¤j5HzOdJʂ4rxGWԩN̘᜺ukHq25JwrVD'^r"C#@Uh\RL$s-i'OF;jN5RUԐ7Fc0 sΪA6jE˗<^gϞ LFINh #c^676CM/HXb`P#di4.IBiY#g JQC|L Ls81OWLJU0<+4 >hdajѺgO39tV+9n )c]jd늠NvbǍRկLH/47af\RhdDv ,-E# U252hdU52s6RcAhGoUp=Ց"˒q`0lkr75ۀ߿=zHxp lj:y/L>EWV.|j$tz 5ׯFyh *  ځ-(j;Q`-\h`ac'^#[PqZK=wڵFƐjE5M=Fu(c)c^IgSFszd)/)IуF曛mʕV{vkdXѤ!-f)>} m뭙xT^C2.)QZ:_ > rBF3SuUݻƒCH>Rfτ+k֠KJ3E"HS`0Hmjuq#3F3oa;2ȁ}V-s0A!Ggܤ .5tI B52-tcxͪZ#.gED#.RqcGH{̐,$4#ӽ?~TYQ\ 8ڲMun޳+, #5*8Q#u)ȭMMw#{w^c^z#1 5ӧdg4P䷼ eY}d[#X5hn#i<]__9T#{$| nn3[F"?»KSo7RsCffftcf&I%Y`ɲlYv;8Ûtw2$ϭsvYQTpʑYg͚SSyz4rղ4ڵq56Z0{Ah TAi ~444Wݲidy\\`C#z.^(Fݳ ]کE#i[kք1̷%ji$@rMH3u| :؂ RMobBǶ^L-kjjHB#ini#ij%wHz09b5wv@ !i b%BƝZo"Tgܥ4Ν;j;n= kOE|Iƨ@#!Oԧ{ pzQ(Hpٽn(VFd[}=;3}6͚"idR.݀iX.F~81k4Rl1iVq\Bi >H[|, ʦ|x_6,j/F#MQccIɞ2=tؕtwD+!hZj{?1PשFff1}E4L|2lO# W-S%aM /L8UHlu/( J`} i::TmG.A"QA* ő"ah-I~iU GPH#[uy*4R'FzXkDHΜܯ0 TTmCG19A i5O>1ѰY42?6,NXf2I42}@izi;&1߲ԦFp6:!F귒$h`=-ZK:H'4ʗF@2].4<;KGy|YRBhid";!˗u!Juxy8( D'ĵH#Uu%xLEE,K켞<}H# wP(HNw%od6C#Ⱦny1*,ͫ"42/Fj'w.ׄ'i37[FZ/_iC,ˁCY\ߏFęvrOfO#%sTdܿW$4p59$Z7JDݞ _>KөF2&'+&n [ *윗k a}h~Gu$-_JBPLwF06jZ%G$*VB#J6(Hnq j( iWV4^ ]4FɘFviIy}xI#-RQr9ĸ_6 FӱÂ4S3?))F lX4jWD#&C-IvrfNeJsy=bI$4>契{v rMnnz e42& yv4ҕ/4 ܵ]<[48sgNv<ҭ#=zWj bbmxi ڣVGM%*eKy"FBp>*/ (/F}Q(H̹jC#5i$u#m(FLt(Dȶ_Тk8WF&OH3YHGq&''1 Ԯ]-Fs{D#!m'wt4V^?ܾ}I#m1^Yyj-o,A;Apw~B#nj fSJ# e#;'OȧtWg9Rvic-knHJBPL^(F0Sq]i/?YaܵYDLj*i4wi$Tw}BPH#[\g/UFti>id6<ܾ9sI}{DLOW$S & GZBF49HjӅ7Cpܑʨ2)6DI}{!~&ol4XzrLI#],X4_pZM< 2ȬI]RFVEy]N)Pi,FΜ-3Q/OܹCu$0P(%1HF=]qwj83 WA>kGHv0S"xiid M%POB!lY4JeJ#3vǣ~4̥ Lp`X'r3tk7@Ϟ={FidMǏ4%K,MI"423 ~}EK)}zD#!m'o\[z4z2GI#VquR9kMu2{@p!TQ\K#N$hPJ#iuFV@#)6/F;sgԻ{tt$XG#/( \TH#UOg,#A"]Ey毶2 HsAPH#z9q./WF>Ŭ{wB9}`{w4|B_4kVHidScx\/e$vZɰOhFi4W7'իWih$c_4=ŊZcc#Cj"i$p̞8Vpfػ[0\:/̙1bB6d]gN˦U2xx5VWV ɓ'pફҭ#CP( %Uܚ OF0 R[%s<9= ;ڴKYLІ_ (2÷ uP(G#_xAhdE4KċgVCD# w?c0`]boGCMS.XXFVW!8ÏFqG#md9ٌI~&i4wwa9lZ4,Y|xG㈄"EzkJe"`3=L:oA}`_;'VtJi,Fgȧ:Rj:zH<̜@Z~N;1<~.7Y[SsOu$eqFEP( C HՐ 4wD|h·]&Bh$4d: {:{JR LAv Bh$PJ5h&)C=fUS]Mhai3gLhVRs Țj ü4ȣh&@Z߶E&{ @_TSl1-; dw(!eCއ>}lYO?$K#&4RQH#h4&yV>Ԓ #id:jVhn! }뷥XGQfHFP-."Ta<4RXIj/C|o Μ#F6a5[@Ի[APH# .jԢG6L>9SH꣒9~$O#:B#}O6}Mx;gF lwß:I#i$GyA>IkҊwlL#?Fi;+yi$oh(I#&FBE H~oM"eY4230 BMxԢ.۷R?XS4f O#)uɜ0nzX÷nw@O ȗFȮH˥ Fj )S TkT = %cph$u5,\regI97G$̣]0W555ld0|;GF/,X\4CkA494fc>!F (M^q`FJUUi-jxFP(%uU*z 4f"98,]!(mKϜ "xFPH#kgWS*|LB1#ai{e֤<Nmi$-X ]o޼ ތoFx]LA4_8 Q&lh$@;%O'[ؑ*HHѬYFfeʦеaOJI# -&Usd] `s R޲&5ŗF._BtNRIӝH].O#)42u<5k׬^vΝXGr]pBP( u*ظpǹ $2nހdGvyHO;cGidaLB!)Xa4R J O#?^4Ŋ]bS>F޸AecNm`џ/T&$F=Ml"64 ȽH 0GE# $mGS/I-Ή}ߺu`l"`D&%HTH#/Q3F?#F ?@`nڛ$XG[3BP 覼4R.3Rɓ'd ɀ1ӑC#6lG id&5bn BFJV 2ʨx9vs,43gOLCǃ:AEȻ g໤ H#w7@YNE#x2tM4+FR?5qJ4vװiiǏ?a4x\"N `= 6@;>֗FjVc,=]!r˳_*.^O#GΚ<^-Iuo|l?x\7EH#``a4lp0bp(\ܜ(ˢHJŭ.Izlg$YGgsu@Pֽo@z<4QH(dʇ~=oB7wfȔ>dfÇ ݺ)F!̆<P( ȕ/RF4R~^O9)3;F@h̆FffyT ɁLԢ4mGe-&\¥DH @#..ؒ{t#Ç4r/FY3M߿/F^V@#I-6Z̻ zڳƍnCxtKugBPW;H#Y۔Frӫ^Gx59cG#KT>I>Bhdԉ-Y-Ȃ勡 ( i/n4B#i˗/eIHUmt!42cH[_/@#Bs҆I#w\*QKIZFΙUۘosY6[4mRc-kܨ`g'O@/'/)HO#3c=9Q6:?RF{=UUHndO#^ LM%idi䈡a'^S 'ҭ#B #d:R h,F|5OC#mq1-a+]gH#t֊BFKՠWHN*JLFb 0ܹ3ZAE @<42g4jМCHݖظ&4U l D#iaO#ϟG#_~M,f42sp0^l |GSٞ]4z >{Z\TI |#e4r{Yʛ2 YQJI:gΑC#ʼn[s ]H#MǏrz)Q(H^9HkzY'Ftzy4'c0y4Rq-UU ]IZ\<_-Iv 1߲,-駟̰s5"idIOWsM\iVZ;mȘhOTB#++`rǏAI];|0AIH[|b 4H޲¥ ,WD#H^viz CѮ[ @g;ŸFfeɓ܂|AY޿~42wLkX4r%Kk-T ɹ{.8]T-Oh#̷l:!ɓ'$I4Ru0j})z ٸHS'J#i֬TFҴ2߲Ay4~&4 *aVWU[b~@z/,l޿O 4n&u W&%ɧ4ҥJ$hʄo2(͛7udyk:R{ B~בF2)Wc566Bl빳6Xgysfqz=?@"B4s~xԠu i"|҉Y^XF<ݖ 42''`4l9Kid "yl4r,Yc}Ǩud;9DZhSi:̚+DH`$Xe/ fs&W|/%P=h-J5x,FdpH:Iq]byZap^Q(JݥѬ\ !!D܀BFqFYV&/\Ei$si5aimq#bũidrb0.3d}IFwm47[kS3k<3N܎U=)Q*tNO#ׯUFBڎ[6+FB["i$MV l~-`B_FޥFoS6+SHKdZrha'r6Z)֑wu+W:BӧZ4Iל2ZHz=D&n'iE#H-ؼLFVK~O( i$WVqk'//]Ȝ)A㰫HC~c4r$?)4[Ο+Fzm*sLG#gՕ]3 Y`k6 }B#YhALMO#/^H+Fz<4cj6'Ի >@Cud-B.F2S%eV$2cFSڒG#F轆ׯ_SEFV9?$BFyհtG>\=42lwm>j(_8sTSɩ4xdS;oR٭#wD8RSHhc7E#iڎy[.޳Kr 5L$t[,M[[644Hپ4h 4rV%4dAnݒw T4BI5=䛎0M֑P(T ÇE-H ]sTGnCTDH+ojnPa(ΣP(-Fr:J4ӧR?PXʜ)9Ҡ*,ͳƐ;x9FΞO#ל dBPAHvI-,v~| 6[7#KT>i"!Q4Zu\S(L#rݻwxFPH#z*"h]^O#W.cΔJWYb O#/*⽻h _Krx2#H#4r|8 B4En<4PiՑ@E %*`:oDrM!~{n><ف(2͗{ 4ׯsowXϞFRd @- W/gΔJiLAaF+ΟO#/]F#!Ys P_~%Ffm*,G#3Ǐ9X X )ʔL#|C=zi;4rUsY_UY>p:2;"`K^&ȠiOhdi)97SD#TB#!ȝ.F=Qh$mgΟ?'mڠ^$hX566Jd) BP@A}=J#U*ZN,Q( UՕ"QxZid|6pc B. *R%4Rf{Uai<ƃh CE-Wt[6 H勀1hhަ`"4rF|ފ(sdK14xheq̷\u  nb42k.2%`Kv޸qS֤q4[FZ{]e42C>Ue94rἰZ*׻\#ikv}GP\% d7n5J>'r[ 0wFsrH#{t tGP,&sycɈiU̙$TK3' <|ŊAE3h$nkׯ0HidFG6+ȣcRV>o-a"Fb&ERFe-l {֙#F͞AlnpWe-}`uuuo ΙGHOJhv.;S<}ۂF#)+X kV,6{uUus [` .ٳgd) ^@e JX\ ^r( i?皹DiaM5Tڨ̙&T9ҼSIC4RN3^.H#KHȴ|nehd!<؇۸2K/ }UI =9=ܴ^e=)A$,\Xj׬\eYcF|B#+\G~JE4$q:jE42+S>-i$)P۷j/0݃,Q(Z77+hdmK,@6|psݣP(-F"j@#ldF6D1gJ pyƣ1FKi$qTނ94,+T8?6hdڰ+7Uܦ\ZdIM5h~h$p3ɞF[#Fa4GŻv\lg(a>1hE46idvlYN3i$e.\4LLl+_W"x!::E2<1P(&o$ HVqTgtV"KT>Jh!]%(Yxa'Oۜ#idƘ}BFF i* ::uֳ4ƺK -Iz[ؑ`4*rfOμ\h52i<:PZNhN'FZΑ 'ULgeR-H.޵C$4ј\kIl}424-YF^8/<4OH3SrYϞ0R>_~!J}wr>}J8D#!kƙ|˅+XlXN={i 6:үGnϟFڣ/C馼S asscEbo4F ;CA"Au4HlRBP!KEnܤekzu "HdMsl1#F `iG &FΝ ZQ(H+i5Y^=O#mfΔL'KCO#NAE7n n ׯ_ Ⱦ튶nI#Օܻ+EMUi41hvqv岧:T* o 4ҙ1{u~oO'K#:޹42O<~cp& #HQQ!:P(ڂ5uz| ֍xG)1i44>Ƿ hV|jy< P(ǎW\.h [3%Ȧ!4F Kh$tnmvC46l tӔ?v/L݅7ˣ؝#HRYR"Fb6asOD#5Qݱ - cD C1TKVpVK#ztĮ3HG||yuɧGh˯ ;)GB3sHΜVM+H?ghBF\oJ4,Fzm7HU)n$42y["t HQ) Hh } H{Z{v*F&cw2ǏR>osfdHHS*$m\S|KȠ4>tHYUHlf9w&Xp҇xٵF&hr=9] ,h[/F9%FKm䗻a]gqDP(5Ia7F2OO5X7m@|o ƌ4Yi$/_lѧ6$.-H#5QٗP(FNۭ,W]ۙ3bUMh7 ܴ8F47i{GhK]Fy۷ohdwM{Lً*F+왤mJ&0);,XܹHګ,ZP߿]ҧHYCb fK-U7MK#{JP$)(AQUA|ymkI6 <.U~w'Bҭ# ^Q(*&HFW^UiBp\dʇ]"F=ћ7oZ֭[ܷȝ;3F6oaBPYGzv'gd1vRianɁ`[lJ4v*KL<{ԃi"idMgE_ ls[HׯߔoFDvөFҚϟ+Z k鄮 Xxv1{ ?BRoܸA9S|ydlGP(۷os{H#tE"KT>KWḌOpK?w4q= Bri65iHQŅ[64Wah$u tL HoiH#;Տ42-*MGɤ؝S[!q$;hd|J4FZ*mY m"i$>gv'-<`^q:}id<BSB#!QJǀF&v FҠ];셲ɂv땕i j( L $i$*:6ډ,Q0LMi4RjH.H#-*^GPH#[1獢"4ҠFgΔt7}-"jty`WԮ_+Hײ4LH#cO#G#;+a E*,޵wr41^% i;n=>Y 6'EH=mw8m֐ TUv/=*JJhN9LI,.&=; M\ N W[G^~/( %((;47H`]fː%*3aگWH=\kR\B"֘J̎P(VL#z14Y__/1>ȞFn΅yIjIYvi25QMUje42gg,>gc2id[>v'wLJk$H!wOhdRJ4O)-e9Nz0C>4{%xlBQ\k]=oGX42s(2-VBY*"4W4l6 {w qJz/kJK:ݻwxMGP@]Jz!d1PRzH*o$dGyn.}Z]i(#ZG 4&H#K"a7 Bi4" idU H̙vFvmF!>l/Өl#i䚕+Rs[42ow[W'H#cO#OG#ccwV>o)4Z*o;9`hOIRFfNM9Ri$i&4|\ǾnC-سo+pY u(4E=O# hdrnh@Tb134Ȫ*\P(T0Ac,J#޽ƞ.D&n@H#aһ HGzZP(F#E!4|Lǎ0gJUpH!4˞I:sy9i$7;!};F0idʀ_^F$}_|N2i7|N¹-oOB#=4rf>9iZJ4Oq:Icw]R$DbΝ;f|25[^/_PK#JQ!~My4=zE4('!Fk5F/ >9г/:2tBP(N4z4hRI h7m=7R*Z;֜DHXp N"f<`\[ЗF&E:4lKyHT h>i #$wFԍ HNQ(۷pREd\){U ޤAdG񦍼̩H#ˏ?R]Q!H#+h{ѫWqn/9vD^KBٛR#1BVWFOO5v<կB|6_Nmai /an+w 0 B'p'ZZQ4|sTl1O#FRZ}r:}ڟF.'H#*idQTP42<魮,\Twj{KrΝ;hdʀÞF*WNO$۷oL6XpV| ۷o /{s}id¹`F҇ײR1H&6xYFzJNl,ukR#] ( !3:,#J#X+ F|nwbF#S3rn;*%4` B(fs" O#ϞfO#,; MF 44IZϟy 7?b|`4bUl_I4RZFD#钦FC$*O{*F69szsS%lӮ[5Μ4{W^B)s0&9tEOUJ!hbyxe<BP-x`w i$q` MJ8ghd8E`vȡbf~ HHl<P(~ɅL yyr sh>z C# F/ӀZi$ Зj|QFfϘ]A*FB->V&i֬`0umi~h䚕|aaJ42|ɘF,ee" #Ӈ v<֦; .6h% JGj/r4\O#KHH>HDx 4Ϝ# /PCnݺ%:*%Wv [#d1!觟SeY3`m߾%i$pK~zi DqM-f>|0 B)H \iJ< T!|B{p/s[,^ᦦy!,idނ0~4BsڷHӪ]Aeȕ||CN%Mۉo8I`MI#sgMGM&؎`˶cG&q42)Iy=5Y6!!:H=~4BWFzv;~ǘF'F'%KAIޫWHQlf9w&D5-&ڗFj/DgZB |[v!{,h$%c)IPk- Ϙ*5<]m!Q[]}Ou$wtOx b(ml@b@J `ر YQr34Ұww@ԫ 4@#պݬiFĞFG C#{u&%jviTZ,&ąp<id%G4z9SHZE۴%$l\`PF6B$tn8{`IPkp^$ԭS@yaAe-.{ ۹tїFriINVJ#4jQN#3Ǐ@#Ȝ\ fGdO̧߰jllhҭ#eGP(TTݮEtXj^WK{bD%u4|$>}O/Z@}/ye( i_FrwdID#4w]fNrfMi!Q^bBFKii$<*H#54h$823Hmt[60#JJQ%MIҞ1[B'GD]; ]YFze#snjHXJLPD#gN~;@zʀFN-F9fdf;޹s\#DBP-Q#&9H#FGXoM,Q4 9Q$7J㸏 pt '( i_F}\HM'ٵC$4=̽^`6g^n&49K#$42>N=Ka!O#m6E4YJqн.fGd !i`^n δ( tmҖ4RKiJxr-$2`DoLVπ9Gid!wBFF?ɪ>2hdF,sT=m|q#B.m 92 lёO#'n~QXȱ$s|!0mG#3WW6( R{"iz>{ 3%Ǐ[_i:rJhn B1э7H[ H:P] wd/!KT>t+ê[F&뺷o߶ 8tH#g" B!4RUFJidRsT5i|Ic$2 WNgfqŌq#}WPd Y J#ff/F;cȹidݮ6Lӝ1Y[3DHgiTyţG#}{-<.[߼ywOE 0\xJ #J#B` ` dʇKlӆ*]+id҅,BFP}}= 4qI2zi)QU͙194ʋʘ/Ȃ|0r#~[Yz֔41H- F#]XX/F:H*>6۔hd 4r`MV|/)}z$`{߽{K .R . 4Rk/FSJh~%SJ#HZ;wxYrOn93gޒbYK*5ӡP(T OF*)Tqѣ%2v:٤ȤyЩu*B9AŁ4p5YB߻w( i]7ՠ{,tR$Ri1˦V ǎ0$#o4i4rY]"\Ё+4~p-Ll7spe[ɂ&^An:_HK%4aE4r]R,WD#H6SiAȟoGE {dXGֶJ R"HRCx\!Pr8Dðm+g݃3 47eOH#wpzQ(WV4RO#ẜ`vv_pdWLWf Rʀ>444>K#mAvhYFH?6\+B?VF͇*  Rj\.4`4ppq|;o3N`݆UBkkH#V) ̊nF|XNmLit[=qHÁ}P(j/Zj6(F:su904o/2÷,1y8YQAm,i4y'Kh$=G4_~!;46F$ҬZۍwwe[%`o ښ+|i37H捡2Ȋ E4,[$FM'y"wG)لH<6fI#BsL io`leϚE %*9d)wF&#u{'O0n5زͰOhlH8L;w(;w(,{ in"Ik֬O#o*Trh$61Q+~$SQ(c⻋4Rh88fę,Q(7EG(x%H#mq1kBFF+.cIL)dO#Ks᪥i$D&LM~\1g@-o4UV dR&v˦Er<4ri4rP]کE#!9a4-{\.4vJ PP/ r+3O< ַn"aC 7mߦFEnRJ#HȨUin+i~qbKUC^Y)F^? N/(/+ݽ]4RѸAWq*Uy1],QoϚ42_/ [-uH#IB!TCS[QZ4ҥ0JUMkI425r,;7PErLQSF&%tȧ?z"YƅKIoJ wVFҴIcHc߼yy&)P\0OlszRܜ`+7g 2w _ yFƭ}{6gA:]Fܴ2^aCÇ#R Cud=tt٣P(TK׽{3F]ũdצ{%*G`ɝ6Ȥ Z]Dy-;|H#} P( id(fL#)z*1JUMkV4$O7`K穑cWL>Fz Jٛ6ȸOh$4ȦB#c.4˸pi4r`p٣J4vge163uHU)hG#59-lМS}ib!4rF%4|`?(ۈncx]O* Ctv߿?2/U'wv4.{֣PmHiSmnJdʇ#-z;L3}2 oܸ N/ޞ_Hg~.P(!u?z+Jh=]P[%FLL<.?)F#(%L#ic8'42?l66 Xb$>dvZ4SgOȞFھr 5\$r[P(/]s9 ֖!z=ן6YJ +;wdd ZdUixY'Fݡ@j)޽W+`Ҭ# ˣPyiH}`?}*D]RBl #6g,Ȳuw]3==3a0333333:Lff,Y`IY;@w] Nu$e묻vT*Uߗ`J _\([.7B!th$гjkYH&)#q?۷n zz?҆ H8 KchsGfJ#mN#s$&O${U+r#fP(Tx.@FX>;$QPY@~i )Zy~CH|^FBFO( idx .{B=SYBb+s[:n Hj_ʀ^<ܿoV??ۓF>}#zG+M44ao>WF#KRkHMfC#dBVf<ٽ΁,w7h$˙5=4xPG_}ݸq9}UnuuuۀF 'HݻwaH1*FΚR??X|G!LJ 42= =ikWˢI];F9sf0rE^ _a@^K\ -oN/XNTHz$ FXw)Dȹ9Y"@m: ሉfY[E^ׯ ԅI#o/BPH#}Y&4F hD;Y{{`IQjڰ4 ۷͊xC/)>s+D{?^L#mQH=yP򦽻 c+ԷW@ ~\ KV#/ ZA?*MJ#KvPՊ Q;fgGТĎméc1Q42kM B!so{bfN#'YիWު4ҙF Qe#}F=i?LJ#:7_yE{wfc[Fڢ#MgMNa XRӈFBNy̷\m~޹sIoȾ ƔZeLbt3QF3yybǡi42cHWj$~"f)eH%DP(T( (/"T+ ?ii/ݢP/42pbtB'L-P(ȏN#o޼In% idYvL#O54nt=+ u͇x=:/Lin~0]Vnٓ-$tj'v-?LF:cIÇH=9I飇rID<zSϟ?[2#/]W| I KH#UFzek$Q#/Pd42s̈O .;I#S( iAOWƜF>|P)/ׄF|aӁi$MgN= ~jYշntUF#!ִoWԧȳnܹ[(g_y~9ehܺY.\tοҊFҴ% o4+SJߵk} <$>rAĎmVn y7^%l!LІS&u.:p~42u Hp AO .:ZGPOR0riu^(goE~٨7';Z3s*qr%<00b>ߓFQ(Ȁ ;SY k*+Hi:s<\mHfpڱ+LK|aN#l*;RF#Op^+`C# Ʉide'L1D# i;Rh$AL,|Q½W喿x&FƵm!Hi ɭD}nida4PqˑC2hdHի lݸq_WTȰ;EB}:gWF*]5կ s^]\6\.d8 F(ڳӓFp BFBv%rFVUiB#͈8FOfLCz9zڵp5nH#…+4lNm,Գy:s\ ;G;G ӊFҴKoٙ 1=GH_4ٳg|KpYMn߾}Ծ_4['`q*idYJD*4HrIXt2wSi; $x"/[ :xGP߿ϝ!TSyy-rg9"KT\391i񇍑5mdžS( BB)t($V[]7㖣H[1J(Xi ;,+u뤺{.yȻvW6b0h|~hd `vhXF\bڵC6 hdƘ {Ud)4RS˗`Xe1!r{ O#[|#Ȥ]ۤF7SF'G=x٩TDL;l={䗭/^7VW':sS BI]?4RMiPjq-@`^G-Y3^lĠnXI#O&B]0 BGV_VƐF6ag K#\.MhdEM>A:sq<\۸EH۷o%^iddM44r:t^!z&f'ȦtZߍFf,)'uĄ4L[&wVQ(dq#?Z5aL0HgjJ:w/]I#͛xFPH#&0,i] Ӻ:Mh$T,>}2 ͫ4̞>4CNwt[L#_rJ#L7{M9I=;+{ ,iF'F`w:>V+I}0߲JijM"J2<G|ʭ 92BFGcS%Q~ǔȜle9{Z:LJ;K\BHK:L5jqAP F*]eT"}կG'id^C(y xȂKBPH# EWW3$ ݻ h$'-hΞL#w\)4F x Wwq>O#}М]Ȣظ&>c9_6֍FfMi;ױ1q?mI^YG _vH$9rsDoi{%.gF DáFRFw"0VFM[Y42C+2URBsHtey>ihh> Dt%R"TeTp71^,Q*̄"&WF̚I#kWS^ B@%hf_2gJ4X-2;aܕ 4NwvR\]v W "7nC#МݕH#t9lhdJʥj?oի0 ̷l H4=M"ʝ5]pI%K!S-4;361L96JYIH'+̶GGʠmW)Ww=\A5֑asBPRΓF*ZU>ӁӐ%2ԦIAM#4^7o #xH%ۙBF~j4ﱩeJ#I_۷_U ɴ4r{uuEF1p0cH42o\wҿBc+sqML"#eHٓFfOou. YGLDUt%{}WVFZ42c(V4R'Ȫ _jN#c[*wzceaj6( _#HE.u۵Y#!KTlDL#{tq3:ǏƝ$P(XbU427̙R4ZΛHHtw-={vUJ9+@a4q!4'e`oe4Ұm#(+cC#Iys\YYT$953sF44*-i9/9t+%Rk3;w@W0s!E]L#30x٤FV rXȓidz:kʠRj^?ˑ3ףGW{Au$zPOA߿-J#s dB~Ϙz5L#Ӈ 3ǘFI#MPIBF~,;].gE#/[8 $wi 4# ̓<si/zH-ŘRJ#a [`N#BsRUF# 7#4QK,I9~T64r4hdUƝۘo̩4޽{qnԫha|\*ު &n'WX(YƑ:ȨFLƹyT4T/Fƴ* #s1BDu ¦-B|Ip#4RѺFF`],Q2Y zL#''3as6uHOi8DN>B!/F H8kӌ=f4#o<`=Cv-ŠJ uW 62߰LWUqM%'˥tW9;gF4ҙmh4NnYæ HLyk_2t 42{D0YXFV[,;3eӧHv](F6JiI;z&ϙ cVn;_ӧFfeidlwZF:nQMid54Tδ42ҐRu*Ŷ+4-Wi䙓YSa#cG(K65yN.,7oF4v̇3߲9` zbS/TCޭ~?)bpyPFqy*6fe(#H\.?TgIWXG*]Q(*#R"TPQw6r:$_'Bcܶ9i$OxakOyBPH# \.Zh$PpSwwj˞F 4kvf`IPtkV?5ԍ.:SHbFfϘ#ȼsc5)FҁwwlF4vC EO]"'wuZe7\% bd!*id-} yN1#ߜ,4fa?9'ʕ+!t {6SD1r`KR8*/Ľ1ԯ#ХIjidm-7oި9À3metrM&+:y4~4t.!b{˰{٣P0֝;w0']X-h $NEpcOJJ|H{LAw9̞>I!lꮌoגAgI(FfF׬ԈFBNiܖ߿렅Qٲl+{Da'F5~5iqu떟o XcqF6m 42!^2I*4Ns_%4rXMЁ7W1֑~P(* x7F_U߿j?oddW v9L;K,?0&J#x<P(O?tFek/Գ {I+4P 6H:itz;]7xFVe81671̞9EBo͢3;dH:.hQЯ[~ޔd_śiNÇI1,XFfLc2V4ʣ̞Mӓ} irgdyh$gr/4roS;wB$ܸtr\6B#7׊FҴ[9[6l9rDeܺYhwcx6pbC͇ii?/EG- eXGhK?L( jhh F_X`SqYe;} ꖤ.F}G48ݚFgEb8_4gϞMeyhd&a@rH; A޿|vlՈF̷߰ 4//wA;FE;*ޜ#}[sF*8F.ϤjiG#irti~˗u!{wp:ZG01EP iу9h<(7Y*-o?%1={lll5\)ݾ}i_x~ 4۶i$ڏUC# 2xF?_%4rL4Lϟ?kdY֑:R@Pћ7oz4RX6wo߾FDvcږCF:R>^-ےaO2ǺGPH#CF2cK#TLԗ=p, 3GLF4:=׍.Bܚ| O6 ~zCdSY|B9/ln K#TS0⧉wԈFwD[֭YIB9of)wU 7[WVI-X~ZJbi#޶#h%Lh$ͪD4!5eh$F̛;K:PvXu%BI"e;F666j񹀯nG~̙n৑[_Xvi#+sEPH#?A)<\φFH9?s45i q DحC|wyAǾX/r:œ/^i`SYr227O#Yo\mBW FIa7iڻ[# i;d4rr4&d: L'dJÔw޼YjMOU`_aF:Hl!54Ҹb242)Q9sFO5y<P(z&4NG/ҥKl L <k]4rq ~6N/v qF1FuRv2L$u2x[LrL* ic;|pF4vJ3eׯ_!pgxk\Jƽ6H'j}{Ȣ5L42Y9,?A2id9 Z F$&pѣPA ֑( GOl矠&\I#sK7nB!"TddK#>*%}Lq^R@gؾhxپ0:F7/ܸ+sH4ɦpZ4ggBz=2ɦG{HˑCHȚ)fO#/C#aBƏs2w7{uB B1,%];H$R{4"I} -N#mOBK/_<2֑P(<4RzD` ;iDkh-n(>q,id yx% 3_EPH#ÏF^rHSY/M5=EL#f6nPE#w` t4j5H#mFo nY֑רut CH#eRy2kXD~9վ߶EBה;Mؑ4BwB! v;yF NF3gJMC{>O V.%q1m4;&ȦJ&P7cHB#%riin΁FPHH۩4oy4?DJkæ aE#$١:mvlb+שݻ:#C9li i'qVKUCC9b[G:?)8]P(T n!ӧZ|(P׭E~C ]AHn9W믿IWӆBׄB!XBTt{7O˞Fl[4/qs$Ј<ܶٝFn\'nТ9iW Q idlo٩F ݕƨo飇iR4ÉWF;0"[Ξ1X9)ȳsMJ7R04N֮VE#)Ff2-A#mńF_+FV.g?7VVJ־@#=z% A=yiگ^C3%_UUd+lH(wνA}=ihDP( \.8hdm-ׯ_+&cΔ 7o?[<$%4 nͣ^|^idrnwks}ȦJ&1m`6K##6٣iD#VYxDb;^!Ȋr-UC#mlhd*YGڷN#+qf42gT)9A.8$I#NB}P#H9&y@CYzD˼k'?L^w$o*cOHC 4R®Fd/_TB#OfO#׬zӼYGf LUӾn`21pݽQC(w ?n8F63oz6+K642!N+9nv1haW!vTV3 )3p (Udְd*y^x9id|V2h޷mN#'igrs| z\ ҝp"C๤ d#: : ~:7Ǭ˓Llf4ҙwsgc 4R`|U[ Y/2`4[[ӉO`iV_4Ӂ4rq%FB8jphdw-̚~%F Z4<cpԈFN̷1~f7oN^?~[7  C9uPh$)\@ 8&WM#sȎmdHt5&Ff6.ɷTBP]!H9i=~:oE~U=($ƴ3ǎ n*yٗ4,;KeBP(sB#].V4v-Hfgz_Fm=9׀ӧOimTO)`\RsgMUU RD՟ԳF§=S ,9wԃ(SE#}kbi$<6-F._ ]Cץ* / iPH9x񂠛 dn|(T . iܺɠMP x\%4V`BB!di`q)ۣȹHHhdi^QCլǏs}coFΛd+< ۱=F6uW-~ŵk[KIԯY%~J334S[] W <% IW9YF͚8WVmK)fxn;UȨHIlhd~zԳ YGN#v{{':2 P(T ^D)gݦ4kfzyxE~>D=NcF:@"< *+tQ6APH#%JH+`C#i?\y VM}n ioU4r@R2 tt(XG}Wx۝widYe4[_4_~msU+Ľ|avF427M۩aO# 駟'uDҥ_\OC)cP_[-_B#:hd|[!OUC#1L ȇYPF*Fy`t-F>&֑i >( 믿IruJ#52hdII!$h= pw=t&n+?( iD\^ϐFM`{I?Kҏ"_4N:>|=g`Խ"I75yh$P{tZd!ZJϮhn21yB#ss4=:iD#SńA fUܹ#ƥ~kMXLx}h|}ɪhd|$}0xhdr2hdn6E#! ~]r▗˵|%(*tereH!W}*߇,QSj=$P$JRɓp:ɀDY^W)GP(b544i(dC#i[W4rFzv&\X`QiIpkr367p?Uȁi$u$ƫUY~dȂ%ȽkfyN#)Ķ18.\<\w\"rr?믿)׸|oib -hdR.7Z%,KMeB#PwHҶ2tLO#ǎȢ!~(׻w o):rG(*tumRG)u,Rn.JӬ'\g'_"4hda9 AO@P(HOrbfC#iǏe0_=9{Gy ݾ'4nHmlrYS&mz_4Ҹ}[A-MJ#A4%Ye8O42}`_~G!-8'y-P( [r4xeMȡ 9)uE##!ΝFN#7834Vfz4Bsi$ ksHI#k>̥]K4#NMOj}m`SYFYKMlh$M1T̝5]S'|oɠٝ;2|ө*Smz=O&*I;~3ƎA#cITT,i=~T!GZȋ@P'Gæ@m`+a$gd*W޴)3 և 4ŽI& 7`j BF~JHj~(Ν; W+cHgF"y(u.4* ɔȑCŧNȳn@ ̇=h$,UN#iq42spy4rTO*)њF&vFvlFBnQ^'qe-CN)oi2id8!Pm6UëOa64r(4u(Y4r*p>_WwK2BO 7WB> Hi>ECr:%_VhwP'e4ܱ֮9cBF*# iܫO#ׯaO#iFGy1-"4//Fn1m otP(YI{UQZI= ԏn4lVE#@12h3t>F[ƒ#oPϣu$ 9p~4RںMiFP KT, , (|'[8Q(H 64ʥ|QX S1:lFQ^Ocp9wӁ}h$A|H* id)EcGɣS'yȚ2idRΌid^i$t:b%2% ŏJp:Ohoߢ+)dHPFV[,Lh$E=̚C#>V4n"eF>tMB%[Gr<~ (*EJ])%_@j\\i*4ǩҜFv-۷cF 6HF9rX\!9'm͑ 4#]L#s"GlnJYC)bU4SH˱W)ɲhdg?@TiTHz?GP \q." R[CyU܉-ڱ-TPdb^臁Ϝ0ƓFo q 4RSAuuhC9ܶ=SՄf̜E~ɘf_42#crGg^FVP(zI# ,*U62`k>%2Q0BHo27-+ ).]"e̸QJJQʔ4v9S4 ˳HKh଱HbrfMA##ѝ"F'{իtJ֑]CQ(ԯJNwH#"EYre 8QG.*42u@?7}0OYDP(8|-\. C@#۷0GU0UMhih-F`LӍL54)l/YI C<<呦jM9sA64L$Ff%No޼l idK8 >VhޜY3%Y*jCtڡS{$)AL#ibNyfJ YkWG#)͝3C:\rs:Qǽ= :~FP%(.#R\+ div(GӇ9nص)MCxHP(J#߿H] IXʽ{dp_4ƞF.w4m-O#SѝF"7[0B(KhdiN]%4b`9r Y9ӧȣGxH8ՌFo+:$k8,Qǧ*9"lt+Y,]@R4)~<P(z ,hMA|Ewv+ yuuuFmLÑO ՝Fv ׯlh$X^yyp;LO#&{eei$ 8ƆFqY3CؖjE#eAqN1pbJWhYo\7Wp?f;wVL#kWD4UN#KJTH~ʠXSYN,v膍Pud==F)P(TsG)i5bC#rƍ%_5t`$!>hqpM.{H{LO+Q(HYKFi#4UB#bzviyid|4q1fs ] PqeNFz%`B10ѧNɛ3SL6X\;u3Mid! 81S{IS{qr-s g}FnZOhdBJ)?3~w4//Fwl%yhdڠ~w~h /H葏(*97FJ[^2+7Yʕ=z$ܛ !i8Ƚyo*'ǏB!˗/i*bA#I۷|}‘tA`I;;a\`Vni>z/fF&'tSUF :s ]yfˣC_4m h$%'G|(YS^.pmK߿/(.U /="cbiض85ŪӦx WN#NU4/](FC|HFidFDX--UE#jid d? dn/NSZG'( A)aݧ4+Q)[e#KTlqQ!D#Kԓ'O$#LHE7ғF B@rjQO#/[n)%&4c4Q|491Ƹ-C){{ۓo0^W[Ff[964//FFvhoFBHtynԘt~,;W=EϜF~ggFGHnyʼ*Wų1 B)K9`1V%4t%&4cʀ42zta=q cl\ob^i'ެ^n=Aa%v$k[/^p;oXHGQ;|p5+%+wh1,>uΓ'…YHHPE#~j4`bi2ɥo?8]eIonBtH#%t_i #eK%]#ɽ2 6CJ+̾DP(RSN4Bheh9`ڶi5i$L !0r3+LNHH#4(d8! KH"hdRNHHɞ:=3b6]E;I[fjx}iǴoΰe#1s'W޽{ }FΑZcjhaBσV SI#iuᆵidR,4?/UUɵ ?z ~?7NFJXt_iM(s'M@r7x׮ !>b0iqih FyutNz 42i?Lhdi) iVL#ǏpӺ4Z%LtnsϦi0#W^idbHh=4s3e4ҙ ;+ˢ=ד7gh$͚ɞ>+MEn07o$VIBO\ 36*L{v [6i=& PE#.P|;4頑]t***J#4RhykŁCpu߽=Iǎ`h#LbۖmuYՎ_뤑&ȘamvF#]џ')C#I}MhЁ:ih$1_l<ʔC63f@耖G9;IVNO>Ōn&Ltr4I942bR)F!FZ>bid*:(ـ֑ *(oR)`<#4R5hJY{\G5 fɞ4 HQt4vt̸ 甧;24r|i^Nvp?F䑃 llZ1^lFsh$4D4K4 )mE#]<F?nE#k҅9=W۷י,( xi䉣Lwvhd3NKRN9j89N>fJ42+!;-_< Ak_}wgPB35 X/Kt̥#H ܨI#T?Q942rRqH2W\d42A7ܫ޷b#oȟ TTTYT[J#$HSɅƞ/Nݙ=Fcٵ3pwG#fLf|4- w0$F&&~ )cs89ڧ՝@#=ƏRFB˕=M>|;m@tI-c7:M 8GO'hjM{< FFmR~42G&T<~4rlF- ىs; 7=4FB*Zt4^x;>ݤ8Ka&(PgX  tѥԿSFn;AV+O#Iׯ_q*lb@9a CI>/C+G 7yQW,դC#wRF27&rhd6ތ:vX8eJ3Ȩ ّmVHR)VX4 ?-J#/D6X变#}цE#J"ЦP EFri$Idl(*4yY;̩ d423p.b[, l42r^ "# esL**B#h:F*bƢ-(tJ,QHrr>= F%[!UzݥM#}TQ>EF_^{;!2iB#~z v, bNȟF޳ٲMV`F 5˓F/[]>B#dhd#i4252]#K#s}ܹC'E#I:n92`@*l@hf& pq_dI#3q騝ez S&K#wn/Ǐ7nܐ`I F>~X=Vj=ҦGr=lv&wn`oi42cL2iuphM#OQFbAyI#@vfdSB8p~s?O6+942A^94ȡ!=sR88V j}{b#3 S߸G.&H2QP@Cmr`wŰhǸQc߸qP3y6 XX"H#vD礑ΎH{L43qψaz%8ȠuAV l,F9 ]u~8<|P,f@|߻wwSh$1K ٲI5'5zJsŝ¬hoߢfFGp#r|&Y42+!Z[ȢĪ+M߿gh䱣i$>-F3uG ٰN^`-1֑HՏ?H#**)&>42q\Uw ] C׮,Q3 ˜ F̞^;կ_M#׮,􏳩(T;)F4tMQ+d LUձO#cpwf_94,0xp@ofn#[-ֆFoZ] M#Cmf~hdwD++dM#i$OԢNfi&gք͛7c/78E[UF–l)F;T@ iۨa̩4X Z@3o]nyYNzy>P1Ue}Oh$9#6mE#OW*bMҎL#ipj29E#..&?~_))ijIEEU J#]k7߿W|4(SyS' dQSmjSJ>}Jgc***J#%|#FJj]ՠUɸp8i$h>05+ !8 Y.I>c+,&Fl hdQk'shI794lZ4ЪVH{M HF h+2ŸCϣDG{o.!t&4 xQ NVragMӦĝsGEEEEi@X/F P PF;|i^:il0K 9(tE|42^ޅ U/R(K0ZFFNTTTFJ IJHQ7 VVeaD'|i^_s0c:ik6ǴM42iDŽQhd.+WgEHj4rh$4%F`}ph+矰>}Bp9#޸qpa\|@X&F&^ C#OL#3;4؝c S Q}'#Cu$KEEEU@[R߸E.plɆ$he! ٰhdFD-@!|K#S}}T0)YLo|i5`F$x9|R \ÄH۷?P5K#} ] 0,lܳpQѦ+(HOK#%\ Hҽ7b 0 _9yӣ915cζr)R_Γ2>b1i42r 99)_9r.H} 2HW.SF&n;QG)O#ϝe,3:Jh?gВ|(.*F4fic \h.F&)h 424EȮ?n8ٯ7T{_+X7nPH**%x~H)wQc@UeGiޗlp&CxylB6Lrw-ĆTTTF-33wiAjЪph؝/K27ch٬\釗ds>`wEI_&IA֒tk)_p,XF.\B-邻D?cΞfi$  Z~fe߾}ЉOOM*6"r׋N}`s3Y4AA#njI?{V:tùi]6 0F,IK+EF#SQ֑Iۘ ]tH!=Rc<{ G)K?IgOOS'bτ[ <{-wԦ)>꙲RQQQYioidVLy/FJ.bhdp*4xO#I?Mi̝W:=pKΟG#̫Wt}\{422qo+id֮RFF>yLy LE \g^EqɞGN}vS,tЇ2P$) 24ZďN#vljY EW n--# `Hzw䲨 G\{erǔIPk}h<9* k "рL ֥HQBwxQF 42=$XI:ΤKp?9{Z^Df%{4> EĜ}>ȌLLne42W\Z% vOP|'mmBM=Yv5/K )#QWF ri$Jț7oStI"hdV̙;yXUAj M`H0GGK#ɒhAa5L磑 2MNF#W,58@f5SNM#I`?~6UFr3Ǐ0cĜ>)j-a3LzgHdFΟHi 2<H(xMUm'k:vy`@}ZŋlF>=D\#{@V۵jwf2ʥ㏊id#~+FB?Jobi$*"?Pt;3Sxu2ӧTTTG`OHokv Uɔ%'Þr5hdCo!Yq:id6y\+$4R[ͻAFfDFB#1L ʗ%~(a;9m"C#js #hN>3o&li4vM:$g'4CB6oPFƑ_s䑃00Vs{l}(V`R1,M>z~1=M&LLGا_A#IW@ 4gT4sn/MxHZSQQQ>4<'4Ejl0N ,QHvwg^ Fy~ {Ո4Rx OEEEEiN42'G㡷o>*R Z eH'8lvSNٞ:tG#ôxiƦo\i4|TrXM#ClRF^ 4nv׮A6a  MӦy6IyMQ*30C4$mGZWFܦ$v\V|{v4`=Ǐ5CW^DS2z:Nښ4{b\`۷og6$tːV*FΛ%Fƞ9]|߼yM'rsEXGs$p0翔F[dѠǏ Q(sm`n-6Dy-{P3M#m8:SQQQ)Y}Qri$is j^ zdKl.ɇ34r숼is.$dߵ=IO4Σ{89u\"FM]U݅iX {J4$]QFڎ=c{< (j]#~lH?y _3۷o 9_XgOh,-Ff@#mH0G#3#F]ja- ֑{@LbS?Ŵ NN棑v]ru?9si$kSa46w9Tv ٲ XFu#|CTm'EyI'O^@hٶ/~4Bd]+is$q:Q$~K!,Իk+B x,:25Uzs(ߑPGc;e2Go42r~N5LrŁ}4{) ()xs3)I&!F椥A.cǜ|i^c8 I.CC5+4q|4ҡg'F=|4 ޴Nd$X&=8H4tQ(~x TTT!HHXTACeGzP 13DFwᮘ@1U42hIEEEi 0!FIײՠUѧiݸ yFɖNsHc䑃dO>:| vVuK(̳ ݾEt19ifFE59FƜ>n;~Hm p} d!hp"+yN%: u?NFgLytVF:KigN,42/K#}OyzA~7=]uk*PQQQ Գgp$< *ُ@@`sD#Dok_cJ#!R ZEid~wd˥(琿kԠUQǎ Ҧ~ C[FʖNsHcā|4}ΒO^973|v4rH_XD ]pqHlhy6=wV% v҂+:k?9VZ`f[>0^@yO޼y#\Ԥaћ,F*k0G#S`rG#,lV,;Rk3_&:17gGFZy++B-S(sX?l0DlTN5`3o6 ߳:iSQQQ)S'ʤ7H$5h[U}] 4/tnpCy[4t⣑U㣑NKyޝh 򷛯9SYbidc^8n;!9`9UY{O(heFG߾} [MUo܅s42|N\ F)OBaK8-\mJ8&C6K#G0?~Xq %E OIEEU O(M 7?tՀe\eacΙa4}B$QzϘM#bN.HbkweH]+Δ7 Zy![6B# JqHc]sghDy{HLSo73q4$rhdܥ jHm'=,T5/[ݨHv\8NZ@.;1-g4idilo'F,4/%ityDZLNeA }>=~XuctВ2!F h-0%Nc.D#v:ir3 sxm}⨦a>֓ O#_|)Fv8S cڱ~i=nUhȮJwpi$q/Hƽ{La8>,ȼJYa$FF9Y^ v2"•K;Sg=X`)v~-&r1z9Q@42(t,dPC,FuZLt7rXΙ$8Uoeg I#E,RP(~ƖFFM/8 ,QHSS 4[¤[p42;_***J#)C#CCdH$F:<#vO,`@îsۼ]s*!>3o>|4) <|@d+}LݼfL42%Y4Agэ7p93B#UӀ2$GGhoVQ!jd6tAlU FʹwBHQlZQřKO׮đ3C#;~͖NsH#tO+v. ui-ٳK8%ȼJy3o7ϩAXypfo~ 8U 3_yI-eyOTb8x{EqHC'42,~2x,磮Ԕ#\ecG[{42!{,Xm@#!R/x_u$Ʉ/YTTTYp/#B#>|Ɩn'OP(wLE( a^eH?mqЯ(#(x.F&u`icHr$eā0ݕa[\ieXJG# h$x <~Dt0bxtIOM#A#D#NflJk e"Ϙ:9 C{p&po ȰU+!gh|УOm[%̘&DEJpwy'#CudL%b+k4R[YAHĶ'A0۶( é_/m~+:'SQQQ)G^nGFȢIIb;C#{wW)nЌӼ1tg[:!n䣑g#4k;Ƌ1i4Ҿ3nG?Xwf&U>fqHpnE \S}|/_<'So&D4,ܸqC)dIG%NwN#3bYc_-WF8[oΦ)TTTE޽ :mqT*hbe-0_hf4J qF_WmU\OEEEidаvt<(F~yԧ4r+Ы~tdt6 uo\G#4Ǐs,$iHLaxid7B3m ?M#A#բcIWq6YV& NN,<Ɯ9̘*ٳgNM`wγgkEqQ4]ػw@#߾~^/i֑>` :_4g$WO5FAe<l# F&vl]42͛7tN4R}+zvlӤNF>%FFlmoݺ0pC#ᡀqw42#:{vI)^E8~j(H****eH]޽SigR($YYN(L ,8ﹹ("[SCEEEitm\<RY8,Pg4CT_i"GuFhd :Lax3id'&Bex-FܮFE#Iט=ʖq}YV4Ӥw/~O`jYFƒeMfyxȧN}{Qx߻[, 2o%XG474H] Zh ,S<)K?2Ӵ@Ehd{ajr$'=]'hSQQQ܊E#HgJ~XX褑9BHv7dHHBY P?s8-LKɊsHEN hdԱ:J ۥFuIH#xfк am K#+Z4r@趣#1,0F JZyߺu 5u_ s攨d< \LFB6`̾=rhdL14G>Dp_@#|[OnhtAEE .1Sc@Km5)K?YqOq }\M#ۥ>9H9?rhq<ĠWA3%6dp>4rL#"1"F.Y G#O>FBU4jZ-*wdhPQ42dzM믿h9đ dYpl{1 P8A!v]HFfDc{,w |&5@##5Q{8%%dAFj]F=B~A%8xˈ067zhANruѦ= m& 4Rm)C#G VF1幑}2d\:mk!~|42I$MsHm7W`um.FZEOhdpZ4?mǾ[55_܆(8a!DG槟~xFȨ(\sh|NO42hƜ<.F}h޽{#TI#Mo#J#3B#U${;Jt7\o(I6td &tB4R]ʒE#cHti>f~:̸Xid%&byՖK#1qȸ9?tL8ɤ!t =B ^FF2ϡ!*H>=s:0=֜(dy͉I43=58)̝-I#3cc0n%F< ,??Y42'!N#S|0tjH 4pCaaaAih[nz4RVQ4wlMEzGZmC#cI?'o4__4+9%F[M^o抰$TTTT* =4Rk'ыJjw~[,)N9BVb׮2\H// k칳4}NOEEEEi4+FHgh*6c|hޘ&%L#DG{.4hd:"h$i&FЭJqDȠ+4߾} 8*H>ڱWW 5x{ Y9==;1QO D̞I#qiK942Qea G#Q>~pF3hdʚg>|TeSQQQ 1s4Rk!ыJ-8Q">Hӧ.jto/84cX\Kr6(wkhd }ǚ(Nenpt-C#ǍTFCp[h$!I\!W۷⣑n:꣑I8K:$Γa;^ljq{̘hd^=CΟj3AkZ@_%d}6/4i$$FlC#OTFʧ Ix]8'F͡/OYY­#ڷoJmMKi޽S||ft4eG:1J7\FN:?B<[ľ=4gtͻ****J#刡!i( u@#=ƏRV̛ȩzD Ȋ<{R?{ݯ^{@wwx i i^_Ѵ5ʦ y1Xw8YæwYޤ~kmhS^bi[wM:իW?xF_To_Ҹzm:}VTL6kL7Ƹ_߾Mj}ysȄsxO>;wʦOxqcc:u긺‹666 .422jԨQ-ב"""Fׯ߶UVӷM93-9Fڌ3Vj卫Uע1PGTSٯ42$\Ҿ GU˫}z}dgl4ї6'wѦ^S&y󦳳3/gS+W={6zQs\_~MLLv܉V%ǎ۽{w8uf͚5m͖O]~1c䐶>K,4i҅ Xggv툮]O#=zϼyfv~Fuaaa$&7Τׂ?ؘO2yĈ?GtutwY`O8!x$=[Oy MfO̎HܽaF |F#\ǛhΞBWstMG,1} k-[h5 ի{l J~SPϲ^FkDänmQhX0aXB's֒/YѣGo˖-N5k֬AQPPЇ,1rqVZy1-\qCƃjVt)mHY8 ݏOn/hZt e9(xnPtU6۽sfUDɵVFՒ%,_IC#C9>*]J.V~7Y|YqMʖ^XFbQ,SVZ8j:ެ|Euk+^lTsjW\tHB[mj٤Ir-+l-N#mƎZuŊmьE-T6iPZhnxCj~a6+[f\Zk5j^Z_ȡ}z,n%dXEcւ1Nr%/h@Л^;k6gX蓟3HNJݬͪ.z Z>66vŊh/_DUf\z U uZwػwoݼyssss??Yfխ[8SLtioo_d /nڰaj}[+++}7ٺU%Ul6wcKڡFU˖9d>y<[J3g8::vf,,,ڵkN *TX}M"]tArƌ辘}=55hccb2KY94)WKY ̎ jZD۰NŊ}U^ը^,a۶v-SM]+Wdid"g7[+QbnZhXzu>XvJn1^:^ 0<ǍF{!Їxbڵїz_|qeի [E{?iӦh|jԨ;lٲJZnW.\(V~5d)thmhUM0͛^:x'N۷/G^#P,mmm*%%Eg>zUތPJٱWΓML$&F;9UTiǪU֯S晝;:l`BgFy͚5DO>˖-rBA{c-Z@۷ooРfGׯ_ނ%hw'A0p7]|qcL^ i}#t.W 722BwpNʕ+KgKڵGhlڴ -q,`ݻkY 8qbРAWg6kM s:O!ظaq[׬emc ^-R4o6l؀Μ=5~6mڠiSz$V<@ׯfk5 ۰Mоӿ/emݺ6Ƭ_kY∺9/m: M(:g-E= ={JC={411?ՠjժRe4iuOxm˩ȡBoQxqFjy U"jNp CA4r\}jՄ'6[s Z-hAANR&66]J/ޤB_X$礱QQQJbSJ233իǒIt?+Vܼy34ij7lVĎ 5Q⼮]9OKz‹۷ЬH Q,j*UV֤I!CnTΝ^]vFXxZN.ժVY5z4ű=zU6nܸVyidf&چʕxmJ%JiToW쩺E#t\lӜ ׅ]}=ҵؠ|ŭZph$<:t( K(t̙e˖// vҤIɓϞ=Yӧ۷/V{[ݴiS???ؒh_c EV^G |||ܸq;v^BS ZhؼD`G^^^,0YWu]=;u|Ƞ˗˖)0.n ט Iu$]^uP6\Zn=e6\G7ѭ7z#vӧñ E>i {.>8\1&|/k4ʾ?w^s-%[l?iٙo9dFa/_|;GЭ::YҥGzSpnjzbNkX~=|RQ U2kVi)###=4U24h[cQČZtypsȎU*-l`d횢hiZW*,9E!nlƹOhn8/^<--Mi(t`Xbl܎֌~?prHAHߔ6 :uzBehΜ9-.]uV49ٓW4335j:CСiYDjqA֯_~6lղeP􊵵5{"#Y闞'm.j!7EFh5heݺu9zB[fMaÆ*e4._n\Z˖Ud#Ohԉ 4i۪т_4+[Z'ʳ\p&IMw^MrZ6>޲qeJOڕQrP.ɣ[94rFjd% VBb4FЋUK8ҴnIrG>M#gYG5(F^ƾshЇޠޜMTظb~Y7fKbpvIOצ-*VdjUתQD5eUjG#;W4KǼ2S'qhQʕF(YXRXL ÎyÇRy[VM*GՈת9?bt{9T;th4ߡu\٬q%7k5dɢ`۶EͤUK3i}OF&]^^^^Hڅaw`Z1s95gE`rAEQ0kN{'|i s==nu iW:!ZZ7o4fB""">S_4hTi^/qYرc/\e9I#)f:o`B/>}–?dƿOUn%PBF듕%^#ӨE{$_N%M6UV[ۀ-FFi)]#DplͲ׬Y#v &\UZno/<>'LjO[FcآV=;!%hd%b< ȴAAA͚4}]MLtjۼjjbT34{5l;ѭF4ɫyZ\a{ ~λ)_׮15e~ޫ2PTXԿeq [](@#AgNܔ4Ѥ1?>GvA'肊߶CakU6Iu4*r'7CoߞDA.H6~UӴcA}Ѫ̟cZFժn` 7wx65ϣa߼y3i$xFׯPYj[͚5dAjժTs(}`4&<$voӦY#v}&MVcwF5iպ9yѪQ*^ ds.pAzIڪ>Q:FF-ۿQ[15NW:zT \pa^Ѓ6.0OSkHn7oO_۴i3{/_2o[RR3^hsBBzӧOpP`4䱀B̙3ťKsݺu:[XX=zyFvQZӁ0옘S 3/)s'M1`L('HF ư֭[W-[}{+VxÇ|&---ׯ_O0ӧ"i*Fr<ŅgcGg}y4.[nd7hpmtmllЋpšaX'ϟ?tB&O,{{{-ƴ{W=Sğ_SR#>pɓǂZ5o>eQv@픔Rё"g?]zDP iSWj2xn5 :a: 9]F ;x?b=>ݡ:Ce^DÇ'33wug7oܻ{xG02޴il8ge$Lp=C}m۶M4^zÆ U)KKKKJJKt٦ j: p']Ǻu4fO׫`C#\YMԡu];!@NjszߑmXV;h1Owm*|@t0y ~iGL̻;m4׋/77nhgg>LMM%B\|9DZlXsNt 18oAH~ 5jQC&-[=`C8 D!y g/gϒhؓ]MMHB6mܼeӦ&&蓓j|tu$|}}h+ ~9q~':sXUrUV:t(8%o@#iAf >:e֭ SwA'O&'qؓ[f˺']޽{-ZĵeEW%<#t05kHgg`R<0ӗ/_EDyųg>޿hq66›[Ptꑂ{ ~$(/Ζ$U 2᷶|JU]{YWcys΍|ؙjRժn:0}Xa52;N6'ejUVVxZ₵B?C-B* j_F5)@<@ڵ7xJmb_7xP9G m{u VPBo5HkZ ֭+ۡ%_ڿI.^{qq;w3gJ6?e uo܀UZӣiP2/]t%K\ngq4bccիwYA\\F9wŋagJ77yӉk֬9fx#ޡ>SN8 pvv-;~8<@=~܏] ?A`ʕpWWff&۔)S,X༼<؊vڱ.Vhԙbڵل'翉ltZs˙3[ɮ0zJ}el?!n9p@8+j3B>}*--ZzL֭[!<N VQft](9j*8LSTht“2dtKV u/]Ѫf͝`_~傶915rssỰb>!ܹ3lHP}Q#>h 8i߽{ g<ڷo v L߯_?(aVPwE߂U0ӧwae)q:vSNUZYā!FFFp!*O>N9(81bs!P'PGOII7 P@Ŋ]Ú#1*ӤICx.|a^lС]!22~NK BӬ:E4l믰'8p.ش)TX+]Fru-*m *|pSvӭ:k·lWÅ8` (й e5WFDܿ~gPD}̳W^LKԲِNYp(Jqr8ԿWڞzPBc%ەz_ϴCEFߏ BBEpue:wiڹ"NZ(Νs>|n߾ wV:矡bt+26{hV߸ZXt_Џt:txq8RPn Y:U袲Y"ĬcDSw\**Æ $g6 %x KgoQQ'OD*={1 jA͛73T̠ߩS2ܶmP^UC>pu-{.[C۶mۋw3]5f=s@VBJ(k#-<N0ݿo \q*ŻwWw*I>\Z5X[___/4`ћ|8CiFپ֯߷o_x$"Ԅ}{jת'(: VTo8k ߀Μ9Ucظw?#2pui6^x[?9;;~ԩR5rݺuUAרQ#e].| Rհ,**O3o޼yM6mժU:u^sJE|sԍGTNf͚=zT񵵵vvv'z;vZjC ;њ߽I{8JJJ0`PAz6AZ1vX:UڵZUǏ!Ӹqc4PA}Q#==AϜ96m}u9.]zBcǎp1p@8 |},䥺k.+P;eݐ\8[`ݻw\ܩS6l?~|NNQj޽.L /LFL$\ 9 g)mj֬ecc_(C8PׅJ+Yd \ڨ}M> ˂_]CuZt `[urX[n7nd3 K3Lljj pt^4H'b:'Dӡf,L9n1Kd!Ө'4rX >„k -\kr%,M}.ȝV먋3@?p9P5J#"'{tt/G uOPԨaҥ}ի3.aÆŬ_ _<'BušCYtBmN:1C[oT-a oר2X%7̪ڀǝ:w3]vp-Hd[*S^6rʮɜ[R>3qkѲHٳ &)/5ʫ7 aA $Yw:6d~Hlȝn$/_ eΝ;۴iwsjI ­!0'\T=[|9vV/^=^Ae:7`ݻw+IPdA SBY GHi+#jI I TSaW+K=mWIIIqq1w41li#ŋ \X@ߺz*[639 ĉ.\`=0MTT~ h4PBu8yyy+_ B|Ҝj:RI~Ru&4sj^ Oqu}H4LsF˒ө7O'~6%Z>|rf$Zf\oA^8]trԙ,V p":sˊْ`Os6;wP>gf^Z%\rq̼H8ZuYw)MܭkG朝5jǮ]sgaL43\\RnFG'E<[v"-Kss3\4𴥷L8_$39eO\xj+v'mx_;Úy'si$Ęy_y$0#~_6rwyz<":رdO>M? ]-J;z7#Ṭo&?e}vaIvu?N6zӠ~cS뇬bxɷ'b>eb0@L G~_#8;jdv?Xz_1i$q=F~ɮ<@ϥ=铩}B2%Zߝ 4Rc;S#HӕiqGۺY|ʑQ!!ÊewݫֈT n!u% Y5]0 :Fա%mʲhUIԇٻ -̚N>4Ren:|pj⯫4h4>|HU+G{dqjTPſ4*߿gj$<-9ѲֆHiVDg\t;j͞wwYfEH~Ejdjj*oӨm3ϫ:H#^"$c8rOf=Jvɓmh |34725rSy~/qj8cH:lӂ /\ ̵֙Vɵt-qt\lgr4V"#ne֙E4">>^:E^ _#E#UCsgk$T5f6m[%jcǘ AV6HK*AF%T#w1DFBH4ʑH|=F +F޺u _# Fz9;KH R`kꉨ zI)ɹz IQ6F$Y5?GQIjWwk> 15wx15v{awj$GΜU4RF$ zIF7FR5gJ,H=/FB>*,ӭv.,R4R %ԓF2)0bdjaähC^eFF:5IÆ)R#ILo\v$o]F{vk۬i\ 5F:,_§*RF +]#!KH$,j_ wy5ё115MHMiѣG5Rmj֯'m׭/=H<}4+6B5d.$HRFT˗ Hb#G`j$/FR47F5IsZLd6H$ (E#!|VdHJH$m$ 5H$F2^#FB֖ yjVLG#p4rogTB E# CHiTwkɤNsHHIdeHsuj՞4$|wWL޼K#HܽO#Q3Ch$!66=5,IXԌHb!eHȋHRHT kuH=U# ۿ/YFj4IDC6b#mgV$lh$ƀ~=jI"4ꥬHZM{H.$F>gH (H#CBBidTT9R4rEǻ*F $k@3~O:hHHh$9>42fL3N>0"S#VHnΐ|yGk=P4RF$ zIVGHW UfS>z%FڌHH>OK+F"_xҬ|>t|y3٦QFqrHb5Ui_`627ޑ^Fh$j-FՅm$ˀmkv5͒6OriaI#ǎ!zʨϽjEPekJ3sFBܻw_#fMgHqںEFB15RP;b#IFZkJdPp[RFq4u~Ϊ:0U#oQ5%M#Hj$Y塅OL$HM;8HHȈ0 IY4R HȭH}$FB$%%I#}VNR5ҳqx~$PZY`j=6ֈYIl 9e?R#̶.]h`H^#\ o5_NIVY5r^,S#!5#^?{hJ(oԷFܸD||iddDJb4L,Y#['5hf?fTiy8>u"uY4D,w$15RVI#^zyyy:dvNH5|0FOrTB E#Az&,G#$Z#U.N#]Ghdi*'ڷE# 6G#-ej<حAx>FrD6[B5ɫ[I#CzHȂ}Mp4Օ“k$Thhf6 $_i$ٔAfy48--.aͪ_fO&& HlhI1F^~K#ɁlIㆩP GCS5V8FiUH;kGR4FFζr/5htԓFJI~\i5R:H Hgʨ~CH]ȀC050&ZF'QF_Nl$ukӲPF vἶ̣9~]#!VMFm#A!y4w͘ujdJJ ]#1ph|]#U* ctkvlIeC|$hܳ'[GR9l$T#`k$uFB%UH`HZ?4DfFB H/_ H;̈́)I\#HȬK#E5R4Hh$VrH )Z#![hA:5ҳGGbuj$C8IL#\# Cۿ%MFBS4R"HjWRy>WH1) $+FI*DtttdK#]\\h݅1ix4{ʣOHH ?K_*FEjUJGFQF>_i$jyO5zft7Nj!Hs1F$c{`65X5šGF]#WNOb{D;U(+[H1)$+FIf'Q#!.0)QK#Tϳ5 gۗTB E#eH5όqȣ.F޷GS##ssŵDK?״$Ԋ=4arFZo̪NKH-I0)R5RS&HHKC#Y=ndh!I2:5RѰj4211G#֭H!]4S#*qaiZ}{8~ڽ+km#5b ҩp442kH4Z Ǚ|=.T߿i$y*F#tk$ĕ$)I|)Z#'L>Z4RHF#E$F5kk4RHJH%/E#W,թ3hw7Bq4ҫwgΈH.Ӟ::B52ViLE#hX)$i$jH>Y4MgG2uNI-ii#F:N񖢑 ?hJ()"e y4y~"5Xbi8K7vv46-ԶKǥ[735Refص=M#ܻGF=Xbj_NF(w@~R4qcC##w׌IbG#ј;tH.+NNN<iwFjqF ƘF4L$Z*ji$ƉHa4\Ǐsi$<4fHF VVx 2jP4F I|o%JU^)$k$ĥK$jdȡ:5ң{[1:58 y^Fv]+^Q4R HHb@gd()DdH )Z#ѫЬU|1G#---_~?%U,65 ݕG#!>>INiOnucGkC52^hJ5R:EB}_l<ﲍʌc/K#+N#U.F>'Hq yqI,E,̜JHs$j4g=T})(~}h$jxW}xc5cm~Ճ<1'Fj4v޶UF7yYF5ysm*c 7.lT΂4BD;%B#yJAIˆnnn\ ݻw:>ɿX152::p։H_}qD QvFƥ1u[hH]"adX#f.+,f̵ $j$dzFft3w鷙'wLi )F…:VЩ'h$a6,N:!N#![NxsCFBjvKv}~ 3@R\Hikd^͜[.ݺv+nJA<nނyV<#iCARF߼y#FR+K:5?%Y9gHׅ5ya 擥hJc5Rmwm,(ކ 'FKL.Fv&`04:k75nQ;Hkm$D/YEH;$jMF}[`FwFwSH7_qm$n~Hxe4ssk$94 FZ.cc6Htjdrr26@4xaZDHm [i,dX|T}\FB rdj$ĝ;w4*<fHWWWFRdFaa!֡i$w22h$5r8ũ[I*'H6+vY3V41ǐri$F_.Z#ƌЩ1Q85{:FHș idOp4rkiW$EjWLv:FP"s} ϟ?[Tw&HJHZ,%%%S'Y5ff~|tŸF*?P# C5k_J|zI5Y>4Ν875F{H |SxM˓}{;@KF&H#VX&ʠq@B%L$AFzH!q4M@qx4/fk$Kiu119PIcH___lHJ`/X#Qk1hJy eê\yY.LKKH[[OږLDf'"1Fj$%fPDȣ6BN}DHL\<\VL'Hh K5]xt@{$zqXn2LhGWhdؑ43 5bUN\f柤 )^#zڍ4G 9ϟ?STwNE#޿/FR6ҩyD}zsi$BFBYQh8w*zRu^H!Y)4R'Hʥ*m/?~E#ujFA2 C0FT>Gk _Y4rogyTBF"uj3gD̓zƍExQבF"j8ܽ+M#]Y7;Hj5o4|t;SFͺ/A#Q{S'ȷUMW|\%}^+}hcmL|yz쨁"4Ref6t Fk$G\~d:ƪ* h@h$?Hʨ蝚O_Gjɓ'8 qE)_4eB~Gʢf}{hJ|i`?YF.U#ە yG[F]G^ ]#I<ն6MH;!HLFAiF^PWzHv|aZA|,4EIX5yZ}h$RqPQ y~ob4ݬ U ?ݻwÆ ϟ/z8K#4200iJ m$:4(-HFƲaH45F2U#BLFzyy1{urigm(;[FM\]i$d`Ⱦʮ< Y5rjU#GmVauѦ+HC#s;XnMh$d]8yx`߲43j$mgh$%g}225MqlBg#E# ٲ)TF rbZj$1oqH44[Dh q5FPM>]ʦmƯ]ZZڃxx@qiab1z8Feê>}|.\Tak dHՍb;H.xw>,v4R hnSˠhV H/Ǎ {/ (Clcj$g'}q'65=111k<~Z~ϜUnH6 uki$q^hsVʥ)))\sFEEj$kyFFB<}TFۗ?/E#Νi$db7 Y4$%jd6)V]#YAR.v.aHbeq4G#W,]?*D# m7S4R(HʦwsR4RFZSf0_ٮt H㗤$ 'O>pjJr ˕Q#! 鳢J(idyQ$F>5J<G1_V5?|QF,]+GgaR͘;27Q#[ҁKoLop.ȓ3{[#!ԊI25:6~H6?Hh!iccky5hGw`2Fzxx赲Vk <89dXL())˗/sid`` FBmVVV\2 r śNH .. ddH&HJHu/XYF2AR.碢"|%U'MsfhWw2i$fן6rܢF IF"z)OHI9yʨLԓFBJH{\v }7{| G#=Muaxy52rQE#P[rH.|$eF;rDwF)~5:2;[^,^Ƃ4jVܑ#Gb{ˢ>^)B#eloD XvT}b[PHțż2/((DF[åȬ*Hk!^uRy,_9F)--eoEEEw-kJ5 I)T#!.JH( sdH*Hʢ~<"h$$ )..Sp/CgNř,|4 jl'w|ܴPHA )F}vsQ+FRARAh7o}||x4i[5ӇFBf*]#˝"Y54]l>ӧ'IEF?^$϶h6RZ7 He<5C&hIZtnb$ TiNt|trr҇F_ johվ}WG#y~%cIȌ qwD$8UH*HV4$ARn_A4Ih$NܻwG#={vW#zwǜrWy4ɤF I}h$ewf))^#Z#IԷFB\tIFjm$F-1|CH%Y(ҤinĬfB5qzk$iC#1p%DoOOn&&F9AHrYh,Fjwf!niI 95Rnnvv>0W UgL#B$^dev*U|8~퐳Wg.kh.ڼx=uOT7?90Ν;RZ+{[l[lk^\#6vءhJF#PB %PB %PB %PB %hJD#UVN5k֮Reժu\SznTjidTm}5W¨]JYU`;P֮]#CAEתUK)VFժWURrɚ5 t!02QjͪjUVz fIVǨFr\ [jծȚ YTP"kVYGlU4R % o+i$ȷ޲#m)y_o#G#CΔW#™,fɂ!>H3_rqyFS4g+) EVr$(rȁ}pS/y<6 @FhEloKP4R %W#$I0Nr,Y UGcmkdHt/5Q~H?6=}S#Eߵ,m#mm MF<ؒzHDXٹ#0.cE,GEtMwܑnm#e .trr7Feg'davYo ̉O<3_pi$iXqիWEk$ԽO{WHhWכ GEhx_IPIH42bvi" PCMhd=:9wazrQdH"P~:Ǐǜ2==<iR':N>̉LhJF/Hj$ğIHy@WDYYV5I0m# }XFzLIYYY!A*SS52[ ݖwtn+F ::&j~Hw}W#- 7_F7<2k%Qk$͛7\IYG#E 9B(X#jӃcGk$G4j\ʥ:ڶ >5P4… 4JRDXX\&sI8IHY4rjTƪ"h$" PCB^h:5ҫWtOr2}2F/]xbn׫84$6~ꊫ /1AH|_#<-p QrQdH*EU#/_̼i$Xvq)(޽{<}F'ƚ"S=%_(A#$4SYٓ kL1|?gϖW#Ԯ٣3IU69У#ZÝ|X2jd|pK6l=,ïR5R;+]'T#49TYX;jif;n$9[LDm5Sfw&&hdBB۷oe~,qj~0FGW,Pt\$k{qtqZri'O42--K#ym$diZ~<yfh8L&)h$"k,gL+F(Rioo_VVF0ujdg|1zRL患7Ķ##H0c4F H95RkhW/h\YI5FHCEkٳgoܸ0gJ|G##Ul7RF*DI.x+]#cNJHRcc|&Fޯntĸ05q񂠮ӡI'sB·xL'Fq׶]QkWSw |_-ab}k3C;RWRD;s*um#׋>XF:]0-EhdXX{sbe_~>Q?89r(FY5R|K# 4Rj-ggg{N N$jE^p8\0$EVdHn>GcUɤHj$<ؖ.Lyj&=wf욕86y ~JskF H4RkhnQ)RH(2j$"\|yF/^L `X4FvCe!WH룠hJ|Y. ɣχ i>eիO#?j;E#KV=7UH H{fH#zvQɢצӜO7Y4jDk䵝-cFիF1::=ʠ_^L-FYQF>_#5͇mo/I\4Z}G[hHUCwL8 R8\7opi ?Y5ۛyhDkdNNt/;^F&x)J##,drH.EFR4֖5ҳqN̴TcjYsS1qN$8;JR$FIQ4R(E6\~SrQdHVԇF<kdJJ LS;wG#m7o:iƏّdH}KP4R %*F$5c~5%j$_rR4R(Eʥgn>(8PHPdH.]#O},=Pܻ'oR5REn3wF^+H=i۠*e=5Rk'D[FlhKF:nXu9|D}zڷWAںJ\yYVh4iii<ݟ>},6~jD4R˘'Hr Vx"Fridtt4Fsidrr2F| M֏%jqO/)\#6>8Z5"Q#)RF5kkHԇF~} _#7mЩfjh-܊ȢR47N"4rպ<=Jhۥg3h\Y4"Dbtj=Ty Ь4齄xQET p|ϿF*DHCNS^Hy b42}kl05򍻻DDtO\T[#MMg0o/ٽE#ti;h#)m-}ȗkčW\ҜJH "4ёiϬV_~ͥ6 pN\ U#yȑ#B5RrtUahJn-I8ƯHU#4ٳ<쌺 bH&ܹsGF"JI"EkU0RF3oS5RK&\Y^"Ekz"E#)Rv ǣ=,Fz4iHabAH jC]ך"k䩢'EYY)RH(h$ArQ 5Fq4jO>d)y4Rmj˘_#υ_E#w~TXBH%i0|Թ΂}jt-N#!{Fu.BI^m `l;^ve޵+mm{%z]gGhTv{h4iFw~NN~7 ys#8kV"SZhd\fy FB߶c 8Fz>MQ#7=AQ{5_ ECh;ML)Uw[Owei$ tOOqK.Yb2l=htB#3n'r#oH4)HTƖF;~ [8ªFvtth$gH>___ϸ1ښ6qCW^FD Ryqa¼Dz"Q= )ZMv*_/F.U^ahft0dHbvj L^Q]_E$#OwN#{ccNnȁGpZ#yϰP]|ADUVry>w6wc!yyW5(ME#G<á"bH'5%~v+oHJ3[Hi!}}}]Fxhkj$Bx4R|)"jd@@_cK#B!R#}||TZ˗/h$5לF&''34V{%7j0Y(9 k'F:}E%y-QAG~y(Z]i^\L-أ]gm42DnIHhu򄤐h?-X<2Fo4͂pZmYE#tn?g wN#ӹhdK[WdHuB5F#Ck$h&l27v{F"F[ZacF6mvo,tFj4/rFҏ /IYZH9)\BwwE#wSe=́5Ѭnɒ?{()}@^$!_ahm 樑_wH#CͷH'r#׭at\4fttF"8[KcݯkW#ێXV5T3 :653)_}(ҪF9 k׮h5ђ@Kyl&:ErH}b'OpH#54 Qp ]B#z[jȚFiNsT#:KJ\|QtD#WQ$2]sK;i( ^WJE}g E:^s-)ZSAΊ v!T EK#}}}y|?YE#5L(]#/FF/|V)ҮF>6碑aᦞ&.Fm2yPI2Z"L{jOq\뫪Drwl~ MFT*w]H/IX]2,,Zjg^:-vԹX#q:HE# ]H"=ޜS<|+y'?v]#Vc[6YjêO14ﮝFzx(}Fzߧw-55 W1:y|"5ai`+ ]8ɧ){Wp<YRRbU#6RsrHU$,ޝF&}̠Hyiv(UcȂghdJJ }˗/; "p&E:Z͑FrȑH(Q\RP#ʽ)-˽wgK#C mivr25R'; mQ]ܱHR3I2ZEbtEfN.j$t#^ꐘHƌ, =4eT:t(1,=/FfHA] .jZ'527Oy?uF0]¿=ƅlj$BU-5ئ 1OZjdyNkhk$I(߱Ji$&o:DW tF} gNh"FobYjd@@@hhѾ۷Q}9.Ǣ!kWsH(ҪFºYH4Ul&-䨑A^uhsɍ߶As#ofIIɢTgR#midYYF h7C#qiF髒)H)ҹҖX#H)rjCFif3vZhdZZ% FDêEJid#X#qAh+ F|\H"=Hh'w]#G5mGXr#mt Ȉ-52l\):W$Ri"j$It칑JphgJ4Qd)Q#/}ƮFFEEYHi$}1KF?t06EZ .XH3SUlGK=5LKq}}}vD`[ɟ;]##H񊨛7nbāk@ҍ qE^WF],pB#і?ܩE#S'hdXjd{jj̓>:T.^PG۶EaHqe+H5:EFD2~қv5$ߝ]#oݺŢ&sHOϤ 9I-5U^PecHH%72OR$F2XH,C WHdV5 h7C#y׹kDؘFI$Nk2c~pEF:G5r,9E7r5R$ЪF _z3=ͮF ^kK9jYq\#1a)ҶFwJ E:g:*8R$HwQ(H'(9 GgFH>O*k$G^K )&F煁NkdGkH#Ijk>+IG~^ƮF^]=7׿~aujʡ)Dň_cU#,]Fzx(>>}rI⮑°0KtH#EǏ[Hn+C:E 49nt"9j '}49tZ#ᜎ=9!XҮF&-]H_m[d"mi t9g.EF> 1ksFvmNX#EM#H'42$$EtFZgK#+++.144i-/TFN &Hw{5@b5z} ĉF]稑?y8DU4Ҋ5S3HݻF3?j$J,Y:yUu_Ἷ:J4|hs %zF/qH#cOc{+jCr֮vT# jdzz-l:}mjdvdHb?H(E#kjdQQ-Wah$*acU#2ܶ4i?jdUZY)9a?,t"U#]H)^NçNSs 't&ɹAY}ԮFV㢑u5~'4ih䑝X#]HIJZS!.Uku"@jjdHHȍ78je>%?*142蓵V,SV;G^<>}H8~p(H]#!.ZF3g:ѧ+4rGkE#zʘ*+IڔY4gAhjS8! HryӧS$൫o:['k"]Ȋv"9Fr)Q#X D(4D#Q5ח^R#CW ۥHK H&͇F fLJo_ jeIcFGn24a ˣ4HFR]#sRl]Hi`M䠑ˎWHW(r4E䢑ێNKäPe4>HCK|鹮t5=KjO'~B47&\5E䤑[HѣPC@utݮ,owI83:E E#w}NOH8F^#zT,xʗyPo),| dmٔ0gvM|睬U.Խ]#/Sp.KC5jጲ͕+W8 pfJ|Y֬);osT#mGrܜ͛lf-rT#Ow_SUY͍۶Պ42`zK}4E#ZF yKnJ{iW#}PKE#Qbdܨ1u%R.[,d2WlZ/EA%xvPl٨1$5S-غIsr /ݽ >9;ʗ+|5Z+ʟJoE/ڵCwfʸVa_fFzy)oUݭt]j$5VږF ̴{[>62Y4ъ 5gspL#I "mieImKHjgH-* ]IHsHsY`")LJJ&BRDFk%Je&9J]TfiQQpށP9ksmF;dGnNErRVlLfffiiiPEIiBa9GQF S"A#j>/C({ CFHäS]TFHj$655r2hi+emU#KdHᒅb@t\=BbT M& #-<:='.$CAȘE-[DtPR[3 acx9j%ID])CBBB'/ yee%}ׯixQQ|_F`^]#ljU#˒j$ٓFFc~E#w>q(F1'%|!DRol FSyRvl;JG=,<4|qeH244eV|)H$kעzBx\IOqpFIII3)EKpRjp t>>Dߌ/8" %e!Լ\)EʼJ]2$8,y9]\҃}X% P= rI #eAc*4p "jd䳄|}=v.vT3]#0FR#'k$ [HbW#qH[ɟ-dɍ<};EZHk,5^-H'FZMȤk$-5e̵-4 iqUU,@|ԥRRch$ BQNjR;M-Ɛ_vbϟ?4rK0(+b/OGG#lɉR(RibTZD"ky2Xsd$\fq"H5^$H!ϗX+W@FNánH^Dž"ݮSC yYaW#kHh5,)Db+)4NWɫ T餯v/$6\<여$wH $|v+RBA|ޠFJK"ERmG#Ğ-|8Dq7R&3LH#f3R&)DYLj/eS$Ȳ澾X#H7Q+ F ٹx352 'q԰>8D'%%}/Mqd >?yܡC2>!99}B;]#oXhVQu,YRR5/NJ,N#h@w@PKʤT,N' -C(܁J.tF"Y4re#Hil]LYr)7(hdO|cPty$ i҃ۊ9VFY#*t+"«.JaZqP 1wUsBP86aĔ82J7ok/H<^U2@PhL;%bvjV.ӬZT}@G Լp82Rq`Ix%4W`Rv [E#ZichO:eG*.ϝ"-5A :^GGOFd2']#sK5ۖFez>BV`JJ#-H1dRBt%%F[#!!1k.+^J[nP*6 =cqy<5tjaA}Z*4vr/"KO#H j67> ;x(Q$jKHaP@UΆN/LU9UW+2N $NVdP4ҍɦg[\F"H͜D,4(F洝h8(2fro/QKλk^2_b`3dxdz2bȥ$~~~ЁwZTxԏM gQʮɺjF$5#-T2FȪH8fbāH8 ]FF-)j$,Tr<o94Ir8\KFmU{cVwP5?-۹]}6d 31%%Vμ̐nHkkkZmaa!!h( 8<Ccb1{wo[[Q-Y@]&ۡDd6##cQ*۠?F.AZ H[ߟᄎ_W*CBw jsO˶o'>^WϘ hbKEťKL"G# 4%prF#_8rƑVdsyO~FB;s#oqߟS.RF͝~w!ӸqrHh>VRs;ch$9͝h+)jndȚUNo:F^Qݗ5ewiESAz9P52thWwH'8>^4Ԥp%1O筘P*-T'.]$!\ڥ&O{gAoYsfɳ'X؋}M#}~g=$Щ,cK# Hoʍ(E5Qh[h3iHFz:|qo_ Nhclկah$F,~k$U†>>>Fk$t-5Ucn$cBK-Sd?}HYYY(h|]^^ "3rz+W)P):::$L3e2bbl"JtL$R+UX)6D"ʆLl S%rh<,IH#bVYMf$擄ZZMm ?\%K"#>4) ֓?񤿿]e Ff?'$%)rLf(*v$]FE:1 g48e2ڎmC؄+mUمT)LXDGFmB4G?ܫ6o`O.ɜIm'EDB"=%*7TZĉpT745U}a3zJՌr3 HӪFE:K_$Zy<@( W-Y(X4Z13"FjG[s Hs;>p zž>RZ eU#m4-іI~[6;Atdt(鱊Qö4WcuHP۷sHFT[iYHFJ#z]'ORI/yfW#3?))ZVQ^~h{?ooJɢ yRAi IX<[P*妬L@dƢ+FBDrGdu4+$C{ 5dPOVܠrJJPD.jQ$syr"]aH,//AJ#%l`Hi25R-Z F15U˅K֯ʪʒJ$Y iWB)BALHHIhBaP,tTPHj5eE {9$QKTJ%tzFb)))pSOSSj\R.?CF:詮9LiYW\rk9F|AAU˩D1jv5jmUnJjO!at2F/˗0JxoZSbMpniŀt gqT*իWrhih$c:ny.KRzE<FӷGS`āc4r&.LHmb9ݮFJ=H\w7ObHI1hʱg!T3_oŒСC4ujyMJrr:::6uv&U3~sI#ϛFfgzI+D()osH Ϙ]#ol!!!pHٸgX42>R$C#y 繸(4GUsfϗqP!b34޻yoFdBn5o$?]KL 7}ʼJ(_I ǎ{g4s^i#~_^2iάpXL1 xL;Z&Sxh@Ž(=Y]mK#H\m81Y\@@MP8PT!24_?l ɟ F&"bE|TǓ|FWpSOSSV"1LDbXh]HF)-sE4r) nk~S8E#QVzJbҒӨF-YHH$0'fZ}!C-~%6H42oo("ۿ/zxvp=).oF^VWEYVslH3@"YA;z.{ raJ#۶2T q[7%/_S1vܖp"(Hso#i:~ꑼk|3׬s1 GOvTx x;t,./{xoB$%lۜvU]pQ 257MӖ.D-ey<=s=8ۊ[j$c6V5Rt^t ɡ^G=C;ݖ,۳ kܛfF%*(ddR J#ۆN4}.GOH-s9Sq_dN׳´4b:ZF1>%%E)&(pMcb.+M3UXXb*2͐S^Ud5Yp*HBDRiҫT%+ujuB!HRr Z*'רTEJeTHjZ T ܫ^.U*R\"T E}*Szq>9I'm~AP_۹VW}fu"sXV/(R=\GckGsmF>0idaT)اdkeYi:7`4rV^GEJE]PMr9mdJ)=6¾5*w&&JMLVVUG ٳRUƆbBMb%%]uUyy24=!᤾q4ȝ\Ftipck!5AWS}ﵮ: *{zzFO_nӒ=ϔu׫Cg2ur, Ss)?~&eJid28(i'p9nNyDK]nU+BCJz߱ n c9kՈV,B{x{{ )u%zy8# ,cYȠ=(ؗQE6k5li$l74r%42EsDX(*;6}58M6 ":ČpllpBsRj4R2-2f"XJ\^TTD=,Qlt=[SRR>ZQ56g%hC޸_;=s&ܷ„gg2B#!@LVY3ϴt-=Ⱦd5(U OBzz:$#jkk-5E o彨 ,9Jуܱ/&ﵨNqw5B/ȁَ>w{g0'%%2 6ۤw^[[wsٜERBԓ'sFIDO X:`z x`XlK#ѓR/Еw|~/((JX [{ @Z~4 /mrHi3+++ўny .X4}.GFʸFsMi$|o7kš x)z׫W%]slgQ466ƐI=~pd; y:2eD`^"='jl!%&DO'N _hհ 6$%ëzl2(b|-#a'L§k|xš[z'9fm+գ Ic"+aG ٨ :nK/L)|ӞD~ڶݧohHZZwlM+zly MpHskPVj7(PL(r<ގՉ-52((le+Gx3iB˔G^x^#"8//Bvp#'tewuegwttN^}UOOOjޛ7o!_Xݕ+W#;vc=ӟ>2|goq ֭{GGo qh,Yd 'zV7DDZG|a\}1xUqE zɌ%zGy|Q>|W^A w .744@'rZ[[b1|e;Ja#""svxW;[tNܷ7n\,{ƹ9f6m~aM M;Drl}=PtV2!&E VVh0\Vҭ[Ywooo1.xdDd<`~lmWW@ +ke, =dx!N<5gee]zގhXSNqI7!MOOg\Np]wF_ hГW#8(}-ҏH >$&8y1&ʠֶ>suX8/՚ƆJ>͛kA"q=4xMn;Ү*jka-M#X1%"lO- ֓e& 76WlwI74b%4ٵA%~Q+$b,#iAǠammyCY>J6R=>7V WU[q+UYQㇹWEt-;h@3 ;B[5DDŽC}<8ҪWzn㔮kvѶy +GI[ZnӦEtA}WO{y|ZB@? ^ϟ'fSdt%8[PҮx"pekr㴷/DMfyO]W ˿W_a/G&L~<Է~;{ݽ~i.yyy>oGa͇}ł`<bt@ x8Pܼy8{mj_Gʉ=J:ڌEίhS͠`6 $δ@E fD ^‚ ҡ֓ƥ^vmdv.?[F6J$(jwָXy#2DNthHL]Z`9MUk7|K믑5GICoVW]gD1ډ{rȑl/n}'FRq)Sl޼ݸkٻv]~}kkC;iҤ>w"++~.^??~-^*++AYbKVc|>sܦH y&nP14CK#7YEu!dS1@{m(H Yiĉ#;w0<^u:nAYv5ZcGgHhw>Ԯd3hR)&ez{{~ $uj4]#B6(̉.ZՅ 8pp69.]Zj͛ϟ?{+));v,F@R[pz$9g+WKW\d$YsMF6%'fiN,H0%dhžQy--|)(E#q-&VjCӟsHrZv]#kv]# &.iLIl[:MF,vNzdOe5$V$El@6ݾ}pW#gϞoX c/Z97o޿?\XpP(;FK/Q[nΝX#qj|WS9yBP[cW#{MMz>H!m i&]ZfҟJKGOzd[cs  MMX vW-*,&3oݺ 8pc$5W^)++s h>333׭[O:_>{U*cƌ3gy￿G-]tڴiiii .>}:u@ xbccq<8pࠂJajpL#ӉdNxgi$:]-)&MY/c LNרmJr&@cm1W@TEϖFRRP]2){zz1ԝ6Ͷ,PgW#[ccPI$QWF cjH<XQ[8@Ze]UZ6dz er#3`m8p8p}Mc INC$VU 4HDLF}xȎ B)s݅evnrs{ca!`m&Dߚ)=̹15,3D`Fzzd3_g(2X\Z [ 3@Zec0 K-rǵl\Jnɛ7o~8p8p=N8A@FQcHJk7|sEa l Q^!Z{bHMmMyHJBC\&2fGvTKhvPlGi=,kke*+9i$앰M&vC 9 &=^j:::U}#Gf-rWZ6z\=oܸ 8p8prL#h[nVC-Vd٘rղ%`i>)e$W@ҐJ FFvV)v,Qq *X]RI#Q5s]#/%H9AE#MObgϞ%~06a~Y˦l*+QV*eb"wUm8p8pbPc*[bcɲ24w}F\WȮj𫹺HR>낃FFGRU^+Y/IO^heTDzoAA(Ae*ȷ)e4pȌt7ϰj)r@"ulJIA𑶫MQQ޸qke0ښN CzZ6X]iW|'8pm),pL#5``MqQjِVq-=XAV37k&2rGwMmB-l"dDܚ`W#[ccr==l25"\HT2X'=Kz$*}mBkk+]؀N54wImF#E[+[]v wp8pqUBe'$|_|A&Ι d;9ΔwղII&^WuhF RVF6DzȮ.LGGp2XL~XMVК)=RGRh*B`}fUkyΟ?oN8A o2`~lmdcNvS˦ײqq6Sp'8p8P떴T42/UNײ)'k1G QP8@2xH1uAvڹ9-#?46Ȧlb?2Yw3TsȂ|4ޙ]#Ot ykmlH#Yr]t7 ۣe%KGeXjِܩcQt}vkk+8pΝ#N*ȸX k͚14iY-=)7W@1#8qbvT'Z9X[.C*R|kvBy$$8pp*ђFQ>}\_gW#{KKPP(Fb(hK4|]ZfXrFm~GPhNǢ&|kS ee4٠hd>G$4i">\4Ҙakz=Tߪhh`zdoEe3k8p8p#+Wp-*ǵkn޼IL}4̘qi13x]M#(M'TB9tѣ~-(HBE6WLTs4 F&J5d"lSMd6nݺEj44Z6)VSq8p4M߷SYaW#*Q޽VF*A34և*\W4G8֓;Zj!x/{7AumGyH};*mp^.Z֔dN IUC{zd9HlnE1,%=̼ucs}wrۣeߩeSRZ6wZ6֮iq8pGhZ 4, 7ߜ?4~-B2M=f>9yGQ5scSm1W@DNYY9z#@>DYk\Fn%s[ 8id]MMكh #TsHĹs,ةS&G jkM%e`m3; 8p8p/kDkI*_߾BlHA2cfm٠RFl&$`=URB_:l67DȦ qȼ\7fv<}u4/ GZWCS@M.cղA%q-[;]|wp8pc8\42,H=edQ/S )7S5H $Ghd]P`3[X0Zk洐/ýtuuZ[(!*Y68 ˠ S:FC576د`D鑢Hꫯ ۣvNzdpԲ!jL&,. &8=8p8p|2A:cESݺuի(էC-ӔtGו?# 99hZ˺W@Lk=5D'O>r9Yk#ncYaħٜ#qӽz={zd'YRRUE 0M%\klK.ߠh Mp1ljk0*:N_N8p8p=ֲIIv $2O̮Fvd4ҠT`&S]PHP8UɮhN&%{FFvSg>ú:z=F1$Z*+8i$Ha2kdC`t#MUU+5h1=V4lшᑭMspԲiGl . &*8pc``85./wL#ȶ=BNgW#{P^*jِ;#͍+YLa*-=鑨ŋuO8|Ή7W&z#vwQ.I7lj墑)ɃY5j5))i65QAV>-vmll_ˆ]ײqz{{q8p8#k٘Lײ!ҥKZ>{sr14[ji>!IĮ>5gnhdgEȈݔf3=2"m*.eZR9G##AJdgsIln$23oܸ\=ۓF V[7Y'hZ6:֮@{̨8p8p-tét…33q :0lr@jelHLw 7Xh]Ou:#ˢfJMMSS<ͲRFA2DltlmLD25F&ZZlffozPO]֗_$0'W`БOWkYTJ&i1'6RD_~}mnn cgM$RwKQ= k4.;>PV>$,5(=/f~IQ#U>iJ?I"#3BBZ6RQk[)Z!FNL06rh Huzj{6r !|>|Zt֑ ƌ$տ&%tx7"!@#899!t'$)B21y5[Mw/+)<~L^s/6R|m# p6=??o=B=roO-)vI-mœaHZ2i-$IFʕ # ^_H1MǪ$)*BWteXode*vg#y,ɜ2b$Cץ&>W<Ɵb a/62_4^eX{j+~7DŰ6}3 6GszQ<;,[|@|oAi2!h48xL7#!#%r^6elf<ֿ4]ZǘcUѪˆ5ˆgt\(a|>w 666ͻc??Ustɾf!LM%$[[2FW62?d#I/62r&pS~鲡TZkHyzrfkpKl+7 cF'@wNOѥ"?ok#^%Zs%uXG.% su)xa7CFtT[2s&GjE[crx hl^uq[YRl]6 /'M/U_&)j{N|{fM}T''i{ExLbl,;[5~ɱoxH_jk#աZ{;),4XG#åveuXׯxߥz I>*'<,AmxH%z" kT!iLl?25Y-)޿GV0?R sd,{G2d#8=LO$HepZ>y%tϓ-XǺ ]Hf( ╏z^~w ֘@H +JgggLmmd!#XBlN= ɎvGР|phEB`g@qwׯypbXe+Uc̉qGHEa7(Z#BWFJ:83y3KIu8O<;;;;dFj 4*mNjqs9UeQ#i!$Hmb776.m Ur8JSemv^Dam|wflԝׇ4Y l""XMf#EFJKvvxFO Iv\`X/Ld{ltQ]RyNJH>_yMKH߫-Hur#[Y+.SUn.q&sA k|P{_D -.Z k8|Z,^`Q4 w6rU-哓 D![AB=m2)?x'W6Rx)vitSc#FM|[;kHehT2FLӼ\҉9)}r{TX wX|7EӠuBmdlRt\ȋl&@#Xld_/ɐʧ6 RLH\JGBp؋ 9 kOMrnQ(ط/:/ʕokW,~'6r3Ʉw Tkqz:i>Ǐ9]nA9ZeYv]H(}N k鳳3CFPdGWd4J_|៬a he3O~֖ N^2ÔZ&O<2˥Z7o0;;c1M{L;asjQuV,3d I*ߣh*ՖX%G62facU+P 4 {G Itb#ձ1\_o h}ݴ4ˆ' t\uXx{ ..ldsJ|}􉺹Ӓd?=7K&,&=b#c|8x$68??OӕB|=[an8 UM'6wWsFn\ kkm:1QuOchί_27amc"YlD +*ՎyPVVVu iTg7w)YSvT5 _HFz^429^S*wk3Gex[tz;ٖKsx$ٮu<2`xG)?{Zs48/_juQra(6&xD3H^~A͝lmdi~l]6|OLst29F&Zs.NOffan}*֗ESSyG6XZ^wPQub#5>&͛glccEXDeu1l< k'k#P(єzҝ+hgg|*+l蓲::d6R}&g6BL{(J߽I-²!?2I6ݠ[ǏBKK-S5c ldJI67ukr٭43}X[*+_a?dž g|.xQ]6l< k7t--m*pg#6)ln¶6>)DutvP 1qli+3/6Rb%?62bQl6{ya(J,[Fժ jfo=x-&4F*U90`hKotecjm*l<i>}pp C|}FV?~,%$ls$[Ϛˆ/T!/62_4[eX{j,~A4iŰ3Ǔx$-J2YAC6R  kK,g%[Y Zjmi*!r8#_d[+i+ipЋL޿sZ76U' 3 ;uO~̏Ej07K";[ʿW_Zn#Չ|~udK槽rߚhw^tٔCFuHy|oAVlFF I>Zȶ̤,;1y(Hl.KS rHǽm#Z3٥%Ik 1GHnBʢhUvG)?}Z֞p4Df>\߮I"|arkDεE+ k @ݏȢ;ɧw1}-mmdn hHW禯lC;^42̜-RԠ*xFj)-3GS l$),s%H=;^wnS1'6R$[k}X[ h|~XdZ6됍.leˑ].pYU~dDFfiɄ67G3GοMj(FtEukOMxr6;3&ܾUFj:.pd#y]xFӬm|[F#ulȭ6R}9RmN uٰ*H4&.+ kŞT.ҵI(ld6c&j.gOi&:~ㆯ<6J"$^]u+AE.cjH=`֋,aH6 KS|K_^n#q*.xÇ,i()rlL. It\(& -첩|ra#/6ΝrFiKmM&$ ^v,v=LTzt}c# i..#oMIb#wؚk;o5wnӹ-,Xǘ^HE u<2MFEn# Ȉ}<9]?+6Dɑ??dlVeXn&GC?T_|eA`i2.~VdbEHnF"GfF|z"} yG lm# |Jm}ī젧 k땟5XWWWY"4:겑e~t٨*I.^oͻwׯ_]6]]ȡA6NRE!he&9&m*!r@xW6Rh=b#.5|y/R;??Mq||LK;l26f 8<6rkXh$jhjk#!6_\._>cۡi0N]6 15m vQv @CnLNGJ,;DaY*Vfj YuPyP(--2}QZӧFT$e# D9o?GH$,lf>|P˦,-,Կˆ2╆2o4?~H wee5zĖmmd6tɄ$W62rfp`Lз`5}y9ZjȒTlߒ+#'jm#Wkb;Nl69A c/mUUFw]6PwY>esaxo Sxd$BM"L(ʊ.4PǛˆԖ}7?\ka7.'i򗴻[;SR~F*]YD6iЌ2|ll0@׷oGUj9991MŅ,DyKh2)rd{ltS݋٦;!RXlW^/հ6*̱QGHAGfk2TUsۣT8^9GKQsvvF?EA+FQt\}Xm7q~~嘒w>|d2ˆX]M&$ CW&/ҤĄ{{Q9::MA_}ybX[-4 V/H^WkYX]{xdGGD kw]>cl"C3:<\]6>fu忉396W:,;&lt>l]6J񧯄5i݋Y1O<2L6(DT Z[jHed.{up/)Vuk h>M+O ]lm:8@U><4 q,..]HfϠ784sa#+S2Eg MZLH<&>+I&S/6Rm#uH1J%?lk"dHLZ I]xܻTǪ8}{4^U!P{ ˆeE6f)Ib~ Рej~]<{nggźdI ,(Mf#QX }egм.nw!˰dBwDf!`bX}2eEf6rnQcb%hF ^)hd(Aϟ?F`U>*62]bɮhٺlxrB-_Hio"$i.bGf7X__7*n[F|Y(Vpi 8;[UZGɔx7$: -iЌ貹ʰ6K?xo<21>FvwQ8˗/kkklk}BԂ8|<(6̵0 vwyGvSQ'6Ry7o\>c{(ЌΏ iDM(~JՈдu*pbdwww{{}aYZ̥6[ _+_'&зage33M鲣Z6R"O^i)FӺ?kN3\oއx6#yP(\>c'1:?V/lʡP݅d7X G^dY777ʧO6ȩIT⏔sB2g&G4Bw/BR[dYR?4HeZ#+++LԌG޽C|hު?|9bk#zZ2i-$dX[koo+JU%8FGQa8MM[iD Eesam&?~P޾}ˬx$˽~zwwIIMaeÛho]6:T=uu _/btnߪe#)j%ARBґ ŌMk<ʲ/G#6G=қkkYOSe. k u4jMo 92B ?~ CRw,E%lF.+)zI7"$3'/u#r>^FJ*,4 sF.Jذ8z$}X[m>fk#'!-hF7Gl$Q]6 l\+ѥZ9|ܜx$6<88^l"negM&$P}]c;8I^ld=>֫}c# 4ͤNMY kSzf?Ɯr.u<2î-w=HwӰĄxW>sÚ$1Ὰq]69]6[>4?2+!Kl,߬|v kk.4񧯄3ZlӰoӹʇCG|ww]Ϻ XHjIT4FŌ9U+|e%Y{^xGvSͲ}{{bIQUcteչD6P;lk'k-%PGΪ]6^}d3"6fBCU֖&c⳧bs>Iy0o,R{o4ٷZ6RTͪJM'6rSii#7 JksއX:퇵k:#ut!6]5Zr乻MtP28d6Rcl.:hq/62qNտLˆv3RGGG%:2\3y9^(gEO X#1DѻT Р}<.ggCeSF%Lq}ڄ1BUq 6rlR?x90gk#sQ6D6[{4KWBR+ Y!IH7ovcHbX[O2ۓǭfi:r4Ϳ,[Ȃ$Uw>zFJ݌am__YYa{/ee _iYn`Mt Qw*@)LLκ])ge[Y ct^ IVihW62y!PxċXOc#<(˝^8>>.rZ6RggCUfl ;[5JXtsxTS_F/_ֲ4;;;iuQp]6|wDN! k/Eð642'+h}}}Eq2.urlzd_N;-yO]6C߅@/П>}P(xl$k1\͗7=E1퇵܌K֣QZ0Pu]GiNt#Ϳd]6<ˊ.+k4t:>qa#IPSG1}lڭ- FJ)oEH*l<9O<2[&^ہVsچհ69;(kMJd|76ROM96r,9)lo R.lk= +++xcf{{}.D#y]&3Ʉ,dE Imv}]3ӾiߋL޿G=EOսׯlF! NKT=USMaHa<ᦥd_iam}yLྭT*?gϴSe2?_K1:2<&T*123F覠ׯ_,SUK[Y2Cץf5W6R|S͋9\d|x} */BaN;G u<2C3FcSGFmm?v5.xdia]6|IoNB3r PMJ k/=[[[߿U']6RO}l:|.y|܋LܽS LffdQuҗ-X-L$,^^ZH.(,rF0N3|Ţ6;l]6SRR?|%$ .yO]6U _/3~»w9֖Y-x$ɕ$FemmKQq4͓;+ l,.=*K]6q5Ho ѐRHMOLߩY`; EZ64l%MoEH*k#bGfb4|}}fPUֿlMf"J&0yfUFr^mTtb#ʃ777/7oް.=6~v,.]HfD]TnX[RJ& kG?[Iaٔv)e31A)D_ĭ[4Y,{{l%^Qqc4/O_s>e#Ej)c>{9//Ӆ!?~dk#>d.}0}#c컠ȰWﲉn#>i ]6,//uׯ4&]Wt٤Ze|lO"W62~O^ld {4^Fʃ[A e:lukdؽ39=IN+׆fk#U%R9n]ZQSUe㓣aX 7&]W-NJA[Y6CmX_=_ IenW~˱"$Յn)xd:7oFXYYavpfy}'''9]?~]tl^#Hldtٸ^\H?jxWD] _CxQ 5htw5x"NLU;'OHXI_hy7֦-e0r4͟(I6 dŎv6R륫Bs4\>cR%+wdeS>]EamI8j ɻOҴal2ہMf#'p_7|%$ =uuŸ`/S)*_n#an߮e#iv+ZEDёK2fm#xA6$:xػwXRTUp^tٔCwվdŰ6| d!6E7/_d2wqF!n4ɄCnn_Hyd [^2=ŤY,xdWҒ]Z u=e#Ň35Mi\ѰK*߰8={ysOHSd.P}ƾL؂]ai.oX~XׯxW˗/$Ce}΅B򇶶޼yG']6QF^2YF&nKA8ϋL޻G,E7M^76- >`[\9;(\Exdg4MsۣTGG8ccN⑆"Rќo"$jJ]62We VlbЌΏ֮h4. 6rxoj1as62]b}hutKxN[^4heb>O.dQ"+cJ mn39)\短]zFJSUnCG\}XuQQ=u,-տFx fXݹl ibgg*]67y|̋LܹMr83.tмk#aH}ɤu<2͕LxZ`:=o/S?䄞gSp۰6~ X__gC.ldoo߾Q+6dYjTB? O* !o\v)xdZ`eo޼]@^][X kں'dS WQekYhi.%AA.HkRrLm.=ɎvRO“^lX0R)Sc#=KpN-L(VSdّcIŌY5nAٍ325FbӐe'6Rkkkٷ@SveSBamÕ ]4\.d ɻlUfjZv6c3 Mf#ĿJHR z } k_DQE{^ԌGvv)Z0sdFF"aa#7qbEwdn3[c_fPxū@r8\.nl\k NT0F SX] lmd~=h2)8sWBR>eOڿ[r g2fn=e#jTMM:;C1mz𦥍d\[33އ E18Na>V|/O>17^lweȋB}, F] k߯Աe.y&Z甩I_HSG&ZHix'A`aT]VdC!4&&mmvB u<2͟E6R9m #;ItlՎ2ϊWFvĠ+c4xEv%t8;ZjMo !&UZdI'HeUFc,+loJ'H9q_.W n\f9Ry\$W쇵z뉄Ғamv*`w}<#* <╻l.⑥ tFft Blq~а5Gf(d] 7]{{{%KK6 PHɄ$/}e#!Y"$)51xdW)իF[ֲZ $ZldJF.RUkʕ z{1a5f'!I̙iGH+`4$ɻ( #_aPպ(@*^ȫN+JlB!YA#o}%k..$N,Mfk#kɤ4sއuH+\^w||\{ XD:)05gggdS^| *ufI mS_l.>άbɶVJ“^l9lf-˒ V#t6dHiz!hX:%FԭabkGzE׃63dX̏?^>cB%'e R]6Xlހ.ډZa`bjiɅ#'Js62ϫUxٺlZ$+! ӿ.зu2Z/?~QjWsTgXԔ$W]{AHh\[hh#G !FjSSonn^>c~WUE/GvTFu٤R+KK0Nե?~-\]Ml޽{W*FlsO~ٺl829+I4ˋTcGfbfcc.@>g]]l]𐽍;[ʿԂAچ,ȹTh=ׯ_ٗi[͋xd1 Drxwwo z(̍θcLB{{{C kgDfgS%~㆏͛dľ^/62yjEo1MO`uzjXDs vss WD:*wVkq^G><<:??ˆ_Q,..e(R z888`]EхzN:Y'4ok#|Pn I(빯*բQOڿOKs⑤__|a(ZHWg r #WkYuG)S鑈am=3nyEQr^tٔCFu$elX;HQc%klF]InÆ:qaY7T'& W6Rx⑉V/6RbCiAr=X.rdlga}6M]޸Vǽ#Zb0t]no`"0`?xy]6nwvvׯ_3Yta#0MԴaG"eapwnHHc^ld勲]x]63u23IexIAWEݜf zkɤu<ϩއu$žҾ^x{?~T^(za馦FWlq8ͺȋ"۷j͋nBwdYVY`[;^g IVydWHA7/BRM=٥%#Ӽ4۷ޯ}&ԗ,<|I;q4רeF$ͣT^$93FU+X.#3e#ݰ@z!5=FNM,۷oIMZXHy?AL?b#YKc#a0]}v Zֲ)U5@5fm#׸g6RzʐD'6R~];v5F㑥.I,QamTa)Apa#/MچQlmd>>#l-wi,ZxWBB}j Ɵ k_LF_,YfJO2eKij0`k<"ۈ.a{]6NlXP(\r!$yreupc#ww5xMOCEH*SSMcGf(/{n|6T] Veߤ惎E:]sۣTggFccNTL&^J".nsDlҪ X;<‚ 92B驽=R'>|F|yHHx׋L핾iggg/_XH-fn'*Apd#X3xNUmd[̣+)GF ksnnnܝ@'zmW4i;͝:9uXt[q_ ~C'֫˦ֿˆYIitr,M~B|Ԥ 9f?WVV(ZM&#M> 7[ -֖}e#ǏA%Z[Hih (Axa\~SO1??oR|Y9=mk#͋ͫ`LԓI#uJoR@}|kF s-[mL$YZ:[ lm#DוF0g<t2[ӕe:. - )$%r޼yp=Tl](}|r,9 ]64X21+L3&I"$U.-'kz\ĶZ6R' Fм\'YzF"a-$Vi އ *Nlm ߿SVv :Qo'ڗ4*fﺞ;Ggd'J,!RfgC|WH]`Cj Ɵ4]2==/~Zhju$FȢULÎyrImd/޽Fa 'HCf_Η/_.1CJ"tc]6Yt8;r6{ZFVM4=4do#GmZʿTk:퇵zr,.O>KDEc,Χipu92//=G2l kuSٶw3gl0L !$й[gs-qK}֭cڲ9;;KGBPG#]6+[bBR 8Z{F*\|*uD"Lssɚ㑷iFl6\X0= Ik!ID݇ +b͜߾}#5}X+*FX}rpp4^|IQKȩ)JQNZ3\"i+-f#I_ޱ[䠄Hޱuy'H򲑰M7'ܒ$keZ*vri#e?s6&>T1Î$%ֳfca]6IFamXr||\%/GZF׃:;ZLHF=5 I_]qesKU UHd]&\3t]hoe#eERӉ4kL3Kri#˟N$H_z<{y`UK˕.A,.SvZ@cb-p ɕET6;LqLLTS6R'O7BRޢL[io9M&dѨ6-tx~<^t*WqX.~r2X.>kq6Mh3V/10[*؜fFVYj1`S6R^ZbFKb/7BR 1D3ϟ?wsiOF,:B?{ZQGam.ʲ,phF~? Fw6;V,,A$9)5ˆe7^ib| I!V|K*v6`V$lȾ^*/Nܼho# %ܻF 击X+wldon= 5V-|xK7_ P׏FY]2<:F& I'6R[b?a{9 X.x]6/ی.nx1MhRssxxilk=he\cVDץVCt䤧#u.[YYqesE U⒏F>}Ӱ<2\F7[97ko#/<<_ kwv*g?{6Rdl31 "NWQ-մFt;t؅#k@SO%l3THSe LHej~IOH/Cc^w#$E.xd)KSj֦֭w3DFf~ux:;c?ihK֯-v%"]6Hldwamt{-^ @[fdةJItd#ykFNUmdO۲KLӧa'am}=X/_V1CQQ ueFeAXwvvbI++, lVWhH~պlxi_xt(Woy ^ @8==t\BHrK bhRǭ<5IY762v_JX{OZ.%[ԹF{,YS*sXPAmdQFti#U,(ͩcRI`YE?e iX?]vey%l%(蝋mڇW)?TyۋxF*>n*g#Gr/^?99!M'vwղy&d;ɯTsdF./ASM{\gK) VڒFj JW9MEuxeSh\.am(4e3|`k#~d~]_~%!wsZn#b ]6|x1̈́ r>ɛ[>}NYnhFnR<*n1!s*yj: k;F"JSM2Y.]6aU.)8f/!$UFK+62' Ahv >x)-= E+zFT^>}ssղ@?mG2){93MyKYS‚K)ݩ4eO|FlX]߿g\סx/hgQ]6v$h֖2fS8\eFhww7ϳ$o$ˆAZFPTX[{Z4*i\h;㑦d۷o?y=dE6?HUG|nG#3\n뉄Ցm7 I#{o5J=.E]6hlCEF6#8*-tj#N<3B7tZm<@KܼGr)qݍ&'C, ޱYT*;BF1 nnZciL82 6rK+s=.mT Zw{{sYE4&.ao߾4-տtHj={Fck-`k#A'uuZ M OGuȳnld&} ^vzzj&3~kHefƶRL7;[}.-Bʉ 6ReىTϗ?xoo~YMB> 5&h}eydŋx%۷Y%l,ǚH`<ˆ1ejl:;KZOHE1?r#$:3Qw#o޼aocju$mlzT$(?$Y<_GihRHj˛ N#GSIBg lDZ&.kw+^ @3^T}Hd2ld#deXtܽjamP<5د5 V=b#K>J7sߙuV{-2!iEA.TӉ)SU$)DyߥTS鱘gϞU1* b}Jf#3q֖h 2^ @3OSML$'am*{Ֆ|-f#~>Ϧ)syݍw&xd+~ fkH}zR-ol9;ko#(|`i#JS\HN}2rmՑ2G{ X+;eE.kef9Z]bl&'!)ȴ,; kgqFBV&|WHiӢl{{Y:fZ6R?uOai֞ #uF)6R$ii֞c񻻻~a4^ےHkk]6h*c6Uh(Mqhp8<<$Y mmZVI{Zˆȳ<;Fn0)^jĊnjlJ/y|nk'6~[i LZ 466܆;nQޜ6RVGBeSeã9 ]6am43^ @3)%lfY5gsSHSa lHeb}JRޱA˰JБw#"ˏx3ѨUXdN8lm$N6 \Qmd4t]RHjfR~f|NڴjǏwna}+Tw] f''OJLfq}tFJld>%V kϡ {F&nҀ_]76R(?v&_9.H tΎZ6R/FR'Ȱ\[c_Ӭm^2I Qti#JX;pb#?}QO^U{wu (Glamh2_t +cy]6+[bBR[g~L <֦j<5k|`#6RO>ށ&ydz+%UXVG>|6|uҝ>'gx4C(ĺw'WFeseamw=~Q鲙wj#GGiӧnIX;;Օ{M;6R䏑i?,3o/9 Z+6*杼PQXo,3Dȶfnsz~*XR\]idz<2͟Vz$6}ޯ~!{wb'''?.)l,$ecuEͫWpH$.ཽ=Z;Y\_[Uz-k1!ŷHCey_,, i=ͲZyu66|eY(GLlm# |bGK!mFj~ͩcT-Kue#IﲉrZӠmڿoS*36FNN0MeI'i%ŅV?{F* L˰ZUsM|ŋqONN谋]l'BE+)SaUM{ 9a6R_6zPO^S!e#T貹Vh({{{Mq H>LE)]/9y>eHRoS88y!{Ǎ={lxve"tgihsqF25d$R_o=[ 2V.1 ]6Fu貱 k󻴿d>~x." v2 r`o*z66<j<5rGldqG&ӧOqi5k|^~ݪE /3$ȶ}{xdW'=_~v]TJ".tԾGXY.co];Cdh<2-KN$cZ0j}1ڽc#ő*Vyݍr&xdmnvx)y&LFlNUm6bUsi#Ufᰓ/_V1ZPTú_]6H]6\nIXGݻwx%M˗\bkolPƍ&p]6u#33~!762Cygld>~ܻxf5[$dٙJ9<8kss.mdGO7FSlzT]޽cnV!e# 15m*R6 &w%6r5ed2694yVi1LSk*x"]6:wкWھE:HGGGqڟuQ/ uD֊eފm:چO>FˌC H^MnTUG]6ZXb yF&U"mnl41kvBAX0x6jU&dOAp:)(Ȳ,}GMt)$5kqZR&'eWq]6n,+˰WZ_mp)VF,S3N3 w٬иA ITWW<5i=yfƍ߼Q=b# ~:HǗ=ꧧi {oo-1.INs|F꺵C!ui#JX[Hmq6Nia#NJeS貱 e4l6޺9#dc"#NiMiÇ/c# kS;xg<2_x&]v{H`_k?Y k!iI9-pi#96R ~]TS!e}<2eS; ZS<%ܼxfFg+6ˈ E:;ZˆƼc#7v76Rxi7E񎍤V|>G͛77,Xޖ姌6[dm#ϒՑm7 .lNoK_UH"a#iE,貱 k[ &.a6rZs\Xdj(k,S26b6R]ZbڴQYUt, }­Z6R ج`"aeDyM|0Gm$_UUksLk?|F[ѣQG#qSZ[PF\[Pl]6ao*N8)>UB"NYpպl*=ޱ3o~͍TY;{g<2oB3 ֲңF+Z~Ցs6rjl,)}Nc6R4 vT'ƙڪ]W60 &uetԾv?~h2߿%kkT@涂k6rk-aH[ˆ<4yqhȍL`362Xe,>==Q3~Vam~߬AM Y_wp[#3ϒ۰vO:>f?{tz999}Q9lH$5˦N$ XʨlCׯ2i&aoggH>Oe&5dq'㑦"-_!I4Z$FUM kM..{?)Y&;қQ!KSUFrYWkYEbwK!x88 k6kOÖ"6tlnֿˆ;stXiTh>43F/1R]BɁ̇7 V kOޱɾ^[676R`蝰vt·t:wkHyjiY KJX{jF)lm#KP<{W'6R{ @W߱ׯ_37iІ |<]6Eut k;>>h2߾}t"s,Bw G]6<0b6R (Z(.jgf|~²>3~s5#;nKV#ylk#s{ɤ-Zpͥz{S(lm·e鳳Z36fcQ]6cͰ6^@fae٩.A3<6y_i$ۼc#6󦋂˰bl$ȴ(jݓMՑ|_n#d T<(?$Ydžm.$sm᱓H׿l*lI$6P Կˆo ( cjqh޽{$]"T)jk#Az:[-͍<=Wqc#>;g*wld |>s:;jHuy &e:OdH>:4kLBGJ;SvUڰA׶$Y^[sM&A߿h2鲙qj#t:f67u25j]6LڕekQnnj͒Fs9g Wyts$^Y`o#''H7XՑK)WVG{Fccxv}m.|,ְ.vXݢ/_e4JE—.Eqb#sXZ-MS)]HqdQcׯ|pZ>{=/^uVam:ko?p:w[mdׅɄK)7+199a?yǨ1!vzzj&h]Twل貱 kI~4e3Ε2dYj]6܏I#ޱ4nhosc#q6( kg޾9aCoZaow*idz<2ͭ R9Tg4gM^{ mذkWtٔeS~˦Ƶ! Wi:foȹY6xr9.k,SxPi10.O3nld -]32iK3wHX̂7,wW2VGeFehxݥHߢ6Ed ڰqI]6x#3͋販$_~h>O;ς`CW5 s|FV4kǟ oN$HRO>cϟ?g:KU wyiۍI*̈́m54`CN$ަV`FnVx8;}nl6&_9.He9WybzД䳷c.-mHuiɥ/>Hgc!.o(kb7 ҒS+?.d.s2i* S.s-f#)&Z%~wƛ,x? 4Wl|?|C+a^_kW~p&QGam>E\EkO ]\HV;5'xdw7}|uY&a{/%ڰqWl$]6ܶeTt؄||B7%᲋ڦ: ѓV k+ wl8BR[_'BNzx_c.* a#lJM0ب.ham] 44ٛI6rabnTS w٬лcQul0{ˆРv_n ]kHixudz>16m$|2 Fi6R4F33٩]GGG:acl4HԿˆ/Y͉"c&ۋ͞e4C0B!6rp{{{LYI'X[]i NwldS|Z8˦R6ZJX۷hѥӧOzF_Ͱv[(V-9ZHsx4 XGybW oRoHex~<]KMZ ym %I販—/_(4C!3;;;4;WZ]r5TUh6W Ԕwld;FJlQF#&,#;h:R HGٙ$G# 6C\ IEl n?|P}h,6:貉De@ͯ~A+P(0[tj#y&4NyڎFGtXo1yI[amHi762~~2 c'6}l2?o^ JX{rFo56r[P&\H:m B˗l,VS e#ukyMZU!y6La$k keىٻc=mvW' " wxFʏ穬eX[.h;i~^|yC3Nղ'|_=l%uHX I.]H"-߻gk#!Vxoׯ_n6:G:Mϻ?54?~Tl&'H>UU,I}llmV`esńλe#79>76Rx7EqAZ(.u߼yC4-_ _ZPJCcn3Dѥo\29;c?E?tβlv%ΰW]6lj9<..TFG8#$5>#A*xf ߿~pTXl6rkZjH^&UUksQwץNW N:W^coUTÆ^%YU.J6[d+ϗ> Vr`#L}ja4id;6R$G~͍l] FPGjHi'UWVG.U_EΰW?FttԺ"?88 ^zC"q.#3$T-l;}=]ޱj;.]`su}4;' YX&lĪ's٧NldqdFnv#$vvzRҭ8 kw0d°xVúlJQ_zǏLSJ1OVWl3t]n..yDO79xM76RgE;al- q~hWwTfoZ,t"==mo#|wamydĥT+amIrb#5b0 EN eM&>_%H|/m<&,F0Frfx$M3-f#չ9_桰6o4#6Lg'\e#.RֱΰX0iƽDZH ;muեŐ6R`,nB6ږeËXM]6 ks[[/Jx IlvZQem&p%|H-T&ѡ3lب\26rTe:}tփ;|E{ ɪa+O]6RwY. ]6(}%˗/ňǝ+GDxdeHy`$n_r5y^YQcϟ-fFkH-:}i糷S=#96R4 vTǗL-l^lN҄?^p||\Y976TH/)]/92Eh1!IWir;6Rdw[bׯǽ3ՇZͰ7ŗ6%OE#dFfc.m{bu:>f?K?~v(@6P ԿˆOfec>99kX 8Xl9}X{eF˔V*z2顰CzMpc#=$^y˧4d2w}YUnި%$5FVTiSbm#K@bwK!'GamU1 Ȱiu{mA]6;Օ(RKtZҝ$IX;˧pպlnИ11FuKSھEjp쌴A-)Ol)V޾EJs6rnm#ؘK..VڲFj k5 yYM-lE տ˦W:lj\>;Z' /J5y6rG}"4~X[kz{[ˆUKޱɞnrnl4>ζwYF8<t9z)^swٳg,>9+++aձ\SNm4yuG]6\-f#5HC]6Iad_)<|xF. =D-)޽STd.m$<<_.,D^˽mm:>ƞb1nʵ# e.ZN$LO=S YYCYxt{{$N#3E ZmhLMT3d)~uB762]I1/=:_}|B{/ rmɍ)F@oam~۝5<{W6rbG:.F>L HH艄wldQX;F ;62iPpxED,kkVF Gam$62?LO&]HvυT#{꨺~7+PM/l"uĠkk@*]6CNd2y1'aL=j.;}!ҒkWl|X|lS3K:nղ_mZ5zV9bpoUF$tr^BR?}_N:_~]}Sfu٨-k<]/ Z;E {VZVWlm!4 CjamV|>Hq`mU]FH|b&xdP'.j(Ąs4ȴĴWljfc1(l\0hUNJNڼ&cKmd!.mDB؏GvwVV8͖hW sퟏGn5&FMϟ?\o߾%FT( [o821b6RnV?"$&6}nlf^p'Ee#/ljǬ tʧ62Zd#BR'YZ>ᰓ%/!O.l2Y uو;SWIeԔS!ɈDF[˦pw#M~|#A%)Wl||ljH|S)SU.}Qӿdo#&)|`i#WG*33.mPYrwTv$lڵݸ.*`B/l6{vvpUv!)/.w#3=,P3V3vdrau*!67kW]HË2:b?y}I/&L,Ѿ(6fs]6qȟI'Wŗ/_.e3O=2d<;ŅM%n!i@a+-Y Mnި%$ujy|̑a{g0(6r$vtm4JEQNFW߱6,Me(g]6 kAE3|>\ e*o0"IEOTFD5re ΡW%޽sriWz E/J#m"坭myX[r9UڒFjy*uxxX}^~ܬA^AM(Ԩ.hed+͛7#Fhgq=hk#Km Pu=LvuQ9~)ʺ&_([[`S3PF=ݴpz&{Su[i 9M&%F*OFzF*}!~~LC!lULU{X;ϻlҪ ˰?\!ԑ͆G9IKW=o.ʞFqp;ۊj<ڜ_ xfG&˗/YPfX !*Z d=DQX߱mQY֣Q6R~?a1Ⱦ^?~tNOOitO vG76<._^yUt~Bۤl&/lox]6+*ZLH|Iib3v!)TuWǜLKE;62ip7o]iQNX;˃O!I5m䍿 J֭"tTt:eF(.m}a#N# ޜ;F۲C̫kw販 kGh S N#:I'a,_íes{#$uI762~oFaYXY&v||l}OOOɖwjH1V_qW k*fm#9\ I=b\?G60ͼ/luٔ6}@/h^`6rn",ȭ@ V k;uu;6RL kBݺ -XSqgfjH] .Z~E*NmXDZH|TX}NG]?ͽe$a,-[eSX;p@8>>>ǜ Irl*q2iD}j?XoJN|Y_ImdÇamur~yTjSydGGؔ,[ȥ%{eM8?ϩ*amU;;:cЃMxuiu)P.u, 9;;uHޠAxxdg@l<_IFt{GHXF&^\yFd2֧YՕa[S/Y|E/LE6AGG[[si#28`k#OOǏ=!.H]6Mv"azʔ<+ŋY,F.,0TOɁ,4պlxOYXTy^ \vԅ y%[߿>_|aMQ,VG|J*aey;iȰx$YEn8Flos%${/l[t6$ާOVe WNSedV !o޼?pTl #5:FP0_66GLMT~_=b#]܈߼FJ|.- kg7NZqΨ]Tx-u:tҜ$uFG\GX%H8J={VW9Ml' ޠ.t6[je[a(89nNXպlnTzI3޽#mvCIl kW sP_y}Obt_|ퟏGnսˆE/ڶ 4R;˽}6G{e}#HYbŤu-#32,H`]Rq;kou֖EFXiIc2lS*C#sSSquQk*SJ-IoU(l]Ms;kNqBP( Bׯ䲉E#eR5Xy-fˆ) ]FD-pIVQLtТ"WqH(lXL,s4R36xnЪ%Q4ei:iGE"nJbf%T]PE)`cUqu :gs> =RlZsuu5/( BP( r"4rF#4+,1u#Ŧ4!)ަ&UY.B#ks)y|J9mF*'VWTgCɖi$ S*idPH)ݳ* &x@㬭*,֤5 A')M]K.aK5!gQ( BP( ݺuD^422HϳH#r)GFt4gmWEC#eII% V:k+\V:ZΞ=ўdFJCCY\1\SP`FRc45t$\4Xj`4RAe644W&բ޹l!YBP( B'N0hydI +c#ʂ&"r!ݮ$<Ŧhg54RL< EjhM]]Gc2; 8W%J*8k+t p*J)aS+bc-Geά1Q"F0R'юvlL1\/gm\> BP( B9W׮]YiG>42 M VlA# jJ &yvG*IEyzU摭k\%Mf5/4?Fbs@RI,ZJKxf_&[erny0y6IU@2(gr&`~31jMZ/!tJijeSWRb\6j0aI 'NฏBP( BPNW}}=623GHeCЖ"`,&Zl"4R8# wk<# \Y[GL#,6G#e4GBjFβL#SQ4x6\摪gmTǏ7.jMS) :Twsؿ4_jt::kP( BP(uyo,K#srXgmẊFV]*B դQcI¬ @j4["4rÄ3g0;7RK+ę4i6*b#"yd%y.+i"%* H#&?`Ihk.!Q50peQ( BP(ʹjnna4 hdLWYDXebTV:4RB+s٨'..rg2/^4ט^JIybJJl)f@LM#눭Z&FJcCG*RyGL&nˤˆ jlQzY[lNBP( BPVSS^G'e<GVnevV1.B#j"vokh:5K$]E|-=j%߾}[1֪t.RjFkJF6:kKHrkv>cVz;}4Ӌ *ݨU*m˦s٘r֮u( BP( \Q2&V^D8/I|EiJ-.  H4Ͳ1xkh{$¨rYm.C4Ǐ3.̩)ht>Fɝ1&Yv֎P $"吕4RjX8&[M}qu4eA)-K.pi)Vgm^ҥK8P( BP(U[[Ѝt^42@ !+(쬝M3cc:yz <=\FHsPh8,Wy;;w\KhRs4Rc; Y˕4;i$cI$nYMvS[I#e11">޲ydNjTkMzT*A0RMBR粡q $˦ԐǎABP( Bs1E$MR\6UB*YURhIBC]<ӣ|g54RLC*u.C#iDǺ:s-q sS֚;LD4d V(i:õY$խ[U|i& .رcǘ*ˑ :4JbPXh\6eZR( BP( tݼy%M|.EG3DB*>ZINI#ZCGcc4tF?X ;766W&թTHX*i.nl"i} BP( rh=Ma!_HNF-)c%݊ԔF#iiMcHqh(AU wk<|ٞ{,6IQ2I^PYФ#b17˳F*Rp4RN,x޾} 6HUdRˎsTT0^lXgm92BP( BP((|sPNE$>4xɩ%F#;4!u#Y8,) .3Ehd  Q]~ifJg9 ",+Z IR- 2FBP( BPuqex:kӜUURyd% Su0)'i[]!.B#~\)e D:U$jѣG͵'N0$6#b:R4RM1cP $+R.RvH#L5k׮ :k5u.z򢆃c.Zji4 BP( BPANˋFLdE YWP@hA HQhyfG[C#hl9- Ślɗ.]bXXl6tv=y\ zt$F I\RnYMJ F[#[ 5FS8* t~.4fosgAgm BP( r;vY5JY YWXHR7[ybB3TQ*"4Rv tVP#ز21Ԓw9֭[MJBvJ {feQjMNL# *4PH$8* H<">ڪR&bkT :{.gmgWQ( BP(|2Z^42;u֮* XQhl^$QbI(8)9S:ՙkG%;EF27%qsMAe@asȦБ8+#Uc2pY`egC9^xƽD$l˦ Q$qfN9r} BP( rn߾M3hRSy(MFjɱ&7%=- 1SӬ2l]*l23i+vɖ|yYu󥨶.;D$ĜF"MjXM#u.KYP`%Tb-呑i5[ vc1RA'F.ve#\6L9m. BP( B)`W#u&Ư)-F.#IF2:T$'"2s y5@R$ ]Y[GN2$5r97' BP( Bh=M^/~@C>?ϲvNvK莖˦VEh<'D-(2JB<=\Y5KL6SN17eFJvjAsHlMyEm \pT$4{"#JմJwegmBƸnܸAp"A#~|Zhsٴ8k⠏BP( BPNץK\7M~˦yN,;GFP4$"4R&lFJbu]ill4ٌ\BɰБ۽maM~>Yh9Je<Jid !*J)f-I#޸qøjjjR)"AJj˦sgmϝ;> BP( B9]oߦhQ‹FNEU*x:0jtgp~jb)sgm T(F mcl\* hI6G#t\FY-s)id>W*idPH!;4R>*?$9y$Y!GRK(YBa\6$+ST(J[__> BP( BΜ9rlH .Py*%w\6YQcHDV V:k+IϪ21[DsMǎc|Hix8nrPpMQeGlqȦБ+#Ue-aT*YPEHbe9rĸ._@0 ysq6Mqsys0ŴQ( BP()ZL4/IwPS4ẊFV7[HhlnJqbْ;8)޿aw EjHL6 .0m̬nJ}[#Y T2Ʊ%nYElhEEVHšHc-GC8uAuBDH沩$"eC ( BP( :rC`rsyȈp GGfCn\69-:TwHP:4,-* 5y˦Սڵkm͛4 8T*^]R̕;j,HbX#sb15hZC#fʜl>jrjhz ysِQveT"d ~@P( BP(uŖ\6<NcPLY)JfhlZlCB\FC3lC!pH32,ߓ'Ol 6G#剌{XlYvmne+j4x,"JH5bTʇF*33a'NW<yӋ沩q. IMq BP( Bnܸђ&:b>4$Vu\6(DFd߂H)I])v h܆Y_}h"\ *gfFK44+JnyL ݻ8+qVd;N:ŰYyK:nlDH#qĞEP( BP(uaq𢑭>4>/%z Hz_YR:ԬQg l'#K-1j7o4nǏgoSSH)4]k!ty426ij1H؀VGZSHe;-H`\]W\q/:4i((q.`JQtfƧOBP( B\A:k4zdmq1H-<F#(<Ș V:k+Kײ21p96L1]b4gmNW ƣSPh-HH* Hid5A֪+iP_ڱ#w٠n߾M( t~.2!Gn(GYOkjjpGP( BP(WЭ[&9$THD‡F֔tFJwP)KNvHOϖdAH}Ԙehd5uuumk>(T0|+]NN6=692,eXPp#$Z[C#![yI~͸Ǝ;T\0饞*6eSM@L4u־z*( BP( :y$8JKGsü\4!' HM*xTMYZU摭k\%MV&mE&3Ѐ8s4RFaJ,äd<429%95' *JH9\ƇF*v4ǏWׅ _TJ.˦Զ45M *)c\})Q( BP(t\6Qhd^.4Z]^4d5U FBC) ź۬RkQ*qgrݲѸ 8qahkJ42+HšCv&&R@j&*+sH-iEΝ3hnݢ^$!!怤N)6fg!49BM#DZU` &Qr֮`l/\`?DZB!A>%i\61)&?455ሏBP( BP."BɋF&$#aˇF3N 4CɝF]<˳YC#1KsY]´:|Q)L4G#e$4WSZ2ɩ9idSkHYLjci?XʴTرco14U*$PŴ}q?{,fJ$ .-!!aƌ ,ζ5~IKTT'|l2?|D09sofq5ϟ?ĉ׭[wUGGGÖӧZ;vh5,^mTPzL%O"1qqҶmj^{uɇ$yxP<o'hΧUJ%sO[+WjƐ͛'7m4xI):~ݴqɻSƽw߭ض$**~x|}&Ji&_5'N;ztHҀ}7o7n|o9ӧzoڵT - pA?qÇh. qŸ/{l)?hab] =Y`ᐗ#{キ~s+ill4X)uʕu+~<իW>|'(J㏰]d#<۷m,zaz` 0apMWۯ_?///X8VgelaaѣGSOŭ_:{mo |?3gpl={ |饗/^̽LL px}0cZbȑ#N {iK6׌MaƍÇ^jIL`Ν;| .j|7p_- ̝;hnn&M9sfRRĉ9z/ ݻuホx7}?xLƍ9GktO<mjFhh?&kdi2ҥ tR[ݙUp :4 a^_{xuӣGвe1gGnݖϚ}xGPMilիu'|]^m$voPxC<~}9cֵ6m힞nv=]tzǛY mu78Y2k֢ -Z4m$獗^|7~)Szu.__xɭK,6[nUFF='f S4 Qq λs,Z +G_~ak3T{g~P*e<ozo_<__̪f=.Yѣ f{(9>Kܓ38h{uf|ի]gYС￿OϞFRӒF梶{C ;u*ﺥK^՟}AKylL4`"B `MHHׅP(t0`@^^ x5LSC ѧv&7Zy̟~ᆪzŚƌs̡am~41KJJ&Nh-n-٠|O?4k | ٽ{wFY窪*a^rje2YbzQSNuɜy?^^^ϟo!72YoƎK7]ׅ8Zٳ.\4M5˗/s>cJ;4A+W|Ghf5ٝo[y;tqf9\X9C̛K!L2aotOM?JpNѣ7,]B!qCyd'xG5(HL *iPDi^Ċ[#|~=zЍ{uhydp!Tܷ2dQ*81v,^-,wի(`ػ秳ի E]FU^x"C~]:wIM}{R&;Y8S .07{5ا϶?C{ F|gLB匏5T݈ýYKwSȇX|x/| OO͛G i,+pe –*믿~c0ƿ!KM >gu#9lfmyd$ŏ_{mȑ,ظ|4>w$b=l'ߧWSΘ2ݷmqeK`D.ZgkYq3'M2&7Ze.-PNqГ<kgm~ȑ#ͤ80p_u%.NB\ &EB[zgWZK9cJ;Zt |ݼD!>=5 |w9_>՗FqCi5QԔ9訁-YzjK5(ѐĄ"O-~e۶N9')~5E|y[:}wUl(hzoKYS7U?߫ײir]qKlp;|yMe7x;8G G=?ths45CwM~">NU9; <|V&޵_~9{=n)o.LV ~y&,SWvoᶭ >M_ۥSoof%iڤp2w\rܸqpkL|Ȉ80|$-_}ٹS'5r.7W$~_~>:d|h׮]H[xfϞ7n+?!CXؽK~0I#eQ,Tfe7̝3zȐW4|wq9[6IpK_m蠓һwzP0gq֧W/lBYzZ}I Ho^iKQ((Eܾr#FG-!j$-l9r_} K# ͼsMwԎJ#Ygm¡[n0gزe L900IuLL)WԩS'6ob 6Pv wknݺ!C 4`믿ӧa ]¿~p0a‰'N:5tΝ;ۏF =z_9F:x`#""##l %00p̙,F^k֬kgĶdt=~K6׌ hLORi$4={ BXZ vU 9r$E?… ٯape˖ 0ɓ7)ү7 jOXKzꩧΞ=45P(o^\_y7n7c2~wno93mw7ojkkNѣD{w+W۶2Q,Ղ ?z߰}@>4J(=(wq|yp/y/<؛/FA46w_{ ߽i%KMnS9} E];u %}.y Z>2ߟV2F~?ϋ=?hsOC{vwܹo޲4f.~ڻ4lx Fl4$}i#|?0 @Rp ^x˗ð K9#p,a"##a)+iW8j(PoBڪM6nnn۷OB6lhgseggs=2֭[:u2ŋ<|aXf?yȑ q/F?~07f9͛aꫯ?:}%KϟH_69ў={qmcb[2=[f?ڿ; |xCjGLzaaO6[n>\^^^3f`2d4 ~; 4ypsgt ˗T؅6 nNN>dg@yyC3sMn{wm-wwf"!&wI#~Qcy/YLxMC k=ED7vܖK9^O>o~/=v A#٢&vM &q‹/>=p>$4N5CSXqC{W&D퀞=& 6WXWn" .3:eB#߳294,nEG}]!k7)(`YVUĀa&4Rmk?c? ^;>'N9c{I~锉iF'J# [6+;o LlFiWyY*.;~=Omppg^V7F;thΦK}^bWBG+?[6. |HyL4cjȭ?褥ٳݞ'XQ"2IjO3H FْgZ\wã׽‡l۔&+:I;mGߑJn,.*nϧ^:~|G䷌<t5,ZxKxrСCbvL]_WJr̙=zꂅ qŒBڭ~Z֤ok~:zV\9e5އW^kFf͚e? J`-X ((F‡_|qӦMgQ#^zz>Ѫ^zxdΡ1r9Z*°nؖLO+-A&qlh8hg6I#aʹҥK*p`ּFJwqzmfffBU&qFGdڵ+<),`N{?&TH%KEyi\ό78dK.tj6y(՗p%7Lz 6(~ϞCY^=xלOMK.]vc37,_m2߯Wߟg7ۿiݝ3)z]㧏A$OK\B~jңotĤ:5wa;kꃉ3ƿM$y&{͛`!ٷn\ܸfڵHBy`77UFF]arnĉnط-P:w~'CR(}=lhFʓSUw߃}BЫ\|]ʀFʂ$<57tz ߷]w٧WOyQM\~0"{hGː=Dux@GBBweSQGaLJݺw:tA,r֬S&wXgRL  XA;8}l۶\Rc 3x䕴i+7ucq&%%t劊_1H$%L… p;*++|i"FVWWwV],ŋY"=z?pu9_a=hPR/Ќ6}Ŋ#F`` `,|8y$ xɍW-Zg]ݮR oy睅 B+}{9Z ~p1kU)Sbv^gތ5nܹsght{/{wCW28]wݵo>yWvI{ l3f6J_ c֬Y xKDŽݩS'8g1ahr,A'7ԩS𮃫u۠n޽v!C. xQ?\@lsA|aa!4{hϰO\\^IIqS71ŚAƣ9s|͛gqw4y|x5mƻ o=EyyOgMk<’C.?_CL@YƌɌP0gAO>Q)RKrjggJ#zɴheq__8{||_p0'YA`MKXZyEUQNbʤI3MHO~O>`Yӧ=P(nRR\**]߽{wwE~~qrc?ggg￯Š(EBfAYIqhNxdbbwqE˫g{.nYSSc7ݻu T2;>|O&HpyoX%3s' ߳nG++%-p ooMEEyVcOW q}W00tPZuz?7^,]tq[noW]t &Bغc= KKKat\4{&tQQQYxe:CNk׮yDDy~~=yiQp(\qFt=<:u paؾcǎ5kL8wGcڵ۷> -[/"6X+zԨQ0ol{vl5~В16mA3@w^G}{cƌ=E,WGfV:dȐ'|_>q;֠ڡW ())iɒ% 7vo%`|paCmډ M̋z-X{tI2o *v ǹ 7b.\C֭x5NGc57$eӄwSO=5p@o 36w5o˯$ioX19na,Q!_<з__?FwQTTn#@y衇Z`ЁOnFQ?~C -8DpP[8`rR}1~?aֈ;%?c ud̙3-#;HtbWi%֛g֛Oճ|w/ f}>d|+ǁ!aڵ+LdRi+Cv0x諯TNff /kA;w/ckW;~tr}211] ĕ|؛E:41&0;8jN ]NvС42K}9d3;랷on){Hʬ9U$T|6U-F|LB:u:Rw}>8#p ``nrssK4{Z˗D"=;wΞ= =s ݧ~uqG6m'ŋǎ3F4zmzTxV*,,W\dB( 69f]]=1<4)GaNt UUUuu5j[s *htxo&{Bc7`j(47󪬬xЊ >>>.]2\*NT0I Kzc _8NΝ7! I Nga[<ŎG&+G,oaQݝz@nnؙ@\hhҾ}婩BL(-!(DGrDBBMtERSfgٯlOmxKMhZ%%n_zIS7<''RSQN(KJʊ E^T,) zc"?qpqqAAҴ4Ef&[dan<)O<~sUkKjDxftPL鹇 =]VRZ?F}LR"0ʠ 9ԭkk܅*ϲlu?dQ*E+'$HKJL~w+wiu]O$W2kNBӊ%U"5gwDbd&$ }kע]gU7gKGz’%K-[rXI‰@0OOϣG8@`KŎ1N`(ei>tvH:0FPsO F[8FpHPDD=^,t`i$/&Ui/aidyy1H77F%-H5CmO#כX r:|cic$ ޡHFX &];,ܹsg 6{)=(oۼIʦ1[Y9}ڬt6y!7ps\}zmP>u{~R47c/7/_A3>XL"CZ,FeerGtq|w}mБY&idƺR6ӏlH~!uBwKY i#ƏeF,4C-3bQD,|$ٴ"!* 5 OJ#+U* h4*FHP.H]wwl09"t"N ={v|p#i1tXiH:X"Crei"C#O:E=G#_޽{mE# h {maaa64'}FڛH[E`i$5|O# z K#M#A9tsseO#- J#YZCX s֘|h]Oh$K#͙vH @yyy|h$/^hoA#AZI{I|H5`gph$u.K# $A# $Y o;F hd̏iQR-ȝ# ?FBQEPf}. :4i54Ү@/Y}-n4@?7did+t5 O#$az44E:FŬYs3FلF³0ư+19h$*؀FtʀFڕH6Jh$>Dxci-[ڊi$ Rj[ 6F9bF4#{i$uw7di$C#$YQF5V3;yyyqE|ҧ4`2OE#==J#xreiW >iW O#m‘4~idȈqH("_4Jkx_ݼ7>>VFFHFR )+n4Ү@M4Ү@΢.$ h$9WX44$tqM# 7cAwmE#nj@#Ac`Y&id``  զ$/4n!RFi xHl4:MhƍԀF]FHHis$K#Mz,HR+4>c c@#8NF2d{FBMteĐl74>gGH;I4q^F&- w"Os%%|h$G&oݜ&z F H$Ul+ԧKV:@ҘF: H€44t4XF>>>MMMidii!--4d)՘FRewIi'>`L#k5ŀFFDD4266 ʲ-4I#-X}X -ȶHOס4/"WN4Hwww{Ƚ{ZO#y;Fon+oH;Ikhb8H{I>42~ n<ڔCi$ E˓F2?Zo E6Hv4Ji iF.lԧ0cqώm.$MHI((4R.M4RP9c4xK[I# g֤R2i$ѳUp9s4|$dNc@#-Fק&i͛4jȍ7$!K#mfFZ4$J-HkHmnnnvVi' i@#5:tԧ^^^枬1=-A<#7c ·F}4r"Kqqi i%4PoX`is iF]ÂCi$m^|hdxȸOfݼhidWD~i$dFڊFHPrtj n4@}4@RF$4h+Is4@H#QF#Q]iKvnyǪ'11ц#HӎٛFڜSHFr׌>[O#y&᠑&I54tcionFr$ai5litb#vH{I\/ugHI}ɑ$lGp6-[43c &4aK :& eEO#m$6&i䴶k[O#m $F2!WM#C#>ƇF\}VOImL#ɟFnܸFڄFHP n4@4@ҀFٳǕiӁ$t$x F\FZDvEEEƧO#N: ,lH#LH~~A(:FLBqH~|64)bi$̄9 } 9&E4lFq h$w:iHPcch$z0G#l1ᦑ64;aG4\7G#C#A~8pH&4rM6iJs}i[ ii[ iFBY~i $O42ZPVE#_\趎?4l!64JߏFHZC#m $ h$GX04a@΅4:4doʀFry4bZv'1I#xsHDm+-4I#ۗ4F:HHx-A#XeHq46%lՊ1FB FHڊFHPmi$O4J |hdLC chd}}Fh$}vf"Ukdll,FjffC)+L#C5 111;w(t $NR $i8*_#5Kb9>OF*H6{GFR45Wt$HG@"ʰh}Ȫkd9muF<4_P#}ƒF#65q`*AFA2F4-sP#IG4kdؿȰF Ԛ4D.idQQӉhdoo ѰjG#5oF#+âFIH> !I/Ј4a hͱjTsk$FڅZ#tJ#E* )撒F:fQ#IFeR#r\#)84"x.*kdBmH#탤i$I[v#aH )Y^H:_zQD#W^y"yɅ,iiԎFsɾЄF6ARH#(oj}tJ#탤Fd$5=ܳg?4 FZH74+!5ѣ4Ұ$lE*FRͪzâYH;XH> >ϬH(lFqº5BW ErBl ^#,i$jT3UB6"ɚ9tAt=fH@P#_ HKYZ#p4Rp-AYEGo˵|qliMtC#mdH]bX4Hkd`YȢ[nHF6*ݒFoF%.iHnݻgjMtP#mFR<8+4c.u렑H5R"'N\ҎFvvvr7F扴F900`V5DGGE#52::FAdO!8wG# TFR_CR#J|rKi-[Ȇ|5HH Hx<6HjdzzF^6'Go8IqP#ſqD#t,_nI#iKzlvitI#dHQWK#AҒFVϿKE42oՂY}V5Nz=rT 5-aiI#5=4)MH+FZFʁdHH|>4%4HǿF)=էa}tTkd`suɮ V5򡄋gFJ)I3QQ# S4{IX^FwxnFtFЏKk$mYFRFZIkyr).iHr4RpH@RZ#ITh$FڤH5СCfD&!1Fr9==m8!oaj6pXZ#v4ҪHhd\\hS^#)4l j$GFjeˬj$?MQR وh*QV5gs1k74R$E42;;{k iy,i$.HȘ~ t52VF hUH2b FZI"I[sϊh$m۪$4+/XX"_M,..Fz@RN#[L M i$n߶m}4\25m$5ޡHX4>E: 糤,~m_#5߬jLFfeeHK/ަFZ .[oIkdttynfIqJ#WZeá^# 5RӫVD#Tk9jd?\N#Le(VxVARD#E 8Hr4RyتFR&rJ#NN R#B%׎kdAJUU-T#-7i $-i f¨ iU#iyEFf_]A̹rAl/$420^Jid2Ԅ˗C#=Hq>3ճnnj%tU#-$G#)t164UArٲeH{t",fҥ!ܳgәidmmƨeF j$TЬjVjX4RJI$٧NFFq' FFRB4288hG#6HÅ]^W j$;FR6m򅍌-NIA~T%ТY/O865266VDB#}>f;II˩52=鋎ޘkI#-ↆRE#J1+7,<_v{/1qеo>[%/I$-i$mOG]jϮ EyC%YH6JHNjhde Hh$m<6,7kR#3Ɨ?]?]6f"ARZ#iʮn3ܴqmjn65R$*bK N;N$_#kY ܑ+@7@\K$]DH(R0!gɱ<ɨvFjd||'ZTep乪:gFR5. fI?G#ֶT*/FB#j>!WRD jdԇg$T.so@RP# {܉t*)hdjq( dWGuD#YHv4266F婖4G|hɕHm-%Umez:E3_~qHǂYyϝ"Iۨ?KN#i_^{r6_#8lsflmĔ}M$+tnD$IF#w$zmr i&h$FzL!5rbbB|WYYY)pL"9xY16cTȎFTfFٹsFRhdll,_ i$j=;i&l9^#%Ȅڹ\IMMq4R$5211Q\sS#IFH ՌhdJJFRbv1lS#i6WSE6[[ckajHz" )7-8moë!ARod`52 v55hdڹgeE44Hڞ|r0FTo1zAҖFشmjHz" R#^DF:jHR[ xS$֨Lmy;o>+FZaFJTuD#NfS#YkȐ>`G#)IIIӻFcRI3#-8P#9kE8pF&$$w& KIinnvrcaHȨH@sF.C|R jp9\_(ǾFRVvVkdH^#CFd%aH>Hid5eKD4gΞ@OdHN#7+a6F202>g52$Hz!A2FjEF: jHjƊB#W52,H"IU95jȺ:KYSSi:_#di,uI#>`S# kTGP#)CCC4t?uLNmU#A*zv;<S@#@2iI /4Ii,Ƹ8^P#]D#ix~2h]#??h\ȧ^ȃQ# A)}۾ݽsV#@{4IhN#I4R$4qC#Kf)F;#5|>ɱ;F \F2bsQz>F*#-i7Ȑ6(QsIk$effFB#nqU#srr\IKK3ohHJh$ "IþFjFHJGGgloowO#NcwI#cGr-i_\P| h!HW# AҎFҶ"HH=HJkde{憌"lͯF5lhce ëztP#i뜜5g5$â )555]#탤{) v4HK=j$g ;1 H:ȍG999j$%##C-F}) fdI#)cccO:88FhоFjz jdrr۷Ul޼˕HCH}FIyTי喞1>>^#jrS-i$m3954RaH=HѲHH HJkȖvY;h;7>ݲ꧎-i䧮=1RQdԀI[=sX# .ԃFJO9i$]H>H;vLA 8@)ѭQ[nx5kɡQFfee_Qah%¥+Fj|APA| yyyjdwFj NP#gq[#>~+===zHA#퀤FFq]yJkȜЩU2i볤7GO Ԁd$h$mj$m/Nh$]H*~=3{=/{` ~I[|425R kdpsY#5 FԀFFq'ƟEi$HH^A#52B(R'NfMۃٲ65xh$gMhdTpb.Ǐn/5Rj$[jDGG>|Y;rI4m ;ur>,\"V#5 )}FIA> Fp8Ww{p\#=Ӏ8֚KI۝2H5HȀ!=jG.q̦hFYs~}#Hn45R H5HkHi@#@Ұ=DȡHFnذAzWL#HJq42dؚaȐ =K ^jkdtttF65ޜz)ݻWB#9LJJpjD^Iq`f7>Mu?a74UUCjeˬjQgJdhh |mh$I5ҍvG42ЩvNhdk$I5In=5Rɰki8jIo4$ zH+""5oiw8q"--M!"idwwKI1FP{W(K8QFMȾ>5266*U+525RIi 5-@t6 g|FRq \ t8MN#HDKuWNie'gF^aԢ}FvKB##sg`'IdqAQ$\QDQK#%@3Ԁ$]56c#=f*V\|5ʀMܰaé9&''ʡfo_#}>iz!xIk%5= lpջ-=_潷ehs#-:B.,]XRPYH FArzzHf '>qn$?C̟?Ϸ~_|H8^x!gWzWr5;n*ArWJ .Ppumv饗잱Jw\򯟌SؑՇo]Sr~eN$l!sqOg{ۥWo^/vmp]_xw}+7oǯ.~jφF"vdɒ     @O}{1,\믷[on5?#1¹8z'?̛7{, K瞳KbWT=<_~3ogpPU`{w=ϻ\7|stt4[nqOկk56owǃ7iއ;=2}r#e!3<)\^6_{asozI+n_y<ǯ?… t/F"7Fڜ7r֭6o$^FbFYH:n,Sq:rF$7odeeF .OlsH?dH7μ͵Z7ߌy#:Ul(###N켑䄖RtcWOɷzނ/6.Fޫle!zS;0[VYU\Yjf&''e={\lra72''-~W^y%]0j$pWfI;Ζ{)4%7@NKK2033_QTTƚUkIV^l߈Hlnn黴(^ YTҜ]S=V~<ԞiW|zڵ5"۷+/KŋWW[XOR;5Ez E$&&B#4򪫮:vX䀤jrrҦFJ7rss87Ke_#~'gtg|>]7\W]N^uǿ۰a652==I9"h$w=QF:q7&&f׮]f RFviiã4诜z9<(rM܋\y]ݶk|1(Zoqe=2~.w 9+(2=sז-n(\6EϏ|WZ[[">*5*EzA#4Ie5h'NpF,r42d_͎piFGGٽHEH[]o!v:|G:;v0;H$4rɒ%=kdRRt=F;{B.;ND"h؞={r)tqFJ:ULKK3<1: V5N=]9(r(>̉y4B4Qf52;޲mQ#rŃ鍂F <0:010201vdI+q 5R"=H=ER֭[D\Ie޽{FJ bƘ/voeП|6mr0Pd3Tˀ@T<𣴣DB#42##v:HjHA#)R\#CVQHBzkdRRpK )[,iy(S"#G#tD#j0vQ$hBh'gU ۟ݰlULK^-FNG׏MwteT(2P%t)Gh!E]C#g52B@RYE YfZ!uuu;Fѧ1@;To4R#jg~jmۜ.{!g5u LMM5 9dW\ijj9)RZ#HA\bEII#pgXFZ=~m4޽nI#VXO=S"#D#i_#o_ETSsZb}wnD5W?{G.WC#g E:Aشmc.k"ëjHzzHi@#(DHIC|%F~5r޽IERdX955%o]\ȑ5th^Hj+gI#^}U'l4Fvww SȮ.CF9{B~ H=EiA#)RP#tH zIg KO_YkdlLX~%n7UHH Eȼ. Fj(ҎF2V?45!N;{c_] hǯS}le5Ǫ"3kO"Fj(2Hqlnn~xpn"HE F"nhdAP#TJkO0cY˪FRa7[L#r###aHzaGqJ#os/h$5-ZHzF͚ʵG)!Tk Gcyyyj$ʑJJJaHCHzߔ)k׮y=LNNHjd/Sljd%[ ,iKiwi_s h"îzQdx5ROv4b=!phiFVͿ{sqȚ8Z[d520Fu0p{k9 Ejd9z F)R\#gfffFڤHW52$EF".idxAL#~mj[jJ3cY9ԪFR6Hj_믿,,,8l۶;BۗG4WOqco!'dL"!C}Hh$螆ii  TθHH3HPth4Eh$]Ilj$DpN}Dǰ%4B4Z lUy h!EW# )ҎF`u.z)iHv4_y;5r(9QD#+kАt1V5SVp4w H5rͶ=iHaHCH6HFPNh$F$42::jG#?ɌfK.u\#6ȆNOzl?G4R?XUȀ}TFJh$D3J8F2Hg͛7iթ-id\\op$g"jd||qC"*;I-9,F'CpV#3iE#OrOٮfF4H;"åf)y\//y^DD#/u9 E kdGe*F&wB#"ȩ[94Ҍ"H3HTN#H4R"Y0Nh$F $9y K+uꍎN>ϒFR֮]F[ 6pZV;9tRbkiփ%ˀML}iI#b}4_ԎFRa\P#9z  5RFjnټ\$(ҪFjeI!5#Glj$򵤑Tϊk$ o_#/_n= YQɡpi$"5QSSdX4CYC!5rêtAl"Jid@L"Fyi+^8(tJ#7h(rNi$"=HEhd\\ EF:Enh8E~h$F$ "qܶp\#>lI#5p۷E# }lj$Ȁ5DP# 52!!65XvP#R#zzTkdJJf_;+I8è!)ҒF.]TYO!5RBZ#[ZZ,nAqo($4rIl_)RX#\t֮5-Z#SFp׻Tcât)}1Q|̾⻻D4rߞƧ?4$7SѶ/<R##"jdp6)rh$"H>Ehd]];č+p)qJʥxރdIeHƘFRRSS5211?'"#.i2ԎFp&to H3HzP# 8IGZK, 5r!5RFZ]ƒFׇ\QnHK;?75 liʲ:٬>Keq|aG#}>Ν;m"YªF<(\uQdP#+""4"ȡHF.xLs|dI _#}?F<4kiFNi~Fc{fAU]H[=F9G42$Ez!)RD#t YtV#%(BWH{t$ӸUf-H-3iqxxq4\P#8?[52::Z5vίe3222 E"^P#]4r||\ kdjjY`9 =)1SF9DFYKƺY(ѓ ?)l%&3t͒$&&FE5KH'dHuFq; ϳ/DsjbHlGv¯zCm|.G'}l?\uo(RB#u"i.|KHx E{9#˖hddiQ#˧)?Q$G#}>߾o\ӷ?|"˝&9aS}vMNGֱu7I`K˲` /BEHzǫ(WHHsX")tD¢NdUU#l AD/KyQN_N# P#Zfhd~~.wHeL4bBHYM999Ȑ~(WN#+++4nj^k%l5RȻFQ<5SJ)ȡHFɟF?YD#_"HkdGG#oxH,]o) ~P$m[&&X\oQqQ$m㽽wm޴/|zCV5ݽhFn޼]m|$aiS#EG52oUYp"CjdKȿ{~F$WR#E:1ȰvP\uﮮn3mjx>##!mzo(]CCD؟EHe+/aÆHñ^R$ 3HX4tJ#!!!AZ#jY4jlZHX944dS#=HK2 Ɇ&jR0H42..N3FN}iI# 52--jxH" ʴ5.Oi"5jwfljݻwKkdCC1> !5 SN#l:lS㟥)Ni8EZ"FSF^}ȒF5rgSF~?.5HgB,++Fz)mgq(Hqt[#)t`6t$k{i_#mR$K#탤SI볣GS%ܺuIk$5͆U>'jzFҁFZk.>I阮Jiw jdssՃDtcfHC4)F'bv)eU#Djv4*Eh$qt"9,i$!°T!52IFB#BYHijEi"HKiI#}3@#-QF=@H\R$.ERFGGH5&H:xV9~*0I'NHIIqV#+5R+ M:4RnULKKcFJȀUGHeI\Fn?f,caS#~4z|t0Hh6"Y]]mXK 1))A")H7(f-idll76n*TpV.H9鴃ٕaU#WFJhU;|{piUuQ Yts4чkdo>~Ri?a`Jܰa4mJ52rͦ!)THFZHF_ct"h#I?W#퀤qLLLȷ~?KNQFrrC#52!!AbhFɀ%H^#')HD# 8H411HL#Wk4rF1YڒF*>Q)G!52>>YuEr4Rs.Hi(|!kKIu=r9$.VK4EgZ24R"H ߓtU#%(ҪF\a|w9"UD#W^WjG|zQ"Cj}?ޤHF-HW5R"id"G'E(H tI#%(Ӹˀp]i)NQ$4 FJ=sss5288hI#gffݻwHf_#5S~k$=MFJˀFh$5->n"R#~AH zI3;h6!5_5)R#sDB#ݣH3XAtHy>Or]\#r hdCZU\"#_#(UHA|1:>EriU#kzi ,z5Er4G)S=|j$ლBAhh{)GVF߱G"O=H74R"9;4Hg)RH$)k={haI$233Hz|T\}5RzpiG52>>^'G#M Fҧ6H=Xh͘hidݮdI# h*NLLL#FzUC|TzS@#]H3[FXu>R/fȺ:k73gI#_ճK#)=Hk7{cHi557Ȯ^ȱ\oݶ?F;d ثH3LNN~'2&4 HKٵeή9FJSF𗺋("%4qTF"H tc6ZڧFMH?5R߽S Wo jdMM˰6e@P# 6\GJ'(F H;sj4k$gbC4H%lrPՃ~V5&E5rttS(4m4HV׏>Oow2X5 N*v*_9,[Ԁ"~"#Y#PKi"E44m4EZȜ+/U(L#{ňhdo)*+/*_^Hkdo5}tC#PF8G"O%Cj4Ht^RUt")F"aHjbOOOSԲnhC '6'Nz 9tB9D\hdAAjfS# hﷳ੸FڗlooO34أHe ZF:N7k ;oZ#Bh:F1H}7]|rvfqqqJHȌ CT  EұGG]K^#!F 9R5Qlliq,//w3H:XuٳH#mRi"CjK׋P^#4ԏlmlHiI#kΞȆPFjd~.0Fw|4Ad_B#H)mo[//];L)6)AIfNiiI#]HܡS#dgghꩾՍ={e vxxX0" zzz Gn޴if7xn`THz^:ңo&\?ycttsllR zHzTO漧H!5rɒ%6 j#2R# 5299Lh5̎XXXH#}ʯ&'':x)ʻa^ͲD龾!6_F8˲ tfKUOAA] 5ESSSG^?SrKp4rbb"cCjNTc)w]IMDNDtCV0tP^95+l5ҽEia'!O8tzgիR63ΥN%쑑s̛H*ȊũP* 6}^T-˗/geSz5,woRSSizv+++FI 5;+ӪFVt"HG(徧u,Yڬ8FU#)UZhjS]EIFfO0ң*-MWUZ t}^ 6b.O <ײjL`~rbqª߿HWիYrMz4ȒoS$G#hs4oNHvZF:Pddhl`keAF#FNӵ]VVcMMjmh'?''۟(/;;\FmSyNyAAI𲶷FȆR jA]6??uPEVPP=;sϻwfjoo*+SKmɒ%tG7j4eMǏwvv}֭[' DAi5Rjl6Fj:hܪV5|r_P#DF2^S\zddDCzs6%4!pe -sB**en?F'_/_N\SRZTT ,H:iЧ@9Ѐ:9?*^IJF*i4F:HIx6,=4R4jW=iF#3QrrrMW]2LOOWԎy `jX)OMJFjo!zqH-;yKL)D#kZgF:EjSȅ7ձdŊU+%+i$\vrCjWr=ۃd))q{Sc_]P+(tcVff[i)g_S_hj*F@}=j?Y@ϋ]^?3OV]td]m~[vOC^ } gH3݆iF:NQ$O#9i5kѿ55fY]Tڢ?95, f^zj** R/+F#1#FK9yiV5rU/(24AtJ#H3Ph+Yސ$C 'GMvJm9$94Q[URB?[]I?KWggjn\_GR~&ȘS-lbM8!kՂ Zȴ[o[V\>g+ hd֥Mhdygy1L}FIh;kOGȎʊ\ǚ5zj+/ׯb\SQUbvw-VVnYWWKLEʯv-(],l+˫-)F/ik:Xopvߚ*y,k-*QIϮ~^jHjS aȐ E2QS(4qP#<~zAi5ڛt&rp$S(zF̌+]6J3ZC,vە_Q,;;[~F#92<N,+e p}}=Չ ^ˈ5299pakzv"K-idSSc 5ҳ5 kFFZ:(ؕZ#ЃM}ԡ%%%>nB z[U)wE49](IޠmG#W˖(H#cVǡH)ҾF:N}~lCgB|fFe4JqGEFV}`|hYΥyE99CMa!A:=)),V0}񸫩 tosS*AgidyrU4ȟ=oFt(FH)L#lѳJE&8V9v]VO9jYAAq^EEYY%/wwbcK3"*6ԬMZ0Lj.w?\~TRƉK̵H{[H:GrsjdmnkiS#ݠHF޻u9I[ҥIe9`zV5rނ/~> e;WQp,/47W+6v{jHP#s~dgkZ#䤿ҋ|:VyylFqEj42벋gF~W.x{)~K#nPFN7Z#_^ [ɔrMN#r3UիKvT_]\\55,*#MqZXZQXܲC/5ݠHF44H)m6h$FFDVV]Ҩ5pjPKǰIeME#GGGٰ/F=f=~wV"= xQ=FɄѡiaoVӾFVVVj42..NR)i6L[Ψ󹤑.Q^#uo2FR#Ti4211:b+**xP4ʅ2ͣ&ccct-],M;gQ3i+ˊF* ~؂;l/i4Rmڴ \Kh4}ZD# 5=haSX#%N8jPMǦTk$[ 7Fԡ%%%T閤$6c\/w H*J+V`.JJ[II!(RO\˧ȰkKiG#]HF[վ)RrWTn3d*rKC}oeHFgeyy1տ( V ᆺZᖅg0bƏf[s23r]0nQF93h?^^eLE59iHit" 5r|pIF6Z#k<555rsut[6>zG!{jjKVT_^P`8tzOwW?s2@{!7hT_]zԶ^#Ii v,+gsWz.QF#'MX##" 52,ɾΆF"nh$ZEEEUlm:i&3ɥKݨhu벳l+b:ݭY:Y]tNLLJXIb[YYizBȐHoS988H|Aˆ9k4R^KE5ґj4d@3LVh$[= *UlJJJРLYTFPg,ZeMbb[Q;FjVJbgING)E#މ5*E5ή^;h4 Wv>~8+eTo4u(X HnpQհܙiz~c^V_- .UH*eޯȞLY[85=H(R1ѷRF#i[%)UlsspUlTf*(P?0?;P%roXZ4XXumV[=>>V4{9t#=vՓjK&K5r[uF>>9kdNj|SH(C\D{dÄZI[SiiIL#'VVj4 r^NNEa!,jhk  r/ɩ/-e hPdUwwujQ,+ijF#ݣHFڙ Ukd(}Hq|zlH*MMM.@sCCi&0fk)I-&6/T+{ScZ@W+-;29ħṱpc866FR#Q}*UFfeeqH܉*Ej4`GEHMצY[Hi{{; zF~ Sٜ=zvcd`sNά,[,wF ,[z[/L#m^()1ߣ>ONZ\H)R"~h Gt .V2 \:55)h$e4u(ǔ*wIIITUL#%H5׿hdlllXևR4rY\\hF{5RFJjoنc 5Ԭܕ+ 7`>Mf"J1y~Bc%zV6 م9AvT.(llu1Q4/id՗Ӊ4>3\Ȗ=šHF|=" 1z͇iE4RB#]HM=HC[b85=kVTSGN S(>h8۞lVcYֿ^:+3"6)A%otYAĹ9]Ֆ&bw[\z[52;7_=@#xk}RZ#5;_##"5^|'8P F̊o/5mv)*mǎ+**JA R&E&?krrDJ:z jQ.ϮؔUUUk 3ҩP#PCC#=QBB#I R+E#Ӓki_F7jUH)Rt 9rđ}*)8ۡKL##w#//Op OO t.tVVV[[տ333T$1_RRBϞ={evΆQ)V QC;E#վGM6EP;K(Iǒ5+jhYvN8z|3jidS=H `?+4puJ;HNNfKU厢>*Q^`ktB5i-1E#*^::r۲y3uno1k{r]k]}74rbbeưtO=;~y=~>gl++*,S2ޞ9`7ƚΑu:[[ssrѾ6vCԙ"j-6r}ooQAAqaW[֯/N0յi`* bzZGO:5Õ qiߒ=uDZvresY~FT^mkRŠo}#ܳ6i24&1\}l1ǫޯ6+bΉumsp|)&FRy>>1s^qF7oc.׹mmsp׶F/ [Z-ucGk+`뵬tm6򷦺@'ζ=kYY- WCjVWn룓-FW]A)m448:,}UWT;Z[>mbd=v_ *h+)).k#`mH54Tkd)]*C#;V]0Ç /E#ty2 \Kرctt@jU׬Y^ $'螙(CYE'57(v:PFp696M%_mU.bo2]O2ѷYɴ4O5III$(K7juhhd }-r@*n^Z:*mOLLpYQQeSq1G:B}mݺ3`,++Sڢi2>8ǎ6G3HrBōir#}:i++ Z=H wT#d6O8IHv~`*Ua__R3.C]R+KTr΍D!eK]߫^p̰DH6mnoơ-\ O߲i|c52q^`lRw+//Vs#c*)uAPB$]=*wA|1qP 'V?~.O&-V~n:vMBs(H>^RΖ:wvo^0|pPX֦7*x,;yb"s=o՛/&+?ļ7l|/̾=/..j$"w]}n?YfƷLށa`VkSnR욨TT Z]5ϛ"2݇J]I/Xyyfnd`LȤwxIt8::i8p]1{<UC}ywx :5Q@jS~VnOMM+:5Hӟdk#N[[5_ 7p?O~/\۷oWNu>P+L/x۶m߷__ꗾ'x{Az+ B{zy={'ˠwّ75A8Okn?"{_ A9"Xz"n>SzWe襂LOGvAm-wQfe糠7 ҋ`v~8l]Ϟ_߷os pO^zGWÞաT`wYet0Ν;ϑ~+ 3'''5):OX/x:rС7ϡ_{A-WX+_%ٻilnT^oCtݱcqm}y|d:[Dn[*T|pNg: nJwVs 4iWv?jf"dߺ-=c_{́ÞsW7edΑvر3ׯ?q+dVA|38c;{wff76lӟt{{;wEɽچ~ԨAAA W:;;:,wuWbb͛naF!=Ni䫯~矗3;[a|k_/,?{˟}N;mll     aIaa矯{FGGȸ꫿Bf{o?/??W_ܙi-RTTd5O=Ԋ+>O?~    aƍ?O*WZE?=ztʕO? zQlOZZ'>s9{ﵳ~'? y``@=%Hg*bwuΧ~c=6|ބǏs    H~e=|3rssyQlOZZ>RS'>xs9׿~s/'?rΝO?3<رc6> stream xXݏ6_a(*]D}X*pvoS .CD[EWAʒW䡇p8W{W׷*Y"vJEj7mm+e* OZ'ygyPL/kTJ&V=3;91~ɉxyܩ&"J+}WCpW xVP뀅oӷ0 ]E3NSWȵ "U,Vx` =m7yF}:c;:Z 'u'FT^2ud L8l{`Mp\{Mx=I- U"MSV<؈@!2uolbO7% t]EO!T˽3E~|v|G^#ľX # ri駮{` 8$a'\ znjw0b$qqrۯi7k0qO`0rqGuhՉ6 t]GW >Md4z:3S?yqUࡪ+Ä+KEÑ\yPՌT{1zuPxWKz]d>RM]D,xa& 2tZL|̑L5 eVX܁0 )9Fhr.r;q/@PzӐ+3\!TGhdgtR 7TWp"vU 5op؆}\]Y\̾ H:f)v:w G`y=0[3?@"i D bӬƸH$  4i5uX"bȯ! €"ު:-e\`F}w2jRU 20;4+cJ3wS?FvmK.?VuaW 6;sCf2|, *mz74|(XU%S9OHqBuob$EpC 'r) L|*#R8+m<8鉗c4l?мZ }_y@w ofo )ıYv΄8m)4ls䲆=)-zym\3W6e3.nw Mɶ$K]([ŌE>Fϸvx">K; l ı240F" #pIE-%Dn m:>?^ဿ;{߽jr22xofh=6ߨnZ$|4NR/Gh8I"4v\#F !oDP:(]cӂ D*ae8=^._X L)`qޛVvGKoq#aTcEfxJHZѿv " Yߗy(N1mLDIK5| dž٧Ij^95I?_xreUqwˀ&)?kDgΟ7kx:<ԥ>:`2pSm\4Q6F (V]0  %4UGty䡦;)m$ē{Sr4Ɍ󆱉f~cp -?N<YonQ\N,Hy ?XPݿ>kO+msm]rco9e"6tr'#\ՙz{z,Lfsd@.LЂX%hDq&KUt KTЎ3Q0`k@RH3ٝ=WN;[𓍲5$ZsnL@]A|"o6fF)HwKx=UQ-~r'P*##? endstream endobj 3396 0 obj << /Type /ObjStm /N 100 /First 984 /Length 2401 /Filter /FlateDecode >> stream xZn9}WqfY,<1 ,0F`ȶhƖ ]6)JޑݒՖ CbMVW:ua{_8C.f&6) "1>hd Ho]ACE&x+b2-"S,|֑YF^>kF7 RZ0AvcT8,E+cy% ;$D~2auey>x6,Qa^r*Ǽt HW=DgU\ِt{@]HU>\g V.Q` ]E@KzW`z9cLƶJL&d Ǩ*8} U{$o;Hz t\!b FO }\5CE_-&lf#,9ch#p- s}67>[0 V<<|ׂIBF6fY'xT` 1ՌX4sk@q5dWgzי\+\T<DG^yR pZ<5oJ ^*r$S}-:>>jNM @dƋG?e]ɟL<4gR(POQ1l3_ZI+EEo<.GT8(Oң TA D'B>v-pzubZ V6@,bk r;BP$E/YBu߶ab$@Uê;L,rX6ZMhX\<eaTx>`hU2QgA İXGA<-n+dY}I6b8ekפ`LEeBRkg%_C 㖳'FֶmF)zyv!wQ%VQkO|?6p+ dJ\C(ŭݍ%'xDbm},;fm}f=YpC2nE#3^^Mr;]KV?[73@C}Xi i b.y%9DžmK&Ĉߖ)՛iNIݺ9o|훝 Ʒé\le k~4k<M-g{srlU*[rf5Yj*ݮ{)ߠ&l#(3DKҭiJEY:P$l3J`%i9R|׃C !l?M@dWhN@bTLRI'+)<3Pڤ R(=𕘟$prڇd#f+s2m?Js:nwjrpwCѣ1Ҟhey'ܡfr=k Ǔhp;7pz yFy>,`ǻhN_Hٞx#>M(DQ&PD%=AXK"뫑諽*5'f0._wx/y endstream endobj 3531 0 obj << /Length 325 /Filter /FlateDecode >> stream xڕMO0 >fє(P֭66Cbˉ_ۏ6`G5Uq R**EGnj}`vWk*a +ha$ </N> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Length 14385 /Filter [/ASCII85Decode/FlateDecode] >> stream Gatn,:!Y-=Z'FLCq.2Mr-`%nNlYI&DtUN,ZKuI/5F!VBaiqFCKcrro&'NrnTg;q!!h]5Q*CmeUL7_mt^^/s/geMW3q%6qg=>K?Wq79nY_H%bElP9]^./R?,,`KoISqPM!-5\]"dC\[20kZ1?TYKh9SaRgOB.srPtO[iJ50\qN$$7ia=tKE^-#P7lYfVEAXLs2AJ8gHYm7sH4Mo0=#RgXq6D0m=Bc<9o:iM_11"#O8$I:(_aZ`-icgWnp&(oaV3W-8lu&b'Z'4(jQZN#Z9\S;e=ML?-[UZX,QPe2d43lEFpr`Q3p)P5\XYs[;[-DIf,0"/Pm7bI$bl4ofN:.Ui04SXrphZQ1m-+!(H+9s#\W-8:ij[EOB3f^DR\M(')HpG@!N(4pNu0tQg*k[_@qb*ECqdCWAaV.iHC_sAkS,`uA]A@QlZ]sdL,`u'pU>@KcL`XTa=McOH6,jbL@e]NZeb;[K8j3KZan@mH@X2,<1J2ECTmML^Jj@?40=as[IlBDVVa#H=Xgl7b'NSRc7cg&@8'0eF#LXYCVq9Tm=sipJF0YNZR5YlB9h+E:Cm0Nom;\^W1U11d>HJ#IGOXhJNub=)EnSikB1u)s)u-N6oHW,D7,.iZ\[GL:)W_PNV_cX*X37E.Y00AJZX(U;fBkT?!'=?HsRQ?N(E]2[dCt=$)ohj%H>@P2grn0/V3t5U6;j?\/qcio6mJ]42"gOVX&[54&n>Z99fX7tEQSUXXAX[b!?5mPEN..2M.oc18g?oZG4!,3^@rk)RX0(NcTArUgG?,+2(0DQF%_:5!.q^olal9CmfWLfgInCZ(/m"!C)e[=SNqnP=f'd%S\RW7KkM?ke[up2tg:_07.en0CNW16lY'habV"e^;YKG'R:LbE.FZPJ=d+.aHl6'BujO9iUoFRa,CpQ[A"17^'C?!Lt;Oe)bCd@>?&:P2*('U`Z3.FY9IdblV`O^OtNWbhOANNoR`O42RF='"JIBl4X@bH@,.OJ6`BQGuTses['&G=E>gU8.H>EsmT?DJ=hAN)Agg&h)5=\Pg?o)?OJBMCcnl\ssIcPkDIcMH%a@>`AiSb.Cs)89%Fnrb[[Vb'L<#oRp(1-/r&qgL5:c@d=I?TRE]*=dY$:_M#9NB6%,8P%NN2CEN;H)^V->g5V+dM`_gI3GhVK$-f`]Z?fT_Y1dXC1:rS=I6W8\<[<8b1#MhfH"=:f^<)]pdnnjBc=jeeSK(jYW8G#Jkeu(36CKCs6(GTMa:cT#/?7=WPHo`ZpS*cDS?ZB-DDjUNU:`V+:bnAQ>VK#LapS'PUI5XRR"4IE'fcXp(*T+"[FURSd3*>q/FhUX>bePMhK']uia2t\I2K"P$65Nbq(`F"3P58=6,9]P*.JLV%@"PMd3X8^/oQ:QP^m=4hV_AQXHfndsA:6p8A./2ul\`S-0j*^JI;f7mgja3>M*qHC!]22KdfV07dS3tJ&%'UgcLeo@L[lRLPV/IY9d94VMES#/6C_20sK5pUk:B%=);G_=ijiR$AGM"aAmIK8:=uulR@\X9Vl5?S6k=_WHk]l[fd)hYH53Z`WoKKQr]uB?rf\Nl.7T[@KY*OPaRCAYZ>YRbA.ps9!umK4BV)Zj=e>)6rOQ&u?+gO#boDLtH08l[B7/S(Fn-*#"o8hCA"s%fCWd$?Mj?'HA`pE3,^+=KCG0o3`p;pUm'diN-+X'eWEVtm>.QRiJeMbAC4fD9,ij-)?J6hiIMVi*?J&)s5AMFI3K`*d8-KV*,R&EmEqNb=V4pjSitKgi`R%&0qOBP4l]Za>rJ;1d>d07&7%AX(=CsuW"NCO2tfYCO<[`3'KM=Fl]EDuZm[pi7OOB$BJ_h3c:2<.j)HnP3Gq?^Q(iWt@lXi`hj0HpoQN>;P72[SpEUQH#!])E`s5nPfH`G.J&o;,^CGpJu$e(Arq[l4:dTYO#KCgm.!nC\NO7,$,"Nnir(Ue8E>OZ8%$-Bhn932j76&QnX+l,Ilr`7eL?Qc8G13e5e^gUj&8iuo_=hR76SBJ>AQIr.$\>(NCp&%kAl]b>][?opC6T;pq):T.1"9]O]B'1lMal"s3&Htq\@trNYAdPPI]NCYYp0*o9Y.[h%hV/Vl'=&YLhTJU=#Sk)&PtuGOpnT\kq+jm>naSI)_-/\\]u^dc8kJ`"_arK-g"TntrG2HUt]q:g^>VmOF'$eW+8C`"rn5,98"#-O6fi'ieH(P%jR:3@Dr+#1JNur,".d>P>P\d_U&hQcHuGS!Z1romuB#9E$hO\JP"F%^eXO5M"n6K+09#X[k.jh30G6[WH,7n*&=LQsB[SYs?.t],OtNRd'M!$Tk@RW[3kD%Aprjq:f:'O<<0*dCn+A^DBSACU1Fc1t!Xr]1nMI@:`f<),0@SA8d+b=3(8Kk$*=1]U/G"A8/Y>gW97ZC+DGsY<^[ar;1S)"7a?6N#m&`t(fI=uolZS14W<'h1RO$E+\f5?6W=-O9=ioV,RmjVd;)W_U\:HL4bp7`@>&)A/Op$,Oi=o`n+Jra`bp=e">B76iXq2lc-e=2O*]KJ+a5h5mh0W40jf#+7EulES.B9n8m%d"6XWsoJQ-=Yk'"*=WQCHnXI[(A#-R=kk9YZ^WQ?"iHMf+)H)_6bdAQ?$j=&cWmoiLI3[?bS0/[+g#X].B4'q@=b0pHB?>?m$cec&T"qVQ(6jV&pL=SKFWU\"Sf?M\o#KHb@3h7lfXJ^%J!_$)0Kl8#CN="<)kQ&NK'NIF(K\t5gGbJYLYB9]"#cgTB2J)0(4P54j$h8?r^WsJISC[G_N4<:p"Ne73,(@CQkmgkK8HodK6W5sJY<%gU:>,1Bne4r.h4M]+JQI%FH[$X^q<&]jrYW3X58t^2$^!GU?CSOZDi'7GU/klGMnA">QP;ZWq1kVZ."ZC+"4SuotGliQA;Qs&6UWKU$*8RpQbiV$TSBdf/aBOd&#Q^uQVbj/*!<-mD8RQ<:^`Utjb`()Wi^(1W?l#\`Ek556Ao>1fP#VQ/-fscUmMZn,ehb`",>p/:U[J9!]L#H4ja746DT8;VVa3YDZSC$/'Dh4lQNGIHa>7/Ak"^j9/%4BS5mC[m$)q7@LPbm#-/dP,F^X!4?X-uap6Y'AR$*0lb0H/&.h*QaTq,?0V-cdO+=2P%A@4A"jEe,.rQ?;cY%r81)0r#6Jf7V!h4>HW$fUpoCpfFJ-J0k@NWOpWE7#$BG9GAC5[#+Nf"fOhL9ao3K5#TC3nlK6CD.>gI?=.,gZue$VU<5%)K'2bjc,NDFb"1TYSgGuf*5X2YC_QC!plN&-o=3UmY\2d6"6q@l3o$U84-HpG)CcK-d^\nb91<>GN\'#R+58Fhm1C,>u@KP?R)hGH"0U6Bu\lOh,2IKm9Pc)eLjm-=4=q=a,YXf(R!W_`N`lCYiBRfr!-Gr$TaKf:%#dGE_J3[rq&812_f*U+j,NX0!MBUnQLMZsPrgM"Op(l3nUO-ODFn1OJ@BLEB>)@*8[G6b@r(;\"#(F_+RqMgVB>+U0Gi%._>3M3ZUXRNA4Z`/8!hsb^C*>Y9X=D'n@.b+l!NVH((.cZ&!PspHN!bk?@;(aS$JU2e)cd\Hj05mm6AP6Q;EHEb;WQf4Z#C5oNV.]ZF'Js'K?*XO3.5%5KHWnJ8!o$9V1cD#`CuY\>kE\N8[VDtRTr15ouX%2=JT2bKpBfGgS\NNDsM?-:t(6#8X98A?Xn&9lj9^m]]he89jt@*THK^TW>5-cOJ+rUSgnRp2oT10h\3L#e31c6pDI_\?\+`dZNLi7M@h!:c[l%Zs<;*hQl=t#bK<`.S`sl'cFeEr<%%qJ;2O4c:Ok*XuYL6?r.efpX1t/:MQ8)V*qt@_=QM?%EmuN#oCM:G!1b^pGH/-DS8KKhC>s@kgn%a7%an3%;_"7sbD?kdDlAN5lf+=mFafWP0m?YF\*Cuh\:U7LHr,.@hT*Zie,`We)E5(?m]*+]pC3o2,WXXf`GTCG:AW=*Y\S!_"0!hID0`?_,T5CTE`,[;[n\F.G?EN-!*aXnq;WBD8^HN#=>)$^ggK4r.=99rJZLtGEk&sP&s2nif'i*R9G0#oXdd!<">uJ6al*Gnf8pGS#09Cp7ZSE+T!'O>oOhW$;Al&d6@)bam8o!\jAo,KX`gL)dKE^7Ip>rr!FV5fU(]h4=MYkq>=@cnK-hh@P\6OQqB]lf<%_s!CsE.\T+U\PhG@.g[-I10YG_4#F[1:Y/2S7G0C[BYn2rAjCS2Fj7oDV%CGfs*csS%Os$4`CpQT9=XFmWGslO)uAO-b>@LE0#mB:eq9SR.QLLDQr8PI[oMWS2KogW2QFco!cI3?./XWh26>E48IVl..hP=jDT[1=d-T0Fr+rBkc7b--\!(/:4=)^Qj32K7X`6M`pU7Tm(e&C4jB[8;(VOt@/;t6/LSGRmQ\hN#+KHTIiD(b:\)!2b$Bl(7Z<3SUEtC/%(GQ##c+P=^Tf-f'p^dl-,f<^X!";3'_[cjC<5@2=d.,02Gf6T(;[EpgrZ0t1=g5':i*LPa2/c)c2U>'b%l^i_;,`4f9s8?07&m2e\l-Bsk]BhMb#itr,l-2&qObme#&@isIiGJXHm?a`H[^<5r\g,JY*pUAmNLFM9,0!.W[fM:X?Mf0r,&ZYB(EFO?+EpuP/9r>pQ6ATi52398ZE2C9AdSXWjcH.GY'@qG?PNfatM8;/[bF_buf'mfo9LF[)B*%p5B8TTESN"n\(;TLb#Q=Z/09A[!Wg/fSqebNj2X/PT-T8]D9*P[1-_lTogg+L'#WQF!T<`cT9XdIk4m;543,^\:5h4[3D(0GM>^>iE:8h/X\Q&EE&Mgdis&(VP3OT!Xhmk`*]hWK+*keHP(5Ip]=^[>NP(+R2m_F9J_]:p0uDWn^9+@!VPqn(DMgRgWW3gq-=aFE_rMkRbOiOSS!Nkb@HX(R6=c/Z.RLD&7l0>iSJCNl2i1GZeh>f%_q*\=::Ar$n;0NA41B*6d'p$f$`COHV_?!sK\iE<*O5R[+NAh2MNk!"tIB[lk]"AF9K(,=Wt"B[+9Jk=cH#C:cO"WagM>("nQ':AdM:,*0uP@aqYTQ32U-QlI?=53CJ`(dI=I63@i+=!V]a'c-u.M8_tb.&l`@Xlj4)?K0CA!Nr2YZe4=NO4@)X]Hr,+0ns*OjiJZ1iQ,pcVntjR_c>kepMP0At*DG%@m4@j]l)4u,@1&]3&$iI%!35,fkKk._NDpc=DRX%R](s'Vt<<$kT95FS?Ydo4T<)QDdOG!#(eBnAm*]n*)5!E/;,S*bQ:c%n+8"VK*"^,I^8^o!$/YHJAj`Hk<##,YHNC,;pBN4H`]\diP0p@nF0R!A:Fb="_"V.pXET:2cT@rk$QCXoDhEE-[OZ,Tt(b13G$`Uh.)?8Tcu3Q?+pRV4frUY3Y.4.:10"/:'2Td"f1*)X?`aFP^"L)ck\Z,hJI)NYs.U/B$`1&@:X5bmeiJN!A"*0?qVb&KN>XW65n0?\V`qR;tJUc"Sj-eXRYTYK^5"gY\N:UIWTi3I9q[]=m=O.6]fa/-Vc#c]TG4r@BP;&Kh5i`W6I40Gmp=KFu&3-O^C67q$5ci\&aAksEO^.jTKaGn%=.#ghSV=%87GOfHnS`2dG9"#&b\VJ&)RiqW)",Dtljh4T*?10aoTt8%/I2@ROPBa%lZKgN$?@XSi\f-KJ1I2aoT1/=]0H>h31cG%";pGL\_Y8/S_ScNAe0oN4#LEr]WS0+@n944]8b@o\3C*sCos?hOUUm%DRX"Em?ZOF@r3O$)f4EPJNs)bA%'bVm=TsA,SKC/JPBou^3qjmZ1c5mIhS:U^<54-FC>(BEu)H]B?\r\^3r5M<_DWfJsA.Em?WAdRg/U*JaP#DV^2YV`_'$u"S;L;T)L(h>tOY]6,ED'D>j*"_-6O1H!_;fXNk^mCtsJ$P1pGS#\A7GP0=&IUhT%![R=WW[h!7[/B45.10,>g+Z<,"_;JjPB#4&rMZQ$!adnFKr)hrPfahI0rR&652G(\>W0)opT"Z`K7Z[H+l0PN&Jh-tY(P2#pqnQn,C5Hp]elZMs757%*fOr`Gjr/?5ZB:7=5=pgSgN'+-04J87hDOFVXjlUiI;J#]#1:tBVm`Ffr=f@I*-aOb.\]=,Z#^>ETpV147)KtT%E[o?]/P;TM%;+EiiO;b+I0A#VS@se=W&TTh3p"i+:jmr+STK"2g$Vh1Z-L_es:.qemI[W'Ygn*k]#!GknE(H8'CE&e(3>,9]@-Nj4qftl8.nI;*E+`*_:F%K`hU#I"KJ;F&:pte-1rV9OABaQ=DL(1h-f=SSl[cV*^I?imfqLP-GLL98U@WOclA5@XI)s^IQ,o`GXD6DbK%Qi/e&gQYUsV\]>:N'PX`5(XQClcM60UtcRVL'F]Q6ReX3J>Vn,0ujJ"$:gR,['j=Na'/oL+/ml&NfHM`kjDT?Z"Nk,I3HJRWC&^Y4UM<2bDNZG..^hS=Re?'4-.c*?(N5*Z-IQh[c:pCMk:HuS>-p2dIh^PB$]&3HsoC)XhLXB7$V5#b>VpnX][uQ7ABp?CIf$IL:Ik!Y-2B3cm>K+m0_/Iq?Y*JfN8,/j_F)E\4>5XoB.KgVF<6gXnld:J?sDAKk2B/I-@L*0$t)6XQVSO(g=k]2eHTj.a`A#,Q*Yb=K#rH-l8,?Sg,TaZ&T!^F@EmdYR)[p;l5!aCHL2;c/ImE43'81aF\Et@VRR,5)IcY?#81/Oeh'IDp!r%P/=D$fkj"[[^l%FmcV58-]C!^#$uAOqS7oGCCb1Fh>##4djaM(-:,(/cP[h,\6Cs.KCUk9u*Js/7B7nJ+E8*qN5f;,sjF=C?G%_-0$"-b*BF!!">5Z8)#^Kmj")O%nW%G8U1/AJ10L0[1gHA^FCm5S/a#"B1'0g]DS\Su'NA[$I;KT#fCG@N.Ca&0gfmm+/J]8]mn:+22J7&HiI<^Gi:`li.>Y]n(?mF>2jp&gM:U)D5>_D-8Z!]Z=PH.un[9TB:.L)BC-hV;VN)m\`lREiiX;Rbge2UQkZZ8Jr;"Jbkdb[f?/aanbQn@@pqN_IrjZ\_a$4=`@is@U.%PYN7?f1^ufR+X3mcNhe'Z?-6hT_20.MNVCh&a.&O3Fs:lX9GLJK43XR+Tb.UL;Tk>('9N/aqQeZr3%Q^-4K.d`^$7o\A+ms][8pU$Jmph>67#tWt>*J="]]X*][_`JFoGeI%PGb.?fN9=\-ds0_=duC5Ko]A+=6k>?27J-F9W-Css@o%1V3CZGiO^hNN,!"dS_ieM>oJJX`7fSZ^D=gC[,Y((a6[/0.3Q+F;Q8:i!EB.Ms^R$`LoS#:-7K8`2UI@D9&mr#J.6C"CS!0d0_)^+:VjqgKFOW-^]Ge:!u!q20\h,XNeXa@gsOZ)f,EAl*r&G5EAElYl2)K#^;@\Og#D-@L9)t/";aFEms7#UL>!^(p]7_5R&E;]bgm8M(Wc[3h$_&.3q@HYYp.u2!o!DEi(nP)m&pA:]3rY$:2W#CZj,^J&q6k`gk0$[==a5*'CZ&-9mH:G6)KJ<6>YN=2U@8n2(?fo:!gmM4).,MCm\pTC(=%9rR5^1;G?c0;8uh-:'JgFYQIiP93up#FZ)e#GfsbFa.LNZOSCa5K8.+'93No\:TpGa?R6+V2aDCuHgs`d6Y;k>)6"qpYJP7@^LDi8rQ^J;kl>5,DiV4`YefZB4sdLGo[p$f>PO]>*Gk]uuam95\'(_p#LK-#Qj[Qo=Y1M`WK9]R**P&W4,HEdKj7R[\Xm62>l8!Y@?qj8a]"uP]GBJ[GW*$GdPLg8PC9kF%j?EA$'e'kj$i+l`O_i)QI8?ARVJUa<-`I.^Ic<0YPW2=sJJAKnm,[hH.>%8e;B6Q6`MXi<>*^(YL;iZ"C&/oPbtXeTR+TGTC;ce_[!3Ylq/)kEZ3Q^Q6>ghX5'oNC5U(P`:mGG4h3gYpdY-[$)TUA?>UoYT`SFJ3&j3I0J@`a/EYO)h'kbe.u-iB1_bJ6%B0qQ#!%oA9EOLeW\O#C^db`%CMA#DI`M(gf=LES]``tq;pD(9>t7N90]&PGYn(=`Pt-TcR:f!TAM)ks16bZ,kCF&\qb]Feo,-sPhFSDVs=,&?U9-i9D3S1pUA274rqlY']ZrM[W,&m4BO_hb?\V0e\e7jcm$O%ask0\@f"%'a4Nn@R13>rBMPO^B+T[U_fpYUBN!+t8t2BaGF0@8Wq+?_YMP`P,CB*n/Ch$uAL_X$sU7eUMtn![<`gb(tK^2o4dl@O:#L70UFM1g:e$>.[:,[r;d'a0W@4Fg+^g_R5)I0OKS.A-oKg@l*0YN7KR,dZpXKYW8loNRS(hNi+$r@:6eF=n5MsVK63C7]`Q)B+W7U5V#aIk?"n@r4"j"K0@-)o/0W3IQDCN#HI10AsWO"LJ!16R(eCW/O&3X;`[rs%(B($5Yhm'ZEnLlP]%iIdjY^05o#arl;"7J)[CU7+BfMZNU'KHISXGQ0#@"g:$GkB.%UMVT9U@S5D1Ka94.`GTD!^H.MAJX&FD"Y8JDKC_5.(r`]iY'r>;I/g!lR_^T^&L@8hacR7[tmWW\m;L\;HHpf_&(5da)%c_T,;;UoJKCp?[L/O\o&fBrm>n<37^Z,^8Z)o]jt'S4kSVNSRZ!5K0k3ET9\+c,P'8cE+OiH.35_DtEAJ[ocG\Gu:4-kJ]Z8D_qdqpI-lhO!C)'I(7Roi6r<5$pK*em,4'I9bG)Vd6-BG(/5RY\C$8o5nHa0*\>^oTeR9F+>>m[hrTM(I:,f4d4aVbj_\SSA'o_eHl$('cAU)pk3NskDpGZ9)s;#W4`o!'d;.q+*^+ca!R\MlZ/@3_eeI'GORrgrJ-AO^$S5i*J7-2,7Kj0p0JllsL$q;_/*mjK@pu.:C(%Y-eQpf_X9-;R+gDk2%r9UJ6R2lbTbOKQ"=LO"F`pu<`3A(Eh^uK/QHp4\_Xr5k5CWL!rs(Hi1oU~> endstream endobj 3521 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./images/tRNA_chrom.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3541 0 R /BBox [0 0 841.8898 595.2756] /Resources << /Font << /F1 3542 0 R/F2 3543 0 R/F3 3544 0 R/F4 3545 0 R>> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Length 36699 /Filter [/ASCII85Decode/FlateDecode] >> stream Gau.S?*A*,OsTa,;Z2CL#UT/\h]InY#uZV)!E-QQ*fA\]=fH`U3ZEpj:CPudLUYkqBC3CLC3B9mET`?>LSl.)[c>8S)#?J*rP-,GnaZ.qJ,/kXrd4NNh8`n%cOUs9iSuTkj2ZZDQ[epgs87rXnA"qjo[&*ca+%dK\.l._a?gJ$e&kNV<2"03EQ;Bf?o+.0tqY85U+90l@qtGU=5Q:%7rnmb%J,-SRo'ubZoj<4K[t"ANJ,QQ8rpmOZ^\h"Dofm<[#L1#CGQ%7HCYbbOq@Raq39T;A+!9('LUT/om!"!qq^B#'.,\rOUq\Ik^WdJ3^i)&/rXkZ):lUO#;FjI+6MT/]qtTKt^]362f1>p9IP)sg]_PrF#/fA)AN%PM/.jiq=)r"WM;C%SW[B>\9NkPSWF7DTaJKH$6D(Mm(B4N'Wh!72[:/tSVA:)BS0-;rL-kD>ni!qmGP+h6muKohjTG,QZ0Vf^<`4qeU]4@"Q>=?5QA>-es"lh')Wl[Y"&$JKL;a_H^g_+eVEAlir#6gTgoq\Ps/f'7==&DQ%NTU>Q%o)Gpg%]NUJ?Dn)j#or2CNp8!K8;QT/o/;;R79UlEM^IuO#3Yl)WJ3Ad=,+@cX;r/V7%]lZOJ$Tp-9$a0eIJ[*qWu"L2h#-`f8^HZ4KrKRn:]ndq/:[g68eFI7>T3BL8d0/oiMH2%)+W.hMf3CO5bP#(sO*\YiOQB3_X"3/k"\$XI*5sk2Q/qRLMJO_ZP1UI^^IWl]\XaTllG$Q=@!+$c1qUdH<%iM`((_3hJL"_o.LL9A_s+Fo>#9]bKUY#nQ(:DZisQ%C(2;>bFsbWF=YD;5aH\0^T,R1%scQfS#!u;WGPjoNbdHL9])Q&,gl(N7i#._>r>l^]_jklE?5^sCF.%1Oh%/4K`DeGls(>6bq%_b\YBjACJCCYpLJ1&?G=+8U'(qaSKOJr;WGbhF*A7dJcOXQDPt>>pkYWj+js5]-B`M:Q[g"&#e=/D3o+k(BcV/!6G[EVsY`j#L"G9rAP'b`J1Uf3Eeg)?PAjbn4@6p??)O5=9P1;T]*"'tT@*NhLAI0NWnq=R9D9dRZ99"P(4-#thV-(&BMKh8"E?",k,/bSo[s?qcQW*6WE#VLd-()47K&S?9?:M@4ha>Kl1ecNoGWcf,]#r&+iifrSBT2H^31ckHrGD_'F)Gnd`iE.^.hrMBl,,JBL(NF>?]`Y:AV65V;@\nN;(]ZYTL<.p[(SQ':`hA&u,VY:@ks17Md_RsS)BW=p]%-o_#[\aoo]4kin@LAUq-HNgmad/)KR)q@*`k[[o);DW&7Y@qp5OC3YKXG_@NKD!CNglk#k##Ve29V^+Q@lH3jWc=fi\h09R!7RN[\SS=*\#OsI!IQZdS:g/4g7f-d75l2ZpFhW[6_CcN)2:kEL<$_IsmS^"@o:o$N-$9d(Y.bV*ui""[SWVmY[gk*q\q[mkmARiuPPKcONS(UQ)(J8ub%\KP`-_eQW>gUUJbrSrD'fcKn:#''W*e:&O,NAcU]b++qr+nOA&qRK;3De\SLh`,/p3gm]?>_P^doZ)G(YKkMQQB/f\ViQ?,Vf.EI?USW:05>3icjKb'rZ17_j[g7fRc^'ef=NE9s+UsP-0_d)'>Eq+JPTCeUlmCEI%^.#.dYa0P@[J26aLA68U']]GboU3>==5BOA6:[LA4kB]K\kL7%LT>A-Vr\SfAE7\+fAXcR#DED^'At??hd`$"%f[ApQM6E%6(n_.4#?$sf;?G\)[:NX:EphP52-JdJuH?\bT^59>N%b$nlF6gm^dR28s6iN(NfLb^YBr7,Wn)Rf(lPt@`*I"rHl#CS+mbMIn;cU=VIDq%-Z>H(X0cDV]7(j`;BJ2p=q<:9cT5Xor9!H,2OB]MrrU4Y!]eS-/[,olRAHMmRe9qcB^t?VjUO"J!sNBB`mo!]KXj[Dpka\_CkgMT2U.7QI'nSHoZ+<'F-"P1Pf3*mIR=D28uIL7TskPdWtPdqY''?ZA84"g(MZH$0N1mk1b['X4I0;3[_O\c`-a6md@*_iMt1Ki[/?Q]nqN>TI<"S1Bq0*E"]H.0>@BbI@Qnq*#+1j]Z/EJpN59lC5S)FlElE2\ZtGSh\7-u9jO9\`1UhY]sh'5hOPT\c,$[HlJ((Bb\E"okFoKLi0^S"W`[/5AK8nX]daLe/GAA`kO\%?;`o*`0+La'P&$rip+]npqfBBQ3Au(oICOKQ#4_\7cSW\^?$/KnRJEO*h56Zs>g_DVHZMXZ.uJflm@uX#U&(g.?cpWu&*D#);Ua"Tus)&*KtC*1V!)->C3-5EiZ9`Og0WQo,,hSO%@dDfl3Yl#P[gH@"2_`l*Xj:ZC.D`S9uh?)^5JCK1G.K[FMI4j*V+WsE*1+"s13';[rNM"a^C"JoiA[T\(49@M`5'Gu31:S]g*"a-(@Kr1]+/]r(-V!aKb5[-dH^Lh+qK%MGNK9V+^`7oC*L+%`mg>lq7Sn(4R$pCE@-Rj+/6fT68>g%N#aZc^dI0?s?-\YsrC!2kc[bfI=d@a%Oq.4\"PmrkOS^UJPbm$OAK(@QqU%]F[$"r&2>87h&bBm3X5OW:9`5bA=kAFXDE(HVO-c)?7+4e%oI^5m"PO>c#DRUH$EkKp1-A].?W7u\M"f+#cE9Ceqd_;E!44(.;+iGV9k<*BSH[Ge&(!hgk!%snC4n%KKXm_-^qG48oPa3"TO6;4IesqEc*3W'TMcMi6l5;"$s]ZU"A.n-/!j[;&c)W\$orQ2$[:C*OD`6:5fRs"3W$<=YRR40X)_A_Xag]Jb,W64:phl/5hNU">t.pq,YWZ;!q%2B#4AqdK#/,'ZP&S%;IP^cNWrl3E*CRqlS1qj$NXV+Fij$i4LVrhte>R<(24b5`mt7Z40'7IGju6O)>!#o0M@?!kkQuCOIn60K1'RT6\q$I.($u"m6B1?N=f=r"oQ8W=,G=m;kn13+ggZ->E.%dJZo^](If2H0Q^p6EZ!UV0G*lEP3aYaQjIp(5(Q#\VB^>K^tE'>hDg2114_-WjEc#0'hfPeR'Ca$p^W/CS@^enbMW1VJe"kfJDk*rX[#"cAtAnI),0$SZm8meY?m_*Ek+dIsH:3+o_o3)G5"[5VdZp-$d2eb?e!gu\iDkq1)g)\=,iUYH2A2dMdRJDe>hTBnZtA"rDmXK;#.\r(g:kO>#UM^'*K?iTVmW;9PaDL,LIt;UmT1\^'_f"u'9E#taU-+Wpl]9U__m+A5ZWNf.s=*\@^GB4kp-6C+*tb-8c[M<0J5]>H^WCa;ruf!p)mh;U9C$2lVkK0q?bJgd"VJGO@77N<&^JPK&4Oek)Xb]A#p+_`dLbM;hie_N8b14_aApoq&OKgnITu:N#8Am4:3oPP1@_!t)@t)[HfB4rXq<2deNh'^ihS>U[7Bg#,\O+/9:>E)C5R7,c;4VM`7PREZP%CG_M;$5[INEYP\-m.i&7ZIp0pG]'jCUi>g8YK>l1cBa^3>F_67Ki^8r>RKq@2Sp/7l>2h:]\1t?;g?!^!N5FIB;85\7F-^[_V:ZA5D<$")h\R]I5V]Q:-SCk'mkMbQ?6s\B(o3.YF&$Z`Vs@j65BB^feHLnB4bf,[I'C\=2jT@p1Y8RW7fL>D74'2=0X'@m:!ubmG'M=aM!5OJjU.[+k.Yq^g[.i4T^q94M^K(;)=4p[?G?jfS2flrgfr5kaJI$8_Y\BuGd:sqcN6iNlIVH8>g3)l/:E4sW+q&Le5Ike3.J]Tm"Q:sX2IC2^T8b";dI7q3+Cs@)BCuP"?iL@*Lh]/:TE07R73!k^m>s?@"NJCJ7ho1SHD&_DgHKQ]2:ko5]u8O?].pA$3UX6odgcBZBnJ&YgfhQ9Uf4XC+gn1tY9nS\V+L7#(V.KN?@p6q1"EA4$;Rp+qFb9N_:)@a"Z*j,@:Y9H5t"5$VSQjY%t#.52W:U`0tNOM4t11?;4XVS)B!b]$e."@nWge++M+/71*Ypa.4r5lmBpJ3#GbtZ;*dh.+=m(D@7UMsGS*9P?k\HcBTPT00c@UGAj>9,[oD7:V.G1n8ud`iM!MH.;=3[bgm&/>&>l^\>GkR3hY4'5p](4'h_/;uU=eP/90:ed*4YJj>91g\3.H1,0+@&[OcWA:iGA68q96cWpV(pFS`1n.>jeM7m9k:`T1ji^hiu?NH5i'"1pq*LI`e9VS6&f?U\19*ikm#:Ec8e#r(4gBUHi@sBTu2BICO[n87fqN9S183)8.R[-I"?\8#2'84>`'AAiiu6,6ek1\op8%jY%r]_(9Wa=NQ6/D-QqGIE@_gQmgb2c1\plPM@[n?XkkP1D?5mG.k3gZt,=%>`!gnS`NWo.D3F5ia1<$8?n3s?Zh.E&AMo2pD*16=MF=HW%!.5\[24U,\h^gdF__;+a9F2LjQ1njY%h?rL4la7`]`0Qp:`jF"^'qb+DA?;p\_Y-YN=:2mgZnHX#>UIkl"@j.#g6Y5A$/+EuQ`POoV(Q7nW.OC=T2i_FITb-Gk3?&m6i]LM/,2S.=Vpan*^tnmGCQ/3tlYDD7LHD2!%L[-7F8)J.K?>/V;')\@:a]A$LA]$/I9R)_+FMI!s.]aR-6HbVRO4.ar!K)-h_stUa!`\cGdPo[lHB,;^V]14[l94,O5^>&QCR9k4i]qfU>`i"5W0O_?A7J!OL0E$F%l+Ua1#("ikb:e,S-^KW,&J%r8a!Q_XcWj1Qk6tb*KK>FbjBeN5G/Di]iS2Eji?Ghp9_PW-Qs]#aCY]u+aC6AelmaP/i%e5_e3P5\U7bp)@"0'cGWE4lMai!4Yn"pj20$bnj+D"UP9&U=GH.]4f4h+%Wj:NI/Sh2&4B?703B>p,]-&Y/tMY^K,+b&sc$Ds=$DFtrb`T6`75X&qrk-D>g`T-hC-6&"H65BnBjDK=H%bWV3sZn&gp>oN:]NaDg>NUXG^M^]E:MkLhNEY@32[heH\c#84nX6dC=[6g49GA2>gp;9I\i'+l[fj?](dW*cbLiWYD;h3-Hr7Il6Fn'pCs%e5HIGlIna2R\`1O:Q``$4c@\obbTa-O2TJ!*6F<;h3K6bM?NA'8*&7*,P=*7aXF&+PRupHnq(*iR:1H-i]DWg@oh`![VIf"?.`'Keu<^2Qg4Z?X2Qa-sJ,V36U`A?0%Mkn#LmkZIH-cW0OlO)!H-Xio]-%jc#Jo-N!!U"ZJlEo%sGn5-FQ./,08<0YkD`M*_V*0`""hCX"qQtFrl/rLN.PUq+*gY/UIccZ!r`XjeJ.+rXJj-Df(?IiGh*@tOd:pT1oO,QBL?utcPMT%4i$B['L\bkB;!^sJqB=/`="V2n`?LuI[5KHL.ANQc6_*c8/8!A*;.!0NGRBq"O6H>6Z]3WgY(_f!X[lj@5?LZ=HjO'iq8*pK#Dt+\("V2VH*r!uhh8>[s!@:[WTV5l>UYEYf*)^D@CBY^;"V2V`*qsVALCR#R>"$IH06l[to,-i>"#]hV7?gL9Jqo@@O4t\>6dLBkFoMdX(;FO1^EE&A@ln.D%Wt+@7?gL9Jqf:7-]>?]%TG*o(/Zj+$Q_p;4F+F+aCql#c'G\\_*c>3U\Bl2;'.N"M^Y"Q"V2nhT$t]sUM675jg%\PJqoLD06UPAhP6"G2=&*<"V2npNc$qA#L]EN7?gL9JqoLHYIjW"j`)qDJu&hj3jq/=/Y3*anNp6Z??Cu>4EPCb11B?s?<>a=Xetm4j81\7FrkfgHugGRC\X@EcJf!<*G_5X=tY)2[)oke4BT8STju?2F$#HZE;j$+aV6CQkZIH;[f\T+;=di%ZcaLunBeH&aldMh7/sd,obc*\$QWHCK&'SJ7kWBp8u?jL6cYLjD''VdUS`@^@qY=`KoRHTHfC#Xk$d;XE0;YVn5-FPE=;5Tan:D$[s/>OJqoL@:]#E5$GFm_/KR:WjH6I*/^Ik#Oc\aR9inTE5srbYmml`D4A&I("+,h?1mBP:g"c7:+6MGJBh0$cPg"C.NtAXI[!ku`BFOE_LQWOY]BRD8A?B0&jq'1jkSWlLgH!A#U[dt6e%t#I%in$/H]e0t6hO=#[9/S@?LZ;rjk5BJ8$S+YeLRX?iWTi5;kBQ;H%^stl'h!InUcOV.F2miM/`]q2m0E!_AA!rQW`!%pjGeA>2/"Oc8pk"4ETq7%U2VcX/L>dXiSX!06l[tnr+DtaTH*5Y/QPtnUcOV/^JFO7]RrL&[/b2/7.hmZ/n!6SHli+^)'GZiWTi=>FtP@l.S0Q?dlP:?LUdsjlA-(*[p$?JpKkt6bM?NABT&IH(aZH[:k^P?LUdsj^kd[hOsAX[:k^P?LUdsjX'@Xb/79Q)R"qk`T-h)(O$oXD*0@!Dd3YtRGnA\*ID,:B$WUYGjErs4N%UK3qg4R[.?QI%JA#nLNpX&a.=(dG93]rE@mbmMAJBsm!1)e06u'f]f6Fd/m.=>oAY?1IV[1tN4igd=M3Rc@*MtB:rLW]PrGk"P>(M17nbPLc,7Rl%5hra:s$$"o%L#:ahqlsnHJeDEQ]Eo%[B!&X6^ne-P**eVM+9G\pIL,1[)"_LedK(LXEX,O(bTs=e,dc-n7I08`:$]+[`Btlf4JD(DgpF6)G!s$tnKEAP-lQM2WB@iN1:',9\*J6H3Q+]7d=nC5,FWJ7#8H%)[ldd*j:QKYCr(okT^YF\k-MC=aht+IaC5)iq*ABORau'?P)%?Z.(cZ%:jU#bo@[9Zi8KS$O1K\M&Z%Fh/b:,kZ;=]c_>)8F7#->GiYuu&fN(.F=jA#MAJD35OiGMMVl-<61GD*c"C\ZMhaW(8a!?YksC`tjKHOf9_!^iNYMuQDsP'38$U\*8u?jL6cfi+[3U.!2k#ICiWYD;c`Y%cQWo&27I?(M@3njbTV5l@UYRjNQ2Ib[hQQVa06l]JoBo(hKe0Pp@lEr=M3RcA'X*Mjl7kKDqnjMV$dns[QLGSmQVQD&*WV#4GNXM6Qr>&n]9JE#R7[qgb#.HMAJBsCjEr_=n4gYdC";_;nV%^A'8kn-YQW3hRF>!1;sV>3]8Z0\+;lTNH!'PTAg"b*?1BiQI-F`I(3rRF-\F\kZGW2[kcmXU@cI5OHM&!n5-?>.6NLfoJLB%>^;7J&3kFcL#VYe`J:_QEG0=bOlNj2Oss`,:mb=k%4Est4A^@a>"HaL5C"*"ZI?N+;WYMhimP`UI*6#liYN,Zno*HKCYHN.C2[>b.@K0!%g=>Cr+BNKj(Xsa[)\08I,-6CGutfB]cmJ)jc,%BUh^.:=ScL#Yf_SaU6sV=?'!DQf0W*,prObYpQ$,p&I<^e#5Xr&F0GK*'Yen2pK^13Cd)^0(r`jKjL;uG^MdJbuTnh>&FIL?1Q2m.k!9_"=%=#fY_4OP"2+%#SYYPIN9?LW3sf+"hjq#39MHfJ9eo-o.9:iI&:X(/TmJe1b,j4`c8dME:FOr,mS_3]#$8+WtD=t>O\Ie'^?@<'XYWqjR8[5Y8=1S*Rfop1`,uaa&62Oji*p$8*gU(ib!=jV(AS:OkLI+s(Zs^/2^.0GKHnD4+MP!"o68.pA&HQOm`e49jM^MRWIdp7u?l'BRA@LDY+e\m+\E:0)prOa16sPFJ0j?RuQt]o-Y/QW!nWQJin?1-^4RNHd)$N"T25d"a0-1K!8OQ3in[LQZL@iU).4!>rKZ_cuNHlq4r82i+4tM0Q8.%g?+hV;Xh$aH%33EFL9_"$rL@INrUY?,JKL2l,j#*a*`D7QKBn0!CNU@YqNbKnjnq(MomTmR3Od\C"bL'lp:gEnK\E?r>)B#rPb)FS?q0U>E4do>_QS>ctXpFn"!(!uKTq.'qTaZ%;qfZ2j4=)IhEd1,o)fd855$7l$Z#r+?>p,G0B3JZ1OOo:^ku1^q(f\n2Ia@'/AmYT+;U7L1n0XS/)6^jKf_=!'?-,8OYs@Y"7cpg*(uC;XM""#=QE$n1kY?k1o7]$RZB4q?TID.s@3\fo<];PKKZk%tG-M]SW`=>Ym7Q7Q$;p8Nd+0UIO,;QLn+[5k[pBa+laSksM@&H/UL=@(,/@)3dH0Ub&:@EI"]YY[%SoT*64s/efSM9lBdKk2>aVVIEGos%FOjL!<=!V9q$/\S-g^0r/qC.Qgp*M[o(cNTOa"'/)J"*8qh7a6[[1VmI$n5Y"3U`F84&D)!,J0c:1_oTa:"/CA-L;fas!R06e>RhE'W6GgRe94XG0Tuj@/`sSc^OaZJV*VQaEX(T%/0:1fIGci2%;$YiTsp=S2*kF#^1":Redeh!+Dhl47_UKbm33HN$&(*lN+HBSq^sOqZXOuA.$fE1'Y=P2C`Lfh;A&A3#A->mNi:GE3_$-FPV+Ss*c$9=9sk2%eCQfk5"451S,tofC@+5_;I>J&(Z2\$D,'EO*`u)?Dau:77g1BGIA$:/IUL1,rg`Soe"CX@@qZ^==;Y-_n"jMOf7DW1VD-T^nJj-D@/DGj1ZT^9)(H>&$N-ER\c5.,A,ait8:Fqqjaj*d=L1-.gC9*jgN>(@018!!c/Z(cO9nb+0GoIGqLa?]EZ/%r8,C"06\AN.&p/I^Z?N2%j0ti"gt!NTY4?Y0Bmdrf?d%O-(5-'Q/G:Mg(n-8&//N4R\W>h+(d9CZ./_nOC:a>m9^l4sWD-#QmHVWKL%j\:h,nL1Bt,A(tTRk]^ed6"fT%Dl$CZHK`hk3;bZ7OV_hqor*Z!66R--B56gZZKpXE,'^=FOPJtGgL\,k-gDN`k1ZF!9QH]r"LnfgT>9tPgZF=pj$&\rk>r]S2E?rhH:,9'9^BnO6RdT3/V`Vas$[Hg=E@D]J+.aTRR_QRaI:0PoOa@/`?<(O@ah7d1K:rs*N.<%RSE3cSOS*Cu6N9.1Z1Hp+%5;/f[e0Z5a4=niOKchW.;^"Q@&^^9CVp=WNQ9b>[JaOj[Vs3P;/G9bm;tR2'D_*fVfB"jS+s-[hKhe^:\N1#P%jZMXo0N9>SgSjOQ99A3IFrW&eUBNre#cc9tKQKn,MY4TE".MnZ;jWIH&T4b<+/8d'eJFGeUhRFP?WF>I#h[5sD(l2=UtZPIfc*=%-]0Ek]64bG.3&>970##OO%O7j^5!G9n3K9P\9q-:O]supXUmY8WL'*GAsAQ;#NCoZrDWI*o/PlhOO:;]W%g;Irj$*ijDe'0)\`U-l&L'rg>(^S!PHB?@p^i9j>m]4te?:Kn'U"@+);h6VnYF,ZHbi3q!KiD`8#0gV]G3K;3]kX1=u:=r*=4A]&p_8c-s=H1T3OnH!dQ4tD;f-Jm@%bHH\GkL8\oBo0;0g?"s]#,QU%(nuA`^7E+&9E%kjO(RB["guo\XH/0)\18LV'\f\aRbR5a!TpLEM3BXbACfs8%tV1b:Y)Sl^]`Fue\c7S;Dr(#*DSXKI9)D]iI&iGn.*hkf1`9`L$b(f-`+(fJLl&miqiJr&VW12D!RIS8p`G&)[biO:/blO6Ms!E)tdUE^#hCBI&tp^5DTho`F%-f9t]"?:#ElNoi'%.r3PdZU3PJGh\0pIR=*%STs\1qVohkWN$7&uF2+S_X'A@0Qd4>C-&%1>N8?[:la6r;4kp_>p!'Orok?!\P>gWm*O;?kAgk\oa]le]ldZS];i`/)XnT9gabE;u4V]e,5F%5ZTHim#5&nki?65I3rlH3d8!S5ef:;[Q=dbnPRjj1i^:1G^Es72X2YnNI1hEaZYJ1c"J1*3tn]RZM:H8$Of$GWsagt,8:G'/tQufm:,TX_Hp6p+#W&\2l6u]l7]tilZr*mhKD2I73g1Pt&'Dl'Ekb^i+5u2QAB\=/:'S71tD<8sBVcM"QM`IMfhFNCs@?a].:c-ISO=NT!Q\(]h=hm^Fl!?/tbPCcYfbPIh"g"'LT(-3=6?HAMN<+*o2,EDf1-eANPS%T3Kk+^3W!4['\coGA$eAl,p]es1)2$NBjFEApG9W'mH(=KNa',tnYZSStaog_*@B;od!OJV=;1?gf7kK"E"pC78%+T,jK>:qR*79Po69mA4%(-X7@('YW?>Pa]^s!4^`$q>M%OpZ_*neCOJL0(2NB'*6=Nt:e=eEaY;&'?:k@_3[m3r$ac-e*P@HE$\amq4b*12H7,/Vi\R;=k$]kre#_]?`&h&Tqm^e1d->RQStQHPXA,E0?F^!b"2[g/3Y6"#B-]65IUK6K>%+'9UYNq!A69+NoB>_%R^A-[j?"lr#3a/U#,8dhR^2DPg^k(^C.W;s#r2Z19E)B*3DB1TE0%)YtAf/]?Ed4j1iAiZ%V==K!0Q>tS)h'?*%3fP3*/_t(!`eAF,G%BjP8c8/NH<]QV5V8cMk^PNm`5l_I_C"?`Z43)NJO.F.)ig5OM[K[/WE5bT&ULJTHsc8CiDQ?*\86K[&lWOFn.;6"icKp62"F!d`oi7pq5,,u_Kl*#1W0%gEmqp;!lWrOWsQj!'NZ<:>:m!Q+Lbld`B`kHNm6RIoFb:Nj+XW,+)R`s#BdqOEfCM"P=S]pmmT"eT?-8C[?B5OB027_m3>:Wl:#51':(kN]O%)kKgW)(8V&Hk0,Cs_%/H*DpTG?qH/Y]#1-t#uDJAPn@JQ+D1CE#mc\*SXEkPB!0+9e-Y^C%L#5-Lj75(1UDbQ6)X^A)H0cBNuPF'H,]l6CaRD>D:gMquTbF_Ik`])jlWf7<7`l3;9MrcT=;.6$b?(ke,Ymn)*24#X'QG8fs=,TS^E1nkNG[o^8Wg?Om-<'nS&mh`+qEd$c`e=$oqLu?oOY2+RnFh8<5=;_%%m)9Zg`aQ*-PQ)lam^*Uf-D#"5/-^a4pfD>9S*k>r;-S,$^[hk/MIkcfKg\2Qc/t#*I^ntm2f9ALf,kGd:U7X.(1&d>+1(Sl.*:Mt)ng=tJEq>-[nJJ5:)j>GGVd=Up0cBNu'8<"!b]f1C10:=d/-EY@PA.g-Tl`QYp.:4b8$K#AnUQSYo#@n2BI(R+Y4gA3s9$PlM"rB]_1Dpniuu%\TK\(99[F?Ibe,@ghZ1f4@[E*i.9Go?G0Y5+b&u)<.W(\9TV@JR\=Uc%e5`Qo\X"!P6\"(80/&f$ec!L&ANJ&E?_c7N"d;K,D:g_lHP:una"K6IXe+SH#P*ojAAL*(%&]U+b&s+\\7c6G]:6_i.6FN;RP?;6bKpIs8I1io&-$(aeLtG;XYWOLn?fP)ttS@#:FBr*f-Wcl:8UEpiSt&7f7o"d1U(%)7%GRK8QV)D7sqN#^hGr'pMU!>+jiPoBjeMQ6LORbhWG.t0k%T$IHSOpA!4a(p!f`=!aEh[aTeXI"+W)e98TLB8OV"crENeL[%2GsheBC@>sLnUegYqJ'&rOZ^\gNolYaS`0g6p\g7XHq3\1i=VTlV0Ah^_;fsW4)5O%*jqnHhVp9.$Qed6-*ri"i.8Lt'Q<6l.:2LghbTaWY9]2"#[[K/i"3YJPkXq8>Sg)\BJlcmC#'q\Oa,n?E?g%gBp&Y*B@S6d&+P7,K(7b+G(N5'8:nCLFBSP&iN0m?k:21K#PsU;CJ'r4YN^8?!Tr/B&P=i&c3APE>fABDL9CH@g$$Q9@9#oCUH4Q8^m47'"UgQl.I)+:L\St9G_O,Qje3t2jP?k,nfQjmJ6Z(3_,[ig&(4f[4WO/,^NaF>%ka)!GbEl#PGl'IBG/KG)aJH&kY1'7malD.'E#XjQ2]g8=5/=:9O""E+pibTGc=<>En9or(V6-V>8`SQ&=$)Ci>'W4+'jmXhUe;J(K15+S-!?ma9tI3D=hK\dX;X3)1Gcil(t>RrVK>tRjA@aY[%;3!7jMa5g0NDH06uXQH&TalOp>_YWi(+`ial6%K!HdGjFtNf>*m29*a)p"N'=+j#:e3UC[,Y*QP$hZ/6]A]aeGFLkWKhO]]>dE,*&8)Jk)]?@CgWG2T8<1n%4D2pK6uO[rci[oPKI%1">Y6lHZQfJd6%=)1PBHZM50>Wt;6eS!Qbh=$hrYnWSa9cSjo[G5-"\_K!%-Ie&/arhP2,J20:J^?]/*qY-%8s7s]&FqgPYc9,ci=]`*-5A2@/?J/D%OC&jM#KV_.KVN3p$Sglu=cE:0Eo&nr*Ush\P`p/ddR+<[.ZLM._6`dI:c9@YfK._Z#FpFn>S[YV%7%%5JoFXmb-N0ZF14T^OZaNpdm=WW1BKr^nM:P@BEFJa#qL@!_YDhJN5sUQ%#P0bZ#L!bY0fP7&!6P"QXm*c":qbYj;d.^/(@dIo$ug/p48De8#n56Q8-%ClN"6$)L:Godr1s0r#qU)XP7Q@Wm]BA]%>>1puQMQT5I&R:I8$;IAsm=PDmgc)_WS0lfcF2MqnH'Lames(UjhDLb/_n-]QQr:@^-Gt28N8)=K8G-.W+kBr3E".$(`%J)K5JHb7u(/:1^J1TtY!pfMWE=,TAq`HhJ.=#=.L$`!JV%1`.`h6`dnoMg0^Wg1L8&Ulh+fpt$knl/>Dau%fcd<*acdc@%2kY=(P*$]L;BApK:h=0[N,>.&0GdGBcV3E+DBBH&i`=8=iqrU:Lf?cb8LMf"bkPd@UsMkP;41fO31(G^=T^/'^6L::Y!jd\Ouk6(@VP\4YQ(;KgNKdoi;HU#@KWf]mpKTYD;)deL)lFq)p@PLH,h1j7a6Bg.P>M-$aIgq=)__l:N$?=e@J?f&8$ekS&V\2am7r`=`@IaROVP\LbN"]Bi@ua),tYjqMZE,S>+oj*b"+em-;um8lP7XMkV6olSDSMerVl+l"!3ZfNL5i9pdHuP:[en;8h/.bn_.>]#@1\H3!'(>Lk-1)O1'IeX07=r=?*nJghH)!H%U]./Jfp;5"J+ing)[QGW67r!9Clld6k;JeC[-Y;4-28_?n/q[u\bpt#L9W$pbRF\hkDI+Amm>OS^K7pWIZ$]#.o;]69iH-XX.`LSq"%CIs%)]=I<.^cEUc3'cr>i=OGeKu>J9@?*9UKaiS+*-]RX=hcgBND4o?o-:bVl:G]Q_5+\GYLN"/FDRm0766o>roe7l%?9h_qlcPO@AV[n2KoN$jT;J'k"W-DDa+d7!T^G@0@Iiu8H"?QC"@=[IBUe;&dfp])Ll`BtkeIi$dWK\j8'tHu2R]pr_iiVYBSUba3Z^^A@O7DpM2;>!n@gendRcrQcGWIRQ0_jR5cfe01ii3d>_gYEqb;QRD3Vd]arBctUhJ2)_fjNF2,^r9E%s0[8*_RM^IJdb+k0C$9OHL=Sth(K>k,8kJOW[h>$^hVtW0CAX9;k]&$BjQ2Y+V+')9-S:O)L;r.X7XNkYaS:X)Al!a1l3rZUki?oeq-UNQIp"m.)fti\3[9\.o2q%pl4uOX1kr^YZi[l#d9Un[YF[1GK6ldZb4cXCkWH)X`K5tujT$EPNgBRjDQ!:/[0#2C*p26[FPI%\a=p@2AXjL>&8[X%=MW"=$8QK,QuP./pb#cI9u_'j@).q"10b5aY]bbi+fl*>j(Q7@IKn#`\:pp8Jj=D'5LI@$J0j7NDd1j50R?eRU>l65E(gb8"(Y*f+LMu"B1k]*.`^)ILcf(eNosU$*g"0WHR$*4(e;D_'Hf(CHE\ef$X1L>NY'_^;[=YrkELOQ^d@Sh$S=UUQo?5sD?M]rZaL)uF20"I216d2WC1!eD;hg]s0RJU!fLWkX:]%N/6IX11aX=]*(P%XW(gZ3"Mo,#VaY!p8c2hO!X4lM>]<)h!fOV[F"O7'(sP+%>&COB^g(n86kte@4X?LA=`$I#I,H,L"M=dc->[\,^f&Ar;VUVs&Hcgh%u_o@?p9XF)pu12S0,X4U3;*Mic[)gf-1X3-\]ho?sn\C7n*jgbJl<'gG0qMA447SlnP^U_\SsTbkhtkDL"F>KlN_J*:aMs^=*i8D%SASqtePCC1*lsd/">gD-I9_&&71]Cga77[E+Kb^uG.B&`=+s*GGGd!l5gfHl?)p(^K3j#S%r-jhRC1>6$]<)r6$b>FmZ43GcOu%5ZQEX9H:)e(5XTbd$\g8dbJul(=9G*k9Ffp4.0#dRHbkYVa5/8*#,OI%NM@i=Cm]&kDo09RqkWcs=p6!#@PoHt4!L/<77:Sq,01kI*JV@(t>HT:o[BE.13uHY?OFn]dRGd4f2mB;4Kb1sGTGbkW%!8li:[AMgL@/UsO"dpr]l>M\1<503HQa;`gnNVnt,G=N^sp3n5n7IoBL(=i-PPUh+rhLRmbWokq3.k&](!\Y#p4kF:V4HVi7;:%,_bljcc@hG5OY\>\'ci-rdaiI4V6n@7V($9U8EQ-`So[)l/&8]hdUh>V;X%A(Y,UnU3$hQc.\+("*?%[mQ$s7A_Fjia;eDjJ`L4-^hr5&Ll'HCeY4UR1UK;beSG=\K6-^%-?6^g19AadN)bV!3Z]_/cb1XtTUZEb6l1]3R[.KD>Bj1A\S6RZED,.s6IQ8ck9E1QH\qQX"\_hEd^cCCpf>+rXEd,>KkAhBUH0K@Y_YNM<=2T=OEqdK9n8al6C%H@(`Td&9f>VJ!Ed,OfqI1+^C`B"B;XEKfI^tI;UID`'3bF?>UfH_H6u:nhOP^F4pcg'.(G?Ruq;lUKA5Z:Ch5aV+R7p_sAFabLUgK_i#UVOiZWXujpLH&@:F=B#hCdnkB;uo5"OC2`jOPM1jA-u,DbqQ3cCQHL_@.?q.iV;JN)BA&pGqaE"#g8i6@X`f9c(K='"=I2=^G3Q8_X]&fZHrnM5sG92*_e]%Ybf"I7Q;,UOD'tbqTTP="cK!0a;DWeK9Q*V&)>0hUg>9f&n1U"$/+D6R;c'#AE#-YhHX8-;uU<:'g._K3kI+4.2?pKPFqCn',)&q$"lb$-9aQ)^ZYVlq94LM..8,LRADO(&6<;RAeM"h_*h^TENt%R8UeVEe8&YL-:@cC6Mb&C8ZSj6R7'rr7DE3UAA[mR'+HP;`@W@!KPSAM45ME91.ga/*Ug'2Z8'0ILjlJg`FR%s9`4cLhH;I"1[afd^Zf8T`j%Z7_2-pu``Y<%N0MUsNXmb$Wa/q>8?G0c<9e)\_#[Ao6(@aqkj@h`j>29LcCpA:cm6r@X//r5lkmNS-1`\i1slJ5SV\534FEDle3*UkQPk-I18!;*T1c`![XDG?($N9G6!&5_W?X*IQ":9]GrMA7eb2-FQ>Ch>8HKIkc5d/1r7o,A1Mui[9dr^[D@[*[;Cpnn;H>l94B@aeYbN8g_A;EfYpe_h@+Z-48X`F'LXNq,+8?USUogAE'Z,3oOUWab3o;leF@iCW^!Xo(R&@(6ak9]eLra*H4esZ2AbCrl0*9@PVuI-'RE;_GkjiJ')+l^X$($.pR%W)Z]XQg%rer*F7p(>aW08Ho<.q=(HYsYC?a1VYB\iDm-DOnp`hXe]jdt5GneVt;?l2C>-UGZqV_Y8Z0V7h_O]4/no^Z(H#]75%XOf@5;uS!3`_G\C_I^SB-4tsXmLe^C-]b4b4E<;:aho::;S=CT.:4c+E4NLFgr9JFEn$ShTCN/LpT5VUs-#j4@[6o*e^!`RLc96?dnV*^7cHl?.7*5XEi8gQDH"gW%bId\.@C=7kGa4CT(5=#h>;M6(A-CLUdm':R`@;I:FI?VgQ>AI?/00Lu"G/`37rP-7jX$M=9cg=\DgO8WL6rl8_P9r5jWKjQ.`]5@hY(Si7ueqTJV64Nh**K)U0+5O2cO-5h6Om[XSYq(iY`3X*.:"iN>HaGCc:PrEi8iW,Xhk`>jm,O;YjD92't]iMW.V)k\&WNaeU-X45=nh=T2hDb55@ep1N$FPXjt$1G:I#ng>+N7f8?YdMc6o-ETng]p!:K^Nd9_0,J7[Oc;kZ3#Aa"pF1S\#^_8*_HgFm'AG:/YH@OJImjY?pO2nkrFTP;;=WZ"HCsaEP;dO\(6d.!82'sF2=E6;Omc3bAaZW33"i`h,-HOHG,$RY=L_U"NN)\WqRYh-Oj.::"S/'P0D\P*VBW&13>3I]*eU!=QE7XM_+$!NOYCYPp>?\CJT^L'i".J`E#9nYS[GV9.2)C/;M0YiG4G_X!.)lHIIVO5&=nD`dg'ZEl39K7"Lc[L)j,'IFJ_R%1UFmhBX5lC;+-,o2D&J[ajb;Fc0&'Tb$JJ-OCrtq,@V*?nR2Zb53j;[5u%Kf(!?A!!q"1#X8iroCZ6+GFf?!7X_%kM0V"&$)PJW\52*@q*UYb_/oV7@06F+gBYq\p>MppkqJgTVCe3L';Q=RG:I1#kg2p:m^Yjafi?Wkmnd?>^Amfd>IY?4o+R-#'r11:==*N(V*,XjES]faZ/P5HrcuU;2`^rGO9/_t7j88&ij(1b^[#9O.2TJ2@Z;4Kg=9A!H"!@BchM$%"r!^&%aA#2UgNKblSJHmTA9r:`-6Qm$46_+c>b>_B9'$(dUC9Qrg&S&q.Va"]r)EUs<2bO:@Ya,nBs1*pe/7D_B*97&ZA3:]XX9U;H::glK9c(R_+Qd_7\:P'Z'ioV@P3)[Y.@RhobO`F4n>6H6R2QmPZU!3`UhHOeZ%H?O37GO^6mcC]48=8Y*B6fK!Q=nK/3gTu7AFnr97^uZiMp#$F."R]RB4H"JmH4/OZ>7Esr\:g%6ftu4G]m$^Gse<5871.HYO_;(2HI#=LWp3>(TUn"L3m'LL0&]pSMNkk&$tuk%\p4V=0c0s4mB*BhT/L_cq3cN/O3[/Nfj?^/&s;6\#f`0SOj\rY5ZU]DdSci[P_\"0oNaf$=i+3KEqM<:6@2f7uU&'RluP9`:Mp^$NK4/X$qr\*bs-Pk67n6*j%KIg%%pMdR/=s*RCmi.0O90lVA2-S'j+(q4oZ&@t&Ra8N]TEEd.4YhnJ2b4m>A61H$]UUP2o*+40<Q3Qqk<[s)&^leR/O']p6HN3K4FS$m.(jWLQ8kFBKY*[2.^V-Ho>CWr"X/9G2*LUkj3)B!hIS5(T)9[4N]u-OU4D1LR9CEi1I?'Zo<>Qd>:s(5a=d"sh::_lfHoA3[dhp,fi;:g\4\%WkmguIY=qQD#a]caZZlA/.3=U&iUdY&["1S+ao#\EWAF%R?M.*#?H:!qFtJ!2ROQL,FJd1BQ7d6h*J^6O5j@*ERiF%$U:UgApuL(!BiJ[&DVbEi*9I,]+If*lp\`&cj!n*KHNW)J;s8F1K4DmD;$s9UP2[?p0O_i_^o!T"gCrXs$dCD!#DTr^MTYa^g+8e"G2GjA5)l>n>BCn.tYOXPRf&0Yh_mnU)Qb##L8HUL78!%5=Cps$VdY!G6%JA;h!P1W$an-kE1tE@&_g+(-O$%O#S\6,5gIr3n82#["-#-UNfC=[2n/KI"+d&QZhY8hG,k=K[dYCEZHgOuF@"L"Qe]N8R,7QNH;DiD?Qj%ebW?jqgK[1G*$/rm1UTk;*AX\OVHTnR240$2Ht?mQMIKYst7[G"Spl0J*_s)(3fPg`'sY3!#'WKK:?7&k-";irQ$doiImi3X;70fVS:Dl%pW-9r(7s!CUaNrl:XW_ifhp2&i$9f:J8hfZFAt4K90+o"]HnR?:@]%s&a+a;2i:PRUq=UFA^W0j'K#'fEN5K"ni3I?H@qaa-G;moOH\P_8>MGE.&YfkB9gs:Uf5J$Hd_ZM1dC4LF#oudV)`BhqV7TI."-/36^0bsV^kAHT@4_?Sq,93`R]UH,ioMgP:>TgKJP7BNeK8Fjj&T:39:X+'0YGPM%`4pL5PRl`O:]R9BGT#dno-YmasK_M%JNBSU\1GVsP[mC2WkP><);q41'J#F$q1dV`KStq-%+.L%hXc*_D$XimmYa(D2tJLtL=;(]Eo$9JU&C())uuR?1lZ?ntIf,ni8D=hWnB@`%[`PE]CWD=Ga?m>VEMjO>\m#UVq@_^8=8'Uh2;T_(JH["abYV49K^c#e;L4X-7jX$EN`H.qIRap`e7#ZXS9F8bF_J&Jmk1S`Rck-9\GS,D+aUHD`>\AB8+Gh##j-)?)1TjE:uZmut!Rai)j+4lI8+/t!D@W[6O!-7kdWfMXPnZs`il7j>pHhLSSo)"JIRpNgiF?fj19-In5f;6SuiR'?M1,Zb.NKp+_Z-LCg5hD\m=Mocc]"TC/L7PI+Km<2fcM92!sQmDQLoueF4iB/j:`1lg:^:&fhng>*14o@u3gmDX#/F"P%"d:*Z1*I%/^gs6g8g_h.7-!,_@JPh<;-539fXil;rC5uhP9GE2Z!K^(EsB!^ic0[PhMPet@JPffWD=N]q_AJfC,GZK$-SZ'?LBQ;,9jH8^rD%N?;\BXP$g'+1D<^$co16G9XntlA.h8uBlT%;bF_J@_CfV)p5ht2H/(Im*muDDX)Mi0bF`T%&uh.l?//WQ)"JK,n@mW91,4ptU0$c"YZUgtTqHgH0qF:o5r?Tp&&Rlb'2uYqTHZ$:>EJ7p+3>WD.T[LeUWMS]^M`+3R#G-]aTOR#=oC&LPeWT]r,!NX120&9OpUN.CK>?qFNPCn^@).W-6rA9@m\23W4*R&jY%s!R)I+";`H%dj;tk32p+>GY?Oo&_ka-?CeP,H7g$UE#?tPQ%erC$S.-`(+S\dJIG63#h=SF$#-jPSX=;6oJU:G2]?;XQ0mVf2F>4ZDCE&K0#Ys3cTCNe^0/Puk+VRWAP>#osjjY4eTCO?CpVsbj@PY542^[YFI(j5,=oMkC'\3S'N=%#hKSL$%/[eFMMocoNo90KY#"p;a@?9\:ohP<5,XR>Z9;140`(/>gmPs;]-Kb9[207"g'8Ku7H]r6$T=6->NAJVoUM&Y+2"DmSE6UtBngBPt22I46"d4`:ZiO(^\Y&F/'6:V>B#o]u0gY2>ogX&$r5llmXEZAa,ak=6S5kW*39;e?Da`>R-S6me>KL;iq,cW+ELMi#G4iF6tn$#PKIe$#:%fIqO.='9ibV@q[M_&3h;:*-a^2md^B]Z1"`LZQ9';r',\B_']Jnt@Qe\_Yfq2:+.rg!.c1?u\J-5MGml2a_Zr5g3rKlt7TGrI&V/OHYo`@69?6ms%KcMGMC$$fuT5OSH65FM;>_.47+hO'N4,2V`B)=eRWKe<5([k4"m":qNAbrt0ld#L$d"W*A"p09@=p9MBoFKtTU7A+UZ264W54Q<.$hn>ZQ(R$epL)-!#@6cRk5HK,&Yb>"p@Uer`f+#&$_o@@1N`Qa:4QT?ck)CM5fr]uJDFc,8M5?jdX*r,,OWEo:/oF@g&YX\Boe_k2rZ^@Y?gujc71qmNUh&mr7@(]Ef_<)"g#kg[+e.qaH6VT&Ikl$+qr&QrVpjkJZn]Z]>"bLY=*TLG2S#:GpKC516ADCkmRZc"uQ1j29\JA*Y)!Q@;@A&/EaUPRqik@!/e4,^f'JD\D#Qr?bfLY4X&HmIc"_>`rp@QWo9*PAR.;#efDtkii>RTO6hrrN=:9)OQ@>Ld$S3`D"KhRlK+F!m@9TIAMM63nbp@p56Y!@;^LiJ[nSD)M+=-95q:]bUD:VU[7sc./UOIPm/#![Bc8I0TRIud<-(hc/U0@GKPk*26Dit\$-!uo4WS5)I3E&WG\9'Jbe/DF>hDIB":LqBX!n%WQ,7sL(dClXbH"Uf*O"X]r`Y9g(A1]V1BL+\&Qi6Q&gmY)G:0j.;k-AJb_KXAp7-\VRS1hQpRVaT=2bf^g\0eUjGm:5\!:.eu?GY0jBQ9')F$%7F?r,:`KpF8&&(iY-oCKZ`bl5j1UZT?aEPLlBc?s!JMH#^='f#R1mtkQ6m*De[5"7#*r/0ZAU:g?UjM>dHq^:mB&pi.;ni-^_;?:SI6tQ'4d#,?nRK%\YBmXp8AK9\&Qk3;U[(q[4eabLeG)T#%jmk)G=_(^oGfCHF+@j(6.'P%g-l"D2kBu[jZ[7[5%rPX@]_Z0eiIH8TmQ-7U,YiZ#o],hKEZc%4kV!nD"s<"1+kbLNF*n6KB9$f[YZQ(ke$+g%n;CF1&UHj#U.h$Gq4SciTGFOt5.X4P@0WSaCSel2cYb\ki1>+To&eD5Dg2@bKI-"*:hJhUE6"EkP!3e7FlV_Ia`=^7=#J8cthC:ReJo-nCX\7CM^7lt3[X4P6qsPm6BFfpYM81X1%UmXh9$/88lL%4p89V_k(1lgCP[k-Nfg8cs-?ZRr)q_MAb^%QSDiV6b;8GMO63Jr1YQ/,PrlAQLcKQ([2Ch7QmKC]q4-]`b`8OjZ6:bW!R:37/MRe%.Wq.'%srMpa%%bVYk=S9JADrU+^sB`h@Fg,B+eQ+"]NV?'e4]r]iB!i\r>W3.]XT[:W:9aUla\";$`&ukrS*=o@cA5DFo3OACCDA^+%fOeP"=N\>uCY3;Vc.f[:X8'+%ch$VI>=Fr`glK-#PII&[k*%ChF.'K(j6)0*s3G=r**S'J033>tJolY#R^4fc:Rc46/j>u+p(oe_r)1,H?75GG,as9kCjP`-QS6EBqdT#b08[0:=K22kCN*,FrTs@Lo0+O/G^DjMf!@r-*IZoI>'I]7hR(P]pS)u40kXO=L*Dp-VT_ce^SUDB@?>k5C/G")C>f>XqMa2,s$_(dol3o42d6SS"5^%SA[`02X\2)rU*UH.heidIq"'>HEn&Sc.1WGlsl1QTfh3)mW`AXiJi6sXPb^\d``inKfTIBlSuRQ.fmaJ\(#,sKq0VKka\CIrYj"P*)/+o^/t6q:VXH@Sd,XjYkK5AL%05L\6AhB8'WM60[NEc[b`$]%e8+6*9',=:hdgGY%^KJM*>W`s5nn#&s!Tm-g,qNDsu)SpW:'I)Z(<6p;DPu]mZWCF.Q8P87+eJK%0';^XXJQ8q1!gYt*<.4X[,TBtABE;>b.GQ-Ks]ie?ZCFf-YEWE\%92Ma%Z;;4NA09=l"-[XP@/E(u'Ep@Esk@RY*ejI#1-b[gH(o5'LHc8W?@d'Pl(#PelD'*1X%g\n/hQ$*I[C&1jH?,=SZ^7u*5geKcY-sLUok+\eg=mhj<.,Fo`1mXYH/tuIa(&g*Rh/;>l0T)Y>0lLl:%@aFANEIN]E^AN`([i7CZhimfJ_#:2[UNf-UurJ(JK5E/;!Lm\lAG7l1Oejdb"'&KQ@:f3m"_eE9cCc@44d3pGM(_'XpY`7Gc)6]\o:Tj>>qY!]@Tq@$n:[E:^q4:VLF.@)?pnKLLA23Z0b*QF1Xh\qBFG,glOU:u];"kaIN&.Z/-cM5BJ3lpu"R#r.SD#[VpjjXJGAG0AQf)m!be-fYEAkpB[.2p!2N*@b:0HWIX7SEQ]/LfKFho>Ar-u_9=)b'l8YT3I?>FLCcWRq''/K4kT:QA@L>1*a3RsLqK-b!3R:M7t2BfRktkc8c":!8e&(@+Mj)EB[jJr-!JdrKAW3EqA7dBP:+O<6h6%q]U6L3&&P^(7H4H3teX"T]!Rj8b2;+^j/e;&X^L^h?FFOcEt7!1as@8P=Rhk?X).-=Fq)?6]a`fUTr+=ULOs@lSg1'd27hJBu.aMk&ufVW(.n!`lDW'"NOhfWu??\egHA![il5UbH1?L+RZZ(p.j,PK\QF1k&jYUKQYQ42]CPUbuPjN!,]6g]jj^5`l0S/6W]TXrJRV/#U_$PWE2)>(3QLh>sscV\G."4[:U,;WR@NUg9$]4OX0.jjXqd3@teEiecKT#6DdT3>\s^(]k(o,bC$$6t!CMP0@&3k-4\MDBghsEa)$@,TnmtUaJd_"'C:l+>',s=@mpqES;_C>hkX:fs(Gr7Lgf-2"JaJeIrckm>m6k:gg!L!O^/!#2.o>ehTpMq6"!_&J^Dnh>V$'C;WO7kK%EBA4PJkkJ&q!GE'LcZF4>ApWPP@VeoP>'/];u)eMRjl,_2)WN+X./Dc*a]B/lIbQ^fUDE5PXaS!8SS3#FJ*mBaTgp$!&S[`5T2_9(L_AUN+o/7+1p2(i:kf?NuCi=f1RF9i2,GTRK2_qSumrF/kHp>p;Q97.e>LMWWE&fJ>5q[qR1X5#(F%3b=(nA,h58n1EbE'i7n8].\`k7fmS67N-'IVh^WQ0kl@YSne^RWB8pFkYjQNrVqJu]0ujhoUQ`$469"EH)7nH-75\]B>,gKY.QC4K/;60JWXXBs^?6M0a(V,WrSVpoI"2I>]UnQ`+)Ub9t&IrN"\6+MC:nsnCZt!A;6eXUS&L-TdQP,G3P=pp,/'EWo($SY9)&D1WE4$JGTQ!mIl,[i:([:F.Po/a&EA\Wu5]P0hiF[(H)X36$%3+Q>ENL2Eh/Q./kll+p*8rGhKcTDVE[;dkHZHqDiM(?u+5t:]q&ekiEg\'7(3;JZkrs1A+mET[Gp;L5Eu?4e[WAu(l/$Ja,e4@$eW]'3JVu)$>t(s8,ki?bX@_hW\>YVHbAcu!\`_oi;0$Tn[A;k)MJGu/]b]4sP$9]E@3p)7a(Fj5Nj5[Kp;5tiO,m86jC=LQ<4,=::;;`(np?Y/pns@6IBgNH$`=i)$.`>-n'NhWYl)Hc^KS29L!uiW$,3cmdp^('aBqX#X47>[3-LKZ,2CJ%hh:)e-Lp1EGV>S98ga=)rC5.l$-Q[L?ESYQ_D1T#"O?8NDo2&]'E;h?cke;:,a7TR7&\^#SkN8cA.l2b3oR]fNXE)OpPk:\Vo?uj\I5fjedJ[6q'Wn'fEl^IM8#3RDen"3gnA?)\^r>jIffcFYOd)(R(2$]"S_e,FGk,<:u`G0p=%n0R8/=b]"iL`0t!Bj;&Dp5FI1kqc^`GEjd\gKsHWoK]PuV5*WN>8<3V36uYP=ELBMrPDBUM2YhYB6?6SaFu&@EW#(X@Ikc5Z8,!CRWfdYuURZeRaN9+s:F;iEC'LWV)qhMFWJVfYgNn.^*YJQA(F+ib7fWRXq>_ttiSe7LN@(>mqVpD@(F6(8,Y-2(,VMfRk%M,5)`T%C&!$!Q_o&uq81;),E(!f88;b=*KH4s!K\VNAJ(liBYWbU$O"$HUL5)LBV-JQs;dW)PmToGuan0ppP3_g%`f[Jh84N![:;XGD77&S_b7ur_ctAMhH+`Z`Xu7PJ3s4@Rk_#\=ogKZjkaI1mk_)t*;]QQb?!jHO#f':/nW/5<06u[sYNYg,"`Xj;j!\,6FnH@P_cbmah"_$Sa),LES@3a^NQ%+ea.?LBkEr4oL4_*4-20Sf!]'F7P/bu/6?:fYLJ0)0m>N8uI8*Uf8A:'TTc4XD@mVp#qk`pl,er2PQ2WuZp"OGUpH`oVE3R%tNb&h+8njHWk]12R$0sChhUD>>MrZHW;R`q!Epp=],ZA'4XFCS>S>Sps"lcF>'%R<0rc[VgT1ERGTcp*K"+at!qEf5(IhE>=WCa%*_\kE\X:LKT:`ps$;j1I#l]LWBlO1hh9qZt[RCT5MUs`8bY\P9+B9I?s>_YNCX1I3?Y]#>%]$Eu4!WCQeY1@hqSOqB0J^)_&jneg,@X4Jf:*&C;5Vm-p",q:c+LDr=J/!e(KY).>&o+e>!_K7Q8<116=oUlF]:`gM]%Y[9a+X,>`8Qk%g;OmA18=u4$0qtU_j)BemEm2'6_hFO@=9<@%[/TU2pru$OGmY-U.ABn8rqt+Jf@JW\rQeQ?02";c74t^`]Ko/_uVDDSCO?o]0hA,'L?X;3b+)dn]ain*G,d^5.IEMGKQV5.&LKEElN"+#d7]BA]_lK]LO=]bP$-pH\8<2$JoKkefC>6c?M2lNSMlhF"m7*<7W&'M]@JP8LSF`GIN\uonC>XL?GdQ"4G;B*B.uC^A+$1DO_Z-o60iM09(Q9V]N9oKYAXM(_Y+02^IF746&q?k_nh@@7qF_S05",7R:*Rghm8e6*`S":6=P?8QsiN&m+or?OTVV^%=b:"%,Ds476=i:OV$J^<1c.,5`IP2,\:,4a/c`cEn-hmbm)H9[,P8tJdiE&'fp#MQm=O>KSL$X5_[?V'n``?SQ.C6EVHQk'!C66@ICqE18U,i"4+OGqLdEfYp"lAG],>i1H)a')1mb.4ds%pM._+!eD"0=fH`f8s6Z!YIA6Ys(^=KtEBgRGFu&aJe8!,DR?2\?p[\obeT0^bs02j]^R[4S6UiZ#FEH8^K$EOGp2t@O&`\VS4gUXM=17:Quc85:1fV,hKP]MtKA6*VR#N7E<0UYj.S/Qs>ls*EVo#?]hEC<=/oV-[QG_-F<OJMR*+Yjsp-);QFST93qf^]XN+N]&FasrXCIb8-D)Q1$a'u&$2Z^eq9$CU#Dctl')ris&(J=cUH0fqNhg-u<=L1H6A:N;XQoYm3*ORsqHf,0_,/P2^2o/Mhu]Ppi*<>QrRf46lie3(\b^/*4)j6nC322m4]'oBgJHr;Bk[kBk_Ng2cq2.:nV=\+5I$(4#h/`Fl$kYgkXlUU.h2j;/'*\H?L6,u._9fAe\9BH_b"p:Ke(+GfW4X1L6JOLOSngjpD,Dh7j<(*0\()*s8)K)R50I`orn(8.t@Nrn(1q(Id-Ogld%fp")0@u#l~> endstream endobj 3548 0 obj << /Length 1013 /Filter /FlateDecode >> stream xڭV]o6}ϯ9m̐5 hb@WD$Qxۯ)hKn /$s=H:pGVW8r"wV'N nlY~=7{HZyx/OV 9B <GR?'WO,?~^?\CMA&b/ix†?B:<s-.b|9x#0ҁo-| ( 9X4Ry_y ixb?$2lHU*yZGuHyG吁&1sn  oKm5fo8Qu޵ $l6~ KhхY,;!~VV7.wi,Tо )TL^=k*$ ٰ,S;bUDɧ YQ՜)+(ZzPm<*6N l u%MF[QyH ?18FW)Һ:u8jβR0?=Р®r#rŞx{P@л^P\ ]a] \)PV/{M endstream endobj 3554 0 obj << /Length 1574 /Filter /FlateDecode >> stream xڕXr6}WpS.*3~ugrGMq=H$N(HwDBI"p={BЎQWobM$"kƞMbĞ5K{$kN$'t"ݖ^%eGڃ)4)J T4s/n57 FK&ngG-6E%^rF+pbS= |8nsI8Gcwb9I5gҷHq,pq{b=4g1qf%Ñ18q],6C/0tNsoԱXJCm(t쿇1O}/ ^Lf @rYA}16c vht}u\b1h[p{0\7"$AO"%y%y!J@yљf.W!`cE6Ub (AZm,! at5N$lYͨmON(bIZJ)PyFL͞ KCceL蜕02 0H08km_ɷ WiZ+q-&]X"]sFCy>"+2{?; n6~~wz83vzy7ᘄAZ,y ~ 蛉m ҂D{G,nP7[2Xn$w #NQ-kǻD**d364MBHaL^]z #J~лk6@ބ-Xυu~O\dp%KZj\[ J#xlS r"5TSͰ ~t#M5ڴ Nm#WVZN*>N}jqpzjb E;}Oi%}\-*B!Ry3R{8!] [|r*SmiJ] ⽳Hi\1Rg!EΤOוq:M(Y\}>đZ)lIoH'EoFe+43ZZHTFGJjgcQ]q e/C"871fb{ ShǮNH">N|( ՟E80T~ endstream endobj 3559 0 obj << /Length 526 /Filter /FlateDecode >> stream xuSMo0 WEbRy!ݖ; E[;M9Kb||HGF_D+7[V)KQy@#(-r =/!0a pTUWGidᒆ"I);O}Խ#s(;%ޤRܖf@?K*\ɮ]m`v}.Ĩ]*5)(}g.ta.~' ?Bg͐Eӫ{04җWqXK orC1)ɹjiz6Yn & s;z|hG=x> stream xڕnF=_!BMd$"Em !) JISF1{nC\`9sסn-~|}/(8[++4zm{F[^$I@g ۥ ߪ:`"/fF `rGkE٠Ry&Z94Cks78TXf vB7geoUK^u|ښ7lv]UU<#[|Ȭhn~,N0*3%ݭ!nvy4w*w{z'9sY\g<$xz~ 'oάǞM&g^Pɐ|ҰLSn$o:T{ e"-$72h'v))O\j/w{m8 pl L<$U]@3{2%p@ 8N9 LA9T\{IVT*0*END@[MӲû'R pXjԘ3p@y,s-8N$Wqـn7OX@h~`'%=|#p:u5M '9qigjiͺ-Έ$²???ܔ, WiC#ko/rT*>>F Qe/l6zA#¢(cxo2Fz9|W筣A|MFH?5@*mF lEJ.tDGz$w8"tQR*m?0Yځu]ǜr,~WZ!tUR>V]EO{q85z`Cx| ?ڳ= ")04<_EM Nx^5zqv|6$|ij'c׃krvobяXEDG! pA犏 5QPAmǂv5[ƧjLd9^j=@ULy-Zq8HS11' tXbFbnw/Y^7~jdsI^V?Cfmv *a}L}wWxB=K2OUK 56%JJgxBC8?;BؗwR ҋZ^QwO$v":> stream xڽYm Bu4&~)r@ƶYrw?_rHɒmC?y3CrCRvXo}ywk7 ]+pTheG[FB wu\)ig][]'eVFg4f/?XHΎf*t{,Wn;`UrYGfjQѮ/Kif_ Ninhw%lsƁk7UGyNڮq#]rNl# tw` Gl[JHf.۫p  D%dY48~$]”fBdUI0(YYԅ,NmZYO)'kiUg,n0Tqnxe\D֌Αi\p B[ a_VHtkpjݮ!%)!.+@EC<:V4lj9Nf\IPŋ/+!+@CU46͹m C磣ý^}hqC[$v[:VBp\{W᭣ 8NZ%14i VPLZ_sI+9ۑt.050B)=eEK5SVs RS)O'Su$P'`dhL Ԑ"ftQ NNJfm6T. {}ݵ'hԗK )X u ("lc=,T ?}SA!IcQϸc,[*|^K,$UXf} i%"c_Zsҟ"ϩ.u a$}8pO(yH O!9j9I1]KqH§;83s!d-Wu]Ɨ/e`"PѽKhoD4ĺ6͖ۆ #x~OaPgD0V}UcFkgUƼd\#d3ȼ&ĕU^^>cyL:[G@`1,c`&:NpkY,9 \V`")dyόB@HgK_ku~|21 m3Q _W,D``嘾@!שm}DÐKaLwq@9T͈c K -OwD4nqLPnL34 ʡM鮸Y >L1T)Ԝ)_kV0I"dB>:Ҁ L݅6t|tp1?R[~deL Rq,1mܴmnR(qp5&"`̠b$6Ղ iܡ4G&PG@{\p 8$L_ZPWxRyrq3aUmwc$9&fc>*l55rZӧCjRJϜ%'?J)(C=˧sή4r1{0 g T8p/-F =uv# QDOnN|wo7 endstream endobj 3577 0 obj << /Length 2158 /Filter /FlateDecode >> stream xڭXY~,La^G?؛x}HA%C2SW({E죺OjW/U WUWc+ۋV7tUZϛg{cֱvfou$,kp.=/}E]Bʞornjl7 1&qZ3f{]&ꆧ-I﫭ӝ ;UxUkŽXnԧ ;7^m]"xn \Pt=d:Ѽ-ju?dzb=.gÜs=rccCە?!Wי+RCY"5paZ,݃-DB:ޅ B6k۴(S7ž`Ek+6+{z4%^V5tٿ`Aj~zL-㉝sd">1EF?K"}IYn^x2F-|!=p#s-19zv j]6784ɟLN<ÊbǴ*+:HC ]" sb(r"7i˴Gno A.^r_z]m-l+xm^`LP R>F!:д1zFA<؀.}$,0;I\k^ŨvL1"цM ';hEH=5=-.` $csc`%8b OML$ }} !s3jU zܿ!%$'< oz t~JД1&405RH& Е-Q'fK?^ݠB}}z -!"^7?_PtX* OA#~&m8e66sQj6#irÇeklR1]!}=o!̏RzSq*֥cY0gP8QYAYyT\b/)Ⱐ>7n߭?gj1 3g}3Cs> uVC-#m _]Gm 84M#RV/so<Wv>Pa:jBC ŭf+8J"G*Aq\;x@L8C7軱3uj{ xN7<rjY|Wл}+wCէ!_k;wNAwlp> stream xXݏ bAq`Ʊ1AR+ЦK;c͌rϗ)zhЧHLR#`u\_߄~$JU*?m/x"LO>QxhЩϽ_ߛ5~u{} ⒿgjiZoU; V[P$rRQ &CS_%͏ 49ME,3iiڎvȎA_!Y"6aL]S)+A,}4U%`L߂ʼnX綪D@(5ޯ_o8ִ;hY3Pf]BI#s|B G6ll}e ^څ:@wZ;\^,qKIՍ#T,5`w<OЦ]ĥ }{i4 ' pMDt8Se.`\/@!u~;Ja$5dZL֧&ّI.0 f)tuB##ra{a> > ?SP98T#F r"(H83v&w?ԾiRml]ɢP,T1~ٺ($' 1RBs> /" \9OBp@)í=[G?TvɆ` YMUlh A^ҮgB\[mk:V'd,XԿwéFkBC )㘯)# ~bƐn rJ8`1i?}ަqb35gn(Eqegwsbp+o~T_"Q0S8%j^pz&+ם U T:R> 1tEs?9 QʦWڡn(Ļ5&󕼫L2(!vbe)kr+)H>ţlq<4W8 2 ɇr*{1&Q;VqЅ e6l>=,l[NЂS%|#,GodWuk\A<6:G%ZS{OӢ'6a3JCĦMoRBɡ*,K6e芲w<6?N%؉IֳKXb T('6\lRaSs u:M f$Hñ"BajMB;$Iz"JnEp1#N`,m U}L?X9jksQ)#+nw,GKi5 jmF )xK6޹1i\W1k(sXKH `V TbwH(c@PLh iϐgSJ%kɌ>vD 0kk*tW^bxǘ2?]BPJxO&]d*PuhZ;}9fe̍DB`VE>Ba9ӓ"xܺP !c|oJbҩ3FQxL+.Yk᪍( )"ϞK.iʀ#j ¡^GirGPi:>kXD~^!kb|YyQ ߳@=?[ش Z9mLRVw$Y7\Wg7<8 OIyA٪`;bgN2v#мĞ[rۢب>\^nXä+[M擪('נĆ%܃ƪ&h (xi(+H8 ]UDŽ౓DžhL) ):Pq bؕi<et{{q+m3 Q(_૤4;Cj+1`ޙVi(#$՟?zII$];Q3{if-|Բ*COȉY Ί(<]Zyv),SN u?ɡb :j)QWKiS|Kx0[nNᱛUxGmǡ|>` xt>co66%iXЮ/`i{>6*zC?H˞ &_x:%b/,!8R7oO\G. t6C.K+ߋ(EY.O=/ғO8[ѣ霁><̅*m&WV)w Kh:༏m'gޟ`Wvrs&75۳*Oka0G'uIV/t( endstream endobj 3589 0 obj << /Length 2710 /Filter /FlateDecode >> stream xڥkOn^)dٻ"73{Yקگ1|WW=r^Ň7ߜ]DXġ.Q(b_,[.G"gF&^%AX9Uٮ7vK>I @Y>| 7ܭ")bawY)w?]R $)89궝u^U I|SR] _M&tRެkne.NqЍ.wP&r@M4.׵8>}vF8-˪Ԕ4D[B4׫ba~Dеp _r י7w}7ϊTycW'y^ ke[#yf + iOF,>N%uʡBTXq<9[Лa_e~}ؿm6WmkA(.sѵ!:凑 ?P|Dw3cyi?)7+Ȉh@$5:뛲ZmT%uoZ'b?6ҏY:9ɜXYd謀>wO`1!1re4wŒc#F&r(#Z6-ף==GuBRߚ .#wC~C=:+˗RjL yM!!Ji2>[ٕd }aYFҤ_H \.\h)(`)|#:T$  jh9 6:OsNi61n>eRׇ"@]T+<@N4oRq(kW6j\%ZWsdr J`:yP#Vmܖp\ TCմP _HL)cP$ FTG7Q'ՠXTy2I+tXS#i+'T$_Ͽm&ωG(諿tkʤs."3Ns݀&EQ6ItƾX)2 utq"Gz,bl~ݡ+ %ҜUFIVz*q(r1ya@>|yu~ `g*# G?31 ]~MΘk ۧ %bp`Xq &*we&(፲o9GfSDuf:w"ix@yGQ˥zǨl1րdmo y jIہl+ euf Hl]ƐF4PQ7e H0ynZAзo`],4} 5}Qo ԛOG6B q`MGI#5x;8D|;jgw. h}Mn |O QCG`S D bbz_V.{wÂe|/#1m8+M7"e3 {IN8V7yP Tn,i;xN4?\fs^Mޕ#Ǭjŝ^Qn@Ud m_2?+˫ 8ܦ1 ?{TJJH4vr$RO]'mPЉ 7fVe\XǹjQ5^X4g헉*Z |}? /L\ϫw4ί3Kd1GMs|m//`-T+fH4o"ۚrm;34HWJ Lo8hW^ݚ[zP7/wjL(!6``m'ZmzC}:ܟ7͕}khC̲`0|+UZ}~΍\`En,G[_/r endstream endobj 3596 0 obj << /Length 2370 /Filter /FlateDecode >> stream xXYo6~XX ش(QC7g`ݴ.>&^$T,bX_ @-Ϯ>d^$L僗^D\{QmU5ҙnfMʔ6q0b|d0:CloEZ\~ @z(虆qMv@4V욭c8x:] 1xg&f/AT^Ǜ=ShaؼBR+rm劷v5jo߲2|Q!$4+1 7+RP6+Ftm£zb ѹ"ra(т:͆}nA}]z$6;{}=Nᚄ8W|/ָV ;aI| ߕÿɉaSxwݸC4c;'l֣6@<FŌЂXMWA(gbpʢe/\V%*K3)ZJ*УQ[qjI1d;d뇢z9*yzm'9kѹ#C #2w1M4 ~vwr)@\Qqi ۘ( GO Y;ɄqաqA@MtdHn$iU)=!x}]wBg,Z\P`3;Q?ANFQgIZfm}ʁԝikq=7s3 pJXG9ayT\aOWs$#W h$ɧبMfLn~{[B/Xƾp{7*@#JƐ,l~y|>M+<Cz>xkQQy/4 QOg?s9[Ϥz"D2K)OP0O  r(e$l2'^ r4#Ly-/.nY@^j3)]*]lB@rjpӮtBb*iyBv1vɅׄnjhEh!S]KcyU?J[漭 t:ɔފOvE 9(&dxL@ݒJF%/ֲlT ļebQBi030l wK pTV+(nPQ7U>tv}{xuo-UfuT߅c:_w2m0`L!&:t4Y)z3CR<O@\&*2ɛ?HMM#&JOY7 U;rSC,{-(zA% ֧ #cc:c??1]/cX!;I/'E뒀M90Isf@}q99#W}W}RQ ώǸ: zRg/A=sA+s; BS޽s-ҩE<)Y-=5ezUeawm)c{XKp"x{6Scݘ BF$xaPCx ٻO]3t I\9/qVoKUf"7\ ɷluY .|@-7g/O+N<^"Sk | NO endstream endobj 3601 0 obj << /Length 1487 /Filter /FlateDecode >> stream xWK6Wј=lfZtc( ZDG׻ %&=^,r8f8/ğ\?U6YdQNQ4I0,;oVt4Sĕ4Iv7[M>*K_LPjeQUqTm;)Mg O[izYg5n{YXAD |\趛~Xxdq8&},LROZUX@Zmgכdx(~f!0y[]#2beeo Nd#;lm{xdZC&cㆢp`+C}U g$ bjiMiZ_^|D!KН?nGv{?;lNtt~i>>uqqq~5wdWʥ u/let|²Z8eB3ØgUܺv$ <{[mk8kgu+G*;VCݝۮQj7Fs sȕȕl>!|R,zҡ=&xl9V1t sfqHD݌*y{N'D#27P+ k?Ӷt3AB71y4޿ж(bD9L0F[<5(AA8Ȱ F3<ȃѕOI. endstream endobj 3607 0 obj << /Length 2383 /Filter /FlateDecode >> stream xX[ۺ~ϯ06("1#ꮠ)ٓӢh])'U#KDe;ʒ)ڧԐ\/v q'/|< zHE*}b],{-{]|l**bGUi7?ܕhsZuqsY߬/`\~X^I)8C6M_ ;/mi4H83QlUg>_8*}}C[9^ܩ/=(r`YR2y-VX+`kwJqdU˃+RJne} eTiZVD3eG#UFœ d3cf՛-Չ$[,WpfG2* ;\eyvĪX3Zg"˒ jmNDSCxcxB(i-inGC 85UӠ鍅nf{ib +$;,ك;VH䱌Wjl~`+9  p8yh;bnݐQ[FԪj>Yx(w@ =jƶm_ aH@ΊA(r)i_<_GP c](y XSNnm qlvGmSwa4"+tΚShvpwζ7:*[]a9}Ue{=9*;N0:զokΕ(Ӟ{ѝ9Xq|0lj_ fBMt6Na3lvW 9ۣGy)yA 8rq*$2$EicIÜ{6MmʺgؖuN'^la_?p̋~pN(K1 U1*dՙ"‰~5y-)85;豬*V Cwmu~JV?~ "MI3T'B|Q#?k&}aE `1>0go1 joT$QEmky[r?K/FlG[ʺ3CPNq ͇T]sv]gDw- $+VQ@o2 Ͱl4g D *f6B#i+=8uڝ=JVNdvx%QLb6Qge+9 Bqclm%mNf(;9hU';`ШSh7zɂ \Q8 If I@4av~tkH4FH,wFi< hLYWַ`WQ՜pmd+P [E[]X"ND.AET-`[_Λ^',Tb(bO^n:ݽFC]0!`&!cpYj<mb:)n¿ JGc $훖G6hEw-!?J9{Gf/\ҊuzZ,I,Ĺ+ Z3y3F"᲋sHc@ |?z]J/=Ѓq p ۴ 8'FqkgߐNkzq(lR)=}UJ;P 2_EXZ ;2m!⼁U]b>ڕy77 tx!1Ȁ/ (ߣ A5Ai69*!yLl?/v%l \L1z2MA) 6g5LEǹל6Ṳ3 J8L3~JS,ٍz <ܫlyEǛJdݶt@f/U)Fh4 qO .X899%rf (:^"#Df, nH EOIWW~x0Zfb^AO3;p_.S_DQ0ߝ,CJ hE,cXS(wK?%2s ιh-®HG.i*(LeG\!Y?xCFqZ9\:[10.$ Ȳy8Yfߏpu endstream endobj 3613 0 obj << /Length 3128 /Filter /FlateDecode >> stream xێܶ}B,QHJ qMyHHcI}ύu<"y F77_͂<̭!lqj( /cn#7'W6)n@X_ 5@8nלI>,ؒ"55%ƛAb]]YqEn@7-iʕ{ !S#璕dt&LƝpq4HD@!;\ s{~U:}+ 6u<'d)r)w{=Z 'k+?NԐuʆb̐55&M2^XY"qe jr.z;a /nT=~_v=pRv0$tM D茉 _lN|,k4ܡ2 ޥ#HG;p<{e7w߾#yH:<ElL'Æ`8;ٻ /{^LXhՕBݱie'k޴,Ò;]&XځId&sBoE@?<쀄.z3ȓb`tmǒb'[S.]ǡ 훲 ܇w?\C2^q[0 ͪ5HEC'UG LJ𻪺@%ݠ*TP9< Ox%ӓS$ܞg_i=h1yxThPHtK "Y(rD6Tc8b-YD6*L%D2rA"!FO0b ^ @v25]8Cy!8MDM6~VҩiZ;]Gz .bF waA GZs^E خ<3Кhv}7i/R!(1)4FЇkU(C<\+rbrb)OR_+(3A "4KLQ*Lt:[֎Ijm.z< 20IHj0i+k)dƟhŜ-pQU&"7Xު@ԏg:̠ܝn~M{X vȂ'B= 5 *maԄi [yr-3D]VOwI(@FX|gc=10%A.l" x/FgCrznS3.yP\)qzF'3O;G]a=C >Am#~\sŘl,lRt18od2#>0+A:`Hθꢟ+ϸ{sTAE8eQ:(_ŎW5I?㓼C( gN>G Am # `pyApJH*;TZ*dKTr+?`(F%nf|LѢL_<"{1I% 3UxN_H^ԎP|2<,z6V6wal=ڋX EQun'j߂{5k,[(0dP#OK?Ovc0 )w6 "1+[>W@0?7(EѮ$l 3'D^ʕY˝b:M|*D4x\'g@m~;OQKaBL]mqal?[fv㨋^K9|/fqӻQM%n? v/ll|ĤEÓIpȒ+WuI^`l`\Iw貊7Tfp5kVC@Io}QVPC2p)˜>9n7b}FOFnMPeO\sv-9R^e2v)a+)#5.wɅ!'K &Y\{xw7ĝ? endstream endobj 3624 0 obj << /Length 2368 /Filter /FlateDecode >> stream xX[o~_1pPDd8EpxAtCY*?5u2')$|Ox$EAAXN&NH?XT.n}oI I]+t+ v^mOشxh6yJY{FXB){]qVzڗ"LȿNu3_$YniXXЈD+0? bokJ*DsN(4b+eȻޕ=SUr9@h3s\/{XniE-+UaF!ΠG ?m5R(nW M9g+dz_B(ƴNnE<5K=vԭN 3&qcYM66( pV DXc;&+eP;}p2p̭K+Z1 礣9QSt-]B4_auz}_b:=.)ð `B15KlortUe0H|xvy:N )<2#>0 SS 5D -{*YViú #xa7eO_Dq0WZP/Tfěh,Bݡ?A;5$v;k&uV1O # )% dűʏbi>LūkC"i>0.9ʺƉ-ݚ9 t$Eddf0`'`˒Bi?QP PΡYBdTn2 Dm7kXt苙M`x"aڜDv2//h .[=HC)MO^$x .80dG.݂,~r = i]yKW_"aׅ'6}D;ɧk6mǯ*$ib rI Ga݂$9]ῨTLq~(sv a:a:˺;pbϮpRD/4in;!b?74'z3 i}j6o m*1)0Y󷝂Rjƍв{.ԥuRJuwV 6̱.<{:jm_䝞8/D֡E: FKyYC endstream endobj 3631 0 obj << /Length 2003 /Filter /FlateDecode >> stream xXo6XYzi=lć!X06m"Y- V{;.Ljd|Zu3 𘬍29)#:o7K+m MKbi(uc:jk(XICr /+Y e%v\R904$lNyfB@c.pA^\MEQ7k0؈ |cYs\g*i)I u]^ $ǯÿ́j͔q 4,0Lޏ4qqxum,E3$\ivD/`l;>'DÞv[c-7;b؅;JD~!Z8ƲDw]/a m1[uW#yWYBm[B=~Fl[x? .fŋ{p,D nbCuP )hL|㞿#-={~0/Y9Qݲ+̒ z @݆0|}P)SN~+$2EjLݚISfLO[!fb?6׿]sP˪6ISÐK㈵ 0tE{]J&mMc2W,[o-( }A2(tJ"RXXe"MS^hOX endstream endobj 3528 0 obj << /Type /ObjStm /N 100 /First 985 /Length 2406 /Filter /FlateDecode >> stream xZmOIίo:=B+rEۻ(Z fs13={m 6Jq~{FkeZ(_M"0g RLxatd"Sb"hB%5bТV{XA%06y0mS YJyGRij uxHu`B#VPc*a0Sj 1ְOT#S,@eP1XjH<mdXjawuXPZ^)C: 9H<‹F) S#0U)+TG<aliofM;<3}~ЕzGirJ?z٨[Y#AH'I(8iQ`F%QxʑB}) \r&Yq XV@SXnam[]-^Ӵq|rce-SCqP'dHn_|0 AT!o/{H߷ǭc?gQ%uvCfJ5%jDlsn{YC7[8zvtzmsOx2B4ii@-c* oJ ˮIo{_GoAܺ{Q-ѰbS sƍ0U!AJJ'Cbp8j܍M Q?Cw.N d"C#ZɸH v O7v<2뉻p w>g=|T2j-m4B#DujVto˜$>D?r& BS A~1%u#z`k&2nznn[u,0W0Y4VTZ+hg݌Hf$>kH)I'$#J$e7m#R&{}p@nFrQ8ƣRVt9R|m\_Q%37d$"΄*}3jk]]aGp />i".fyLr Hvhf-%Jǯ0S+GaI% %2:}~Q/y KeՊDJn?w:8_WN(dw"&h}c$w~b{ۜ]zݢXxX}~!O؈YkʹIϐ5ćY@Y|[|4/{h'lݺH;CFkx Dcvşbh;pU0f`fZ+pZm(Ix| б:Gi;e][yTzA}Rët2yw14JQ$zI!`t#nKK^!.]l} cm^ONf MW}` g22(xjm %O!I8f6nOL=B} xߵt]&B4}?4Za: endstream endobj 3638 0 obj << /Length 2733 /Filter /FlateDecode >> stream xڭo(OU.qmS*\Er`܀M{ofgmL}UJwwvvwv<ȝ_b|]rU(R0NtױԎȒYhyUlIw(,iJJᆭ}Zn҅,XndއWK}s 5O\֬juYVe{ܦehEY{$p" Bݬ-PezegF'KU9ۜhsũr?eC#pKwfWڪ6)77< J)zwǒf\de*v 7A86`iV|_NYxG0($`M^FfF`)ՖUf-bn=!ԅ5WB\H\St낦I4@jEɮL FTyB;b0{Zpm-1jQo)a-kT8eU--GՄOp|W S^)/ 3MhZdN=Ȥ +76`3x Shn)P w'93UtDtJV$ڗn=sZdL7a6WDԈSQφ>FiK7\N @\e\Pm q GD=)%Db,[1A8dIAFd 5;PKB @7b'z6YA4}&.]q~y~Cjt'=aX_ ܡT80q{t͡m[,O,(]O.)+1є;J'~M3MI6t~j]u3ޗ]}SRe] wְ HZ|ᨻ m'XL1TINJc-ˆ]?~z&kq2Ѧ~1U|E]WXm$7Rd>xjҼъR\:N5U2'i>d T 8MمHr =zg6=r (o޼bh&P8_!PU^i[됄r>x\%pw.Q#-Myvi-@cʫS 7M&Q24d솕Ϊ" |gÈ]P-PĆi>.W]͔t9TB1Z=%YonAx4޳H[,lii^('O} oTj!𺆢D M%#@Zի(T]n? v,;qRZP+"bc\\Ă*q3<*wkDz 1 }x}*t%I׮-('B iH/FgYw>?z oyKϻ9j}39Z̟`OMQM p=7CqCZ/8bwgq䎢x6@Xc缯d:INAXNE\wb1EZu4.`9 n941pX;sg0? !Ä 5S!޵x;Y?rCh4?$o? 3grcqw>}?g;@t!\l7"1/7/3U(X3vEW fM ΤR-֥jShxI#&J3AP?q5]ˊdj]jsWA'[v̡OqYGiQPi}ɰ.c0ɖ7* X M= +V]Xpy[DUIZS(%$e(%)gF_ :|3nvR ]TBۯf봢su{Iɻ56u"7+bӭ؋C ſp 25WTN*2biV^Qw79 ^Q契fMZ w۰/:d\'j^X@nXӒ]uq:]i{q|oo+jcE v~5Ǯ`[=.%z0u@]%U6ͮ۳/`_t3V.ǐ햬(~ҏ,bVhWOF<@bN(Ŝ;ҭfh<אETIۃstNӭupB&t懹h/Ln"E&}hr4Yڗ"C<5`:(~]> stream xڝWmoF~ŠɾԫDm"%bɱs\Y^6R켬0r? ##7TQHGxAFqol)2Z=?AC7{W/amiAhE7P%mv:m[<|?%(1q[IKFRC<{,aD7DԦoYboVzk> ͡}dTkׇe[[237ޮ_l;ge=g0 Cf6`=cvxo<][ܪem"HK@  ]p~IfYwcX=O-w?D<8U$xI+"Aqy|x-^^'h\t5i'B\{zS͈k;AJZ7zc+)JGped"$]q7K}R7y1uFkј ~ҋ@=@.j]>FEs` q 1 +C"ALznbabbE, 0YQJnw!wE%dt$yJ|?IOgQ408,Jg]No7[xaxꇀXq5u(D0eM4$dF4 ]id9!.6! fu8t$!t>-)M=C=ap:Y!J*m9̡8xg6V"ArX14TE3)|/QCЂNH!UUMMĮ{N];N2?=$$Xp릎De>S8 RH8qf;ڱ=&@))Ck.J0u8$8 wC E} J<`AA6 ha9"t=+ sg`V&Ô"-9llj5Cɼ!!X҄QqW}O;]7q@{5A]%Ehܲ5?(WZ;c%o4Ofm¡qx~f\j>H3Pt$nulcEK endstream endobj 3653 0 obj << /Length 2673 /Filter /FlateDecode >> stream xk۸ 7@V'ipr&HӋmsm6Rv+S?j8gy갊Vo"zUeW()VCׁoZ2\(h3FѪ="[(ViX\7A7Р=8ZWSKqqiqQsf3y'Bʁ&lkBc;SOtɂi- iV׮Ҵ8McyYqnZcM)ޮEv^Gn g';VdMxaݲW ~ƥq5J.YK4Am"J,8aETD:`hppo?Iт;JB"IŻSYdRFO$Ͻwd2p  gT<b;)aCyl\eN0:RY_gtEWvjh08/pߺȤ2CcˑxulkR gN%@b`TlpO2W l]j(L|X$<]Z|mC#&t $ `GcKEsExDXvKe/X^wQc( @,bE^cLD-$z\{e/QeCw\-7>2%#Du4'=}Uc[0[b^ɡӱl>Q h`T 8egD, nغɐJr/ P ӑ9gxgM,I= tYvK5` }Bp̂AW2xS{p+g4;d(靗oHַխR*x~qZ1 |6WC&Ȯn,ST*ͳHV͇j3 J@} ʞd Pz7n=: 9ed,P г2Rz\pA}cԕgU~KC{ Qyx8^Q`Rl01؉>eB0o(TPr@@W ]2sqi,ktˤQ|GFCy+0.|ȓQt* iRuͦ}5/RP`>|?3f7Uŋt?!gPT3ar8gv e,8D{+/pʓw?cIi<*\ŕˈذسNTFK@;`"lok|J{v|HY8F!̣^?aQ偙TBͭmMF6<(<}e=}#v=˦Xٝ j'_㗎pR/ڔ4gO.8!'gFT =CY%u!n w BeV" = _׆=!iL~ D@ 2ݥKL2帱MH$\E&y9{\zZ"or8ј6"σv?v"Ⱥ,%4'yqb\d-GI6k ȩf}߮RE&<ȋoVb%R #TOP30C:$_s/vc endstream endobj 3662 0 obj << /Length 1477 /Filter /FlateDecode >> stream xڝWo6BTbVOK*i釽}ڢ%&Jq~w#9 x/H d ?B/ są+3J8:f$2G{N5/Gˉwgs*Zyw/,R%r`U'ZoV-q$|X&I]oinxlE;]ѼSjJoTwX|, 0EF2b2*D7A$8K<s0ywA8qAT 1d#+UEklQvqI Qו"ޓK(;Qbb\" Įv̑ivzK+FoHBwѺRe .a0Jcp!1HBqu4e٫VK3il7%B}ިKE8_5^o!Ŭ:hղNaG$k|V|D5/ߪRQ9G`t;F Z#;,mxqīhoemT gAW[Kdvԁ┐w1֪cvhIUSNՄ ׋0 w+}((vElm:)XyA ħ/W &Nb9PƵ|%"G' B@(b#^ZBWV ,MYxK`I6Z6O!RL/a`rcfΆA$8MV|T<i1Q^"l.Y Yz o4MEX̅d Z&k-;N\D*8sGbS~]w89+K#O@+ e_|=$qKþU>{O7)Z 8un՛em{v>ip@$.R3qS8s}% 5:π&HyS33qY䱕lz?I qG\p".,7$2Ý7ӲZr=4IsgF@'oGWz!'P~=[rU}Xx+wH$΄WX_~o c0z@>Kv B!:eqx܅&;F4I|A@"{;a$Yah~\KLsZ&x25 ;)b;> stream x TT/.! nIF ~j*`RVb .WQ\*2" P Z_L-"W@Ex H3xܙsޯܙ)*Ʀnݺ .4yѣG[YY=>}z:uJ:Wv &&Yk׮s)%ڵk$ȠA;H]\\b;%K:755ʕ+ jӦMfʹSNuwwy2m۶6m~ܺu惥 wa?\Eښ>;77׷t?jg 80$$dӦM~~~UT9v올ܲe˿o;;;ikٳZ~嗁=ѿ.7rHWWW77Ç/[LKKܹLfV*0avVrr< VO&M>2&rߣYe̔Myzzu[l)sXXbرrsrseX{9G2M6ݽ{7x ho t]j'/S']Vv_RrpԨQK,䒄ũªW.J*I~IHß8q7|rPKR@b411uׯ_7#FHܻwlZd&wZj}jwVue> gyFNGGGIϤ$?Ռ3ԹڲA޸qCv^. ג۷? ѻ+O ϟm$,Xi)ܹs$y.g{k'-Z$zܹhh|Kjkyi|PzNԬYsСۑ[?z:yq9)adrs2҇]I9(agpki'9ݴdzݺuɚ\]*KZJvS' e:׮]+S^-K&Ưٳg˄0M .7''GfL5jԐo%{{9(-֥K57n.IҽN8!ꫯLL r 6䠺9 _%.ڼys jA,rss%nM8ȹAAA2W.,-Sݲę춶ͱcjiY믿.P,e^)ܵkk&@6H#M>""BBAtw}W_|GYYYӧldr-hkdUjgYګ9hpPmdTRM. (!+7+#+rӴi^l׮fׯo|_ 5kw Mˤ[v[ 7dy&ǥ:tH:ɓ'eLLQ4`HHHeAusej=~=ݛ2e7 .%eU|PbHK,n^z ){3g>A%;;{ݺucƌ /ܲeK|}ݻ˫SNl(~9ގOeΕgϞI&I=ŰadW/__ 0@|Pķٳ>ᑛ[T|M~d}JJʆ d;?CQxф/:o666/~ ]v֭w{; ܺukbmڴIII_w֬Y>>>͚5~ pos,rO=:u <86sNʉ'۷^m۶-X@?lРAڵ?G'yvw#}ӧ%۶mgϞ]vɭO)S_Y:tCx@ŝܻw=ؙ~W?~Q.6k ϟ/'P;\paQcH&=ZO>srN}ۉxv뫯ҥC͚5B(M&.GG^zmٲE% A=qSIIIO<񄭭$ƍK;~J||ܖ 7nȹ&U0nRߥ#:)Ř1cd0_~wd$4;;[N.^X՗رC?r[G 9?:;;KH+ςTV#,ZHb%<<\Nj/͞=Zf:ɓ&MȓX\\\rٲeE7ioo+|tXzuI9^jU=zu'ѻwڵk4rӒg8qYf2S~bԨQK,}9r\W]C-I]V~ik.\5tK.򫯾*P?_6 Ϛ5K֜:u-CJf.ҥe2bBUZVY&7u9KSƏ'HB֫WF_Rrss%ƍgr M63ux%$$D=/S^P~{}voVfjk7!?$7QoWyJ1B큁8Zx,Ip֭\TR~n(6o|4+WHruE&Waљ3g$NɬS枥bebIdWZ5 2uqܹy;u$[*]2D9992Y܄Gw_7 yQd`ƿ;/9ߔ>qdJOV\C?cYQPP$ݺukذGGGM"ZR_^v[dBB9|I[2d~exx7nܨ^v$OFFF۶mDEEceAaaap)uwrPK={GYf2үʲ1$u,Zm_}|p׮]rڵ~M˖-%kΝ;'傂yըQG,OG&V&,%$_uv KKeWʘʒ%K?/ӧV*S'ʵkʭ'WΒ TϞ=Gӫ_R(i7m4_|qÆ lu֦M֭+_`I[֭Z*Udkv;vL"(٦̭gdoipEܺ q;;;d??(1]!.͛7+֢E>L;kƍ 6 W Xƍ'8,ѣG̙(s)Sln B:ue˖NNNUVmذLֈ#zy9YyMY_ȑ#K^)*SNݸq~_|оMffffdd̜9˗/?S&Me!nذA}}};wU wY>~:رcrի ρFJOOKKKSϜ9#'8w PHG˂(&M^ʕ+xhŸ0°0,l۶'L~%??Ĉ"## (  °(aR-h@˥(Z.Er) KQ\R-h@˥(Z.EZ.( rAQ \P傢-h(ʳ -9Xt!\- A˥(Ar) r\- A˥(A0\9HE@rAQ\P -9HE@rAQ\P -9HE@rAQ\P -9HE@rAQ\P -9HE@rAQ\P -9HE@rV^^^XX[oŜ^JQ͝={vzz,rHHZ(ArrkС*׭[GQ~zڵ/_rʕ9H¾}6o|xƍ322+ ЩS'xS 9h~Ξ=keeeggx eիW=== rE@rAQ\P -0}R 9H˥(ArKQ - AZ.E@\$i9Hr) rR 9H˥(AKQR h9Z.E@KQR h9 i(AZ.( r 傢 i(AZ.( r 傢 i(AZ.( r 傢 i(AZ.( r 傢 ifO>kGQ䠅ptt4XBQ[W6&&FbEEEխ[ ARrBCC{w^$-رc) rp/^E A {5kZTT A Qnݷ~;'' A DQ޽{jj*E@iԨQ=PDDDm3f̠(ArB ,vZ(Ar9H5{b/ V:srrz*E@>?e˖PmdbLL E@f7o.2ӧOeyݺu9Hk׮կ_/堇ʕ+) r.]doo_}AAA~~~K.(9H˪Ulmm'=nŊ9HZ:u|ɽ{$-PJYf/裏6mJQ䠅HNNvqq ߿6mdy߾}9H<.]ZrettUd͛7) r4{QQQ 2X+̜9 AרQ'O?r$AQr傢 9HEArKQ$i9Hr) rR 9H˥(ArKQ - AZ.E@\$i9Hr) rR h9Z.E@KQR h9Z.E@(AZ.( r 傢 i(AZ.( r 傢 i(AZ.( r 傢)wA2\\P9׃%i ArKQr$i ArKQr$i ArKQr$i ArKQr$AQr$AQr傢f;BAZ.(  w]rK AZ.9$i 9Hr) @ - 9Hr+Z[[;vq 9h9f̘AQr$-6( @栻[ Ν[XXHQr$-DZcDzd Ar2͟?I&E|[bb"{ݿeV͒<xrf.Y\\\nn,>|g̙ ArrjN:3f8$AP$i(9HrAQr咃ArK AZ.9GA\r ArK 9HrA$AZ.9 9H%r$i @ -Ar咃9H\r ArKQr$i ArKQr$i ArKQr$i^wGAZro#ީ;Au Ar9H$A Ar9H$A Ar9H$A Ar9H$A Ar9H$AYo+U+ģ,>9.\(rL QF˖-SK,sͭA򄭰wɩTo!X];wȑ#r,uxY(i AWWW^r fȐ!T_-b9D&"&N(?CuhhԩSyq?{젠 ^hݺuQ:upI-aXnBB0Z f*URGjJc?"b%??kرׯ_?ѣGרQ֭[} gUiԨq-cbbȞyyyjd͛oYF 77'jWW_ʍN۴iyfoԩS׮]% . +/]$ʲL48__%J={A۷oW9(lbkkOxْGjO$e~* ?cQI޸q;~⟽VŋUJ8 ƌӢE u &ȼ~{֭kr) եK Oߢy5ѣG9اOY)QTJ*2|~~~˗/6"{nPSHT\YfǎEouF:toi2vKA_ H4|,*~WnϞ={(٤ƍ_F-Ƶ^+V(*DǏV`5S+*^VtRYRJ"[r|lZji3J@9222/mUG֧GGGKiWyM.૯jmmmD;2T9h:UV)IˤRۈƍKArLS\Q#9)YHIIQ$$$_ir>}55P(T+[fFƿ6(VZզMdNgTJ\e2MeѶ Ϸ~&s5kI_A#hnBtz{{kׯ/_qFNxTaJNvTj/ 4i\, @{P_-K/گ_? $+gΜ)S'GGk/Λ7ONJٟ={jO=LӍ烕*UR˒ԭZ 7i䭷jРZ/]fM)SIP4\%66V/*wV;^TvU/*&Lvڶm[>?˛݊+GEojǓO># *7+CwN<)\-C% /oVDqqqիW7npA-H(n endstream endobj 3665 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 549 /Filter /FlateDecode >> stream x1 /b$w0ys endstream endobj 3671 0 obj << /Length 1350 /Filter /FlateDecode >> stream xڥWmo6_!KeREz -݇ k LJeѡۯ߽Pk@IϽ9' 6ArOQEUJVqȠ]_yFiìCt:|zOwM WePU:U (ⴄU h"R^."U;8%fW,"ܶ+tq!^\ ϯ !*R&$w")2 \@@i666]!~+x<@Xc2`x.D8aՋ ֏ڂG]ktx@ X=O)[X@:tx՛qNלxj/T%b Bή) 8ʰp#pWak6:3{Ǝ=+Zj>صCULv+ /S+=9z$,H޾kM'>D]競W wAd>'\qj ѱ]+-E j,(=~8ط67yE$TY@T`IPBŕRB+>Pz!1e9KzM R#F<*f XcfP5݌;xbq}%}Cb:u\[Gh DQgZ!o)g/ u n FD)O|Ӝl oÈpV߿}և>ۺ_ANI^^2OiOecW[mNp 4hdsX䫰M?ן✙/w0=pِ%MOR?tS$B%pchW"NO[GIhޚz2"Cj^blHSdeCFH25{Zӳa2:2F"}l<)6?DYܑ~THד][RldO&v<: 8߶bL "YҘ[Mظ_egUm7Υ[(< 'NGĥxz7㄂͛vp_lxtt3Ft{ycuM??Cz8 '3^obd^Y_y} |(~iSb7 OK.;˻˻IL𝐊)>J-'bj~C1z5b 9R|Bu  _R7?:oN&bv5om endstream endobj 3657 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3673 0 R /Length 14213 /Filter /FlateDecode >> stream x xg7!$-($ڗR{zzt|0 ۏ1rq׮](27Yn[bbG.9(&).35j|Ww޸qիWW\:""BVnذN:2l޼n~ǧhѢժUL2.{wӧOJJZ)K/$VZ۶m;7o^J{Wޱcx=QW怖zѢEŤ˯XsKΟ?_KJ$$$ĸ* 'YMv_*THK"FQF9rA ,IІ ,Y֭[s2ܳglr֭߆ZXKmll:v(Oi(mڴDΝ;oYM0VԲ%o߾-O^n %O7ptt'7oޔS2e*wٖ˗-kVZ%L'r/"72\\[\2K'kwN>12HLLh?3%yh\+sUˍ%e8Vye>ظq<e>hO?E)<{믿[ʄ+P攜?_{իgO)`R>9;4\v?wrr:t(dٳ~Ç޵gϞҥK⋲}!dccpB˚;Y+nnn}y4|?({.33pzhܼׯ,3\ 2yV@w;x̡ ȵ<+W$\j֬)OkΝY[߾}%]\\$eʖ]6x`dd=s0+OM6$-+rCILyw!4iR/Le6S @~f͚ظue׮]opڵcVRѱaÆ/6Lq )R^o&wyMgϞmժU2e]\\:v(k,Λ7I& }||>d1~X Q< *̚5+*Z䳟o " [omڴ),,,88m۶2'$$7|$`rfΜgϞm۶9irm۴i#[l)d[Yo('ǎ4h\xxU~iy7nzzz0oݽ{o!gƍp?Yd9}Իww9rr֭[{w9sHʿ9g}&o'&L`uС~KZlذAƲ[ٲe Z\p8CLhK4H8رCfOu}e>|w|||kk֬hy9hr0e.\vm1c\|r^{(pysATTTB,X -z Y8~,W^}ڵL"""rɯ.]GAJJ$Wg_ʐ7n 48p`BBB~6l2]+<>4yΝk۶mժUoݺ6*Th߾x?E^d~믿޶m[͝|gJ\.\Xb:uDz\UHZ.߿_hѢEO>)WUݺu^P\tIkoUIoS2 QAnSDCI >GsС1;\rN ?ޏ`HH^S)3ˌo੧*SLLLq[li,w+~'r3GGGuy;wtj/5jcC{4#K=ǏS0K%)d)V 2<|u뼽e^kAͰar[~ÇRJlnYf=,͛ӧg-ZdtyRv^E->r7|cɋ\4_~E憗/_x񢝝L/OOO]$˔)S2xuvvμON9(m|k1fѼCYXvĄeտzrd:f(aV~4|߮[n^vڵ˼ի2%>>1112 ԩ_XXfΝ P\rE"oٲe#GE%WDGGg~pҤIٿ)H( e,8Ք)S|}}⒒^}UH/e{`aBY( 9X 6dɒNNNڵ?UJ4”Pr P@Y(ʒvUȐKd%VRm0䒃`R￯g%^~Y!ө\Y8Kݾ ݝ!ZVjŐKIe%^}U-^̐KIU!ssG.rA0'U2 Y3\rLj$5p C.9&յZ!V{2䒃`FHːK*Y!ڴI5jĐKIMc%uS1䒃`R>>jN\r(-M٩b%JOg%N5hK&Gwo\r0T}ٳrA\Ըq]U~!) 4%NUァZPGn!ÐK@>;yRo쳪S'ս0@Kյk ) ;wԔ)X1=e\q>:u!4Zii )LDUrAS͛cGU:!4Ĩ͛U͚zPIC\XZקTI-w1B!|:^{MU{C_ׇD;p@%'3䂦xݼ~A-ZMScǪwU}mƟe˪.]Ԃ11 0 …:*WV/;wQ#F Q_gcȥ)Er Q//3O>{:<0_qq;W{} xe\p7}jPW>Q0cƨO?U~~!4@kHEݺEIri SxQoRZ@mKS wǎS9;!CrASD}zTj0믔!0'f dȥ)AU> rݻwq+2224ٱCj -&Lz|f*A>94ڼYo? tuuuqqTԩSz~uw+""իp777%5U-hC3fԬY3)wR=t@1BV0K[z{{q=MS^(GWHHHbb,>|}ĉ)Kfjj@>==='Lvl'$%)[[C%AoW 4) 4Iծn 4ƪE͛T!0RS\~[MLri z)ue`ȥ)YU>(ri 3˔!0W_\K 4I)WWu4`ȥ)hj쳜k!0U⬤ 49飺u 4T!0;wTj*KSԩaCul`ȥ)L8̉T!0tբz}*KS…jUu`ȥ)L 4餦 TP`ȥ)c 4?6 4I%'Z̙T!0t۪Q#gȥ)CU\`ȥ)L5Tl,`ȥ)LjTL `ȥ)40]RE]D1rASsINViE1rASszU5k4QWP \\C!ح!40GUٲj8 rASHKSsæ-[F1rASsխQC;F1rASsY^( 㼺 )@vgJzuպ5mڠ>b3ϨruΝT!4x̤նmjlջjX=z9}~5Qk^ꫯoF7jw>ɓ%C.h vM}הz)UrrRu=GMOfv{}TDgeM3iipֿΝSN;2̜?ϔԓ;V-^N>'{70䂦)gjP͝*UJ=*RDo䓪ti+vo*OrAS .\N~5J [_u:uR۫_/QiRZN߯'׮1C.M;^}>]V-egĽ4I_5{Re"|ZB]WW" 4xLgAWa;0K|>mK$^}Uթ7ȤMu[@GGĖLfp|fҿlnϸLnճ6\<,iiógաCz%33uI5n~Zo<=xC,QzIs\C*S* ;~惏DY8|dePc{Ѹ8c{I&qȯn%JgџRTAŜݩS'g蟳g99svv0aB݁;%% fku]Mdr޽ ;@aw| (MIJR۶[ns (8MvMLv{͛n[ؘԫ#G;8M\\kNOYt&^L0 4%)I7m>Ĵ7W~.]rQNVz}C'VREvar}`ޔ;wTtkoV [oO8%$zP-LϚ є~R>>QUg͛6My!)`Em zΌCC.ҔWiSu S4%!A}IO07E.$Dnc{Nony`ȅ)rjXzZ{rDMO˃# 䠹j9@)C@*VL@)wMC?9hƦL4Q ؔHӔA5%%EթjJrZTU5RA4M}\77j&rM[^uϚԪڳ#f9hޭڷWvv^=5}W*䠉z&lʋ/5k&mJQ9hΦ+~j9hƦ…U|<rЌM9.@)'N]9kT@)W6m(&mʜ9GJIFT@)={)!4gSڴ_As6Go2 77 !4aSӕ> 4aS>(|X^:lذ-[ŋٔ'&CԹs砠[>N:ٔ={`>;v;wX}m~6e}2z9ϦNZf=2Sj͛7 lР )ٳg[lٳg7Nؼys\\ [nMy%jr0uڵAG6Uz=kמ>}z~6Ns'r0%''BRRҳ>k}vPPP~6]EF Lo>bĈN:$4+Vheee\޽]"-U@jѢŐ!C[ÇoܸqB&Lx\x9x8rHjնmfJ9jM9uJ)C]||,+eͪ6LIIٻwݻ3砫KJN~_MٻWժE+|ի'eeXXXyiӦS2`DDիWennnՔR[ ''ӷTGG7>sL`f3f̨YfyT a/wy˗ږ*9( ;$ɘ1jHZ__]veY)s=YƷnݺ|׆ $e!999$$$11Qnpaww'WSzK͜I+|-[VBٲF+V(sEJ~~~~&LdڵS+V QFY[[W\YLQrosϩlsEM2E|n:~&9J@>2,g>FS4e>mwC9O/~,+oܸ?MYNjE|8ڶmx,+.]ڦMi*Ar>;99͛7+?M;VA|h6oiu,oڴ)ߚj $3SN߿_~T):`:IRھ 9hҦxzcǨflJzUwjP!J4cS~M*Ey4iS”rФMYFǭSSfT{S MڔCUs\As5sgd rФMi@mBy4iS<<8 &mJZ*\X%$P ؔKA[C.9*U6@)7ƍ &m'7ޠ6@)cƨ# &mJ@;9hҦ4o֯6@)U &mx9hƦ\ R))A36IU,rФM U=Ga4iS>\2rФM2E @a4iSyGMFa4iSڷWA6GEa4iSJRJa4cSQVV*19hƦrq*@)zuIWU+I2{Ջ9hҦ ƍ*@)]E &mJÆ &mJ 矩 +ZYYܹӿKSU"*6*9>|xƍ *d\7n\Zccc'NKS$%% ȑ#ժU۶me>rJcyŊ4姟SOQE K)))>>>{ݽ{ i ""B.^~=|N@>MֳgOYe!**ʸٳgbtttNMYHuJ!|9s|s0|3tpj P0K{/_nkk[:]2es~PfgSK`>u6l 9( qqq&Mʥ)-[u%ݻw[HII߿kAҔj?P? MڔҥկR M;;u%rЌMIMeDI4cS\QOrФMYNnM14iS.U;S MڔٳU^A6eD5t(rФM>\G14iSQ3fP Mڔ]բEA6套A6ԷR MڔZԾ}A6bEOA6'ٳA6hQC14cSܑA36%>^.L%4iS~]/N%4iSSTA6%<\yyQ Mڔ-[rФM+TA6ekTA6el[TA6eTA6e05~<rֿ777W^y%::ZVvMym5s&rv kѢEΝe9 `„ 7Kg"&&YfG6AAA7m[f er7uTGGG++;AWWWJ*ɵٛҰ;`q9rDDիWennnٛR l@!!!21̲rƌ5%59W@J%Ck]`YnKΞ%K͛7W\(˧Nׯ114V>|}ĉٛR@>$6m*s@{{{ɻ#G&''z???gggY9a„{n'#m@)66A6D yRerмMɶ )4QS6 @)mP ۔.](mJޔA6e0y `oʬYA6ebyv-erмM{y?erмM @)QQA6%.29hަ$'S i !ri !ri !ri !ri !ri !ri !ri !ri 02`M\`M\`M\`M\`M\`M\`M\`ȅ߿+-+ܹ#g8p`jj*Mr@:}۷e!..E;wqժU+>>>66{ĉ4%/BCC)e,|L4klѲ,3ĕ+WWXAS"00"PBYԩS:v옞 ˑƵr4”Pr;w/\ e?{\47),XHHL \ ߐPcݺun~08887oޔKLLSNyyyO^4..^tҤI PH6m^#GLNN)))w0hР4j_on! N׮]ڵkbJ.mItRRRŊxXlܸѱL2K."۵k甡}i_-)RHƍ-+szyvẓLrY>x̚ Yoݺ\_>Ç΅ ecزe_:t,_~̙3Zd_Vnܸ!{ղaÆM6 0I&9Bx<\9uҥo߾2 sɓ'7jȄ8rHjնmf2X ƫJ* .4ϟ//ZƏo pezuV?ӣGJAn޼iww...fFJJ޽{wm /yIxڴi2컺v!::W5jL\"/3䯖9+Wuݿlx^}Yf@bΝf+={K1L!obbb|Nx`.sB$8&d惏Z;>>i̙3256|80ŲeˌGƿf~y9xत$IAիW//`>|b'!gImmmKgpuueʔ e#%>lqLj H~WS_eWKPPPNZ^!3[;^^^R+_|Ev\T5u6l Ú,$''2eT@>jÆ yw}W^6R!CȻTsZ:3^}wNr.׋]y8e~=J2~=w7FaÆ,Yɩ]vƎrZ-k׮X<|8dq/]tʕ'xbƍ萄4&z*㨌-[/dhׯoqz;C:u֬Y# M4?~e}%+,Yi|8F)SrrrZ# YĔJ*IYn/a:uTY}VZɚ ۷Y1Y#yWrF͞=;JMM;wnҥ9iӦbŊ-]ƍr1>>^kҤիW%$n߾-ϝ;g|͗SY~099Y~/^7|$lٲrQp&,,M6NNNnnnǏ'Ol۶Yիen?KWUVDr.\?k׮w^ = endstream endobj 3673 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 549 /Filter /FlateDecode >> stream x1 /b$w0ys endstream endobj 3678 0 obj << /Length 1622 /Filter /FlateDecode >> stream xڭ]o6=B(PTbU%K*]{h$"=wc%nч!y<}4EiUhF"JʺrY'Y*rl :WB6fw}VGoկzf>˷UT'&D7wQ]$iVF(65Wk)e <:ϋf30v 屽c_eU|w2_zh4vzǴH ;u1]k?;=剭u2KdYקּ,}k?; \nboy7vdc8h GʫkE!yO8sx n:g͊ :i@c uia 5>WYh+q0h'P -=^2:(y<7js5h' ;}ܱ s투O`l xiG4>f(%fg? ӫD>X^{֘O`ߖI(n}Vk,##S({f.́vyJ`DrlF`:pGvAE@\ 2Ciů;R3Z50Ӎr#D8}ɢ.%$b|^䱢FgQ-Sެ%>UjFu8Q‚h W5gز/PnԼeLa;1n &OhAm +4NT<}QDy,7h,byx 6hώh@ W+l{AXey==ޝEh!b-r¥;Ä#.@t((4 ]i!ؐ u q RIH[jHILi1 קL #L&%!60 GMQ `B=h @.`04o &0'\hx,Gn~Y"; b`*׍]x}-kj F:O6;'2ISyae]h_xUF${ *fIcd`F Lt>6Wy E\utʫ&i볺 D@qM$$2LZ= h@3d0bzDv Ty:j}z&3X^Y]C\6^K|o3](MRd&%FO7WW X endstream endobj 3667 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3680 0 R /Length 19091 /Filter /FlateDecode >> stream xgTTW>DUE1`xTDcCmb%cAb^S4K)&0bD, *F |Νp<~7QFhhhiHG~~~fE}nݻ' ffffbHnNNNӦM1СH .aov)pe$ah]d FI&"0{i<ᅬlܸaԻwo19EV{CV|js𫯾rppXvߏjs 狑\m۶iKjjspРA]vF o6v$d3H{1yf1cd6!{uV?rJʕ+C\r~Bb^CGĕ~ر *vB4wU'WlNm+\rEc?:7ү_?9ثW/LU .]*A-9$Kӊ)spر򿾾26l(i>Aȹ! %SQ9V 惲7`ĉxe2;!/ ;+WWDL ?CZaϟ?{ᅨ9 _]gϞEϝ;W\D"Fţ௖{-,_}Dd9XJׯ׈#df钃ɖ;v`>Pe0.g1bDWAdm!FoܧT^1ſ~/̆4իW/XqxwŔ֭[HsNTMHopʏ'68qB>ψ]d"و1ϪV7oL=>|{ٳL406\6իΝ;:EDĤO/:lذ֭[+9QݺuuAdlBN9b8ݰaWAҥKիÔ)SDAeÿ~77nhA<"?Gx{{,۴iӪU*U$Crm9k,c(|Q^~X˗IeJJ fo~DpCbddD믿./!´\޽q'|! &h_?#V.9x̙b|}^O?i9BA۷oÇ]00`_45k}>e+烈+bF}]vBD3&kqh"Uْ9mڴs{iz'OXZZ#"A 0(*>oc&Lc/Дj?ۼysy~ILj|q,c"Q  õmȑ 4j/%W\SDgxxx:u]+Vx7n-.߿_ v>yǻUPak6mpGl'_oW[hLڵk|A ƽ\d _ rĨ@މE;v'۳gOZLL &}EqSV-Z*R0WP! ~Pq^+WnҤIdT݆'k׮-3SYfaz` ;wPEqK;tٳgOAM[q2r֭[xQl-[/-VsE(z˖-Y<6.2(U&h~~~k׮]!m~mtʄ;!$vMԉ BرcaWE07Ν;+ "";ćX׬Y3fa\tvvV~.]D6 ŰV700P{2TrUZ5<̙3+Uzb.k۰a˗7bua-ʕWYիW{xx`;u$Y)d- x,e kEA~kܸ1:sRtě#F5qv;]aq5!AlGC@,p]tqpp=`i̘1?VX($lDDM?YB8Ln\""2LHH6mځ0;D;q .9(~,,,,jԨLT~Șdeeծ]{߾}ϽG{>AXrett.T9+_]_}UƍuG>u<Ѽ^EB:nb{uDDeД8WTfP˗-,,Ϫ9Ν333Sf2666:tuA'/(GGG{{{+}jϯz+Vtpp1b<ӟV1{lD aÆxoܸѱcG'GYܹ7PI&ʫcנAKKKGG J oȸ8Pno4|*U_-ZPIMљojժrJ,Zx<-0w 6=zt߾}={V!J-9D}ׯpH۷c&@''88cβlٲpќB``Ϟ=ڵk7mtڵHΝ;2C?ͧNgtRm۶cǎ޽UVOpssC~Sɋ݆aÆ-Yח]nA8p`׮]ؾ┾ߺu+~@qC9䫉"u~ ?T{y1_(#ԐK'hPX1ywߕXTjPTDcqQ_QQQ*iUre]_/:D/nQY+W t]M*!]5"*벲ԩ2SL ?vئM01) n4eE7@vԩ{>"O)s8^411Q/CͲȇA9a 1 Q9M{A9a 1ɤo21aq}Jydj9ժUcsLȭ3D$S.rdC  d: $пv"S.QF8D!ɓD(..nڴio3XF gΜɭF$*SN\r``-[Ξ=͛тR ݋<44ێ9Hϟ_h_`YD\| ;CQq?fΜ9|pg 4"7sر> `ƌey@91U^=::Z^`sLs[XD$c5hР^^}91D߿B ~~~mڴ },r"bq]Dh!"'" 8D ر#FDDȉ9Hcʕ3g\nVRe,r"b@+W"'" J*)/婴ȉ9HFlܸq7BW\(r1jE5ZnXF9Od~Gvs@nf6m2"4i77sȔ|ȑdbȉ[BB"9q b")_N!H?>|˗ofsL7|cffo᯷ͱcXD$W~~iϞ=..._~h\b1}D`WP˗,r"bsvv v[[[91ǫ4矞V/^d=1Ԝ={699Y122rÆ &X-bI1t_4mRyDMJJ{Xjհ綳ȉ9Hiw'O<ʻwƕnjӮ];8x.]<}466}YD$8pXrJ*U UXQfϞ-烈9L?..Λ7OK;wvvvbk׮q^'vEsfffiii"f`TM,r"b䠋KjjXFfAe :daaENDA2twwWN}&**0a9H%LA~&xZjrPM|Psg8$US3gl߾] sss322OަM̬Bv* ݲev91={r.)=*'XJ5ȉ9Hd0svv=zYD$Sckkk׮]+WI&WNIIasLD\\ܹskժemm=hРh91trP?xXlذΝ;,"d|9(%%%ȵoX,?p̙Νcsޘ1c 2cƌcyٴiؕRDZtѣcRPºuKBll, kbqsppPے)ދ<''ۈ9N./ݻ-XxqŊYD$vL۵kX@O"'" [.,, ߿"'" 8D)xԩS;wvڱȉ9H& زeիWo|Ծ6"'"w666,r"biz7dxbv*M7nٳٳg(ȉ9H&B)YD$b2ׯ_?~W Q .YD{UV "עw"T ܹ$~U{87y|)o˃ҥ yfq}M,r- D"tq…ubz{0`ȑ#---r޼y~~~"4նȉ9H>?? "E7Ȩ^5kΟ?off&M,r"b!Zmm~srrbbbw_v91?Ava .tiʔ):#tN}&**0a9H%*33sԨQH+KKˑ#GfeeB011Q|AΝ="| />>>##C=QF=R6|ǎ.\y&n߾-h+,r"Aeם;wwחG?A KDA2) "'" 腜?!END"XD!END"XD! ܑ#G-Zl,/ѳȉCŦM,--7onooߧOLngg"'" z/XڵkסCqA 1eLw(LOOgsLYYY={W#dj*eKvvv^XD$âEFGGȉ9H"'"dRRR&Of,\aÆM4Yx1d ֨Q ;f͚¥Kzxx,ZENDA2zqqqw533xh<}'dlmmU^dsRժUsrr0j(٘"'" ޽{_zUnѢdbsEND"Ȉ;vݻW^7ofsLXXnØBWfTs2D_+""B,?HDA2VVV~M*W.Xlb)k̙3gDcTT/d(_"''Of?smVV-,,ccc!L}݄4^PpppnnvyY >}:dd#""5jd}||{ۿ+33 ;vׯg͚&%%=z{ܹʚYD$=z*ں߯].߿_;y𡿿)SmD֭[kԨ!5ȉ9HӧǏGx #:铟+W^t SSS5ȉ9HF֭[M6;vl\\.66V߼y޽ENDAү={رC**11|>MCD R\J*\|~`C~e9vi/;82.;;ԩ2Yfk׮|iiiȵObڵk55jTBqaaaYeɓ3222r۳gϮ^m``"۷o+cPRs̼cq ۿkkΝ;4<`<9cDzCS~e94F!q bx RAzr=z4>cSIKOO[rs { %KC酣cߓrpp`Siھ};;8DPkݺݻUكv91O*UB#w^WWWȉ9H/tppqww_,W,r"bHMM=p֭[###"' !Xd>Svq}D,rҋC(??:{oٲ̞=@Abz!XdRRRM~ Trss̙c4EmZ=yBbRi033cA g͚~`9E̘19H&--m޼y Q277o޼[F;dիw!F/Z X~/'77$*.Ç_zJcvv.7OOOS M0((b`9^ijgK8q"vA"ڶm+D5kORRңGΝEnKnǎe׹s缼8 ۶m[nQv9`F!s<999M6=rÇE&''cʕ+ .]TM,rz(A+,ZhСX9x],Ɗ+ܼy4Յ`$*e7nܨ^zRR2_}>8LA 0a;Xa(s ƍrqqAb=<<[ljjq>HzwȑEEFF*.\&<{n qа0q}M,r"b~mڴҲy}vvv:Ç&rrr\ iogs^z 0k׮]x ڵk Abcc#1޽;0==9HBb)pss{葼ճgOe>ȩlYj;9H~ ٽzlSdvsH>pWFatt44ž9H"'7f'")%%ek֬ʕ+6lؤIŋ8|G<#sHaÆ5jԨAcǎY&pҥ-bq:t(9Hk\\)/ӧO{zzh߈ ʂڋ,r*>9HTTժU0j(و=gGGG9ÇD*z}UƟE,wKC;XDJOf'0XD!;vݻw^6o"'vuvsºurtt\z5_|N`+yyyEDD֫WENDA2trr 1XYY}6m\rzzhrpp`s_gΜ9#|}}YD$IYD$b)ܹsnn.Cqumݺuyyy l֬YEND"4lpĉ^^^۷oddd~t"'A2d .d'0Xdʖ/_NAƪgϞ;vʰȉ9H\r*Urqq |2dR첳N:!5kvZIYD$A|ٳgW^600ENDA2Oȉ9H&,r"bsdնo߾ENDA2zfff~ymEND"UPI&͛7wsdjw rss;v98dd3W\ZU,ENDAoO?f:```9sϚ5'))ѣGs"'" BBttСC333uТ۶m[nQv91@r~n8;;{zz.\0??fff=K.bjjv91IlmmUZ0Ĕ9Ȳ'O`ɓsݽ{7׹y&.&$$hjg]x$B߯_lYƍ_}>8(n"P  2`FIJp˖-s@M#(2| M[kNmß>}g"T MLLDžiog;CgggENIF=q =V޿"'"/K.3,r"ArƍZj9::qENDA2>>>3ȉ9H&>77ENDA2Mݻwtإ8D vuug̙"u .duq 7[}Q"bȉC/N6mȑXv.ȉ9H&bΝA;;;\<{lvXD$QNq:;;ȉ9H&^,ϗ-,r"CA%aÆ2:"'" { 2*$$bŊcsLlj'>: ?"'" 8DȉC:(ȉCXݰȉ9H"'"d|XD$enn޹s>''ENDA25VVVΕ*U?~"'*$z ۷oo߾=o7|"'" HJnݚ>}k&" ` gsα8DPYѥKW={5jɣђ{9::VZ5,,L^SS;TFEDDԨQ̙3XNMMql}ill͛ŕ5ȉ9Hɓ'?ʾ*q7ov9vsʨJ, :wlV}~}ZZEׯҫWXӽ{:;;cAS;_8?]vg ja\\iӦ>twiժѣG(s! ,Ĩmgs $޽+1\bh۰ax9\_z>8(n"P  tVTIm5jԐ9Y$0,,L烲;{D 闹yvڶmkkk+>tuu}mϟ뛘޷o֭[ڵkWy\-[ĕ5ȉ9HzM6S &Lxmpʕ+;88޽{_R{YD$bһ?sŊ+Wvd ~K.BZ 6lؠA,ݻENDA2zX@ܹS4obĉR3}t 8ggl,(u2ɔ;+VB8 8$2saɺ{g,,,`3f0dZo߾z={͛7YD?AFEND"H/]t…<Z/f1ɘL2E,yyyofs~D߾} Xh}asL'+W#\,r"b`*U,r"b333YB h{XD$wXG]|9D,r"AF,''GogECBBƎ{!91^| ֭ѣGݱ,r"bspp GǏY&d*WS,TTInoo"'" CN0  Z~hܴiSfXD$ܲe:ut̬z!LO>"'" }M4iذacǎݸq'OXD$b2nᙙ,r"bi233svv=zYDJTBlmmwյkr5id)))A"z!.]AesٮsC91ɘl2444##cժU6msd:lmm۷ԩ#9HDA2Θ ʋqqqu֝:u*sd Õ-񞞞fff,r"b;qāTBCC F젠sssȉ9HeBp…by֬Y>>>III=;wv91L;uݷm&nZF ,r2J+V`'0\|G={ɸɕ+WK.bjjv9/$O?wEƊ7ońMeK2D2dƍժU+gطDIyv{ rX`RI?"}]e˖Oep˖-s@M#"׮]|JX@*,BZ577qㆲQ( "'Ο?! ɓ۶mҘR($$DeENDEedd=zC9)%&&"tԬYVZQ,{zznzʕE'nA"*qqq?3*˖-kذƍC P3W\*={5jdoo~z= !5kORRңGΝ[:{{3]vq]tyill,"`ۋ|qqqX>uꔋ˷~U믿233رc~i^'N]sss[ 9s^ҥJ؉:s SSSoܸ .{&m&n݊Wqi>ٳ|Ǐ͛秥D 0`ȑ*=|ʔ)ZWlsyyy8p@>PKVW% _?D(99|CҥKXiii"fZKNFFF׬YU>=O>WlǜM9r">AL󞞞(~W iEׯիWBB!TG}ԳgO/yDr]T{llxM\C~Y:t;ZKy dnݺ;vl\\U:#СC sP`~ NFW!CÇ=ZlS۴i1UldddΝr5KsNW mѢ2zՋ'Nc[ly)>| JNN:t87''ț޽;!~mѸqFsssyJgggmll5k&\\9T*TqR^\9SW^ 4{J\^ݻjժaRRR+͘1aÆx.*OMwC8zh.]\\\Gos9r o`=/4@ =zp(.kPJjOG])??-ܰj111BPW˗/ܛڵ+{׭[9ڵ8c8pPTtݵk+q^< ע/_, QSiii+V㚗.]9Cv$!7C\\n;ydJÈ>}|*OMg ׯOOO/(6evQ0쓔B:/CHmtTZU&ysw`|A-(͛cGYmڴ#69K 61Du֭[c{ٲe2>,}aGɓ'UڱO;zho߾:u9jժmG͝QFQ ܻw/c VfΝrVܽ{wܸqcҥHULjt 3z:tH{4ROjX[[#ĉq2WljР5ktlW^x,dYZ>SM@Ed1ѓ?ViW9 &hr-|h6KQ#G1b֬[.2HnAdܹsC|///D&ЉbnAM vŋ64=S5vPjs;6xm 4EEтGqssC~'/ "ҤiӦG`Xt$Q 2`bR\99L4 <!|+B UT o߾$倀dR֞={n-t AcaY}'N`=1_((aWW׋/2Z12ϟ?eee%ޓu0Ĉ,sttCՓ)uIX41Bc݂D`l/p;v. f[ `xx8/zei2XHӧˇ.zZ%AwQ쉦v7\re{ gϞ-(S cⶃ>~8bNǶ(z`ڵX"b2R4WP}ҥst{=q5Oǎ#=&.jJ[䠷w{ԞOS;m>裢[Rd9.zkVCv̚Y(ڌ  AL|i9ĝ>|ȱHMN2%''Ixb[ӧ!`Ƥlrb_o &DDy͛71nN1a_Urw?H@sssq2bET~7PK:88`mcY2A 򴧸-,_}ׯ-bO0{-ŻgogqOƞŋ`v e*ݷo}_qXx9sO>͢b?~<Sqa[Yi4JS{~VNDUԨQCA$)r@&sp͚5*'C2S\a`ĉ-ZxQtĦ Z|><<NjӪU+6nxɒ%S 9P~'bxab藗1Dcw(@ k t}}~DDݻW4N0HU r4`ҷo_'''$ ^=|ea:ڵk'QDx*b.)E<닡I۷k"Tސ,(<ԥKׯ~T[X]V<2"ڱu-Z$fd ?!ʕBe~J5A"72d"4壨= ЩSPZJjOtTڋ'x^^^XJ*aS0<۔w}WZ5x'ח9W?-G_i~7E/{GxQlJy(8^.^_][Hq}P#=4ߓ)ї-Ǐ#H3gΈO]Vn]0|9$"8qFe(shMoT5|9<`9XNDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDd:ubD endstream endobj 3680 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 549 /Filter /FlateDecode >> stream x1 /b$w0ys endstream endobj 3688 0 obj << /Length 2177 /Filter /FlateDecode >> stream xڭYo_&8@B ЇiC.1hr%Bq wfg")Eo3YOɏ7fq.'K prD$phrMY6_7~gxO0R,XWǟշ[*mr]~AID5/07T*K%,2nܱ40 ~(@(B IoԹtkMVTIFBl=ʚ2\TKd 7c!kSGi|Ge&αꘪ]CKUzlX{ Jґ#-%XU`"6=&X?CiS{DLʰrzv@!i 챳@Y&}ϝbj&xoS7lP}"ͤӷ=BNjڀshh%xvsC]Ǐ#04`c~(<4KMã3!-e<9ҋaUL>< 9W*oÜz+9SP>\4x>׬GĥG"0xC2p x?AHψ GWW"~"iccXZ-:dzxCY$SU~zpZcY)^ uiWIe&^$E7Lق[2zZ?^ĭCݛJzEų.¸tAQ]=H_{ 8 L{?ΛVӋBľ?zaduj< ͤp*wt^,/sكF^5Ӟ4má2U& s~5{ƅA+/*SE7p~Er> stream x}V[O8~v5D&v4Aڕa`؇br& {@9\lY9s5V CJc2M' YܯO# ^\TzR٣(˪ƚ:eԉ\䘇uBkOB~_)2׼~@1LyRS5J{>sͿxe#8Yժ4/ͭCC!A^U-`dUH6-RfSQ[S՝QB8X%CG:}3B%ef9(tje Ak&{D]#7/HeMg@ #qAa% 6H FhZQB7݉reF)З|7/͐iTbl7(wUȗo ֛:jտdӼ?dF{ ){m8S ?^}:ϻBJUa|.Ee1}뺚y]Uqgˣ3w)3{]{WUn\}<μ uo4,çanjLaUٴ/ܞG3e*V7dk?w~@bd! 3(^hj<%|YͪMN$&Vyעa,$b -7vBmcr> stream xX}7^D5Xc4[ K1jLk{,*nL%Xt;c}i(,f9gϙy˗ڌ9R& U6t{p3fٳ;sεk~fׯ_|[ݻw%߼y3 ￿FS͡r,o`:@xx)SJ(tرѣGqSNhVLL _oBBBÇocoիWϟ?vܹ`kذsJJ ~stQR%oo(o0uƍSy ?@ ƅ:vhooիwI)4}ƵwL%l߾}5}y_5+ܵk￯j]]] fL#F+Ju֍LyyӦM|>Fqذaǟ={ƍ3RXb&Lϟϛ͝;W\4i_K, ȵދ/ߪU+Hܿ?WH J U4MR k׮:$mۖW9W39[O?QT- 蠌4`~|ݻw+ﺍ7sHnRRR*U8خ[n׷ĉnnnć]1T8N2ϫ|aol߾=xb-Z) a IM|Wy󬭭,Xp[r|r: ˑu$WXC ᏦNʛLuCM4۵kXO>+H2_~%ҥKY{-iW/_gtpƌƍcrB9sɓE<(2g|~-5kܲe [OcСЧOFޘ8V[ls׳47mw_2_8~}AN|l={V,4w}uܰH%[˨͛7d0]pԩ9x?FsՉ~+}ZjUI*T -3Y,7,4RnȊƆSQ)6A%k0S\aJm6Q4urr2g^\vdw899q+JLf^ oXvǏ#\t)㙳3gѣ,cƌWY@YFOorϟ?7 |Y]\\DxUlYӏz!iVNts=dժUOq$Lf9KY9l.:Aϐ734>N{l?ZvgCYs#X|nڵk\.58IJ! .>c1eMuiCe5jP15kk^:=g|`TT- @R4>av\ 9sds˭^6 _t>h׮]kժe)DJʹH%\"3 N-Zd-7:r0u2ep Ï?(aF46"""Kʕ+Y K?̂RbEQ˖,Y2{lGGGit:hj=V.#F0=>Og˗/KϜ9˧Oҥ 'ќ޸q L ȗY2A8^-]r`رr-Z0g$ wؑi>_KrGy|ӟԩe˖s"3sLwNr2}YVwާOJmr`jղMl|32_K8+didPl8qVeseAVUI%!CsΝӧ:fAp:QT|$  r^jVd իKmڴILjx̉XVҡCWTMNzsd|}}G|-3Xn83$$ˋO?׏?MLLWnj~ ?cE^~ǼDٿEVnjVR._fMkԨaD .0+ܹsʔ)~9J1.^Ak/cyQnJ(k4jcǎJRtDP|ʘ>QƓ%K4S#FpzgϞ &(իWJEySϪѣG)7fd׮]ۋS-[(|-Ǐ3f 4כ6mGqʻKB.A_`O>aKعIbӦMDDp~Uޗ<52mˇZZjÆ øNәdN:*io 'ai``x2bARA)*REÇ;::pyr.[h"N3FJ*WU<1iYɧ;9sxxx7lPY)6d8JXLG$>3Vn*UbpNɴ [޴G*{WY2=焄.]AP|Tِ %tu7#p}wO&|G ù FFF2d휝q"ɝȉJ (>WRdM4%Pd-[rKɏ}| .^sdo1xF<}RUDZcd2ɜVZU 9s&':D/{X4q_`mmݣGilN8#Gd/PNKʕ y{{qLQիW.jXre/_^|g Jl asن2ڵpB^|۷oK_ѣݻG5j0IFR1?CJ(1c ɓ'KŠ3fѢE߲eK@@@"Eā(&'p|2rJdmmmzӇueڴi<:Ţ 6AJ,Y^*U,XQFUr|㫘:u*㳦Xg͚5ʼn^ SH~SɋՆ]ZYYM2]Kgm߾}_qJ_&>>Ϗ|rv_)44-;yA v{&@Ac]VRrBnݺu`͋۝EBsNiLuOLZ/93=L(b>a^x" V+''?'ϘKݻ=zT<8x:XY4Q yI"˷t2tsǏVZVW1nܸt)((ԯ_?]#Ε֭k0lҘY`6Ϳ 9Q >@-MؗJ`aÆy{{3ꔳ*N1,6ȫzABƚ4?,,zZVrm[N=N}||K T?jv߀8 8*ZƯ PiР>~֖1$$ WWW)fL4gg7q<:(2TMty5jPT,;l4I-s~| h|[hcǎ*AKNy:!=kS} .:thذr+u0_ YCM'pgzߊűIYdŋq4G^?WQΝ;-|0lӦM;Yݣcmm~ ǍWX1tdV^-Mqά_\V:D/}-QPqǎٿJ?ᷨ"4͎?i$IڦOnuK:tbqժU+{^y|7VNPpgW{h>`,;;;cBVd3˷:+W8P7oޜOoŊb{ѱcǾf¹A=zp&o>>~"EzB9s*DٲeM: Ϗ7{ EpÆ :ut_re>2g|غu#p6{lȺ,&NULۓpaM~6LSO4v'pJs9k֬ Lٜ)8T:x!NX^J%g}]VMnnn:^zb'}tԩUbA6 J,R\\\$̘~ctt~{swJ_.G(|\5sٳ9W#0uq?cHHȁ,Y‰IUp޽{gݻ) Q<c:XpO~a|<_B.t&?C5a|< a|<@ȅS0s޽?1!!!:UV*u#rU(w @-tDR9E9+x\ X0O>u&%ׁH Ke֭DzjDc)Mʖ,Y!u ݻA0:w,"+DG5ˍBn2dHrdi2p9t̍ʕ?D0\x!xDEu:;w ;99.[ѣ.]K.. ?4ȁ_>#S?OMME9Ǐ#.0at̊rGH:@H ufB-)V#4!.<=GV]KÇwޝ={:fKTD܈TD__\j*رcaÆ^^bE6 4JX ЧOx-RSSnjV[ #x++VlϞ=}<<I`}eI?޽{W\uww˗{zzf_@ރ:YFZ]n]s_ .?~X&IO:ū111Y)4ڴiV;vr۶mꫬٴiz-ׯW^Ȭ #30J@\jŋ)RDj|pp}k0C8Ja:裏ҍ9!\l0rTNֱc Wn\~B]Çvcǎ;N90c ggÇӧgˠAj׮0)))((^o߾#Ӭ,gΜVϞ=%p @ +S:hA3NeS; RYV-)0g͒%K8rN\@. /^Gкx-] !)u 6lҥ0x "% D3j7"#ϟׯO>qt III 2@Oϟ,Rvtt'RɉYMF… e2_+V8 ܹm۶ZNyG|EƗ.{D￸0[_fIAAG) .նDND}C/I"F̍زe+ -cb)ǏSPڃ4.ѧJݱcp7`V߿_&!ZG;Jyf SrÝ;wd2k9&:8A.7?C޽D'r':CNܵ7N%-_V D>ŋ, ŋ"LpUZeu:QUD~@攇.\p̙.\ȳ_YrUr'pt,~]W^U*m DDi:@ .Yȣ "qiFco{O͛7HLLw'A*<}׈\h"\`aNRclZڭ~\z @$<<\./)<-FTRth'QYԩS'N8*ѣG(*(ɊXiݸ([N96ƉȞȺT)ͷ~kooߪU@^׆ |}}Fo%_~رc-*wpoWƨն/_@5~IL'"",Ja-rky^wԩSƍ?~uwwKgUNYhNWh1jfmq3PYfZmT(|l\oL`FX_kU39FsAquܸqٔSBBBjl\Z &cOǏmv) nȬYF.lr|ҤIe˖o޼ydde24ƍx!r8KqT*ZDlv`iRJTT{y͚51d6vR*o߾L/&yS:@- ~WȢܭ[Ç;v NӻwoΝ;6SNܫWv%K)D\\ӿWppp||< 6m~i\RWXT)8PP8qF LV(<*TR3-IMMNll܈F s'Q*ϝ;A}%!!!ƍ0~(t B8r%r:ûv1CQ8/beUFq*[Jdd$lRy왿cJ&s 6A}븺ck:xm IHH8xsD?&W^}'Nhذ?t7t:Lhzɵq8 ־۷oxN S!ײe Us=[@DGG/[lϟ#>}_~YjUll, p W:9}Ξ=vP2H-us+qmX!70a3'NQ~B1,mQ}N8P$AQqkٲ= /~ggݻZO+Wr eB8iXkZ6mɎF"RUJD=}"+;"*t0y&]ٲe2`^@,K)M_tE=.WN#:T"/ *tp V^պ-& j7~ ˗/TzDE :؎H"8ĦM>aŊ<<̙34E" "Ҏ9Dp '5jڅm4D20B.S<"##Z>;/ "I{iG rfD-D Hm.]`%\`?^лD!DU&'p"WPX !ػwIL =epuH4.=` QUd`g+A͍%Kh4իƖ-[NjVVVչsgZmٳgĠ >}$''g_`I2YQP&1݉sزt<)S̶mxuԩ_:{ =zt#F=z+V3fLp 0>}ڵk/g%JΝ;?rǏϟ??44tJ'QgTA9tl2'͚5c){5*c+eExzzf_3Ukk4t^3g HDGG/^Zx!J[ΕȍcA s>(Ȇ=vڶ :pssMZMHHW>fvvv'Nkȏ?d3SNjLLLVp (NW$m'yΝ"E :juεw9?8 D5T*W y5#㔻,{MVR烃_=ΖhR Yd.DL* 5lܸdv]TZGa /\ `b Ν;_8Z0 |{e˖I*GVkc4Jyz+%8L̬5_9INJa0^`A35TԻP*鄂kJttAϟ3f̨PBʕ'O^!!!ƥkC]رc/S )))7n&k׮ݷoԱܺuK"D:$klL4'M; :Jlm]Am%BYhQnkJ׮]9+_~[xq©SM4)ۻ`]F- OJJ ۷7r8~WjJ-} rVXR WE/\`7Vk+rZ T/_\:8phtT(X Z͛78;;GDDMY'眆{{{i)fΣGYWt7fO<ٱcŋVY>ܬY>hԯTVW,S޽ĉ!A%ӥ[t:XYjXDxɒaPV*U'xlg;( *>ox8H^hk;*,QN.W=ZtngΜEΝKWy5j)@F"d[:]I,J%Ld֩=EKn )Ç{xQ(Jwo%yF]5Oco˗0 7ݻwwD={֦MgBM$(B)=1WZբE͛/]NXqqqbg0%[[[3gAG_'44T\޹sg2e̙˗/O>}֬Yn݂5BnuV*LMMEA̙ui46Zm'KMBj%K899ʼn p B}H7hx!C8h޽*t_;#GUVS0OΝ;ӹ k,+_w@aD*`X x$p fœ'OJ-4<%&&p877OaD}l);wAP {·h9<)scRRR"Dji2G}v!ӯ_MmVTVp fKjjjp55hիsrpV=qXe2իWaX`!cǎ*T8pOvZjֺuƍ)XF"F'HD@ 'vvv۷odǏJ :׮]۵_~Q &*I4h kP'!r CBBKչR_'%%z8MrrС]]YD< U$&27fCCC;v;eӧ)\\}ʼnl~'?}ϛ7UNC >l,;wOӵiݻ%KduV8رF[\_>%7iS(T\Kh sȚ(>MiLA\8 Iω5 j)1JNN/^}raUVMe,={TF!l*Qն͛! # @DP8::p æM*h2e|w LJLL?6lȚXZ NR`椦nذ!(ĉ0F(@}oܸ1rbŊ @8ÇNNE >r} Cׅŋ:tpss;pt3СCr9.DE4 RŅ3g9s@0+/ FoU%r[v-Lrߊ$tvvҥK||>':N1cƧ~0 `֬Y9<ݻ~IIIAAA}fUCLLS1!!c$8a"8M;vX'Np9⯿'. o`?:]1rL \x㏛hŊ[r% bΌ;V 9`SAC Cgw H߼y3r $$$X[[)f˓'Oc[ZR󄫔{.I $ucq̵k`(Gjժ+ܰa)f˒%K &/լf1+zmT*A^Nl/gsr媘E@M69::qUnܸٙ-)>x@?ӵ7[ʗ|8wR X\x%Lt!Y>P:h&̝;Z׻^7o;oԨqZQP-Z _aV#:+:]#N6L"4MI^LRi- +tLپ}ҍbyNYh^_J|WJJJ8j[ܹs݃L' ;"i [DgSX @;EI!4hcvO<~[op%N& TյD.U-/_ˍDEǡGM6Jzw^C -ѣGSRSS]\JmH0t6qqqfknz)K!Qk2{lQIٲU"(DŽ.@bJh7J+Wɋ/ĩu)ZJ] h,ݜMϹ2Gw呐@$#|ȕD66n> "c$:,5Yܾ}W3jԨ6lKaqLz)3ر&ih=KoذE>3Q.UxnM4q .֭3cO::Z}_J?ᝠղe`ͮ] L$lxʔ)QY=-p$&&rrA 66C s|Lr2dVkWvcL h?2eTBfNWA-ݻϙ3'߿_&"*Cԏȗ!QB_~q,jή_pBK")~ cfQ"D} #B.ST0|A~'Dv2c`%k\NSN)]LZN# 4Qt  '#G)FQMTHJ:`y/_IADGNcQ(OB.Sq(Lth%-$P޽{'MfZ8qD84'u*DSZVAdɒ%zFe˖b .%oD. le2a%Tʔ)m۶B:uԯ_ŋAPYTl Ù`%5DD:77tR2'͚5c)ƒ1PjF8ҥ [ 3G8X-vn޼mǎ]e/ mTsO֭Mؼys ,Kt“ *UҞ)ZӧO.Y{Ѣ5Z_t ^A3!** Y KmH{ jeU1$$ds=tлtEEcݣp \]^ZY5Zb;߯G._WJ 4|^1cF *WpBl믿}EGY&mu|uBptty1❲o>IpPp?#\3QYt9%@4JyQXPP?bt_6A*11?hذ!kbj,XyS={'G|QCJLFdjo3hVHTOd {i17FYX1hNhlWpq)CɁL&cǎx9ÇA=GGZ}FcΝީS'N tвa LABna &&{MS:XHjnnnMS 'Ǐ?~/r=X`!.<<N)$&&V"R}D`p8qt0PHԜo)S/uرY)Ý;wZ'D?'PRMX`a`ԩǏϟ?#""xySN7O_tRqT)D Tω*jX`aʕ+%J|Mz9ȫ9߽m۶={h4 Ǎ/fpp-LM4XAo9Q b0€_```XX̃9ŋŊ?e2YllXqF;;BL)z:B&(`/"… aј;o߾zIIIc>ڵkR䅬UD !4:XHh֬٩S xѣbŊ=&a>88mZhxb +"[["M$8Ja:>}8;;Qi="7߰>|P,IpرQ9ɗoƌe˾/NIIIoݺZ-iHcr|^z>xSNM4څ.[,r8%/aի\C"DkݻYEm۶MzZtp L08OŴ`VpJ^L#:BeSN9:UjGMt09y!Cz.\U8HNNޱc+ G ZH:GTno^R*d3|{i<իѣGԩt.^hcSLJe{܉*ŋ0TiB!JJEZmsuX ^^^b^`kk+&t)8щQZT:*:"kD͈̓XRKt'Mkv FQ\u055U*S (6l]B2Yd *XR!!!R>ҵk/#jm|B aaaڵjժpJfѢE EIi:*Xx1,c&$$$p..^}PeƍzsZo߾[lS 4׮]S D6Ds};2L9tW_}U~}VC;R ME<Ο?rBݻwCBBN8nB.S!S<DpJ^{С[nϝ;wYO>)tЬ3s#55s@Z.wR([wJLLYY={UVVjsapJnHII#r& =Sadz}Yѣ0 @5d 8%̝;HCt:cM"yR^s(}F \A.7jh͚5IIIpJ࣏RJTb Xh>}9::S̜Ciu+Ve̓p։h'Q zݍ7`4 &^xrʺurz.\0'SrΞ={T*#Q+,m~ 3˖-wr䛼TJAt uPڵkC-Z(6g֭[%+܊]1RSS1INN޺u+Aqp LyժU}v!N*>|\ȓGk,y W/QWDe~'pe鶕 &0ȟrf ϟ駟f̘q8qmҊ4Q"FD>={}@K>SN† ju ʗ/ 7nSk7"!eIj4Qw"gǸ'y>obڵk˕+ z[a&:؅`c䄋/֬H*ZK`y޴&"'O3f=<鉬&NiР!nEC>}PT.KACu[~=rߘ?~f͚m߾], G>ի.Q[ʮ}*TzѢEAYlU= >>R5zaGE}+ܺuۻnݺ;vT*  P` Vx8@xiGRϟTJE4 M^9smLt0laBBXXVkRT(i!bccgϞݪUz5o|ȑW^E{ݻ'kū_>Pݻwxc.]n:]aF,yݻ۵ܽ{ yZ1..!2H+MQDj\/p"Om ŋɻ->'2 !R9Ν;?O#&&4KSl}&=qDJJ t0ܸqC*0@d۰᧸@y;\˗ HC4nT7l4"""|||K.1:{tF*# ?+_=\Rf#"-Q)/_3EZ|N5xp;* ~sC""Ka5.,xM@A 0#A0AQ!dD! Gv$!,NפNw#"9owu[_uUѷo߄s ݻ7uҴ 6lbDeW~;iӦ>}>3MP`hh/"hS !\6)DׄxEi#\:XV-}bqGGG{{{wE%?00v3f̸a:+ 93Wo3grL^^^jz9ի322FݵkW8xnݺoN _ltV !(9sjճEX&fee͙32?OJJR davv};w$B!A{"|E(_2:JgBuSVVFm޼y̘1cǎ̼ ܾ};NN$B!;NLĹxboo=ztؽ ǮYVNz7Mo>Z!X*7K 7G󲳳6lXO:3f}?ҍ82dBYOϠEޣBVBCCSبY>^Z\\}Z[9*yz6ܵkB4:?8䬁o"Yv{=!j B?L!P׮]嗇 6vش/RGh:&|!qW^h9 &2`Pښ;wܪAzzzII +!sjjj\\޽4Bu`2Gw^VJ6FuWĿȑBX,UVǻjjնRyJHunnoOBuj]͝>}zFfnZ*e˖-&ST -_H!ꠃׯoڴ)!!ǧUJb$!?I>S !:X}tPqP)׮][nٳwY&Sش#nnf4Bu \m+СC~~5"ӳQ۶]}} Y'7n<-B$UR̙#YNB jGˤ6mx{[ã-Zz!7MQQY\PXXs .ꫪZ)N>V+@OkQaCigϞ{I՘93EIu5ٵkWPPd}wTF8,D};iԐ! ;y4 G8|@@!QKX,:N:?[ɓfeeLB Qj4 GXlcէ-Ztd+cX\"srr"##VU?WsP_h #Bt08Uq/^lN5i҆BLpp0A۸qI&UUܰaW#!J5-Y%I䓃e{>.1q2PիjLdX\R_Bh쀶B<&D=OM!āΥBKǎ'N(GZobbb};^)fs tx7;,?թ^TTTjڵk o6q?b Πt/ 9YNOw}wN߳gφ  XԄ:hDN8S~}6R{n oi  KB"D:th#6b))shΙ;wϯ+ni/]Ԯ]\߿'ArرGHݭ[Z1fPO!LB_zVֹs<BTʚ5ktZ$6O0\G^zU+))Xo(eMpュXj~~1?Y,:HnRz)۳&yB^UVOYYY,;BZR9B/8rxxb K.5"PA!vI" _O?R?~|޼yK.gi)/\n:QKȣa J@׵!B եC#oB$+W5 //+E unGQ,  !:h\^{-[?_~i޼mt]{6Q!C\i͆C矅̳F!<<?|ADD q.DoӺu[4ig3,|!(((0Lݿ?v41B ?sL>M? gUӧOCN:%wO8] ,׆?t&柅3BMPn?W}BHF=w/:c !CYY٨QB4ƌB.󣣣t Xvm}l(NQZZ3DDDoJJ_UF?rx#qM***4L3j2d_ ͚5<:uRSS dEpO*.ի322FݵkW8xnݺoN^l;r]v!?a#GkKq=#sb9iQ&L@#y&]-hAM6򏭫h޽\vǍe Df,'z"))IŃxXfgg_sN]Ç#<1bϞ=r\ТӴiӍ7x(N:򏭫?&&JΌxP/` 'ᆓ)\V݋^|Y"Z v"7h`…?[޽_r\Тʢm۶e qb9.eQpbf TN͛7":,%ȀoVHƲXxs 1իSLԩSIIIiii6,>>^.ɃAF '%hF~}a4݉帔ElTzjal~ y}˒Z Mt''' ?EEE}ر\zCCLOJJ2鐳'.]$gժUKor99935IQC[,'v#qYڲe7aw!((%߰aiӦq2?20~Ѐ=z_2X~β B!B!B!B!B!M6ꫯԩS 62dݏUnٲvP-]*Y {1u޵D㏷ߪד}teܪ^nر#..NݵkLONNVs_8>==]WAAСC8𘘘PKN>ݧO\"00OLLKKsssSW\3f Nۺuk5V頣 :_kxyy'ꋋ?CΝCA74#Wz]6 6lXaat=_5k{5$++[n!!!t&Mre۶mظ|dKj;=z)厗FXt=ׯ_GU /}OxCܾ}`0TԷp_ ,^ ڵʕ+:qF\qq12((Z J:t5\:u娨s8rJ H)pdݺupI&AfSdZjZvj֬b !4?3Djܸq2k)ĉ ׯ_߻w?V> 755\ 렕蠉KSWہ_FCŪ[{u'+# ݻwGz˖-?[oAU!5cqD4sOffs8p T*mrZ2f$'L+tW m.\XtƃZвF͛7Q!#DI^p*jh*rG"T۬/VUt0|ޮ67nZFM>2oڴ) :6;7|Ч4RO: MDSZ)J:u`0CAqDtt4Qyyy D[ObW?s8+]y_~Nhu/xrjժo߾r]AAZk֬QZłIPEիwQHӶ_tǎ'r[aaa:mq͛7>I}veҥA87dOyGbO=nR ΉAOT/;ǎ[ -\ u0==rpAۃ8d(Δ)SԥmFŪtŃ>ol|ڊ 5j@ .u{^|vUqł;x"sV5w\@=3WF1_6 k)ʰF4?p%!|Er۸q#!8v|SU\srr:;VhcjJ6 MMM6 =EpA؀$$$Kg>h"pV:tHzMj8p [ 5ɓ'xPA13P<^lu3V*+ 8R :<,ݚrw=~Tw+3VV:FA}dڎLܸidxŪ*nY5V֋BnT:kѢEɁpO$2+8b ,X7H+ЈҮ^ҠAu EͫAPd~mu,+J*AC֐!,(I6mTD)Da[P)pYGVʵ>8|سgN:B\ߐȏKGÍ/_Y Bx  >ܪwΪV;yWݞo@Zo\]֭.஻JIIA @ !0Z=zzbb| u(O%9Bim۶0(;nb.=ji$+bUOG<7UPO/eW*VwP:WbU hm $G7,YrCSf+43pz޽mc^w}'=^~GE *:Gd+AvA!srZ[ (w}Wdgg#"BQ Zo>aYGdd׹0G#D]Gj l޼>9JG瞳Avd:q@݄YX,zB#jZ0bÆ s~AMx'gIJ2LaH~!L ZekZI0a„c[Z(v5^TAT|?~E-'q(!ӡC4M[hJA~Po`Qj;y.~5N~@ի'';''G~z9U 322dUWΤo߾AAAP<^cbb\k׮r~>8C%$˗/GB:$˵=-[EuvرrU)2 Xp-ˊKAڙ5kkoK7H~.u\{K|Aht2fm]mg׮]0-6` 2Hrn'h niӦm͚5Qf=+W[.J[x8I=M6NF?Tq2hJ5^+Nj`QDPt?HbѢE7֯nVtDVߓ>YHj5! wo>ܸqc/SA>ABH%IOO0a@:lݺQWtk8qpAZ;!B!B!B!B!B!B!B!B!B!B!B!B!ՇP endstream endobj 3699 0 obj << /Type /XObject /Subtype /Image /Width 600 /Height 450 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 549 /Filter /FlateDecode >> stream x1 /b$w0ys endstream endobj 3709 0 obj << /Length 1442 /Filter /FlateDecode >> stream xڵn6_@̐u+[ nyki[,$ ;t$n<:y xpU?D D<T3ɣ/-X[_-0N{P}$G)<Ոۻ,Y$"g)@}Z\EQrT~tUK;TMOMF]wtٚ5M&tkc?~=1{HDZDVBrl%sfeE@%&𝮊}Yozݰe Bo5@*ˉ쇺@@fN~)Сu֪\p["Z(5[=B NU՞+w6lw?|BY{*|r-q\YAS]^ hAXs坕#rybm:5P@f3J7[SVDxb,eU{`rjvg2ӝ4ljheߙjsE`닠-}<[W`&5JFb7%IuHQ3vewwԅ` x)k,JMu1=MGܒT2t<&ޙx c/ٳ[;'dg (;Z M~gn 4SL]r m꜖6KlWV[!d>."gQtRR_D FM$QСS %7{oˆAIn?0tgs,T.!"AG֦+ڒK&%b2`pIQٝŹvq>uM1ݻ)=QCK`=n\c7.^_HgL$glЇnc?4mO{0ɀrfJidAoUic* THOo%46KCg6Cu}\DOmTU5ڸGN}rDL}',^W1y—T"KE+âe ښ`hz?.s4l9%.bYoB\҇8B0WDD-?AJw׸ȨхCяucH/{IZgԋܨ.DW)Z> ::UKQt"gQV5krLm91u;QGH%Κ^'Q2Wo L 5zKoMH,8C!r~l}J..W+T& /3pa}}xɽfMQ?ޗhSlgl2Q2*rz!O&5Q}H-;$A8F8c"{WD!bVr#e o֔YMeXr LX,Een> stream xTT34 *bPE;#`콠 eޱX * }}z߻oe0dﳓQN8ApB ?PRJJJwNRy5jO>z0eʔӧ;88dաqw Rݻ7Z @IyyѣGmVHHHVVF^Z @ȑ#U+=tPPPPBBBbbߡ-]&,,ߥ <<'@ꁿ/UUUJJJm̞=o߾UWWwyUr ]V]4/O&z(})YȀiAA \?:ĉ<{swC(__ӂԃ@`_}x=1޼ydzǏg2^^^bbb ʅG7մ P.WCI_~6mZ޽ݸqcee_orAӂԃ@ ?U߸xWEC.ʅG }@@  MPOo M i&4A=W47 @z`_@&zioHH=47 }  M @&'7 &4H}@R@+@R M izH}oW47 @z`_@&zioH@}H}@@  MPOo &4H}@R@+@R M izH=}ioHH=4'NP8Ffee?^BBBZZz̙_M R`_*%%%RRRݻwR/^455}7qϟ?C?)SL>w$kkk+##7_zE6o }TBCC0t…횶QTT9r >O_QkLrs|F=_`llޠc6k/Ùc5 cm8heoXj%Noi^ _88Njf?a= ɓ5Y wF 3<^hO ,2/hZzn0e[L1cfE0scOfC>@03\5~{l& 1ýL*7XC\ 8XO|"k0fŢ!ʻ`j Z CuRFi& yMe>uo2b$;;a_}|aG-5]0È7,jxh-%ڼa²es,2FM 0dEk‚'y[{_fל^zd@al3lE~w-f:,ǵkׄkZE_ 7rGs. \ܹ~8޽^EDZ^H2ݾAB&˿# :gz2;Ǯ\^P8AS/m".-,ra>sQX˿}gJ!'z#.,!kuW0\]]+ۘ={6V߾}wW \V&rv=a|zenzNҍ78-^(}-kyæ9ԕ/޾΋7P VWtcg{5MD:g5ޚ}nJ gu|#m0mu^A^CA~Bo~În1zt_|%ff]$Ӌ7TS߻y ޾wEvOotڻgW{8}Oݻv! $=wOCH!OZ6h{?'fz 'pbw]p|-NB脷ᒷA8ڽm_n GoQԽŐ pK&9,}xF{8;VT 51xsjdu=}22s44R/(eS̬{l^ő/l[3}à-aL%ٞl[:oYG앮86.]u -|Ϥ}nN6YyÖ8|ro!zI}7UW_![ Ш_ąNckotuK 78B.azQ7%Wćjt3>k4WpB=gԍwuoݟN/97ҾLB3r|~EޠxCu}[`)73>o_+a-DddK#Z(>!8--O]j=4^ja@$QͥOy{Xœ0*WJQg;a|=9F_ K1J.,{7WJߌr*Pr¢ᕤƉTUWTnaGQ\\L ̚,X{ȑ#Y;.%חo'&" Y7C  hnI,:6NO( ]]^+ss[Hhx?]=*(*$>ZE 4Ы%!2Q r5)_o;C=vxx~t?̡˗Q 4#:_QwV !=F?f~zϦSI.|4q8C4yO QuE4niikc_ou9񃭥'J+O+5:GsϞwpb0BZZZ%%EbD%MhOʫ8;CK˴KdIǠ?U~75 :!/W蜉\RYԄ>~EG MIHxS}%"hA?qGӲP#3Ν; Zp#;$:|{|mm-zy#7n܈ UP#])R'=!~r&WǎfYYSS0LB8X^\&+K&[Ƽ\<_2udT2| =Y2˲gS#%VT՞~8R6޽q֜FxUtT;ԉsTZǏlUiqk;ڧ2%O3xɚ5J^2+=h[E Q;g@=yY )F^ c{l?_ }Pn ŋE$_Pvg_MF$yCGQWWbx8q"gdzgpYf.,,[nWX1􅅛RS5~Iљƙ/ܞD^yfF߿7kW%öq|SR#TԷo{b__6ŽbXMMN~߀ϝ1D ׎7n`;DkO74-p(G൩Ջ!g(/o}hy;#fԶդ(!A*'Ɛ}xf}_ M#sgP t~}5h?.u N4.I~t͂Nq?S q7GSjX{Gbaiɖ| bJKlj)ۢw M` M_a;{5nw-z3U 7 L!wx3⶘.I|РVs<)I9;brs[VQfIWc=u0E55=\;fkl|汥Ӧ57ge$'7]=Ooij/goZ]o<>#>^~@T ޅ8=WCT7IɊjHM^4˽8<pΝ#eGb׮5|i7SaX؉^ '7o Wa{L<3s/):.ǝF'Xs"oS-,_.cysqC8 ߻wAsܔl*AVQ'/?R6[K R}%)S'*I~ė]BJǔ>%?e)E_7hwOf6kj^W< FH7;jn͎-o[N**B_lF7Έ64TsӲ!ď+xQ2Z?'4 iKv?(84 7ҋ8oGddC iȑ$;>9IT>1—ƌ!WXKh* z 5nXd-ɓE#e脞C&477?]o*hdny.PfΞm$qњ&[dt}k-8+ASɓ իؐ/^|n켞{=wb-M-NuDY6`N & os|n7u4HHH0zR{9W!f_w2`^2C_w*(Оcjy+,!iqsR):DoIpq (csl/6,IlΗ2&L ...%%WR;c驨FQ 7wqbH@,_vY̞l߾2'6-Ϩ}olmGVJ-~`+)Ǎcs_k%$tٝdŽ(D''?W֭klA,\d =>>A4#b=fLLjNkB\dV}SSUZZtRӟ]ebO*KbIR~@Lʁ3dKEER>}3/Wd;.bGpxM'OF@C \M499wD#]qnCHh%yvvOCTDqXoS  b wGhj:xזcRSSamr~ N|/3=NJX3W/!Ábq/>xQ S>5S& M L_z322:Or VvYIϿAz*KC~m\2KvDZOkUļOdBоʲpZTo3~j*?k:r}&KBB[Nwj,6xc`bK >zhm%ʢc|xhnwѭ}FF-?e a+f-k{2Ϟ.Ѷ"SoBAݻgMmz2ԯ_c]KsT\ъƶ*W҇/Ͼ>[_panZ&t:VJ.z/x'SbU3i61ؒWk".dƠ&bv>K放XW68>C9%x̥ű'MIIYd {eқE~Hw"03gak?ʈ]wrh% -=2햸8-b22r^2ɛ#4w=cI?i?BʗahJ \BK,54Dc.L75uH?&{,_,}8>=_9kkk ڙM}:B&!?w&'G*!'zmQK^NM8jj{ >+q1NW9/kJՂފg8S6nE:V<bwR(Ed+ ҫ}j|HO(Wi0ϊוeNp GB>Ҍv*h)SBQrFn&&dģjgtE#2TL_*Q˹+zX]?컲GZWAFWOe0j0LMll>Qd,2M"SPEM wzOg|_zƊEY)DŢOFnhVߍ*pwmi$^:ؕϥW{r ٚ*#U߽K{cXEW}X4V@3Gg?-6'po EaFƿ蘲غ104NmK)qMOΜ!sVn? 8gRu{=7wQ-=q-§|uPN8ёj?l=ţ8q3H[Ebl͟ ^OȌt+Ȗs{u4N~<>L؀J$!鉦.fnP\T|4ȒQqErV]G\Y`׿c048=Cpp$MYAɏ9qD%Y#..lc L^1U}:ܬzVTQqVBBJQ>kK*v@<[{@ nBi($Jx7vg-HLTxĬ*;jjk~bcѣG G,2pd=O^n'& g'~g9tx):7}}TDufZmcS.{a`_) ޾ SS ]~I5/jguֺ:p,=sopxKӫ׮A<e3\L M'{܏zN.'1. @I<]X}#-󥡡Y@ wDyc-\%|{jJVGEpZK_:c0595qQ}:WGI} kgXo@K?GFrYZtYOPz֩6H H~(*gRj}=W--Q8[J$߰XjVZ E$ oܐ ލonwnE$q33?^Aih$?3;U"Kҋl%:n^VV\.= Up|/USb_knuuUqMO"cm&oΨjjfMqDGhny\c|&81CG˖uu>oaKֽmhld$%xW_;JM(*17o~&V}Vp󸶶  0iGKS>֖hKQL;(}`#եN#ǗO6b^$o%U޼ٱei|)xhCh*ef@nr/5jR%1}cE0Pir}4(^/wܺ(s!^˗k"RhUWy'wDOOo 1U?9*J=G+&w52DGx^t:Wްx`b2?v_dQǢ0QLfKV|Ng֯yy!:ӧСJR}'S(H \D8/;MȲ˲/߿ùOlb1/$NHS 9]U 6~WK_G#RjF* `]6T(Xn&FnjFt3xP V;:7$UG:Ξ:}\7H74jHrm؊dW"Y|Z3*dZ BQzxǥ|la'qס)HH|Eג7?*,lMoq"Q"Wwr-yyN5dՑ ds}h'7$S&ϟDžn1~̑ݜ;(-(q/1[ }X\+ m#X^{9%ϋ:޽ԫF< ׾Ri3GoQWج/..oR`UՓ۫W/77g9G`G`x^4.N_rOm`{E-O[druy"]oxK_ss+>MHKHH| >{ϟ[#ɷ6+>`0'YX$%ti2_HJ3ƟnyFyrCS66/5MMw"HDin7y:7z+=:at"Db`TDV~EdW!o4@ pFeDB詂ഃ4os&7 ;qD;-mFVDWV :I)G ^22mnS 3yV3iğ%z#2SH/&lknn5N%KOem_;ks/ Mr=?9+GGQ&\e_RrIhp#~9yz;s\P۹ ?21HtNې<.:`(wDܱZ8jՓ'ssgJ~ Yò^8رc|46'H'm)8Q!~8 ~d9;!)96D}^e{lb{ oB4ʪ=~=@|=RGGg[r`،D[de({dÆ2ϲtm6~@YK [_mcVUiAF&"Z6og8JF[=<0,h//F;EO\ jb8ϱ*Z7d(jt~U1<~}'H:\p\PD>Xp*ԠJт(uHIGաIJLgiU7Ѝ}i|_6sbYYـ*B))+){hgPW|yG )}W_T->1o^^H)p_&M|3~fL8!|f:hkkk&%;oB[ed[4ȫ$Y[PXp̼ -ô7n .,t_Qocg^KN ?: so=Rp8<$m( ͷ_ )( UFP㛫C)ޛ /dC덐$XXܷ&xv:u̩@*Π̓_I;WL_JrF}Ib_ ]lﰯ={-!a RT: ;[N&_*-#狞 ؘŵM]nm <<2+lh[lfZ 1^aufceibb_2b#Eo%QK7Xn n>W? _ξɱRw}kxNٳgs.p*HRMzELlt FN,̱IKo. xvZ79v#ǹ0zr Rg3 }{D_[cJM?|z[DEeZ]~IR}&fN˱6h;6%--G$.hҷ~gϲGd&tP,QlUZ9+=Fկ'j-(/꯵e]:*JF1ehJ ! ;j ]`&[@>/z#{%UڭbÒ I6K=GOѨ%L*S_[ut6 _<=igO}(7w} > V i6V'J#?ׁCۧ۷tWZ?pg{%<vv[ͷҿ:yW"h9qLM5a9==msy}˘e%GJX ~]Ϟ7!RS0z4or9~ HXxVQ* XRI'ےY?,rGOne{'~ <{2%j_ \O}xiy`f~Yyy u;B3MVz\ӧ h|]BĻu>B 7{b\D_=hPB˷Q¯m t/^`6 1,~֥gUU=gHA-^ߴmT *BFUJJG8w,l* fh!*Ν"%<eXPc_XwpeNj0o,|ڵ_>țCT3kN&a*;Qv 4JlD)i㬆5*++١ eoES½" A9bLK$K.?}h DгO\Ey>\WU/9 =t0\\(a!OI7,eX3&3Z-kײCBz;_$a_}<݉fQ`U?<W^,mK={آd1v\)nco|߈E_ܻ/eO؈5-!Օvŋqz3yʃ0g>_#M\+"*hs~;i%h}O;#:\A)rkq;Ygϛױ4i0ƀ}ii~Ooߒ$TWKљXظ&VMM/t-tuuŃ|I}yY]]]+,#jg2֭{;MqRZC0 G#IѭE2.$$F.h3g8CgVx߷H͏ vm:;bs$BN j {&Cl;t@xFD^sѣΝobb|!梢,obCesοϼ2's֭%$(ۂ^/ձ4>p۶  r$zI8wï~͂Z|$$$cϫLlpR(&aaa>,mj䜐d72 @FFFIƸc|2,. pg ~~ Un'OB@eә»֘":]լ[t! ŋUgCO䓭uV% dPE<ǾKVKf nN{)K]21lhqxzaX}Fҷ Gg'~%wY(*N,Ŵw39R7[.׆2u#yttt͜w7N&9ϟ EnE$cE^B.R0}VtlA 5BȖԅ̙hgz *H>#2{0Щ8qras%F?~ S騫|Tj4h*DaRq^/_麹sR:IV{Y,#N0]+.n_E+(f9[ߏh_.r-ly lEArroȔ({ }>VRh><%[afۧ7ً{u&/&,1=*lYPsfqgqP];DFnf”)SNJWҴ;P\\LEEVGKK?:sՕ܅}Ǻh9׊FC#yO v=q buWc6 IM0mjLM ;^#t. 뾝|˾PMM͛7ȉ|o"?`¾_aFFFs ffMrrw34HrζVLg8,b_ 1x0JNQ@Y1Iz#:p?tX,}@FĖ'\ 7?2~ 8(= .׎2d-7*K+7΍ӁsXœ{R",VػxۄG\>o-ېiВ"BֱK,0rgfH.1+/h_=)ˉT󫊮)s)Yhp=߳42d't 3f8񮣑Cx &,,x\+BZJo88gpL ,߿dd=K45k J7-jDJN9| g khR#'GjJ&tZ*IIQ@ @)^PD&p? FsBRJ4ڌ|l]?(&8%H"YN6aA7We#/&}14bD%{zsoE[R_#4ӑ?to9 }֜3՘ԓΊ,1;55dvہvdJK1^(}_)IC&9'ا5aݤtc_]~tjk&C3gQ?Ϣh̷_jƏW6BV "5e`"YDr&_]"l~к7uϨv+?pF ɍB3 3_OdO2'K+/ߡ?hE.^畉ڽ;EW=p9o!sի|xV|ܢkO>M@,G|cDDwGo!&&֣GWUU?qƎ3OV$+/;̇~c(={ɶP9^a[w\݁ctC__vSS.&72X~LV3,w&:]{i̭fіr "Bhv֙#p^u"E✮:=cK6A3w ~ToLۜtzO}4zM?Aݻվ18cZ ƇwwbRJAb`溎v/DUTS{ճV/>ehi7ѷmUi FDڎ+v6dc:$ !hŭ%B,\CLu#Ӧѣ_ {P 1!'Ƶk+MB i,5;/5.w&Hxҏ tu{WՂ[-[6x0ӧ?9dxl/eGG`]bvR]Hrb_y<.P|S/M.)}R V T8{|aFY.t-LLo3:-3b .(0pLX\t4Y#Eq[җ:#MFDF >3+K%*Y(+;q<#BaV4;n">j[W8 l[?\BW=|-"dsGd#njoFRF%GV=|/zB-XP)GZlfJK:fBĻ,guFF GS8Uɥ-MMlMhJipX9J }}OO=v^lB쫗k[tXZꕦr8$7۰bbdsO;25}G{[}'F&˘tV|Y}#< Cwk&Q(͛Ek6ɱQO N=n̒[c}uL>>j_ 5vۺaÑHAg.t8{ trQ_cCTD\G4ך |V?!͛ $$`6lؠݱv?a{CdoK;~ 4gɉ;y4k,%_%3&9~8F{777!^+W~0.***a8%Ne/-#g n5}TU{N%DA$T@EQ;@P0@l1tJ((v wo@ߍZ,eϜٳ=)mL {EoEX8h|4؅` A*MF׵kB7h#"`f -ߒ 89$l /mR[Br5W8KÁT^f&RNiSܯm!T7PYrrsr4oGOt\ k~ͼYjFYMM=OC=X Rz(Q#eq]ЧaLxI8й Aw`:cJb]|H_meE.q*ƱkrĤǀ1c!FEI|#[lhl03Uv1n[dOrN-Qtoׯ~w,ݻ&*T}S|)(=MO'wHߐ~r3fxԩ5WeZӑ¶pkN{MCoްQYPdo`Ν_i;KƧٳAkX4<) trrSSScoBoFc`Û?63['!!!ex RwKY8¨OqU7>KI^$=[HN 0eCVVˋYhHeJCCyu=?]=w1VGaIi xh8)˪6ɚW]3ɚwlZ49ٜǵӸpA11o/J\V?%ٯF 1Ipi܈=жli"/ ӓz1S7:YYu6~|ڪ]cpx,DIbrҢx됮wʠ~AvFsK]A-U4rݳgeI+O\ah 9xWʿ_yEn̏<޽uyyٳ/tȦM:> S!vhY?mL؊v w-6chy%K4\5>մGԐvC^(&CBs3ח˕pp={|ŋtKR9+KN!0n\){g㳜 m))]ٳxE`t~ =`&)->b#{I}Rc>}N={F&""f.nNźz "%/E^|t覄IO~q5'qhV! 3߾m7Y<\gÜYbiFo)qH>?lZplU@if1F{' B;"_<9qWfI.V0e.54?m+aG~iBJӆ;p>(**k nR';W} _54DoTss;9/ϟGW,' wBxΌcYa?I(x)ӿ>+M}:="#5--2=GjNUEƅt; =7mkD[Yuttxa뷈L8܍M4EAZnMuMC y{ҥڸw3 󚓣qpWӖ( 띖J;0RX[蛅YYZ䭢TfoNEы]af}Zޠn(<󚂆|vY1WW/dql6+)FSSҥc7ss%$Xf:߹#FZ[ gr`6f^]hCz3 ŗ/?hg|WYB٩SZ_#_ wAb&ϹsbOQZBjFTUxڵmm:+ ׯ C7}RiR| /Usdj* )w[ʕOE4@5(l@[[@s||SmUÇru!OkVWtRSbzEoɆNEE-_-"N`ߐH~p)(|Njʆndʼ}a1@X;;{ӧO'88M>AZXX`lܼauuu(}20YqiĊa6Z ]./?_AOO)b0US0n\2xܵrIKSkjrr1|X(nEAjirhdTVσ0Y~QOERa(hDFef^MF^ 1ʘh{I|%e $I;y_ͯJƄϟ[ŵx^Zw^R\xNd:r!krqc0pW/<>XŰtuQbyFEUWLM?H[BICU .cn^NnK'm N]S]_w tM^afTmϏ-cz~K'ϊEq֘7G\wF.}_BZdx<9S8s2u2{eF bDti7.QgD<B~!љJwM0;>7P!zx}Zm"g`\6}9Zxm>.i41N՛7o>ij"?@x:H(AeLc_eE%%VH1p"X".(1y#EadHK0dRs{aGIs>hjb^&Hx!1R2e ۜ#Fyq<2;i6~FC|UY e&ʵSI[E};8TUr-hxAHIrYeB^dCIX`2۱WI$??:ix+tf'/8g 2{ZnpI&uAJIa,McȿdBKAˍ7DW)&Kw5X<=Kbڴ*^iC hl _*B|աkvOkmfYٰ5kr4#--tp)(dI,Y?&C6lx<ԋDDdl9nDLA^z/LQٳ%Kos_IHv ޽Kαz1٭ ,L.2H2YIMm}#Ђ*Wہ?J|)d&wWYYzv(@O 8VTX׫`)RNM<7'!7,yyi>3ڹִ;蝗'"CԻbLCc[^%*-|LOP%Z~yQ7Q۷Xi <8Huhak jjjd@ɋfҔB|f/%Bj[ʍodۈ.%Μ/>DFzArN8r$,br(5G|癷EEYPk!7ܳӨ]в4vGvzK[{jy*t5SS"ԡcfQJEeq#!<93hrpϸJ7.>gw.ʝ>WDi xz/ %<w qQ Hϵ UNޑVv%rvav Ҧ/ܜ}X`qlh9Ȓ-;wDLIkkpoAZH/T刯ܵ?YRaUNl'W㞯pXIC|3!.]M͛7-:q2K/hɱpήcv/"*>7>॰"arrf-T#?5W Mj f;JH$(mϒ4TUڂ _^:w_W+Z[W5̫]ٳ7&">dNٹq!+m%a(_̢]~A7qQ"dT}ՙ3e2xDŖ-u4:׽{y$>6dR cbb0Lt6L6,EWTE.eeGpB&\izgc&33VF5W,:3ad&oRu&;@zTR dxMIs 33_/K f᝭$}KX-.kVrB9I%3 W7󫽼?f$]NQQѪDtwR|,-#/6 C:U1Q~=⫈8N33  Kd*L8D?J9wiؑp:Ug6a|pFldd)锬uʄp0(p2\w݌' ͛."y/?zqVWBwߐL]32;VVnȽ,g_KK?4E% K>,])_[kU+b ISiڳ$"fULZԞtvyS'o~!B3lTaįR"""P0b0X\Ȑ }9!5U} $ :uh_s2 gS0 4=ib揝wuֶ3zC =ڍDīDVD݌pXX- L'zGN) ,zg?x0pl{ >y/Q8)B:p*y /QQb߳lUz r?WNY=/>;~_߉ha6R,I7 (4.yi;a|]m۶ ffзoqg2&/6%1cL5kt D eË/mm#G&[DD@_RcP^>eORmi9vL!u}5(_NnHyf< qY]5Uh`I {{ZjyYO9#"JJhh-ƂCG+,5~e@& Oe}څR= hͿfM;OH" +ڥ[n*C|%48QĹ"``SmaeԽVjofq@:(]0`4 V }p|pm.'n դeg@Zw pQvQ9Otsoe##2?f}CjNq#^hs؂̮?-,?1W/'c?։_zO,۷lXiTJlT;Y6Z)hs3g@ s7h.\}wY-cC;3a-yo@HvLKmhKKGj 9"__zwzuuu׬YLzS&eڿg(!]s+ƺ*Wkt`Ñ=+U,i!66Z`SOF85 înz›7c5Tvb( 4:ݕbL]NVyX!!wCdVhF~ pLOD jdٓN?WM/xMaa{+-ΨNC|59_~)R .^A4] H"#ȫ5+ݰmA_iwޱ''y]rHD {PRX6|K.Sl7*nVpë3FkW4>]կWo?F%G-۷LKPM8_}ϟqqq Q՞DPVNg=S0 ?5w/SmLs'>{`uuv1c"$$fjk3j bUU ɟJwtAqG&ᇠL-DīRz:3Y8^Q֤fP$==HKKܪ*#lgqn$g_8s/Y7H}gU<׃w\f [͌T/ K)sYI {> _8dbW}3nn3n2W" -$>qDrc:Sm}{"Z ĕ $Qw\ GGԛ|mrpo^RMLq%?Ý;Wi{8)FZC6}eKT[+!cWmA'i9I}?~#,MtZؓ'ogξ82:qKoPyliy-";v D^\zQÒI=)Tr;]fٳF[S99JUIŤ0T?ljӑI0w\=kr%A\***ݫ9a9!ʙ<PGڋu &Q1Yi"ii# VYIfQ1ʇPʡzcZFAީIS=vDfJS \H5 \\.9pŞ_Ww⫲aS_Ef|b<I9;>#$p8G0^D~%햱d9q0{tģGɏﻻ=IYY͖31A_dݡ:j"BY7#^^P){{ NWPpP1ErT]/+ȠD/x|ihhS[+ѷo af4"#cP>Trs* hpKÒa#zT>,SAIҒtav31Zc~;e[Cj^2ƖR%LwŬ4@NLr//_㵒v {7ͲtFv&{*)FY}!|U[+3SwœC~jvow(\r16U(QͿK~!k: G{{b,+/Vwd![ڄ,0N`.޼{Ta!Z?-J0!z+aFm- H:|ǎ!zG`,Y7F`L.)iq=Wwk9a)1m{{P-ovy T]TLז4M91Dj2UpsSb͂^6|ȼ0a t3~(U]f K|Qd!YYA X;wcCWn>ynHHH%\XM^+`9W nB]q + b !=W27ƺ8 1?8?po)Ѷ8iJ\ W:v*&ǹz yɅ˝B9Io|X@]v~$.~I19%5hشlϑ7bŠ{\ffR|眖&TS!9P> \+[hGڹzuX1(R^W[[Z[֤6(H4:G70qf6+B)O~C==C1N, ӓEEdR d*pĔ]d]\0.*ll`dm4~rH4Θ;搚% TAAVRGGmrq#kҧe/%@扄uv[Go3!lk+VT/cόE7aMg3 QUxo<2"Ain]j;R eyM}8kpqi ;wqʿ77:g^Yjt'Q^I+Q?H[hZX=zzeV)Y];$j(|G.OI~uE?]5t Rǿp8xQ^I)fla|2l۷?u --Gcq⬬.hyAQ6 vOI)ސʏO@ -+0.dΥ ز 2 L=z,\;bH%NMrpWsхp~36xbC3}pvt4NNSGȒ SUN8z#{$89fZNo"Z$N40X q7]y6gF4m[A:PP eWʿ_пNCw)  MzYa`ƴΏ|Ȭ~vuehC{2]Kf'yoo:llŷ.;LDu3X'ꂐ<0&aC/4[sZ69=]YYJ"tt鱆bSTXŶYr ppW$s 2(3#Fx9>bmH\_J[p9sX'i7\$ _ 2pXvF\UHBPwww>p<>'G|+'+ݍq׬VpK4cN#YRePT{ʘ1Az>cժVE6~jX0m|RhqNt6j̛b{'l&̜%|DNWߘ hTނŰwM#'6᫆Xr/~OX,ѣ?b+D+*&aAkGʄ$U#}fϙc%iBKK.|a8kY:ӁjyƷoFFbQG"[>A aRRR.~R̈́kΜy%lo6EP1?1O' T|!K5pm<+~Ԓ[~ "=txyw >*{iM9Restc@XsvyӀtþ(@2k-[q}QY%FJOQp$Ϛ%P=D۷]m7K wPc"wͬH\|V"w9J^%pt{ K^AGCfeKqs|x}(G=,CoSbrmXO:PC(.BAP-]~.3?KU*. UOH ic<޳VLk #'L(u{ r,?p*N$v0B+S)HiLRQ=V$P5:Nʕ٬מu|QHHY*P 5z'8&=}_߉ #C?~'ODک̐0]rk6t$ϟ6DǍ3UAU`oƻȴO^+(UUD0iCo܋RߞEnhhR#cUSFedH>z/#C\+7wcMWCϣUŬ5`1gXXK^ ilmݷOe>`V/Ze7Mcd?NLnuYoBQ1xwb4#֡S*ԬWEI;yimjϢ+Zn` u*dzYN,0]\ܙS@.x#ſ lED@NRڇGWc,½kPØQcxs3M-Ct:7wIHHt2ߤ6ڂVF˖57h+R%=Zx1*۟?ԩhܸ~RϷR6%[Ү/_O@(0wO#&GhjJi~?]M:Y[ZZ8-P. / 'GLM8ҙ;wnFt:nn,Ŭq2=` 8 N[ Ң#G ¾/4AyPJ$BhTHz~?`%f Z޵. EӺ:\U~=_ih:wg-aJ1uZ^vlV2v5pITH>Dq8QT%JZ,,@ ta⣔{|^ɕ\.ķez! .>Iנ=y,7t 9&Cj*>rZY=Zh\1LrۢwZHf}cT13L Յ``h pX?j4NN yZtM4o&{#QPXF𕶾/|;_n~2ܿMMOJӽ;w0H~I^$TEEC2jKӁ=O9𪘘/hpA}&_]i[4a5;2uq8(g_>>83S`ȔW!jeAZ65ucf .u`E櫩Q`z%"0< YhW.Jܑ 0h_P'.rbF?F7_L!MȔ.C끬ĢkcKIcIA^J݄^E|#}m{e]i7CS]s$5z-zEW HBXSQ;x`TOz _cV%8NkL:K8E|C%WHo8rP g_/n+UUUKIɀJ矶 ##ө}%@U^W1) Zپ |*gff«Pve ,S1?גٓf|_w ͗k YYXۑ- '&]j떁ոjLώeGڜ7w^>=38~r3g33m lלeʡ@i2fʆbzz8;dLSk'F^s.'>;u"Ôٛ}^S].Sԋ*#SOtt@l6V e,ƗaXs?(..+|5~FY\|0=o۲%L/wɆgP^-J.=Lb$w@PC'q2HoGgy@r}\}2Ru|}Wœ3?/+ȴ k͠ d"wEC.Hu_qT~PŠF*&g@4ksLJff%$Vy bЍTHsEzP%cv9cr/dPJuJIkЗ kC#NqZp$`ժײDy+yxu=frU[EPGb!k+x).RHYIi-b(J ,R)cCsBݸdP j'W!=R',ڶmx#籁9NBHsSo) Hg5Sloߩ]0͑b 5TF5~;#^>P4T"y$i Fo='{ %$üI39e:/.#,igx_ + ~Z=6֡~Rt߹Gׇf_6ڂ?,hgM~ϟl?=O'e 4UgbWOL!u8XZ"5 *_kvkAEݻ(w׮m}){d%->ȻKޠI+?WMLQpfJolg@䆛 IښLYeKRLEW7&{_129E}RXgԸpxTjm+4)S:s+,U|5wVxJϴh\WlY.蓮sWʿ_|yqgvh0b[g> ,<}?bx;mlr"o >0eS&UVVF|AOV6 CS\ coݺEE`Rl W':-/O1綻eRh 4 YldA5SNpРALDw[[+Euf3r…?=QSk+B2G$:ȯH%cP|dlɲU\KI+R~c䍲ehGʛ7Y/w⫂ٳ/{OW\JYV.w.%$i99\A#浱ǚy2$jCbvOiׅRYDAMZaA@&66FyYsfx0M{>L/+ nzB FuĨݞ'Sc M'5#+?2<@*v8h z&$`B e=yfQe/g.營Rv"QߨIj&sSMzDFɎD.sec[L4?yXK h.RHc,(*"JG'L$(Jֶ!!#h6jesy\ )f.keM \l4[z8#:W X"q$E܋,I Er&ݚzLa h7 x0cE]8^wOt}d:baW|(6 R ><(ǥ_| _j=zhhDM^SSCZHNN+R)޹cT?_Kjbb?6MCO*=92/4rFeBB4MAtcc"ѣosߒ:n}hmk#(MBXDşI^.AAhP1k+r_L6;\gfTvYԋϟ̐h|*ap0kWƯiA*NVhٍ/.I `ڑU]Ӭ7 mpvN"v׈kNRRn `N=ܳ`Sy;Q;MVlT5/W!N3g冒jg%8hKuƂ훱_?'J5daBt'F#dZp :U#6TW+.3+\N>rHL]*h3i oR lpyje#(RMaJaGIlW^MJch>ڰPi<.twB3e2G%vy$HD,[Qar.ӍGY\uԵTxH&]z# v ݖT\:#^,UFYdJ=>z˄iY8#lϡ0qa PR<<͛Ȟ+X4R,H{ QOޏ'r(3Z?O_}X 0sdQY b0 $MA@  篚a]Ew{}ܡS45t߾_-2QWS}Yql?(;~턄IoʢQ|##Zauӯ(1N ƥA׆Iv;s ,`޶"u࿓ }QOKep{PP AŗTQlJ{Ll%G.凭gOPWiRCLk%عem;o/|+ܡ?bUs7*m۶&˦19;;:7|,o^E ;b_Nv3Vqd1qbu,OJ {wč::/0a6rdY؍8#h )+Ct Ww|7ZZlD!H\#NK}GquR7p\:<;&H=u|DގXsH1f={$Zd@ M~&\̣Փisbrr,%lV__g <(?x72=gwRzhbmds#&xWCInI@MdNV.滂KԔjᑨB-7oCټR+gjx"QT]11+ϱ&h%֨bo3Peȶ%PF9G`,|:|=r$x+_ah'ڵKEt/d?AkHm%,['*Jx8U݁1 >Lٻ :_d^JYYY//( `gd8ǮJru^XXu9C>}A9+]%\-b c6uPp5^`Rk -u`aQe^{N.ԕP4,XNSN8"'%@9#tdRnoٔ&3{^dT$`Yº{M8b%CQ9==XyXҒ6@+ L x9j2=y|fd_=u u}E  !lBPK6o~Qؗ%]S/= RM|&񕓍Ɉ+S% ;IdEĤgk\ثWVSìtS=2/;{vv9 ,[~'BH>|4+~֮5  ҕo,qsrr3%&~W rrCx S5kMcfmn>$HAGfoK&ɓ)Y#8xȂl(_Cl-*AuQvaPenӸɑ*aLaVu*(4qA3g͚哦iar&>?F7@X4̯s ,+[\Yxp.$kba']==>>RR԰%Hx3Q9wa֋.6e^Y£QS0Raμo&Vrp dt㠠_-悱Ü/Җc]y4_hk0qNQy^Q9<%(\~vBŋrT o';+tYfZߖg.ްRw t:IZr.1r Vl5MV#јouX˕q(YL5K/g_1Xl;͜5jԨP~MOuJ-Z8vHXX g?Q8%W/Xŏb`nigaw\"ʕE{8dјF+LDni˩V(4t,%6EժLj$R(u,۶޼qv.zdQFʹs@]hok5-= Y+“=ݸ1C+Sy92/+u[++Vii)g;.5iʗ_r>!>y$nK\C@5~`*& 2.ϳLZt]߾L{デh5o*vqGGG)؝%h(SryI!Ae `؀ 8$* 5Օ0nj:PyoyEa"##9,E/?v]z)MOP`=JgR:rÞZd"'0KfMh*Z=ۻ36;Z'(8mwan Y_=D51Xxvp:x Fy ϐqg}#HHV23.!,evuIjբcȐdd74eG'6d(S!A]1PR!oBqssO1kfJ `%;\fp QvL碁 U׎? MlTO;} Nu޵RƋʹQwCy.) tiBnܖx33*/bWsFy{z?,"CS|A<.}r^M(Nʽ&UUM.κDEE9&9:M` {Tky)L'4jI3#aXGfk2~ebݤCnG]#TT8ØJ`/(ׯg񡅧7of YNxIesGOJW_.Fw$C]..=-RVV^kR,NZbϋuzCaNvz4a UyكƱDe˖r 3W 8Ag' 3'iIh*dVyDh[ò~۵`VO!mx^ ,u1WYaC\!1߃mSB<{LA5xF;~~)t^s hw2yj`3̃v@DOfb5AdG'+J =%/-:s 牊6:u餪gŸ2 ito)ps8i5/V:04'de?Oӿ"!ӵm 3b)*5! VHnhӜ" QVi/6ĩe$,uO5,!|-V҅ӠRvs)WwD8Ԗ-[[:tO̽Jg7V=ҳw !^^T@m(B6o4҄?~.n/|, 3~WT'&d2PŸ ˆKKKU\f9j׿q bhEcc@Al "E< wE@d2Vlϐq -N9RPe7dŁ_hܨ+L̔B5O*)HB(?k|tLL'`B7B$v`}3G}G谲˚Ec+r7Z/b ^{l! GGw>+1+K!%wo+ B2t2s3EZ)ԪU,U*(JQB>NDcܷR@:qZN֭?PY)}BՎ@%ػ7sAppWZ?LMMM%b<F>Zc08j:|KWWΔ8ϏYbN>:iV/^EDDd26c7 x z4Ux;S ':Kd*1=٣ږA"Ʌ&"f݌֝k4ɥssS8\m)IIۗ]MU5NvsI;uua^*R=eиssqD %%c,.9Ĭ%hPS|O BAf^v 3g'vy} x. ʊ_{id` hT ϰx5^UUÔ}K䎮utv r՘(xxTYTJz,Shz㨅G9GVvEE{Ba2AFU(7{FXnl}5*?UCj[C,|az܏`W۽.]mq-PY4~&tB=Pĕ8NtEu{cnp^lZ'qM/N_đ#ԇM:$j 8 <۳♼?C39P;|z~ӷpm9]7zk֭:7*OeQH.ʇNV227x:gT+JK:ƒ1}Ϡ?1 >_?śM ;ճg%XT7,9l;6g=xڵkUTTjjݾOtt74|}V<s5v ?T}!CKDw|wL=О=<`{s̒ڶvPWyح.J@Kgg硱HU/P(4wqL8Ro6,}\UɁ9J&i߾}&8IRi[MU ]:?rl㫭[!04.w|q1ηPx|;E\ni(OA})R$e:f=fAxzk3`S̆ݻT7yc#!!gCJL@-6~3,f'ٞ)&&w*R)E)w 3Bv,=Tnl0i.:|p}m~(QǮ22UnO7b6=DSU޾XꚡaYa0mhKkO WS651? 1t>Y?/wNq:ɞ#,  rh$*V􀭝byX¨O~o~,4>}//ˋ[bۛ]:@gRilSӼWi6ǖi_),Џ;u^AAKCkJ|hcRqe8b},IBUoRȝzz1fKkty\z6acE9թ1i#}Plֈc(8G݃Y*xE9E7 }qOGA9<d_o{Fl_U+ZjhFJGp~R^6p,GGַĤ,F!l> LQ:=&1zu>Q eR45Ȭ *Bc̙666yof VG R\^\~1_dU, ¨2n{S7P>spp D*}˭vuȾ{e  Ɓ׵ϙT/TCKN-w`fu2`4Ev%܉#VGcDz&*St<xmg ITo[yU$'(qi*~ z8xԖ9HO}3lȣH[8 ,9Hkuz24(YpѣusQ3 @] 5Kgw^JiQv_^O`_R>*XLjc8|ACIק8 7nXv}ZvEc?ͦu⊛@n,Wt.aBA`C#9vZ|VCqt)###$vVe{_5/> p +777) -/]^)3xbs%;v|Cѵ,3Jt!`?ô4%i'|,Z5O8Qk`POFVx&z$~af#GF"O oG*?qR$Ԇs("oK#'Ϟ zz&Uqfn$RXQCkˏmЩCK>R8XmQ#v!@u\Ws/CN n pWlS5y$ai1xx8JdiCS:e~+!V}oL$bW]H۲mc |e+x1"VQϠi7*9f6+ΣN;W,GSh%WM`s)95_&6¤EG*,[E.}J֭uu,G͛`Oo񮁳)igp-?qF*EX*񬉂|NGis)d )9Wou~kD,ӳll42FcPTakRsfK}_`CY½y8qժUk8<;62(zq$L4:0m֭zw&k; QloX N~gJJJ`pG;,p(]q|r9鉧'0ՠ f_bõsP%_JL ha54AɓڋAƂ =-|kܸϞ/T~!.%؁r>`X42#l#s J euKǡ \ŏDR%jѩ?I$uCNȝW><waD AYC@w72_]-˧M6q?NAS^[Ntvab1~rAVv*I,Cj`V|!fgKM0eVVkb5Y}4Z%II{xxpNd(?&ˎUOʢ0g2F ^pb9}SK$oK\kpM b7/Sr_y;.:D/=IN`W981.kq_88+_؀pZq:I\$mJ$%wGUo%KKㅏ%ذK%Ɠp͹ e@0k.n,u%oKT+.{U#DŽ W^18c9 ,]KΌGX&m.SQ84 amۀ:i Zq3x܍WF'J C,8+.hdJ<vffhaةOCcye(43Hd0*lUOgD] }om] pF~UR?m.ѯ< ln}=@ x{>㌏UewdC8\3NIQp.%*?KfKQ/d,qx჻ h}Qvm< 4̩ ixYLXQl^t\ \(.pJWD*v682X8,o7y KIh矯v)͛c_] [/𐓏?2pÇAzjjd۠cFwuuEV__N8N-wdw*;A/(t;6B#CnIyss GQ;ӄQR"UXK5cTʣԚ)7},=ahqBȿ2n K6P#!hS,b!UxU+H䩳mcЏhӧzI[#]Fc;HKg-?I¿hGO?<ӳ/珟(e}plTOP%qFvN }vhWzͼfK, d㫆|+ 5NeISv~ UEfm.ė /—ϟѳC,SEf$3B0ar;4y$R%$þ`=_,Q G!|y2Ax;x8Kz<Ȩ왢F_՞;xfvZJT dMCySne*4^Ҝ#WYy\BGac9\sUM"3-قҌNN^jڰ. ҹ,R%.FG'g:Z\So&z{g~4&rN T %&&J}_gp 3'ʓ^̱)Jh 8xIo_Î%dΝВ^r?_N6VO)RWRvwʇeC_l$aVZꌗ.a2[6[5-]taU`|VڍBȽØr%+lnƎURjccΩ~dq]G2D*.<&8: k,/ 8ss6[~*LVɜ:J (x]Ǎq^b YKCUHHo3VtꖣߋN$'sr⚵)JGz*!!VO7xDOO`|q2?ŌicH F/ǩp<~;+M2/aT JW:J1d\MM [w8,(Q 9U!g)be]u^ s21<lm?U_w l]1sƽ~(z%{9 Q(g:cϹ%憡d: A1gݸZR fn+]K Ez*7T`8қe"ի;ʮ_W0lO)⻻%Y'jÃA030lbo\g0>Y~WxBV؄$wȂt񢖼ڵkQ뙙rlϗL.{9|6"!## q,6l`0_+nSDIh]nلE! A,cBaL__RTGaa@3isj,vɓ/f+g'$t晚uK1Pj 8g2Wʊ:(êIGR4 $g0eZd Dn/$L7H$һwwHXB Q0@(&EncEjt!bHOO5߾8B5k*#|:Wd 0_ǯ?heBbh8r+dM<#S`Bkf;"hȈWpӔJk݂wA Kձ?<>(Ç].e:S#bE>o/=edEfHЉ&sMhI`]e1qt7: °uaoMR_QdIL _&4~IIIt:=..HD [ "''lٲ`m|Y9{_4tʋ5:lb]:z$pƍ$'pssGEE #. c]~HzƉeيUI4S/sa+MY$t xO1++ <'1 Vn9AϾmոVWlOL`[Yx iJNnG 4/^DMeʹNo#j^$N&JfXbq14`$(~m.qxא)ePugt_ eJa{Z0Bvxy>:cf2YI}@h޼X =$Rt9/и (5:E%cĢ5|8]HE 2ᘊAļ}̘;wX~౉%6s[H1V4Bg~0V|/Wnn0,kG]/@TgڠR`ywt6 F70iw.|T8}_5Y5yQZAD ))1cTwX7 r緻7i]$$$8H^ōO%$kt_Y%G7IoT_ _z B#$T_+B)t& Sggj]/@ 44dl.) FN P36N`.ï\#Qs=̡DW`,_Nx(AB|z=FVx~zfeg8D65嶄ebԔ6cyf9by9J8#՝wx3aN5kX{^]]]Ժ=wbMr忓EB4=SM@ݒ09{he+(QS!)9( _7'ooo#+JEcƐ;vލvUUULL ˗/n -6E^쯮EM:}r{{9(//'h͛İRpbA%D0$Q=qg]ުgxCxzz:{V޾ӴaUIku<{AFsGTUc.WjjQ9;$3}O2 2Z9 u^LOMT^1/fgml_uk|ǣG|sΝ+.0pa@͑Hm@O+99[*$syO!syVg'1⡎«~U/ovĮ%_BBL_f#W͏19*g0̥oaiy}֊ l#SKp)F!& yNRce߾7avVSSۑqL&?SU<X--3ۂ>?A+O_ms҇i}H"e_u,:, UUssӶm&//?n8.Q:ہC(ҐY|e#$$Y@ڵ uvx 2Ԣ_},nq{ 8N;F #:;l{_ކR(61noHȚ-=5 d?y2w.ŒDyx8Wh{-"@BĹp/*ː"࢙td ? EƏ4cEO_JۮA@'D5so%ZC 2H$ [qq9(]JDWippO /{aMTRRxMIKǏݒgH2=U2ix%kse T_u{IZV|7LLle.}8`1%bH~&SbJIDsk.rNJjbE.mPϑU%VC_#Yuҡ_9ݽ{ z?̖F 6}6O϶hiqU-~V(h)j`.Tb0X[ڳuDvsg8%umO-y Xýn~cjpn N29$qq9d򧌌LtwY|NׯosljBCqZC{:s~WMؿ}ĈH6! FuK8!-oBy:kI_}zMd`@9Е,%' ٹhv2MܹÅ-u OÏ$@EtHvUsDd2qW22cʗJGwy .pFt?D(e˖k4Z2ݙ0XxI<%6@*DӅ>7MLV@ E,BY!\!M_;;jjd566;׼xO3)ŋ+o}CVYrx ;02f?!|uw]Dp<-_^6Tʄ $Z <ѥޓ}c* RPPުMz*3fKKyἌyEYvv.Lpem.mƱ9bKsX@.͚# /蔦QotwGx`ړ(0<×{^ܣ=IRu@[Q6DQ{ Lόm?=|*2,WWY6^ZK %X8>0S{ʒJ3U*%7ߤoW_ݼcm$<' !gEDYz.StTp0Y ժ 1Q~5o>^! $X1fyZO6[ [h|(r+*ZS3PfXD>,=_P@))!=F1.PHKriO:)j1^ʔD ÌYRnA}ۥ%yyyQ( ,,7رc?)#qȑ'Y;:8T_,O:ħ )T๡vN˽pjUȶ+jDE G VidU oi6^^E=<+ jbL/`+1\G~$ B!kWi > |} qZ҈π%uA6^^LP;͞eέZ90P4Tg6T|xS7MXr6!n$ET֒XKHYB+~ڵx6mLLշpcp7L#*ShffS#ZXz7&Ow ٔ~'p3KS`! ]^gf@?z#)?cE<|]Q0gVRקx#&Q4(tlSSS ^UJ?vE%m /rqq%,X0iڽR 7VWgX788Hvܹn:XuUc{4}%<'K;ɨʕ/e/w"G m险([K\FsYp> T^*@d_~o"E;Nh5W ~C?24Y˕{y WDK*++Q 1)ʬ߰$W]~'^`D*@$RiRc+v f;$AR%)DQD@QQA 0g6'}q]^;k֞oӯ(N*}BcXKq(UWi x,q^,]D..5@sN-]I#¥t1a3b{f)#> H}YǏ_lr`Vшq&i*upfpTXxtlAySy?*&Ơ0`뽒eXU 90)-r? (fwQ=߂-R~0HEAKh(Hڂ|Cٰaٮ65v.%%n6w4;t^b\of )2!"M!{[j-3)%yOɈTQ)?o1pZ@%ՁǏQ!p0a{d2c &~P#4X%"Е^ov{k'$}+NH.1%wp֙S4W)C^q["<kLSմ*/!(b3thGEymdn ٶ|pgv\(f$ Av.|ܶGoa bd"זpY`r5$AX>nΜQ߷l1A ;]OBZggG{.|wK Remg睟?}0FÒ%YNHչsI2̗:fgᬧ0/~C::wv^__u##k~1c¸=YZĈ+Z[7"nn8&{Β;mݧ܍NSSS777xiiw5m?jAsA222x<|!k0șu'681tttON1g^~ cW !Ɋ6< ˉU ڥC`7;M _g~%XJM-BXfx2tJQɗɌj.Sʸ?&i/;!!C=U57h!)PY7AeeAs|82$)nחX$ _JBϑux|lƎ!+jrhdoPpF@SbEh`apsd.y شAZUDEs6otzV5cb;*i o/W:)-;ż:i97l[5b![ҭ˜ƲypM1 >frShd%fiWQFns==}{a5oޜV~oNÇ趄~oV32οɭxx?={RK4IJw%0R|Vy !MVJv{}{}s(+ tbMa͠rǎ$'/M^wAۊܪ2]V˴ y(ԅ,$ѣ/|)Sȭ a@%Y~}w~5.24^ˠJj0Kdr};Z<=cEK$.'Lp.|tk`%e0\EŇ|fˏxm޵/_0OI:STTXItfH{܆ѨjM<' rښ*8-XCJc89k\]rqA/!0^ݭ MX찙}2lj͚a6gwc=z3ο*t[s\ V?_yZ::;9%* Bkzlg'0`!tmNeu~lPk5|yAiYZZD01l}̦^qItTɤtuuMzQBl۷8Wkw[n+򅏯ƅKLLi4i OӍ(so̚LޞCmK 9ph[:; p@LZ gM"wT$n+~a ZLCy{ u5!0("nhHj9"^%0K)xdoqԩ<>9r&.j0ސ gOꈉ)\:{W dȂ~ML,Iˇ'+rw`8+3gc|4L PVIυ{ް}Y9v9?3j%_>7~:22@;oCcQJ;>K7SndhEI;C,}fEy+ԯT̼qu#2Vf斩8M>~ٳ666A(iKs4l4vha2? QZGGvժU+iagX"?\n䓋캰9a UUU!H.|7w|5ov͢ ˣ+8dU7o>SRw \% CнN# :baZTgL&7&4׶޴*ݸ4Xޏ4+- 8p 'lr՘uS),wFa Nb/C[#xC!y~ >.Lprj`[⫭'VNؓZ(BIJ[Ә8|ca E^NUB}>[ xz.B|e*~5Uvky>c;00sh;akWL}a˟ZAA¬҈66N0,(R>WoM6JII1 _gg픪 CjhhX,6Mӧ)+W{:;Ȍ_ЇF:d>x{55]NŲ+4o"܏ЩdY\'Wf$]D`_@cMAJ 0DBsxaÆX#mqGۈL&L ĖbZFi+^zXrɸq=)w:YY gÉ,FWcP] H($ĪQґ0~:>K&شw+I#R4(.`p)Q}FHHc?u#D9NqFW[đz`lޤLBK"M=Z|&Ժ%!Ay1+saOr6 7 \\0i"O`dG99ƴ뺳Ͻ5tkrϦY(# {}K ɽw8O')ɣ+j +H%\yvrV'ebHJ-AEBKʾsӦ8"3`ڬgd1RC_ivyB845{?yWP[*<_["%z0kx_6VbV#aEn禖'4Dg?XQ>+20qj{¾A 膽V UT5l9JnXc^qDC1$*]gQҋlqKr5 젮ofIA[T@|pÉ^m?9!9iu%Y1`Uu 4&ɞ_4?Oƹs. yW hܾ}{}}}rej5;s̯粳y4W =sd`3bXk^3R3<+{Fv+Vx(ܹ#s:%cIL7?ba}& z6yWClիxXg5Jr|)$-_ྈƙhxE`hL䳎θqVMM_Әoc&g ]+W.[ֆ4K>JӸe@cRjK`ZS`)U7!£_R44#G]&nfL՚0/g <ȷhV)_rE=C3#}|$vYl (RiltTd.s]s6Ĭg}gywyy?Kߙ?^wYp!Cuknڵ z"Y z7Gd+?n|<1ؤ׻>\ZW9\LЇ;?mwre憜_'Ǐ]\\+A*G?BO+'.ڪʠ;wR|-TW߅z<9ݎ@}eA^J~4n']Б[9*l-5P65l]w3+E,sɣ6K܈{FXSxP9Jd>ۜ[.2J6o6ĦlIc^j~h 0իwc?7m,+F "5u#Zn Ya՟W.ug8y;W]!df2,uлwҮKSS]vsŸ }}5XTH29:y2df^׌eLn$7GF4G а0}~G(ۆ)m:\Pj Y&zבThU| `-F%JG>.Vmzo`8 Äco*̪˫Ohy1/#:%$/d)S&ggVĆ+aX@]7W1ygD&\c o6(**r>^ Duac 97htHH6_v'wžt~xu"8d'ۓ)˂`]![}Qڻ 8O72/DR*ӧOg~n~7Fha+Gtb '_)k|uZĉݏys pgzyx큞M`g7f̘]~j!=ږʿ/5hT-؛R0 :+uo^+=<}CCZw+aV*][KKy̙G:vBazW4m(Y b9\ߨ318̛AJkԕ[l9#$toC>(eJUC`NJ}"D6 g%h+|7˥ŋɇ3h[n*f@)3#Fn:."@.k===q1]|qإX;p.x$\:WT֖lsC\97n@OiByj$vT2'`7]818tV-8xK.9N0{9U^-۷A{s{vժU"""M^O65M~|š_N=ڷT֘v(-ii+r?wnz:??A{11d"ܐ!C HCO@=5X[[S,^TCfkVN8Xǧ{.#` QZHk@XL"{jK8 G LJ1_ nxȍBk&&d5BTIFc#%t#YH3y鈯99]4LuOh;0q#_V8bjEC?xH3@B?dń!!d ]#v 7f.M&1ZǺ<~$UF[+թ&ce G>3VUp!9ve2icֻH߃cbֵ(3k]]򟉯7~}g_ݺUIII *hrm=?NVM͚tRW݃i4=S;lXt(.PHA؟>=oBKgуiix8HJn6$NIq7n ^pDJYH}㊡X]fx]l6[YY<?P?HXUf43o62,ccTPڎJsgއ.*F 2lv1\ʓeC~]c鬥e=G :ڡ%2 A i**EU>adp!(/P+y%Vc')|[-ڰXjunaحY̾YeX-0o翂 C~0@q:tL@:edof$DXOaX`vXUuKFT%=Bv =PFH{T[_*Nާ]#ջ:WXz 4g^&L;sÀ#󳌶풭dTUK7՚W_A\Nv =_>uiU4V%]$XnSݥuuǟ<)?> #5ۛX(>OR޿fBгiSןFFY)ER ;jǻ+蛇[,Wt/Y6&l:**+W,QUExH;b|qTq3"cJܐPOW4_㞽%݆lnB_NNgY[ea$͜ybH9+*r߾KKa rõYѣG٬Ɨo* pή4 ْcuj́(L{X~v6g.jl lz _}yV]X$Tvs}@MYY퇬;%v 9jw4zPiqfo}C. 8t 1$ N"Ų.Zd0Y/>%gά1<:GQAN-,,+BO"r&G/FY:+-]$lٸ[ ު)[p1@|u}(HvQ,zdh!F|m\zwVrɤ=tK]*;At8}/dWbz&dx߹8dd{9jjjjll;ŋ um?}zݪYv3;"z _d ee"S"i'YI)((~ ?C+Fn^\)NNhGR hD^nN[0(+y"Tc*Aߏm8z 0R,$(o~ ^I zyn2>Q _E^VG[D"ޔɝdj5kUGCh7H:~|7 V-1xj̯>nFh< &CľCC}I2.'Զz~/h APQWFoۘ``H6T﯉1f[p`k?ҟUp&jʜ隍2G ΞuC=>FDDXXX7S`ڽџVCj9s0vg˖6;zMMiKϑ;DOe!Spp#~w&vM{@8;}„ ͘www$2}I92XY֙}uԨQnᎇJ~ְ܏]"].c2wՑSʑU|/\r_oPXq^/EfBB꾢~||U8m@ˀ'.9rsC Hd=(dy8U  ~XWR_ IUHEZ"iCA$eo8rm <bI4P>>OCǃ~PhB Zjϝ{-j׮Ύu~+yݵdApҠS&`1+־Rp)lYS۰g4:|3255#|ɷr7oA!P.̙k%ƓKOˇפ޼SUnp4\J'Bp\ze!ٸڞ?I}VK6<)fDnS#t{V 5} sF ,߿{cVizѢEbbbBBB=66M_>~$qK-L{X@ $anKnqZ:z=Fuo8MeR@Y=0{E$ʞ!Ek[1*J+Z~ڏ&<:ⰋEgRh' ՒJzW+m> [9 0~{b3sӒVC&5EQa`q世q_^ ?yIƪ%߸iGgǎyoBfOC??MZ__{JiܵkHyqHLw.v6Q26为:o7scPWSzyVRR>#|KQyentsȖvYc% !NlqVWi(ݬ#vϻ *ޯG ӧM7M)OUeF.ߜK;FN_-^u0J|[d7L'pSGiRnNW˺l%*(8i$SS]'/=8Gnឬs#>s-4A>TFqƅ/&zxmT؈YћD֖gi#dN2J:u*]S%HSϣgbej||G횳nyWFZ[WJnn!%Wil Kl^4t+I1psVy%墕|:e&3),9&0g5[xA]O:LWYqX/eT)WDNjڴmD^2nc0rHRЩ\0Țj ӆg*'UVo;OT%S 58ryˠO*Z=9o7g76j|~ad|˺{}Rw/_s@Wvܸe%%,<_ˮZRܦ[[W9;39,--n菑*<(>2IRRR%~W J=BL釬򔔔 K{g\ Aٷ•Ů04[rcJɐ&c2z`EB] Ld|6m&L[*&7 h?ǧZ ^xоՖV$PfZaO"R pt4f rS3/%fM;Ps1걎׋|Ξ^^"0ȆSFLA#p\I"F7<:y4d®^S&}{}}5W;訛c iU iqij(q=li&Ą~P-g"NhixBM.7YTG gTM6E̶%|nHͿgerJFeԾ/oD:ۿʼ}!}rM|0UY934U_)[|Uys--FY7 lA1'dVTTTQQ<> q2aP;? 3wT+AigC cnTM]t2iik ?cGm򳈯Nf]9Mھ_B<Z{`*|pr|z0 x<]++i_ Q> &ҥ'OlA`\Hή v.ofL+xl6-7lUuD9>{:JhYwC!<1cS6EP>KmQF#==Ac,*S2xL浈k't4-mȨe2!a9 hRX-C_Flrl!K 2 ਁz?_DJ?' uvvu'O P)k#{q<5k B(vοpT(UuRsgI߾TP7dԯ_?efjk˾M+@411;>wzs 0 <~ʢ<"K~Hy&L;w.\<;G@É*g5wZ7oxQRd)Y*N.χ{\G=eޑK*,>]Y9@κ *HK#GwwC sՁU'.~gmٙ{`ONSf:q~:RЃ{U<*zpWSC^J|ej9RUUlg"2ܣ<0$KR.mnXHXZ}a?F-2]&yLsrx+P􏇟=#CvmL6|~XdV՟b`{ ~v6r<(x#<ÑhbHhY0(3u1{2˗_j &߀Ρ>LӨ%zƄ1*e7}|9o+i._>1lC5՗~jdL5 z޼554- KYxAqrO={K +~&߶ejKrR!6&B`~W۞OIL˜yAr; n0di…3XXCP#.R59bP|=…hRa۶m=^ke3{?xpC.D~'_9=/hlhn&gϽXbqeݺ5Ԕ^:uATU|^*Ͻ7¨ Ѧ' @;XxWL2FrS&T*a25ֵNXQu;Uc]v>{d6B TF EZޣG?.E4eMj=k%dP头2nseB z5n'''찳Ӣtv'mg^ʊ. @ ^(s>嗋Ԝ|N$]. FsȽtGk 8$ 'w3`#%HoݢiǫmmzذRģ8k%Gq+5&oP,(öI zIFeY }'ïNª'ʡyҤ)[\1!˳ Kێټ[[ Փȶw0noD 9ӽ8aҙ 7,e7W_a7<9 |Ν;#**jժǗ.]*%%=%\I6a_9Ϗo[12mqc}(&S^ ̚3!Y Zgg7o0UիPc&l HBWP zo5#:Em`@v.C{O$*(?/ogCU\}_#WԽzuSBt%,.S[!}iƍ+Tyٴkp6f?Cc,d܀P.SR3)30bj62;vYEki h/4x7ܬk4NIU)!c+"jŸ%  Zp{SLF{4 I% Rg"A`u73[EqX K1Jgw,8}Ї#WrڦEGnWYLm8aذa7"U\=Gɝ##c7`t`>y{Oc]kT3b$^ 8;TtøfrOf 6W_ut|$?~9~/iA+~),]II-F1zrz?{~ۓ@Ԧq Z$ٕ_5I[`ك|ֵkQM'R0㌹5jf_l2ȼ` .F}zʹ(,u6YH12cLǃ1Qv:%O {B2/*>#g:9s?i{ Lk%7Bh- 2˗ |GΝXgiu%% e]uۿk*McԩSPt$b-cK ]kJJ,J;!!AMM-88XE%_Msnw] ϊ+㫷o߾>w2WPe0RysV~uUQߏ;`]3'cEP<"-O4y(Z8ђ5#.8r[$ E[( =sQ{K!ϟB?RwxKw&FM>M]$9 ȱ/?޽ws9y˺{wק\!7s\P?m^[rS>=tr$sŔ_^QQ122RI)]ٿ '^z7=eIrysxZE,gxGGC%xILLc]uAr t|ZF]tE!pFG˸t'Y:s%J2['LA Ȋa"cK Bt."} Ze5=ע0[$1<<_Q6Xiqtk@ٛ"η6#}0drD՘L$0dr=E?: ͛O՟‹-3ptrT@Pr|Ist=|Hᫀ9l+eu˙ CpHhG[Z4K$\$Zz}I逰J/Z3  ^DAj 4dkcwv;O *_C-UrD5;Kbذ,vdA(F@@ܤ2:7gʝ" qw<_)g|U_H.\0+&LI EpȐ!=7zR)幹͝SUd?ײCfn듺kt򬧩\̣1Q:v挋ͩ$UG>*`k-]o԰S R &1}LG4[+1tJ!RIj, ]; ~7ff[C5l&?w 5Pgّ %p>̈́+o6Qlڊ,d݇۠sci#,N_mE$R3(1]BඈC>IJeq5Vu KfA] "FΛL:oX5J'"͹!! 0uC̳yfҷ2(ܬIzZұ/ѐ/._|o̸QӀ]r6582m' 2Wї 4?/^ `|qd89:dS?e&~&5ik(|et}}WM1Ef[yӧԵ?o;KW.]*) yRpep ;}J~\ÎUb 6Nl97۳HǞ$S!ygϒڋLҕǡBC'ǩ1xXa6 s{o̚I EOyXkO[g W#_^dܼ3 ,S?Do4)C >|q`%+e`L[,⏥3pEMzM;*B(42U>Aqry^ H8t [w #}qAuq'A9J3aի3Q~IaF>異98smsyA1!,vi^Lix+<.Fgr \^ 2Wa#E ]%xSِI=!)S?pŨUځ=7R)׏7fLJ @<|/~~zqXWĺν>vq;确ΣT 3?q"ڵu(vM/<)Ih;ztMqk*n/$$޿[FKk#nҏYwZi&[-YHVSؙmT/ + PxA{qsCtR-*WӝGRTW'7Vj) ! #eDf!Ka)2oBe~F+k!g {|ܭ!wxByXGĔ!aNh tL*r/3*$jN! A$ IrƀH&L9 * *CV 95|uG]{sgul33S8'Q{dO&G{O, k4_<^+E{jƓ'' v194RP2 o/mi-R899XBJ*AN dNI'3fsfJLp( d}C17)3zF~"973/Ϝ ݽ̡ H.߈Z :5g 6=M.Aueã&l'y>Ip1GvW˂W/Es 2FVcMofThAG(xV` \&V52 $N5C KAi#qin>i!YTTģ_>jV4_rI/) i } #;rI#ì؈hP. tszZn,~,^oz2Rd~ L%o<1Y"͆>̙n~3ji|9d2-19n޼ӳ~^)x[E\ehh8sK'0p%L>cT e,BRϿ/OC.(y++%а.D6 *&9m01<}}B@wh2y>,4loc !!jw~e55GVUqJm\ׇ[Ar~Ӕ̍Ӌg烨g_kC~1u]k&*TsF4Rٰ 4:1 G/rwVUT1[q&m2F;Hi0mͳF २cekU*s秜9 ukRG@TU3jyU]' A M6xﯲd &LðEE vZw`;׋|XAK;|"$$< n4O?o9?ϗx\+oOti, ƌد/_iijD|(eTI3J_%y)i*qx"\Ey!Ԕ_lE 3sik{qnL x%LI :((4)ftZ tj8`#vˮ]<2r/'g8~ rqC;|>yC׈+;i;4#HY" "_sx\"u))$D63s%㷏!+jZTpW=feY$TRp7{,t"i MvWR[ orrd,l`zrC|UYH=J:ߒuZT6MRe켑J͒g-&FQ$(C:: oU |#,I/tEƮ/0" 6&]_ē+/ ?nӢd\eA M {UTxL>pW}}!NFV`.OQari!&wg}{[3)FQɽU'l>zg> CTYV㎉B1"",fb{Pv #YwkCD8Zjqh?)ȉyM곲gH(=Rb%( ڀqL%-ajZd{Xŋ\>)`!yZN{u;|9{N!ffQ|bG^%ұCZgf !/kc-3,̿tV jv0K쿰<_WQɣЉnܥV'g }Z6G*t/{=n|2 >ẻ]?G|}}32Pi3Sjn'2B8xquM}kbv%^U[ > QE>>?C(\ǷݍLK,zI:|ɪ*oݟ쩷o&LxJht. Yz;ӌ;wҍӍ+r2ALɪ8 kwObAd؅^뼉Нȝ8h\]'HJ>}M2>VbMxD #&ӣI/<p@C i|J[mBAxXΆ#@y˔u=LOro9sFt_1+&.xcʝ?q WUyXKׄaXIII|ͩKADn"cࠋ|io9i?(((@xE+$K 8](;@&L Huܳ[zL/wǐYG}Xdcp>8[h_M:k6Ç:B,9.G+*h±m{-&ߗ8efW;/cufOr=_2T9k}/EOhi}G8 uL=<{w:MIPJ9u1H/IHڷ^0D$](ڒ§u5KԲyPܱG j>N_ʣ-գơ$mGxJ /.e uKIq>$rATs+/rmn?*N@CwU)h%GSE/Wӿ_uw/\޿{[7+8ex %%%)yݕ+|E>^hhw;hd0ጄRUJTÏrPbO]Y^_q*;B;tFԯ;H= R>Œ'/$ՆG;B:JFM> 5n p8J~9)rt_}=_5b76V-2HƜ >ܻ,i  V4RlIVV6(KmwHq467sX;cp _+(p(㞥V5g,Y;L7B(m0.U BZZVhF6ߑ߾jAaї"<T'ޅ zJ\v?OM{t*rG|勛J;8CG--6_G+3oތ4G{l11Nڝ*V|]ݪْwGl|ejk/>L5 9=}MC M0y<*< k7,\TO=ΰ)$ba64v k˷1+&r  hZ3*wϘ d$ܓan;Q=m bQ3{ d1}R'O 1оwSEZ7 CP|e%%_@gqmv0nA[_<×s*Ű3D-U%y|~՛Xl:m=I JO%_YEN<;[Y⇡~D 5+wIG P:9U~r()Z}>I~#zps.==bo10=}ȩ9 "H~GF=pVC&@}I'IRq8ŕ43Bv" e';~ߌn$Bn _ܒq9RZM PAUQYl6qyZT^8w\٧ϟ[ &qFѕsݭw1aY`s@dsƥ_=x#V/W5fTcpxnzیch+|P \}RݫWJ :\Rd76)*J@65Mw\7th Ł15p+Xx~-ct0i/PQQG& i@DUcDzq,sqRUt!7/Hfh=fHų\;"!tk÷A˽Y"`yL/ҥn+)؊Xb' PUqU?͎9\N%+fu/ MMX˫(vm3:{2\Z|JyyOׯYSI1^&k54,5:l߰O[X3\q*3 y/!A[8!aeC|cc{{sd ϵyjmG}vGOF}}ZnWJfpqnpjD [B |%zKY,bF9>q,jT˙+ENLCfԒ!.n`Ɂ"XNޜ9cڴ7BW ~{{{_u"wȇ'706q,{9"Thk\V.T@ڞ!@Džmhc.hqp@n"RZQrwnW \JNHqQ&{ ;+J_ 1޷4#rn9)E;loP8r\,3Eonhj$_ -WḩH[3b )"35KDJCyq6wo|;ݻdH k}-4iߧhN8AͿcSz:~l6˗k[X,7WXB34ֈ=d*a<>zʀgEK@mx׷:vwln7HRv3RuuR>\n$8n XkgV+ro>B0q NWW[x{v 3idLCZ54N᜵}ٜ2n {+dpKS$~,`$'j!ƾv zL]GR||Qys _%7mS۷h]Š4~̿g44N* [߰s[o{{0p7hl<7EB;,X/{>;yGY{87%JWM'7,{׾9sCjSO|=L tlҏM=swޏ{ V7kbfmwn@cgKM>pOo^^T呅]b_fl7cIS``L4zM$cOOZ›v40Jh +OD̰K rt#BeG xQ;;#6T{2 rv>n˅a'(9i.fDȦ7:zS2Zq451r{?JkבwWy` [cT>w5y%rsR$ [or0R՘ AJ:< %NQ9tpgtD} >!]FDgFÖk.m|yHFs8E2 ɡ[o`,, "髿oWӧ?oZ_S#[2m4cd!Q&;wӊrz)Ae-- Ι;X htxiWW!6>l2i:}0qX$IMYY("~Y-!(Gh D@ < ^4Ojd?#8||}=^I,crvmyPca솰 |w"yj1#NKT ߿*>CW x}}y< Y+Wvj: AU ~뿋(՗/ygϾ- _)?Sb7Nu_z֮Eo]d4BӲͥRХogJH1X,gVdBURiӔlށZ_>< :qq?69[aL4)gmum;P?$fXP!!Zq/ɥKhd0p.x*PWER*@+]o0R|5y c{ ^mJ.)/- [S_q‘w:Œ*ZѬ6#Sn_P1m\(LH6`[ሯ hƹ"} > x jPaF7h!wD2/Œsx{ ;?ʩ$/bc83j;%kuu|ݺuLJg7 PvrK&2V#Ab}K ={ nI> gߡO^~X@-FfPޠA]ʤbĈ8Y.VKRI ($rA.rx,'^}guCȅ'{y=عQXMZXqQ57776V`zU)\_%6|st408LyxTcOV" }5qސpYRٳ߽ZY[TU"#HF2Q+eiLz齐efYD׵;wUPU*Ռ47@.*˩Ҫ yW!ÇGXԮv/ff\܏=B1橕U+ɓDroos[[}~W^<^ee+BA 55w*|xe/?YCO3ZYy=.y|8z)ᬫ %+ 6Zo?G]u, (AMCtl|ͪ,N}[m5In&=C*>5oL9>,ib>scxծ1@+֮Y㙰?27t7"xBr֦sǏc +*0,A$w'X,f!`Wlmɘ9 A-oW%rC`-Y[[5pcC#|u)2|[<>vvxNO,6B:|o3w JɎ,h'J45klarMKɽ|nQcJ DLG;;;mm9yP>bW,yvYZQ=++mP[ Wة0$ԇ65`:G / QK*DO!πR[D2L3EFwlf2?,A.'Ofe!*KFəlb!*zkҏ98|ϫzqKHdҜ9s~eS$HOUklL6D3FDAKfLVE 1;G]Q`}Ყ*TONZyExX$K45fl6"_w7o$uoTRɺ &_*iofW++!uIi% rr];-c7h*].%BsEO霺E7diBy9#}6keH)5cDŋHqq_ Oݕ eWbq ΰNHQяrvQ:@Зp7vK,(+_9a ,_@e_ .8<ڢJy|\e1)h@\q7GَV_ߒUVԭ7HFnz(8Wi2e/8RMa\KLD|s89R=e\QU&Mha@7gg)M\^>^oGPtW;_.X:^հjrjkMC*87lZzٳ hM;>%]\$$x)s!KN8Z=L>_K^㇇fmlp)Ƀ%PWUIO+Qc/:̽&&_ _QW/^ Hk㩍K.Ĉ _ 71IjEr/8~eW:s ~l5$cD嶞\oDYE.:mTZ&S6g>+)DuBa@|-ª_wȭ] yDM̙C]z` aWi PY^ K+b KwZORdˀZ;DJ4d[Sdq0iG2YFS̓G e-\'%IH] snks()Jôir2kMG{1X҇ZYKaCEDr_\ \Za6B p1B0 8;aB-oq2>S,#|{Ka m 2X-G +_Nf|#Tf|[[?hkkϟ?3gC%%@Od4}!oz2: Zyq::߅)6oQHs8'ZZtr>5k%3綶kl_n'`ߛKoq9;x@#JI} 乸q/e5 TWEzܙӻ@&X岨errB K&+&+&M!IZP<]\deŌ=JnMa!k,QԠn)oo?r 4>8.4u* *kA_g;SL޽Ke4)^Kx<X#rqa GNjpLA-ba4)POF!5.KI^S!U?.#~**< f?@CZWl*̙3;100W6uKJ֏ʑ-vn%|>LޤM~GEɋJ _hgmuYE`e%0ϖ$HDOf|d]g#VF<4p JJkJcd~ @[?ϿDiX㳏XO3^gQ;ʜ<6h˥KM_U/.?ix|5rR׽sߥԹj'O([`O+AkQ *'͊E]:4VBf%`Lh%*`q-N=ӄ`2\ڰ_E*פxv)cGmSFL5xtpI{4JK4ssvt pMf2lhys˄K}(?_Ei'/Yy3zM9r%+HZa]k"w;)ܢ~9}z9Nbo^S8U20#ʼ*2iHT!+_Nf||g}imu[b~zh?懇CThIG7gΧB3f:ob*[Ztf%4qIG{q[BfϪتI|D9ҥz#/^44ڂ1kzi 5͛wOa<ɜ7w*7f Z*6Ѣ)KՖÐ#kxҾ{B@g؈lRH~(>|81Srpp'QE. 7 X=a&9o;)$Ymڐ SW6J=u"LOyd|!~メӰbaYY#W!Ŏiިrnwڨ>Yq'ޏyݻ!}VVw///oo_Ԍ ~X|^ . $%٪,6cիg6ڷ\M;/,5e5#(Ppy9:n}C--4/_N"f8p!P|+?[?Y`ҧ7eٷN^NKjj5#y(2g.\q LCign#VրB`cJ۾4uEDDjV-F|3E G?_zR~ZU]Ƿ_O!+ >V}ċl D|AJ>f~Yk ZN( 3i ᔵcTQ+SbG ,6' |gIE[N3Gr$!t }GvIcji7tj֚GQeE+ " IIz^M/>cSɕ&* et÷rg!R8WW}߾hQU)Z- Ve _zuVy3jD;¸!f ;oW< }{ßf&Wf܉N?񐕕%4zh2Ȕ?UM1ށnr8o]֮婮W7N#_V뺧Ozğ^U˳/pg`AAT~pp=?@~ ڱSc54ɅF oO/Cu3 CZI<8Q߼Xj;挑#V GRRNC@OJv;2MXXǝk؍zV(Sod iKb|d|ǹ>X̜v 6ǜߪglBmd#ŏ\W_[+yf_W~v*ȑ#++ՖEjyyw* LF 'B7E~Q{S }aO GIY  ÒxۯBOKpkp;\/ą琍oO0BsG[J噗j&F͇) /9p*g%yT{қP rdD]8.7U;_rfĈr:p+aittHuiaSS,KF[[7ܚ9~Dg%|^ IR.CM;&t_Ws@ywۨui]T^IjyDD'TrN&2ZøB{m~Jui9OU4XHUXÐ@sQm i+󒓡aHQOBH@ڽ=?J@o#7(=%2 JWBCy[ؓ1`iU>-b*)zP#Aw㫆ח}zO_ߌMxOgۣ ywk 񴴴℄ȗ3j2_:2^_HV?noUΧ .X6w!m{ŋ%5?.$޿{qe##aj`KI%[1ss_}zf\bl-r!%"S[_vEg#Q9buUU1_z'CRxsӉNn6ݬ~Chi{?.DDD9><@nx~ۖO(_܄- }_r%8q񕊞~dT-B 6׬:*rvoҒ-dRFxT h/UK30t3G [A-|V3yltT|. RٯL⚮G|~\3IINEvW1.NJ_=xOѨ:ڛv `b;ww㫦]]3YSùu+7/CO>occC Ͻ7i0 %~Z:<ݻy.]F&, W ȣ>͸ɷL0J _>bau?擓OFzy۷߀q5r|[:|4#CBBI'Zr9)lYO~zӠԪ4Y5P\pS3T+'%-HE HCΕw}k OzO )]b6_66&aBY=B6LrMRڻSsmӑq,Sk)0[fB~uj-;on+y af8 qs樈,,Ψ]~>)+jXFWUu9?^2HbsM=x %_}oW'%)gM=lkO◎I뵴 :Z`dV6)9'!ϸ\#W^g֋[ 522tґy7OȔKUܜ0ULLLTTtGEGUi y|5k(G'PWkk{ήp)%FK厫I @OQ'B)FC|h2fjف[JH/1x_g8i5T:pU2z8:}tbG9]$rd9}a0V~a>cLڙF3'c/@Pjה# [HGŶzkLiŸer dΙU+ N;DA6g+w jٮ.rS|ExcoزaV}{SFp9D/WTWsgfǯoE6xݟTА䓳>~߲͏c/LN߸1<|#S)|%/b ϫ[iTһ7I!__04m3gNm͛kb>JO#9S=X~U...VաCj05k7Doomss{19B|4A:,Q !RH_O=~wN/˝d~2C|5i̙qE,-Fz%Yy!zd3>Ya|>ߗ/OeXvߊ)))kG3zRYFۡB=;S̕L;3<ϜAuLtFv6LL g*)**0JTT>E.7hG3*6{-0tf oXno@)j\$޼I>sdYYYuuEرF+_6kC ډb3 w&:kwˉ>J >(R!C R7?V{?3؀͖-2^C ",y2 0T N..#Sȟ FN;@4/;*v&$~ }Aؙc~#$\aNr|2\3Z6wm:C>\2n@՝E Nޟ>ᤀyrwT(7!v^6eإ bMIh&E/o\$\DhMZQ\t |Ww㫎6g0P CpW!C1Vhnnc~W]QBX'.kVN!?ðY%= j _C *)==k|es{V!Hѳg"g" 3u nJ{*z{KgFc|H6Ym͛7OGGԍ² ^a ~ *UѸ2z{ve`?2TcctBMښ8Ps[I(;~۳GvDWL(#%O^Ç/DǭqM_& ]PivsGd/9`@+4c,#n%Sp2Ƶz )2K̑.r;EI޲P$K2/> Zzܯ]m2nzJ>p&p5non5h5R!"R 3cP$Tw!d&d gK=9>LJֳaZJ5jn^85W nl7=o^qyab7U]} VWhTTț`'!! D)n&R^xALEE.@C'F]M_zFB9&Y[#]ٽ2ҭ#l0f\&!Jq9*}`;?jԴIХz$!6!gGEեpzd΁<1Bz ,h`w7u͋gxSZY4c 7)y-J,n;C]]9ZeWcƦO:8XD jv(u_E:`'+؁-[ݐA{JJofff^^^^)SQ>I˸ڃ-c-!Lts梦>w vvw]qqq7oS^0_8_ 8'rF byS̸ᗍ35N,+PE1s022&:uy+9xƴW^ gpFs'JC(M^4`.0o C폖IYVvV8™0׸-h?֒D MEGrxH46#<="Ϲs/(J d4;yb^Iך>+ 3qwX!Gk**Yu#G_ռstksQS Ioy4E!sO9ēXsۜz~'QCTOӯVtK 86ρXrKXu׋'+h*)۱y蠋(IWy.y1Xsnm:[QqgdS (Ԇ@#GwWO ~T^џ 6 Cƞ˖IP ޽K\ ǔW+_X˗Օ+W.?nQ THa29SջO*g 3M3pM`;)75Z1H*pp0SQW1i:c/N|d,ғq! ſ_ݿQTD}{]e%#;viՅN; :zMMONR^ND/{2=j*K ֺXSk&bI'%v8:ڗ$:qJ8>yqFŗm64&^k'O8*g ssoXM Ol/.<>Jhŋdmĉbzz y<ٞ3 fpW}O{u+Jd13l#6&1y5 `ȸ"3-س׀%|F.yGihhX>fL z͘#Ͷ2r*.TcX!e-\vpec9v8G:: )F::YSAˬϲ-l)y  gqǍ7Rt ~5>='U6ke_ ʪۀU4N|umFEqø >>܃Q f55w0rՋ\*vdb{V|m.lll7֕CkjZƌ2k`fF/Ȏ1b5+(]Ğ>kZF*]6c &IjmzH+yyj&L@d6*M+RLqoNRXْ KM6JB杸XϏUt>δ^̎Ҹ(7E둒̷3<,C<0O>lZLAG V6دΧV `1)U_3y25|?%.[,]vSZ5#.3|0}FC-XZ1pV㝸Pt(,k֗k,Z?r!KHlgVR;vsiM^DBf,/=F;ﶵ]d$oa@LԌ_WԶ$^qמ={xMrElذa*11$'coϳg>LODv-'6k?oq~]GNz5h{ӓ+%syYMDZE,++ο~ڵx52|/_>]GTvnMШ yl5[K(CX, e> ϘfKE>/B֙8:-Ma0oa%76& .m8鷼Kׂp,Z$d0‚n**cJh{ )Gr~W⮢!LԩS}:;Aj=ux8G`bm:S"Z3V}/Unr m=Q}4"Lawh3y+vFsD5Od  ^|E:kk 8'xzzZXX <AwtzO2]mIڎc Cut#8K{w{N6>'?ቇ1X#}!Bh@ү2:x0Uнn\!Utv jtL#=uF\}slCEG g2~~~/v0 49X+Xؗpo\kƋk~B81fb_6)2%φUg gˏN V Gڞ#0B=^Ji3mYm 몌2΍9I 兞Il<= 0 6y=zP x-Oog^δc>eAHĐWOLq 8W-\9)Rrpu{Ó']]\!?8{n]Ko v~~S <3yExhs E o*܄?-p?<;99YX]p]QxvSSީ\^|0;;ܘo֭TMPVN (U¹sY9_yn\/3-q'IQA.żyP9BKr6j9g>S!] NX E(ر4< |qF5t]}YAD>YEW@:@ }<;'uëq2'[clzmg!h&Aag;qσh:7#mw2`yA1FI㇬`n\[~MyH0-#n/"@ l6RbQPg^vw?2""=831/oHaswwCCf^2jGd`vޥu` +ӂ$@ha! _*?9z"2rH3޾}2t?۽7aqƏBx8Wѹ!Cw^Av&;on)_=~ɽʨ+d rw6ݹ0MDGGS()fuq^7nnv7ɯu_O9t q bE0N(..sϑXOuOREI?¶ɼŢtҦ$#{ߣGC*KN34up 0 (4;qIr[YAy-^jz\b\GF78*MRK a= vZ-=K\‹Z!gfdccs򤖊 5L ַ,}4v.lenRd_+IO FO-c>x:dK=/#HlM2 =%_WuD ^z@FiI/<$'']h3p#nkkBq s/]4gss 6FvT% G'Oζ,n5ஒt+.E{|߾}$sUWxŦBQ1$q}s iᣗF6~s e˷o9${}y1 |TH6l OY ^-5Z>CY=&0{|BC ZK+M"H43D8uv׃ͣ5x=N_,q8ܣ(Q2 V&AU1G2(ͺ{{]CCc^P ^#kyi8 AX7zb;%k)XE;41ij $VbjOl ss6cV6wΥݶmc@=WFGXiTzgtp]W]Bq ݄e ^|FBP۷oGmlޒ* O*AIIiu[=!q"V{wR?jIe$mT_3pv7\L(/VbzIJhHw[[sI ẺAԴ29/D4fc׾ .^"Þ@h"m)*5,YH*`-κצU)Tf$zPay׊A^hiYVV&UZ*޾;@Bbggxq1koSJֻo0 b̄L2qI{qCäoœXV^ܽ˙9s;DD Eϣh'@H|EC8d*#`v2M|xgRٟ>}" wpӻ>!#(0qxB?W-;4l`IJuMh+p zѹ Mh7uۃ?!P D(4y~&D<0 3Bkbzh8%||wJppo/_`?+!ፚil~Th>݀Mi/3nzP(d_i-Ud]^jZ@^\VK{+'ǡ yۻX0d8 $%6 NWtBC,ܭX>߁h@OvZvI|.D2}è2Btm1GQJ-yE9_,'NEP*Jr##yEUs^KKK _Dc1sEj9q;IU]]=pڵkqVQQYnݟ P 2Ml7yf''=GϿ0__rѓwo;׵Q֭˥Lboookk;"JpW} [=YR%N.* sK闚5]-sl,j%zdfp1pj8I3wU't!~EeR lT8J>,dykU1㵞Krm|;z4`U):w+߰hJ35 9  op:kNZf6_j6]a(σs2x4|}iz6  ίKW鏁D%H>Po+==;񕊕wzuFc#ŘfbuLLg;zS-D!9ߤ'7Gy $U#رQJA-=W`KL""T9|QA1]؂~,=14"W T,h|qG4 %H/=B@d(}eig$ J9lX2+n+Ji:%syJB9I_I0zA( U?<;;utKI'U *+bK;1c!mv~t~GhބN|? &+*3bVaI=WS;¸(6lRWF9A|( . F۩A'43:a%(a>]aZ"SV]ѾS'X^svIOwj [6l b؁EBY񪵫hDV7X|Q=6lcl8 l*؛~^Ҳϟ1c%c[]ݺսiԕ+?&ù <Jnjm'r&}v1CDX@iHFy?NpJtUQՈye@)_=B爯*t:@Z$DoeCa7h፰(ҘS4U%)yAz),͠gjvmiN!{Xq#bLJ|*VHr cm u=ѸLgay:0 t6eI8XWPyQ 鹧Ozώ>gгioGOn D9ZO⫺6fb(s.NlJic 8!20SÑ`a!-7?sOKGnj>pWk (@g58=goظ|APyaSt^.<,c!ag ˦[li9[we) \rЈLP0J?}h!/ I"^#&,8bRdN3J'>s<`Қn/5%k#lTc2:XMCQ-39rURUUj={w^y Re ?R}6mڏۑ BO={H Br/qM5ygWy={n^s\Rq*; xUU#N&0lQYZVww-[گ;_s=9 [sw2U/:rg>\jVa!P_&C.ʒS{@ՠ  | *ګ ]klܸQNNE8 Rz}ɣoVg u{Oz x4g0ix 4,8#wA0V$8?)fmxoqlsi]]dؒM))V _$U[8k/ i`M/c]J?)=/ y=:YS_"Г~s&wIE+*v%iHyBxUZ[>6EOߔLzbzĐ""5)5/w ͞l-:*酧 vZ/8%9-A&3,isd&T׻b|偓7L@ߛ˗5I#E!퉥EyHfU^u rUqB fczT|DZf@,3sy:w'>{jA.;'Rig1 \Q=̋˻З W\xŰ``uk _ggnhTN6+7%MUYO$\bJyĕyO{CsJNjT8kxe 97IҪiWVO SPN|lڠA謃&lz*YuN>5R joDz^43I #3 k1spcʹٓ^,<<<;v@FdzXEmt:3L%lL6k=I>)'Ovpp]EUUuŤ_ӓs=~E $iRJdN{;ZDUUWؒ%TȻw ؆{٣^λ'?.TXFmm5q**ܥ"TBC`#K85DⅆK7jЁ,Uqte:\6M*^1OyyyQbJtsW1p͛}<{urƺ46:5 { v ch((n=0# jX7 իX#/mpZGXǡCؼ/_LuO)ZSyjJ\I%FG`)d!x1\s8gฑ"5_hn5USS[f?'~~J[cXGpii˳RFG`ފ^|o>u+)z+pv9 JgDMS&LLTQQQO=|Q6hQ6ڵ5l-ٚ|#nJ4+Ly<'ONHx]a)v; 4>%Ee,%WY qyƢM L^Fo>|lTՉk$%QNyzYY]hM-8\GKB߭TGU059 va5M[K;%$NKsn {mm~eN 9݃'_joq+CO6(? MJ|-Un+:] TlA;Y<80]p1Q@kFsۙex|ԉ0x&ו+% m-shy)E|v22ߚN[2L2?|e/|Ӗ!CP S xbYYYzz:nnݺ4-''G_T3\\\ƌ$$$n:pˠAVB6E/gTNBBi޽CנΓŻ՚UUWR;wkѨMCf{>J&NMGy8ס.F7Uv$bQQvqzzz#"6?/!.F:吡NOfFd<,&k늣7TVرcN`P'(?,<Ӹ" j &tīIyt(e#mmAX ӕx]2$$DDdp;Y׍7c*O<(/N6~p|Ky_#44.E>s:2->*5\tII#f }hၹydeMt 67n[ V g?=T*߮J.B%6{$GG]vKaI1m#=򞟑gϛuD޻sgݶ: X# Π22ιu}GVYY3$5΋T䇫Szv]ea=:B7W`|n)H!nnvO(`æ:1KBg,9r~/|O>ףэC0"y%&&MWi4;IbT9 }SR"IJ??RfϞ#5ڰawiV8;sƍj|!#RrqJߗjz ޵ [vFqБv&O, ٻoANHI^7N?l_yqGM7+Mg~`b<7{:ȋ;YYY1Hx;qv q5// }fNb^7.xYs ֏EU=?l*Ȍ8mF_Lh ^? o=D@L2zH`kz Z 0䕷*Uez"Wǯ8^Qf]dcM tbe%`}!cn8WbtҐ RB2SyL>|0??'Zd%4+$WV)ƀ((lMo0̙㯬[@+xYnq$[3K5&鬂LDIiZlkXWFu=`KFK_XWHU<ɊfS|CXH*d IWPg.mX8d,\W7ZLM-oz$`Uzc 2T/_>9Rڟ>Mgۭcy )S0Mw\jb$Ŵ19 'Nhb^kqNJ[GP-X4EHO lm]q֓BBBh&.G 2EQ6yre'h*ZWTeu1vh%rXx@ް l]`@מ=q:hkl8Mh~Xf%%gH>=hH=,r0RDIgw+He}uAX(xh4`;w3f،AVN֗/N*0'FMA_cFҕ?8%&3pS`}pfNsugSWh"eKlqvJ,$ZsO$O,.*ἐXU9yL_O4iY)99_N&Y;aw:z곣woq턐R)K1i tK&xzp]`Fў sr0:aP>K55ad0W0Rټ_D5z ˯? T7)\@5)¤hl&6h%*^~ؿ_9 KK6Bz'D|ƭgy0_ !| $\O[HrR[ׅ N\a?lW?] _=yruBSOlƲetuuw…2={^HHnnKWYg'ݼyk``fÄ3w/IÂ.֩D L"zejSӬ>̊0@y`@SؓV5>~݈-V'a54_?MWWl%PK}fEE EMLdx/`Jaj>o~ƒKMc?d}ǯ)tX}[,[ ᰙg7tbu| c؁nV.[-Wzyy 4B?mmm2q.ju˖ό;SN+/z֟Basǭx>*1iPwb^G뎹  A%+ UN[/RkGPIs 6܅h# {VR B涘R_q91g3_1(X:TMFX%sn2Tdރ!QQ;l)YRkLG{|W:z:cAۑcU :ŚKErUmߎa~" l8Ջ]s\NPބlQs1m![h֠Z81y Ah)3BdᛵrWv׊֨:&p) EU,$ձcmY`]@.X||U oH +5r# H߰$$$ŬETTT߉^lCOF9rĉ>oVٰ#)IMax<|P#WG %q`co㪭U|y(+p#g*l^8 g%` d&༢gϮN ֞ e"}59 ]/ yƌRFa8i~P#h$G8wYC¼a8>O(/i.R Ğfi41],/^ECߞ<[+02׍CgH]L&S==p$ڼPϊ;W{q[q ` BF]?\Q/>pT[k׼2(~_yٴ<#?xDc( _57v_e#Ι3@}0??o޼syhs) w[ō͋fEUBQ xgc*pv>V\D DXdkf>7h&2p fosk UbVBUm Rر_>) +\^Xk>*<ɬ6f'q,{]Nڥłth}jhkxZ!cgOfW)rvnZ>X,+Sa{Dd&ݶmi JLYRz7CVאeޮPCp,!L Qmr8#_ }}-q[1 G{ڻp1"d Nos ]>8DZ%X|Qnb;{DH%,eBkʐZN3lq4++BuA}йnx<0WRp(:X7ÿ\^/;b=aܲAWΟ?_G :#%ؙ+Vh.!2ӸI WW\__ !l1G[_[!(ptWU)68j9n~EP!h(DH:JA&@ b'ĺDTG87 ZPXXמ+>,Xc);nZ)AOx${K,a-|ZGILr˔Y *iq'3ebn\$&Idͻ\@vl!ii.xoA-׋@txr M҄ڶc}O8Pa"Zk&rOZXRFvv=!)$B*B˴{93킪IG37C&wY{Ϛ`f{_ը)IL<4Z+P\x\N>}l]? /{ϟC(ZJZZW+W83K0evo!۷C-Z􄥾ۉ {yOHQtl*[8s)n{WsA#9!=PXt`*W>?,YL)Kb񣬬cAH&`G W*Q,{"rW]|i?pDpOIS62>w2ssQ-R÷h󉗚av 𡺺,P4G~Oګ_F\__<uMS]v{Ȭ:*(#,0r{j`ښvW.ttCf&˅˯phj4FU]mv4`QK/-Z1_L|w6^#+LX@~o7COxP R+NK%06b#TYb]/ ?s*ku;!qT"~ۦq 7mm7p Unmi9@% XYA-Qev*@0O4^V!"E `4Ӎ$S)a}6~bB<0tΚf2xGCϰ #f9;Hc('x&f ni6ZKO~?".LصkBW^^^CH3?{>@M6bbU)*8޳^+޾{z~U]-vZ7lXK_hm^jg/rbSJǁh]o̾ &P> 1WnndJ;{z>,Z4L8Bt$j 1 b;0ЈkӣܹOqʧ 1@A  x:8 >ܾM[={J"BU"U/ˠ 1T SHtr{tiH@<{ !% !Ãv)jpb;,'15Xӓ9J;=ߡҚKJP'L"J`3֪^xd4UbKtHۉ@5!7 !OmOu{ {zJC:M?|0lNTLsJeKrerW._\QR{ʕ |~}2z39Koo%LYvg,8`ڋ_;<%9Q›7W|`grx<{(F'aM]E5pهi1[/}2c'L2<%w >`}C4c^Ep;ŽG BB+11d,m҅3K 0?CCqu2BG \zRAh@g !{14=;">/rY~$$݂eaz '9NČDĩeAU3YսlW >U1q㬂I_aLw}23l~x9H=޿r bi$6 2BasjFpp ~ZǶ(h]7E Nf ˻w KHH9c pFGOl~.Qww_͛7OONqFQQ?{<<߿ϱFsc Mg׫Q#_j}E#ڪ"}}}2gθ}|<{6ˀ%Ë>; j_7K Jq< _Je2A_M[6n{$}S*Rըꎺ0b 8ꕖtIVrn[%Ouq fŻ[8 $R/)**xDI\6̃dglh4Su0DEVǬ>i'˶ kƘڱJ߰:]_BcwZFd~VIIt~4~.]TMM-[C<(h'srr.\@/'.hΝ)eO |ƻgVE߭[Qx;Y׶6ovCFUUn>xv j_Z@0` Eg xbњl):ؗv-ܿO;" PdH^) <@';=p ᵵ ό Gz~}G^(fKZ47<)hhܣ`XS#`<cK Hɵ_;)Z" *m=⹹I[T!/xKeeedrL"ڟL.a,77&ew( Wz/87zΝ; N]OaT믭V+m/qi 8% _O JEDdz$ݿrݺu Bg*2 yxXj ؑ ^//2eBrnO0-3(eXYmt\B#(bfR%A-X#U-ɤdz[eˤÆ7ڪ0=GKE HR%p}3-*$/􋁐oD.fM[v FALzl3wfbvM**p >~ "u`I:JJ&8{ =㡤`A=@"xFZHIPoB.a{/'z67-0ڟJd06&b3lS܋GM3+0? J#O+bݨtle4*s+|h߰lݺhZDK _xm? 8ݾZdʩS_2t ?,W,&`7^$UnLiņrW"ib$s{xTR2SVƝG?'I Lxx8)]A&C__A!W[kW&ݴ2pK+Ț5#tReXXHHU ûm-x9Z\-F@,a]ޅ"E6_WlKgEx"T:qeZozx(¦5~>m$fщ"ϲe7,g(Ƣ%sl=PSxQ q҃vmWaiY1|?&L͜@x-l/|7,.^J4Y=߉ZZ,{~OlCAAoYm޼ ^P#%FX^]US#˫WoqIޞ^rS>3^ֿP]F}";en _/%u~N4w"SA6WI>=ѣ/p˲Gv$i3ux!SCF}mx˿t ,=p$N b&s'a~gu4v݀Y z GUccź?L0`w (s. MÆS(qT?ȒH=l"٪ .#볲W&92)}m77Dmh64Xc⴬iioGYa,! 孎 +QR̚5pQI)X*FWϟ@K7mbo4\՛EU !C.ɨYԩlaĶ -jjSOy/ed` 6D-]y&)y'/eѶjA@מ'OڸaP\pٴӦw%iW];aӀ6Kn 6>kE,;O/kU</v fNZ[4#qt_a%W Y,odK&e١9N3ÇQ U">θN~6cNaYE#3- 3 TvZ0R'B3$6я\yZB_R||֘EC> 20 _ NFk\a✟6waT FG///9 _gt,rjqԨkvѠW~V/(]]W{'h&4~;YPr&ᐼ|H;~JL^c _.Xɓ/p#n:Abc _Ximd6ݭwhsg;]Ino/O&-+P(wjSևlբ{ll͙m_z}q1ZH&~JLVԭJD4"E m{z˥/{7>:S1!gJ+QVU.&4 [[[spT!G!vO5_9s6~5y IІԤ=25aИ6![0z2;q-d ~9nS*O;_fph10wjL[ׂcK!sG7x _d):/=\|HDl疉ѻrtgCn>pJb)r|.SMl:icEVLIL 7mmGhI=<6*)px"V\C'vQOGwAWQpm!ӁF-11"Qel%Uj;>h 3t O)Od ˓"raArD[be2'b"$YQ6k:a3ؙ26M`ၱ^O>w:a%< _ ȗ yO>{VPWWn,7e޽諞hc„ #GtssWAP+{aysSUf~-hPXMr@ڵ/h /lʞSêÇ##㙙Hz6695.\dxRU,me^H>CQkعsQkz輍MpٚY!vrb>aڨSEvtB`1)ɟZU5sRQk *Xӧ%v;DHf]]9uLtr7j(yJ.*(*cp?| 8^`pJzˆ׺ Vnbe9ԼPa墢x,8P+@g8YGw4 vB#hI7+8j~-21Eҥ=evê֥%evo(njӫ1e\b7IԱIqXpF`:vt\#^|9g7@iQ᫿a𐕕ml9uꔜ˗ram? 8ԩ:|sü6\]]^u+k4˕ Nq-`˙ey3+Ƿ샲7{{BטV8Z8#RYF)S**Y,)WV` A_XX,;x99hƑх'Kț̌Q$`C V aDr%h?Q|e g<xѺΠD>}3BGM} ./_} 5LfDr$@"O UOf:޼)1d:)2PjV?wSy&M1bO钳&)qLb ӧUJԶܓ"5=zpW]' ={0fI!w{7`M(s +AbOU wahhaYjZ-|.\ *7ܸZOR 5aLih Apssč+GE,E8o ^^y]r?RY X_/zuhMXa'KDܮMHè fvƁ |U0.=C\等R), $iec>;09غ fePR;}i4д2P˴U;zdsGc ܞ%2%V\Ԣ}|Y\nq~7u>y2P;X8kʩdF &J—᧪sxE%k94f9ю;rp%Wgvtܘ JNdEvWrM4ҒH$ KKKuuuF[R _])K޽t@ }7559s&t.`po-~U_/Ė٩jԶZ7B?:jGy#˨QKo|`Í>FFrX,n-zA]?MfyyyH M0PB>Yͤd-JnFH 8̱Pqa l/ABM;(eO{{9 GoT#ߤV7dif!@6fP(x֏ jb /^fdcT/qVGl'q q~Jw|^#"&;'WzT'VU.+^&ְɓ86\"t˭ 9]m&D24RfU>iG-~M4H84 zU45g7sWjs&p*V.Ɗ =)b M\%TU5~}R(,D71|ԣ>y^ܼirG_ȵ{[Xf+PLeS&s46N$R6 ,sfyGdFӄRRxW.CS [)f4JU>=+VegOd\!߿ǩ=<Z蜑W؎%1gVojF0Vݻ&xvIs5@ 㨨6!Θxh&G+a|Vͭ0>QzaLKq\nQX[G)|$t.Eo@'+ _=ˣGVXallZik|uVzc6\~="ҷAutt 6cƌp!11NXاm}}rqVqgXtuM4oXs)߿1 _I.ꁅiwK$yy$]P׸Fg0mq.f m$=>{0GǢIL4Zcp$1V*~4[9{ WﭯWaqzӧOўh|ڴi?K Hg_(Q1('t.[͛qxkg=[dw?XFe_%AR?[n* Y_h&%&T:$Y;d,zs\5dDƴ“/hȠ蘃Nb3VNQVVbJ>a2d@fg)r")9:tٵutB@r=mqhPm7r0dLFWL?NZKB {LhhLhz9C[v̹vO7(rƋ/C*jL|@ *a38;07;t2lPgԼG8q_fC#0gp4ZQXF##&8\эXքES%B{>Ho~~Mbcù|6,57&x3`ѱ`HpOphAE0~Bd$VUN`C>g 'c)կW\TyOl3JՅf|yy5k )*rVVp˗xqTŲ ܀+W)r H8fOWWط&@gŋryihrqܒ%KN {>0|@'_è$ _in0\D];ě ݭ96%N+۷in40nd;AZ +Rj>6!}B9JÛ;9 (A!٭-0%dUjiP *(p4 :u ea6iCr$["ww|(K*;%Rf$WWK(r#z}ww7vr=^-Uݮq_t/`d݋6TlgE ECwRCG DAgTZ֭[Vr̚!($D-/_6&pZFShXjne N[ZGz<5OJ[wTx')`t0>5gͦ2c]އBi! l - 7o.U>jmf7jhSĬ&gqj$b,f l0C1@-bA/oCDtpd\P߱y` /X@C] (+Լ+W8,^ЭUM&Sӥ`U;l p%obJKq$^Oue+\*me3D.'??%WjHl iq8=s?S6kJLa椉aP'آ8ԢjdajCm+sIdU ?u_mMi^ 'Ӌ]Q.rÇ/^ҥKx8O)Ϟ=[SЪZ>BBBh>]]…%%9 ܺ#Ό=ӱ9/_6}ԓ'\JO"2==07" _&O|XpӠG^S9!C~ #&&粪tp:]\[GWSsM:{իӇb#$DIՊ:* 7NQWW_tݳX,QƍDיM&bق26,xW'裄0a2a[܎gz5ځ44BxxkP4Z?.j.q/_JEN㽽0F"EAipVf#8ͶmC(j;ʡmmў{|!S/RUM298OdJFo.Ӝj[aZaT5ݨLyR9vJ=d4f/b=k)kd +y-ʭtz x)ΐs< Ul0f 4NNJJVV%6L-\`iQ&*c#SlU@PŬˣ `f2}iEW$FUg<=y ʻѲ*Mp"tW~s܂Q߰;vw> ?_=c)6{=~מ՜ς/\hPקm>>ζm9s:ׯc /\_wo\Nб~e))C_}e)--g*oi+>+@Ãce)7扈tZYٵj=NŮP_lI22:ڵ.lq^RXQb7aGK)vtwqt>'r'$hYL#f!e 4KsJqrLD%Qb)xQ&^fz 4P8V=@ŋ 3J.->q.9 Eځ]EEdZK犀Pioc{،!^ ق97w{?׋re*ED27MZi8>.|l ޾&{HHC$$~sb/jđQ$'R]v]+##PW7;^DK.<<ʮ95a[~# |$̈́eÔS1yѵֺ?i;_ӋdMPXGUz֬*B*ooj^!jr$UKY)/,_WoN r>niDc>l͘ >WP:6=8b|&3 hY.El'rYIZ l1`\%U:@aҀ5 0=!XCm x{rQ$yˁJ5`S2x2{VЈy᫿aA o*;FN|Ç? 8={**Šf_nڴ/\hӃ{޽?ޭ$jk\#]h 8N2_/gb+76~;0k֬tzٙ `?Zw&ȑQQQg\$jҗ3zh*SxH_Lgܿ@VţrrASOO6mG^9kp6 z\*s,zodN88w;Ò*C*Y͓G>CPb۷AnO2HT*'EO`uh-1FIBq0΋pa-ꤥ\u/R ]iQ^>}f>Cl(΢N"0RYɘcPelc,2z3 }es'-_]B_(Gco6ڶ6mڣGh+66;}Qng?Utֿ*vj ke>> kn^kG<{+H&a j*ph^hپT U]_{}.P#i 7C75уg쒢%|~ԋGebפC=<rCcį? 6]FA 3Y1S]'o)0Xc` Y @vBŕ6hwu'x1jrfV FЏWSfm.n۩؊%5D68xwQΝ{эk B_NDDW[4w 5FEUy0= 񱆂H%|Uhcmֈ`yaV2 Rא I$2[&=Wgjz!"C~&߰ -oRt;~A ??w۶"3ng 8/_r0PϮWFiǦt˛YEdλ7{ed]z dcqw#!zfŝv>M,Z g MTUu{Q8e- $!٨~%WIL~k6s9$rK|u# >4 7gĹ-jwJL Yl<KKOK%o+!s&_#fPq?E7]Yz8"Y[`~&US`JKK|asnCc-q͐ywnnoz}}yMB?lvMc0p+WL^·҉B Q}[Wnj₅џ^}lh!/ׁÁBR-bnϫh}5S|Nw+)#||Q, 3!\C~ѕabĉ䌩2yhm4KsV ,"xE;{a}i.Tʸc?reRvdls֬)/\Vc00+#б& <3GRB> t6>rMoFZ^>Vie P͞˖-;I:yn}f[w!'Шa|L͛?1cܑ#G,rB H#onr59)X@5 4AsV$tAP̊oFs#OLL&O BʑAzdx|!:Kl{8g2eF*j07D-A!1jawy<--"HTu6 MC.Q"abtoOJOg8d{[nF hr7V5ǵzgggRU.oW6=DRB{rU̱LKEd{Gd'΁9]]},p7o6HHR,_|'N97HE5իWj-Yhqk`źSd&+#=݋d䕒QoѰ:ϟ 1{9EVΏ>3 HpBH_PcU^ +i#*ߍ*ZK7?Wd.'}FfKZģ*0d$Scλs kE~8G?g洀5e@>.Wƚ O4Yʇ]w {xL(~DYr]w*B^lX`0Kz=߰cr\ '>5gUpH"SƸ C2m.ذ$DbOI7 VƩIڈgΟJٯ8?.DN#j|u7ۗ Mq FDD*9%yܱӬۂ̅|п-"%rX2}ѿoP.lsJ` (TP7Q}jjLΞ۳z{{ȡǏ?O$?Gkrnu 5܌Y<=Geffs/W(tDEGΤfRNX h_+@Vr&r`~l߆m@+b>G/foN2bxP)ߤjQq:!Oq:; W2D|sYޥRs{?EHa yc RMl1`/{l_WzprD7Hm WLkj\sa/t4yߺzq7&MK9QBU4yD&o+{;U.goozm4֠*5d7oެEۺ#]nffO ~'b޽""($w1DE՗8#%ۋI>R }eXXtɲQvSv\UMN*8lj)@Y+ĸ|faO4F I3Y"AaGphnC9ʠ`O~N搓'<FLeUwWE+zoIut[۩0yO5@32@e3k._;LCS 0[ns[InAMq@P/z`r=@L3.yK '$fϽU ml/).,-u +n +d4kۥHI#WvD'Atȏ[]xQDq{Gv8ÒJvo*CsX$UICY1t ?>{ q4y2\/ʾ}l!!HCb ?#%%yy_VF*a⯩l݃LGNN455,[o4,^^=d~iFϠgC16Ng !0a.=׬8ǧKZ9 *%&J,x)h](NB#jԾ?_N0+3Yemty:uc+_h9c'\G y{c08;*7oT ΁usr$C&Rzۇ!yʨ`0<~|濌_5k 2{Oeu~S'&% L0<]4fOggs#++ny#FZ璂p1}Ν\ms5͙3<.6x'ȑ#L&3(N?D}?`u.dwuu2K|=Q'K|/?‚ૢ9sxy--y9R׋S`:koxrs;3 \w N_!WtpyI-gdS?wGۉN(]ڄXJBwd0|=,M^<YU5, C6LڬI>763z+z Ϣ|SŔf]Y~kc?|L?}4D& .CjjjpunoYWWeP{#hyQ_ή QEEwn?z!-D(Mz$'c!8s:t\[.J^ Ш"pr"ݟ׏ Lg'B2FZ ;=_7H+02+3& w=@7]mUhhStxfVUJCGeIaxhz*t#yZLEQIJtxvKK ҥxԥnk^#lPK,4Oy=;GHcܭt*Zw[u38'Bv:Νo~~~JJJ+oS\SyYo?|Wf#<}.#riYNӑA9ڤ⛥7q>|6;&&kksAkgOWE:_(>SA9߾} l\!IȝN[GvtQM@티0mM[Lf~>_}CI#^ `0B|eEBW=/sX"5#IFav<ME^1я=xpO~T A9H9akDꎮ8taa], ̃)VSWu̹pBQPgYV}q" h>x _[w?s[iȎS77kVR2t )ιuv$lș\=kM'\Ogh:V@ 'z8v5PtjR+I!!C0`H;vFfE͝Y,Wqq [y E fmmMgCVbB\RRB`SSO\9*>u 7~?[W;TTyKKUxeh«M "_-ɖzj~25/]#v߸qys~ÓGzsΌù] l% 3GcR4mXM VN?!'@ ANtUY-[|ҭh - ?n)MRRyr Zac?D\Oe|mEJX尪tP_Rz^XY< *D^ 7sda`>R9?;M[[w-**ʵ~/iWZ/hۼSw73bkb{55&/k>Bq7f/ uvǓS5+<WS"b=@ISW kw*ݴMrO-AM2N ~h!zz(y׽XX DSTն #Jf6.;־rc\r{0!/`ڬEi@X(96.jf[[C*ΠyxV{z(ziNbf9 ૿g'455%Yjj#_ħ=rHn^?nX3T̘?uw" a\*etby}=myy<U T)WqdѠv8Ac= TT,%<&*9Vü3E2ApnY/hi zZh ;? mF~x1H2GԠ4ƅb: 4JwҭU>^Pg2C@.CJhx^MEyʑ1;y)aޔyER賝OaC zޑY8BeGC{OMAB:F%y5ǵcǎ0W~s{/@Nܜ,I9^NŎo=xn MnzFtv Wko߾Kq3L4ёaN>vw]pUTڽI;:rsNϊj B}{Q0GCBn~Ɋ9+nVY9u]2[azTTCO,+S`Rvw, N;?>We&kuj=S !"*#H .گ>sf c)=W|Ɯ?aJ0/yMZR"rr^@B.S"mȐ}^)X6XC^1m.83q* +Ln9ss╩)"ڈ"7Eq<纒FjNK)}bx qqwwm9k>|FJQ~|L5*z3]|YJJj_iʔ)\$7+V 6 >x;w|;9;JKU~tbUq?eV{O~>2_т![NbHI2:ysؤɴ]I" ;=`GE?~هT![sr3JG̈́5ӆWwXfH2g,ooݏBLN8{ 1D U( z)EUPYzF]s-M\QTq9A(?%]nI}:!9:_m25:^qǦ*.C7d~N$!7XU,.OylM+-ϱ1pU#+杨4=]j, pUX>E 1)HhL4mgsRt4g@Wwd#sf_=;2Ch|&WWW++=DpA_ldknnG_]9w͛كPt1/8@3o/Hnlt*+Y7nr޺^l[BɯƓY:4 4֌2tհ+}(F:w޼y5ugہ.]EJEhzR˃ iB`Q8jVC{C90g?Bh(e?x@p-o/kV0z(BR Ex]/n-5yI&g'dE`ob9zDbI&vjpˠGO/)~*'x=:NXFXoWo>w[y4C曮c"`β ,)Q퉆h@NAiyk\4ekk\KUi~%OƢ %# P:B6 / HJc-&_>o\3W{#/Çi/_ }$Q`3uXS#q 42Bjj 6` y"6tSP"=>޶-@rȐEݒ#fM6_*Đa$hs 6  Lƹh6+SV [Mo~*7nYVfQ΂e>~EU_@weaaxB_I[HGT\ 6m\刬͞=[Qv_={V'9dLS(*B|7uSӄ>v 8{Y9mN8̣sӄJrP_CrPsIC%+ qS Vi# =$59ic9+Zxy bSyqo0}R34σ$*-zդyI]on v3F<:)v.Ӊ5apWh:̛lqQԿlMq &OWǢ{Ee5?oi=@v֦7!#ԭ̯ϑ|:<7ͥ7+ +y"9\窪"rĈ \ƏIJ%%?yEEh1<98>n w߻]Q ? b2X3G\|n9'3f nWi>&>@FF)X!?g`̓2Q/ ffPə4瞞> lhp)uu`9ע"RSVVV 씔>0(|$GS` [\Hoz8b,sy2`t"䣺'@ɂ,Gp~>Efn`\d{e(ב?PRzR(gp^!zK W:8h{'m@6nzyR;:!8@[ib~B2wWcMR旇_p؛vKC獦{o^!9{5SvB(̇  n?՗ipYT'u=ĢW)Eh 9)"~y,54ȧӶ\qO=? }̙caa`bbB½h`a6 ZE|ä>Ʃ Sر%% wtxW׌Q8t.s[ԣuɒ;b,%:q2.SY75T68Ϗ(^XJ0)VnSQ g'nJddc/jGȡY5x1*Ԯ5q PcTx_޾+ܞxFA48Vka C>LW{\Dˁ?ZDRQoH,d5.F7 :o},pC0 ܸQnzx!/_j̙ zzzV0]ܾ}|l>)5d'otT~>qUբwJ%!)ӌw/OKuѿc6΅v10괵\&53bbɡfPPl'GwZiӚN*ed¸-?5X:LY6\zki/[ o~g_]p`9wᡦ;P&O:Q`9E2f6_%t((I,^' /H `h#sw Q]SY,E^M vj640.Cb%7$F<9c'}N$TN_tTī/vþnzf^LW{qCS*I?1;C$t0soi>1f%G04ǩgjQT^ˀ_`# =XTUkЁ4| C\ h__A@tRY&~SY|sRu KA_-4ihJB.{/C&344,IpNU@ホ͇8FW⫾@{EE+yYwG%Pޮ{>řdƶ[] sƈk #r?ۇ==~q~&6G0kz7ϟSdwl.u"+tV+W0 A$Jg"sҔ‡T:޽unt?B^`j*)Q/. tNBGcT <@O2kVSn-ZjT9%2D34sOromE|%T6B0Z #I5g(Ve=|xbVZf1k9T;S<t(@[_s=|x6Å@ִE@먾 :UT\S@? IG46:TZYXb9'e[mWG\b$RkftSd³J: RbyZA4& |}hCSWX艘X #3t6+EPwke:c@W>ڵG۷o&|||d»f͚߯q UTsǏ}}~ߦ;wKVrC>}Ey ۰,`b!W#"(>O8h*(B)@ղjz)Y:PRҵ|ʵ%)Ux)I_O~}uj=᛼Ϊu>  X]@[m|xxpr griV=@+*w1D.5Y7u{a-5Յ8_6> %}Źz>̥m9|:=؞`1MJ11;Eus!| Ahrޭ%+OOϿ;=ey1ߤ]arͳ2i鰎?zq#Źڝ za{{ʦ |IJl7~KG9 +8τlfB{q9RĥY(OW3Nk%fmh_+ ka/D}ijzpedᾉ3alevaex6hQ̀`+Z\b$fg'W ~}FT}2,8>^zET(Ʈ:n^r6uNꟖcKV.uOφ#_ir1h]OZWD^㦎Ac>wiu4bkea T9NjiWrB9SJ |^û 6!YS.Jk]`20|_w&44TPP۷o九:ujQ`?~~}A{ݻg9ϖMM.?:}M#B=JוBj\e}Ul== 'g:F_l]"Bt_R-[HvӇ+M8 )+QR-Yynl[ֻnHAv̹ F "R e$\(|ddp "LzcDcJdVs%z2@i#s.0@ճȍu ښS`xSzz220^!.{#vp?H'`T%>~wȋNC%J%w܅O"qoi$ +{W&UH#&͚ڂ\i/=4 2$iZYY𥤤O64,Ǐc&R6_ܼ$C{JR4a,Y3Q#}_mPڍd/ nטvay R]'+o"Xqf=H;L&k-b1aYg-ͶC)""J. W5e ܚK:ftcT9yӷD)d:\ScQtj,ռ>[p9& Mad UUEkB&‚=t(.Mvwܹ\e%#Ib3Li1VÊ,+$x"V^^1=+(ػڞ]p p~0IKP]8pԟSRNAO)qoV=RxE!$Q7=xa4<hurNjjVwIp;aBB1TBIm ~"ƨxE<`aTU"]]]1-Mr=MFF Kp|R>m]i؎|ZcX/^ԒWg72zS;<}Sl~FT@$MF ?f*UqCbaBHN?}rŚ5M$HgR(`ɫWӟ7>A6ѩOG7Ќ/x@UtFKj4DmnnfN($'3$)?M/B̤_zlۍRRP./||YG&{0ER2g:^0E5{ FPw2P6 <{I WLGsYnVt*&K? %xqq칉(&"| ܕSgRR#Nʸh'@sݳtjֱß$\h,Q;@Yi+Kpe⡹xi&hHm8+Y Lң>>9Z[񕺺:^jUp#᷇ʵַ5=kY"&3.Uuk\2wr,(XN ꮽD^G}2KZ\v V\Xk\mFtzoi2'ol$i_svy9Z-rALm>w!c~y31FЕgЋIgeAqD>|jğ sOrBiNf/''5l3>>lX6P+NJ b0X95cT$OGU<@!Q^N"4ƜA He:`hHn` {~z_ ENd{+O---Tg{>ѿ?HӝH:/sܿP֭?:K nY)pUU/7fI!NECP}Ȑ!#.b}Z ۂ ,N1^τrrr88GJ!fŐdTD\NƟ}2ۍv=ulF}vzj|*7(LI d0 \v Ŝ%G+ry82TuBBO׿& $ų7MDJ>4Z.rp4sKj ux6zK+m."dYJ_'aÆOj၁poU yq5“ʼ7!8(/9DƂ:ST*׹>}|q5Ğf u "DNW"}i M#MgӕK5v9Ta(WppAi#J,߫,z${VoPc#p\qt&׋ada9&w\flz` ӊפ/_֘s`}?ju(WH5PVgޫc-odTUᶴ2} =٤KwsJIIA@`gsUTb W#G(M8̜ܸq[C\9Zj*M6N$l왼] '-4 NB]aLca;@2zٛ27mىo@)'ڒƏn= 0R{1C^S~$+^oqG|!VfZ_cTz:661FF )ufSd`:^͒3?Տ;ゝWՖ;GEPՈKo>(d3JR-/R^7R Իw$5K BR& AUVq?[=L$))7׏˥ t 8GL-,^Y:A,,RX³X[:;}|XHU5Pud)\.41( TlS!;&oD|*RzJ=xgm].bXİ4+܁̋R _v$mKZ2/b!X2CY=+Qr_z22l 6y]Zhp893/H>zT`lŰ0df"w$_AV8923L6ܖi[iayݯ? O$af.yts(g!qˈl+机B0モY-$P0fAXc6Sț2U;4J}U^8{Cn` p IA!O<0 ӝ;w6m$..NPȌs333]]] `0DEE틊A2|?'_ܕ՟Iprss(䩒ell=ilq 55Zѣ=eej}~t֛7yΛ߾DtQtx:uaK(xuZ{4++ @WIi?7rU'Owa+0rHn Yk;y O`0tUI>=UI_g_H(=QƑ] >'^D%t<.`ұ;^p<~营KrΘ1cȐ!~TN0:)**z޻6KIdu^VК~ࠠc~Rk/_ɫSTozM dr;6(|w;7Cv6bT;$n!] GY:d[#hF:Xmmj<%7?әpx~CLxٔA9% җ/2c KrmF7Ѿ 稨(CCC<~_liiyر$333+nV^^TW2r֭*-%]VL #ktuu%Kؙ|';+᚟A[+*޿ľC-W֭UTz:_9!!7o`qQ8id ??p' ZTVsY^uPw6x"?mŊ+ŇUpl U ꂮYwŞ$m}ۧOyXsyU凋~ ѿ4V>w(E-2.ʊ"YJD'SeB23~;&F++06\nH̗xIL9bi B2F[^Z6X{k#_\?lV?sLguo91iۜ՞Œx5k<Ԕ9MuΞu$۟>Csjk-j $ 2pww'`{Nk%[n唔H͏pIpͬD(%]5i;k.K4B%MA൴ب*{)iؑ[4}ϵ`q:a:\m٬r@EF@a$sHqzc\ KZ _sƕ| IT>Y>.=]qlTkkhMu$Z4ח7йEZ,,JM7ӋsHؙTX>\aYXrQɘ(PAQ *QĄ0PҒDI"Isܯk^ |3====owW׮J⤱/Lt?YwxQ^jq\Ym@ϼ|O8{IS']a~;bY?gΦ^Upd2,,ouWm2"drpRl6hH x[baA.999Ds}fBÇ99w?Nzm|+Y˿D,rŅJW8M-jׁ?iVS3";[HijWכ7Dx rаMgvSYD-dfW7*a4dxik++L\U8f^qZzZ`0r4GSS*IYa3CHL 4nl 4H0DMԪ4,!﹞nw,qώ*.եK t2fɒ{ ȾRUO4eC*lHQ?iy\$W-'O3MtN42 ?-p,݊,uyN݄ Q)$흋a1wV ؤN)?ۛT;8TTTHHtwvUNT{ 6woJgeXu!$a1 ^pyAGnQdd󩯴LHr|_=zxMBWkvC>%х}dMuNl2ھ|Y(iӦO)bh7؃ h4$~9|_`Kmm,Xs9XxpՍCC"/0rzJXg̸v-9%ZJNŤ_c;SW!'y@?N++ @KܮzdAO=s6NDlN~jɩxtN縜OX" D>8Ro`VQVLShΑI%Ð_wm҂S%Мb]ReI52̋\Yc d#5g*KKCr#: ~x.G$$]HMM=6KX1-IIIFb0dDfOdd2wK֭[8ƿ0Љ~W(@2 wD9n5YTW,[m-_&q%RU563SyI.W_BF[0@^TueCp`B}R+3~UUy_6u2㕞=b847iwo(k%Ǒ>EɸO`jjo ~ ʆKe^TO~Mv? 55ͳ=ή04a/}2zsqEy{} o%\,hb<`8 9}a }$W-XG4 DrNb _@KqTDZN 5 bR\fΙ;Fux[ef(zӯT=}}}IaX#1;u+T:(|ur̄g9ǝqIΌ ))s}ztլ;<^ɌWBR9fff3'ΤBP9Đ;(|ua>򜃶5Ͳ ^jǷ#o߻Ul f!'fGA"b`&Zp xx9tkljLN!Tۮ^'B{dGu ¼h ii$sZ˱qAJI6p?AtM+mSbbN"Kb?U"na2F5`heYX1` Viak_4Z#JAo IVn泐> w\@B ?ŐFiS贒D7nƘ,FH:l_uYBzk0 vI{˖*=!ii+g҉͛7 ,|UUU`9=p8cǎPd:L6Qd:N|Dž(4,D!{ rA5*+ǣj5Y绮nQAAׯ;>}z,t9C RP$ mu`{4ϼ.yt8Q2۷qSI6w6Y[(|u>0- ٜnIJč61;!--Qbo$Ɯf ׷MZ=쏡/77S'Cvf+wBt_ӂhű,/ !_:zk'+Ow_)Oe89U7eqq11y̚!_+ѠĉWDZ ;N@Ttq3q쳇[:N@|5s鶩jB|dÀŰłG~`@֪>xt>泐{ {)`CHIK}b_OVuXMC | cu~l_[ ])5뺆xժ 4HPWx>vYD_:a‹&x/ùvg<#K"Jd 戼cb0 ș~qqq6J\%DzvQ4Q:A+%*@awYYZ8d[捕rr_: Ƣ)CJMDD3꾅{h>0yT¹;q-;-F}0 5"'*O. .m|#An'Z_~x8z&_BT9#֐x$Xcyc~~K-8o` }c V1]Xu%߮dSwyCZeA郶f;!ׯ7< 7_k$ZYHMi#Xf0# "&ɗg;Ș6-Xy@Ma&^]ir*.Tr.G1Y ׷/_Hw&g[${ ϻΜ=`'go؀?~ g/^Ltv2T@.]D2~|#]<|G2PVV^h%Wx^cI 7*_U?ϧݽѣBV=rknиp kܦ02HUI*WU BvB&tr^,n4hUx7ݬ~mowĚpȭЍF@dz:˥Ը{z ˼+[ȃT@XmrU53uvHۓ62+}kREEٹ]!-0>YP+NGNPjEfMRJ! NqT*GgӠ oiu>>NeH,ي: nI3&2i^O;vjV6jJUm)ㅈ.[s3kvzq ͙ xϟ?ߵk9hiioLMYY=:ك44Z[iii(~-H;9 pC0q3d8ևR*qo4hc@_?9--T:T|b6 NW3_E֋8d?rmt}jNy΁1cD$޷d1l戌U+_%%"Fur޿4&!  m\=M~oР&sQݻwO~HhȯU{}t`98db$ȭԇB;;$^VT_q bC$8  x2DyyguQ]\luXZ7τ[zba36@aW{ (&ynx{LRM(!KiZkyׯT H,",H*몤a1GzoT?r䈬KveywInLQҧ$Z 3Y:1o\#Mke׮esΆ ο#MaeQG 4:Iz<%%b;1wƅ#F899:/Ϝ\Y@a&h)BKVߴ+ok0ebx:NƜrէY&'+jFc'Ol>5$M#HAaƒ{pFog>ҟȩZ9C5""O)tt,EnӉЋMm8eXFR,w`3hh{_67'xHܵksI'ضkB`([`:"@:.ֹJEVȭc4SDpcQM}FM =RpL?^2yR8ѥ"C$w9? &E$M`7y@f얄'͛ѹ~mmm?k)//?YZ;?cHLL4Ν;?P522`L_;(*^S3 Bٞx )y4/9E)3ki *S~~SD9Y&8Ú`$Ie)nQtYRbN?xdaᛇD~lhm >IJJ,p܏2R$$$Rde? Ays1_8Rg;mT,_ֻ,p-[WJt7j )]gq4Êjt g, N4N~w{ӯ^@֮~J`"󢨼(5̩h|fޠnQΉVVZ.+ pQk=#(eDRkgՕ<%K2-QN@ĉ=ΏWEQk6䀩7TTǯij!tg0ap@0ANKWsc!mZJ7_7Qoy8 kvci[*v=)Hi\r\ `YC5 8sDt}-Ntʹ)H)|% Ĩ H#,IpHۢ |Qo39d9w.>-/O'uץA"#{|]XI lyjb'UK9fNu3:vm%dY}vd$gn*"k|n`by'g mP+,,AAA$g v]5d.Oٻ67udFjfUUM,+kbiݼ9누!sLEEX24Kwu9kI' G&^PuTb`ܧω^~7nrZZ_b X_0 ȥRWasX@ۚ[$`DfU\".qZ3玈(-9}j+O^tBuy@9ܨy)G7;E$EJέ[MM}>}xfңB|U1|ANn˱c>~" ,ƒVW1᱇1#4p/G?30-$_''R`enG R쵑M!fx}r*ùcchB pZ }絳Et#FwQ1IcТmy i}hIH7v~gvr?w .2<| 1U&ASnaL _Ց a_;D솜;Zed1uQd"q`,(тɪx|W]׮^KJ˔X)`N+t:1q\d;b(N|_KJJׯ';::}%RSSӐ!Cv҈6&c}e˖^RVVWVV%SR.r^,nTJNb]/z'7^fX[Cy2/s)L^\&Fߥ +nU'{aoQK<$hQqF A8XX\0Z=Eȷ*5l;@YGNqظQ .Җ%ua VA:c껫@*HM˗Jø~!V+d0 -pEBSS.cRW٪s!!uh0u+/X|f9$&jTIؒ,>nR @K7U[az A܃`;^od-^AI7?kgN:mkIzncԧ8s$}}xߎi{ MMMKB7066NKJJ_ ooo##|% +4C=<<䲳,Dՙ䀣x KlfK7_wh'^D`dYKjS  ᚘw jKqC9IAJ3t̰t#a0q+3#ެm̀{ ktsI6tPX#yQ6yKS-9i.+u}W+m#*,Kk EX_x=sz@8p۠J>gG {T*оWyQ?qfԪ(RZrNNs' +%"}y4Fce}X.% ѓs}%666D%h#k! 0H@䤥fEDD]xTT񣍕^ԤGʥ)God~(W͜v)Q_ɍEEDi/y>)_yYʞcW/WFF}'dBky92*i*&&)=FW^0a#}©]Ltvz=p<%jnj}*30B,q^AVh{V{V[EbTc  hh+N˾/}Vis綠}d 9c#Gb`- 8| I$C|pręQD_W{}Dl$Əf}N +iQƅ墏Nc^uSnl /_淣%p-{uwr'ȧ}QHү_r\,YB~^7ެ[Ȑ ;'wuUr@_WB"@TtWh;PfRsmsg=}=O_Tmyvv1~P޳/slHAsBi;CCU 6A\u,ZutVL:|Jc<浈W n08M<!&t̀4آ%F?XsD$̝+ݍD !Lykߢ[Nq]ьa C1XS| f޴<]2@!ՓE_Mu#Y ?*M_rF;1Vr|katܴa+njÁc?G {=+'*?(mhG[0:::6XxͿǏQUfWCXkk`44UUM8YdZV\tИH:~ݑGWW8DmѨm d!`@Dݘq&SG= BgΜ!URRYŘ*,hCg-)))%H,Hï@19.<*ws mBVl̰p[I_k2*/y^Y9.M$ x؊8[(){eMXKP#ҔhDg=2={0 @x| Y6*o\=ȍqr)-[Z~ԛ:{/J}}mzc@cf䥺Ѻ}KJh tWKLJC_kk ̾rN TaĹԥwR)Qs ?&+W()&#dٲe:3"**dd.v >_wfsE{Gn^t O#о?zA~ob)"Âd҃"޽qaLmvE|?uHmZ:qxƔqM$Bs`OH\9ҒkUkhgMy!$$3d>cH<Yac_FT8(wpSKVbP\C!f`Yd98ŽL \5V yJ:FD@> ן\f K 8޽29H}tnHm7Vػq *XX?j1>~CL;0fJ!zOGݸ1+L;2E9:Gh uzSҳgOd}}Ad,mL(· 0kk]#AI3r8CL~9kΗЩtWr)j/5lǛ?}7FO.tx Rޞr9|%k; nIK ONuX1iI1ӆzÒs^#|d/^يuzCu\>i>')9i+ɩS&WJ9$,_7ɿsi' /":@F+A204itzwVn,0phN-0fE9ro_Aݻz Wu%PD?:B[+(( )_I1K^{AԼׇfg߼(gXFB7䔘J[Qn dZ/=~;8!25շG [8B'?2eb3fPW^mܸU8#lDDIaJK5ȗ oyȣGu`ddD%^Ysn^gj9Hz48g|s ~=z; VH!P=I q]Fp`dEK?("OMZa u{*uЃ{HK.Jy= crK-}dW"*(|RPȗ>܉{bx-lj/FpB/;(kda2ڬ>`TSGo/2'MB#G2gL O`dS >=. \j<8 C6xy>D~o yp-Ig,䏺zKU}&.t1;_q111yHQMHJ <<~'ϳgiԂUF>Ç{߿\Y(/}3$e+d t;h4Uӧ .d&&qRRŋjjo+sZZ6 ( SLS(V7<5Z@L\O5swXe~~%0 I[־}]%\` s6 ]lyPf~ꨞ(c)B6#T@ahU$\sssS#W`Ҥd$Qנ8ro@=K#;-#-ȌFMH!]+̋uu$#ulԷ$fmkv|憤(mP*+Nj7mڤ2a|nV3ز'/W0NE+;%ۻ]2{kl؀RL=FEEYSTdN:kdBc+W~=Ѽ*ڶ%Wݳna Fl#g]ڝJwprpJO-顪 hKϑ5kJ&@+LIze]4LdM62ԕg%3UYiɗy/hiw`~~px@|)]">0d+)i?iV[C@nq_ y;Zr{쒾%1y5p ݦM:Qo%&-/N\6Gc¬jYK[a8f:y3sΐgʷ``2DW/]CT#b؞VM51#Da*U;5V;&!::: 69gH퟈*▟ˋ9 VqJԭ[>)+ $L̎ 0h[~i&͛'mC굛B$dBɔ@׹($M\M[p[;%-KB"!UR,RByPwƁ;;iG?Dc]ѲpFkhul!#cZp \ v";yH/_4hT?ROB{C {Z1u_i&:rC^IF } ~Jb^SQFpt p=o_lRP6kZi^ʆUWOf)*JA[ۇ1=:Сɉw=?~ow^4]]d^VXn7 Ǝ;lKK]cbUeqqyZyy/6Kt`<#ޑ-Y2YTMK՗2$}؆_)Ā>lhrp=E'uMF4 Fl~%={n$ɔ)nݐ)+K ^`^.?[0k*5$F` vdfbvBa&/sF:B.&?s'V(JL[.`TD!o0jF]ωid-@PHDPkRkq7U6F*<&}A޽vj"]|Ai/R+WjK(*.ƞdj^2ԄArwtfSinΥB?߼驢&`u|{9DG~M 1cX ||q2'/hjv&HG G}Y9n?OS{V-8V|였5 JNG"֥?=$36uaqWf]nWK߻zzJ ߑ ᇝZy@p"l^zh,:1osx33cK:~} q\bUqZzѹ䭷69tU9y1D{սh1S:՟ѣG`IUJJDDDzSS9"˗orJbsYL>SƽvSC6 BCх+!8{ "MH֭vFRhk ռѣGHj$]$ݛY'&&x7m-WzT٠KKJKkBA5ܽ~M!Eg>:<9l ՅˀhǻYfl45Y |Qɾh2 |عsp$36|xAb >Ȍ:n!rAMIL:-"Si++:KoAqD%.ºp"uuhD_]Ch/-͛+ٳ2xE||<)ķ$O3 0f߱cǜ**O(/#6S *,0 dc2_jQpr\|bbIm _y FKJqrj<@%.kNrpA`xÎ S^ l2!aak8Y٢E4MH*2t*>ƾ_2b~3YsI:ٝ*3f$蕐lRaȁVR+']8pZc]Ӟ4r h!eɹ9LP~t<+kͦ#:{!UE:{gҷn\O DJ+5pWWI5Vm 2iԲe +КVYOw?vY"!SKkW(!ZsrN:NWn?b999jj*55_|m-oG><ށ|iɍBv<vB矩 q)&&/9sf׮5Mi8E]NOHeXXi5fS$zJ<1w_zE2PCi$C}vVD.oQܓIRR*h xN[ 6XwqcQhS!X_'IeCjIQv2Kw~ވYYY&Dq 8[xM[ mN"i "DsE *"tlյiTf_։KvzaxQF9wBׯb* ؓ&M"$qYҸݒ!}viٳgww߿?ӧO.~ߵײssSʒqBq{-JIٳ;J`,?eewG{{xc#/W[k_Ι3q†)/p21f<_W m۪o%wMuCy* Suf[Gk޿}?#WL}=mnϘkd^%3"GW t5}u׮=&^a^YY&N,@! w;&$di[\^@|_^$L}y5Aɕ#4{ 1*av4=p"u¨˖] J/[wNL9t 4&B0k n-XJ4*_<9G IL/7/mpO@?cŚ>䌟wG|J , ԛ:{/ywfߦ?<vpjž{6`A+vnj 71a١_/q㝭w2Do%[ݻw%%8Ȓ*@iy32ڗ 9_R2v,MVFSM)ҁ͒Bji0P!Y_F7oW/**b/JhʓLƂR1cA.HU0 fb;p-M{.kńk`s:V_Natn`u2[* &SrzhaCCO\Ȳߝ53/*jcVFU6RNNP1@>v'A80B\$gv Aʷb&''uc9"24P3whE\cˣԑ iJ.)9;@ MsM]Z|K3%4= Y]o%Y @&gҤn5ntD|~' 3f̰|YAm%D*?'yѣB|r'P ֪;y9j}'`fωu7o[ŋ54׮- )acHs m7a„204a2ݍ7G%tڒ%Wp,X\xw`ThC$eGL9qqt܌oޤ#?5ZCrYT#^z n7b:k:A[Rݓ}.Ԙ~ɳ蓸^êAh@/kWj"m5-ߠmk+M.ѵ{ 8pk\ܐL s%{}֋vtjxyy|NjQGoO U0 N),H!1!.*h]B,Q>?ut4ֹ***7oΥV %@Wpy@4n_hQ~@&~ r<ܪ{z||؟?cXh"5NꁑuN!6C4y-Q8}d?}ճ[gqgm-Z*}gnS0bc߾}`P[*>-އSRcwߢLZ-I@`%9O0 U ?2sY#w7;4s/*9W466t"Eaeu.E *kpHƄzYH.@CHtgF֙0Zv8жw:M|'نuaҧ||0kr_uu]9'!1D}g/HO-U }kt(|=*nd T#RG$޹|Ԥ1NWV|}}um[(6qAַٳ|v]7RĤpG¨uWeA{||exMRiKKP&EGGȼƝZ=]5^!,\Z<$R⫍7 ׬Kl4Ou&SH idYY JNlAAY2Y=הw;U rX#""&3F2L2(R/ \SlgqNYY2!瘟ɃH[| IKV!89IpoZ?9*]o1ی%9m|9?T0` >zhaX >i_%IKtu ٫".zew54\yzzίаaTsL!0#F)dnuۿ+UUUj% _]J0"^y,UVcΘqT6208Qk8VQ?ꭊ@"?._}E/\pFb>e*F[UH=sTCjc 7tPPZzWArM_M %eq뉚uua|ɕ>sm "Ǐ k$o4È0ߗgЈ]e$lIYqdV$XnE6@t YǏ"ݺ؄W,3 >@Z/vml ϟgRfΖD} <[:9̢EB("IJR ELA4id2C$ M*JapB[} ]Z8Fd$!lw܁*nӽ>N*^VUrE\{瞊N 8]JG*+jva<=A$c77((2FYʂsfH S1#9 >~82AORRVR, l l^nJt䛠f))tZġ4.dd0ya[N@ٮ>|OFFF"...iJ !D:M{ȔK?>ޖ7%W ϥ^*+ӐOoi՚şjtw?i%Ӆ૳zzznݚCڸ Qޢ^<t 1p$ KS0rKX 'H%[ZX 'H``ص9 T 2B`(>J\:#OyIH30xmJνf??[Y9/gJa!$ `=˞tL`[DndQlN»̓s.XR ~Hmd9mi)A{:_T&$g2~h@Yrar?Aa7շ[򮇷d"!{@vӚOop|Q -+8z))Ͼ)wA).@؝``~9,{.:"?? \VߪGϪ}(ݔi>\V bW|kStض&8IV\\sDMZkdwE|^[ 5k؉gANȴ1:R,\4o"DZڴ]աf1Y4qgWz x/bg|;[&p`KZ.H2?\pS%.2.^GYڜHW\<= =rcG~v q}#(IrSjSSpb*0GK:IuiNy+G&@yy J ̍8rj?QȶEJJJTTF|ڤo%44"N(@"=z4YdeS{wC^^;wViRoQ ,t:+BRTiu}U))) 2~z%%?.?NS|yѣG;ZZDY *мӧYB|x-'&F)[ { rrx=1r˽{@#m4Ya*\b04ijeer{OxƁ_…8PœH'C|Q4dv̾rudeϾuČ%n3{"#:alR\QQb긽VV 8S\楼`+!f!Z˙]Κl=id z)Xeq `Tn{[ɋ~KWlC꘡r`rq6=FMtrf CMcut$E˚%gpץ_̬L%%%>|QTT$oH{nnnnJ״''G홙̶ ޅo/.)ϥ!ZPXG#P6n-,Ks€glpVUYVWOEh)7 p@^c %lGЮ+$T6 )f;H%[''vlv]|-G٥WHp''K?WԴa>.x,Q \Ta̿~D~ 8)`r'x\\\OO5R7oiv鍿0؁47gg 쬯_Z\SW\Z:?bpp o2=iZTRGnO+z$$]O/ںڦ-m(tGI7]9qwGWY ln/>e tw?"VZ2/f9@ ƕ mۭ5/TM 4?^!\*%PpMM}4EȽfr2)edĞ:kePPZ?1hkG&mýD9+fK YK쓏\<#^>{tOܹ\/e1L"#C~Gx2Xf-gۧϟɻ~q5YUY[~] ,żsgPj0֕:: zzz|O&lf ###J$(aʹ8qK_lUeoBO%?_"Ȫ-5H,1T8f"wV),ڲŁlUŠ^N 8c謞5kVM̊ Sׇuj >‡e\etuQ. ӫ 'Q˔5n)2-wIw{x]CxƖWn$U)|FGØa.a6>V&58Nsh6eY%LMV:oYWvFU( и<`@ ֭}tcY#_:&0Cd9D~^KlWWmFbK L7?G5"p/++Y-a-]]~ %%fcׂOThWT//**"y**~BKW&Ç$!|4͛[7VPs33382_|D؉ι3F%ۖ79pޟϗL}}r-CJ\(R֥{vug-Cqs83áCͰwg !/iKX0>~ A)r6!XxInLmEdłUa %Kr4֧&E2;VMZ^G 7e;xg?y킍R:.]x&%sj|!\kikpcN|J0-/IUR"=iMY5#d 3]Σ>+!˰Z& X.U/>?Qx!TTToN%>|X@@oWA] 5jؤHHHlݺiOAZcMM~x3@JXt2 |v%%n7ݼkgr{9:;iTUqZR[X^>w@, 'Nl[i2ke.q,msm{F0a14iT u$>W"2RFؚpR~X+?tQweHͯb^x*Ӏ]U=<ه(v|pm-f߱x4 R &ih^* >?BQ[dOCIo\ P>Wjc[{RFDq߃F'EW.:0{H :4ȧ70cU1Mqq^xޟu#HܱWvQF3j<ɓT0wm74ALLM;: _Hu|u,ݭ`~ ޗCmoF5;ή!WZηUK&&ZI'|@8jjk 7qEK3$s ᘘFE=2(~kn?B~&LsA7L,K>TMؗ8hd*ZNZU#SLqN83hyay\iiw$z.n]|HR OⱠ)gF|GxLcqNB[zy2ؓm,eʩ!v1@FH>+ %QCy]*T!_-BYsyE$GsGq>q<'1M<Ɖ㝞xl"/"+""m۶0))Sʹ\v2=.ښtU~~]/EEv$NZUe]UeIfl!2? 1uia]݂ywߥ~[[f\1?DX()[CcҥK\~z4{Z>@JB9EBRg_[Z۷ulK޽ 0\Reerx>r$lrY^q!5ˉN1 +)PgK;n/!3ghgF%@YvJVb?5: 3}ˍ8y<2==3=mѪP0n: _ݮw_? Gˏ<6D~ʊNh4}}}j(ʹʟHGGՕD>%H? f[6?S!=}O< Ӣ-_Jmujz$|w/*!!qrXvAx" hwΒ.Ex^Bnˋ}In+y'2;]yzW9AgN}\_2B][$?ZXg?5W=9ӘerWGP,+p3Tia'&瓋:O;ڼ|IBCXQQolj _1tdͰXl6cWcuCC)u=V&EFNA~5axֿ_ϗ/^ݮo[:}w銊֭!w/{ԩ=\:Rj2~`~^ǫn*Q\J"~E^jh`A=rw,+.ER81:j=`jæ a wgqFklazU2>[؛6梑%%E39, ;.}{ӥKO؍dX^`pL(-[>eo+֑d77 Z1d(7:be9atLaC?C k 2K쓓xFX NׯHM{Uߨcr|jjAf9$(]_ or\]mK A8%%Frs{9ŧΫE\55!ǏZEhlLiӦ!?\@[p/N#xӍ 1剉BUyu-g_0S]}joM:{K-2 ,H>E&KҒ+d\t=?[ -#,ߺ-H4O^ >Յ/ 8Yڈgsl eM$\4EyLxjҌ`_r;iRP&=Nt`t8ڢ>4gL7UߨWG|5RS7Z~'NGtNKo?F$$$xӧOaÆX@ @7+ Nh߻ ,^4'(5 sCU4;Yx.,(,!CXb?+;f>WvvIAq];|CP'h0.9Pm F|OGFMM m͚疲\Ign e 7!;;"}>%HN!c 樝AJj@ _C\93d~YY{^.0w3gTiAb/iFi̇bua-+헰dNdFK"\C cYXH큔2}s.\TT_Pz%_b<2!B6p ~0?qɶf*cBʏ#TUQR!^s:@BʜOطرc!}3.UUU!\Pm;N'N\6؉M{(dEٴ jl!(k2JαښZ1ff/)3Fu(.mmmi )qdݹsgcoA@===Nt*7pgqOޠfFb5#J2q}HXC}!% >oZJ,ns3EDA2  |bX{6i4mGХ {~Kbt<;.ŋxϟپPwY|AN6?b+ˡӐytEd[X;% 4;.Yn69mI4 {m{VGcwl=o1B _>G33k"F\FX|/_HsgCGǕo˲Y Sj.*ԩS_hQNqf6CNd#7,!2G A_ "!!WOK J ^KF#nnFy;W->13R9ZYZ1Trrgc1H& Ĵ=oKmkVhO G_)f R=I+8#a(:ddD MTW}̝`M"W4~Df2gyVE B ^>9)$VI8Gr͉Xv⸢@ rpe˳"~z4p#~ u6VYyC+~v}T17xq1iRdW@U}kgE+yY'Q6\E cOɊ';:P?tC5#E.q,0(t֊ٴ1}k?PhocP7n9:F&++iOu*Z1yy ^Ybbq6fFe9eO^|){r/MMM?BuH/w޻w+m6Nx@V/t^q8~,A󵈷<a[+WN r6b RHo~͓Ο%ꫤka'!plƌ֍3fܹd_Cт I7oT+wrc궶K,iSl䩽*tauuvh u̞Mנ\ܝ+1){?|\ 6%*&C.t QҢuyP>@s"EE&"C=;|_:FK4:CO$v<: #G+ch/@ \]_<]^q@m<blI6ݲBh.9@sx ff)-W`nMx@ 2ͮ! tT;w(__ C{pM}71> gNo6qϐᏋGhz5zo 6I?)ZYwwwsx#rJkll'>kkk++USlmm6 ȉ 779|悚A[b0$xsٚ5yr9:'5ݯ};?| He0GBf:~-E1o"^r-b9s^%/|l+L-H2l xkB1Rq7H9p." 쥡: 0WjA?b#$l"WtM۷~侽]SYx8IccΝh%M3aC 4uHs5" kOWw +k+u DbWO%5>th,#cLVQ9HSOfën'>&3⁰9}k/Ӱ}3_,^"=s*hggݿ=o/,)ojZ; VW|\Zjpgٝaj\游"WDLL"}Р$[\\bI*Saj-]Z,#V51%YS 4Nٱ#?A1bmrGɃ̜6%z`9ЦjذWl#[C ,۷՘&ruaLN.e@&3]WUՒ,,x)*THObGPAD?dk@Ƶ~ah)m1U< :K5k,M3⫯=٘i<0\4AÇ vWW?F'MTT{k-  V?e_Nwe坜3E ρ J2XN@2æ]lťbVMΜ?~^mf0 vDH5 5Byxxzmfx;ۈ lR00ΐL9"9k}#Hخ NVY1#e F.XSyX0趃|GʛS+aɽLB8g[_eV` mWO:liXZJr-_ʿ%55ՂRY3Hy΄` W)c,O=/o]L{%&WKz#rJz2W`daJ "6 ^o^/).ii,Pۧ( ]CT*nOENN⺖V7ufں++<͓a2Rȵ)< Ҙn h2ld"L&SGap]PFΘ1t wW -"FΑ7yxޓO6ufڲ$8j"0Mi2utJTTDZk#NfQ:+@0XZv*ՉG#˥\Q5_RAR~@baepTZj wM}7AyL?$YWh"_d㱾8mVx̷&]繎 1`c:::K,nd޼ynu 꾞<E8?A? Aʗ+4Lܱv6On^^s9ƚQaV NsICLvs?ͅFn!*3f7oc~{>LX1 vv7ϩZck?kM _9b-FEF~TKqt ;쐜#E3Ix~o_tZӺS@ 7JBERkmRҰHWd<'ᔫ o%##c׮]}3.BB梨M6II! xR/_kUXҲ'_O}ZEEyP CljML+rEJTTT<=5R&mm23?(n)RI+4 WRw%c '_:wW WhGTk>ܭ=瀟 5Pǔ.]t@e=f8nb%vB|F|]re'-Rw~|=?@ggc_$`KHG 3CRۦC11t~99"ׯSII@RKZ%W0T4=PE-"^ ̗B/7jy@c54 l-u_Q-Xxrbt#Ə>,(A#Z%M:Is9ʩT9S/-K%Έ4_2MZZ*3Fb3`ARHZ_"束 J[nۧ&:z9bH{Y[Y<7k\'_edd_QQqƍ֍+( ),RUed5i׋JѦsb+(̣5k֜g鞿ie0$饢^OI=_IJ89W12~weK\"$b)]~`}~ 9#e r,ĚÜ97^}V|tǃA Jˢ3JGτigTehƖtؽ;=u'8y|1Rcl%Mz{{{y$*`sCnkSݮ{L[ƫ)h=XLz'}^/OyyyykK%,;[_M inޔztQcv\BQ,&pڞ##5518 GGLxzNj&WT`rb-S_Qæz5?Z ]ǥq4{Ďf4 oid*', |}$^?"O No]=\1$S{v yv99b s #yRToذlݺURW_$++}\ϲ'l-H|%exzzzrrnB:+Tc?`J L.\cSʹKucRτ}DD\<K9?4`9,5 :#WY; L7YYkѳ aꝶiƒ=0-Dz]&|"O2~g@kWv&!q C0x'ڝ'eJj\v/ :{|*N dGvuuUbH>nc ;DD k k ]< I"h?૨J\I >'݌wE%?MCvrrOH.̼Pr[S_Z5q'Z2 .XiIuHUj,rmQ[C<72tPN |}}H!DI[[Tf&iz"c_Urvtu:tkFg) ?*8m4 ˗/lϞ=Jo AT8ZfP R&f0 9!}ӥ999´ٛvgʋn01 AA'/MO::dI5^hA#@ݝ Ȟ7o*cg6ǶV76cպݛ#ZBAѲcn, CӲYY. 3F7 0_`{/XfqHo1y o]$#Vĥ+bHTr67g##nKOSh'A^}veesseJK 7AN7  UA/pqڹ.{/_t]8\n11d1¨667@y 7 n -g-ÚSESIbqd}Jbfw=Fu/'{Eed|`V !%yM؊䝬Uw :-M*da 0N\18;;//IxxxH3G(ג]]]77oSDDDBCCɇ͛1Iygg.^,$?O/`قϒwoE΋bCr;1dN̞={„ 9۷o #W<ׯ_MRj!x2r%嚷Q}K9ocDzD H)W **lCC|B^|[[_:Ug~@֘zݼ$˪9hWl7庑 ̷;0@w±cL4(\Mr]SuMM=[6"09{Uߨc5sMIvp-VxaH9ۊP~u=Bqذ0[S;v!!?Fm~뱨^XLvpqea_yUѶJ #aJHabN hVx΍kCFCcQZ~DĬ !x "_Ta; M)X'<jmG#2;\޸+*RCZEFglxr]g延Im/r|3Am&*N??4_:ȦE&,|t805%#@;nDz ojS Yqtl^T$tW%NIbGԴ. ?diQ`IcZoٷ={l-ZH*JRi!VJ)HH}_F]͜#W?8Ϝ99ϙ̼߯4^^t)={^VK/=+**9ك":S|۬a5\;di 4nYD;ؓwB;qℲ RWRRù4Sfddǻ8#B4iVǏO`+Vr`q1U+{&4|[^vхp700HH@[/_o<@h.٢0Ph^Pß)c6.1~MM!!Λ7AO rjrKEx 099V/dttf hQ~f1W1J  _Vc 嫫?GQj/Bh>r~%_,,ob$í -ߝfBݰ~\vWZsŔjui]a~E?.&&ŵ q3f ;Mf8*#NH|ǰ#{W.Ocq0nM\9#|žQ{*˅vI<9A)~۷oȒ0gX |U= Qn6C2>XZ^Nā| ٳkILJLissβY"Z۞KJ&P,$O.(G2s2+D*Wtk\IEl{jO [S_"O P@!ІE΄e|!πv/vװ|Y8Ѹ]ayKԘ(z+X8n֨8TncM4gﷱR-YYϣD򌏡Brp5r֬Y#uʵٯfe( y180yy)k @W+9.BBS4יj0SQ殦5d/&[VXDͰ@9 Lw\\-3ݡyj d`R3/'M׆c@QDSS OC ؃ESiINFOOs?VlphR ¯1&qF?Co zcxzDml! n Ut:}LbQQ>M>ac{{;挍X 癰}[\L}S}hʚ䙻l.Z<}}}a-Ѹa_cv}=9sOҐ92h:!ULA_{ {zc666}!_O|h"bBUŒܙ;oU7oVY q1*䨐0̘Oe [/Q HDI1 pl?g'aLLf\vimbvqRa0Z[1Hw kFNhW@A3WQPs1+"|vlp2d&̀_ǚ{$-H8o^ N\ubvR|בٳg᱓VݻV, ROI E=p\;}zZe۶m?044TBB"<<\XXճy9"вp3U@-pqhH՛4L..)SF-=Esո3[)d`yxȁ &\99YA< 4[xX@]mhObhc`2[Cw g {)ߘ;)Ǘl?X6m$$G%,&&vhoJH,#'̈́cɓ'(q[WOH#hտOw>}cwz,$~u 3V̀VBҜss o~v<_Hkiߦ4tsfLZjYXq9/y 1< g]Z`w7!7y5_WK݀'I- gR ,{1Nmxn~eBBEaR QNeggjVz(C^029##[\qd-'‘0tX6MXE0#/Μ у辷ʔnl-(QR᫳NNy +/3]wZ_MZr2837O L:+pf| Q6V~3XAúvn{.﷤$蘖vU# 74wwwSS_IgHb#'' [e^,U; EPMzY3cKeoV0aum5>ĈSa6-<<<=L=4# .D4SFЊ>2mhb  lN 16J'`=w.АR2 ^vv,`! "QuB<02@yD=qp0BG407gFUզbW袐-/촗gPT /bWvv}YL8*㍥eL@$7hwڎ6-p5;WN"s]x۵4 G{5WޅHԓz 7(ǼWIH7{#u `ͰlOW>&ͬXJއ. %)K/2͕h[p+N|VgHɪ*[BJ]龯_: 5ڙHQRx1CrJqі3T@$l(VV[Źdy-I()D 4?~]'I09vʓNؿ#]wmm1j UG2K=YX%!a bΝK˺o_[;1ao$V`zg" 1C}YO HkuγAY688KDDdD&nvpP(\\\666߸:744XZZ(O/>GQ?Fwn"{{|U]-a} y Q|ъ>&z?87O?pϞ=p ?u|]w^IV򶲰02$2-k lme'3r }~N=?K?F쉭T6Y̲|jj,d񘘈HvA^JÏꤦ Ì F ._plb]ݒNAAFAoS9h>wU7E_>(HN7]4&L6.Hkrc#|ר_mIf]=xcƳ'WxRRÒ3tt,GkWzIhemmݼ%b=w*L W^-okj~Ez< 0YETuu3z׵Jy }ʶbXg^G;Gp^I2r<2#NaaG\|QjXXXVZWWWW;ڬѶSpy#f_O5DZL[r&&B8k|gZhjF<L]p,l:s)҉6 V~p8066tRFFOf;vWÎ_o0|TRR[9qDwZooW"QcFyeeV^ cccd6CqutHinIX4V8=zfPBsVi W5&F ͛'TKp)p֭6>Sn·z+c cRԩByr7" ᫲QuRTd=h_qno7ild,aY_80 ^u<*xx)07y_n0Jov-4 Kgj{{VLp_LNNJ0>=kikW1ydVɠA$譞٘>JL32X7ߦslw#;+50 ˻uVv6pMrwwच+O9'luű kp!i~7, % p*mkxwP}xlc{"}NffErЅ$ʉРРDIQDvg8k TALT4U`^3l|@cV-~pL8MJ=Cnt@ d f/E@ARY"ꨱů,KKWoԆjHny7,((Hg,88xD8 BUh޵`[r >yr{h/^cw>x0k ~~`~Ν oi .#| fp"r"}ALkQ5krhu<w;[7÷zJAJ t$u)fE=yr[~f)}Tcfkk9oSO ‰C ޖh$Fa!ў-K)+뇪.8rKBS0|%xZ0Pb>dfi ,+.\0oϑj2d^͡REG{"wܺ::kYI=(jc֬Ycʹu&1p寺۷o Ⅾa.r_Mojwm܈ ===J`c{8Y\#'k$pjz.]Zǿ ),XTWAu" a`@N04s5|.,ٹļ&{2=Tb8mʢ [7w.^A=,O4|% +.% xljzF@p`a`Id2bRvy{D#ca9: _MQa'yNA8MΣǢ i:pH̖&jL;mAL#ӋXxkxGUE[x%v8 b; bxP9ʗ/gϾуVE NlȫCq( G/ڦѓG*0ofQ䶱1{G6E,bbYMWXI[chU:U-'$v9ޒ27, Lӳ,;ܘouD1M||x7pV aO3Ŵ+_k V ABcO:}$~s$r^7᫕:?87ovc=~޽VVgPBS1۳gE98dT-Y5ta/<F^įլ.\ # Ql7W=ΝmiHo0e֌3DwG9aæW76]к~1 4.*~~~A m+J;#P0{Cī77ܤRjS,$I~outÂnYaL0MF7ǵ]> $F1:0kɬc: a0vuShNUB"Be qr2M2ueٻAβ2h^j"=qP++;y>S!Lgo&&yML ]029>6*:::ŀTTT|~zɓq| V#|ǽ^ccc|[2XW|-WyZf[$a_~tˈDNf0v7Oόγb %Es磏"c.lo bD^?ca욜$&m`3<[-UXc ҬYYdEAY\Y6XPz4c\-D \3oa2`=c WS%eԀd'eyR^z,Ԍ̂ ya?^Xdo%SS]~W{3gOs^ <Us>@kmmE_٨z wB3_|޼)]9Lf]EDd///YBCB0%H08 7bm[t7wV n`oO..@4͘|S$#Xpde244`SY{5)%01m9fU МmbNyL`G K:aGccXYوJ7!hӭȴc<֙-]j8QTQn.<nj` 'JoiS4P(ѥv&SN#mD$1Znd!!yԋCeekfJbN @>I\qM- f&+i~(Hm)(p}"uuu{Ѹ88l|RP'Yq|[2:`1SjBpG߷ojjo,ѽFfpR~1QqŬ> ~~~|j`ɓcVK44dB7&d_!^9ryXveG}⤥9q1W;2ӦogXBe#ʢLL=??FşdI>IyjTxy_Cy.ywEڟ*Qu&}FxxI0;+T{44JOv@ vj,0UAA<@ e_&mO4WwqXW,fƏp,1Hh>.>~ !Sm 0|uLs.Ι/(;F"=2lƋxwZbLO̅\ecUû``Ʒvэayp/ 604]s'Bg kx*u;:4DKKMGG]X[[ D}%}::tZ, Rztp1{ JtF˗y]f"7cWattt`sS 0wUlJ"47$6S$qGY{>}U'..dr8p65M}mzq~4o^[I JPA\<::c 4@DZ5NLQ )^W[\rIrȊi%%L57_>\lX1^#,-`׉{N'–U[/++Xy$ @`@S-5eڑ1 ;?WZ 4>jVC[7m#` |]IG&)RCw梿ŰcަaVARFƸRδOIg,_E" ^܋=媥afvn <B|pVč~.ȪMS>T(rSl0Ȥ2LkjS$y]S+}~H _}X*1 , v51Or@`: g2f-HqT*23yEw륟` ˔rA)T*04WB+--ݺu?fp3П-aÆ Sݾ}~ !{th޼y!!1MWa338KEۑ(SZW_ $&8c̹_20_MEψ݄lq_\EΔ/eTfCGE@@6`3F>5dUT5uqO{nN׏ԅSMLAJA ? OZ04ێQAN Vj%@OCaV -I}Tb(>t'/WȬ ylycsy`q?{c* .;W\4|WbFh4ag}R\S ѣ/ ԬYFGjG?2\˗ lb `ll۷Ç_* oUaV9MM??SF)׌1<^[TRB{?†C EڒZxP~͚5rrr5:TF899w޽~f_\(< /\3\ۺ:{ŚĒw3$Өo$c.OzhI}'uġE&3=AVxp3q"8s7JA>9Оy889-Svʳbh~8 kV9H9g2NPd J,ҷ-7f6IM$g9[~s5|OVc!Ltt4>-Ȧ^8@'ӏ9=V:Tr|N $[/(@~W(deEבm1> ͪ[;P7e)@KGXPp:3wEl48){YzC=gUUU*|rf^~N._  E]]gmvvvvUld`ibbb wxǾ7nyN+)a~|ƊZ-ӧ6kSAl}j1Z {lJR1VVt޳ -N#j!ɦVǰh~>WwZc6 sgv Qjx& W7Q,,1GYY& <&:"l}@:ds=ccv,&5Om=9M _ 239񬻂p> X~wֳÿ~c95L/h,$8v 5=$OH^^^{/j}Tx,L4lRޕW$pRԶ7VChV+sN|6Hul\'8'JvbntCtΥwsTu!|%>=o=2X_?E ]j`%gֶl@>Db7Z#b-3#ڦIUX5A83r.C=EEEߟr lc!fffD"qDH%`ʊΕq>---`}ʸylϟgvhlM8o.k/aG6\9:-2 `" _]=>66F.n]!|,d&l!w#>ҩ;0\(,S?u+"ɖ-kj>b"rS(L¢z{j\ WT~|C XK}=<;.!;Ѐ,7 0wN{߼8i2Fkoަ>23|"o6f[>zÅ6ļAvg|7")) iيJJh۾"'OOXXcMp(6Amh.d M1K6 ;iSkkn".).GnXA'7oW{{# 5m2jnTU[QRo]JˁBOhg|PotTgr7X?hk>!w`Gg٘^/ F0T %CPɓήdOzs/.(f(9Z̵fwUs;L%U0_jT Y&RL7^\̭ .Gn pBKՔ~'k_gp0x( > UGx6}?hW&| oSg}ߍh׋/eSVQ!xN~|GCϖ Bxj>|㫘+Dh7DMLrp0.K2"uUvv:)BLA#38&Жr{cv_;xhif yp'(J} *'3MI$(Ǘ$qC᛾!HJbỶҿ "<i3v#e7[zݼބQ 9[z{(eȜiy66E !| *\YyW?\wJnJC痁/}S۷o g~3EEŠkȌ${ HWj 4 ?~d~]`jG"A`ϘA#Tez wEEQ5ODo>Q  O?FoA_;:h *+9eɳ9h/엋8#9 ͟I{0i2111$4a˯0@ʆߏϪI+ע_M`bBN`."-B>o@:k0fX|DjAo68=>x@l\Ԓܛngu P [O;YpH't+NGV=0իo@  ]r=E4c{G`Zܡ6o*؎UP RrwyI׮C=&%%uFs#_hL?bnm45l 8Г'kj::Zaڏ.UBBʈݺitcccgg-q_tΜaTUΙQH,}ejiA--%RW%(a/T,Ӏl@ oyy2}5/ԛ@`{Qyu* vX+%(q%)!%8%?~Y걙B1 i< !x({ܨG5 ӿњ[7n-.teG'j7zo82'ŏ^JG>#^mijj/a@rԊ ajqq̃Xh…d2;TW,(*\кDKg]7ss ;aX'acv8-fzX Hm 0!`_I[D >)߼ys8 ]cA å (y䊙ȝHPYx*Q!CQM{WR68% .]h{`w\)dg•"N+JO*q&Jp_pG#᭟H&mPi,af~K$^C)'T\EOKغ&/\ЭWWoogP4!ӷoC=l,0P ݻ+?ezzVf-ap3?NfTUF o6J+?2SǪ*7՝=[. ~'uu򯹸E⇇nݍrc;W_QX[Mz`r2wrQu6cxwx6&C /zp\Z04J(s݂ڇ2 B9 (x蜥(. =qAPqU0U24g$| W8h>mQi{+rDsƒ80_x#^^^K.eK";UV rQK@:RB0QZ% O>u( vp9w|q!Xׇ(U:UDD,(;mW$EOM1E+;{[<|K^ yZYji1O%gvth K@~ "Z=ySy<>x*kR#@?4ش󁩪>0utt_; B$ND4k+5+@]xvU ;O pH=֣ตtJLE|x< DMDMOPH]S8gba-'"o#Fu ˒Hk66ILJﭪ fi ~]z[N֪޸1,2gK](Fp;=A=oTE ѻFK5L]S4fV>ovU(q(5ܜCznwZ46ɓLGDP[JQ G W+q}$>ۅ4=EEee}3ԟ_|F~O}q7u ?M+]j*wt%*Kiy|K# G/a2[B$p4 Yњ[7L|kyo֖K4K5 r{E77ő1ْ_x#fff#e_#ҸFxxԴRH|hOH%߾}U]-*-8)(|1(^4i6-9wrRg?Z!At5ybla0% B Laח^aH mc YPR, #Nn '#\V͛'(A+31|8앏?{Ƙ?1<Έp!WxKXmehHJOP<1 f>(F0MʊAޗ]QlF(-ᣈ@3. Q.g2OSjo&b!|ŢOXp "y| _UWWÃ.a`N~=z.56?PHq1{{VJ ڄׯ`~?r cyyy߃=ܔ==uՎp:xfsy=Ƌ^EZL :;ܾ8p`=O,l7 J).%.YX\&=|>}vrP ju%҆ڄPE3EZut*;v mwS+*8o-Ckpݙ*u< 8lq|w+O(*"ȗ0oǼ/z> x1Y?8:L_߿d/h |qbrRUll,BkoqiF[޽+yUa-<QT&!NWU{ϣGnY-[M"|nV)>|]. X>BC Q|5&6WjrW,e,[>y~>*U[e r\ýy30e6,yaZpuqU-x$HuѭF7-[oƥAljSƍ)W˺`]`1:O:|D`35M nRCkyt"KԲ9[4I,+O r6Y}"gtuZC]PƆnmI}-~׳sPyF] V7#j}_VVsHKc7{` #'nHq Ds_TVVcM)~- :xBD+ae*aa 7& D!+^^ހd,xwaNôK5%Et3~>AD}|Cw}"U&[m]S{VpSN}j5nٖ666NNN#]CpeFWx/\HHR(́=2UUpLOo-+U*1mP?dt'Ukj?G'"BLZ7R&F^Փf2Fnj?: h[UJ ҵd ,zLsli'Ma RHD|G[)gφMYir 9?ckײ% Ȏ׉ŋɔxdoę.|CjJTM3\uwl^A;~620#CJ$`5;}Cai2o%WsWH!SZDZ Lz|YVD=:9em^@xGe,T:ngWׂǪ˗/gluHR^wO1lTo#ڣ;:+ .5Nndlȸ"8gEϳ)@4ճZUհ2 \\\Ґ^^pK3 Є 1|5h CצxNh998P_b1Śeͯmܯls PHq""ܶ,J]a!rɓ'{DO”{\$4m/ #))1z g+bb(uwB**Dnգc=CZ޹wA__eњ,ۿ+ *3Cie3<dX>?, <g3Z'z{{>.(H_Ņ. a]7SR>.(67{kØK"++_ƙ)Ej1U"Ϟ=SUT|P>YJr=(7tZY4 +gnX sp t7l@iiΏxS )^xU U(&Sl ޿|3ץXjaJN6mR>Ca6Zxc|%ns7毴M8u\87xuX^zyI,^V 6wܞ$]Ű;9:R[.1\g]ȑ_ݨj3|""_f8ƌq^iSfV<2yvq=4-7S/Q? ǥO6VeӠ>f;E?}z82TUAsH25Lo%hv_#ɯG]<|8\4 L v+/Ŏ룼*Wbz8add lj(0hY :ui[6 -ǛOoX+Wi@9\#/#KMяccvXldOQ1Whvx6Ofn^>>6)u9]t˼rHsЪ9AIO1[HHINNgה)S{DbPkWRU5+E`^ZCÆPf _8 t|4xmll(.?(߸(&wr%1<98׷ցvdJG99.0Z ($t@\Raa(d}]C~FvX3Qpp0777R|&8ֽ3u7A֒Vb,A`Їiӈ^^׊1?4ǶRx %'ķQ۷oo'CvxBt]իjM@ ?}D ` >yٮ֮*/\zQJNNȪU Ĺ`rk/"J[ZzvqK!iMMc2FPaOؼE(/[H34۸ #=u rvvRt^»yлkQ1T ~YB8ܦ4$v$`OkM=K\h025%wr|oǏDȓFg`m\dm3.Zw,n%+*ĽM8`73!E.N 2^;HENXfßfEyhk߸BiY7;vlI?!>#b}߉O\*+`neB*%D Ǐ?qs>Ay2h²NNM B}:`繨_VIގ7KJJ8HHux(j򘒒T7oԯ7nTWW˫kGE@5p D, \Rʠ!e g0ڕn,3IC"?q9 Wү7VUR|I+f!Ѷj ڂNضx˜9qgGS|3exv{o2kVxj&²5:"ѩ=3W +ܹmjiKSgR)gmzK!]?p^Cl77geepDjuXnB ctϹ1TU#kgIgu\_߉@ΐe!tctto?WDAAa۶m>SS3d(t %uuZ[(|gN_ϟ1kA>uyzR+;vN ={=UC~r %ROO.ZN54{5G_ɰd={MPӜ9֢E,\^avm i㎐La3Yж yS_d_>=?B=oy.R ͜噼+mL-~) cxņ;1~شiSo "1{,$}K.A)h (/$g]OZ[1@EN /&E~n=vÇ|i ӧe Y=/_U6)ޱo"O2>o/CܦܿNFM]I/c` ERR7@' Wl(19<ի &౭5kύ UC]SqIS5Ux/Z^ZZ H@5c07CC/rY̰oF^G9hG%<|Qcq" ? XԾzDgNXZ}81H)rS\7nXNJg#?#4@Ј8Abk{M=`h*R3?ՏU?9]D9? ꚞg >~'.RWlzLL ǷQK?LmVW;&+i%]}}򦅜-Ɲ MvkcJ O[p^?3, @ qĠe( x|x'n߅*U>O!Wgܦh K._9hР_!~!mtbH|[qp]7_ e"Bc]8@ Vi҄D2@8Ic]y9 { !^cُwr ߏ!I}> f)M?L͕o߾Kuu5aV0`qqq;wrSiqD9Mt^@#!f1R2;;;gPQj*Ji~Yr]=?l]}@5*йs҃q*yLZQLOIp`\M3DJGYX(Z_$ˋE:q  I޽Su함($D_QwttDDbb.9++Q1 ''xmilN@;@㭐gpojä2*rr^oNDYȧbۆ'ױ%_-oM62ת.IJs!rA2U2[.)`DWSqΜ|1xHO+cҮ{yZK΂eIccnKK ~Uΰ쥪K~T0]аU aqf}neUy\#Gn=k)|`97^wmQH6}|:HNVR.= :q+hdqTnRd1Jk)oW\\\)Xn7!7Ԋ`{f#<$woz[Hbn_ψ7Du6$Fĕ #oÎhiI˘!!E$Uf72g;];x,EgԴKcCeD-#Mt00B"{ 64[1ˋ3˘ch?W?!&&& .qz+ihؘFtij %Ii[sZZ?OC^3P޽%%g^ *)Ev5=z{$$q_G;A&&4ȯy;(,<hm>8J_A~Q3{xx@[ѣTĊ7J^NϚ-a p4ZEYuZBiT`Vh!'ڝ >OHA* g<㫋pLFDGGCFj*޸o2`9{J~ٝ]棋U :(**<ʂko$<ޏfu{D)kČy.(*+k,׬&oT)ȵwD-X/ Lbz|ccMV2H7t鍥9B54KǴϜMD  `i]CEB& |8_m HqHPѣQos|G6D ,#eSٮMx3P5kβM>Yn?7OmFMJI~wFgĵ@h>g5x>\2*N:ԍL=3a/xg Ղ |Hٶm3kn?>nz=o"THگ͑\y>:Z4ͧBIiȻw];Z;(|scv`i]_UټQqqo *Aay!Fgi H۟d8V1n$%L3FܜAL&Ac48P1VJ^&0>Ys:::V#xI*s6)]^N,O< `+nTe]Ghć$ڧRܥZf QjР.d02"7yGEi|0/\hۣGTe@Si3f}ׯga|u&qysE+ԉV߿n_vI˗$CIH/4_?^=:ZҺɽ2P/BƠaZ݋Yiim%x--G^Dn ۆI7>7Oo}n ̚R-1g%$ 77.($d#Frr|PX|w""kQ)[8qWVnмPi&)y~"?N]>Op&$2:vܒ寴qz5,KE-#8RXp7篯?{ du᫅ gF ';5Fk籱$ }_,U𰢦" ф#(UWA\JA"F ]YF>Ƣ],<ظENꄖ!Cdee߾\Zgdy\W]E.ϕWV0`ǦUyܗ0F }mA0$q؊,pe9R}.䄢Ϊi+ŏD;h}$!XhvL5*kTҳL59?5ritۉU\%#6M|-ZM#>`-r1(wWjl 6H*3+CTmfn8^w?hGni$;N =o"IYlyxV mqK*'OJ,~*S8} t8Yq#GJVj` ٭ Na mu˭Yp:ΰa/(75 忪IOљs0.L?Tv Xeb??%(gַY }"< Qss{oZFy۹/śPNNNֿF("Sԗ9^aO𓁁=bdT؅/vD||:zFx"һW(bJNcMYhA*F2%Ȉ'UX.`uDtVq|k?]OzG'M7qgx8@Oé,xK$.͓ꃯM^ z]BHX;?ihLkDE bg!bRY|||7k|:J$_ ^kmb Ởu*+usu ޼hrw#moݸZ"_z|DCGA?G20:ɍJ)UߢNAN7/ KG;I n6'NC_L>e$ÙV %0?r$oC{CÆ!DDn99+֒㊒1qkshx{KN&qIKЪDXfgiivjY#]|&ڽk-0!#_oy격<֏}m=޼ @r)SK^Z_T}Flrs.|u!D߄Q OnԚoɤE%i҆߹#zyrxJLCCnEEEJ(pKHu wVo??nT/ty61e <}'(6W Bzt"UxQ𝉸AUΗKb!--B+}3u|uh=%KU3_nޛkjmEX⑐_^1Ƀ9RY|Άy`^^1ͣ )a_ԫ_6 7>GT6Zn.xä){ Ly-b~M|'Paq[>h%P{\(V&kg"y'PCno‹ii_ĒĴ6d>6T5" kj؇_rxKG$sthykt^wEriooko$33K?KJf߻C۷9˭WO@GDD4{90mXhTT$|eǚ5`1`On N="|?4JcбϞxc:IJRQQ 6yp +,D=llNU/g?eG `hZH>x0m*Bo7C +%2) Ŏ]hqw]7 W\k {{=B?roSƛɡ*s kėK>()a М2T0>61;f]&_MqDža=y%B/]״o\ċ$5 ϟ?8y(fddB'# ,2dŋy4n>}Jgͼ@Mg㯎XkKg377IBO0DYA()!3! vvg^^Nb ѷ7w(5;;--a p+Zd_=~,;}D#ְ+$2k흱WiȂ?Fy#ZS#,4j˱cMYw;NHVaFs ŝZ`\Ds;}koF!ѣwh|qO{[v^^q.>F>u0E{Y|4x OG:::qżyDd?{PVXa``DB% lo>{PIr$) =/)QVvs-̿AL X[K;UU4t`4rC>>PupӴMg7ϣ΄C[ͱ8y;]'hpm)ֳM\P8Pifr>}a;oXZS À}B\$RT@z-.n1n>xUk~|2|2rܹ>g(_{#Z ƕOdƌ]jҌwd)2w??~c{+J~Rn>>mmowbgk628*uѷ!C &z 套Vb@huy4z;w'6=fy<ðB,xzP' |')l6=it:8)J!4m]7q%R{E3>d63 ٙP2, F  ԤK00FyB}Tߕ;+-A>)޾=}y/e C_Є+GUNJ _흪~H *9l]V{߆n@A\uP uҖ"G~ IQ]]]/YDBBB^^ԩSߓ#֭ҁ^O--?fAq1$3Nxd5ŋt!Y{m }"W>$Ҡtvo]"3߷oVO,y `p!5yOZZ:rEEԣxw$P#b2|yUvC'1};eq5a{a70]&BHa$5`h18W{i>!gٜ>{ ?o*j*µJf&C i *+9'WV//_zk.|ei-䙊$#G WLL Æ5TlL(ިOwFg`DʴM\]#, g3:!֔ŀ9vD~u JPTq---L&}*MuYt HvRD!ffPr"^g1tuE"|dL_|k!:S7wRJ3jV2EUăDq9gy'_OҴ(≠XU.PW(ꁵu4 vL~~:N~X-JYLVDgC#100۷w߿Oٺu#yZ[{?Tޕd̦,W~usDzXrx+<=dut GJuX]T (Oi^!vS".γd"xGyy NP\ l E+*ĕD姎gkze^WCWqƹuŗWoN@ں3W1Ul׸NuUedx#C… Qj*>8l m0Ϗ<-EiE`˃B*}&*uo RRؒ8yСC͛ko+q_9ѥjjMŵfM{եrFGçnVs#>p.bE8wZ** Z$m gD ܄.H*@2rkO}{u>ȘccE++Wv) w;k6Ov,*Al΄澀Zw=TRB!>7GƺƗmKjaR_t ƌ!&|#6H8أӗʠ/W[+c gf:;OCitI!q?s-ƊK^QWk}pI^SS7}7z" Kb&t.D)(-v}POS)l^%ccQM%Kg}D5CB<; h=%\VrrG*9mɓMQr"o"R0A\%_*pDDN>}0SMڶ;^7B$y"!!79k%BtJIxق@6j$>b8efyv>0\K__S.~1fSa(T@.[BJZ`0/=bll}/)*6҂=׻wGroN *HQ>/§|&Ʈ)i̘s† ‚ۧJpϧʢw)E4.FF3.ue}0SӚӟNF:]4vW Ւ%f̦VUF(MآrPHL*2AjʂW78-fR;+34Dː''χUBW.hI 4c0d2`ܜPNp{$FxX2^Z+tL4sgd̘¸wG{2ߍc3e ahUe/w9鈶˙AJG644 H{}(+8}uhU_қ1LDw7@',9h7oICֳPR_.?bj] {TV:mkkj:;10#cQmD @'229|(ѝ':K0KLvm~nnڄ2i0UTC&L OtCFz0 QR%A7*p0z͝;w萡# g"j'xm=`I .K>ŵuUI>LLRW|Ll$?N9|Y }/-[k jNm/f^ȼ1QcTUޔL0СCGXȇ^k![ ..VUeۗ. @\|Pa={ʕާ}hm}Ʀd3qٜsÇ<ț) ({1g;%!vѶp93}:TqS.逕deblm Pvih]>7@0?gynøqĮ]#G"A]|6w,+h>AHDщZ#|S&$$$3:̐Po^H6θketyts3:XB9F{P[ RA@kme9CrL&ڳg4|N7+ ~!Iy$䐖&XZT3aC0ԋ͛" pZo/ vm ̾*ʏuvKBgOKWXI`Yajǜ;w,zz[f xx~Wh/Pe˖-R9 `\`Sރ$iЀP)fL3+f\B >Y2>p|޼p}~|a[ JmC+ g 5 z^ǾƒK@Ȏn+&/..ƍ퍐Z`Ϸ)+^UYE ~H )g))iO ?cƧf1ɱD9L/U]z)$Ի"2IO |._\zMh6f NF}UTLG&jkq73߈$< ~cN;۾L%ݻWDD$[F ֯'U t.'߫fB\PZtlR w/BSH _ᩐ%SP:; #\| ~W"F4zٚ=Q*@8s4w|%U>UkD  /pu v~k4nݺ$zcZ\bg 1 MOO~4N\9 rƮ7xu,??N(u 8 7ڠQjUZ=w!Źz] SUb{8KXjxPIIi˖>){ӅRmBG$srL n`/} )YnX3yd###*,is.-!:Iu] AJ.2JD\Id@2AlLD/$XA2Ȫۏ80,y)*_T2DZ,ZFYt0K||ZEw_sH ysd?t“.&vZC'OTaMԌZ=)JOg&gpma6TLB)UhQ=e'N'4Q<+ѱ,^^g}ܢE$ RND ˭ߪ T&BﱒSP`R™y["BTqKwcK~W?#7nχ3(ȴ OF3<9YRR2޽P}D0vE`Aӧ4s$xeq_utPtCl!IgϞ~e)}˖P֭PML"'K_?x%7WӓhE۹zWsFz| K`[olb<PO B=z,_)3*+0ۀnU3rOFFp}=" ;N~yG+W8 W' -)޻sZX))oذ\LLHVVV\\€Ǐ r#444VZUXHYyǏ711AUmx΅۠i]j !hz:sjvt| Ad8,vua! /ލv{\#zM$!ڐRކNosJQu@zћLf/g$--d.-7^c y44#om|bFm۶,zЩ ,QL>>Mm Fy!al}=tıc naB}| 7o߾XX@!mo{ ^^WS*63aPU`5B\*Q!\9D,^,;[LMU &L@<<؛o7pٺf$+E4ljHO8t+y AH(|!scg qBjjސF'vyY=;yтY#ۘ%u6س** 2#v 5)´!{3t!J 4>&ڍ atZ>'=pUpizn'joC&3J!W~rRI%c"4NӺNJooOeYUUEH͛獖ڍ<&ҸYxF+}ƿ[m{+.0Ώoz̴rre^ѧO3>>2eTFeG 9K5002`~(hjcr^ަr !^ss`ȵRzJNY,~.[YIc6['!,"-#Gx,X8稁螮||{$h욚<,+F@<d>6o|hɖlV_&o_BF쁸U )(@JJF!T4*ΡÐXOo: %SEᄋ$KtBCŮfϴwC/oķyƞ#]CC?݃E!!鄡W4 +|Z8HD3-"yDU9.t!qeazZRC ]fD5fz֌yN&&WY@2qww]ĉ9 gϞ&BY-~9Igg;$WN~/(Ю&#9z׭[˗ŕC)g'L ȣ#M IsqJ͖iNܱl] hDx8!* VyeeF$.+*26xCIAodJ8BlrBD`wv*_]ASc9yC\4+T-xD)P m]Kd=aYttv'LI~ukUNUecz9|ɗG's}q3ΒwN`d#/###=}âÀhv]#_em1+ɊzIf# :߾eՃ22)|顁fD%H#ժŪ=㝯 @2{;:Z+}HBؽ}V-=sV na}kq~~5 1"NR\ApM$r W?sZ46"LС$2=O=!ϋ,'Ϻg #6@4 P^h>#v55Bnl#E}Ўw]U(N?ˋ7evmךqt1o F^$k@N P>#¾GC.W_444ه&דɡڕz?ի$oU/Wnƒ>dȐ|TIqQxoh%h0z &2|MbfBI wCJAWlkC!%DK ņEI.)1&R{=xAnF9#-~͛xZ8W!w=G:wE"qX!=͜ȷcW^ÓBTwCCpZxq|{s>G~r$sB BXXἃ9{Βu7XljnS?=:jԨÇPxkj]`߼9rEHulΒ kد444FЧHt*Pmlm _]~EDV$.C{ :`ʨd#3@zS{yy*uu^"R[4"K-$=TT@1z]N bbVV"[[2H<I;~/FWKMU}Lsڵ^|CJӕ :.U}U :%fW Ở e"Cjj*P+ܨa̻*OW5b\H`2>hѠY;q- c\'/*뺁sA"D1`BE1gEQFL`vPA"Q HK9b& r:xAywbvU:gorDOVNQ&A.]Ǹ W( I XF}(_ld8ۥK~$% ׻UTc9zL*dHf߿J""wH{x$j&Y%Z7c| d(5Wr.wV%))9L zO5#'S6~seMyQP))/iL̯[߳\O9vd?Go}D_$G*Zc`N!z>Z5߶Eч]=qɡg!$vwd`Zp-C.5DDW!*__y-EC`!粲U99~,̹f?7Ədɒ̧ %w.]:jD>"WjjK|%z̾yS4w\ʕz)#HgKF25hf>Dmբ(`h&x~~$f5gEBLBewOCVE{YS;Ρ+]jIX޽왆1ӦI3wr&W꧚1Qפ&]R]enwŝ&:;;ெ/ ƦVVV@@_ s̙>}D۷$7& HvGGGy!A qLZ&N9RNXDߕ,JOE7nL"hL౧ӼW %({RV&Ԑ5k&f7w'i!W$V [AY.d*sć<IXX(*jhJ0]qF&^Ϻ<ٍ4|(qxcHQt+ MuMP وxѬY:)hKO!_Mnq. q&\y|x; J)suWؙl8=BгWAF>aSH3gd%x' /^g#ૼ]y\DYY%cd~C-%%uvY|aeQ]['!tvv\bC +_HINnn`gc&H5JMejjNMC ĮɟZ(QCVWNWMg%Vnμ_z6goJU+Ɠ싑{^zq~@/R!4 B0"$녜cL%2e.rylB$ۊY׹s@{Q m$N]a0:6t!ifކGBOnҥٸo;@=n3V_>,\dYM,SrL?>SsA^|uC0'#ޭ_H~fnfJGGc~~ uP&1@D cKW;uSt OO*./%11q!6UUUׅ0=Uȡ=o\wW 63߯`a(W莨%Uh/w#& ߿?ر){jgS!mli(__ko**bh3 4\k䔑ݢjjjQA޼y@WB⫈#zݼum%&&I.cQdU==x3p_p>fM_8kAB/(t tHȞ-(X+D bH9v@k1)Q)vC\-S߽8 Zcf35v\|e^!*Z['¯уfOݬV4i1@w g$}.ۭx.?|1(W{rwFFrPI1Np.G;Ʃ~gr6lTP|$0Nǘ|߾}kӏ黚rϕSFw:Hv6\ۉuyIL##|2HbQ\ױF)RRR D*CW oZAb, UoFŰaV| \伴HLypեxˬ1{(PL,~Z4nnQ_ða2Bk-|5yZ(_7 4,JG _iÈ( `Gላ+'qsc\J$PڅFCx&β6qa\a(mR#6_q,TT'|]GQֳ_%** CaKLc gddhUUm^(r962  <%2dȪUF Y,a , fvv53̚{~&A&;wWIZV 3A:5~YMjނNg~6֮];h81Mj̐~=f x7°YI'4G >{ոo';`Yeojfbgc.Y11$FFWMf! / /$m@& ~ƾڳX)E=OC*DknM&Xڊ `~>@C3x{4`{g3 EGpǘJ={ ;OR5 gr9#y=T-nİncYيܯ%$";P LBSO]ZU /shj VhRh4!!x$ JJ; hfK3s>}zF\\\FFׄX@L9ʴ-62>&P?s4vӀ=-MzOyK?n)tI#0 杂EYKC@P5H@Bԑ@%mhww El|ZJAa ^ 0E?(T筿A U<LM9H|P?^u:Eȹ{J,ihjtsF?g{":Bhx1uN_hoo3-WRR|=_O[iqbӧWoUa#ib_׊x 4Z4Hم&U.]‡QtKQK@+**iC|E`̅7,L&7736vHf}TXw0@Re2KbXˣdYX0g͚5}JqaDb777?~\;0@vw19CP4<1㐜4, vy6d;VSs8 #~nL&M+YPR2lޙbH(c jMuu&$e@y\JCÇq ^BH/+[p%/  +++Aի=%$ڋ~N]jsg8y;z]tasm$9Ex|gyM\Whp ~wE 11 'G$vx&G>#q1|`?΄"T%iۼyȘWuKZè; lC+gJ:JB[bA2a[){Fwjk!< vn32J{2?liXxx8>i"YYd:\zG8!w[ZJ wwh'ϊ%& Gt8chCHx09K]W/NAwCCX^.-0QFr8@ f1ɸa#)i(K&D_ApEȉj/Lj2P|_-`IEC'+KJ:ֿFnD!oWNb8… /oi(_=hYYˡhoݏ 8XS_پ}XnJGf f,-Ү7Pmy`hP+&w$-TP/];0¦Y|@659Y,8*BEV8{oQtƌmOtu&(kk|#E=cX[TUU7!7CG ![ 䚑#OE-_kosnϱ wW Oͽ9#sV쁥?+IR ՚^z=tJ :>>r$7yy:tVN*4j6ڄΗ|X.⁁Z^~4,J2>FǙm#3ggYيNi.HY˸_~؄Y\\=܅D;t b^%֕"C ] jRw-H:F:4DN+ك&Bqy޵a3Rق(J[BzC{>{˽2sG G@C|ߤD3/˥;1qr cTkuFd:ȱ`|,P:/"Qs1#p 1ᩎ61?tc"C)|29gK{@6_7rr,O୺B~w?|'N~Cx/,=]Ƿs~^eBeQ5#}F*B|IJ>xX\`"u_P!Ĉc:p99wA(8BeoTemq ZZqج HuR|Ɋ+pg ()) * zdHx/^Q- =5\8&9HC]Zo}9k "0R|޻5,bCŇ [t{@&5 |\z@]DX)weE=L|lk|gϞK(/0^U3\? <, 2h KKKv*,$!1i]kQaduaMKS07誚wZt#1:C-+Gq%b&*аǰxӁx (TBo8zB!\T5Ha+16WU  >j/G!4ԅeB帹!2~p޼OOE@#R_-Λ) 1< (l AO)<{"ā%W][b`TcW=/.r*OOOoedhVUm#988+(N0 { HoSRa=)ٳhp*%)%'""ș-xgg%$p_PlHmjbάʜ0>]L+\6=իqfqFkfw???UHyUV"0%qjʒwް]-dܕ>~7moHב^Y[%)ys=LL7%хo///+͛Dgdp}L{c REoq.\?۳[[ >===)S {ëi>(Xd`YM:,sBPJV5BFtH^Z[YӏRΊ^[-bDr0nG&.uuh^)^di}FDt+~~ 5p9ŽF˖W8vBHȖO;vL]Hh^c8'\6vٱyC(Cq"C_ݼyکY]#76 TSDEN6ZbNc&n "7,""޽{Νí=&Mt ?jjHPW8",^B|||hefEihQCu,# W7\׿Ѻym` Z ph0>WdoAPTII4sP/_&O`0/>B):y 6=#aa1"%;lmaZ Yݿokk~4ճr|d;;:WZ|_||Kooaw:cp?|izy;tOL:O,ڟozYYB"ڿ5c:6111IM KaEx젪:t hHeξd@Ba :=hOŲC"Տ0ByRzjkQ["v5Ɨ!&G}ĠƝں7oq@ovNtD pb|TX;*q:TF@aD4E(~P|l{͚4Z9d)++Xo޼G999p}oa&o\x %&=y;&V1bCwww擝mXQ*6Bggx7,MW.e='wkOo0 L 9cG(腛Rt q w3=}2gee{%͍goj=w..x=0Xu8uvBVWnٲer9|;ez&>tu!779\mBm.տ@"qwWk)LV ^^2w_{ jwAXslDvdr9vGJHh=?~$'6]y(Ǚgy/&&&_"[rwloE7 PW-Z"UWzKUΧeC$%j9߃ɜ`|#H1#yΩ.$\.={mC#(0 xәyyyPA!)|Hૃ{IǿRMG__pŲx#!/{J9:6VyJbbиo@a47k#Uc e|(d FqԱ܆dWlW6A^ L8c_f"pn|Y7;f99eec|@HjO +eTԚ}5/(;66Qx{hS7,A^Y&*<:}~S=" H/8Wˁx~bCaSʣxW#+eNNٳvC齳[==Ã\7o z]E2-|Oυ=}@&2am%&80hm\n KKmIGo<įdo{&@Uiku0 yS&y 5$~ OOx!^dK&'H!6θ/h%bL`wwbV*lE) i JJs8_(pqYilŗ8Q(.,|X;G`S6w;rGO"q8[3/hBsr_:77z/1PJC2'jq]dDVSPvTtbD?b_3$jnL%Y^RpC%yp9^Jf|$*Q%RD+QMaYY/0Et^{yƅ= O0TUv``<:v !>9Mnt#% ^(hр2766{E.d׻Y4|%+ܵoSFFcޕw9SN9<+|\gۖG[񫗼,("!cl|KL; U"GE%ɉ8YWO7ؤ|u  .!&yC)G$kn%P&MMKF,RWi3/^1窓9wuu.9a7'O&\|W$`lW ʖ`*ӧx;7'OB!fG#O/ *yV *5ل=rmr)պc;Q8hPn뒑A\h誡#zXиX 㦴^TrS=dʁ(0`=mN Uz/N_(䩇wbi8 KJxleF\%/HNl.?BZ]FP?/͛$5UL/pn>?d VTnќ$j'Ul'*"N~|6@|K9В:4T*,E =TTpp09Fƕ(39,fsg\B Çg)P ދ c/Ğ=vgeU$%IϦg㫟m$%k7ypd$T JKN8< ^4"k3Ynnn QX=gΝۆPht;*5Aۛ/i0WG+#׉hX %NrJj '^%E=

ƌ_f&T-"^}2J ˖M={'櫽eڑC q-P ˆaԙw-vrN1SK!]=*_J͞+/nP??F6$#YZڠݽ -[w7,GlEEW[ 0g*WVnƻŗEI|%M7!r[?yp}:rqَ QC=ji@)G~ W䈋{2'U5ś{|H^~@IWnaS]"x?;翺*>h2o:uĄN2AT#6ٶ'vk7iLh(ll%ŒDĆS xC2{?P.j*B |%16؈ whQBIZZZ222spt}D$¯l1>TQQDK!1ea;O}%4_`P{zzϟ񕰄0m?yodÃC_x\1T{>,Yg "Gdz/c͐ -*P>"\VD8uu(4e. ?:8pss: X\Fʑnhq6 v?ti܀Uf5B1i~hn2cb9.k=Q ㈳>4W88u2k<{Fi:'Ӹ?0_}i6Dq %R~㢎F/I2!FyHClye@&YڌC{*))|bwU 0]zq7/ eF/2_&/^0rn,':'&hQҍ`=tQ"f5-*,,N4A >pS$Hcn^GIьMQ} !::P\R\`Bk#9aIkaa[n9Z܇١c_ 2c81W6(06ſ0 !W9xfG09E$wP Q| /Pk|j0wv¹#GНbc(h2m!MiI0e@NHCWkn'ֲ$+ˠ–&U{9P\\,3cQC6(^[ t6wDL s?<9$8wMkkڼy!NW0--YgYs0]]kTUѺup>jsM4hB8i8"ݿb,trwYXxbZ X&BD+'W՟ C,???|_| )}|rr8_lsKvrsnO LU~uϯٚ2Y?I):;J3n[ljjjn}[`Po>~m2}|u*T] IWb 9x9֨v ><(yL;ŋ[O"2$/ϔ~U 7 Ag21ђr'^Hax9uM҄sIHZKժő0d9~,ix_ɐg nCe0u[Tzv_œ7D=ĈBF.9}7VWbӪ͌\.\hD.BQ Km'ʴ,-d ~Qggӧ}(`$],;{DyZruNN oy[irRp055_xP}=VUdb~/Fwk?Fw[w %ݥkUTl.(S)Ce.]ʺWL''ZZhr8O\B ԣG`vqÆ i&,&ʬ:{{ =4JN^wʕQ0<Xg߻4_lsOsu . W]17=∵dSnL`'0--o_+ݽq7/)(+swL}En:EEE*h~_$O . <??LL9AwNǀs|w:~ q1( ϟ?hԠfW\R37\0n _ՂRQ"k"{m)-}9Uנ%6!":M&miDTUP!bEB7ݻ$_ut4p&14"'&ƪ|Tkrr />>_x&oCI[*X8cE@ZW &;(TS㥩8AʴeeTh1!MNk ]]`C~3f}Νpwl8mMMM\ |fڵkp˗ŗ@0.2$bB~*+ /_q*.) xEG"6نF];,Lk\^ʤP c[m:Ճ!C^B-V9fxK CoVն r{0»{tvxz̼= 0>wbϘ1z5{;wzK.Ș9TOA{rtt|#[FH]XR2!6v$tPl|sBòo]==5Η x*f&^ނK0YYfz1lll~Wq Wώ=Z]]/S;& ~?ɹ8YYxf;|5|Չy@X~Y xb!?!~ 3&J6gFCepV$k>@]3:PO?R'#AYYCQg@ ghcI~WGޔ (wy*e!.}"%mBU3* M._*Z"mTHC]()2/Q(m e_\Z~yvmr ߙOeLFD Ͼp!C ojxVC5D꽒p{pU]]娮.> !] Xȑh4fz6Q2NB3__4 ۢEǚ[;%$^qwJ+O8y{?oWWF""M~}ZʌW?@¦ͥKx3Ġ㏍SUh؋<UV5|G`|ՌFYYB^ (*s$-+[ )+ SDEEYN?c_Pzl2'd޾e<^z2qϞCt"rx{3_$G$K&DQ!JWwH_'(b4G|#ψ"O+D[LGz||vvcC4崛^zk|[!wOj$I&Z~<KEأ </d2(.#C+nfA$ u ɠrhoR˗P?Z[I|k(,SMMU$> ~g> 1>!!ӵk򧨪2&.ogSg{bƿw Zݓg2-,[GBS kiitr@ .˖}8r$sŊcǢXu--xޅS7oo666 8֙xĈb _]_9sə/\SO]en|+]l|Sͯz}YJ7 \ $'C{m; [[N9PR懛0#-Ydܸq8qw+((@肶v/"gt )))Y7#$z +i'-5>p:|LΪ}M&4"?|%zrx[jU~Se$O@H4I(;`T"((( phnFуRI܌ Yuܴߋ!lWc eh+e>b;UWTnᜏJ[r^$B|q#[T˃.]y9ѮA'E"/>'_z$?|u)P%ZCf^HR|$Ec+`e_WFshNA䘞!K&U(YƲiiOFD/ԻG&+(0˜K\ޮ]^V"-һW0 zzLM:_<5]K \  2}$q*y`v@m6 8qq(W'U|Fav6ૉWC8ja㫟jջ^iY35:|2QPwj@0wj=q_Uxx`|HH_WOTSGU:@NNN,[Пt"*kJtڜ!tgU68^Ҍhi)"_||A9mt9ibW3 gYS\Rl/ (22< UeHͷÃIZ݌-1ZZZT*ի/|eG6 : ҏ-'9="DpCqO6Es"p }4mFIIp[FM1|[EfT-Ӌn~YD`#eD$Ҫ>xu 5ҧ/PbLRS_W2 x My ezH~pmn=8a , mW>)| 7[OHg)^d X.F|ՊI,x[He 6iP ^PYVW۔KKr.cLcr{X:z©ϟ0;ڵkGZ[ݳE 1쥥h*>’! @w ב/CP~ݧ=+fJ%߾55eZ Ph b:4?*һj)@aje%J SP1t .pss)eP,v mL>F)8u >`hl啚F0s$:Ηȳ@7_Q ] w`X=]y-zz?ew>/_q tF;)gL?}*#WR^O2vXmYyѢEpYx8=)) (#ϣ&X#puu(ҥKوc`cj;PsWÃU.To}8=fyhnyCU);QPBWd] Q.K¼ҽT~z M1Ǵt6oNǾWbh-Rlm&+sхݙƒn g ,ӳ߾;iZgBYDSH' Oy _p]} < ]}R9_+a1wEg!& Bp(P"Zli6 _bMt 븾?'uvLVͅPnw0Td rЙNy WW>_Dnpj(R@GDy%HEE _1HNFegG1@^^!6E-Һfw؁32 wE1s)NVUE<5e~)'& cS8V_?pO˗00񄉯5Ư~8尼< 5FYm Ziڝ[c_GnecѰCCC""ݵ ~RP FRȕ=SPDm@@XʹifΜIϧKat E}1E4:t SB_^_ag!LYyf. ʝz KVk^ho~BՀ,>yM :?M9\9zs^&lE ||&0sss2l/IJŻۤ˗ N'JH d^d(yƐ_V5_=3asQ{|VbD9wOH9g Yc"ج"2WCjB~I}#}MƊVWbTTHgz:+۷95A2&vdp@ iaG[jKtKmmHL8WMcv寧RRRHȣ+"LEe1,J/bڢ>Ņ]/px_%{܅ǎQ`OQS zJck{zPI0klּwUTCOC|΁ sx?p/wKCaaaƍWRmgff4}g,M}^LS*!999ƅkrNҥЇdxycoy7:zI!u%yife:,ʛrȟX|{5LoN9IRhJP`+Y~.{EoV v%y#s|D2)]{*k&DL N+q #${6 7ՙ3!E7(Es$#,UŮGr^0*$2̘.(lhCW`/(POrhhpccV<<<>>>JLL ~*qvtZ|b*&&y"F>yzRY۳h}MdhjUUr8FDhwvvr_НR7m"/- UHc buD]\S74\ 1}{r@)D6\dN_*y) @E*9L|_fA4i&Ri}}cJRM81<-E/o&x4|)l!P+-:}KnƢw3,-LJaM\m[NXk+  ш,Z4&eATJV"(%5؞$ԯ}۷0Hs&RRRX}‚{V֫ē X,bg_3p ˝uTV1\ bI [s#7:/gнtP4 *QXϟN^&"F&c0{7|q1dpjoU=>iL|ﰬ,>5l'mr%'#/V0(/wwV ;vLJJ:s/pǩx <4rU"K<=xyRSSp|3.?-Pũ۶ vd;(YX_I2 !MM' `;+fy&Drt# QO|{?7IH@WJKo.N'H.^\g~Ġե//|ΓɘC@ oz_7ZZZ8g42ws7ma?+oDŽ`]G*Q!BN_?9* mbu#/CwLQ:qn * Fg­P:.u;:@<0V}uQwyȃNuVQSpC0坨Xiz2WM1]U9gP袽鲇\ t+- '͕1߸8IdNjBCyP%%u%TĹo5r3N@ۆ5vvc)*eCW-)Or$_i&cIBB•1nn0h9^Ƙ?8p@^~"Fpgu'ǎCb _lESPcc#0B$Pq"ڮŅ&0qԏQR\0 pL(NВ>1a''u 6 P iafAƆFwLw0},YeO%Rk<1i@z%[П# ^,sB9T~ǀ=USS۵k*pY6`ѻ۷g?ktNwI`|޼t67A*:̪zM͆xzEtw<)>#u"P4#Qfx[ԠnXel07g#C/A 0M͕h0u`=p/8!7FHp%.ZomDF'X+޳0*lQm9d}wAna,9q|`/44~Ph%`L%SSE\rę}(ӘaRees5qrAtN` hJ4nzzÖw{QV"2., l:6M W̧R--@ 'O+ 8d.ƤNuvee%QGۓ'pmv JЍF, Vѵ!L{00vLX9zP>יڋ3hyY>4 1)ـzzOYn4wwc㓵BlDt=g 8jL~q` ] 8VԿsz:kg_E2~ ASqElQuyFID.YC=ߘ?9O6 DMqXNk :nu\sxx+_ĹoK0qڟ`zؕ47sGӱE^ >EaO48*"XW(FCԱ~ܽHI](utJa/-g>M[?& {&}%iFkpltM2{A:'sl+''w῵@ԩV>>>B޽TF9r.|/oa鉀Ghj E^ɕ4=Uv543ݻtvM%4”7aʯ#Q주~w]E'3ZD?3O%؁4 lQOKW>S@# hN̿GΆWM4΁[jra+#%kSV䦵Im?apU٬nYs p(b*KR-]J=!PRlj{<=wq|FCpa)~hh鰿! y,ڬY(˗|BX' 1NNٳg7qn̈́ `cQt@UՏzz{ M{wBDW:!Az]KWURzY`q LHږؐ޶2* ?KII`}VDb3# ȐJfR h ?~V_Hg28vMWֳڼh#+$RQE>)\җS`QgZp1F$V$[U5s,'|qpV%{f9@q𱈰,N8)CDWmS] rsAR2؞v?][Ҷ=^95 lcձ%y+Ծq; # ŢdD,IG{o'xC0,C@]%GmwND=ĔլY/>n _+} ;HSS*~ʬ-pu$͕"uBMБiӯ? ;w7.V /Hd8>ukpcE뫂V4|gz#+aP uKY,rr$ZZNJ57 ;[u1"mZ$J8:@oaQ 6"$CZǻzh%B+}` XdӫZ t.>c D&8PSLNu@J LZcsc^5%8&D m&n9hmGL >`"wob{&dI{sN\Ϟf-s3gɁ>iL|ﰒI]]WIhMnl0 ᓝ?/5۷OJ`>W }͙ GFPPb:Рz(A~Bt]ŀcl ՀC" ,[~գXѣ(}oo/V߿ӌRB )t\?MRR!ĨG9{m#''K(H]KO{Qf8m:)A뉡kRZ>?E kJTe1~ vr݊0/9B?2@] zxx+:~8Cs|O\+[4{e.,,H"˗' 6:">UH[W Nhi9o{dyķW"O[) >*3c_!F,'ge S,9rNܓi)p p½~E: bs]1jzUq,DQ{G*P %kw%OX2 _,EL܁yΞu8v V>=:9-ՙ=ه2VV6vCww0ƫi64 f llly>z*LB>of|>~Yr:=` ML-Y2 ei&O1iH/M'DžJQ=#W`κ:mې&oq1rpPц*J787!ܹx?Eݻwb=Rْ$~WWwsz//۰ ?Һi͛llL|G "%0YoyJs%^W]f&@i@p * GF2. Z/sz{{+`H`dU͝x0H%t]fKj`9D،?_yIA,4bkDⵢk}o/˓mjķ]Tٸoб%9kā4 _k^YI+ +|>h#1Q'|eK4qfg3#"ˢ%ާIKvvT!{ӯOՅZYpͣ x`L] LØo/;8 欦)_||XF.N]QOQ`ċlWWWǼ)U800]pἔwPz=Fh+#)Gd/۞Մ ,wbs~[R78wҺF?2*`CT}p!*.64,{HB 4 q|thtP/ܱG@CȉL%X`t4/vt}կ"n_] ʹXO-9Q >iL|0ز'9D`!9X>EI&'"x~Ps-[I7) E*^#JK`?HS0i_D r"|ebbRA7T==('3fb8?ce>>*ڐC1CCC;S; {k\|-TTvvvxUB ?_RXt: 9'|uX/S'c fK\e^z@L]WhGOq2m"ng]h>֜+M# Pp>')'''&6uTal`UN [*;jhoo4_|׉V8"'@$J4fܽ(j Aj7?JeΑ9E?W,O/^₻4(81AhA(e_1 ާxKOZQ okmasYuX딮vlQ<VHA҂+WTҳT[W2c(0iۃu+!JӢh(IPYX~ 7#66`so؃y8<=߳{bP\N5/]JH), _ݝr>mṈT 7"ƃ\-VT/x q̥4y їB XX6Z[ob@V]v*p~@ L8>ÇJ)+++Ng!+w8pY'`* ;:.H:J*F: .Ze "gpه2[__[lshg<<ݍ[iAM ܐvXlW_/rt WCזx5jk–B!̴Mfh/b b 8EXsp*|q:lsRďӳf+nky' RMfNf퍂|"L8؆yNH9bE(pj L௓1lEF"@e_1 43" >7hFFckvIIIihhļUTT6mA׌A%Bz}56,VV:2Afb205B||s|{v ne('%E&MccSinWT.eB@em]tܥJ2.'AG7<|-ǏQ1ܯhd~YYhL|MG3AK|9O ;Quoڬ?NS%u%jC_fXK"H*SSh+:;L,lnÁs=3g Ckk+־b[x},Tl~u%h ($38a>~'eD-Xؒ.0-p$YMD|?/Odmy'74FҨsa1cPT@E h]鱰8@Qqi⽅"TSmByo#;|*d a&`8# rgFxH"tVE`k p0ه2Fʤk1cRbSvvvG1cyfq^ŗ*rsVɡ^&Ec...-{+..0ZJHTH?aĦn ˓{aPVTOFc?mb\i4%vck^afk&% i%5GO OD9sV?&:Aoo֍Y6UUu.݈)m_#9NY~JCdv~)O ̥y􎋭/\r;#X1iƥ/y6iz` &vy'|)"h: >'H꺎8H/i2B`@F<$9M@CV=`rőqCII :cLc+a]]KvuO988hhh<vww8vׯXtii;і]Sr7~GJJzرaI^N_~..͓'G}F^LJ@bxp1̌:&zu~xnrNSt GkddL|mi4&676lkE>~k-- ~~97?Od:p ׾ 6avki?f\#YRYft[[q03e rt'Y6JJJ! |h3J3޷bYYR,P8ܘNށ[{~e1 @ II / aPO" h4탏irN0%X%f#8[V6_PMjVXyo'yd+o i@Vϵ{ǰV!7%\IioIL%?yKLD xQdW lXHe'ظR^]Kk̿"e_1 񀠑ae cb 6{-۷;]qqݻkP .eE:@҄EӊʍH~~YI,d0W_XsmX{백KJ:jj_}ED~CPPS9y1"]K՛XԤ+ǃch8(} <5(hZv6yiT[:_qiB`1mt~=͙T\z߅8ǂk'9\Jhe_k_+*.VY#˛7Y`|555: Vyw~! {.:~d录`/,xJ90웳[ǟt!|}-r/0d */C?D$oktv;y?#>[ŲH)l.*T!.(g +͉i(6"s HIMHsyI‰TSd=/'F?cW.Y%s;uz·Tΰ%_}g:1P1h6, HcСC'O-_HvѣGJJJ³P{JK228;#\G#l2y2+ǂ ¯p"'UF嗒n*, HrrWh紴@3z+6n+&MSI6= μ|,4+!&-EqWewbo3))KBӕkp N4QzrS/Lvll捙6:< Ao)##}C0ac3;UU./7 JW`A0u*P(zzz|owfT]uۋ:^Z:ՖiiHp]'Hgk4M4%,s{~INbE " 'Q$u?qX-:$ +Z$R2:'gsU%xZL+bZLO^Sӡ$Vhfnk M1>ۓڱB! [jr ,ه2]׷v*ǥX hFFFƒ^„3,+ <j O;ZoiL|4>n GF?Nfq 7 trgcǦ= K0kKk::Fk32<I-D9?F Uc6jeK&'O׮zMM. ,:oE^洛>>`ZRU j'%gt݃yZ:eY:b#߃<=a?n 8HA; r%mv'=ߙ0RW!!wVV4XM%%؆Mi,|Q#8$q}+@U:lV/X!p{6:Z a,B+yaT2~7~z%МF)&ch ߿xy#|e>a_ {>AIQllw2̞=,@y\0=eW?;{`rj*r_OY_h2-m>] BiL|4`6}}CC]˜wc}O9@}ܹ vy: 7GA#Y}}E '4Thw12BȪ*F:Vge*i˅ 3׫W藄߼ |3vz``x`®n 1u1ai헑ck?@򑢻X.uϟBZ+/l+.M)e9NR鈂rTI۷oXt_]Tn7o%^psиt~t5?']t4&US!Ȯlo= w/)g.V{vݐ:&r >X7s@ &q!u0o}[jSΙYXhjj2۷`̊/I, _]lZ}1~(\8ވ)Վb11,)2j[8\D5sS 0P1p%b[15  D7sssccf2k֬uee54x`͕=( g٭gZ/̓̓MVw] %_TS*^^ffK#dUZ~UU>.-cbի0Bx99U~^J ig oa1SoD\ d\YřꏛMOtJv]&5Ҧ.{"zoesjjɮ+W^g3ώ2e@:;;ULXz#Q-/]634^qo_ɷj*Kڧr~،ZX<@.\ Nhj}!SrY1~aM{ /~6F+$891mllۮ )r*k$rXA 8 i6d lgXYA ,~% &UxȽ& _]:RZ||zRB©hGwG Ւl)r["y#ɮ|bfC#CmÇ 1ӧJPRRrss^FE}£Oq-)6\_fԴ)SENOs NiHQryŚ‘EAƭX)Ytw3*+$G_~qP;oc3깱|9BVDt)'ORײM%Ʃ&Gppl={o<Ip*u2܍'$P9c]r%i.xds0,L C}PCC͛7oŅ,8<<<=]!\pWL=~j}5600~Kn?s?3 &⥥".Ɂ[rD#RY3:.u0^|sF~)5=h~k.S巰Ξ".NA8ܽ{=lX?ršݩqшLA@DK`, v̙So_F4N1a[k/pUpu5ri_oo4&xFmck~:/mͰ,YL'3;mڴψ:2tkj:)̬9vb+++㫗LSݭ'!|xT )<-Mx{O.XGCL[lp7nX&C//"m\*c7)¶-`-0kR+;_%]-+4C{VYNW>3=0@Ig}>|5;`zJFsL8-ԎMvዧ{!kfk&ه liW^- vcH$n00=/fP5E"-_i޽IMcl ߍH.㒲zN_V)3F%1\.!/m۾HF #|Κ`? w'a|K-6gf PgQ))y{rAmuz,#M>$ Vkk0e.hD} }91T8ޡ^ T:Ֆ RWW_*1惛٢"ͺ6̊G#>E<'G-@jDooo.LX|yM;; 毎߿ хx~{<,Sfs%n6&lQ7vxݻ/f< 7n#8`Ŋ`lN:;I y]2´Hِ0 bզ;{ YY $o (!#GfG80̼2 ~BY^ w!|ua!w Ո=Jt M{vw #-* 墨36# cٳg+m0^Y çQGϟ.D}ppL&:$_dwi]X"r j2tմQB˿};U]ptt\H"ɍ}Y_Cq2 B=gxؓ(M7oB!͛7/_Q1XS`ꍴ@ΈI9K_f̖^H; `wY񊆁SQg) ce}Hq?t OCh[#n̋+g)o)XE:Upqڜ"={{Tp.ܿ q8͛ϥq>IDwp?]+Ic30b]+opOfDVER2E6 Y%H8SD^kR!_QGMdE20KK(Wmŋ1/_i ۷9PΘ]O_fnf&\ظ~DW 6/\][O/>1tfDP#5;sr*(+*m۶i9Ed2qċ/0p2 _烰<ƇM̚=[M `ꍴ(F@hE}Z FV[._֡2*_>嚼gw n'y{@_@x3+ CMjn>;jjj>AUma;"|_ * 請;! $I0MDe!kHÅqJPW(ʨ"$w[q㚵0+))4t;c:9Y;.obc%`>G>و'B|et{aj*%`WCD~JoM>Ӵtn`6&"7ש©.BϚq$ _#pl˜ѣ c9_ZF[Ge8,ŠL>^!___66ȯa55XKS(T+R5R'Љq~~)O?r*%✍ϝ Dcp{j5OfNYYe ,I:L{rpKN[VXa(3f(c‡aX@&ˬԬY Atͩl&a+>JEMo׿G8-s7~kݥTV`Ę37WzzeWoM:$''2z2nNc U[W~la,LLM|<8~8L1keJ<7q.2 U$/[N eoSY98kNH}!KxG-wwwVxM ZD++##Z X$@#ZթC#U;ョǰ)(`o]\N.6(y{TB ,ļr~‡էѥL(ه2[e??ŴefF/k<G"UՕ*"YSYBt ʩx4 'mm}f`I/MiwURp>]{שּׁ7L1nݺK s" [@f+c.FtkizFL[&R/0ގH=\c* Y^p=A5lBWU>ȴ-+K͛8U{?*W-\wF&>sf4:F+|*>pz~`OO'3Z |?rg߿_x]sskk+mǘ4^{޷_?N&Ϸ5Arci^ W^RLhѣxZǁ\_^ꕬ$l-dļS%ME4,f-fی@DUz?ѾH]޻l6)F\xIUxkk`` CeKn/1k:u5_Im3]]1 餒S3ZL!VS\rɒ%?<_kH`C~ąSf{ "|C.Wc,|O)‰q{=ee6̬U.3eQ# y~]TzfԬG;ڦOGKݛ!gLKx P>jiqQf͚ 1(xhcCNF/ >>cM}](Xt hc=go_h:~:co,wjG|ṣ>GIDYa|[^._~]PPG;f1EC tYdKR1,$a4iҤ޽{;vpI{ 7qJ/~HF3g秀攔D$UL)9򢋆DH>`nHn' r8?kǽ:I~C˚#322`?]U)F>&dBD^PPWlz둅G\SfSg> tA QڻPJw++Uo_n-ά ukTtb VU\O͠)|evO킂3gP|cǠd H8:3LMMI?<84cn6 >I?!~i_M7vPlR7\QlOoS~]du~T3*+9].K0,AbGTT*nTm\MPjKx5yԨӟl[u{tO[uy`F+ѐ!h=͛=Gx ikĈ; *,<]]|$/ϟ\ׇ̛xz[_CĒBn[^Wk- 5"&OAF ̻u ]AqQ=nܸ.?^0h]X&IAAAHQqn;4"| DGKA^=| ^q\hM^?X_^NӜamܺj|K1 Pfe=YG?z H nv|eCt@#t lc#M$CJL_nݲe5ŋ--fXA~Ԅׯ~FpF9= c^g\P|ͣcz],\Vv9*JR(,4_;:J-KeXi3eH2X} t&SVհ<.@~o[kik!MLJH629تU'Av1WҟI\ jbIE._O5$\7eo6jnm,5) HMM]p8T|J؅$Ʃ}K[ks!++ ^b #_?B򜣑L1m&1{ZL㫐~ D$!oVy #urI{w_\dįb÷Z\뗗 zQtz5agmF ozOycJgȚkV!1*r;7 `~~~-},0h-> Rq6ٳIb#ml#<ɀ#%z|㫗WevWXv,GyA9WK{oaカ:n#L'X+D1>a\QQk j0q3g< 8K~5q<ϲغ:- S࿖y%c?!/2%H4 : PJ~'Է?(IIN=@ KN+??T]r@{כRUPvJm}s0 /m -!**L<5}M\&KJ_CU3 NK1c)U*'GI}QF CSZF 6 pb`'fڿkԌ@\1CG}ӢI2B3422RPPoxdz1)ǏwEU$VH}3rǎgf#\-Va;;˗swd[{ \~<)cY qoyܼIJ%惞uKv6{kB O!UP7_UEDD@I -TB嶶DebW1S ;׶óh=[pr)ݵW_jL?d7OyIX}ӦBM8PJ(|EI$'O_^~-"/6F($ᳵnmWƓw W!y"(^5t[ '*T1zZX1$3 5 Z]zUTT4iTR&o1UU^ut$544ڸq+vtȑ"II#ioo0ACF J՟(39+.֯lVٝ׶?>:Z\~2X˱ LRQ54q3g_"d),SfO!DwOl}o~_ִiӘ 0KyX^S[EⒻw2eJy}/XSSS'L@$)CLW_ IQhP܍1 x6Χla\LCKЀ]hZf} I7ƆMLLqW9,OOOKk ߯"Odx{s>G}k"0 EGeu?y&s^ǣ]Shs_&y1P.}LzΙs]Rj W0;IFFv୬$ѣG ]ONNII0$槇&Bu5}m}ZZ>|e,mw'*g%ǫW(qrkM)j)+/ýh1{-;yK:pഛ7AL4.h(4Bf]XXXfQ/\ښq+er͋5k=RsRc,ZFbnEHPɓ lmɎ$bh B4H29ȘD8q"rҙ; G\___EE[-xzsg2AD͉. EAHzs-&5kׯfd,Wx<-1 8%{Ճ*7ŝԬMY-B?,[q#4I~#dSggBhϚ99<=mr"ªuuw{! / |:R!G=w]"@^ʭPƌhU x)BJ (aJZڬR.vmm-g&åKrI$I:xA@ı,{im濘Upv6;p  .JjS,"J`+=nȆ8uց.tskdd""ȡW O#< )|g6ޖ@tEc7%K0%/ˤnM`,xu w8>ǎ>|8z瘲y}馦: G~L#o>n]4a̘1$o'&@B.]= SG'۳eZYjFCkKoޅ@F1JσF7&y@y ?,~m(w,#/^ApUWcKӽslaSq]EZ xńo~6o1QW CFtƶ6;dǾ!:'T`mY^_*~)&3yHHYaUj Wtto󳳷tY/'رcp8;mGӅAG~>-^ Agn at)&Ip0ǮL'-O~?#c>v,t.]"]h`[9vg!!BȬĊۆhr=:pr:]%B0>azzq _\QׯOs 054LNJYWM Kcv;!Oo_0Ҡ9V2ںFZ[Σl!g݄\o FM`ZZXg6o5RB+JcO%%%---y$Ai˂@ej7~=Gt[\n;pd|y4>pQB2Ư4-mƓOpU?1@P3g0M0aݻ@1y@њiaB>GM ?!WZn&t =)bjC8|D!OLwStnm߾}&MJmmҖ+HY|{_/Rm7N4ՏW mQe0LO:v-k ixxB o&79wܹn?qztˇ4 t@g@Ú+!A`sP.3exZ>$ZX5{`;nݒD|{g mßKHR7vDH@h~} ӓ/Ӈ/zU]ZIrJu ]znFƕJà7zNQq \z[S+cc[555tjLW `Oomm% %d Y\@յ>̐|\, ;_;7)ۃ3-FNd}=pAirl,+ؓ'\ћ$¤E6+[.\-8G;w .e=sꑓüm-M,Xwb>N_Ys9#hbw:rcbdKJ6ˇؖ+,]x;jNUKS+Mmn`!1dZr%;˽PR,4t|j ;‡ Ķ{nt+sj?T0=z1Tmj&M~45 ҽs@s\}}aqWPvyz}Fƒ 9o޼I&v Bv|m2饖чGc#^Q$Y 8ےͤP^^AB _%%+j/k^â)qC~ϟ ..>W3'ήof6Y2u4~%? igG?-$mo{}N3=+F.bl9ƀOOr]x mز̀(]-i!} $͈v;/n_ӹs[HĴ{!Ghat~HWal,//Ǐ'WUCr:J(Y+YhN'aÆh!v:D'Pqq13w8h8"Zjl FF8<Qھ8=[X1q 2eLXU&ߗzxҥƁsE3b&9` ฦb xAg9PD &YujrI5tJRTd@ #Mn,42+keWKvo^#KTTˋ#஧(6V(a%H2"KIt (yj/- 5pR,|ECMM \?R*$*Je̓__s:07W#tێ}`]((Dȴ p&09wzyw&{V\̕BKsv.xD.gg"{CnlO۵k-+~~?gݿO~>K64ZZ_;)-vlaaѫW/濛6mb>ই*pGxEѐn~GL).ngwgCIIIk$@YaQǏC{pm20buˉLjgyf&7Uk.;n,4F o KmCVFȍ_İԼɿip4iNlemQlYlI(jvib({JARFtH7XHg.eB&%]rr4fi''ٳ+Whu;/)1 HeZP) SBt>6(XK=.\A㕕ف# _r@ZyixE4i.\ra#JJ<}ʛ7of-w, ">x@?-޹0P~AS}Ycs,֎M jν9۟m箿e9RZZ,# 4LHO=oxxތꌟH2]VM`Å+Vv`6j"$00Cd;o޼[5$<  prrRW=ruuu%M_[{:^|,W̢9e̊O#?|1B$\Ƣ~A~GKUˈ^HlQ˗c^# ,IsCçii! (dN1uš pb\ ߏ'Q/tR0cap^8@CȨk_|=Ih87+p[,n%.NXKa9y6ʃg Ʀ??XQ !dpW W,237W<32FBtCyyDŽ ~ʫWf*Hї-<՟y/a|R醥]C$LI+,pDዌKoO㳇~r 3h.Z ,a56]^zd{?"˃6mFJZHknM)!a`;EDD3FGG<_))K.ru4(C?A߃HݻwY`۝Dh8[b8:sLpDQ8¶(_Y*1c7~%Uhժi1AA;v ^r#`a4:w?#-m }>@JJc#{+ W^hBi2Mfڍh{B_8֞8+"o/,3듔h5 _QB+J%/@rܝii38VZ|yKI]#55fw+{|g[IHDYYy)1w&|Æ7˂ _EGsWȭ0z.:u_!yɉp[gG*)-Y°..%9{VG% ʒ%+VndaJb%0 8]?ف6 &lذو4d?KYJ}?beo $ӥѲmƔ&W$~_ ̀Yƍ0`ۯ_ fGfyq***nO绯 wSX /uҘrJiQ IKcr*8!ݹ,+#G)ᆉW\aKVVΎƍIg ₝0NV`,9nR:qޏ8PH< ve6Ar럮RwC٩gh톋C#[I#̕vƺҍ:4OϣzzS(|E (a2Wvzzܟ{³gL)/!S٘10pWQQ#4xUTUBw%JJJ66M顭UwHGx YY׿cŊEŹs/-ء)/> ՟p2bś7g%O +Xh= ACOs54rHY嶊c#pS&!տ#'OF||%v1.^nkk"C8AI$U[&E&,,lggGfYQG.ԩSw=LMoM;:;;Y_@UC9(r9Z.MJM /| {ge1P Qy_`Io/߫;wCCE&ЍKSSGĸ :z=YX۞ Q: (Ow5>#p~}">[E~Yr[DD %nl겷eO~=LӢ%C '&b!C@)!!aeeխ;dO Ƕ6֢s|Qt4UJJC:Rx39|J놌hĈFp7ud;v>H.djG?6:97n#s6jy!c⡒/fYFm5WKaA_\5jԨ;vVꩪ}ZEwmog x@VmL2 jj&2Yuu,|E.tux r)Դ) 766BbԴo޷o{1-_oD .$<<]y463-R,{~'nH"Gb5QSQv+v)+$a9҉uV",'EFU=,O"1< dK hf,"7?lذtY^bŪUh'RץN `}AmSٯ{!ʮDECocukqǖ%ח z S[)&Vl藰0|1jɹ3ZMo JxMꑅcPFDÔhGB4!j!nz>t4ut}Sr$Olap | ^K(|E (a}^Z=|>|VOM(2R=?9DP=^ C?nfN>cgYnk[}>Zki{$.sG-u=z 4JIUt !u(|0P8X=cI)AH{ҺҖ¸31!y"+XG @fÿ!8E!_0tϕh&n&~)Rt |5&Ω&LjЛ1G否YĚرc1eAT$̪ޟ;HvN . :_( *--maaQ\l{==zV78@k\92]URPǓ}D] +R?SC| xaX'/GXSZ DD())j G7$K§]j45Ce1%v&ɯzg.R4RUdlݣG~WPv)-H=ٳ~x?}z}? CxҫW@5[ټchL0dHXkčESSsִYPtsPzvYfVj#% kFaa<:477{h%#c`L?/yy$P'Og b:i I#(I)|S@ЁW ;eikk9(Abb|vMvuC5{NE a bIIs)T%7CFe|l6={R/ˇ^D:88 2qQnU F;Eh17Xo>~nMXhir յ$#9.]tڵSSP "_'>zwȾo|?CO+^Q$&i_p1OgD;O\#[G^wo ^5RB+JR^)2Ne0/+xCZh)'C_63-y** ~7]{,Boyga*ip\Ttnncb6o\1eDPٳgҤIYYn(=2 a&<'tp>՞=xnJӪ{Wݜ ukGq_д_-\6,SV!7ۇ Fy͝Rխ;L X‡iZh"T?l3u&QW%>xF^J (a GKJÑf 8f;sϟ#Hӿ}U^gYY/ P {~SDDNCw%6dAmZe,,L059?0)+.!vc'\)|\zчs4rwɬ΄:k]n"EIIr} k.RWGD]LT0kW&LJ99 WD( :Qz'.u+N 7K(F9mm2?YĖUjmm=OHROaaݝ #%țop(r!+*[:uJFFFe giikceޭ6uO30w~*Ɨ~O{(*43G\+u9s~cnj}#V`b:уDX/B+p|ˮGdr<F">W(/džc_4l)n&NjWqvY:o],}́g<n\- ]b9rdD,7on\Dv*2"CB7%.S\l˜8*,|5n[A#zT {AeR*2F)]’#݁;:K"v4RUU-sx{~ .a($uŅkP[Gp%M-闧hD''Qc(%)55^D2bp!O=_怞8эE GfJP;x)$]NO.iT'Nie ?x(3"R)1dTVZW aQiko Q ]i>@I\o]{„ q=ʶ?>-qY|MBǵkjp 뚧$$UR\\|B=hn4W2o@×.]:%MU\\5k vtCQSϋĩS?O%l`'j*ʋCW1^12 0 @J-m->[l$+^-\lAAd汨!IY^b} $:eϋ#~mX{/yi_jx[񠹵kv6~'tB% ECGDM$ϫT]=碻hς`k,giiFNH T /{hM̺5Rc(%)uu$*/wȺpBaXTH=YY]pۚH|ˣČ۟!!$ 8qD6 IKwÇzAwF2=ѣ £wi5]@h0I6? 2dtt`p*bO'fqR8&9ZD[_d ŀ}WϘ)eDe en4/-&,KuׯMv]]ҕ\xС2+P^^\,~zmR;wNQA" G9/caQfHhR]Nx1gƆsɷ'\϶Os p pLh~~8ŋf !55͈6tyCcy,Tx6x\;#C1}B PJ(|E L6EUU=I=ZY$A!^߽=?GR85++d&{ݭ8'g{l ]__(kj ^؏QC:S`50YIha(u&<_{Of[nI<~G@gb ;֮\&*\$*.+vN$#VH֘t?'`Quتϟ3PJ(|E K~}M"vƧ!-Y[U_=&#jjkԩ8gDFF掛Ps蜻;Y]F!QFM53`n4Mq$JJ?/-s]nrES8IjNJޗ{F;8X^oٲEEEk0FU_2̭[Ks<23LLL1d_|||7 [\4!9/9 o2Xsƒn}aaa ~V/:F&8 ݇ @2?zou&VkLk}g}&9ΛG;~@ Qg\J!CO=]CRh,g3ޛ"zC-}{%=zG(Szw* dЅuuuSLQT'UMPĖE55HǴ&[=BBUUT& 3Ry) >u}׼ٳqޠAQVVV!%)itn.vB.\իtGGVȕK} ,|J _2a謻`ͬUa .JW·z5i/w!//(2ERMֶօx_!CP钕n+{UՎ_lc69™G,yB__0'~7r_U"8 &%6(&c9ݐu[H;w<:neǮo\LNGB4e,b'nntV/WPSwAeu㬍cƌ2;8ꢒL}}bci'ɐ$ڜ8C)%,W(+ZJ.~&M->osrN[Bm>KBJ;%]p77f1ꅲ߳>gJD5g=!qH~UB!(|"SLgr?`=}썱:~: .챙"E+55Pq zfAI4[C)%,inDϟ#MU11g'A[YÇ݊`k~M[k[(Y~y2bERҘ\Ehc÷-Why9? 3{ZZ)9Ws&ߞgt點E.rr,U5Tr[=Ƙ}x,\00{^S).6E[/  O8yݼ)$&V1hNdЀqPզVV_j3y Q!444{Q'^gH\x 1d3izwO}.7CSc(%! $` ׏c͑8OٽQOm?ijzcy FI^~ '?H~~ l4;3a,+=6U:dc@}8v˂ÏbUW\ݟ8FLvNuO!ѷ?1Moq7iEI ySJ6q6P)wX8$=E{M gziEl/(J tiUUU}}n렠o=:- )f<ٳgo߾%-mfHhR2289[Nu ۷~*|Q. a=@\MWtl qq66\'mJ\a ?m8+d"Į`"lt8lQ]&8e nJWՓos?䚘Pc(%%mmM$b)mHٱHO wQOBAOK Ԧrrh~pf݋yQrСQFхФ7otyCMVGסuGGoܾ [DE;._b`%N@, ~`O>DuAyo``@NlOoȕ+""<;e~i½آEc̆taÆIKK[ZvO5zh B'_zo#[hD!UaQ#"##!,BYjڃ#z aKr#6K},PvpCt+3sRwds*q ]IG2]60ZĊ\<#m nR1Ã/$*:yJ (a !T0TTHOáV:U򨧡!wPQ$M^9=މzNE39czgN"I9,I $I"q_0x=o0U]=]-aM0r;v,_Xrft~ڵс!UQf+L̲P>eA䁝m oҾ*( \젻wq>饁IƤ}N_s+v2$A j ~bעfK4V"pH]>߇Q^CVʜ=ܜj:4*j&N MsP ҹ.uf7'Z8{k8iѣ V9k=kQkMۣmE7A*@#IО6mڰ6uW+=<ao.Ԗ]L92<@rGΡW//eyZYwp'Zz "D )K1A1ԻvS cff֬Y3rxKqfk,GG&M@Ϡ<|>"ϣ}%^!(+'MO> QQs< _ 2kh&8!oCL5+-)\aKJIcm۔%K|e:?ztun}+||2J4잪֓y7u>R=~+Od(CL:BQQWGE׈tTr?C-=|t8hRj;Cd?} Uv2={S#'ԇKY]Ǐ-OgCC+{o))4 R?\[}xp r0U<0aL?vi_xSL}~4#C&|Aھ}{yS=;wTY:CCC]*Јbi&'$lTڵ%cBB wp\?~LX5AWߞrnyÆ]{X??]yT+NQd(?mJE*$''Ob;˱.*SUO>"4tu¾:ѝ]eP1Qzfsi_Q;|?&~~ͅj.4t]Zz_rH#F=ZءCaB'W+(oY**f.b_D-ZTkHKU^cIR^PBY=F?jx۰ qBB&[ 5ІD`6j~9GZUc6CC4`ԨQе,9rDqⲻ 23]N#ݪxz{lyr//4+RXI0Db|E}=<G{i05si_yQҢ}Po%P儅~DK9%(\\)l&d/?N?2z ǎ?MReݸ1t': -H{X ^Z C.͊ jŽ폵"{{{Ҿ3ƌѷݢqEkAƍGvésXXsY~=RV H(_| eDYF -$7MKKRƊL͆9X>߶m-}Ac#4m(f_|GF Ü1ʛǨ(iӎ}83a_M_6(1]ܼInK#/YZZg?TߊՇ`@z:Y4dХWQVC0÷mܻwo%%%VC~d>+e9/^LnG͉/ϛ*]`}u aˤrݭOE=d=x0m'0++&%i˃4 RFďU _EcEWɨyׯ|j*HƒhkAÃ;vd"f _tһwAx*>#q`ّW߼96waÆQCY3o DKjҋ B><:;;W/?c]~2a_͜Cu}5Hh{"ȠeV,G7t 0|W|K`} Ρ?8>|h߾}.]оB*uxPWaXn-yrOi0-=za4(B)2Պbչs}? ))0޼ysڥcǏ; [V1&,^@@)M߫ov bO랴t{ K!c/Y3&_zC/eّ.!g|Zl*h j5ktfѣYX]ͺWhrsoӓ:]A_jHhUvOUz$~+/@Oω'd݂_,X]?~<)[W^bۻj)ΆJ8|ae-Z̋$rk &Mjٮ]$Jn }\A=SewN|zFuV8`*uW:O/D}Ti<[z5Oձ0(Rnn[_NڣGRQQe˖"۷h{P/m9'(W< W%|8z~dלO;b~gi4|VPZg-Ohwڗ,Y]?>0&*hl$>VHPZ<ޤ˓D)Ç> lz5$Jj Œ;ܠ{nrΌxwwEƉ1['^Hoz6i_Y[;?ҼUh;n8#cxF84NbCNn nt 'XOeCpڶm!!}|ԾhCR!&b)߾k@!+ϣ" inj3""b,O~ + jr+M߫ԛ9 !&_y]Dt80i_e1FB*['ƿ|-Iνs:eRZP/}ʕеUCWTu >?C2}ѣGS߇bBJ@Ł`3iO-Zs!fɥMF@IItibxx -q{}5C_sKlWZW]Y^mzO2X ia Maa}a!{ܹ=z(++߻wB6׷iˉ]!SAw:9쫒)QŒ:&Օqm"@r9+ tNPмpw6[!%Ŕ!=ݖV,+KiAA]0ɠ$^S#4SNh|Buǫ3ihOݲ~zھ}o6kW^◆8sիWS(0p۬@* 1q+u:::I47_dҞK7κҊ;ur!CyN*;zմvy\."&䞷>\bh0#Ρ?2fff06l ESL Sˉ[+SJO#ץRj aFوrw'.G1Z Y ߿ IIϯv $d@DxDrzlے8FtUJka5:0Ηi&ӧe/XK߮DjՊ j!99Zlep08 gggT_̊dҞ^ih8\9뉹_n3%򄰯sOt8 Bn|xY:88GD|qUl 5 9"plmк#E27r)<&!^Ȱ=z 2~7'%dv-ݻULN6~ŋ_|H'=2;pf曲7oQmSIR&욨B βЈz8l _Pշjԣx49A ӂ~}9wghL#߻GQXY[3vXGW.#y0eVqqk]i|U+6*`@,b,p(A{3$Op5M4KszvvW h[C///(9O*CCC{F/_V :ի-[zzz/^~V{a Y喖 4` 5`r kĞm8J̼6sɳUsx$:V:Ф%FqEоBj$*jgk_Nrxo:~Xuw" Kd4"<)Shfq:f+$$lR+p1"̀Ԉ's7.o#N0|!C{ΆxA4>pt---aӉG:]/)beB'QP(OGt rϟ=Vdƾ7n`؞a0r^ROdBW=h-XU-q^J ۦ7m즫 G%uUW%ΡWHDG/ SrRSͽӬ:sRj@Z$tư 36sJX>>4+p5*Lctcxɐ mtG$=kÓʃ#G;'P-}Jȃs(9bb־ׯJ$nVdKaa"v!!fZ5yb}t0H*ֲ,_>MK7-o$; E1|k$--[ [l>]s:ɓ_Wq QۯF2m>h_ɞa᱃a~uÄ,?&M^>d5isw/z_U1PQ߯N -Dv7R}nKM"wtp[͛cc+r}b'X|8󗡉SNȝt~ph@]]P1+S~ҕAkVj+Yy$y@uMbԳ A~v!A<}iLat4ΡWHo 大[KGzOM%̨dq.r,,,@֬oVWl6雖 a4b1Olr6b0aRNWE N&ʤ4ǛjNW%+ɋʎOߟ<&P+F8|q.CY[ ܲ2鵟yC/B9S[VVV h %%Ri'~1Ocn5k;BFt{U7[˾/a1>jJ^)eӫ΅eĹ<#g'5q˖-êUB{6[!#I@|H ?lذ9sPiii^:w\(Ⱦ/ FxJLg>D}J*>y &s;&5-ȀO:t^}5;* +yt0lȿ}*ȭڲ!h{xаf g^ ːzR7qDQ@O;mVe;Oщ+9?BW,UnA6X|{HMuق$!9AM uwI˦.}}%?N_83_XVWѨQM6ɬG|>IM,M>7HK.CVq?wuW}Y|99=40mlQ-[tر@;OOl%dx~`ݞ+ mfPԒׯ_t8 jWRWyRN)d^Efď~3@9ͣfD8cgq= %~ŀ}]\G _F|>JAd@~~>ٳg)}uk n&py\o̊y-[ܽ{br~8eA&^*]tۮJJvTqmz ș#^Eqqq*ϩn oc%T)8؂|ex۰]&5-"peK*^^Nߥ4}RY G̿d<6mDO`drK$MsM\r+#Jc-W7>{փ([Ee/)?zKWBs**$6$(?.9 bP䢸T4||HZ\}u!FW9ì:˾k|>@n}+tx<%%s芤B))iWCC#<޿V2>IR|V,O638bNQJcG672AiBP"7n$?z!ߣ}%oW83 " \g9?͜9EK駟ttt`t#"ƾx1ŋI/^TGrg 3XJ,?3Ou_>af܏O..(MjZAiv"=zPTTlРuybրaaãޮ܊vڽ{lnXMY)((P0{UXFJAPȷş C_&fe]aYmbcWUI6| ϕ);86~[5lYH](MjZAiBGYf5j58+____OOloo߽x@qPПa=;MRkvj"Hk&5-4a;ou։JIGZ~أ&J9Ȩ"#6ڌgV1\G҄E&l'ͱo>Z;v젥 *-;wٳgII 3ZS}6`keOj&5-4a;oZOƮ*33iҤ X~0VUΉzHTCiBP"Jy& ;wmz-ۛ%ŅbaTg-E&*ƻ4!i ۉ|s }O[׬Yð|0j]zz9g]kK~~+PԴ҄D9bccaheff"n XTDw [ZZگ_2U(׳kfVX}T<.JAP7G^^ SZ,auoo-w,#lhݬ4!i ۉ||rrns%TZ[ϻ%d |}~>JAPRKܘ߮?|hsh;JAP{nhQ2b994!i ۉ $>7,+33?JAPRK|avځ}JAPR{ݜUPԴ҄D:LhQԴ҄R ^҄E&l' |>͑6(MjZAiv"H]1n4!i ۉ uccdV$JAPRWqʤ (M(҄ EEE6lzu.]ZwkU~UuMRRR"mƌikkxbk'~;zEG)@G *<zYQõy<jZx+D,]TMML7 5-jJ=J="0 !%MkmmDTSW 5rHCCCؘz5::aÆC y7v#zA av=""N;}#F>}=)X C0`mO;vH+˭-GGG A4ieٔquʡI&JJJ[nv F7h17o>zheq ִiSeQMe,((<4-d֕4upA"نڥKKav oɬq'OܬY3wYTR/oR0!%MبQcX@%5ʕ+IԃRRՃUڴiv\i:;;T+jt3g@Ezeˡ]GGG:̝<9۶msuu rvvݻ7 RC ,ީvRU'No 4Uaaav)S@CCCe_Uˠ+V 7*++۷Of?ze˧EGGG~pƇڷo/Gf_ Ęm7mŞ>}Z3x2ׯCBB<<<y󦎎L4%MII3f͆ V[u 0a)WjjW^sN<~~~oߞ={64CFz]^^>J=J="TDCI߳gOP-Z2ek׎<롨(J^ =zfF\yyy'OՃiӦ:tĈD@([MRàA`9ٙAJ]^^>J=J=                 r֭ ?!T{MIIfXpav# > wf-,,;t@o@Q"Ef|ooojp Y455$[ ( ?ussss󲲲m۶׬Y#@*-0`J֭LrKu###Aw$d^kj*j۶E_ޣGUUU! > 7fmll ~ر|}}O:٧Or;;;稨(eRJ܆A]>zeVQQ',[h [AD,V[lׯ?{l2p@з޿HV_fONСCnj#ȳ %K@:ϧf#?{zz?ACMX444^>|ȑ#C|AyV45(Z]}TWW3g5ϟ/X2߿?/c,#}Y0uwիW!A"daa!f'OԬhkE||A5 7NUU{KǏgϞ Yq52c `S vLmjvĈ! > ܪYEEEjV;Maa!y)00pĉڵaÆ@يHU,H;uVgѢEelI\Ƃe,#                                                        hT endstream endobj 3715 0 obj << /Type /XObject /Subtype /Image /Width 800 /Height 600 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 955 /Filter /FlateDecode >> stream x! &ku endstream endobj 3718 0 obj << /Length 2093 /Filter /FlateDecode >> stream xڵXo6߿/(F{h>m06mW eVr@29o VU2~_~(V_"]U&VYAoӵZz7HӠǦˣ}oq"5H +|;"W7"qpP|xzO=菸q(iKd]ДcLgZތvK+U]x,M#I^j;*n!蛤Dq)w_X^W000#1I :XhܝQ6f&i:fu]C?6ĺk Zzȅ _h&T;`Rʢ(v\}"f]}Tx_v4_ 4naOgzcX'q[D*Y(٠G4酦O yvkIvWط -NPbz@/=~^X@s?4;<)Ă3'JAS"ژWi~U0Uo_=vynR Ls# Q i`z{g"ړ`JD3*U#E͡HcaB+F0#?wP@^G@Z#mxrC?ʡ6j߱L@sck3IcׇeտQp$%h |xbghi}2Dw6$9ibSӳMdRpĠ$!tbr}7b1K"'V1H葉6yl#243039;cܿgSYlcwվЊ`fvmʂAi =2ݢ^NT,DmI+.Fcs5L4o= f̫Wp6pQss% -(G(7KF*_%TPUt-li`p)q ItNVxO#}ނ~`(O#sps6 _{^\P2-=D[LцŬՃS ӘA|>%f%%myG;.`9L}~ם! řǯi(iwЕCgJZ2'K xxۥ dJe~PZCUPm[]$ĩ}70]ˣ[+p^]xc3|@Y|BKȶDz=J4 7NYh2TF 0?D4"9ݼr?[Y,ȽHEoBz|[0!MYd`pxցΠSƙ/Pol&Mj|'M.'#dpO:!AG^t--mH/IW2{&PΆ/{O14R+pxԺy!N?#^ͣi%1?go~dqfGߖ ~[ңWk!}8=39[[葮!"C|?1 endstream endobj 3724 0 obj << /Length 2303 /Filter /FlateDecode >> stream xڽXm6B@%)J$@=A{Y]ZY^%W/q %Y49X|gϼ{O/w7oc/aI$#nŊ =-8޽/o~r߭W@D!-f"몼mqSi4H>}\\޵â=QdiEuڙ!aH&_XP&~UfgǴmQ05 zdP͔! {[k? B'ۂ(zdgst0<bo#VБY.!.H@_NPᾷoe2&G>P/C}{;<7U\day8om{0j!mÐv٦&RK ߑ(\FBO ]rt/l LS_pQabFPToE FMrJML,_Z$X SI3ӾP=M RS_kŔp!QB߀C?;#M%giz$ iw=0Xp7~$_> wF?UIh$c~BD)Ve YfJ))Fδ%F2 8zk6kcW`2s˜'oSݻ1otoMhY !:kpg-x8юr]fʁQq(^yA $`XX7M2f: \%K5{_R.1ׄy߽*ZZ’ϺSCW(&2_{,K1|jxG`h9O[K`H^DIu G]7UjՐVk:T(XОtyD .v+-jDF|`n8 p$ o,R2`oѐDukF4ɪ.{j!P6Vp8ံhg.&U)M] 1Q+hٹ_aSM+sz>C26 8mM@G ͶC]Y_ M[r>`auG A_߯RɈ%\hKRXq{{:*(MfǞOL&x%n bWcz̛[>1EXaU-%Gq4)fǾ9RԐ' -\%5N/uomg1tIevzk >О SIa;޺Sc+K +1!*itQdHan[r85Z`jldۗ]q,5􅘂fm ,cGeI>cH<}IaJqf14HgJ[ZJ8"8bC.%Y%~@ވ2@ #KM,b  ĖE밎 4 -…i%MYAdzD%Y,nX20sm 8<6T`)"[ bٵ|CMr)d ZǟM/v׻o A]'yĢ@z{[;40,7пfe,> stream xYobɻJ"u@|A|M^EP\*68w(Z90p8g~C_}xopUeq42WI{JVէO~l~0 9S0@!'0+/MML3W\DJEjFs'ys|;&>Y5ܔy卨37SOjƽMPhYmM%랻L)Пjv@Ժo!wu|:[d9"|߉jh/"֨CU]n5L?@7},^S f>ؚ mCFƯ_dx. zIq?Iq , W&|u)P{Ygu#ssn./*yd#Q5 ʏwy~ڍ,Íjy(xF5+F~Bd`N858DkgA:0*Gߨ+&l;n&>ݱ3[9kd3#m:H)P5cL-Zxe ]i-6l xv4TuuvpԦXj'.BžquO;=gbm>ӽ>_K_6 a|*Ww ՄǓȡc/ 7p%fjvG1 O1 ˗ 3`l* :uA1=!mPB|_g W _˚ԟEMA54ξk@scQܜM4rdyt;Dm"#q4Yi96Ght-bgBp7]ּey"L#AC/^6cBV,$i%C@k0=GvG~zJ-(GL1_5wf-,'`!t)*7=Ilg$A/A"Z[,vN1<jj+I҄ i4vlFxke y.$2Ӎ^6-¨M+Q̴9Rߍ+hQa9eoƓY(4qw=}T7ʧW?^M{Kq )Xn"?N= o iN-;J::UХa$d*!IUD!ܤᘲ j X wM !8sa8nـPG=)$%($X#D5Y/IDM3Wk{f$b(@@#I853xCSyTzپO<[3sf&%&q:mvnCXzH9ؘm< k7 D:$V]Dz hn3Qe{4f hwnI͐7(*4R +P Uu%k f@ xF!Ӻr49_ '`m?P2d:׈Y(Ѣڒ@}q8\-@ 7y`4/q 㛗EozX y ¿q, ծn7^`Wfl2K?z. !ivnU){0W rj1z 0HEf{JrwcҀ!?6wgv?&*ɠƝE*!" KW1`pH#1`9q`^ֿCf  6.q1pj¦e ڊq"m9eo NQ89o}P7B%.W䰵[Xu $ܯRʫA{9@3ZbM!m;L})8()e`GV3/}+CI_`80wKi+[u#oۯ} rsPF,$R@}~:o/޾I`8&8tե}x}eN=}U􌏥A8x_Y$T:Br̲d44r%#yBv$0L|\&(#z{1]H w\6J/zt`1GKLNa$xugS:BBȴz S9Y-؍ tv4sD1@c/ $ǧElo׳XM+CnȯaewILX@. ( C"㥷X  JK9AE>PPTϼ}]Xp9Uy@sJS33'M_)6qľ`֭W0b:LSްS70 endstream endobj 3742 0 obj << /Length 2396 /Filter /FlateDecode >> stream xڝio{~/SH'Ļi(E0c;5dYhk]OԩvV-w\J! Le&k޸8ˍۺ¥f%LP.㘅j6CAdjs}o[XE !S<2_=?Եd괐"I¼tWsZPzhIesã A Q9xlDŽFʧat~*FeyU4U 0E[oxF/LWkE!<-U~ט"|W!WBv`F;5ȭQ*4D> P qZ<ĜL!MEuJSg H~x/pz^K ͐$98ZA>οufq5ǣ`rN" ekd٠0E`Ե=!YՕP:u4 >";eR7g5V_|zdΉ\+4YŞDƷ9L,MI9R^@> 0`ae5oy4 Ův;Bn{i{9,Q!CuGݨ+>珧/G ?$L\ o h9GW(謕}[B'#\I^ ld"&a\ {+JQnAC 8Id?t Me'>F nQz$fũwl׷/ʨd Mf2Bk=bXou%ko}(^^ ܅ F6sad7lkݬ=/˜߷=71  $qSv@WTmZd*] 6Xɤ:bKWhsقQla9O#*`P7VˠoL,# \2P|u^R*L)UfV ;W Ta"zW8tje)sHH2!mDbNsr{F+`Ū5]7vo6W< IP>C,#$P{(H-K?hy>9a\v @? C ;Fξ;pHT^q6pltqdN{=4a~uQ0~zC졋=T}T_z=zy#rVb P#&' tAeKc1`:bq*:q%-G-c ~;0HCN;7}i -}!zQq_VJR~+ɔ\)S?OO01&^t=YvOm{?慇]ٽ3;o%9; LOcC]ۂ0gu1`:}-ٴ=zspCFqV1!c/21Uz5XwHc6lq-p?=Pt9|c+T'`d8w-ϵ]Ma.=(2CXʪ[odM.<ʊ~~CTvp46)Rqd 6 s}ٶ*\{Ӆ~ Dɣ ,Q './K0?@Ol~ƕ%o9ϛov 7Rh׫'%_i endstream endobj 3633 0 obj << /Type /ObjStm /N 100 /First 991 /Length 2507 /Filter /FlateDecode >> stream xZn}W//c CrM àͬLrI!ߞSMR&MJMu9g|l(x `ϤG 䤄oESNpDG ,J)CIbyO9AOŐF4|ý ;)",Aþ ] a,dXHGS|Ity #GLr'(`bP |>:.zNTRMЦ Hbe}#<)Mug * t8`v1*)pOTVR5^.Z*TYW΁ʪL |++ A`~H\4ɳރRiIS̆7DD(&u$D ( T9 Kf'uDgV[&?: ̠dU6(P@eW`PUޛ B>cOpĔVA)GZmJP !suqj ; AfwrzzҼuҚh447zxqpme Ջ欽7T kZ1g`G=697͋if73<,e GOxq{[Dd}0x*4?@QnL;Q&h^Ihsc..\N0Jj:k^' t{PWG?'DQcEg]n-qmF]ꂺu6` 08x--f莸u"GWvփ";"rYqI흴"=;pNN[mQ3DW+{#%ҟ&r; 1u%`2on'؈Wf=ys<x~= \vΛG2uj$H$,p.-e3MˑI-#=篛Y3u~|\zn<8|oy>lZG1BNdjvg3W7Ӷf2[N\`!~Fqr 9Fm/]G/Ât|3AyhkkJ>*X+gVD-U$!x-m%^>iAn': v 36=L-a%Yu`u+P?UOZhŰ'؃}+n粄s}x bKVx#E.{$l#X}Kδ}hZh=wԀ)$Xn6=ao}CpXbjΝ öqtm /dۼöPۮ29e$*U{7!V|*3=2w8o1%#yPm1@6^Uv6bhL4ggO~%˄ ˋVB>ZϺZ`)Z K>Ec 6H^ # " /_ qKm.F-4Mߞ Z^٣:|P12RĤ&Y[i[]NmBGw5N>{QimI^v&+ k3;Z2Z.^Ƚ0"qzH$m&u>oVm8$ה"b0" GFBq?#AFejlKO1JO(mwwe=͜+dt^)XIWⰭԳx\ѤEȢ8n ʯ ;^]NY3Li3?eXp=eB = 9bgX߿D;9dPWY>OVI'A[>-wlY~RR3(B< rxD> stream xڭXrF }WOf"Kf7qiZN'xVJbLrX`iR3iO{Xl3f/Nڳ nj=KY{"bgʆ:me=H^ݵP,1R~{J(uY(<GnEE:tY|枣eG=Qr,wX|;;YσѴm'*??/"/tnAHZ(DMG7 Mr[)VܭS()4ozEf3_fKK4cL; *BaػHGa\}եu4(DT:qb{!,s{V6vb_,$BaL`kjAѦH)˺(%t(#EHUK:;/Yl׷mUʕ Ґ͟=CE୲4:e=q\d)yq0:0fVrx*j`>4@#+_#ܺřRtG(B7-ȴ+ 9s)(01 G(GY(1(gr-JwSqU(4pMtXbK)lt}ITmuG?lP0o\|1T8+2Lɠc϶{MSøQ;QYCv8$vdžo%u`cK{sIRä gIX  0=SM_WԇNL<7XOFև$mŲK#ƃBS9¥3:|\w`5 &"u>:*g+Ƕ&#a玪2`&Ə$9?sۋC/<7LRqB +`o316R[Pl ),hՊj-/ϡBLp}`qFI`nb 0g.:!jTT8TU04ZAPyj+?@ao;HYQl8f rSGaJq"J֡=3R~ljޞ*rPRu ZUX/&W&a}1&9XhgպP$訤;Cs SY;ZBy)QL'1ahjEݪ1l` ʼn> ́kZ.cC'(:NAZ}5SVPVNУslI(Qh)°Nj W&&@E|p#Qܓ8 <7\Hh5& 3Aɕ=R^r k3a{74xP0qfAͥxa!#nwᯒol썿 1~ 2oB":8ދSgTyzI>}Ո11^>@ "~D_PJ)9`iE{ڠ{8&P\Vl4ڜޖ7鑔*ˬ$‡o]~FpJV(=*{ H8@Zi>Bx۞_  endstream endobj 3757 0 obj << /Length 1903 /Filter /FlateDecode >> stream xڥXߏ6 ~_=reGv؊ˆug+vroߏ)I|a{LKE~H9vA}ݫ~J 5p 4 p=aDXWbQ$HH_ǁ+(m >Js-aӏlV$>(;1ܛͯ{ܳkQmG?O~K \W'F%l(|(-RJyjzנ`eQI>}~/ۄʌ:0Jo W-9kw8d格 9gGǯaPm;FUEC/uЄO^8keaoq> stream xڥYY8~ϯ"1#RԵo`bn lL0`l-Db)V'ͳHա&dzͳo)Ef)2Qj}XI~|egM1قTZ$:u+UJѰ6nm'ӹYۮ: X"6Ĺ"0~YQol wh;gxwámhͩko;s_sk)EtCE:SWmJSN՞0s򓃽EZ'ћUq{Dj!6hwxoT9aJSz??| Nt*,Ed0lǤ諸~:G3Ћv:HEZE[`⵵Z_:J~ݹَ(3/g_Mȋ@?ӳwUgC=%;ICwےM \ޟoV(<^9p0l(-d Hhhmv-Swhr}u'A6hdj ;BvւM{k2 p+-I:GW͵HQh׭ꥎ>$E"84T)KZ9HU+J$Bl.Oj,FYvHIs֚6nk` EFxҲj 0$v<hZF,Gt@{B/b,R "eo덮BnT! ̜LX:g&}*F:o2Ł9lEM$䑷d Ң>w{/\Dh ̗Ʒ(IoRK՞%ȳ9.6U. ؖ-v KNq7N2oKǻFpsx%t.R:o=I!m8{) 2q=ܟ)r}#1Z8AFH}S.GJ  aեs  hULko Blv= {4um QŔ@805ĹQq pj2aS"02[Oh؄BQCݟZ8|op.dl"'5OcCŸ"+rD LqA!AgӸI3kw`N-1"tVB3Yŏ${D 30 " Dgw' %C *rI2O@^D7;E{67xSEgsŘzl]`OQU8z7nmZVRNۗ4q9H}ZM^3iO -nmc;C1X.LjLݷ ;=B9;c{ >4''a!6p݊vSޒcrN؜7mȤF1>͜qt$|T!LJN 裳]>a6'jWp‘pb8Lg?> Ʌ#4xhC'"$ii/ZDdj)J,-~3M)rL)u a^Jw%̘s+8rY>7ƥȋEjmn,Eܛ_g[#`$ J9MJҴ"383QƔr'D V%mؗԳi(2Prr*mPA7[i|B*HN9paG Ϗ̃D#d>V~-UIi3]fR;4\ox \*H(@sprQU O8f8wHiѤ;O2\Bئ [KJV <B=gbUo35G=IB([ ⩳oݫ|Uiq@?8Q=s$P3<$gb3{Wvt73T7QiPG1ruN V(Iulw~yRAސ22R?Y)aT<%Xgrۈ&2(F0"icƉR<@2=c}WYf沤ԳB,+#אp?`<&Y qS2~F6SYqϴtKu: \-FuuۼoO?S)v^zVcw;jT$*@H5W endstream endobj 3769 0 obj << /Length 2400 /Filter /FlateDecode >> stream xڭَF_!?LlI?ko9d Yđz"oUWu=#zau_ 7My,gWoMino7*(a6o^E{6' /`%[~,lX%^As t.ڒz&[p& bk81([6*qljO㛭 / m#էsU4m@K]efÇ׻7~ǧ̄u%z ͈nMr !qXzѤn3:b;yG1쇪42ȥe#hǂ`8 =O2ŇzRı$LK҃+$\:mǩ !Аf7ttQ1 [rYƏ RG/N'aKz$sv rph#2a[!'7 N`NY[6TڊlF-w}>54Kpe3fqL*#Ei-{Hioz.*M^#'JC I8mKY1b_lgF.mAw/iC]X{dFhIdx ڑl]$\LUуdG*w;;n^YUܳp'i %g aTڹ N{݃v2.ΕVoQCx;-#FF:kgGqf'2]NEE[Bp5s̋3+gΖ10s46b48Cm-ewdTV}췷DY4_xG̰}3N87Fw{YԹ+xqdfĭ706 TCaӨkN5#J<];++v gk)$0 UMQk=dmpK5}0tMIapý,kzb6ɒO NԏypI8:}07?Mٍx.[T`&B% ~KV;)XA~5'\Q.Ӏ$,k,$U "Hʁ(!ĥ[? hGavg06Bg8Ԙ]F %-NIJ_j]55q ۘbGﯖK>t]Ijb-SSekɯC-Vz,ݦYr2 "2g$PRAl SJPQ-myXI/ORwd'@*d`+b[ 0 !3PƉ!>N$UDA(w!ئRށ p|ܱ&M*jM݉OXttWg2: Td‰ӛiLjʅ!|MX]jjj[Af8QS\p @$xwFP-&S/kBy(?q]5aDY:JbbnkL 9Y%VXlu Mo-MD*HBv͙GKs3fɅ\$UWl B fcW:ɛ'ӻy}]d&y1i'L6 Jğ9D 7|T0"9}d 7?Nҙ,6u2Wdbi5UΙ)akRr |H R\(~h(K:(E}(inP=1N}L70h1]ژ`a5+']x55vnyG<1BP,51@KtդgO@LujJ \tO` ,1@?u|+8K V/l'MOW zW`ʹqi$ MP!,P>冖H˜QlΜ톛X{kc@P잓iM5*D(?/_O4v\30iz5UcbpG^ *Ή{ ј.2bpGUZqyx+!*y,l#dn|)T*LW+ɰoO4\cMU/[ " 9jrܝUe endstream endobj 3781 0 obj << /Length 1852 /Filter /FlateDecode >> stream xڭXY6~ϯ0Q !is-ZUJ3,y5ߌ+ork?[enj_%*j[~w֛ȏZZUm{Z=׻^5F7w^ٵyeo hËo|"y6{͋BxKdDA\ 㳍X?·W^_-{-eힿN'"B7 Cp|\#?ARYN]ZXNS>A3Z8CO{,HEiHS3꡾ewn{b4Ung(\u"9JR玶Pt&7J?PT$KJ hK6p4DKt)33>,Ev]e  'q;; 6M@L8eR.fͮ\+&x-z2,,U-_9fijC1iuq(,0İ%PDž dDNwכ^C4+w-ǎQ>'[#,hbZ6wM%iRHݍWB(˖r̀ ݏ3wG'F}"D՜VyИR`NMfBD@sP*"s}E:  Ua3H"'aU,hxA"QR7H <0w򲤉WW1h(ACҚ!T6 qs OMt"Y@tYi DJI eMbn*bR7mXQ9oTޤ/1SÑ8J05a~vTכ7WiGMC7q͹ \(@x0r$t{W8wAQ`&A u*綪^>zash:unPȑH4Z l|BV>WpKk=BVqh0 K蛳,sg }BuS Ζ  ,%e -OhRO N $,F~k?%‰PHl+Hi8vJ0 Eф5-U+$3q=!w^g+ €3$s*dȝa@Z8-[ Q΍~Y[>?=D zL A2ͷPɖ^A ƩV%EȔȴ"=0)v@޵,8V[>'0PbJ+JUc(}dFBσљ`@Yz0Er6uP8ʢ~wRc$p[Jko'ta%3ZN޳Vzb8UnJBD#*Ͱg `Ā)\U O+1jMGm|)ϸI =CEc=]n, `>9'5bd y[qQγR&(ο{Lnveu3-x1uGhZ1;N+ |ad{ѬPK2B׿́\K_P/15ʲWUb"=k~eL=hrc0̋jG#͓ՐnFgW^mg endstream endobj 3786 0 obj << /Length 1886 /Filter /FlateDecode >> stream xXK6WA@̐z+EIiC֢c6n;!jM^5Ey|P|~?ڴ/ 9^D<ˢpc% RΤ.ru : nBÑa°e31U>b]]J՞'%=mPl>0ؔ8 ܓ!+fa, s~AuȒZ>X$(I,.r^$$6,\^6wp8扈8gZݠF8Fu楡PFHz78@d,]!i~_x֙2nk}#pqJNmѰ06sfR e-st `GyUO\9A ;8)4@#RlZQKV6tۋAĀH lsy/yoYJد# URHFE 栈h9*i|e<U6\@8I ÓȕRYbQXeO Ħ9b̠. |ʀ Z(?S%<O>S6[:ba׻}JsZ Y8z $ /圅<?b?\ZoAD'9^k]DgM z؏*$63$9eY{hY<"ZUmǷ顳ap 4Xl@< zDG748(H <( SkOE)A#Dv"S8e.?w 9IEla˱ms%e-=RD`#FQ-.8 =ijqw;6 FR\PswAܕt$|$J(he>VttTmo`=pѴ~C@: /Xa.;xK٥EY*] ڎ!M3".a@HMf_-u^p/8_ 5qpצoNݷ r4P7.'h]}w.2:S c(qtSՙбch[|<qeI3iH*껎 g .t67P'WF7Ik*dz£j[~R}IK*M;-as[~MF[䃽O]0u `s,9'[^n 8 endstream endobj 3792 0 obj << /Length 1194 /Filter /FlateDecode >> stream xڵV]o6}ϯ% }hצG; "ѱYD*xu)[Jn:"y/n-j}}xu#+"}k HC+`P'֙fg+!UdYdQJQlt~XDY+HyX,ޔG.cj!Bؼ+yH68<$RZI &;Dz!c~p" 2'Y&!<2ܐicG5wC. OOy'53NWӧjPdVwOk68Cazo]%ge,0^$>Kd6WYy9 }冑8.c \.8^R7e)B@ Js2 Wl>i*k>Wq[mv \{NՒ-#`}wxVmʉ >)o8wyBSMg29 ӫ5i`oLAN Ȝ:73S&G )t4~hu+6h`ҷBHKR!h=N!ܠ\Rs8#mktp.1_0 >˜L&򗢟]K $rGN 1 Vp|e :=‡p4m"TEQ޽#7-%6)3m݇D|k9gR$7_eG#V\]_2[cJ~ ȎU]>af1\ɪtfC3CU)@^IB|f׆_1eyUHUMpf݈nl= Hce̦ŗZay55R; D>rjv7;xѣw@(;f_D u/&n8g=+զD?Lva8cNCXOm Miqԑg ' %Bwڬ5)0بjʁV/2xX9"`T,`XF!/'c'. g9 |wHC}MFo:LTΛu w S;-z͋K endstream endobj 3796 0 obj << /Length 1765 /Filter /FlateDecode >> stream xڍXYo6~&*З$NMx>$A KWK^~9s|3^y'|_oO^ ╯Pj{JU{&m7DοL9z );N1hm|.]enT6女>]&s$N9ڞ")q:dzޖeCյBcBtf`˱^Dx‹C}|-u ;YwQalwoVVʠpB:{=M kE_nMވT=ʊyU[c &(ƾsW ;Հ_Ӗ;xgy}}iԷHuF:mqI/.#opj┣Ⱦ#V `Hg } k:@E`|<)B5g0K@fJ-eA΀[T9]#ə`>0"+y]`*.P)MQ`̤3MكpHuI53yS+qj Sؐߐ[H*rg0VW&7NJ#b=!@T]y(0<&p*FۇY + AQ{:S"v>:H3Q""ix$PI+;xi#;VäJОFG{?O//U+^z`*,Jl:;`t (Ё u*t,|6Hte2`[;86:7%eU@Ro*z]rrJMzfʼnuc-ip!a#)HF ͯ AؙV*}9֜bsR {"~  D^CbRqPW7bB帩+5 fF}50,!mƆu^XH.􊈻 _.0$-SLK8RaMl[2l )J'2:3 ώf|~|8?ie 7Q fʷ\%Bz>[>dE2=l4=:]t=4@ D_KgJa,9pYQ@n> stream xڭr_1p4koZ'vm*"d\#a!' ZO7y} @a{_UJ"Uۭ u&,WwՏ706~Et#x%]mL%Ji:Wf;K#g\քoFJ%Z&5{FD%($ 7[2yKJcÀvkU$/ct'׎-f%`Ix5mwK0Cn'Dv]vAg(2B Ӟt߯7Y|nq[s~+FdO.\wF|ekG kƶ/D:LuCz۬JۺOԑL~~ ,I뛺/AYь&z &B!J,@$߮KB-ݎϮA`/G33۹afVUJ2txUy;2QI ǷƇ^XR#Suh" ^o/pD 0[ ,VBvrDsPiڼ(6qH#QKr~|/tK(ѱS -ti (۶G ޘ|ӝM_fS>e`iRdiҠ+rf"/n$$.!k/|;Q"^9E`"CioG90J/t5_}΃BAf1%A&W#PZ&$=l sGwHM tm'=a(27ϡ\6ێHyHdɾǠaq?DsNuF%:1B ypuΧ'cN b<L[7.u- VEHZK冯mEQvF7NܘÀycGP3`8*Z8yPEJ7v\Le Lv,РDXZ}ɧ#afu0]ӞSup$ 8bT9N$ Mk?T%.OXEKuJYG`r7A*#XDԣݡiCb?'~MDTk1_? ] #lnxB#g[nEjNJâ9k;jojN.L#P\/f4a3F=aT.!q,rr.Lꌝp@3(cDT@T%`pD6wX`E`u% O|5 =`̏CGT‘PxɶGHZʢctr? JdŅuA6n81.15t!!,Ώ(:kEh}(PvLiZѨo,D!eTN" QUs)Oyv`mu1HHVvCGQ6e.TV,Luwe)͹,?Cpj!JAg 5iΝ/,gیH%VD}l{BcJ' r<piMU#9ֹEgi]vADaA,q endstream endobj 3810 0 obj << /Length 2489 /Filter /FlateDecode >> stream xڽko8{""`f{hO{h[WY4{~3^v "p[l+o}s"uHFBx_s=?^e_{X#1n,y"S**;[-W jKW y"/T+i3"JDnGD@OPĖX wOJMerVr\4y5}G([ '_/WisV\Юmoq^6*zbBw a^YߕI`?f8nΛrI%@qqL<sLݭ[+E0r՞F MR.?D%YII: 1izw>Flﳿ-wvP6I '/qZ:G.s`}RF7+P[Qd̊(N3^-itC㪴#53 4:Тx{ۜ]$0.DNA.\n,Or ۓi+$4z S@6C3;(aJX =5rTZ[/״uLr1?pG`4a8}Ȝ2_m]\=4Zvar>̎o:6H@%hR3 NkMj5 r wmW m$u[KĆ ^<.cLǔMMFn"w;N5Cr"8C7MzUTùS׏# Ќ!p'ܖ\2݋dΉy|  Sa, PEA +*6m;d>L8=\8LeHjl6P_L8cu^C-'8&ګCն~5gO ŔȰ]%M o~(ؕqyLPo$2=fx6!0`_$ZuFdߝ.h0,i\aBj)ՆC?Z8jcd+T?aR4N-f(`tk];W1Dx=GЍ'Mx&ND3Ȯ)JMohQHcpP0GJ;0~R)^2g"s#bvHʡy &[L9z5 h3f>b,|Ұ՚9_UM-Fn@b J(e:ӓ@!8}o>Z7sirz],қZ˰9#WTpg~]|lԖ!n'(1hSDXj[n')Gs >xQs$a0exO1[mz [ê#/iFK]b y z{@YAFVPNP5-+B4aKļ^h[SG8bDJna=5Y/痋S5&uJR:*}+ڜR oKSXL*!g|uR` _˲h_[a|ܴ?$<^7GM/=2L1N ŸʾF}+:9 I-o- 9=S=qho`z,O# ϥU"9+Km*{>z V .+m+D ,G}<7O2nȁd6coF0VtҊuݴܦݑ9`vI.eLHpf?_M)[ELSy!ra"c ;1ĈH D K0Cy!c7 RSb~K>KW <#!AQinP-fJ"1aDix-iW +K]Z=!HfH'sp.C >?',W[,Qz׼/.=2u^ut}/U]߽tG endstream endobj 3826 0 obj << /Length 2101 /Filter /FlateDecode >> stream xڝXms8_oQlU;Τ;lӛMv2DۜʒW~(KMI_@x-/7b Yo~0[za/^y[hi{ssNW0 ЍBVOvji.V~f,w^?E H*"^Ç:@U Oh\й}y]r]7!:]>*e]uS]i4жy$A]=Q[M9%lYpj(V.ί(iٴ`֑_D)ֲUWい e:z}ݕ l`̑,/Q q/p.H#%IB68It txsE?_,|rj?$:kGil<8Zw=GS J6BKBޭjc}Qac)EKv,n@>F+s{.gqy0OzK%#c׶.K'UK/ZlFs[++5.|^oG*xw*}kO5cg#ɚL@Ξ4*V;r NKPLRZTUD "m#d?BhlS7}nE΄V~IMڍ B "ǐOieꚓrC->|,z5z>XookZB!^ع]i/݇M|@@^qb!dža8mSiIK+ʸ[ ^o#"+~A9JhH_ ~-JghH]?Nѐ "/Gb\ys,n~ƀ'k7Boܻؔ1N21'D?Eb?3w9 ƒ!8%\Q@X1'\rvr%oTڇE[Ph\xnSpXXŊMASFrEGFc1 c]~l S6L`0_:W܋rS[е%:wFƬ)fi'qcݵ/"UspD߾}K;vs=&?+q:;%흒 ahWvTVs jڒ)g"LA~)pm)^mn3_>}ќ.QӡǼsyԖ6ٿlZ:5CUK)WWxv F|{:N~ClԅmُpPoث@uOK[ Wֳ OU<j KA~Tޡۿm,@&1L ]È\ 8h{h7I±ٛ^Wk}7̆ֆN l=5WWje׌ M5Uea.#)^* N=,cu`𧓭7J`׶2t,2l9 ~fq0DVS:d*(,SpWIx&VF)3Q4Yv -#0 Zxg^j1E0Ȩ΢ Ȣ:6vJ+́:іKmaa+>$iގ|G&. 3T/% v֡aRS%C#3_݂C%_> stream xڥXKs8 Wz&fER#7'mvf/{N펇X3rN|ؒiz%0q Fww,iģ٪Q,f D<[Os ՟'w<[4f VʲuhS)Bz;_aHBd6sesM;طRպՁ/E,i&4 l~LByt:~ޯVYwjSKbA9=)h1љ9 =J}@AL~t`@܀(IRL3{L;a ʣcr*Ȼ>m 7R:89lc o_Iun$a_6A,YNYqح(2Ұgsv"my }V d&6weC2rY:Ugz(,x+9pN]2r>:Ϭ+Z/N$NďG4>bq9Tfem3|iXsRax'CI=A9;.ߌV|mƅ7-iQҺF +)ۗ t`V6&_Fox&`A&E8PsHp)1\F}Y1A J}LcRWa!A`I3q M}YV-}ip  5ҳpTU*5ՐT;=O7lOte8. D a-&ó1!f#!)7KvK(Z=_g+#zb,r RjNPvST # t=̱&~buU@ g?77A5Ue|M>8Ĺ QBmUN~Pr5,眂 QtWvi t(&cI4COj4zVY\;`MAGϧuc2F!asfMU?M}S 8 cxj ] ^pъ΋itŗ=֩irmV2h}u} ')QLX›LejK->\yQt{ѷc촪cpwkrER&VSӪ!Clu wnFP#katV{/V7)4c<v y> stream xY]o[7 }c0]}P5 t@t Ij4F3;s;;vjNeG$Eԭ!g|Ő713 qT!LE%FS >.R_NX@]8+Ƨu%$Ƌ7<;$Ro0HVϠWmu7\P,&Hٙ|Qkx=U ;l#GHY=d$Z؄ZΐHJ6X*vZ&tFtޫ wI:.q(T QjJ &Y}.X!5$pq6lrUsm莰U ]u)h΀Mg3ܠ4~ (8H}$Խ-@UrSZ,`R+'!HɤUgHI&^ %Ռ$'*KRlWa'RB$iAs`GYTDBPM皀`8*EHuE$H`FdHJ+kLǤ-jf֋GB堻2FKs&z~OL`V m|{uu:xA`gbW_Gg'̉3`r 0t6j ̏1cB"yTrݫ~:U.m- zeRźTvGA5^Fqwr6hrL?tOn~X,) lV&z8}խ{\說?x߂& ApÁgܱ~꓋˳pjSstb`N&Uj,utϳɸnq=M}Jh4K  ֣"C瞘 ݝy)NL49 EC"W2)\]qnҫlf^z4AXme?;[t:*$kip3[9.2a^ARfTf h@__5}!~-[tDG f#m C_j.8 iɅ,3ǔuT9}#-6 Iä2c(d15Cj،ziڹ^d w]lq7t|l:[to0jީenqQX/Eݳ(q,,=.gKf],n=휜VSŶr"nA4ܬqyY'me {pÁr?4=2,b@AY.lw؀g`0l2fJ h͐f_ZuS\[oAD h o%ni7$ lF 9bF*VC?j^8JKq@.ش2Z8:b0-`ЯP͔L8o lQ^x˥pxDj[Bԏ8VDgjPL6b&\ЕO%_\pG }ew 'f 3b7]}0dӺiqQC5:yzqoϜB ^ Z<4>!k|ȸP6Q endstream endobj 3858 0 obj << /Length 648 /Filter /FlateDecode >> stream xڥUKo@WpR> stream xڥXo6_%2&E}eKذ@h5ˢ'RI㑊&i=$wf[lo^l5|gO7/$V,nŇz/OVUg˿o-"΋b%ʸ`v߫^4x#xPnvMÃP2Ʌ%{2{4b"NDƽFi%-Wq:H;u to Q~v S;Xqqt .8c(4_%"nZ":TGv̀u2Ñ`!PU(]wKGL_A{١ KC0&^DΣħC_O=YϒE@bQe1mspU֋Q7Lp9e֢~I.:3?\vحz5`qndWI +, !FI$I}S+"-4} αoiDL V%S 17f%eySt?0Iݘj0})M։M#mvtL` ,"Df=-N޽yd4nG}Ztq.1^>rFX>w{~ ;Xp[P)8u:O WC!jK`O\ÍSl>@}=f̊%I &@qЪVwt1l$^p1*HIjE o% t!RȅHa ;>ƃrwpF*;' o{A)HoBdJY=—|:U]7 [0"DDᙐt_\諕\²$JiOfQ%;Z7X"P !cP(P*\'O[{kOzM.o[[Ijti{}#55~wF%/_kk.KiMvZN'YHwm y+Rtk$Mprppcǟт{lZt5ۤd-m04p")"Zaci۸+B '2+!ɶ)4H(#;7α7뵽Cz=UwO'FP jD4`O`-hÅ!vhZKIk:P֨** @؀(u?(tW<֞Ǽp žk!xݓa|/ mմuNBV5| t֎$;ol|WCdhQ}S]_*yt~@2wp?MGv Ӈk%CCJ-MJgKjdX/X׏NrQgmyFk '3=Ea:! M̰6$҈0{<nWBߡo7/@ endstream endobj 3876 0 obj << /Length 2865 /Filter /FlateDecode >> stream xڵYK6W(fd$2gTVTlmq(HD"ʟO@ٵ=hn"\|*ݫEJVqb-*\v/~ "Z/X>.:7`MStm[w"[eX J)^e%IP R6qv ?fA ]4ˇ( Rͻb |ďY[~]Pc W޽́ll9>^d#:s,ri0՞T\6*={Vz84_Lop3\>-7fCoTTc5!]w"99,OAlQ$sBo&"X-vy*R<ۆ9,A=bpP}.0bITn*Il…ZtxX配0\EiꮲӪ_x,]m2M#qɣ s$\O wX¨)2n ~MfsG`FͯH*yЪ!z'('?VLO!Щw5J*fɆiv5;?C), 0E"${u`^5o@ЩOAR`ǛٛD$h]0(|$>nu)p^Wr0;za:9%h%'2sfn7 yy8S,J< 2d (g1Er|e(t0xFa}4+x#|R''O RjBnG⒠yH(e%Zec { y(:4S6sA*?Ǵ:tl&ӗ_ '].cxd[WMh": EY= >KG\q' 8.8UuK C)B-1]RV&·>h>Zw!1hF]AyPc-ϕ\S'o`+?wdfbκS#BX"ux@|"!}$&qnQ-KdFOqadSb|Fz\RSOqԪ;ѥ)JN{?2SO)gY*^D4$ p4+TΕy_ 0X`ShYؘ&.l)uARʿ&~bqvLaG:} %J)B?ʍq TKBz̶{D fLTPB{pHZv`R@Y8 Ap( sˤ fH YLI@^726I2(Mf]a˿{+||߸KRV22!g1k3 ȿdžr \-Ȱ?UE^;9uy3wި>0Ԕ+bX~~3UB"AͰQMِiP0B2 Fʤ*7^",Tɂqxr|È⦮~ɏ<!gtixdL>ykaHEsůIe3$RM&gsjj WF YowS endstream endobj 3884 0 obj << /Length 2437 /Filter /FlateDecode >> stream xڍY_sO{ 5cIb7ɥK=$}DH™"Uɗv)m,_0gˇPO~V3,d͞v4&\q:{*fY[ce Z6]6N ;~XϲE"D+udz;M,eZ{g}#VjWA޻4k{ Fx}Kx)Xa-V( ZY[:Z`D\M-({WՌYd˥\2omA1Ws#/^@at>Sourq"@w7CV?BtsWiRսco]O:k7& YG+^w2a%c0L)AU2u<2YL,7m[hl4_e-'? 5̢G aeK٣j!ǪX5)5[MDl]8փ1+!4(BDbW u*&~YphA㪭Ҋ`˓z2SY 5)"ӲʫvRgn;`Cq#N5b7 6Um?2Q RYL)E\a]:;RV)|A€C{m$]ΗU 3 3Z.|SZ!\*Y"-s\Fo`̾Z]c{G,aD<+fUێ=!SfiJt<|RT^dmOHH]݋{vw& )tL^˨mFq i۫LE BVF dXdž((3t]6(MiM哗5G 5/=`J' ̡aϥC~"IM$ٯd34 QBUeɈ=蒷{27,CsJ`|]$%f%  SZxR$ua"ۤ=|`gX*l1v+u@a e4؊!#Ra9ҔSAW;pTZ/UTk4"'K6YvWPqPRUfb#%vߕJHLDdƉ V&*$>#qEF/5"8f!G,`1P 0x/`w8wx~$t6.iZKj&|ESC )bYŕ!g$x9dz$$ʫ&/`r}~:ȴtqqM{#Y{)@MemH&ͺqHɤnuI-AF"BiZ7f,Nnh+(SzcZ*-z oS< I 嶶+)[š.EozUם kL^Pj65ut\+;7zxQ]L9"9q>?3|QlZO¨ tVu+ ㉮# ꒐г8 w0d0LY&յ CRDA5r&P@ٰ=ZA qHF7,x7`}d'kOW2a#`ȓ<) iS~ DQLCBt$e*ג?EKo['e@I: -eB[ _?=>㣌kͯ>)3mG;|6n#h$EF>g:D@V.NL&+ƭ|jЃǕk$b!3['j 9Vȑɫ/z)2#5WꞼhVB-Ulh ^d< ZO7<\qS #Ե넟?M:՛5mbnYGoW4)jpճ QrݷRq]㮌YJɁ)]djCM)6Ћ'&W.fI [N?/kM/}GOyq˜'{1^\dz^*x9fIQ|!*)`edҋoՋodTiI_ҏnۼV~EwZåọ4#'udbR SD3hq/^r>AHK~jDIjŷjUGh)<@zekH?Q 0+Eh=xDc#>. endstream endobj 3890 0 obj << /Length 2258 /Filter /FlateDecode >> stream xڍXYܸ~_/F` "`wֱSRȓxW_nNp׻PI7&TijqM%*l/, o$VYi\nB:?\. /?$awDZb%0~ u q6K)T^GU&GO䰘;g{owr042fSoEP֎[=u 9xԖ?C6&u21 I4n!5 N…WϫAl -ޓ <šc9sd,Q=pt&~)J ZT naV}+زwG @ W嫨Qᎀ2ۗ{[<"+^m㯺l~&Ygr)` 8#t?u" mex @Y(xitix_RHGIr"mADNA6^)=*[6/O;{<a*K3Z-e>RNz<;81ȁ;0v[0@ _`JDKg~h;'؞"8!p' m Tvd~*0;Q+T/^I?#1Khӏi3qpGBcz"][K^Y%EfBYxN|yLBہ ;z7< JX<8Cϳ'x^`e0Jq@΢ 8N`(H{@V@_|R(ݘ iO8Oz\@^@/{vQ[0Ih tfsЋv~Zc7XWeb.Nw ]?x!q 8Tzb5ke]ꭞJM ,nǎ{A$Q.%LV4u@ J>|U1?`8.!0"3r 8#4%$g` $'uęPC@ʁ*B%7jQՒkils-%fz3b3AcNRCi(s NC D@ˁec„+bVEE)@=, ]@^zQrEZEtTx& :YT*,i2JHw”-H==һɞD0ϚDѩPur hlu9O(GF q_p_#؍e5gf/3C=*yd` Y endstream endobj 3897 0 obj << /Length 967 /Filter /FlateDecode >> stream xUo6~_!P"%YRHhWfʢFܿ~wjUU!5.#'RWTukW.Uwev vENM^|I2s~H(mG&o_pqJ"ƤhQn;Z_>spsgdGkFַAoP.?IUlSPt\*]$Qu+pq" X,|eݡ)ygea+ʖc?"e(^{ IS\lJMuRcdzmWVͫ]Eb~8x&η V1pG<dDWʆKl;wC[\s^^W$ x?@6kv$̚"4xq Xi ǘ48 Y(cvlgy\Zefȡ -x{|631iа*-,-IVCax,ϕeas dng8"趌b)%&,M5`q t&G uöӨi?'8p[ K{qFa~_Y!JM`h<ƚC[r֭UHdg6JUBg#/F!>a;Б:4zN(g_%hħ+چaԍ.r]`׹_&{yyIcak&<Ԁ[F-ncvUW6=?UÖ8V!@6st5m`dé yj5r;OyyԷ)>.O!R^bj!àΘ%ߧ/>7߽F _?v{FVNh\C)`HD0prdbfq K endstream endobj 3912 0 obj << /Length 3004 /Filter /FlateDecode >> stream xڥYv:ݿy+꜈"Ny8Nmt[""Mz^w %U{kR4^1=Ɉ0R6>J(Q(D2.F_CsS;j1,X>'(UMb2W׎$b̳@OYO~d3}XFͭ< ZeZIz3BUs/rXzFWKUVۛqaMcU޺3Ea#2F<#3F7 ]I&]f<yWK]̒ [:<*p.lg!ȃODL:Cj8؝ڤ᯶!ZӘ*_YTdA6b&פk{f0hp`UW YȓLcUSkc83Qϋź Fi5_`18R274q :/b/C/vTUtpjA\a"C&6 Oqoi NOת,LO"2ssAP]~к6'OvUY:r9)f1\ڛ]]z#0]ϡ0FD{$σO |Dq8,&`$ߡ+ul(z:vÞ4Ä^LDӕ?Nw_ T3\ eF3sYwxN'a߼0uc`8)&.8߮i\q &=8GaJ\*RCbjj ΉXzLYvM .L$}58woٻ8raMN׬nw6_@I"S3SP  P##j !s[uH. e^CwtuNgӳr\1ą~` NJKBd1dEiP(CijgOeA -0>G]=͊[ټ18,E\eTIpkݒ/+8RKW}{Zz"A.6ǧ^Vs|TY&#BWyh5Y'\pi izATQrm|89AM0^W[Q g pal9tlY=ܧ&L7<X~4Xi|uY2e2e ?JBܓ-}V%/=Q.hQ)%҉e@/]˩mnع_"'/rifop # :'q.&ئoSwaBjud%gvl&#KS]bo*UO+D <]ʵy}y.O(O`1s%l QN<(F r{d @0TWjBUi2A"3؍jV"]ޒa*̓J:#4}C= oTvEM*Toqb(r~;zFa-<%p_-EŸ P&پcslLJ[>ÜH^Ft۸[NL@F("=91}?81&B,@#0ɒ=?ƆV<ݼ?Բpyz2W*'UaӠ|"* e.]5rsX!qfil,Ъ}i9qǵm n4wgmo QA,M~ (,{J> stream xڥZIw6W2{L\;'mv?IyIKh0}P '$PXXꫢb~rGw?FŁwP B2Www.ywэ>]׹YQ/"rÑs9GNmK9/2U=C?Ñީk/0dnJe F\<햎Q:uSk\e1lu2~Pb> pǡQ<2Vg?p\3F;Q !r rCyʓ 6dOf3l^؞u'9+f 9RW"` %œ +<6f+ *M P>U :]ӀéHm8"otD`iΎ07Pv8N"ޡYg6C++қpBM1 Ҍ<QzSY-ٕԼY,I$UX# >!蒋0|0?aB߰]iظb/b1q ܂:&Vlx*e@SZ \_}"nL3x0 Ė ?0NTs ^=DۧQx#8g*-Ƥd9BF]ڇkhV%9WIYaؙf֦*1l V++sOG`[Ł= |q襝]q*|Yw Gsb&"]Aj@hձ!O>34"!e;Ɇ[4k ±O| ¬9ظ"1GHUcO} p1pM%vqOހK#m{{D<6/go ޏɽ/x/DlV5>%e)"Z2?v!-IEk2&PvDTĸ-a@ Iƹ6y|0om6eX͔ {~``gR/jrÝI KrG|[_|t-4UnÔ5#:&d;M0wSK,7,_6$4ȝ˄)lyh[6ۅ+)qKJ!CjMe$ojݛՁrG' )_iBUo ݑ54odF`"Di0IRm^c8;$x,Q=2d_+Jh%;Ըj-Bq6J&#^뭀:eLJH!!N 7C=vClV%6)\_'fMq\YF“h+S(dYi6mN-ɆoPIEY{,!c-\.Ģ@{& G]'FB> [=zAz}}pơ`KX_8e+,܅LdhaLMeeXP?3D%OFh`_M&'HUȟ%R9l:9^*tUd~J͊^bm!3vS]~{&D8|dt0".2]cat݄-bg_}Fk+hoc@]]vCx$ #$m'tv>6xXM ^Ήm?EtZt?V );,l4ӒXwoOjڦ˶ 7 *mGyI1kp҃W{ˆrQ4I<Ŀ@mv\MGmf*Ĉ yj똴>DvkA] Eέȭjj'|Owo5Ӣ$Of9l#sZI\wĎ;++}bg1.LTHt)xE?sw;9 8}58jVU KVl{6= +i#Y(jR<+p*X<vb&CY gaT%Q/SM} /]\~αT L_S+`[& j&ԡK/xYz3U/mzUHH;#ܙYeD2eϕ v3UC+(QS}m%>:׺"+Or&W, 0 FRjUπs϶LzSQeά3^fB]`i-Y,9al#,t[&`켰% LQ0i"y\VѦPJ~dg d\}}N=[s=8M^\]wro5԰ endstream endobj 3855 0 obj << /Type /ObjStm /N 100 /First 980 /Length 2468 /Filter /FlateDecode >> stream xZ]o}C0 ME {eVmki$-ەU>Xv$ y8#%gS2BgI&Yb(zvQ|/F\+8P ĪEU CNTJj"EJR谇RQ*TG 0O ɱf@*w:h]WY>!E;QCf< S;8r*!&N]1(e VF4# ޡKUIEt}`J"Cr+dD'ORT[_Q௄ճHd _SrվE1rST N=/D&Y̨gQh&T NU\`/UpVwyu"-1k H a(䝂A >a\5" >x)8})H(@D䌩-*) }HIg@% h[IX8&W* @ qRCsMK L 5ޙn"Ŕ g`3Aq vpttм6t;CLdL]_^~<FPM͊I6+`#&j/66Ų9٨(,h 6ߴ G֫O)`ЛoQ 5,3L7y?ܙ!Opct69h^aɬ[jc4&z1,W^yr:l?jr$OCf]B]lg_#gҼZaUqԞZqVB ȍ fuy.N'jмm^ G ϱGdhKp-rO:4]4/nΚ7]7iNKwl8k>M/ϣtvt-;ZZ,DKUA i i- i i~PI-iit {{a'O>Ju $VIgEɢ}uYˊ=غD;M >!2[[Za#G5Ɗ<c1=@Ev H>aV7" (>3Z,b9hlF/nBCi:/n ,F!-=Gvka/џc4%7/']7Oj~9Y6WShٍ.)Ϸk]뮻v1]6_lE^StP$d'7+zo{zv{6nnen GrRe-pqOI ҽ'@{Az!B ʠ X1(x*Yhb0Am~v9lOiM" jj~kWnr)3SA҄,OnJ&/pxVlBEPIb3ͮ?Kע<Ժ/"-W mvؕ„\CRC,>tO 7Vi |<^aR lh.佻@fWZ=s#̹&,kw|z])g7`I YH*v `}M9!Ȅ{H%[AUeہxqov|kWy7JOu%Y u~mդa EiFE*Le 8+e 9IzXFN-KڬH6hNNvh<`Jxdig!O3OchRO4SX),{ =a'hm=-$dw6{*tܥ< #h-,H/<'M7hi.: p<龆 ЭZAJ!}qPtC"RTuSQiXJEݏHW]Pg&;zjFB*dxoa=gPYOgk@+S`$Y=Q;# qx«GXY@]@C=}=B HAe#TIyt f2\[P֬?w#Dًeҝuny nwO)nb늢(";҈ endstream endobj 3940 0 obj << /Length 1063 /Filter /FlateDecode >> stream xڕVKS8+\sƊes52 vaJ, JZ 㩝Nu #wSY""A &\D*A7|6M.bV 9Mpq\HeZ9c4}f6kN>_?3kW^w~|1ElUP|:M8xdw =₣VOC^(R\f"Jނ:YWUˉg?N4E6.hE쭨j|EkxP]GAГ\Ĵ/sB窟T:̑\,j=Leo䕾%V>M?>q5J 3nCmY1u̺l]EX aT kY `VMp߮ -&Jy6h(ߒACYI++)sOeNѨuq;sTo9FE#;aچq 0˄MƲ51 1/L}axm@[VñpPZJjrT/;;"ssS\˼mB>0/] VD?žlx] *++tff o僋 Oi- TvK%:䠪tg_upb9 G@Al}zKeȮD~Y8rb\/ZL“Ϫ<&B)ԝ ^0a;͒+^$PXvIi7@Y8*~E_H%MvٽSb,ソs:{+YWɭs12$p_G~^5 [ZKbh-q_)frVMO*ABKR&0IYy{Q-ϾhT=cElN'̾!;pGmvp cȐ'eh endstream endobj 3965 0 obj << /Length1 2445 /Length2 19728 /Length3 0 /Length 21141 /Filter /FlateDecode >> stream xڌP\"݂C]6 CNww '$=1Z)HTM퍁v. L<Qy-f&+ < ?rx N@#Ld(ooq09x9y,LL1wY2v@gx Q{O'Ks P<LܜtmN&Fvy# -( @?!,\\xl.3 h e-)j(T\܍h rq3:@rE?r%pzog#{[#;OK;s (!B03ofdicd 2t#298Y:838[#_a@4ۙ\O hݓZٻyYڙՆ+PZ_`gbb@ ƿy:V2%`04~ཝ܀'WESK1wthZ?f_>6#fTQ*ED=zv&33q[ddouD3p4fP{lA@cbg2}1>Ho=??z#[K-@:bM5h{v1a;sh,a4Ut1g3PpK;_@gt8f :RR'O O7SX*(oʮzW@5A7bj1/bLm@/o&hU ?K_P٠Y9[j70/GNAENhHfUmfbQfG :~Gfځ=9ŀG jv_0t1 ˝f\Yڃn3?8eQAΠՀ:w)3 ta2X8$[w?@1\ wqH^@Rϥc"hK~@y{`a|wq]4jz%0YNCݨ+T7B?_Z`B'*><īL/N(8##Wyqd !Cʅq+QW<2W!\6Mxq) =!,  zL<-q4kKÜjs'.9! ~ wIQ:Bgxބ9Y \R?%Rz \wL' zX%fUdC%/d Z঴?:O;h|bqxclgqwuT!}L<$lN~xґW:wɯ{ߘbP;* Иq5i؂wyv]'sM;WvHwmcPB[LA:b8WyNe&oB-,1##.9jOyA.)C4Sa6H";̟UH^ Xhg xQ/ǃ,-^5jG˰w4}T (Q7}Ojܳ"Fƌœ1>'0qL|DxöB#!u_ci%kq$|RC?IJԟ.*6|{dcLvhYQg94_ip2A@PQlfc*HgCJq\NmpFvz;ARԚTAĮWϰN_928gyk׎ɘ;VgI69.'uoQ_&Ğ7媷pnh6X?QN&s@GtP@R%_gXር2 B$[S%Z:T#~<y ٚՓwap[:aBщGI^m7mq}or{;#jy<M>8R!ׇpʈty:wzN>IiګQ:D'Dӵ]Y&=&`꾳 ,_w黹D:?d*/NGscrh*;KҶɯ.5 e K/'.~(deW-Mꉩ"sO%Z`2{ ã&ȸŵ[(d6a@~ՙ+lߊ$I4gbS6D**l Y+].;eԥXbER+o|ru6;(g78rZ {c`?6Q9jϕ(̇ II)Nn ٍ & v}5 S39{ .kt?qLxw%(>*쟤1˲o=P-,PU!j:K?Τ@eěi Kz4R+n|&}oзҀO?;>矸wh|ٵU\א<4sLLi!ͧ˗hD_,BwHp:+EYe@^̀78QkM0^s^eݦH! :\0O ZcmX+"ھF'G1kNն  h!!dt_ivE|N3Se{UjJx 6o %6O]_[A" Tl/,m],w66(N% h ~fmFl$S!]ͤ-sdF욙JO*ܞ_8ki jBF 踔|q~jx cJ,虛q[wPq&zI!OXVGL_\ɉO=}uKpeLAE^W%'k2ήxsC?ue?h]6[m>GRM=/%P_B {zHa~> Q{g1j*Av꼼вb04>' 1ٛᖠ:dX́EcIV01 `ʜq9 uK "9$98G'z^෥ҟ`FbED4X!k̎5,Tf5,raF}RGR/~TCvH#4, oy6`ܷ͍,\޳F[6 ]-'Ӛ{G"ގ =%rߺ/W`KH' ^,r7EFR1O'6(>9c]WT/s|/\FPC:C_ ?]z'bſ!ѐNʢעO?S+*AEsѰAU⛥H䃋.{c|NyiNlIFIԦ2w5ԅϝƧb~0l_X_V%))P x+\Syp1}3 '*21n[lE!޾zyRod`LluO.@RdoJC;Yx ˳> B-ٗCVy'|'ڐ`{ `J$VĻLsq"ON;Pi%<#Ψ+7b[x=p_45q/l"|jn>߬}d߼Y&c֏fL 19Y1iC]|-8}I$Va`Kebo!8FbUhomSP7=~4]h$|Ud+˥t u|]|!RҾjc;Ȣ'⿑}l㸀4LȈ>\s_&3gl8/=3Ɛ %{l.2-Ty_ұⱑlR3JA >=|JAӞMI׵yDc3Y}P+3nl]2aNqN$cӧA+ AiVEd 30I CE4$7,wuw5ogp VcE# KĤ,~6~/G|A1on/g_(^?OAUb:.]W80֤_X8W8<j* #,sړ'9cYoOΊCU"%`Il!rV?gHM-!ZUVh*@꾃Q;Ag}-,뫓n35W4&mhcsyv9L׊'W:n{LvU)$2\l]Ją k><\K^Lbw=u[Kh <=U\Β&^slX=-eI+]#'L#pDklڂG55M=WePWTZʶDS Xx, Onf|_ ~#`H PuxEO^3/.8|]r߰C&ɋҒ 8~4~r 7Vp }$MEeBvxȚ*l/+_p#a*@U#xd5jÛ)p$\ޅ#!>m _ %׍bmºQՈ16\3.G?\0:[R]4PC|\lo#ðN%js2'j{GX$UYΔj e93^lPLF4ʕT sׅ$ԅa,QרDyq>h /u,R|{7L)$#ekkחhq_.|xxQ5DԽVύ$ŤO9\QeۤOqDd+DB߅Fua6wb"uW{B|WhoG:/{Җn7Gc∬苿ٯ ]HVɂT '=3 -6iB.gT4Oe/+}Yv*y_lXH#%l!Fk~NKg>+u buF{(eKLO{®udrs#V˷qXۋK}w&MZy.]M,'7U5kYl*?x&۶UQ @6Pp@7N_5^{[3:YC{ÿSbO*SLGZ.O𽫩 Оszunxi9* @$I;pgiRs`)݌kf*'[@..6yC泦(:ScԎl=HjRYCoLih(>ϯq] Q:1{ұ)Kwo|5;/`NZ)b?n&xzsA0mpCz%*fuçyyS{'}1Jy;<\/*`RO f+65y~PHM8-N, 1ϯ&CPN1)gCr-ֈpJ("y `D*r21qm}ԭ !(Mπe历pi2:MD_7g[F= |Hgŵ5&xU1N.>0>0b2rΡ8l&!pz+##,Q$rd6ECJq.{#Ak>4¼PlTgΰ4鸛NOP4it$r@ݓ/%zUXN 4}9)$c7<p:mro%):"2yEF-^*r_{l y }}hqũYgkJ5CA (ڽ ]v)Vc eBI"Rn@HB~r0 V=twa#I[u %@ag󀀃QЄC:*^"}(d^-us٪;6dƒKIw/S Ć@e<)jvV\@\3_tR{:Em/%= W>+!%g3m/=Bz/2/c6_kFɢ> CE,crBJZu&;v,ijf{+ Z,mI4* m~=6ؕT[^KP +q# '݅F}K?9兖l1vDo!|&l lU? [Z縇5 ӗqKkyAT yDLY1|g/#"4~a-&yrt2WHe8O^C%%l-[zC[ JxkڌT|Tou\Cb%pGqY~ҚZd~}cwP>Cu0jsK"'(,bK]sYKvf|V6ةb2@, )g= v~ ~]l9C1UEq$Q]~ ZQvzbwvls!XE<©v]1v&CJd찓೸& .,aܑ.ސN:ycE@oir O[YCҡK%ov܋M+1ܨ 0T{HI9.L{ZTQeTot7;m9zw0di0w}F{j@dN pDnu3,w@TOdyKhv{_-[5WrB)K HD."i^2+.PiJBqp /"(uƈt; „^},ImqPL:&uQiq}'Gv/Ѿ٣*̯F*x 7Dk>z,׎"۵tYj`5o7{sD๏:̞R8n@8Qn}Wt7QوŃX>.wmRNBCM\okmE@/) qUԃx`vjPJφ(V/p9 O_ah|(Soz:ո˙.(_/֬x4,gcxMB@Z&&e;\Tk|GJ _;[Vq N &pGC@CFs)TF7||GaΪh?iVEP}?c޿{\^<7UYO(]WOm#-z!(C)(E!IT/$%fI"ˇLHf%5T*Q}I^?) 1\u8ڪ~KKm&`Cp2ZnfDLTF.b6N "-2w' e^ch~Vg5yY@Ftc&S$0X#ti~pMX7=4%je;/{H1]ksы]~Fc.ҩ?ŝN^dx~"0\h"i|&_W Չ{'w84g.ڼdf ehQSET2+A {؋0cbp 7-3-zIcw޸jOT2쓑9ŵn{'ԛVOv>}vfԘE'.kۙt>*k:tHߍMͮ>߯ eǖEnْq~ ,Fxv/ |Ȓr͛aw/$s2=d(DR^4tɆ<+ )cz:DVfYT6V\k/,,]◴-]+łms@:㔬Vg 'wPQK4UE D߽ꗌA3qVjB|X w,%HrĝܙxpsncܺRR>88ĈU [ j]Sh|6oN'7@ 2>QV[46 ȳ!g0V&vG򃏂>%|B*(]b$εf?e,JeC?$ӄ dk(|P`ʀF5J !u2P׶;/4/Im-&Zyz'jW^1 uuӻ8ll rtԯPl( /Y4зt:ڔy OIKGpLNohaiAMԐdX4[Iu&w 5,5o_!DN#ЧAUrVq1?*0FFUlyc j[xH9gǃah'En0)i%/!2nBx6\uX>akރQԢ'?.OK ? |I"׀mKˎ97g0= lpXkMP4$ 6t0n1l)Gt.{CyNQ[C'*f bCӖ?.SHIl 5ح 潘1B=+ݯι+5-xOz Z4S;" '.hm%VH!(r~}=i>#&„uMMcJ[䪣^OY"n،7-X},ܔѸ!J /q}OiӝQfYk_+]]C[$0N p=2kƬ^ 糬o2ɨ}1SCKPEA+R7m 06TExHFPǹn-.>oSȤ_6ݙn(̣-Zk.<٨%e>~v#NHeÀm)X0nF*H_N1hطimQMl pӃs!Wm5eٹf'۲j 2I1=z5zΗ"5sk w%S:nKdZއWPiFVʧUht$,kDB  *}?姡3O٫RB|;22& =國RM=!l C;huTPF(ƢcՌ-(wCZ7ymLc{uMHM]^tIK8 c3EVfk⇇{ve45z!RO;A1jm' sf# 8 ML"ɒ -w|Pi9%&ӛ! 7h&Ittߚ+kG yK"[_tzUE,CI^J"vh֭alqU;v&+i]y2T紌]_ L4+3Y۠ yY JL>u dMQKmR:C2y&LT .N3+AϻP(z,;dٸk,%srih$KxC$ c\=#iQXFI'o-f\mN78>gSE'D?%'OŃD4L~H`'ZJ;+n6ſoF/]<{FL 9O:%x[HR Wb9<'4Aܭ- - 8n/~v>󑏃fo&N88 OM@ʮuAT }6d\ġ=/d6 K麐fM.iUXK?#˹; X fn K㲣gْ^mB-a~Ԣ7-ZmtIUV{М+Yy.ϸ3XQXMQedseka^R:y3-_E<ލB(s"2} N~/cLx~^ 8^bI93yRh'K(.1YJt6S$xaklңbVl`e5.?_lYieu!ztv8?|_#+<7 m<Ʋ KC3>>}RKӸ簡Tgj?mR`6 Il`Zg ^nᤫ~@Yf_ܐ^kO-Ix Ms<+2{ho(6}3Rx+ đYr!|BwwWbl9z7fC~,ZA`oCr `5˧,p[ /JU2FͶ vݞqc$geS{ X%ؕQ%Dݺ,!H˗>6m7~GGp+| ^?r%J>ɰP!K?A [qAsfn!+;E)]EN7A$-ߓ &zXz3@iV-8BeL\9ڢ\N'TR?7fOʡ*JyH(98͔cRya10v҇qW*qn;vVP)SܔR$qGd;|+r{{0̍D!;*yu(v2lw.dfMy||mXhhڪg$aJDpEVg x^yN}^6n:JXBI-Ñ6᜶w2^";FhU(m c.7V05ݯ^y#*V67ҟizb(žrp*!f73i`a\ QRmte5JA i}2: pj%{>}ɽSmZ~!tf.-6VLn,6"X(N#Nak*֗5G%pS&HagKuwI$PmejoPG*@Գ&iqqϣ N[/>X'Vr((j-DuO_c 9O*<̿+3!]tPVvk2T|mNd V͚aFuaE[{I|;O аeN8l !M ѩY4f?t~: c^԰ɄU MiqBge0:)3F_%F/2fUr?M!BnwKX)n"#)?,l; {!1' $\,(爘owu[]'9u/"<_W7Ъ%nbgR\: %>bXS'_ϐ6s['~8,;rD̺=[^<&`fBkA]gSvEޔZrI~p{qo5^/Ԣ>xz^wo5߳;ECH:(AY 6BxPhA-m :>cE`OZ N%ҽn#xy>gUӝr?fJ8@]V vᏟb gˁ 4,# [; Yq= BJU?]JJ?~0U vpj ڪT$QxOgVԄ?!J]I:W.rN[Iu !eOB#?+͍ZPoțeVū! PEdo{Xۯg8 O usmbPf'lane)Q'Y^ZEԁNjf4nO1=wY8Y]20w=R7F9_@fk.nf>_M7uFX' gu -\X?(\E=; ^?  U DWts7~klh5`@Z>0Dm;%ѤT_KʴAqd]aBy+/7yRӣlH[`@+7U8% , Y$8*' 2~&!Sg;[L@QmLRVǰar&U&% ōlBNyA^~S.ṃ^sfX,Cvt\"6 զ l_Kp깞ԃ&V'xo2a4.~U%zʉ3 X=i+K}NuŧFo&FrH/(䠜fi2[U;ڛ;$[] _Xy{n )B'E[(/KpFMb.$Î Ǵ LXqh#s6-%ȶ X~Au[j_mtfch2ʶֲ҂jQ+nWdd_'PM=XΤE4Ҵ9 %5 h=9}0"u_M:jqtNqx$bm>)< k(S߁ =!E3Ja oP>p|R Wz]Gy/pVq\T/h5%T/۾YٗsP;R=ẻ';-O;|f LNʶ;Ѭ؍^n8 Bl_z30() 0pYk@YM2+)y-A8g=*7pt?;<6^lbeޯ?ײ@S̆((4~`ɕFyxwVZ<<V8d),>5mtk٣z_X|Zq #c8q/èwv搙Yk 7NY 5~j?ANh¢/k~y An|Px'mbW6YݗK!|v!G=3]|}>WD4 65؜)_Q 襤z 4ЫU窂;yRP=m,㱪Y~[YʑtguzϠhxf:u9-d0wzdoj$9LZq?atTݜ OzεK(%vlTBOO` 5t;әT<B&IRhIuV)? whR]u?e\X,ɚ9e6"g$> rh,"7yU.[ᝦpJC@((LQ%odzJ2K[rԟ]t٤9D89)4t:DrLJz@|s ^u,ZOG@Ι;ZKAHbV|aLae%1+ZTYWY9QZ$-VߤFVE1/oW{d,JjŴ+ENEڙi&=Z3OO n<\X|~#͏›ԤjԊQFNzSҝ[L. ft "П(!\IIwƿDO!aHt5KqYH6+H1O$Mϩ0BxOuMEu kBG],T&Z_jG O|!%i.92/0>kL?euWc҇Du7w8)Se_j=.vU*_:~g^R&GHJ!! ;bzT ˀ+,XFE؝ŻgBFZ_̓|"gE>ĐVǴin[/H3J2g.Hǫl jCGn8:J{+l8 0Nyvf$Cm?Ak@͆NC.B"vٚ(jm75y?IÙO endstream endobj 3967 0 obj << /Length1 2616 /Length2 19494 /Length3 0 /Length 20983 /Filter /FlateDecode >> stream xڌT\ -2twwwwCww4 )-! )g|Y5u׾{ȈUL@vtL9aM&f## =##35?r82u-_" 3X& t]L,&vn&nFF3## @W =@G&bghaf >?_T&..B6 G c-@lh [='%=7=ƉьflP9]A&)6FGP5pB  [' >"% PX_Dpg= `ja (;;& Nv`+h6: .3w~NƎNNֿsd\f1[;o~ cp=\+[;7[ S [i3Z8Dml\nlU{?Jbp>^vSp  Spvtx_00v,lDA;Zt`oz 3cOTE%Օiv/:63 8G7;?lM\J\$ɠPy;<_y q7e$bm_?zǿ- 9;_S пZꤜ 5o--A&thd112x猭W@#lL~3;c3 & f@ok v9(;A_ qD N`/`0AL?  V"A`.r_ (A`.A`._ 4/b`0M,@ '_)]sr8a`Xt2hWpL@pTӿ oש@Msq+"Y_pPq ^4)MŤZrKwB{& zVHũX.T#TţhchX! }P\<,yq\RvKl~vc!tW,6]Ѹ؏,e{[nXA;JoaZ 7La`b-L D`_Le1Z 9CA=Q,!{}8S8CJ}.z~'K9MY>Z[;.8:.`8PJ&T"6 m.΋,B# JVAW~@]JȤC7 {-&ba< ±:_ttM`"fsSQf? HTz*{ /\|b]q0\{X&l9k%ЭlhD"i>JƔv4.ifc$}H{^n¯ǷMlmy\6([;h}pSj”70#Ek_FR9bQt$*E[IT7l"r@p-@K:~~Βqrn9=H@tF^/-I'VY{Oe$E@)%E[CZc!,}Ƽ Zq;yZnt4ky|$ Aj7mbPt_srMbϋÒj"cOsbd4K/)_eE_eevA,KKKTuР[יl4y:%`ޫJ.s}ٍànA8;52e(υb2>j#ZA>tֻ mJ.[̐Țw)X9 7tbѻRh?PX)0 FM{7a$rE'_g"u9;ֶdHMt):,a ~TaH6֯ܛFb{YzL FAa2v&Fq@ܖc5SV 2xJ18ؔ_kzt E#9Q;'zo*5X@" ꋩQ_du,8f(k9r>?X2E u3]L^Y4 tcىL[ȧF<.`Q1&H&%9Adu\YѠ+zvAo} GcV7rb*?Boe-RsܲBj̶AcN<]]%ţo}vJۡxB*'$ SdD5=_d/"ҙU;-IbVf'<@}SBMůfK27jY:U !ajPh98rX'{sqonXqtIS!Aς5wl2k-m˄( -I`CRd2=R)5;p뻸X{@T%s*5T1׮ĿSnF6݀ᇆ0CT^0O)Ј툍yKEki^BTܞ*Ҳ C V~+NZӗߗk7͵{S6=Lmt Pe, zsӊ?+{-Gg#_W/ݖ9 EKF;yѐ;7g^WnJ:49Mp4g[6?-lLl%*ՠ봐*9{RCr_3dP"J1"(oxz 2l+nضAQm]fssF#f25 RC ]oi^!LT`K{+n&/c{ytC!>lh{yF^c#p R4h3 mh̖ey^BD~͹LN-アox+0 킦aΚErG!a;v%ףNkKSP振E.-z4).ZG $,ֵi$G1I16&#Daxb  i 3PL iWpßl%eߊY*p" gN.qZ|.84 Z #\m*CpltȪSZ$veK5bѝ]kZp[gtQ$mĥ3:Pǡ^q$MsMFn:_sf&i=2ƾ*P?kx+ !os={Z^iDۣ^1"ؘ/EH2m/!IcܡL"-!fQG~:'km*RG)3X!\5MrOq {WqH' җvW%'z3[\av=#ďC&q71͚b>'!! VLkkb4wvE⼵q,)onʓa)w^ J#+α ] U7Jy'e-U[XbO=m3,K6'Vpʹt~[GNIڅ;e%Pzrx0̩Fi:%+,? @g+< z)lM7 ӽdN>]oᄐAFC2+B@90Aՠ`o*zf8'!!B򇒓jF}B\){;R% 3Q\s|wٵ%U-ע{]O˹ho[YB ru2o3nG)OK@sJہ uppoϼ:r7M lڶO򮌸'oxI.8'mHt {[~t˙)uZ3 w^]%A"ۗkInd|/3$a|#_NTCQf~3mꖭ}7GY_ Qo&5L0F025$}S{,st((YmDžP%nbBƊAjL_a=h0$|*|.)7wN~8qgNOj]V+# dꓞQ#O[ufgl^ˁvz} JK%3|uTp5QSbR$[2$2u@5FX|H/p]nM,a-b hx/ *λB6%3f::=!8D .{^=,򗲺)C\L5 p0߻s?Ñsreo$<ݯS.}0BӞ8qGdKoV" I5Ȓ"MCuR˩kcB]L[0#Nb}T15P,(#ˡM%;Ca_lV=t{Aշa1<[>ة/wJ Z$'zϕ6ɦ+nl6IOsE;.cCym9^|S%~̮(l 1H8f(+JEHVYqJ<}\';biAtێL0o{j%iB=֯۷Rb]_.$"Hyj6,2|?@dyts4598q RJ=Nb;bD8J@zF@PGȉ Şiu#n'14 ݸ*dѣA[NI{8T>z=7d% -5R91 bŠ& vnMjvû?f$ـL,)Hu5G" }ߵ#)Bp]|+ʔTKOzfh*eD-tRSF=ero,|(XM+bVvU BW2Otr 0+\gsr0g*:[ Gy?xx5#n Xv=X^v~"#b qo3!zke"iE$FCԶ$-2ﶅum}2KؙQ榲:)⾰lY瀕8O`׾c"\٧Z:b1棣|!;tH)2xi5Os[NWWXzڨ}X{P(jV a*cTeť>4dfXEV\-HA߲O2+t2.c;yeu%vv}IM&ƠC2p}xfaХI\=-^*ї؂XQ6Bsܪ~HCU7&ry7" N.95C!c6yfҰj0?:1.S06}!Mk , QQ=i1/F6`*<.USzr"kP&Kސ 6c1b}Y%"MxH<|t4_XĀq6*e[U inܑ<;j5EpX 3۽fˍNR}W 'dM̱YYҢ*&G~@Nm3\xpE-==2{b`^`=T"%j6U߱>8"ebp E^3 X|ڳ=ZŶ<{` ! 8Cec0_q5lWλjo h&Kiu}*f†̡z1ֳg=238YzL]/H*v1Z<_ɌJ{ЎLkܮEEi5'(Nm~uE61IUތO_#PQ'>DST~º8.*viSeֺxf" tu9k<~ A&}`k$ueRyup?1V)P_1Bf948OgIWt5Bv@?}Oء^NO]PnG%lfq3J|@^2w]gXoRi:{Rax1vFW)IًaVc?S8j ĦXz4\u%!\ټ$v:H?CYg./^e=$h,}K~TN(@C`j&n&}+w6}^QEd]:cFv;m [!k<9Rj/s-GG{uJ[H)sonxguzqB9jOS>k[펎&_hרhGu(Q?9qf:oÅV;blX>L 䇋ޒ_s̡7V8J]Ȍe`N:O$yߠɃZ^M^HmIUe\Xc\oVNjRoګ@nI=އ=3~ȗ15&%˖\Zv wk#uy P&k7rP"~;,ŤI:邖 q78[cO?D &%+BzbnlR_U9X\RiQeė#lm)ںze}ENq5c,qj8 Y7>vOxǽ6djѕ@ -'<@R'~nZ?>kC%M^n4A+Ftd^ेPCj+JEI8^^cbj:nn/ ~t@-<EME2}צ_O㼄rV!! ')XNM\uTi?\`m&B<7H!\{N+<^)%yRDQrbubw<~`lE35Fʹá,(06zQek_3;MSFpOhV*ED$~音ն4n(_>!q9f zjd86-֑63 !ݳ|S }NXT&>\*-گcparܘG÷ލށsbkxWe3E XFR<&^'b9T͑-8-~ҁC=J81Ct<H2 M;U+anM%L3uؗfl}_b9x^!@7G^.xvGArz}fZ=N溺9Ф7;:pE4h_5 O27D_@+va *|9@]~+q2WhGA&}7rnc^K^evhd\X|_E:쨟 (LL5μ ܆ٯٕenc b0^0HN||7%uµJ~yIEszoTlx>wN/\#+E>IW q3[]pAѸLxNvםUW('&? a' )DAj?sZ/j mkϟHT^g*g:IyXCv  o,y JLKzSOѰwUo5f5w 6h#F@ =uo|M}/Ts>ׁIPT)mzt/wxҽ Gїчc(8}O hq2z#̄׾˿G7U ˞cQrD:E(yL?wA1.mKq%A"_f8VL'0Ih"sϪ@.PyĽ> όt`1AI)JMTgr4 ԟp]ĪɇJ'jFBx6'n‹Z9Be<ױlN5W#3*kiYмL EڦۡnD١(Q<0˱{yqLs `#ipIGpNځɩ՘g4#Te™\u >X(!1SzIdYRp9Wn2-;_`RQ"E߿}LRJڒ[%[K{.ՓsZŲ ]>qSZEq>-<A 5ǪY<2 c]twRf?؎JIG'jii6mK&VIe+^K)ySLZGvQ(?cK#,8olN\~ӛuiaNDh3iOXzU"Z)/Vj}Qq/Q5V0{"۳yEg2l =>5Fŗv +T}h = y_ɇfL5}(0E?jGW"@sM`gށ./B· hYF2'x&;rT3#Т124zzm#S`J1GuE[?mO^0jpŢ$Kϸrs1,XYMc 揱[k+EmDr{`BXF' -+^]Ygݨ?!Hg^;֌9a7{Eh*/weڸbMP*Ş=tʌlհ_2g/em:3z7c` f+ zHf) =oeNPßMKX9&y>)_l"5D>t(ڗVUvC-]ϵYI,3x_&{XF3IzM1+Y@SIqME*O3m>2*9EI70!)Z3ZMhZ[?)[}^)t)D+P܇_hǏD5HGaŦO>PYZ >eވn&:LV|A.:O6՜p(oPr<*ςfپGY}*1s' vz zh#\ Q]l̟tt?:x.F7꠺36/ QW"lO卄W,/M^ ="[!MRv`q4fpD#=jSIIӲ?]US/F~dgcZ,-/=zSdlD:u2AV' )9Yۜc4ʪJA)QrnĭS]NOX34#զ$ V&nTOv- ]FbnBfRi*'YeÅa(5 $z}Jz"!N"b4E͘x_eGy?țWH.3bKkT D| 7gA ֎Q ]W_L&5x`XĹrpjOURlSBJ Y D-q,=*n4jv.\hmJkB/M3Hb A lm,$ A<&fKdxu+k `@֦ue ]Mw$ay}7vCEDZWϘd)AwcbrF|E/7exg-/4/oϕ)_0,9؆+Z/ZL5 7 }qڃ?I=Öj2r6^ID)<0 8z7 ㄝ1iMNn-AaLoJ[55Owm)U$7T2|W"Me(ζQrN;sטgy!4v}1 O2sΧokӬ̱H+Y3oMUx]syj&*SףkΖX!V76zޟ+v>-94 5/xpK @ lmT1tnsֺv(UJUHKBPލ7//5Ntnj޺K%(J%D"}Xd!S9Zr]B~YN{|n$4:P0/ y6FЇr/">7&ĮhL״g?.yRTҒ m]g|o4j[@uR .:QRsNbM4QIr4NBc)⸲i/a+d8" 䕥* 3 Aro ]o0UPb4aaj2j՜З`Ap!oEMisz1ْr3g"d)xt4ȼmޡVp JƇ`-CْR㚦Q"=jWoC Iƾ4l٥D><,Y.Q"D+P(*40ipO<m yܳP2"d FW#?(?t)i̍xu۵S#sEݿ`Á qPɝ5K R"6r"Ht3@YdGg9/xsd5{%)5"Hg}Oѣ*|S|#}! \N |͋TV$랒"ԠTVgCj ?b9!HЂ "s7ߕGF]=: ӪHri`Ng? 졜yz.^HhzBgd.eg"pdOpHyW_INtSVr<+-ڋH{Ine%A9qv!&fE uu}0 WWqbm2?ޣ 9*[ʋcOO3w6Z=WCD94̼Xk`:s.e)3V18:ߕ^/?άo)Y$o ɐ+osZ]V 8jke}\rbΨڜX.D;Kư&EqYlLMRf\I iߤ)z>+ S"DDGLaSOMʹĘJ5z=w6B93}T."]ǖC+VzR/L8j|j|"Og!!M6#w˰Q HI6e snO[ B#ۃ.OPF Sg  ,{=3:hYR+VK+Ve[5 dk#FwE{{q B}|hzKTmxKj֕n56RBDmA=N -3ݪ 4 mLnj=6MֽK?ݡZ5*40b- ;}p2%1)KxʶeՈΟ1[KV:j0/fo!F<3A:ɚD(0iw77Hݹym.Mjn-Kc> ]v[긻xV1rT7dصyк ;PXg7 H(O I:_Dvg( p‘]~})P:exm=) Mjf1~+WFН2K:jisg>?Ϭ=DI%x#h]т87NM,[l^9KF9 + ,*dڅ,i~u18:yzpSG`~ctrnAZ!Ƭ1UObO¢+9 YxT7QKS6_$"duFKb5JSTH-a2E͡ nCSk!!(_bǢIϹVsl>Z3.s?0ݺOhJL4ϗk C[Ñɹ 梨_Mޅp2`⚋vyExrf }5X$y2Ld}f_{wjhcyT—ǮvIWPFd%1V70c=3/ C&*xXÝ{5VXߖ`i@Ryk26 yfxLSR {XscGxp}cUS%ӧEg֌qj=7AHH5-6Iϣ@**YhQG1[w^Efbx.[ dyqb2ز'I@P#wi9qVj('Zps1GFXx1%(G{>^|e#b%:,QEn1SG9g^]gJh2aXsXEStͿ=1Ag~=#cHuvkwAHSlwyXOz;@dX6D RC2Z G¦2ɡX#l~l\j.2Qt h>9kKQ}ymG2vmh̊a^}#rSPڇD>_A }+;GiJϕ=*I8 5@or9U X_?+J]ӈdd^9\p뷕u4U(ua6 Ĥrr0FpҨ3R»'ȄN w@bwW"6ɣ89]T͋٠Y"yL .į'%^J Կʣg~~2 'D SWmwZȳglK$&\}ܺ CԩDQ̙aw/-Ɨ"έXIJB4ɑxJȫv.%NfcЍ\wYyMf:Z!$ HYGؿ@pQ*?!//NlzgsAa,nT(R6n ur=G>m-kv et~BuWl ;8~q8,ʵ'1eѝ9b.338UD.kqpͦMÁF+ɺIAc8X$vo_u'vPnB7,K=@ă~ j f4>.~CCH-sGj:J23 ehNJ :R(Yur ܅^^ *ʲ)VL[h(Gϙ l1L%F̆5o+67?spK-r!&˴z d>aX{8L- ,$Ѡ&D~ɠÅ.%KROI=I҆q%Ln&b~\VU$`kf#8 %m9yWbp.-g;fOnkOr[tH>,s ~A ƠhU^z6ew\gR &srQ6. }oM o"h/9!{i쬜xW6EβsO.f[) 264`lVqVW;j/2QtV]V?Kdz9P^GPԛ滂n}GU^ 8RѥLCY4*}9rݛߩ8}nڵ dC7Ɉdy %uM<9񩓁ߜh&F30 2ľ@hT^I)~~C ѓ#mLBaʝ4uSln>oiC(A_Cf!}Ƈ`ւ# 6yH0\ ?{N5IUEġv1^l@[?+Nl_,j6Q]n'f\4,Vd;D 3`o _5nYAop߂?Z?e ˿]?|F~>\PҨ7K)WRѴ0!ޢ>lxB"7/H[۞~dpBY2xRϖD?ⲼJW_0NMyķ6"[:tI^ roJb!:?`~Wf,d>M̛;8`ݬ)(T}2G~dl> stream xڍwuT.%%H-!Jw,"²t* ݂4\ۿ{g<3̼390 d0y[!VֿZrqօ\@rLl@p 0/[r*m~~h=`z9]A8o&// l Xl?A-<K aϬ{/[S慾*M햑8D|<^>a翙_j_!Pmq@ק>hEb\< `wni>u ? Zzx8?\oAa+Z"=0v x4krn.x` aZ!/o$* Dܖ_p |Hp; aBnC! Cf?ct(7a߯/d9;l(p ]Cu[)V،tV >_}+Wf)ab$-9G^;m)ClHjIr8lN>`-9/\}4F&"$T"S.=>Ѭ]j0Ja2kOp{B|'.D|0θ.Ov1ПyP#Xy'uǃLO>/j0j(6ڜI*ViM9sUIU\&*H] D=8EǝGV>dfN{+3};Ckrs O Jm <߼]H\C%C,;%x$Qkt?zE$lzG\*Fy qTW-FypFaxX{Dнo%]\43~XK ~iFKj>{;yOt:ܔ.&^yLݠ44aNJ?ZZ"S  o~#UX>p6E]Z,Î=ɮ&Mu!" /eZ/ft(př&\_?8" $GHuI"&5Dy(v{BX1RFµ*(zy ȵ+T)h"NF'rCM]aU0fs (ġtCк+euxz惑X8`֧ kQtalLf l:uFw9KM>1\pJHˣ1ve əu($ԮV8R$7;_ mbqkT[OԿd.c7AWKZQ6<;NYyXߝ ߆lQgs&zrוjA'! jԹĆ+ eVU KxOsJM@yZTS$5)kxr ڌ6G{S%~sĎ[2x?F}6᎜m=[Ga B~`WFJ tJ^ ͒1}$6ٻWK2^lm2N~|"Bx ۜ:' ^|y%4QQ{/Y-VR~1V1s"|\yIZ D녖uc06m䋎~{3>(çMIOKjxMlB{fE,SQ(3]?Y^eDD"-H4ul[fPnHF͈UJ>[ڷz_)座SE6Xvgs&bcje>_3jjXP캏4 nE:!TCQiC}^;9 :ULZ-,sz&|A\6\BXQdGt,qė=[ukܼh59oii8tny/DnAﱘѧ 2 چss䲊gqM6ѫ !}gE $cRwن˔gZ?C7vW k?}U2˔c#HUr2c5f$V[uHZmZi{y|G!,NB&ZbFGunM*z މxƈl^JcQagb͑[ -Қ7s.>q`ҽ܂?pti[/.:MM4p7ޙE)d~&M? sSJ'6*Ν](>5hVƿ?~9W5ݾJmkUnFq^"vY4ZسX~$rfB;n8ǰI\Cهl\[ሽ9bI^ٸNpD*V2YDž___52g ދ F'4V>Nwj,KQm)fBsIcN-l͛4n]q[Doi4zG!%y{)WCbqiXeo8=ŪnpOmrn^DEr.;b-ٗ#eRϗ?p˻`t ̰`ᅳNǥ+˖ ȮW#_b 6=$) :]mmM;] -ڛTܡ}E>s‰R#gC>ogx(,O9[_na\ N*p~x2W4kMg^ZjI*w/lX=v//!Y3)=Sl mʙteAú'FVUjYVfDNq\0";F/m u(]Rn*b0)g=c 3FƈU{Y\.Is]lEO{)Rw>56IDO L<"{0j֥+_۟YMbTH:u?1~aZ`dFU ʎb19-ox^u=y3;T?8i'"9Бdj<᩻>CwiE8΁ޡ>9G+L"gYt{MX5FNd%Ɏ6_84GڔEhƍ!JM#j0zTʗuEऑe ו>JRe1c?7B!ab'C9fC|NQT$ Fe#gYעї;zܨ3:S/қ7$?-`+%tvUַr5eGou_yV>12| ~~9Pm#&Ssl@VNV2Rڏ̟K;XmUl3JgTb|H:4Ip.E2_bqGJI Kix"ccBqSzk؜q\ط!•$P=&e_Ɓ5A/H=oDRx'|Gt}m|m"MX[&3ɵ$*@VO"F|5!\/9mʹ;ci+,-(2 ¬k]QJDe;fi\9U# Ǐ@BpǑ=|L_VOgi92k^1 }L_+[:G3 '5k' g|Nwli @i'I#?7}{|vljhPv^QSV~Qٻ.=*q ߕUӹ;Z%EMҖڟA;O:#C^ħOPnxpc @g%~p9\\aK !={\ڮLH4ݜ׬Iܰ (CsZhC}[펋÷4saLY N?:/`}G> Vrɘdg&4lQ& d! PM1H =~wAIcwAݳZlf$^uW>Fk d!tkM پm +!/."',%UIT"]F4D-jS_Ʊ$Rb$ jz ,H k{4<1Vqhf"?^_BmOuNh29;6|,6deN{r|q"}b=ɹs>4SksbDa] ;=uPEnϪY1u欗?W$y6"|-JU`63/Y@ :hH <6Aަ{O,}B) _vx;?2Rhyʥy>NMnz"^ZQ+Re,Gb}EM{̌I1 PաXmT##Z7/j$'ɹ跑0{&}/ϧ:A5^?:7 $_]t&ܖj}`JCR;rBk2 |jbY{R]r.{![]o=ZHmK.>jow EI&jҷKnsioww"Οn+(|>q|%@mrQ 2<[RR*:5ۙnׁŊchczWda;82pG1JU|Α:xShIJXf)xk%``ZZ"/~#3|8)_dy%m ;@%/U{:"&fV7E[SiW,.Ct40r4F dž'bL/弩rǔK8??" endstream endobj 3971 0 obj << /Length1 1834 /Length2 8153 /Length3 0 /Length 9266 /Filter /FlateDecode >> stream xڍTT6N#]HХ4tK3C0twttK ( -H|k}ߚΜyv{¨#k+ /@^] //¢A8ƱY p7 *< Ba ĝ: x "@Q ~~?߂0@à`7ly7bg-ݚu! (@;y9ta0?&إ >>OOO^/ n Atn`3e;5^l=/Bf; b ݩCmpw@ KX/nyKdm svA!P;- TREx! OAN8~(j@wqAA~6+Bma`( g| 8n߽~ @mla§U~Abv`@_\@TDv~:v"?}]`.ۻ4[ @]a5`@~mZߵϝ]N*1Y-e5M)C<Bq~PHX **Z 0nwk=h `M.)?_#Rrwrų%A'w 편u݈@WDm ˪ @wC" sg#!nJ/amW];N(X yxݍݹvW_nRj 9~"ƾ+J SׯBa;]z[gM|.w l1Vq?Ŀ]8BZB u'*aK?qIQlU?EpWX?=);;z @\@셸k7ȯwa#~_G3ƞYK94u}{e0w3.'d~.6GILfw3#Ef'8%{MtXtGcy2gO=<^ŕG|cֿ>$R1-X[j?,f1ɔ!c&*cծl~,'6w둪~Z-6ɻY"[~SABu~đ-tzg@HBdɜ$٤gȺ%B r ,@"gL uF% A"Kwb"ٴ L;> 4}3嚒CMVYԀ{ mh٣Ʃ&pd+QęfmzmOWpr Goзh_|t&^n 38>7U˜9Qx^Y}?>faTL0lpaCn kzz t*j+f^ӹw'ղH=p26hkk-QL,$ʚ9Nj4#T|{/F}IFZq=i\eP,qv%+\vl?i7# 6׫̟T[7*W۩AOzt}L ٺ`/rRkeв^,p(qFI!f7ڍWQTE2gMQJޯ2J;DM* )Ztn({:+V1rlypYu~dwa9P;olFw?-/@ | AtNۏ*l~[({p'K݉X(;NUȳk׾~#e Z!K׃)/ h;U{v)mu>\1{h\zF)6A#VqSR GfaDj]DvP~#[Gy:LR%/e^V@cn=#/㋛4K vk!S#(?|gIN^DQBf,K`q 筛(ḻFZb09[Qbӱ/ ʑO <>Ian:HFB; ^dB$n}d藽UO{ C؉^qO+[>~Aʔ5ʸe)ΉRq{9$.c +ˢzelLo`[4xJFKɭ*{]M[o6Zs u!s0A;'Jw `w:r)(W}-e-ڶJf=7u8rfG/ gWX¾Qqo3!H]U%X0BǾ׍ aP0]n: ~XHNL~< >TTQSG;aF$jCYOe›0 "zDdFDm畼lyyilfTOe4IkNLr<2TfŽL lL07. ~/MJ8V. pc :@+X"0`Ex{ykgH >n] +g։3ŕrjWZLZ¥h7(!i@:I)7.``q^ǝ Ȼ: o$kP lQXbv4nJwN*ՌʎHѾH@׭XO*ZKh` yQm%Qy!, }?3n?#hohgiA[ڱt̏R&tm[(fB<*3F$%6h|uDyq*m3ēd(-P&SfethHq_n.Yw}D;nl}S.kMR}2D} Uw!(,^prSxZ;Y(R]z1Ls9;x&끙(1gN A9$1p)v,-+bZȦ;c9,D'6a"STO#> U<~o-g7R_l62bRK9 `o9ak6;Y+*}_m8Cj4jhL&}7T"ˀ̫7d0\MHG`H1fB MfQW"-Fu<;f &U&}-e^Z;cӷ[TsɺO-Cהu, βMUu,/;rUP9.:ihaG'= ؛ڎ$!))ݲxĻoe@13^5$ye nDbwXЬ3/xF=;쪋;kk./Q/ zɫx9$BRώ+:b`˳5f-ziKhnOH}XRGR ZNVgͳ6kdfnP;ĭe@qx`TuAl55]| m5{LAJbRKf+u|feˬj6Z5*E&5S;"oxAb:isK!>Z? ePc^-YS(aVr=Y3ߓ67P=%?!l^ul5)UN /;\o9-k; km?=s\faw%W馭;o?<"}Nc&iwwRkc2hDgH17㛂i=flK' Ϲ`oǂ,q;%]i5iis@kw[)n1ͽ=J)xK }&y0:a1 WB;5yA+V=9fn~jƒڒAQvh%Mhw1OL,\# z{~^y 3ǟ7P( ]1OS3FǎbRfoGo1тb0"*6fLbKי֭J>tE^8gZzQ}# Ip5@sP0TW}.FMl>)̵#]t NF=;9d#ُmh`]-GtZ wZr5rW˲ѐtM$kf iӉ l<$rn(#'{i&TiQgY&wM:KljCg!ҝ҆joT$VoTN"~YoCی(hƚك_X= ʙg`<=#PD4>fhGP6~C%z.hK4AXc@ 81ifXuY&"l>=7"*ԥCK!grp#'o^<|y-0odCfwÍ&YKn%`yُO>t+q}|w FVXfS.lTRG{H W"[^[k,mu'-Wo>TԵjkxd|i. 1=JeVzD m|R^#s=ys:1~+I̿:D=p'3jnfp/LZ\t+Ry43t2ߙ &X#QWQ2yhşi I*L|>1TF PgSs;eLsC~1.t6g'B{6gq/zӑM5 i,Wxow)ǝ;q#*>5aHx}|ܱ.{a~yT߉x"rqTҴ)ف6AѰD6ģ56AԐ9E|Cc-{M=WڶsJ'~RQ3%};&9e.-n\%{i Pr%:>ee|;jA~zf(;N\1[dT-V_ YdyzsǣzYj} ĸFOQM7>DZ:3lNN+ny*8A}3~o>+!9lp3Rt8rI^% n ^=ܱ$RzTw[UIc]>O[n2Y)|U\:?K s=l)~b͚Ɵ=1uVD?QCGãJ vU$> 4[E[%N;JV%44TTY kΥB۳ D5., 7`Kf qDfZXYUw \m)?04L*(xpߋwBSi6ɂU n-NBf'˓)6/;lu6!EX;Z {kc;YQRtf8Ͼ*<MVٖVzUyk$ݬVuLG QB8Qx|6IEAPJ+Q3AVtq]oJMk8qʙ 9!: _ P P/cT`r[X|OD4#L<*K;yBE 8NXy:*Ƙ^6VkvZ%iOmܣx%K =xwjM657$81J+w7 #vTR$wQr\1M[U:j!_2JZ.M gDzd@"MS"v:=JQEfo Yz̨kQ_n6$›GS|*$)@(gK~t;$21BMj_d:Ĩ}ֹlHu?H+Y懻5O2ڣ!ai\k9q>[*/˃g}*iqQ޼kTuՖ"XMΒ)ܽvh[ݔyM}KuHM~#rHJ[/U֗K}" 9^ ʴFupN*A KSg*^]Ijޮ9.K,>W?daО~bAn)}bٔS<6vUD(%XP2z\ͻL{W;AA&Mm+<\Kg\>>n $^0ʁ<&zNּXvme4X+ye>y.ϑ;;vU}g4x@-ӧeu"=cW3}\3޷={318h\Y0bt=>,m/ɒlGJ^NPApZky{6Yx0׸s93H!),hrFc k x2rQUzӦ𨳮-%c BDbU:7+kl|O=f?: ak8Dާf>W j x:7*㚓]{dD֔?EƉVS;u,:nXZw]R}5vn̛%mLȁüiS"mD{9prLʎWNw+I/axCn$s)d5AH+BW58|5jYsIh~s^TL jM꣒E~)N%ԯf_* |eh+cyrdߝ\?+Rd#2>Dۡ=*6^{r,Lu̠*qk+~'F-Q <+(a*gfP`dF\⛷e90o>+8=ENs7÷3ջqnH3nW1`9Cc.!/}ۊ^$x^*s4Ht3 endstream endobj 3973 0 obj << /Length1 1593 /Length2 3638 /Length3 0 /Length 4643 /Filter /FlateDecode >> stream xڍT 8&KZOl0ƒdYƒDҘa3d Q"EDeȾD"K"kK&h}ﻮf>><E# ۷ 3?nzZ_WϿ$^UFVN@ g<_$@GS~. F$A؟8c_lo/F ldOIKڍJ_C}I,!û۫GD@  #CXm z IC/֙PwϲD, (C&c:/ڴktGXmB?#'vsXKwi;o}^.c̐_. l |B, ]աo\vƾƈwf> -;&$U>xlWP"2Q,Gu ۙ3ʂs1X&= PmupY~$J{|݌|!&d" ;׳<<ɣ*y-mEPya^0wBOxԼyo=b3y3$ WzM0^lDsAXmE2='tAw`8.*gftM]{w]ll&\o,YzPQr[/e\Li\f^Wo+8j5o@jr%݄Wʰig]IDU }Ngɇ5I_P뎤T|2 ԵZC#bL_NCpm&ir{c9}ZFb0I<;sڢ25ak#' ѣ̹)Fͅ+xS؅mt_3jp8_ Vw F:j~~ې}&6NBIk@1WzZ-Mè@ŁD O ޥ8!wg޵nZӝ+WߍhΆa6vvX~}{qvMh#MZSwbbn&GcZq ţNi "|/l(m|$ŨQV,.aQU;=6L ir` v:0X_ڰSim31rE#+j /3'/Dk%-_$xIƛZVFFSH96Jh^мxE<4bp玽m%1cȞ}n,blԱ63:v-ŹkJ Cv\%qoPWz ϫ0^ =`2YٞT%1"gE|OQaW _ܟ7:8?y)5߲u|O^]9k';8n?G!/3Ɲ`15?;;gTA!B4osن̡@;GIՌD aq離{FQ9 TNVHhr,n0.3~0=?j"x)?ȕVz؅0E'sFȩPu >v몣|kQjuSDlw9><¹%(礶\g7Ͼ:ʖq9HbfnEZ Q۲o.v,kTy(|>ɑ{8С^951[c5):M|F-Z ~gih?"ӧ3o[Ȣ|[I/&W:ϢjəQmsYɟcLN9<>U|D5r>pWzQ"_~sƫηuJc_j#UWMibGxq{X}첵!)| 1V3qǠuPQ(;~){ґZ3O)$ endstream endobj 3975 0 obj << /Length1 1937 /Length2 13023 /Length3 0 /Length 14229 /Filter /FlateDecode >> stream xڍP\= и;mqhq. n=Hp $Hp pr5͹V/*2U &1s)HabcfH()ɱXY9YYّ4!vȑA.`YH8W$jvȻ8ll<vVV@7ks3@rA;z:[[ZA^@kF`a fr6:+kF3@lf xOZA+đݝh vc[C e275fd*_   @.. gkv"@_`cfod3 ltvXXہ*Ҋ#`!tZM_ ,S_bmG?¼Y\lor Q3,?殎,ZN 9ɿm^E,A+//yY@+_oG#t ή _+!̭ S?_ ;[{Y_Ǐ Wfv#fSPVPg`7; y8)UZ]ݿ"9XkѠ{oB: ?ojy t7D[ݟzڿ @{k;Ͽ-^Jq:6Z dnjr뒈9X:'3+_rkik5ai氳v]zپ\\^/u!j[dȯ#lks,`ȫ /AssX, +E`FQXx_TAl;ESuXvV$֦ ?.>]_&-e1| i/Z+]W4_DՂ)u*__sFpX>?.A!@`5 p|en2|'3suv~? !//m;jňܙtٙ!Rۉ9+ ؤlzŝr7/wH=9oH,IM^n'y߾'_h*N_<Jً$bn9ACS߿N[&#ҩ[[OwuH>Mwh4Lr{Ḓ᱑5⾨ysP{INynǙަ28twVdždɽ&V1~t}zAgfԬ6Pe74np^O:gtyX*,\-E4*r07 Dq2.+yWG lBfp*kMuD#Nr~`O z;vO=.S;݅+DEeKFe+n hF?)jȱEU&ᬚϸlX{2 S\WD[C`Dd ?*$:kBQg+NY^=mB-Kb5u 5l}ӷ%:ME=MrON Kד*w7}NJ(=hʾq}i v ]ˎpNj 3v֕Sei62A Ƚ9J,ZbQ[p'FDw eizX5MMW lS}QXѕcDN=W Pt6a^珝h!GoA 1GG3su -\hc~dYj7Mj\7~,S\?o Ty~S,2h)$4 SPf} mE8kh6|u NAŜE.YtDd3bZes{j>m>~GL>  >P:k0‰ʼn!\.nz(itœic<@%{_j.QdZI]ƨ=tG“#x=}d# цadҬKV|QI;Yi وh U{-sj.ׯnza9 #+ۯb0dA n[Ii~$T^;1 1]·ycXˌĶhT x sCQrG,=iP:"@1$bc]65p!~e!{z-Ly ZrgLf ZK)r&ʧAe^]{qpG[QY"]6erg\Y ]LR|2ۓh86Ki럘l;;rRm;HE7h{?b#2R%abzc?WG%=ڋy-_Ȇ5V ?Xy@B?Ik^m@Wlv~dۆԇ8g*n"f=hJG*ޡC~Huنuuܖ.sd/Y#{ d=@5h`5RS Qf40;pR? t?>;RaK1)>'JCm(‫lYgQRyؒ=Id0b8# ڸЀQmMV5\ѻ;PDc|Q65;Ҹk_)gAꫵ.ɍEKfl:}?İMX>0ӳ(Fj~']c¬tX.//A`vgw"?k-IL+_hӁq /'Ť]6T%X@ĽY7 Rg>SUTts븭Fc\9U JHW dҳmTgۄ<۠@!V5IJΎ(_Y:@T1 fASCCHw%$5C4õ[=[⧂G֨1*0ό"U8kоThM{2іsC1-p%`Euba^vixSN!ӯ&m)/S~VQ\$N` D/ivQV2&on$E-#FZ85Ng;p/n=Q6XP1"ykbs-\e.݆D!]"v=fػPŷWd #&[ !p`hJړ#˞&L28k*'8nrfg1 VTP//fD\dsYS"6ܕD@trKgtT+d)q^.rp cl_6&2-~^\1>e} wÈ35Y)R`Vg3TTц(nsqumg'Ԅ֚*Eo= 7 \؝OErn581C{ĕ*cnwo oyYI &:4{}OO )Њ`3jӐ%>yinĿ#i U=ژ9vWM4Ą̈ LD1o0eqS6IݟeޭSɣu]{t\%gKgrDQ8XasA&*uvH{,)(`S;0,wK\м(h*41i6>}9t}DxvA-кsInS-zO2(G H#[/ tܷX&5^H_D.# (ّ(Y<9i}t k6wߊT%i ]PߣIٖ:1\N'D;&F{N/7t(.)hkQTnG8JwIa$W ]F&ҩ{m$ x q0XQ K-@5}kÓ/F m= (wTXo|{cEE&<Ε&sS i͙؀Qpa]%k&ˏ$IU eN})_)G۶yW>(t/WD𸾌ɳnZ"tgEYOE)牕7ec%AdjR)l{FAeq(ԶP pA%@pxmH MS 3eʬybh8;RSF^N 6Gÿå<_|'@A(ԱLum:}ÔN A yE- $a>1̪텊N2@4`0Ђĭf#+"cO#*~앧drN1Ei%ǝKd t11h:sR{v} dMAfQ)jg|Iw!~QD [ׇTk |ը wq :H0gJCxxtfdϑP+"=D&OGx٭/oIZ[Jļ @fXYZj']ݡ*fo?ғI]16cyF*+a0ǨqJۘEXיhHB843JMQ!-M*?~W[*6,Jt'ƭu:.`:{~/hº(wq Ӭ v^9PLыHX~.jR4V@B}fpdQKdnw^ݔjq~ ɍ30.I%|Xםk||6D@ɂ!_-ҺD2|ݗULa8yH5pI=V~i;WUY3kjB ɯ45CI\) FAJ5pbD.zIui2~o;G+0P\ClEm ' ȞNH͔4c܇d:[SRoθ4(bVnQ\oU!4{mod N5uS&>*~>r}l|Ҋ$"by4)d=s!d;^h|f:(¢EUS~%Nǩi%-y|q# 7JɢӁ ̴k_܃܂GWi)_RSr!4nм.cT7f'x.\@1خ}ᓯ]@E57t]xw[unC@ޞE|/w'L3 k1~.C}Z]@Bq3=`\*5BDo|?lɪXNj r5@g"ҽ7HkMצ%G8-u_U(AoغTE-\|!?Nԕvñ DI~΅JjC %gnӽ @4"5`p/³p] 4&̧E%GN8 q0Gmh&:oyaEڊbO=a9a܆ [̀ҡ}K JӉN[J=&Mx[\%cӣFAxuX_6~&$dș+ZVfsNvke>k$L / T8~tMZv#pޭFf?~-NS%Xbj?謺g*wD8DMHC'](\RdNnK(#$dau.M+k f3wLaYե!'SQ7\}T\iXdQ$o-}^erξ@KL͗uʦX&ATIK>Rq _A2D5mI֙z` /SC&m?F௅ ~coB*~ RAH7[5}h  yR0=[~}eaYK=}ZFV_R$o(Ù}Pt+yUI[UeRޛoxh!Fv]>׉{bЌ%caK, l3Wie3 ]q%^-Q@##FY^>R>|[ 1Fɰ,t)gi`DʚYЄ}r ڒ٥wՔ굣wUF ?ϵtlUM. }߃Ba -xXcɧ3u#ԳDϛ6MXIt[׸)P6A/.܎*L|Mm\R нX ?q&<=椾-kV2!R-]dfV 7iRqB`Nk2P #˧i" I,{7q]r5ʛ,PeBN71Bӎ3C FlUFlx|Nٖ]O0HwM2i( =n&Qe$b[.4,m2:!d?hOb!,Y0aC|.=mNCDgc ABӶ}<@a3cҼ`ڻ% c.٥9ɖŋHdۏ~xFPd(m[w4+5|zSI2kl.͝| TG{i?Ya5vmp֌G8ƕ8*L囓O| o8'vr;߻VT,ez JƤ} V)v]y}Ld Ѧ[ |'pJ yA| q(gŅy߾)`%`yZ3S(M_]g?u#bsZ5:ŚGxah1|lp=t[ sg*ݴy@iKcSda`᜔֢HR>VhCʯcUͺE8s iδSKEEhG%e-7%z:p|G tC #}kuUح#H 6 O~y ZɱK7zQ\5$5j( gSM_Fs92lHfEab޷іȬ4oֳLWl-̶f=_*/lf=nBDv.gF kƅv3ĤGʠ33Gt^ܘLܷ<zی˦ߍX;>Mu-Z-0({f\!T¦PW,{}Ι_9+pB ,4iqdՖ]c_kf.#V "5'7j|19uT֖ٗ%$FNxqM nQJܱBRGksNI^'mep}+p;aXAy<"=#&Lw B$ǫd'DmIsrWk hY~,T2=gd40F\B4E,Pۻg|98S~@Ǣh B1*wuĹAD>__/ͽ&€Lq-y`̬Hû|>d&fNʎ=Y ~>KJ[tBT_OI*70g@}4PZN*VG2;`H643`&R ǏLG&^9PKo/|7oxFL>w weYEILF?C<ɫK\bό:T@!ԏ9% @pQRQe@(j~:NȢoW?;u+Yi - ]|mGڵ4VU?o GWrtW fPzþqۤWk]$7Гk=Im0rcY?_yu4R\ `1L|*<5Xž`ǡv*6C࿜3yW Zcq3-]eHlPS0q@c=0OVHۘ$WY3?Lva`zIX@ZHqdٖIo/FάWOQ^,؊Wm1+lA~QHZs2ecSe>xsu/4΂E›W?7."=e(ӏ ?ӚLap^T;,d^5Ŀ|Kl+X:"LL;mfZ= P:]@K4zU=ܠ3֣wMO^3 &n[m7(^̂oP[%f PΤgwIq~a5vmꇔq3Y]\.FiEFHӅhU,(zسÖV#8 Co.0 >]R&x-ȘS"lT$+94x=)D&ѴҦ-= ׀ ˗)1v_Ch;ʀuSvan-.=<:k]*<"*?6XYṲW[EԦu¡Jģ`8s] re_.4r~XG|JbDGd楎s9%h;|kPU>@7p"_Xq$W [p xK vWLU'EV!XEQky&tEpR(U .SDUj|J^%M1D}c:RMU#hLP?8%hi+uW:BnOYew^\6+]ڌZfqT/)sYOx/VF CU= Ouz2cXH7T{ܞSCtۏkEk/Wku#~L9Oo6B9z#5s-B1μE 5#纠y ek%fZ>#/V{mB adU ]GS|ΗAY%bthVjhD1F_4CoTe8%+ ,t}&T쩎XG2!h84,zfNd|Jt{!UR8FPBhA>l ݺ;53X8k;A폆EJ/*;ɪB&WB]=_6\NEi"ldžtDðw-V(x55- v5@K/ ]r.u~:x5ȈGPa9: L|ɗz5'ƽ[YL^gӫ!ȇڋsa_@Z[ U6@h( لH5q$!MёDK9*KE~LE iKUufO=bd_WC1\&p_hm빚wY72)0.cfs~>޾{sǠ-m,;vZ+V&_;3Ob "W[x˅%\W2,b̯F$4r-T%y؈G)jR6ޮ{.w¼]_*hZ#J}w 7|v0r{nt~r@Dhh}[RAM+Uh\>KY.ȑٮ|c=v"; O=-wk.#/MCp_jQsS^l}S t FbtŒXVdVFE?"/ifB0VDZhb7reԞcUi.PY8){u!0瘐!U #t2$J[*pC RK0\Rv%]ją_5@ijli6곴u`ݤKD4߶ EѢ[#"(^VݭS ȭuU;@̈́<&6[-fu[e^v֤+6FRp*Kzg]t+{T{\WKibn ,iF{gf)k0/~du|n~6뜩w  Xlf=Ps؇lfӐÄq`Ԡ{)425lAuM*„8" 06]q?E:p`7d|uP(p-bzn7`3A,U%2Ę(:1w!/8RvIXDV ZB 9|{}"4^Vo=13'ʀzXuJO\"5mG;ffOP嚒azl\Ҽ2Hz ES7:mfdžm|m4:_.uK7G\$Ҥt1~op\I›>O?PRسXxj퉷6wB&):B%M)_Vi%G%o)d>jCg[@MK\T$wv;ʟ73 C/Ew|BzSW54L5-ܚǥ$ Q˔G)N.5YSYfLߔ1+:{L$IXw9_m$α"4A~v#aaK .^KI+b >*WMmd$?Wm%=SMKHʼ)o6:0 ~!JB2ydd?ߍ@ ]l4@4@NA)Q9kst= u?] =RNH0fMY VWtڬi}pb"pY~4~GqVyGZ8",i> stream xڍuTl7(R RJ(atIIH %c 6bm4HHw@BJxhSAB$}}|9}uE׀Oa QA|@~A)C--5@PP_PPv'x A`xXuBꮎ0(& J@J@n0?@9"=0;([#JJ (8A00'lE0` hR '?i' p} t~Bh s 0oBBX# !p0P8C࿝5;\O??࿂A`00G@GE6?A(69ZT ,?P`$Gb{p''"ٟ cSpwߒ- nc QSUb  ,` eTc1z;#X_-CAh+- dǪ!e0 ~@NX #G< Ǩx |B@{wiuA? Q n{}#qC ?{w m?7c[+FYT\9;vЮhrh!+oWcւ\۪aDn%:P_PRy@ltah07# E`?lٰv>.(~@(" ڿP6?wRHT B"AXJ`%Q76_hl`@4PP SKA"F~񀀉'`` |+27R XG~3̘(QXڷi+|Ϛ?^a~)Yeݎ7' cqr8dDr6v}WwNĻߣ*VWinm,м x{Q`g"zDs?{)&hyDvL)q{Bo yu}P4tA<ҋ"4 okUʇw rYi%4ј_gD@㉷hn䥭Bɧ¢AٟY{̪6PLX_v>ę-+>{^ >5ؔ82FEyҠ L.8Hi 2LKUILR7l^Sx ptM&3Zwy.5X*ބL HHL^܍ee$Fц_<wqCR\_^3]"]Xs3kus l{D#BmjeCVm?MF0e"F̽Qѕ{bw\֞)qI0>Y5HTD:<,Ty<rzgȤ{Χh!G^TəOLs-7;UU-Ě>QlNG(\(6"􋪸bPhأPK1Hɷ<{| W׹^ Rô(MG<[ IeФXXguMM ȇуs JXЖaۗ 'IؑM*0@䮺Dm8q_yWgF5Hpaxr ,^R*HekMӫnM): d"lh *td:!~,i;;3S#Ips)L7ʹM5qU 7?!(e &>98j>5[0vNA3_Yu0tW~x5`VtK%ͦ8#`xJ!zP8,Zi=hzt_7૨3Nܻ!3sK(? qE--ޞwURSPb|۾uB $ίOߊTBzGәfRBk4t~s>7HZw-&HaWJbv3&MiBFCNLlNW6Dz:`uhI]Փguu'TD6K90n1'uV0hzQ%q_{nֹQ-C9Wy0ޑ2gQeiٌ)&[뷅o߱b7):U& owe@qus5J,3'BeJa7cO$>U=;gm6ٴ!zJKwR>5Dph-[:Zks`Z.}y9V'ɺVwEO}/fyxb(+DA="{CSRtƝ*.UFߍ;ov.ʍ 3jNz>&C _S-*Mi6AL-{դ+M S'QjUΕiƞ<%:z\k8دsY߱bT4J9_ !k3 23u)YҔ5gF&i|缭Gn' ݕ-lIO_PgQP1q5ث zcD~TprAq;\'Xon/\ZK=;Ӳ@$~kW4rpmn@ғZBn0W̏K\yHxǒ=,w,L{czU|UVR!K֘oo|puIM, +VwfUHhXv*?Z.G0YDav?`~/T[kû3ZauDi}Q =>.L_=\kA6"^\]vM2luoԱ}_3!ГjwkHA;kwI-(:knC9SFRCuiIƘH]xW(P;OjUunӕemfb{ lseUJ^W~=;'{1@w퇈o.qBGqN-OYb$&O3i ~g ~u0_ah]Д 6VjoDž*vwt{\^JS9k?sj~"K#'>0LoAazIUD'jlP-tm >K Z[hd9UYV:\ȇXu6  mP K}N܆hlK;7<>3f;H J E"a! x]]wۆ iPn!/?>6Yf?9),w!G/`F&>_aȇKr۽Se6LyArOޑ_e_gml8 hUxȂ'9űT\Fat;r}jCJJvasNdOnEjA}ы?&KP( {Ԋ*ׇ>nN5Ͱ#Mwz#V5QH2_+>#GًB7N&NŪ jdTu'(2P%܉D>6 } : y]D[y汘z '`` n~ZYQԽ-~JXߪ˥ nv?fB j5^6<~P׫g{,Fʞ`@ [k(0?Y˙4l:{ ̤t^ ^.n0v-!lShpV՗M!AZퟨm=?R,,%TXx)`ƚdgJ.X:IIȷ gCK^r<%AK-m;+ƿ4h֊6^46S_d|эyԃr3T:8>^/5Γvؓ &1ݒK"dsN6tϦ#&ޒ"Xg ƨf%}N+AեY{apJ.&&'"ɈortY!Yoj&3^QkZ=>Ȋ2`J0XrҨ{  d ).3b8JێȢ/bI6%S7FJ'UT+j;|*2eT\KpV-JnYoo{CxJBQty(aсttPe9'4j[JHڇvk^vؚ4b,V)z{)uB8%IrfUf-uϳ]mWxR9nVqLᰂ#ea lơLj={V!Sbg=Ծᑒz(zIsUa&FO4HeЮ*-ߪ?J%П[meGk[ӷl-؍ر,:&+*yϟJ:ڊ6K~"ux}ZcIZDoh8Q|P5jmOi*ג5(`6ۖC|o;קJ$>~$  t$Aia7RH޹MwPrMNܶ=ӚyLDr+̜8Ip_ޤ4&}+Y5]щ~nџ4_nO<;¸3ޝ0訃*'| јV!4y܏k;es'맕 }TkG~a eQ,5C>u˺UAS&g &/*OV^|[ %Y^6(F 7o`=2?\*[ |ƿxawzeYߧ$4_wƘn.=\3(Jʸ}AX/>QlQvFrҠ֛p>ڐӖ4u`HMdMlv{+t.QFCPtn|?"YAzX@CĐC1MƏsl4/q}Nkߕ>(^`l:’֕x3 hv$mܗ\D.L%mA|%opҪ)em8/w>+>Kr~1V!!];_b(dsBЧtoFNǒȘ5+K8G3i(ؑ2+V?k+c.BpTWg7ΣocƓ|Ħ'?۬ B:gk[Y)s :Vvw(RK )T7d9K@i5-!xd> stream xڍuTk.)]J / ]Cwww 0(H ҝ"-4!)ݡtuΚf޻빯&z}.Y; D CpryMMUAp '_n\&#;_ n0S#ypBbb wP;@P Lpo7#9GՖ ]:Cܠ` F8BmN> Ax#" vv熻9Hq^P#qyB_-32n\&ǯGx ܑ0;j.؟d? _wr_տAapg0 sN@[I avNpd= u ~ (`$ۺA]P_y~A޲"N !qOE^7ϟ>`P/v.<0DU DE@yDs'~yUUuU8 OLNAH wꀡ OCU=qxE ֿ${e-@ [~x} %'a# v:y) M8RN5&QU)Y\ ?~)NuCwAt_od_1l *ȍ ݑD^/ٿϡR#vs{" _^l OZ0W[[77l@x)wzn+:Y,~ `6SqR~v֌[^%ǟ\^O]8SpI=AK=}0AԀk*G+V։CMGΡSȏ}*ً􍒰Z+di?5h1XIɒ9>x9"2M+A]9nWbwo,IMks5ϠՃaE XFyW9Şw}mlu.Uk9m[ҳv)PNzכ$3X#b,6Ow4~xR@dM홮7^뷑U1ܓɣ=Fscw"CBꃴoXH^ּ/?~F5\6S:t`,lS2)_|rw+&Eaר)nl_//F\,߁|~^պX8sz/X f+#"ZQǽQ#k:٦oEU-R(a3 6>?f+mPwYV֏,sָPCEȧ#sM?euN좤ωOr)1̙]A2M*V*u+GkO&𥳐]v 1PzI<{0(&Y$s #/˹gRLaCSKRtjV]Q)V.#׸ћA\rq1Db_w&+zj4pq- NO|_.yS]J1gk@^AE[93sZZ2TclbxO%7bu'˝̊_RzsjCZB jTVWrUcEVGpwb56*!"O3(^N/%\9, xȀwP%9i![Ϲ+gw㈆5kz+$6G9We'up{dsk%qsᏀ]Fv.HoTvۚS\kCobDb;ܖ$F ͺ+]I3wTiR* 봼4by=Ur)GC/xj+ϛDZc~ 5W0?k;O1V;KH- sX w]$M}Є%8M`0+\IqVc('Ooؾ8Z;X_{c |ZRlr^b|H٫ј76PUv4эioߤR=#za J }q\EJ 3 l"x/C L_)~{iMcY zC櫶Rqlw,[<NJS_&~*to$EY)*9xՔzr["^3#C< %8ll~O֨y7$ur>޹OG_c4d?xb~tgZ"cmTb~THPӠMc@SWU}AږDVhNDϽ4#G\ h~`(um~rT$h͊ukQu4ۡV ߁à@,9ħ8ĸrfg4!K#SAQAfi}]8I'mY1m9 oB:D%+|.+7|*˼M/X^tZΊS;N*fLjC,#y^n(~tvi7QIRHBLծxXslhx(Do'EZMEk;J>>8=\6~F=NvZ>sLΰ}1ڃzBqɷ0W71/cǹ$h˻]A\^W=$gPnD{|jv"^s'hk`>TnCߨQ{+v|{/#Ə2.}z#sɊINT~]C &SJȬ6㥏0E]nSyod֍̽Ϡ\hwZh HdwPM~I:<96NF4q;^-qmnh9*W~QS8 j^kG=(]xЬd  W㖶6Dθ#;pWmoLJb%si Jżhr|{ 7N_PSxu|,i|}cT.7ǿ~CFxº Az&,ÕͺpF;:nʏZu{'}i`abCleͪ. Wda~sD?H$D)n _9Q0>S$eBّf~09T^ xbcoYV۷D?`Ջa_Vҳq`<6psA?.pa(a~U~{ k2.F{Vw-a`#U$F 纘9XYĹkZڈU*]շEϦ)Ͳ&^gǿgJ ?l|ggf4Z];3e^њ>0\k)7p.E4(g/Kc'_`ѵ]ᬶ$],I ]RWr6 izK'?W*w]n^h[b޹~~ҜA*>QQ^cnE<1)A^ھ{kJ9qLkH{C%S\ eẋT `?߬1K<͉#9 ]Y)9v;|lpg>x54i㥞q;񞊎F!K[yxV]X]0zU2|8Svv=ix 2#9@$>DCE rxE:S"A $bQ 5m=PrdOw/d,ZtX49׻vv"'$8X=%y| 54M8#:p_!WgG5)"4`k+V Fvq4t 9is %*Ѩ66^;6jщ!t^*V#O$"b4>w*tA3YpQq~Rq&jdӒ m 3[& rk|33޲ቢs!JM={f,[|‰]r%U9$2d޶ ^1 $̨F|.ɌB:\7sR5WGjDCk).T?OOϝe@hJA瀥~RWQ=XYS? [IQ9!Y>3g6h L%z[PcчIб.Ǔ1>q-BMgÜCFy}2I7 pdT(׀c u),k One"xTRkMټβ:)rhU*VyBSi`XJ3-niR5QpcH%5F)s0Ŧ%}qΗHjSN2V%W㹳4Z(W,]M>#eD8[柚0Yn'%b*)&gx3:]{$ŧzWY\0i޸$Yr=$UK܁~KNqQ0Eʻr/2P 2p,1xLݔce$uȯD?TIP):f52&Vxq&\nמ(.O4>|w.@v|ubMNN}L1wV7vDcoo=ȴ1yp5 9SPxhf u9Hߏ|[k@Y/jOR' ^ޖ`F:e=IғcqaQKsR 6G( B_ Kf`x՘NfkdQSl6fX-ڌ-'Ea^6X*:*:Qw^JUjhNĵPz6θf R3BNkia g endstream endobj 3981 0 obj << /Length1 1600 /Length2 8958 /Length3 0 /Length 10006 /Filter /FlateDecode >> stream xڍP[-Cpwi[CKNp5܃. Grܙz[Y{USj0;Ll̬ %%9++3++;"5&l یH tv9#@h~I_67??++_I79@ `tApptYZ_#Ό' ftLV@Llf J Z,,&v.Ζw t: M1cFhZ\k8XMW- hjotАS8 V+woll.wB ?&ffv& {KPVd{&Ml]^ML@&nnS3Mw.KٛK8.' rݓ;{ ,@I:hك\rc\<af򻼦##d|Av1qή@_:!Af`)df_u {WXd*/s{[/_wx3عXllBU@jRtM{!iW[?n?dw]kk WʁM^CULl̬A. *lf53lA@U7k+^:\&.+3d}){3 0qv6D|+x9,+g_31X >ɿ۫6Y@. b`|?k)@N?ke@R1fί׮ yg@3ĥy3`1"w Aس;]vCԴfFVBR?u]•N=Y'-%i[h-:$QoD-4|hiKyCڕ;kJ2qOÚ\9[v1?G(S(v#ƻWo bDʻS1%9᫵WPrݎ1MeeO'f U}s >.{@i66*pU>t \{Lǹh6Il;+qm9*@kXH:{4yH5X+d ͩ.y2>˄5)^4D|G?̔ S |5 c SRZl+3ǧ Ld{a_tmnyRJkw?+P>GĹ!66wz w.կLQM-04YA[ 픭fVF<:>tcs!8X(دjB$f 򐩪cF %wJ^nVp d(y=BPGX%P탲cRSqh 7(Oи-CY3{|lѡwNW?ʇDoEz'|! ޤQ;#1r@P f>xްq]/61#}8.%a9kܩVTs\̚{ŠsJ-U|~x;'Qߙ3{LʎE mi5A,y!ÇǞ N.6|Kтt"e2V^'|,$u^,9ZX}yÐ1_[ #竝IU&bXU_uh֩j퇟JgsɁQҪܲuJdSs2wzx_9c@gi)B#xQ5f-x#btn.4ENTMQDٕ2%m(jNOSn@U[,LCwVJ}45vy558h'lRxBC46ν'>t=PHjN,JWO W6yw u+"xo}cw>s讶(F7KZ\]e"KuAߋ-ㄋc8c 1aĴ?\SCԹM ڌT'c6 k{ hݡ| 3ϩ7mg<`N&Df^y4nf! \a[4/K5Eg!>\:DyS .|8ÅQJǮ*/++=9G&rmdp{BSjgM;F5/gUnKZm@gt;௔٣VO1c*C"$USEk*[m>U / CJ0FPaŐw OIsMSvou}ݘmuD,Bb.(B6Dˆ:ALjOqS8$)Al?D@WɎUHܥ-UFʓp$ds8d :bB婅", e!NnסKޠ>tw!@R 9Hm]-i=m&dL] >R)c]È{=w'r"jLMl:P` +tBNSٻ3{yPn_ Ś1B"ffe_7,k7z(3P02pBa5j<\SӎD,toGQ ߢ+79D+~ 5cdVPT*7oˋ #=o&4~D3,r _9V=ty7Uߘz͌Hɜ+XBWېd 6!v\keW| Y_A$+^Б\]{K˦lPrцO$[ 5Ld-J`}#2UEm3PYm"HYbwFg j'CVߺH-3#9f}wH4-֙#ؚT96[K Y3ky?C67"4ǐNeD7y}ToOWH,G,z `d]]}aK 9e8UPT<>dl_hRJ)jZv # {> 5O01J&1:ʧ̀gZ%-{D4um8+7c>L2ghEh,qmJΏ?MS5IHW%e"~d*Zto=& 7 ^\<=#.\v8=)^㲄WEQ(I!=  B;DT}B`<ݔ(2[g$ c yNOF/e {?ټ=訳Rмpĉ Ŋ@tj*OnK4^Rf'P6et9oc?R(-lyVe~a=2ib2p(J[]&?y(l,%gcg)J&>ǐNbSf&(YwvqLW. Kkol_Ι"FS^KZo1Kb O\[iS4;789?o 싃?9{{Ɋr#TҀ5}{#PTNWxBk78jCl}@+}Mj?nn5ie,&#J-$C_ @;]|i-xVR΄҅BߡI9cr )VpТj'и* .ߙX5+STSRr·̶Fx5/ycdGs !wFT^&bW1}3c[nh~o:I@0te|V{4úYsV50$B- qDK̹:E4nNn~f@< b(5/p#ck~cLwRqG*x Sz3 ˩k``U wRIM dM9qs%9 C8yVy4,M&S|?N` YaH<Г$\-đ}\o'< ޗKS֤S_Ƹ,.-*H"M}\~KI{DzA} ){nZЦdsgBHjctXcEnd|:=@lPP3*V{^ofN;*'.G`SKaL}d nDY̥XO,f3zr)B7{kX0'sR"tqG)L!f%h$Jp6}x& {ox;?p!%^12FIpB9ntxP Ë sđ&R\r)Lw9ۨw$yDh؇. V=?Vi`rNJRO3,M^M(t[ jL]{Dgdg1}Rly‡K,-F7'å^M0 qQ{KMY^{rj!8KiֺK˝h+ 1* ^ y6ZȂ m.lKE.a+|ߎKx5ǯ?4G!=zT&*twe44]pKR168nֻz1[~ʛ/|AƜ>X`/SL&wp$eFeO;&{T"al-BnomF8s5dSY KGE]ATP4]^#i'/)Ѧ+  '}*ͺO**'[,#e`rsKq͞DN>%UrZ͉)E\}ÞG ,5ڝ CW?mɸb v6o?w|d8r4 f &,pﻙT(',3' Y%zdst*Ąه0&7aYl A=ab7T>[1 ZE*' h&~L혭@_*@b\h{? I–9Kj(S.+! {%N/pYb oƈ [) NL=uvjDM][Xw >= Z7): endstream endobj 3983 0 obj << /Length1 3042 /Length2 26081 /Length3 0 /Length 27746 /Filter /FlateDecode >> stream xڌP]i #5@Iܝw;dREݫޔ*ꌢNf@)'GwFV&>+ RR fG+d0u):9<V.>Vn> \6E&# Rt~hi :]mM@Ѝu'sRX;13{yy1:19Z 2lܭj@7'`ʘ)6n՝,ݽL]:ht.*+7V&sw"ǿ;98:8Z,me)&wow@S{7'ySOS{S3P_MRSPfjfcDi@]twrp:'a 4݇9:y9,m-,a̬h'dY,,,ܼ mn;3/'o3?g'g%`%' _ 1wl_@˿1h6}X,$/ 'G{ˬ$!JwĜ~,F6Noq~7Ϳ _YULm!GFYGK'5:<?+C JN -47`d1aYߤ Iy6u'$ewZ(:j^eEʺC6ڸIx-TlͭJooTqr0|3=P@t4wxl\SWWSxA P _039:@,\O,70"n+0KXAhn0KYR-2,8rDN)"9W"@\E< .*"PJW+1S{E fLh"3Wb@t^LνijRvP&Sg~l0@dM_3N"Pfv@k(/;ك/?ȃʑ T zku 揓 v54 V6m@ S7?l ;o~yۛ:dz?ATWJe _ݜ쿡kM ᜿Ý<\`Z6kgktA?[j|? h~=_"`jtYAW z4(ܠίnP2gwc;{Pl6N_(w]^yzkd{5g9܁f!? X[?-]W?hplrc !oS@sϖ^Ww1+e@r< f^tJu(/>3p/FU zgCmkCE G')Sh]y< $Ve[uMD]ڔY y;lyߒ8Nm|~n g"8BF '`;fr.<*w^_{JgUwK'c5c (s2qɠ`ϼQo&ѳ~Ų魱}].`skǣ%FKÙ+.Xn( BbH^bDecKQvlκ&J)i4v%Sƪj5pa}[n갴M&\Bҵ> jU<0xr78]$#LhJ'iȗN U>Ѯ DeXLy2 {w.Ϻ¢>Lx™!LڬaKҋُ䳳|Yʁ(w>yL'Z8TIGBºyo,6nČ*">kpD~W jwSN(ݜ3#?$uh!9^P*+AI]0#/pN :H;1 bʌEHroZbwk`]#C~EM~ΘTH8*͠UAg˨M/Ѻš^Q1ro,BG2z̗/"$+ jW0 u)V%#4v&sTҢl(g>!W`évYHKc|-lS`cҹ di(#_ 5(J|w({)U7'x`ihAdY+/2)#(^TFwGM6dæ;5e XdVWW _r'b#gC'~V`&ty'ϕ*+MS & Nƽv|2x91iAK2'~lKnתGh|U E{,]Ꮮ~\g Y.idx35&t噖qh;pL#Ĥ|'&YAbSfJUPĘߎ{8ÇœblVVn/b9[7G|j).VBNūyiq~ޮYeWP l~}Z[NExSzOm6o=RM÷[Z1b"5WǤ,9Nc}A?W JVO²C({9b'R8|ȰsI%>\VDRHš ^T%U_}yphdf) XP6TdG"Kf,)Pt&i09 ̖](U$rDiwJO81JſfW #А@9JAǓF9ţutklkA>;)"cL&k>}CR{ *ˮ1vkVD09Ls1y9tӲ>CK@h8t2N9J9-bZ,/1c7a|k,ɴMxݛB\cQ4+*$ kϐ{x C~kuCSz{?|['cK.v|USq_<,^2VbҭX}fA~˥p{ZZs9m#HL_lxxfCì DȤ4r~} `OcoUّ`6QLڴW:4=dtoʡʊS=PƻUT4\w3;u S7CY+BTAnihEin^ Yg9+uG{.rp/UF?z'LRnQϏi/mPҘml'<̾wuLg0]g{7o,zTf":dSc3Lop/?QZJ .#*v6Cݐ7Z攬YKB'2^jN]?!Eo?a5Y`?ٜ'{?cwjZgIq{6ӏ*dj/y`[s]6IfH7)(<.fU7˱IWB۽BlNT|5x$^T} 4\eT!8zsyc U(œPRHB^zH&aZk)TF TuoR~F6v;{duAOsQuFh #"0*6/{_)6SZ#e^m2,.:)teBRtK6{FJ 6Q3]4o{@8UX]jHbMpu}9qK콼p[Km,t>sJ4A%'1ek8:%aqDX3srSI`7JRp ѿmz@wRhOgɺqo+6aϩ6Xh˶]:y9& /ݚQiY-Evͯh f%<s*sMB5:r\ E.Ũ, emdh_ vGXby+g\%&x{?Tr'i2 .ca؊`z} amZTuPN *O.s[ :dxn`1_Vquv<֮u2$ŅD{z X6<70ʟkqn4J&bMy#V3GOnU14&`t(I7t \vJwx2 Orϼ@W!A:4-ryX_5\Tq[ugSNt?1XB7%8`a"A˫4wqB]!2sQ7ݰ\y/%0u -TUK\J"]H~ߒM7ikݔ5QJxj?ytΔzGhUSsiZ!JӶw>IŜ4 *Oufդá¾M2$]jKEq)mͧǛ&X#YJۑ>R2/#H׎^m5y .SÔ,R[ s >Uw$Tf¥1bG;i)\|vk,"_4s]4a$4i~ \!ݮ{̹T< -Yr*8lgg1hlrnFinߐ/a2z5=|7p׆b}(46q+uׄ0'Col6geD>[ ykRc:L~s`BQhy$NEԽZ_oP%i,sW?Z ŝ9f y-vx ~#1P34e5CqȩɜD ?gtWa-YWSbvKwh6A[]O&u]Q$o>.Xè@.DK?1`nXo՟*xU問 E֐/1աHhP߀&p y#KfʩPT*n^oMN+Wn,r==?.}&w"oʏHf"zN21=A/GүB5>,% Ȕ1wB4=vzw@W^v@O7ΩvL{),t~Uz%щBM<$Ό Ty OM&uŔ&I'?J[ǘ/ԑ<*JBg:X'm"[TFn_%%܃:]D"ݓC/ۉ .xMYI[1Zt+>P BKZa~ \9͈ĥ uLJqoD"-=-=kOqNDȖV@dK-Be6w:pXKBn?E%`H5W_ "%/J?Td$hFv#.ӭT$>$*\@ ׋jX u*{7yKaR[3E&w8f嗓 "WNe>?BgP"0'X^ׄM?Gߡ.uKAcz @j~QԭS2W)Ezl~%ή2쪎A[ THp =Y`6Yϗ:ՐHrhʈu⪈X ք`= BܳɅ.$hMۦ|F{DТ}1)z_醿}/dK>? k}׮By,׶,x]D>בGf6Ւ@~% >ddkYL-Vو1)Qgs;XfJ *gXy"P>J3wQX1:7cX2crRq`n~!0W'?:<,p I8Mԉkxgkq#0ѾǼ/eInZ MPR|MO 9Z3G-ft)tɝ"[ӱ!룏ۜJzT`I;R|TMnL{ɰR^o:çP>BUaD﵆ZiP؇ۃX7?)#y7.j[v'BAEį3mOx&2JQF27)~ν͒Hצb[P#@J,WD0/3-Nz#1nXb^Ŕ1I,[bASG RCZmfO͢岽HR ̈́CCVVJaWe^8CY")Si-$M0(/'\Q'.3dڊv>2'X.bǾx~570[]o3C'1P3H$ɕ1 AU"~$M# )7#133U6)]w$EVw5D*UB tw}iU,h4<(97+koRm5uc#dD8-qOoKNwbrvm>mo| )h$ԂLL&u86^>v,t{Hgc9$ݎt·*z=rUn8VWV m~ltQ03k:gEnbH#{ 6@g[3{6ۜ q;HQcA$,?r|Qu,ǟX@Ğ2өGw#} 9KDj1C^ ĜȀI<2RZڗ`#S :l:'(bJ?`QJJ=&ǃT;r&Ј<湺ِ[?9ﻞ`+cЗI `"d"~'DX8p1zƜp߈Wk(KJ\X5UYcV^Kg?3DQj]n>Lab[JF0&UA[rr7R;ggRgר&蕠[#pLy#7& m+DNi ɂ;> D}]Fz2T?yw.vj"!)Y!2bc>4jجE)rE_ T#NwFB|JM $= ,+,u[/):?xPA}WZb(pa酾W'.Y&g-r# | wh3I/V{?1-IuXOzhNA`d_aʛa2o -H!s(IkuLU&&VYNsȆRTȓKb)pߩ\[5# ;sv @ḄB$sthVB0͉2bAs9Ʉ#Z#)񋏯Ծ@wrR$!_5{iR&*tR璒gQ>|ՊW:'$z=wlE! mIA/v"_&~%IS;LAXj6ZÏ[!>S#Y'Mb"[2u63٩>_>w3p9n/3&Zǀw}ET GrXڀ3ώ\ -K{i'&amxΚîKԚdV_Ⓡ Y\XTܗi}Wܵ2d1 \= cW(ɡ >]q7!5B̲6yfb!3ת- Dΐ uTMw!_ͪ#\ W۴T ,1,QPӘIDF@ .vZOfTfQ1cX@t7y@`Zq4~T~ɳEJs7Mρ%L[[`X6DxFO"/.K0<뎏$MߔGX>Kc 6֝4FO A4N#=P|f&eېR-ևJG Nf|sM=htL,Y%4;UsQ,`|c93?RBr{5Du'%RHxtbde=Idk&nةA!mA^3e9\5ϑKɑ O8v݌G HR>܎Zi_L8{Ło6慡hL':D?qWET7t1pR8k6`4>#zf}1spOw] <]NjA.z_(JN 35ʮy2.-boniQsnI-g IVRMc\Йrֳ_@[{Њ7Ng!ptt#cL۝SԜqgo8ޡ!`B5(XṲyuuߜYa'IK۞h(taZE:[' ~8'^`oJǧX.j< ϴ<+M5bǎLݜgWM.2#u5)E(̑XznR;TG)tcULifpj'`{rJmYL(*|$6<ae8%L~K/[z+Y7nV =ךwF ;٘妏є}>F/0cX?(y 4l"G 5X-p9Ӟ0#QWW ]dPh1 ,ShĪw@]ߵaOẢ6AQ_CUiO0Áx5u_)<=:/nvNE<k[ Iy$S"N'mQ8ahޛ᱿q\NvI<,`ngO IL Eľ]C%M( IK5M33r0t` Xz>Q㈍Ӵ;w0U B #2*Ɲ/-Yt}J5c֡\i^>C&K^=D '`zA5>Llރw b-5TiX2.8)oOf+%q.nޑEj-$i~X#ݛ'D0:BٯuN(zD^? tg!.ƻzk:VJYP ͧUo8K;'=HM*hlb^z ڂϸ3.-kZQ*hZC(7?`~->Y}|# (즤CM$>`X,7CP*iGj w\yуmw 2Jsk{O]z'UeE.zťE{txVw#"Y-0`CM3o/&0Ɓ]wf >YTTK,~ht-.w:?ϨbR:YV, Ɵ_NV[|^{BɀLl{CѼG z #:ˢ@Sr%ڊ۾!LkHyaϛX$^.Yq_z0JxRH+ S` Æ\҃R@@ǹ[bZ7:#AoYKlX aO%rAvЛT¨η,݂V}oD-MUPxޝX,AgZ2qRjxsۏlIȈՎeSr䦜rx>{<:Tn;Yr`Ͷgb짰9oD<͖:ʘ?'LW@E _ )ӹYAO&Fyގ2}c-OyJm1]~˂mr%ꉢAtdsq-K$J3x+pP 9 ~*R_:C-t^6q|졿ۭhpY)l'<R)*Q.V6{qr[ %nRl&%ͨ?N\5OɋPYp|uwfC`nsFL/M062'K3p48x26"#0DиӍ ZI ;92Ӡ:Uj Y&e%0mV}.DPeHB;npkć= { #~0}i)'\$7\@ _ϲnӸ5Q?Y-Oce%2 9iyOX`Qvp`ќMJ{3x'؀eѺ=F+(?k&|{)$޺I{Spp=^ۢL#H)Ld=Tw$ 1׳=;b<'S=) U󆥮}C%scSfg40a*6SwwR`o”zVU{>L ps!<ףF9g͐@?BhR Ї ntbBmG ꮠlH#E܁TXP0l3slɎj??haO*k"~<7Z1/0 ;n)Ogv猁^}iŞՇi <&NF߭\AL*lUܷ)@\7*I+鹻Ĩ4]cAw0<.d<sa䕩b;iZേ6甩|#F|[^{oيHm*ցsZk*= : ajhtRL75ʌ0/w5ZЉմ?~ͨa9:y.Pct/BX,&- VHuuUp*fW_Qt}'d:o9ʤQKvR'qe}^˹'Zw9CBQߩƧPA /sf d".a^Y%,vU?>[MA O)0jU? $\E'F8)wAr`mF7QvpY^吋pM U!VU6LBe¦$U$dڻOD Ѥ+-PX h' Ȱt r4oFI_:T)Q5,)ꅵƚ7ӌsd4u9Cum '6ԙϔwo{7w++a1zWٍdt ' oJz3il> 1¬E:&kuh㉲x1J;!We ~迋('N:UmPR,& UR|._kL YRtMn}D/鐏m:iEl_[7SYӃ,8zyalЊ9E!ѧShOmӋMҨˌDM8+ )W~,89"*Jp넏{LQ}ee7'{#ˤ&n,EdS.h9ҵʀHǎ5+0PM0I>Nә ?ѹR/%Y\n_ kM &r"%H%ds 픛9ID1I~`֙DBVl{1mvΓPU!r7Wc:̣D3t@.z >ҼAU/VY Gɦ| cbDaD`I܅-9$X='泂j]_Nݫ\K.vF[ߦOGy4~Ii ȖR-mژ7NjGm(G {EgwF5opj28wVJp˜Tlde0#GvpN?v/\҆s ? ~tװB>/hIpL܊@)aջpۧ;:dR4F Xتn`; (.U_U ZC Fl:7MߠTQF30Khg6qc:Rg3#E h`_OQd`g. T k.+.MUYOHr9e]3K|ޞ)w=@)gvxjes?^.RéU?Uvb-S!aMxxb~I)M K\ -DAE^}i #)1ܹ6;N{ђu1c):m9cèv~үo+xnN/~2{`dƴ?b,]box&A]x=TWz#Bzyhij926I R.f`zd;|%BE.5?C)* đ= ڙHG] qT&w< Qݷi$A%n3zƒ=E%ҽ?Hi,n>^q9GCP8$*MFqHSJ۹!):FW|&=U?F쮜)tI< Dm -ɚD]Tk?}?4#!͚vJIb12<~"H("kˊgH2!2}A$k,+RxSxÌwO|d,tq7X΄.raI4isVC*,=nH9gU2 Yͅ7UڕU2ת%n/qg$/做5Vk-:[8R9@KF"A1;NyKp "KWX*øH-3[یG9o*50 ZDMQG|gB ^!:o42%9M]I)ץmSa`bh.oi{%>o,Ml K|(]($K[oqRti?,;Ԕh곓NIGd+u(>g""P*˝窽/n!K*7] BIr}aGK`n_3eh$%!ɺC"xw]\&dž:! pPX7eNpA/]Fz?$/YnLj?¢ͽɒmw6C@K4OH#htx/Τ}p$n|Ƶ(Z&dجٴlnq( uO*}&ykѐf+ðGDrQ`q1=X;F{S-㟒i1\ڰ "q&yZ e<9AZHUHfr :[6.mw"ᬯŔ荿3M=f¢̼x` 2ǒ$!!Dr^ձ Bb94^,#.4tDD8ʜD\ IL_&v Ge'g o>M0L;Ne {~vLYYqeo{lf%/Q3[o!W`>s`9tg2x6@!\t;nfC#_iؖUg_)U"0̧,RIIkyYQ4{"n+l+W}BGOfm:5(1y oF%#rORpsb{@/Ѡ:,e/Dkܨ<^4SZ@Å6\ Xk=}mv&2':H;c:;y./oCH}^ FRq/܁;SgeZ)/F+KS"y**v#,nr(nIPa[sTrGkIܱT KylU< ~p~ CT[ lwq]A(;/{C^D8xn7T:F?XΩW%[UK(}9 Fw9ĥ.܄ LH.¯b25P'@9c}FRwK?2ӌ^NB!3{vtQd0-]] b_1#pSn' &J^?)ulu0~4gAN!?S#D."y6߱v*l'f+ 6Xrx|J~/`lAp *Q]# ]Sԥ 玗<{ja_J%ǡe`I=dm[7MO[jr|iP\'qwh< niuFbbďk&-dw&yw "fMG)T 03R#첵9c)Dv ](751]re2N6l =3jG,wMtFŰJ6Mu>lo Nz@Ed.[K]HK-Fj/ y1hkOL-sܳ~gmю 64n.(wTT>H+@ F M *XP>+g,x2 "y+L;զlυeA'R|iCqQ.}piFd3tDcwK@e%$e}]2Pc$Sf9ʚ"VIr(ﳖ[:ͥ:cltNoQr5)rjwe5ݩcoaƲx Y72nV稃' PQ'&")0EuKH!hȯ $RZO\jp-p=vh/5DN!~sM<1/n6T '2ƹ93 ҨqwC:k>teZ[$Qiܷ(\5,U릘ؘb9_nMwq:ƚ2aͱC\y2VPjґ76VPxĉޣd?y,Qu}G|ڕ.ya5 mvԢ 1C 5WaCx>ƹ8ݖ r+t#z}c P%N;VykH$pQKdK 0\pFv*BLJ檈z#Z01DÊyLY30|!pzٸS[7%pq3ʻ?0劖kW|1"GZ}mWz^f}-}?/j iɹyB7Jq"d8ۃj.'t=I=:A~ 3/:a:Uyݬ9Zl2λ="̅2VYF?\@br{䘓E8ʽ19ڰ{W*$Hmg{5@Jx~?ZrÇs)g :PYv3ɖNw_;{?Lca0 ;=>Ȱk}:e)]4忾P/d3Pr$}EgnX+ NfT05a2T#XpjF˂^'!;H`Hl?  'uTၻc]jta0jc⛌(H)V<(A!svy.ݨi@|o*MG2lž8_kB[ '.+U]Ow}E!{v'^qDgS7ţGH)H g~oBtmii'A. fPXGҀ*3.pVo`>p4әe}y|~# f2t${cZ}ƷLe#syDGT_.!ݳgGtgJΠuc=%Z@p)/=)QJ0sjX4b2;9F=!~\;W@8uhLQݑl&eǵAUL;KgY4vq[,bȫ̚NlkFLvckB ş] yW֮>S3;ٙs9IX!JX-*pA(< b,aj:؍mշ$@4 a "9rҕ9&!Q,̲߂g]^.-`lxAf!0hY M'4_JK)|u&a2 $:"_M[I RY-]B{dzZJz{:a`ݐσV!N#vg'ӢpfƏ{L?Mp%Dֈ&_ 8L[/ئomNv•PA:a;aQ]-]42aE^8_5g˜ZFXxb'ʩABQ2"=ZGWU:'ӅHyƕVV*[p6rǓ&HECo)]8 iP//mWEH=,L @9q@y䃮uWkXL8ԥ3 xω+Y, c20@L&CF 0543jN_y*~(t ]|iE6ni \qZ9h`[qLɩ+׆%15AA}x)F}UknB$AZXi+Nd =僖ŀ S7 n(n |&?T¿0ޖ$Hg['&m*y=5,#6f.~8fa fNy:QJYJ\kRLW)c 7P9&_ "UPw*S SBA<$sD܎b5a7I똞ѾWm?]Sos4pnv&S&ӵ`5g3#7iKNٚ`w. ю";{ul߸jf,[pOeOwJOȶYVdLȏ!pKf#ٔE{8`Gͺ1>_ec(W-tڍ=Jزb2(,ͥj.;*7~ cZv amȒfFAp1௥n`˧xeuHVI)C}հ"ʿvˊġ/UpO΄C*fX0@4D+ήtJmv9zu;l''܂@u~pUn:D_5\H*DO|Or@Boz<2GäCTj]MI|Mɠ_D0H~oP7x?g[>TNjc߻j8Q.ަdm.fH'7M,@uB_ɩGYj]OXM0zm=T>r(^FYt*6ɊA`J~.*61gJ"76_z޴=XJՍ͟IsFzo״s6[Ɖd&oOornRan|Drٜ{3h[;4H@ǸMdh+tDFU: ِhOw7~ƖE8d+!TN{P 'GZsɲj0O Th;~Nc%ATJ*Xf7#z167k!`#ߐם9"oxpk!tm +Ve=E5jM 'rbm"~7+<>ZaHФA-k%"u=찉 ?lOW& InqӠ?:wݒGb{Tu7"vD3[pN9A.ۊb 7Miqj|xw~*˽ʁo='NQpņ#PUĸ5Զ'-,;XJ';75 @~M"Rt!;F :CCYN@Urȸ?!0R""#+ YNX&q:"=l2yOK<1 p<Vs=y!u{ѱwu}(2/c0a9n{TܽW6$?vEW|C~i _@:VeI?)u`}Y/,A}|H7._oӇxIlcypgYT#c=9A޺X]*MFhpLf0 $Zʞ rQ:/jA;C2MƬ d$}^¶bCXb#:p*#|qOlG5.PG[pj*>IIySfm!T.Xgh3L&}& Tn哵vrfV"}B 5^?2&w$j#аolp32E(E@ubS)_Ho {tL(OJ~h#z#Zkz@k[6C endstream endobj 3985 0 obj << /Length1 2095 /Length2 14077 /Length3 0 /Length 15344 /Filter /FlateDecode >> stream xڍP.(%) ݡh)Z(rsLg/$URe5702UX,,L,,ljV.@'g+{߿ ĝ.` NuXXXXl,,1wHY 3 8hLi DNV %jojt4..|LvLNB w+K 4A`l%@/ZA`W NP(:AelL@V?MMAV -^Å` 2oflekl6rc{Qe1M\lG)K g?ꓰrݓڀAs+$\AV@M"2 t=L-S`&2?݀'WXYfV.wth7=Vd2הז?:11{7#;dwR%ckcPdnC褐{chA<@cd1?.cGoA]mmTl=6O x+_SM_,4r_1x;DA{+_#.ZJV5FVс|8{ ^N) 27c8NNƞ,bx d@.`/ ᏎrqEb7Y70KFf7 x$#6o`8̲8o'T~jj#+NcSpCh LVb2{؅232]|&4L OĨ&rG#O2ѕE}Hʣir}"lPKcz^`eI" #[: wyӯ$%:;lqO^jl:xwTb'%Ni8=vYmOhTN (h񘡱dc;H`9ron{\sw83(&Y*r7q <5y`7jхXb49É!P"-F_bqFM77ZyQ$;z,O7H?ox,\zEb}5Ͳ;t67Lli 10%t*4zƽIX9 'jHgh6W1=A5&/ 7l1!D6,Kx{iM}T9d$2cKYJ#;^LNS^Y:$Km_iC^SS[gl/J}p't$ۏ> 4R#}"0]H ,?෵"{}ܘ&<ܩp!xخjLbA0xw?_cRtwc&Q2dU4`̺ȼzMQnX@IBU h@|S 8&-_eT(v;r10qneC &2` h׍ $_c 1vͦ3WLLOBH"毳©:SG=j&:@(}a6掚)?#-muYO 󱕸^zR uw$DVI~b?SlT+60E/6_9EOq#A+t=4 ֺI . =p!ϫa8G>b)@#G`]xټaskv,!I95A=O=Wק UӲMBeny tp2v.|f iAE U<IC_H{T!?fGd]Kaڬ $P?k\UrZr"kdJศwJwm H²B^⭑{C+8di#miچ)'կZYfj xF 1,!i*}xZhTV,bN29Pm/#ApxtAዶ&M_}QDaIHL#81M>yKI䈭y`yZ I ,$igNqI/J *bm%~ PgQŵi19A<+~`ͅW!vI&NbGTp=([Nܨ~6Fg27f("<EW`С4bsҗ:k8*k͎]vaQyyBbOь\xH9)Lߔ?g(? DGH}B&셃Uw+GDL%8DQ*І-˥"v?޼1fuЄKy4ؕ4_-$aȶ1` l  ŽS"âl>ܙx2+H~?v)w'e@g9*O-]"$NԹ-of&'N>6LXC\Ue:+R s`^7t̶U_jɩ{&#jv;ϗo! c6~|zr$ȪEaM׮epN1ʣG<ݤi"Y ɊBYyH7sX"҄BZ u#2.- y={f0[S_o|Ubw*}- 4ݫ mK!1fkMZXZ$XRL䡀5ȇtm+u-ѓ4I*F vlg.j`'O/jxJeNuj>C,^;Qǂ 7 BM9_Co 'C$EKsVlMOd6>C!B(cla@J4,|aZh)Ԛig[TOgMT>YEJ6E.pV*#'S (K;wah1A qzJHdR4d[H{O?Zva>`̡Ax!K'K> lZkؓH[oeZ{F>Uk 8[5 Ԙȇ4WoTT]b:Q#7z1"[$f۰f R4nx G>ZXn&S{) 1̓-ڭ ʒ&6 606B}"]Wa}eW6;#sx/y{ɄZ05$AH;ȇc!ιh&NBpa]"[09q3b$ૉ^cR"?&^M&1Tܩh;qQ[>T :kbP21_#'#]G7ǃX- uJN9kKj'wEW:GӨWjOKdk̟햽6kK_EL8_"IGϺ8AJ(a,'}~L٦r6nsU3uhl IXxc>&ra=izA04).,x{Pqۛ#;U1۸ʠP?EZ59TO ^ X~)ưoTttź)`Spkx3P`SojnHо5=l$:U5j"l7HZʷ5DpN v 8D?BbcSd$+^sl=q]ӈ5O(Wסety?"zLqO  > rm$Oh&*wCFt4e^5gfo-ު(U=|TCO) v >؋~̥PfrS znv-dASRK%^Lit'ΫAtZ~x꿞5oV^X?ٛ6uM^ f}j 2oGC˶33BrSXΞ:Oj hTZ(hv:[f6k-d6VhԐhIY1%h_rϲO2l*giY|"^F7ɡHnQsǙ\k'[ ]f+rH^'~z){YjZ/he^&:woo[e-Jh4qwtC? `%[Z,L ۆr@L3j0@;]C Qao!ϻӥD ʮp!K.. [b0&[]џj\>f0 |#L$.BTfRKR|Snx\r_Q)_n=7 C^ӡ|ZRx0Hڗl8|ik:Ja;c8 /e Kg1' rȩwr/ ( FQ,ŭg ] ^)ůypB?E8m486e@-@s,IV2L B?ԋū.{tkhJGQt2 6yKjiz#35\noiHdzwQsk^gyW8O]nsM=Gof5Ht R^ᓡl̜fX}&rc_:4D[ pEQF?.A9d"W9̛߁#q9NVL1޶# K\'Rև;\{ngjfEc *Fa s=ڷllL>ѴhA5WO*Ε f na`\7z̈́E5Xr5b,1&1!zRJfibBE ~j'j&r9\.jhATy_ K ;nP# 3[`Mma]1  eyWºGG7=b:OoUlwGjw][M¬H+& :Z|YzaB/c 3wk)ikz]Q.hfHŅt!SyNƫFZ]z4ڦEqT{+_ʉiW3&1񇍙_L.-~{{#ai0G-I\G%1qzFe TfшfGq+No{=6T-f9 |@)9 9ݫfש:vvV%+ iģmϟHE&biRǫRc|ս-g_Xakź4F)bSyZ @a6P*._=uC"; &J.]"(-XlrtoU^Q7]l؁T v&b[}{mKjy~RQhEJhwNOKanokrDqGk'Lx✽_=Tk  @xBݾ)`eq'x޺!tA ųw~Q(j'%t$F 0DO$D3ddX b D^TH[>AǠPUPKs|c@ )6Kˢ]'T&{p2?-d/>$5#V~!$w3#(X|Ԟx~E"@5v8$-HN[jS^;k-Vm)^v ->GV{~dr%_zv)[̫ 3{ykIyO^4"cS6 gԞF% }Sd{\"p‰han_CKr6,!꾷f;&¹}SV}x-JZYaWх?\ɣTmY06 %!R4FedB%SlY0/wuTڵɃbo]'nn/'H8$ܼ  4-j.IQmr80AxM ^_9J06$?{{ uTޝa/IۮG FZ|PMYqQ+v`ϵr[3P$ݾ6xt8@4\`~V:V'Az5! Zbtf$,65ز#{aߧMb/Fc 2%WfR71ǂK^~$8<İӉ0{v5k 7 )J'r;ɕ2 <6-ArRgS|ߏ?P 4IS9_ )= ^]PD#c#W99DJ ¯TԖg+9*V~WiP2 qH'/n>\q2{?Xtm#&R9sTL{ _V SGq'61m7My#nM$9dv6qY½4Jx./YSvœC{N~q ?پ<+X>NqE](g>qG#ךBi {hxdXV3}n4I`Iغ VV@-#$&D~w ,zƮ3W΍+#^.[Th[DsvEJcu͗j+jlkdLh|kk-|˱֑~h$v>j0^@ 3?pCV۠BBN$/bJ'Rw*'UssQ ۻ7YgrZ 'M7%jisZk{9$uL4,{Ra t,Eg6+7BMe{ y6ѻyL2>fyB}P HADC!Y,RǎڳpȎ%X]IuD\-90"c m@IBho\}<P%n?\ͣmK",;k̂_Dj@F)usgdӸMb,D,2~E<ڰ33N~yuIEPmɳ-vMeb |/6<')g2㘤3򖳅^)K+V8-wи_kðF Ğk@U׬ލe O{F^`:l Bì8!tͽJmV@<4"?;j0"9lW9Ըk0gJ zՈ(l~M+ "}(UE ׷]JבLR0q.C;]ѷ={N8^,KQDO?3:$p! d2(Kd$.-60<4rJ@A #>#%V F-k9Pn ٸQAR67ڮ3mL'a&+[ܷy>N7V[h5 1vu rzZy)ᰙG4RQ`$B;&VT)-oR*a5ˋjq-K6?:CZ+je Bkp`u4#`M|4qECWVߗۮͮv+V,-2@5uQ-P GI~)ĦpWSss9x7tq$fr5b׶Iɦ"Ս/BpWXTZ"U_Oj2Smt\]/׮T#G(*zL>)u? yP\HYBMsξ^Ĉ4_i{hx?}G*w,onnT>5x3s0;(6J9=leWtRn[|B&S=-Ecq.䀴'NpR;Zݏuj_uvIq'w$}"QɯZd]ګ-aԾd6H *pi𓫺;:XAPFƛt0́٧S[ek)cFE<.Qz TS4wDqWΩN *oŦtq+ϴL,Òb4 4='(Ʌʟa[bH+Y"(}6tl,25䦉% 754iEA; ⛕[M}9QǚtdLiY /rNӲRZjsJ"ZfBVAs5Ʀlx-;\z2i2&#=?$ssi^ L̎NmƀiL|jݣa'U&/^l;$8 VWb, ~D fN%ƽG 7] OYAb01w66<˪{f2uߎztDRghߙqk72p 9!ѩ=~JLW Umy~)ߓSEDtze$n?.eMDhL='@<x!^5ee=d!6> t IIBL=cz{ Mo^ i5!(%9iNluiӍ0< endstream endobj 3987 0 obj << /Length1 1620 /Length2 8716 /Length3 0 /Length 9758 /Filter /FlateDecode >> stream xڍP-C`ܝ 4ҍ%hp %@p.#3sUUWѽڧ~,f1JC,l %uv'  5&Z 4q~I8)Ay[;'-?;??G~+N({GKЙx~쀎 30@ h1==?+ R r@s/e;XPV ? g7G ` 2^2\@GKs"@3X&_]_@&ff;{l *Ҋ,L@['K %Mbjs2s;;8lQdUeR`s | G=XY0 -~0wg\rPYlll<|nf==`B|x9Ύ.@;AfS%O3Or w{~}e"/s˪!#'}w3'' wo 诳SPlIev*zwPHGllf/;OߔvM@(e+ /P4We;$ rͬn᥼- T8~5fv6웙{rW]uR`3~ 0qt4@a{77eÁ `eC_R/|G_7-UO`rX5F|/>/o/VVпK%R@RAv+_j/_K# K)Fh|c@; eab&l]vW%FƼ3&4EB}eFا-)kE':İG8Vb}$̚O6Нԟ\x1TsqzekJFBgwv+*>L2Њ(1͜!@pf&Eb9sǜ&cD9Yॷ~sLéHgdK|?I`ΫKV0G|Qʼ:^c ݈G74[3O6:]]n;5H 6 M݌˱Da>}c9+d<:~mX&w3\ǯغkS"ds?c/t`w& G!]| T|.(R٠ܞГiO4;~Yn#Ɓ/S?ګU+N.T=/fKg+`}jm+T-}(^0KwLS`5Dœc#JVǵo-:AL3ߐWY4-3A"%*H_2)K#:ֿ1dlQ"AN?ޏdjuY"n{TEbd/}(BiOβ-d]J#&5'2VԢY[>?R &TJU_߿Şsr{3(K44IS*}]ѷ!LoQ61_} LŕHvv!SyWKh݊ślB=^fPe)d')ae7@&VU~(ۊv",lXcRl/β!'I;tkfeXp+I aK ,f;e%VFEԤ5n b} g?u?O@Zolj\%3G:aamue.BHO*{mnIgec!p_0d) Kj.|\֜ :M޶C:͜gztqjX )^Zt96o2_NBqūo#GCqՉ)ZW1:7®;n$#WSKgFκ'U:^mD񎳾$zӮ,ꂇv#WgH;dxk% :fk c P(Uc?z[ 4mվoن{%F/l,XD;(.B - 0Xœ#+N4J*)g:_'3NBz2اۿ%8'vD\6[; &!0faG [ ;! Nޚ$;KϭfxnMϟia֡ ;79>_Am YP6t$%!ISJ.oݏ.|G uuLϼ,wcBiBĽ Tž < YO{rDLT>VOG>NyVVPb|#} j;/r8Y_jםSWKL]Q슉xQJ!mm?N$<*7-6Z{ԭuI;ؐ̕ـejk XxCK}*$@dp\^ OT_~sӥ \)=rkݠO !wi3Ry q( (Qyen](9P8b#X3n7vVguV;Dg W*}vѭk4}wɑʹ%0tѷ%[f%6{c 70EqXE[*TMp*4k?BI@{V!b\fQf -Ymd U硷GY3-r}lx+S#MwLk w&=̆ \l?N.i /$D`x7i6 0wz,['>Nj|J4#?CJ ŢnL5b҃wH-7"E J%xD[rIfbD؀d:m2)2G%rJ& pP'BW5K/,F$Zđro߳JZ㨈PIWv9x1\ɲCƗ+ׂc2jբ6(o:˘M0nnff;69> <-⼭L߾. d n4%JJ-5_&RMlGvEOq/£a$Iy9%˼biVD=(^~R96Hk&Bj~MS`z]xȒA$U>8!vbSU'@ ҾѾ~,u8=lPnBakI2;vR`<ȃ2zb.LJhTSY 5ʏV|y#6$SC ,ӣ ހLnmDo^ AO rPH$?uh3y7/᳸LZީWAXRAnkBKTϫZ'l?%~@61 xـ2zk ' Svf2%ET}I1ʻa3Chj=&gU/AJ%brZL?.MplV:5ԭݪDBK%Mh/74 خ3&$Dו}Hͥ6Py4],Lu"Ͷ " "UXo+Wd$>%53ٲ)i=D`c?s:y x9o>' )W_w_B }TBK<{kQ!A_2Q^D*~) CcY? 1j5=}mӽTポq U}=$Wأ@ʹP9j$ԃ\=fǧ<+1QtF (U;Ie4QÓʭ/YCI$ T]njN 3ZZ%oّ"\և;)\V^@4\S\ aܭl$Qn"4@Oyfv28eʦjکdjZQE9H]&e \_GBbʥDGIG_̡q`xW- ]uG5^/@Nx"4Ɋb'MLhkx;vQxQ- lPح]/[>vho{A= %8z6c$=\6d,qڻօoԓHR+t^hGЖUs9,/3NJ9= Ua-:+ʮk16}lK`[0JOVL ٙfA>1P%xb&3zp>WkWD9i+S/@;ujnEI%KM%tDia}1~懕%fYWAk(1@(q)%XAKnٛBN39dw82x%'X y\ D Qʉz!xb%Hp; u&ųW gF&)L[sd QfF'C -Ȋ;ɏwJtwq,Lpɹv ]|E4x,58'č84ɪN9mãH iOoMv́QUe4ҒIP,1])07zŸ {5RqeA_6H{zu\ t~PʀGqNIhwF>Mi`מR u}Kr:}lO Duޝ[OEGty`m=H3?K'qߘ`N먣{sܔʵ΋pS<ׇOr #ֵ벉YmdOLD:S]P*H7tęZ8W=A2FҖ<6"MPDeW@"Cj3Qz#ǁl}Qfp{N㜭7sm#:y>sz};X3G#DH4tA ; $T- 9) $^葥Tw' l\6Tέ"!LՓVɗ\g$k>Ğs \A+0k')˙f&lhEX\kz x$%&Hnoj0Т~Y NIh$w~n)Lk(EܡEv#K{vtFX91Kg'?NĮ̛Gc*B+Z~)\`#Z }"3kFLkOF}"e;;63icFހAXT$CfŅ_YJh)/|rM2`󩬈Ⱦ"kw$7x=%C wsg2EEmkQ3K{\bqFܪFгd|qGDƩㆩ/fEr -=!l.&ysM3# ͳё`ðwIAzHwr{qs~ICB ) . 06`:~>x_t[[PFq?i f;+qvQDBp^Y!Ιk+I2&\خdۉa80;Y5I={xZS)(#3/qx puCa~Pf 03W,} !$ˎҨMY;ZTvџSQJ#u<:~À @'=p=I;u~@E8Wt>="5񛔫:ϱͦSKlBrCmMZ0paaحif=HLgm$4RrMaQ2,O uxe$@az)g7R .Y~}HWu_mw%(,or313H봪?%Hɉn;cA~28*nQy%kuʕA 8-eXz"9hoY1OUR$)BM whØ9G8L4%m>kה4F[plLӢ f!G7\|al)\mS?(`ӧH'ri>=Ώuj乱?Yk.b`p,Na wy٭NbW ӗ-{OVel̈́װXxʳ#Sշ3~paX&hC"|`{k|S|OdZ 3+Ry~l bx_{oZ긌R=$ˣ3v\^m1fJ%4( NM|(%K1lGm*Pf NPsPyazR+Eq'7@滬 9,,v{6PEH;c c5V~ hǝ7B[ QoC_ 'ӅYʥG$*yOV>DHu Db7 ѐE"^sJz7(]t7+fF1Arb"=Yȳc/lvQWn9iy8{f\*s)Yl̅.S=4O)dg -wǴP wZ* G+'з.@=84kn[Пg0~]7DΨvƙbjDb7n0:jj0_.^ 1ia>jAVLs:}%5cyAsMM]nM&ix^Xy!μ ä{9w뙄E!18+1\G}qB1?'|n $Bu#RX{' t+lrVF 4U4Sq9R " ]R=Q_1*i *y S(>-auX('n1o&LZ<6Z}HX4}ݜ*Jօ4jSdmaNh\ć]us?$,jEb>4K>O k^llQo=` WBB>_0-)i`I5)k&Qf4R@Q4_&]KP 8eСa$poK"hIDTǤ+m 4Zߦ¼ %z",-$$7,M7ea4-G/֍8'v2lJC}#]mWTY' ۷k~MEGܖ 5Z5MS[kze-f-Ll~?\]ёR8NBԕNW -a7`.ƽyca|, sd0 nj!1);r&x3L="mϓy|Z1~r!p _f:YushQkb5>ҩA,(`ď5@3Gwrk BJݝue??qi:]Zǔq'DR3=a̠-"ɥ9.+eWѻǽ:s^_x&?E[Jcޗb:QDȎ5[pIEY@IW_h;6 _?gES[dK|.Sl ,š*QΡhW-{۶CΑÅ4 ;^n-|{SLW=bK{ϫw>g[ \iqXʈ&{ZfQG'*6nV^6ӆrKņ&]@g7aӵj&*a8TգW"mLz⹸br endstream endobj 3989 0 obj << /Length1 1475 /Length2 6563 /Length3 0 /Length 7553 /Filter /FlateDecode >> stream xڍvT6%1Z@ZF7hcmJ " !-"%!!-sy;z~x9MEU].p-4 #  d`,@`PF/aP x!@G wBBtoW&M U8,-,_8<LOa7n{~}\$:8ƻj@P;$SynߑjfͧMCsfKtӖӰ34ȵO6UzD-T}ìx |dL莃hTξ\5]{.O~VA42>l1FT^0K4a@VD nQDS qff;&vëGjYz% :#&dBi/9ܗ~l7DgTݪ!Z[?ݢNW^mj?{"~!òtB7'!Ǟ_L sV5g,ÔReDyU$ʼnGJ)Q9Vae&vv,32|b%^/Q1FiwlϋO$}I9xutQЄu|`^zD];a)YWwZbvݳWݠ{W)ɳ3oH>gZv'XU׺t"d=m5Ԉ% N=4Y-6JktܝܑSߩYe)&ZoGf9cod>إɦ팺[X6d2 :>!]CiJ2M*9>)G 2iq׻v kC(<[d?64V*a#ʲ뷒b(Xs5$v_}tN9>AxPW)Sڧj~jټ;EΗOf$X_ kG5 stL%x}({KxWOfPlep4dC^LSnm)} lv0"V9\`N &j)͐>a\U =ҫʟW7QMܼ"-!ͣ-I`$sš=^]N=vm^/pAr f;deMtǖ]@2?xX%ե}9ֺ?@skDzռ ߱%f\+c8_gs1ΞMvGkqU͖7e?,} Ԫ& y>kMҦ2#fVx"An_V`׳[Wyd; 2(ׅv^'߰ݕ Y)!)P%eDcgɜQ1:G +TZ!.0YvJP|j)itYow&o7S\][DCHmDAK&֑ ^P;چwMv5>Zھ[9`w͛>YLR ?8TW@1`/%/gc9 L$0Ypv%ݵk,O[i|9+P'|•@Y-ܻgp>q+$s2ae6H~߇t4 s`ɗnj7~ kC+)Yv7FlőwPdڀtخrmw!{((5LV ' zmtǙs_+`W6qŌ 3S a>-$!͉;E'Oqݥqkhpu()PnB{ﱚ,hfCXzR$W*&e:ËՊ4zIʟ64q< tv"b#]>Vsni!kX%Z;cœ8sNj"a6s0k2ᡕXʬLă/2M4ZNWv5O Mc` T$M7էS2Y[LƘIfBh*x]sڬ9v9n59},C\ZTMqqȮ;ye3_:k{w V9} JMa  zA?.u5>z68%HH]Ph|=R}[t7z1`AEvAV `P :wࢸ>{6brceȟJ{' IଧL+Z5z30y(I2\}rWXN6c̄%8s۴t ŬClŧSb*u"ɁKalId؂OlW=]oJ8 wz(1SNEbS>c}i)1O:L|IUeq7*us?mui2Ry6g+ GQ k.h=CM5e Ef͔t.}iH^ҮFQNvb ړek{*] t_: ֙ qgR#>,]i:Z{'um=)(,~s]tE)lKO@f/J"98D"SMYO] NCho:6'c@S:],b#D%/*{:'F{̖DC #5sn eZ[{7ڜ7bY[L\7?aL:^K*4(.X<>G!'u$Yk;($u /UՔ8zzAW/᎜|g N[TӪ:;ih9nάQ]O{VfBHgM<- Z]=Z#Y*BlyX0ݢ5)r6 ڰqVn5s)Q<{L5KPMtHѮK=Y ?^z$rL`7DYC*SS?U)fI)dsnK~FGﵸVSCx,-K᷄8F/GgKk"x ?^\^XWfڛqH!yϗo37|hoˈ$GgԱ|a֬ w,_p{FpS+l &'x~~JHØ:En0]:rRr=fΣWBT]Bzk֖ocӸ5`c?22e\MoM:f$qZ#$N?Wd-w0sJR"${=1&dSC5lBV3l׻e1*mZk7 ޯ(.&s=$N;9xt_r<`Xp@OYqv.] Pk g|rAV'prx+|T)[Nj}rN;xWʚhW9SkVU͋~1^i.ӆIΒ dAw'#~n͍l?,˼IBYw'G/odߖ #&an}B8OgkPŸj&7Y:qmȈВNM]> stream xڍP  AKi-C485wfUUWgm_g} e53;ؙ `ffcdffEP9"Rh@v`o2qc73;0@`eef23Α n 2(0d@'D 1;{G[Ԧ4.?"@G1`l }hjlP3='5=/ = l P:]f?mcD[ٙ;;o)6:rdJ@_s5F@ Ʀv``$ݝ`? m]A6&on Q;'SGLyd -G} Gۭ{0Vk믳9lf3{& 0(#7?2 3tM-aS~/{;{d 8;}_0:L 0?@[A=c06[fv`l.8ݟVڹx f6N*S?ev(ig&.4͠h6@?ceo=.66jPhmA6ѿMF(ؽjZbje6Cla%$A@3e_vN? 3ѽ횩S֩?UUߔ`S;?v`h7by[N3s `b9''I_ $~RqTAl&[2LFomqLf,&["Ao*|KmdyK|KdOaoooo|Qڿ=`?RHo5۸8+m7rN8vsϧt".ۙY׈1 Pj}aZrpyDKpISFx븵.[Jۓo8թ6Ic~Bu=goMkV.Yn<{>)ѐ]jN˦5>Rd:3ӢΠgO!Dzn;>r";[%$9y NB 3$n'@+Zzcϸc{S?~yG}c^ܮ!{Ӌ< C%['Iqbh0n +Wܼ;*9mÉwj5Mfs0tDbFraӗޤ|.(D5k׶q$߰=93$BGMg7궍y6{9#zAuF*4FSثf@\IBG YWHS9JXK~w iIA{\/ _>RcCoƤ{RdC)N0+/lVxNe־2v-|I qYɠUb"M~ߌGn04Jɝ'YXtjHU kFy18T7 4(h b+lQzJN-{O8W^]w-T?|f1 >}L!_m\cJt9o&`ir/5xL49Ƙ-(0MTdLlhj˷ݱk ^^I )J(QvO~kuh!܌-}ԅ/DыMAA3V,~2<$FOht2TFhCu ]HREt!Ƌ|@~Ǯ{x2i9RYO"bNԸLhUtJ52zZIFBMyv$;ǧW()/{;7}ߗZkGK?*6 eʫګ^[W=6R6V!7~SbBL"<]PZl9F&:ǃtٶĐldΞCQV)%ׄ^*C˼di+W `REQ$L~nNV)щ&1nwQ}~0$rc&Q@/I=^2.6HEt_Yۃ?\`rW=P ҿ}& \{A4lњ]uY*=Ag8wfV0 Z*yuשcoxm #Ube5.&^їEJI-#ʝU\m97O859B[>z7$bk"+ģ7P<DSf<DvrS쓟~XD}`mA*38#Y%DOÇJRX7Ih"("rQ gѐ/1X:߽W_⥫}.KNiՈ9/^s^^,bARɪb`IM'^UGTsaǁ=G7oll!(_vm "&/>%z(u=Zٌ]`#ZG~/DW.r ({ޏR02avizGFqL5}F|8lEڬhoXf{YɱHa=l[+[VJ؊?~/ps>gGw-.*QKLVQ "5BAi75ԇ7ʹ=65٥i4{e㹛FbTn=aG $;VQ.z(ԯuS Q%8yzLyQ5̻9"Q㊎mTH荢+-WtWeO`,3l:vnnsw8 mK4 v:Y]%`un5Bl#&ߥ+  QY{"jVՇ@;/cÒ_3@#{3)/ |PKFbc!nd%( l;O* ݹn:YD&yL~8T-e=ۄ\vkF>7l!La93CaTm_j2'QXH&ۼAOEPf172s ƺiͭ.q<  #վm[;@QRH ℱ$(=I3imX*wN,U CiJ <%QѰVuJ@JPP+~HOҹLRڧ6HpL~~a֓JUa'\ˀGi/#wW5ueψkc"8l(w̧L~l OSɅ7{//Y2"@;dm1H)qc(}~eQ]Tj[ZA{)歷&\0K>jsc~(&F&`F󰚤zf)c;Ql0$jGE/FvHBp<UŖ^k)ڝ.F] [e z髼NÆKD"u\׶h.L k͔l?"b8jysӱ ʀA.b|z{_87FZ4D9$ ͨxp?q J%}thtqZb<?L "JZO HJ/ t%j٘:a8AKcS1[D~Ys1X; 9Kzz <䖭mK(ӄ( B;$'\TbHu!D4ke4ZW$.#u];!:M z 3l{GTwJ|%jabY RÖ|P 5ӿ~pd.:\i[N;'p ]2xyS|D8ۋoupmJHpvoB58}2Rs@үRtuYw%HBꮗA0qp|Ķ5KiSwUhu$G10Pi;a 52kb<7C.u*N({Ɉ>6ܡ|hiĮ'"Rb^#}M|J/=GsK{;T$eK˥3%CJ^.ճL=UXsiƯ j7 txBqfhuC^5>u\y([.!6N CTŤ3;wK,imz9(kNF*B ‡6ǰ룖G ʝϖЈv];)N} Ժr$ѢH=m6V9=*@y7~0E&eQ_p9f~on, kvZ{BTZ;ΤHQ]xekT[Bu$W[6 sQN_ż(%_*MY} !vQeudCKpw`{E<&\4AdWܯfJݒ*,bq F/ ̻ձ|FѶ_ 1*D\|0[jЖau((rAZ9ګt!Y3yXiG}=B]b{CckІp⸹$P]?yƔuvU{c {ֵ}n8N+f*NH{a'jt5E^⅘rlP Tb_NLHJQuE|籙OWbX7vUkՎd!-އAp#v}Qb v.^O ^Y|@8Hέu?Wƶ~(6i$ /q:imNp>)5XRj4Š4b+8n7i 1Y+"4 ~Q2l1}bl,Ԉ(ݺs_4>ËFtH\HU'q_aCSdEQ7q=Avɟζnvcud\NF{ rLG2rPm=~ co.3):wCҞxPA`-*)<1b,FUS*ܭ 2шٹ;b/,!̲k @{NU37?lw0וj _Bpzܔ\hQ߹Fdj~穐qa.@c\K dWKD툈7ߝiK^hѸ9<&v 6(!`w {QsE;{Z ]hV#>Qb3_ Lݍ2t4o(v=13lG5iTP1ۇeۍ0I>q)8G  E70^~/YdC3hTEAJ/tԶX9u?:)ľFZn&tSsSgӏ,3RI|+6yS-h 3HXʩ (\g*$c&~V=STO-dӅZ1c7#E,20#YƔ9?Gݭ5y2#6r"v=mc fPZB D njן,K4]~y~Tvq֣.3o-wmƕ:\Bt Rx\B,);dWXM5GE[I7Ƨh0Y{<~V%G}E6c%JjnTL^)F5L w8e^81NHcGMv[&7>snqՓ%j\{D^a,O FKICp}{auUgjq^55^RP3v"6J/>!j>ߏF<>EU&<Сdz7O?v B7| 811Dq5^>3ϱǤ{A'D'zs=apE'+q?N#Vqu,G]E1"I5c`4 œF3EN8 +7Q!q8"⧛@Z- f_ ~mי0`(s_yAҨ| "j NVpnW1\cuY.fĈ$W'VVaPrwVq;=d欙sg"ƜL (KKkEK^ ~ 2DmM5Rd7_M9UKU3ȦYޓi99"Ypprw7) 2׮i>n kNٺE8>bqδe51d/ 1^SG![:rĴ(0:^Ɗݨj4G],unƋ8V9)Wݹ7$SN$\e4v^ʳcc%h!P{ړvDTg]Y &t]\/7>Rs`9R~ۥ5gwkzS;OufuݖsgGYaZ&"<qĽN\Fm3>b`nvGB:QY.YXn9ǿv`ѻW.LJ 2+*#l=zO a_ſ\qBڪ_ tȊ #;AұVbAr6AVt';7ocaWD0_?Fy1+* z#OD~j xCrjV ~+\a@K;bELr$ z1[\5T\G#KJ'g䭬~X ]h񩺱Gcgfy׬4AlE-~ߡy d b"s^GE'jՏ7EͲpe6SՇk+[$ϊ3BhM6'gXqh"iJZ{{ӰYT)x(.tZN㰠N00#:)ј5'_*VAj@_k70@Ȏϐ1lK*4QT,o:7͓i%#Ě]zGVF_|mJ"_0qq/G_sc%Vt"33cF 9(4u$-3ZwtG>cwzYĭL3dIVT%ƱAx ݺ)Ɔ <hƽ.i-c>Ċ;eO!vQ fCb=p'$fm5L˵ǡBr9=>nAj6Rʘ8-)Ϲj2їȽ/:fxFʘ Qph+Wms" 8UF.vW(t)nb>cEhZT*D>K՜!WMF9",vb* e9ACPn٪I]a#CQ&h308i" 9ś|1pIռTXY8s99%Qpf<`2۟ Cp+/)S!I. bFzY P{NRKpGCFc yTFC`q"#"V[1k6Ztm zd3g_c(h5k bY8*tјPys:ʾY@Z3'xY[igW|Vd?!iE+?\=\S!KAҿӬ׍LcHק nŮDGL&LS(82*vpiӎH]Y:KqZ>^BCR~rn2S<-4kŝJ퍼"JlN@|tCD6'-"0Q!h̦.A8j_dNzA}Az,Mk~JbʺZ BPDWυ+S`}-AIZo( mc~}SVˤnq?i!m#y|ߵӝ.8XE3F| &+/A;`01kMo.~%{0 ;U;!DQ E^iAJꠕJfKE8WAﴭ'8QÄq%m{;>OAt'O<-%Q=dy0"&[uv1 rhG~r[xa҈)-_BS^˟\Y0ޔamphjA~ 8r@/=vN]ˬ^\J.&]|[;_ l6j{UFru޳ӹ("_i/H^'NnJ(FW:* pD5BiRcW>Ќ.oXq׷~v*kg].sǒ`ўL!$0{vԚX!^/,S^3UugfrVWXA ]6sfΉ}&vjW*N7{J;( rsSi5Y+=N,!58\ v!h%/4r3ޜBEڞAXONRzlNB/D /iKg* nG%Eړ̄h K:S M K̿;y$d*w h_Ӄg'N/' {AEs/1}fbNj@BS?\tJH+lRBV8ʓ=eD^ #V3vm,wʀ8Ҕ9(i{*$%9YŠ,30YjUܒ53}C"<|g<[[Z:[k VūˁG5#s c~%| 1skRK^euD(bQh"Jo`S}RE؃EqiZj]Q/*Զ)zG]T  ;sno -H27I3W5WD[ 7$XC|?TjtBEsEI Q<%{p ;};:^M.vȘ^GD.:'K^'1N{| ޑ6 R Q fe2 endstream endobj 3993 0 obj << /Length1 1644 /Length2 7488 /Length3 0 /Length 8576 /Filter /FlateDecode >> stream xڍxT7@钮4c`lFtJw tHwJ HK#H>>=;gޟs+ЀWn VÐ|%mSA0.+! 8Li(m(  4ܡAa@H@@oE$Ѐ\V%# mPpA@60 삊 .8HWI~~OOO>A A:d Oi|CG/i(!P&0;`uRK9A>ml]\m`tU^H  Gx@6(ߩT6 ԇA\>F_nPmV)]\0$W~ n` {|>C`vʰsw7AAAb`$@T@BLLT~ {0vQ5]2{0a ['\AA؂ 0`_g ^3^pBB ǿ0P1G@~;(+V䌺[Qqa ݯظx:|QjMq? DP5n+, GY=PK*k(j?_y𿶂~Sw  Cqo\HEU87] 0wĿj(% u5B J7^ƍ \f=_n`8I:Յv\(ynawE%D"_:jagN?UM.Oq_{ ZMSC)l*=f:LGm$1Ya'? }S D($fJC*v?7ebYGǑeM|GR숡i9ۜt;jp2r Ѥ!fRYj3MK8*L`{␰{RwMp93zlï-IQ<5,vh#'м>LJFV}OxI镩RS a˝IkجDA!TáŀPFQKҩ2ZV2:Ӻ/ &a{-o;Fz#N, A &YꢗIŐn+\L`{yIxca|CyC] {a 3Ąde *޽ nI}(ly#Oĵxz_Z&غ Xju=q.a@$@nMNVX>3ϳ{xgP=iC8O}쩻^j.1OlGT%CMmJ)m:.Zpz7]|4 rk9q)@Jľ&!Y&ዉiCR`9}TNsЌyK4I7U>dmC>+`7@ᕏ&boݵw-?{݊i*VrBR`?|]hJ +H5MC>|N'X>~rYQfk [fOJ-t}G׌*&#J^PzYxuz+=k52@rǢ%|=$T\wx:I/nf>+cw39#ޕEFx[u pXjCixuRy1>}٣-S\o}}ZY͒.s抯MYTSGw=R0s9[Qu:RCwԯYdvj>+O#F@z{_1miuG'7f7 -Zj!ɤҫ@8W<, ̎F%rrɮ\sT2@A*Q|NpjvCp^qDH.ghA4+aؽPUoI>}#&-I9\Hoffn(\Eٳ+{nX y-ob|\ BsG3VYWG tW~J>P)֧o {3`yf3 fD+[h K,&@suʠN|[wK4(\ѳL1Er&NUf|DsU?oo|Ls,e qWfYr`GV\ZN!evPHMYŞ,>љ-2H,S7ңתK]DxĤzuMUU'i{݃[ $qjIޮR7N4G9m}TYԚP`q_91r0QYvfEa+M'U;= 0 1]jx wy:/EP3^ rCc'NY~5TAII|wut6̊ k4vI_yZAi&̙Qf B=P~ZUQv5Mwn&+$ư᪦d"kWv#KklU},O"&I] BC_&Af/qw K`Ǘx)$} Zk'g ͊O%/VZz>E|FK{U8~()0vOgLLk%1k; U!獌S(pxYz}~R:Q4~z[4:3'ߑ5zvoH iuz0 \G߭h|TB2Ibj+"Q"cz{[ٟJ+H;M_YiĎf(L<| ~g` Ob.Kohg9'V6Y>N>6udM޺?ȏC) d6VRۻ~3l]iw샢tNCQ$TYA"J(ɠ`i"68 +3~2a($FA}<'6>P~8E{TC`;DX$̛B:h?H•ɪ Dc{Nj YBұ'RعF⣣@;0XߧT̋w 9z _7VQj<7Z- ;(^*'Q= ZY$c0^uE\88;XVS`[U+a>N?=~qzW2Yo'3 vNKz]*S1~*$uc,pьe󑒞 r94l8yS@;34l?\ gEkQFjk%r:=~6ĚWbw3Ԓ&}+o,u2sAih\j}ERJv3v;}S!%!GWJimUX?rgpr~.jnm%x:T=r-֤QitMDtM\ss*7z^ܮ9]1m'Hāei5H98cK!0UMZr,e=K0&庩`rFڐogȐT !Kijόi\ϰ[Ɂ*2CX @g: f-#VJ8>vIϤݱA}++ iw|_b({)4dCGپ!."c"@so̪||lW4R$ˆ3lH Ut/Ą,.%dX kFP~¸4z$3e{hCOt[6R[:k3V %A'rN6t=Pz{~j!o^+0$&D_Hi:,O2J5s2K}[1HM=^[#?IŸF@v {ESo&TydbJ03b( a>_VL@h(ihY=w%IQseU-xt"8\٠H2a^譪ÆV?;6hgT˷Wci{lq8Q!KB6' `--=]Ht!yWuzO߬j2#`{n`a}0s9p|eX&ٓLFH̲޲]"2,%3렦ǂgs?>WҾkKP-dJ\e'aUv%z) XFAB'!%AΏ9uT3SQJ,?Ԃ9-# #d3~NBQHp+מlad<8qi}A78}>Ȏփ)z8ipWLL~ q98DHb㬊9CbEq܅^nYn.E<wX;K <+],3Xz֬y%(r ok0r°.=}@Hzz,ml"6F#G|!vz>q+$|֜vsLXbD@8c Y4fuӅ02g[SyxqsIqnаŌVcz))E=\TܙbGl$s4Jq D5H-WZEds+bؑc ^I04)GOH 15ٛkFdJVܒX-3hԤ@iފeP&6ӻeORqx1;ݷzw3ݏG(dob:^YξNm֍oѝ&D_@v~΅dFwlK uYsoF\J{l=/S3}#QH~V#=~WŞrfjFw ep5wb ;-ymkɗzu5P2Ms+JlM467H4dPrhQhEvX0rm23Q㶗!߿L%pܴZΝ@)lk+ ddISL3.ߞ(FTSsnEgX t(Ͷ"V xl%p hؾT lu}(aT LtSe-g)~g[6>q]Rs4aHϴlR-:5Ctxߴ%j.O #]kyzC]ٕ'%/CTfA \ Y4{Xvù% ?Obm 7s[=AZ3t\J7ZwlZ%ŅX-,'ZZzbti81iw'7{q“((aBW/,70(Ɓ"LVT;4N釗t1x$g>2ODd٨ktC uU/Zu/.s[]³o9nl+C|Wۨ|8v谼hojN1&}FV~YFDg͹{]mLfU!<xl=k]ۮN X^kU7$úx[I!"Z 6=;p_EXcsi|.=$v5X[8|{UGM4/9 禕?=inX@ 2,?D&ymO9$!| >z0DP&֡ᑜfA77ܼ70q{w}7)90ƨ IKsjpJ{2LyięTcit踪>Mރ)&87/M ܩy2DZڳ tJ)v6ݞ}u\5j}*z{Qѵ7%cdJ3qLc|)WqW>."Z^nCVKUM C{Bx6; /-R_1-~jobkHh'yZqōM\[go%t$ڴuU|J&8mֹN-&mb:'1ކm{r tӯhYҬ}[/4 Q&C?ŷWFpc Tw( 0WH=2tSr{=z'vRCk8}KVvpn BDN9d49=YW\q`ư<M !DO_CH.:HDAr u'c*sPHdr:CU/v]pTR4EX NxmMn +‡$k5]cO'B_C30/bovO{d^/nZFݞ.t=omFe~& ʁ6vf_u[qc_XN1gPt(|2z່H1P\Gccd{J]AP/ozE[\wE LёVίfk^))Z$J pԴq6v+U X%^Kۘyv x[WM||Tpa$6}|=8ăɡ8y@^"cR={#|%0afA=K?vQ endstream endobj 3995 0 obj << /Length1 1393 /Length2 5902 /Length3 0 /Length 6847 /Filter /FlateDecode >> stream xڍuXm) JFiɱ mlCAZ: GPC:xwwDZ~yNj#¢@a aI(Ip(PWB°Uwt %]a8qN0W|G4BA0J9ph!!OOOA+VqTzqN0, ]a xNpo x! w$4uhw~ ܟ쟅_`#HGp@03`09l`hV G( "(WWܟ[d](O u 2AajB&?6G(an@Igyco4SB `pł=`@^P89‘0k1p/%=a /k<($_R7Rи|**(/4P@Z\ (,,&o`́t@c8<ЂdsV q#-_)7oH?`W8O8,tQxq ; [ʺ0(80^HG<Abp: 5 N(=p$qY 𪃸o,Ϭ`xQ]$>q {@x}2¼~($D)@HvT._bWHo]GT,h H N9\U 2Xd0st`˻goSDr;$*Bihqf0=j^"~Z{54ܷzDT7!"2$QJٌDcu4K=BM6b~Y`)Rxvt?u:eO*3u?e|"S:pRD!Km{ZzYh[I\YuFévŗnE (2{9yh{f&1n D'r]O#f+\TмȮS~*9^V?'ꏷڇirzO~%6AC_ HB'4 /_dgo1#dGJs<j)7Ё[2A18IXca%yW ǮKIr+@2KWyҥ!<](r^tˬO6T{/֬#YI.L"<`e+ܰ%嚴ȂD㗜M@@y_U%DdYTXi(-kbCCDQRYo Xzr/:8l?.n[$N G[ Ozl֤g+>*ޛ@Z9/?~v (wx3.pf3@pswZ8gNez5[?iJ{VVop<~Yj`FvݠUl"~@SڱFZSR Pzah ԓui Ӥs69$^t;<'|mJ.nR%s|ZU%y*-$(9ɣ< >yQjiQ|?]==iI#gyGbNE05h_JT',oj9۸hcj76{O>92ߪ ʠ' nkԚ\ɔg /גMKņMJkN9RyEKF^P^f6,HG͝Q cfc?\U庾xio{ΦLDҵ쒡ro/`=az2#N *gwb~^LH$wx幮{iz(Zl4TU Aؼq:W1MRe{s:9!3LdLs O@oːNTmk^⻚&&/p2 YoRs$J,7;ʟ8M^gM/ibHx+[R*ժK4ж-,^B_)u'wz#Ђb'] jsH7]o zTm^BFЂ8 `QruO۟T;gb#^ymqv* /B 1T!ug S]c}> _pM!݋[se'FOFe)?AoqQLښg=<ĸ!&ecS#z7|;]ck()sCjCy5j7z'tje"%=s*̌j@zU{ō0ɒa}-03/̣/dQs琉de<ô( N[3oM.K|s p}Jke6G-}欂` rl _rkb1Lrj|`-vhT“c1ѹF}ױ;GUQ3EASw=ɭ4+$y{@ǙjZpbv¦2UVSԍ^WGRXjtZiRĦE.cԀΊÑ.qfuիsVX(1לlzNq¹cyTmMlgd=[VKCOGe٫A.Fk ^kΔG:B^{=0>s*X#Μajෆ|9wFq >m$Kr_g>]V>A=|ow!-c)y0,j@RᣍL4'$]BI0.o'dFS Q[Axt-V5Ȃr\]BGB['pΰVpQ]0GQ\,9.TG,@lή5%\K?4zsn0-xI\-ve<%p92]nW\%쩠NqNJSMlnEfW9޵5e^QI~42\ &z'iko,"s?sy+&yU#PlBٴpyyN$f84Tvx=<o#%f1?Q+@Vd*z+y :~n2ЧRO>8"9Ubu" 34Օʷ˺}YdĬd77m|eeb^8un//U6c_tESs\iH J~=V\pP}ϱ󃄖~n۷$bQ DkTX]d^y͝fEBirO ̉\7nU-J̖g( G{4bo[(~3ɍqAv㽓a!OKFR]s bfL`r> MKmDk4I᥋O#oy3#MD -AffdJ: p }vzƄmpFBz 7޷4$^=[ܞy@6]?*2vrBAے  WξZ;BM.xzyc0ȇX]M5w}K~`cV>eDg{/eHvcxmNL^a/>o(ΘyqcbKYȸj5RGF)FJ@ bE/4:\D>A?-cIZxmIFk}ee07K.WV@'0@H>x\zVa*xy؉=̨CdpJq`x\KFx}߯67onX3Il}6 & <:gGg,mvB&5cbrSNr3 Nb v lFX4~LdsDV-1e[˼{qC 魵tF+(2 Sg]pS/1ހyQ.UL\g2Nª-[qf[1(=7N2 ({5p)@"/HqUb^/1ѝU+[o)N:N"ׂ$?rPaĪ) <҈yu13M4P<1tib2͟!}9&$Mp?UQz*989n 20ӭ:Gت'<&۔=^K 9b!ҁOӘiLBkW%m1|凡:gR&2 o/t{!n[5{5c5 p23)nԷk(,!Eujb:'3/nSd:Zo4璽Q.ZMHC4rdjQkߴzW37`|<"yӖA_q֦ /Ѹ|˗bKwx㮰6fISGsIu6/nQY'^[JwʷSC endstream endobj 3997 0 obj << /Length1 2455 /Length2 21509 /Length3 0 /Length 22921 /Filter /FlateDecode >> stream xڌPu!C Xݝ$h~>WuoQhݳ{N(ITELl6NL,|1y5V ; % _9dk/ 1ӛLP `ccaց n23>(l@fNoy 1r3: mN@뷌ƆVU[cB;9132Z;2: 2\AN#h]2@wiL5sN@ d q|sq1:޲Tev@ǀwsLw _Άƶv6 3) Pcrrsbژ64r}7t1YE ) 0|@vNL 52f 1[kk#o~ [ݙ>\K"S2Lm@@mDdf@'' h3NnK[V 7prpz{[`2v@6or谼+?_zofbkc#fV Fw(EEmF6N++ӁVT7E1'ﵡo۷yh. '/Ku/#Ig+41Zxggݐ}k BM@W+d#"6fos9Q4Q9g{o9@6@%[G{͋Vnq|;T߼6ƶ&W ``6o&@Fdcx`j`8"EA\f?, ^?, 6`87.?荋EzyqQ޸Ao\T7.j?荋EzqY, v͛z7qmކk?QO ɿ[?9j|;~+CYu@R."X 2Cmv@Y@o|k[N֎1e!2?7_ hG??7oWc7F@ǿVc-uYOv?ŬooMtsHoJǷ￝ߚ/T:+[GJ Ͻc4K@71⼭1Em`]+Eˮ%{^ĂH쯈uC&K-lK5>6hS-) CG9g_?ۘa6 ^a?ߙؗj0?n &G9-|:/JP/6Z/L$Z9!<}`S=v;6P- p6`+* eшӰ[T "Jw*gG ?^=1Spe72c/Kk> ,B+vCOΗlco3!~4hD"CbJP= S6@(H8ȍkO G'2+*G\vI1QI/0Ae]}g,} \Ԥ t^$O>TͩL/^〝b$ ZaZO񺤲y*Y.jx2ٴIkC77F9yv"9A*dx8Y7geoycO=IϟSJtͧmx3A8ޱS_;oLJ46*K򴋅芾qLC3#P6K5uRXO%k!/;,mtw*Kyd*^1O擿5rqqE 95]G_w`~Y;\~CRGވ,_qAq]bw[,l}x[h$--ucx7}uVLJ Pq&dڂ)>2ΰ;m.qq|}2RҪ2`G@\JbNBXY»'{"C}Jˣ2/*+! [mHNA_쥩!Q:jD'U0H:i]$H`ŝ. e&|yL[aL/$'D `Djf*~Nk~򌉆(0zfhm,)զe/ڟ`h91GJtQj'8H&xkz3 8zhן*tOeint#ܥ:Qz8B9L3ݥ&:΄l*T82 )]QK.LtA-VB*1.,`+,I`8Ù[]Bw5%O1 pRn'ޜЂ!cLcItwbu\Ճe兎TR\vOJæ'as;S3{`'Η%ڋq=k5*^@De_JF)(%LcL!VR!MGj@kgY?tߒ6໻=50 5.n|ag=Izky:L''-YgH9lyC~Y1%k>0KNH{V8JYA##>T1p%,c^D(J2tVoW2-_M7jw:KR%ARTl#FxZѨS.3BZTdNz.9-=1@qFlg-aϭeJl^cJ7!hG;X.鳱!hek₌0 "T6 UX׶߽ AlBvjxUg) u8D5{$[+=7#]_+QtO S,Bl:oYhF|['3zycF؝q@v@Q2͋n1~q*fZSSܨXbw)K㉛Lx"orh{8z.b"{49B<"<<w(եCaa9#CH". ks[-V.F?'!xjzu (=Ͼ QQybe\Wh>h>E"O5Wf(Ľڮ2r^cu[L}O7MM+2.q'ܧ~mu9l/a;|B"6vjTZQ9jQ ]_nKfTz cOxn W-=Ϯ ?}IC@EXǐ^`v||yڝp&3ꇄ}R^j"Ϥ[A~ azh+b"uI>"Vx:YncW"$\wY4QcenEZ#H]p\##)6l8kxa<~֬&@r^ ~NqftFSg{3 @~N/֧I ?j]A{rE97ƅMٖBq2"GB30|3JI8Ӱx=_ $ yz^lj}cCϢ[tU!_|3 8{^&1 1WdɳuVyS(vhCPh7و^52-u?CPXrk4}ALg,}xnB` 7U7q'{+B[XK(׊n&{b Pv/>I tV߳tV4#iK #maji -/kw{`ZW[ m{RݧڠZzĊD@+@=k'}ۏ=0`RK5ij?<^qSLJC(V`ED戀ސ eFJHW[5VcEu`)OKw=Sig}~wi8hUr2ZWfSQ.tk[V*WTn"ZSk*V";WCU֋ ]y &pZ&˙qn+6V,_YŢ*kLUN;Д{eDzM,uPj3W:*IEju\$X[6؟ϖI ˟\[2 Dt$ʍDBFN寺] F1zbGef[uWu)Iҿp O$m#1 bR15 1@ бaH#fi&S/848lPSr lfRpX`k%ܜZS|U 0[|'E0R4X5AǫG?ǡ.F2a:%SIQ&$1҅5pqk8±t7E iSY8֋ȟI9ږN;x}9/]z`ƪ^/lH`Uc}x䔴ݗ|bҩx =(4г}K5xq|хPg$;ı~CH϶qkC!&>bp%$~7'Hʚ;6ov&av2DlOxM1-u%0D66,+u(41&`=Gwˉ3mkod%fBѦ+ԀEx9.Gl Sa]ZO jX7i`&ÜDNE; >Y><Đcʧ/ 8S'6ؾ5'ʰM l`1BW NPpD6 oir,e%yaTN-d>$g6|>{aƀLA?lA|8m-Q G^v81ʅ?Y}+[$H9g!-ãU@zf6eEAb '^~\tCMu)(L.HZ(}ާ63k#/붲kyoa\h;r^ػ.)?qql|/ʉc˪AHq",[%XPe̽:&;e^5?Gդ+I z/,P*a&gkmxܵ [!~`d$4$aƷDrKg|;8YW~b0-2g'APqvX:ؤ]N3']s:2#)BM-5nc̋i2F^d1)Z3GX:kْ=AZ=hi28<]ATJSl`\Ѳ h2\O5㠞V[?7[~QĈ/t So>M\ij{8*(4GP .5+@-+-*R` c*e\S)9Њ<6։B,pWM>k( Fɴ1F4flIN5gL$v04IesQJChNl|{EX%18o%FTk='c3aO ,-^`ɁؚeŗY?C)U܉ ^Rچ̄ʘ8א𠂿i٢ӻA|ۋU$iY2&_6e7I pz ts.,) 5Ƿ5%@c0QX3UDԌ~p7%gb? 4U&o|THg ^!φt\HQq糇 ;$i);B6r ]Omp|AhwlC7T5l{(pDM:ҝ͵>c_P:~@nl(k@"əu;=xipDdː43|6yM x.,Aa 1iOɠ+B{ 9`rhKP0;LHEq2ًO+tW߈Jaavצm@@}9E{_ɹfq $O8Zt5s##je0d{.BU"t 6<]ˡN'M$Aˬ+A1Y\U,qx .ؓҞG#4rL3]5ԥx0Bg/ΛP_5Z9ޜ-I`\I xڠQ{\+YQ55I-w{0P.&#Ƥ='Le4q$](ց-4O=6n**9Vq2}B+͊l!uAvs]Iɧ[7 ЮB]^iH$PC g +r-Vul<. ;k.XyvRhiFe(C qpͪ &=]cEHm!;lW&|[EY_EJfN|\1j#cEi,貴e?n)rVį)W* :EY#4485${)Bnk]CaXu ~"UFz2Eb  i(k*J3:fc#!voY!mpiAMj35T4:?ZLLLZVȌ=Aϳ&G1,ÿf*iC ť湗NIxReߟ[3IiABNGFbbd5 X0BH sqvXHlXp\ 9ҁضCGR͹VSriJ4rB&2nJ]HQ"4PT$e{],5w͎آ |pVg&NUSX#5:$ѦQ`RBZRɷ7@ -N5$Өd5R%x/XRܴ}$'MjwBOiu7. j0IZ* ,!qFSs?lAY'^T3ev0T,M~ \&Cl9{˳JOHI|Z͂5zžI:&LX4Xn! [2ҏ]_F |:twX a\.bIhUZ˭` fN٫j9QZ˯1=J S n3e 7AVH&\Mǖ}]G՘ QW+~j-+}u\eaPjVn㚶v6bEi{7;O='ʷK]A҄#r !b $n[*֝z*m7UPm{w_; \=Ι.W k_V1:|~wK NPo<~m8,BzeIh9U5?xAOna\?ʶ<5*X u񴤩giU}31TI|0/?- }yXl庞ۉ"w֜Ml".fKq mU7,& 8fAd|1Ac.*%hskk(9XX{I&&);OetWG~y7O_ND2H[#g{ֻ j']Aڃji5a r[ Xḑ7dhS?4iJWVa6Ebx{GYk (wb+8}LBJ5 n/(X4!,3y6.UdV};Ng$Di= W,²b}4Z(}2<+n({$p;^!VDim> \,_Ue Γz( R6 ȹ XigtGBXfbRbU3 t="kͦ58kIFPA{12ELz]5"WpLӓ9+Ǖ^`ޛbk6g74DNBan< FQ"i]m6"N /ь"j&u<'.W M ,ҕδ!.Oa/f.?Q0)&/'CH,P$h6U=Byw*nL%? U`%/#~)3%3Cz ԇw,ex*DC>u_*FBj.#kܡ;xjšńm^I۶u@s!QLJա|aaZ+͌nu듕]b|躝Tict-[mӃƃ`I3vE)! =^乃vGD<﫴m"h=VΜˤ4v)*BSc0Hг$xԝ{5V+mb䌮0$+7y.ܿG8Qs?N?}zYKxBHSq0%G9;hYS019eʉH饇,cd=TsD2/1*5OOCl./t! )dTβ|!вBL3Yk4tJ !~x'CRX$ۤt}n*+]CQaȏc܀­^*JR_l /y:SHs#훅s{q_|"#;N?,b9i+aUpH`ASW\Cmre&ȏp /BG `]4a~ UˉVo>t?;~J|aZF䚱"(t!D^ `JRVeS`V9v/z j ;'ҫ xW yU_ ACFOG\,Z9<-~2ɩ1)8_O:wZ pxDK|b-v;oFJ&O<-JFd}/3 95pC&@ĺ*8#0$ yWKXubl¼o&Y@_PBKfbj~^(%_GYnBISݛÀlVWó GJ(y!ZlY #~Pezf#==C{ip; 0 !i2BQ _z[g1[IsmyGWMb /!\FazOPg,n{N|0hmw%d>>XQr~ "rm]ߌ5  e eOʚ!VpkN-&S=-T2T \²ʽgCoV B͓!,ן gf94IzJJ W/cKdΞ_0]ґJs)/p T.d[LJ6s""hDlzΓ}._QlV,ZÔn<َGbFXkdX ^в0GKZʤ#zBw1w -޴h8HPg;$"Z"OHfGdpBhЏ m\]眔֬rieYvuxFAYF^u/fx4V [>C4h2Aֹ5_L86\ ǪF?>ȋ1Ux#6{۱$ca,u 0)HL",-٢9Ɉq}o9_3>uk+Mg+r>Its=meT ޅlF{=?hf!Gȭrۻzz +N ޵!AI^p]QY?,a[fX~Ue霧z`%Ss?QWV M :c~pc~]`6i2@V]O-ijbvh"Z‚#s,&3%ݔ' [NXLOmG6[Y SS~L=ȊeUd.*͌hvQRvYg&y9cf*I@=Q.hwyrba/4xGH9_xѥ4uXJU+Y N_<{R.Q-*j\f#J ΒڜI&jpKGL/ݕmogqd {}tyLv|vb3!p [u|M%rlrj!;yE-m@,N7c=`%˕|%ZܦGyvFۈ\,Sqw9iICqȨ^gwl!B+):]%OzV})n1ΪT%ymTmj cTu3nW>y;w|$1, #E,nwt $پHɯ SjNH]>7="{RҐ6Xhz-J39|k(vDs%-٪ l]%xR=]ы>!j؇mT?oy%nNq^ L˝̮bKOdxUw@/.kB_]7 eov# Qld U?x^#!.oyr>_ٻ2x(ĩي_`. 1 R~'Bd-ކ]PF!َP{cg\hhr8ө.n̓dYȪ:wBm_5R鄜'wlJR7@=ʊb|s|mp?CU0@3ua:GFx1TEcTZSP4/ehvV8s?*lp/Pe%/Xm=Tg2hݘ7 g]""ʡZˋe½g'pPW4{sڏb &u"Fa9[K78"ESs8oͱ K_dWpkJYF]Aӆ V;rFc ^U}]ٲ* b X &c׬l !DC(S%y5_~nrAp)m!?JU]؊?4X=nϼE ^EOqܰQTH̯2#KR_Zsԇ9te*{nT E68=EcVmWvp:ٰ]KΫa~Nj)F43ZPW̲gѕ3,/;oaѩqwh2 ~j]X`{aaI#" m@= mY?XܡztO=#^Aq XdƟxIpo*dz*{?~{Z} Qi =mܜUHa^|ꯧ}}ӎdQXwScszk#Ԋ#} id>}Tآ KN6̝SJ6`JFAۭwr *&1Y}&Ty%EO(:Nvڨ6ZDE@#rN3J5>W|cV;-!|\ ԽY0q>֣O^lY8u=\?}F4SgDa?9)%|PTT\MA={6fi|alR|Uv~N,[1Em%EÂ[:`f["™z`Yղΰ ;QT9ֵH#V Ѱ]lo6 4wQV#8}炼?h={~KD.xFt>Lrwyzg~HzRȕrt.L^Bn <2sͱDf}+@EeFRiw)ۃ>(ז(kw2WU ȂD^z/@*gD' _y<>(3uf5??"I9.nۺ2l/ ik ptj7YC17$; {+XWP3qßH%/j)[awc+G,[ Yh6>fm24ˉI |&;iV|XC6MqHstNSpij ,RNLűV{ >D11Lz4d@X-N߹i %U 8B֬Ĩlݑ]GwTsTкo5f~H90c|9Vr.=" ;NB1D;@k7i]<~״~DH:ڲ+ПR&i56#1>.Y:#rӱ~(И PdȮ`sWAw~UaSϓj%w#Zh~+ʜгmajj-rPP*#k%i&=0<+R5Ӣbb/4:,JbbYUez[F8 9fs)e$RJ^(ο^UMؘ4DJj3+2 K 0ϥ*nZ(%iL%;LῊutf*:YاIc'hDzoW0ȊP )7ܓVmK7 DF>Bo)t:V /NG@-xa(ZcGx؟ۈTkG-vxt)v/,76j 'ٰO֯Ua };0G*f(4{LifoID!f[tjڢ𺪤tm.__L3ak@]dpzWyZ*vPqiӎ"D'b阾9 =NE\vrO5&5?q)gDAMÈ4h#\cJh盛*nk]R-*MA7(n+A#Q3O맚1K/,>gBgbM"Q(.(G*FD:\e,yk ޏbu~%`YzdŚz >~~q`;K7!7%0VFқ2CqG7`m= M5d]81 [ިKXAge7#e3)20w\L!/ *x9'Lڬ6ǙO6"n3G ]ϰ#:A2d͐.[b>psGۿCKy1 ej-WU53, d0<-dwtvpٞBsB aHu1Zfgck2ga^# K%y*yW5;e}Pe_TlaoQ&;ς3 B|RnWcv/Bʍa{Kà6:\MA(sy.?z3z=,* zdlךּ*C \㝱;KF -Heq_ }!@-Je\)߮ sHFW& E5J}W'=:s% 6+UY *z: w++Jq^Em:~9nMDPu+O; :a6#cNvX<&4XJG0DGd [;UJӼh$6u[G->ƈ# %NFpf] |.|qa;`N+iP9%H#4m.HW:(AEBhհ!dl'"D28c$6CEBiǝ] V ˉ$ULtg*R@R?~ RLq|5#e!p[Y3}yH“r+.8| i 8?u+sl,迟=L@-^P6O0EZՐnG;V q/Y*E$e;mWҾ&24g/^ղ4tެJ}p<%B i Vɘ7BãAqͅ0^4XE+ _}J)A(ŵm|Mn;!g&W-kFFQ clY+RzqW 2BϚ<M2a'l.pu&Һ$Gǹ։ /s {MkTT-ӀÊՎ%&߮"eh1{q90W2)eX5z_fP\X:HI !ɝk1lQkG@yVDW'oK荛%5߅{ƶj0=^c]/ZMK!yȑSmc(S 'e(|R_cɜaMazPI: xp:Pdg(:Vm r19܈Oo!JE/{/NmLf>b7z /ׂ xtݦG_q=@sufCO)!׊c G ZCHۈ =R15HVi}?a7RG^;]X%NAL 9zZU#k[8ɥ[Հ7HwF`&iZSPj!^$XzսEH^gqᤡO5 H|:>LV'Q:?u_BVcCb秃IgNQ]nDvQ R2-v[P@TN$M$lrRG"e3- L`EKjC_N`m밅z5(Rg'>F/xxd`XZp:C@3ܮŏ+óGG,˘?{Q'ca."Yda 5@q<,aed\# (UV@ˮ$.j/HL/:̑{r3*rNɍ"2|l/wJVy7Ί[ =Hߘ3_Mt>π"NN+ѭ^ {=r 6r;2~QJG?ὀ\B2YmBv,?5NZ?>֙Ӭs\ؑrGy`d|YuVɏs{p­ݭ CwMc|ғzaa'Z=?ݟB5`,?T0/ Œ&„2k٧qݢ 8'C"Ow5%s/Lp,,Mc> *a?Pd !vvY57SUL{+{\C:ZZ-ϫ!,MYyΈzo _CIY[gLLAzD'wH'Ă|}Bޑ{JiWZx8 UIT:pK6X 0Qt?$®wi8iy] Kd_vˁ~PlU~ϭt6 W($󗀶~< uegm^We(QN\)Mjy/X#Ll)´<\@)kL6Y٩ Z'uCEꖛuLeG B!D= CҘ@%3zPl[ B`Ntw^:XrGOk %hɪ_iR"6bCZbFx'qjD!r'|'KZ|ߒ?MY۟M}eIf0}V 4J9sbl? $q{PNjY=x>s2W'I0h3OZP -Id#|&&nhX ur>`r.tEjү=}-.!5(B&c ~䋊o[pi;8TʴSV}z8 (u#U3{8,N^j_Zej'b})ԁ ցO`M|c?!51(hL0F!St*" d=êE/m$ś^7A1%;pzro"1@t;T]Xz\e(ڹcbEqyFW6vɾ SQC1[3ghvHf8E~BIU@!PhbB W'|sd85{H7CGk'?90jܟT-`WX{.";$Xy!Ļ˝IŦ9}=C =?fJp\4IYW1Q| 6(dZ"tƎؠ7%w9:KB*SE/VC&Kn[c՟QOiDl9 C螩sOw*kuN|G5Tg$t8%n݅VKh 7l }˻U2KUae7?efސNLo \ kI t/Q/ktn >\Sa[>w:/$QFtmU=@&<aoA%޵3J{ftU{!z j.I-ΤIE{{Q _pu 6"5J ^?'%+ z`|ьGc#alM~ t0Ii)%K61vI/Xv`vN^_R5x@vB,] Ǣ7a? 0߽`R.d:*/q!p%;!9^ *a P(¬2,n}0'US %_B L2+)L]5|Xdbu(| ;I:wRo~%z' TpN֪W/\e F׽ endstream endobj 3999 0 obj << /Length1 2938 /Length2 20931 /Length3 0 /Length 22573 /Filter /FlateDecode >> stream xڌT[ S-)nA;[$s{o{c ϜsZ%1P֙ `aagbaaCT9['G::ls9eF`C;[5`ca#@d P`)=A8@cB `f8@21(9[mMjv& \X8;131819 2@Uh 2@OjLu 5;3g7#G ,mG\lMpt<@h `eb?9udk0YJL #[_FNvFF k#c_ԍ"*#pdwvbrYʑp%lMllN&{0\+[;7[!3ٯ4L]5lA.@l"2s3 tM,Pd%eog0!z9Ύ.@?ES3hE,wX `fjgk3+JQQ;w# ˿/FOw / 查7x u:_z F6 k, ;~_S-4_xCDlͭ-$I4U9X51kػ5luYYXr&V; ܬT@F7c9:y 狍 QS_ `fs9"j)'Yo`bY70KY̒+Y7b0KFf߈,F`.o(x\#0E7sQ\#0E7s\#0/o>g9@& Gl\(A֦l9Yn/'ο}FF&VNFN%vC h;WֿV@+?%1q)Y8~Ill~"0 13d]3|F\!^f ?R۹lb;Xo+ 8hX[Sbw\X~##s;'ؗ-]ph[_7o`vbe'j[ aO9XGjÔ/w9v#1!_7忾9~ 휁ƿK~;?cey >w^9]('؉7pgX~??F \Sg7?}N 5';??  vG3ؓ'oybL\]u+ML,kV1 NSh2z-:ܣ%Ve;^$ vlK\]"y:j mMPi{~4SiC\?%B dTo!Kƒ[{]oH܎nccF;\Y<2XgF"x:3wi8zD(/ Yru6N| |]<"+̑I*/dYyu,Z&^>=yL\kE^ :fo;jtGxfnnR {"܄9қ*)zxn.\]Ԏym! na4?:`)^tz[Px}?vuWk+8uAEOJCCr05;*6cw]zKL'#b 6 f}hnJ" W a^Э M!-ʉA؟FgaoeWA#88tQ%-l&WRq4V@mZ9-@tKo[¢~5otǐ@UdmhM^D:fN,?/a[ϝ׸oFWsLOcQ9K$ Qobmgqvu*SFWPw^ڛywzs->?dj=>t[*6X-7ma}~Jk7bߋٓdϛeD)Ki챒r28!oqԹEVQÙWc#A!5Y>YX:W.e$_8cEen憫pKrUڣ8XL ff9\Qtڿ%d<158Y!lqlLHEhW`NPFNNs^B]1( xC-iJwQ`yz/ O-(@o_Rp^`CN 3CL8XcznH,-H*x XYyۢ}!4I԰6iDHrhr[(Bʊ | ^jRloeo3;ю[޿ `ՍAŃuQiȢbhaE'XSn[)#_zԧ!*;H?r _K`"w 7,v#ȔJZo>}-szn?z~@]LlJ#Sڲ{]1GcX:"!1W \/1hTst/k-wNⰝO= YE[֜ƫ L}MEEWp.M5s P_/fLN|zړ17[ uoYOk} ixpR&2` g5 {c^d`B`Z*yXbpV~\%Մh)xG{ "^t2[*V ܖY:0 ܒS",{'D˓'lH2fwx_YeKˆrtO)Y!n9:ԯƯJh/H_d fǏWɹQ;ӑg}zV*|ohZSD )O榌}i꯺A!y7ctG¢!׽0hRܷZa :NSj}qjs}(͞t]0w:{꾕aK2_.ܩ}2 n&e,fЉ[ *oe%koni}]Fo Ua.o#Q+J1ƱopeMPX͊hic ʞ_4WKR]`y_81"f5B7 NN me k8sFoR荀flg]nyXgmqs=Q|BVJw\r]TZV/}$ꇋiՆGY:YhLp")b6Bv<'='@3$ g&_of ŌYj1€GaU;T3}u CqlH]q5ك7*# CVSBRR,8K:kGY!ST eCG·r K^GMӷ*BZrʝWĞIJ[-KTTgH{W%tWׄ6ȯ::nv;JPj Ҷ7Aj\8wgӮRvH?xQusT%\uԱq(3¶3BzD\6Z9T&9qeŞt*%)j;t${֊' 1Ư-CK] zY :l B3P9s1xN-mKxey-PѧZ\I [m%\Tbs6q;b u|nX)3zS_[|OnkmkC^'X|89Kج8eӺFKw= -z`7o-9ء@ ȏD6"3>Q|0o@ diwc+ IbP<,ivkvo8OMk-5BT͢Z,ʌ"c %o٪n-ydYZ;~2\QPPL.|"TDh:ioDc]"U1١8㌽}:E|k(q=0SCϜCwBbG@R\I1$(zHf ӚįZ{SGt=rixa%Q)HMxEW˅,; ͹(aF@9M~_7lZ\:.iML 8uzVgN@⮟Hu <.41d甧n[ CInN^04 Sd6-B:`cA;#0+\7rڞվB jf"sQa񞡬hEьkdRA~y{ r)F^vr2AvnD]Qq_1ʨKv!d4-" u -C+9󫊩y(%\#ÇȂK|L0*tA6AF]QBfrbyk;D8};81BSPc޷`P HqzR~*zKIJ0 Q1]L,_ }ȕL@0`LQ4ހp[x5KflM zƇeL>s]&U^]oVqF<.CF!Γ&V!xGa2ӆR)<&Jr5ZxsS3By,YWHE㛴tÕXfbp[:[awԂj8ǒn}?,2v6ˈUx}wTGzcɵM%3/hsCI񦖄Mr֒,B˵Ca5%a6D2$}^YI6UBr{s= &ާ pJξ'_̤~}ki1t3FwI md5cL8LrY+l3j GtOOܴA6TZ#*3( u~M!?Fɘ:%ҟѪq ,ؤB#6Pt`c9N~?]}:ȗ>EDBo$!足Q2{O7ӤɶNv0i/FÎ$~SNKij%RJCnIt$cO1 &%ma1i̐RJ" Mtk,RKkvɡޤ̥5T;jr1?™qPԔU;+;p4\jʆavnyX^!7UV=@ mSF4i\_ڬS{5v p+qmwx?_ ͩ^]gqnI[Fj*}^a1>5<*@USS {}yCNjٻY_ +'êߺ,ʐ_m?wL# :3k Vʣ?Mp)eP7]4ݶ! Tsz69ZoSb]jqsm,%>{- U"6H٧_ PyiTɝf\kM,W/ҀBAlF8_Ldq!3C:-K^}/cjׄ =(S(&A,7c"m{~+u}振,'b_FV;`v˘ߍh^ˋF+q ]*8͏yP6_PiZ.W]V3 ^iBQzQ`IsXPY6 sХ:s.Kp>õOZlHEn}Jj9Ad~)ԽyYwPM^$*#8(cqdDkuA26] -Εϓ!F70K+P/#Sj>D(b87K@kCФGPח$ebc7 '9H54EpT(WJ.8!pb!>kLU#5:1óXe{:/>ھ|xP֚[JgMp'EᲟ RcbG?%$p${dHj{ߧI'K*-^ıKz(q BƐZN3w}ht@.4e ؊24'ECImO1=hi VĮ6j 㬫r߹g4RF$U gV=1Ze+*9B CقbtXyGf`NT]p >t$R $}׳ίZFsXxVE*,e|sf(=Y[O|&KwÙ8}^I8~xAwBw'ٱ18vbQǓM*SQ*ȹDۮ|k%.GGCE.w:9e1D#Z,n $a#PR: ly8'tPZVVwr `Jɤrъ5SỶV#.48Vaj."{ܽ$Se] I-`W|L&O8rHm21f#a:N2@Swv S(G˶]oۉfAHވ=C7Bqy`w\GNGwHҳ1uZjLu;‡".ahۘKE,'u F~G)\ѳ/lO_'Eq[#Wyb.[ %3HHe߻!#fy5hG25+Ұo5Ƿ)Yhgx!e֥BhLmwꀉ# x2ēIղK }:ꕊDg[ۊ&SJ'ڀ FZGi}F>9Ɋ; YqȱӥU@957 L-u)Z'oسf*;ЁSTɇcH4FCw~UX{J%G477vf|g^8⑥rЙ_ orBcyQNݳ_|nD{2E0̶9$e.KtxR0oBPg˫j>;V in+CR(Frʯw؅0fjx^`6mQɽXfVO٬yZM>Q2Q^nlQK·74P/"-MXKF~XOߔM\Ve_)_]bHjXCpJ!%qUK܌6HitdxIfGn<ݧbg TAea0|ުGWaR$Z"=l荆q QFGc`ٖh Y.ZmM ygag4)X|MӢOX-eBPsjػ:ge)_axjXiHL`zTUe1ھ`roy\->$ףvCH(" g/.l5I!3xVȻ[O`:5*P~.nRG| buaݩHOB#!Rx ;l>n̘[1c%W[oY I 2-`t1LpbK!@1a;|v^~v5 P{9<,N[ic ')R2sxε0dI?}lB"6^g;?v&{ѧܚ.~ي$=`Y1۳J-홷4'h 9swS5P'>:ryBc<o%i"廑"6UH$Jg\;{q+NWr%?`Wʗ#=J2ر01%+jT)PL:3xl)e9G[VFNdQHhE޹ ݽ>;'50,A嵒3UKZ(P )I 'Vuq vҒr[G:8ql4g)ιȘw?ᅤd+ne(dQ﬒j]{3ӎ\@Dښ |$Zf-e4UD KNdFz`B}J/r̜QpoZ=Q(=ѹY<1ʧir ftݺ&d<Ǜ(ts6K=Y+%,gY6 iq{$vosI}'5^t?^رgA Qœ?7g).2 s%mf?ǯ '(,g-s 3By\:屎@<.Ry̛ ⌫D*y:}?,?ߩg]Ƅ(+Q%^(Bd>y]깭^99]47xGDͪBEz^ҵMhږ:lT+\ˏ7hGynj8Cb~϶^6xjݶFpU@eOH9嘻Rv.Cc9lySiM+uT"\V䉉[[oj랯*fc+NwwT`hֹTL#&.-fDZHī@GVi=#ؼ츫oj@~2?_ztuCc3i:aVyuG|kSUݙ5 ղj#1l1C +z,KyiG Rr"~4xjx.2YO$lEؽ;2Y&z{95KڠMDs3zM'+̡ b-bkQRa5P6M3MZ3mhNmQ?^0L?"=L$b_<$lZE:\+uȊ~j0l~;b9Q.5w 6]EϜ'G=oԄȤb&MF6Ppjot _O f`*x[X@$jwhs#CֺH-="[ewiRQk.i4f |VY#已;E#WAvDبPp6szl H-:H*|DWr+4ޘ@mw}}_> LݔkJu9;6y ~ AUJm2 q>An')Hνq)x-01E #kI`{b RC`R)+gT/ihب$rn_+t*בb gۄ'jvI`H)?w25ވg ilzTxPx=XR&_,g[ (ؼS1{&;>_/m|VL`90a;j0=~"wïJ"HY ݫ([JxEGs.Xį?[J*]5542sP7]mtS/XaMVX"bӏ?V\|I uazH[ߑvs咲+S$ߣ:#,Z; l R$6@r&^OAL,o2zi:*SD XVF L;Fٖ7CuLEp􊆎9iKt<[FM'T>VKfOP?4&ӲA^E~ZQn9!w"sby,5)A첪tu޳X۾:a БZ81,+w\T СhUjq?cТ9iexC,(Be˞ LT`Q҆&܅[U:Qר6`]#?IӀY hn*4 IAnkaoɟ%ݍ~0;uf(,q馇="A-fXw1&g՞DtMEJDZ_s*BR7v9Gl<ݫRE@0w1!};Q,OT:GZ+cDz=%K@k}-d>Z]'STzKԁD_BQZ^ƨayÐYɈn?ʵ*L7PFe>ʷ2&+&8qA.,.Th.0fχ;YA(g9.ï$pSK3N7>0*hfCǤW@]l.tt]=,b1րS K"KCQ2`[xg U6Urp{d1?{k ]+hr 0; Sa/'ac0jGlw/myIgo>%53qY)I&ۖnZ~=Y1(ei.nlj; Fp0ը6hy̳8$i9[lJ^琉yrQG1P ȁrKEy5FՏک$cEi V}ddO 581wHڌLgCS5bnݷTy+{3VoB!"TŐD ΐЗi1 ʥۚ628p_?H#VWGup3* A3hy|'sJQuB1S>-;U-l=~)F2ks #or=!uf^FP>ch ;0Eʉ~?YYJf(ROܧKt8/$E 9Mt<՗Rkwe)%ItpW8p ݾu$T\Ϯy6gi}񨽥M+! fbiت@=X{޶hd |E#AILt6AEH jACԂ ۀiM1Rc]}\&~OLAIG<լGoۻ$3A|Q)|bBw18FT)A}ZUC b'e)ߋ&o?qs9ゅkfȕI'rjW4v^3T-n~i4v= Bz8ƈUHx|;UZ16S)vzFKņG=qY0=u.F#ZtERY %pBH]MBF:!Gi)s@dy2)FTsH%qʠ47EiYhAJ "7Fe:YZ=7iXsn|ȹ= a82fuƴfo>p5uUN5T+Thu2I4dQh Vd K̆SMZR'KO@R^4r20s3&JF/J߶@Cȕ5 91MOP:Ihᩢ+#n!0-~14z = WƋxXWETo{(MinuH2{m#2rw QlP☪}lPWFHl hW1J/^\3m[Գ"a  zj󵧈|ӥ>hoS *gWOm~9&%O,R𽐝8Hm:ӴlQE#bE] Kq#:guXsB4fxX}q^OИ15rƷא1ݘj9_; -]'e؉VQ2QUeC!39{ǢPJPh_`Rq5v ?.e{̉e$/F;_!<>edLN 9RXs{K82E:">)^zL$V?j 18 _>/5Ӓp7E^xl9ĉת^V>.hRZ  &iu0 bSfXXR8}q֛5h4Luqr^WuKtb9-Q&SHJ\gb&(Ew+{ ,&6#hCѣkkX8p: ["!zrY"ݿ&(]ئL F p @ra-T >8>H=_oNOLjXzgedJQƢiT!%w |$ f10hށ" ȼ+'v#T({7 QX42LKQ/ιĹ5d?:&XQf"gÿCm, 0g瞅2Bg@tqJI:Dc  3[-C`YweewU,{dW8\gS-8%z`av}˺1D(KtJDvOyKOg9ran('/꾗BG/ 6.*]zdW4t'ɒ~>Cc|LiKwy7W/P|e>,c)a_rz<ב"Q6A0֎樎>L<}xm BUu_{Kic3]dbyDa\ܸ됧ANq7RGN|\H%PK { Nރc<:iy^9@B&vv+(P([PJYW˙B{VtUsYm)t+ "2vM~8R~"o>q}Mb;S;ϋB9f==6V^6p8:iHNe /.E˝M d{!oHע޹M wpVi?)ZhvVJ'dg%br{;~Y"č Ul/$X' C3M>*S%D#%}) J@jA˓:E8F}(<77O\;OOb?|)^r֪fEk%w 2D*:5Ak@AM8J bqL?m 8EHq};fܮ 9wn@}<}c ^hhɁ:fUD%dІnt:1yBwarɝ#;ޕO[#tM\jaX ΃׶R̢דƝR}l ,%)58T#Xމ-p:{V IAz{D-Hiʌ0Pc>yh~n]DBR';ouAE#aJeEdx>!|}`$u_F3J.BnD=6j[vҞH 'BbwXfv-e~'H#3~dBў6W Y˞"J{SQC't~i\UJZ UhbZ(h~Ck(rŠApGKnx7ȗQbP;e{IDO؛=[ j`E1iFl 8%yYHIQB'D!tkجʠޅCh+Z Xݒ~;+g " Q<%ƜEmG2cBjV=:jVD i5%mv#A֙΁ yV'sXΜ4 nZTunlVg _`H ͮR3J(0]V|΅}7,;O旕IVS?-)q? օzcAQikB~)h;l`*c}!r.ɬ8&=[a/ @V_nՖ$~HP,GUڔ/Ce{JBv5CpXtTT7'3#Cc8q8_JRێ)znպ+B*%nas'5$h ^vྗWLIy0x%6S29f`t! <ԉZ$)bu7!8i[erJSkrlޜZ0yԏ_8x'UoCn30.LCu+<@WqG}߾pO3t۷'=՜[Rtcw%k`$N["s_\O`8{Cێ%;B+QCu&`<=h8"6儚z)BXxh )J{"Lb<OL:80Qצz&]ˆPL*_|zWe{){ Pyfq%Se{P#{C:L)aZyZxcO+#ڜ޽ 9AR5.޽ٓDha4Mobi'}/Ts)CIm#ji웝Qbm}m9Uv7dRc0q,/fJڂu?tLl; ڤilArxv/s<8c];`kM"d3e/-7F#Z}re?` voV9AolvL!7`Ĝb1 T왂u`3m[Գ"P'{{n-I'He=:r: RlM}z2hE9¼Pם@Jp2VR'k5"zW3fK{0'PZ6ZdϦW_͙q[2P < =1}ZvHOۘ:}Zr (hɭ n"<2.ޭmimt# >1l>vIAp1~y 7iddr/+ۺ1zQ {N\?ʲrx<_s1`NW$W#CRz1q6{ cqBݾ.K+7J_4`DŁmt5c/C 7/\L4D7H{f@pD^EaVf%KŝD*0x=s-V]SHHH`'v},͔;P/YO m0I_<%m[>*5 $X KĚ٧UO*KI47(ﷆuVνU$cߓ;mOOV^WlSiTPm|Gh6";y I;:0sL\58[.QeCHѼ7`6ɏiq<nP M {`;* "#[|<# 5LVi֒ŽWk endstream endobj 4001 0 obj << /Length1 1629 /Length2 3670 /Length3 0 /Length 4682 /Filter /FlateDecode >> stream xڍw 4o~ZQ"03;ɘy co"Z,lٓR!"BZ,Y BK?Μ33׽_s;#gb.!9$"U )4 -,!)@H0 ZQ$S$_dEd(*dhH"z) e䑲 @2$Mz$"Ha 8*W@- da[HƣQDEŁnPF4xOaE.{{{($ SqH^ ؤ  CaNRQd<$R O"$Pv\0v? ~~zoQh4E,T* @1(Px 2*h(O~4NSM0P HR7ēA4w_u%O`7i`<ᧉxOPW $b#s48)) 7X[JNr 0F dO0oſ0x4pD?!1'};4~H 4a|6ZtN[NŐ -!IF- 6ğxD, A/^?B҈f0"A !@Co l&3:Hۓ@ 0(7<4͞Th3 I~kjXgCtV6DLHm&tWվ w=í */ 4 ghM;{z93]Vt*Ǻ¾k%B%ڇSő)!L|JO&_4[Yƽx?dzz7BNۅ)Rqo^ޡξ>P%X]T..5fxy4dG{(FovA>Ք[%ܑ/92xD&QkM +4 o ]4:}_磝YH6 54<P cd#Ǐ uEaׂ}aN'^-DvHQz*M'Ie{?'F')ϩJO*)WD^e3-nU[g:F}gg~"5``Sic=M3:a Y iGIgvyCrr`]kF\퇵bMBUEl,[y{{E j:vq~Upvz9|Ii?#>7yܭSm hF|n25}\[z^mI=ȶxhTzعQ':w 5E"}wKlT3{d}RIdd,$cNr{45g,ofλEUY  ,շFRT_;gpg㮝͉*UҷI4kjBfdX>MTߚpEi*FK>"Ƈ]҇./6a[i{~D;{fl7פo6*wԎFgR*c|9Rj;cklMr23qXGo xZD` čm:Lp2i텞uMal!/g >RKe0pwͧZczdlMl'}}PEcv |g/:c}pg ݡnYDȞg_̳/|GqQ8ywuA?ۄrЛ<6Ѱѥ3f`J8^-h G M|ԒkFD}yUXzS{ԍ0{ %$íT8Zs֖ieC M;7a"-7t[68|aI*Y-#0Y޲bM䭦]~]4Vg so. cIV/<.oJ<{Po6z޼.RZ.u%rcm镭nWdqM^!Ͻεq,T `u]J6ud Fk >Wz`鯻'뉗hn9ENwV`/$']O_f 3\X|/U%t~c.GjoMseP ez۲oEvHӟ?b-g#'o_Ksglg3By҃>cʻEh܉[ʽEi^佼9NA^=X|v\KÝ퍅|M^[3i;5rzظ qH} ZV, +5 ؖ=7Ok9dyHV@}!÷2)9B.BOpn4+[۶J)-V[_kUrYSVA&>hLK˓j(./5:Y+Е]:Sk)r o*&`v_}Ձ7s'f@e!{Yb휼ff74*|zp3eMICiSG][T7]–|*p4HBsa%B7t,֠lk.ַ`6mo|;lfq6&۹w!:ԐCYHЮ+W󨏳䟏ʬ'\xv(өRؾxp+w`nkV`ҧ)Mvޘw>ס_"knTB@wf,\i=-;v$J*gƸ.Mdpw#:D1gfKņB0ggɳE爓nڇ:Ě@E)Âo SB3AwTc_~JHqV Okb" tr|FÒ#6N_'= S2Cl 5"ZjDD"qh%/'bYMޝEf]S?|x`R$)GY̸h*@s> stream x\[s~ׯsj+/[SeǑR8.?-qC I9_7IQ"%v{0@PcMЍjLqѩ&$m,n\cnP ՁW&46jrq^ck\: Ml|d̹ DzB3& Q pg9 jg}F!(@΂ }^cM ԁ%0g.5Fk2 d͞t=0c1C84},i^ip@B`KjD\ABK6 )0,ܔy.)(r%EG)0*&IZ0F%yIfAz:gM4 M3NBi&0'f,z&955 ϠY'9H 4emMΠh,Q &f`~2 Z,@ F$Mh(&$&& CT#PA :H2diFzxInȃtb1D! >`[GYzY4Gg܁f w*Gg H&9 [d,%Ch&ChmLF/Vw~{>i>L6kȝ|4=EF& $ob9!>P^; ^tz2ԃ{@{ց%z:2ڞ5;e(No,;qhiȕqE7`|h7Oxu,Pu9A3Dilr5=$s߫xAF#Oi6&{h<ugkdz:2~}>o  cőBTjBY3$?GÎ> er8}L}t2NQ|>=; {Y!gO@KIw4^(3'rD/YͶ4 ǟ'Ӌ|x2ku^ 8{Hϓٞkb&P T;&AkeA|M34״&Ǒ{h;|1E_ {M?"p :j#SGGUՐ#qOF9ɑ%#8z)R2 d.O&57B J) w֓R'QpeUdi*=xv[ `*żD,lii ON7[h Q<1[*nH[HXAQ+fM|J[ nIVf|ºkd)12^`&%Uĸ(jgŖ.MW'dTX`j.:-+_3 ngŗjZ2w)h/ AhT/ܻO[pV-Q" P(7#&6)(PGq*1I`ʪVkv F١m"JqdP4ob=Q!!XP`w$-irDz#.! IP`yKYlf[}1whcf҉r>[)F^Oď3di 42F{ZͳQl`N 'Q v-,+0Z #,@ȄVnQ/Y;-Z dq'bm>~ޜ$G )C~|>m\[˂ ڡ'Pnd)r-<,STh&m d!siBdb!`0NBʖD'mE[2Efi߲5 *%$ *r`9昶ϱK2Pe!eEٕѴ]uG#BYn cs໒0,fT WܲPIRmDw mȩRT6\Qp24PQe ^Z3W[ǑG@;NqFfK@#Ug<+Vv!MTB=ֱ3bG+E/y׋ī&%.֔e cc\Cq0חQ{I==ٚ%lR|V]-ms}BJ[F$Yg4FBu63of{JD&P(^9_s9|O?q[8 ޕoxIsevUߦ~^ w IՑ'VJ~Mn}VZx;OⲄx>MVB+3r6Fҡ`U\B G92/nۧ^pQPZN\İ\Is)+/Yq̆Ҋ0$ۢNWwL#؍ֲ./GÓGѠ!G/2e[?>jߵOi}پj_?oڟڷQ{ܾk=&cj/.i;he;g3/jڞ_q;lǃvNl/\)cLd>v_l@{ϧA;s^_?ۯ_v߉T+n'~yXe\x(lØK ZBFZl8kO'`6rdԿ(d>M!yg1p?=~WlVeEjo;#ǭF~Bf;5,ڝR/5a>ӗ?o >Ƒ,euUUr$gg˫OՋj_%6\V.k0O'@^/)fή.t8j i9͆Ǫ͢+x-FӚl?m~Zx'.F3lΐ +,c,OZk>>y$諭КKZ:fk! ]l.)E@=[.QрE_QE[^<;}mIMVwߨ<ߪ!D{ϟK"&aj<5Y 7Ng^<,Io5JpKNML{׏_?|m:չ+ FȶHoU7Oj>h|gi۟ >M'\X=ʫ )JUZu:s\]GktCu?R pEvi8 AWlRb(:{~x%PJ_=[lzHI]H-gJ&\&M{_fn b_DwVߢVokZP1ohN*ZVWlso IjԣyD6uf}^_^=ya-au7,,g0v^ eVJh매7myq'fHMwK"d:!L8o?+s8K4 ZqTsq5/G(Ov S4_(>:|^4oP S;~ [ү W|$=Tv/GYT5-|ƖsPCT>`f{GGOi޺gɞ~=>ejtv2 'WχzQJuTV,, ԢɈX+gAtĜi9l|AmE9L7yL/=W3wzx>d,p)%?. N"?_UnHbٟ̀cuZg!bAU,? 뇹 uTM_Kwnk3~PxzbN?m`Brm_Oi@~a^QOm{ABتpi^'7?v:j߻w ï;8>k|JC[mP̿fVC[/W771` +C[/6b:kJ @f7\R\ 0/Kr mq^i xU*,w#$GU 7f M+DA*"L2\H%U+ZJO-Tw%ՙ(qY˭#UVE2x'^:Rb؝IURJ)X,E]INN]e7h*2u\S&#E*v9V=Hqy)M߇Є.;#% Eʯʝ 6JuRИbc;Re9ѝw%h:&t=%}HufJ!:c;ױ&߃ޖ(h\-z [`6,hq1 endstream endobj 4006 0 obj << /Type /ObjStm /N 100 /First 988 /Length 2189 /Filter /FlateDecode >> stream xڥY]}_?Fo򒐄%o! effCSjWJw;=~sdYPt) `]@P`L`FvmRۢp]ŁoNҖZչ`NnlKxԜ.U7kZaY0,^NPoX+X˂ HL;lY_cӋ#j̓4ԓk55z^Y#Vi#9=FPG]C |y5LF0μPG\qsD^a_=4G^ul!Q[H<*.dGx>µ${)]`k6jH7U 3uTmanO+X:* +ǚGtv-܄ohBүEjgESpjGx8"^vG>BKu"nt99JSpOsHqGG卤$9\sz#gZsjQ3jڟXSY |8bGYyU}S>?^*>Bkv1KeaڙG4>^a4Vݨ%}_ßۇ_,rߟۭ,?>?/'Ǵy0A_9~/)|4w x)z Jq+Rާ+DH!@֭-+hW %B !+Y1&13̐ f[ZHiX4jdHlR `*`D_w($|}9_RKYe$'+RD}v)RL[1xE*˥9TS-kil ˬ !A赅R Rf2]Y-ۿP_HJYvIJU&L95S_J,tː{bc&Ma4-WKZ. N)l4N8boϵU Q(@̧*\jl :b6m_cz^?@9뇃(OP'ByO0>-~<8;6.88{`dp= =`t{7?,\?-s0<;M*ap0z{6G$<0+!> LCrC}{On8h\skqW杲W 40 zFay'4=!0BCDg`n?"^4SMCSh0OL:4SM͔DL) endstream endobj 4018 0 obj << /Type /ObjStm /N 100 /First 919 /Length 1907 /Filter /FlateDecode >> stream xڅY˪7WQ/A0@V! CHqB>?VJFwqǚթs$M;Zt\!G|79QPuځ<(S䃤 Lz~"h4IIG(dzPDRk^KI_=jø@#Ѵ*%v[2X-zYv\0-Gh7(fQXZH!4-5%@Q{tRѸj{M Uht2ddRvdHCRvhMꜪ[V/dN:~JAJu *NK:-Cj2A`A% &# *G3mȣ+ "dt6!=6|PJ_G:Yz 6F/L)Zm j6H!ڠk aRSՁV JDfdV A??MIdVs>@_WL])VYA?֚׾RUS꧝:Y||_YGݠ=>?]|PLX@.uC+Bvr׿M%~.7傾SA0.U8.+5Lq25G|yʓt9@xʡVy*-Z^c^5 g$jZDvSM&UjmЍb>aL`9 03 ^Mh{@ђIB`}Q 8CQx EI~Gp( O;CQh(B((EPDW PT.:iLO8 ;j\ٟqg\IHBޙ,$\m[uP:Vq}E}e!aKsvo𲐦BZ/ kSqI =)/fN7TW@Zo+B A<`XجOBH<*B3]v(cOƕ>-,J qioa[F mg lf^e찘Xl0lJ[IfJE=m'=GܓqO[qOd m4q OyIѼ :`ښTE꺇_0Nte:THj:TMYI-xpcٞyՈivkPJrXQň/%>sbTg ueee'onT&C F3+ ̴`v^()Ō[^*ci񛽤΋G/.dbV,m+0Xf̲DXhXeLK"c3fY>"bYx.aۋ/} muw}.eZB d5W8,1re1W|hPR G bËskI{nX޲d5rI1ůȯZ^NJ2սJ6ٲ죋(-ٲ,b(LZ^8LZ̤%ou&}+w.gҲ~#fҲmȤLZ^Fi#'r7w3+OnXx]6BN+`2hI D&6E\hrab9ºtc]ё`:&'nwa'Tă 5$Q`WF;!"XgU? endstream endobj 4019 0 obj << /Type /ObjStm /N 100 /First 885 /Length 1851 /Filter /FlateDecode >> stream x}X۪-5|__1? &[D' (~=f:cTYV/mloM{xoMo2wĖu]7ukmg}a .:VXj+uSEꆜM@bFV,f  *c px#):MAW6mkޚKX#*" KCmw\ ޚ*l͚nZt,QXߨB%V@xQmM 4 :!O$ Jb cGf!,} ڦJ2h }ߤ.x&Srb. 2(F,ʢAV# *A 輻m@TPt BѠ4Ӂr :,yhPT AQ }zG0 CZ Cy1Ԇa4c~xL՘Jc~pA!8R2fdLibݭ3A:у2sLk~dP1a xmw\O~?vOvqKw8_o)1 wJ )$GvLu]g2rcU˱謒M ƙ<;|G]uJTNr4_v_dMςkͰ\RX~`u2`XȒ:-rº\au X`XĢU3,v%rr gtƶ9۶5L<]q>tQtu` ~o($"5k^]h 2h& b9U".,eP.C7'޸)9kxet vXGt^OB_eI]RGMGԕT+k ['Þ[8(wbx 2u/Ve|Yݗu+̥]ZYi3^͟ a<RKeW+|iIu貈]< |Y.2,qc}D_uMt1iwa%i<%\|$ޞғ;S9KxI'9u%9R& d@8vI-@ d.*Qg^yB{b'WoaQ'^S\qDX}".*$E\DO+vQ3wɢ_~AijSMIȉ']sp4lϜTdz D@-J-䒴naPk 8:J Ԣ@7YG%%e(ݚ5Xږဪ^N|+O*N%_3ݡз %P؍'#RP~fFΓg%eȧ`'25~+q徔zO2?d|m)=O e{z ̛ݼy2 +X9gVn͓OOX5v̓G,-`e9dwYW֕1v̙1ZbՀUis#$=Zr~q62sٓ~P1#'msd2w#eO>3QWU>? Q3,&,A,)TR3,juD8dT%T;e~xeе }r53a 8x"(NBY uAD-:J% 2Iee72I8#xI@_gUq Cmr$W ( endstream endobj 4020 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2289 /Filter /FlateDecode >> stream x}Y]%}=gR ;oB6㐟VKS۷>Nt-'|GڂQgبⶫ[q#-ϰJ*uˑ7*q+o5r޼sH.>#4SI@eg&dA%{9&ڈ@13@Ss p.sE(ۮDW֖Ծ 4FAg"W`Y[@Z.7JkUn`y>5O ^AO 28n"jf-spNQ( p.>|L pG'p =m^6 *s2>䈎'Cs.zW0*XH_>qMၞ">Z:1 O̍F$ h&=!u%]GْGYGTA$jK ~ Wk3_PеvpU.=pnjL-k7FCBBr#8UʗX @jW~z|4חd__+S? s3WXs.rљU.Uhev#[Wf6t;^ݒFI=qѹϕ9ڹh I盭pDWEVB "c>Ixm7IYלt.֣&_j1t5,ZP1ԸL\q+z;}X$~Gҕ >xv/V<ul!.s)M\a*1k C"Ф$,I!tJs)ǕPn(7)&o;.Z}hi5 V_u V ݝCɭI{hJzkZCǩ(Ί=w}5 ńz]Z.^"Y\q.%2z l[CKR+BK!U3隽c>e+_Ejd<y='ƀ[Jj\&4ƕ2\dSI ׁk/lZ*#/b;s&ߠZq19`˃PVa>s1v#BaI堮ܩ;`QGcZt3H? iy*Ti>k1-EZ~*X͊Y1+ʍJH@E/ܜYY)uG ʕJ{KHJ-j]\+C˂2\ y& Z:;d6/(VkIPdSG=MDMNҧ~v):zŸ ɠ1bJ)6SV^IL+)_OxE˜N&!PH8-3$\M {tiH*3y$LE*3-$L?w""&^}SpP'N35xFnէf `JN,߉YHa(^0SaFWlt;1+”z2)”"L))”:*0Aimxr'fE<*L)M”Ҕ*L)M<ۣ-;1S”*L)”*LyUi~|zQ 1M> stream x}\r9+@i66_͡Zْ^DxVU@ I[]/")ك,)D{KQT CTs\]rK^K~ .%$gM&YBnVjeqj?-H5n7EJFvTfVOZUV_ {S& VQҪ՞ڒ&m%dR"j=*d%%K^R\k>fUH>V (ؔ>{SF>nj״5^|xM[MyegHuأbãrzʇZjkYcH@5RQ[l3P[oA[δF18c|/芰ic9⃶ RY|mM6jRI^[m-d=m-{ U%Xe裶sAXjkk| V IKsq>?x?=zyX[wSw`z9:0+z<ǾҪ??}|{ VL{鿟?$]9Ǐ/*U*|(ي/Z1J_?%&LD?O߿^Nlo?_mDE//gVvgxGsTCy0̷{o 5}fIyzr~;}K{ ~?^jɺ\/?Eڣ"_c_/EA6-Kٵ"{+_oG7s4*aY 蕡;[yZkߌf}G]al.kx0t8un~;ئfru>x6w.ԇ~ڇΦFZеxĖxuVf A7M̃vc?>Ra`3фp^} ˄LRHH VoцNX@j#43` cp1e&E"Qi&yh"Ogv0P37#Û!/ %-0 (2㥚nukx9dLYi̼9;)LB#$8a̤,Y<LB]T',71WA\ WȁL5 hGٮdz 8T͛p X#5)Qdȷ++GihP 7oU*qo 0?^@]tc m"Eo+D-xi)M(ނino&(;55^"z{[>#&T|u oY%@R3#?^-[p>͑w4;blxG<6.|#Whw4;r&ȼ;RwN ؂i,'_`9FOȸ{.Cav?InA4GnS>y L)OYu$=yQ}9VmCR򞎄{Ȱ{H{_nvs#(lF&>A">Bb=Pry@QmO'{`{6퐁B#h/Ce N|G:=P60Y[=yhx}$ȣZbN*Ȣ6aw 52B<$܅1|G\h#}.G\x?ނiLLPD:F] ?ϟCCp6squ7w|س!ޛtB ^Oo8"{{5q`~q";T{X/@{>k*8}]ԚC%Hm;ٯ2`dE FrY2HDqF)}Ds:sM3מ:n}qr;r}Y! ՚}CG ܨ 0ңH=9@skFz5)=hkΚnn08˘d"Nd>o B_H.>Vn(>x ]QSCvH=S:vΪMIX |Ls<6 N#jo SmDr ϑ?8Pځ@;82:05KGk-0'w "}ǽiM<2 PGkӡ`e/F_cϪu3dj4*Crw zm5z_q4;225IP7ij(=ֻ0Z4C\ nk8c>w:ޥ~(s+CpW7ֽF. PxKw˯|~6н]pMݬ\4WO{|`?=X-ާ}ذ_[}+k!QRS ʀJw4<pt3?Ga-0h%t`wv_s~c~G> endobj 4141 0 obj << /Type /ObjStm /N 67 /First 675 /Length 2520 /Filter /FlateDecode >> stream xڝZMo] Whh,R_$(MLљY8Ęv)m1wDW}r 1d0%1Zȡ2Q'ZjX&P*1 DȬQ,%$q9X$V)!!RI2si!FqW;LǨ=x^5"CN?+1Bc\ 5q*ZjAb%F" .% -V(ZBaXUv A87 Ɓ08R=A%ᄁʰR)U+j*( {xX-pQ`Ynq`̢c_z YKhMMs՗9g}cDGW=/{L={2 f݄nOuMc&Ia,dRat@3W..t?%ė^3  LںXm1\X^\~wa|{R(L1I՞o˂UCR{ F>&NƎPT¸ \:U\1If1*c@hVRpVR}LHUp9Ic2'})z,rˊr1YQ^i/~C-Ί&i3$ ǒ`.a9&3ɜmΊ񊲒**DŽ_,9o^بW86FBy#tx űq4t)6'0 >+{B'csWhbȩ&SGN'g-. N/jZZ1YխxIb1I(Rtny=XT갎C_AT|0 Y/v]uAtrH7E 0 +W]Y黫XLjI죚pՄԅb%,ؘ;NX& -$ I+i~IOގ\^ՒxDV{PWʻLr .19p="޸p"UE6pIz$7\岮hVee A"jM Ǧ'_xrVB!`Vy`D'&%XM/uW.5²Usp܂ф8 *{ʘt=sJ5. )8Z$',B2a;!ۭ^lɩyKiaR]ySmTDjB§^2s}HOF'׭ߞyFN'~[ JDŽ,I8v2-"3tSC>W;Syxa$IR;7c{zc:.G 9^_?CscxVEo,=x6#<==s3B稾|~-zܳs=HYrۍeqzjy= w=h#|Q %cj,ZՀyrpiJQ?H;̟mԞ1=1T*^S9}:q~f36eO?>\eb'F321Pvxl/Ktll$r2X #1m4g8g-eg7qZWnss_?mfSMA4fT,#݇mz߼mib*b2${yxDQMDWR7]yNLejj4*!J< *nFfkƣ?%ƺf%{,Fv5k2d#A͏ˁN!&#F-yl4_}B$pv6lH%K\NB7 4#WK P͹Af [4_1 # F3.ٝ㠚0k[`m 7^c>a84Y,kc`m vK~8kZ` eZ X kxP