Skip to content

Instantly share code, notes, and snippets.

@gregcaporaso
Last active October 12, 2015 07:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save gregcaporaso/3994000 to your computer and use it in GitHub Desktop.
Save gregcaporaso/3994000 to your computer and use it in GitHub Desktop.
IPython Notebook files used in Greg Caporaso's Fall 2012 BIO599 Computational Biology course. See the included README.md file for more details and licensing information.

IPython Notebook files used in Greg Caporaso's Fall 2012 BIO599 Computational Biology course.

These closely follow the Python Programming chapters of Practical Computing for Biologists. A lot of exercises can be found in Learn Python the Hard Way.

This work is licensed under the Creative Commons Attribution 3.0 United States License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Feel free to use or modify these notebooks, but please credit me by placing the following attribution information where you feel that it makes sense: Greg Caporaso, www.caporaso.us.

Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
from sys import argv
usage = "Lecture25_example.py <name> <day>"
if len(argv) != 3:
print "ERROR: Incorrect number of arguments passed."
print "USAGE: " + usage
else:
script_name, name, day = argv
print "Hello " + name
print "Today is " + day
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "CaporasoLecture28"
},
"name": "CaporasoLecture28",
"nbformat": 2,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"source": "**Working with third-party python modules**\n\nToday we'll look at working with two third-party python modules: [PyCogent](www.pycogent.org) and [matplotlib](http://matplotlib.org/). We could spend weeks exploring the functionality of each, but since we don't have that time we'll instead just scratch the surface of each explore how to get more information. \n\nBoth [PyCogent](www.pycogent.org) and [matplotlib](http://matplotlib.org/) are available in the QIIME EC2 instance, so that's a quick way to get started."
},
{
"cell_type": "markdown",
"source": "*PyCogent: The Python Comparative Genomics Toolkit*\n\nPyCogent was developed to provide support for many common bioinforamtics functions, with a focus on test-driven development to ensure that the tools we were building are reliable and work as expected. Some of the most useful features that PyCogent facilitates are:\n\n1. Interacting external databases.\n2. Interacting with external applications.\n3. Working frequently used bioinformatics data types (e.g., trees, alignments, sequences).\n4. Parsing and writing many common file formats.\n5. Applying many commonly-used statistical methods.\n\nLet's look at examples of a few of these.\n\nTo import tools from PyCogent, you must first have PyCogent installed, and then import from the ``cogent`` module. Here we'll query the PDB for a PDB coordinates file."
},
{
"cell_type": "code",
"collapsed": true,
"input": "from cogent.db.pdb import Pdb",
"language": "python",
"outputs": [],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": true,
"input": "p = Pdb()",
"language": "python",
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": "result = p['3L0U']\nprint '\\n'.join(list(result)[:25])",
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "HEADER RNA 10-DEC-09 3L0U \n\nTITLE THE CRYSTAL STRUCTURE OF UNMODIFIED TRNAPHE FROM ESCHERICHIA \n\nTITLE 2 COLI \n\nCOMPND MOL_ID: 1; \n\nCOMPND 2 MOLECULE: UNMODIFIED TRNAPHE; \n\nCOMPND 3 CHAIN: A; \n\nCOMPND 4 ENGINEERED: YES; \n\nCOMPND 5 MUTATION: YES \n\nSOURCE MOL_ID: 1; \n\nSOURCE 2 SYNTHETIC: YES; \n\nSOURCE 3 OTHER_DETAILS: IN VITRO SYNTHESIS BY T7 RNA POLYMERASE, THE \n\nSOURCE 4 SEQUENCE OF THE TRNA IS FROM ESCHERICHIA COLI K12 \n\nKEYWDS TRANSFER RNA, TRNA, TRANSCRIPT, UNMODIFIED, RNA \n\nEXPDTA X-RAY DIFFRACTION \n\nAUTHOR R.T.BYRNE,A.L.KONEVEGA,M.V.RODNINA,A.A.ANTSON \n\nREVDAT 1 16-MAR-10 3L0U 0 \n\nJRNL AUTH R.T.BYRNE,A.L.KONEVEGA,M.V.RODNINA,A.A.ANTSON \n\nJRNL TITL THE CRYSTAL STRUCTURE OF UNMODIFIED TRNAPHE FROM \n\nJRNL TITL 2 ESCHERICHIA COLI \n\nJRNL REF NUCLEIC ACIDS RES. 2010 \n\nJRNL REFN ESSN 1362-4962 \n\nJRNL PMID 20203084 \n\nJRNL DOI 10.1093/NAR/GKQ133 \n\nREMARK 2 \n\nREMARK 2 RESOLUTION. 3.00 ANGSTROMS. \n"
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"source": "Similarly we can query Genbank using the ``EUtils`` module. We'll also import the ``MinimalFastaParser`` here, but we'll come back to that later."
},
{
"cell_type": "code",
"collapsed": true,
"input": "from cogent.db.ncbi import EUtils\nfrom cogent.parse.fasta import MinimalFastaParser",
"language": "python",
"outputs": [],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": true,
"input": "e = EUtils()\nbac16s = list(MinimalFastaParser(e['\"small subunit rRNA\"[ti] AND bacteria[orgn]']))",
"language": "python",
"outputs": [],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": "print bac16s[:5]",
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "[(&apos;gi|1809027|gb|U62130.1|SPU62130 Solemya pusilla gill symbiont 16S small subunit rRNA gene&apos;, &apos;TCCTGGCTCAGATTGAACGCTGGCGGTATGCTTAACACATGCAAGTCGAACGGTAACAGGAGAGAGCTTGCTCTCTTGCTGACGAGTGGCGGACGGGTGAGTAACGCGTAGGAATCTGCCTATTAGTGGGGGACAACTTCCGGAAACGGAAGCTAATACCGCATACGCCCTACGGGGGAAAGCAGGGGATCTTCGGACCTTGCGCTATTAGATGAGCCTGCGTTGGATTAGTTAGTTGGTGAGGTAATGGCTCACCAAGACAGCGATCCATAGCTGGTCTGAGAGGACGATCAGCCACACTGGGACTGAGACACGGCCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGGACAATGGGCGCAAGCCTGATCCAGCAATACCGCGTGTGTGAAGAAGGCCTGCGGGTTGTAAAGCACTTTCAATTGTGAAGAAAAGCTGAAGGTTAATAACCTTTGTCTTTGACGTTAACTTTAGAAGAAGCACCGCTAAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGTGCGTAGGCGGTTTGGTCAGTCAGATGTGAAAGCCCTGGGCTTAACCTGGGAACTGCATTTGATACTGCCAAGCTAGAGTATGGTAGAGGGAAGTGGAATTTCGGGTGTAGCGGTGAAATGCGTAGATATCCGAAGGAACACCAGTGGCGAAGGCGACTTCCTGGACCAATACTGACGCTGAGGTACGAAAGCGTGGGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCAACTAGCCGTTGGTCTCATTAAAGAGATTAGTGGCGCAGCTAACGCGATAAGTTGACACAAGCGGTGGACATGTGGTTTAATTCGATGCAACGCAAAAAACCTTACCAGCTCTTGACATCCTGCAAAAATAAATTGGTGCCTTCGGGAACGCATTGACGGTGCTGCATGGCTGTCGTCACTCGTGTCGTGAGATGTGGGTTAATTCCCGTCTTATTGCCAGCACGTAATGGTGGGAACTCTAGGAGACTGCCGGTGATAAACCGGAGGAATGTGGGGATGACGTCAAGTCATCATGGTCCTTATGAGCTGGGCTACACACGTGCTACAATGGTCGGTACAGACGGTTGCGAACCCGCGAGGGGAAGCTAATCCGAGAAAGCCGATCGTAGTCCGGATCGCATCTGCAACTCGACTGCGTGAAGTCGGAATCGCTAGTAATCGCGAATCAAATGTCGCGGTGAATACTTCCCGGGCCTTGTACACACCGCCCGTCACACCATGGGA&apos;), (&apos;gi|174515|gb|M59230.1|EUBRG Eubacterium biforme small subunit rRNA&apos;, &apos;NCAAATGGAGAGTTTGATCCTGGCTCAGGATNAACGCTGGCGGCATGCCTAATACATGCAAGTCGAACGAGAGGAAGGAAAGCTTGCTTTTCTGAATCTAGTGGCGAACGGGTGAGTAACNCGTAGGTAACCTGCCCATGTGCCCGGGATAACTTCTGGAAACGGATGCTAAAACCGGATAGGTAGCAGACAAGCATTTGACTGCTATTAAAGTGGCTAAGGCCATGAACATGGATGGACCTNCGGTGCATTAGCTAGTTGGTGAGGTAACGGCCCACCAAGGCGACGATGCATAGCCGGCCTGAGAGGGCGGACGGCCACATTGGGACTGAGACACGGCCNNAACTCCTACGGGAGGCAGCAGTAGGGAATTTTCGTCAATGGGGGGAACCCTGAACGAGCAATGCCGCGTGAGTGAGGAAGGTCTTCGGATCGTAAAGCTCTGTTGTAAGAGAAAAACGACATTCATAGGGAATGATGAGTGAGTGATGGTATCTTACCAGAAAGTCACGGCTAACTACGTGCCAGCAGCCGCGGTAATACGTAGGTGGCGAGCGTTATCCGGAATGATTGGGCGTANAGGGTGCGTAGGTGGCAGAACAAGTCTGGAGTAAAAGGTATGGGCTCAACCCGTACTGGCTCTGGAAACTGTTCAGCTAGAGAACAGAAGAGGACGGCGGAACTCCATGTGTAGCGGTAAAATGCGTAGATATATGGAAGAACACCGGTGGCGAAGGCGGCCGTCTGGTCTGTTGCTGACACTGAAGCACGAAAGCGTGGGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGAACTAGGTGTTGGGGGAATAACTCAGTGCCGCAGTTAACGCAATAAGTTCTCCGCCTGGGGAGTATGCACGCAAGTGTGAAACTCAAAGGAATTGACGGNNGCCNGCACAAGCGGTGGAGTATGTGGTTTAATTCGAAGNAACGCGAAGAACCTTACCAGGCCTTGACATCCCTTGCAGAGRTATAGAGATATATCCGAGGTTAACAAGGAGACAGGTGGTGCATGGTTGTCGTCAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTGTGATATGTTACTAACATTGAGTTGAGGACTCATATCAGACTGCCGGTGATAAACCGGAGGAAGGTGGGGATGACGTCAAATCATCATGCCCCTTATGGCCTGGGCTACACACGTNCTACAATGGCGTCTACAAAGAGCGGCAAGCCTGTGAAGGCAAGCGAATCTCATAAAGGACGTCTCAGTTCGGATTGAAGTCTGCAACCCGACTTCATGAAGCTGGAATCGCTAGTAATCGCGAATCAGCATGTCGCGGTGAATACGTTCTCGGGCNTTGTACACACCGCCCGTCAAACCATGGGAGTTGGTAATGCCCGAAGCCGGTGGCATAACCTTTCGAGGAGTGAGCCGTCGAAGGCAGGACCGATGACTGGGG&apos;), (&apos;gi|154840|gb|M83140.1|TPHRRNA Thermosipho africanus ribosomal small subunit rRNA gene&apos;, &apos;NATTCATGGAGGGTTTGATCCTGGCTCAGGGTGAACGCTGGCGGCGTGCCTTACACATGCAAGTCGAGCGAAGCTGCTGGTGGAATCCTTTCGGGGAGGAANGCCNGTAGACTNAGCGGCGGACGGGTGAGTAACGCGTAGGTGACCTACCCCTCAGAGGGGGATAACTGGGGGAAACCTCAGCTAATACCCNATACGTTCCTACCTATAAGNAGGTAGGAAGAAAGGGAGCAATAGCTCTGCTGAGNNNGGGGCCTGCGACCCATCAGGTAGTTGGTGAGGTAACGGCTCACNAAGCCTACGACGGGTAGCCGGTCTGAGAGGATGGCCGNCNACAAGGGCACTGAGACACGGGCCNNACTCCTACGGGAGGCAGCAGTGGGGGATTTTGGACAATGGGCGAAAGCCTNATCCAGCGACGCCGNGTGCGGGACGAAGCCCTTCGGGGTGTAAACCGCTGTGGTGGGAGACGAATAAGGTGAGGAGTGGAAAGCCTCACTGATGACGGTATCCCACTAGAAAGCCCCGGCTAACTACGTGCCAGCAGCCGCGGTAATACGTAGGGGGCNAGCGTTACCCGGATTTACTGGGCGTAAAGGGGGCGTAGGCGGCCGTGAAAGTCCGGTGTGAAAACTCACGGCTCAACCGTGGGACTGCGCTGGAAACTACACGGCTTGAGGACGGTAGAGGGAGACGGAACTGCTGGTGTAGGGGTGAAATCCGTAGATATCAGCAGGAACGCCGGTGGAGAAGTCGGTCTCCTGGGCCGTNCCTGACGCTGAGGCCCNAAAGCTAGGGGAGCAAACCGGATTAGATACCCGGGTAGTCCTAGCCGTAAACGATGCCCNCTAGGTGTGGGGGAGTAATTCCTCCGTGCTGAAGCTAACGCGATAAGTGGGCCGCCTGGGGAGTATGCCCGCAAGGGTGAAACTCAAAGGAATTGACGGGACCCNGCACAAGCGGTGGAGCGTGTGGTTTAATTGGACGCTAAGCCAAGAACCTTACCAGGGCTTGACATGCTGGTGGTACTGNCNCGAAAGGGGAGGGACCTGTGGCGTTAGTCACGGGAGCCAGCACAGGTGGTGCACGGTCGTCGTCAGCTCGTGCCGTGAGGTGTTGGGTTAAGTCCCGCAACGAGCGCAACCCCTGCCCTTAGTTGCCAGCGGTTCGGCCGGGCACTCTAAGGGNACTGCCGGCGACGAGCCGGAGGAAGGAGGGGATGACGTCAGATACTCGTGCNCCTTATGCCCTNGGCGACACACGCGCTACAATGGGTGGGACAGCGGGAAGCGAGCCAGCGATGGTGAGCGAAGCCCTTAAACCCACCCTCAGTTCGGATTGCAGGCTGAAACCCGCCTGCATGAAGCCGGAATCGCTAGTAATCGCGGATCAGCCACGCCGCG&apos;), (&apos;gi|89111228|dbj|AB252048.1| Sulfurimonas paralvinellae rrn gene for small subunit rRNA, partial sequence&apos;, &apos;CTGCTCAGAATGAACGCTGGCGGCGTGCTTAACACATGCAAGTCGAACGGTAACAGAGAGAAGCTTGCTTCTCTGCTGACGAGTGGCGCACGGGTGAGTAATATATAGGTAATGTGCCCCTTGGACCGGGATAGCCACTGGAAACGGTGATTAATACTGGATACTCCTTTTCATCAAAAGATGAATCGGGAAATGGATTCCGCCAAGGGATCGGCCTATATCCTATCAGCTAGTTGGTGAGGTAAGAGCTCACCAAGGCGATGACGGGTAGCGGGTTTGAGAGGATGATCCGCCACACTGGTACTGAGACACGGACCAGACTCCTACGGGAGGCAGCAGTGAGGAATATTGCACAATGGGGGAAACCCTGATGCAGCAACGCCGCGTGGAGGATGACGCATTTCGGTGTGTAAACTCCTTTTATATGTCAAGAAAATGACGGTAGCATATGAATAAGCACCGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTATTCGGAATCACTGGGCGTAAAGGACGCGTAGGCGGGTTGGTAAGTCAGATGTGAAATCCTACAGCTTAACTGTAGAACTGCATTTGAAACTACTAACCTAGAGTATGGGAGGGGCAGATGGAATTAGTGGTGTAGGGGTAAAATCCGTAGATATCACTAGGAATACCGAAAGCGAAGGCGATCTGCTGGAACATAACTGACGCTAAGGCGTGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCCTAAACGATGAACACTAGTCGTCGGGATGCTAGTCATCTCGGTGATGCACTTAACAGATTAAGTGTTCCGCCTGGGGAGTACGGTCGCAAGATTAAAACTCAAAGGAATAGACGGGGACCCGCACAAGTGGTGGAGCATGTGGTTTAATTCGAAGATACGCGAAGAACCTTACCTAGCCTTGACATTGAGAGAACCTGCCAGAGATGGCGGGGTGCCCTTCGGGGAACTCGAAAACAGGTGCTGCACGGCTGTCGTCAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTCGTCCTTAGTTGCTAGCAGTTCGGCTGAGCACTCTAAGGAGACTGCCTTCGCAAGGAGGAGGAAGGTGAGGACGACGTCAAGTCATCATGGCCCTTATGGCTAGGGCTACACACGTGCTACAATGGGGCGTACAGAGTGTTGCGATACCGCGAGGTGGAGCTAATCACTTAAAGCGTCTCTCAGTTCGGATTGGAGTCTGCAACTCGACTCCATGAAGCTGGAATCACTAGTAATCGTAGATCAGCAATGCTACGGTGAATACGTTCCCGGGTCTTGTACTCACCGCCCGTCACACCATGGGAGTTGATTTCACCCGAAATCGGGAAGCCAACCTTCGGGGGGCTACCGCTTAACCGGTGGAATTAGGCGA&apos;), (&apos;gi|13122406|dbj|AB055735.1| Uncultured bacterium Pn34 gene for small subunit rRNA, partial sequence&apos;, &apos;TACGGAGGATTCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGCAGGCGGTTTTTTAAGTCGGCGGTGAAATTTTGCGGCTCAACCGTAAAAGTGCCTTCGAAACTGGAAGACTTGAGTATAGATGAAGTAGGCGGAATTTGTGGTGTAGCGGTGAAATGCATAGATATCACGAGGAACTCCGATTGCGCAGGCAGCTTACTAAACTATAACTGACGCTCATGCACGAAGGCGTGGGGATCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATTACTCGCTGTTTGCGATATACCGCAAGCGGCTTAGCGAAAGCGTTAAGTAATCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGGCGGGGGCCCGCACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTAGAACGCAGAGGGAATGTATGGGAAACTGTACAGCCGCAAGGCCGTCTGCGAGGTGCTGCATGGTTGTCGTCAGCTCGTGCCGTGAGGTGTCGGCTTAAGTGCCATAACGAGCGCAACCCTTATTGTTAGTTGCCAGCGGATCATGCCGGGGACTCTAGCAAAACTGCCGGCGTAAGCTGTGAGGAAGGTGGGGATGACGTCAAATCAGCACGGCCCTTACGTCCGGGGCGACACACGTGTTACAATGGGAGGTACAGAAGGTTGCTACCACGCGAGTGGATGCTAATCCAGAAAGCCTCTCTCAGTTCGGATCGAAGTCTGCAACTCGACTTCGTGAAGCTGGATTCGCTAGTAATCGCGCATCAGCCATGGCGCGGTGAATACGTTCCCGGGCCTT&apos;)]"
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"source": "PyCogent also supports common data types that are used in bioinformatics. For example, it's very common to have a collection of sequences that you want to perform some processing of, so PyCogent implents a data type called a ``SequenceCollection``. To load sequences into a sequence collection, you can use the ``LoadSeqs`` function. "
},
{
"cell_type": "code",
"collapsed": true,
"input": "from cogent import LoadSeqs, DNA\nseqs = LoadSeqs(data=bac16s,moltype=DNA,aligned=False)",
"language": "python",
"outputs": [],
"prompt_number": 39
},
{
"cell_type": "markdown",
"source": "To see what you can do with a sequence collection, use the ``dir`` function."
},
{
"cell_type": "code",
"collapsed": false,
"input": "dir(seqs)",
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 40,
"text": "[&apos;Alphabet&apos;,\n &apos;DefaultNameFunction&apos;,\n &apos;Info&apos;,\n &apos;InputHandlers&apos;,\n &apos;IsArray&apos;,\n &apos;Items&apos;,\n &apos;MolType&apos;,\n &apos;Name&apos;,\n &apos;NamedSeqs&apos;,\n &apos;Names&apos;,\n &apos;SeqData&apos;,\n &apos;SeqLen&apos;,\n &apos;Seqs&apos;,\n &apos;__add__&apos;,\n &apos;__class__&apos;,\n &apos;__cmp__&apos;,\n &apos;__delattr__&apos;,\n &apos;__dict__&apos;,\n &apos;__doc__&apos;,\n &apos;__format__&apos;,\n &apos;__getattribute__&apos;,\n &apos;__hash__&apos;,\n &apos;__init__&apos;,\n &apos;__len__&apos;,\n &apos;__module__&apos;,\n &apos;__new__&apos;,\n &apos;__reduce__&apos;,\n &apos;__reduce_ex__&apos;,\n &apos;__repr__&apos;,\n &apos;__setattr__&apos;,\n &apos;__sizeof__&apos;,\n &apos;__str__&apos;,\n &apos;__subclasshook__&apos;,\n &apos;__weakref__&apos;,\n &apos;_coerce_seqs&apos;,\n &apos;_force_same_data&apos;,\n &apos;_get_alphabet_and_moltype&apos;,\n &apos;_get_container_item&apos;,\n &apos;_guess_input_type&apos;,\n &apos;_make_gaps_ok&apos;,\n &apos;_make_named_seqs&apos;,\n &apos;_names_seqs_order&apos;,\n &apos;_seqs&apos;,\n &apos;_set_additional_attributes&apos;,\n &apos;_strip_duplicates&apos;,\n &apos;_take_seqs&apos;,\n &apos;addSeqs&apos;,\n &apos;annotateFromGff&apos;,\n &apos;copy&apos;,\n &apos;copyAnnotations&apos;,\n &apos;degap&apos;,\n &apos;distanceMatrix&apos;,\n &apos;getGapCount&apos;,\n &apos;getGappedSeq&apos;,\n &apos;getIntMap&apos;,\n &apos;getItemIndices&apos;,\n &apos;getItems&apos;,\n &apos;getItemsIf&apos;,\n &apos;getMotifProbs&apos;,\n &apos;getNumSeqs&apos;,\n &apos;getPerSequenceAmbiguousPositions&apos;,\n &apos;getSeq&apos;,\n &apos;getSeqFreqs&apos;,\n &apos;getSeqIndices&apos;,\n &apos;getSeqNames&apos;,\n &apos;getSimilar&apos;,\n &apos;getTranslation&apos;,\n &apos;hasTerminalStops&apos;,\n &apos;isRagged&apos;,\n &apos;items&apos;,\n &apos;iterItems&apos;,\n &apos;iterSeqs&apos;,\n &apos;keys&apos;,\n &apos;omitGapPositions&apos;,\n &apos;omitGapRuns&apos;,\n &apos;omitGapSeqs&apos;,\n &apos;omitSeqsTemplate&apos;,\n &apos;padSeqs&apos;,\n &apos;rc&apos;,\n &apos;replaceSeqs&apos;,\n &apos;reversecomplement&apos;,\n &apos;takeSeqs&apos;,\n &apos;takeSeqsIf&apos;,\n &apos;toDna&apos;,\n &apos;toFasta&apos;,\n &apos;toNexus&apos;,\n &apos;toPhylip&apos;,\n &apos;toRna&apos;,\n &apos;todict&apos;,\n &apos;values&apos;,\n &apos;withModifiedTermini&apos;,\n &apos;withoutTerminalStopCodons&apos;,\n &apos;writeToFile&apos;]"
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"source": "Then you can use ``help`` to get additional information on specific methods."
},
{
"cell_type": "code",
"collapsed": false,
"input": "help(seqs.getTranslation)",
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Help on method getTranslation in module cogent.core.alignment:\n\ngetTranslation(self, gc=None, **kwargs) method of cogent.core.alignment.SequenceCollection instance\n Returns a new alignment object with the DNA sequences translated,\n using the current codon moltype, into an amino acid sequence.\n"
}
],
"prompt_number": 41
},
{
"cell_type": "markdown",
"source": "One of the most powerful tools (in my unbiased opinion) in PyCogent is the [Application Controller framework](http://pycogent.sourceforge.net/examples/application_controller_framework.html).\n\nThis allows you to wrap command line applications in python, which then provides very convenient access from inside your code. Some common use cases for this are running the same application with many different parameter settings (to study the effect of different parameters) or on many different inputs (to apply the same process to different data sets). Additionally you may want to build *pipelines*, or scripts that plug together many different applications into a single script for commonly performed tasks. An example of this would be ``pick_otus_through_otu_table.py`` workflow script in QIIME, which picks OTUs with ``uclust``, assigns taxonomy to OTUs with ``RDP classifier``, aligns sequences with ``PyNAST`` and then builds a phylogenetic tree from those sequences with ``FastTree``.\n\nHere we'll run the muscle multiple sequence aligner."
},
{
"cell_type": "code",
"collapsed": true,
"input": "from cogent.app.muscle import align_unaligned_seqs",
"language": "python",
"outputs": [],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": true,
"input": "aligned_seqs = align_unaligned_seqs(seqs,DNA)",
"language": "python",
"outputs": [],
"prompt_number": 43
},
{
"cell_type": "markdown",
"source": "In this step we ran the muscle command line program, which takes a fasta file as input and generates another fasta file as output. Notice that we didn't have to write that fasta file though, nor did we have to parse the resulting file. The PyCogent application controller takes care of all of that for us, seemingly letting us just pass python objects to muscle. \n\nThe return value from ``align_unaligned_seqs`` is an ``Alignment``, which has some useful functionality. Use ``dir`` to see that."
},
{
"cell_type": "code",
"collapsed": false,
"input": "dir(aligned_seqs)",
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 46,
"text": "[&apos;AlignedSeqs&apos;,\n &apos;Alphabet&apos;,\n &apos;DefaultGap&apos;,\n &apos;DefaultNameFunction&apos;,\n &apos;GapChars&apos;,\n &apos;IUPACConsensus&apos;,\n &apos;Info&apos;,\n &apos;InputHandlers&apos;,\n &apos;IsArray&apos;,\n &apos;Items&apos;,\n &apos;MolType&apos;,\n &apos;Name&apos;,\n &apos;NamedSeqs&apos;,\n &apos;Names&apos;,\n &apos;Positions&apos;,\n &apos;SeqData&apos;,\n &apos;SeqLen&apos;,\n &apos;Seqs&apos;,\n &apos;__add__&apos;,\n &apos;__class__&apos;,\n &apos;__cmp__&apos;,\n &apos;__delattr__&apos;,\n &apos;__dict__&apos;,\n &apos;__doc__&apos;,\n &apos;__format__&apos;,\n &apos;__getattribute__&apos;,\n &apos;__getitem__&apos;,\n &apos;__hash__&apos;,\n &apos;__init__&apos;,\n &apos;__len__&apos;,\n &apos;__module__&apos;,\n &apos;__new__&apos;,\n &apos;__reduce__&apos;,\n &apos;__reduce_ex__&apos;,\n &apos;__repr__&apos;,\n &apos;__setattr__&apos;,\n &apos;__sizeof__&apos;,\n &apos;__str__&apos;,\n &apos;__subclasshook__&apos;,\n &apos;__weakref__&apos;,\n &apos;_annotations_nucleic_reversed_on&apos;,\n &apos;_as_map&apos;,\n &apos;_coerce_seqs&apos;,\n &apos;_force_same_data&apos;,\n &apos;_get_alphabet_and_moltype&apos;,\n &apos;_get_container_item&apos;,\n &apos;_get_freqs&apos;,\n &apos;_guess_input_type&apos;,\n &apos;_make_gaps_ok&apos;,\n &apos;_make_named_seqs&apos;,\n &apos;_mapped&apos;,\n &apos;_motif_probs&apos;,\n &apos;_names_seqs_order&apos;,\n &apos;_seq_to_aligned&apos;,\n &apos;_seqs&apos;,\n &apos;_set_additional_attributes&apos;,\n &apos;_shiftedAnnotations&apos;,\n &apos;_slicedAnnotations&apos;,\n &apos;_strip_duplicates&apos;,\n &apos;_take_seqs&apos;,\n &apos;_type&apos;,\n &apos;addAnnotation&apos;,\n &apos;addFeature&apos;,\n &apos;addFromReferenceAln&apos;,\n &apos;addSeqs&apos;,\n &apos;annotateFromGff&apos;,\n &apos;annotations&apos;,\n &apos;attachAnnotations&apos;,\n &apos;columnFreqs&apos;,\n &apos;columnProbs&apos;,\n &apos;copy&apos;,\n &apos;copyAnnotations&apos;,\n &apos;degap&apos;,\n &apos;detachAnnotations&apos;,\n &apos;distanceMatrix&apos;,\n &apos;filtered&apos;,\n &apos;gappedByMap&apos;,\n &apos;getAnnotationTracks&apos;,\n &apos;getAnnotationsFromAnySequence&apos;,\n &apos;getAnnotationsFromSequence&apos;,\n &apos;getAnnotationsMatching&apos;,\n &apos;getByAnnotation&apos;,\n &apos;getBySequenceAnnotation&apos;,\n &apos;getChildTracks&apos;,\n &apos;getDegappedRelativeTo&apos;,\n &apos;getGapCount&apos;,\n &apos;getGappedSeq&apos;,\n &apos;getIntMap&apos;,\n &apos;getItemIndices&apos;,\n &apos;getItems&apos;,\n &apos;getItemsIf&apos;,\n &apos;getMotifProbs&apos;,\n &apos;getNumSeqs&apos;,\n &apos;getPerSequenceAmbiguousPositions&apos;,\n &apos;getPosFreqs&apos;,\n &apos;getPositionIndices&apos;,\n &apos;getProjectedAnnotations&apos;,\n &apos;getRegionCoveringAll&apos;,\n &apos;getSeq&apos;,\n &apos;getSeqFreqs&apos;,\n &apos;getSeqIndices&apos;,\n &apos;getSeqNames&apos;,\n &apos;getSimilar&apos;,\n &apos;getTracks&apos;,\n &apos;getTranslation&apos;,\n &apos;hasTerminalStops&apos;,\n &apos;isRagged&apos;,\n &apos;items&apos;,\n &apos;iterItems&apos;,\n &apos;iterPositions&apos;,\n &apos;iterSeqs&apos;,\n &apos;keys&apos;,\n &apos;majorityConsensus&apos;,\n &apos;omitGapPositions&apos;,\n &apos;omitGapRuns&apos;,\n &apos;omitGapSeqs&apos;,\n &apos;omitSeqsTemplate&apos;,\n &apos;padSeqs&apos;,\n &apos;rc&apos;,\n &apos;replaceSeqs&apos;,\n &apos;reversecomplement&apos;,\n &apos;sample&apos;,\n &apos;scoreMatrix&apos;,\n &apos;slidingWindows&apos;,\n &apos;takePositions&apos;,\n &apos;takePositionsIf&apos;,\n &apos;takeSeqs&apos;,\n &apos;takeSeqsIf&apos;,\n &apos;toDna&apos;,\n &apos;toFasta&apos;,\n &apos;toNexus&apos;,\n &apos;toPhylip&apos;,\n &apos;toRna&apos;,\n &apos;todict&apos;,\n &apos;uncertainties&apos;,\n &apos;values&apos;,\n &apos;variablePositions&apos;,\n &apos;withGapsFrom&apos;,\n &apos;withMaskedAnnotations&apos;,\n &apos;withModifiedTermini&apos;,\n &apos;withoutTerminalStopCodons&apos;,\n &apos;writeToFile&apos;]"
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"source": "One of these useful functionalities is the ``uncertainties`` method, which can provide useful information about the varability at different positions in the sequence."
},
{
"cell_type": "code",
"collapsed": false,
"input": "help(aligned_seqs.uncertainties)",
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Help on method uncertainties in module cogent.core.alignment:\n\nuncertainties(self, good_items=None) method of cogent.core.alignment.Alignment instance\n Returns Shannon uncertainty at each position.\n \n Usage: information_list = alignment.information(good_items=None)\n \n If good_items is supplied, deletes any symbols that are not in\n good_items.\n"
}
],
"prompt_number": 54
},
{
"cell_type": "code",
"collapsed": true,
"input": "uncertainties = aligned_seqs.uncertainties()",
"language": "python",
"outputs": [],
"prompt_number": 48
},
{
"cell_type": "markdown",
"source": "If we want to investiage the positional variability through-out the alignment, we could plug these results directly into the other module that we'll look at today: ``matplotlib``. \n\n``matplotlib`` provides plotting functionality for use in python. To import from ``matplotlib`` we import from ``pylab``. Let's import the plot function and generate a figure."
},
{
"cell_type": "code",
"collapsed": true,
"input": "from pylab import plot",
"language": "python",
"outputs": [],
"prompt_number": 50
},
{
"cell_type": "code",
"collapsed": false,
"input": "plot(uncertainties)",
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 52,
"text": "[&lt;matplotlib.lines.Line2D at 0x3034090&gt;]"
},
{
"output_type": "display_data",
"png": "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\nwoWh+HftGtYrGTj24ouFa9CSeiM6Q4t9ba2eW6eqqgpVVVWxys0jltj3798fq1atwpAhQwAAW7du\nRScy1p7LRADAli31B/9EncazZA4+OG+xH3VU/XPYUagyi4K2eng30NCh9cvUqhUwYED+QQEAb70V\nXtQDDghDRydPLjyP7v4gVskZZwCvvlp4k5F1Nt97LxT72bPzbzMAcM01wF/+Upj2EUcA8+aFn9lR\ntGVlwNat0TdybW34sD38cP2Fs225cQiicRU62HLjpBViGYWoD4t3HC9flYdjWtY/WQVKxl13xctH\n9fcdfjjQuXP+O7kPWU0gXHcdMGpUYXhpbW2oCapUVFSgoqKi7vukSZPUTxYQy43Tv39/zJkzB9u3\nb8esWbPQrVs3pfNEozxFuBoQJBN7Hq58pippDB5cOFWESsONcwPbtJzj5mVyjk6ndpbdOOwxOmGh\nrtw4OnWn8ptdPWR03DimUU5AaISefDJAaXVmZiAVWvYjR47E/PnzsW3bNhx99NGYNGkSar8ueWVl\nJfr164cBAwbg5JNPRmlpKWbanigE7jvXdGP3VY9RRVWo2e86Hcv0OVGxwUmH3bm2HLMSjeMKXTeO\nbrq6537yiXjOqKSJE7W2dWv8/IcPB0aMCD8Xhdg/+uij0gSmTJmCKVOmWCuQCNev1DoNPMq3qxIp\noYroZtYVall5/vCHcB1UXWyLtgs3jmqePM44I145oojjxlGx7KMsWVU3ji5btpiFVrNkwbK/6KLo\n86LgpVdRAVRVZUfsMzWfPY84r1S66auKNLnhXAq67jkq6Yga+Ouvh30Euuep5i3D5IHLnhu1LY4b\nJ2piujTdOOQ40zeqpN04smubRv+AKM/du/Of41znefNCd6vqQvKuSVzsly9POkc5pj570T7Xsecm\nlv2nn4qjIe68U698dNpxcekqcRGN4yrKRoZKB23caBxbBohqfqLvrpDdv4Q47bJZs7BjtrY2XOiG\nzEr6yCP15/xPgsTF/qST9I5PwrLXFfson6bt8qm6cVTydiVYrjp947rUbN2wrnDZQSva58qNk1b0\njimqY07iGn/NmoViv2FDPsruj38M/5Im824cGpdunE8/DWdJjBuNY/s1GZB30Nrw2UehMsAk62Ia\n17KPc5zO+UlY9rL2aeutNCptFh1fusr+OGXh7YtbFyUloRsnCw/DzIt9EkISBMCFF6ofn1TEjk3L\n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\n2Hs8Hk8j4P8D87CeDKMZQjwAAAAASUVORK5CYII=\n"
}
],
"prompt_number": 52
},
{
"cell_type": "markdown",
"source": "We could make this figure nicer by adding labels and a title."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from pylab import xlabel, ylabel, title\nxlabel(\"Alignment position\")\nylabel(\"Shannon uncertainty\")\ntitle(\"Posiitional variability in the bacterial 16S rRNA gene (based on a very small sample of sequences)\")\nplot(uncertainties)",
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 56,
"text": "[&lt;matplotlib.lines.Line2D at 0x328c810&gt;]"
},
{
"output_type": "display_data",
"png": "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\nL72EAwcOYNWqVZg2bRp++eUX1KpVS/GZb9Kkic8AKbwXYh588EGcPHkSGRkZ3m27du3yiSnV+l3c\nuXMnJk+ejClTpuDChQveZ0bu/IcffhjJycnYt28fvvvuO/Tq1QsA92OoadOmWLNmjff6rl69irS0\nNO+5Us/cs88+i3nz5uGHH35A8+bNERERIVlviRIlMHLkSJw4cQLffPMNhgwZohi3J9d+LderdZJS\n7969sX37duzYsQNr167FrFmzACg/H0Y4duwYMjMzvf/v3bsXzZo1K3Bc27ZtERcX5/PcZ2RkFIjL\nA9THdTWaNWuGn376CadOnUJgYCCGDx+u2IYmTZqgadOmPv14ZmYmDh8+7P2/cuXKXgMKf508RsYM\nnlq1aiE0NFRSgLZt2xZ9+/b1ae+NGzfw9NNPA1DWN8ePH0ft2rUV6zYsvNq3b4+kpCR88803uHz5\nMuLi4tC4cWOULVsWR48exYYNG3D79m0EBQWhWLFi3l+7SjRs2BB79+6VfRi7dOmCiRMn4ujRo0hI\nSMDChQs1CYasrCwkJyejYsWKKF68OGbNmqXLalSvXj2UK1cOzz//PDp16oTSpUsD4KxwN27cQERE\nBPLy8jB+/HifXyRqJCcngzGGSpUqIT09HW+//TZu377tc8zFixcxZcoUJCcnIz4+HvXr1/fOWtOK\n1H2tXLkyGjVqhL59++Lpp59GsWLFNJWlp6OoXLkyKlSo4COWlShSpAi6d++Ot956y2v5OHHihGJA\nsdz9UftsevTogUWLFmHRokXIysrC8ePHvcGTDRs29Ol8Hn74YRw4cABz585FWloabt26hYSEBJ9f\ny0r35fz58wgLC0OFChWwa9cuXflvGGO4desWsrOzwRjD7du3vYHJxYsXR9++fTF16lScPHkSiYmJ\n+P7779G3b18AwCeffIJNmzYhMzMTV65cwaRJk1ChQgXExMRorl9MXFwc5s+f75M+gr/20NBQDB06\nFB9++KF3kFq6dCkCAgJw6NAh7Nu3D/v27cOhQ4fQqlWrAsHnACfwHn74YYwdOxaXLl3CggULfDpR\nfz4LLecKadu2bYF+omjRonjvvfdw8eJFzJ07F3/++Sc6dOgAgPucy5Urh9DQUCxfvtxn9mZCQgIO\nHDiA3NxclCpVypumw+PxKD7zjz76KBYuXIitW7di//79irOlypUrh8aNG+Ptt9/G5cuXMXv2bCQl\nJXnzBur57p47dw4lS5ZEhQoVcOHCBcTHxyseHxgYiG7dumHYsGFIS0tD+/btvftiY2MRHx+PPXv2\nIC8vD+fOncPatWsVy3vyySexZ88eTJ061fs8S7Fq1SocP34ceXl5KFmyJIKCgnysQFpRu16mcbby\n7t27sXPnTmRnZyM4OBgBAQHesU/p+dCKsA15eXkYNWoUkpOTvbOehdYqntjYWHz11VdYu3YtsrKy\ncO3aNfzwww+S5SuN61JtEHL58mUsW7YMGRkZKFq0KIoXL+69dqU2NGrUCLdv3/b24++++26BH747\nduzAnj17cOTIEXzxxRfefUbGDOG53bp1Q1xcHP744w9kZ2d7z+vevTuWLFmCpUuXIiMjAxkZGVi1\nahVu3Lihqm927tyJtm3bKtet2joZSpYsiQ0bNmDTpk1o3LgxgoODMX/+fADA7du3MXLkSJQvXx6N\nGjVCmTJlvPmDxPlFhO/79OmD48ePo3z58nj99dcL1Dl8+HA88cQT6Nq1Kz744ANMnjwZrVu3lixX\nWHaxYsXw6aef4r333sM999yD3bt3o0ePHpLHytGrVy9s2LDB+0sO4Ez148ePR2xsLOrWrYusrCy0\nbNnSp0ypNvHbGjRogBdffBFt27bFQw89hDp16viY3D0eD55++mkcPHgQderUwY0bN/Ddd99Jts/I\nfX322Wdx4MABVTejuFy5+yx13rvvvosBAwYgLCwMO3fuVD1/9OjRaNOmDV544QWEh4ejW7duuHjx\nomz5cvdH7bOpV68e5s+fjyVLlqBChQro2rWr91f4f//7X6xcuRLh4eGYPHkyihYtioSEBBw5cgQN\nGzZE1apV8fHHH2v+NfzGG28gMzMT1apVw9ChQ/Hiiy9q/vW8adMmlChRAp07d8bZs2cRHByMTp06\nefdPmTIFd999N5o3b47hw4dj7NixaNKkCQDuOzp06FBERESgUaNGOHbsGObOnSs7FVyqTeJtderU\nQdu2bTF58mTJY1577TUfC8bcuXPRv39/rwivUKECKlasiJdffhkLFiyQtPx9+eWXKFu2LOrWrYvF\nixejd+/eCA0NBQDdn4XweZM7V8762L9/f2zYsAGpqanebREREd5f6fPmzcPatWtRqlQpAMDHH3+M\nRYsWoWrVqli4cCEGDx7sPe/ixYvo1q0bypQpgy5duqBfv35ea73SM//oo49i9OjRGDhwIPr27YsX\nXnhB8dmZP38+SpQogcaNGyMhIQHr169HcHBwgXshda+EPPHEE95ZiI8//ji6d++uqY9cv349unXr\n5vOMDRw4EP3790d8fDzCw8PRvn17HD16VLENxYsXR9euXXHq1Cl07dpVts5jx46hffv2CA0NxcCB\nA/H+++/7uILFyD0bater1L8KuX79OgYNGoTw8HC0adMGTZo08c4kVno+lMqUO6Zp06YIDAxE3bp1\nsWvXLlkxW7t2bcyZMweLFi1C5cqV8cADD8jmklQa19XamZeXhylTpuCuu+5CrVq1kJqa6k0mqtSG\nIkWKYN26ddi6dSvq1q2LYsWKoXnz5t7vdI0aNTB69Gg888wz6NmzJ55//nnNY4baM//+++/j8ccf\nx4ABA1CxYkVMnToVADcTf82aNdi4cSP+85//4N577/X+UFTSN6mpqdiwYQOef/55yXvkbQPzx9ZJ\n3NH89ttv6Nu3r+UrAxCEPzRu3BgjR45UHICt4oMPPkDRokUxYsQI2+v+t/Pee+/h+PHjkpbRfzuz\nZ8/GzJkzC6TIKSy0adMGsbGx6N+/v9NN0cXEiRORmZmpaiGWD0wh7ljOnj2Lvn374vLlyyhfvjwG\nDRrkY6kDuODBRx55BBUrVkT9+vXx1FNPycbuEISd7N69G2FhYahUqRLmzp2LAwcOoF27do605Z13\n3nGk3n87V65cwVdffYWff/7Z6aYQDnEn2oTEOT/lIOFVCAkMDMSUKVNQr149pKSkoEmTJt6EoAA3\nc6xLly4oW7YsTp06pRgYThB2c/HiRXTt2hXXrl3DY489hjVr1nhdjUThZ8aMGRg5ciReeOEFn1nL\nRD532hJGRijM10euxn8Bjz/+OIYMGYI2bdp4tyUkJODjjz/WnMGfIAiCIAj/oQWXCjnHjx9HUlKS\nN+Cax+PxYNu2bahXrx6GDBlSYNo8QRAEQRDmQxavQkx6ejpiYmIQHx/vXTdNuK9o0aIIDAzEnDlz\nsHTpUp/10XgKs7mXIAjCSmh4JaQg4VVIyc7ORufOnfHoo49KpuYQwucSO3PmTIF8Xh6PhzoPExk9\nejRGjx7tdDMKBXQvzYXup7lQ30nIQa7GQghjDAMGDECdOnVkRdelS5e8ncKKFSsQHR2tOYkqQRAE\nQRDGoOlshZCtW7di3rx5iI6O9q7tNm7cOG9m9sGDB2Px4sWYNm0aAgICEB0djY8//tjJJhMEQRDE\nvwJyNRKKkLncXBISEvxasofIh+6ludD9NBfqOwk5SHgRilDnQRAEoR/qOwk5KMaLIAiCIAjCJkh4\nEQRBEASTRKy8AAAgAElEQVRB2AQJL4IgCIIgCJsg4UUQBEEQBGETJLwIgiAIgiBsgoQXQRAEQRCE\nTZDwIgiCIAiCsAkSXgRBEARBEDZBwosgCIIgCMImSHgRBEEQBEHYBAkvgiAIgiAImyDhRRAEQRAE\nYRMkvAiCICwmPh44c8bpVhAE4QZIeBEEQVjM2LHA99873QqCINwACS+CIAgb8HicbgFBEG6AhBdB\nEIQNkPAiCAIg4UUQBGELJLwIggBIeBEEQdgCCS+CIAASXgRBELZAwosgCICEF0EQhC2Q8CIIAiDh\nRRAEYQskvAiCAEh4EQRB2AIJL4IgABJeBEEQtkDCiyAIgIQXQRCELZDwIggCIOFFEEQhJTUVOHvW\n6Vbkoya8vv4a+Ptve9pCEIRzkPAiCKJQ8thjQNWqTrciH48HSEsDKlaU3j9wIDB1qr1tIgjCfkh4\nEQRRKElOdroFHCkp3KvHA5w7B1y+LH8sY/a0iSAI5yDhRRAEYSFLl+a/DwzkXpcskXY9kvAiiMIP\nCS+CIAolbhExQUHcq8cDBARw71evlj7WLW32F8aA7t2dbgVBuBMSXgRBFErcImJ4y5bHAxQtyr2f\nM4d7FQf/u6XN/sIYsGgRkJPjdEsIwn2Q8CIIolDiFhFT5J9eVmjx4reJg//d0mZ/4a/j9m1n20EQ\nboSEF0EQhRK3iBihxYsnL0/6WLe02V/468jKcrYdBOFGSHgRBFEoOXXK6RZwCC1evCDJzZU+trAJ\nL7J4EURBSHgRBFHoOHbM6RbkI7R48YJETmAVBuGVnQ1s2sS9J+FFEAUh4VUIOXv2LNq0aYP7778f\nMTExWLBggeRxI0eORI0aNdCwYUMcPnzY5lb68tdfjlZPCMjJAX7+2elW+EdmptMtyEdo8eIpVUr6\n2MIgvH76CWjfnntPwosgCkLCqxASGBiIKVOmICkpCYsXL0ZcXBzS09N9jklMTMTmzZuxe/duDBs2\nDMOGDXOotdwyKTVqOFY9IeLpp4FHH3W6Ff5hdF3EPXvkRZG/bRFavIoXlz5WLvbrTkI4k5FmNRJE\nQUh4FUIqVaqEevXqAQDKlSuH+++/H7t37/Y5ZufOnXj66acRHh6Onj174tChQ040FQDwww/ca2H4\ntV8YWLbM6Rb4j1h4Xb2qTdTs3g1kZJjbFqkYr9RU6WMLw3egMFwDQVgJCa9CzvHjx5GUlIQmTZr4\nbE9MTETt2rW9/5cvXx4nTpywu3kAgCFDuNdbtxyp3hUEBZFbxkzEwissDJgxQ/08K0SDlMWrsMxq\nzM4GypfP///MGV837512PQRhBwFON4CwjvT0dHTv3h1TpkxByZIlffYxxsBEvaJHxj8zevRo7/uY\nmBjExMSY3VQAwI0bQHAw8MEHXIzRli2WVGMr2dlc7iYl11duLnfcrVtAsWL2ta0wI3W/xclKpbBS\nKGgp26r633sPeOed/ASuZrBtG9Cihe+2atWAcuXMq+NOIiEhAQkJCU43g7gDIOFVSMnOzsZTTz2F\n2NhYdOnSpcD+pk2b4uDBg+jYsSMAIDk5GTVkAq2EwstKeCvA0qWcy0fMjRvmx99YTVAQMHYsEBcn\nf8zEidzr9u3A3LmAzFwIyxg7lsu3NHasvfVaSREJW75T8VNCK5easLJKeI0aBbz0ElC2rHllJiVJ\nb+cXBQf+XRYv8Y/SMWPGONcYwtWQq7EQwhjDgAEDUKdOHbz++uuSxzRt2hQ//vgjrly5ggULFuC+\n++6zuZUFWbcuf107KUJCgL17pff98os1bTKDgweV9/MzOufPBxYutL49Yt57D3j/ffvrtRKjC1Bb\nIRTcILysQErcEgShDlm8CiFbt27FvHnzEB0djfr16wMAxo0bhzNnzgAABg8ejCZNmqBly5Zo1KgR\nwsPDMW/ePCebDADYsYNzuQn56ivO7bh0Kff/pUsFz8vLAx55hIstkZst5iRqM+z4AcypQdfoDEA3\n4ybh9cUXztbPY/bnrMVteScJSYKwCxJehZCWLVsiT4NfZcKECZgwYYINLZImLQ0oU0b5mG+/BbZu\nzf9fano6f6lpaUBEhHntM4sTJ7h0GSdPSu93Wnj9W3BK+GzcyL1qsXh9/bW2SQBuoDAKdoKwAzIW\nE5azZg3QoEHB7eHhwOzZ+f9LDUribWKLGJAvvK5eNdxES0lMVE4QGxbGvZLwMg+p3x1OW5zsKN9O\nhK7GwpyJnyDMhoQXYTk//ywfm3XhgvK5f/7p+7+S8HJ6Qd4PP8x3KwlRG3waNdJ2nN3k5QEbNthX\n37p1+dYhfzEivN5+W/45NYMqVaz9jG/dAs6ft658MUJXY2FJj0EQdkCuRsI20tLyrTs8wg5bqpO+\nft33fyVXo9PCa8QIoGRJbvaYHtTW77MaOZfRL78AnTvb16727bnB3Ixs51qsp2LGj/e/XicZMQL4\n9FP56zTbNajF4kUQREHI4kVYDt8pX7tW8JexmvASoyS8bt92PgmpPykL3DZ4de5sf51m3QOjrkYr\nYczaNly8aF3ZUgiFF1m8CEI7JLwI25gxo+BMqMDA/PdaOunc3ILb+E4/Lo6b1ejxcHFVTmBkcWan\nLF6MSbtu5di7V9/xTiJ1L92wDqJUu44eta5sM8jJkb53ZPEiCGOQ8CIsh++U9+8vuE+v8FIaUPft\ny9+mJUu5W3Bq0Bo7VjlvmpgGDYBZs6xrD2Ctxctp5CxeNWsCdiyVatTVWKsW0Lt3we3+xHh5PP/u\nJcKIfzckvAjbkHITCoWXFpSEl9Aao7dcN2C3AOOFsJ4BWS3+6vJld6QZcKOrUQkzXORWXd+JE9IW\nZL0WL48H+OOP/P/vFOspQZgNCS/CNqQGbb2dt9SAym8Tlq/HkuM0Troa9aImaDMyjLWFx6x74EZX\no9YYL7mleMxi2DDgiSf0naOWpV6rxevAAX31EkRhhIQXYTl856tmLdEyKA0aVHCbEeH11FPA9Onq\n9dmBcEkZM7l6VXkJIr5ePRaqAJV50Gr77cKtFi8tbTC6FI/W65s3D1i2TF/ZUm0S1qe1buFxbrCM\nEoQTkPAiLOfzz7lXM4SXFPwgKzxfTXgtWcJlxXcTZguDL78EevUyt0w1YaVlGRk7MJJOwg60tCE4\n2No6pSao8GzZAjRsWHC72qLjNKuRILRDwsvFXLlyxekmmIqbhJeV6HWnWOVqVEsvYIWrkRdmWsue\nNQvo2FF/O9Rwo8XL6fp5lITXr78Ce/YU3G6WxYsgCBJerubBBx9Et27dsHr1arBC0LNZLbyEKFlm\nhg0zVo9WJk+2tnytKA2wgHZX4zff5L9XE178AK3Vbfrdd8DatdqO1QNff6dO+dvc8BVSakOTJtyr\nUZez1mV70tLky5B7FqSEl3C5L7J4EYR2SHi5mCNHjmDgwIGYO3cu7rnnHowcORJHzUr64wB6ZzGN\nG6ftOCmLlxJff829uiXGhG+32vJJelEbwLXerwED8t9rjeHSmn1e2EYzPw/+2oSuT6dFgNbgeqPt\nVBNeWmceSiElvFauVK+bIIiCkPByMUWKFEGHDh3w3XffYcaMGZgzZw4aN26M9u3b4w/hvOw7BKkl\nfYQdvbjzFnbsSui1EJiV3T452Zxy+Os2O+mrmsWLh/8MtCy5pCa8tE6k4LFKeEmJcTeIAyVx5PTS\nUYA+4SWEFskmCO2Q8HIxKSkp+PTTT9GwYUNMmjQJn3/+OVJSUjBmzBj06dPH6ebpRs3iJXZ9CQdl\npbgppXieW7eAOXN895mVuLFCBd+krXZx+zYwZIj6cVpdjXrQGjzvtPCSEjFOiwCt9VvlavTn+o2m\nk3ALR48CtWs73QqC4CDh5WKaN2+Oa9euYdmyZVi9ejW6du2KwMBANG/e/I4UXlotXlIDRHR0weN4\nlDr9jRuBfv2k95kx0F+7xr2eP69+7JYt0tv1DoinTgFTpqgfpzYYiq1CZqY60Cq8rBJDUhYvN4gD\nuett0MB/gWSG1clqi5dT6SQSE7nVAS5cALZuta9egpCChJeLef/99xEfH4/KlSt7t/3www8AgBEj\nRjjVLMOoubKUOmml7UoWLy2d+7hxwOrV6scpcddd+e/l6mzVSnq71eJDDj0CVit8mSNGSKclECO0\nylnhanSD2OKxOsZLzKBB3PVbFeMlxE33WQq+/f/3f0DLls62hSBIeLmYCRMmFNg2TmvEuc18/z1w\n//3KxwiFl9Es9VLb/U0d8M47wJgx2o9Xw2mXFo/WBbv1JHDVKo5WrZJOSyDm3+RqVMPfRLri65sx\nA7h507828dzpMV78s5We7mw7CAIAXJJnmhDy888/Y/Xq1fj777/x6quvelNJJCcnIzIy0uHWSfPr\nr8DBg8rHCK0bWiwS/li8eNwyc1EJqwanf4yjqvVaEdRtJJ7J6uB6N1hl7J7VmJtrj6vRDfdWCb79\nbhGCxL8bEl4uJDIyEg0bNsSyZcvQsGFDr/CKiopCs2bNHG6dNFqCrqUGQaWYD7lOUo/FS2kwF+4z\nc9DXW5ZTg4FYcJlp8dI6EFt17W60eNntagTMczWqfe5uj/G6E36AEf8eSHi5kLp166Ju3bro1asX\ngu6Q1Z61CC/hYCw12GsRXsWKmR/jJcfZs0BqKlC3rvEy3MD8+UCJEsCTT/pu37DB938zY7y0YqXF\nq2hRdwkvtTb462qUQm9Zap/BsWNAXBwXWmC0HifSZpDFi3ATJLxcTFJSEj777DNs374dt/7JgeDx\neHDy5EmHW1YQLYk1pdZ20zIQlSnDLfgMcB2oFouXFtQGmc6duTQWVnfWVpffpw9QqpRvfAtjBSc7\n8PexRAn52CCt4sjq1AlaynWb8NJav1WuRn+un/+cVq0CFi0qKLzcHuNldOFxgrACehxdzOuvv452\n7dph/fr12LVrF3bt2oVEs7NsmoRRV6Nei5fHY56rUVyumBs3pI/dsIGzhAHA338DO3b47p81C1ix\nQlu9dqFkJTTDFaVWnxzCdpiV2Javv0gRdwkvtTZYYQkSuhq1YNSl6PYYL3I1Em6ChJeLycjIQI8e\nPRAZGYly5cp5/9yIXldjyZLcq94YL/FgKi5XjNEONycH+Osv6X3t2gHjx3Pv+/cHpMLuNm3SXpcd\ngkDpnpmZekGveLDS4iW2cjgtDrTGeE2bZrx8MWbFeIndoHl5wLPP+tajtU3kaiT+7ZDwcjGPP/44\nBg4ciPXr12PPnj3ePzei5GoMDeVepTpnLRYvYWep1dXobwd75Ijyfj70Tm7R6DJltNdl5WDA31Mt\nFi+9a14qoVXkmC2GLl3irpm3eCUlcUl03YIWi9f06eaVbVaMl7jsyZPzv9d3AmTxItwExXi5mI0b\nN8Lj8eD9998vsN1tKFm8eJFiVHjx2eH79wd+/NE+V6MSxYtzr8WKybskrUKPMCpWjFsiScs9M3NW\no1MWr0qV8sstUoRbT7NtW26b04OvE9YWq1yNp0/7WhT1xHg5cR/I4kW4CRJeLiYhIcHpJsjy999A\n3775M+OUhJeSa0GLBYCnSBFpV6NSGVrTSegVAMWKca+8ABMzf756Hi0ep12NVqSTsDqQXA0pV6Mb\n0PO8m1G2Va5GLXX7c5zZOC26CUIICS8X8u233yI2NhYff/wxPIIegzEGj8eDIVpWSLaYnTt9XTi8\nq/H33wsuFaMUQ/T22/nv+UuVWiQbyBdeVrga//6be715k5vJyMegycELL/5VzOHD2uvW21Y9g4jc\noKt0z/yxUuhNiaC2kLdReFej27BSeMjNatRTP/9srV0LdOhQ8Dy97fcnxuv2bc5aLn7e8/K465Jz\n80shLuPsWW6Re/77O28e0Ls3CTTCHlzYNRE3/5nLn56eLvnnBsQdFG/xevdd/8uW65iLFNE+q5GH\nb6dUoLxUAtWJE4EHH1RvI3/86dPqxzqJ3L2Umu2nZRUBvQMTL2jlsDO43m769wdOnMj/nw+ut3Nw\nF1u8tAonuYWk7UwbUby4tNV40CAgIkJfWeLvwdSpvtbq2FhzZ9UShBJk8XIhgwcPBgCMHj3a2YYo\nIB48eIuX1KBi1FoiPu+994AlS/RZb/j21KjBbfvlF+l28YO02kLePHPmcK9mWGzMsCLoPUfqnm3Z\nArRpI32+XoHE11elinJ7jQqvEyeAsmXlJzG4weI1a5Z08l0++F+MmeLlq6+4V3GMl1aLlxg1K5VV\nMV5SP5h+/x24ckV7GVJ1XrpUcB9Zuwi7IOHlYrKysrBx40asWbMGaWlpXrfjN99843DL5C1eUp2X\n3uVj5Dr58uX1uxrF7XnkEem69Xa6ZuecUuPIEe7a773XnDqk7lnv3gWz2/NoFZh6XVJGxcY99wBP\nPAH89JP0fjdYvIQ0bKjP4mQEYdmvvsq96rV4GRVeRtpoFCMCSdx+YUwq/2xT4D1hFy7qmggxcXFx\nWLFiBZYuXYp69erh4MGDqFixotPNAqBPeDVooK1MvuNT6gj1uhqVELaVH6THjdN/rlGuXQNee03b\nsR07Ao89ZrxuLcIL4GJqtMQKqWHHWo3XryvX7xbhVbQoZ/kDlC1x+/ebV2dODvdqdjoJMy1eRoP9\n/Xn++fshJbz41TEIwmpc0jURUqxfvx6fffYZgoOD8dprr+Hnn3/G+vXrnW4WgPzOj5++r+RqDAgA\nGjVSL1PN1QhoT6Cq132gd5A2Y1Dfto2LNfnxR/VjT5/2jRfSi1bhVby4OcLLjlluai5Mtc/I4wHO\nnDFevx6E7kWrXFrC+yGc0CLcbrT7MCq83IK4TxEKL16kRkTod2EShBFIeLmYokWLwuPxoH79+vj1\n119x7do1b+C90/CDBx8roWTxYkzfkkJKnbzetRqVBrkNG4CmTdWP01uuVvgO/+effbdfugScOuV/\n+YD8gKgkvJSOd3vaAJ6cnIKfkdRndu6cte0Qiy27g+vFazX26KF8vFaLlxnPQWJivktUD0bun/j5\nFSZ8/vXX/Pe//aa/bILQCwkvFzNw4ECkpqbi9ddfxwcffIAOHTrgXTOmDZqAnKtRysqgVXjxnaMZ\nrkatAwO/9KXezjwpSd/xUshZkdq0AapX9798Hj1xd3LCS+9Aa4dAU/rMsrMLPotyQt4urJ7VKHV9\nws85Nzdf7MthtqtR6diZM4HPPtN+nj+IU9rw/RFjvnGN5cvb0x7i3w0F17uYdu3aITw8HOHh4d5k\nqidPnnS2Uf+gd1ajUHipdd5OuBr1DoZqA5gW5IQXn6lfjNHZjFKz6OTKklv6yeisRrOO03tuUpI2\nsW+mCDp4EKhdu+B2odiyW3gJLV716xsXXuI6tKyrqrTdH/yxeImFl3gxey3PDEH4C1m8XMzTTz+t\naZuY/v37o2LFinjggQck9yckJCA0NBT169dH/fr1CyxJZAS1WY3CDk1uEP/2W+5VLMCEBAYWnFEo\nddzIkUBKim97hg6VrtdOhHFaViUPFaPH4iU3qK1ezb2aLaisckl++qk2V6OZIuj+++VFs1TOODsQ\nxnhduZIvvPr101eO0ndSuF9PWVrug1mfmZzwysjwv2yC0AtZvFzIoUOHcPDgQVy9ehVLliwB+6en\nSk5ORqlSpVTPf+655/DKK6+gb9++sse0bt0ay5cvN9xGsYtGTnidOsXNFipbNn+bmvVEaX+ZMgVn\nH0kdv2MHlwz1o4/yt02erFyvEKsEQWIicPfd3Hs3Ci+56+aFlxpqA7TW+szACVej0mdql6tReJ1C\nixeQL7yCg6XLMDudhFZLq9XwzyMfk3rkCPe6aJEz7SH+3ZDwciFHjx7FihUrcO3aNawQ2MKrVauG\nzz//XPX8Vq1a4ZRKdDYz2APevMn9cpbroMUDDx+rJLX8iBxKrsbwcCAtTfp4MWYFqFuFVTMFxedI\niQstWer9qduNwksKOywcdrkaeYSTNfLyuO+sVsTLdokxM8bL6H0wcp7YxbpyJfe6dKnvdqcnhRD/\nDkh4uZAuXbqgc+fO+Oijj/C2cDFDk/B4PNi2bRvq1auHtm3b4qWXXsLdvBlGhTfeAKZP980AD+R3\nWDdvcqkPqlXz3S8cBLVavKSOCwvTLrz0xCU50eHKCS/x9fmD3EBvtfDSip3Cy2pXoxJ8nJ1SHi+e\nXr38qys1Nf99bi4QH6+/DDlLlXC73HulcvRi1uejNSaThBdhByS8XEpAQACWLFmCYcOGISgoyNSy\nGzRogLNnzyIwMBBz5szBa6+9hpX8T0AJhEsXHTwYAyAG8+b5HsN3WGvXAlFRBTswYdC2VuF161bB\nfXe68BIOJHLCKzNTuQy9bfVnNQFxnW4emMTr+jlh8ZK7P1pjvDp3BqKjzas7Nxe4cUPbsUptM/Pz\nd0KMabUu+7N2aEJCgncSFEEoQcLLxXTs2BH9+vVDr169EBkZCcYYPB4PGmhNBS9DSEiI9/2AAQPw\nzjvv4Pbt2yhWrJjk8ULhNWYM9yoWXmpomdXIw3d+KSkF94WGFsxYbobwcgK7Yrz0uhqlsCpY3kwh\n98wzvv9rGaDtSCchnFmal6fcLn+EoJQ40pvB32xXo1KMl52B7HZYvGJiYhATE+P9fwzfWRKECBJe\nLmbr1q3weDz4+OOPfbZv3LjRr3IvXbqEChUqwOPxYMWKFYiOjpYVXVpR67CEwmvYMONlBQZyOZqE\nyFmI7BI2RjHaPj0DlhFXo1w5coSGAosXA+3b6ytTrVx/+fNP9WOsFl78s8p/Brm58ik7zEIcXK/n\nebEzj5c/7dGLVuEVG+v+2FDizoeEl4sxarbu2bMnNm3ahJSUFFSpUgVjxoxB9j8jwODBg7F48WJM\nmzYNAQEBiI6OLiDsrCAwMP/9//6nfKySKAgMBLKyfLc995z0sfwMJi3odb2YgZPWIWFup717fbcr\nxXhJ7bt+nZtF6jbhpQWzP1/xAD98eP57xjghpJQrSirnmlbkEqiaIS6lJrxoaadb8nhpFV6nT+sv\nmyD0QsLLxVy5cgVff/01tm7diuXLl+PgwYPYvn07BgwYoHjewoULFfe/9NJLeOmll8xsqmoHK5cR\nXQqxRatKFeDsWe59QEDB3Dty8FnptWDXtHczBnq9bVNyNd4pebmswmyL19Ch0m54ocVLTXgZRUoc\nX74sn9RYqX5/XYpasGNWY1YWtyyUnoTHN28CJUrobxdBaIUSqLqY+Ph4hISEeFND3HvvvZgyZYqz\njZJBrePVkH7MizgYWDg4BgaakzVeK3d6QkW19AVaB0yr4uWcFmpmf74HDijXo+ZqNFuY9+tnjqvx\n8OGCZcvVqbbdzs+8WDGgRg1uXVatlCxpXXsIAiDh5Wp2796NF198EUX/+YkcEBDgfX+nUbq09mPF\nmenFwktsETMDLVnOra7TqvP0Cq/Ckk5CS71mf85qaTrULF78cUaQO09Pl6EWXC+8Pjs+O7NSgJiZ\nooUg/IWEl4vh0z7wLFmyBK1atXKwRfIIcwdJoUd4AdwvVR5hfJhVwutOcjWaUafe9ABaj7cq0aoZ\nCO+DVekx1JZistLVyCO+JiNlmuVqVBLxbpzVSBB2QDFeLub111/HSy+9hNOnT+Oee+5B9erV8eWX\nXzrSlpQU3yBsMW++qXx+aKi++oSD04IF+Z11YCA3i9Hj4TpTswyATgTX24UZrkap45o3NxZQbxb+\nTE6wSvBpsXipuRqNiMEDB4BNm/LrEZcp1Ra5+pXwN8bLDKFr5DtpxY81gjAKCS8XU7NmTSxfvhyX\nL19Gbm4uIiIiHGvLl18Co0YZP1+vxUvoXrzrLqBSJe69MLj+zJn8JYnswOl4JKPoEV56rnH79oJu\nYb04dU/1Ti7QW64YqyxeO3YAjRv7Lr4uviY78njJ4a/FS6+rMSmJm8gjXohDKoksQTgFuRpdzOef\nf460tDRUqFABERERSEtLc8ziJZVFXg96A1aFg5Owo+UtXoD/g74QxriM+2KEdRcpAsyebV6ddi5X\nI0aY1FNqn9w2s5eG4c/79FP95/oT62aV8FIqT6vFSw/NmgGrVvm648XiT8/3hK9fvBA9j1w6Cbf8\nKKlTh7sngggNAEB6ujPtIQgpSHi5mBkzZiAsLMz7f1hYGKZPn+5IW/wVCXqNdcJf6WLhxYtAsxOk\nasnhs3u3uXUaQe8gJ/fZ8cJLS6oPqxa95o8fMULfef7UBVjnapR6Jj0efRYvvdd1+7ZymVLZZdRc\njZ9+Cvz1l/Y22DmrUa0vSk4Gqlb13UbCi3ATJLxcTOnSpZEmmI6TmpqK4OBgB1skjdxgI0RvYnwt\nFi87MtOLr0NtHUV/yrYKtUG2Y0fjZYjLMooVFpPwcPl9drsa+brMdDXyC1jk5fla0cy6Jj3uOSMx\nXnbN6gX8t9gThJmQ8HIxffr0Qffu3fHdd99h4cKF6NGjB/r16+dIW5Q6u3fekd6emQl07Qp88YV+\n4SW0eAnfBwTYK7zE+Cu8zBBbVidhdcLVKGTSJHMSWIoXZLDD1aglxsusJYOmTs2vUyjm7JopajRz\nvRNLBhGEm6DgehczaNAg1KxZEz/88AMAYOTIkWjdurXDrSpIUpL09uxsbkAoV85ci5cVrka5IHNx\nx38n/nJWczVqwapZa1LH79xpjmVRbFkS5nKyM52EMBu8ma5G/jixxcsJ7Izx8leMPfssMGeOOW0h\nCCOQ8HIxHo+nwIr3ThMeXjBnl1ynm5ubvy8oSF89SjFeVli8tM7u89ea4MSSQXLoSTNglavRKgEE\nFJzNt2IFN/vv7rutEwpqz4cVebzy8nyD641aosT167FWGXlujD4zetZglUIc/0UQdkOuRhezd+9e\n9O/fH/fddx+qV6+O6tWro0aNGo60he8khR08j9xgwwsvj0d/vi23xHhZmVhVy8Dzxx/A888bG6TU\n0kjw1hV/Bmqt+7WeV7GisXKkkEqjwMctmSH4EhKAv//23abmauTvu79MmAAsW5Zfp/D74pYZhnL4\nc+/Pns1fvsgoUn0YQdgJWbxczOuvv45Bgwbh/fffR5Bek5FF6LGS8MLI49G/GLHdFi8xZscyGWXB\nAgdEsWcAACAASURBVGDmTN97oHXgVnNb6REAcoPlkSPay1Aql8fMxYmlxL54EWh/Ps82bYDHHuMs\naTxqwfXCNkih1dU4cmT+e3HcmF3PqJZ0Ema3hc/h5w8kvAinIeHlYjIyMtCjRw9XrM/IDxZSAkqL\nq1Gv8JKzeAUE2BvjpXacP2gRPm6xXsgJCv6zEAsardjpalSq3yji8+VivLRavIy6Gp22eOmp058E\nqmZcGwkvwmlIeLmYxx9/HAMHDkTv3r198nk1aNDAsTZJdZZy66AJXY16hZcwE7ewzlKl8hNCWmnx\nathQevuqVdbVKebKFW6GH+BrCTFj8HGLq9FKlJ45J2K8tFq8/K3TjM/TLMx21ZPwIgoDJLxczMaN\nG+HxePD+++8X2G43ShYvJeHFn6tXeEnVDQDlyxcs30qcFBQnT/p3vtogboar0V+kBmazUghY7WoU\nwpcj90zqsXjpbZMR4WUGWlyNSuc5lSqChBfhNCS8XExCQoLTTSiAVGepFlwP+LeYtbDOcuV8yzeL\nO8liY+aAZVaaCCOuRsby4/XsdjVaJSSVkgnz1kWzLV7C7xlfj91Y5Zq3wtUoFS7br5+5y4ERhBIk\nvFzMmDFj4PF4wBiDR9ADxcfHO9YmqYFBTgD542qUq1P43okEqv6iJ0jerIWK5crQI5ascDWuWWNO\nOXJIPXNGY9G0opQzTe0Yo5hp8dKaTsKfOuw6V+5YsngRTkPpJFxMyZIlUbJkSZQqVQq3bt3C999/\nj0v+JrExiJKr0U7hpVbvffcZr8cO7HSvGBF2ds7mlLI8mFmPkqvR7Pq0CBKtFi87XI1Wu4zltgv/\nN/Jd0NNuOUu8lgnibrSAE4UHsni5mGHDhhX4v0uXLg61hkNPcD2/3Wrh1bw5l4Zg3TogMREICdFf\nhxs7WiutJDzi6/70U+XjzLxPwtQR/pYvdZ5aHjN/6jPajsLiahQLRDMsUWaf27Wr9HYlwR8czLm/\nxTNFCcJMyOJ1B5GZmYnr1687Ujc/IBiN8bJSeAUFcR0mwM16NJOcHGDxYvMGMz1LDhmJ8SpWDJg/\nX71sva5GLS40rWVZgVS9Ssvo8Mfv2GFu/f66Gp0Krr9927/PTpxI1mhbzp8Hjh/P/9+fHxzLl0tv\nV7J48c+MXetdEv9OSHi5mAceeMD795///AetW7fGSGHmRAfQ6mosX94+VyNj1q5V160bsH+/OWX1\n7p3/3ooYr6wszuqnBT2DWtOm+ttipH4zLSdSz4RYbL7yivb6/G2TVcH1RlI2iI8pXhxYuNC40ImN\nVd6fklJwm1RdbdsC994rX45VwfV8W/hnxo0WcKLwQK5GF7NCkBK7ePHiqFSpkoOt4dAaXF+sWP6v\nRiNLBqnVKazXDOGl1tE6/QvYSOoHKxK0mjkgSQVym+lq1GLxsgNhAlX+f7Mxw9X4119AlSrG6lQ7\nZuvWgtuEi5bzqGWm9+dzS0oC7r+f65vkyuWfmaws/evLEoRWSHi5mKioKKeb4EVvcD3v+jMjZ48W\n4eVvPIYTv3DV7omV6ST0uhq1Ck83WQqULF5mIRaMdgTXT5umrU168XisSxAs1aYlS8wpRyv8OqBK\nsxr5Z6ZVK2DvXuN1EYQS5GokdKEluP7cOSA0VNtAY7ROwFfwUSCsPEpxR2bl8TKC1fnI7LB4rV6t\nLa2JmUsGvfhiwW3C6xFal/Tg8QCLFikfY4aF1Clxzt9b3pIlFQ/KPzN//GFPm4h/JyS8CE0oBdeL\nB57ISHNdK3Ln84LPDIuXG/E3tYOaRUvP53L+vPZjjSC0GJmVZkDLrEYjXL3q6ybLylI+Xvw5mB3j\nJUYuqFyI3vvF8/nn+tujVq8SZk7e4MviXY3btxcs38pYUYLgIeFF6EJPHi/e4uUvdrga3Yi/cWVa\nhYeWz+j777UfqxUn3bv+1B0WBkRH+25TK0+rxcvfttmJ0Xxheq7PTKsoX1bx4tzrvfcCDz3kewwJ\nL8IOSHi5mHXr1qFt27YoU6YMQkJCEBISgtKlSzvaJq3B9XoGGiN1Cuu1I7jeCeSSTeq9n1euSG83\nkrpADany5PK8SZ1ndx4vo8ilT1BCi+vdqNi28geOP5id79kMi1dAALBpk3SQPQkvwg5IeLmYESNG\nYOzYsUhNTUV6ejrS09Mdz+NlxOJlVfJPu9JJWIXafbF6JqVdWfQnT9Z+rJnCSwqrZhQqCUdxnUpt\nyM42r11uQC0eTS/+fCf4+160aL6lS9yWO7EfIe48SHi5mKCgIDRs2BBF/EmCZRJ6YrzEx1ktvADr\nZzUeOuRf+UZQErRSnDzp+7+axYe3eFmddVzO6uGUlTE5WZsVTgp/Zgzy54s/l7Fj899nZxesQ5hQ\nVPjeH4R1XLvm20YjZZh1jpU/BoTCS649JLwIO6DHzMW0atUKTzzxBLp164YyZcoAADweD7rKrYVh\nA+npBbdZHeMlh9Di1aJF/kyk6GjzEp7yCBOfGuGpp4Aff9R3TpMm+e+1DEh33829fvYZMHWq+vFW\n55Myej7fruRkLhGv2fVWqAA8+6z+tvmLlAX4vvt82y62eF27xsUiMcbluJJLLurPfX/sMe71rbd8\nt586pT7L0WqsCK5X+h1LwouwA+dNKYQsly5dQqVKlbBlyxasXLkSK1eu9EmqaieLF3OvZ88W3Kc3\nxkstD6xSnh2pehkDqlUDNm/m/t+3z3fWWd++3DF8UK0UfIf+3HPa6hZTt67y/oULlff/9JP8PvFg\nq1Uw2eFK9KcOtUF0wwb/ypJqG79tzhztZavVI9wu1w4lC7DwnLJlffcJLXNa0lbo4eRJIDWVS/8i\nxYIFwLhx5tYJOJ9OQsriJU6gShBWQo+Zi5k9e7bTTfDCW5Okps6rucT0TtkuWlRbrItQeInrEP6q\n1eOpNSokHnqIE3x6yhUOQBUqyJ8rHqjMGLiMuhqlyjET8YSCzZs50S+3eLcc770nvd1fMap2vbdu\nAe3bA7/+Kn2u1LPKi6033+QWeL992/x2SR1/993Aww/rr8sIZj0nZli8lMISSHgRdkAWLxdz6dIl\nvPXWW6hduzZq166NESNG4PLly043qwBqFi8xahYtrfFa/C91qcFMWAb/Xsuga3Rg9jfGTG2mmxXW\nK7PyZSltN1IWj8fDCVotblNxWXZNHJBi3bqC25QsXs8/n7/dSI4vf8TI9eva79ULL/jWafVECLPP\nVRJewhmPBGE1JLxczIQJE1CmTBkkJCQgISEBZcqUwfjx451uVgGEwksYkyP3C1+to1fr/Dp14l6/\n/FK+TL0WL39/kau1Wc3ipYS/Ad1KnD4NrFljrHypOvzN28RY/lIt/ua7UnI1GsWI8BT+CFH6kcA/\np2aKWy1oLfd//7Omfj1YJbzI1UjYCT1mLmbDhg3YJ/BfDR8+HPXr13ewRdIIhdfhw9yrP7Ma1axH\nP/8M1KjBLeoLSHfGQrGlx+JldLq6EeGldb+4TWZYc8xK8yHnTvanvKNH9ZdptijJzpa2zFoxq1F4\njNH7aHfclJWxfWbVI1eWsG+gWY2EE5DFy8XExMRg4sSJuHLlClJSUjBlyhTExMSonte/f39UrFgR\nDzzwgOwxI0eORI0aNdCwYUMc5tWSDGoxJ0LhFR6e/96oO0KL205YrlqMlx43oNE0A0Y6bLkEqVLH\nCfebNcjeCa5GrfvNFh7r10tv98eiJyVShWLLTveoGYLZic+cYryIwgAJLxfz1ltv4cKFC2jZsiVa\ntWqF8+fPY8SIEarnPffcc/jll19k9ycmJmLz5s3YvXs3hg0bhmHDhimWpzQbUA5/Mtdr6fyEViAz\nYrz4Dt0q4eXPgGLUCufErEYz0knIla10rBg565FVM0L1iC85wagUF1mYcGOMFw8JL8IO6DFzMZGR\nkZg8eTIm60n9DS7/16lTp2T379y5E08//TTCw8PRs2dPxMXF+dlSaeRiWtTQa/EClOPI7LB4GQmu\nF1vt5HCzq5HHLOuZHuGlVpYVGLF4CUWgUsxjkSLucjVadU+1LOLNo0fY37qlrSylBKqFcc1Xwn2Q\n8HIxqampWLlyJbZv345b//QqHo8H33zzjV/lJiYmIjY21vt/+fLlceLECdzNZ+A0iDA/Fz8jDQDi\n47nX0FAuIWRQUP5xkZFc53fhQv624OD8VAdyvPgiMHIk914th1NwcMFtcscbHfj8tXgpWbWsWjrI\nTOHlhJXGiKvRieD6jAzfY5RivLRss5sSJYCbN80r7+WXjZ+rdJ/5DPxqaE2gavaPE4LgIeHlYl5+\n+WWULFkSbdu2ReA/kb4eE3oCxhiYqAdTLnc0AC7YePDgGEyYEIMSJbhO6cQJIDOT67Bq1lSu9/Rp\nbvo6Y8DBg0Dlyvl5wYKC8hcerl2b6+xv3PAVaUI6dwbmz+evR7qD/PlnLv6sYcP8bYGBwNdfc3Fr\n998PXLwITJrE5TMaOxaYNo3Lb9SoEVCyJHfMgAHA0KFA/frA998DdeoAbdr41tWsGScs69blcnIt\nXswJzyNHlJfMeeQR7l5ERACPPw7Uqwe0asXNDk1K4o55801pkREUxKXUKF8eaNy4YPlWDBpGBJbR\ndljharRiJqmWY7UG14vLs2rmq57j774bOHBAuQz+R5Yap09rr9cfdu7khBi/MsDly1wf9fPP0sfz\nC2YLhVdOjvZkzgC8s88JQg0SXi5m3759SEpKMr3cpk2b4uDBg+jYsSMAIDk5GTVq1FA4YzQATqQI\ng+eB/GVqxEjNagwN5f4AoGrVgufUqeP7f7lyCk1CfscvN5jxaSeE7ShdmlteSNjuXbs4q1hgICe2\nxNm6hekW+F/rLVoAW7f6Dj5Xr3Kvhw5xwuuHH3wTo771FrBsmW/Zd90FrF7NvRe7YOrV4yyBcoNk\ndja3kkD58sDu3dLHyGGVq1GPK66wuBr1nKvkavRnViN/vlPxYWqrUfBMnOhfPVqvr2JF3yW3qlTh\nXsV9Al/eRx8B//0vt9wWj9zMVjliYmJ8Jj+NGTNG+8nEvwoKrncxPXr0wMyZM71uRrNo2rQpfvzx\nR1y5cgULFizAfffdp+k8sejSilXJP9WElxRyx5qZFkGujHbtOKElrlOtLLV4Nr3t0FuOFqwY8O8U\n4aVl9q6W9CpSLjAt7lSrr13L52BVG/TEeBlJYcOXV6YM0KAB9x3l0bJ6BkEYgSxeLubDDz/EzZs3\n8cILL6DYP7Zwj8eD69evK57Xs2dPbNq0CSkpKahSpQrGjBmD7H96kcGDB6NJkyZo2bIlGjVqhPDw\ncMybN8/0tlsdG6EUTK/1HDFWuZeE/+sVUfw5cgOwGbO89GDmAGumxUuMv65GPehxB6pZvPSUJy5b\nj8WLP05q0Xu5Y7Vu9+dYf76jZizq0acPwIe/kvAirIKEl4u5ceOGofMWqq3IDC4r/oQJEwyVrxer\nRJjQ4qX3HCFGfikroRTDo1c0qbXn/feVF9iWw2wBYlYqBLNcjRrS3RnC6PVpecbUXI3+5sCS4urV\n/Pgmf3BDCow+ffLf+/M9bt4c2LaNhBdhHSS8XE52djb27t3r4258SGskq4OYLWaUytfqapSyHgnR\nM3gYuSajs9aU2rV0KXDypP7ztNatFaNWGjPKkTqvWTPgzz+NlaWnHn6blnYbTa+iVLcZuEE0aUWp\nrfxEHUC/q1HIxo1AVJRveQRhJiS8XMzUqVMxceJE1K5dG0GC6X1OCK89e2yvUhUjMV5qZZlp8VJz\ndWm1eKWkKB/z1Vfa2yYu28342z67XI16MDqrUa3dRr8DZolAt01u8OfZCQriJttkZ3MTiqKjOTfm\nnDnAmTPAu+8aL5sgABJermb69Ok4ePAgQkJCnG4K9C4RaYfFS6/wkouBsUuAGI3xEmPGIGeWZcms\ncqXO1xPvUxiC65VcjXrrUMOM+Cw77rme4Hql8/QSGMgJr2PHgORkblt8PAkvwhxoVqOLqVq1quE4\nLzdhpasxNZXLg+XvrEZ+n5ltUwuuNyPGSw619TX9KdssrAyu11OnXeeruRrV8ngp1W2VkJbDqCDy\nF7NnNcoRFEQxXoR1kMXLxZQuXRr16tVDhw4dUKZMGQDcrMapU6c63DJ17BjUGQOeekr78Uqzvsx0\nNeqp36r6PvhAn4WkWzcu75hTxMQA4tyTeqyBdlkyjcal8W3JzFRul5ygsUqkOy2+zcSIaJe7r4GB\nFONFWAcJLxfTqVMndBJl/DMjc73dWGnx4gdrfztatX16sHNWoxxpacr7jcYEWZVOIiys4H4nXY16\ny9MaXP/JJ9wKBVKozWi0c7KEuG617VZ9d5x2NRKEFZDwcjH9+vVzugmGsTrGC9D/C1duVqNV6STM\nyuMlRusgr4YVn5FT6SSMlG/W+XrvtVz0gJ2uRqcnGZhNdja3YgSPWcLrDvydS9wBkPByMadOncJX\nX32FNWvWIO0fE4bH48FJufwBLsXq4Hqz6rB6MLLT4qW1fDPqMQMjrkK3uBr1nqsW42W0XrOv14wA\nfCNlCdFq8eID4OXOk0OuvKAgztVoRo4zghBDwfUuZtSoUahfvz5ycnLw008/4dFHH8WgQYOcbpYm\nrB7IxeVrmfipJcbLDJQsXnLH2o3Y8udEO/wNrndiVqNcO6xyAwpjvJyKT3STdcxsV6NSjJfY1agn\n3o4glCDh5WL279+PZ555Bh6PB/fffz8++eQTTVnp3YbUGnRmIOwAtS7Sa4erUa1+qfdyGHU1fvcd\ncPOm/rLVsMqyYdeg5vSsRiWkXI1az7eyXVrOc8OsRjPhhZfUc3n2rD1tIAov5Gp0McHBwcjNzUXr\n1q0xbtw4VK9eHaVKlXK6WZoQDuoNGlhbfmQkULSotnOcyD0kV7+WAHejQvDKFX3HWyk49+7l8iHd\ne6/vdqvzUtk5q9GM50pJZJvtarxTrDbi77VdFi8+nURuLvc//woAeXnayiYIOcji5WI++eQT3Lx5\nE3FxcWCMYfPmzZg2bZrTzdJNgEXynu809ZRvp7vGquB6M7DT1ZiQoL52opTAuBOFRL160tu1JlBV\nQs3i5aSrUev9j47WV7f4u23nrMasLCAnh/uff9XTBoKQgyxeLqZJkyYAgJCQEIwePdrZxrgMYceq\nxdrFnyPnarQixkuufh6nO3AjwsuqdBJSuC04Xu584TalHwFa65Z6RqyKIzt3DoiI0H8e3ya9VKyo\n7/jAQGN1+vvseDzAqFFAu3bc/6dO5cd8CUUYQRiBhJeL+euvv/Dtt99i+/bt3kWyPR4PNmzY4HDL\n1LErgSqgXXjZjZPpJPTidDoJKyxedgo3M0SRx+NfAlU9CMu7cMHc8pRQc9OJ49zE32258/V+r9SI\niwOaNweuXeP+v3IlP6EqJVYl/IWEl4t55ZVX0KxZM8THxyPwn59+d2ICVSsQihi9Fi8p3GrxssvV\naDVa769wqSM3Wrz8KdOfdBJq9TjtatSK1vgoPqbK6gSqcuWVL8+lkuDbkZOTL7i0LMdFEEqQ8HIx\nZ86cwcqVK51uhiHsTCehx+IlN0A5IbyUjtW63x/clE5C6v6vWGGsLCsxatnSavECuJi4vXu5hemt\nCq7Xgpl5vHi0Ci85d55drkY+jxcvtt55Jz/x7YkT1kwYIv49UHC9C0lNTcWVK1fQq1cvjBo1CidO\nnEBqaqr3j+DgO3GzXFJmD1xqebycnGEp3mdWjJfcfiP3dtIk7ce6ZVajklDSKp727AE6d5avQ+lc\nMzEzdQh/rFbhxcdTietwSnht3Zq/LyXFv7IJgixeLqRBgwY+LsW5c+d6398pmeutEjPC8vlfxdev\naz/HSVejVD1Wx3jJXbPZMTFqqLXBLRYrf8+XE15y91cupk2qHDPzePlrzTIqiIRpGZSwy+KllE5C\nKLwAoHRpoF8/ivEi/IeElws5deqU000wheLFgfnzrSuf75ybNdN+jpKr0Q6Ll90xXmZbvNyEW2aI\nys1CVDpOCqngeq3n8uebiRX31F9Xo9bz/b0XRYtydWVm+m7nBRnAWeXEsy4JQgvkanQhu3btwgXB\nVKPVq1cjNjYW06ZNw021dOQuwepkpbzFq2RJ4PvvtZ8jt72wxnjZ7Wo0ipFyhYOwW2Y16nWpyX0G\nUq5Lp4LrpTCaGkXrcbzw0mpZM/u59Hg4kXX0qO92XnglJnLvCcIIJLxcyKBBgxD0z7f6+PHjeO65\n59CuXTvs27cPb7/9tsOt046VgwEvvPSmknDSMmKWxUuvq1EKKwWUXSKOn+qvB38FglZLlpTA1jOr\n0ajFTCta7oOTFi+taSPkMOMZnDULiI8HypXL38YLrytXgE6dtNVBEGLI1ehCcnNzUbZsWQDA1KlT\n0a9fP/Tr1w99+vRBixYtHG6dNuSSlZpJTg7nztTTJuGrEDPbKlePEYuXWW1R22dmO4xYEI0M8sI1\nQJ12NWoJrpc7V4g4j5Xe8rRi9oxFf2K8pL57/lq2zBBePXtyrx9+mL8tKIiLKc3KIosXYRwSXi4k\nLCwMN2/eRIkSJbBs2TIsXrwYABAQEIAb/JzmOwA7XI1mJU+1a4ZhYY/xunZNu1XD33vuhPAyO7he\n7Rg9wfVutXhdvKjsghW2XU54qrXJyh80fBwXY5zY2rwZWL2ahBdhHBJe/9/emQdXUWV//PvCOpL8\n2AKyBwJIFiB5hiQgQgJWQRzZRJZBYECiFZGROAzMuKFYapwMUhMHpxyKEdcJsYBCBGRQRmJYk7BZ\nGgIKJIKOxECskIDBAP37o6df+vXr5Xa/3l5yPlXWe919t76vpb8559xzXci8efMwcuRIdO/eHQMH\nDkRycjIA4JtvvkGnTp1sH8/evfrr2GXx0rNPo5aLR89YWQSNGRYvq4SX9Lcxyz04bhxbO3rbFcOa\nRsSKfG2sqzPVyinNu5qrUSvGS1pfCzNEFaso7NkTyMxULqfHrWp25vroaODMGfUyb70FvPkmMGMG\ncMcdQE0NkJPD1j5ByEHCy4U88sgjuO+++/D1118jLS3Nd57jOKxdu9b28WhtcKyE1RavW7eMWbys\neCEb6deOGC/Wto0KvGAEm9FViYK7Siu43k60XIOsFi87XI3p6fosXmb0/dNP/KeSq5HlnJ7zrM/l\n+vXa6WjS0vj/BF5+GdiwgbfkEYQRSHi5lF69eqFXr15+5+644w6HRqMfQRhZGVwPmGPxAuyJ8RL6\nYR2TmWMxq5wUJwQP68tbDqstXsJi5GAtO3rLWuFq1AOrC/b0aba6el2NUksY61x07cr/pxdyMxLB\nQKsaCUuxWliYEeNlZIxqLxqtdBIeD9Crl7MxXkaFptEXtlZfetpVyvGkt08jaI1TyGquJgRYVjVK\n+3PC1cgqpvQgZKTXascui5dR/vQn4PHHre2DaL6QxYuwBLssOWZavKxGHOMlWEbMiPG6fFn5GqtA\ndNrVqAcnXY1K98FimZE7J/0NpK5GtbrS61b9P2e1SAtF4fXYY9a2TzRvyOJFWIobLV5OppMQu8nE\n+79ptSVG+pIxY6Gr065GIzFeVvcTDEZcn2oJVFnadOuqRiP9KLkazQ6uJwgnIOFFWIJdFi89W3Zo\nuQCtJizMf5+3U6fMmScjYze6qtFMjL4sBeGlJUrscjWyWLz0PmNGVjXqgTXlBytus3gRhJsh4UVY\nitUvdHFW6WCxOp1Ehw5AXV3TsdkvP72YEeNl1u9rxOJldFVkMOOxMohf7GoUYLXu6bHY6nUPs4pN\no4Siq5EggoGEF2EJRnJjGWlfz4okPasNrSAiomlZPWDtqk+9OOFqDDbGy6ilz2xYhANL7i45V6PX\n23RslqvRbOuZ0KYZdYV7EOIWWWPdSHgRoQQJLyIkMeJqVMPMF5HSP/rh4f5WrqoqY+2bMVazXY1m\npGlwk6tRbTUoy3mlDO2AfyoCrRivq1fV+xXQSgIqhtXtaWTlrhHk+lGKWyRXI9EcIOFFWILVFi8B\nPcH1Wsv4zR6rtD3pCsz6emf/Mjczc70VqQeUsMPVqASrW0zNAtOhg3L7Sqsalc4J5x97LLgYMr1l\npVYzsy2fSu0Fu3k2QbgBEl6EpVjtanRj5nq7xZQZlgmnXY3BWryM9GklamKic+emc6ziV809qBaL\npWd8RsqYAQXXEy0NEl7NlKKiIsTGxmLw4MGy2wwVFhaiY8eO8Hq98Hq9eOmll0zt3y7xEabjCXZD\n5no9Y1LCjBesmfdrFqzjEaweVroa9bzg9a5qvO02+XJG83gJ86FnsUawQkXv3Bpd1Wg0xosg3Awl\nUG2mZGdnY926dYiKisLEiRMxZ84cREqWAKalpeGjjz6ydBxutHjJteXUP9x6hKPZmBHjxWp90rIy\n6pl/VuElhxmxaEbLyQkvMXIxXix9WyW89FjStMqoxTOaYfG6dk29f4JwE2TxaobU1tYCAMaOHYuo\nqChMmDABxcXFAeU4C9WGXXm8jMR46dmyRQmllydrO6tW8Z/t27P3aaQ/1mtuiPEKxuLlJCwWL/G5\nWbPUdxuQq6/matSblsSsPzT0tCHzz49qO3qfs4ceYh8LQTgNCa9mSGlpKWJiYnzHcXFxOHz4sF8Z\nj8eDgwcPIjExEcuWLcPZs2ctGYubguvV0Psi+te/gJMn1cuo3btgfGzXTl+/ZuG25fd6XJ9qKwYB\n4Jtv+E+7EqiylBPEjscDxMcDXbo0nReX0buaEjAmRM2O8bIquJ5ltSgAnD9vvH+CsBtyNbZQ7rzz\nTly4cAFt2rTBO++8g+zsbOzYsUO27CrBPAMgPT0d6enpmu3blcfLjFWNgP4XR2SkcvJWlnsWXIxG\nLF564n/U0GvxMvu3NDpuLaExaJD5farVlzsnJxDk8rZppZPQ6gcwttjALdZCoPkE1xcWFqKwsNDp\nYRAhAAmvZkhycjJWrFjhOy4rK0NGRoZfmYiICN/3zMxMPPPMM7h+/TrayZhgxMLLbRiJkZLbQ1Hu\nfLCotScIRqcsXoB+4RUWZt2LT099t22SLXdeyaLI6vo14mpknQO9ebxY7tksi5daOg0j5+1EF/zx\nrQAAGi1JREFU+kfpCy+84NxgCFdDrsZmSMeOHQHwKxsrKyvx6aefIjU11a9MVVWVL8Zr+/btGD58\nuKzoMkpzt3gZ7adVK/6608LLyKpGt1m8tNrSM16WsVy8CBQVsdXVY8URUFvVqIaRradCJZ0ErWok\nmiNk8Wqm5OXlISsrC42NjVi6dCkiIyOxbt06AEBWVhY2b96MN954A61bt8bw4cOxZs0ah0esDzNX\nNQL2pVf48kv+RVlayh//TyM7gtOuRjFqFh0pwexxqdRHTY123ccfBzZvNtaPxyPvajRjmx83LDaw\nKsYr2PME4UZIeDVT0tLSUF5e7ncuKyvL933JkiVYsmSJZf27OXO93MvPCouX3L3HxvKfguXk9tv1\nt29WjJeYYIWXkVWNRlxVCxYAwmNst6tR6f7XrgWkYY8cxwfQiwWd1hwYdTUePao4ZEXMTicRDGYL\nLxJhhNshVyNhKW5yNbqJ777jP5OTnelfauELNsbLLt59F/hfthTNl61dMXtr1wLPPed/Tm1VoxKt\nWxtzNQrx3HpivFishnrEtNOrGp1+LglCDyS8CEugzPXq7TU08J9mbfJtBDtdjVp19bgaGxub6ujF\naDoILaSC4NYteauV2jyInwU9Fi8jsLQlLGKwGnI1Ei0NEl6EpbjR4mWXq1ENQXgZQY+r0cy9Gq10\nNerhxg3z2tJTX+3+pcLLyP2qifAbN4DRo9Xrmy0+1GLHzHR3y1nO9Fq2gon7Iwi7IeFFWIJdFi+z\nVjWyXDcTJy1dgDELn5WuRj3CTRBeRlyNRi0mK1c2uTjlkBNe0vgtFouXkqvx55+B+nr1Mer5bVjK\naokZs54FNeGlJvDE383YAYIg7IKEF2EpbrR4yWFXcL3Aiy8CZWXm9WkE8fhY5tHsdBx66vzyS9N3\nOeEVLFoi46WXmmKpWOorWYmMuhrNhsVCpOZqVEsEqxejFi/x9wULjPdPEHZDwouwBLvyeBmJ8VKy\nhNhp8YqIAOLizGlL7aXH+kJszbC+2cl0EkYsXnpgESJqz5qW8GJxZ6tZvOTcq1LsdDWaiVz7Sr+H\n0kpWJzebJwi90ONKhDRmWLysWv1mlVAxI75GKjSDtXhZjfge5bbICdbVyBJIrvZyZwmG12PxkmLG\nKkS9ZfXETVll8WJ1NbIIU4JwCyS8CEtoyZnrQwXxfLBYvMzeMkiPxUosZIRVjWbx+utA377a5dRi\nrCor/Y+NWLzUcrqZKSw8HuDQIe1yQpJfJayM8Zo3L7DcTz8BTz8tX8+uFZgEYQaUQJUIacxY1QjY\n72o0EzNWNTrtagTU70OcnkGI9zIrgeqWLcbrKqG0rZHSHN640bSdlBxmi009sMyt2Xm85KirU75G\nFi8ilCCLF2EJoWTxMjudhN0YEV5muxqDTSdhxOKlVYfV1WhFfJDcqka5LYMEtOZfvLhAiVBNqcAa\n29e2rfI1sngRoQQJL8JS3BRcz9qm2zErj5eZrkariYwMFF5mWbysEF7DhgFXrvifC2aM168HNx4x\nVjznZlm89ORKe/XVpu8kvIhQgoQXYQluzuOlJ+jaTQwYIH/eSuElXqZvduZ6qcVL7T5++aXpxRus\n8IqO9j/WK7yk8VxqiJ9PFne20vPMYvGS8vbb+uvIYWZcXzDtSIXX3r1N38nVSIQSJLwIS3GTq1EN\nK/J42YVRV6MYJeHFuq2QEVejXqQWLy0rh5LYk45Fr/CSurxYxsCSQFVtLG53NVpl8RJfk96fWGyR\nxYsIJUh4EZZitQgxK8ZL7bpbEF5CTrkarc7jxVpGECFm5fHSK7z07DognjOWMSqNxUxXo9swavES\nH5PFiwglSHgRlmC1iDFzr0YgNFyNRlw+aqLC6RgvvW2pBdcHk8NKbo7U2mOZKwG9Fq9gXI12P8Nm\nCV+jMV5iK5fwPTXV+DgIwi5IeBGW4qbgei1XmZstXpGRytfMcDUqvfCDcTWOH69cXq4+q7uS1dWo\n1oYYOy1eVroajYyJBa0VqcFilvDavh04fNi8cRGEVZDwIizBjcH1SoRCOombN41ZvJx0NWqVN2rx\nEtxKWsH1rKJTr8XLiPBifcaCcTU6+QxblcdLLcZL6mo0K96TIKyGhBdhCVev8p9uCq63K5bLivav\nXjU3xqu+Hrh2remYRXg1NASmSBCordWur4aeGK/vvw+sw/riN2LxqqjwP9bjapT2bdTV+MMP2u1b\nFVwv99ua+YybZfEy+rsQhN2Q8CIsYetW/lNtm5VgaN0aSEoCBg0ypz0zXY1t2wJ9+pjTloCaq8mI\n8Jo3D/j886ZjFgF76RLwxBPy19av164vxajF68MP+U+jQoPF4iVue9Ik7fJKCGVZLV7CHyxScnK0\n67LOx3//y1ZOQG5MUtew9N4yMtjbNxpcLxZeZPEiQgkSXoSlBGsJUSIsDDhyBEhIYK9jV+b6Vq2A\nCxfMa08Yt9muRjFSa0HPnvrqa/VtRroJaRmjrkaBpCSgUyd5ISV+qTc0AO3aaY/v0UcDz4nnlUXc\n61mdx3HAypX+x+++61/m448D6zU08J8rVvCf06bxdYuKAtuXIs2BpsT777OVk/bDkk5i7lz/Y4As\nXkRoQcKLsBSrhFcwaKWVcBvCX/J2Ci8nV8ixljFi8WLN4yUWQDdusL3UO3QIPCeOB1PbMkg8vmCQ\nti83bqm4E+roifNTE0iAPuuTXouXUP6bb5qu3bxJFi8idCDhRVhCTg7vbtOzss1qgkkA6iTBiCJW\nt5j0pWX2fGitjDMivLSudeyo3p5g6WQRXiwv9fDwwHPCbydnVV2zBnjlFf9zesXktGn+xyzCS7oa\nVLh/vRYjo2lM1NphifESyv/8c9M1cjUSoQQJL8ISnnqKd7f17+/0SNhwczoJMyxeSUnqfUhfusJL\nTjwnv/qVehtqCCkglLBCeLVvDzz/vHJZtZQkRixeWu5O6TO2bFmgcNIrvO68k293xIjA/gDzLV5K\ngiqY3QD0rmqUK0+uRiKUIOFFtBiU3CRuTychvFCCEV5a92eFq1E8z3LCS9qH1W44aRtqq1yNCC+5\n+Cy9CVSNLhgQXJpGhJceixfrHydWWrzk5ogsXkQoQcKLIFyO1gslFGK8tILGWfpTEyVGMteriSGz\nhJfeMRqddyPCS2r5C8ZiZFaMl550EuJzZPEiQgkSXkSLIVQz10tdjUbyeDlh8RLjhKuRFbm6RmK8\n5DLp22XxEjbuttriJbZkWRHjpXZNztUo3sWALF5EqEDCi2hxtERXI2sf0jbNSichhzS43i5Xo9CO\n2t6TVlm83OBqDCa4PpjdAJQwGlwPNOW3Y/2NCMINkPAiWgxaLz23W7yUMMPyoGdVo1Mi1ciYjIpS\nI8KLxeKlBevcSn/XYGK8zHA1SjHL4iVGLsaLLF5EKEJ/IxAEgJMnnR6BMsILsb6eTz+wf7//9bIy\n5brCS/bixcDUBWKkL0qlAGYAePFF+f0K1dqXu37iRNP3qir1ugCwcGHguZwcXjgUFmrXF8rX1fHf\nOY7fA1FuY+VXXuGtKRzHln8L0LZ4nTypz+KlNp9SkRSM8BKSw+qxeP3nP/5jlT5fev6I2bAB+OQT\n/nt5uf+1jz8GLl/mvwtbNwluVYBPyREeDtTUkPAiQgcSXkSLYflyoLIyMC1CRgbw44/uTX2xaxe/\nXc9nn/F7JYq3+gH4LW3eeafpeNEi/mUGAIMH82k9Hn5YeZ9FgH9RvvUW8OWXwLhx/Fw0NADr1vHX\n77+ff8lFR/MiJzXVv35Cgn/7OTnArFn8lk7JyYDXG9h/dDQwfz7w3ntAVhafdys+HsjLA9LT+ZQk\nYv7978Bx5+cDkyfzQgAADh3yv56dDURENGVp370bWLUK6NYNiI3ly1+5wr/UFy/m94GcN49/2Qvj\nffVVflyZmcCWLfy5Dz4ATp/m5+2jj4A//hEYM4afl7Iyfjz33su3deUKf29VVUBUlPJvAPC/06FD\nQNeufL2FC4GBA4GDB/n7PHeOFyMbN/rXe+01fg7j44H77uPF5IwZvJhatIjPqn/2LPDdd8D06bzA\niY7mxe+TT/JtdO/Ot5GS0pQDbcMGvswdd/B1ExL47cD69OHTddTXA2PHAl98wY930qQmYXTgAJCb\ny8//H/7Al/nqK14gde4M7NjBj/XKlaa5Xr6c//179+bHXFvbdK1rV+DBB4Hnnmuqd+EC/5mdDfTq\npT63BOEaOIJQgR4R97FggRCpxP9XXe1/fO5c0/dnn+U/pYwf71/n1Cn5vh55xL8+wHFr1/Lfn38+\nsL5wLC5fXKx8L2+/LT++zz7zH99tt/kf9+rFfz72GF9++nT5dgRSU/nrw4YplxGYOFG9LYJggf7t\nJJSgGC+CCDGkLiE1F5GS+0XqWlRqw6m4N60gc+l11jg4ckcRBOE0JLwIIsSQigcrhZccSmktzERL\neEkD2bXGL4yVVr4RBOE0JLwIIsTQsniJrVRKwoslCFsJO4SXVttS4cVq8SLhRRCE05DwIogQQ4+r\nUelaMBYvAVbhZSQNhF5XI6vFi1yNBEE4DQkvgggxpCJDKiZYLF7BxHi50dVopsXLzcl0CYIIfUh4\nNVOKiooQGxuLwYMHY+3atbJlnnrqKURHRyMpKQmnTp2yeYQtk0LWhFMqqAktrbJKdYy4Gq2EzeJV\n6DsmV2PwmPFsEgShDQmvZkp2djbWrVuHPXv24O9//zsuXbrkd72kpAT79u3DkSNHsHz5cixfvtyh\nkbYszHi56REPVgTXCzhp8RKEF6ugIlejNiS8CMIeSHg1Q2prawEAY8eORVRUFCZMmIDi4mK/MsXF\nxZgxYwa6dOmCOXPmoFyaMppwLVoiw0xXoxxmuhqNxnhRcD1BEKEKCa9mSGlpKWJiYnzHcXFxOCzZ\nF6WkpARxcXG+427duuHs2bO2jZEwTteu6tfFoqpzZ/ky3bv7HysJF7m+/u//+E9hqxnAfxsXKeJy\nUiIi5M9Ldxfo08f/uG9f/rNLF/6zWzflPgCgRw/+s3dv9XJA4NwQBEGYCf3910LhOA6cxNzgUQgW\nUjpPGOOFF14wtT3pzyOIEoDfYkWujBS5vReV+nj4Yf4/MdHRyuW9XvW2Wcb39df+x8LfCC+//AJe\nfpm9nfXr+f9YaImPvdnPJkEQgZDwaoYkJydjhbA5HYCysjJkZGT4lUlNTcXJkycxceJEAEB1dTWi\npW9PIECcEQRBEARhHHI1NkM6/m+H26KiIlRWVuLTTz9FqmRX49TUVGzZsgWXL19Gfn4+YmNjnRgq\nQRAEQbQoyOLVTMnLy0NWVhYaGxuxdOlSREZGYt26dQCArKwspKSk4O6778aIESPQpUsXvP/++w6P\nmCAIgiCaP2TxaqakpaWhvLwcZ86cwdKlSwHwgisrK8tX5s9//jMqKipw9OjRAIsXSx4wwp/+/ftj\n+PDh8Hq9SElJAQDU1dVh6tSp6NevH6ZNm4b6+npf+b/97W8YPHgw4uLisH//fqeG7RoWLVqE22+/\nHcOGDfOdMzJ/5eXluPPOOxEdHY1nnnnG1ntwE3LzuWrVKvTp0wderxderxe7du3yXaP5VObChQsY\nN24c4uPjkZ6ejvz8fAD0fBIG4QhChsTERO7zzz/nKisruSFDhnDV1dVOD8n19O/fn7t8+bLfudzc\nXO53v/sd19DQwC1ZsoRbvXo1x3EcV1VVxQ0ZMoT79ttvucLCQs7r9ToxZFdRVFTEHTt2jBs6dKjv\nnJH5u/fee7mCggLu0qVL3OjRo7nS0lLb78UNyM3nqlWruDVr1gSUpflU54cffuCOHz/OcRzHVVdX\ncwMGDOCuXLlCzydhCLJ4EQGw5AEj5OEkixFKSkqQmZmJdu3aYdGiRb55LC4uRkZGBvr164e0tDRw\nHIe6ujonhuwaxowZg86S/Bd65k+wNpw+fRqzZ89G165dMX369Bb77MrNJyC/YIbmU50ePXogMTER\nABAZGYn4+HiUlpbS80kYgoQXEQBLHjAiEI/Hg/Hjx2PatGn46KOPAPjPZUxMDEpKSgDw/zCL3btD\nhgzxXSOa0DN/xcXFOHPmDLqLEnHRsxvI2rVrMXLkSOTm5vrEfklJCc0nI2fOnEFZWRlSUlLo+SQM\nQcKLIEziwIED+OKLL/DKK69g2bJluHjxoq50HJQvLZBg509P/ZbA4sWLUVFRgd27d+Ps2bO+BTdy\n80TzGUhdXR1mz56Nv/71rwgPD6fnkzAECS8igOTkZL9Ns8vKyjBy5EgHRxQa9OzZEwAQGxuLKVOm\nYPv27UhOTvZtx1ReXo7k5GQATXnUBE6dOuW7RjShd/4GDRqEqqoq3/mTJ0/Ssyuie/fu8Hg86Nix\nI5YsWYKtW7cCoPlkobGxEQ888ADmz5+PqVOnAqDnkzAGCS8iAJY8YIQ/165d87ltqqursXv3bmRk\nZCA1NRUbNmzAzz//jA0bNvj+kU1JScHu3btx/vx5FBYWIiwsDBFK++e0YIzMX0xMDAoKCnDp0iVs\n3bqVnl0RP/zwAwDgxo0byM/Px69//WsANJ9acByHzMxMDB06FE888YTvPD2fhCGciOgn3E9hYSEX\nExPDDRw4kHvttdecHo7rOXfuHJeQkMAlJCRw48eP5958802O4zjuypUr3JQpU7i+fftyU6dO5erq\n6nx18vLyuIEDB3KxsbFcUVGRU0N3Db/5zW+4nj17cm3btuX69OnDbdiwwdD8lZWVcV6vl+vfvz/3\n5JNPOnErrkCYzzZt2nB9+vTh3nzzTW7+/PncsGHDuKSkJO73v/+93ypcmk9l9u3bx3k8Hi4hIYFL\nTEzkEhMTuV27dtHzSRjCw3HkZCYIgiAIgrADcjUSBEEQBEHYBAkvgiAIgiAImyDhRRAEQRAEYRMk\nvAiCIAiCIGyChBdBEPjwww8RFhaG06dP+85VVlb6Nlg+cuQIsrOznRqeItu2bfPlUbKK0aNHAwC+\n/fZbbNy40Xf+6NGjrpwTgiDcDQkvgiCwceNGTJo0yU9YiBkxYgRee+01m0elzdatW/0SVVrBgQMH\nAAAVFRXIz8/3nU9KSnLlnBAE4W5IeBFEC6e+vh7FxcV4/fXX8cEHH8iWKSwsxOTJkwEAP/30E5Yt\nW4aYmBgsXboU/fv3R01NDSorKxEXF4clS5YgLi4Ojz76KBobGwEA6enpePbZZ5GYmAiv14szZ85g\nxowZGDp0KP7xj3/4+tmzZw9mzpyJUaNGIScnx3c+PDwcL774IuLj4/Hggw+ipqYGBw8exPbt27Fi\nxQp4vV6cO3fOb8wLFy7EsmXLkJSUhPT0dN9mxI2NjVi9ejVGjBiBWbNm4fjx4wCACxcu4N5770Vi\nYiISEhJw9uxZX98A8OSTT2Lfvn3wer3Iy8vzm5Pa2lqsXLkSiYmJyMzM9NVdtWoVFi9ejHHjxmH4\n8OEoKCgI7sciCCLkIeFFEC2cbdu2ISMjA/369UO3bt1w7Ngx1fL//Oc/ERYWhvLycni9Xpw/f953\n7dSpU5g+fTq++uorVFZW4tChQwD4feqqqqpw7NgxTJs2DSkpKcjNzcXhw4eRk5MDjuNw7do15Obm\n4r333sOBAwfw5Zdf+sTStWvX0KtXL5SVlaFDhw7YsWMH7rrrLkyZMgWvvvoqjh8/jujo6ICxHjly\nBIWFhfjLX/6CRx55BACwa9cuHD58GPv370d2djYWL17su68ZM2bgxIkTOHr0KHr37u0bOwDk5uZi\nzJgxOH78uF/2cgB45513UFtbi2PHjmH8+PF4+umnfdcOHDiArVu3YufOnXj22Wd1/TYEQTQ/SHgR\nRAtn48aNmDlzJgBg5syZiu5GgU8++QRz586Fx+PBnDlz0K5dO9+13r1745577kFYWBjS0tJ8wgsA\n5syZg7CwMIwaNQrx8fEYOHAgwsPD0bdvX5SVlWHXrl04efIkRo0ahaSkJJw4cQJ79+4FALRu3Rpz\n584FAIwfP96vXaUc0B6PB/fffz8iIiKQkpICjuPw/fffY+fOnZg7dy7at2+P0aNH4+rVq7h48SJS\nUlKQl5eH3Nxc1NTUoH379n7tqeWa3rlzJxYuXIiwsDDMnj0bhw4d8ln7pk6dik6dOqFv375o1aoV\nfvzxR9X5JQiiedPa6QEQBOEcNTU12Lt3L7766it4PB7cvHkTHo8Hq1evNtRep06dfN/btm2Lq1ev\nBlxr27ZtQLnr16/j1q1bmDBhAt56662Adtu1a+cTQm3atEFDQ4PvmmCRkkNJLMmdv++++5CUlIT3\n338fo0ePxqZNm5CYmKjYNkubHo8n4F7FYycIouVBFi+CaMFs3rwZv/3tb1FZWYmKigqcP38eAwYM\nwL59+xTrTJw4Efn5+bh16xY++OADXL9+XbEs645kHo8HkydPxr59+3yrFGtqavzcmHJERUUpWpA4\njsO2bdtQX1+P0tJShIWFoXfv3pg0aRIKCgrQ0NCAgwcPIjw8HD169MC5c+fQo0cPLF++HPfcc09A\n0H5UVBSqq6tl+5o0aRLee+893Lx5E5s2bcJdd92FNm3aMN8/QRAtBxJeBNGCKSgowP333+937oEH\nHkBBQQE8Ho+fNUn4npmZicbGRsTFxaGkpATR0dHo3LmzXxlpHek5ufPt27fH+vXrsXLlSgwfPhwT\nJkzAxYsXA9oR158+fTry8/Ph9XpRUVER0E9SUhLS0tKwYsUKrF+/HgAvHFNSUnD33XcjLy8Pb7zx\nBgBg06ZNGDp0KJKTk3Ht2jXMmjXLr+8BAwZg0KBBvuB68TgWLFiAiIgIJCUlYc+ePb6FAUr3ShBE\ny4U2ySYIQhe//PILWrVqhVatWmHLli3YvHmzZlyYEzz00EOYPHkypk+f7vRQCIIgfFCMF0EQujh/\n/jxmzZqF69evY8SIEXjuueecHhJBEETIQBYvgiAIgiAIm6AYL4IgCIIgCJsg4UUQBEEQBGETJLwI\ngiAIgiBsgoQXQRAEQRCETZDwIgiCIAiCsAkSXgRBEARBEDbx/1kJf7PZgfa4AAAAAElFTkSuQmCC\n"
}
],
"prompt_number": 56
},
{
"cell_type": "markdown",
"source": "PyCogent also provides support for parsing many common file types. To access PyCogent's fasta parser (which we used above), you can import from ``cogent.parse.fasta``. Let's parse a fasta file and do some light processing of it."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fp = \"/home/ubuntu/qiime_software/gg_otus-4feb2011-release/rep_set/gg_70_otus_4feb2011.fasta\"\n\nfrom cogent.parse.fasta import MinimalFastaParser\n\ngc_contents = []\n\nfor seq_id, seq in MinimalFastaParser(open(fp,'U')):\n gc_content = float(seq.count('G') + seq.count('C')) / len(seq)\n print \"%s: %1.2f\" % (seq_id, gc_content)\n gc_contents.append(gc_content)",
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "45024: 0.58\n177038: 0.62\n264416: 0.55\n332077: 0.55\n550229: 0.52\n574071: 0.53\n20204: 0.51\n569058: 0.52\n82149: 0.49\n128551: 0.40\n532645: 0.57\n201216: 0.54\n89696: 0.59\n245702: 0.52\n201574: 0.52\n355913: 0.56\n201331: 0.50\n254053: 0.52\n153852: 0.50\n250980: 0.58\n201378: 0.49\n153508: 0.57"
}
],
"prompt_number": 59
},
{
"cell_type": "markdown",
"source": "We could then use ``matplotlib`` again to visualize the distributions of gc_contents across this wide range of 16S rRNA genes (the bacterial and the archaea). "
},
{
"cell_type": "code",
"collapsed": false,
"input": "from pylab import boxplot\nboxplot(gc_contents)",
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 66,
"text": "{&apos;boxes&apos;: [&lt;matplotlib.lines.Line2D at 0x423ecd0&gt;],\n &apos;caps&apos;: [&lt;matplotlib.lines.Line2D at 0x423e2d0&gt;,\n &lt;matplotlib.lines.Line2D at 0x423e7d0&gt;],\n &apos;fliers&apos;: [&lt;matplotlib.lines.Line2D at 0x4240710&gt;,\n &lt;matplotlib.lines.Line2D at 0x4240bd0&gt;],\n &apos;medians&apos;: [&lt;matplotlib.lines.Line2D at 0x4240210&gt;],\n &apos;whiskers&apos;: [&lt;matplotlib.lines.Line2D at 0x423a890&gt;,\n &lt;matplotlib.lines.Line2D at 0x423ad90&gt;]}"
},
{
"output_type": "display_data",
"png": "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\nYII=\n"
}
],
"prompt_number": 66
},
{
"cell_type": "markdown",
"source": "``matplotlib`` offers very rich functionality. A great way to figure out how to generate certain types of plots is by browsing their [gallery](ahttp://matplotlib.org/gallery.html) and [examples](http://matplotlib.org/examples/index.html). These show off what ``matplotlib`` can do, and provide the source code to generate each plot. I often start there to get a working plot and then tweak it to display what I want."
},
{
"cell_type": "code",
"collapsed": true,
"input": "",
"language": "python",
"outputs": [],
"prompt_number": "&nbsp;"
}
]
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment