pax_global_header00006660000000000000000000000064142002115270014504gustar00rootroot0000000000000052 comment=24dab4145572ec68a3c899256827bc4b1212baa9 DiscoSnp-2.6.2/000077500000000000000000000000001420021152700132355ustar00rootroot00000000000000DiscoSnp-2.6.2/.DS_Store000066400000000000000000000240041420021152700147200ustar00rootroot00000000000000Bud1    dbwspblob  @ @ @ @ buildbwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth_PreviewPaneVisibility   _{{616, 40}, {770, 451}})5AMYp}buildvSrnlongscriptsbwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowPathbar  _{{730, 361}, {770, 436}}%1=I`myz{|}~scriptsvSrnlongtestbwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth_PreviewPaneVisibility   _{{616, 40}, {770, 451}})5AMYp}testlsvPblobbplist00 CDC FXiconSize_showIconPreviewWcolumns_calculateAllSizes_scrollPositionYXtextSize_scrollPositionXZsortColumn_useRelativeDates_viewOptionsVersion#@0  %*/49>  WvisibleUwidthYascendingZidentifier  Tname  \dateModified[dateCreated "$ aTsize ' ) s Tkind, .d Ulabel1 3K Wversion6 8, Xcomments;=^dateLastOpenedAYdateAdded##@( &8@Tfo   "#$09:<=BKLNOT]^`agpqst|Gtestlsvpblobbplist00 HIH FXiconSize_showIconPreviewWcolumns_calculateAllSizes_scrollPositionYXtextSize_scrollPositionXZsortColumn_useRelativeDates_viewOptionsVersion#@0  %*/49>CXcommentsTname[dateCreatedTsizeUlabelTkindWversion^dateLastOpened\dateModified WvisibleUwidthYascendingUindex,  " $  ') ,. a1 3d  6 8 s ; =K @B 'F ##@( &8@Tfo(06@FGJKMVWZ[]fgijluvxy{KtestvSrnlong thirdpartybwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth_PreviewPaneVisibility   _{{259, 421}, {770, 436}})5AMYp} thirdpartyvSrnlongtoolsbwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowPathbar  _{{335, 346}, {770, 436}}%1=I`myz{|}~toolsvSrnlong E DSDB `(0@ @ @^dateLastOpenedAYdateAdded##@( &8@Tfo   "#$09:<=BKLNOT]^`agpqst|Gtestlsvpblobbplist00 HIH FXiconSize_showIconPreviewWcolumns_calculateAllSizes_scrollPositionYXtextSize_scrollPositionXZsortColumn_useRelativeDates_viewOptionsVersion#@0  %*/49>CXcommentsTname[dateCreatedTsizeUlabelTkindWversion^dateLastOpened\dateModified WvisibleUwidthYascendingUindex,  " $  ') ,. a1 3d  6 8 s ; =K @B 'F ##@( &8@TfoDiscoSnp-2.6.2/.gitignore000066400000000000000000000000071420021152700152220ustar00rootroot00000000000000/build DiscoSnp-2.6.2/.gitmodules000066400000000000000000000001551420021152700154130ustar00rootroot00000000000000[submodule "thirdparty/gatb-core"] path = thirdparty/gatb-core url = https://github.com/GATB/gatb-core.git DiscoSnp-2.6.2/CHANGELOG.md000066400000000000000000000150471420021152700150550ustar00rootroot00000000000000## V2.6.1 * Update python version in vcf creator, fixed CI issues ## V2.6.0 - VCF file is now one-based (previously zero-based) ## V2.4.5 * `-g` option takes a graph as parameter (instead of determining itself a graph name) * update of gatb-core (compiles with gcc >= 7.3.0) * Using xhash - kissreads is 2 times faster ## v2.4.4 * Fixes a bug in option parser for discoSnp-RAD * Improves option presentations for discoSnp-RAD * Includes a cookbook for discoSnp-RAD ## Older notes: * Jan 2020 + Conda Install + discoRad (independent / reorganized) + phasing in test (hidden -A option) + default values modified * 9/6/2016 2.2.9 + Fixed a VCF creator bug + Optimizing VCF creator * 26/04/2016 2.2.8 + Fixed a tiny kissread bug + Adding a continuous integration large test collection * 15/04/2016 2.2.7 (now uses the githup repository: http://github.com/GATB/DiscoSnp) + Adding the possibility to limit the number of symmetrically branching crossroads traversed during the bubble finding + b2 mode: explore all possible symmetrical paths, even in case of success on one of the paths + b2 mode: avoid redundancies + Increased the maximal number of close SNP detectable thanks to a non recursive part on the bubble enumeration. + Fixed VCF creation bugs + Fixed Prediction bugs + Improved VCF creator error messages in case of missing values from BWA results + Increased the max breadth for the indel detection * 24/11/2015 DiscoSNP++-2.2.4 + Fixes a tiny bug in the run_discoSnp++.sh script. Thanks Hanan (https://www.biostars.org/p/155781/#167002) * 18/11/2015 DiscoSNP++-2.2.3 + Improvements: o Dump de read file names. C_1, C_2, … are provided in the .fa and the vcf file. Now a file indicates the correspondence between C_i and a set of read files. See documentation for details. o Removes indels if the repeat size is higher than a user defined threshold (max_ambigous_indel). Indels with Long repeat size (eg >20 in our tests) very often are false positives. + BUG correction: o VCF bug described here: https://www.biostars.org/p/166298/ is now fixed. o kissread bug when P > 1 (segfault corrected). * 05/10/2015 DiscoSnp++-2.2.1 + BUG correction: o Kissreads module time (bug fixed by Guillaume Rizk) and memory. o VCF creator bug correction o Redundant bubble detection suppression + VCF creators uses BWA MEM by default * 17/07/2015: Important update – DiscoSNP++-2.2.0 + Input read set format has changed. Use now file of files. This provides an easier way of dealing with read sets composed of several read files (pair end or pools). See the documentation in the doc directory + The kmer coverage threshold can be o set separately for each read set o and/or automatically detected + If a reference genome is provided, it can used for predicting variants. For instance a unique read set may be compared to the reference genome. (option -R) + With respect to previous change (-R) the read coherency in kissreads has changed. o Before: a variant was read coherent if its two path were read coherent o After: a variant is read coherent if at least one of its two paths is read coherent (else all homozygous calls obtains comparing a read set to a reference would be uncoherent) + Kissreads parallelization had been improved. OMP is not used anymore, and running time are decreased. + Two memory bugs have been fixed. They occurred mainly while using large number of read sets. + It is now possible to detect only indels (ie. -P 0 detects no SNP) + Memory issue detected: o All tools (kissnp2, kissreads2, VCF_creator) have a limited memory footprint. However, due to kissnp parallelization, in some cases, memory may increase linearly with the number of used cores. If the memory is too high, limit the number of cores with the -u option. * 13/05/2015: DiscoSNP++-2.1.7 + Fixes a bug with very long reads * 04/05/2015: DiscoSNP++-2.1.6 + (mac and linux) binaries: http://gatb.inria.fr/binaries-url/ + Adding the vcf doc + Adding the -u option (limiting the maximal number of used threads) + Fixing some compilation bugs * 03/05/2015: DiscoSNP++-2.1.5 + + Fixes compilation bugs with some compilers + Fixes some VCF generation bugs * 02/04/2015: DiscoSNP++-2.1.4 + Fixes a redundancy bug with the b 2 option + Generates an IGV compatible VCF + Fixes various small VCF bugs * 23/03/2015: DiscoSNP++-2.1.3 + Automatically creates a VCF + Genotyping of results (for diploïds) + Warning: documentation not up to date. * 02/03/2015: DiscoSNPpp-2.0.6. + Genotypes are automatically computed * 24/02/2015:DiscoSNPpp-2.0.5, fixes a compilation bug on some OS. * 24/02/2015:DiscoSNPpp-2.0.4 + Fasta headers more informatives + Update of the kissread tool for close SNPs precision + Unique id for SNPs and indels + Documentation update * 26/01/2015: DiscoSNPpp-2.0.2 + Fixed a bug progress bar display on macos. * 22/01/2015: DiscoSNPpp-2.0.1 + Fixed a bug about command line parser. * 19/01/2015: DiscoSNPpp-2.0.0 + Corrected the discoSnp++2csv.py file + Faster, nicer presentation, unique .h5 graph file + Detects also indels and close SNPs * 29/10/2014: [BETA] discoSnp_1.2.6: Kissreads changes: added minimal spanning option – changed the strategy when a read has multiple hits on a fragment. * 01/10/2014: discoSnp_1.2.5: fixed bugs of version 1.2.4 (bugs were not affecting version <1.2.4). * 25/09/2014: discoSnp_1.2.4: increased kissread speed (approx x2) –– bugged version — don’t use * 28/07/2014: discoSnp_1.2.3: improved the documentation – cleaned the output messages and the output useless files * 20/05/2014: discoSnp_1.2.2: -b 0 is the default option. * 26/04/2014: discoSnp_1.2.1: Fixes a compilation problem due to a makefile typo. * 05/03/2014: discoSnp_1.2.0: New option with regards to branching bubbles * 14/11/2013: discoSnp_1.0.1: fixes a bug concerning the contigs extensions (note that unitig extension lengths were not affected) * 14/10/2013: discoSnp_1.0.0: read2SNPs name changes. discoSnp_1.0.0 is a new name for read2SNPs_2.1.1.4 DiscoSnp-2.6.2/CMakeLists.txt000066400000000000000000000075521420021152700160060ustar00rootroot00000000000000project(DiscoSNP++) cmake_minimum_required(VERSION 2.6) #add_compile_options( # "-Wall" "-Wpedantic" "-Wextra" "-fexceptions" # "$<$:-O0;-g3;-ggdb>" #) ################################################################################ # The version number. ################################################################################ SET (gatb-tool_VERSION_MAJOR 2) SET (gatb-tool_VERSION_MINOR 6) SET (gatb-tool_VERSION_PATCH 1) IF (DEFINED MAJOR) SET (gatb-tool_VERSION_MAJOR ${MAJOR}) ENDIF() IF (DEFINED MINOR) SET (gatb-tool_VERSION_MINOR ${MINOR}) ENDIF() IF (DEFINED PATCH) SET (gatb-tool_VERSION_PATCH ${PATCH}) ENDIF() set (gatb-tool-version ${gatb-tool_VERSION_MAJOR}.${gatb-tool_VERSION_MINOR}.${gatb-tool_VERSION_PATCH}) # However, continuous integration has priority over local compilation IF (DEFINED JENKINS_TAG) SET (gatb-tool-version ${JENKINS_TAG}) ENDIF() ################################################################################ # Define cmake modules directory ################################################################################ SET (GATB_CORE_HOME ${PROJECT_SOURCE_DIR}/thirdparty/gatb-core/gatb-core) SET (CMAKE_MODULE_PATH ${GATB_CORE_HOME}/cmake) ################################################################################ # THIRD PARTIES ################################################################################ # We don't want to install some GATB-CORE artifacts SET (GATB_CORE_EXCLUDE_TESTS 1) SET (GATB_CORE_EXCLUDE_EXAMPLES 1) # GATB CORE include (GatbCore) ################################################################################ # TOOLS GENERATION ################################################################################ SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) set(PROJECT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin) #set(PROJECT_BINARY_DIR bin) ADD_SUBDIRECTORY(tools) ################################################################################ # PACKAGING ################################################################################ SET (CPACK_PACKAGE_DESCRIPTION_SUMMARY "gatb-tool ${PROJECT_NAME}") SET (CPACK_PACKAGE_VENDOR "Genscale team (INRIA)") SET (CPACK_PACKAGE_VERSION_MAJOR "${gatb-tool_VERSION_MAJOR}") SET (CPACK_PACKAGE_VERSION_MINOR "${gatb-tool_VERSION_MINOR}") SET (CPACK_PACKAGE_VERSION_PATCH "${gatb-tool_VERSION_PATCH}") SET (CPACK_PACKAGE_VERSION "${gatb-tool-version}") # We chose the kind of archive we want to generate SET (CPACK_GENERATOR "TGZ") SET (CPACK_SOURCE_GENERATOR "TGZ") # We ignore unwanted files for the source archive SET (CPACK_SOURCE_IGNORE_FILES "^${PROJECT_SOURCE_DIR}/\\.git/" ; "^${PROJECT_SOURCE_DIR}/\\.gitmodules" ; "^${PROJECT_SOURCE_DIR}/\\.gitignore" ; "^${PROJECT_SOURCE_DIR}/build/" ; "^${GATB_CORE_HOME}/\\.cproject" ; "^${GATB_CORE_HOME}/\\.git/" ; "^${GATB_CORE_HOME}/\\.project" ; "^${GATB_CORE_HOME}/\\.gitignore" ) # For creating the BINARY package we include the files we want INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/discoSnpRAD DESTINATION .) INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc DESTINATION .) INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test DESTINATION .) INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts DESTINATION . FILES_MATCHING REGEX ".*\\.(py|sh)$" PATTERN "jenkins" EXCLUDE) INSTALL (FILES ${CMAKE_CURRENT_SOURCE_DIR}/run_discoSnp++.sh DESTINATION .) INSTALL (FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION .) INSTALL (FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION .) # We include the "bin" tag into binary archive file name set (CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME}-${CPACK_PACKAGE_VERSION}-bin-${CMAKE_SYSTEM_NAME}) # To be done at the end. INCLUDE (CPack) DiscoSnp-2.6.2/INSTALL000066400000000000000000000010111420021152700142570ustar00rootroot00000000000000# CMake is required to compile software (http://www.cmake.org/cmake/resources/software.html) # # You can install software by executing this file: sh INSTALL # # Prepare GATB sub-module git submodule init git submodule update # Prepare directories: rm -rf build mkdir build # Go in the 'build' directory cd build # Prepare the makefile cmake .. # Run the newly created makefile: make -j8 # Go back at the installation root directory cd .. # run tests echo "Running simple test..." cd test . ./simple_test.sh cd .. DiscoSnp-2.6.2/LICENSE000066400000000000000000001033301420021152700142420ustar00rootroot00000000000000 GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . DiscoSnp-2.6.2/README.md000066400000000000000000000103421420021152700145140ustar00rootroot00000000000000# DiscoSnp++ and DiscoSnpRad | **Linux** | **Mac OSX** | |-----------|-------------| [![Build Status](https://ci.inria.fr/gatb-core/view/DiscoSnp-gitlab/job/tool-discosnp-build-debian7-64bits-gcc-4.7-gitlab/badge/icon)](https://ci.inria.fr/gatb-core/view/DiscoSnp-gitlab/job/tool-discosnp-build-debian7-64bits-gcc-4.7-gitlab/) | [![Build Status](https://ci.inria.fr/gatb-core/view/DiscoSnp-gitlab/job/tool-discosnp-build-macos-10.9.5-gcc-4.2.1-gitlab/badge/icon)](https://ci.inria.fr/gatb-core/view/DiscoSnp-gitlab/job/tool-discosnp-build-macos-10.9.5-gcc-4.2.1-gitlab/) [![License](http://img.shields.io/:license-affero-blue.svg)](http://www.gnu.org/licenses/agpl-3.0.en.html) # What is DiscoSnp++? DiscoSnp is designed for discovering all kinds of SNPs (not only isolated ones), as well as insertions and deletions, from raw set(s) of reads. The number of input read sets is not constrained, it can be one, two, or more. No reference genome is needed. ## Publications Uricaru R., Rizk G., Lacroix V., Quillery E., Plantard O., Chikhi R., Lemaitre C., Peterlongo P. (2014). [Reference-free detection of isolated SNPs](http://nar.oxfordjournals.org/content/43/2/e11). Nucleic Acids Research 43(2):e11. Peterlongo, P., Riou, C., Drezen, E., Lemaitre, C. (2017). [DiscoSnp ++ : de novo detection of small variants from raw unassembled read set(s).](http://doi.org/https://doi.org/10.1101/209965) BioRxiv. Gauthier, J., Mouden, C., Suchan, T., Alvarez, N., Arrigo, N., Riou, C., Lemaitre, C., Peterlongo, P. (2017). [DiscoSnp-RAD: de novo detection of small variants for population genomics](https://peerj.com/articles/9291/). *PeerJ* 8 (2020): e9291. ## DiscoSnp++ or DiscoSnpRad We propose a DiscoSnp++ adaptation for RAD-Seq data. A script, called `run_discoSnpRad.sh`, is adapted to this kind of data. See below for more details. # Getting the latest source code ## Requirements CMake 2.6+; see [http://www.cmake.org/cmake/resources/software.html](http://www.cmake.org/cmake/resources/software.html) c++ compiler; compilation was tested with gcc and g++ version>=4.5 (Linux) and clang version>=4.1 (Mac OSX). ## Instructions ### Install from source ```bash # get a local copy of DiscoSnp source code git clone --recursive https://github.com/GATB/DiscoSnp.git # compile the code an run a simple test on your computer cd DiscoSnp sh INSTALL ``` ### Install using Conda DiscoSnp++ and DiscoSnpRAD are also distributed as a [Bioconda package](https://anaconda.org/bioconda/discosnp): ``` conda install -c bioconda discosnp ``` The scripts `run_discoSnp++.sh` and `run_discoSnpRad.sh` are then executable. # Getting a binary stable release Binary release for Linux and Mac OSX are provided within the "Releases" tab on Github/DiscoSnp web page. After downloading and extracting the content of the binary archive, please run the following command from DiscoSnp home directory: chmod +x run_discoSnp++.sh test/*.sh scripts/*.sh # Quick start Run DiscoSnp WITHOUT mapping results on a reference genome: ./run_discoSnp++.sh -r test/fof.txt -T Run DiscoSnp WITH mapping results on a reference genome (requires bwa): ./run_discoSnp++.sh -r test/fof.txt -T -G test/reference_genome.fa Note: if bwa is not in you PATH, then add the option "-B path_to_bwa". For instance: ./run_discoSnp++.sh -r test/fof.txt -T -G test/reference_genome.fa -B /home/me/my_programs/bwa-0.7.12/ Run DiscoSnp WITH mapping results on a reference genome AND using this reference genome for calling variants: ./run_discoSnp++.sh -r test/fof.txt -T -G test/reference_genome.fa -R # User manual See doc/discoSnp_user_guide.pdf or doc/discoSnp_user_guide.txt # DiscoSnpRad When dealing with RAD-Seq data, `run_discoSnpRad.sh` script should be used. It uses options specific to RAD-Seq data: branching strategy, kind of extensions, abundance threshold, and kind of bubbles to be found. Moreover, it clusters variants per locus, the cluster information being reported in the final provided VCF file. See the [discoSnpRAD README file](https://github.com/GATB/DiscoSnp/tree/master/discoSnpRAD). # Contact Remarks and questions: [https://www.biostars.org/t/discosnp/](https://www.biostars.org/t/discosnp/) Contact: Pierre Peterlongo: [pierre.peterlongo@inria.fr](mailto:pierre.peterlongo@inria.fr) DiscoSnp-2.6.2/colibreads.png000066400000000000000000001074121420021152700160570ustar00rootroot00000000000000PNG  IHDRv>asRGBbKGD pHYs  tIME 7EjtEXtCommentCreated with GIMPW IDATxܽwx\u;g f+ Ah{DQ)iK8uĉ/ǩ8ϱ-VŒ,QEHVbEA`9) {Hw!4s.kwiaa&wkpǦkuRa&QӤ/0.ww3;?76Py.ϐ;TIջ[d,9a~Vau՚z7{ɞ)}l֞:L=WeUZάN=0ku:Vs&{9;DDD{F?UgTօ\%[=$Ku{f:=V2/{UrNonمS/h&RK56GH`Kp/~6TW+h1L3vۅ"2JDblt2ϫz=EgE 2# Z SW;ޢjdYo:[vcjHg[LV^NVd*B|81$$:VdW%3\dMd@+Gcb\՜ b0cG]#! ӤstsCxΞHW3󹿮.iXjq0U(k=Uقy2NXt/  p+VDJDu +qW:U~)B%{G'iFudEުl *l&藕,NGvY9vikɼ٭3UBĈteΕaSY F"a˼x/Cp 5sӌBTsM]D[ "UO7'8vͩǨqxb*IAPrjLG#vEeB2 wR ߨx*dTLpѻ'̹Qq~DPU09-NSbS *J*tud@&=iDx<γS3cnjdK\VTTL:GEXTؔ.jU (! DȄhLT<`Y5>i9egt:NVEaT@NohE\rΪCB;9Pv]湫T QkN֣09N "T=D4~v:+tB4J?OXYQQ+2ĚD A4\Ec , )oAzv6' CL;CUAd 9IQUCMVƸ]lTC;QoUE-ʩO'*R'{5*/e1['ȜjGSMztn*2ndrs֭d[ :. ljh/eYy9^5eJ,'I p"S4n(b[N0 U{eTaAY$mB;DnZͧ͟(6kg;E# ˌb4))#SVIjw'sj*dQ~ UQ/;%'2VDS]A""'C"Nd\;ղ}ؙqەz^VDطne "\vZh'Mmؑ,hw]bMB!4MH<(nZDP(1 ;o.iuc~l<~Kг;+@|)ʹXN@/Ko!jeP+ ~sٸ!qf'w~űUQ;+(Xţ͉2٫dːJ%sR"c*FJPsr;QIIW/^3vvoo<k:hLenmƦ6jW=hTA5t61dҵ*3yV*֥ ӕJlSdY<ee6mOR3>*URI̹Q-JTR$n2nU7RLJ.JF٘ofS.J[Iv29 q :+PY2kgEw!BV4-桫-|#?<~?ݻPt aZjnӝd,-'5"H$"%y0jҗjXNrdhpX)q)]S&ʙK69@!leȈ֑L9MB`,inS]'N <>§.c+uN(,,Wu9bOvL>2elQ.(2!v^2F;Ŧ"dOxHiy*RJɞQq#8ub;/JbۭUjLdƩ tUc*"@F*TD"dJrmX}ꢨ|a!.{;vs1eʊ v5w$kEJv+d$U[QI7L= 'D(T3EГȴdCЉ V'12'pv!.YC&"(3TLXK}oD`gqYvֹ{8>v^l d|QĊbx*ڢqͧJ#;ejU:~6+ZetQnUes*;@HdcǴg(AN mU?cԗp\zlذG}۷ ((㓷_iG=87ϾH`p4Uۘ'.]rٖ=j+a7Y2y*Hv{o0qL%Qi,̡hX)eQɥ]!UeV ?v }s&B:ם]WڭMYͺ,oe`pWH&&gHv|֢a!s#J-L}>_"X=ߨijӟj靖0Msrsśg>Ï~#9]wEcCcɑ̨AU~d6Owx,`[XZ3ܺKXbI<4<]Pd&;T(6U ED'P* g#IWQ뫖 ۢUykGIW-YGLrErUDYAmvD/P鑡_HYhx(dXK!MqfmaH&Î;ğ:M qF>ybƆxkT_UT"U[gU)5cizWy Ǽj#zbҘGQS)uuus-`yqO>uL8p8KC\XZTLr(1/C|g2>:{w(~i>'+  *ZժƎ-pcyh7g"$nZ&lhMQ"˚MtYyvUT cTUI\|֦)~wzSNW(UQQ0+VB$LslIN>6| UBxs\_=.\`llgk jVɨHU6U{q&X}nN;#̦r=+HSj-X!R.2\oYAqZW TzxvMeD"}emR3=vUV|Zqء/nZ9 #76TU[orQXn ,t̛Yx}-,ʮ-!ijxȍO1)1#Se6VIRUNJ1'uZE kR"\"Oj )#R Aj2cV5Y ΛO=*4ұQf8+*e~2EDdh:2q*;#j QiSL2pgjN QntTw*'k,j竺o3KQF%A,$۪$ 7FGeA>zj~q!N:Euu56l`Ŋx^/]v_?wXvKі)Y{JUdƚUِMrRZjƱLWˤn3AT1[Ep蚆&'b466ϳsNΞ=˹sxg[Yv-*X?̙@&z2QnF__7or]gP2$e rRV&eYpQ@5-Vֿǻ*HZڥ$*Zڭt~joXqXê(g%&%]S[ei,[fZ%YŧJ'2;1$-uD<RP%8"DP5N){n]6σ>Ȳex9s ===<### ߇hW4C4Q>2>s%Μ9CSSzo -Y_`V2*&j!TUgL]]K.eҥIFs'&ӴIB4(xz4TʠD itht"a+ UA'"8T}/R>novdkp: ]^r ZPe jΤ%AUuf9Q dLU! \tA#XDei9h uTTU&'cppÇo}H)gxx;w2c -Z;T7Lt *SʽeК]4vW9x*c:N$.Њ Lz*ޘ}ӉDTB*y(V&+[w">9tPE* xNdӚy{cud}b#>K_ H(I,ö:?9j<].b*ȓ`SE;TׂJ>du.5U3 wDD4kegs^Mr}r94X4H+ Ph"IaQ17ofU<3۷/9@ʃ>ʕ+{Ţi###l۶rVZ5_W/rN/߇ ==l;{.sfppkdjW$[wgY_?3+qMu]h+E^iu"| ^|W߿[I¦Iś09ʍ`d ֡*FJ'LJCMFd7N ?;P5>눪:TwXPOe,- ~|vScaYE nI ?cmhə^[s5 LРa<\p! CCC|;ߡ{#Xeڵk}}}s=̙3W;w)i7ԊN=ث2ɈOR5My9w\B(] jMp>]?9b~{|@U^ <ٻ:ly1#(ѱhq jp%!bLaf/Vɣa&V QMŽ/Btf[A"H$TUh{$O2iF0V445t2w|%R*G'! =eϟ>9^|EhzO=ccc<dN˼KTUUqmҔTrd UcP*wQ({o}w)r+}.~,]vvwqi:a0aD GE#LDL&(i"~Wځ|t^0ڂ)Pb IDATr.UDzҘD̘h*=yKlQͲējӈFFlw q;m8h݅T+`[]ś#gyfؓ(̫/r^^^[n^x}v4Mc˖-~[JE'0yꩧBqDV*VT^S/cz<<|=kaiREun/.a~I1s ɡ + ۝o8e8燆990^N >:JO ێn'&ʛox>r=v-tlTj7,TyڵVa*pzC&QO\a0*a$~L!੔MBvZӵo嵫CŜ+q;yXSveqSl^83Gxdyn?fIr)f" X?IbٲeTVV /o u]vzz~<ҥKY~pc\o=S(S%qڮPW\NNwy'?qyYlYF)?a^~e.]aA$! D(**fS+L2޼%n*~?_?t@ ̣%|xSq)ХYۥ,(+e^i ٳ᷹08^g7ޤu`\򜜌}*2C$Sv uhSe9M ݷtM#dD88vP?^CϮ1 o uYe+d&NyDs 7?GN)VY*IO[D>3%I3-ͭy.8>މal.j!0b3gI0zu\PXXȣ>ʅ TWWgSO u 57j|nN↣n<__˄?G7,,|0@1_;t0qo]x*0^[M#R-cT G {ɾϮ0nhRQUvxhQBuU"Y$\4Cطocg< .Fx(((y1>>N{{;g駟fܹ,X* x %2& 絫i:[8޼,%CVb/5TPǽsR8UabXS%i444RB!NגHx-23ݛS~>&WqC Iz쟐a02&UBa]1Snz0 bRr2['$PS383rƉcnkm+t݌}-*@8^ihFMM Ї̅ x';w.UUUBܹstvvS__/6Rvv6477ɓ a&yyyqݱp1FFF' cv'q|KEESVVŝReG˩ u;3L:ķK*l_޼OJS/Y⢓qn]KL2UTr D1]6Oy0 fqC_Xbʏ1icP6%a`4#Af(zd˒TŜ*~0N*agfJߴ@)fn'O \6cW^g :[wq9˕L҈D"Kww7$77QjTTIVg̻gǃ G@4`"mJ(2X'Ť  oUbH瞱1>s?9u:?|u>by25ULۼ'jh128_pl̍8!X*JDIf|}eY5R&ؘ?ӞR6B*ZijG55FeIlC7NʾRuѢEl޼g$>, , ??_x<mD$cN{_rg?LJرc:uH$Buu5 ՑN-++x,<'혺2)W]o1&nmf 9*eŠT nLTp8Ɨ⍏DU*YN'bei"+^6&t | c]~NyO/\4PxX|QY[KԌkA3LtBG{vН;al߾BZuʒqj g!"Q43Ե^ctRVZٳZ@SͩGt7 'Ożhe|q|>aVttfHSۗcq)zbs/#,˶,7QՇeWsx˛MxYKinx;M*;s:)Z1tU?Uu*953w=JjWw6: lFٱhI+a db%p˪Uhܒ޴9nn!چY\Vʇyٸ- Rl۶ .P]]?̼y em'ޢyM&axѧ?0? GHE EE|x3QtxmRo]wVWΤ;iG2 )SE ULX-#eit]_WwQɛB&Q;ʋPwi$HQ4,Dk&NoD8JUvP2bOģ +s <*DEbȘ})N;7'C 2HIyN;o A/AH6pIK&7̓՘̲s%r8Sdw=aI-ЕM;P Y] \& qwbj|q0Ѓ|'ӉϞ=ˋ/H4}{7nB|S- (ciS TmCCq)/1W!)4WqR= R&%~ ݣ\#\?0{qev^u˧<'b^krDh{>:Qyo?UˣYi-RuTF(Nt}" v|Umу0M&64!.3>D$3>t,*sr˜SKvT!Hp\Pl _st }MY\j+(`v~>eٓتWl5@8̥Q s~( 1 M͌lrsgnAyyfg'V_JƧ/\q_o7=t.y)XʫJ}/m62Lv XnGE7WU&ySCnatujG:;9GXH$2J_@CA>Ϛo/3H6Tߤp4K/^ORG jzkc쀤4.Bb޲.đΟkf 泤|R,T (0B&ݥ iн"o'N̹6ο'Jy&+<4Avve;ڙ|6ԓeQԁ4as<~W/urit8\pu΄irfp3<Ƃ"6y4(9 vkzDQ~,>˗<6nAN s,*.Z><,w0E]N'7IsOmD7n-';kqkNavգ8m۶ȦM͝VAH%EcbW{>3+aá {$tNn.EE{VCu56H0ȿ:NHtJKzCOۍI +w|`(pj`֡a_wS˗%Kd<*L0G=LV^\~F:817ӭKM){}ePMcj^ =z O890H/^h/c7-N*,QV!&hFqz X[ky׻И(L!BJ5 ~q][26M>.8t=WD"urA4 0Y^3rsgtB( ]cc1v=ɶ6^+h.)v_Mhkwri|3\j~?9]D p\c"jnAЕ+vi1/+SSMχ[wa&#\' "5x}<ﲥ!n&10oܓ[sq%t #mp.%S%:. O:}{)MYX*pJ<;=>S IeؔcxDlMhM%䤔,syRi̎w{[n,'[ɀI]1z#Uuo3%Gͣ4]WHLuw`K"t]JjLD"|aCWpͭ5\WGK *rzofkfۋr8|!W0_;6]֛G?Cغ 3ӧ={iFYRRg-޺:}| 4M}a!몪E} >6qrW9:?m܀?\:Q!9[:EB2qBw6s}30Msdź*]E;i,7tRjyyYz5ׯX;MnwM @US }چٯn]@P٭$&'seuњI}ly)+_yV>j%s piڤrk },[xeW McN~N%*aNcMJäy>1t&nl`OVbV~>&[3bDOn"֛yN z"r|+NWX`nVY3&=aJ&;]^UIJ0#CD͘w> g{^"P((+JJض7r&>;(̘ͳ1#'Z> _Z„gtNLї^ٳQ[ C=Ghu| ^}E 3==g ]豲KͲ {ݼV%XCu<_C&Fh٣nӻvnj _\l# RS=/}=VWV{ceYY2n:y8 pkʲT$+R,M&@c,bi"qJ*]E]Vilq&nہ~᱌ϩ|&&&x(**b֭%ruUWz$O\.,:]F#gHRV5|PP Y)ܛg- Prb5ڇe\S;vvOO,kzֆ[͛]Pj旖}ʕ[=`>Ͼ>p3HSuM/,1ї^foG'a&>jƁ.~z'1f4_w_߼lm8ʪ}o5x/?D?߼)hD ;{O&-(M(c(gqW]-O}|_GOWwDNN`%9cc?ܖu*bkre.n]oC7DnK.8W*WݗT`ϕDl3k9nwb#Bw|n.'y]n._y=],=mZkgB%{]nrzq͔y$*_._P8szK4Mx1Qjss]c-7]ư{W%Ok˵kuk)JîK]DR2٭% }5e2[ҷ?{ĕe<~H~VV(G +s\.hqm!2)ㄿv{+*ݽ|,??8G_|9L_+gw< ʼgg˗]5м^q?kmE[H]G\NorW]9ıo-"7^:ͷǏh310NέXW<h8tF1s&64S`*4{a'ROǏsN.~]SU+z.Da-3׍XS^T>?%gI]Wh/D4i))jK>+;n7r[BM9\=i&J9 ׯnx0r&vFY>]hժU#,n-_o_ tcwo(Gϝ 矉I4xe8N3ezzt7 x %DL# \}4h4_,IWi_z _k(*i;wQ_YŦ:¶[yOl{7{${~A_^6VÞ!u'풭3gXxE烇 ]M8{Ǐ37gp:=fWaDQgW`EYuxZx@L&Y^>&nU} E2bbi|YP\SHZʎa08E]D2UIJ.^}E-|A^}8џ<[=EpbPUOxqv'ܧaNWOGo>6nȜ9s~iw]v="Yn7Z"I$jL~T&AUi.^loO4VN*ve;||bb'OrvppZmaydaqY2T_Ϳl }4MwtƥNk jnz: q~4F"C!0Mn wXqh}7ViL/YM]QaQg.SDbgs?yg .{M3+x$-!g|]Q!^rt|qN%KB5- ~pU*DV[X׬FOҞXr$4jҵL^V已&o.Y3]<ֻ#mD㵯9,7 DywL>=== [QDcV}Q[> a,dY!&؈eMb['yVVFKBᫌ),>qb pL+(lE&rLdNzd?BSVV\ tʽ_O}K(ca(<usfdB?}. `0ݻHh'ˮ.tNl(n|e~ EtEEI5 *`vJ qѱ6eת< 粚Zwϊ>Z&:>>?Y0%TyeeKM[0 ^ť:b8bq#\~{|fĻY=N(rE:E$8QUzĘ ~ñ{mmf CjvΟݸ&u.ZH ڥN2#$vƃ(i6RyY.߲d.3v*;&eEߺQɣԓ#.h ҤWw : >ZM\!`xM>T_%垈m6 !mFڛ c0^񾯒Ւ}sţY~g42&4s};8ĥxw8̃˖%P0[! VPOǙ1Cwm19]'WyׂFCNko]VqbpJs)wS""./.b4t.& Zʙ{5kp_5anhyfchd@$%%xPqdr@ ;fj熆CvfnShv>kܹC@tu;蒳EKyo5adǮ}}p"~y4t1>> fʅxwfjJrs ^-nI"I D"gR(TC}}tJ* l7tPQVΜF91p9NR%Q񰥮Α ʄ -aK]'.H!`P"ySO}ekX_Etߎc :.$R y(**}{k Ȫ][P$:熆ce"M;QO!iI@M"SIڡHtz]u5A:GR"[v $G]0E]"{cJpǙTQ"w+q@SgY7d&&LoѿzVG *-t&5ee{smƆ5~?VGCasSv[IP$\4YtͫVm- geKYB=˽%+ɗsbU,p j%(^5i:pLhnЅ N+Q$ ey:&bj("j xvt2^E1|Ue$JZ9ē7%)u!OugzPމINߔԯLC+Xϋ;~j4yӼxH"Ѐ5%'6t,$F5vwJdyi8{.0So8~^p]vq}Q__)4 UR_GÈ2,[F-\-%RMc2mPq_aҘZYJf\\$m4TnyZu!,hŋpgp"/Γ$3Fꚳ (I"nEkX]kwW7Y;+gC'02+$$gv}a[dR;ge6-aL kj`غu+{/MMMlrtf7QH;/.)I dcmz 2ö 046ύWC'mm;ʍRbZ$+?t=+=.m+Z V&MCtNB'pǖK3[c2H^WSIYrkj) t>t~V"UUrm, ⦂5p6i7!M?<7tK. {)oH-_Jl祶6ªvaX].I8jU'LBl,+x9COvnG3.#`R|2JT±q`+(1/A i͠o+"_a8 0Uˣ(SBj2;meA"mm7!EII4XʊSrh 9:rkedd_ײf8Xf+\[Y^QigK+QF07Då47')8$:ӪqvUp(H8<`=<++`q3݊p&JO#U雜Lexp {?Ũ[ ǥPF)#TT2[#fTz$.˝\+=w=`NcV>)H=$&BkeYܯJ K#''QN UO}h?~;S]|IѶiW}1+]958ȯΝg"~{͇$Q\Ch$~7 t>:F(e\EAe~>Nv 8C%]#7 `E3rՆ5޾+y(GF-f ׂڑtñ2i[}96G j\.WFHBV IDAT)rC̝[m[6Q]RAY~UD,j[$Q\w7z{v2bPh0}D4-P]]2%kj(.:[[/ [AyK3u"o[/&ɹD7dD#VE'Zj_XʼX`#}ofZj]Ý}!U[u@ja462ʳ-L I|fJ5+5"h$S'O%Zw"֐QUMo썹>49>բIM+)mI̯/4sﲰ_ LwR٦[V'LJa}@V2+%.5 oow7[;rZqOCCLZ'3}>>~~\p\d*Ȏ6p?'''ٵk~4MKFY7@{Ocӟ]׹G?ʊ+(--EVdΞnz''Qs~*ؐ܃#ܽ1 R1ЦQO}׊ >dL(O>B@< 9~Bk6bjd#OtfL\piii!??J~x2Qhkk?!?O_*?Ѣ:;Fqy)S$SÊ˩Na>?Ǥ7=>nYfEdSX(۸7.\!sߢES7/ez!x%:fhi='{41 gWb]UUf1&Y a,;Id?ٶM~x4߿yfWJPիM wsRE55=o75|7cY"@9<8_`3I#sLۡJc:Ƅ/1^DFt_>ͷF唶JBlhFh1u'~LC,/244{^bɒ%ڢiǎ'… l޼G}/nٖVv^B y4t)vY`oOjI (-}gywE ɍo?vo}]8=9 ډj/{FFy[5E99|a (-=Fsh`Li.o&:zzb(yuJuN9pMNRV$f[[;_ڵ Sg'̊O}rllǯɬ*)n=44Ϸ1<9s,}  ޽|l&ljP"T…"A@,|u'_O26>V} gR~$M`Dde=t'xpV xkŋ/,vPUWn*onŧmK=֘\%j[; CND4o*Ny8 Wqs@3𫯱%]tEH4^k/o1]U͛*k5OdrUW':GGyx<} Hth{cu(|q |a:CdXu޵`_G^\)rnSɬe(́H?s_XPc4ʖ|iCpgC=_q}K|m^.d $y >XibIUcc]iJ{S!oddK+pa>ٳgbڵ#G~Fcc#YzbI&EH<:ureL*d.o6ndiI D#v59co/os )(ŶlQ1>v~}'G▯Ju~u:rM%%oN$jW7 O8X<#܉L΁Cӓu[P3Xu/kkmRVN[[/mO^.1r #|r+K JyZ|f(*>e/޵[΅p\ |nN֑߳)W&F@TUy?{e;$_Z_mŪ>5 7+z4ٶ_ l$ag/x ##DX7t;5KԪU$P;Y៎㳯o[Zs<{7~DHU|g&c5IMI,m/[e(Z(ATI_w^uuuD"^|EzrOSWW<@ii-3gxgYƣ1@NԿ'ܘq*îZ&͆Pw2XΒR{04X==]`jcCM eqrIR4Cn 2 Ŭ?Yh;pwcnY ʕxGvfッ|anuKOgl ?x9nqUoݶ-l(%j4ۊ$K*_Fȇ!ٹKw~#=Gj57Sg+rrA8LCQ߻c3iZ`ٹ4GV1|;cзP(̷eץK|dB>x1sN#{MgWg7?;}e>zu<˶jqxdZ,6mbժU8p˗/aÆi?ӔCQZZ*. 8oXÒRF!T]HTMa8dH̬p׆RWǷedsd`CC 糼XQ^Ƃb*q)S;NT8:ɁAr|` !hl* DիuK/,4N eIc]ǜ|:ga8Wt;汴\1d8Ɂ~wS Bvĭe|Q_l89tU!I]v\>c'ͣ(G039u5s[[[΢EشinMxXr%EES_}U)++l0󍽬(/E*DU*gk֕|t il'(` džUk+I£(z.7GO>>`0H@ӓ5cyh:._W7Lc<*ۊ!bMc6 6SB;a ܵeeÌEbX$ʑ!Ng(x>E G tLLWU(J[o宆+t]re,(.KvMI:~^&OQRQBu&B!.Od8&iWĹrϮYׯgN^(bu|n7]Ê2:'ʼn ''y<y>%y^FC {)))i8wImmr{/GV`ia!jd4P HM/5޵wYf]M0u>_q=_׻xB 49ɤ4T]'ODbp)D,SrcU_ĝvRXmn7X?X=~=KU#v}`* enwo$inl t?N$suuu{~_uVyd*Zx\Q/Q%Gt :-0z&'*,x(en~y5I7"[Kj4lD\|;c09s… 48D@@ǎy55JHp8L0b(.jua>=[Q޵%T#X*љVE}|%+㵛 wb<ʭ7$Ykt {`J3IEAvVX(5IDAT4'+6g>F7MbGkI%;F:Q*%NDaum=S+3W\_AFgɹh'D,s&iO׾}xIZ~T/)U;J㊔^TEkC[Yulر!vZVZWVH?2';e1՜9,l*4R=JF&^lٔwttOyyy0?`;:\QI$w2#TTTu)nkrlHp=ـ,.n6EeeuYQYbBv9v֯Y:cg'֧9PlL2$͞mzeu8ί/zN#ffkӬyQ]llLL9 z0߷388Hcc#~ 3M൮n'" h[ 1.]d֋YF+;ac= e+v;||"QM@#3v@U("̭JLF L_KF%֞HY]qǤ?I%/g2R dTXY鈍(gևlZڙV>vYp!X~Hۇⷃ7[ p 3pVuh^&jdZNk v2FH*|@yNr92CJK O<[d+ײ_:f{\2}AM{'8o;ъN|w.LDqoV$AHkĊL㐰 bp/D:EN6hZhχk&l\NKE^^$ д+5UUB`ƅ$I0/ +ʍ3IQ+j N'N;a98+HZ슢"cvV$iE)aw`YV{B6YN+ӊ[@TqXeZVVQxVпe2Sg^) 3u5QQ999( &kGۺ3o%*˯ɊolGU0DGF_UD;TH,(L`ȡe&XDf}tB'mٞ3n%X\D*"6`ͲDIet$[ƩإY).'L]4T|5Njjjj0Kk E' rS+œWfK&dNͬvN.2-! YJ (Sկ3V7 fA%8r3ErG8u[92#2bb 4sNȞh܌}ά"3x>'1\ V]l)Iv.rd:2ugYFIմZ ԹNѩ\·vk_dY T ]2[3N QӉ! 9 DgVLHY.zUMIGc{_;[V;[ĚiL"d'o'0쪐6֓.n j&8)_fg@YV㘉&˝@NLD2݋ <dlimIENDB`DiscoSnp-2.6.2/discoSnpRAD/000077500000000000000000000000001420021152700153465ustar00rootroot00000000000000DiscoSnp-2.6.2/discoSnpRAD/COOKBOOK.md000066400000000000000000000306771420021152700171130ustar00rootroot00000000000000# DiscoSnp-RAD cookbook **Table of Contents** * [1. No reference genome - Using only reads 1 from pairs - No clustering](#1) * [2. No reference genome - Using only reads 1 from pairs - With clustering](#2) * [3. Using a reference genome - Using only reads 1 from pairs - With clustering](#3) * [4. Using forward and reverse reads.](#4) * [5. Post-processing](#5) - - - - **Prerequisite** Datasets `set1.fastq.gz`, `set2.fastq.gz`, ..., `set5.fastq.gz` for this cookbook can be downloaded as following: ```bash for i in 1 2 3 4 5; do wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/set$i.fastq.gz; done ``` **Full commands:** For each example, the full commands are proposed at the end of the section. **Computation time** is approximately 10 to 15 minutes per example (once dataset is dowloaded). *** **Note about multiplexed data** To date, DiscoSnp-RAD is not able to consider multiplexed data. Hence, input files need to be demultiplexed to samples. - - - - ## 1. No reference genome - Using only reads 1 from pairs - No clustering This is the most classical usage of DiscoSnp-RAD. Consider one has $n$ rad datasets composed only of reads 1. Suppose those sets are called `set1.fastq.gz`, `set2.fastq.gz`, ..., `setn.fastq.gz`. **First**, one need to create a *file of file* (fof), used as input for DiscoSnp-RAD. In this case, we want each data set to be considered individually in the displayed results. Hence, each line of the input fof contains exactly one dataset name. We may create this fof as following: ```bash ls set*.fastq.gz > my_fof.txt ``` > **Reminder**DiscoSnp-RAD can analyse fastq or fasta files, gzipped or not. > **Note**If you wish to run DiscoSnp-RAD from a directory distinct from the one containing the read datasets, you have to indicate the absolute paths in the fof:```bash > ls -d $PWD/set*.fastq.gz > my_fof.txt > > ``` > > ``` **Second**, run discoSnp-RAD, using the input fof: ```bash /my/discoSnp/path/discoSnpRAD/run_discoSnpRad.sh -r my_fof.txt ``` That's it! Results are available in files * `discoRad_k_31_c_3_D_0_P_5_m_5_raw.fa` that contains the raw bubble sequences detected by discoSnp. For instance the first variant of this file is : ``` >SNP_higher_path_9965|P_1:30_C/G|high|nb_pol_1|left_unitig_length_83|right_unitig_length_6|left_contig_length_83|right_contig_length_6|C1_0|C2_22|C3_0|C4_0|C5_0|Q1_0|Q2_71|Q3_0|Q4_0|Q5_0|G1_1/1:364,58,5|G2_0/0:5,70,444|G3_1/1:384,61,5| G4_1/1:424,67,5|G5_1/1:364,58,5|rank_1 atgtggcctgccgaggtggaggcggtcatcgacgagctgccggaggtgaagcgggtgtgcgtgatcggggtttacgacgagacCCAGGGAGATGTGCCTGGTGCCCTGGTTGTCCGGGAGGATAATGCCACTCTGACCGCACAGcaggtg >SNP_lower_path_9965|P_1:30_C/G|high|nb_pol_1|left_unitig_length_83|right_unitig_length_6|left_contig_length_83|right_contig_length_6|C1_18|C2_0|C3_19|C4_21|C5_18|Q1_71|Q2_0|Q3_71|Q4_71|Q5_71|G1_1/1:364,58,5|G2_0/0:5,70,444|G3_1/1:384, 61,5|G4_1/1:424,67,5|G5_1/1:364,58,5|rank_1 atgtggcctgccgaggtggaggcggtcatcgacgagctgccggaggtgaagcgggtgtgcgtgatcggggtttacgacgagacCCAGGGAGATGTGCCTGGTGCCCTGGTTGTGCGGGAGGATAATGCCACTCTGACCGCACAGcaggtg ``` ​ It is a SNP for which one can find **1/** its id: `9965`, **2/** its variable nucleotides `A/C` **3/** its nucleotidic complexity `high` (this is not a low complexity sequence), **4/** the length of its left and right unitigs `83` and `6` (corresponding resp. to the leftmost and rightmost lowercase acgt chatacters). For the higher path (first sequence corresponding to the `C` allele - the lower path corresponding to the `G`allele) **5/** the abundance of the allele is provided in the Ci fields (`0` for first dataset, `22` for the second and so on), **6/** the average phred quality of mapped reads on the variable locus is provided (`0`for first dataset, `71` for the second and so on). For the both paths, **7/** the estimated genotype of the variant is provided for each dataset (`G1` to `G5`), and **8/** its rank (see manuscript for detailed explanation). ​ Note1: information **1/**, **2/**, **3/**, **4/**, **7/** and **8/** are redundant for the two lines, while information **5/** and **6/** are specific to each allele, that is to say to each line. ​ Note2: higher case characters correspond to the sequences of the bubble, and lower case sequences correspond to the left and right unitigs surrounding the bubble. * `discoRad_k_31_c_3_D_0_P_5_m_5.vcf`. For instance the first variant is this file is ``` SNP_higher_path_9965 113 9965 C G . . Ty=SNP;Rk=1.0;UL=83;UR=6;CL=83;CR=6;Genome=.;Sd=.;Cluster=.;ClSize=. GT:DP:PL:AD:HQ 1/1:18:364,58,5:0,18:0,71 0/0:22:5,70,444:22,0:71,0 1/1:19:384, 61,5:0,19:0,71 1/1:21:424,67,5:0,21:0,71 1/1:18:364,58,5:0,18:0,71 ``` ​ This line contains the same information as the one existing in the comment of the fasta file previously presented. Additional fields are proposed. They are empty as they are related to the usage of a reference genome that we have not done in this example or to the clustering of the variants that has not been done neither. * `discoRad_read_files_correspondance.txt`. This files simply recall the correspondence between the `C1`, ... `C5` fields with their datasets names. For instance, first line is `C_1 set1.fastq.gz` **Full commands:** ```bash disco_path=/my/discoSnp/path/ ``` ``` for i in 1 2 3 4 5; do wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/set$i.fastq.gz; done ls set*.fastq.gz > my_fof.txt ${disco_path}/discoSnpRAD/run_discoSnpRad.sh -r my_fof.txt ``` ## 2. No reference genome - Using only reads 1 from pairs - With clustering Given the fof file created as previously, run discoSnp-RAD indicating the `short_read_connector` installation path. ```bash /my/discoSnp/path/discoSnpRAD/run_discoSnpRad.sh -r my_fof.txt -S /my/SRC/path/ ``` ​ In this case we retrieve the `discoRad_k_31_c_3_D_0_P_5_m_5_raw.fa` and the `discoRad_read_files_correspondance.txt` files as previously exposed. ​ The vcf file is now called `discoRad_k_31_c_3_D_0_P_5_m_5_clustered.vcf` as the `Cluster` field contains for each variant the cluster id of the variant and the `ClSize` field contains the size of the corresponding cluster. ​ In addition a second .fa file is provided: `discoRad_k_31_c_3_D_0_P_5_m_5_raw_filtered.fa`. In this file, variants with more than 0.4 missing data and rank<0.4 are filtered out. **Full commands:** ```bash disco_path=/my/discoSnp/path/ src_path=/my/short_short_read_connector/path ``` ``` for i in 1 2 3 4 5; do wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/set$i.fastq.gz; done ls set*.fastq.gz > my_fof.txt ${disco_path}/discoSnpRAD/run_discoSnpRad.sh -r my_fof.txt -S ${src_path} ``` ## 3. Using a reference genome - Using only reads 1 from pairs - With clustering If one disposes for a reference genome, it can be used for determine the position of each predicted variant (without using the reference genome for prediction) on the genome. We may use the proposed reference genome as following: ```bash wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/ref.fa ``` Variants from `discoRad_k_31_c_3_D_0_P_5_m_5_raw_filtered.fa` can be mapped to the reference genome as following: ```bash /my/discoSnp/path/scripts/run_VCF_creator.sh -G ref.fa -p discoRad_k_31_c_3_D_0_P_5_m_5_raw_filtered.fa -e -o temp.vcf ``` Note: bwa must be installed and in the path. In order to retrieve the clustering information already computed, the `add_cluster_info_to_mapped_vcf.py`script may be used: ``` python /my/discoSnp/path/discoSnpRAD/post-processing_scripts/add_cluster_info_to_mapped_vcf.py -m temp.vcf -u discoRad_k_31_c_3_D_0_P_5_m_5_clustered.vcf -o discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf ``` **Full commands:** ```bash disco_path=/my/discoSnp/path/ src_path=/my/short_short_read_connector/path ``` ``` for i in 1 2 3 4 5; do wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/set$i.fastq.gz; done wget http://bioinformatique.rennes.inria.fr/data_cookbook_discoSnp-RAD/ref.fa ls set*.fastq.gz > my_fof.txt ${disco_path}/discoSnpRAD/run_discoSnpRad.sh -r my_fof.txt -S ${src_path} ${disco_path}/scripts/run_VCF_creator.sh -G ref.fa -p discoRad_k_31_c_3_D_0_P_5_m_5_raw_filtered.fa -e -o temp.vcf python ${disco_path}/discoSnpRAD/post-processing_scripts/add_cluster_info_to_mapped_vcf.py -m temp.vcf -u discoRad_k_31_c_3_D_0_P_5_m_5_clustered.vcf -o discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf ``` ## 4. Using forward and reverse reads. Whatever the wanted usage (with or without reference genome, with or without clustering) one may use pairend data. Imagine one disposes from 5 pairend read sets * `set1_1.fastq.gz`, `set1_2.fastq.gz` * `set2_1.fastq.gz`, `set2_2.fastq.gz` * ... * `set5_1.fastq.gz`, `set5_2.fastq.gz` 1. **If our aim is to consider individually each file** (hence considering each file as a set), then we can simply create a *file of files* (fof) in which each line is a .fastq.gz file: ```bash ls *.fastq.gz > my_fof.txt ``` 2. **If our aim is to virtually concatenate forward and reverse reads for each sample**, we have to create as many fof as samples: ```bash for (( i=1; i<=5; i++ )); do ls set${i}_*.fastq.gz > my_fof_set${i}.txt ; done ``` ​ Finally the fof provided to `run_discoSnpRad.sh` script (`-r` option) is a file in which each line is a fof file for one sample: ```bash ls my_fof_set*.txt > my_fof.txt ``` ## 5. Post-processing A bench of post-processing scripts can be found in the dedicated [directory](https://github.com/GATB/DiscoSnp/tree/master/discoSnpRAD/post-processing_scripts). We consider here that [case 3](#3.%20Using%20a%20reference%20genome%20-%20Using%20only%20reads%201%20from%20pairs%20-%20With%20clustering) (Using a reference genome - Using only reads 1 from pairs - With clustering) was performed, hence obtaining the file: `discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf` ### 5.1 Filtering scripts #### **script** `filter_by_cluster_size_and_rank.py` * Filtering on cluster size. Use case: Need clusters of size between 2 to 100: ```bash python filter_by_cluster_size_and_rank.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o filtered_on_cluster_size.vcf -m 2 -M 100 ``` * Filtering on rank. Use case: Need variants with a rank higher than 0.8: ```bash python filter_by_cluster_size_and_rank.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o filtered_on_rank.vcf -r 0.8 ``` #### script `filter_vcf_by_indiv_cov_max_missing_and_maf.py` * Filtering on read coverage. Use case: replace by `./.`original genotypes of variants whose total read coverage is below 20: ```bash python filter_vcf_by_indiv_cov_max_missing_and_maf.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o non_genotyped_low_covered.vcf -c 20 ``` * Filtering on missing genotypes. Use case: Remove variants whose fraction of missing genotypes is greater than 70%: ```bash python filter_vcf_by_indiv_cov_max_missing_and_maf.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o filtered_on_missing_geno.vcf -m 0.7 ``` * Filtering on minor allele frequency. Use case: Remove variants whose minor allele frequency is smaller than 0.2: ```bash python filter_vcf_by_indiv_cov_max_missing_and_maf.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o filtered_on_maf.vcf -f 0.2 ``` #### script `filter_paralogs.py` * Filtering on paralogs. Use case: Remove variants that belong to a cluster such that more than 50% of its variants have each more than 10% of heterozygous genotypes: ```bash python filter_paralogs.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o filtered_on_paralogs.vcf -x 0.1 -y 0.5 ``` ### 5.2 Scripts for STRUCTURE analyses #### script `1SNP_per_cluster.py` * Conserve one variant per cluster (the one with less missing genotypes). Use case: prepare the vcf file to be used by STRUCTURE: ```bash python 1SNP_per_cluster.py -i discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf -o one_variant_per_cluster.vcf ``` #### script `vcf2structure.sh` * Changes the vcf format to a Structure format (input of the software Structure). Use case: prepare the vcf file to be used by STRUCTURE: ```bash sh vcf2structure.sh discoRad_k_31_c_3_D_0_P_5_m_5_mapped.vcf > file.str ``` ### 5.3 Mapping to a reference, and keeping the cluster information. The script `add_cluster_info_to_mapped_vcf.py` can be used in case one wants to map predicted variants to any available genome. This use case was described in [case 3](#3.%20Using%20a%20reference%20genome%20-%20Using%20only%20reads%201%20from%20pairs%20-%20With%20clustering) (Using a reference genome - Using only reads 1 from pairs - With clustering) DiscoSnp-2.6.2/discoSnpRAD/README.md000066400000000000000000000077301420021152700166340ustar00rootroot00000000000000# DiscoSnpRAD: small variant discovery and genotyping for RAD-seq data DiscoSnpRAD is a pipeline based on discoSnp++ to discover small variants in RAD-like sequencing data. The differences with respect to using directly discoSnp++ lies in three main features: * an enhanced bubble model to deal with RAD-like sequences * using specific discoSnp++ parameters and filters, adapted to RAD-like data * clustering the called variants into loci **Reference:** Gauthier, J., Mouden, C., Suchan, T., Alvarez, N., Arrigo, N., Riou, C., Lemaitre, C., Peterlongo, P. (2019). [DiscoSnp-RAD: de novo detection of small variants for population genomics](https://www.biorxiv.org/content/10.1101/216747v2). BioRxiv ​ Simulation and validation scripts: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3724518.svg)](https://doi.org/10.5281/zenodo.3724518) ## Installation * DiscoSnpRAD is installed via the discoSnp++ basic instal (from sources or conda install. see [../README.md](../README.md)) * `short_read_connector` must have been downloaded and installed (clustering task). [https://github.com/GATB/short_read_connector](https://github.com/GATB/short_read_connector) ## Usage ``` ./run_discoSnpRad.sh -r read_file_of_files -S -p myDiscoSnpRADresult [discoSnp++ OPTIONS] ``` **Clustering option** (RAD-specific option): ``` -S|--src [src_path] performs clustering of variants with short_read_connector src_path: **absolute** path to short_read_connector directory, containing the "short_read_connector_linker.sh" file. -Note1: short read connector must be compiled. -Note2: if no value is given, it assumes short_read_connector.sh is in the PATH env variable. -Note3: with this option, discoSnpRad outputs a vcf file containing the variants clustered by locus. ``` All other options are described in [discoSnp++ README](../README.md). Note that many discoSNP++ parameters have here default values, specifically adapted to RAD-seq data. To see all options: ``` ./run_discoSnpRad.sh -h ``` ## Output When run with output prefix name `myDiscoSnpRADresult`, the main output file is : * `myDiscoSnpRADresult_[parameter_values]_clustered.vcf`: the final set of variants, with various information, including clustering per locus information (see VCF format below). * or `myDiscoSnpRADresult_[parameter_values].vcf` if no clustering was performed. Additionnally, several other files are output that can be usefull : * `myDiscoSnpRADresult_[parameter_values]_raw.fa`: the raw set of variants in fasta format, prior to any filtering and clustering steps. * `myDiscoSnpRADresult_[graph_parameter_values].h5`: the de Bruijn graph in h5 format (reusable with any GATB tool) * `myDiscoSnpRADresult_read_files_correspondance.txt`: the correspondence between read file names and IDs given as genotypes in the vcf * the standard output reminds all filtering steps applied and the name of the output .vcf file #### VCF format Each variant is described with: * an ID: `ID` column, * two alleles (`REF` and `ALT` columns), * a quality value: `INFO` column, `Rk`, between 0 (bad) and 1 (best), * some clustering information: `INFO` field: with the locus id (`Cluster`) and its number of varying sites (`ClSize`), * and for each sample in the genotype columns (`G1`, `G2`,...): the inferred genotype (`0/0`, `0/1`, `1/1`or `./.`for missing value), the read depths (`RD` total, `AD`per allele), among others. ## Cookbook This [cookbook](./COOKBOOK.md) presents classical usages. ## Content of this directory Additionnally to the main script of discoSnpRAD, this directory contains two sub-directories : * [clustering_scripts](clustering_scripts/) : it contains the scripts used by the main script of discoSnpRAD for clustering and formatting the variants. * [post-processing_scripts](post-processing_scripts/) : it contains several scripts that can be usefull to post-process the results of discoSnpRAD, ie. filtering results according to various criteria, changing format, preparing data for Structure, etc. DiscoSnp-2.6.2/discoSnpRAD/clustering_scripts/000077500000000000000000000000001420021152700212745ustar00rootroot00000000000000DiscoSnp-2.6.2/discoSnpRAD/clustering_scripts/README.md000066400000000000000000000027561420021152700225650ustar00rootroot00000000000000# Directory containing scripts called by [run_discoSnpRad.sh](https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/run_discoSnpRad.sh) These scripts are not intended to be used by a user. They are called by [run_discoSnpRad.sh](https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/run_discoSnpRad.sh). 1. **script** `discoRAD_clustering.sh` * This script * manages bubble clustering from a discofile.fa file, * manages the integration of cluster informations in a vcf file * remove variants with more than 95% missing genotypes (can be changed with -m option) * remove low rank (<0.4) variants (can be changed with -r option) * remove clusters with more than 150 variants (can be changed with -c option) * This script is automatically used in [run_discoSnpRad.sh](https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/run_discoSnpRad.sh) * It presents no interest to be used alone 2. **script** ` from_SRC_to_edges.py ` * Parses the short read connector output to a format readable by the clustering algorithm. * This script is used in [discoRAD_clustering.sh](https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/clustering_scripts/discoRAD_clustering.sh) * It presents no interest to be used alone 3. **script** `fasta_and_cluster_to_filtered_vcf` * This script is used in [discoRAD_clustering.sh](https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/clustering_scripts/discoRAD_clustering.sh) * It presents no interest to be used alone DiscoSnp-2.6.2/discoSnpRAD/clustering_scripts/discoRAD_clustering.sh000077500000000000000000000160561420021152700255320ustar00rootroot00000000000000#!/bin/bash # REQUIRES: ## Python 3 ## short_read_connector: installed and compiled: https://github.com/GATB/short_read_connector # echo "WARNING: short_read_connector must have been compiled" red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` cyan=`tput setaf 6` bold=`tput bold` reset=`tput sgr0` function help { echo $reset echo "=====================================================" echo "Filtering, clustering per locus and vcf formatting of $rawdiscofile" echo "=====================================================" echo "this script manages bubble clustering from a discofile.fa file, and the integration of cluster informations in a vcf file" echo " 1/ Remove variants with more than 95% missing genotypes and low rank (<0.4)" echo " 2/ Cluster variants per locus" echo " 3/ Format the variants in a vcf file with cluster information" echo "Usage: ./discoRAD_clustering.sh -f discofile -s SRC_path -o output_file.vcf" # echo "nb: all options are MANDATORY\n" echo "OPTIONS:" echo " -f: DiscoSnp fasta output containing coherent predictions" echo " -m: Max Missing value (default 0.95)" echo " -r: Min Rank (default 0.4)" echo " -c: Max cluster size (default 150)" echo " -s: Path to Short Read Connector" echo " -o: output file path (vcf)" echo " -w: Wraith mode: only show all discoSnpRad commands without running them" } wraith="false" # if [ "$#" -lt 7 ]; then # help # exit # fi # rank filter parameter min_rank=0.4 # max cluster size parameter max_cluster_size=150 percent_missing=0.95 while getopts "f:s:o:m:r:c:hw" opt; do case $opt in f) rawdiscofile=$OPTARG ;; m) percent_missing=$OPTARG ;; r) min_rank=$OPTARG ;; c) max_cluster_size=$OPTARG ;; s) short_read_connector_path=$OPTARG ;; o) output_file=$OPTARG ;; w) wraith="true" ;; h) help exit ;; esac done if [[ -z "${rawdiscofile}" ]]; then echo "${red}-f is mandatory$reset" >&2 exit fi if [[ -z "${short_read_connector_path}" ]]; then echo "${red}-s is mandatory$reset" >&2 exit fi if [[ -z "${output_file}" ]]; then echo "${red}-o is mandatory$reset" >&2 exit fi # Detect the directory path EDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) if [ -d "$EDIR/../../build/" ] ; then # VERSION SOURCE COMPILED BINDIR=$EDIR"/../../build/bin" else # VERSION BINARY BINDIR=$EDIR/../../bin fi rawdiscofile_base=$( basename "${rawdiscofile}" .fa) #################### PARAMETERS VALUES ####################### #Get k value (for clustering purpose) originalk=$( echo $rawdiscofile | awk -F k_ '{ print $2 }' | cut -d "_" -f 1) usedk=$((originalk-1)) ## Short Read Connector is limited to kmers of size at most 31 (u_int64). if [ ${usedk} -gt 31 ] then usedk=31 fi echo "${yellow}############################################################" echo "######### MISSING DATA AND LOW RANK FILTERING #############" echo "############################################################" echo "${yellow}#Filtering variants with more than ${min_rank} missing data and rank<${min_rank} ...${reset}" disco_filtered=${rawdiscofile_base}_filtered cmdFilter="python3 ${EDIR}/fasta_and_cluster_to_filtered_vcf.py -i ${rawdiscofile} -f -o ${disco_filtered}.fa -m ${percent_missing} -r ${min_rank} 2>&1 " echo $green$cmdFilter$cyan if [[ "$wraith" == "false" ]]; then eval $cmdFilter if [ ! -s ${disco_filtered}.fa ]; then echo "${red}No variant pass the filters, exit$reset" exit 0 fi fi ######################### Clustering ########################### echo "${yellow}############################################################" echo "###################### CLUSTERING ##########################" echo "############################################################" echo "#Clustering variants (sharing at least a ${usedk}-mers)...${reset}" # Simplify headers (for dsk purposes) disco_simpler=${disco_filtered}_simpler cmdCat="cat ${disco_filtered}.fa | cut -d \"|\" -f 1 | sed -e \"s/^ *//g\"" echo $green $cmdCat "> ${disco_simpler}.fa$cyan" if [[ "$wraith" == "false" ]]; then eval $cmdCat > ${disco_simpler}.fa fi #cat ${disco_filtered}.fa | cut -d "|" -f 1 | sed -e "s/^ *//g" > ${disco_simpler}.fa cmdLs="ls ${disco_simpler}.fa" echo $green$cmdLs "> ${disco_simpler}.fof$cyan" if [[ "$wraith" == "false" ]]; then eval $cmdLs > ${disco_simpler}.fof fi #ls ${disco_simpler}.fa > ${disco_simpler}.fof # Compute sequence similarities #version SRC < 1.2.0: #cmdSRC="${short_read_connector_path} -b ${disco_simpler}.fa -q ${disco_simpler}.fof -s 0 -k ${usedk} -a 1 -l -p cmdSRC_index="${short_read_connector_path} index -b ${disco_simpler}.fa -i index_disco.dumped -a 1 -l -k ${usedk} ${disco_simpler} 1>&2 " echo $green$cmdSRC_index$cyan if [[ "$wraith" == "false" ]]; then eval $cmdSRC_index fi echo $reset if [ $? -ne 0 ] then echo "${red}there was a problem with Short Read Connector indexation phase, exit$reset" exit 1 fi cmdSRC_query="${short_read_connector_path} query -i index_disco.dumped -q ${disco_simpler}.fof -l -p ${disco_simpler} 1>&2 " echo $green$cmdSRC_query$cyan if [[ "$wraith" == "false" ]]; then eval $cmdSRC_query fi echo $reset if [ $? -ne 0 ] then echo "${red}there was a problem with Short Read Connector query phase, exit$reset" exit 1 fi # Format one line per edge cmd="python3 ${EDIR}/from_SRC_to_edges.py ${disco_simpler}.txt" echo $green$cmd "> ${disco_simpler}_edges.txt$cyan" if [[ "$wraith" == "false" ]]; then eval $cmd "> ${disco_simpler}_edges.txt" fi # Compute the clustering cmdqhc="${BINDIR}/quick_hierarchical_clustering ${disco_simpler}_edges.txt" echo $green$cmdqhc " > ${disco_simpler}.cluster$cyan" if [[ "$wraith" == "false" ]]; then eval $cmdqhc "> ${disco_simpler}.cluster" fi if [ $? -ne 0 ] then echo "${red}there was a problem with quick_hierarchical_clustering, exit$reset" exit 1 fi echo $reset ######################### VCF generation with cluster information FROM ORIGINAL FASTA ########################### echo "${yellow}############################################################" echo "###################### OUTPUT VCF ##########################" echo "############################################################$reset" cmdVCF="python3 ${EDIR}/fasta_and_cluster_to_filtered_vcf.py -i ${disco_filtered}.fa -o ${output_file} -c ${disco_simpler}.cluster -s ${max_cluster_size} 2>&1 " echo $green$cmdVCF$cyan if [[ "$wraith" == "false" ]]; then eval $cmdVCF fi if [ $? -ne 0 ] then echo "${red}there was a problem with vcf creation, exit$reset" exit 1 fi echo "${yellow}#######################################################################" echo "######################### CLEANING ##################################" echo "#######################################################################$reset" rm -f ${disco_simpler}* #rm -f ${disco_filtered}.fa echo "${yellow}============================" echo " DISCORAD clustering DONE " echo "============================" echo " Results in ${output_file}$reset" DiscoSnp-2.6.2/discoSnpRAD/clustering_scripts/fasta_and_cluster_to_filtered_vcf.py000077500000000000000000000240061420021152700305520ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' *********************************************** Script to filter and format discoSnp raw output file (.fa) into a vcf format file (.vcf) Author - Claire Lemaitre Usage: python3 fasta_and_cluster_to_filtered_vcf.py -i disco_bubbles_coherent.fa [-o disco_bubbles_coherent.vcf -m 0.95 -r 0.4] *********************************************** ''' import sys import getopt import random import re #regular expressions import time import os sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../scripts/")) from vcf_formatting_functions import * ''' Usages in discoSnp pipeline scripts (RAD/clustering_scripts/discoRAD_clustering.sh): If no clustering: python3 fasta_and_cluster_to_filtered_vcf.py -i disco_bubbles_coherent.fa -o disco_bubbles_coherent.vcf -m 0.95 -r 0.4 end of the pipeline If clustering: python3 fasta_and_cluster_to_filtered_vcf.py -i disco_bubbles_coherent.fa -f -o disco_bubbles_coherent_filtered.fa_removemeplease -m 0.95 -r 0.4 # then clustering with file disco_bubbles_coherent_filtered.fa_removemeplease python3 fasta_and_cluster_to_filtered_vcf.py -i disco_bubbles_coherent_filtered.fa_removemeplease -c disco_bubbles_coherent_filtered_simpler.cluster -o disco_bubbles_coherent_clustered.vcf -s 150 rm -f disco_bubbles_coherent_filtered.fa_removemeplease end of pipeline ''' def store_clusters(cluster_file): if cluster_file==None: return None, None clusters=open(cluster_file,"r") read_id_to_cluster_id={} cluster_id_to_cluster_size={} cluster_id=-1 for cluster in clusters: # a line is "70166 70345 70409 70222 70406 70167 70223 69786 70407 69787 70408 70611 70610 70344 " cluster_id+=1 cluster_id_to_cluster_size[cluster_id]=int(len(cluster.rstrip().split())/2) for read_id in cluster.rstrip().split(): read_id_to_cluster_id[int(read_id.split('-')[0])]=cluster_id # A line can be formated as 70166 70345-info_about_similarity clusters.close() return read_id_to_cluster_id, cluster_id_to_cluster_size def get_cluster_id_and_size(sequence_id, read_id_to_cluster_id, cluster_id_to_cluster_size): if not read_id_to_cluster_id: return ".", "." if sequence_id not in read_id_to_cluster_id: print("Warning, sequence id "+str(sequence_id)+" not in clusters",file=sys.stderr) return ".", "." return read_id_to_cluster_id[sequence_id], cluster_id_to_cluster_size[read_id_to_cluster_id[sequence_id]] def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]," : discoSnp output filtering and formatting in vcf") print("-----------------------------------------------------------------------------") print("usage: ",sys.argv[0]," -i disco_bubbles.fa") print(" -r: min rank value filter (default = 0)") print(" -m: max missing value filter (default = 1)") print(" -s: max cluster size filter (default = 0, ie no size limit)") print(" -o: output vcf file path (default = stdout)") print(" -f: output a filtered fasta file instead of a vcf file") print(" -c: considers a cluster input file. In this situation, can filter on cluster size and prints the cluster_id and cluster_size in the INFO field of each variant") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:r:m:s:o:fc:", ["help", "in=", "rank=", "miss=", "size=", "out=", "fastaout", "cluster"]) except getopt.GetoptError as err: # print help information and exit: print(str(err)) # will print something like "option -a not recognized" usage() sys.exit(2) # Default parameters fasta_file = 0 fasta_only = 0 min_rank = 0 max_miss = 1 max_cluster_size = 0 k = 31 out_file = None cluster_file = None with_cluster = False for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-i", "--in"): fasta_file = arg elif opt in ("-r", "--rank"): min_rank = float(arg) elif opt in ("-m", "--miss"): max_miss = float(arg) elif opt in ("-s", "--size"): max_cluster_size = int(arg) elif opt in ("-o", "--out"): out_file = arg elif opt in ("-f", "--fastaout"): fasta_only = 1 elif opt in ("-c"): cluster_file = arg with_cluster = True else: assert False, "unhandled option" if fasta_file == 0: print("option -i (--in) is mandatory") usage() sys.exit(2) else: today = time.localtime() date = str(today.tm_year) + str(today.tm_mon) + str(today.tm_mday) source = sys.argv[0] # First identifying what kind of fasta we have with the first line tig_type = 0 # 0 : no extension, 1 unitig, 2 contig (ie. unitig and contig length are output) nb_samples = 0 nb_fixed_fields = 0 #nb fields before C1_X|C2_Y|... depends if unitig and/or contig lengths have been output ## LOAD clusters read_id_to_cluster_id, cluster_id_to_cluster_size = store_clusters(cluster_file) with open(fasta_file, 'r') as filin: for line in filin: splitted_1 = line.split("|") #nb_samples: tig_type = len(re.findall("left_\w+_length",line)) nb_fixed_fields = 4 + 2*tig_type nb_samples = (len(splitted_1) - (nb_fixed_fields + 1))/3 if nb_samples % 1 != 0: print(f"Warning: could not detect the correct nb of samples : {nb_samples}") sys.exit(2) nb_samples = int(nb_samples) break sys.stdout.close = lambda: None #make stdout unclosable, to use with and handle both `with open(…)` and `sys.stdout` nicely. cf. https://stackoverflow.com/questions/17602878/how-to-handle-both-with-open-and-sys-stdout-nicely # Now going through all lines with open(fasta_file, 'r') as filin, (open(out_file,'w') if out_file else sys.stdout) as filout: if not fasta_only: # Write vcf comment lines filout.write(vcf_header(source,date,fasta_file,nb_samples)) nb_kept_variants = 0 nb_analyzed_variants = 0 line_count = 0 sequence_id=-1 fasta_4lines = "" ## Remembering 4 consecutive lines for kept variants to write in a fasta file if fasta_only mode keep_variant = False cluster_id=-1 cluster_size=0 for line in filin: if line_count%2 == 0: sequence_id+=1 # first sequence is 1, second (lower path of first variant) is 2, ... if line_count ==0: fasta_4lines="" #back to empty for incoming variant cluster_id,cluster_size = get_cluster_id_and_size(sequence_id, read_id_to_cluster_id, cluster_id_to_cluster_size) line_count += 1 fasta_4lines += line if line_count == 1: keep_variant = False nb_analyzed_variants += 1 # Header higher path line = line.strip() splitted_1 = line.split("|") #fasta_4lines = splitted_1[0] + "\n" #simplified headers for fasta_only and src ## FILTERING #filter cluster size if max_cluster_size >0 and cluster_id != ".": if cluster_size > max_cluster_size: continue #filter rank rank = float(splitted_1[-1].split("rank_")[1]) if rank < min_rank: continue # filter missing genotype ratio if max_miss !=1: nb_missing = len(re.findall(r"G\d+_\./\.",line)) missing_ratio = nb_missing / nb_samples if missing_ratio >= max_miss: continue keep_variant = True # for fasta_only mode nb_kept_variants += 1 if keep_variant and line_count == 3: #Header lower path line = line.strip() splitted_2 = line.split("|") #fasta_4lines += splitted_2[0] + "\n" #simplified headers for fasta_only and src if line_count == 4: line_count = 0 if keep_variant: if fasta_only: #fasta_4lines += line #simplified headers for fasta_only and src filout.write(fasta_4lines) # TODO: do we writte fasta variants if not in a cluster and a cluster file is provided? else: #now format in vcf format line = line.strip() filout.write(format_vcf(splitted_1, splitted_2, nb_samples, rank, line, cluster_id, cluster_size, tig_type)) #print(f"{nb_lost_variants} variant bubbles filtered out") #print(f"{nb_kept_variants} variant bubbles output out of {nb_tot_variants} ({nb_analyzed_variants} analyzed)") sys.stderr.write(f"{nb_kept_variants} variant bubbles output out of {nb_analyzed_variants}\n") if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/clustering_scripts/from_SRC_to_edges.py000066400000000000000000000007341420021152700251750ustar00rootroot00000000000000import sys if len(sys.argv)>1: file = open(sys.argv[1]) else: file=sys.stdin #IN= "9976:4242 9976 9604 " #OUT= # "9976 4242" # "9976 9604" def printLine(line): if line[0]=="#": print (line) return id_source=line.split(":")[0] ids_children=line.split(":")[1].split(" ") for id_child in ids_children: if id_child!=id_source: print (id_source,id_child) for line in file: printLine(line.strip().rstrip()) DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/000077500000000000000000000000001420021152700222545ustar00rootroot00000000000000DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/1SNP_per_cluster.py000077500000000000000000000120561420021152700257650ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ''' *********************************************** Script to select only one variant per locus (cluster) in a discoSnp vcf output file (.vcf) Author - Claire Lemaitre, Pierre Peterlongo, Inria Usage: python3 1SNP_per_cluster.py -i vcf_file [-o new_vcf_file] Details: The selected variant is not chosen at random, for a given cluster, it is the one with the less missing genotypes (if ties, it is the first read in the input file) *********************************************** ''' import sys import getopt def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]+" : selects one variant per cluster") print("-----------------------------------------------------------------------------") print("usage: "+sys.argv[0]+" -i vcf_file [-o output_file]") print(" -i: vcf file [mandatory]") print(" -o: output vcf file (default = stdout)") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:o:") except getopt.GetoptError as err: # print help information and exit: print(str(err)) usage() sys.exit(2) # Default parameters vcf_file = None out_file = None for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-i"): vcf_file = arg elif opt in ("-o", "--out"): out_file = arg else: assert False, "unhandled option" if vcf_file==None: print ("Error: option -i is mandatory") usage() sys.exit(2) format_ok = check_format(vcf_file) if not format_ok: print("Error: the format of the input vcf is not correct, it must contain clustering information") sys.exit(2) dict_, nb_SNP_before, nb_SNP_after = store_info(vcf_file) output_newvcf(vcf_file, out_file, dict_) def check_format(vcf_file): ''' Checks if the vcf has the correct format, ie : the INFO field must contain clustering information, such as: Ty=SNP;Rk=1;UL=1;UR=2;CL=.;CR=.;Genome=.;Sd=.;Cluster=79466;ClSize=12 ''' filin = open(vcf_file, 'r') checked = False while not checked: line = filin.readline() if line.startswith("#"): continue INFO_split = line.split("\t")[7].split(";") checked = True if len(INFO_split) < 10: return False tmp_cluster = INFO_split[8].split("Cluster=") if len(tmp_cluster) < 2: return False if tmp_cluster[1] == ".": return False try: cl_id = int(tmp_cluster[1]) except ValueError: return False return True filin.close() def store_info(vcf_file): dict_ = {} ## {num_cluster : [num_SNP ayant le moins de géno manquants, nb_missgeno]} filin = open(vcf_file, 'r') nb_SNP_tot = 0 while True: """#SNP_higher_path_14643 30 14643 C T . . Ty=SNP;Rk=0.55424;UL=0;UR=0;CL=0;CR=0;Genome=.;Sd=.;Cluster=1285;ClSize=4 GT:DP:PL:AD:HQ 0/1:38:554,48,75:7,31:71,71 0/1:20:63,23,263:15,5:71,71""" line = filin.readline() if not line: break if line.startswith("#"): continue nb_SNP_tot += 1 num_cluster = int(line.split("Cluster=")[1].split(";")[0]) if num_cluster == -1: continue id_SNP = line.split("\t")[2] if num_cluster not in dict_: dict_[num_cluster] = ["x", sys.maxsize] # ghost best variant for this new cluster genotypes = [i.split(":")[0] for i in line.split("\t")[9:]] nb_missing = 0 for ind in genotypes: if ind[0] == "." : nb_missing += 1 if nb_missing >= dict_[num_cluster][1]: continue dict_[num_cluster] = [id_SNP, nb_missing] filin.close() return dict_, nb_SNP_tot, len(dict_) def output_newvcf(vcf_file, out_file, dict_) : filin = open(vcf_file, 'r') if out_file: filout=open(out_file,'w') else: filout = sys.stdout while True: line = filin.readline() #SNP_higher_path_14643 30 14643 C T . . Ty=SNP;Rk=0.55424;UL=0;UR=0;CL=0;CR=0;Genome=.;Sd=.;Cluster=1285;ClSize=4 GT:DP:PL:AD:HQ 0/1:38:554,48,75:7,31:71,71 0/1:20:63,23,263:15,5:71,71 if not line: break if line.startswith("#"): filout.write(line) continue try: cluster = int(line.split("Cluster=")[1].split(";")[0]) except ValueError: print ("No cluster size information stored in the vcf, exit") sys.exit(1) if cluster == -1 : continue id_SNP = line.split("\t")[2] if id_SNP != dict_[cluster][0]: continue filout.write(line) filin.close() filout.close() if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/README.md000066400000000000000000000113631420021152700235370ustar00rootroot00000000000000# Directory containing some scripts to post-process and filter discoSnpRad results ## Filtering scripts 1. **script** `filter_by_cluster_size_and_rank.py`: * removes variants belonging to a cluster (locus) whose size (nb of variants) is outside the given size range (options `-m` and `-M`) * removes variants with rank lower than a given threshold given by option `-r` * Usage : `python filter_by_cluster_size_and_rank.py -i vcf_file [-o new_vcf_file -m 0 -M 150 -r 0.4]` 3. **script** `filter_vcf_by_indiv_cov_max_missing_and_maf.py`: * replaces individual genotypes that have DP less than the value given by option `-c` by missing genotype `./.` * removes variants (vcf lines) that have a fraction of missing genotypes greater than the value given by option `-m` * removes variants (vcf lines) that have a minor allele frequency smaller than the value given by option `-f` * outputs only SNP variants if option `-s`. * Usage : `python filter_vcf_by_indiv_cov_max_missing_and_maf.py -i vcf_file -o new_vcf_file [-c min_cov -m max_missing -f maf -s] ` 3. **script** `filter_paralogs.py`: * identifies variants (vcf lines) that have a fraction of heterozygous genotypes greater than `x` (not counting missing genotypes) * removes variants (vcf lines) that belong to a cluster having a fraction of such variants greater than `y` * Example : `x=0.1` and `y= 0.5` and if we consider a cluster to represent a locus. This filter removes loci that have more than 50% of the SNPs that have each more than 10% of heterozygous genotypes. * Usage : `python filter_paralogs.py -i vcf_file -o new_vcf_file [-x 0.1 -y 0.5]` ## Scripts for STRUCTURE analyses : 4. **script** `1SNP_per_cluster.py` * selects one SNP per cluster (the one with less missing genotypes) * Usage : `python 1SNP_per_cluster.py -i vcf_file -o new_vcf_file` 5. **script** `vcf2structure.sh` * changes the vcf format to a Structure format (input of the software Structure) * Usage: `sh vcf2structure.sh file.vcf` (creates a file `file.str`) ## Mapping to a reference genome, and keeping the cluster information : When a reference genome is available, even if variants have been called in a reference-free manner, it could be useful to get the positions of variants on this reference genome. To get such information, two programs are necessary in the case of a discoSnpRAD result: * `VCF_creator` (in dir `[DISCO_DIR]/scripts/`). Note : it uses the mapper bwa, which must to be in the PATH env variable. * **script** `add_cluster_info_to_mapped_vcf.py` in this current directory, to append the clustering information (and some minimal filtering on cluster size) in the vcf output by VCF_creator. Here is the full pipeline to map the result of discoSnpRAD with name prefix `myDiscoSnpRADResult` to a reference genome `myReferenceGenome.fa`: ``` # Running VCF_creator with a given reference genome () sh [DISCO_DIR]/scripts/run_VCF_creator.sh -G dm6_masked.fa -p myDiscoSnpRADResult_raw_filtered.fa -e -o temp.vcf # Adding clustering information (and minimal filtering on cluster size) python add_cluster_info_to_mapped_vcf.py -m temp.vcf -u myDiscoSnpRADResult_clustered.vcf -o myDiscoSnpRADResult_mapped.vcf # final vcf is myDiscoSnpRADResult_mapped.vcf ``` Additionnally, in a validation context, if one wants to compare variant positions between two such vcf files, the following command will output recall and precision metrics: ``` python [DISCO_DIR]/scripts/validation_scripts/compare_vcf_disco_pos_allele_only.py truth.vcf myDiscoSnpRADResult_mapped.vcf ``` DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/add_cluster_info_to_mapped_vcf.py000066400000000000000000000064301420021152700310230ustar00rootroot00000000000000 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import getopt def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]," : merge 2 vcf files, add cluster info present in the unmmaped vcf in the mapped vcf (ie. with mapping info on a ref genome)") print("-----------------------------------------------------------------------------") print("usage: ",sys.argv[0]) print(" -u unmapped vcf file [mandatory]") print(" -m mapped vcf file [mandatory]") print(" -o: output vcf file path (default = stdout)") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def output_newvcf(unmapped_file, mapped_file, out_file): filin = open(unmapped_file, 'r') ## store cluster_info for each variant (identified by its unique id, 3rd column of the vcf line) id_to_cluster_info={} for line in filin.readlines(): line=line.strip() if line[0]=="#": continue #SNP_higher_path_3 199 3 C G . . Ty=SNP;Rk=1.0;UL=86;UR=261;CL=169;CR=764;Genome=.;Sd=.;Cluster=0;ClSize=3 ... splitted = line.split("\t") cluster_info = ";".join(splitted[7].split(";")[8:10]) id = splitted[2] id_to_cluster_info[id] = cluster_info #print(f"{id}-{cluster_info};") filin.close() ## Print vcf if out_file: filout=open(out_file,'w') else: filout = sys.stdout filin = open(mapped_file,"r") for line in filin.readlines(): if line[0]=="#": filout.write (line) else: ##chr3R 26778135 3 C G . PASS Ty=SNP;Rk=1.0;UL=86;UR=261;CL=169;CR=764;Genome=.;Sd=1 ... splitted = line.split("\t") id = splitted[2] if id not in id_to_cluster_info: # if no cluster info, we do not print the variant at all because we assume that if absent means that it has been filtered out for a good reason (typically : too large cluster) continue cluster_info = id_to_cluster_info[id] INFO = splitted[7] + ";" + cluster_info tojoin = splitted[:7] + [INFO] + splitted[8:] filout.write ("\t".join(tojoin)) filin.close() filout.close() def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hu:m:o:") except getopt.GetoptError as err: # print help information and exit: usage() sys.exit(2) # Default parameters unmapped_file = None mapped_file = None out_file = None for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-u"): unmapped_file = arg elif opt in ("-m"): mapped_file = arg elif opt in ("-o", "--out"): out_file = arg else: assert False, "unhandled option" if mapped_file==None: print ("-m missing") usage() sys.exit(2) if unmapped_file==None: print ("-u missing") usage() sys.exit(2) output_newvcf(unmapped_file, mapped_file, out_file) if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/filter_by_cluster_size_and_rank.py000077500000000000000000000114451420021152700312450ustar00rootroot00000000000000 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' *********************************************** Script to filter out variants in a discoSnp vcf output file (.vcf), according to cluster size and/or rank value Author - Claire Lemaitre, Pierre Peterlongo, Inria Usage: python3 filter_by_cluster_size_and_rank.py -i vcf_file [-o output_file -m 0 -M 150 -r 0.4] Details: filter a vcf file by keeping only variants such that : - the cluster (locus) they belong to contains x variants with x in [m,M] - with a rank value >= r outputs a vcf *********************************************** ''' import sys import getopt def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]+" : filter vcf variants based on their cluster size and/or rank value") print("-----------------------------------------------------------------------------") print("usage: "+sys.argv[0]+" -i vcf_file [-o output_file -m 0 -M 150 -r 0.4]") print(" -i: input vcf file [mandatory]") print(" -m: min cluster size (included)") print(" -M: max cluster size (included)") print(" -r; min rank (included)") print(" -o: output vcf file (default = stdout)") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def output_newvcf(in_file, out_file, min_cluster_size, max_cluster_size, rank_min): filin = open(in_file, 'r') if out_file: filout=open(out_file,'w') else: filout = sys.stdout for line in filin.readlines(): line=line.strip() if line[0]=='#': filout.write(line+"\n") continue #SNP_higher_path_3 199 3 C G . . Ty=SNP;Rk=1.0;UL=86;UR=261;CL=169;CR=764;Genome=.;Sd=.;Cluster=0;ClSize=3 ... if min_cluster_size>0 or max_cluster_size max_cluster_size: continue # does not respect the cluster size filtering criteria if rank_min > 0: # make the split only if necessary rank = float(line.split()[7].split(';')[1].split('=')[-1]) if rank < rank_min: continue # does not respect the rank min filtering criteria filout.write(line+"\n") # all filters passed filin.close() filout.close() def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:m:M:o:r:") except getopt.GetoptError as err: # print help information and exit: print(str(err)) usage() sys.exit(2) # Default parameters min_cluster_size = 0 max_cluster_size = sys.maxsize min_rank=0 in_file = None out_file = None for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-i"): in_file = arg elif opt in ("-m"): min_cluster_size = float(arg) elif opt in ("-M"): max_cluster_size = float(arg) elif opt in ("-r"): min_rank = float(arg) elif opt in ("-o", "--out"): out_file = arg else: assert False, "unhandled option" if in_file==None: print("Error: option -i is mandatory") usage() sys.exit(2) format_ok = check_format(in_file) if not format_ok: print("Error: the format of the input vcf is not correct, it must contain clustering information") sys.exit(2) output_newvcf(in_file, out_file, min_cluster_size, max_cluster_size, min_rank) def check_format(vcf_file): ''' Checks if the vcf has the correct format, ie : the INFO field must contain clustering information, such as: Ty=SNP;Rk=1;UL=1;UR=2;CL=.;CR=.;Genome=.;Sd=.;Cluster=79466;ClSize=12 ''' filin = open(vcf_file, 'r') checked = False while not checked: line = filin.readline() if line.startswith("#"): continue INFO_split = line.split("\t")[7].split(";") checked = True if len(INFO_split) < 10: return False tmp_cluster = INFO_split[8].split("Cluster=") if len(tmp_cluster) < 2: return False if tmp_cluster[1] == ".": return False try: cl_id = int(tmp_cluster[1]) except ValueError: return False return True filin.close() if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/filter_paralogs.py000077500000000000000000000146431420021152700260160ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ''' *********************************************** Script to filter out variants in a discoSnp vcf output file (.vcf), according to the fraction of heterozygous genotypes per locus Author - Claire Lemaitre, Pierre Peterlongo, Inria Usage: python3 filter_paralogs.py -i vcf_file -o new_vcf_file [-x 0.1 -y 0.5] Details: variants with a proportion (not considering missing genotypes) of heterozygous genotypes greater than x are considered as "bad" variants all variants (vcf lines) belonging to clusters (loci) with a proportion of "bad" variants greater than y are filtered out *********************************************** ''' import sys import getopt def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]+" : discoSnp output filtering according to the fraction of heterozygous genotypes per locus") print("-----------------------------------------------------------------------------") print("usage: "+sys.argv[0]+" -i vcf_file -o new_vcf_file [-x 0.1 -y 0.5]") print(" -i: input vcf file [mandatory]") print(" -o: output vcf file [mandatory]") print(" -x: max fraction of heterozygous genotypes per variant (default = 0.1)") print(" -y: max fraction of bad variants per locus (default = 0.5)") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:x:y:o:", ["help", "in=", "x=", "y=", "out="]) except getopt.GetoptError as err: # print help information and exit: print(str(err)) # will print something like "option -a not recognized" usage() sys.exit(2) # Default parameters vcf_file = 0 x = 0.1 y = 0.5 k = 31 out_file = 0 for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-i", "--in"): vcf_file = arg elif opt in ("-x", "--x"): x = float(arg) elif opt in ("-y", "--y"): y = float(arg) elif opt in ("-o", "--out"): out_file = arg else: assert False, "unhandled option" if vcf_file == 0 or out_file == 0: print("Error: options -i and -o are mandatory") usage() sys.exit(2) else: format_ok = check_format(vcf_file) if not format_ok: print("Error: the format of the input vcf is not correct, it must contain clustering information") sys.exit(2) dict, nb_cluster_tot = store_info(vcf_file, x) clusters_to_keep, nb_clusters_kept = discard_clusters(dict, y) output_newvcf(vcf_file, out_file, clusters_to_keep) print(str(nb_clusters_kept) + " on " + str(nb_cluster_tot) + " clusters had less than " + str(y*100) + "% of SNP with less than " + str(x*100) + "% heterygous genotypes") def check_format(vcf_file): ''' Checks if the vcf has the correct format, ie : the INFO field must contain clustering information, such as: Ty=SNP;Rk=1;UL=1;UR=2;CL=.;CR=.;Genome=.;Sd=.;Cluster=79466;ClSize=12 ''' filin = open(vcf_file, 'r') checked = False while not checked: line = filin.readline() if line.startswith("#"): continue INFO_split = line.split("\t")[7].split(";") checked = True if len(INFO_split) < 10: return False tmp_cluster = INFO_split[-2].split("Cluster=") if len(tmp_cluster) < 2: return False if tmp_cluster[1] == ".": return False cl_id = int(tmp_cluster[1]) return True filin.close() def store_info(vcf_file, x): dict = {} ## {num_cluster : [nb SNP avec 0/1 > x%, nb SNP total]} filin = open(vcf_file, 'r') while True: """SNP_higher_path_9999 31 9999_1 A G . . Ty=SNP;Rk=1;UL=1;UR=2;CL=.;CR=.;Genome=.;Sd=.;Cluster=79466;ClSize=12 GT:DP:PL:AD:HQ 1/1:7:144,25,5:0,7:0,72 1/1:14:284,46,5:0,14 :0,71 1/1:8:164,28,5:0,8:0,73 1/1:59:1184,182,7:0,59:0,70 1/1:144:2884,438,11:0,144:0,72 1/1:30:604,95,6:0,30:0,70 1/1:37:744,116,6:0,37:0,72 ./.:1:.,.,.:0,1:0,71 1/1:31:624,98,6:0,31 :0,69 1/1:10:204,34,5:0,10:0,72 1/1:45:904,140,6:0,45:0,72 1/1:31:624,98,6:0,31:0,73 1/1:11:224,37,5:0,11:0,66 1/1:133:2664,405,10:0,133:0,72 1/1:26:524,83,5:0,26:0,68 1/1: 43:864,134,6:0,43:0,72 1/1:27:544,86,5:0,27:0,72 1/1:6:124,22,5:0,6:0,70 1/1:32:644,101,6:0,32:0,73 1/1:55:1104,170,7:0,55:0,71 1/1:20:404,64,5:0,20:0,73 ./.:0:.,.,.:0,0:0,0 ./.: 0:.,.,.:0,0:0,0 1/1:8:164,28,5:0,8:0,69 1/1:58:1164,179,7:0,58:0,72 1/1:49:984,152,6:0,49:0,72 1/1:3:64,13,4:0,3:0,69 1/1:78:1564,239,8:0,78:0,72 1/1:37:744,116,6:0,37:0,70 1/1:32:644,1 01,6:0,32:""" line = filin.readline() if not line: break if line.startswith("#"): continue num_cluster = int(line.split("\t")[7].split(";")[-2].split("Cluster=")[1]) if num_cluster not in dict : dict[num_cluster] = [0,0] dict[num_cluster][1] += 1 genotypes = [i.split(":")[0] for i in line.split("\t")[9:]] nb_het = 0 nb_geno = 0 for ind in genotypes: #print(ind) if ind[0] == "." : continue ##si géno absent if ind[0] == "1" or ind[2] == "0" : ##si homo muté ou ref nb_geno += 1 continue nb_het += 1 ##si hétérozygote nb_geno += 1 if float(nb_het)/float(nb_geno) < x: continue dict[num_cluster][0] += 1 filin.close() return dict, len(dict) def discard_clusters(dict, y): clusters_to_keep = [] for i in dict: if float(dict[i][0])/float(dict[i][1]) >= y : continue clusters_to_keep.append(i) return clusters_to_keep, len(clusters_to_keep) def output_newvcf(vcf_file, out_file, clusters_to_keep) : filin = open(vcf_file, 'r') new_vcf = open(out_file, 'w') while True: line = filin.readline() if not line: break if line.startswith("#"): new_vcf.write(line) continue cluster = int(line.split("\t")[7].split(";")[-2].split("Cluster=")[1]) if cluster not in clusters_to_keep: continue new_vcf.write(line) filin.close() new_vcf.close() if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/filter_vcf_by_indiv_cov_max_missing_and_maf.py000066400000000000000000000155741420021152700335620ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ''' *********************************************** Script to filter out variants in a discoSnp vcf output file (.vcf), according to various features Author - Claire Lemaitre, Pierre Peterlongo, Inria Usage: python3 filter_vcf_by_indiv_cov_max_missing_and_maf.py -i vcf_file -o new_vcf_file [-x 0.1 -y 0.5] Details: filter a vcf file by keeping only variants such that : - each individual genotype with DP < min_cov is replaced by a missing genotype - the proportion of missing genotype is < max_missing - the minor allele freq is >= min_maf outputs a vcf Note : NA are indicated as "./." genotypes. *********************************************** ''' # Last modified : Oct. 2019 import sys import getopt def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]+" : vcf filter") print("-----------------------------------------------------------------------------") print("usage: "+sys.argv[0]," -i vcf_file -o output_file [-c min_cov -m max_missing -f min_maf -s]") print(" -i: input vcf file [mandatory]") print(" -o: output vcf file [mandatory]") print(" -m: max missing genotype proportion to keep a variant (between 0 and 1, def = 1)") print(" -c: min coverage to call a genotype (int, def=0)") print(" -f: min minor allele frequency (maf) (between 0 and 1, def=0)") print(" -s: snp only (def= all variants)") print("-----------------------------------------------------------------------------") sys.exit(2) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "i:o:c:m:f:s", ["in=", "out=","cov=","miss=", "freq=","snp-only"]) except getopt.GetoptError as err: # print help information and exit: print(str(err)) # will print something like "option -a not recognized" usage() sys.exit(2) # Default parameters output_file = 0 input_file = 0 min_cov = 0 max_missing_prop = 1 snp_only = 0 min_maf = 0 for opt, arg in opts: if opt in ("-i", "--in"): input_file = arg elif opt in ("-o", "--out"): output_file = arg elif opt in ("-c", "--cov"): min_cov = int(arg) elif opt in ("-m", "--miss"): max_missing_prop = float(arg) elif opt in ("-f", "--freq"): min_maf = float(arg) elif opt in ("-s", "--snp-only"): snp_only=1 else: assert False, "unhandled option" if input_file == 0 or output_file == 0: print("Error: options -i and -o are mandatory") usage() sys.exit(2) else: filin = open(input_file, 'r') filout = open(output_file, 'w') n_geno = 0 max_missing = 0 # integer var_count = 0 var_written = 0 na_count = 0 new_na_count = 0 selected_na_count = 0 while True: #random_genome 49694 9997 G T . MULTIPLE Ty=SNP;Rk=1;UL=83;UR=4;CL=83;CR=4;Genome=G;Sd=1 GT:DP:PL:AD:HQ line = filin.readline() if not line: break if line.startswith("#"): filout.write(line) if line.startswith("#CHROM"): # Used to record the total number of samples n_geno=len(line.split("\t")) - 9 max_missing = int(max_missing_prop*n_geno) # int -> floor(), ensures proportion of non na is greater or equal to 1-max_missing_prop (when using miss <= max_missing) continue var_count += 1 # Filtering on the type of variant (SNP and INDELs or SNPs only) # WARNING : designed for discoSNP only, should remain compatible with Stacks (no error, but will not filter out INDEL) thistype = line.split("\t")[7].split(";")[0].split("=")[1].strip() #print(thistype) if snp_only and thistype == "INDEL": continue splitted = line.split("\t") start_geno = 9 line_towrite = "\t".join(splitted[:start_geno]) missing_count = 0 ref_count = 0 alt_count = 0 for geno in splitted[start_geno:]: geno_info = geno.split(":") genotype = geno_info[0] if genotype == "./." or genotype == ".|.": missing_count += 1 na_count += 1 else: DP = int(geno_info[1]) if DP < min_cov: genotype = "./." missing_count += 1 new_na_count += 1 else: #count ref and alt alleles allele1 = genotype[0] allele2 = genotype[2] if allele1 == "0": ref_count += 1 else: alt_count += 1 if allele2 == "0": ref_count += 1 else: alt_count += 1 #rewrite geno info geno_new = genotype+":"+":".join(geno_info[1:]) line_towrite += "\t"+geno_new maf = 0 # Should we also remove variants that are no longer variable if min_maf = 0, ie alt_count == 0 and ref_count ==0 ?? if ref_count+alt_count>0: maf = (float) (min(ref_count,alt_count))/(ref_count+alt_count) ## Filter on missing count and maf if missing_count <= max_missing and maf >= min_maf: filout.write(line_towrite) var_written += 1 selected_na_count += missing_count filin.close() filout.close() print("# "+sys.argv[0]) print("# input_file : "+input_file) print("# output_file : "+output_file) print("# filter parameters : indiv_DP>="+str(min_cov)+", missing<="+str(max_missing)+" (prop*n_geno = "+str(max_missing_prop)+" * "+str(n_geno)+"), snp-only="+str(snp_only)) print("# "+str(var_count)+" seen variants, "+str(var_written)+" variants after filtering") print("# initial missing count (on snps only if snp-only=1) = "+str(na_count)+", genotypes changed to NA = "+str(new_na_count)+", final missing count in new vcf = "+str(selected_na_count)) print("# initial missing percent (on snps only if snp-only=1) = {0:.2f} %, final missing percent in new vcf = {1:.2f} %".format(100*float(na_count)/float(var_count*n_geno),100*float(selected_na_count)/float(var_written*n_geno))) if __name__ == "__main__": main() DiscoSnp-2.6.2/discoSnpRAD/post-processing_scripts/vcf2structure.sh000066400000000000000000000010141420021152700254250ustar00rootroot00000000000000#! /bin/bash out_name=`echo $1 | sed -e 's/.vcf//g'` #extract genotypes grep -v "#" $1 | sed -e 's/\t\.:/\t\.\/\.:/g' | cut -f 10- | sed -e 's/[:][[:graph:]]*//g' | sed -e 's/\//\t/g' -e 's/|/\t/g' -e 's/\./-9/g' > $1_matrix #transpose matrix awk ' { for (i=1; i<=NF; i++) { a[NR,i] = $i } } NF>p { p = NF } END { for(j=1; j<=p; j++) { str=a[1,j] for(i=2; i<=NR; i++){ str=str"\t"a[i,j]; } print str } }' $1_matrix > $out_name.str rm $1_matrix DiscoSnp-2.6.2/discoSnpRAD/run_discoSnpRad.sh000077500000000000000000000705361420021152700210150ustar00rootroot00000000000000#!/bin/bash #***************************************************************************** # discoSnpRad: discovering polymorphism from raw unassembled RADSEQ NGS reads # A tool from the GATB (Genome Assembly Tool Box) # Copyright (C) 2017 INRIA # Authors: J. Gauthier, C. Mouden, C. Lemaitre, P. Peterlongo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #***************************************************************************** # cmd="$EDIR/run_discoSnpRad.sh "$@" -x -t -e -c 3 -b 1" # echo "I run discoSnpRad with following command line: " ${cmd} # ${cmd} red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` cyan=`tput setaf 6` bold=`tput bold` reset=`tput sgr0` die() { printf '%s\n' "$1" >&2 exit 1 } function myrealpath { echo $(cd $(dirname $1); pwd)/$(basename $1); } option_cores_gatb="" option_cores_post_analysis="" Ttot="$(date +%s)" #### constant ##### max_C=2147483647 #$((2**31-1)) ########################################################### #################### DEFAULT VALUES ####################### ########################################################### version="2.3.X" read_sets="" # A file of file(s) prefix="discoRad" # all intermediate and final files will be written will start with this prefix k=31 # size of kmers b=2 # all bubbles accepted" c=3 # minimal coverage C=$max_C # maximal coverage M=4 d=10 # estimated number of error per read (used by kissreads only) D=0 # maximal size of searched deletions max_ambigous_indel=20 P=5 # number of polymorphsim per bubble option_max_symmetrical_crossroads="5" l="-l" extend="-T" x="-x" e="-e" output_coverage_option="" genotyping="-genotype" verbose=1 clustering="false" short_read_connector_path="" option_phase_variants="" graph_reused="Egg62hdS7knSFvF3" # with -g option, we use a previously created graph. max_size_cluster=150 max_missing=0.95 min_rank=0.4 #EDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) EDIR=$( python -c "import os.path; print(os.path.dirname(os.path.realpath(\"${BASH_SOURCE[0]}\")))" ) # as suggested by Philippe Bordron if [ -d "$EDIR/../build/" ] ; then # VERSION SOURCE COMPILED read_file_names_bin=$EDIR/../build/bin/read_file_names dbgh5_bin=$EDIR/../build/ext/gatb-core/bin/dbgh5 kissnp2_bin=$EDIR/../build/bin/kissnp2 kissreads2_bin=$EDIR/../build/bin/kissreads2 else # VERSION BINARY read_file_names_bin=$EDIR/../bin/read_file_names dbgh5_bin=$EDIR/../bin/dbgh5 kissnp2_bin=$EDIR/../bin/kissnp2 kissreads2_bin=$EDIR/../bin/kissreads2 fi chmod u+x $EDIR/../scripts/*.sh $EDIR/scripts/*.sh $EDIR/run_discoSnpRad.sh 2>/dev/null # Usefull for binary distributions wraith="false" max_truncated_path_length_difference=0 option_phase_variants="" ####################################################################### #################### END HEADER ####################### ####################################################################### function help { echo $reset echo " ************" echo " *** HELP ***" echo " ************" echo "run_discoSnpRad.sh, pipelining kissnp2 and kissreads and clustering per locus for calling SNPs and small indels from RAD-seq data without the need of a reference genome" echo "Version: "$version echo "Cookbook: You may find a Cookbook here https://github.com/GATB/DiscoSnp/blob/master/discoSnpRAD/COOKBOOK.md providing classical use cases." echo "Usage: ./run_discoSnpRad.sh --fof read_file_of_files --src [src_path] [OPTIONS]" echo "MANDATORY" echo " -r|--fof " echo " The input read files indicated in a file of file(s)" echo " Example: -r bank.fof with bank.fof containing the two lines" echo " data_sample/reads_sequence1.fasta" echo " data_sample/reads_sequence2.fasta.gz" echo " Note: DiscoSnp-RAD uses files demultiplexed to samples. Each sample corresponds to exactly one line in the input file of files." echo "" echo "PARAMETERS" echo " -k | --k_size value " echo " Set the length of used kmers. Must fit the compiled value." echo " Default=31" echo " -c | --min_coverage value " echo " Set the minimal coverage per read set: Used by kissnp2 (don't use kmers with lower coverage) and kissreads (read coherency threshold)." echo " This coverage can be automatically detected per read set (in this case use \"auto\" or specified per read set, see the documentation.)" echo " Default=3" echo " --high_precision | -R" echo " lower recall / higher precision mode. With this parameter no symmetrical crossroads may be traversed during bubble detection (by default up to 5 symmetrical crossroads may be traversed during bubble detection)." echo "" echo "OPTIONS" echo " -g | --graph " echo " Reuse a previously created graph (.h5 file)" echo " -p | --prefix " echo " All out files will start with this prefix. Default=\"discoRes\"" echo " -C | --max_coverage " echo " Set the maximal coverage for each read set: Used by kissnp2 (don't use kmers with higher coverage)." echo " Default=2^31-1" echo " -l | --no_low_complexity" echo " Remove low complexity bubbles" echo " -D | --deletion_max_size " echo " discoSnpRad will search for deletions of size from 0 to D included. Default=0 (no deletion)" echo "" echo "CLUSTERING OPTION" echo " -S|--src [src_path]" echo " performs clustering of variants with short_read_connector" echo " src_path: **absolute** path to short_read_connector directory, containing the \"short_read_connector.sh\" file. " echo " -Note1: short read connector must be compiled." echo " -Note2: if no value is given, it assumes short_read_connector.sh is in the PATH env variable." echo " -Note3: with this option, discoSnpRad outputs a vcf file containing the variants clustered by locus" echo " --max_size_cluster " echo " Discards cluster containing more than this number of variants. (Default 150)" echo " Requires the -S or --src option" echo "" echo "FILTERING OPTION" echo " --max_missing " echo " Remove variants with more than max_missing % missing values. (Default 0.95, removes variants detected in 5% and less populations)" echo " --min_rank " echo " Remove variants whose rank is smaller than this threshold. (Default 0.4)" # echo " -L | --max_diff_len " # Hidden - # echo " Longest accepted difference length between two paths of a truncated bubble" # echo " default 0" # echo " -a | --ambiguity_max_size " # Hidden # echo " Maximal size of ambiguity of INDELs. INDELS whose ambiguity is higher than this value are not output [default '20']" echo "" echo "ADVANCED OPTIONS" echo " -P | --max_snp_per_bubble " echo " discoSnpRad will search up to P SNPs in a unique bubble. Default=5" echo " -d | --max_substitutions " echo " Set the number of authorized substitutions used while mapping reads on found SNPs (kissreads). Default=10" echo "" echo "MISC." echo " -u | --max_threads " echo " Max number of used threads. 0 means all threads" echo " default 0" echo " -w Wraith mode: only show all discoSnpRad commands without running them" echo " -v <0 or 1>" echo " Verbose 0 (avoids progress output) or 1 (enables progress output) -- default=1." echo " -h | --help" echo " Prints this message and exist" echo "" echo "Any further question: read the readme file or contact us via the Biostar forum: https://www.biostars.org/t/discosnp/" } ####################################################################### #################### GET OPTIONS ####################### ####################################################################### echo "${yellow}" while :; do case $1 in --max_missing) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option max_missing=$2 shift 1 else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; --min_rank) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option min_rank=$2 shift 1 echo "min_rank" ${min_rank} else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; --max_size_cluster) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option max_size_cluster=$2 shift 1 else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -A) option_phase_variants="-phasing" extend="-t" echo "Will phase variants during kissreads process - WARNING this option is too experimental and thus not described in the help message" echo "You can obtain clusters using script : \"script/from_phased_alleles_to_clusters.sh file_name_of_phased_alleles\" (the filename(s) is/are given during kissreads process" ;; -w) wraith="true" ;; -S|--src) clustering="true" if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option short_read_connector_path=$2 shift fi ;; -a|--ambiguity_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option max_ambigous_indel=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -v) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then verbose=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -R|--high_precision) option_max_symmetrical_crossroads=0 ;; -L | --max_diff_len) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then max_truncated_path_length_difference=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -g|--graph) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then graph_reused=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -l|--no_low_complexity) l="" ;; -h|-\?|--help) help exit ;; -r|--fof) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then read_sets=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -p|--prefix) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then prefix=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -k | --k_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then k=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -P|--max_snp_per_bubble) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then P=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -c|--min_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then c=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -C|--max_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then C=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -d|--max_substitutions) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then d=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -D|--deletion_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then D=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -x) x="-x" ##CHARLOTTE ;; -y) y="-x" ##CHARLOTTE ;; -G|--reference_genome) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then genome=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -e) e="-e" ;; -u|--max_threads) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then option_cores_gatb="-nb-cores $2" option_cores_post_analysis="-t $2" shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -?*) printf 'WARN: Unknown option (exit): %s\n' "$1" >&2 exit 1 ;; :) echo "Option $1 requires an argument." >&2 exit 1 ;; --) # End of all options. shift break ;; -?*) printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 ;; *) # Default case: No more options, so break out of the loop. break esac shift done echo $reset ####################################################################### #################### END GET OPTIONS ####################### ####################################################################### if [ -z "$read_sets" ]; then echo "${red} **************************************************************************" echo " ** ERROR: You must provide at least one read set (-r) " echo " **************************************************************************" echo $reset exit 1 fi #Checks if clustering can be performed if [[ "$clustering" == "true" ]]; then # first tests the directory given by user if any if [ -n "$short_read_connector_path" ]; then src_file="$short_read_connector_path/short_read_connector_linker.sh" if [ -f "$src_file" ]; then echo "${yellow}short_read_connector path is $src_file$reset" else echo "${red} **************************************************************************" echo " ** WARNING: I cannot find short_read_connector (-S). " echo " ** $src_file does not exist" echo " ** I will not cluster variants per RAD locus" echo " **************************************************************************" echo $reset clustering="false" fi else #then tests if src is in the PATH env variable src_file=$(command -v short_read_connector_linker.sh) if [ -n "$src_file" ]; then echo "${yellow}short_read_connector_linker path is $src_file$reset" else echo "${red} **************************************************************************" echo " ** WARNING: I cannot find short_read_connector in PATH. " echo " ** Try giving the absolute path of short_read_connector directory with option -S" echo " ** I will not cluster variants per RAD locus" echo " **************************************************************************" echo $reset clustering="false" fi fi fi ######### CHECK THE k PARITY ########## rest=$(( $k % 2 )) if [ $rest -eq 0 ] then echo "${red}# k=$k is even number, to avoid palindromes, we set it to $(($k-1))${reset}" k=$(($k-1)) fi ####################################### c_filename=`echo ${c} | tr ',' '_'` if [ $C -ne $max_C ] then h5prefix=${prefix}_k_${k}_c_${c_filename}_C_${C} else h5prefix=${prefix}_k_${k}_c_${c_filename} fi kissprefix=${h5prefix}_D_${D}_P_${P}_m_${option_max_symmetrical_crossroads} readsFilesDump=${prefix}_read_files_correspondance.txt ####################################### c_dbgh5=$c rm -f ${read_sets}_${kissprefix}_removemeplease cmdFofRemove="cat ${read_sets}" > ${read_sets}_${kissprefix}_removemeplease echo $green$cmdFofRemove "> ${read_sets}_${kissprefix}_removemeplease$cyan" if [[ "$wraith" == "false" ]]; then $cmdFofRemove > ${read_sets}_${kissprefix}_removemeplease fi ####################################################################### #################### OPTIONS SUMMARY ####################### ####################################################################### if [[ "$wraith" == "false" ]]; then echo "${yellow} Running discoSnpRad "$version", in directory "$EDIR" with following parameters:" echo " read_sets="$read_sets echo " short_read_connector_linker path="$short_read_connector_path echo " prefix="$h5prefix if [ -f ${graph_reused} ]; then echo " reuse graph="${graph_reused} fi echo " c="$c echo " C="$C echo " k="$k echo " b="$b echo " d="$d echo " D="$D echo " max_truncated_path_length_difference="$max_truncated_path_length_difference echo -n " starting date=" date echo $reset echo fi ####################################################################### #################### END OPTIONS SUMMARY ####################### ####################################################################### ############################################################# #################### DUMP READ FILES ####################### ############################################################# dumpCmd="${read_file_names_bin} -in $read_sets" echo $green${dumpCmd} "> $readsFilesDump"$cyan if [[ "$wraith" == "false" ]]; then ${dumpCmd} > $readsFilesDump fi if [ $? -ne 0 ] then echo "${red}there was a problem with readFileName Dumping$reset" exit 1 fi ############################################################ #################### GRAPH CREATION ####################### ############################################################ if [ ! -f ${graph_reused} ]; then # no graph was given or the given graph was not a file. T="$(date +%s)" echo "${yellow} ############################################################" echo " #################### GRAPH CREATION #######################" echo " ############################################################${reset}" graphCmd="${dbgh5_bin} -in ${read_sets}_${kissprefix}_removemeplease -out $h5prefix -kmer-size $k -abundance-min ${c_dbgh5} -abundance-max $C -solidity-kind one ${option_cores_gatb} -verbose $verbose -skip-bcalm -skip-bglue -no-mphf" echo $green${graphCmd}$cyan if [[ "$wraith" == "false" ]]; then ${graphCmd} fi if [ $? -ne 0 ] then echo "${red}there was a problem with graph construction${reset}" exit 1 fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}Graph creation time in seconds: ${T}${reset}" fi graph_reused=$h5prefix.h5 else if [[ "$wraith" == "false" ]]; then echo "${yellow}File ${graph_reused} exists. We use it as input graph${reset}" fi fi cleanCmd="rm -rf trashme_*" echo $green${cleanCmd}$cyan if [[ "$wraith" == "false" ]]; then ${cleanCmd} fi ###################################################### #################### KISSNP2 ####################### ###################################################### T="$(date +%s)" echo "${yellow} ############################################################" echo " #################### KISSNP2 MODULE #######################" echo " ############################################################${reset}" kissnp2Cmd="${kissnp2_bin} -in ${graph_reused} -out ${kissprefix}_r -b $b $l $x -P $P -D $D $extend $option_cores_gatb $output_coverage_option -coverage_file ${h5prefix}_cov.h5 -max_ambigous_indel ${max_ambigous_indel} -max_symmetrical_crossroads ${option_max_symmetrical_crossroads} -verbose $verbose -max_truncated_path_length_difference ${max_truncated_path_length_difference}" echo $green${kissnp2Cmd}$cyan if [[ "$wraith" == "false" ]]; then ${kissnp2Cmd} fi if [ $? -ne 0 ] then echo "${red}there was a problem with kissnp2${reset}" exit 1 fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}Bubble detection time in seconds: ${T}${reset}" fi if [ ! -f ${kissprefix}_r.fa ] then if [[ "$wraith" == "false" ]]; then echo "${red}No polymorphism predicted by discoSnpRad" echo -n " ending date=" date echo "${yellow} Thanks for using discoSnpRad - http://colibread.inria.fr/discoSnp/${reset}" exit fi fi ####################################################################### #################### REDUNDANCY REMOVAL ####################### ####################################################################### echo "${yellow} ############################################################" echo " #################### REDUNDANCY REMOVAL ###################" echo " ############################################################$reset" redundancy_removal_cmd="python $EDIR/../scripts/redundancy_removal_discosnp.py ${kissprefix}_r.fa $k $kissprefix.fa" echo $green${redundancy_removal_cmd}$cyan if [[ "$wraith" == "false" ]]; then eval ${redundancy_removal_cmd} fi if [ $? -ne 0 ] then echo "${red}there was a problem with redundancy removal$reset": exit 1 fi ####################################################################### #################### KISSREADS ####################### ####################################################################### T="$(date +%s)" echo "${yellow} #############################################################" echo " #################### KISSREADS MODULE #######################" echo " #############################################################$reset" smallk=$k if (( $smallk>31 )) ; then smallk=31 fi i=5 #avoid modidy this (or increase this if memory needed by kissread is too high. Min 1. Large i (7-10) decreases memory and increases time). index_stride=$(($i+1)); size_seed=$(($smallk-$i)) # DON'T modify this. kissreadsCmd="${kissreads2_bin} -predictions $kissprefix.fa -reads $read_sets -co ${kissprefix}_coherent -unco ${kissprefix}_uncoherent -k $k -size_seeds ${size_seed} -index_stride ${index_stride} -hamming $d $genotyping -coverage_file ${h5prefix}_cov.h5 $option_cores_gatb -verbose $verbose ${option_phase_variants}" echo $green$kissreadsCmd$cyan if [[ "$wraith" == "false" ]]; then eval $kissreadsCmd fi if [ $? -ne 0 ] then echo "${red}there was a problem with kissreads2$reset": exit 1 fi echo $reset T="$(($(date +%s)-T))" # echo "Kissreads (mapping reads on bubbles) time in seconds: ${T}" ####################################################################### #################### SORT AND FORMAT RESULTS ######################### ####################################################################### echo "${yellow} ###############################################################" echo " #################### SORT AND FORMAT RESULTS #################" echo " ###############################################################$reset" if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_coherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_raw.fa fi if [ $? -ne 0 ] then echo "${red}there was a problem with the result sorting.$reset" exit 1 fi if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_uncoherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_uncoherent.fa fi if [ $? -ne 0 ] then echo "${red}there was a problem with the result sorting$reset" exit 1 fi rm -f ${read_sets}_${kissprefix}_removemeplease rm -f $kissprefix.fa ${kissprefix}_coherent ${kissprefix}_uncoherent rm -f ${kissprefix}_r.fa rm -f ${kissprefix}_uncoherent.fa ####################################################################### #################### DISCOSNP FINISHED ############################### ####################################################################### ################################################################################## #################### Deal with Downstream analyses ############################### ################################################################################## echo "${yellow} ###############################################################" echo " ######## CLUSTERING PER LOCUS AND/OR FORMATTING ###############" echo " ###############################################################$reset" T="$(date +%s)" if [[ "$clustering" == "true" ]]; then if [[ "$wraith" == "false" ]]; then echo "${yellow}Clustering and vcf formmatting$reset" fi final_output="${kissprefix}_clustered.vcf" cmd="$EDIR/clustering_scripts/discoRAD_clustering.sh -f ${kissprefix}_raw.fa -s $src_file -o ${final_output} -m ${max_missing} -r ${min_rank} -c ${max_size_cluster}" echo $green$cmd$cyan$reset if [[ "$wraith" == "false" ]]; then eval $cmd fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}RAD clustering per locus time in seconds: ${T}$reset" fi echo $reset else if [[ "$wraith" == "false" ]]; then echo "${red}NO CLUSTERING (missing -S option)" echo "IF YOU WANT TO CLUSTERIZE RESULTS, RUN: " echo " $EDIR/clustering_scripts/discoRAD_clustering.sh -f ${kissprefix}_raw.fa -s short_read_connector_path" #echo " With short_read_connector_path indicating the directory containing short_read_connector.sh command " echo "Filtering and vcf formatting$reset" fi final_output="${kissprefix}.vcf" cmd="python3 $EDIR/../scripts/create_filtered_vcf.py -i ${kissprefix}_raw.fa -o ${final_output} -m ${max_missing} -r ${min_rank}" echo $green$cmd$cyan$reset if [[ "$wraith" == "false" ]]; then eval $cmd fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${red}Filtering and vcf formatting time in seconds: ${T}$reset" fi fi if [[ "$wraith" == "false" ]]; then echo "${yellow} ###############################################################" echo " #################### DISCOSNPRAD FINISHED ######################" echo " ###############################################################" Ttot="$(($(date +%s)-Ttot))" echo "DiscoSnpRad total time in seconds: ${Ttot}" echo " ################################################################################################################" echo " fasta of predicted variant is \""${kissprefix}_raw.fa"\"" echo " Ghost VCF file (1-based) is \""${final_output}"\"" echo " Thanks for using discoSnpRad - http://colibread.inria.fr/discoSnp/ - Forum: http://www.biostars.org/t/discoSnp/" echo " ################################################################################################################${reset}" fi DiscoSnp-2.6.2/doc/000077500000000000000000000000001420021152700140025ustar00rootroot00000000000000DiscoSnp-2.6.2/doc/discoSnp_user_guide.odt000066400000000000000000000623241420021152700205160ustar00rootroot00000000000000PK !^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK!e#+ settings.xmlTN0#9B-7Nppm#M{6N[T$_rcvO/5I5dXJ9v|~֏ȝ;ՐoɷI/VXIPaB;mr yVN byX?bik5NPրH/w\#qP3h!ƎQYRPe(bEY(6bgu˹֗0ukmڙٴūy $冢jn}Ҫey<"GyUcZݹݩP{=gIi2tALGi"SzƷwUf)@?4*WP85Q *؜;[Sr!ڛcBv_N1JyePK!2/dMETA-INF/manifest.xmlj0 =vNo{l[6R3H&?\:̩I+Pc^X"Já Y^N"^/3 d'ՆkX n)eڼ=MKC`L0ںS߱'[5gPInD=ʲf{CQ_؂7˱bPK!X,meta.xmlRϯ0?ޡd}4kL5,4Zy[&Ƅ ߏ7S= }ZՈ$)@q-jk?:뵂J_O(X)K7FQT3+-UlKz[轚7d)E{Fs#xLhb1Li1IFaη^C>s2竁eWEwe_toui>InWe"Ie+!t17:K0380>Vߣsn}Vw,&K ,N 9QO&82/iIbs0|H;}f`}"j@8d ژx) @lvPL>|үC;};iѺs=)W#35lv"s3y*?@=pP̝t`G8EDI.;^¿PK!nxI content.xml}Kض<@T}NMut[}N2I%Q*CR.WYaf H7@Ff38|-J$e,wU77^o|}2]r˖9li=rƖ=l<}<̱֣߰952/h97m=rl?5g{m/[K׾p .lcnzY"jkx?^|97\?o8qcO,  ;6|ݣֽ/.ҝuw$Ny]w[nYhxk6k4 &;/7no~Ej3Y^W\ޟZWæ3֭hJW[Z^1ok]IG>nOw;׈/[o,+t bħELm-]gnhba#'õHX v<_zk'ڑ ;juD__HiAH=ߜWM'6E )M810l/'-4?X@9|O[D*܃:c1TUgZK408y5ҹ36TӛXͱ9nw휍x_:hy*~BGo_訟B䖭,c:jd+[$}7Tdhf$ٲ-ƑKN5H϶AV/t4fe#fen`…-mT9 ٲ- ,cdVHv_iS-Y")m<;Dz-Y")mQ?޸//o\s"4[JFxeoCV5(!>5yI3+[$Ż;Y bNWV4+[$ŻX(Y5+[$Żs;͋zcldWHwQ+-9jx{͎‘-^")msȪFѱW9+[$Żs50j{7W 9*ݲ§,s;VH6|裔'J}6.tW8:d#ݑle|_eelI u_K-ْ-V˒PqX+v+[$v+/tԦAV/t4sRA1mVHA ٓq㤼B L}^iS,c;VH6zfI+:HBG3C,cd[lڭ`~Ea,cdKVHJv/t2Flelc*q329[i^C g{*g3PnuY=,6hulL=tb*@ *S݀f}TM尯B T7) #UǦ  ̀ҰJ A_G*ԼѨLF3 4o4*Ѵ H @j79<288&xLk.[EO\36Hg c T:|s+\{B?5 0n@eqJ:TWDѫ0mŜ*}]ePx858VkzjR9VAъf(rݳ"Xd~B{6I6M!TY~vxem\ R/l+D+*_5O'*gSUtϦM*gS&ݞMF -) N2O cKiogڎ;7f5٢6*_ikí=VZG/zmp_iVJ2%U95rT \K qo+qX` ,6Õ]bi]hTŽXec`R.ɹUS=*#u9B_~̘"W!u`g"rPA]CIL{ߛp]+ִ v@)uF2dS} 0窨 P38W]bhUAPG* BP{#x ulululD[X$MU@)Jc#TDVĐnˇ=@`fJx҄ly8x-:,c{,{,=RNʇ$T|/ Ո$^$| ~?PXw'u a푂 ZXzP P>A*ԃǔ$뵏)zc^,(|C]yiQ]2u ++1!"Mm 6!RoA$Q<aW<̠t9$SN,KOTBV=(TūzP V5pUDjn!R).v?DJ "U(Lâ/KDGX"U(#U-:HyY?tၵGJQ׏ϡAx^ A*փBUXšG(*z9Hba (cJ 3:1y&Xn\ky=\e/[85**Oeѻ4yʓ:kF߄W]>Qg2pPC|0z>(:DËYs?ЕgHG|`B4KQ@&B LCWBC/G5Ta)kY8Nt>n+L*45pUa#TeE˙*CϾ|P"U-jy"U$-Jd=PWeTteHy*RQ"k.~絰*yiJ\`M3`x^(,?K3*QBܻ3Sd^S-r'хLSr܌jVңz+WdmPVt,)K 2ŭ,L׷LouG`8,Ff^oVZyE=UW(ĔET2!_DXSq{q7ʬP\<-@1OS ]CY7f*⪝ǯlQOI\&0WϽ8'زŔ׃Bb~ &ܨ:swvr;\Ksz1ޟͤ^Զ_Yj[WЁ2rek±J*ßeZQeVTip}kCTP[9._DU␲Q#6*FdpVT%)MD_1\GO9pZBޔ*#q_yBAUZ_@_r9lMAjG}Y"R_H1#BYؗ-oUlIryaTbK#p;QEB Q֠GONNkr< 8y>Ucgl CKv8SP_ն=vEH/g]@iuߔ'L˙'siF*=O՞G~Cz#/~,U#PP;ƭcI˙ps;ʵ{_1(PY0 s E̟xzcݙAǢi ۤq\mVQ*]&B*xZ-+\K/ WRY]iSUzGL-{&WjLY>RC,[ʜS"-!Ø9dYHS t[ w1 \IK'w0QA}ՍxDKe$)^d&+1 ֧t(PSv27aĚ[ n@-]5@ðrzߨJLPR;f%OE{Lk#kiOάbtT,t@{i:(GyC 945#a$vZObAތ dZq^8 Au-8Ys<zpq:t_Luݟ~ оN35$K}@=m:s5 C1na|( }RCfX\ѱS?Իc{yK*}I^'VxkV"HQEWP}0oF2Qkd8'p{xA\5!jE/TKq7^-+kIZ 7Pkצ.o5Q>q=cTA̷U!1jiYѐ}GCENsl|ih3kn0u?P<71GE_.1h+j#F|G`"A7XUXT'ѮPD1/&`x :6\O~u9#5\}ct-\slH q+&{a.[p# 0VҘYcd|`>%bl ݂S $ }IV‡#{CEqrL1q  \~뷣ۣۗ[?G=y`3QzU[T]M1{)bM=E֚4= lFNa(& ֝9?&[  N>i%0kD 7 c9 ;pڂ MU&+*٦nh G sڬ*KĆ)X#8 օ'5BhXRSP>6 bq N5)+7acOgim !kb)C69\}/t͸e/?cfFڻB aBCIm[Eb_3 `2 0f?ֻ|m} 8Y QzBUqP'c&Ŋ $2uJI9O5H[AejK' XSw\C mށ[06WCJ`Swj}&VÆLaESuf<$V<U KIxXu]`, %Qcy) CA#D>kaCW$c ^{ѹ?fJjh=ϘDM[~Đ g#5mB*>Ytt鞈 K -ZZ*qO +e;+,=؜(>hK1c3?^=|P|Do0. u`Jqci iGp97a"GQC@L8`h);{|oN/(HRM0s(R eOݰ,@[Ũfk"U 9WQ"D{H6*dɅ߳IRD=ؒD(&ŷ-% ^X;ڏGS."\ }[a0f<Ŭ̌ʖ0'e#B'XKmyOjj51&W__47L,**\HMnf-& >1$C'1-aQ@=+OxUcw{KɱPCy _h}]&(mC#)԰<jd c8bXV 7%2.ك4Pu$N'i/Ӏc3J(v!Cs"UEp0;v,h1oc')"laAŒa2A-ߊh[~.EKZdAC;9KvCQ h*mbG- Dr=Z.'x%mj H€b#KC°,&-)`e,>ޜKw2p7ۘ:Eѓ&gDcLBR47,e*6ޘ>N9GܠbR`3{a rh3䈝0̾DbsJFNP 7 K~S|g\rg*3y;_ђ9&(X`7T4Hjmsxv! !"V7#`F.ь%m[6H:PD{] /{{Rh1 V,X).S 􀐐RAW-%bI9ޅ, znN`g~H0ňs%)u15R\\:Wc)d{JU&EREz_vi n?]D+qQfף-JO+?o0(p395pfH1dz[ÎY%c)}t~)ݎqN~"_ o+ ]6nՉAzBp W\JxoG48wFlU Jh;$ژ+zH77G* =ƢZq s$(tc-E#V;K{c&;1% þ)\)MXգhO8H!$RoZdQqcזTMdAKuN7K?ߠ`ػ]Hnk/톭e(RcQבKɐc\L !.ߊEYC%f 'q\xPcd Fn $X`$Wog9dcŕCDVJ&G(cJX! 3 VEin"le3m:`+B\f3;c& MnO\a2i mmC"mpa[#A(iƂR@?ڕivVDYz,QD{[siQ:*,?$M!ycOԐC֜? !ܝ&?NtqJ`x*C=A[iuHAlكGI4ĊX_2xّ{1x5P2Mp6g愳T,ZD,%}A`s= ~`zUa0gcQRgz2\8Ę2jxqQ):8a\Oy'NS+l{bssaS~P*c[uVt2](Mw+Ufh8BZ6;xJʂ{$_ıQSV$$v'I0 }ҞP$^&X/qD7s2 os4]%7 BGX%8 kU:k[3R<͠WhzoimWv?.jn_PožۙiOWu$h-YO΂OO~oNכᯯ.~n+?;'‡bdp9ju룩?N #bLG~7}~Ņ0>LSk/ݸѐoNW<57t;.Q️~~<ps}zf8ׯ_CM0/tBm et<77< k<PL`nB\ /t؎ ^;1 7_܎[0 q-nKƝ/SdE!H*Ϥ`&"m("DI}!0~PL:˝(_x@t1,2D@~e")}chx %>xAm2=}a4fz 0WI E~2[ H}I4r;HbB;*Fu6 sHdL pJb8 `A~?7F,4p0'e$IRE.FЌA&>A1an nr##v2Hϛ?$ VܢG(kR{˂XCH3 25i4ΊK%4DʿC M[4HWYa'1= ]f !2%7%-fr &RʘB;2 l@B.d'*q `td,mL R;nMKd gd_0H`'y`( K!GZWf5ԆC2H[cͥ>p8zfx2+&Ix6~% /fd&]&:"2Zʓ%ͧ0ѳD9}aN!3;PnB QGp||y >/lUV҃Wyb^y'O}d)ded Egw&LEtW{mv@2AnK Żs뻂oY0EhNwauWɇ2QVTynA- zG$vIe <)irynni|bK(0DSK=|'LAnx;`RZ8M^;b>9+4 8;Og{魅>  GbvEVp H ݈>H!1օnkU#nABeh}sҠӁ4LxX KQDϝ$<(@5)CzܷvEWWSJ^:䭿fs^!uSuȨWwN*@{yz!j6WmZƮxʶ\hv=b"kt /L'BHiϪO]\pBX:V~I6VJ ]VJedNm:0S P?jgnp~ᖩ;1_i=gǦdln~)Yu }5dV'1[?ˋ$}SL3bЩ X^VX 3&Y0!8yc5B!8ں*"blC V RoPyuIq4SusNUY(1S)aq8T(B#+E|bA<е LdYN3L9=W,EE*, Lo&lPׁimc S ,Kz;^A{8$8Vڗ}Ka \hU%AXeR G[("ei܉5DPtm0*+ 6>K@*φhy{VuOܼdA!rrIp# d3C`w#OJp3"8#$lf%͆= aQKBd>%JҺ6Iv[CQgνM22+{NR!5_緿P ≴܃Nߪdu,je󻾂9Kn5*=8zs#=N腧3 rHpcTuxfp;J[IiSYlgIH1\:x^Om}[ݰ?K?7kޫCf Խ)ujofm^S6zx[l[_t,i"3x_fxq|9 8ˎ ߍik$C/v.8isp R u@kn;J['Ϧt`:p)HC)&ccI5X-Ph42YY([Rv@zuznLFaK@|J9YuoXKy0@s}V)$,s8K6Ţbq_rϣp @I3Yj,jL?[>v0ڹ ѻSEUasi{JKF8Q9uqĤȆE#O/?iWSuC^ֱX,Cw{pycy!P n =C8 g(`f'+Ze)9m%J!7|:T?̻~r<J"%gRKSeW[A2wxntZ'*S2F 2qי#j-ISJY1t2h [_ٍh)BSh z~zM_8.<=C?C9T8v !&%؊Rʖ΄2]VCa}G3_Or3p߷*G?n5G?nU֋z|y<}lyFO}NzfehFJ fިjRe_ĘGNFhvSAL 4:D]Ø'L3c!yXDʲ]B%{NsHy8Z}{*ϕf:UF \. (G^Fux5 "J޴aS»Enq!M{)K+3%ib*fMr$Cu|tkŻ'3t-R]QU װ-]%s>r#|=8* XwEy;_.6@ˀJp=PҋeNAYkE9!fh]lc>L]ƋAn]Ky#us1$.[aG]YK=)"agH!"ˈ+dDyltH0F(&_}J01D +mDõ yd_{B?PKp/b٪x7`ݖk.g8 '/mYX󟀂 y.| ^bױ6S\UbOԭ6Tlb_c|YqR㨆^r\r)=>6jYje)if]uv[U\6E /=4̞|@׵Hӷ f!w4NׄnXEBArT $lȒ]ġ4ո쬬S f$h>kr^>!+5G\IUִ?pCysr4l{BGh`;&:5 D3ȟ8ʱz^- Űc)ϊXt='CǃyZC=~ r' )xd[@q]>C/~t׿uIR~n䐴(u˛]\lUKiΣEsZv8"X1,Wy-9!TM#?kw"˻wL\ ?μV2鍟Xhs ÄT˞bP<˭_M]o'ѸwU#lu^ӶX8H7aɛd@ [Xmd[۞$wxeXy+5vq+^ynebקcB^2Ipw"Ϡ":w޽53„ÙGYO,E2$:3<Ŷe۩HJ6tQF:BǮ-_]iu+QFE3#OonGvfi_ ~^;܏|A0beE$!RV|eIҜJ00(A1:lV耏;Ά(gPjZ%]W^4TĆZ;d=󫈿~5Zrڴ&kd!M&^-܅PdP1J hFh 1 2Y\ K&`C*r<If0M _2cgؾjF9s濂W®I pPDAG`0X6@Ba_@gB}X`ʧY=u?њ̈w\jN\:;E?-lh7e?]> r)"eBXJD1lS6r`5NMͫק !=9?wTLJ?v&?xeYl^0o!Ľt_PK!q£tm styles.xml]͎;Qn3ݍ,IYgw3IlѶvdѐr r%96@N97aEH%ڢV{<+B;mɪ*H"ܳ,y:znlջu0„l}`y? >vjR!ayK0*Koym.X~+&|Rr[Ȇ'0 <Ơa Lt~4>np̪=uB,oΖ,lvMXQ٠78jGEytp_ kk\}!O)&|ƉegCefY%Y>g5np3" 7P(3jdڥŘeF](7&ɡM)Uˌ0f8r.$)%m_ĀaS*Yx>: *O~Pl0SpY>E-3 0gXT7gԈ&qY%ݎ^`?쾤8>ç$j,! Gݻ&,"gZ K6Dˌ/ v!%DR,Ô,`й\tEl??/?o+tޖ(hWr :y,:?gaJW|rK#L*$v輎sl] ΗlF-Q(98j! % K睽_e1P ۥnM c)%n=jx*\_ؾ0W(h ?"{Jo,Mx 0sesu`w]i$\;wl.*t,ߡShDtqZPrlq⿒gzE`<~,"6 W~2+r +XfD quoa6 aSXjk3#Fv e묢+UDL/$Bm˶pl5-Kvʫޓ^GfJk/xf)+I\l%*+ /uaֱF#M:́9$lMLHs2aB@ þRƙNzkYKђKCfcF ֆK3 BkU 6q C8fro[ [c~iL0&3V 1%#5/2 ^CILnN%Z ^}I1|[d7U2E_jRM},GQr-Iݙb)c .(uLZ &P-IU~hqm50K_ ^4)^-$vqO+hQ5e-U4țQv2W#R΄SqHUO1zpJS \y$W~i-TQim{rǬ&+{An: ِ#51 V>L,VQ]N*Z7q'E2oǖ!4j\]]!oQ~{IC*Ů_eYȾ2P)/8j}$`g (cYa?ȥFc6s:h̭CV1Aѳ1G:][E'txҼx k(Vcm7/d $WH 0qhv;%Bp7O͛GKCNV- "Xwe8Gn2__Q!h"VD/id:s~[c~r2p>J *_ȤJ!C,1hUr^%b"FI7Ta_7]cްF8oDx_&K>'mUIS9VƳ>w eUreP<QA)ɷey*?o '^D oA čͷ"ꩍil Q bCܦ\+)&I)5>LVg6lli .BIYRmy,7KxQd̫dʣ46HH+P7J=]EV-zps$6̬2k_6206ɳVK ,å1\ ܽjp뻭T3mXB\i;UVzxBzKIY6ČrAõ醘ytC|A/C {"C_"EBDCHh  "!!^$D4ċx/9 "!!^$D4ċx/"EBDCHh  "!!^$D4ċx/"EBDCHh  "!^!^$D4ċx/"EBDCHh  "!!^$+0ċx/"EBDCHh  "!!^$D4ċ "!!^$D4ċx/"EBDCHh  "!^!^$D4ċx/"EBDCHh  "!!It(Bw/O 5p?Evݨ\6IyE4\bI&|v'pw>Cm~Kz]\<N W TV]+|{8KS'.o_!]S?N/S݋[Ý[j ޟ=^ӝgp邾OaxNB<{)\}V.Ct.Wcy\ٜlC:kPڨWtj/7{CC57'%rdmy;~]JՁіzS_(èྉ s=1\ pW44ڔ,zYan7 0su-t&J-*pe` +E֮Ė$ll*_Wn`v?,B,\|Ď>WVB}*Y0 PK- !^2 ''mimetypePK-!e#+ Msettings.xmlPK-!2/dMETA-INF/manifest.xmlPK-!X,+meta.xmlPK-!nxI .content.xmlPK-!q£tm Nstyles.xmlPKZdcDiscoSnp-2.6.2/doc/discoSnp_user_guide.pdf000066400000000000000000023124411420021152700205010ustar00rootroot00000000000000%PDF-1.7 % 1 0 obj <>/Metadata 1147 0 R/ViewerPreferences 1148 0 R>> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 21 0 R] /MediaBox[ 0 0 595.25 842] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream x]Y~pC?. }!!IB< !3Oh)j[9ۖJJrO/_> ^//o?}B J p/ox]~}|O\.B8_(HI._i..4zO?~1+4J/7b/_t}kb/\vO??}zdԃ -'˷) S@k 0 HX+&_A]EUe T;D Sż" W} ʱQ'k<㊸b]YٲWcϿЈn:Պ(g#~}Kz~0?].U&8f^<"k#2-ݗHDz S% R.H JfLE|QqQ E%ݐ+>A(V}"6K,VaK(4m%sj'pDy贃/퇖ކ8S$}hE,:Dk9+Qir+{WwV[F-Sei6D YX˳mH n)ܥLAfloST?jF* VǕYCU.ia yr>IIj6 FNV 6q&S|$xe,76jo%Ud><3j'G1k1\rIY  =!Gw5!Eu5$G!AXPLHcz" +WQ<0sxux !oFOê*OOêi*zV3j'VѳI=@Y$ n m&~bi;$ G.RB.˸P 7o/QPS th_c␢LFb(:n``4Q< V'R<9֠ߥxf]vz@v ;]Ql͠eAQ {P!μ&8ho3+xL CA6DtFE\͆Q<epx3&DR<@i[iճ#OqF-~hIhZْ-Bsll2p*VR10QMv0$aM2!a͐L@|\i5A tG3@ u̺3tEJ1Ψ!'*rp^T+.  ^ݮ.ImkCgqd;$]b~ 4#Z(h<@t _BVzlN<>3j'>Zf@hIٰfBMVAF̦ZH:VGN$äIHY$- ;@i0[OC{i 4̦cr4[~.I )JUiSôcle f{b>$TsAۇޭ  Ox"<$loֽ71\5r݅c[t?=:jx$5 全"!xfaW *+jtŲ9J@UP?%sV?c+r_9/!ҕ!{u!B7_{Am5.=g2Ҁ0 %5 &s·`ʝhC $lޔ+C/An0 EHl]ZDBIUV}R\V%Bb2lK\x@-U3);vQ  4á0s =ԯB63u3ᬯ>"L`[#];]Qyx.u€did<[GRF +L_5:2K-/j[0Pp?/&@"5&(Ɵbު,nrSI)+ާen ptCsfhՋ#d.ޗ_*iq;`Yz s^t,{Lb&lsA+6)vCY);r7Srűhj٤!m,L G^Ʒ6 r˷/XzjƗߙ{컉Tˤp}^%B@pk ajᩯ<*̽qȈBM;M/Hk{(kN2z$ri[Pܾ"Eg?0ww4^; 9f@2iʆʈ$c ZׂAjj`,bfGW,~8فDwk@  G-oZԍD+#tV|5`} Rcٱ+w| aGʾ.'6 |G@KI 39a6v}xuG!MԚj̑ۥZ"ouۿ_"[ϲ'&ԩj }vӷ]-3#ߕ[ґ[Mx^Ea*IUxKܰ-!]b$2V@׻jm Ie5%~JVYȍ #|$ёL ߺF.wOg[U|a}MX-暩Be{$Vkޘ\5r{g2V{{L7Toe5^#ޖ[ ITIOAPl%G O\j;1YVq\NNvnnࡩ^3S\٬aldlj#V鮸tx' $,cVkW0~py".Ki̒:/LVR$^1m:VszSv-87&ΖKq?xB.D6#K7v(vks6+^!FC[]w_ۧR)(Cؐ}ߤ:%#mwO'+]M%a:[9Q>Y!q}ݼΣ]VT̆kO/gp endstream endobj 5 0 obj <> endobj 6 0 obj [ 7 0 R] endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj [ 16 0 R] endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>/F 4/A<>/StructParent 1>> endobj 22 0 obj <> endobj 23 0 obj [ 24 0 R] endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj [ 31 0 R] endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj [ 40 0 R] endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 44 0 R/Group<>/Tabs/S/StructParents 2>> endobj 44 0 obj <> stream x]Y$~ЏaJy4N  lkXz#"+ꩩY@tWVq|EdV?>}>sNES?ӯ_/??>ЎIZ}V.6Wh~oKĘWgٳw|$G}~fOk3g] -7M?1?}kXN?NDjRsԸaTjIVYBߜk?雟{۷("^m$) X ?*=kwj6Wk>'1c^.CaWK]h5_,u"Uj:*K[|b>ׂy`̱}x 6r2#CpJC}]֐at@w l-UrI4ɴzh&؃4rP#R3y+D)6>Kڋ??iK-"m; ;I3r^ݫ3xk ]e ݁x#}s6_ bN"gk4x %mzx0}`Sg#>tfWq-sdzqoZ;0\o_}p5p5[c&7DSoL@k67v!txL]1V7JvٹX8u{C4r ooC?օS~w46N,=x재(aw=[4t<8mS+2dd׌<6Qw 8[W`CdMlᾏ6cڣj(j<1#@Eޫ~ dYCZׇp8'Lq͢g T񸱄5VVB73UlfͫnV?lBL_͑CC5 ЩIsJ&$ dXOJϳȯ$>/9="=,^2]OaGFEQx/N,b \vLU;{HP--S{S ՆBj.{FfJr(VϮ7M0Z5"" cB SN'b)Kcl&Y:Gtn !:Te-_;UZSu7N/C5Y"AA{pdQGHKJY i7~݌Z|‡ 'cMsfD=muh6FJ֎YZ0%,[›Vi,54f{$,fbVdY*5"Lj "(` X?[TuX栓K:4qVerK\+"d N*ƴ۔TҙiO'T)/PDiU%Nޙg0UDCD$ձ'I_H-Iq .E HĿkN~OT7pߓxrvR݋E›uclL h; +w&sM?-|N6h&p(H&E˫} _r>KV^v1i K%]Qt%5jN_Lt0[Z?~cBj#,&4$(R@(^3Ho0 gjHOJ{Eh3 ALZmܱp* w% *'p09j^QHIV'ZՇШ{վu#sh`V+? ]1Cֆ^^^&(~إwqǖCUyQ|j6*N JL\ɍ7†ID6ag6.ٮ9( ImE21sxI^\7nFh\ O?%sHeLJwT$Lyrm:+.@8ߜ&Pb[Sz9܆G*B{$9_,X=MPDSYg[$; `L9yp?}4#!XXAI h/ʦT#?_T4I}QRZ[M'+ \촃*pTK^M@/ŚUX&_\WCjqGc5 +[JL_u:M(̓| d^+6:*[o4ʶFQ[!;V"*_cU2Yz2+4YE"#_ξ4r (C_T~_;z`Wuj=z#_Aiv[y+L(!uஅ?00MäV{/#7z "(@YmB,#'E6%FĤ-H6K|\OMYϼLP8EFӸ'&;ߑ25&E;0C;cmZޑu__Rp"csdU q }B@t QӖD;a::T |{I Q qtI%dk |0\+H`EK'kCvcr!(jGCp<.bV:N3Y[EYe]#z`BunTC7U'`t|H]P؟+j!^9=^(DOԶ; 9܏-{ނTRnvkSRDc]> LxJ΢#4`Svkm?5[:QhT:">p W\w"d'kB= :;YSO]O%q e@lX$@C<,T[x)#RBÍJQC:zP5=ŝz3ڳtT><{9t惖gK.fv0wKCx90Jz^oOZʤ[Uízeq65ˁKKd\'-tϷ#4ukpVȍhzw"9 Î.S&*JS=g&]|K+.xH&kn6Bյ*6J30h\EĈaInXTNH Uapdl![,4ڛBjEFlfaLΛFDEԞW>toV,,QA9:d:;@wW? 1P/VNŸɤZF> endobj 46 0 obj [ 47 0 R] endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj [ 54 0 R] endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj [ 61 0 R] endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj [ 70 0 R] endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj [ 75 0 R] endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 81 0 R/Group<>/Tabs/S/StructParents 3>> endobj 81 0 obj <> stream x][k,~7?8 ${ !K٧,C$Jd6{*I]UէO<}^N|>=\O~|`y:^ iV?LJ/޸f?=>B_4#Bόqe'+3czei` ^||;όcWe~].gn3> _ɂ߽lQU(b0iq|= YY/nGH\7YN+J[tgnng^q?Úkw^+}|=y.r71 dnxfp 駾ӛLO.S-*xT< c x~%B}O|Oo+iRPl/sC#oGjj㭐XXᄆvARKԃmRslWlYkVC}(e"+Jj8x5 O~w_gTFW)j#4 l ֐M`֠- Z@4"Eg87ld"ǯ|XXdWhk)#si`9K}v7"S3k6v; Ӌ_8r-( 2;>)Rp^QX.PaF{%@Ö7/A.(w2c*k5e1v6iНs6*ruWhdJ6?{I9G/o6 Cڱa)0}c|W #=E{ʓhO:xO[q>=NG7I=xVK-[gLK`&Wv(Fb9J|B)|^ 5 YY=$ y0IeQy|ؓ:}aM=Djecty$(K<49S8SyiEg|kLɅ[n=eՆlpF-uW"e)w%Zab\ Lt()fw:Ңf*i=k 46@gnl\#K5@dA=$ab>;y sp"v@%`(cK ۬0pS0BxWw3<̅jRK'iušz~zqW%'?  za"j&l I}Z(hSɊ`(%A +5Ɍ:/_AضEj)Eqw}qZ$AJ> U+гSn)Yǂ+νQ^7uXk1Q˧0壂]$RXS`)Y-Xua9J!N"9`r8Rkז&i\!d'K9\s1+E­7!rHj/5u")lΒayHK-gk+2 Q*ѕQLeXN1TH&)6>~PK5-J)p/6U=8;gZ#7-[ki*W-4J {ƃ9;|"CNϗg$!페^8'};A*!:5nf;T;I\f*;xdzw[ụ*Iϩ;܌(M[8tBGrm:hKLt|)- c㉩<.jv03Nl iQrmRoG؜F;AڋZ5C^pR̜xDr)6(aM.*YSd UFk۶i6fVY.eiDNï*T6m 9;VBޅ(B3Lǎ yEESrJ`s$TTLukAm+(VUQöD7[T|ELbGjqvKFB,n<gMVIN10N,[Vs6gd2ި蕴 Hs ǽDTZK!mG=#5<%ZcxPAlUKJ|-]ċ qag+8}j(vUB}Sj#kw~js3))lB?\GT@Auw߼HA5,㓴0p :;uQsV:>bu=9LaJDK;-Zc[sNɨV-ˆ6qWC!T%欇Ppʗي ) rFKٕ@obm7>-PR1Q3&D 5ZJCRPj# YWmeL]49]T+|tADj tPs} nv|v>ˢk?G ?Q[&ݕ%2̹LM2Y#:ܑ*qxBk1mϽbH=\X+4~ИLcp<MN&7p,#q]{W"Uٓ#⿟ endstream endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 85 0 R/Group<>/Tabs/S/StructParents 4>> endobj 85 0 obj <> stream x]K$7ar koƇx^pRf(*R_3|ixy9eg '929 ߞO@ǑRZAk>Nz<臟)g~Iß?ȍ\\of 0V3|8P' &3|EVGV%yYhaTt]¨<((`{hT.# \C^d!rFc,TxfAp*]T F#[)&34" .'ųj|WA8AcN7}bs6jU ’^g0d R1 r5ߧ!PEHM)S52#v,e7ëjCv•k|QHR z!7}mp2Wx(66⩌!;ಌ1CYؘs/)4R (YLe&#P@,ܬ0y4>g\".`H"z}ʡ)3TL$&V|p|%5򪥭e=VҺSJP?}bW8/]D*U%>ƈ3gp* o 2'Cuy:S; 2 ,eSY/fMaPQJ2>+(FOgAp *fFsfG9U\)rKS lR&J[($TbPSW5Su:4,(jC17{qI q[5%v7dU[)ߝv4QgV׫޲|w+ d]:Q077CO_՘(8 %1ylIU!| @ *Q { ܄kou" Bh s@0 Z=8Z=TҮ3mJt j9ܷ7hCk%u|Y8 u>Pӎ u>i0~ᣳS( ~Lۭ u>F0@5ű'F79jKr5!\H;&ڮIT)SN>zT)c))jL"r12kĵ%oŜ Z)̴فAdEW ZWu/PD%N0!OCY6zI(z~0bFzLd[0 *@? )I\-Q3nY71r.K-QvVIhS MvFV8DOpV\-ϖP;'Ϥ9n?o ?ݯ}zϳL{R- h/3N {=~Ѻt?cG %>eWJvӌZoy{˜oIw6J/#/f=nȗ|;1v M>+ٴEnF6;g2 I䨝|e3ZPa6x\y=^N< 8o Vy;y\eXy\&q@) fgNa=ՋwVMm:pC&Ն M⮗k4kJl~P=ٵ eqe"],z+nrA7̎kIn.A4:4?@ .`x[i%K dIʙt^,Ro&hH@h4)BO`RCsmwЕDc( .Y[M0.v}BD=sq^ {dg2^dWxj< 64dѩCƖL5ʭ Sˇy˩*w<:G@پ4Hz[}=]r5޿Es.Qsh="-+@Uǥ@xB$`[J8,;ǀslҮiZhTc -lUOj<5ƒ:40t'0JvM|@xiJ֤kJ/G endstream endobj 86 0 obj <> endobj 87 0 obj [ 88 0 R] endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 92 0 R/Group<>/Tabs/S/StructParents 5>> endobj 92 0 obj <> stream xj5uUI`䶽$d!Ò%d)CH]SVٍ [RչT:>y927j \0 6ۛ~7|yx{Y ?P= tӨ㢆ԃgwH7ÝYJ =!l!TŹ?mۛ'_no^c9h3AY0Rԟb>)!ҧtdTZpSs b:P#b%1z89* Αb9Hʼn z '.T m1`>Ál^tTqH΢*U6,jl0腓^a#d1a\3FL儊1Ԛ1 DJ zd:TG)(0HɴQ A_|٠X>/o>z/I@MfNX.Ow2J]>$:da32:Rr%!5cs1q VSP 3By>-VN٩pWlΉgeZ9 Lfr.F@NC<NwXF!g!-LNa@9F7n_N3PS=9aQ)L/NAbi& N3=T={z͞ ` /ahոa d45h }L9sߧ]* %^* 麖Ɍ%}#ٓD{ktEuTJbkMjҁćz!oҁ!OD !{J&W^QbҲ'i]5cgF)wTٜوeX,i|3 x1L_l ϴ|% krOԵQܲ =(!qu@,Rΐ29p lNER@m/;r'ƂqY.* 9]zs؎v-isbvv<ˎ9)Da1/=NԚ̜qh,KK(ogHh4 QTӌ`vIMksy/i6~p8 KؒzfbSlgcwTLL[\Z 5fI^e=ɓ)υXߢy0U6R{N'h>UggɟM"ß "3 #Aڅ'?WM_*QSjpE|v'davDyrܮ''d-+ء]oH/$3AqTTך6zZJթDS~PYYS_qʑ@DꌴT*GՊ L{:Ƭ֙k[a4\ D2DmXPBφB 8[%,, Th/UnHG%`,%K5_8!( jV DlÛ4 k$Yd/X(8wsAqЁzSY Jl2-ɢ|,2~S$A,TF]TP#4ls`,[%k8=>澈|NmL;|﫻 Xݜ@ > זƨz&n?u\hsgOx6m\҅J쎮"#f`t^SM-pLx.&^B/XnN;vX 0Zxo9Bsdd &@鉁&4H`,P)/ܵsdצۻQ eD~drXNj/#,PqϑY+g7i OpUpgͦ,KOɚrun%g!'/JdX<(\z]1 :0UFtX Vbko3`[F s˱XT}Hndad$=+am+K,Fa#K΁؃] &icu፺ kuyڠh\4 _Cб(Y Dz5RYe'w Ӑ[og.j;}ž=)֦wJZ:%K}Kd$i8u?&=f%Lɑ jp7H-'tԡoV|%7w6n;TuZ7u@9'q 6}P0dn^S[J:KqJ.&0®9^GuZf!զri w&~^Sm w/R٤6y,b~2]W2hW#U}wH)бQ`Dk M܈pMme̦xCO'SA>xPPP_' "8%-mNIICB 4wќsMIBB*.7@ͽWpyYfpāGJBNoBT/eB!l..uֿO*/U;v'bSGYdd.aA,~n{G1t~>)^ 0?ol}pgjfOkk"iyݣ3g|KwiD Ƃ xI$Z= . ^ $c3HDd@L %:&-5侣S\ @3-%'N9H94љ¥`(!3Ԗ8 .Yƙ/-&I=Wu 0X溤ro/)թ2i/4hq/WzV<ÁGrNZzN](n endstream endobj 93 0 obj <> endobj 94 0 obj [ 95 0 R] endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj [ 100 0 R] endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 104 0 R/Group<>/Tabs/S/StructParents 6>> endobj 104 0 obj <> stream x]K$7ȣm=S04Tt/6,˞'lJee+kftWu!E|zo<6g5A.rdr秿a7ʆ/x~A2aa<(G/J_~u/ϟWח_/z~zCE1No'uSny硔T'Dۋ2?^پäS~eR>YS/*V(7ȶdЕ [bd|`<18ͧB|<۞)eux6 @B:kf6N|~:"؄3 }:A5u*5Q擓aNwq}?{Z(ǃY\ BAO`xI퐞U'S|NWN?f? > V- Qa.cN6wPj1M)Ns6.TiTtᯄn;wƌ(Y@](RִUu ʱ"m%KDbFPaM1 ۘ;y]<z54PBmx9a+m5hdlЃi7( 2Vy\ sLDžmHdJ] #Xhj`{vvBMkب&Mn'R^or^i:Vj L-sx'[7E&9-_3郔*ޑ7 O Rv-@W~BG!+t,%VIEYP*s ^g N?b>'p ѽAyE衠b=zJ)UuqV _#g(ޅ>~߈S ?֚*lE+kS,q킘OR;;΋q]U>Q=<1r#5W sG( (&=3Lmv.F~eTps!r_&Yk{z>ċ:6̳!貿k M!fU#e+#NE[6 4*=A&L|~7 tD8=&]OuBS#]n̔g/" \^zA`aUI>aC4@"[EvIIÁ`V,F˭|; "+u6W4uIfv{cU($%hUb$]7,ҏzOJ-"HtwR%3,{ +# Ǔ|_*'fK$glADU NvHWjǙoP\A`CeO6 !(,LniX4jH9jNvTz{wKZ'+f8Ъ:{Gsʵo-gU[W,{۽dei[xe{ORM5<`a9,dKn `-xEk qi!sA7ҼHښ XG5Z<d/ f鎒>j_ZsRW='M% ] /Nu T:T'N,Mt';q))\}BL~oJ+J9 oV g1ݲuTI'7% ]2VIlO>FKNPR!K{6dwZ1נcuuCtK?OƄ풗~?Ƈ: Qa)F/2\*KyCgXp^9R LT6`ElC+/cZcފ8R^|!fx[IΆJciklj9(ІqDQ߁G#k=`̱GCyfjUNnYΎ)bb0 H#%=o2W@!IB[.#p7$ +fp{46* ]G \&LqS[\<:HK^y{U Eiԡkԩ(c`˚=' #1~a, Й=#zד7kj|##-lKH35#E:Ae+,9ܦY JdɥupEӥ-yP@6WJqGX@5Y=C6uĩJ5TYN.i ጴȓpGͶz/Hx9^tǺD  9};Jrڱk}J!€Nu0TX":qE2֙FKhHlgxp)-MKZCPx H@vu^DGO2# g04#]ir!QuCeEs5%3luܝ7> endobj 106 0 obj <> endobj 107 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.25 842] /Contents 108 0 R/Group<>/Tabs/S/StructParents 7>> endobj 108 0 obj <> stream x][,~_Џv`jffwLB I| !&~Iѥ$n}{Ir`ٝi.U|U>a8>}{@~BFbi= d`}o^___>)(>BMC2afb>ô;Jm~)|/'§߽|.%ËjxC}5|8S9 ;Ήv9)*pݔ3ON0 /gH;N8$ AhA,HIgwi,> ɳT*/%Z%S^7Sz-o7/k C@vlbi6bRDfr┆{?\Q>;arEDG0s͗S /%q/ΡN/dqTs[qN7{**DK2z C% x")DQкaANuk[-M(nDόxP]ƲcOrZИw<8=V?ZO:v~Sqꇟg$c.ɨ JǦ5B+loK`k'bqw/X5{d_xR:HIYYI]j<0 >e3us^"f(d<:.@\e\;Jr#gTE UzL13|7HN:jJ/EkF7-y_4pA﷘֘u?#Zs8q`r}PrPP"ipe@V%ڝP$eH!L(ºp΢k~sم:MEy^BEbloRf_t,S5Mo\/;^WxJ$\bwĢEc1d(^g /hś5p(`%˸>,(QlEli$F& z,M*W9찬dSHdGҝ f5mS쥪DsY[*ˤ$c3we|9[8\ sG YTeA&]c`Ob 5.\?)P!芲78UKO(1kfK\,k07꧞jQ{aϺPbaC12lrD uB |cigXa%\ h`Kb32b,!t;3ӽT`K+we-2KF5 }NflTh@g(¥|xn &3-TIjaRT05|i1C&>R,AE}#A)}R 8D/;FF# |tK-sa@(S;A6*šy-Ɂ,qnѡҷjAfhh`#bbʦ@~ġ*?q&qJ=Qsz ɼ jrwƚ}1Z4=Tp2! RK ВK I[m fbNIýE0=djLR$޼+vMZ]J "0J*bðlk(P"M@9.gB0FH7|a!tElH\Fa7 NBSa iVϳsP{JZ T;y"Q ݕzr<H&g JGuKV BzR.\#[.(6ػr2f7&_KkEnmMO+m.g$HcyYSE a釧qmEm(af0wڇՓ':S&\R7jүJ~;iO.[ |>Ǒc{kyl t6bQC4MWz ҟ,Ⱦ;>;2P BC~Tw+uyb]}۠uC9OjdeAHi`_4ەV?pXA sy(&TtRHi*}Ǚ^nvó|6gm2lm{&Jn }0Ү纤-ƪy#S i}끒~ S'S dO&| RX2)]=*}f1N#%OzݷW tfz)h©BD6Ff¨_hL[ײ[.j= pB8 ǿ"|FB+q{+t3E;(|}[XS)YZSEy#dS w  e4k椑eZ* A_ÄP)R8-Pۛ6F#YeyAiq L |4!6b*;_i-R 9{&U1٬c@PYPA{#^æ%q&;9j= ksmb&xˎưHgJ/lgAP Ljf:`Pӽ9}mH;5Y)]qg 0b<}"rUC7r8u߸Qpf%C_J;FˤL>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 116 0 R] /MediaBox[ 0 0 595.25 842] /Contents 110 0 R/Group<>/Tabs/S/StructParents 8>> endobj 110 0 obj <> stream xɊ$^PCEk̨cOsɍ=xRH X}>0~~@N6|~"#q r#loO?nt`x!Y_ ߺ\ n]Ê}]u6%酑%+:|ӻ?=? À~PQ] ʄʋRoooC:b% cF@/\ f?ki9(削8Lr-%<~cgrN^9{Av"}@<@Lw9w@{I3@% q;^yע:\+^AҔ0m0Hz=,DDB{N)4}6wAɨtC67Ct?ceTv;Q;܃iK6@ *g#~ϟi__@ET$bTk08ۧṈr\NK2sWWyeJuPz:Bi*5:v2íZM"eQGF*\y6f90JD ýiA#L4G04qNӂw`,3&2,~q 6^ .%eU'L֏њ?(3S䄊[;d0W2S3;t^խkU'$:VRIbJg"җHDla#l淍{NnD8]89G0Lg-ĚMƹoK[rJ] 9H)]`0T-* ήQvO4s6E?gz+0XR wZzYøLaF:kHL\rLmN31oM!p,Ǿ-+q~aIm}8`i#j>mW= ^VݽbT_$;hڡG6WJʕh";S4!zi˺wpM{BɵE9S/jdA`|>,Bk^]C#§;$BY4% /Ox6R"ŲL)Dhj"UyT> endobj 112 0 obj [ 113 0 R] endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <>/F 4/A<>/StructParent 9>> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 141 0 obj <> stream x]YtQ}G?Gx%"ɲd#$#eXsrU5|u#c8m/pX)r_#z~#rH鐊Ou&Ш?H~aG)GQ#.GMdz.x4*O$O^m'P Ep>Do2 kv<(~Qu]UF#Pa(9|9$aGP $#dr/ţ炞 )rJuQ'Ҟf>;bPQ | GLʯ0"93*zĂNG<D*!r p: Auao%A_ـقCϵ=z VSѳp=|+F

Q< ,Ro*+Ba ā=<Q`K!8 Ґ8!ĭmr~Qs pAuA4:On ;@D3 -uN):YhYEb<`Zt 5ZVHI#-{NX 0;G<#%C9X?f08A -h*[-[EƸ۷-)8"B6-TdBsv|=gJslھe#1M14`9/L Hx:dx"Y!^`RZe棴4-) )GLRa^X"sWD2x+aHL2t*{()2D>M>-H4"7-\3S9s(@ģLnX2='|$ISxK e9[9".[RK1;z,1==4]#ci9~Ef)--"ԃˊDhN%r,1ZL܈\@+ {_ZvS<|S*["[!^h/-)XH  )Gx)xVZTfl -}ԏvheX0; VyxeF xBIU}ۊ [e>kP-AZ0B*`$P,1BѾmFJ Vb {Pb*X{f4%ml6k9JH[)i"m*iHl% a&„̈́QƍR"gh9@C< a?iepY9^B F~Q0bXܰ.`^O_cN m[1Fm[]LRUFvaAFyɕȣza0ɖ>(E:A,t#|),X A##06"-+(|$[kDZ|)ڭUfcV`Y 0Duo܄-kAf%mr<>hNY}P:"%`ϩŞs=,Y9XXyf ҳ#y(^Ysخ@<|I[7)+&7CBZ+ Xo, L,YqQ˵XޱfRdVQP[G#Pa,!V& ՃRk9-K |<8ZCP P',3J=5 CUϱ2ZdM쥲.xԅ)|WmY+F.ԃEA}Rc5) JiFZRA }\YqX_ 19rRߠhMH3KTy>/ 02Tsh~伲Uĕ552 Tf63iڴՙ*s-֙,hVfD%+3VR7N\SOv>WYsWmVI۪UVY12V̜۱zr؃2;Zr|{%֏fU㷤[pI5z[Vrң=k-zEj,Ora%Vc[-%KόXM#sJJZf#;|Cv˞6e]G)ٳ^ƲM.ͣMv`k$srcij4Ͽ'u]#wkbޠco]N O>-$7&MVKFu h XU@w: 'xtwK?Kpk{m|wnjHK7ROC^}G̼_B%(Gv7{\|7>8ͥγ\>0JsO̖ 4@4@@X)Sv#SD͞>Pͥws$Ӄ{gkCN1CN1TCN5TCN51rax*͞I绹n.}|byMvQugY հY <3gO Ol u ~7{]Ko\.4Ϗj'<>; f+H$}AAAɏwO~xRfR컹*뼏ӣGGxuP%oP`P `P `P c(]ų%w~7{}7>`ͥwsI.g]}w-/~p p p p Q3 a2@qD=>^뻹zGi!?ރ퐥_GgROg1g۾밽}].QG.ڭΥwsc\<;mתKv<"aJ Sv aJ SjRÔ1_.QG\tM#\Cl=kz-˶*sRc92Ԋz ku[G5c[>xvz/Uq*𱭿@٥)Я秀5yx0|?8!/$""c;7ǨT=9Gl8|l?{&?s2mKՓ9~z(c',S'@ڥ)P~)l1_vz?l6APvvz'9lw9PϞBZIl9ݯdV uv"KS?Xp@^ޕ?RTt'y[\vDK rRg5o2܋)~%cL]X~m~%eV; "<}/]N ab|ם~ gf~u뤓Û4dtxӆmW*D%>J7W(Teڙl!Ɖ33ʼn3/&̙ln2?LaLqۙ|إ h?Fw'٥pŸv'[2qp'l*K&e e4FrmU-bxh=Ӯ5AfWC]ai([폷g p{A;v=mׂj|̟&Onn41rVL8N/~ꦛVoC7+6H~v~bn{߮~¨Iҵa07p'Pj/_b$ep\y9K4= גN.!ZӘv~%N)_mCWI`("SK4=^ dOCY-|; Sg:å&Й"1@إϚûݧu2+ xvͩh\b}!1|n]]!.CBC;0vZPu APlUYAovT; (+wݥpO}+K^֔%_k&eMYkrډmMYlMYx!e@g^)_R_ p} kt_*KbUYĝ*xUYĝ֫bb^p0qu@.5ܗWK>UeUe;RL)~q8v8qv'!)NqN5]΀ҍSݥ\)FY,I'|yuCv:/iý_ioG{%M̯ Ӿ.aK̗_33[eވ': kK\턵-#щ^)))p-;38 V\REA8bM'gI3}׆lce41>T}]^>HK=={bj8&{.2?^ icAkli}i?}(T 2eY{ Nf+L4dy-w:΃yWY.ˊ02nIw:LʺXlq}eɮ,O_ w:O6v]ξ`^W[ɪԹM܅[S%]̼뺔cb2tq0Uw:_SN9RuÙ;ԏI؝;:dNj{%j7E=N:3_xaʎf^]]N\@\\6/{×-NeotE\K5w)b..͋MJpm,.={p6q}8헓nڥo}@qq'E mj0 g/E*Vc.x3 / ]VUKQ>jIz W dA,r,Ohؿbv: qT#nF@٥(z?۟G+}=]>s(q x*v: ;n'㸐}d5%IaG˯!*[A{>RMnʝ Qv'}sj ᪀Rv^^T՗z$HsoiT}1feA5dyྎ$++;oq̕I̕u̵ GYX\ܻ1W&1w}+.x8[Ov'_kH:UKQhPԭo|r/T]{_djr]^;> endobj 318 0 obj <> endobj 328 0 obj <> endobj 338 0 obj <> endobj 361 0 obj <> endobj 412 0 obj <> endobj 418 0 obj <> endobj 428 0 obj <> endobj 438 0 obj <> endobj 448 0 obj <> endobj 458 0 obj <> endobj 498 0 obj <> endobj 508 0 obj <> endobj 598 0 obj <> endobj 604 0 obj <> endobj 613 0 obj <> endobj 619 0 obj <> endobj 625 0 obj <> endobj 639 0 obj <> endobj 645 0 obj <> endobj 656 0 obj <> endobj 662 0 obj <> endobj 668 0 obj <> endobj 676 0 obj <> stream x]M%9#b9-!$@0@fX9M U9/E~/U|׾#KLi qu)i1-6p?YhIFCbZB~Ar`M+ ml}]ȫh!!3 .A -VM-;-_T`=&R?3֣2 Z38FP& B#2> Ô`..)h9ڃеqP]؜q #z@FـLz`[xEQ23عȻ `. b3rK %R4{$\!nfj0zG 15+)<=DVU9X1.+B;c)W`LQ,ջG(Z,xK.Y;J@LX ̰fbYKgKς3DZʴFnX(o oE͑=,JBk9&(qy'i7BF\A_H;5.MLwHeYsfE,5BNtPvjn0zTm:߅v(WSNtu,e:=GJB/mEUZł @IvFE-93c/B H/LPhTZQ*-@K;/I WłB[E{Z2:o7J]3>[h`]2`[hu6]J,qe8z8ңT IKvX(JBZ@@)BZRQ++F)UODc l^=Qdubbq{=P3"_.(,+[䡚#HkW.X ̭k0s@GjZy7s_Y,Ձ'#-u:Q͍ږAu WLsWUI,-ua\vaWN1׎!g2ʇ ;Y,с>~pg~$3&Xf\:q;Y:>(:^,bn@ñB<0_tgD1ttg(6]UK0YuVX64HOQYZ'_^Ns$;~%(ss{FZ:Z|~fXP.s'ɝ-T(.wһ<93Ku c= ˹Ѵۋn@ǂSDa@3OOSC;dgfpi<޺?TӶy{ӵW!gd8gz^ Z?XyV6zn(y39l;8Q2^MJ N'TU=y^/B!~ψG ,mII|=I J؎t/*TR۱ Tޠz*>/*Ts[DZ Tȡ zV4`QAUA9k}8ś5ɞ]#G*p=+rΒ3c<;)-uut'wa͐wj͎>g7~^M Χo۟A&̒G ={4Kv|8šЋC#% qȔYiq$ 2еzbWmmY_-e߭o{ܟuY~>9mRcOb]p{5; ;Ͻmn<.^GJ蹋T,mc߯ Hjw@v>{7$%-y5< ;AmSг2fdзr~c=[j&{@v>}1j~oqgKy1^͆go;Fm-1l;>mcX[cRw}ǎ18ұ25Igfpy,@ Ee}cgL;Ffgo:Ƣ13&dJ8qe:Ʋ90ޠ-WJHdJ8q c+ż13&/d3'c,,z;`fp1jft FJ&mpVꕺhm$-n)aˊZbbc C6'AiLc<'u:KYLh*Lq:nEEvo UԃWį\ɡ"k:{)CS,nk{&BM/"Y[/oojI͉S,+mYk]r{^{7^g﹘wW`")&Ew<^ #d{EYQ^/!U0s%ϒoo[ zXXDu|28=wYޢ}GAQC%x1 m){Pw@1͒&AP=(;0Ufz+ w$PNZXhsW+wYR;WYO2ВەzsW gpNے{4TB/Y_&eچ*Z+z匹cS-n/{Whɳdhf0'JrsW+7q:KvK޸UR1;-}6ʭ ~@ ,[ QO=7u:)S徒Ia:J0zaF1~3~ QfRJ|+7\æ4Mvz9 n=] ]1aLhs'&F1NO1C8T?Voɚ:{t%Ͼdᯟ8q1N179JOy7:4 t`xՕdv@~- +Pk~yޯu7~_ )m~5Օ .bu*ZT}}ICe_χu8y6#^}NEnYXuUpzҪˬڒkeVbY}jk2[W]^׭^ڠs6ňVolWp& FA }ȂF4AG eA;2 z7H?A[䮃VxwE^_,G_5ڧr7^ڷH'A6ڇ* Ivz;üގnCvn;NbmcALv4a;NkGjsک#Hmn{j̶ lNmmjۂ֚=X߶ږ!R–U,m!biSK_ڬ&f6Yť-mkis!K1 x/` .\Om~Oӗ{⭜Lz .SuO/9sWO__~zٿ~W_~o?meҴo>|W{G.>w?}~POǏ{~L.??ן>^_W>~{W߽٭S$(^+yE:/ORH_瓮yHQ;I8g*{w> endobj 708 0 obj <> endobj 717 0 obj <> endobj 726 0 obj <> endobj 739 0 obj <> endobj 773 0 obj <> endobj 794 0 obj <> endobj 812 0 obj <> endobj 841 0 obj <> endobj 847 0 obj <> endobj 925 0 obj <> endobj 974 0 obj <> endobj 981 0 obj <> endobj 1064 0 obj <> endobj 1093 0 obj <> stream xMn0>"cBHH,Cj8 n_㡩M-{CћDvJK p JR[(EfR4zD*9DVUL>b7IYR 5/m4 eZz]ikf،$`[}R~8UNϰԉ78N2P(H[,CmCmZd,d.߬kk: F=o-ߡm?`..=a߼#8OL@$*~gpXJ<*`6 endstream endobj 1094 0 obj <> stream x| |Tٷ7$Lf2e&$,2eB&E$B `\4-uyq+~_Ul)V~[jPm~dLH~;w;s=$#X 5#[ BN56?q/B y-z.]}D(ׁm|{q}!ꢕW]r i;Wr[>Pz7Dž}xZbj{s.ٴR+E[v]_+yW"c2Kz74P?ݗo-zl B#u^{I?AO_qh{P _ֿ0 B Dd!?y㻗j4JDғ#WV5SU! I )LT#QCSH3B0zЏB, "0!R @1JZi9~~VϓKϥ A ( 7e#?*\#h!ZzQ?Z.FW#zV7rowpÑs^rxG := P^ߟH$~voqg23ij1Aj*B.ch v5BZcLru ڋN pFw(-Ld~[K[⫢v9M_nNo\pΉ(=@ywN;.m8%LںI>8*@*O`GJF"IEExӦ5FdC_ JB@ %q4O6 :H:v2hA$q;!(D ?jӨ~5 @cj `4Cz,(mS:DALC{'W!*D o+=Y"ƹxnc6 t mSA rGD@4w6ELj:Ucn!`g` :h'=X&ûWIA @p`MkdI&jcK\\~O[\Fҽ޽) #;&E!$%l6qY+nZ!tG]{qwtfB` 'q^"*Ol@Ow)FITbҍ"ѨGZwh*(eE{ ?9 u MȽ@5v=[&mwJ2j]KZ0NɀGΣRyI,nVlxx5=8>sV;)8Y{5 Dfu ThiLLRq;{w7y6E^a$$(㠪/i3o(##j]YLV"ɂ4:*"{B,k`@UDd4@o(@:PBh@*i, ඀ őP--ppU0RD1KX\+G+=Raݹ(&rB ɣlND+u Kxi5*rÞbZzT DnzLsqf*S[`J!UХ TA*(Sy K=tJ'E"<.7E_Q E#a~_DDpEx.pwZp6M-"l&083}|!0g sPrC^y;! a@Br1=WlzuO˯pzkRK_iŚj X6m]՘9soMb8|N߉ߊoC 83U}hwPMYj@5pY}շ`޿az+ ُ'|aûkckdk߅!wBvVZVkTf5R*/A+*n~ 8q3|WT1uc\lN\Yzw*F+W(4#"Litaf8'MqV_}!6Y't'U6<7-Z;,9Ь|_}ݬBO 7/C~׾xJ'0ZΔ#D] \omunb -`,T   lX6,Vns`G:~壨~`/_ߐ>饤)9x9 rֈQl| OȚB!\ePePycvc˒J >߶݊]SVxsʼn&^M|xdE4t~|u](swafҙXy#J"o5z"RQx(ht;4ߎ=G Z\)-6Q#WDq1){r֞ϝoˬ~ "~޳Ga6hTye( U|^7&H}bnCSY`qX*U8y,CJ.+ )UZ˿?LȮʶ5YR&b> $g0nD1(BDL9Gb=e5Zl aUTrrsؗ٦V| G=xϠVdUrڪuz ߤMj}AY:&+2ɽupXkʜ(o^"xlNOytܪ6Or"KJdxvׂ!QZ[Z, ,4b!z[bbņВBo)49A-T(B/QL"v3*MZUs*pU7'Oxo8LW7O.~kրF 4" dLR5n3כeo^nfl٬NGx5ҰNimӶ4dJOvhGJ$k`BҤi9Fz' f'?Q*i[+|֞V}f >}޾cUbXx?}ޱ[AR-)!9cIIUMj>EC~n-pYRDGbz*zyCy<\SթؼkL l_r%]ArӒ"<]]UIa+@t"^-:FE~h$]OT).TdJT;G#RV,CQgWJL BEPP-11?OӚ"&ZSʤPAa"ϕryb7zV[|v/.bsc+;xbU_M~&.lXa'&-k댢%e+s4v#44.Xhhd^R"Jkm;i5*WU'R,/YqII!pYRA I樰$ 5y5NuLjp"=ڞ[Yko[ɢV3*i@۬7SieZӛm&<^̜[Mt,_ˌes $n +ʴi , ֓]P6#o@Tİ6SU/&-kkah3TH\Efb5ڗ\EG#8͚{x yF} А\>Õkrɭ)4!Ԑ(SB1}sU3kK8rtr=#'Qgh/[Uݱ1S\߲kfi |JJ7ѕ  HRGĄ@nW%%@bl*'Uvfw2 <4$=({v Xr210#HV K/5W_%[+7-_~Ãu=e*V+  t&:U@7gSNFC1˝f6fC0.ǧ\:w2wL4'{Y\IK(턿dy:d {l В *vrbH%A/Kk,>lj.7GV8+wђ®G[s>n.}EQL/h9u6}CE]D1 H1ЍI)沬C<$ <&#-͑6q8"Dz9ObN}^=59ҨO)AurڱG/%m3 `-P1-{ߢ٫MͭÁ<"U ֞ t@''CIT)Y% OiLl md !w '\)y"ZčDcԙhfjr!.ݿszZ\\V^h JI^8W]M$TVxv\l Rkw1H-^JUr~W69/^h7!f̢ iz$`sY ]ry }Md1U$~rn/Ϟٳ򁔭~ư;( ;WT6 <{uuCpQU.]{{}?reqYZ{,gm"Z7}\o Y/Hb~2mI} U`Z`ͳ ^6gd8h!aɄ,EH#`‘ Dq`pVԁHە!1JM8P7u[vdތ@sKk׾AykOnKmXR;IChO MFV3k2]nxq!&H y'aO_Ḏ&%t=$H}MRu'n<ޥ.y;Ɯ||],]z˜5۫ 7{2c_m,Z;Zf9ӑa^ǕҪZN?wxFh VxC ӧO@;|PH2Z8r/Vr Qi9q9ݣT*JŨTFh2M㤣Hܓt$`!r>t8$Ht#&zJ„z졩=z>–W旖4f[:K WÍZ%FY#] & 1O !M4%3 mЌXlp$씴vtr6JjOA~|+_S%W]Lڟtʟ0ö/=fwbJy8,'o guө2p&1^,ـRm@?ܤkl1ʸl*ps_^[ŲŃ+GIaOt޹*Ȕw 7ӭaufac3>!} k{YN to݅h1֏2j ,YY9v"ǮEbhyf4U!/A<`Y.נAwH.]tS>Hq"}uu E<$:bf5-Qǣ>}MC:XQϷR9E+oy:Xf| Hz@~ӀIi@k5Y꯾hԹjۋlBmq_$gA Ӭ N[WYޕ s͎;l‚ޓO6* o[ޭ7S U7Rb@J`roT2 ҪozѻykF1N%B_yD2v.;m}HU˜jk9>y#ҹGHz/GR45OT ;\HGוS?p+yE̝2g0zڮC5W]QgyI3e|㢿<NЩչLn­txe5~"F8Xh\s]<_&뾤*4U6Y1j~kLxkX{[C..\mq; }E?bCsg岅>N~W)v> "$;}O5wșg4ows߶'W^mWlkN9{A&63[Y:g|A> h;Ղ;MKHg"B\qjyv1p3U4RB "M1Qq7ֹ $HU.FR.Εm嶅&ǚo25"\!Q`%_I-8 ҇ɧY W 7 *`o>aUZs?ȲhGJ ׮}_ag \g'/vqTYJpNTHՐu)@kChS`̬kjf] S3^7۳{N%6[J4- }繹dȩٰnc1pW9H<P;:47@gysikVB[.m\aYꪩ&B_X}*߰n|Gsx 9Y(SmQNM&Cڌ>WT9d+fw ͔0fR+V4,8˭`v{Bfdj9GOԝmfkI!,xst\ɯ>ߴsOI|h_D P A>td2pVT*;=W>{?TIpepIt4>HveV-8xC+noCʟKcɏ>Mn%,EJ!;(8E'ܣzd=vzb㽕| C0ee;FpU wyZWUF\FFǣnbUQYeښ*|9~k=n P.[t'e''9XL͟zBh@ >˦/~[=Oo8"Et&_wcޫt˞M>T+y`v;.[N2jQ1Bw!]wa WY) ֿ"QŦ&-%%J<▪|IԡVʤ2g~r`ӺM-Mkt^{XF˷1gf-_tڮU}}^а^&lM?)E*V#ӴL.c/R*Bd =5ҙ$ TW AKX|R$(=<1w7OJc#4 gv9"]8e2/G| &G^* 0P?0O~55INQK\`O~ěBNo SKP[x[fѼH3UnH'ηnr4Oz2*I6 Lwwԗ+U<]Ys=\Wwwȯ/Vi5G<1l!{9We>9kmե8[ YZT[ NC19[6n+[)*c?Iww');@QB|IM+A{Y~*-0vɜjr ..y[Se!uCcExR]NAe(6$䒵Q/GOYzL'q[nkvR5R5 |IL%2oS6|̆w[Ls-=@-:Q 8֓ɲ* yX[`:*/NDV*tQ3Z- ToNb$ 0{pVW#a Q'ÞG%Q?N@qj(C`0j#! j6DҜi4&u]0 "D@G E֦@,}J,}}^q i4'%p(9OVa_;J4i#բѠ'*q/iKa#@!cF<87y!bd On`e|AFE l?QqgCx \XFġ0&HX|{o?&:'J:$ D$WxmK7P-R~-0GG=>'ÖLhx4ᑈ'/'=IhXOcxs$r@ Nz"No|XfQr6#1{(vG^/'`٘70FbgF @=ǮC qGn nKGACl@wǑ::?ƠSQp4p@ec=UZ480XLv  v@ezC ;f, {|H7 *j2`d10& $,.@ =O,2| Ch-=DT%<@7fXA-֍w]Knt݃EF_D?ߠ/}}t?zSRZfU4QLfS-Sc/@m̀0Ma 1p0   /wG~ `02P0>w,@ ,0 ~0{c4`D_ >0J0 ^ #d͟-ዀqC/!&0rV-0 0`8 >[A~:SvA Sa`>` `xu/HUa` p/`x0|0<^ g`.0qK0tn0 a0`&`'0 L2qZStĎzM3t(?Qpz̸("(vpbr $`y Ŵ*nvklHQ)U]dXFA'_tdGN^P)J6Mqx)uG/A@ZJXAW$ʒj`+(!UXgI͋%ڋB|vԔi1Rxe+h)Q{8%@I탃"4 v8#eҤ`SL(GS[쨢i;]ĮuGXza2 QPuTdjeJV.rqˉri(lx8|/bj2rvRC[3g;,-_ШF}l?nnj**BE<Q(( A!V*CM)xJ{g>4JM1DbSdl}K9@ ˑD:?5*QTMMQB78T;;51} C WuA+``QکtiPs j4fDxnVg'-_xC*.IZE;Mw ˁ64Lsh-pxڥUzgʺ Wxe DcmU67464Զ67ՕJE*M|X亁*\y8[7cdA"]},Y:EcR52cIe'KB*(=U! ]y|ϙ9g|?spqBB4WNFオ3Tc w/\r Kl@୮HWGyEcG+v(bMU߽Xe>Yb^QOfpgre&R;IOKczT;2o41eguNp ?"`+>I[XQty(~d }'d}t%n#akymf%Da::ėjbuQpyc\ ZgvlK#z܊`rblS}pKЉigDz}mQ[>[sJ_N3v@|HH+v:uwPI5[-;ϟyTRR8ι98xi%KER^ 9X:Ãv 1e3YPť$dp~T_VW":u ;Hf_O=]1q&!\rdv,^0WApQ Ihd"b8 (0\quuQpIKKI qL nu3IP~$C 8 '2<*P/;GH?ph~fB4Di(/ڻ!vkt^B Ə ܯ$MȾ:헳YAp=poI{Oh֒R"7꼓H]"2GK3Ē03Ttɧ*/=ʱ?^ql1PÎrޭ';ݞHmS|ݟ[Tnp=Dl&|b/uKmaڽ˔! lhñDUeá{#Zx.Z ھHaf"1lυ{UMLr .^L`Grj\ǀLc@+a&9Eb6m0Zxi:ˌusx~JzQ1Mw34-NBl-oM'Ϣ k>MrM[6$ B&y,wT(Ta6NaXMhQ$MˆƎjJsQck1s'\R\]j_y6jP'*iVh<G>2%K{@|Zf9~:)9YPBڊ F(_d`m M__w/y@dOy<9xSz9:d5FPh.] !6 rFQƬu{nR_v\K.Q89[h0gѥQ`vNe.7zxs/5 n!e :P(\dlw E`f4ٟxcÚN0 uRHLGz|X.Eߦ(a$1ޖtYmr],͖;Ǘ}/?t3,Qnu=TMEnѠQIzEaHq5JHjC` f)aEݷ W'O>e@Ew;llaJP<ɐ I4R@ܿ+?GQ`!EC8ِ {qdׄx_X?j`v|xk-d4ZK\Cb^˳Ctkz#~bY-1@(]~C9U#bN D^jy:ᇒAŧW"VmkʻȆi$># -j07+/m;lM˭o.^N~xaA3%z$*<ЈJ%eҖu*`ՄʕUQ) >.L_)eyv06qaפRz\^Hm`‰#Vqvwѽ?)h7bBUp/Fjvpg0C4uY돝z6`Z`E;cUt⼾.PT4>o[m53*|ł޴h͢wԇ !UR1/-ٶ|Z@\&g:qXCRȌ !< vWU cF+Yn]hxg}i_;pC<?PrIߺQ>H(ɚ &fCd=q'P 1X+[u?(q`]? s&`p@4@T.~!5ΐwm9~;O05&9⢶ѩaԳzJMz+ީH|P>T8X0ѥrH*CddtS!XچD9 yY¹<|^{pyU&%r7"Y+ /a=67*?"o{TZ6U5)XR/~rM"GVUiߢ:dM ZAߍAsLZEg\Lc9G2cGW?0c O<+]!BLG\T!Hcj1W߰W ^`V3 thQܽ9Z\rdpoGU99>?+ʪtЇ[(PG˷ɤ ocPf&y~fD`sc Sj#5/5sp~m([Uub#\ ph p׽9V;r qNϕLXd54=$nc4C?A֊Irզ2LrI6094O=Kůe >J\bڑn 5G49؎cZ)tN2r:=)y'ڂ[oA_wAD==:ڪOMm[+<ӾSO+/&E׼n| )+=IX4X=FP4 WD ͤ-9L!I|JO#CP@FF*cD·rcg 2᱒X;wu-^`3DLxYP1¦;qZ*kξP(j©{ ĩkmkzu,r 5fw7#Qt XJ)CQM$r%@6g=i:dnَхDzr,ڟ)Ix埶e`vmj"f@U+Y\r"lܑb,!o8ukLڭuAT ޴q j endstream endobj 1095 0 obj [ 0[ 658] 3[ 220] 6[ 573] 9[ 551] 22[ 513] 25[ 634] 131[ 535] 133[ 469 597 531] 139[ 314] 141[ 592] 143[ 890 604 569 597 591 461 459 365 597] 483[ 280] 820[ 371] 884[ 592] 938[ 592] ] endobj 1096 0 obj [ 220] endobj 1097 0 obj <> stream x}S;o0+<%$R PiC/4Rq,};^etﻷb\ck:V7F;8GmaטL7;kW'oNkSA_:wbnNk̎>7GkacQLC=W 6^kt,>N@S2pWYOβҟ<g7sI|y) s#X$0%D&5Y=!^J^f L d~*(f #Մ򗔰X2n9새RN;-s}BD#qHz~)TՔz,᪤i`U2ƪdL#`U2!J/Z[Glclk{V endstream endobj 1098 0 obj <> stream x} |Tյ眙dI23$!C3 2 !Qk:mظ;m} # ]WiA2b>t;g_Xlz0Wv[|aCߌ+DhtL?IEBrQ a\)K>)?#Q(gq^Hd Gre4LmCtBؐ )&٤eI9A*7n|BUOUbv2-#%TCψCʻYL Izpn~=Yts6t-0nPvf!Jz2הLv*we=@]R7͗? e-$?-~J1UHyTa.-Tn*࿑6By=])`Ds1˿IЂ8(?CYVI*u)s>uL(z؟.ӏS9BA˵OW*~+_LJ2tEJ2%oQ?{_X}2I:Ks:*Gy\#-gR멒=O<0hȃ#Deҭ4OKc)_n-+ߤ}uYkfOumhO,= ji%3 q6|fpi7,hP"e(bQM}QNl_)pyEEF>|tRF6K9 ~@?p p luV-{')<i-S&MV y'0n᷎r* tmjfX5tPeEO֨ ~$t/hFNxYH cgeh>^YJyx_x#E(BP"E(BP"E(BP"E(BP"E(BP"E(BP"$ Cn&!=TR(ZeDBSi&ͦŴЍ~@0=Ê7(ծ&jAAQݡԽâ84oD(oC(^Q7[=(φy_~Az`~tDo ٓBOYOYcO`2#%Ģѐs{_.'KU~dgJ$_+o{Mf&vJHLQMv9wɻ=^NO/ŐVFh?GK!'CN&h,WNBN~ YC&K!0eo` :0vJ;n7"h5HVK ہ5W=>|?!9y+aȧg?"߱Ko`A^jT:Cձ@:C! AC{!7S_vm:]o y^ݐ l޳ YwuUkt^X˖.imYԼpAyMs4̮52P1cz)K|E'rc]icRSI-!>c2YbRڵژ6T:.Ǯ Z'^ɫQbOVe&g>v\Z)xf M-n5H~+hi-nKG>ՠfk-5p~ F*s7hdk:2yjmB{j_dvue<5c-;܃.YٽZn|%jSר< P}\7XzփPY*>%#&Vc}PLN`W\4ݘJF(mky׶a֮UC:Pwakk8xA~ZKZj<7C/-vkc`(T˻D.#=2Z 4 Abb0Kx1VZTSG $}yZjk\bT2L 3KOKQBO}tY[/j=:Z=Տ=\v}RQs'K--jW0악wܚ]f,Lc3paE%n7Oh%Z=J 63q.9ᜑm[jb}^!ǡ D1ƿie'V.$̵/r-+ <+ՔAWyjc;'+1~RMcKv¹*w9 # I +m u\#<&7ή=fjlO [TDع ֪]|5F C'j.s^&}хދ~֮%Ѭ--F\Ǝm\?Ű&ϭ, 5-LB|QjTc"ldhnLktr%l[\7B1BA~!gB1Uj{[=JiWN4Ym՘OGO];H8C2gaK>j` 8MqmV{sᒖpgsˀĤ궪qk9Jʍ< h:^Hwb$laCn 分x89[nս'ȱ' n$2u'@)RHr,O蠕1W?lCp55zFU/|UpvaxeZ֮P[+_o_ I٪x:XOWp{n7s{ 6O\_-bMV 9{˭,Vglhy7oV-zBk`1jG(Pkf-Z7ڲWx噪s:M9֐S,.cs Ưaq!Z EY:T},VVr'ƥ[:Lt ĸLϟظ͒o(B|Z[΋m۴X(gT(y_فrx5 QgN0iQSvzXXm\iNᵹj=ݝfp%g!~y!¡ӱ wT1.T+*-Q7W{GenksU/aø/{x&>x$%z7U%^UMjH+ +__ʟʹr61 +ʇaa彰nX9V +'ʉ˰rX9V}a厰7ΰ#V%a5V愕2;°RV&b +Qa',Gg?-'M_W/ 3_G^Ai /c?"~ W=|!o| UjHm|[_)%x'Tv( |`p xx x9G+T+Bw ^NhC>C>C>C>C>AJ]x%.(꡷L @xH2ׯts릛Я`׀].uպmצ\z-ت5`]IήlLz{30H$ 5^>~J{!i]c-@w(Nze|eIa(q2MSnn&VF[W,-jHp_J+!yMS {!K 9ِ!KrE,4 9AauH3J?,c)R4+2ZH1brX?brb19)hLN &'dL44҃HҀ r#c -b y$~^7{;iC!BrC:K 6 S ?TO2!Y\=8 ƱcG.Wؘfh@;hq_S&7q@"3:.ebсDMi5&8s&/SJL((?p{_{wOwޝ}IԎvjG\*?lb1잯37.ySO&}")Vp_xYqŋc\L8.CqSl-|fl3y*r kpIbbrv@ɽݐ;^Hvc/c"؆؀l@qd4^/x/!"B& oϳ {ֻ8?~ +XU?6~{ ..N5^|߂&]eY.v&}lJrX^m̻ڂ&oc۶ggμ;[W˫t;\SNdęsZ")8)y|y)g| : &4pKOEiqe(<`å狕>TSxC?sTTlj2iiEJj*ԽQn#&>_ tiKe 8 gp#p8 |xx8N~ 92p8!`' X ,Zh l( I@`S`Mgg <<]__ ,bhH`cG{{[_ WUeW;~9͘X-$PR$?xaP:JS)i\qW2}usfL?ay|} $2cnLʢgޖ@MŝeQƤf,oJ1}u*eUMu xJUW)gwS V\< |?ݑ|E@B_;UTnUQ/muO!!ǻfgRrӍNa>!8[l+-~5fL 3E1qYnY9{NfyȲKYkʏ-J77#fkqKS.]"jӒri_ ך70}ڥ)t 뢪nio:0|Nq`-X!;R@!LXRXd)#%^ $fes_f)%i':LJ*D8{mGx.^eug(z8GW2G!"7gGD^+NVW֮~xٜfWv0g*yyЇ{ Vu 3f ka^cUZ""_c]fHDJue} 刷(O싗dgO,p~zc2Qdb_w8!, ~HQflx g2D¡)Br Bh;;|KO|k1׽zw"krVVn2X폾CW)\[~ծG;6)sݒQ|L)ax0`JLI$ X)},ρT9/?@ME G*/InuffaLL, #|Q=İṨz'bRcR-}"zs3xvc%ᱻgS|+Ԭe㇎WNؔyY)I4i/fg^dLy`|zڅgf =|Ѷ3jATsuRR-^ś,rE-d9i/?fnؓdaNْa:' ܄ C5ZӜp"fВMr8/ qR݃jQM{-YnJ̔ϐ8ChkbbZϪ8h~]MU l_v~XK3I@'dYި);beZ/Ϋvr1̎?J~NKg]t=jqNZbL3;7>%RlQl/f^kL?I/ҭ[zzRK]ZR[7y_clo[`BX AVxB2y_Bx0'Gp&ΰ1oV[Ujb0.Uwu{99?w?} X2u&}\mL1eU)iTIaP(F!u+M_36F~5Vs6уi41.%Ji5j5KhQ"qڭXGE(5PAv*n6j@Q SdgqihSئ۠WխUn'mU9bZC¡ce}ʭbⴕm&SÙI6eMd)/w!6F̧kL1s=rIlWm*4jZA˄h;`ߔ`h .@k_|h/|;#c#>ג;VvZe?PjsZoӬԄJHt}]̝NYjeu :Q% _ ezJe 0;&ƨTUGtut+pbq >&1PF|a?Q%IƉ .'|;A|WX"b-F;S!R4Bkhɋ3Ӟm2/ g5T^k "<^4C A*Y\vB6r -ɛGZDQ.'0pNt)Cjʏ9V6wfznoo g>=BO(Q D+0 PCRnt^(3^p]H{" \FD /dYQD "iBTZ# iMMun]F5|2z|uuC{=e+~% ئm=RG*n-?t{{.| '3IATz4>IY1i*w "\6mMf6K \2(;53 ,vd X6;MQi2GɈVc'g VLAo'|? 4U<|E{^,!1gt#'OxXYq y7ru{[nCW᫶^^WwoIOm оfGXW}=G.욭̖+ZxV`!6\qfdDa)/CרvhG(hxm}#>_l$ϞX'lAVhN/)dB}0[ZZs5io'vOhoOw$m8yB xJ epR$:Ff.U hV bI > [$%,dP-}}\DAT̨J5.Rչ$im73G.s&G:]CL0L_ZeA;ȇXFLqeJ̓ GH"+>#Xi `Do­ ߪ[5Wbkj'c0Hn&'Ctc F '>IZB6mH:9`%!} kle LQ"†UNel4*tjs g,̪lM7`yvM6e/j8-E19D"D\)Q }Awd ejj0(G_EڥOh:3 %K785.->&<<2B2x'R4T1fʮ-ͨ*NC1;͘*F`wFZ*BN X'p\BՕɱR`5_&B$$>Z} c,d/jadoT$IO ;XN NzF^x2yYM#֖PX e%cq5!NagAr29(R1R r4a$(ɶ(#߽U Gz]Witt]ۢ9"}S{,6&_|wfzx!,;˂|7B㣜߯Cwg$a>vڭ2+Np@$EOX7R,&Lj ,!O_BŎnP~e֩*t 7&da m"ur_W~4R[F^H(_~>mgnxr}XYgq^TM ⚀FRNUڄf%)G|}ozhs`Q7>?K6 "* ֙ha)焕9PgښUFWѪL2+ "~XZ{[%=^̓fEss2u떴oc)sĩ?W<_ZPȱ<"R|CweMn>^'K, :[F5 &_lT-mmijr ,(SNg <i:]H|({V&9+]4#!8Rg( h x<+Hu,+KtȭrK VT'F, 'ҢJlGGD.׸%EڊP㢯[ n Dm9*u%%c-$&bQP!&٬%*8͋WX?T3*})`jo8/BCۧo](-,,l:3cslɭt=uw J2Z^Ύp=Q[alty6u'ܰjchymv ?Yٶnef]՚cD5,{݋[ _h& ctPCGt(݄V$39zhdj6 cЬФ܍nK(c\' I$;-zfq$U/jO `5>,’% k81 Y̖m~n7/i$r 8ͪZ3Q ao{xԈ ?͸F7Tu-!HD:APvWҩ3m e.0-HLIaİ9 /x;N._{p/j`%smmRP(*&"[-0V-b{*V;ܲ ao }ksQR٬ThX<E6ZPԇF3<},h?wE&XYJhP=]F. bB/)T/RcӠ/X ֟B^_'60UZ5^Jj~ /+lQy[ktyղٍǦ)%~?W"F p*0%L?Ԣ~Deb *Hpſ n r67IJīNR/:` #,1lygG.Z+EF5X`vqo Em ǶtojH3#tjHEbBi,@,(p)pd0aH%]v#>VW+wE\odQ 'kVmxpP X!ؐ6ē6St84K_"$N`?E1Dep&Ty"p؊|n6@fœ yrUS|$Ŋo AL %KE8ÙhtpEDA0~meo¢2G5 ^ 6zG3SUS\޲{u `-.hKzb#JtL*i+4>=ǀ}ľބ($"xU8YLVt㪒T?a3ΐ7~wկҿѻr~|ϻ?}؟gCՇ<_/GeZA|G̔xN"`jXyoP >tJdL#f;&(|h`EaԉG̬B w>Y{SUW i T`r)P,[@nŹ=j6wm*6حz*bGoٺoTDz~ϯ{ OY⃝p];01JMwep(xAWH>%)UB)NgH mXjPekx6J<ĥUxMOiԬ.1UEm2ɪ`c.QCsJvVp nɫU23dmcpGw]S,oŭwܳ{w0Y-\kSn_7]19cƏPLdxfRX6tfgtVfabZGi#$xJQ:$D$ҩƬjAX.j\hP:ĒH:_%DZ8oA}Uq[[:4gGUCE _ڲ熓6AZkQr,q;>A7>ULJ tdXת#!unnN) H'Sݞȁ"ȫ&EZ|A46&./k@c`U# l5YMѵf;j(gW [롮aZi_)tݥw/][Bm؊].}z1dq7UlI6 o-/=vSbskmT̝>&_`,KC" COVRC)*@TZbjG)N8' o)8ӁaV(ͼL:'474SFJGU%%CGIm 7Y6(Vc0 ~GtSGSl0<|/bMrmmy)2]pcYh" ueŧQP9LhB|P GW[RDL`0H/nM#Q'rG kV!oX?;( +W  + L0 sTZ>5N}ғ,΂ AIY,[QyNpˊRg.UAJ ^Rx]%\Wfg~wwZ\I]aaa 'iTK0z?nh"sEj>++L3ф?8\*t_\фgZHB㋰,F7f dx|ElZ2j);zׇFjC`!LLos**2 FƄBUf|AY K5N).ORaV%q.,*g@Q)z"x}o?g051+~;34Jsh뛄#D RnnƇ͢3vO\;NoeЍ3Ad`y^Pt&=]Ve(LLɰT *&P_[c Ȑ>čҦ5VoF'zv9PdI.W/70bd17~dXdQgz٬}b\-Wa!= b raaCSV{6rJZRɡ;BI+}JJ-([#h%6ֆJRU*4ŭ"P>=(C~BvVAm tH`/m3Z;/_ۤ}Uku'H9(JGLzw_52NGob+qqZD8X;Yye{ˑTJՐ6jS+@q{\+<BCkH;I4Lr ->ai=z^G !(V!L £8匁'igPflDŽ_8n6YR.Zv[?4-IŶ%, tȨk𧄅w3vli: ibB^ko4F0O_:#xTˢq}<(k APnpʽް`kG_~d.At=b3G?=f;A]?D 3X .~"m+Qx#Yw:;CBM&NQ;n& A |\;J:S9Υ%\bX'bBsZN.kզ(uZϦ!ą?=$l6皌Lhj w$t 5~?}VnղEGk)Շ{;]>{-F4۶_άIdZ aWpE,MR$I&D995x|!#(YX^L1kj*6,b[3HHFki ΁mkK[?pk#{ggFֆw;fY/ t@uwx~i)KϺ˱Ȁ6uO{;6EGs+ Eھ jIt|?,~6o?Kvnv80Gk~5AAL$HsϬ^{mrWֺM,;7Ͽ,"vm5wͩ Z"go/;%|i$J\PD!a(nrqDř#(@]Gnwpܓ? 7(S/.8GB I͒lDgׅ'CIz5I4es*m.Hg/|ND>L\εh<LQ{39FG[,F;gqiQsv0p.(MZ&×re4ZBx!#ZTv3hXƥ"zx͑GmSzrW-Sl.+ęV1CKSl6S_@6^ʂh؋r5-IOn)nM* oS,ra,&EOz }Q J >N3gcEd"(3 ]q&3}RNeo%B=+Dss@q2%Ier⌆im = tw7j?'4 %rD 8 @+EL3#Se SZCH*vM2mT 67g3-)5˜F"ټOwg@n4%{jǕ-tD3]N$^1ݶ ?(Gl"7ߝIzQ Fڬd;F+.hW` ("uPs(]؊Pj}(zLt. vN<1sid&韴!F 26p]3n*b;qx| B /KlvC lZ}858gF.͊ kSg LSST|bNE>g (싼4:@A{_je$6Ӓ97(N؝G?yc{.1&IOg6x[fV /l7:EqVVMI5atC}BP&˘-Ih$pN)-D))$ IҼZYx XLgC֪+f< lcIW_*WwN>.4&vB9N'VYf]ֈjP[m1m~=8|}?tO?̼~{W~/ÿ iׇ;E혁qv{3AԺf\ƳX&S8Xx *Af5GS/ME^ m.llTc[? >9V9a$cك_nF֨zv8=arB0t3YI<&PkLs6MZ꧅^ȿHDVH͵>3kru zc;p@q7E2ױRK[R %+úv!ۥN*&Y\q,i"=]v]& ;Y֘Eb61f:KkJvZ'ظ]CD4/ؖ,-@j㤨֭}ߦf/faDdE0 F(#(hb3&ŨIԨ\>Q_'BFt|L4~饺ܳs97댥#g݁Bc"L۾oHLtʼnMٰYݐ9L[[Lϕ8`e{.]FD \AP(DP$Y:Hq;Χ\d~Qn}fnh25ۥ@f;&jNlϤ{e`eMЀBBԳ֥^YpZ-}2OKwˢ5 dk)ΘݫҍwzsS2iˢ}!;^.eY)a҄ I?T2ZJ#Uu0QjdՔI5J٘e s5A251-O?Y|WGt|ILX ǡP]Q'.N=?&-Ίk 5e΁Q7har&θnՌc~h#,9|O#Գ~<^r!K߁wUfڕ&d8JF %=7u]r 20ҩ/7M`K(gFA(&ZyWTmdUJ2O{.p]Ǽ@tj /ʱo`k@>\b󡕪\'KU`nD4W"#c2€u蹁ch$ jtȽߣQ+ DSҎyj<51IVI,#/@H#&kA.N KNBvkMK`\mͼgmv`gΈ)=2TZH9 V6E@:+ZL~:Nm jF8Q@T(Q* AfG8Spv{?99Ra)KP}DVuL!+V:SH2>pL, VB4n4+veRKtTW &eckdy3j–L'ik&@n-.4;qxLiÄQb5P~jX臄$(*2Y]ڦz3j>vBٟEWHr"hb!Ic*+~)l|%H\\Q׹)=ֆLQH3qN]|LѳV.0 7]ߺyT[ňFw3=*RE *N9pG8hm66sTQ$fDى8?ਊu!=yru]sT25sa[o_2eZwnMx.q=9]1KE~xXMhOȩSIQpq3bu:0<91CJ%{M9 {ZkXEs傲q8ZhUATB`L#Lю2Ri8%8s]݋S S _#LL̄ y 7s5$ jے ypT"G4 F\Nbp=viG,fX" >VsôB(Ղ*l;,EYۦ}{O΁-aO@atr˔>PG[72u*uk-YiNL%/abv8!Y=Y0 FSIc},YmuUD$2] v'bU\ .Ka{2 ?GMD'х$ʤqiFL.vMh4RUL;5]S֎t:u#ՁVGGh)∅8(X'-Y Dnkk*Aے0BPSgQŬHL}B)jE'9'הpLdq~Ą3ԘS)e&6`3rt\ݖ_/wAo9nF^pǃ;ݩK6Ϭ͌)-Tnߊe\ܼm0dqJuXesg7-uLkyol2y)2|.Bd )Hjx"#0C0Xu~Z=\SI$͉ )JQ<ٹ5Q72CwFMl> 6R;'){ցH )FK<5.N)hKJ#٠آv"-bpGǜpnNon8}VA#!4Z0QIJį4\o2nN9Tr{?+YG8`ԙ6:,;{`sm}Z]019H0!+?Z~3Ƙ(xQQ\**~kIO` `YSZ4dc(9ŰŷZH[-4[(X/"~ؕݬv} s쇂Cᾊ1ElpWtRR,f\*`RsނJA)a%qHVNal ,Z9"gleHrsq) v/{ oE=ֈ.љY@_1eޙ`֝tߎ=d-%4 (E,}"022= 'A"UKВhIQבX fBlU!IUD"*5]K_UD:D` aeeXofϷNv{:{ 2gnBCpi2;_CFVC62ݶ嚫鈅X@XD1kN!4a !ޤǤBIN=`}#f=\69j't"td  rDwB`vE4$wb.ejPeͽ-&28d,k3ِ`o1V]wQdJѿmD(| 1S"~!hIOZpUH`/[K=b9!n؉ hq,}VG<= SxJ (003}\1 i%g,#f?Z$q !oh3!sDr R#`2:0%Q"a#m:n0#EZ>_y2I씻ԥ+ZuSnvɕtS퓦=5EmLm"j z̔e; ل=ui?Tc{ړhIaGw?'%zN}3 Tb#S(0:% l.KI成JdSG4(㼑1gSєM1-\^uPVi0QƄAJ5Ke|QIH1ӁʜNldCaOrUXƓKDB hm/AΓDE cbXSڋ`!{)/zFbu@!6x@grSz"!i "/څJ 1%0Ǔ9a?H|lPxtwn2plր'i-'jcDZ ꀙ 7ntD6"^ 7;e V[i]oȂ6Iӛ *xL =N$d!?֓Pb2'^R@A))ň$U|l$FHbxi9ck,vݤƕq*>,rgajo|2k)IkO'NR85MU #u[;.)fC}rdDZ><_S<,gB@>c4Dj:ؙf gre6I HD_E~ۄL!NDlc)quR"U*j_}at\a{܊:ӵaWWrIԴi7LmN\>k!ÛRbM$z` j9 G$rYacJ|L=F/[vZ%z!~]n##U_8n(Խr al"EsF(@z][ŏcb %4xb?+lFn8sNx Eov}]X*Oq|zњ´L=xk:4K;j%̕oY`5sXU$=p_Xї-xy h!Ab}di5$ٺג~c_ 0c{ F3g0)!DzC YיggGT-2V ygo+$7"nO=B[IR,\avwq\+pUʎ5>z/ĖvY/~ 5A"z-MIJlJa@q>!d!W&wjKH& wY,p9,|$yU!> b›>]r^40~{mXa _Şm8о_2]$!=<&"ā'Im0ȤwY' {8SKiHqimJZ崲Hчb6ۼ;FmӐmFSyyP=gGmI 傲#ոsK.l:1Z&jG@;omLbf.Rq3Tce66lWv uNMߖ[<&ӲǮ _xQab?ExSj HYVBbR%*eR*l Xn+NgNMZP57\0w6˙P=y0J_Û~pcdhڢV;3h-cTN1 aI#,aÝR8G; r'<_'Ej;D"!4o׼6;/u6]ȟ|#_)2uG5B(b;9f*TX&Yl-!5_ aQHP!1)\ Ɗ lJݽ;Ӏ2aG4{G`s~P piq}8U_CPk!? mSzID*Aa ɤ.BzPZ%E~ 6tՃmPZkY! 0L8$xJ8I#8t-Wty+5Jnx?+%cjQl&TIW$ O:NHZ#66x@,Kح.?|s-ky3E: $7-R.ʠe1% > gc-cwF -z}"^ RA 4Lp+E!꠯OݵVjp[ϭ[j^B'Iܰ5(R&[riu*W_u}x?`뵠zJ֋S46l|!;یvl3/..L;)TT4?-bB X-O*eSI#g.ʰlHJ O@ IzE7o?z9p82srQ\RXCx70P1o.yrƑdk}w{OQ1>b˅"H„(rn-bcQc"LB-JG˾yQ(U!F+`~)Xq썥mV[;$_|f5"taS$ e)zSXȥdqʹsR2{Z*ܪX#2e5u,WYX k/׊#rS0|\W.J[ʕQ3W{طoܘTgI_yxo=15DCzVl_8չs[q6J6 L!d'mȉr%L.huC~1 X&I#hcnnz]ZGaVa\E8gqWZv~g{77\W_rjx0Es[DZY\d׎o̿ݦGOkGFEټ |6:s:fltŃm6fP4KM̥6~s Oo;S׌%;v^UpdnfopE˼CCpf; "{wۺPS;u>1n3 7d6{ظ AnP0tWcwe,fۿվevI=dұc|S+.;zOꎮ\z߽kvhuȨ)̞S|2j<3SAD?wV&A=Lf Y-㬔{Z="D_a%;Wi h$\[8_!J*DȖmw=/Xoϊ7\*dX\훝+[[/o8sŒ,kEl˶6&ǎ;BH$(bȖ#q̖P(C0z@B,m1QJi\t%)sd1 w>Oљs̈=W~57{1O2J6XiUmϿR[wgp0iщ;2"UH:JϽaM@ٚl+MT7&skC#~)ч%`h{":=\v'Y9H#ʍ_Nr˧D,T銒/,ZH[ДZroDMlm%~Z0#b̰lC>%3 ?h6v -Z@~Hc97+ ;#H~A4jO.Z_K;II$=8%5dB^b!yw y|^Xr9ݓ1ՀG!^fPs>$ޗKz gOH.T~L4Ӛ;;H*rli8/^~ω(8NɈyVfV!Bdݾəjή++AK&6pHob's4f8AY)dᴊ*EU 4e dvYO)~R, s^}͈~G[2vb{׹+:RY_z;vڍԻUmcoWc c&`_B@T KwbJ1TU'u:>1C} ~_Ԍ\^=k;:-A-$}ޗ֚٧Qf[${5SZS37Yu * |Vk05x&8%`NFaUb-= \w읣u#<6R?G}np9FK l.{*RiNII@3q3dƤU-a7l]P=kVZ]8/nyq[.s쇏|Gב3@/> xF:2 ?4bb]ɀ h EV 2Z*uᛵVThR̞Inֶm pFhU!t%Aȼ^\ЂWp,-M?(ubMޙW֮,e%67íqTL * N\۹&ڈ9Qꭟ!PUkbh,zN)[ޗ'`VjbQzxi Od_rFwC[%&lG&NJ9fP5rMVY6G0H$Tԭg-3W[KL`ucu O:AZF@bQ.dՑVƲbe:+K@~+?_+.ݔn` J њ{Ra2=0i0zϿq6Jf`/mNY3mi~5QhG1_dx*R֚?8@ ? &)k6>6)ML\ ^a-@u3n0KɈ+εuu`6l[IU'ט&N+5[7ފk!X<]o/ɕ.`cNqaԓ%%E99AZz &3gJפsrU!J˯%yӛ`#N/Uޓ/BQb&:)"PL90T}HTGGڎ?ԕI"lRu㫝"?>~u}ɯU,o0Ht<ݰ9".߳|s{_S0sK-6Gp--Ur(Vvwpqc YpI0#,ڝ\-_c%)jAWHV[ HmCScHcQ#0YZZ$ʕ!VcpY>/p&0ikce6YUն%6}@Zp?^6oYim=)l@0mPR!„2*v5z4hF4>8o*rm.r6 Lw+ƟFcs3 '֞mHGj\8og1Mڣ=úr;JjC gxĚASͭ-\3hJKQ 0]孚Zj,mV|MϹ-;3ZQlmz^d]]g񎎥ǗMGҢVۅsikg@"hHެ]"B[ٹ#KL%,! 7Ϧ1o3) 9"UhDhZNaɫ55WK_qh^)d[v@O[ZVtw{:.NY W/9 >.[:roDi$c#ЧvUQڋAvFў">k݌;s:ku Y?R8k9^t8XT6,%Bq`gu !"nеܟDrD۽R\\[x佦}<%8sV~svL%b.sQj=̊_C;J6JE{x;+'Q$SgIͻ<ge3$n!ߣKS|^_I6њZN yVK4pձ'%ZS-Jʝ~_S'kOBhK0w;dWb.LQU-^elhwү7&uieN {R|lչ䀫̠wpҾaoY^ZW{wv>h ,c$Eu?^~֝X"9,:*@V$c<Uaըa9=a< tVDf@UUYAK[EoTF6Es m+ ,S#:kqs;j>=`VYe[Y =ZJɥڐmB= )mJEO)d|OS 2e܇**Z~:?@,Ta>f [4NyǃpG Ck[+~]̕kx{OC}me~P+be^^vmUp޽/zVpɋDVWϹٿJnht:f8g72!1y²r;Ѩ OrNkړ51x?ovTaTzHk]iXs5][ru>%#?vesZo\Ұb&,SH1(}?z= d9NN^\(>Vځ[+ժJvm=^5񀾰lE#w:֮dϻﰘsG4<4Ȱ*T"1J1%娜=Y8aY9& $eT ,V$4i;YC蛞қ@:W8rH?J/RRˍE߬ڌ=3ɥ7$7SRI>ojZ/)/}-ChyJ,i򔖡20OXNJ-,)P")" |k.w %ݛ|6EYW|ӘY}YnMn-XGP1 =Or05*bd48\\nPf 5k't"(F-93'V T(t|5^r%.Ƌ3WG %;5+gwi`l`b@FTqH5xȍbX8<%G1 e>[=giv2V,fW|lAJ*E rld)NrrrLV`R x&`B'3O[ 5ڙ}Nqt%?>#/TU&4avOz<"eq (\5aURJmf*PKT-vԦrkw ^y7NP_ddAI4dN.JE8vth P|D,O~!)Kx2SgeևgkwIِƒWF?m}% ՄZȽ, )UeD5*CA1mXn@f)^X|Y1h WVnmH3L6'UX*)N^]o(ݒ[w<&l od]=%_=Vn6ٗ9 >FLʆVh,`QD$aQu9e=CyleS/ٻ6lw"ϾC߿w0Ǟ<퇟{yy{ApaT /)g!'i%8yfCQ !ΦC߄}icMnv;sHlΎ|{ukl/7I"Jʴ )+&H[C82w֞S0Zi,UY'olLRbM7me2G$숢^dsj:ɣTDW%jSuڗՊ [euHգy1=].nYbl" $=%1R&6͈ɭi,> >MkjW5g5}#c~E v2KGfk-ltU96䕺\r~sI($ߪ g6p]6Vmr-!COɪhY wGv;gvGfss鏁9tiNS.xUEY25W'}t؛&,6]dT6=* ԫ$_bSsU>ZP0lNkȗIlJè4<If%ے-Ӿ??>3A.y*=h4S$6+$y0ic^-3A`G1C2nFpE4WMYM bDos&zD==OOK=c=]ݱkkvygG>Yj}׿bݽޛ{6vl?@2 d @2 d @2 d @2 d @2 d @2 d [/D_EjHB#ie6ie)wi(G(iIu)ڣ|OPrԡiT*DT|ZUig.3SP |ER|Cڃ|ZVFT|Zv]iȧeȠrdiwU9uV>B9|ZHOgz0aDr4MLӔ4MLӢ24-INLӔ4MLӔ4MLӔ4)W0C1Eq%Rh y!WvB0y ң=hG|hJkQ퇠t>]𻟔 @0_o%Gw õ!Z^+;S4Ru෋ וg>2+#|υy6SK5s!:*<_jv~\òC*Q3)z?Ei:)$H#A>ʣp(U!"(IQ5B>[AB;dJMG@j|^낅y.c $<AM 0FCd1W cZxVjCi:R||ǜQX`#)떀{+iQ bCO#DJDQ>rcx &^xM F0+?+Z3GgMgwV [m#c>FwHv%Q -McBy+4y2[GnBq;A[C{`|$'43n5(4#$'}c0Eá8 (wB2t"@ԞPdOĢ.@$ YETN+Nm`<)  $- Y: &C1kb0&ph~Lֺp>P4GPp4+XÀG/X+X(}X/( aqhPje( ;cX;<HbAF#D:X.(04:v^11w H?F%G ZMaLW `ؑ^8 ٔB8h%4jh$p/W 'A+\B ̀ U/C;N]$}<$PQhxƱ F*qnO2L4* ^(cZQ(R8; ؠ# W56 rځi Z`h(ۅ5Xtt_à+nօcQ: Z+>H4yccc!)zсXpdpۗ ^fDD uSt4e-p+DeG"q8Vp~†q[;q3N;u@&50N#rGA4v`aC gÖ'~L$ZA Q耺 Ea% 68p$˽ rc(WFO0`(220 ű@wgQ"pohgtOh?3rLpOMT a?oyG| ./--u^Eߩ"M>H CRe@+ mAX@D:tFHd@## 2 2]TZt ӆά@2[uL}C70Wo27з'Mh? t s|ncNY 6 Fw.y]͜`71'>fya^E ,ղ:\=$bϸ8\e?pbnrE8.ܥ\w6sq\}}︃io?>gwSʥ<)7Kb)#C#1ň)H)RLRDJRF""<+RDj~͏>q3G3gy3`7Rwd`7ؕ`i`k`2{o`!+RyW].+vSu%حv6`*;>C?a88v`U`&n݃'gi` v>`w}ֱ&.Vv1`w@iv:{حvV]L5#yX` HvB`V`:;#7&`u`v7ۀ]=kv'&`;`NP+cC2*jcrchS]v:{ = 6n` vvaX{+_g}6~ֲf3]ЩvV`v;0{83 .ze6;s$ `1׀D`w +vݯKM`w B;z \`W슁u%ص7n7;Y`ϲ1aˁ7ݕ] {2`S`ؽ Aʟ9v 84ˁt`w[6;AF~~vn{ ؝v琌9``vn)9^v]4+ZsacЮL!vK#= ^vC/h%,zOvcg[OS6`W vq` = 67݇E!dKػBn:{/w3F`$f'4] =v];,!C"I]2~mvvB*h皘R#=ȬBu G\^eoFm0Zn@?aN!~~qh%GOpyhw5~݆OpI^|{@'a+Wدs7?.4:e]"õ ulAn W{ '% F+8}]X&GƎېK$D$t8$ߗ(#ҟ~1#YeXs8=Rx\ P*-͈W2\ 7Vuby3gD#^&IM+N7eKSrzD  h,kjZFd6%H}F 5ZFTonnn_@K45f\}d3Iom-{!-S[iUqq†d:#$ᲸEf62rNLEF#2J2-7k7@1ڻ*Оﯡ"x$ۥ0Y\@+=\ZZimkT:.Q4M+=lΦu$iZ6`l`u:Ꭾcs\ǘgɜ"),͆ҎJK;l0BFf9{A.p,fRePGGٌykEtM_ G7`DR92)ś"5<Ȍձ|z/Of fjkNnz^(3>aR*+-Izj)B{P.JA4Y7E{hU4yʁ-™L̫jNNNAQf#6tz%MlNhQ& ܲtd i9d yf:2C@KfP/f*m*qVK$$ P=?27Ѯ > X!(} ƀK o9-$ :--KӖ9-鴦PR!ͤהӆ֊wx4=/ZC1t .nӬT`pć,R2/\5-I:nv#EIM6iW"1ēi>ɻs鞤G3a+ӑ)!c1aܶo?EvcQK$zSEDC"^T4@3gt=TZƢB -!wNٳĿ-F(>߉~^r>{IډWg̘6mʔ4ZPt?=(*j͘I**BED8}qMq}:b0 tnI?_۠ӖZ" ( %aj2b#9vd$zvq Mp,I6Y-d1S"$I d}MMQ@L%ťL=۱ A.oԔȧ&eci#A€mFn訍,?Zi/L ePv(d9.Y5!.tDIυ8hoJKY,b HC]i4Q)l]0gˇb!ާʒWǯY6Nv("XwCEWm÷d;!!p{zfܛ2#NED G!F !^P4gBzhF\&l5ߞ=꩟\$`vr~=o5J2/ĵFTK|t3(1ᬡ )>PKç%矖b)1:(1V*1 1>Ĉ a F ӒpXm*QV*CafJʘUƜQDZeHυ3 XʘT&r{2D`S&2P!kRMR$$J%"6B)SQJRcÈ*}Q1LDS3!3al 6B8l0Z1c5F5L0!0T̄ ! DTnV)jp_ GGDŽTޱˆˠ5eKG Sb6'jBꐜٌ0Tz zF.N*p$1B#$1(i6stP/Ce-Uܻyl\[VVJ&ɗ!zHsnJˀܬ,Iڵ[LlR55(i/iJJ-WSRxM|v|N$>%~U|r|RrR2LiCh!T: Pt*{Ћ)M޳NزD4^MMn.ܕLیƥ]v ŅdW%nCt$y2 SKsIUvdوUCXXCKeX6GZW0>Ҽ| ÄX=nEVP9L؍0GNZdrݻБzň) 2RCU,p+er,\ (Џ3f6 =5 +s 6,ff2lKu |E^ԄN---FSf|yhf .7H4\4F߮߉~#B⾊. @?+ MG;t=JPZR<Ӳ8 SB_TTf/oуZ-v>.esԱmԮv}=gl7=BmړԞlE5lj'R[Jm%Uq;Ԯunv +kVp;G!jSCyb Fj:v P;aA] MP;RjgQ;rjQPMm 6BbԮv%Ԯv#[ mv'{G~jQ{wΫ6s5ybZ#6jEjUjC,36 P[Dm۪+өI ԖQ[Ijk^Qcj ^fJjPEAj34~Bm?&&ZZZڱ.|)BjNYYxWBS9UVS[Gbjuj7S mԶSڵnv3ۈ'.̂@+ ,3gA̠0DyuwwG^@Wg_t̀;gԋ -d YՓ>_7=sޔ>vg?E٣0{Gv/oFŻ>#ݣGG?wGQiAvMIw[)xW:C)V$I"oI"2zU^lT~m#L&TgR.υ|Qz/'53{YUxfTo'ݪEƯF/AK`̵' o\hڋ=#Ƴѳ 쳞߀ݤX[0= 7 ~_T^C }Qy1ܻʛ6z~Q}&`&LLh/_5w^w^%w<~ng kzg+CoX]èS|]~\yba,x~9if/~m~m%Amw{;R{q$w;' )}Ɲs p HKxxxxx#ߥ+kk fL*Is%eeOy]RPT+o)+C;a]o/j}/sE^e~Rx^2 y_J}ݏ74wBxuBX/̎7 7~cgD Q$~ =_v++ ?G?ÿſEГ؅:p'D?>w_?;h->|cLz)dD{I$LF3f.f*3u3%L zgcCo10fww'31a3s9-̧̧gc'`]E`ŒnlP V W\$.>^~q%uQaQlĚ$6ሸT\bȔSPa)p0WTEe*''[)O2U)ze=SlRcPgTN)>w-S󟞗TjSmO5jީ~K-dk՟+:u]>>ޭ>>.V7ϱRϫϳ/;X]ݩdPw&Sbvo-[rSS1_gWx)O33vl Os7 v6mjo5ְ?mmc^evoo7K+W؍W}^n_ORQJ2RE ֶz@=>I??!;:lp]%2Q:-t[an A *Ax/r¼oyQBH3(!%?Gٌo AB@ cK+B\"3%0yšȊO*cK+J\(32RY*IiQڔvЉeM١R*ݰ?ҧ 9-Uwȝs 4w{{{{ƽnt7WW׸׻7_p'ݝ.a1 iww yx.LziR,OS أ{zZukڼWjޱ\o[ ZWEoٻܻ»]v{yyOz{}g|"l?C8_oW+M+Uj}}f_q*z&V uNz||o_k1<?5?ƿȿĿԿ?,1B@n`B P(L ( Tj%@k=XH:]ÁcӁ' 䃎`^0?X,VuA=4l W7_&`_p ą,!1BиPnhB T*fBUP]hqH5VVք66vvCCGC'BCOBa&̇a9 k1p~0O gUp]xqX/ p27?|8|,|"|:$ܯ194Yi6FiZЦi,mVUiZXkԖimJmAۢ%NK;֎i'Za"|#ɋG #ȴHidVdN1_LcDlZ46+6'VUbczli%kmmmuƎR3@cr]ޗWQdmr! zw-""FH@ jܐ%"8 ) 6GPDYQpDtDDE@zdDfog~|s[Uv F‘DyMSk{w_82 R)YYYy$Dd]dcdk6jdOȁȡw:mEGEDG{GE%1IyѕчODnF_~2b cV, 6Nޱ~؀XI4vklLl|lRlflnlqlegcc;bcoƎĎNžq+xxxxxxx5oş?1=r?`DvLD,<.%='qeb@bh,1216111%131ĂIJc{&$%&'N'IddvJ6Nƒ͓]ݓɒdi֦o$$'&&g'$%W'K>ܐܜܑܝ|#7?y0y$y,y*]ʗH5LY`*Jڤ:zSR%ԭ1I٩yũթGRO֥6jSMHJMO>[ܬsbķ)we1 H'҅ؤ+) Aҋ&Gqr9$y!ɍ-w>޵ׅ&wU-y\K֒gz<F^ d'%CvˣF cg2')}rMrD䤼o8EY@siaڊ"khDδ+YGўyڛ!e2d'H7`zC]z3Mޣ.ru`|Y_gW!$ϦP4akh&{=E3ֳgim9e2`Gd>aG͎c4)wh#i\ژ9 8m*iXUVBciwt]Б3iae\c)]m,3+*c}}xxn13[Mtqgovc9bf' ׼55X YE f-skeaڙwY{nsd5c *&!%`U͕5U= flZ"_\Vh(s[z}.1Y줕m䙲~Λ[#e|ܦ|Nإ\bOgFs徻| d׷~>{зBV?|+* 1'|kuNr4wZQ{z^t;MNStFjdTu&8|O>| X |]ImXGz@9at^ɀ&Ckޓ }e[lnwUɆrd9ߏ~?#zX   ,-m6dX:tA,r+T]rE/AB&!d$pppp'p5lޭqpmuNi8; ^4x /q&rxe rxQ}3pvFt6Ά<} 9;*x**x*dUEߔ4n*?`5Tæ6ՈR(ՈR(rXkz-BE_@,Ej ie)I:&6N.[M5n* gwl2`ۀ;fF.cCC o5ۀ;o4' db &Κk &o7ָ88@@" K.b"Xm*bD C7 4MQpǦJ ,Pyty}ДKer$r\[H>lITY= fήKۡJT^ =ʆX~4DpM:K|i1ہgVw'nOר|z=f6 _X@R!q7CV>J(,Z jkx24q \i;w']8?Mh\7A.Vic l\q48XT~?V!MjJ,߁;Z Yq4)r8`pw<ƃfh&q =f6q48XTLAKkRYp5*}=Xփe=Y48W5>TY@?БU!}J?g;{Q$X4 h2t#9r,~~@v g³ϑt]i܂^{Ab44͑[]N.u{mUUjHPi-2Sr&|e=:KsUGFR*Cm q6r'2xJzuF[x/ g,2kq )w UCf,^J#RYInYnD=Qu< r U σ<r5j3j'YVo%^U;#0#( ThbNX|Us2M͆9Ut5U Ę _313R``D(3 w6lrf{:īDJt%ź<Ǔa9*OvڵzLjTyi FX3qFVG}*\[ `9VcVi5rֹTc0Wȅ^A^ yǕR]3HY~ pd* ?7&+WUj$T-F_];_[/n߉zjc"Gidj=J|TO3 gCΆlB6!ېm.dr}xF[ֲl=[cnCeZ5<WZ/}=Tܨ{ օx+PΞ8t؉̔\býZ>z\Z[4!~Ee'RɆ'@nCV̓M@oCDNµTY38ފV:Xp.ɰ GWh5X+^.i#T)3/irHs ug F}/lwi ],Y 3[ہ;7(T!\un7vnvnwFFu@M.E>y"\䝋sqa؇a0z+^ao a05ðf ÚaX3 kV` [a+0l "8#8#8#8n}f-PO ~R𓂟W>zW>o+Y(ʃ_y pl P Cr(@ȡ9K\|#^/B/Bx.Bx.Bx )\E[܊PEȭ!"VE\܊[r+b/b/b/b/bx+b^Oz=TS^Oz=TS^Oz=TJ_ +A~%ȯ WJ_ +-kεDZs-ѹ\Kt%ȕLd3_y pP4 0p!a~Ka_ Rؗs)zW)z)oUgYyjgYyjqg<8x3<ʐw.CeȻ y!2]cɵwȼ \`0#a$"D=GHx `? 6ѷ}ˑ]wٕO9#rdRL******c]BQ =Gz*U9s4s4s4s4s4s4s4s4BU-UAbn_fݮVně./7wB xa/u:^%U"^%U"^%U"^%U"^xy:^xy: [x+o@V`o+=7l|Mu-P7ٕZ#q5䇁;Mm%;IȨY{'PɯO-)q/}|(7{gw)fle!$?MvP8 l iXsh7ڋIt&Kӕa}V}'G_{ze*/5Sm:k%2VaV6ɦ{\dPv &Jl-ccimgdGI96ux6xc)Rx7yPj63y~/e|ϧ{}/KZ:z ]mZ/ vG`lIx mMu;ov{o ^Hwn v{hki>mh>@[펀nʳ= k௚!#wDD:y}y}yӼмk^'5/5SWi[;{K4H[ Zr/r<^nryfxLs{l6x~kx\ ky\<^ri^AK/57Grmjy5Ѽr5WXh^Q+y5Ҽռy枧5Zh~-5V_kͫVjy׼:h^!:jB^n_[H~΍cx9yEZ񐌐G=Eoc>Vc,5Wflo/W+U_ͯk|`>D^IoCMiMxƺ/d u'zs$3$|6vPO\r#U& WO3^wɼW1#jYEy/2ʿy^Ҁ/=rgJ>W>k x1(NL'YqMFz0_//}i~isE%jxޕw;X)w>83y:'ObCFʌ.Nf4[f4_fHzJ.3gKrE|]_RG 29$(&e\]R}Te~? TtBFZZY[Ǭ/ Ku^,L;ˮog v ۔Cjٶ۵Aεa;bGne6v[>lw/|]`}~v}}}]l_m_c_k_g_ooڃ!v}=ԾfK\v >N_2rSwptrkk @g387:Ca̹ٹskgs3qʝ8vLp&:w8w:w9ng3͙pfGOܣg1 {=~ըOpnPPPPPЅ^!Y/sC_~Jd+tzV_3nGɲUrz=≥Md~SoKQFQf8]Rf;J]ȆkJ;AB8nyPbrGJb<&wG/z~hm䵫nH,>TPa#1׫7'XE7ctX+‡}Z-+!k k8Ⱥ͚NYZt,bjbtg78:oJr;+CA[{QaBtY{&*`h]Y6hMϳ4; {[Om{|?_AW~ӻT:N3Lz΢i%C\zG.b.e| |"wI|2i|QGVE!&'w0mvi`;x v7JsRoa*6k:2Y9Iꈯ$]|kQiٖCZ"~A,UH2? ʫקv uu"IyusWJ]GH[yO,ȧSwe>OGYgYdVI..)r@nV+N!\kH̺Hȶ9ml!:j*""Ky]C.׹A~Rə7贓GNd24E ŨQ{_ڻ;j=TEMzʻO-.:b790uAbf21{=->% d.'ʒaI+iYIk5(wSfMr IrrgE3R[ao&^LH$FD H4cViYڲ[:bԶ.㳛'7~"ueF'#Hk+ MMdt]D >&Z޶{ }Lc"yu:l_m(hһW\KG$ @㻲ڎd>ƕDFSiUmW`o!qeb-״wc"zQg$.NLIw*s|#9'Nt~ t햾$HmRh:Mvщ'VtKߖ5IQ'(8>.*5`\V!H%]:Dx.ɺʝ%)42OGvi 'l6LbpVəR-j=\Z3dȵ>ܨ=juqhb>#vЫ߄-1Qboچ*)(F$1 `~Ӷ(F1Qb(F1Qb(F1Qb)%ߴ 1ѿ(F1Q"jTRmfȍ"&j?LJɒSR_eQt3H[~\(t#~[CcM9tEÕh]@VJVMҙ>Qb(FHDyHWF 9'Rd GCK*McVMXyn)S]z#0h|msŐUd~:Yz{j<.odwiuylsOx댮M<UvHO*uͼ74n)J8'!1?3~Y20g37Ƀ9I8Z8jfV2}rkkx]"skڢ5|g$2NNO^X6k 'Y1%#VXOˀmkP 4i "e,6yl?Ւ6Gtj9 o w[=ͯ/ѕRxH{,O󚌺֨ofU;S&7a"(/:, Mq~%٬^J~WH ?(K|Z=H&6) PXǟ;)O Qxo0w^6,NvY;n:$%% ɦ>ýo 3,1 _ķ]FQal7] [8/߀ M|}@WbNr^:v[VVN~jZc5x | {|zw7X5+qtD : D+@ZV ZhBH{[h@4DhF -D#@4ZB@@@´> |@Y> |@,> aaaaXB@@ .  pY,@ 1Āb ,@ =@ ,@r 92a ~`[,~ @[?~ @-?~ D7@t[n Bt[,|PKodM: ؒ%oK~[zɒ’+ϒȭ":G [,Xr1P%Qmvij.m@㉶-]gm.ۀ9<:GqНV'`p!8l!(]5$.),no ΀qpΞBy+bOcvB Ɉx" x]( 1?P:!"r-̀{..CxRu8kÐQ԰H{"Ѐ{֩P.ޞ bϸptQQ};^o p߄͝fs/+9^>nG}}{4YN,򃖉ܦ='K"V#9AdkjZ6QhCs\-UO]z;t]uS+L)2UT~(=|05R|'xS=5̟@ k A-<_mkz~~^f7YXV͑_0Z{{b,k͔**yRگIZ+<30ɿ#_&3K=< R47Q:xbLYt6ChNJ5 Fa"zC/O 9+p[z z=ðtY: D =`MR5y ˰VGn7TJܖ ýͬ_GUƜVc%W:Nj)"x7zG-_SnoX8߹0zV/~Uк`b)=՞Zg _lf7`FM hSy9}h I:ZJ 14fk7۾~͖J3Z29S~--:Z|R,.%jjhjmFSuBXu=v{]0܏F/`p2e^xtKݶnWeٹeW| q|ez}+{ec"R0BoRGȚM%*K+l}f;*4P]2S@vY3 xZwˌ],f~ڱK._vjA"K`%"/?[Y-PHt-[.)!J޵(|. mRqF8Jz~ˊAe,qEt/^gfwtCS/mdW?s{5cvSx珞 X<1+h:P;} Ps:rn&K6z`t}7FM_%USuI*&i2[xa2ܔR '`+S(Ck~%^B^zB,i*ͥh%uz%Fi{*~æmJ\xRw41_W+CU-283 qLAkkh /\fxMW l[`rB~HͿa,؟y__ )?=-m ^ט}]ήf犮ܬ| ЗMߢU}zi7~Cqbb01|.)c;ʫ[ Z:=tw_G$GoDTlg z~O'ye)Þd/هg1D^QO7=5=&T1TK/xWq)He2C2ey,quҶa{_IE`BZz:"i1s/av_J. ,%E"m]4Hkl\|@yKa,KyL\h'NM|jh7s#x:A_Kﰥe 7xnV0;>%X@7*l<) -~e|VpT]nRw՟F۷Ѓ?!Bz>ϙɢT{&74eSlL`?E:8b|4C{;Vf֋E8#;Ë2fZmz[vP梯BZR# jvsiA^e94%(K!.̤Lx`tױiT$Q|$x㢓?i%JAxfdhr2P,wyV:Og6ǝN^)Lp[{8.w2 {݉7Z*>:Lwյ׾*mZ&` >Myd5 ʲB#-k|y\=Tlٮ;W+6R9byLQrG]o:ᶞ\޸mZ 2Ѥ,)yxɰ%)bL^mưd"zX_>vT*o)f.\]ࢂ/Ke f;y7<+n ʵL;;L-[*]XP'dn 9CLc7ngf/]3PFH3Gc68a%80Ca1w*ã8U::ʗ",݌L'b9={CV!^1VD`{јrCfc^!ڐ bX-rƍ *rKE6u;] fWCMwٹrgvn# aSEfM㪂MAf:ZNkYvvnHP¨,9ֲ$sp K=I3ׅ^W^bBj.n _ϧY-N]帢춢yiܗ+z'Fj>#SaCpW.vgy\o4|#͑#[GvidHG5H [2jVYTjYrܻdc-GFrҖ%}i$-EgOxLJr;À_Z%%jӑ4ǒFU;c!Z(l?sݼ/uS+ ų,օ x}K2{E˽聋/}[o͢KuzR_x^:'t=ezEr߶SMsӷo8?|{Q\Q[U]K22R22bjE}ŋNj8`rK:/A6,Q3!Ma7gut]]-[(Xcޖ%RL(AI.323T8r-ɕ>lR5W?b,Ee޶_{3pcW{|_-N>x<A!B]5"l2ڕ88c|Ɣ9rP7;Uw ˔DUKcZ4&̔'\sΙWĭo[qKݖaIH)J*,.:G✯̶s^\\L3ſ=Wb3n3SbCJldfRn+N/I[3.Fua\6 ) C ,v.ov%"&ɧouYK: \1vD`+{b[B[~7=%#Bs|ZN9]z[t#T\q? }9W ڊ޲rUn.O%ͪԌrRMQTTZSUTqpܑx wO?n_]rUʨS&zº2XޤH;Q;BmS\3Q}+8#IWl36jϙANv-{K{/~.#bxt)6i2aLXnz|tH"u;xn:)|ⲻ>B1쥎Kb~c%VyԾq~‘Edx-{}CGJFfF&59ʥŎ:E Jq~ɡe:J>Q vGV2ZBa(]Ӵ2[B\..F=)k rL(,wU?0]2z09H*_ȍuqTVb(^&T!t8GpL ,!{?㬰 Y2L߿i8x3G&ɄďZ%G^W忻*\KTfgpBynaW2 gqZb^.aØuYۋ<  >N\eO+7}Z2{8}՜sz~ δ=Q,̼־2Y[tmڭz}}ܭ kקޖv[mfiz۳J4^0-QTsvfgvgߏd}e7aCv$"$@xdT P|U| bnI-mZꋪ-MPL~l7̝{=9NDE C j-2!P]L%pݯ.]t=tj` !"A eN!' @dV|{U[zu^Ӊ?ocewb\{H{D[*}`o&'<-Bj :{x-feV"[,TB42Mw؀bt~[}_yUqQ<ɃHćahy Y{f)K_c`U]w{m3/km ƴ.Ex1·`<.*DWoN^/5/tE^'=&Xci4Yy"؜թXj㭫,kDaۄ|v reee%,KV%{%ʼnڜ]NtR!E,lS"cx;n FR .ZTy!qQDrr8NGJ'@k#DWHfHU+Άv=OqբYZ?9{`on GlzV#jx6IOξ|\%xg?`픣e3]]skKߗލHYqef8Y"-/.._"3$Wii_a:7E> 09FLElc#K兑 ;OOO(\D(33˫^»ˋB0 wT3"m?I!6tBdBcT f0ՠyT'i1EqK X}e3&7<Ϸ\1Jխ)Yw$'3q!tzF=?u;@ȠZԎV{׉a%>W-D/9uߊ#e5R)Waetm[[x]16oI޿m^ȉ<o,vn]KڗڻDίP`5k/Vj?~#w\S˔$]wu-Cc)uӫ{:HRH1)UX 6=!04)`A&LRіVo`Lge0̊Z!d^&H5cm2cm ߐ-HEj,;a 8O2DOI焯s{}M<&}@ 8]Kς,SYgAf{P'LMAa~aɔWE&=U=ة޸@c-2` ]}̰ E`: EcD&QX,:fQx09$0fIʃx -H4+yęxe!Ȁ! :a~2zPJaa5IPT q`䓇:~䁜;0 CS(_@ɗbogdh>Mqp@Z='r}i;W>F0pG7=ƗZĖDGmL8#2ϲO ?Doܭh+Hj~ =N ~KQϢYAxLRld&sō].y(2#ckqyęR0,% b™AuB``#)XUsÕZm/!:gq6s^Id"|d&DAQ ?90Do XN!AuV"BvS +P{X;V~?0bшڛ_RGD K ЬQb4A HdiX3уf Făgϛa~tA/#O9 @Iœ:Ζ< 6jܫo6)G KR \É?vz! I-"u[]`Q@!3L?YjL3PUC]MlX\8CcPk][[w o1.7sǹ2WַoOpW8 D*mrTMTdj_ "Ѧab\@T@ |`rT8k|fH-5?cxI s5=z-ʡ:E1SP*g]oL?HiN;5]A{T|  y@Xtik'(!0uܤ߄^*:xdA 3#zmY2#E1{G8i""a"V&ښjp0%ڗf=~xzR늖誚/'K+fNJfo߯uZ9?n), N7J{^׏U.onت[_#}Zi-_Y,,oU3QqLWP% @O6*̅lR'd,BEJcVWB+ dM zwOl XeM&qP9;[5/܋l.Kto',r`nF_ִ޹/̄[6.^=0pzvJZ;}07ԕ}GVT6ۚgKv޵xʻ//L_8p##\Mެ.#Z/]mn{[Z!>3cI䌯(V[F>JmfJ =0p)9BTR&94Ղ,>g$>AOKg`dCn-iG%LG y`ER嚩7_ֺȅ3^3k3}ι+2(9Ib]{,v[vkEH:#te|Fi 8uv1Q-fb=e9X ᝐ]ag mMkpl(T=]居Х\}39ooF{o۸;fQl. mJg&-8B^Jud{PxHަ<>)=~ɉxIZ"t?'˅B ¥Zl%\K熢=x ?VзZ,U v=Ap'PU+.|&dv/!wS!tL,_hWSd Tٚa[ѝ>UK ^ `/:6jMG;tZIg=/I=L7Pp^G:!=8Z 5P7{HМz TZ-*fz Xi9 HxCQ0lH|[ۑ>dT/̚W_CBB;f֏}"7>clӣV0hT,˚am8bqNd5A369dѠIH&;NQH7ZMTI۰1lqİs>>n_>Ϛ^Ns"ρY;IyaG  UCnWWyx]*Ү׈wg݃|?6veoZ7m"zTr?=A_4MGI4E]:9풼r )iZEcXz5̖*Szva%ݣJ-r4md0I[pYc%+`tFt&ct"%F^1*|bkdq8!{}ܰ2s%BG-DP*RhK]>gGSN)3Q6)s˻art)5 輊喵^lQ=-aݞ!_ ",i ,[Ƙז8uG޽qB/zG.Ta,bxn-^PX@N9m6ӃT (s+ Q[!*s{Kb8Ѣ@rqu pD㙸:L2q/oT<OLW!`w_d8`x牗woeqɎ5(v3q¾^ !#Ҁv*6jIvf̒)&v3fΜ1^㎁,;i7='21˝n;RHxG:Ş>'M]ehm:=DNw9 n!&+{D92vrhJ.]w^}ڹ;Pp<|6 qwhǾO䩧v>0^0CjG3t\4 Ƃ b aѳ&X?(nYZl[b)>ߵR&D*'N!N{]E.TP!D\K{{go S{т7]6k?hY_н{}dϓLQt>,, vٖ%vFRHnJX21'R"#w|zvƮP1քcuRCv>M6P Eղs쯪t<}dp6E8zƶ/5=Ķ/kgŘgS q~Y=ٸ)y";; xgʽc?Gg\:Z2x\^QjaM&uk9Y9s\XEȈIڍU[tJ\nHP&݌B< ۇ6Ulkp($voK *$񬬱x  㺛܂yn[2Ӧ.^p\}$?K.P_A_c AReD L">΋<^/Fq;jW'#&GzDh BP()=#Pf`8% bZUi4iUAkʪZ[9h0>4A<<TLj[!LJ \S9ꫣl9Sߗ$ro'GL$GC>14x\ Rb r7CټbqOάHpȺRjTS, j5+^lnkK*D{>DLqL+w^"f5B\By.֝C45di#! oxy }ʾoH>(h>got' JgUķ:r½vsm=Lr`"XTPK 6- )=g{6[~D=ui螃DQ*{j5Lx (ULũ$UK5P㩩ԕ|j1ZM^UY3^+/-o6:Y25 U֗GLʩ()ٹ`QnZ> s#GςUssnX:gEa2"^D%z]aL&+x顷CI#W0 8#aܑ=|:w^n;zv*Im%ɹte2JJZm<]YI:''-"W5mIϑ[II jʏCay!APz `CsrT ѷSI?'k`T5as:s06vlѸT֢"\DbᕙLbpOY8}dz*v龪49FӺ,žD ThLv=W@͂y.h׻f7qdl k,):>qu۵vwrޜƅ-vZQ}ooYS&m4w֏_52t+?~MCoW~{+Nw~;˕/s0Ub + ZRmp7mH }i2UI2D<˸{'ϻqrX{ً/uz+$u o_vC7k,䬜gW1zƪQMA&2Dc`0ߧ2JA>))}Uc߰'Eūlް Wfo$-j]re J"λfZm|^bµu0)z٣#c44X 8 0KPq0Hp GPL2—7$plC뀌Z_0L]tT%fWẙ4!nb dF>}dԹtRGCz0ΰ A"?qIh\ܹmˣtjfCIaV%MUiwtKMi{Ӆ }n$-!m6&5I)#PvmAAtAA⊂ ܛ6Etyo/&$į_yIWX5S5 UH'>:I\I (CczzCxD|u{ݍUWt$>T2"&Y\Ex_ɯ dD߇rg+JK$)[#3܏hBI \v~Yd >?BD$*w+mI2Pн 2WF4,PttA$Z1L!ׅ痔ʝ9炈UI0> ArUD쇮R4͈wED CѨg4 %A1:%-uIh_GACWz6Ot_HI ב2WB5RTKFU+1vqURrqICYno GDM.J`.87x 8?5l:N#CzNQ( {{ @O gK41tpRF |5JˁYjMvەGV2tD6|z^ĝ6hzQOQXzVBcbgŏːGme˒ ~>|f&n ~\Mǩת7:&LB6V,D>;Hʹ2&Mq)XnCPzp@Fò9k=s7sA*{jFS8eXe;KܸS W|q})cN3/3ĚZ_"vC߉fU*WFŨT +@DF"#D_Is@0h3t=xɓʇNJ%ueSrX伡!;~ӭ]Rz)b̝>F%ÁSoU$MϿ_{{C`I n ~J 燅M]Od;92 P(X"I`(7htɹc ԁ,OMun$yƥz'tz*hȍGD4qk)6KM"7l`p"lFKQ@MÒbM;$| ,Ime]cVkMe a>5JKsɍg\ZM~ZDow7ؕ^^`[7eDo(lI>ڤ\/J,w`#&KM*B0G;Űi njc(a$~P7g~Yyt`\ՎsNXaDgnUpа *TF0DX[-&ɛb*YL *dCf*ILW(h%~R1~"X Q' ii8)Jhe(:KC qCPF"~\F|Ƹ~!ɤ"rd.+}eyccR'^/s3HɱRR* 8$km.hk&E/tbڋzD&hW_/L{!ݭT+&4)w}骠2jߕUc5(  qqTDMePe49&eqM"w ZM"pkȃQ}۪M%`0l8pd|rQ,ڡcg䎞QW]eowuząuIIu&M\P0~;VFhFPr V`g|ʂ~3 N.N \k釳 &jFV%jk.L ׏ryFW(7[H%ZsSC4@WS.5_?$Y!Qr}QQ)A,C|q@OiR1Qk!᳡ ,bbJM1e|Ր!A#m7gYݒƇ+ה&'k60v謄[ғՕ0A ק+'ʥ^"ʕCmɨmⳣx,bYn=NVKU~D?ҏʥ4WHB濙& B~ˏˈ"UPa}"; )$TFEKSL xx7r}Ų|uc !}`04NH(o.Fnrk댢.(.㛢{撚\yT(]4\H#&mO^.7TnM- DTC2b !I$,fd)Nş^õ~ܹi ɀ)rJ\!>8E'Ey*[A  = ̻w^_diƻYʈD$+ (l/usJB'RLFGrcܺ { B|܆aa-&./DJ# $̌$5dd BbqR99\N&IL̈́Cթ>}(6 B >Axp,RS)rvnXiOM>E:N(10O }uuT[abu1oц)d*3G_;tٰ@1zJ}]>|f6"J9玒)/E%=gCH@)-GEԼoXDѼQ 쁋t|f ] hx< ]+ɒS'" w UME +{O#-.ħF>IA'$byT"rd 82:DJ#~#$$ɉ痈Py/T8}#sŤW15;sks53%dEJ?'$!Y1-%S|VCvhi}ki6}+%>JY6;֛4~JPߵyCGPBR$ ef@J>>i"Ⱦ3{,`U@Ġ ,S6(XxaC?+]}e`,erO)_WTRU2X`,e 2X`,D R5X`Ȣ?Ej*, Ene;=NR?-!\(70؜c!ΡiR55Gke 2X` :ဎqO }XSOibu3D FED(>)ԇGJp/E) #Z>+I*$D 0E0 0MD``xIńO)BׇGJ*`/(W}%T0 T!U5AL5G"XeŰŪ5 `Е KGwfPգ!#럇y0üy?Kz!üy/0"_ dOư7$" t?ImvyFfU* 1+.$^'#e l) ZJ1kU r A6$`S-lٔ]`4ñȦfj'cx(ҏv~N 'c<Y`z%cx`4#tD@5D3a FXI&pKW#[#Zښ`p0z&H_(PV3-Uـ8-D A=GeZ̃0X@ƎZ3vn,X%^=Ո51PFMTڡˋjqK;2aͱy{OH;<ϊu;7fh"M++pv Y_.,0Ӂ%rKaɌ3qmx[165?AbF K ͪ|ym SjiAW_k M0p9ѹ^bXO xHgZqu`('cywuiǾ7H7_5$,NLxƊ#7%}8o^yxŠ6!!ntA#Q=壶UL?v Zhk)WY,[Z-cİI_GWBHD*3Ȉ تFhCjTdzOcnn'y}Vur76ϛCo'טqlEw^.s{o3d꾕#,j¾l2ۅ<X~Uy (y)F?_[iȈe 9?Ltï=Z3 n۶c2:X;CG&eZę_;py7n뢛[FZ㩧nw[?mކ4o!`ϰ<lKx wUǃ{]?U Kit&:[M; Z͘=80WD_/aDGpN<# KxDq#`s5sg~3YK;]pRVPl-eІzBh-xa㱥p*q88Z 8,X_ "bQ x㮀rx/ơR u(ӫYByNkp We Л0>?_>>Nf8*5Z 0΀ayn+ R9@SYqH?d#_9~J17+j/!`f!ԀW$ I[kR* "\%}Wx*\Qk5VW+R帞j"<*Klb\#,@inEV[amMgUN؀;YMf$&lniQX@pd@i[__ZvAZ^m>v!ljtXfX&1foJET9UpD0/v b Z{CQF<2!՘g[`au\Hֳo52/T`YMv#hƤe6{&t鬭֤)ň!adkhoeoi$ e B@y3sd25{Vp7Ľ~F|H x! ldiDfvь,oGׁ/ SApb4`@tCV$E#h3lk2h[3F`AżL778& ^xy7f=?d0?h{h6T+!w8P/SZoE.O_Ėj}¢B6>x-[WVSZU[}^eDͫȎ-,ԲEE[g*ˊ͇yU~`%Қ*P"}A)Tj&jⲚJy<=[]2B@[YVY*EE5)@آPa yT^-pTUOԗְUEИ_@ -[WWRgU=&pWWZ^/)DbTU衪)5}S EZ6O_f@ )WzNQ" R5;"0k E.9xJhJƳIp sn@k#Bl)smR C^wg=?x?~~x=y ޗ/?x_~|{n ޟ??x q-E@qf=\-!NG^ď0{3<[JL|<;Y|dbF1#f2#L΀57IlEq @Tgfv4kiH=0X8ã/:jղ-ZneˍNkXe݇S#0~Eyrp^C.ɗP:#@\$uޜXGS"3eIb!;(dqZՃTMTb<  @V%t}wȁK^te nZu2NM4ER2X|!K/?~_M+ZN)PEkf9?(QJfSjEr*"S?XxSsQVXZ."C|uø.Ks3T='|8VyUx.EZ ,m)@-2TH/LN*\2tq\ /g)\'`RDН?2$95M9YG>鹤/;}R_# >l%hZ{ϣ]-[`}3x7y4^m vʥ3|Wu/%dvCKӬdiӊ~*L![w+;@8'zcM)yO-+;? .MW8y۴mۣ|a~i;o{oX+>MdaWpPuڶO|Rؗ)іN 4""@~L0Ny%Qg"|~+c\B1L(Qy ?rcm5wyqe?sl?9x}/I"C:wگNreǴ#>/,ܽf]Io\|[}y3͕t~(Wz;HiI}{og7ҩQO} |tr]z4'5]`M4lWzF@#&\.%V*_ڴ/5ƑVvszԭ` =T|9o>0Uz]"eRZ:ҒL19#>#9#-=;9;}XZ);ShLKhlKOEov>d#G۩;0B8 #^d.@G`%wN1$k -g" qpԻuT=8n {_=spm3k}fvɛjU߼OF?I@I> Ȍ8NTN쮋ZL7¸^} n xZ- Fkw6lܹ,.KץeshtU*?ewK }FJG~†q1;Z[_/XWj*[?$ɜb_[6?c8׼Nܲ̃?宦 _|ӄW}>WYY|?;NuBu7KZ{ɛcyVEIW /r#9W|a1zk9+OʽgF,kz2w՟}<=ϢÇXow|EGÛG<bN.rBu k+=9-w||קqʫC?C2)#xM(wLAL1s|R( m*ؔxuہ" 8!x$R+H=1àkyם'Ӆ?wGǻg w8o~V?r2OQ*Ye䞭;kFG̺g]-YYz[CU}o{ũskF]'6$9Lhfw?9羦}Y?ytprvYIxϯԍL{mE2C2oO?U/d&ݲ_=N꯹f'O"Cd~o}馧'INE_7ַb<v5{1bl)kMF%D̼P2,SR֢S B%$&)רd3T8?Χ?^l<ڊ>M^X۴בtRj5v{hd+:_q:ḟ떢"ņUoc4n=Z /W-Vf+ 갱3+´Bܵ÷/81v`M沋=G%g=#O9q\ba`/ qr3If@lMulMFWIy  RL yC$՚:/_e .J.>dQ|* ICqb_ˡoϼ&SLuIFudYRV2HUpU:rlUZv\%\N]wq!^c 1376NFr#N˜Śōk YmP s_H t+ ,C&qp Lpd9쿍C8?@'OOlf%239KxODk#-1ףt-c)։(kEssaژ_J}J޷(v_’N[,HaTϗ=aHlFEh(4s1Hu%"ԅqC j:=щS8nDHj(XtJۓn]sm]ff)O-՛9V^]Uk pDvXD|uwXj5R|.g/ao g9𭴙 1+!}Od۩CzGHh1 Ѩ%/> ݛF'F*NՇr?ʢ endstream endobj 1103 0 obj [ 0[ 750] 3[ 278] 14[ 584] 29[ 333] 36[ 722] 40[ 667] 50[ 778] 53[ 722 667 611] 68[ 556 611 556 611 556 333 611] 76[ 278] 79[ 278 889 611 611 611] 85[ 389 556 333 611] 90[ 778 556 556 500] ] endobj 1104 0 obj [ 278] endobj 1105 0 obj <> stream x}R=o0!7Q%d H#1C>RKX M d{~'UF$~ua$6Пr6Mr\P8e(zF*QMdwQ8mNdu(k복ЁI A>78֕u=Nk2' L+l#5Q%HKD`MʯvIڅ5W<#AD4tI2N1Gʒ,3v}O9C6s`mC@y!}(3w)xҿ=:24yv+0yDΪy endstream endobj 1106 0 obj <> stream x} |ggwsdslfmBBJ6W  `K0EQbET<٠.+Z⭭`EVhmgBk}{=̜sf̙3$Eȴyӯ!b mZӗ{jrxlP3Ry:Q(3ɚy>mJwAwOϠOe x%D>sҕyLiEgDU-YձL%6e޻;=ɿ5= [v;b:voOy$Yֳwe Bo=w ~Q6;HUO1h { oͦ S mCutZWM CTNd&$"#+Ay)L {Ѩ|͓b"I:Ȋc420H߹T2Ɗ_Clƞt (Ei=X&0絴^d%g=e+h*t-&_G/C~:mXON`+ 8*V #l;dRfRp"v=ʓ{ɆG{BOvL>#Bfh`{7g>y~ 5 x=|o/KB:tc)H`E\㑗-5-o03oP?bU?C\k#=9z{)uŀca[oB !;p_ !6Qhо !AB !AB !ABмoOovϷAB*wZ-R5ɽT"~gjHΔYJli+)BJ*|>j)\(IP rS*tirfSm?"V߶!σ4kr`$plӠvB !0G))d2"HIph ]Jmt5=(=FI[faͲZk3?J3q P7K; ? qAjHueLz|ˊƨhSLl\|BbRrJ9-}Yqxtde9 F.)-+3b 1tWUSm]&66MG dgI㙖*%2ᔚjSS;:S[j6 _e5]NjS3UWf Eoh?{Dȹ[Um8nt䯳ksӦ.2KYRgkY Zw|D}XT1P3wg<р1̢UZw`Q|v і:`_ոif©&=Jd?ӥ[gJǩDt( R@%0+v#5-/ԴJm/ѬiUW'yG;P,53dƯhB;oHJodfo?{g)F'({?6yl *z-+AOeZuM@A-B!{A ˁ2"0"Y,f7;4 x* ~?o\ߍ|"a~f ~p~5_[9w^jV`#-qe:Dk|i#\WlvmHJ)ށ^_]]M2Tkڬ Y Y^+&^]UAaM~=fW &ȗc$?0]\$PM_D¶[vE i@jzjqUŃfK@w2 -dZj we)rQ-=ȋ@\zbwT߭5{2z_lC\er&a+E.vѐFC ) M33՝Ӝ-#O 0(Hc'E 89#rF䌰:,&P+519]Ѱ'5:(+vg25esUYU]ioCMr[uM951_Jjqyt8i/W*ͧLIvC4 85/8XΗ/JՊg-|٩YkkL'VE5x֜7R >Eqgד9gy)o&e =Wp,'-eLe0o`_bYd{ܲ7QiCU`}n>˵O 7h)z<jOxKkgP]hn_n ?kc=[b쳔ΘQ~@*%=[ׯwgG V}>Mo5 QHC`dd C?pLdAe-m_I aqQj^FjlV˝~}`:٨/mgVrwVLQ!Zo' b|[<֨vQcUb:zbNՕɕc~iί!y>$W[J~8ڣk@FbE~iv#u?RZQ7Mٕsf!\ f4& 5?##h,kFGjFue ,̤Օ)fʢϯ,XVYt$i ~&a_A\SZmwCkvm,Ld+uٕDGz]f{XOX_7YÊaaro y%۸cO_1]9bG1q8BQuúc:Ū+ҹuͺv]OYCYY/GDEpS5(Xз^ѪUfIDZTk 3ZDUބo>x el%%+4MaQFx^G/c&il>Ķ2?{%$^s-)J5%?f%#p };Xb(4NtHz Cdž~?UKz̲U0Kle>MKyoo?㿐/o+ JG1l@czإ_ٔO%T3i1s9kKbܮ{ t~C`Bn= {e_G#IRT/͗"^>i h-ud9㙠lTҽOw~~ę33 PХC[]`f` wP7˻1wy3q)|# Jv1N lgK,<-vlCv<9Ž&1RT(EOk)4YYW[ۦ۫PwZ7V>`p`z~/bJ(E2Qnd31—[zۥ?ڸl)]&e{a#[A=Nr'oG!$EbTqxk<$)iq[wKIiA)_zzpH<(ŠSB/g(iu5t5錋*6Ud'ٯc` 1=xFɅBg(-ai2n|PqSe1E"  Ɣ]Ublŏ~5y%蓟7.L)f1-Ғʼn z.Ξ!$lAVJ^6j$yMMEUB\P%z+#fO R#/0tӑHIIHL֣F[<5  g4Q߉I1K'-ޜŶd9g`8g\blŜ//7?FQn}ԗE xy1](7v< "Y暔ʊQ3~rwW}[b- w+O O6N'naYvja o*R*JKJIZ*uњқߛ蟖Eki\x sY$ĄbG\,.1!92; (Y׾H=!uݽ/#b= 얁,6#R9ˏQV?ƌ![m~)֗0?iu [c;BL:umYŜIȜ0a\'NA8F%vؘ$A$LN~J -NH(&RAo=jָFMQ4p9DuҨNaY QvD$\&S#̻@+9N;&+T#",HЯ%YAd-6!zb\I}Y,,6,>Ic1yF'&&di3ttBbD RdXNWV^VVZ$?b6>{ژ7e?ds;ZmS5lMGI6.nZz?nl%J?~;dWM}}=W"OnXwz1پ]zi*it96G_!\XrEa)V:&;<22l)3<(XKMuݵP$u\ 澲qRɹʉQMF-CʭGW1H7D#o m,7Q:oL0Rl'FF<`L,TjNJO!Ik|/+&R'^=46}O>^CF«W52s<ÝGå?+p]_Bp*,u*!6DҲҒmݛ:競O4U5λ}#C/e߳Q4ny|tO$lԁ'Jq;ʕqQc+ReՏfO7e\U5M6Ok3խIMY3aC ikn-ykڝ5&<+mg͞^,Nm+7ԗɩ$l 7RvY-#f =dZ=6㑄ˑmeG*+MEM7M맋MA?sNqǺAMjB,2fFQ`RcY_:XJI~uege#5r~G ד>3FeZFk3lO]Ҹ`ĈI EfLjʸGjZFQn}ƫ F&.j;hZ{"=&X="?asljg[ࣨξ9sgw6{O6.M 1* h^Z$"A-|Z-U[/'Vնk_-TӷT{ ~%sΞlf?9F-\ M8|ΐfhn\Xj?UERrB(!$Ģ}%Zi3feHrq0"e)e{v'`0I7eA>E;`Ea"$&8{ #8~D; 8z|}OtQG{TAKfnoI5=okN=@?YvdaBCA{=wѲ*QC7<ta0#cqiS,3˦MnB[6H=M>sٖSM-=^S:SfݸxN+0!_ɮ;Au? >XU\ك+QNR(CK/,:^D8A_lq%p_;:M+ai(w86L%tƩBfuh12Bր]Kp%F1N*^ -SutuwmZ ~C0^w/4_x$wѩ>a9P^9Q itX A;O hoƂتܛ Lf7ۦ6**Lo557-`2LubдdHt-_mLpMpO}7H#Gέ4!ڨ@A.D+q5H:H_!r|M׃?_%>? 8ʇ Q]Rvf6$$=DH0rD'"p$yyg/9T2i!%="\Dz.L*;͹ޕ^[ŒńQJ 'H$BNlYd%YOLBg|H$;?M'z!ES}[3#߲{]_ڨ ^p@̡^%K5}NM`ݯ $~@:lCp*)JPHf+m'fB?{ߕ.·X'nM_e˾iڔfӀ'Ax=~d;56Phj蘡oei VX*x>uK˓-/z#?%e U||^CUrd.UN8PZb%Zşڥ9rC eLc];A/{Op3xCe mG?V'8 юSZ/Cb,kSy1i̴1yQȸYXo^c*L;L6E,-qgZ=k*NAJ.ww? Z>گ9?3ԑށnLdƐ^6~NAZ޹Ge`hnOS@p:=VK_}_?m8y7bMK #_dGyYLl^\'*6s7/\Y-l$Û#p+#R=FQ&P >a'J$L@5Z &"o&px:2=wR})pFFLlhD %i^FZ/$s#:8=bErKA"zslH~>uU}s]l@ UqSh7hɟɔxgIi ^Z[+ݱn\{ʖT8WsM;g0/\ܶ;+^)hfe[Y"*U`:]Mjͮ cQ:AK΋ C"X iDg*{vHlĠ jèj$Vc_HX#k N!MxK^˻;╼3$#̌"Jnh )Q]KX1g 6ݹ.@XqmvlǓw?y.݋/]5q+~?O}>v#ccv4VX]^cu $ckTf"qD^ï1'1rZNhz7P~@-ac8Cєh^Lz{va/ ~iϙќUD!&>4ԅ:oģ?jGſk5n~E=ߐM}dύ]mŝ^?Kn\us?s깕g=wC, [s Jku-͎5εޛw_yK9Gr.$"[s=-YtŨ"]`ݻA)򅱺y4OyӀ Vpg5545 b olو-zlE-QlݎdSٸ\*MRe%1T$PHU"STK ձ9]1H\G]'0HSi$#곮P~[^{ⷞ%e̵,[ɐpOn]Ol~ě@ot׌lZҎSGVn`]N}&\־54$sR381bTG,BNcGAr}묪 9T1܎zeƄwf}4˵p יBu34~Mqz}UR+t;M%:U3n##0ZXdaf*ǃptn]WξTpxK]N~[Gkы  {UB1Ry?]LM}԰uN'uÈ@31$ QB4c\N`_H*Xwl+x.&0Wb"L-e DPXH vd]W*Ca:m|Ȭ4FS4߉ˋ,m_xK 2ߋv+Pɕt&3H,h+=˽pHpظ7L"1N#( ƲJdTT'R,RT+X mː]l1%c~իaÈQѤdhtU֏6ԧt8VQ?묯iފSÇw csͅm 2myl6otmV7j=bwRt?ۯ׾{YcQ_QjGc>~kR9!h,Q\6C DF@&!>ÿ&j -$ݚ=\%Mb>Bbcr&*c9dM,+r?~lQ=Nf6^Fa iX;Fm ]R|^C }15U8ēqC,}+(2EBjf jHl3?dv=1k,͛*OǿK:z8vYGso_|un.^2U/}w^&d2|ٴ;IztM>6*i JТ&tglS7ss蘆nɭ-c'˯_˽U]NjQdJ2 *V*>/):~5[O㌳U@_ji=?}Qe*(w?qkH뜇::;G:p)ڃ8M cP  L=zYJtZ=גk>OJ7Usod|)<⯋?JjP̤7f kBmxK6Lk*s-|[hҒV?2mI]3*]z/`[!y|!>i = 1 'x ϭLyMU m@<5A_::?G&ZuK ]M@tOQMᚏ_X ƙql[+k녔`DQz Ka#dQ̦䕳y=[EiJb2WS\h(RFhb\[%uѪp BCj]EɶdR ƾ~p4U~*d|=1l1e[jy*fE3[rO&ʍ3koM e%erѣ޿fwK?p]Ϫ=~ ;6;>^=5l}7_-U7\r+G̽J^xѩ *č$ĊgQUyr nn m|?;)œBN(ʚ;m@*!P7u!p]ءaس8\* 0nն?qwҕбu3s/\w-_!b U =vh3R&gP-l͸{ DD""i."bwG8N}Jvw'SGN㵓6k)a2[ZH}2oǍr1q<ϫ姽}NS*pWsrk8jYU_Ik3傉u홠f] gjZWidЧr*YS3׵+bQ((XxEv?aSq=Xϰ0,n%H$ )7fRs3 !ō*4m@fʢ'yjC\.KA9WoG 5a(%ZӸUڡٛih?;/sȠeoIT],>]X'|'\T1HUK=zz=<@8*eudg &яj|¶6OjX`g6pεӑ|2TI3\C1lj ~>'[*ؚ3p،WdAm->X/P,mʔ&BM`lRdSk!Xo.g|6wV[HĨݔ~Z1@7^2rmx33.'ХQߍcj7G{+y|ʑnڡ|f6[|dz*PnM@35}-*zzkR=uac)7X^:IfIꩣs${c2V 1bLUӹcbHt-F?T0Ü4"WgNlY6d aA ,>2̒K?# 9$@RifvjI3|_ۗ*͸}g vY⬷"kߔ@o3Zi2b23|[\⾮]Lqc&Cq)%n͔ GC]Hv鏆ʀ<,)Oˇ2'm2az fEaZ01+=f2R% >>Cikn' 95#"kI x&'O~A z4@ l%ef9`'Vu]]zԟ]rfs6{g Ě۶`OiN>@ M&=tIF$G-"x'x߶vlSc_Gu{ﭽ꽫꽥VoZVɲy`K8BP Lpa$`/$Y,% >d C 8yP{edv׽U]ܪUwҪ^tJI1F:ul܉o+P_Nb y&rb8cjTB@"D0=>:?>*AC ֠Jj@mU` uXnW׫߂{pB)T?@q}`8I7tjZEUB$&G3dƠa2``ICGMj^@?V 1GGnN̺g;.azB*eHZvZZ̡2")3"IL 1 ެWcj$7oijۻŅ'E9nae~ n-ڲdyE:x!( I7Y&TVFag塆CpQsrfs@jӮ -3bU䁏ٗ8U ~mダ=K`t* FsۉIUMPԮ_{v&kW|_:/j?m_]v^6ÅpkG9ϴltVk[/g /d6$(lHyRa]Pa `0ZU; 7_gfO!3ΊvqՄX'a9&V')*x^,P ./4|s¾z0]8R` -xH9"v Jxw)1bS!tw&N=$P:%|!*n[a27@s+LiB9[޳T"xDb@j\=eip8 pX4O )y'JϘԈH3>v>J6"44?# +7߿lGOtC(4:[A2[yؗZ,޿E"նp1y@P~kZ {oBËlo}kusY+2SYYDn$̂E]QWхqY̚Y v)6݆ ٖg;|DV1vUIaSlXO%⣞x fKޤx74+$1`aBM @RSrqkN] &LB,]/H3m:~Wkش1xz['^fl=Ǿ:w:~j߇%յngt}Cv| v fYІ깳~)$cqޚ~%JY|:Q_aSJ^mIo@DѷůKgS/O%=ޕܑy($|=ܛ9ATަ/ "5Y,mJ^Q4(A*l4c /&jI%q`J>t$47=I>sEX# . BmScN6!!UbקּZAPڡ>~io):AĸCCz(xS0Χ9G'QlGCi<~\?Ra+T6IV F#*rO%_$| )[ZA"YB0K_*svk,cn*Ąb.ױId ;%+--E>=0C !!: @:͡q1HF 9UnsZUEPzU5=|B[> I?x[:/E#k> N=8p[ w|.lz0>u)o@t/M\n5\$g\bih2!!A9gӝVym}c(2*vc1Xn7UQm6[%n WH@1=Ԕo]*[ "h)6m~emYsvim.QF+Z{'웳u}us,7d)!J#kg⃥_Mwt+vh` HVy[Z$Bi <ƠeV{lgvd$$N H ( Ä/;[N;:r2)4v(\$!|B|AҊYWÀ^(a^Kp90鑓gdfQ]rM@Ī}t HoOW6-HAİ o޵䭭@2 {SsJłY,{r)Ư~Kʛl+~0\O~FkA>tU*@P9q;T,3q?dc苠FnjAyl q2Ϧo=r^a0R`_ۙ=qϪckp{/`%07%7u卛ޒjX7gSK[ƿU"(,>upZ^ ^ _jlu~m7& x'&.$O"!Ʀд`>{Uu`s KҾQ \«D1W\`DȆ#64e^^~ r|F侣t5.SKR86cK$D1NN FMqRSN[9x[<]z/)$\죎^26i3'm+­'9 kȧq(x {Ŷ"Kڲ|'`STfNbNfqbqɌД12hMi|˙|F@,L%~?(I2p\a'Yk֕ 6iL7m"aL{^k zWAyspvU6vMfNzC:u[ٻ;Bo/,CxPuڽo- ?]<(YJ˟?Wl.^V\)`dKy22qĬVEeW>y%fF\'3,XE y͡hY0daJR+ CY42*a ]9{4j84E DI 5WؤeU+L$erfL:}]*q CdPgBŰ(ƉT,@^ xR3٬a( ҼO=;`V4OΗJ2ݖɋ̥~_:J≯hl9iMy|(z%_VrHPe6Aq'+9w͒DSI;c("?FT|)eR^(T;6f\,$tw4Ѷ \>>>PS)eOlO|O⋉S/_蘬nL/KcZTt5'sB8_)%}^=S-6,YȾ[_.ޚYds}־#% • 0Y,d8\h69ȥЂ|P$BKw Rm "ʶ1ĝJ\W"h|Pǟg1V;5THɧja aJjzѭB XqGUXR/\1xZX_o}?G)Is}x~X4dШ$>{ X?H!{')^\`ێW6[ؔ51S&gF/L,钗HcG2 !5¼U#F 8L} !lvYem#پ|A X%r|Υp}ΌGofR)N ^ c_B(cXnz< !+f0f!VQ==Rbwb._XSb[|7g.#P^ZS8$Al 0)d3lP*-f<+fה^vrT[Eϔ2ffMf(3ٕ2S聃Ep&-L i<31 qU|ث>ow;3x&8sLDd ̰jR5500Q#}Fa h1ͭ#jχLkv+i(R\=jnob33fMsulR--Kj+cB-LkW* Ǩofari)4*|A3fk5 Ks+$8Č2(A0}Aaq'M`U=L:$(TĴӘSPEܔp RDc Z Ԗ`vWL3]'=M H(FZ Yh՗C37ʱ.=AnJ^e=$/! :ZZL`t1b\1-d^︫>7 K-[f7bq(7E%Z xn 1le88(Ы E3,XZpn %Kl%Dz S./gпEXHN?YhÖ%3 ^Dz;hBUb}q|UY-vApernwɗ˷J;,;dG/V7Tр ں MeVBH5+V(zAĄ2:YYk$q4j?SG`AV\2^i6,1\@ ڬֶ6|?wE'2A|hj4+Ś)4)zuc8`)xъFY0.FF V XwH2CI]Dü"7AkTWb9Qdzb0VeFN_ZJpDX\#":p]!Q[8#:6Vd5=7|W8q7<|ͤ$*, bUZV/x@;vcn':]:/dlX𭜛%*7k۔ĠZ(x6>gӔh,lה(dFt?I˜mCzDܧInyO=>GT9-d 7D~]PMQ1*{sTϡX=]CʝՋvq3pE׭Mtj~.wkǷs -Ʋ Szy$( 8izJ*P!:!Ha%VX$t>ZJc}Hq꛹z riU02#!p\:H'?q'uZөz3i2;^]I'I~BSkݶv=}-cbBWĽV%Or,Ir ՋfjUlklC]6vo`#i%< 6*V6IƯBLH=6Ru 2W63֙5$(a@B kziGóN:WCZa0ק}H4Z"+'gadRNL$n}~؝ϮyrCЕoڸXd_g'9L󲠒ǜ_=͍%Lg+8)pVJg)$n8i@,ʸˍ.ēL.3X`!8%ä~V ^Ӝo r}8rp=B.q`46яs\_ڐGBw_sr?@{kk?~P/Rީ&N$_:u Ű€| @l4@L4|(|1[lS-tMIBXn fjEʱ7VzY ͥC`H@kњ |8Sj'xxx/Xg^.W=~| wZ._&#柎A['xvOL NQHr4FdHGz:R,H^T:0DgP ΙhvJ%"u~[Er"`s?[GsŴg[4 >Iwa;ɍZtØy4r.:&OIP#%MNCjtRGf=^'C/HQ.!]z2̋%&ˠ~0xXFx^xYNuq-3ޅHxQMf[<!Cssݵ0{g*f!#J[VthDD))f mz]x7/ xAg9ŏYPn ?O~~rq€8WS㄀`ہiE-VG{P4vvt=!=a'}1I[<"@ 0ɵ# z^uC~K5 <{oƩ#X,z\ #7/{tGI.ĻŷDFMD'y; ]1-Z>4 +vΜC;%HwCg93Da&=Oc6!$ [ ;=`JĠ#;5),(&5:%J$d*%n8||ɇ^9%piyolzuoCg:{W?f5]  {}ͺs =S!nn@/nޘ0C"ɽ+3͗x9SI_*τ7Bb}:XcD" %}@Vb|3ki4j;aGvr}>d(yײɓcN2 DzZyrHdow#=֏q6 Wna,6P۩qfŬ.GMd#wʱ%zރ]RS{RQT?w7|p+(GG,gw|pqク7v 7YR~36M2r9xlI%g:QOOd g1 p|xX@<>PT0 Q,gxr0;PMhj8QuVX<(^kѵ0kok0S1bW℡TJN> r/D/ĭvSܙfhG2h$3Y̜X2n82̝o M搾{ ֽpj>-h xmiHO_e D h[+(C2&F w_3[!!Jk7Y!1?M&MRQR>`Y\n7$E( FfD8ҩWb.ͼ t!ؓEifzeHgpOD5(ȚJv2l_j$UJR;C(!:u*k=DCu:WЮڽ'ć7PC:v&X|mڑV66ڮMnc"#E_Ai< 4MLD,UQŧiλ`{HvF8TPCQ 5: TPݴ`ųTu%=vmA U,BVhҾWHixÅ4sZf"B9 U&%Ef뗎}zża7Jh&Cuk7ct(Wz?[tMK=gXY{@충T+6 c{:%~s5~{سq7~d%qm~ʅ-ƾl':6@=3+ xZQ3y DHa(()QؑuTE8F5 #w1}<2~$#idUvRi)\@T\OdLo@qKm⹼g yc2 *wLw%4OOO@߈]X݅bdw쎑1i.;;/gb)hJOaFI n#W'7 $l\Dbn&Ϣ)et#Si ZlDDz6Jj#=IO$$s<:#Wx 0YbR8Z,N-Ź"}0b|RzY\rWk4W Y96Lj8Јr=wѕLA_1M$<|n*Ӆolxt9uJ`&ef\dpb$#bcF&:x b˧hKiZ!|98_}MBGa ZQ zTN"p`d*64KkhI[<,6n\:11lt̎vu "cixSc-6|i'.2z\4 =ѣ 9cD|݈1l|-՗dScs 4J%%.&zb4AIok mw+fO(ZNW6"AVHߩ:=s(ik$ ^ens:]+B~=s UФ2)ǔU9?g Mȍ[[5HBfP,rg |6%Cumפsmu#,܆ \O}6v[D ek}^6V5,Z.tW *$(ͫ[,Ytqpdh\&#~>ˣsjP:m6\"E9my@(7g ʔ򁀆mLOhtNG`M:$޺pGh\c d s#˓'S"J1.~x] "R<3XD񊡈['CB4" 3ذ.[/fAM Z(HFCµ.%oey,J;w5cJYҎsU}ac5_NB/;0tiOWX' VP"!9k[RtU XGY}MP`=EFܓhD r`EF&s#K?$cA{jVkk?+QShU;%U$# o% X&Xu)0Nr\>"B}C^xyCM5Լ±C<\f(ONϓ];Hq.`]!pq.NjuI)z~Ѽ#K?3pN7^K/djm6P֝ 8 :.fnvk,8l)neFr ]m D}2ki__avmSZJd,H:Iyɾ|WyG 3f| B#ˌȫ]]cC`PslȫCCc!%mE|?E>R α-ޤ6G?*|VSTEQ?fC3X!wqsz6,jFZqp e#[Zl$OHeqe#[pǸ:+=ܷ3v llɭ,8yXm[V?ѯ(%bM'`!JT5l)t]tK EGaazw O/c;xXY@ x..Mo2 u&ZB4- JS g,B;>11Iw6Uu+HV>i]g8dqHb{EQbGLaHf \=kmW@v4_.y|{dpt;ZlxK0zMzXanipRsu4qi}ndT9$ux_.t & L`_;cYDU2o5 5q?D#QhOO0~p?&'Ʌ,3f 6z^c;ֈ@b} 0 5vn\1yKw80t[Zhs.8ջDUFНOj5<㱹u?m46 xd T.! DM-?*ߩY`1*úRfp7pO.7cyO@kvqdy6 { Jn.|-vWeXxǁ9&=ީx0Kǩtl$i9a,%6'UqF9g<ÿ$QOЎM56snb 9(XWՌD5)Wm..ّr*ɪMGe޴;u(ZdA>ll'ᝳ6wig,AzL:l-M6Qu)a"alHKm=2Lv@mpUW(Iaw|1V)'̫wx3?Z~O(uC{$D~G~>̓k>zQd X(,a*O[ɾ"7s,E7R#ܨkIIA5WB>g fO*lv\vܦa, 7l1́s Ev *WAWңE(CXR*z;?"mˏ xd4v}n_xvS`>qZ;?ׄj_|5W'OԾYw,N|N/ޞ=sQbѶÃZ8w6bK7bAEDEɰb`F e*=fq D0NQo}p?| M/&[O̘ rI`+7WQO HTƃ7I\Gi/y1sOtƞ ©6'+/(69O\rh,`RgbBLgnSV%1~#:4i%!~ģM mG84Q%=9W!P),4'x؏W8r╩8\.=h?l (bxpBq" !Lh4]& *mA§,6#P(z_*xGN"(90 {Xd-Es(GIh4Y}N)]Ğ~^'ә̅F1ڙ 1kZœ~E%by6&cf5l{hzqѡ֑ɾbxj~K[]q-摏9˛ ۇb&OU!33XZ-t;v$Hv6vtLh4y.ڸy+ۊX5YFltsE&)𰪟8[L#M~$ȴkҜ%%+kQA+z&s7:w%m&YZ&nokXsf{ϝ<̱hY.Z!)q/'vVh_@V?p}.q.W?-ay#F⭂C& Qp0>X|6pH50ydC|{-ߏs!C ڏ_)La0Ҿ]Oŏɼrf<AQT& ORϗfH9%>hQ 9xQ}/r"rX4iR9JQjPU&3yeb@h-Ф0% : 5(|M ?!jCӃ&˷K141^+c{] ]x,o u%(1rp9.YrܬH91sEMJmTD(vW7DgQ]X[TB,J2j (3q4CN_t%dԘ(ˉO<^N2Zg2AF_+]לbDu@`4j-afbcZQil^K[-ZAᜋ Ä# مDžE"OdǃK/T>g]q@&Gpgl4KkX[ڛe5XΏl٭G}y b7msϋnD_ޗn(vg7^C[ȵ7LU@p 'K| ҙ!c&$>zHCLɡ4҈ S6rRy\:֜zYJu kvT@$3@!|xv/"og`"+qk$d%1Ci,SbY=ͼ ,9/xn]JG|/7U|=ksU|JZa>Eob|2F 7 !llAfTa !ŚzЬAEy3MfŜ>r߅+*~†"8\ pVNmBpbKlDp]W;A})`w^}=ZJgKc캽Z_M7ﻙm?G_0_:Ik=Ⱦ40ixL5dz`Mw%D29tJun WykʯanvӤ+d_̉< ;tN$% ϛH5x[9.Y3! Mtr:>ǂ7"fi01)UEi4؟iK+ڣonӭ:6I\"\HT2M|7lN@Q)4^AD(%dy3g愇1k3+"6u0Qm.7J#;_C@ )$h!Jb8D&L;DĿ> NN#p8IaTvKVW mXC%37 14^M6OB]Px=̗W~MYfwelʗ㏭ orv{K кJķd&{IG,/7זD2wհ;1eʨd1j X}U>&rBU]P~~Yݮ};jwcH=}uSpO3sڷ-?VS׊vB؉ͷm$k[m:mJi C u-Q3hާtuJ-f,tڣx#*G("xZj JCh^.Vߌ}=JE'g4IpNN]f:MNOKPCde+ԻEd2l=SgE9bkHub2UBh8dJ@Q+锝M0QK[3Ӝ^Ax6pk_.h诪R?ADzݾӇD (rA0Gׂ+y q$9R YB I ~f ނd1&U儝Z^ 8j>j9νa|CiY 1Q6bܥ@ʺ2W[BH1.-0r|wAhQdaRZX PAAq8t>XلDjJK CioV>Ђ:Wj*K>xSO1*s"bm!HˢdBņ\>+֣v|*vc #x0AСRlh8;G@u:JqPWlbɖ͚ %ĬE I aQy7b k)nBJ#ɟJY2 IØ;q`9w 8?$j@rq/`YOSaONcY=>p:pZ:Kz$sb5O vT8R41ed-Pw#h/jCo-#ӪEsm:L<аU"M!U2sfV`7h>7_6W\4HZYR֡wJ]@R{1aѷ-*~)(c,X[̠dfx¬m2) /xZ}fZdmnFj < ΅}!Ph8W% {N&KvVLu͹E)5sP0{e͋蝳VDPZGŌV̌O=;SV/L3:3 NL܏~ٲΨ\oL@;W4!>bOP%(ސK7ݭ vNC d [@wZG &獮ĭ>fn׭{{`|8~{=+}jDx"cfQ8͐w8c$q-1d<:C릈"66'NU\G6>z=Ƽ́aа@(E8PpdsO C-鮁#;/N]A@nS3 (.?\o`'b+5*<vi ҝeli_*hLXmgb;xeQP4)'q:.TVC"EK\¾MRuLB,nљm:0[uiYlgdڮO,݀}qMʕNwI i#0$ Lь~]lsXΰ̂xG%AqصԐ0;U,hJp]|&_9pbK#9 @gGC pP1SlW\ybRHÝdj[쬽HFlY[ⱳ") ,ZhW9$IM^8;Nv6ȃ A9 rmk&/ԗ- E#*L7c g\<4 dѭX_M [v[^0Fm<6 OY@[:/jt@Ķ5,\DO]jI>$.hiE9 Z8Ti֔gm;m;X&<Ծm~؞_xؗ7U_B%j}A t\RR뢃Z`(mLn+p q|tk,8^[ɖ 3ٖiZt dMZ8n5Agtpꃿ~ڃ_ :j֍Fb/CyQnF 0lql6a(k喩v"4Ӄ,Ύ,,sr.R_|#tۂ__;K1cy*W>$^$0#v6VAQ1Agzi&#xс1|@M:ia2 õSL~P;NR>ҧ))Ym]1],rzY{}jkulY P&Qtg=;W=,=ř%4UUZ PdY=P4WUF5R7#__H9g 8\+vDoXkꍮJ2/Qb608 +"&[@x[YaP8^&Q1*}Pテ Q3|(鐠Z`PP7#&A#s\^,Hf,2'5 eTtROnn=sDGl&>ۆٱ$v\,$*._捑JYb"TT%UXWTZ|C‚ dY9 vϠCpWWXQ9bFcc( D&Á8L윮+ zV,b fsmon| ,Ƅ=>ҵݶhjCklanx:*p[,\ko-O_2=B&  Z#X@X}ʿOFֹH b80&pCO_%YƒPF NF*'/\I< C^yeA䧧CTToGo"͘5?cEPͧE{{\+;U-aNՉ/j]ŨR V֣Ob5/&E*٬/IOtLjpz_ ‰ /.]c]+L u?FLQ9Өz x'U -"ZZs 7NtW̭J$rHFL1IqL= 6X׿w]QP*`5V7/kL;$*(Cs2 ~5SOmK[‡2ܘ ^ |YDeM"<k$̂ x=@k1~*Cؐ]c c:P0͵t c ck6hAY4msFu(hg=nx{ΨD\$pdl+kaCHυy#M18|։; Y\05YG70qk $YYĹX(2V[S&Q3!eXƚt!=(, g8sۡA=]9Nxr ,&ws0۟^Cuw~o)䵴EdmҴL)l5 ¼cogӍGH6mF)}GW1k6D%Dz&$\$a wWWJn.,oZ~+8bL0 0@w}Pڄ1ڰq]| qs䂖Mb5 ֚ubΎ'Fo8c,c ݱxю`b` n+aǁqM[= v>|CEago`.9'k38XPa 95NL1.3~2!虴; ΤR;U:RNJb!ސ͡weNi{5h ,EtI~iJ ^_ o}7fgbqkpyo(g }w}u# Lu0!~uW` s&PhY22b)~֑Px'`&kS&EB@C <@SN {9\]S䪻ě)+QlYq7I(G1ü6,Uq/p|3 bbF%t[ܪzկ>@B<1511Q@N275*"3ea2M ,hs(:pU YF+BkLE5mɥYp:[!WHb0B'_?Lc=ÙOʌ {W I0l=oS5嬏ёo.Z .'-ueG0IՄ{( ޱ@Sn  -IBs%5_5;bkWL{ű" evC:blvҴxaG4:ѽhUsy9Kan0=ܽaM, ʛ7]u1oM"ƣ|s*`2gMJ 0nu=6g4t;LUJU 6]- y/jWpCu$w\bЬܺj!͟p=  E;!k_u,#0&߉oR?lDuS|IGܼ{(3UjUJ=`-!F> d'&sBs.K7cEJwK"8#Y5L"I^:0 3s1m'p 48,,!T~]Cbre6:bh]xw)meSe/ I㕝3'h@'YX3[_q%{8woS0CIh:i@MuBuӸ#Dn (S#,:S'N,7|*~w8hR*!W`ُJSOEMj)7_&{"z-}3MTi{ FhE 4h#-,(JD<2p :ʦQu.N g%G*e53} :ԬeV=! ;lACfjoW47HY%% ڪB q`-͌kg-y-x ƞ |*u@`+<(8dlGw#~ 5Nl #D8OdfTfw.s9ie`G|xLgbZ-Bf2h$hPQ1/Yl:h! CjiiUŊOotݷ5`t4pM- ?c\-}v%NnWOYM\) 7;ⶕ&Vv]1<ԝ=j[[sC뢔HE {SjoG6tx0R3ԫY .?+ha3#^ExX**hnm7\|~?@sfaNn0 hTeEPltZThrb/8p|ڋՈSiAl h H#ğdWgoL?4X$ݢ%Hy#6|끥K?e`c2:Y2?K$쮸+}|˺6vHVGWS~~]`ߍ t5-nOR&Rc4!|и?v,v"FbvoP,Sd@Dfvbl@x4(5$vow[63qB9ᑵ y{Ne#!~I*7e`gw)fۧ?jrݓJvQtywg7zj;k2Lևէ]4"ֽ?V0˰ߍ*1Hh$M j6>؃;HhFb5k׸Bk_AYvڃU2rb:pBrR+K _B۩K/_JbJAz=6 ߒJ%Rv:0s(lsa~?ac[}N;Lu6%twN{SyMM4LF{M=O/b;oٴL8;)3/RC㮖T%tV%X$8޳!wcL%21 TkVn fT/HPD${$^XT"$i4mi[Z%J&k ۣpޕbVLp5NN`*UI`2R/=, k(^-òe RÛ| C1B3Pbj4=[vN() z9+A*M֘T|6.oႈ[]?P))o!8#E:@Zˮ1#[#Y]V~f}-(9 ^vY܍7zmq 10:+%JPз1:.Vm@`qAc݇l"v+>}#}|(ŻFsZnGr>~xȃ/lD[_i\Jv4jC#ݭE U /A)IEQI!zƧͱKVT%+EHh5ZV9.ԗ(wwSYD! 6Sf5Kd/ь9ߟ ?B)ԗ:Sgxbblpcz a0{Q"_n#4W=y}D.?&H1]P)G{RoL3Ը2gRSąYo'׶jd|Ky\iKƣ+w.x5-&~*p:h7BtoÒ>\KjJ#BËJB}+ ¦$Js :c}v2~ ϭ]Qr- vݭ`{1Ƿ)*NщZ~LU)1G)a$E(DyѨ̸MZ Sf~p E5&8~6Xnޛc6Oإ{mBmʲ[/Kq<݃V1}Q7cKװvON{jԯSuՎ+CGa 2d҆>td$dEH҂kᵈb$Bm-bplF#b4b2M/0He}gxwylB+H *I:6:^;-d]PH){Rx >dȅtfe9Zcd&w{WX82BX^RVF %DH7-FIQER$Nz>.N 8ꉣbl'hCP[, GIJ9ӓ(g`GږnYgUҲj<&_=$?|֒6הZEF9fe'iYG56B.'bRǃ(QyO<_+0'7j.KKFrRAt*w;YNѦ.@1Ko쾏7aIXK:AHPe62#c=q{N*ʬSZoJ҈=㭭v;PѮXDpJFD趥hU"R=яEt;ә˦ӑ,f~7nH&f)RM(3A2'fd˗E꺦^WR4Qg#D!X{*6xL4u|u] B4JasرۯFSS[p}LڢShLfIOLv0[fԋ5֐#_Y[2VG.>v"TS^ ෨1o$gNJ++tbTb trX*skh4 TnJ a`0nO `yv7,vF1%)bjF")sxntw7mxc vR-AMlH#XgHoOP-_&TUv덙.jūlȆ\*>^4ňx o; f[PR߾|,.$VNZ$D=`wlx7GTSNֵ鉩#3=ޫ_, 3ݹq-) BcKT%Kg|cލ^Q_FPl|!ɇ iH .)}!RIkKPJ2.9)@c(a7 >OH`4>Kx)7!ZI_[ўo( [2}V)4s'(?<ԭ.et8Z'-@W?u*/ z==~z0PQR(HP"%Eg @ WUX8ǰesRuMޡ\׋x6/gyF{\{-dukȧvMqcœZҦh{b35니#F:zŨi .kא_ArMR>]RE|J)Qa4hn |3|eO嘚+(5J wKjO{Og} O}K$y '&jP)8x_'R9JyD L$zNZ(*qBaR7yK]zWɡn#A0*{*=P =6zj6Iz{Ҳ&|l=K#NyBY7@Q SCG*'ӎQqh8$IŪW*DT%3#.;ij{ y4wB~ DV\,5MLmyu|q9V5! aH4ɽ.cO7`v/I4LxȂ/;E^5R&ڲ U-UH{\*YGkNL{: ;!7*#O(?>F}I!}eA8;-w[Mچ wwZ(;w~:h%~_=gze};wνgT967~ON}lfb$ D'o[:>)M^ؗ`әlCW t~C [g tA:H tү|S=HM)/8H 5-Kޱ奯-t}鯖~KsZ/M̲g+zG:׮O_8ջfe٨n7,޽um\*U_^~Bopw..\߽p;;{#;ya;q;?GtA:HDQT/e LN+SG{<2?BɫQmT!A+|-F _ryD׹ \WHK1[uJ M>@%Y! -+7aG伍$$8e`A_!bNwQ)i6i<,j$/Ct}𓥿ڐi5CFgld$`Eh`.sP -" hU%u.˛RzZRdACqrgܯ@ #x.LAE§e2kndzE2̩y_"ClWlU:ïYP2*rCoGA}[kL KKWe2sv_$"ߧU/qW*6g0[b[V:ZMN2{3qL"jE!©{L:n LW8=՚<Īc:{0x* sׅ9goݳS|ЯhM0&0[CC+\|Şvk2,̩4XyZP:Gty{\| k{er1W[jPYДүfRi'.>nr{8Sh`\{|9-|G-1kWu׻ϊbXۯٵ_xlS[j>7&-7p+*\] 1*Gj;NaKơ+: 5 p,W#:N;F| cSpظ!Xo:A9r qpa(98?J ;b#q'C9Ӡp?Vd:fp7 Ǹ '0xj9a!<1ahc9B3aYZrgs j片YB^vQJjPy$6x7K,.M8kҗÄs䎕0'µANG=N41GZes !b_Nv&Llqk5sR?IV`gO0^s rSL4ҕd diT*0åVK!&ϭU+lR(_(bT.\d D~]eKrik0|$xG2׷֘ri.(=\ZdƶW*xbYoZ*3Cťr~F6%X^̗ JT1DqY)1B)l,VV +:[ʬ*&R|qPa`F~gJa#_)9ꅽ7Ø-^ϗdq\/j9ԼN0Z)"+۶c.kI݂aESvl [L"La(Wg0dk BNK0^)Xn*;aHvp&H\\+mxl7RLp9_XlOAWd*_*](4y ~x|$ fn2Ze'[1Ϸ37=2<3c瘙l.2sp 2Ǧ3b635a2S'#S ;13cgəO OˎO2Coj8D:?9P9 l27;<Afd|~ f&3;?>|l"3Y;5>52 &sS!ʘ0sc 2T`?K99;>:6όMOdsP82C9v( jx"3>dh()2x~|z 1<=5? Arv\.df0CFf<)SJ````fk~cǼΝ]]]߲]2O|DIYE$]#Q~?\S:Y{Fģ@29ap)h}+縼ϙ)olz- 2f_:oƶ lO§D~%=?HD~PtP," JmP]ܕCٵl32H2-xfKlKZƐ'%T$TdVP~^纸s9~ݿ96p1j0 LaYƀ! 3 ڷ~ RYr[HT+v-, @5$,( %.V:CQOm[0/u7aHAc,`H!'gwG_w,#RH1rwpr8AC?)hc_7O%k6@Hd,&~ #pJ= UW 'TZXGXo/GTUђ*JXA8@g ̷uT ( "!$0T9;"30?᙮H=86Ԝzrz0`TVrdnbiNZbꈿ{@|t\Ek{/S,W>j~hHgmC}ϾكTx=Vܑ .:tjFm57V#P/f "Q'O+|r`c5j· vkrw(gkL;Þyug&g q}KҮe~GvMHFqG &sH$J\<"T<06KhI ۇǟjCc؈,R /=V.V(]P^ ,,0;oWۏyyIx8SJ%gc|$62H%c4$l~ׁh@RQ I(/ijaʴi9JK1\JH=\+_EN.ulC޽{+a[Ï>-0_]U[d@>'%\1 mg2kфԞo1.A ! ܩc 5m7,KS>psv{}J.*iA l/:3b r) RupS<juϢ|BSʽq9;ib?OP\[|.Ѡe<@Ylt 5F,XQCY?"Fsow1vv\Ő'JƮ bq &'F+ibRBGŗr+r۬#$Jb./Ml㨆jN 9 _sϞqofជ+ٍc@J{xȍZc$uFV?=3uMzګ/H|닟zW .Mm--)6&W{q/3'|2j>hHo[9yT WCwfW4qIP}ݖSxwl8#rrn)t):HnЧGeZ *ɀ F+vؐV QL*N81;< e+`BK$h/%pR?PU7nZCP>,H dL5Au Bbe e?Xt SGk0%$Dw_?uӋL'[57[NLf‹Q!ߦW >AW+-L,Ss%trӰ̌1i,ke|Kb.%Fjp00Y;խw}U.a`z5eWC?( QHT8Z-aRX+."MEc5j;moph\Hss~ 2sQ:XsHnE/8(~[XbWΗ,3?$ }ձ[|UWQ/aK<ZZzX޷~eGn #'CJ s=M4hƬa; *`'q@B5V? yٗl2Z<40_JcZFO6P>j> Xή`nK>ŽfᓎMZ#tK^DU_?ARjEg 4!O9d!Ԇm؜ֹ:".͈ۃwAhvndmO4 'g;_Nξrd)@dîٮ}q']0;k 5>g`)x><7I`ՊߥWl| a9MR\̜#rЇpz~%tG;Ja9W]/9yn\1"Ј~*Xl,~nH_:ݓT7BrZl&Ix7Zp7u|& :RfAUp*ʀ,Pxï^Մ6,W ȅ\ʶFm+]V~§mH6 l߮.)b k+R798&lI:T8iD,:7N0mw'1-@V^ l@֡,,0ſ.ެ&HuA0":EϚ*0y7ZAU*{` .zY# "-l=V\V [jQ!baޑ%vM)a nƗg%xwyOw=2J6k*I_S--`wmoݕݻ$9h)۵_`# w#ee7DcϺ(濾c!A[; 퀐s917HRff*u0QIi;H/ߐB]"̂U`tQ ˣNGҌ/H4o=A5J8g$,ij& xl^l9{o7f1_ZzCU@g!O}`5 ~˼BHĄŐAeAa^*F1-a>+.4kPXuCKˊ҉zye߻P?m4,ڨsu"wڅEɲ<=YWɟ0n}lPD+:n^mۇ;-%yf0T+_ V߄Xkv=;A6a_Rp}w[)S Bu 㖙%wIA=v#Er$?oo]&eZ? F2gU#tH&|u_1G>/$|Ǜ Ēj,䮷=Q9AOd ,=d@R)QWKx{!X,TzcRņQNPtôCrܒk@[#[d0ȜߓѾ/Iq7 CAlͲ!?w ؿ@: ')'빺nuv̽cxPۈ9΄%5 t:!ROu;Xc;BV+~j\ϝuK:{*R`/}.m}ʑF%+.C 4iw=}7jHU?yjoH\D]7XfҒ?7<(,){nfy s)^x#9<#·q?UIK@ԕƜ`=bdCna#۰FݞW 3l٩ƒ:&) Y\>@GI]z徍ϯPz]dxҗl^POzlR&c 4-OQ͏KAWNNf` ߒfw7 ~|BKvһO9dRصz/^Z 9/0 .we3xॊ߮_9\vTOSNQ K8Qe% ##@X nB` 8̍d7Q;X?-v;y# K˅3~ R.-hk `z)`%Jizo꡼( [(mm6H`[ZZCfikƅϺ ^pC:S?/[ЮŪ/H$ŝS ~GPZIRKU5Q#74cM[KTf*eX '/ "=z2g&ev^G}mqx/aݐk Ӡ]j<:Sv*-Pidu%!\[yD «޴{]]6tSEQ{H=cdXmS2 ]]&J:PA endstream endobj 1107 0 obj [ 0[ 778] 3[ 250] 7[ 500] 10[ 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278] 32[ 564 564] 36[ 722 667 667 722 611 556 722 722 333] 47[ 611 889 722 722 556 722 667 556 611 722 722 944 722 722] 62[ 333] 64[ 333 469 500] 68[ 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480] 169[ 500 500 1000] 179[ 444 444] ] endobj 1108 0 obj [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 250] endobj 1109 0 obj <> stream x}RMo0 +rHaiځF=쮟RcT=sL[dгV=rxʺ~&׎kФj(b=z3ɲlw丯S=|&ͳֿЀ1+s7\MҞ03c|9 S%t:/jN'f>9pali.OnLƘm)K$D+s0Nf. .;I,Vk*n¢0>i&ICx=IJIۇ!^!PR7#t-u4al36lVd5T endstream endobj 1110 0 obj <> stream x| |[ŵw$ڮr%Yre˖ˍ-;v VV8 M0!MHH B 7.Җt@KK[(uM>(|%ޙ{%--}_==sf39̙` ҂%'~T #7v~ @j^UhI# +xuH bqؾz`[Z;=ad_=`dxUTct ?4cy6:Xڕ"7nZ!S8>ǏF.|k;~qٲno:W_IXZCp? #om$XPݙj0x,>a'};Lc9jlX(uc}h Gs'&gRrˠMK= 3mJ51;o|5KLh2ԯmn Ζ5\Z"h'F/V{XMh4vjƌ[ = DB/7 1QOi2[:uc/vH'!C;qc<9d4} \}B.F`RҥٽcFw~,gG |CiNʡγI,{Eb'6p+ +^Bv. IA[Ĥ!d <W#SxFw ~B]4~g?GV8MÛY )u1M ƧR1҆9>;{7 3a&̄r""p_~n9!81>-OaQߵmp)О0?^Jaܔޭ0'1>.ޱ!FJmoO6qVuoMR 8T?s\3a&69p Xfgn.cWȨZF{' ~:Ö́0fL 3a&̄0fL 3a&̄^ R뮷3%uBWzU[פ"YkH]A>v]@ZA!Fk 6Φݰ 0 7"&[VG68aswy_C c$$hLjaBXKa l|ý98԰/pU!\+Fjla,VzK`3l9kJL?w3nҝZþ|kORg/'o'_jw_v%fr]M9Hn֬^r-jnjlEk#Ua4, }BqQa7v9v5MFC>Gpe ̸ew@FәxdgGdz}Wf׋E7wPyUN hE ur 1Pv1r11 cBt]4nHΕO<0Y:Y)AdiPcᓣpQR4Wd+ .G crXWxBװ0yZ7i N} hx] ıL9w+[%牲 v%] ͎{qJ}4E!pG6kc]IJ);,t h*{e|:>Rir(y fFauT(SCy6i Qa)^>5:B8$x~[Oh^2? x:e_y@Fi0Ȱ2f$O$|cUYܧ G]PI,;Y[<*΁niN7- -R`8$Uf'Vf+r{Oʁ@wrt; t&Gw]1qt+)( 7z O3 *{݋dۢtAp|^_DV9~sqlFN^h!2HUtub"J;R!`׆%P23Cm ;>x\0#Z4H1IKNfKKiɮlDdݷd Xbz8Ƿ:PP*WDS"D!-(yQt$>MuzDAhQ&C(yi'UżW#N5Hie6uNϫϳ Q[j^y}j LmlxZ"E !t te!WLB;}:n|tOMzR8an1۹#z'g{+ڻn#,t 0K@J?˰Ɏı,8ޡpYʥLh6G=!RJ9g@dy =Ϊ<>cǩY\ ^L(sȞ#Z;HAŔP[޻6!LtUze=56tFkQX lT] 9!җlC=fYRԄ"Qk l'ڠGz5 NjY|YBIgđ `ڤhsv #^wu.NL!d0*WP.Pe*yـ# M2^:ۇCUBYt>:HbD7 'Иm}(,Ǔ*WGgnT飁I2y &xOSOb| g\1M@+4Lp7Au_v {+rzg⃘lbrflߺ(x#&7`n]7|e˝;:=up}y|>կQCCܭc(}ѯuZ"5Ypܜ`q(9̈ eƊ+tngڥocFzFܹ_zF܇qq7Ɯ mp:a9QơvǙ\) J- 쭴Mo::S!â0,Ef؂HmyF} 1d`鳰q^ b@ Y0K +W.cb̒e Mn]LVn*mfL)10>6RRj)i-E-wbiѷh[H ,3;d%rL;NrT W cȕhen?Z~t8xh(U r_X(mxWaBR:LE7!.ߚylʾ\~K~kàB@\)+pנ\ʛL{/z9Hny8.f W0e^GFq t`ro}KUxl!}II|8f%[|ta} {1j;qa\2| /q63Lb\ؒE۫2C5 d~ aQ6յRHVCBC@hG*+cS֦t*&@dթSOהLM5SW6PofuXu1c&c|y4 ZgE+nK[uA_i!!ZR-0D6w8-o[1;<ͱ9)Y1ttf/V9Qtt13N _jJj{ds;KK[;oseU \Ef<&UVk5f)9]GNK~ߑNS|7Zw$CYA0%C.49/I0QtصZ>\@VYD tƢP @.鳱/gW_v姮\Q)Jfс]& >y|q%a]* UDWb~/i\Qh˖jR%YnŞUkpܞ>ýY"|5wJB>ovZ܌vb m·d(KXmhǤrAɧOY*I6"6tJ>w`H :܌NAo6ূ\6!ur/JI^]U&TsϏ]2?[<׌Ǟ߾K啥5w -Χ;7Ē [q7qxMNR[( 13#q0D3JFÑqZ)RJŒyoIC,"*XXj)B:$y%m?T\[T-%"A-޶tL, #D{ 3df*q"%w{CrrN(|5I c$  n,,#iOګsJ*a{JϷT*g'$#@m(&[945oo!ڜW5uW=v涂.lMr6Ȅ23 PbX H$Pq(z8DH!9$ZĤx5l\}pr3q;p!9G uLSWOz:ein@ F1 ]1Nӭ!u-G"Qօa2q9l̔:y8e9UlTL^l7Ė<(;|A瓈| ed8g>g$'[\E*9, y7(AVP(4yYpyV<؜XTaS`-V<_UH"# bڙp%'-HjW>,3iO_\|p3R_=5sТЩ]/ߴqvf ;aF3<0GNx%/VMh)mɥ^C'z(c YC˲lkvU9h۰a\ϯ<ëߝ>~ecJk.aܽWݕ}ffVSm#<_!REEb2UӘT]]vzܞ#qwIDJxylvKVuS#PdŸKxc21z63nh軲?n-l-i홖u]XfJR.2Sȱ]5gHn\n?5 (Zd-Z47'flV"DvJk[XǤR'[p$-m%cRiHtcX;NF់>I,y_zO0NU"t4 hgb]p74 ќ̡暶w]2R/q8/{Y͊ ̛]۱#}BKW_xs&WqLߥ5Jr6:]hy1z:P)Ur*mάRoE_Ӷ%1ɖJDtz^^Uj=T4o-a+bsEC!j%0D[*1BvTlYd7`u7,aEduMd᜾W~sU3`xHsU _^lms:6\1oeMQgP<e'ْn!#As:G|c Gn۳%w*f|rMЯ' yV5){_8>2&-MQCpeyijV\9_R]hzQ3UG2%F5KH)L*rGy␔d H:lobP*;{I0 s\Fӯ>d#,h7RMmV;*>ڴ~yS'9+47pbOWj bɫ{{t!F @ܕA-d x'01R!I3EG鹊/wz ȃr29`\Z}ER*eUliC0F&D,c-aԾqSywCҪM03mkť~R.)}ܿcaPsW8=^;sJO̟;ڇ3(_%vaB)܅=0Gt_NO9V#+%+? ڔɼ@{S|U< $a9)D|7mxvc[c?wq-aq7t]/ܐ[ts^w8{f?zv˗ _Bi A#<`q8Cxl#JJ*IaYz4ns8Im~-=$;s}i".1M>u*Z~ur7Q5Z^o-B/;k0kPKIZmvg`M\hAs:0%7(>Y<` ={$O\5Kl R5K},x#zwWDsH"NK);,Yɾ1#2*H߂$zI͡[oN\98HŪ۾eFjm^M#nf;k8Xqyt仚! /f/h <°B"|X n<M"Z<ϳ`#d`tj3>l=USt}SF~![@]L TJ[%~syyQ3ohqq\H TTU~5WƧjU.|/%M9+.!}ץf+yvCAk7{dZKqq?NAA':;͉=޵Dߪϝ u¥V]E}tt>jy}3Ů`^ǚ5#M/ҋ9l[>̑מu㲔GX5&mZ~ R_k;6|ahZn` '7Ɂ3W/쮩*)x1ms<+hޞ?~% cxj@.3R39Z)1P,D"Ly)/;/Gy*>'yxCpP;2XȠr>뾿3'0ඌ9cNO_}qk V7mN2̚tR]unZ+KuS^exxQeƔnGQީ8AhĚ8HXBJv˦Y> N,ϲFcwBCۺ/Ew=w#96*_ܷ5\Xeu%{RztXO~{hOѽ"Odfb#EJCzor$!VCq!\GIfލÒ%mTshhih%Y-۲c;'1qCv[JB  RZR-i^P G׏>ʣ Mޑdˎ{^a~ǶFrŠPr ރ4H$2 DLۚ =ҀH>/NQg&"|m|"w}3ehw=z.8F|FéIY-v H+`BӕRժ[r@.Gn| OH xq.9۰٭]+uFqwn ]Szڷus(CQ>oK$[z]܇i#F7ў~z "z񬍇zBrl/'B?2=J!3Yd ;%쓕[qd('60+Nup7 Ny$6r,ܒe>Ǵ֦?6EjĚ5.o,] DiWos}$n=Ȼo#,^[݂lXU ܕ`ΣEY(TpHɁOAVTk۩BB)oT6ppȖNwDf;B7(.{L w^Er;IنC؅B]*X0'*#emxij)+02@ΪeDRkYu毴J>JH c-Urwt|$b=wa]c/®1O@p8%𚗎I59DZ^s6V'=4mse(<\B짫veU<" sS9J>"IQ/+R]{GC[t/o=XscgKo3݈%#]c렢0g+6OxFфZC0>I!wDEc ]r 6MMROJJL>ڞJO q'JyvAq*4'R6^rdiVj\+<~ uwv3ݽ `k|ݳo .y˼r&Ễ(Hnʦ!VQՖͦEdjYo0isz3dg8"j%D"Jj-#3@i:P?*@,6GV1'硱_YRX kG cYbHa+0e^e.2O_Η/fpuպH![]7k۵|2c&/]e՚Yy[ŇT&>!eHoI- bzA\tQT]3Tbxjdb0UrF:,=NNOH2@cbi:=V:3{ަކ%wК_]wQzQ/mhǼG\ L'w(o ^$JXVICL$oT`jη6A0EY7\r DFoU7}}b۴fpzʼ2݋GR_Daj US̶>PS4z{nFkA ,W]URk;ǥLyRqs$v㥬֬v9;"Cr!F%# fŠzj'&u.TVLdtӠxqf5tX?f2 e {65׫fx 㲥XGm8l޶w86B-UPbQA-=(.:-ZAD]R+>aC٧[ow}y=-Л.ƕo`wt;6|p˶_[2܊lEX-e|TΜlBs(CR. gfFB#VqJDrx $ '05{>Ǜ=|YC gp҆+ZH;]VpYH:B"JZ5DvluUPB6VkNBґ]O!tTtq UeҕʓOVΔQ׶d472| _SM{?TT5mZ _;7uJ+o yi ˊ^[*ʘM]ˤIXCMwHh,eItS,)9.wb3ND4v|>}Hփd=o,|~p!},Ty^ Eو8%vhc06f{r˵܅EeȄӱ) 3P2WnnXF}в{vnA3i]ObeM[~-{!A]ەZ׿ )G4@$ehҽ;zjgP(c.fct} Q>$xz*.J~o+Th(7K@L{Y_ E7+<ذ*ҾZM1^-aϙjK&zf,)#\oۨv||(,l%gn]s$Bd?/$-f;J`6Y2!(JQ9 )2K$sƕVeywڸ;3;1!Z)bάͽh<ښՁf6\H"H,2Be 6'JZ5^Tk?%K3e~his'IMO`-4ՊKAe'䟴/ɜ< @ϰ}gCO^VbsC./ǺB:>pnN]߱kd{7CmWd)ASۚE6B-R`@gppl'BW20>$9FN1'A+'kCzK1۟軰ӻ˷ ?ecQAu=|X%m7+7h]smۗ@ߌeԐY8Kuq1"6A 9lN4!FcfYƋa 1vZC,D>$:ު!>qc22 S Ҡ+62芃>/GuTu=,j$7DKL$L$:UAw2Utg|ߑZy?Oi!D=DcpS%)֜>O,5*bIw CӢ7hz+^Ⱥho3H0 h:!c]P@͘9D~ȝfbELۺ ;˫S W'մ0~wQL_;_?1۞R-=%,vĘ; e$,gcg%BX,iؓ0)?N<4SGm@ V?gmzϞw,A]t+[/Z}l4j5*ZH4.(PMwK}́B YL$Åuz?QK K9Y)EN@GnIZ!B0$sryUfnS R&qъ z m;1{]+& {QBd> q?ĺ6:mT+*l q8nmen@2{9R̡sz@x|z3 :RI=jLp6;^6 NSz/ TD9Y=8Q^ jGb-{fۨ1-D̾6,ŬN#3GBhqv9IJƉ(bAlE0P̂)%RcOeV#r >"@RXb=r5!U!js@{~ 9BQ>":.*ڼ!Wty&H`|[ aCeuVVE/1=(ݦqişbѦS'j}*jdiZMIag/0#'CrZ4I= hu.,C%GK'hg ~@?\) cbә0(y/C͇-Ԏy*;bʭ3rJdV4pW*{ w%=ץW藻rX˻{weh$˫ތdzWf8MF9 KϾ(_ ǧu  ܪGnZgX/Km[VSf 4fv >Y:b؀5bhtV"@*G8<UTR&_*7,_2ZX~A=x|׈VןKmb ~U[{76g䁃w#"@RDEb'lVS:KLEQ1ף&h245^O{J8\T əiq$+91' 'ϗƮh@i| ?^*78Y[MqU~ƒ5ͶhV`{u # U<qD:RG0#Dʝ|z! +#x\.3&EkӁ^.D-NBk]  }rC}j]%ULr $Q+%?ƣV(Q-fe|g]h?&2ʙ!u_-}+pac(U\\E~抱1-/Fi;=%DM4K'a]cYpi|3)Ǝ]HE|4Uʁ^epTqpq# oh>q@bpX>/b3p$#R$BB@zHjL9Bk 9BG䕥iʓ&wa`%+k;6hp|rס^҆ ߧ:W_juQ._G>ӌ:td ʯm-Ŷ^l_e[*B[]9-hڠ&G)#V= ||RyjЬ~)up-Z_Iמ_oޞw#Las۝Yଟ21+4Nm%iI ?x{»f2':nq7ǟ:3N0vg (reLA%sPD(< > zY9[SHI:<@-!>& D^?zXE* O`?=9 8FwA_6wD/!%>%S*2#^Yb ]0ǓRw0 9̫N *Xϰ+#GjE&{R4MAcrlŇq"x!̓.o '0:H- |;x7!VI|p99oSJIf{a˓_yF% <r>S?J$`;-Ќ/=$'fLI˷ 'Ťj&v|= OO>FPQBkC7KA|xFRWH0id'],NIUq8~nlYP3[daX:딤[\s8 BF6қ ˡwe IΛE=i'B+%X9l\|(dďƟ fn heҘyM4f2F$1¬i{A))S*S 7DD"20;SQL#ry:+0;2#X1X*ȇg Ń$Sˊi.8bx06vN@,.S{A%,,E<&&HbɅxCO՟%}}#,Dv G. Y))4˗{Vqb/+G:l-LgDOjNRvK:%X e?|a)x/gc.{u~!WrcuNpRIjGrFhf,G9/Xgex*7W Wrn39!q鉁nɦI1!ޜfdBR0,(+JJBDeUKd:\ݾ;/>P8􏃩 .ˍ _̶JeAy*qmBތs^Ӗ5/syJTeң> 5W4aܽC<މI;=NAqAo~U%Qdd]׾`*~%LY3<-+"Q,nqxzl픤2e| S`EjK;QH:'N5}iPM9RoZ |C٤c ݧN]P0@cOmΪ rJbH&+"|uM_#pu~@?bg1:]:%@wbP틂 |^EߍfjX+T((aE{8+ckay%G9V @'v4q yxUIPxyg4X?38.JNgCQ^XI2]+&~09+Lŭ` ೣj YRYĠq-ǖHְWʲ"JM ^ /.T"|0;cDax`}9ȿ; Ɲ͡@O p!ps YȁJaAMXecnRI̔[0E\lnȽ''s-E^Cd2968]# 74(U9k9Թ A/ Wx̨S .*лO*RZ/+@2{F10Ď"|_ Jsf#МWgI"i0&z=bBu*gP~S5E~C?~ܒ4etX#b!!6bErlc=!gJAl<6#੭so' tm0cq[ebPrueӲTYYҬP>S gF2Kz ěe#&6GVfNjiirQ Eθ8nPTgp{7Fd8.i B |FhKO f?)mE>0}Sm`cG)884ŔX$Nrxu@h77 NEIAH;U=._F;֜v{X˳8vptn%q g[(?6.%d=GTgFr3yy|-8]Yd $ևD12}dbjVQbB+'XNXz@S0[f0ؤ/@.1pyzxqYbayabR&G0^t(H]4j"SHfI<9Y*24=F-}si:# Mc8=& Qb~q1cltJB.~eJeTlpMd_n)%r/_,dB21"gT:vOjMȈ/:@rz\p>~1q8\Ū;#ۓnOp-H<1q|wq6}|&ݷZ[Wŀ5(AYAtքքaeak·G:V ?~*KhKɅQN.Lu̺`@ϥJJqY6=@7eP$MEL=@c5a / U.vxyU)\MqNq.q tEIXy:IRy T ](U*Tu5EڢL%yDt"9$ِ5JNI}?-<nD?̰9G#zD=G#zD=GM0I8Ř?Òt%nh@XH3i)™))™))™))™))™))™))O{)GbzbfcvLftԃ:S~`ׁO;\Z23 ׁvWK4B ꨾u(:Xƶc+[tH8?À4rQ=`o3/A{k t,X ԁc B+~ fBTY+)l]isA=1 N ǁOqhtJ*}kH ZXVv׌P5&.v4ASjAI+ ){~^Cv1)(Y_!iM8g> - FwFF!Mٶan2D@O46v0Ħc#R6C=A]3Ԡk^R0Sbi|yM) $(vc{t eWA7T:Pց`ƚ׀8-gT_WkQ_*(rLC@QSW;zDw4m)"9ЀJ4hNgj|;Ugփ2_pPR+,+NR-oGmH(7PF$#Ԛ @"C}V³O&:zmH%N쨯LG%Έd4 -)d+zcigh 'UcD G1Ȥb[ʄe9=le$k*=!}u(4"4(º(6 m( .Z::2ҹo-kEՂ#5"57"N %*OFb,9;x9E ^}c=ԃ1eC> s w("=]%CMT}Ţ>Sv?C3ME^@iM2]fr4 94+,@Q2u[g6bԪF@CP`5kԡ^l;h3?&C;V_*&lLKNE3,;&5-brYeGkq9֛稵_lї8Q+L\ѡ2E3^'{W(=!W"0S},(/ޮ}q ԊR+6fZS; IOgHR t@y͌8-P`v fԀili:BXlGB] hhhXf  4M:pШ[ zΆzZu@PEghVAtFU?l.)PNJdrtBPDh:ިa's6UѨ!0'80mv ija v: HK VNc 5VM]gEl6렀`v0VV:Ψ3녭fV7jPc!"5h#i,ddh Եѝ[FF4YtvQˠku:Pn5hImBVXb7o fDЂ#TL(~Gu#еvv9P7CA@ mv{MVʁ4VdW#IJoVm8Rkfb>UEDtZZkvF3jMPJh־L`57[`qhјeFB1 9Bo5 +@)p&[nLLlmmUC)4'A6EǰYZA|dWǙڡ9Ʈ zŠiљߨÌSN< T:z8A4@> |AW8'ɤEV0)wC3>& R}%z9J rYtN@ezAb) $s zZMF= P3Jc wY@ꠚM`(XLtsh̍Z=Y2xVW.,[A=+籁O)VTk05|C>j4`d0diR4&~+Ȏ FWGx(q%tg< F #5lngi UN2#aYJņ6/:  ۴eCơ؏:/PUl*';bK A哑َuH#$WZjEbLQY>M5OMJor:l*#0X%PHXO+@>5FpT~.Wd2-%=E5sw%y\XX2:0-O K2Uʤ4yRZ.)OUFJ*Ů,0Pet8X}t_ʾ֛!?] |}oxv"-mb޽K#>ګw1ꟙ8v-1cU6.ϔ ^;8}i]ɳ^!UO[}~Go58؎ac5wgyTMqǭڏE]4o~nf_+ެ}nFVi26{^WJgCjc쎵&];d6ţ|9}__wź*wφeooHj=SꬆrIKlK5#"2"pJhBed88A#$caC.N L}H@/z&c偸WS mzϙ,]u,TQq֞c~ W7hSj1O|ݺ ( ;ikF,kJ`׳7w( 2o;0Lsnc:ݴ][v;)tmW;Ay ؾIFɼ[xF͛_`j?{(6}+jǾ,xǹpΚ97PJ{L.^pIE7J͋rW0qI; Wgk^+0a B{tv׷d(vEج$WH*#]:a9\U)Q2K#ӕJ (Jf}/'R/1=XqwݺioMx'Nouus['1O^{oCOObu8{_ƜemehњZ֧+oy|E~Ӭ?gذ#y3ʸߞ~}S=__a&e{eE'.e9OW/dE4qLM;:榼!w,'勘E5= IL OaS%?{}nQ:(f{n8ٿ~-_?/yÛx~d~+٘j¥oI~tz[]~ϐ[(5{yn /\>;Cǖuz귷>/Zy&.%~ui5W&dː+w^wki '.Ym01cQ /nKj`%ƶc{wN{yĜ l(Sxmד埛)sIi֝jF=Ԁ#]&[P1n᯸Xm?Veրߨ5 hLF? l ʦ\gb<{MŃ`2_{7LfT_m6 v0NdRDfܮR$v*[oWEhR?]U&oJ|I/3+=jD2K~]켺v!Lvw?_(yiOcO#nó K.,߱𓟤m K+G{'dw,[F]GǬ}Qr֟^/7~`ٺ"lzظ+ƞ;7 sX7re_>mM^~pyźm|;h޳5=woم:|HsMWoapIn.yڋfK?K0rn'.#>1s[duUʟw疯w~ =;_ X?k+#lcop 9ZɡdAW~Wœ[[m3T ˂%zSaʥ'CR+_l/TاN0z|{S}_|Xo `Ԫoa߇ o'¯S\'~ZMg_xbʙ9}5vQb˝?o[`9T&už7ȏy\;1'1aZ V-= oq5O^|_/%>P_M?]n]!OoMr>3"&(fUu[Dvϕ5V9%{k[^5[2r|[vqo _ed˷{jyO{v{u:W1j۶z9g ʼnn Gm ~(}n:7iIe\ ώ ]/(*tL#;XΥs)*.KR$w@ tA-PI KX;@mw╳-#߼wh]^h|ӥc0ߜ}#⛴cgyWb8qS}߮]4k(X}5廸ۿx9i?n܉!K-Uc|/lu!O:{DA4omz7 .]ͤMi~qg&o,K0;rdi|3_/>{r󾘾k/|,EԧO&X38̶7dQwinW-Rw_+r..Ҿbjƶ33,lNFyʴ7Y5'fǷ5u>lu×ϖG5F>==o%1C֮{mю@ Bu_ӱRȜ)3#/l4}Ӹl^&_uySŇc&MoOb g?}&O87C A#Ū\8$Ža~N.j[9ܬA¼Ug X64abd4h:@Ȃ#9 y]@ eE Y EA/v4y jr)HZx Bh5h`]bZ ΜR@Yd=uTYx}Esno8ʫ?W?w><ӣLV:\ԶYZ>}HN*%.Y5߻xOS/l.*8ަs;-.˿T`h][ΈZmh:wXj}^xϭ,s͟^xزi~)Z4}j?dZu+̝:3%2װS2w?^~c-W.ʐp~ǼJE|$'0{ay#6&&Q 8i XG<R5@N܈BFpVC~0IF<ڔ^)ؑZsOZ V:^hvO~Ȣi2U/lݑS}e׳:5E|rݫeޤ.~I'g}9J){JSM/>.--*"܇6_cޣ{ކ['?b@jK9)~<ޮMY,/jibې*u1LX7BgCSZ6~{iϱ^uqW>7[s?FHT{,ns<{[30 endstream endobj 1111 0 obj [ 0[ 658] 3[ 220 614 625 552 679 562 536 619] 12[ 341] 15[ 531] 17[ 662 675 596] 21[ 632 501] 24[ 654] 131[ 570 567 452 570 499 320 565 580 302] 141[ 538 297] 144[ 585 540 571] 148[ 456 442 364 584 500 773] 155[ 500] 484[ 225] 824[ 352] 886[ 573 573] 889[ 573 573] 942[ 573] ] endobj 1112 0 obj [ 220] endobj 1113 0 obj <> stream x}Rˊ09Q Ctn'US6i:QFI}w2XF9~d#Wv\\mIS~b?-ֲq?Ө#[l ЂdP[R-0ۖf5OÈNBKTGpR>KP>wU- e{^!{?.y[b'3m!!ALManN(qҎQ JQsQ_ÐBQ1=)076\VFt~)167U F9κSQ endstream endobj 1114 0 obj <> stream x| x9w$! dB"y0aO4AIqVA"J~V$DTpmKPE*J[w_>_ss=s=whJ{*j.tC9sWԿ}KX}rP+n޿py>taBΉL v~b* uUKyٽg~QeќknGY4WK8@Y,_2$C%+V¯N_|Իwo1X Zl 1%D xdBwCo֝A3 ] ߬;31η`[a8ZpB08!fHi^FYʃlYMX\`iL^f 0mR&y(l6-U4V Bˊ#nb!|S,l{mow8-+i39O,+j.g ~;)q0ɿ։?ebC`t \pl? D&\&epi4E"lÃn}Q/B/¿!9;Tato`d`B́&X Wõz4Ovk07yˡ<\7? ?cpe0Fn d!9a ˤӆgdBVvΰܼP #21cǍP5.64lv)-mQhfX|6jIHUT}R9g^frmeE[743s}W0Yܜ& sOӖݼ13|̮ 9u4oE ipWy [yseB(67'^5Һ:1chꍆIC|c)֢*z̷!Ir=)I JOZ7P쫛Sѿ-\ב{/n挵8.?fLv#W5:ѐ7 !Ij}"#_sW`mCS@+olv0)4v/.Sq\>HO7B)$G傡loC5ԭnD65vS!vrUggX}te}dOGo@M=קrɳj=͍VMdoj D ij,nʬZ~1ʦqtH@ZKPdϏljX"E6~^ٚp6: *F/|-#/*_$"UMlm 1>Ϙ9}楕v?=90fc-b! fP&xYNnVΐ7յ NeFQB:L5;uf0+ YCdVӚ(՜HznPX-9nAuUNp4Z>n|Z텶cȺ02>.|7PBCyO&u^^yuo.њˠ:L>*,V5f}E5>8ڣrcF` WJ)&D&ig|br7>ë\E5{xh%٣|5My6Qa¯%kdV6=l!#&D<̭hqakH]Ѱn:4g3oGZ3AGwF'S{tFƒGO*dC  ^~-ecOͼns|yOg+[ayFz{TOi8"Q^yv;**ZVX]HAe2Zee2h IM&!o !J݄FM)a5&V½*Ms< aBJXS@) MuhVu|}xNBk|Sݯ?y\e# ww,J*1 2F]ePiҲ\i+-JKҒ(-JRjPmʪP j\0|D4^q 0RaHG`}xZ(ʨ *)U6;@\8=D[ *V`Q2pk[Hкr ;ZqE[UP[<{H-$\Ϩc[.T8-F(& [56}@] ȄU6L̮d _eE'7H]m` SzQQWWE[l@|0 OjėfK nϝh5y*+jL&\Ӊ 0` -W ',ɂo&K,Kye, ~o' 0ijVԶPVG1I92-#*q.xvz"m_,zо}edG@&6a7.AQ6捦hiJq7 ETK~VXŠ**WrJVTVJ O Q ަ(ZsuumFtNE݊dz%MD҇52/,)&tt{tutotitcom3-fE7*_g1 sf71|;=a4 S`6\7A Dkx@|. E2 K,}V?&#q"}W>;vCsބ$u^!|OeX [X47"V*-CcʜGKõw?~;%hE Hh]kHOy~ C>|LVd, 8UMo0e}Y5aWuev<(DĕbX'gQ&mvH'KN7k==V~9)z]ݛWN %|4=~Pjq4ω7GHN4Xʔۥnih9AN?oAE(Bfes5N[ԧiiI~?E4f8?3Qip"`P #-. 좈z$܂v%\J֕ ^bcУXIq eoz6+~ k%=-E@uBGT,-t"WKH8I=!',(<kLu}%/X)?aW4sCzw×]a\o*c;CkčQ }y{Kbk =՘>p[ ,h?Fch/ȆŸ]w&=0X oGa2¿O%PR.NFd=5' d~ Kq _@>Vʗ/at d:/]$/%r#9dWM?ȇ.sewk4w FI~A:!h:KGç['aGxA#i2 __ C^؍6xV,k4dJJ'>%+AvJOI<UYz }N\N ػ E钢ɚ!AdAk6x{q8CKyu1xМGi.cOwuҞe%9_~q,~qX.?TO/G/C'rQ}u;ξa,m"V 6alxx.@2!mfrV=f_9ҨQr=E $:65v>@QS8%O>bX;x萞ϋE$8g SҌG׌WTޱ ڸI'OҚ1UK>ý Bs 6_C_Q|68J` =ޖ 3m9)`9?3詩GEϤh Yco$eU/仆ϓ_R{`佸wo{]9:JK7nJSD| 5:cx lgb4tGr3KɃ3 @I' >$ZV'oSdWr?xгdJo?B#6|OOEIIav1 #-\n\nY:p[:2dD's$@dC#䢘"ggvbܭGqCs}]{8aRN:51$IZ eFM4gҐ9bjhGD"D< j`Og+MEctFk"Fƺy ي;K"NT='{O)->jtjYia^%=%\룳2"^ z#rYټ9Mj1=W-a(гBlzȰUe@$ֳfj*fLEY Ub涫qv*1"sh(>QsNng\T2rwϲ TPJ"J]؃xՓzFQH]9:᜗8<ߛZ%ol,RML\Y =;KJ #Cʆ[bï7BoM=ˤX{'p8 R|ldަTh%˷hvI-2]jFiE>eG-pJ RJ.!<pg g۳-n<Hu .rmGz`oot[Z_NDZCoH]XZd&N}Emw۸ݪSKS)' P2Z!͐DJ^'oPkZŽjrH}O;z$oj]H DkJ2fo=.2xk #2`kJId(!4θ`vYV4$fG*8M4h>U3MCÀLRXW.c{L{̌Xә-W2MpTgZbpv>y܊wi+5W>a9t֍]1thb!t#ޡҏ'c.fß,ƏB;B>]lIsgoe] ^,)=#B!D >UHKRTz|kW0qF(ZqX"FAwܵJM%%Z)k* K oF"( ` v=Yd7udFRޤJ&-* =d̡pI_3 Rdfelv^ްdhYS4*bu|+4- ͑G1LecҢuhZ Zp;w|'eQ S%MUnS~}/;p< Ome 5mc|Iݠ yr*W:jZ*E.֊DE8UQms{dw{v3ݐA.)l~BL'l5Y2h7q Ĩu۫I]NѮ+0\^7n0 |9H׺I$9B5bXC#(ßGE FCREE`ldD+Ǐpy|˖-ﹴr~']~tv߯D%˼Ve'fcU>#Zq'ƥЇNykÂ?N!{b(ĎtWpό10ϗdw,SߊJȍiZeR2^/+*vݦ{}fe<&S٦n@ҩvieK!\NJZ;һ}q ! {*K^pB.ǍG`62vy;lg=I1)Q{S%TڢkNW>kjsDS%TZ|6FFP/4ZS '2zJZʊv1Vm.^\-7w sB-ܻ,sJ=^kv͊v|VjB]R:B( X:q594 C,UE! X1I<.r}32%B#!$|b%|܅I%6qx@[V|ӿ0F-A`c}}>:?&& %zͶ[>rcR5⷏ze©|5`ic͐Η Ca=}` 긔:]KQ$bZY)*Gkt4'H+-"%؎[p1ܴ僉PLdBKK 6KVCfʎJZi  @:l M V*@T[ik-'YL8f  x$A^,+}~f-ȑa1lZ)}>xY1[VOkgmoq#o?V\ / Gp#v :ސ>qz9e;׾^;)2 nD^n.NG]ns%-2_b/ ]^n 5*##h<6d["?|Z6e;M߫Տڏ臝*gݟտ1h_7,jZ4׽>6,jXxPt;g _;D*3󱑏c7[Yp:} ͚v'2(LW]nfU!]|RKIz Zڿm%g.(j+Hoڹͯry9B,IC,s>Q[{#[ܳrn,nk55~϶ӹ';R<6"6*MuLncX\ sTh>,׌yqSp$KE(I"݋H, 0,Ea+n^aF3J1+hʩG61ŢjK|q3B7(f<ٷ)!3yRͪ/@D_d|K t[rGnH,iod2N a@ݎxҏ^B[-~n:#մKuTN@]`ӻ[?'/i/:;FK٥c{7TBbd?Fv;dNۨQ]jG8ٕ f8J4]‚v6#N;Ev>~Ck߂8N&Mo) XACI̲Lḯ6- ~2ijOϸ9V,.ɰ63a"|KejAp՞C:eLEu(j3ETC.D<<=,O?/{TV4^pz<="_Sn-dÅpe`%3{zbj#gH#Cy4_ PSV xJkb^7מu+ÒzNsCz;}ZEB,] TEUװАĊЃm U_WT}LT<^Cft-mQ/O4YIC.e_՛vu4_[jy-~AO`[gd`ddnDLm]zѷFgߠ跊D)qlN0vC*qo4p`Nj&ɡ4ck qnDq%[q$uNOsxv]ѝHyZdZ6,^7T+cd.>cww\=fU Ww'=I_-wJV4ȏ |QbC RG̹%])4"phVQ+S9Vj(SŹ'_wHRrDL<+}'~+}>r>K:WjHTB fՄIfWN-K,,Us$(twR'i0\B¦J sHN 3|Է8ψ/g9>pk7۶gke!Rόl|dfv%!;,sXP1Y9,2Șc^<ڀش YiieJ$nVꬬI!3Gramr[ eܪgjkS1 !K&]? 3^-E 6}22YY8G-Әx+K7",JmNQ߶}:x^m*QkFXi/@xK*H*}Tޘ_TUa.b>++^)_W5N-]^/o^:!'EuI]ܗl<leTCᰡ=pgX-vBeW,N8TI/aNV*K:`U=&F(H_ ]j;UJU74*3^UGNi8995_QX[ lR ,.3J[KcsVe4{|Fhb_L»4nV+r8'uy[-I7=|BN )q?^X,V ϋg"n$Nv.zp)@nDx Z y=7gtpg `:@OnF|D"nOJdۦ,iM^8[ KLFX1#j]Ix)'rq[|nU6+਍jJD*k8As#۸G@䛅91}C?G#_i;;E,`FG壊ʤ%|1_>bi0XBO)S iؾh^'UޠnG#DG!r j >M?>?QNr_lPE$FMsy8QV$C`VcsrBilTk`Q:p|OX#~@6ڏ kTyTԱUgoCIL-?Usc)1y.du4@\wIp@k ƺoVbٮbd)::ﲁiu$]Qptdwt4s|75MxZ /_#cyӍx&t]_׷Qa[xjWx7MhuUW}%ϊ0:(Ȣ7"x"bFƹ$7I4H'"D1;h=}owνf{þGܭr/x7K[T.&` J= P\)CAz'.t`Phl$6w@"O0T-T\%<3͆:fiQ 56|c#퀍h [E6bB`lcWle/E.b` fhf $kNKxT2kpnӏcf5zd<'}.5eKr¨ ={a-vy~;WX} Ыf`W!n_)& ȕ6F"SsUg,#vphrh܉_5e+/ MYk تj L v"".jd h԰J#ǾvnVyh;iEwL[$E)lH-~-Xi`[r 'JGb\0~20;x6j@[l :{Yˇ|XˍrWRqJm?j]_ ^0L/܄ʩQ^*P`kW{|cWN.m*\|#Q|wogrW鷡pX^~)AGX Dg0劔xb;NDE#JJ jgJ[ZzHT&XUx¬@teHL[#ޥ,?lPF`kD3-ٚ et6.eu6ɔ+jfk`Zg q&EXWgߒZ.V!wA[mDaV"O2#eWp.+O0`Ho9qbcQpŇ 7ONQq}{﵋V/.( E_z{NS_ }F(=FsQ.J951Q;%CӓPDѕsRxv=(BG|Sp9Hσq|;!pǀsr]ù 77Easq1nZ baXCy 7{#~$PIdWd!«}};}4J^.N's T?uNt#C}P/lê-I5>cr뮭-Ub>&71պ.}8tcK}e1O,hW}҃9cG]ل_b lpL6j2T ouQY3Y:{ņ/HWfESktJ I.p[[rYEKl-i70cBqŅiؖh]m;LUZ9C|<p-az_ pOy(E( dQ&LbaxAD0tisD:JK -TaP&4RI<8hؕӲiIhe/֦O;߼&&Ο1qtj()//̛*b~#***~g7<\2;ǾL:џ{r'~Օ7U}^/RէO˶B^:a'7] J8Js 3/o8=sjɒ,yߎ7IeY&;[^o! [rX$5e+BB!4ri\JK{}ihb3YvBn_w_L$3g̿3sf++jfZ:`UӜP)&|ϫmVf_N 곿I-YkeJJ_a:ss[0Yj(´ibLUˎo훞:?yϬH㍣}aF{\NU l:Πc]W]l.[mLHM65ru4l ]ڵ"Ur7fcSJ ۷ )Z ڙA-4[2P8 N-$Uxÿ16*k`@*r?!2 !O13jd1${wۮ?V;v_οW=ҮVV$՜0殩5c<@Ęܗ {BK{߿|csSy lgnvǕ[h&g0 bT 3GM:EKNh m-Ңtv*.%iiDN8~+rB w'7)>ev[A~V9Y Ys3w^ÞrAu(|`n!TS2LKs?[VPvȰr%v%@cuTZbXd ^էhR4|Πե\[Eu@,M(0j}j&qB0O25'*uUYyC8= X(igRIe|ҠPdJ+iO) f.eRx2JhQh0E >.zw.yueaTϦ$n{"Ӎ1tՙ33f6wTPFr**|VgmeK鵎4˜fT2"?D9Z}U㸔nL*nTIQUǵ3aN8t>8"G3psLwl Xo82:8jTo/[>;͏cL+3*߿:[Վm֭KÝe7^|pygl*&Xwƪ'zǥ*vIȚbug#:Ms\%@-XIstdc>|C (5~p9$}qCPʤV8`K'=ӐiDT6Kg᪒ғIDk$ zZGdkzz*Δ^Z߼qq*FUg尒KRE6 . {Ah)ێdža~JltLZŪXH P$H3bZ_@YdyMNH}LrD&=ʬEDr0a9.xc>b#Lw \`=VS ؞deL*c ${>I> d T3l8v"Kjev)fm8s̀ kR=STM8m2#cHLLp 6 Gbq >tL+썕]<n7Ze/έj.ށ|C{7-|Hz5,e[ >Ӌߏ$HLU r =mgß矊xx)u2l?Tdb_8F'"tHA!3L" fy˂~Y+~VJJVg2L&ɘ^a3`i+ԜVL FNE٦E&9-dZ8xfDatnoٳ} /޵?}ETsrݨcou_,ƕ+Q [OTՍ};sftJD.s:`%+KNiH !d+gL P+a?$Q+9HOgbo] |6Btĝ}]Oы;"VIOpqbM!Xbx'8g)6|z/?@(&h)DLZ)h?RIO+E:XIj$ p%$P84I -v/Eq #D`,y"”,1xӆA:mjv>Ԡ7b35y0' ,`ʨ8"S޵DtT50o EY X'>3I6B?[20JY/K2L6IFUOJTHBh3S)+&*tٕzi)B.Š#hcJmJS #KA)6fdo*)eR#ZJ!)SFиt~|3 N1ȏpDz /N*BE ATDgQ%T쯏ayCTvcvQB89噂M=5ddxV$  3hb9Q)HS~%ViFZ$ %(CLxfTUh@ZT܆b}ҪK4*<*ꜜC5q[mO/XQt%(t<{8Y"+fqYtVUէR`=&J#$8EAgkE|bq+:n Jsqoo:B27HJi(7-3,{oJ*F=NKKJicII;JQ텨 &"[K bEi!gJ 괤 `2C- ^1 \{8l-Ko80 'oNKWhpuuM7+,1Td/{b3V,h1.K0J_RQ^,SxXbHtWtbMr幹 5hrt*jɡʉJ劆BRuve; ̎ 0,bOdfsxvwE+Uyb$4k]wp~STo{W_t:VO?U\ZT.irIQC]\ ʊ0[ɼ'IᡒAo"m E%1rgD\٘gS-)ϔ*Zhv)],`RrL. ~(I5K1$Ty,W21,A\ SLDX𴒏$2ѫiyȉ\3=ӯ#:V&aPL${2 K$^\mњ4V4\`bHBъoJ-IH$*%H2.b{/M_uȓ 1L]!,hX hJ#?$_),c]m~C2BmctM +~ba==K;晝@={p'T|D~ 9bS<qqYh>Gz- I?k! cP+J <&*kJ8 x~V78{![=k3^bOCrdzIR? 6D MQ ~.^KtS%1Lg~Ex WRgVyxqalEi]HGy$3ۺh!~aĆlHFĚJsB$!WЃs=|K0ώ\LU@%~G2̡MPCV!q,w[DCr&Ƶy3rGbf@}X&jW3,D y- }m"n!48ewy?n5ޟ&-5;ښH$B}24-^Bhm6X\|B2ї2$!V \]۹y*#\$)G1`P//}e3J c{ b[<Nj{8_?1GdnRE(kH^{Q;>:0òMEj6·"^_+H\`O0^=񞿪e\zG|\{(NPx<Ds\H4u"ʩ-o{=mD 6TmU8,\'0>µxCQ(] r-w J`? pBP'rDx?IOM0trm!_0[E|>76z}^.r^_d(>X]a?t=xhy£\h#.\ x֨pWVT,z ÞIp9< r\wh:C#'b<Ѱz<gwE&~ v8Z n3MQ`\ECP,[8Oˍpu}14 N,DXqKDGg<N E-Vׂ;&G&Sp(0z&b 8eBuhB "oXjm-!0o 8^` 垇gh{":a2q_`|.GSBu,h3Vp(Xm=5k(H4:NG>c 7U\(A)E#9~*h5l0k|[|0FY9Ǹ.,1X6= x›fcHnB`Aq.T`Θqszf)yq.NP7n{rz z F)pc!C'1Xhzpo ZV8lhZyQ F4Abr$4vL4 &l EEcP~b^=-  "#j7r= q((`_Z\OgSo͵p]ݝZݍykm\AnWGzsuVv4Z8wWZۻZPж[ utB,jKF{;9ܡT7nhkek[kz ہlF]\amZَ֎nBPƹAiq\kn_Cg^ +݀ke jhs[FWMVI57)\𿡷 Y Pm\ݭ=!Mݝ`i&2 K"Ü-O&&8﫸(PspdeX']Ci8YUiWXJEAj8F [\&`>|!S8Hb ')6Wc GDpcަ f|2n/O+<p SစkF-\'</ׄi>wï*m:wThWˮHFΝm4B$B*)Kf, eHeRĢi؃=56KBI}yWPKI$6DFxl'[ABcޞ7L] 3zl14AF4}YaAMII&=vM3r7ECA֖ ezY; zy\ԧ>Ixe/>czWs] .[^^k9쎚ʋ [8`)$=ll%|./ǏY{ܜcqQ^pʫ].Vs^zUiT`$i\IO#D=Z[nٙ'Hֺ/. Տ_ii*q_4>kw=T:߽5u=hY̕8x_;?Rmmg_ zN5{ p_ûkFƵطws.W=ѓ+?_צeW~ynwp{nmYupO n}/y߷<6| IRSzOݒ=Gv?_Q5q"Py[ AO#pDb&ia跺{O_Ojdf]Dr [U/~4<<'^9 lm`AP8`d Uqix1R#""(rKDf[ek6zRu _M-a M2y`-vsm/~2ŕ>ǐ_I}*u}SSe3 yKyx{;3Ϟvx]/}x[>{® m>[OVy~vvytgCʾ{Hə6Yf{GWV]?{vs?n|xʙ۩_cGvg>z[wXN/9VSFRvy`jmݟ-}`b 7xlMpsj~mZ &|^MwxW^l+6#o׽>ǿ<\v:wfY[kO|=vOno-xн?wdqnƷkY~?\̎? ! '0Ά'Njc$޺ԇ?s>L y宪AOrcJ{໕')x]˓!뛶 _a~-kw{dDZ?S}9˨63C4]gKH ! 8  H RH(!RJ*t(Wzw/3k'<{uuN7#z\IB|~q*1KoTJ4)][L@ 6$]I#)itR|OFQQ!<"e68;.aH!nqsdZH>b*+Vv RܪQr@5@'-\SPQ@OJb6p!1i1!1TNJBl@@uwI=>m:IIN?p_9 F-cD|a?B u@@1\Uv/C$'N ai늅}vc|AE+O[!J?W] *sȴg5s @YGc{ԂD䵢> p2b,|-VN>1{Y鈲Ty32LC5RqMV>%Z|e-Q![h؞2f,Cإ)~ޅ}5?:4ۋ+w&-ֳn/h2Sî Z.͵6[8XTiegz3M;! i]"XsΤfArѮϕ$V4Z'4s|`q&/TSHBA'e ^:kd?hOqȥݦ8/6>fUU @7k'&\"1|DpZ'3hJD̃*h:IQ#$@Gb!6~`Ntml|<}Hb(*. Hc4E濗As*Gԓ. mo+{9LESܣU Qh0*%Ͱxa΄4.7p2VP]EWwCcun9 ;wT_v[wW(o]zaET$0(]c l/.{9:z==ljjb:3%}xg#)P"s#3\:-~To2-g < kI+w7@/94q[[؈sG#ؘc8erIM_pwKo3# +OrS Om wy"OѢiS zTNG)3> !w;fRKJʇG0^HmVW02H_T)eFBUQH~+n6Luب2Lͮ32u/Ȃ%vī &OLǻ RVD.c& pqx~;)L?@}Օ;ZP>ٜmF>t r"wʛcSn2H ʛt:qOYlo%V 7f_:--@tDd36~{`V-$2}9Kd&3iAMmlɱ"W ֿR^/(IOsj ڎJ{ vD 0DiБޭ<{j~]KP炝3Y.)Gޔl5_"B﹣nY PmD 3lhJ;Pyƒ ɚN{FTV1MY\n[d=ϢM8ùc}8%rP=# lLW qm[Yb7~c/(a@Q@0!ĥMC z;x&JWvO0 F[oƞ(:{N<)K$,ÒO(WZ2*:@>i]tXy 97f{G [:u7MyyYt)ޫjZ6alRnk2huRvwlɅm' *&}G(Ens'XM?RjX..*'E b|+_yjɰ1H+j^+ W-WYU,֛1IbnvdXw$g:MJAӕ0z]|Rg%^]LY|a2ʧ cה7h1U^ "W mF†T72kNKg95\Thn=5Ҥپd:^Y-pkNY|9_LWTꈘ UD1aiѭ/A0AQRy PPY7u}+L|uy]w1trt*.d~|s;19 aKN@ !a!2<W:G_)xdDԸ:sO!=(1ܡOiiFiOs>D-&X Blz1Sg6_ <Nx:'$al <P>D+weʜA>Nn K`mafvZ{iށl̿*W 3>1 :rdQ&g*$6ÄZ{"=R!m:smxa}dbh I^Mߔ + gM10H=S \ -J_Vh=Q_p $kiI85O@ALÖ\FD5SveŗݹN.vggh^BVڅ^ZӐ&zBd!}U3)/åuޭ2lU('wZVE\"EMB/;ɏS7PlRX3ni7Y&2#}6d[dDZ4:vI@hs1*!rk^_`nNL_n@-rE\<77Sⓓx Jh׶$rF݌Uq':U,UsBC1?@^_ endstream endobj 1115 0 obj [ 0[ 750] 3[ 278] 11[ 333 333] 17[ 278] 29[ 333] 38[ 722 722 667 611] 49[ 722] 51[ 667 778 722 667] 57[ 667] 66[ 556] 68[ 556] 70[ 556 611 556 333 611 611 278] 78[ 556 278 889 611 611 611] 85[ 389 556 333 611] 91[ 556] ] endobj 1116 0 obj [ 278] endobj 1117 0 obj <> stream x}n0f|nNb {v>S:Ȝ̴Ci5*aL[Qç\z_ =Ӹsҥ&Pj$FR"OR % &80MI M2.%RR TZr:5a3?8W w(lOoca Q endstream endobj 1118 0 obj <> stream x}xT7f7d7=YݰlJYHI `B AD  Q,׊f {b^^!wηQѿ_7|gΜ9HH&.[://'qȶl!%߽R'qWD3 ^DT]T|GkWQ/̻DW@ yWJN_tlCKOm ~io6}o'򡞆4ḥ_rEVt< O5-F]KDv,Y!oDwQ7y$j:fQ}ۃ ҼxN7ڣZc?K] &pܕ;w2s#S˸Yz2WU !Zݔ/&3Y̅Hͬ?O4`4ͤkmԯ~q^/v˵\/NYawJɦi]E>9GO[ktgS8`F3*)Ztz[-l?U'Vm/>\w\mcbps\g~zMC -גfD4@üz;i\C;1 M/?1\܁lk\{}?i߽F|_6b6ޘ:z?Kсwɥ=o^=*|~V'ǔcjwk#ƜD9IƯ_ۧ?}r[rHnRoԤM1xACzkR+Qib?6P&POcŇm|I}50Idڷ{ۆ>k.3ZOK~D-jQZԢE-jQZϘ~ϙFϚQZԢE-jQZԢE-j&~ʹW.OJԢE-jQZԢE-jQ?nZ) 4IԢE-jQZԢE-jQZԢE-jQZԢE-j:{2=n׎*%dpRdrPwE} 4Ơn ML-'box37i-#dRLFj%Ka,HB-7KֳL·:_:kr)=*~{"Q:8Q' M$٢&fbhLj4q8[\,ģ&ͤLb8Q$&Qg e-W4eFO<5ȿoCrLc"ETQ7H~: wH@G +wM?Kupai|R]U(0{eKݼEMGqAC}͝s+M2I'W^VZ2vLx#+:dpA}z{{ғ]-.j1tMP2_y7[2Ə+˾8j8C^ y0ムD6H􎤑}x|3>o]Q W m7dCr7zC[*?mq%}=i 5!e5:eC.4ԝSe) Y\ޅtmgt8i~uWW32נQ^vJȕ+ ZQ:n>WZ!٤{. BfmyD<1~$=Äz }Cq99/wh> ֊J.{i;LV-kW5)AYӪj4GUV>1=:۷Fސ[=QrM}mfe(P kY{T&a CɾW>3*&fUFZ JeemեAWQ ;7 䖵U5<:o;'U*S9Cr9VUsz|Zpx;N<.(ؑJ&D"' deӒ_;'?d Ǟ>u~k-;[V_ڥ$5G:v~jr,"F |UʅOC%b7DӼz_s(0RޛkNT1xڑY2sq)D9Vs<߭QgW=AUdI˩n0^_ ~n%{rlw-ol5U7ǺhMkͨ6:?r{v"MfE*ƶĩqٕ[DSgV5Tjʭ^ &) ^Y`5[j5jM(v2|VTۡ5.٬5mʾV)k$HȨdk'98s 5!0TV{yZE=MܑJmPl?$ķԶ~r1-UUytJ$vlQn4j OAWe2MEM);md:OۍV "9fE޹-߱9] {|GXն#tX~>fuձ 毕op|Wob6%`apD _'[W%i^AK|Mۜ#TIDJ0B -6)K0g܊k1Wp03U|"67'?$, L:hZk1ّMQkk"R}Rb]L$j歮Vh***srX`oΩ*3mqTiSpRr,x15r G_Y6nk󵅌u[`Ų zyn'zm9k.a-m%[|Q&s166ls0ΪƫJƣqA KUHā~K@fQ~\^V#+z624MICZZ*͋+> f[c fQ9nr"hE*ޤ5~ eK/ |7ɤEG/f:^P u2<{Qw-2 j'oM@ORD%NPUXj%V)q+8VJ,W%ZXR%VYJ"%8R#XD hP^:%jDJ<%*1GÔDJ,%JTbӕPbSd%Qbx%)QDJ(1V1J(Vb%+1L"%*1DJ RPJ PJS}WDJ衄OJ(U£DYJtS­DJ+D)J$+D.%J$(C 6%┈UªE%JЕДJPDN%v+Kة%J|wJ|7JK*_)_(]ϕL((w%>VoJ|ćJ|JlS=%U%V-%T %^W5%^U%^V%%^T%W9%U%V)%T %W1%U%V!%T%W>%U%V.%TbJܡJlQb+ѮDH۔U[YJܤ_Q^딸VkZR+\˔TKX J\ąJ\JĹJEs8[8SJJ)q*qX:u#ԱGcP=B{:u#ԱGcP=B{:uKP?B:u#GP?B:u#GP?B:u#GP?B:u#GP=B{:u#iGӎPN;Bv:툒MRth'G{pfgN V.ϴ&m*V2Z*-g:qi)v jfZt,bjb:2ܭ tBFL nz.12gaf:i˥9L1fbd:iSi& LLӘ2Mat$aaD8{,>TT4pS14i$G`͇11 e4 b*,0dL]_>LLz1dԹL~كԝS0y)))39Μ JcJeg S2;\\dJ`g/.kK.}s3}!G\K0ϴcz0ӛ^gz-v(p,+L/%^`zCcz0=ӓ|QGfz#L3u2λbi+SGۙ0mfN-éڙBL1t Ln b,72u3]t-5LW3]t%rrӥ\w L.rs9_ẳb:i=y:ژNc:up|L'S@'2N Z)،!5L*nwpJXni91L-L˘r%hpJ-h1';#151tBnȴ{8i>S S5Lr07=SW* 9LLә*дppS'&IL8 \45p)ppr+hl84)T4:ťaWhKNaLEa8а4$ u î>9 7?k7WÔz3d=raL>ٝsp2/g0es,nLnLs.(=J ;20%3%1%r7p3)dHGƱ3daH3Gة3iL =j=^ўK-]o|T%Zd1_ze(˯Lh:|)lr.V&&ϘNdNNNZ5j`p8X,ZeRhX ,##@#h:<`.08 T, fӁ `0L& x`P@ 0b`40  À"`(0  ?P}|7 @<@6t@&i@*$I@"@8;`X X tS4@Du>v~ ||;17#C}`.6&:* 2"<, 4$8(0 p?pp/pp7pp'nM@hBm-F& u5Ue%"B|<\/9Yz t 8 88X1_` /ֿX_` /ֿX_`%=@`=@`=@`=@`=@`=@`=@`=@`ֿXk_` }/־Xk_`U7ZLZr9sOZӹtE$ t%]O=@Ok?}y;(:wtn}=a9$w~/vHqF[":wrYNN0Z|m|moo *h6Fsh.US i!FHjEtQ: u ـbQXB˨W3HIm[h9VбU:BJXCɜ@'J1{Ni-)t*6:s>Y~:pOEХy/4t挬;+ %kGi JXbxDԸ4c،1X;T,뛐$8?g G+e 9^Xc|ir AC fkzdY/8[+F[+UhLHvĘn}G3e-1j9tlIMeߴRRĬԔ,e[4,151TIwcO6!"#)!d7Mμ ?R+"<co Luǧw 7!ؘrt40CaO\rFΚuW"W4* Z|ӺWݴdv;39O6,r][ A7wǝWvVn9O+(뗞nd`QD`\݉q(P!4GA~1Zʼn Ţ| 6Pε#}o9ԲvJT$w*Q(痔)1dOFZNU]RSmqšH&Y{NJfΖXNgZb<gM, {aPؤ~X.Eg)/!!92'DaWrؓ#Þl {v\~LOK2IE%2Wdcf柌rAwkiƔ277ϗr sd4ŴƑni5ɓIɜrYCH@MF7:.-k`m/,9馞zyv=>znԍS{MXEi 3{=vs bH9iwCa*ihVxG]r\YzWdֻ"ҭCXoo@ mTmɩHLfV}Z՜n1 Ȧ[0G)T*e t߾s7g`jZ"_rT1(7/7W ٙ96򔾣gXl.4`L椥S|c 3yYuiŅXZ;փl`b" tho{y(d̂ÓGNYCYbv3bs)zPO:Z>-iy\G&i^mqL\Vx7'6SQae:a!-y?4m|4%c%b2^"ݙOL7%׬bɞKOYmbTP{bV-Eo^vk8U\ka6S5{n-KF-uSJO6 k`cg]oo:󝇤[-KeY$?$?$$Yml6c62$@ ilK[^zn06ߥiiCnhwMekȣJ4$ 9gfdƉ9gffBmE^p:$pcOc']CP?2`oxqA(.p@.GomU]tx}뵾foh0>$jm֖x7n}1mwO@o*L_j @T~Oq 5awB)2asDgF*7|sdd-h#Xo:Im|d tCƮFzK#>HO1`A9_lOsP[-̩N3BEӓ} XHis\8|/huk,jhgC@+Nk$$ .#*gW[y\tQW1߻|'!RHjW=|ؖk /b5s>5uٯAS&Zjtĥui1O~b&h.E8-bn bFPTe'ËkMkzT}6k5p+Ŋɟnx̍ɷ1,!pLKU#Z3&B6mnX#3{Ƞ)8bIm16^W`TIsG@|Q,{]|[HIoJL?2Ұ){^E+VcܽE'%Zi޾5d>R,OƢ}~/;Z'[@4`knrJj KnBrSA'jtݬac1[V0`6#Ob=ЮKG=un٥F\&[/6V|9&b_+1aʤ,[x8Eʟ>8!b?sH~iK"¯px ߄%kd),0I<#`s+*;utvBVOӵCJ@8 `^FFQD'!Ԙi&lvSv4 I tF<+Z;#,8p RZPD o-%dAi\fSCM ҃mٷ}IDDHeO<.\O?uYd.oaEdn l gyVVgHEnjkȪm^S ]5u*i7 $Xv;t:LvxVZ\ 8GMvr ׋@sU2e_֮Z#-7$b,9LGCuW)fUT[pIEA 3-B3Ȟ-UHh@{?ܿ)wញ{&ϗz.=&ʴgv~ud;ںhl;`;`C,=K058v2uB=*]J-kc."_=߄+Ժtw>b7\%Baye p=qfXTF:N[m(Īl!kmm{Xd_! _c{ N`dmFߒO56[/%W|ѮVAl|h]Tlk){}t ;bf-ܐ(e^+n̗7,fUo{\~O6q X +nBsƟ'vxGNHW=\g\ڨDS ETKAUl)!A&" g7-Pv\]b|hO.$x Soϭݰ6W {5V-ήؽvC6ueMeݢC Xp6`_\X y &tڠXy:#E^#1̘V<~pн\T)˗%ԉ˗ybIuM}pEՀ[Z G q2? ]НgYy:ջIWBx䐧 cؙkboT2-ֺLv¿kZ㳏Of{= / vV<@DsoEID*ڣQyNF.75^s0d&yll+#i6$yh&Bq|FzIf6ĵ\EuJ@auxB&HkE.(3k.[K=)ָ6"Kݭ$DKˉ *Y)'l*` Xzc2ܪ\gjjvU 8մh,X-e1s%h?eX p9mX\Jf+y8&ugtj㏱ ~H4t՝Áƒ{< ,eFܵam)*0i(dF/Xt1 >"0&+OZϲp`F°Cp,A* oJ)xF >6fbUiD4C#k7ai}buՙ h1W>`VOX z#wxCS+o>Z cyk~b -@R7Pe~ ߆jpos,(q3#U ;%F&.QaaLtR2B^$+PΨx4_a pHII$pSd ^iDUKDe.BH&"mubMh$*о*~wf=:uQ s]9pzCo-RkZ٧ǏL|!Xkg*l/v =NlO݈`sӁY*& KLJ;sp3E"ULsc3Čt f#=Ee FB-%5le {ҥj*1;s3E`EHI4Lu̿@T@P1Ã:@I6`:B6),/~"%Xuz=/ =0Qh@%Z̫oHWHժtl8l␾^k5n`_GA6wlyd2!21Xu %gs>*u9Y{Y#7ؐ5܉uӏ6yjH9a|糽i@|rwd3 G^BizPJMFkDOnAv& wB֩TXu T7(tqO5yE981| RβmBY8_Qb)ܳ"ގ܊DLFߊ R k p)D$G+gC*n褥54*IR,`! y h]< ~L@yh-q誠(X*~Fދi'w$SS5NtHɁ*s-l:'OM,&WLˤ!AT ՔQZ9dҳc:\U$ze E6דG(1HGJ)QXH F22?M*i8;86=\bdTƛ#/^Q ?ww\`'T5ԣ. S ~6N";',yu~AԎp x{f035Ӑ(Le\KOi0Q E0?^.Q@h>w9, d,Pb4 `&2a>YzLK E"V :PR>-ʃq́|B;4rzgWڟ^,捖d9k)oonJ |\Y<A+1 ZsF2RaXL  `K+? L(?k,;.@)y)$Ź8p fɹ2ΰ(j WQ, zXbvVch,3x>2K\ y*B%mGz<ըKON ,Le[9 f1q dacj5J#J3 /u)b]*q1\U$5B,Ԩ4 56=vHhG0bdd-7=W1NcVJD5%eǰ>uvZ`L`z2lt:C{L~-U|Ԓ=bUJywQW|($/ZBSeU7SF7-%ݒ/1hFS[U|ϦFtT/"@Yٙv Jzq_ h}FW8\gjא}}z{_]X7L><T*`<}kw`4J>BĆ)܀Z @N,/.ZsÂj[ynjBV*J) ֱiT}QF>JX$`vbEau5xQE)/:WKu/4_(-?a0 `#}1 /h^y_^?:'o'`/1׺p;62W@ ֈ:#wϣZZUs be0 'xS?P7|`eڪ1v537ڐv\O]XӗX9qZ.g'qv]c>by4Ilu#C 5msk2kָ\诙ܿ2,j]ْ!&pVcv$`O?:yUcM0 Emup]x;-jc+x\>0*Fy&\ - Mo1BN)l̰5-j'ykqzY'& &xz3]B.\ ߴxTzFP:9iZKlq6|wɩkڂ;$l';<Ӯ 4Xz' N˭Xh -802'K2$CL2ˀ0G* |J!x#ufHy3ݏdR[_6p3 rh!=H \*m}[*H|beAT]0 c$Xu;ADCW+I# c#̍ƝFl㤇qxae3tm`Y Pi@˪eܽ~Z&Nj|ųUSq+hZ*\k*>:1.lt?69ήȨnڪwt0!MS*tfíb)vIW_;ZO@7g ]h6%x:?;ǽ'J.uhXWې܍014$T`TKkztxd Lsӽ%~۷jm(h !X8j˥[2'd","$ a4\3yuARPDy YO0*cưm5VEBqv hKZ T~~1:kqpBup c #"ť: "A~@H Ϊ9N3|=2ʷoW!*kv{՜ika^t{?9:XѬ9os?Q:W7mꯗk\e}AM.O]Jզpp'?;ZYl=y6fxViR*jGlVv alفFWn%FF gRG`F"ju' S$*^:asf ۤA ocoHu@@3khk{3J9/yq$/ Y>R>l&T_귪B@ɝ8 ~sCw'j$MTVM$NsHc0FY9zpekbDRڠT|11l.2֑m6E"S߽sdQB97@=A0 a+Vp5ʸFE%cqW3r^<%k%Ƙy! }17n5bvٙ>VgӁ+pH%gtbDp6%/$#{8ߣ]]8xbo JX닶$qVDaH:' b%W*y!)o~Gvu(*pUU: .4Fvr[}K%;V?#6aQC|>\mXtv*E2pT%dS+OJmMylCmx NH# kSĴe5:yGhj V|/o; mǔrk\^A&'%l&J[aXSh%6ʷBNQfTҎrW R9j9_G\efM+ԫ֩ ŭԁ7j#/b/"Mm5PQv2o0Gu;{ ;=;S cg+ˬbl}h"߫gxMZ?{_q&X~xVԭudݜƀ1`. !!؉qp؞9ƙu`H lʼn3q6vM6N2NcC3U^;ď^WիW_UU_8i o0]oM/5Q JCɛ3]+}\q>j#pʂwT/ĪjS%spZY ΣЂ__^a[fܭ Gd=)GdR.-8۹w;;;֯ߡK~Z;r^}C}hגl![tF]EKQωy3✩8)OhZ`wZ BBB^R+}@ytpu*&mx/٤ITMSo}J|^a :C=_^ve >fea4+ #{a#֫Hr^E3b@4E*>/45y_s`*ud#(ʔ|Ղ3)kZvN.ʬ3:75WN<2-6.~/[BmdW^sΕW]}ۡd4-/ S>xNHū PmAu-D3 ʼnZ?Q#jDua:hm#Z=F> XP o^,` A Fy-Zv@8:%,v 7ZL1" Z0Yȫ`m)]vuz@K_5/,:+hOg,FP8#̤6#l`}^rrΆ*,MwJg8;i6EjxuǑ?Gj#uߡ!$geHA*jAqv[it^"lJ+֣ M; ZDO>DSɺ /2pK4**I_g>pd`NUF Ma'h׾G o S5ot$WSLo225\|`&= ޤ)V*NKYdi7 ɯy xr'|5ΣOh& :w6-b<!_h~.MRh!2iDSlT.k?26@#56 y3ZgԷm^sܽ"VkLb]5OZ^ Yc]AgKgAMk>k8\*@Z=ƚ@-h04sjN|8/Ww'2Sdi6SLaXL`2mn&*e"/ҒӧtArattM' vڵ:Nd>h%u7^7x`C\"1v+딡3Aw!8p,jCDG˦(Vx`Qbȣ #gFXZqIUmw8:xC9,XZt{ jy JYQܻtbEQ7yQCm7mDKuA hmk@ w"ǭGUmהjEF#m5C*O +dvh5M 9| J FEz#5Pzҵ5qgr .HKL,qFMSeW`MO?ڈ/zaGa{8šv)(:k64a:&*J%˖eeEWo:RqiI|u|w MM]]m|jTM5 {諺I=Qo Zek9=K#=ĞA[$AC ,M`^#3zXkrMwմVfN($GO'I[Qu\ںM5Yf)6jC^cNVOKl-eGQCzwrK.X4E풚W4:ԜZg'&amC:syy9 "HQ(2]L* !@bԙ9JbU>vE[YHKaC\E5P7V}P}+~z\8q~utN1qud2 ?y/2rHXVws1Υ),#tTUF*aVQ룹IjDQ .UbYGA߹bj}e]]}# <tXWr_hmv9uYWԩ7& J֠jJCD%Yui/K8m6k.8YFdYtɬ)xH}ɇm/ሤS#A!;KSN3QRUσ1B9NIzO{UlNsKG4 &[כh(-ǟHMȊ&NI]JwX88Nم1\V,"5=_8^F|a*E?0a`td'IU$ {fcY0w5QenKt)gd9cesgg -i\fV焗]ªTQg)p-9JgF>4MDU~Kb׳$PN ޠ/WZmzWCA^% fyŇ>k `B) sq 3GOY9C<R_ {L,_sHhRg hu4ªta徒l)\ͦ\SRB9$IMt+]VO` K|[TS8$OVE-u0U1/|Fk{vzk@ "%+XBv,~xNOqTۥp\emKV'swq MA殙iioˤ=˵Gs-L9Z> HBs_י pP!XoݧPբU[e)L/ l.J$Ԗ=I'y;G)iRjZՊwsQ$GL_&c [d[Xi^nYlI9NdC؁«*{9`[K TgqjmgukшQA^  Ka;bh?$&ڍ%yt$n;8)'*傈fS 8nmj7oҨ8aCss&b}޴l|'hb uzD(,oՠ/j0C58O|1T{1_6\X) rRu2,ϟ!7`ED&.O aeVMtD* ,Gu5$`b' yH \R'.س*ZgMwgMNVM*>Aʔ[(@!5I _EY] mM 䗺8ܛ8ωׯ:лFIK5hqys+2'6@2Q׾yv+1>fY7!~H!QBO#L*q4_v%YܟZěM0::Ya\6KT7^{ed$ޫ ĖB|h NMsz`>a_JR' AR`x՟` S/%i/ :dx**Ca 4?l4A/;nO!h)g1vi^x4#`` r xx[#y#nh\M/KO֝< $ĪcĚpz CA~O]HCRz?obm`= >BםB/q3ҜpVB 6Q26of(3#,YK]؉o\0fXӇ 2ә;Cyr3D.ϵVrg)v=@hmQ̡*PnXBc "? oXщJBh~VkI9ffKT*l1pr:^Msa]1ILց$P`b 󺄣{b?)AFN%z$n~վqUp>},lp֩jRxhWOv=_dM!}iψ>7N!3S5YXd:2^5Y`z6 HԨU]!ƣ ѨTƠ%)aӖ-isڵvڻٻ'NYMMzjEjer5A{dyxB4ivh#,HtG4NҊ s '{ҊnaHu [t,1ӽ&c5,gVvE9JjiɦUs, u#:kpZ-MJC@[LrȊ,ܚn8aև!M&,m܎?lG7ht]F?Ë-9LqL"S2 f3GXqXWcbE V \ d8ԜYYt5/϶nKh ;gNl]5ڹqk;ϑ DFS cͺo.n (:Pq݁:o_RkT&uuMDCԹ&HL yŠ.YnaLNYW:,y/~iHG'Ǯ܉BiC` xjޞ3ea}tHm&]{=P=U[j&ۍyu|ƼIh#0d5uOCD%d#9@la`Q YC 7xF&0 ?Ȝ!5~mpyOuk~#H% y_˳۴b=e0J<hm#GH^]|ubpCk`5%&)nB&XFEkY=hODYG,zEE(\梨5_,Вd| A((r2W#uEoiMvAc%Igtv;Έ'OBNu"@RkɻmILlc[k{ M`1pd1(k~BF"xw?R"i<;m]$B5[[˖X:#'t&3<'p'įV|?x1+8F؎EnyDu;dqȳ3:`ĵ 0=Vq\z?\i[$]G4*ZP>ܸ ruSopu.;Zb4pxN &C2 f֙w-Zܰ̃w;y`ܰZa|h1wV!@>g2͟!4;1uM=f3\f\ #O$u`^8GNfzR\]`GPXYh["cIƭ5[}C!僚d֜-2u;:yKAZNr ޻d{w6:nl0Xe]Ev>Ux jG6jT5qNT# ⨖=x>Q 4f3kR~moj*LhVl6y=Τ2*6ῧ2T\(tHe):|>\𑄾2ԏx:VntBtM&OTTA/g&q-E#33-g#4S/bj%r?u%=!ЍWk3]'V(AL#hkfEJ1p+ФMEeȗHK`şP$/O0D5ʑ I):@EIְU^)=xr0at0qI~Vptew+Q!Ng Ӭl.|Vvß;S#mL}ٺnFN$Ըu["~ػ+F'VkNkN`#"n)O<by]fs:-Lwq3ʛ|`@I| #orU$fzx TdA"SgoP2ZIˑ?eT4%)D4t/ъ:H Ac7"#γ>Tށ7 g 秕TqlaY<[|_ ǣ3F/ 23{||7p7 nmh$r})I ^ᘯZw?3?ɢQ?JM/y"ԁpWFv$=OYjSZL߆3Fr_B#вϣ)p*g0xX,9rmG_qն#}# #G oö9H2@LgȗNTsK(;+&*" Q+(GEhқ?S' ;RA΢sȂ]^sfmϽĭN 9-^OUmܠn}VehxX./6j')iek'82&{H(gc3!koxP,wtz2ZdyU oZh{2jmOYEkdƟ_ۍ>@Ғϑ_iɯ[i|6Sծ8=i >g淐 S,b|J~$,P~b~kqm,Y}dRyj$S!^#_,QB ORh_>~9`,'2/:p f?W:YgL n*IW2{)]+ Ą O\ vsrfIA;\=J7,t |'3sC!5B\j[ gC_/N %hX~Yx35DT2ש Hgw2dgиƗƚ0GZj9#ȥrZkTk=#)hs] 9 1qpp_C#4k:|A9`^L@gs .+4000 *ٰƅ.0000'A1qaaa݃>5|0000000>`z>@A$BứGz@ %MWaDV^ŭAꃊ[C~TVZPYu O=(X#zDq@e{Tq@%ZqS@~8 yV@ݦb}Dqs@PbY9>͊[ ,{NE?9 As9#3e:nβ[즫tlULg-Yvt2eLg-Yv[H$HZ -`7&ak7M0d;t8|  M`0VSk3 `0aJ|`XmߖqN tՖ} Sq}0M0pwnD<+av\etпA0fQNgRRe|D}8dSoaA? Qg;nӵ ?c 0ODS0* \!.ګXl_N@*,¥َK\Mo'BP.&O0E&A$ X]8ƴ@JɩN2ym\&p=Z!` Nt؎$bsLu¯ƔR.;a:L1Q*9)U8"me k'ܠp.j' ?}K|-LEQ\0m7KvN.m688{VZM*/n %u8w\mJ ;> K!r-m܊9rc*-~rc؈s1o5=3=d VV^0f g' ǽLΉ+aB64qA|33aPQJo.|>o} XWL6XREa@P܉,eEĕ@ VťVpZWVߪ}ipߕTVs$>_g{90e`އ-TLli2:ouAn(] uZ64jW֐Aqc&~tI*ئSaZ'LMv|Mpb2϶G{D3[Z)S6`wƸz[҄х[0J]ݝ^5#Ԕ=YbъN'c*Sma \:F*6y9CTwIީLvFUKI {Fqk .t|GG^P"G̚F){E݀ҝ>PxyPu<?;I1ugʿrsuaD$j]:S1W0E&?㘉+~29RdD}o\_YHuGvSj”rӽc*|7DZi׾Ȇ}F '|h~DS͵Qu3۾TjW=X}w"] z 3_)8ޒ,:,:cQ:UZ/-k Cw8KR0a,}U-;CM+G_0ZI 0zp@(!`?4[/d3m0kxkl!5v;%‚[Cz*F?\1ã(+je֣J5@ zst22,0o-aףM]%&Wdr)C7on@KdtfBP(&ImhQK 9r I*^e@: 'hP &SR2=`ը* .XPU*RithcL5EC봉"QAfi Ras7,Ȕ u8r' &P.m•JAC):#CS#p6kz\%Cȡd 2R2.cmHS> #Rjt΢ips5Bo^NQA2/ө@N"+S MI8au|J^=4E h땨Dk*%T&A$4&KcIԿAN `B5cV N^L5 W1aʔLI+dBQ7@0Eu -( DPH*<"l?rDٕFEGQ@! )Ih,5XJ "(iHx4椡~Ё}] L($JDP2@,uQg 0Pᒈ(_t$  6TRBB0Td$8D/,<6B:0( L2 8JK!$D20 .̄.&(O< 󋒆"5B"` ZFDmFRi$2H`DGa ` SS <$hP?@ "fKb7i_+ 2sq^\|zqӋŅ}zy {^`|zƧ _bEƧ^d"Ch8ć~#|p8[[#zV7m`o sKok @EjہV`rgb8E ٔ&mX p"N,"GH L#*r2q'd$5YFڑd' ҋMJ1=bO$rTR.$O|v-#!W*k$7|;83 pT9ppn{aypV·, ـ l 8;s ppfs)\ 8K׏ q8?g9p SpAypɀ-lJ"΀;S85s 8Kj5yp>kc r88d9ps8Ӏp֐d Rr #pN3Y8Y8/jp4i5gkpN8ιk p8K|Cbpހs088" p~8À8 Yl]˲HXP_X q fYtg 4ys,)y pJ'Y(9K#}g8$%\ 81y p>X\D59{*pJ`9p&q.l>krȫI| Kի,5%V5yyy5yy<.ɳgey8$5¡|DD^Wk4f9Cx8d3V-|st$Oá|80[$$gj6T3Ok,m8@㝈zqO@yy| [ae)j6jڿqʌeƕp.(w l//s֣-p8C33$)s3E[K G:8xMz[xlv77o\6!R8\K!p"Db*6jsёS+q)žž9 NˊO>M#ZpzmފKZ!G tWVBKJ0K0 fx?#'8I!:o$#d4ØQ$.5Z H+v(=ĂL{Bs]h'2_F5C14V"_Ft6#yTxxd un6rX7H #GY$ɂk.`mm֚M )<. 08pccsj8VA !xSj|R(|B).+(*Gͣ3NL]hE l59")BNxa׋jp}`m ˤl;_D" oyA@݂__{_DDf|&lRd~v HBΆw"^OzOBe><йO\\\mpL*;4Q^n"9QiIAw'uON#Xs@b#jY".d}=llB ;+{mScg_/OHc'!`Y6\6R#䡀T$()apdؠXKO+Ӂֹ`aQt~bJp'C5U#R8Jy7^^HQ'AZŻR]ڕԥRudWW*XfP{ ,ٜvt }eMZT<-q4aZq Zv2EChWm@0a ~W$C'ւyrSˆIMkqq^L 'b_Q]Og+bH˶@,Բ$CuhI.J0-+:Ön|[aLR'4j P*R5jGm[|miGζ_R*FdZ*OBڣ;ݓǛC!A&h]d˖y8QJ>1@D ѵݫkwOd>wHg, Lr v6<%üMZ? ;M:4`,_?XE㺱zs{;$Uxfۣ j ) o^uKABsgrv{MLvx=hBǛoj&뭭nO`bpL˕-l<R󽲫֯Tۺ :?߽wc*=gGg:ESNo{1ni(zu#w[:COv쓞л[ѐEӆEY;L⮭^:]{6v)eǹGZ7[bC&`.&uhii~;{G8{_^M[p98qN^?Gj}ߌrM(D ҢE~u)>MVYw'EunD^Ntzym'D4+_~ PEx;pPX򑍢GɐT'W_5D~Qi2ް|yf Kwˇ/UǏ<͒+JC-^Xv_j-%WoٺgmلskSF%'H qwfit|]ՉlAw-k{ֱK{y+l=_;w;qgZUy T7%ғG>\6W\m{ҽ>֎{[U͸pԸ)*Ǐl UE_;!+{\*,&*6.tG&-J*R?' E Y* SꇴgZgFy_j_n5w1ێqouy_*[sՑ1zzlrDŽ#><óp@"t.꣍~)@@K~K/~aS3w/8ȟN=nq /O_|ƻٯ7/l>˙7޿7N%otW*(xX?&}]ug//m8[9?xv.#r3ԢkZĴNHXx퉆\.hó܇VʺzͧO]> 2OOoyV=H]w8K+FU+ݣ+K̢FpbQsZے{&3;EbW9qq+CGVrUyt 4q)V/ۓh}2$k%/XQ“KkZq]f;Gyvm]̶Y]]fͼl+!vHzZﷻ+i1AS/y~BǦoQiS_rp=.Z:/y׊|~4>4kGTsI-U;W:;V=֋J~=.Zi/R烈{_]e/=4lCt{?A3rO~zy/~nwyI4vo,Zt14. yvdjC'Jv'ϝ2C݃5oV\iu[š~ۓlڳlj' ]=aؑƟnm +~5=4qwf4eog.}jn N}4VU{zܬ6gw\px3X2YgFkݵ'ҵ;;#/y{g{Zqk15'WX'+ XAx4e`r*3WEK6D &u a؅fFBW JJfHTLTӻv)%.<){o'Y[׉] i ~dgRoXǠ}DU}O^/ͩ32zվ{&L<k>;C9ryӿ4_Ͽm~G \ ec೿enB|+u⥷?ԷMcv~oh򎛫wY> kg!U+7f5~ӂN7ѭi.w:z1cc?۫Kٛl5{2eeQ?_<^} LǗ)]R5P3>Sv;w׭wl=,>#{Vq5-Jki=E#fuW4pۄZDZTjETUwɁ#/.n-ٮζ@gsͭIi ؍RILBv"I{dFw<%BrnCkۦmB~|ð+|xwx>8\\EQ%U=ϑ=ɷT̘ }ʖo_O}ڲmB-?y`˅EZq'3'u!F|cbZmi3_޼je}ndi?٦77 q r^;/>~7oMmsYzV{w݆%۶rzeym;T+FuM_8y#;w15'#Z0cOi[C1v.?uv鰸'&lv}#.cntu~;bgל0MCӷldeTbgYt.Iuuw_1~"nsш[^ٚp0kߕvZkɉ;_gs!]\~}Z2uo+ήs7,|͠ڎ[_X_}~ ,JY||ެz/64gqmD$ī!iWԔ-xt]{< ՜zڃLsCA + )+~y Y ZP26m.C-܀ks@g@)NV!ΚWg$765o"[vwY \ReLVdH}h6LF%pb0қ>&c7Cbr,lv!2Ѣf X4tL9͵_mTw?'<{.^S8JS0yf`xEI[ g̈[HʭӲ;}[9!}AfLpzn;ô/tdve^'-,ܿs0QR_ִsvɽO6M,q)\Ҥ?cݍ]{iOapͷ|Eސa>[M-y\{յZ-6?IYP}Kvv6$AT=S5-&۷rUryk<}ֲxck O>%a~t)^Icd5+[s~&9UߊG.H/p`pIӁek7Qώw4̎RQodDtr儝knS88V\zgLjT:xG^).|=Yp9 ~Jg3~'u׾i{'?=\ѫ{=̚|tۖnd5uo(i_QUT>9ib|[d5VĬ_|SϺׯf۴_O:XտO[wC d~2vYvHnޘcۅ\V=3 VF> stream x}RMo0 +r$PJaF=lnDD٘oh@,Ҕ)\Ҽ 0i\zKǹ!>L`i*L)^NVwuWi:tS^\P;SL>a9%wS "{%GXE0o]OW{Mp^Bl mW W4IreXL y݈Vh8$:M^gkMК{MkFxY endstream endobj 1122 0 obj <> stream x} xT{}&&ٻl@$@ dD!f1#|REp}RAAZ(XmUĪj33ww}o3̙3gΜ!0`ˬg\@:}e[ם;^9_N}t.>@Zk)x*Qެ-]qk} -pӶΎm|qr'$<`>s+r\?XަΩOkʶ+R}/ueǺ6ClRk]նہnWӵ{]8b=SZuo`>W@ۯ[PW.7]Kgc֨s@j |닫 ^=6^@Lq)2ldqX#$YfIc0.|XRžgCIa øhnq>SH*ѩCW`| Їj~kQa̗#uP~ՉA>KzvJSa%ǶcB7l8b#܃ Eۍ Fí)u 7}^SzkkqaH+7`S y9bU6ـ˰]G>u& :[pݟoB8!qCt&A8!$8!qC8!qC8!qC8!qo qC _rEh?H(:i* k&&KMp 3i=؄+`C:NšHp.a5 w?w?F~Ko˟NQ{,[  ^ۅN%dc_fm!qCc#,0?Tl0F#_ P3 %諒W5ߧVWB|;{iJsy5̟ of ij*"$#atg @x((8irL-.)k+*5ϟqAgϙ0&Sm_,)QIY-fQ6H(1ծVUsjucyՆmgj*՜+z%7"$Z cǨ.U;\Rd&orT"tb:JHZ\nz̦JWei15#zH434lE WUh,mV?tƎHek -@>&Uj}u ܬ9%Vekq[s||D[^u-ͭi зk8kR3᳊̯UKZU ,oťh0JgoFw | 2@C˩]̞se_WM?f%1b[BXf:tN\!k:I 4'S >|[iqEiրRy{MU\jீ:%m)W+pɐa}<-/u'sY\]h6_q> |s 0g7E*,7h+9Ik.~=$k{蓠 ,H?uΞߤVZm8'2TaMN3yHg,IwA^FSZϏ>o6 OV:9,V97_rN, nZ0?0SpFCCS`\p5/ EsQއs t@K ڂa" =n9N0fVsmIǎq@`q\k!:STyOEԁs)9 =.ivl;i@iSCS/%דuM*z)奼gTZ饲.oZA/Az+#2%2[ȋƤ,#e5 x^44yMEbow-h^ԋ%{Q@4RF=8H=%^Ӝ%y 5bguE&> oؿDiQ_i@\@^ib7Uqi ]W8FוN,ti*Fk陾@@DžViolĞ|QL֞>q&k_e24ڷb8 hF. xJG 4?:,>pT2}z]&D?N%9 zLNNG.⛆;?"g Db[f ϖuxpոGuP;ۤ=p5(ݻ5=ty\mf_:"WTW^rPDF[ē7z:5Ej㚪5mv̡f;s ?nmŐ{DDeWD 5NJ>y2g~.Bq㉹3м^*;o!zlDM4_@%ώZR휋hر= l |r0˃RyR#Fc"e{=Y6e8AKJ.H(T zbq~_il,W0я q?)UW#nGGy uG,C\q?ID}S_eS{LkȽF_C^-Z03(ȍ2(R/~>=ʍ+8Ӡ͝[oǎ%//X؊؅(!2r/q D  SQO#>2G"#^&H+)9_YN鯑f#}>ٛr3Q*H^Ir~|2Y 7#Jt?ѻؑ<OˀNd.wxݕ*O!vuz[,Oܷ݁O7܂OWG'!=!rHoy[ts]{-瑩&H@2!>7%8oyqA;^QuKx)&ǯ2s .:9Ӻz븖=k2;.+:" 1MpqwUe.rx=҈$fc>"Saέ ځv]j纂Ą/~ Omyj5CM=RnW vV;6AZeeieIT}MM=g >BZ;wgUվÿ SUϜ4q^ΦU|AҨˁJr:d<rvDn[D.ۣ\'(g4B.k4rr=9U=99L ݺLwzӹ(ˤi]?Ѧ"( E2I.xF$?*rӐMHɌXdPBGCJ|kVWubveiFo[wrwRJkwU=%_S̫K\U=\-Tڪ|}'3MCcMygXӋWOcXӽ@w*|G&tVW(]t.q]kߋW`4B"cyn-^eUFҮ-q*]YwiV*FurGRO?ּmUjZ Xʧ`@pBƆyY)/3Fi%~xfucZvmňRh/^Y vUHc(ź(&1 7gbnuszml2ˇr;G:XH X7`afS U9b< t !Hܐ~}NCzN1j%Q)l  ~WÝOXrG;Iz^<+({\ {!?`{[m+j\p= ?-|G~xدƒ` hp#w?p7%wwGa-lc- / 8rA:8LP4r5^~OT&@'ldNbs.|Rp+׻k" >0f|9rׇb"Zi4LŚsx '. ZW* 0}[K>s{R W r;6$$"t4]MakA'@gC-:ኸCLUMM^&oJ~~,`hY/p+<$2&Nr5Hn'wy>- zu5gB>snzFfPSoB 7lwW9 o 8<-|%Ncҏ,Ijj#ۂn!hq])>"OI÷W?|#MPMH53JQ6|zoE/ .iBB!W%o ?%Jf:hAO__03t::v%4,{N &!܂G.,.gw$RQ J+4CaŰٰ܊yvcgLcY5 B!ߊC^YEO;&z 9R -!3F[?IӴՑZ2 ޤHJCpB؇s{{BkIDlak(1I%'Cg4 S\i5Ka |B< %wp&Y,,۠\ +F<).t*mlC8n -lt oGOYpJC:q\7šzRl^ KFatNaTiƘw^Ks.Db>waЃs/5 ,mLh?wª0Nx6N!-·Wqo_(#bMx, W\Ek4#>?4q\( -z(w"Y~#@ah& װ.Q~( & Y0fk﷠ cehh\&ap9܂{~+ƛoƝӯ}%<Ch Azwq&p@,)ۇNfĐ3<ҙ'uP&;%Rف"| p m0Uio)AkK%X( ?>x-dn 0c8E()(J)U !ϘL{‹:jRZPcǕN|/}"^R|q ^ ; ,pA a,0I#d3_}aG/`9ßȝ(ßyGGO4K&\| EQ`KM FM&L4APJך8[ }kq {|XelhLs*ÃtE5nDr?DwF܆&AVسAZ0;ensҙL$l~l9A*á7x2bnnG mBLLa)YxʬƘGa[5丂 xnDpF ÆK'9\Q57.FmI.+1%v1ZGP ҅[E(B~݉ a .K/xqU30&9hܽʼnn92({M|Jani.qcG{2nܺFg d0RT`D|(ʿxWh [vB-3Uߑݢ ǔ.qbÇzG>< H3lS!xVx/FYX(cG|Ni$Ѷ %VHbx5GI2`2f):ecԈ"%5[nS e>m*qb-<4_,;&Et@9eчzӬ)QV&(M  2^$L8b@5Xce%2 ʘ-rĤ A|ॄҽČٛdQ}D5[Z `8bjN˯D\$?i&ʉ~'ʎub8Fyb4Fԩ'=F1B1Fjf|IΞ=_~~Sd^|cg ]ϾARMZV2SB(SXV{[] s2H Poh ~WɟY( UdތaI=2Y$_7ty%f4}BΩP`mҺ,?ܐy8D[RVbV˓F%e%7wd}+mn۶̝~3axoP+:~* 8=l g Fŝp ÑJ~jzsbEkjLu2]g,g7GcOK UFRN$Fᖖ5'k^߯"؃` Cwcỹ.LDd$FIr T!I)s"wʃ cJΏn^?z 'Y;d^ϱg}c=acIuĴ$A*̬ltD%;r%'#_Oc-1FF?iiz ߿5f8Ya,ŽFE%-yZgx?|ѯo`~ޟwM ]IFfŌ3vPr&b &73/>'p)-TtSGn!4'Ï~B?\̌L&YJns+7͚儔aN>L5`n$ftቘdNa_uc8cޜ$'VHƤalzزa ̃QÕOdRn9+%0bIDv!]9߅o'.=79e#_{j- <{,ˤi]7ڴg">r?F?̤&eEOHH w*ZVbc~`cȞiB'G7Y.%,zk*<-kbL4MԖ|=< Wk]Aa|fbq}-5S`z޽zj3twN Hj($;@V8A{[O~ŷ_[L;Ay_z9%O"A*r5`Px fT @rO "O=^oH{{w~ƹfx7^^0 3.DaT,^x%C-H1AFA[ xi p I9HihUQ PDS@7|}d0,ڲYoa D mownCSڊ7ʅ8GIG)M&T9|zFY/s"py2LExu_>n+k cÐ$tzaq$[sQ߀98ɚ]$b}CЇ8)]]P r ʈ6,)U>%h3hdh8AnZK#TsTE#B+0{O:sj"ӨU1 c29 x5:$b~VS(Ӵd֧vl3 blvNGMR /yٰe\Fx03Cϼt c XUJA9d _l ֧IĥqѕhSeC%KCdmrh6?DR&aZNv` 7 F(p@v~]'!4̝ X:%{O\\q;oq+iF}<3Ut7pBP$n( J7O7FIJ:+pϔeBy韕.^XԽ|_x[2ʢ| 'Lԓ{6Ȩ&B!z(e!f>wn]\hNʕYsrW37R70̽ďG'׉#a+`D#sC{rl1)&YRj'}Vx^b^U15;=f1syxi]rX梢к}/Vjd04IE@}Ί0[Mc L&T)$|lhb>*iPݠAD "E6XQ2n\H6V{0`T]Q\::U6 뀺NqRO[1Nf[J.5CDfse3P\.D2*iST u;I۪-0A2Zh-\K{í\בh~eg>ߗ޶Lxفl]Tw\0у{Mo.OAa'~X~ w.gYQLJ`$QCތXm 0F%.疧h^^2[9 - ԥ5Ե4IRVMHLI ,]{PE4O:OŸrvv'<T/2dˎR[kg'4KkgeKE Mڪ5u2fS 'DhHuΈb|!f#EC'و<$YY&T_&9O&#ITr,*4slFE:QsHd35p$Cb6ҡaq,B tN5AX64$ϙN ;t).}8+ Kw Bj@U!6Z0 r з jq12.Xr9+ͭx WBIA%Ge Ź0)u8`H<2I1Puc:tvlK-#\:Sˍl5*[umb}F-`~|gX|w>XU|lC9koXwߗ#vgs WԚ^to.[-ʝw2ZKv^ukq0EO`bLnXS KN8f$!ٕvJy{4 )@Ay7pY<<寞?Y#r?)E;T:ZX ť~T`:%|ըΏjr}G9O>yON'zvLX(Pp7=UAɘb<̓Je+d·dG HOb^A֭Ac#lpN# 1d{E{p(vD=aRt;w;IꕎKbZ.4)rc@15v,.o <1v $S}_āE$t6q=L$L$ڢ 9`61qaz Ď-y*.zYпǢǬxpja' =o'oB+=zKDýG͘;\tha~S(-q}44U3l|Yf7׮Xn$ >QI7ӄa T["ej_ejԁ~p>90 |?W!|>/O#l`1 ZQ$<}q51f[*[u, /]٢X4neZxirbbi~22iiZZưʄgI%30&v}If @ 𲢪R(hiY0kV%CGk{^:݈p\2laːx>6h蒪5=iKfT]^CY<&0tb`Ol/`4G=NZEŬXϚ:a#X#Pvy SzEۿ.{aB>0 z\GF?5%vI6cï ՀjT{۲d@[ a@4+AGW\[@-@=|F jC|վKu3T~{f~+wvQ:5.mL/:îE5+H1Hh>S䮢^Qƨl|:ާ@W[C(d ڨh~o_˩)53~sd"X_KDsZ6@$3Rc.L/?J'oDU|cT56ȍyT->qRcI.5.7v C^Obz(>^W?zDIR'4$̔ojl-ЅIMEnnrnq~^zAB"*֚3ꐵ!ѬUV6+ Y٦C})*/~†Hbg)JVU2jba]]TeﲜD Mp,P" *BLF$(b6zOϸH "\ZN#BFXΠ$$O J3^!JM\:7,-\Oϋws綜mV-[ `A79Bkff}*^^l=)v,K!/ _` - &`f^%tg, faq;|@ ̡;$נGyiW#P~1'PA!eڈe%Ii衆bRNF`-Lz0{PcQ S@Ĕ` lCLJ$&V"p(b(6PD-QFR=d]sȥo_Z&lUot7kN_﹪[gM|ⶩL )r,rN% ]smg')w̟vu%:8F^dkfqϷ^8 'hsVfӉоFB X ZJ8!h$\(sFJ%J<לiv;̟?~,?=89*,!SKU yvKRDZ'*vn逗B|@5&ॏ|N[-_'p ~ZٍȈ=0C.ȁ>50ъ4܄P lK|ܫCgaOž2]e.3   l%vx.{x 良IlSeOAS"^k9PJ10ʣ fjA[Pp H"T>iMHmJyhd 9RLN'&%f E 0a8h L)qИ[5k`}Uh?Zanմ:t[tFV:(X,R,wY;aBW&tcH:}uk e2AYw"Uu@@FIPjcDbgaDF},cZ:19v ꂉ_0IQAc܉Oiˏm1 ݢz$2:h`rS K^W-y֎wjϷ޸u?x̀c8R954^~7Ͻ~TQ c$aF"a?K\D-e\ؙY!"$U%вx9:c)qƂEKKk5IK#"@Msz#"BE&mFjOb/8U j ڜ{ЎfK~ôa.feR"c ue R[2kE=( HTdt#-0L4zx`);_D u%0BmzhCpIy=96]vw֕b2nWEހ AZaL^0S@]&ıy,5R9=@uAT簻ӧ>*}(Qamn{!.@| $P_s -mu^(Aõ̫ xFâvtE'Od.&ۣQ:X)IM LCAb as`)mz`gLw>C;{nY5|t+n]'R 24AnUd&7-x܂7 p $G[ѧ^8 K*cRvcc%'G냖;!Mg(S8j[@݄ Rʐe+f-cGW;edk{AGT%\ܼ9u G\4;Nm<(L3#;qNy1ItQdBMb6t8!UѪ&1j-BCJ_aehmS7jQwaݦ-MQգ6M'VOhŁK/mhZvOkQ6CO80ŀy1*LIHB$ܒm &6z!!kYMa5&8&L̊22#3Ĵa/b{ N-|-Jk% TvqSdp=m>#ɍ^; mʤ = .3TYe޽@RQ@G! %X*:x^7;xTzC;+X"G] Or:G-u5C}FY= >>9c> 1,Mdd'} !u,ȜחjQn҇C_iud4t-o;3 p^;\P" (V`C;a,S^"\c`H1^nP[aizոk~A6aŔ7]Cj{^{:G:~N8m,"$EF@JsEv.wZ1ƘHk6٘`-`i%Z,/Ӗ#Yׁ02|bbaZ,`c&-dhP1JC8+nܫYnAwq Sðk+l0@:@*,D-%CTd-%A $jjA$00G/l O"IxD<e"1<,KuK'`|y+3o4(8;DaBEi&M=k8"]ŸJ߽"7~rcO\n$wA/~ҋ֗Uc+t &k4J7HU##ΩZޔƘcrnX[n._ g{5y(t(A?Z><M/iOʚ+T$@6PDBThPb4sP` ZNcX1Ą#NO`i'0%*r{--g\܎,A lq@X0 Pz9v#` Kk@hWO\솾 U,?  ~l #9.Bѕ#6C x1@"x>,y)`?2+7\=Tt'~q5;ʋcƌ<\>}cNS_zMˋ j4"Y&y:L^/cc[Lk5>69>8>>383~ixGrm5u55R>\ GJȉf#>3.S~{ϝMړ}rgZ+ ӨQEE ~oLd: ԙephw{+qaeXG}?4Fكz!]KFUJBo ^{Ϭ^xj1GNR0Hmyo`~˯lc  7FƭpPUrWpӸNn%T^UL ˃D# <(f:P_x7I58詌jn-8<rSϯ oVj3=f5޾OPt8Rs=ؘ3n96/~ty'# V MhX YL2K;?k+ќ.)sʡr0\S9e_DnlIl t6 w [OXWIpe%:uhBJylq48w ]be2{#2 G ۤѕE+F,y'A㑟DvD3\ S(BT kLC EB0S( -޺Y|$d9/l7q\%tXUz{^v]B.zs8K Ʌ@ (@9*HbV+Jg,-@&PggI+ES*t%y :mp9;|J\墓g\tX+h];q b|c3PL~ܦ8Yr)ET|яi]y*P}Ŧ TA'LfӚkeR 5$xt2U2}ٗd줢Vsk&jb"U70#\8#6bRfP,昔dXN / "KN '#ýE:[IXU,Ua/|  ELd䇉>3J KtC͛M,>J%7 \$8!&5~0|3Ep<ÍMa)H8OD{YM&]Hg41L%}> 0Cb˜46\p( FH(?:hL:+\Ia)`ġEnQOX QQO!6) o5*Ҵ~@Q/-ٺcX#ʘ;4u]]&zf 3g:pB1rvg%Y$bY![F:$UL&d#$7=8iCINYӖdL 9KI &BN8$7aq5r܇Ka q,p|  dCzJUt.3 \8zc?w*h +*fܜb6& Drz33&^g[x6-C9*uWCO٠>1͋`&H;h'Ia]9OV^I]v5wx䪛нG,ofݷ:wqC"̉ d~8 9\0Ø*i[B'tba-֠uZa=h;p;SWG|yL|9axV|W;XGcb 5d&) Ql\GH|]2#ЂϠkL-a 1l dh AdXBZN1^z( F0d2 cI&RR$/@yllw kO'8uL"j^$un!&x.Tse\xp+I ̕_9+ˑěb΀)N;aeQ?Kd4CBtPֳ|_%B)UDa>_pYt%A26ϗ A&d(cJ0i6蓆f Am\+O,1,ZVe9*G,q[-ScYoScq}5]oDVk! <^޴X2gaT rL\WfkctLX:S lV(a1N禊եFu*"eia.^ǵd9֠3OXj KF*FGulxAXb:M3q;LfdUY _NB]ӒA`p&Z= 'A2o1%YP6Mz(Mww^D=P`uX[6Bs\sT>Lsoв=:m;?e,IG v[fK㖙\Mj5?{Ž tw7MR>-U*癔L*)4vUz=E* _e]UDdQyyE@J( LVBXL4b uzᖤ!É~~MEcoAɘՍԅ~^CD(*ZkOw-XU{h|j:*j漂:F*:#:fߵA_'$=F6:0GPO)8͊[u`RCEȰ5?/v}BQHwCٸw)Ԗj'2ehXT9sԔ)g2S@ ̭lm DJ%[ޚ>)i?tvAݝT= 䩋ZgD6iJbE*1ÔgHcTm6UR6:,m6bbb:j:um}iz^)jKs?L.zkٜMJ|N/oYٕ})kVe .6#IMD+ >G9ɘ"II4=)[4K qe0WYg,3N6SiHqS6bUI8HOҏ)Ϲsy-a 4T9͇X U -5uf,&tb6b2?uIqKERbtm1^xClmjY2ѩuR_} >M-,RZxP\tpߪW%̸߽i7z+B:VP q:S! LIE6)IKU&Ϸ~?:z8Y0i{|hI=3^: SgЯۉ4W(FoA "&N2a6K1gI n)x %3W ЀO,7J__uCtwTL79(5 >EFa:Yܵ$ƀ5)d"Laf23,d5̭kN>}vڍn\- xU=਒`d,)JgR+0˺,-H?bL ~g5k=ť@'t]4 Y<3ltsy>7/;{c ؊UHӚt?3 _yC?{ee? )j*Jnڒ=wPYeE=^#RI݃7ex/^"Q1ށql F\z' ʲR\+;ITqtnnLA/a$o!0!\В yVWUv 6a1]bjw{/,l/LaaƧ7AVBl?1^&r~Wf:A[&M Bށx2 4LXv%dŒtݾ_^3s}Cӆ|]e}o91:=0ԵW<ݰ镞 /|=r1oO0n6MW H~7+K>:X3bc1H`^ў>_Ms'2=Ώ:[{6Gq)rU{gG-xm|cݮt o])W,*=n c.P,%z8M>W2|T7bζm}P3},UQU*){7iK߼wV=Ew}+/b}Nxbfe[I;ĢUK:%v HY/I5؏0_~د|_^f U# 3]ߡ;tCټNܾyX׽sKZJ^ ۇCQ0h= (!E vy 5t`G2, xgA8x<1^鴆Y@wxʅr|ol#j\5qɚ)+^c{mIyM} u CvIM{?ѭ3ƈ~̍f0fi&E56zQm^cjQռȌZE<ϷfF! JdiIvcQ QSӈ(W)?>|5M{*1s)E?]3v쪟vM&4t5ŧ,2~7vOg݅?GݣG-3s_Ֆ;.IV08xk(ԳW*Z^nف RoTBS|8ӕT0ZgVd:Wxv 0㐄bz|qёV26y#/> 7d=m\1W%o@^Fm2X,Lh0p)(!nYKbcs&N&Z5Uj=>Ԓ͌(qH@!&ODd?І[)ʍ׵^W-_uW֞yC^{MgUon>gr_yL3Wu s˱ubg%fh#=.tzN?Q:0@vZ!biEV D1^:q"" $zxUv l5,uݏH6E?+NzB"/C<Ċ_0O* BCT-@¼di"llA-?}sJY2Ƥ6Ũtj^R}XUŊݞpO ͩ7fL 6BqA yh3@f0-h3A<LP l0 EDcv;=2~̣~NJBsdh;edCpC8I s7[oiGfw12y>nz?|ᆱZ74qÏ|ri[qm1xD2PkzTddi1K/1Ƌs-uTY#A~M"#!?yT|sb ?-O}:$яYlaU"\:yKHXI^1êQ1Fx&IW5R&0i< eWuMno~ue^Ktǜt!2P='B.D۞Dg_ ~7SH74q B.uݮ@ VlDFr Q`ʲ?  Gc1?_1? &kd KPnH0jTSs'H}֩n?;u&jP d|izg~|c]貺 V~eIҙx6cq"G#B5Trt5>4$ƼRjw,N ,f3 X) IԾ>JoҢṵ|:4+ri!f+P B\.cgMku6hD,8HJh %hJ M&M6t;u HQFmYX{!"3j4b,OKD?m p"~)K=:=-ƙE B5qFwq@[>$\._Xşz_QtKN-,Y3, &Lo񼁗B`B=(}@m@D0I+n2Gфw "q/Pwu O"܏ؖǶv4YPFa<`<* R\>ra0T(l׃Yِ%_M~c-nÃӦy֭<0e޷nn*T3wvUͿ2?nLJ=|f]gz}W=:-fŌKFoN郌Uj7!3#$ K}?Sqܱt&)FĐ@s`< ~TunDv̀"Sѿz642dXB55^Ϝ\QQ5qpI {p}qus|?6Km`/^|d|LkrAfQd8a=1LJчafˋ /&Q+PKu42lRA;FKliNV*s{'4>YpQ??acPSSS 7qMm:`R˂t V桑ɕ`U-u;t`:7uA3؅[AYZז@ Q"#l$R> AWGL!&T0J*(( 8YO5\3vf`B^ɣsO.]N/N͂4^رvgs7n 6e2k'pla#Chj+ic[Em]-1^w"#ʆ9&=iMS 1xb?( ) cfDD3SNne_d߼g<@qnI̬du{ʹ/]"`خyztJ8X64D*Dy Ή`3slfqi+$tĒZ=n1qMK*.{oMowϺ*_<\k#3Z0֖LtąXdc"̀ SHǁ-+9f''H&زM]ԸQ ڭ#[$9^VӴܼT+ѯCoym2w7V^~h|A(eH\T'{# (fQ1C&d&q!b焨Na.ArJB崹a =%( W \"E灇8rqsȃiνRe!N"BmjD57[nq#wm61.V$ƌ֯.+15j%C8{\3sLm@+#lZĴIU?2R(fC4sԙ瞲9ҲY5:T8U%m.S 0JLVG֏PyѶ,e"2nInŃ&mjMOmDQAꤧbOšJz!'r`Xs> i1YLK}@dqtѪ|H>ȩU7 lۛB/\D)  @fBkHDL]XQ{q{cl8v眛֚?ﯟُd{yA7\6>͕>q.1|&1ara3`/nͨ46B%Ї^ubCP(Q4onC[-C pV XO,XU[Oجg_o氿V5 Du~H.q?iOCp=Z{{yW3L_$`M`w5F0W`BxŪKG#F0`#F0_ l#?Y!uȪU]SGPm\u-vvt^9qX۰a{."x ?ԣS ("&Bq,}ܨ8m#F0wðԃu )%п.4,:V `N#ZEa"s-i&ZƖn2G)6 83q(T̡FӰ8` fPM13Gݿ7X=易2-nqʹ1Pi9&spS4/GpsOC'mH I! 6$q҆$n;/ I!:8DVP6;[BG͇@=[!`#ґ[̷Fg"iq5;=;!\p_#{on`Z& 1caAKƲ01hI}J(刏IMjcD. Zґ:~)f2:0:J43B0fh#ɗr(sYVS ))]i{xF0/߻Q6M?a&Sb_ooJfPR ⧫*=y(~_ؒ!d E 'V"(Λ::p'wߋQj˵i*T%(5Zk]@,EZ83quE2PezvQE/qp OYj|hǃ8'"L C<UA_8E-p=4z KEuŃЏծm.3Z+)R4#DqhgSwGHgRC4X'u gVWrOvA+6A,~; Hǀd!()Y6"=V6x<ێ>IYx. 7"ck?#шF$%#_U֗<Ǘ\P$r.6Ҙh$y$HB5Ewr[Ozk@M\|=oQfn V%r&O)#*B%Hr&ΖJq$3KybX5\,b66t8OTL OL*y*x~1p@crB f{*xlH 9%gIԸԐNBGHҥ@k9= W+rTB1 Tb{24nrlbJ2v }hMb>I<'pn|R q)Q܄<KH͇ 2MN!C-).sx`Ȏq2hnr $6/I)D>d <IHf`礂Ώe!V =ԗǍMc8`2$cGqHV@867G1t*PmZb9h cE&s <0d-yi\>y\>4H4/'p.CRyl>A(;ÆF݋cyp1%:_{#B$"RZ9ћYYY?|_j|y;=3w3w3w3/{:={7נ;Zq;\q{XtKoGg{c3zE)0T? q aMG~{IZO{J&gy*)Qx@#g 5d܁S|;\.sM-:MƆbF-.t)Sc ˊ05Qۘ`ǔBQ)b>ћ`8nuG 6019Nv-2\l,sMŅN|^A6Ө*>xآ2h?O#6zi)&@\$&-njOMp`no&PgIeGI3{3X$SEv3wlxnFuSzD&k2%&ڵau!B VP`p  E2k[؉,9rI|>'t |.l,_GǹI}оVHiyKj!-6$*Пϧ)#[,c޵dKbJ3!{Oc*hqo:n-BYUfՌq{N^;vG~NOi[71?n<>&&mJ5+8{gsYNsGwEzuyՇ͟z3VY\+W q-ߺ=#{͟ptiqˆˊ{ðw ЭfI9QU'gT>})Q9b5sc?nygI}.m޽٫8@nǥ@)X..t;}hzq YI|[Pӝ^E+-k{|aO͈dO"1ŜI B))T8}ݣӻz9$l!411PqDO"V7&k6@e aH%I3"i0J:'g5؏/^dpNgvg[QW}~~W7zNKv̍uKbwz/dju=kq^xv8Js.mZ-hpKwk}ɜ5`ݕ6D˦q|ںj.>㎍yX3/t~jI#7{^DZoS0ВZmvEةt1v%qu︙w/OUGm9[?1LjKYaϝPcY3*b fؿTxdһ8_^,T˂`˟Йe CBȧ]}c_V)t8j6{i~G!US,R{S0~&Bʮ'UG?\D%/3C+=y/` 8~iodE[9lb'ި=?}߂v_ ;5¯s\Q?!SB-}ѡ s])!ȯk~{V,^_OWwg+KZwB+ի\(?n- _{joDWEF#,7gNg*͠\>쐐ǟ3 Po \nNhm aVdg'&X 84 0(vI? 784 ` a+K2XCds ]P UA. A;~AD0*Bk tU;,45ܞBLL+R0Ӗ7Ҏ$U'=jO\>]Z~$Oo\^M8/͛?c}O)CGe޾-X2sKMZOf :\ھBMϷa}[w3\1?+ᗔ:дqFpΕ:q6+ KO/;>ힹcJ~!C6]xqlV v%x緞U&g.=td|I2~G,bQPaIVlN+vI]X3WeumnqO;JxO>3o^}b}ٳK'~xêm|=|5{G-J];1ܞ}~e/L.H1$)|wԜbxdU89\P[g!{:Q껽ަ2ݞz}TOv~?cۇwtkǸ~8=tйk=0ٱk%twnRV&`3 X ZfuF ZZ:%CDiݒ՚hhB }Ⱥ١n PɀWtf|` kJ*3sZTz,z̫^F&2)1g}0tB>U_bWxh we9b1=36.{Ѵw64q(\56eD=eKD̎{cɫJۍ`rO-muM7˶Sδ#o@4W yW|4AM"L-=g0`1Y 3l^Gj, ]["\+ó.ok˒Ʃԙ3DCőIXa)G !٠!DACw$տx= lmh.7ܚ{L^xJ9S3~󙃣fa^jz,}OdnY\Be߈=Fٖ&U3co?;L<C/W_o"N+?%L7fVʶT-S<ӷ-Oows8+GeUXy#Yϯi$a@Ak=?*b%zV~qXO}v=x7qҩީW(H]3N#ӽ^4Mv2VF]wnIcUwތa#QY*s~[JG"aDAmVw;ѾSK<:vq-YQUqScnVx&X>4tjpNyC?gsOZ=R{F}Q^+1 m^;ﶀ>/o/<Š|ԹnE{7}ɺI3 ~~whƂi:vWp!=]>oMOCk+OqE^ac;ОfswjoqqǁRz=)iȝiOh݊tu(zI#i7|%6luiUoeܮXT0Jm\ ^7̿?-}~-p(ElA5.O~K&R6o+GK_ʔY z&_Cl򾤵nGq_)|RYs"r0Iy8D?Ž&q> oAւdߔ &67Ƞ$"E6`," sFb҈D2_fB5L"J53K##z Pq,&>^ՑvH},ֿzg.M݈enymi2/*j^#$h̅<9LFۣZVw;i+  O3fztR5y/{t޹Ow̘]wiKۏD'BGte?fu'=ѝL۷vڬY̅ŝ;e ]-$~;բub仞ü+˗ իFl>v1W=עOrFy8hISWvg/}qǒnZzܬ[rd¹W&$Ok_2glOXQ2eYڰԄXˆ̏L6Omo324^FҷP)`?ݸ~j,> ߻)FV,[pՑpo8Hg6W.Zv}O!kkV*\); !+NS*2UeVEoR0?Fo./9lgExn=k)gh~'w49?RhyDkl"8Q|+e') .>xcßuw0t:vяN/F !vMj~xy[P5!iNmbΉXoCO>2sXQ> stream x}SMo0 +rM($D)H(i`ӎ"9~q(="U,YpwaF-3L휍M*}f~P#[e{|V%Z=4] ȁm `%T:c= 0ia\k_9%S%]^ WDY[u~閦O >Ѽ%-1$ X#y3 >i\;B%nmGI*qvwO]R.ЍyCx ;o> stream x| xյ𙹣Ͳݒeٲ]o[vgqXY@I@-qKPӾã h O}-_kKi)ky sg$GiyAJ3ssνl`@7|`&7>#S P 壗o {][v< lIX`xb͚#B;k~9'vecjl ?p4E"cx;{w8{6!׏c{xgb3~/؞u{2n~E6 &н*jU-N|: sK.=?WsTWn W1P#~g|[ n-sVܮ#ʧ'g̤Y)S+]|5S|JIGv9츓'kN(g{4s r*E5Ub!r_AyP? H~+?K9 `[fB\k&!vm\m\,gC6˖r-K۴Zdgj;@Ŋ2rkG /VPi]4^~*0`ɧܝx-y "Ά̟8㮀8\L^z8yv~tJ^'7H ~K i-#PI~_`+҈WTC~nOM%MW^eǺ?Af^H2+sko̭ Hf،ٮ3>4CE{̗2_ޫ\Hs~XO7~. yY }R$ {r+7_|/e̗2_|/e̗2_ˇ]X7cV ZAQةșHU0$ Ȝ * g:Ɂš .a7L_:|r磒6] !Rp4q)$o#ppwǾ>'_TUx~PuEV0#pl]%M|_SDD܅Џ`($\kd|!L} '3D2G~:W-?5jlޥl.dmPB}`u۶Nl<>67nX.6fx+/XdhoB}A)P_W[S V*+2/_ZRqj1P[Q T3N;ҷMtB_go.L|.V!,upd B$~[^D^DΏ_Ę/gc#xnw wiu=KDkm mއFĒ\3;"Ȝ8k+q:``ob 1bMu"c}Kd,"c[K;E{<ۊ2G|O X= ~kȌ;^ uL{Ia -aACrMncẺr5\!*{E~($D>6CcĆ$`obX . OnTx|6B?61j}QczGzOE3>DSH!IϹT /ޅ;*lHo[Iݬ$m\2& G1ɺ)ޔQ,AL 1ʱ6m ;m|qi7I[C}EEQa b7?]!J%&pqMC W K2D4ht$żTT*j}|RTEk}NT EEw  v3NIսy47Jւ->,0;+yKTO:'~_pUxԞn<.&lF6PB9ȉ܈m ̢̍}(7|N|f>R'_rcam-+zKq&VBW!:B" z̔'C";r&tu ,Q B]߷Gj~@*whYERo+{M{oc2;|^roYvKcfQurWIxTr 1w~+(ud Ϊ8eյO_sSlbRex$˥6w֢\KVr1GEv9߈sZyIcmaxDE!w~sYKr>r_s*5F3TQWb>qS#G x/ʓן@!'%>f =쒱oH,3 0M1V̡F?4<0˰L9<R/K{i'mA) aC-&QNڣԹ>FrQBHg8'9hrߤ BqHG&PtP.3@,( Y]caBFǸg}$JCYI}}r G7֬ytGZ vNdDapD* v|/@d}]beXM~%WzykᩣL}<7g2xs+*I""zű{89FNId4&g "Q4Y /3FQ>Z&cb,D'J 󲎬FS*-cLUKW;; DM-=UR][KY(jqEy" wph ] ~R))Uaȷ=]DIâο$Zb-Rܫ;/ҁ}y]60\Xq=;{uRw*֝AZ7\/r7ӎG-x>#SK7ht5ڷt]L-1酧?Ac1 壮: pQ"2ZL%7%nۜmӋص-&QWs TF} 衴@B^D8mP PM#P j)MdIC-AuBBt; q)r>I>]#5$pR(Yr?# *6ﮐ/1ҥ쉝C|h4iţ3DoR1BNRISވ W1z^,z4nMKh+d@FAW#4Q?#}/ j*/%9he7&{B<3$"tx W@Rf^dssѰG:U7g VDz72U?yxJ+]>/ o;v-y!޶ﴻQўK6ϖmxۼoVāE¸;J| OB>S /ju 8tG, Mwq}hog4F ?3PG%[2G!籪`q1"/a5~muDoYt7p@φτޯs- _Y,F(eleZg/#=;tI&&,3CA K}@ Bqڜ-6[d3m6MMYo#u6- 1*F F(A:ðntDu8Rz x VTC>Cꐡ̧/JJ|Fk0 5BJ]H8E!0l@Tk0Zh(CjPjAKvhzͥCs%(|3lp3:Hg3:tfΪFu ݌> tTw;e|GIa0w:4dp0<̈O0\#C ?$6Dx {Ej"wMzX4[?rqx4 KācPq8dr'&6JÇc* \,\2X } 1+|Q ,TfN+oؓENzfgc% ELy2SP!0}hГ9h= y3z!ZWN^o*#̼ɾ]?I~Ӛj%:{IԫaJa%Fmv{g}=!U@j3E>+Dj>[齰5m8%PqkU0VkUxw9(4 `o)ނ[p%w\|8S#_dE]}-qE_*E84%p"p)5O/KRbtp)_L?Me>K=xȗ ȷb۠QUW@l`Z:TLܪ*e.ғy)ԍ@=&HU_T:;MBஇ1̆`bm$\SR;iԙum̼sZI1n͕p70d-o,XImq[](w~sq/ඁ܃XKM֌-\t^Z`N Y'1p&<5»#v#uP=sO0VG,5S,itRFsD,b.ҫR*mV[u/hښҋ[+ǵ-֮6cE5!栉pzPY{ͦъacCW: oe,l`=LO7߹ׯ@ D[g{&Ľ_ Zcu-1@&B"SB]S3ڃ$8e騝kIFLG5 AFal=##Ad.ϋވԽPj>DPJHڃSI$Dr$JJBxQPT}( jiAl6NHmGo{Ev?k>Ϧ=_䂕kvOosģW7r Jw}(a4T7\LS6/4 |z;쁽 ׵WeB2<X,nՂhW-Fld&'L`2 )!Y8b5XJ-X=O  *'yHhnA먧pKC'eVeT\$PQX<# Ƀ&J M%Afꈫ׏rݦ Tؕy[.{;_cҧs[xggnXb|вp]jY@rc$k>/}^Zi 4hy.\}zA}bDa>JRk' Xԧ_qv/Kh%;AL4OʫP}*++;M 3ՂKVb4*UK%~0UtgR3%sBZoejB 1:\Y& BVΉr)~2>nSIe*%=FeRfs*pփ`Ӂ2^2i1p!vtamY1joexp l]9tt=3Y#/:o`NAwUHӾcuw߹m+֎H%λԮh{F1\'ui#FXr1m0d) JOs!9JQYWi֦wFdL1>OZg}bXwE^b}J( B<ئJc~yNb%󰦒QBYXʙw1H &s0?.)K9YNCQߥ#/0QDtΉ]WRo֨Vi"SF /~HcgI1/.-a .o;M!v:ZR01G08 %Oĉx6g6ž<| ßN ĤhS*U졬,eL,/QE}q-w[+*:xH&+6C-O2S-[+~hEJdd[yT5RbШO))Cin! tN5u䘌/'>Ir JZM$DI(I!"(I0>ҧd#bm+nE5tʖMͨ#Zuٯ2`;'S?$n-~s1?>lcڽ*hxOR3yJw5m;7ۑDFV"z@F&NP.#KyFr b )]!TJu9uVk+lQOZizr(?Gu)$l2("6?mHP|eakk1:V ʁHM.T(('n *p3cSwNk?n޶>kWUdlϽJ7ܦD'v,gQP_?xG^Jh}喾k7g"B#=bUx6K֮RklDaR*- `S\ln%Wʌ4U5gh_z铧r)kf/NlQo&b[ @q&o"r*ǨcejQZ͒\R#xn탏Kg+JVH0N1 ;|&k!`itw@_A)|#՞J54vY#0rum'Z[[fڴa 3yT.ҪV6[5*X1#GÆl.bi'Y[ӅC ¯X;e\[a)~{q#ba#wKHFNKju?k䊫6W )['83]iߪb!via#U:+NQrHrJ`2,q q;(`I[㩈^]3ER`V|n.qZY>+תLCtAclUmxjj p&'5kwFrˁ ۱[2g/|HBa0+9敺 ;1l",pQ<zVbuԐ@ >e|[v{[SzkĆW,[ޕGXmɦϏ82r]o}t^Yh e\ D a -}|:F^q uGns1`zn&FX wPM#𷯋Ow rW`sGNjı ekbŋ3zCZ*>T뙧+ iiXnȂMaO7eUMr! d[ۏlw]^d ~Wuq db8Ay-"]'SC5/93yh"źPtVI8% xo_te"E+/P.<e/DZ:UkO̤(d&C8IF?{MF`9pC{ź3n82*S8bΤƀGA".+~]\ <#:3h6lv7fBCHl>W>o tX}:\4طbӽ^Y[LSS-VNޥ\2Vݰ "Vnt]bcG6&I˪%D'5xGW ±K?z~ F$n03d0:EPx A?ޠ%pQp CUVR`$bRܒrT]^ -U +kx#EXE /DŽ&/ňrUNzsr+Wmjae{_*캥tK/ 7撛:NOm*nZD8йan*}K]Ø8[5"J_1hU[4--8[CљWt,8 e5RxևA@wLJ%~0ײ+_ۗ^`fμ!oJyq }$/\׳݄=dқtatI&Snx=6f.$ww[k:f=̝u&™_>Unfscs%2<"k *֠(/G@o+"R%lzehZ d^ݡSV̠uo<}1p߶̙豵CE'bGU"#Qh=z$V͆X}(g6, %,z%&"\ &=D|F]mBIiιLκ P( { 55guKߟ C ]ӧ,:XX W' ;Іp;0&Qܮ{[\Nw278J=a/xUCZۭJ9oX9"Y ʣ XdNMlRъ[jF sk4uN}W!}oǒDy8kor)h/M}i^ihPDN+8*Pw+ dݒJרnih=DD3;3x0zBaI&# g E 84D!a9J\w}~KZHLA5m|TN My )+HĴw (EW>̛l3f;\bg\uL |_. 4Չc$ǖػ2 G\6a<|m=\ 5L&&l߾ұp+䠵eUOIZ]2>o">7 5y g#iCYVuӬawsaE've@dr 7&H5$W6MLm.>xc:Co%?7m4ګ.Ib-Χt)4dgi9PpUjvrvގfOjqIɿ9uX`vkn߽>{x<7}t8 .ԆY'L ѐ"#NqCO$4Z^H) 3NR~(C 4oVHQ -rZMUTS| ў _T]_+NymH9$-|M@C栧Q02!1b_.b0`)ĚR(3ǰ ~c2^z5ddJ6O>"D?#%??&.кK fX0 ˢ4PBVR -f 92<^:7SxR3~(`9B"D^]`$i(X"S&;ҥt-evX0b\:N|Bt ȢsIeo1~0}|r4 g~SD4P3\79/(Cj@L5Sb U/ { F&޶&%кhϮ6={$ux[+J5iŪtd?{󢣛owD"Ғnb+ߖisDjސ6`F|&bL[ұgmJˡ@H-O^~ސޚˑmީr\u&y ѥD h))%Ѻzv 0Z}ǼSsUM22gI眣5?E.CrQDPkUJNS49I S%y+[yZOj["Cp8`Z{VeQfsqAQfɅŽ] l{–.6Lt^>oh:G;Dvb266Ku }0hUhi΢h2Yr}@0j1Sl9'86&zBxH8 $^$j7vL&=SG5y.޼d%׮I/mOgגǪ2՝XT3,  b%KePT3y97.ru2ޤ|  Ut~..!Vh=ô|~~E]@{[_3 o^Z{G??~hٍfALH"G^!"D1>^Boh4QWHg^ 45Wz[9w?cA~Ӂc׭kI72K;fE\{꣛'OM O,Ưڽc Sw<9BDY-$1'6c1(r^EAc)6 ,!!Isݧ EAuϗ C,eLN2p?_q}_^qʽ]9(?tǖ2#.? tiH@>[ׅR@"`4UE~%B[:`4 3y !3yZ>ku:/4#;J D&7 7goH_sʢ=tB<ܿ>+Pniqg-[s mq[6k 2L۶ۚ[c}Ü&?t;N&/%c?vC:LLzZy=!B[+00 lDUgy?ܺx'}"9zw2˯XpM "vӦ5ΆFV2<I&z cz9j7|^+ƑE|XDU qH ZwA4F(Nc{~Z37R7FSr#' p7~s4F6>/4D-[sv;cOЀdU"u5ݟ_@Ay7haCC%VK<^g&菱4LO3/$*q5Ubu&}˕j)QtjV<~`Q#Zz톥;mP6U_S*5˚ [{制݈mnw+h<"L7keCt#Jn`$nNKY+3ݜ-H -a3h/z \  Y`pp$3WD=!Yŧ>_J mawA-EYr\K:[05L^C,<qRri AnD0"`[AdvRï8I@xz&:g#f@{C N:5Zj ]g.cT`=qlW pnͤ+B+'W(O#A7ISXY(jj̩P&kbXU8.E)tUeœjVg|; I*J3 @ \m= Nls- 㒰UTWs7`st0dFSgNHnF)ѵWhK0;1!%8ui8%}!:W󦤍t@J_ X^q@RF4yלS67~7 dDV=^dݔV5ɅT0BOwCc܂zmmT&nZa??K_PYw\ɢ{1eb~^޿|]Dj G4x5>o16u84$S@vs_DA s"jsN-0B}Â/Ze$^ AkwR+<{OAT-韠JduHvJA/VbLy,)X2 V=F[QvQ)}Gzv{ٳ=&~>)7L$HJweO+CCm"E?!kymF9Nd:_e^Xދ4IE;iJ۬j5"!j8̀1J7D_"` `3y]hh4.o4/Nl,kh;8kԔukwjxX]jkirjhuuNVj]ɞ6`yv<qX9eCwq1Ġ;ǰSx)n,wo<~y1`/12ت[Gמ;M~}Tr//n.؟Q]V] i[c7kK. ^_jP:NթŚ+I&dO0C$v.x| ۊ.PTLp8LIomT9S ڜjvـ6' 3D nCoCz+˚SHjl7jQ^nr9"(f(/ y9״wϯ3Q%ŹDؿPdz!wׂ,)ׇn`s.g x[&=L)KGU2ٲB\J.FGfJLI>萡/Lixl,GL;edF߬vε)(s|P=։ +JJEq% Z gek3 {ϊ *\>#6Clkۏ'YHƄ#wӹYǭ?#_nb Shcl9M#J䌑WP|c,dH͟vC肮 } * Jͭ<ԷubJ6EaxvzڟҔ;9 O,o1RmK/~5 Ȑ.}x֦j4ZZ@^ܧ:'+\~OZر/gMqN[l%~VX˅ٴrtO A>~.f(,}t Wr B;FD]}y;6maN$!rN*B A&'bKSO](Wo292IA.\RxP8 vfzBg/k=K@H špBA(nֺ &AD ZvnvֶEi7ks}}{dά73眙_67%t1LZ^D[(ut4z5.?2.V.KԱb%X2EeUx z)SȞ:k*ޚޚT}Tym0E?F<^d"Q$?|oV.GQwqЦAh'u|G'~xq)=ȆP Az:MȈ"on}m8y ط%~Ȇas,SSIZ5hkf SVMVX\}{̞AeBJimFoUp ,%{{6ch: "1X#)ᤠEkNXw4O3%[X`-"3df#7iv#2UJM%h"i/)r#g2APhI8E*H"A-jJ,H#PRs:U嚄ƂM<5wCpv5PS/ i&7qBύ??#?9~NSRfDg?,O w6M. PT\:G|5_#*5&Z$GFȤXEKH0'ɤ&#bbu:FDR:B)@}Ƕsc}O]|vDemŝˤծ`ծ+t5SU*F8J'¿5:W_d]յKGˁ,Z3ɒtyCo`2{t)0F~y@`)!eL8q$x5Hd"WʱFbuJXxxn{;4)?''gCc`[EW`Nj4s2D!V6xY[@ Kn"ĝ¿H%Zm <))ɩɰI[S&GDhtl 5PuCqxKni!\zKrCnr{of_팛6Ma(wn$rrg?u3~{~'Y2"ۭɒ,s"U%ɋ@; `EVNP$v^GۢxwoCeW[0n EGrIjШ ̩ -ERŒQrf(p|_- 5%yu]LtB`1(Ԋ8lm~fqL#Bϛ3`&xp@t0" II(ɝzfQ>"*;#?&~/t^\!:='㍗z9cwl=XM%:<)1Qr.B.DT!YÀz&/3+sDL鞷xzmbQCEnbhwJy){ʔz*ECȩ$/9{r(O$=4G(L"(k"w ^'B0A'z 9_YF6(FF)˧=,PNK y6}67MJTX:%Z,$mxbzORNu]lYHNFr#(%lbUI^`:lGF&Y%{H2Z{&x0K蝮'Ԫ0:|Qb򖕋[v f MO- (8!bYX\2g%p[BƉSxj1,hR2s%%3FHvmJD&6 VfWGJ?HCdD Ӹx0{Ńh t0jv> h_#{bekcWY6uוN^=djE'%Xedk=pB侩#J7'9[8($*glqDere(,\&Y~& /w$~_[wL/ iHmUrhG~XKmJ1QFt &:AWԗi1fU$OqxqF:mQj=QLTV3yqaG31I*V&r M*Ȕ'Ut'NC4M <-CBzӀaSd ߠ=ϟ #Mqwߧ5Ef-O*xf^3_,^˨O9]zP DMDĻ$J {>]"*IŠȏnތz$zT1+UVU@#vH)[gV贺{8ؘx:,i{vi뒿N3F…ԅ]v$}d {Ɠ8|IBƛ)"L,C9:.#49\OkҟBbu.."2xCrqPۗiap t/$AN8IB)B D.#d\OɏpqŅD;.."\\L\\BۗTTq0"J\\F+'Y9qVl3gY9qVl3gY9qVl3g9k@qVՄ'#'k' A4@J#! oVNtw;wh(}g\7r}JCyOtruVܵ^ i~:LZAb4{lJi PP{~zęr+ˬnڡ/dp, ʧ÷8\ulZo-5AҭJx1W~`_A*  ˋ׆i6@JW㔵={?r`xO+6WmS j3*eHC yIAqrRFÒfuیeF:p0c]?3$&,6hR hvմcC< T a! bXFAu炠2hTzm lc6ǁACPY X`KguAka,C@ 8?ceQy c.8)?k]J [Vn}ЄS`}?zvB TKRvT/,/NVSqczY51k^zt8{O rcGC ^vc?j{p^ɖk40dk{}?g6O6[7jō=m;XcC9''TkIQY\N:04c1Rlи>Ǯq{N,:ghZ9:fXoMz'+%B=#K(}'/ٜ֑">=IraE+ ;{1XI&,q 2pL, ?/f=ǍKڧM;߁5r%|tR[f3jl;M\Z9 Ez}78|&A=nދ{ݤ~<}G3yn?ԱV;tsu~lS }m`3m^ІH&9P﬇fr> $;!u9.`jթwSt9s!YPNGktZzH@6vë7ہ^?iåpFl6;}zg _{Jr z'!!(px>^v":&:(Tsz!=,.G *4;<ބT'XooBAz{@`)6# Ӆ5ի)_ՀHĽzqLXSˏ (p3!yB)ԧoԷcNq5e;>{t*w8z4-?@!Өw:ZqqTNC #LJt^P,7(ފ2s߇lΣ;[ؠMHNlY݋ Br"rV;ۂ2kqc˙ց7r9&6'Dvkopڽ-8>hzPrvT{PQrXz 6kۊ;::̭B64ym͝FТ$rbջfdO;& d$;ߑop\, @@82l VM]'MondY{FCGuP`!:SrW;`78A3 8WEa`#[;`AkK ;i:.{;^YmZ &*p( N8R4O 4 np4v_gwݳF+wr7qGw[cy[Ys]Yȓ[#~Sq$nwۅҮ3 [k8)6vi iE)#3e4'@) ydWE60c 4D)ajM DI i5֬=QIUbѱ*6vk.~~l#M/v]U&%&Ztu`2<_cQ2 t!RJ&}`L~"gd(Qs4z FR$+N,Ju_~- oomӏ$-LS`)+-. C.; ʗ*A+,L {p!S\3D?fTq^AE)g%d(,0!a"BL ]Bu$e~y}btu/[t˜;u|؊_>y6h '++w/ܱys~1_,|.*JYN=vԾufyN{!O=uߒf_w?L^5?l|CQ[}J79ғDWgQ25봺G_֋!n@j{ܻ4|]O73*Ȱ/n|7#'J-'gjw)c2ˮ(.R 3ZVƋEpŽfҮbo6!fbErx6ۅvfn{%ogS xfʍCUpRu]+m-NA/WHX`f(L/|!IF2Ṵ5C-+*nа}ՖћC&5I.GYɭ_YupNjfnUrkM5}~l޳җ*s~7]l]Ɨ1!qд7n_yOǬ[}ZÆݯ˖Nm g{rDg}%a=-7~Xz0z޿ziԾnJ672ֹ]3<{uxl$7:d|D7Y73}d/ϼO`GRL\Vw*?IqÜƟ?|ӝ'N>w '|sỴst e!(lÖv|kFWB&[`Ecd^ X$`0+` -B. f}o˧/蹉]p֝}vOq|rчo|լl{t\OJ?\ULqnEo_ldXطӷ^g=`׽ᗊZINǒL3䍦uSfO);d>թ=\~n[y%wvnK7T_l,~#7 O]9}k5V?e}h-HF:A4ZM ށyT:(W?MOObbƢl㡡K\&]9Vd2uy).הc-4ZsL yF{NN^nc}?n89~cݭjW(O X 11/2B\% ]0D${xC\tEG.m= n=-'rgw7-6Di `JI_^nzνUfS/?uni$dL9٩BPZh[m<-*γ _[}km$gg0-i[7Mi>JXֈ3OJdچK7Gw$_;Zo_Hg9.lMy;W|٩i_hbp_NͥL%l[i +S/عB`';;wuə Rn*"u"7P>x|%@DtbCauڑȿtC[BHgٞ!ڟx^P &}$( (>YNގois  \D )o&M{e1P^ 1׍)`0thϕ?:a19C--d0&*;["  6_;6bl#Cb5Mho 97ϩW|U:͚Gpp#PL!E~wzAbn{@F S0G:P{Yͅo$ljO|QoY*{W.v<IסCPoPļiϬwHY>FSuR=|Tkh s9U- ^*7/~m*dEb0e&j 79YB4ީ9:Dq9b"'7w6Xq"?bWmUgNeG)W07׬ mT}NYpZ|Yi6Zlb )36Zn3g&Qh#]D)`CC[bmN-3IȰI)kۻO<:LRZT- S1$5؊YµU-J6 vcIE=C-8 ' /k GyŁ\g4;).zo<@G ׊e_g|h{Q_^2w' W}r!h%I@!dB鏵E-^֭#w~#Ά*uI;op{fytՙ0tzuf[+J--gsW Dž ?"XB3oNĤ ~2$BbGw`a04 -- &"*yRlcDð^;$Aȇ6g&bvWGE][si -oP*fM?GX ;9,s&pʬ8PО8vYWQ+i87IUƃSR;{Ƈ?fijb֊[LNr6eIa!sL[~,-o0ҭg4lDS^Q<zwy"JjToY+ #ްhpBGW\ cFT OxN~ endstream endobj 1127 0 obj [ 0[ 658] 3[ 220 588 596 540 646] 9[ 527 585] 12[ 320] 15[ 523 792 671 622] 21[ 590 481 574] 25[ 575] 27[ 545] 131[ 526 521 433 524 457 292 522 530 271] 142[ 267 799 535 507 527] 148[ 407 382 345 535 460 728 449 460] 481[ 199] 483[ 259 199] 486[ 319] 512[ 466] 535[ 415] 824[ 371] 826[ 389] 855[ 619] 942[ 528] ] endobj 1128 0 obj [ 220] endobj 1129 0 obj <> stream x}Rn0>? m%DЇJ^Rb,C}Xհ3;f,_Ii[Y@OZ+ ]{ Q'߲)M:q1t=4 IH]o2[vOAaZ'+.A'4HSrJ^6@B/~;͙= cVAgJ {NJ;iZ9v-g Ǧԣ"9[l5![\ovm[CL,ĭc9™5"h c%qx}A+xWWX`)~55VݴfT?q1 endstream endobj 1130 0 obj <> stream x| xTE詪{oNҝݝN7I:kwF $QAYA+*˸5 d\S)hDd }S3}or*NUS۩S:#F0%-Kg_ղxN+9ԧ~ @м7eK/Z5o婓&b١[bͽXB,nc l?W-[BrB6_Yt얰, fW\?[(j7+>d Ӯnjß ,f29 d7\~st;Y3c*W'Ó˜.Y6vuP(Z\sV<=Ql@7Nïame>"r~!ne<GDJE& (`hSU;08#G_$@}Dg jpiz66x'@{)_|1֫enq 18q=1ðjČv^Cz]3!2hȯbn{.Ju\ w`C3? (J]G) Pt-<1EˠA̘bʤ!Ŷ>O(qrqR?bP>,~a^Q-ʶ_AAAAAAAAAAAAAA_¼aOlW`a_`'G1oe/ 6 ;tP1أ`ſw°ʠAX_7t߅b˷?{"{VÞC\? {6y úтyEr= V*?M(?N*&9} ¿2ě/A8z =iı2%9ަeyO)jEn TH/@ŏ߄ͪ{ƿo OwQb`t*r8/8qZ[7 gaDHOXPL`TthO1x wԤ[odxa8֪0qV \k,˟0SrcXu?^5gaj5e??QcLqfKՖ'@xdfe{s _4ˏںQ\R?O8i򔩗^vyC3R~Tq_ߕ}GFFy@JK}y9!w+鰧$'%ڬ s|\)hJF ԺAOsPFyW \Pt`Q2AG"X2~$JK*rs.G#LMjW#ا);N'VpZkA ֭hmm:ujW\mntjua*hu-$DIPkmy'Lr]5|Am8&l ٮYAp xV JAҍc lrt6f~kNˌ ki}zߚuYl(GR,yNXFSTJ.hjNRXR,^vQXڴչumm-ay,jaAl[\|nEMqNeRg2eZC ]-SB摍kqUJ)/<'h!V{(aJ\a-3E;(9iѲuQi5rL (pfp=(1JS4`gocx/N;{KJCcADQejk}0RoBCY񭫊gQăxTalGl7!`GPBR+9r Q\Mte>Ҳ0G,z 3Z+3MU K@l\h_(#vr{Lu8q1aD G Gcφp}/{\Iaj kEetnT{58{&q#Ky&b{iG#SHI!QtGiC!WT:S0fŽ* axr5t0s˝7c/̂l=M,gI}zNOs:jțk4Q8wu"yP? _>m}&'z?,G\<{ݽ[˳K˙mwdKp!`+Tg/㬾+^Qb/PљRDӟGyGt_;Oim(˯t4Ki^/ -mα|>OJ+BNR/?arkvU8/JTixv%E"ېtOϗbZv$;}m{+X.K{v} el;ȄkPj cv*61Uw&Ə"~ Jk\ cS1TR܊!c;"UdfHB,D01`{$@(!!xϪXuJGF]x6J\Ɂ"Ö"ME"Ccajat!ȐYd2ѡx6dJOT@ðaaX0,tZCPe #H)`(q*Iq1GaX'*ق Q+ym-Co)-w/f渮_mɥңJn R8*o۫ ߶p]a/cN{Y{K+ϥTNH\!KK_!zy%yzU@U*VUNY6jZV%jPဗ?̒IౠM4BDMƳzZ?ed[VɓfNBno$P?<9&Z$WSGP8HokԆ0y33ys27onlʸeu5'j?{1R[46}9*@pF Dk`Ԃ7JX oߐC0 AH AU~9?ңu,`6ۈ2ނ|߇b9+TBޗ?#0I։#rۈdRr=xp +e&M7dS{:&ByUcO %x f.TbwAd> *fC$ gBXqN-C$}C`0fHoބ7LY|.r p p lw[%4^T .y?.~jDpvN_N'd"|-,}#D cZjX <pNI,yQxD oT>ˇ*J`"Idyi ]Do+v+%>gWQ0x`2\-vË ax  Btnj/w7YСݐQ0r5lÕzކ4&ɤ@66r;l%xIme5>aI<,MRDF8xlfp.RP!x gP/8 2L&+d=B#t!.f2nBZD<Ԣ5 q7` 6:`?5g7#$CH-Kq5IN>$_Fz}~كEYԉ> b#η]NTU5R5K?#ȐȔMrBN~\~F~AQ m߾|ΩpJX6w9t؏>O0c_*slE ^J 2#j%l ȃ$H^9D'1$!hQtLgӹt1>6ҧKt{FX D-͚Utz'{>eP7Sp n\/(3QOsą^tB|9uIoJT*S5Z5Q*qt]?-hqϒ,:GȫtMCB5FrQz+sl%I}z0҇Q] S  ި~wډpen]߇XSw\ H==4.2ZVMAhmQHw\UA` sr"u-XN(d &:KVz u8ɗsX&2g[h+y KFO,hf # (#w+#a KJY5d+-bȻr5PYKG,,Wh.9} Ub]dx#?*Z EM$ԻKQSV3g$Hߐa%ق#g2=G/ԝ~8oW`[~f'Gk}{tGqɸO g1YM}^JHip#L8~ԹYBf"7cZ8.OZz;CnMqfhwXEva]xg[eĠ.>VgO;f')ѱ&HIl 1xI 7ks xab~/ݽZ>,B3M-]6>1:1'a괫W:V,MXf3dž&i}婄ǭiJa}9m##xf@֐ؾc;};>aǙDمe'Jp}}h~(#KTE-8>.Cذ6t4l׭-]:ib{_:2놦w/E#?zu~""Ww\5T@*\Ft{ AmkфIiZE*)ų0< &jLH|#C3M11G  Hb&9DJd7S#1$&̆t&enL3ԊTVxM{HzhT76Zf}޳xY` !ʊ%fUC~l323@&gr..-:3ǻ2WgE]BwEsC}]ߨcgL8ntԗQG ,jD\x'1 ]Ҁ^#&ڎؿW\*$.Z˸#}G?z \N.a:Β lr:B9EpRbO?} O[7ot#=dL7Ou7޸Ѵ~K 8IMIJw㨗I,eݞ7{J0Լݎ͟"ĘEdnF?2Ĺ3KcI>>ph~:ڕo'=256%:-OptHe__\Y~ߑ&%KȒ&/ <Ɲ9WiBRurwѓ-+օwiw'%Թ-~r 7]yьǗ9skNZ˧hڄ):\]ug:Cz? %ڍFM{4Za&eM,*0AjJtAOuQIi5zYQujV7tt1Fnr?DOfjhL-Rh`3ȦvF ;uƈbevkifj_MI`tt=]@'3u&*-»0Z(EzW^%e<$ mk16t ^K_7ˆ}"w/$d{ȝس7],-D6>]\te)=L@tUc8YjgITK%RatNN1I[q$ u-F$:m ,- -ٙnKt0C@HXz2tBr,zhKtP W)$G?3PqQo$?׊RTVƋs\M^/qbȪ Lly5_E?1m{/]b"Ъ$K꒽s 3Is*r2C:ͧ;G*DŽ"f+8[q{k-KK[v6,LYA.q.=Ҟbv.UwžubKf5Bc,޾Ւ$8)Lr8"Ĥ a 5kWABHR=fy]xV''/?h~B'Bi@uqPRLq $=wբ]BO/iK0|Gb`wou8hNݮ}M5S9ħ&o?Gnj!ʼ)5X$[Y@fU%'AI>~4Ԅn ;;)w>Ghp#ւ a[zhphY^良&k16:16å["׮="듛ӻ̏[w>|f^eK(tHXЕڵ!ե[} Qd8j`›#?:fmu^ptRNŢAR2тᨦZ|ȉ[±*ˠkkf?{֟n߹7I6ܼ|\/}ܳ[%7d/eř-_lX~G Gsڧͩ^;$4m9%.4Q'xICqI;<+}wOx=${cg|LdgaʦQ!p8 o:a* ¾%I`!Bu-mKy}:XJƙQ_PM%3xW/3GIn zxāa}7^%3'JNNNʿ fNjWa #fTܠ# H&?j^aG3iKBCDE.\&A/$'!7Oj'AtOnD 1I^A: ճcg'U W20<;LPW+JXWKdChkW!)T㹷/3j5zjU俒d$ARD"&HJNtzJI;A"ϢxS!H~]z 캠y V)(-5!Ґ }}}I!`Ĥasϣ}ep|dn9 ݈P"EyH(pkxjcBgCf "R\+gɋvyAd%?_r-_̉T}YVb)U# #LY4CԉEEd^0vʌF^ s-RM&HAXr:sSC:SV\=&-#RPevS!tGe:J!jLL)uRg>MܣRLqe6d = yhkrp`c :ܬ" Zv#)3(U4 H6s 1|Oދ&KW5p,C"=A%6며&) >{j~E<}}ڳRc{.{wu7x<򄛛vM⎻?|,7=jSjM][-%[yhN BH9k: ĝ<8JzUA1 +.¬Q'9 k!WмϘs̲ѸЁ?AcܣP=E^uS)L sk( w)((*m/]6Ph0m 'Snsb+~2l+$9Y hm']Ŕ;s]\K5ƒr#hh^u=%{>%7=^﹚cT7?\cZ_:;o%Ub΢W-ڑ~3 0mAВ76Ȋx{GaZIi0^"1&26ݙ&W"~A Y4T'C>,^ml%jN5Bxfm/ljE3uF̼;AV;2L3}#X?PwFz*(TQC!8O1I9JfK,b}@:C-NmѩjB9#W8\ \)(i/&?vmieK u1f_sS|q֧_hsZȟT <:Ԍe%{˭#emWހȺєR> "sQY8)-9(OPyB1EG6qum]^8qAEDnJyoK|TcBj녓wQjo9N""_Ma@:2u!Mu~dUO`P[GY# K˒OCP_!KڇX55lP ([8%7οr`s` e%ƃk;6> pNh;xO1 .wH2"Jxh5>?Jo=;u\WD6눶ozٵ]o=pK Q5)r~VlƧ"A9ỻwx)H{ M嵜;=k'DI^@(8SiM5 (3kCu*knUނ6.+ڸm4i MABT;ZXy3JcUVm k*Lq^{|HfiiٲTJةB1oK;CbV5Y勐QJ ["fk|YO ]ECZ9O`gnm?C>C,X1HF#{^BLXPIc"Nęx(NLz_F8`dDLF17hƊMZ|Q{Ǝ ӂA%W"YL_OR PsTs N4V$]qy5WQm/ç& 0l Ѽ-y%J)fV$THw2q#58 Y"GǗ98 BpPD$D2*qZ GƘ)]_s Ԑ(U+81j$sf-[oa3}JDxћYCd j" ."~&|0`9UQs$@~H A.A♃{Gk&m/9!a[ -cHe#T-|QuO Y'n!XgjLmL}li<|_Aad{QF7]BbTrZ3Apar0h hشछ81t^2&ǃ9ذ\i]aLjnM>w )K?3)EEq1#sܨhuUײǠ`zBp^blo`X"b5<[9!Ahf-Y A&'1p}CcyU" ]tPmԛ U&^6oK[JP2j(詶6@p=ۯzhS'fԞd]s<Z.o'Je³$%,98oJ^%W] huJ5Z7q5e^f XX55LMmnn}{ ;[?;A 0Z`P%PX5[CC F>x /9S`UYнhSO\+8&?}+߾n>祫Vh[fKkur1v~OV}ZwLJNtoܴpxG 7k.:֜&''G;j^Hq|%أ?h ~S Ir9YE2fBTVhs/r@ &!Db=<Ǥ7CرyЈ-SsPQy0q窜h5rEN{[*~ɍ9M.oߢ=:Pz>PF֯Uf7*R5V#dACc lX]FNp[ܢZkD!}I,o|{=hB{_׬ !S^01aBZbVҚ 7P,v^!~CuJ#`] Ep~},q*UKlKK5ֵۙNv&|̚R{m3&yܲöyyc~~̳#+s({&peYfXhoܓkQlPMvg$9IPICD-ziwxڈ\|TwP:)R%Qɱ|Vj:$RF^dL}kŭ]$X]Gah Tk[%w&K }_2}x@*=j+Zn~T*YE܁f5\@ a}6^|gX]&!&E2{ݢg]ݼhyL._&nz [1e7Arfeۦ[[ _OC]Lan+=kF^Gn$B%zF`&ݎĀZiTcBٹBiɇBzıFA)jJÉ+# 2-ٴ9q@WLQ)= Xk]YE RUjm>24R+n7mkRoBdRpkkEC7 iJ$X>SNX;”MB[¯&2AR"Sc7>ߏ^Rg<ŭbAK4º>L3lh*F@=꾐_:h\OӁd Lքd9<>A@a^;㈄ul$yFȪ(ZZX˪4dX' )A͹lkcFU6ה%arU=tn()V-'4u_?KzU=# !)S2k=Fȁ$BTy&𑢲V- `9K Q2ɣ^rl /MVqb{9WW?7ig+ᓏg I7>:}Y{VI>ֽaL#o%ӡ2;19[ dV'ΗӱqA"*[rbA|nWIպd,ni!#4F#z ewaRPυ*)$x4m$$@bs'stlA1``2ہ@LȺ(מ=׼(24}nGL*yP9k^ӉfG%8檋 :jGyP\s·>z&G4$'-Xlrm)uFu['n[Te{Sxy墇}zhoB~VuXqɀ4L2t-[M}3`W "=.P^ t"\Cl.m@X'BVRňɠӪ?&J4ޘ(kmN^m֠ IwԀ=ժZDOuw_ҿO{*=oː”اu RZcgȼ]dec$11P6?SffRuK|[!}>Xu>(mY|Sԟ&Y'}u̥?ho~Gknٽ1?2wTKZP ovkwXpk|L,ɯOV3 &kV&1{YGu$7]of}sjz۷M„2 =1u]L~]z ^{U)P_ xhMl9VLm-k0OrH%\h}$d(\3P,mxlf9$Ȯ~Όaj@Yd޼لT:OQÀc8p( 6€O#ZrW<O̹fSs{% zb-b\|['vҪ"h~jq:p@G"i7jNho~meiU9=p륓&/;K(껫骾>bnf``A0}$"%bE$ & 'y6O6$f4&q>I6{ߪ4;*^{?p;r7 B`r&^j&& x 4Rq%zq$ִT{{pU=Z?_ٱ# *az$֍&sT,(C^HQI8!v<ӗ=) ʽ@޺瞻?{)26'n $& ~NHg+WLnwlU x,b*h̢1 BSf'w'R8|}[YS 3SYҶv- {ـ];rL_7~k r bԒ )g鶱cF%ZR*,rւ %_|Ëcǻcx{CiFmKzK2NVLjN_T]VqB^#2Q #<8F.UgЛzDO.L%ҘKB,!R".yJ7!L* A΅,@l]HN3f<@u)0 ? %HEQlEKP7;*%PP 1M7&1B KcldlBA$]?ܖ3y{L6b5wcc=YۑTF;n2ѿ%{f&>溆,_;HpU?tr+J1Hu``E Xj㗠fȃ%5ehh*۪ڹ=Wy|ڏBDє A6V gbb(b'%!cQUQ #'դ 3ʼnObB۞Oap䄫c8+,bChL$FӬjPM 4;D9|@(,חroEPMWY%i^mj+ҐzHlfz5Ș%h&݅ʥ9Q3K5Pv'2.$+կR&*6BoΥ|QpvPP2%3NIT]6Ǜs9)UJUeSc蟥ݚ[DgcD< r(odfԲҭiáXL|k.dj  d5zmRL=RiZY`dI6u"P(QBA=VEBƞsN5p5딷fH@^} BG9ޘL$ȀDjT\%e)eC…Df>F3Ӌ!k6USZs_ ˂_lA'TE^oAGf'lC1 $K6Rd ='H ,}o4ԞGN)\ōZhٲ皯$tp|CiB1`((/ z`P_*n`3Z9q( g5ߧcs˰eؿ%JxՐJj2 :MB&5MY28f5v|W>fg pC ySa N Y.qB*FPYīF^u(@`)F\gkW5ݧEoFu LO]tru=Kqq.9lU*whP-0KmCEQ UXѹng8stIL:>4ޛgk[Y)tDY#x ZSVӬ0i/Vo1nlUXO|5ē';4^h>Q3PsH)b#c 6kǮveN{re}u/5j£{?<6٬?gݻhK"Bԋ'!h0vo B$e|z4LZg1~zxKncm|԰H*jWER)함#$Kޑ;@>M͎BPgߑ4ܜ9{9L#M(! TزS3( ɧS?`s{=VN||E?XEutz#<_PVW""sOx*^K7C6%XcxSiŬ5%͞.Aw3yA0&Q#H<hYUo 2vTOwFBH!qor$斐'k#YRJ!D^e&kg&09\44T(DgyVd~MX*TZ%îkZM&{-tvPQ)ۼ345ewTfonMmIQVIo#'1v|g<<.,J#sb!:є׃/+bXT@uTClw'zl}( rb bX" a (%J*up|NO]V]bnmjB\&rEPd^mV)Z*tQ2a.p?c|©GrRC5;$XZiݞh*LcoE^#Eb ȑV{.NDL|l7O[hV]+sK]ׯ^C݋ݑls[h\k?/.]w lp}͙ŝAa(-!|m nKrbbr8"Ev=b dYu~ %A8Ł+y'2M,˹LXeQIR38 Qt-Y8 77ܠc,{{ɠTb#] =wϛ$<fvZF1uB|lec841%IJF6aiNgru;WbN(˵Ooů7)zoOb4Z*Ϊ2JiP=A|'FӾ<Zz5 sXzCV5y*|;P༶!;YNsVd$rgXZqͩ3\i ]oJfTxDP\ 1f,b8ިD'2XmJ9p.Cd7Qvrvf} ZיtU>oyƭo]^ +?ݖp$7/s d1)s uoI?%36ZB5qmp'$&vG*I'M"!@fTAZlP!,lf^E9О##6X|1{^,fYxBHJgA^ť,H' P nLgkJl+,4D#pRyGR 2A7->%#5h3!厇WIufrCo6- N#nl%ܐKuUYY^2by|Yy7/V$dzzW /w_'E!'MU\^ S 67$^% 9ʎ^hvB -i%Iy3T!ah5h^?#6 :>^✕n}cj+MV:[~Mƒ+ijX|!hÇ۹#PrI;NҿRIKLCx!<Ө0mCyL v}ظ'hq "|OqAF52z&F5y7L-NWw=l.da.ݕ$~QpFш÷;ylcpYaԚ H*vi؜`*f&n<x52dI̴ą |M11"|?䓴#k'|"~?al6 GkK6&bwUE OIԡZZG ?+ owֈd#5q2s9x>]w 9H(H ~63 4h MY M? K`.*EEX&E/hw16ҁ8TYY^Ң,qos_[}c3idcuffy;?wa!9QaTMx1@}(xb-'Z(u]TQ=u#UZ.7nA 04\Ģsy\R*12w*IVuM<wS]g@7 M*_V\ix DcIۺkHC?Gղa)q@Cru*5bM"j^A 1!8HhYh@~_tV)'p6lJϕ~kS$sxQF(< f-Š8]6&iJIfOܝ\A).֦كo/ax8dMmy܋(RO@Z)lv[b{?c5XK#Iޱc2cV)ⴧz Z=t0rWJ*#rZh>gHHsY*CVg>C#}ƇG'5-5U%uP#! .y[Dn` D%;/2l=w5ҔJ-hu{_z8&&(2]w}Yn+zk*1 {%X iB.UwĹ' 08AS_]ʪNxrD|ĕN!eWRRD܈_OV@8Z\<:jh!!?fF(ZӴhzQ-ZtK md t,S%x3ډMƌ.3jF/<oKsɷbfjFGO$lgMRY -3Eai ǯ\<'% (9&FGaD_jdF)փzL}`=t 2sJmhRw!N|.tEoK%} ֮p &x o>8[0cǤ[1D7* og :X#QITf}lx^6HFOH"܀ϔW/>=OxkVnvt4::Vq79NrƷb\ \*RLlFTڃV/s$u\;%RB*닝IF[|),O({t$W䣮HpIŧS;bv[ڵcK=5d~HZ-[tu.kGpJ+C M*jbtІXKvcK^mvb7`a?7n>lٚ7\++=jy'/V^oBtd&:]{ߺ/ޱ`e(^i_o۪UJmzMX>D"A}>M$đWn<\64Fcce痏~=l6(9ʤ^HßT*]wd6n?Bנ͏#1K³2ԯ 8Fn;t"7&YkT''~Mf:+zP^h"ޕH $ -/ok~bԱq&OqHKqdl䃈b+籤 6O53`3d鐉q~H;qI+JhVb6le)_ו\bo}m.[q]Du벶EH$ ,<-w}Wrzvȿr ݽCr q.|J||Eq(Dp NK)vm_dvVhC 42`΀f?{*ia3 V2x&3pDyٍٺJ;agpI*Ka[x)!>}-љdvzl6)3860=*+!%s8oA'K۸4P R* JDJ)q ɒ-j%KȫdIqHvb;%Jxb#OLws33='s&}ΜɤMx^"I~ aze}s2-}(MeAJ,9f^Y5DB|tI2JAǩxZC\Ww9|PXOBLA愹F?"J%^Wخs+r%o-0,8gsf8XߡjXٟW>fGԵ-z߲3gy Mhf[AXPX6=O#C[eR%ؚ@(Vvd}<  ьGȑMwpEȫQc&ۆǪ))^WGˆ N;('p$PEK{T7' v:6R}0*N-yoW|P2"-ng5%+,1^}.K[dbK&\W5_XۛfMMbជ>2x-fhRuXӘ+Lگak 1S.$IU4EHDE(ZAʫJcX4#T!T~؈|FvyJU4z Cw}81Pw>p@-`BOs"'ֶGНS?w= qzZ Yie^j5ENK`6~=.тKa%g$(#a4prL#D/૶lhm~iiU#ZnxᅯN4(Fy(x ӡ[bd@O6VMM'=xN:(hzĸmVmj.#vv3I ױdu[]5rIbT)*P3*m׳mcֲU!ˣ\&m'~YӅK$o$a6 'Nw5;5͚Sz@5QȄk>8;C0`o|_|Y pZ aFķQx1>1A"aP]vg7fwglWĤ% aq]MA0hEnS)4EAzJ{xqMsNH)EO~ Yޱ2Α \\ړ @H݁ HH}#& 2 ׇ/ L/-ϖћpζtN8 غ.mר/|~\re < lb 2c0#óɗ$ܝ=چ?ȷȦVMўlA6^*L%,cc+O{M.?;2zelƬ>6!߱ecIẇ71NЖN,• ^x YjkЛjUu l7Ix|DHDS7= )xPu BzN^\AAq -z,R B(*PA啱cct`FyDIJ%OUVZ0#`,}8PAb0Co??~7lv驱1גcpS;F0?䦟X;>tRu=jƫqfCrȦ"N-/n3+cέ^J$IϮjD{Od9O3Ro%$!p~l8#7wEai |Cvqs7Gn O~.^"7z[XRopA ݿ~|/'|SA#.U>xy|&zX;l {ԩ   $s@ ƒ.%zll4>91<5)Q˗Gxb۶#GF|8  O.>"y;q w1^Q(y5QzYqƍ/{̯+FUg Bll5fI7S Xjjh~WY{#]EV7`\@ebDh^1ŋ~umI[7pδQYz++!(zo-j[xӬNmvi~A"ߞ;Y~_)S~%[/qFThۇ̯ɲjѡ`[@bWR(DjJv~kdN3fۨ\,7[Zsߕ}v]ήƈBKc(cڶi7q1Ɲt;B!mReb#Fˤ ZZJ&Q$scw6(9. Og5Oܓp£';o\o3]:spW.V(nVncYgុ=8pfٙe\3 33<OCn3Ʀf.]:vgn߽l@_[ g%=vn|Ŋ6.S Īq}3%0o.knXcąg_U_-ܴ.K.H[2GI-_\476]“ӔImh}doerR\Z5+惌MU5/vm}kL̙HPI1ג) 6_qMKZ{ pSۏNqWo`&Vv !鞯 GZ}ơ cT(`ccU;60֕2:W{n4Z߽Ïu^.dejJ*UػvP-_R{}6_ 4冀᧞%MIaY'=ܯt޴Ǫ05bi]{f}@o[qt}FIsg[jF}ݻ[D2տ=GؓfZ>ƚ7ɯå}pviձ#G]ʮۮ܏ [>꫗Yeeb`vuj|K_{ΞSz{]; ;{O݋=MC˗wv;]/.mɫW|~vty=720<*/8%TSسnq[hw؟|}@AK _V;K%rf{WίM]Yգ(v1mVS-+11T6cFKk'GݹYcukd&Iӵv7zkCN;aK NE"wː Ye-҆&fOZr-Vm2R%;KK? q:R]_vwt+u=l:NdjY40$ zs̲uNgguɝUG7:tr¨Q4%= _iǰ-ÂG'<{]ńؑg/S9N6Ckr^bTHh&5mfkwj)c 3K&#O0U}] !OxfEEH(КmV/g,,g/%RJ. ƃ<.8.+ b Kzv\%帩ד7&;X龍$9.ZHb`:|Lٙi2y!Ƣ A"~`1!)=eU089}e+1"8D|v;aD(+c~`jBkVS=:|%/Y-KK,5`ӨJ~)KH nƹ˗81py*95!;q s&ȔSB#K8??NbBWui^L6sMo2nQFl=a\_]{~þƜRir;'Bd{/'!‰%J$>n8lV|:u/Jv/zy(VEsi_~`,Vcb)g Ш- 9۴=y3ztAwU zs@&LF,h!!C4NGQDžIZB-gÑmz8!ʛn CV?cF]=1佅{/IRꊿ>_{*n$T&[բ4(!դe;7ړ m"eG5B>W&3nGSGsp2 \8<K7blLx&0ò_ #޾>LPe,@7#k+ Dc}! R_.IHflj>,;6'6?G󮼄-\v~ bL|ٌFʋ,"벛=J/ KtfEa)@jk;tR)wWRVZi)E^UUYlsGavל7as+Vb VP lvIdDP2X# 20@@"S!A!<}ka>|, _ƷR8hu|JtspGux[Ukr} GTeF˥R2/>Jf(Yi& d"\@2̟T: 4em6W lτaK*0 l*WN`M:ZmssgxE|.ƶ:M!{\Y[_ :a~nݭC:V3' (e3l6VTl6dGGZZJ- %X]邭oY XZYܦވUyY*q}'N6Ņi2U8t;kL *7nA|i[E0I@]6zYv.p I;:`mY-XBhTZS42Y &b ?'k&7ͦy>uw2r<3Dc` O(DAָ}nNg"q),R5w!SI @[zi"3D!du„-HLJR&2{GXU~Ic$s1'a,T)SZN눺4/~Mt^"k'qꇔ=s1XCK,8_G n jb#vgs½'~W87yCT`EiyB W7N< ` l}>j hs{ nw xx@whgY5Yrԫq:/ .ԹG\) 89רހhC|UHXNi-7O)¾r.:=×hg:*>#v,׎ɰXW`& *ͦXV?ɯ|_m,qgƺc? O`L{0+ V\P$%j f:r!g/x8t_svN lnaTI~nu_~f|lWqS"u|r"R>wL`nڱƇG6xКw:/j%\\kj>/}puzP1 }8 ^%X{,8΍/ڟf mpw#L8qj2 ggy-shDB3ԭ9m0-%͂;Cj/ʠcT^3Ѯ\<ɿohG챂M)Vpjo&oSnO孁Ehm`p[gݯ(utW /n7ŵ̮] _ŐR>%+ xlZʄ`gK|>`o:Yεj\P5BEPiU|ԩ,x}n"Y5`&j u1B'OTѽǟZq^xGLNgR6OE;~33xDNrdp Rrғy_!RLʄ^*q# uzuIT B2_}k"hў"q at (XJ`s[ xEŋeu\V̒RudzqV+X:Z(jw!B19m<BTyAHxiA"0j&&=zQZo[TiZD"FA;M 9 <ɻ \+ IMj lA-@M^ӭq!ړg'Vs|RQ!g._;_jrį0\ 0LO.p8چʰ =(P(UrXO 5ŽI0o22sA1HcRkp拗o#ŧPamn;<<+TҘ):4yZml!|CBZaIeKFYp4OX=l\9?MT'oHgYMVߛv6\E5N̵܋PT|c=ތ33֘Z/zIFXK/3|.tWVvVXVRrU9ݱVWWeekífP +(>NTIgK,bYn@hJa9&Ʀ4LQ΁n n,Ǘ(T=jP0 A[.'X,=aH䵀b&E7ݶ7rj+LwYǾH%3;:ci^\-.ޛ,x-0{ƭ l[<zmO?vϕCnpi] RBY2,Xy+*\fQƌMk6[N ENcÖ-+--lm. 5@D>%y1mWfPw`;H$%TՋ[,YE.jnHr,)1S&vd/m(6"3VEv5gtolf('W`y'vY挡ͯ導0YqhǓZM&jPڡhE  4(4j7ĢY~ .r?O3\ #'yNh?p%Lо4 R(&0L"Le+\$:> Ȉx,4X+o' gC es;d9yiJwRSREԧa d.7xAiƯxad仴.6z (X%`(Y^z1#*.8ǑZǭ~qWk}!lo/ =b7͔*j륄_ :3jhGYD70Iqlٵ F7,<*f.]K8EZDj6z\ |$"J<^}U.{5j:$v,o`aH1Zq& |䥔h>קޫ~S{Y#wU*g\&=Kg\M* qhxe-d2j9 ;x[RM5IQRqĬj ][m)/_&V$/^jņRRfTE$J-?b%n%Wz.\]={cq+b7b1ۯ+<x 6llx@sD-&Uu技 |<_wÆv٘:2.QkN!:[~&WCX;RH)#fe^RGfL-^X nes*K F+TO*).+YPB3*LVӭ:fe Bv1>RmtS~Y$lSYZQ8BK-HY♟QL/lok@ǣ5oɽ V<龌K8:rPt ;Z\(N+fݕ_G@MAnߛ|KǩIJL(NͥjIKP9R:M`qrj_q84($枛&o!鱶9x"QV;$-J֭R%9:p]B>z Qfp@f8`#n 20-'ǘ"*288Yse HAwѽYSf,JphdP2#6΋&рgB3D/bobX ZjnQD#7J:Pa?*tT"1g30dV%b l:^ߵ}-OOJ#3y-kly/~Hgf0e\7A4ĤmTښvFe&$L*_ڥGV\c.,FJGr|4>4!\%x<"q6fWE~0\ ҈/@$5|#K3Q)S\4Z5wS HJky2 $zTuseulPﭮQD 5_2X,b,WE)F|jGx"C *)d| d_(*9]nj*܏Su[2Nqq#gx)f3!- q&%tjfa]E% \nLCul+ɘcPdFf-WmÌO/~E?HXlNă dL\ ;gv] JA&c=\#|_ W=%;A i$ OFdf/֗+2bXeftg6Wߟ]jP%;Ҟ b"]Y`; UU5{"\Nʖp%&Z\pI#Jʠ|WHL2_&%.1 LbB d35F`VI֜Cj'b*sՐbMl8 kfіՉ8 ]m׆ حs7̑g]nj܆Isejޡ@#k m}ڼ7}dWS|pgUz{V9Nʔ$32 PTD.Dx8ra P0㑏ВۛG0u8a196_/:r{jUfB҄N0H{V; ۅT"HO)ni Xssg$|KMG "6t2TP:M l9~tLeoۮ=';I6ۧ#t`Jout _É?|rFN"lޛ. XvY+o4Pa؁0sQ䫙 QuޅYa.Z [-CSRxSݗ Cjcgsim4VxfWժn3GVTԶχH]4umC3,["pOm[D ,+-AX=yC>y+hp9 ; }ѩ(B}\u&8cL`1%L GAh3DA%Vol5?fCѓ0Wbҡ>CZa 3L&ڋy1MəfZEI{V+|TJGi4UTicw h,>Mر<;?8|˺k?d`B! #o:?v̊߫HL0Y(< \/Ɵ*ri5 X*N&hH RMnMm*dN^s2؝ Td23GTV8cNЇ&ǹh1 d2)Qu}|F3/ZXkqp }[io9Ӝ  ]X\')H\睺46VG8y@bNHXP@׸RnJVOac,xf-Ӫw}divq9@>+o"X>$v?R¯ΦV3GԌ]>W0H UX>s Aof+ķµ\=Oea> ^fDa6o &XM'*UD+? P݀t*ùz6  ojC\2(  W1CJy:GFw.2KPo'FVJ9L,nV þmj6]gl2E 9d [xlk=PVlS$gA<Hۅ:Nkq.3ؤe- Jw<:?# 8KSg᜽vW3Ma\OxEx?>ӕg]JE!ViyrB Bz N"G9rn-87iE -p'a8~llbtݺ^c|Bc^t_u R*˰8|2KUŽ9b.K}rnn]4KS1{䍗 BSV-a6Rv~ﳯ]77Z !C{le"f6cl+OnH`_9^Hv,|eW侳o /7 FQ2z}CSfW5rWiMC[_Y&:jV?ݳ;z*­[HmT{L%ef5P%?YUDYgI?s9$ I(Vg#ɔ$s)CV&Kǰe Rw(oZ4n̰L.52zsiw5vJt>"zmW<)S1d02m*ٲwt+`I $nfpe DMu  3{.a.~*^ \;IrN>DIprK&ɖ$;C D-%ޠb2֢Ɍ^y[vj:ݝXgoKKo.bd&J 2E/CdQ2͓f^Lx I#Q8 HiPJ;/]s*ђT`9!f,HA%M[戒.R(7X>þYOVM; :eKX[4<>ⱇfV1|]e}#XH e&+t$**?)[nefu83-4>>Wx Y7Lo-F&3NwɩCgK̗䤾Q*<Ͳ. }D2Wa f6vvЁu_MM z^! ccdNxF{GKKw"u|7("fJPK^ WR%u2LdKY:/M7XKBoZNylundoWuҷ毞*Ofz5qꮧ'g4 c=;[_HW5Ub_k<1gQ ^U_ ܦc.Pt5Jꠇ1؟몴{ñ>K~ ! ;bǯl 6#::ޡ !{&g2@'x뚻goʳm߁Dx7Gj ܅o֦\ lܟ4"&f"[b5'[N~[S|R{oC}oWl8eՕJ"Ls~[oI6 qj-l遽Ri{ =t =3M0Oda6 ,IJ Ytfo Hx`=F0A0`& &6h3 _ȿGwOQ[>c<A N{as^t ^Hz!^NR" bl6ߒ7JezpMMu3=ZR*Pp{PK֨CN[`mN whE%}J)ά&s @.I&ϭ?1TG_.geڃ 2&u0vkk|mHF8LL4{]jYu4]`bz˞CںceL\ vJ|*!2g֧+5j`vz!ҁ<;r+z8!di z/{ TS:jS^;Tm"Qy;ǯ)c*ePHeC!D%9KίI&e$'ep.ƻ)U1wY2xֺ\hs|6G@c\OPh 2$lf>zY:UoUJjm y)gRKz b?wL̦$e7+ ;7i/!d0<9 GX' ?7C99uep" ԉihAmx8\ŠwP+ohjhl2Ndfv8'F6.gp8]#p8`i4n4psi?ct+X\ose )թlɚUE)&İpfkD8LsitfHkjK?=_2>QiH=:ctYPD"W\Kzwߓ_4E7>WtdN]mpF[KYRCg\_?Gl~~ ;..#cM\=Xo)e V9KCɔ?^bHz5saXZ*$*+ѱvv>t׸Q-vnT&Qln7{|3[ȼnRd@ IHHbD*]Z:޵VQ[u{Խںsν j}=@߿=ۚ3p:rЮ߻3MF;ie<0lg;~0=0$8Cz }){/AQ]z J;zv}|e`8%tuv]lRu1}JeϠ OgQ}_?"ZI쀦kg,m,-hsSL“Ehg/ Gݧj{W]'1:̽K_b77p&;:C0\.CmVcczz:ӂbh11}JXq -==gO>>AfFi}2}9 kngW'@?p{kXFIXq Dǜ:?x=B?f߳!?dak@@0G/{'=gh_} N׃hf_=0@8XioSUN b蜘߳408:H7Wurw\Z?t"-v^]=#h݊s'F9[b_f=_z|F|K.|Wd7':8b8m?#rlῙۺxؼ)<ͅ5ѳ0bkbfSkmFI[an!tWъ=hkC_@ O1lFq54E##MHkVqi\O ZD 0rljIn&藗떗;PַoA6FilK #937ۗJypBm-? x5Wx{Gr?>Z߂159ƏZ{}Cߧ\Q{9pQ޶^6^ƽ{$c880V{w9vu1B1  ݲHϥc aZ1?eiaU'yַmlƃ;o0;s:;/qY GJ=n{{sA7WwhnQkGteHxȽ)+""YNcQC٬"žcc 7Gl[qy<2x9:Gst9:Gi$utDva6V':' 94QOVf}[OJVJlJϔA8e@ih,˔lxffޒ32R%7}Rs#sTyX޵O  Š fTXV|$dCiTiU鋲e5.R@ٿ˾/PvmGFW x89h\ѐΕmDͷơ4st9:ǻ 1na;?Z0 C31{~ f`%Xely`K`+l5F0zR 6B@L1?LÜܮP0t`GL=-0{w>[bl%Xc(p`+&@d^>')} b /"ǗM&B('!O`B0I?I0i&O¤I? 'a$LڟIBB#Q01rXtΑ/)g֭Y, fba,{;C,1XuJ̆C|&h</ ҉`@u?*~'}Gt(Ge!;3!-# כܣ`Hf6L/{3|{3|{31.F`,@bIzPi @ApqW@Rf5`2L:A;(? d:tԔ8RJpVh7ZRdr8X7dQ}*dd_0X --C8%G:1yUx\P:`1˧t:dI^$% jQ=f[#WRmm8V388iMRn[6lE?J1Z"઀=PP:E`UZd Hz) -O?ԹȡAV!z仾Ⱦ8FdORɧFlq}9l9L4Y. ҁ+% :GJ$їvQJIie`.$_O{ ((k:Ye1^"U2\q1uRԶY`M-{=i`GbjBGuQ2ŏXIO5%cO&ȬWSV$ 돆BPڡl#@LX*FɊPUz&a`Q5dzF\LsYEzHvXRJ$T&_҇єu(K&y6ݪҼӴVK4 ;~4vx&,#7@^!V RޡzLV~Tq FskeZcd62)mwP }UIqϕG&uIw4-㡣Xn)D+|**GJ,fP!"O>Q#ik>E5. r~>2ăΣ R FUvW |':nҰT|(Y hGMrfQ!AʐfHfp<⟆t&G:d.<$̦t%}J#GP>Z! iZ ~68*FDx͠4kՊTZ y'd;!z%eQkkRt/z@+@3h&FGY/H\KQ$VXd,$yIB5_Ixl8ejKpqqSFPk5jDPxR 5z.ڡrwpȑWj xF=I^+ ).Ukp1x|gBRSHTRQרzr(tҜNZ+* DS0uzTު WZ\qB*WɸN.urL.Õ*.Z*xzBcuru%ZL^'?q1= ^ay V /kus< 6@F(;Ol⁌4(TxAUEzJ)ohv,D!EL!h Zg}xCe\ƥZD/g2N%**Q)@%:\#)z@hU=85U #hղzh{YpB7(5f5 TY/g^R6apһf_IKVk݀/Z&Za E/*WATKdm'!Mk^Y&jBR֢ T:t ST0Jej^)Y*SVk*vVZ[ gJp^:($q.w') 8|hF'4+"MrB0#eKU蛢 "OktDb+/H/4 WQ̴t8 XږJt5 U^8pJ(թU2Wl][=8ճ8|%K4xaFՁӃH$9q 4lJHfOv N(LT |)E" @s,0愁u[Ff&>Yܿ0ѧ2r۾)}r_J5{ԠoZ0Xa0b-Vr Usف*6aDer\FOcG8 #,fSBGgV]?$l9nt%64?ȺoH1FXJ},~#5Ԑ{gYnْ%ۥ_=|F>/h>;(Ĝ+&%/'ncklVW,'&}vп0 ?{i5z>O~^7[n_y/{UՏ$Gs,u 8dϛach*l.&:L9u{.UlХ |dw! 8vSh4rcj]T2*r7>#n"x؅ ,"]%pfɍ!7R@V%QQܘ(YBJVITZ)Ú>=ROP1_%"PUbU@[_PpW N`aӰyj>w^ 9 :zpkqd8*x9ջT7g C+Ǟ[0eg[яʓǮ1H $)#R󦉃mmސCx*=1dbśagL pe؁.brVn̪1;i{ǙKKEG͟x_[ %/ۓ]K;(Ɔ[i8Ybv:V&[߉+;UN:~Ĥ>rn_V3M4Vhľ>#~Lf_PѮ\xCYw^ҸyTW|[sˑݬ5~^Tl~Qٲ,$_f4Us?!xtaoZߥeԻ& 2fWty_C{'3N˻>K{dU^KG6S~FσwlS _2nar}<ފ whC%\,@O[GM,*>O`+P52G,D#ѵ͢)XAFe{kՠvUT)Oר }#D<Kpq1y[oc:6ތ%9X*O]=e9ϲƭrv1,wxkBB3uw]K6 K4]t!yK%_>[v,0W7YE8*ofÓK;x؉7pZ; `Ędm33qaPjIk/#.ي|tOsz}WʞXD!D6khNOM#,!BYCH;P ;[;{e#ǹ7|(ҿu/FL}˲*?/.87C9"v_z3~[ɴ?|v"~v#N#uus<=UU5*o'-*X3[.QpƽkC )`H [nʫzIƀ݉]z}q`񌛑7w=9:}$^V,>3&TorohE}65yP6Rו{d?~>W?:\g.2z}~5MGۆ-N ޴bڭs~5ѵ>0{;m />ՓF~խUq8?L3Gܛ]Q{Wj8a4'ɿ*`̤s LwI h \".l=ДC@cAk}Ϩbw>,`IwD~k>Lbwn;_{ Xn:;'dFQuWn͚'/,melqu6 /UCop!].vk3،5{4`ǓdTa+NQR?|~引wWï;|^_\Wlbg͘9[FL1e7&z4QbHy=k󖍳F\z_23 .%Q%-nAy1a곊Dž{?=q ϰώ%O6juKa. M^ڻ; )w*j{P[x.νfkެ)y;y|bi_MU3wsW\5+UlCG6=[65=5`ߥ^L|^r-4gaJA̸6Mz's7jV?yIz];ovZg%LL{?[Lf`im6*Ι/7KV}949G67x99woy $颤rQhD!o߭}=1f gGMi2AK6c?뽓^>{OJ;|/W0;M^Æ=vr~'߄г"kj Ewk~aiQ[Ɨ(TϽ:ɗgE||O}UkC?qグy{= Qh{vmgIEPћ>?J\RڡoI\IK1vͫrkKGGV !\X9Wcބ ?=~cK^1riڕVMLl=|IJL?hhۦWK|Xsu^o00i4b̜vn`룑1`؆7hq DPF&{沏5|zŧ‹O2-B_q15 5 -ƥ!M4ōuVifJvz~@yckܤʡ'V^xIÌ+˾P5n͖kS]<'=Z}EAśɯz,.}nIέc97<7O o,r5t(,uu^.?y61i'*8b3lb f߀uıϳ!X $ɍ/dZa5gnj&ȭv U\ezy"&ϙh]&PZ!H:~`VWsmJfdvlx}6ԝG+uG kGE92Sgeh8O5;szx"Y7\9w'oo06y;po ڝX3᥋JT6$;` endstream endobj 1131 0 obj [ 0[ 778] 3[ 250] 6[ 500] 14[ 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333] 32[ 675 675] 36[ 611] 38[ 667 722 611 611 722 722 333] 47[ 556] 49[ 667] 51[ 611 722 611 500 556 722 611] 62[ 389] 64[ 389] 66[ 500] 68[ 500 500 444 500 444 278 500 500 278] 78[ 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] 95[ 275] 171[ 889] ] endobj 1132 0 obj [ 250] endobj 1133 0 obj <> stream x]n0E /E#@@H M%}4@-ck{ b Й{=s%Y vBr 8k^HŔ fVo64V\/H69ݙ-<]sBtw+k IQP5zm[3 l_qf[_עƞ#l&0Ѝ]_*HPvѾj0)<%3s) \ݓm{kIYOj/,1x4}IS 1^7C{rqw7G+$/Sy endstream endobj 1134 0 obj <> stream x| xd&$3,w&$Lv2dF&@ a_D.PQu1A֍ u.Ujk~E}' ~ms^vιqjTkAEn s9}A"/w6 zU6}'^P<6k#@~y+Ov\v @sfvÃ[WX_Ȅ89 {_(θb-' t]ȐNB:3^ep=0ʮ3a \Ë. ;"ђޮ@U ^S~T]T% !|{3mR*A/ {.W|fwMR|jȣV⧇b}Hel$=2PG\R9mY4(U0LpͤB6uX6?D ;rÿ5NA) "7H d nO? p)sK|#/n[ ^:&ҊKq4-1R_+8UhM:?FX paU W00۵ Ӹ't#>%S}ns7 /pga2,(^dO ϯ?V^0@v6CZu`x_700OHr[X#oal kJ/C= Tsa,eloDs:́+ar tO6?Jr noi~h7&T+E:LM0k~dV?~< qZ ֍RS]UYQ^VZ/.*,y=9nӑe֌Tٔb4$'uZMZTe|N[܎Ķ ]!:6D5]uJlK99o8qNUCu谅48lQ2qLoipR=$7Ku v`kiI1t՜WwTWƪkacQ/1!R+{)(5p1hWfƮc<_OwL .J,P/Mׇ4n`׳)i]¬]#ɋ6+NXom/F\Yo ov1.8Ξ&z(DK.D\f:EL<[8Q3푴>85zƵ9tG{WCFz.ߕ^J*+3/Ф.Z^'WhF+ۦp%mH,ȆNWxan8G_x?,sRLF bU4 xDPԣ"qCvi(бHo۰[{en1io`Zz0)}))Eʪ ;h%N +&C01o3VG˘mƞٶ_ †6Nj4ITF[bsd3 %!sx+v(R<b bڎ)IXlôk8jl,FKe$'xHa}FLH]@%P8TŞ/1Q {b׮⯢٧ff'D(}eWX?4gĴ;1Qc~\M|T+(J1&^kGʫ!w} ^6wky㍼/x OwWyڑЍG=#ܑ#GBн'CτP؇K&06d7Me Fw҃5 1.Nq<+`lnf,R>Jk@y)I _9:1/0},,B CL%xxLb1 JHH xٌ*9IDב4FMbNbNe5Z N$X9rC<Ԭvj:5&&)vjLd׊9yNkLL͟35gjej~YYOP|ۃ2͙2M^ZҔݺ$)ЀWGBV>J+#!HBi~@}XN#54a9y@gY#8Zz? SĞG/#L,FBwbl$t?@g"{#lovH,Ñ~3؁ "O0ѿr D>$?bP^#)8P*MRY!i M!{#Kq+\40B,E܈FqY`ӡJ*EBY.UR"/"|viHl8L")Rz e$ y߁,XE[O#A% />$o=}?@fS=u(ߪ#!8/~ECDuFQ@?bWW__)2" ( ~yiֶ7`p b=JH~ȹ_ą4+4n'VUm8r\<ŏ=62p?R#G(9h8+hBc(f"po/};8E堑f+AAƴ>1 !E"WV6Q+DJTʕ*Ai ǃ>hBΉ9'TŇxV%:8 օ˼-Q06\m +FOj%v-lӭ(Q A#hWgA0݀V1-JM]{FnInio'8R0]UkMTY@,Kⵆnim ?amnMnG7u zhoGtCXO V(n7٦"4^b(0<E6OPq4T /"q$>m*z++%$(M<.M(2VU!JdMBުd\='GKɥqrG܁dfhƹuet[n+&!%%=RsS$xWPZW_M Zšq rQİYQӟ<&h)ohP^#tdʎs?6@#: 4m?bݽl@̺tH (v^^R, eK Ad݊i$2O @ LFge'gt). Tbװ;I-$D nXf2 pFWcW(>$qL `qբ*2ǩ!*k1Q >xޅ/`cd%2ɢ8 ľG&kwSU%kΜψZ a.%%7h`|BPv8SxNx |*VxY "n*DE>`l0Sp%>x"e49@J)qGa!;.°@HF܍ZP@* &_b"GJ0^9nYlp%v3lG98}r aa@wCy\njwHRpe+h•`"x~ oOxI-G)A(;,{WU]ῄ?ʝ(ІsFn͸2\K~J~N7wK5!',mA~00B:lgN]φQa/%x>?8$J6ق3LN:L O.,yX= {;#[)$ۡuƶ B0L 3u؂A= N%j;"U$g$UdW\$2,$kdG OɗTF4hBNzIf`˖Mi<{q7RPŲfY.Vclp4<]k͎ .~Aa/ʋ¯cW=)Ћ05ca ~WD=wOQ;q^7go!!J&hKv\.6;Gnn ;Ƚd Qr#8>H4WO\wn}-~AbzV=߰'/+72EvA^oUI3\p*F+WF!(4q>>aZ|Dn~sI9&Ɛ_.ʪh"'z Uކv]~@Z:\8!5 \8-RXJ($1:WT8W&{_,/c—&mC:m6b\M9O^$vs^6 xd 'f-TSFVe`Kd| E1|P.#苨˨>L^øKgk#)p+Imh" #_kX:l:Ҁw˟A|~Mߓ|݅1ʁB;kecr y #8|v^XK=*7>Mf3/," #0%[(DIslylؓggFxZ0Da"mx"m%x`@3>N`L`2 q]YpCMHMG C~"I|b NHJ۟T%vКXvR4L nG=ּtOnf1A?L3@ 95a A+4NJO +^'[ pɋCOϝWQ0IhPhVEA:^n#SS&q/ǝAiI_lFLيmzb'f^{nױN]L-Ƅ//9˞~yl9L,nEY|( `~1y]9nA[[Է Dc6" ?\dXQBȑZ5k U篾Z:W|XV{}h qb@TW{_Q^DY@O1{"8/q* (-q; =fEK.wS{7murڐ6'T%RVٮ3x2V:MlFG_Q+51wf:z5IMV}\fP\rxWFww*@SՊj O)5BtEӢalJiv͆tW,nӧ #@LIMI5q $5 &)8+Vﴡʔ6bfѠT(sxT&DɬP*yh0)4+M1AcbmJtJ(nQ9Q`0JÚ+|K̏cp/o,^ZMv47>cAGxL A Į ̬cmeͰ)fЛf9T%`S8M9}c*LE\Qg'\={WuZWg9U\\.Ɨw?gк q;K7Z7Unlk,@5BfD-:gkUQtZ}Z@Jxc _۟dHTwcq ոw'ACGܓE_jt_'?b8E߆l@c]8ec,o>iB7+ܭwߌ7ľN]~kk5Go.bYWmGDgS2lkZzrN-dSEy5%CʜCA>\| Rv 7D+wN?sE ݜ{Ck0RZ jw'bo%Ӑf `=*̬(QRLTkJȟFRvWV,zo3}KZL\ǼJ!Q^q+i+gŐ*:FyE:\f !\bF5(`$ku&n-L(ͯ tF۸kH;#Tr2R/N@ ո-ܪ%J89yU ZOw8 #ͮ>egwC՛=W>B7ll>^%{>C=uzG$TGVrr:/GoSb^b^W%:+s{PX+ʣ1h2U"VTQգurMKەP3$G鈠)-ԗU|F5c΅î5!F5oQ$AG9տ^v>,'PŠR`D}-F/!$~xcVY\Dh.N,E\Ų@2LR-WM˼nrS]OldvMtg6EEck m6װ{Ry`IOʸpYǚ+Eocb5ՔۃFUR8Qߥ3j>36ݶ۠+dgwtڮ8-٩9 *ז@m7"obܬk67WWܫ^ּ%ã Y=PWK(H])(,{e،]fQ =nw]g nSh9x68Sz)DEFn]?:d3r/׬]9*QC/Q";E7Kexx 5Ư۫=pzJP B:M)X|e ;A9Jtf{j9l=ʱi5g4>o!|NkVJnXVy8MT+*(s~2QȌ KZz JHV%%˒I%MyYJ<ާQzxb3Q> ]4a`  HsH s[ w/4,Ij~kfGm'tN{}}?'^P5jzZZ/]wG?upix1'A j5W鑒=䜦vA`^:G}JB7- F;E.ʻ]0B%kgfi% BAj40g!si $'Z vaw μ¬R ɼ#kz}8aC(+?jBsLWWypR:R9?W~T8W0!*UƷyM9b:YUƊO Q2SҢMgE:| A[H2ݮֆ_?Rn ;Sݾ݊ lSZtAJQ"~GB!T OP+m5==kׄ o7Hš/7Z']Pn]# Xs ul[+J0B[I ElO, TKig URs~af̔5q ]Av_=-?|ƆHc~oѩ=~zJjGϝ-3AF$wPK3j1-Tt^rLuזSc5 wdfѢ Ύ`l o:ԛ_Z9 ~pQSG:B陛":Y5XP?\X6o֓~9 ]JQ"khER`J7Ho`?F< Oi駔[PmK̫WTP#)1 Fo"0IY]&[QvD|C\ S0LUs<ںsW~]uhHP@C9`O B=_Scy 0⬁o=zAE9?o ygoc e38\| P3gXq?yRBBӇD͐LA }Yy2",0t *Rjsh.cֶ747OX9ɵzvB.V˭ӆ?uER\H{t{֡Iԃ*A+,cqwȴ2hU5f42VHe>\Xh0IRhZٳZ!3]2Xch8G>WkG0FXq>c~OUc(<7JJ*qo08o&䝂ZI0G>)1ϑ7=__ĥ,8Ov"s``ovME"F)qk5ܾ\ϻ8 1aa]~NO[B2d>?}J]rh휄t^pH@ֱ@x%xŋH E梺H""p?2]:?@u:kh[}umף_ 54>> G.Dm"gpJuj[_B L>m\>:Q}hGP!bMv|_7jXӆ_am57_rx*!YԷҗb:`4 Ho56)[CNR;)'a :z9Ojl2bW4Z򌙙E5PRo(uR(sFptEZ40pё*cprUט#.SjVL-u'?9&R 8>xj?eO8R_iY_$r񸴆tIѓָwKya"luV )rQhRDDd lNa5KErkPygrrb Fi`8z#8 z7ZĿѫ]J PNgm?+4vHȟe>!V7b+v~+&YB%Mn q%D^ʨ8bs30poi?>"&>'2 3bZ8[)IB" ҵHΠtZCE*U6RiP0sDd$9&'d"Ld5pL&|{|nN~ߤܾո&(Qh4TCHVө#/AA^nqT ?|n*gW6m@13YD\7YM>V#h!]F@kpųB:!xX=ZyZ_vJMAbZ#ӭkQ\ԍ2\ޅ+]Gb\!J*BEJ%BNPZPNH~Y@x J'bi-Y"u.e[6RB%R*U*8.1%Kb2.:Ȭ|F5:ZX 5垖v9 ;VMrn蔒H_7B$HZ&_$RF>27Pl!8Ƞ# xyQ2Zk9P n㩈ťƬvan K.A֊ե37!1aOCEsV;d뿔:.9Q,.*޾؛*cdW? aVG\J{I}Zdή}zf\C" _BW`3]1ɥP*XxCA sC$bj%a#t$Mv{T**R`'fo8ʪJTDpy|1 ~Ą(ZHi:RNFyJ6A!́NƃZG\3]CMmsy og}J8ON뇛Y[tSOhZcz]LZސ1Z?_:bp3=gZⶸ C Oi=uuPʲuN c5k QMf=JdċK,wr֙:ndP~!о33aNZ"oH!k;i n D?=419AG\`#.3ɐunž]^ D.~J򽗇 ]\J>W&N/җ/QG5o xc,B6HOYːBSzMPHܠvD7 xiҪT$^ 9ݢ7#++tPLF7'wlZOOn;n}{x_w&0;j']֯7^ԗh<>gZI% i]* DRT|phjms{Tw(%TwӍ|p!nrܪuXzu-O뛛fcZN/gTcHm-)5@6a:[zcLZ芃gs_wdBruLs\| MZ3IM&#-0jX&Zhk*+ ŪXIŬ[htXjfhݿtڥ2Fp\N&Q,]L/Bv)2H" D~} iK C3B$>5;.f#c &ȋD*ҴNOERJ]UVTɧ ~KVJk+k-#-+)u`S?C3_=t/UU,#?x|R5rߜcbPo]d{cI.JiyV֯qQh=rBld7~񑖥%t5!΢2ͦDk 俒߄MN?z<~Z}M|'(Gb'57-eɎ>aE_1٢RP8Vv6Kmp\t5l]6f " *j5jbD!sf3hpʲXɀ׃%nw?>Mq$}[ӁTGĽwV?UhFG#S^^>a=:U]lpݸqyD~q6>rz-kۈI5Ug;3&} ٛWx{;Z^+c  m|yBVB, EpۛG"+T,H&M&DeO-Rg씝SvN);e씝SvNK*ʿ);eEP= W+yTU\W%-U(/ow_t}ۋpbEN);e ~7N#5W7&lhQ@anM<-$ /yh<-"N!z%mkyZ_)IBOSji"Tiaji!!:*"40h%DO<QU_C1I@Z6eZ*tki >Ln֏4`e=i1<%4?Gss4?Gss4?Gss4?Gss4?G+Z뫘"V1-v O ^Y^7cZۿӨfQi 5}< |7bZ ;yZ@tO?4QL2׿i#Z70Ӱni3gN}H44noGg0ӰϠ>?xp#< ߏhq2e|E^cKD&b@MDDXqX-=P>SО=p'AdDڎkiI=P6 ib ZFKnq!̽ 0os@ uCDR-FR02ea#}wC ,twR |dt?  ,A)Vyr<,^ea~Qm^yܲ 1r,1{Bd%m=qX!=?Y~Gž,n_<aE n`(Lua$=,»D:18]i{ַG7Y `~s%$Fv} D c8Q_Z|ak?RcCQlz)^ kw @r\yq<̕QV1hV$Iܿ>EHi*v qg-`Na<9 %{xuϟƚ;yX,cs,XrǡWCf>.?ӒZJc~^G-rKl a 4jf=e|;9Gˀ+ӫŶ z_+8(}㥀+[ 4hcgTSІ:=yH/obXq7&CZ1T(qr*jM,+6XQ+bI<0F@>#zz#0;) 1%jX0Ԓ07s)icfFsp '0nG0py!|&;HFhCP6J` n6Ϳ N1 #{1>3mrIsPE= ?J%'dl[7{q%(q ,+t2ؾ>+9/iH?^nE- m^Z;p%F\ xi79 cb- lO.˧ RMdl2sd&+|U(ҳ;^@cRr6;cr˧h EZtd*rsǠuwnqX_A+M,fVl< <۝fRY_`Qv%Keʧեt- >'ء\zi%Ʈllz~>=fVv>2,#B*] LdWX%;ZBkB>5>cs oSuݹ<;XHڬg83ϡ-{'|, !0GC0ʽZf;x!M=3T~>T`-HiQveuy9 rK?ObW5;O i?;YY<9&NL͞- RH,Sr>7:WH`).Yb3se;[E3Ksy疲XOˉ;VOcs44WFU H :[[R[KqP6;9X >W ˠi&곘.oE,m &|3s@@fsXxlj[*i~QBa5L/22L* Zzm j6Q_B=.!'Md: j-P!`4:O2~v!F 3ƀHY0%J ;s.ІR++L |nn8H$Lpˎh> f89\),2uv_̀rk!|f]U`he,L=w5Z48sɚG[ 䌆Gobm1w-xDf_ͤ9x/Gsm1(|^+tYLVSlzͣWQ2 "0^ do}hT"c޾^֝N N `G212g#=#~oz,7>Ύ&ᱡ>h;8q#a҉Q-O57&K @5=848N9a;HN J$ٱ}ɱ>XO*}}#XؾI!Tb>3:?9k`>Y{[ J pbW5 $q7~wS} K=#ё$Ter4tjp&(Lx7͂fHͽ%`q4ۿBmGa?BY_ۍ.W>G^O\~G#cڱnL?eo(vK9|jҏO_K;/^p/qw^|Ioeˀ;/{[_y)R`_Kw|^wu^F#T'qnV,j}9vi(r #ϯBcaW/{\O9nI<4xƷ5;s?aKj5F*>o8}vG|< NAG$h=h5AK\ۮp(?ml1<3ȨKdIh3D"," 쉒d+TR(Ȓ,Q*g}~z\yssyι>~f7W!cH EΡmyH~r#>.|FLe@_{F4Ȼ~a른]mZヴ@~<-yq 9}$y5B$yxJ>.%mo6놮r#FS\+JEa8I%H׶!!(zRNP 5PYiѻE@ S<m"]@(Zڐ}4,PdƩo=yPCjs,C檋ٮ;.>~S4QrP"BR=~݌DC7p~% 2 /ĸg8e\01lX%iؾ@JxӉƲZ(@lOe}WJL:ZpXɗ;EQ'bę =Rc7qT4Ǜ}jם/Q_z!M^ntG `bWd.VHm(yu@,QLr+/L3GV%*ZsxKGԊ:xI{'i'_o?ORf6PfkI>QJ)A$#B~@ n6\KxEdU)G8J HwEO횖3_)(ߡi$CfdO؉e䫼ER޾--n)O͞x.O:Wj5ȩik(muI<+E9{U6y`(t`kNk33owHгAV%7*{duv hMI?vD: dH_"qV4u !ckBG'4/4] Tv|wWȠ;@ ]> Zr^-KXQQ?l;yg%=l^3Fc%f?EoSDz'䑺RWng{=,R4-Mr*^mERjXfxn| +K0{oE Ѧ#H$=Q4@%fgU:ZnGeDx_ 3E7/.Ir-p->u:jG4ԇ޻1oM8|:c>-E_9ε ^eNsm|JbsGaBUƧ}p'HS?(p#D-b֧ny*|\x,&XwM͛Y 0.i!Id( ,1NX@Q'%('%JaewahW#/q3&!\eUPK[ \AZ@3_:I Rvqcm !u!`o`PAܱ~gϿc;pSPpqHWVaʄs~9kL\ ]{[ϱKE1=k6s)Ů}WvNQ9=1g:9+UM38c.WckX]sv|]knsC=C[)bsJryĄz=OwQMz'GB:.v#\Vg%,1m'ou2t8V;k>/6{8zĈQD}lՈE'`kyOޤ`j`Vqd ;)I΍6DY,ahSXto'hMYsW>v'ycy -d:oK \]uӹ>Bĺ@>`eUq[@?<حpRDZP%띾 !#Bk:?V"X{iR"f;G> rAH_b]V_SII@߮mJ\6rsK Íõ׽L6gi &NQ6iiMC{ \)@$]n9 `I*pv^Z#z'B-cPb6¦/zz8.jAxw|( @EceRAI"迂|ʡTpO #oΙvf3}RD23OgMPO-:xNmN_Cd}Hx@V0>w~эS\S:h=/PG|.:\YE\ȵ8# SQd'~rYf_汕Z3oZy:\D\/gG/[̰;ceLyОЮo2+QC?s6᢭S3_LKK) mpG @vSmR3T69:NbF8j)9&*>4Kt 'aGh)K~ba~"J0 ]`E ũxKHuB0F:nĤبoX16*IO<.m\8|2E\oѐsҴ#~ sx"ϻIM9Ta:ū2BZI"}Oi85Ԍĝ6y oGP5 :C\BYLtO_2e-j]-%3xCˉ\4kB9ɑ;v(q{>PߗQ=y:x:6F#{MO`]]]a֞upPggo׭1)1YP/,#p`rh\nn߆h<9BJ Gp}QEW}`vU}Ȥ@kC.W<3LI&noz9Y񵴊jbFxT 2P#q.{nY7Pvw>Sř]h56ۃ_d.H[xv.~a%?_W'(C @k]D$__`;` w>WKN~roXs{N0ZGeGފl~yyEb ޓ@,퐠WOr̪-/HQ?ϰ_f4yTu[wLO5\<{in䒡e Ps٭;b,ނ%.;|6m<.^ȁMCQP]+S8Nx:S6mRxf+'ώD;z2|0pBo\1~R@6[fhSK@؛qFsms͜V1@qəiۼ+\G2<+FGE;P%`Qя3-II FM5Zz 5d>+!֒(CF/+N^0\̨Mzى[9ro'yv]s& 1[߮׀WDW<RadLdSOF@5"t=oAukQ:`04gLcpͩ=/4/bnqYoC٥{n9 N3"$78HK*<~Geٹqߕ Nv.-iRßq.U?e]2X;%4őIM0TDQ2>&q0L[KWhrfܿKU=ux<|de,MZЖA~Gl\d]9,:%yʄg<-mR]*"!U`>aeGV. JȪIp-ŷAE *(WKIZGT].ؙ:Ƶp9ʌz2ϒ-20{I-xe`'A=p.MoY{л/_OSA vJQzkiheş€ SCV^~xɮ)D]#(oyM އ;LQaƏD@@\A@tM\ !Fgӈhy?%j4] UoB9GY]58pv 0'Gw~cqBgCyf )1}&+ٻ߼vR4ۏ36gi`H45Ͼٌ @ŤRjrXiHOe%{>(4މk`'S?=au+)mpYۤI ䷨)W[]@R[ahqN~eAݬߓy8Vk$ MyɯldvtjVZ#©g/SĿ?^x ү; w pU߷;uZœ\1:sD&"u<-gfvv/oi`x:dm)cؕɹ`2Cڄ/K&$V_?:گ|&qXG$*KkuKx Kui 08<ռ夤0t 9.U3- &nI9k=iJnB)}$-ـ ͐]eA%LV~sxA'Ѡ0o4?sX {NeOAեHزXe9#TO*\JLJWF$5L{Xl8e@pڱ}l8BgMc8ά5k endstream endobj 1135 0 obj [ 0[ 778] 3[ 250] 14[ 570] 17[ 250] 38[ 667] 42[ 722] 54[ 556] 66[ 500] 70[ 444 500] 75[ 556 278] 81[ 556 500 500] 85[ 389 389] 88[ 556] ] endobj 1136 0 obj [ 250] endobj 1137 0 obj <> stream xeMn0vm RH,CTe4!H`}y3xaQJZ~^T`I*i`F9©UMl?EW tj,tj H銃5#yAn$VwQ9ZBʒ(s"q^kVw@B/[[;k@gfD/aеSY䮜dw(':66(bQ>H{gH;'{2ϣW3,Ł[s7 +m+H g/u>[_#aw{^{OqCbH[OS_OGJQ;E)Ohh}o.&8p]?)1.=>>6S`ZP^O]% endstream endobj 1138 0 obj <> stream x} |U~_6ɗMڦ%iӦ%iiI(K%,B,,BYDAG JѡO\@Eet_t7θ8w+ ?37zιs= m$tOMH;̾cDl++>Ϳu̻zCI5UټE-; \9_e4B[_!cA` g_W0g.Z25t#?puu(heV y-ܿŭW;0}n<Kg(qes;hs >uځU-ypq7$ px䣢Yg6k@ u>j& HpA2YN (>T.E)c s F"g۠HE28 uWY-=_|RN#|@0~B{ µy|v K!z/ ޿mdh`#*ɼ S^*QpKX P>R͇ʈg`]O@>u*܏ZnEo9TaڣzrCxԢ eqiG3 f$b?9rYٓD! QB(c?QBc^ }3 QB(D! QB(D! QB(D! 8~ m?Q?-?QB=[>ߣ7BRTAR]w *NIE0;:SS=\&I>|J#ag!^m@f̿ M`FYTE6۾XE_;(F! QB `J sx xH!xpzS*hfp-md(}Gshy79`*xtV+,eQ GO|ފEE ^JJ/~-/P5 WV`7@Q0(R|{+ƌW;&O4:q:{7@فT}w#U\9WV:z%Çx gg23i[rRՒg6IF>6FըU(jgM#j .1x1͕ ^*6Rih̚lv bdF76zl{{\g5/iYh-84]*MNN jGהgZllJ鉇II>Gܜ l8_{Aut!{"@Oا]B#Z98"ʖ.i/btt}8}_]^:PʔTCt |+qLR%_2D:;$2 cl[Gao `f"y̲4h $\%%8q&RB@c,q#Ws#ډ]-rY."~A6 U60HQS8)g\P晆؀?*eR 58+ H-c"QwV OZ Xm/s/ÂNեLV;PWWQ wr:$gŲ:[Ώh(w-Ps{#vJIn#MްGS) 2%'e {*Bq 2(=>NE*(J~vR9_F`vFʤHC.!ݳCBD;-`&R֠DⒽ@ #w) e5By,LBt\Pjw`˹g`n,3t"R0"-ClFd %ue8Dؔs8 ½9hM.ɹF&yz\+z&r}"s+&<ԕ`UuVEt@yD<DbNS*y݈aDAq5!纊5M&H(K) H#Y@FAQĭA'"4‚Պ,p9{W)x"Y`"[l䊊DH"+m$"@ =u^xl 㼾r)X"RX¾5wʹCyClgPgJ !%JއO,Ѥ;&FA)[_G~~ NB2rxWנW4JNlQT(~ƻ`7MQ{G6DyGv{u v-ŋ-b eݱm}p~9[C;;ZVq?[ y'V.e!fbG lUVFCY'XPv۳= };E[n{g gA[ek]vGԏ0:5akыqCI䱣ރnĭ*#GIdd{0>Zx~v& Rt_K*]&xX glJc?Iƚkp`v MO" 60 FqT+ %Zct+Q >{W0*9>q3sDu#X:qIJFFUePgT)YcP=KV{0a84p( JfsWZ!c/{qp\)1bn1m1Bĭ 2M#Ji "|li7"Ey[;!"BTAv>N1D*A9k}d !kFX#֘4o'C8F2EۡԲ|O[e֡pQgV(x{?3VuXbc'$$I[c'KA1I?;xѓGc'soL5d$ DhfK vp.-111,?SäG 9#TCS*^բPuUT*:O]S= 6D HHzRJi!WRNOòsJGH"Cd qs z?Rn]G"KA`R܈½>'K;)L@UI!-SR;|q%ՁtۅzJ|Ôվ  &9D%gKȂ&sVG_OV ݪл:MF_Sg?'rX|J+tϐ,C G2G4_rtM?ߜMe4S2S)>C֡աCCЏp:#zBQhѳz{>PblU(%Wdw=Ĵ i?Y/Gf%edf{I^X@z4(0잉L%NdgTdm}+"ȟ v!4Oln| ./Cg#]PJ2_#;dw6'dw#QmG6Crfdm'mq{Ab^p)|췡x:d%BudRAz+>ٝjۅlt$r6r6Ƙ 40s$)Tm ۪xMt*nU3*Nd7גd<6Ţ\dn9{4D}! e#m??^m?GK1鋱>a-5|6oC/VCA {:he٦Xxڅd%X{[xnWp'*@Cݫ\kTX`_Nwdϴ/ YݓؑyXgn<{{Hxu"mJƖ*1m5 ʸ=ҋU1JeuÞxNe!ճSxd3iAxY#i XNѨ4j]Ƈ}bJL%p*(irJ#0RcvrE`6O 4W5FR o';CDoܢ̵P;"6|w"a^cYw46eeYbTRSeVWy.BsY.5pw/OSkG]{"j]YcNUO夽F*jPJ9C5:JϸD`qUOiiDiJh&(J#J*RQd" l4)j\BKm.uB˫'^gG;(/rE҂fGJ$8zez.bK`@,gʁ.]-fs:79*Y.ꁆ) = UhjgkUcn𥗵B[pV/:RRVNivRo@Ec[ZcE(Uȴm{ ; uV\[[E?%82ͶIXlrVUaŊk0˗GbT+rTX &9.WJ+DtaN_eË|߽=4V.*CǕ[~/![ [zx)Gݣ?zse`HRՃ<{.&G(U"/ap+%DJ8 vq).?@í~aJ=LgaI)0Íp/<  b`,#jGٺ.>~)|$~E=BMkg |#'U307N> طz۱7`6iuiTx5il_‹%Z!Se:<'5jlfȽKHXKr|Ol2H:{nmpa}hc,LE ">r}^KoW}![8~T~oa'7xKz7ڱ7c!"ђXO Þ]Oz4:ivW4+M0k.`=< CH2Úe܁/уl|S Y$fq:~| VcCFldZMơfFn gQ8M^&$3Mӻ> =RU5!MxW8n=d8&  )3 *qv-N}7 Ęmwǔ18CT8Уt$Y${74kIL_ ri1Ggu+z阓={a):Sw.¹™k*p΍QKY+Zj8sv  +sp 828[Z\s=YG6{t6]K7]AOߣLβX5nc],v߱P. / obLjcfqQ|X|T|A|E OfrGIUzyЃ9Rb7t/:!򻞣q{ ķ3x&׸ZHHa:G1;QKf$pP˜У)+|}n#|dz7 qޭCU2U"]#L LUYqO%u$p&. 6xwAp?O!k!W7t8y޹W+M[ZiUv |7=^ܫ>j8pQV:I(z& =F;iZppVS )DKW|#Ivp2L*Aq/gEAƓ8W"FnQ߇pcFρ^5N4KMXVb66. Pj%MJ6YIYï1BMe2$]:(T|1H!)Ƀ $3'bؖOk:ee}YeՀ$ɈD_̍ҹJ6mQF%$)2EI ?&So0"MДVB3]U̇y%=2nn/Hrwz29]JU|p̖o ZTh(Z"qZVΩ{nhٌ|{{糯6mS ݡ\yϞoױk>MjB/y|߾m!1ɝx'''Nŵ'28-3={-T jG*ktgl1S4T&jIg"k)M<$u!^ϏgR n??(FT)D;v#%LqT58˝TsTeI&$&$%L$nNHR8`'3!=<Ҩx֮˂g xL8΢49!@*'3[ +6I@\ܑeF$6g͸@蛦Kq'T6&3ӑ0^Y1?tplNgNq˶mK|`uW5x %u>񇭟XjWV$0d3^ܠݫۜЩ UL1cn>/PO}Uv8R= 'գHȫb*͑:8ITC1'>¬j%h84{08&jTjz!٤ީ>>VKT-9yCȗQ3#F]HƒHe+ddS$@ݒ@R@iKJNoB']. -+t!6wM^ΌӜ3x|"UuʪwhqNI9{dr4U&lxS);^mX@mTޟ?vi0rp ~0v%.mX:]DD{0 ;?ϧӎ+)N".Mț֤7.7S}ؓߜw %w/R.)•~M V q6cQ[`1Ymʹdk73f`Ӧ-mO;9 Z۽6˦m^}`v|fs%>I'~IJ/jn2435""1$$Kr 8>`% ;9l7!lBo"}ՄNgW5)) /TABU"ȧR;X(?^#ޫj??Oj?"eF0h=ld!VeCT۲\}M7O^ʆSR"7G9%g3)jԎWkoNъ+{p9YJMn*?]3aҲҾξ.ui9:>͒dܖ9go[U~u4qC!x#R"NA~#ܗ<& `($*,KVݔ'"ey/=MR-8‰3fbo_M=YHDhD81?Tb"x61maL EqVD~N `ϖq*K:g 6;0^Oú%)pzԔϛ0>pnD]1džGYx]zJ ٭2zW_9j .EG=8D鵷^[`1(f![Vm}yv^ {L}D2hX-$){$)cI'nI) .*DhFD#f e 'Ef""TWݰL[ ,J刪Ep}d6u} ~*PQ2 774 L Ok:AʘROs=_2$EGB )Y5>)6QXgxڥ-K8ݒ2;3%)6bH0"duV%Ad?NSuSl?5y!9|xԿx++.4dmY +Ё# lMlHP-];Ao кغhKlK;wQG >>+fy9J!4xZjW$%)i3Q<5ŢX,::xfz+N*?RCן<>~J5uzu>EBh^vC{F!CDd.=o{2h>X<9㬎$Qq$F>XcAܜ xPd"*`9+&1_;e,(F5;$pm`#F֊Max 둥Wxm &R nMsh$9$nJnD۸mm>Ot&1g%o.g-އy~xڤ2}ŕ6xDEzyH+aA¢x#s}CO%i;QJ6d[o7{{9Qmx)mFOO~s2zOvPMg ^;iD>سo^׊tg-m!QSӾr'/-H Oo(/ ⥷\yDR,~e_W=ywLON#R vŃH:sdo(R=HP7ia(%ɚsnNK %)c&Bika>жJčFa` QW$N?IR˃i׈S@G/"V;*ɸݴO2 JsѠ) C0iA0+tC eF|YZ$,,| 73LS0 0&9 FϚ@i+9$tPߥy -w`GXW|ЫBR]TūVI"ꂕ- *PfB]z!rA BU%/CX!Q _~g?j6dS6۝K+d/`;ZIA<_ql;xj,udZzHpVlh[E宔{Yߊbw]yxDYY=b;C,Oܙ|C8"br0r$p¿r~ޛt\gv,wrgsLF́h1il. )Ң_ҧޫy7+[UԊԕ)Wڴҗ[v^W+/ZοX==L|7AZ̶ ^\^\>v~nz7[&;{m`yHQ.Ta|{?Cz_ V҃Y+kQfEmV_h^;mj־?7v+jX5Ql;]>>;(;>KiAkgW{V,R!-*&DhWp~ϡ`B/(Bٹflj)B)"d ?_Y7Z[MI(dFiֻzRtjMM}g8Nl3kRZ b̃f9G(PmNcںcMbOWҮ;IkKr7ݙ@|̙6 6]B_ ?xdU4 ǔFW!>0sUaR]ݮuIQ,q3Ym/7x(.H,}qO⑷ngGe9#D۪YldpmVԙ{B~Amj=93rh"Μ\ G UϜ0EA43EA>HP؝#-*7ӖDnwpo"+,OT畳L+ fDzTKVf;G T8hQV<^Off;d#O.Z5C4+t4њN*I#@N`̤38L$&2XkB*a%7e1?0wXFQKї`|uHV]kߺ{bSf6֎̌''?n"o,J)ߩ/(\wXx}5UxQ| GYl,nr˅ֵv}!!hmߋhWl 1e>#D/pnߡ" T!-ܧw Ex7|"K .&ĨXq71 }WNu}UwU*z".81SawԆ+z@62Vi+3OY5a5;bñ_ճBTyK8w=2ku}p'6G- VfVǜ::LO'| y+zRH9 M g~`rVD襅i. 7 Q.X!`j7H@Ȋz5k8V;TQ\#xS(M|ug%k RO{O*''52gA$ޔ"+I5i"ysFqL#dtC!i(x 6z7C {[9v4?xPkw"R-]4]l@7R=>,gR/ħDIa][/Z3gKWreƖR,MKzf4 vYλ~/KqdU MUo|ڻ$.kK<_ͷƷ}vE=CN)S9m`/e z(MG5Ǟ `jU$YFqӾhk1^пe haa-W EwERt$%Fo OcLtq: JEU6I%F*ǝ+F*'( $pM6TIDX4hx<"@RM.}u.ic.|?HVrIZ};yOO~6Ӿt K1!zDyjWjEx1"0ŔS!gݼWyΑ,G%lTE]@Nwquw3V$]l\Q(_YpJd% Fi[ylcs1s|dN72jl[)sP@1-Mm֖1#,BG!|fHmx^H>n0p!}RxEm4]NE &ČBS%Rdll T'DDrtΈj)e+|߆usA`j+={rgC Jh|kf+?CܜƵwt.ϡHjA|srs}}/Zd>N}2fk ӓ\hfYkV/vX?3ӮflGt%:ޒC-֙|TWTztԫ%C^L zGiP}GHZD1zܺhs:<}dlp~=3`g7n X(<"Xp8Ѳ34l fP3EwmwvtT[W\f뷴6u\%l@{IlmpqX}WKG-̝v'9>"{XW.P =Zf&Dj73].*7%F_in)$Y,R8J]+7fYQ( 0Y$Qt6Vbk}^mE%6f« ;-4FFJ۫^yqKB2ϑ T0DLd/\JjG>6Qs8 s~n .fd249}OR&_hXzoP` #O[GĀa#,>"b7=0.ҁ"m).\FHu7ZI-T cqOǀƿ`%wdmaG6o=tO؝E3۲%>#vήۯ Kl*$7XRɔͫЯ@b;ǹ7cL0%x)M&r(%ľ K] f41Ykt0r{zuR.7Z1R7h%$'v&v'LD_IO0GNtc b-6I_ΰˮдe*̬[z j]Q^iJ()x-%Ttt ,?k3r'Nsc$ɝ뜟ssor~%QQ>GGq4oD5'ylB̭P 5" {)`)*K\JʲRJȌRZL =0r0G-RC`Sڶ”Xa,hSi~ N'ٿH4qGqH\f'‡oi-@ Ir<οy*'u Tgnt<ƥǧS;~d:]tzzQ꒽"qhsm:NN¸G}?k3^DU*UlN3Ӓ[ͅf,q{$"ӖQG")Htk!Zl"cb%Eւ>EdRS#(9w:`?o? G|W'/^nj^p"ώnqF}\}9Ks}zHb|1XU˧w/\^|x3JS꒼;89_1$^B3.yeh%LjľBP ~?QKyu۵}nVSn P)|^28I \Qa_Rп~ ,~< *xWwq9Gc1 |Ql%u$/TeYL&9e 0&Kt_w(ϼ]*R&~>}·}PKJ>`> !>-}[}G%'wb~`l2`7Xe" voK}M8`Xd2鳴2#4ntV :*&JtK#0A-?)LNqJp|?sJFH6BS/:jW/ՕT]RU*IURIuvw7n/ݍ1n Bl1d<&Ƀa@ I:0$xyq cBPwn/{c+Ժl=f|Z{hZw^e@Lt-Wwjo˽~ɜ4C/K 1z xf+vÝ)#+:C2&>Gk6}FxZ]I'%tivmtKf"~ ܖhQ(?cj{9MI }`&p x). D4A|/űyry,bO(K͂R8R9Y2R^!+~ x=g扖/xLrz.XNgkZVΏXbg <ѢRLAI*jɩ@&kSA6@8MͭKh?߯/rۓ np_ߓW~zaI?7e$e%4q^XGUP`7j_]2KW|cˢՎ53zCj=8dTx5:fot>\_UV_Nm3^lcT" S1lT>; () 6H/<5RGΥA nBxfYVd".MM ף<oa.F oڣ*,;]@K= ٭{CfGnLyÙ-Znt4+fx^6n zi0kg(hקNnXP7r >-*6BOt'ɴA\9~wCu O!M^@IM( yz2"yz(j顀 ~'9؟ɉ@;J鶯 {76X87"w[¦9ͽpБ Fn+_sګ0trEu76n=!9%Qe_½ӹvq@IIO,Hcl n p #]N@4`nwm4?kCxF!f4a(*A?uQO.sfk߹TK ='}EZ6iB|K;=WIwz➼|9[ }&-~Z=\3-W;?ct'oErQn&YHiu źBTZ  3BBX3?}WV r 0'F 86.' 'q3>}?K8,?([&bA TUTH夊Kf8 ;)3%81Ꮦ@)׉qڷ݇ a"ʁqw.M'Ng0҈bf,j% pәibTr{^p\X֝J?F^må# }EkhVg!0źDLqɼbGX8}[/j~VśormxO_7D:I},!x4ZGTf qr>aĖ<|3E)cye--M?@:cؠw#Ѿs5kע^xWh4 T0,G F.TrִXŢ71w1RZ,J{==jv)3;|`F0ʛ*rzԂx*.=lDbNBt-W)!i"lJmR֐׌!G`*7b ?j8XC'[15d`~ze~WV ?tƹjgg(_鎧# L4[Ϸ Zv/Y5{B}v'G0mfb?kBP(>}&?G[2sLd(,(PlD )؈!"&́;u% I> UrڪJ*WL";65 opwu?b c@&4xŧPL7k, v;w_V*85fB|sz+eZCZ9 f+Oݱ拳JY_OO|^⁦ew7K^Y&Z|BpJIv!?,VWh~8 ց3Y;ƚc!A2fǦ42_0|btkMNy/Ԟ+jPA(Ʌ?@὏N p*x۶sc1ѣΨi J t==ǶhgpGU#b V߲}߬rjiuؗ5!_j+Oz ߸Ɓ}kO9} iּ6`f, iP~0v ۈmîc?njdɒK?f y:$D(nbi^X6;l=3lQ?=-߳e-{ i/L;5&ON"Ӥi{r5.;v1lٗuH8F_+U6`aۋqO=z|'|P*2kuTo*m1t?8ݷrZ5:ߵVh87exzV(^Vб@wf"[PPaDD SsԁjWjl%&<@D"UITçfq6ٔHoL=q˱_3"\NIZgwE/% xEtm9 ːK.յ`w/%5 IqN ƕY+g Cq%x !s߉Bc%֮/7hܠ ކ&ѯDvD;>bIg.@GG@w'SQD| n/;~ 2& CD  SKi*ܦJQCfg+rVQ7ވ ?}`%#*S:so=82nN m>ƪ^B4$#6DӢ^C ۴(_.>p[u@29逇*lY=MD,<8U> d:"8|>l@xhq<FmȤh8_t:aCt DZDCd>X컇P'O!qI>l4\Oև~Q\YbZQ6Z5F2`4 -lVu߻J\eW'I\ɱͭ7 s_#^(1⨮9:lxZ-초0_s:D*s^B7 >;5B5R!W,}`D+Ye,vD jUP*" ms#rbTGLy-նSk+F }JD-\'Rka6k ]vo/IB;rX )Yd\ҔSA+a7cW$,g'!ŸR0D jO쬩I53IRt\t"wUFG(OGO\7w\cpy9&+,tOnË@LD\\,e-Řųy`BĕU<}:OD;p`B< z6Qdci2]͈H@U91/UC{SBeg1ȇ Se669V dQ'2CDQ)7PHEq^9B ٳҾፕ.Il#K\` ZkF[.D1{[/HloOk<-~]୙g]wIJVPQ!(Rt(MωQ^DNP@hNLπşh'SϛcIcf9Wy17-/E;Si>Hh >bDk{u ڸ/]IapKwfT%m@ikǖjZLQ7uXbF(^)B{)B ^LuZ^Ԕ< P:/HꏕEG&XFfJ++9ɞ89trv/z^=N:3fm]osorLR?c?䏤d 6%I썲\'F7.V'`=|jB>Ս-YAj>aY-Fe,8csh*?|Z^6Sw mx=]ZʝI#V毋qpIRf{%t=u#I^i^_ǝp*@C4C5!#q A<8*" 51<Q4OTʩ DdEIgp䑦=⌜Lԡ&j'Hۚף,<;d|)af4m庺Xk,.xA@v͘l6jcs֡u]#] y @v6WP' vEZ{v![-rccA;6\}r/i2Zu55*y*ֲX\}K}`|N#t6 4 [n9gΤ 'I}m"<&8H`56/G j`*֯˘~w?w#QVy9.#.*?.)6)@󹑻u.uzqE^cd]{wN޻uΕ-ڳ~Al/w^M,|j'!5x, C3$oAG{zE/dґS|B)ECm-Q1̹)0y(NjpPͧ:v_Co]t5Ֆo#]נ{3zk&6ټ8%Un ҟ7݉cwѐHNm6f4 _GcrF]kt*jg @`JV+Zw{+SɧiooXN[m$׊cbSdT%2VgӕJ8\6OE1=V|,ˆ.WcPvøX$爒βࣱPaD4L3)(oPQ Ju(,:#h2 B$bp9 P2vu7[լpM]7=D"2.n*!@dpkHDBIX*: hYE+V֍{UsMV{OIss}Z=)Һ3M affy {G&zYJ_Ptd{{:S8| ;7W{}/xY=eb vvsfќ]]h4ŠeEK2>0gGͤ[+O (-ܒ?Lh]cs.':"PROYMwCTt.zD,b+j3sTʻ=\-@ct |F mȲSw?ç.h9˪ L*N5e۷L{жi:@Ub&V4!=+~͈ޏ"iZc 1eHn=/)@rfa2C[=*:>`Ƶ3i&}R@<C>Ay!oGc66xFuP26ݛ,4|ç7/.# 3?s{Soo̿Orz@SG#VҒ-,ы@x-r&_Ea{w_f4Ż.+ <_u1=y']|ȘY͡փػE@7oWWÍf>-[`::X `w:v:g{n}GSe˺4;>tx^y]]5xxTICI;C;'ִC;>/ۡڡڡڡڡڡS`?_ۀ? Y!w{!bΘ vgCwX$]E @?m!|p;C;C;C; Ä{{aN ah@oJO L@FL̇0Gz3c,+ 7J|L1BfXQ<[Y3@iX Nǘ|(ٻQfiCƘ}2`Qz> 7øb 2/iLe=31 u~FL4+31/w7~sp+OyK31K ̀ / 'OI?'q$NI8'OVv.e7p`[NP8 ߁pK˒>n :p&FH@> CB|JCԇ5>,-S8 a~p@S8?.>}]aLR8i@8]PL)C WQ8A'i: 1 p#<ac\M oj`]qe5cAq0|LS1?Z+B3\0R~QXL`.b4o.RDi r +3鈻Ib|U\"pL'`yGa -䊁CP(£@G&9C"_X#pV.hUglCWۮnVEvj9j5-HC*$%W?d[d4[K%AȨNUa-!cHE\vBn_ΥOa'44sȏfu *) 4O(/Ġwh_,uVU\ 8PiܚA#Y`f7RǽQQJtǑ<3 h Gɀ> kyX_$ N)G\0 ODUVW |'z 3{5DppQ OU)U"UTjVRX\ %2)JexzL)kRb-P%DUTkpȞƽW ExX)QI loUO*j$Q\+ xr_2iK&ZѪ@$Zz^Q>r E++qVˁTTP'&]g$T̈́42EQkͥ,a@C|y̶ɖR(T((WR]|(20Pd E2\V(P//J T i{NR)t0 FV"SzCWVV082*O-\5ط {$bu D,U9`*SĨӭ 5D.!UI ADdI+g| VB؜EIeCtx\ ҍE^wX!yJʆd&BT e!E M>ڰuN1ܼ8Ie 0 8XS^jSUr䦡<(Wp@b Ut&hu ֒ r"Jd=T?e>pd uH/VZ\j(^ VB6/p%paz(;VB656V.DFiCS@^,+⧧A3i"~i6_c:$ACw X#@W"H8Sk%x bC?sy^|ZӬvcT Hct݌ೡn}w;3ؓkk~׾}]ywui{~OʕU.<[kޏHDF.R@]cYǨP+AW@5O'Y%?CO~J32{0Ù=̈J}=dh- ?F xGuuĚ`,QQW /-޻cXѨoR24$ ~Ū ,[VDX8KR 4$,v8D c3V4z]X09FXfF FiLZUƬ} g3٪/<9@0cld}xf>5]W("*ƚ:FwYFNj84)kK3z"5Lc[zcKtS[l&_ӪNؚdBRq%ጹ}#Tw g:Zqa%\;[qzD',4<$? f9?hUoVNxu6'7U5&gwS;4vOv?avqUS>WY0mtFKhf#F p5Ӂiפޚ1xlVgD|Qk޽@)t$*otz(l'9pAf r^y鱭GYlᆗagΝ|l։yv$x2yԾai\5M\Q9\hlF>غ_o d`?EMcy~y+FώzԼk94馩}9"^lblo6|,'r))_mۏf6[([B3aݾZU{Tom'qk\]/{N̏Z}"붩{킯Sf M_g_j[px΂ck-و7ÅѦ7GmXk鎑gg-hĜ|vc"0ZYAuӳn T*P5&,|͛8 띘7w՜+{/cʎvfU=,{Ga:!n쑰@hFײXNW~U/oujxbfڏݒE0j܏[ZD}1"ˠyv ˷K&_5aclF{Z6WN#*^W5Wm]3wcYdO*떯O}fb˖dSqbc>XX $RȠ!$ DACWΉ\'_̙8ݯח^O*>v{FN>iɔœimK#z5gw5ZeO&xEyTs/ /qT5qx~݊^F\ ]i ,0W^ /`{9cj'1&NA.W[4+~/ɟ t]-F%, @lng}}wK@?WugaLźӿ]8"ђ!ƥN9{U=8yFol6t{J,>L?kk˖MyMWW,'ruԴ ];%c>T9G+.]x$R[kyiֳDv5;N Rl~wOùL$ o7n:"Ldt:nek.v:?cmqUʺS{4ʿ&SXn7R[9G{KZUvCaۥo*DQXO;IVˀʉH)"rC~ʆl"DFMr8_T;wA{nWjgs5U6!;|}q\W3l7wbw|hz)N,k) ͎wƪ\:a̡ >yep9qFmyv#C xu 4m`3?=Z4r`óWåвuz}e3˗}o[-3۸f,)rǞydu SݩI>ߍiQ.Fφg9<-k{hswwF/<>!;e]߹kq昷Oxڈ=jcba| Ll>{rOF  [^bvW ]Og&ߎp׃q{(ލ}Wշ=M{~ cx'Vʃ7)yߜʑ>L]ib輊[rʆls{K}|~{X35WXkk<B ˲4tּqlg7JSԞzv}|z6_Kl󺤋~ij Mp.ۺ)^"ioҮ[yGMџlnjz]j]r5_-ص`/JCPlDf> -Q*3+3z'DX"F'NseT%buH Dk |_F7d߿`.m]=^^{UT>uNm$3}r>6+e±1?7qҧ B$7m䄌s3FtJv~YdMo G}u.3#J,viڱ_<;EO?fFgϪ+˗ɕkg컩O/:;z\9=-֜uk rl~|0Gonn>~b^N7<~yk7WVn622^A󉮊M͵nKkS?wVُ,Oq EcN_|P?u$K2n(v#o}|=WbYzY`g'tr$n'0߃ J]C?d#JuGE/lK|n/՛-*ɣ6!2SrP2O Vdw/>QyCUǖ W?q~$wq 0H*x[xa[?p*::FTO7o<<f EȂcM']_E'-12TTG_.~fGÔhy`HG8Ѝc'OG7&p¯lQ_]l#=+ݾ82f%sid, w7Jճo],;9(slQ3k_iJ뛛nY7tQiv}Xu[X^7qvӎ7D+&Ь]*IRIR_YZ^sGX_x5.a}}bp'{e0wtΈ:RX>l4. A;8Fm\t0MƏ.~[s,ۣ@6QޏeagˎM.^17 endstream endobj 1139 0 obj [ 0[ 778] 3[ 250] 17[ 250] 21[ 500] 29[ 333] 36[ 722] 38[ 722 722 667 611 778] 44[ 389] 47[ 667] 49[ 722 778 611] 53[ 722 556 667] 57[ 722] 62[ 333] 64[ 333] 66[ 500] 68[ 500 556 444 556 444 333 500 556 278] 78[ 556 278 833 556 500 556] 85[ 444 389 333 556 500 722] 92[ 500] ] endobj 1140 0 obj [ 250] endobj 1141 0 obj <> stream x}n0E|"< !>Դ@`H YgHfQK ͝> stream x @  03 3 #(n,SeJVFo-ЬleE|}π`w<9}w)``7 4WW6Rw|rfU}* ?6 {5.h̽fBW{y$3s,DZJP{Ys*yku?xН ˕XNXd^X].lmY)]XYвzMX߁m ڗsk\`' 5ֲ.f عp. ;w^*z @թf ed*@H}u_U^U1 xP vX 0$)uB))hZ^RmZzi.H_(9^"Qqݠ y!y9 0f;A _ǹlRS]$UCwm!_5Xsud|hS~x̺!wh_l!]{DfH}K2$ s? <2>|^~N(x>asmg$)>|o (D?z|v.pBe=B%/ e1 CKݰ>qO=~x#u%ec%)waIp=VouKR/̔wcG} 径hAoKxW꾅2X+>eWnn }X؇+I#i$$J܍pqǭs@gE/B9σ9$wB-L+m,jʇ>>n%P ']o7Ji85~a:(=><|~v!`G{@h#{F6#zI#Js@>_|I#i$4FHI#i$4FH_X0gšl u$pC6B%LiP`̃S`!t&²lsmdPHC v5g t``ѐ bOڇo㷅v~9(xFq|5_ _^]|1%((ADZ1=38Rtv2;`H%2 cžóI 7$a-a`8Ə5ߏ{~e,R|11xxỗCv%3*..2_]~=\ǽ[=k'͘56M:eډjWWUV󖕎-)ST8 Hu9I֘(AU L*9Uf[55Bт! Ulb3^l9稖^jl (̰U9l[^JG-/'yK,h`c[ULG-mU3:+qQѮ̀jR=,.jL 0mwV*-v{ q" Dz z2w_g6G[I߂@2r{ QYHw`ipغ.pMKX#s8h& Wۅ\XS-7ff@'Ԭ jX9ۖj!QYIvkZՓ-͸y3( >*TU Uu7Wu-ݓgl IXG  X-msl~=mB59M@n.(½zsSasI*l(/ K, -/,Bn8X5B/t؛~aI΀bXT 9Ҩ4[U{T^`xcl{(w TNrQ0Jb-l~GɁ1&Zomn_v8JJc@N U,˃Ś' TۺچnapGx@&\Rf5n`n vwV5wpLhv4K,Z+,˄"6gfS`zlUtmUc\EsySO2lB&걠[xVQ![:ŀAkG:ÀCt^Q'$tRL*[: ѕQ Q8&rԎrA_&H/r 8™s F CBF}Ɏvt@g9ۍ+[[u/;'6a M&82<ምZ7@J,V6҅Ip61NcJ]DGxm⥠r^$@k?i,XɚHr ՁU6Z0,UYHӎG.a[SUn-\R/. 7 55Ĕh .¥ MzRZ8Z ;Az|wk%7v4tB'ޘ" t\H" 6HH b B ]mcv'Gx o$Ax*5.+ /^ $&=»w #|J1#‡ut(B!Bp$`%(ANQK 5K /RD@a'y ſ%a%\9?)7:(^=*B 0%L8p-PJ(&!& 0 #H O<#T*@XN1"I9J  $Dx"F]VOʭ?jQi'Z?DefI(O<vG'XAeJ/JJe#}(܃nPDv܆r+ͪzP֡/(7܀r=u(ע\rL(kQ֠\oyU'XWcReuAX:"727}3a}o`5 .!t.&"\DB܋c xB5P٫BT xG%/M0^t3zOD=w(ߢEك z}PEy(o{am([Q܂^ Ǯ'c_GG %!لB3!Gf% YM$dA*` ?[l{((|h;*2>voodv7҂@7ҁp'턿n#Jp jUW "̤L800DN$@ zBaa*!0FH%\'! $dhJxG`QB F9r?Q~B+/Q@3O1:_ !Hp!^gV!p6a9a,R™3]%ńE  2B)a,PLC("F #h N$AIPx=~( UWP^Fy t%6W)dpNy|涞WwsjVaOxE ^‚XbÊ]̷|2dY2NuV͙d3j|]wGu5vu-麪k*uߵ mFtWZEa=]L/m]j]E$5..bwk^ԹF%V -m-OYܰwZߞ0N zv)n:6q7Zݳ}-f,ɾNaOp7|} :_:TOv&mMt&lMaվ*wRHğĕ{%3aw3~oZB.Ka5\krjznDk֡,kAYp' p܌[6܁ڻPw-6۬C+k#'\G^6U~` <Vxzu;; ')xg1VCNx^X%x^&o?=x>X[P;.FQ=Kv>_@?|3[}Gyc L"ae-ƚL9;Ka<,b6z,e|8b\\ާxLQ'D yvFQR;qwb?`1<İ-@b{sYCk o5ωV~_X #~}_A"YluֿzKٗX ē\ˏuc^<~@o1=cG|ڋ+}zG'!|+:1'Լ5AABx*21!1j2D$L#GL#54 F:O텿3ɢQu`1@ 3N7 @ C/I11m, k9~~90SYb,{$3'&Dz)+c8 qkƱJV! z(e: oJuLX704L/{!ߍ:r(S7gFgF+JƩ10,8ڱ!ᜣe|Ekcur}ݓ{w'r'zEEOV63ڍD8\&s$ѣ rssJ<7HҡJѥ|nN"'6 Z~|d [eGM"錶FYFh<ט8B.䊔IUs+I:.Iz6)IuOT ڧҪ9RqݒUL0jZNo#*غV44kJQPhhH[j~<Ӆn ߫Y z^)~zGM^ecjzLY\`5y*'wWVe/nBKvh$;ZI*Xԁf,H=uqACB\ oxIl{ޚ1%^rSf("m136^QvꔌCks[_^\;^}~]:7Y|e"EeYN/z8Rx?B 4GpV.gJV{;YSU6]ǽi]8dM5ߖQjmQ%i[cMRCePI&I8qlX~8;76բ'I;乔"QgIEN$͸+x`}WcLU(S>eT*ot> 膈"OQQDQ?z,7ǰ;XAH ȃ^6'<ЦI$ ^mĘKr$k3{m]>fjՎ&"=CڑU(qqoF!?hgt )v``4,wv dYbplyDRa;۠.2,dB{f%RNH֨ȣӒ *De[p ;J"A,𪒳َlӨ78IzN2K~ |iO})eeE8ӏm?b]NOGWt ]ws=bDp~"o{kj xߗX0bOzgYN`']i׸+FE ] 6L6r td+9a~Z![vqp~)pb+I1el6^;2?-!F.qɟ#&m#p;<$#(1E%r&rs0JЩ^1&N6ZrkSRZBk4O;SUUeI: y3:#`j^l%ZWezO˕n_21&,xGk@_G-ʜӚuZEc[syp.6B&}@` 6U!S.;b[_ Zȍ &Y8;v%bz<yWj3`ר2)L hbc^+͙jbQQ661“1TΑ9f1sLG/J723^a|?ٙ;dkSppz[Tlpf*C! તwr. \1V54o$ȗ2t-=%7&ݮ-Ov*ڑc(O0f?3v>$ɗj"kߒ"wǢߜ V՜-Ul))yLa2DƨIn~ b VV ~2Q֬ 2Zdk1s3.ٙcV ڸdxbc4jwsfYą &aHn؃/>w6.#-#Nn*厕s( R6qEKє3.$gz^UH$ ?)޴ ]ҘOqeitiaHc$*fꢬr6Q^؞% Օ;V!{ 3}Gx|s#S:^>|țsK#*ߵ5%Eu"hTpRV+˩-ItLnztN+}i mv ֠d~])ZcNewЗ%%偬G4X $Xmo4OGݝ,{UmeEF/:dʱ(MᬙTeIlsg\2zNl)/eQ+r\E)sM+9书]{^^`Kto#3{۫++5{e*$?,9b,QK۪ugIG<ϲ,Y%Kd;eǎIy !d$ f @H R:h/p5/(޻޻R^嵗9-9 q \sdֿ^{[.:0QK"HRAqc4k r/[:ȧw1!=X!m-7G>9=z+xւD@e',|I :@j,}v(3\))87U9C<}U-28U ׌rHV"@OD4%wP cp)jtx?%jwLaigMg,Q_r|SrB1GcN ~WωG;d2T 4--LJn2vr ΖՇߛo zUě쮗 N'/c@> щRH~BCSj+yNof2ps]οW zNu65/څBL9{;C+y'FJMVd)60Xn̻h xmN}vsv<|3Kiu G'K[t<|7 . '_%!20MwoCq{&ТIl94D%xТxcѪd_ʦR* E@9Aj&ū*B78/A0еZ؟9X-ͬb2UUM ESFzmjΰ;Gl SvN2kUOY2Ò5:W=5BT! EkMC޷Tt>14į̙F [Vb2U{vUOƱ@~׬c`ש xtP!-\8yˮ qK`ɴܴuy<f֭s]Z@r]஥7,ٰlk^xLww^ᇚ(wObђ9nt/=RFw[QM4j{ p+.3PZuD)HKjj]M̼^[9@xa;K鋼2Xnx6K.&@B2`phHekHN}|ަ?wZpf AbV<#lʻ;=8I+H"7{h[פet[hGr=f ]5ژ 1 dt"c-m\^MV90Nggq ޗ ?8'"}$XZF49Xf!U+R0*iP(i<2]5[<͡²f!S[oKp2S@94,ahQ1.dWԌUGC-+!aáEKn#h2<ipE73$P),fϿ.ѣziUj֮IC7f$|eQo#V.m׺?ˇW5=׎4"O V)h}ֺ▧ki콮H{BZ:ǍCyߒKҰhbhDF)okg7X2`:8u( |aVw˞00ri4`6H lxba26OP_.ЩRp"3J* 0B.;WM(^\?aV QRd&̨WQe+б%"K7已گhE5/mn^S$Asi-{t( 3H ڛ^fz 4C#!0%.KIOnv%7r6-}yD<Gog'ta>SR*[;;t,q ݔ)Ay`jzRvlğ)Ntg6vIP $щ "Ѧh]F`^t4HՄj4Ϩ62RzUFd ,/LQL9 GV*6+!50x4Zлlcs+Ry) dkOC?UY#sCiэގ4C/Xs O#,S';bRXͫz{L ͼbJ)Ph>f` {*P/1# :m$_ex|_dp[oG8p(I ߙ8'ɓAĝ>pop!xUl>?:;ENej"d2F8n:SA 0+^F.?e=8KLYYT|3,X3# nS:"ё QZB ='-x-LvYSs,w>4b&0:N0wuc.h=[(xgQ[y`K:Fm1R[V1:C-؊m}뢇rE{֣hQ^_.ڰ\*eAr%a/pP8avT=Y>G\KҬk<*\Њ+AJP7,һݎ5Ǎ3NDmeOB:؉tZE߷їkvNSҏ_s+o|=At隑O^D߳ NT@\Gڞ9r%IQ| f?7<)c5LY4>]#>n0GYTp IټR4>?6BZ(x=<ݯQ_Y˘g qS04az9:U:aU,5:p[q@yF"@vU(̙.]ƕ{ORD9gEkU [159$X? SkY8?%]!~>毲YAJ3t;g7mn*t7Ra0`AvC:Ot+5&1.:}%D^0Av\[+¬լZ]@F 5/41p$=Z TctI+ 6zbdЦE *lߞU%OߊBP)N`bo"88KbbZRҚKARٵMa֛:R%"ioȦ1U}zE>p @vPT89p'pɑp{"fwƯ+koBkƐ,6wj4nᵜ"cb(ַq>N(#"`Y*?oMb(_w(-6gޗ# ѮFfgoКcGXƻHMx<۰}, n}CT]z'p9GLDغ;+B[U*Q3@u2=~ [̄H":/pz]Zji i=M'0vNPG7f E^-~h m.9C8OQRԀONzTӃ0JLo2C+2_ܜY`8QjXG486ؔHWT:`EۗwݱEc ^9Qe3lpxVЛCQoS{+%m߾ϻBq\soZo:z?@/޿}o+@t=X$uOBbvP{XKVK}Z to:oEj3n5Dg/'왆C6j9,g.jse /ZIlN#SӨ|7G|xFIy*%Ps$2:U LѢX:CB(r+!EIKסs4Zy\qϡ+(DZ?{AɕkH=,uD"- Sw s\%4%LT\lAYWu+"9OِaJIMΠPvMg05qVSEpD$9;P%\'0 fwvmC%{-2>m͒VOp[ޒ,GY;]}WWm~E"6BVU۬NVJ>#%9tFMrycnjngPnG_k fbIX5+UцeUp~m# % ;>1ZPI/JP_XSaj֌Y5W\+7̡ u88+&Q;ng31q k3W*]V<Gp#(q6v'EJ+15}m/7# _eQJ3kjjR,!՚k\mGŇ#&*24]AJiY7l/7wKǾ -=tk˟+[[,RϚ;֓,_Trpr>HYPJu~PM*:Ӈ6n}\B<-%4Snylj' te}c"s7dVCoxw+?0/w۲%t(,S@4uVKx( %^Jh|y]-U?xDJG=̲ī49+hj46+L{Qic/tRHt2z\r[zzM{PI8}[69%|;L4Ԑҥt՜WMA?o Fz!.xݠGoKǽO6k[$MѸΠӊB 4܎Œ$sB Ӕ͉7-sxX +w ME"?AAYRFl,Fؘ-tl# |P^a1]3bawT }yCP7} ǛYS«ÝY_]1^;ш|c]F,-ĵ+hDz|)N9AoKԲD[ A_`%iQ1@fa3ȅ.7xسG]HAP I)#O+|m`q)֨ рՃfN>:*Չ4j6OlM?q&I՜i I,Yt4$lup))i,Ō4 k]nVEg$)Op]>-ߜ2"[93-%FhRTpn33`g+[L'd3һ^o j | ,3h0~!DP߲AHКygds6,@\d*[Z8֫ZB1\"A@(f(B)>+ZM8?chL5^f'#4+v|%^ogL'{]_e.ͅퟪ^i:DP*.=GsOcMK'ڡ{)^W{&S`"[Gr%kPk[l/:$M=:+2? 5-pKj! 8:$Vp,ɨ0]GLZ]4} Eyoi h |fؖp0 ~+]h" ; A{56&%[QDCjE| /SQ$3}~4?ۖv;>C:YCڛnM{= ^Hf|~(.bsƑ6?_9%| 1477Q_TlDB~AfZ)nm&3ߞ-=gZSKgRgi`*?W =sKЛh ^cJ E5vr,ڂˌM[e&D#5&lM5."#|$h9/Qg[mI+32gn?5U&խ$2Yy-v P:N8x.´da^0!Og.0tyk؅B6|&[W=uFV;V~%: xzF/#x(KZ]~fg֬à0[ьdh+x_NRFҊe_|Z5wnmLo5p$WhZc1oc8 ЀD:m<z䔵 hd- A س3&UYvZ2y:2&H&o}Wlc!.m4[7u804#luRaJT쭳ur{֓*+#+ՊK+EFTg:lzM{T1jT'+W"'9^bЀUVdRIKt,j`ZUkPd_t3ՠhI]cB^]Y\t{>l6_QjG.lTK EcmI_lƯ /8xSN]>\guM-V,7$W8*Ǿ?rcJc]^%X{*m~eSve!/zȁ2?uhzˋ}C3l;aF7>aFQ<9IؔwkugVtC^!ŊbQAh(%>&o4PGkîrIf(0ZkЖ6+YJGAbZbVn 54Q@Z{E;w*Xy/-/.VEZhâu3CpTwwVHtC\nm37t5LJan0%Ջ3ZHߐ^qw5+Wo#ntry@vEkoɬws罷. oтBٛejnx)4O-3W!ŅYآ"R (ʔM|xnToЕ+Hl_ki}*%~ du^UfXˁUikE6[W\aNLa6:y8r'o2^͖8ljOS.$FTqbu#ϊryܵkiJcQ"~ Q& e v2kO O{QTh6V/o5jqX!b/DEz8BZpWe#Dh ݲMS]WH(ꢔ<bW!h9}3>zFɢ$e{crH]c̪(ZYOU (Ыn8?ǧ}JFӉJ-eE<7ĬBe.91+%~ <ClHn`_ s4?-xV' R/L.l$Uvt7?3얉J@|'wcz C;g8Y,WJev6N.׷PF<qr\.4rEܺ"Dَb΅~LcRpl1ָk;p,*=l@Y[(5:$PxN@q x7 ~Ftw/}}G'{MۏO݆ګ՗iN%Ϝ:oY9sDg}.[İ]?9[Jz|[G5eH ֱӂ~O2Ue-dp[ZQ׿\ȗ ڲRw>/J4u[쪪̢(OS~޳Лo0G`vYP!K'O@[U$<]2yRQ*y4Eʾ5zhS᾿G먗꨺*,ԗnd|]u צɮf^m;`uTш+R% QST6x Z70&T6;#Kqz߬ˤsjZ/71jMP\˵Z*QHj%VVȊ $Z쪯-6>E ~ jMFr59Fno40 u#Ϲnia*]E|A^';! wfh#6a]6A1_ޖE3ghI+9dV@ Ϯ$Teb##wЫ.zi62k!, uU}T9u&X|w\l݊<.֤.@JDmUӉ*e8Kg]R;||; ?ovf/#M[-9AaY2|*{X]+ToV (_e5461BE_^l(Pj4-6^0$J]mPZß,ۗ]L]y%KIzWFһw)VR$>O{HSZ(~Gaf7Mecd[_md=G'QфD4w:p7[US@M>&ElSrkhogF]AH\Q9ݨpyǸw&{:Xyؓ)'" S'lBP݊ˤ+"oUh8V!ixz§9NoF' ~ 6}w]x0~^瀯wsvnX7hڇ8-_?s\l vj+dUܬs j%e nywԜkW&?92O߬٢x!T`_yxա XuC}n侸3xk76mm[Bv Y8*b[oB9GHǯRh qndQ#yJO r<ua4k 4'0k|vժ=~ \8/Ĺp*I?&F/%ಇAf)*"C;!ElI *,,bnd!&y`Xot׷#Ȝ5a#::M"з膸׬k] yGUæ_uɼy]BiU؆/W8Dr ǙϷ4~`J2Ѵ%df5~|騊 ^n؄ '1koY-AݸN>N E& cgb%g39jQb}n#&N(蔔VT( ]72G5|/ nO5UoxS ~RM.:`v6o05aO~P`0_fdlogތw<ȝBokF<9SdW ^R)ϡNq~FG)JԎ `uZpcQN6q^KDgƋ/LDL9M ΧpI~~mgc<-p erRwތsRr^ʸD'Q Ts1Y;$™On2?`Bbfx j(7Ilkx>J4QL+3Cz$h?6&_*؏?2ڏ=t<<ºDn}NƺsAےS{e\sϜ{P׀ߑ%dLh+»Wܵx E T,wW (Ck^5̧3 " *C-ObZIVT<+ E_=͛AK/8"/^lN,/suri^{Ek(x9[_F h6qP:4屨R$ V!a"RWV)x֒ ɳȟMelЂ\iBWyt6{5`nEaK:‹^@7Q^m[[}"Pf5*)jjѯ+j%-mJ%|sp9H=Xoܹ\Q2a/0 Lr(@2e\YR"6}Ie$F./'1%5|Iu1y"ʗF2X`u<:;*ylMT|GXhk>??)'UVxkEI*JVU%~!@ztSYOTR 痌$MFRƒc{kjE0GPWmEʲBU)Wv2 +⫐F:tU6YhjOR,񽹏t6^F}AhX}Z_R!SFDgvC4ﱷx|u-qí$hϡG 9C&(Cޞ]gIȡs[!W#وne)v׳*ۆ~R+ :WJ+)+M9,A(ӏHv,ĕ&ʊx+ngU(2DoreɊ22iɋ;se*/FZ \YTwse)5K?ʕH["WVxůr8`PWfqf,lř-8eg̖Y23[fqf,lř-8eEȕY?ԄP#(0JJJC]h|& 8r/1(uh V#|CKAij"h Z1IA#:JFAip_ڬñ1, J٭vd'㇠h!F'ðx*3 Q"C, s׆ 2$8I2* y3IR j /Q0:Qr\E cb'qiːixhoC? \DGIY9B G ({ A;:lA)M#<% X(|.rHLq"Qp'D+ Pq "F8]DL,)b)5+ We|V8.PLFeL68#Yع=F[gehd+Ntk3vVqNv8W"ir+Iv2a\3,%I!ckl+YiX6):)X j)Dlπ<2' an|6sxv&`{T9́6 (ѹ^}^ n1'ۘ["7 Vbi,npFV2'k "V V`V89OηgoN(Y$x-^#<`6ZdFSW, Vg _Z'HȤδx0O p*r 5ym'i̴Sߊ=>]о6ςb;?XV4\8oU,EW&q|"w>?qiwon7#Mrgڈ6fJѡe9[f;c!+l-Fm)ge#Dj5\_iE4Nzggj͇X-u x 왆~퇚h1!!M5#c=K| b6Ǡ/|:H&H {jG{k胚)!(ϭ,Pd%OFp6 [AB~?HcY>9N#38![v ǡKdf#2 ~VʶLs{0#@Ry >~}=`$Y!pd?t7a![R#`T1P,vA-+#>5It9]G!8@ZyY $rNv@'xXdadOqފ FK0|MdGZxn]gNtӟf;h8H%L_"HDxc1&]\J`$I;\2V"3ZOXb1f‰$>=743C%P;X3gr)bb,$Lot. b 7"IL* GZ(aV$^0If$S.&0|d|$NFWxdH:}Xt.ct)%]`B:M/1չt,$0n4LAtdx$r04 W4Nٙrp VY^+e|u9HtbV zkDWB43i5pq+EI@4=q05)f9_g«Ro _@N@d4< 5hN@H!̎'Jc#kP1Dl LBXm&nw=E:,'`DYS]pG#)jJՂZd"^JW:ε5r84wWҺ3^H)il5J ncJ, 9*@άMjLtؙhj,J2 {$!k$Mu"U>;0D2SX#ط1N۱}chx)54Va2lpXm"|DQ1ͱBd,EiBO2 D<:2Jr;֢'+hȑH.:ZL-v\{ &W <;ob(:XTla&Bu|'g̠r 9zqop75 2S ݎ0$cP L3󎌐S} |/0?wd GLw;4@ @/AҌn7@` SܙC|웥%#[R 2CbRbK{"d)>%mHDҮs .c>H088=8^P.D2CppX; pH!i?s qL-#p,8G/6@( Cpx?8G2iqg{"8H!pT q!MpXŀpD8v<8wc+dD&q82"S}u`k m |.;  -"ь'A;64 "~:]܈HDؽ_$QCd<]LNn)8 fcl6:"Z 57GB߲MM<"C,6IcHxv?6"8g#}cD",ʼnDqx8aɄ|tD麕G&8y,D Cҝ'S!2m(B. C Ib(DB19Q9)$PA$]Oit\x #"uDP7*)vTRvDRdLXR""#!2=)h-'QI@! *JS Ag iDAT1Qq׉ D0 CX~"HX,>?44 ٵliĉG8q\0"!-r$ F!& kQɠ ÍD5Q| @-#~Xa.ԄDߛ!x掐a|C;G9A8F&x,⒟O!a(b)DPR!/xSN4>GhTn*CZb,#/*f3J/m嶆dd_0"7>=EneK#ahln<kW+jȠOi+*~P4'IHRt9 ?uwސj_ASbhDn8 HqschK_x"D#!MJ@d*bGjqfd@p?'b_4*D!^0E[P#n$!Ke"8?F#C4`o2 xp苩A72"SL|k!:9Є_H8#)D|:BdaL1 hW17܈xpK4 kmQH@щ'X:j:;7GQ?JGܣ :R`);٣/H]O`XRfSJH_MI#Z9L0RIQ)63b( QdHXd2j)WՇExiJGmut΄Qc&1gM(h 1Mq\+ K! dq1DTUu>!S7ʖbrn_ qq, ^:v 'F^`1ZQLR<]dA]ʔ%$i_HXS V@P}x +#8܏zH4Y96F,C㕠WO#dt8ELMxjCjb<oџomc`meœOH'*~ Bj]T8]۹mY}|;|[61y ;t#t4=*М]uvwI|5_8Yf%_5-x"V;Brb2jRvgO~!Գ֛cvԵPl/it (?\r}\'2I.<;;Kfghק ؿCĹ新X6+wS'oS+=V8ns&ne`q` ! P+I%2;nzmaW~u7f.D:^$Q7xĖG-[r) iwv6# sy^yt-BoFED0)uA؝H@ A^ۏalٿ| ? 3ixd t#q,UY[x1Ş_wpsvlTo~Ӫм bp_ ikZڀ4g.U]޼0'2rD+2$xIWpvK|h)V7خ=քءZឤjܗ}Ŝ|ݙYo,u%͌ƒ'>KWt؆nPYyf&sז^ ])hh͍%*&-LE+v' 3ȂDDXԁDh D$Vhŋ^y|kP0y3cd`3E8Rר!NghPi{+UoN׸BLleu޺6QB i=Rϰ}}Q6ks 3}u҆;T]}3)KWɛT][Y{m_OS+.(dUm,K/wjmoFv3WkQҋ4;MJ)o?d{3vdTkbN_q:# +T+w4 "qp3 7cّ TܸpxgMU- adK x6L &N-xE.K>R$0f0S/ 6114117` fo}}#CO!> dcc3!G!*FA0]<L`dz!:0 BR\ 6q(o8Xr 8ImyK}+ze>׆ ;W]9{&DFgnLeKإV!%o1+3r(4Q4*̇Oz,íy;܍kN]U(}ԨDaơĭ O8qNUI,$ɦ5(wߋ.53~Erhԡ2[eZ0Yy`JpVڒ6|ϸm.jh*7AZ?(`Mwkgͦ Te%7V_a-w~?K~)dR{j*pCVuoeE\`mm/:h|R$c/3bA~Tvr73uohӢfЬIgWlv<7?}Q>mxOW6{ȮmHk {,+T ZpEfTCvcI1S\q};h٩=,uu8pVͯ T%xS۪Sn{W $7$@h~_`pJ욞4eFxO;)cLY⸩#n. L Nwպ$ư!l72M@pgE).S|+u;qEWw]bu75^:|d$2tmCyJW?__*$Yݟڤhy ڃ{R_8T^&yy/k=u-Mn~ey"y%'8okW*?xO><{;#YOn~xx Eo)Ut!oHö}^q;ķbF70M]=(Q6yiB/jh|?9 KE^]"[Q /&RFr,؜'nH.z:181uϊ' |zS(srRⓎH ]E`-j7XP&q K51r^at֖U_q2Fb'L7rGqƕ;ޙXs~9Y;kS 62^w]A%4lwm_t|דmk e#m½9SC~gRﲜ= L-|rRV.&(pZK&*꽽ɽ[f.콼6opK|Udd_2.puzlJnZ~^O1b}f);Ð-s\)DYO}u/6>x$sZӣhfK֮\^^А7oX*8 sϛZယjY/.}oҾӪ/p>^keo=}NXEf$q(ʽ*MekS -` fA#`҇LIc6ZdH~"=w`܁_åtOJ;^|w]5oԙ/V;Od.&Еڍ'Y9 sTl ^nz]sY%S3W\g^p/>Q8fsu7`ۋ,~FCR:~D*aFĕ|F 7ߺgVvZU9q9խ}};?>y4穋6ʿ+[$TŐrySX-T5Vczq)?\%o߼2-cej4/9MZi& fߌ+U~(畷ZRyV]hrK \XGީRNWUV{} {ffh:!@lzRC{\EU7O8)֋9tdɵXdҔɏ8,ln鼗6;@|#yd2X<]qEXW2ӭ/<|yK=^)Nn'&;>ZXnJ`/}}4ͭ.47KsH81W'fp1tqpbl9:dn|#x"t#Cc`aC%}E#>>(~:6"F{zYWEw7b;buoFeNx+g^憖zz@M+ϩM+jT3*ߘaV m]\=ۂ;c3w(Fgt6ߜPzdҶӱ3H_:x@5PwOL˙ʔЕٙO>vhдM贒4Kv4#Sїӹqj=ddS۸j'}x=G%(а"kZBK&*wxGBQO/\\;;+&j>8Uif b4lo3tX]z_U֧U{+gSK13[D+շƪ}ߣ|ぁs z_4Ή[8|\=pݳS_/LO }xB|wڿyQ`Zj+j#M= R._F4(>{L^UEHȚkK".2RX? 8q:q?OE$?x?J4$d#9o!t2-@뷿T`@_l_jS%7Fww?35-v-{jxKaϺ/wۻ? 9;1u WCu}_6rEI߿?TZ?܍}IcW}Iħ[i>X]v.!vLrav/m Y؀ d͒]Ms<]YWA\3} *M8ٴui>/g ȃz4 M&=iwMB!m[ X-py#"S&SsF?h7'=aS|B?86 gی]q8h'=ur˄+l,ty-cmJK5񎁏6Ot[3-7hҭCJ:Go+^ܶ ~srtwdx~L[rFmAlGkyO!U C¤Tӧ7.[k{iX#G7~}ki`3iE[Lc;(=y?iڻ.#}{ _!dW|̾=YJ;yG_82_JmKtemPղ7] .? endstream endobj 1143 0 obj [ 0[ 507] 24[ 630] 87[ 532] 90[ 563] 258[ 528] 271[ 528 412] 282[ 528] 286[ 491] 296[ 316] 346[ 527] 349[ 246] 364[ 480] 374[ 527] 381[ 527] 396[ 352] 400[ 394] 410[ 347] 437[ 527] 856[ 267] 890[ 498] 1004[ 507 507] 1007[ 507] ] endobj 1144 0 obj <> stream x]Mo0 9vϴ= $~$4B`nj$@uSTyY68LNo KR+[eQ衯L7GH|X8m.|uד?Ѓ> stream x| xT{dfLf$!d"%&@$DͰ(R0QlZQQ' ՂU֥ 퇻(Zp;{{|y/g=}ϻ0aÆqrٳ,ކًg6trjg.oy/nQyāw`ލT6-;s{)an޴tH؉I iܦg?P{.|Gҋ:Y1Vtן KiHx,&O2W2P R,sֆRͤ  Ї$jT0Zu5I na[-d3e$ 7+aA_CrmXe<i:޺5ߜk:ŏVkκ.7MW&rFknwOr:|ΥiU UVEWnm%j4\ ʾa7$ajoGBBH $TzZ'D_̊vN\xWdg+(7MX%xee1ZK$lG(Alևln1.F4:sryC2A!MyZ/ܧW̌iE`U& {A?B*ǃ=VhI`8nPe%YnPm{`VbruAFا =#7P|j:n/1+_ ύWOUOZlmzUxX-_^%X&r(JKȬQI򜐤CQz*4uzg6W_վj{qnOՓBZT6 E6y_ }DC-uH2°v<=@6OZ{DA˾yrm%aX]{*z)ea &(T' lFyCkt=}fhO.-@?<;GG=<}1l(l Д6f*'^)e| ɴ=H bܣa(NŞ5j L0}\a:1}3s센 =&OkFDK1Zʃen>Y{;Eۙ4\^{qkLecq4ƦLH3{cۣmqO@q8~>A`Z^9Zn~VcZhyZs|'|L>X!J* dJ: !b=j|p5 Kj6&ofZD tktZ-@x2ؽrudVdtlBLa;2OP;5#j@zVZ=^TG/d>A:Ԑkwf>0[ԉjH]цy8ijT-,2֣2\V+q"3Da5ޮgkSu_Ֆˊ./ VVb)*l,Im7ImCR[6Pj˕r6Ԗ&%K6UL8^Ӊ:^Gu"g~D"r^+,TfFtFA0ՓP=j/Dh0VCa`:$E&AivB ݌armYm,<8DVFn\e!5rep)vJ56'a5XӕY=6Hr]0U"uz @ aPV+$G %ab؃x 586ƆfeC(l"ؐ.?6`׸b+VDWecť?c2V``vI஢r{ Px?vNxOcȍ8q+Е\\fAA.>de1 /P,E)8[  | +No Q4mx' . D p j`{df p'?E>#Ud D[Ng5KXd-qC?tCm!Gؿ wx'ߑmt.]Ir')" 7U; p9ѓx ys ً xS&ߐ)d\/#As2䡑w)`=rh{_lu B"N[B$%#$HvDKF~ \>wHF: 9 T Lft#7Uyr4ja.|l኏ħ ކ?G9؈~$B2L S|&7;II'y'_"g`fEi:Χh=@ѧyFߠo[Iҹ(n:kVs7q"?_<[' NaS==DEF/.C'MI7I륛}Ёю^t:^%w>F%Cd'1q.XAi) 1"=L.8?DvSI[B›ɵ|7YYG?c6!\mdb,Bi6H#` Ά~vXH\zM+/C5&0=FIr/yOT̂nxOz wͣ}y&INB?E0.Gps p-'.Nnoap;&׉[#R]}\P'E~3y_@Qwܔ|r?F\ڻ 9dGqh1kiwѶɨUhFuKԘ[K$XHJ G"L@?CL|J FSr-9Kr[' lG;iFUiwXBR(úfr% 3w߃?ξJ.l pf%g*Qʩ<_CE*s<ѯRBoJ,Wq8CD~f׮s$X%4 '|-ʗ[ZvkOqI$+|NA$B\'z  d:w"BT?9= " uR@i I Ox"dPB*x@(9F3@x2{%pne?;F9 eRPKYK,dnT[FO3Gb8<$֋ß9~,q2qk2ҭk.@1fk!ʺ1BNJGfZ-^BɶGȶp9r~V/a2%JJ":AP\87 7* 3"oչSG1(4[ d(R`-.5`)]6M)U\+&V]Rvޚmټ kI kM\HD*H2'3Jh=ӶVvť}Rb-Ay2^ G8EyzxH+_}vzxFD'm m_ۻ?䒭W-{L򧡶uwF9=Hdڂ6fbJTOHQ>@PAi|0.!S7!E )`1CQm"(P5ME΍U,ʛ ¦~Hr}}ߟOy>n(B,HNCڵkr#5 {zm?}хapTw}vw{wnܗlecOuXt`/t7Ps1 1 EIl8,yΫS(fj$)t(KZ,m 2D2dNYu@<1'5ʗĕS_`=V=˔ͺT&栝+$h McRI)E'7>\ z/?-owљU1L/V`,Dppw@V:*`ܙY.VblbH7膀Wp- ) . }*MkuxV`TdY/Bd!}ˡ!28]v!&;~ieԤr OΐP@~ME!{66 &ݥ$̈́5z&kr5J}3kK¾xPYv#z`3sQ/ula)\Y6)O3(..&uh{뗡;EMa(W$kQz13?8ݧwd7Bۊ$ۃ? lQ0HK3 tu6bfܑA)|O$G|bAF璳9Ξm2Ev^ZYA$%3Px &xYf~{u?M=+Eoc4Jlj  //ϓrb%um{Y~YtL |tI9I5yzaӗګ0(2 ,MzJ ƗLq/)f"GH!i W +Ԩ7jax=:BP,$1CK1QNm9~pnɭs.lq_מ%Cw"O/0e#t-S̢7b 0'QT#^9t#IZne4_Z[cyrTw"Dmh )tQrRѨī(3@/_k)DQcqF^130.5FcN`U +D֜fvCwňVre>V[1cYehP#o\B[9 Z4)yA}3 5F0 8~ yV}|wyn9)yDŬ30?5kʖe;lM-6DtZTwр!EQS\0N "s#Y ePIzf3ފ(ez$-eE㚕 ] +<sRA?c\ifO=/Ӧee|`HNzז^'h-1TPj쪿3E,? [sq"x|ͤ(_"+=.ԩ\NST]!kպ#c(/^8"GN&$*رL!1)B$`8/f9Fkb(ȓqx~2M. Qz#g- @e)q]ߞT,RbV/+ ]lH'Vc1&cQ|޾ fnܑ[̟ϧY0չZj^+]qd,p:/Z(K*)9jDj2X2${ a^BHf,4r5ue7r-CJ !E" GE'$ڀ1V幘n TbJ"U>as䒨PQr6's#$!~ğ\{oͱƖv{Y76T;,(<}w^|gq#o?t<#14.O2/}GwN3bRHGv"̔3P}` a/̲1` X Jh. / yԪ~qPh_6^VAQ{T)1PwgO|`bQ93NL\5jE_Y!CR"/ FXxnƽpOo`aS, +q[\{ |ڰeƥzS|q'%R311R 闠Kϐ G^ABLj=[jJ$:)i4Cگq3kt̅X]vY8q'FJ4QX|9rN(htgEfO9%5-Oo7nAv_)ybShF0vIUМ̵~KGtȽq M5yy S &0ӦMC7 WhÁn[pX:Ku|kO\Hu}EU*.1(%vpm7sΦE#!bCAK/$d8:Aq:/{_T{ԦM6N:д=i m;t" ii&) e }{ns֞^^k}Ñ"2|Z=\{aϰ"tLя"ABEهxPnRpK w$"g @! d#NwYY~B.N«szUPiqKLH?+ W&Ԥ(36k9zB0C/t+E:J:֡cJ ;`W*tB6^VdϜ< ($$)C.$B ̋`G##2YBQ1fQX?w ی}--6RԉQ&Ξ1qقX|pZZBl#[9o{ ަ+x+0H[#P:wU͵*.o=*k(uK^=ލ_.j5ZM8Dܼ(hEg4$<6_PdQ<$`V@yP` -I (hFF}G}tL6PҵSZJ0(\~r{J7hG 9l-eAuWċ({owV?<3_&+3uYuk^h|Rtm]ޠַk;N(7I˵dԨ4VƲii\ l@"pf * DɁ(4*TtT](:jȑ4@,| Y)Q*M YjIaOU@mȀ 1Wtxx>ؠ):l<0j%[5wl-:weIywC[n|M9/Bt/j,x7kGFB4Zg*%%O^:dvehۑS0u@NYd(GYۤR1؆< ߢ*du&- QMGE1*ljrn P`/6$ģ x+Ipc4Zx|b'Ŧ糔t ]} \͂ߋHNaYn"'E4-BaT+M"7F#+GO=,%’H'HZILVb}uAW:}}柢/mھ]8?;kZL7zMB*[L&ŢHQACK@%C-TLp0E"NNNf(BJKdUp2靻E~d/G<| qSXEvrO(,IShb¹{6>뚦uƏ?rSR[rڧE"eYyru ̈́9cԊꗜs%$Gp=\knT&(w/=Kw,hu I T(i`LO)*?/SKհAۺ{)b-4ecsXq(-:xΫ>u5ӯSyF>rΎ{:{Kf^\ QԏTN)[ID#$ |$BP'DbI"?D r"J$}ѣ0CGMѺXJJ ?SB~]L+痢W~_Ap@V `AiCh$ǛFE!,hndO,0 ޱLZT(IB -6?T~~)C~2# &gPT" P Jtg0?But'iV;?S E VIA>"җn`ҧd#l<"P6C q(v2$$T;?~EW~7Aq+.wl_ ɬgFП]5ы)I!3V3Kt>HPKX#iiiMa\D2Zදb}_M+w}`q{5r/SbJ\W+Z/ܻ.p.ˏ /?*MιvF-Js'<{0=i0<#yy`B@.t;A'(F 'fCYb !h`Qrudr: mXSd/OXଛ&|So&Dg1(&SR7U,1f5?VfhIAJ尲êfo vP i%(8~#%S)ps+}j9=Ba`.H =?2ŽomTK6|R_tfGl7L-ܿOC>Tt5<-o `,yc<-DOh)?Ӹ|/Oy08Fh )Ӹ4}py<҇оd 99ß99ß99ß%T}$2*R/ݥ^A^(Wli!7Bˡ'yR]V`)4OyJR=OZ兡 `^-iwBr\4Qz iiܾБ^FzMXyNxgOc>=?ӸNB>y!ㅿ>^zx߫׼q2(PY@US͔唝HI@W#[H4ɣJeME9I W3 &RrPj:pqʀ{> O tq,*"z^V t 6£jێFs\2:=:a,DMi$X0T> uyM2J6}qxwB_)V&(0:FNI 3 cbM%reHJ3أwHKN#F"BkoaF6xX8 `"5IB{PL߻}-A: Fǖ>Wrڐ߲>Y*$ mmFH^T䱐*HM3`4dn%9H;1P9T6!ӡ ֒ӷ"7`̐E00pyىuaLf"k_M|F6\|Hx Z^D|߃u%Ԟ|m\NɛOռȍWn: N dN^S YSVz+/PI>ޘ;'ÿJpۧؾܶ# ܣ_/p/pxn x M5l˪o_986aiݳ[bG6ym?3=+£ Bְ[qGFDK7ʽZMfHho{+!xv0*xdbHƒo/$}ux2HK=Y\u|;ܣJj;ƫ^B)9Ih[R2[rFjw)#g/is< @2å5pv2~љP.:"9וkka hG0(!W*/j!*g!@amHG+n 6UA!WNO^9Y^zcWG{ZqJf\Z5?zGQ%HPCk dj6fk[oDaaٺxB!li26Fj'&CfNn{]af[Zf6YivGS:ΥCiH%fĂa67^7Z{-pv Cciº$p^^\&“$ЫadLjkh1ƀ(tgVm#3n;Z`NVfȹI{ixGsN& , Œ8b=QEّ m}$l%wx&}^Kv?@_LV[O89zE9ZmjaU3s)3lחH|*nȵlw%%K.ʐ Esi4~X"N1, 7qګ$bSjI$4f o%Fx1Nz`ϑg:. ycwfOlЈZG~~ms<+HD W'SP#+F⌏RZgt6[lM.M`PͦVͤb#pTi&eXO}՜jp[ۘ<6*TY!ٙ9!eK$gO)ȫ,$\҆O :Fg-Lf M-ҰAlP 2pIn 0Qn@AFZsA7y}{>ع^Lshżc\wDmhX?\򶥏7LX?Rnbm7*BݪWtGX:S{>q.JؘqdΟq(V⿵󏏼y>Tl`lIm¬}7~,ɝ*CKc6|ˣ'薓Z۔yZiW>4 =/hU\5g?W̿ckؠ/2}OWM|:$# =2sg'>+oDEc_FH#*&ɚϥ:.sp~:%>a͉Nde~N7kuVϝԵ#E|ÒbG|ӋjŎx^l_+nG{כ̌Dk̲l&9,K7`+M}uwÆ+O<`K/o$}E܂o{e~kLis>rn:\zѻkBN축AEgDڒvkM3맰=Rt|2 pЂ~nJ;*|'_{-N5sWZ!ڠd 1^7ڬg7wfI?~^dK׬<|˹%?9*aꏹA弟 -M3M"s8w3O`.A*rW[Sc՜}0to;W aJX:ZIYa7>#ԑSo}=:97*I~t|!y,iC]6te]Iϗ:^ ->̲0񻅣"[4G]T~1q>f3>q;Θq//./mz#2,B94{'>2cAᄐDO5h2x YީgqOFTto* _|7嶝Ė2DUӦgߍ|]Q<>~pY/}UOە+ -:o]_¦qi^̿6z2ͯ[0Ƙ֘?4dƾ=VVUo7S|t|4S]/ׂK 19iěJ}LXvy 5lhB_pn3mv`FKef:\vՅ};fZM-7ղ8A+!Γ9ϟ˗WU}w˻e\,w̿s=لs~$\xϏތ~C"ԗ眺-S?t(uԱM=j郤O ;:(-%5zK3VfmK>Yt̺gUGzC 5101u_/E[UuY峘REg}Wthjfi:\r»2OGv^~z;vlDG3~nx<˝ps釫B%Bˇ`K(v=o^]rJdu_R^԰vW/uo䋶g*X"uPM/[?yt=+_HdfL߫߶X}?uw]*Âq|`G8[wF~ pͬBpV^a(@F`R,svF<1[BqlEwͧy"xA 몺зBO1kCӪCj 3^ W_c&J bovfEug̖d?sܵ4"+kAO{u^x(ď* *C0*6T +4~i€/,xmDe717\n[ tfln40 ##)l_3ȺښXՁxBώup>팤we>2wݾw$d u0ʧ]gf\y[$bO ? 5rfӆS"I9WdبI?BKsH,idζ*q2!*|~`p )[ ))pM^t uQyjkG @P Gv4nR`{Z/LzrPUo&+UMޙq[윧sfmsW]o^=~_2^4՟S+.}/li;G"`nTBBX-kκ%Je8 w`0Lv`Na?Dl>}JR>OWo2@}3G,/1,Nw\R[.[b" 1SXAh`xk:5K'#vU\DjњfR#~e9$RL@\H7;=ȖzWPxY]'ׄlΤPqHHb|ƹFh2oDK+Arz-g}^(%eD2{`l23^EI^֗ݬx])3r2 B4`]b*>ͿDciwuͳ|q'Tge#WdֆydXǻc|K)GKh x-^cW;ƫcɑ¾|zȹ\̝b)"胄ؑ%~bbB[Z{vOM ѽ-u/ ѷhs@($e  ̆\Y8nٻ9Zz!Um毑 oBfea ?JMVHxÊP%S4z,LLI8Kqb(7RqUcy@NgN- #if ZZ *Wkhvj0msft0ySlXaλ|vGzui&WxqNyG6pP["|B<%J$g;c~`3=*Y D>ƷUrQ7nESB&ϵW]D>FDOaq9w=֝ \mAMy j[h5 ˘>r{|&)JvLanVփ Э@4:=5BU۰`z蟠d[ {_N$0uP@؈#Z9$\G::Ldg"K2ׁ,bٟI%4IRKlW*x=G0_Vw6@Wk=?yKx'%Yj S 8uRiE/^ l Y;sfcQCZvDXcށȶ!EϾX3~.Nͳp7W1YȌG +ycu>NwJY,G+5m'I endstream endobj 1146 0 obj [ 0[ 750] 3[ 278] 14[ 584] 17[ 278] 54[ 667] 66[ 556] 70[ 500 556] 75[ 556 222] 81[ 556 556 556] 85[ 333 500] 88[ 556] ] endobj 1147 0 obj <> stream Pierre Peterlongo Microsoft Word2021-12-03T09:55:35+00:002021-12-03T09:55:35+00:00 uuid:1A494411-361F-4BB0-9DFD-400C2A275362uuid:1A494411-361F-4BB0-9DFD-400C2A275362 endstream endobj 1148 0 obj <> endobj 1149 0 obj <<1144491A1F36B04B9DFD400C2A275362>] /Filter/FlateDecode/Length 2509>> stream x5UG;E@QnN@nN?Fo;<<=svvf=;--?ӧ-- YjTa GoL-̿z:+ \`C<)녅-,|Ha= ΄aX_\Z|aKq^(,qD} K (,ݾ̸{ ˎ),\a^֟VmIaɅF6> ܅MB:a |Zݭgi|P~a [8[.Gio V)VW㲍1NEa7sإcqaH 'zC?/ sRn;c Em #pᅑȧ /ܴNg c]RT܎w ?s` o /g‹{i酉N$Mr\?{c W-C[Z5_x0h0#bfL`̆91;\'|X#:a,0A7,űDW, VŲXˣ;VX +cհ:聵6X6F= 6E/l}9 +@l=v ;cݰ; {cð? Ɓ8q88 GpN)8Cp:Ni8gq0q.Ep .h~\+q5#q=n(܌76܂[ ٻaU>܋qFW#7Gރq'£xcp?fR2vpJo .[N\󼿍?1|/1 |o=~O;~//?1L+B|fAc G)mU##6-@G0#nf9Eh#Hr3S5},z$G#no7+T|Q"(s=2G\cogtT;IG(ld7Fv#n45  FSn45:ٍFSn3ٍf`u\EoHrt3*fjYd7"e2GEQt45 1Fa#Q(l4:Fa(l6_ m45F}m5MFh#Qhj6MF}hjnڨo6Fh܈fL7 6i㓽9FEӈpFCӈi3`h{Nyʜ'#u3jxd7݌nv7Z4bתFr5zFo#fނRF)Q(e3SW]F!= iGo#ۈi4ߔ2Sck.⮁_6{m5rzhI[W#OwPQh hj}=+cf̂Y1santļ0?NKm[BX"Kbq,n+[2X]DzX+W?VoVDwհ VZ{`M5.:ʇNIc]{bcl6E/Eo%akl` v ;`G슝 nTv`n~{ao}q a0A8Pp).Sq8G 8'D3p*N8 gկ~ٮ~:1 c(F"\ q.ŸkuXY6YY6#+=k^пTo}kؖ{#g\&܌;qn춌= w!<#8d|O)|/-Q _Y(0 ͸[]!WoѼ~?/#l FSAu= e@aQ(lD8bFL#Qf6 FLԲl Hk5+UaEۈpW#QѨhT4* FL#f4MFL#ӈi4bZ t3|F>ۨhT4*FE#QѨa5*F>#Qь.E$̨hT4Y 6Q FShj6|*e$2 ݌RF"#hc2Koeo̠ۙ A'UWn~) K+&΅I >.<~53<1144491A1F36B04B9DFD400C2A275362>] >> startxref 604653 %%EOF xref 0 0 trailer <<1144491A1F36B04B9DFD400C2A275362>] /Prev 604653/XRefStm 601937>> startxref 627816 %%EOFDiscoSnp-2.6.2/doc/discoSnp_user_guide.txt000066400000000000000000000460471420021152700205530ustar00rootroot00000000000000discoSnp++ Reference-free detection of SNPs and small indels v2.6.1 User's guide November 2021 contact: pierre.peterlongo@inria.fr remarks and questions: http://www.biostars.org/t/discosnp/ Table of contents GNU AFFERO GENERAL PUBLIC LICENSE 1 Publication 1 discoSnp++ features at a glance 1 Quick starting 1 Download and install 2 Running discoSnp++ 2 Output 3 Extensions: differences between unitig and contigs 5 Output Analyze 5 Exemples of close SNPs and indels 5 GNU AFFERO GENERAL PUBLIC LICENSE Copyright INRIA Read and accept the GNU AFFERO GENERAL PUBLIC LICENSE. See the LICENCE text file. Publications R. Uricaru, G. Rizk, V. Lacroix, E. Quillery, O. Plantard, R. Chikhi, C. Lemaitre, and P. Peterlongo, Reference-free detection of isolated SNPs., Nucleic acids research, vol. 33, pp. 111, Dec. 2014. C. Riou, C. Lemaitre, and P. Peterlongo, VCF_creator: Mapping and VCF Creation features in DiscoSnp++. Poster at Jobim 2015 Peterlongo, P., Riou, C., Drezen, E., Lemaitre, C. (2017). DiscoSnp ++ : de novo detection of small variants from raw unassembled read set(s). https://doi.org/10.1101/209965 BioRxiv. discoSnp++ features at a glance Software discoSnp++ is designed for extracting Single Nucleotide Polymorphism (SNP) and small indels from raw set(s) of reads obtained with Next Generation Sequencers (NGS). Note that this tool is specially designed to use only a limited amount of memory (3 billions reads of size 100 can be treated with less that 6GB memory). The software is composed of three independent modules. The first module, kissnp2, detects SNPs and indels from read sets. The second module, kissreads2, enhances the kissnp2 results by computing per read set and for each predicted polymorphism i/ its mean read coverage and ii/ the average (phred) quality of reads generating the polymorphism. The third module, VCF_creator generates a VCF file from the kissnp2/kissreads2 outputs. VCF_creator may use a reference file or not. Quick starting Download and uncompress the discoSnp++ from the discoSnp github page: ? https://github.com/GATB/DiscoSnp Compile programs (for source versions): ? sh INSTALL Run the simple example: ? ./run_discoSnp++.sh -r test/fof.txt -T This creates a fasta file called discoRes_k_31_c_4_D_0_P_1_b_0_coherent.fa containing the found SNPs and a VCF file called discoRes_k_31_c_auto_D_0_P_1_b_0_withlow_coherent.vcf containing the same variants in a VCF fashion. Get a local copy of DiscoSnp source code git clone --recursive https://github.com/GATB/DiscoSnp.git # compile the code an run a simple test on your computer cd DiscoSnp sh INSTALL Getting a binary stable release Binary release for Linux and Mac OSX are provided within the "Releases" tab on Github/DiscoSnp web pag (https://github.com/GATB/DiscoSnp) After downloading and extracting the content of the binary archive, please run the following command from DiscoSnp home directory: chmod +x run_discoSnp++.sh test/*.sh scripts/*.sh Running discoSnp++ The main script run_discoSnp++.sh automatically runs the three modules (1/ SNP detection; 2/ read coverage and quality computations; 3/ VCF creation). You will provide the following information: OPTIONS RELATED TO VARIANT CALLING ? -r (read_sets) file_of_files.txt: File indicating the localization of the read files. Note that these files may be in fastq, or fasta, gzipped or not. This is the only mandatory parameter. See the dedicated section describing the file of file format. ? -g: reuse a previously created graph (.h5 file) with same prefix and same k, c and C parameters. Using this option enables to reuse a graph created during a previous experiment with same prefix name same k, c and C values. Else, by default, if such a graph exists, it is overwritten. WARNING: use this option only if you are sure the read set(s) used are the same than those previously used for creating the graph. ? -b branching_strategy: branching filtering approach. This parameters influences the precision recall. ? 0: variants for which any of the two paths is branching are discarded (high precision, lowers the recall in complex genomes). Default value ? 1: (smart branching) forbid SNPs for wich the two paths are branching (e.g. the two paths can be created either with a 'A' or a 'C' at the same position ? 2: No limitation on branching (lowers the precision, high recall)" ? -s value. In b2 mode only: maximal number of symmetrical croasroads traversed while trying to close a bubble. Default: no limit ? -D value. If specified, discoSnp++ will search for deletions of size from 1 to D included. Default=0 ? -P value. discoSnp++ will search up to P SNPs in a unique bubble. Default=1. ? -p prefix_name: All out files will start with this prefix. Default="discoRes" ? -l: remove low complexity bubbles ? -k kmer_size: size of kmers (default: 31) ? -t: extends each polymorphism with left and right unitigs ? -T: extends each polymorphism with left and right contigs ? -c value. Minimal coverage per read set: Used by kissnp2 (don't use kmers with lower coverage) and kissreads (read coherency threshold). A kmer is conserved only if its coverage is solid in a read set. For being solid for a read set, a kmer coverage must be higher or equal to the threshold of this read set. Default=auto. The minimal coverage may be either : ? Equal to a fixed value, equal for all read sets. Example: -c 4 ? Distinct for each read set Example with three read sets: -c 4,5,17 ? Automatically detected Example -c auto ? Automatically detected for one or some of the read sets: Example with three read sets: -c 4,auto,7 Note the if the number of provided values is lower than the number of read sets, the last value applies for all remaining read sets: Example with three read sets: ? -c 4,7 applies -c 4,7,7 ? -c 4,auto applies -c 4,auto,auto ? -C value. Maximal coverage per read set: Used by kissnp2 (don't use kmers with higher coverage). Default=2^31-1 ? -d error_threshold: max number of errors per read (used by kissreads2 only). Default 1 ? -n: do not compute the genotypes ? -u: max number of used threads Options related to VCF_Creator AND to the possible usage of a reference genome ? -G reference_file: reference genome file (fasta, fastq, gzipped or nor). In absence of this file the VCF created by VCF_creator won't contain mapping related results ? -R: use the reference file also in the variant calling, not only for mapping results. In this case, all the kmers of the reference file are used for calling variants. Note that the kissreads2 results won't show read coverage for the reference. ? -B: bwa path . e.g. /home/me/my_programs/bwa-0.7.12/ (note that bwa must be pre- compiled) ? Optional unless option -G used and bwa is not in the binary path ? -M: Maximal number of mapping errors during BWA mapping phase. Default 4 ? Useless unless mapping on reference genome is required (option -G). Additionally you may change some kissnp2 / kissreads2 / VCF_creator options. In this case you may change the two corresponding lines in the run_discoSnp++.sh file. To know the possible options, run ./build/tools/kissnp2/kissnp2 and/or ./build/tools/kissreads2/kissreads2 and/or ./run_VCF_creator.sh without options. Note that usually, changing these options is not necessary. Input file of files format: The input read sets are provided using a file of file(s). The file of file(s) contains on each line a read file or another file of file(s). Let's look to a few usual cases (italic strings indicate the composition of a file): Case1: I've a unique read set composed of a unique read file (reads.fq.gz). ? fof.txt: reads.fq.gz Case2: I've a unique read set composed of a couple of read files (reads_R1.fq.gz and reads_R2.fq.gz). This may be the case in case of pair end sequencing. ? fof.txt: fof_reads.txt: ? with fof_reads.txt: reads_R1.fq.gz reads_R2.fq.gz Case3: I've two read sets each composed of a unique read file: reads1.fq.gz and reads2.fq.gz: ? fof.txt: reads1.fq.gz reads2.fq.gz Case4: I've two read sets each composed two read files: reads1_R1.fq.gz and reads1_R2.fq.gz and reads2_R1.fq.gz and reads2_R2.fq.gz: ? fof.txt: fof_reads1.txt fof_reads2.txt ? fof_reads1.txt reads1_R1.fq.gz reads1_R2.fq.gz ? fof_reads2.txt: reads2_R1.fq.gz reads2_R2.fq.gz and so on... Correspondance between read set file names and the Ci or Gi values DiscoSnp++ provides a file ${prefix}_read_files_correspondance.txt (with ${prefix} provided by the -p option, equal to discoRes by default) provinding the correspondance between the read file names, and the read sets. Given the previously provided examples, this file would contain: case1: C_1 reads.fq.gz case2: C_1 reads_R1.fq.gz reads_R2.fq.gz case3: C_1 reads_R1.fq.gz C_2 reads_R2.fq.gz case4: C_1 reads1_R1.fq.gz reads1_R2.fq.gz C_2 reads2_R2.fq.gz reads2_R2.fq.gz Sample example: You can test discoSnp++ on a toy example containing 3 SNPs. In the discoSnp++ directory, type: ./run_discoSnp++.sh -r fof.txt -T (use -T in order to obtain the left and right contigs of each found polymorphism) Output (Results with close SNPs and indels are given at the end of this document) Final fasta results are in discoRes_k_31_c_auto_D_0_P_1_b_0_coherent.fa file. This is a simple fasta file composed of a succession of pairs of sequences. Each pair corresponds to a SNP. Let's look at an example : >SNP_higher_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_l ength_168|right_contig_length_764|C1_124|C2_0|G1_0/0|G2_1/1|rank_1.00000 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggc cctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGA GAGTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagag cggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgca agaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctg cgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtca acagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttaga ccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgca tgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatca gccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa >SNP_lower_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_l ength_168|right_contig_length_764|C1_0|C2_134|G1_0/0|G2_1/1|rank_1.00000 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggc cctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGA GACTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagc ggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaa gaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgc gaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtca acagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttaga ccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgca tgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatca gccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa In this example a SNP G/C is found (underlined here and indicated in the comment). The central sequence of length 2k-1 (here 2*31-1=61) is seen in upper case, while the two (left and right) extensions are seen in lower case. The comments are formatted as follow : >SNP_higher/lower_path_id|P_i:pos_Alt1/Alt2|high/low|left_unitig_length_int|right_unitigt ig_length_int|left_contig_length_int|right_contig_length_int|C1_int|C2_int|[Q1_int|Q2_int|]r ank_float higher/lower: one of the two alleles id: id of the SNP: each SNP (couple of sequences) has a unique id, here 3. [FOR SNPs] P_i:pos_Alt1/Alt2: Information about a ith SNP (If more than a unique SNP is found, the following format is used: P_1:pos_Alt1/Alt2,P_2:pos_Alt1/Alt2,... pos: position of the SNP with respect to the starting position of the bubble, i.e. the starting of the upper case sequence. Alt1: One of the two alleles Alt2: the other [FOR INDELS] P_1:pos_size_repeatSize ? pos: predicted position of the indel with respect to the starting position of the bubble, i.e. the starting of the upper case sequence. ? size: predicted size of the indel ? repeatSize: Size of the longest sequence both prefix of the indel and prefix of the sequence located just after the insertion. Remark. This information is useful as the real indel may be located in [pos, pos+repeatSize]. high/low: sequence complexity. If the sequece if of low complexity (e.g. ATATATATATATATAT) this variable would be low nb_pol: number of polymorphism. left_unitig_length: size of the full left extension. Here 86 right_unitig_length: size of the right extension. Here 261 left_contig_length: size of the full left extension. Here 169 right_contig_length: size of the right extension. Here 764 C1: number of reads mapping the central upper case sequence from the first read set. Note that (see bellow), the correspondance between Ci and the read file names is provided in file discoRes_read_files_correspondance.txt. C2: number of reads mapping the central upper case sequence from the second read set C3 [if input data were at least 3 read sets]: number of reads mapping the central upper case sequence from the third read set C4, C5, ... Q1 [if reads were given in fastq]: average phred quality of the central nucleotide (here A or T) from the mapped reads from the first read set. Q2 [if reads were given in fastq]: average phred quality of the central nucleotide (here A or T) from the mapped reads from the second read set. Q3 [if the data were at least 3 fastq read sets]: average phred quality of the central nucleotide (here A or T) from the mapped reads from the third read set. Q4, Q5, G1: Genotype of the variant in the first read set (considering the higher path as the reference) G2: Genotype of the variant in the second read set (considering the higher path as the G3, G4, ... rank: ranks the predictions according to their read coverage in each condition favoring SNPs that are discriminant between conditions (Phi coefficient) (see publication) Extensions: differences between unitig and contigs By default in the pipeline, the found SNPs (of length 2k-1) are extended using a contiger. The output contains such contigs and their lengths are shown in the header (left_contig_length and right_contig_length). Moreover, a contig may hide some small polymorphism such as substitutions and/or indels. The output also proposes the length of the longuest extension not containing any such polymorphism. These extensions are called unitigs (defined as A uniquely assembleable subset of overlapping fragments ). Second created file (from VCF_Creator): The previous example: ./run_discoSnp++.sh -r fof.txt -T also generated a vcf file: discoRes_k_31_c_auto_D_0_P_1_b_0_coherent.vcf. As we didn't provided a reference file, the VCF contains no mapping position on a reference. Instead, each variant position correspond to the mapping of itself on its own sequence. For instance: SNP_higher_path_3 196 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=166;CR=761 GT:DP:PL:AD 0/0:124:10,378,2484:124,0 1/1:134:2684,408,10:0,134 corresponds to the previously explained SNP. It maps at position 196. By adding a reference file: ./run_discoSnp++.sh -r fof.txt -T -G data_sample/reference_genome.fa the vcf file includes mapping information: chromosome 117 3 C G . PASS Ty=SNP;Rk=1;DT=-1;UL=86;UR=261;CL=166;CR=761;Genome=C;Sd=1 GT:DP:PL:AD 0/0:124:10,378,2484:124,0 1/1:134:2684,408,10:0,134 See documentation specific to VCF_creator for more information: doc/vcf_creator_user_guide.pdf Output Analyze From a fasta format to a csv format: If you wish to analyze the results in a tabulated format: ? # python output_analyses/discoSnp++_to_csv.py discoSnp++_output.fa ? will output a .csv tabulated file containing on each line the content of 4 lines of the .fa, replacing the '|' character by comma ',' and removing the CX_ Exemples of close SNPs and indels Exemple of a multiple SNP: >SNP_higher_path_766|P_1:30_A/T,P_2:34_C/G|high|nb_pol_2|C1_0|C2_0|C3_28|G1_1/1|G2_1/1|G3_0/0|rank_1.00000 AGCGCACAAGGCGTTAGGCGGGCTGGATATAATGCCGCTGGTCGCCGGGAAACAGGTTGCCATTC >SNP_lower_path_766|P_1:30_A/T,P_2:34_C/G|high|nb_pol_2|C1_45|C2_43|C3_0|G1_1/1|G2_1/1|G3_0/0|rank_1.00000 AGCGCACAAGGCGTTAGGCGGGCTGGATATTATGGCGCTGGTCGCCGGGAAACAGGTTGCCATTC Note that a unique genotype is proposed for close SNPs Exemple of an indel: >INDEL_higher_path_3756|P_1:30_8_3|high|nb_pol_1|C1_28|C2_0|C3_0|G1_0/0|G2_1/1|G3_1/1|rank_1.00000 AGGCGACCGAGAAAATGGAGAACGTGCGCATCGCTGTTTATTAATGCCCGTTCGGCG >INDEL_lower_path_3756|P_1:30_8_3|high|nb_pol_1|C1_0|C2_42|C3_44|G1_0/0|G2_1/1|G3_1/1|rank_1.00000 AGGCGACCGAGAAAATGGAGAACGTGCGCAAGCGGGCATCGCTGTTTATTAATGCCCGTTCGGCG DiscoSnpRad We propose a DiscoSnp++ version designed for dealing with RAD-Seq data. This version provides a way to detect variants located near start or end of a locus and it clusters variants per locus. The script run_discoSnpRad.sh replaces the script run_discoSnp++.sh. This scripts needs a short_read_connector (https://github.com/GATB/short_read_connector) program instance installed. Run run_discoSnpRad.sh with no argument or -h for more information. In the RAD-seq context, the VCF file contains the locus information for each variant. For instance: cluster_1000_size_16 . SNP_higher_path_1369 C T . . Ty=SNP;Rk=0.64903;UL=71;UR=79;CL=.;CR=.;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/1:39:220,16,359:23,16:0,0 1/1:40:804,125,6:0,40:0,0 cluster_1000_size_16 . SNP_higher_path_2454 A G . . Ty=SNP;Rk=0.43869;UL=169;UR=49;CL=.;CR=.;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/1:38:203,17,363:23,15:0,0 0/0:34:10,91,649:33,1:0,0 Here two variants from a same locus are shown. Cluster_1000 indicates the id of the cluster of these two variants size_16 indicates that this cluster contains 8 variants (should be divided by two). We do not report mapping position on this cluster (first . column) Variant id indicates the type of variant (SNP or Indel) and provides a variant id (distinct from the cluster id). Remaining columns are the same as in the general discoSnp++ VCF file. DiscoSnp-2.6.2/doc/vcf_creator_user_guide.odt000066400000000000000000001350571420021152700212350ustar00rootroot00000000000000PKσvH^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKσvHO;n;nThumbnails/thumbnail.pngPNG  IHDRzAnIDATxwUՙ51bAPP4 E@(vŇ11L2$d^)$b&NEi (X$߳~s{nykO*jH~&*RJ**RJ**RJ**RJ**RJ**RJ**RJ**RJ**R\kf/w>淦wٓKS٪oqG--/5ٸ௕|.$d4(x @Ļ{Ҕ"/'Ex~%IOS1EzG` XVM@Mik׮;l֭G}+ݻhт {[oӃ:(p r8 ˗_Sr|#F8cx0ө\裏q={vN:(nʕwٳzUhBSG񑤂-X`۶m͛71cƤI6mt} 0АgٲeSL:t90x^zcvwtI0 v}-?+>V)<ছnpSN9_^WWZ5mڴQFW7nG>{̘1?{ҥ  '>O<#z??ģwcǎ+pqxz7?|{HC3g|a믿(mΝ?w}%KTn: XoDkܹ.O:uєsmr![j0dy^{5Ýyg[p^!LJ~:t+0aBڶmKڵg>zXΝ#Gʐ / '@ {^zO<ꫯi94ѣ>1йy晓O> -["uۨ h&ϻr >~;]DRGl0" aoѻw~׾/W`|yg$ 'l6@ ")3IH H.Zo|~ꫯT dC\v!Z 3N˦"?jp\&)q#y%x(IU;`K7s{%L VsR8-n| Nf&O (fT"c'54Ap$M!ba#jw.DyU[ЙbZauL&a<*3bE|]"v6.ߤ^ B 0PwqaCOMO!)frP<|Vx3쀤K 7)kG>M]<0l dehdo C8#T#zl4ep$>^y啯|+ӟnSN9eĈ&;|"}ǎ܄ދ/x)@裏.'?Y]r%%-@ҥKwկ~uƌ>, [vmǎ=Pߺuk6masϝ?5kF#/RcBptO^{m…tRt_b 9r̙O Gl2qFjsI&x|) h )װ>} '@۷Ip1Kg}d8pn۶NS2(-/|aaS)H>)a{I'׃AiH-[?h=BRuԉ ףG7M||.| }VHc(P0泟wtGe5#6x:BaB;Xz;2O?,Nނ m׮]i]| bf4 ;G}thfЯRG0EIꭀ Wx <)&J! H;v00kRhr PBXqqhKiqfEaUJ(3A0|ŰvK6d0@^b:x4#{UqQ%2gd4q|@@OIӦ~O>*SvW-G~ăI#1Tl}()ֿV|›GMw&3=2//ҥK9䐿/GqΝ;]ιcǎC=| b\D{?wxS|ĉ ~T0sC 8NOv}C|a˽;k֬wNN=I&[lDjժ;'O~zj rϙ3OI/2!CVڴisl˖-v8p y=!z*Ij/|s]n]߾}o; 4lܸ? ͛׺uo}[O<ēO>ټys.z)SwyO?͛kV9L׮]s 's)Ҕlr VҠGH0]fi׮݋/ݻK1`Zq)* s̙3?pm۾ϥȠ;z֭[ :WR| 0ƎK>xgy&F$ٓ_n5s 5g}6\s5<1Æ ssΘ5O7_ޱcGʯZ$@mS@пa$D"^Ksܸq^SK B &_r%* ƟJCp/O)WXO,"اsɒ%[ (:ƣP%dՀܗ&EEU^xg%c\ ЭJا( 1EG=/_~)ࡠw9q0"W{QPFG50T~c@kcń+#E\z衊J A7&aa&@|3 #%\s %8jB ' YGz} {;K1Ň@Kop&r .]*\Τ2*K )'K }[K?C,(}&ߦ_FfBđG@IمՉ\]`ԩ۰adGy$ds, QkaChbǎ]v]n;8#A62ڵ奰|˖-PGbO:!\)K9@ڵkyfO>xDɟ'GdN؏hZ3 ,Y܆gyvu҅ρ9y`YM : jEWQ6mR6) /]^|>\E1h 44=5uR9h$]ȃI }!=d?Q̖pЗd@J,pv 1lc[հGTh KW\ `y dK4!l4X;(pfkNnJ#T#00t^) XݻwGVCʡJx Ms-I~wƅJBJc. "48>F@M(2Z^Ijk@V"TvRW: @+h:PEunw:(`1]wdRԈCqɵ^6| IZK /Ķ ?a-f V>} իXdӡ tG,  vhqð;_ݺsͰH]eXI";7_:cVxj)=\؛txm|T"HI/Zp_T7NR]!-P `5bw TMF@ 3Z ajTP0͊b?}*#3~Zmªz) >|T#`9`R FV/9ڍ p"EZnavB{imGOz2nC?\x~n:ceg #Cw`CӢʄjM=q5e(a~=d oƻ6!ƔIKG߾}.lLd˅r'z Zr5 b$x.4Gy$ S*B >32ٰD9'tqA.K/`tG.ܹo}A!0}g =c\/VhtОB\h4_p}:z#Z>01 [~ӱuֽp8zKjva9I ug{v ֭[siUFS@ռHWPx,fX3 V4} ϰI]z5 =nʣ:" O>ŋ#iy 4cPUiƍxB,qvz]jZ-Y n) Q@ưp.cNe i 6l@tgcʁaaؒ%KVp`qP-XC~N;׵}BpBٍ\aKR<Q"þiBsou)$nhEq֊t~8~[nz*<NS}VH]H]+/Iv]N{Urp "s$;tf>f;N!{Mbu/D~o@bG)ܬIQ!-b)bMyjUR쏘[AY˄-J:V>|ÊSAVxr2/7kJJSk*G ;aSXK/lhV؋Da0s17Z*SfÇ={)tEnO_W0Q᠕ar|oP\p,9?2dذa?{.wt̙Fzqݻv71i| tŊN]tqo}[ ~_wGٹs'9Ըg%UjWk_'|?X|9 @} /vsi۶-O[jZ97onذOxM?t:p|tۼy3`@ҫ{ k!?檀2[4K>}Pr!h$Mmhty ' +Z~ !);:ՎjTRL?¸UOD!IUQ 8~ŊTʴ?2yHyc%fbIuP\4֞HEDkVSx Úl*s|=$=PjO!Of.x=Ε @PQugQ['t/Zk!/&Ug|*bre> m[!f%pѰRغu>1.z-r6#EV<$o\sV׷oߞ۶mXra{q7mtGvaF^{7ވ= o4](ƶn:, T;LNW_}[jsϹΒGqP)Ur_k4qRkÙ1cFn`ƍ'O !ٜ9s-[N2#<ꨣ\;ؽ{w8O=T͛/]d (x֭ڵ n뮻s=ϧz*`N:QC_򗆙CD6oLQp~uYV3C6!;vsOH?OrBh&^ ( 4]ئMhDlCr$ r^Aܟ4kPr4rҥwes%[neڵ)T[u>}O~]w9v}A~xO4x _Ԥ|X /m׮]hK/}S+6/Nt]矧=zx) xovկpD^Y (iٲ% 4.>R^F]vC=%?wܗ_~W_ ϟE,t0`bAS9 zu@tk矏`@y Y˗-2C)(N>HCMz -:wـ4s1 K'a1bD.}衇]J;`ŨQ(.:EjK)1|p` j)΃3xgƎ )xITt!:BƤj-?ԑ0)@X~XbְaÜ IJ)cJo %&!qn(*7TC&nUoB}` rC5P^W@@iyeҤIZ+2|EhPҙ7Q|&M=θ0 Fp:2\ HhI/(nnRx,,|DȻ=W3I;Fm-,V|™;S14!TLC<Y9PhL3x4꼾$KR3%)5 fo\ H\H]M7VKXfPQw$U3)nr W1c `^: .@8#Z3 $Pèj 4K !)S'N{1^jkOz 9XE(ܸ[EO#W8l 62L\kx?d>3`n:3]4O< Ext@uT}2DX-XKM<25'GSp(A(ir >放XIs:d\8ZmFqD 5Lذ q4oʕ͝|f@Dw}aSP `*8H9߈ ̋ `KL?8`<&b`BMypB yW]uEA}cŋS իim0Yx J%[T=äS({L{ S gY;Q1h? 6mW\Ami6;o 0{N5, ; g t~ G0rHX-h!-pDsd}(lIjH͚5˞y+ !K (Ef#zU R&=JA.|s8' e)8h|,C9OORu \ ‘~=Mi\E(| IsAFMM<  CNëhXZ#¦.(~~uP=sxp kZd!f02p %D(dl© &/+X !-x@N927-4+#4Еc)w۶m $ёp8n5¹K=TX%nx0$[/2 &HD Q j9_neZ( j:Ő @_#.d6Hj p1ݗ mE+wRnTt^门?J~ᇩ pr/ -LhF":C$I_ p5PqBwK Й Z#'҆:?]ȏ302J!GBP!˜1cԸ tfKвzzt\rFҵsC~l7a^k_S8V/i}M$\K/SH/>HT={"b+tBށ!nbH\: QpElBS@phP,%KN P+! XZ)$>8p3) Z ɧWt}4C&Oʀ\$} f?h< U'FJQ1ܧd6At92ITȖjdHIŧGU}DBiC-N{ңqn!(i< C"x<ĮGAQ8#r{)/R^|.MƋ\hOW{ oC*䋸\x٠40t*Vd&ŀ}G` tnt}Lș3giLx<*OidƍCQP ;1dfL|Y|4n$Di!⃩Æ cP9rfHWfXzFzd!u8@8K rxRHA@}=ձQ2QO?] ^H%) FR=@ICxK 4h&J⒙z&y?D ̨E=ѰZT>͑:t$*C Fb,( ̵MxO;O{8t^?iIKGw*ݕ Z<$Buf'pWFR70XÍPoNNd#]Y<]їp&ܐj(Y0ׂLAK<iDE=\[2Ɍxl(D}Aɚe^R9lX齀?ǵ9u$ϒJ" c/󡳼FB+WJd8G4"RG$4!q)ng[ЮP3 k>Z<JiyB{-$c*s~xR>,bV {GBLI#B}db+a 9wCe2֙q=5-|a=s($͢|?,9*s1qx o'[5(OV%h:&& sV8$?n8'vY#}le@z,* ߣtؘx\=EJ['5Tk!Gc:}]|\+V2]f 5\|rps8dD޾};0NU` # J*#ڿE*޽{˖-Fo qnW\:cƌ'"?~1ȑ ^|E.X{ꩧ"wC帠7t@[K!Q f o7\ڷo盛gy &_.=z\?T> {'Rc w8pImdQ޽s&0uʰap\J^xXy"{MrESƍ-=:.rK |ɔL6TOn^Er `D?6l<ɧ mlj'8w\,TȯZ \FpPuMNӟ}|tApF]Ëj0|.~]]AaX ,|.]@{I'mڴlT{-ZԵkO?`)F*?c@ɉ>Q z)YW5? 4I ٨ N(55p@*Fn|`H.]e]Sfൾ[ҹ'ٳgna[:R^sc0,0-N:ͅeL"@nct$o #Ju?`m۶,>uP#9r=\;tSF- ڄ{n'N4D_MNqv ~{p0DG~a+ฎdIuG>ZiժUZ9f:&Տ~)^U"0嫮(MoTW]ϗ85IeEU$T1fHزeKđGi\6 &:,CH3,tv_~dCgݥKC#lx4a„#8;{l$+< qy TC*g}k37.Ch В⋽Ȅ\Ek')6tJb&LvOq %*g/jT@;J -2-I:f88fD-1fUC #%qoZ NSxᖤXxfeRvҸ=`ǻxYqC+jþ2I[icQb:]bĘ=@Y ADR̹~wNîfQ`aOPq_ QiRdK "=$@qHX*{Lޏ7ΈF\$=ՀW}5j u/O@AݦM>gP3f"&0Achp0qܵk_n򗿼m6\>}QSÎ;`QO cs=XT 9cT0 ,,_ϧB6T`Æ F5Ekm+4?eM6A}3T(a~|ͮ/T@_OePgԩNHгgO;SAJȽrJp͛O {Uۻw?7򗿄|qE!@wu{^wux뭷R+\qH (/R2xP@4Ayjnú&N(ǐ@hիW_~9-K-ZdDh112)Xo=nzh’%="~*<܇x+/{ :x.'O__y MKodh۶-ƌc3gرc:8vTuxƷImժ.vi+א2HLc=A( 9z|DFH=$Q,hb!(`[&܄8\2|_Lj1/Fz[3&BR#VIjX % OIA0pD , ._W|SrbzQ7o4$"Cv5y0 NR*jK9mka33"Lp"4Nj$]Q [^cM`|>  W\5ky睇ٳ]> ńFr\@ zXIb]t\z a(!4Fi4 ѨQPh(H[k֬1rrs1t@! 2p{wOZqW /jzv̙Bw eC*c}'"k}^\p!Wh# \0;y衇P(6c$=`Lk4Ԗyth׾00=83\ M ~&"!p,D!)􂔞>5fX1$C%+K=qa oq{L@b-ŗI*NjFf-ݟYf|ĉ!Rѣ6BѣG ȠhF$ƶ>:M:#،HpC8GWJ<ʼnuS]CjN/Kz r* ŅVi"  `LF@aj94D le!nsh#fկ~8Ϲ4 B_d t,쀓h00p̋LmRa&P'5%^W?6\E\b m/(gX-ado.C|t>F¤JxL"w k' d`9`i}{9Oc I&<\$+h*ņ.1(@r:X*5ZP 9p*裏R_exL Bz#c0 6ZzO8k_|p񹔃%m޲e9眃 <`f8:~~>S84(SO9? B| ˖-sc7O SyB;^nK`6S2W-B`% "Os(b`G(̘7oCIQa_JS6)a:*  / &G"V*\!?"et,M=! n\ o4 mn֟$'F0(2?HMŻTC60\t G <  yqJM_JnXrwL-X1ch*o^&~ɤyhMPs@t_xx94ylΧ{tq/2%S՘2e `"6E]D=ybNu.iz.+WE(M9 h64% FO瓝W# @0&`L4~<="nGT 5ǝ .C`KRnV5>IRȆ2Ob0F'F1hgP~>Z=hq:nyi&58> -ڱc… 8'XMl  KԴw2fjh1_Pa+^gYqT{?P 31ݱɝs\)IE"3QjZ-a{j-3A:SdWw3dF(c.N6'Bjp똨z3/U&"4H93ˆ3#)焓HsQ$!a  ߡvkP5Nj 2!<+qԹd:Ng̘+>¸W?,l{Ç;gS/8{DZpưEM6m+Ώ`]r>T-Ƣ|jRd0LnP 7tjpaGW^yeRb!Y~9xKӾ ߹s'F Lap&U3gp@E`eʕݻw %K`a;S `AŞ~iQ( .[rgK㝺Y$P^» JI nh=?5pիs|a$,ӧaj<.~^{ z.jI:iɺ:HR4%gaqk 0 egp٘k!(Iͧ7O:K9F7ZIzN@Zk ` 6—rc|-Xx'suB-ho('x}2fAdҹYo'CV,WU9EN'0YծCFsiQ:Z:dEКf!sjVL[.`uWbQm| P6w~z`{DQ:{ 1Ic[ov&ŋօ)ܧvZ^|>}z>A$䞤 ٰƸ6ԁ=܁[CF\; -`C拼 V2JjET \WGE67<ԟwmګb"'QT y[:M.3kV-׵pҵtAwP:.goa]dws^!Ga|fw>Q2_wu0:d(Saƍs“.ػwo.ɧd !Ll8&R0k$_y t-?ua@A@\40Q/~>g}e;JD]VR#Ov#iARX,Uo 'FrӍ0솨CH$ c0 ) | +@fT?|;C]~X[f@ǎ CR2x`ZP,o&Kc 4}j̙C7/q6Ƹ">-D(H¶ 3t/}4ݺu{p2! &q .Dlɒ%CEC7f^|&pV7 ;ɓQLdF``!KWS:u*&zӊS+!-"0XA%ȏSuF&BڅM3k, kQMJWڦƘ4BapXڴ B =9hp6mJ;sL LՃ:@V@ +u` $/~ƕJvp|ő_o* :Iu(h `b8FEÛh Mp|P4e.W[baEM>b(d$ӈSS&5cB 5wmu}Jr{&$@(JrElg]Mc~T= 6`X8'I''UDQ }8h@b 4a@vw8x]Xð޻۪@.1bTZ>,_J *M>_@ ~==g^1r..25!IiP`8~{P?$$59餓P}nւHus}ѢE//K`&|a=#58 𛡪+ߒh7, k+B$& lA.$uT`aFblD8(0>]tʺiɏЍ辘]8`2t T%r]];8GSF!*7#A).P^Xh+0;?Q&3 {7#`0;0Ed)mZ2ĕQ=<˖-Cy*e<:sm9nfƺq7ڡTVwC%*'Q4 4EyF(t!~A?*=ˋiEuh :hw?l=8|@/4s6@h pIUsrذa'ykILn\s,=VQ26un3y`>8K'& M !B͘DAb-c‹;v@mq,kwC.#NJt' l@Pgp<}O 5ߠohc+9T"9⩧*:?=GrcC82% 6=r# #0T!MznL9sE'ht面DMx 5TB}!H¼NKsiL6;t ӅD`Ļԁ)kCUC <|+i.]Jt~:15;u }#;Y /˽h?2ƽOIasTB!T?^R89Ig+|44b ׅH>y921Ij8"ZG.ݱr+p&PG9i$jKiCx:}CS(P q‘~J?`o?tAx@oF\zW^ySNͧ{a " ?sB'&"P;ίR"7S'Pʻp^dֳp;JǕ~:fM!X31baw(MX)3 Мd0jĤΓE6BWbӧOǢ$:=4k" _~_O81llʷvݗ"!nF# CS7|)P [dɒ%4FC;^@3|G hف!Xb*D% G~Z/~5j: w҅ >(d)@W? 9.{1 %WF!uSs/=Օ:<.mH] ̜9Z BlPO'Lf`pqV:" 㟂zG m4 fGq,(st4!!=QCJ'NaQ ]*2{qagK`_E@P=9;wL65i6T>-<ur]n'q kLpr4!)PHT=Vl$u;awb%Ƃk4> ]x rvhHB 0IsZU~f'Da5XO|xP*-B80nf8wȑb&6zP sLkzqAKPEEKmhEㆡ?4~%%s~@wпlCbj np(2P@7 8Э:~/L-aA0`+soKSux-}241-DƓn 1Pf fIt0M(-OaAc^{$,]>~jHѿar]^M6 ";6D5Z%Yxgv~$xĢ|HԐAr$Ud:){]|?L ي˩&!?Wb4<\6Wl:ieqǛ|a/<Ӄ6%:ER$p:I3@bd拠MkQa5 z/IFׄ-~1syȰ@AcM+C*DU!hLRUϙ m.p,.(0LiT˪ЃU+,2/fj$q24 V.K=˒ےc +!ceJ-8C,?"񞆚hT*ꨶ3RWE_wj-?BWSN,+i?J>T! /,^_5NS(8`T]IM!Z( o;GQ72`Y꫸8xጎjC%5\*>"Woذpx)S<ANK70{+ROi~}/#E^|>-en!ɥk>ꒋOSiE ּy:*~+G6q|!>Kn\Q⩩Jjj|饗<:3JW^y3cF6G\l3ɥ -[vGbsrdX~m }[hq~`IO^{tBѹI$\ "׮]눀1LɰxbJr:Ytg^jP `/2ۂ0/Nxz{|oOyf؀@v\׏֬Y0ؐ,Λ7|Z Az)\~FQ?M7tum۶͠SPAćzh@ÈB@~; #rQ旿e*|57pu9zh'u> FݽsNhe,z`x-SoP"6.3R',={'I(LdC!3f,87nnۻ9È QLre+ug"3B:1ld?y:n4rCԟ k[+ yI}G$]}NX|GFuؑo/ICΚ5ҌzB ӦMUM7EP&LDCT*g?KcδmfS4,fLE$A&̨ҳr#bj*-@]Rvj!ţI:d 롖+Vkufaq&CrQ# E3o ܀= Od4HDwް;}'5`R_O c Ơ׍ϟ;Jv`AːpW{nW gT; h ^r%sHTty t>DHK/a,G%evίLRS`Hbav2Fu%UX` IoTͅl0'^cxT Fvszolܤ(up*0;!d+TIA!bvC5GAt]Y_ m$˨yKGƽr;|z~ 6& h{ũA rgEsE3 b+TE_- :X'H#0"v.NC>t<5fРA?JwEM˸_%>j_ v@_Ȋ)qBn8 (΍^dR吏z  u[@O`Eɓ ɧ⨡۲mۆtO6/q0yr.r-p' %EIl5sC?. J<[΀8޽{cZ<:ѫ pȣFAq#x :Fׇg`PUI=λUgy&1Q48FIgX7A"t٥K8BI[`Ѽ0- 0n鋤l|!.R DH T ,t%{t=I:ҌG[=ܐǖr43pq^#|Vthc 2(WAN'g}28OKHPU$nؘ LRΐ!JI`7&{0aD/z @gÆ ŹyYg! P`' = <{df,-CR2"y. 2㺸ƞEpL̆F 1Q<+Zxqܸq%Ʀ՞B9˗/-VΝx=&^tD|ͅBD-\&$*zcFS1z&iFmC'|X@ `&D3a A=Mpof̘a)Sycƌ  AGݻwdr0c~SW!b|,'iGIâ4-[ A>9 )G5&jkGz'^PM뮻vn]240 #+*~5\, PߦMC=!̀Y[f<#2@G؃N6*@4$uXhѬYY4T\.DiF^j48 Nxa:NAWvw }@ rA9\_veEc='Z@8}']SD12k)s&X<mOHSȖq`A<61VAt]@bM""Q+Vl( 42sx+x%vŭ׸^Z$Ni4jV8/d3 r7-;R! b&aʥ.ٟz\^m8PP0I1/H $~CRU1<ΠgnKWRћ}Q80_4A=9)QFS(gojTReBYl#І;sNE]$رcQVQsޣMFO^4Y=, |~RdV'5$P; !'a3[px; j ei@plF'C5| `6y hT@-Cs8vp#?XEK,d`CZqli -4 u<넷A"@# `yX4S-yehޮhI~@j߯_?8'`Q0p_@S@, NPF0 bǫ1lNDz =d;,+.*0ʽx-n1T / I902duĈkZjVі [Odb2c|8O-yޮiy}`W\ȁQ%iscyP K r) p qK\xqgB!!\hD3֧ZM@LN X;4N˵VaҤI=K kEyCǯ)5RXS {3B@ٻptc=-ނdPE=c˖-0uݺu̙3ɀ#|ݧ~|&Ӡ͙^J^|9sOiBϞ=͛=ZM0 S=8G<2Gσ!Լk׮qhaA<3W|wR`<:1c lFJ<)Wn&^|ʅ~ɧҩ X~PohF4zuzW_妃pA7B@$BSs="M|4ѧ7mSF>V<^*m2<ϋ<!Px*F r (x4)cѐyncq=ԃ,NMĻ$ K.؆2nSmPD4ICAw{֟'Ӱ誏>Ǎ! TtCJx۬5DdPܓlphNQ$uUP2!9tA sZ[<3fL&@Ga؉@6ْtLXyVm*ӿ; FuH5kD Hr4y LG#9҉sL~ ƒ2ǚ5k( ,.te˖QրKP4EWgUjT>8 G)H"BX#S2Jq!KG3iKVšʭw.OIG*WQNd\zhe?}t; ݗN:iӦqa,{n_ϥ AsAtv-(nB>56OqiddSSIU{FW(VhYU(="r kQFgi܅t@br:.WFDSywX.tG@Vd K IRzY8[M0k˼Pfcb"NاxDHuM ; ٨ y%RAI̻.R\%[n No#2?($3MؾJԽIDRa_ZE),sM*Kȏ\x:a&ÕXNOΪԴ$"SU*8uv_nqNv˩xo+iL|TRTG%J|TRTG%J|TRTG%J|TRTG%J|TRTG%J|TRTG%J0+p*kPIENDB`PKσvH layout-cachecd`d(e``d``Q1a8 #`bPKp"1PKσvH content.xml}ˎJ_Y37U]5T[]FQPs%RMRYқbn'h`)C ~ܛ"q'7_gS b? ]|! =?}vu7ݯw ŌI -A o],`:gFa9 C6W$NY|~Mx;cۍΈf8ۋ;>y;qX͝/@u??$|xuuww7Sat{El۾boWvE4e+p9Bo\ (8V*~xAd3HG|z0[?v\;:R~v#,lNɅ{lOo/((c ۫ '~"_u"j_90~Zl>5{LGz:Q؛w -1u|ID>;]rah@7L[Pj"n/*acPӇeRK"(( ix/d07 #=7x)'RfPiKOY=4AAST>E.QTAI?wzc'*c&zhęDm4CF$c֍%g o5;DDhSv\3V_1Oe1OcQ=vqJx;lg(+aRYS äEieeӴX_a׷Z%c>,vCT`#vVkާ~]GDq'\*R(t(vZhsH4|7kj>v[ pS1^6j? }F>B%4jl523DSKyDj#34ztɣj#47qǦZTKA1(>#{R A1(7<}tn)ɇAzG&>2JiGqM)bFcR(Vʛ;w^YBYCv`݉2r-T(gĴ-uU,nL ,(~M[˚5ckhg ,(s+.P1g5Bc6DMUXQlQ|QgRoSeAAF9J|Rc@XjͰͽ ie/m07o<WcE¤?<65JFv[OyύL0.8k3|Yp`բUf|fLpq;Yg$[6TZ+DxxX"hĀXJb.4IhF}D26&X`<<0Dt68)30),W'}W>scg^]Mw:1!xSMphpae[I!\ \fP˕WN) ;rrh,Y~F#KȾ)FjrN(ј|914FnP5x4+ LJݔ Z+uRq͛rʹ/~HJJ:9>a卹|C\a>syS.'BlGrx1)홟hޖ"¡SH7 C(/m"-(u0_.AfuNkDe|Zh01ZOl\k(<$=r:0r? {%w,S|If#O {\Ov-]E8>n~k&ӂ|N*KJ kox~(Q.z׀RG);0ljY'&aW캣6GBMzzhvZnC,$]w|zbF=rY,C?94kjMc#mŽMX&Cǹ~2hz`+\wG7C[zJՁrzAaѤ*N \kh:]"h oGxfi hheEoGxP*k !kŲ9rA0aՕ+|5 ^-X bfUU$B%fT8r(`٪el+{մ[Gh5 =f+~]hqbY!@\C[> 5A~!r{kqYq@\XAƩ8a\4SA\S R(9Ad*Ζ,n!A].vN7-,cB=U/eAu}Gc29jc}z oزy=lᾑkz)>6yJ:'}quw^-y:;Wp9%kѷwסz,A,WѼAcS^j褸S^7N }]:d9r1%ϐSr.y-Ny)S^j{uRvKڼ:git9nB"?i:J߅V.ZpngsgN6 $=ixGh]&'`!懵`<E偡ٛ?NV=֤\2݆(m_儩c˺(y.F-},}'`Ѿa٦){]>7,ԁEDz<uoXiM=.Fn@ȓx0X߰l&=.Fn@$OY4߬p3%LK[^Dsi8}}u4t>HCs4t>HCws4t>HCs4t>HCs*i8GN__# ݦ9e# ]9]# ݦ9m# ]9qJA;GΑWHCs4t:HCs4t:HCs4t:HCs4t<iϑs9m# ]9u# ݥ9m# ݦ9e# 'ϩDX3$(Əb# kS-Ui;h£dFxbT^fыS.aɁ`\$EҠ㫯~0?IɄJc [ E^RlI-|kYm(;l5'  v`,rPdمsks~A:aj*HM?FAǷL ] $GA8ll+C`GSQ) h ;a{TNga4L BSe̙N% x 0#0 T}c;~D$5l?HOq|MSMH>G#[ɄJ pixI2Eߝ:q 0N}O+{&]ʠh3b*g[78 ;_~X" 8.ON7."di;ƿ[DQxvBM1@`8wj }xPRdْuY? R9d<tzzj*ׂG:2&,C'Dtt[%Ua >یh2 !`lT9\U; r }\ܭ'D҇7KO-S4|dS-CeMtYD"]JPX"Lȟ'K=-fN4'qUPI1,4m Z @7͘6E@K-'oɤ/_ID ?0ya+gOi|7p2,-}^k;3̏ s`am,+k[q=< P&e5Ix'Mt~@ޱ5 2]23K/9}$4Vp[XNf2}MRx"scEJoE.K Btgg{zMo~z.w7>?~|" P?-#^VH|}fQ'Hs?/_g=m۲wOƿ7× _q-_C]4sHlC GdÄE)F2Tܳ{<$;l2!l]3͞bimTԇ*,8`0] ]!Q&mflKS桌ZiJag'hm(V9 n 3 kh{kȈ3ӊUy@sƷTz Z(MEuRĺRgsbL?|nV|͋kqfç 2b0CK̘=436%  ˺ FSU0)US)DjUBzOW{ Pm3mS@JY}A1mDF/ chB,DU]q(|o5fradF]|5zLb)4SΦ- ~އ.pNmkSDO# ?W^ӗ7HT|'O޳+$J@mhi(ZN1+ HB:ܡ^zICE3Z5e1'¦|p/mo@i7WxzDAPӠ7,e_^]?T5c5n R TS@ўvJ DhNV0jnA5H ޯܼxws}O0Sz(eHy=BFV,&XL!f-`PTYhfafTvhXriCl96ff3050`СFgSUAysś77׌T77o膛n+k`эlD $bnPdKLFݱ!-l tQFS2 Vt<'pb; fFE: cZ Ԫ2-}0ɪڳ?ڨ7MS(`$uXeRhȆ2k.دX dIkM /vjQ'xv_w/`"/lorFa@&4sh1mp3%^ H+6cKLp*=%remr3SY 9Y}cѤI0q:2Wo_P<Բ>+{OvV@׭رЙ̉.%!`YGZXPƩMSaxLVvD;IźYa&.'U Y'yT.~{ȇY9(NcvAE"21\>@#^X(:UfܣR`lm8IѬ;*wYBiLşݼVs}&>źw;xdɴnEd17ϙ.wAWe<`%r-` c[k?4@ 9 YayO=`^-ET'11i|>/5x+2i7C;Mձ["Yh&' `]ۓ/~ݭ-)z-ʿ:083 4B-?fkJuS%W~,cv4䈏tD6!Nrr9;qCa$0rrLN> dP|GM+\wbEAE'ilIV$`ڕ}ە~Vry> ^W`Ǔ۷/mKtK`p0qLd@spU ꇿj%+]{8z"`1H9n12>e!!턹~:Suoz30uuq`n2l^ph rg+sf7.fP~;i?O]r"%63f6Gٖ-D :x)i4DH_ٿ/!x_B~" |ixUIc> ζG` y9oϽ~-K]}(z_`> ?PiAkB)JW6!+޵99t (Rm}qHPK?[J?֥sz $_:ƲH ORFOT(׏PuSW>+1Wb 5[iCW;x UeV.CWc}/U[L%ly0|5 )>e# XH׆fQ8b#жd)=Sn(=T l/=]W 4SjLufk=Ŵj6NԞblU}cfZItC5hwB뎆",bzri^(}+G~1zm|נTXN/6 $81V , ?`PT|x/)m1%4ASBkmJhgSb^٨'a%򚋿jJ'x(9W'aBM߀j`8j b/=ƂUhcCS=2,VlA DiUa36dT@>\xZQۨPA+>ݜ'D=znYAV1hb)Yʅb+bYLE-VLSXG"rbՔ ꣊fa%,lWqZ;ëXVTs:_]sʲ's01&bvyj\,Wբ{Z񡪲U!Z یSV)&ߙR_auۥ97[ۜ-ۭHelm®wZ(`L 7fr\)WonR܆)tWNWR8_'])}(4IDfИ09a(½Q)ђu3 0}GLş,929Dc8hc(nmùߕ{cR^旻/[r5 8}8> Mɮ1vM)g`@$j3&Qf LME>:dm& {/Wr 45=ȱC̾Kڽe5{*fHI}&?o|qRqwrHD$9]6: c܄S)q`d5y;BP({H?'O!+X qb4$$\bS&>\^ ;ğIݘKiQEć _u5Ճb3`W"ğ>,>8똴:T7>>~̄hDwAT(?}A?}4@pW*GWXlay {`#`o~tM]S,kZg]n?ʜAFwPdl*gz>9<=pfo=Ȇ@5(42ih`) qoSuRcmڔo">#Zԥ#)t)n7*gcPR$=_'Wu.Zac9j}>t[ǒo0YaQP@R1uT8ڒ<;T^j L0偨zʤoܜʚixo/o xgB&H $3&wM[ |*pv#x!O͙24Fƍ]jaޗ϶EgyĬ,=X*wQvS4`78^3:4[]Ur4'>ꂕ:ifw#g%-=,pM=L{I^5ZqPK4'PKσvHmeta.xmlM0ݫ1EXjf"x-1Kk>KzxdK J 1⺐Zrۊ|M"OVAeFI̧~P&j㯮&S4"Η$IjM8[FK:߀(\歌wեXn|ë($,"JׇE-הT\d~Y+uCfrFo°1$n-IG%b 02cXQ*X0`KD")%狖Q,Ƣ|bs2ZI#c`74/չծم{) 0dbUUUrv0&I/gae[UVдd!3a ]>(;|.B %yHS?5RM+! vFhkUaa ^S&}kV D KkCK]dDHHJj{|^f/@Q`0oX>mُ DL 4h59xMcڦalsd8E$[mS^k~FlMiRnApaR;Z,qs|-Cbb7%(@=}QlS4'~*pc4| 4uu,¥Ar'Mr.4BARG<[μ"!J6hWE@#:\~aIFJӣ~-Ukkz3%W[`WT3j8gSs]1ݏy@n3k`g{#'7}=RVkLVk.R(jL#5+g1dV+vKxu Ӫ&>|]Q6#Y_* @Cؼ7$ jFa_sN%AAOE#Yᢺ4Қdĵ$ nv`>Ӈ7yxLlH,>a_+4A? g !@SFķRS"|z  ]/F)sW=QCQpC _`U*V|{ѻ1@xϢ@2Vc^z@dC[IH6iIѡCz=1+K^:,_\+n\k %VY<r,uJ# 5Gvdʎ՘Kfwng b?qên0QcznB>{dxZ֯uso8AcL2d\#+YPKw,PKσvH^2 ''mimetypePKσvHO;n;nMThumbnails/thumbnail.pngPKσvHp"1 nlayout-cachePKσvH-G ocontent.xmlPKσvH4' "settings.xmlPKσvH3[meta.xmlPKσvHC ^C }styles.xmlPKσvHh manifest.rdfPKσvHConfigurations2/toolpanel/PKσvH Configurations2/progressbar/PKσvH'ZConfigurations2/accelerator/current.xmlPKσvHConfigurations2/floater/PKσvHConfigurations2/images/Bitmaps/PKσvH$Configurations2/menubar/PKσvHZConfigurations2/toolbar/PKσvHConfigurations2/statusbar/PKσvHȳConfigurations2/popupmenu/PKσvHw,META-INF/manifest.xmlPKoDiscoSnp-2.6.2/doc/vcf_creator_user_guide.pdf000066400000000000000000005442641420021152700212240ustar00rootroot00000000000000%PDF-1.4 %äüöß 2 0 obj <> stream x[Gy{$A@|{%*P55=Q H@;B*W9xĪ plO~O?>r~}>ƪzS_zCp{]=`] DW3?xяƍ?{pPۃ'` c!C="%/Msl;Vy9O0*DNKQ`wb3oJ^:Kn*fNFB|إX5P P8'pRZH&62Ldmf9lI2"q٧A#T(<4THU`{5}/YGrؠ^5!5ǖ-|S0݂c!p10 084 #aK1+PtL4_ 'v}JQM .d֍T`\jF76"14~(L4Jh0*oJ= l_+*U±[0WQjIuqSUz!?d$ wܶzoWy%}5{HiRT':0>;\N]kh~!ttzwxZ2[?+y%aGί23U2D(KQycMVڵvt,>LyFݩ$o-!(W:z _M&,,i-%IYk7XQW-Gd^]]a&4XH󢇥C6CФ.*w!ejV3lbKGJ*&ox4"NaJߦVhxT6&8? +`"?)Ny/ХjybyxMx^ v /7k;^j+ (yr`Nh'Zr\C\#WzHm?FjeSz {&{`))chvvh;^I0GK ·.(Nl$!Y,igWny7lM{׵(!hődyK=mn`s`@ m;?SnFP)#&֘vf~b>esS{zcІ MEsKt1'WNW|Ĕ/^tgPSxV\" o򛒫-Щ?r(=wr6$qߥDA39q5(ȍE5Nή~uAŘG \(+>)FS؜VQQ[HSk4W9sYW~ʱk&\zӨ ,~&} ^l4LMuU+%|D;E1z9{ip;)X&+H*Ў[7-~3͉DE'U v7MY|RL?%&` وPC^y/&|{ڀiʱEy.Yu'cѻoԍ[|&LEbLcozζ >:թ~tg\JDe4vg1}yʹXxT_KZ#7r} '#Yk嫻p׷0rzty7Z0|o">y.Y/iZu"٦VQe؀gO2ÊG2yӈhqO7נs|eD6eQV]zc(:Fe/cHEvWק%>Jˏ꾤;<-7^X7L^z,CIPء[hwxҌMϘQFwS #v*sjWI}1 xʄ?Ê$Pō>_dI.; wEbWEίL6P2[lvt-]R)Ig3ɀDy~่|vol ( 6kL5 *4;?:? w> ޜ "! |S|Fa-<YS$ZMإi{:|qk]uj*xl'j( 湹ŅYiΤ8>3?A'e\$%lmL~73K uq6cWdÅo~PiYSkj/^`vJ8o)ɺf׋;=G=ND'O~tY3W gW7V7_tK2HDLmG2ĝeIX}rd.-2.s{=OV¤GJ > /Length 25 /Filter/FlateDecode >> stream x+T0P0t..@.) endstream endobj 5 0 obj <> endobj 7 0 obj <> stream x\Y$~_Qφ՝T_ ~o}`|}+BG(S5i/f' 鈒z'fi5n=}w_~yxٔoZ_~s{ίy~H)XIa<{arҝo\7Q*IC+4{[wߘrߑF Oª~>{eK< |-6η x^G)v Ixf{ *s*A:qaGthIa$Jr?aYԄw2wg2=V^,A#9[".h_wdFo&D8U\#2P[SIG*х@(]v^@TS+{3*C-G'A}=ɕX1u$ aяYaoڄL(L`; |ȴc˯+8h\ gѶhL*zj)j]w[0hP &?BAˠwҥmQ8WVB=:Q> 2hd^_7U[RRT́~q[̾$MP|:{0M4粈. B.[%( ˄>Wc%h^ dįs/M''.H/o <_9?|%Y3^ &CHV)):Bv/ i}00AP)08wCcLW֘]-3f7LVAT j b"4 nU+6k@6UH黊}W/LS# g|:Fsk>Όx 6y e-<5L.8Ba4 3זfu,(y"~Hc<. jOh<57⧮`m=Zp/[,wN[[MbxyO#%8 yYd@kc $?cƊ)xg8 ;vn a*q F6#F)=;ha_F{F5+ 8h!lF` Վ6V&ax oxO_E̶[ 3wS^ny9"E ƾĠS:?G,!.-Xge1,H  , W,R: GLPc0~3AkCMs9r0͖>ê*D{HhhQad؂O !<,д pD۵m ${Ř i|ʢ_rF6SbDŽdE]0lM &Ql2 0~v;K=E)9e k^~u~VtUZf3'lɾTf )jeƋǙY R"{ƚ8gFS4oA\$ IC"#Cms5r+kWwnUm6҉B84GIPnײDX6(ag]=]=0p߄Ɔ ٞ, qxd e3w R/ ,ě#ZӋfHk 帒Ÿn)$Y8\͔%eڜ/!TsȔ@Jfq̻T!K=/ >rZt#0=UQ Spm8O*}K6>1؏ 1#b܁3jy\?I")9}b>3s WrU=Ug'O'XыqOH~ۊ,]$ +Y҈)ȟΫZ9 M;̊D}f[fc.u5N;%V֑8njHGnU:=E`o~_!8ؐdܮF3dU &u<+#?Fr{=Ct11/!I בgprۑ ^]zrYU©,L1[2FqUԽ #bsv Tj'֪:o3 Y FH͉\Rӆ]5׎Ǩqed *&/5;2ʷ.}ݻ&j3. vPs*zs dPsh+QS-o$߈V5>j*7(( PsZ5@%;w@F2ӗ ^HSTHMyлs0fHHǨ1aLAԜvYׇڋxP06M3?VhJ bK(9y"|$-0e8 ~6Sgt\Y7'Zn[S8hcN?fQ-*=Л? dn#8E?PY\t\1C&&7V7!݅95j4Ҭlh[AXr[y F/StSM l ՚R]Uپ0 !>~Z.rRX*om.0.mL^xXy_{A\ fwEq킦 4^oq7Mn\zkKU.{L_&!{⥉ D%q'4ӂXJ/G4piHq kE[eswuF{%9Gm/ygv9u;Sq_1/ੳ)T>Y^.w}:zǟ|_^l>?+ endstream endobj 8 0 obj 3745 endobj 9 0 obj <> /Length 25 /Filter/FlateDecode >> stream x+T0P0t..@.) endstream endobj 10 0 obj <> endobj 12 0 obj <> stream xZKF ϯ9н ML % 94%Y!a7QzlgCaavzlJW'U|sd/SPu2ծ]VQٖNDe 5zuiƗ6[vV/j]ر$A^1{v27M`s@ka\ks ӊ쾑m\z ų;- 8K :2?;B8p|#rz e˚?Ԕx\QZh2EP4,LFQz;6r[Q!Y9U'9(p+cل*9pr8C%W\^O& L yMBg856(! / xnVxs(CSNR1;Mnf>&{r: RraAk֨I;H9_OCד?|iD/P^ZІyէ܈`Ø(AHDb`Za$YTqG<֎=$B$lt a└N]@1>n)ycŢ6Hm̄pҽMeG}vە4 梊MABPf2%w"7ֶfo}UF)F8.і3^{#0ReDF+RK~˹\#`n/e"-0bM([Ws(ıp *Hf *ڎ9kYuֵR_Sѕ6u^x}HodaF,h%2H%# EZ3?\nЍS z-⧌yq m49[@8~$m\i@1o$] Ehu,ذ8g#U ݪ<BiH!q`pV;Wq^R]u3j_P UX?^]%(m_Kʉ92_K^|ɸlVsա}HDθg/X(ƵԿ`*3{}" cף-ܦUQ"ˉ6fEԪ3tj4ٵx % &@*s]mL>Fj Ȅ/؇I*Q|Rb4Y>fǖW1q9˝RIVD`fרh"1jըc%p.[OP[ک{ ;퉄Kr̤ݭ5ƭ2q"L\>]MN!(\hJ̉~Jo,[>דaTo!A㐧* YRqvz@sfTc}tZں"nfgHNjK/lj[ EM5NW>)rxGƫ"e/4b sk`s]^rH.oNԢbTH=HҝR+í[.+cŀFRѝk5vgO7F}cJۮRV?hۗGrC7aɶ[+MMIo~,ޢ_`_F +v<_Q5BU=|,()V.w𗲉-I <&bx&e}أO-l+wg1xϹo5AƈRM__驼-/{t2#6JXZVs|>޾^ÇH߇Oƌ endstream endobj 13 0 obj 2026 endobj 14 0 obj <> /Length 25 /Filter/FlateDecode >> stream x+T0P0t..@.) endstream endobj 15 0 obj <> endobj 17 0 obj <> stream xZɎ#7+lܙ $J*]}x5T?W|yt;}Jp,ŮJ]~{+h(n +U\/b'e/O_D/hiAHoyo^ ,VG+ \f|PR:XqRϨAS+1LDT(ԏ1 nJ_THpe1?l|둫nm>*<eqý=xyeQ}u'UǞ%zn@ Ϋx2881!|$ͪ &akjQUK-hP&gz0'.jXǠaJRQ!Jy٠ L3G^Q ϊUwxH_uQ(dg iGqfUOWX"tAR rBYo cA !h٫ZfpXnGՒEIP @xFϊqLyrVÿe L3!Z:*V܈80Rs5b;[}nZm 7]6<?;ј P21BbB DtD狘W.Nhkh0k1"δzu&〧GPqb(()#imvRS>=#sEcG3,y 2 `$(q52lVٞmZq G7bj@㖬\Rj ]h]Kz?'\t)R b_Y7=zbH ѐ[x\$n0,9DN=zRHj]`v2凲 7j%~$M/4(BrdE [! MXFy#et)G($,nnկ K P'}V%G q2ER%@EN>egx? endstream endobj 18 0 obj 2513 endobj 19 0 obj <> /Length 25 /Filter/FlateDecode >> stream x+T0P0t..@.) endstream endobj 20 0 obj <> endobj 22 0 obj <> stream x\K$9BUH1)0X_! i*{$#lY,dg{y8ͮ^#_N_'>%z|(kT-aw?l,}l ]^v"y=Ś5|au0>^UѱE>fi>~L1Zlm-ahbtQ@eB8/Kx6މ:ߜAޟ_|z~=}"ԋ><T؞ӷ<,޺%]Cx/aacOx^!(ۑ#@V-*f-'jRjD/q@&:1ĩV( 4c'r0mXqt]1D<*` ^oЧ6Y_`&%.)dp{.Y`0(&9p5͎6n׿_?,=䑞*|ӝqFƎ788zە<Z82ezeL9Dc\ B93NЁCz7d|կq[BA55bVe7!p)sOqN)v[ Zvsy>opkb2auw&a[! ᤷKKW =nrPݞQc4 59#TKKOVIZ{wdvҧAec0*=¾'37ЃC{#үf4'>l<[;q6W98O.F@jߎn .ve Dm"ABqr?)b|u"kK2ƹ] $+,NJڿ)u>or|frH=-ʊ5שЙ QCգF0C2lnmgd^JNSѩV]_QCo|5E{ *qk"WGM]oUrAј$Z '!C(bhz8dhȬ!8C36]]!CwC˖Z O<#3#jrF9Jvd8Hv0!]վUQaJ%>o)@nBXrɂZSH|i? F>%yb|Wy.1`M֥ 8@[f&Čկ0 ""k᣹6>O8irZͱLIN4\:V६$IQ[IP]1@ \8,=ɽM0FJyOCy-~σ@!SRo:dpE`e0wfErn-BJRs&6@M B  !m%F5"coһY7WFhҜअ 0c}3n$#xA/,T J.!C*5U|%_+$#juMSm(91W#-o!gJ Ы`md.Ěxoj0#/O@Ӏd[AHŨR9Q> /Length 25 /Filter/FlateDecode >> stream x+T0P0t..@.) endstream endobj 25 0 obj <> endobj 28 0 obj <> stream xWypﭴk[$ZY-ٖdK-;$;8 ,rABQH @B!$ nh9vRRv&0$Ph 0妁HvrUǾ߻}L*F[Wl݂ڋV 6Ջ6IDukB#0p { oͬy CKj<}BwFO8@Ƣ{k1L>EH? _S HiDVZ&W(UjV+ UF`D& Bv04 3P}웉nIH5t2.Ds_]v1 / C@FGc0pfh&rc}6']aQ7,魚qu lt49M7kld}v&iemDz3:1Ca^ 3ћeDsVZcaKeRWUOO 5۫t\vzR2DG~H/2YE58fAk;fib8G!B"uEh$t/ޱFdYۖUE. v˵l靏k;`#S;Y 1(!CF2vBV-l8WrTA}ܲyc^Ȍsr{z>:yƪʴE&I %jy܁W]BPJSLo,HOȅmPAAr[HJ̲//.Bj@g><1F?5 4( +r =v,C">}\mcS>Bktx@ ?^ N5ֆ8\PU o ,| Yu.o*תS~~ {١:p8~!Y`H[N,l&;C9-ųv:mhsmoj8)TYO˵Y@19q@?:?o<TsN R~ufQ6jZӲ~8O |gQM-rw>mP8^I{U P#["B-&iw ];ZƗ`HUl,߃ 6arvM>Sl(9VCWɶ_fnW]@ZQ=GJ[rduN(5W/pG:w$~Ě1 tQw`ڼ'?2ŚoS| 1~7^ں9jr{`kTΝ&:iB 1$o5K7ٔV*{G Jؼ}q>5y]uNi4=Hg!e5w +s3 δ8|P߲"z= ,l1AYwe+iffrrϮ!V8XQp]MqߵLn .osKMmy?k,7+ǶN#AG`~tWKǴE[%0]҂O',d(q$[N@  ;ya_J|sZòm]Jnҗ:4ZE GUf 3g:mŨҒݼJ5Q{z G?7"{Q,է8oT >9,=>t/Q%iFvBnR*Xj|ds6 RMZP)z(E҈ȻĀzϝp~t+[ !"/(A*H$}%Iҍg Qo SzZ#O1l"&F" b RnKQZ!br3j6".AmKHD\x1e#H%|J1Fr11/b r@?\ 'GD\3gE,Cs$&Y/2\Wr'NJ$餃] 犹9}we"r}ɉttu2MEL4s<C¾L'ғ1[__gJNrQ.<M_΍>Tr,MAŹX<$/pչ*m8e,"'`c"6d2>ߺu#–̴Qo4}.d,16sWi.3"4LW[?ETXOR]JтL8@P%0A8.>N8YB endstream endobj 29 0 obj 3400 endobj 30 0 obj <> endobj 31 0 obj <> stream x]n0E|"l$ Cː_ m.@/sS"A+ t+P[5ju^`u?翹yt obQ6n܍"(Ԛvrò]_}5 BKV&i;A!*> endobj 33 0 obj <> stream xս xTչ0޵e=df=MdBlB.0@@H @@$h-QA@+" ñV1 P{jz>E)zU+r>RLp~}I2wz^dB# i_!~Wl7JA?v (ޟ"_ W޶iz{jҌɫhƷ3̣iqw~%K[Ah-{{k~!Dݷ}fM"3?4܃q{ F~Fn:TBh5}x;پ $,82i_ACUh+ү~A}h:?@ׯ s%/6Qɭe/?JB+_7бGt(BR%.79g͔[[f4NN\DP iѠi5$^^RK( eγkv]ɢӄBx"&s%vrG[|C̉6]xm y8ўEl KSl>n馇h/M;,?a "![ 3"ɬ}Bw1I4: $ ) Z߬պfjeƺ<0-Ʃ&M ACU)C^*,E9. !Hh44:]; Hk͹873Ψd5DulHTB\gWue¯i~kY'@auȥ9-8mT>NT&q5(PfCW.[]{[?@{ =0mKF/*UovYp%" 2-wN7r4S>Y7~YѲ7,'c3Ŋ |sZgeV~@ߊ,%hht@nW.raρ$1 t`#XSvޒ2`+G%:a`nXg%]w:p!qkخ$IN͓:gzOS$evFoYe|^2JBhԻ:15~lel62bBObl*UTZIUT2` I֦=k@] <#pFƜڌLt!r X] ']$`!J$GIޚJL4ԦY9bq*tOv1qY@e!~~%`N";huuZaփWHD5]_Sp]zVΖ )`Zb"J \קB|-puђwӂ6y?U0yICxcfó677ld/ZW_Wm$*T RM~5B,ʓ?Beb hCޣ!~G80qp'JHt,JѴᢌEeݩ nաm/r mB(f`cQks)We/%tԶ `,k,Np-Gs#Ut]A*` (:SD0]t w>+Q*r6}Y'ӄOP \>P ;r4elqk.0xe/no}CsᦋwcL`c&-O_?Uy!z./еCq@U:*9O/.Ǚu0ةi6`k~  x=)gcTWK4 E.\.ɕrq:W_J{JqܥlJ\mdɎpW. @ !UYo`{ QY1abB&&u*:Ĭ*τGkmjaׄi-sf++ GfOfiTbӖM+k>y!XhQ,/*/^V>eιV2y0X4VqsZ3׬} .m)fo,iy ZIr:-⾧_BXd{QfY{p[,a %Jx,>֠ 9RrL6m YcW%{N칹쨺y^.3k0-403LD7-i%m&s5ؖC]XR 4H$:mPL Vl1QJ(dX n$YθfjpއC.9{ %\ν\I$Bޥ }qRX/?lzsH+\nL,Y,̌ՋuVPi>XD!*5a-#$_IITK~zL9+8DX::@ꀪv@.M#08q+پu@ױ`9HNwXKeY 0SBɑ4Y|\69_9pe+!)?hrL& eTDreojcfdpeu*/(Be2z'bsJhT9)~L]Sh!t!5夺`{j<P/,Mk+f///k dpy^V-KXIOWu]{DI.Wk.~Kwbs&w+yVߖyx=u䂊P]MUWR3Ȭwm_ItgХJXUW+ 7,Ƶlj蜖?!O[(Ps_Y֘rZt‘Dd!UýalU f0hOZ (<3 hΐf`Qᔜ 8cN,vTAՈaquw+(0V `Y.K4b0o3c tlT0k,Bؗρ4^u:›\&944niv8}X6C.X@6&JwZ,kV.:)^3E+2Rw~,MfA iY4egZ[RrU4-C2 *GN ~ɏ˩h"` pKJc99G"^KL)bpUVz]egW* ? #a25:qq .fe['lSBsP9KSԩ*ٸ6w3fvΜ{am/]M4`|}_3h>Ym4c_JχJ³(4a}IV=$M{0L5|0j*;\+a`xh5 `W(vgO~%w!`0f9o a pfVi0``(% :!ɱ0c6ՓhyRM՞Szd3g*"FJׄy6kf T>^Qrpknp`?0?eg,kɋ y\×_ᶓ%[)Fɻ '.}*+ rҍQ9Gf:Ql;k8 zj J*JJΔpJΗ\c% @JFJve[(AqL&\Ur09qOIF@0۟ݰ ϟq;=7u~3$z{b$QvĥjqHfZEc񢈟+L$EX,-?/cŇD!qx}bT?wE'#"-C"P?(9Vg"~A-yHiX/@1+7dF:qH"Cq+wEg{hďE3JgE2S"8EQĚl=ڧ"^,ų"~Y|]BHQW"JDY}""]$Vk">* fATMl D,T,.A'P2Hm{笇4Y%ɠWڮz GdqQE!9%vx@w1VquASI2)y,yR F~W ?w2f"Q^>^0ߤcœ"< *sL5}d:mt]kZ]5ƲU[^20ʤ̬8("UE= ZV̷W5N䊅5і wnfo|(,#^:k7Ҟe2`B~( U=35K9.t6:VU| yph"kg;`ff;PCh%Sj.qcʳ~tY~%X*j_mk{ _=6>5>>$U׹g;ܤN-tٳȃgYۭDtT1t: Bjǖվt u)EeUqm<:Gu[^g{=3-훟p|z[볿9s('wx83DĠa w˻ɻCWw^~}K-'oѢOd 0⅀7F+7/Қzyd xVĮ`E*E;^ VTy)܋^N`5ߢǽN/4l3 DgR [JS;pj.pEUx%/{l^R^\G|f ^RgDŬ)4CN)1:p8e1L ww_տvlFz$m .܅LJW ]yNW9WOeW Bz'㻪w튪qAۉD|3'|eSoS&I ˼ NÓk|1b~to t+*|va2/$k R)ґR\+,Ri&v)X)klyAv%q |`KQ@y=(rD :iJ}AzPdFÙHsw]NJ{mm߸!Q);v\W"^/pzG<,3WW焣> ^r'$a ,.o bg<^/?[xR/.3R̹-b .a ĭ-b*bVaji%I6pMflFت195ϙ,fBTgJkXtlؑ,&Xd5a~NZj06aXD4r&wnp}=* CrCm,"NQ )ať2 / t!"kĂ]g̙o>z{/Qu.r±ˏ{EPg9)w/}W||{}.6^+)d$M\:%t = FZJH%FS~g=_GOlt[)T~*ԧ؅DZTzM=}Y{K`W]9JՂr"]N в( 1G}ZUFʳwT3ފOjd8<oyWkUe/:{`E̾i7??7У=Y7~MT )p(֤-v7H*7 rRzC vJjGT#"i 0 )G.lt٩o2)8+;MٯoɑLM@rt;Gg3\OX(a%3cƘ!0iy̬QSfΨw _bc7뺴<޷0tV^y^NC;b tNЙAga*[ ۔~^LzqjzX^X"N۞g09i F2.'I+Uɾ< {(9Vٙ>*P󲮣w1]~ĸ.[⧇/1c}Ҹg""!"L{"~f~f5?ߒ_aOěDPlt~fc.~BE._MubǞM"nS>~f{CwЊ̭v m+"*Ű](&|Ъ2sSϋHDr=mwXH+qD4zORHag54EJE; B9QGsgck&'*=nmUaAxVr2[^d",NGY}+[gI$ZZ xS8BK"YZWDKx|=t/?dlGZMnOjjuVA\TlHn,+h@ N[kޤۡOs2[DץE ctJ`—s ~%pkD[FbެeZZGtnMx5Ґ4n|?yɏpmgQq' &Fax ~0FM,0~/A<΢sy@?X1>Ë `p=`_ Ҋ>y>[?R5vR7)C'>C.FT!Fi0V9CXDIȉ%*pG_wRwT+33W2(#5:≱]ڀ[xX{d"Rt5j@Q"ue&Zw3MC/=PU7 me>=Bnxjv}xSpGA_)ѻ7(LĞ/f!IrA}^wo(/R@Q!PV♲Jk|~T?h*'1ˉCuDȹN[mz%H׹Ġ& Ê-ʰg:F׭l 4uF Tzʺ;9#~J=n{9/;vqd5]'z}ӻ`V/4sŽ|1\W]CKqXw^<{yF2ZngbpEG{}Ϯ`_n;vP*NoY1nq h'sZce?m?k`,<`ۀ-JHu+# e%.C$m_uV "feYp*Lf{|[tQx˽ʢOfSaMEC#"/*AKFv>+-^_s `ԀN"-jԻ[UNۃ6<([X}Y{=erTPQ'$&\'0Q0 Wx09)kYYw/)ڏVm;3pcw2gJMdmby7_psI'Cm63ouFU+>Ǟ&g󰜴Ҹ1OOɾ8T7DZ.J8>t| >'θp:wǡ)c' qBvơ'>L8.gqX;=N80Lbvjx  ) ?E8g}"wҝ}q!r9~/q8l5PuE3Gx]c{MKf s 8EAOutXA2eD}&hQ,8\dCD'bDmGYx ~S=ړ5'sP4wUkA(R/c/ѭWZ[7sW/8칔@MqO+\&Rc;8dgHDo ׳N`Ÿj@"^>{Nx}g7]k(J~p_Kz Bc3~@0Zfz*.vM;LLSw0 Ka,S)\N۩;#:ǐQbRCLP8V)SHJ;롪o{v{AyV̜55k:/>\6 3yqGΝۿh)yopRÓ-׽x9e/&>/@ʛ U&#xqy/e/wKҊH8˝R}ڼ=J //y Gs&b\O8[}k7 v۽KQ'( a8y_| P}?#Rm߹;hwe[+Agȯ7izׄʼ-JB"-crj7n1s㈼#h\˷Б9N }Af0`%/Fsh.(%c?Йe{M 1wKiy]DOr'߮7yRߗd^:gV4Z!SpL*YdfP{HUj$Á9CާΚv=w|;k>{af`{gF9U#{ZmPV xX/:=E2qUh[!S+*WmY̛fY`8gj!^j'LkQl6F6Eͧ񼠊cwi4(CZ1BlEvTeUoLT+^נjc >۱QUؽ}mdzn:/(?S)C3ͤL3݀s jEGP ?YuM˸9iz+Mp~1jPG[si\ cZ,y/JQQ%4W]6V)hwd|/o.že>BU{I4Dafz4 bOZCngQ9?o-[1ܚ, -VtG6Qog9kr*ס"D6Gy'ٸMuٸ O7_S9I[74w8z`ъbʝ*j z{rpipTCz{ʃsf66/6s`wpx5Yw{xu} zW{pЊ޵=7Dj#+W kSýkk{mW*[W\;8MWѮ޺~pP+#?8ПpMýCkW L, [lx@oOkW ~ڡCiotqnSaJCA~]쿵wpy׬V]aɶV@ nDh5ZVaDEh*a%?54ʨBLBoK*!%K^nP29V#jئ6 |7NAmshJ;d5_KK*9i]Vs%ZO{0Nm9kV)dү=UX ])~y+GU_[oa?uW*X*j" PJ)5\ +Uھy>ZU aV1Jg|PARoblC寮ۃt0Kw6oR=V)4r짜\yEoB?7LOȀ2:ꚗ+8okNv*kƨ_k-JۮVDSQgm~yUf\]q5]4vm؊؛\?/&Y3D[a}ǠeO+߯'-3 .B"|3ŁϿz?%S!Υ ;pNc~&1~{fJ~x>`dtƖ,zXpbl`ldؙc1~/{iK$X > endobj 36 0 obj <> stream x]͎0<ܶa"E+?>'4D!oTwWCζݱkק0kpcs]b$mzO_ߪ!>۱eݧ񙾬$ c]ӗ_|z gnJdJpZ ߪ[4̯:3?>}CU!Y*]$tJϔjfk{.-U]h1.^K zAzڪg} j5}qC~&LA! -t_@ߩ^%lt}%4=j4/O~ %klB :'BB'CB~K%_s/'GBBy_.!Cܒ#nP%`ﰗ%=!_=/uUGŒbq䷘#o1/;5:uˑߢ.>c/zHiq}H8W^:zq.~@~W endstream endobj 37 0 obj <> endobj 38 0 obj <> stream xY{XוΌ̈Aۼ`vd ?Rĩclj'q|f[K5vb74v[M7K&=w$0vtcs=s{G"02Ah 1H"BB8o[@ܻ2 DVm l,R=BK2q?kG zf|=}˛}ϖ0}/Qw[<㛾r yY,.< =1GH u' a|xDdTs9t/w2]~Dϙ;wӞ8['Z3pEW_ Q#/m|'Bʪ% (؂`[19*,FWa\p~&:~Jb#2YtcýƛXA M)+}:^؍Qu|d"s9}uSd"(0g=T63ޙA̡G!_t4sf9#G߆tu47Yذj^qTUe+/+-).ȷdf[ӤTc4DGEaz2jzʦKNg.%7 "VU[5exԔ5Q,G9Cu8Z\@OI:ѫ5Mט(`, u{ElwցɈZ&#J͔|8kt$(,2V_mnq9KgnJ5ZӺPRժzͥ8DCGɜhC-_wR7؎3jM͒ԬW`5Gs6굡u~Cb%qӑ?UItV' ;>H2; Fi|22rQ f߬*:Uc ^ڠ.jYRU OdYft4Q7 b?% c- / H:UK{:h\ϼylhsueձ POwTHF5Of4#.wj"DHTt@PqD)LaXqn } &17Guڂowr;#d,ܽ:-}]qR|>iX6f2SjUR:: @}I-3hR"uQZtǸ*am]f*wB;% uh#&5t vPwqeSìaNP4@TjappMJK\ta3ӆ0, Q-Z7eOlbh`:+ #FQ,h͋.#uJ*7(<!04Cj[,=P0Uf^Zsx6NK!"_"Zz7,bXzeVKmrMv{;X7fV3)Z&eP[ Cޚ4sФJ2"eV`4}17& a7E2㜌 dMF/R ` C98Ik"**r].yjʫ*(Q*ܜFIB.=5 G?Mbd/?gS 'u{$dzYqLE1%RGę4 -w'n}4<X؝~I+`:v2+oX :eZNYD>$ #HYG$~2y0D^dI!Y>[L 7)Oا^|#v]r*H#Q05{]h&@%J٬ Y$++UyMM _LK!˔\N5<Λy&3Snm ηo[Ub*) kcߝ V,I1z۾~nԎ[:О: A،dCk <'s9©^ 1.p,|6A`߇fG78;Z=6P)(5JT,*FXFi̲g5edyb깘ִx5߂81Q1ZIU.6O ƚ* Z2*%U/Q&6 XPb8VoPJsaqw>+:\V7QPU8odrUy< X$&#kg%K7BM8D By.@-`R+ c}{~O}G|b_gI*tפ]o~[n?X{x%5.=?$%țq^pZ2Kfs X!:²MѸIDӔ0M_]P[1Etڻa1o-G6HE0d\d?gR;w[cse%GlխCkru'Y(X)vJb0$_-j 7ÍNh٦IUHL/h$:1lzcCmeo"{][Ѽ9 / GÍ{793j7T4&} czZ+uHC#Vz]HB -~aΨD]sq!B8B˾[[QKLh3hd%1)iE[\Vnf;]7H'=UC ٹm~ǍW8*Xwd-?en.LZ=SŅG+&2 #80` bWۻo ǹbZE"Cط1~nW=Rϟ/Zdi v>Wgf^fSC:2b9#IEBEV (:,!+ܤhohj+G(&ޒlB=dg-1B >m 6vr`ZRnI590 DӔמ> ) +T:xvӟ#+ۊ*R :u{ ^CVdg5 T4<ՁÞn.K 0X C۱z{G~x͒rkN`5l9 Q\J8g^33h715._ꈨ"0{dz.EΤфg;qFNk޹|[z!fgwזv:g~gm0 7? 5T&h2 grAvG8&00 -%Q#czv:?o~67V#vwx0Պ<Z'rFP+0hU6ß_ּFϗيU^71!o?C(K@|wFլYRhÚV#n{M>wg/Ѓ!BZ}A#unhM@UzoCFMs&h5F5·VidGwkys羐<]Gsl !49T66fv.z(8A| >/Ƞw0^a0 KpBGbQBAv`S(@)ܩdaQal2T1 m9ܖ E JkKҔ$4ÝؔD:RIEI BSG 6t f)sCc+5·Jb4ӯ>3+ =` ^AeìA^3܃X<>4f5Lg[T}:?ZSnRukku>81j6ڛ٠!Sb cd<QpBsJ6@ &~fDSoOGmUR&n F'ZOx endstream endobj 39 0 obj 6082 endobj 40 0 obj <> endobj 41 0 obj <> stream x]n ;Oq{؈궉1ٺk?0nI*ăo_fضIaHW7<Qiqڰ4JK_eIؚa*KٻojK^͕o>./x.XUqC穷 em[_!/}39)m/ eT 12ޅ4 \]tG<:GLqAG}F?tnM1XTC-Rzq8ZFD.ih'Y}xf endstream endobj 42 0 obj <> endobj 43 0 obj <> stream xzkxǑ`W  0 H@S C%aDZ)T("- QrlGу,9vcر 9N*VvIDx#}ޜcڗKLDi}}jљb$#tՄWṨ\]G*!T]o eBخ;GIHxdLzQ7k㻣Džv/ ޷kj8< q;?+ dxwD|ݷf5Nr>=|AqoA]F5 /h i2lt ljt 눙L H."!w~߈' ] zs2B&(I2Ƕ{0#dB&69J2Kn_tӈ<@g|3&ar(c*YbDF 1$ $7ZCMAѳ1('g J=gt=-m^s]&65Gb]}M.-f4Md2Ӫ* f:9*)pHvHc}1. \¡+4>G{c^uӖkl%Ą"#/Op8wnSM>a` wa#,;=Y8c4.L7IWJK|+r?&aMj-[6ŲhQ<F <.? :݁>uSNDb}I\&;]gh\HzY|xȃܴo!xGñOPxĘ۳e|*VL1݂R0SȂ"EvPlɒ0DMjb>tiOfV>U$%npJ*knb= LO\=S#Ę1FFcR53mTscJ?g*ݹctcOߦM}S$:&5>WR \LWGF r ƵitxpRq.F3bers) ,64 E=.w;yUSlS95np%@E5*r^DYa|!r#1Gx֟1Hcidt k13_=;*-4cDJYK*=h_=QF>|,0-&* ":b+Ɇ*`"nfK\PV8Yt.nlCХ^S" Aqh,o]>tપAX9dj9wvI^lXWԗԻ&{xv˶z>b)^]zhT /)k B3||X ty`mr+dZtFyA3A.{%h[3:'FtDMTz 8NN8z-/h*6C~#H֓v3ɼLKuMbwdtbCbA`="^;X]=XjtR*l7uכ0 zUQ;h`X# :=̈́{GyilCwtnclhnMWvuѸrea*x3@!e 2ˠɇ<^kJ֍VZbn B좝[IPA@PHUD s HFvH**b0כ2Kյf0>fZF^dӚ#Et9ÆZ igZ̝EtY5ˮ=3={0T/s%^P㹞s.6+wsÔ7<ԟ ̛̛:hf7OН[JsO;YVvG#mH@b,w(1sU| 8]^*m{o<ׅdjL2lTtT9 Gup `aޠx r f =bX(]loF/1C.KPAAcɨI"PD-.u8'ˆD!W@WExA'Ex8ʹMKYZœ&$KZSiQD[Z._K/mDM.DUo\T,Cj@*Is_}*=rw)"ԈP eѴ9/a^ 57qy6?lx hHRzpI$rj;ҫDUU { ak מ̍M*!Gp츱wz N;pNhi!!=} &8l3pV!_*넑z'xQXܔ ]KaBh'eUj=P:jSul SPқz^Ǔ?DI`'+-+tV]ar5<~\㟾{B{箿m+ݷ~bpkso;o|w^ɡ/mZF,pԵ&\?ȏ p ʅ\}Xp`pÕVc'`oۧ(QR 4f8!:dp٧Ol=aWAnBĨ!#e\}jtZ`D`; ElK lmy+^~,hm?7.m7~{ߦZzAc]W?ЮEs?<Хw_$p+!}Zpr+9˫Es9d6ϛy3ۍ*:˼^\!uaXp{[Bjf +s H%@]}nڇT?ҞΦUASnk]=ծJp] 宎?8ߞeէ g]iQW)`!c(%dNOxaJZJp|ArVlVȸJ8Uyj%WQ V[Xl|̼P4we9p/vK,~KV`3`W[S / ֺ[?Q_.̬q[ol\֢P%ۦm,m( 8+W [*Mjm+Wy#KA䯕#e,ܲ2.Xt -N MA':DZfe}h0ho;i_PBG!-^e^? ^-s|sinɞ#tf|Awtp6~f?nSä/I֒z?֐dJqu]:ք[Jt -uK]6מʷR5yE%k|DhKkz띹e/f < ]'|FҹX5봃wiƠ2ylq\AuByՖEL 3hDu&,W#'0s =|gi5+q ٤Z5븢9VW P֯p&YNvZoi,Qns5dz߮ͨlh1;շ\ P򓟌ǹƬ*?2Χo|2٭vJs@Ȣ44HDdB˲ 7`R*/:Ut׵ڸNh헊`PMXzq"-Yc`!ekPV޺Ʒ=Xօ?DM;5{O//n}K;YcovU,qd̤wjh􏱅4+&;p:+zVcu 1^C6^:anлnzW|:cN ؀*(٘gAV3lAdt%T 6/~SEǫ^*|Cb'fxn,0HQ|~6'/Z|qQ\,<)qӰ+p,L5Ur)M."}xw+Yf oT_XQֶڽnHr(m̴m:dob({/ ,Yd9we}+-nRYtzʋ=Yؖ-S8u̻Jw_JP1ܖ3CrZrhK6|J=5"dJfk!d4O5yAUw2cNnyEyԈ=oNyJjKhIb(."l_-+l䢪" ;6 tBz2`_ ۳kV'j<&#NrOz haNnܷԗkNUYյUg:C'/ x( \d%[UTa:E8^7ϒTúKV+ %a w u)`Lڇ{W YݩQ]Ed!sT(, PIiOy]zzJFթY`d.ֱ/ 2$~e_kok#%斿x V?= |v{նm4n3޼iW>A ߃˓+ϖv'jMp$mnq"I>hȤ.bEǂxYÛB<Jݣqܲ:%*cJʃs$7 6;8%\,~] EsK@|"~J\E"_S@|0H94'Gouڜi=6#.?SpBK.uAEm"ոv^qvةUXhsu3^0 XhÅ|3ׂd5FJ}jx&еD6Tk_4>S~gbd(G55|LkӺL[S(Ʃ[Ӵ҄<\&Nʄ+k <=I5*:OcJu4)ёJF60Xrdp<0s"^>oz0d^>_\߾}*)asm;##ىItBxtv4hr ߫,wl$pW\Dd~FFд险#ʩ1߾;&|I}cjT?1iLT̐ 2FI#d@T*#7|I9j#U ?2 *ws,lGFҌ6;IR'T0Q#o iSdߎ;~XObV2H٥ʶa{ ۀ}#Ϥ Vy]ۦr^Xa$5Ɗkm;cMFrLUu'9'TݽȱUR%Gjo*WG؉=FqXOvW,r2fI3S7Y7YG em*6?O%ܨy8Rv#W.mZcD&3RչٞФ:.c7*c[wrA,{3ٴ)G~^=zRcN >fkҶ8}5 I 7;׋ X(i/.SΗ9>JHw$z/|[~ķ3!_zjW ~u/%iC.d`?!;%`G1TP/xWW:r+/^ĕ_xU~F]rBzw^JH_bGK|+MkBO<}ӡS?}W#7Q _MHoAǙ5ܻ'cp*؅=UIz5g3{3rd*+!z*}1y9ScpgClE~/=z>U+K#9Tڐ 6tɾNq9n,EC i35s`>1szi-&kj8E'u7^ ~M\Yk^99GmnF" bE"} oųfçwZkZ{S;O8C>By@Vg اqn;4du~+7 S:Ntp­z/u*_[|p]v^o#W/I9p(.3'l20sf t䙞^sĖM1mmeO{ 9#IcX־X(Slg줱v6M]0zqc;;S<Q>l"ѽj)P"&w6 rVߋpԔ~0YU2$ o! endstream endobj 44 0 obj 7708 endobj 45 0 obj <> endobj 46 0 obj <> stream x]n0E|" !R$}@!TeȂg&m.<}uM\֚%~`<]qQ*6jEtwQfu^`l0eڼUlz:]x ؋|]s_0]DU0=O{GijP6˺ # !)NY4̮W{{LJMSE`К$*d!g 9'5; 3=3y̴"?]9ry$t{hO=ӄ{Ȭ?#~ FfjKYv"sn.M? u>XOM&S}th endstream endobj 47 0 obj <> endobj 48 0 obj <> stream xV{lw8;rώlļytj )ӗ˅R?4&x'<3BR[WomhG*$HHXlnK%S698/u&~?Gsd ro8 G}ҧLsYviu K3bSgdX'E69 H! UI.䄚T.ݙ tƕTBzp"lopm;6K ׮JWl-_Yv(/ءbTIIACj#n%ʹ [d7w8Qdo=8/PLicDwo|Q#MNfO:2z^Yqhe{۝NowȑR%`g&K%VЎ 1g~$TT^8I|=kH{Ʀ(jtT{Jӱ@C5 m`Ýv$nBO%@az!1Ha'8&B;Pôpj2%'RQ,Or* mVou{ }5̴37}ۂHPd{MG{{7 udrᭋ&oxmʡC*3 p)H:qœ2BO #(xMxϚ 9rܶHY.}?xM7 hl g+Ip*pZ j!rcZ_}2}ΫӏaK?bff_p)TKȕi]MܘSK+mۥ;P^ygPxµQ9x|Mr]܁g楠0+q/('SzwMIch|9BN2&2v_q7{LQH(m$'ں9K_}_OK 6޾?z~>Sq8v &jx Z JBJhml ᢶ}'y]3%jwȅ{s-<%\cT {8$lM&t+)Gw:vܱ#dD9MSC$:x[d͙7_ȑ}usFPiayqhcXz \iIm"0{'Oj}֩n]wZ=G"-aTVcyUw} Ϟ2\0t~9j|#4wjKrh~;or0r{h&, B<UwRowГ]IJNC޶ص#x=m#[koieV}VX va 8p+YEp:,İ!DO 1Qh'@tCQ x<QL&8 Ab`BD^U׸Cx$eds;+t/ЇlX2z/> endobj 51 0 obj <> stream x]n <ʼndYJH>tQ> ߾ RofɎ&d~T =L+\e2ڨpҭֱ,jy 0Զ˒eo16?A> endobj 53 0 obj <> stream xW{l4}+#>;#}v㾒6i64%MKI -vm'l6iZQmڪ ui !BC6iL׉h 쿝u^}\%@ Ԍ۹stN6߯侇ƚJ>++&hj35Sb a/FӰ,9f>ں(ZI7ĝxXͦuM:R]FLEK*'McccC;y^m">[-]U]@ m*,-@ r$=0-[ī54fvL xuuWwSr֑`I4 D~%g?k;qu̚/ci4SՖNkmRwJm2,-ET*vH="ZtS~7k<0,@^|b6ٶPpD>{f͘JY6Х?:U![5TpMOΰdyw%w`mk`F A^IBfA->߫8+ۡCۚo}Lt+o$-+jdS۴Iހ)T*?^)"OGwɇR%X Vb#Dmq]8ʈLK2-?N6yɋvkQq6\u4h4wIqazzJMT:* },r ZU "Q3A[xÆdn G}wfGWv޷s4b aagp~޽PyUx`ίcv>='OckJq0Jj,(괂=,!_|-([&K}鈿ի*]a,ﶲFw<1rQ듕%M64UoOUj$=A !A.&0HG{{lɓ{=Ͻuk/A \Ke=XgeU_W_ _g!Z)?jUZ hJkFC8x$ &hWAbF~UpNjR3SFE7f:U8``=T 6Fuæln>N{\"_t.̋&1#l&@N1y]|!]] Ny3b.%el&=+rbr;8fDrRb.8p___JIO%f 877Ob*)|(3^nΠk Q^擁Lee!02i`ێ\EY<܂cYde-CZ5(sqG*3Ya1yZ%fWz,)VEdRϏK?g>f~_1"?ȥkN%|B$q)w/\ϠϕV'q6s0tl}̕sQەYܸǮ endstream endobj 54 0 obj 2586 endobj 55 0 obj <> endobj 56 0 obj <> stream x]Mo0 C|Bji8Cc41Qbۤ@+;a՜3,᫛T )&ЃZ :/06"|m^*6=]!_7|Tۛ_0YD9O}Fkh_u[S,ي4̶S:sRu]`Zp˥WRQf8!)FN3dys>E~d{$Ӝ#q!WĻ5'33<ˈ2ЧGdYggd#-)\%DBݜAw ~ߌ,v }&T endstream endobj 57 0 obj <> endobj 58 0 obj <> stream xݼ |[Օ0~}IzŒ$K$kd[%NXq(Va;8%v۱R l-i)[iP-L0:1@ 030'Ym-{{ι^yblc?ђ#=7!Hn<ٸ*oBCCRXn;W T7.+#eQ>RP[O|>aHoϊUO-&-6a+ {{i՞ёqB9YXcϯ|!ܻX-&,O9^P(UZM T"Ym4ӕx3|Y9y`iY9# ;Ɉ0OXzi-G_:PM'cOdD\)\ގO켜^&l9[xlD=uMꢵFз_]O5`*=ANܺ9)Qnc\V]O_,v/|rY()Ɣ2J:9f dUԯ\z>n߾1?竍m{׆3jb~uIL?K.t 1!t|?'Y2|NXɻo_S/U>Vo)L"c:b INiI̴|E{f{{}c& Ɂ4z U\ޞ{*#$wh՜53ͣ>}1>kQi's !K5z*2Go,()>}xw`TO0qΐJq69ZrqmFAJ]AbIU4ԙ6,@K~jy%%%]`J$җJgʩ*s5s&ߟ޴ԳT`qvt/vd΋L ^bcz;kYJzDCXnT{E" p$A; ڷعvz9$S"ݍ^k2KFE#W٘]]p8hL,.g`|Za rVBM3McڢYm#l]EK\RGT`UJȡ[^tqm+m- Z!n+TT-,B?!O+,n{CaW*+ɩS,"ERBb&1âW$ 8IhINgp8,4w Y̬gmB;eSmXft,U*:UUy9s&qg#q m^QPӄO_򆩕(@cpt(.\b=/-NEny%Ԝv.j8u x4+hZD >-jZ02 .íE Lps-B@ :%j4MJ5dwUhu IIpT(17l ,ӆ13#ryc=6,tu=z0KO}d^0j860,RҾ)^M+CMp7G6xaJ- Htz ]eR NM*5OIVn-=GLC/|>W7JRyq5~ Ȏ8`Wh jyf5++@YIlTCMxҫ߄{_(X0?/VmM;mBcnssssF]9!g(iΐuj{mq6UV;OKsf&t*zNv5 QIқjsy|n-32sfZeȁO%Z@JΧVF 'K]N|oٳ7m &ɖJ5jWQ"rɫPO>>}jSYpwl;/<_8OOWp0x&SqQաEiT_űj@z#㍶>mTW(3lPqP*w- s*A-)#+/eg\znZ9bL9)Z'D;*Ӭ9%N[V'n6Tgr)!zKwx?Re$ i洓=mHHUzMΈfz[NHj.``z fJvm@%[z$ +LjT>N*YeB~Zѻ]?أR?\P`2 h|#>ӏgQGօ we@y\Kr6Dmfd7M:L p=wX8kGAWg XvXEI3p$sU^Œgt1%.r!m??nGܡUD<|wOْ_|C}75m[>pU_g-)v[89(UH' v?hi4n_K%+-"35f4l7f -d6M =0q?2h#( +ygJN IՖZYaT cRYΩZ!AB>A#ieObg(]Uʘ۾}nEօgt+Mv ̳^g~j^]dAg55+%5e݌~' dibD7pNnjp΀+3hȠ3aʠ4#px' }Ao7:-bV΀\H wx@—ǯl3 tp}~l5ݫ~bOB֣IND-"&^/R92u0/]pR|^|]~)" [EB'.9M"U)vno 'CcXb C+V߻dW+T @e ڱxxxZd v?E>5qCdcllCH" '§D49MzRE` 3p~gE8!½"*„}"DDEC"xD0d@D8s.Feؖiwe0eZ2E0Rv&{%3vR0$m%le7wL%f1. mX\@Pn?NJy_e6M}ş=I4)ՠ} FE,K Acpm*G+aktr9f(Z:Q:UVj-FݜŢ:67jwoΣ?{!ڻmq3Vʎ ewi3) ;!atb潨}tߵ?ion8Ey퓿Sw4g%W/|eIg^0l/\UвymPTZ%n\xݢ?Kq/lȮ1كԟb=I`ddpw.WRb()* DJ"w}pT@P?7}4I_%?fJ I実TL ŜY˛/]ͭY˛r54]S ]`j"D4{~m nd3S<=D:hF[NAMyhRDOv@& ZYBZ\ba UTfyUe S w)p%lZO~oE;5ZӂZR` .ש!sќp ".tj].'/u$YVg7-(P'fQWO)a`In\E{hz,h O0VEl>|nkLt|@6b&,fUsuT_eK=eS=) t䏸mycAՊ|e*l?O3Յ|Jŧ &" t+Jn3cNpx  MugA-[E")5"tŹ"f_ ~Ǭ!> ҽ"\1,Pͬ4}ޏ6olނDF YaKs9 "K"@ oD8/v{-ODA_'U2|~\"H%Yqbw_M]"_簋](r; N7]Uwz> X!|=ƿM& Ys~SCbwsFaydO7r(AS6bC-fT%)1erc+/_.{.{_l0 A*i57WY [*x!ǁ<ᓼ&, 6v{,zh cK2N>8L [ Uv !TK7Ug,>h!iM!MA q'nYo0`Ehe)%%^Ԛ+Y@ fXgϩ(GxJXgϭ |^ҚC? DzgHqj/bHW\gU.ϰV#js7#'ByА rAsnn\fAWQ;8 ?1whh.-1e勪̄CszfPd**(G%т&ӎ> >,wQo ,?1@[@ B)[6dF- , 8{UWAѬ*JFͅr(/7UˋPQQD Ҕ&%Q&X?y0ӱ뮮|J{!Pc J6p$vmؖ5[af.3wk6fuz3-k|:KjAfx A{nQU=?TV9[_[ܾ}qnn (5z75n,vͻze?&b!Ť)TY[ @6gFQHxl8a3nP guqdE0YOӻ<ڔ)ϪRTh(^͜F3pH8/!39,L0"@Fd6ɤ*ofN!!JAΜ$sNbO?nrrZ'8! ;_w~&:zgsɕ&*OZz6cՏn lg#zINru2L9Uk6u_8f3 &y^rfp*69wRoX0~y0|Hsv8Q' 9 fTT@RQ`u |N:Mq6:!AwpZn;xB /w '+r„  O"'x`sȾ$]{˅~K@7#7l~+*.®Vvqr#L课wm(I+C-J߉/mY؛WmKm_R'lo0ʚCf-Vn㴢 |bN+c.+⊺R\ݕ܈O?fW.~5y0\V~3e't{xz+g`S0RYkw] nݬ.-{]'\* e|1יD->B)VLj6^vkKи`k=R~vUaZ&L`2i|84TԘ?7s 3.8{]p v1;Rq 1؀;+v}_%cN7#i烲.cOxuMdXU"8Wu{ [Ve!7m*:RiJ;v;jh.!ew暽W<<в_\$mJEe BEJ*u"OI2@5Z,uj![i՟*!*RTRIT/A2&w` cg 7}YD˯ȂoXȩJP}=S5#Ouo|8N9Z/{[:!ةJڽZh$5fW+ Jf)qjbTjШKFm&8'/hjg#,!yCnP'|&߉c0v"b玪]UtUrsGUN=J̱,m_^L,-ЩI$6+.қ8Xmh5Q?^ R.͆>tx2NoF"yQW_Ƣi\@j2?p [SCc~ʿMG^_">ȗmx5S{vmyP 3~h9aկ/ox'o2iR~8?;`^4kbN' lwZ`KB- 3Ə{2IT 2ʜ23y_i"jcE@NeGn3ɜ=v(2).k˙㝏'?/8Q6Cu/:|tiTغequj͓;N˷n|u(fql>S;MS! a@W4S3:5h-iCZzZ 8(j9Łġ_ sEz(׃GX-ǵ)Ho0` &}&3$)6$ȔH0|tB:+`LH$Ef)S*$x!cZEb@RLI }E1gշ`UsW$_tV8$=J"q7BRDJ7K1錤Kn* * QtR1p#=d!1yS>xN"J1+Dz7\wfɵQfJDHx嫣Av{ԫT<;P- «n  XwoI$mn{ }]>5ge{4'RR̖N*jhjTO4јn"P3@ݐ, ]Z5vD ~Hb? .XY[d -ήUnX|5*s % ̍?RZ'ոH^%Ju^VZըڡIūB&{XTNNIJQKh C% sAѾg>x˭ƙԾ`h࣏ܴ{iTu]cߓ@+U8?9-Rl;hhLGOЙ5h` 63ՙ)\JʦZ%)7MSদ.8A/_!M4dIpjnQQR} Н)D/B: h*ܴZ+{3Cl8`5|$2=4;Uqgd>N=>~Kͩw o$5os~fϾGC۷XGBbRGRO5xtưEagji `" %հKF|@wgC!$Z;^R^5P$|2Ϙ%n4Jă=ff3Θ8OXtY`VCWi۪O|j-}p/ummpXK^e^@`uiV]q*[jB6#ZO?0ƪ{Rsk*ozcMmEeUʕ7^[W:Ǣvb `TB2e4deR #o)bٔs:ө0buEYiǂ2.IUc ZzI(,sᚻVHuvZ޻9Vշt;|d)/ mۖmmBj^w>נoUJA^k8R2(ۂH*iƼͼuZ23DF^ ԢP*cMMp]C T{X(ƭւcȡ99e8vlT̘,] еAWbEW&; r1y@!_Q/ndhS6iݻk\wpٚr,2cuh[3i[y˷5]Sj+.IF(EVd=.Z7ou"ح{o=;1*BNב+g߇⧌~DjVN\m?x2)Y+1Ϲ}n$v|/fRlG c|Ï?YnB|&[899bT+~%7݈3̏O/ԇC͏)L(zD֏+oO:&r>x'*!?) U#r>b8ީ<ݥg5\]0j;SO>6טZNX[vc4EÎBk2*VbFq^2F"'%!wA&'<%ёcɴHdZI?H%"AO217B؟L8Lw;"ЁdLSirM4O Cɴ@dZA򹷓i%&*+dZ$Na_ -&Zrpu2B,C2#W+N.:6zp“ۛ))*4y=EýydqXxئBE5uM Z5^x&z \~ЪaOsuC {<< Q?6ʊ * K/0j?hD {Z = OpeaPo\?6у#85džzYo3Z826:D~ϲ9͛ {[;>_MlZ=(Xn)hxQGs1)Ga0~C?phc#k{' GV6 $ \@ð$kM\[" KzIKHT`~0A|L-"Udx.0.ݏMr[[ՠՄmZ0H!?݃d=Z,!eK*V3X, aEXڃBS/ }!\<{mr \1Q~' x z\Ge,2䐌!eܒQmBmXjyAʸ\G0=Q8BvsǞ-&c(#ьn2|B=V7(FXY)DK1&ʩnWҨL~6!2ϥI QhEsLoIeNuaeovz$6G2 Cx|cefz,˾?3S^;Hhc$<5 IB_×@JscE$yVO RCr0~?nG/'O? ~͠\cM Y7zg7aܛSo*o?a8Cd_hr?ۘC$xϦOPNA# K\֟uH/OtfnHp=uǺ?·o~<\p~OVa# GU؁.TǵL#;pN܇wa;.{̛Yώށ}<.q,+-{Eg!mVZGz&66l暖ۑO#Tn 4rKHE Uplh8V' :Vg*-FзV Ȋ i TszRMN 87oiRN5-1jfC;c=1ڹ8?8pԸJcQWǒX&B,qtOod/ 9@"?,qxw\/'~9=D} b\9RLk z-! endstream endobj 59 0 obj 14019 endobj 60 0 obj <> endobj 61 0 obj <> stream x]͎ F~ 3#E2Dʢ?j$`8}G[X˽r{¸cM{u1ڨafNSQ~cc_}XTU9_/0qy< +#cM~mzpźZ‡9Wtv1ZUMl{^pMv`'H~#$En/µ%asKתK=/_%Ngo^oH>-q>: gN|߀ WXпAx[eo /qػ>wH,<-kҿp҇)5H\Y?OA3'7 ۜU [ endstream endobj 62 0 obj <> endobj 63 0 obj <> stream xݻ xTǕ \~~-CWKjF=Z<@t $!񒐄 vbc'1q<&IY$?3c3qēS[ ~}-頻SN:uU@& G{zGt~Bȏq)yW᫄PȎ=EׄS/\&Dw ީ"ҨĊA5?K"!KX{x{s},m{zl_e=,WH,!-?`##2CWcT2xAhuzd-Vre=9^?̗ KBeap8ȰPG̙>M^ dCVZ5M.4/X!@O>P9nGDcCVa;ؾ (#RV>O^#gWGS f0|VA`Wϖ?Gğ={(dj'B? 'LChJ d\rGD;{|+Z]e NGfomclP@JH 'Dnб~5mW\kinj\ްL_Z$vQMuՂpyYiQa \vh6:Fxg[lN$_X9؋*I?V5ߎ'42b|SNc71A/!KJMAƠtDxc˟V (#or 67%'H^<_WVJJGARPZԴ%#6IM}M@5i 6*MdB2ZT+$Cur\ũ.d["d nLrwk:dp`cS2Ĩ\ws AԿNpkz35*IwfTs<0;-S &0i^fu'@WRL d׭LnLR?؋5>X XpG@l_6,$'v~á$Ms- erfDWsΩ$/P&'>dK?x)_RpUkߐ?)X)˔LH?=8@ "F)ؔt!Yi2J/}GgRnD@ͬQӹ0M 5*˗ G`dl5 Td%˓$=+njd#iΗId깅~ϋt52drԫξ/Ý6r.pW)J*PFL+W\a$Rg;=i2rIwRׅ"V6,ߤZWD+LU;C民d1ʷ:-QS"YOY)ff`aB5qZHFbt1w]ARndscQ"ZuV', `\ 3nE),>:Wbă9oM"Gl?{qV9Yf{ym۩`kTp}-=wd%h(+Ecp.='};_1 ty\>uG_RV*Y :,h|2!J+T((u: /t8WGOJ*Qh}l}>58b:N(I.E2$u>Y}}^ը;Ħ࿻H6`ī&瀄t9Β8 9DZjUVK^V,RhT><6|\#b Y,$12Q<[h I#:Z(@ crPus;9NÁ:^:^3Є~DOghS NM>) [)B>m.ŇEK"EЋpC"!)1)"vq؈!ϋďDY7D\(݁ H-K>|$Fq|ĸx[%*)rCQ~88M2zqDEF2Z΋722; ˸=%T,@ 1! xJ"^5I=CBܤo#H}d?߷otttkϾ}G`n: xْU[v[{hCGC p!UZ!yh{gK[8*Եznh?zZ[=> {ZN~(U%wp;88Hayjy4H1,*⏘4&4'(c>3˜ɉLG *n.CBku~ҙe C0Dv/TVC3q\h9^UwNW7==dL*[zG;wC/Ӄ-KIxL^œR˳% [jޤao7=zRVxG'u/>l}׼^NUx۱} >VzgkCg@M(Tj't.pHq簓s:Uv:@(JhGֆ{"aq2Z6]KiS= t d9U5 %PAޟiy u߱l嚖%",5yԒ3f~choPTp"O⤒jiF}ԱZ90lg_/VZt5m,~rGn6#2a"`^9Z2asH Zz]ёW,Zqtb%/?S"xm١Z[MoS~` e=_V%5r@\+- 'd@cAt\. 5U  c 7 nws ;Vs vjGsb)Θ2mVjA+'U"w~RYgB|̄,lTݾJE{UՋU-w7mg=qAUlm:\RDmwdͦ#zj<U?"_?̿/ ԗKK-yk%ڠ<5b\tztkίQ(Tzi.1YlY# )#[#)~AWt$ռ~K3{*[޿>N\~W|Uڔ0w_8ڻ|U%l r}gXE;At; +Z zJf8N2R5YEIXuJאX^:"״$j&k֨dA4bϓX^&kufM1WSH8vk+CLG""-n-G3YS!XMdyuN[a]Focll\RP~c`Gr,hsq|3sl%+w,SM>_ :U*i5Mr y';4-I ~ BNʼF5lk9kӕ?zG*L[`;"%=5T ]եysMZ"tײ7e :ݬS 9"cr1;8P-ivk[|K\7 i!۩u1KBʅ‹W ' A.Y׮tYkb` \s>7,3ʪNoU7.MtPo{aο~rrSoJsuҲE~}_>pK?/mm_rv0r΄刅NA15UBD##$m6?]⫕EAB&;%enwْ`^{΃X[ƷסouA 0f>4yx8p` @3BO`$d4E\.kwVHYFc;6Ǟpuh{`va¢7' 5\skr]Cc nfyRh@3n8J=d*=;?ᶶ~??OR/ςqv%-ңpEvz.8st^$~ KH`~\(qC"'lT΋Ag1cSJ f $|VtPnߑuԓ \ؾgk>W<_T X6&iJ= t39ȘbbSoQ/˻rr?XnX n6YՔj9 Cd%=mmD \݌6kgP~YW _,Yol1> e8  LMܞ!Ftd'{O,#Pi5D-I"8RYd=bEmc&5^]%E3c;ڸ~Նm#qu;˲a@-M*Z-/ϽW+_j)ъZjڴ *vzTNƲ4p0j?RX(q3Y\q1T-Ze)Fo[¥+|Muۂ/-}~κu^>@2觾sYD ,{+@  sx@P(,vX{^Ӓ615lźvI-VgnSdp\muB6QBDie,@So93Ԇn9 Hv}wR/ .- C&^i3lY4$d_ #]r#&M~mc廿 4< {6ؾ0M?Jv˱ިSԨ8P׽$7`CyiE{:j@'zhfȹZ1&71E"vpϳyVy=/̻w=OH),]y01f#\̹Y>09P!L+!VcVHC0eb;v_XYVh*ؚ*hiXjclu~aʙg(>ܱ5of٭[׆I9'ˍ8S*;!(H[biXUH2_Eˮъ2lTYbBnY]sEir,Rl }",}16:ArVyC&_E*i*ʡ3L)@ّz$uiFVʺG/|٣/*+5\ /wl^}eS܇ٛm t:ZMj*jڈ w쮑ezv8U4`*XZD֔m&5ւE#%;] ;;[L̳s TR,.KS7JX|+~%iUXSFJXJ}N1UhH-Ql{->.='QcKR*qOFXoKhqK0 MМ$^$½&<'}['$H@RXR~H tMҌz).^ޗԷYI%#1eLJ@$ H iR:%]J%ZAgnQ mwru{`b1ww %-*Ɇ*ڮܝzb.UB%FTWUU@0Ѫgi56-Rqa]_Rݷ_/^Nkw9 -O<˿ϩ_h8xp<-fZvIwgs WN> )_aȑ]]qa_3g&7LmDhsi&M%}AyY-6/`҅;R7]%E.W1{LW#E8'2|cYBzП')[1z.ןs6 7 6clY5-yYo/EŰq1s;Ptܒ\N*Qz6{H"s3;WyʋΘ3Alb̠W>Q_CœM44P$gc=85!%?2B 8zjEʹ6GMRTD-yb[G\Z4iCv-ki>7-Ύ5֮Z%+&֕,s]~,su`d^˪F^n٦7_%hs eŲ"gI;5nfrZMX̹:=כ^t /*z+k&IUuv{ K| kYMGӷeu\+YM>3M_N3cWT$[)ؒ9N7f@N_u5|<4!*U^r#>`4 ЉPFf)P;&A'y'EܘbO:تwa,8z0uDZ͸^$A8#϶AKhT.rIfoHp^$Qtę%@HwICqDy+%Kv >%;$P ͡ңof>0 K I+χnnYIU{MInj]U^<)QŃ5cOIpH㮳whv-E`[Arpn]6>1,r6^E1;P3uRG6ƕ[f GJ.C6Ŷ}r LS꫏\ JNPWh͞c3NfN nt#aN7T M(O%gfZOu*PӺiܮ5UZ@ .<}`DeL$%/]dEzP;I]NL$UUY*Ia&XG9ZkqjMa+ӛb:- 钉LŷbrxX GT,DR1})(HA0vCE"P^ՂNC6`u޺@̍_@IK*00~I;w aKw0u Y- Y> (ɯ~H_ MxDb? &#k*B@j94?ͼ."^'*hqoA2/r=n\+. ;~'Ǐ4VYvvY+}ޢ0%/3v-ݸtRȥrn{d.zԕjpqe;-4n'VR_J7}=K$p,YPI %yQޗ3/]gf9gw)+Vio+pp[8lR@˧CГ |=\.jv-vv3l˕rnEEWhUvx+:@wE6iv46t7黊}҂ǖ*3fXLgf>qs_[Sc )U3V} j> @ӆ#IJK$lͪf.'V@$9*` =ы1PD\a2Ab(p8w!yəw|+n09xٹq(g٫ޢVXe0͜!.'iBDŽ>׬Txehp+kl.#z`W ny~}IY]Sy58sM\{[75& A:HU%g~iɚ:u1z%ZgqVv|Nk ,`\eOSx1koF$f!kGĂ7ac#ucƗ: +D?MX>1XV^ 4 A;Qd6JyX>;_AGu\:nmuuܢޮ?:,WT a`\fCrdY(2~,| ʜ`I3%'Q +a(TS߭[]K#΅^}aE}<:Un]4MH^]uKEQ0 Y}v*Df{yFNaB7COBazY(Bn dUYqM6Gz-λ`2=\Kuw??xtyMCg ޹`ӝ]g[orR^uצ{!FF;o-Vhh@i6j[mZ!юi$s\C hFӡtDQ>${)CO: ̿3?r ??g<(?-yLG$R[V*K2Btk-M*Ie6[ (Ű*A%Z#8;1b*>O=x={Fπg5z˞z͞#=<y=\p{`iTۏ*D؞ts{uUO_w3tmis~- 곛L./~rC&a{I-WTTҚ- PB0VY , b\T#H\a~M~K>7u0fi 9:AqB WY1Q=PcԦ :Tl)*r@esڨ-BvQF~OG!*_}lehm{+q^70=},mdQoG(<cQ+ QBώMގkQ@#G+uB )3tWzRa7lw٨1DS1QH7(L0֠# QX< |G/E߈rG)hs9MrQ16Eǣ\2<Af:pBQ)(}Q@GFSw|)BkBuF,?F.F(? ֽ1q+lsQa<5"Q֋GGdT / eW"sEQejG:Q,y)1em7o(6l W>4Y[=nDUޭ=, ͻASMeWzɭR{gn7{7'Jk.g7 BVK݄.]߇g noj4 BrՐZ A8u\Vl~-=KJstzYNxq5(J%DH5ߢ1}SA?$Cy'aO, v!~P~7w5?Fja;k E\.Y>z3>yr?KN# *㏑=ۄe;_f~ =ʪgqG(tG6r?wdaRՠz/qj.@oկПbxXbk:`D͎k+G{yx|9߹thoh;m愖 g;8>>8;{3|6~plh^~ݫc~eDfBNCFFwo/chP8Moh-2Jfd9x! ~"w{ƙ~>|H/b"J"V9Bnϣ0ُ /\HR[F:^CڰvHUl(>>G.&6e2{uR3}f7]lڽ Q)S8{o_ܨԍY\2)-e$^ qvsH1+XJO&qe Vǟq 8\oanWhc9Myw\+tss3bM(cV]cmJi,F&w(s; 1wQدM~Bs檌*Ih9e?fQoV=Y92(㤥6(~EJeCC班؎Lg96{|Z{?"lxw r'tOߥ,B:csWG^^i) ~)҉ξK }r:ɡO }y4̧gOi? G+F|$; <#&'_/`QOoޖY_vĵA6Yl<|q\D|/}}?}S@Ukl>Ė'pCp7D7=}nP<4s>[ s'8f j;ƭn V}12ZhN̳S 0o#  a󬙚q!3{iI'pNX ]2nߜz+NK ݛ;> endobj 66 0 obj <> stream x]n0F<"!姑L5i"59diccsI7S&u}u֩;>Fu};#yfLҘ{_'wӰ\&韸v]=w\Y=|lq|㗻8?,kչSڌK%kr?1_}tXS:wօƟ]̲Z-w:qoVL9&PC(F,1;p!\JL)\pDgXRg-l^oBu L{i_b/=7³0 Ԥ%>%%M?}_a?_o/o_fkofoqvC Cg4/$ - 5x L4=h/O۪BlYIWѥwq%7Sk endstream endobj 67 0 obj <> endobj 68 0 obj <> stream xc,&۶ym۶m۶m۶{l۶WUUcb"#3v-J4v&v4 B&v&J.v  lL -)({؛0@\N..N&nvV_@FB6f&2 DhdjbL_[S c[g v&v?Z%Z19UEYYeE%eE !eaE 1qe:NNvn&"35023?ῥ?[8*N&]-K;Gc '#k;'bv67!s5q`\ -M1s_ΎFt/sN&v,lkɄI?" #-## %㿧:Q57s[gh/?tv 9!1O.6z`l?( 2{WSbУ%Ou l l]U_a 3?D ̌c/fN&_KkW궰tit [S;SD@@#4FZ?c;[kch9B:q?YE]e loJ  -_t l,=V3ov6\_W ؚk+i$jnb_w1_[cGk [y;' !7FV&NN kg eTQRCKm?뽌yt'ТgV:ٿF7&(hNEL@ADZ8H003l8:+_뽩ſܚ`E 0eW,Re_Y=^ :O&6ŭt?`u`'V&9.7°xwklPq9% ϏLK䝝 tx@wĸʤ7s ٣FPh 3otk"-um'^ReP~"ɿHdk`O|pd&Χe%ϙZMߡE4 qo<6:Kg]Rxw4 G:OGp7D|j!n$$Z< (RnSW8s'G" nfW9^͖􌧭AM/Ӄ#_l>̍# W+ 3I1/L^1Tl( V֠PfVMv1s~>p2Z:cBJrQ!z"glY$PmUD= s=&9.9Z+4_ Iϼ/Dj"yGr>09F؇3_drIG\Pz7:, v'&ٽ:'/u 3n_4G.daLC Wۍ1U|HoU^$K㱴5:WTCw3ɣ247E63(b;T{6:M=H{& 㯘NԲ\cJtYR8dvl-/38=n`| p@D4LO z\e?`/)x*:Z1F<Tx=cuį5ufmy" ` zE˓8e}  נVHx&7>蚞#%#sIz̭~P>KҠm "|3.[ O-pE T^ ( vZL+o-W!/"0tzu[+aBdfny*|^MG0!򕼵X)I"=g?T] DuM8V.ЈoĻ!XrYy? Y镏L{%KҞp1a o׎C/Ir J݇rU0Iѝvh*5| do:;zk/RnBD"?B]Haݣ\k^Z(|&|x'ݗ'Xe^ .= ~6cB56ocrgs*$At7НZl'~v|ۙߴWo9V!%KgKlJ4~@ BvcHs+@'1F2VMyK}0|EBe2In'Omuje g*M*WHkD--eCLdb=kހѡL<-FYk mkQU.l̑ۺؓLL2LU>c*qQ؀KE6xxN b{NoWSS]KO]6C+4DCנ <}$hq׳rW#qDWABԖne C8| 'Da?MPm xUo \1o^Wg-մrGfh oe'/,4NA1(d`< rJ < 'ZY3DgHߌ~=S!9Ru0APsz>"df: {[ÖRYrЕQ 5JGhv 04Lm7D4+M6#x!> 166b:k{wVgn|+"dU12b#GSbƥ>=KIȣ#d6*L _;R\X(9r8 c)m}_,.AP &4؞UքO֣eRZ47PLqlv)q]4pODFlE_WtfnOGYb? 6OJaC7MIusǚ~$zD;0 %}}Y{ݽ*caM5Ed9-_}<,,.qD"Ti|]@z"Y[ 8g/BKr] ɴ`]4#:b=}uq.3Wn<ρƼd$6`^oK`}0Z`0 2\e|Cg eM2}}?0&9"i^+<:ѷ=[2=:Gi 6 Jjpݙ8iy8TjsXR)zcT Uly{bMsS- 'u3zBE+O2{ YperhrٻfTy#ПhuWX>9=8hh,bm1ɲlYW0v8w ?8G S}Х@QXA<ˍI+[ !Fqg-?bj=s]:z&)pyk%vԄA=,/(,$!3H AݢNı-yeaR <fjk?mۂZ$Ä뷁%q@EgdY3%q5#FR7l©j#M-2EP#7  <ػtc890Qj6!z.?3>2LYhf@;(*UKA?п{1X ﲺ:y)|_3O.s<|Uj7=J<8˽ui5ifYżV;=_H="fr#5$JCaUdڛAdFΎ1 WV*b/K kc6Co *cLN xՔaPGJ.]}^>Y4 NIEzOէ^p+uoɚR˪s?{`‹ =o@GqD=P$d6ǃ:8`$cH5thqD҇Ih5֗ =4ioF鑒`w{ƦV^P d6࿳O|m__H6gae`)՘wY92Hgiqx֜;OA`3Nfmv)9q﫰"}Z[7gnjO$ewt0ud=& >ű4ib$TM]؁qn(g虙9Q+5Q͇m}X<ĨwwMC1#u,met9MI/q~BH:|(KHrC=5K̗f5tewE풑R"˶E7K}'dI;S5盫lۖ&> %(|*OiG=4,HSWj>S,߳V!PkĪj&VzYe.%1YE Xof" Z(mդk1Q^F0%Xl]1_eu\s]%8QɸsH. jYIKߌcM칡n/g(L:4Aј=bu!MYK7:*I~+Gueo;1UqU6Fo'2]hX暝Mߏk/0 en@R@btG- 1y܏C2(LIJT=jqegU$}sFJuy4,`{{|tT<(1dV6a)z=ꓓ̸Z<0K`#7;AG@'bI/4-z-Ξ5c1gbR:6tqeO8m},G;4j7.ܛ=yi %tlw @M:cکn>Zw0Om&dJtbm9KgQt7gFI b U{DXW2 -/G-;&͌C^ IG3BZ7'LE;?7n3sV,M[^;hJL^~  iV=LI^Ϭ_~O&p/t2}[Ozd6AJ#T+߃]=ji*EQXT+:E\NKM. nL"pIHo| @A"2:s$l K.jQ 7EHwJ+T %W ά(@FTY(2]͊6þ#ꀗ"-sx ,O{V/4oJp{P d $5Ub W] y4rV\ phXsY{-_Lيb57ȄQ.Uy"Z#s傈UؔALx< u~PF9A&aZ8۱}!#ȍZ )Mdy"zI X:LFbF9W?EzS*  YBkb0 CX5u`+Uv,` %w:4h(NCh/Å!IF%0|ުVzv9R֙ A VNS{=a2ڪ}A{ӱ@< -.+kae[sR(D|O(ߩ7%h$s#}<DpL־kF~|7 tA_b*)%8|ȡ(۸N0d ,0veٵcM7@C]M!+ڼzF~7%4(e QV5jN8*}}&χZPO-ƭ:}?f2٥Ϗ3ȁ֗:LOa,&$N=7Uл.?Ϧ jL9vz4ĤRbd=Mo Z}bv2u\xYVN WI1 mgnh D/k 8TORH .F/@wh`kX*(tu[<~~$8Yy\@?*޵9%?J-3*Ұo} )˘3?/{?,ۖefȢuU~T.-,%j~-21sC.QGM'ky$OyFkWD8Ѵ[q]16[#Jr4CwDU'CQj1L.n*&G2W)-`N0lZu1М]3w5i~v!{pD5 ֚sZiGa;n0KO^`q0ъ0_C1,zY_Iu0X77l'Idt9MZԖo8%]t8n !WAz Nn-+|P.ǹ11 ({VZtHΑ;`),5 _:=tw& #lb|¢-I\Dw|҆qʕ?AN&;Vj(JwE"ԢܘU}mXYV" @{C otfӠߖE?=D؋;X!w,x,mgŏB(IdhsQa$VKGFL M6gY_i,mΑ^-Hk d@*if(\}_;OhX;E}*I)ȼP:rSlV\p((P ƂG K FJA`AXS^R 2o*)D$|ecIf(KЙXtv[rx!v:yML(6F3^ee|PVAA.yXSKz$t'C0dZ~FG0Rzt^z5۴48<\P11AWb_y[Y^,S6',nmޅG *GF镏j5%\d1~'(LAt  -6nEFO+kpji:Q'F?}hVc`1F*,SO^e .8JoQI R4rxRx{5*e61CC:F'iJ*s{wG s7mdJ93 e q31)R8Ho{&Q1Oi$Iepm$ٕYu]&C(2_~*[Z(cJAڈC/,gPQ9 '[it̕rؕiBbCMF ?DZaV;?|OCO23yC3*LԳXך[+ ;E SBLS/RSHKG>AEA|V5HE7]l,S_g3ǣ%itd'@׵J!,ι"lJFH &ZNtK y3ġ}ȿHGBwJܢ?%VlxS,f={)U2~R=N7r({/vg¸r m Mu89 =öU07[*%7G:7TܻfS4̵k]:-۬[Mfd&kTQķJ8_ 6"~N5W9FgfxAp%.|nsBXiY>&g +B,W?{+ AQN:FƗ-°J0zh3},J(HȒ>g[0x!R''Fg2\_F%ܠ02<~jn{jFг¡?Iσ"LK$_}̵YѾX6$]I|џ/t D9/=%Fa]SfLp)\ZϺuxo{d=$u5gIYUѢXz"^7U ;G*Amb גË%Ԕܤ0u7UEqB8o8^x;^&ܮ+z7wPy5PS[lWܮ*tıKpjmy"xVp A%De9H*8^M1G0W,I.]1.rV~ MRjR,.F=J+m͛O0vrGV 3IXt$<)PowK=l 8HN}/NΑ,ad|#{ÑOGL)7Z5ۭ2FW|*F.Picyş'zJW->q g«ZY(Q/WuΓ !h#Wg`1*ΎFJ=a2rUC6&,9@ϗQFٔP#JeǓ@וN6N u#L~jfb +!ăzDO0]jKjSI;a fQ? TmSPġEY6p|8XH#9yhVGٌ@Dbi}CԂidք7t*瘇q7UY9Wi 1H1)q2*RBO3qvH7zL-k'd"-sWPqC'PҚ5)$=6IJ@oQO0@%%,QuBk0)s,⇁5.Zcasc8YkjwƂΓrXd)U4QTfn6TFl3ߠ6k+OCXP].Mx!Y1=H)6bm)+ mKyX2;)gtġLM:ھZ Q\qSGB@8ХEv,Z[KUu*Ï@cE)!zdFHϵ[.c-`LT191f[LHIOj2>]å*g!^<<6PufWPo--qf$FX7gWs'w;tpeở˽T']bg޿}jut6!>T8FA)O@afGG%gSxGTP]Xa.7'6Đ!9"~o4}L4ڠY>W~:׀G͏/ܽ%C*y$*`_].yy؄1IThm݅e7ѐS[J}nBlryf֋ D Ջ&zv)Z 5.%7Kfxߟ>nZ9@hcsۤ5u>`mE{xxem70d4ЋUpzl$}`[H) epLuKt*]#\ X&H,)_5NG- (̥Ex0۲ V]=+).f; 5`yB}_Þ /ZA/KfƷAC<̂YFAta&+4Pڱ Q6 <а|PE{\. n$3@LŎG/nPy]-oNl6Q鎻ܤ=D<2E[fTG˪ڿ&UEp~6^Qj;>LM#znͭThe.`:j6>W.!Jn Z[>nKDӽ_Q"N|S@UZz>6[1lV"h$1'h$B}q]*KevL.,mŒf0҃?Yt+=Ϲco882̇؅#78~:PzRƻ]p]$6`=g,\bJG}P̢EcAC82g*Jl42GFAcXodn]cq)v-`G亝@U}&rUYַP$S65дK &u^dHᧃt~+|\M؀yY,XEx]_7b[97?)툠\(򔢁4~* 5s*3„ۍ$ XtEL(րwky^ey煕$w@V.h]alFOfZ?ΜU"Px 3GoOjY=A d70hB.TyJwtN`l?SMf6ڐbTMb>>X g;욦OdƐub?-tIP_Ot!\kIh>'{O`ŨH5B-qeL^ɔz4DYf5m5o9UdՐֲpG I0 f5{ytp봗#gғs 4O 3,[)?;sg%eY v~,Ep>eXyq0^+̷&zPiul'128#_xe}UDۗvo]8tEo,ycm,9/cޥ#+AR(_kVтhkY]6ޮJoY5+ap:?n)m\t k2 v8ۺ[VXfN?5!9'(bsjmLOF)ɸ?tȞ_oQ>`Ɯ_넍 *"#Kշeδjx?X:Dvnz$iLiTojAxx|9.صGC$sl| 2e meq:/'$6g4NjP@! 3*iw\]s Kё7`J^  ;f6l Ї,{nudցwM؉>3ܷPWeK/.kmjPY!l_iiY엎3lEMuFcMz#$4TtOb n3Sd2i{+A#%z">:IyGuc^&+8sHKᅵ\V'Ul8Pu{$)7et~|7C Ēb9 ,Mc;vGj03 aZ~<\ukF+L$"22pS \L ]f;fgZOaN>}{]'Ly1L;kII[)+EFf^4RgYdqt{͑ؤP ~Nȏ3$ mдo UI~S< $au}2KpB[ ^ 5 m z(d ղ(8^8 +"vcm\PuQ~K%q6]pq 7a,wEAŻv["/~pfxԍXDxi~#A5uoBUp'YA{ǏӣƵ}F*~'_WEn6Ё"8trU# Mr5b@dWq ,\]sK7p͡:>E旨Ԣ*w$}PooJg1& &)UKg(!41b]+h=I}+З*ȊX=yD q/Yzg Gn:3:`f=MFX4O;-:>Te-NTJ!C6A> g, ǢD1sb](Z{NY]_M$>qI‘*XeV'xyryP9tGWޮV`ǡd y|$ꮽB_Q )k+2 *zd˫sDo];(kWY%mKr4Ms*R!S P=|h4t`q/=}7X/+ _fn^1I1Ls:5wFgx$`l|,bd\ k%L hBoϓ[sw= QXh)kB%23Q W:en^1 V:Qj{)P$Ы <iw d) w92.@x?| @Eaeˈn+ؐTT~nb_@IIo&*F-XM %PgV7 NIVEXIf@VdjH!ؽ %;u)V\ KchCf3!pa> Sv/n{e -O:AiZ1]%R^g][1n o*HGԯUT4)*{=S>;IdaUx}1+![KQPvk"W}jy|A%;D`SNQqGr+X5e"~p /0zbP+rH6T3XP!++hӯB}5=kB/ D&(nj9 Iڱ$f*?6P62 Rl\v6iٮ զp\bLV;@RCo2Qn#NаQ1BxpCSʸCl9$M6XV*Zuj+i%~"?6B?r"=3Bqz>PWVLK@<$  C=eGt)賜F嶎k6a |`^C"%k)/PʓbMLY&zsH}e7sބDL Іc2!ɬq^5@@YY _ ?F$nsDJ7VJFEҁ8V2) {+neGwE]L/'bfU4*hK "GOʑ\]WMr5Ή`5cGFQ%C]ǯ#6mF,jqLG5ke ]/! \e:ȗ??@ m&` k$1pLdjs]*ŝn߇t/B-bƨp#3uxd)?a-QyzXi_>Q[W!]8 Hc&Mӱań l!#'.=ĉ5`?M&UM~@̷e\\ӈN uO\3ze<p `RTɏ!6ȶ4dDZ|{6rCx,eB~^B+[\y>[MnxG^LDj)"E)z<;clKJZ˱4-"oZP(ӶygYnVǹ[y*Ru(-̓=.sSUKX|EyLiV0m|i ![͠XĭLUm zjÿ*ċ?䅘UG՘J&zypǙw Ů8-8eI({΢ٳx,9 .G'NȢae݁@Y|.R US-d 9z"< Ɯ9Al++@tpm;K%) 6ڇ]N7x?[up -]4$+ noZO^ `Eܘ*zہ_<&a R0oC2}5Gω~Ȍh郸!YsDf2fӀεR1nL Twnrnڼ_ NW6YKD/Q[m7M8KEVr޸DM1ʊ|uX^t{$khm@ͤ%"_F@S8Ü) -ޗm{M/RGrR{qnVQGЋH'&U@AdԅQ9m\c\kF~x.z܁ 3j< }@:XAҏ p!(qGRg$juKpMK^áI7[*FYr Sx#(v($~u3F/wܿg!,>ױF4ޠ' tEuz_CoGQ#D`Yܾ QN*cy+ŶGj8*Fυ'n|غ !CI|Z>]h6!^G~-CcܢA9궨 WxՍ,*elL\dFx>’2P\ibh;!o&׊v?|`e$ Vsb 8U MƊ#Nz٢HUҖb3]#ވ+|12i{.ğ4 Ɏy@^:Ep񥙺 ^OiW5Xk)]~iY;a_[<(gnR>BU(ȉ}psb8`da3is LZ\[}hxWh 6gL*CF27QfyBuF$a~EFuXG7 3 ue2E?RhUY3([Y,rq2]vPpsyz_]ǹ“!*ra6~@{=֔L^φFK%)~`h9/(}2C nΟv1~y,,} _;n #kz*b\(L޼3tW+[0e v䐓0bZu@Z5j7у5V>Ǽci.[+,vEB˳3cp+[.uC.&3N)=Sn+5h&IUEY15Z ,#-Vw<:=ak4)Zȳ A4~GڐZ7ڃv]T?I.K|]W| rBCmK{s0<zk+DT$h3O.IJ_0I%[ 2KՁQg>J>0t|@bϢuL[gB?`u gSdz:2=Adq$2 Yu]HC82u|07n5> C|$$wڏXl_{2N;FȧZM^"'~3`/e}FNTqg`JX)+_ERa~g|g`5oz"E{qlm O \`Dh g#<4v֝.慴YcxND %`3nR눓-޽Q/}n$PC2^m[h֧D_ Lx/ō@_Px#(tf:q5sLPYf[ftI\Դ6C)bGdK4h#m{æ"0}ܮ6jl/ 'drn#]\w3:iL>$SvU: sN {cGE\#^,o*&wu'w+dô*h8^qep$2lӥs!NojPiU}hrvlD ~!G#Bmm| ~ Dri1HȊ-Cќ5f8vP )P0$Sxg]@yWzoztLOd/`sR!†$ {:/0J  K#O?q\o+;[w &Qpg*:IRPoN1 ZKAK-6W#5 [2KQ豇P  M (JA~-\Ϙ<%!ˮϻz8q`SSQz:a]h `MGZ`i& A/@wZAJO=1gHM]g42e`{%O&1娑U2FM B#ʕFezAY8i"*)~4n'O+Xbc>nu9PġC!XSbEX Y)02d"ӘthU?DzW #r=?&q Å?&`%[=G웠z>= 8\hGGLġԅgc>AuN'u62'M~2^0>L{̎ˑr}VOz9A: 42ci [_$g.0eNf\rQPSc~}RƩ>HhAQ:T IKY"o'b֌l5w<ٌicD"JGN퀊pEF2~Tv~79Ս<.8KA(7l9lU<Q0M YxNHCt $`׶Fk%}"AN@C䚈zƉ~VOxaʁqK)@98f]Z:ʴ-vF9*l_ zrZ#(lqJZ|-*xG2iRo O[s xu|9vgy3LWB&H"Ku3 K{F/pL9'&Я螇07cQ;9@^tsC v|+ < tTN! ^(lVj($j7[a<Ѩ-g[uGF_%aRt*'IdH D@J%il("}5A z#ġ MۮB#3PowТS/}A_Z 5 <+~O/c\Ic"Bs9Ztzvqr:^>c6pH}'cP'\lUKF߀H@7jPԨ.|,,fjL x 8ԫ`YIH@#=ͬsL(oεTF jJsMۦ+?Eދ<ʥ@kek$d\ cAa 6W%MY<2e_ˢ]/囓?KXBEsV®w$9ԥDepZ1ϛ 3 Wۉ'SQѹ& ~*~N&7Oo@t=|_qmS~$ΣO-7vy?@?~TPRMEntPe"jxFmD.ăF-8!u4)Ó$\2 0ŬmmӺ$ "EОUP͚uwc]=j`[]} WaFE47`uK$aZn 1pfˏɣFܻ^ k@CGC_KӞ6uA?( $ǰrN} ! >2DYg73a$Դ5[ʥ^%u,Pq7*:閟^%:-_/N9);q~Ϻf4?2q~EeeJb63G)!cԜ&_H'(DcWjLq%J;"}o ܃Zd[4Y,Ej9v 301=E8EDe@AKlM?5=k[_Y댫qO-V6dh9{WwfJd6kAk# "e" 'c cٱKwuVyrsG  #xh8;, QшC.S$X(VvZz8ܹpXnz{+0o>OWD%m8PzT%ocry).aEtD׌IsmRm\btryu;{ey Ds{㑉ib]}~`=l;hנstj=nC8rStObu]u ̫F8 K b!G^|OѮ/+V>iFb3-sGS+^4WG0熓HBf_dCҾmHPjUߔzf[@v{R)hԉ-f4OWKSvǏyRnqJ ɖ;LbC3}tժB@FyO~IiR)ҡS=6ϗ^25159Mm|ջbqOe05fJ\B>꧒A%F$R ZDVU <PG)ՀL>ZK*"sxZ!3{$z%/93 _V{kd;[w.dX@ܷN&@}B9ۊ?R c`[ˠIM뉲Ηtnջx9<KiQU6Vf ;tfgSzH3vY2bOPS4"fW sNHC_8v:XE NW{ ۯ#JU%VM"@3]M)~XL–Ϟ }X %vUV]6}\0M{d ѼMG\ݙvz<@T,_p y0iA[֣~U&(TEI5͎ҁ~gܬs@G X6ݦ&e~bP!C)$%dcM5Dmq|yZG[OXA'w_sy;y 8=EPcw|c&L{c7|tF5fymy3M|.fqu~jDmn-oK? Og.u, #Y*~>ӛeb i-k7_hM PXe (.>Gi~d*H5lŀ+as ^O!&DqWi<&1"OijNA:+Gu;~ͅSD (H pwQbB8ƅIjz̈́آYWZ[ 99f`̥ 2}.tގ:үO'뱐Io$FDEŁgEuRAv2F5I4m=0rǝzRfƈj;N?H#bvÄ MէC0mH@XN˝U8BROBԬ,R"q=WGDߜ Rָ#A7ph$EZSN1Sp(쩬D_ _O- n0p8[=NKODP^nڃjϏ"-yn{v߱!pb5]12 _oe)N׹9a"b28 es7d}@/4 *nMZ ̿N}2ظDOV!%}TQvBhܶ4#^? VƸRYp,2> Z5ncޖCjj,G.8>>Iͭg} !f/rgƂ4Iyt&Nq9<Q)DT q7Ӫmn90ݼ80|ɢ #I1Z+T,(ϻɝZta6V.SHC UkPzRpts##/l4"h'4ۥ xriI%UsE?<0خ:ؑQ%.#'bUFma|Q6lz; |&uJ1a +Ni| 8C~j?5^ީaO@|8_Bs. ZL[u¥Nj`ЬaKn&Hi@_޼~X9u7Qv`;ēc΍ "͗s h4a5ڭ<ӊrY8hEk1`bKiGkj{2rRt3ǻ%qp{4W@##9I ME`i;y?HIYpڒ_X7i;3i=ocv=HP!)\Kk{F SRu=&"̧x‘b,'IDóeŗEd'j}u2TOt5+|J1r34q5M)P5grP=S!4?:J`DNTlDK1vgdh !I!S@DNǛ*/d+M{n6,*0 E1i6$悆h=)*]|(y6C46PȻ0"Ջ/$oyȨmݵD\^^9FC2eMdJK#szMנ#%{#v jt9V \!d!X~<ڲN5&,8JVQVKvbJWu{w AAKaC&I7kϐ/^/Ц8`8d\ jXK]74ZYNeKhߣ jH'j**[/U5%=ײ:ymJ7>MikaQ@FeQxG.G \z}<L܈k"+stA&`JmoGP7r͒/&g9(''ݶ7´VaH\qsx趨N ρAΏ~':|.[Un[S'Hd; R|\{;Ce֟~)A PU3$vt2K|w-^vyEt%uc<~WYݤl|PP޽ 䂮6{MO u_ $?5zаt)oj5,v{`*R՟C0Űٯ963$xӤ̾Jq\f 3MIԭC臄X_6 qYvB{3ADh^"?"e [ XTCQu$/Ѿ(wIzMEM+v14\dFIeԶ:{Đ#mۀ@U$ȼn_2<OJ,eU&_\?OP)_A$qM:q9DBK9Wlb24үH:RA;8:hPDvC>b>: uT! qUnȅ<0\~!p[41-Ee揢j}-#+ m{$''&m!Z0ػȿYܜ3\t- vv D$ FEaeĺ#ʈƿꭺ^?ڻ[KM=łYK:/܊JMϝ Z "TPJWWf=6N’Id xQ>4on|Bm21ɛ V. ~7'=^_ …(5|*AE$?αGtž2ie5n "rt:{V:H@( &֒ Kٯ/*֧sSn!Jʋ46W`>lwS ۷C?u;<4tYev3ɔ,IUejn 2fՕ禭 N#..jYG[ɏVq$vqEC?=FKZW&嗻R]]⻡$eX63b?W)M+`c8R lKϝh;o)#^,h[bY Q|9=VKpi 酪A"L Vҝ >wJi(>oU_3y enɟwpWj!ָg N;_wfNޜWʴ=T_~:MB&15UA@sq:SIgه V>CGVGU dD1-dрC뻞5 cUC>+BpSU~ZP&zy tؙw-e'(Psؘ:h+؀-Teo޳8@6sK+P"gh8൥S eϡ)))VjA"x)1O#h6ʃAyW] <ϰJUzu&OƶKg^h !9 N+q9oB:JJEAY\DYK><c r#=$YϢpm>bs)bC˖=%ig_Ub[Bq@ [7+eÁob|(nċ|PvMK'Ѧ:J)9tᧂC)HT.˷S~pYg=AV“}–VEߠ^̈́:cJdrD<|sP΄P9)83oM|àrcryBOם_&y@r,M%)gy/#Tv'B>.c)4í .VFD X3W*تm4*3Мr爕@R3ݛ)̻@G#[ZcH~Uο{IPxksi$^ƪZMuZmi| ?!qkT}6 Sn:p8:P`35JXTusEvg(<4T^ukGVdx9tJ\6Y†4@ZMF)xanٟ.PSy="cg7&{sƄi{A\~V"(~\핕01S-L{W{*qǽ#:sco iY!&NF =hC|5ߺćziR.6`Ei.@4R%XLA.*tTJ'H ~+\I3#ʀ Q$SK$  /Fhls$noh0րMH$@=-d^)^$3d Tn4MJZN&x\0$3YcI+}ʱHAK }X 3Ζp8O˴\ {z=uA2yB Έ#_m4\ʌ+h(&sJ6NuJ*7=zjZVL k ?{!+7HH-|@KǕ603F(HwE ;sDe1TI,aU%,غ|@g ys tb\H/#C{VyOǢ@$|3(NąR|4Uw/>vHKFĉ"tɆ>I|v߆ IjଇCWΤWR}if[ `[|j3<\V?\u1k~><q> G/GPVVHyqQdDqgjp;pR࠭\kslg]nz1p^q9Rj ӄV>fC 7Y;(̵⏛DȦQ灝֠u WTʊy<K"bp ʘ2Gh+X D(xdڵ HNE>#ڑŇ gIDnvPUVYfרpOCgϺA0c~Nc\)lwPPCcSsz8D6YU%w [H2 ʖTTӏPbHRШ ~b9)Bt€{9] erjfFoZtn`ꏻea׉hJ6PFK?J7v-;&cݤY櫎)z$}fG¨2{jWkצJo%BjJ0:wLv<\q<%fON(h*);- T[; r)" Dޢt@):NV^}STUz(g?IEDL~z{"u˸9K@Qw*E@$4Txf`[F靿xcj0Ԏ$qK*Ċ@%A;hZ !V_1hCQ~@;*UBP$+C򩜇:LCj_*L%5X`/Y'M< 9yN>TB vs-o&دhU{{؋C2lʷP[LtZp/ŸGQ}#ng&wxn(( `A.Ki F (W.GBnxEںglmîP 䖶*Shَ *u谉f T8ji#T`gwfL%W)͌Ke-$v;3pm[J#LMC`.hs}}}C l-RG#=0**ۂϨ@2މψ*&YWvce LԐD{I2%)(n=ƎV-Ϝ ] s^Lͪ?;xPuL5ngX=@E4"ͳb; / h##[5y g fdv02]S 1b<~U- M%KE0 -S2^ISq|=J0=Mԣ @-XVL&}e:Tr7s5Ϻf.OW3o֖ 7l&&'D,,N^J6IHՌt vקYC)#cVfM%ven#~+Yxz=ff+ZI&Ch"0)m,$Ċ9ה`5avU+A"4Ƙ1nعluHa~[Y2T"^"}b*f^IU.:Q,)NF>܎ 5tę$,fy(T󃡺npPxfBR})eŒ1r߶~OCd\N 0+*@~<&3ǯ{!ȥrWr X@qL+m-l1/P36-=Pg/~{YT=%`o>]=pu9:#z$flWIu*J^")-b RįFz<^?XMo[pW?f/$-/q2v-?\J)" W ZfK ǖ?^LjֿAn׭LB+Vy,:%R?l,k"6@TZ`8 1"TPD1*(Ϧ'4ِdMD={4kco"G|跣1qGxǟUZ0a0~ůOtP/F#NʾOT$o߻ rFyCg1/KJdıCۇ_X"w]OG԰s#UN#Cn/)uTJMAsLw« (-6n&5~z+08Gy8AIUg⟵#l,F{^bWOaW~f}'ْ%-\12#1 W~BGȬ]?ݞWSsߣgzZ~zd(}O-"{}{b>\X *|W^TeփQ9+p`o_$Ԓeʷ Bƛ>N.'cZ?Vz(Z7qSw>hp`hivbciLȎƉHӜl&2po r7T)9wFc5kh҇ͩ#CsJE$JUa\|Y!;Z~WUl] E'Tw<dX4Y"EsZ ,#t.I|v<zjilNNJ]?y 4|4Iv=} NLwuM0@O9y 2wc& ΣM|닜!<@TajP FzHX]Ű%7bbpD[u}>ڇ-Gw!!;oLOAx,/*Ty+vL#":S0G dCm W|9s ̵|]]Kg!gPk8md&m ҍ,^11kV6ҋWd |pd=4j72Yk&(MHXho_jz^T:\\6jwc%TwȔj"y@Gv=UzG?b!ZOO5J厁*>p0͵2'd 鞆¤[xLs)%RCO}mmvhޙUOh8&2/`D&^ϵz='~T~Mx}$,y"ۿxjL̠]`y&@'Z@I /ae9TdiWvtwܘoghk@ 6{7GA:vsAb˷yAI~2Kf̶)o MPqz%b2 lN=c\% 6X}R\E0Tcu(+ӟcs~E X ϐu ,:=I|`s.(`~ mgdDG9l$@ݪC~gr ʷz?bJ.B&WG*?3v Vd#CqQR/WӾ"0tM:zQqXnatI.?.h~+cJ uQ G ۈΠJ4K-'Ag~~':-ğ1zАwFYv1j_VyҹNw9Psd L :9rL-t$5| TTOPZ.tE؎R/2w{@רKB YrnO0-Tk %+%c @r /\ቜ(տZm$*a햙YbEìm )]grTUz~v.|4nJTA!sSt&3o=o{nrBQN#NBcjLzvڕC^SjʅJ&ωdwi__kJ]L"[)aE?z~8"H=GX{ٽPUܷm4} Cy $^w.- j>.Hs)U?Wh/~b,GNK*=UHI]_]Sw"[&{ο7Ak+0Ai_FEYPjGt]1ԛ>C1pyB9ZFrn d,$ä>\6}WS0if]2®OA2x\\l=I)Zxpy=D0P˻1A3gzW6%4.;@Kq$;)gGӐ]LF&̿E ]`u ;YVԉ~tU= ?\kj` ^WR ]Nl#NTgyBI9ti&CP{ZV߽%#) NL$)] ?o*)Woam53[K c:Lmڗ5*ϺPw|~v@t/9e]5.ޜaVt:jXѬ&53ˎw7K s* ߸ EgPSo_Jt4+EhL;? .3jng4~M|n <{32bᑋ(+&IFPR%*îz+d(NFDQHqJ gD,:8P} 햳Cb\ZzJ΃/3,I b\d"h Yr `gp VF6C[УgZSLogvv"*X9VN0rzݠq/ow{sS+|5e"0@+M}p4. \>K*SHU1B;7 ϵo!.A5hau+z,$1m74 d@2H5pCN+%)rwh,ke0cC Lnގzzҕ9 J2%%n-ʀ}hM?;io$'a &HL wic6$$pI,do:qЎ?\zwGrU"VhÀ[#%M]}v+8GoEЀ mȳ`ꯑ<ɅipM|bKݢrSFZ/P9= "ViLԆ] /.M>U  wӝ$19|>sR_,~^=-M쩗JĎe]f9]XӔ@[;z7r5\.8($34Ebu3ʦj'{'R@s(1l]!: 0%t,M 5z\=%R(\2RNW4'l』܎}C&hY bL)K(,Q@*@h΁=Cg*lI\8VrrR/|~*qy|#k?\UAkhhTuXeIYH⦯`C9qGH %T=̄ tpKj$]GJ71nZJy6 ]@#ktVp Xa \B|R+b ,9?1_7 eG&Ni`Zn~186c:|+%`8/amy=zs^4aV lscNxT|7FEu1\IkePzTNf|&rT|*XFv0rjċ+XŌs NGjg̡=hmK#%U}c  C%2­-A#7m+޾|)`n+R~<7TB^f}XޯzDcM([> endobj 71 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 72 0 obj <> endobj 73 0 obj <> stream xc$&ml۶mۮm۶mru6o33߽3+WxϳʕIFB'd`l&`JDOF&lfj`/jj Pq;&.n&n&\V.f&@Fv"V5nnƶV.fg =-@Œ 'DI_$) ͭL]la\=?5zz*@YLEUYJDUL,%!OG`alpML\ƠC2us2o.S+[bv4H89 ?.nf9/HWg+X93W?>+C6w1Y8? 'R133s1q(MrFA<,F_?+U/?rCb\L, X(2WsRS]Wg#Wg;#{Up;hrvqM`dfbeߚѿL[X9?2S3;-/u_m3ѥ\c_`W3=F'?s@Ɓfw7/ۿ)qeE+WKaH(߱\5ſb_V.VLnfKfojlkeob&_ٿ ߈[?`b/*JFV1%937:LבA*fo`jeoͤ ;xӱXN6HLJ?4qsvW6޿׹տԚ23/J b Ω\ɼosYulǞAewnJLL1um,:9 <~ WKn&` UYхE{y 4>w J¯ j_QGwLIK> v^ltWw"~w O!.YJK柛 r Dqtƺb4w ݣAҬjl߈ʸ%X]0Q[ZY6=ڏ9Ce@r1' .^CسG AL =gU,WCmp[7}韝eVrQ"(ЄrP3PV @uUA'ՄzZI i9B _8־'ݗo ޸QHf"6-yb٠a3?O$Eh˼i:;dF(u4:ɋߺ}g?2=0g ].\|];[obX٧kɭFvwܡ|Wc˙*kn/TpK-haek\ȼ/D?fИ d1 $vyyjߩѳBfvMNq6k%'u\|wf#o*=wm'& xc F#"Kh َcdX҆w&T װe&3S4G@($dܾQ"' "~Brv]W%DST㢫xsdd)79\R?Vw-Oh11ʫ*,x2I3R6/H㸺 '΂11Dy(Td@uE*׌A1[=* Sex⥮ͺD9lg-wA5yxU8e">G"bvAgxZS,.L9g8-ɅIzL˖Y@M7t^>3NJ;@~fDcHz]+OeM/$VX,Jg{utd qд5tЧ$?h fg9xy;qW;¡ ?PQRMb q.QRlYL Էy,fc>bt.~k*o.'a͞F(z)!A;a#BqCKJ;Y-(\-Papat=l' ,;1*жJ<+Q!ɶvڱ~ERP=ó3tt;{z4"_xD Uą 86=:AsT|Io܌j>T,v@ Л%WogYiř&@OsV-fH*L^k[ KA'%C%H;Wșzi(7Gq}HpHкœY *sq^&f^t2^2"|A#xcWalFо=!Mh,>Os:dA;~U>b m8z#6hYy]2S-ݛej^u dv*\aw&8 ΢M6ʡM +E&=RqГL7?IvwB"י q#!F+fr%i'h+qnj7>ymgh<ʁ^l \~ шvImQ'ڴ^Ι1oN1Jb4΄y`pw!҈-d`l;7&?)iui|%{Odz|ߌ LѵZ}431':fӎ7Tٿ5nI8k 2sl*w`:dYAP ױX.=4^ADL%6GGXjӁXYi*^FLʵ@!/9Rr㫹Hz^q֦4i#ݗm%Gʲ"oը8Dv{gw}1Xi\is3`*T3d[$+ߘ$;~[h[I >h-McMZC ]i{&zGhl*Ƀ^km}' p7Gq`y;0 a 0a#4lbR;R{/q_PJ9(]Y vڟW`}Xfݒp0DHc}zӰ/VzRX//>JovOvjUAB\BV?b7IN =fٳ/ ЊVՍ c'=`!Ԉ{/0Zhx=qc 4RabyC{R2qa- ){08z+s9 ֝3r28Q/LqўqM @j)hTTʌNlӈtl^(˅9YҖ1 |<4M!A:b XNq.xn#I:̲Vݑ7ws $ᨁ~ H`ʄJNjct ` 7hf]bdA[Na=l\蝠ch9G,.>kƳ-:%Sxה8ԩavE#8%ԲGqi= ` PA*kҽ/\a S$4hCC@l?8#Pqெ +g_̉`%qɳ7TnSa7F#E >A7l.ӿ,`Ve#驠I] v6E=1c缆-A9V`(p!]4nmf5IC0΄SE&Qn2/9FO!GP(ZE><ឤajFː5޿Fk} W;:R-9X@%,]!*M{CxGw!SxM|}NNK.D% Xw|}ЎK-/gv CZw:x_+s)]x+)̊0l@F.:!ݝc=В]p  @;mEWJ2hAp_6**x/iEŻ1o\*xqv5&ݏ0<,"_g\AXVe'˿07P%DjFk4L<%=B=Ksdɷ'@W'|_s G]7l r$idɟA;ZRIor8 Y 5M;uD^ >~2_1*q`g3>8|ZcuT,锒Ü!8O  ZRF(fJh쾜Vs~nsB1i%+f|cjwp̦ne7F\@TdRo+gR$gTHI]\cBuL@:K;իv$u?qy|$G3 /zӮ- 6с"Q$xTı ]S ]bn\wCyln8Ω1a")v6, <#z6Kcfs[]jJ0kM3-od%'p[iJ Jjkb5l%ŏ\CV֞AbLEL@LʁS:XÎGԦH3 X Y7ۗY2Ck"t0;H brpyD (̢1w0$87s i3TدU"6tڜ׹ΓJWrӵ.Y]{<]h"S!cd}L*Ӆ=m͝=+B6a@fKX bӢu!6V#etdr!s1#GCO] Lxkb_$NC^a!7`@. ySHl! 2 ?I: 33n0WV4WqL:Tdu9CQU|N)08aS'h}:N}bo'`>*{p>ܮ=e !L}ôPkB6q ]ً;VuBv ;l{RNxt,ajbZɖ&x8Zh*2DQfi(΢A (iE㬩#C>r#υBgC]߅aŗ* ^~Kǝۘ2Nq+TWL+ۜݎ\J| _AV#~Ó[zSē|O9W=KFg*E^2[;,{Y"D0`MB Kt=ش;ZзOD>1sⱷ쪂]pcɪA1aaXWطo[2\-b84O3{新!/U2a籂T{گ@Kv $/~%FGR`&oy${=8$e} {NNR-Tr9 i "U"ء x$ ԍ=/X04M7ly'ʱt]#D2fwH+zF)7/q`1>ohZ[،KwBi jIl\MT \z04Ƌ\rf^f!X"B1l5-o[NsDj+C 7M$w!ſ6FWTz~CE_`){$bWlLV5>ƀjH/EUzvKu;CyKV|4͘cJ?-{wu8ynwМK=KRX1^GD}>޽)J/&m?3O83t0dէcKC(~гt8jDAN௪O1zOU?y&ZesjmJvvOϜ=3 TL\ Ag:Et#] mJGg(<]~Qwk06GAz7䢷sr'b"Ԝ[$6Jm*z̃+))z?:fz7`U.nHS];D`vD2'8SK9Vm*+ލbWyD."H{W$!Me¿sل>,"[4ocOt50X2yTs|"5V{;<]mMaL жa}$1JZ;*S9䱖 V=HwFfH̡ zzy>]Nu0ۋ>̤I^]9SJɸQ=UF5.Ľv"2+JgJ09r '9P+ ~V^#i牐ZH&Ux$i%9%Y=$q#r~*火+UHAi-7zkbVRPjzN\3֋)C !~,pZ=x>aoFXSU}fdv@lΧjz]]./Z7E@n*RCDȷlwOyA:7T 5x-ncˀej|P Zy}h&asdbAknj4WE]9ʖ2a}a^O2Ͼ怆0ONs y)L [6TD;ۻT6sYV/S\z" Yu WI"2BxFddrBSq:HLNSD\#OD6өQ'd 2K]`xK+69J_., hk-m$ɿ.3R pc <9Sjeġm? Z中B w!g~;KKWp?c>qg|yؼ[hՀwmAbteڵ&Dd0)LS 35!T=,u+QpHK>T4M*r p&Yy3VrK敜(U,?ln6#H;LЫ@wzS (mk,~$Nix Ef8p|Fp& /GD {pf]SKRC!;r)n`2LanNAIνhV\^r!pqN %QҨAʠ d:BֿtC#CV<ʡ]#y']'yN R53D!7)$jSI8sɬǐ@G2iuC?o^UUf كܡ? 4i.ROb?crAg;lҪl0ߢ'dxT |aW^(rj =jƱC% In)4<2̜zUgmn&=}.8D"D_~.{!{7:xS7Ԟ\spa*s~ǮÐm{=>{n \~7GVldxcJCf3@p%VM1ɟ(W]Qv?qLE#fgR2?{oK%&˦fazSǚ4"@H_,!E*|({HNXOib[ N.B ̕{&XEu_EǠuoqB*hZ6_,+_M-w°eUǝP5EfUWLYd3*jkfŪ:"΄߯`1 kEB|s$G+)ĨQZ#ጴw"0dFPt,ECN mOvJ7.8ƊPl !yBQ{!8K|Q Q8;>mMf'"Ԏiuj|ۖ$R}d~[wPUU59*u3,"(k*y:.hO NM6H9bQv^lė,ɡ1:qT~8_6/X;k. pqBOY?.$o8أ'0+6&ΐ4E%c ݩna,L[ ϡ^<Gl 59d'gnRY5J|Icqz(c[ .Ȕ$,j`; J ;,wB)9=Td5& =?1tJ~>]3.#vy~nC\Ns;u/An٣/C9OѢwZ(Թ84Qz+jjnw0rUα]_}2Sg46C4y<.UF]LJXa>zþj}DI&2Ⱥ`ͮ.j,h {˪ڝ~ &:B3bM;qJM?~X{c瞊Zs2bt 2efRn]Ůlw*1r3qnij(W]T7ʝv'D8D |6S;+ߜExAۚDֈzv ͌EVQg0-{iܰ>Wh: 7_똜k{-EqG j ~`aJ]ƑPa+g渗MؔY"VNycC02TnbڒqyD6 deC16Gl>_Bm7# p`C C5 A7٥](9̃-R%-'j:|d93Fx*Vzj#x$¨ r%qTBveOY_` b_T({"c;qRm1s-~+R9F;^9^ um960ʏެu}:#vK`vfZA;owb ` ^ڬ 6=sV]vÛ*I%|2]Dm`FM f6i^EQq-# .]G>_@E5eWSe\&>Lz-~l/:\#UnC,8Rrc.x ;_L-< kf^Vye(9Z6UmtzVAOġ[8s:4lr̬s7Ų錛c ?ndÜ ]Ƥ vWj 6%*4OuC,tĺ{XXMO$/ǣj9uG# =`AكlͲ0py1g1?HM_ Ggv PHgKr9]/8:[WȬUYwU2FnAc7t{3p4x$aJ(t[6ղi  &6ԵB-a'*Fř9Wo}jϔ i˵_.K3:PZB ĩļVzAX.n*syHŀLTY"V?jڎģ'aaMo. F{cJE l718\Iv}2{l^7xW`K5w62oXgJ?h)0ؘ;pRp3o3s >QźJC=f*٦)xJ),I]HQ!1LeD:%n;l@3yezLe,*l0?xe]*{ H1"SaGއJH\S;8gU? n"¤5ѫY33BCaֹ>q|t&dO+8u Aο?\:w-}I2&ߪR'ǘV>y"ɥby'^ 5,.(>1Y o3w'OR!掍Ϫhm6&y- ҧXcn!7 eH&:8+0R^GM 9P!k1.Ԝݼւ]~tIHl,Bo5ڬraơq;^p | 9 Miܕ_k{J~LRg?3;}$Q-շ  D~QZBl>kF{Ĵ {q[pt,IX[CrNԨOSV8gҡP8TT_]H6|糒5"V ô|`3}4ł \.6ih5[^Ȓ|<{h*+snvx7V3T#\z$0v3~#۸ Z&7T䱔3S^M6 7i֕7-׮nbY24DjnʳU$q.md `|c̰ ke#vcMߙ:!¤E s>Þ+HU *ȠA=vJ[Nt>+aYE準l! ]=EMkN(nm֝o}nFQR>+RsQk"CxOOI$<a&AFǡBI0Ka 6Ԭ_4B>xTʹᑂTinb+.Sa<HeX?{Y 1mV,{aHo|yJChh U:oTa"*B#i\4(}iY; H$NQ$"tҊy7Z+s)U:[7 V( VfϿb~OՑCG}ٸ#&j͡gd(*Glhq?^VgI =`D/hr-`ZgGЙ27iAjS#9ȁ<뼑.ƙA3@Z|6Z .TnOs|niƚb.v| U[;O3ĤnsZ6I D˻_uI=?$CK-CڂʘV*V= Nh}٣pbv Pgr/;ʯ[W0(?;ց&^J=j]60R)>I\ͫ/K2d`RS@|a]>/e|Q8k[U1'k#AַfNZXB@NIt= t.+hԻw+4e-'6ujl.qMm78ӝI䅪ߍ_x6g:WpXxd5BF?^}+чLD"10& -!`N"|͎kЯ=0fZ2ⷞC %j }z`@h:hӼ8#6k':;|gnBhŃpi;]t{d]| A,Zx7B3@I h8ƨ(a1 ر'l,7ӕS0!jYi+CIH~gU*4^N~Dپ8{L\ъ&hBwSNV-Ud ][~uKw^AK z̥fmrƦ_nSlvtg#cn5Ǚ#\N`"J0;kC]EۮLRRLݜPITJ/H|0٧t[z44R>Wh˰87- N/Z}A/Hz*`*=: 0ҺBi`/ŋ#Wp1k% 2L/PR2|MA"˺z\*l4YIFJ73hX-x2Ȝ :#R p JZM;4*"ue*HZXk)Dvƿ͒%95{l] b]'{:=z3vv+ޚ]nsnghzޟ"ŽYOՌɝ$y_DM%+>."绽m;tbq.\_/aP;$Uo=eʠf1Ji HS,']"] إ蕚Z)LWek_ZNW&}H4VK9kLWٍh19xU\\XO1l -i ` AO}0j>SYHx†3?%0SQ Դ3@pVh43+TPx{$Ǎ77%!Rɛ `V1%?%xt)>;o4$(N U;mʨ!E^H8QTO,{SJF#Yb5\Bc1Nhy@;: GiO-^HU D30/H/`Y C~"+𔾁*tR2&-b w뛽̝tɖj:Z,}}RLԔMNJy_L߸1B3T@C57۹3D4W~r= ZVe;=)#󦗪e?vsG!w_xV9\ɋ6^0|)BU0y܉0-10}c]` ɋBHw"ekC =O?"r]ՒJtхH= g/&΢1:|Z^|MmZGZ|K6K&Z_忭v/qO'NxGρ]Ea>8~@ʼn +ʘ'>D@jhjJ,%[k!H)eϬ'хLXM`JۮfK `Q;G;aA˭4._y]r{N2T4=#FԴ'9aD VdubKKHWtX+ Aֳe萁guᣚM#v Nxy-xFtM@Y ?2ܴlDnZI$H㣹"A^&qg! p>\Nf4smõ V?qjs 0MzjMoF nu"%'sa$11 ?G:Y}e& nj.ydS{6?} !7!ͯѾO%IYX=˨8<uaET} epXd9Žy8Jx5c1cSRl19&"nwצ>&aFixR[r-gP8lcÕ' CDɒ -{e"ryY |nh-yT]SXlBۊXS@+{3e// ɹU𩕁Gdr;]|\O}ĽTtsRJu\1u8D_ %gqlr^=^jYq޸j&,SV>OW3 lng^#ĉYSBy:UH-#{ A޴2K?A>n)#k1k{.5bP|ƶv7/&'ƎZY4#R>lԠoG<eX_yTk2]}Le>N"p (^)} # 45ocJԋޫ)U{'~x+V(x a ׎ ]Q),S-'itſ6w g&/.|4׾WŁ;Tuyv]ӚZK%ЗZMQ8YSs-xgh[X%Zgm_#sg^ gԩ0tZc9&:P:uǓX;7C&f)ٻ_P(2qY4#}K#{K #KpUo҉셬+[60t6ZUK/ s졓.BYj(\heAC)< WoV9`;x>;Y_汤3% cMΕ`IݥsTꂰݧD'x'.vDrͧo>1tKa6f &ץ\ޟ&f5 , 0D: X/_!W;A_F#ߠEjR9{/vTX|t '8b{P2\#1[ojN~ҩF6hKS}%BȿdܭuѳUK( f_0n3xv5#o&fsgGv^KsިAc;W-~_<Zch8ps67r}^|3@V _QO+ (=bdjaatQ/|~FbWVO ]#5r1" mofBsWǑHIuJ6//+Xbq)j_ (u}=¬ umk% m#2}bҋ/V[kB E`xW8U(dT=a~#*8r@zxVʋc/؍^IOmV֚>1wj,!_t&Ƭr"ua<RdPbFiA1o?6W. K)Nkp r{׹Mц}q~]z%.UR HOl37_ Q/FRxeZ`NW" sa~2 lãK˓TEVIm BdW@hC\Uq}{٩"zSNe R^y˘0g7&%VkXpEc}ҙ e_s2<wzz/Rf YlC÷w;eލ]^'g[}jmC}Ii24!+d~qJ8o5<Q+0Ҫ6Sw#9e~&ד^ɆBIH_ |V RYwY~o48zvKF=zLg8Odh^ :Hjg.B]\nl)G7bձ'\R:Yw%* 6i)ˎfR4:֐,K,\꺲^eѮ1…pu,'G{+8{O?090fzfBПG.FEPXc0ݹ Od4WLpt$o]J5!I~U }0C'c0U>:3g%ԖGG9M ~IwS:?&^)UOB{ڍk'c>RZF\O+B)vZN␺O~u!PI EWXjt% \;0t}LtsyqL!fCaέE.yKS3!zBc%η+iK O*<M ;?9y7DJNHE8++NcH8R^~}s(+WrR΁Z+wuXqb|>=8Obt1EEoC`r_x'{.U sqPx%QN|uȾgI[e8cy/hkRX7jP=IgaU{"8q*TGb-b R#~΋ã,a|b݊Ca8g--UHy!h-IvWXd&[I 2=G9]E0IIg8^Chztmmʢѐn^٬3VZK=/5]ip@(8!mzɕ04}U<^囔/ig"v{n1XJo[y5;'zdMG_s7' +`ok؂d$y55C59GHN&ES(;S0dF!pNB{./N+FA'pocNB,;ǒ$=,{c|КʈȦvtU57^^rz T yhCM7_;=S`&Ey^5c.~^&@KǕE%2up9(WWX$z e~ÖMUA Cqݜ1׳yj(l8ƃ)ET򌻍 z2.hMO32BaidАךG$d[M(u7+d)] ۅQE^CF1>8H^g[x()b*]ް,,:cvhhhVe'݁Z x]2[.J/m߂" ˙YVnW$,?P .՘͝\a=_et:E D/i˿R5簉 KB\I|kL8ݵƢ,"[nid.vP1E*Qs$[8K|+ibDsşt'79MnY#Nj.fh3X"aDB "@HGM-c_8EE4.=hօݶ(S$]n8,g)Y>|7?d$/)Exii0Wg,>dҙ]_v6f` {ԬfZxQyCW(F> W|IN M|ngv5& 2W/ub;!HKYk H6,yڐ[{A#91P}aQAr t'0[c{9{vW 3nh|HaLsC=0̠x5:?.Lm #h9PKBs_ ">C\qbr5/ӵmb|pYƈhC8!.䒲WVb):+<5P*7ڸhL{')B_ߢR@sJ_o'/J+'N5%A{HMFJ[&=T078UX4[ٶ!q`Z{QT|``К5"Cڂjo67}3OП{R(o:EfAIkN:7h\R4e95mrs):Ďjre!89,@5}ZIctfei)wABNSS"bg`1}8d)dd u_~G؇'_^=8ʨ׏! Yd=݅܊;(tjqbUܶ&nLy9h[5 3*SazT3t[{߆1VU^HnUT3 sT1yclwy wQdܳH,c]L>hՔagnMz;͏x3\Ha]ͩTmJ8󃦿 "?|=93%b3=m W_#o'tŇ:s6uk"j s;G(Hq;.O(x7?؛/hls Y@"f6^ |w502C,gazs4P1ָ|ي—+< e?Jٱەۄqn6asRFdb͑ƨKIU|5lv=dT;C匎-Cc`_TdPp|:ar3o19lY.F>mV'fvc,[inJ)yA VOR( sg܊Ę|pY&16kZ`g)( vA`jUB=M4%.͝ё_Aƥ$]ݽlصFHu.b&-zQ·G\e4^|'ɗC[/j$Ȩ5ˤl^?GQ ?/^ g*!(_*P^؀Uc[L!y@zuEN T$d]"2aHݞڀ&IjYiuaPGjTgDiCOp"LR|ka=E=<>).Is^׭\_!$j0gu=yX➮,'Z_>[ ޹yb3+sY1M#Lu~z mf# U/r} 2F+X80o`?4V?n _:V_S6eè q.(͇?_PeAG+WGQG[ <HJV_@HVd /@c8Փ1y6-1<#Fݑ%2EC]RcVp܊ᒄ^94-?S zRu40*Q7c܄t1$ř 9׆ŁrXIѰ$YݹA_QQXB ~ ]i~nVvVd? g.\8ºrƁdk/R/#H}9X' mzAbr=uƁ4euk\1NC}h2\L7ZZv$"I+` =4VX8BEaD.fv3!`vw8 餲._zفMGL`Do>zԈ\}{f^;8?bFC=l3ʔ2ʅE|Հ) $zc ^NGo~n\{/7+F i„י?TAR{cD:a+1I}vuXLG\L1&qh₮~oM"EivګP^@K2')֢hbCpwoɅ Sb=v"Ϩ0>}EV#g ^㣪I&w#Cb`᷵şss܏h0Fy!Ϝ]~$]ul፱#c(;KJȉMc8!vƟdQpw,\ܘʯa6 <=_~$b;iOpSJ ]rd)Qۇ{xH•Э LJ,3zVkj9% G҅Mc8\"8SԘE2vocCP F NF> [D}-+;mvM唄P=w2i I w2˚_$V sƿÅ ,c;SP` CӐC_$,(A`&^ [Ty,0y*.󑸬@f8%25 qg¿,a1SrZjUx*0D$k&fV#4Ykޱ+h9;h1pg==+T\܂NVs[]e6{K!N>4| ,C8$vKT-;JG؎C>4fnZI-w̫myL_5Rw`\AĞM75o@3ٵwI_ooxt+I,xď+^^AsTŬC 2in} D ôT)^&F t>(d#yF="xPsV[.΢h79o!B}'Sz6q+P#zF1FM[om+X`YAZm|~^zH of$E}Ǻe(9!v!Y"5t4T & [Kɔ)xͺh`qiw ~F RO='Aph8, wzNBxgˬXp[0SJ0|†zfD=T^hVs=D__&'Gi OK sIIZE_]ΪF[k k(}ѸU_جx/'Ӷ8}K6frHZ`{ϯdyKtY,\M EN%Hlᵛ P *A,[Gt64qLz WĘ{LF'qgP9JnPcN?s1}|q\r@\~yv#F2ם wZ!>j}<.NӋ {R0;(<]=Pu5+Z8۩hV؁M*]R_dW=V$F~Ѥ Xؒ ʹ6o1%;}oi}ѓh3"jgtao> cn+ee{ Gho!ڟaڠFY涀3fd~7 sw}h]SHΑ^-x'a<!M6ÿx憹wAit3@$('n%|y9zz$ԘU" 2͵w H# ӊ>q<Ś ӬvO ߶å.^=_m? "2^Yщ^ub"]ՊF2@pW&=.tMj mƿƎ2DyyʒAaVW'8 ىmF:F >BXf ^Be@[O]1[J oR %&$ ʤyK&pjX-5q:qe>(IyT,O}K7uX䁛YPh̷nyǡp#3J~*sR6 W䭹-T@{$~ft;Lq/Okh_eTL؄㹹3a>6p Ӧ~07jBVdǀ sqJs6 XhZ`vbց4jN8[eeRh}UiHɅ&c 6/Ģ3cC[OWΕ= 9XQcutVpABwrSƤ;&z,r(x!Ձطl(Յ"&aONoZOx <(ZW\(q* "n4\au5"l s F !Xvmh]f_r=TRT%%2ͦxF4 fY[>Mn=}%tTXjߜ7y"klqn2F n,҈R걳 [VP榀WAE䙏zѺ/)F>ܩ[yn_3n"͋$^~3HE@K&@)ϵPUH).1+,vne;`d=1.Jhyw!u|v9(P'ɉ.NL,d b-UqRÚf*K[^UXCYջW2faL5}DpU$NDd2I\2sB jgݨa(Gߕ'@L6i`-V}BHO{v(jdIFN;?bh[Zο{ J L߷`4;崹W9cJ7$K/;ߌiEFyٮa3 19zP`)h,w.G ڒz%iQϔf?#uѶͽWSWYӷ,K߳4otq6 glԿ}t|Q=Sw`&$KͻOX?S 81CEeݎp!-.瓼J;0pvʞHzJڄe<1kCuhJ}v1cCߘALvvJaѥEוC*Ncc t0bJv `*f.GqoG8[[=qNud_ ;*9Fc.@ dTr]B~j/내#B`I7$.ֺ^E%AXe[>=/Ⱥt-䧒.J]n7\e)C^E2h@)yUdQ{0lV{wG'ہk⯳ \pvWE;L5FU&LM Y{+@?nŠ 6գyE] O[~ka ]Hmxz,.f=V呓V+twwrK=مK⧱EB^$;g’ EJlT.mQJec SإW>\1 +6 ?u9CGMrScvBI|UmSKQWy7ƼbT5\}Dhcj3zh@ЫzN_86R;EhBϲeRggYFˢG9f7"UTQz Uwlٟ: HI  V}7Dpr~KOb6-/ayË%EalfԼQDwc2z-?(w=9dq6j"wF-=o 0`9 ! 3\j^uVk5?Jͼp5I M|pWgdSl v ;d o, E{anOa)!!8fssvrt9p=CbS˵fA $nӳ+&&g`R ;\Jq'n슍`%>¢6AړF qu1p:{kirC†}RLZ=-;ïGtJmRZ/>g_ȢV g̾_nFK&o7W%_(լO$ͤ t\ao@8S9q'^`$C4umݲAEj莲)y;Y`{Uhj~,0g#y?]h0f2`󪭬'Qi\R- knl~{ Ɲ}"2gmJIGF{!n~(囶1Զ-Bƴ3ZYƚ'r+]w3)cɄElixO<"᰽Z)r4V2/D2J0SUAKwk%h. cVcRt)nm yc1QpkG# G7UQ@qL/ >崑 f:a>FE6NFCUK[q*,p U6xL$0]5BGԗU?M 0ta3A WX1DPY!|WVv.?ߔ$]VE >K[4#1[uނUTeXBT(#ͻz[i]Ew4X́R+&fIZxMy߬S"NΦȆrNhaOW/=a+k7{*+ǀ$nй-^,.xάo*|C@0Z荐 tP*ċ؀sn/L<@8IR~ƣhe8l0rm_TN-UӸFmI̬VmA$XΫQ~G9J;uYjvOS/B ah=1͋9HE㎞ʐd[@tZ*n-1PvV* ;\x>l8F,U98._w|FKZגܝ TLw_tQpiLW m8<OPUq /e6( JNx/Z):h7d֧eQnZ>cDjS )<J4t&TwAk x .-9.0(BJxv2B?cⒹrV/+ә*.;N A6O_TmQ/l30H-cPj$ ESQbM k,ACFr#xS幭x \1Ry-G\\Q+GxVk"@ivpVQ ϳh3a+n,x_s1  ²_~ƪPIfC鵶6YEl|.JFV7†{ wG\-WWxvH;سK@$Ȃ]C ,ӤL\DYVNWuuQd_cW0 \fj 5ݼCҞ.ج1֑%AӒ|?s45 4Ys^FBQ4̼o[kC# ^VkSwME]r4% ]gf/7iunLS36:~?񰁵ʌ ľ0XXޖZ V8^ʞ'n&T:셽n~T[q;u L*\&=Wb a3ס2PVoymHJqVGvGNw߿ZvK96_XON0F#!ۇW]w'k\kv6WVm𒞯hdI3OB:qNXH tƢ2\os]BE3Vi]cϓͮ(H(Ak!>0˝zӉ4ch%Fa$w}\< NzzXcT;;!y [ W; eV,5a9L KW0ap^""/z\VCK%^nVq1$f6{0Go;v-xԽMfS*I=Ԉ!&4wtSߨ IL$X#pSF<* >ip}s롞O> endobj 76 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> /ExtGState<> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 6 0 obj <>/Contents 7 0 R>> endobj 11 0 obj <>/Contents 12 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 21 0 obj <>/Contents 22 0 R>> endobj 80 0 obj <> endobj 81 0 obj < /Dest[1 0 R/XYZ 56.7 575.2 0]/Parent 80 0 R>> endobj 82 0 obj < /Dest[1 0 R/XYZ 56.7 538.6 0]/Parent 81 0 R/Next 83 0 R>> endobj 83 0 obj < /Dest[1 0 R/XYZ 56.7 462.8 0]/Parent 81 0 R/Prev 82 0 R/Next 84 0 R>> endobj 84 0 obj < /Dest[1 0 R/XYZ 56.7 400.8 0]/Parent 81 0 R/Prev 83 0 R/Next 85 0 R>> endobj 85 0 obj < /Dest[1 0 R/XYZ 56.7 200.8 0]/Parent 81 0 R/Prev 84 0 R/Next 86 0 R>> endobj 86 0 obj < /Dest[6 0 R/XYZ 56.7 704.3 0]/Parent 81 0 R/Prev 85 0 R/Next 87 0 R>> endobj 87 0 obj < /Dest[16 0 R/XYZ 56.7 211.9 0]/Parent 81 0 R/Prev 86 0 R>> endobj 27 0 obj <> endobj 26 0 obj <> endobj 88 0 obj <> /Outlines 80 0 R /Lang(fr-FR) >> endobj 89 0 obj < /Creator /Producer /CreationDate(D:20160322173041+01'00')>> endobj xref 0 90 0000000000 65535 f 0000177770 00000 n 0000000019 00000 n 0000003046 00000 n 0000003067 00000 n 0000003264 00000 n 0000177932 00000 n 0000003304 00000 n 0000007120 00000 n 0000007141 00000 n 0000007338 00000 n 0000178076 00000 n 0000007379 00000 n 0000009478 00000 n 0000009500 00000 n 0000009698 00000 n 0000178222 00000 n 0000009739 00000 n 0000012325 00000 n 0000012347 00000 n 0000012545 00000 n 0000178368 00000 n 0000012586 00000 n 0000015682 00000 n 0000015704 00000 n 0000015902 00000 n 0000179950 00000 n 0000179823 00000 n 0000015943 00000 n 0000019429 00000 n 0000019451 00000 n 0000019654 00000 n 0000020086 00000 n 0000020376 00000 n 0000040811 00000 n 0000040834 00000 n 0000041031 00000 n 0000041654 00000 n 0000042118 00000 n 0000048286 00000 n 0000048308 00000 n 0000048511 00000 n 0000048871 00000 n 0000049098 00000 n 0000056893 00000 n 0000056915 00000 n 0000057126 00000 n 0000057514 00000 n 0000057772 00000 n 0000060236 00000 n 0000060258 00000 n 0000060455 00000 n 0000060832 00000 n 0000061067 00000 n 0000063739 00000 n 0000063761 00000 n 0000063955 00000 n 0000064358 00000 n 0000064614 00000 n 0000078720 00000 n 0000078743 00000 n 0000078950 00000 n 0000079476 00000 n 0000079862 00000 n 0000092963 00000 n 0000092986 00000 n 0000093190 00000 n 0000093692 00000 n 0000094048 00000 n 0000133986 00000 n 0000134009 00000 n 0000134203 00000 n 0000135148 00000 n 0000136114 00000 n 0000175296 00000 n 0000175319 00000 n 0000175512 00000 n 0000176457 00000 n 0000177422 00000 n 0000177547 00000 n 0000178514 00000 n 0000178570 00000 n 0000178718 00000 n 0000179068 00000 n 0000179234 00000 n 0000179420 00000 n 0000179558 00000 n 0000179692 00000 n 0000180068 00000 n 0000180218 00000 n trailer < <07A4E9047E477DDB99B4DFB7C23B05F0> ] /DocChecksum /0A619E63E015C013527E126E6CB8671D >> startxref 180447 %%EOF DiscoSnp-2.6.2/doc/vcf_creator_user_guide.txt000066400000000000000000000271631420021152700212640ustar00rootroot00000000000000VCF_creator : module of DiscoSnp++ Mapping and VCF Creation features Table of contents User part 1 VCF_creator : one module in DiscoSnp++ Mapping and VCF Creation 1 Quick starting 1 Running VCF_creator 1 Options 2 Output 2 Examples for the filter fields 5 User part VCF_creator : one module in DiscoSnp++ Mapping and VCF Creation VCF_creator is designed to map on a genome the output of DiscoSnp++ the Single Nucleotide Polymorphism (SNP) and small indels. This module create a Variant Calling Format (VCF) from the output of DiscoSnp++ or from an alignment obtained with the software BWA *. Quick starting Download and uncompress the DiscoSnp++ Install BWA (you can add it to your PATH ) Run the simple example: XXX Running VCF_creator The main script run_VCF_creator.sh has three modes according to your needs : MODE 1 : You don't have a reference genome but you want to create a vcf (it will summarize the DiscoSnp++ informations and will give the position of the variant on the upper path of DiscoSnp++ variant). The module will create a vcf from the output of DiscoSnp++ : ./run_VCF_creator.sh -p -o [-s ] MODE 2 : You have a reference genome and you want to align your variants against a reference genome. The module will run BWA to make an alignment between your reference genome and the output of DiscoSnp++ : ./run_VCF_creator.sh -G -p -o [-B ] [-l ] [-n ] [-s ] [-w] MODE 3 : You already have an alignment (.sam file) and you want to create a vcf file : ./run_VCF_creator.sh -f -n -o Options General options : -p : DiscoSnp++ output file (.fasta) (Mandatory unless MODE 3) -o : ouput (.vcf) (Mandatory) -G : reference genome () (Only in MODE 2) -B : bwa path ( /home/me/my_programs/bwa-0.7.12/) (note that bwa must be pre-compiled) (Only in MODE 2) (not necessary if BWA is in the path) -f : alignment already done (.sam) (Only in MODE 3) -h : show help -w : remove waste tmp files (bwa index files) -I : create of an output (VCF format) specific to IGV (Integrative Genomics Viewer) : sorting VCF by mapping positions and removing unmapped variants BWA specifics options (- warning, bwa mapping running time highly depends on this parameter) : -s : bwa option (-s) : seed distance ( optionnal, default value 0) -l : bwa option (-l) : length of the seed for alignment (optionnal, default value 10) -n : bwa option (-n) : maximal bwa mapping distance Optionnal in MODE 1 and MODE 3 ( default value 3) Mandatory in MODE 3, it's preferable to use the same value used during alignment by BWA (default value 3) Sample example: XXX Output Final results are in your .vcf. It's a Variant Call Format that will summarize all the mapping information and the header of DiscoSnp++ informations. Example : MODE 1 : #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 G3 G4 G5 SNP_higher_path_13736 30 13736 A G . . Ty=SNP;Rk=0.99909;UL=.;UR=.;CL=.;CR=. GT:DP:PL:AD 0/0:53447:1947,160066,1067676:53425,22 0/1:3:40,9,20:1,2 1/1:94862:1895477,284398,3575:30,94832 0/1:5:34,9,54:3,2 1/1:65389:1306661,196101,2493:19,65370 SNP_higher_path_5442 30 5442_1 A G . . Ty=SNP;Rk=0.42995;UL=.;UR=.;CL=.;CR=. GT:DP:PL:AD 0|1:19:98,14,198:12,7 0|1:18:138,12,138:9,9 0|1:8:66,10,66:4,4 0|1:130:257,124,1813:104,26 0|0:224:14,598,4324:220,4 SNP_higher_path_5442 31 5442_2 G A . . Ty=SNP;Rk=0.42995;UL=.;UR=.;CL=.;CR=. GT:DP:PL:AD 0|1:19:98,14,198:12,7 0|1:18:138,12,138:9,9 0|1:8:66,10,66:4,4 0|1:130:257,124,1813:104,26 0|0:224:14,598,4324:220,4 INDEL_higher_path_586 30 586 GGAC G . . Ty=INS;Rk=0.40534;UL=.;UR=.;CL=.;CR=. GT:DP:PL:AD 0/1:127:837,17,977:67,60 1/1:387:6056,518,408:52,335 0/1:70:372,21,651:42,28 0/1:126:1395,53,477:40,86 0/1:102:671,16,791:54,48 MODE 2 and MODE 3 : #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 G3 G4 G5 Pseudomonas 109860 15103 C G . PASS Ty=SNP;Rk=0.65101;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=C;Sd=-1 GT:DP:PL:AD 1/1:4:84,16,4:0,4 1/1:1:24,7,4:0,1 1/1:1:24,7,4:0,1 0/1:6:17,15,97:5,1 0/1:10:124,14,44:3,7 Pseudomonas 4416118 1416_1 A G . PASS Ty=SNP;Rk=0.41638;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=A;Sd=1 GT:DP:PL:AD 1|1:35:606,71,28:3,32 0|1:26:403,41,43:4,22 1|1:34:617,79,18:2,32 0|1:46:316,14,356:24,22 0|1:43:547,36,128:11,32 Pseudomonas 4416119 1416_2 A C . PASS Ty=SNP;Rk=0.41638;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=A;Sd=1 GT:DP:PL:AD 1|1:35:606,71,28:3,32 0|1:26:403,41,43:4,22 1|1:34:617,79,18:2,32 0|1:46:316,14,356:24,22 0|1:43:547,36,128:11,32 Pseudomonas 1312837 14361 C CGTAGAAGATCTC . PASS Ty=DEL;Rk=0.26896;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=.;Sd=-1 GT:DP:PL:AD 0/0:792:47,1978,15015:771,21 0/0:745:34,1905,14223:728,17 0/0:697:37,1765,13268:680,17 0/0:783:32,2016,14979:766,17 0/1:849:1303,868,12339:701,148 Pseudomonas 1753272 6164 TGTGCAGGTCGAAGACTTGA T . PASS Ty=INS;Rk=0.13677;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=.;Sd=1 GT:DP:PL:AD 0/0:1086:34,2817,20829:1064,22 0/0:1158:34,3011,22226:1135,23 0/0:1003:32,2608,19250:983,20 0/0:1486:124,3555,27823:1437,49 0/0:1132:585,1967,19224:1033,99 In this example, the three types of DiscoSnp++ variants : in red : simple SNP ; in green close SNPs ; in black INDEL. The VCF file has the following fields : CHROM : chromosome id where the prediction is mapped, or allele id of the upper path if the variant is unmapped or if no reference genome is provided. POS (1-based leftmost position): If a reference genome is provided and if the variant is mapped on a unique position : the mapping position of the variant If a reference genome is provided and if the variant is not uniquely mapped : one of the positions of the variant (1-based lefmost position) Else (no reference genome provided or unmapped variant) : position of the variant on the upper path of the discoSnp++ prediction (including the left extension) ID : identification of the variant (used by DiscoSnp++). For the close SNPs, the SNP number is added to the ID. Example : 10388_2 REF : If one of the two predicted allele maps this position : the corresponding variant Else, or if no reference genome provided : the lexicographically smallest of the two variants In case of close SNPs : the first is defined as previously described. The following SNPs are those located on the same path ALT : The variant non reported as the “REF” variant QUAL : “.” (unused) FILTER : PASS if the variant is mapped at unique position MULTIPLE if the variant is mapped on multiple positions “.” : if the variant is unmapped or if no reference genome is provided INFO : Ty : Type of variant SNP : If the variant is a simple SNP or close SNPs INS : If the variant mapped corresponds to the longuest path ; the alt carries the deletion DEL : If the variant mapped corresponds to the shortest path ; the alt carries the deletion Rk : Rank of the prediction computed by DiscoSnp++ (if several datasets are used in DiscoSnp++, ranks the predictions according to their read coverage in each condition favoring SNPs that are discriminant between conditions value between 0 and 1) DT : If the variant is mapped on a unique position : distance of the mapping (number of mismatches). If the variant is unmapped or mapped on multiple positions : “-1” UL : Length of the left unitig (“.” if not computed) UR : Length of the right unitig (“.” if not computed) CL : Length of the left contig (“.” if not computed) CR : Length of the right contig (“.” if not computed) Genome : Applies only for SNPs when a reference genome is provided (“.” for INDELs and when no reference genome provide or if the variant is unmapped). Reference nucleotide (!!nucleotide in the reference genome !! In general it is correspond to the REF field ; could be different for close snps). Important Remark : If one of the two predictions matches the reference : equal to the “REF” field, else equal to the nucleotide of the reference genome. Sd : Applies only when a reference genome is provided (“.” if no reference genome provided or if the variant is unmapped). Strand of the prediction mapping. “1” : Forward ; “-1” : Reverse. Important Remark : Fields “REF” , “ALT” and “Genome” are based on the mapped predictions. If Sd is 1 then these fields correspond to the DiscoSnp++ prediction, else if the Sd is “-1”, then they correspond to the reverse complement of the DiscoSnp++ predictions. FORMAT : Description of the genotype fields (G1, G2, G3 …) GT : genotype, encodes as allele values with 0 corresponding to the reference and 1 to the alternative. About genotypes : If the separator is a “/” the genotypes are unphased ( INDEL, Simple SNP) If the separator is a “|” the genotypes are phased (Close SNPs with the same ID ) DP : Cumulated depth across samples (sum) PL : Phred-scaled Genotype Likelihood (given by DiscoSnp++) AD : Depth of each allele by sample Examples FILTER Fields: PASS if the variant is mapped at unique position MULTIPLE if the variant is mapped on multiple positions “.” : if the variant is unmapped or if no reference genome is provided #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 G3 G4 G5 Pseudomonas 1945315 8816 C G . PASS Ty=SNP;Rk=0.63574;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=C;Sd=1 GT:DP:PL:AD 1/1:8:135,19,16:1,7 0/0:2:4,10,44:2,0 0/0:1:4,7,24:1,0 0/1:8:30,14,110:6,2 0/1:5:54,9,34:2,3 Pseudomonas 3190754 768 A G . MULTIPLE Ty=SNP;Rk=0.06837;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=A;Sd=-1 GT:DP:PL:AD 0/1:1254:8182,28,9459:659,595 0/1:1235:9809,42,7594:562,673 0/1:903:7217,37,5521:409,494 0/1:473:4217,52,2520:194,279 0/1:1416:10513,26,9395:680,736 VCF for IGV : If you want to use IGV (Integrative Genomics Viewer) to visualize your data, VCF_creator can create a vcf specific to IGV (0-based, sorted by positions, and without unmapped variants) #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 G3 G4 G5 Pseudomonas 1206 7667_1 G T . PASS Ty=SNP;Rk=0.10501;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=G;Sd=-1 GT:DP:PL:AD 0|1:115:1172,36,513:41,74 0|1:142:1154,19,875:64,78 0|1:90:707,16,587:42,48 0|1:111:1190,43,452:37,74 0|1:102:960,26,521:40,62 Pseudomonas 1210 7667_2 T G . PASS Ty=SNP;Rk=0.10501;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=T;Sd=-1 GT:DP:PL:AD 0|1:115:1172,36,513:41,74 0|1:142:1154,19,875:64,78 0|1:90:707,16,587:42,48 0|1:111:1190,43,452:37,74 0|1:102:960,26,521:40,62 Pseudomonas 1214 8588 T G . PASS Ty=SNP;Rk=0.02395;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=T;Sd=1 GT:DP:PL:AD 0/0:1059:32,2755,20328:1038,21 0/0:1288:16,3518,25081:1272,16 0/0:830:21,2204,16026:816,14 0/0:907:14,2486,17676:896,11 0/0:993:19,2666,19237:978,15 Pseudomonas 1217 12549_2 A G . PASS Ty=SNP;Rk=0.05280;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=A;Sd=1 GT:DP:PL:AD 0|1:284:1659,27,2378:160,124 0|1:379:2586,19,2766:194,185 0|1:231:1509,19,1768:122,109 0|1:321:1852,30,2710:182,139 0|1:260:1820,17,1860:131,129 Pseudomonas 1237 10749 T G . PASS Ty=SNP;Rk=0.02921;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=T;Sd=1 GT:DP:PL:AD 0/0:995:14,2806,19551:987,8 0/0:1252:15,3550,24642:1243,9 0/0:784:14,2240,15461:779,5 0/0:812:31,2420,16195:811,1 0/0:944:15,2696,18615:938,6 Pseudomonas 1243 860 T G . PASS Ty=SNP;Rk=0.02113;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=T;Sd=-1 GT:DP:PL:AD 0/0:1008:14,2845,19811:1000,8 0/0:1247:15,3535,24542:1238,9 0/0:775:19,2258,15366:772,3 0/0:782:13,2213,15380:776,6 0/0:921:20,2672,18240:917,4 Pseudomonas 5133 14601 C A . PASS Ty=SNP;Rk=0.04497;DT=0;UL=.;UR=.;CL=.;CR=.;Genome=C;Sd=1 GT:DP:PL:AD 0/0:1458:41,4306,29017:1455,3 0/0:1613:75,4860,32264:1613,0 0/0:1044:20,3017,20654:1039,5 0/0:1013:48,3054,20264:1013,0 0/0:1215:46,3631,24253:1214,1 Pseudomonas 6702 8511_1 T G . PASS Ty=SNP;Rk=0.05088;DT=1;UL=.;UR=.;CL=.;CR=.;Genome=T;Sd=1 GT:DP:PL:AD 0|1:200:1360,17,1479:103,97 0|1:196:1177,22,1616:109,87 0|1:118:843,16,843:59,59 0|1:182:1041,25,1560:104,78 0|1:160:1040,18,1239:85,75 DiscoSnp-2.6.2/docker/000077500000000000000000000000001420021152700145045ustar00rootroot00000000000000DiscoSnp-2.6.2/docker/Dockerfile000066400000000000000000000015211420021152700164750ustar00rootroot00000000000000FROM debian:wheezy MAINTAINER Pierre Peterlongo pierre.peterlongo@inria.fr # Set discoSnp++ version ENV MTG_VERSION 2.2.10 # Set noninteratve mode ENV DEBIAN_FRONTEND noninteractive ENV PACKAGES wget gcc g++ make cmake zlib1g-dev libboost-dev git ENV DIR /opt ENV SOURCEKS kissnp2 ENV BUILD build WORKDIR ${DIR} RUN apt-get update -y && \ apt-get install -y --no-install-recommends ${PACKAGES} RUN git config --global http.sslVerify false # clone the github repo RUN git clone --recursive https://github.com/GATB/DiscoSnp.git WORKDIR ${DIR}/${SOURCE} RUN git submodule init # Using an official release RUN git checkout v${MTG_VERSION} RUN git submodule update RUN mkdir ${BUILD} WORKDIR ${DIR}/${SOURCE}/${BUILD} RUN cmake .. RUN make # symlink binary in /usr/local/bin RUN ln -s ${DIR}/${SOURCE}/${BUILD}/bin/kissnp2 /usr/local/binDiscoSnp-2.6.2/run_discoSnp++.sh000077500000000000000000000630421420021152700163750ustar00rootroot00000000000000#!/bin/bash #***************************************************************************** # discoSnp++: discovering polymorphism from raw unassembled NGS reads # A tool from the GATB (Genome Assembly Tool Box) # Copyright (C) 2014 INRIA # Authors: P.Peterlongo, E.Drezen # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #***************************************************************************** red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` cyan=`tput setaf 6` bold=`tput bold` reset=`tput sgr0` die() { printf '%s\n' "$1" >&2 exit 1 } function myrealpath { echo $(cd $(dirname $1); pwd)/$(basename $1); } option_cores_gatb="" option_cores_post_analysis="" Ttot="$(date +%s)" #### constant ##### max_C=2147483647 #$((2**31-1)) ########################################################### #################### DEFAULT VALUES ####################### ########################################################### version="2.3.X" read_sets="" # A file of file(s) read_sets_kissreads="" prefix="discoRes" # all intermediate and final files will be written will start with this prefix k=31 # size of kmers b=0 # smart branching approach: bubbles in which both paths are equaly branching are discarded, all others are accepted c=3 # minimal coverage C=$max_C # maximal coverage d=1 # estimated number of error per read (used by kissreads only) D=100 # maximal size of searched deletions max_ambigous_indel=20 P=3 # number of polymorphsim per bubble option_max_symmetrical_crossroads="" l="-l" extend="-t" x="" # if set to -x : authorize non closed bubbles (used mainly in RNA seq) output_coverage_option="" genotyping="-genotype" verbose=1 stop_after_kissnp=0 aav=0 # if set to not zero : considers the aav context: 1/ no uncoherent 2/ authorize -x option e="" # if set to -e: Map variant predictions on reference genome with their unitig or contig extensions graph_reused="Egg62hdS7knSFvF3" # with -g option, we use a previously created graph. #EDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) EDIR=$( python -c "import os.path; print(os.path.dirname(os.path.realpath(\"${BASH_SOURCE[0]}\")))" ) # as suggested by Philippe Bordron if [ -d "$EDIR/build/" ] ; then # VERSION SOURCE COMPILED read_file_names_bin=$EDIR/build/bin/read_file_names dbgh5_bin=$EDIR/build/ext/gatb-core/bin/dbgh5 kissnp2_bin=$EDIR/build/bin/kissnp2 kissreads2_bin=$EDIR/build/bin/kissreads2 else # VERSION BINARY read_file_names_bin=$EDIR/bin/read_file_names dbgh5_bin=$EDIR/bin/dbgh5 kissnp2_bin=$EDIR/bin/kissnp2 kissreads2_bin=$EDIR/bin/kissreads2 fi chmod +x $EDIR/scripts/*.sh $EDIR/run_discoSnpRad.sh 2>/dev/null # Usefull for binary distributions useref="" wraith="false" genome="" bwa_path_option="" option_phase_variants="" bwa_distance=4 ####################################################################### #################### END HEADER ####################### ####################################################################### function help { echo " ************" echo " *** HELP ***" echo " ************" echo "run_discoSnp++.sh, a pipelining kissnp2 and kissreads for calling SNPs and small indels from NGS reads without the need of a reference genome" echo "Version "$version echo "Usage: ./run_discoSnp++.sh -r read_file_of_files [OPTIONS]" echo -e "MANDATORY" echo -e "\t -r|--fof " echo -e "\t\t The input read files indicated in a file of file(s)" echo -e "\t\t Example: -r bank.fof with bank.fof containing the two lines \n\t\t\t data_sample/reads_sequence1.fasta\n\t\t\t data_sample/reads_sequence2.fasta.gz" echo -e "\nOPTIONS" echo -e "\t -k | --k_size value " echo -e "\t\t Set the length of used kmers. Must fit the compiled value." echo -e "\t\t Default=31" echo -e "\t -c | --min_coverage value " echo -e "\t\t Set the minimal coverage per read set: Used by kissnp2 (don't use kmers with lower coverage) and kissreads (read coherency threshold)." echo -e "\t\t This coverage can be automatically detected per read set (in this case use \"auto\" or specified per read set, see the documentation." echo -e "\t\t Default=3" echo -e "\t -C | --max_coverage value " echo -e "\t\t Set the maximal coverage for each read set: Used by kissnp2 (don't use kmers with higher coverage)." echo -e "\t\t Default=2^31-1" echo -e "\t -b | --branching value. " echo -e "\t\t 0: forbid variants for which any of the two paths is branching (high precision, lowers the recall in complex genomes)." echo -e "\t\t Default value" echo -e "\t\t 1: (smart branching) forbid SNPs for which the two paths are branching (e.g. the two paths can be created either with a 'A' or a 'C' at the same position" echo -e "\t\t2: No limitation on branching (lowers the precision, high recall)" echo -e "\t -s | --symmetrical value " echo -e "\t\t In -b 2 mode only: maximal number of symmetrical crossroads traversed while trying to close a bubble. Default: no limit" echo -e "\t -g | --graph " echo -e "\t\t Reuse a previously created graph (.h5 file)" echo -e "\t -X\t Stop discoSnp++ right after variant calling - the output is only a fasta file with no coverage information." echo -e "\t -D | --deletion_max_size " echo -e "\t\t discoSnp++ will search for deletions of size from 0 to D included. -D 0 means no deletion detected. Default=100." echo -e "\t -a | --ambiguity_max_size " echo -e "\t\t Maximal size of ambiguity of INDELs. INDELS whose ambiguity is higher than this value are not output [default '20']" echo -e "\t -P | --max_snp_per_bubble " echo -e "\t\t discoSnp++ will search up to P SNPs in a unique bubble. Default=3" echo -e "\t --fof_mapping " echo -e "\t\t If this option is used this fof is used when mapping back reads on the predicted variants instead of the original fof file provided by -r|--fof option" echo -e "\t -p | --prefix " echo -e "\t\t All out files will start with this prefix. Default=\"discoRes\"" echo -e "\t -l | --no_low_complexity" echo -e "\t\t Remove low complexity bubbles" echo -e "\t -T | --contigs" echo -e "\t\t Extend found polymorphisms with contigs (default: extend with unitigs)" echo -e "\t -d | --max_substitutions " echo -e "\t\t Set the number of authorized substitutions used while mapping reads on found SNPs (kissreads). Default=1" echo -e "\t -n | --no_genotype" echo -e "\t\t Do not compute the genotypes" echo -e "\t -u | --max_threads " echo -e "\t\t Max number of used threads. 0 means all threads" echo -e "\t\t default 0" echo -e "\nREFERENCE GENOME AND/OR VCF CREATION OPTIONS" echo -e "\t -G | --reference_genome " echo -e "\t\t Reference genome file (fasta, fastq, gzipped or nor). In absence of this file the VCF created by VCF_creator won't contain mapping related results." echo -e "\t -R" echo -e "\t\t Use the reference file also in the variant calling, not only for mapping results" echo -e "\t -B | --bwa_path " echo -e "\t\t bwa path. e.g. /home/me/my_programs/bwa-0.7.12/ (note that bwa must be pre-compiled)" echo -e "\t\t Optional unless option -G used and bwa is not in the binary path." echo -e "\t -e\t Map variant predictions on reference genome with their unitig or contig extensions." echo -e "\t\t Useless unless mapping on reference genome is required (option -G). " echo -e "\nCONTEXT OPTION" echo -e "\t -z\t Considers AAV context: all predictions are coherents and authorize non closed bubbles (-x option)" echo -e "\nMISC." echo -e "\t -w\t Wraith mode: only show all discoSnp++ commands without running them" echo -e "\t -v <0 or 1>" echo -e "\t\t Verbose 0 (avoids progress output) or 1 (enables progress output) -- default=1." echo -e "\t -h | --help" echo -e "\t\t Prints this message and exist\n" echo "Any further question: read the readme file or contact us via the Biostar forum: https://www.biostars.org/t/discosnp/" } echo "${yellow}" while :; do case $1 in -A) option_phase_variants="-phasing" echo "Will phase variants during kissreads process - WARNING this option is too experimental and thus not described in the help message" echo "You can obtain clusters using script : \"script/from_phased_alleles_to_clusters.sh file_name_of_phased_alleles\" (the filename(s) is/are given during kissreads process" ;; -X) stop_after_kissnp=1 ;; -z) aav=1 ;; -w) wraith="true" ;; -R) useref="true" output_coverage_option="-dont_output_first_coverage" ;; -a|--ambiguity_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option max_ambigous_indel=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -v) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then verbose=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -s|--symmetrical) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then option_max_symmetrical_crossroads="-max_symmetrical_crossroads "$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -T|--contigs) extend="-T" ;; -g|--graph) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then graph_reused=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -n|--no_genotype) genotyping="" ;; -l|--no_low_complexity) l="" ;; -h|-\?|--help) help exit ;; -r|--fof) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then read_sets=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; --fof_mapping) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then read_sets_kissreads=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -b|--branching) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then b=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -p|--prefix) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then prefix=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -k | --k_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then k=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -P|--max_snp_per_bubble) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then P=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -c|--min_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then c=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -C|--max_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then C=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -d|--max_substitutions) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then d=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -D|--deletion_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then D=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; B|--bwa_path) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then bwa_path_option="-B "$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -x) x="-x" ##Authorise non closed bubbles ;; -G|--reference_genome) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then genome=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -e) e="-e" # map with extensions to the reference genome ;; -u|--max_threads) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then option_cores_gatb="-nb-cores $2" option_cores_post_analysis="-t $2" shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -?*) printf 'WARN: Unknown option (exit): %s\n' "$1" >&2 exit 1 ;; :) echo "Option $1 requires an argument." >&2 exit 1 ;; --) # End of all options. shift break ;; -?*) printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 ;; *) # Default case: No more options, so break out of the loop. break esac shift done echo $reset if [ -z "$read_sets" ]; then echo "$red You must provide at least one read set (-r|--fof)" help echo $reset exit 1 fi ######### CHECK THE k PARITY ########## rest=$(( $k % 2 )) if [ $rest -eq 0 ] then echo "$red k=$k is even number, to avoid palindromes, we set it to $(($k-1)) $reset" k=$(($k-1)) fi ####################################### c_filename=`echo ${c} | tr ',' '_'` if [ $C -ne $max_C ] then h5prefix=${prefix}_k_${k}_c_${c_filename}_C_${C} else h5prefix=${prefix}_k_${k}_c_${c_filename} fi kissprefix=${h5prefix}_D_${D}_P_${P}_b_${b} readsFilesDump=${prefix}_read_files_correspondance.txt mapped_readsFilesDump=${prefix}_mapped_read_files_correspondance.txt ####################################### c_dbgh5=$c rm -f ${read_sets}_${kissprefix}_removemeplease if [[ "$useref" == "true" ]]; then if [ -z "$genome" ]; then echo "$red You can't use option -R without providing a reference genome (-G) $reset" help exit 1 fi myrealpath $genome > ${read_sets}_${kissprefix}_removemeplease c_dbgh5="1,"$c fi cat $read_sets >> ${read_sets}_${kissprefix}_removemeplease if [ $aav -eq 1 ]; then x="-x" fi ####################################################################### #################### OPTIONS SUMMARY ####################### ####################################################################### if [[ "$wraith" == "false" ]]; then echo -e "$yellow Running discoSnp++ "$version", in directory "$EDIR" with following parameters:" echo -e "\t read_sets="$read_sets echo -e "\t prefix="$h5prefix echo -e "\t c="$c echo -e "\t C="$C echo -e "\t k="$k echo -e "\t b="$b echo -e "\t d="$d echo -e "\t D="$D echo -e "\t s="$option_max_symmetrical_crossroads echo -e "\t P="$P if [ ! -z "${read_sets_kissreads}" ]; then echo -e "\t fof_mapping read_file_of_files="${read_sets_kissreads} fi if [ -f ${graph_reused} ]; then echo -e "\t reuse graph="${graph_reused} fi echo -e "\t p="$prefix echo -e "\t G="$genome echo -e "\t e="$e echo -e "\t x="$x echo -e -n "\t starting date=" date echo fi echo $reset ####################################################################### #################### END OPTIONS SUMMARY ####################### ####################################################################### ############################################################# #################### DUMP READ FILES ####################### ############################################################# ${read_file_names_bin} -in $read_sets > $readsFilesDump if [ ! -z "${read_sets_kissreads}" ]; then ${read_file_names_bin} -in ${read_sets_kissreads} > $mapped_readsFilesDump fi ############################################################ #################### GRAPH CREATION ####################### ############################################################ if [ ! -f ${graph_reused} ]; then # no graph was given or the given graph was not a file. T="$(date +%s)" echo -e "$yellow ############################################################" echo -e " #################### GRAPH CREATION #######################" echo -e " ############################################################$reset" graphCmd="${dbgh5_bin} -in ${read_sets}_${kissprefix}_removemeplease -out $h5prefix -kmer-size $k -abundance-min ${c_dbgh5} -abundance-max $C -solidity-kind one ${option_cores_gatb} -verbose $verbose -skip-bcalm -skip-bglue -no-mphf -histo-max 1000000" echo $green${graphCmd}$cyan if [[ "$wraith" == "false" ]]; then ${graphCmd} fi if [ $? -ne 0 ] then echo "$red there was a problem with graph construction$ reset" exit 1 fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "$yellow Graph creation time in seconds: ${T}$reset" fi graph_reused=$h5prefix.h5 else if [[ "$wraith" == "false" ]]; then echo -e "$yellow File ${graph_reused} exists. We use it as input graph$reset" fi fi echo $reset cleanCmd="rm -rf trashme_*" echo $green${cleanCmd}$cyan if [[ "$wraith" == "false" ]]; then ${cleanCmd} fi echo $reset ###################################################### #################### KISSNP2 ####################### ###################################################### T="$(date +%s)" echo -e "$yellow ############################################################" echo -e " #################### KISSNP2 MODULE #######################" echo -e " ############################################################$reset" kissnp2Cmd="${kissnp2_bin} -in ${graph_reused} -out $kissprefix -b $b $l $x -P $P -D $D $extend $option_cores_gatb -coverage_file ${h5prefix}_cov.h5 -max_ambigous_indel ${max_ambigous_indel} ${option_max_symmetrical_crossroads} -verbose $verbose" echo $green${kissnp2Cmd}$cyan if [[ "$wraith" == "false" ]]; then ${kissnp2Cmd} fi if [ $? -ne 0 ] then echo "$red there was a problem with kissnp2$reset" exit 1 fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "$yellow Bubble detection time in seconds: ${T}$reset" fi if [ ! -f $kissprefix.fa ] then if [[ "$wraith" == "false" ]]; then echo "$yellow No polymorphism predicted by discoSnp++" echo -e -n "\t ending date=" date echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/$reset" exit fi fi if [ $stop_after_kissnp -eq 1 ]; then if [[ "$wraith" == "false" ]]; then echo "$yellow -X option detected, computation stopped after variant detection." echo "Results (with no read coverage) are located here: "$kissprefix.fa echo -e -n "\t ending date=" date echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/ $reset" exit fi fi ####################################################################### #################### KISSREADS ####################### ####################################################################### T="$(date +%s)" echo -e "$yellow #############################################################" echo -e " #################### KISSREADS MODULE #######################" echo -e " #############################################################$reset" smallk=$k if (( $smallk>31 )) ; then smallk=31 fi i=5 #avoid modidy this (or increase this if memory needed by kissread is too high. Min 1. Large i (7-10) decreases memory and increases time). index_stride=$(($i+1)); size_seed=$(($smallk-$i)) # DON'T modify this. if [ ! -z "${read_sets_kissreads}" ]; then read_sets=${read_sets_kissreads} fi if [ $aav -eq 1 ]; then rmcmd="rm -f ${h5prefix}_cov.h5" echo $green${rmcmd}$cyan $rmcmd # erase this file so all predictions are coherent after kissreads fi kissreadsCmd="${kissreads2_bin} -predictions $kissprefix.fa -reads ${read_sets}_${kissprefix}_removemeplease -co ${kissprefix}_coherent -unco ${kissprefix}_uncoherent -k $k -size_seeds ${size_seed} -index_stride ${index_stride} -hamming $d $genotyping -coverage_file ${h5prefix}_cov.h5 $option_cores_gatb -verbose $verbose ${option_phase_variants}" echo $green $kissreadsCmd$cyan if [[ "$wraith" == "false" ]]; then $kissreadsCmd fi if [ $? -ne 0 ] then echo "$red there was a problem with kissreads2$reset": exit 1 fi echo $reset T="$(($(date +%s)-T))" # echo "Kissreads (mapping reads on bubbles) time in seconds: ${T}" ####################################################################### #################### SORT AND FORMAT RESULTS ######################### ####################################################################### if [[ "$wraith" == "false" ]]; then echo -e "$yellow ###############################################################" echo -e " #################### SORT AND FORMAT RESULTS #################" echo -e " ###############################################################$reset" fi if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_coherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_coherent.fa fi if [ $? -ne 0 ] then echo "$red there was a problem with the result sorting.$reset" exit 1 fi if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_uncoherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_uncoherent.fa fi if [ $? -ne 0 ] then echo "$red there was a problem with the result sorting$reset" exit 1 fi rm -f $kissprefix.fa ${kissprefix}_coherent ${kissprefix}_uncoherent rm -rf ${read_sets}_${kissprefix}_removemeplease ####################################################################### #################### DISCOSNP FINISHED ############################### ####################################################################### ####################################################################### #################### Deal with VCF ############################### ####################################################################### T="$(date +%s)" echo -e "$yellow ###############################################################" echo -e " #################### CREATE VCF #######################" echo -e " ############################################################### $reset" if [ -z "$genome" ]; then # NO reference genome use, vcf creator mode 1 vcfCreatorCmd="$EDIR/scripts/run_VCF_creator.sh -p ${kissprefix}_coherent.fa -o ${kissprefix}_coherent.vcf" echo $green$vcfCreatorCmd$cyan if [[ "$wraith" == "false" ]]; then $vcfCreatorCmd fi if [ $? -ne 0 ] then echo "$red there was a problem with VCF creation. See how to use the \"run_VCF_creator.sh\" alone.$reset" exit 1 fi else # A Reference genome is provided, vcf creator mode 2 vcfCreatorCmd="$EDIR/scripts/run_VCF_creator.sh $bwa_path_option -G $genome $bwa_path_option -p ${kissprefix}_coherent.fa -o ${kissprefix}_coherent.vcf -I $option_cores_post_analysis $e" echo $green$vcfCreatorCmd$cyan if [[ "$wraith" == "false" ]]; then $vcfCreatorCmd fi if [ $? -ne 0 ] then echo "$red there was a problem with VCF creation. See how to use the \"run_VCF_creator.sh\" alone.$reset" exit 1 fi fi echo $reset T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "$yellow Vcf creation time in seconds: ${T}" echo -e " ###############################################################" echo -e " #################### DISCOSNP++ FINISHED ######################" echo -e " ###############################################################" Ttot="$(($(date +%s)-Ttot))" echo "DiscoSnp++ total time in seconds: ${Ttot}" echo -e "################################################################################################################" echo -e " fasta of predicted variant is \""${kissprefix}_coherent.fa"\"" if [ -z "$genome" ]; then echo -e " Ghost VCF file (1-based) is \""${kissprefix}_coherent.vcf"\"" else echo -e " VCF file (1-based) is \""${kissprefix}_coherent.vcf"\"" echo -e " An IGV ready VCF file (sorted by position, only mapped variants, 0-based) is \""${kissprefix}_coherent_for_IGV.vcf"\"" fi echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/ - Forum: http://www.biostars.org/t/discoSnp/" echo -e "################################################################################################################$reset" fiDiscoSnp-2.6.2/run_discoSnp++_ML.sh000077500000000000000000000725321420021152700167710ustar00rootroot00000000000000#!/bin/bash #***************************************************************************** # discoSnp++: discovering polymorphism from raw unassembled NGS reads # A tool from the GATB (Genome Assembly Tool Box) # Copyright (C) 2014 INRIA # Authors: P.Peterlongo, E.Drezen # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #***************************************************************************** red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` cyan=`tput setaf 6` bold=`tput bold` reset=`tput sgr0` die() { printf '%s\n' "$1" >&2 exit 1 } function myrealpath { echo $(cd $(dirname $1); pwd)/$(basename $1); } option_cores_gatb="" option_cores_post_analysis="" Ttot="$(date +%s)" #### constant ##### max_C=2147483647 #$((2**31-1)) ########################################################### #################### DEFAULT VALUES ####################### ########################################################### version="2.3.X" read_sets="" # A file of file(s) read_sets_kissreads="" prefix="discoRes" # all intermediate and final files will be written will start with this prefix k=31 # size of kmers b=0 # smart branching approach: bubbles in which both paths are equaly branching are discarded, all others are accepted c=3 # minimal coverage C=$max_C # maximal coverage d=1 # estimated number of error per read (used by kissreads only) D=100 # maximal size of searched deletions max_ambigous_indel=20 P=3 # number of polymorphsim per bubble option_max_symmetrical_crossroads="" l="-l" extend="-t" x="" y="" output_coverage_option="" genotyping="-genotype" remove=1 verbose=1 stop_after_kissnp=0 e="" prefix_trash=`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''` #EDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) EDIR=$( python -c "import os.path; print(os.path.dirname(os.path.realpath(\"${BASH_SOURCE[0]}\")))" ) # as suggested by Philippe Bordron if [ -d "$EDIR/build/" ] ; then # VERSION SOURCE COMPILED read_file_names_bin=$EDIR/build/bin/read_file_names dbgh5_bin=$EDIR/build/ext/gatb-core/bin/dbgh5 kissnp2_bin=$EDIR/build/bin/kissnp2 kissreads2_bin=$EDIR/build/bin/kissreads2 create_coverage_h5_file_bin=$EDIR/build/bin/create_coverage_h5_file else # VERSION BINARY read_file_names_bin=$EDIR/bin/read_file_names dbgh5_bin=$EDIR/bin/dbgh5 kissnp2_bin=$EDIR/bin/kissnp2 kissreads2_bin=$EDIR/bin/kissreads2 create_coverage_h5_file_bin=$EDIR/bin/create_coverage_h5_file fi chmod +x $EDIR/scripts/*.sh $EDIR/run_discoSnpRad.sh 2>/dev/null # Usefull for binary distributions useref="" wraith="false" genome="" bwa_path_option="" option_phase_variants="" bwa_distance=4 dsk_build_dir="" ####################################################################### #################### END HEADER ####################### ####################################################################### function help { echo " ************" echo " *** HELP ***" echo " ************" echo "run_discoSnp++.sh, a pipelining kissnp2 and kissreads for calling SNPs and small indels from NGS reads without the need of a reference genome" echo "Version "$version echo "Usage: ./run_discoSnp++.sh -r read_file_of_files [OPTIONS]" echo -e "MANDATORY" echo -e "\t -r|--fof " echo -e "\t\t The input read files indicated in a file of file(s)" echo -e "\t\t Example: -r bank.fof with bank.fof containing the two lines \n\t\t\t data_sample/reads_sequence1.fasta\n\t\t\t data_sample/reads_sequence2.fasta.gz" echo -e "\t -f Absolute path to compiled dsk (directory containing compiled dsk and dsk2ascii)" echo -e "\nOPTIONS" echo -e "\t -k | --k_size value " echo -e "\t\t Set the length of used kmers. Must fit the compiled value." echo -e "\t\t Default=31" echo -e "\t -c | --min_coverage value " echo -e "\t\t Set the minimal coverage per read set: Used by kissnp2 (don't use kmers with lower coverage) and kissreads (read coherency threshold)." echo -e "\t\t This coverage can be automatically detected per read set (in this case use \"auto\" or specified per read set, see the documentation." echo -e "\t\t Default=3" echo -e "\t -C | --max_coverage value " echo -e "\t\t Set the maximal coverage for each read set: Used by kissnp2 (don't use kmers with higher coverage)." echo -e "\t\t Default=2^31-1" echo -e "\t -b | --branching value. " echo -e "\t\t 0: forbid variants for which any of the two paths is branching (high precision, lowers the recall in complex genomes)." echo -e "\t\t Default value" echo -e "\t\t 1: (smart branching) forbid SNPs for which the two paths are branching (e.g. the two paths can be created either with a 'A' or a 'C' at the same position" echo -e "\t\t2: No limitation on branching (lowers the precision, high recall)" echo -e "\t -s | --symmetrical value " echo -e "\t\t In -b 2 mode only: maximal number of symmetrical crossroads traversed while trying to close a bubble. Default: no limit" echo -e "\t -g | --graph" echo -e "\t\t Reuse a previously created graph (.h5 file) with same prefix and same k and c parameters (here, contrary to discoSnp++.sh, no graph file can be specified)." echo -e "\t -X\t Stop discoSnp++ right after variant calling - the output is only a fasta file with no coverage information." echo -e "\t -D | --deletion_max_size " echo -e "\t\t discoSnp++ will search for deletions of size from 1 to D included. Default=100" echo -e "\t -a | --ambiguity_max_size " echo -e "\t\t Maximal size of ambiguity of INDELs. INDELS whose ambiguity is higher than this value are not output [default '20']" echo -e "\t -P | --max_snp_per_bubble " echo -e "\t\t discoSnp++ will search up to P SNPs in a unique bubble. Default=3" echo -e "\t --fof_mapping " echo -e "\t\t If this option is used this fof is used when mapping back reads on the predicted variants instead of the original fof file provided by -r|--fof option" echo -e "\t -p | --prefix " echo -e "\t\t All out files will start with this prefix. Default=\"discoRes\"" echo -e "\t -l | --no_low_complexity" echo -e "\t\t Remove low complexity bubbles" echo -e "\t -T | --contigs" echo -e "\t\t Extend found polymorphisms with contigs (default: extend with unitigs)" echo -e "\t -d | --max_substitutions " echo -e "\t\t Set the number of authorized substitutions used while mapping reads on found SNPs (kissreads). Default=1" echo -e "\t -n | --no_genotype" echo -e "\t\t Do not compute the genotypes" echo -e "\t -u | --max_threads " echo -e "\t\t Max number of used threads. 0 means all threads" echo -e "\t\t default 0" echo -e "\nREFERENCE GENOME AND/OR VCF CREATION OPTIONS" echo -e "\t -G | --reference_genome " echo -e "\t\t Reference genome file (fasta, fastq, gzipped or nor). In absence of this file the VCF created by VCF_creator won't contain mapping related results." echo -e "\t -R" echo -e "\t\t Use the reference file also in the variant calling, not only for mapping results" echo -e "\t -B | --bwa_path " echo -e "\t\t bwa path. e.g. /home/me/my_programs/bwa-0.7.12/ (note that bwa must be pre-compiled)" echo -e "\t\t Optional unless option -G used and bwa is not in the binary path." echo -e "\t -e\t Map variant predictions on reference genome with their unitig or contig extensions." echo -e "\t\t Useless unless mapping on reference genome is required (option -G). " echo echo -e "\t -w\t Wraith mode: only show all discoSnp++ commands without running them" echo -e "\t -v <0 or 1>" echo -e "\t\t Verbose 0 (avoids progress output) or 1 (enables progress output) -- default=1." echo -e "\t -h | --help" echo -e "\t\t Prints this message and exist\n" echo "Any further question: read the readme file or contact us via the Biostar forum: https://www.biostars.org/t/discosnp/" } while :; do case $1 in -f) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option dsk_build_dir=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -A) option_phase_variants="-phasing" echo "Will phase variants during kissreads process - WARNING this option is too experimental and thus not described in the help message" echo "You can obtain clusters using script : \"script/from_phased_alleles_to_clusters.sh file_name_of_phased_alleles\" (the filename(s) is/are given during kissreads process" ;; -X) stop_after_kissnp=1 ;; -w) wraith="true" ;; -R) useref="true" output_coverage_option="-dont_output_first_coverage" ;; -a|--ambiguity_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then # checks that there exists a second value and its is not the start of the next option max_ambigous_indel=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -v) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then verbose=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -s|--symmetrical) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then option_max_symmetrical_crossroads="-max_symmetrical_crossroads "$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -T|--contigs) extend="-T" ;; -g|--graph) remove=0 ;; -n|--no_genotype) genotyping="" ;; -l|--no_low_complexity) l="" ;; -h|-\?|--help) help exit ;; -r|--fof) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then read_sets=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; --fof_mapping) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then read_sets_kissreads=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -b|--branching) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then b=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -p|--prefix) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then prefix=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -k | --k_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then k=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -P|--max_snp_per_bubble) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then P=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -c|--min_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then c=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -C|--max_coverage) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then C=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -d|--max_substitutions) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then d=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -D|--deletion_max_size) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then D=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; B|--bwa_path) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then bwa_path_option="-B "$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -x) x="-x" ##CHARLOTTE ;; -y) y="-x" ##CHARLOTTE ;; -G|--reference_genome) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then genome=$2 shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -e) e="-e" ;; -u|--max_threads) if [ "$2" ] && [ ${2:0:1} != "-" ] ; then option_cores_gatb="-nb-cores $2" option_cores_post_analysis="-t $2" shift else die 'ERROR: "'$1'" option requires a non-empty option argument.' fi ;; -?*) printf 'WARN: Unknown option (exit): %s\n' "$1" >&2 exit 1 ;; :) echo "${red}Option $1 requires an argument.${reset}" >&2 exit 1 ;; --) # End of all options. shift break ;; -?*) printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2 ;; *) # Default case: No more options, so break out of the loop. break esac shift done if [ ! -d "$dsk_build_dir" ]; then echo "${red}You must provide dsk bin direction (option -f)${reset}" help exit 1 fi if [ -z "$read_sets" ]; then echo "${red}You must provide at least one read set (-r|--fof)${reset}" help exit 1 fi ######### CHECK THE k PARITY ########## rest=$(( $k % 2 )) if [ $rest -eq 0 ] then echo "${red}k=$k is even number, to avoid palindromes, we set it to $(($k-1))${reset}" k=$(($k-1)) fi ####################################### c_filename=`echo ${c} | tr ',' '_'` if [ $C -ne $max_C ] then h5prefix=${prefix}_k_${k}_c_${c_filename}_C_${C} else h5prefix=${prefix}_k_${k}_c_${c_filename} fi kissprefix=${h5prefix}_D_${D}_P_${P}_b_${b} readsFilesDump=${prefix}_read_files_correspondance.txt mapped_readsFilesDump=${prefix}_mapped_read_files_correspondance.txt ####################################### c_dbgh5=$c rm -f ${read_sets}_${kissprefix}_removemeplease if [[ "$useref" == "true" ]]; then if [ -z "$genome" ]; then echo "${red}You can't use option -R without providing a reference genome (-G)${reset}" help exit 1 fi myrealpath $genome > ${read_sets}_${kissprefix}_removemeplease c_dbgh5="1,"$c fi cat $read_sets >> ${read_sets}_${kissprefix}_removemeplease ####################################################################### #################### OPTIONS SUMMARY ####################### ####################################################################### if [[ "$wraith" == "false" ]]; then echo -e "${yellow}Running discoSnp++ "$version", in directory "$EDIR" with following parameters:" echo -e "\t read_sets="$read_sets echo -e "\t prefix="$h5prefix echo -e "\t c="$c echo -e "\t C="$C echo -e "\t k="$k echo -e "\t b="$b echo -e "\t d="$d echo -e "\t D="$D echo -e "\t s="$option_max_symmetrical_crossroads echo -e "\t P="$P if [ ! -z "${read_sets_kissreads}" ]; then echo -e "\t fof_mapping read_file_of_files="${read_sets_kissreads} fi echo -e "\t p="$prefix echo -e "\t G="$genome echo -e "\t e="$e echo -e -n "\t starting date=" date echo "${reset}" fi ####################################################################### #################### END OPTIONS SUMMARY ####################### ####################################################################### ############################################################# #################### DUMP READ FILES ####################### ############################################################# ${read_file_names_bin} -in $read_sets > $readsFilesDump if [ ! -z "${read_sets_kissreads}" ]; then ${read_file_names_bin} -in ${read_sets_kissreads} > $mapped_readsFilesDump fi ############################################################ #################### GRAPH CREATION ####################### ############################################################ if [ $remove -eq 1 ]; then rm -f $h5prefix.h5 fi if [ ! -e $h5prefix.h5 ]; then T="$(date +%s)" echo -e "${yellow}############################################################" echo -e "#################### GRAPH CREATION #######################" echo -e "############################################################${reset}" i=0 # cleaning rmCmd="rm -f *trashme_[0-9]*.fa.gz" echo "${green}"${rmCmd}"${cyan}" ${rmCmd} echo ${reset} # input_h5s="" IFS=',' read -r -a array <<< "${c_dbgh5}" # split the cmin entry (comma separated) ab_index_size="${#array[@]}" for line in `cat ${read_sets}_${kissprefix}_removemeplease`; do min_abundance="${array[$i]}" if [ $i -ge ${ab_index_size} ] then min_abundance="${array[${ab_index_size}-1]}"; fi i=`expr $i + 1` dskCmd="${dsk_build_dir}/dsk -file ${line} -abundance-min ${min_abundance} -abundance-max 2147483647 -solidity-kind sum -kmer-size $k -out ${prefix_trash}_trashme_${i}.h5" toaskiiCmd="${dsk_build_dir}/dsk2ascii -file ${prefix_trash}_trashme_${i}.h5 -out /dev/null/dummy -fasta -c" dump_cov_cmd="${create_coverage_h5_file_bin} -in ${prefix_trash}_trashme_${i}.h5 -coverage_file ${prefix_trash}_trashme_${i}_cov_only.h5" rm_dsk_h5_file_cmd="rm -f ${prefix_trash}_trashme_${i}.h5" echo "${green}"${dskCmd} ${cyan}" && "${green} ${toaskiiCmd} " | gzip -1 > ${prefix_trash}_trashme_${i}.fa.gz && "${dump_cov_cmd}" && "${rm_dsk_h5_file_cmd}"&${cyan} " if [[ "$wraith" == "false" ]]; then ${dskCmd} && ${toaskiiCmd} | gzip -1> ${prefix_trash}_trashme_${i}.fa.gz && ${dump_cov_cmd} && ${rm_dsk_h5_file_cmd} & fi # echo ${reset} if [ $? -ne 0 ] then echo "${red}there was a problem with dsk${reset}" exit 1 fi input_h5s=${input_h5s}${prefix_trash}_trashme_${i}_cov_only.h5, # enables to run up to 10 jobs in parallel while [ 1 ] do a=`jobs -r|wc -l` # number of previous jobs stilil running if [ $a -lt 10 ] then break fi sleep 10 done done # wait for the last jobs to finish for job in `jobs -p` do wait $job || let "FAIL+=1" done rmCmd="rm -f ${prefix_trash}_trashme_allsolid.fa.gz" for file in `ls ${prefix_trash}_trashme_[0-9]*.fa.gz`; do cat_cmd="cat $file >> ${prefix_trash}_trashme_allsolid.fa.gz && rm -f $file" echo "${green}"${cat_cmd}"${cyan}" if [[ "$wraith" == "false" ]]; then cat $file >> ${prefix_trash}_trashme_allsolid.fa.gz && rm -f $file fi if [ $? -ne 0 ] then echo "${red}there was a problem concatenation of single kmer fasta files${reset}" exit 1 fi done # echo "${green}"${rmCmd}"${cyan}" # ${rmCmd} # catCmd="cat ${prefix_trash}_trashme_[0-9]*.fa.gz" #> allsolid.fa.gz # echo "${green}"${catCmd} "> ${prefix_trash}_trashme_allsolid.fa.gz${cyan}" # if [[ "$wraith" == "false" ]]; then # ${catCmd} > ${prefix_trash}_trashme_allsolid.fa.gz # fi # if [ $? -ne 0 ] # then # echo "${red}there was a problem concatenation of single kmer fasta files${reset}" # exit 1 # fi echo "${green}ls ${prefix_trash}_trashme_allsolid.fa.gz > ${prefix_trash}_trashme_allsolid.txt${cyan}" ls ${prefix_trash}_trashme_allsolid.fa.gz > ${prefix_trash}_trashme_allsolid.txt graphCmd="${dbgh5_bin} -in ${prefix_trash}_trashme_allsolid.txt -out $h5prefix -kmer-size $k -abundance-min 1 -abundance-max $C -solidity-kind sum ${option_cores_gatb} -verbose $verbose -skip-bcalm -skip-bglue -no-mphf" echo "${green}"${graphCmd}"${cyan}" if [[ "$wraith" == "false" ]]; then ${graphCmd} fi echo "${reset}" if [ $? -ne 0 ] then echo "there was a problem with graph construction" exit 1 fi ##################################################################### #################### COVERAGE FILE CREATION ####################### ##################################################################### ## create the string trashme_1.h5,trashme_2.h5,...,trashme_n.h5 string create_cov_file_cmd="${create_coverage_h5_file_bin} -in ${input_h5s} -coverage_file ${h5prefix}_cov.h5" echo "${green}"${create_cov_file_cmd}"${cyan}" if [[ "$wraith" == "false" ]]; then ${create_cov_file_cmd} fi echo ${reset} if [ $? -ne 0 ] then echo "${red}there was a problem with graph construction${reset}" exit 1 fi cleanCmd="rm -rf ${prefix_trash}_trashme_*" echo ${green}${cleanCmd}${reset} if [[ "$wraith" == "false" ]]; then ${cleanCmd} fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}Graph creation time in seconds: ${T}${reset}" fi else if [[ "$wraith" == "false" ]]; then echo -e "${yellow}File $h5prefix.h5 exists. We use it as input graph${reset}" fi fi ###################################################### #################### KISSNP2 ####################### ###################################################### T="$(date +%s)" echo -e "${yellow}############################################################" echo -e "#################### KISSNP2 MODULE #######################" echo -e "############################################################${reset}" kissnp2Cmd="${kissnp2_bin} -in $h5prefix.h5 -out $kissprefix -b $b $l $x -P $P -D $D $extend $option_cores_gatb $output_coverage_option -coverage_file ${prefix_trash}_trashme_fake_cov.h5 -max_ambigous_indel ${max_ambigous_indel} ${option_max_symmetrical_crossroads} -verbose $verbose" echo ${green}${kissnp2Cmd}${cyan} if [[ "$wraith" == "false" ]]; then ${kissnp2Cmd} fi echo ${reset} if [ $? -ne 0 ] then echo "${red}there was a problem with kissnp2${reset}" exit 1 fi rm -f ${prefix_trash}_trashme_allsolid.txt T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}Bubble detection time in seconds: ${T}${reset}" fi if [ ! -f $kissprefix.fa ] then if [[ "$wraith" == "false" ]]; then echo "${yellow}No polymorphism predicted by discoSnp++" echo -e -n "\t ending date=" date echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/${reset}" exit fi fi if [ $stop_after_kissnp -eq 1 ]; then if [[ "$wraith" == "false" ]]; then echo "${yellow}-X option detected, computation stopped after variant detection." echo "Results (with no read coverage) are located here: "$kissprefix.fa echo -e -n "\t ending date=" date echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/${reset}" exit fi fi ####################################################################### #################### KISSREADS ####################### ####################################################################### T="$(date +%s)" if [[ "$wraith" == "false" ]]; then echo -e "${yellow}#############################################################" echo -e "#################### KISSREADS MODULE #######################" echo -e "#############################################################${reset}" fi smallk=$k if (( $smallk>31 )) ; then smallk=31 fi i=5 #avoid modidy this (or increase this if memory needed by kissread is too high. Min 1. Large i (7-10) decreases memory and increases time). index_stride=$(($i+1)); size_seed=$(($smallk-$i)) # DON'T modify this. if [ ! -z "${read_sets_kissreads}" ]; then read_sets=${read_sets_kissreads} fi kissreadsCmd="${kissreads2_bin} -predictions $kissprefix.fa -reads $read_sets -co ${kissprefix}_coherent -unco ${kissprefix}_uncoherent -k $k -size_seeds ${size_seed} -index_stride ${index_stride} -hamming $d $genotyping -coverage_file ${h5prefix}_cov.h5 $option_cores_gatb -verbose $verbose $y ${option_phase_variants}" echo ${green}$kissreadsCmd${cyan} if [[ "$wraith" == "false" ]]; then $kissreadsCmd fi if [ $? -ne 0 ] then echo "${red}there was a problem with kissreads2${reset}": exit 1 fi T="$(($(date +%s)-T))" echo "${yellow}Kissreads (mapping reads on bubbles) time in seconds: ${T}${reset}" ####################################################################### #################### SORT AND FORMAT RESULTS ######################### ####################################################################### echo -e "${yellow}###############################################################" echo -e "#################### SORT AND FORMAT RESULTS #################" echo -e "###############################################################${reset}" if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_coherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_coherent.fa fi if [ $? -ne 0 ] then echo "${red}there was a problem with the result sorting.${reset}" exit 1 fi if [[ "$wraith" == "false" ]]; then sort -rg ${kissprefix}_uncoherent | cut -d " " -f 2 | tr ';' '\n' > ${kissprefix}_uncoherent.fa fi if [ $? -ne 0 ] then echo "${red}there was a problem with the result sorting.${reset}" exit 1 fi rm -f $kissprefix.fa ${kissprefix}_coherent ${kissprefix}_uncoherent rm -rf ${read_sets}_${kissprefix}_removemeplease rm -rf ${prefix_trash}_trashme ####################################################################### #################### DISCOSNP FINISHED ############################### ####################################################################### ####################################################################### #################### Deal with VCF ############################### ####################################################################### T="$(date +%s)" echo -e "${yellow}###############################################################" echo -e "#################### CREATE VCF #######################" echo -e "###############################################################${reset}" if [ -z "$genome" ]; then # NO reference genome use, vcf creator mode 1 vcfCreatorCmd="$EDIR/scripts/run_VCF_creator.sh -p ${kissprefix}_coherent.fa -o ${kissprefix}_coherent.vcf" echo ${green}$vcfCreatorCmd${cyan} if [[ "$wraith" == "false" ]]; then $vcfCreatorCmd fi echo ${reset} if [ $? -ne 0 ] then echo "${red}there was a problem with VCF creation. See how to use the \"run_VCF_creator.sh\" alone.${reset}" exit 1 fi else # A Reference genome is provided, vcf creator mode 2 vcfCreatorCmd="$EDIR/scripts/run_VCF_creator.sh $bwa_path_option -G $genome $bwa_path_option -p ${kissprefix}_coherent.fa -o ${kissprefix}_coherent.vcf -I $option_cores_post_analysis $e" echo ${green}$vcfCreatorCmd${cyan} if [[ "$wraith" == "false" ]]; then $vcfCreatorCmd fi if [ $? -ne 0 ] then echo "${red}there was a problem with VCF creation. See how to use the \"run_VCF_creator.sh\" alone.${reset}" exit 1 fi fi T="$(($(date +%s)-T))" if [[ "$wraith" == "false" ]]; then echo "${yellow}Vcf creation time in seconds: ${T}" echo -e "###############################################################" echo -e "#################### DISCOSNP++ FINISHED ######################" echo -e "###############################################################" Ttot="$(($(date +%s)-Ttot))" echo "DiscoSnp++ total time in seconds: ${Ttot}" echo -e "################################################################################################################" echo -e " fasta of predicted variant is \""${kissprefix}_coherent.fa"\"" if [ -z "$genome" ]; then echo -e " Ghost VCF file (1-based) is \""${kissprefix}_coherent.vcf"\"" else echo -e " VCF file (1-based) is \""${kissprefix}_coherent.vcf"\"" echo -e " An IGV ready VCF file (sorted by position, only mapped variants, 0-based) is \""${kissprefix}_coherent_for_IGV.vcf"\"" fi echo -e " Thanks for using discoSnp++ - http://colibread.inria.fr/discoSnp/ - Forum: http://www.biostars.org/t/discoSnp/" echo -e "################################################################################################################${reset}" fiDiscoSnp-2.6.2/scripts/000077500000000000000000000000001420021152700147245ustar00rootroot00000000000000DiscoSnp-2.6.2/scripts/ClassVCF_creator.py000077500000000000000000003062751420021152700204410ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- ############################################### #Dresscode : class : uppercase # function : begins with a capital # variable : words separated by capital # object : words separated by underscore from functionObjectVCF_creator import * import re import os import sys import subprocess import re import time # # CheckStrandAndReverseNucleotide(self,nucleo):"""Reverse the alt nucleotide if it is needed""" # char2char = dict() # for fast reverse complement computations # char2char['A'] = 'T' # char2char['T'] = 'A' # char2char['C'] = 'G' # char2char['G'] = 'C' # char2char['a'] = 't' # char2char['t'] = 'a' # char2char['c'] = 'g' # char2char['g'] = 'c' # def ReverseComplement(nucleotide): # """Take a sequence or a nucleotide and reverse it""" # return ''.join(char2char[c] for c in nucleotide)[::-1] rev = str.maketrans("acgtACGT", "tgcaTGCA") def ReverseComplement(seq: str) -> str: return seq.translate(rev)[::-1] #Class and methods_________________________________________________________________________________________________________ #INDEX_____________________________________________________________________________________________________________ #________________class VARIANT(): corresponds to a discosnp bubble with information common to both paths________________ # ______ #__/ \__ # \______/ # => Methods # FillInformationFromHeader(self,VCFObject):"""Parsing of the DiscoSnp++ header""" # CheckContigUnitig(self,unitig,contig):"""Checks if there is an extension in the form of contig or unitig to take into account in the mapping position""" # RetrievePolymorphismFromHeader(self):'''Gets from the dicoAllele all the positions, and the nucleotides''' # MismatchChecker(self):"""In case of divergent main position (case snp whose two paths are mapped ) to define the reference = > check the number of mismatch # ( If the number of mismatch is the same in both cases it is the lower lexicographical SNP which is selected for reference . # The Boolean allows to know the reference SNP ) """ # RetrieveGenotypes(self,nbGeno,VCFObject):"""Gets the genotype, the coverage and the likelihood by sample and print it in the correspondand fields. The genotype is determined by DiscoSnp++ (which considered the upper path as reference). If the “REF” corresponds the upper path, the genotype in the VCF is identical to the genotype in DiscoSnp++, else it's the opposite ( 1/1 becomes 0/0 and so on).""" # FillVCF(self,VCFfile,nbGeno,table,VCFObject): """Take all necessary input variables to fill the vcf; Fills the fields of the table which will be printed in the vcf ; return the table""" # WhichPathIsTheRef(self,VCFObject): """Finds which path is identical to the reference genome and defines it as the ref : specific method for each type of variant""" # RetrieveMappingPositionCouple(self): """Defines the mapping position for the couple of variant""" # CheckCoupleVariantID(self):"""Test if the couple of paths has the same ID""" #________________class PATH(): """corresponds to one path"""________________ # RetrieveSeq(self,seq):"""Getter for sequence""" # RetrieveDicoMappingPosition(self):"""Retrieves for each path alignment information in a list ; retrieves a dictionary with all the positions of a path and the number of associated mismatch""" # CheckBitwiseFlag(self):"""Checks if the BitwiseFlag contains the tested value such as : read reverse strand, read unmmaped and so on.""" # CigarcodeChecker(self):"""Checks in the cigarcode of the samfile if there is a shift in the alignment between the path and the reference""" # ReferenceChecker(self,shift,posCentraleRef,VCFObject):"""Function which allows to get the MD tag parsing; checks if path nucleotide is identical to the reference nucleotide""" # RetrieveCoverage(self):"""Get the coverage by path in the discosnp++ header""" # GetTag(self):"""Gets the number of mismatch in the samline""" # CheckPosVariantFromRef(self,VCFObject): """Checks if the variant is identical to the reference or not ; defines the nucleotide on the reference""" #________________class SNP(VARIANT):________________ # WhichPathIsTheRef(self,VCFObject):"""""" #________________class INDEL(VARIANT):________________ # RetrievePolymorphismFromHeader(self):"""""" # WhichPathIsTheRef(self,VCFObject):"""""" # RetrieveMappingPositionCouple(self):"""""" #________________class SNPSCLOSE(VARIANT):________________ # RetrieveDicoClose(self,dicoCloseUp,dicoCloseLow): # WhichPathIsTheRef(self,VCFObject): # FillVCF(self,VCFfile,nbGeno,table,VCFObject): #________________class VCFFIELD():________________ # PrintOneLine(self,table,VCF): def shift_from_cigar_code(cigarcode, pospol): # print ("shift",cigarcode,pospol) parsingCigarCode=re.findall('(\d+|[A-Za-z])',cigarcode) #ParsingCigarCode=['2', 'S', '3', 'M', '1', 'I', '25', 'M'] # print (parsingCigarCode) shift=0 pos=0 i=1 while i=pospol: # print("return", str(pospol+shift)) return pospol+shift#takes into account the shift to add the after the mapping position and the variant position in the sequence i+=2 # print("return", str(pospol+shift)) return pospol+shift#takes into account the shift to add the after the mapping position and the variant position in the sequence class VARIANT(): """Object corresponding to a discosnp++ bubble""" def __init__(self,line1,line2): self.upper_path = PATH(line1)#line in the file corresponding to the upper path self.lower_path = PATH(line2)#line in the file corresponding to the lower path self.variantID = "" #ID of discoSnp++ self.discoName = "" #name of the variant : SNP_higher_path_99 self.len_unitig_left = 0#length of the unitig left self.len_unitig_right = 0#length of the unitig right self.len_contig_left = 0#length of the contig left self.len_contig_right = 0#length of the contig right self.rank = ""#rank calculated by discosnp++ self.nb_pol = ""# number of polymorphism in the disco path self.dicoGeno = {}#dictionnary with the information of the genotype dicoGeno[listgeno[0]] = [listgeno[1],listlikelihood] self.dicoAllele = {}#dictionnary of all the information from the header of discosnp++ : depending on the variant self.mappingPositionCouple = 0#mapping position of the bubble after correction self.dicoIndex = {}#dictionnary with all the index of every items in discoSnp++ header #--------------------------------------------------------------------------------------------------------------------------- ##Example :SNP_higher_path_99|P_1:30_A/C|high|nb_pol_1|left_unitig_length_129|right_unitig_length_901|C1_0|C2_30|G1_1/1:744,116,6|G2_0/0:6,95,604|rank_1.00000 #--------------------------------------------------------------------------------------------------------------------------- def FillInformationFromHeader(self,VCFObject): """Parsing of the DiscoSnp++ header. Gets unitig, contig, rank, genotypes""" headerVariantUp = self.upper_path.listSam[0]#header of the upper path # headerVariantLow= self.lower_path.listSam[0]#header of the lower path discoList=headerVariantUp.split('|')#splitting the header of discosnp++ into a list self.discoName=discoList[0]#fills the attribut discoName of the variant object # print discoList self.variantID = self.discoName.split("_")[-1]#Gets the variantID ex:56468 if self.discoName.startswith("SNP"): VCFObject.variantType="SNP" else: VCFObject.variantType="INDEL" # VCFObject.variantType = self.discoName.split("_")[0]#fills the VCF object with the variant type listgeno=[]#splitted informations by genotype contained in the header of discoSnp++ #Get dicoAllele P_1:30_A/G => {'P_1': ['30', 'A', 'G']} pos=discoList[self.dicoIndex["P_"]].split(',') if VCFObject.variantType=="SNP":#Specific dictionary dicoAllele in case of simple snp for item in pos: listP_=item.split(":") self.dicoAllele[listP_[0]]=[(listP_[1].split("_")[0]),(listP_[1].split("_")[1].split("/")[0]),(listP_[1].split("_")[1].split("/")[1])]#{'P_1': ['30', 'A', 'G']} elif VCFObject.variantType=="INDEL":#INDEL case : P_1:30_3_2 => {'P_1': ['30', '3', '2']} specific to the INDEL for item in pos: listP_=item.split(":") self.dicoAllele[listP_[0]]=[(listP_[1].split("_")[0]),(listP_[1].split("_")[1]),(listP_[1].split("_")[2])]# {'P_1': ['30', '3', '2']} # for item in pos: # if VCFObject.variantType=="SNP":#Specific dictionary dicoAllele in case of simple snp # # if ":" in item: # listP_=item.split(":") # self.dicoAllele[listP_[0]]=[(listP_[1].split("_")[0]),(listP_[1].split("_")[1].split("/")[0]),(listP_[1].split("_")[1].split("/")[1])]#{'P_1': ['30', 'A', 'G']} # elif VCFObject.variantType=="INDEL":#INDEL case : P_1:30_3_2 => {'P_1': ['30', '3', '2']} specific to the INDEL # listP_=item.split(":") # self.dicoAllele[listP_[0]]=[(listP_[1].split("_")[0]),(listP_[1].split("_")[1]),(listP_[1].split("_")[2])]# {'P_1': ['30', '3', '2']} #Get unitig if "unitig" in self.dicoIndex and "unitig" in headerVariantUp: self.len_unitig_left=int(discoList[self.dicoIndex["unitig"][0]].split("_")[3]) self.len_unitig_right=int(discoList[self.dicoIndex["unitig"][1]].split("_")[3]) #Get contig if "contig" in self.dicoIndex and "contig" in headerVariantUp: self.len_contig_left=int(discoList[self.dicoIndex["contig"][0]].split("_")[3]) self.len_contig_right=int(discoList[self.dicoIndex["contig"][1]].split("_")[3]) #Get rank if "rank" in self.dicoIndex and "rank" in headerVariantUp: self.rank=discoList[self.dicoIndex["rank"]].split('_')[1] #Get nb_pol self.nb_pol=int(discoList[self.dicoIndex["nb_pol"]].split('_')[2]) if "G" in self.dicoIndex and "G1" in headerVariantUp: for i in self.dicoIndex["G"]: listgeno=discoList[i].replace("_",":").split(":") if len(listgeno)>2: self.dicoGeno[listgeno[0]]=[listgeno[1],(listgeno[2].split(','))] else: self.dicoGeno[listgeno[0]]=[listgeno[1]] #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def RetrievePolymorphismFromHeader(self): '''Gets from the dicoAllele all the positions, and the nucleotides for each variant ''' for key,(posD,ntUp,ntLow) in self.dicoAllele.items(): #Goes through the dictionary of parsed header self.upper_path.listPosForward.append(int(posD)+1) self.lower_path.listPosForward.append(int(posD)+1) self.upper_path.listPosReverse.append(len(self.upper_path.seq)-int(posD)) self.lower_path.listPosReverse.append(len(self.upper_path.seq)-int(posD)) self.upper_path.listNucleotideForward.append(ntUp) self.lower_path.listNucleotideForward.append(ntLow) self.upper_path.listNucleotideReverse.append(ReverseComplement(ntUp)) self.lower_path.listNucleotideReverse.append(ReverseComplement(ntLow)) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def MismatchChecker(self): """In case of divergent main position (case snp whose two paths are mapped ) to define the reference = > check the number of mismatch ( If the number of mismatch is the same in both cases it is the lower lexicographical SNP which is selected for reference . The Boolean allows to know the reference SNP : It fills boolRef ) """ nmUp=None nmLow=None #Two paths mapped if self.upper_path.mappingPosition>0 and self.lower_path.mappingPosition>0: #Checks if both paths are mapped nmUp=int(self.upper_path.dicoMappingPos[self.upper_path.mappingPosition][0]) #Distance with the reference for the snpUp nmLow=int(self.lower_path.dicoMappingPos[self.lower_path.mappingPosition][0]) #Distance with the reference for the snpLow # Pierre 25 06 2021: BUG here in case the two paths are not mapped in the same orientation. if nmUpnmLow : #Checks if the lower path has a distance with the reference smaller than the upper path self.lower_path.boolRef=True self.upper_path.boolRef=False self.upper_path.nucleoRef = self.lower_path.nucleoRef elif nmUp==nmLow: #Checks if both path have the same number of difference if self.discoName.split("_")[0]!="INDEL": #In case of simple snp if self.upper_path.nucleo self.lower_path.nucleo: #Checks the lexicographical order self.lower_path.boolRef=True self.upper_path.boolRef=False self.upper_path.nucleoRef = self.lower_path.nucleoRef else : #If none of the alleles is lexicographically less : checks the mapping position and keeps the lefmost position if self.upper_path.mappingPosition0 and \ self.lower_path.mappingPosition>0) \ and self.upper_path.mappingPosition != self.lower_path.mappingPosition): self.MismatchChecker() return if self.upper_path.boolRef == self.lower_path.boolRef: self.MismatchChecker() return #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def RetrieveMappingPositionCouple(self): #Validation SNP second part (specific method for close snps) """Defines the mapping position for the couple of variant by checking boolRef""" #for INDEL and simple snp if self.upper_path.boolRef==True: self.mappingPositionCouple = self.upper_path.mappingPosition+int(self.upper_path.correctedPos[0])+int(self.mappingPositionCouple)-1 else: self.mappingPositionCouple = self.lower_path.mappingPosition+int(self.lower_path.correctedPos[0])+int(self.mappingPositionCouple)-1 #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- # def CheckStrandAndReverseNucleotideNONOPTIMIZED(self,nucleo): # """Reverse the alt nucleotide if it is needed""" # if self.upper_path.boolRef==True:#Checks if the upper path is the reference # if self.upper_path.boolReverse= = self.lower_path.boolReverse :#if the mapping strand is the same on both path => returns the nucleotide # return(nucleo) # if self.upper_path.boolReverse=="1" and self.lower_path.boolReverse==".": # return (nucleo) # if self.upper_path.boolReverse! = self.lower_path.boolReverse:#if the mapping strand is different on both path => returns the reverse nuclotide # return (ReverseComplement(nucleo)) # elif self.lower_path.boolRef==True:#Checks if the lower path is the reference # if self.upper_path.boolReverse= = self.lower_path.boolReverse or (self.lower_path.boolReverse==1 and self.upper_path.boolReverse=="."):#if the mapping strand is the same on both path => returns the nucleotide # return (nucleo) # if self.lower_path.boolReverse=="1" and self.upper_path.boolReverse==".": # return (nucleo) # if self.upper_path.boolReverse! = self.lower_path.boolReverse:#if the mapping strand is different on both path => returns the reverse nucleotide # return (ReverseComplement(nucleo)) # else : # return (nucleo) # #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def CheckStrandAndReverseNucleotide(self,nucleo): """Reverse the alt nucleotide if it is needed""" if self.upper_path.boolReverse != self.lower_path.boolReverse:# if the mapping strand is different on both path => returns the reverse nuclotide if (str(self.upper_path.boolReverse) == "1" and self.lower_path.boolReverse==".") or (self.upper_path.boolReverse=="." and str(self.lower_path.boolReverse)=="1"): return nucleo # Case in which one of the two variants matched with a 2 or more indel, thus considered as non mapped. June 3017 return ReverseComplement(nucleo) else : return nucleo #--------------------------------------------------------------------------------------------------------------------------- #Example of supplementary alignment #INDEL_higher_path_17964|P_1:30_10_8|low|nb_pol_1|left_unitig_length_346|right_unitig_length_815|C1_12|C2_1|G1_0/1:321,17,162|G2_1/1:848,120,10|rank_0.46189 0 gi|224384768|gb|CM000663.1| 191102952 60 52M * 0 0 AAGAAAAAAGAAATAAAAAAAGAAAAAAAAACGAAATAGCCAGAAGGAATGA * NM:i:2 MD:Z:1G9C40 AS:i:45 XS:i:23 #INDEL_lower_path_17964|P_1:30_10_8|low|nb_pol_1|left_unitig_length_346|right_unitig_length_815|C1_20|C2_43|G1_0/1:321,17,162|G2_1/1:848,120,10|rank_0.46189 0 gi|224384768|gb|CM000663.1| 191102966 123S8M1I30M * 0 0 AAGAAAAAAGAAATAAAAAAAGAAAAAAAAGAAAAAAAAAACGAAATAGCCAGAAGGAATGA * NM:i:1 MD:Z:38 AS:i:31 XS:i:29 SA:Z:gi|224384768|gb|CM000663.1|,3668552,-,24S29M1D9M,1,2; #INDEL_lower_path_17964|P_1:30_10_8|low|nb_pol_1|left_unitig_length_346|right_unitig_length_815|C1_20|C2_43|G1_0/1:321,17,162|G2_1/1:848,120,10|rank_0.46189 2064 gi|224384768|gb|CM000663.1| 3668552 1 24H29M1D9M * 0 0 TTTTTTTCTTTTTTTTCTTTTTTTATTTCTTTTTTCTT * NM:i:2 MD:Z:12C16^T9 AS:i:30 XS:i:26 SA:Z:gi|224384768|gb|CM000663.1|,191102966,+,23S8M1I30M,1,1; XA:Z:gi|224384768|gb|CM000663.1|,-197957308,27S26M9S,0; #--------------------------------------------------------------------------------------------------------------------------- def CheckCoupleVariantID(self): """Test if the couple of paths has the same ID""" IDVariantUp = self.upper_path.listSam[0].split("_")[3] IDVariantLow= self.lower_path.listSam[0].split("_")[3] bitwiseFlag=int(self.upper_path.listSam[1]) if IDVariantUp != IDVariantLow: if bitwiseFlag >0: #& 2048 : #Checks if it's a supplementary alignment print("Supplementary alignment:") print(self.upper_path.listSam) return (2) else : print("WARNING two consecutive lines do not store the same variant id: ") print(self.upper_path.listSam) print(self.upper_path.listSam[1]) print(self.lower_path.listSam) return (2) else: return (0) ############################################################################################# ############################################################################################# class PATH(): """corresponds to one path of a discoSnp prediction""" def __init__(self,line): self.listCoverage=[] #list of all the coverage by sample for the path self.dicoMappingPos={} #dictionnary with all the mapping positions associated with their number of mismatches with the reference self.listNucleotideReverse=[] #list of all the variant (snp) of the path on the reverse strand self.listNucleotideForward=[] #list of all the variant (snp) of the path on the forward strand self.boolReverse=None #Boolean to know if the strand is reverse(-1) or forward(1) self.posMut=None #MD tag of the samfile "MD:Z:5A10A0A25G17" => 5A10A0A25G17 self.cigarcode=None #cigarcode of the samfile "61M" self.boolRef=None #Boolean to know if the path is identical to the reference self.nucleoRef=None #Nucleotide corresponding to the variant on the reference self.nucleo=None #nucleotide corresponding of the variant on the path self.listPosVariantOnPathToKeep=[] #list of the positions of all the variant on the in case of Reverse or Forward mapped path self.listPosReverse=[] #mapping position(s) of the variant on the path (if it is mapped on the reverse strand) self.listPosForward=[] #mapping position(s) of the variant on the path (if it is mapped on the forward strand) self.correctedPos=0 #list or position of the mapping variant by taking into account the shift with the reference self.listFQQuality=[] #string of all the quality scores of every variant if ">" not in line: # Case of samfile self.listSam=line.rstrip('\r').rstrip('\n').split('\t') self.discoName = self.listSam[0] self.seq = self.listSam[9] #gets the sequence of the path self.mappingPosition=abs(int(self.listSam[3])) #mapping position of the path self.RetrieveDicoMappingPosition() self.CheckBitwiseFlag() else: #Mode ghost fastafile line=line.strip('>').split("\n") line.pop() self.listSam=line #gets the sequence of the path self.discoName = self.listSam[0] self.seq="" self.mappingPosition=0 #mapping position of the path self.boolReverse="." #We need to define the absence of strand def RetrieveXA(self,VCFObject): localXA="" for position,(_,cigarcode) in self.dicoMappingPos.items(): if cigarcode!="": chromosome = '_'.join(position.split('_')[:-1]) mapping_position = int(position.split('_')[-1]) shifted_mapping_position = shift_from_cigar_code(cigarcode,abs(mapping_position)+self.listPosVariantOnPathToKeep[0]-1) localXA+=chromosome+'_'+str(shifted_mapping_position)+"," localXA=localXA.rstrip(',') VCFObject.XA = localXA #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def RetrieveSeq(self,seq): """Getter for sequence: fills path object""" self.seq=seq def RetrieveDicoMappingPosition(self): """Retrieves for each path alignment information in a list ; retrieves a dictionary with all the positions of a path and the number of associated mismatch""" variant = self.listSam listXA = None strXA = None alternative_positions = None nbMismatch = None variant_position = abs(int(variant[3])) variant_chromosome = variant[2] #Error list with mapping positions very close to the first position given by bwa # listerreur=set([(int(variant[3])-1),(int(variant[3])+1),(int(variant[3])+2),(int(variant[3])+3),(int(variant[3])-3),(int(variant[3])-2),int(variant[3])]) #Creation of a dict with mapping position associated with number of mismatch # XA cannot occur in the 11 mandatory fields: QNAME FLAG RNAM POS MAPQ CIGAR RNEXT PNEXT TLEN SEQ QUAL if 'XA:Z' in ''.join(variant[11:]): # XA: tag for multiple mapping : Checks if the upper path is multiple mapped : XA Alternative hits; format: (chr,pos,CIGAR,NM;)* for item in variant[11:]: if "XA:Z" in item: #Parsing XA tag listXA=item.split(":")[2].split(';') strXA = ','.join(listXA) # TODO: useless (?) listXA = strXA.split(',') # TODO: useless (?) listXA.pop() alternative_positions = listXA #position=[chrom1,pos1,cigarcode1,number of mismatch1 , chrom2,pos2,cigarcode2,number of mismatch2,...]. pos_i may be negative, in case of revcomp mapping. self.XA = item break #no need to search for XA in other fields i=1 while i < len(alternative_positions): #Runs through the list 4 by 4 to get all the positions if alternative_positions[i-1]==variant_chromosome and\ abs(int(alternative_positions[i])) > variant_position-4 and\ abs(int(alternative_positions[i])) < variant_position+4: i+=4 continue #Checks if the position is not too close to the main one self.dicoMappingPos[alternative_positions[i-1]+"_"+alternative_positions[i]]=[int(alternative_positions[i+2]), alternative_positions[i+1]]#the position is associated to the number of mismatch in a dictionary i+=4 if variant_position>0:#adds the main mapping position to the dictionary of all mapping positions posMut,nbMismatch = self.GetTag() #In case of mapped variant without MD TAG : self.dicoMappingPos[abs(int(variant[3]))]=[nbMismatch,""] #--------------------------------------------------------------------------------------------------------------------------- # #FLAG = field to test #1 read paired #2 read mapped in proper pair #4 read unmapped #8 mate unmapped #16 read reverse strand #32 mate reverse strand #64 first in pair #128 second in pair #256 not primary alignment #512 read fails platform/vendor quality checks #1024 read is PCR or optical duplicate #2048 supplementary alignment # #--------------------------------------------------------------------------------------------------------------------------- def CheckBitwiseFlag(self): """Checks if the BitwiseFlag contains the tested value such as : read reverse strand, read unmmaped and so on.""" if int(self.listSam[1]) & 16:#Reverse strand self.boolReverse="-1" self.listPosVariantOnPathToKeep = self.listPosReverse return if int(self.listSam[1]) & 4: #Unmapped self.listPosVariantOnPathToKeep = self.listPosForward self.boolReverse="." return #else: #Forward strand self.listPosVariantOnPathToKeep = self.listPosForward self.boolReverse="1" #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def CigarcodeChecker(self): """Checks in the cigarcode of the samfile if there is a shift in the alignment between the path and the reference""" cigarcode = self.listSam[5] parsingCigarCode=re.findall('(\d+|[A-Za-z])',cigarcode) #ParsingCigarCode=['2', 'S', '3', 'M', '1', 'I', '25', 'M'] listPosRef=[] listShift=[] somme=0 shift=0 pos=0 i=1 j=0 listpol = self.listPosVariantOnPathToKeep while i=int(listpol[0]): posRef=int(listpol[0])+shift#takes into account the shift to add the after the mapping position and the variant position in the sequence listShift.append(shift) listPosRef.append(posRef) return(listPosRef,listShift) elif len(listpol)>1:#Close SNPs while int(pos)>=int(listpol[j]):#Goes through the list of position (close snps) and see if the position is affected by the shift (means shift before the position)self.listNucleotideForward posRef=int(listpol[j])+shift #Add the shift to the position (to get the real position of the snp on the reference) listPosRef.append(posRef) #Add the position to the list by taking into account the shift only if the current position listShift.append(shift) if j<(len(listpol)-1): j+=1 else: return(listPosRef,listShift) i+=2 #--------------------------------------------------------------------------------------------------------------------------- #Example of unmmaped variant : soft clipping of the variant #['SNP_higher_path_146392|P_1:30_A/G,P_2:45_C/T,P_3:48_T/G|high|nb_pol_3|left_unitig_length_157|right_unitig_length_564|C1_13|C2_1|G1_0/1:389,20,170|G2_1/1:828,117,10|rank_0.43053', '0', 'gi|224384768|gb|CM000663.1|', '229146041', '52', '79M', '*', '0', '0', 'CTTTCTATCTCAAAAGCAGCCACAGACCACATGTAAACAAATAAGCGGTGCCATGTTCCAATAAAACTTTATTTACAGA', '*', 'NM:i:5', 'MD:Z:15T23G1G4T23G8', 'AS:i:54', 'XS:i:30'] #['SNP_lower_path_146392|P_1:30_A/G,P_2:45_C/T,P_3:48_T/G|high|nb_pol_3|left_unitig_length_157|right_unitig_length_564|C1_24|C2_42|G1_0/1:389,20,170|G2_1/1:828,117,10|rank_0.43053', '16', 'gi|224384768|gb|CM000663.1|', '15779841', '25', '30M49S', '*', '0', '0', 'TCTGTAAATAAAGTTTTATTGGAACATGGCCCCACTTATTTGTTTACACGTGGTCTGTGGCTGCTTTTGAGATAGAAAG', '*', 'NM:i:0', 'MD:Z:30', 'AS:i:30', 'XS:i:25', 'XA:Z:gi|224384768|gb|CM000663.1|,+7370519,52S27M,1;gi|224384768|gb|CM000663.1|,-95561814,27M52S,1;'] #SNP_higher_path_215581|P_1:30_C/G|low|nb_pol_1|left_unitig_length_8|right_unitig_length_1|C1_7|C2_17|G1_0/1:554,48,75|G2_0/1:268,13,248|rank_0.32064 0 gi|224384768|gb|CM000663.1| 232979913 7 31S30M * 0 0 TCAAGACCAGCCTAGGCAACATAGAGATACCATGTCTCTACAAAAAATTAAAAAAAAAAAA * NM:i:0 MD:Z:30 AS:i:30 XS:i:28 XA:Z:gi|224384768|gb|CM000663.1|,-241321283,29M32S,1;gi|224384768|gb|CM000663.1|,-114672467,28M33S,0; #SNP_lower_path_215581|P_1:30_C/G|low|nb_pol_1|left_unitig_length_8|right_unitig_length_1|C1_31|C2_18|G1_0/1:554,48,75|G2_0/1:268,13,248|rank_0.32064 16 gi|224384768|gb|CM000663.1| 65214684 37 59M2S * 0 0 TTTTTTTTTTTTAATTTTTTGTAGAGACATCGTATCTCTATGTTGCCTAGGCTGGTCTTGA * NM:i:3 MD:Z:16A23A5A12 AS:i:44 XS:i:30 #--------------------------------------------------------------------------------------------------------------------------- def ReferenceChecker(self,shift,posCentraleRef,VCFObject,PosVariant): """Function which allows to get the MD tag parsing; checks if path nucleotide is identical to the reference nucleotide""" i=0 posMut,nbMismatch = self.GetTag() boolDel=True pos=shift #Allows or disallows soft clip in BWA #if int(shift)<=-(int(PosVariant)):#Test if the variant is really mapped (soft clipping > variant position => unmmaped variant) if int(shift)<=-2:#we allow 2 soft clip (for bwa mem) self.boolRef=False self.mappingPosition=0#It is considered that the path is unmapped return() nucleoRef=None matchInt=None parsingPosMut=re.findall('(\d+|[A-Za-z]|\^)',posMut) while i it means that the nucleotide is different in the variant and in the reference self.boolRef=False self.nucleoRef=parsingPosMut[i] break else: #If the last item of the list of the MD tag is an integer => it means that the nucleotide of the allele is identical to the reference self.boolRef=True break if pos>posCentraleRef: #If the current position is bigger than the variant position it means that the nucleotide of the variant is identical to the reference self.boolRef=True break i+=1 if pos0:#Check if the variant is really mapped if "MD:" not in str(variant):#Not MD Tag in the variant we deduce the value from the cigarcode print ("!!! No MD tag in your sam file : Could you try with the last version of bwa (upper than 0.7.8) ?") sys.exit() else: for field in self.listSam[11:]: if "MD:" in field: posMut = field.split(":")[2] #MD tag parsing break return (posMut,nbMismatch) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def CheckPosVariantFromRef(self,VCFObject): #Validation snp first part """Checks if the variant is identical to the reference or not ; defines the nucleotide on the reference""" dicoClose={} nucleo=None boolRef=None nucleoRef=None if int(self.mappingPosition)>0: #Gets the shift by positions (insertion,deletion,sofclipping) and update of the position on the path listCorrectedPos,listShift = self.CigarcodeChecker() self.correctedPos=listCorrectedPos #Defines if the path is identical to the reference and what is the nucleotide on the reference i=0 for i in range(len(listCorrectedPos)):#Loops on the list of corrected positions self.ReferenceChecker(listShift[i],listCorrectedPos[i],VCFObject,self.listPosVariantOnPathToKeep[i])#Checks if the path is identical to the reference genome if int(self.mappingPosition)<=0:# Case => variant considered as unmapped because of soft clipping so we have to check again if the mapping position break if self.boolReverse=="1" and self.listNucleotideForward!=[]:#If we are on the forward strand => defines the nucleotide for the current snp or indel. self.nucleo = self.listNucleotideForward[i] if self.nucleoRef==None:#If there is no reference nucleotide given by ReferenceChecker, it means that the variant is equal to the reference so we defined it ! self.nucleoRef = self.listNucleotideForward[i] elif self.boolReverse=="-1" and self.listNucleotideReverse!=[]:#If we are on the reverse strand => defines the nucleotide for the current snp or indel. self.nucleo = self.listNucleotideReverse[i] if self.nucleoRef==None:#If there is no reference nucleotide given by ReferenceChecker, it means that the variant is equal to the reference so we defined it ! self.nucleoRef = self.listNucleotideReverse[i] dicoClose[self.listPosVariantOnPathToKeep[i]]=[(self.boolRef),(self.nucleoRef),(listCorrectedPos[i]),(self.nucleo),(self.boolReverse),(int(listCorrectedPos[i])+int(self.mappingPosition))]#Fills the dictionary to keep all informations for close snps if i==0: #Keeps the information of the first snp/indel to fill the attributs of the path object boolRef = self.boolRef nucleoRef = self.nucleoRef nucleo = self.nucleo self.nucleoRef=None#Resets the reference nucleotide for the next snp (case of close snps) if int(self.mappingPosition)<=0:#Case of unmapped path listCorrectedPos = self.listPosForward#We keep the forward position for every snps/indel on the path self.listPosVariantOnPathToKeep = self.listPosForward shift=0#There is no shift with the reference self.boolReverse="." self.nucleoRef="." self.boolRef=False boolRef=False nucleoRef='.' self.correctedPos=listCorrectedPos if self.listNucleotideForward!=[]: self.nucleo = self.listNucleotideForward[0] i=0 for i in range(len(self.listNucleotideForward)):#Loops on the list of position to fill the dictionary for close snps dicoClose[self.listPosForward[i]]=[(False),(self.nucleoRef),(listCorrectedPos[i]),(self.listNucleotideForward[i]),self.boolReverse,(int(listCorrectedPos[i])+int(self.mappingPosition))] if i==0: boolRef=False nucleoRef = self.nucleoRef nucleo = self.nucleo #Fills the attribut of the path with the information of the first snp/indel self.boolRef=boolRef self.nucleoRef=nucleoRef self.nucleo=nucleo return(dicoClose) ############################################################################################# ############################################################################################# class SNP(VARIANT): def __init__(self,line1,line2): VARIANT.__init__(self,line1,line2) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def WhichPathIsTheRef(self,VCFObject): """Finds which path is identical to the reference genome (with boolRef) and defines it as the ref : specific method for each type of variant""" VARIANT.WhichPathIsTheRef(self,VCFObject) posUnmapped = max(self.len_unitig_left,self.len_contig_left) #Takes into account the length of the unitig/contig for the position of unmapped allele (position of the allele on the lower path) # self.CheckContigUnitig(self.len_unitig_left,self.len_contig_left) #Takes into account the length of the unitig/contig for the position of unmapped allele (position of the allele on the lower path) #--------------------------------------------------------------------------------------------------------------------------- ##Case : two mapped paths if self.upper_path.mappingPosition>0 and self.lower_path.mappingPosition>0: ##The path identical to the reference is the lower path if self.lower_path.boolRef == True and self.upper_path.boolRef==False: VCFObject.chrom = self.lower_path.listSam[2] VCFObject.ref = self.lower_path.nucleo VCFObject.alt = self.upper_path.nucleo VCFObject.reverse = self.lower_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef ##The path identical to the reference is the upper path elif self.upper_path.boolRef == True and self.lower_path.boolRef==False: VCFObject.chrom = self.upper_path.listSam[2] VCFObject.ref = self.upper_path.nucleo VCFObject.alt = self.lower_path.nucleo VCFObject.reverse = self.upper_path.boolReverse VCFObject.nucleoRef = self.upper_path.nucleoRef ##No path is identical to the reference => lexicographique choice elif self.upper_path.boolRef == False and self.lower_path.boolRef==False: if self.upper_path.nucleo < self.lower_path.nucleo: VCFObject.chrom = self.upper_path.listSam[2] VCFObject.ref = self.upper_path.nucleo VCFObject.alt = self.lower_path.nucleo VCFObject.reverse = self.upper_path.boolReverse VCFObject.nucleoRef = self.upper_path.nucleoRef elif self.upper_path.nucleo > self.lower_path.nucleo: VCFObject.chrom = self.lower_path.listSam[2] VCFObject.ref = self.lower_path.nucleo VCFObject.alt = self.upper_path.nucleo VCFObject.reverse = self.lower_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef #--------------------------------------------------------------------------------------------------------------------------- ##Case : Lower path mapped and upper path unmapped elif self.upper_path.mappingPosition<=0 and self.lower_path.mappingPosition>0: VCFObject.chrom = self.lower_path.listSam[2] VCFObject.ref = self.lower_path.nucleo VCFObject.alt = self.upper_path.nucleo VCFObject.reverse = self.lower_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef #--------------------------------------------------------------------------------------------------------------------------- ##Case : Upper path mapped and lower path unmapped elif self.upper_path.mappingPosition>0 and self.lower_path.mappingPosition<=0: VCFObject.chrom = self.upper_path.listSam[2] VCFObject.ref = self.upper_path.nucleo VCFObject.alt = self.lower_path.nucleo VCFObject.reverse = self.upper_path.boolReverse VCFObject.nucleoRef = self.upper_path.nucleoRef #--------------------------------------------------------------------------------------------------------------------------- ##Case : Both paths are unmapped elif self.upper_path.mappingPosition<=0 and self.lower_path.mappingPosition<=0: self.mappingPositionCouple=int(posUnmapped) if self.lower_path.nucleolen(self.upper_path.seq): #if the sequence of the upper path is the smallest self.lower_path.nucleo = self.insertReverse self.upper_path.nucleo = self.ntStartReverse else: self.upper_path.nucleo = self.insertReverse self.lower_path.nucleo = self.ntStartReverse #If the upper path or the lower path is the ref and if it is a reference mappind # 7/6/2016: CL and PP: changed this elif for the else. Avoids an issue with self.upper_path.nucleo not initialized. Large tests results are the same. else:#if (self.lower_path.boolRef==True and (self.lower_path.boolReverse=="1" or self.lower_path.boolReverse==".")) or (self.upper_path.boolRef==True and (self.upper_path.boolReverse=="1" or self.lower_path.boolReverse==".")): if len(self.lower_path.seq)>len(self.upper_path.seq): #if the sequence of the upper path is the smallest : self.lower_path.nucleo = self.insertForward self.upper_path.nucleo = self.ntStartForward else: self.upper_path.nucleo = self.insertForward self.lower_path.nucleo = self.ntStartForward #In case of mapped variant if old_boolRef_Low==None and old_boolRef_Up==None: #In case of unmapped variant or too much soft clip we have an other way to fill vcf ##Fills the VCF if the upper path is considered as the reference if self.upper_path.boolRef==True: if len(self.upper_path.nucleo) == len(self.insertForward): self.upper_path.nucleoRef="." VCFObject.variantType="DEL" else: self.upper_path.nucleoRef="." VCFObject.variantType="INS" if self.upper_path.mappingPosition>0: VCFObject.chrom = self.upper_path.listSam[2] else: VCFObject.chrom = self.upper_path.listSam[0].split("|")[0] VCFObject.ref = self.upper_path.nucleo VCFObject.alt = self.lower_path.nucleo VCFObject.reverse = self.upper_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef ##Fills the VCF if the lower path is considered as the reference elif self.lower_path.boolRef==True: if len(self.lower_path.nucleo)==len(self.insertForward): self.lower_path.nucleoRef="." VCFObject.variantType="DEL" else: self.lower_path.nucleoRef="." VCFObject.variantType="INS" if self.lower_path.mappingPosition>0: VCFObject.chrom = self.lower_path.listSam[2] else: VCFObject.chrom = self.lower_path.listSam[0].split("|")[0] VCFObject.ref = self.lower_path.nucleo VCFObject.alt = self.upper_path.nucleo VCFObject.reverse = self.lower_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef # Unmapped variants or too much soft clipped (=> the variant will be considered as unmapped) if (self.upper_path.mappingPosition<=0 and self.lower_path.mappingPosition<=0) or (old_boolRef_Low==False and old_boolRef_Up==False): if self.lower_path.boolRef==True: self.mappingPositionCouple=int(posUnmapped) else: self.mappingPositionCouple = int(posUnmapped) if len(self.upper_path.nucleo) == len(self.insertForward): VCFObject.chrom = self.upper_path.discoName.split("|")[0] self.upper_path.boolRef = True self.upper_path.nucleoRef = "." VCFObject.variantType = "DEL" VCFObject.ref = self.upper_path.nucleo VCFObject.alt = self.lower_path.nucleo VCFObject.reverse = self.upper_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef else: VCFObject.chrom = self.lower_path.discoName.split("|")[0] self.upper_path.boolRef = False self.upper_path.nucleoRef = "." VCFObject.variantType = "INS" VCFObject.ref = self.lower_path.nucleo VCFObject.alt = self.upper_path.nucleo VCFObject.reverse = self.lower_path.boolReverse VCFObject.nucleoRef = self.lower_path.nucleoRef def FillVCF(self,VCFfile,nbGeno,table,VCFObject): table[4]=str(VCFObject.alt) VARIANT.FillVCF(self,VCFfile,nbGeno,table,VCFObject) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def RetrieveMappingPositionCouple(self): VARIANT.RetrieveMappingPositionCouple(self) self.mappingPositionCouple=int(self.mappingPositionCouple) ############################################################################################# ############################################################################################# class SNPSCLOSE(VARIANT): def __init__(self,line1,line2): VARIANT.__init__(self,line1,line2) self.dicoCloseSNPUp={} #dictionnary with all the informations for close snps : boolean to know if the allele is identical to the reference,position on the variant, reverse nucleotide for the allele, if the path is reverse or not, mapping position self.dicoCloseSNPLow={} #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def RetrieveDicoClose(self,dicoCloseUp,dicoCloseLow):# Gets the outputs of the method CheckPosVariantFromRef (PATH CLASS) self.dicoCloseSNPUp=dicoCloseUp self.dicoCloseSNPLow=dicoCloseLow #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def WhichPathIsTheRef(self,VCFObject): VARIANT.WhichPathIsTheRef(self,VCFObject) VCFObject.phased=True table = [0] * 10 #Create a 10 cols array tablebis=[] posUnmapped = max(self.len_unitig_left,self.len_contig_left) listPositionPolymorphismeOnPathUp = self.upper_path.listPosVariantOnPathToKeep listPositionPolymorphismeOnPathLow = self.lower_path.listPosVariantOnPathToKeep VCFObject.nucleoRef=[] listPolymorphismPos=[] ##Case : two mapped paths if self.upper_path.mappingPosition>0 and self.lower_path.mappingPosition>0: ##Sorts the list of position to get the smallest one and its position in the list unsorted! ##Keeps the close snps to sort them : indeed all the lists and dictionnaries :listnucleoUp,listPositionPolymorphismeOnPathUp,listPositionPolymorphismeOnPathLow,listnucleoLow self.dicoCloseSNPUp,self.dicoCloseSNPLow are classified according to dicoHeader so if we start by sorting we lose the correspondence between data listSortedPosUp=list(listPositionPolymorphismeOnPathUp) listSortedPosUp.sort() indexSmallestPosUp=listPositionPolymorphismeOnPathUp.index(listSortedPosUp[0]) listSortedPosLow=list(listPositionPolymorphismeOnPathLow) listSortedPosLow.sort() indexSmallestPosLow=listPositionPolymorphismeOnPathLow.index(listSortedPosLow[0]) self.upper_path.boolRef = self.dicoCloseSNPUp[listPositionPolymorphismeOnPathUp[indexSmallestPosUp]][0] self.lower_path.boolRef = self.dicoCloseSNPLow[listPositionPolymorphismeOnPathLow[indexSmallestPosLow]][0] #self.upper_path.boolRef = self.dicoCloseSNPUp[listPositionPolymorphismeOnPathUp[indexSmallestPosUp]][0] #self.lower_path.boolRef = self.dicoCloseSNPLow[listPositionPolymorphismeOnPathLow[indexSmallestPosLow]][0] #Decides what is the smallest position according to the reference path (useful if the paths are not aligned on the same strand) if (self.upper_path.boolRef==False and self.lower_path.boolRef==False) or (self.upper_path.boolRef==True and self.lower_path.boolRef==True): VARIANT.MismatchChecker(self) if self.upper_path.boolRef==True and self.lower_path.boolRef==False: #The smallest position identical to the reference is on the upper path listPolymorphismPos=listPositionPolymorphismeOnPathUp elif self.lower_path.boolRef==True and self.upper_path.boolRef==False:#The smallest position identical to the reference is on the lower path listPolymorphismPos=listPositionPolymorphismeOnPathLow elif self.upper_path.boolRef==False and self.lower_path.boolRef==False: #Both paths are different from the reference => choice with the lexicographical order if self.upper_path.nucleo0 and self.lower_path.mappingPosition<=0: comptPol=0 VCFObject.chrom = self.upper_path.listSam[2] VCFObject.reverse = self.upper_path.boolReverse for comptPol in range(len(listPositionPolymorphismeOnPathUp)): if (int(self.upper_path.boolReverse)==-1): nucleoLow=ReverseComplement(self.lower_path.listNucleotideForward[comptPol]) nucleoUp = self.upper_path.listNucleotideReverse[comptPol] elif int(self.upper_path.boolReverse)==1: nucleoLow = self.lower_path.listNucleotideForward[comptPol] nucleoUp = self.upper_path.listNucleotideForward[comptPol] nucleoRefLow="." positionSnpUp=int(self.dicoCloseSNPUp[listPositionPolymorphismeOnPathUp[comptPol]][5])-1 nucleoRefUp = self.dicoCloseSNPUp[listPositionPolymorphismeOnPathUp[comptPol]][1] table[1]=positionSnpUp table[3]=nucleoUp table[4]=nucleoLow VCFObject.nucleoRef.append([nucleoRefUp,positionSnpUp]) tablebis.append(list(table)) tablebis=sorted(tablebis, key=lambda colonnes: colonnes[1]) return (tablebis) #--------------------------------------------------------------------------------------------------------------------------- ##Case : Lower path mapped and upper path unmapped elif self.upper_path.mappingPosition<=0 and self.lower_path.mappingPosition>0: VCFObject.chrom = self.lower_path.listSam[2] VCFObject.reverse = self.lower_path.boolReverse for comptPol in range(len(listPositionPolymorphismeOnPathLow)): if (int(self.lower_path.boolReverse)==-1): nucleoUp=ReverseComplement(self.upper_path.listNucleotideForward[comptPol]) nucleoLow = self.lower_path.listNucleotideReverse[comptPol] elif int(self.lower_path.boolReverse)==1: nucleoUp = self.upper_path.listNucleotideForward[comptPol] nucleoLow = self.lower_path.listNucleotideForward[comptPol] nucleoRefUp="." positionSnpLow=int(self.dicoCloseSNPLow[listPositionPolymorphismeOnPathLow[comptPol]][5])-1 nucleoRefLow = self.dicoCloseSNPLow[listPositionPolymorphismeOnPathLow[comptPol]][1] table[1] = positionSnpLow table[3] = nucleoLow table[4] = nucleoUp VCFObject.nucleoRef.append([nucleoRefLow,positionSnpLow]) tablebis.append(list(table)) tablebis=sorted(tablebis, key=lambda colonnes: colonnes[1]) return (tablebis) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def FillVCF(self,VCFfile,nbGeno,table,VCFObject): """print the VCFFile for each line of close snps""" #ID=1 subIDs = range(1,len(table)+1,1) #subIDs for the different SNPs of a given close bubble : ex: 454_1, 454_2 and 454_3 for 3 SNPs inside the bubble of ID 454 if VCFObject.reverse == "-1": # if the bubble of close SNPs is mapped on reverse strand, their subIDs are reversed, this way the subID always correspond to the order of apparition of the SNP in the bubble path subIDs = range(len(table),0,-1) i=0 nucleoRef=None if VCFObject.chrom=="*": table[line][0] = self.listSam[0].split("_")[0] for line in range(len(table)): for i in range(len(VCFObject.nucleoRef)): if table[line][1] in VCFObject.nucleoRef[i]: nucleoRef=VCFObject.nucleoRef[i][0] table[line][0]=VCFObject.chrom table[line][2]=str(self.variantID)+"_"+str(subIDs[line]) table[line][5]="." table[line][6]=VCFObject.filterField table[line][7]=f"Ty={VCFObject.variantType};Rk={self.rank};UL={self.len_unitig_left};UR={self.len_unitig_right};CL={self.len_contig_left};CR={self.len_contig_right};Genome={nucleoRef};Sd={VCFObject.reverse}" if VCFObject.filterField=="MULTIPLE" and VCFObject.XA: table[line][7]+=f";XA={VCFObject.XA}" #TODO: eviter ces "replace" # table[line][7]=table[line][7].replace("None",".") # done during PrintOneLine table[line][7]=table[line][7].replace("none",".") table[line][7]=table[line][7].replace("=;","=.;") table[line][8]=VCFObject.formatField table[line][9]=VCFObject.genotypes #ID+=1 i+=1 error=VCFObject.CheckOutputConsistency(table,self) if error == 0: for l in range(len(table)): VCFObject.PrintOneLine(table[l],VCFfile) ############################################################################################# ############################################################################################# class VCFFIELD(): def __init__(self): ##VCF Fields self.filterField=None self.variantType=None self.phased=None #phased genotype self.formatField=None self.genotypes="" #genotype field =>put it in the vcf self.chrom="" self.ref="" self.alt="" self.qual="" self.nucleoRef=None self.reverse="" self.XA=None #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- def PrintOneLine(self,table,VCF): """Prints the line of the current SNP in the VCF file.""" if table==[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: return() for i in range(len(table)): element=table[i] element=str(element).replace("None",".") # TODO: peut on éviter ce nouveau 'replace'... ? VCF.write((str(element)).strip()) if i0: sys.stderr.write(" !!! Line where the error occurred !!!\n") sys.stderr.write(str(VARIANT.upper_path.listSam)+"\n") sys.stderr.write(str(VARIANT.lower_path.listSam)+"\n") else : return (error) DiscoSnp-2.6.2/scripts/VCF_creator.py000077500000000000000000000221261420021152700174410ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- #***************************************************************************** # VCF_Creator: mapping and VCF creation feature in DiscoSnp++ # Copyright (C) 2015 INRIA # Author: C.Riou # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #***************************************************************************** import os import sys import subprocess import re import time import getopt from functionObjectVCF_creator import * from ClassVCF_creator import * #Help def usage(): usage= """ ################################ Run VCF_creator ################################ -h --help : print this message -s --sam_file : .sam of the alignment -o --output : vcf file -f --output_filtered_SAM : if provided, a SAM file in which uncorrectly mapped prediction (corresponding to filter '.' in the provided VCF) are removed is output in this file. """ print(usage) def main(): #Default value listName=[] #List from the file name used to create the VCF nbGeno=0 #number of genotype for every path filtered_sam=False filtered_sam_file="" VCFFile = None ###OPTIONS try: opts, args = getopt.getopt(sys.argv[1:],"s:o:f:h",["help","sam_file=","output=","output_filtered_SAM="]) if not opts: usage() sys.exit(2) except getopt.GetoptError as e: sys.stderr.write(f"--- {e}\n") usage() sys.exit(2) for opt, arg in opts : if opt in ("-h", "--help"): usage() sys.exit(2) elif opt in ("-s","--sam_file"): boolmyname=False fileName=arg if os.path.isfile(fileName):#checks if the file exists listNameFile=fileName.split(".") if "BWA_OPT" in listNameFile[0]: #When the stream_file is created by run_VCF_creator.sh ; it adds BWA_OPT to separate the name of the file and the BWA options boolmyname=True #Boolean to know if the file name contains the option of BWA listName=listNameFile[0].split("BWA_OPT") #Parsing of the file name listName[0] corresponds to the name of the discofile ; listName[1] corresponds to the bwa options listName[1]=listName[1].replace("_", " ") stream_file=open(fileName,'r') else : sys.stderr.write(f"File \"{arg}\" does not exist") sys.exit(2) elif opt in ("-o","--output"): if not arg: sys.stderr.write("-o needs a value\n") sys.exit(2) VCFFile = open(arg,'w') elif opt in ("-f","--output_filtered_SAM"): if arg!=None: filtered_sam = True filtered_sam_file = open(arg,'w') else: sys.stderr.write("!! No filtered sam output !!\n") sys.exit(2) else: sys.stderr.write(f"Unknown option {format(opt)}\n") usage() sys.exit(2) if not VCFFile: VCFFile = sys.stdout #Creates the VCF file and prints the header into it PrintVCFHeader(VCFFile,listName,fileName,boolmyname) nbGeno=CounterGenotype(fileName) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- #Generates the field index (first occurrence of "contig", and so on) fieldIndex=GetIndex(fileName) #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- #Start to read the file two lines by two lines if ".sam" in fileName: #Checks if it's a stream_file while True: line1=stream_file.readline() if not line1: break #End of file line1 = line1.strip() if line1.startswith('@'): if filtered_sam: filtered_sam_file.write(line1) continue #We do not read headers while True: listline1=line1.split("\t") if len(listline1) > 1 and int(listline1[1]) & 2048 :#checks if it's not a secondary alignment => means splitted aligned sequence line1=stream_file.readline() else: break line2=stream_file.readline().strip() #Read couple of lines while True: listline2=line2.split("\t") if len(listline2) > 1 and int(listline2[1]) & 2048 :#checks if it's not a secondary alignment => means splitted aligned sequence line2=stream_file.readline() if not line2: break # happens when second part of the previous pair (last one) add an unread secondary alignment else: break #Initializes variant object with the samline #if InitVariant(line1,line2)[0]==1: # continue if not line2: break variant_object, vcf_field_object=InitVariant(line1,line2,fileName, fieldIndex) #Fills the object with the line of the stream_file if variant_object.CheckCoupleVariantID()==1: #Checks whether the two lines are from the same path sys.exit(1) #Checks the mapping on reference and determines the shift with the reference, which path is the reference ... table=MappingTreatement(variant_object,vcf_field_object,nbGeno) #Added by Pierre Peterlongo, Sept 2015. Outputs a new SAM file corresponding to mapped sequences (PASS or MULTIPLE) if(filtered_sam and vcf_field_object.filterField!="."): filtered_sam_file.write(line1) filtered_sam_file.write(line2) #Fills the VCF file variant_object.FillVCF(VCFFile,nbGeno,table,vcf_field_object) elif ".fa" in fileName: #Treatement of the fasta file (no mapping information) while True: line1=stream_file.readline() if not line1: break #End of file seq1=stream_file.readline() #Reads the seq associate to the variant line2=stream_file.readline() #Reads a couple of line seq2=stream_file.readline() #Initializes variant object with the samline variant_object, vcf_field_object=InitVariant(line1,line2,fileName, fieldIndex) table=UnmappedTreatement(variant_object,vcf_field_object,nbGeno,seq1,seq2) variant_object.FillVCF(VCFFile,nbGeno,table,vcf_field_object) VCFFile.close() stream_file.close() if filtered_sam: filtered_sam_file.close() if __name__ == '__main__': main() sys.stderr.write(f"VCF file had been generated. Beware, this is a zero-based VCF file.\n") sys.stderr.write(f"Please use 'zero2one.py' script if you wish to obtain a one-based VCF.\n") DiscoSnp-2.6.2/scripts/clusters_and_fasta_to_fasta.py_DEPRECATED000066400000000000000000000043511420021152700245050ustar00rootroot00000000000000import sys # coding: utf-8 # In[ ]: # In[29]: def store_clusters(cluster_file): clusters=open(cluster_file,"r") read_id_to_cluster_id={} cluster_id_to_cluster_size={} cluster_id=-1 for cluster in clusters: # a line is "70166 70345 70409 70222 70406 70167 70223 69786 70407 69787 70408 70611 70610 70344 " cluster_id+=1 cluster_id_to_cluster_size[cluster_id]=len(cluster.rstrip().split()) for read_id in cluster.rstrip().split(): read_id_to_cluster_id[int(read_id.split('-')[0])]=cluster_id # A line can be formated as 70166 70345-info_about_similarity clusters.close() return read_id_to_cluster_id, cluster_id_to_cluster_size def assign_cluster_id_to_sequence_and_print(fasta_file, read_id_to_cluster_id, cluster_id_to_cluster_size): fasta=open(fasta_file,"r") read_id=-1 while True: read_id+=1 comment=fasta.readline().rstrip() #>SNP_higher_path_9996|P_1:30_C/T|high|nb_pol_1|left_unitig_length_8|right_unitig_length_5|C1_55|C2_0|C3_0|C4_0|C5_0|Q1_0|Q2_0|Q3_0|Q4_0|Q5_0|G1_0/0:7,170,1104|G2_1/1:1084,167,7|G3_1/1:1064,164,7|G4_1/1:984,152,6|G5_1/1:1264,194,7|rank_1 if not comment: break sequence=fasta.readline().rstrip() #gcggaatgAATTAGTGGTATGTCAAGAGGGACTGCTATCAACACTTACGTAGTGCACATATTTCTTTGCatcgc SNP_id=comment.split("|")[0][1:] #SNP_higher_path_9996 if read_id not in read_id_to_cluster_id: print("Warning, read id "+str(read_id)+" not in clusters",file=sys.stderr) print(comment,file=sys.stderr) print(sequence,file=sys.stderr) SNP_id=">cluster_-1_size_1_"+SNP_id else: cluster_id=read_id_to_cluster_id[read_id] SNP_id=">cluster_"+str(cluster_id)+"_size_"+str(cluster_id_to_cluster_size[cluster_id])+"_"+SNP_id comment_new=SNP_id for stuff in comment.split("|")[1:]: comment_new+="|"+stuff print (comment_new) print (sequence) fasta_file=sys.argv[1] cluster_file=sys.argv[2] read_id_to_cluster_id,cluster_id_to_cluster_size = store_clusters(cluster_file) assign_cluster_id_to_sequence_and_print(fasta_file,read_id_to_cluster_id,cluster_id_to_cluster_size) DiscoSnp-2.6.2/scripts/create_IGV_compatible_VCF.sh000077500000000000000000000024641420021152700221360ustar00rootroot00000000000000#!/bin/bash function help { echo " ##############################" echo " Create a IGV compatible file" echo " ##############################" echo "Usage : ./create_IGV_compatible_VCF.sh VCF_file" echo -e "\t VCF_file: the vcf created by run_VCF_creator" echo -e "\t 1/ Remove from this file the unmapped variants" echo -e "\t 2/ Make the vcf 0-based" echo -e "\t 3/ sort variants by position" echo -e "\t-h: print this message" } if test -z "$1" then help exit fi vcffile=$1 #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) igvfiletemp=$(basename $vcffile .vcf)"_for_IGV.vcf.tmp" igvfile=$(basename $vcffile .vcf)"_for_IGV.vcf" cat $vcffile|grep "#">$igvfile #cat $vcffile|grep -v "#"|sort -k 2n,2n -n|grep -v "^SNP"|grep -v "^INDEL">>$igvfile cat $vcffile|grep -v "#"|sort -k 1,1 -k 2,2n |grep -v "^SNP"|grep -v "^INDEL">>$igvfile # from 2 2 6 #python $DIR/tools/one2zeroBased_vcf.py $igvfiletemp #cat VCFone2zeroBAsed.vcf >> $igvfile #rm -f $igvfiletemp VCFone2zeroBAsed.vcf echo -e "... Creation of the vcf file for IGV: done ...==> $igvfile" DiscoSnp-2.6.2/scripts/create_filtered_vcf.py000077500000000000000000000137051420021152700212660ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' *********************************************** Script to filter and format discoSnp raw output file (.fa) into a vcf format file (.vcf) (ghost vcf) Author - Claire Lemaitre Usage: python3 create_filtered_vcf.py -i disco_bubbles_coherent.fa [-o disco_bubbles_coherent.vcf -m 0.95 -r 0.4] *********************************************** ''' import sys import getopt import random import re #regular expressions import time from vcf_formatting_functions import * def usage(): '''Usage''' print("-----------------------------------------------------------------------------") print(sys.argv[0]," : discoSnp output filtering and formatting in vcf (ghost vcf)") print("-----------------------------------------------------------------------------") print("usage: ",sys.argv[0]," -i disco_bubbles.fa") print(" -r: min rank value filter (default = 0)") print(" -m: max missing value filter (default = 1)") print(" -o: output vcf file path (default = stdout)") print(" -h: help") print("-----------------------------------------------------------------------------") sys.exit(2) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hi:r:m:o:", ["help", "in=", "rank=", "miss=", "out="]) except getopt.GetoptError as err: # print help information and exit: print(str(err)) # will print something like "option -a not recognized" usage() sys.exit(2) # Default parameters fasta_file = 0 min_rank = 0 max_miss = 1 k = 31 out_file = None for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-i", "--in"): fasta_file = arg elif opt in ("-r", "--rank"): min_rank = float(arg) elif opt in ("-m", "--miss"): max_miss = float(arg) elif opt in ("-o", "--out"): out_file = arg else: assert False, "unhandled option" if fasta_file == 0: print("option -i (--in) is mandatory") usage() sys.exit(2) else: today = time.localtime() date = str(today.tm_year) + str(today.tm_mon) + str(today.tm_mday) source = sys.argv[0] # First identifying what kind of fasta we have with the first line tig_type = 0 # 0 : no extension, 1 unitig, 2 contig (ie. unitig and contig length are output) nb_samples = 0 nb_fixed_fields = 0 #nb fields before C1_X|C2_Y|... depends if unitig and/or contig lengths have been output with_cluster = False with open(fasta_file, 'r') as filin: for line in filin: splitted_1 = line.split("|") #cluster : if re.match(">cluster_",splitted_1[0]): with_cluster = True #nb_samples: tig_type = len(re.findall("left_\w+_length",line)) nb_fixed_fields = 4 + 2*tig_type nb_samples = (len(splitted_1) - (nb_fixed_fields + 1))/3 if nb_samples % 1 != 0: print(f"Warning: could not detect the correct nb of samples : {nb_samples}") sys.exit(2) nb_samples = int(nb_samples) break sys.stdout.close = lambda: None #make stdout unclosable, to use with and handle both `with open(…)` and `sys.stdout` nicely. cf. https://stackoverflow.com/questions/17602878/how-to-handle-both-with-open-and-sys-stdout-nicely # Now going through all lines with open(fasta_file, 'r') as filin, (open(out_file,'w') if out_file else sys.stdout) as filout: # Writing Comments and Header filout.write(vcf_header(source,date,fasta_file,nb_samples)) nb_kept_variants = 0 nb_analyzed_variants = 0 line_count = 0 keep_variant = False for line in filin: line_count += 1 if line_count == 1: keep_variant = False nb_analyzed_variants += 1 # Header higher path line = line.strip() splitted_1 = line.split("|") #fasta_4lines = splitted_1[0] + "\n" #simplified headers for fasta_only and src ## FILTERING #filter rank rank = float(splitted_1[-1].split("rank_")[1]) if rank < min_rank: continue # filter missing genotype ratio nb_missing = len(re.findall(r"G\d+_\./\.",line)) missing_ratio = nb_missing / nb_samples if missing_ratio >= max_miss: continue keep_variant = True # for fasta_only mode nb_kept_variants += 1 if keep_variant and line_count == 3: #Header lower path line = line.strip() splitted_2 = line.split("|") if line_count == 4: line_count = 0 if keep_variant: #now format in vcf format line = line.strip() filout.write(format_vcf(splitted_1, splitted_2, nb_samples, rank, line, ".", ".", tig_type)) #print(f"{nb_lost_variants} variant bubbles filtered out") #print(f"{nb_kept_variants} variant bubbles output out of {nb_tot_variants} ({nb_analyzed_variants} analyzed)") sys.stderr.write(f"{nb_kept_variants} variant bubbles output out of {nb_analyzed_variants}\n") if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/discoSnp++_to_csv.py000077500000000000000000000033671420021152700205770ustar00rootroot00000000000000#!/usr/bin/env python import sys if len(sys.argv) !=2: sys.stdout.write("Mandatory: python discoSnp_to_csv.py prefix_coherent_k_kval_c_cval.fa\n") sys.stdout.write("This program formats the .fa to .csv format by puting each couple of .fa sequence (4 lines = 2 comments + 2 nucleotide sequences) into one line, replacing the '|' character by spaces and removing the CX_ formating") sys.exit(1) f=open(sys.argv[1], "r") while 1: com1_1=f.readline() if not com1_1: break data1_1=f.readline() if not data1_1: break com1_2=f.readline() if not com1_2: break data1_2=f.readline() if not data1_2: break com1_tab=com1_1.split("|") # prints all before coverages for i in range(0,4): sys.stdout.write( com1_tab[i]+",") # prints coverages i=4 while com1_tab[i][0:1]!="C" and i > output.vcf import sys import gzip import re #Filtre on coverage alt vcf_for_igv=open(sys.argv[1],"r") pos_prev=0 compt=0 line_suiv="" line="" out=False while True: to_output=False line_to_print=None line_suiv=None DP_max=0 coverage_ref=[] coverage_alt=[] list_line_same_pos=[] to_output=False if compt==0:#Start to read the first line line = vcf_for_igv.readline() if not line: break if line.startswith("#"): #We just print the header print (line.rstrip()) continue list_line_same_pos.append(line) #list with all the lines pos=int(line.split("\t")[1]) while True:#Get all the vcf line with the same mapping position line_suiv = vcf_for_igv.readline() if not line_suiv : out=True break pos_suiv=int(line_suiv.split("\t")[1]) if pos!=pos_suiv: line=line_suiv break if pos==pos_suiv: list_line_same_pos.append(line_suiv) if len(list_line_same_pos)==1:# If there is only one position in the list : we will print the variant line_to_print=list_line_same_pos[0] to_output=True else: #We get the variant with the best DP and we will print it i=0 for i in range(len(list_line_same_pos)): listLine=list_line_same_pos[i].rstrip('\r').rstrip('\n').split('\t') for item in listLine: matchGeno=re.match(r'^[01][/\|]',item)#finds genotypes fields 1/1 or 0/0 etc ... if matchGeno: listItem=item.split(":") listItem=item.split(":") coverage_ref.append(float(listItem[3].split(",")[0])) # adds AD to the list : GT:DP:PL:AD 0/1:205:800,71,2217:138,67 0/1:208:812,72,2249:140,68 coverage_alt.append(float(listItem[3].split(",")[1])) DP=(int(listItem[1])) # gets DP: GT:DP:PL:AD 0/1:205:800,71,2217:138,67 0/1:208:812,72,2249:140,68 if int(DP)>int(DP_max): line_to_print=list_line_same_pos[i] DP_max=DP compt+=1 if to_output: print (line_to_print.rstrip()) elif line_to_print : print (line_to_print.rstrip()) if out:break vcf_for_igv.close() DiscoSnp-2.6.2/scripts/filter_out_using_MAF.py000066400000000000000000000042731420021152700213500ustar00rootroot00000000000000import sys import gzip if len(sys.argv)<3: print "This tool filters out discoSnp prediction having a minor allele frequency lower than a provided threshold for ALL datasets." print "python filter_out_using_MAF.py \".fa from discoSnp\" \"MAF threshold\"" sys.exit() if "gz" in sys.argv[1]: coherent_file=gzip.open(sys.argv[1],"r") else: coherent_file=open(sys.argv[1],"r") maf_threshold = float(sys.argv[2]) #maf_threshold_low = float(sys.argv[3]) first_coverage_field_id=0 while True: #>SNP_higher_path_1384|P_1:30_A/G|high|nb_pol_1|left_unitig_length_108|right_unitig_length_1156|C1_0|C2_0|C3_0|C4_0|C5_183|Q1_0|Q2_0|Q3_0|Q4_0|Q5_70|G1_1/1:19724,2972,47|G2_1/1:21024,3168,50|G3_1/1:17124,2581,42|G4_1/1:19564,2948,47|G5_0/1:16063,1163,1575|rank_0.36839 comment1 = coherent_file.readline() if not comment1: break splitted_comment1 = comment1.split("|") path1 = coherent_file.readline() comment2 = coherent_file.readline() splitted_comment2 = comment2.split("|") path2 = coherent_file.readline() coverage_high=[] coverage_low= [] if first_coverage_field_id==0: while True: if splitted_comment1[first_coverage_field_id][0]=="C": break first_coverage_field_id+=1 i=first_coverage_field_id while True: if splitted_comment1[i][0]!="C": break # no more a coverage coverage_high.append(int(splitted_comment1[i].split("_")[1])) coverage_low.append( int(splitted_comment2[i].split("_")[1])) i+=1 # print comment1, #print coverage_high #print coverage_low to_output=False for i in range(len(coverage_high)): if coverage_high[i]==0 and coverage_low[i]==0: continue # print (min(coverage_high[i],coverage_low[i]) / float(max(coverage_high[i],coverage_low[i]))) if (min(coverage_high[i],coverage_low[i]) / float(int(coverage_high[i])+int(coverage_low[i]))) >= maf_threshold: #print (min(coverage_high[i],coverage_low[i]) / float(int(coverage_high[i])+int(coverage_low[i]))) to_output=True break if to_output: print (comment1,path1,comment2,path2,) DiscoSnp-2.6.2/scripts/filter_out_using_ratio_of_covered_files.py000066400000000000000000000043271420021152700254400ustar00rootroot00000000000000import sys import gzip if len(sys.argv)<4: print ("This tool filters out discoSnp prediction whose number of read sets covering it is lower than a user defined threshold. A set covers a prediction if its coverage in at least one of the two alleles is higher than a user defined threshold") print ("python filter_out_using_ratio_of_covered_files.py \".fa from discoSnp\" \"number of sets threshold\" \"minimal coverage\"") sys.exit() if "gz" in sys.argv[1]: coherent_file=gzip.open(sys.argv[1],"r") else: coherent_file=open(sys.argv[1],"r") ratio_threshold = float(sys.argv[2]) minimal_coverage = int(sys.argv[3]) first_coverage_field_id=0 number_of_read_sets=0 while True: #>SNP_higher_path_1384|P_1:30_A/G|high|nb_pol_1|left_unitig_length_108|right_unitig_length_1156|C1_0|C2_0|C3_0|C4_0|C5_183|Q1_0|Q2_0|Q3_0|Q4_0|Q5_70|G1_1/1:19724,2972,47|G2_1/1:21024,3168,50|G3_1/1:17124,2581,42|G4_1/1:19564,2948,47|G5_0/1:16063,1163,1575|rank_0.36839 comment1 = coherent_file.readline() if not comment1: break splitted_comment1 = comment1.split("|") path1 = coherent_file.readline() comment2 = coherent_file.readline() splitted_comment2 = comment2.split("|") path2 = coherent_file.readline() coverage_high=[] coverage_low= [] if first_coverage_field_id==0: while True: if splitted_comment1[first_coverage_field_id][0]=="C": break first_coverage_field_id+=1 i=first_coverage_field_id while True: if splitted_comment1[i][0]!="C": break # no more a coverage coverage_high.append(int(splitted_comment1[i].split("_")[1])) coverage_low.append( int(splitted_comment2[i].split("_")[1])) i+=1 if number_of_read_sets == 0: number_of_read_sets = i-first_coverage_field_id # print comment1, #print coverage_high #print coverage_low number_of_covered_sets=0 for i in range(len(coverage_high)): if coverage_high[i]>=minimal_coverage or coverage_low[i]>=minimal_coverage: number_of_covered_sets+=1 if 100*number_of_covered_sets/float(number_of_read_sets)>=ratio_threshold: print (comment1,path1,comment2,path2,) DiscoSnp-2.6.2/scripts/format_phased_for_K2000.py000066400000000000000000000027021420021152700215350ustar00rootroot00000000000000# cf https://www.evernote.com/l/ARUGTnFwaO9Kf7CO5fYJhYXh4T20R54V6eU ''' Transforms the phased alleles from kissreads to a K2000 input format: (https://github.com/Malfoy/BWISE/blob/master/src/K2000/K2000.py) #comments blabla toto -1064h;-917l;1880l; => 2 ... becomes #comments blabla toto -2128;-1835;3761; Moreover, K2000 is not able to deal with long range interactions (non overlaping). Thus pairend variants are forgotten: -1064h;-917l;1880l; 24h;1l => 2 becomes: -2128;-1835;3761; 48;3; ''' import sys if len(sys.argv)>1: file = open(sys.argv[1]) else: file=sys.stdin def f(variant): ''' sVp * s='-' or nothing * V=int value * p='h' or 'l' (path) f(sVp)=s2V+g(p) with g(p)=0 if p='h' and 1 if p='l' ''' s='' if variant[0]=='-': s='-' V=int(variant[1:-1]) else: V=int(variant[:-1]) p=variant[-1] odd=0 if p=='l': odd=1 res=(V*2)+odd return s+str(res) for line in file: #-1064h;-917l;1880l; => 2 # or #-1064h;-917l;1880l; 24h;1l => 2 if line[0]=='#': # print(line,end='') continue line=line.strip().rstrip().split(" ") if int(line[-1])<1: continue for variant in line[0].split(';')[:-1]: print (f(variant)+';', end='') print () if len(line)==4: # not paired for variant in line[1].split(';'): print (f(variant)+';', end='') print () DiscoSnp-2.6.2/scripts/format_phased_for_clustering.py000066400000000000000000000003771420021152700232260ustar00rootroot00000000000000import sys if len(sys.argv)>1: file = open(sys.argv[1]) else: file=sys.stdin for line in file: line=line.strip().rstrip().split() print (line[0]+":",end='') for i in line: print(i+" ",end='') print () DiscoSnp-2.6.2/scripts/format_phased_variants_for_haplotyping.py000066400000000000000000000127151420021152700253130ustar00rootroot00000000000000import sys #usage: ### first create connected components from disco (-A option) #sh from_phased_alleles_to_clusters.sh phased_alleles_read_set_id_1.txt # creates file connected_components_phased_alleles_read_set_id_1.txt ### them from the .fa file, the id of the set your interested in (e.g. 1 for phased_alleles_read_set_id_1.txt, this will correspond to C1 coverage in the fa file), the file containing the connected components, and the phased_alleles_read_set_id_X.txt file, generate the fact file #python format_phased_variants_for_haplotyping.py mapping_k_31_c_auto_D_100_P_10_b_0_coherent.fa 1 connected_components_phased_alleles_read_set_id_1.txt phased_alleles_read_set_id_1.txt > phased_alles_read_set_1_facts.txt if not len(sys.argv)==5: print ("usage: python format_phased_variants_for_haplotyping.py ") print (" * coherent.fa file: the file generated by discoSnp") print (" * id number is the id of the read set, for which variants are phased. With i, this corresponds to Ci in the .fa file headers.") print (" * connected_component_file: file obtained from \"from_phased_alleles_to_clusters.sh phased_alleles_read_set_id_1.txt\" continaing connected component of phased alleles") print (" * phased_alleles_read_set_id_1.txt: file generated by discoSnp (with the hidden -A option. The value 1 here shoud correspond to \"id number\"") sys.exit(0) coherent_fa_file = open(sys.argv[1]) set_id = sys.argv[2] cc_file = open(sys.argv[3]) phased_alleles_file = open(sys.argv[4]) def store_abundances(coherent_fa_file,set_id): pos_coverage_determined=False pos_coverage=-1 coverages={} for oline in coherent_fa_file: #>SNP_higher_path_991|P_1:30_C/G|high|nb_pol_1|C1_38|C2_0|Q1_0|Q2_0|G1_0/0:6,119,764|G2_1/1:664,104,6|rank_1 if oline[0] != '>': continue line=oline.rstrip().split('|') id=line[0].split('_')[-1] #here 991 id+=line[0].split('_')[1][0] #'h' or 'l' if not pos_coverage_determined: for pos_coverage in range(len(line)): if line[pos_coverage][0]=='C': value=line[pos_coverage][1:].split('_')[0] if value==set_id: pos_coverage_determined=True break if not pos_coverage_determined: print ("Set id", set_id, "not findable in header like ", oline.rstrip()) print ("ciao") sys.exit(0) coverages[id]=line[pos_coverage].split('_')[1] # get the right coverage corresponding to the searche read set return coverages def store_cc(cc_file): cc={} for i,oline in enumerate (cc_file): # 852 1891 3484 2641 5758 3247 oline=oline.rstrip().split() for idf in oline: idf=int(idf) if idf in cc: print("ERROR, idf is in more than one connected component") cc[idf]=i return cc def store_phased_alleles(phased_alleles_file): phased_alleles={} for oline in phased_alleles_file: #-1187h;1001h;2178h; => 5 oline=oline.lstrip().rstrip() if oline[0]=='#': continue ids = oline.split(' ')[0].split(';')[:-1] abundance = int(oline.split(' ')[-1]) idlist=[] for aid in ids: # if aid[0]=='-': # remove the '-' # aid=aid[1:] idlist.append(aid) # canonical representation: smallest first (removing with the strip function the eventual first '-' sign): if int(idlist[0].strip('-')[:-1])>int(idlist[-1].strip('-')[:-1]): idlist.reverse() # change the ortientation = change the sign: for i in range(len(idlist)): if idlist[i][0]=='-': idlist[i]=idlist[i][1:] else: idlist[i]='-'+idlist[i] list_as_string = "" for aid in idlist: list_as_string+=aid+';' # add the list to the phased_alleles or increase its count if not existing: if list_as_string in phased_alleles: phased_alleles[list_as_string]+=abundance else: phased_alleles[list_as_string]=abundance return phased_alleles def print_djack_formated_phased_variants(coverages,cc,phased_alleles): for aid in coverages: current_snp_id=int(aid[:-1]) if current_snp_id in cc: print("snp(cc"+str(cc[current_snp_id])+","+str(current_snp_id)+","+aid[-1]+","+str(coverages[aid])+").") for i,list_as_string in enumerate(phased_alleles):#'2686l;4324h;5375h;': 3 # get the CC: ids=list_as_string.split(';')[:-1] abundance = phased_alleles[list_as_string] first_id=abs(int(ids[0][:-1])) if first_id not in cc: continue this_cc=cc[first_id] for j in range(1,len(ids)): if abs(int(ids[j][:-1])) in cc and cc[abs(int(ids[j][:-1]))] != this_cc: print("impossible all variants from ",list_as_string, "are not in the same CC") sys.exit(0) for node_order,aid in enumerate(ids): print("fact(cc"+str(this_cc)+","+str(i)+","+str(node_order+1)+","+aid[:-1]+","+aid[-1]+").") print("count("+str(i)+","+str(abundance)+").") coverages=store_abundances(coherent_fa_file,set_id) cc=store_cc(cc_file) phased_alleles=store_phased_alleles(phased_alleles_file) print_djack_formated_phased_variants(coverages,cc,phased_alleles) DiscoSnp-2.6.2/scripts/from_path_to_edges.py000066400000000000000000000013471420021152700211330ustar00rootroot00000000000000import sys if len(sys.argv)>1: file = open(sys.argv[1]) else: file=sys.stdin # print("source\t target\t type") def printLine(line, type='r'): for i in range(len(line)-1): if int(line[i][:-1]) 1 # FORMAT PHASED ALLELE IDS INTO SIMPLER FORMAT FOR CONNECTED COMPONENT DETECTION #cmd="cat ${file} | tr -d \"-\" | sed '1d' | cut -d \"=\" -f 1 | python3 ${EDIR}/from_path_to_edges.py | cut -f 1,2 | tr -d \"l\" | tr -d \"h\" | sort -u " # 1/ suppress the '-' sign occurrences # 2/ suppres the first line # 3/ remove what exists after => (included) # 4/ transform n-uplets into couples: # a;b;c; d;e # becomes (r means mapped by a unique gene and p means mapped by a pair of reads). Each line is ordered (smallest id first) # a b r # b c r # c d p # d e r # 5/ remove r/p info # 6/ remove h/l info # 7/ remove duplicates ### Same command keeping only edges seen at leas edge_coverage_threshold times cmd="cat ${file} | tr -d \"-\" | sed '1d' | cut -d \"=\" -f 1 | python3 ${EDIR}/from_path_to_edges.py | cut -f 1,2 | tr -d \"l\" | tr -d \"h\" | sort | uniq -c | awk '\$1>=${edge_coverage_threshold} {print \$2\" \"\$3}'" ### echo $cmd "> edge_${filename}" eval $cmd "> edge_${filename}" if [ $? -ne 0 ] then echo "In \"from_phased_alleles_to_clusters.sh\": there was a problem with file $file" exit 1 fi # COMPUTE CONNECTED COMPONENTS cmd="${EDIR}/../build/bin/quick_hierarchical_clustering edge_${filename}" echo $cmd "> connected_components_${filename}" eval $cmd > connected_components_${filename} if [ $? -ne 0 ] then echo "In \"from_phased_alleles_to_clusters.sh\": there was a problem while computing connected components of edge_${filename}" exit 1 fi # REMOVE INTERMEDIATE FILE # cmd="rm -f edge_${filename}" # echo $cmd # eval $cmd # REPLACE THE CREATED FILE IN TIS ORIGINAL DIRECTORY cmd="mv connected_components_${filename} $path/connected_components_${filename}" echo $cmd eval $cmd if [ $? -ne 0 ] then echo "In \"from_phased_alleles_to_clusters.sh\": there was a problem while moving connected components file " exit 1 fi echo "Connected components (clusters of variants) from file $file are in $path/connected_components_${filename}"DiscoSnp-2.6.2/scripts/functionObjectVCF_creator.py000077500000000000000000000414501420021152700223370ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- ############################################### import os import sys import subprocess import re import time from ClassVCF_creator import * ############################################################################################# #Function_________________________________________________________________________________________________________ #INDEX_____________________________________________________________________________________________________________ # InitVariant(line1,line2):"""Initialization of the variant by taking into accoutn its type""" # MappingTreatement(variant_object,vcf_field_object,nbGeno): # UnmappedTreatement(variant_object,vcf_field_object,nbGeno,seq1,seq2):"""Fills VCFfile in ghost mode (from a fasta file)""" # CounterGenotype(fileToRead) # CheckAtDistanceXBestHits(upper_path,lower_path):"""Prediction validation : check if the couple is validated with only one mapping position """ # PrintVCFHeader(VCF,listName,fileName,boolmyname): ############################################################################################# def InitVariant(line1,line2,fileName,dicoIndex): """Initialization of the variant by taking into account its type""" #Object Creation if "SNP" in line1: if "|nb_pol_1|" in line1: variant_object=SNP(line1,line2) else: variant_object=SNPSCLOSE(line1,line2) elif "INDEL" in line1: #Supression of indel when the ambiguity is greater than 20 #if int(line1.split("\t")[0].split("|")[1].split("_")[3])>=20: # return 1,1 variant_object=INDEL(line1,line2) else : print("!!!!Undefined Variant!!!!") return (1,1) variant_object.dicoIndex=dicoIndex #VCF object Creation and filling variant's attribut vcf_field_object = VCFFIELD() variant_object.FillInformationFromHeader(vcf_field_object) return (variant_object, vcf_field_object) ############################################################################################# ############################################################################################# def MappingTreatement(variant_object,vcf_field_object,nbGeno): """Treatement of the mapping informations and filling of the vcf object """ table = [0] * 10 #Creates a 10 cols array #Fills information of the variant object with the informations of the discosnp++ header variant_object.RetrievePolymorphismFromHeader() #Gets the coverage and quality for each path variant_object.upper_path.RetrieveCoverage(variant_object.dicoIndex) variant_object.lower_path.RetrieveCoverage(variant_object.dicoIndex) variant_object.upper_path.RetrieveQualityFQ(variant_object.dicoIndex) variant_object.lower_path.RetrieveQualityFQ(variant_object.dicoIndex) #Gives the position corrected for each path by taking into account the shift, deletion, insertion .... dicoCloseUp=variant_object.upper_path.CheckPosVariantFromRef(vcf_field_object) dicoCloseLow=variant_object.lower_path.CheckPosVariantFromRef(vcf_field_object) #Checks if the variant has close SNPs if int(variant_object.nb_pol)>1:#Close SNPs variant_object.RetrieveDicoClose(dicoCloseUp,dicoCloseLow)#fills the dictionnary with all informations for each snps of the path table=variant_object.WhichPathIsTheRef(vcf_field_object)#Checks which path will be considered as reference in the VCF File else:#Indel simple SNP variant_object.WhichPathIsTheRef(vcf_field_object)#Checks which path will be considered as reference in the VCF File #Defines the mapping position for the couple variant_object.RetrieveMappingPositionCouple() #Checks if the couple is validated with only one mapping position vcf_field_object.filterField = CheckAtDistanceXBestHits(variant_object.upper_path,variant_object.lower_path) #Defines the genotype for the couple variant_object.RetrieveGenotypes(nbGeno,vcf_field_object) #Defines variant with multiple mapping : return the XA tag in the vcf file : case of multiply mapped variant # assert (variant_object.upper_path.boolRef != variant_object.lower_path.boolRef) if variant_object.upper_path.boolRef: variant_object.upper_path.RetrieveXA(vcf_field_object) else: variant_object.lower_path.RetrieveXA(vcf_field_object) return(table) ############################################################################################# ############################################################################################# def UnmappedTreatement(variant_object,vcf_field_object,nbGeno,seq1,seq2): """Treatement of the couple of path without alignment""" seq1=seq1.rstrip('\n') seq2=seq2.rstrip('\n') #Gets the sequence of each path variant_object.upper_path.RetrieveSeq(seq1) variant_object.lower_path.RetrieveSeq(seq2) #Fills information of the variant object with the informations of the discosnp++ header variant_object.RetrievePolymorphismFromHeader() #Gets the coverage for each path variant_object.upper_path.RetrieveCoverage(variant_object.dicoIndex) variant_object.lower_path.RetrieveCoverage(variant_object.dicoIndex) variant_object.upper_path.RetrieveQualityFQ(variant_object.dicoIndex) variant_object.lower_path.RetrieveQualityFQ(variant_object.dicoIndex) dicoCloseUp=variant_object.upper_path.CheckPosVariantFromRef(vcf_field_object) dicoCloseLow=variant_object.lower_path.CheckPosVariantFromRef(vcf_field_object) #Checks if the variant has close SNPs if int(variant_object.nb_pol)>1:#Close SNPs variant_object.RetrieveDicoClose(dicoCloseUp,dicoCloseLow)#fills the dictionnary with all informations for each snps of the path table = variant_object.WhichPathIsTheRef(vcf_field_object)#Checks which path will be considered as reference in the VCF File else:#Indel or simple SNP variant_object.WhichPathIsTheRef(vcf_field_object)#Checks which path will be considered as reference in the VCF File table = [0]*10 #Defines the mapping position for the couple variant_object.RetrieveMappingPositionCouple() #Defines the genotype for the couple variant_object.RetrieveGenotypes(nbGeno,vcf_field_object) return(table) ############################################################################################# ############################################################################################# def CounterGenotype(fileName): with open(fileName, "r") as samfile: nbGeno=0 while True: line=samfile.readline() if not line: break #End of file if line.startswith('@'): continue #We do not read headers #>SNP_higher_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_166|right_contig_length_761|C1_124|C2_0|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 if nbGeno==0: line=line.strip().split('\t') for i in line: if 'SNP' or 'INDEL' in i: nomDisco=i.split('|') for k in nomDisco: if k[0]=='G': nbGeno+=1 return(nbGeno) sys.stderr.write(f"Non valid sam file {fileName}\n") sys.exit(2) ############################################################################################# ############################################################################################# def GetIndex(fileName): with open(fileName,'r') as stream_file: while True: line=stream_file.readline() if not line: break #End of file line = line.strip() if line.startswith('@'): continue #We do not read headers if ".fa" in fileName: line=line.strip('>') listLine=line.split("|") elif ".sam" in fileName: listLine=line.split("\t")[0].split("|") #Init dictionnary dicoIndex={} if "|C1_" in line: dicoIndex["C"]=[] if "|G1_" in line: dicoIndex["G"]=[] if "|Q1_" in line: dicoIndex["Q"]=[] if "_unitig_" in line: dicoIndex["unitig"]=[] if "_contig_" in line: dicoIndex["contig"]=[] for i, value in enumerate(listLine): if value[0] == "C": dicoIndex["C"].append(i) continue if value[0] == "G":#Gets the genotype and likelihood by samples dicoIndex["G"].append(i) continue if value[0] == "Q": dicoIndex["Q"].append(i) continue if value.startswith("P_1"):#P_1:30_A/G => {'P_1': ['30', 'A', 'G']} or P_1:30_A/G,P_2:31_G/A dicoIndex["P_"]=i continue if value.startswith("left_unitig") or value.startswith("right_unitig"): dicoIndex["unitig"].append(i) continue if "contig" in value: if "left" in value: dicoIndex["contig"].append(i) if "right" in value: dicoIndex["contig"].append(i) continue if value.startswith("rank"): dicoIndex["rank"]=i continue if value.startswith("nb_pol"): dicoIndex["nb_pol"]=i continue break return(dicoIndex) ############################################################################################# ############################################################################################# def CheckAtDistanceXBestHits(upper_path,lower_path): """Prediction validation : checks if the couple is validated with only one mapping position """ posUp=upper_path.dicoMappingPos posLow=lower_path.dicoMappingPos # get the best mapping distance for upper path best_up=1024 if int(upper_path.mappingPosition)==0 and int(lower_path.mappingPosition)==0:#Checks if paths are unmappped return(".") for position,(nbMismatch,cigarcode) in posUp.items(): if nbMismatch 1: return("MULTIPLE") for position,(nbMismatch,cigarcode) in posLow.items(): if nbMismatch == best_low: position_set.add(position) if len(position_set) > 1: return("MULTIPLE") if len(position_set) == 1: return("PASS") return(".") ############################################################################################# ############################################################################################# def PrintVCFHeader(VCF,listName,fileName,boolmyname): ###Header of the VCF file samfile=open(fileName,'r') boolQuality=False while True: line=samfile.readline() if not line: break #End of file if line.startswith('@'): continue #We do not read headers if "Q1_" in line : boolQuality=True break else: break today=time.localtime() date=str(today.tm_year)+str(today.tm_mon)+str(today.tm_mday) VCF.write('##fileformat=VCFv4.1\n') VCF.write('##filedate='+str(date)+'\n') VCF.write('##source=VCF_creator\n') nbGeno=0 nbSnp=0 nbGeno = CounterGenotype(fileName) VCF.write('##SAMPLE=file://'+str(fileName)+'\n') VCF.write('##REF=\n') VCF.write('##FILTER=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') VCF.write('##INFO=\n') # cf issue #11 ##Creates the columns of the VCF File with all the fields + one field by genotypes/samples/individuals if nbGeno==0: # Without genotypes VCF.write('#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n') else: i=0 VCF.write('##FORMAT=\n') VCF.write('##FORMAT=\n') VCF.write('##FORMAT=\n') VCF.write('##FORMAT=\n') if boolQuality: VCF.write('##FORMAT=\n') VCF.write('#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\t') for i in range(0,int(nbGeno)): nomCol="G"+str(i+1) VCF.write(str(nomCol)) if i bin bundle *-bin-Linux.tar.gz will be archived as a build artifact # -> source package is handled by the osx task if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then echo "Creating a binary archive... " echo "N.B. this is NOT an official binary release" make package pwd ls -atlhrsF #-- Move the generated bin bundle to the workspace (so that it can be uploaded as a Jenkins job artifact) mv *-${BRANCH_TO_BUILD}-bin-Linux.tar.gz $JENKINS_WORKSPACE/ fi DiscoSnp-2.6.2/scripts/jenkins/tool-discosnp-build-macos-10.9.5-gcc-4.2.1.sh000077500000000000000000000071211420021152700256410ustar00rootroot00000000000000#!/bin/bash #--------------------------------------------------------------# # Continuous integration script for Jenkins # #--------------------------------------------------------------# # # Default mode : # This script will exit with error (exit code 1) if any of its steps fails. # To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below). #--------------------------------------------------------------# set +xv echo " ----------------------------------------- Miscellaneous information ----------------------------------------- date : `date` hostname : `hostname` pwd : `pwd` ----------------------------------------- Jenkins build parameters (user defined) ----------------------------------------- BRANCH_TO_BUILD : ${BRANCH_TO_BUILD} INRIA_FORGE_LOGIN : ${INRIA_FORGE_LOGIN} DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR} ----------------------------------------- Jenkins build parameters (built in) ----------------------------------------- BUILD_NUMBER : ${BUILD_NUMBER} JENKINS_HOME : ${JENKINS_HOME} WORKSPACE : ${WORKSPACE} " error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } } [ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; } set -xv # quick look at resources #----------------------------------------------- sw_vers -productVersion #----------------------------------------------- system_profiler SPSoftwareDataType #----------------------------------------------- lstopo #----------------------------------------------- top -l 1|head -15 #----------------------------------------------- ################################################################ # COMPILATION # ################################################################ gcc --version g++ --version [ `gcc -dumpversion` = 4.2.1 ] && { echo "GCC 4.2.1"; } || { echo "GCC version is not 4.2.1, we exit"; exit 1; } JENKINS_TASK=tool-${TOOL_NAME}-build-macos-10.9.5-gcc-4.2.1 GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-${TOOL_NAME} #N.B. /scratchdir not yet mounted on the osx slave (ciosx). # as soon as /scratchdir is created, one has to update TEST procedure, below. # refer to linux build target to see how to do that BUILD_DIR=$GIT_DIR/build rm -rf $BUILD_DIR mkdir -p $BUILD_DIR #----------------------------------------------- # we need gatb-core submodule to be initialized cd $GIT_DIR git submodule init git submodule update #----------------------------------------------- cd $BUILD_DIR #----------------------------------------------- cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD} $GIT_DIR #----------------------------------------------- make -j 2 || error_code ################################################################ # TEST # ################################################################ cd ../test ./simple_test.sh || error_code cd ../build ################################################################ # PACKAGING # ################################################################ # Prepare and upload bin and source bundle to the forge if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then make package make package_source # make both tar.gz available as Jenkins build artifacts scp ${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-bin-Darwin.tar.gz ${WORKSPACE}/ scp ${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-Source.tar.gz ${WORKSPACE}/ fi DiscoSnp-2.6.2/scripts/jenkins/tool-discosnp-release-debian.sh000077500000000000000000000110571420021152700243630ustar00rootroot00000000000000#!/bin/bash #--------------------------------------------------------------# # Continuous integration script for Jenkins # #--------------------------------------------------------------# # # Default mode : # This script will exit with error (exit code 1) if any of its steps fails. # To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below). #--------------------------------------------------------------# set +xv echo " ----------------------------------------- Miscellaneous information ----------------------------------------- date : `date` hostname : `hostname` pwd : `pwd` ----------------------------------------- Jenkins build parameters (user defined) ----------------------------------------- BRANCH_TO_BUILD : ${BRANCH_TO_BUILD} RELEASE_TO_BUILD : ${RELEASE_TO_BUILD} INRIA_FORGE_LOGIN : ${INRIA_FORGE_LOGIN} TEST_VARIABLE : ${TEST_VARIABLE} DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR} ----------------------------------------- Jenkins build parameters (built in) ----------------------------------------- BUILD_NUMBER : ${BUILD_NUMBER} " set -xv # quick look at resources #----------------------------------------------- free -h #----------------------------------------------- lstopo #----------------------------------------------- df -kh #----------------------------------------------- ################################################################ # PREPARE RELEASE # ################################################################ # paths to access tool source code and build JENKINS_TASK=tool-${TOOL_NAME}-build-debian7-64bits-gcc-4.7 BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-${TOOL_NAME}-release TOOL_GIT_HOME="/scratchdir/builds/workspace/gatb-${TOOL_NAME}" # path to 'github_release_manager.sh' script GRM_PATH="${BUILD_DIR}/github-release-api" GRM_CMD="${GRM_PATH}/github_release_manager.sh" # github credentials and repository GITHUB_REPO=${GITHUB_REPO_NAME} GITHUB_OWNER=GATB GRM_CREDENTIALS="-l $GITHUB_ADMIN -t $GITHUB_TOKEN -o ${GITHUB_OWNER} -r ${GITHUB_REPO}" # Prepare build dir rm -rf $BUILD_DIR mkdir -p $BUILD_DIR #----------------------------------------------- # check tag version; 'master' is not allowed if [ ! "${BRANCH_TO_BUILD}" == "master" ] ; then cd ${TOOL_GIT_HOME} DOES_TAG_EXIST=`git tag -l | grep "^${BRANCH_TO_BUILD}$"` if [ -z ${DOES_TAG_EXIST} ] ; then echo "/!\ Error: tag '${BRANCH_TO_BUILD}' does not exist on 'gatb-tool-${TOOL_NAME}' repository" exit 1 fi else echo "/!\ Error: cannot make an official release on 'master' branch" exit 1 fi #----------------------------------------------- if [ "$INRIA_FORGE_LOGIN" == none ]; then echo "/!\ Error: No login name to connect to Inria Forge" exit 1 fi cd $BUILD_DIR git clone https://github.com/pgdurand/github-release-api.git ################################################################ # RETRIEVE ARCHIVES FROM INRIA FORGE # ################################################################ CI_URL=https://ci.inria.fr/gatb-core/view/DiscoSnp-gitlab/job JENKINS_TASK_DEB=tool-discosnp-build-debian7-64bits-gcc-4.7-gitlab JENKINS_TASK_MAC=tool-discosnp-build-macos-10.9.5-gcc-4.2.1-gitlab #retrieve last build from ci-inria (see tool-discosnp-build-XXX tasks) wget $CI_URL/$JENKINS_TASK_DEB/lastSuccessfulBuild/artifact/$JENKINS_TASK_DEB/${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-bin-Linux.tar.gz [ $? != 0 ] && exit 1 wget $CI_URL/$JENKINS_TASK_MAC/lastSuccessfulBuild/artifact/${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-bin-Darwin.tar.gz [ $? != 0 ] && exit 1 wget $CI_URL/$JENKINS_TASK_MAC/lastSuccessfulBuild/artifact/${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-Source.tar.gz [ $? != 0 ] && exit 1 ################################################################ # INTERACT WITH GITHUB # ################################################################ # create Github release ${GRM_CMD} ${GRM_CREDENTIALS} -d ${BRANCH_TO_BUILD} -c create if [ $? != 0 ] ; then echo "/!\ Error: unable to create release, check above error" exit 1 fi #upload files function uploadFile(){ local FILE_TO_LOAD=$1 echo "Uploading: ${FILE_TO_LOAD}" ${GRM_CMD} ${GRM_CREDENTIALS} -d ${BRANCH_TO_BUILD} -c upload ${FILE_TO_LOAD} if [ $? != 0 ] ; then echo "/!\ Error: unable to upload file, check above error" exit 1 fi } uploadFile ${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-bin-Linux.tar.gz uploadFile ${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-bin-Darwin.tar.gz uploadFile ${ARCHIVE_NAME}-${BRANCH_TO_BUILD}-Source.tar.gz DiscoSnp-2.6.2/scripts/k3000/000077500000000000000000000000001420021152700154615ustar00rootroot00000000000000DiscoSnp-2.6.2/scripts/k3000/From phased facts to gfa graph.pdf000066400000000000000000007576051420021152700236140ustar00rootroot00000000000000%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xZms# IYI4i<ӛi:Ȓ+ɿROnZ]bcI'T^e4*Sunԣ*-Sb~7Tl.SMR`hM*L(rUbTf6bW8Tb Hokų~88FP:)ǚ$ F]?>(Tñ!P@C8޴#51bg}Ahœ,0m&hGX K$pWH ϏDT6ݘA1GC o#nYo0"a竏t(q2EQĨ& 0 AeM(Ydzm SapY9joEgr2`\xgGF2fdTNHpjU9rlɔhó6pT ǏoڹuJ$L‡L! (9Q6ϲڞ{8ȩ= V̕>BH1Y)h"ؗ9pTι)@' ?/g:w牏!>/P4FPXjsH&dMTU&Qm(Ry@E"D'Rar$_DY o$!cL{ޡ\վK@DXMjDx#d5gƁY/ck<8PJ8\=^W<^L)K?/D x܂/\ H68J+:rDJ5=8FI Aɨ D"e@|[Ni%;WmPqJ3=(M#*݋`FsWϔ-[Ĺ0C"N7?> ZN!uG*^X)=rD2CI_ClӬND蛢|#ᕖт"(-tPK =<⟍m_rr/jBPTO, &d{gT gS'w Bxڜ f՗wwTF=$T7)ϛe:۾[vyq~|hՏ4mM{XԿԟqDa7Oۗ(qm7V=Xbnݶ$+ xwqӦ_?_|OpNퟏghتͶS[yO6gQ pfR\sSLPz,2\0K4&oj _Mh2vBOCܪhbbA~`ze65nNSM%Y6r^q.z1U2E~3Ɗ%7w֛^v,q\wjY:q)p[ ܷxTU#= Hp]/HD盁 3?qՁKju yΉ$, 9Հxΰ)\O}`"Zb)a'4[BjO{#&6]4d3⺷Y/sE,C2Ĕv3E抎f)jhg ª@SjWQPoWiO"Zaq*:,x8΁&إ9<%7VevD{Yokỿ+WӶ=Zpˆݒ"vӻ7N͒٠p^ﻧ^wǗh}zvˮOg o߇JUIrxGnV-!c꩟1ƘӍHh;RДsc2TO)iJ4ikɥζvnt.lJ:- l-BhZvom(s[hTgW(XtɍUZٽ>}R44_;o߹Lݿ=x'N߻n%{.'R0(pt9SyQ;H^ zAFb |,qYhP}ߒ1VWuUU!҆BY5o0uYeި-379a)G ee̮H`!8l/Gt6?Z ET?A:>-{ 1t]a¡^uԢW>胡K,j1p9RBH?6>2"-Gs~ VR5Hȡ[r3pyA}8RwCzm ~ukeR= p;^ |С@oBaP@R&J?sE_A%+tvc1,0ƣQ eW1/wo` x_%Q?B׾r &'peicF߆+ߚK۳]e[~/(Pj$Ũgp!2+rw)pwARy E*+ǧvONX!DBRF|58ZD*K%'㝺iBZۢ*P [s#Qj^ v ƬiK]oEå6C~CeE}}m'7]vS鶆I\X χO};v W?%axAw.õ6>/X.uРI`[&meMǹŷ:Xplq WPRsNi$xS sVhG)%qwKmop>OB$@/bogo*W,&wfvE!u[]o7=y J̙zɑ=2rRv$0+Rr3P5^mUW'+ endstream endobj 5 0 obj 3492 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 595 842] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT4 11 0 R /TT2 9 0 R /TT3 10 0 R /TT1 8 0 R >> >> endobj 12 0 obj << /Length 13 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 13 0 obj 2612 endobj 7 0 obj [ /ICCBased 12 0 R ] endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xYMsF+}0C߾cca[H͊y<~_Rw{(F /U*>o<7>| ɣ$0 U+ˣ-nx<LO|"RDY5"p||0V܃0x-s;#x6Vj%,xV֎8" ;tC{,vy~@a ,!]rko+>,ðd}h ֖!,@1ePx#NDLeհbX1)+fUk1WoKR[t cm˼Qjr+B/XܯzVɰu\6yف#3'6Ex>QN2US&Jb0b3i\[llϏLt6ͅ/\K\:|Xer:Gn bf(#HMaM!x4Leo)$s*ei2kj'ti@5~x`v׫ykyQKywez+/( \Yc=Si /VfSS?H+aSGy4V8&Owi(LF-س`u蜁1m}ͷrYW6MDh>Ͼa%}ٵ:8!+yOz?TItoJ endstream endobj 16 0 obj 2161 endobj 14 0 obj << /Type /Page /Parent 3 0 R /Resources 17 0 R /Contents 15 0 R /MediaBox [0 0 595 842] >> endobj 17 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 18 0 R /Gs2 19 0 R >> /Font << /TT2 9 0 R /TT4 11 0 R /TT3 10 0 R >> >> endobj 18 0 obj << /Type /ExtGState /ca 0.6 >> endobj 19 0 obj << /Type /ExtGState /ca 1 >> endobj 21 0 obj << /Length 22 0 R /Filter /FlateDecode >> stream xUNA  3&ƛ/h* w!!Yvvgfgňt0 d1 QΗ&qhk{Ͼ<[% S-zLBWysDIK =eq1isx$񐿜zQ+(Nb6r/j?DY/> endstream endobj 22 0 obj 174 endobj 20 0 obj << /Type /Page /Parent 3 0 R /Resources 23 0 R /Contents 21 0 R /MediaBox [0 0 595 842] >> endobj 23 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs3 26 0 R >> /XObject << /Im1 24 0 R >> >> endobj 24 0 obj << /Length 25 0 R /Type /XObject /Subtype /Image /Width 840 /Height 1213 /Interpolate true /ColorSpace 7 0 R /SMask 27 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xkrAQsWe)XNPhgl~em>-kf}˃ao5lz.b̼'ӻ"(@Zpv0BT9NmA=O?hisQ׵1p:Ll=@x߱Ӈçѻ"(@*zߥPώxv}N|x[ v<㝰VyĭNO]S_|]֛w{#vP/a''2@l^lun2:yO8K:qSv~p|O?v뇟w0yd6@s.EM;N@b4~ŗ>/"J dm~]?᛫KK]RVݣȻ0Ap[^20{lKXt&>v("E Y6WeIjܻ!dܾ~D{V!$a.lq.ʫGc;f6PJhA  7j^aG`u0uHTxfz -lNHHhk{C;M}n2UX!v2Q<޸oo)ua:k֕HwhC&>ZJv"_ˌ<9Y~FXGф0b7g8|0hшz3ԩ _`*Fŭ,q?Q.Dwζr6g>B>ƃ:Uǟ( JcE@P\@Xg 5r3ϲXB&+בʇKDжUC[L䲢}kf#y׳z8u;=+8lR}NưuB%u4m+ wKB%5.L37l)`߇T[t' :al|Uڿ$R1L^vU.ؖdV%עI},2 mH!Ec$`  .RPi"( ݗDF.:CQފ%ϵx9ZMVu{6*2{\TuAqEJ5l. bF;1Hĺpv3V4 CH%u544 Qvua:X{ 5F6V"]CK"a ڿ$R,\C xlLM}T^&Y̼.0H:Rz yOO8qСkk Vv=}J#E@P@ɊcdqIx^  OaUٱ"UP`!uf57 dm KU13C gqIM"%.(.pOЛ@´[lѮ=-H r+#Rՠ}x烤Peэ2̐1hɂ:E98Xx_S4hjPջ:>H \"(_BI+$y0k8T,F¢DV<*Z ,͕\l %إ3;3'Lŀ%A2& $1<ٚ.r?6>^..uIZ>%)^Au3!!a1ע46^G+I`lѴaFWu}׵L[S.nȜrxTdLE@Pze#t,Cz_ KP7\4Fy ]!HTv);ɶy_v a05gŏP1W?f^at4{l{@b"_)/ ԎýMb׽Yc?vaIχRi v P8ΜlǓ]ũǦt0fTse@FD:صy}U”E$L+&!`g3J+뒃e{"-C6TBe,~eWn^ v02E69L y*IS}j:jI`CjZW[~Eiv_h4> f:ʷ Jt:ûP wbb"uж>LDvKT*vw}W6ƚj@PE@` DE&I2VdV%).2mrI %mҞ.u3e!`aE<](/85`WÕ)2F)>#i(u_)xseq V|szLP&SHIs 45 }+E69|39Lj^*Snp ӿTi|6Wj*r٫a6 ïΊ R:_bɆ U gkW^]gTum{>&PE `u6&ҍ.1 0# za%[P>\M)|qD{Г¨ E`AcduŸ.MP?.9D w(xc V㺔Rw:Ka`B$EP靊}=sՎh #~S >|bWR߅~VMWW0o`;7 zemuSg2q]PhӇGE@P Ȏ]/vLlmźuE F@} wCOo'Hqev9 p]{P("ȮX 꺺ȬwyGP#n[U<\nf) `n{tבal~ L*"w@"Wsycb7hZ<5ݪ5I$Ƈv)1?j0EnExn)TE!Bx;ihlccbر_MP?jUcF@>;4y{{ݡ#'$>|.^GbZil^Co+>0O"}PR8''uT>ľxgcQ{t~sh"fKI&xd2Ջ6y. 1쳏#MH;E@c6;"07?os3W?lZ]n&sN^׼?;t>9WY:\1j'ھ(9R<' {rM}Ï <ȉ87w y`޶-N1Ec1s] r̖ 3gM8JXdc%wZY=DΕK ԰"ǒ'?a'7CֱxaJA&v(-37ԩ;w}6P7[F1o;^:4lڏ3mŁJ%CK֔=SH) fhAxE[|!p l aF/i08Esc;fpNҞ$^8quDBh9E\5Rvc?E;RzMoW!$"?ц1r6"J1?}#u(k[Nzs_"`fWD+WV߭"CE/vT6bI%Z A!wfmiafGf̪^U؎Zu: 8Ҝ-- BQ0~D=jG('JLR=}%PgQblI eQuUFD(U%O1/Q:#fDiJ'j=i$h_\~Bm 4F1Lb|[PǀiCJwңGrPRzi0:淊gҺ2柞WhSyiyeMM 걍ȫ{uk^@ y[m3 !WnƤ f ٚarfwKI-$-,E\zX;ˆ)HČDJDvCD,x$$눇SJNO  g86HYs;1C:dAZtMJؾON3]2Ι֕쑏;t~2UVVյ/+3KvtR7prܜҲz$u {#ua H!p80 Al^GŲ{z:)dHg%~ϐ Ofnn1nҭkllf߾}Gac#j?;葅;u:&,̻M"$Dh6~v%^þ^l$, M$iٟ!f )WriHfW<[Q(m8$uoָKE^6oȮy7eNΩՕH-Dk:1[\ {jniAQZ׆t8I|J-~^6v)U ,n2 Yَʖ[؋rJt$0o%;)˜ُf-94aBL$zXX(MCya"`H3<;CyblKiܷRg4ݲ&Ry]V}9V>z}+['@p9y=uRӐa Jwxmnn޻w/\t ^׉%XQBȯF u*/1J0B^G*;WxU0'6uh&jHү.F4䰹ێ51E[:Ə<fңGWչֵdEO4(&kw:n-P^^l .w:QV@|>8xX| \' At~C/,-)+c+#8#0:y1i |BٷpqcGo+41_IAx#wM0Y,j' `}l=Q/(nˆJ@#:&AȤmjy36XuIML܏>}ϐ9_>b3qf%@ztΥ5phc W&Yߔn-;7ץ_v<-d_odq_Asߦ2h ^]v +>CPϱ#҉cg9;R Ĝ2ol.mcC_W<~4g}J&u!f7>F?̴E"OEE],'B=^۳ghkKړPW>e(.MpRI:0 z~"#ih9k~uaa7Y QH!`oଞ-gר>ߵFLb+ N`6woJa}6po)sظK]O6LDrؚ|͓Nm%f0,11{55S$BPA@xڷ8 jg"h +-3-z?a=6qL6V455ɑz\ۢ("(.j4x[PzAQ\fDtLL6sc6{݆e8jv+˴QU8U特ξ-%-hfeBWDT`Yծ*x%hag7!v&>k6GP"CG,v\-h#惻, ~"WlF&y{ncҊnC1`Tf()F@GvdT /2zQ#]!ؙkҧ/Ĩ`n,2&뷗566:(KUć?~ ]i2EFc9kyX+z 6;BWWi'd*@<$9|]xLV).qU0R aL+5Q壉E#bZ:uUjO^[G{W Y']G27{לA@-[~nhrȔJ4dSTB}\+QaO!`/{6cWVnJFezt(MvUd`y&-{`}X i) I~w}Ge6eױJc -N[O:iݽ<]3a 6U=%-!VDաɛ ?.Q+BZ6r (a}ŵ$Ik ºCFX*/Ę3huw #ۧ;sK*т S%BvJe#1#N?~=MI:qu2gV__"p7Ij@  a^z1̼S%tUT\u+iHjzES|3%EV=Mɨ qu2f3/mY=hk _Ja݆]B&+au"{Mu)>Z$5") ŋ\Y1wvjd婞Jxe̬ׯ9njtVO8ԚaX=#sd !Md TS-ycǎ<9ƃ7UK[ڧFVP Y]ܬF,4^nt Ƨơ|~o܂6/غY#V?ԧ o^͜Y%FV{Q 38;ff;Q07J×82w ݫMb?gz3@<곊@^C1hsvY}MkNˮZǺ[ I2}(Ve]navH H'r3 F(}^m1َ V!gZxXWj]=DR`aݘ K]Rpfd*_vUֵ|V ^5۟MW|֊ vl_g/WF(C눱Y-LeJVֶpk~ fN>ϰ)Fv4B]SWRUꢅquTuf'ԬI9sJO ވ)ľ9~E&Qu6B>֫ /VD[[D#ESXǞ+e]P~l>rBy]h"iX\M\^]yU9O[5.Qk># Sºyy̒ں:,wib/@<%| [HjVj@ELהĬi5{8ziBM,DXwwMs~l>`؏h8P쫱ÙR>,E++{v~#W#w ~JN=}GVOvU9ڮ୹F}!G2_Ya "KӅFkorǮV}Mh"u}C#yr^^ՏQ\549;WUWlF@&%em)_EUcs&| C>{!E|19(i"\Sn/kyC3|SP}"/h8:jڍqDǗqo2lAicc#B:S} @ "R|]`hi"gMqsSJ>ӁqUTx߰\RGqA'5`+{e^E{{;ߞ05IN6-%j:Pkn@0]u)(=L*e]Ƃ`GqtIS2h".p _.;%ƞ}:'lSHuvg쎣dTHk1apSߢ+\8ӑ|h/[>3uܛeH2ƅ0[T 5OE 5{-8^6wRסsxiF@=3 F#jk00HQ$hTtQMHGqǡvE>}+BU>9JiAKImD!|}Q{aQ8:ĺ!˺1e̍655af!q?}}w=sЛ!G>n[ MP@駰8,[*h{-Oz_x;6kѱ޾o3em@zOyEFo=`?t_\辗ok`BX\XZ:`(@UY,.pEM9ቴIxݠ8=q`(;kd"O@E24XH݉?cx]eϙjG^C$t$u̟/-q|鋜`=s5k5'{˿b"Bq @X1ngn-|aǸiZgԸKr7Ńm(@:,_[`K =w@KS&yi::;ƙ=jn}ed8r̸ɯd1{R@O]f3fsG,*{pck=}]w/rт;"1N9}} ^@Ŧ%"4/# )Lw&]5q˝淺,\.رb(6gx9h9Ţ`?-j\ `fT΄р}L ˔`6<=ϱWX܂F+V!pr򶶶G2 ~b;^>j앨R_cw76D#'|MHױjicS1jY%Rڋ`3#:e =]!`4wP%ia@f;[W<:q[} DDb{߰^o/C'9 Oxh@R`^erg3J9^_"eWls/,&Ɔ^&ց%O۞ÆW`ѓ,_eeecvCf۷Ol "$x1níу \VN=]$ pOekxY[~xOu_+[e-2SW*a¨ő*zh]E'vf$xo7q2o~u;9 fY[-UEwɯ5Ss|~v{Up0,y`ǁ:6m^|ǼYSfXsgӹiێBmMN4uv)B@V?utʲߖ=~WD|KGN#'i~hqnZsӵK+;hh WoFKԖjvWǬӟ"ylٲ%©_x,8GeUn>q*a>" 87]}>SmQ.(aIw8Ԥ-p[v#nWgx͆[?]O'./~AwuC3:")U0My]$ !쌻o㤴VAz 2g(a/a6!~=wLS&M4q\ecFzcG׏eB% Þ׍=Z+$ ױ9Ήye-i㭌mbjv?:QW{u{/FL (s;;ȉFʨ%N'zvxÎ7ycN\vǏu{QIu2;h;C -c+,sT^pׄ?Ѳш-R?}콖00 s&u坝:.u,cyyQCu{F)E Z^''9Ij:O) o&Nu=a<0sa9 u,gWIR}㯤Ydh:NxݰEm>~l5P%lg;auAC"Jx #*uYp ^:8|^IGf# L%7莼y# emY͙0=*g)=}D̲vgL.B}0 "mc'4EUػt%ѝbvlsϔ҆FotGlS^g!.?!-cYǞʈk? ^"6J5R߽zFp/X`ůW+K2Sy],#u=H@pU\! Ć._O2=L3xUZC 9JXzAy]@ Z^ ⚊V\r|kd35GubhY9hE D 1gm~jTZ](HI4@~o8qb(R箻*//OAYi,bժUwqGqju"il0j{+3x;j+],'ϒ#kR#OE&ej`RƜiGyWsƍgӜѣG6,UW:$m۶ƻ{ĈEEE..cuA:w6Np4(=JVKeS{ 90r^XK&dKa3fo~~^z?񌫳;::y^xsssa.uPo|?O_|r-_W7oޜ%$x0 E 䯹3 ?;׉i2V4;ܚ) gɍ9Knq%\30wx[:Uŵ:^29koog4h$H ]r%`E${~O=R)#w婦}{7I"__pK>3-Pgr 39d[E:gf̘y0s9٦ !D=o"p , .4c/Gf 183l'"u'T9޵^ >|8&%_gCΉM. c<0yd. ?Ęn: *#dcǎ+꫸5y!EӟsA*?:{IIO1_Oo#QXXHCyvϟ\ZA"-4mFiyoS< ! yJȘ999{/iڵkMt nr㮸⊱cbPdRiСS *[@w d/ gx $1c$NXrU eln߾}Osp[[2aZ(3*, ٸjF,^QhcI8's5yuY$k Lbu|[viv :V(ߗ_~Y҈l1z[C?޳gLpQ*lS&ҰEy +&r^z\2NH>Y΃3C$OKV|l A{̔.D&'^JT#3xLXrU e̫Ƽj 1z a^|eyii%#O{u3RYe" 4=:2&[X^I&L0K$v|"YY$ZT„!B_Q neG GX 6r~Y$ bKuF$z1DimmRdS#dHKbE G%`J[ZZJ&WBxpR\B}ْaSi;V-9pdII 2CçMfc{He~_%5Hw)鑲$LcrIɇ N?)g$j,RbuǼjI^ƒ웻6s(.KbRM?z!o7NJp?3k,y^nBu͙3MX lݺڀyP#`MM"ğYX}y caED$H~Zh`nyD Ka}Hu컈ˀNbud]P@MGɥ,"6i&X|̜9[Q+eT~6"QZkhghX`),+ H8nH(d`_TҌmM82LLΰJ 8DXC ʭ-[&6N%Sh@ N̫&dWʧ  3G˛d YƇ:~jcdXyL0'3fȷCyWՖ__amB$AI]9;=o4i;g /iDUȔLBL yM11BPyjNqF'i$P,uhBͳIolG:a./ pod 5 !-KHp1A@  l;̐)4%0iB!C4R9ˆ\y啈XMγf"1/jFg!ݝd&-c`筟WMZSUa->u,e5-LvY:kaijԙaf+zɨO;"8j,A3dؙgjEz^aI %҉<&U^b k:bO$ rQf S3-;}p +tH*h`eBA\AiV<^}TX<|8R)ױ]O-o7P`\^F<-[FV&& v 8B.\#U%KOWAzXXyYZl2GG~l+79Ff p"-C1cee<|p=kY4HD[r} ``Qq):u>T8r^zl٭`g$ C#b`lv0oL$&Z^@>AV ۦu"Ɯ;w.ճh2aer\u /-?@*exYZg>nm!0+Yhyb}g}8 L(^\pRnO@g5Tþ3[٪J5!w&;&9+oCka4A% Əh뺄'Qx=|r5Jqm, #ұ "v x]B`,&v@kW\2&l&&J^zY6 %7T@y62axPD,npPF`͊%j, Gx|r d}f͇o10*&cMy:;1F(Ce#iKyS`l($t7 ʑ e(aDdG!e%$A`eױڷl0`fW4;qp伎Lr 凭K9* n1ACWZYYi,))! }mB'0i :d=E.D<~++/,!^'S-IE# mY 6Vf7f^;LY @̊0Hy?QJܯ!)1dt4 .E^ $ՐYp*I&JI-,.( יhCb"%Fjn1VMs$Ү91f>DfEbO|v _*()MU/L?B k몉&10L knpeeߒpPdKjSP-#} FʄuUII αdg&#`1̫ASl> ~%I:s 4ڬI2;pDG_X^ϴxc SUT38vˀuKlظRNFAؠIMD&'0Cd'jҠ5C=68痺Рm$iڡPos^EyݪDQ ?|ŒaUG -|B~:>̠9cJÅYb(, L~sssMYAH?ߗ&e^"*1@(Z(!;.d3V0wD &^LwX*b Q.uEG-+xQ+M#ALW=RH:it%-]ɡ$U^M=t1&",3rDf;au !eٞz}_"67s*V|LSGy]A\Kax]]E cf,dY/ fhx؋ske\hj1uHA߲:>t:Bή٬A&HP4>F Z^+Gf9nGEn fxzV;> [nl45+d278*ʹ juKd@ O \ral44~e;uɦf!U䵹q2؜L!ݝf"Ɖk!+@:0=KR^Tx5s#/,vx]Fb2cJA]AEpPL ~I*W1b\c\_:b]=i1 }Ij1Zጨ3O12M.'4XryH>lڽE %ΚD[xҧb|l7Sʩe}j76{~Jxcw Kuӧ{6]uFsݫ˺2ֺ!OmσJ Cx=:1qaT@5Jv8Ž8FxݘU45J~Y'#P> _X(U_7}UUFx{fcڱdKU7U Sο_{.T 2$)fR94]lkmTUSk֪d|zĒ 9V{ _7)^U}sSoay{>UWyw?nRwm 孟oRy*γ+׿7qgqˆ-ׯcֽ馛]4MMM+8ܖPI֭k!3'NdM 6Itɓ'O>ȾMowiXQ`~M1K?sd s@PXp0 q4#FGxGC)[kB k1nmf:Bȟ߬Yx^u \A;8C9/^ۼy3 R;cu2 36jɹrsKWd"oaa!//.7~n6ިXYAw^X&m1U[{` ljVV.O{H;?6Hzj v-*8V\詪~lȘ1czEe˖-\oF YY(_z?%YgCq,/$)H_uUwaРA%}7++K.i7ӦMR;(Х^ѽ6Z[qw-O4i YZf !$&j %+J 5."'Bn@X#F)kvzXVS4QaÆ _w/׿{̕3p$[|9z^*p7pn~3)[?&ѴOdJe]KoL2ӊeMvY杝kH5߶|"1w;˿_ƿ/MR̖/hޠ}t.s!EE}?욾`co$fL*<|M@H /~!d<`H$^~PP#v [bf(_)-Z$8R%yĐ~4\bA##R2ݺu+ rss 9p(xӛ0 $&E_ʼP_0*΁0B9@(ou_y|%\Q"l?xq^Z*)Q0I;>39SPR͙m|S4a lyq~JfzOAM0ֳJ+i_vKy"u49_=H` 7`.)v1򠝸6m2wE^SptG+ddkPs=\@ c?]>| X[I <&ׅ q!f -[L@ fˁ0Q̜9ȁnB [F’rA!C,,U=۷o $0FyJ쵌\K `.%v.^K.r>BNp.m۶-*]$|E2 k4h=3\T"qMsC*K@2k1ﲭi/-Xy]$RU;[d&: Ɖd*lu5FRhmb^y?lA6dC._SSkAQ8 I \dbs9lrb/]l%350aIAD]*5 a4̦6np i++"<3M2u6^ô@ Nb0ꤸMy]{35`00-vt|<3\y]jS) $@|$M^]#r!j|Tm㺮}ɳ|$E, hhXlb^y\ ЪUVAg*Y1ٗ <4_A+fx~!~Bɞ.ɜd|dEe'AkCwb۱y]((Ò& a/I>LM&¶A/Y.:6䲗 rו?l&O6>3լ^Zdnie^q_d*ul+q0$Hv<a&,G &iϜ'~R5/ÈdW #ul`AurvSs.C>q'@H_(ؕO~o5(ś"'%.;j+A-^'!B@Fc.0}1 2ؖba%dC10*g0i3fV8;i)P(x1eFv5plc l*+z{^%Cp;/ҺbOUd+U ';vcD7#3L挢1L̓twTuțRI KMwh)@^[/{9}^7 m;`8q+zu<2umzކ1Vy]̨2 oP.a 7i$vA7/5l {ruڢɇ63as,ymґsJ\l7Ĝ[OxК==;#{m4P}…vdbFRD =R [XAn9냉E@xW;&wNGi:2xxEζ{;A$K9D.a%lE'e%aO ^rG#2x!b-O [C`lGik+C2P)qVy2n,E]|< i"#OyVp΀ DlX/܎IAm۶daxh]c=с' F(ucʔf1[,p<gԖTbCY.ǚ뀐:4xzT^C_#A f^'k[e8% _p:Zѯ_?TḆ3f̠Dq)=JK.%% |33B8܄~wGL"6Yq{']wݵvZCHgyGyh6 " fL&vq!C?8}Æ X_{M[4\q"G8T_z/PKT ?i4\rfNlFJ{'kynTC8F{\re9Fdh*G!ߣ/-x!lnkeUz$B| n[i4AfΜɌS2p/\+fǡ(nuu—l@"dc W\q.9FGu$?椒QF/3ܭ"%tk֬y^y"RlpСC|gq2e r6h~P1cƀ \90xU3& pCA#$9DN6:v`N.yPyA#vV9b)R+S!S=- M;?E 3~" Ϋ+ܾ ni pHf!X A#ã% 8̓&! .%f%$xꩧ ;A#Ο?_PBr19\BAM&pUWQ '?AI ˥8lC2pKCTu^%7Hո\Гx1RX 򔁑1&[.=وL*ȆCN0@]`M_7-,;[,cki_Jz e,U Φ vs7P(h8Wɒveu`:#25JAgA0.ep'$5B]yDx>B1#DU_k.%g (b1W< \h$DːJ8ᮻvB$r{_nKZ"Y! 4b.Ps~P.^0RĉC98Lt:-X[,0e ^#D_޸ܼ{Mjnj( Aݸ/C"O.++ z ~3I<(LbAUǏGcC8# s:bhoMk;u bQmSj2;O° ͚5+h]Ak.]a4H>mCa}皻dO4&< BB54*c4 ?1:K毋׉<f &F0-ȹTtXnK/:2 2&Rp_gf-iaNvu.Aڥ^Z^^wEЄY뮓u}߰) (8b@^'>8DNqXl@)1.^'4E&u]5͵\/K"I>YBR:x/<TCB8Ju( <+MV^gI{=XV7WOH{ S+k^r6MN1}ͳPyߑ>qM3>;/콽IFz3Wy]1nW-NOOaځtnbǂz*6ʫd# NdyȜr* OunR(juP]sE1eѣD%lK k@" c]+lnV)uPȥ2Fy]q̺z.U(&==olk+;&[`Ak@"`U-/>K< }z7)K͐^'n^_hjoS^b)-?p=BJk`L^F庡ؙޟ&xOiju3K޳Oy''5^jfmu;%.*ͷ@yC3D&N2ibzg[+uD֜O //) Z&tRuA^x>u3{fªjMjuQAͤ!{v=ǿgtoNXFdSibB8[uDa"`>nwUVqDTfVHeA UsC=TQQ*r˄ $u:hskeKu@x185ǑM.O: ^mz#&;'M,oM#" xw}YzuSQSw}#8i4(ʓ#Pw#ǣgi͘1##GC8iژXT55]Kn}k3X[&ne}=JCbK8 lQ)-XeTOM sޔ+CJ۷!LM>"S eQڞ^u9u֭R8/8~xMyfIVXXHq!CΝ;qěon:̟?z4'&MrKuck:#!pDL|ib.G]24%*j`6F,v\٘vSu~~xpP(BѪP9 s3gD^GY0`o +a8ÐqrE 6 ]wew71ޖ.<(g7w `fώ6mdG&.r :}|Q]gD`R^mu}r99@Q2ul2ǶvI^}ڿ"uLYs|;aJ/Hxk.qwH?#2ڰaFqWɒ%K#ѕW^׿uܸq̐/Gdر,իK :S= ۨQopʭ{-*p|7ah|TUUQ{Og F]:K0q,ucu{R9&{zkE >deV927 ^G ]x!uh% Zh͛wWؤN AH ̊L릛nK-[.M>ko?<"s857tTmD8jؤі;ur[`Dіngo\ꩧB^SNRT?Ot.nRy]PX)R &:ZW]gLC@,#V=tHM.NiMd!p?thFs$Ф5^Gd6HxdCd2#0esUW?`K`"wr)Q3fϞm L:"[3l‛ u07`FO>$eA۸ S<5u0WВxڴief-Fjg)3xtHDnj#BHJ2 V"_@)ÇО^ܚhx6,t1g}y ~I •⊁??&/`Eibֶ_b8E#0 ͎WWT4"f^gefC !^A3O;&H{.첋/ܤqcA抗K3g$0^sy=!DirFGV #HvZ 6M$M1@AJJLo,c _rM!*f2x\@n֔eȑ#%5GGO]u6t gz`N٩' ~ϴMx=Wt+1&OZE ؼnEH~]TB̼ȑ Ւ50/s"0$o~󛠛L~z;7 ȍ[C9E^sy8POB/^lWI ( rWxe^WۼH`0SXaH)Sguu]X(1o~llq Kl46Ł.!CZOKwI׼)49q6MX|O\Uao }+5P$ Ͳhj16^ bu]zӠ%|~{^'Ȱ@#wa(M D8P#nfv9Al䒶vCzqI|?3]EOs.WlƙաoMƺc'O| IUlE ]vbe[YrH}bu/cGpat0]3ma[;Des`dG$ \X34iAL Pټdl`y(#3KR6ݯ$.--%7uX!Y&8-1EN [j@B׬4J-(^^*MFyaFHqreI g+X,(=|"H9~x2S= JvH%"16ǎ?,howfek@;h2a9oq]<~Gnp޿Px4:ΰx(SK*vKWcrzZ 8k0z?t8dhtȒަHxSp*zՙx:.Z*[e#T+d3_/muL=<G1e{ڨQ[@K@zZ`< {ʚ8u=i.Aqj9^I#)u񈚡@ 6 Zc#b+;R/,IѣWĄX9[@ % pݔ 9tΡiRe)c7eq]< ؀N4mr6f`@cB<242,@[l`S^1'ĬNK&ĭ( 8-qȵur4)@+̎b/,K{G)f'ðJ;CiBi#氠`+v^NV,nb<777c4,V='Fd7_6V_s-lNeɕKgNe+W^*H' 4`E zZ4MN8ҡV][ $UѸړ= @%#6fٻlTv q~UX%7zy=h?f:lr9 ;蓛aӫLK g`έ:ku^ʹ`뛱P\=ZYOߒfyR!ub:UZ%7<&`):lrj@ȹ0lbKuIeP :NIp3Qf-Y R&v1>Uץ(96 CL-봳CdoAgk pZR R#Z;RYQ+H^[@z% K<1[ OۼT Y7-Oɔ{?-봳I*xeoTliH 9UtQA 4?շOkǎ yGKKKGq]oٲ@,7n={6*I&p <whF$jժ~]wuO?4#*AL=6g(h .lx49Xߚ;^X-%`}=j!s<'o?qv %++L렚OΤh^ĉwN6MO~heee]q_>׿>}:(?kגT|R*q]zӇO<?w /\r%7A˒wȐ!g'LBꪫ/>8߼y3u*\i8Mz"hqs׵~Eչ5 -sӜ|[+++I@p'tn9~ jLq:W<<ۻwr#G~X𓪁Hf~::,_\J9x ? (҆>FJMh_ #K+jZ\Alq+=8DwXTAK|\g@% I`3xijO&N\x2=sL:* Pq_o xjb&(ă|B \oEv̝;"o%O+я~]zLx\Y\Wne⺞xOgJ ,VVVH@mZkkK/Ė+A&nʕ5/arHZRbz!79`sa. }v6o/ɫ.wZ эzCzٰ1VVVVJ豷#^ຩtZgïmΊ9)Ў,R~8q`1cM#.MvBѨg?+++۴iӾ}_|Lb#בk׿~acC_$?Y\`?dijj1cƟg>[[[1$-d$E]a)YiS ふx${1(lW1*(t,iū oWVVV55#;}|U7qW}ꔌVD6)[lj9x)l@PʡWx 9t$oxO~9*:477W'Aw%:>dٱ5%j.6O.1((K~aa"o+Ý5k:I.s7J۫ŗ %^JGemliːK[Ͳm%`%ԡa~ Q-ȹu͢U'OyEĉh8jF+A+p 9˴dZjO@D%,b,ddן`dH8*AIEK-V;{<碨;k2AzZ Gugd𪸸M&.A` \MFI.MKJ % NEsعceey5smʆlw*~\ͦIeW\]usr#C z]g:Y@s5!i#9K>ɀcB3f̘64 997֮-:^o}HCbyLVmJG%@ף2 (.rrX2>jdQxa вboYqG, \dԇcq]ƥi}@ñ2&0 `N 7n܈ˠ 6 PU 8TpQFd@+ ]ve Cnn,zWUsk%&77WEf%07a..ud+ip~ 7l߾㌟?H6|h|衇H'ݻwZ`x¤)S%8!_~M|o¡8q@Ӑza QK_0A8GWm0C Qʼs\j ?q')6r8^$KIu?mٲe$XbS;\:i ֘[v~S&݌Gfs>I;Js`+`IJe=YF1*vv2C̨,+"Ř"m22p"sHfSW U^ Dkx#= Ab]y$! .b03`% $fĉdXvm3 `lD]cr0*y¸re?8qӒK % MQ_ӼG>|81zGW\ DM!(8ٲ ꆬ޻?=ܺ8ns4#Giw喗_x5a+HfƲ,Sh̚Z9JeU.)?zM\yޙ-@O '+rIgׇ'd*,2O 3yWb7V"י>ȅfLs1ƀ=LO#r]wu2򗿔HIE Τ 4%R'JE\c&}d: uQ^_."-ȋLWRRf V2Pmz-bfDW@YnB¦Ȥ:͛UWeQcRX(t APl]?Iex$W\'ٝw AdKӛ?*_#FJ(60m$GhvW慧m \sV/4l.9n}; V  Ѱ}  -;^xf׎-Y^7yѾ#74}rt)k\rilNxaT__UbUM>/7tS]& >g78l,I%>QbF(:W\M>E}rdLqE%땪$ChHK9I[4U`H@k,r2%^SSDZ9ƒ*]Z<ޔ*4so]kk־_8bJ |=kݷ6~ o_[!-RC75#,OX\It ikйMb!j6j(ez-i?sDy<0I0P ʁຍs A~ $(rҔ\-1@$8 b(JW ȹ~‰ yEQ5Ykk+r;ȲzjF /ЎOX (ƚ=0tخE'0܆- 9FQr:@ "ݱKΟg@)y,} >u$k4|x#1.^fn";:ܱc>FpB-Q\_0rׅ뢊 {mu&vϫuk&?yMAǗB C'F-`2;}'bSWVYY+¦W`Z7gk7q$M65W\ltqάi >4T4f< TdJˢIՠņd<*Wۢ푉kú+WౕUY{[{쵗_X\g$'CiX%p\JǘUg'qI >|ٚ_*ȓ+ChoB[U>GQ+I^QF+?XwlY(}uV \;p^QhE^an4r܆-GNFڂJ{%p\ VȀnRƶWVFv4pG:?*1hܭLm8 7{SF`U0E CɎ-+)-JJøRY#;ywLw0W*Z:@q M 6l w9byan]~ *: Qu4.T0u7uT/;+_yvl11wlqqUa r:jս~6T,2Uu ,LXkֽHQe#dA[敤y]_@, t pR ʞȌa= vsȢ-uh)W*RX.dl|%d\Y/ y۪cbkS%CF`p>;~D.U/@--0[13]c˕JiExҝanyVgV\lQq?+ 8*Z1rN6Cz07Jg&?_8A~,I۝ywU)oyÜ:̹-)P4E$ۄ]. DJehgTF8`Ogc$ERMCU:ܛÏ:p@;ʕ+]Ö!C~s{&qKэ7lƌݯHq2cnguo^G\Ǯk俔adf@-pTgv|onxy9 +cDݱJvllAyNXWߺ7?^PL^){fS;|oiq]W>=# ꔛ6mBnǁݯKqG_9(Qь[xuo^GV׽YMS, lk29-ӂd4h`ٶF;w0Uc2ٱvVL+WU\>v{cT}Ci?GnN45 N)?pRF]u^x!)8|0n?1) t؟ /5t3L\Gt*/(wpݘCfK OuLbۀ2v Av\73-06xE^*% 0!<ӕ F^W*>TJC ?><<<}hiwZw.q?wom۶tR%QtZMџ18\A~: ߱|xiRTh-ޔLśً⪈.͗FUޞ0[<Z"ӕ wTUUq\8{ KÛr˜ ݱ$|`vq:2u[8a7I*T:$ 1DI} |Vf CKJJpz%gf/7 <,M MdKJ3^0 Ҧ , .]rҧ+*ņhk40rTg͚%(j. =I'O:{yyy,cQF}G?eEVYI [\Iΐ@},^1r}WuM]Ub'0@1 4[ͭfbAeV x,{A]Ez'*̣1[[[!rV`@3?/G?dK2 _ü=w;Րr\ro|P)c=Y$0i$Edggsx}ꩧLM"o/Ə@qrZř{QE+"UI 2f PtM-B $/*M>` +駟֌(**"Md\G zǵ*׹Zd|$@_җLBMyyycu, bm0CqxT`x'8bj!|_VZU\\E]&^d rŢf\a_m3dVӑ|,oYmT;=aJF>Lu}ZrM#Vw9.(;ז昞&ƃ6B`+ Cc؞9sfoYci]zdRtYS&sg٠(- iMC:9}t^qQ_ .DH 6bF%BLSS\dLBjJS%H  ^:vEu&w( xb'\֭(TjAY@nM0Үj%o!|4JK/A +WRZ3Fc: ӟ\w52j8ฎvBu'XQ۱G2`oԱ: zT+nv=5>lۯwGAܱ+n Ա,e0w~T.ث0K:޸ph[(+3P j9zΜ9hf$={{%{)2١#Rp֭[5\3RЉI$:N@]$t!YX.+aיI_R`iXl71^FA"(Q)"Qy̔V]vcH׹һ3ฎxs`SPh>^o]lL&_ +̴fm|̪@8ܜsiY\K9 1X0Lԡ=ƗݸK/b.T ۰6d]R(+ʍW:.;uX́L\1J`*LjԱyfICe ٝYzqdGWzDhb+d׿IuwƐOh2aC)MO/ &bo}k٪\>/,Py퐳ΧIۀ:'=,-YRp@;yK 71c[p}=z #l<"K8Q0b.aA;=7YF*,6\"EPWpŋc _ eWW!ª <\$#y`|Kg-x>plϺi_㸇yd:Όj>h sW#h4?%) (`҉#̷.\iy{{Kc(ٕ5BȾ$^O~YUmi${LL VvIL82=3[XNn b?~<72 W rNa/8."Pp J6%T3o9$3W^cU }󄈜T&P&s*-+5g˹\wgY ^rp h=hLv"!zu6+gq+ NIvz|8ʂ:o;(-pԶ5͆uy% 4 jsx],{}@!=@;&_D;pNz&K!TU<(pt:Fo =pSvʕ+!c "MׁyP^}@ %!֎ر/($܋u>(#q'dW1*cxΦEbviȂTb]U3SF +[bN6҄[jʮKD 9Z&;,0 VҔ%+Y<ʢ?]9ngI#ң'"Zk-3{3FkG]^&5 x phfgѵX\v9HץLv&KY^$^nppC }VeX!Y{-ϕЩL\vlNEgA%$3aJc Чx*q8}@=ωq@2u캮+p)1, l+S]v=Mf3%d\?/8a20b<.ץC󀽟O?졚ױ.vsreu`ױ_8%^)1`6p%KpE_Whq]>҆I E!oy!{Of\zFXoou'O}z="l7n9]͢]5_}l]\p<9c5isgANLCzuAE[/ih [d%`q]efsEu8{pUY\| ؋GgKxt@k}eh;9vRq,dmH⺔#n~׽SDt#D#ubc3eU20Mu͎ *8f2}$ (k~aJ_r%p"{ KRS Ԍx{!H_UgldnZYO|@5S2Chϼ:ևaJxE_wḴ +pjq]ek)@d~%n wϒ F.0S50nu {ub8m0"m7fE_vLZ $]2}!mg@@ϫg Sຂr15p8Ǟf%+ۊK KjiX2% m˛׍]."z1R(Y:yC5=͘N䮁∳g+5 8%&و^";O.5^;ri%T 8 xj*CpIs/ ن\g^x`–ԢU% [k 'rsd/RdL@YWq ^XŨKz#vޙCEv߳B u 883}s5L`͈4YI##KhE ɟױ~e~`ѝ[@__:+qkgo 577c-oo W'uW7a\G?wt>rĵ%bYl^u,Ğ\S-_kai@{/}O6b/ [hִ\Y $K22`RU -*:qJ<?~|y=˖-z饗k1cƂ .]aHiuQ'LGq`r$@ED,ahFg×k{p+:{s"1|pIÿ=ʘ%n%`%F 0󙣗{qěQT4 <L6nIϳ>;iҤǏ9яN0aɼ$a7xc)Zp\"6da@j{X[&: ∸ +6 8wJ0put6JJ7KO[F ;"ǎH wm /-eu8[+WuY]0gΜ.H~rYqF54秒/dPk(t!-{()hq]2ZҰŜfe] WXu pu-\-e]Iiz`{K;tH¸`5TU;tY^. '@;U[lX _`9}dXxwX Y3ii u u$\#.K9 /qN<^"H{9LvV׳`.ۜ3+K)qLw cY2g G_USҏ,rN uó\WY{N=ݭ^k㕚 %b= g|ur+>:|<lOX6@$ /zZn@8xxǬp,jii(uo"mN#K\wM~zu_b&8zȹDl{U{KerW\_u Gк{2g% 똯tj~pͧ4liF:ÕuH7qHu]I\'vՉgNNc[{H"-<`k&0 #ʺ֕=zT,Q-J o@nVǵѮ;)7mc qNTp22=`VPb-{ׁԛ%U%b~4[;EeݿБr̳ C;wG6@$cXfƈ`3b[WYXֱ/½ HOI.͗)}SڈWvpձ3iuc`xam}D,TٱvRQ-QRSS$v. i@9ngj>wOr2v6qۧ9nWIyq`\'^POX4b~p/x7[eӺ.(8zU$7`+%߬,;Ti[0,#C&)r,gƮtΥ}<ıbLx uS78jj?D^?{!!MAws;{鱧,yopW$d 8{zL\wATCρnuɫE):@:Dc&m:X˂w%b⦬7k-*2$7]G+;n|͹e] |l2p м1/s;XY}pyĥ[ ;\<ҙhtgmu1m\qnsCEi%[zHUCCꇇ͙ePsfΞ0kZS&<=S7g6<[@18l^{%-mm\1+pKmqp8|_A/*}:nZVHK5\~w'NOCop]xNp5=tUߒeg]Ɔ M){Q nq]Jq!GFǮ379RVUUkbۇeiuVg>3iҤٳg?/s0SL#;ė1GЋ$CYG nؐ} :0~}>-.jTBѷӎlb\怐zlqJ8ey%7.FѨv80bC(***옯;|h-Z$W ? 6쳟c=&8).]vԩSN\;rH?.ښO=yCg}6m"D4%0g?|'?B/~&6,KB t 7^\~ ?7y^z?r <_җ~_]zB0,رCԷ뷾- 뮻pU:C Ad +h?|`qM6MII`Ϟ=ФܤI|,QJZ o`]\ǮrhU! fL.6:u&%@sDf_K*=V0 CzEt*.ǃPa_A_O`0钟~_ |~;|$N {FƭĿ=Gw+#eI\]JڇFR'ƫDأaUhdfp{wTs[?Y@'AWB#*|fX.r)$3VTy /e 0gpTAˇEx(PjA\w81, jAgRF#%P)`5*JTX؛K1uHwĂ CM! N7(Q͇#ҫe̶m?f$@b@㓅~OԼ~>5eu7}W9L =+3URި^|R,TMl%`% % 8ו״>pA#C>=kц@pM|4:[ڎuId_Nl`Dy?1p˙8p6ݑ@qx94: 3 Nfs!Y8FӥϤIDfcrGn6_o:`eKFJ,?!Fndl"4&WkAԒH\71pvI)PN $@|^^eڵDkJ ?HՔ3GR !){єI@2z ]+g9/qV# ޙ8n[zI䳳9%DHcI U"u }cŢGh:Qj_y?׿weA{9o2A[?u'Ow˄.su ;.s F@zdL $͟S޽{79q@G$]x ~KowNEd@ v8AQ+'63f @Q `.9IpTɥu'O/rX"z! rkf\,g#g9<۷VZXxoׁݙ{u:{8FP91b_}v q$&}kB'b"f2(xD8u-A2?  rMo0]l)Q~ۂo nJՒɪkY􄪙D3$x&*B s@Ð8 D-‘$x)~ā$@C( P8UBLctm8WML啩EH 451 =0 3; нwZ Kpx@>";2~] 9 .<[v2ꕲ>oG}Ͽjm$P\\*c(񨆎1<=; Y'2tLu '-9Ɩ2@p2ǹa5|dN. Lb:<` +8Zk}K;؋LG@g=6&;Ɂʥc T,qOsC$ٹg{o0ɪ'a.E\/M``Ӆ`%#D0Bxx F!j*)D~:14ejq,ƤLr)f+7I׿f5)BG0`N z4Nסi)n NAw:]?Q,\^D%ɖ^&ĥ \Ӻ'ic%`:}Q޲&o] -S<ĈU_V =אZ]lԀW]ug B-I5S fR'R}h@Z2+a(,oۑSqys-{tBT*&f0gff"Q?'{\8 ]+wO%G19 pVe#;"ëD쌼 ~|E%) %۝W]qtYk[_|bgW+[h<7>x_C}>䓱bՋ~dCInnt8on5ļI.ÔkCowXM뵳޷1yP*ύ U񝚉{(ܝK=M6 fڂ:gm=N Ш6[T@#uOI.-c~`%o IEIv]5FRrbP='j>)5U5,{)+#GUfQb!K^ɕ:ʪ.n׮]xXGuCRվm;JT\\fC>.'[TيdHcd^K14㣆lܿd`eYATv@ g;4`~'( =zsO &SxʫP48`dc~ӵw䄟~jMa \nUpʪg6Ѵ,my3^|3o~ÿr󑲤z*\“, G]O\ 2/411"JØca?/$e;{WljfIz;5M:3!v\ԏӲݵ2~4T:=]gH{Is'H#_|Mݹ2|*;kFynqʮ(hf4qRj*fިq:9E ZeV5؆׌#\::&A$~˛qI_Ѽ2PgU3mױla 5Xy'b2ME"~ޠb勈:nE3LmT1 P(Q>,)A:8)5mSS(.\~fp1r[p081 h6(aRZ8:&tfbx❊˛lq(|* `I.8\HnQ]5|nS7f=C%7|zNv݁F&8ʨO:|.p % @Ha?: NFsD,ϋ,%I&FxPw&Mh^IL 㺊3n --K]̠ mRU ux0㻄8c%u#9>ƀC?4g䆻T.jiu` :ɌU2/aI1뮻?l:y'bڈUC Xի1Yw/sQskQG`'Dzb`HJ0{/6ٸXplc&&3CԔp*¶2 |$%.&t,9JX'Pff"- נY30ZS)lj~FDhi޶#Wr8*ƒNԅ9e0{FPWw7kS@Ѭ EqB۳u1+ N3UK 'dd6A$OA_hьfK?ل_IyH^QxkAxݾȲ]ᙛ]x_q2C{pBgC̲v[`M^]&-NG͢Y\O)a̙7p]tHe!` WN|>Rw߹_~ P|zp(CQLjzD'poTIt0>Z]~XP@%u+З)TCŞ#gH-SzIbu85ҕ)Xʊ2b72)4.oi d'/Sq,$YG3y<d/]2"a@͹3>jĎ -TM/1?ĤJ.B%uЏƱyu Leg 8zZOݱڂm}K`5EE0#V(S: #dbB M8^\NJM=Tg`E6WZ[O"QBeD48 @% d $aE\]\?I8 A9J/e4fBB0.r _pMN@t@&4{fr;ȒRSOY#SfT-K@͌br((G 11+f Hmz"ͫ: bmMBpv_\\f Z1\LՌ$̈DP+#vfz00#`90<(<$(8_fU_ڿPWPl ~GfO! pbQTúiHҎ-I §eP1:/ ICChbԂO1J"}x&AT:G0O_{k |P0'ƀ gHbCB+O@$׉ GT\!h%ŌKfXxp)gBn I~ =&Ti"s t IFf&;W0ywIqnfݿthL,=9Q%f cݛvG@Jڗ"؎2°_ )yґ !?m,|X+Q5 1t @HSnY/37ySJʪLmjp\>?M\G2dH1 oS}OtT4oO'!/|< L̓T2M?&]Sk b.U%Ƥ{35hiK%醅& \jDj0S/K L: JwvɾNt:׿.I>~u'Ҍ:oJS޷ޘxp_ @"ٱ@oZ#C>>Io1E&D2rWgPQ A~[ߨJ>dSaM:n3+kfaKФ `R~qgA+U2TDrH)?E,4 ߯2oJ@ǰ"^ * IPJ)AlSOLT|jD4|#8=~Scdl9sptlʌ|,5#5,LNMcuidW .bBIdCN.\'*pșAOMNp=PE,x`{ | Vu}cEٓ+Uߤ{B3%vfp:)` h$˟'T%=$}`CN1trG.ZTmV:p`*GbsgT\#U/oL<\l2iS nLG$FEM5,.HRK#APYƘ.V %' E S26Rɰ 0 &#a0@b@^Bm(6k#bq0SZtL#.^NDt6vv8|ѲeJ+ZPUzqc8,*#-8b|y4h B'-eY;I_ (׮, ǙAWϨ, 1>LAQ%LO/-E}(Cjc?/(Y!Ÿ(:̳HT%yb^wut̛"gv:el@|x&{T\Gv\hHB|0t_7;uoL%݃+ &PdU ֟{(@t +uRJ'CB`oL a! p?n1Iup6ہUʥD{3C qhOS5X5\% ;!Ȓ\f0 o͚rav3g4MUDR 3pU=V#+Z5J,\ǸĢFX}]bMisY /\'D *~JYbL\? eQX10Pv31;T+M":N\|RC\.RRJ{& Gq$FqFbG̒%H:u_ SN\.!̱hͮm$1>bvKssAib/f ĉ61_'!L:Mp^ RMO\1Kt,M$ 2nڈ:I>"ڈ6x?{dWq}LQP])(((CA_c> lxm$$$P$!$H@asXWq%m99l?޻7pپZ͙3{zzz۵ؗq 㭶J~ X3H\9\B|A]/aԀt9\އu7IZH)uL9zL[QhҴƁ(9EYN:&׍mN̂U۬(s e`P1s;5Hf ˌ]*#j` A2 ܉>r`ϗ, +.$#$ryYX?r>p& d9YHv8Q61S?ںuGvTd*bHc:lI5@{CIEAOJ, ͼee)VTW"s'k؃Lh}Jdp ڨ[З1H" H*$Q/0 uIb2k"4K4M݉)zK7BLDJQaF0D"PO<nS4Q=1F4zNuO,q9}S~/τ% #:1c썩['2$ ;/Xvaѯ)6L&inN$$:NI/qs/0SCvew}{g9Ѿ=}4kǘ9E[V9;ý{x%wtӶQ&dIj"8e]u4\7e]ԱE+}ԳdaW'x`B ݸγ|3„|짣wE:i]qSn3nԈ3FLf iui-onMZ[b+})b^/-95F-nuT}]D-Aj9 :26QD" Ed% @kBuLXLW\'6WjqG'x8l.Zy N;l36!0Ӄ 7\ OQpLDbEm: nvq(ufsqݲ۫KE$p]DYppع&x1r}mkcp.aFXי-/:f_̱ĤL'~Kq4w\Bܸn>Ǿn̲Xc ,".? ^&QH4lD[Jue#C\i7ţd|b>#O:0:O׈32֏_SſY]'Ct Qlvp襅=e]_ ?0f.\PS@.yW^555bHO~p}׷oL;B!J"r AN {wn7\QbK <~{~Ztpj%>u q}Bu5GQy0]&J\3\}ZL,Y`o\;«yi޽{vi0uHL^O>L>dH_]^I_}2m{. կ_? :t;=s%p K.?_x7s΅^H;mذU XRC=t5׬\S |zo4QgfU.y*: a!sZ嵭,EHwi6\? %7u]wKRﭷz7Knǰ\UU+?sL%^:S>LຎD+xM7Q;4# 2}kk:IynnyܐU@4(Wﭠyڸh؝cTg_s1\ם;= XntrĈ>ԩSZp:rh㱵p} brEfKw ׁ]t;OzРo%#u!d`?_y. ֭[)jΝ :J}vp=ίu ?q(7|H9 +u0o#G w}яQ ?.z)QӋ> .٨={0cT#=0a3W"YopxzuJĈ{G ׹}gy{^xHb?I){\L>|@w_vv6g(}οPpݳ)|ƌ:VyX {oĽu)uhqG,r4a߸ ;8?f# 1ߣu{@e:f^"+0x! aOd@@&sXh)<|똠e>T`.|oavWjQu!1G 0w`5r3ŊH6e%Qzםό뤮bS`h;7#S0UUp]Dy*#˰~{z]UɈ=J=c)ͧw<O1X0lb-Нs9h E%!W\c.Rqx$(aFGu-XJ.]x4Ob gx{W<ÚQ`\gz lH^w-DN<9 p 0 ng.6&0]*i\'93gKyLӦMc4W`gIjQs 4H'tdAo,01Aq舶rg?Xh%pΎkVxt(6Ggue (qX& az*F(=J102a߾{Ʌ]_1^jg!7| "8>$)0dz%هU}]<u9J9B9H}}=~ZH6իI{n!FÁ:17QiI49|`0JuKݍ:"Y\]ۆ0QGpo,yT'$ L^tb d9e&ΗxMIz 袋th? DlA+ cR`-1xbT^ˁ5$a XRуrLL:C?Ƅ#7Q\h!H$0?Cb#F a(%3uHI1|G@X&J޺c˗'-JFS&0S\2_ \΅DG&sSNC-ubl/#+j%p]xym̮iZ\Cb-x$ ?z\b>>a#?|pY^ Qh <65xdxW @'1 (5xŖ.ic tCăF ɽ%*`#wg1/Bib׹}pԔ8`df+^G2;i,O@}(qf!঍ǎ8&&IH.u0_XÆboDŽ|j"5 -:׷a u~jujےr\zTe]!ԲjrAv97>?0~u7}a!CF'ݹױ)";t6ulMk$J5{dq/ rssys [I_)ܹ#;nAߨP \綯˖- ^:,ȏQ#4 F ՅW:"CF:q z:tt*?z\ʂr8fW+Cb'č; H ϝ7 L.G;pr$ Bj#4U'lAq]GQTGnizYI%D.Vk9|Nw)0B7u|-:5cS됯#kۇ0S0îQ`K0F@)5D s*?z\GXRQ2+ۯJ6pJ*++d0LET;Celb!n.Qk\'I)iM s6@_8ӦM#`;|w1}pX!{Qem 1 uKަ6-&.I3UuLF64uMK(9]ut!Oً(&\'{J[h4c^^̦14=+A9bE Kq{) 5 ow厧8mUCǝ@€"w`}Gka^KvQgA#uFzuI 7K}'b ZG|$(r4?0c!=W8TJ8zidHF !6o̤({P+րp3\'c~sາ6\ǀ`u V @$o.Vy$j{9x3g7DңuH|pW$#;Y!#u0( >L#(Q(d^EEۆ P>7yCʣfǎ By;j,dnڔDB$om`Bʀݏ!%4]RmpnW5u#^G:$ nk($G,tnٞ[%d=GyMp]i"wmuzAAEcCx`וT7 ;1:4$plftj&Q QІ3\'_:1i:|WθNfp9[0]yr\>V4=Ɨ0j?..Y YvvNCVm.$[:'v}0s-W8\'a&m.|qDO>𗕕˜#_ ʿ3q5G98 &sb.|oL[1b(@+(?A ¬Np\ kKD36aNԲ~u\u՛.B:N u2RC^xsn˻04$ MZpXλ0; >;&m/qM)8Iׅ珽ȸ"uqo戕 뽅u[ĝ$+0AP\[gfu bxBU\{*׽Y$IQK(tဟp]ltISpV:C;׻ %]PqݡR m.|OL |[V p]bm+OoҵO&n7cRagn-QK4V~8 Mz9{\:Lx_X#8?cl&__-WF P.8eӻc3Bw7iD7+U~u`9 Ɠ#o 8U7bDS/rnn40+jaq\1 ÷-uT . f@1| 4r3F9cW{ckg ұC&f7{y6\' uOʢʘnO2V]x@T51*56O=cI#F*{:'\Wp ÆҺc&x7{e60\@hu j o.U҈C"P87U aShZ=v{nF`)HUu/]U՟uR>eB\'^^] %)\;Yy90uE|jtnʯhrw&}޽{ZJ]xңG2bAѣV~;$ǖ^xn*Kм-uw_߾}333y`iǎ8ni .,0;Dax]wV8߿1n<8}ڿI ^|tT> &MTWW}C*{{vmO=7##Ç+++grkLJW'N[k\k֬ի6l2ra:k+ {#O׽~}Ux'`cupUFmlrHU<y[͡hpݯnA kTz<>+yw=$ OlL2eȐ!" yam6",]?^}U" ͛'=\N:t /| ӧ(_' _OM-[ S> k/܁R fG;Mvr) R y:r{uY򶤤 ܀·zK @EE%K OkTz<3A3gD cT~d [{9Ԡ^XVבֿk}`U(ۑrRpW.u\Z(6hpݜ9s@/ŀ |;(8,([of j馛t4yԿKhhK/DÇ4"̂W޾kw)_]G@TJޥKJꩧI&s91d@4< L]@2 hQHj W9W!@:\2r$>U(zZFKY/#E=UQ:i:˖-nR9=#ɓI@K.D!#{VpH ۻRKd:u+J#F3$@BW&?v~{e,Yv-z޲K $|G9T^q̘1"ἨO`o$v?p@t#LZL:0qiOvwt*\b3*L_a$Ju:%!N^|GiD ؤ`$n:.hGZTP18Lٳ;wĻ/#\d`vyQ35B34h@At:uTW"\\\L999×(:@+$B%༘ꔷ joȑl%2/;~Ke//dlLLG:iF׽ڙdU! iXE :;  E,Y|Eٜͥ"өʢ\E&Lpg?|!bWFUW]dp %4—ĄXXs2qyq"٢|Pć/?Quld}Ge2Z5=7xO3mo(!Fg0gǎp0=HKGO. ggUA i:Ik\xẄp;*㼳`N@G6[p˲DVU QGJKKH9E=&[ZlבƇzH3,vK$FjX"_qp2%m׷'Ӭ Jq:cܸq,L"TIjȾsXJ&/Qe܇+dĂt֭\% }@m, ,qhW@w&al+C_ԐԄpYe; ;fKR~lW!24+butd( l7ӆ0Ny+./A+"@{W0kKҍp!ʱcǺm$ 4R°/Oy+9T `Ô(I836p3xbVNgb`bqdD8cKz֯_/"H_h\EæLG:䲿ȹYƮ JǮ4uj`):em-c1\4)$"uVq\^ 8Ȑ))_G;t~!22Ag@8M HJgK4rB]0ߢL\Tj0%h@]Fv~DI}e=dj<5g#DEK[naw7\ <P͍?V6%`BtRlgN][K@K)MfV҈%^0UdZꫯ޷o4 )UAH3eTpFv9% p]9݌>p^G_"L0Њ۪M`(e=ǀ7A;L((A!.5 N.]ŰPA&@iH!8@;Lc+ "1F2TXP_-\u}p)RUCDA'/ʐTitB:'\+ͥ|ZDu369׳6K4SP>:Ȟݛ+ ץ@q[/r opDp]i([ 3ߑ㸔ia!+s)Ru9o*C}"YE.8?6" +p]4{vinB02E ҦId߆ co}ݒv\GuɖCC0q~|Yyuؽ? S0^~uk]4ףoNE;8ש}7Ǚ.łZsbDiuWcqgk>?py[qe0~ILD3tnϡ1}]"2Uso,2\Btju׽HpݲJ΅q!?Wr\TyBujNp]JđJU{u$,f;'go)ױ}$8\&4v.t[mϥR& [\siKV(bū-G9׼{kK:tD7u1jԨhx@Hw\nwl%y=>#+Olϙٕu;Fe:+v9X^2-Io:sږ={>+/5\罾kݞP3^P\ǥBn'HQ9?*xr6g;FcGa.$]väWi:k'hҢH7soϙ#*|й#`.,OxZ~w#D.3\F<8>餓-p+?Ẍ]\"-]ddtƝ:ݯkߞaẸ9v#9N!B#7N1 S%Xu'xT [j / ѣ"l۶.\PS6b};c(-cǎ%}7f5/k>}K _x6p&M{n-s͚5zaÆA%qwyE:۷off&p&3~xJ&KӴ( x>ubC urK=m:/lv̮,55Nw \23׹h yns޽Ǭ,yKޛnv)=zG[o+Ry8Kâ0"7dZ,q q|Kv"hqAc+Jql{.qlO~Zu{ jepx\nZx|R9Xul\NWD"6^:64ZyhV544[4Ҹqܑ~J pK.ѷ(Qbh)W^A'[vΝ%#U3diތ BAמBI":bDžZ҂~uop|[>3i! #2\jdٕM`xT\uأ-1\*ĥ^ Ç#Pu Iu+VІ{#*}{j&@,i 4xꩧJJ; gϞM @5НۀİEKzwJlJ 577~Ȇ޽{}qjlV5\J uߑlϽ̮R)խ>P\/9 \5/El4:,d8z ׍9렊M߿?NE$& 2yLΫဌ2t{M$oqq1)N>dSܹ尟pݘ;7!q/hK(tWsUBY4=C%{vV>ץFq^s5D9.P}Xuq( Agpn#\`(C{"9OJLxuWpAyPVVN+;E33P:oݨJ-ש903JHS:2d$*pΖ56xBhu@bus)a;ulSy͝;ȄwrI'2íKwĉғQ/El2Rs$F۷o"|QA + .rCʱ?p=|vTxK-yv;fWC\je;3{<N&+4Nld؟qo5}SYa?J\W[[{UW8 ܒp&Năs)&LNz'?! ? ٳgӧO'`nM>/J9}F0N)v"NQ&W*" ;$'5h)G}wyG p yE!+&1 FE4:B=?p]4 ŕ{2p]ױʼnY.0GڣuB'+Ng:zСa1rl!DH3~E RFRhK;Ψ(C%+b2uSNC0b ]=:Fqp;wHb|\Wo$#8R0\/nE_ifoH"AM Ov?71:wF ҈ubhE|K ץQ'L>2Iq$͜>Htk\aNCM_m;\&$R4?Mb73\ Xop\_:S6b<$bluN<AUUwbG œI+K@]vՇSj-pn0D?yzch]1;73\4aYE)?pk4'3\- VRد<^LtCٕ:G⺚HDr%3;ggַ+qp]<ە JdMTzGFI9.33E7j.ᬏw{G>;9"r!j؈fUⓄҭXuE׵n yy&un3"!"hP\csMdu*UK368;TVqZӝ)& ԂEzyun͞]:oʫTm0\i,#߬8Q{:#WӝՕn'K$r7ĸz0+tuIGiV:ꮶmp] 2p뾪ۇ9ϽGhпָ`^QòNKWXzE}XωJ$|kSD/[q]qU^A p:NP+je|rQ"/NWTT:7#ު\5z,Pl:JȊ+(]X²p]\ nQrיoR=n\Z|F: i D466r[:9MMMzມCf8kq>2A3J;Vwp]ډ2uNa:0wArR\pDIk.9{-墈Vv-9Cdw5~Ɓn-[KZ:A/B4iEmJqGۤ4Ðu!p]yXmn?;ve]b=H#8н9 4fw;}vqw~mP`j8"p- _عc4@ϴ3B󃔆tHO>a7e+4\uvn.}Elws(۞[+v!T7Z~۾̻Jyg tJr k؜ܼ!ssP:Pgʺ@ٳq }8N8^G/)$e4(M\kC %IÍ^Z8ݑ[k &Q >g9VUUs+9hʺJ4$V}ݸ"uBզᄾ㤟(S,U=+>"66\odq8^E=vuuu55fY}ƁP\bs[+8*p}LBmwo_ooAqk7 [Z=ݩ=|bh4 YםXbm5|_5kE;eО p?4?c׵u|a$рI[Ua# W2?0UWJ@8 5eڼ\n.Ur~207؇mlkC/(d`1&L]_"K[imlYjq@LsDSgcR2r1p@>jL,p?>}S ڳ6}ᇆbcKĵ„AzL 6/G Jpcͥ2Ddl,#tu C#-2ݙ9 m-bhuݹcDl;=ktzun :Ƅۜߤ%7@ME&ЬX@ZqYwV;,wK+)Xz຦&ץB=D,rL5\YlKDr6{X6YV`жx'y=)÷t6>䏠QʉJ>e|&hkq8(xL}&!q]MԔ# njaƁp㺑T1sH֌g2[T\zŢtkHS\!ί,+$ Zc0ĉʭ1'>pš#[Uo.aO]:j`qYcܰS'8`03#8<ǹ{_a9 ,rq@qݑ \,׹XAuE ȳ^q\1gˠSZoΏҎgB⺊/p]<큲uȔ a+kT7{1 y@>Fq8`8u\;uu6;`8u=t_^d.Ui!/olV\r䫯2\^ݿ_UU=|ͻ뮻~;qLI7(』9 շ5M X]o u+ApU1|}"R4N:iǎSj+V妛n6lX޽5>i<^x>UjҗZOX567\bM=k+}$>U>w#fU4Idgg?c ]{wڿUKĪcYӟo$= T v"K4[J@\8#vM[ZZ[m7-.q!sp]3חV>èYn`iIٳQ۷5v_gy߮ DSQ'ډ,klKkZd+;V,$,R9=\%A> kڬ5295Z}..---,,$ ?---8XxVch4r MCc1 _"I. riwy\n:j#^UT'DŽd\l?&O5flVWW8p8B 6۰&[E gq7MamWg Cݭ=RBd1ʊBrCp@oARR{,Z=?QpbY 9Jxr##pxSRh:%G.r\n˩.ڛoy)_lٲ>[^DdQQ{y'|2aʙ5?n8 {ጌ ^s=v*++5k, ]~倓5kl޼}<{.9UkתخfFXx1FI3q;sMMM>}PIKI3Cm۞}Y?~˖-2$B.4\p^JC gΜIJPʄr=裠ͅ B(q@.~wر*s9T˗2333d 1L}SU): @W^oy) v@X4ȑ#aڜ9s`L@c&L%/p@ps|Ǔ|,EeF8U@:\ҹEzJzdIg?{C/%(|'S9 Ab]$ @1<ӣG-A )5HC+"1Bbwah&AH./%WdӖ0WhhZDX0- ZD6)Se#FѭtIٛ. :X`߿?1n]e4*p,)֍CfQ2,`1l98jq:/4q]v}]aE<.N'[i&)=;*<{ XT.jʔ)x0X\49rON;4v+ ;ܑ0n04 $CwlwRO/:r P5& a MF)  ۀGүZ 捦\~a ^$&;)*e\g7zP(iQ=ݮ/7}]ZH/6"ױ35oK S֗q<#!b+4el֭L6zӦM'#sh}wE .04CjH8AviYakG h)Ү:@wOАRQqZKv:% z%̷4 Lz7K[o7M+²xܹޯ +{l1#T5\ÁIaw:vDrE($W) %K夭>UGYi1$ ׂOվ g\ %A[ŷqkhݸng8nyΛ +J =AdU'pB,M]:B4 ș)YmWeȕG69Lz+b_F,0A$E\'`9(SqGyhimyy<έ }M .V짰"[9\cFrÒsn}:叟bccʒB/ i /w}7"q'iۈ=昻1 Si\!\$f#(R@EݡmS\G04f1SA'PsBԇg9%CW=rann3h6.b)%`a|<䓴I8uۜ-e[#€ѓ)9W}%L(GNUGBppZ̡Yw"}.=7#qe\*9a G9[TdL0ڹsH栚J 'HI-*MQi ܚvm#`CVGFM} NR8QMf/E Vj) +) v*jIAewJ#P|]IxuIJˌ@j< IԎnerrʽyCHR_<L65MpE*Q8g4*нMh dqfa@9uo,wb.>!q]^:C! 1=PT+7ąl/Cj.zr[NS>5Tb}^w.*eU*%e/8RzE-rh&p.iBk1ۻ| &jT.%F`9<0QfM1@u4Y+1,qs,+ ;Vg8q]717/0hqSt\u>wʹԼcǏs  XƁ4:S^\:Y-,*Ӡ%Fb9-\75k[`@) XnCS`x7i~qV? k2Ih{{ʉJ6/`?ex֍mqgg9}tlHq}2-쵱)Fg[Er\Sti2RJ S~8MB[0n$aU|IA]yGp rJ @!AD\/j0\Ye0Rula?$m6s:!ui#\+E%gcElq aЩQk?kaQl}:-q{ ׭SecŷdOq бUq]Ss V4O`ҡn.흑L(P8]]ņ{DẈ,Y.j=;֣6\, 2qM)@w6tg|r'-xwѷp]GJ v*14u2b׵ ?ݧ"? 5Hsˁrkľp] RpqXp3369fn*ŏFʉkȷq3/>lp WHճMYJh:A߯pY8*ɪj?-q \!4 ]8Z m\眛0\}uB$.np4|#u,MaFPH΢~†[קP.Vq+ Ư(=rs\v뺏ntOWm7cOa\}{NsԳˆQFq@8u:WiFD,o~XIѪIkvX VuϥW&lI(6|ig#s;6gY͑[8~޸䫠kfrcFJ,,F\Y mO?YtEevQ]b;=397[fC 10b%*VH/"GpZ?a >l%J8Y}g3/g]G〛n\I: ׹y䯰:Lps<,rK:/\34|A~mm- |H^4jn׍ctV^{d܉-l=r?H垜ߕPB;A^2MXTswom-jjjbG[^-2jG546}h8^j* EütMä/W8EcWĦP8K*=BFq#uqL,:Ż9u*$0NnqQ2tGٲM3sK -+Qj˝yeuU[Qk#e ~sKK߳.+--tʭ*jnnVjhi0s@>ps{e^~~^h1qs@q]K}f׹䳰(Yʸ_l4,XHf찠(;aB|Fq "dfޚʌ\TnKp9BຆqPsذgwaB30>hBL֕ 6a} \kqcKe~hwgp@gLb.k:i jLI1>{2ѵnW7kgB|Fq "zIj"|:KU`go t"XN\;+9؄ŭ|Ǡ̼ʪj|[/A8:qY0gpMi. "rdʙ&d=gV>*ٛKd/o2qӽi]7eMaCC\nc~70>c@@9-bF êFߟon^&SŪe"3ۮ3^ lдH2:TC6@P\be|*7yS cRvCqŎ mUpǃͯf o<.;#8%3g@Hpݺ}6>G@KngsvC׃( l/ϳҗ9M~)6E%3:S^\?ȩ[ ̣a7O#3'6u+K<;rVu ;үo9jj^8ȧ߃eXÚW"J3u?09]TMdb-w7z'g\f}7P<.ĶY3s~a0E=vQggb~L˨εXqOCpz| _&ޑWo=+t٠9̒EMMMvųR3Œr@p['GfPnɂI-ιȩKP0;+ o7W88a*;VM#/>U {{N+(i7)7Ɓ8 jemsLl춉u~~zOΜ'=BqM9J?}U^ӷ8.+#re,e]T,h;Oqm&v.QfG+v:+4כMO?]Fɍ7eT:>vuŎ;sNe2 kw7U!g 1kWa-nIq)LYE%6a&28i"]^ZX`t-1z# zF ڃEJtAsa5{kĕW@9 ck;N*^ls>f P:J [PIu&t62zȑZGۏ.1s.p6xOl2ۉ 1tcb$IȜu';N;+ZypH)q+v'J9 cI^u!wu>tf 'w ̅b#W3644ȥB6{JXFq`R\ǮٻkO~2"cOvSv?9=؉D8NZt+쯱ޑ ,|(:)Û9򎘌@8 ;ݑo3 4{eHwȇ=V& 8h.%aIuqK*js7j IkO wT-Gjk]EaW^Y%wMZ vq \zsZ {"2eNg1565Bg\6:wcc޺2aWr̄΁I ;6a|8B󢝎+n p] .U3}桲cN؋_ہ.+2]mL% 6Yqߜ`l?=9FrQc%69ήIE/c> N'é:v8WZThD klwdTɖ.2A |^Pu3>L $6j _]]؎vJUf0$2 sRuhf9+ۜ9pF0]Qqxradv9 70_Y  +JT/ _c?@7@vvv?0BLy^sRW:ǟSb+Gj7i-jͅ]d.#9+=?ƚ畡HOn?90p'bpacUݎ-(j^,|宲>5wʡk;Viq|Qֱz5Va؄erӜ}X~q!.EѐSN9%.EY!/s`ىuLtFE/hK9T\AΜ*;pr$8\ؽ].9\ qQտ}$ߕ[v^TReæ\A?@ ଑lMC* $UbZ9ۮN첪$Sp(1K,7uЁK dr$ H4k޷M464^{ 7ꠡJ |V\#:1\90B_ޱ~nc8jQLg;م%G܆B b}ǁ:F>pwF9]JTe62PYp d%^-Wp\|pgz'Gb‚nR{N˕Y9eըUyp]r:Ւr$aqԙ.Kyۍ/s’ݟkdxu΃/s2iWMus4]3~xKwЯ I~?0*.+}tg;A2e =3򖛪tE.Mۆs,ѡ@NNNiiicc#:=>RuI*V8P\'K;ا[)ͿnOn4Ϟ|,%MүGZt^T{ed0u15ݟ1ݟܛv\W]8]aϡCԡJQNLxsspz($Dߢa~\W Ćh~%QEѐа(uWzT86N%yw8NNNN̩[q8mNHv8:9@p5 CE[\ozڭ{UTTpo!,Z .KH#}[}eY^69YﭜUԸ6l?>Tї + #e-?>Q/~d][st|E}Ȣt(y2#mYsmc?Ga3S8u֬LGW8jyòsg-wI[6vq}'oFFłmYd$fZ=b_88\'0QWz5AD3ow;]2F$P"M#TFQhp]$;iEIoGUy\ݸ.JpHubIEt =UYi ^zU>K3wϒY[?|yO>^IvA'T>lpwdիW55C/׿ y%i??av_˦ߵ?z'$?b;s%<8]BQaD\'5~A˿~y"8 (>L2w*_U%mNN?!~;.8^QR[טK,0@Qn>0@nѭ>{uKp38j̙=Х^z 7kL^VpI;⤓NZdIKbF4<{Bq eG[~96?0'1ɎI·1ȿ?S }K`W0տ쪹 lrIF;ŗicL5ws ~̯*L`)A Զ89}v~o)Ȳ׭IG׮>jEeϛÿk.n^yd*[ 9jy_)O>GKn~q՗]v[lKK> *ǐ;1:sn9rL@j;y jY@;me,g|Rua?lCkM~>iYNbvö#"#\r]?q CPor ˿FkWV@'jc [ }+y-Qin}Du)6RHA*T>?j,P0>gf\qc{aﺼ;&8Q1`?/.hW5RVY@qGy{+eU Wu<AV8КLH/῿[nȐ!k!׭[q POE$ŋu}iz::;mLR5!=>$J .}EQ -@2ɊC4_%xƝ09m#0]A+@&l4un\ &&Cq {zK$\-ʮ8Oۋ'AL${H bpvr=n {/,RP\,?-K#]C<x{@z}=z` 0iҤ[nE>l|<{nRh""u}ffXYW^( Ƥ HV\#~IE d˗/ uuuwqDN{aŅ<ЏޠgϞ*#a3f  n Cڷܹs#79 =̹DY`!,ͥ~98agHwG"Gbȣ o_F- JGQ?wQ`"Jd E&CÝu\RڲI"԰*oNjJέ ܕOL߸oh&,W0+7s YHLV)0)R~yBanÆ F ovfyoy{.8 x֯_N;mPYĴi>cCCYEQ mۤÇyu5\sgv&03QUW]uYg7c^{\cTA):p{7O?tЎ({F(猃% ʇ~w_Sކ[RRB-7tӄ @\Nj_+B. w>q7:_~+b+Vm]W_}~v."$j*p)d?&S7A(ngsx 0|a܊,؂=O 9u#fsxM{^6cCpY@u(-c$qێd'7W3EnJx$u|* n)XY#i'?II:.dkG7T `F:v!?"%urS0rYc8sAv!#Xۉ[]c챑FӦLp@A*Tv7#쉳@Em _>u TI5lBlI׉`$|%/Euw:sbh?)(8`"ߦΰ."O:'wd]P\b"mסc5ǚ7j[@% \#C9s z(y$8Ît љ>2[gu rBj ?c֘8HvZ ғVflQ"pf8]V bq]!|iŲsvxx| _9=2)\G#;8@46-Ck ^Pumo&N\s]d{& yۚe߯ΰ."O"$RlP?ElT^c"6ǏlXQ\"1P󪭭-࣏> < ɸ@Rk8!B083w֙ | GoE(1PA:s"Ő utydɐa+WV•맠8g2y"zXoRH3g>?$rK"̞=M+VON:YC֌"vK_KjrC8,C2A?kr 0*cKJq +"+ݝM 5$x*t̙'q:\V|Ay DȀX'gԽkM83N,80a c`]Y&\zp9ď몫%/ZD$A G%KDMW`0'?I\ /cG#[gxLȖ{,[yee% A[m,\>\Y9-.FFqy…뼻`Μ9:/?~EN⋱$uSy \\m3M1' q ]'+uKI%؃h!g/$1=Ha$pzlZE yU^AQLAPDBŇ|O6uqpZl WI5q5sBsW)I䯄%FN@+0)|O@/;>ߡ9玣88q4a pn36{Z2RqqX9zvuu3TXuޤ$]. >|%@ ilȠk}ԈjWڲ6UC(>)h|eAl:y-i\͜P$p)Cy^)7{H`chB4G@Ʉxqm܈v}0IŬ@U7)ݵʇ_a{m'l+7)j̸npUUU>իQ%&?yZ!7o9(JvHΝ"6VBa3X bĘU|5+|3ņI1lmJr׿ I (+8Ɗ4.vqQH{n:u% `׃ʅD ׆Yp!y"8 c|žΛ4EU9_y{xj Ds=;\1# OܶkoR8Deu'x$BqcEqN2 iLԮ "PŅFlbb)5c H,X;R=@wec@ > {r$bk@ϛ.yt~_.PSj>C hs=LHi&S 2VZr޿uy9D,ؚ!bK*pK|KKjׁ\UezŽثrVvk61VDX>p@A¡6=#rd$$̉:)Ʈ,*K7u11Jgɍ8lg{lI/?><pT Opu icJȬNF .vh!1uD}QI $+HIj*C"gz d%Ai"\'cc w ZM{aRŦecws%g"0~ou \11OIFSOePy]%y>P>uQʔ@qeee!dC<N4ljIo0Oi}7!`)mAqF&MKc5u >UMMㆀ52B'Z .T&\pֱu:vZ2g@., ݣt!&9M6fER:ol@p3 v&hWLař+=6vDK4)8EɶSc_Cou2 6f?87}iP jYqwMzB#eo, ۷gp$C _Am&9)"k<%H}jE&O0&DXKYɪ׋-D$:g(`:fy-ѣhuWYF:Fxf8zB@܏I$4q8`mfIYӿjSWwv_{eMׁvd%H%}gHcCI ׾(Rxi_/4&z?D+d䐟o }tWbr"!$ҙyI =gDr%O3PO&Tu*cV 6O+# sp󰠻hݸsuEʶDf:LM0I Gz~(YźuDΕa# !ƚ}x-/>uQ'mSq]$MԧT$)%gFT2VS(^gғqg8:4nmm_{bsPPk7HO0E?),a*~xrNLq@ 'xQ#^}USp %W7.\GJNB5z'w PR đ 4Xr`Is~>qhпGmx<plA_[zF@%M*phMttenڃ\{ \QOɫԕ&9 e]>}v@]+eI7C5P wtܸԜ:2S,=R#s;'' CJz'D_LzOtLu:Ξ K)A19I7@ @V## SFTҒ&E-Is1r A T!FƉH/{m$xpQx|ha|fXee& z!S.3J@l%ո#3Wvd2͖ڭ0ֽX1#1+ !9K,l`7̅ 1E;q]ZlϞ=-[39sv֬Yt?Q1ƙdW=mxط-}x҉Hiٳh 7~;dŦw0͍7:z@B<ÓoDiwޟ@Gg:ےT:N{}kz؄w' 0*0F}=V霒Ye[& UF\>q.v*(ha%#L??aA(4yA[Up/@:J$ZɅ@/\!>/|VF`ۯ7zj  i8_'IuYPD%Qڀ0O<0Y)瞓bY]*s Q8Ƽy&FM$>~a*Ob6 yE>i_}ohhVt0z֔Bs rqԇ5R:Bx@=.q:j_'8S?|CLOz`Iʛn*IHVPHVAK_BÎO~9{Q-W8$?Sڕm&6κDΚ2Zd$a~3`^|v4ub("CX :YgΜY[ȍ(H ԨuI|\d(b5Dtcsp:D^$>bE,x\\G򴐃&gV{G6l',n ,'N`voo/?- 8}HVBP]"@Pѐ<bBwdwvaAnKCdTɓ2"Pc 7s1JI ?=K bHVH v=@9E>,>xAz\Σ= Lc6&/o ~3EE2mƙmEp2__imj Ͽ:BCxjhy|Amw2`^``1|?Æ ! ]x ̀6{Hgx@b?;BjP'$L>~ tiEd67k4L ̏,ڳ;)/$p%!B*WKyH8n ΅m)ƅQ W.7܃a=pUh^r@vՓdp3+ %9"M((D 7>.DzޛjeһpMqvO Șa>_dN.,̈P: ~źDG|S Zo-8E-=jq"Md;?JaRbB?.Û-dEHJ'^i_%%:Y\ 䞿laP>~赝O=B3zroEfySHA.֍uxOƛс3e\tpu8+@Ճhnp6AuN':N}q( ̵V dLSlD#`#e7z*3f׵ EgY]Q1a WjY9#LA@,0u5O JV&?,`X u.+}.XkXu۝SXs8lSs9Mu0]'M01E%RWI RWDRrv⺤d5y&E$#(<u&0hm`{5u < w:n '"%0r)f$2}WwɆiKuS5XD)\'R)x.p10$@sfBA7` ij\'r;x *U{ â]- =+ xM[o_#c]xqΝpBO(enav[|5K}g=ZJy%GQy߼vEwi $fYqA)L J%wL&4*dU\EUFXw _52` =gTԸnB(Ӎ`L1K$|ɷ3[rw?z}M{{p #B*sFH.[)ϳGM8t#wO/":尬[] #*M[yKu㐬x5oSLlQ@&N<ѸNI׉5#ȞַT7z ; z![ $[FTU+ R@& nZ]`j6}k!ͲR?k/Ԃ5zrf{zUYW,ǵ-:qXnJɥ+ 0󶮾G:NfoW\Q-0ÌyyX]8JzwF 7 Eĉ Q#ayTM6.|F⦓&I\$YB/h ;5|A/@vS`޼yT\w$<Xij3wKR[uͷ*0G ӗS:RtX7tl3hHHǡ"`jq:q*WV@{-03lj_mlHCFdF_$D 9R mۖYĬZe% @/NB%ᐛ+ 8`mX证49""i1z*SqqA݃& t{@$d6 ׉{GM3ԉwD>kR\ѓ3anJt(nW8?[A=&Tj?VWv6x\4vbSqno@4 @ \;G#X`J΋2{u%5HR )`l!6whf5xR\|e 5' 1;:)գYN6GN"$9P3(5G;GC8FvUMTƞtjkJt`ؠy1̼C|j(5L䂰+CB "ԩq0`2(9kxyL)&Ԥ(Bj0al]ynKsx{M-Mx 0a0pPB JPTommw2TVg.Orn 0l̮[FCp4wPv01${XPʺ Ir)ҖN:k4la Ja{G~ V{ApyҭA?!oWE羵rM 5P uEީN2c_-_ⱅċv6!}%{6uTI:5C4RtA;xRkiPbc]|sv~P~k,C5TX JXJ!s3d'o"h dr6V(ͭm˻?S$i)Z@*( |؏ݱRPw+O#Z] Qa(ʋZzd]धG|#Cu`L̅o8n[ a]yꢽcX^u09k`, 1S?_D+etݴ?|fƨ#AyZҭm6"}ϟ֮•)ݾSӖ5!W]8zKB 蛃2⻫a>:IJagK1?j}Y:[).s`A}O@)w2`'0/6Ёmyq랿j'v,=@TKoOMzGn=at)jfl.f?N;Tx*WLJخ6[ uT\3T L1ױ/>qLm6wԱPB~Є4’6@(,cLNARЂnxfeqkS3_mixW*z'1K}b -iV "kJ颀=djs}Nó:1r u\u{W>'u~\U隼YSB8W6B.9'⣬ii4N y;ܾ 94|."8Ih5ɢĂԥt ʅ07`I;WDX L>PN) ggʒ6ɚqO$Į C]M%$&I-_e&sE|HYр5Om rʌXon)-ڂak^vu}P'6u_8dk?x}JX$&K(͝e!>bFsn9!tup9b/3ۻ.^zCt<*jA/pG8x4k^H)٫޺ܷP8ux"Q%:hH` _\gT ;9vI45{C";zyGs.(G)!4aom8bJXiR 1 0P dS;V0K,[ʃea(mFL:wk{B,=>WJ@R@[3dSO=VyVXH{1>q<^$p C2 [4)P gE:*a r F5k첦m}'C CCq`CdrC7i\k6k YlV*Ų jإf"+@%Ύ"o2g>SOXKI" @@zÎvdMH @V܊IQU<[N`$@+D)ni\dFZ{IxdDCƭo^Y{WDXv}miirPNp.k>.q<bd$&vjBtuw[#Cʔ *.챵ՆrʌR>z'Jifz:Ats Fс ZE*D>yvl5;W;:)u]W%Q/2&v:E6EkgqqQ%FD!HDMlbyEr֯) LU3*6RNöVO$շJ)HwԙMN}vvϗo;Ft:::8EBt */]gٸ?g1UfU)68],nʲvƟdCg,ia5;:ObBJ)Y/^,8` Y4\Qs9DtDBX+X`{%g+dp"j[ QjZڠ'^ ⧤L]0vTi}d"pۧCpT߽:008pYSsi)-Z)0O/ic(ל`8s޼ru[Ӕ\xt0%,Ԛ.V{kڌ=$˘gϝ_P,-Kv4+ZST^ ?9l'lKg/Lqޫh?pu+4a2N+xoa$e1}elyA [dx볧(?jgFO;Fh&>Fʾl:=CxϦWN`2^V<J6Hxe`/P"Ţtp W$|)R N wgWF;'I1AP* %-G˯7ޫV(LTl9|QPbYgRyww=vh4n@M}<֔NmLYVt>71Q$"\|)Ӽ9G!1^n`̯]8 Y( jXdU-Tj^<Lve. הIfKP3T50q 0gZDy)U!jJ71ncB.t3+RMƤ'k0$vpc6V34t]]ݕ3di^D"hVJ\Qto1n!Z7T3L!sҲn~vtu0ѥn1/qxLaMӔ #lOm?d /P tDJdQ@'  ܾ y4~t gœׇJP@X%ҹm^ obLrtwo9- UrBpep"i!NNJkMxWZ0g<)JjcSD(dlm?rV)"3[.<i^)^ 0+lN]E DSs":ξ\ltyqsʒ`ѡr #:6m ޷gF6P9Ɣ F@gfO2 }1e}E#2L"dPpar)@G8f)sNX^eoM+Lpyh|}^WTa./%[ LaFi~;! ؑPhÛ-F#%ȄHSA8Cxq#sao޵A𜷩(TT (BVjQf0ouNx5 FJ7Vܳ}]\E@G<*W0$M=RIoJ ToՖvva+u4g\-Gsw/_}]G(;lAe;}EG,v0xjQn,Jt$zT)P d,`HɐZeA'*Rj}tfpVQX$ K^:otp`482 ͩOm4M4DVR.`cKٸl*^RK"Q (r`.=# A W,d' }a;WPޏ)=U- n=~Jp¸%]kt./WYIå'G%! o&pQv$60_u-rR@);F;B'Nz]#ܾ2:{0ș_GU3g*ab;}"0#ЃZ0| Ϗ $r 4VC)e0x[u2guAP 2X[@Ϳ_0:wmVq&#ҹ0O@1#> D6ti>۟9wѨ,L7M u,KӣTR (⢀s KɍV8m+m;۞|˄G?W+aJSo֯}k?OHIiYR``qڷw6pƥLvYߙkx I9+#9k>Edʚ|5Q@u.qjWno U"k\EShQUv븝L= 0eW!lQP1~ƏP'?/~p MPF~%;nClJn &k6VJn˗/6m\>3sW $Lƶ\L?'νY~&#[j69ս%[?y6:t/s08c ҹ,}> Օ ߑ" ҧZ@$ڰ 6f'z6CO??fwy_{H# T!sIŋӜ_~9sL'r{\|öPNA D-aG& k3גDEEE9 "!`Z<wCufѤ09 4{^. 0JKňcAS-p~'DFGA5R=EW؊+b {$}s;w~__իkjj<)..MF] =l7n֜?ݻw3٠͘1.]jsZghロĀϲܧ!ԧo&@UVqEH@Tcr7~}c.J$g O?s-[EEE|X XP%86dܾ}$80{lu*ןJ 0bʅGF8rtw\_9A͊䙱*VsݱmSF*'3E4GR  P,l\7(,C* 'A5G)*z|PޕRXq6G%@yWL/_<\o|+eID!sP Θ6pOHi>AE8|WUqeesg&sY1I~oWvAUE}seN嬰g.Sz9MzpXi\F2:̞;+ŪX@ڵkT.$k >\C0a>6C&)BQCp?y|ydGy]p:3DE!Eo]փa%H\,Ѧ ַ~LƓ qwC6u(`3׹r৓oIQ@ Yܩo5^{0?`{pþྰPn a]('CD 'd>wnQ ;:{0=E g2;^:n1FF@mcP B71NΜU)H9O$a:B^ 瑸-6:q@/DugCܞx≟y׿uyQgDC 4jE&΋'?$O,Ё&).VC /MF*Vnp ,*U%d=,l72N{iCÛzp}S8k;@nMrV(''CM|'u}7\?AU y{ɀda;5ңғ&)M& 0Vg7eI`F0طo_$%\к^رOCyqmCbhd۶m6dhqGRT8H0v]uH@Ny4".U!g>OLi"qG}RFfzw\?4vhg޳mUwE%C(c9'CbXzՈ,FdQYAq63dqG֜ p \2볠 ]juOo jYMuؖ(ovʡ^OuϞ=Ek1DvNGT'8p0s(6R __fm-yY~ Jp3(~{G?:I:|K_S&f uDm3xqD0^p! ._D:*ן@T|܇n^{"v<~] *Bz_^j<`Pv(t&9Y hHV(cfv3ĕ,ܔ[[τ\\ŝ$diH~glQa]V)^ 0*qHLJHP%E?̙ќ!#B:D}x0#[@>׭['&WM:*K,y,{9JtJ/:_8=Dvλ!S(O[ >D!:{e@8Z4H% H'˖-Fmx$4^tO~YλJRtvբ³|z Ҏǣ N%[k6VGsўwu<-mj& =kYiV߹pAXj~ippȑ:_*^ADqb#+arA FoIXHOi{Y]fxp :JtSX:NQ=CU f l3U4&'N=6T.>@Xݖu6-pE;v޽<>ʋ47a-&`H}QMYN׿5 JX$de$ pR:B_WD ƽAh}]% ARyHDmA 9*i`D "$Z LDMs*ٔzY"/&\r̅Pq@6TMw &LK,W{|cX>q՞mPYu8ީ.sA8( Yn쀘8&(KqhK]X@g\LvϜiQ[(GWƙO!dG;3Hon)>sf+=.a򋏝# å[o.A]T'PrԴ~RkW[0 ^ކSgXSYx " c{f1"+U@V\ B,h n B0lT?!mCX飣Y?L7 0wo\~sVQ՜>2YZSƀg1bB HzDC#K_hwbIY&twDAd`~8=D K].`"7Qa Ds`S)15m7m) k=V({e8rD6eiVH&$|oàt464(ľeNu;Zt*(gTq\,"N+@ Dn)V/ն3Zg Șd$0B7b6&U1A{|f\<>fX9]塬* "'B9:B Yps!= 7R :"EEF$è$:2,g&ã#*˨NLu@dKUMTj0q!@@\YD ;3B2s_`+:cŀyrS, $D)eUUErR&REf%< G7)Pm]ʸv-uՆW#O.T+0ubK øt6#\z 5Hp9!L!@ljaۘRt7Vs'/mzxsM߇we. $Yӊ\Tժߜ3R%W,l`'?$Ì.uŏ.W65$R2;fK-JEwY ouh"&\\e>s6N@x \{w1Ѣ8!D+ۂU`X,tb9YDU.k+eqQ\W $@cR3<ݽ} TQL$~&sa) D|rKpҤImJ)3_F}uWlPgD] rJmS֑VG8 @zb9>R &r>XEb9@)rQ\ T?Q L <W3,ɲd2og.ܺV/뚨H[I-])0`OJ*1gNI@_@RX G=f;Td(]^/ frBEEA=:f2G`"ˁ1YaAD4S. %@CD)D 0l4,F8aD:d_V04Y1n6akoڢ 0=6lp"揬(V1D g|e`Zﮣ0CqB;VEQ޾?[pPè ͡f%D0 =:"`Յ,&F7J) cdX' 0Fԣ54`}6#kV4tUF ӛ =kгԄv9vZ s*7jN’KAa2q"N($sRS)&`"?g ?L- &iG TCcl6N^Q+ ]DºHd =/,ģhnm"M*K!X-2KɪV( vy sQʕjf;m+| hZjiS4DzHlșKJVR)0-`}+f2 c:-dBű<<&}ڐ"'̑<Ԉn_0P$Y I|D@PtȨ~niL:@G޼|Q`!:XsDDsMXYq)K՘:[):Ò`i tVw[ñM`b(F{6=Jk1=<\`F njicnSD{EDCGe56d"h)lγmm뗽yl}`CQJ®.8D(59y\_e lLا6]WgL龨ON(>MRK.@p?ubV ^Lj8 z,@ǂgזKow޵lõƳ m$c #g5[S+ҏεkn6ΰ3lDj$}}Wu{Mlk"մIfBDvƖNJ9ڟ )SvqU'1ju v<ϑ/eZDփAu@'BE; tJYq-h#@SQ CXD(if b-Cg565iQ:$w㜉:+qm-p8˥HL" [#s35s.-9&#6'`Q<+ U*A}`3MvXALip?zyqJ,X)v^R )#";``3@94FvDCۍztá&H jQ*YP~iu :Љ7OαEzWekO2LteF`'z Wٍ^w0Lu^/ϰ8)[LYs(agTh4aup OlA&,`g3G|&XN{s^*W '\ѷ$qT87!k저:3lGWF7S A- x[w[ 50/ˢȠiUS@Lbxb̠* !eOqP}d}pȇܥ+kJ&2gCpV\\QbAG[E@>V5&hJ@Sg"Xgؙ D >8b.R 0wa݊Fdg_R]b@!3ŻH At\1Y 蚛)}F}S)SSFpZPl[s6NڥY2%557]"Jv@GDv;W0g)"iagI@g|A`F?1+)d~N#ȏ~ | _?q\ɰ%!&ݗ}) c 6K 4L䊕R#yhuAq]SpBoCRCڀ ;)|#8MT@A%89dD?W IիWϛ7/[h۩'ItJF?3O\mYnSwt!KSH<'`r@(tZ#nZ\1 m7?^ i[m;WF$x ::.]q]IA )?>uN=6ݓznsvϝ| F%JuH5준 IJùE}ଈn$ DŽ}*\PT'!]R>g6* [+2:;%ih6qQ`u}Ctɰq9M WaihrPOHjdd6!?1M3El)M:BIJ6VnB?]Bm aAb!Bmn.:8@XJv|]u%iGtRuf (0!\dcU\7+/@)hI᢯_Lx|ħ79 ~TwHr7Dd,!hFOOOY1Par[B;BZX tlEC4Hfjv@M}X &]G⺩"1`p@ɰ4= XG *$6 vfRJi)zC,8j^YgM P)tʦccnddV@ Kw)n>t ߛEH:]ٙ%@DRN],+E} L^-6򵥍 NIQ[֭GszD65[@VR)xN bB Xka 0:v=d)~aqmzφ⣯7fPwj߾*#0X@t#⺨@u(7*<"#aJ2m\-D7֕7zXJBm2gK' -kDvX 8+EЭz#)7wY Kš6pu{} II`+Bjt(p",\E}: ĉ,b1|MˌmiJjΓP6[ͦN5r1Or6ud;) J6r&hۇ??le<\83`f^ƭo5nUm̂8s$L*3Ph0je[*/KE=M%5\K~a՟kퟳqjc;xٳxַ"r[;aݠYEEEh`QeC7sAD~n/1Y3gNWv]v7tSFn7iL:V:k`@xWpTΰF5E[&$8A4[iF06ICc*wɞVX؎GO']odOv0;oG .S;/ sr F-CxرcjXڵk*ֿ*x5ի՘ƓVހ:T|J>I_(Ya,2tm bj߅ fHPdȦE%,~}+aF',y`2c⊷M{w 3^IE+TB7F u C 0;D>9"V=_mL:@^@Nu 7zo`~A8~v% ,c#X v-# 1 @jcWQm!@b8|egf''2LKY]XXAj11Ek8c $u]L &[|INNiK.w}Mmzؔ)So߾?_|[j{;~xsϵiӆ=̥>}! WD_j9޺u_~wK"[j+JM= Dcvك"M=e%Bho/!!\[FVyܸqa}uXX"~S uQEd̬gj`#1_ K'Nֿhc_m;ŽIJ`$,~~\kDvCVD+Jgy_|3To?ꪫ 0u}@LFHa_*oN*c'BMLDp磍^uJe!F:OoV{7M!,`rE:nChýދG L2'''UxΝ+'yE+!+@'g|x|&3Ǚ 9,CɕG~碤ōIM#jI9O?42MÐM5 G:@^'sJs[v/#R^pTLl02TVF! ,b6XQY[ٵK=_s쒭!^[{tI7Jؑ2䏺6Rk]u<( g?B`rU)=:7H[sILjuLNx #LLԝrɇ!(Pt䇸!S`Eqj/-={6 "k ?RZ۶m_uI;IL^0uQ&=Aƥ%8T*CSS,>s\VG!.)S l0꽊@}/AŔN_jx3Jl-?um?ҿuZ,~פּ_³6ZM~兔Y[3JxWtU;𨕗عA*oAioL>\3593ɏEIs#`$ÉC.oj^ `\uKq(| J Jp-J9Uh 2y.r^x"55 G"@^twOԱU6=L,$eoY`{"yCeȅCY"O'ʶ ˁQJx6O >0{ nMKszmGFx]q8:B 7|38G6l."3.a͔_/^&'{qa*A >|8 JySz|C(]EqՁ9@d*# G8vݺu Q* azġLttV] ָľJt!/y x&' ~_9DNRҚmFU fXC^%-a䩳={%J6hw)#Wr0<(i;ŒUvd [02`i{er vQMD<>M.?@^|T Y2dAj}z7}WnjCNx\Yܸ6:rq-ž R8fz_$ʥux&-NZz(߹(^ D;?¡/FچK fu|qY&0bDdB)q'yA,bAGmKs.`TN{rl "XHWKmo0*i3rZ7݀yN=$u ^'XALգV0qDW_z} xCEGnݻw*V`뮻ϟ_3g"(,Yb '[ %ѣGT&μΰ龜aI2 6c.rȨBd&i\!%IQANM:}"ϓ:b(F{[Ν ^' xŏDO1:ΪX gPDLF􌼋yy(xg PnOFF\zj,-u^T^EEk ` [cɀCwЦut1K|w$_VOK y=~5Y HvY]i^$RQ#8h-D|W t %^ry]F{b,=&n'vي|'|tN^]l%&X\(UhL½ZQ;Nu/.E6 = <:Kla1|(Ƥy]ܪ e}El4b+V@@/ apXF!iӫ33kybV 8QBÐѻB}kkJ>j`CP;>I>LT?P;OIb ݨ[ϞЀU &|G c7Nkx  AleD`Ku -Yee,6i"7-;PZ;CƎ0q=}gyul32mVݍZv]c:E. јim۶Mڰ(kn#-ٙ [&CJjFB5]u|MV\@L]eEAGtG4Us# Q0b[QQLJzR0swPu mL^셔:ؐk׮~ ڮ֗} x BS_[z^`go]0d!cR幷ӝ& z0 {b6:\1}"4 ;# gPcň͗N„3"͂na~Jf6ӭun:rȆu]up{vevM2'|ҧ&8:m?Y؊Ȟ]S`givvUUU96 Z"&!쾽sKO<ַRlgwNۛ6Dy]G+CR^xW_}[ny4PĔL7+S^8UXI^nFbSY]xW~1~![k+@hjW̨/txRdf匟[#(J%6VG3t y!i1g̴i:i:a2#X@0 sRB/a+AD]Lm䤱ʠ.s$vӧO^mΝ{9?;r2a*'8:::))?|jy._o64ȼ䉉_~ << ֭[#Vݻ7KiU_X[[~t%&?`}oSܺվE gL=LdVH3UWh>wg}Ξ Poa#$H7|34a^#4C!Hhxo}\b"r9qrk0ZlW~~>Cի!0`ʕ+Xg8-\"XapJ_5)g5np>kh%ؗ\9d IxPz>ZjIi6eR\rR]vn uJC̳LBL%MN* ܻoAr~9$%iqI@,HmB^(oK9fm倉)DND@;N&#|:o#bq"H>0mxyȣR/T5"93]ntqY 7n\7) [ܗ^DLq=^C0L`>f Q-D(j` x1>31 ̳Ix )JCҘa~?M5̙3% M5ς:j2pn=O:p^Yɞ/ٸd9&qX#-$h`R#sn?8ʊ;!A3 NQD \gMu0@۱{L=}'}@~ĉ&m :+)%L+Qnx8Ok;hdFK۫7 [ rrX,h;2!Ç~yC0pee@XI!Θ?35:j.5N"*J!DQ:"-g.Aլ.hkQ@ >W:ǻT7 :0:8 ɳZob]/0AT nO1!BlIydPG#2cmSljp} -SC1GfW:[a༎a>^^J tXq՟59:H)p T۸ dqa yEyysSCsDmB%:s՞;0s4]P[ "S#a[_Zÿ )x먒yQyi9C6LyjKD9YWnt񲺡CQ㗕 l vk5Ҏ Z" μ,RCN`fy Ɂ& ˗/< bʙ:3 YaM䣷"k%0E"5"r16]|CNbfumBSQU o"3 up$ GZfE,/ !~4s%ԙ1\0t0$gYbdJ Eu3г]a/͂^:%uC%( wH :3ԋI) ?tb}p=:3or;|)Ĝ7e^zrRfO0%1*Bz'L:5{y :ÿzܢڞ6dy.;P;\hɡ¤6^pdFVaVF*k,xSyؐQc*.`8"Ϩ^cQzRPv|Wۇ^Sy30 MŜ a"yR!lqlǡn@rKibu:M4z荆e!a/JY/CԣUP:?yu'ӳaBOag(h9ѱL-3u 0vM*i"ܽ&ȟϊN9‡Z"DG#9333 O`XPaԧ뀀?<\r)B&IAX@ɡ(`]WI<;wM#U7^QmEl*خ:\qywP0w?N`O^k+ՅxE P^.b&+V#ibx&VDߐ +F̵hE P^.b&+fu1UPxЌ5E[t+uױS,tgQW"|kɊ@,!.b{3y[T_ڇ^1BmuD HirwD"5L/e+ľJ ~-X ԭӶ}ok>8r7%mowiۏ-\-\k3DI}&vܡ>5W2"Ά4ATLup uϜ;Ry>ŵ*WOL``( @mK|~6h̠DϥC6fx&"3&u^7>>l^|]w17MXlubD|c4QrAT/~Řեezd_ ʘ}%y߂ެ(Q٪E/RUbQN,!qjEoL͑m]M눓 M-?~g&|mu|+ڜ Dm5:\\gfm7.~{Æ ۷oǚQh0z"<?۵3~ٹΟNmZapĨ%޵x3;~"C4^k L~؁~7'MN~Wzz:f`/2R&%X\f 6"uu瞣ewuW_mժUrr2rj5j,Rz-xuC>7 BwaݭsSjӦ={K찼j*Yg}8Y ?.β_[l9Mv>mS [cH),5|îX}]"`VTFn %w3iu QsԫcǎP60&G}EɍwݣG2[$e2C̙3rH*Kv棇(Bx`8-*sW.V1lVҥK!4UFFEaB?Ś Gx.?_f;3gdvL=̼88{'Q d\B!`>La}B{ 'ӿ%&9ʄPP>SHeQ.'J¡@gU40P1?oʳLW\1e9l9A"+oJk̄׉Īb= F-N@{]Gx]B\-GPB@H_,rt/ _bd#D ץn=.zj.UNG~H]\ړhntH0Ϙ1b!-d34)'55Aq@]k֬ˡbj8LbaBƇי:Sa\H, IëLp֘ hD%`J˒|zɞ={AsY|Bj +Iǩ-XtPcQ"`Rwы-=ݷE|9r$ ZB͛!;Ҕc{咝}W^y믧1ד6^l0IHP1{ tF !2>A_F P[0!!(I;W?#:<&TVOiYi L|G0AO>'Ii=ŵ"z]"Z"(ӿ `|8W7} >.S-raZɐ#Z4jhr>{*[DdkC0D:s媹$w8M.IT&"O&oA,SB8͗E@hH@uSNG]ZZ`cgZBLN7ui\!l18lgS9RL~h5ԕVly6Mh&1%uB[QDG^I(jR%+\H:FbuQ^ c1 <.u] P)4Wn4DZw)@ `HגlƐ:vmRG`/ 1!L}^̹ٖd`e6Bv4K!ΝNC5B4#"Qus̱p9l&^5Cf O U )/f,.8-"uOq-{A W怀!u\^1@,oTYYb70&lâ.7Z#^4VZ`:A321濸~1љ>,\SMo*+!]RA չ;{&2 <L:/1lSguv44nuoaITV^E(!uBN=?G/7s UW/H5"DB>#s!u_% lVT^]q^GH=Bf[s{ Br"6NNaiޝU[t <չqC( ΂`,o ER5l'*k*sN |kSWX[0O/j\+!^͌fQ/,IP:( Lͦ(ш âf.tU:EtMb#n)1c ƒ.1-kD$ha2] ˽KTv LeY1}"( Ξ.ի`oۊ>vY<֟"(qpŬNx]a6A5^àf6eT%)՛GDgjnJzaE `d8/ZP2Ju=;AT%.c:DuGkp[,oS#8S3TjpOR7+k!Q$Cn6@QPD8kVYNH^nٲe׮]a-V=djG`%k% @ԫ LfjmcM%uT3+@t!nϑ-3]:e)nF5||qHВ'($̄Yօԥ4Ko.O:t%+@# c &|ycY+<c"à&)@sC^&.w~~3M0nQnC/r%E@ ۼX:`a:PPX`ᣒrmF ]aN+"\[+5"CʀzYwމ.4a!sN%zIPC@)%҈ĿICꖹޯ/_)=PXD@.\Hq1A-vJbMQcY4"  PI!M)@,#[A)nDPU:줎̱Mx}czJ#K Ci&g;=} =-w"#K9nt`7vp?V€!uX_%7IJ F$QR=bGKqԅ}"E `<~2C&{JJ [cuFPoiUKou"K8#.'Cffd>3}ITRl_m"u V\SFiKݐ[^JצE/|}9rm"j>_~%mlo@?,jH๖;HtFx9"VdC/Z3,Z]?bEH|kQV B{ dQHX++@E4uh&e'¨zX>{~HfC]vǝDc " wahnn֚ άݸ)>ε<#n߾}(GXu;3˲Xq|ڲؚbB˷1Fݗԅv-SPYןf݇N}Pj(%1ԝ|RE RSi,%,GO7 9VUUAN:(E@kT3W[)%ęDҎrQڮzU[@oy~1ZQm6 !k̊"03!v96]ߙ.-uo. Erj0qnbazi:OѶ6wy1 uί_"A北f K֗l[YTua;-=:regvC!b]FkEֶ̘ڝߊѤv4(1ZAe>)xsR:[y9!{XjsEc g+//g;  .A;C0:!8Gu \oT^Qu +JuB'zDt8i}:v5맏P&D@v@AX?LEa<+[HhE@pFܱ'vk 7Q#NjWHJ/4Xkt; wD*@l")1b E=VDs1fB],M ٩ڪ捀||eDXwyEU ;׸URw6At;)h戀 HoXS:ms"*u Ylg@3|΢M5TYƮIlHL{ 2ԀRE@G=b,E Cfiqur0!;A) z$=$ئJE@PE@hZq\Y)#׉RW/Jnb_Wq QR״/>]PE@PG@Z>붕GB|(|MH`QǦ۷ouS]_E@PE@`Ab\gE6=ipaCv}eCtKB‰Pk(MzBX W_}5jTK֢E6ĸ8uf[uBꎟ:7,m!u]VKWR2z^Pŋ?ɩSOݻm۶!,YR㺣ǎVuN %DmE@{7(ʊ"8@BW(\'ꚲmucXug'kZ^jSE {/p*QHT<7ʶRw¯SWy#.1g:K"O"l\Mİ&&?Gcǎa'C]rY39"9rĜ%P&i|=mٲ=Q>~=Cmzxm=յ?zݐ)&&Eo^7qn-,cmkK+NwuK;w21^ x=E@h|FyWcf 0@*Cl2--+$CV8Oumڴa3}ݒ2͛7[+BÇ$:p@{eHrKiE@/b\w1;.q|W,YbڵI&s@/99^!$:N>#s΅=)'PUʕ+o&JXYOG"z4[]+-_P :dF`C|$oح$GSOε ڠNF М":vH1cc0SyOZN$3!lzkiE@M[UҨFDIBxQa)b:^t]oFq-_Z"4uD8aCUvՉCku^{=c={cuѣGG9۷o.bHUy]4 &ʆ}iak> E|7뾚iem2/ M4!uzӑ.v[W/{0j]M[m}"( F`-s^Mkuxr0IJJBvՇױZ}GN#CA#%yHtUgUy]4 & >믹"0d>`^W;2|ɳ#Nj:xSTTWl$^ + }#[zz:L`_1F)'loYb?i 4qc!{Up)"BrW?ixs\Zi[U nh/^ r^~v^5I4~tZgE@:DU 8iBءM=1!t'C(lFyc\ݙKx(tj U%Xz<$^ yJ>7Tl^7!/l ;5l{j {5Wj "BG̎l _Uk{bULlFĊ4eyYX[5q0:l fOm{e{ŖXu1jEPֵE55= u92ׅ 0KhnVo޾_HҰM[q)E2%7r ;sUUR+CSVVm #G@>UȽSFCQ:oOm۶I<>m+T+.x fĸnJN #lȼN|r랓=fRf)c5?:"(C@y]a\GDM_^[q>Ua:]H.=5W|A)Q72W4"(@"io7C^\ȱOq *܄њ5e2b?dBf.\$~"fT1]/ZE@P"uA^u)1+ڼGHqWTb&f\'⯿2RvXE?$6 ++"u6*JnnU&,^7lOĉb\.3b7RS|7{E1TeHG|E@P  a&EiDž͊׉qݩS&Yۇ]]w^T#1\P_?bUպW\$$l2UBPZ"(! sՁӮ>*E.{éKѐ4NPNZTrWnݺsN­@;uh&6SP J.âUu4!uhuVZZZcO9_T^3e֫:+^Y:\nlvQ@q/6/oݚ$D2AlH$tĺDo(@}f3n c:B0^/i0IWam71'{:SlӱD2Q"(SaC_̰LtMP=Zp' _|vV͊aa qӿ\ݨ}IYp1ou@ApZ"()A fmy,euژG8:1̈́д a'6o%C`FGGF-Z驘.Tk9"4 ;*(0Պnǣ֭[׹s{7" 6mҥ+wG|2vXQ ]"K1WI`}4tPPb駟܌? IIIMZhZ|9[qqqF'`N5~iчRǓi.LTgϞ/ҭZj^٪U+bgG8O(޽{/!!4Du|t }ð ~vo%jW~jNE@PŠ6/0"  MB{B]Xugt 7ù#GСTcÆ >S?Ë/x=yU{C(Gy[h#?y($t;xG!]#F)v܆By睻k(*h/\Ғ;zh9^wݣG?FM<ꫯbƽX`'NꫯHuTY>l3ls0jZ{-]TnfdEF?Oi/9x fs9֔{$ք[LW\1e9\7xn ȹrոu8(磌2h ]יz+|xl5ֹ.C)Mn2,-{Ƅ1a^qf Hl:DUF mE@P08skc5"/K:ŗ8sPy(dh3f̀ts@~5p@A<^9_5H̜rfϞ} 6\%/ CPs_~̡I,,,!hEM95  t뭷*j۶y$+`? k(_Y6^',-.).ܐD8pލ^b{Af^wzA^|-5"(øv,-ĻL/}y٘kuXavCe!g$ΉUBЮX=)I 3`Dp'fU:DÇ_wu&I" BWnt[HoWE10Uy.o2qtQȧv򺜜X &ghU"^+|;sjndN:⌝,oω:1CpQ_ N@ZW |ͨ_ S% y- P8ŚG4,󼎾Dy^߸ l4/C o3}W@lkXA&1=e@yE@PjGyL]vKhj CVIKKCıdƒ1cpi„ #F3W_}pj5C6t<6Z0C1K>t3μ%[@x ACZlIQddJ3?^U,^IC=Y dB N=J^^7gPA]2Ԛ7tO<>Ph,R {BNshsʕĔr}]:r8OL<*Zԝ@bI~ #!pH\UgggC83n8b&y^J_4wNws5oqvI#aLTLGPB@N欲"0챟Lj fN%|UFHO>pU|HCgd*1iSm&_b.)G.q8>Ɠ Ran<§6bCJ7'=́0G:ǻfT3:x+Q^8ќ"(MS087Hf&훼xDRz񺦂WQ\^xKsssJ%al:hԚ6fJeZN61LwY!=iQIAWg+GPE S;̱PG(+7g3"Mj.ߥ:b t裉Gc0ۼNdعMXYxݘ"o+<:{M(y5(^?V3("EDԎP;43y݀yN9QNy]cP2// 1~5t:T|-' >C#-(?sfALjWlUzUQE /RA)N j._+üQeڴ: 5hFuɁJ)={Ul޽xiE@PbjBݔE^j7$uәsB{xbQCr0h'"}%s`ɋt8jX@ȍ>1p5"(@#Pu`//Dt._pW/y R%gN ;|Uv+Q%)ݶmz hDSpZ"(L 41WIݸ^pɩym&pQ߹ak%[ ߦ|z?q%wWIAstat&2}"(@#P##41fɶmZjߍzb:>@,谣[^Cx]7{HC.?=Ŕ]m㼂trYM? cJ׈z{2"4&:ݨT<2~YŅ&v̕WĦ[nK,'VoU^r 7 LE*sRz^`fVk]H2D~5՗_ۥ(@}0Jl{vL#{vWT\:[~׵k׎]X[!ԝ>}zW?5{l͙3'bu9z[[~#:pq:Ĺv={ÔcǢ4h+ҵkWLMTْ~o7l߾ }azL{~~mKHH0E[&'~ .]PKv=,4>U]MnL<(G2ǍG!Eu:VyJXZi-|K?!qM_)ty`t≻++"8jG+sˀdB6yFv: `GK.5XoCh#<hbȑJw2sinJQDlFF'3p?0Cv;A!f߷o뮻2裏p 1S_SO=?XZ:@x]ω+-fsߕ QEi&R;kkvvj'3J$f8zs d1$V ;"(@Hz֔Sѣ⬓~:  =Z""~ XC&85q`wj D'ŋs7UEBfdx{B,wիWK1c@ޠ^(On֫Z[$u6mJD;?,kgUM~#|,Z:σwfMκ&[Lo|4cm"L(*J;K("ةS1ԺBOi+õ!KU1C! 8 e )3xjZ3@swT 7`n!iiT^%^a2ǥLSIwUݻ83s:u+cX|:M-BA2>[KF}G6ՈD:Gl6KIsknauDA]>wtZ/ GBb˴ "(5m]ڣ\3ԗӭI&xݰ (Lv+p^'BHjS9IM䤩PUx LxD*dO)i@9S`"p%,䤩 b= "> 2Cs2 zLsW&"wuUtՌ+kE?t!νСCKn!dE@P JUP2~QYZ{隢q>\Zn&tsu[nX;C @[<(w:sᒀά_kL^++Сc 4HOZf+)Dx_hE@Pb&D ~>k2I PQi b HuA6Go/M:y nZOv}RwO[mr%L"/xs~fyJvaMf;ß"(@\1\'؊Kv]SN8[v%Ny]\':@{Izf9ikVJCcrEFX z9Z# ZW)SL|mcH؄xv)"t6c##hB|8"{7(;uisG:C W'x`D!0g-sQfI >L6Aww۲}or7m-7v#C8蝕}mwq 7g܅oWܞ2]p>>wxsp/,,84צ%\_)lDB06&Wٞ>5F̲Żȋ;uǽK /ߠ"-Nz}%uk ߫D^_{{Syt[yKkne?w-7oƉ4^wO>=i{S>i|Re^w&æs'/.yavZD{&iI :[`Ź7eN>t}BXk*a;?"DAjg޵N\^`hP;Oߞ[ܝ߫džmw,En?8o [_xo}z__-PWz kMU]νrfg f,c*L+^QAVd829h᝹*h/eu̢[lgzIP@=#o;LW{55Wj?|SΟ:b¼_ZԌ;=L9ON_L%MseeevY}ad]^.FXfε[E |%.GP.W\~:{Ӂ'.'R2eͦ`J$کs-:vׁ[PXJB02ufׂ"B@y/o%mN\H^^쮜YᓓYzbod:t3y$UB!s΅[+t<t262 u\*u.u\GL>_ܕ]]t,k& Fe;!9Nq4''V }:Ιgyide"&E:]c#&XxQ/=@PMe'啿]'k7W.7,?s]~j 8V͙4,H"OS% BVH$LDyk+׷A@y]73:0yЌ@O=>᷾kB{$W=={o,&q>j~336R)[qxuoh~Xt¡PuAjqbϡ5nYc'xȡC`NKNZ/N8y47:5`UC0QC6sy#3 QF/'\N" j*m#nA~8BfL<΄Q^W}k7׷@vNI.~JuS?~tߺ-EE(.Ë sxPy[wU,:bʽo߁!ahgy;p+UsL(%!PV\s9{iSO 1ceaQֱP}0٤bnYݒ=hk4-s{+$ *Y[)\ab/< f!򖫸m"\5C$WuvFm#T=HƇR4 {=a2tnm.dcݺu+;(4&qK1hƬQuAkzSx<-1hIt" ́5-%++ 4f̘ad#=dQ"??~@x`=d(<<97okwωuk>6y f^={ f/z≀dr12} Y}q|'90 o)}D#G9rȑDx6$A匍ϔ˙% Hȇ-}T BG+N?#,p^W  N`1P+<Iߛ}w;jS[@):{/y݋/Fo֯_?Oq22k&kVf2 (@i_֭[/^72e ^Z*E@C '?)c=62C_i#ڵ뷿LPG[Hez#B_5kL{j24p[ԧ>]={4-`v|MLKnW#=#G7a:d f7x'|IS#^zIҗ$M[ u9ԩS7n裏»x7U JaVJu?Ϝ9 ?8hVXCz݇ et#m?}nݘ46=G*p;s=>}tp-[tM .$7jd:塒駟͝;״R`vaF XvpCrsYr%| R qR闿^{ 6uҥx]iQ [CI5{l~#B QS%<3YD̟?ƭp8oߞ:+^1!8½aE% <o 8pFgX3:tHLF#g9O,+ƹT3g:5g<<>h^]B_q5.LZghTp). Nb; +_v[(KEЫ1:>_ʖ'iО6<5R.[vd@:qaf\a6l` ž=a 0jLјg1L-!y)./OӰ 2LX,6kFf5[$om%S6Pŋ~f c{}s/ytbQg=1[I[Z,پG-_(l .D8AدS‰EsȏD ݍKk"g O<>o/<-B7vt1^N4.E樼Kr9V1,eF׿=*^;l:=" #=8R"6mY}{4HSl &v])a55.yIŝLH@uuь]u.[RH[y(L \qzVxw?k&1Y*uq/M_2?-[߈Vل O|&U X$DEiS8!bqj#F._ HLZo|m^pZ>J5u97ܜ{+,zq~v˟s_`sYs_}b3T_XL‡]xÙWYi/|i0m^rsmn9h\:Kbh`[̮a^kZ HO]9Z~:y]B Bv<1unG:&+O&^4#ؗaqsѱ 4?a׈ҞN{!?-܂gW(MHi]mrM')d N;%VoFA򓴥 u\v &QjaRf,u[ܝwOٳaܻlUS6ԮogLiM8ޕ$͐7 %@P8T FL`q+gU57E_aigev:^ C઀æ\}^؍2 uCPW돗iV#n{xnj:4W'm\rZd WL*?)g\J~ gfނ4SC+38OCueFšAeOןD}v3J}}mNoV̝u9]JMNֹ+^j9Ϧ=$n1D ͆I+˖tKI\)͛gLp;<(F+(,ťWױ?^D^< m10aY((3Pnn.:З2KTY&>!R$̈tp4IеTay RiHG}d,OMzEkLbG&;!Q! 7m07anh\;J'D7-1qW$d=SF#Dgya/zzv`eiD6][H┛oM s~kT{VB^_' 3 Iun7qYHͥHʾ:qĄ:6z[ W6$_.D۷D)ӛӲ!w)wA01L'L3De0P7"Y2!~_%1exQU\ɉ'ץo˖R|#$|)LZfN+Q疗07|7x ļ+XT XA>XP"95²p:nqYqvPTk̗X*iF}޵7'ʜuWk>(;;7搽޶qa{8} iL{tAs ahL??Y^s a[3PԓLM/Qx۹ciiHf HM#Q f FMCJ1B5M> 4F[1` vmϟl~* <~i+]K%* u,Vg02N:5[P`FZ4NڣC$z0a=f ElvX$3MAJE-۟epg}1j8w] ^7n8I9j {x C6 h-P@m]1<.s{BEc:ݱ+fp6)9̲󷌚#4f8 3ɗ QQx]:d^un.OKYfȑ "yЩsLx3͘P+z%8p#D]w݅-V\N>0Vr]n!A'[-G.6'Čf0//"Ck@QΑ~A3|ƨ,(.tw`p^& X3-%x@"LBxLGE FL1[^[𱮎5Jѣy鲲AfК&b^WH^[ OHeCw2pK>fbT@0yWze;fFX/s4-Mm+F?a#X-illAj{~^A2)XtI%o.9I檸VkXEu-M?R?sl!KΈ;X}Ae]L2Ġܣn[%s\ zMcX/V"2_tS3a 2V 9V:zAypu+.^ Df<ظԳ_;34Q JuO?_~e?flK,-tdhvPQ!i 6Zv"aiܻwo{(ea&/1Tluh-8qH z4jPzkZ Nu$6a,Ā:b \/E)>$p5fbJ ft2$<2vRbsҦ{/(ؗA*1x`w]8˱ xXy\*YN!o,s 1߇D/*9uQy]˭VE XXB辉ߝ%5hrfȶIXD鼉Sq'#JrA(nGff<3ǫq;t+" DZIt(KP?dtSS07+-g*# ʪ8"\@ފgm?(l-ƁBɼ's=rv^_I:Sr]z+->ʾsb;E)s cqzK?.\oe 04F0D+b*ƭ^G3vDrC|L϶G)th_Rỳ xƄIfʬ+JzUj*{[e;zQ49!4y ּ"x.is6+DMBL,ѣ뛣G!Q%'=G$*MhČ%H̦x 3접IZy6PjX uĠө9܊82 $e*RXɥ*G$B3W^n ;P<24c[-/0C#@g/5($;\S$LA1d7@0D/^^\NyZ@aw 4u:jAGi}#`{=6ыv5FX~֥) uxeC ,}B'[ȾIȧ8t 1X_`kD:?8:& <^D1@Yj9.0qlȃA̅NAc$-tɇYFX2 i4~ҏ82 [&$v}6k#WLp. ?xoG}>&Hl6tPb p"]-_> Fw5zh^A+F;ۇu'D+@AETr m~fj K(]4}qN kLBcp)O1{(+OKNano)N+մhj43^W_8%`!,yD?ɽ&"L Nbl뼓:!1mH3,"LQ&J.=K HAb{j1,8tK}Uu$,DOcМ '}pՋŏ6oˠNKغx:d4 KBuo[S$^rCf^u#dN$u$y( ! f0(`opJrx-D[aKf!6VhqBdiI Ku:y6:N]M2 ꯫ÉnK!!u$%.ھo{N,!jspA$Έ>F W/9$;M9!46I842Vg3UA`liˣZh)JlL68V"ͮ\99\Gګs-cA~z܇J[CQ[$ V>0}Eh0(H %?ޜ{\CE [kT0q9+ t$庄65=JZ]ǥfmU^')u :hP^de83 zTxݛ{!w P>{ 3h[x웜PXh%o ,hxM҉UAGrc;5ɹgCNKȜ>'y{ 9c5cI6u0V:;'$&55K3"\7f"˟pkV:so+DYs,Y;FƂ|^ lpv?E;}mK^v~d#ʪ>YuKK:VBy]0̫nr !ou Bo'zԴu#ӵ5(ؿ':!!V~!:Fq#jϡpD?DaXšC/ xv؃gיM0E ]{A)[6)(0k' kSmP^H~+&{$!u[+30He৔%V;lM'KGA{aVaG.`e}U_iOO%2k眧Psz0($2uq-N^98u7^ѿC`|ek J_yzvڳSď[ ^uw ol'xZf`B=qo.ry9Fx Ƚ|xt"̬ \ mw}l[rC@Q'lpo~)iN'lO]Kg&{vbumcz"(3_ZJc5L 7(K_֡w4u.l w`k4ڻhC***N>(h߹@b#{ [ޤϼ"._['" WG/-;+**M.FxI8Hں}xd'ˤ3)K_֡w4!ug_zs^$'{7n޽"TKUV# :=5%+4nQ0m]sgz8{E_QSS#MF<`Z L {HJ[gT^C%hי/ -#a{{f`V6z>ۉ~=~ٳgpWR2ǂp F-!6],mAy]Gs?}P^g(vc/+[9`ts>}~&ȽԥU`E F{Tu`ˤ3Pr+^bUå3'wח-e,}~e 9Sk>شez(tk8s g֭{#H w \t[]GjL}`cG 9,QfA8csQ_9dHZ(י/ -BꈀX]t{((dyW9nǎh&GkqUx K XO2<]#xL\ l-Ǩ߽NnRx6Q;o? 55.t9+[Ntm*ԕi3h'mMöD!.a֚G@H|&%y~ԩSdRR~ 7tzN?mp+rRy]\$9+7N IQqٵuSmvh 7m˩/},ߙJsV OkzQ&{UdiXTmνĊnөT]n EG\,., l+c՗-muCTv΍ rbP^'ϞO#]e/]g.UEm3غ}_0bO&϶9s)*v^.*;׾]UЮ]8ؾXYoק_9CDs%[{hs} W/Qئ-Cm[ xs>yZ;H_^{Ʊ#gL_ila5.LgFk&>11zY(^#b5h!;y]]7EfX?n ve܁/8F۹ߛ;ޜ{j KrСeZa D+L'x95uWk6R%2UK »bh@)Νt"N?8ꎝ>bٿ,_9 RuO]Z ~B#&)ܿ?Y^ĄN^g-#("ڲf]W< {A5ؽϢ C)/| /=]rgXf֎lZnP=HeO m,Nw W/^np!d90H"i=(O8|yA~h|s>DxnIA1$e;yqIty("߉mgAg6Kc&T$QnLc{V5T6T:7GcrCzͣ U]C#Q UIȼ\[0|uI& uTF@H*8|&8&|&aۦU6EN FLZ'wW7N;iwcVv'C}Qv˰eBDw|u~~_AKh7ñ#d =g en!,.!F["%G'xnI>ÇgQKຨHDL=Y["~ye A^W֟pTLQ+QsY޵'w97^8eם=|an%HcZ5WZ/l%A©B W3sDH'/sWvX 6R bcnD^Ҭ ZkڃVB]z%{lX:՛W\\{ns@-K0&)ϼ11w^<<+1aC6^WG' 'nAιZ&SѲ3n9\aNmusn\/߀2 /9Q8y,Fx1:!ssFohp3\&E{#kJLJd:rwo&\ڠm(W! ֑S瞜tgz]:<(Ξ;ؤ`]?bB osXvO!QJc$ɛs)rv#hi$ۉ)Ne(ste-Sb>eTrCWJB) wb%Y3 #+eѱ[uqLFτfKSA|R\rXu}FyTX&! " :*#bĉ/^R&uD-n#K1zX?9X6S~nu:5kv]HPI;-u!'ACD,/_r u*:'^^Gt3#ζh2ڽi9Q(1WvJ#!geC,\gR\reJaY8v3&eIVZQ ݌19+DHh( x[܁0F3;\+l![NsN)8ť)=sT+w;S. sQ5szȓv"N4d? ս q?ځ_Z;ums>zJ>QR>/h2*$i& $Je/[N ha^ЧmLyzѧ99HMܘA]_C9b:3ڼf'sR5mX PH4l!aro;I~7̬}2s{`sPGGxťj;\cns-(9o/d,ݒpRu=$ !ZmDB{P^ShGE(OӨS+.iMwB_1-DC_;hEtDʪc|򑙽p߾}Nib+Oy.s_E ̴yLc`L5BHiD[gsAd,bpC:kq;VWs"]0q42nAt0:1JjbW:8IW[ԃH?R-7 5QOGXq|}( |jeG W;FkfϟT|&63ٶm3鈅>o *Խm{ ?Ξ=+ `,HC!Gnq#{i?6:lNڜLKuꓴxm1TƱ .}2UG٘ۮ!b6 A@ exh|0uyNwV>7g<^3.;Fp˗鉹6!h'@"K+'&={pD2dO5[y] !o/D^ zIku~h Jwٌx-۹gXLFھ};F%"?|& Y ^LJbKi0IQ-*I!?2IB +F5;WǶCX aJ@@y]O) c #uH%o{LmgRZZJ>J4S,+B|Mޜ<Qk-C&:8L8ra(_`?󧺦qAOggj_aa;<@ؤS"(Edu(+&0d#8茐0Z9(" 8&:sӑmlL,yXH1}#%a]tB9>Gc#ǟ)++&1!K)N팊@(K/4Vಖ0tN M(rˬ.20gS_tUE@G+i,sWgVz>LE@yB! QUut[Bg*p1=֜nus:"`s6앏%,xzm9(3_Z ~`( !vHڭ"vȏ3gMK|5sқUS^9,Eg/:c4QC$쐉d{-/\[PvarIƆIU ~9"2b|s^MM|Xh^j} =-zo,4ako2Y0d|6Y~͛=OQQg\bW2[U,kE#`~=5%x|Gv71 .sX4^י/ -tg d/^inݺFzat"f" iMIT !\br{/u,un(|"|oH:6-`!؆JJJ8NˡG\0#1i[UZ, |mmb%1>/L1$_[e" -s?:zD@T 26qF\Ȼ! .ځ#ð(I@D|tRD|Jʏ͹33r|O;2WA`gPdWB@ Ga!r6PAPJFʺP0&ŋ/(^ܴ Eb/{`)@X.P_So!` 3+,&rhDAt.Ak7]I)?\iu24qWXQ"(]ٞ`nk$qDN\XdDGÞ帽#GSQGE@PE ؤ+Dtm'asVM.gB("(i?DY7e.1^RJ8MLEVE@PE e݉S-!nr={HHJ2*"(@z" :f+m{pXz.J("('ʺSg{vޝ3("(@:"`u6nh8xp`}jMǕUE@PE ʻ-sz9%3˴g@("(]q:rw/T :UYVY(@ p4N(ag:iҤ]wݰa¶JE ̹'uY |=U%s-t,E@P?O~u3JY̙3zah"4nI~~jU%m!t E@P$a\%z뭟gQ@U֍ܹرcKZp"t=ø3Jah^a/i"dn֠߆JuI^NPFܹs~dSNqe~oڴ |>ԛJ)}Ri$v8aQ#4EKAeN;#6,Z"ۖ-[N>ˌ"Hv:9x g*ٕty沲2dCaq#+]s5?ZhZ$feg*v(@!/z뭷> f^x?wߝO}={Ww 8pÆ ^{4f@Waa=ioniZX`7<'nݺ]tup7*)SpիC?noQp{MRX~=7 \ @0:k+}A+E@PNA`paӟos=rOO? M7ݴpj0`9L`tsϡЛ>}:[O<j#Fp Kuf: -~|tDx4vo|U 'OUVIC=TҞYþl^rL/LÇXp ufւ"~DYWqt&eݴ~= j"2ÇחocdvQ#'MHSu$ V+hI{te&\hmu%@Θ1kB+1b_:":rC>#-vm@jx 7R2BVA3kAh'2Q=:BuVoWE e˟s_җ9z ':"#\SX <Ѳ%L3m&/1|wFFnjKN$nVi_7n}k4/$a׾3eм<Ü\+&E3z?{c } ]F}) A@u;+*?gT>(2v(" pZ#0APi^lCr͌:zy.^hBcn68[;I$v㰣PIaf_s ʩ$Of3 LJ n41Dʹт" *랞dUֵUWPG@(I[T(uk׮+-^y]w%eLFR':OQ[pϞ=/,~nfdt"tN:%Vݻ0l0Qo:6&ҧ5sLy]e-Hg!'e V$^P{I YwKC {vg&*`UDE@P22vc5FAe66: B@~dB> FzVmXO ˠ@(@:# {ϟ_P'=uN]:!ɪ 6ymCS[+"tH@ }ΨPG'<Ԯ3EL60v. srXs${=tYA1uB F'Q-(c" x< USE@P:Hn_&j7`d)v}g$?K7g!~ڜ={VYaE@P!`ň0E|]ѾJvC]{4xyOל.qkO<ύ[LXǏ [ 5\CTE@0"Qe} :ԮA;pZNZݱcY %:|tE@P$" d9AhV?&DeǕ%qMt! ؚsL.^dOmN%v("2,^@X$e(0ɫ#|?1ǎ#AKDB)"(iP;|Dk# ꍾ3}-->. 6sE]---5 |S2Й+"Х`dڑm޽{vk7JSu&'Ȱ¢u$w LE@Pvy}o-Rj6}r &+8 *RnT E@P"=:-*8.kg F@,;#***82(!&qNPE U@G AKd7n=>?)Su3].>ภvT/10f#WE 0Չ'm{bR3޸_]=i0]]u ;`wB⩈"(@XjEf+ЎF@HRAc܉U lh "(] PjǑ |LiM^O]Z4 :l{Wqfy"P l/("8Dd ݄U{%rϐ/>5HH<[,4kz"("AN}ҥKtP,l4,RviTL@l.ݴgy;9SMlg>{TYzl'X\:Q+aˠFCˊ@".eFd '{߶Ʀ/s Ď܌"lg!4E@([K$un i3ʹS^ WR u)*Lf"@~ vaϮBް3?eI-&ɉ:t㏝d3+ut +;XeYGV9,,X@\[E 5P^ReF_7=NdTlrc栤3CvtD,ϲ>;~,YMB,^7o޼{.Td.]/g2Q殼. 8zIHŐ4:¬`:B oNnH'A`"50Mݠ1~yrYݻg5 cL7x__wu+B6bP}{oO˷z׿ vsݻXnw?яzj`7r;:t7vvUoW^UWV.`QaL+.ANݚ:٩Nem'!uԑǐEkMݞ={ WrlcuSN'>o|G?5\}ĉm"F^?Cmm/|3̟~̙~k6b('?UVI͛771dȐ)S9Gԧ,YڕִuQ0T^̼t5N^AGW,=xٞ֏re_ްhظyս> Pe{pc+X<9B("pf[qҾ@ 4h uŐGBpl3c.q:*ycƌi31ngGFt?CN1ByKYKek!((d[^Kݳ;u}ξ<F_FFr˛}hē۷'&MN(^}$|RG:eOu۽{7v:&6^" 555ÇGܷ  XwaEٵ|rd:l.8p_ \BvC^z%7 }Gv)?\oM741Ph5$޳gӧf\5 wEIuV,ruڴiEMK{-Ḵ{⦆E!rPC.O,.qvoR}4`@>|P}ݗ ZP^I&\9DexԔ[oi= >xE/܆/~[Gq0,70YCV?G7RIc8aݺuC3f|0I ׿ux |Is/d]S/˿wك>x%8=KMn2-cA&NI&ɍ#Jӷo_U3| :'"7 'ꉶp-W8l.#vyaիWfєô  ޭ:-o#-G BMa 6,4Z8XXE :}lhtJ5NjoWؠq͚Ɲ"ul:y͉q\:RD:3<8\IB'lپQFxAfPFEbl\$1s6u:PXi BO q@˚^:Q=!?앦@oDѢŲ+)cO5ׯ_O=x &;i&> an`{EEVxu|"렵 #<@9Fxs`慡M:h4Oc (Ń24p8=2ZGij'n:xMcARwEZ ,d ˄#= |iJ-IP^gRexO1tRwi뚏&!vb/܀_!?ń2 7Rf^{AZH[UUEATH/ld (0r]E]f r+ִ' i-&p351zĀP F_".R? (IL)W @i*%w:._/`n 18L Xncm^GW#J.Qr5`Zu2(F@y6 A-v󳶛(xAJKKa&Աmذw"I) AH{wCWD_Uy $.yre4z{ z< D !9Xu= Ӑ^븗]7z<auգ#(O*DO߬Y.F*B$ I25suu0PYԪBH ̙3)CȦBEP/} dRh2rpTUhJElBR}k J'$Ki[ў-% pHENG)SԅMU3B ?\ 6l4NE$ױeBis70j: #`:_xuy]1̗$ZPљ#6ˢmM3jJsM=أK<*jfv̎+C4ÎK;a FQ$4Ի7J(ްݺDxo ]s5ln0 ЉعNKT#3`#FCˊ@HcbÛ.wAs: u :W[ia aoI ۹Vƅ@(vmܵP^׵7)1mA庝KxvW\dIqG8P+C{KTD!~׵.܃.m6(6yp6h[Qyc_ 0_Sb3G&xs8d۵kסC0C &eu ][N򺮺mw)HNXsHĔu2*EGH@dyF/o8j:^qGǃKlq#=;՞".`vR 8Ф>HxEjƍ$5Cƣ4KK 4}Hay(^]=lǴNX\.}|5 sl?AFMF$jåFCˊ@".eSK^Gb"IQLG"9ydb|A'tGw:at<~{ynf ~Gwv߃Օ3};xӑs5H++в"(K٥cqbM0^^ǡT SVA׵ QؼNHW1mxQ sym_WɖdxHZDX4ׅE+TC@y]Hx],x8iHc<(K*\jEN=60:Cc=}F5sҽG"'믿H̐(4l–ϝ ԰ADr*xiږIm ˅A*΁24&:tF'T^{gkWU4Dc4F( D A#ш1dhK(".PB){;-<Ё?<[>sN9~Nu^{|:{~Vko~8Pjۡ஻V4L8Vc HԄ]}tzSNŷ3rHjd_YRpLJ=s3|y]w$4q㸀Wl'J/"J~@*e/fK3 #VFV8G U XLǃv:uy"tKa&kO>=֑/51VQE &0 ,[b>:V!'RiY%4y~,ߙvmd(躂o%LRE ;YLV44 Əz}gttͼ'7Iij"8xq`")y:&x(>V~=eg6ɪ6㹀4ynϒiRP2qK5z38-jxNr 8y״6#t-:y}$ ds]G8Nn4.rH"?W~x\a8'b=nO6cGRA((ܺ3fS?!C|߽ C*-*̥ _u /~d"pv w)vQq >dHJH37P\*ᙼ8w-iR u[y޼gX4 M(d7k .v M'a]vZ5Wƨk{ʹdcZNpO<3 n(qgDΖ}DטrrQX=PCт5_Kt]d. R~D.5*5D!3r]׌E\Ä|?:mF~>>v嗓!nT&ec̯fK.B[Q(*)]תEJ5a9%Bm9ʤ#ĉGOId)r9f3B&>$P6-]Ji Vf.c;2*Sa<*u "yiV N9nuLI6Z.Bxk>׀+?[RDDwBZ*D~Gpߡ4 CNڼQH qSyz醺MKVIYB!D0l>p:.xSu{.gacbZnB_H[s=[Z8LPwI12nS[St˃ROl/?ưlاzr09<×\r j̔'3 ]aO!;J+uZD7p )64,DQo!`?2Z͉4ky85Ku/7^(/0!N]4X%tcPql'_MSi^Kq|%R1ޘzB!3yzdQ.u9[4uQ SH Upc i@TL⃳B &Q4o '*[KWyҦۓ""ȆGi6QWEtl[Il_*D"Hr%]uIyFHsKj% cQT[ޮflD0*q!*/v/r+{V/<[ڣ<{R pR!-|FfzV~QZ]_hV5I78]3&9 邮uy~CXϱP(:v&>pYgx(VܰL@T\ǣ\5 u7z y"B$ϼ‚!?F#9mC\$34@"=c2SH^ϖ,ʤDy9^b&S)Ai),Qco@v%{۬bxc/2ov!"oBuSH,)6Y Ɩtz&3Iik*F)f\],s6@2G%~ f#䉘ے^QH^Hrt-䓆lDfE]_JE3͸E_s4xp"qZ)4WaKX&(8D5{)g'G5i%7tP~E3P' T1 et.S<+aUOnv _bnQ׵aX% P2[|76$;='tm7FJ]mXA^9qkD]WԖ PUqwδm ^}fڊ+ m7w1gq{=ldW[U@`dž;lۣXl# 7Vni X1 T@ W.Z{^}gjۮu@ly H "vfZ @ױ K۬\fX׬vsk&^Y+[^ H@$PmXߜ^27tݸiXun}$  HJ5o}`NKEco H@$Pax[v B {M;vPU5M$ @G}7>xi׿=`% Xsk$  H@&S^xߏ ]7хLT4ĮMu$  T@bw#sC]4f/l]Zs$  H@6b/uݺu3z ]wko4ĮMu$  T@bx;-v,߶m!vkn͑$  H}7"bwӃbWv: H@G BPqWѾ]pk!vkk-$  H"ĎUbׯ_?ksb7 &u$  H" iӦ%K3/ўeUB$ C -_ }!vMy&B;xPh$  H@h(7B!v͋soe2S*uݸV^$ AE buݰaÜ Sm'3h$  H@M]S.B.]z}!v\| ^\ԉn_+/ H@"c0mbŊk']5q>.(6zJ@$Eݚ5k|~ Ş9NoY/ H@`#!v۷o'n Oo(kh`+ H@@G`(vǎ7o&}nKnj]G$  H`Cn<;bG=W_5nu핀$  H k>ӮyxK@$ C ؽ-|~hWw,ZmZ* H@@5Dݖ-[-[vuwN[De~0S+$  H@@ D+r[ ιl1Į򭯁$  T@#3 ݐ7n2ĮJ -$  T@ ۸qv}_ VbW@ H@*F BXf^ll_G!vkk͑$  H"Ďw֭ZP1jI@$P= Ų!v֭bwuko4ĮzͭE$  T@bx3o[P쉹 pk$  H@$Po!v#썡Q>!v쭤% H@G BPqWѹ~9z/c/zZ$ H@*CFw}.tWyXfN^}32k$  H@tݛo-vK,9=ڳ' /;ٱ+F@s$  H@@ lݶ˗_9/ĮkʂM6Mu!/;]vU" H@@QM, v=O_:k΂ߙs{ɓo޼_gV]o%  H@%ZdݰV~ìO?B쮙7&ұK.eXV]W>-$  Tar8XibÆ S }/7Y.sF ,x.BQ H@D :Vc SqIX!edcJl8h$  H@tiכ,[l޼yN.Ebg㎡[:魿$  H@#< /C=󽽽) &iwE礉u͑$  Hv4Bxڵk.\s'3{fEp]k$  H@\v 2˕`׬Y}\Y2}/íǚb͑$  H@!Pv=̙3oO ^s,m6*" H@@U \HKFbpR. H@*F eńGf}dU 'kq͑$  Hri4 t-b3apk$  H@$ FQ$  T@Ԏ9|t́e1f˲WI5J$  T.o5!O:6Vd풀$  H@&]|unkM$  H`P L H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H`8ӇZjذa_/[Xu.>#~鴥/ֻ曏:/}K[=$  H p~:묳N>7'?O|Į{ws=iK_pHV7$  H@hf͚d+&|k_qW>}[nݕjx$  H@hgBtwϙ3Z$  H@ ZbQdK.祗^ ?a##͟??ʖ Θ1coF^`9׭[SOm޼9@N9||.ucƌʯZdf;tM^yĐft]=z:cP 䌊1܄$  H@hE=PRꫯRT`lkgtȧ>iӦSQ ,83wGc=v)OٳgムBΝ2$Pqԑ/tY>{f )+w*9}t*V~Ts$  H%W(+bV^}UW!E`O>dxB6vث×]vziʕG?Qd޶mq~/~qɔ38#U GM0!όcs= Y#Gu_C麆|+XT8ca_%  H@@TE}[ߊ̛>  Vرc'pa}c졇=ꦛn"GEZ]wwc; g CR#g+?c*܄$  H@hem,@hTH e  G=qs9CY^ ϲs$8 鑳1nB$  D d[OO!vrIs~u~95\5nܸZ]g,e /ϵkҐZwe sb%  H@@b,k]:\IiD*_]7rHTZ.ecZ]G`ڵk#%ʛLқA5iHuLy`2Q 鑭1!5! H@Z"KWH0ʬU&8uu;L&M+Jb[ u{7yu0l@]^;& IaEzW^Cz[u Ϙ$  H@-`}C3w}wqHSN9%ʙ2e _obɁB ?e ҏ=Xd 5H]z/1/Ur -TB -3Ҹɟ&B)ܐ"1iHn@^׼yN$  HyGy$c\.ZW{Ŭش%_$"m$$#i/øioc7׎r8tH$Ri/[YSNjk,?c=c. H@J0+JUapWf {^$   \y e*UY /$Uz{{wVp1%aDoەcU=ˑ$  H``}aÆq,wu1\z饅%vȌ3: Tı0%qqL!pJG z( 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@$  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@@T5 endstream endobj 25 0 obj 185748 endobj 27 0 obj << /Length 28 0 R /Type /XObject /Subtype /Image /Width 840 /Height 1213 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 g O@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ρ, endstream endobj 28 0 obj 4467 endobj 26 0 obj << /Type /ExtGState /CA 0.15 >> endobj 30 0 obj << /Length 31 0 R /Filter /FlateDecode >> stream xYߓ۶~_4ґifR4}SQX"糧b|N8 X췿ү/ 5tO)b*tJR{KŴ/.|8j0_,*K,u[jO,A`g)Ƒ$'kUJN8~,.[erȟiQ̛9"Wao=veD y8KJr:U +!ZR=(R _dMXH{Q8aMb>'~wx5hA VH ~9{ޫA{тDnTl vC"=';5mѥSm m/ h_^̯hB#_Mya lJ={S_:5 `Bė7q^ A6B@! {5тDnQ!2oakH Ya'tM;0떚aQoz kFw|\~M4' p睚Ǿ 腵K<$aq@xMpIrXs ay_[)}'Qen7!/<os 4ɮ|{~ +!c@^<SQ_Q0 4rVEBy(nnM6-uo*]$*iy GT= uk-cHȖRj0/I>߱Q6qiݏSG$.K=2),4աuۻѶﻧ}O/uŸP۟3{/u"7vRh }KΩ_ʔIrśwUyC^^hh1`.EYjYQpvssU`4v/\Nr[x _,cGrSJ W4Dj6W5ج2YL@etaݴ<$AjD31j4'9_wԝ>hLaW=H|U i ١?%abb:'pVbvRɪZV+z]uTc`ۮH FyΆB̋؛Ǒꥠ1A;C Lkj L Z7n;CNғgbܽyz*0p᎑ǔH/lZlgE Շ/$u1-QI=Yo69&At[L~Bg܂(O/COus,=Q *N@6:CtO6ӅG‚ʍL#ss0ʃYt)>^3ȓ\ 9{vh&9MM+~>5m endstream endobj 31 0 obj 2855 endobj 29 0 obj << /Type /Page /Parent 3 0 R /Resources 32 0 R /Contents 30 0 R /MediaBox [0 0 595 842] >> endobj 32 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R /TT3 10 0 R /TT1 8 0 R >> >> endobj 34 0 obj << /Length 35 0 R /Filter /FlateDecode >> stream xZ[o~_1+$gxy6A/[}"+Xj~6(.`ss Eܯ>Ǖ| ˶djTwĽlՓyu2`GT6~hj[ 裹4*BW]E/!>5K!>B12@ě'+bt૸cict;Le%ZҨFXnݜЄ;(|*6iF;mn`nQÜP7P$0(V-̣0Bf(GC‰4jBJ5qP:|Ky+E}->'D,,C{ M`WoM 5T>rJQV4g(?tC񼍃9]D\qCQyTM]:Mb0) wo (}yHP1 XA5g( U4g(?RMxS(())Ha-Tm(ՁxG`#?%7KΑahZ^W@^d 5 GyR}<ȓ(4qP:Q댷P<ñdpQLy[ |l=zO_UD!˨9rTED fK9%Q @zqL)Q3,KWsW&0BLFlsgQTH5<^Ys0d$yě+CcF D1leo܎&CvlLya 7#J?RMh^"<"Q [XTkFD1lыk:JYn #mAN۞X_~-ysBuc5w:m5[Pբƫ g LX+_r5* eyMA3y0'4SZZψ0Nǩ ?0 fp(w`/` EdPb5{\3Woj9[E!Ҡשڤf)l2'N2t;feC[6qeCQU RUGQ% CZ! k - tR-NB'І׋ C( (E+PM E&JY⊌C|'9^Z3HN|  Id[ t24\=4FþI})+}h! CPgMaEN%Тa|tB)$C)ZPF61߷f.3CѦR50t403x3CR-A3|oC9*sa0?>fJAǬ}&dx'^Z!(k4s$/d-cءhUP6uh @E Psc8c2[C3pV>eD>|/@,D3 ,jl`mHo1E˖bǤhPEIEA%}j ͠qh"ir |/U،Ȏ|_(#5 8S|LrpC%>;XR-A `sJB9}ι5?o :owyCgB5-+&Y|/-j -N^}5tp5e(!\ef503ifVo'^cMaf`0%ՒXoD 1Wfn3.rz8 zyӧ~G]10e3ep1@mAxhS 4XAM*%"uX%we=`3p7|{=E_c찊WTK7kmզZ뭫н#n3 oqY(qt࿾K{?8G|-.ӧbq!4N?wO؝ni>:cKr]ճEePq[zz$,+>ς ! _O>`/=N~uxxvO/'xd ~n潦n7Ys\NP~?Dž==ftQ;gbm\,CqʰWϝ;\4/OG֐~;"UV,<.O@^UP9q5GT*a Ɏ @п0EUMDCQvס+ QTO{i{d~P5M_/wnqszB#<rKN-y\Ըqq¤0(Ir$ذ26`v2qr/yS)[,&çRx'N97;m{[l0-WB*ó_ﺳYv#p?i-bu.T\/%&A$ QĂn9uiZSJHbIȍ=v_s|[BR>^2W'Ka&HIe H^I)[1ZѭݯbUvN*يb~Py cIkz MivhupM=gr 8VX{a |_Geor)M:/AZR] 9 ǐ !/ \JFKߗ${KlCG][AFctI ",Kl/ ,WW8ૌ)} ?};iTj"6BJU\>QZal*3|Sj U6(/Zd|h된X \wû2<_~="(CZ@WozF=)j"$Dcb5Gشn bywaVܽƦ-&Rw~v(俗ć]O/twU{թwlRt!bh.z{ [Kf ϔw ?k^7t+vk7rarpx-wt]tCs<_y"j҄eE'Er>z~W?xŕGic_O~JF޸lK鎍e>{ONQ/yځn z)+&zpmlbl\pقOs24u/{Ebcϻ>-ݎڶ3aP?_NŜ! endstream endobj 35 0 obj 3850 endobj 33 0 obj << /Type /Page /Parent 3 0 R /Resources 36 0 R /Contents 34 0 R /MediaBox [0 0 595 842] >> endobj 36 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R /TT3 10 0 R /TT1 8 0 R >> >> endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode >> stream x\mFr_5,wRrp vZQHy.IQ+>rqM[ȳ}sy*0 "}6dRWsyHgx|¶h{Qs2̛rc -V#P6JeD..P ]]Jhf4$%O|_V c߷C<.ŭPeu3"b2MUi ˄P3B@mR&6YPJpAhG~G(nj;Hl<5ăq{(Z1HulFF.t"]L4!7]D2[dEd ̈Ĩ3 y@Gu)ۆo6_sJjD7)""!c ɨ3< ɗx$CݤZU,)rb/"9C2*lEQF;C)n?c+g4.'ly[ hٷRaIBэ!T6["Vs TE2uIb!.9VL9__++"Jt0+D>wz efNn}]8|BЏy$D)!5慘@"Q*b^,I&tX=&4)buSsy˂-HL y=xF6 UR@I\F~˜Yf):yYsEq#WL 8Ri ~p!ki2F?McOѕL؇\RP[EɳJ$&2ƒMd%%F<gA?rVťMXYf}SVL 虎tg4<5PcFZǴҭL+1m<~C،]@^xӞ'sXPsL eQyW~ڟ{Ġ/=;M z+}H6%ewf$N+t,R x\J#|Kc3[d&=Sr_q"),:jAq$5z9e=)i \0lڦ7| BlvҤqf}h <@8Qn2,X'r`=3!F,L:q j&Udɝah{̽'*dYION> Ns'PS.|LXjt,8$2ֱ` qRnzi .빌q}:3"VOnw걽@ymPYߐ٩`/]0*֍9x3 fHb;'2/~0.yAy+Rc|hK#23==GU%$zCOЁq-B pZl|VcRlM"-^UL)x%vZL+l#{,iR^;Aa_w@uʛKrW]\v}1G\8 %0q>tz@+s4dQ ^=2vcIt>°т;Gta{A,:^KsX  M̸c6L6DHVF*X/jRqFȤ:O'w:˦ݟ6}WEmmWx، mxgqU1DGbK7~ޞ7ixDd%RwQƍ^m&́9mZV]7Qȁxd_W*z֨*7[@|iX߹"}ifmw0vߢ,!PryP[ P aq~Dqwt/fm9`B~sp <[HZ2sQBr <${ؾV|&X7hFzt4oRLxصoܔ^h).&z.k=`~6i![+CMu5l_64\H4/ :ʑ [_`"\^!viIWvbILύ+&GRb|b=,3QHűplc8ͨZTvܛO|gw2V"9gDևH"ue5]Hpu9wvq%&%bpoLy<нHDO6Ԡ&|Wud*#lXx .W \ě4(BԈ:I2yp\ HqS"~ݛZ5MqJ+~O ~F(5y:e=gWf%e ˧ak/pK.ZXs1Iݠk( .û=f8PIߢ {G#NgSry} Bfks08WX?NJm"=v}RAtpχ#s+Ȑ  42>ϸP]#oi>J+꼋g cx%ߨߘ7MyD}.Go64+;:qE^{G`M^vW%ݼ+q1hWosjo FzkeuDȞ ߠCmm/{u(xiYb% 3ЩaP=t=!Ś$q_霍z\uNUpE94 'xJ F u OE0\i'a; b1FZ3aR#9|?c8WX|.V+훜pWrf"p-<>?J w30 ±PX3tOȳ6GF36sl?fsq,ٛps.jiMh}Qh?0|ݲ9> 4a+f&Bu۟6fn}pg5 z ۔lxQZg-Q4ie-Ҍ#|׬^O-./v=dxÇMH#;z}w@52^Fu&"CY]Fiݣl+"n 7krd 1GMn/k LD$g=`ߦgBI{Ypk~Toyuw%BwvLRp dK[ͤmXqsVZt{@ ]dΦ#z%i)Ύ-Ii%ȇWܲ F/ f?5v7MzT}5aǔAYKӸ{ &ݟwqsnF}f/ ^ 7]m`R GSznWyj?:sXiҠ<36\0A;Q 9tޤ?bn;LlrnjhuQIB6Px!RA.aDw?{fm.c(;5sL 6zwÏpͅ =8l ٞ1 j0]V7V͸rk*Q?\V &lug3{dctc #Up%ە#f_K3CfP>L) endstream endobj 39 0 obj 5645 endobj 37 0 obj << /Type /Page /Parent 3 0 R /Resources 40 0 R /Contents 38 0 R /MediaBox [0 0 595 842] >> endobj 40 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 18 0 R /Gs2 19 0 R >> /Font << /TT4 11 0 R /TT2 9 0 R /TT3 10 0 R /TT1 8 0 R >> >> endobj 42 0 obj << /Length 43 0 R /Filter /FlateDecode >> stream xZn#}Gtu@ıWF@eEj眪!9hgmH՗{|6YZy~~a2֬Mٖe >&KV@TWOB@my @'P]>պP _x|$Eqܹ 89'{% Od=%&2?vX{pPҊ!j@]-N#7C)nڰZ44Q6XJPi@xeCWW7D*bV(Z E$ø0E@P Q)PŜ Szȭu¬_y5o[S-y&Pol9KC(#۲ l/t5"#e[dx9!FV3ڏV(*fs@J\Oޜhv2`B'm$#"eU-ij],!%#ۂ[ضHEŝ-Iq1ª@QVـe(l'4+ kUP Z~nH` ~v@SPp6u¬qЀj,}msm3tX>uͽǰ],WnNV?+Έ sYepHb~E6q'^I٦UUAAߠ ^ LAl!G=qjV`O_;\$hGrqs}w}gni m{ޙ﷼s}fY?itnt#e?u?ˈyjn4/*ofӠHJـ `CNj-Y!67O?f}~6.8h,,黬3ܪ=? ේ;duux0)殰$BIE umwχƙ8XfVapH{6织]O}swԹ}Y,%nQg%!_&NmAÙ Zw{Jo=kCmQ?ZP+0427mZCI0Q&$ӖPa:%3}!;qzJ`w?6kJqv?S@(*Ph9_D¤~ĂUPi$_y HjQV:V5eDC#ϔHl!eCO9l/QQhJ)J%!;9 ejҋg̔UgMDw4Y3ܵt$Bn MHjtBSG< '\sEjOƒ `O/$/hb>!O&> 1KqB9c9M_$D =*_4&isqڧŏx@P"!OUaܫ8HHkgb흧}։uWP 3;QGZn=Q\nwޚ+|䡏Q벻 (Qc,Q+T2F2c|^Kۿit_퐍Njћ8k&;D {Cz\?ߡzI2U}IG`R䲱#%2ǟP},D}W ˨OKNHze}Q'2`A07I͋x,dşM'*Qt]pA,?ȣA>t$6&EGeF;^zP <wy[@QN*'WNf,ߔ OCp9O`l},\pOZ\la<-8ۣXB[bsl!P`%B؛H,PV "eW]£UH '@/= FUa9`rbQzO"UQJ@ $pwehx^fqCFCzޛ~ hkwӦmT?Gxkt JSn>ެ½Ϡ@Y(Liq6n?4T}$ endstream endobj 43 0 obj 3715 endobj 41 0 obj << /Type /Page /Parent 3 0 R /Resources 44 0 R /Contents 42 0 R /MediaBox [0 0 595 842] >> endobj 44 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R /TT3 10 0 R /TT1 8 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Count 7 /Kids [ 2 0 R 14 0 R 20 0 R 29 0 R 33 0 R 37 0 R 41 0 R ] >> endobj 45 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FRWUKH+AvenirNext-Bold /FontDescriptor 46 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 119 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 591 0 0 0 0 0 0 0 0 0 0 0 0 0 566 0 503 658 596 364 658 617 296 0 0 298 0 616 632 657 0 396 472 372 0 0 871 ] >> endobj 46 0 obj << /Type /FontDescriptor /FontName /FRWUKH+AvenirNext-Bold /Flags 32 /FontBBox [-537 -486 1563 1216] /ItalicAngle 0 /Ascent 1000 /Descent -366 /CapHeight 708 /StemV 172 /XHeight 498 /StemH 145 /AvgWidth 486 /MaxWidth 1709 /FontFile2 47 0 R >> endobj 47 0 obj << /Length 48 0 R /Length1 5624 /Filter /FlateDecode >> stream xXklW>wf{s{~4vlvMjm&qH()RA.FҪR*iE"~(H2Hmcݙ&ɬ3޹;;/%3]!9rK|GƬs3m"vƺ+DmL_-@<3/icqG+uS9r~q#gfNΝp2~?|8ɴIZN3d q#諏^|e+~ʗz={[[ks OW^#;Uh r[Mt$$jLcnIb$gEtOZ"~ ~g,B?U+T]&'d5.c/l[e .'3ebPh; FOL؞)oNYfK: %;[*m>:`| ;VaRCz" wMZ2_)­]S FR \gYsީA{•yX[^osP)ڙ6m*(a#_N޻*q 0SH ]"N.h-:GH.A LP܋[8E'-S+ Xm;bN+_.j(Un.p X$!`O7IJ&6a,˔HtȂ[A=2p M׶`7s0O;{4iXn9ݵ9%Y`ǶBiSy>2d#75ɹ+z)«wW_ wWU@O*GPέFD跡߆65 e.5 U=\Ԧ2P+}M8tܸK&HimnvuwW( AX! tU1'hv]s[3`!Ean}LF7Q1NρBn~isU X!php7p.Uj\P]%w-^_R)DtC&Rcv ms9ϗUvY95J^/eap˔'a AN).ȟoCVw%U cǰ[NLOžarF-AxwuzKxlL-bՌˮP 9?r3ݮR3+qT'hf LД2Yv-,YS+ ,Tcvg=s].:?"u]^y=s#wKĪ@ML(SlijQä}!﷨E,`yÕ1cs;媼Ɂ797QLTsuQ}-ևsfެnL*CW"y<<%tJNNJX}+U6<-aWrK{㣢{gW=~J)jS@Um?MiυZ'r}`>x*6q:00A4kpy]mU~5ci>y_ uɬ>ɬ{_xBHf<.!HEIEB!h)R^&H;ݣ);kqƃRf_ݕr.ڷ#[^_rvNxau~F_|7It(F $eQ5j|[x{[qe=i)law-Tś>"yljHOA: >e V^Ajf*U;D\{[5`k^ I>õ$pPq9e ط ֠v5]K0Y_ g冓se-Z[]-5ۡ^@jySTI; O ZjSq$^`r3L<z.Kbx0@][ XT?Mr=qӓ3}lodM+ra0Ts"ύ_P=?=L{1+ "~y}Q sKI[ jЬUVYlXDjEEVDTO%+Ժs^xLq ݻ{S,WZ5|?= |,_$UȢ"x5q#l9>!3A]NXBm$H_DYkĨV^WM%UY_/79ڛ},h׳ӢYVxQeernZC%ETmj\Xġ8I Ak J?WId]4s]#RUz]dW͉>xOep=UWE7ݬ(@_6%DG/oZPۚh>j%G&W~k=Hï_~:Bci; Gh7(=Fqb "Lc{?:1zzw^>{z濲X/. endstream endobj 48 0 obj 3368 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /AXAVZF+AvenirNext-Regular /FontDescriptor 49 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 125 /Widths [ 250 0 0 0 0 0 0 0 300 300 0 666 260 320 260 0 0 580 580 580 580 580 580 580 580 580 300 0 0 0 0 0 0 700 636 720 757 592 562 779 718 260 0 0 510 886 764 850 580 0 599 564 570 710 623 972 0 0 0 0 0 0 0 500 0 534 637 500 637 572 295 632 583 250 251 510 252 883 581 611 635 635 360 444 317 581 488 746 484 488 442 300 0 300 ] >> endobj 49 0 obj << /Type /FontDescriptor /FontName /AXAVZF+AvenirNext-Regular /Flags 32 /FontBBox [-394 -411 1309 1192] /ItalicAngle 0 /Ascent 1000 /Descent -366 /CapHeight 708 /StemV 72 /XHeight 468 /StemH 64 /AvgWidth 455 /MaxWidth 1569 /FontFile2 50 0 R >> endobj 50 0 obj << /Length 51 0 R /Length1 19672 /Filter /FlateDecode >> stream xݜtu $ 0@ $@R(Ko[,+eɒXrgݬc+nޤ9ݤmN7ufU4ln}'m&q[7gOn6Giڴsg%9ɞS/aysxjV+=v{$/{ZcĽwRw뺗Z=yk'9|~cɻ?cvocuS?{3Wysw^9>{}ǝe^w[򯔺ٍ-mcO7*e(Wf[Z\ܗR; w֎e_'7>T}vI[Vʪw)#+7M/ҸQmQ*:7^ꀚSyԋ\+>"dT\u)jv^ї'˅[:չ*Y_m6elėXU {?ϭ]U =/pWZU:o=pN #lj-W.xΕZܷl?G8NYG8J>~N_>ˉs+IqK?|?Bw9=pN/܎9Wzs/D.Ds۳|s _)#;a{ٿ|n6zN<L{ǣsUNhuY$uU?80fq,p܎[ibeȦBN jv!= w >P#`) ̀iwYhK1^qꈫ8Y1zTIXyu r}QEl *C0qƔ>w6uXoafc+8勞wfY֛[TmƷTDj6erE'5zyqu9c`pޱZ/ mͪETjSP!|Tz7U^^UB%To*lPaVj@ b951‚a%lt {q5&&56i5y]#:'>1Y=RIzx GkZnnsͯjYk-^폷ӟ L tu7͝:kkhTE?zq_Db1+/&`Ƒ . }UVUU!/rD! ⡐;{ JKܕU:z2+ӮѴdu{nOknjO-/zn(ҩޱe;ǻZz[Á\ɻ4m*>f&Uԥ'\*r'Z/Uon요 gW݄gm!.ƌgMu{,2Pf,>S0:>y]']s`F.^>kD\zƷDE!B, (v$H</W@˭:zFkutTb@ #ݣekw{䊱>4;cݥ NcaVDAb$n$* d^E[yKsZѥ3Jc%֯}|kyRYslYJĖm?"zMV>q;&ɧ]4Dm_k? `/GP rPӶ2Ep38ggA˭(+4[%m]G/0+]Cƭp9Xo&ceػ D#'j%:"N8'PrHF00=JIXz8Yw?h]2^(G[yyyyyyժLB2ЛzUp-ABy:›[-d-jgYxP^_ #zL6l*cU'?mɶN_(Sմ͓X8iz×:Ֆ-m_jv85͇/Cc m=ʯ#? p </W@˭ **WUI>><}3Oyg><}3O/Vֵ̭sɔpɶQ~TOᅭ&ӄ~X'p<e %iLz 2$p 6p Ny`k4b[Rqڨ!tĴhqPV֛vlN1Xۼ/5xrl"7{|0!6b¶ᙛ|F-Kݕ]x_%يaƎüeV'޳m]+ Zq N"u1L>^kXޠWzޏ^e`-N_ڌڌڌڌڌXU1I/ 9[(W%MV33^1&û'EQk:;.'Msr0׷i 0}񉽅Dbr_r$+k lWWvܔnjk9I$B[:nZE>FI!A:1]:c{.xdgQ'6/09p%uN*Ҳ,U&V&aR&aR&aR&aR&aR&yQTIKM6;s"}."}."}."}."}."}."} 3E `,S|l N)X8 `,Sp)X8p-ji' r\0s:3{D=^2aa13qmTT_U*Ŀ B*Ŀ B xɂo9> xs9>`Ls0}ٷ7巪MHd̞T='s]Wir'ohht*7әnWWmݙο⤣`ww`Wh`4'Bգ>~R~XOHfKH4:ޏt'pL1t?>P,1s?pzor|cf_ihȿ0p </W( %ؠ(Zcėu| +MXiJV҄&4a +MXiJV+_ 1pot\a-rqL,V}00q^% N3,x < VˠE"]ƧͤMj2'Șlz3稛qcs/qq8ǩd9?P_ԯ o^sZNFհr [.:1I.:a`E /Vgrգ3[;]?x5[!js:nIS@)ˬ0R2uID%Z٭gz#K3.esSVG/HJ%q8A?8"6hHkL`'  q"ñޢlƶ }f}f3Cg>3 }f3Cg>ej(q8MԎ 9"ٔ3llcՍ{=_dpń!gYn >}s [oI-ܾECfr獗[v嶗5SJc-V[cŭ"pq%?x^N/^Ӌuz:x^N/^[:xnlᐽ&'2 9:c[KqIpOg*x[̥0>Gl#m}Ķ>b[Gl#ٷ7[訤&i9ižWƏ=;cjJ7%޽` I-u;wcm=\{2V{o*+wF'6 E? s 6E9Pes`s6`s6`s6`s6`s6`3 d/YPo[E8=4I~" vҲf|tBп[]zb]̮{0^ʭwy呕lqJ^".ޛMG&3c%ԳCTc,$ĕj=OIܨH~fO/^;140VP>'/Q xu n%sKkoX G.ާl}и}{^dtgώآ[b^lы-zE/آ[b^l[E/(4vf]IQlrv&~ڭIU X eE;\sb,epgSY ^BNхFi%9F[lmF[lmF@^aMJi}c~ S'9 9uG~{ѥ!ck&kb$'3kc&[^ܠy:e$$"mvY2GLKhq Et r @%J<߳%㥵ץKSzڧlngKkܮƭi g+6viknfE:vXz#gILϑfz ":&Bf-Z5":E"[>%($șFH5}]5o-%٩ǜ"f 0mFqV[f"BvY3K,U2)KSƝ㗸&364v/k˞s؞^ƨwƥkaJU;|Nٷ`0S-_@rW {xpU3uS{~$SAT8$NSAT8$NSAT8…2"~tiծ2C@"G332s:G~l\~]x?g'X'p<ePP̪3~XiL3~&x?gL3{~Va6\5rE$3رqg?^o_=%3:<9ZHU`b(Ǡ7%GDG9 +b Xֵ̪vm3m=d,4®^$eVrU^./$͙򻗖~[R8Pؖ\{^?:?3;Kf0*rDa跀c!TBX@ a!, BX@ ڰ,%yI+3iypNKpmcXF?+u%qN0]DS0wYzute0)B>)B>)B>)B>)B>)B>)K>6YI:gL)$ⷸ7.Q膌V9YU||0ū"q=ik.A=y*5ԓ~t2&˙LoØ?ѕhʎ×/[h}P߳- @7pfr[s#j 010L 010L 010L #l}GאG;ΈkW,F(r Wge [&Enn{^% N3,x < V@**@AAAAA=ht|zxÙXOikbGR+?Z)sjLg6cfA9c%C,N&dH-0 Y$d\z`>5QX:݆S'[auo[auo[a_ ZVjLA\vg"AG:v&nn.n.nbDxȈ"bٙmsv 8X$8΂` d.uX8J+3564\KͻzzbhehؙBԮ+HZ@ 36ĞJUNEʑDMxeoHml3iKbioڛEQEQEQEQEQEQh?[P[uOO]$b-,uUkd.bGڻtdxo`ilobx"yHljDJ2٥vA$#" RM:ԕk'*޳ޤ0ѧ>dTd]{HB,~-榐/j<xxa{'r]glf$SZMZU'Z/eN-D-/)dǢlYTH/ ^$E2x ^$E2x ^$TH/"Wzv&5q9/ _(j8E)b: 6;;Q^T6p Nyxcz*k#'*[Uɝ999999^#5rD$)Kx2-/VƋbeX/VƋbeX/VƋbeX/Vsm.7y"a]2v% o>Z..fFX-X蘸}W#}Şr7\*.ϧ C{ 雗 Ŝ~Oj)l筜BZ_ԶfvsIVsIΜ x8F֙Ds<dǀ|؇}؇}؇}؇}؇}g8 XuB[jrqeeg$-w., w\v'yʯZԪcY]_vcgn̍Jؙ;scgn̍37vhΨ\-˄%Wu̫6@RdyacOwD@f,} }5x-h{ ͋qT58<'.R$7ˆ6'BQsƎn9VoR95 K=6r~*C3V3$;Kzlٸy"3щz9kURԙh/};.?#\O}KŮ=`WDe"{7S! 896I! o[0Q&K{'2h[ihhLmYmD,"Bkȉ5&>X vxit~028 ΀),X/%ԖR𔔏`4)[@&ܹPOz} ]dHs0 e c,n8NnOg:,Lu^ߡ?{=M"kn:nUuZiF6b_|xݻǩQ!DBݤ4x$ H0*pjRtYC ` NCySjzq=v]d=I.Pq|z֪X()Q-BT"DQ-BT"DQ-BT"D5يk%#LeC/rbMi B7.YVa$/I.}wA~{XNˡݤR CMY j;Qә)k͌|>_;3O_>_|wr%GzU}֪ΝZ'd\ 1f̨3jƌ1f̨3jƌ1f̨3'Rlӌ "0(hW_7s{cΈߚ~yv3~ú uHBVRQhsE-|h1;{Nݷo;zi endstream endobj 51 0 obj 10321 endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PILSKV+Menlo-Regular /FontDescriptor 52 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 602 0 0 0 0 0 0 0 0 0 0 602 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 0 0 602 602 602 602 0 602 0 0 0 0 602 602 602 602 0 602 0 602 602 0 602 0 0 602 0 0 0 0 0 0 602 0 602 602 602 602 602 602 602 602 602 0 602 602 602 602 602 602 602 602 602 602 602 0 602 602 602 ] >> endobj 52 0 obj << /Type /FontDescriptor /FontName /PILSKV+Menlo-Regular /Flags 33 /FontBBox [-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729 /StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 53 0 R >> endobj 53 0 obj << /Length 54 0 R /Length1 12900 /Filter /FlateDecode >> stream x{cEUL29' BEpA!A@B H ,"Eā`D (_#n@'A?IuUtWz{yӈ G9ՇSy:.x[D1}㳃6O8|l3Ns8Ungadp%pptp!q8t»&h|5rx$NS*h_n~!P5a/V{o[8oB_6xk^u@];-lW+;ΰޞ8lG[_`[ lx0/$/rlMX-Mݠ篩 F Tmz/pXyT!3Z\Z'1B%vTB2vXaV ev=2`KR.%n ,氐3(w|'90wX6挅ٝa'2`&Ptoq(0171bcQS8̡ ^IRoġ3D V0`d/xsĥ0Kƙb8D#o9DDE@$\8+BSXX:m,46Br{plAY-&f5;,&ygFޙ `FMz0 )9p%0@ MC  )@l@l MC_ 9:k#dt7@5v]~l@lq,'?Q|@{b͗=[EhwW7d ـO^yVߙCF<;h|Kg \TZ#$ޏJ'\l,G?'{Hi!+dHG68RO6t9i"e/Yš&؏ !1J@q^\zK'x y&“p^y!\!U)d&9Ś'RJN)ڷG+Shc>)ۢ=65OǾ-ڱ*xTl#|_'q:T΅yDḉBB>5/o [Q4SGHiR{98G FK|D60՛tKzq <)]sgSzsq\r+g>׏_t>:?.@];x 3c_#/oJ}Ԣr[wmZ]at_(][dP>DdY5.nAt bG]r1ނܸG n zAԝ洂1I8ֺR"sq0:AQAQOU;"KflE-]w[pd?1{=Q帎9J~o1rb08V^Oz`m[3) 'EBK+A}j"X6aYWRu,㱝Wa{qJ{}NXB"׬"㿇05,X~2s4k:&,˱Ę# 060mhG. 2< QQ@x-";!!BJˆc+B;HE m3Av8x ÍIl2})I%i$CLҝd"٤vs3d斡,筣C":jmG$P^c%9ۜNlg6=v)I|jW_~zJIKdy3rvk6&9 ֆhI*v /֟NKvO{6 8t)Y.V1z#Cr[4h_ x+HP\-SV~;GH(U2u dJˑ4IPz]xe;A%1WDrcElkKesl[/d*JM,ҤQ(vV+a)2K1Xj²q,a1OڏB'`wd8"%$9K,Xa,+Tcفe/|< ױH8nD_iFXinvDgNM~~ZZ~X[䝆W#ob~Yv=\|O))CFmeQW=S,(;Bpe%e2P WgNvEo}3!}4'$c WOQXY-̕$jpm)zAdn:Imhin0 jc]٢rep,T4{7^Q 9ԩJHo.hYK>6@nܿdm}g\ygw5SO3Ԅ*;5JlE܎oR+),3`sC|S"g8HpڍkkiMC7>!1ˍ@ZiVqѠ[wOc;v޴ysŖu+ ;OjM`_Kt<{jw,=sqq* q<uHB[㏥f0sZ(Sub5uZ[mΰ 6_-Gvqdx=@=3ԫOԄj3Wj╚Z_46^6%Dm܌;fMk)*[ :Yqh'>Azp+}4UOs]c+VvS(|ZI+XY##p“%Z4Xepz^EŗN{cȏ ߠ~±Z.J Tq|*IEkj<3짽~:լ3̟m^#$(31xCy],' NK4ŭo[d&Gom;(tɧb8CCwFC.і]RiC@"L~*RgZ6ߡ%$ ba` O'M!>Խ4[j T=dcLB}0+0Ukh=Zש@YhG{zjPww@$G~eK2dVՒnD"x&Zr?33&7iyI\K>( zb!4R! 9a$ b$(1111111111111EH 0 #TmLc1pLc2 d8&1pLc2ᘈ. ڸQ:$"FُFMq!L v  ;)'~i߽|>׿o\moٿZϧ{KΰSNBٯ@6'tGFIvՀMn[j#C2L$]I:;AtCGVl$>rK~1o9n#GJJtCkN#W~*!<};C*RcUUB)]uHHk3na RIe<^{FM=OMqt?P:֭,oै(7}8 n}ހ>{,#y?\3b::l H>*! | :hQ2Jz uB ́&2XDsD!=M23igHb |"-4Q$ΪsJ:bdϘ@o&͗l(If&Qg}0 G6[? M40;9N~ԗ} \t8$[/8#+-J].=8TEl|A H9wŧ0!V[x6s몲UpFkƎ}0zӞ6]8AK(sazKC"}Zd(*(59(h\szBH1ՠJ7Ξqa~q?~siݪtRcF^ej~Eӻhv%B#t{ZI^( RJL1[NپGZ2ʑD:䌖)ѽxfH/ &MYSZSLըx)::ԟarG%QtUZ5m=P(g(*(Бrښ :{<`N~$}3]Y0a岕kV-]͈czU]7>rYթ)ԹsN}v[v뺭^dDڛTG{N?\oT7^4PI!hqsB4-R *62Qo*_%m&Ym+g)S|*VTf2<;""2,k![&#O^<'.Z,c4FT٣}9:uͿ<5 K9Hn\ֹDž[ $KՁ\ qIvAh~؎TQ& ]jw:*E¤p˒\i@z"PY:C">)V{AZO y2C-EX)V؛WC(YnT% Ж+,p?'( C[/NKp,o3 -bx"zܕ??='AY幨OpU/$&JQCMqu(¦U7Rei>2r2z#*hrZo-ׅ2?$MNciJKӧҌ9 j@R(KYRJRcUX******4A_%:Tx0i{a+ggW^L0b\: ԶPZۖJ~'jyʔr"ܫW^Kz+yNMPDf\Q*$0aᚣH ޓL TTk~͕o\r\:iӅ M߂Ur MW<ܴF>N~~*}O5Zja8>jhp:O oOL? kڎ+*v.yȱi)Q#hbbzϻi[bx jʲիVJ)ӎ_Š}dAz˶'z0{ت@(d'F v4E!:fđ1g?وq$>'Oh:61mw撗Y^ݻ=uۇmS.,\&I$ ~-.rE.rbZdJ*AYz0.W14 FG)%%zMc|W\ ~'&쐳tü-Kv4xYYS J%K/{{ u1na:+%vzHנ31Vl˽/n撅[.hmɓT%~m[4G %O!йj~р`~p8ļKk;NX[omh!zUS z.0c<_SKf:*3.b1ӁBu&A dĬA׆]a>Qӵdm ªJ^6ƒX#EBo< X@$^]WSԃe+ji.Okf٫tiLgig0H;S!BX4kHY?kj(0̔f"Cb;RC8j(*H{oö{7w#\(5[[m,C^.PDvɘ6$Q np TTFrWBT:rI-)OOToG݈9t -V'![n 3pzɋʓ\hiM}P)?A7Z{A]7 cw6FDe-fb1B}zn9bY"9,C)dߓ7(GvaBО ȶglήsD" k/{=Q`6܉J>h)o݆LV>q&#ôhޣFm|DպM g v ` Mx"y?';98H 2 #2OF2> endobj 55 0 obj << /Type /FontDescriptor /FontName /KELDLW+AvenirNext-Medium /Flags 32 /FontBBox [-440 -436 1369 1199] /ItalicAngle 0 /Ascent 1000 /Descent -366 /CapHeight 708 /StemV 99 /XHeight 474 /StemH 88 /AvgWidth 459 /MaxWidth 1603 /FontFile2 56 0 R >> endobj 56 0 obj << /Length 57 0 R /Length1 14852 /Filter /FlateDecode >> stream x{yp[}9@$\$v RE(ёH"ٵ%[il&%;4&Mx:iU^ Euju6sg4kv&~D`]r&Rst/=sqKgX{S1-7V>==>|V?Xϝ9|f?±r8ΝxY;_>}]S79|3C1Ѓ\T?>^Wa6+9/':fmL=c='6a]|Ajc]+>??͘aG~CyF?ۀW>y ',XuKIj{ ͱ!"z^Әƒ³OB;;>>y2zu ^pY8%?w>jXpx5!|L]玮6Nm^kG|qj.|-܋Z\\5NϬc6>uM\O_IGVV=U]"쵗\{括*Cc1\s6veŕkklUsqE\{UUC^IH` 1ş:p#>#b\+id5}HaEfxԅE66D &ѨlQx!$ %]'+p\@"΢ 8ZdYqwaay:6#qlcؼ0v<[> >6y>{Cg=|RjsG߭x_;d&z-V28`Ζ~\˾x%ҭ뮵}O/򆷍KOگN{竦i]z6oYZ^~w޷mUiO]׏ܗy=|?؀oJ}[,b~eIcwk%YMvp-uhЙbRB\r@uWuIq^*:v.kf,tV- e EJe# uvifu]6kG.3.}`K>wp`  Td)J8VNvb:LfwY^T]=#ӵ9Gӫo?۫gv6Gxcĉ>!<Ō&ӆ' ' +?9;ﳯ'C6,ǭtv 绎WɆ bFhU F%,'@@&^_a|6n4vpz w=^C`;>П-yІN^6(g<8$ e}ojb4 ƚꤎN& wJϮWфSVl& ^shN{@1XH(e{Ck?<Ϡ #ѬP\| 8>g?6ML㉉`+4NU]]33g~3gf2g q>[l`C 98!' -ȨPm譽CBDȩ,zh 6 !vB~a@^'oy>"K FD$8-f&M<&Ǥ cxL 1A<&Y<$xCuJWR7Y/ro8kf Ùx7zތ?V,ْ[g,2mqf\)<͚vUU(8Ō'3aY>r }xTEPYr&2w=8npi25Q_*h&y{sQ03BH0;lb }~'r@tf%ӌѬb-4SYӌA 껤aF >&h'턠vBN A;5A;!hb"FrҚE${[SM,-OĤŇ+}P%eG#ɻ"I¶^, Ԁ39MHN+c&l܈B8fh+DjEBj+ K7]مh|zu||*.?RWGGj(ttFFQq|8^zot;p%t&p6 u[aI?W4;9\ +vpGAWyOn<]q0z@Ra),C2?B٤v[tUMQlc [JDdA8!u`0@j7j^Ky^RPJ6]`J.韒1p}]3shMBA͈`olj-6F܎C:tw|MV3밶[@#iH[rΝ  ;f#&,6c\UCsPyH5{/֯c+7G_\TeWdpnZ9v>Ў6nPw˄I@${f&N8p:r\N rFrґ0 0 ÚaM°&aX#aXb/B[YI.%#T/?pecpՅڠƜ=0qSo4gx|:}dd-м WK`÷6u̺M ykl)'0װطw&DjK8s@qiKWk\..\zz}˩XmsbzsFR sZK k1cJNzSIk16EeU3T(GD3paLLM^)MqDh:֟keExe/is`@3So'p \&22xrIlqol,pT_xŕ?P>wտƟaC$3i: Q)=$[̉8IZ@ATzPmVlchrPĭݸ,8o1Xmr[XEzѥ +F=*?,OVS lAN&?t˿hM ?,PwYP)q:QpU0}g@€5jcexvNdWy#1Z/F6(2-WMye*bwjn]N3s[* , (qW{3BJR_m57D߼箂eǢpjv9=@D Ļ` uru(Mų= t:B`ѕƆ yI&O#jZ-Ϸ|(ڈj 9D~hBw˲˿o".m%T;*;!Egn1L3WĀ'VA#=!=(23UЌmRWу@q w uSbfus"`us9Xݜfus9l(llFc_,'ҁ[v]=\#돎cI?;Mr)Hb-ek4*}Hg :ã]; ڼ{ 7Z 2Q.Z, 6 sɲ!]EMՈn`-j-ȒjnAwQR')d+5W+~xE?^/{E%M>&K#A>#A>POI)$GSu,ZK%-)_\[׹FJtχɑDl%Fw/60pȤqܓ`eq?Ad!3?=Qfy3CI#9&LJ'k vRӮ?wԉӱ$m &UW{f*mک#I>m.drRuJOd" Fa4]؆&հqyLX7laJmx<~C?xHS[?xHDWRj 'z)KKKwN Ki;YGX_jO7I< 2ډT]E\2!"<Lq'n~Z? p'PLyIL>:K5LF(o:|-'F1 1 B聐^CH@H@H@H:JC2vH!;$cd mʒC2JI F#Al[M/DGg٧{&*'%8vl$]Tt ~Ҏr1G'װZ|^ @?Zm2`VUCH9>CGh4s0._N*VZ nK.O៘34.l> 7POmB4%g̿$`׋sR ɷx{?8H&>49!&K 4"5tlB$"36fND%@Mс::PG@Je@J hJb\T1J1J1JQ%Qz[ш_++ ~įW@  bl\QV9]Bn2aKU+I?Df> ϗŇ b/7KKӫD:s>>pt?11:2cD;އwE6MJf)2Z\ f6DD(zM@"ST xZ4<-xZxZxZEӦ (3(M{֣tڱ ]_d n $v?E1wj=NdS;s+p2S nж7V6bYF,ˈebZP.̵uKż8㷼Q:"d%tAV]lIA"ְC;6%@kIjhv{ɿ׏~Sox %XR^6b;Gm՛1rA! lYxWd%7|+/J&JH"Ґ*&η af- J g`LЩ7XG(?287-iQT_Sl"تQڤPḪW*DFiF(PTO3'յx|zJY׭v,^`Ly0ٚ𴬘bWД*݊¥ZAiyE7Λy5W e* zWncʙr2Qw)`A[ުwgʿ~BZmfǽ:>;UOKD9DYևdEq$ʤȊ<-&څPr?*e|nT-l}w53ɉ۲]kf{nzk=t#ۓ߬*IlO|rp?AceDqņ8ĈʐFwt`W8:)a$ zk7]F݃h]P<}>4]bIJԶGBOd88J0`E ߨ̏2}G``#""rDѭ=G`ȶDp(,nȖ?]hjt~P[j|/Xc\DSp${#>Chn/?.k0dCqKj/-^{$c3*ZRdy O+{ZJ@hʕ ަ*kn(67dz/ݨ gznT v^/Tʹl2H%>dXv}Ι=kk'~?0o03@(/Hw?jHeZ(A[~:Ĵը; ʎ82)vXHH|U;D◖"as /{l ; ?24 T\(Ss3~FS16Z3gϟs m7K v=;3{t׽M"߫4h75z+kg]Yl%m<"ܿKӟd?7\IF87V>) H\ȷ\b(~w.^t^z:?q"`1Յ5!RT7ke 3e* f`* ESU U0Ch+A- [dD /nJ9dp1s=/J0յ-Ij;_.ѩ6]6IuSV_-)T*LRūQ$~vdk#lE.v {(Xk,^GEv``rj3}Й3g6d_tӿ endstream endobj 57 0 obj 8012 endobj 58 0 obj (Mac OS X 10.13.5 Quartz PDFContext) endobj 59 0 obj (D:20190826140639Z00'00') endobj 1 0 obj << /Producer 58 0 R /CreationDate 59 0 R /ModDate 59 0 R >> endobj xref 0 60 0000000000 65535 f 0000252395 00000 n 0000003608 00000 n 0000217881 00000 n 0000000022 00000 n 0000003588 00000 n 0000003712 00000 n 0000006580 00000 n 0000243454 00000 n 0000222198 00000 n 0000233392 00000 n 0000218070 00000 n 0000003844 00000 n 0000006559 00000 n 0000008874 00000 n 0000006616 00000 n 0000008853 00000 n 0000008981 00000 n 0000009144 00000 n 0000009191 00000 n 0000009506 00000 n 0000009236 00000 n 0000009486 00000 n 0000009613 00000 n 0000009762 00000 n 0000195711 00000 n 0000200415 00000 n 0000195734 00000 n 0000200394 00000 n 0000203415 00000 n 0000200463 00000 n 0000203394 00000 n 0000203522 00000 n 0000207590 00000 n 0000203643 00000 n 0000207569 00000 n 0000207697 00000 n 0000213560 00000 n 0000207818 00000 n 0000213539 00000 n 0000213667 00000 n 0000217653 00000 n 0000213841 00000 n 0000217632 00000 n 0000217760 00000 n 0000218006 00000 n 0000218460 00000 n 0000218719 00000 n 0000222177 00000 n 0000222698 00000 n 0000222958 00000 n 0000233370 00000 n 0000233864 00000 n 0000234116 00000 n 0000243433 00000 n 0000243917 00000 n 0000244176 00000 n 0000252279 00000 n 0000252300 00000 n 0000252353 00000 n trailer << /Size 60 /Root 45 0 R /Info 1 0 R /ID [ <212628c55f47b5de97aacabde98b992e> <212628c55f47b5de97aacabde98b992e> ] >> startxref 252470 %%EOF DiscoSnp-2.6.2/scripts/k3000/K3000.py000077500000000000000000000254231420021152700165410ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # ''' Compaction of facts. Non ambiguous overlapping paths are compacted ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys # import getopt import K3000_common as kc # import sorted_list import argparse def is_subsequence(x,y,position_suffix): pos_on_x = position_suffix pos_on_y = 0 len_x = len(x) len_y = len(y) while True: if pos_on_y == len_y: return True # All y was read, it is included in x if pos_on_x == len_x: return False # All x was read, thus y is not included in x if kc.allele_value(x[pos_on_x]) == kc.allele_value(y[pos_on_y]): pos_on_x += 1 pos_on_y += 1 else: pos_on_x += 1 def remove_y_subsequence_of_x(x_ref,facts): ''' remove all y that are subsequence of x Do not care about distances. Exemple 3_0,4_1,5_10 is a subsequence of 0_0,1_12,2_13,3_13,4_12,5_123,6_1 ''' if len(x_ref) == 1: return # as we removed strict equalities, no read can be included in a read of size one. n = len(x_ref) # print ("x",x) for x in [x_ref, kc.get_reverse_fact(x_ref)]: for position_suffix in range(0,n): u = x[position_suffix] Y = facts.get_lists_starting_with_given_prefix([u]) if x in Y: Y.remove(x) for y in Y: if len(y)+position_suffix <= n and is_subsequence(x,y,position_suffix): facts.remove(y) if not kc.is_palindromic(y): facts.remove(kc.get_reverse_fact(y)) def remove_strict_inclusions(facts): ''' remove all facts strictly included in any other ''' n = len(facts) # to_remove=[False for i in range(n)] checked = 0 for fact in facts.traverse(): if checked%100 == 0: sys.stderr.write(" Removing inclusions, "+str(checked)+" checked. Size facts "+str(len(facts))+" %.2f"%(100*checked/n)+"%\r") checked += 1 remove_y_subsequence_of_x(fact,facts) sys.stderr.write(" Removing inclusions, "+str(checked)+" checked. Size facts "+str(len(facts))+" %.2f"%(100*checked/n)+"%\n") return facts def right_unique_extention(facts,fact):#, unitig_lengths,k,min_conflict_overlap): ''' return the unique possible right fact extension with the largest overlap return None if no right extensions or if more than one possible non colinear extensions The returned extension can be fact itself ''' n = len(fact) # **** Get the largest right overlap with fact **** for len_u in range(n-1,0,-1): u = fact[-len_u:] Y = facts.get_lists_starting_with_given_prefix(u) if len(Y) == 0: continue # No y starting with u if len(Y) > 1: return None,len_u # More than one unique y starting with u, for instance y and y'. Knowing that y is not included in y' it means necessary that y and y' are not colinear and that x is thus not right extensible. y = Y[0] # We found the largest y right overlapping fact. # **** check that all other right extensions are collinear with y. # get all y' such that LCSP(fact,y') in [1,len(u)-1] # get all y' starting with a suffix of u Y = [] starting_positions = [] for starting_suffix_position in range(1,len_u): suffix_u = u[starting_suffix_position:] others = facts.get_lists_starting_with_given_prefix(suffix_u) if len(others) >0: Y += others starting_positions += [starting_suffix_position for zz in range(len(others))] if len(starting_positions)>0 and not kc.colinear(y,Y,starting_positions): return None,len_u # more than a unique right extention for x. return y,len_u # A unique maximal right extention for x (unless gready: a unique largest extention, smaller possible extentions under the gready threahold) # not any right extention found. return None,None def fusion (facts,x): '''Main function. For a given fact x, we find y that overlap x with the highest overlap, such that : 1/ there exists no other y' right overlapping x that is not collinear with y 2/ there exists no other x' left overlapping y that is not collinear with x Once done, we compact x and y, and this is finished for x. ''' y,len_u = right_unique_extention(facts,x) # Define, if exists, the unique y != x having the largest right overlap with x. if y == None: return 0 # if no unique right extension, finished, x is not right extensible. if y == x: return 0 # Do not compact x with itself, else, enter an infinite loop y_ = kc.get_reverse_fact(y) # what are left extentions of y, we right extend its reverse complement. if y_ == x: return 0 # Do not compact x with its own reverse complement. xprime_, _ = right_unique_extention(facts,y_) # Define, if exists, the unique xprime_ (!= y_) having the largest right overlap with y_. if xprime_ == None: return 0 # if no unique left extension of the unique right extention of x, finished, x is not right extensible. # assert xprime_ == kc.get_reverse_fact(x), "X "+str(x)+" xprime_ "+str(xprime_)+" Y "+str(y)+" Y_"+str(y_)+"\n" # ***** FUSION ***** # 1/ remove x and its reverse complement if not palindromic # 2/ if y is not x (x==y is possible if x is repeated 2,2,2,2 for instance or if prefix = suffix (1,2,1 for instance)), remove y and its reverse complement if not palindromic # 3/ create the new xy facts and add it (sorted fashion) # isthere = facts.contains(debug_id_node) #DEBUG # 1 facts.remove(x) # ### DEBUG # if isthere and not facts.contains(debug_id_node): # sys.stderr.write("\n\n\nSUPPRESS X \n\n\n"+str(x)+" "+str(y)+"\n\n\n") # sys.exit(0) # ### END DEBUG if not kc.is_palindromic(x): facts.remove(kc.get_reverse_fact(x)) # ### DEBUG # if isthere and not facts.contains(debug_id_node): # sys.stderr.write("\n\n\nSUPPRESS X_ \n\n\n"+str(kc.get_reverse_fact(x))+"\n\n\n") # sys.exit(0) # ### END DEBUG # 2 if x != y: facts.remove(y) # ### DEBUG # if isthere and not facts.contains(debug_id_node): # sys.stderr.write("\n\n\nSUPPRESS Y \n\n\n"+str(x)+" "+str(y)+"\n\n\n") # sys.exit(0) # ### END DEBUG if not kc.is_palindromic(y): facts.remove(kc.get_reverse_fact(y)) # ### DEBUG # if isthere and not facts.contains(debug_id_node): # sys.stderr.write("\n\n\nSUPPRESS Y_ \n\n\n"+str(x)+" "+str(y)+"\n\n\n") # sys.exit(0) # ### END DEBUG # 3 new = x+y[len_u:] facts.sorted_add(new) if not kc.is_palindromic(new): facts.sorted_add(kc.get_reverse_fact(new)) # if isthere and not facts.contains(debug_id_node): # sys.stderr.write("\n\n\n"+str(x)+" "+str(y)+" "+str(new)+"\n\n\n") # sys.exit(0) # we made a compaction, return 1. return 1 def compaction(facts): ''' Compaction of all fact in facts If a fact was not compacted, it will never be compacted. If it was compacted, maybe it will be re-compacted later on. However, no need to re-run the fusion on this read as - either I could have been compacted on the left and this was done before or this will be done latter or - it will be right extended later: the 'new' (the compacted fact) fact is higher in the lexicographic order than the original fact (as it is longer), thus its position is higher in the facts data structure, thus it will be seen again later. Note that this may be not true in parallel computations. ''' checked = 0 compacted = 0 n = len(facts) for fact in facts.traverse(): if checked%100 == 0: sys.stderr.write(" Compacting, "+str(checked)+" checked. Size facts "+str(len(facts))+" %.2f"%(100*checked/n)+"%, "+str(compacted)+" couple of nodes compacted\r") checked += 1 witness = fusion(facts,fact) if witness == 1: # a fusion was done compacted += 1 sys.stderr.write(" Compacting, "+str(checked)+" checked. Size facts "+str(len(facts))+" %.2f"%(100*checked/n)+"%, "+str(compacted)+" couple of nodes compacted\n") return facts def main(): ''' Compaction of set of facts coded as set of ids of unitigs ''' parser = argparse.ArgumentParser(description='Compaction of set of facts coded as set of ids of unitigs.') parser.add_argument("input_file", type=str, help="input file containing dbg paths as a list of unitig ids, eg. on line looks like \"-1;24;198;\"" ) args = parser.parse_args() input_file = str(args.input_file) sys.stderr.write(" Load phased alleles \r") facts, nb_nonvalid = kc.generate_facts_from_disco_pashing(input_file) sys.stderr.write(" Load phased alleles. Done - nb facts="+ str(len(facts))+". "+str(nb_nonvalid)+" were removed because they are non valid\n") sys.stderr.write(" Add reverse complements \r") kc.add_reverse_facts(facts) sys.stderr.write(" Add reverse complements. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Remove strict inclusions\r") facts = remove_strict_inclusions(facts) sys.stderr.write(" Remove strict inclusions. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Compaction of simple paths \r") facts = compaction(facts) sys.stderr.write(" Compaction of simple paths. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Remove2 strict inclusions\r") facts = remove_strict_inclusions(facts) sys.stderr.write(" Remove2 strict inclusions. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Compaction2 of simple paths \r") facts = compaction(facts) sys.stderr.write(" Compaction2 of simple paths. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Remove3 strict inclusions\r") facts = remove_strict_inclusions(facts) sys.stderr.write(" Remove3 strict inclusions. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Compaction3 of simple paths \r") facts = compaction(facts) sys.stderr.write(" Compaction3 of simple paths. Done - nb facts="+ str(len(facts))+"\n") sys.stderr.write(" Print canonical compacted phased alleles\n") kc.print_maximal_facts(facts) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_common.py000077500000000000000000000606511420021152700201130ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Compaction of facts. Non ambiguous paths from a set of facts are compacted @author (except for the 'unique' function) pierre peterlongo pierre.peterlongo@inria.fr ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import sorted_list import os # update_progress() : Displays or updates a console progress bar ## Accepts a float between 0 and 1. Any int will be converted to a float. ## A value under 0 represents a 'halt'. ## A value at 1 or bigger represents 100% #https://stackoverflow.com/questions/3160699/python-progress-bar def update_progress(progress): barLength = 50 # Modify this to change the length of the progress bar status = "" # if isinstance(progress, int): # progress = float(progress) # if not isinstance(progress, float): # progress = 0 # status = "error: progress var must be float\r\n" if progress < 0: progress = 0 status = "Halt...\r\n" if progress >= 1: progress = 1 status = "Done...\r\n" block = int(round(barLength*progress)) text = "\rPercent: [{0}] {1}% {2}".format( "#"*block + "-"*(barLength-block), round(progress*100,2), status) sys.stderr.write(text) sys.stderr.flush() def file_size(f): old_file_position = f.tell() f.seek(0, os.SEEK_END) size = f.tell() f.seek(old_file_position, os.SEEK_SET) return size def hamming_near_perfect (s1, s2, max=0): """ returns True is the hamming distance between {s1} and {s2} at most equal to {max} jocker N are authorized. s1 and s2 are compared as upper case sequences (eg a==A) """ res=0 if len(s1) != len(s2): return False for i in range(len(s1)): if s1[i].upper() == 'N' or s2[i].upper()=='N': continue if s1[i].upper()!=s2[i].upper(): res+=1 if res>max: return False return True def get_complement(char): complement = {"A" : "T", "T" : "A", "G" : "C", "C" : "G", "a" : "t", "t" : "a", "g" : "c" , "c" : "g", "N":"N"} return complement[char] def get_reverse_complement(seq): s = "" for i in range(len(seq)): s = get_complement(seq[i]) + s return s string_allele_value = lambda x: x.split('_')[0] allele_value = lambda x: int(x.split('_')[0]) allele_values = lambda list_: [allele_value(x) for x in list_] distance_string_value = lambda x: x.split('_')[1] def generate_header(raw_int_facts): # from 204_0;201_-23;336_-85; to 102h;100l;168h; res="" for raw_int_fact in raw_int_facts.strip(";").split(';'): res+=unitig_id2snp_id(allele_value(raw_int_fact))+";" return res def d_list_equal(a_d,b_d): a=[allele_value(x) for x in a_d] b=[allele_value(x) for x in b_d] return a==b def d_list_sup(a_d,b_d): a=[allele_value(x) for x in a_d] b=[allele_value(x) for x in b_d] return a>=b def d_list_order(a_d,b_d): a=[allele_value(x) for x in a_d] b=[allele_value(x) for x in b_d] if a 1 # or #-2586h_0;19690h_40; => 2 if line[0]=='#': # print(line,end='') continue line=line.strip().split("=>")[0] line=line.strip().split() for fact in line: if not valid_fact(fact): nb_non_valid+=1 continue facttab=[] for variant in fact.split(';')[:-1]: facttab.append(f(variant.split('_')[0])+"_"+variant.split('_')[1]) facttab = get_canonical(facttab) # store the canonical version of the fact. Btw, afterwards we add all reverse complements. sl.add(facttab) sl.unique() # Remove redundancies return sl, nb_non_valid def generate_facts(file_name): ''' Given an input file storing facts, store them in the fact array''' # -10021_0;68561_21;-86758_3;27414_12; sr_file = open(file_name, 'r') sl = sorted_list.sorted_list() for line in sr_file: if line[0]==">": continue # compatible with fasta-file format line = line.split()[0].rstrip()[:-1].split(';') sr=[] for allele_id in line: # sr_val=int(unitig_id) sr=sr+[allele_id] sl.add(sr) # print(sr)#DEBUG return sl def detect_input_output_edges(facts): ''' Given all stored facts and ther reverse complements, stores variants that have at least one input edge (in has_input_edge) and those that have at least one output edge (in has_output_edge) if a fact is ["4_0","2_3","-6_21"], has_input_edge = {2,-6} has_output_edge = {4,2} this means that ["6_0","-2_21","-4_3"] is also stored, hence: has_input_edge = {2, -6, -2, -4} has_output_edge = {4, 2, 6, -2} Returns: has_input_edge, has_output_edge ''' has_input_edge= set() has_output_edge = set() for fact in facts.traverse(): previous_variant_id = "" # print(fact) for variant_id in allele_values(fact): if previous_variant_id == "": # first value, just store it: previous_variant_id = variant_id continue has_output_edge.add(previous_variant_id) has_input_edge.add(variant_id) previous_variant_id = variant_id # print(f'output {has_output_edge}') # print(f'inputput {has_input_edge}') # sys.exit() return has_input_edge,has_output_edge def add_reverse_facts(facts): ''' For all facts, we add their reverse in the same structure This double the fact size, unless there are palindromes ([1_0,-1_21] for instance). Those are not added. We don't check that this does not create any duplicates''' facts_ = sorted_list.sorted_list() for fact in facts.traverse(): if not is_palindromic(fact): facts_.add(get_reverse_fact(fact)) for fact in facts_.traverse(): facts.add(fact) return facts def colinear(x,X,starting_positions): ''' Check that all sr in X are colinear with x For each sr in X, one knows its starting position on x, with table starting_positions''' for i in range(len(X)): other = X[i] starting_position = starting_positions[i] pos=0 while True: if pos>=len(other) or pos+starting_position>=len(x) : break if allele_value(other[pos]) != allele_value(x[pos+starting_position]): # "non colinear" return False pos+=1 return True def is_canonical(sr): ''' return True if the canonical representation of sr is itself''' if d_list_sup(sr, get_reverse_fact(sr)): return True else: return False def get_canonical(fact): ''' return the canonical representation of sr''' fact_=get_reverse_fact(fact) if d_list_sup(fact, fact_): return fact else: return fact_ def print_maximal_facts(facts): '''print all maximal facts as a flat format''' for sr in facts.traverse(): if is_canonical(sr) or is_palindromic(sr): if len(sr)==1: print (str(allele_value(sr[0]))+";") else: for unitig_id in sr: print (str(unitig_id)+";", end="") print () def determine_k(fa_file_name): """ given the output disco file, ie discoRes_k_31_c_2_D_0_P_3_b_2_coherent.fa return the k value (ie 31). """ return int(fa_file_name.split("_k_")[1].split("_")[0]) def unitig_id2snp_id(unitig_id): sign=1 if unitig_id<0: sign=-1 unitig_id=abs(unitig_id) res=str(sign*(unitig_id//2)) if unitig_id%2==0: res+="h" else: res+="l" return res def get_fact_id(fact): ''' returns the id of a fact WARNING: here fact contains as last value its unique id. ''' return int(fact[-1].split("_")[1]) def get_reverse_fact_id(fact,facts): ''' returns the id of the reverse complement of fact 1/ find the sequence of the fact_ in facts 2/ grab its id WARNING: here fact contains as last value its unique id. ''' #1/ # print("reverse fact id of",fact) without_id_reverse_fact = get_reverse_fact(fact[:-1]) # get the fact reverse complement # print("rc is", without_id_reverse_fact) Y=facts.get_lists_starting_with_given_prefix(without_id_reverse_fact) # find the reverse complement in the list. # print("Y is", Y) for y in Y: # should be of size >= 1. One of them is exactly 'without_id_reverse_fact' plus its id. if len(y) == len(without_id_reverse_fact)+1: # 'y' is 'without_id_reverse_fact' with its node id return get_fact_id(y) # 2/ return None # Should not happend # facts=generate_facts("test.txt") # facts.unique() # facts=add_reverse_facts(facts) # facts.unique() # for sr in facts.traverse(): # print (sr) def get_snp_positions(comment_line): """ from a comment line, eg: >SNP_higher_path_99|P_1:20_C/T,P_2:25_T/C|high|nb_pol_2|left_unitig_length_21|right_unitig_length_14|C1_262|Q1_73|G1_0/1:5710,65,3395|rank_0 returns the snp positions, eg [20, 25] """ positions = [] for variants_localization in comment_line.split("|")[1].split(','): positions.append(int(variants_localization.split(":")[1].split("_")[0])) return positions def index_sequences(fa_file_name, sequences={}): mfile = open(fa_file_name) while True: line1 = mfile.readline() if not line1: break line1 = line1.strip() line2 = mfile.readline().strip() mfile.readline() # USELESS line4 = mfile.readline().strip() if not line1.startswith(">SNP"): continue #line1: #>SNP_higher_path_9|P_1:30_A/C|high|nb_pol_1|left_unitig_length_152|right_unitig_length_3|C1_25|Q1_63|G1_0/1:399,14,359|rank_0 # key is 9h # one need to store the left unitig length. Here 152 # one need to store the right unitig length. Here 3 # note that the position of the left_unitig_length field is always the same with or without multiple snps. snp_positions = get_snp_positions(line1) line1 = line1.split('|') snp_id = line1[0].split('_')[-1] # from SNP_higher_path_9 to 9 left_unitig_len = int(line1[4].split('_')[-1]) right_unitig_len = int(line1[5].split('_')[-1]) sequences[snp_id] = [left_unitig_len, right_unitig_len, line2, line4, snp_positions] #sequences[snp_id] = [left_unitig_len, right_unitig_len, upperseq, lowerseq, snp_positions] mfile.close() return sequences def seq_to_lower_case_except_SNPs(seq, snp_positions): """ given a sequence in ACGTN, put everything in lower case, except the variant positions on the upper case bubble""" res="" position_on_bubble=-1 for letter in seq: if letter.isupper(): position_on_bubble+=1 if position_on_bubble!=-1 and position_on_bubble in snp_positions: res+=letter.upper() else: res+=letter.lower() return res def update_SNP_positions(seq1, seq2): """ Given a sequence `seq1` with upper case letters showing SNP positions, eg acggcgagTg update SNPs positions given a a sequence `seq2` of the same length, eg: aGggTgaggg final results is aGggTgagTg In case of equality of lower case letter, seq1 is abitrary showen raises an error if two distinct upper case letters occur at the same position """ new_seq = "" # print(f'Try concatenate \n{seq1} with \n{seq2}') for i, letter in enumerate(seq1): if seq2[i].isupper(): # detects errors if letter.isupper() and letter != seq2[i]: raise ValueError (f'Cannot concatenate \n{seq1} with \n{seq2}, no solution for position {i} of suffix') # no error conserve the previous value as it was upper case new_seq+=seq2[i] # here either letter is upper, we keep it, or letter is lower, we also keept it. else: new_seq+=letter return new_seq def test_update_SNP_positions(): seq1 = "atggcgagTg" seq2 = "aGggTgtggg" res = update_SNP_positions(seq1,seq2) assert res == "aGggTgagTg" # test_update_SNP_positions() def line2seq(line, sequences, int_facts_format, hamming_max=3): ''' Parses a (non paired) fact, represented by ints or not Returns a bench of information relative to the line to be printed or not to be printed ''' header = line.strip()+ " SP:" # add latter the starting and ending positions of each allele on the global sequence (SP = Sequence positions). Enables to recover the good overlap length in the final GFA file bubble_facts_position_start_stops = "BP:" # to the header is also added the Bubble positions. For each allele in the fact we store the distance between the bubble start (upper case letter and the end of the previous bubble (also upper case letter). We add the length of the bubble (upper case letter). # EG: # ------XXXXXXXXXXXXXXXXXX------ 0_18 # ------------XXXXXXXXXXXXXX----------- 3:14 # ----------XXXXXXXXXXXXXXXX---------- -7:16 (distance is negative is bubbles overlap line=line.strip(';').split(';') previous_bubble_ru=0 full_seq = "" toprint = True for i,int_snp_id_d in enumerate(line): # print("#################@ i #######################@",i) ## _________--------X---------______________________________ previous snp (or full sequence we dont care) ## <---- previous_bubble_ru ----> ## <------ right_unitig_len ----> previous snp -> previous_bubble_ru = k-1+right_unitig_len of the previous snp ## __--------X---------_________________________________ new SNP ## <----> shift between snps <-------------------------> to be written ## <---upper_case---><----------------ru-------------> ## shift + uppercase + ru = to_be_written + previous_bubble_ru ## -> ## to_be_written = shift + uppercase + ru - previous_bubble_ru ## If a SNP is reversed, we reverse complement the sequence and change "right“ unitig for "left" unitig if int_facts_format: allele_id = unitig_id2snp_id(allele_value(int_snp_id_d)) else: allele_id = int_snp_id_d.split("_")[0] # print(f"\n\n *****{int_snp_id_d}, {allele_id} ********") snp_id = allele_id[:-1] higher=True if allele_id[-1] == 'l': higher=False forward=True if allele_id[0] == '-': forward=False snp_id = snp_id[1:] try: if higher: seq = sequences[snp_id][2] else: seq = sequences[snp_id][3] if forward: lu = sequences[snp_id][0] ru = sequences[snp_id][1] len_bubble = len(seq)-lu-ru # len sequence - len left unitig - len right unitig snp_positions = sequences[snp_id][4] else: seq=get_reverse_complement(seq) lu = sequences[snp_id][1] ru = sequences[snp_id][0] len_bubble = len(seq)-lu-ru # len sequence - len left unitig - len right unitig snp_positions = [len_bubble-x-1 for x in sequences[snp_id][4]] # reverse snp positions snp_positions.sort() # and sort them in increasing order #conserves only SNP positions in upper case: seq = seq_to_lower_case_except_SNPs(seq, snp_positions) #treat first snp apart if i==0: full_seq+=seq previous_bubble_ru = ru header+="0_"+str(len(full_seq))+";" # SP==Sequence Positions bubble_facts_position_start_stops+="0_"+str(len_bubble)+";" # print("full_seq =",full_seq) else: to_be_written = len_bubble + ru + int(distance_string_value(int_snp_id_d)) - previous_bubble_ru bubble_facts_position_start_stops+=distance_string_value(int_snp_id_d)+"_"+str(len_bubble)+";" # #DEBUG # print("to_be_written =",to_be_written) # print("len seq =",len(seq)) # print("previous_bubble_ru =",previous_bubble_ru) # print("len_bubble =", len_bubble) # print("start_to_end =", len_bubble+ru) # print("shift =", int(distance_string_value(int_snp_id_d))) # print("full_seq =",full_seq) # print("seq =",seq) # if to_be_written>0: print("add ", seq[-to_be_written:]) # else: print("add nothing") if to_be_written>0: # an overlap exists if to_be_written<=len(seq): # the to_be_written part is smaller or equal to the length of the new sequence, we concatenate the to_be_written part. # check that the overlap is correct. Fake read happen with reads containing indels. We could try to retreive the good overlap, but it'd be time consuming and useless as other reads should find the good shift. p=len(seq)-to_be_written # maximal size of the overlap. if p > len(full_seq): # if the previous sequence is included into the new one, the start on the new seq is shifted # ------------------ full_seq # ------------------------- seq # <---> = len(seq)-len(full_seq)-to_be_written start_on_seq=len(seq)-len(full_seq)-to_be_written stop_on_seq=start_on_seq+min(p,len(full_seq)) else: start_on_seq=0 stop_on_seq=start_on_seq+p if not hamming_near_perfect(full_seq[-p:], seq[start_on_seq:stop_on_seq], hamming_max): #Fake read (happens with reads containing indels). We could try to retreive the good sequence, but it'd be time consuming and useless as other reads should find the good shift. toprint = False break header+=str(len(full_seq)-len(seq)+to_be_written) # starting position of the new sequence on the full seq that overlaps the full seq by len(seq)-to_be_written try: overlap = update_SNP_positions(full_seq[-p:], seq[start_on_seq:stop_on_seq]) except ValueError as err: toprint = False # sys.stderr.write(f"{format(err)} \n") break full_seq = full_seq[:-p]+overlap+seq[-to_be_written:] header+="_"+str(len(full_seq))+";" # ending position of the new sequence on the full seq. else: # the to_be_written part is bigger than the length of the new sequence, we fill with Ns and add the full new seq for i in range(to_be_written-len(seq)): full_seq+='N' header+=str(len(full_seq)) # starting position of the new sequence on the full seq (possibly overlapping the full seq) full_seq+=seq header+="_"+str(len(full_seq))+";" # ending position of the new sequence on the full seq. previous_bubble_ru = ru else: # the new seq finishes before the already created full_seq. In this case we need to update the previous ru wrt ### ----------XXXXXXXX-------------------------- ### <-- pbru --> ### -------------------XXXXX------- ### < tbw > (negative) ### <---npbru ---> (next previous_bubble_ru) ### pbru = shift +len(upper) + npbru --> ### npbru = pbru - shift - len(upper) ### TODO BUG ? (I_ here is alway followed by a negative value in the experiments I made (june 2020)) previous_bubble_ru = previous_bubble_ru-int(distance_string_value(int_snp_id_d))-len_bubble overlap_start = len(full_seq)+to_be_written-len(seq) #(included) overlap_stop = len(full_seq)+to_be_written #(excluded) header += "I_"+str(overlap_start)+"_"+str(overlap_stop)+";" # this allele is useless we do not store its start and stop positions if not hamming_near_perfect(full_seq[overlap_start:overlap_stop], seq, hamming_max): # print(f"Too far:\n{full_seq[overlap_start:overlap_stop]}\n{seq}\n") toprint=False # print(full_seq[overlap_start:overlap_stop]+"\n"+seq+"\n") try: overlap = update_SNP_positions(full_seq[overlap_start:overlap_stop], seq) except ValueError as err: toprint = False # sys.stderr.write(f"{format(err)} \n") break full_seq = full_seq[:overlap_start] + overlap + full_seq[overlap_stop:] except KeyError: # in case a variant is in the phasing file but absent from the disco file. This is due to uncoherent prediction sys.stderr.write(f"{snp_id} not in sequences\n") toprint=False break return toprint, header, bubble_facts_position_start_stops, full_seqDiscoSnp-2.6.2/scripts/k3000/K3000_enhance_gfa.py000066400000000000000000000451561420021152700210410ustar00rootroot00000000000000import sys def get_left_clean_snp(snp): return snp.lstrip().lstrip('-') def set_indexes_from_gfa(gfa_file_name): mfile = open(gfa_file_name) snp_to_fact_id={} # each SNP id (without order nor h or l) is linked to some compacted facts id # eg: '1015': {8, 5, 6, 7} facts={} # each compacted fact is accessible by a unique id. We store only the set of SNPs ids (not their orientering or their intra distance) # eg: 5: {' 5: {'1015h', '827h'}', '827h'} for line in mfile: # S 0 -5001_l;-8805_h;-12869_h;-25834_l;-47306_l;38133_l; if line[0]!="S": continue # not a compacted fact line=line.strip().split() compactedfact_id = line[1] facts[compactedfact_id]=[] # stored as a set to conserve the variants order, needed for computing AC. for value in line[2].strip().split(';')[:-1]: facts[compactedfact_id].append(value) snp_id=get_left_clean_snp(value) # from ' -587h' to '587h' if snp_id[:-1] not in snp_to_fact_id: snp_to_fact_id[snp_id[:-1]]=set() snp_to_fact_id[snp_id[:-1]].add(compactedfact_id) mfile.close() return facts, snp_to_fact_id query_sign = lambda s : "-" if s[0]=="-" else "+" def compatibles(raw_fact,compacted_fact): """"given a raw fact, detects if it is totaly included into the compacted_fact[i] we already know that the 2 facts share at least a snp This methods detects if there exists or not a snp, with distinct alleles in the two facts (eg 1000h in one fact, 1000l in the other). Returns false in this case, True else. When True is returned, a second boolean value is returned. It is set to True of the raw fact and the compacted_fact are in the same orientation, else it is set to false """ ## index query facts: query_fact_to_hl = {} query_fact_to_pm = {} for variant in raw_fact: id_only = variant.lstrip('-')[:-1] query_fact_to_pm[id_only] = query_sign(variant) query_fact_to_hl[id_only] = variant[-1] ## checks that all variants from the raw fact are included in the compacted_fact: for variant in raw_fact: if variant not in compacted_fact and variant.lstrip('-') not in compacted_fact and '-'+variant not in compacted_fact : return False, None ## check compacted fact vs query fact same_direction = False direction_set = False for variant in compacted_fact: id_only = variant.lstrip('-')[:-1] if id_only not in query_fact_to_hl: continue sign = query_sign(variant) if variant[-1] != query_fact_to_hl[id_only]: return False, None # check sign if not direction_set: direction_set = True same_direction = (sign == query_fact_to_pm[id_only]) else: if same_direction and sign != query_fact_to_pm[id_only]: return False, None if not same_direction and sign == query_fact_to_pm[id_only]: return False, None assert (direction_set) return True, same_direction def get_compatible_facts(text_raw_fact, compacted_facts, snp_to_fact_id): """ given the text of a raw fact, returns all compacted_facts ids in which this raw fact occurs add the sign of each of the compacted_facts id in which this raw fact occurs. Negative if it is not the same orientation as the text_raw_fact, else positive Example: * text_raw_fact: -10000l_0;92837_h; * compacted_facts: ... '29731': {'31938l', '499h'} ... (factid -> list of non oriented alleles) * snp_to_fact_id: ... '31938': {'29731'} ... (snp id non oriented -> list of fact ids in which the snp occurs) """ subcompacedfacts=set() # Stores all facts potentially compatible with any of the snp of the text_raw_fact raw_fact_snps = set() # Stores the oriented alleles of the text_raw_fact. result = set() # Stores the id of the compacted facts that are compatible with the input text_raw_fact text_raw_fact=text_raw_fact.rstrip(';') #Avoids an empty value when splitting with ';' for oriented_allele in text_raw_fact.split(";"): snp_id_only=get_left_clean_snp(oriented_allele).split("_")[0][:-1] # get the snp id non oriented if snp_id_only in snp_to_fact_id: # the snp may be absent in case it was removed by the sequence concatenation process. subcompacedfacts=subcompacedfacts.union(snp_to_fact_id[snp_id_only]) # fill the subcompacedfacts with all facts in which the snp id non oriented occurs. raw_fact_snps.add(oriented_allele.split("_")[0]) for j in subcompacedfacts: cmpt,same_orientation = compatibles(raw_fact_snps, compacted_facts[j]) if cmpt: if same_orientation: result.add(int(j)) else: result.add(-int(j)) return result get_allele_id = lambda x: x.split("_")[-1]+x.split("_")[1][0] #>SNP_higher_path_9 to "9h" get_coverage = lambda x: int(x.split("_")[-1]) #C1_31 to int(31) def index_allele_coverage(raw_disco_fa_file_name, read_set_id, alleles_coverage = {}): """ For each allele name (eg 21112l) provides its coverage in the considered read set) Returns a dictionary: allele_id -> coverage Used only by "detects_allele_coverage" """ mfile = open(raw_disco_fa_file_name) # first variant rteated appart to recover the position of the coverage in which we are interested coverage_field=-1 while True: comment = mfile.readline() if not comment: break if not comment.startswith(">SNP"): continue # do not deal with indels for now s_comment = comment.strip().split("|") mfile.readline() # sequence we don't care for i,field_content in enumerate(s_comment): if field_content.startswith("C"+str(read_set_id)+"_"): coverage_field=i break assert coverage_field != -1, "Read set id "+str(read_set_id)+" not in "+comment allele_id = get_allele_id(s_comment[0]) coverage = get_coverage(s_comment[coverage_field]) alleles_coverage[allele_id]=coverage # other variants while True: # >SNP_higher_path_9|P_1:30_C/T,P_2:35_T/G|high|nb_pol_2|left_unitig_length_31|right_unitig_length_66|C1_31|Q1_63|G1_0/1:398,14,458|rank_0 # ggtgcagacaacccggcaggtgttgatgataAAGATCTGGTTAAATACGCCGATATTGGCGCGACTTACTATTTCAATAAAAACATGTCCACCTACGttgactataaaatcaacctgttggatgaagatgacagcttctacgctgccaatggcatctctaccg # >SNP_lower_path_9|P_1:30_C/T,P_2:35_T/G|high|nb_pol_2|left_unitig_length_31|right_unitig_length_66|C1_28|Q1_63|G1_0/1:398,14,458|rank_0 # ggtgcagacaacccggcaggtgttgatgataAAGATCTGGTTAAATACGCCGATATTGGCGTGACTGACTATTTCAATAAAAACATGTCCACCTACGttgactataaaatcaacctgttggatgaagatgacagcttctacgctgccaatggcatctctaccg comment = mfile.readline() if not comment: break if not comment.startswith(">SNP"): continue # do not deal with indels for now comment = comment.strip().split("|") mfile.readline() # sequence we don't care allele_id = get_allele_id(comment[0]) coverage = get_coverage(comment[coverage_field]) alleles_coverage[allele_id]=coverage mfile.close() return alleles_coverage def detects_allele_coverage(compacted_facts, raw_disco_co_file_name, raw_disco_unco_file_name, read_set_id): """ Given the compacted facts indexed and the raw disco output: for each compacted fact, find all allele that belong to it and store its coverage Returns a dictionary: compacted_fact_id -> allele_weight """ alleles_coverage = index_allele_coverage(raw_disco_co_file_name, read_set_id) alleles_coverage = index_allele_coverage(raw_disco_unco_file_name, read_set_id, alleles_coverage) compacted_fact_allele_weight = {} # For each compacted fact id, stores its weight for fact_id, fact_value in compacted_facts.items(): compacted_fact_allele_weight[fact_id] = [] for allele_id in fact_value: #{'10540l', '4734l', '29633h'} allele_coverage = alleles_coverage[get_left_clean_snp(allele_id)] compacted_fact_allele_weight[fact_id].append(allele_coverage) return compacted_fact_allele_weight def detects_facts_coverage(compacted_facts, snp_to_fact_id, raw_facts_file_name): """ Given the compacted facts indexed and the raw phasing information: for each compacted fact, find all facts that belong to it and compute its estimated coverage Returns a dictionary: compacted_fact_id -> weight """ compacted_fact_weight = {} # For each compacted fact id (int), stores its weight mfile = open(raw_facts_file_name) for line in mfile.readlines(): if line[0]=="#" : continue # comment coverage = int(line.strip().split("=>")[-1]) # -10011l_0;13979l_-57;21112l_-22;19270l_-14; => 4 line=line.strip().split("=>")[0].split() # remove coverage and split into two facts if needed for rawfact in line: if len(rawfact)==0: continue # detects all compacted_facts in which the rawfact occurs: matching_compacted_fact_ids = get_compatible_facts(rawfact, compacted_facts, snp_to_fact_id) for matching_compacted_fact_id in matching_compacted_fact_ids: matching_compacted_fact_id = abs(matching_compacted_fact_id) # remove the useless sign here if matching_compacted_fact_id not in compacted_fact_weight: compacted_fact_weight[matching_compacted_fact_id]=0 compacted_fact_weight[matching_compacted_fact_id]+=coverage mfile.close() return compacted_fact_weight def print_facts(phasing_file,compacted_fact_weight, compacted_fact_allele_weight): cpt=0 mfile=open(phasing_file) for line in mfile: if line[0] != "S" : continue #S 0 -5001l;-8805h;-12869h;-25834l;-47306l;38133l; line=line.strip() compacted_fact_id=int(line.split()[1]) fact_weight=0 # assert (compacted_fact_id in compacted_fact_weight) fact_weight = compacted_fact_weight[compacted_fact_id] # assert(str(compacted_fact_id) in compacted_fact_allele_weight) alleles_weight = compacted_fact_allele_weight[str(compacted_fact_id)] print(f"{str(line)}\tFC:i:{str(fact_weight)}\tmin:{min(alleles_weight)}\tmax:{max(alleles_weight)}\tmean:{sum(alleles_weight)/len(alleles_weight)}\tAC:{';'.join(str(e) for e in alleles_weight)};") # print(line+"\tFC:i:"+str(fact_weight)+"\tRC:i:"+str(alleles_weight[1])+"\tmin:i:"+str(alleles_weight[0])+"\tmax:i:"+str(alleles_weight[1])+"\tmean:i:"+str(alleles_weight[2])) ## RC is max ([1]) as we take the max (17/02/2020) cpt+=1 sys.stderr.write(str(cpt)+" facts written\n") mfile.close() def add_pair_edge (pair_edges, left, right, abundance): """ Add a new pair to all stored pairs. Creates cells and dictionary if needed Stores a canonical representation of pairs (smallest id left) """ if left > right: left, right = right, left # swap values if left > right, in order to avoid a -> b and -b -> -a if left not in pair_edges: pair_edges[left]={} if right not in pair_edges[left]: pair_edges[left][right]=0 pair_edges[left][right]+=abundance def detects_pairs_of_linked_compacted_paths(compacted_facts, snp_to_fact_id, raw_facts_file_name, fact_overlaps): """ given the compacted facts indexed and the raw phasing information, detects pairs of facts that are co-mapped by at least one pair of paired non compacted facts returns a dictionary compacted_fact_id -> {compacted_fact_id} such that the key is smaller than all values. """ pair_edges = {} # For each "left" (arbitrary) compacted fact (key) link to a dictionnary right compacted fact -> number of occurrences mfile = open(raw_facts_file_name) for line in mfile.readlines(): if line[0]=="#" : continue # comment abundance = int(line.strip().split("=>")[1]) line=line.strip().split("=>")[0] # remove coverage line=line.strip().split() # two pairs if len(line)<2: continue # we consider only pairs of facts # for the first fact, detects all compacted_facts in which it occurs: left_compacted_facts = get_compatible_facts(line[0], compacted_facts, snp_to_fact_id) # for the second fact, detects all compacted_facts in which it occurs: right_compacted_facts = get_compatible_facts(line[1], compacted_facts, snp_to_fact_id) ### if compacted facts matched, make all pairs if len(left_compacted_facts)>0 and len(right_compacted_facts)>0: for left_compacted_fact_id in left_compacted_facts: for right_compacted_fact_id in right_compacted_facts: if left_compacted_fact_id in fact_overlaps and right_compacted_fact_id in fact_overlaps[left_compacted_fact_id]: continue # this pair only retreives two facts that overlap if right_compacted_fact_id in fact_overlaps and left_compacted_fact_id in fact_overlaps[right_compacted_fact_id]: continue # this pair only retreives two facts that overlap add_pair_edge(pair_edges, left_compacted_fact_id, right_compacted_fact_id, abundance) mfile.close() return pair_edges def print_pair_edges_gfa_style(pair_edges, occurrence_min=1): cpt=0 for left_fact_id in pair_edges: left_sign = '' if left_fact_id<0: left_sign = '-' else: left_sign = '+' abs_left_fact_id = abs(left_fact_id) for right_fact_id in pair_edges[left_fact_id]: # the right sign is reversed as pairend reads map --> <--. Hence if right is forward on a fact we have to reverse this fact right_sign = '' if right_fact_id<0: right_sign = '+' else: right_sign = '-' abs_right_fact_id = abs(right_fact_id) if pair_edges[left_fact_id][right_fact_id]>=occurrence_min: cpt+=1 print ("L\t"+str(abs_left_fact_id)+"\t"+left_sign+"\t"+str(abs_right_fact_id)+"\t"+right_sign+"\t0M\tFC:i:"+str(pair_edges[left_fact_id][right_fact_id])) sys.stderr.write(str(cpt)+" paired fact written\n") def print_facts_overlaps(phasing_file): fact_overlaps={} mfile=open(phasing_file) cpt=0 for line in mfile: if line[0] != "L" : continue cpt+=1 #L 17012 - 23084 + 2M line=line.strip() print(line) # store pairs: source = int(line.split()[1]) target = int(line.split()[3]) if source > target: tmp = source source = target target = tmp if source not in fact_overlaps: fact_overlaps[source]=set() fact_overlaps[source].add(target) sys.stderr.write(str(cpt)+" facts overlaps written\n") return fact_overlaps def detects_pairs_of_edges_sharing_snp(compacted_facts, snp_to_fact_id): """ detects which facts share at least a snp id with incompatible h/l returns a dictionary fact_id -> set(fact_ids) (key is lower than any fact in the value) """ facts_shared_snps = {} for key,values in compacted_facts.items(): for oriented_allele in values: snp_id_only=get_left_clean_snp(oriented_allele).split("_")[0][:-1] # get the snp id non oriented horl = get_left_clean_snp(oriented_allele).split("_")[0][-1] # get the path 'h' or 'l' of the SNP # print("snp_id_only",snp_id_only) if snp_id_only in snp_to_fact_id: # the snp may be absent in case it was removed by the sequence concatenation process. for fact_id in snp_to_fact_id[snp_id_only]: if int(fact_id)<=int(key): continue fact = compacted_facts[fact_id] for snp_id in fact: ### checks that h or l values are disctincts between the two facts if get_left_clean_snp(snp_id).split("_")[0][:-1] == snp_id_only and get_left_clean_snp(snp_id).split("_")[0][-1]!=horl: # TO VALIDATE 9/9/2019 if key not in facts_shared_snps: facts_shared_snps[key] = set() facts_shared_snps[key].add(fact_id) # for key, value in facts_shared_snps.items(): # print(key,value) return facts_shared_snps def print_pairs_of_edges_sharing_snp(facts_shared_snps): cpt=0 for key, values in facts_shared_snps.items(): for value in values: print("L\t"+key+"\t+\t"+value+"\t+\t-2M") cpt+=1 sys.stderr.write(str(cpt)+" pairs of facts sharing at least one snp written\n") def main (phasing_file,raw_facts_file_name, raw_disco_co_file_name, raw_disco_unco_file_name, read_set_id): sys.stderr.write("#INDEX FACTS\n") compacted_facts, snp_to_fact_id = set_indexes_from_gfa(phasing_file) sys.stderr.write("#COMPUTE THE COMPACTED FACT COVERAGES\n") compacted_fact_weight = detects_facts_coverage(compacted_facts, snp_to_fact_id, raw_facts_file_name) sys.stderr.write("#COMPUTE THE COMPACTED FACT ALLELE COVERAGES\n") compacted_fact_allele_weight=detects_allele_coverage(compacted_facts, raw_disco_co_file_name, raw_disco_unco_file_name, read_set_id) sys.stderr.write("#PRINT COMPACTED FACTS \n") print_facts(phasing_file,compacted_fact_weight, compacted_fact_allele_weight) sys.stderr.write("#PRINT COMPACTED FACT OVERLAPS \n") fact_overlaps=print_facts_overlaps(phasing_file) sys.stderr.write("#COMPUTE PAIRS OF COMPACTED FACT GRAPH\n") pair_edges=detects_pairs_of_linked_compacted_paths(compacted_facts, snp_to_fact_id, raw_facts_file_name,fact_overlaps) sys.stderr.write("#PRINT EDGES OF COMPACTED FACT GRAPH\n") print_pair_edges_gfa_style(pair_edges) sys.stderr.write("#COMPUTE THE FACTS SHARING AT LEAST ONE SNP\n") facts_shared_snps = detects_pairs_of_edges_sharing_snp(compacted_facts, snp_to_fact_id) print_pairs_of_edges_sharing_snp(facts_shared_snps) if __name__ == "__main__": main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) # compacted_facts.gfa phased_alleles_read_set_id_1.txt discoRes_k_31_c_2_D_0_P_3_b_2_coherent.fa discoRes_k_31_c_2_D_0_P_3_b_2_uncoherent.fa 1 DiscoSnp-2.6.2/scripts/k3000/K3000_fact_haplotypes_to_localized_variant_ids.py000066400000000000000000000021501420021152700271060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Given a graph (gfa format) in which nodes are facts and given some paths in this graph: Output for each path the corresponding facts with their relative order and inner distances. Fragment of the gfa file: S 2 aCTTTACTTGCTTTACATAGAAGTTATTTGACTCCTGGTGATtcttcttcaGGTTGGACAgCTGGTGCTGCAgCTTATTATGTggNNNNNNNNNNNNctAGGACTTTTCTATTAAAATATAATGAAAATGGAACCATTACagatgctg AS:-77l;513l;118l;-1059h;1001h; SP:0_51;12_61;22_73;41_85;97_1 48; BP:0_41;-23_41;-29_41;-30_41;16_41; FC:i:270 min:319 max:491 mean:377.4 AC:364;319;335;378;491; S 211 gcacaGTCTACAGCATCTGTAATGGTTCCATTTTCATTATATTTTAatagAaaagtcCTagNNNNNNNNNNNNccACATAATAAGCTGCAGCACCAGCTGTCCAACCTGAAGAAGAaTCACCAGGAGtcaaataacTTCtatgtaa AS:768l;310h;-1001h;1059h;-118l;-513l; SP:0_50;7_57;10_61;73_117;85_136;97_146; BP:0_41;-36_41;-33_41;16_41;-30_41;-29_41; FC:i:532 min:319 max:555 mean:431.1666666666667 AC:555;509;491;378;335;319; L 2 + 211 - 123M ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" DiscoSnp-2.6.2/scripts/k3000/K3000_facts_to_fa.py000066400000000000000000000124021420021152700210570ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a FA file from a compacted fact int file. @author pierre peterlongo pierre.peterlongo@inria.fr @deprecated ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc import argparse from collections import defaultdict rev_sign = lambda s: "+" if s == "-" else "-" def store_variant_overlap_length(gfa_file_name): ''' Given a graph_final format where overlaps are stored as: L 0 + 400 + 43M OFL:i:1 Returns a dictionary: key = source_fact_id, value = dictionary: key = target_fact_id, value = overlap length (nucleotides) ''' overlap_lengths = defaultdict(dict) with open(gfa_file_name) as gfa_file: while True: line = gfa_file.readline() if not line: break if line[0] != 'L': continue sline = line.strip().split() OL = int(sline[5][:-1]) if OL<1: continue # add the Overlap Length (OL) overlap_lengths[sline[2]+sline[1]][sline[4]+sline[3]] = OL # add it for the reverse overlap_lengths[rev_sign(sline[4])+sline[3]][rev_sign(sline[2])+sline[1]] = OL return overlap_lengths def store_fact_sequence(gfa_file_name): ''' Given a graph_final format where facts are stored as: S 1 gtGCAATAAGAATTGTCTTTCTTATAATAATTGTCCAACTTAGgGTCAATTTCTGTACaaacaaCACCATCCAAt AS:-577h;-977l;1354l; SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; EV:0 FC:i:52 min:17 max:410 mean:180.0 AC:410;17;113; Returns a dictionary: key = fact_id, value = sequence: ''' fact_sequence = defaultdict(dict) with open(gfa_file_name) as gfa_file: while True: line = gfa_file.readline() if not line: break if line[0] != 'S': continue sline = line.strip().split() fact_sequence[sline[1]] = sline[2] return fact_sequence def get_sequence(facts_sequence, fact_id): ''' fact id is given by \'+12\' or \'-12\' fact sequences are indexed by \'12\' only. if sign is \'+\' returns the corresponding sequence else returns its reverse complement ''' forward_sequence = facts_sequence[fact_id[1:]] if fact_id[0] == '+': return forward_sequence else: return kc.get_reverse_complement(forward_sequence) def formatpathid (pathid: str) -> str: ''' given a path id with format mp (eg. m2093) transformt it to format +- (eg. -2093) ''' if pathid[0] == 'm': return '-'+pathid[1:] if pathid[0] == 'p': return '+'+pathid[1:] raise ValueError def generate_fa(gfa_file_name, path_facts_file_name): ''' paths file contains lines as: haplotypeID ccID fact1;fact2;fact3 abundance eg. 1 19 m463;p3596;m2093;p2782 583.0 we transforme them into a fasta file: >CC_id|Path_id|abundance|Optional stuffs ACGT... ''' overlap_lengths = store_variant_overlap_length(gfa_file_name) facts_sequence = store_fact_sequence(gfa_file_name) with open(path_facts_file_name) as path_facts_file: while True: line = path_facts_file.readline() if not line: break sline = line.strip().split() haplotype_id = sline[0] cc_id = sline[1] facts_path = sline[2] abundance = sline[3] facts_path = facts_path.strip(";") # just in case previous_fact = formatpathid(facts_path.split(";")[0]) sequence = get_sequence(facts_sequence, previous_fact) for current_fact in facts_path.split(";")[1:]: current_fact = formatpathid(current_fact) # TODO: remove those asserts when clearly tested. assert (previous_fact in overlap_lengths) assert (current_fact in overlap_lengths[previous_fact]) OL = overlap_lengths[previous_fact][current_fact] assert(kc.hamming_near_perfect (get_sequence(facts_sequence, previous_fact)[-OL:], get_sequence(facts_sequence, current_fact)[:OL])) # assert(get_sequence(facts_sequence, previous_fact)[-OL:].upper() == get_sequence(facts_sequence, current_fact)[:OL].upper()) sequence += get_sequence(facts_sequence, current_fact)[OL:] previous_fact = current_fact print(f">{cc_id}|{haplotype_id}|{facts_path}|{abundance}\n{sequence}") def main(): ''' Creation of a FA file from a compacted fact int file. ''' parser = argparse.ArgumentParser(description='From phased facts to fasta file.') parser.add_argument("--gfa", type=str, help="File containing the gfa generated by k3000/run.sh (usually named graph_final_X.gfa, with X the read set id)", required=True) parser.add_argument("--paths", type=str, help="File containing phased facts (format: \"haplotypeID ccID fact1;fact2;fact3\"", required=True) args = parser.parse_args() gfa_file_name = str(args.gfa) path_facts_file_name = str(args.paths) generate_fa(gfa_file_name, path_facts_file_name) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_facts_to_gfa.py000077500000000000000000000205221420021152700212330ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a GFA file from a set of compacted maximal facts ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc def show_right_edges (facts,x,id_x): ''' Main function. For a given fact x, we find y that overlap x, and we print the links in a GFA style: L 11 + 12 - overlap size Note that one treat x only if its canonical. Four cases : 1/ x overlaps y, with y canonical. One prints x + y + blabla 2/ x overlaps y_, with y_ non canonical. In this case, y_ overlaps x. One of the two solutions has to be chosen. We chose min(idx,idy) (with idx,idy being the ids of the facts x,y in SR) One searches the id of y, and one prints x + y - blabla. 3/ x_ overlaps y. same as 2. 4/ x_ overlaps y_. We do nothing, this case is treated when the entry of the function is y that thus overlaps x. WARNING: here x and each fact in facts contain as last value its unique id. ''' x=x[:-1] # remove the x_id from the x fact if not kc.is_canonical(x): return n=len(x) # CASES 1 AND 2 strandx='+' # print ("x is", x) for len_u in range(1,n): # for each possible x suffix u=x[-len_u:] # print ("u is", u) Y=facts.get_lists_starting_with_given_prefix(u) # if x in Y: Y.remove(x) # we remove x itself from the list of y : note that it should not occur. # print (x) # assert(x not in Y) if len(Y)==0: continue # No y starting with u for y in Y: # detect the y strand # CASE 1/ if kc.is_canonical(y[:-1]): # remove the last value that corresponds to the node id strandy ='+' # id_y=indexed_nodes.index(y) # get the id of the target node id_y=kc.get_fact_id(y) # last value is the node id, here the id of the target node # CASE 2/ else: strandy='-' # id_y = indexed_nodes.index(kc.get_reverse_fact(y)) id_y=kc.get_reverse_fact_id(y,facts) # find the reverse of list y in facts to grab its id. # assert kc.is_canonical(full_y[:-1]), "not canonical "+str(full_y[-1])+" full = "+str(full_y) # print("y is ", y) # print("id_y is", id_y) if id_x>id_y: continue # x_.y is the same as y_.x. Thus we chose one of them. By convention, we print x_.y if xid_y: continue # x_.y is the same as y_.x. Thus we chose one of them. By convention, we print x_.y if x distances """ compacted_fact_int_file=open(compacted_fact_int_file_name) nodeid_to_distance = {} for fact_line in compacted_fact_int_file.readlines(): # 49648_0;67994_-20;20000_23; SP:0_166;126_261;178_444; BP:0_83;-20_72;23_61; s_fact_line = fact_line.strip().split() node_as_list = [node for node in s_fact_line[0].split(";")[:-1]] # print(s_fact_line[0], node_as_list) if not kc.is_canonical(node_as_list): continue node_id = facts.get_node_id(node_as_list) assert node_id not in nodeid_to_distance, "node "+str(node_id)+" already in truc, with value "+ nodeid_to_distance[node_id] nodeid_to_distance[node_id]=s_fact_line[1]+"\t"+s_fact_line[2] compacted_fact_int_file.close() return nodeid_to_distance def contains_extreme_variant(fact, has_input_edge, has_output_edge): ''' Returns True if a fact contains at least one extreme variant Else returns false ''' for variant_id in kc.allele_values(fact): if variant_id not in has_input_edge or variant_id not in has_output_edge: return True return False def print_GFA_nodes_as_ids(facts, compacted_fact_int_file_name, has_input_edge, has_output_edge): '''print canonical unitigs ids WARNING: here each fact in facts contains as last value its unique id. ''' nodeid_to_distance = index_nodeid_to_distance(facts, compacted_fact_int_file_name) # compacted_fact_int_file=open(compacted_fact_int_file_name) for fact in facts.traverse(): # fact_int=compacted_fact_int_file.readline().strip() # 49648_0;67994_-20;20000_23; SP:0_166;126_261;178_444; BP:0_83;-20_72;23_61; node_id = kc.get_fact_id(fact) # last value is the node id fact = fact[:-1] # remove the last value that corresponds to the node id if not kc.is_canonical(fact): continue print ("S\t"+str(node_id)+"\t", end="") for unitig_id in fact: print (kc.unitig_id2snp_id(kc.allele_value(unitig_id))+";", end="") # check_fact(fact, fact_int) # assert str(node_id) in nodeid_to_distance, nodeid_to_distance print ("\t"+nodeid_to_distance[str(node_id)], end="") if contains_extreme_variant(fact, has_input_edge, has_output_edge): print("\tEV:1") else: print("\tEV:0") def union(a, b): """ return the union of two lists """ return list(set(a) | set(b)) def check(facts): """ debug purpose """ for fact in facts.traverse(): assert kc.get_reverse_fact_id(fact,facts) != None, fact def main(): ''' Creation of a GFA file from a set of facts For eahc fact: indicates if it contains at least an extreme variant Field EV * EV:1 if it contains at least an extreme variant * EV:0 else ''' # SR=[[1,3,4],[14],[4,6],[-6,-1,-2],[4,6,7,9],[9,10,11,12],[4,6],[-13, -12, -11]] facts=kc.generate_facts(sys.argv[1]) kc.add_reverse_facts(facts) has_input_edge, has_output_edge = kc.detect_input_output_edges(facts) facts.sort() facts.index_nodes() # This adds a final value to each sr, providing its node id. # check(facts) sys.stderr.write("Print GFA Nodes\n") print_GFA_nodes_as_ids(facts, sys.argv[1], has_input_edge, has_output_edge) sys.stderr.write("Print GFA Edges\n") print_GFA_edges(facts) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_filter_badly_overlapping_variants.py000077500000000000000000000074761420021152700256060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' From raw facts, remove those for which the overlap is not perfect. Badly overlapping variants may occur when discovering bubbles with b1 or b2. |-----A------| | | -----| | | |------T------| |----C-| |---------- | | |------G------| Bubble1 ---A/C-----T--- Bubble2 ---C---T/G----- If a read contains ----A-----T----, it will be mapped both on * Bubble1A: ---A-------T--- and on * Bubble2T: ---C-------T--- with one mismatch. While we must not phase those two paths. This script removes from raw phased variants those whose overlapping is not perfect. Possible improvement todo: accept mutations on positions were no variant exist (sequencing errors). ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc def filter_and_print_phased_facts(sequences, raw_fact_file_name): ''' Given a set of indexed sequences, the k value and some compacted facts, prints the corresponding fasta seequences Enables also to validate the compacted facts. ''' mfile = open(raw_fact_file_name) conserved = 0 removed = 0 nb_paired_facts = 0 facts_to_print = {} # key = fact (eg "99l_0;-630l_-6;1129l_-22; -1176h_0;316l_-27;-225h_-27;"), value = abundance for line in mfile: # 99l_0;-630l_-6;1129l_-22; -1176h_0;316l_-27;-225h_-27; => 1 # or # 99l_0;-630l_-6;1129l_-22; => 1 if line[0] == "#": continue nb_paired_facts += 1 abundance = int(line.split()[-1]) line = line.split("=")[0].strip() # from "-1000l_0;-136l_-24;-254h_-18;493l_-16; -577h_0;-977h_-26;1354h_-25; => 1" # to "-1000l_0;-136l_-24;-254h_-18;493l_-16; -577h_0;-977h_-26;1354h_-25;" # if the input fact contains a space it means that this is a paired fact, each part is treated printed_fact = "" for fact_as_ids in line.split(): toprint, _, _, seq = kc.line2seq(fact_as_ids, sequences, False) if toprint: # print(f">truc\n{seq}") conserved+=1 if len(printed_fact)>0: printed_fact+=" " printed_fact+=fact_as_ids else: removed+=1 # check if the remaining line is composed of a unique fact composed of a unique variant: if len(printed_fact.split())==1: if len(printed_fact.strip(";").split(";")) < 2: conserved-=1 removed+=1 printed_fact="" if len(printed_fact)>0: if printed_fact not in facts_to_print: facts_to_print[printed_fact]=0 facts_to_print[printed_fact]+=abundance for fact, abundance in facts_to_print.items(): print(f"{fact} => {abundance}") mfile.close() sys.stderr.write(f"Among {conserved+removed} facts (for {nb_paired_facts} paired facts), {conserved} were conserved and {removed} were removed\n") sys.stderr.write(f"Removing redundancies due to filtering, this represents a total of {len(facts_to_print)} (possible paired) facts\n") def main(): if len(sys.argv) !=4: sys.stderr.write(f"Usage: python {sys.argv[0].split('/')[-1]} disco_coherent.fa disco_uncoherent.fa phased_alleles_read_set_id_i.txt> filtered_phased_alleles_read_set_id_i.txt\n") sys.exit(0) # for each snp id: # sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] sequences = kc.index_sequences(sys.argv[1]) # for each snp id: # sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] sequences = kc.index_sequences(sys.argv[2], sequences) filter_and_print_phased_facts(sequences, sys.argv[3]) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_find_unitig_connected_pairs_of_facts.py000066400000000000000000000505121420021152700261760ustar00rootroot00000000000000import sys import K3000_common as kc def update_closests(closests, source, target, distance): # the previously stored distance from previous to current is bigger, replace it: if source in closests: if distance < closests[source][1]: closests[source] = (target, distance) # the variant "source" had no successor: else: # source not in closest closests[source] = (target, distance) def store_closest_variant_id(gfa_file_name): """ Given a gfa file, store for each variant id (eg 12) the closest next variant (eg -42). In this case: closests[12]=-42 and closests[42]=[-12] The distance is computed from the BP field S 1 -577h;-977l;1354l; SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; EV:0 FC:i:52 min:17 max:410 mean:180.0 AC:410;17;113; closests[-577]=-977 closests[-977]=1354 closests[-1354]=977 closests[977]=577 returns closests, that actualy contains alsoe the relative distance eg: closests[-577]=(-977,-26) closests[-977]=(1354,-25) closests[-1354]=(977,-25) closests[977]=(577,-26) . """ closests={} # key = variant id, value = couple (variant id, distance (from SP)) with open(gfa_file_name) as gfa_file: for line in gfa_file.readlines(): if line[0]!='S': continue line = line.split() ids = line[2].strip(';').split(';') distances = line[4].strip(';').split(':')[1].split(';') previous = int(ids[0][:-1]) # -577 for i in range(1,len(ids)): ## previous to current current = int(ids[i][:-1]) # -977 with i=1 distance = int(distances[i].split('_')[0]) # -26 with i=1 ## Forward order: previous to current ## update_closests(closests, previous, current, distance) ## reverse order: -current to -previous ## update_closests(closests, -current, -previous, distance) previous = current return closests def store_fact_extreme_snp_ids(gfa_file_name): """ Given a gfa file, store the id of each extreme SNP (without h or l) """ mfile = open(gfa_file_name) leftmost_snp_to_fact_id={} # each SNP id (with order and without h or l) is linked to some compacted facts id rightmost_snp_to_fact_id={} # each SNP id (with order and without h or l) is linked to some compacted facts id # eg: '-1015': {8, 5, 6, 7} for line in mfile: # S 10 24617l;10033l;-11833l; RC:i:55 if line[0]!="S": continue # not a compacted fact line=line.strip().split() compactedfact_id = int(line[1]) #left leftmost_snp_id=int(line[2].strip().split(';')[0][:-1]) # eg. 24617 if leftmost_snp_id not in leftmost_snp_to_fact_id: leftmost_snp_to_fact_id[leftmost_snp_id] = set() leftmost_snp_to_fact_id[leftmost_snp_id].add(compactedfact_id) if -leftmost_snp_id not in rightmost_snp_to_fact_id: rightmost_snp_to_fact_id[-leftmost_snp_id] = set() rightmost_snp_to_fact_id[-leftmost_snp_id].add(-compactedfact_id) #right rightmost_snp_id=int(line[2].strip(';').split(';')[-1][:-1])# -1 is empty if rightmost_snp_id not in rightmost_snp_to_fact_id: rightmost_snp_to_fact_id[rightmost_snp_id] = set() rightmost_snp_to_fact_id[rightmost_snp_id].add(compactedfact_id) if -rightmost_snp_id not in leftmost_snp_to_fact_id: leftmost_snp_to_fact_id[-rightmost_snp_id] = set() leftmost_snp_to_fact_id[-rightmost_snp_id].add(-compactedfact_id) mfile.close() return leftmost_snp_to_fact_id, rightmost_snp_to_fact_id def get_uppercase_sequence(sequence): """given a sequence lBr with l and r in acgt and B in ACGT, return B""" res="" for l in sequence: if l>='A' and l<='Z': res+=l return res def store_remarkable_kmers(fa_file_name, k, leftmost_snp_to_fact_id, rightmost_snp_to_fact_id, LOs = {}, LIs = {}, RIs = {}, ROs = {}): """ Given a disco output, store for SNPs the remarkable (k-1)mers. Remarkable (k-1)mers are LO (Left Out) Leftmost (k-1)mer on the left unitig LI (Left In) Leftmost (k-1)mer not on the SNP (corresponds to the first k-1 upper case characters) RI (Right In) Rightmost (k-1)mer not on the SNP (corresponds to the last k-1 upper case characters) RO (Right Out) Rightmost (k-1)mer on the right unitig We store only LO and LI for SNPs that are a left most SNP of at least a fact We store only RO and RI for SNPs that are a right most SNP of at least a fact """ # LOs = {} # key: (k-1)mer, value: set of fact ids # LIs = {} # key: (k-1)mer, value: set of fact ids # RIs = {} # key: (k-1)mer, value: set of fact ids # ROs = {} # key: (k-1)mer, value: set of fact ids mfile = open(fa_file_name) while True: line1 = mfile.readline() if not line1: break line1 = line1.strip() #>SNP_higher_path_9995|P_1:30_A/C|high|nb_pol_1|left_unitig_length_1|right_unitig_length_93|C1_39|Q1_63|G1_0/1:494,15,574|rank_0 line2 = mfile.readline().strip() #tGCGCGTCTCCGGCCTGAAAAAGCTGTCCGTAAACGGTACAGATAGCAATCCCCAATCGGGAaccgtctactgtagccagcgccggaatataatccgcgactttaccctgaccaatgagcggccgcacttgccgcaagatgttttctaaaattgc mfile.readline().strip() #>SNP_lower_path_9995|P_1:30_A/C|high|nb_pol_1|left_unitig_length_1|right_unitig_length_93|C1_35|Q1_63|G1_0/1:494,15,574|rank_0 no need to store mfile.readline().strip() #tGCGCGTCTCCGGCCTGAAAAAGCTGTCCGTCAACGGTACAGATAGCAATCCCCAATCGGGAaccgtctactgtagccagcgccggaatataatccgcgactttaccctgaccaatgagcggccgcacttgccgcaagatgttttctaaaattgc no need to store if not line1.startswith(">SNP"): continue #not a SNP snp_id = int(line1.split("|")[0].split('_')[-1]) ### FORWARD CASES ### # This SNP (forward) is the starting of at least one compacted fact. Thus we store its remakable left (k-1)mers and we associate them to the corresponding facts if snp_id in leftmost_snp_to_fact_id: # stored = True LO = line2[:k-1].upper() # get the first (k-1)mer central_sequence = get_uppercase_sequence(line2) LI = central_sequence[:k-1] # association (k-1)mer -> facts if LO not in LOs: LOs[LO] = set() LOs[LO] = LOs[LO].union(leftmost_snp_to_fact_id[snp_id]) if LI not in LIs: LIs[LI] = set() LIs[LI] = LIs[LI].union(leftmost_snp_to_fact_id[snp_id]) # print("heyL",str(snp_id)," hoL ", leftmost_snp_to_fact_id[snp_id]) # This SNP (forward) is the ending of at least one compacted fact. Thus we store its remakable right (k-1)mers and we associate them to the corresponding facts if snp_id in rightmost_snp_to_fact_id: # stored = True RO = line2[-k+1:].upper() # get the last (k-1)mer central_sequence = get_uppercase_sequence(line2) RI = central_sequence[-k+1:] # association (k-1)mer -> facts if RO not in ROs: ROs[RO] = set() ROs[RO] = ROs[RO].union(rightmost_snp_to_fact_id[snp_id]) if RI not in RIs: RIs[RI] = set() RIs[RI] = RIs[RI].union(rightmost_snp_to_fact_id[snp_id]) # print("heyR",str(snp_id)," hoR ", rightmost_snp_to_fact_id[snp_id]) ### REVERSE CASES ### # In this case a fact starts by the reverse of a SNP, eg, -10321. In this case it is sufficient to reverse complement the sequence of the SNP and to have exactly the same treatment as in the forward case. # This SNP (reverse) is the starting of at least one compacted fact. Thus we store its remakable left (k-1)mers and we associate them to the corresponding facts if -snp_id in leftmost_snp_to_fact_id: # stored = True line2 = kc.get_reverse_complement(line2) LO = line2[:k-1].upper() # get the first (k-1)mer central_sequence = get_uppercase_sequence(line2) LI = central_sequence[:k-1] # association (k-1)mer -> facts if LO not in LOs: LOs[LO] = set() LOs[LO] = LOs[LO].union(leftmost_snp_to_fact_id[-snp_id]) if LI not in LIs: LIs[LI] = set() LIs[LI] = LIs[LI].union(leftmost_snp_to_fact_id[-snp_id]) # print("heyL",str(-snp_id)," hoL ", leftmost_snp_to_fact_id[-snp_id]) # This SNP (reverse) is the ending of at least one compacted fact. Thus we store its remakable right (k-1)mers and we associate them to the corresponding facts if -snp_id in rightmost_snp_to_fact_id: # stored = True line2 = kc.get_reverse_complement(line2) RO = line2[-k+1:].upper() # get the last (k-1)mer central_sequence = get_uppercase_sequence(line2) RI = central_sequence[-k+1:] # association (k-1)mer -> facts if RO not in ROs: ROs[RO] = set() ROs[RO] = ROs[RO].union(rightmost_snp_to_fact_id[-snp_id]) if RI not in RIs: RIs[RI] = set() RIs[RI] = RIs[RI].union(rightmost_snp_to_fact_id[-snp_id]) mfile.close() return LOs, LIs, RIs, ROs def add_canonical(canonical_links, left_fact_id, right_fact_id): if abs(left_fact_id) <= abs(right_fact_id): # prints only canonical if left_fact_id not in canonical_links: canonical_links[left_fact_id] = set() canonical_links[left_fact_id].add(right_fact_id) else: if -right_fact_id not in canonical_links: canonical_links[-right_fact_id] = set() canonical_links[-right_fact_id].add(-left_fact_id) def store_sequence_link_facts(LOs, LIs, RIs, ROs, k, rightmost_snp_to_fact_id, fa_file_name, canonical_links = {}): """ given the association (k-1)mers -> leftfacts, we may derive the links between facts 1. RIA == LOB and ROA == LIB -> A+ -> B+ 2. RIA == rc(ROB) and ROA == rc(RIB) -> A+ -> B- 3. LOA == rc(LIB) and LIA == rc(LOB) -> A- -> B+ 4. LOA == RIB and LIA == ROB -> A- -> B- (eq B+ -> A+) In this function we traverse again all variants, for those that are the END of a fact : check if their RI and RO may lead to one of the previous link for those whose reverse complement is the END of a fact : Reverse the sequence and then check if their RI and RO may lead to one of the previous link Case co-mapped: Finaly, two successive facts can exist if their extreme variants (eg r and l) were seen at least once co-mapped and if there exists no other variant (eg m) between r, and l. This information is stored in thie closests dictionary """ mfile = open(fa_file_name) while True: line1 = mfile.readline() if not line1: break line1 = line1.strip() #>SNP_higher_path_9995|P_1:30_A/C|high|nb_pol_1|left_unitig_length_1|right_unitig_length_93|C1_39|Q1_63|G1_0/1:494,15,574|rank_0 line2 = mfile.readline().strip() #tGCGCGTCTCCGGCCTGAAAAAGCTGTCCGTAAACGGTACAGATAGCAATCCCCAATCGGGAaccgtctactgtagccagcgccggaatataatccgcgactttaccctgaccaatgagcggccgcacttgccgcaagatgttttctaaaattgc mfile.readline().strip() #>SNP_lower_path_9995|P_1:30_A/C|high|nb_pol_1|left_unitig_length_1|right_unitig_length_93|C1_35|Q1_63|G1_0/1:494,15,574|rank_0 no need to store mfile.readline().strip() #tGCGCGTCTCCGGCCTGAAAAAGCTGTCCGTCAACGGTACAGATAGCAATCCCCAATCGGGAaccgtctactgtagccagcgccggaatataatccgcgactttaccctgaccaatgagcggccgcacttgccgcaagatgttttctaaaattgc no need to store if not line1.startswith(">SNP"): continue #not a SNP snp_id = int(line1.split("|")[0].split('_')[-1]) # This SNP (forward) is the ending of at least one compacted fact. Thus we store its remakable right (k-1)mers and we associate them to the corresponding facts if snp_id in rightmost_snp_to_fact_id: ROA = line2[-k+1:].upper() # get the last (k-1)mer central_sequence = get_uppercase_sequence(line2) RIA = central_sequence[-k+1:] # CASE 1. if RIA in LOs and ROA in LIs: set_of_right_facts_compatible = LOs[RIA].intersection(LIs[ROA]) # select all facts ids both whose LO == RI and LI == RO -> A+ -> B+ for right_fact_id in set_of_right_facts_compatible: for left_fact_id in rightmost_snp_to_fact_id[snp_id]: add_canonical(canonical_links, left_fact_id, right_fact_id) # print (f"L\t{abs(left_fact_id)}\t{sign(left_fact_id)}\t{abs(right_fact_id)}\t{sign(right_fact_id)}\t-1Ma") # print ("L\t"+str(left_fact_id)+"\t+\t"+str(right_fact_id)+"\t+\t-1Ma") # -1 enables to detect those links # CASE 2. if kc.get_reverse_complement(RIA) in ROs and kc.get_reverse_complement(ROA) in RIs: set_of_right_facts_compatible = ROs[kc.get_reverse_complement(RIA)].intersection(RIs[kc.get_reverse_complement(ROA)]) # select all facts ids both whose RIA == rc(ROB) and ROA == rc(RIB) -> A+ -> B- for right_fact_id in set_of_right_facts_compatible: for left_fact_id in rightmost_snp_to_fact_id[snp_id]: add_canonical(canonical_links, left_fact_id, -right_fact_id) # print (f"L\t{abs(left_fact_id)}\t{sign(left_fact_id)}\t{abs(right_fact_id)}\t{revsign(right_fact_id)}\t-1Ma") # print ("L\t"+str(left_fact_id)+"\t+\t"+str(right_fact_id)+"\t-\t-1Mb") # -1 enables to detect those links # CASE 3. & 4. -> they are symetrical: # Cases 1. & 2. : detects A -> B and A -> B_, the other cases are # CASE 3. A_ -> B will be detected when traversing B, detecting then A_ (Case 2.) # CASE 4. B -> A will be detected when traversing Bn detecting then A (Case 1.) mfile.close() return canonical_links def store_link_facts_from_comapped(leftmost_snp_to_fact_id, rightmost_snp_to_fact_id, closests, canonical_links): """ given a set of rightmost snp to fact ids and leftmost snp to fact id, and the closests variants dictionary: add links between facts """ # is case variants a b were found with distance d # and latter a' b were foun with distance d' < d, we did not deduced a a' with distance d-d' # hence some links are lost. # To avoid non-symetrical prints we store all canonical links and then we print them for source, target in closests.items(): if target[1]<0: continue if source in rightmost_snp_to_fact_id and target[0] in leftmost_snp_to_fact_id: for left_fact_id in rightmost_snp_to_fact_id[source]: for right_fact_id in leftmost_snp_to_fact_id[target[0]]: add_canonical(canonical_links, left_fact_id, right_fact_id) return canonical_links sign = lambda s: "+" if s >=0 else "-" revsign = lambda s: "-" if s >=0 else "+" def print_canonical_successive_links(canonical_links): for source, targets in canonical_links.items(): for target in targets: print(f"L\t{abs(source)}\t{sign(source)}\t{abs(target)}\t{sign(target)}\t-1M") def print_original_gfa(gfa_file_name): mfile = open(gfa_file_name) print ("H\t#################") print ("H\t# GFA of variants") print ("H\t#################") print ("H\t# Nodes are (compacted) facts with their read mapping coverage. Eg. \"S 1 -577h;-977l;1354l; SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; FC:i:52 min:17 max:410 mean:180.0 AC:17;410;113;\".") print ("H\t# * field SP stands for \"Sequence Position\". A bit useless in this file. It indicates for each allele of the fact its starting and ending position in the ACGT sequence, not shown here") print ("H\t# * field BP stands for \"Bubble Position\". For each allele of the fact it indicates:") print ("H\t# - first: the relative position of first nucleotide of the bubble with respect to the position of the last nucleotide of the bubble of the previous allele. This value is equal to zero for the first allele") print ("H\t# - second: the length of the bubble of the allele") print ("H\t# * field EV strands for \"Extreme Variant\". Facts having at least one variant with no input or no output edge are considered as facts having an extreme variants. Their value is set to EV:1. Else, the value is set to EV:0") print ("H\t# * field FC is the coverage of the fact, as provided by the total number of reads that phased at least two alleles of the fact") print ("H\t# * fields min, max, and mean stand resp. for the min, max and mean of the read coverage of all alleles") print ("H\t# * field AC stands for \"Allele Coverage\". The number of reads that map each allele is given in the same order as the variant ids (eg. \"17;410;113;\" are respectively, the coverages of variants \"-577h;-977l;1354l\")") print ("H\t# Four types of edges:") print ("H\t# 1. Overlap between facts. These links have an overlap length >0. Eg, \"L 1 - 29384 + 3M\", with:") print ("H\t# \"S 1 10011l;23229h;-21935l;-8929l;-24397l;10011h; RC:i:24\", and") print ("H\t# \"S 29384 21935l;-23229h;-10011l;24397l;-23229l;-25549h;-10011h; RC:i:43\".") print ("H\t# 2. Facts linked by paired end reads. Eg \"L 10735 + 29384 + 0M FC:i:5\".") print ("H\t# The coverage indicates the number of pairend read linking the two facts") print ("H\t# These links have an overlap of length 0.") print ("H\t# 3. Facts linked by unitigs. The unitig finishing a fact overlaps the unitig starting another fact. Eg \"L 19946 + 11433 + -1M\".") print ("H\t# These links are directed and validate the facts orientation. ") print ("H\t# These links have an overlap of length -1.") print ("H\t# 4. Facts sharing at least one SNP identifier.") print ("H\t# These links have an overlap of length -2.") for l in mfile: print(l,end='') mfile.close() def main (gfa_file_name, co_fa_file_name, unco_fa_file_name): sys.stderr.write("#Print original gfa\n") print_original_gfa(gfa_file_name) sys.stderr.write("#Store extreme left and right variant id for each fact\n") leftmost_snp_to_fact_id, rightmost_snp_to_fact_id = store_fact_extreme_snp_ids(gfa_file_name) k = kc.determine_k(co_fa_file_name) sys.stderr.write("#Store remarkable kmers for each such variant\n") LOs, LIs, RIs, ROs = store_remarkable_kmers(co_fa_file_name, k,leftmost_snp_to_fact_id, rightmost_snp_to_fact_id) LOs, LIs, RIs, ROs = store_remarkable_kmers(unco_fa_file_name, k,leftmost_snp_to_fact_id, rightmost_snp_to_fact_id, LOs, LIs, RIs, ROs) sys.stderr.write("#Compute successive links obtained from kmers\n") canonical_links = store_sequence_link_facts(LOs, LIs, RIs, ROs, k, rightmost_snp_to_fact_id, co_fa_file_name) canonical_links = store_sequence_link_facts(LOs, LIs, RIs, ROs, k, rightmost_snp_to_fact_id, unco_fa_file_name, canonical_links) del LOs, LIs, RIs, ROs sys.stderr.write("#Store distances between co-mapped variants\n") closests = store_closest_variant_id(gfa_file_name) sys.stderr.write("#Compute successive links obtained from co-mapped variants\n") canonical_links = store_link_facts_from_comapped(leftmost_snp_to_fact_id, rightmost_snp_to_fact_id, closests, canonical_links) sys.stderr.write(f"#Write successive links\n") print_canonical_successive_links(canonical_links) if __name__ == "__main__": main(sys.argv[1], sys.argv[2], sys.argv[3]) DiscoSnp-2.6.2/scripts/k3000/K3000_gfa_post_treatment.py000066400000000000000000000104231420021152700224750ustar00rootroot00000000000000import warnings # deprecated import networkx as nx import sys # import getopt import K3000_common as kc # import sorted_list import argparse import negative_binomial as nb def store_graph(gfa_file_name): DG = nx.DiGraph() gfa_file = open(gfa_file_name) while(True): gfa_line=gfa_file.readline() if not gfa_line: break if gfa_line[0]=='H': continue #Header if gfa_line[0]=='S': #node split_gfa_line=gfa_line.strip().split() # print("node", split_gfa_line) node_id = split_gfa_line[1] node_coverage = split_gfa_line[-1].split(':')[-1] # RC:i:24 -> 24 DG.add_node(node_id, coverage=node_coverage) # print("added", node_id, node_coverage) if gfa_line[0]=='L': #edge split_gfa_line=gfa_line.strip().split() # print("edge", split_gfa_line) source = split_gfa_line[1] target = split_gfa_line[3] overlap = split_gfa_line[5] if overlap == "0M" or overlap == "-2M": continue #pairend and forbiden link are not considered # if overlap == "-2M": continue #forbiden link DG.add_edge(source, target,type=overlap) gfa_file.close() return DG def remove_outsider_nodes_from_cc(DG,cc): """ for each CC compute the r,p values of the coverage distributions of the nodes Remove nodes that are too far from the mean distribution This creates new CC """ return # does nothing for now, waiting for amin. if len(cc)<8: return # TODO: parameter coverages = [] for node_id in cc: print(DG.nodes[node_id]['coverage']) coverages.append(int(DG.nodes[node_id]['coverage'])) print("for",coverages) n,p=nb.neg_bin_fit(coverages) E=n/p V=n*(1-p)/(p*p) print("n",n,"p",p,"E",E,"V",V) #TODO remove outsider nodes from the graph def assign_cc(DG,max_cc_size=sys.maxsize): #CC=list(nx.connected_components(nx.Graph(DG))) #for cc in CC: # remove_outsider_nodes_from_cc(DG,cc) # recompute CC after having removed outsiders from original CCs # assign each node to its cc_id CC=list(nx.connected_components(nx.Graph(DG))) cc_id=0 for cc in CC: cc_id +=1 if len(cc) > max_cc_size: # print ("remove nodes from too large", len(cc) ) for node_id in cc: DG.remove_node(node_id) continue for node_id in cc: DG.nodes[node_id]['cc_id'] = cc_id def remove_cc_with_cycles(DG): # remove pairend links and unitig links (unoriented) edges_to_remove = [] for edge in DG.edges.data(): if edge[2]['type'] == '-1M': edges_to_remove.append(edge) for edge in edges_to_remove: DG.remove_edge(edge[0],edge[1]) cycles = list(nx.simple_cycles(DG)) # sys.stderr.write(f" removed {len(cycles)} cycles\n") #DEB # tmpnb=0 #DEB G=nx.Graph(DG) for nodes in cycles: first_node_in_cycle = nodes[0] # get the first node, the other ones in the cycle are in the same CC # remove the whole CC: CC_with_cycle = nx.node_connected_component(G, first_node_in_cycle) for node_id in CC_with_cycle: if node_id in DG.nodes(): # tmpnb+=1 #DEB DG.remove_node(node_id) # sys.stderr.write(f" removed {tmpnb} nodes\n") #DEB def main(): ''' Compaction of set of facts coded as set of ids of unitigs ''' warnings.warn(f"{sys.argv[0]} is not maintenained anymore (May 2020).", DeprecationWarning) parser = argparse.ArgumentParser(description='Compaction of set of facts coded as set of ids of unitigs.') parser.add_argument("input_file", type=str, help="gfa file " ) max_cc_size = 1000 args = parser.parse_args() gfa_file_name = str(args.input_file) DG = store_graph(gfa_file_name) assign_cc(DG,max_cc_size) # print(DG.nodes.data()) remove_cc_with_cycles(DG) if '1' in DG.nodes(): print("is in DG", DG.nodes['1']['cc_id']) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_gfa_to_dat.py000066400000000000000000000533651420021152700207130ustar00rootroot00000000000000import sys import K3000_gfa_post_treatment as gpt # :) import warnings # from deprecated import deprecated ################# 28 APRIL 2020 - Now this script is managed by Kerian Thuillier ################## ################# No more maintained ################## """ #id of forward and reverse nodes set V := p0 p1 p2 m0 m1 m2 ; param number_loci p0 3 p1 2 p2 2 m0 3 m1 2 m2 2 ; #id of nodes with their coverage. Here (3 sept 2019) coverage refers to the read coverage of the less covered allele of all alleles of the fact param w := p0 5626 m0 5626 p1 10152 m1 10152 p2 1142 m2 1142 ; #for each forward node, indicates the id of the reverse version set reverse := p0 m0 p1 m1 p2 m2 ; #set of edges. Four types of edges, 1/ "overlaps" edges, that show an overlap between facts and 2/ "links" edges, that represent facts linked by paired reads (distanace unknown) and 3/ "successive" edges that represent two successive facts (without phasing) and 4/ "incompatible" edges, no path should contain two nodes linked by such an edge set Edges := p0 m55 overlaps p0 m53 overlaps p1 m55 overlaps p303 p305 links p303 p310 links p303 p304 links p0 p54 incompatibles p0 p1 incompatibles p0 p2 incompatibles p243 p341 successive p244 p341 successive p320 m388 successive ; #overlap length of each edge. For an "overlaps" edge, it indicates the number of common variants. For any other edge type (links, successive, or incompatibles), this is set to zero param l := p0 m55 overlaps 3 p0 m53 overlaps 3 p1 m55 overlaps 3 p303 p305 links 0 p303 p310 links 0 p303 p304 links 0 p0 p54 incompatibles 0 p0 p1 incompatibles 0 p0 p2 incompatibles 0 p243 p341 successive 0 p244 p341 successive 0 p320 m388 successive 0 ; #Coverage of the pairend links. Note that overlap links do not have any coverage (just computed from fact overlaps). Also incompatible and successive links do not have coverage, by definition. param pairend_end_links_coverage := p0 m55 overlaps 0 p0 m53 overlaps 0 p1 m55 overlaps 0 p303 p305 links 12 p303 p310 links 3 p303 p304 links 7 p0 p54 incompatibles 0 p0 p1 incompatibles 0 p0 p2 incompatibles 0 p243 p341 successive 0 p244 p341 successive 0 p320 m388 successive 0 """ def print_header(): print("#haplotype number") print("# *** note about abundances ***") print("# This file contains four values of abundances per fact") print("# - ab_min: the coverage of the less covered variant of the fact") print("# - ab_max: the coverage of the most covered variant of the fact") print("# - ab_avg: the average coverage of the variants of the fact") print("# - ab_comapped: total number of reads i/ mapped on the fact and ii/ mapping at least two variants of the fact") print("# Full example") print("# * * * * * * (variant positions on the fact)") print("# -------- (read mapping at least two variants)") print("# -------- (read mapping at least two variants)") print("# ----- (read mapping at least two variants)") print("# -------- (read mapping at least two variants)") print("# ---- (read mapping at least two variants)") print("# -------- (read mapping at least two variants)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# -- (read mapping one variant)") print("# 3 4 6 4 4 2 (for each variant how many reads mapped on it)") print("# Here: ab_comapped=6, ab_min=2, ab_max=6, ab_avg=3.84") print("# *** End note about abundances ***") print("param mult := XXX") oposite_sign = lambda x: "m" if x == "p" else "p" def print_nodes(gfa_file_name, DG=None): print("#id of plus (p) and minus (m) nodes") print("set V :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): if not line: break line=line.strip() if line[0]=="S": "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" node_id = line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment print("p"+node_id) # 'p' stands for "plus strand" print("m"+node_id) # 'p' stands for "minus strand" print(";") gfa_file.close() def print_nodes_number_loci(gfa_file_name, DG=None): print("#id of nodes with their number of variants") print("param length :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" print("p"+node_id+"\t"+str(len(line.split()[2].strip(";").split(";")))) print("m"+node_id+"\t"+str(len(line.split()[2].strip(";").split(";")))) print(";") gfa_file.close() def print_nodes_ab_min(gfa_file_name, DG=None): print("#id of nodes with their ab_min coverage") print("param ab_min :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" print("p"+node_id+"\t"+line.split()[6].split(":")[-1]) assert(line.split()[6].split(":")[0]=="min") print(";") gfa_file.close() def print_nodes_ab_max(gfa_file_name, DG=None): print("#id of nodes with their ab_max coverage") print("param ab_max :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" print("p"+node_id+"\t"+line.split()[7].split(":")[-1]) assert(line.split()[7].split(":")[0]=="max") print(";") gfa_file.close() def print_nodes_ab_avg(gfa_file_name, DG=None): print("#id of nodes with their ab_avg coverage") print("param ab_avg :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" print("p"+node_id+"\t"+line.split()[8].split(":")[-1]) assert(line.split()[8].split(":")[0]=="mean") print(";") gfa_file.close() def print_nodes_weight_phased_alleles(gfa_file_name, DG=None): print("#id of nodes with their coverage. Here coverage refers to the total number of reads that phased at least two alleles of the fact ") print("param ab_comapped :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" print("p"+node_id+"\t"+line.split()[5].split(":")[-1]) assert(line.split()[5].split(":")[0]=="FC") print(";") gfa_file.close() def print_reverse(gfa_file_name,DG=None): print("#for each forward node, indicates the id of the reverse version") print("set reverse :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" node_id=line.split()[1] if DG and node_id not in DG.nodes(): continue # this node was removed during gfa post treatment print("p"+node_id+"\t"+"m"+line.split()[1]) # 'p' stands for "plus strand" print(";") gfa_file.close() def print_nodes_connected_components(gfa_file_name, DG): print("#id of forward nodes with their connected component id. ") print("param comp :=") gfa_file = open(gfa_file_name) for line in gfa_file.readlines(): line=line.strip() if line[0]=="S": "S 0 1234h;-1354h;977h;577h; SP:0_54;53_96;64_117;84_128; BP:0_41;6_41;-25_41;-26_41; FC:i:579 min:410 max:467 mean:441.5 AC:436;467;453;410;" node_id=line.split()[1] if node_id not in DG.nodes(): continue # this node was removed during gfa post treatment cc_id = DG.nodes[node_id]['cc_id'] print("p"+node_id+"\t"+str(cc_id)) print("m"+node_id+"\t"+str(cc_id)) print(";") gfa_file.close() # @deprecated(reason="Not used anymore, redundant with function `already_used` generic for all kind of links") # def printable_successive(printed_successive, source_id, target_id): # # """ # 1/ checks of source_id <-> target_id not already in printed_successive. If already inside, do nothing and returns false # 2/ [else] add target_id in source_id key and return true # """ # # source is always the smallest, avoid to test both directions. # if target_id < source_id: # tmp = source_id # source_id = target_id # target_id = tmp # if source_id in printed_successive and target_id in printed_successive[source_id]: return False # # if source_id not in printed_successive: printed_successive[source_id] = [] # printed_successive[source_id].append(target_id) # return True def already_used(edges,sign_source,source_id,sign_target,target_id,type): """ detects if the edge had already been used This is necessary to avoid duplicated edges. For instance if the gfa contains: L 571 + 829 - -1M ... L 829 + 571 - -1M Then, the line is duplicated as it contains the same piece of information. Hence we have to store the fact that the edge was already printed with: L 571 + 829 - -1M for instance. We do this by storing for the lowest node id. """ if type not in edges: edges[type] = {} if source_id > target_id: if sign_source == "m": sign_source="p" else: sign_source = "m" if sign_target == "m": sign_target="p" else: sign_target = "m" tmp = source_id source_id = target_id target_id = tmp source = sign_source+source_id target = sign_target+target_id already = True if source not in edges[type]: edges[type][source] = set() if target not in edges[type][source]: edges[type][source].add(target) already = False if type == "successive": sign_source = oposite_sign(sign_source) sign_target = oposite_sign(sign_target) source = sign_source+source_id target = sign_target+target_id if source not in edges[type]: edges[type][source] = set() if target not in edges[type][source]: edges[type][source].add(target) already = False return already def print_edges(gfa_file_name, DG=None): print("#set of edges. Four types of edges, 1/ \"overlaps\" edges, that show an overlap between facts and 2/ \"links\" edges, that represent facts linked by paired reads (distanace unknown) and 3/ \"successive\" edges that represent two successive facts (without phasing) and 4/ \"incompatible\" edges, no path should contain two nodes linked by such an edge ") printed_edges = {} print("set Edges :=") gfa_file = open(gfa_file_name) # printed_successive = {} # key = id, target = [ids]. Used to retain which successive links ad been writen, avoiding redundancies for line in gfa_file.readlines(): line=line.strip() if line[0]=="L": "L 1 - 29384 + 8M" "to" "m1 p29384 overlaps" source_id = line.split()[1] target_id = line.split()[3] if DG: if source_id not in DG.nodes() or target_id not in DG.nodes(): continue # one of these nodes was removed during gfa post treatment overlap_len = int(line.split()[5].rstrip("M")) sign_source="p" if line.split()[2]=='-': sign_source="m" sign_target="p" if line.split()[4]=='-': sign_target="m" type="overlaps" if overlap_len==0: type="links" if overlap_len==-1: type="successive" if overlap_len==-2: type="incompatibles" if already_used(printed_edges,sign_source,source_id,sign_target,target_id,type): continue if type == "overlaps" or type=="successive" or type=="links": print(sign_source+source_id+"\t"+sign_target+target_id+"\t"+type) # print the reverse of these nodes sign_source = oposite_sign(sign_source) sign_target = oposite_sign(sign_target) print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type) else: # All those nodes are non oriented - need all possible combinations for sign_source in "m","p": for sign_target in "m", "p": print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type) print(";") gfa_file.close() def print_edge_coverages(gfa_file_name, DG=None): print ("#Coverage of the pairend links. Note that overlap links do not have any coverage (just computed from fact overlaps). Also incompatible and successive links do not have coverage, by definition. ") print ("param pairend_end_links_coverage :=") printed_edges = {} gfa_file = open(gfa_file_name) # printed_successive = {} # key = id, target = [ids]. Used to retain which successive links ad been writen, avoiding redundancies for line in gfa_file.readlines(): line=line.strip() if line[0]=="L": "L 1 - 29384 + 8M" "to" "m1 p29384 overlaps 8" source_id = line.split()[1] target_id = line.split()[3] if DG: if source_id not in DG.nodes() or target_id not in DG.nodes(): continue # one of these nodes was removed during gfa post treatment overlap_len = int(line.split()[5].rstrip("M")) sign_source="p" if line.split()[2]=='-': sign_source="m" sign_target="p" if line.split()[4]=='-': sign_target="m" type="overlaps" coverage=0 if overlap_len==0: type="links" coverage = int(line.split()[6].split(":")[-1]) if overlap_len==-1: type="successive" if overlap_len==-2: type="incompatibles" if already_used(printed_edges,sign_source,source_id,sign_target,target_id,type): continue if type == "overlaps" or type=="successive" or type=="links": print(sign_source+source_id+"\t"+sign_target+target_id+"\t"+type+"\t"+str(coverage)) # print the reverse of these nodes sign_source = oposite_sign(sign_source) sign_target = oposite_sign(sign_target) print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(coverage)) else: # All those nodes are non oriented - need all possible combinations for sign_source in "m","p": for sign_target in "m", "p": print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(coverage)) print(";") gfa_file.close() def print_edges_content(gfa_file_name, DG=None): print("#overlap length of each edge. For an \"overlaps\" edge, it indicates the number of common variants. For any other edge type (links, successive, or incompatibles), this is set to zero") print("param l :=") printed_edges = {} gfa_file = open(gfa_file_name) # printed_successive = {} # key = id, target = [ids]. Used to retain which successive links ad been writen, avoiding redundancies for line in gfa_file.readlines(): line=line.strip() if line[0]=="L": "L 1 - 29384 + 8M" "to" "m1 p29384 overlaps 8" source_id = line.split()[1] target_id = line.split()[3] if DG: if source_id not in DG.nodes() or target_id not in DG.nodes(): continue # one of these nodes was removed during gfa post treatment overlap_len = int(line.split()[5].rstrip("M")) sign_source="p" if line.split()[2]=='-': sign_source="m" sign_target="p" if line.split()[4]=='-': sign_target="m" type="overlaps" if overlap_len==0: type="links" if overlap_len==-1: type="successive" if overlap_len==-2: type="incompatibles" # print(sign_source+source_id+"\t"+sign_target+target_id+"\t"+type+"\t"+str(max(0,overlap_len))) # # do not print other edges (unitig linked and snp linked) # # # print the reverse of these nodes # if sign_source == "m": sign_source="p" # else: sign_source = "m" # if sign_target == "m": sign_target="p" # else: sign_target = "m" # print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(max(0,overlap_len))) # if already_used(printed_edges,sign_source,source_id,sign_target,target_id,type): continue if type == "overlaps" or type=="successive" or type=="links": print(sign_source+source_id+"\t"+sign_target+target_id+"\t"+type+"\t"+str(max(0,overlap_len))) # print the reverse of these nodes sign_source = oposite_sign(sign_source) sign_target = oposite_sign(sign_target) print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(max(0,overlap_len))) else: # All those nodes are non oriented - need all possible combinations # if type=="successive" and not printable_successive(printed_successive, source_id, target_id): continue # if type=="links": # sign_source = "p" # sign_target = "p" # print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(max(0,overlap_len))) # continue for sign_source in "m","p": for sign_target in "m", "p": print(sign_target+target_id+"\t"+sign_source+source_id+"\t"+type+"\t"+str(max(0,overlap_len))) # if type=="successive": # in case of successive edges, one needs to indicate all possibilities p/m and forward and reverse # print(sign_source+source_id+"\t"+sign_target+target_id+"\t"+type+"\t"+str(max(0,overlap_len))) print(";") gfa_file.close() def main(gfa_file_name): ''' Creation of a DAT file from the graph_plus.gfa GFA file Usage: python ~/workspace/gatb-discosnp/scripts/k3000/K3000_gfa_to_dat.py graph_plus.gfa > graph_diploid.dat ''' warnings.warn(f"{sys.argv[0]} is not maintenained anymore (May 2020).", DeprecationWarning) # Store the information as a graph. # This enables # to compute connected components # to remove cycles # to remove too large cc DG = None sys.stderr.write("Storing the graph\n") DG = gpt.store_graph(gfa_file_name) # store the graph without paired edges sys.stderr.write("Detecting connected components\n") gpt.assign_cc(DG) sys.stderr.write("Removing connected compoenents with cycles\n") gpt.remove_cc_with_cycles(DG) sys.stderr.write("Printing out the dat file\n") print_header() print_nodes(gfa_file_name,DG) print_nodes_number_loci(gfa_file_name, DG) print_nodes_ab_min(gfa_file_name,DG) print_nodes_ab_max(gfa_file_name,DG) print_nodes_ab_avg(gfa_file_name,DG) print_nodes_weight_phased_alleles(gfa_file_name, DG) print_reverse(gfa_file_name,DG) if DG: print_nodes_connected_components(gfa_file_name, DG) print_edges(gfa_file_name,DG) print_edge_coverages(gfa_file_name, DG) print_edges_content(gfa_file_name,DG) if __name__ == "__main__": main(sys.argv[1]) DiscoSnp-2.6.2/scripts/k3000/K3000_gfa_to_fa.py000066400000000000000000000012011420021152700205070ustar00rootroot00000000000000import sys def gfa_to_fa(gfa_file_name: str): """Prints genomic sequences from GFA nodes Args: gfa_file_name (str): File name of the input GFA """ with open(gfa_file_name) as gfa_file: for gfa_line in gfa_file.readlines(): # S 13 ctagtgggggacaaccaatcactaattgtgataAgatgtggtgtacacacactggtactggtcaggcaat AS:37h; SP:0_70; BP:0_61; EV:1 FC:i:60 min:113 max:113 mean:113.0 AC:113; if gfa_line[0] != "S": continue print(f">{gfa_line.split()[1]}\n{gfa_line.split()[2]}") if __name__ == '__main__': gfa_to_fa(sys.argv[1]) DiscoSnp-2.6.2/scripts/k3000/K3000_msr_to_gfa.py000066400000000000000000000205221420021152700207310ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a GFA file from a set of compacted maximal facts ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc def show_right_edges (facts,x,id_x): ''' Main function. For a given fact x, we find y that overlap x, and we print the links in a GFA style: L 11 + 12 - overlap size Note that one treat x only if its canonical. Four cases : 1/ x overlaps y, with y canonical. One prints x + y + blabla 2/ x overlaps y_, with y_ non canonical. In this case, y_ overlaps x. One of the two solutions has to be chosen. We chose min(idx,idy) (with idx,idy being the ids of the facts x,y in SR) One searches the id of y, and one prints x + y - blabla. 3/ x_ overlaps y. same as 2. 4/ x_ overlaps y_. We do nothing, this case is treated when the entry of the function is y that thus overlaps x. WARNING: here x and each fact in facts contain as last value its unique id. ''' x=x[:-1] # remove the x_id from the x fact if not kc.is_canonical(x): return n=len(x) # CASES 1 AND 2 strandx='+' # print ("x is", x) for len_u in range(1,n): # for each possible x suffix u=x[-len_u:] # print ("u is", u) Y=facts.get_lists_starting_with_given_prefix(u) # if x in Y: Y.remove(x) # we remove x itself from the list of y : note that it should not occur. # print (x) # assert(x not in Y) if len(Y)==0: continue # No y starting with u for y in Y: # detect the y strand # CASE 1/ if kc.is_canonical(y[:-1]): # remove the last value that corresponds to the node id strandy ='+' # id_y=indexed_nodes.index(y) # get the id of the target node id_y=kc.get_fact_id(y) # last value is the node id, here the id of the target node # CASE 2/ else: strandy='-' # id_y = indexed_nodes.index(kc.get_reverse_fact(y)) id_y=kc.get_reverse_fact_id(y,facts) # find the reverse of list y in facts to grab its id. # assert kc.is_canonical(full_y[:-1]), "not canonical "+str(full_y[-1])+" full = "+str(full_y) # print("y is ", y) # print("id_y is", id_y) if id_x>id_y: continue # x_.y is the same as y_.x. Thus we chose one of them. By convention, we print x_.y if xid_y: continue # x_.y is the same as y_.x. Thus we chose one of them. By convention, we print x_.y if x distances """ compacted_fact_int_file=open(compacted_fact_int_file_name) nodeid_to_distance = {} for fact_line in compacted_fact_int_file.readlines(): # 49648_0;67994_-20;20000_23; SP:0_166;126_261;178_444; BP:0_83;-20_72;23_61; s_fact_line = fact_line.strip().split() node_as_list = [node for node in s_fact_line[0].split(";")[:-1]] # print(s_fact_line[0], node_as_list) if not kc.is_canonical(node_as_list): continue node_id = facts.get_node_id(node_as_list) assert node_id not in nodeid_to_distance, "node "+str(node_id)+" already in truc, with value "+ nodeid_to_distance[node_id] nodeid_to_distance[node_id]=s_fact_line[1]+"\t"+s_fact_line[2] compacted_fact_int_file.close() return nodeid_to_distance def contains_extreme_variant(fact, has_input_edge, has_output_edge): ''' Returns True if a fact contains at least one extreme variant Else returns false ''' for variant_id in kc.allele_values(fact): if variant_id not in has_input_edge or variant_id not in has_output_edge: return True return False def print_GFA_nodes_as_ids(facts, compacted_fact_int_file_name, has_input_edge, has_output_edge): '''print canonical unitigs ids WARNING: here each fact in facts contains as last value its unique id. ''' nodeid_to_distance = index_nodeid_to_distance(facts, compacted_fact_int_file_name) # compacted_fact_int_file=open(compacted_fact_int_file_name) for fact in facts.traverse(): # fact_int=compacted_fact_int_file.readline().strip() # 49648_0;67994_-20;20000_23; SP:0_166;126_261;178_444; BP:0_83;-20_72;23_61; node_id = kc.get_fact_id(fact) # last value is the node id fact = fact[:-1] # remove the last value that corresponds to the node id if not kc.is_canonical(fact): continue print ("S\t"+str(node_id)+"\t", end="") for unitig_id in fact: print (kc.unitig_id2snp_id(kc.allele_value(unitig_id))+";", end="") # check_fact(fact, fact_int) # assert str(node_id) in nodeid_to_distance, nodeid_to_distance print ("\t"+nodeid_to_distance[str(node_id)], end="") if contains_extreme_variant(fact, has_input_edge, has_output_edge): print("\tEV:1") else: print("\tEV:0") def union(a, b): """ return the union of two lists """ return list(set(a) | set(b)) def check(facts): """ debug purpose """ for fact in facts.traverse(): assert kc.get_reverse_fact_id(fact,facts) != None, fact def main(): ''' Creation of a GFA file from a set of facts For eahc fact: indicates if it contains at least an extreme variant Field EV * EV:1 if it contains at least an extreme variant * EV:0 else ''' # SR=[[1,3,4],[14],[4,6],[-6,-1,-2],[4,6,7,9],[9,10,11,12],[4,6],[-13, -12, -11]] facts=kc.generate_facts(sys.argv[1]) kc.add_reverse_facts(facts) has_input_edge, has_output_edge = kc.detect_input_output_edges(facts) facts.sort() facts.index_nodes() # This adds a final value to each sr, providing its node id. # check(facts) sys.stderr.write("Print GFA Nodes\n") print_GFA_nodes_as_ids(facts, sys.argv[1], has_input_edge, has_output_edge) sys.stderr.write("Print GFA Edges\n") print_GFA_edges(facts) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_node_ids_to_node_sequences.py000077500000000000000000000243431420021152700241670ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a FA file from a compacted fact int file. @author pierre peterlongo pierre.peterlongo@inria.fr ''' import sys import K3000_common as kc def index_sequences_seek(compacted_facts_fa_file_name): ''' Stores for each sequence header its position in the fa file. This is used latter to retrieve the corresponding sequences ''' header_to_file_position = {} compacted_facts_fa_file=open(compacted_facts_fa_file_name) file_size=kc.file_size(compacted_facts_fa_file) step=0 while(True): if step%10000==0: kc.update_progress(compacted_facts_fa_file.tell()/file_size) step+=1 pos=compacted_facts_fa_file.tell() header_fa=compacted_facts_fa_file.readline() if not header_fa: break header_fa=header_fa.strip().split()[0] # remove the starting and ending positions from the headers. TODO use them for provinding the overlap length between nodes. compacted_facts_fa_file.readline().strip() # dont care header_to_file_position[kc.generate_header(header_fa[1:])]=pos # print(header_fa[1:]," pos ",pos) kc.update_progress(1) compacted_facts_fa_file.close() return header_to_file_position def yield_occurring_positions_reverse(k,kmer, seq): for i in range(len(seq)-k,-1,-1): if seq[i:i+k] == kmer: # if kc.hamming_near_perfect(seq[i:i+k],kmer): yield i def overlap_length(seqA, seqB): ''' For two UPPER CASE sequences that overlap at least by at least k characters, return the length of the largest overlap with hamming distance < 5 1/ find on seqB all occurrence positions of the last kmer of seqA 2/ check for each position (from the biggest) that the overlap is perfect 3/ return the length of the biggest overlap. ''' k=13 last_seqA_kmer=seqA[-k:] # print("seqA", seqA) # print("seqB", seqB) # print("last_seqA_kmer", last_seqA_kmer) erro_code=-1 for i in yield_occurring_positions_reverse(k,last_seqA_kmer, seqB): if len(seqA[-i-k:]) != len(seqB[:i+k]): # a sequence is included into another one, we do not print those edges erro_code=-2 if i+k > len(seqA): erro_code=-2 if kc.hamming_near_perfect(seqA[-i-k:], seqB[:i+k]): return len(seqA[-i-k:]) # else: print("what") # TODO: here it may happens that two sequences have bad overlap. This is due to the # fact that their N numbers was different because of read sequencing errors while phasing with kissreads # One may correct the N number of the lowest covered sequence for instance. return erro_code # print(overlap_length("TCAACTACTTATTTGTCGTACAAAACTGTCCCGTACATAGGATGATCTTATTCCCGTACCGGATTTCGTACACAATAACAGGAACAATGTCGATATAAAATTTTCTTCAAATGGCTTCAACCCTTACATTATTATGGCAGACGATGTAAACTCTCTAGTCTTCTCAACTCTATTAATAATACATAGTAGTAGCTATTCAGCCATTTTAAAAACGCAATACAACGTTTGTCCCGTAATATT","CTACTTATTTGTCGTACAAAACTGTCCCGTACATAGGATGATCTTATTCCTGTACCGGATTTCGTACACAATAACAGGAACAATGTCGATATAAAATTTTCTTCAAATGGCTTCAACCCTTACATTATTATGGCAGACGACGTAAACTCTCTAGTCTTCTCAACTCTATTAATAATACATAGTAGTAGCTATTCAGCCATTTTAAAAACGCAATACAACGTTTGTCCCGTAATAT")) def modify_gfa_file(gfa_file_name, compacted_facts_fa_file_name, header_to_file_position): print ("H\t#################") print ("H\t# GFA of variants") print ("H\t#################") print ("H\t# Nodes are (compacted) facts with their read mapping coverage. Eg. \"S 1 gtGCAATAAGAATTGTCTTTCTTATAATAATTGTCCAACTTAGgGTCAATTTCTGTACaaacaaCACCATCCAAt AS:-577h;-977l;1354l; SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; FC:i:52 min:17 max:410 mean:180.0 AC:113;17;410\".") print ("H\t# * field AS stands for \"Allele Set\". It reminds the ids of the variants that compose this fact and that were used for reconstructing the genomic sequence") print ("H\t# * field SP stands for \"Sequence Position\". It indicates for each allele of the fact its starting and ending position in the ACGT sequence") print ("H\t# * field BP stands for \"Bubble Position\". For each allele of the fact it indicates:") print ("H\t# - first: the relative position of first nucleotide of the bubble with respect to the position of the last nucleotide of the bubble of the previous allele. This value is equal to zero for the first allele") print ("H\t# - second: the length of the bubble of the allele") print ("H\t# * field EV strands for \"Extreme Variant\". Facts having at least one variant with no input or no output edge are considered as facts having an extreme variants. Their value is set to EV:1. Else, the value is set to EV:0") print ("H\t# * field FC is the coverage of the fact, as provided by the total number of reads that phased at least two alleles of the fact") print ("H\t# - first: the relative position of first nucleotide of the bubble with respect to the position of the last nucleotide of the bubble of the previous allele. This value is equal to zero for the first allele") print ("H\t# - second: the length of the bubble of the allele") print ("H\t# * fields min, max, and mean stand resp. for the min, max and mean of the read coverage of all alleles") print ("H\t# * field AC stands for \"Allele Coverage\". The number of reads that map each allele is given in the same order as the variant ids (eg. \"17;410;113;\" are respectively, the coverages of variants \"-577h;-977l;1354l\")") print ("H\t# Four types of edges:") print ("H\t# 1. Overlap between facts, Overlap length is >0. Eg, \"L 1 - 29384 + 8M OFL:i:2\"") print ("H\t# \"S 1 ACGGACGGACCGT RC:i:24\", and") print ("H\t# \"S 29384 CGGACCGTACGGACGATCCG; RC:i:43\".") print ("H\t# OLF field reminds the length of the fact overlap length (number of variants overlapping)") print ("H\t# 2. Facts linked by paired end reads. Eg \"L 10735 + 29384 + 0M FC:i:5\".") print ("H\t# The coverage (FC field) indicates the number of pairend read linking the two facts") print ("H\t# These links have a fake overlap of length 0.") print ("H\t# 3. Facts linked by unitigs. The unitig finishing a fact overlaps the unitig starting another fact. Eg \"L 19946 + 11433 + -1M\".") print ("H\t# These links are directed and validate the facts orientation. ") print ("H\t# These links have a fake overlap of length -1.") print ("H\t# 4. Facts sharing at least one SNP identifier.") print ("H\t# These links have an overlap of length -2.") gfa_file=open(gfa_file_name) compacted_facts_fa_file=open(compacted_facts_fa_file_name) node_id_to_sequence={} file_size=kc.file_size(gfa_file) step=0 while(True): if step%10000==0: kc.update_progress(gfa_file.tell()/file_size) step+=1 gfa_line=gfa_file.readline() if not gfa_line: break gfa_line.strip() if gfa_line[0]=='H': continue #Header was changed if gfa_line[0]=='S': #Deal with sequences #FROM: #S 1 -577h;-977l;1354l; SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; EV:0 FC:i:52 min:17 max:410 mean:180.0 AC:410;17;113; #TO #S 1 gtGCAATAAGAATTGTCTTTCTTATAATAATTGTCCAACTTAGgGTCAATTTCTGTACaaacaaCACCATCCAAt SP:0_44;11_64;32_75; BP:0_41;-26_41;-25_41; EV:0 FC:i:52 AS:-577h;-977l;1354l; min:17 max:410 mean:180.0 AC:17;410;113; gfa_line=gfa_line.split() assert gfa_line[2] in header_to_file_position, gfa_line[2]+" is not in header_to_file_position" compacted_facts_fa_file.seek(header_to_file_position[gfa_line[2]]) compacted_facts_fa_file.readline().strip() # dont care sequence_fa=compacted_facts_fa_file.readline().strip() # assert gfa_line[2] == allele_header,gfa_line[2]+" is not "+allele_header+" "+header_fa[1:] node_id_to_sequence[gfa_line[1]]=sequence_fa #TODO: optimize this to avoid memory usage. One may store the position of the node in the file and retreive the sequence latter print(gfa_line[0]+"\t"+gfa_line[1]+"\t"+sequence_fa+"\tAS:"+gfa_line[2]+"\t"+gfa_line[3]+"\t"+gfa_line[4]+"\t"+gfa_line[5]+"\t"+gfa_line[6]+"\t"+gfa_line[7]+"\t"+gfa_line[8]+"\t"+gfa_line[9]+"\t"+gfa_line[10]) continue if gfa_line[0]=='L': split_gfa_line=gfa_line.split() if split_gfa_line[1] == split_gfa_line[3]: #no not print self loops continue # print (split_gfa_line) if split_gfa_line[5]=="0M" or split_gfa_line[5]=="-1M" or split_gfa_line[5]=="-2M": # non overlapping edges, we simply write them print(gfa_line.strip()) continue # if we are here, this is a true overlapping edge: L 3 + 255 - 2M # we need to retreive the sequences of the two nodes # print(split_gfa_line) seqA = node_id_to_sequence[split_gfa_line[1]].upper() seqB = node_id_to_sequence[split_gfa_line[3]].upper() if split_gfa_line[2]=='-': seqA=kc.get_reverse_complement(seqA) if split_gfa_line[4]=='-': seqB=kc.get_reverse_complement(seqB) OL = overlap_length(seqA,seqB) if OL>-1: print (split_gfa_line[0]+"\t"+split_gfa_line[1]+"\t"+split_gfa_line[2]+"\t"+split_gfa_line[3]+"\t"+split_gfa_line[4]+"\t"+str(OL)+"M\tOFL:i:"+split_gfa_line[5][:-1]) continue print(gfa_line.strip()) # shold not happend kc.update_progress(1) gfa_file.close() compacted_facts_fa_file.close() def main(): ''' Produces a gfa file replacing the node content from int ids of alleles to their sequence ''' if len(sys.argv) !=3: sys.stderr.write("Usage: python K3000_node_ids_to_node_sequences.py graph_plus.gfa compacted_facts.fa > graph_final.gfa\n") sys.exit(0) sys.stderr.write("Indexing sequence positions\n") header_to_file_position = index_sequences_seek(sys.argv[2]) sys.stderr.write("Writing the updated gfa file\n") modify_gfa_file(sys.argv[1],sys.argv[2], header_to_file_position) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_paths_to_fa.py000077500000000000000000000063231420021152700211060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a FA file from a compacted fact int file. ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc def generate_sequence_paths(sequences, compacted_fact_file_name, int_facts_format): ''' Given a set of indexed sequences, the k value and some compacted facts, prints the corresponding fasta seequences Enables also to validate the compacted facts. ''' mfile = open(compacted_fact_file_name) nb_non_writen=0 for line in mfile: if line[0] == "#": continue # * int_facts_format: # 38772_0;-21479_1;27388_3;-494_28;-45551_36;-11894_10;-50927_7;-66981_10;29405_22;34837_1;20095_5; # * not int_facts_format: # -1000l_0;-136l_-24;-254h_-18;493l_-16; -577h_0;-977h_-26;1354h_-25; => 1 line = line.split("=")[0].strip() # in case a line contains an abundance, it is indicated by " => 1" # from "-1000l_0;-136l_-24;-254h_-18;493l_-16; -577h_0;-977h_-26;1354h_-25; => 1" # to "-1000l_0;-136l_-24;-254h_-18;493l_-16; -577h_0;-977h_-26;1354h_-25;" # if the input fact contains a space it means that this is a paired fact, each part is treated for fact_as_ids in line.split(): # print(fact_as_ids) toprint, header, bubble_facts_position_start_stops, full_seq = kc.line2seq(fact_as_ids, sequences, int_facts_format, 0) if toprint: print(f">{header}\t{bubble_facts_position_start_stops}\n{full_seq}") else: nb_non_writen+=1 if nb_non_writen>0: sys.stderr.write("Warning, "+str(nb_non_writen)+" facts were removed as their sequence concatenation were not coherent or because they contained non coherent predictions\n") mfile.close() def is_int_fact(file_name): ''' Determines if a given file is under the format 2468_0;-2708_6;1954_-25;1154_-26; (called 'int_facts') or -577h_0;-977h_-26;1354h_-25; => 1 ''' with open(file_name) as my_file: while True: line = my_file.readline() if not line: raise RuntimeError (f'input file {file_name} does not contain correctly formated facts') if line[0] == "#" : continue # comment if ';' not in line: raise RuntimeError (f'input file {file_name} does not contain correctly formated facts. The line {line} should contain at least a \';\'') # here we are check the kind of file: line = line.split()[0] if 'h' in line or 'l' in line: return False return True def main(): ''' Creation of a FA file from a compacted fact int file. ''' sequences=kc.index_sequences(sys.argv[1]) #for each snp id: sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] sequences=kc.index_sequences(sys.argv[2], sequences) #for each snp id: sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] int_facts_format = is_int_fact(sys.argv[3]) generate_sequence_paths(sequences, sys.argv[3], int_facts_format) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_phased_paths_to_fa.py000077500000000000000000000075001420021152700224300ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' Creation of a FA file from set of phased facts, as obtained by the ILP model: #ID #path ("variant id"_"distance between the end of the previous bubble and the start of the current one) #abundance 1 1054l_0;-826l_-26;-914l_-31;-434h_-36;-369h_-15;675h_-5;-543l_-17;-386l_-27;326l_-1;88h_-10;359l_-21;542l_-28;-540h_-36;-153h_-2;382l_-3;1077h_-37;40h_56;413l_-40;-744h_-32;-510h_2;-636l_-22;-1076l_-22;646h_39;897l_-32;968h_-34;1130h_18;578l_-28;812l_-8;-547h_-10;412h_-14;435h_-3;113h_-16;-975l_-35;-807l_8;-1094l_-8;-447h_-40;-802l_-23;-779l_-19;1066h_-25;-429l_11;701h_-35;180l_-30;-563h_6;67h_5;169h_-36;-864l_-21;-219l_-14;282h_5;567h_-31;453l_-24;740l_-35;-255l_-29;723h_-12;1050h_-24;-204h_17;303h_-12;-237l_-34;236h_-30;-408h_-32;-102l_-6;-1128l_-29;-474h_-12;1092h_-14;-491h_-35;889h_-35;45l_-8;1182l_-40;477l_-28;-172l_-13;1060h_-13;221h_-26;157h_-31;1091l_-17;-1021l_-2;846h_-33;1014h_-36;964h_-38; 162 Outputs: >path_ID|abundance|info about starting and ending positions of each allele on the global sequence (SP = Sequence positions), and the Bubble Positions (BP). For each allele in the fact we store the distance between the bubble start (upper case letter and the end of the previous bubble (also upper case letter). We add the length of the bubble (upper case letter). ACGTN* sequence ''' __author__ = "Pierre Peterlongo" __email__ = "pierre.peterlongo@inria.fr" import sys import K3000_common as kc def generate_sequence_paths(sequences, compacted_fact_file_name, hamming_max=1): ''' Given a set of indexed sequences, the k value and some compacted facts, prints the corresponding fasta seequences Enables also to validate the compacted facts. ''' non_writen_list="" mfile = open(compacted_fact_file_name) nb_non_writen=0 for line in mfile: # 1 1054l_0;-826l_-26;-914l_-31;-434h_-36;-369h_-15;675h_-5;-543l_-17;-386l_-27;326l_-1;88h_-10;359l_-21;542l_-28;-540h_-36;-153h_-2;382l_-3;1077h_-37;40h_56;413l_-40;-744h_-32;-510h_2;-636l_-22;-1076l_-22;646h_39;897l_-32;968h_-34;1130h_18;578l_-28;812l_-8;-547h_-10;412h_-14;435h_-3;113h_-16;-975l_-35;-807l_8;-1094l_-8;-447h_-40;-802l_-23;-779l_-19;1066h_-25;-429l_11;701h_-35;180l_-30;-563h_6;67h_5;169h_-36;-864l_-21;-219l_-14;282h_5;567h_-31;453l_-24;740l_-35;-255l_-29;723h_-12;1050h_-24;-204h_17;303h_-12;-237l_-34;236h_-30;-408h_-32;-102l_-6;-1128l_-29;-474h_-12;1092h_-14;-491h_-35;889h_-35;45l_-8;1182l_-40;477l_-28;-172l_-13;1060h_-13;221h_-26;157h_-31;1091l_-17;-1021l_-2;846h_-33;1014h_-36;964h_-38; 162 if line[0] == "#": continue line = line.strip().split() path_id=int(line[0]) abundance=int(line[2]) toprint, _, _, full_seq = kc.line2seq(line[1], sequences, False, hamming_max) if toprint: # print(f">path_{path_id}|{abundance}|{header}|{bubble_facts_position_start_stops}\n{full_seq}")# TMI print(f">path_{path_id}|{abundance}\n{full_seq}") else: nb_non_writen+=1 non_writen_list+=f"path_{path_id}|{abundance}, " if nb_non_writen>0: sys.stderr.write(f"Warning, {nb_non_writen} facts were removed as their sequence concatenation were not coherent or because they contained non coherent predictions\n") sys.stderr.write(f"Removed paths: {non_writen_list[:-2]}\n") mfile.close() def main(): ''' Creation of a FA file from a compacted fact int file. ''' sequences=kc.index_sequences(sys.argv[1]) #for each snp id: sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] sequences=kc.index_sequences(sys.argv[2], sequences) #for each snp id: sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] generate_sequence_paths(sequences, sys.argv[3]) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/k3000/K3000_working_zone.py000066400000000000000000000270711420021152700213320ustar00rootroot00000000000000import sys import K3000_common as kc """ Given an input phased variants, select and output only "working zones" A working zone is defined by 1/ Coverage XXX todo 2/ Topology: conserve only parts defined with X patterns. A node is linked to at most two other nodes. If a node n1 is linked to two nodes n2 and n3, then n2 and n3 have at most two sons, n4 and n5 """ def get_reverse_fact(x): ''' reverse of a fact x. Example x = "4l_0;2h_3;-6h_21", reverse(x) = "6h_0;-2h_21;-4l_3"''' res ="" x=x.strip(";").split(";") for i in range (len(x)): original_id = x[-i-1] if original_id[0]=="-": reversed_id = original_id[1:] else: reversed_id = "-"+original_id if i==0: value=kc.string_allele_value(reversed_id)+"_0" # With i=0, add '_0' to the value else: value=kc.string_allele_value(reversed_id)+"_"+kc.distance_string_value(x[-i]) # With i=1, add '_21' to the value res+=value+";" return res def store_nodes(fact_file_name): """ Store nodes with their min, max and mean coverages """ nodes = {} # key= (int) node id, value variant_id with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue " -1145l_0;4780h_-60;-248h_-63;-7035l_-60;4077l_-59;-6265l_-60;-2978h_-69;4958h_-59;-4221h_-60;-1376l_-60;-4664l_-59;-2207h_-60;-6257l_-60;-5529l_-59;-5106h_-59;1310h_-59;-4514h_-59;3933h_-60;-5727h_-60;2325l_-60;-3976l_-59;-3363h_-60;-716l_-59;-3526h_-51;-5819h_-57;2927l_-59;-6146l_-60;-4374h_-53; => 1" coverage = int(line.split()[-1]) for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 original_fact = line.split()[fact_id] for fact in original_fact, get_reverse_fact(original_fact): # print ("fact", fact) for variant in fact.strip(";").split(";"): # print(variant, fact) signed_variant_id=variant.split("_")[0] if signed_variant_id not in nodes: nodes[signed_variant_id] = 0 assert len(signed_variant_id)>0,line+"\n"+str(line.split()[fact_id]) nodes[signed_variant_id] += coverage return nodes def f(tuple, el): return tuple[0]==el def isin(list, el): for tuple in list: if f(tuple, el): return True return False def exists_edge(edges, rev_edges, node_id_1, node_id_2): for current_edges in edges, rev_edges: if node_id_1 in current_edges: if isin(current_edges[node_id_1], node_id_2): return True if node_id_2 in current_edges: if isin(current_edges[node_id_2], node_id_1): return True return False def store_ordered_edges(fact_file_name): """ Store edges Conserve only the closest edges. In case of equalities of minimal distance edges, conserve the closest ones. """ edges = {} # key = (signed int) node id, value = set of (signed int) target node ids with their distance (signed int). This distance may be negative as it reflects the position of the second variant wrt the end of the bubble sequence of the first. # Hence a key is a couple (signed_int, signed int). rev_edges = {} # key = (signed int) node id, value = set of (signed int) target node ids (idem) with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue # print(line) # print(len(line.split())) for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 original_fact = line.split()[fact_id] for used_fact in original_fact, get_reverse_fact(original_fact): comapped_variants = used_fact.strip(";").split(";") # print(comapped_variants) for i in range(len(comapped_variants)-1): from_node_id = comapped_variants[i].split("_")[0] to_node_id = comapped_variants[i+1].split("_")[0] distance = int(comapped_variants[i+1].split("_")[1]) # add edge: if from_node_id not in edges: edges[from_node_id] = set() edges[from_node_id].add((to_node_id, distance)) if to_node_id not in rev_edges: rev_edges[to_node_id] = set() rev_edges[to_node_id].add((from_node_id, distance)) # print(edges) ## Sort each list wrt distance: for current_edges in edges, rev_edges: for from_variant_id in current_edges: current_edges[from_variant_id] = sorted(current_edges[from_variant_id], key=lambda x : x[1]) sys.stderr.write(f"sorted edges {edges}\n") ## remove transitive edges: nb_removed = 0 nb_total = 0 new_edges = [{},{}] i=-1 for current_edges in edges, rev_edges: i+=1 # new_edges[i] = {} for from_variant_id in current_edges: # if an ordered list contains more than 2 children (A->B and A->C for instance), remove A->C if B->C exists somewhere else updated_list = set() updated_list.add(current_edges[from_variant_id][0]) # the first one stays, whatever. for id_in_current_edges in range(len(current_edges[from_variant_id])-1): nb_total+=1 cur_var = current_edges[from_variant_id][id_in_current_edges] next_var = current_edges[from_variant_id][id_in_current_edges+1] if cur_var[1]==next_var[1]: # same distance to start, we keep it updated_list.add(current_edges[from_variant_id][id_in_current_edges+1]) continue if not exists_edge(edges, rev_edges, cur_var[0], next_var[0]): # this is a not a transitive edge, we keep it updated_list.add(current_edges[from_variant_id][id_in_current_edges+1]) else: sys.stderr.write(f"removed {from_variant_id} -> {current_edges[from_variant_id][id_in_current_edges+1]}\n") nb_removed+=1 updated_list = sorted(updated_list, key=lambda x : x[1]) # sys.stderr.write(f"avant {from_variant_id} -> {current_edges[from_variant_id]}\n") new_edges[i][from_variant_id]=updated_list # sys.stderr.write(f"apres {from_variant_id} -> {new_edges[i][from_variant_id]}\n") sys.stderr.write(f"Removed {nb_removed} among {nb_total}\n") edges = new_edges[0] rev_edges = new_edges[1] ## remove distances: for current_edges in edges, rev_edges: for from_variant_id in current_edges: id_only_list = set() # print("HO avant", current_edges[from_variant_id]) for to_variant_id, distance in current_edges[from_variant_id]: id_only_list.add(to_variant_id) current_edges[from_variant_id] = id_only_list # print("HO apres", current_edges[from_variant_id]) ## filter edges. # for current_edges in edges, rev_edges: # for from_variant_id in current_edges: # # print(from_variant_id, current_edges[from_variant_id]) # ## determine min dist # min_dist= sys.maxsize # for to_variant_id, distance in current_edges[from_variant_id]: # print (from_variant_id, to_variant_id, distance) # if distance < min_dist: min_dist = distance # print() # ## conserve only edges equal to min dist: # to_variants = set() # for to_variant_id, distance in current_edges[from_variant_id]: # if distance == min_dist: # to_variants.add(to_variant_id) # current_edges[from_variant_id] = to_variants # # print(from_variant_id, current_edges[from_variant_id]) return edges,rev_edges def store_edges(fact_file_name): """ Store edges """ edges = {} # key = (signed int) node id, value = set of (signed int) target node ids. rev_edges = {} # key = (signed int) node id, value = set of (signed int) target node ids. with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue # print(line) # print(len(line.split())) for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 comapped_variants = line.split()[fact_id].strip(";").split(";") for i in range(len(comapped_variants)-1): from_node_id = comapped_variants[i].split("_")[0] to_node_id = comapped_variants[i+1].split("_")[0] # add edge: if from_node_id not in edges: edges[from_node_id] = set() edges[from_node_id].add(to_node_id) if to_node_id not in rev_edges: rev_edges[to_node_id] = set() rev_edges[to_node_id].add(from_node_id) return edges,rev_edges def remove_nodes_with_high_io_degree(edges, rev_edges, nodes, max_io=2): """ remove any node that has two or more childre and remove all the corresponding children """ for current_edges in edges, rev_edges: for from_variant_id in current_edges: if len(current_edges[from_variant_id]) > max_io: if from_variant_id in nodes: del nodes[from_variant_id] for to_variant_id in current_edges[from_variant_id]: if to_variant_id in nodes: del nodes[to_variant_id] def print_as_gfa(nodes, edges): # cov_threshold=10 # index nodes: node_id_to_variant_id = {} # key = node_id (1,2, ..., n) value = variant_id (eg. -14h) variant_id_to_node_id = {} # key = variant_id (eg. -14h) value = node_id (eg. 2) node_id=1 for node in nodes: node_id_to_variant_id[node_id] = node variant_id_to_node_id[node] = node_id node_id+=1 for node_id in node_id_to_variant_id: # if nodes[node_id_to_variant_id[node_id]] < cov_threshold: continue print("S\t"+str(node_id)+"\t"+str(node_id_to_variant_id[node_id])+"\tRC:i:"+str(nodes[node_id_to_variant_id[node_id]])) for from_variant_id in edges: if from_variant_id not in nodes: continue # had been removed # if nodes[from_variant_id] < cov_threshold: continue # too low cove for to_variant_id in edges[from_variant_id]: if to_variant_id not in nodes: continue # had been removed # if nodes[to_variant_id] < cov_threshold: continue # too low cove print("L\t"+str(variant_id_to_node_id[from_variant_id])+"\t+\t"+str(variant_id_to_node_id[to_variant_id])+"\t+\t0M") def main(): nodes = store_nodes(sys.argv[1]) # print (nodes) edges,rev_edges = store_ordered_edges(sys.argv[1]) remove_nodes_with_high_io_degree(edges, rev_edges, nodes, 2000) print_as_gfa (nodes, edges) if __name__ == '__main__': main()DiscoSnp-2.6.2/scripts/k3000/K3000_working_zone_no_redundant_edges.py000066400000000000000000000345121420021152700252370ustar00rootroot00000000000000import sys import K3000_common as kc """ Given an input phased variants, select and output only "working zones" A working zone is defined by 1/ Coverage XXX todo 2/ Topology: conserve only parts defined with X patterns. A node is linked to at most two other nodes. If a node n1 is linked to two nodes n2 and n3, then n2 and n3 have at most two sons, n4 and n5 """ def get_reverse_fact(x): ''' reverse of a fact x. Example x = "4l_0;2h_3;-6h_21", reverse(x) = "6h_0;-2h_21;-4l_3"''' res = "" x = x.strip(";").split(";") for i in range(len(x)): original_id = x[-i-1] if original_id[0] == "-": reversed_id = original_id[1:] else: reversed_id = "-"+original_id if i == 0: value=kc.string_allele_value(reversed_id)+"_0" # With i=0, add '_0' to the value else: value=kc.string_allele_value(reversed_id)+"_"+kc.distance_string_value(x[-i]) # With i=1, add '_21' to the value res+=value+";" return res def store_nodes(fact_file_name): """ Store nodes with their min, max and mean coverages """ nodes = {} # key= (int) node id, value variant_id with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue " -1145l_0;4780h_-60;-248h_-63;-7035l_-60;4077l_-59;-6265l_-60;-2978h_-69;4958h_-59;-4221h_-60;-1376l_-60;-4664l_-59;-2207h_-60;-6257l_-60;-5529l_-59;-5106h_-59;1310h_-59;-4514h_-59;3933h_-60;-5727h_-60;2325l_-60;-3976l_-59;-3363h_-60;-716l_-59;-3526h_-51;-5819h_-57;2927l_-59;-6146l_-60;-4374h_-53; => 1" coverage = int(line.split()[-1]) for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 original_fact = line.split()[fact_id] for fact in original_fact, get_reverse_fact(original_fact): # print ("fact", fact) for variant in fact.strip(";").split(";"): # print(variant, fact) signed_variant_id=variant.split("_")[0] if signed_variant_id not in nodes: nodes[signed_variant_id] = 0 assert len(signed_variant_id)>0,line+"\n"+str(line.split()[fact_id]) nodes[signed_variant_id] += coverage return nodes def f(tuple, el): return tuple[0]==el def isin(list, el): for tuple in list: if f(tuple, el): return True return False def exists_edge(edges, node_id_1, node_id_2): if node_id_1 in edges: if isin(edges[node_id_1], node_id_2): return True if node_id_2 in edges: if isin(edges[node_id_2], node_id_1): return True return False def store_ordered_edges(fact_file_name, nodes): """ Store edges """ edges = {} # key = (signed int) node id, value = set of (signed int) target node ids with their distance (signed int). This distance may be negative as it reflects the position of the second variant wrt the end of the bubble sequence of the first. # Hence a key is a couple (signed_int, signed int). # rev_edges = {} # key = (signed int) node id, value = set of (signed int) target node ids (idem) with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue # print(line) # print(len(line.split())) for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 original_fact = line.split()[fact_id] for used_fact in original_fact, get_reverse_fact(original_fact): # sys.stderr.write(f"used fact {used_fact}\n") comapped_variants = used_fact.strip(";").split(";") # print(comapped_variants) for i in range(len(comapped_variants)-1): from_node_id = comapped_variants[i].split("_")[0] to_node_id = comapped_variants[i+1].split("_")[0] distance = int(comapped_variants[i+1].split("_")[1]) # add edge: if from_node_id not in edges: edges[from_node_id] = set() edges[from_node_id].add((to_node_id, distance)) # if to_node_id not in rev_edges: rev_edges[to_node_id] = set() # rev_edges[to_node_id].add((from_node_id, distance)) # sys.stderr.write(f"{edges}\n") ## Sort each list wrt distance: for from_variant_id in edges: edges[from_variant_id] = sorted(edges[from_variant_id], key=lambda x : x[1]) return edges def remove_transitive_redundant(edges): nb_removed = 0 nb_total = 0 nb_removed = 0 nb_total = 0 # new_edges = {} for from_variant_id in edges: # if an ordered list contains more than 2 children (A->B and A->C for instance), remove A->C if B->C exists somewhere else updated_list = set() updated_list.add(edges[from_variant_id][0]) # the first one stays, whatever. for id_in_edges in range(len(edges[from_variant_id])-1): nb_total+=1 cur_var = edges[from_variant_id][id_in_edges] next_var = edges[from_variant_id][id_in_edges+1] if cur_var[1]==next_var[1]: # same distance to start, we keep it updated_list.add(edges[from_variant_id][id_in_edges+1]) continue if not exists_edge(edges, cur_var[0], next_var[0]): # this is a not a transitive edge, we keep it updated_list.add(edges[from_variant_id][id_in_edges+1]) else: # sys.stderr.write(f"removed {from_variant_id} -> {edges[from_variant_id][id_in_edges+1]}\n") nb_removed+=1 updated_list = sorted(updated_list, key=lambda x : x[1]) # sys.stderr.write(f"avant {from_variant_id} -> {edges[from_variant_id]}\n") edges[from_variant_id]=updated_list # sys.stderr.write(f"apres {from_variant_id} -> {new_edges[i][from_variant_id]}\n") sys.stderr.write(f"Removed {nb_removed} transitive redundant edges among {nb_total}\n") return nb_removed # edges = new_edges def keep_only_consecutive_edges(edges): nb_total = 0 nb_removed = 0 for from_variant_id in edges: # if an ordered list contains more than 2 children (A->B and A->C for instance), conserve the closest one updated_list = set() updated_list.add(edges[from_variant_id][0]) # the first one stays, whatever. next_id = 0 while True: # add all soon with the same distance next_id += 1 if next_id == len(edges[from_variant_id]): break if edges[from_variant_id][next_id][1] == edges[from_variant_id][0][1]: updated_list.add(edges[from_variant_id][next_id]) else: break nb_total += len(edges[from_variant_id]) nb_removed += len(edges[from_variant_id])-next_id updated_list = sorted(updated_list, key=lambda x : x[1]) # sys.stderr.write(f"avant {from_variant_id} -> {edges[from_variant_id]}\n") edges[from_variant_id]=updated_list # sys.stderr.write(f"apres {from_variant_id} -> {new_edges[i][from_variant_id]}\n") sys.stderr.write(f"Removed {nb_removed} among {nb_total}\n") def remove_distances(edges): ## remove distances: for from_variant_id in edges: id_only_list = set() for to_variant_id, distance in edges[from_variant_id]: id_only_list.add(to_variant_id) edges[from_variant_id] = id_only_list def remove_tips(edges, nodes): iodegree = {} # key = signed variant id, value = (At least one incoming edge, at least one ougoing edge) ## Stores for all variants, if they have at least one incoming edge and at least one ougoing edge for source_id, target_ids in edges.items(): if source_id not in nodes: continue # were removed if source_id not in iodegree: iodegree[source_id] = [False,True] else: iodegree[source_id][1] = True for target_id in target_ids: if target_id not in nodes: continue # were removed if target_id not in iodegree: iodegree[target_id] = [True,False] else: iodegree[target_id][0] = True nb_tips_removed = 0 to_remove = set() for node in nodes: if node not in iodegree: to_remove.add(node) nb_tips_removed+=1 continue if iodegree[node] != [True, True]: to_remove.add(node) nb_tips_removed+=1 continue for node_to_remove in to_remove: del nodes[node_to_remove] sys.stderr.write(f"Removed {nb_tips_removed} tips\n") return nb_tips_removed # sys.exit() def working_zones(edges, nodes): """ if a node has 3 or more children or 3 or more ancestors, remove all of them """ removed=0 for from_variant_id in edges: if len(edges[from_variant_id]) > 2: for to_variant_id in edges[from_variant_id]: if to_variant_id in nodes: removed+=1 del nodes[to_variant_id] sys.stderr.write(f"Working zones, children removed {removed} non bi-allelic nodes\n") ### ancestors. We first have to store them input_edges = {} # key = son, value = list of ancestors for source_id, target_ids in edges.items(): if source_id not in nodes : continue for target_id in target_ids: if target_id not in nodes: continue if target_id not in input_edges: input_edges[target_id] = set() input_edges[target_id].add(source_id) removed=0 for from_variant_id in input_edges: if len(input_edges[from_variant_id]) > 2: for to_variant_id in input_edges[from_variant_id]: if to_variant_id in nodes: removed+=1 del nodes[to_variant_id] sys.stderr.write(f"Working zones, ancestor removed {removed} non bi-allelic nodes\n") def existing_fact(fact, nodes, edges): """ Given a fact as: -1145l_0;4780h_-60;-248h_-63;-7035l_-60;4077l_-59;-6265l_-60;-2978h_-69;4958h_-59;-4221h_-60;-1376l_-60; returns True if 1/ all nodes exist in the gfa 2/ all edges exist in the gfa else return False """ s_fact = fact.strip(";").split(";") ### Nodes for shift_node in s_fact: if shift_node.split('_')[0] not in nodes: # sys.stderr.write(f"{shift_node.split('_')[0]} not in nodes\n") return False ### Edges for i in range(len(s_fact)-1): source = s_fact[i].split('_')[0] target = s_fact[i+1].split('_')[0] if source in edges and target in edges[source]: continue if target in edges and source in edges[target]: continue return False return True def print_as_facts(nodes, edges, fact_file_name): """ Store nodes with their min, max and mean coverages """ with open(fact_file_name) as fact_file: for line in fact_file.readlines(): if not line: break line=line.strip() if line[0]=="#": continue " -1145l_0;4780h_-60;-248h_-63;-7035l_-60;4077l_-59;-6265l_-60;-2978h_-69;4958h_-59;-4221h_-60;-1376l_-60;-4664l_-59;-2207h_-60;-6257l_-60;-5529l_-59;-5106h_-59;1310h_-59;-4514h_-59;3933h_-60;-5727h_-60;2325l_-60;-3976l_-59;-3363h_-60;-716l_-59;-3526h_-51;-5819h_-57;2927l_-59;-6146l_-60;-4374h_-53; => 1" coverage = int(line.split()[-1]) printed_something = False for fact_id in range(len(line.split())-2): # In case of pairend facts, deal with the two facts (in this case len((line.split()) is 4 original_fact = line.split()[fact_id] if existing_fact(original_fact, nodes, edges): print(original_fact, ' ', end='') printed_something = True if printed_something: print ("=> ", line.split()[-1]) def print_as_gfa(nodes, edges): # cov_threshold=10 # index nodes: node_id_to_variant_id = {} # key = node_id (1,2, ..., n) value = variant_id (eg. -14h) variant_id_to_node_id = {} # key = variant_id (eg. -14h) value = node_id (eg. 2) node_id=1 for node in nodes: node_id_to_variant_id[node_id] = node variant_id_to_node_id[node] = node_id node_id+=1 nb_nodes = 0 for node_id in node_id_to_variant_id: nb_nodes+=1 # if nodes[node_id_to_variant_id[node_id]] < cov_threshold: continue print("S\t"+str(node_id)+"\t"+str(node_id_to_variant_id[node_id])+"\tRC:i:"+str(nodes[node_id_to_variant_id[node_id]])) nb_edges = 0 for from_variant_id in edges: if from_variant_id not in nodes: continue # had been removed # if nodes[from_variant_id] < cov_threshold: continue # too low cove for to_variant_id in edges[from_variant_id]: if to_variant_id not in nodes: continue # had been removed # if nodes[to_variant_id] < cov_threshold: continue # too low cove nb_edges+=1 print("L\t"+str(variant_id_to_node_id[from_variant_id])+"\t+\t"+str(variant_id_to_node_id[to_variant_id])+"\t+\t0M") sys.stderr.write(f"Printed {nb_nodes} nodes and {nb_edges} edges\n") def main(): outgfa = False if len(sys.argv) > 2 and sys.argv[2]=="--gfa": outgfa=True sys.stderr.write(f"Output data as a gfa graph\n") nodes = store_nodes(sys.argv[1]) edges = store_ordered_edges(sys.argv[1], nodes) keep_only_consecutive_edges(edges) remove_distances(edges) # remove_tips(edges, nodes) working_zones(edges, nodes) # remove_tips(edges, nodes) if outgfa: print_as_gfa(nodes, edges) else: print_as_facts(nodes, edges, sys.argv[1]) if __name__ == '__main__': main()DiscoSnp-2.6.2/scripts/k3000/Snakefile000066400000000000000000000020541420021152700173060ustar00rootroot00000000000000rule all: input: "graph_plus.gfa" rule compact_paths: input: "phased_alleles_read_set_id_1.txt" output: temp("compacted_facts_int.txt") shell: "python3 /Users/ppeterlo/projets/phasing_disco/create_graph_fact/k3000/K3000.py {input} > {output}" rule GFA_construction: input: "compacted_facts_int.txt" output: temp("compacted_facts.gfa") shell: "python3 /Users/ppeterlo/projets/phasing_disco/create_graph_fact/k3000/K3000_facts_to_gfa.py {input} > {output}" rule enhance_graph: input: "phased_alleles_read_set_id_1.txt", "compacted_facts.gfa" output: temp("graph.gfa") shell: "python3 /Users/ppeterlo/projets/phasing_disco/create_graph_fact/k3000/enhance_gfa.py compacted_facts.gfa {input} > {output}" rule detect_snp_succesion: input: "graph.gfa", "discoRad_k_31_c_3_D_0_P_5_m_5_coherent_raw.fa" # "discoRes_k_31_c_2_D_0_P_3_b_2_coherent.fa" output: "graph_plus.gfa" shell: "python3 /Users/ppeterlo/projets/phasing_disco/create_graph_fact/k3000/find_unitig_connected_pairs_of_facts.py {input} > {output}"DiscoSnp-2.6.2/scripts/k3000/compute_pi.py000066400000000000000000000031741420021152700202040ustar00rootroot00000000000000import sys """ Given a fasta file containing n sequences having all the same length Returns the pi value https://en.wikipedia.org/wiki/Nucleotide_diversity 1/ stores the n sequences 2/ computes for all i": continue # comment sequences.append(line) if len(sequences) == 0: return None l = len(sequences[0]) for sequence in sequences: if len(sequence) != l: sys.stderr.write(f"File {fasta_file_name} contains sequences of distinct sizes, unable to compute pi\n") sys.exit(1) return sequences def main(): if len(sys.argv) !=2: sys.stderr.write(f"Usage: {sys.argv[0]} fasta_file_name\n") sys.stderr.write("Given a fasta file containing n sequences having all the same length\n") sys.stderr.write("Returns the pi value https://en.wikipedia.org/wiki/Nucleotide_diversity\n") sys.stderr.write(" 1/ stores the n sequences\n") sys.stderr.write(" 2/ computes for all i 0\n") return min=sys.maxsize max=0 sum=0 nb=0 with open(vcf_file_name) as vcf_file: # SNP_higher_path_9 22 9 C G . . Ty=SNP;Rk=0;UL=2;UR=3;CL=.;CR=.;Genome=.;Sd=. GT:DP:PL:AD:HQ 1/1:540:9155,939,294:48,492:50,50 for line in vcf_file: line = line.strip() if line[0] =="#": continue s_line = line.split() field_id = 8+dataset_id try: GT_DP = s_line[field_id] DP = int(GT_DP.split(":")[1]) if DP > max: max=DP if DP < min: min=DP sum+=DP nb+=1 except IndexError: sys.stderr.write("Error: no field nb "+str(dataset_id)+" in file "+vcf_file_name+"\n") return print(f"param DP_avg := {int(sum/float(nb))};") print(f"param DP_max := {max};") print(f"param DP_min := {min};") def main(vcf_file_name, dataset_id): ''' Extraction of DP min, max and average from a VCf file Usage: python ~/workspace/gatb-discosnp/scripts/k3000/extract_DP_from_vcf.py /discoRes_k_31_c_2_D_0_P_3_b_2_coherent.vcf >> graph_5haplotypes_filtered.dat #once graph_5haplotypes_filtered.dat was created using K3000_gfa_to_dat.py ''' extract_DP(vcf_file_name, dataset_id) if __name__ == "__main__": main(sys.argv[1], int(sys.argv[2])) DiscoSnp-2.6.2/scripts/k3000/negative_binomial.py000066400000000000000000000046321420021152700215140ustar00rootroot00000000000000''' This module contains functions necessary to fit a negative binomial using the maximum likelihood estimator and some numerical analysis @author: Peter Xenopoulos @website: http://www.peterxeno.com @downloaded 17 oct 2019 from https://github.com/pnxenopoulos/negative_binomial/blob/master/negative_binomial/core.py ''' import math import numpy as np from scipy.optimize import newton from scipy.special import digamma def r_derv(r_var, vec): ''' Function that represents the derivative of the neg bin likelihood wrt r @param r: The value of r in the derivative of the likelihood wrt r @param vec: The data vector used in the likelihood ''' if not r_var or not vec: raise ValueError("r parameter and data must be specified") if r_var <= 0: raise ValueError("r must be strictly greater than 0") total_sum = 0 obs_mean = np.mean(vec) # Save the mean of the data n_pop = float(len(vec)) # Save the length of the vector, n_pop for obs in vec: total_sum += digamma(obs + r_var) total_sum -= n_pop*digamma(r_var) total_sum += n_pop*math.log(r_var / (r_var + obs_mean)) return total_sum def p_equa(r_var, vec): ''' Function that represents the equation for p in the neg bin likelihood wrt p @param r: The value of r in the derivative of the likelihood wrt p @param vec: Te data vector used in the likelihood ''' if not r_var or not vec: raise ValueError("r parameter and data must be specified") if r_var <= 0: raise ValueError("r must be strictly greater than 0") data_sum = np.sum(vec) n_pop = float(len(vec)) p_var = 1 - (data_sum / (n_pop * r_var + data_sum)) return p_var def neg_bin_fit(vec, init=0.0001): ''' Function to fit negative binomial to data @param vec: The data vector used to fit the negative binomial distribution @param init: Set init to a number close to 0, and you will always converge ''' if not vec: raise ValueError("Data must be specified") est_r = newton(r_derv, init, args=(vec,)) est_p = p_equa(est_r, vec) return est_r, est_p # r = 40 # p = 0.5 # size = 100000 # # import matplotlib.pyplot as plt # random_nb_data = np.random.negative_binomial(r, p, size) # print(random_nb_data) # a=[] # for i in random_nb_data: # a.append(i) # _ = plt.hist(a, bins='auto') # plt.title("Histogram with 'auto' bins") # plt.show() # print(neg_bin_fit(a))DiscoSnp-2.6.2/scripts/k3000/run_K3000.sh000077500000000000000000000177471420021152700174210ustar00rootroot00000000000000red=`tput setaf 1` green=`tput setaf 2` cyan=`tput setaf 6` bold=`tput bold` reset=`tput sgr0` underline=`tput smul` no_underline=`tput rmul` wraith=false #$4 # set to true if you only want to see commands without executing them phased_allele_file=$1 disco_cofa_file=$2 disco_uncofa_file=$3 read_set_id=$4 EDIR=$( python -c "import os.path; print(os.path.dirname(os.path.realpath(\"${BASH_SOURCE[0]}\")))" ) # as suggested by Philippe Bordron if [ -z "$phased_allele_file" ]; then echo "${red} You must provide a phased file name${reset}" echo "${red} Usage: $0 phased_allele_file disco_coherent.fa disco_uncoherent.fa read_set_id${reset}" exit 1 fi if [ -z "$disco_cofa_file" ]; then echo "${red} You must provide a disco (coherent) file (\"...coherent.fa\")${reset}" echo "${red} Usage: $0 phased_allele_file disco_coherent.fa disco_uncoherent.fa read_set_id${reset}" exit 1 fi if [ -z "$disco_uncofa_file" ]; then echo "${red} You must provide a disco (uncoherent) file (\"...uncoherent.fa\")${reset}" echo "${red} Usage: $0 phased_allele_file disco_coherent.fa disco_uncoherent.fa read_set_id${reset}" exit 1 fi if [ -z "$read_set_id" ]; then echo "${red} You must provide a read set id (integer value from 1 to the number of read set used to create file $disco_cofa_file ${reset}" echo "${red} Usage: $0 phased_allele_file disco_coherent.fa disco_uncoherent.fa read_set_id${reset}" exit 1 fi # Creating a file where simple paths are compacted echo "${green}${bold} ### EXPLOITATION OF PHASING INFORMATION OBTAINED FROM DISCOSNP${reset}" echo "${green} ### Input phased_allele_file: `sha1sum ${phased_allele_file}`${reset}" echo "${green} ### Input disco_cofa_file: `sha1sum ${disco_cofa_file}`${reset}" echo "${green} ### Input disco_uncofa_file: `sha1sum ${disco_uncofa_file}`${reset}" echo "${green} ### Input read_set_id: ${read_set_id}${reset}" echo "" # Prefiltering: removing non perfectly overlapping facts echo "${green} ### Removing non perfectly overlapping facts" cmd="python3 ${EDIR}/K3000_filter_badly_overlapping_variants.py ${disco_cofa_file} ${disco_uncofa_file} ${phased_allele_file}" echo " "$cmd "> filtered_${phased_allele_file}${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > filtered_${phased_allele_file} fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi # Determining working zones: echo "${green} ### Determining working zones" cmd="python3 ${EDIR}/K3000_working_zone_no_redundant_edges.py filtered_${phased_allele_file}" echo " "$cmd " > wz_filtered_${phased_allele_file}${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > wz_filtered_${phased_allele_file} fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi # Creating a file where simple paths are compacted echo "${green} ### Creating a file where simple paths are compacted" cmd="python3 ${EDIR}/K3000.py wz_filtered_${phased_allele_file}" echo " "$cmd "> compacted_facts_int_${read_set_id}.txt${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > compacted_facts_int_${read_set_id}.txt fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi # Creating a file with sequences of the compacted paths and removing uncoherent compactions echo "${green} ### Creating a fasta file from compacted facts" cmd="python3 ${EDIR}/K3000_paths_to_fa.py ${disco_cofa_file} ${disco_uncofa_file} compacted_facts_int_${read_set_id}.txt" echo " "$cmd "> compacted_facts_${read_set_id}.fa${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > compacted_facts_${read_set_id}.fa fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi echo "${green} ### Select only valid facts and add their positions" # /usr/bin/grep ">" compacted_facts.fa | cut -d ">" -f 2 | cut -d " " -f 1 > compacted_facts_int.txt cmd="/usr/bin/grep \">\" compacted_facts_${read_set_id}.fa | cut -d \">\" -f 2" echo " "$cmd "> compacted_facts_int_${read_set_id}.txt${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > compacted_facts_int_${read_set_id}.txt fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi ### Creating a GFA graph echo "${green} ### Creating a GFA graph" # python3 ${EDIR}/K3000_facts_to_gfa.py compacted_facts_int.txt > compacted_facts.gfa cmd="python3 ${EDIR}/K3000_facts_to_gfa.py compacted_facts_int_${read_set_id}.txt" echo " "$cmd "> compacted_facts_${read_set_id}.gfa${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > compacted_facts_${read_set_id}.gfa fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi # Adding paired edges and counting of compacted facts echo "${green} ### Adding paired edges and counting of compacted facts" cmd="python3 ${EDIR}/K3000_enhance_gfa.py compacted_facts_${read_set_id}.gfa wz_filtered_${phased_allele_file} ${disco_cofa_file} ${disco_uncofa_file} ${read_set_id}" echo " "$cmd" > graph_${read_set_id}.gfa${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > graph_${read_set_id}.gfa fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi # Detecting snp succesion echo "${green} ### Detecting snp succession" # python3 ${EDIR}/find_unitig_connected_pairs_of_facts.py graph.gfa ${disco_cofa_file} > graph_plus.gfa cmd="python3 ${EDIR}/K3000_find_unitig_connected_pairs_of_facts.py graph_${read_set_id}.gfa ${disco_cofa_file} ${disco_uncofa_file}" echo " "$cmd" > graph_plus_${read_set_id}.gfa${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > graph_plus_${read_set_id}.gfa fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi echo "${green} ### Create final graph with sequence content" # python3 ${EDIR}/K3000_node_ids_to_node_sequences.py graph_plus.gfa compacted_facts.fa > graph_final.gfa cmd="python3 ${EDIR}/K3000_node_ids_to_node_sequences.py graph_plus_${read_set_id}.gfa compacted_facts_${read_set_id}.fa" echo " "$cmd" > graph_final_${read_set_id}.gfa${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd > graph_final_${read_set_id}.gfa fi if [ $? -ne 0 ] then echo "${red} ###Problem detected, check logs.${reset}" exit 1 fi echo "${green} ### Create stats (requires mathplotlib)" cmd="python3 ${EDIR}/stats.py graph_plus_${read_set_id}.gfa graph_final_${read_set_id}.gfa ${read_set_id}" echo " "$cmd"${cyan}" if [[ "$wraith" == "false" ]]; then eval $cmd fi if [ $? -ne 0 ] then echo "${red} ### Non critical problem detected, check logs.${reset}" echo "${green} ### You may remove useless files: rm -f compacted_facts_int_${read_set_id}.txt compacted_facts_${read_set_id}.gfa graph_${read_set_id}.gfa compacted_facts_${read_set_id}.fa " echo "${green}${bold} ### EXPLOITATION OF PHASING INFORMATION OBTAINED FROM DISCOSNP ENDED, the final graph is $(tput blink)${underline}graph_final_${read_set_id}.gfa${no_underline}${reset} " exit 0 fi # cleanup echo echo "${green} ### You may remove useless files: rm -f compacted_facts_int_${read_set_id}.txt compacted_facts_${read_set_id}.gfa graph_${read_set_id}.gfa compacted_facts_${read_set_id}.fa " #rm -f compacted_facts_int.txt compacted_facts.gfa graph.gfa compacted_facts.fa graph_plus.gfa echo "${green}${bold} ### EXPLOITATION OF PHASING INFORMATION OBTAINED FROM DISCOSNP ENDED, the final graph is ${underline}graph_final_${read_set_id}.gfa${no_underline}${green}${reset} ${green}${bold} stats are available in ${underline}distributions_${read_set_id}.png${no_underline}${reset}" DiscoSnp-2.6.2/scripts/k3000/sorted_list.py000066400000000000000000000327061420021152700203760ustar00rootroot00000000000000import sys import K3000_common as kc # allele_value = lambda x: int(x.split('_')[0]) # distance_string_value = lambda x: x.split('_') # def list_of_list_to_allele_only(ll): # res = [] # for list_ in ll: # res.append([allele_value(x) for x in list_]) # return res # # ad=["0_0","1_12","2_13","3_13","4_12","5_123","6_1"] # bd=["0_1","1_12","2_13","3_13","4_12","5_123","6_1"] # # ll=[ad,bd] # # print(d_list_sort(ad, bd)) # # print(ll) # print(list_of_list_to_allele_only(ll)) zero_d_key = lambda x: x.split('_')[0]+'_0' def unique(s): # from http://code.activestate.com/recipes/52560-remove-duplicates-from-a-sequence/ """Return a list of the elements in s, but without duplicates. For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], unique("abcabc") some permutation of ["a", "b", "c"], and unique(([1, 2], [2, 3], [1, 2])) some permutation of [[2, 3], [1, 2]]. For best speed, all sequence elements should be hashable. Then unique() will usually work in linear time. If not possible, the sequence elements should enjoy a total ordering, and if list(s).sort() doesn't raise TypeError it's assumed that they do enjoy a total ordering. Then unique() will usually work in O(N*log2(N)) time. If that's not possible either, the sequence elements must support equality-testing. Then unique() will usually work in quadratic time. """ n = len(s) if n == 0: return [] # Try using a dict first, as that's the fastest and will usually # work. If it doesn't work, it will usually fail quickly, so it # usually doesn't cost much to *try* it. It requires that all the # sequence elements be hashable, and support equality comparison. # u = {} # try: # for x in s: # u[x] = 1 # except TypeError: # del u # move on to the next method # else: # return u.keys() # We can't hash all the elements. Second fastest is to sort, # which brings the equal elements together; then duplicates are # easy to weed out in a single pass. # NOTE: Python's list.sort() was designed to be efficient in the # presence of many duplicate elements. This isn't true of all # sort functions in all languages or libraries, so this approach # is more effective in Python than it may be elsewhere. try: t = list(s) # print() # print(t) t.sort(key=kc.allele_values) # sort only on the allele ids not on their distance # print(t) # sys.exit(0) except TypeError: del t # move on to the next method else: # assert n > 0 last = t[0] lasti = i = 1 while i < n: if not kc.d_list_equal(t[i],last): # compare only on allele ids not on their distance # if t[i] != last: t[lasti] = last = t[i] lasti += 1 i += 1 # print(t[:lasti]) return t[:lasti] assert(0==1) # check that we do not pass here. # print("Bla") # sys.exit(0) # Brute force is all that's left. # u = [] # for x in s: # if x not in u: # u.append(x) return u #ll= [['-30493_13', '-51619_15', '2593_28', '-31345_10'], ['-30493_13', '-51619_15', '2593_28', '-31345_10', '-1959_80'], ['-30493_13', '-51619_15', '2593_28', '-31345_7'], ['-51618_28', '2593_28', '-31345_10'], ['-51619_28', '2593_28', '-31345_10']] # ll= [['-30493_13', '-51619_15', '2593_28', '-31345_10'], ['-30493_13', '-51619_15', '2593_28', '-31345_7'], ['-30493_13', '-51619_15', '2593_28', '-31345_10', '-1959_80'], ['-30493_13', '-51619_15', '2593_28', '-31345_7'], ['-51618_28', '2593_28', '-31345_10'], ['-51619_28', '2593_28', '-31345_10']] # print(ll) # print (unique(ll)) def compare (tuple1,tuple2): # TOCHECK ''' if tuple1 starts with tuple2: return 0 if tuple1tuple2: return 1 ''' # remove path id ("i_indexid") if len(tuple1) > 0 and tuple1[-1][0] == 'i' : tuple1=tuple1[:-1] # TODO: optimization feasible in calling functions for avoiding those systematic tests if len(tuple2) > 0 and tuple2[-1][0] == 'i' : tuple2=tuple2[:-1] # TODO: optimization feasible in calling functions for avoiding those systematic tests tmp_tuple1=tuple1[0:len(tuple2)] return kc.d_list_order(tmp_tuple1,tuple2) # # if tmp_tuple1 < tuple2: return -1 # if tmp_tuple1 > tuple2: return 1 # return 0 class sorted_list(object): """Class sorted list Contains a sorted set of list of allele+distance "a_b" (a is positive or negative, not equal to 0), b is an integer >= 0 Divided into buckets. Each first value is a bucket. """ def __init__(self): self.main_dict={} self.size=0 def add(self, mylist): """add a new list""" self.size+=1 zdk = zero_d_key(mylist[0]) if zdk not in self.main_dict: # key is always a_0 self.main_dict[zdk]=[] self.main_dict[zdk]+=[mylist[1:]] def sorted_add(self,mylist): """add a new list""" self.add(mylist) # we added the element at the last position of the list. We will bring it back to the good position: # example the list is: 4,N,7,13,N,N,5 (we have to put back 5 in its good location). Note that in practice we # pos_current = 6, previous = 5, 4, 3. current_list[3]=0: previous-=1 if previous==-1: break # end of the list, nothing to do. if kc.d_list_order(current_list[previous],current_list[pos_current]) <=0: break# bubble sort of the last element finished. Note that the "equal case" should not happen in our situation. # current_list[previous] <= current_list[pos_current] : break # bubble sort of the last element finished. Note that the "equal case" should not happen in our situation. else : # we swap the two values current_list[previous], current_list[pos_current] = current_list[pos_current], current_list[previous] pos_current = previous; def sort(self): """sort the whole structure - feasible only before removing elements""" for key, value in self.main_dict.items(): value.sort(key=kc.allele_values) def traverse(self): for key, value in self.main_dict.items(): # mylists = value for mylist in value: if mylist != None: yield [key]+mylist def index_nodes(self): ''' For each element in the structure, we add its id as a last value, stored as i_14, for instance for node 14.''' index_id=1 for key, value in self.main_dict.items(): for mylist in value: if mylist != None: mylist+=['i_'+str(index_id)] index_id+=1 def remove(self,mylist): '''remove an element from the structure''' ''' if the element is not in a structure a warning is raised''' zero_d_key = mylist[0].split('_')[0]+'_0' try: tormindex=self.main_dict[zero_d_key].index(mylist[1:]) del self.main_dict[zero_d_key][tormindex] except : # sys.stderr.write("\n WARNING: "+str(mylist)+"\n") # sys.stderr.write("\n WARNING: Tried to remove "+str(mylist)+" absent from the list "+str(self.main_dict[mylist[0]])+".\n") return 0 self.size-=1 return 1 def get_node_id(self, search_sr): list_nodes = self.get_lists_starting_with_given_prefix(search_sr) # print ("search_sr", search_sr,"list_nodes",list_nodes) for node in list_nodes: if node[:-1]==search_sr: return node[-1].split("_")[-1] return None def get_lists_starting_with_given_prefix(self, prefix): ''' given a prefix of a list, return all lists in the set starting with this prefix Dichotomy. log(|self|/size(alphabet)) comparisons O(|prefix|*log(|self|/size(alphabet))) ''' #TODO: optimizable if len(prefix==1): return the self.main_dict[prefix[0]] adding prefix[0] to each value. # assert prefix[0].split('_')[-1] == "0", prefix zkd = zero_d_key(prefix[0]) if zkd not in self.main_dict: return [] #OPTIMIZATION IF len(prefix==1): return the self.main_dict[prefix[0]] adding prefix[0] to each value. if len(prefix)==1: res = [] for l in self.main_dict[zkd]: res.append([prefix[0]]+l) # print() # print(prefix) # print(res) return res first=prefix[0] current_list = self.main_dict[zkd] # print(prefix) prefix = prefix[1:] start=0 n=len(current_list)-1 stop=n # print ("search", prefix, "in ",current_list) while start <=stop: # print (start,stop) middle = start+int((stop-start)/2) if middle>n: break ## Search for a non empty middle value while middle<=stop: tuple1 = current_list[middle] if tuple1 == None: middle+=1 # Empty value else: break # Found a non empty value if middle == stop+1: # for instance looking for [1] in [1, None, None] we didn't find any middle with a avlue, thus we come back middle = start+int((stop-start)/2)-1 while middle>=start: tuple1 = current_list[middle] if tuple1 == None: middle-=1 # Empty value else: break # Found a non empty value if middle == start-1: return [] # nothing found (empty sub-list) ## a non empty middle value was found cmp_val = compare(tuple1,prefix) if cmp_val == -1: # prefix may start in the remaining part of the current_list array start = middle+1 continue if cmp_val == 1: # prefix may start in the starting part of the current_list array stop = middle-1 continue # if cmp_val == 0: # we found a tuple starting with the prefix. We need to check other tuples starting with prefix before and after in the array. res=[[first]+tuple1] # print ("res before all = ",res) i=middle-1 while i>-1: if current_list[i]!=None: if compare(current_list[i],prefix)==0: res.append([first]+current_list[i]) else: break i-=1 i=middle+1 while i<=n: if current_list[i]!=None: if compare(current_list[i],prefix)==0: res.append([first]+current_list[i]) else: break i+=1 # print ("res after all = ",res) return res # print ("return rien") return [] def contains (self,mylist): ''' if sr is in SR: return True, else return False. faster (O(log(|SR|)) that the 'in' function from non ordered array (O(|SR|)) ''' X=self.get_lists_starting_with_given_prefix(mylist) if X==mylist: return True # if X is composed of a unique list if mylist in X: return True # O(|X|) which can be considered as constant return False def __len__(self): return self.size def contains(self,query): """only for debug purpose, no need to be optimized""" for key, value in self.main_dict.items(): if key==query: print("key", key, "query",query) return True for followup in value: for unitig_id in followup: if unitig_id==query: return True return False def unique(self): for key, value in self.main_dict.items(): size_before=len(value) value=unique(value) size_after=len(value) self.main_dict[key]=value self.size-=(size_before-size_after) def __str__(self): str_SR="" for key, value in self.main_dict.items(): for followup in value: str_SR+=str(key) for unitig_id in followup: str_SR+=","+str(unitig_id) str_SR+="\n" return str_SR # SR = sorted_list() # SR.add([1,2,3]) # SR.add([1,2,3]) # SR.remove([1,2]) # # SR.remove([1]) # # SR.remove([1,2,4,5]) # SR.add([1,2,3,5]) # # SR.add([5]) # # SR.add([5,6]) # print(SR) # SR.unique() # print(SR)DiscoSnp-2.6.2/scripts/k3000/stats.py000066400000000000000000000027411420021152700171750ustar00rootroot00000000000000import matplotlib.pyplot as plt import sys def get_nb_allele_distribution(gfa_file_name): gfa_file=open(gfa_file_name) sizes = [] for line in gfa_file: if line[0]=='S':#S 2 34156l;-11363l;13698l;-26143h;10014l; RC:i:144 l=len(line.split()[2].split(';')[:-1]) sizes.append(l) gfa_file.close() return sizes def get_sequence_size_distribution(gfa_file_name): gfa_file=open(gfa_file_name) sizes = [] for line in gfa_file: if line[0]=='S':#S 0 actgcaACAGCTGTTGAAAAGCCGGAATGTACTCTTCATTGCAAACATTTCAGGGATGAAGTGAAGAtgaattgCGACGTAGTATCCACACCAAGCCGGCGTTATCCGGTGAGGCGCAATGTTGCGGGGGCttt RC:i:11 sizes.append(len(line.split()[2])) gfa_file.close() return sizes def plot_violin(sequence_sizes, nb_alleles, read_set_id): fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) axes[0].violinplot(sequence_sizes) axes[0].set_title('Sequence size distribution') axes[1].violinplot(nb_alleles) axes[1].set_title('Nb alleles per sequence') plt.savefig('distributions_'+read_set_id+'.png') def main(): ''' Stats from a gfa file ''' sequence_sizes=get_sequence_size_distribution(sys.argv[2]) #for each snp id: sequences[snp_id]=[left_unitig_len, right_unitig_len, upperseq, lowerseq] nb_alleles=get_nb_allele_distribution(sys.argv[1]) plot_violin(sequence_sizes, nb_alleles, sys.argv[3]) if __name__ == "__main__": main() DiscoSnp-2.6.2/scripts/keep_extensions_disco_file.py000077500000000000000000000037251420021152700226730ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- ################################### # change extensions in uppercase and replace relative positions of SNPs in the header # usage : keep_extensions_disco_file.py .fa import sys def contigOrUnitig(fa_file): #return "unitig" or "contig" mode = "unitig" for line in fa_file: headerComp = line.split("\n")[0].split("|") for elt in headerComp: if elt.startswith("left_contig"): mode = "contig" break #back to the first line fa_file.seek(0, 0) return mode def findShift(line, mode): headerComp = line.split("\n")[0].split("|") left_shift = 0 prefix = 'left_'+mode for elt in headerComp: if not elt.startswith(prefix): continue left_shift = int(elt.split("_")[-1]) break return left_shift def replacePos(position, left_shift): # SNP: P_1:30_C/T # INDEL: P_1:30_2_11 new_pos = int(position.split(":")[1].split("_")[0]) + left_shift res = position.split(":")[0] + ":" + str(new_pos) for i in range (1,len(position.split(":")[1].split("_"))): res += "_" + position.split(":")[1].split("_")[i] return res def replaceHeader(elt, left_shift): if elt.startswith("P_"): elt = ",".join([replacePos(position, left_shift) for position in elt.split(",")]) return elt fa_file_name = sys.argv[1] output_file_name = sys.argv[2] fa_file = open(fa_file_name,"r") fa_file_output = open(output_file_name, "w") left_shift = 0 mode = contigOrUnitig(fa_file) for line in fa_file: if not line.startswith(">"): fa_file_output.write(line.upper()) continue left_shift = findShift(line, mode) if left_shift == 0: fa_file_output.write(line) continue new_header = "|".join([replaceHeader(elt, left_shift) for elt in line.split("|")]) fa_file_output.write(new_header) fa_file.close() fa_file_output.close() DiscoSnp-2.6.2/scripts/phasing/000077500000000000000000000000001420021152700163555ustar00rootroot00000000000000DiscoSnp-2.6.2/scripts/phasing/phased_variants_to_graph_deprecated.py000066400000000000000000000063351420021152700261540ustar00rootroot00000000000000# cf https://www.evernote.com/l/ARWYfQTvvoVFL4sOHvjcJ-AUksvCNp1zz-8 import sys def printid(anid): if anid[0]=='-': print(anid[1:],end='') else: print(anid,end='') def formatid(anid): return anid if anid[0]=='-': return anid[1:] else: return anid node2nodes={} node2paired_nodes={} nodes={} def id1id2 (id1,id2,coverage,pairend): if pairend: struct=node2paired_nodes else: struct=node2nodes # if id2 2 if line[0]=='#': continue line=line.replace(" ", " ") # in pairend files, it happens that a line contains only left or right nodes. In this case, a double space occurs before the '=>' symbol or at the begining of the line. In the first case this is problematic (else it creates empty nodes), thus we consider such lines as non pairend. line=line.strip().lstrip().rstrip().split(' ') pairend=False if len(line)==3: coverage=int(line[2]) else: coverage=int(line[3]) pairend=True if coverage < 1: continue ids=line[0].split(';')[:-1] for i in range(len(ids)-1): id1=formatid(ids[i]) id2=formatid(ids[i+1]) id1id2 (id1,id2,coverage,False) if pairend: id1=line[0].split(';')[-2] id2=line[1].split(';')[0] id1id2 (id1,id2,coverage,True) ids=line[1].split(';')[:-1] for i in range(len(ids)-1): id1=formatid(ids[i]) id2=formatid(ids[i+1]) id1id2 (id1,id2,coverage,False) def print_phasing_edges(): for id1 in node2nodes: for id2 in node2nodes[id1]: print(str(id1)+"\t"+str(id2)+"\t"+str(node2nodes[id1][id2])+"\th") def print_pairing_edges(): for id1 in node2paired_nodes: for id2 in node2paired_nodes[id1]: print(str(id1)+"\t"+str(id2)+"\t"+str(node2paired_nodes[id1][id2])+"\tp") def print_allele_edges(): for id1 in nodes: if id1[-1]=='l': continue int_id=id1[:-1] id2=int_id+'l' if id2 in nodes: print(id1+"\t"+id2+"\t0\ta") if len(sys.argv)>1: file = open(sys.argv[1]) else: file=sys.stdin get_phasing_edges(file) print("source\ttarget\tcoverage\ttype") print_phasing_edges() print_pairing_edges() print_allele_edges() # # # Print phasing edges # for line in file: #-1064h;-917l;1880l; => 2 # if line[0]=='#': # continue # line=line.strip().rstrip().split(' ') # ids=line[0].split(';')[:-1] # coverage=line[2] # for i in range(len(ids)-1): # printid(ids[i]) # print("\t",end='') # printid(ids[i+1]) # print("\t",coverage, "\t p") # DiscoSnp-2.6.2/scripts/redundancy_removal_discosnp.py000077500000000000000000000070701420021152700230700ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- ################################### # from kissnp output: # check pair of variants that start with the same kmer and keep only one bubble # check pair of variants that end with the same kmer and keep only one bubble import sys def get_first_kmer(seq,k): for i in range (len(seq)): if seq[i]>='a' and seq[i]<='z': continue return seq[i:i+k] def get_last_kmer(seq,k): variant_seen=False for i in range (len(seq)): if seq[i]>='a' and seq[i]<='z': if not variant_seen: continue # nothin to do, continue else: # first position after upper case variant: return seq[i-k:i] else: variant_seen=True return seq[i-k+1:] def add_id(kmer_to_var_id,kmer,var_id): if kmer not in kmer_to_var_id: kmer_to_var_id[kmer]=[] kmer_to_var_id[kmer].append(var_id) def non_empty_intersection(a,b): sa = set(a) sb = set(b) if len(sa.intersection(sb)) >0: return True return False def parse(fafile,k,faout): start_kmer_to_var_id={} stop_kmer_to_var_id ={} i=1 printed=0 while (True): if i%100==0 : sys.stdout.write ("\r"+str(i)+ " bubbles treated, "+str(printed)+" bubbles non redundant") sys.stdout.flush() i+=1 com1=fafile.readline() if not com1: break com1=com1.rstrip() #>SNP_higher_path_1|P_1:30_T/G|high|nb_pol_1|left_unitig_length_22|right_unitig_length_0 seq1=fafile.readline().rstrip() com2=fafile.readline().rstrip() seq2=fafile.readline().rstrip() # get variant_id: var_id=com1.split("|")[0].split("_")[-1] # deal with starting kmer kmer_start1=get_first_kmer(seq1,k) kmer_start2=get_first_kmer(seq2,k) if kmer_start1 in start_kmer_to_var_id and kmer_start2 in start_kmer_to_var_id: list_var_id_kmer_start1 = start_kmer_to_var_id[kmer_start1] list_var_id_kmer_start2 = start_kmer_to_var_id[kmer_start2] if non_empty_intersection(list_var_id_kmer_start1,list_var_id_kmer_start2): continue # this variant has already been seen with another context # deal with ending kmer kmer_stop1=get_last_kmer(seq1,k) kmer_stop2=get_last_kmer(seq2,k) # print (kmer_stop1,kmer_stop2) if kmer_stop1 in stop_kmer_to_var_id and kmer_stop2 in stop_kmer_to_var_id: list_var_id_kmer_stop1 = stop_kmer_to_var_id[kmer_stop1] list_var_id_kmer_stop2 = stop_kmer_to_var_id[kmer_stop2] if non_empty_intersection(list_var_id_kmer_stop1,list_var_id_kmer_stop2): continue # this variant has already been seen with another context add_id(start_kmer_to_var_id,kmer_start1,var_id) add_id(start_kmer_to_var_id,kmer_start2,var_id) add_id(stop_kmer_to_var_id, kmer_stop1, var_id) add_id(stop_kmer_to_var_id, kmer_stop2, var_id) faout.write(com1+"\n") faout.write(seq1+"\n") faout.write(com2+"\n") faout.write(seq2+"\n") printed+=1 sys.stdout.write ("\r"+str(i)+ " bubbles treated, "+str(printed)+" bubbles non redundant\n") if len(sys.argv) !=4: print ("Script "+ sys.argv[0].split("/")[-1]) print (" From a discoSnp .fa output: from all variants that start or stop with the same kmer, keep only one of their occurrences") print (" usage: "+ sys.argv[0].split("/")[-1]+ " input.fa k_value output.fa") exit(1) fafile=open(sys.argv[1],"r") k=int(sys.argv[2]) faout=open(sys.argv[3],"w") parse(fafile,k,faout) DiscoSnp-2.6.2/scripts/remove_extensions_disco_file.py000066400000000000000000000012101420021152700232240ustar00rootroot00000000000000#!/bin/python # -*- coding: utf-8 -*- ################################### #Removes extensions in lowercase : # usage : remove_extensions_disco_file.py .fa import os import sys import getopt import time fichier=sys.argv[1] output=sys.argv[2] nomFichier=(str(fichier).split('.')) ##Delete extension (lowercase) from disco file snpfile=open(fichier,"r") snpDiscobis=open(output, "w") for line in snpfile: if ">"==line[0]: snpDiscobis.write(line) else: line=str(line) line=line.replace('a','') line=line.replace('g','') line=line.replace('t','') line=line.replace('c','') snpDiscobis.write(line) snpDiscobis.close() DiscoSnp-2.6.2/scripts/remove_non_biallelic.py000066400000000000000000000021731420021152700214500ustar00rootroot00000000000000import sys import gzip if len(sys.argv)<2: print ("This tool removes from discoSnp sorted VCF the locus which are tri-allelic or more") print ("python remove_non_diploids.py \".vcf from discoSnp\" ") sys.exit() if "gz" in sys.argv[1]: coherent_file=gzip.open(sys.argv[1],"r") else: coherent_file=open(sys.argv[1],"r") previous_line="" previous_chr="" previous_pos="" previous_triploid=False while True: line = coherent_file.readline().rstrip() if not line: break if line[0]=='#': print (line) continue # SNP_higher_path_3 196 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=166;CR=761;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:124:10,378,2484:124,0:0,0 1/1:134:2684,408,10:0,134:0,0 splitted_line = line.split() chr=splitted_line[0] pos=splitted_line[1] if chr==previous_chr and pos==previous_pos: previous_triploid=True continue else: if not previous_triploid and len(previous_line)>0: print (previous_line) previous_chr=chr previous_pos=pos previous_triploid=False previous_line=line DiscoSnp-2.6.2/scripts/remove_non_covered_genotypes.py000066400000000000000000000024341420021152700232540ustar00rootroot00000000000000import sys import gzip if len(sys.argv)<3: print ("This tool replaces discoSnp VCF genotypes with DP lower or equal to a threshold to \"./.\"") print ("python remove_non_covered_genotypes.py \".vcf from discoSnp\" \"DP threshold\"") sys.exit() if "gz" in sys.argv[1]: coherent_file=gzip.open(sys.argv[1],"r") else: coherent_file=open(sys.argv[1],"r") dp_threshold = float(sys.argv[2]) while True: line = coherent_file.readline().rstrip() if not line: break if line[0]=='#': print (line) continue # SNP_higher_path_3 196 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=166;CR=761;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:124:10,378,2484:124,0:0,0 1/1:134:2684,408,10:0,134:0,0 splitted_line = line.split() toprint="" for i in range(9): toprint+=splitted_line[i]+'\t' for i in range(9,len(splitted_line)): splitted_geno = splitted_line[i].split(':') if int(splitted_geno[1])<=dp_threshold: toprint+= "./.:" else: toprint+= splitted_geno[0]+":" for j in range(1,len(splitted_geno)): toprint+= splitted_geno[j] if j. #***************************************************************************** # First check that python3 is installed and has version 3 or more: if ! hash python3; then echo "python3 is not installed" exit 1 fi ver=$(python3 -V 2>&1 | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/') if [ "$ver" -lt "30" ]; then echo "This script requires python3 3.0 or greater" exit 1 fi # Get the local directory path DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) # Option initialisations and defaults remove=0 PATH_VCF_creator="" samfile="" vcffile="" genome="" PATH_BWA="" discoSNPs="" bwa_threads="" k=19 n="" s=0 igv=0 map_with_extensions=0 function help { echo " ##############################" echo " Run VCF_creator pipeline " echo " ##############################" echo "Usage : ./run_VCF_creator.sh OPT" echo -e "##MODE 1: WITHOUT REFERENCE GENOME. Create a vcf file without alignment:" echo -e "\t\t./run_VCF_creator.sh -p -o [-w]" echo -e "##MODE 2: ALIGNING AGAINST A REFERENCE GENOME:" echo -e "\t\t./run_VCF_creator.sh -G -p -o [-B ] [-w] [-e]" echo -e "##MODE 3: USING A HOME MADE ALIGNMENT. Samfile from bwa already exists: " echo -e "\t\t./run_VCF_creator.sh -f -o [-w]" echo echo -e "\t-h: print this message" echo -e "\t-p: discosnp++ output file (foo_coherent.fa)" echo -e "\t\t Mandatory unless MODE 3" echo -e "\t-o: output (VCF format)" echo -e "\t\t Mandatory" #echo -e "\t-c : path where VCF_creator is" echo -e "\t-G: reference genome (Fasta format)" echo -e "\t\t Optional unless MODE 2: you want the mapping positions of the predicted variants in the VCF file and you do not provide a third-party sam file. E.G.: -B and -G options must be used together" echo -e "\t-B: bwa path. i.e. /home/me/my_programs/bwa-0.7.12/ (note that bwa must be pre-compiled)" echo -e "\t\t Optional unless MODE 2 if bwa is not in the binary path. E.G.: -B and -G options must be used together" echo -e "\t-I : Creation of output specific to IGV (Integrative Genomics Viewer)" echo -e "\t\t Optional" echo -e "\t-f: .sam: skip the alignment phases to create the vcf file" echo -e "\t\t Optional unless MODE 3: you want the mapping positions of the predicted variants in the VCF file without remapping on a reference genome. -f option must be used together with -n" echo -e "\t-k: bwa option: seed size" #echo -e "\t\t Optional, default 0" #echo -e "\t-l: bwa option: length of the seed for alignment" #echo -e "\t\t Optional, default 10" #echo -e "\t-n: bwa option: maximal bwa mapping distance" echo -e "\t\t Optional in MODE 1 AND 2, default 3 - warning, bwa mapping running time highly depends on this parameter." echo -e "\t\t Mandatory in MODE 3. " echo -e "\t-t: bwa option: Number of threads (default=unlimited) " echo -e "\t-w: remove index files ( <.amb>, <.ann>, <.bwt>, <.pac>, <.sa> )" echo -e "\t\t Optional" echo -e "\t-e: Map SNP predictions with their extensions on reference genome" } #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- while getopts "hB:c:G:p:wk:Ief:o:t:" opt; do case $opt in t) bwa_threads="-t $OPTARG" ;; w) remove=1 ;; h) help exit 1 ;; B) echo -e "\t##BWA directory: $OPTARG" >&2 PATH_BWA=$OPTARG ;; # c) # echo -e "\t##VCF_creator directory: $OPTARG" >&2 # PATH_VCF_creator=$OPTARG # ;; G) echo -e "\t##use genome : $OPTARG" >&2 genome=$OPTARG ;; p) echo -e "\t##use disco SNPS : $OPTARG" >&2 discoSNPs=$OPTARG ;; # s) # echo -e "\t##use distance with the seed : $OPTARG" >&2 # s=$OPTARG # ;; # n) # echo -e "\t##use number of mismatches : $OPTARG" >&2 # n=$OPTARG # ;; k) echo -e "\t##use bwa seed length : $OPTARG" >&2 k=$OPTARG ;; f) echo -e "\t##use directly samfile : $OPTARG" >&2 samfile=$OPTARG ;; I) echo -e "\t##Will create a vcf file for IGV : Sorting VCF by mapping positions and removing unmapped variants" igv=1 ;; e) echo -e "\t##Predictions will be mapped with their extensions on reference genome" map_with_extensions=1 ;; o) echo -e "\t##output : $OPTARG" >&2 vcffile=$OPTARG ;; \?) echo -e "##Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "##Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- ###Tests if [ -z "$vcffile" ];then if [ ! -z "$samfile" ];then echo -e "..To skip the alignment phase ..." echo -e "\t./run_VCF_creator.sh -f -n -o [-k ] [-s ] [-w]" exit 1 else help exit 1 fi fi # if [ -z "$PATH_VCF_creator" ];then # PATH_VCF_creator=$DIR"" # fi PATH_VCF_creator=$DIR if [ ! -e $PATH_VCF_creator/VCF_creator.py ]; then echo "...Unable to find VCF_creator..." exit 1 fi #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- ####Use the pipeline of aligement if [ -z "$samfile" ];then if [ ! -z "$vcffile" ] && [ -z "$genome" ] && [ -z "$discoSNPs" ]; then help exit 1 fi #Ghost mode if [ -z "$genome" ]; then # if [[ "$discoSNPs" =~ sam ]]; then # echo "$discoSNPs" # echo "!!! Disco file can't be a sam file !!!" # exit 1 # fi echo -e "...Ghost mode..." echo -e "...Creation of a vcf without alignment..." if [ -z "$discoSNPs" ] && [ -z "$vcffile" ];then echo -e "...To create a vcf without alignment ..." echo -e "...You must provide an output .vcf : option -o..." echo -e "...And the file disco : option -p..." exit 1 else echo -e " run python3 $PATH_VCF_creator/VCF_creator.py -s $discoSNPs -o $vcffile" python3 $PATH_VCF_creator/VCF_creator.py -s $discoSNPs -o $vcffile #-n $n if [ $? -ne 0 ] then echo "there was a problem with the VCF creation (command was \"python3 $PATH_VCF_creator/VCF_creator.py -s $discoSNPs -o $vcffile\"" exit 1 fi echo -e "... Creation of the vcf file : done ...==> $vcffile" echo -e " Transforming the created zero-based vcf onto a one-based vcf file" cmd="python3 $PATH_VCF_creator/zero2one.py -i $vcffile" echo $cmd $cmd exit fi fi if [ -z "$PATH_BWA" ] ;then IS_BWA=$(command -v bwa) if [ -z "$IS_BWA" ];then echo -e "... BWA not found... add bwa to \$PATH or give directly the path (-B)" exit 1 else PATH_BWA=$(dirname $IS_BWA) fi fi if [ -z "$vcffile" ] ; then echo -e "...You must provide an output : option -o (for help -h)..." help exit 1 fi if [ -z "$genome" ]; then echo -e "...You must provide a genome of reference : option -G (for help -h)..." help exit 1 fi if [ -z "$discoSNPs" ];then echo "... Error : file disco is missing : option -p (for help -h)..." help exit 1 else if [ ! -e $PATH_VCF_creator/remove_extensions_disco_file.py ];then echo "...Unable to find remove_extensions_disco_file.py..." exit 1 else discoSNPsbis=$(basename $discoSNPs .fa)"bis.fasta" if [ $map_with_extensions -eq 1 ];then python3 $PATH_VCF_creator/keep_extensions_disco_file.py $discoSNPs $discoSNPsbis else python3 $PATH_VCF_creator/remove_extensions_disco_file.py $discoSNPs $discoSNPsbis fi if [ -z "$discoSNPsbis" ];then echo "...Error with the script remove_extensions_disco_file.py..." exit 1 fi fi fi #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- #BWA files #Pierre: user gave a file name we must respect its choice. # vcf=$(basename $vcffile .vcf)"_"$(basename $discoSNPs .fa)"_n"$n"_l"$l"_s"$s".vcf" samfile=$(basename $discoSNPs .fa)"BWA_MEM".sam indexamb=$genome".amb" indexann=$genome".ann" indexbwt=$genome".bwt" indexpac=$genome".pac" indexsa=$genome".sa" #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- ##Indexation of reference genome if [ -e $indexamb ] && [ -e $indexann ] && [ -e $indexbwt ] && [ -e $indexpac ] && [ -e $indexsa ]; then echo -e "...Indexation : Using the existing index..." else echo "INDEXATION: $PATH_BWA/bwa index $genome" $PATH_BWA/bwa index $genome if [ $? -ne 0 ] then echo "there was a problem with BWA (command was \"$PATH_BWA/bwa index $genome\"" exit 1 fi fi #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- ##Alignment discosnps on the reference genome echo "ALIGNMENT: $PATH_BWA/bwa mem -h 80 -k $k $genome $discoSNPsbis $bwa_threads > $samfile" $PATH_BWA/bwa mem -h 80 -k $k $genome $discoSNPsbis $bwa_threads > $samfile if [ $? -ne 0 ] then echo "there was a problem with BWA (command was \"$PATH_BWA/bwa mem -h 80 -k $k $genome $discoSNPsbis $bwa_threads > $samfile\"" exit 1 fi #--------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------- else ####Skip alignment phase to create a vcf file ##Test to execute VCF_creator echo -e "...Skipping alignment phase..." if [ -z "$vcffile" ] || [[ "$vcffile" =~ *.vcf ]]; then echo -e "...You must provide an output ..." exit 1 fi fi echo -e "python3 $PATH_VCF_creator/VCF_creator.py -s $samfile -o $vcffile" python3 $PATH_VCF_creator/VCF_creator.py -s $samfile -o $vcffile if [ $? -ne 0 ] then echo "there was a problem with the VCF creation (command was \"python3 $PATH_VCF_creator/VCF_creator.py -s $samfile -o $vcffile \"" exit 1 fi echo -e "... Creation of the vcf file: done ...==> $vcffile " if [ $igv -eq 1 ] ; then $DIR/create_IGV_compatible_VCF.sh $vcffile nameVCFIGV=$( basename $vcffile .vcf ) python3 $PATH_VCF_creator/filterOnBestDP_multiple_variant_at_same_pos.py $nameVCFIGV\_for_IGV.vcf > tmp.vcf if [ $? -ne 0 ] then echo "there was a problem with the IGV VCF creation (command was \"python3 $PATH_VCF_creator/filterOnBestDP_multiple_variant_at_same_pos.py $nameVCFIGV\_for_IGV.vcf > tmp.vcf\"" exit 1 fi echo -e "... Creation of the vcf file: done ...==> $vcffile" cat tmp.vcf > $nameVCFIGV\_for_IGV.vcf echo -e " Transforming the created zero-based vcf (and for IGV vcf) onto one-based vcf files" cmd="python3 $PATH_VCF_creator/zero2one.py -i $vcffile" echo $cmd $cmd cmd="python3 $PATH_VCF_creator/zero2one.py -i ${nameVCFIGV}_for_IGV.vcf" echo $cmd $cmd fi if [ $remove -eq 1 ];then rm -f $indexamb $indexann $indexbwt $indexpac $indexsa $saifile $discoSNPsbis tmp.vcf else rm -f tmp.vcf $discoSNPsbis fi DiscoSnp-2.6.2/scripts/simulations/000077500000000000000000000000001420021152700172735ustar00rootroot00000000000000DiscoSnp-2.6.2/scripts/simulations/README.md000066400000000000000000000001571420021152700205550ustar00rootroot00000000000000# Simulation scripts ##Requirements Mutareads tool ##Usage multiple_samples_simulator.sh –g genome.fasta DiscoSnp-2.6.2/scripts/simulations/ill100v4.bad.qual000066400000000000000000000706651420021152700221750ustar00rootroot00000000000000{2: 7012, 6: 10, 7: 54, 8: 14, 9: 24, 10: 51, 11: 370, 12: 112, 13: 9, 14: 4, 15: 336, 16: 27, 17: 36, 18: 520, 19: 26, 20: 6, 21: 51, 22: 50, 23: 424, 24: 42, 25: 79, 26: 273, 27: 102, 28: 220, 29: 85, 30: 331, 31: 303, 32: 447, 33: 656, 34: 16022, 35: 99} {2: 87, 5: 1585, 6: 7802, 7: 2278, 8: 2013, 9: 3131, 10: 2341, 11: 592, 12: 342, 13: 323, 14: 103, 15: 571, 16: 219, 17: 320, 18: 723, 19: 82, 20: 211, 21: 258, 22: 128, 23: 497, 24: 136, 25: 182, 26: 380, 27: 153, 28: 304, 29: 126, 30: 303, 31: 315, 32: 234, 33: 207, 34: 1647, 35: 22} {2: 208, 5: 4, 6: 37, 7: 134, 8: 58, 9: 69, 10: 144, 11: 161, 12: 90, 13: 48, 14: 66, 15: 193, 16: 71, 17: 152, 18: 239, 19: 22, 20: 44, 21: 149, 22: 50, 23: 208, 24: 66, 25: 46, 26: 186, 27: 73, 28: 144, 29: 45, 30: 194, 31: 227, 32: 95, 33: 152, 34: 1582, 35: 25} {2: 312, 5: 7, 6: 16, 7: 87, 8: 42, 9: 56, 10: 90, 11: 74, 12: 93, 13: 30, 14: 75, 15: 163, 16: 47, 17: 83, 18: 175, 19: 25, 20: 38, 21: 132, 22: 20, 23: 152, 24: 46, 25: 23, 26: 131, 27: 46, 28: 106, 29: 40, 30: 175, 31: 160, 32: 96, 33: 135, 34: 1424, 35: 11} {2: 78847, 5: 6, 6: 69, 7: 215, 8: 104, 9: 139, 10: 181, 11: 95, 12: 139, 13: 76, 14: 96, 15: 228, 16: 56, 17: 95, 18: 144, 19: 43, 20: 57, 21: 141, 22: 41, 23: 116, 24: 52, 25: 64, 26: 114, 27: 52, 28: 93, 29: 36, 30: 129, 31: 129, 32: 76, 33: 113, 34: 1476, 35: 15} {2: 34869, 4: 2, 5: 7, 6: 35, 7: 129, 8: 49, 9: 59, 10: 98, 11: 51, 12: 81, 13: 50, 14: 100, 15: 135, 16: 48, 17: 68, 18: 95, 19: 34, 20: 35, 21: 99, 22: 32, 23: 87, 24: 42, 25: 19, 26: 87, 27: 47, 28: 75, 29: 28, 30: 98, 31: 103, 32: 71, 33: 97, 34: 1470, 35: 9} {2: 639, 4: 374, 5: 9991, 6: 12189, 7: 6192, 8: 8107, 9: 5096, 10: 5109, 11: 1563, 12: 1948, 13: 511, 14: 1055, 15: 1536, 16: 874, 17: 359, 18: 897, 19: 78, 20: 282, 21: 425, 22: 40, 23: 278, 24: 54, 25: 73, 26: 114, 27: 60, 28: 97, 29: 45, 30: 150, 31: 142, 32: 85, 33: 110, 34: 1351, 35: 20} {2: 304, 4: 3, 5: 10, 6: 42, 7: 129, 8: 88, 9: 71, 10: 145, 11: 167, 12: 97, 13: 58, 14: 94, 15: 170, 16: 80, 17: 111, 18: 235, 19: 36, 20: 53, 21: 131, 22: 56, 23: 184, 24: 71, 25: 60, 26: 133, 27: 64, 28: 117, 29: 60, 30: 124, 31: 130, 32: 110, 33: 137, 34: 1222, 35: 24} {2: 39818, 4: 5, 5: 118, 6: 297, 7: 255, 8: 337, 9: 294, 10: 394, 11: 145, 12: 154, 13: 123, 14: 129, 15: 175, 16: 152, 17: 158, 18: 187, 19: 82, 20: 123, 21: 167, 22: 56, 23: 151, 24: 85, 25: 67, 26: 141, 27: 77, 28: 89, 29: 78, 30: 140, 31: 135, 32: 100, 33: 110, 34: 1266, 35: 18} {2: 811, 4: 6, 5: 25, 6: 37, 7: 99, 8: 82, 9: 61, 10: 108, 11: 104, 12: 70, 13: 63, 14: 62, 15: 243, 16: 62, 17: 106, 18: 198, 19: 57, 20: 53, 21: 151, 22: 51, 23: 130, 24: 60, 25: 29, 26: 131, 27: 58, 28: 112, 29: 46, 30: 132, 31: 124, 32: 95, 33: 121, 34: 1243, 35: 12} {2: 267, 4: 132, 5: 4777, 6: 5585, 7: 3038, 8: 3066, 9: 2827, 10: 2856, 11: 850, 12: 1161, 13: 373, 14: 615, 15: 1011, 16: 537, 17: 308, 18: 565, 19: 111, 20: 262, 21: 297, 22: 103, 23: 246, 24: 98, 25: 136, 26: 165, 27: 131, 28: 165, 29: 74, 30: 170, 31: 169, 32: 127, 33: 133, 34: 1250, 35: 17} {2: 1888, 4: 1, 5: 23, 6: 53, 7: 180, 8: 89, 9: 99, 10: 150, 11: 120, 12: 130, 13: 84, 14: 83, 15: 169, 16: 83, 17: 116, 18: 212, 19: 45, 20: 89, 21: 156, 22: 49, 23: 159, 24: 59, 25: 48, 26: 132, 27: 67, 28: 87, 29: 43, 30: 148, 31: 128, 32: 85, 33: 94, 34: 1072, 35: 16} {2: 4084, 4: 4, 5: 19, 6: 70, 7: 168, 8: 114, 9: 111, 10: 171, 11: 120, 12: 122, 13: 93, 14: 107, 15: 201, 16: 99, 17: 128, 18: 247, 19: 78, 20: 96, 21: 153, 22: 49, 23: 154, 24: 56, 25: 60, 26: 118, 27: 71, 28: 111, 29: 59, 30: 115, 31: 121, 32: 119, 33: 91, 34: 1077, 35: 22} {2: 5553, 4: 3, 5: 27, 6: 179, 7: 307, 8: 236, 9: 340, 10: 345, 11: 219, 12: 160, 13: 146, 14: 142, 15: 351, 16: 200, 17: 193, 18: 337, 19: 122, 20: 197, 21: 232, 22: 79, 23: 280, 24: 131, 25: 88, 26: 234, 27: 129, 28: 191, 29: 100, 30: 198, 31: 183, 32: 158, 33: 153, 34: 1072, 35: 21} {2: 6728, 5: 20, 6: 64, 7: 118, 8: 107, 9: 103, 10: 134, 11: 137, 12: 73, 13: 71, 14: 89, 15: 178, 16: 80, 17: 141, 18: 186, 19: 54, 20: 94, 21: 126, 22: 47, 23: 151, 24: 47, 25: 47, 26: 151, 27: 68, 28: 77, 29: 54, 30: 116, 31: 110, 32: 91, 33: 100, 34: 985, 35: 17} {2: 9935, 4: 1, 5: 23, 6: 96, 7: 299, 8: 122, 9: 140, 10: 194, 11: 159, 12: 199, 13: 90, 14: 129, 15: 227, 16: 130, 17: 79, 18: 173, 19: 82, 20: 87, 21: 167, 22: 95, 23: 119, 24: 76, 25: 78, 26: 148, 27: 79, 28: 133, 29: 74, 30: 148, 31: 138, 32: 120, 33: 85, 34: 956, 35: 21} {2: 5563, 5: 22, 6: 79, 7: 154, 8: 114, 9: 139, 10: 165, 11: 84, 12: 98, 13: 86, 14: 116, 15: 159, 16: 99, 17: 84, 18: 117, 19: 55, 20: 95, 21: 118, 22: 45, 23: 99, 24: 56, 25: 44, 26: 100, 27: 64, 28: 80, 29: 51, 30: 88, 31: 132, 32: 97, 33: 58, 34: 958, 35: 31} {2: 1574, 4: 1, 5: 18, 6: 67, 7: 116, 8: 80, 9: 102, 10: 128, 11: 68, 12: 88, 13: 81, 14: 77, 15: 122, 16: 110, 17: 65, 18: 104, 19: 45, 20: 90, 21: 71, 22: 38, 23: 108, 24: 47, 25: 36, 26: 115, 27: 50, 28: 68, 29: 36, 30: 86, 31: 107, 32: 71, 33: 79, 34: 933, 35: 17} {2: 1745, 5: 21, 6: 71, 7: 126, 8: 89, 9: 123, 10: 148, 11: 111, 12: 75, 13: 90, 14: 91, 15: 136, 16: 105, 17: 98, 18: 149, 19: 65, 20: 93, 21: 92, 22: 42, 23: 137, 24: 49, 25: 38, 26: 115, 27: 82, 28: 81, 29: 55, 30: 107, 31: 105, 32: 94, 33: 82, 34: 884, 35: 26} {2: 203567, 4: 894, 5: 17745, 6: 27395, 7: 12720, 8: 23426, 9: 13488, 10: 12766, 11: 5485, 12: 4847, 13: 1576, 14: 3712, 15: 4032, 16: 3129, 17: 2038, 18: 2697, 19: 1079, 20: 996, 21: 2157, 22: 260, 23: 1807, 24: 450, 25: 636, 26: 423, 27: 316, 28: 325, 29: 382, 30: 387, 31: 206, 32: 269, 33: 106, 34: 833, 35: 30} {2: 1340, 5: 17, 6: 125, 7: 272, 8: 130, 9: 179, 10: 229, 11: 118, 12: 133, 13: 130, 14: 82, 15: 140, 16: 84, 17: 69, 18: 115, 19: 58, 20: 84, 21: 73, 22: 50, 23: 98, 24: 52, 25: 52, 26: 84, 27: 71, 28: 83, 29: 47, 30: 83, 31: 101, 32: 126, 33: 92, 34: 794, 35: 39} {2: 359106, 4: 1432, 5: 38398, 6: 47862, 7: 23154, 8: 24202, 9: 20959, 10: 19150, 11: 5215, 12: 6408, 13: 1835, 14: 3511, 15: 4484, 16: 2562, 17: 1343, 18: 2112, 19: 320, 20: 980, 21: 1065, 22: 109, 23: 660, 24: 136, 25: 291, 26: 234, 27: 190, 28: 194, 29: 138, 30: 124, 31: 162, 32: 168, 33: 104, 34: 742, 35: 55} {2: 222606, 4: 740, 5: 16358, 6: 23158, 7: 10627, 8: 13933, 9: 9612, 10: 9438, 11: 2854, 12: 3037, 13: 1040, 14: 1816, 15: 2394, 16: 1557, 17: 700, 18: 1478, 19: 303, 20: 553, 21: 789, 22: 116, 23: 517, 24: 110, 25: 201, 26: 151, 27: 136, 28: 122, 29: 107, 30: 109, 31: 132, 32: 157, 33: 105, 34: 698, 35: 46} {2: 76194, 4: 215, 5: 4182, 6: 7225, 7: 3240, 8: 5748, 9: 3430, 10: 2942, 11: 1429, 12: 1232, 13: 357, 14: 926, 15: 1050, 16: 802, 17: 583, 18: 719, 19: 314, 20: 287, 21: 559, 22: 58, 23: 604, 24: 129, 25: 188, 26: 163, 27: 163, 28: 142, 29: 105, 30: 147, 31: 130, 32: 143, 33: 93, 34: 733, 35: 59} {2: 3530, 4: 1, 5: 24, 6: 103, 7: 155, 8: 114, 9: 136, 10: 175, 11: 82, 12: 99, 13: 75, 14: 93, 15: 141, 16: 104, 17: 73, 18: 123, 19: 54, 20: 111, 21: 64, 22: 45, 23: 87, 24: 54, 25: 45, 26: 116, 27: 61, 28: 73, 29: 65, 30: 88, 31: 110, 32: 142, 33: 116, 34: 707, 35: 46} {2: 5694, 4: 1, 5: 35, 6: 109, 7: 223, 8: 130, 9: 204, 10: 206, 11: 97, 12: 101, 13: 97, 14: 90, 15: 153, 16: 86, 17: 66, 18: 65, 19: 51, 20: 95, 21: 50, 22: 42, 23: 86, 24: 43, 25: 47, 26: 88, 27: 58, 28: 78, 29: 59, 30: 73, 31: 113, 32: 136, 33: 98, 34: 726, 35: 53} {2: 5544, 4: 2, 5: 31, 6: 145, 7: 248, 8: 176, 9: 207, 10: 249, 11: 121, 12: 122, 13: 123, 14: 101, 15: 152, 16: 103, 17: 74, 18: 106, 19: 58, 20: 95, 21: 73, 22: 41, 23: 80, 24: 49, 25: 47, 26: 100, 27: 60, 28: 90, 29: 71, 30: 86, 31: 98, 32: 135, 33: 107, 34: 713, 35: 64} {2: 44404, 4: 1, 5: 43, 6: 140, 7: 195, 8: 160, 9: 193, 10: 234, 11: 115, 12: 102, 13: 117, 14: 118, 15: 177, 16: 106, 17: 64, 18: 152, 19: 71, 20: 90, 21: 63, 22: 57, 23: 103, 24: 49, 25: 56, 26: 95, 27: 59, 28: 90, 29: 76, 30: 76, 31: 119, 32: 136, 33: 119, 34: 679, 35: 53} {2: 35873, 4: 364, 5: 7201, 6: 9598, 7: 4784, 8: 5522, 9: 4600, 10: 4007, 11: 1296, 12: 1436, 13: 443, 14: 876, 15: 1063, 16: 658, 17: 471, 18: 596, 19: 152, 20: 285, 21: 330, 22: 73, 23: 298, 24: 69, 25: 110, 26: 114, 27: 84, 28: 86, 29: 97, 30: 73, 31: 133, 32: 119, 33: 97, 34: 667, 35: 55} {2: 5362, 4: 7, 5: 41, 6: 142, 7: 186, 8: 165, 9: 186, 10: 228, 11: 87, 12: 123, 13: 105, 14: 124, 15: 148, 16: 129, 17: 70, 18: 110, 19: 63, 20: 103, 21: 79, 22: 29, 23: 97, 24: 36, 25: 52, 26: 109, 27: 70, 28: 73, 29: 60, 30: 62, 31: 98, 32: 127, 33: 97, 34: 680, 35: 42} {2: 246867, 4: 623, 5: 21735, 6: 26584, 7: 12341, 8: 9345, 9: 12147, 10: 9942, 11: 2155, 12: 2675, 13: 1109, 14: 1366, 15: 1768, 16: 861, 17: 604, 18: 590, 19: 218, 20: 449, 21: 327, 22: 89, 23: 273, 24: 124, 25: 139, 26: 136, 27: 153, 28: 139, 29: 132, 30: 104, 31: 162, 32: 135, 33: 135, 34: 664, 35: 80} {2: 3456, 4: 31, 5: 279, 6: 507, 7: 473, 8: 443, 9: 499, 10: 617, 11: 215, 12: 191, 13: 164, 14: 155, 15: 215, 16: 234, 17: 107, 18: 182, 19: 108, 20: 141, 21: 124, 22: 58, 23: 111, 24: 69, 25: 71, 26: 137, 27: 96, 28: 110, 29: 102, 30: 79, 31: 148, 32: 156, 33: 128, 34: 628, 35: 74} {2: 8062, 4: 4, 5: 29, 6: 158, 7: 222, 8: 156, 9: 216, 10: 265, 11: 144, 12: 106, 13: 109, 14: 79, 15: 219, 16: 126, 17: 107, 18: 186, 19: 77, 20: 108, 21: 89, 22: 67, 23: 102, 24: 56, 25: 51, 26: 119, 27: 74, 28: 90, 29: 85, 30: 87, 31: 121, 32: 121, 33: 109, 34: 700, 35: 67} {2: 5228, 4: 3, 5: 20, 6: 148, 7: 193, 8: 160, 9: 231, 10: 223, 11: 92, 12: 136, 13: 120, 14: 105, 15: 181, 16: 142, 17: 77, 18: 154, 19: 73, 20: 86, 21: 83, 22: 56, 23: 93, 24: 50, 25: 54, 26: 111, 27: 51, 28: 94, 29: 70, 30: 53, 31: 112, 32: 122, 33: 122, 34: 656, 35: 81} {2: 3979, 5: 38, 6: 193, 7: 235, 8: 193, 9: 253, 10: 293, 11: 143, 12: 120, 13: 141, 14: 108, 15: 195, 16: 154, 17: 103, 18: 149, 19: 90, 20: 125, 21: 81, 22: 63, 23: 111, 24: 60, 25: 55, 26: 128, 27: 66, 28: 107, 29: 98, 30: 69, 31: 128, 32: 128, 33: 146, 34: 592, 35: 89} {2: 3429, 5: 37, 6: 175, 7: 232, 8: 166, 9: 275, 10: 242, 11: 92, 12: 105, 13: 130, 14: 80, 15: 143, 16: 88, 17: 63, 18: 81, 19: 69, 20: 81, 21: 72, 22: 40, 23: 79, 24: 52, 25: 47, 26: 65, 27: 65, 28: 95, 29: 81, 30: 54, 31: 93, 32: 113, 33: 133, 34: 600, 35: 87} {2: 3576, 4: 1, 5: 33, 6: 176, 7: 233, 8: 208, 9: 279, 10: 281, 11: 143, 12: 133, 13: 134, 14: 100, 15: 155, 16: 103, 17: 76, 18: 131, 19: 82, 20: 107, 21: 82, 22: 38, 23: 95, 24: 63, 25: 51, 26: 108, 27: 73, 28: 78, 29: 88, 30: 54, 31: 103, 32: 120, 33: 142, 34: 587, 35: 93} {2: 3881, 4: 4, 5: 38, 6: 200, 7: 251, 8: 227, 9: 320, 10: 355, 11: 123, 12: 151, 13: 172, 14: 137, 15: 219, 16: 155, 17: 98, 18: 138, 19: 76, 20: 125, 21: 81, 22: 52, 23: 90, 24: 57, 25: 51, 26: 102, 27: 60, 28: 83, 29: 81, 30: 49, 31: 135, 32: 119, 33: 128, 34: 596, 35: 75} {2: 5267, 4: 4, 5: 45, 6: 238, 7: 332, 8: 293, 9: 410, 10: 403, 11: 144, 12: 156, 13: 170, 14: 140, 15: 211, 16: 171, 17: 127, 18: 184, 19: 119, 20: 148, 21: 115, 22: 72, 23: 97, 24: 71, 25: 50, 26: 133, 27: 78, 28: 121, 29: 110, 30: 64, 31: 140, 32: 144, 33: 144, 34: 513, 35: 125} {2: 71762, 4: 345, 5: 7861, 6: 12340, 7: 5558, 8: 9119, 9: 6094, 10: 5471, 11: 2299, 12: 2031, 13: 712, 14: 1466, 15: 1659, 16: 1395, 17: 853, 18: 1099, 19: 488, 20: 407, 21: 776, 22: 104, 23: 791, 24: 127, 25: 247, 26: 199, 27: 131, 28: 131, 29: 159, 30: 122, 31: 144, 32: 173, 33: 154, 34: 531, 35: 111} {2: 5295, 4: 11, 5: 79, 6: 351, 7: 491, 8: 324, 9: 503, 10: 583, 11: 189, 12: 195, 13: 186, 14: 179, 15: 237, 16: 134, 17: 106, 18: 130, 19: 101, 20: 123, 21: 97, 22: 53, 23: 98, 24: 79, 25: 74, 26: 82, 27: 84, 28: 74, 29: 80, 30: 63, 31: 119, 32: 130, 33: 183, 34: 481, 35: 127} {2: 127778, 4: 588, 5: 13858, 6: 18320, 7: 9023, 8: 6726, 9: 8724, 10: 6899, 11: 1331, 12: 1539, 13: 835, 14: 805, 15: 1046, 16: 549, 17: 348, 18: 368, 19: 147, 20: 291, 21: 214, 22: 73, 23: 154, 24: 83, 25: 99, 26: 133, 27: 103, 28: 109, 29: 126, 30: 88, 31: 137, 32: 186, 33: 182, 34: 500, 35: 114} {2: 5916, 4: 6, 5: 48, 6: 257, 7: 374, 8: 250, 9: 416, 10: 409, 11: 173, 12: 186, 13: 172, 14: 126, 15: 201, 16: 165, 17: 87, 18: 146, 19: 105, 20: 137, 21: 101, 22: 57, 23: 92, 24: 78, 25: 61, 26: 122, 27: 75, 28: 85, 29: 108, 30: 57, 31: 135, 32: 125, 33: 164, 34: 447, 35: 111} {2: 5879, 5: 42, 6: 226, 7: 276, 8: 249, 9: 326, 10: 382, 11: 144, 12: 153, 13: 144, 14: 135, 15: 194, 16: 146, 17: 90, 18: 136, 19: 99, 20: 137, 21: 72, 22: 52, 23: 80, 24: 53, 25: 58, 26: 114, 27: 63, 28: 87, 29: 121, 30: 68, 31: 120, 32: 134, 33: 178, 34: 522, 35: 117} {2: 6454, 4: 4, 5: 44, 6: 233, 7: 307, 8: 232, 9: 304, 10: 386, 11: 124, 12: 175, 13: 145, 14: 110, 15: 215, 16: 165, 17: 86, 18: 138, 19: 82, 20: 141, 21: 80, 22: 55, 23: 87, 24: 45, 25: 64, 26: 118, 27: 79, 28: 100, 29: 116, 30: 62, 31: 122, 32: 126, 33: 188, 34: 444, 35: 97} {2: 9401, 4: 696, 5: 10785, 6: 14726, 7: 7144, 8: 4508, 9: 7026, 10: 5199, 11: 693, 12: 674, 13: 701, 14: 352, 15: 413, 16: 174, 17: 208, 18: 124, 19: 103, 20: 164, 21: 121, 22: 49, 23: 98, 24: 70, 25: 89, 26: 96, 27: 83, 28: 76, 29: 108, 30: 51, 31: 125, 32: 131, 33: 179, 34: 450, 35: 147} {2: 8007, 4: 10, 5: 79, 6: 317, 7: 426, 8: 284, 9: 487, 10: 557, 11: 193, 12: 172, 13: 198, 14: 144, 15: 230, 16: 144, 17: 82, 18: 131, 19: 90, 20: 149, 21: 102, 22: 59, 23: 69, 24: 55, 25: 70, 26: 89, 27: 73, 28: 78, 29: 107, 30: 65, 31: 136, 32: 142, 33: 195, 34: 411, 35: 119} {2: 10362, 4: 370, 5: 10608, 6: 13592, 7: 6461, 8: 5654, 9: 6408, 10: 5293, 11: 1220, 12: 1364, 13: 632, 14: 749, 15: 868, 16: 513, 17: 301, 18: 409, 19: 99, 20: 275, 21: 212, 22: 65, 23: 147, 24: 59, 25: 84, 26: 130, 27: 73, 28: 88, 29: 141, 30: 67, 31: 108, 32: 147, 33: 203, 34: 383, 35: 132} {2: 8870, 4: 7, 5: 66, 6: 325, 7: 345, 8: 316, 9: 483, 10: 497, 11: 191, 12: 204, 13: 209, 14: 125, 15: 251, 16: 203, 17: 116, 18: 152, 19: 113, 20: 146, 21: 97, 22: 70, 23: 92, 24: 79, 25: 61, 26: 113, 27: 77, 28: 82, 29: 111, 30: 64, 31: 122, 32: 120, 33: 200, 34: 408, 35: 113} {2: 68261, 4: 477, 5: 10440, 6: 14136, 7: 7156, 8: 7678, 9: 6902, 10: 6149, 11: 1782, 12: 1963, 13: 702, 14: 1228, 15: 1433, 16: 997, 17: 608, 18: 828, 19: 274, 20: 436, 21: 496, 22: 89, 23: 303, 24: 142, 25: 165, 26: 201, 27: 131, 28: 136, 29: 179, 30: 111, 31: 108, 32: 206, 33: 205, 34: 351, 35: 133} {2: 11182, 4: 9, 5: 98, 6: 404, 7: 471, 8: 379, 9: 489, 10: 554, 11: 163, 12: 169, 13: 175, 14: 124, 15: 186, 16: 111, 17: 89, 18: 128, 19: 109, 20: 92, 21: 81, 22: 55, 23: 78, 24: 49, 25: 50, 26: 101, 27: 66, 28: 62, 29: 108, 30: 64, 31: 97, 32: 138, 33: 211, 34: 358, 35: 128} {2: 12805, 4: 9, 5: 103, 6: 389, 7: 432, 8: 426, 9: 564, 10: 634, 11: 208, 12: 185, 13: 223, 14: 177, 15: 268, 16: 187, 17: 142, 18: 171, 19: 140, 20: 138, 21: 115, 22: 75, 23: 125, 24: 70, 25: 82, 26: 111, 27: 83, 28: 94, 29: 133, 30: 76, 31: 134, 32: 137, 33: 210, 34: 301, 35: 163} {2: 12196, 4: 1, 5: 71, 6: 340, 7: 372, 8: 387, 9: 466, 10: 579, 11: 182, 12: 197, 13: 233, 14: 154, 15: 237, 16: 186, 17: 118, 18: 161, 19: 120, 20: 141, 21: 111, 22: 63, 23: 88, 24: 55, 25: 77, 26: 122, 27: 73, 28: 101, 29: 128, 30: 61, 31: 122, 32: 124, 33: 218, 34: 327, 35: 136} {2: 59241, 4: 470, 5: 5716, 6: 8299, 7: 4223, 8: 2942, 9: 4103, 10: 3594, 11: 578, 12: 598, 13: 542, 14: 339, 15: 431, 16: 363, 17: 224, 18: 240, 19: 174, 20: 230, 21: 174, 22: 92, 23: 156, 24: 88, 25: 87, 26: 162, 27: 101, 28: 135, 29: 182, 30: 85, 31: 116, 32: 151, 33: 207, 34: 298, 35: 139} {2: 15031, 4: 3, 5: 66, 6: 351, 7: 431, 8: 373, 9: 504, 10: 602, 11: 183, 12: 247, 13: 235, 14: 167, 15: 247, 16: 238, 17: 143, 18: 188, 19: 127, 20: 156, 21: 105, 22: 58, 23: 100, 24: 82, 25: 86, 26: 129, 27: 71, 28: 90, 29: 148, 30: 73, 31: 141, 32: 151, 33: 219, 34: 297, 35: 136} {2: 60092, 4: 256, 5: 5007, 6: 7424, 7: 3646, 8: 2332, 9: 3659, 10: 2941, 11: 419, 12: 398, 13: 425, 14: 284, 15: 332, 16: 171, 17: 169, 18: 119, 19: 121, 20: 128, 21: 108, 22: 59, 23: 105, 24: 70, 25: 98, 26: 79, 27: 80, 28: 100, 29: 86, 30: 78, 31: 118, 32: 148, 33: 226, 34: 252, 35: 165} {2: 18674, 4: 13, 5: 128, 6: 503, 7: 615, 8: 513, 9: 670, 10: 774, 11: 248, 12: 201, 13: 240, 14: 168, 15: 286, 16: 184, 17: 131, 18: 164, 19: 135, 20: 137, 21: 134, 22: 91, 23: 110, 24: 60, 25: 103, 26: 112, 27: 76, 28: 101, 29: 142, 30: 73, 31: 103, 32: 156, 33: 243, 34: 311, 35: 149} {2: 319973, 4: 544, 5: 8727, 6: 11598, 7: 6128, 8: 5078, 9: 6082, 10: 5540, 11: 1052, 12: 1064, 13: 913, 14: 788, 15: 769, 16: 761, 17: 459, 18: 529, 19: 416, 20: 417, 21: 517, 22: 149, 23: 311, 24: 229, 25: 258, 26: 247, 27: 217, 28: 215, 29: 245, 30: 180, 31: 154, 32: 196, 33: 258, 34: 254, 35: 146} {2: 21570, 4: 13, 5: 171, 6: 758, 7: 857, 8: 732, 9: 1000, 10: 1190, 11: 376, 12: 399, 13: 394, 14: 273, 15: 424, 16: 357, 17: 260, 18: 288, 19: 214, 20: 237, 21: 197, 22: 104, 23: 144, 24: 105, 25: 116, 26: 132, 27: 95, 28: 116, 29: 176, 30: 97, 31: 132, 32: 195, 33: 249, 34: 225, 35: 137} {2: 58015, 4: 10, 5: 125, 6: 560, 7: 645, 8: 540, 9: 757, 10: 918, 11: 330, 12: 340, 13: 284, 14: 212, 15: 352, 16: 326, 17: 240, 18: 326, 19: 169, 20: 228, 21: 200, 22: 112, 23: 193, 24: 125, 25: 132, 26: 188, 27: 121, 28: 180, 29: 189, 30: 137, 31: 165, 32: 205, 33: 276, 34: 234, 35: 116} {2: 24913, 4: 19, 5: 149, 6: 562, 7: 692, 8: 540, 9: 765, 10: 795, 11: 193, 12: 187, 13: 218, 14: 186, 15: 210, 16: 138, 17: 120, 18: 128, 19: 120, 20: 120, 21: 102, 22: 59, 23: 99, 24: 54, 25: 99, 26: 55, 27: 78, 28: 79, 29: 101, 30: 94, 31: 84, 32: 146, 33: 222, 34: 202, 35: 118} {2: 27585, 4: 851, 5: 6912, 6: 8679, 7: 4413, 8: 3240, 9: 4188, 10: 3662, 11: 501, 12: 475, 13: 562, 14: 363, 15: 444, 16: 327, 17: 203, 18: 231, 19: 189, 20: 198, 21: 205, 22: 84, 23: 179, 24: 103, 25: 122, 26: 140, 27: 116, 28: 109, 29: 159, 30: 108, 31: 152, 32: 169, 33: 250, 34: 203, 35: 128} {2: 24745, 4: 14, 5: 175, 6: 601, 7: 736, 8: 608, 9: 812, 10: 988, 11: 306, 12: 272, 13: 324, 14: 262, 15: 319, 16: 271, 17: 182, 18: 194, 19: 157, 20: 163, 21: 158, 22: 86, 23: 129, 24: 106, 25: 105, 26: 117, 27: 77, 28: 112, 29: 149, 30: 83, 31: 106, 32: 164, 33: 222, 34: 200, 35: 115} {2: 30036, 4: 15, 5: 206, 6: 765, 7: 980, 8: 808, 9: 1099, 10: 1246, 11: 376, 12: 318, 13: 423, 14: 291, 15: 519, 16: 379, 17: 236, 18: 319, 19: 248, 20: 281, 21: 213, 22: 127, 23: 179, 24: 99, 25: 147, 26: 126, 27: 112, 28: 115, 29: 165, 30: 98, 31: 144, 32: 187, 33: 227, 34: 186, 35: 123} {2: 211955, 4: 1170, 5: 33196, 6: 46905, 7: 22154, 8: 18440, 9: 21754, 10: 17376, 11: 3967, 12: 4449, 13: 2016, 14: 2366, 15: 2833, 16: 1714, 17: 1100, 18: 1300, 19: 384, 20: 750, 21: 752, 22: 141, 23: 444, 24: 135, 25: 251, 26: 185, 27: 158, 28: 164, 29: 218, 30: 131, 31: 145, 32: 208, 33: 251, 34: 157, 35: 123} {2: 39229, 4: 76, 5: 478, 6: 1455, 7: 1581, 8: 1003, 9: 1357, 10: 1380, 11: 380, 12: 334, 13: 343, 14: 320, 15: 301, 16: 162, 17: 150, 18: 167, 19: 152, 20: 126, 21: 117, 22: 85, 23: 116, 24: 70, 25: 103, 26: 84, 27: 86, 28: 63, 29: 101, 30: 88, 31: 125, 32: 151, 33: 211, 34: 144, 35: 112} {2: 55275, 4: 625, 5: 4048, 6: 5888, 7: 3865, 8: 2406, 9: 3327, 10: 2976, 11: 550, 12: 548, 13: 582, 14: 468, 15: 514, 16: 340, 17: 255, 18: 272, 19: 255, 20: 242, 21: 180, 22: 128, 23: 172, 24: 120, 25: 150, 26: 117, 27: 106, 28: 124, 29: 134, 30: 106, 31: 121, 32: 165, 33: 248, 34: 100, 35: 81} {2: 111448, 4: 6241, 5: 39395, 6: 40486, 7: 22528, 8: 15608, 9: 19170, 10: 14530, 11: 1435, 12: 1415, 13: 1345, 14: 856, 15: 930, 16: 549, 17: 442, 18: 422, 19: 289, 20: 376, 21: 316, 22: 151, 23: 251, 24: 164, 25: 175, 26: 166, 27: 142, 28: 137, 29: 208, 30: 124, 31: 136, 32: 162, 33: 227, 34: 126, 35: 74} {2: 90693, 4: 690, 5: 7104, 6: 10228, 7: 6289, 8: 4368, 9: 5952, 10: 5432, 11: 1126, 12: 976, 13: 1056, 14: 828, 15: 937, 16: 695, 17: 460, 18: 445, 19: 388, 20: 455, 21: 383, 22: 194, 23: 274, 24: 199, 25: 196, 26: 184, 27: 148, 28: 149, 29: 200, 30: 193, 31: 145, 32: 180, 33: 210, 34: 100, 35: 73} {2: 407343, 4: 6297, 5: 41430, 6: 50520, 7: 26870, 8: 20152, 9: 24646, 10: 19057, 11: 3430, 12: 3960, 13: 2285, 14: 2369, 15: 2472, 16: 1814, 17: 1116, 18: 1324, 19: 579, 20: 959, 21: 985, 22: 281, 23: 503, 24: 286, 25: 401, 26: 294, 27: 317, 28: 287, 29: 387, 30: 296, 31: 174, 32: 244, 33: 236, 34: 107, 35: 63} {2: 199358, 4: 423, 5: 2172, 6: 5501, 7: 4843, 8: 3059, 9: 4270, 10: 4158, 11: 1132, 12: 897, 13: 828, 14: 919, 15: 713, 16: 356, 17: 316, 18: 275, 19: 208, 20: 239, 21: 233, 22: 162, 23: 194, 24: 128, 25: 182, 26: 125, 27: 138, 28: 125, 29: 121, 30: 120, 31: 115, 32: 137, 33: 179, 34: 95, 35: 74} {2: 374498, 4: 23620, 5: 83661, 6: 68495, 7: 43807, 8: 27351, 9: 34082, 10: 22771, 11: 1978, 12: 1836, 13: 2114, 14: 1733, 15: 1372, 16: 1380, 17: 885, 18: 1008, 19: 697, 20: 803, 21: 864, 22: 435, 23: 665, 24: 445, 25: 534, 26: 317, 27: 530, 28: 479, 29: 331, 30: 355, 31: 272, 32: 250, 33: 237, 34: 103, 35: 100} {2: 276886, 4: 6968, 5: 27418, 6: 28110, 7: 15945, 8: 11985, 9: 13364, 10: 11172, 11: 1480, 12: 1311, 13: 1339, 14: 1151, 15: 1021, 16: 793, 17: 504, 18: 492, 19: 389, 20: 433, 21: 422, 22: 177, 23: 306, 24: 200, 25: 230, 26: 148, 27: 186, 28: 193, 29: 175, 30: 150, 31: 107, 32: 158, 33: 195, 34: 95, 35: 67} {2: 67520, 4: 75, 5: 524, 6: 1760, 7: 1931, 8: 1422, 9: 1959, 10: 2181, 11: 602, 12: 569, 13: 641, 14: 622, 15: 597, 16: 543, 17: 324, 18: 377, 19: 296, 20: 308, 21: 270, 22: 149, 23: 215, 24: 120, 25: 167, 26: 161, 27: 134, 28: 126, 29: 171, 30: 111, 31: 112, 32: 132, 33: 172, 34: 91, 35: 52} {2: 90883, 4: 398, 5: 4720, 6: 7556, 7: 4314, 8: 2955, 9: 4426, 10: 3961, 11: 778, 12: 663, 13: 891, 14: 568, 15: 729, 16: 583, 17: 397, 18: 416, 19: 320, 20: 372, 21: 311, 22: 186, 23: 245, 24: 138, 25: 191, 26: 175, 27: 126, 28: 159, 29: 154, 30: 150, 31: 137, 32: 159, 33: 182, 34: 92, 35: 51} {2: 468594, 4: 8793, 5: 39116, 6: 38634, 7: 22024, 8: 14616, 9: 17985, 10: 13992, 11: 1166, 12: 1229, 13: 1382, 14: 989, 15: 859, 16: 580, 17: 502, 18: 513, 19: 420, 20: 461, 21: 427, 22: 307, 23: 326, 24: 216, 25: 310, 26: 143, 27: 241, 28: 206, 29: 186, 30: 189, 31: 185, 32: 153, 33: 169, 34: 74, 35: 65} {2: 166514, 4: 2067, 5: 9895, 6: 11851, 7: 8407, 8: 5286, 9: 7071, 10: 5923, 11: 1035, 12: 922, 13: 938, 14: 950, 15: 779, 16: 543, 17: 395, 18: 398, 19: 359, 20: 357, 21: 324, 22: 224, 23: 235, 24: 158, 25: 215, 26: 150, 27: 134, 28: 128, 29: 141, 30: 152, 31: 123, 32: 136, 33: 175, 34: 73, 35: 54} {2: 313404, 4: 8337, 5: 41085, 6: 42617, 7: 23208, 8: 16628, 9: 19639, 10: 15689, 11: 1741, 12: 1778, 13: 1730, 14: 1340, 15: 1135, 16: 1056, 17: 624, 18: 660, 19: 544, 20: 602, 21: 633, 22: 254, 23: 409, 24: 248, 25: 310, 26: 188, 27: 294, 28: 253, 29: 233, 30: 205, 31: 136, 32: 173, 33: 171, 34: 68, 35: 58} {2: 113521, 4: 221, 5: 1230, 6: 3044, 7: 3178, 8: 2243, 9: 2908, 10: 3295, 11: 937, 12: 800, 13: 915, 14: 852, 15: 730, 16: 723, 17: 404, 18: 454, 19: 389, 20: 376, 21: 364, 22: 227, 23: 279, 24: 172, 25: 228, 26: 152, 27: 163, 28: 146, 29: 193, 30: 143, 31: 139, 32: 147, 33: 182, 34: 69, 35: 48} {2: 97606, 4: 56, 5: 581, 6: 1287, 7: 1440, 8: 1112, 9: 1365, 10: 1668, 11: 490, 12: 429, 13: 534, 14: 421, 15: 390, 16: 431, 17: 282, 18: 331, 19: 276, 20: 264, 21: 264, 22: 132, 23: 204, 24: 97, 25: 148, 26: 113, 27: 106, 28: 126, 29: 149, 30: 133, 31: 129, 32: 149, 33: 161, 34: 64, 35: 49} {2: 102965, 4: 70, 5: 731, 6: 1507, 7: 1619, 8: 1183, 9: 1418, 10: 1486, 11: 347, 12: 377, 13: 436, 14: 429, 15: 334, 16: 196, 17: 232, 18: 188, 19: 220, 20: 191, 21: 148, 22: 127, 23: 150, 24: 86, 25: 132, 26: 77, 27: 100, 28: 109, 29: 103, 30: 111, 31: 98, 32: 121, 33: 204, 34: 63, 35: 63} {2: 115037, 4: 75, 5: 829, 6: 1707, 7: 2271, 8: 1506, 9: 2005, 10: 2222, 11: 549, 12: 521, 13: 768, 14: 658, 15: 547, 16: 460, 17: 363, 18: 380, 19: 359, 20: 349, 21: 323, 22: 212, 23: 275, 24: 166, 25: 248, 26: 126, 27: 173, 28: 182, 29: 164, 30: 177, 31: 144, 32: 146, 33: 189, 34: 54, 35: 52} {2: 150835, 4: 1014, 5: 6004, 6: 8023, 7: 5350, 8: 3822, 9: 4946, 10: 4618, 11: 884, 12: 838, 13: 1136, 14: 862, 15: 894, 16: 791, 17: 502, 18: 543, 19: 495, 20: 510, 21: 492, 22: 270, 23: 351, 24: 211, 25: 309, 26: 210, 27: 187, 28: 172, 29: 189, 30: 174, 31: 135, 32: 166, 33: 153, 34: 67, 35: 38} {2: 366678, 4: 3580, 5: 20717, 6: 24169, 7: 13795, 8: 8812, 9: 12300, 10: 9362, 11: 1447, 12: 1425, 13: 1558, 14: 1219, 15: 1009, 16: 1036, 17: 613, 18: 667, 19: 489, 20: 582, 21: 580, 22: 278, 23: 395, 24: 241, 25: 322, 26: 207, 27: 256, 28: 260, 29: 219, 30: 200, 31: 163, 32: 158, 33: 179, 34: 53, 35: 44} {2: 149359, 4: 85, 5: 889, 6: 2021, 7: 2427, 8: 1797, 9: 2213, 10: 2666, 11: 721, 12: 636, 13: 864, 14: 675, 15: 737, 16: 673, 17: 379, 18: 482, 19: 377, 20: 421, 21: 424, 22: 217, 23: 267, 24: 178, 25: 252, 26: 180, 27: 148, 28: 148, 29: 163, 30: 173, 31: 131, 32: 132, 33: 143, 34: 53, 35: 30} {2: 176915, 4: 127, 5: 1209, 6: 2475, 7: 2578, 8: 1816, 9: 2168, 10: 2287, 11: 571, 12: 537, 13: 681, 14: 659, 15: 518, 16: 331, 17: 319, 18: 310, 19: 264, 20: 273, 21: 229, 22: 164, 23: 259, 24: 107, 25: 187, 26: 73, 27: 161, 28: 175, 29: 99, 30: 166, 31: 104, 32: 143, 33: 164, 34: 41, 35: 46} {2: 565483, 4: 2883, 5: 18694, 6: 21767, 7: 12415, 8: 8238, 9: 10980, 10: 8916, 11: 1230, 12: 1246, 13: 1525, 14: 1187, 15: 1004, 16: 1018, 17: 729, 18: 726, 19: 553, 20: 608, 21: 723, 22: 292, 23: 436, 24: 274, 25: 416, 26: 186, 27: 373, 28: 268, 29: 215, 30: 271, 31: 162, 32: 165, 33: 200, 34: 52, 35: 53} {2: 298097, 4: 1020, 5: 7275, 6: 9927, 7: 5982, 8: 4217, 9: 5251, 10: 4889, 11: 795, 12: 693, 13: 974, 14: 749, 15: 635, 16: 613, 17: 436, 18: 408, 19: 356, 20: 317, 21: 359, 22: 181, 23: 230, 24: 134, 25: 196, 26: 125, 27: 162, 28: 161, 29: 166, 30: 139, 31: 111, 32: 157, 33: 147, 34: 44, 35: 48} {2: 206042, 4: 305, 5: 3737, 6: 5952, 7: 4185, 8: 2952, 9: 4046, 10: 4035, 11: 859, 12: 789, 13: 1205, 14: 836, 15: 699, 16: 859, 17: 538, 18: 547, 19: 479, 20: 481, 21: 537, 22: 225, 23: 362, 24: 185, 25: 316, 26: 192, 27: 201, 28: 212, 29: 219, 30: 177, 31: 157, 32: 149, 33: 171, 34: 46, 35: 40} {2: 194760, 4: 80, 5: 1046, 6: 1658, 7: 1906, 8: 1445, 9: 1783, 10: 2037, 11: 559, 12: 512, 13: 681, 14: 542, 15: 470, 16: 660, 17: 363, 18: 447, 19: 359, 20: 344, 21: 374, 22: 185, 23: 250, 24: 144, 25: 231, 26: 125, 27: 157, 28: 178, 29: 154, 30: 226, 31: 155, 32: 145, 33: 163, 34: 59, 35: 44} {2: 205106, 4: 71, 5: 780, 6: 1479, 7: 1708, 8: 1192, 9: 1474, 10: 1515, 11: 356, 12: 395, 13: 552, 14: 459, 15: 356, 16: 211, 17: 254, 18: 224, 19: 238, 20: 184, 21: 165, 22: 145, 23: 174, 24: 99, 25: 156, 26: 47, 27: 132, 28: 117, 29: 78, 30: 118, 31: 102, 32: 94, 33: 146, 34: 36, 35: 30} {2: 226468, 4: 89, 5: 998, 6: 1788, 7: 2361, 8: 1568, 9: 1891, 10: 2139, 11: 534, 12: 518, 13: 793, 14: 671, 15: 506, 16: 508, 17: 413, 18: 357, 19: 375, 20: 285, 21: 326, 22: 185, 23: 247, 24: 133, 25: 227, 26: 97, 27: 169, 28: 143, 29: 125, 30: 141, 31: 99, 32: 109, 33: 136, 34: 45, 35: 36} {2: 263877, 4: 29, 5: 872, 6: 1687, 7: 2519, 8: 1676, 9: 2124, 10: 2638, 11: 664, 12: 621, 13: 940, 14: 777, 15: 610, 16: 766, 17: 486, 18: 515, 19: 490, 20: 438, 21: 445, 22: 233, 23: 340, 24: 152, 25: 293, 26: 145, 27: 189, 28: 209, 29: 159, 30: 195, 31: 145, 32: 122, 33: 133, 34: 34, 35: 28} {2: 637799, 4: 225, 5: 5016, 6: 7940, 7: 5616, 8: 4263, 9: 5297, 10: 5422, 11: 1248, 12: 1238, 13: 1508, 14: 1276, 15: 987, 16: 1524, 17: 851, 18: 1063, 19: 786, 20: 866, 21: 1104, 22: 425, 23: 722, 24: 442, 25: 620, 26: 326, 27: 567, 28: 416, 29: 371, 30: 446, 31: 279, 32: 264, 33: 151, 34: 40, 35: 48} {2: 423135, 4: 36, 5: 970, 6: 1759, 7: 1836, 8: 1391, 9: 1768, 10: 2074, 11: 593, 12: 586, 13: 741, 14: 578, 15: 591, 16: 856, 17: 471, 18: 581, 19: 434, 20: 473, 21: 506, 22: 236, 23: 329, 24: 229, 25: 311, 26: 201, 27: 257, 28: 220, 29: 222, 30: 251, 31: 182, 32: 160, 33: 146, 34: 39, 35: 44} {2: 303910, 4: 4, 5: 329, 6: 748, 7: 1067, 8: 695, 9: 853, 10: 876, 11: 240, 12: 273, 13: 420, 14: 375, 15: 397, 16: 269, 17: 309, 18: 277, 19: 295, 20: 233, 21: 198, 22: 168, 23: 221, 24: 127, 25: 206, 26: 77, 27: 152, 28: 167, 29: 123, 30: 161, 31: 124, 32: 109, 33: 140, 34: 30, 35: 36} {2: 333646, 4: 6, 5: 432, 6: 874, 7: 1504, 8: 908, 9: 1161, 10: 1349, 11: 377, 12: 329, 13: 571, 14: 476, 15: 492, 16: 477, 17: 382, 18: 315, 19: 402, 20: 306, 21: 332, 22: 172, 23: 301, 24: 111, 25: 270, 26: 126, 27: 155, 28: 141, 29: 110, 30: 146, 31: 119, 32: 102, 33: 125, 34: 36, 35: 28} {2: 350316, 4: 3, 5: 385, 6: 847, 7: 1416, 8: 943, 9: 1309, 10: 1558, 11: 407, 12: 353, 13: 609, 14: 503, 15: 470, 16: 641, 17: 416, 18: 388, 19: 450, 20: 374, 21: 381, 22: 165, 23: 316, 24: 181, 25: 288, 26: 146, 27: 205, 28: 190, 29: 168, 30: 182, 31: 141, 32: 119, 33: 116, 34: 33, 35: 31} {2: 411961, 4: 2, 5: 361, 6: 890, 7: 1344, 8: 954, 9: 1288, 10: 1674, 11: 508, 12: 431, 13: 600, 14: 480, 15: 496, 16: 953, 17: 526, 18: 574, 19: 488, 20: 484, 21: 620, 22: 195, 23: 345, 24: 243, 25: 354, 26: 190, 27: 217, 28: 225, 29: 230, 30: 207, 31: 156, 32: 125, 33: 128, 34: 41, 35: 29} {2: 357404, 5: 68, 6: 222, 7: 273, 8: 201, 9: 263, 10: 331, 11: 124, 12: 102, 13: 154, 14: 141, 15: 400, 16: 643, 17: 349, 18: 436, 19: 353, 20: 321, 21: 396, 22: 142, 23: 267, 24: 169, 25: 241, 26: 150, 27: 181, 28: 198, 29: 156, 30: 222, 31: 188, 32: 121, 33: 135, 34: 36, 35: 32} {2: 490047, 15: 1085, 16: 706, 17: 676, 18: 574, 19: 646, 20: 533, 21: 412, 22: 343, 23: 457, 24: 238, 25: 347, 26: 110, 27: 251, 28: 242, 29: 163, 30: 253, 31: 209, 32: 163, 33: 157, 34: 61, 35: 48} DiscoSnp-2.6.2/scripts/simulations/ill100v4.good.qual000066400000000000000000001053731420021152700223720ustar00rootroot00000000000000{2: 4, 6: 13, 7: 124, 8: 41, 9: 84, 10: 143, 11: 810, 12: 334, 13: 71, 14: 22, 15: 67933, 16: 135, 17: 306, 18: 1905, 19: 506, 20: 584, 21: 1866, 22: 4147, 23: 11474, 24: 10282, 25: 9028, 26: 31736, 27: 38740, 28: 9328, 29: 19245, 30: 91091, 31: 29316, 32: 151058, 33: 176556, 34: 8197677, 35: 17112} {2: 22, 5: 950, 6: 7631, 7: 3506, 8: 3375, 9: 6111, 10: 7175, 11: 1675, 12: 1110, 13: 1546, 14: 901, 15: 58987, 16: 2033, 17: 1492, 18: 3389, 19: 999, 20: 2281, 21: 3101, 22: 5282, 23: 12869, 24: 10631, 25: 11344, 26: 28526, 27: 33755, 28: 12443, 29: 22301, 30: 80661, 31: 37049, 32: 137739, 33: 175607, 34: 8178016, 35: 19576} {2: 104, 5: 9, 6: 1518, 7: 2180, 8: 1946, 9: 8389, 10: 7648, 11: 3634, 12: 1533, 13: 2084, 14: 14453, 15: 34775, 16: 6047, 17: 2676, 18: 5153, 19: 2672, 20: 6127, 21: 4853, 22: 8002, 23: 14371, 24: 13894, 25: 13801, 26: 24965, 27: 30127, 28: 18413, 29: 27169, 30: 79142, 31: 42409, 32: 147872, 33: 182614, 34: 8160986, 35: 26506} {2: 159, 4: 1, 5: 72, 6: 1803, 7: 3332, 8: 2668, 9: 7828, 10: 7634, 11: 3084, 12: 1710, 13: 2647, 14: 20322, 15: 27943, 16: 5927, 17: 2563, 18: 4333, 19: 3380, 20: 5781, 21: 4724, 22: 7837, 23: 14530, 24: 14233, 25: 14055, 26: 23191, 27: 30211, 28: 16175, 29: 26732, 30: 78440, 31: 41041, 32: 147881, 33: 181080, 34: 8168766, 35: 27592} {2: 303, 4: 2, 5: 276, 6: 2764, 7: 3793, 8: 3460, 9: 8365, 10: 8003, 11: 3313, 12: 2054, 13: 3606, 14: 17647, 15: 20259, 16: 6043, 17: 2908, 18: 5088, 19: 3981, 20: 5956, 21: 6192, 22: 8780, 23: 13577, 24: 12766, 25: 15494, 26: 18855, 27: 23812, 28: 19600, 29: 27647, 30: 58591, 31: 47512, 32: 117663, 33: 178954, 34: 8138080, 35: 35197} {2: 2968, 4: 2, 5: 442, 6: 1807, 7: 2755, 8: 3024, 9: 5825, 10: 5009, 11: 2740, 12: 1494, 13: 2742, 14: 11916, 15: 14687, 16: 4189, 17: 4036, 18: 5027, 19: 3577, 20: 5794, 21: 5647, 22: 9735, 23: 11119, 24: 11019, 25: 17186, 26: 15344, 27: 20670, 28: 19284, 29: 29540, 30: 50748, 31: 48508, 32: 102884, 33: 190160, 34: 8216581, 35: 40657} {2: 5624, 4: 137, 5: 4196, 6: 7471, 7: 5732, 8: 7520, 9: 8958, 10: 8891, 11: 3878, 12: 2528, 13: 3369, 14: 11656, 15: 14837, 16: 5456, 17: 5215, 18: 7154, 19: 4031, 20: 7191, 21: 6327, 22: 10115, 23: 12236, 24: 11873, 25: 17117, 26: 16229, 27: 22649, 28: 20535, 29: 34008, 30: 50944, 31: 62281, 32: 103049, 33: 258809, 34: 8041733, 35: 65292} {2: 5871, 4: 2, 5: 709, 6: 2928, 7: 3367, 8: 4210, 9: 7242, 10: 7203, 11: 3520, 12: 1670, 13: 3241, 14: 11959, 15: 14999, 16: 5274, 17: 5311, 18: 7285, 19: 4032, 20: 6960, 21: 6087, 22: 10189, 23: 12836, 24: 12444, 25: 17260, 26: 18035, 27: 23845, 28: 21521, 29: 36974, 30: 54345, 31: 67719, 32: 107501, 33: 304236, 34: 8051430, 35: 63573} {2: 6171, 4: 4, 5: 785, 6: 3057, 7: 3551, 8: 4600, 9: 7533, 10: 7564, 11: 3789, 12: 2096, 13: 3583, 14: 12455, 15: 14726, 16: 5611, 17: 5607, 18: 7427, 19: 4417, 20: 7649, 21: 6891, 22: 9874, 23: 13323, 24: 12637, 25: 17610, 26: 19214, 27: 24182, 28: 22397, 29: 39455, 30: 56994, 31: 69424, 32: 111111, 33: 300235, 34: 7997291, 35: 62896} {2: 6763, 4: 3, 5: 670, 6: 2765, 7: 3212, 8: 4171, 9: 7285, 10: 7099, 11: 3447, 12: 1789, 13: 3381, 14: 12343, 15: 15053, 16: 5076, 17: 5314, 18: 7095, 19: 3988, 20: 7118, 21: 5947, 22: 10065, 23: 12941, 24: 12298, 25: 16807, 26: 18417, 27: 24621, 28: 21552, 29: 36904, 30: 56899, 31: 72502, 32: 112064, 33: 309988, 34: 8029806, 35: 69148} {2: 8362, 4: 61, 5: 2510, 6: 3844, 7: 3568, 8: 3548, 9: 4880, 10: 4601, 11: 2752, 12: 2334, 13: 2395, 14: 9927, 15: 13354, 16: 3160, 17: 3235, 18: 5733, 19: 3598, 20: 4372, 21: 6144, 22: 11282, 23: 12501, 24: 11306, 25: 17436, 26: 16446, 27: 21057, 28: 21006, 29: 38435, 30: 55799, 31: 70175, 32: 125389, 33: 308039, 34: 8001536, 35: 82275} {2: 8448, 4: 3, 5: 252, 6: 970, 7: 1541, 8: 1642, 9: 2836, 10: 2706, 11: 2019, 12: 1222, 13: 1857, 14: 9698, 15: 13328, 16: 2545, 17: 3038, 18: 5368, 19: 2937, 20: 4038, 21: 5577, 22: 10503, 23: 13243, 24: 10697, 25: 16295, 26: 17831, 27: 22293, 28: 20236, 29: 39240, 30: 60449, 31: 73284, 32: 135820, 33: 320173, 34: 8009026, 35: 88896} {2: 8637, 4: 1, 5: 232, 6: 1011, 7: 1463, 8: 1711, 9: 2792, 10: 2789, 11: 2027, 12: 1167, 13: 1869, 14: 9707, 15: 12984, 16: 2689, 17: 3168, 18: 5430, 19: 3054, 20: 4165, 21: 5573, 22: 10020, 23: 13849, 24: 10837, 25: 16208, 26: 18527, 27: 22862, 28: 20365, 29: 40153, 30: 62688, 31: 76715, 32: 138800, 33: 328186, 34: 7985216, 35: 91817} {2: 9226, 4: 1, 5: 221, 6: 1127, 7: 1651, 8: 1808, 9: 3190, 10: 3037, 11: 2071, 12: 1131, 13: 2036, 14: 9949, 15: 12893, 16: 2797, 17: 3409, 18: 5523, 19: 3064, 20: 4581, 21: 5674, 22: 9723, 23: 13615, 24: 10697, 25: 16229, 26: 18754, 27: 23054, 28: 20356, 29: 41097, 30: 63664, 31: 77512, 32: 142398, 33: 326380, 34: 7967335, 35: 99574} {2: 10347, 4: 1, 5: 253, 6: 952, 7: 1379, 8: 1598, 9: 2814, 10: 2592, 11: 1880, 12: 977, 13: 1726, 14: 9869, 15: 12625, 16: 2570, 17: 3067, 18: 5277, 19: 2888, 20: 4060, 21: 5217, 22: 9838, 23: 13356, 24: 10318, 25: 15582, 26: 18324, 27: 22681, 28: 19603, 29: 40733, 30: 63704, 31: 79053, 32: 143469, 33: 329122, 34: 7960571, 35: 109384} {2: 13011, 4: 1, 5: 38, 6: 321, 7: 912, 8: 527, 9: 777, 10: 1189, 11: 1207, 12: 1421, 13: 1175, 14: 10491, 15: 14471, 16: 1887, 17: 2119, 18: 4095, 19: 2685, 20: 3586, 21: 5612, 22: 11081, 23: 14557, 24: 11093, 25: 18084, 26: 18396, 27: 22396, 28: 20701, 29: 42837, 30: 66272, 31: 76651, 32: 170992, 33: 346584, 34: 7894102, 35: 122931} {2: 13557, 5: 34, 6: 317, 7: 645, 8: 530, 9: 837, 10: 1084, 11: 1099, 12: 1130, 13: 1157, 14: 11132, 15: 15404, 16: 1908, 17: 2049, 18: 3748, 19: 2593, 20: 3839, 21: 5203, 22: 9938, 23: 15369, 24: 11130, 25: 16727, 26: 20058, 27: 24925, 28: 19911, 29: 44750, 30: 70394, 31: 81226, 32: 176950, 33: 350176, 34: 7866370, 35: 133298} {2: 14573, 5: 41, 6: 335, 7: 477, 8: 553, 9: 721, 10: 998, 11: 1052, 12: 995, 13: 1167, 14: 13360, 15: 16016, 16: 2029, 17: 2091, 18: 4002, 19: 2743, 20: 4283, 21: 5219, 22: 10218, 23: 16190, 24: 11206, 25: 16986, 26: 21677, 27: 26589, 28: 20482, 29: 46850, 30: 73806, 31: 88852, 32: 187629, 33: 359371, 34: 7807520, 35: 153912} {2: 16258, 5: 30, 6: 323, 7: 532, 8: 617, 9: 812, 10: 1067, 11: 1340, 12: 972, 13: 1313, 14: 11689, 15: 17957, 16: 2040, 17: 2297, 18: 4472, 19: 2795, 20: 4532, 21: 5284, 22: 10056, 23: 16365, 24: 11802, 25: 17477, 26: 22540, 27: 27422, 28: 21918, 29: 48186, 30: 78152, 31: 96244, 32: 192885, 33: 363248, 34: 7779399, 35: 151399} {2: 19426, 4: 411, 5: 8059, 6: 15265, 7: 9139, 8: 15798, 9: 12111, 10: 12236, 11: 6847, 12: 7219, 13: 3706, 14: 12581, 15: 16439, 16: 8036, 17: 7618, 18: 9591, 19: 7098, 20: 9416, 21: 13205, 22: 11640, 23: 20569, 24: 15635, 25: 20567, 26: 27324, 27: 28817, 28: 30819, 29: 62554, 30: 82250, 31: 110003, 32: 198794, 33: 369129, 34: 7193484, 35: 200865} {2: 27525, 4: 2, 5: 53, 6: 583, 7: 1045, 8: 859, 9: 1570, 10: 1912, 11: 1881, 12: 2070, 13: 2429, 14: 20419, 15: 31735, 16: 3414, 17: 3429, 18: 5619, 19: 4467, 20: 6726, 21: 7887, 22: 16854, 23: 29490, 24: 18063, 25: 26192, 26: 37224, 27: 47772, 28: 30271, 29: 64104, 30: 137499, 31: 102768, 32: 380333, 33: 543685, 34: 7143480, 35: 210348} {2: 26897, 4: 557, 5: 16257, 6: 24397, 7: 13502, 8: 16928, 9: 13686, 10: 13399, 11: 6741, 12: 7294, 13: 4656, 14: 17654, 15: 27888, 16: 7894, 17: 6125, 18: 10673, 19: 6893, 20: 9933, 21: 11881, 22: 15485, 23: 26519, 24: 18333, 25: 26407, 26: 34436, 27: 41411, 28: 37278, 29: 72909, 30: 115374, 31: 141024, 32: 360683, 33: 507483, 34: 6397411, 35: 311462} {2: 28882, 4: 366, 5: 7399, 6: 15691, 7: 8552, 8: 9981, 9: 8815, 10: 10017, 11: 4289, 12: 4340, 13: 4257, 14: 17707, 15: 30021, 16: 6442, 17: 4835, 18: 8823, 19: 6148, 20: 9657, 21: 10346, 22: 15690, 23: 26560, 24: 19818, 25: 26157, 26: 38752, 27: 46942, 28: 37458, 29: 76931, 30: 128486, 31: 139212, 32: 405481, 33: 557046, 34: 6547088, 35: 328984} {2: 31326, 4: 113, 5: 2797, 6: 6151, 7: 3546, 8: 6139, 9: 4844, 10: 4627, 11: 3594, 12: 3409, 13: 2541, 14: 19026, 15: 34355, 16: 5212, 17: 4675, 18: 7076, 19: 5468, 20: 7893, 21: 9115, 22: 14970, 23: 28538, 24: 20144, 25: 24148, 26: 39336, 27: 50734, 28: 31016, 29: 69820, 30: 139709, 31: 127764, 32: 416398, 33: 566045, 34: 6796856, 35: 315198} {2: 35710, 4: 3, 5: 42, 6: 474, 7: 715, 8: 944, 9: 1222, 10: 1784, 11: 1597, 12: 1826, 13: 2333, 14: 19587, 15: 34521, 16: 4133, 17: 3728, 18: 6601, 19: 5263, 20: 7843, 21: 8275, 22: 15769, 23: 27869, 24: 21334, 25: 24987, 26: 42513, 27: 54627, 28: 33336, 29: 74637, 30: 152537, 31: 137912, 32: 452423, 33: 611067, 34: 6740365, 35: 383888} {2: 43415, 4: 5, 5: 43, 6: 683, 7: 1281, 8: 1249, 9: 1814, 10: 2457, 11: 2365, 12: 2440, 13: 3170, 14: 27853, 15: 47761, 16: 4173, 17: 4569, 18: 6598, 19: 4835, 20: 8208, 21: 9064, 22: 16319, 23: 33634, 24: 26569, 25: 26191, 26: 45907, 27: 69765, 28: 32281, 29: 66221, 30: 155415, 31: 120399, 32: 361455, 33: 547870, 34: 6911678, 35: 321930} {2: 43968, 4: 3, 5: 71, 6: 813, 7: 1314, 8: 1439, 9: 1968, 10: 2702, 11: 2490, 12: 2701, 13: 3302, 14: 31797, 15: 45697, 16: 4939, 17: 4886, 18: 7473, 19: 5552, 20: 9416, 21: 9584, 22: 16292, 23: 34295, 24: 27358, 25: 26952, 26: 51221, 27: 73386, 28: 35924, 29: 73536, 30: 161838, 31: 142529, 32: 398155, 33: 607113, 34: 6640965, 35: 437721} {2: 45078, 4: 1, 5: 51, 6: 753, 7: 1213, 8: 1364, 9: 1823, 10: 2471, 11: 2407, 12: 2501, 13: 3094, 14: 32428, 15: 43895, 16: 4878, 17: 4461, 18: 7444, 19: 5452, 20: 9010, 21: 9816, 22: 16141, 23: 34205, 24: 26236, 25: 26936, 26: 51617, 27: 73411, 28: 36298, 29: 75234, 30: 159309, 31: 140612, 32: 389735, 33: 585111, 34: 6674366, 35: 401214} {2: 38751, 4: 150, 5: 3430, 6: 6062, 7: 3792, 8: 5453, 9: 4892, 10: 4986, 11: 3614, 12: 3697, 13: 3110, 14: 33460, 15: 44977, 16: 5684, 17: 5054, 18: 7986, 19: 6009, 20: 9041, 21: 10136, 22: 16442, 23: 35448, 24: 26328, 25: 26498, 26: 52254, 27: 73930, 28: 35645, 29: 79298, 30: 160802, 31: 147780, 32: 404596, 33: 602276, 34: 6519195, 35: 454468} {2: 49387, 5: 39, 6: 589, 7: 1038, 8: 1072, 9: 1404, 10: 1959, 11: 2372, 12: 2179, 13: 2838, 14: 32917, 15: 44689, 16: 4603, 17: 4432, 18: 7551, 19: 5264, 20: 9301, 21: 9512, 22: 16223, 23: 36007, 24: 26784, 25: 27910, 26: 53429, 27: 74146, 28: 37416, 29: 76135, 30: 162452, 31: 146992, 32: 401401, 33: 564723, 34: 6743550, 35: 359468} {2: 52804, 4: 226, 5: 8540, 6: 12476, 7: 7409, 8: 7415, 9: 8197, 10: 8776, 11: 5045, 12: 4966, 13: 4551, 14: 9161, 15: 12693, 16: 6912, 17: 6612, 18: 9540, 19: 7377, 20: 11396, 21: 12395, 22: 13431, 23: 21144, 24: 17591, 25: 25239, 26: 28855, 27: 32267, 28: 41549, 29: 73936, 30: 83617, 31: 185332, 32: 303907, 33: 602851, 34: 6344150, 35: 592347} {2: 55786, 4: 14, 5: 407, 6: 1678, 7: 2075, 8: 2424, 9: 2922, 10: 3860, 11: 3017, 12: 2989, 13: 3627, 14: 9344, 15: 15638, 16: 6061, 17: 6198, 18: 8839, 19: 6933, 20: 11584, 21: 12060, 22: 15061, 23: 23404, 24: 20094, 25: 26663, 26: 34068, 27: 40158, 28: 47151, 29: 78011, 30: 106702, 31: 196682, 32: 383889, 33: 651232, 34: 6529735, 35: 598463} {2: 57262, 4: 1, 5: 31, 6: 676, 7: 999, 8: 1219, 9: 1526, 10: 2330, 11: 2306, 12: 1907, 13: 2723, 14: 8213, 15: 13334, 16: 4355, 17: 4884, 18: 7675, 19: 5426, 20: 9083, 21: 9629, 22: 13273, 23: 21816, 24: 17345, 25: 23730, 26: 32087, 27: 37971, 28: 40057, 29: 70665, 30: 105769, 31: 172940, 32: 355006, 33: 591181, 34: 6840700, 35: 448444} {2: 60518, 5: 29, 6: 668, 7: 974, 8: 1299, 9: 1541, 10: 2287, 11: 1917, 12: 2012, 13: 2709, 14: 8687, 15: 13845, 16: 4546, 17: 5058, 18: 7441, 19: 5430, 20: 9626, 21: 9498, 22: 13080, 23: 22278, 24: 17973, 25: 23910, 26: 32664, 27: 39238, 28: 41220, 29: 73839, 30: 107601, 31: 185572, 32: 376089, 33: 626489, 34: 6691934, 35: 517723} {2: 64643, 4: 3, 5: 34, 6: 836, 7: 1129, 8: 1499, 9: 1916, 10: 2701, 11: 2387, 12: 2336, 13: 3220, 14: 9252, 15: 15790, 16: 5602, 17: 5774, 18: 8345, 19: 6520, 20: 11316, 21: 10543, 22: 14273, 23: 23542, 24: 20141, 25: 25399, 26: 36172, 27: 42125, 28: 46378, 29: 84970, 30: 112732, 31: 215817, 32: 422876, 33: 731911, 34: 6273071, 35: 705193} {2: 72545, 4: 2, 5: 34, 6: 763, 7: 1188, 8: 1249, 9: 2050, 10: 2446, 11: 2003, 12: 2539, 13: 3219, 14: 9198, 15: 12798, 16: 4912, 17: 5167, 18: 7631, 19: 6821, 20: 9866, 21: 11109, 22: 15340, 23: 23456, 24: 17677, 25: 26487, 26: 31708, 27: 36523, 28: 45780, 29: 75674, 30: 103910, 31: 205289, 32: 399152, 33: 715592, 34: 6336992, 35: 720591} {2: 74422, 4: 1, 5: 34, 6: 816, 7: 1165, 8: 1342, 9: 1942, 10: 2529, 11: 2141, 12: 2523, 13: 3341, 14: 9352, 15: 13707, 16: 5524, 17: 5505, 18: 8125, 19: 7403, 20: 11129, 21: 11692, 22: 15768, 23: 24752, 24: 20146, 25: 27329, 26: 36147, 27: 41228, 28: 50199, 29: 87481, 30: 111827, 31: 231371, 32: 432447, 33: 783650, 34: 6068018, 35: 816092} {2: 76755, 4: 2, 5: 37, 6: 811, 7: 1188, 8: 1254, 9: 1900, 10: 2534, 11: 2091, 12: 2398, 13: 3241, 14: 9425, 15: 14080, 16: 5437, 17: 5440, 18: 8352, 19: 7417, 20: 11431, 21: 11330, 22: 15779, 23: 25512, 24: 20541, 25: 27721, 26: 38638, 27: 42998, 28: 52593, 29: 91361, 30: 117004, 31: 242701, 32: 447500, 33: 795351, 34: 6032380, 35: 793241} {2: 80177, 4: 1, 5: 46, 6: 860, 7: 1425, 8: 1556, 9: 2231, 10: 2903, 11: 2291, 12: 2620, 13: 3523, 14: 9726, 15: 14547, 16: 6350, 17: 5884, 18: 9162, 19: 7971, 20: 12784, 21: 12666, 22: 16586, 23: 26506, 24: 22597, 25: 29363, 26: 42176, 27: 46477, 28: 57018, 29: 99874, 30: 123082, 31: 264413, 32: 481732, 33: 882698, 34: 5708305, 35: 928785} {2: 85604, 4: 120, 5: 2687, 6: 5724, 7: 3496, 8: 5321, 9: 4629, 10: 5070, 11: 3244, 12: 3717, 13: 3879, 14: 9854, 15: 14117, 16: 7094, 17: 6566, 18: 10019, 19: 8490, 20: 13351, 21: 13416, 22: 16152, 23: 26318, 24: 22649, 25: 28683, 26: 42464, 27: 45664, 28: 57639, 29: 108597, 30: 122680, 31: 263631, 32: 490605, 33: 915375, 34: 5461740, 35: 973418} {2: 98995, 4: 3, 5: 63, 6: 1379, 7: 2241, 8: 1942, 9: 3431, 10: 3711, 11: 3030, 12: 3737, 13: 4454, 14: 8649, 15: 12032, 16: 6361, 17: 7224, 18: 9975, 19: 9531, 20: 13847, 21: 14917, 22: 18970, 23: 28033, 24: 22680, 25: 34132, 26: 39625, 27: 46501, 28: 68190, 29: 98565, 30: 123128, 31: 276977, 32: 494924, 33: 938195, 34: 5528132, 35: 982257} {2: 99548, 4: 182, 5: 4790, 6: 8285, 7: 4982, 8: 5010, 9: 6028, 10: 6160, 11: 3480, 12: 4094, 13: 4408, 14: 7961, 15: 12534, 16: 7306, 17: 6865, 18: 10192, 19: 9308, 20: 13507, 21: 14502, 22: 16241, 23: 26811, 24: 23018, 25: 30367, 26: 41342, 27: 45201, 28: 60912, 29: 109999, 30: 122568, 31: 277450, 32: 489552, 33: 1013228, 34: 5161936, 35: 1067625} {2: 105360, 4: 2, 5: 52, 6: 961, 7: 1578, 8: 1496, 9: 2417, 10: 3059, 11: 2269, 12: 2817, 13: 3649, 14: 8690, 15: 14815, 16: 6485, 17: 6383, 18: 9554, 19: 8904, 20: 13748, 21: 13581, 22: 17096, 23: 28882, 24: 24552, 25: 31916, 26: 45442, 27: 51167, 28: 66175, 29: 109988, 30: 139186, 31: 287213, 32: 531616, 33: 980899, 34: 5414245, 35: 971678} {2: 111787, 4: 3, 5: 52, 6: 944, 7: 1291, 8: 1499, 9: 2163, 10: 2850, 11: 2217, 12: 2812, 13: 3502, 14: 8840, 15: 14719, 16: 6522, 17: 6290, 18: 9527, 19: 8698, 20: 13794, 21: 13799, 22: 17333, 23: 28554, 24: 25274, 25: 31421, 26: 47770, 27: 52057, 28: 65709, 29: 120189, 30: 144142, 31: 297114, 32: 563001, 33: 1074650, 34: 5126237, 35: 1101514} {2: 121596, 4: 2, 5: 46, 6: 928, 7: 1270, 8: 1388, 9: 2065, 10: 2735, 11: 2128, 12: 2611, 13: 3433, 14: 9234, 15: 14408, 16: 6467, 17: 6056, 18: 9477, 19: 8924, 20: 14088, 21: 13850, 22: 16822, 23: 28757, 24: 25717, 25: 31579, 26: 48668, 27: 53552, 28: 68066, 29: 122343, 30: 147165, 31: 307221, 32: 576150, 33: 1082812, 34: 5088069, 35: 1088114} {2: 137438, 4: 217, 5: 4417, 6: 8269, 7: 5641, 8: 4556, 9: 7316, 10: 6992, 11: 3867, 12: 4707, 13: 5620, 14: 9297, 15: 12447, 16: 8162, 17: 8684, 18: 11265, 19: 11634, 20: 15813, 21: 17903, 22: 19093, 23: 31099, 24: 26430, 25: 38181, 26: 44281, 27: 52979, 28: 75891, 29: 126072, 30: 147254, 31: 327421, 32: 581363, 33: 1241649, 34: 4569110, 35: 1286844} {2: 143172, 4: 3, 5: 80, 6: 1494, 7: 1926, 8: 2055, 9: 3296, 10: 4005, 11: 2963, 12: 3721, 13: 4880, 14: 9167, 15: 13563, 16: 8065, 17: 7919, 18: 11316, 19: 11301, 20: 16694, 21: 17679, 22: 20233, 23: 32031, 24: 28362, 25: 38385, 26: 50396, 27: 57334, 28: 82133, 29: 134026, 30: 153869, 31: 341677, 32: 604525, 33: 1201197, 34: 4713992, 35: 1181941} {2: 147730, 4: 102, 5: 3609, 6: 6185, 7: 3999, 8: 4358, 9: 5131, 10: 5741, 11: 3426, 12: 4223, 13: 4718, 14: 9152, 15: 14212, 16: 8697, 17: 7819, 18: 11576, 19: 11288, 20: 16836, 21: 17369, 22: 19612, 23: 31263, 24: 29505, 25: 37442, 26: 53580, 27: 58068, 28: 80874, 29: 145101, 30: 158988, 31: 351848, 32: 624817, 33: 1296271, 34: 4389738, 35: 1286380} {2: 159033, 4: 2, 5: 72, 6: 1280, 7: 1897, 8: 2026, 9: 3058, 10: 3893, 11: 2907, 12: 3520, 13: 4554, 14: 9203, 15: 14659, 16: 8495, 17: 7897, 18: 11588, 19: 11318, 20: 17708, 21: 18076, 22: 20142, 23: 33480, 24: 30106, 25: 38818, 26: 57217, 27: 61892, 28: 86259, 29: 149052, 30: 169700, 31: 362065, 32: 647221, 33: 1278509, 34: 4473240, 35: 1213558} {2: 168661, 4: 195, 5: 4462, 6: 8347, 7: 5669, 8: 7305, 9: 7292, 10: 8197, 11: 4778, 12: 5943, 13: 5375, 14: 10080, 15: 14597, 16: 10781, 17: 9599, 18: 13891, 19: 13146, 20: 19335, 21: 21443, 22: 21352, 23: 33924, 24: 32698, 25: 40438, 26: 62624, 27: 63877, 28: 90918, 29: 177618, 30: 180232, 31: 371215, 32: 700649, 33: 1464696, 34: 3803100, 35: 1400027} {2: 198962, 4: 4, 5: 242, 6: 2414, 7: 2641, 8: 3190, 9: 4820, 10: 5960, 11: 4698, 12: 5119, 13: 7245, 14: 11581, 15: 16947, 16: 10320, 17: 10938, 18: 13706, 19: 14358, 20: 21272, 21: 21719, 22: 23916, 23: 38610, 24: 33418, 25: 47358, 26: 56994, 27: 65860, 28: 98950, 29: 157190, 30: 180704, 31: 392504, 32: 658317, 33: 1473093, 34: 3905069, 35: 1412173} {2: 204457, 4: 6, 5: 130, 6: 1913, 7: 2728, 8: 3031, 9: 4250, 10: 6057, 11: 4564, 12: 5014, 13: 7077, 14: 11627, 15: 19865, 16: 13981, 17: 10890, 18: 15782, 19: 16303, 20: 22930, 21: 24602, 22: 26657, 23: 39321, 24: 39984, 25: 51159, 26: 68602, 27: 72397, 28: 108222, 29: 192859, 30: 193684, 31: 417768, 32: 706551, 33: 1605962, 34: 3540701, 35: 1458688} {2: 214292, 4: 9, 5: 116, 6: 1745, 7: 2354, 8: 2613, 9: 3767, 10: 5123, 11: 3976, 12: 4565, 13: 6447, 14: 11862, 15: 19670, 16: 12841, 17: 10097, 18: 14664, 19: 15213, 20: 23002, 21: 23000, 22: 25657, 23: 39308, 24: 39145, 25: 48904, 26: 70721, 27: 72965, 28: 108340, 29: 195299, 30: 197251, 31: 420338, 32: 722264, 33: 1604160, 34: 3558081, 35: 1421140} {2: 223046, 4: 160, 5: 2145, 6: 5448, 7: 4750, 8: 5008, 9: 6637, 10: 8189, 11: 5521, 12: 6206, 13: 7957, 14: 12425, 15: 18790, 16: 15332, 17: 11951, 18: 17946, 19: 17501, 20: 25461, 21: 27483, 22: 28455, 23: 39315, 24: 42260, 25: 51346, 26: 75072, 27: 78013, 28: 116121, 29: 221730, 30: 209343, 31: 431361, 32: 767359, 33: 1745281, 34: 3125010, 35: 1469774} {2: 251579, 4: 2, 5: 100, 6: 1601, 7: 2303, 8: 2438, 9: 3572, 10: 4815, 11: 3495, 12: 4395, 13: 6090, 14: 12043, 15: 20490, 16: 12630, 17: 9604, 18: 14903, 19: 15138, 20: 23226, 21: 23142, 22: 24729, 23: 40285, 24: 39504, 25: 48949, 26: 76201, 27: 78396, 28: 112157, 29: 211087, 30: 208804, 31: 446932, 32: 773087, 33: 1675059, 34: 3306822, 35: 1442116} {2: 292711, 4: 58, 5: 1749, 6: 4644, 7: 4119, 8: 3841, 9: 5996, 10: 7004, 11: 4593, 12: 5555, 13: 7563, 14: 11675, 15: 17538, 16: 12614, 17: 12060, 18: 15542, 19: 17648, 20: 24413, 21: 26115, 22: 26982, 23: 45815, 24: 40251, 25: 59468, 26: 69046, 27: 79912, 28: 120271, 29: 197407, 30: 227900, 31: 444159, 32: 751552, 33: 1727832, 34: 3114233, 35: 1446912} {2: 307325, 4: 4, 5: 161, 6: 2185, 7: 3309, 8: 2914, 9: 5336, 10: 5921, 11: 4344, 12: 5184, 13: 7067, 14: 11972, 15: 19677, 16: 12565, 17: 11203, 18: 16296, 19: 17440, 20: 25151, 21: 27551, 22: 28333, 23: 47349, 24: 43074, 25: 59929, 26: 78590, 27: 88476, 28: 128824, 29: 213999, 30: 239371, 31: 455074, 32: 802560, 33: 1742547, 34: 3090492, 35: 1386904} {2: 294919, 4: 172, 5: 4041, 6: 9679, 7: 8784, 8: 9355, 9: 11131, 10: 13819, 11: 8136, 12: 8753, 13: 10620, 14: 13293, 15: 18500, 16: 18816, 17: 15345, 18: 21702, 19: 21754, 20: 29600, 21: 35286, 22: 31051, 23: 45633, 24: 46321, 25: 60245, 26: 81570, 27: 88038, 28: 128799, 29: 255014, 30: 231553, 31: 454504, 32: 798913, 33: 1898776, 34: 2422102, 35: 1446235} {2: 343549, 4: 8, 5: 197, 6: 2791, 7: 4238, 8: 4078, 9: 6877, 10: 7668, 11: 5462, 12: 6712, 13: 9047, 14: 13131, 15: 23196, 16: 16742, 17: 14449, 18: 21116, 19: 21884, 20: 32612, 21: 34535, 22: 34717, 23: 53424, 24: 50705, 25: 70313, 26: 97979, 27: 101714, 28: 151956, 29: 285593, 30: 275369, 31: 494148, 32: 909595, 33: 2039344, 34: 2284959, 35: 1467034} {2: 377006, 4: 6, 5: 165, 6: 2172, 7: 3351, 8: 3503, 9: 5060, 10: 6775, 11: 5062, 12: 5854, 13: 7932, 14: 11563, 15: 19942, 16: 16403, 17: 13080, 18: 19819, 19: 19851, 20: 30239, 21: 31563, 22: 33283, 23: 47182, 24: 49669, 25: 64469, 26: 94949, 27: 93566, 28: 148623, 29: 283216, 30: 269379, 31: 506144, 32: 906029, 33: 2018416, 34: 2324255, 35: 1431395} {2: 454512, 4: 17, 5: 297, 6: 3437, 7: 4547, 8: 4420, 9: 7307, 10: 8147, 11: 6357, 12: 7292, 13: 9989, 14: 17041, 15: 30963, 16: 15498, 17: 16101, 18: 19889, 19: 22571, 20: 32357, 21: 34162, 22: 37251, 23: 63467, 24: 53364, 25: 80518, 26: 91956, 27: 109210, 28: 159035, 29: 261665, 30: 306243, 31: 515065, 32: 902687, 33: 1978997, 34: 2290371, 35: 1340490} {2: 469233, 4: 165, 5: 2378, 6: 5863, 7: 5773, 8: 5273, 9: 8050, 10: 9307, 11: 6142, 12: 7095, 13: 10232, 14: 17524, 15: 29701, 16: 18921, 17: 15464, 18: 20910, 19: 23967, 20: 34876, 21: 36674, 22: 38766, 23: 61619, 24: 59355, 25: 80473, 26: 101903, 27: 112551, 28: 166059, 29: 292231, 30: 303777, 31: 538871, 32: 902092, 33: 1971141, 34: 2174359, 35: 1320875} {2: 497558, 4: 4, 5: 254, 6: 2767, 7: 4204, 8: 4210, 9: 6438, 10: 8412, 11: 6114, 12: 7130, 13: 10119, 14: 18637, 15: 31158, 16: 20526, 17: 15620, 18: 22686, 19: 25249, 20: 36801, 21: 38911, 22: 40945, 23: 62989, 24: 61734, 25: 84992, 26: 110399, 27: 116160, 28: 173861, 29: 319670, 30: 319450, 31: 555122, 32: 944636, 33: 2066946, 34: 1977584, 35: 1292523} {2: 534376, 4: 10, 5: 270, 6: 3245, 7: 4877, 8: 4813, 9: 7782, 10: 9161, 11: 6369, 12: 7502, 13: 10765, 14: 19951, 15: 32937, 16: 21460, 17: 16796, 18: 23251, 19: 25921, 20: 38497, 21: 40695, 22: 40290, 23: 65196, 24: 60864, 25: 86003, 26: 115306, 27: 118971, 28: 178871, 29: 316646, 30: 323506, 31: 555667, 32: 954784, 33: 2029575, 34: 1966579, 35: 1255145} {2: 544343, 4: 389, 5: 10584, 6: 19071, 7: 12109, 8: 12825, 9: 14867, 10: 15709, 11: 8649, 12: 9621, 13: 11881, 14: 16703, 15: 24453, 16: 21985, 17: 17420, 18: 24802, 19: 25451, 20: 36172, 21: 41743, 22: 39743, 23: 53340, 24: 56806, 25: 78459, 26: 104902, 27: 106317, 28: 164278, 29: 325720, 30: 308038, 31: 524126, 32: 932950, 33: 2070328, 34: 1659750, 35: 1226049} {2: 761034, 4: 54, 5: 818, 6: 7932, 7: 9394, 8: 9009, 9: 14015, 10: 16910, 11: 13675, 12: 13794, 13: 20337, 14: 37772, 15: 61588, 16: 30185, 17: 24912, 18: 30601, 19: 34284, 20: 51184, 21: 49655, 22: 58017, 23: 83520, 24: 76269, 25: 112100, 26: 119281, 27: 141923, 28: 208421, 29: 318919, 30: 379473, 31: 582387, 32: 924317, 33: 2032545, 34: 1528629, 35: 1113269} {2: 774151, 4: 112, 5: 1646, 6: 7860, 7: 9491, 8: 8536, 9: 13021, 10: 16449, 11: 12503, 12: 12882, 13: 19920, 14: 38041, 15: 67891, 16: 39893, 17: 24693, 18: 33936, 19: 38271, 20: 54760, 21: 55532, 22: 61863, 23: 87583, 24: 84542, 25: 118271, 26: 136429, 27: 147708, 28: 223306, 29: 374997, 30: 381965, 31: 601002, 32: 943229, 33: 2075641, 34: 1308085, 35: 1058178} {2: 781418, 4: 1556, 5: 12020, 6: 19563, 7: 15093, 8: 13686, 9: 18368, 10: 22256, 11: 13460, 12: 13370, 13: 19006, 14: 32804, 15: 47156, 16: 39041, 17: 24724, 18: 34743, 19: 36809, 20: 51991, 21: 55973, 22: 58405, 23: 77263, 24: 80162, 25: 111804, 26: 131437, 27: 141822, 28: 218940, 29: 386059, 30: 379264, 31: 588348, 32: 951190, 33: 2050199, 34: 1220444, 35: 988476} {2: 859339, 4: 164, 5: 2639, 6: 10231, 7: 12163, 8: 10701, 9: 17698, 10: 19462, 11: 13268, 12: 14328, 13: 20930, 14: 42580, 15: 65882, 16: 37617, 17: 25782, 18: 35585, 19: 38689, 20: 56143, 21: 60125, 22: 58861, 23: 89243, 24: 82762, 25: 119503, 26: 143158, 27: 153234, 28: 225247, 29: 393582, 30: 411476, 31: 578335, 32: 1013061, 33: 2044048, 34: 1183863, 35: 936227} {2: 854399, 4: 1677, 5: 13447, 6: 23635, 7: 17740, 8: 17503, 9: 21396, 10: 23724, 11: 13055, 12: 14247, 13: 19186, 14: 32982, 15: 51331, 16: 42073, 17: 24931, 18: 36839, 19: 37469, 20: 53148, 21: 62687, 22: 54390, 23: 76464, 24: 77466, 25: 108507, 26: 135533, 27: 138617, 28: 208355, 29: 405765, 30: 397368, 31: 522533, 32: 997438, 33: 1957694, 34: 1003151, 35: 850641} {2: 1118555, 4: 291, 5: 3213, 6: 22484, 7: 22665, 8: 23401, 9: 32698, 10: 37865, 11: 32056, 12: 28332, 13: 43268, 14: 89365, 15: 141981, 16: 49233, 17: 38664, 18: 45030, 19: 45685, 20: 78774, 21: 70614, 22: 81829, 23: 131374, 24: 101866, 25: 143866, 26: 163531, 27: 183061, 28: 232617, 29: 348462, 30: 441339, 31: 539310, 32: 890051, 33: 1770940, 34: 987276, 35: 745382} {2: 1036825, 4: 6480, 5: 31959, 6: 47241, 7: 36074, 8: 31695, 9: 39389, 10: 44562, 11: 26286, 12: 23189, 13: 33802, 14: 66458, 15: 98091, 16: 75594, 17: 37986, 18: 51972, 19: 49110, 20: 77353, 21: 75940, 22: 81399, 23: 104466, 24: 102566, 25: 134986, 26: 151397, 27: 158737, 28: 239792, 29: 376355, 30: 393728, 31: 521474, 32: 846235, 33: 1727404, 34: 810873, 35: 679449} {2: 1114516, 4: 1960, 5: 10749, 6: 24445, 7: 21772, 8: 20786, 9: 28794, 10: 33546, 11: 25214, 12: 23342, 13: 35401, 14: 82203, 15: 136410, 16: 81248, 17: 37363, 18: 54690, 19: 53548, 20: 86696, 21: 76975, 22: 89739, 23: 119857, 24: 113458, 25: 146089, 26: 179067, 27: 169083, 28: 259224, 29: 410532, 30: 410806, 31: 558830, 32: 868246, 33: 1764762, 34: 798763, 35: 675191} {2: 1275260, 4: 46, 5: 781, 6: 8263, 7: 11731, 8: 12602, 9: 17378, 10: 27032, 11: 23891, 12: 22612, 13: 36995, 14: 99238, 15: 168582, 16: 104008, 17: 38070, 18: 58673, 19: 60596, 20: 98488, 21: 81890, 22: 101744, 23: 129485, 24: 129524, 25: 155632, 26: 201524, 27: 174190, 28: 273113, 29: 427206, 30: 416181, 31: 587276, 32: 866414, 33: 1756316, 34: 800416, 35: 667285} {2: 1341972, 4: 168, 5: 2237, 6: 10948, 7: 13829, 8: 14955, 9: 19520, 10: 31984, 11: 26562, 12: 25021, 13: 40935, 14: 105540, 15: 159009, 16: 111905, 17: 41937, 18: 63532, 19: 63231, 20: 100772, 21: 85694, 22: 104891, 23: 125091, 24: 130614, 25: 156230, 26: 194964, 27: 173765, 28: 268982, 29: 429678, 30: 427060, 31: 562082, 32: 887079, 33: 1733532, 34: 716920, 35: 618854} {2: 1276039, 4: 2628, 5: 15741, 6: 29759, 7: 24968, 8: 23590, 9: 30074, 10: 35698, 11: 21274, 12: 21245, 13: 32529, 14: 51021, 15: 67012, 16: 51609, 17: 41316, 18: 51739, 19: 53462, 20: 78747, 21: 77228, 22: 87814, 23: 111671, 24: 109158, 25: 155896, 26: 142932, 27: 178935, 28: 260506, 29: 370541, 30: 440844, 31: 554042, 32: 822304, 33: 1738972, 34: 689000, 35: 633531} {2: 1476309, 4: 505, 5: 4236, 6: 18209, 7: 20232, 8: 17408, 9: 27782, 10: 30865, 11: 23513, 12: 23227, 13: 34934, 14: 66242, 15: 100016, 16: 53408, 17: 43682, 18: 57054, 19: 55838, 20: 88343, 21: 85495, 22: 98225, 23: 126722, 24: 121706, 25: 168921, 26: 174234, 27: 196899, 28: 280153, 29: 428334, 30: 465472, 31: 572171, 32: 883591, 33: 1726582, 34: 643649, 35: 576806} {2: 1399591, 4: 2345, 5: 16739, 6: 32272, 7: 27534, 8: 26698, 9: 32998, 10: 41419, 11: 26201, 12: 23809, 13: 36428, 14: 58739, 15: 85732, 16: 69564, 17: 46866, 18: 64769, 19: 59851, 20: 90405, 21: 95166, 22: 104352, 23: 112923, 24: 123825, 25: 168083, 26: 172994, 27: 185715, 28: 286630, 29: 448641, 30: 445515, 31: 543498, 32: 870705, 33: 1620454, 34: 588123, 35: 512840} {2: 1595147, 4: 183, 5: 1896, 6: 12374, 7: 16089, 8: 16602, 9: 23736, 10: 30874, 11: 24386, 12: 23121, 13: 36834, 14: 70109, 15: 107008, 16: 76893, 17: 47549, 18: 66824, 19: 63641, 20: 101167, 21: 96353, 22: 113065, 23: 125605, 24: 133837, 25: 175971, 26: 194147, 27: 191299, 28: 300385, 29: 464053, 30: 453850, 31: 579435, 32: 873815, 33: 1662524, 34: 583875, 35: 515352} {2: 1708755, 4: 57, 5: 926, 6: 7705, 7: 10994, 8: 12704, 9: 16007, 10: 25168, 11: 21179, 12: 20420, 13: 33797, 14: 68025, 15: 103450, 16: 85066, 17: 44317, 18: 64365, 19: 63782, 20: 101292, 21: 90309, 22: 111721, 23: 117587, 24: 134956, 25: 168153, 26: 192048, 27: 180495, 28: 294940, 29: 457010, 30: 448468, 31: 595411, 32: 862365, 33: 1655803, 34: 591082, 35: 517525} {2: 1884781, 4: 116, 5: 1394, 6: 9441, 7: 12133, 8: 12768, 9: 17343, 10: 21764, 11: 14816, 12: 16996, 13: 25129, 14: 36740, 15: 47763, 16: 40219, 17: 39211, 18: 46873, 19: 54464, 20: 70062, 21: 72467, 22: 89918, 23: 105754, 24: 106762, 25: 169266, 26: 133735, 27: 188585, 28: 295056, 29: 392262, 30: 485384, 31: 633844, 32: 819102, 33: 1774984, 34: 612883, 35: 569229} {2: 1911671, 4: 99, 5: 1242, 6: 9053, 7: 13500, 8: 12229, 9: 17646, 10: 23009, 11: 15644, 12: 17031, 13: 26913, 14: 36812, 15: 48688, 16: 46887, 17: 39461, 18: 51782, 19: 56782, 20: 74340, 21: 84234, 22: 93371, 23: 106094, 24: 115865, 25: 176096, 26: 152647, 27: 196278, 28: 302201, 29: 443453, 30: 489458, 31: 622904, 32: 861692, 33: 1685799, 34: 558844, 35: 491902} {2: 1931946, 4: 275, 5: 3013, 6: 13218, 7: 17294, 8: 15380, 9: 22175, 10: 27649, 11: 17751, 12: 18925, 13: 29757, 14: 39063, 15: 51365, 16: 50284, 17: 42230, 18: 56828, 19: 59135, 20: 78488, 21: 94961, 22: 94697, 23: 110417, 24: 118789, 25: 178579, 26: 162948, 27: 201816, 28: 305146, 29: 468990, 30: 496573, 31: 600054, 32: 879620, 33: 1589345, 34: 506091, 35: 438864} {2: 1884040, 4: 961, 5: 7900, 6: 18140, 7: 18935, 8: 16784, 9: 23014, 10: 26988, 11: 16382, 12: 17899, 13: 27511, 14: 32297, 15: 41644, 16: 48069, 17: 39362, 18: 53723, 19: 55957, 20: 73053, 21: 89407, 22: 89562, 23: 98752, 24: 111304, 25: 164954, 26: 157034, 27: 186056, 28: 287890, 29: 458127, 30: 467636, 31: 597622, 32: 829212, 33: 1569903, 34: 490919, 35: 442810} {2: 2167250, 4: 76, 5: 1162, 6: 8291, 7: 12344, 8: 11698, 9: 17765, 10: 21708, 11: 15350, 12: 16356, 13: 25772, 14: 36321, 15: 51841, 16: 48594, 17: 39409, 18: 53699, 19: 54894, 20: 77107, 21: 87135, 22: 95026, 23: 101693, 24: 116033, 25: 167655, 26: 163804, 27: 187968, 28: 295902, 29: 463625, 30: 501219, 31: 603867, 32: 878793, 33: 1532987, 34: 484323, 35: 407118} {2: 2410873, 4: 137, 5: 2163, 6: 13086, 7: 16635, 8: 15190, 9: 21907, 10: 25452, 11: 16859, 12: 19550, 13: 27968, 14: 40103, 15: 47537, 16: 41026, 17: 39404, 18: 46600, 19: 55167, 20: 69185, 21: 79699, 22: 77350, 23: 115307, 24: 98457, 25: 165911, 26: 122507, 27: 193937, 28: 277254, 29: 369044, 30: 517223, 31: 570459, 32: 797843, 33: 1521463, 34: 485877, 35: 419494} {2: 2164587, 4: 711, 5: 10459, 6: 24655, 7: 25201, 8: 19998, 9: 28260, 10: 31527, 11: 17372, 12: 19309, 13: 28000, 14: 35690, 15: 41965, 16: 46045, 17: 38018, 18: 49313, 19: 53208, 20: 67088, 21: 91245, 22: 72776, 23: 108624, 24: 100841, 25: 161812, 26: 132841, 27: 195646, 28: 269860, 29: 410510, 30: 497310, 31: 533616, 32: 803554, 33: 1383865, 34: 428173, 35: 361429} {2: 2431972, 4: 459, 5: 3889, 6: 13166, 7: 16436, 8: 13645, 9: 21440, 10: 23836, 11: 15029, 12: 15620, 13: 26229, 14: 33228, 15: 52169, 16: 43420, 17: 34364, 18: 46656, 19: 51027, 20: 68093, 21: 83317, 22: 72572, 23: 104837, 24: 98886, 25: 156210, 26: 147632, 27: 186062, 28: 271139, 29: 424292, 30: 483226, 31: 591186, 32: 777872, 33: 1449910, 34: 440001, 35: 373950} {2: 2610082, 4: 130, 5: 2411, 6: 10684, 7: 15184, 8: 13930, 9: 19662, 10: 25027, 11: 17042, 12: 17049, 13: 28469, 14: 37884, 15: 51898, 16: 55626, 17: 38944, 18: 54189, 19: 55710, 20: 76033, 21: 93826, 22: 84743, 23: 104122, 24: 107974, 25: 162956, 26: 154525, 27: 187022, 28: 280248, 29: 443651, 30: 490232, 31: 568073, 32: 779901, 33: 1364069, 34: 380046, 35: 343647} {2: 2805537, 4: 95, 5: 1286, 6: 7825, 7: 11227, 8: 11553, 9: 15424, 10: 20935, 11: 15249, 12: 15487, 13: 25097, 14: 35794, 15: 48407, 16: 54486, 17: 36942, 18: 51491, 19: 51175, 20: 73497, 21: 85740, 22: 85142, 23: 94958, 24: 105434, 25: 152448, 26: 147817, 27: 173093, 28: 268873, 29: 429310, 30: 494989, 31: 568400, 32: 787498, 33: 1327671, 34: 376432, 35: 325111} {2: 3132227, 4: 86, 5: 1358, 6: 8933, 7: 12751, 8: 11512, 9: 16810, 10: 19079, 11: 12106, 12: 15333, 13: 22810, 14: 29031, 15: 37483, 16: 35262, 17: 37867, 18: 43823, 19: 54525, 20: 64065, 21: 73927, 22: 79599, 23: 108316, 24: 98780, 25: 166303, 26: 108004, 27: 188804, 28: 281443, 29: 333809, 30: 506404, 31: 562649, 32: 677429, 33: 1272341, 34: 366851, 35: 318707} {2: 3175949, 4: 94, 5: 1620, 6: 9233, 7: 14850, 8: 11921, 9: 17911, 10: 22285, 11: 13568, 12: 15865, 13: 25852, 14: 30560, 15: 39059, 16: 44642, 17: 39815, 18: 50889, 19: 57168, 20: 71101, 21: 91568, 22: 83673, 23: 111675, 24: 110191, 25: 173330, 26: 127688, 27: 200868, 28: 285591, 29: 384235, 30: 503250, 31: 536007, 32: 701530, 33: 1128630, 34: 322028, 35: 269417} {2: 3227242, 4: 39, 5: 1404, 6: 9014, 7: 15466, 8: 13048, 9: 18684, 10: 24149, 11: 15383, 12: 16481, 13: 27662, 14: 31173, 15: 40393, 16: 49559, 17: 41503, 18: 55273, 19: 59188, 20: 74549, 21: 100378, 22: 85913, 23: 110007, 24: 112752, 25: 171957, 26: 137732, 27: 200651, 28: 285183, 29: 403598, 30: 500368, 31: 522979, 32: 696629, 33: 1046741, 34: 292326, 35: 244491} {2: 3019017, 4: 192, 5: 4415, 6: 15622, 7: 19879, 8: 18477, 9: 23653, 10: 29692, 11: 17575, 12: 18132, 13: 29119, 14: 31470, 15: 37586, 16: 52927, 17: 42328, 18: 57427, 19: 56679, 20: 72990, 21: 101194, 22: 84276, 23: 102117, 24: 109821, 25: 162848, 26: 134143, 27: 191672, 28: 272048, 29: 396577, 30: 487412, 31: 493238, 32: 681537, 33: 965710, 34: 269135, 35: 228323} {2: 3417984, 4: 14, 5: 1298, 6: 7674, 7: 11173, 8: 10956, 9: 14611, 10: 19268, 11: 12917, 12: 14401, 13: 23049, 14: 27110, 15: 38080, 16: 48332, 17: 39263, 18: 53500, 19: 52955, 20: 71254, 21: 91868, 22: 86468, 23: 96525, 24: 107372, 25: 155047, 26: 132965, 27: 178180, 28: 263056, 29: 387576, 30: 493589, 31: 503154, 32: 677932, 33: 953811, 34: 259915, 35: 222347} {2: 3857089, 4: 6, 5: 625, 6: 4371, 7: 7734, 8: 5496, 9: 9341, 10: 10267, 11: 5784, 12: 8955, 13: 14094, 14: 16841, 15: 25229, 16: 27479, 17: 30521, 18: 34379, 19: 47972, 20: 50559, 21: 68855, 22: 59823, 23: 103351, 24: 84966, 25: 153753, 26: 85403, 27: 184448, 28: 266447, 29: 289776, 30: 502072, 31: 522436, 32: 594464, 33: 1007449, 34: 273386, 35: 248271} {2: 3888898, 4: 8, 5: 584, 6: 4572, 7: 9684, 8: 6511, 9: 10559, 10: 12820, 11: 7155, 12: 8925, 13: 15786, 14: 16908, 15: 25036, 16: 33096, 17: 30964, 18: 38777, 19: 48136, 20: 54115, 21: 82317, 22: 61001, 23: 102524, 24: 91719, 25: 156118, 26: 104041, 27: 192176, 28: 266704, 29: 334161, 30: 489524, 31: 511652, 32: 597037, 33: 911533, 34: 239985, 35: 215400} {2: 3958006, 4: 1, 5: 571, 6: 4183, 7: 9225, 8: 6951, 9: 10496, 10: 12930, 11: 7714, 12: 8562, 13: 15567, 14: 14569, 15: 24537, 16: 35736, 17: 30243, 18: 40687, 19: 47827, 20: 54480, 21: 86981, 22: 60680, 23: 98166, 24: 92730, 25: 152847, 26: 113527, 27: 187523, 28: 261553, 29: 348854, 30: 477246, 31: 511559, 32: 582005, 33: 868946, 34: 223697, 35: 201576} {2: 4033674, 4: 11, 5: 546, 6: 3955, 7: 8007, 8: 6866, 9: 9628, 10: 12066, 11: 7374, 12: 8257, 13: 13765, 14: 13175, 15: 24790, 16: 39257, 17: 30934, 18: 43847, 19: 47941, 20: 57425, 21: 91959, 22: 63084, 23: 97902, 24: 95828, 25: 149752, 26: 116921, 27: 187082, 28: 258130, 29: 350069, 30: 474907, 31: 490124, 32: 575807, 33: 782235, 34: 207573, 35: 183631} {2: 4290844, 4: 1, 5: 125, 6: 1353, 7: 2714, 8: 2328, 9: 3477, 10: 4610, 11: 3170, 12: 4090, 13: 6791, 14: 7047, 15: 22234, 16: 36692, 17: 29244, 18: 41505, 19: 45105, 20: 53872, 21: 86118, 22: 63888, 23: 90141, 24: 93111, 25: 143387, 26: 112303, 27: 175492, 28: 246320, 29: 342752, 30: 472554, 31: 482912, 32: 558541, 33: 761186, 34: 182409, 35: 182697} {2: 4442611, 15: 78885, 16: 51676, 17: 65027, 18: 70856, 19: 89551, 20: 93559, 21: 77620, 22: 108365, 23: 130872, 24: 81807, 25: 182342, 26: 82366, 27: 153527, 28: 231227, 29: 220024, 30: 343564, 31: 394361, 32: 387910, 33: 667894, 34: 296870, 35: 163731} DiscoSnp-2.6.2/scripts/simulations/multiple_samples_simulator.sh000066400000000000000000000104731420021152700253120ustar00rootroot00000000000000#!/bin/bash #multiple_samples_simulator.sh # #Bash script to simulate sequencing data from a reference genome and following various divergence statistics # # # ############################################################################### # set default options ############################################################################### num_pop=1 num_sample=20 div_pop=0.015 #percentage of SNP shared by all samples from the same population perc_sha=70 #percentage of shared SNP by samples perc_spe=60 #percentage of homozygosity (1-x heterozygosity) perc_H=90 #read lenght read_l=150 #number of reads simulated read_s=876960 ############################################################################### # parse options ############################################################################### while getopts "g:p:s:d:p:n:o:l:x:h" OPTION; do case $OPTION in g) genome=${OPTARG} ;; p) num_pop=${OPTARG} ;; s) num_sample=${OPTARG} ;; d) div_pop=${OPTARG} ;; m) perc_sha=${OPTARG} ;; n) gperc_spe=${OPTARG} ;; o) perc_H=${OPTARG} ;; l) read_l=${OPTARG} ;; x) read_s=${OPTARG} ;; h) echo "Usage:" echo "" echo " -g fasta of the genome" echo " -p number of population to simulate" echo " -s number of sample by population to simulate" echo " -d population divergence from reference genome" echo " -m percentage of population specific polymorphism" echo " -n percentage of sample specific polymorphism" echo " -o percentage of homozygosity (1-x heterozygosity)" echo " -l read lenght" echo " -x number of reads simulated" #warning must be multiplied by 2 echo " -h help" exit 0 ;; esac done if [ -z ${genome} ] then echo "missing genome" exit 0 fi for p in `seq 1 $num_pop` do python ./random_mut_fasta.py $genome $div_pop > ERASEME_pos_mut_pop"$p" #pos random ordering sort -R ERASEME_pos_mut_pop"$p" > ERASEME_pos_mut_random_pop"$p" #nb all mut nb_line_all=`grep "." -c ERASEME_pos_mut_random_pop"$p"` #nb_mut_pop_specific nb_shared_all=`echo $(($nb_line_all/100*$perc_sha ))` head -n +"$nb_shared_all" ERASEME_pos_mut_random_pop"$p" > ERASEME_pos_mut_random_shared_allpop"$p" nb_spe=`echo $(($nb_shared_all+1 ))` tail -n +"$nb_spe" ERASEME_pos_mut_random_pop"$p" > ERASEME_pos_mut_random_to_separate_by_pop"$p" for i in `seq 1 $num_sample` do nb_line=`grep "." -c ERASEME_pos_mut_random_to_separate_by_pop"$p"` nb_shared=`echo $(($nb_line/100*$perc_spe ))` #selection rondomly 80% of the mutations for each of the 20 samples sort -R ERASEME_pos_mut_random_to_separate_by_pop"$p" | head -n +"$nb_shared" > ERASEME_pos_mut_random_shared_pop"$p"_s"$i" #homozygotes mutations cat ERASEME_pos_mut_random_shared_allpop"$p" ERASEME_pos_mut_random_shared_pop"$p"_s"$i" > ERASEME_pos_mut_random_spe_pop"$p"_and_s"$i" #mutation inducing python ./targeted_mut_fasta_corrected.py "$genome" ERASEME_pos_mut_random_spe_pop"$p"_and_s"$i" mv "$genome"_mut ERASEME_"$genome"_pop"$p"_s"$i"_withhetero.fasta #homozygote and heterozygote mutations nb_line2=`grep "." -c ERASEME_pos_mut_random_shared_pop"$p"_s"$i"` nb_homo=`echo $(($nb_line2/100*$perc_H ))` #homo mutations head -n +"$nb_homo" ERASEME_pos_mut_random_shared_pop"$p"_s"$i" > ERASEME_pos_mut_random_shared_pop"$p"_s"$i"_homo #population mutationq cat ERASEME_pos_mut_random_shared_allpop"$p" ERASEME_pos_mut_random_shared_pop"$p"_s"$i"_homo > ERASEME_pos_mut_random_spe_pop"$p"_and_s"$i"_homo python ./targeted_mut_fasta_corrected.py "$genome" ERASEME_pos_mut_random_spe_pop"$p"_and_s"$i"_homo mv "$genome"_mut ERASEME_"$genome"_pop"$p"_s"$i"_homo.fasta #READS SIMULATION mutareads_forward ERASEME_"$genome"_pop"$p"_s"$i"_withhetero.fasta pop"$p"_ind"$i"_allele1_err_reads $read_s $read_l 0.01 0 0 mutareads_forward ERASEME_"$genome"_pop"$p"_s"$i"_homo.fasta pop"$p"_ind"$i"_allele2_err_reads $read_s $read_l 0.01 0 0 cat pop"$p"_ind"$i"_allele{1..2}_err_reads.fasta > pop"$p"_ind"$i"_err_reads.fasta rm pop"$p"_ind"$i"_allele1_err_reads.fasta rm pop"$p"_ind"$i"_allele2_err_reads.fasta done done #ghost only position vcf creator cat ERASEME_pos_mut_random_shared_allpop* ERASEME_pos_mut_random_spe_pop*_and_s* | awk ' !x[$0]++' > only_position.vcf #clean rm ERASEME_* rm genome_mut.fasta rm genome_ref.fasta DiscoSnp-2.6.2/scripts/simulations/random_mut_fasta.py000066400000000000000000000046261420021152700232000ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # from Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from random import random, choice from Bio.Alphabet import IUPAC import sys # # Mute aléatoirement les bases d'une fichier fasta # selon la fréquence choisie # genère une copie mutée du fichier fasta réference # rend les positions des bases mutées # # def check_word(word): for l in word: if l != 'A' and l != 'C' and l!= 'G' and l!='T' and l != 'a' and l != 'c' and l!= 'g' and l!='t' : return False return True def random_mut(fasta_file, mutation_freq): sequences_ref = [] sequences_mut = [] for record in SeqIO.parse(fasta_file, "fasta"): #### recopie record dans un nouveau genome ref pour que le format soit IUPAC.ambiguousDNA comme la copie mutée... (pas bien) #### sequence_ref='' for base in record.seq: sequence_ref = sequence_ref + base record_ref=SeqRecord(Seq(sequence_ref, IUPAC.ambiguous_dna), record.id,'','') sequences_ref.append(record_ref) sequence_mut='' base_id = 0 ref = '' alt = '' #### genere record muté et print les bases mutées ######## for base in record.seq: base_id += 1 val = random() if val < mutation_freq: if check_word(base): #print(base) ref = base if base == base.upper(): base = choice([x for x in "ACTG" if x != base]) else: base = choice([x for x in "actg" if x != base]) alt = base print("{}\t{}\t{}\t{}".format(record.id, base_id, ref, alt)) sequence_mut = sequence_mut + base record_mut=SeqRecord(Seq(sequence_mut, IUPAC.ambiguous_dna), record.id,'','') sequences_mut.append(record_mut) SeqIO.write(sequences_ref, "genome_ref.fasta", "fasta") SeqIO.write(sequences_mut, "genome_mut.fasta", "fasta") def main(fasta_file, mutation_freq): random_mut(fasta_file, mutation_freq) if __name__ == "__main__": main(sys.argv[1], float(sys.argv[2])) DiscoSnp-2.6.2/scripts/simulations/targeted_mut_fasta_corrected.py000066400000000000000000000034601420021152700255440ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # import sys from Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from time import time def index_reference_mut(mut_file): index = {} filin = open(mut_file, 'r') while True: line = filin.readline() if not line: break if line.startswith("#") : continue chr = line.split("\t")[0].strip() pos = int(line.split("\t")[1]) ref = line.split("\t")[2].strip() alt = line.split("\t")[3].strip() if len(ref) == len(alt): if chr not in index: index[chr] = {} index[chr][pos] = {} index[chr][pos]["ref"] = ref index[chr][pos]["alt"] = alt #print(len(index[chr])) filin.close() return index def targeted_mut(fasta_file, index): genome = SeqIO.parse(fasta_file, "fasta") fasta_file_mut = ("{}_mut".format(fasta_file)) nb_mut = 0 sequences_mut = [] for record in genome: chr = record.id mutable_seq = record.seq.tomutable() #print(mutable_seq[0]) if chr in index: for pos in index[chr]: if mutable_seq[pos - 1] == index[chr][pos]["ref"]: mutable_seq[pos - 1] = index[chr][pos]["alt"] nb_mut += 1 record_mut=SeqRecord(mutable_seq, record.id,'','') sequences_mut.append(record_mut) SeqIO.write(sequences_mut, fasta_file_mut, "fasta") print("{} bases have been mutated".format(nb_mut)) def main(fasta_file, mutation_file): index = index_reference_mut(mutation_file) targeted_mut(fasta_file, index) if __name__ == "__main__": main(sys.argv[1], sys.argv[2]) DiscoSnp-2.6.2/scripts/split_multiple_snps.py000066400000000000000000000126461420021152700214200ustar00rootroot00000000000000import sys """ Given a discoSnp fasta file result, splits the bubbles into bubbles containing a unique SNP. Upper and lower case of each SNP is STRICTLY the same excepted at the variant position. Thus the phasing is lost here. This is a simplification needed for validation purposes Examples: >SNP_higher_path_701|P_1:30_C/T|high|nb_pol_1|left_unitig_length_226|right_unitig_length_164|left_contig_length_475|right_contig_length_1438|C1_31|C2_0|Q1_0|Q2_0|G1_0/0:6,98,624|G2_1/1:644,101,6|rank_1 taaaaatgaacatattaAGTACTCACAATTCATCTCTTCCCTGTCACCTGACTGCATCTGACTGCATACCACGTACACcag >SNP_lower_path_701|P_1:30_C/T|high|nb_pol_1|left_unitig_length_226|right_unitig_length_164|left_contig_length_475|right_contig_length_1438|C1_0|C2_32|Q1_0|Q2_0|G1_0/0:6,98,624|G2_1/1:644,101,6|rank_1 taaaaatgaacatattaAGTACTCACAATTCATCTCTTCCCTGTCACTTGACTGCATCTGACTGCATACCACGTACACcagg becomes: >SNP_higher_path_701_1|P_1:30_C/T AGTACTCACAATTCATCTCTTCCCTGTCACCTGACTGCATCTGACTGCATACCACGTACA >SNP_lower_path_701_1|P_1:30_C/T AGTACTCACAATTCATCTCTTCCCTGTCACTTGACTGCATCTGACTGCATACCACGTACA AND: >SNP_higher_path_711|P_1:30_T/G,P_2:32_G/C|high|nb_pol_2|left_unitig_length_18|right_unitig_length_61|left_contig_length_649|right_contig_length_203|C1_0|C2_40|Q1_0|Q2_0|G1_1/1:464,74,5|G2_0/0:6,125,804|rank_1 tcattcactcattcgctcactcattcactcattcattctttactcattcactcattcactcactcactgattcactcattcattcattcactcacacattcacttattcactcacttactcattcactcactcactcacgtccagggcctgcttggtgtccactgctgctgcaggcaactggcttcagttgggggaatgtatttctagtttacctttccctaaaggtgtggggtagggacgatggtcctctcctgagtctggcacagtgctgcagtctctgcccttgtgtacccgaaaacctgaaggtcaaggtcactgctgcaaccgatgccctgctgggaaagagaaagccttgggctgcctcagctttggcctccacagggtctctgcggtgcccttcagggcaccagagaaggtcctttcctgctacccaggctcccagtgcctgggctgagcctttgccccatccacccctcactgcctgtctcacgccggggcctttgcacccgccgatccctctgccgggagcaccctgctgcgcctccttgctccagagaagcctcccctgcccccacccccacccgtgagctgctccctgtgattttctgtggcaccacctgtgtcactatgcaggtcacagtaacagcaATGCGCTGGCCCCGTCCAGACTTCCTGTCTTTGGCTCCATAGGACGGTCCCCAGGAAGAAGAAccctgtctacccggcccagttcccccttctccagcaggcctgggacagagccagagcagataggcaaggctccgtccccaaactcattctgaggaaaccaccacagccatcctcctggggtcagcctggggcttttcccgggcatggcttatatccacagaaatgagaactgcgccaggcgcggtggctcacacctgtaatcc >SNP_lower_path_711|P_1:30_T/G,P_2:32_G/C|high|nb_pol_2|left_unitig_length_18|right_unitig_length_61|left_contig_length_649|right_contig_length_203|C1_23|C2_0|Q1_0|Q2_0|G1_1/1:464,74,5|G2_0/0:6,125,804|rank_1 tcattcactcattcgctcactcattcactcattcattctttactcattcactcattcactcactcactgattcactcattcattcattcactcacacattcacttattcactcacttactcattcactcactcactcacgtccagggcctgcttggtgtccactgctgctgcaggcaactggcttcagttgggggaatgtatttctagtttacctttccctaaaggtgtggggtagggacgatggtcctctcctgagtctggcacagtgctgcagtctctgcccttgtgtacccgaaaacctgaaggtcaaggtcactgctgcaaccgatgccctgctgggaaagagaaagccttgggctgcctcagctttggcctccacagggtctctgcggtgcccttcagggcaccagagaaggtcctttcctgctacccaggctcccagtgcctgggctgagcctttgccccatccacccctcactgcctgtctcacgccggggcctttgcacccgccgatccctctgccgggagcaccctgctgcgcctccttgctccagagaagcctcccctgcccccacccccacccgtgagctgctccctgtgattttctgtggcaccacctgtgtcactatgcaggtcacagtaacagcaATGCGCTGGCCCCGTCCAGACTTCCTGTCTGTCGCTCCATAGGACGGTCCCCAGGAAGAAGAAccctgtctacccggcccagttcccccttctccagcaggcctgggacagagccagagcagataggcaaggctccgtccccaaactcattctgaggaaaccaccacagccatcctcctggggtcagcctggggcttttcccgggcatggcttatatccacagaaatgagaactgcgccaggcgcggtggctcacacctgtaatcc becomes >SNP_higher_path_711_1|P_1:30_T/G ATGCGCTGGCCCCGTCCAGACTTCCTGTCTTTGGCTCCATAGGACGGTCCCCAGGAAGAAG >SNP_lower_path_711_1|P_1:30_T/G ATGCGCTGGCCCCGTCCAGACTTCCTGTCTGTGGCTCCATAGGACGGTCCCCAGGAAGAAG >SNP_higher_path_711_2|P_2:32_G/C GCGCTGGCCCCGTCCAGACTTCCTGTCTTTGGCTCCATAGGACGGTCCCCAGGAAGAAGAA >SNP_lower_path_711_2|P_2:32_G/C GCGCTGGCCCCGTCCAGACTTCCTGTCTTTCGCTCCATAGGACGGTCCCCAGGAAGAAGAA """ file = open(sys.argv[1]) def get_maj_seq(seq): """ returns the upper case letters from a sequence @seq """ res="" for l in seq: if l>='A' and l<='Z': res+=l return res delta=30 count=0 while True: com1=file.readline() if not com1: break count+=1 com1=com1.rstrip() #>SNP_higher_path_30|P_1:30_A/T,P_2:55_G/T|low|nb_pol_2|left_unitig_length_6|right_unitig_length_0 seq1=get_maj_seq(file.readline().rstrip()) com2=file.readline().rstrip() seq2=get_maj_seq(file.readline().rstrip()) str_nb_pol=com1.split('|')[3] assert str_nb_pol.startswith("nb_pol") nb_pol=int(com1.split('|')[3].split('_')[-1]) if com1.startswith(">INDEL"): print (com1) print (seq1) print (com2) print (seq2) continue all_pos_pol=com1.split('|')[1].split(',') splited_com1=com1.split('|') splited_com2=com2.split('|') for pol in range(nb_pol): pos_pol=int(all_pos_pol[pol].split(':')[1].split('_')[0]) alt_allele=all_pos_pol[pol].split(':')[1].split('_')[1].split('/')[1] subseq1=seq1[pos_pol-delta:pos_pol+delta+1] # get the upper case sequence, including the current variant and containing the sequence surrounding this variant subseq2=seq1[pos_pol-delta:pos_pol]+alt_allele+seq1[pos_pol+1:pos_pol+delta+1] # get the upper case sequence, including the current variant and containing the sequence from sequence1 containing this variant. subcom1=splited_com1[0]+'_'+str(pol+1)+'|'+all_pos_pol[pol] subcom2=splited_com2[0]+'_'+str(pol+1)+'|'+all_pos_pol[pol] print (subcom1) print (subseq1) print (subcom2) print (subseq2) DiscoSnp-2.6.2/scripts/validation_scripts/000077500000000000000000000000001420021152700206255ustar00rootroot00000000000000DiscoSnp-2.6.2/scripts/validation_scripts/compare_vcf_disco_pos_allele_only.py000066400000000000000000000226061420021152700301120ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # import sys import getopt # # compare SNP du génome simulé (argv[1] --> vcf de référence) # avec ceux d'un vcf DiscoSnp (arg[2]) # 1 prediction = chr_pos_allele_pair # output : argv[2].eval : tabulated file with two columns : id_snp TP/FP # def index_reference(ref_vcf): ##construit un index avec le vcf de ref, sour la forme : {"chr1" : {"54345677" : ["A_T","A_G"]}} ## gere les sites multi-alleliques ## alleles sortés SNP_index = {} info_index = {} # for each distinct chr_pos, stores the locus and the position in locus : usefull to compute recall as a function of locus position, key is "chr_pos" filin = open(ref_vcf, 'r') nb_total_SNP_pos = 0 # 1 SNP (vcf line) : 1 position nb_total_SNP_distinct_pos = 0 # count distinct positions : multi-allelic SNPs counted only once while True: line = filin.readline() if not line: break if line.startswith("#"): continue chr = line.split("\t")[0] pos = line.split("\t")[1] ref = line.split("\t")[3].upper() alt = line.split("\t")[4].upper() info = line.split("\t")[6] if ref1 : SNP_trouve = 0 XA_field = splitXA[1].split(";")[0] dict_multiple_pos = extract_multiple_pos(chr,pos,XA_field) for chr in dict_multiple_pos: if SNP_trouve: break if chr not in index: continue for pos_mult in dict_multiple_pos[chr]: if SNP_trouve: break # sort de la boucle sur les positions multiples if pos_mult in index[chr]: if len(index[chr][pos_mult])>1: # si multi-allelique compte comme TP sans checker les bases SNP_trouve = 1 nb_TP_precision += 1 filout.write("{0}\t{1}\n".format(id, "TP")) snp_found="{0}_{1}".format(chr, pos_mult) if snp_found not in dict_TP: dict_TP[snp_found]=1 nb_TP_recall += 1 elif bases == index[chr][pos_mult][0]: SNP_trouve = 1 nb_TP_precision += 1 filout.write("{0}\t{1}\n".format(id, "TP")) snp_found="{0}_{1}".format(chr, pos_mult) if snp_found not in dict_TP: dict_TP[snp_found]=1 nb_TP_recall += 1 if SNP_trouve == 0 : ##si aucun SNP n'a été associé aux différentes positions d'alignement, on compte en FP nb_FP += 1 filout.write("{0}\t{1}\n".format(id, "FP")) continue ##on passe à la ligne suivante ### cas des alignements uniques ou multiples sans champ XA ### if chr in index: #print("SNP sur chr indexé :" + chr + "_" + pos) if not pos in index[chr]: nb_FP += 1 filout.write("{0}\t{1}\n".format(id, "FP")) continue if len(index[chr][pos])>1: # si multi-allelique compte comme TP sans checker les bases nb_TP_precision += 1 filout.write("{0}\t{1}\n".format(id, "TP")) snp_found="{0}_{1}".format(chr, pos) if snp_found not in dict_TP: dict_TP[snp_found]=1 nb_TP_recall += 1 else: if bases == index[chr][pos][0]: nb_TP_precision += 1 filout.write("{0}\t{1}\n".format(id, "TP")) snp_found="{0}_{1}".format(chr, pos) if snp_found not in dict_TP: dict_TP[snp_found]=1 nb_TP_recall += 1 else: nb_FP += 1 filout.write("{0}\t{1}\n".format(id, "FP")) else: nb_FP += 1 filout.write("{0}\t{1}\n".format(id, "FP")) #print("SNP sur chr non indexé :" + chr + "_" + pos) filin.close() filout.close() return nb_TP_recall, nb_TP_precision, nb_FP, nb_total_prediction, dict_TP def main(ref,disco): index, nb_total_SNP_pos, nb_total_SNP_distinct_pos, info_index = index_reference(ref) nb_TP_recall, nb_TP_precision, nb_FP, nb_total_prediction, dict_TP = comp_disco_vcf(disco, index) ## Recall info : recall_file_name = disco+".recall" # WARNING : assuming loci of 150 nt !!!! nb_true_per_pos = [ 0 for i in range(150)] nb_found_per_pos = [ 0 for i in range(150)] filout = open(recall_file_name, 'w') for true_pos in info_index: pos_in_locus = int(info_index[true_pos].split(";")[1]) nb_true_per_pos[pos_in_locus-1] += 1 found = 0 if true_pos in dict_TP: found = 1 nb_found_per_pos[pos_in_locus-1] += 1 filout.write("{0}\t{1}\t{2}\n".format(true_pos,info_index[true_pos], found)) filout.close() stats_file_name = disco+".recall.stats" filout2 = open(stats_file_name, 'w') for i in range(len(nb_true_per_pos)): filout2.write("{0}\t{1}\t{2}\n".format(i+1,nb_true_per_pos[i],nb_found_per_pos[i])) filout2.close() #print(list_FP) #print(index) #print(nb_SNP_ref) #print(nb_TP) print("#############################################") print("#############################################") print("Precision/recall on position-allele only. All multiple predictions at the same position are counted \nPrecision pos_allele only: {0} %\nRecall pos_allele only: {1} %\nNb SNP_pos total : {2} \nNb SNP_distinct_pos total : {3} \nNb TP_rec : {4}\nNb TP_prec : {5}\nNb FP : {6}\nNb total predictions (vcf lines) : {7}".format((100*float(nb_TP_precision)/float((nb_TP_precision + nb_FP))), (100*float(nb_TP_recall)/float((nb_total_SNP_distinct_pos))), nb_total_SNP_pos, nb_total_SNP_distinct_pos, nb_TP_recall, nb_TP_precision, nb_FP, nb_total_prediction)) if __name__ == "__main__": main(sys.argv[1], sys.argv[2]) DiscoSnp-2.6.2/scripts/validation_scripts/eval_disco_one_snp_per_locus.py000066400000000000000000000165741420021152700271200ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # import sys import getopt # Calcule un recall locus-based : vcf disco filtré avec 1 SNP par cluster # recall-locus = # locus avec un VP / # locus reference # locus-dup = # locus de la ref qui sont présent au moins 2 fois dans le vcf disco # compare SNP du génome simulé (argv[1] --> vcf de référence) # avec ceux d'un vcf DiscoSnp (arg[2]) # 1 prediction = chr_pos_allele_pair, VP si pos et allele pair identique def index_reference(ref_vcf): ##construit un index avec le vcf de ref, sour la forme : {"chr3R" : {"12957641" : ["A_T","A_G"]}} + un index SNP_to_locus {"chr1_12957641" : "loci56681"} + un dico des locus {"loci56681" : 0} ## gere les sites multi-alleliques ## alleles sortés #chr3R 12957641 1 T A . loci56681;128 . ./. SNP_index = {} SNP_to_locus = {} # for each distinct chr_pos, stores the locus, key is "chr_pos" all_loci = {} filin = open(ref_vcf, 'r') nb_total_loci = 0 while True: line = filin.readline() if not line: break if line.startswith("#"): continue chr = line.split("\t")[0] pos = line.split("\t")[1] ref = line.split("\t")[3].upper() alt = line.split("\t")[4].upper() locus = line.split("\t")[6].split(";")[0] if ref1 : SNP_trouve = 0 XA_field = splitXA[1].split(";")[0] dict_multiple_pos = extract_multiple_pos(chr,pos,XA_field) for chr in dict_multiple_pos: if SNP_trouve: break if chr not in index: continue for pos_mult in dict_multiple_pos[chr]: if SNP_trouve: break # sort de la boucle sur les positions multiples if pos_mult in index[chr]: if len(index[chr][pos_mult])>1 or bases == index[chr][pos_mult][0]: # si multi-allelique compte comme TP sans checker les bases SNP_trouve = 1 snp_found="{0}_{1}".format(chr, pos_mult) locus_found = SNP_to_locus[snp_found] if all_loci[locus_found] == 0: nb_locus_recall +=1 all_loci[locus_found] = 1 elif all_loci[locus_found] == 1: nb_locus_duplicated += 1 all_loci[locus_found] = 2 continue ##on passe à la ligne suivante ### cas des alignements uniques ou multiples sans champ XA ### if chr in index: #print("SNP sur chr indexé :" + chr + "_" + pos) if not pos in index[chr]: continue if len(index[chr][pos])>1 or bases == index[chr][pos][0]: # si multi-allelique compte comme TP sans checker les bases snp_found="{0}_{1}".format(chr, pos) locus_found = SNP_to_locus[snp_found] if all_loci[locus_found] == 0: nb_locus_recall +=1 all_loci[locus_found] = 1 elif all_loci[locus_found] == 1: nb_locus_duplicated += 1 all_loci[locus_found] = 2 filin.close() return nb_locus_recall, nb_locus_duplicated def main(ref,disco): index, SNP_to_locus, all_loci, nb_total_loci = index_reference(ref) #print("indexing done\n") nb_locus_recall, nb_locus_duplicated = comp_disco_vcf(disco, index, SNP_to_locus, all_loci) locus_recall = 100*float(nb_locus_recall)/float(nb_total_loci) duplicated_ratio1 = 100*float(nb_locus_duplicated)/float(nb_total_loci) duplicated_ratio2 = 100*float(nb_locus_duplicated)/float(nb_locus_recall) print("#############################################") print("#############################################") print("Locus Recall on position-allele only. (All multiple predictions at the same position are counted)") print(f"Total nb of loci (true vcf) : {nb_total_loci}") print(f"Nb loci with a TP SNP : {nb_locus_recall}") print(f"Nb duplicated loci (with 2 or more TP SNPs) : {nb_locus_duplicated}") print(f"Locus recall : {locus_recall:.2f}") print(f"Locus duplication ratio (over all loci) : {duplicated_ratio1:.2f}") print(f"Locus duplication ratio (over found loci) : {duplicated_ratio2:.2f}") if __name__ == "__main__": main(sys.argv[1], sys.argv[2]) DiscoSnp-2.6.2/scripts/vcf_formatting_functions.py000077500000000000000000000167121420021152700224100ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ''' *********************************************** Functions to format discoSnp raw output file (.fa) into a vcf format file (.vcf) (ghost vcf) Author - Claire Lemaitre Used by create_filtered_vcf.py and fasta_and_cluster_to_filtered_vcf.py *********************************************** ''' import re def vcf_header(source, date, fasta_file, nb_samples): ''' Returns the first lines of the vcf file, composed of the COMMENTS and the HEADER source: the name of the python program that writes this vcf date: the date to appear in the vcf file fasta_file: the input fasta file nb_samples: the nb of samples ''' VCF_COMMENTS = f'''##fileformat=VCFv4.1 ##filedate={date} ##source={source} ##SAMPLE=file://{fasta_file} ##REF= ##FILTER= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT=''' HEADER = "\t".join(["#CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO", "FORMAT"]+["G"+str(i+1) for i in range(nb_samples)]) header_str = VCF_COMMENTS + "\n" + HEADER + "\n" return header_str def format_vcf(splitted_1, splitted_2, nb_samples, rank, sequence, cluster_id, cluster_size, tig_type = 0): ''' Format information extracted from the fasta headers of a single bubble into one or several vcf lines splitted_1: a list of values contained in the higher path fasta header (splitted by "|") splitted_2: idem of lower path nb_samples: nb of samples rank: rank of the variant sequence : DNA sequence of the lower path : usefull for INDELs (longest sequnce) cluster_id: cluster_id, if not clustered "." cluster_size: size of the cluster, if not clustered "." tig_type : 0 no extension, 1 unitig, 2 contig (ie. unitig and contig length are present) ''' ''' >SNP_higher_path_1487|P_1:30_A/G|low|nb_pol_1|left_unitig_length_ SNP_higher_path_1487 34 1487 A G . . Ty=SNP;Rk=0.00072476;UL=4;UR=60;CL=.;CR=.;Genome=.;Sd=.;Cluster=.;ClSize=. GT:DP:PL:AD:HQ 0/1:53:194,32,613:37,16:71,71 0/1:83:296,44,955:58,25:71,71 ''' ''' INDEL : >INDEL_higher_path_3205|P_1:30_27_3|high|nb_pol_1|left_unitig_length_14|right_unitig_length_6|C1_14|C2_17|Q1_71|Q2_71|G1_0/1:243,13,203|G2_0/1:268,13,248|rank_0.019011 aaggcagcggccagTCCAGGATGTCCAAGAATTCAACCAATTCGAACAATTCTAAAGGATCGTTTAATTCAagcggc >INDEL_lower_path_3205|P_1:30_27_3|high|nb_pol_1|left_unitig_length_14|right_unitig_length_6|C1_16|C2_18|Q1_71|Q2_71|G1_0/1:243,13,203|G2_0/1:268,13,248|rank_0.019011 aaggcagcggccagTCCAGGATGTCCAAGAATTCAACCAATTCG GGACAGTCCAGATAGTCGTATAACTCG AACAATTCTAAAGGATCGTTTAATTCAagcggc aaggcagcggccagTCCAGGATGTCCAAGAATTCAACCAAT TCGGGACAGTCCAGATAGTCGTATAAC TCGAACAATTCTAAAGGATCGTTTAATTCAagcggc INDEL_higher_path_3205 41 3205 T TTCGGGACAGTCCAGATAGTCGTATAAC . . Ty=INS;Rk=0.019011;UL=14;UR=6;CL=.;CR=.;Genome=.;Sd=.;Cluster=.;ClSize=. GT:DP:PL:AD:HQ 0/1:30:243,13,203:14,16:71,71 0/1:35:268,13,248:17,18:71,71 POS = UL + POS : 1-based (note: no longer left-normalized) ''' FORMAT = "GT:DP:PL:AD:HQ" nb_fixed_fields = 4 + 2*tig_type vcf_line = "" nb_pol = int(splitted_1[3].split("nb_pol_")[1]) path_name = splitted_1[0].lstrip(">") CHROM = path_name id = path_name.split("_")[3] ty = re.findall("(\w+)_higher_path",path_name)[0] if ty != "SNP": ty = "INS" INFO = f"Ty={ty};Rk={rank};" position_offset = 0 if tig_type >0: unitig_len = re.findall("_unitig_length_(\d+)","|".join(splitted_1[4:6])) position_offset = int(unitig_len[0]) INFO += f"UL={unitig_len[0]};UR={unitig_len[1]};"; if tig_type == 2: contig_len = re.findall("_contig_length_(\d+)","|".join(splitted_1[6:8])) position_offset = int(contig_len[0]) # if contig POS = POS + left_contig_len INFO += f"CL={contig_len[0]};CR={contig_len[1]};" else: INFO += "CL=.;CR=.;" else: INFO += "UL=.;UR=.;CL=.;CR=.;" INFO += f"Genome=.;Sd=.;Cluster={cluster_id};ClSize={cluster_size}" # Genotype info (same for all polymorphisms) GENO = "" for indiv in range(nb_samples): ad_1 = splitted_1[nb_fixed_fields + indiv].split("_")[1] ad_2 = splitted_2[nb_fixed_fields + indiv].split("_")[1] dp = int(ad_1) + int(ad_2) qual_1 = splitted_1[nb_fixed_fields + nb_samples + indiv].split("_")[1] qual_2 = splitted_2[nb_fixed_fields + nb_samples + indiv].split("_")[1] #necessary : is qual_2 always == qual_1 ??? geno_fields = splitted_1[nb_fixed_fields + 2*nb_samples + indiv].split("_")[1].split(":") genotype = geno_fields[0] likelihood = geno_fields[1] GENO += "\t" + ":".join([genotype,str(dp),likelihood,",".join([ad_1,ad_2]),",".join([qual_1,qual_2])]) GENO = GENO.strip() cigar = splitted_1[1].split(",") isolated = False if len(cigar) == 1: isolated = True i = 1 for pol in cigar: if ty == "SNP": POS, REF, ALT = re.findall("P_\d+:(\d+)_(\w)/(\w)",pol)[0] POS = int(POS) + position_offset # POS is 1-based else: # INDEL POS, indel_size = re.findall("P_\d+:(\d+)_(\d+)",pol)[0] POS = int(POS) + position_offset # 1-based ALT = sequence[(POS-1):(POS+int(indel_size))] REF = ALT[0] ID = id if not isolated: ID += f"_{i}" my_line = "\t".join([CHROM, str(POS), ID, REF, ALT, ".", ".", INFO, FORMAT, GENO]) vcf_line += my_line + "\n" i += 1 return vcf_line DiscoSnp-2.6.2/scripts/zero2one.py000066400000000000000000000044671420021152700170540ustar00rootroot00000000000000import argparse import fileinput def zero2one(input_vcf_file_name: str): with fileinput.FileInput(input_vcf_file_name, inplace = True) as vcf_file: for vcf_line in vcf_file: if vcf_line[0] == "#": print(vcf_line, end='') continue # From #121_cassette_SSV9_CAG-eGFP-ISce-PASV40 3163 8622 A C . MULTIPLE Ty=SNP;Rk=8.0508e-05;UL=0;UR=0;CL=0;CR=0;Genome=A;Sd=1;XA=121_cassette_SSV9_CAG-eGFP-ISce-PASV40_17,121_cassette_SSV9_CAG-eGFP-ISce-PASV40_3081,121_cassette_SSV9_CAG-eGFP-ISce-PASV40_79 GT:DP:PL:AD:HQ ./.:2:.,.,.:2,0:0,0 0/0:291967:8727,869383,5824307:291691,276:71,48 # To #121_cassette_SSV9_CAG-eGFP-ISce-PASV40 3163 8622 A C . MULTIPLE Ty=SNP;Rk=8.0508e-05;UL=0;UR=0;CL=0;CR=0;Genome=A;Sd=1;XA=121_cassette_SSV9_CAG-eGFP-ISce-PASV40_18,121_cassette_SSV9_CAG-eGFP-ISce-PASV40_3082,121_cassette_SSV9_CAG-eGFP-ISce-PASV40_80 GT:DP:PL:AD:HQ ./.:2:.,.,.:2,0:0,0 0/0:291967:8727,869383,5824307:291691,276:71,48 vcf_line = vcf_line.strip().split() new_POS = int(vcf_line[1]) + 1 ID_REF_ALT_QUAL_FILTER = '\t'.join(vcf_line[2:7]) INFO = vcf_line[7] # zero to one for XA positions s_INFO = INFO.split(';') if s_INFO[-1].startswith("XA="): XA="XA=" all_XAs = s_INFO[-1].split("=")[-1].split(',') for current_XA in all_XAs: pos = int(current_XA.split("_")[-1]) + 1 XA += "_".join(current_XA.split("_")[:-1])+"_"+str(pos)+"," XA = XA[:-1] # remove additional ',' INFO = ';'.join(s_INFO[:-1]) + ";" + XA end_line = '\t'.join(vcf_line[8:]) new_vcf_line = f"{vcf_line[0]}\t{new_POS}\t{ID_REF_ALT_QUAL_FILTER}\t{INFO}\t{end_line}" print(new_vcf_line) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("-i", help="name of input zero-based vcf file (will be overwritten!)", dest='input_vcf_file', type=str, required=True) args = parser.parse_args() zero2one(args.input_vcf_file) print(f"Transformed zero-based {args.input_vcf_file} to one-based") DiscoSnp-2.6.2/test/000077500000000000000000000000001420021152700142145ustar00rootroot00000000000000DiscoSnp-2.6.2/test/fof.txt000066400000000000000000000000621420021152700155250ustar00rootroot00000000000000reads_sequence1.fasta.gz reads_sequence2.fasta.gz DiscoSnp-2.6.2/test/large_test/000077500000000000000000000000001420021152700163455ustar00rootroot00000000000000DiscoSnp-2.6.2/test/large_test/fof_rad.txt000066400000000000000000000046001420021152700205060ustar00rootroot00000000000000HDF   `TREEHEAPXmetadata@HhTREE8HEAPXinfobyte@SNOD Hh.ZSNOD(DiscoSnp-2.6.2/test/large_test/fof_rad_indel.txt000066400000000000000000000000471420021152700216620ustar00rootroot00000000000000./rad_option_test/loci_reads_one_indel DiscoSnp-2.6.2/test/large_test/generate_refs.sh000066400000000000000000000054151420021152700215170ustar00rootroot00000000000000 ##################### # Default option run: ##################### ../../run_discoSnp++.sh -r fof.txt -T -P 1 if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** discoSnp failure" exit 1 fi mv discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa mv discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf ###################################################### # With reference run (using previously created graph): ###################################################### ../../run_discoSnp++.sh -r fof.txt -T -G humch1_first_5M.fasta -g discoRes_k_31_c_3.h5 -P 1 if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** discoSnp failure" exit 1 fi mv discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf mv discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf ##################### # CLOSE SNPS option run: ##################### ../../run_discoSnp++.sh -r fof.txt -T -P 10 if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** discoSnp failure" exit 1 fi mv discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa mv discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf ###################################################### # With reference run (using previously created graph): ###################################################### ../../run_discoSnp++.sh -r fof.txt -T -G humch1_first_5M.fasta -g discoRes_k_31_c_3.h5 -P 10 if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** discoSnp failure" exit 1 fi mv discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf mv discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf # create archive zip -r data_test_disco.zip humch1_00096_reads.fasta.gz humch1_00100_reads.fasta.gz humch1_first_5M.fasta ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf #(update #Mettre sur bioinformatique #OLD: scp data_test_disco.zip ppeterlo@scm.gforge.inria.fr:/home/groups/gatb-discosnp/htdocs) DiscoSnp-2.6.2/test/large_test/large_test.sh000066400000000000000000000006011420021152700210270ustar00rootroot00000000000000# Get and decompress the data rm -f data_test_disco.zip wget http://bioinformatique.rennes.inria.fr/disco_tests/data_test_disco.zip # wget http://gatb-discosnp.gforge.inria.fr/data_test_disco.zip # create: sh generate_refs.sh unzip data_test_disco.zip sh local_large_test.sh rm -f created ref discoRes* rm -f data_test_disco.zip # rm -f humch1_* # rm -f fof.txt # rm -f ref* DiscoSnp-2.6.2/test/large_test/local_large_test.sh000066400000000000000000000215631420021152700222130ustar00rootroot00000000000000 # Create the file of file: ls humch1_00* > fof.txt ##################### # Default option run: ##################### ../../run_discoSnp++.sh -r fof.txt -T -P 1 if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** discoSnp failure" exit 1 fi # Test the .fa # The sequence ids and orders are not conserved due to parallelisation. This explains why we separate sequences from headers and why we remove ids grep -v ">" ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa | sort > ref grep -v ">" discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa | sort > created diff ref created if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** Test: FAILURE on diff sequences of .fa" exit 1 fi grep ">" ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa |cut -d "|" -f 2- | sort > ref grep ">" discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa |cut -d "|" -f 2- | sort > created diff ref created if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** Test: FAILURE on diff headers of .fa" exit 1 fi # Test the .vcf headers grep "^#" ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** Test: FAILURE on diff headers of .vcf" exit 1 fi # Test the .vcf content awk '!/#/' ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | cut -f 2,4- | sort > ref awk '!/#/' discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | cut -f 2,4- | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** Default option FAILURE:" echo "*** Test: FAILURE on diff content of .vcf" exit 1 fi ###################################################### # With reference run (using previously created graph): ###################################################### ../../run_discoSnp++.sh -r fof.txt -T -G humch1_first_5M.fasta -g discoRes_k_31_c_3.h5 -P 1 if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** discoSnp failure" exit 1 fi # Test the .vcf headers grep "^#" ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** Test: FAILURE on diff headers of .vcf" exit 1 fi # Test the .vcf content awk '!/#/' ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | cut -f 2,4- | grep -v "MULTIPLE" |sort > ref # MULTIPLE are not deterministics awk '!/#/' discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** Test: FAILURE on diff content of .vcf" exit 1 fi # Test the for IGV .vcf headers grep "^#" ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** Test: FAILURE on diff headers of for IGV .vcf" exit 1 fi # Test the for IGV .vcf content awk '!/#/' ref_with_mapping_discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > ref awk '!/#/' discoRes_k_31_c_3_D_100_P_1_b_0_coherent_for_IGV.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** With mapping on ref FAILURE:" echo "*** Test: FAILURE on diff content of for IGV .vcf" exit 1 fi ##################### # CLOSE SNPS option run: ##################### ../../run_discoSnp++.sh -r fof.txt -T -P 10 if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** discoSnp failure" exit 1 fi # Test the .fa # The sequence ids and orders are not conserved due to parallelisation. This explains why we separate sequences from headers and why we remove ids grep -v ">" ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa | sort > ref grep -v ">" discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa | sort > created diff ref created if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** Test: FAILURE on diff sequences of .fa" exit 1 fi grep ">" ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa |cut -d "|" -f 2- | sort > ref grep ">" discoRes_k_31_c_3_D_100_P_10_b_0_coherent.fa |cut -d "|" -f 2- | sort > created diff ref created if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** Test: FAILURE on diff headers of .fa" exit 1 fi # Test the .vcf headers grep "^#" ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** Test: FAILURE on diff headers of .vcf" exit 1 fi # Test the .vcf content awk '!/#/' ref_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | cut -f 2,4- | sort > ref awk '!/#/' discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | cut -f 2,4- | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS FAILURE:" echo "*** Test: FAILURE on diff content of .vcf" exit 1 fi ###################################################### # With reference run (using previously created graph): ###################################################### ../../run_discoSnp++.sh -r fof.txt -T -G humch1_first_5M.fasta -g discoRes_k_31_c_3.h5 -P 10 if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** discoSnp failure" exit 1 fi # Test the .vcf headers grep "^#" ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** Test: FAILURE on diff headers of .vcf" exit 1 fi # Test the .vcf content awk '!/#/' ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > ref awk '!/#/' discoRes_k_31_c_3_D_100_P_10_b_0_coherent.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** Test: FAILURE on diff content of .vcf" exit 1 fi # Test the for IGV .vcf headers grep "^#" ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf | grep -v filedate > ref grep "^#" discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf | grep -v filedate > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** Test: FAILURE on diff headers of for IGV .vcf" exit 1 fi # Test the for IGV .vcf content awk '!/#/' ref_with_mapping_discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > ref awk '!/#/' discoRes_k_31_c_3_D_100_P_10_b_0_coherent_for_IGV.vcf | cut -f 2,4- | grep -v "MULTIPLE" | sort > created diff created ref if [ $? -ne 0 ] ; then echo "*** With close SNPS and mapping on ref FAILURE:" echo "*** Test: FAILURE on diff content of for IGV .vcf" exit 1 fi ###################################################### # test the radseq option (-x) # ###################################################### # ../../run_discoSnpRad.sh -r fof_rad.txt -k 31 -b 2 -D 0 -P 4 -p radtest # # if [ $? -ne 0 ] ; then # echo "*** With truncated bubbles FAILURE:" # echo "*** discoSnp failure" # exit 1 # fi # # # Test the .fa # # The sequence ids and orders are not conserved due to parallelisation. This explains why we separate sequences from headers and why we remove ids # grep -v ">" rad_option_test/radref_k_31_c_3_D_0_P_4_b_2_coherent.fa | sort -n > radref # grep -v ">" radtest_k_31_c_3_D_0_P_4_b_2_coherent.fa | sort -n > radtest # diff radref radtest # if [ $? -ne 0 ] ; then # echo "*** With truncated bubbles FAILURE:" # echo "*** Test: FAILURE on diff sequences of .fa" # exit 1 # fi # # grep ">" rad_option_test/radref_k_31_c_3_D_0_P_4_b_2_coherent.fa |cut -d "|" -f 2- | sort -n > radref # grep ">" radtest_k_31_c_3_D_0_P_4_b_2_coherent.fa |cut -d "|" -f 2- | sort -n > radtest # diff radref radtest # if [ $? -ne 0 ] ; then # echo "*** With truncated bubbles FAILURE:" # echo "*** Test: FAILURE on diff headers of .fa" # exit 1 # fi # # rm radref radtest* echo "****************************" echo "***** ALL TESTS PASSED *****" echo "****************************" DiscoSnp-2.6.2/test/large_test/rad_option_test/000077500000000000000000000000001420021152700215425ustar00rootroot00000000000000fof_rad.txt_radtest_k_31_c_auto_D_0_P_4_b_2_removemeplease000066400000000000000000000000151420021152700345140ustar00rootroot00000000000000DiscoSnp-2.6.2/test/large_test/rad_option_test./loci_reads DiscoSnp-2.6.2/test/large_test/rad_option_test/loci_reads000066400000000000000000003273101420021152700235770ustar00rootroot00000000000000>read0_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read1_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read2_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read3_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read4_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read5_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read6_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read7_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read8_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read9_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read10_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read11_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read12_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read13_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read14_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read15_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read16_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read17_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read18_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read19_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read20_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read21_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read22_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read23_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read24_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read25_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read26_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read27_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read28_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read29_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read30_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read31_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read32_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read33_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read34_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read35_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read36_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read37_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read38_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read39_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read40_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read41_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read42_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read43_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read44_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read45_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read46_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read47_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read48_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read49_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read50_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read51_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read52_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read53_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read54_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read55_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read56_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read57_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read58_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read59_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read60_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read61_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read62_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read63_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read64_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read65_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read66_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read67_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read68_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read69_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read70_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read71_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read72_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read73_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read74_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read75_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read76_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read77_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read78_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read79_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read80_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read81_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read82_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read83_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read84_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read85_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read86_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read87_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read88_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read89_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read90_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read91_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read92_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read93_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read94_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read95_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read96_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read97_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read98_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read99_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read100_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read101_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read102_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read103_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read104_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read105_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read106_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read107_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read108_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read109_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read110_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read111_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read112_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read113_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read114_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read115_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read116_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read117_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read118_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read119_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read120_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read121_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read122_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read123_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read124_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read125_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read126_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read127_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read128_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read129_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read130_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read131_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read132_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read133_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read134_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read135_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read136_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read137_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read138_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read139_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read140_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read141_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read142_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read143_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read144_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read145_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read146_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read147_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read148_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read149_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read150_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read151_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read152_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read153_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read154_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read155_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read156_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read157_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read158_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read159_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read160_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read161_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read162_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read163_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read164_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read165_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read166_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read167_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read168_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read169_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read170_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read171_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read172_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read173_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read174_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read175_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read176_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read177_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read178_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read179_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read180_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read181_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read182_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read183_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read184_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read185_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read186_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read187_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read188_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read189_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read190_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read191_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read192_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read193_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read194_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read195_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read196_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read197_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read198_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read199_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read200_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read201_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read202_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read203_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read204_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read205_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read206_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read207_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read208_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read209_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read210_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read211_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read212_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read213_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read214_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read215_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read216_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read217_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read218_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read219_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read220_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read221_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read222_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read223_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read224_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read225_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read226_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read227_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read228_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read229_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read230_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read231_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read232_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read233_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read234_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read235_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read236_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read237_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read238_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read239_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read240_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read241_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read242_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read243_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read244_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read245_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read246_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read247_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read248_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read249_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read0_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read1_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read2_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read3_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read4_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read5_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read6_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read7_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read8_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read9_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read10_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read11_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read12_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read13_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read14_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read15_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read16_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read17_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read18_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read19_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read20_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read21_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read22_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read23_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read24_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read25_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read26_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read27_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read28_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read29_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read30_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read31_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read32_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read33_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read34_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read35_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read36_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read37_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read38_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read39_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read40_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read41_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read42_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read43_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read44_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read45_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read46_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read47_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read48_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read49_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read50_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read51_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read52_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read53_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read54_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read55_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read56_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read57_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read58_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read59_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read60_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read61_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read62_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read63_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read64_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read65_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read66_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read67_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read68_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read69_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read70_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read71_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read72_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read73_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read74_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read75_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read76_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read77_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read78_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read79_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read80_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read81_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read82_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read83_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read84_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read85_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read86_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read87_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read88_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read89_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read90_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read91_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read92_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read93_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read94_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read95_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read96_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read97_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read98_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read99_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read100_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read101_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read102_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read103_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read104_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read105_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read106_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read107_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read108_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read109_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read110_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read111_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read112_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read113_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read114_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read115_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read116_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read117_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read118_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read119_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read120_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read121_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read122_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read123_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read124_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read125_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read126_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read127_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read128_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read129_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read130_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read131_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read132_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read133_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read134_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read135_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read136_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read137_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read138_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read139_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read140_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read141_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read142_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read143_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read144_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read145_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read146_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read147_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read148_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read149_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read150_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read151_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read152_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read153_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read154_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read155_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read156_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read157_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read158_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read159_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read160_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read161_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read162_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read163_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read164_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read165_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read166_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read167_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read168_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read169_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read170_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read171_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read172_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read173_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read174_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read175_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read176_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read177_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read178_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read179_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read180_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read181_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read182_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read183_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read184_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read185_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read186_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read187_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read188_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read189_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read190_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read191_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read192_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read193_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read194_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read195_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read196_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read197_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read198_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read199_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read200_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read201_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read202_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read203_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read204_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read205_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read206_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read207_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read208_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read209_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read210_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read211_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read212_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read213_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read214_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read215_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read216_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read217_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read218_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read219_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read220_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read221_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read222_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read223_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read224_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read225_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read226_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read227_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read228_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read229_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read230_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read231_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read232_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read233_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read234_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read235_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read236_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read237_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read238_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read239_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read240_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >read241_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read242_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read243_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read244_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read245_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read246_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read247_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read248_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read249_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA DiscoSnp-2.6.2/test/large_test/rad_option_test/loci_reads_one_indel000066400000000000000000003273101420021152700256130ustar00rootroot00000000000000>read0_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read1_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read2_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read3_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read4_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read5_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read6_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read7_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read8_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read9_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read10_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read11_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read12_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read13_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read14_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read15_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read16_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read17_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read18_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read19_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read20_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read21_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read22_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read23_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read24_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read25_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read26_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read27_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read28_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read29_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read30_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read31_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read32_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read33_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read34_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read35_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read36_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read37_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read38_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read39_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read40_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read41_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read42_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read43_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read44_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read45_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read46_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read47_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read48_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read49_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read50_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read51_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read52_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read53_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read54_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read55_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read56_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read57_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read58_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read59_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read60_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read61_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read62_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read63_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read64_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read65_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read66_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read67_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read68_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read69_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read70_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read71_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read72_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read73_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read74_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read75_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read76_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read77_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read78_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read79_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read80_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read81_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read82_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read83_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read84_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read85_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read86_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read87_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read88_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read89_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read90_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read91_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read92_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read93_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read94_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read95_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read96_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read97_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read98_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read99_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read100_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read101_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read102_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read103_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read104_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read105_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read106_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read107_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read108_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read109_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read110_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read111_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read112_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read113_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read114_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read115_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read116_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read117_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read118_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read119_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read120_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read121_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read122_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read123_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read124_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read125_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read126_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read127_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read128_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read129_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read130_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read131_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read132_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read133_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read134_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read135_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read136_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read137_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read138_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read139_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read140_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read141_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read142_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read143_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read144_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read145_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read146_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read147_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read148_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read149_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read150_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read151_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read152_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read153_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read154_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read155_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read156_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read157_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read158_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read159_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read160_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read161_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read162_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read163_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read164_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read165_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read166_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read167_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read168_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read169_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read170_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read171_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read172_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read173_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read174_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read175_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read176_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read177_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read178_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read179_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read180_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read181_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read182_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read183_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read184_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read185_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read186_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read187_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read188_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read189_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read190_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read191_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read192_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read193_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read194_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read195_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read196_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read197_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read198_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read199_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read200_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read201_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read202_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read203_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read204_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read205_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read206_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read207_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read208_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read209_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read210_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read211_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read212_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read213_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read214_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read215_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read216_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read217_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read218_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read219_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read220_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read221_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read222_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read223_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read224_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read225_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read226_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read227_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACACCTAATCCCTTCGCTGGACATATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >read228_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read229_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read230_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read231_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read232_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read233_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read234_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read235_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TCCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >read236_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACGGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read237_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read238_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read239_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read240_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 GTCGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTTCCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >read241_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read242_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read243_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read244_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read245_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read246_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read247_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read248_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCGGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGCGATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read249_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTTCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCGCTCCGCATAGGTCATCATACGAACAGCCGCGATAGGA >read0_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read1_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read2_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read3_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read4_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read5_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read6_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read7_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read8_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read9_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read10_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read11_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read12_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read13_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read14_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read15_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read16_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read17_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read18_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read19_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read20_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read21_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read22_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read23_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read24_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read25_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read26_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read27_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read28_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read29_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read30_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read31_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read32_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read33_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read34_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read35_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read36_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read37_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read38_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read39_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read40_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read41_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read42_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read43_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read44_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read45_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read46_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read47_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read48_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read49_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read50_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read51_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read52_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read53_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read54_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read55_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read56_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read57_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read58_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read59_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read60_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read61_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read62_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read63_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read64_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read65_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read66_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read67_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read68_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read69_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read70_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read71_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read72_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read73_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read74_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read75_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read76_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read77_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read78_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read79_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read80_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read81_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read82_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read83_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read84_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read85_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read86_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read87_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read88_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read89_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read90_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read91_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read92_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read93_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read94_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read95_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read96_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read97_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read98_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read99_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read100_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read101_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read102_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read103_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read104_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read105_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read106_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read107_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read108_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read109_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read110_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read111_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read112_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read113_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read114_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read115_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read116_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read117_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read118_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read119_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read120_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read121_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read122_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read123_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read124_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read125_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read126_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read127_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read128_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read129_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read130_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read131_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read132_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read133_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read134_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read135_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read136_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read137_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read138_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read139_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read140_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read141_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read142_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read143_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read144_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read145_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read146_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read147_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read148_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read149_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read150_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read151_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read152_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read153_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read154_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read155_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read156_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read157_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read158_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read159_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read160_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read161_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read162_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read163_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read164_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read165_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read166_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read167_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read168_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read169_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read170_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read171_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read172_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read173_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read174_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read175_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read176_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read177_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read178_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read179_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read180_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read181_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read182_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read183_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read184_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read185_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read186_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read187_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read188_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read189_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read190_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read191_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read192_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read193_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read194_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read195_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read196_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read197_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read198_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read199_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read200_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read201_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read202_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read203_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read204_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read205_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read206_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read207_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read208_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read209_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read210_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read211_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read212_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read213_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read214_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read215_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read216_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read217_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read218_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read219_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read220_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read221_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read222_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read223_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read224_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read225_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read226_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read227_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 ACTACTTTGTTGTCCGCTCCAGGCAGGAATTAGGGCCCTAACGACAGCTAATCCCTTCGCTGGACGTATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >read228_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read229_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read230_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA >read231_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read232_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read233_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read234_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read235_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 TTCTATCGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCACGCGACCTCTGTAATAGGGCTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >read236_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCCCTCCTTCACTCCCTGTATCATACTGTGCCGCTCCTCAGGGGTTATTGAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCGAGTGAGCTGGTCGTTGGCTTATGAGCTGACTCAACGAC >read237_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read238_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read239_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read240_contig2_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CGTTGAGTCAGCTCATAAGCCAACGACCAGCTCACTCGCCCTGGACAGGAGAGGCGATCTTACAAGTACCCTTTATATTGGCTAGACGGTCTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGATT >read241_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read242_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read243_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read244_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 TCTAGCGATTAACGTCAACGGACTTAACGGGGGATAATTTTTCGGGAGAATACAGTTACCGGGTGACTCCAACGCAGGGGACAACGAAAGCGGTTTAGGGGGGAATGCACGCTACGTCGCATTTTGAGTGAAAACCGGATCCACACTCAG >read245_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 CAACACGGTCTCAGTCCCAAATACGGGTATAATGTAAACGGCTTGACCGAAGCCAAGGGAACTTTAGTCATCGACGGCCTCTGCATACACGACGCCCATCACTCGGGCCACAGCATATCCACGAAAGCACCGAGTCGTCCTAATCTGCTT >read246_contig1_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 CTGAGTGTGGATCCGGTTTTCACTCAAAATGCGACGTAGCGTGCATTCCCCCCTAAACCGCTTTCGTTGTCCCCTGCGTTGGAGTCACCCGGTAACTGTATTCTCCCGAAAAATTATCCCCCGTTAAGTCCGTTGACGTTAATCGCTAGA >read247_contig0_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev0 AAGCAGATTAGGACGACTCGGTGCTTTCGTGGATATGCTGTGGCCCGAGTGATGGGCGTCGTGTATGCAGAGGCCGTCGATGACTAAAGTTCCCTTGGCTTCGGTCAAGCCGTTTACATTATACCCGTATTTGGGACTGAGACCGTGTTG >read248_contig3_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 GTTGACCTCCCCCAGGGAGCGTCCGATAATTAGTGTCCTACTTAGTCAATAGGGATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGCGGACAACAAAGTAGT >read249_contig4_position0_M0_I0_D0_NG0______er0__indel0__rgeom0_rev1 AAGAAGAGCTATGTTTTCGTCTCCTATATTCCTGACGGACCACGCCTAATTCCCACCTGGAGCCCTATTACAGAGGTCGCGTGCGTTTTTGGGTCACCCATCTGGTTTCCCCTCTCCGCATAGGTCATCATACGAACAGCCGCGATAGAA DiscoSnp-2.6.2/test/large_test/rad_option_test/radref_k_31_c_auto_D_0_P_4_b_2_coherent.fa000066400000000000000000000057711420021152700312730ustar00rootroot00000000000000>SNP_higher_path_7|P_1:30_C/T,P_2:49_C/G|high|nb_pol_2|left_unitig_length_1|right_unitig_length_16|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 gATTGGATGCGAGCTTCTTTACCCGATCATACGTCCAGCGAAGGGATTAGCTGTCGTTAGGGCCCTAATTCCTGCCTGGAGcggacaacaaagtagt >SNP_lower_path_7|P_1:30_C/T,P_2:49_C/G|high|nb_pol_2|left_unitig_length_1|right_unitig_length_16|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 gATTGGATGCGAGCTTCTTTACCCGATCATATGTCCAGCGAAGGGATTAGGTGTCGTTAGGGCCCTAATTCCTGCCTGGAGcggacaacaaagtagt >SNP_higher_path_6|P_1:30_C/G|high|nb_pol_1|left_unitig_length_1|right_unitig_length_8|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 tATGATCGGGTAAAGAAGCTCGCATCCAATCCCTATTGACTAAGTAGGACACTAATTATCGGacgctccc >SNP_lower_path_6|P_1:30_C/G|high|nb_pol_1|left_unitig_length_1|right_unitig_length_8|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 tATGATCGGGTAAAGAAGCTCGCATCCAATCGCTATTGACTAAGTAGGACACTAATTATCGGacgctccc >SNP_higher_path_5|P_1:30_A/C|high|nb_pol_1|left_unitig_length_5|right_unitig_length_51|C1_44|Q1_0|G1_0/1:632,15,632|rank_0 ctatcGCGGCTGTTCGTATGATGACCTATGCGGAGAGGGGAAACCAGATGGGTGACCCAAAAACGCacgcgacctctgtaatagggctccaggtgggaattaggcgtggtccgtcag >SNP_lower_path_5|P_1:30_A/C|high|nb_pol_1|left_unitig_length_5|right_unitig_length_51|C1_44|Q1_0|G1_0/1:632,15,632|rank_0 ctatcGCGGCTGTTCGTATGATGACCTATGCGGAGCGGGGAAACCAGATGGGTGACCCAAAAACGCacgcgacctctgtaatagggctccaggtgggaattaggcgtggtccgtcag >SNP_higher_path_4|P_1:30_A/G|high|nb_pol_1|left_unitig_length_51|right_unitig_length_0|C1_44|Q1_0|G1_0/1:632,15,632|rank_0 ggggaaaccagatgggtgacccaaaaacgcacgcgacctctgtaatagggcTCCAGGTGGGAATTAGGCGTGGTCCGTCAGAAATATAGGAGACGAAAACATAGCTCTTCTT >SNP_lower_path_4|P_1:30_A/G|high|nb_pol_1|left_unitig_length_51|right_unitig_length_0|C1_44|Q1_0|G1_0/1:632,15,632|rank_0 ggggaaaccagatgggtgacccaaaaacgcacgcgacctctgtaatagggcTCCAGGTGGGAATTAGGCGTGGTCCGTCAGGAATATAGGAGACGAAAACATAGCTCTTCTT >SNP_higher_path_3|P_1:30_A/C|high|nb_pol_1|left_unitig_length_23|right_unitig_length_0|C1_42|Q1_0|G1_0/1:604,15,604|rank_0 ccctttatattggctagacggtcTAGTTTTCAATAACCCCTGAGGAGCGGCACAGTATGATACAGGGAGTGAAGGAGGGA >SNP_lower_path_3|P_1:30_A/C|high|nb_pol_1|left_unitig_length_23|right_unitig_length_0|C1_42|Q1_0|G1_0/1:604,15,604|rank_0 ccctttatattggctagacggtcTAGTTTTCAATAACCCCTGAGGAGCGGCACCGTATGATACAGGGAGTGAAGGAGGGA >SNP_higher_path_2|P_1:30_C/T|high|nb_pol_1|left_unitig_length_8|right_unitig_length_0|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 ctattgacTAAGTAGGACACTAATTATCGGACGCTCCCCGGGGGAGGTCAAC >SNP_lower_path_2|P_1:30_C/T|high|nb_pol_1|left_unitig_length_8|right_unitig_length_0|C1_49|Q1_0|G1_0/1:702,15,702|rank_0 ctattgacTAAGTAGGACACTAATTATCGGACGCTCCCTGGGGGAGGTCAAC >SNP_higher_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_23|right_unitig_length_39|C1_42|Q1_0|G1_0/1:604,15,604|rank_0 gtgccgctcctcaggggttattgAAAACTAGACCGTCTAGCCAATATAAAGGGAACTTGTAAGATCGCCTCTCCTGTCCAGGGCgagtgagctggtcgttggcttatgagctgactcaacgac >SNP_lower_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_23|right_unitig_length_39|C1_42|Q1_0|G1_0/1:604,15,604|rank_0 gtgccgctcctcaggggttattgAAAACTAGACCGTCTAGCCAATATAAAGGGTACTTGTAAGATCGCCTCTCCTGTCCAGGGCgagtgagctggtcgttggcttatgagctgactcaacgac DiscoSnp-2.6.2/test/reads_sequence1.fasta.gz000066400000000000000000000322141420021152700207240ustar00rootroot00000000000000G=\Rreads_sequence1.fasta]]8r|_SR ~>0|>dHfTBb6ttE13##o_._.}~׿o˯?~48 OC?ׯaa쇯O[ׯ~c~k6ۧo g=}Ї/jAOjp ?*ǰ}}ـ|}:|?_#~۵za e|!,KI_?Ò~sLg;Bm2EjO~^gwx_8 BO|aU÷1% j{m͠^ 2j#LؠLV6mоcLos {t5&|UNj*5YA',-HDިfc:`]{oM:÷?!"_ۡVdG eopa)#1~˘pb&OX uPLǭUzJ֝q뚯CFbۦ1ar Tۓr ,AVUK!6"\ uc|NF.31q݌YWak+rVŘ1SKX6I9V*)l.cavJ#uƈr聝QSoC"Y_]+ TGwRlb`"d +ZJ7 uKX*Jˇ'BVRluS7RšG-u 7ϴіV#-/q:NXUqVTPu/O|'[Z gNL3fyԪl+ \ +ܪv$Y:,o +38w$aeaKX OX"C=^>\XΕF>@|b3Kdbt!sJBf]yBb,8+} fh=wY<{! MDT=X2s[% $~)q6_0q_9a$|>dT^WlQ<3XVHey L fxucWt jǞrKf#ow5%.q9`UiݪP! , `ZչK6↹;Wr=Ct'*J3e66@`UFzp5cUȰJkhhr> r( 5(Kl4Ґ{/m X+@_`іXi4ʠDqq%օ"}l-"1DoXc~SR>%C#^?2j]X!`%OjZy#-ُ>E0qsp{X K"D[{oLi/pz,ߥ=$8;DmMcxHO[_bch)*|:#XWx,`b%^(3DˢbkOX +WڜGilѸL-2l u _6QX%"DM dY/2_(hǷHX,)m8y=&K5%9,i).cydRvw,ٸ*c?/+˙r%>ڞ>-K""ܥVY`ILqܩ>|I,){J)^`K"fP68%n xz\sz5t|j+4".Y*f],;`UrmFxh Xr6OQ G%]0Ľ y bQkf ,&׸ˇ:f@l L?w,aVnˆs%"McŕSY:5Cɹ]lVIVBiX{K8 4%=0ͮhkK:Jjm{)jqK3\Q@%X2 vw1Ćv<iAC5g\9lyK&xv `kQk'uZo` M7u0u^L.jEXҜi Giɬ_{fKRiTz?K 0u3ۊ/jjͻ`ɝ(,\9%NݧFǔ:>I)% x ~ه'M8NĉCktb.K4mX6˖%QkyׯXR~)n,L[R:_W#V01l. X8^W<i/˨G%1D|eM,XptJ$뺼`D*bYaDo AJcE0Ұ#K ޑc uK|8{Zwy=aK"8am&qGͨ6 X]EˣF|8*U.5Fl%eVw>eÀL1k>No/BQ0ϧx,iv2Fٌ̽X2hMۂ3 `zk r`%DcUa,atMl8mËXB!*_>XfJK%Eg@l8N?]N)m>`ILX;c1nlֲI`%zʷpxxXDb` ȎbU=a`vk}4'ąS%DB/r0J6b'\XR]D+r/XB!^+ i0Eci5/,_"uThsD(L6ЙyD Q5 `D4UIX&? X" 4p44d?*nIL1ߵ>[ 0MKL|>'뢩MJi_L|5xmTK`Y\XY**[w Yk ]iÓxȹ UuAt{q&ĆC ⼲2f,G7.6`߸!6o i= b! jZPjŢ(KµN/m:[YL(V>Vb\mUз> QKJ` MF%5jJ| 1+|g2H(Dv4Ky_3,4l{.E (u=%F>X$V,Sfph}XfD6&s%.7EމV_@.e6J+D^՜,+[7,1רdv" >3ýbX;k%|8N;A|8nZvWek;&N:.c[0){tj b-vyKl8dVs`&i0{ ` (^"~|0.K8^n[#JbVq+a%*OtسNA%FїUrR Hv8S, kP'ą]Q, |*XR]`[XT K(D`S BKl8zil84ڻ"%"Q(Kt1#Dl\Y BԌݥ1>ph}[wќͶćuޒ/eM0s4 KX%ڥ,3-ᐼM+uTKԌ轳q۶ćQvɡ˓1,c;??']-1␈:,QqhkeWt.rRXL1qD/U)Xr681z`U]0e* 'TKtw-lW/BTm^ie̚-_cλ6`RUt3XF"jT&u٥CX6 qx['#I*zQȠ|T`g%NNٶ`{"lYTN1`Qp32%LL߲\fwDn`Ch 6`mv?I5YyjI"" ,hU-O`I쁚us>KJt?? fDš]~ٻ 6[/726(2Z2Xkdl7`H">m^Xv$: xE5.1%ČC-1h5ko9jK8T+DqFv޳LH/e{+ՋjGG0TXc m'#X'F0 <%`A%$vSM _73N8g3A8nQђwWjqGx y;"'FXI6`5k2;ߓzČQXfy`?`7ČVbGNV}KDhْz'`eǯ8\O%^fA]"zR,)|/&o08Dw`I[?.D26&^qʖXq4Oo }X2~c >fml{o$i3vnjUDHQGTv 4r+qhDr`IS)vj!aZt`IR|aOO8qhzǷj.Jb\iΘj, _ %zJV1%*zUgP܅VVF7yR~]kGs[a2`lIV`IKKJ7X,%N6K>,sP:vc&3K4e8qtD*%Xn(qA`v;`ɢY>fQ6x1qZ6뭎fq\5T%+DM!p`ĈR<.o"'#G+d ~8ɞǸX9l:er#eX"/Wb VG+)m̲bD!V'xi'0x8]^9<.+KDĉCtw.9KJ0McJ ,q⨴pU3eL\)]^˼DhB2'F;&ioW̉Ck˹yTp\N>WXv"vAGZqDEyA~vXfG_#N _֕r73mYTR,A3Ėӟ^^Ĉt#Nfra<T`&G]XD,Qq(>; B''ZpOvg%*DZ( yk5%c`(x?KC~ |XIR~ `m1b}ǂ-,!+ LT~K Z߈Gm]J7P9D{P dY33C Wd~@xӮvo-.8F8Ļe˜tLrIPGMs#XrNqNX Y-#TB4'zWk^g bF`w}.%FZ)K)r ͛`V_pw $ .Wʹ,56KC 0Sq22`IK|ECkmlN;~#.a=&HEBY+e*PwCRp,Qp6".wemXB!j͍c ˬՋx=~ѢvćoqZy\Jh5rw'FeL+\UVM+ `g.vĆ&reEfBXbQi֏]j% jRZ5_+џ#.w ꘹w,:XRi>]a"pHwԤ˒<%0Z.-<KnRQv;y2mj̾,/CX.,mb!A};K<~|X2Ĭ:ǔ?<*iв#`C3*_T#_MGBy Qzӑ9|l5q8m/#.wBxzXW'::`fάᨴc8!jw.XbE/ ;YD{9F/%̚M[iXDSX8q{_)?hE0Mŭq`eVZΛAuĉ&޸HD]ȳmG]!P*5e-wĊ* q'S;dwٲl Lc eׯ{e&~OOG98q/O~] Qٳ(:Z˒^%&wb3a 'x٨ca`Vںj8qZ+#)y,iiӀ;`XĊvh5ʼn5,Y:KK`G]P`t# &~{eV6wNs/XqT#k+> K52'_Qv0^%:zmu3[}ϲ,+-9e׽f%5b7z-z[QG8j'Vi2Wz84}#]`Y;uG8n4sV2)Q+#●}Qbg0 %^REeQ=nX6&-X׌}JX!yD`ILMƣX4t6,`f,]Q]Ċdՙ;XEQ9Dxڎ815>;gX]m<6`W 9h&3SڳҘq3I0, LTҗ&IXbơ^kgN8*E}H}9ʓ-GJ:Ebb bǯ8|0E $~iNID;ʝXq\5+<,xK6:?X;T]| q⨴kĝ{ ,qP/~\a`a 6M`۔t+SX85J_0 ILG/\,qvO/! Lkx^IO8ZJ6 "RWl%*:\URA? 2!w8q>ҿX?$;9qFx'ĈIVo?zz)CmK*0=h8UX2ʬԶ!<`cX2&s\X?%]+9\`ٕҞMY4bq4ʸ /l<8*"k%YOfQkPbky+)Fr<5X"Ptqp3k <Ji,Z5cD^,!+In$1%fڼwlwiEI ƍċQ죆X8Ktʞ  ;;B` ٞ X,tS|;, `Jڊ;1K8Tn{/cq/;2}Bˬ8x`n1,Lko}fS0mCc Ĉ#\ e1~8.](b}2'ZI8z'1k4SCoK%0ͱkNmM,c.o`G#V qhw~T7j,B8q\E_!I%-0-(͗ ݦKTJW/o켲LE/\S#1&[mP{#ES;n-`m4]sM sЦBUۏ e'u$NݸX"5X,Ruw<5TRh xbrDGqKj09/6T,_KALe \wyJ@+Yf>Hóǘy*wTΓJJ$E8vU{cĊVBPpDEV"Vu$VW͸1Aȩ(AfqvїT `CuL%v|Zogk)E-2#`ZE܌1)I+m0>>%@|/w`u*E `^KcOeq(+[qܴT|.%L9 ,nΰAn,)4n+X1=5ᴌ.#!I8:L%: Dġέcm`ڜ8=Kz`g8qtwbO`GExV"N`^YVi=0t+-%X%1?3X4oCfew2UG8:e>T=l ./g X&'7ADiscoSnp-2.6.2/test/reads_sequence2.fasta.gz000066400000000000000000000322111420021152700207220ustar00rootroot00000000000000%kQreads_sequence2.fasta}]Hr5"%~eB?O|ob{/}*T!AV6ݝݧCT2322o??8?oz/~?_>;} mox߿xv{o>/_?s7!U>CvK7@f/@! ho>7dyΠZz?fr ?0d` 9Bwow /|!|5<2{z ju՞۳ p^2şC8zv4q # '@PvTv8f|'L'OUz~CM5?U}֟:)-h!F_pU7c v?C|87J k:({`ҙ{·ۇbl fO}J5W5W }v7٥eg3g7ݥ1[^`™]Zn8왇9a^O;AVVi oto5Y}-W3m~ȩ♼ۥk˲:񼤯c~1 ;f k^: 1b,D% %yЪ,/E 쭱*[[nϮ]0t'I5ZzC5`. Z٧jDV m.!tG%WQ;k{:MX+A!%1>[xBz Z ^&+쮲 k5/c<<7#r%Ų5[β ( 5[E v^^ kΪp`5շ9MX* o$"+pLEYšǭs>2=7J5[EH_M@}2T[' Y||JV+Ƃ!5[VzrgveqK]0kWšǭ,[m.V놄)ॸU/$&4 ޏ>Qšǭp݃#+G * [_#9%$liځ}BudJ؃|% 38IgV#NXj to$y[L&ّH7Ēb@S )mIwk$U j*&vd>_ +VliMӚ5YM--ɷtOXui8wq^JFkmpJ\Յڄ9k=% (+:)e+89AKZ-6&7H`ƹ䒅򪷕.2.F3%`ÿ^OL/g`Iji9v, P.,)4s۟p a&O\yd%PYXNK?UojXbqV+=`CDá]]+S]+KF]a&, mmne<`QN_n`6`ኻ>\mCzBXn.gl%6QTmX6FrGK7.ڠ)`,)~n-\M,?w%.Ykvn,^> 8+X`U);L+6,_gm֋7\$K◢Vt Hc`2 D$z, ܔ3v%M0:Y`߸b DWu#嫈Gp]B y E/`%QљWa,)eI*tL"ؚp'G X j>RX JNX^JS $~i3>Rǀ $~ie#Kz10M2Q3tĄUӱҡXR<9XbqQm+A<~"x80O 5hC,QpӾy;KL1"MyQYi%c`"ePjV j% `dba{}J+O 6s Xwg$ĄhF.A%.^rlG? XBer/ `Y۟k+6qI4 ,ia ćCsq*j"av`I%6~B>$I.qǓT&')F0`%`b:, ^ϳQ &` yIFd19kvÊ|k`uV &tH>KM(eZ&[,X4GW7z_BZ@,8zq.!%VZu-{%/m^#y:꿚XptEhktk׬//5&%ʫ\ǯFKp>JlړV}C$XqX\M,8*m9OxOlwWeZ<} f*/Xl~Q `{EkOQkq\8pH[3)dY#VICʚM ,szT&.G-%qO ̀pT\cXLJ.!+3i<+Jw`#D}6`&9*^`M֕a4rK*8;[t(Xb^E 8:m3g [ D>=Y-I 8^^(*zۖX4J րpt0WL^Ύ=j]%eԆy;%̚ K􇚗sHophI7 8RY,5h{n=L!ZOF /?|.eK`FH vQgbщ쬫,GKT W?`%VZ,봠]OqԊuD< D-yp/qhs>`^+ /1ErMq`F8*q[:c L]-ԂsHḱi(, `Եd=%N~V0KJ0s}h7,Qq(6(ChnL,!jO$iЍ^]ax&N҄]lܖoj%Jz17I,!y%sv,!*!V杈XqH6޻X"мn_)(/n-;/Vq3^r%^RvPln$`Q dY!Z2F3,4DGQE2Af͸љ0XjGUWo8qT'].%N(*1EX LK)AK`X.HxQ3KUg'Kd,sZM lw,9}, %V6\U\~:Q~!%Vk^g_ċt= %EW\LI5ONeԨ7" ߖ) !d }qXB!V*-չLWJrvK(DEk`sI%̚5^$fe+A_%M`G.)#<~0%MV)dQMgČu|Sj* NJ4qo.N"1hjIS@<v֙qwqt)ZEbQ+bq[} vK8Tq`n 3nӄG .#6"!yE%JzE uKj0%9}9$Y)y; qЌ DX⑰3ebܤQ%zZ+YRiʏe UefR˅6\^lK(DudSpXwxb;DmCl',?ڏ S,k `IҖe^Xqm*4U/3M%25{k1%2a疽I0q@/V+iv|>|!^m3SE8jgDg|qQ!™?H`ǥG0%̚`W;KukˀXqH&uW,_'Fd0l)WA<{+_=Xlud L;}ZDؠȐeS ,1⨴0[qhyADqZ׀=u%^ϵ W0E , _~N *%/›[Ĉ# ?ۑ|7u*6s]}XdaL6Vq`K|8*eYΖ'4,%hX2,%g*pʪиdKZ `Q pUhK|8=X,3=jp"({WS7rpͿ@/0D0O,hE56 $` יwT6`Vsqu RDá`>r\`0U+/;.^0RrpX[՞M sP[[zt'}˫`ֶurx%Ѫ[:a GxU3$KDgeB,!pJ+6`'Lg?AKj05M`6^*^+ph|L'8J֩(>g9^Mu5K*09.Md0``»;`2l-N R,3␘.qg`6sN|T`ʔJf$z1W#J!-:eFJYC ;-z,c> 1ZqXv&,YɬM Ro=%b+ RDe+-Eᬧf+ `yDcK~SєGʼn""؆pḦ́_ieWC|8.=>D,!j1ET,!*''IY89*!u?l_Ѷֱ+XRi_H^+ 4>6`@Ƅ#JW`I;ꆒ8qtrrk`|Zu'%d/| HӔ'j+,-$X4}u Vm q.~ZNQ\<բ=*qVn`t_HP'. mǁ,J!8SHK`] Fxqԝ6MxqT OE0qw=_#^ ʍB?%5Q jWDm,Z~D0ͥ= Fb![<]4#IEX&LX&uk(,ĥ?MN`G#^]N!vyD0`z9LJ`%*MЙo:,ii)`*u`$ev;S7m.Nh.kX>0X)}YqhË%D1XTdY+۠%Qtr=/)%ֆ䰰tx+f,d>Xq <"B÷mˬ8ևͳ~YdL ~- W$ї  "rLKh,kk4\D'l:myya~,q^0ל 1NKCqhm:ӌyv,`̳ 1%Vg.BOVKR)c0X2ʬ*yo`%TMF_2ayA,,i)JcQdJer>ĉC$\ZC8.5[Xb[KDW{Co`IL5]'2~r',[&;211VRx7`qBI@KydX>(DMI@Âa` =& Q7i4Ċ{bq8]Jȕ DK8Zm77`IL3kTA~D⽯.,3od  ݶxK"X'zbP9!,qTu`I $`e^4@G`C4U>eĊԶaٽv'h=E3-OrL&6XQE ˵.lTG}` X`ײI%M0 0)6:&̊$:x&!j+oZevu6 L\ 2,3:^K8$OXLm6`Բ@+czdfЮrbj6`gmW!/%2߸ř%V_T XSf֢S+9ZbQiM]ji%~}drǥl ^yň{eBDuc8eɈ+ `-Qp(g.]Et%FB{90T`W*:dq4 ѝ-14qXR#Fe5ǀd`^<]58ZbiO0F7%2FK K%:Dmֱ1}iK`XIܻ ,3⨴eŗEBe2WjG[}NRX!&]#~IXJTڂ/9K5%K*^[GM`ViE8v%L }$%Vg 7,`I")XR)ൣ2f|h1/eEś^/&t-ZhK2e`,s-VLe7" `IS^0i))#\2q\gԸÛ?<Պu.X2 &)<}xkm&-pta쁕G^|[,qh{\r'r`yя 7)eC\ {̀xqWM8;oXq9_YHLJ ؇W%{nlXӜQ5;%K,S`(J[D7D1"YXB!J RKJ4r@otmHys>L({K52UAK8ZM/ꛪQ {SJ 90=fתlaލ%`%dҽTD^@8T$pVLy$K^aYiDѫXQlZ 5\,^Zsھ)!.vKh .W%ąCGp*$.{۟X77˭tNR6[ңG%.g͡hd(NDQSe"W YiX6,X0OOj ߳( G4laқ5,YjݫaK&U2Y̅CKˋvk`ҷIY_,\:`I39%CE/rxpA᫂`~CSf $KfY\f߻Vi=dO`"wb.jG~9, `dB8؝&=H56 XbDya:{,՚ߟBK,8z9:,iOPXIEDzn0UXnoIDxeT`GG-m<K&˹l`՛D.x8[Kl|EA ^gL`G':fRZ%T{ֻJ vTa_G<8.g ` R f`7JŬGy\sǎXpT ӗ<_y ,hťn1v#` k;ϦԀXpHn;ڛ~I, `Zέ;֎p(lJ&K`hGVXS"ٌ P,!xVf׽ZK\8jMG_y%2m9˟%K`G A:bqъbq 1]e8,J&6by.HBAӗͪ]%V*sXb!MEvNgpHAH;|GĆm$fe4'l(:7ֱ&X⃨KΣd((=%`ֈTੱӌwp﫹[%BDkKG]+U\<,&ń.y9y;" )&'>mK8DJO/!9q5K8J;%&Y Wg˻DơZ/TMF,"^4&\੏ċ㬹䄏Qf6bX"P2)އ6K̤[F͔"ċFog9튲4ŤGӡJTJK+IXbU,`CLTg_Gn3+ņ<:wjO`ILtm},`vXqԪ1ʏ`ƃ/X`.0-(i{[;eV 0Lu,ߐWIz`( g}fgXRړu{syj4 X"7˾2 o>.Q`d`v؝=qږߌEec`x{#21>/u|x1kJ2#K#Jp 3,*\tN&ErO8| T'zb:Ո`I&΄\%HLgmSwImMzK8z Jl`IX}6#I f`Iwi)VG8;#FJW J4ZS#\JS@|8zQuxK(lMir >fR&Qyp(C*i~zl )0sf`BJͪt `B06x-)v:Y ,p[/%S``׳V"%F&9L"1h4-j9` xҤU 0*73C8B(Ջ bNkΪ `%"ǼEg%=0rֹa)0޺+W㋀JցUZ׶9~Xb(Lf#]HAxuBOl8.g)\Al8+&6q'P%S̪FYySnXR8&!OiYEw\` ӗ.f\Wb^%Vs`f)6KTl'{XLQLFh{dL,jJ Q.ޘ߸VDgK: DEn%( b9%ҝWb!119q Vp,ۦ0U*)&.F˽6ᔚ`Cs+ڙ{<ՊQ[ڟ5:ƸD!x*fXb嫼`q9u/x{?WXXbQ+iy:|K8:z%Vu+Z)nĵ`/%Ltdq%%Vi^>Ka@>m>ĈF52 LOOO'X0]ž ,qY1pH K4bӤ{PgM?E +ҢTbU Q1d1]%;׏K4DX"?;3Cl5Ggw|fI-Jӓ%*Dmњs ~[pĉw~xG"NU!^GD1˧ 8qE|czykk+y26ii-X2ɬ|2 %` k`ckG#X#EMu>֔#a%VE]IggTI}%V6TS* 1`!/+h3PKJZ_GU.1<]U(X6ɬ q R F8?&%Ve=]' S}yf6 ^8=-Z`<:_*Á,'UU}5+j4Fg%jK8|>V2Ȭ́x,_rQEzdZ5)3 VIR,b2%u*A12+/Qi ")&*L l~JĉCZ :X $|) !$9&UD I;`UkA܋6ć<&w^%J.kypֲq %*zy_,zs,dV3BX2f1Ĉm4jֱ?@ ü'sl˽:_tMDiscoSnp-2.6.2/test/ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa000066400000000000000000000160131420021152700244260ustar00rootroot00000000000000>SNP_higher_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_169|right_contig_length_764|C1_124|C2_0|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGACTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa >SNP_lower_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_169|right_contig_length_764|C1_0|C2_134|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGAGTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa >SNP_higher_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_52|left_contig_length_881|right_contig_length_52|C1_74|C2_0|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACAAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_lower_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_52|left_contig_length_881|right_contig_length_52|C1_0|C2_86|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACTAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_higher_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_472|right_unitig_length_261|left_contig_length_472|right_contig_length_461|C1_0|C2_114|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTACTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_lower_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_472|right_unitig_length_261|left_contig_length_472|right_contig_length_461|C1_110|C2_0|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTTCTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg DiscoSnp-2.6.2/test/ref_discoRes_k_31_c_3_D_100_P_1_b_0_coherent.vcf000066400000000000000000000040671420021152700246240ustar00rootroot00000000000000##fileformat=VCFv4.1 ##filedate=2018612 ##source=VCF_creator ##SAMPLE=file://discoRes_k_31_c_3_D_100_P_1_b_0_coherent.fa ##REF= ##FILTER= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 SNP_higher_path_3 199 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=169;CR=764;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:124:10,378,2484:124,0:0,0 1/1:134:2684,408,10:0,134:0,0 SNP_higher_path_2 911 2 A T . . Ty=SNP;Rk=1;UL=86;UR=52;CL=881;CR=52;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:74:8,227,1484:74,0:0,0 1/1:86:1724,263,8:0,86:0,0 SNP_higher_path_1 502 1 A T . . Ty=SNP;Rk=1;UL=472;UR=261;CL=472;CR=461;Genome=.;Sd=. GT:DP:PL:AD:HQ 1/1:110:2204,335,9:0,110:0,0 0/0:114:9,347,2284:114,0:0,0 DiscoSnp-2.6.2/test/ref_discoRes_k_31_c_3_D_100_P_3_b_0_coherent.fa000066400000000000000000000160131420021152700244300ustar00rootroot00000000000000>SNP_higher_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_169|right_contig_length_764|C1_124|C2_0|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGACTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa >SNP_lower_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_169|right_contig_length_764|C1_0|C2_134|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cgtcggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGAGTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccgcaa >SNP_higher_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_52|left_contig_length_881|right_contig_length_52|C1_74|C2_0|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACAAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_lower_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_52|left_contig_length_881|right_contig_length_52|C1_0|C2_86|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACTAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_higher_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_472|right_unitig_length_261|left_contig_length_472|right_contig_length_461|C1_0|C2_114|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTACTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg >SNP_lower_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_472|right_unitig_length_261|left_contig_length_472|right_contig_length_461|C1_110|C2_0|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 ttgcggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTTCTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccgacg DiscoSnp-2.6.2/test/ref_discoRes_k_31_c_3_D_100_P_3_b_0_coherent.vcf000066400000000000000000000040661420021152700246250ustar00rootroot00000000000000##fileformat=VCFv4.1 ##filedate=20211123 ##source=VCF_creator ##SAMPLE=file://discoRes_k_31_c_3_D_100_P_3_b_0_coherent.fa ##REF= ##FILTER= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 SNP_higher_path_3 200 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=169;CR=764;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:124:10,378,2484:124,0:0,0 1/1:134:2684,408,10:0,134:0,0 SNP_higher_path_2 912 2 A T . . Ty=SNP;Rk=1;UL=86;UR=52;CL=881;CR=52;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:74:8,227,1484:74,0:0,0 1/1:86:1724,263,8:0,86:0,0 SNP_higher_path_1 503 1 A T . . Ty=SNP;Rk=1;UL=472;UR=261;CL=472;CR=461;Genome=.;Sd=. GT:DP:PL:AD:HQ 1/1:110:2204,335,9:0,110:0,0 0/0:114:9,347,2284:114,0:0,0 DiscoSnp-2.6.2/test/ref_discoRes_k_31_c_auto_D_100_P_1_b_0_coherent.fa000066400000000000000000000157471420021152700252510ustar00rootroot00000000000000>SNP_higher_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_166|right_contig_length_761|C1_124|C2_0|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGACTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccg >SNP_lower_path_3|P_1:30_C/G|high|nb_pol_1|left_unitig_length_86|right_unitig_length_261|left_contig_length_166|right_contig_length_761|C1_0|C2_134|Q1_0|Q2_0|G1_0/0:10,378,2484|G2_1/1:2684,408,10|rank_1 cggaattgctatagcccttgaacgctacatgcacgataccaagttatgtatggaccgggtcatcaataggttatagccttgtagttaacatgtagcccggccctattagtacagtagtgccttcatcggcattctgtttattaagttttttctacagcaaaacgatCAAGTGCACTTCCACAGAGCGCGGTAGAGAGTCATCCACCCGGCAGCTCTGTAATAGGGACtaaaaaagtgatgataatcatgagtgccgcgttatggtggtgtcggatcagagcggtcttacgaccagtcgtatgccttctcgagttccgtccggttaagcgtgacagtcccagtgaacccacaaaccgtgatggctgtccttggagtcatacgcaagaaggatggtctccagacaccggcgcaccagttttcacgccgaaagcataaacgacgagcacatatgagagtgttagaactggacgtgcggtttctctgcgaagaacacctcgagctgttgcgttgttgcgctgcctagatgcagtgtcgcacatatcacttttgcttcaacgactgccgctttcgctgtatccctagacagtcaacagtaagcgctttttgtaggcaggggctccccctgtgactaactgcgccaaaacatcttcggatccccttgtccaatctaactcaccgaattcttacattttagaccctaatatcacatcattagagattaattgccactgccaaaattctgtccacaagcgttttagttcgccccagtaaagttgtctataacgactaccaaatccgcatgttacgggacttcttattaattcttttttcgtgaggagcagcggatcttaatggatggccgcaggtggtatggaagctaatagcgcgggtgagagggtaatcagccgtgtccaccaacacaacgctatcgggcgattctataagattccgcattgcgtctacttataagatgtctcaacggtatccg >SNP_higher_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_49|left_contig_length_878|right_contig_length_49|C1_74|C2_0|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 cggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACAAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccg >SNP_lower_path_2|P_1:30_A/T|high|nb_pol_1|left_unitig_length_86|right_unitig_length_49|left_contig_length_878|right_contig_length_49|C1_0|C2_86|Q1_0|Q2_0|G1_0/0:8,227,1484|G2_1/1:1724,263,8|rank_1 cggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctaggcagcgcaacaacgcaacagctcgaggtgttcttcgcagagaaaccgcacgtccagttctaacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgagtctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtACTAATAGGGCCGGGCTACATGTTAACTACTAGGCTATAACCTATTGATGACCCGGTCCATacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccg >SNP_higher_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_469|right_unitig_length_261|left_contig_length_469|right_contig_length_458|C1_0|C2_114|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 cggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTACTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccg >SNP_lower_path_1|P_1:30_A/T|high|nb_pol_1|left_unitig_length_469|right_unitig_length_261|left_contig_length_469|right_contig_length_458|C1_110|C2_0|Q1_0|Q2_0|G1_1/1:2204,335,9|G2_0/0:9,347,2284|rank_1 cggataccgttgagacatcttataagtagacgcaatgcggaatcttatagaatcgcccgatagcgttgtgttggtggacacggctgattaccctctcacccgcgctattagcttccataccacctgcggccatccattaagatccgctgctcctcacgaaaaaagaattaataagaagtcccgtaacatgcggatttggtagtcgttatagacaactttactggggcgaactaaaacgcttgtggacagaattttggcagtggcaattaatctctaatgatgtgatattagggtctaaaatgtaagaattcggtgagttagattggacaaggggatccgaagatgttttggcgcagttagtcacagggggagcccctgcctacaaaaagcgcttactgttgactgtctagggatacagcgaaagcggcagtcgttgaagcaaaagtgatatgtgcgacactgcatctagGCAGCGCAACAACGCAACAGCTCGAGGTGTTCTTCGCAGAGAAACCGCACGTCCAGTTCTAacactctcatatgtgctcgtcgtttatgctttcggcgtgaaaactggtgcgccggtgtctggagaccatccttcttgcgtatgactccaaggacagccatcacggtttgtgggttcactgggactgtcacgcttaaccggacggaactcgagaaggcatacgactggtcgtaagaccgctctgatccgacaccaccataacgcggcactcatgattatcatcacttttttagtccctattacagagctgccgggtggatgactctctaccgcgctctgtggaagtgcacttgatcgttttgctgtagaaaaaacttaataaacagaatgccgatgaaggcactactgtactaatagggccgggctacatgttaactacaaggctataacctattgatgacccggtccatacataacttggtatcgtgcatgtagcgttcaagggctatagcaattccg DiscoSnp-2.6.2/test/ref_discoRes_k_31_c_auto_D_100_P_1_b_0_coherent.vcf000066400000000000000000000040751420021152700254310ustar00rootroot00000000000000##fileformat=VCFv4.1 ##filedate=2017816 ##source=VCF_creator ##SAMPLE=file://discoRes_k_31_c_auto_D_100_P_1_b_0_coherent.fa ##REF= ##FILTER= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT G1 G2 SNP_higher_path_3 198 3 C G . . Ty=SNP;Rk=1;UL=86;UR=261;CL=166;CR=761;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:124:10,378,2484:124,0:0,0 1/1:134:2684,408,10:0,134:0,0 SNP_higher_path_2 910 2 A T . . Ty=SNP;Rk=1;UL=86;UR=49;CL=878;CR=49;Genome=.;Sd=. GT:DP:PL:AD:HQ 0/0:74:8,227,1484:74,0:0,0 1/1:86:1724,263,8:0,86:0,0 SNP_higher_path_1 501 1 A T . . Ty=SNP;Rk=1;UL=469;UR=261;CL=469;CR=458;Genome=.;Sd=. GT:DP:PL:AD:HQ 1/1:110:2204,335,9:0,110:0,0 0/0:114:9,347,2284:114,0:0,0 DiscoSnp-2.6.2/test/ref_version.txt000066400000000000000000000000511420021152700172720ustar00rootroot00000000000000024137e9af3a98af2ece784ef08df27a62fffc1e DiscoSnp-2.6.2/test/reference_genome.fa000066400000000000000000000015361420021152700200210ustar00rootroot00000000000000>chromosome GTAGTTAACATGTAGCCCGGCCCTATTAGTACAGTAGTGCCTTCATCGGCATTCTGTTTATTAAGTTTTTTCTACAGCAAAACGATCAAGTGCACTTCCACAGAGCGCGGTAGAGACTCATCCACCCGGCAGCTCTGTAATAGGGACTAAAAAAGTGATGATAATCATGAGTGCCGCGTTATGGTGGTGTCGGATCAGAGCGGTCTTACGACCAGTCGTATGCCTTCTCGAGTTCCGTCCGGTTAAGCGTGACAGTCCCAGTGAACCCACAAACCGTGATGGCTGTCCTTGGAGTCATACGCAAGAAGGATGGTCTCCAGACACCGGCGCACCAGTTTTCACGCCGAAAGCATAAACGACGAGCACATATGAGAGTGTTAGAACTGGACGTGCGGTTTCTCTGCGAAGCTGTAGAAAAAACTTAATAAACAGAATGCCGATGAAGGCACTACTGTACTAATAGGGCCGGGCTACATGTTAACTACAAGGCTATAACCTATTGATGACCCGGTCCATACATAACTTGGTATCGTGCATGTAGCGTTCATATGTGCGACACTGCATCTAGGCAGCGCAACAACGCAACAGCTCGAGGTGTACTTCGCAGAGAAACCGCACGTCCAGTTCTAACACTCTCATATGTGCTCGTCGTTTATGCTTTCGGCGTGAAAACTGGTGCGCCGGTGTCTGGAGACCATCCTTCTTGCGTATGACTCCAAGGACAGCCATCACGGTTTGTGGGTTCACTGGGACTGTCACGCTTAACCGGACGGAACTCGAGAAGGCATACGACTGGTCGTAAGACCGCTCTGATCCGACACCACCATAACGCGGCACTCATGATTATCA DiscoSnp-2.6.2/test/simple_test.sh000077500000000000000000000012101420021152700170750ustar00rootroot00000000000000#!/bin/bash ../run_discoSnp++.sh -r fof.txt -T diff discoRes_k_31_c_3_D_100_P_3_b_0_coherent.fa ref_discoRes_k_31_c_3_D_100_P_3_b_0_coherent.fa if [ $? -ne 0 ] ; then echo "*** Test: FAILURE on diff .fa" exit 1 fi # we do not want to compare fildate lines since they are de facto not similar awk '!/##filedate=/' discoRes_k_31_c_3_D_100_P_3_b_0_coherent.vcf > discoRes_a.vcf awk '!/##filedate=/' ref_discoRes_k_31_c_3_D_100_P_3_b_0_coherent.vcf > discoRes_b.vcf diff discoRes_a.vcf discoRes_b.vcf if [ $? -ne 0 ] ; then echo "*** Test: FAILURE on diff .vcf" exit 1 fi rm -fr discoRes_* reference_genome.fa.* echo "*** Test: OK" DiscoSnp-2.6.2/thirdparty/000077500000000000000000000000001420021152700154275ustar00rootroot00000000000000DiscoSnp-2.6.2/thirdparty/gatb-core/000077500000000000000000000000001420021152700172725ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/000077500000000000000000000000001420021152700143755ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/.DS_Store000066400000000000000000000140041420021152700160570ustar00rootroot00000000000000Bud1 reads2 kissreads2bwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowPathbar  _{{335, 346}, {770, 436}}%1=I`myz{|}~ kissreads2vSrnlongphaserbwspblobbplist00  ]ShowStatusBar_SidebarWidthTenElevenOrLater[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth_PreviewPaneVisibility[ShowSidebar[ShowPathbar  _{{2033, 535}, {770, 436}} +JVbyphaservSrnlongQHCvSrnlong  @ @ @ @ E DSDB ` @ @ @DiscoSnp-2.6.2/tools/CMakeLists.txt000066400000000000000000000005201420021152700171320ustar00rootroot00000000000000################################################################################ # TOOLS GENERATION ################################################################################ ADD_SUBDIRECTORY(kissnp2) ADD_SUBDIRECTORY(kissreads2) ADD_SUBDIRECTORY(QHC) ADD_SUBDIRECTORY(read_file_names) ADD_SUBDIRECTORY(create_coverage_h5_file) DiscoSnp-2.6.2/tools/QHC/000077500000000000000000000000001420021152700150105ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/QHC/CMakeLists.txt000066400000000000000000000016501420021152700175520ustar00rootroot00000000000000project(quick_hierarchical_clustering) ################################################################################ # TOOL ################################################################################ # we get compilation definitions from the gatb-core part add_definitions (${gatb-core-flags}) # we give the headers directories from : # - from project source # - from GATB-CORE source include_directories (src ${gatb-core-includes}) # we define the files to be compiled file (GLOB_RECURSE ProjectFiles src/*) # we define the artifact to be built: the project binary add_executable (${PROJECT_NAME} ${ProjectFiles}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIRZ}) # we define which libraries to be linked with project binary target_link_libraries (${PROJECT_NAME} ${gatb-core-libraries}) # We copy the project binary to the 'bin' directory INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin) DiscoSnp-2.6.2/tools/QHC/src/000077500000000000000000000000001420021152700155775ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/QHC/src/quick_hierarchical_clustering.cpp000066400000000000000000000054151420021152700243610ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // std::stack //#include //#include //#include //typedef unsigned long long u_int64_t; using namespace std; unordered_set visited; // AVOIDS TO PUT IT IN THE RECURSION STACK. unordered_map > nodeToNeighbors; // AVOIDS TO PUT IT IN THE RECURSION STACK. // DEPRECATED. Recursion depth is to high and causes the computation fails. void DFS(const string n ){ visited.insert(n); cout<<" "< mystack; mystack.push(n); visited.insert(n); while (not mystack.empty()){ auto m = mystack.top(); mystack.pop(); cout<<" "< 1){ string fileName(argv[1]); ifstream refFile(fileName); // parse SRC's output, for each line we get a node and its neighbors and fill the map nodeToNeighbors cerr << "Parsing..." << endl; parsingPairsOfNodes(refFile); cerr << "Compute CCs..." << endl; for (auto node(nodeToNeighbors.begin()); node != nodeToNeighbors.end(); ++node){ if (visited.count(node->first)==0){ // DFS(node->first); nonrecursive_DFS(node->first); cout << endl; } } } return 0; } DiscoSnp-2.6.2/tools/create_coverage_h5_file/000077500000000000000000000000001420021152700211065ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/create_coverage_h5_file/CMakeLists.txt000066400000000000000000000016411420021152700236500ustar00rootroot00000000000000project(create_coverage_h5_file) ################################################################################ # TOOL ################################################################################ # we get compilation definitions from the gatb-core part add_definitions (${gatb-core-flags}) # we give the headers directories from : # - from project source # - from GATB-CORE source include_directories (src ${gatb-core-includes}) # we define the files to be compiled file (GLOB_RECURSE ProjectFiles src/*) # we define the artifact to be built: the project binary add_executable (${PROJECT_NAME} ${ProjectFiles}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIRZ}) # we define which libraries to be linked with project binary target_link_libraries (${PROJECT_NAME} ${gatb-core-libraries}) # We copy the project binary to the 'bin' directory INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin)DiscoSnp-2.6.2/tools/create_coverage_h5_file/src/000077500000000000000000000000001420021152700216755ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/create_coverage_h5_file/src/create_coverage_h5_file.cpp000066400000000000000000000216201420021152700271130ustar00rootroot00000000000000#include #include #define STR_OUT_COVERAGE_FILE_NAME "-coverage_file" /*** Takes a set of h5 input files, coma separated, and finishing with a comma ***/ /*** those input files contain only a cutoff group ***/ /*** Return 0 except in case of failure ***/ int glue_simple_h5_files(std::string input_h5_file_names, std::string output_h5_file_name){ try{ std::string delimiter = ","; // PREPARE FOR WRITING Storage* storage_out = StorageFactory(STORAGE_HDF5).create (output_h5_file_name, true, false); LOCAL (storage_out); Group& root_out = storage_out->root(); Collection& myIntegers_out = root_out.getCollection ("cutoffs"); // PARSE ALL INPUT H5 files, Dump their content in the output h5. size_t pos = 0; std::string token; while ((pos = input_h5_file_names.find(delimiter)) != std::string::npos) { token = input_h5_file_names.substr(0, pos); cout<<"reading "<root(); Collection& myIntegers = root.getCollection ("cutoff"); // We create an iterator for our collection. Iterator* iterInt = myIntegers.iterator(); LOCAL (iterInt); // WRITING the content of the input h5. should have only on value for (iterInt->first(); !iterInt->isDone(); iterInt->next()) { int n=iterInt->item().toInt(); myIntegers_out.insert (n); break; // only one value } myIntegers.flush(); // Get the next asked coverage valoue input_h5_file_names.erase(0, pos + delimiter.length()); } // no need to get the last value as entry finishes with a ',' from run_discoSnp++_ML.sh myIntegers_out.flush(); } catch (OptionFailure& e) { return e.displayErrors (std::cerr); } catch (Exception& e) { std::cerr << "EXCEPTION: " << e.getMessage() << std::endl; } return 0; } /*** Takes one h5 input file, all generated by dks ***/ /*** Dump its cuttoff value (either the one asked by the user or the one computed by dsk if the user asked for automatic value) in an output h5 file. ***/ /*** Return 0 except in case of failure ***/ int from_large_h5_file_to_only_cutoff_h5_file(std::string input_h5_file_name, std::string output_h5_file_name){ try { // PREPARE FOR WRITING Storage* storage_out = StorageFactory(STORAGE_HDF5).create (output_h5_file_name, true, false); LOCAL (storage_out); Group& root_out = storage_out->root(); Collection& myIntegers_out = root_out.getCollection ("cutoff"); // PARSE THE INPUT H5 file. Dump its content in the output h5. // READING Storage* storage = StorageFactory(STORAGE_HDF5).load (input_h5_file_name); LOCAL (storage); Group& root = storage->root(); Group& configGroup = storage->getGroup("configuration"); stringstream ss; ss << configGroup.getProperty ("xml"); Properties props; props.readXML (ss); int asked_ab_min = props.getInt("abundance_min"); if (asked_ab_min != -1) // if asked_ab_min != auto { myIntegers_out.insert (asked_ab_min); } else // recover the automatic value computed by dsk in the /histogram/cutoff field. { Group& histo = root.getGroup("histogram"); Collection& myIntegers = histo.getCollection ("cutoff"); // We create an iterator for our collection. Iterator* iterInt = myIntegers.iterator(); LOCAL (iterInt); // WRITING the content of the input h5. for (iterInt->first(); !iterInt->isDone(); iterInt->next()) { int n=iterInt->item().toInt(); myIntegers_out.insert (n); break; // only one value } myIntegers.flush(); } myIntegers_out.flush(); } catch (OptionFailure& e) { return e.displayErrors (std::cerr); } catch (Exception& e) { std::cerr << "EXCEPTION: " << e.getMessage() << std::endl; } return 0; } /********************************************************************************/ /*** Deal with h5 files for multiple large version of discoSnp ***/ /*** Two main features: If the input file(s) contain comas, then merge cutoff value of all input h5 files in an output h5 file If the input does not contain coma, this is the raw h5 output from dsk. We need only to dump the cutoff value, either asked by user or computed by dsk in case of automatic computation of the cutoff ***/ int main (int argc, char* argv[]) { /** We create a command line parser. */ OptionsParser parser ("CoverageDump"); parser.push_back (new OptionOneParam (STR_URI_INPUT, " set of .h5 files from which one need to grab the coverage cutoff ", true)); parser.push_back (new OptionOneParam (STR_OUT_COVERAGE_FILE_NAME, " name of the created .h5 coverage file ", true)); IProperties* options = parser.parse (argc, argv); std::string input_h5_file_names = options->getStr(STR_URI_INPUT); std::string output_h5_file_name = options->getStr(STR_OUT_COVERAGE_FILE_NAME); if (input_h5_file_names.find(",") != std::string::npos) { // first case, need to merge h5 files: return glue_simple_h5_files(input_h5_file_names, output_h5_file_name); } else{ return from_large_h5_file_to_only_cutoff_h5_file(input_h5_file_names, output_h5_file_name); } // try // { // IProperties* options = parser.parse (argc, argv); // // std::string input_h5_file_names = options->getStr(STR_URI_INPUT); // h5 files, separated by comma // std::string delimiter = ","; // // // PREPARE FOR WRITING // Storage* storage_out = StorageFactory(STORAGE_HDF5).create (options->getStr(STR_OUT_COVERAGE_FILE_NAME), true, false); // LOCAL (storage_out); // Group& root_out = storage_out->root(); // Collection& myIntegers_out = root_out.getCollection ("cutoffs"); // // // // // // PARSE ALL INPUT H5 files, Dump their content in the output h5. // size_t pos = 0; // std::string token; // while ((pos = input_h5_file_names.find(delimiter)) != std::string::npos) { // token = input_h5_file_names.substr(0, pos); // cout<<"reading "<root(); // // Group& configGroup = storage->getGroup("configuration"); // stringstream ss; ss << configGroup.getProperty ("xml"); // Properties props; props.readXML (ss); // int asked_ab_min = props.getInt("abundance_min"); // // // if (asked_ab_min != -1) // if asked_ab_min != auto // { // myIntegers_out.insert (asked_ab_min); // } // else // recover the automatic value computed by dsk in the /histogram/cutoff field. // { // Group& histo = root.getGroup("histogram"); // Collection& myIntegers = histo.getCollection ("cutoff"); // // We create an iterator for our collection. // Iterator* iterInt = myIntegers.iterator(); // LOCAL (iterInt); // // WRITING the content of the input h5. // for (iterInt->first(); !iterInt->isDone(); iterInt->next()) { // int n=iterInt->item().toInt(); // myIntegers_out.insert (n); // break; // only one value // } // myIntegers.flush(); // } // // Get the next asked coverage valoue // input_h5_file_names.erase(0, pos + delimiter.length()); // } // // no need to get the last value as entry finishes with a ',' from run_discoSnp++_ML.sh // myIntegers_out.flush(); // // // } // catch (OptionFailure& e) // { // return e.displayErrors (std::cerr); // } // catch (Exception& e) // { // std::cerr << "EXCEPTION: " << e.getMessage() << std::endl; // } }DiscoSnp-2.6.2/tools/kissnp2/000077500000000000000000000000001420021152700157665ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/kissnp2/CMakeLists.txt000066400000000000000000000016211420021152700205260ustar00rootroot00000000000000project(kissnp2) ################################################################################ # TOOL ################################################################################ # we get compilation definitions from the gatb-core part add_definitions (${gatb-core-flags}) # we give the headers directories from : # - from project source # - from GATB-CORE source include_directories (src ${gatb-core-includes}) # we define the files to be compiled file (GLOB_RECURSE ProjectFiles src/*) # we define the artifact to be built: the project binary add_executable (${PROJECT_NAME} ${ProjectFiles}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIRZ}) # we define which libraries to be linked with project binary target_link_libraries (${PROJECT_NAME} ${gatb-core-libraries}) # We copy the project binary to the 'bin' directory INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin)DiscoSnp-2.6.2/tools/kissnp2/src/000077500000000000000000000000001420021152700165555ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/kissnp2/src/Bubble.cpp000066400000000000000000001362231420021152700204630ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ #include #include #include using namespace std; #define DEBUG(a) // a const char* BubbleFinder::STR_BFS_MAX_DEPTH = "-bfs-max-depth"; const char* BubbleFinder::STR_BFS_MAX_BREADTH = "-bfs-max-breadth"; /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ BubbleFinder::BubbleFinder (IProperties* props, const Graph& graph, Stats& stats) : graph(graph), stats(stats), _terminator(0), _outputBank(0), _traversal(0), _synchronizer(0) { assert (props != 0); /** We retrieve the kmer size. */ sizeKmer = graph.getKmerSize(); /** We set attributes according to user choice. */ accept_low = props->get (STR_DISCOSNP_LOW_COMPLEXITY) != 0; authorised_branching = props->getInt (STR_DISCOSNP_AUTHORISED_BRANCHING); max_indel_size = props->getInt (STR_MAX_INDEL_SIZE); max_indel_ambiguity = props->getInt (STR_MAX_AMBIGOUS_INDELS); max_polymorphism = props->getInt (STR_MAX_POLYMORPHISM); max_sym_branches = props->getInt (STR_MAX_SYMMETRICAL_CROSSROADS); accept_truncated_bubbles = props->get (STR_RADSEQ) != 0; max_truncated_path_length_difference = props->getInt (STR_MAX_TRUNCATED_PATH_LENGTH_DIFFERENCE); max_depth = props->getInt (STR_BFS_MAX_DEPTH); max_recursion_depth=1000; // TODO: parameter? max_breadth = props->getInt (STR_BFS_MAX_BREADTH); /** We set the traversal kind. */ traversalKind = TRAVERSAL_NONE; if (props->get(STR_DISCOSNP_TRAVERSAL_UNITIG) != 0) { traversalKind = TRAVERSAL_UNITIG; } if (props->get(STR_DISCOSNP_TRAVERSAL_CONTIG) != 0) { traversalKind = TRAVERSAL_CONTIG; } /** We set the name of the output file. */ stringstream ss; ss << props->getStr(STR_URI_OUTPUT);// << "_k_" << sizeKmer << "_c_" << graph.getInfo().getInt("abundance"); // ss << "_D_"< successors = graph.successors (node); if(successors.size() != 1) return Node(~0); // depth 1 for (int d=2; d>1)&3; } void clear_queue_pair( std::queue > &q ) { std::queue > empty; std::swap( q, empty ); } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : breadth first search (queue already stored in the bubbleFinder class. Then limit the queue size. Thus early possible bubbles are tested even if longer insers are too complex to be treated. *********************************************************************/ void BubbleFinder::start_indel_prediction(){ if (max_indel_size==0) return; // no need to try to find indels bubble.type=1; // Consider a deletion in the upper path (avance on the lower) and then try the opposite Node current; int found_del_size=max_indel_size+10; // No indel found for now (we could also use MAXINT) for(int extended_path_id=0;extended_path_id<2;extended_path_id++){ // nb_snp_start++; // cout<<"nb_snp_start "<(current, string(""))); while(!breadth_first_queue.empty()){ // TODO maybe we could stop the whole breadth first search in case a bubble was found at a found_del_size and the current insert_size is <= found_del_size-2 DEBUG((cout<<"queue size "<max_recursion_depth){ clear_queue_pair(breadth_first_queue); break; // This bubble is too complex, we stop. } pair element=breadth_first_queue.front(); breadth_first_queue.pop(); DEBUG((cout<<"and now queue size "< found_del_size) { continue; } if (end_insertion == graph.toString(current)[sizeKmer-1] ){ DEBUG((cout<<"start an INDEL detection "< successors = graph.successors (current); /** No branching authorized in the insertion mode. */ if (successors.size()>1 && authorised_branching==0) { clear_queue_pair(breadth_first_queue); break; // ...and stop } /** checks if a successor with the good starting letter (the one potentially closing the indel) exists */ bool exists; Node successor = graph.successor(current,(Nucleotide)NT2int(end_insertion),exists); if(exists) breadth_first_queue.push(pair(successor,tried_extension+end_insertion)); /** then checks for the other possible extensions */ for (size_t successor_id=0; successor_id(successors[successor_id], tried_extension+graph.toString(successors[successor_id])[sizeKmer-1])); } } } } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ template<> void BubbleFinder::start (Bubble& bubble, const BranchingNode& node) { this->bubble=bubble; DEBUG ((cout << "[BubbleSNPFinder::start] BRANCHING NODE " << graph.toString(node) << endl)); DEBUG ((cout << "[BubbleSNPFinder::start] bubble.isCanonical " << bubble.isCanonical << endl)); /** We compute the successors of the node. */ GraphVector successors = graph.successors((Node&)node); DEBUG((cout << "successor size"< s1 and b1 -> s2 and b2 -> s1 and b2 -> s2), then // we need to construct the bubble s1... s2... from only one of the two branching nodes b1 or b2. // We chose the smallest from all the possible starting nodes to start a bubble. GraphVector predecessors = graph.predecessors (successors[i]); if (predecessors.size()>1) { for (size_t k=0; k successors; for (int depth=0;depth1) return false; // right branching, returns false if (graph.indegree(node)>1) return false; // left branching, returns false. if (successors.size()==0) return true; // path ends, return true node = successors[0]; local_extended_string+=ascii(graph.getNT(successors[0],sizeKmer-1)); size_extension++; } // the loop stops one step latter, meaning that if we arrive here, the path if of length max_depth+1, longer than max_depth. return false; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : True if expended, else return false ** REMARKS : *********************************************************************/ bool BubbleFinder::expand ( const int nb_polymorphism, Node node1, // Node currently tested Node node2, // Node currently tested Node previousNode1, // node before the one tested Node previousNode2, // node before the one tested string local_extended_string1, string local_extended_string2, int sym_branches, // number of symmetrically branchings traversed (used in b 2 mode) int stack_size ) { DEBUG((cout<<" *"< > successors; while (true){ if (checkBranching(node1,node2, sym_branches) == false) return false; // no possibility to continue successors = graph.successors (node1, node2); // get next two nodes if (successors.size() != 1) break; // no more iterative programming if (successors[0].first == successors[0].second) { break; // ended bubble } bool checkPrevious = checkNodesDiff (previousNode1, node1, successors[0].first) && checkNodesDiff (previousNode2, node2, successors[0].second); if (!checkPrevious){return false;} local_extended_string1+=ascii(graph.getNT(successors[0].first,sizeKmer-1)); // extend upper sequence with new character local_extended_string2+=ascii(graph.getNT(successors[0].second,sizeKmer-1));// extend lower sequence with new character previousNode1 = node1; // change currents and previous nodes previousNode2 = node2; // change currents and previous nodes node1 = successors[0].first; // change currents and previous nodes node2 = successors[0].second; // change currents and previous nodes } /**************** END OPTIMIZATION *****************************************/ /****************************************************************************/ /** We may have to stop the extension according to the branching mode. */ if (checkBranching(node1,node2, sym_branches) == false) { return false; } bool dumped_bubble=false; /*************************************************/ /** RADseq: We check if the bubble is truncated **/ /*************************************************/ int equal_zone_lenght=3; // TODO: make a parameter please. const int suc1=graph.successors(node1).size(); const int suc2=graph.successors(node2).size(); if(accept_truncated_bubbles && (suc1==0 || suc2==0)) // If end of at least the two paths and if one asks for truncated bubbles. { //We check that the last 3 nt are similar on the two truncated paths for (int i=0;i > successors = graph.successors (node1, node2); DEBUG((cout<<"successors size "< successors1 = graph.successors (node1); GraphVector < Node > successors2 = graph.successors (node2); /** We loop over the successors of the two nodes found with distinct extending nucleotides. */ for (size_t i1=0; i1 successors = graph.successors (bubble.end[0]); GraphVector predecessors = graph.predecessors (bubble.begin[0]); /** We need to reset branching nodes between extensions in case of overlapping extensions. */ _terminator->reset (); /** If unique, we keep the left/right extensions. */ if (successors.size()==1) { /** We compute right extension of the node. */ closureRight = graph.getNT (successors [0], sizeKmer-1); _traversal->traverse (successors[0], DIR_OUTCOMING, bubble.extensionRight); bubble.divergenceRight = _traversal->getBubbles().empty() ? bubble.extensionRight.size() : _traversal->getBubbles()[0].first; } if (predecessors.size()==1) { /** We compute left extension of the node. */ closureLeft = graph.getNT (predecessors[0], 0); Node rev_pred = graph.reverse(predecessors[0]); _traversal->traverse (rev_pred, DIR_OUTCOMING, bubble.extensionLeft); bubble.divergenceLeft = _traversal->getBubbles().empty() ? bubble.extensionLeft.size() : _traversal->getBubbles()[0].first; } } /** We return a code value according to left/right extensions status. */ if (closureLeft==NUCL_UNKNOWN && closureRight==NUCL_UNKNOWN) { bubble.where_to_extend = 0; } else if (closureLeft!=NUCL_UNKNOWN && closureRight==NUCL_UNKNOWN) { bubble.where_to_extend = 1; } else if (closureLeft==NUCL_UNKNOWN && closureRight!=NUCL_UNKNOWN) { bubble.where_to_extend = 2; } else if (closureLeft!=NUCL_UNKNOWN && closureRight!=NUCL_UNKNOWN) { bubble.where_to_extend = 3; } bubble.closureLeft = closureLeft; bubble.closureRight = closureRight; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ void BubbleFinder::finish (const int disymetrical_end_size) { /** We build two Sequence objects from the information of the bubble. */ /** We set the bubble index. NOTE: We have to make sure it is protected against concurrent * accesses since we may be called here from different threads. */ if (bubble.type==0) __sync_add_and_fetch (&(stats.nb_bubbles_snp), 1); if (bubble.type==1) __sync_add_and_fetch (&(stats.nb_bubbles_del), 1); bubble.index = __sync_add_and_fetch (&(stats.nb_bubbles), 1); /** compute the bubble paths */ string path_0 = graph.toString (bubble.begin[0])+bubble.extended_string[0]; string path_1 = graph.toString (bubble.begin[1])+bubble.extended_string[1]; stringstream comment; if ( bubble.polymorphism_type=="SNP" ){ int polymorphism_id=1; for (unsigned int i=0;i1) { comment << ","; } comment<<"P_" << polymorphism_id << ":" << i << "_" << path_0[i] << "/" << path_1[i]; polymorphism_id++; } } } if ( bubble.polymorphism_type=="INDEL" ){ // if disymetrical_end_size>0: path0 has been extended more than path1 // if disymetrical_end_size<0: path1 has been extended more than path0 int p0=path_0.length(),p1=path_1.length(); int bes0=bubble.extended_string[0].length(), bes1=bubble.extended_string[1].length(); if (disymetrical_end_size>0){ p0-=disymetrical_end_size; bes0-=disymetrical_end_size; } if (disymetrical_end_size<0){ p1+=disymetrical_end_size; bes1+=disymetrical_end_size; } const int insert_size = p0insert (bubble.seq1); _outputBank->insert (bubble.seq2); /** Stats update (in concurrent access protection block). */ // stats.nb_bubbles++; if (bubble.type==0){ stats.nb_where_to_extend_snp[bubble.where_to_extend] ++; if (bubble.high_complexity) { stats.nb_bubbles_snp_high++; } else { stats.nb_bubbles_snp_low++; } if (bubble.truncated) { stats.nb_bubbles_snp_truncated++; } } if (bubble.type==1){ stats.nb_where_to_extend_del[bubble.where_to_extend] ++; if (bubble.high_complexity) { stats.nb_bubbles_del_high++; } else { stats.nb_bubbles_del_low++; } } } } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ bool BubbleFinder::two_possible_extensions_on_one_path (Node& node) const { return graph.indegree(node)>1 || graph.outdegree(node)>1; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ bool BubbleFinder::two_possible_extensions (Node node1, Node node2) const { return graph.successorsEdge (node1, node2).size() >= 2 || graph.successorsEdge (graph.reverse (node1),graph.reverse (node2)).size() >= 2; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ void BubbleFinder::buildSequence ( size_t pathIdx, const char* type, Sequence& seq, string polymorphism_comments) { stringstream commentStream; /** We build the comment for the sequence. */ commentStream << bubble.polymorphism_type << "_" << type << "_path_" << bubble.index << "|" << polymorphism_comments << "|" << (bubble.high_complexity ? "high" : "low")<< "|nb_pol_" <1 ? (bubble.extensionRight.size()+1) : 0); } if (traversalKind == TRAVERSAL_CONTIG) { commentStream << "|left_unitig_length_"; commentStream << (bubble.where_to_extend%2==1 ? (bubble.divergenceLeft +1) : 0); commentStream << "|right_unitig_length_"; commentStream << (bubble.where_to_extend>1 ? (bubble.divergenceRight+1) : 0); commentStream << "|left_contig_length_"; commentStream << (bubble.where_to_extend%2==1 ? (bubble.extensionLeft.size() +1) : 0); commentStream << "|right_contig_length_"; commentStream << (bubble.where_to_extend>1 ? (bubble.extensionRight.size()+1) : 0); } /** We assign the comment of the sequence. */ seq.setComment (commentStream.str()); size_t lenLeft = bubble.extensionLeft.size (); size_t lenRight = bubble.extensionRight.size (); size_t len = sizeKmer + bubble.extended_string[pathIdx].length(); if (bubble.closureLeft != NUCL_UNKNOWN) { len += 1 + lenLeft; } if (bubble.closureRight != NUCL_UNKNOWN) { len += 1 + lenRight; } /** We resize the sequence data if needed. Note: +1 for ending '\0' * NOTE: we use resize if we need more space, setSize otherwise. */ if (seq.getData().size() < len+1) { seq.getData().resize (len+1); } else { seq.getData().setSize (len+1); } char* output = seq.getDataBuffer(); /** We add the left extension if any. Note that we use lower case for extensions. */ if (bubble.closureLeft != NUCL_UNKNOWN) { for (size_t i=0; i 0 central string is empty **/ for (size_t i=0; i CCTG -> CTGG -> TGGG -> GGGA ---------------------> extended string is GGG (size k-1) * ACCT -> CCTX -> CTXX -> TXXG -> XXGG -> XGGG -> GGGA ------> extended string is XXGGG (size k-1+size insert * * Extreme case: * ACCTGGGA * ACCT|GGGA|GGGA * * ACCT->CCTG->CTGG->TGGG->GGGA->GGAX ------------------------------> extended string is empty (size 0 = k-1-ambiguity => ambiguity=k-1) * ACCT->CCTG->CTGG->TGGG->GGGA->GGAG->GAGG->AGGG->GGGA->GAAX ------> extended string is AGGG (size k = k-1-ambiguity+size_ins = k-1-(k-1)+k => insertion of length k **/ const int size_repeat = sizeKmer-2-min(extension1.length(), extension2.length()); if (size_repeat>max_indel_ambiguity) { return false; } return true; } /********************************************************************* ** METHOD : BubbleFinder::checkBranching ** PURPOSE : Checks the branching properties of a couple of nodes. If authorised_branching==0: no branching is authorized in any of the two nodes. ** If authorised_branching==1: no symetrical branching authorized from the two nodes (ie. N1-->A and N1-->B and N2-->A and N2-->B not authorized) ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ bool BubbleFinder::checkBranching (Node& node1, Node& node2, int & sym_branches) const { // stop the extension if authorised_branching==0 (not branching in any path) and any of the two paths is branching if (authorised_branching==0 && (two_possible_extensions_on_one_path(node1) || two_possible_extensions_on_one_path(node2))) { return false; } const bool two_extensions = two_possible_extensions (node1, node2); // stop the extension if authorised_branching==1 (not branching in both path) and both the two paths are branching if (authorised_branching==1 && two_extensions) { return false; } // stop the extension if authorised_branching=2 and too much nrabching crossroads were traversed. if (authorised_branching==2 && two_extensions){ if (sym_branches==max_sym_branches) {return false;} // We saw already too much symmetrically branching crossreads sym_branches++; } return true; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ void BubbleFinder::checkLowComplexity () { bubble.acceptable_complexity=true; string path1 = graph.toString (bubble.begin[0]).substr(0, sizeKmer-1) + graph.toString (bubble.end[0]); string path2 = graph.toString (bubble.begin[1]).substr(0, sizeKmer-1) + graph.toString (bubble.end[1]); /** We compute the low complexity score of the two paths. */ bubble.high_complexity = filterLowComplexity2Paths (path1, path2); if (accept_low) return; // the complexity is acceptable for this bubble anyway. bubble.acceptable_complexity=bubble.high_complexity; DEBUG((cout<<"check low "<add (0, "config", ""); props->add (1, "kmer_size", "%d", sizeKmer); props->add (1, "auth_branch", "%d", authorised_branching); props->add (1, "max_indel_size", "%d", max_indel_size); props->add (1, "max_polymorphism", "%d", max_polymorphism); props->add (1, "low", "%d", accept_low); props-> add (1, "rad", "%d", accept_truncated_bubbles); props->add (1, "traversal", "%s", toString (traversalKind).c_str()); if (accept_truncated_bubbles){ props->add(1, "radseq mode", ""); props->add(2, "max_truncated_path_length_difference", "%d", accept_truncated_bubbles); } return props; } /********************************************************************************/ /******************************** SNPs ******************************************/ /********************************************************************************/ DiscoSnp-2.6.2/tools/kissnp2/src/Bubble.hpp000066400000000000000000000372771420021152700205010ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ #ifndef _TOOL_BUBBLE_HPP_ #define _TOOL_BUBBLE_HPP_ /********************************************************************************/ #include #include /********************************************************************************/ /** We define string constants for command line options. */ #define STR_MAX_AMBIGOUS_INDELS "-max_ambigous_indel" #define STR_DISCOSNP_LOW_COMPLEXITY "-l" #define STR_DISCOSNP_AUTHORISED_BRANCHING "-b" #define STR_DISCOSNP_TRAVERSAL_UNITIG "-t" #define STR_DISCOSNP_TRAVERSAL_CONTIG "-T" #define STR_KISSNP2_COVERAGE_FILE_NAME "-coverage_file" #define STR_KISSNP2_DONT_OUTPUT_FIRST_COV "-dont_output_first_coverage" #define STR_MAX_INDEL_SIZE "-D" #define STR_MAX_POLYMORPHISM "-P" #define STR_MAX_SYMMETRICAL_CROSSROADS "-max_symmetrical_crossroads" #define STR_RADSEQ "-x" #define STR_MAX_TRUNCATED_PATH_LENGTH_DIFFERENCE "-max_truncated_path_length_difference" /********************************************************************************/ /** We define a structure holding all the information about a bubble. */ struct Bubble { // Here is a description of the attributes defining a bubble. // // begin end // ------X X------ <-- branch1 (X is the common nucleotide between the 2 nodes) // ------Y Y------ <-- branch2 (Y is the common nucleotide between the 2 nodes) // // => the bubble is defined by two branches // // => a branch is defined by two nodes [begin,end] that overlap on one nucleotide // so the path length defined by these two nodes is (2*kmerSize - 1) Node begin[2]; Node end [2]; // A Bubble may represent a SNP or a deletion (currently). // SNP case: // ---A // A--- // and // ---T // T--- // We have 2 upper nodes (begin[0] and end[0]) overlaping by 1 nucleotides // We have 2 lower nodes (begin[1] and end[1]) overlaping by 1 nucleotides // Thus in the SNP case, size_overlap[0] == size_overlap[1] == 1 // In the DELETION case: // 123456 // 123IiiiY456 (I is the insertion here of length 5) // The output is : one path: // 1234 (k=4) // 3456 // other path: // 123I and Y456 // In this case we store // begin[0]=1234 end[0]=3456 size_overlap[0]=2 // and begin[1]=123I end[1]=Y456 size_overlap[1]=0 and we store the insertion removing hte first and last character (iii in this example). // strings storing central information coming after the first node of a path. std::string extended_string[2]; std::string polymorphism_type; // is this bubble of high complexity. bool high_complexity; /** indicates if the bubble passes the complexity filter (high complexity or don't care about complexity) */ bool acceptable_complexity; /** indicates when a predicted bubble is finished, if it is canonical */ bool isCanonical; /** indicates that a bubble had been closed. Maybe it was not dumped if the bubble was not canonical */ bool closed_bubble; /** in rad seq mode: is this bubble truncated **/ bool truncated; int type; // 0 = isolated SNP, 1 = isolated insertion, ... other to come int final_nb_polymorphism; // number of SNPs in a bubble, could be one (isolated SNP or an insertion) or more (an indel+n SNPs (n+1)) or n SNPs (n) // Index of the bubble size_t index; // Information about the bubble extension: 0=nothing, 1=left only, 2=right only, 3=both int where_to_extend; // Closing right nucleotide of the bubble Nucleotide closureRight; // Closing left nucleotide of the bubble Nucleotide closureLeft; // Unitig/Contig path on the right of the bubble. Path extensionRight; // Unitig/Contig path on the left of the bubble. Path extensionLeft; // Length of the right and left unitigs // - if the traversal is a simple traversal, then this length is equal to the length of the extension // - else (if the traversal is a monument traversal), then this length is equal to the starting position of the first bubble (if exist)) size_t divergenceLeft; size_t divergenceRight; // Sequence instances to be configured and then dumped in the output bank. Sequence seq1; Sequence seq2; }; /********************************************************************************/ /** \brief class that tries to build a bubble from a starting node * * This class does all the job for expanding a bubble from a starting node if possible and * potentially extend it with right and left unitigs/contigs. * * This class is intended to be instantiated N times, one per thread. * * The starting node is provided to the operator() (so, one can see this class as a functor). */ class BubbleFinder { public: /** We define a structure gathering information during bubble detection. */ struct Stats { Stats () : nb_bubbles(0), nb_bubbles_snp(0), nb_bubbles_snp_high(0), nb_bubbles_snp_low(0), nb_bubbles_del(0), nb_bubbles_del_high(0), nb_bubbles_del_low(0), nb_bubbles_snp_truncated(0) { memset (nb_where_to_extend_snp, 0, sizeof(nb_where_to_extend_snp)); memset (nb_where_to_extend_del, 0, sizeof(nb_where_to_extend_del)); } size_t nb_bubbles; size_t nb_bubbles_snp; size_t nb_bubbles_snp_high; size_t nb_bubbles_snp_low; size_t nb_bubbles_snp_truncated; size_t nb_where_to_extend_snp[4]; size_t nb_bubbles_del; size_t nb_bubbles_del_high; size_t nb_bubbles_del_low; size_t nb_where_to_extend_del[4]; }; /** Constructor. */ BubbleFinder (IProperties* props, const Graph& graph, Stats& stats); /** Copy constructor. It will be used when cloning N times the instance by the dispatcher * \param[in] bf : instance to be copied.*/ BubbleFinder (const BubbleFinder& bf); /** Destructor. */ ~BubbleFinder (); /** Starting method that gets a node as argument and tries to build a bubble from it. * NOTE: defined as a template, because we can use either Node or BranchingNode instances * as starting nodes. See also 'start' method, which is template too, with too possible * specializations: one for Node, one for BranchingNode * \param[in] node : the starting node. */ template void operator() (const T& node) { /** We start the SNP in both directions (forward and reverse). */ start (bubble, node); start (bubble, graph.reverse(node)); } /** Get a properties object with the configuration of the finder. */ IProperties* getConfig () const; /** Constants */ static const char* STR_BFS_MAX_DEPTH; static const char* STR_BFS_MAX_BREADTH; protected: /** */ const Graph& graph; /** Statistics about the bubbles lookup. */ Stats& stats; /** Current Bubble instance built by this BubbleFinder instance. */ Bubble bubble; /** Shortcut attribute for the kmer size of the de Bruijn graph. */ size_t sizeKmer; /** Maximal number of polymorphism per bubble. Isolated = zero **/ int max_polymorphism; /** Max deletion size **/ int max_indel_size; /** Max indel size **/ int max_indel_ambiguity; bool accept_low; // Option set: do we accept low complexity bubbles bool accept_truncated_bubbles; //CHARLOTTE Option set: we accept truncated bubbles (for radseq sequencing) std::queue > breadth_first_queue; int max_recursion_depth; int current_recursion_depth; int max_depth; // for unitigs/contigs extensions int max_breadth; // for unitigs/contigs extensions /* authorised_branching = * 0: branching forbidden in any path * 1: same branching on both path forbidden (i.e. 2 distinct nucleotides may be used in both paths for extension) * 2: no restriction on branching */ int authorised_branching; /** In b 2: maximaml number of symetrically branches traversed while walking the bubble**/ int max_sym_branches; /** RAD MODE: Longest accepted difference length between two paths of a truncated bubble */ int max_truncated_path_length_difference; /** Gives the kind of traversal to be done at left/right of the bubble. */ TraversalKind traversalKind; /** Output bank of the bubbles (as a pair of sequences). Note here: we use the IBank * interface here, and not a specific implementation (like BankFasta), so we could * deal with different kinds of banks. */ IBank* _outputBank; void setOutputBank (IBank* outputBank) { SP_SETATTR(outputBank); } /** We need a synchronizer for dumping the sequences into the output bank. */ ISynchronizer* _synchronizer; void setSynchronizer (ISynchronizer* synchronizer) { SP_SETATTR(synchronizer); } /** Terminator for marking branching nodes (used by the Traversal instance) */ BranchingTerminator* _terminator; void setTerminator (BranchingTerminator* terminator) { SP_SETATTR(terminator); } /** Used for computing unitigs or contigs (according to traversal kind choice) at the left * and right of the bubble. */ Traversal* _traversal; void setTraversal (Traversal* traversal) { SP_SETATTR(traversal); } /** Start a bubble detection from a given node. This node is mutated (its last nucleotide) in a * second node, and so this couple of nodes is set as the starting branch of a potential bubble. * NOTE: defined as template, with 2 specializations: one for Node, one for BranchingNode (see cpp file) * \param[in] node : the starting node. */ template void start (Bubble& bubble, const T& node); /** Extension of a bubble given two nextNodes to be tested. * */ bool expand_heart( const int nb_polymorphism, Node& nextNode1, Node& nextNode2, Node& node1, Node& node2, Node& previousNode1, Node& previousNode2, std::string local_extended_string1, std::string local_extended_string2, int sym_branches, int stack_size, const int dissyetrical_end_size ); /** Extension of a single single node. Extension is non branching and stops after max_depth path. Returns true if the created path if smaller or equal to max_depth. * */ bool expand_one_simple_path ( Node& node, // Node currently tested string& local_extended_string, // add nucleotides to this string const int max_depth, // maximal size of the path int & size_extension ); /** Extension of a bubble by testing extensions from both branches of the bubble. * */ bool expand (const int nb_polymorphism, Node node1, // In case of indels, this node is the real extended one, but we keep it at depth 1 Node node2, // In case of indels, this node is not extended (depth 1) Node previousNode1, Node previousNode2, std::string local_extended_string1, std::string local_extended_string2, int sym_branches, int stack_size); /** Extend the bubble to the left/right with a small assembly part of the de Bruijn graph. * \return true if the bubble has been extended, false otherwise. */ void extend (); /** Finish the bubble, ie output the pair of sequences in the output bank. * \param[in] bubble: bubble to be dumped in the output bank */ void finish (const int dissyetrical_end_size); /** Check whether new node is similar to two previous nodes. * \param[in] previous : previous node * \param[in] current : current node * \param[in] next : next node * \return true if next node is different to current and previous nodes.*/ bool checkNodesDiff (Node& previous, Node& current, Node& next) const; /** Check whether the first kmer of the first path is smaller than the first kmer * of the revcomp(first path), this avoids repeated SNPs * \param[in] path : branch of a bubble. * \return set isCanonical to true if first path is lower than last reverse path. */ void checkPath (); /** Check bubble according to user choice for branching. * \param[in] node 1 : bubble branch last node * \param[in] node 2 : bubble branch last node * \return true if bubble is ok */ bool checkBranching (Node& node1, Node& node2, int & sym_branches) const; /** Check that indel bubbles respect the maximal size of the position ambiguity */ bool checkRepeatSize (string &extension1, string &extension2) const; /** Check complexity for a bubble. * \param[in] path1 : branch of the bubble * \param[in] path2 : branch of the bubble * set acceptable_complexity to true if the complexity is ok or if we accept low complexity bubbles. */ void checkLowComplexity (); /** Fill a Sequence object for a given branch of a bubble. * \param[in] path : branch of the bubble. * \param[in] type : used to set the comment part of the sequence (likely 'higher' or 'lower') * \param[in] score : score for the bubble. * \param[in] where_to_extend : got from 'extend' method. * \param[in] seqIndex : index of the sequence (more exactly index for the pair of sequences) * \param[out] seq : sequence to be filled */ void buildSequence (size_t pathIdx, const char* type, Sequence& seq, std::string polymorphism_comments); /** */ bool two_possible_extensions_on_one_path (Node& node) const; bool two_possible_extensions (Node node1, Node node2) const; private: bool recursive_indel_prediction( int extended_path_id, std::string tried_extension, Node current, size_t insert_size, const char end_insertion); void start_snp_prediction(); void start_indel_prediction(); }; #endif /* _TOOL_BUBBLE_HPP_ */ DiscoSnp-2.6.2/tools/kissnp2/src/Filter.cpp000066400000000000000000000046151420021152700205140ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ #include #include using namespace std; static int NT2int(char nt) { return (nt>>1)&3; } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : True if the sequence is of high complexity else return false ** REMARKS : TODO: comment and validate this function. *********************************************************************/ bool filterLowComplexityPath(const std::string& seq){ int DUSTSCORE[64]; // all tri-nucleotides for (int i=0; i<64; i++) DUSTSCORE[i]=0; size_t lenseq = seq.size(); for (int j=2; j. *****************************************************************************/ #ifndef FILTER_H #define FILTER_H #include /********************************************************************************/ bool filterLowComplexity2Paths (const std::string& seq1, const std::string& seq2); bool filterLowComplexityPath (const std::string& seq); /********************************************************************************/ #endif DiscoSnp-2.6.2/tools/kissnp2/src/Kissnp2.cpp000066400000000000000000000241551420021152700206210ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ #include #include using namespace std; /******************************************************************************** * * A QUICK OVERVIEW OF THE CLASS... * * This class implements the detection of SNP in a provided de Bruijn graph. * * It is implemented as a subclass of Tool, so we get all the facilities of the * Tool class. We can therefore see two main parts here: * * 1) constructor: we define all the command line parameters available * * 2) 'execute' method: this is the main method of the class where the main loop * (ie. iteration over nodes of the graph) is done. * ********************************************************************************/ /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ Kissnp2::Kissnp2 () : Tool ("Kissnp2") { /** We add options known by kissnp2. */ getParser()->push_front (new OptionNoParam (STR_DISCOSNP_LOW_COMPLEXITY, "conserve low complexity SNPs", false)); getParser()->push_front (new OptionOneParam (STR_MAX_AMBIGOUS_INDELS, "Maximal size of ambiguity of INDELs. INDELS whose ambiguity is higher than this value are not output", false, "20")); getParser()->push_front (new OptionOneParam (STR_DISCOSNP_AUTHORISED_BRANCHING, "branching mode\n" "\t\t0: forbid SNPs for which any of the two paths is branching (high precision, low recall)\n" "\t\t1: forbid SNPs for which the two paths are branching (e.g. the two paths can be created either with a 'A' or a 'C' at the same position (default value)\n" "\t\t2: No limitation on branching (low precision, high recall)", false, "1")); getParser()->push_front (new OptionOneParam (STR_MAX_SYMMETRICAL_CROSSROADS,"In b2 mode only: maximal number of symmetrical croasroads traversed while trying to close a bubble. Default: no limit", false, "-1")); getParser()->push_front (new OptionNoParam (STR_DISCOSNP_TRAVERSAL_UNITIG, "extend found and stop at first polymorphism (strict extension=unitigs) SNPs. Uncompatible with -T", false)); getParser()->push_front (new OptionNoParam (STR_DISCOSNP_TRAVERSAL_CONTIG, "extend found and stop at large polymorphism (extension=contigs) SNPs. Uncompatible with -t", false)); getParser()->push_front (new OptionOneParam (STR_URI_OUTPUT, "output name", true)); getParser()->push_front (new OptionOneParam (STR_KISSNP2_COVERAGE_FILE_NAME, "File (.h5) generated by kissnp2, containing the coverage threshold per read set", false, "_removemeplease")); getParser()->push_front (new OptionOneParam (STR_URI_INPUT, "input file (likely a hdf5 file)", true)); getParser()->push_front (new OptionNoParam (STR_KISSNP2_DONT_OUTPUT_FIRST_COV, "Don't output the first coverage threshold. Use this option when the reference file is used for finding the variants", false)); getParser()->push_front (new OptionOneParam (STR_MAX_INDEL_SIZE, "maximal size of a predicted indel", false, "0")); getParser()->push_front (new OptionOneParam (STR_MAX_POLYMORPHISM, "maximal number of polymorphism per bubble", false, "1")); getParser()->push_back (new OptionOneParam (BubbleFinder::STR_BFS_MAX_DEPTH, "maximum depth for BFS", false, "200")); getParser()->push_back (new OptionOneParam (BubbleFinder::STR_BFS_MAX_BREADTH, "maximum breadth for BFS", false, "20")); getParser()->push_front (new OptionNoParam (STR_RADSEQ, "keep truncated bubbles, that have no successors on the 2 paths at the same position", false)); getParser()->push_back (new OptionOneParam (STR_MAX_TRUNCATED_PATH_LENGTH_DIFFERENCE, "Longest accepted difference length between two paths of a truncated bubble", false, "0")); } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ /* * // We load a Storage product "foo" in HDF5 format // It must have been created with the storage1 snippet Storage* storage = StorageFactory(STORAGE_HDF5).load ("foo"); LOCAL (storage); // Shortcut: we get the root of this Storage object Group& root = storage->root(); // We get a collection of native integer from the storage. Collection& myIntegers = root.getCollection ("myIntegers"); // We create an iterator for our collection. Iterator* iter = myIntegers.iterator(); LOCAL (iter); // Now we can iterate the collection through this iterator. for (iter->first(); !iter->isDone(); iter->next()) { cout << iter->item() << endl; } */ void Kissnp2::execute () { Dispatcher::Status status; u_int64_t nbNodes = 0; /** We load the graph from the provided uri. */ string input_graph = "-in "+getInput()->getStr(STR_URI_INPUT)+" -no-mphf"; Graph graph = Graph::create(input_graph.c_str()); // DEBUG // cout<<"INFOS: "< ite = graph.iterator (); // // We loop each node. Note the structure of the for loop. // for (ite.first(); !ite.isDone(); ite.next()) // { // // The currently iterated node is available with it.item() // // We dump an ascii representation of the current node. // std::cout << graph.toString (ite.item()) << std::endl; // } istringstream iss(graph.getInfo().getStr("thresholds")); /** We store in a _removemeplease.txt file the used coverages */ // We create a Storage product "_removemeplease.h5" in HDF5 format Storage* storage = StorageFactory(STORAGE_HDF5).create (getInput()->getStr(STR_KISSNP2_COVERAGE_FILE_NAME), true, false); LOCAL (storage); Group& root = storage->root(); Collection& myIntegers = root.getCollection ("cutoffs"); int n; if (getInput()->get (STR_KISSNP2_DONT_OUTPUT_FIRST_COV) != 0) iss >> n; //Don't output the first coverage value while (iss >> n) myIntegers.insert (n); myIntegers.flush(); /** We want to get some statistics about the execution. */ BubbleFinder::Stats stats; /** We create an instance of BubbleFinder, used as a functor by the dispatcher. * This instance will be cloned N times, one per thread created by the dispatcher. */ BubbleFinder bubbleFinder (getInput(), graph, stats); /** THIS IS THE MAIN ITERATION LOOP... We launch the iteration over all the branching nodes of the graph. * Each iterated node is sent in one of N threads where it is provided to the operator() method * of one of the N BubbleFinder instance. */ /** We get an iterator over the branching nodes of the graph. */ ProgressGraphIterator it (graph.iteratorBranching(), "nodes"); /** We get the number of nodes. */ nbNodes = it.size(); /** We loop the nodes. */ status = getDispatcher()->iterate (it, bubbleFinder); /** We aggregate information for user. */ getInfo()->add (1, bubbleFinder.getConfig()); getInfo()->add (1, "nodes", ""); getInfo()->add (2, "nb", "%lu", nbNodes); getInfo()->add (1, "SNP bubbles", ""); getInfo()->add (2, "nb", "%lu", stats.nb_bubbles_snp); getInfo()->add (3, "nb truncated (among all)", "%lu", stats.nb_bubbles_snp_truncated); getInfo()->add (3, "nb_high", "%lu", stats.nb_bubbles_snp_high); getInfo()->add (3, "nb_low", "%lu", stats.nb_bubbles_snp_low); getInfo()->add (2, "extensions", ""); getInfo()->add (3, "none", "%d", stats.nb_where_to_extend_snp[0]); getInfo()->add (3, "left", "%d", stats.nb_where_to_extend_snp[1]); getInfo()->add (3, "right", "%d", stats.nb_where_to_extend_snp[2]); getInfo()->add (3, "left|right", "%d", stats.nb_where_to_extend_snp[3]); getInfo()->add (1, "Indel bubbles", ""); getInfo()->add (2, "nb", "%lu", stats.nb_bubbles_del); getInfo()->add (2, "nb_high", "%lu", stats.nb_bubbles_del_high); getInfo()->add (2, "nb_low", "%lu", stats.nb_bubbles_del_low); getInfo()->add (2, "extensions", ""); getInfo()->add (3, "none", "%d", stats.nb_where_to_extend_del[0]); getInfo()->add (3, "left", "%d", stats.nb_where_to_extend_del[1]); getInfo()->add (3, "right", "%d", stats.nb_where_to_extend_del[2]); getInfo()->add (3, "left|right", "%d", stats.nb_where_to_extend_del[3]); getInfo()->add (1, "time", ""); getInfo()->add (2, "find", "%d", status.time); } DiscoSnp-2.6.2/tools/kissnp2/src/Kissnp2.hpp000066400000000000000000000033401420021152700206170ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ #ifndef _TOOL_KISSNP2_HPP_ #define _TOOL_KISSNP2_HPP_ /********************************************************************************/ #include /********************************************************************************/ /** \brief Tool class that looks for SNP * * The Kissnp2 is the front class for SNP detection in a provided de Bruijn graph. * The output is a bank with pairs of sequences defining a bubble. */ class Kissnp2 : public Tool { public: /** Constructor. */ Kissnp2 (); /** Implementation of Tool::execute method. */ void execute (); }; /********************************************************************************/ #endif /* _TOOL_KISSNP2_HPP_ */ DiscoSnp-2.6.2/tools/kissnp2/src/main.cpp000066400000000000000000000032421420021152700202060ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2014 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /********************************************************************************/ #include using namespace std; /********************************************************************************/ int main (int argc, char* argv[]) { // We define a try/catch block in case some method fails (bad filename for instance) try { /** We execute the tool. */ Kissnp2().run (argc, argv); } catch (OptionFailure& e) { return e.displayErrors (cout); } catch (Exception& e) { cerr << "EXCEPTION: " << e.getMessage() << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } DiscoSnp-2.6.2/tools/kissreads2/000077500000000000000000000000001420021152700164475ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/kissreads2/.DS_Store000066400000000000000000000140041420021152700201310ustar00rootroot00000000000000Bud1spblobbpsrcbwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowPathbar  _{{335, 346}, {770, 436}}%1=I`myz{|}~srcvSrnlong  @ @ @ @ EDSDB ` @ @ @DiscoSnp-2.6.2/tools/kissreads2/CMakeLists.txt000066400000000000000000000016241420021152700212120ustar00rootroot00000000000000project(kissreads2) ################################################################################ # TOOL ################################################################################ # we get compilation definitions from the gatb-core part add_definitions (${gatb-core-flags}) # we give the headers directories from : # - from project source # - from GATB-CORE source include_directories (src ${gatb-core-includes}) # we define the files to be compiled file (GLOB_RECURSE ProjectFiles src/*) # we define the artifact to be built: the project binary add_executable (${PROJECT_NAME} ${ProjectFiles}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIRZ}) # we define which libraries to be linked with project binary target_link_libraries (${PROJECT_NAME} ${gatb-core-libraries}) # We copy the project binary to the 'bin' directory INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin)DiscoSnp-2.6.2/tools/kissreads2/src/000077500000000000000000000000001420021152700172365ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/kissreads2/src/Kissreads2.cpp000066400000000000000000000233111420021152700217540ustar00rootroot00000000000000// // Kissreads2.cpp // discoSnp_GATB // // Created by Pierre Peterlongo on 03/07/15. // Copyright (c) 2020 Pierre Peterlongo. All rights reserved. // #include using namespace std; /******************************************************************************** * * A QUICK OVERVIEW OF THE CLASS... * * This class implements the mapping of reads on kissnp predictions. * * It is implemented as a subclass of Tool, so we get all the facilities of the * Tool class. We can therefore see two main parts here: * * 1) constructor: we define all the command line parameters available * * 2) 'execute' method: this is the main method of the class where the main loop * (ie. iteration over nodes of the graph) is done. * ********************************************************************************/ /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ Kissreads2::Kissreads2 () : Tool ("Kissreads2") { /** We add options known by kissnp2. */ getParser()->push_front (new OptionNoParam (STR_KISSREADS_GENOTYPE, "Compute genotypes", false)); getParser()->push_front (new OptionNoParam (STR_KISSREADS_OUTPUT_FASTA, "Output standart Fasta. By default the output is formatted especially for the discoSnp++ pipeline", false)); getParser()->push_front (new OptionOneParam (STR_KISSREADS_SIZE_SEEDS, "Size of the used seeds (distinct from the size of k)", false, "25")); getParser()->push_front (new OptionOneParam (STR_KISSREADS_INDEX_STRIDE, "Index Stride", false, "2")); getParser()->push_front (new OptionOneParam (STR_KISSREADS_SIZE_K, "Size of k, used as minial overlap and kmer spanning read coherence", false, "31")); getParser()->push_front (new OptionOneParam (STR_KISSREADS_COVERAGE_FILE_NAME, "File (.h5) generated by kissnp2, containing the coverage threshold per read set", false, "_removemeplease")); getParser()->push_front (new OptionOneParam (STR_KISSREADS_MAX_HAMMING, "Maximal hamming distance authorized while mapping", false, "1")); getParser()->push_front (new OptionOneParam (STR_URI_OUTPUT_COHERENT, "Output coherent file name", true)); getParser()->push_front (new OptionOneParam (STR_URI_OUTPUT_UNCOHERENT, "Output uncoherent file name", false,"/dev/null")); getParser()->push_front (new OptionOneParam (STR_URI_READS_INPUT, "Input reads", true)); getParser()->push_front (new OptionOneParam (STR_URI_PREDICTION_INPUT, "Input predictions", true)); getParser()->push_front (new OptionNoParam (STR_RADSEQ, "[Experimental] Radseq option, homogeneous read depth along the prediction ", false)); //CHARLOTTE getParser()->push_front (new OptionNoParam (STR_PHASING, "[Experimental] Phase alleles mapped by the same (pair of) read(s)", false)); //CHARLOTTE } static u_int64_t extracted(vector &RMvector, GlobalValues &gv, FragmentIndex &index, int read_set_id) { return RMvector[read_set_id].map_all_reads_from_a_file(gv,index,read_set_id); } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ void Kissreads2::execute () { IProperties* props= getInput(); BankFasta predictions_bank = BankFasta(props->getStr(STR_URI_PREDICTION_INPUT)); // We declare a Bank instance. BankAlbum banks (props->getStr(STR_URI_READS_INPUT)); const std::vector& banks_of_queries = banks.getBanks(); u_int64_t nbReads = banks.estimateNbItems(); GlobalValues gv; gv.size_seeds= props->getInt (STR_KISSREADS_SIZE_SEEDS); gv.index_stride= props->getInt (STR_KISSREADS_INDEX_STRIDE); gv.minimal_read_overlap= props->getInt (STR_KISSREADS_SIZE_K); gv.number_of_read_sets= banks_of_queries.size(); gv.subst_allowed= props->getInt (STR_KISSREADS_MAX_HAMMING); // We load a Storage product "STR_KISSREADS_COVERAGE_FILE_NAME" in HDF5 format // It must have been created with the storage1 snippet Storage* storage = StorageFactory(STORAGE_HDF5).load (props->getStr (STR_KISSREADS_COVERAGE_FILE_NAME)); LOCAL (storage); // Shortcut: we get the root of this Storage object Group& root = storage->root(); // We get a collection of native integer from the storage. Collection& myIntegers = root.getCollection ("cutoffs"); stringstream sstring_cutoffs; if(myIntegers.getNbItems() != gv.number_of_read_sets) // No STR_KISSREADS_COVERAGE_FILE_NAME provided or wrong .H5 file { cout<<"\t WARNING: no coverage file provided or wrong number of read sets ("<* iterInt = myIntegers.iterator(); LOCAL (iterInt); // Now we can iterate the collection through this iterator. for (iterInt->first(); !iterInt->isDone(); iterInt->next()) { gv.min_coverage.push_back(iterInt->item().toInt()); sstring_cutoffs<item().toInt()<<" ";} } gv.compute_genotypes= props->get (STR_KISSREADS_GENOTYPE) != 0; gv.standard_fasta= props->get (STR_KISSREADS_OUTPUT_FASTA) != 0; gv.radseq_option= props->get (STR_RADSEQ) != 0; //CHARLOTTE gv.phasing= props->get (STR_PHASING) != 0; gv.set_mask_code_seed(); ofstream coherent_out; coherent_out.open( props->getStr(STR_URI_OUTPUT_COHERENT).c_str(), std::ofstream::out); ofstream uncoherent_out; uncoherent_out.open(props->getStr(STR_URI_OUTPUT_UNCOHERENT).c_str(), std::ofstream::out); getTimeInfo().start ("indexing"); FragmentIndex index(predictions_bank.estimateNbItems()); cout<<"Indexing bank "<getStr(STR_URI_PREDICTION_INPUT)< RMvector; size_t nb_cores = getDispatcher()->getExecutionUnitsNumber (); for (int read_set_id=0;read_set_id range (0,gv.number_of_read_sets-1); // We create an iterator over our integer range. // Note how we use the Tool::createIterator method. According to the value of the "-verbose" argument, // this method will add some progression bar if needed. Iterator* iter = createIterator (range, ""); LOCAL (iter); // Total number of mapped reads u_int64_t totalNumberOfMappedReads = 0; // We want to get execution time. We use the Tool::getTimeInfo() method for this. getTimeInfo().start ("mapping reads"); // We iterate the range through the Dispatcher we got from our Tool parent class. // The dispatcher is configured with the number of cores provided by the "-nb-cores" command line argument. for (int read_set_id=0;read_set_idadd (1, "Stats"); getInfo()->add (2, "Total Number of Mapped reads", "%ld", totalNumberOfMappedReads); getInfo()->add (2, "Minimal coverage per read set", sstring_cutoffs.str()); getInfo()->add (1, "Outputs"); getInfo()->add (2, "Number of read coherent predictions", "%ld", index.nb_coherent); getInfo()->add (2, "Number of read uncoherent predictions", "%ld", index.nb_uncoherent); getInfo()->add (1, getTimeInfo().getProperties("Time")); } DiscoSnp-2.6.2/tools/kissreads2/src/Kissreads2.h000066400000000000000000000031731420021152700214250ustar00rootroot00000000000000// // Kissreads2.h // discoSnp_GATB // // Created by Pierre Peterlongo on 03/07/15. // Copyright (c) 2020 Pierre Peterlongo. All rights reserved. // #ifndef __discoSnp_GATB__Kissreads2__ #define __discoSnp_GATB__Kissreads2__ #include // We include what we need for the test #include #include #include #include #include #include #include /** We define string constants for command line options. */ #define STR_KISSREADS_MAX_HAMMING "-hamming" #define STR_KISSREADS_GENOTYPE "-genotype" #define STR_KISSREADS_OUTPUT_FASTA "-output_fasta" #define STR_KISSREADS_SIZE_SEEDS "-size_seeds" #define STR_KISSREADS_INDEX_STRIDE "-index_stride" #define STR_KISSREADS_SIZE_K "-k" #define STR_KISSREADS_COVERAGE_FILE_NAME "-coverage_file" #define STR_URI_OUTPUT_COHERENT "-co" #define STR_URI_OUTPUT_UNCOHERENT "-unco" #define STR_URI_READS_INPUT "-reads" #define STR_URI_PREDICTION_INPUT "-predictions" #define STR_RADSEQ "-x" #define STR_PHASING "-phasing" /** \brief Tool class that looks for SNP * * The Kissnp2 is the front class for SNP detection in a provided de Bruijn graph. * The output is a bank with pairs of sequences defining a bubble. */ class Kissreads2 : public Tool { public: /** Constructor. */ Kissreads2 (); /** Implementation of Tool::execute method. */ void execute (); }; #endif /* defined(__discoSnp_GATB__Kissreads2__) */ DiscoSnp-2.6.2/tools/kissreads2/src/commons.cpp000066400000000000000000000046621420021152700214250ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * commons.c * * Created on: 17 sept. 2010 * Author: ppeterlo */ #include void GlobalValues::revcomp(char s[]) { int i; const int len = strlen(s); char t; for (i=0;i>1)&3; } // update a code of a seed with a new character O(1) kmer_type GlobalValues::updateCodeSeed(const char *seq, kmer_type *x) // update of a seed (shift and adding a new character) { *x = (*x)*4 + NT2int(seq[size_seeds-1]); // add the code of the new nucleotid *x = *x & mask_code_seed; // remove the leftmost couple of bits return *x; } // transform a character seed into a code seed O(size seed) kmer_type GlobalValues::codeSeed(const char *seq) // initialisation of a seed { int i; kmer_type x=0; for (i=0; i. *****************************************************************************/ /* * commons.h * * Created on: 17 sept. 2010 * Author: ppeterlo */ #ifndef COMMONS_H_ #define COMMONS_H_ #define NBITS_OFFSET_SEED 40 // macro to test if a variable is null (i.e., a malloc failed) #define test_alloc( variable) { if(variable == NULL){ fprintf(stderr,"cannot allocate memory for variable %s, exit\n",#variable); exit(1); }} #define Sinc8(a) ((a == 0xFF ) ? 0xFF : a++) #define Sinc24(a) ((a == 0xFFFFFF ) ? 0xFFFFFF : a++) //#define GET_ONLY_UPPER_CHARS // can be used for analysing outputs of kissnp where the extension is in lower case while the 2k+1 snp is in upper case. On wants only to analyse the 2k+1 snp #include #include #include #include #define MAX_SIZE_LINE 16777215 // KMERS ARE LIMITED TO 32 Nucleotides typedef uint64_t kmer_type; class GlobalValues { public: unsigned char *comp; //['t'+1]; unsigned char *nuc; //[4]; // OPTIONS bool standard_fasta; // BINARY ALPHABET int size_seeds; int index_stride; int minimal_read_overlap; bool compute_genotypes; kmer_type mask_code_seed; int number_of_read_sets; int subst_allowed; vector min_coverage; //minimal coverage per read set uint64_t mask_nbseed; uint64_t mask_offset_seed; unsigned int nbits_nbseeds;//saturated increment of unsigned char bool radseq_option; bool phasing; GlobalValues(){ comp=(unsigned char *)malloc(sizeof(unsigned char)*('t'+1)); //test_alloc(comp) nuc=(unsigned char *)malloc(sizeof(unsigned char)*4); //test_alloc(nuc); for (int i=0;i<'t'+1;i++) comp[i]=i; // for other iupac alphabet letters comp[(unsigned char)'A']='T'; comp[(unsigned char)'T']='A'; comp[(unsigned char)'C']='G'; comp[(unsigned char)'G']='C'; comp[(unsigned char)'a']='t'; comp[(unsigned char)'t']='a'; comp[(unsigned char)'c']='g'; comp[(unsigned char)'g']='c'; nuc[0]='A'; nuc[1]='C'; nuc[2]='G'; nuc[3]='T'; mask_offset_seed = (1ULL << (NBITS_OFFSET_SEED)) -1 ; nbits_nbseeds = 8*sizeof(uint64_t)- NBITS_OFFSET_SEED ; mask_nbseed = ( 1ULL << (uint64_t) nbits_nbseeds ) -1 ; }; ~GlobalValues(){ } void set_mask_code_seed(){ mask_code_seed=1; // don't know why but 1<<(2*k) does not work with k>32. This is why I made this stupid loop/ for (int z=0;z<(2*size_seeds);z++){ mask_code_seed = mask_code_seed<<1; } mask_code_seed = mask_code_seed-1; } void revcomp(char s[]); void rev(char s[]); // int valid_character(const char c); kmer_type codeSeed(const char *seq); kmer_type updateCodeSeed(const char *seq, kmer_type *x); char * format_comment(const char * raw_comment); } ; static int NT2int(char nt); #endif /* COMMONS_H_ */ DiscoSnp-2.6.2/tools/kissreads2/src/fragment.cpp000066400000000000000000000111531420021152700215460ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * fragment_index.c * * Created on: 16 sept. 2010 * Author: ppeterlo */ #include inline string getUpperCaseOnly(string stringseq){ string res=""; // string stringseq=sequence.toString(); for (unsigned long i=0;i=(int)'A' && stringseq.at(i)<=(int)'Z') res+=stringseq.at(i); } return res; } Fragment::Fragment(Sequence& seq, const int number_of_read_sets){ sequence=seq; upperCaseSequence = getUpperCaseOnly(seq.toString()); read_coherent = (bool*) malloc(sizeof(bool)*number_of_read_sets); test_alloc(read_coherent); number_mapped_reads = (int*) malloc(sizeof(int)*number_of_read_sets); test_alloc(number_mapped_reads); local_coverage = (unsigned char*) malloc(sizeof(unsigned char)*upperCaseSequence.size()); test_alloc(local_coverage); sum_qualities = (unsigned int*) malloc(sizeof(unsigned int)*number_of_read_sets); test_alloc(sum_qualities); nb_mapped_qualities = (unsigned int*) malloc(sizeof(unsigned int)*number_of_read_sets); test_alloc(nb_mapped_qualities); nbOfSnps = 0; if (strncmp("SNP", sequence.getComment().c_str(), strlen("SNP")) == 0) { nbOfSnps=1; // We don't know yep how many, at least one. } for (int i=0; i. *****************************************************************************/ /* * fragment.h * * Created on: 15 sept. 2010 * Author: ppeterlo */ #ifndef FRAGMENT_H_ #define FRAGMENT_H_ #include #include class Fragment{ public: Sequence sequence; string upperCaseSequence; // fixed once at the beggining: unsigned int * SNP_positions; // If the fragment is a SNP, stores the positions of the SNPs in order to avoid to authorize errors at these positions. Coded on char, the SNP positions should not be longer than 255 unsigned int nbOfSnps; // if zero: the sequence is generic or an indel. Else, number of predicted SNPs unsigned char * local_coverage; // number of reads covering this position can be a char, min coverage required is low bool * read_coherent; // for each read set: is the fragment read coherent? unsigned int * sum_qualities; // sum of the mapped qualities for each read set unsigned int * nb_mapped_qualities; // number of quality mapped for each read set. If there is a unique read, this is the number of mapped reads. In case of close SNPs, as a unique read may cover several SNPs, this can be bigger. int * number_mapped_reads; //for every set of reads, number of reads starting (REPLACE reads_starting) Fragment(Sequence& seq, const int number_of_read_sets); ~Fragment(){ } void set_read_coherent(int read_file_id, GlobalValues gv); }; #endif /* FRAGMENT_H_ */ DiscoSnp-2.6.2/tools/kissreads2/src/fragment_index.cpp000066400000000000000000000163241420021152700227420ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * fragment_index.cpp * * Created on: 16 sept. 2010 * Author: ppeterlo */ #include void FragmentIndex::empty_coverage(){ unsigned long prediction_id; for (prediction_id=0;prediction_id < all_predictions.size();prediction_id++){ for(unsigned long z=0;zupperCaseSequence.size(); z++) all_predictions[prediction_id]->local_coverage[z]=(unsigned char)0; } // end all fragments } // read and store all fragments presents in the pointed file. // index by seeds of length k all these fragments. // each fragment is stored twice: one direct, one reverse complement. void FragmentIndex::index_predictions (BankFasta inputBank, GlobalValues& gv){ kmer_type coded_seed; int i,stop; uint64_t total_seeds = 0 ; #ifdef DEBUG_INDEXING printf("indexing predictions, allocating memory for storing info about %d read sets\n", gv.number_of_read_sets); #endif // each fragment has an id. each seed pobints to couples (id, position). and the fragment is then found thanks to all_fragment[id]; // We create an iterator over this bank. Iterator* it = inputBank.iterator(); LOCAL (it); // First loop over the sequences: count seeds occurrences for (it->first(); !it->isDone(); it->next()) { Fragment * currentFragment = new Fragment(it->item(), gv.number_of_read_sets); // read all the seeds present on the fragment const char * w = currentFragment->upperCaseSequence.c_str(); stop=strlen(w)-gv.size_seeds+1; for (i=0;i *)calloc(total_seeds,sizeof(std::pair)); test_alloc(seed_table); iterate_and_fill_offsets(&seeds_count,gv); total_seeds=0; ///second loop over fragments : create the index for(uint64_t fragment_id=0;fragment_idupperCaseSequence.c_str(); #ifdef DEBUG_INDEXING printf("indexing in %s\n", all_predictions[fragment_id]->upperCaseSequence.c_str()); #endif // read all the seeds present on the fragment stop=strlen(w)-gv.size_seeds+1; for (i=0;iupperCaseSequence.c_str(); cout<<" checking seeds in "<a]->upperCaseSequence.c_str(); cout<<"i="<b="<b<<" value->a="<a<b<nbOfSnps==0 ) { // This is an indel. all_predictions[fragment_id]->SNP_positions = (unsigned int *) malloc (sizeof(unsigned int)); // add a dummy contrained positions test_alloc(all_predictions[fragment_id]->SNP_positions); all_predictions[fragment_id]->SNP_positions[0] = max(all_predictions[fragment_id ]->upperCaseSequence.size(), all_predictions[fragment_id+1]->upperCaseSequence.size())+1; // DUMMY SNP continue; } // the rest applies only for SNPs const char * seq1 = all_predictions[fragment_id ]->upperCaseSequence.c_str(); const char * seq2 = all_predictions[fragment_id+1]->upperCaseSequence.c_str(); const int size_seq1 = strlen(seq1); const int size_seq2 = strlen(seq2); const int size_seq = min(size_seq1,size_seq2); // COMMENTED ON NOV 2017: WITH RAD SEQ DATA, SNP SEQUENCES MAY HAVE DISCTINCT SIZES // assert(size_seq == strlen(seq2)); // if(size_seq != strlen(seq2)){ // cerr<<"two SNP sequences of distinct sizes. Impossible"< #ifndef _HASH_H #define _HASH_H /* * generic types: we typecast in hash_*.c functions for specific implementations */ typedef uint64_t hash_val; /* * basic functions: * - create hash table * - insert element into table * - return element from table * - delete table */ extern xhash xhash_create_seed_index(); void hash_incr_kmer_count(xhash * map, const kmer_type * key, GlobalValues& gv); void iterate_and_fill_offsets( xhash * map, GlobalValues &gv ); int get_seed_info(xhash * map, const kmer_type * key, uint64_t * offset_seed, uint64_t * nb_seeds, GlobalValues &gv ); void hash_fill_kmer_index(xhash * map, const kmer_type * key, std::pair * seed_table, const uint64_t fragment_id, const int position_on_fragment, GlobalValues &gv); void get_offset_and_nb_from_sinfo(hash_val sinfo, uint64_t & offset_seed,uint64_t & nb_seeds, GlobalValues &gv ); void set_offset_and_nb_into_sinfo(hash_val * sinfo, uint64_t offset_seed,uint64_t nb_seeds, GlobalValues &gv ); #endif /* _HASH_H */ DiscoSnp-2.6.2/tools/kissreads2/src/main.cpp000066400000000000000000000036151420021152700206730ustar00rootroot00000000000000 /***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /********************************************************************************/ #include using namespace gatb::core; using namespace gatb::core::tools; using namespace gatb::core::bank; using namespace gatb::core::kmer::impl; using namespace gatb::core::system; using namespace gatb::core::system::impl; /********************************************************************************/ int main (int argc, char* argv[]) { // We define a try/catch block in case some method fails (bad filename for instance) try { /** We execute the tool. */ Kissreads2().run (argc, argv); } catch (OptionFailure& e) { return e.displayErrors (cout); } catch (Exception& e) { cerr << "EXCEPTION: " << e.getMessage() << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } DiscoSnp-2.6.2/tools/kissreads2/src/outputs.cpp000066400000000000000000000235011420021152700214660ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * outputs.c * * Created on: 27 oct. 2010 * Author: ppeterlo */ //#define DEBUG_QUALITY //#if !HAVE_LOG2F //#define log2f log //#endif #include ///*Calculates the phi coefficient of 2*2 contingency table. Value close to 1 indicates an association between the alleles and the conditions.*/ ///*Note that this value is valid if at least 3 out of the 4 values are non 0, or if the .Otherwise it output -1*/ //float phi(int a,int b, int c,int d) { // // int denom=(a+b)*(c+d)*(a+c)*(b+d); // // if (denom==0) // // return 0; // // float Phi = (a*d-b*c)/sqrt(denom); // // return Phi; // if((a+b)==0) return 0; // if((c+d)==0) return 0; // if((a+c)==0) return 0; // if((b+d)==0) return 0; // // avoid the computation of denom, possibly bigger than an int or an unsigned long long int... // return (a*d-b*c)/(sqrt((float)(a+b))*sqrt((float)(c+d))*sqrt((float)(a+c))*sqrt((float)(b+d))); //} /*Computes the chi2 value of the matrix 2*number_of_read_sets */ float rank_phi_N (const int *sum_up, const int *sum_lo, const int number_of_read_sets) { if (number_of_read_sets==1) return 0; int i; float n=0; for (i=0;inb_mapped_qualities[read_set_id]>0) avg_up[read_set_id] += index.all_predictions[fragment_id ]->nb_mapped_qualities[read_set_id]==0?0:index.all_predictions[fragment_id ]->sum_qualities[read_set_id] / index.all_predictions[fragment_id ]->nb_mapped_qualities[read_set_id]; if (index.all_predictions[fragment_id+1]->nb_mapped_qualities[read_set_id]>0) avg_lo[read_set_id] += index.all_predictions[fragment_id+1]->nb_mapped_qualities[read_set_id]==0?0:index.all_predictions[fragment_id+1]->sum_qualities[read_set_id] / index.all_predictions[fragment_id+1]->nb_mapped_qualities[read_set_id]; } // } // float sum=0; for(int read_set_id=0;read_set_idnumber_mapped_reads[read_set_id]; sum_lo[read_set_id]=index.all_predictions[fragment_id+1]->number_mapped_reads[read_set_id]; } const float err = 0.01; const float prior_het = 1/(float)3; float rank = rank_phi_N(sum_up,sum_lo,gv.number_of_read_sets); // char genotypes[819200]; genotypes[0]='\0'; stringstream genotypes;//%[160000]; if(gv.compute_genotypes){ // CONSTRUCT THE COMMON HEADER COMMENT (Genotypes, Coverages, Qualities, Rank) for(read_set_id=0;read_set_idread_coherent[read_set_id] && !index.all_predictions[fragment_id+1]->read_coherent[read_set_id]) { geno_likelihood<<"./.:.,.,."; } else { geno_likelihood << genotype_simple_model(sum_up[read_set_id], sum_lo[read_set_id], err, prior_het); } genotypes<<"G"<"<sequence.getComment()<<"|"; for(read_set_id=0;read_set_idsequence.toString()<"<sequence.getComment()<<"|"; for(read_set_id=0;read_set_idsequence.toString()<read_coherent[read_set_id]) return true; } return false; } void print_results_2_paths_per_event(ofstream &coherent_out, ofstream &uncoherent_out, FragmentIndex &index, GlobalValues & gv){ index.nb_coherent=0; index.nb_uncoherent=0; // // C1 C2 C3 .... // path1 (i) [0/1] [0/1] [0/1]... // path2 (i+1) [0/1] [0/1] [0/1]... // // event is kept only if each line has at least one "1" per line: // for(unsigned long i=0;i. *****************************************************************************/ /* * outputs.h * * Created on: 27 oct. 2010 * Author: ppeterlo */ #ifndef OUTPUTS_H_ #define OUTPUTS_H_ #include #include #include #include #include #include //#include #include #include #include #include #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define ABS(a) (((a) < 0) ? -(a) : (a)) void print_results_2_paths_per_event(ofstream &coherent_out, ofstream & uncoherent_out, FragmentIndex &index, GlobalValues & gv); #endif /* OUTPUTS_H_ */ DiscoSnp-2.6.2/tools/kissreads2/src/read_mapper.cpp000066400000000000000000001355001420021152700222250ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * extension_algorithm.c * * Created on: 16 sept. 2010 * Author: ppeterlo */ #include #define min(a, b) ((a) < (b) ? (a) : (b)) // Replaces SNP_higher_path_3780|P_1:30_A/G|high|nb_pol_1 by 3780h inline string parse_variant_id(string in){ string res=""; // push the values while they are in [0-9] for (char c : in){ if (c>=int('0') && c<=int('9')) res=res+c; if (c=='|') break; } res=res+in[4]; // h or l. return res; } //feed_coherent_positions(index.all_predictions, value->a , pwi, (int)strlen(read), quality, seed_position, read_set_id, gv); void feed_coherent_positions(vector & predictions, const int prediction_id, const int pwi, const int length_read, string quality, int read_set_id, GlobalValues& gv){ int start_on_prediction, stop_on_prediction; int start_on_read; /* * | pwi (negative) * -------------- fragment * ************* read * | we start here */ if(pwi<0) { start_on_prediction=0; start_on_read=-pwi; } /* * | pwi (positive) * -------------- fragment * ************* read * | we start here */ else{ start_on_prediction=pwi; start_on_read=0; } int i; Fragment* the_prediction=predictions[prediction_id]; Fragment* the_reference_prediction = predictions[2*(prediction_id/2)]; // In case of snps, only the upper path prediction contains informations such as the positions of the SNPs. This is the reference if(pwi+length_readupperCaseSequence.size()) stop_on_prediction=pwi+length_read; else stop_on_prediction=the_prediction->upperCaseSequence.size(); __sync_fetch_and_add ( & the_prediction->number_mapped_reads[read_set_id],1); if ( quality.length()>0 ){ if (the_reference_prediction->nbOfSnps>0) { // THIS IS A SNP int snp_id; for(snp_id=0;snp_idnbOfSnps;snp_id++){ // we only add the qualities of the mapped SNPs i=the_reference_prediction->SNP_positions[snp_id]; if (start_on_read + i - start_on_prediction>=0 && start_on_read + i - start_on_prediction < length_read){ the_prediction->sum_qualities[read_set_id] += (unsigned int) quality[start_on_read + i - start_on_prediction]; the_prediction->nb_mapped_qualities[read_set_id] += 1; } } } else{ // THIS IS NOT A SNP (INDEL). We sum all qualities and divide by the number of positions int sum_temp=0; int denom=0; for(i=start_on_prediction;isum_qualities array, we add the average quality of the whole read. denom+=1; sum_temp+=(unsigned int) quality[start_on_read + i - start_on_prediction]; } if(denom>0){ the_prediction->sum_qualities[read_set_id] += (unsigned int)sum_temp/denom; the_prediction->nb_mapped_qualities[read_set_id] += 1; } } } // the position i is contained into a kmer fully contained into only 1 mapped read, return 1 // for doing this we stored on each position of the fragment the number of k-mers starting at this position that fully belong to a read that was mapped // -------------------------------------------------------------- prediction // ************************ // <-----k-----> // 00000000001111111111110000000000000000000000000000000000000000 the_prediction->local_coverage if(pwi+length_read-gv.minimal_read_overlapupperCaseSequence.size()) stop_on_prediction=pwi+length_read-gv.minimal_read_overlap; else stop_on_prediction=the_prediction->upperCaseSequence.size(); for(i=start_on_prediction;ilocal_coverage[i]); } /** * | pwi (may be negative) * -------------- fragment * ************* read * * Tests if the overlapping part between read and fragment do not have more than subst_allowed substitions * In case of SNPs, we need to avoid any substitution on the central fragment position (the one containing the SNP) * Thus in this function, we return 0 if any substitution occurs on this central position, whatever the number of substitution_seen * returns 1 if true between read and fragment, 0 else */ bool constrained_read_mappable(const int pwi, const char * fragment, const char * read, const int subst_allowed, const unsigned int * SNP_positions, const int seed_position_on_read, const int size_seed){ int substitution_seen=0; // number of seen substitutions for now int pos_on_read, pos_on_fragment; // where to start // print_mapping(pwi,fragment,read); //DEB /* * | pwi (negative) * -------------- fragment * ************* read * | we start here */ if(pwi<0) { pos_on_fragment=0; pos_on_read=-pwi; } /* * | pwi (positive) * -------------- fragment * ************* read * | we start here */ else{ pos_on_fragment=pwi; pos_on_read=0; } unsigned int snp_pos = SNP_positions[0]; int id_array_SNP_position=0; while(pos_on_fragment>snp_pos) // One may start on the fragment after the first SNP(s) thus we must find the good snp pos that is going to be found. { id_array_SNP_position++; snp_pos = SNP_positions[id_array_SNP_position]; // cerr<snp_pos) { id_array_SNP_position++; snp_pos = SNP_positions[id_array_SNP_position]; // cerr<subst_allowed) return false; // too much subsitutions if(pos_on_fragment==snp_pos) { return false; // substition should not be on the snp } } pos_on_fragment++; pos_on_read++; } return true; } // For each position in the prediction: // find the kmer supported by the smallest number of reads, e.g.: // i // ------------------------------X------------------------------- prediction // a ************************ // b ************************** // c ******************* // d ************************* // <-----k-----> : 2 reads (a and b) // <-----k-----> : 3 reads (a,b and b) // <-----k-----> : 2 reads (b and c) // <-----k-----> : 1 reads (c) // <-----k-----> : 2 reads (c and d) // ... // the position i is contained into a kmer fully contained into only 1 mapped read, return 1 // for doing this we stored on each position of the fragment the number of k-mers starting at this position that fully belong to a read that was mapped. // We define a functor that will be cloned by the dispatcher struct Functor { // ISynchronizer* synchro; fstream& file; map > tested_prediction_and_pwis; // stores for this read, the pwi positions tested for each prediction. set mapped_prediction_as_set; // stores for this read, the succesfully mapped predictions - enables a quick existance testing of an element // list mapped_prediction_as_list; // stores for this read, the succesfully mapped predictions - conserve the predictions order. GlobalValues & gv; FragmentIndex& index; const int read_set_id; u_int64_t * number_of_mapped_reads; map & phased_variants; Functor (GlobalValues & gv, FragmentIndex& index, const int read_set_id, u_int64_t * number_of_mapped_reads, map & phased_variants) : gv(gv), index(index), read_set_id(read_set_id), number_of_mapped_reads(number_of_mapped_reads), phased_variants(phased_variants){} map> core_mapping(char *read, char * quality){ map> pwi_and_mapped_predictions; // stores for this reads the succesfully mapped predictions (direction '+' or '-') and their id together with their pwi. // note that we cannot use simply the -id to indicate the orientation, as prediction 0 exists. const uint64_t read_len = strlen(read); const int minimal_pwi = gv.minimal_read_overlap - read_len;//seq.getDataSize(); uint64_t offset_seed; uint64_t nb_occurrences; // The read must overlap the fragment with at least minimal_read_overlap positions. // here is the first position on which the read may map : // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prediction // ********** read (10) // <-----> minimal_read_overlap (7) // <-> -pwi (-3) // -pwi+minimal_read_overlap <= |read| // -pwi <= |read|-minimal_read_overlap // pwi >= minimal_read_overlap-|read| // pwi >= 7-10 = -3 // minimal_pwi = minimal_read_overlap-|read| const int stop = read_len-gv.size_seeds+1; kmer_type coded_seed; // for both dirrections of the read for(int direction=0;direction<2;direction++) // try the two possible directions of the read { for (int seed_position=0;seed_position * value = &(index.seed_table[occurrence_id]); if (mapped_prediction_as_set.count(value->first)!=0) { continue; // This prediction was already mapped with this read. } // shortcut set & tested_positions = tested_prediction_and_pwis[value->first]; // get the corresponding prediction sequence const char * prediction = index.all_predictions[value->first]->upperCaseSequence.c_str(); #ifdef DEBUG_MAPPING // cout<<"seed = "<b<b<second-seed_position; // starting position of the read on the prediction. if (tested_positions.count(pwi) != 0) continue; // this reads was already tested with this prediction at this position. No need to try it again. tested_positions.insert(pwi); // We store the fact that this read was already tested at this position on this prediction. // overview general situation: // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prediction // <---------> b // [--------] seed // ****************************** read // <----> i // <---> pwi const int maximal_pwi = strlen(prediction)-gv.minimal_read_overlap; if (pwi maximal_pwi) { continue; // this read to not overlap enough with the prediction. } // ;;;;;;;;;;; prediction (11) // ****************************** read // <----> minimal_read_overlap (6) // <---> pwi (5) // |prediction| <= pwi+minimal_read_overlap const bool is_read_mapped = constrained_read_mappable(pwi, prediction, read, gv.subst_allowed, index.all_predictions[value->first-value->first%2]->SNP_positions, seed_position, gv.size_seeds); // #ifdef DEBUG_MAPPING // if (is_read_mapped) { // cout<first<<" pos "<first); // This prediction whould not be mapped again with the same read // currently the phasing works better with SNPs, as boths paths of an indel may be mapped by a same read if (index.all_predictions[value->first]->nbOfSnps !=0){ // If this is not an indel (todo phase also indels) char sign=direction==0?'\0':'-'; if (direction == 0){ if (pwi_and_mapped_predictions.find(pwi) == pwi_and_mapped_predictions.end()) pwi_and_mapped_predictions[pwi] = std::pair(sign,value->first); // TODO what if this read maps already a variant at the same position ? } else{ // ;;;;;;;;;;; prediction (11) // ****************************** reverse read (30) // <----> minimal_read_overlap (6) // <---> pwi (5) // <----------------------> rc_pwi (-24) // we have : |read_overlap| = |prediction|-pwi // we have : rc_pwi = |read_overlap|-|read| // we have : rc_pwi = |prediction|-pwi-read // rc_pwi = 11-5-30 = -24. // Validation with pwi<0: /* * <-> pwi (-3) * -------------- prediction (14) * *********** read (11) * <----> rc_pwi=6 * |prediction|-pwi-read = 14-(-3)-11 = 6 (CQFD :)) */ const int rc_pwi = strlen(prediction) - pwi - read_len; if (pwi_and_mapped_predictions.find(rc_pwi) == pwi_and_mapped_predictions.end()) pwi_and_mapped_predictions[rc_pwi] = std::pair(sign,value->first); // TODO what if this read maps already a variant at the same position ? /// } } } ////// END PHASING #ifdef DEBUG_MAPPING // printf("SUCCESS %d %d \n", pwi, value->a); // cout<a]->upperCaseSequence<<" "<first, pwi, (int)strlen(read), quality, read_set_id, gv); } // end tuple read prediction position is read coherent } } // end all infos for the current seed } // end all seeds of the read // Clean the temp mapping positions and tested pwi // for (std::map > ::iterator it=tested_prediction_and_pwis.begin(); it!=tested_prediction_and_pwis.end(); ++it){ it->second.clear(); } tested_prediction_and_pwis.clear(); mapped_prediction_as_set.clear(); // Return the read (for next loop round or for putting back in the right direction) gv.revcomp(read); gv.rev (quality); } // end both directions return pwi_and_mapped_predictions; } /// OPERATOR FOR A NON PAIRED SEQUENCE void operator() (Sequence& seq) { // Shortcut char *read = strdup(seq.toString().c_str()); char * quality = strdup(seq.getQuality().c_str()); map> pwi_and_mapped_predictions = core_mapping(read, quality); // clear (if one still have to check the reverse complement of the read) or free (else) the list of int for each prediction_id on which we tried to map the current read /////// PHASING if (gv.phasing){ if (pwi_and_mapped_predictions.size()>1){ // If two or more variants mapped by the same read string phased_variant_ids =""; // Create a string containing the (lexicographically) ordered set of variant ids. int nb_variants_in_fact = 0; // # of variants in this fact. If one, we do not output it. int previous_pwi; // position of the previous pwi snp on the read int previous_upper_case_seq_len=0; // size of the previous upper case sequence bool first_snp=true; // we are going to encounter the first snp of the set of phased SNPs // walk the mapping positions in reverse order. Read mapping at the end of a prediction correspond to first prediction and vice versa: // _________________________ prediction1 // -------- read // __________________ prediction2 // -------- read // means that // -------- read // __________________ prediction2 // _________________________ prediction1 // prediction1 is after prediction2, while read mapped earlier on it. This explains the reverse order for (map>::reverse_iterator it=pwi_and_mapped_predictions.rbegin(); it!=pwi_and_mapped_predictions.rend(); ++it){ int pwi=it->first; // Position on the read of the current variant std::pair signed_var_id =it->second; char sign = signed_var_id.first; int64_t var_id = signed_var_id.second; int relative_position; // Relative position of the upper case sequence variant with repect to previous upper case sequence start int shift=0; // distance between the current upper case sequence start and the previous one. May be negative. // -----[XXXXXXXXXX]--------- previous sequence // ----------[XXXXXX]------------ current sequence // <-relative_position-> // <-shift-> // the shift value has the advantage to be symetrical. When reverting the phased alleles, the shift is constant while the relative_position would have to be recomputed. if (first_snp){ relative_position=0; shift=0; first_snp=false; } else{ int end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); // Relative distance between the end of the previous upper case sequence and the end of the current upper case sequence. // if this value is negative, then the current variant is included in the previous one; does not provide information and creates cycles in the phased variants graphs. Thus we remove them. // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXXXXXXX]--------- previous sequence // <-relative_position-> // <-shift-> // <---------------> (end_to_end_distance) // end_to_end_distance = shift + len(current upper case sequence) // When current variant is included in the previous one, then end_to_end_distance is negative: // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXX]--------- previous sequence // <-> (end_to_end_distance) <0 // end_to_end_distance = shift + index.all_predictions[var_id]->upperCaseSequence.length(); // with // shift=relative_position-previous_upper_case_seq_len; // relative_position=previous_pwi-pwi; // hence end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); if (end_to_end_distance <0){ continue; } relative_position=previous_pwi-pwi; assert(relative_position >=0); shift=relative_position-previous_upper_case_seq_len; } previous_upper_case_seq_len=index.all_predictions[var_id]->upperCaseSequence.length(); previous_pwi=pwi; string phased_variant_id; if (sign != '\0') phased_variant_id+=sign; phased_variant_id += parse_variant_id(index.all_predictions[var_id]->sequence.getComment())+"_"+to_string(shift); //DEBUG // cout<<"phased_variant_id "<sequence.getComment()<sequence.getComment())<first<<" "<second.first<<" "<second.second<upperCaseSequence; //DEBUG // cout<<"shift "<1) // No need to store facts composed of zero or one variant { // Associate this string to the number of times it is seen when mapping this read set if (phased_variants.find(phased_variant_ids) == phased_variants.end()) phased_variants[phased_variant_ids] = 1; else phased_variants[phased_variant_ids] = phased_variants[phased_variant_ids]+1; } } pwi_and_mapped_predictions.clear(); } /////// END PHASING free(read); free(quality); } /// OPERATOR FOR A PAIR OF SEQUENCES void operator() (std::pair& pair){ // Shortcut char *read1 = strdup(pair.first.toString().c_str()); char * quality1 = strdup(pair.first.getQuality().c_str()); char *read2 = strdup(pair.second.toString().c_str()); char * quality2 = strdup(pair.second.getQuality().c_str()); map> pwi_and_mapped_predictions1 = core_mapping(read1, quality1); map> pwi_and_mapped_predictions2 = core_mapping(read2, quality2); // clear (if one still have to check the reverse complement of the read) or free (else) the list of int for each prediction_id on which we tried to map the current read /////// PHASING if (gv.phasing){ if ((pwi_and_mapped_predictions1.size() + pwi_and_mapped_predictions2.size())>1){ // If two or more variants mapped by the same read string phased_variant_ids =""; // Create a string containing the (lexicographically) ordered set of variant ids. int nb_variants_in_fact = 0; // # of variants in this fact. If one, we do not output it. int previous_pwi; // position of the previous pwi snp on the read int previous_upper_case_seq_len=0; // size of the previous upper case sequence bool first_snp=true; // we are going to encounter the first snp of the set of phased SNP // walk the mapping positions in reverse order. Read mapping at the end of a prediction correspond to first prediction and vice versa: // _________________________ prediction1 // -------- read // __________________ prediction2 // -------- read // means that // -------- read // __________________ prediction2 // _________________________ prediction1 // prediction1 is before prediction2, while read mapped earlier on it. This explains the reverse order for (map>::reverse_iterator it=pwi_and_mapped_predictions1.rbegin(); it!=pwi_and_mapped_predictions1.rend(); ++it){ // for (set> ::iterator it=pwi_and_mapped_predictions.begin(); it!=pwi_and_mapped_predictions.end(); ++it){ // TODO: optimize this // const int pwi = it->first; int pwi = it->first; std::pair signed_var_id =it->second; char sign = signed_var_id.first; int64_t var_id = signed_var_id.second; int relative_position; // Relative position of the variant with repect to previous SNP int shift=0; // distance between the current upper case sequence start and the previous one. // May be negative if upper sequences overlap. In this case, -shift must be <=previous_upper_case_seq_len // -----[XXXXXXXXXX]--------- // ----------[XXXXXX]------------ // <-relative_position-> // <-shift-> // the shift value has the advantage to be symetrical. When reverting the phased alleles, the shift is constant while the relative_position would have to be recomputed. if (first_snp){ relative_position=0; first_snp=false; shift = 0; } else{ int end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); // Relative distance between the end of the previous upper case sequence and the end of the current upper case sequence. // if this value is negative, then the current variant is included in the previous one; does not provide information and creates cycles in the phased variants graphs. Thus we remove them. // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXXXXXXX]--------- previous sequence // <-relative_position-> // <-shift-> // <---------------> (end_to_end_distance) // end_to_end_distance = shift + len(current upper case sequence) // When current variant is included in the previous one, then end_to_end_distance is negative: // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXX]--------- previous sequence // <-> (end_to_end_distance) <0 // end_to_end_distance = shift + index.all_predictions[var_id]->upperCaseSequence.length(); // with // shift=relative_position-previous_upper_case_seq_len; // relative_position=previous_pwi-pwi; // hence end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); if (end_to_end_distance <0){ continue; } relative_position=-(pwi-previous_pwi); assert(relative_position >=0); //TODO to remove shift=relative_position-previous_upper_case_seq_len; if (shift<0) //TODO to remove assert(-shift>previous_upper_case_seq_len); //TODO to remove } previous_upper_case_seq_len=index.all_predictions[var_id]->upperCaseSequence.length(); previous_pwi=pwi; string phased_variant_id; if (sign != '\0') phased_variant_id+=sign; phased_variant_id += parse_variant_id(index.all_predictions[var_id]->sequence.getComment())+"_"+to_string(shift); phased_variant_ids = phased_variant_ids+phased_variant_id+';'; nb_variants_in_fact++; } // Second part of the pair if (nb_variants_in_fact > 0) // Add a ' ' if the left part of the paired fact is not empty phased_variant_ids += ' '; first_snp=true; // we are going to encounter the first snp of the set of phased SNP // walk the mapping positions in reverse order. Read mapping at the end of a prediction correspond to first prediction and vice versa: // _________________________ prediction1 // -------- read // __________________ prediction2 // -------- read // means that // -------- read // __________________ prediction2 // _________________________ prediction1 // prediction1 is before prediction2, while read mapped earlier on it. This explains the reverse order for (map>::reverse_iterator it=pwi_and_mapped_predictions2.rbegin(); it!=pwi_and_mapped_predictions2.rend(); ++it){ // for (set> ::iterator it=pwi_and_mapped_predictions.begin(); it!=pwi_and_mapped_predictions.end(); ++it){ // TODO: optimize this // const int pwi = it->first; int pwi = it->first; std::pair signed_var_id =it->second; char sign = signed_var_id.first; int64_t var_id = signed_var_id.second; int relative_position; // Relative position of the variant with repect to previous SNP int shift; // distance between the current upper case sequence start and the previous one. May be negative. // -----[XXXXXXXXXX]--------- // ----------[XXXXXX]------------ // <-relative_position-> // <-shift-> // the shift value has the advantage to be symetrical. When reverting the phased alleles, the shift is constant while the relative_position would have to be recomputed. if (first_snp){ relative_position=0; first_snp=false; shift=0; } else{ int end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); // Relative distance between the end of the previous upper case sequence and the end of the current upper case sequence. // if this value is negative, then the current variant is included in the previous one; does not provide information and creates cycles in the phased variants graphs. Thus we remove them. // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXXXXXXX]--------- previous sequence // <-relative_position-> // <-shift-> // <---------------> (end_to_end_distance) // end_to_end_distance = shift + len(current upper case sequence) // When current variant is included in the previous one, then end_to_end_distance is negative: // -----[XXXXXXXXXX]--------- previous sequence // -----[XXXXX]--------- previous sequence // <-> (end_to_end_distance) <0 // end_to_end_distance = shift + index.all_predictions[var_id]->upperCaseSequence.length(); // with // shift=relative_position-previous_upper_case_seq_len; // relative_position=previous_pwi-pwi; // hence end_to_end_distance = previous_pwi-pwi-previous_upper_case_seq_len + index.all_predictions[var_id]->upperCaseSequence.length(); if (end_to_end_distance <0){ continue; } relative_position=-(pwi-previous_pwi); assert(relative_position >=0); //TODO to remove shift=relative_position-previous_upper_case_seq_len; if (shift<0) //TODO to remove assert(-shift>previous_upper_case_seq_len); //TODO to remove } previous_upper_case_seq_len=index.all_predictions[var_id]->upperCaseSequence.length(); previous_pwi=pwi; string phased_variant_id; if (sign != '\0') phased_variant_id+=sign; phased_variant_id += parse_variant_id(index.all_predictions[var_id]->sequence.getComment())+"_"+to_string(shift); phased_variant_ids = phased_variant_ids+phased_variant_id+';'; nb_variants_in_fact++; } if (nb_variants_in_fact>1) // No need to store facts composed of zero or one variant { //DEBUG // cout << phased_variant_ids < phased_variants; // Few tests for finding pair of banks. // cout <getId()<<" "<getCompositionNb()<getCompositionNb(); subBankId++){ // cout<<"sub " <getIdNb(subBankId)<getBanks()[subBankId]; // cout<<"subank id "<getId()<& subbanks = inputBank->getBanks(); // Test if a bank is composed of two read files. if (inputBank->getCompositionNb()==2 && subbanks[0]->getCompositionNb()==1 && subbanks[1]->getCompositionNb()==1){ // PAIRED END IBank* bank1 =subbanks[0]; LOCAL(bank1); IBank* bank2 =subbanks[1]; LOCAL(bank2); PairedIterator * itPair = new PairedIterator (bank1->iterator(), bank2->iterator()); LOCAL(itPair); ProgressIterator< std::pair > prog_iter (itPair, Stringify::format ("Mapping pairend read set %d", read_set_id).c_str(), bank1->estimateNbItems()); Dispatcher(nbCores,2047).iterate (prog_iter, Functor(gv, index, read_set_id, &number_of_mapped_reads, phased_variants)); } else{ // SINGLE END // We create a sequence iterator for the bank with progress information ProgressIterator iter (*inputBank, Stringify::format ("Mapping read set %d", read_set_id).c_str()); Dispatcher(nbCores,2047).iterate (iter, Functor(gv, index, read_set_id, &number_of_mapped_reads, phased_variants)); } // PHASING: if (gv.phasing){ stringstream phasingFileName; phasingFileName<<"phased_alleles_read_set_id_"<<(read_set_id+1)<<".txt"; cout<<"print in phasing information in "<getId()<::iterator it=phased_variants.begin(); it!=phased_variants.end(); ++it) phasingFile << it->first << " => " << it->second << '\n'; phasingFile.close(); } // ENDPHASING return number_of_mapped_reads; } void ReadMapper::set_read_coherency(GlobalValues& gv, FragmentIndex index){ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////// for each prediction: check those fully coherent and store left and right reads covering them /////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned long prediction_id; for (prediction_id=0;prediction_id < index.all_predictions.size();prediction_id++){ index.all_predictions[prediction_id]->set_read_coherent(read_set_id,gv); } // end all fragments } DiscoSnp-2.6.2/tools/kissreads2/src/read_mapper.h000066400000000000000000000040041420021152700216640ustar00rootroot00000000000000/***************************************************************************** * discoSnp++: discovering polymorphism from raw unassembled NGS reads * A tool from the GATB (Genome Assembly Tool Box) * Copyright (C) 2020 INRIA * Authors: P.Peterlongo, E.Drezen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . *****************************************************************************/ /* * read_mapper.h * * Created on: 15 sept. 2010 * Author: ppeterlo */ #ifndef EXTENSION_ALGORITHM_H_ #define EXTENSION_ALGORITHM_H_ #include #include #include #include #include #include #include #include #include class ReadMapper{ public: IBank* inputBank; int read_set_id; size_t nbCores; ReadMapper(IBank* inputBank, int read_set_id, size_t nbCores){ this->inputBank=inputBank; this->read_set_id=read_set_id; this->nbCores=nbCores; }; u_int64_t map_all_reads_from_a_file ( GlobalValues & gv, FragmentIndex & index, const int read_set_id ); void set_read_coherency(GlobalValues& gv, FragmentIndex index); }; #endif /* EXTENSION_ALGORITHM_H_ */ DiscoSnp-2.6.2/tools/kissreads2/src/xhash.h000066400000000000000000000224761420021152700205350ustar00rootroot00000000000000#ifndef XHASH_H #define XHASH_H /* * Copyright (c) 2013-2014 by Yuichi Nishiwaki */ #if defined(__cplusplus) extern "C" { #endif #include #include #include #include #include /* simple object to object hash table */ #define XHASH_INIT_SIZE 11 #define XHASH_RESIZE_RATIO 0.75 #define XHASH_ALIGNMENT 3 /* quad word alignment */ #define XHASH_MASK (~(size_t)((1 << XHASH_ALIGNMENT) - 1)) #define XHASH_ALIGN(i) ((((i) - 1) & XHASH_MASK) + (1 << XHASH_ALIGNMENT)) typedef struct xh_entry { struct xh_entry *next; int hash; struct xh_entry *fw, *bw; const void *key; void *val; } xh_entry; #define xh_key(e,type) (*(type *)((e)->key)) #define xh_val(e,type) (*(type *)((e)->val)) typedef int (*xh_hashf)(const void *, void *); typedef int (*xh_equalf)(const void *, const void *, void *); typedef struct xhash { xh_entry **buckets; size_t size, count, kwidth, vwidth; size_t koffset, voffset; xh_hashf hashf; xh_equalf equalf; xh_entry *head, *tail; void *data; } xhash; /** Protected Methods: * static inline void xh_init_(xhash *x, size_t, size_t, xh_hashf, xh_equalf, void *); * static inline xh_entry *xh_get_(xhash *x, const void *key); * static inline xh_entry *xh_put_(xhash *x, const void *key, void *val); * static inline void xh_del_(xhash *x, const void *key); */ /* string map */ static inline void xh_init_str(xhash *x, size_t width); static inline xh_entry *xh_get_str(xhash *x, const char *key); static inline xh_entry *xh_put_str(xhash *x, const char *key, void *); static inline void xh_del_str(xhash *x, const char *key); /* object map */ static inline void xh_init_ptr(xhash *x, size_t width); static inline xh_entry *xh_get_ptr(xhash *x, const void *key); static inline xh_entry *xh_put_ptr(xhash *x, const void *key, void *); static inline void xh_del_ptr(xhash *x, const void *key); /* int map */ static inline void xh_init_int(xhash *x, size_t width); static inline xh_entry *xh_get_int(xhash *x, int key); static inline xh_entry *xh_put_int(xhash *x, int key, void *); static inline void xh_del_int(xhash *x, int key); static inline size_t xh_size(xhash *x); static inline void xh_clear(xhash *x); static inline void xh_destroy(xhash *x); static inline xh_entry *xh_begin(xhash *x); static inline xh_entry *xh_next(xh_entry *e); static inline void xh_bucket_realloc(xhash *x, size_t newsize) { x->size = newsize; x->buckets = (xh_entry **)realloc(x->buckets, (x->size + 1) * sizeof(xh_entry *)); memset(x->buckets, 0, (x->size + 1) * sizeof(xh_entry *)); } static inline void xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equalf, void *data) { x->size = 0; x->buckets = NULL; x->count = 0; x->kwidth = kwidth; x->vwidth = vwidth; x->koffset = XHASH_ALIGN(sizeof(xh_entry)); x->voffset = XHASH_ALIGN(sizeof(xh_entry)) + XHASH_ALIGN(kwidth); x->hashf = hashf; x->equalf = equalf; x->head = NULL; x->tail = NULL; x->data = data; xh_bucket_realloc(x, XHASH_INIT_SIZE); } static inline xh_entry * xh_get_(xhash *x, const void *key) { int hash; size_t idx; xh_entry *e; hash = x->hashf(key, x->data); idx = ((unsigned)hash) % x->size; for (e = x->buckets[idx]; e; e = e->next) { if (e->hash == hash && x->equalf(key, e->key, x->data)) break; } return e; } static inline void xh_resize_(xhash *x, size_t newsize) { xhash y; xh_entry *it; size_t idx; xh_init_(&y, x->kwidth, x->vwidth, x->hashf, x->equalf, x->data); xh_bucket_realloc(&y, newsize); for (it = xh_begin(x); it != NULL; it = xh_next(it)) { idx = ((unsigned)it->hash) % y.size; /* reuse entry object */ it->next = y.buckets[idx]; y.buckets[idx] = it; y.count++; } y.head = x->head; y.tail = x->tail; free(x->buckets); /* copy all members from y to x */ memcpy(x, &y, sizeof(xhash)); } static inline xh_entry * xh_put_(xhash *x, const void *key, void *val) { int hash; size_t idx; xh_entry *e; if ((e = xh_get_(x, key))) { memcpy(e->val, val, x->vwidth); return e; } if (x->count + 1 > x->size * XHASH_RESIZE_RATIO) { xh_resize_(x, x->size * 2 + 1); } hash = x->hashf(key, x->data); idx = ((unsigned)hash) % x->size; e = (xh_entry *)malloc(x->voffset + x->vwidth); e->next = x->buckets[idx]; e->hash = hash; e->key = ((char *)e) + x->koffset; e->val = ((char *)e) + x->voffset; memcpy((void *)e->key, key, x->kwidth); memcpy(e->val, val, x->vwidth); if (x->head == NULL) { x->head = x->tail = e; e->fw = e->bw = NULL; } else { x->tail->bw = e; e->fw = x->tail; e->bw = NULL; x->tail = e; } x->count++; return x->buckets[idx] = e; } static inline void xh_del_(xhash *x, const void *key) { int hash; size_t idx; xh_entry *p, *q, *r; hash = x->hashf(key, x->data); idx = ((unsigned)hash) % x->size; if (x->buckets[idx]->hash == hash && x->equalf(key, x->buckets[idx]->key, x->data)) { q = x->buckets[idx]; if (q->fw == NULL) { x->head = q->bw; } else { q->fw->bw = q->bw; } if (q->bw == NULL) { x->tail = q->fw; } else { q->bw->fw = q->fw; } r = q->next; free(q); x->buckets[idx] = r; } else { for (p = x->buckets[idx]; ; p = p->next) { if (p->next->hash == hash && x->equalf(key, p->next->key, x->data)) break; } q = p->next; if (q->fw == NULL) { x->head = q->bw; } else { q->fw->bw = q->bw; } if (q->bw == NULL) { x->tail = q->fw; } else { q->bw->fw = q->fw; } r = q->next; free(q); p->next = r; } x->count--; } static inline size_t xh_size(xhash *x) { return x->count; } static inline void xh_clear(xhash *x) { size_t i; xh_entry *e, *d; for (i = 0; i < x->size; ++i) { e = x->buckets[i]; while (e) { d = e->next; free(e); e = d; } x->buckets[i] = NULL; } x->head = x->tail = NULL; x->count = 0; } static inline void xh_destroy(xhash *x) { xh_clear(x); free(x->buckets); } /* string map */ static inline int xh_str_hash(const void *key, void *data) { const char *str = *(const char **)key; int hash = 0; (void)data; while (*str) { hash = hash * 31 + *str++; } return hash; } static inline int xh_str_equal(const void *key1, const void *key2, void *data) { (void)data; return strcmp(*(const char **)key1, *(const char **)key2) == 0; } static inline void xh_init_str(xhash *x, size_t width) { xh_init_(x, sizeof(const char *), width, xh_str_hash, xh_str_equal, NULL); } static inline xh_entry * xh_get_str(xhash *x, const char *key) { return xh_get_(x, &key); } static inline xh_entry * xh_put_str(xhash *x, const char *key, void *val) { return xh_put_(x, &key, val); } static inline void xh_del_str(xhash *x, const char *key) { xh_del_(x, &key); } /* object map */ static inline int xh_ptr_hash(const void *key, void *data) { (void)data; return (int)(size_t)*(const void **)key; } static inline int xh_ptr_equal(const void *key1, const void *key2, void *data) { (void) data; return *(const void **)key1 == *(const void **)key2; } static inline void xh_init_ptr(xhash *x, size_t width) { xh_init_(x, sizeof(const void *), width, xh_ptr_hash, xh_ptr_equal, NULL); } static inline xh_entry * xh_get_ptr(xhash *x, const void *key) { return xh_get_(x, &key); } static inline xh_entry * xh_put_ptr(xhash *x, const void *key, void *val) { return xh_put_(x, &key, val); } static inline void xh_del_ptr(xhash *x, const void *key) { xh_del_(x, &key); } /* int map */ static inline int xh_int_hash(const void *key, void *data) { (void)data; return *(int *)key; } static inline int xh_int_equal(const void *key1, const void *key2, void *data) { (void)data; return *(int *)key1 == *(int *)key2; } static inline void xh_init_int(xhash *x, size_t width) { xh_init_(x, sizeof(int), width, xh_int_hash, xh_int_equal, NULL); } static inline xh_entry * xh_get_int(xhash *x, int key) { return xh_get_(x, &key); } static inline xh_entry * xh_put_int(xhash *x, int key, void *val) { return xh_put_(x, &key, val); } static inline void xh_del_int(xhash *x, int key) { xh_del_(x, &key); } /* uint64_t map */ static inline int xh_uint64_t_hash(const void *key, void *data) { (void)data; return *(uint64_t *)key; } static inline int xh_uint64_t_equal(const void *key1, const void *key2, void *data) { (void)data; return *(uint64_t *)key1 == *(uint64_t *)key2; } // xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equalf, void *data) static inline void xh_init_uint64_t(xhash *x, size_t width) { xh_init_(x, sizeof(uint64_t), width, xh_uint64_t_hash, xh_uint64_t_equal, NULL); } static inline xh_entry * xh_get_uint64_t(xhash *x, uint64_t key) { return xh_get_(x, &key); } static inline xh_entry * xh_put_uint64_t(xhash *x, uint64_t key, void *val) { return xh_put_(x, &key, val); } static inline void xh_del_uint64_t(xhash *x, uint64_t key) { xh_del_(x, &key); } /** iteration */ static inline xh_entry * xh_begin(xhash *x) { return x->head; } static inline xh_entry * xh_next(xh_entry *e) { return e->bw; } #if defined(__cplusplus) } #endif #endif DiscoSnp-2.6.2/tools/phaser/000077500000000000000000000000001420021152700156575ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/phaser/src/000077500000000000000000000000001420021152700164465ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/phaser/src/phaser.cpp000066400000000000000000000224431420021152700204410ustar00rootroot00000000000000// // phaser.cpp // discoSnp_GATB // // Created by Pierre Peterlongo on 03/07/15. // Copyright (c) 2015 Pierre Peterlongo. All rights reserved. // #include using namespace std; /******************************************************************************** * * A QUICK OVERVIEW OF THE CLASS... * * This class implements the detection of SNP in a provided de Bruijn graph. * * It is implemented as a subclass of Tool, so we get all the facilities of the * Tool class. We can therefore see two main parts here: * * 1) constructor: we define all the command line parameters available * * 2) 'execute' method: this is the main method of the class where the main loop * (ie. iteration over nodes of the graph) is done. * ********************************************************************************/ /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ phaser::phaser () : Tool ("phaser") { /** We add options known by kissnp2. */ getParser()->push_front (new OptionNoParam (STR_phaser_GENOTYPE, "Compute genotypes", false)); getParser()->push_front (new OptionNoParam (STR_phaser_OUTPUT_FASTA, "Output standart Fasta. By default the output is formatted especially for the discoSnp++ pipeline", false)); getParser()->push_front (new OptionOneParam (STR_phaser_SIZE_SEEDS, "Size of the used seeds (distinct from the size of k)", false, "25")); getParser()->push_front (new OptionOneParam (STR_phaser_INDEX_STRIDE, "Index Stride", false, "2")); getParser()->push_front (new OptionOneParam (STR_phaser_SIZE_K, "Size of k, used as minial overlap and kmer spanning read coherence", false, "31")); // getParser()->push_front (new OptionOneParam (STR_phaser_MIN_COVERAGE, "Minimal coverage", false, "2")); getParser()->push_front (new OptionOneParam (STR_phaser_COVERAGE_FILE_NAME, "File (.h5) generated by kissnp2, containing the coverage threshold per read set", false, "_removemeplease")); getParser()->push_front (new OptionOneParam (STR_phaser_MAX_HAMMING, "Maximal hamming distance authorized while maping", false, "1")); getParser()->push_front (new OptionOneParam (STR_URI_OUTPUT_COHERENT, "Output coherent file name", true)); getParser()->push_front (new OptionOneParam (STR_URI_OUTPUT_UNCOHERENT, "Output uncoherent file name", false,"/dev/null")); getParser()->push_front (new OptionOneParam (STR_URI_READS_INPUT, "Input reads", true)); getParser()->push_front (new OptionOneParam (STR_URI_PREDICTION_INPUT, "Input predictions", true)); getParser()->push_front (new OptionNoParam (STR_RADSEQ, "radseq option, homogeneous read depth along the prediction ", false)); //CHARLOTTE } /********************************************************************* ** METHOD : ** PURPOSE : ** INPUT : ** OUTPUT : ** RETURN : ** REMARKS : *********************************************************************/ void phaser::execute () { IProperties* props= getInput(); BankFasta predictions_bank = BankFasta(props->getStr(STR_URI_PREDICTION_INPUT)); // We declare a Bank instance. BankAlbum banks (props->getStr(STR_URI_READS_INPUT)); const std::vector& banks_of_queries = banks.getBanks(); u_int64_t nbReads = banks.estimateNbItems(); GlobalValues gv; gv.size_seeds= props->getInt (STR_phaser_SIZE_SEEDS); gv.index_stride= props->getInt (STR_phaser_INDEX_STRIDE); gv.minimal_read_overlap= props->getInt (STR_phaser_SIZE_K); gv.number_of_read_sets= banks_of_queries.size(); gv.subst_allowed= props->getInt (STR_phaser_MAX_HAMMING); // We load a Storage product "STR_phaser_COVERAGE_FILE_NAME" in HDF5 format // It must have been created with the storage1 snippet Storage* storage = StorageFactory(STORAGE_HDF5).load (props->getStr (STR_phaser_COVERAGE_FILE_NAME)); LOCAL (storage); // Shortcut: we get the root of this Storage object Group& root = storage->root(); // We get a collection of native integer from the storage. Collection& myIntegers = root.getCollection ("cutoffs"); stringstream sstring_cutoffs; if(myIntegers.getNbItems() != gv.number_of_read_sets) // No STR_phaser_COVERAGE_FILE_NAME provided or wrong .H5 file { cout<<"\t WARNING: no coverage file provided or wrong number of read sets ("<* iterInt = myIntegers.iterator(); LOCAL (iterInt); // Now we can iterate the collection through this iterator. for (iterInt->first(); !iterInt->isDone(); iterInt->next()) { gv.min_coverage.push_back(iterInt->item().toInt()); sstring_cutoffs<item().toInt()<<" ";} } gv.compute_genotypes= props->get (STR_phaser_GENOTYPE) != 0; gv.standard_fasta= props->get (STR_phaser_OUTPUT_FASTA) != 0; gv.radseq_option= props->get (STR_RADSEQ) != 0; //CHARLOTTE gv.set_mask_code_seed(); ofstream coherent_out; coherent_out.open( props->getStr(STR_URI_OUTPUT_COHERENT).c_str(), std::ofstream::out); ofstream uncoherent_out; uncoherent_out.open(props->getStr(STR_URI_OUTPUT_UNCOHERENT).c_str(), std::ofstream::out); getTimeInfo().start ("indexing"); FragmentIndex index(predictions_bank.estimateNbItems()); cout<<"Indexing bank "<getStr(STR_URI_PREDICTION_INPUT)< RMvector; size_t nb_cores = getDispatcher()->getExecutionUnitsNumber (); for (int read_set_id=0;read_set_id range (0,gv.number_of_read_sets-1); // We create an iterator over our integer range. // Note how we use the Tool::createIterator method. According to the value of the "-verbose" argument, // this method will add some progression bar if needed. Iterator* iter = createIterator (range, ""); LOCAL (iter); // Total number of mapped reads u_int64_t totalNumberOfMappedReads = 0; // We want to get execution time. We use the Tool::getTimeInfo() method for this. getTimeInfo().start ("mapping reads"); // We iterate the range through the Dispatcher we got from our Tool parent class. // The dispatcher is configured with the number of cores provided by the "-nb-cores" command line argument. for (int read_set_id=0;read_set_idadd (1, "Stats"); getInfo()->add (2, "Total Number of Mapped reads", "%ld", totalNumberOfMappedReads); getInfo()->add (2, "Minimal coverage per read set", sstring_cutoffs.str()); getInfo()->add (1, "Outputs"); getInfo()->add (2, "Number of read coherent predictions", "%ld", index.nb_coherent); getInfo()->add (2, "Number of read uncoherent predictions", "%ld", index.nb_uncoherent); getInfo()->add (1, getTimeInfo().getProperties("Time")); } DiscoSnp-2.6.2/tools/phaser/src/phaser.h000066400000000000000000000031231420021152700201000ustar00rootroot00000000000000// // phaser.h // discoSnp_GATB // // Created by Pierre Peterlongo on 03/07/15. // Copyright (c) 2015 Pierre Peterlongo. All rights reserved. // #ifndef __discoSnp_GATB__phaser__ #define __discoSnp_GATB__phaser__ #include // We include what we need for the test #include #include #include #include #include #include #include /** We define string constants for command line options. */ #define STR_phaser_MAX_HAMMING "-hamming" #define STR_phaser_GENOTYPE "-genotype" #define STR_phaser_OUTPUT_FASTA "-output_fasta" #define STR_phaser_SIZE_SEEDS "-size_seeds" #define STR_phaser_INDEX_STRIDE "-index_stride" #define STR_phaser_SIZE_K "-k" #define STR_phaser_COVERAGE_FILE_NAME "-coverage_file" //#define STR_phaser_MIN_COVERAGE "-abundance-min" #define STR_URI_OUTPUT_COHERENT "-co" #define STR_URI_OUTPUT_UNCOHERENT "-unco" #define STR_URI_READS_INPUT "-reads" #define STR_URI_PREDICTION_INPUT "-predictions" #define STR_RADSEQ "-x" /** \brief Tool class that looks for SNP * * The Kissnp2 is the front class for SNP detection in a provided de Bruijn graph. * The output is a bank with pairs of sequences defining a bubble. */ class phaser: public Tool { public: /** Constructor. */ phaser(); /** Implementation of Tool::execute method. */ void execute (); }; #endif /* defined(__discoSnp_GATB__phaser__) */ DiscoSnp-2.6.2/tools/read_file_names/000077500000000000000000000000001420021152700174725ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/read_file_names/CMakeLists.txt000066400000000000000000000016311420021152700222330ustar00rootroot00000000000000project(read_file_names) ################################################################################ # TOOL ################################################################################ # we get compilation definitions from the gatb-core part add_definitions (${gatb-core-flags}) # we give the headers directories from : # - from project source # - from GATB-CORE source include_directories (src ${gatb-core-includes}) # we define the files to be compiled file (GLOB_RECURSE ProjectFiles src/*) # we define the artifact to be built: the project binary add_executable (${PROJECT_NAME} ${ProjectFiles}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIRZ}) # we define which libraries to be linked with project binary target_link_libraries (${PROJECT_NAME} ${gatb-core-libraries}) # We copy the project binary to the 'bin' directory INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin)DiscoSnp-2.6.2/tools/read_file_names/src/000077500000000000000000000000001420021152700202615ustar00rootroot00000000000000DiscoSnp-2.6.2/tools/read_file_names/src/get_read_file_names.cpp000066400000000000000000000042311420021152700247210ustar00rootroot00000000000000#include #include /********************************************************************************/ bool isALeaf(IBank* bank) { if(dynamic_cast (bank) == 0) return true; return false; } /********************************************************************************/ void printCis(IBank* bank, int* value_i, size_t depth=0) { LOCAL (bank); if (depth==1){ cout <<"C_"<<*value_i<<" "; (*value_i)+=1; } if (isALeaf(bank)){ cout << bank->getId() << " "; } BankComposite* composite = dynamic_cast (bank); if (composite != 0) { const std::vector children = composite->getBanks(); for (size_t i=0; igetId() << endl; BankComposite* composite = dynamic_cast (bank); if (composite != 0) { const std::vector children = composite->getBanks(); for (size_t i=0; igetStr(STR_URI_INPUT))); /** We dump the bank leaves hierarchy. */ int value_i=1; printCis (Bank::open (options->getStr(STR_URI_INPUT)), &value_i); } catch (OptionFailure& e) { return e.displayErrors (std::cout); } catch (Exception& e) { std::cerr << "EXCEPTION: " << e.getMessage() << std::endl; } }