pax_global_header00006660000000000000000000000064126551461160014521gustar00rootroot0000000000000052 comment=a11e1e22ed9f10980e5bf3ee21d89d11a4489d68 andi-0.9.6.1/000077500000000000000000000000001265514611600126075ustar00rootroot00000000000000andi-0.9.6.1/.clang-format000066400000000000000000000003501265514611600151600ustar00rootroot00000000000000BasedOnStyle: LLVM IndentWidth: 4 TabWidth: 4 UseTab: Always AllowShortIfStatementsOnASingleLine: true AllowShortFunctionsOnASingleLine: false IndentCaseLabels: true AllowShortCaseLabelsOnASingleLine: true BreakBeforeBraces: Attach andi-0.9.6.1/.gitignore000066400000000000000000000014321265514611600145770ustar00rootroot00000000000000# Binary and automatically generated files *.o *.a andi andi_* randomSeed.dat seedms testRMQ src/config.h src/stamp-h1 src/config.hin src/config.hin~ #docs docs/doxygen_sqlite3.db docs/html/* docs/latex/* docs/andi.1 *.aux *.auxlock *.dep *.dpth *.toc *.out *.pdf *.backup *.bbl *.blg !andi-manual.pdf *.in !docs/andi.1.in !docs/manual/version.tex.in docs/manual/version.tex *.log **/Makefile configure.scan config.status depcomp install-sh aclocal.m4 **/.deps/ autom4te.cache/ README ChangeLog missing compile configure ar-lib src/.dirstamp # test files *.fasta cachegrind* callgrind* test.trs test-driver test_esa test_seq test_fasta *.trs # Coverage *.gcda *.gcno *.gcov andi.sublime-* # for legacy git only: libs/RMQ/.deps/ libs/RMQ/Makefile Makefile # Profiling: gmon.out profile andi-0.9.6.1/.travis.yml000066400000000000000000000026631265514611600147270ustar00rootroot00000000000000language: cpp compiler: - gcc sudo: false addons: apt: sources: - deadsnakes - ubuntu-toolchain-r-test packages: - cmake - g++-4.8 - libglib2.0-dev - libgsl0-dev install: - export LIBDIVDIR="$HOME/libdivsufsort" - pip install --user cpp-coveralls - wget https://github.com/y-256/libdivsufsort/archive/master.tar.gz - tar -xzvf master.tar.gz - cd libdivsufsort-master && mkdir build && cd build - cmake -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="$LIBDIVDIR" .. - make && make install before_install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi # - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90 script: - export LD_LIBRARY_PATH="$LIBDIVDIR:$LIBDIVDIR/lib" - export LIBRARY_PATH="$LIBDIVDIR:$LIBRARY_PATH" - cd $TRAVIS_BUILD_DIR - autoreconf -fvi -Im4 - export MYFLAGS="-fprofile-arcs -ftest-coverage -I$LIBDIVDIR/include" - ./configure --enable-unit-tests LDFLAGS="-L$LIBDIVDIR/lib" CFLAGS="$MYFLAGS" CXXFLAGS="$MYFLAGS" - make - make check - make distcheck DISTCHECK_CONFIGURE_FLAGS="LDFLAGS=\"-L$LIBDIVDIR/lib\" CFLAGS=\"-I$LIBDIVDIR/include\" CXXFLAGS=\"-I$LIBDIVDIR/include\"" - tar xzvf andi-*.tar.gz - cd andi-* - ./configure --enable-unit-tests --without-libdivsufsort - make - make check - cd .. after_success: - coveralls --exclude libdivsufsort-master -E '^andi-.*' --exclude libs --exclude test --gcov `which gcov-4.8` --gcov-options '\-lp' andi-0.9.6.1/COPYING000066400000000000000000001045131265514611600136460ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 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 General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is 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. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. 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. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. 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 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. Use with the GNU Affero General Public License. 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 Affero 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 special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 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 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 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 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". 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 GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . andi-0.9.6.1/INSTALL000066400000000000000000000366001265514611600136450ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. andi-0.9.6.1/Makefile.am000066400000000000000000000021611265514611600146430ustar00rootroot00000000000000ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4 AM_DISTCHECK_CONFIGURE_FLAGS="--enable-unit-tests" .PHONY: all if !BUILD_WITH_LIBDIVSUFSORT OPT_PSUFSORT = opt/psufsort endif SUBDIRS = . $(OPT_PSUFSORT) libs opt src docs DIST_SUBDIRS = . libs opt src docs test opt/psufsort # Conditionally build the tests if BUILD_TESTS SUBDIRS+= test AM_TESTS_ENVIRONMENT= \ RANDOM_SEED='@SEED@' ; export RANDOM_SEED ; TESTS = test/test_esa test/test_seq test/test_extra.sh test/test_random.sh test/test_join.sh $(TESTS): src/andi endif # BUILD_TESTS dist_noinst_DATA = README ChangeLog README.md dist_pdf_DATA = andi-manual.pdf dist_noinst_SCRIPTS= scripts/maf2phy.awk scripts/vmatch.sh # This is a small hack to satisfy both GitHub and the GNU coding style. README: README.md cp README.md README # Recreate the changelog, when the version string changes. ChangeLog: configure.ac echo "Missing Git" > ChangeLog; if test -d $(srcdir)/.git; then \ which git && git log --stat --date=short --abbrev-commit | grep --invert-match '^ [[:alnum:].]' | git stripspace > ChangeLog; \ fi .PHONY: code-docs code-docs: cd docs && $(MAKE) code-docs; andi-0.9.6.1/README.md000066400000000000000000000070411265514611600140700ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/EvolBioInf/andi.svg?branch=master)](https://travis-ci.org/EvolBioInf/andi) [![Coverage Status](https://coveralls.io/repos/EvolBioInf/andi/badge.svg?branch=master)](https://coveralls.io/r/EvolBioInf/andi?branch=master) # About This is the `andi` program for estimating the evolutionary distance between closely related genomes. These distances can be used to rapidly infer phylogenies for big sets of genomes. Because `andi` does not compute full alignments, it is so efficient that it scales even up to thousands of bacterial genomes. This readme covers all necessary instructions for the impatient to get `andi` up and running. For extensive instructions please consult the [manual](andi-manual.pdf). # Build Instructions For the latest [stable release](https://github.com/EvolBioInf/andi/releases) of `andi` download the tar ball. If you'd like to contribute to this software, feel free to create a fork of our [git repository](https://github.com/EvolBioInf/andi) and send pull requests. ## Prerequisites This program has the following external dependencies: [libdivsufsort](https://github.com/y-256/libdivsufsort) and the [GSL](https://www.gnu.org/software/gsl/). Please make sure you installed both before attempting a build. If you did get the source, not as a tarball, but straight from the git repository, you will also need the autotools. Run `autoreconf -i` to generate the configure script and continue with the next step. ## Compiling Assuming you have installed all prerequisites, building is as easy as follows. $ ./configure $ make $ make install Excessive build instructions are located in `INSTALL`. If the build was successful you can get the usage instructions via `--help` or the man page. $ andi --help $ man andi You can simply use `andi` with your genomes in `FASTA` format. $ andi S1.fasta S2.fasta 2 S1 0.0 0.1 s2 0.1 0.0 From this distance matrix the phylogeny can be inferred via neighbor-joining. Check the [manual](andi-manual.pdf) for a more thorough description. # Links and Additional Resources The release of this software is accompanied by a paper from [Haubold et al.](http://bioinformatics.oxfordjournals.org/content/31/8/1169). It explains the used *anchor distance* strategy in great detail. The `maf2phy.awk` script used in the validation process is located under `scripts`. Simulations were done using our own [simK](http://guanine.evolbio.mpg.de/bioBox/) tool. For a demo visualising the internals of andi visit our [GitHub pages](http://evolbioinf.github.io/andi/). ## Data Sets 1. 29 E. coli and Shigella strains: [data](http://guanine.evolbio.mpg.de/andi/eco29.fasta.gz) 2. 109 E. coli ST131 strains ([paper](http://www.pnas.org/content/early/2014/03/28/1322678111.abstract)): * [99 newly sequenced strains](https://github.com/BeatsonLab-MicrobialGenomics/ST131_99) * [10 previously published strains](http://guanine.evolbio.mpg.de/andi/st131_extra.tgz) 3. 3085 Streptococcus pneumoniae strains ([paper](http://www.nature.com/ng/journal/v46/n3/full/ng.2895.html)): ftp://ftp.sanger.ac.uk/pub/pathogens/Streptococcus/pneumoniae/Maela_assemblies.tgz ## License Copyright © 2014, 2015 Fabian Klötzl License GPLv3+: GNU GPL version 3 or later. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. The full license text is available at . Some files may be licensed differently. ## Contact In case of bugs or unexpected errors don't hesitate to send me a mail: kloetzl@evolbio.mpg.de andi-0.9.6.1/andi-manual.pdf000066400000000000000000014771111265514611600155040ustar00rootroot00000000000000%PDF-1.5 % 75 0 obj << /Length 410 /Filter /FlateDecode >> stream xڝQMo0+|mzDINP.mwc&xS&Q7RB͛7#W@k,y$gD]4Yy i b8f%iv{ 5Ի!чby 2T im`9ȬsJLTHb5O=GKctRWY1֍]x7+7QidC, )$=x?LJ//z̖ؗpRy\#PiV e"! a *@-=vɈ ;܃JިT|WX4y|A S2AgY7iBVHiP5ȶϞ2PR 5# krQ^B&/ endstream endobj 73 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./andi_labels.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 83 0 R /BBox [0 0 793 639] /Resources << /XObject << /Xf1 84 0 R >>>> /Length 49 /Filter /FlateDecode >> stream x+r 26S030VIr *T0T0Bf endstream endobj 84 0 obj << /Type /XObject /Resources << /ExtGState << /GS2 85 0 R /GS1 86 0 R >> /Font << /F1 87 0 R >> >> /Subtype /Form /BBox [ 0 0 793 639] /Matrix [ 1 0 0 1 0 0] /Length 1617 /FormType 1 /Filter /FlateDecode >> stream xWKsGﯘcr0==ϣ- `CL֦I}im@I3_%FqOJ>qsx;< ZSPj%n/=~lrU*WyK)thk<rmgAh%,%1H"p$Al?(q*^j< '-Hc+c:&^X`a +FE8@ҢV ` :@cUyOJ'*^7XeNLNPHvc6 :迡:Hm;.oRZ@Eg EY),E>J f<Pr1Q/羚aŵk_VWm=)pJkP56 X_tg<͗0Sl:m<><^~R< ҉F %Ҥ-YW@ҋRl;.*.&Қ󪾑7wwbu; :I fy'Q6=Nm.Z}ܯh=6Ul$tA"=]J:_߶N~ 7_eZE}E]΢Qp7*lri r~yb -V5bO9\CnڀIZSL^xZ+:jB_iJvL WS[wzEciu~TS*zUEDlev?=E.HOBc#*ʹ4]7o~QzA?{ 꾬^qA>I&'a"^G7A$؜`$Xmxv񉮂wmr'~R;q`MQ endstream endobj 93 0 obj << /Length 1129 /Filter /FlateDecode >> stream xڍVK8ϯ\c f[ek \f~ՂÌħV/wk_QOngAEiY?Uei< MЋz| 8زtuVveENpif[n2e79xo IʣԋQ$"(IoМzђi#Zx;-)gG$&@>ë [q#0DdG6V+ vq&iI-w[qdgZi#ұ?K+`z֢#ܿOhCh/.WUw=m/6𠚔cP:b` radI ?jxmųd e2J*@ڴ=Qk N&}OBW` KfIbu/т-^ DJhɶw(HŒT,iiM'Rg8< YB-K I{.\?}_IH bҏݎ)+(.["1UR{O/A35F ϜyΕi|+ Sͦ/C2^|A|:-}B~^-렅YIo M\PnybRfRK}),zggVy/j8nG[P5K}o7<*u }uY6?G۱-YAI9LV멳X%iCղC,W3鄚/Hk\ee}&o;̴鼒aaWunRgoio Ul /VSa_7Oqᱟ t˦ps @mfi!t8`. {S$ ^2gݭ81(^18J7itUj5tM`U 4OfdjZ c:n%QG: HOG?ygB˄2=`39qٷ~įFJÝ'᷵{"΁g8h3VJ(9q[es?~e)#ӟv>mpB;ho?jPъYFy7oUvR,-HHy/8=X endstream endobj 120 0 obj << /Length 663 /Filter /FlateDecode >> stream xWMs0+tRcCN:-9ezpPOfI_ [p6 %4>`{5`0J7F}`/N%#)P1b&:-2K)2md$> Q$_$Fh2Y,2+r pݾMtnZru$! DC2Mi '^PI _9n] $Z}ibu4okjy}V~-6\!Ae4-{F/GaO"+$R"H f^ Ų .\ +EDD]^i:河?e pԱCj\[_:LF=dhc2|Bc ڔ%L\> stream x3PHW0Pp2Ac( endstream endobj 135 0 obj << /Length 2488 /Filter /FlateDecode >> stream xZIo8W074tI'vsPI**Nh+A5[H{Tr7'um^=,"#ܺZYh yUl}k_UfYXErbO[T#rEr@s2} p,]}C\ +@G<Ï`XljcX$a&U_nýnԅ~prs.G2yjѪ wDiޤnnx9l=ì2Yug'I'yëԍBE>-(hRS#7fb,K,|8 \[7m`̳gJH <ku'oI%@3`gv-0r jTkx̵n9$E"erklbHD)>mlG@yN0;4^ᣀR=L*(ڼK*~ q3U6e8"D( 1*Yan4uӲFpĖnExf1aWGs\jjQͅY'9w})v eC<8G!>ZFaXϲ[É0<>%V4O46V`- Sp$xwآ` #~Ki|u1>Si  sp t;V5$u~#o&:9 Lek,٣R&\oZw%M*g\iǐR5E$]]6n"eW㮎 %cL;-߂.͖9˽>k4_O8C|= O2FZjS4 F-#Ȕ-f+V ( ,\ffrȴ:J҈LXKb4:(X l@, hT6h1aB±<+B)7L$OlB2 [);7iK\W)Dn 펜yQ' /{0@ i:{(RmNqwMh;MhKtFpeKl#kO1f2NofUeݭ@BR{j1(p[LC%`/= 3~ (]4H}j_4i7оMnDjB]L4 BLeHx,ᶣOcrċ =xw2F|oCd)ުޠO2qI:g'<@`-G #zyOhGB5Cgg]u];8^:^_"4Kj;RyWtS6IWIT=-d,R9:ʰ0y13 Kâjv,MyJ}D8;Cy>/)85"M 3[VFI$jv^sļ8~$RѰ,241'Ю٨= ߃|$2M| 8w&` 2jV9FGQ><$VN_ w]LV:/L4* t> stream xڽY[SX~跁ѹ_RB 3*&<md&_?_˂`mTAI:n~dIR$#)u4@P½#g-i;OZXfi^d$2ʒd'c8<.?O+ɂUd֧ :Mr\'/-n7/"pk)H=dXE$~(5E(m#!6S2yPMAp36RƥTRN ҁ0C@ @$Jl,v) R < :2 ȁZO ZcxF$HxǐP*f\!2[47uҢ+7lZnNBz:m@i`VbL %1ɳPEn )ch ,@l؊07`=fKߒWذ?O AF95aheA+h F2m xðuylpʎ){UTpS_[e aST=:B] G_9>,qzC8fQN݋^0 Y4YC켸gjڬba4.U|RESMm/Ť]RRɬYE{3kvsd?|T\~~fVi?y^|%yًS0ԻeYӼshtm~4g|J[I1pHļ??vߞ]ކLik9D:V?E_@2G*ub$(,+/vE||7hx &/:gd.ݲ.i)^ ,B< uv)[e`{D@CC1lV_ݝۺMv{{[fR?ϲ dٙU˫jWTlXېa"je\ya$R4ze\!YQɅ8ow(4 GG-g [sI q1Ǔ!r4ldJskaߚ;&'vqǝNGWs(vq&޿9ǯ^L0B8{80I=*\8W$uHi1<G8Z87hD:Pҽ_4hO |{/"zINDѹRIz3m1p[FgJ.|twyy:+E6.FyYuvY=̬8|gmτS9.#“`fi2X u-i@*Z!ڶTy&?d@Ow($ػفǤX"W]]w5t])'Uu׎ KAokGhݷuIXc_06"v3GϳoTC2PF yfY#޼&&U'LXbcF@^FeF z *]ݜN*Q.Uvaj'ݼQ\Bd9T`r>ίDC?:' Y 8n"Z#!>PmԮcN`\Hkؼ)YRj&ɬ'@Ck!Qjw"!ThRĪd#;uO9)4Z' kؼYlNadQ)`b\gy18FlSjh@7M?&A;+ oAmAQqrr<=]۫Wwm]ӵFn5 ?P'e\zS9􊁿QIZh 4B =mpj'Ut~Yoo*-p# g +͏kOU`qUc0BA Y%CP!3j#n}>͡b?"[E/FL܅Cۯ'_Qv>[޲ԍoӮHh=Ü܋H42q5mc2:t&jn_պ'_9?Ek1~h_.ǣQVŖIhc,G\~nᾷ@ Ԯ endstream endobj 169 0 obj << /Length 1883 /Filter /FlateDecode >> stream xڽYr6+Ɍ4 aċi$=N;ukfAI E*|q^JF+#˦5k^ݛ7&Kmja˔$BEBP^_ WVP'bVyk%5NndN <7z{..s( $/ OFNɵNFC"vU}0`S"BOln Rf ELP%CCk{, U{[HɎ=/uլ@CJ0U jZS5)ik\v/nܷjJ]yr3H#ѽf(I'BFcKӊ{2T6/]^Q1pƳʾ_OAqR!h[5}1_Ii. l2[%h;I$]BTEԕ0A |rF@Y_~sxV硞Q<]R&uNyxc7t4;څA٘9X࡚ME4iخa4ȾA(*aO``s"UF\ݾ$^i(uU{U>l ~Lw"lJvQ 8Gu;.cc鈖Cؘr;EX-k8LyK;7dN&V !LjVBeFv&O qO@v:j޲&/ ,ӾqJ@UU|#[7daʥY`n!GUP`- N]1倞p=ꢥ*-u#+֠?9qs^Y!غsi>ݙ͢= Ї;yFgcUen 22*$4\~:nϭK/` o[.Cw9bPiw9A!)wVUcQOnM8geL^^)|7|xM%LSggganL',E/wSg M>(Us]dtqFFĂ )?}}:e!#0A[,@#JW<8LVfd0 nPv4Lŧc=lۚݹX(8Tx ~Cfp<7 nUURQܔ=} #jƋ-;CCșFdCx]@7X?yތ9>Aw}R纾ɰpО>|޽Ds w? xJzpj)c_:@0DA:JL,G\BFclzW=?=ݫ駬H*H`2(:A~P# endstream endobj 188 0 obj << /Length 2533 /Filter /FlateDecode >> stream xZߏ۸~߿}( 1O)"9zeںƒvCѿdt}@lDQԐ3~l=gGWL_>F7o#~LZˤ1C$ яMor2 IgY#3So7|!k@W}j7u_o&@Lh "Z8h4L$ j6uWP|㨟bA46kyG,%J`۬e 8j3TݖfaG}RAeVM!k*+&[n#Aomwk-8r άָe]Y8ڂES/nMFuE]00\Jn=;77R3 v޸nkqxwoq0ʻoR"bآ~*tpFiGXNk$S &}=HB {QIͤױL6UK(&qD"b?Hhľ\2uU1'ŠS2(씿/V%a\ QU(hgu+EaQj9,<[ lي<h޻!vb0mhѮB\OZHB( lO95 u,z[O*5*LgG?e[:0ΔY;B3wssB@^*j3^뵋:ا]{ 1[$: CF#Ov-k)?ԜqbӣS8Ϸz$K@I R /o0ZEW( ZصkH-Gǜ>%Ne}ȈakaOGriIz%%mHf|`ط6y}ɶ%m/CaWT-j ,ilZdѻJK[ f-myp~ǩݦ| a@}Pڣm8MZoSYJҧ6|:8KnW\תuxG[c/uC z++n`dܳVuLJBW4i P4 F^`t#U"|BTȰ C}Ʊjl2932#O:JS<Š ?oIT7$I`\THY,#ѻ5NZ_r Z0ÂrޱŽ%< xV>;pja+_|˷ AL%}8-?wM` S5Dsg D[R-VG. ĵ=T.ˮ*{# !7E;dLs88CpZ|BEn *<8 6Y Y Nnb.t:(e榕ipq*GɅ4+؛q !cnԲ֠?I[Z*<K=r>r?pO*/u@. Ħ+^ʧТ]VTMQPj*QHRןXؠڶQM:d2T"a%-u)B8\Nlχ<:>iZ|aI}1x.ΉMmK6/Lqo&`˦vyx(m_˺,FXe]^*s}{*,\R'H6 NpCo<9^,&[=B$5CʣZf%pZpG=WYZ4K؜Q~˱!9 8:jo(4lx:"t][UF>Q'Ym'xt rKe5O38ʄή,$xXd485C]3" ' LD~9$`٧{kCMu.{0.~]k@Ʀ[l[wHRJ͝16"-5:[7-67cp}[䑥RyԺn[/<{rSϭR7L;@)Ӿꬩ.`:ށ' Cu8:1xf«0Kk+j@endY^M0 r!?o3%> A#{)qo2~3 8+` $,op!±ROWu ]DըvGcөo% ?T_S< !ir }/_ \l'2 JH^;z )axuUX?o!_{P"I\ՁU=<׃iF,CJpR?@e?,wpg_=?|4ɕ~!`u~!p+B(ƿ/$8~!|/$94e!,U&@_FN endstream endobj 217 0 obj << /Length 3320 /Filter /FlateDecode >> stream x[K6ϯe20f!,@2d3 Amڑ%Go$z'X;Hd"bWl]/{~^e,RެJL1H7 ѿXsN7HMz}/26}ԃ UCv4ۢn_'YL&e&@]'w%Q$S&~++=SQ 'Rz8[obEv |k8͍#ܬR IHF x reSѶu(`8*XyܶfD68G` g @Y`%KyVގ:ha[=wy[fvԵvlKy;o_;J>-6H!4Hhˢ:f72}ٹl-H9eݏ2Q,R$iy1tyy5x"ѲkY7= 9M1!>+W =l46F9ulwox%bb-L1 %`"7q3h~j >gQ؜ZE-pM#܋;v39UY/I4 in kC5;lpSV7}&q6yWvTtN1-41A1r9Nޕݱq?\"0*,?w "X?i}mtd*e]Sڡ0T}V[w4mO^I|pRΔv(N}N 2;/Ӡ @0{|Ɂ YN:v몠FoӢ}*8l𛥥cy#k!r۟v:A:e\AUvςãU&:H,6Af32koWӟ?L_ɵG0+-SP\m/#I`buϜD azceAdCAc.q̘)aH=É J|!ڢA})άUHu!Hb!|@}^Ƹf cAs<ȣԼWL|#@YzP7=UP\Hf?pfhHj ^Jt´90LCL 1s,IeXnT'9FY:&1!97H㼺T G x}8BtW'z\|BcStZ- cݝoY(!~ #(;I>>ItE~B)xC& "iDOX 88z[͡p#*?8vB u -؍120anҘf;({Z*-x>77e/Mkuxxcl=ธ X0)mL*CEHcs ΰZK _28S< /4 'f&3;zxWt ]3I!m:kBL:Ჱ(jS枸?P=#|zլS-|UG!ܪ0n-LT>H%KG],/Ko9m~(z2j1KU+1e/?TN bv,:ރZNKwڔ(K ZnC̪uXt߬A9V.0zG Lj?x PI\}WWC^a.v8޲]q;BUv%!%B#cZńZ)*Q:UMgI7ٵ_kP:n"|*fYVUaKw܅+fFO""8*%$O+z,:VcvfȬ% Jma/ެhG2#3W򗃥>'d[Edu7Tm_9/uS6Ce1 -{%eID/Nks?yo ] [<'x{fEh DUuh]oJսeߖǣzcku7A/Nm U߱T/@m:(Χ/4M_pr"t1lI5Y6K?B)&A)& 3hiXi QΌń Ej's([pHHc,N|}1M*T̰8/^Eqs` . wEI&LCV q1oť04J RH!Ï~.o? W endstream endobj 250 0 obj << /Length 1179 /Filter /FlateDecode >> stream xڽXKo6W(h5SѤEԇ.lkY^[n`I)A2`P793dI(aDcttq4q4d S0chtNn$Q/N:{5bT UlVrWKi%9iEhY #Q`$v%4(>]U<ص?+-@}Ci'XamPp}Z0+<5n:#$?8KG0ILF.7f1Q85CTׄ:ƈtlK~n~#t;wOn;]:X9h%j w Q;(^59Pm8_,]GHu Uk/u$!Iy C}))ѧ-eH~YRUqI>=$&.=UϖUa4_Ah" f/MSeYI>d_kؑ 8jtIzmbϠ3Z'uilm#|׫~d`P)#,ʀa:M%K{J9 S)'0U~2RJ~0ٹ2 13^8FHB.tQB|? +P&`rb0ttS.<_zn>r`qmk\c.*&)MZ0u/1B"OKy|V8?_g,kR<[OVA:H!|@ѣjo F/wO(HBJ Tx{G"Xɑ{/Zf/z7\]hrS"Baa<FZ!?*7<䈍_

3HaUUm_]\dŇr}y2< 6YU럋/|ӛݮLc),_iR endstream endobj 162 0 obj << /Type /ObjStm /N 100 /First 875 /Length 1945 /Filter /FlateDecode >> stream xY[o7~_A`_ssx)int y屣1"r1,xn<<ʋ7x!ÌG09a <HQPTX6)>:4>á{6R\hErg_lP B/̡UQ),Qڤ:M{'GAά:fʹ4>ca :Oѕ@t&xP ! 0.&EIې@`)dR+cpȰ/Pq:S %LAF% @qa@N De Aux*@`85= f nİa)$ʆVĆA8B)u NXI1sم9Yg@/+Ot&bu&q3ptG^FE2*j6R+1ax c@8bːXrC dM x $nu!% D9>nڟ͙μ6~d )+ .o~"6ݫ² K&FgW%5XqU,6WMl =bޔmиJ7iz6L-y5n2/l'_ ش'5N 8'&-}jO'}}̟Ztݩ0W]!WC6dE7non3ƶqbcќ) )bLfosy n5Hp;ժ1Dwxܙ@㺦=ݞ_Mc#c}Ѿl:Sc*:8ˤ/[H{>Դoz]e`Yz{AQx=u0T7DlrѯJA#X_lp"Q~S\1ė[ޑe[%Ml8IgOnh #0\oo۫n{n?f{óBꑌ,l4;MDXxDmJXf v*>Y-D.2 'btP/TaW cŗ:!!_*,'WQaX+mمJ pD.azʄ*a?{*{FL*eIrLBO%YK 筐6:-]wt?V~;\o7kjDUA3Z3ZlXuO<_Z=ڛf٫?]i{iT7#Z[m nȟS؈_&IuJ0D}hč48ݘh2LMI`a'nȦsnףWIX͎[p@+ c@= ~^.PHlT=Zr'SvU݂Nݖ:TKEwI0C Etp"ywWяI\aT!ڶ}Үȣŕ>(|k;L#J?EO/)u>e2ӳSW/~{Ku}t!8Nb/'7Nb_7@UN endstream endobj 277 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 288 0 obj << /Length 2288 /Filter /FlateDecode >> stream xڽYIwW2/"S[z8u?^ؼMD(MI\m!*bD4ʃ됮I?+Vk߷/W}n󖥁@"%&kJM#\mOVbH5$|hTPUvrs՟pW]ƅpTwgc{tW0Fp,*«;fìp9, B+{ٙ)#(7 ^S",hIDT-[TLI‚Ǟ։?"ȽO$1Œ} hwEU4~oJىTVTP4]3XBZ[Nwݠ\3l:n]Gzkjg֌XegLroL\ '_$C;hk_,?lN',"ď6i뾔Fзp&6h~Vۥ"8G:sag85ݮJ8e'T5}*7ڪR|hrvvAWvhχph9.4 샃?  3Z'byF3' :ez^ mo5aMj_Fp$&k+yGtU)A Vk ql|&8:6Q)bſtzLuJPn"2A!rL GПS۪v $b>ȳ§]z?R[id"y L̜xc|ʷQrW|])kv{8;u!fYWˇtFGvir@F}/Ġ.0d8)ڜ{L ʤQA#gso`XoTeAeP@cWT'xNyAt6duw2ڒ'K (of Xě AaYQNISx0{d!^/N4E"8!jsizǤ {VB9t)]DUw)_sL=/8XW, +e =GT4`{3Uon~WpߗpP;uG`EMa^ 괿A-[kXwCTC,5fxWUm'r|ѶKm.GozU:S<(.a0~s3zs YV"@ԑ|lv,P܏N};|z[Y'n38G/Kr"XLk=mvVw|ѨT^~XJ4;BÊ F{@㥷RbfjE0M{ 4 dSYG9|GzNgFhsRn)utL,tߪvs:554$l /\Qaͥw'Isus,N4a`ENv j`3 =6}?G=c $$S;Yv2,WHo]tP;aZxp xi^SoJhg, beXr_ )^YXXe3 eF0FS H [`uWAYA]?m6]#cI)T77|v3dGkG/O{6׬vF4K ܍15_`1w1^$?Vm endstream endobj 300 0 obj << /Length 2196 /Filter /FlateDecode >> stream xZ{۸?z@/2qŗ5)+E $VmնJ>һ~9ly6Z4FI $[z=s~r.J"8$%Q$@[5Y@Cîx!a'~,#QAzIv@ߗp.giZ5&k0(J5 ilY 9Y)kǔknvU9Ƕ)u56WjO][5`儆ԊŦGs>ZLW:~b]l6_Vu۪^co[U-ʹ]ck\j8ir8,n!cwc>Zp6jUШQu*У$aLSӡ2P 1 wq%t0&Pz, >NX}uEɃjYIX|[t6ÌG}/"(Ep ڹD \:ڨQm4`7qݾdhtvqs}MQ8V-~ )irw1XݤBbYF3yVjZlwتR7NwpOf524w|.4athU}^u7y Ěvh˱6beF3@<~Ϥq.0iJ3Z~ꦺOvu3cZ5}r[v4-gr ff 3@ hݻn&!b,턹't`fl]E9_I7ElkE)^%?}mKUmQ*4WYT(vtYtBze0ieGD$CܮFnTE!xA 2&3v!45Jc:3" e804%y=8<^̀R)HJ"0ɰ:[L29Mm뼎Й{Xw]*-7iޒ maC8HjIZ`Z6[q 420?V#+Q:vP^Ebԉk='|ݜz{ W*_W-'ᓭ8$0zƭ z[6Aη `/<Xgl~{TE|- ȃ| ECHLr3&Ħ!ǧ W/g=?'V9P0&L]BLx PS|'~"fe;f2$ `ao_X0~mX! uDnҼh5`_h.BşB\l{q}Qmu.𼨿yWd^'I|!MNx>lV_~t9S]1}'}|y@u' $." ϔ#(@eqWj3WoF` ì&1X},;cc>ݨqB>_8.X!$8b3`F0H ةz cax?x\ݨ>}~+l|5>{)Ń'GhZ>BP2A9᎞R."~3SNs61aTqb=$1}' I\xtCu,ti<֐t3Ah GGS~J°O$MNp!> stream xڍVn6}W4Ӽ&d ظ(dhbHTޯ_>ؔ9CHpEF 3%i~]M2R2͖QB0b2̥f ݚyiUfctv`iL2bh9NX6%?DocIz£1GjS;Kј2ڔf\N4ʦ&2R:V*4!<nMiW:UӎD8bmVtm "c&h4gB6Kp=躩tx~͍˫_j G խL]xQl*0 "Mkj4CӦۘSnU{*G8d1J|iU1'vL&E-&E@c8lMuW*CjQzѢ12Gp=~{,VWG4F&PrJLܨ:L+AWR_ыET ]P3 S܌,Sٰz#}YYwTNasBAz G? -@ʑ1YO0MaKɽ0P|'р<֥wg )(ԮJ8u2O~o(;D ӌPq&p*C=h6Ճ=QLn>ީ6bD=ȃ5jJdޗˀ"Jwgi<5]uN(,^tDGt[fww_Ž$ q}Qdgw%Qg3[ܴ`{ ]ޚ,FS S^)tapU]U[6\vgyF}| XHqH45$qmv|:ä W۹\iϐ Row8.z}%C;ub)U.6&kºvJU#e!jzUh}D,]::J ;4&fNI))?}?_z^ endstream endobj 351 0 obj << /Length1 895 /Length2 31261 /Length3 0 /Length 31758 /Filter /FlateDecode >> stream xڌcpnݶ5vضm۶m۶m+bsvws[׬5ɈUL]VVVnv&z&zN.+_FvfIq u053O0Mnb`4?DyW+3?nl `PrtHlmiap75s9۹<-ffsW#gL]\a$effFE7c[+JR<\-Q3O3G / zjf꿒fT[:r30K_!zsz{3W]*̌,B#ۿo7r LvNS?DJ#;+[fVJar43Ur5-#[ĥ\S ڿO 3EIRV&6f..qv7q0\U\V4wUrÿLw-gl agddW;Wg3 +FRv11r29LLN.7qsv6wYkmn/fff&0&<֙9Yc3Db,֑NVԚ!0tOe2YG2aD0T &0U^lZ"|^wK$o;ї HuFC8fZW^y|^KCq@ `bLfH.U?fxm(0J$HwqUA"%RI3g  kq N?J%Q/"ZK[R nF0TB[?Da!<ی>[^v1FE`6$Vtv$bZ>&q@ He}Dg.pSaeG)m'i l.#t#(/dRUqH]OPKJT'FOb~|6깈GMAi+d>{=|FQ?=bYw$3?oZ+#2 _<*+}VXB \À<.?Zbun#.t(#%nrQ4dl~Z([zisȡmDZ4Ky؝gi9%\t7lن^wPI38j @6&<$y'/ |t3* umڨ=]v)mf 2oŭS8p\0hc#=LuXJOG:Vwv2r0b 5ADU4Cꘙ눨{>f00/9@|ƹ')%G5e؟[ Fg(ˡ!S1d@U[Az'kTwWSoaua*4*"ooyx읓)mǥqTI+Oաܨug "J x;j&R;z^er+HoSl?wH$; .bt0<å:[QX[]͹*%GI/7xq:L>.ݳS_.Pmه(i6'utWr cׇ)+A}BI%Ԯ30鎻#t@[d DdPґMi<+e*gD=Σ4|a( mqs%w2ڊr$O!v@|x< [_b:!ۺɬsTolt>8:) rU~eim=!%sV5:Aо哼 7dFyz!Z^)A$GЬ}>ߌ= 漖GdnXz̴/Ec6#!6ZBKͤjW׳?HaraX%c+b4* E UvkjSt^3.2AiN@m`a`7mqeCg%dqΪp >&%xR8UfħX_{g. Q7/pMdd#l@u=5OYe٩JN~Ɠhx-7`pb8/|Q $#z0cZqre=ٰ4sQYQզnv1E7_T.'"V$mDi 4ꍍČT̒6 l}K۽`Ϻe%\<NZ5K]pmZ"/ԃ[* [v^߻:hIRÐ_{1ɤ;Dt-<2YXa&ȹ] L5=xPOE srOMDf෯';24ɤUW4|p֛ B,, 2nw]ź寰j*_֕X^qo M,mńm2n.g2s1\]ė)"JޱP51H9iO H3U=ʼTBlx|CFXrQn7vOzD e_beq|֓?Y/@w@^ L-R;ܿ0KH18;`7mVn6TvtÚ^,E{ P[];8¨`{u@^ۍ)Zd[|o<#g,qR3ܻ7 BotЌvUŰ.gl'ա`bSBk7._y뀍{vz2~(tu7P"G:X@OPrq dPa%#gap2a.Uwy,Y{}TDLtg_ }߂,Y E"8tAʂ4P{='`FQxi4>$؞BA]b]u%7t<ت=; "4HP>^@ahnaزsM̀Ә!(,$02qZ){ 28|K wV.wڅ#l1=|0u·(`.#lZu8&SF*e/W`MP ATWC_<۳U|Z_SnZ[ӟUeVޱ1.(Q ִzHh42@M9{ٛ%Լ 27/ w(¸ϰࠕg7Hkܻ0Fѥ[gt ;<8hZyS+FwζflN"YJko.ƚdمQ᧺ge+>cgWrYA~&(Y}PmHK|>&%2ϐs~sL5F-).8)  5>`x+52̣l0*\m]cAhY"=z"|ZЏ,':: SP>k^ǕČ };#W"#YJJ(Kը(oqc"%iPet)/aX6&TC9 V* /b}=D;>ڶuACLȅ"XY"Yٯ/TV(Ee6L)6*gԮ>&5fN TGYnEi\p;nVdʋf8womQ2SrcsjG-DKu:FF!1;>|yz3 ª ௠S;6^JkCh\1֥,@h`6icww%*nS.Owl\[ h *MHJK"t~.#ib.J9h*zY i&<\ccSH@\ ux*F4G3.g@؀;4وGIҒz ܥXDE8!9/7O!B\iS1A" WH-􁒜3p2? P`x"m;=hMtHѪցe{HA 9Z9i(ǑT ż8Y!ad'{T8#,Dl!N5cH5K\g-#e8O?k`s[rrmB ~`; V՝GL)-@\BrȲgkDV!:oˁC](QCu .;EQso Ǵ}n B?פv6Yee$$8IP\JJVFEPXҩ !ȫP!Y%i&a4aVlLxH`$*MfWġ@2zx_@5݆t 5ȕU&; 7`}63zp63-Mu׍HjAunHJA-SC MZejwty"ΠNxKS;Zl|zt t׋-LR_b~Άٟ.tLmdXEz[am+uy*RkPgY6GoLj~X6x$T.s0;o;xf0<԰$PՃg/Ю.|sk2WɱWL4! Jtf^/Ofs]ko?sp1طO+=A8:wFGXṚSĬxS/,,m'`R^6r|ֱ%63 }p/Ay'e>#9qu>l'ZQtzPrO9Y1v>~q]vsڙfCϗU=ndmbS w,RXU>%Vb靏(7ʐj!;]ita>pϪgw߇{D;j$?bVTbsY;*I}\VtZp\DzcEKWHG<[<@sM{hپΓu}grFlO58x %:Զ9^|A6dqW3]4;Hc3ςv܊+F30x?Ӆo\DfVW 0 +dz*Ha)4Z%浕Yj\x?yt=S1!c }ix#u>QJf|qЃz;IÕ#N/=ܸ_Jm,Tg}>3\mQ,9+%=\*R^,+5LQf[.Ga`g>M;0/&XX$\)պ\l$'B$ǖ䂦~;F.y0;+mE\t[ٌy^ٓxE4ƪm#z9%^oS3&~nk*䓩9M7^U60Ruy!g3: 3sնLtZثzD|z="$a}7_7)Hs Lm_vE% ,]s~"kO~S3;tUk)sߔzF?n(V*DG}|3/+k^dnYa̫%$-j^@oY2輟_DĞ|}hpk vɞ).[wqPr`:ƳleS\6Ĩk i _ }vw-6.I^Z8A ihrۻ2Ҋm6E 8͑C?޼ qܨ.{;8l?e#P3GCԺ!ф"YAP֒C#Clԑl_5@b@ьkOg0mH+,͢D.VTq@Ƅ5@|w|jRsmLKZ`|[0r4/'h`OK: km0V#dtL_sZ:R<Ű,O@Xc`D G/b+2KiLǀ1 {$FG}{6E2rQUA]R$5BJJLf =qޑ)Srx4\ %EHy_Vcj`Ӛ-cƮ!{ԼvO!2ʭSh`)߽Z!D3">i-_>[?-:LHѝ$k)rOB[ l~ITFc3%HF?s $ZHz ZEN^>)Jj;Qe(=j$.9BcS8RK߾ӛ)+i[̨p,0"J/6@ݯG>vڃbpeGAw]rCz=r>0-wv%y:)1\ yz˨) [9M\<vS aW]֦grԕxsғMyVDH9Mڀ5T罂Ż|Ueq )oVj<ۑfjws8nDs)zn&2߽rf-6tNԻ(H${=Dq1sQbH i훴yN+@C*"6$2 Pn6g ,8y)buQc =,&׊ra¥"i\\E0,1A#+ҍPS_-N4Li۰M , |< w_J$'I8eħNS2K\ \0a赼ďgBXIس\*WטuX@nҔ! I?crI$)nvI^$NW16qiC@{zb%մ^j$/|.@i۫h ' X 1U" }Vj߾;SHͫv7&Rg;bxؖ6]GK8Gݗ_5[6?Th鹋ӏ.)%"fT۞` <錓,8A )jLcGmܢFĦ>L>H+Npm|1%`ђN_fLZ((2[>1ߙ^${9|kJ@u Uq/uNtf 4ĥ׵&XFpIɫC'ē\I610SÞT{wB%ih83L(bZ~g"2md{ƶvMޜz"cR]ٻ2Ĕ{[M_s:5}e+n.Q^bWHi"n%}&<้ ͭBM4D|U?;w ˚Y k8F#s @IUʼnK2 - &gHJ\Q=z,&2Qexȱ  ňU' J]M~7(}s[n%QH"wYۣ>rklScrB? tfJLI=,3| D}ymQW]-xCZތSUKo\)v(ķe}X45f޳z`Ugj`v.:tvsie@x] PP/AfH5$E: E* fS67ǯbzj-6̀~n嬋ja#~CUI[b܍ɖr _ECҊ#I <൷dsZ_vCsҐl`dAk1?|[{rB-I?!)tI%p0i[{B٧{paנ'ߤ-c*+*0FHT23@Nj>ַ֓8uBDd鼋P"PH2K}[`i[7ur =ÇpB허|/`YE%>狷sWb qYf& bL#^c E{'ML 5!ukrca&T [%e哙-`<ejR>99o9iMPi0NH`b޼p"@XUNkqM MflŤ[Buͣ>ꌶ"YRttM|_z hD}o) BNH0궾~]Ѯl : 9u) fl%26\T041qBɻiIpGV0L{pOtsK6nÀȎz-63q.;ФNsQ/^?CiJ\(N!{rMx5 yR3^)C2T2^3G P15\9(W8W%xBآ I}]_U lK<,a2d*fz`ȎY88Lak6jqF>*7*Q‡O|zXzΊ7rb^;t [@'sqsЖXEΓK =\yH6~H:i!>J|bh2E cq˴$Zf\s&Ƴ[wrvu8aٮm4wjU^[q?5pGWOp郎ִdmC)uXk/yry+VĽǛypE&HxY^1<<4g>GU@Az1IyZN L( >z igʢ#G4{O 0{f\4w[!&O䕋=xNj*QP(+[S;x\\Fvd>UR*;;P+ `Y<&ov5zɐSQ1tEc\8{E}u5&]W]sgLfvXW߰c,;t=/t€ntr%0*09ʹםvFeFܽ@X"L)8Ԗ6TxŸA]RYzoVآ^86VxQ-L7r\:zw}7/E'n>]ߐlG]&W?qwdMuJ4>v@HԞ~gBwd։OCU8(Y_0ܬ)M;ύ("xx(ua_&[I0y"&yj`Zj>X q+%P0&?B'KfjGqz^0EdHZŋ,|j#v'RQ:Q5T㫄]ݤ)`H%^ Dz7`p+XD#2VʷI`1§E%l;{Jo>"&7stD]f~g0P(vA\sO ia7rԭӏ+3`d43p.OT7) \L,\M.Ěҏ:]1̖Ot #Ǭ~uFCqWw||8>^18[(@9K0@F{W(f9:~ 7QNmE7R:?%XY9a'u!u[ QmEU;iJ0rщ#́O,Mje#mʸ ,Dxxɘ/g+ͻ-X M Z(Ōj! c'Řb1tqX,qә=6df=n~2pԽ4i=2o 3g hXHplט6$l$mP $hA0S)\G[O)G^KVe`:u ZvhN+qͳ &~%鮮ZvZZ|ͅ0P-'?Mv0%OBe8IJ_G;APcv5=zW.?"r6 N e  Ң'e|-Wēm2Zk1@tթmL[?DN#0q!귏m]px3MK j^q2yhq1}; q)Af_Lq͎ceӮRǎˬW{۸,JIIm11'xS"R꿎tx7ڕXf_gn'o;wXJn{Z5('ꖈsH+-Y0ϛ 7p3?ȴ$>Zz ^(G#`{H.sHK ࡔ8$Ow- Ehx2Hv :ngk÷![2y4\{)'CA7GYR.xs # P 1Klwt f<֍fYdŧ@[[{ 7_cD nVDe.Q) !s)$4R6!~kwk/ucp65` Qgy:VOJXґXA*ؔyg"Y`Wjt׷"'~kTƷMƈ gslf+O+s*˜Ͳ^h1='^QJx$eR,p67*%Y~ pLZjQcdX<^A?彰1blgSfXHj  sO><`"`,L砊tStOcF5?Y.޳tʊjazMspYqe+ц}d}߇~o ߊBհ]/Aد1D4*PMNX+RrƉ_ޯtqki=6_2]XquCmLg5!LG /bu8\.E@^E|l] ۻq6~Ӱa5-wׯQ.I<~^ͺb#u(=V QnLH5 6L{a!YlX0)Tu--aL~\gMt*=!N])oou"IMGꟅY&q^ka2HD+=A!p, 1rۆmͬqRn>B fL!~&I; ?1Dɦٓ#iJ0sZȲZ-wj m#ƛLΗk҅'؛~i Bhmܫ(Bx"jjF׮>~;uV6_:vknˤbʬZ^fڐ=Qt}0䑞qtEk;8YL F7 SZ/6Їuޞd~Ϥ΄\pq27ws Q&_z[PZLNޮ-u3jݏ(ַ\1x=OP(%"Yj1s=|Qi6P)elăEA) (ƿsddxA;@}F/!Z)Ȣd`T(AT?ObY<8 k/|3&սa yP:!V[nrsm\Zj_6V"Ee∴&L7V;d3VRYbhqєe6q(lTmcpI*lZnʍcY;ɓS3'P)򧚽ÕSfnݵ:sv I(Q~&}~DB'c_@tt!~~_bw]Ac@]AϿO:jykyc,b-!p$ȱ{YDw8 5M s%ΥA7iQ= RC;cbdw0e0R=*TzBl iʿw zO],z~6ZLg3gaVٔa@u[ڔ2"c`Z`gfwpzt ;hA `[CiT.VZjl;@π0N+*$H)Blab!kT73E0^~PB9 T-_ -D'klsl!YfduTJ+ 9c8ޱ,k^?T_T^$yO 10h;{E\J(v>Y@_d`!=YGF-##ȃ~oG қMCl&X52'ӓ h4o p_5ӿ˚Z>M~ɸyGQ7Nf ^U{lx8)A-p|136訵&Y"Р EɑQez(k(Im3/u!)ga` # 2A)MKiCwW Bэk {%Gy:%$u.,no7Wjs{ᒂLsij[ 5LpM4ֈ_>a;O~VaXMS_fht.`(X9TrԐJs7K bx7.ݶs0!Dc;6:0fest::eP' 1"mXD:O[R Pc|XթS22bN]s0XѪpU U3u{sbv:x|F~FMg}2e {8QtxΌW @,L,?hdS+VsN iXYEGD@} L a@p"nn#ԭr6+ڒi1b:mu^:7xC#TGPJs˂e}:" ZC1[#|1>aYALpHez, nt$h ʿ"FmO؜km۶m۶m۶ظc۶_jjz*Hby<9ŋW`MfH(ÿS!u\:;E~1~KƽѭJȌ5υN:C9'υS3G `Q0t*s׆G1T~up6=jTSȴrYWnOrb$֭S+cS^GUr<+)l#ˑ3r`MAM֕-Ws#`[nQh:kGQbgS]nz[l~PZl{o[:ζp|vXD_`lt&|eT^2W¸,{Yv>jԁ`fIpJ/>E-T2 R3OMB|pYEkt>j΋к݃hyޛㅗ>Duqzoi>l= b{,ӣ*ƀVv#M0 N+Rb"AWt~H^S."I9p``5ʭzB1!>h 1xO(y<Y=F$Yd^ƕr"&RABz? 7mpbI 6j$D5(cj% MEtٳ5ۮ|n PzP.-$f3Pݸ3FCb.D c,,JQ-GR:S0 YL!l3`rLvݕ(H*;y ! )Pb9,ZdS\iO=ރ268"3f#jΜp Q`5|uOBv>KLJyXwqY?72Cg4  A.<3GfЋspWQ v2g F(vQ[t e&?U5 fusv绣6i#[&mAwST#[!֨%*V~B]y6[ dB:i5W-!00>,^$[I.Z }ɠ&8t3Z/[/7e'#\r)Kd&& =2h1> 4tӜU9OLBE*W6+?)f`s'JhS<@mye6S97o2J:7;(-(0 Wq UpJ{6 ^T($|"9CkeVv(U^,u:mycTqqM$Z`ܒ?N"]ӧޑK2 UdER_)D偙C8c̚s?({5*| aJQɴj #eD`M1";P6* LkJ[]' x J[n%aLW^P0غvq eBd,S8R'eQW4-f8Oqgh)"[6PqSQ3= G{Ή6WFܢz:Al`1Կ7`A`ܒ#Cm+b 547.a3Y]jkuqVstqOgv|3 { fp4ՎT5[j`vZ"`soF[+o*J-iOjʣ?e;04,&y;N1g} /Gzv(M)2ü&kݣ5={REagbpHjgE*^i"@q 7 040Eȟ~+ l_W)xP>>"#FYc7xDdJy<̍O>7f/dT S)Cukv_ O.^L9g΀ѳ6 s>w W$r"V4I.I[b('ay\.9V!ErEbk[-#_V3|*[(w#oN F>>qhl +^ؿ_9ח?Om&:k,|zEP45(B!TV);nAqCkvdSyk/TJOܶwylՃJVTI6ϿR7[R+ѯr`/Z[Y'-*S-;%_Hl@ ;v>-=^YuCZ|op$stAU%PC&?wHiSGtPqj(I!3d[m(=9ĹweOA&EۍumYtھ3jLʋAqÌߪT+q*(ĈҡƦAt ԃ T7ՒKnD |0UJ~?b\F w<ˡ zck܍ϱi[q9fjC4 fˠDɭQ!3- ;fƙBdS *igL4,tq! ,J$6.`=]&tf;fѼc>;=ֳW84Y?׌7P3"H|JHȺ03/@ u4~BEPc)7k6uPbH$u/P?{`Moh =Sqa6{Ǣg3b\wd qKܡ=\Z=UAq 6'{ 91@x6<:2<eNQ6oYJv6O6oT+u "Iɞ?- *^ j;ȚǮvT-[v v@Ki&2#G%WJ<º,Mi<9*peD8k!0:8^Nx̢4lpzG "Sv]ߔ;d`iڽ\ FdaHEΈZ$ m5=qg YJ<ZVUH|0!vk(i\i4((;Z!.A\߮ P,p3 W?߂Z v4Gb b^~+6QEFǨ-fr'U469bDEَu>jY廒HTTGuPfQse31#{GD|Z al.2 U2B3K ql|a?ǃw>?τvkC.[8sx5@ t~_-a4FEwQ­͐5:ޓmcDŽcT C)XܷX]IDJgKy(b479ЩwyVBzDTvcVvy43^.Fi#+0ِ/l+i;(-L3A\2#:oi (}+|)NR%1Snz֘nk[ʬ`Oj۶JM?fH6ހ L3.1큝fgH )OOɇJyioyǿq2uiWSTl@EoMmuzyԂ ou_8zLc~&R&rXə[I}bD`?98`EE}=|ckv6V<,pEZ@'t@VLWe)`Ƌ+fшU>3T)D`?f~BI *H& |=d|VNbܟon,W֭KV LUI8ELMJч_-I=X6hHDՂ۩;_Ծp$suӕ^W|/grK̚q h"q)iza90lbUx8 l~ʞ`{:ƤXEL<6S i9#%|=lwP\@򋎣]ͬ Q Z͜7wyk``ͶC¶l-mvwg̠z/лPA^΅RK##u/ &4*/8ܬO "TXݴ*vyS#xX-*'Ś!;_[Pmߟ|Dh6cIyN}Q+[j">Tad"<4nqWшAq̌扒D =-@o@wTu,8^k;oDcn_cJfoI=ib".QōqKx xk@ϝ)Ȯ$jG"73Bݰ`J*t1?ًɞKA;B3l``8#!%x4ŏ d깱APa]fLjv $ʨw\|r8Ş)ȲG(:̲+-# P6J%?Lgdhe<29{!Ãݘj%t&  l$Do|g.8l;"VNJýl~$ߜ8PL'z ˴%FЂ>eoG9Aa"Bt%k־8bT2vT6-$S:{2f{0RR>7Ez<,_Ft6Fʼn:3]fĮїt~ufn(|~~M.p잷T `bR] !v)pr*[ ZԫY8-qE⭾N\Cx Z=t唍8ٖoJqZ$z]1 ZEGoψA5^J]j;Ȁ`>g70nx@q#ҔyqMq ^=miA)㣕0]<Ɋ<)[nsS6UCPFb3$ f{8 -::%{]qg{\Q*Zq+bky.VUI1:~8EN;#-høV_.dˍØ5nKB6KmB-'rw.k@h=w.,msjNowAΠ@^wk$YGjgOr #@CA g P{Xt5.d_Fӆ;{A-[*GJz-.sLyENCd.Y=@ tfQ]:Qu[?M^}$Bmk?4ds!3 Nݴ@_KZ1%oֈ  T].@uhZa8@ݐxtf L>N N =*AN5@"̮r7=Fq&B_rWp]mߊs!3T2[hy~ʽkDq0پ)Fi7]-E%f$Gà;3nQPlQypyY03)$_XkslB;Qr"ʍ(QLX4nrnI1 3U :v΢laUWD=>sz BBD߮HWMլS'e!K XXGjE<=2[1 E9 hFJ Cc9G@ 4Uݾ).:JK j<7:6EvzhnWCmmj,.UrQZ`ej)=aТ\Mp*-j-Y ?Mo<",J7IlNʸ"a:< RJΞAUk Q)Tv۱%- 2/" b0ʐ*9BBQͰ|!G2B~3}4˷W:Ԟc);0,m/n)?GZ3@P@8SlmJ0Kظ̿uZ(?nO%nSNVZÍz. ( 04JKpxb%.zftuZ{'I|l ׽64a۷jo8޼#R3һvJX BBIgܓ8­RV(а% w*F2Mi-oi"3u rĶU/mI`h)04g5_0B_9Ch(2 .?t[J_RCz{fG9[5UVetj$K#l 7[hi[_Ejoěa/ԞчV.rҐC..\QO՞\5?osRdW*=[В_XkzC I+k^wLbw>@+D%3CJLw B9āyf2kji`@Ie'ZB BcE;/ޝ*Ȯ)QVkgHߠ6@7s*ꁫ51q:g|Y^"{%$Yh#H{%5ӿ&_vEg M}sI\ʊw2S| {"U{fPDXS?ob/ɪnj2!ԗ/_,sܯÙ_G[.)79 $V<([cM$W@^*1ߍ'x%Re5$E7cJ&֪v($iv3okh!pM خ 'NaC)(}اTCmI)Ѳ/}SbVxaY;W2Zɏ: /[I'>'*vlȟ2i=aboP=l:y$ܿ=E_ d H)V=zJ]rx/!řEFdZ Q;>W۵ʰ+MiYKnYn(JC/U˲ʤWU|AU\׃B?D04lݹ)~ۑd葉4VgI-ZSMoM ʌ?;1*|er Ƥ,9%=,S ̋]47o|Gpns cO/άu;Ӧ3kܴh'yWI$<Hqwu2=&Am3X-!Z֊ҌG_@hj\SK,c[X[ F1X("7,ǯh/,DX-iW0e%ñ,.]]e[X//*Jy/'RƈÞ_6X%62h!fn)Tf ;.fckJz?%ឍFh9 naG ņ@y`J-t;1'Yk?#ل:`%$>ZԳv<ؾ/4w = S~=8.O:5|i͐SsZ9!|R%#;ٍUw?;$AvI c50K1St`uPsrlJ=!-z.9aV>weؘ^] H aN:[0`Dn tX!r~2B2RE(XE.lĕT״S>DPȈq;,%9wjz0 YNBfmoeA0@HʦP[UL$sh8؍pAq]F)MʻTsE(HIXj٥ ɡOޔEиnYE[iiӂW"R؞rG-yCRQT:ծ7Ox fBG!֕G=~ f!Ob~5 ёȾ惹J`!-p/nK ،_\f+@5e6qW;e<pAK` ]i%wrd=Y?rgnFp#rJˉLi-.5SqK팹9giԹ@ς"61ω5tOC- R/ FXKzvAr:Fev7 w^𣶛OFƙ^^e;iwC {C89C,d@4DS 0dLsd|7W"yS't\ݶ=;1l21%Ϫ)ayyqs Q0A27QǓ^FKNSC$o]K<- S}{"Ίofu4\E8^ lo>"tb]čا+ƤYl%'N$Ƃb4NPR$?aj 7uYDCzfDK5` ?ʥÃNg4kB2RM4GHw_(P4^ mH)AT\$8:^R,mE2y/Ft &\CɹBíQJk/v ]QT+h"^$қҎLH;W;3DrۛPFFſ:8c )]!E)l>zA!tvDˋ`~jbj9FrcMG^kx3ONLp4{p%)&+ߤEt tSm~(N~Ѹ8mn-ҿ%B{y?8Z[$J8]9ה"7LH M*/j̳l|/UY\ESY%F"4%ESb z6R{-F^Lw[x.)kj"V:3Y E~%;kxL*6 \"Bz<3לq*ՋO' sAԢwq y\QZfdhvoYCZt 1YE np*$T5u#yeQ᭵ yCMn?7x0E):LVO1.ZdOx݇Owr᷊hB$Mm~S#Y%\=+'|s/xtYd0WZ:db]\3w idѴBXtxS5a1򲥌GJ4MqAbK.G|ʰ4B@aBT}"hGX\v}.xdh߽wp8K@0X bE2BxI!LG,Ut8̍Ed*} wTkYk.ORq]zyY$Z]D'q|v:dd Pxon OGVi_`p5 Y6Æ$ӝ%$n 6^A|m=sݦ؝RehRbQ\]$q^m7Σgz2/(tX+"45iMU𵱵<zeO#q[DY$†0IcVL̈y@Z9Eh'U&oK֜ݸ8yn_$ ?6R@s"̃t\Q TPz'IߛLjZ5rޡo() 31JM~őlLzRO"$Fd"L\Uo2B; 7,4<>I\R'&܂rdIKU?5ZιƼB+A:IaqЯ/ɤQ$Ҝ ׋^T ʕ]57I*rExsx[r0~Kg ;Ŕ& dXiMKIO}( GƗ>7kIҒ|n]޴[}^Ӻ̽ "}7۹?Ʀ؛BYhQu> stream xڔc.ݲ5ڶ~ڶm۶m۶mm6Ws{FEcdefQdD*tBftLY+{Y+c3gW+{39U== `lfae`y#;3<pL+HrMnb`8뿈V&fD< 0(ZZZ9:$0 feٛ9T͜\Vqg33?r&f.f.0]J 3{3g#[uV3O3G=)@A_0"jf_9-tuuf`L.fT0*(YhF#o21h윸NYzahYYX(lg"nifhjOl].jOk-leRװlIbqqK_,3ٛ8k* v+Yٻz9Ok3ru0322wzNL<>t,:fNN +'Mܜ])Vf}':3'˵Ȕ"p11Hs+jc biGKDX'rww߭,Cc0" /6@5rb̛qya:!]cH#-R,D8L}n [@01C&E zh流Q3m(0S $wл(ض( %hيF&7"(kE>lWY lyA ߣU^d\BX0؞g4v6Lnl-#?#se7Gd3]H?𪃵Wd8UQ]kJ5Υ _~ BFUj: HFu&,cc&LG,tfMrl7@ƋmJrV!f>iRQE%X tATgqJ+1GEdZKa3r)V75ɕđM#KR?,%hmhScLА; ?Voj}h_Df{RiB+d)&Fژz!Vp/lVId&͂BlB›"up 2 X댮e4€jWa&-Pi&%q|121x9#!`vm* Hw8"qDUE68ICX?_1I=_tz5/Y_N-KF^>hZ4k0LѵAʭR _6Z=6|1j0ӸYAxO.W=Bуl "TV3K氝|r*L tQ3ħ`r(qg1!>ps.iHhxZ1<B XLmR qSs'`%"zv _heȶy/-)$wK\X1JG2y,}⠾En,w2;jSw-^_vM(9DY8J\FKhi*oeꨉT 0`ͽIĀHI1CW[qY2448x~!E39 5~&=Dh9K -aSR¶5l 8̸G޽Bڜg~ eNd؁V~'_0ٚ0n?K]֊LS>+IV|}{j($uO~uRW}?۔Zw,şql)~Ypž WyewnemA[qtuDF.cC4"͠#c6'dSС\J=yChg#UZ;=?`Woe_{J]xF1a;n G '珧ゟoۙ6h*lؕkUTqyzx7f+zuLj($#9]CӿQIwdF"VL]lVnkKR3g q Z}U p=xt̹h !pѮFh[ƻ@~lVZ1`moQT pm܎-fxmivE[@q0<Ɋ67(sd{iGM,2﵎ڵÝ.Ls{+1 S-ŵwdC; ~bbc);3J吩Fu>nb瀰n;;`j֎aI[4ƵdSթPE{wL 7+R,Y)1q\ /͟jAy6jd+f(0K {B"3tJ.)f)R Yl$OaΉ !\ԕ.q:Xa_ǑL ˧N3`Zgr W49;w>]}ٱ1e9$}`7(5sjISwlϝ퐒KlN:0ĝ ,*msET#>ԍ K*x:_ ?^ #o?/ :R&va`}d.|J+0C*}#:p"|T"P;]uo -o {FqkP2N'˟ CzDf%bSO$9K*Γb `r]h@nbͦVbi &gךFvq"KOʬlH !?s5dt_Pj2/6^^hK# 6֓o ~$|D(;Pk1Zk2NhU%HCvnJt`Ҵz.oC(M͒A57)?C->^3t7ӕ4msJ Ou3ۡ= @|7N9W'S4\""},_wS1M*o1?0DrIB:7n0yN?* VA">'j)vI+s*JE;L ;vMټF%zIΣNw0,oFu4_b(Ƒ7젋#ERM₋2WT v@U2C@O]z7pjk "zdD#i[iQkP|bGٵA/v#Tb~]T[[/syLfbu)M>Tm@OE ?[#ߢmh:ot)I`Eh.9ow=rk>xQZi]DwPMgFǰB3">V~\TxtZ'FƸ"Ӳ dw'LLyvߣh(=AiupE3]і->DT2=i;_D[oHEuz#4rOh?Nը?* 8 mƃiw.P8H=5쌤<Dh ;o`UX(/CiA}U[H"biZ f"zbܚgbmo_a6t۹wLu-ylHXXUJ2.ЁO:x OB>l^TdG-Bٿ`?C0}I~QcuwVtJPT3g) #M^͖8Gb* ՛Cg*?[ ]:ö v' ҭ!V}9Zrs;S{+6<3K䚟UWKS.NCDRێIkNOT{ff$zfSڲr^•O@g' D(To˼ub:Lx? Q|b1aHVE( ݆ 2}sjmSkPkroB`-/ ֺV ZDse\0k <{%O&Kx%chXfG"NO#Pi2YM)^#Ƽ?f|ŝ{n,B Ͽu=Z僙o,9CسBfXtoc&FbnIG9(ð8}qZFӟS]8z.ϋ([%@i{얻҅24h"Te1'_1\P"ʻe¼*ߣ,Fki6p݉ʵ~Oo߻0xI:?!QoG!-&lC+y0@^]-E rݿva8H`@V,]cDHo*7W:Gg?5Xk4ˏ1b Lc~Bst' m1/0 F1ylVkG݋'?`Ji.84LYbsĆ~߯)9qE5>6M)x XpM27QaA%vYjvX+ֱu5xH;rg=M\IMLxmR֞gUߛXHi@̾}%rUx%U ScOI-w Aﯿys59Rk9y'ˇ'%!{1jV.d%b -{G^ʺ5O9%?"Փ` SLr$̟ dﳵ'q=B̾@z^A( $C4 agYͻ;Q6,"Ue.)8d$wr D]9GsyW\*2??|"$C7`4k;3ɠsJ"Λ'ީ;`_{ց n/y:q #I_sUG35~A_M"Sn"3~ޔlL\\Ȱ8 ϰb4@2A!GpR$( NjaVIK3qW2Q~s?8S*/JvVZW;hާwε>(L h0*g91D;kbpOϔU2cwOb'[ qteƉ Ƭ1BJ2/5a(xWa]zSK 5uG#Az6#S)ۼuv>% agSx󔅚4ggT(QW}u#6Ho*Ž!V]噰^,N#4qqAs bc25sGF'ץ#l#"Jyh0fZb9pOoVASOOUvV8AZgN+?lsҾ: OmbܻWb_kX2qdf_1aI;iX̣l(;Qu3>-FE`)KàїYOz;ZrzQDbOL~|:  x#ԭx5#t NX=.%}Hl(Opa:.vDj+T |8k!$d@ߪuv*2$+` @R63~b ,[I^tڻ~$g/T;]LBa?Z ^qy5SD3mAQ3iUQ> *K㋲Wҳ!희vs˲ VoY@AcZy]葜Ȧw-9:xz$K  \vXCHP vo7Yz,#%M@kF^Ѕѐ~` †`ggFNic8 \gHҝCO#UITc~)8nl<֋Uv.``F ]c2 ֎0djl^%~DtHk@%|{]y~Vz4n|Cx<'NͤN  z+SMJ,S QW vƆ%:hi/i&`l<IC*ׄX{L2p A/rLQC6v  sڋo)*5N$׍Œ0o *?꾙S=]l+I⣓ 7P)Dm&?+%R|b#7Bl՜<2>g?d5I0[֭Tm;*Ą 8= ̿D>V|>+ޘK9r^̍a_}##72BܫvkC+3Nj]SF$b/v .{q1M#dR r-D8%39Mxꂏmz7a6!˚=kIǾK_琛qܳ=E6umkQh4U\"< 0%j}PzVnsysf)Nqk?\8@ouvkTEjj534ּ3+-B v S`]xaM~}@8n-~ڶ? V8G7L<}~ih/`>{}m3%dTY GPD/LU]}mڭv)aSQq~Q2doIORt>Sxx$sQ-4뉻Oɩx-\uxʷrm)Go O">? (9/C} :1LtݣL."њAN|hszY` hq Dɛh`&|fb-%^Rj5Y\ ^-e#_%ecF]h8Sp"H)@?Dfg -ÉK C:bn6CG۳"w![v(GFAnaLyz5';ѫjwLEa _HS{,W25Z"eLo<8lJ;v<7 &\l:V%q~ګhϫ5nVFdB7Ỉ܃q'-&'5%SgQV3s_LiNP_3GG\mclȚ/X"0Wo7g^4 'C&sג *g]/?X^ $ "'Y c ¼ٍݯ.$0Bz֋+ŏR,F,ܭ*:g8*u(k-o+b~ݑ[MLgmRz1ȇDa[s6NBtV )K>ץ$(RD74 o`9.Sa *Ax*t NGr൞.,7~t:'SC^6UZpk:r0sG}U0 ("6lK9o7P? N:P#ķ! pAi;ȺKBrl}Ūȇ3 VK4Ȏ1CzOG @jإ?F\`, կZNWi̦Ukdߦc^٦4ܘǦ㶨tAWTṰ(a_eIZVk~QiZIkΫjX+BoiGGK/CR K **#uL&!늌|'+$҃yVnjrXgGZDQǼBvSst<_4W{30YwB8$o2>ݖ'lOnFoQj?6's0.VD|m0RlCݻYAyxXOXbP= BN,i_ Ի?4Y!,Ǿmw)>*_`y3.MzI([1 GO@)~@.4S.L8ىFq-͜R~n+e; W$6]>hh=q&i记E ^N }+O2evΩa]fqYk6c0m4Y]Ba2٢(F0?S9"1Z/iH8ژ{ȮPy~P{+%ۋ ^t Cͺ[jWZ%!}"ǭqNZ1w$QЧ]Tp̤W-ڱ:]``jBiƹ<* F ?JR͔ڙ$#.ԽAp*M" fkU6aCޙthX/#XO9_ÝĮ # Sy 㦨2%Wu>ālȊ-xjnB7*(ߞ&D2CșoޝN(nYpPm9hZE6d܋׸eIqa_aG-e ]l罞 a7[+3$ ܄Q L%f1xP=hok^I>_'x_:rtF_/c܈ ruyr?i_SZ&ݮˇNuVI09.0` ] JSra3bH`PoN ZљgFC|?u?"mO9QiJHWhۂVζZkiꍱl6x289RقϨS25 f%lޔމ ޏGG- zn m*}r ٥s:i]ƀ\Xb4}6{\DK]p/$X'Hc4͗cy|ryv,55%DӏҞP|Y"?/.ғ\s$h'`Mh%1ůQE]<2xJB1!Y1|FgD/F8%g[7hكf&D)lyיym`($Ql3#E.qp4 6k2Q.`߽ÃtZɞ) W&{8?K`>hFzgik;]e0<65$Q0tG?@ew.<_MNi_E\$X9Ͼꚻavt2%&l!%lۉUGQ36A4'dˍ(!5ZX pEW8d/Ӊ_8+* F2ז AU'>Vyײַ&Esby͵ѭJ aJ6iκ4aERԟY.ܧ A^[N$5 Z1N`-=t[;"pҁ GeMR.,>9"[~Hi!X^t$Pi?n&oOQȽ6 Y׌Fq\Sp~4=~K)jn_-}a%nR_Ly;AzeY0 bAwJVә783*XĞSFAwD0`3 -){Թ.XЗUs"?]( !ĀҍO4a%p>H< HarʮYpL_êaC̔72wf|3F+ _l?Gr 8$njH& \"¦B v.ĜE1ie MN6v{Z0FhMl=dbޮzHFqijq BE+0ptQ&FYY@0`pv, i!]2ljgWL30YGIRF n$=$R<p9"~xb/'*;spF4kAeJ U8+jFK='F&0E߁/c,ġ6(;:zp"RB:FŻ)kם"j݌> dlYsWek)T߾4nc~CM/j ?P1%ZǍdv?m#:|FpN\F]VB 4T6 k{_Ko3e^f0l7G_.KhH^}$a?cSN,QAHpJ@"B 4ɁtH#GUڭm]cduJ4_mKyG%ǂD&&r bxc ً[8g.`RTvt 513=MOT4_6DTDž~!gOnmz۰|4e3V #etk:V *߱=O&'!Ч 36o LэuPQ, Ǚedf%2@e/;'8B_KcO!ࢹ@+8>:x YgVzĻ&/-~ݎ寬oKD3tbIMXxURj=qmO 05ĊWr/Xј'#8:ݨh)] ['8b̊=+}F4r)FbeWAx@k! C{*<7.$=ǩ Ne-ԋbê?b֨o=˚0,m/;Y9Pzt-!p9t>Y"iKBdꂌqBbJM6P,=ij]t>#pO4eJbƻ[s>I1)\eQeց˻P{qbWv`oW:)JMԡ'ԟ܃%wR)ә=R"SF&l,;Q!E~π0!(pbPj6ڪ{^So#Bu*ĿF :X mtO&bcš5iA*.ۨpFa –0O]f6TCNig śZr b﷫N#! >F91ɽt$+mCw`6!렰rO 3^ZkKF(eO=[XhpX!6P1Q#^ mdҁ Mn#ۜe%b QN_O2X{Ny`M{FˑC|JztW:^$"mm:Dxx5r1:UA3j!Zf:ih\><Ma9&TZdD&{)?$5nTRq'-MT/c"JVE-smeXMVӏLuW^$͹fi!K5@Z3uP@7\Y,!/,PY%o7;#r\U5\.^dzV+O$2*Gj$h 9HWpO=dmk֨vgl6%ʥ}{ dʪ#CJpz$΍ݦ%.צ+:)= ¯ > K踖ۏqr˫n䌧{[Sm[  U7b^/$zA29_,w}Jf^̪طP7WtVul"bW$HnskVO̥"4i,RA~hro80#c?jw#j,3|Ƴ.3TH>˝_ UDP%*mЧ|*q\DKNlrLD]*7iR-H*yʠ漁6*֝O<0 b]#a\QL.V\ &#imxal4Zp)5;aV='At!s{6? ^MtoS,t\,0w;}qðuw;CxQ>(e;M~ğCTw9n& ;ڪg>Aόw#_K_V6,3= [d0Eo$ H+ʸ 7lk5Zj(ٱg ګAN']()(BÏh<%E9kH S6$:>O  X9_0XnQo1Vye, m-6Uw\aKp9=Oաv7Vh0_,F=䀄:^o u_1= T ..2İ]{%JL܃Y_ Q&3=ez}920q2 [^FK.m'fϐUH)KyBK@U.tcn3[+*JD5>=G)AxYF k k/җA^N&ퟯ݉ U:y˷⒇ǦSf/LvG F 1BT?Ix:0: sL()ж1 MÔQ$%..kmA{n5)#t䦓-8xy' C+h*ܨ(i4kį (5]U)*HTqMi/1WYGO^n%dzE4 6OǸ&Ð-Q0G?v54:A`#!{Xn9]L-vw-vC(1:mʛpWyav=A+y$#^:'SYմc>kt#k HK8hܷ26ta5W2Qf5,)wsXk,>'U?A슞6zp!j&\&:&uӾla#@0V3<4x3Wm0x2W}?s6ҷ{iu6 *\$$IFӓUÇR -0lׁTO {V6:fΎZ`>KڔO8%9Ʒ T )8D"$#`7:qWvC٪B{m0_r!ZyLCnIIoa'd{f8dNj2zN\)P.æW'@F#9|X0fEoc 4EnvwBO;i!y&E&ǧ`\> ,XdQ|i~cԻ.*z953շ$/ʖ׸q.Q)>2O1A>xTg95Zo%SBUGObJ&nnڎǓYz %p!6ޛ(wA/ d>3S$8G6ZZX}J+5UT[qm:f̊IIgJDH$ @xg¡,PQW夻[%)]mV!ڄxxeŤ sN8Xjߔ,5; W[LkFoU7@:9OKߡv5e Ep0 @1_$L=[߫f';YT=qA=2Ji$V91F^Ptsdu"l6ԛf:B4z_:1F5Ur;ʋ}PAB@h^QO%ש钕[6IؑA2^ُG 3 B@a!yjfoTwNEOc;oّU)eZy%ٔ~.&I`v褉\Q{) ZJH?c61Xt1OalZVwj˰W- eI軘*ҦcyiKFbS(I xm7ݻb2!(b:vb-Bc8Am I Ny̑V[X/7ۋËb uqݗvZ?1QgFr]$9l8yOsG>pB V֝}AbסXUךPjxX2&jĒvkMa@ڳ /"݋ O3ED.F@bPz\/)B]Tpٲƶ9)'j4xhx$25 =iܹy8ߴFJ$rhucPbM2Sj5&~,Z<8r}Ny+q<e!_wCOЗʊw= 6]-`䥡18/0-ݥ64"sIpsp+}ef6SHg:WEK%1mC2\v#{\ AFq'Tk`mM$| Ħ_fH*^<3{H[I7x7.>|: 2j؝u5w ^_];w{Ĥ?iyRn&gu.p0G;(cGIn5ԸaH7UΏ+Ь/D57GfR|/g|Dbn#lrX>sLRt3iNhZOr-wmRKQ`gvenrdQPqpyISu]e8$'Ï+nHU^l7:ls'D?Z_uI+_&+~*T./#gGOv쥢WoPRqZb1eN j3] a+Z]QC`Όm7lP:3a2,qK|I|TB&*Ae#ÛMCWXTnxo K>݂J2H .K̨uQ$AL"p` TQ89Z?`PR8g`$71ar9gOt0gYUv\'Ao[Z^!d.5hFi !@ L] ~%hl#,mF d!X?j plj4 b\ƌ3QC '~Fn=]4ɿSnĔgxgoJY%+h|wPpx7װ>E)IKY 3px߱*YokvW茲x2+, 5&Xz.wyO֩>F6nQ9_7LLʡf#SuʙD*AX p%ƋűFܮ)&l{H@#?L4>r}TVhU rar[xxx .Ɠ1̽AH)E2' NLӝOCOw5h\Q"0gi`Q賡[J{a%T/h{*sSkI131HD\ B_!X򔱕t*6|A,5Vq%QeO)8q=ӬdEd~8tgv%Ou%[SCKaKbE u .U!Yx#0CYjD4:w_;Y<rL|΄:Z[z1$U~[VݝJ5t%+pǟ Lj0sdBj:(eJjgǏ&uh9>loda1cTS3OɎUuIL;P߱^\s\#pYʨ%h%yGBg]aվvF栓H9otB\4Mq1u0 1Cѧzz3_:gw䈢3H15NZ(|`} ^O3Fr N+l`;Cm);H7LO];ѱryA3x`LI8>o1F2Ol2{ԡjHgk;i Jqyw3۶BOy벖: _b7#֙"#;vwOJfƚy5 C. YqYߖ8(yiF+qthN_kQy^C*Դ$x#^e܏"ǖƦ`Da~U;5&^J#0tW8KBF3m7#`e}ɾ7^ c `>܆!Q8|=0v֔@&E<'7/6[`/}Wxg:,dPTeRe7 `| Q|k5뺕jfr*#ZO-g4276t(ϒX泆3خؐrYSL ;#o.7H!y˚t!+1dPZK,ְmwT%"+d@TՄQsswv!ƟΡ!,% 2E~z՞ut.ئ rihyo$ EU]s5̚m⶟xcYlZ DZ1OMchBS~[E G !ƯþO< EqlG掃ЮzyjvrؠT2tn'e+E)V zK.cfi 2 愅cn f F92)p#Nl)8n:OyO.=O-7NPXAe .6K<-tӀ}r'di4`qQo*r2ub%ʒB,I kq<h_GoROx$ &'i SÎfd&;XTjv[dt!>RB1zUa WDa؄4\1"ǁ-.2ʻSMq5T宛)-JI/L=_D(|{Ybvlݘ:9L @JJE^%d}pEϰ]@s"mԬa(,>q=TLbAG=3 {%[^ @sv [#_~ϳZyJ^OC[$39JHN4trWkq҂5^tM_vɕ AUBlWUA{HapI/Kkq45J"3Gd.yWw%pJ1-[^-MdkYs"ֈ:۵%%ޫL ִTu1E y|>O8ONHןJhaoa*C_KFΫRbZgw+R ri9/\8 Qzx1a3v?.ClkiݽĘmhN+|~ͳ""p`CFx_vCAGBK=BFbC``z[f~!r)nfSOq{ˏ`_U$\F1 )66_Wn8&DFg@U %8^(}A\!䗞B4B]^>!Z`I߷N>,ƔEAv рQ7!ۚ־faЉ8]xd+.: P]Ŕ :F\u('aÇc ͚6񫥥y-Z;3'T@@<, CNne}1uĕ{2e8q̳)|za~\+A2UPC‚=1FbHQ}y0rG{ЗxZ /,g 3 4L^ : Luw\c]bN}~qmfKGjaAgroh|ۑjvk?=[iD\拒M9KaG0dDv7DPsow-aslаl S~>gؘ&K'`a7 7Щ`-BB5uLVy/'edܗ"$~Imw8wJ)nup1Qq1eDKw]<×&z=2F4̨v9.ZX'[}aUrM{7F'AfR,.'йrT6yMŀ8(na7&}cE, 14 z،@飬U߯32p zŋch𯮶=+o괨6$'̴onY+U:\,ߞJ?#dMț8> a%IF%roJ0/Rwq:1)_^yBo*m+mC@FOlǰ"iT`(gZ Τ-CgUNbl{Bܢ*]ʔ@K\A~?WBAejy9rUNh-e:LmU%jk52V_.2 D#@^b ƦV&eWϓY ӽ }˾Kµr %DpюuF)V~F{LK*`%BeĦk\fP ﳰpS~,\ݦ?@p >NDTǂҨ6؛\D%ܤ5.7t‡=$!=Ai|3@l Շ]Q YxR/ Xnpf<#&4}졮Pt2 2=}%ʜT^\[tQ?h ;^&ƽ EO襫1?'Is"5N#'溜k\Ku"2(K5KN9-m u E *$6~WTSqz9N33b>_607i(BJoy0^ROE -HÿHe^L|?6[J &V7:pO/VK g$yyҥ\A,*ek&$ه棟4. Q߻y:XƒWlnJq EUWMLh9i"%݈=9mk |^~Hy>Q6>ZjC@8SW"X'[JG&qAӲͳ kٵ^[a V&AvUתǸxqz)darցp'EfDێk( ? 8/=zPٙe-.UcفE`y4,*Oi9}->>X>haF</IQ4IΨ#vڨ)JguӪa&(_CߴRP7]eẤaA &C\[F9.lB.*<^?IKʠļ8)y5U]aڣ:1ehf>7U$ '{|flLf h`}X3%'ϼ,%Ki"}2 AK Xxa#>;6mj 0ȇ'Ns?* 뾁caEe]x&g_Q5T)'[dCPV:Rig.RFj߬i nH  Ruu_"&0j0@1SU>LB`xP4t؇4ԗT.-D̊8Oa,YNb_o]Ta۱v cvhۋ7]tlm6+GX8&+*Te$"N6 eDfQ  F?z-~&|iy0}e]0x]}]`1ÎqS tI:޼Y4LimѺ#^[-Ӣ0VJ ]"٣eۘLJSՎhИ. \Y}چ(U̓Ic"?6{:?7 M*A#W̝"OE ;t"$` rѐ :X,ڔ؊Sxwo-7d'ҿA<(2tB֝h_ٷR,f,bŽd@zVBڷ^kuRÊ*~wiY6l<\k3 `:&Ø] _ƀZS 5Z=LNω[h숖e ] e.4.vkŨ >.;:'N{. tcm\+eǼ'heu C7)R$[fȳ+5pf_lΘ0zfV(#45g! BV4V#QS7XPߪLۂќ.10ɸ=1 Marg4>8xû)?PVx ^7 x^2w7zxݝ^JKP#7x _A[ow.b#YInClW5m;LAuߓ•lBPg|SpwVO@Ӯh=VYj &H)˹?AI\L\^O]Y~K[[r[]!^c+ћl>ᏘPff˳%K@Jw>)06dnW'dWSL:c$kVq/0/OkygkJv #0Ή{`TՐwT1 ʦQm:F$ȥ7GE,:ov,J05~5?@$$k5]g _7]QJ[pm%Yr Q,pJ$KUn|5KKcC׿ XVL!zZpQ/餐Z4k:`/{ w:M9CGlBE>< f鷦K?W^T&z={cA4k "ѿK1W. 5LrS'ܩV&,n1xf$y&)*cKn2j?Fku~T1 8қ.= 9}fA ^->)Y"a|B-O,Qpsc0?`]Q@Iq>ՇYm׾u,:猀\X?֩Z!bf xJRj|!֤wA\4oN%!!\wu΢˒].'^ jK1% ҈]NCfdz#x\ ((?@t,<8XzI N@ѵgC\5"TUiAρ1 ,X!9n&L"5d@ :TT?Ge#SXabw A DžiVN 邋ECв5_ Mqn CZwA p4 &uƣw GXG< e$+;{KG!-ˋc*$sШ1N42#&:yqm.IwLvCV* p҅߰l3 J0j%\T}ypґouT^}86i/=^'} 5D0UuהdXrϦj"XUl> IB! z8G5b2؇ޯUdxB-o CPq6;,i*!X#s+Cg\xxHdXnߝ  A!CJw| xD|CN1z: 6xDULF@$)/Th8_k?Ou-vdqdΎόnuxM'x@[؝Mi3Lz'QұY?d` O詸J-̙Qsd5U)_2md]o߅eѸӅ>54p͹^:|Х89G=_FѽXx;#4{5k,q\tە ;Uo}̤.:s0Q ,ńxЂ6&nNHߡFGBUP5%J*yplja ,>L`!;CZw6}%@sJ⡼iIx2KE/F:yp/ON.:g@9dWP.@e]mƄZC4 3@iau2U0ۭ2kfqՠe6~\L 3w-\ڥ["Fڇ)C|k,WJӖKwyp.Z)n>BJStWZ=UG[v3u?&`먤Vhš+]/ g+4P:hr\5*{l nlkII/2IB?ß,+kL".v5S0s|Ģ&}@T&V>}Fʪ՗N+HhdTrjΎd]-kTN݃*N)xo}PPmT*i2؞:VY_/ 3[@jfb%qsg#]taÿfҬQ԰r˙QU~\?ox2*j!cߠb]Wv4{:RZ>}o#e%VԜ+r')7vopD\7Ƥf^`D_R?z>Fz]ݭ]ò?#L)m ] +&A!oG +t0fj$Nи>w73 ];kZf Pr Lso=Ǒ0q:6;A1D@ O#'s߷Z3q@DT{2}:;qUqP[T,Ao2hC(|{rxXBvV:[Ô:*5:77lTY(qbqWj];v}0~PI~\ϛ5^kʼGXrHCpo`nJ<@{l/ H(`!"Ya̳?*A"9&,ɟe} rqN2] /͐ӷU)|8 _ eOaH0ŭQnVL>pxEYz$b"]K 4bO¹cՆlɤç1`d ,">U F}{c%;k[5'//S5+<??i>,0_8 PHE{hXA"iέ.+fDe:IfΗMن".a;.ucJZϩ:9sXP"^h .,`gCO\QЦ~O>bnDiJCP\=}Gh%~*#xוl-d+Hܪځe |^vS)h.0ۖ]S:qF3$.m[ana> N/fXm*-]W>4MqhrRrq2qY<_, nvzkVazG]\!'B,g:#HaE0Gv^&VYP~FptK Hx艙7 7g|D{/oPa-[ MKb}Iޏ $qf>BوYߠʈ;pcw2_'g'tǜ>4a┇h"D^W}($_V j$=厀^j{h]iw l!jkT.?_kݥ89i/O ;a1->IACdl@~Xc5bNzة{zu}e>,&aƢ e LX/ ܸB3KFܮ,:a[RLr%|gE2YAfzR2k5b:u9+llDvM\䭠$8 .v%VPV#D?[s|EMt0'Y}D/r|=1m` ߰gb漋efy%kRQ"£::M7LmQ_M+φ ،a2G?oIy,@lRkbye=G=9S|hjN")f^u`˲!$Okn- 6)G2OmKԄQS{WQe$phO;,.svX =|~8N:% }b)C$-yS]f2/gxaj!e(0_U;rAaGH?Yi#'LÙIslP <1V ec?@OIߩ1$,͆TGHI nQ{-,q Gi?猝A􅛨ns8g6&j) n&γ9N-LtMvbKinKUM{ٽ'"yEL{LAUn@K[j\|B]?/iNVp-!;׸ k ҄H>~_dd|l:i CԀ~e: [\S[|P-o#U1ƫl*x$PR]gw>+*\buS8Њpo bvv Y\Ee=:'Y)n$HQ't@^RsŽGRH+vCIn§6/eh q'.5j?%NSƈu%2H<0е8tAgXLOrV _}^bۂǴBԛ"$}$"\ˢP#X/5Y5 'CGKJ`Y>6! YFxT?j~s|_/ԣnP~ sIob( 0jiO4$?L/eOHВro!SPYr,)G'6W ?47 X_v- 9 CD-|7#@o0,EN2@Re r)wV1<bДFX Tx nbOIoh\%邫6Q?0OuǙ~O5cIBeݦp㧈ffp@Fe_[Ѳi։ 1T`D5q@jE#Dɰ}|HLg!l~ ]fx+hDQ9߸# vzzXw+CԈwc]S >\*wѲQi ,fR l%K|*v:&*?Kʤ <.>SJ ;ǖnRg8f4it&ܓwyl V&F@)qN!A,zhZQ+ڲ#P.LT5I1|5"}XvΈ >~-WX'Z聥_7ga='X,nZ HS$`t.TG̦:ʐJ8ușͬqL΁k";T(-B[pov⽸ڰwl$.8V@fgzsVAo>C)5dIT&&Udo?,cMulX0? cZBr 'cYRE-;tbSfx٨ z͑ܪ4φh &RWRNk-BE˿ Z@ak/:9a5,W2Z kmX ~|\ᷓ]KX;p9ੑ9t;'a_m8`i.gHԮd/ey# -̝OGIyT R>r ?sFg P'{OQzF{.LF ?v|m@8߹EQa01z_dhCJՖCI(z}E- ooX݁kqS Ze:i?¥shU+=Pf(,t7Ex\>R@nRBMǰ2"{(T/ h糬-^?t6m4ᴧ48U}CM& -ᔞ^e )iTmCqZ-c͗\8°6gqKvʢɣ؊N;K, JYd'0D ܸf0@y?Q;FpX"8:cCr$G8vp:FUGE9M˦1z+pvnd;!(G!,ca!C* Dž*uM?ȥo"cJȍ<ˑP |_ļs :GOjDƦ3Pџdl4hrjs;XIu,a*y㭟2-~IdEU7*M8xITR$^Ew~70 |d;nKYG]8x~07VRÞ;:AIHZibެƒ,i kʯ\/~OT!^[7L??T9 N/`7譪:i3m!>Nj@u&aދ +l؉#=.H%uDOo3n}N%.\fA2|(W·] 6\ZGkqo|Y={Z;&fBn<>gFAmwHK.6vf $y@9YңWa_9AxhGM2 0(>1󛼾>.bφa~7 endstream endobj 355 0 obj << /Length1 917 /Length2 29983 /Length3 0 /Length 30657 /Filter /FlateDecode >> stream x|pf-NG_l۶mK۶ձm'N:u>s֬5w怦;s䪋%QIYQIcY=0hfˬA+K>7 VuxI,gcZWlegHkK2QTK&.E`E)/IX;u/̿W@x"ٺ̓a͚HhQw-([6ybzHrvCTb*PK6n}j]DHaQm7hG-vB)+~-w&C:-;- {O}cLR6<<=,05yt8 ^1-Vdyt8!;m4r׭ٛ\/_0+y7-YjI J99NX µ)[`Yu~q-v;؞'"'Ûc&RrjvjkD3'/&L/ܶ"IV3ѧ >)c{p/*LFeL3X]v@"pGh]'?Xs<[UfH#kOD c׽fy~'4"=iwK&VSS ҁRE1}nkӠORҤO* +p-j86 t/nxŜZd7 u'…Y1&pB ٵ&"uk EAey~i0Fq4@cBD~#>6W\VQtR\ Kjrε*onD rwFc@?122[hO~1_T bLJELܕ^, }jN<@\  }gKg7/^n|(~HarQɧ\ eYG*Kzb!5[-eq;!rlPN7ȶX $ (Q[ 7F;b@uUN]?5GY&򎉚r¿e}{X ܱ#;ˈ'˱\T IVns偋R(K+LEWvCM!Znӛ0.7/H >eWI;eHAɥ//,߮#9Hbjbb=:UMg#tݚL6drE&N/AB$j+#\zM?Ou@q`z?%2d 45/%X"]+z.>P_ 2V%+i;|b^j#s$;t'r / 0aol~<.[{"p 5\edd'0:Ww VKDUw۠fKe>A}51z\"|G^%Zg&Q;B[ijkBߧꞕOB~ф'^%@oeYW%l!SprR`s8_VV@2P÷ȡ+5! ߞdѾ/563zն(i$4K=e?.^*,m #>h2i `;Ab&f F\9cY35X;ԝAxMEGK5{o5;k~(t9ԔH.(>s/c4=?ekrke̳%),˅m2҇75S9`A7?" X>v]<;6"X U)a(q%ą_ 5#,#\sOw^iD-hABW8&c -Z\`񺜗BCLң}?>ҋ 5F9 ]RlJ0-}_]oN(uVN:o,j"? *(5Nch":sn ;hI/Ѣ {?,R*3:m"˵g7Wy)&CQU2mԥsc=n'oe=j, ܌$4j$!sJ yg;y@U1Ԫ!,1c֯#fMY݅D#9lwY* $Θ*F(vZ]Uofh[U7*x> "Q㿳r  &gɱ+m}gHy%S x_TV ,n%.;\4 gx5(tKd6`kG:H*^єBi2"WA Y^՘]qK=<~w}/14^|A{"Ԛcuĺ Sa%I]ᏸ(i A5;hc ;, rΙ~+@EKstz"wu}1HwЇ.&+M&bнpTNEgW}ꥲ ZCuÃT}Fz^~u̝S+i_Kq?$wK*/PpAT^PA;T8UʍK#ǎ{c5DT7>v2ꅃT؁F% Z<.3Y^5>mV ig zja{ +wQi%[ tϨs! =@"9RphW١^iɺ帲IiI$n3-@<6j*{s)rcζKx$WwAjDbdglx2t0j>&Ś:Z0G6e ) I94l/{P\T ϡ|֝48qElw݆uQ\5d e&R$zL#dG|3pVOMRyUI[ ~t$-wpR RӔ|byuݧR|IEi*~y_ A/PEv3ej;-kG[f'1z!2Fu*\F$}L"#d ZZOI"Gl;Q ϶[Iv+R҃^Yj3B# ] NJTI~<=TlF%Muxp91 :3#m~? >{]Չy70ʻ3OudP;"OSiƖcUge`rMqmvlXT-7{3q/tno0F'hf%P3%Xn쌸KIifJax}R|};?&:[K] .rIoWrUs#1 z$w3,_rL>jw(izKW՛,6]SNj>Fr9c; L΁"z&\gׯv?g>æd wȔ>Mphz4B4X${󡐦_w易ԟ&[ g͵Wr1gV#Qt}P;xQOxJL:6&w%[,VG7j2#5vwPTm 8(_K.Ȫ{#.R ,*,Me)Ӣ/4 [网 -ɤML[)x:x0~R3]2 Ofyvj{'-po-x"n*#G,Nz݄2=-,*\_ }f.Ƶi4%Kk@\TlyR;wc8 e|(3,L7 AQ`M<ߥ:+/]XBO}4 +U7]3ONATk`Iq5B΄\. \-1: :0-;/kU~"~4]cwvO`m*:`5Wm~.9wNz~jiV"y!Qlo{"гeT=ä7|R ձyxe7^YJEYCD.:p7|.`XN%rDuh{@Lؽe`"e$FC&!|~ Xi5#F @7lo~D,\y*AvNi]142Oߐ\wc.3O($3[r<}DMgRv5uTxtv3j`$TQ,CT'`svK T&pfH<:HD@4ks@艂 2[_F|1*v[j0gS܏+Kws:=X[n s|gQg5NO* cuOj3<PvUDL`2pfDvXsz!OoQf>K@ ȋ ( *o`q3#L|>|tTSX̶!O>@MvJ/FY2 ,̸*UG-1m+;,/V^V]/y\=1O,{DzEj ,czpM3w lNof>@֣8[wu:M?QCJzF0l6_}"*vɯ}3J+ȳ1ɪ| ]ߠ*\ɺUQ1m\|<ϊ[?;l${HxZxū4H4̈́3gڷw('/+-?@7ZV蠗jT#ȫ}(A1 "1Wd1 y$H - {.x&2JJ'QY Ηbm!;"jŏʑCPh <½ CĜ~qr!vY|p'N~=̿y4 7kG ~t4L:LzNZ;]P@ !f: CF|˪8k WkCޜ|+]}c'^I7)ĖpnxE0XG|3UEhHSoN?ln8+S.1`:T@3.'qwYZZ'VZ-y)\\r5Rj U|HUb@5@hug5NKv_3 Y8\A1JUnN.J}ɓ&+[U^s"m轱0)ȔU76L @\!>螺\8= +DO,& ;87alOSpǛD 0%Jx +.M0) ]iǂxɼP~\:CY1}E/\+wD?6lr{:$jS|^Do^k]+Io*竏e)>`.OƘM˯?'ŝccY4m`uM^l@9EJXy#Ǭ:ƎKiB%ɻFVRң ;QȁP5|>Rh`r&q\bzN9VPOJ=ɲj6Ҏ ~^@}UQRSζ.f ^yӆꢟ & Ƽ.s9xxtz7vn(IۏjFj*+#+ kΆu[ rs;.Y~$F)#Ds@\S,KZR=kfo@d' eOASx"8$ OvOL{ _MbRqԩl6%[$[7a쿄 4$oq5WgB{4p_+!]vs@GZ/3Fw Ԧ*֙b rD<ƙb^_fh|N*P]w 杓7ldG_3Ew׆rsrޛ }(J H&Sum(Y8w6YK/(4 4RU`tBR$^rHf^Y72%j 6B|?b|8GMmpUQFi&'P}˪´)rGAA5pU@A8̺?PלB NqށbL>`1\ΣӍm<5uZ>Wk 3hos(},`OAQ{sF~0d[ƫHP䫰] $ {B X~3TA6ڍa{Y5~|wхl<#d[:cPD$+rR׫ A=TΤw@V[),BLL:J! a!hx)%ھKQ]kfcbzr?p7xr|is^]5ZCt~mMfT~gx C@~]K| ݝ{Hl@2;GXV?hhNLR祹*DB k3QT粃IׁBh-'8'fIZ/&د_ڹ C+(ÔײፙQx zD+lm}z- ~lה6pVݝe)H}W XLIr|8"M.k1(L\ :@'K ]WdL3+:[ L#wl/BN%#f^3Cux%(<\o1/d4K_ZxFq1vZ0]@X=VAa2 4.kZ3(3"ԺW([HL͐)oאôz7 E7y' Pq*y3gLF+N^xf,8խGR"=px"JzTY47J "JMS70jpTT5 ,8z=%-~|K&!ћfK4`h@/X^jX[Xc)n]EُX]:5+?ξ->=ԏ#d !LCMVv N nReFɔ=+dekڸ]`8qO MbDNWʼj/Č8־DS(FV =p E s#d%aqъC ˙Rp YgK3Z۹Ն[)z+)\j4s!K.BLixs`ߕ -}91 4>Le\Rbt}"1~v:/mKz˶dJZhH918Qʻz77#xI?3O/񤳐x_ԀRnusL|* b#D-C 操xKog>1+| qVAOLg&pU/ ms:X}[ĩ?|j[<H|Xb^(Αa|,47.dcJaE6r f'KI'8|c.` sd,f0 {bq *^ YhAulliw]d;XBhmX__1k 7䩼^T{ϙy@oc2bK9jpSV?0&1G`S"t|Vr-<[P0j}rh9ҊMQ1Dsc[$'9~9NDz1E٘V۶4b&M|jU^w[ ^v62S.ąvGz2kŎ|z8}&;\3^j%uƮod~I*#?L,{'mJvM{JadƋ^#ꁌRf%"bJsivp<ܙ_!w𽴫 i!ONL=::'dFjpS`YyBgjQT:Z 3qj!ް۬c}ją *'N-l`o:u`\u0Xc!cDd!=Ø xJi_ ^WR20UG1[yhRU'DQsߜ%$RE{H̸ YD_2p:KpmyFL+K0|& p=F : as?aW~ն(\MPGwB3<J8)Rmd"ƨ^?B*~ 9МcTNJt8IE seXׂ9pLEo˕hMi ]t=&%EW7R^S ~A~sjA_ɴ)ǾBv.E4@{zjl⪄4B ʠآ`+RF:Յ@2~VlA:ځ4# ^A"H% \*攉)Q>ԩ&3Y@V )-k߱n'm22"8F/3RUePqI#sk]rkLj|s~ka_є"EMg?g& &j񐄧<_byLfrׅP |j83ٙxPSm{,2Vc$*qgB#rYi@̡0uF5z04xqR4 \o,/*vbxR>쯃>Fmى!?ئw||QML 6FI/Oy?̺Th†sixdU(W;ZB1wR4έۮI?7#@ "bso'8:۬ްgK[U #ˣje DBAGB\hjN0#G.mm?ʹ(mOfАYZ ǝ7=:B 79R9DXլk^!,"eɪݚcD4=k?nuI&6H0R_lWGn6b <i=! h83(В3O Rc]ro"^)nxtYrze \-<-4F MrFqp˦:ѢHԲt s>Cۡ|^+)">:UO .GPX++4S ].jb?O8lǁ#okxg ǫ+m^~S-'Tf[yB|zBM=(=X1ÀcӏDZEd;2/d+HMMm+(uu1 쩐2oǁ?J_lӍcYN_ o0mUGYQ IzQOU,ˣF;܁5/_;uTo[ 1~cWCPMJwLnwa?jj[1]?}|M>=V9J~2"?% ė)fYƊ {>am;4^\J6+& r2ZǗcL8,'&R?'yL3 q`cnWKŗ *ǖa t4#[J%+jd ɹpz6e8X0<* yeZGVy]i8}Wt)d! g  T^NP$V!]ĐLSOTwS"&pG jޞY43!\tx+J#2_Ձ\g *W*4|&lR뫛TO( $Vw)RmzŗЀC.EqxQjB*i@ I.g  -{ Ůo59z:(eF0弱rhB#lo6Dg^=}WפI+FJgBɄ,;@}>'$yefIFnrbhup*5IT ܛjH#E+#aVI!tRoKJs\{ X4\,>*&I٥rNHcA-vT+5=Afi [\@^[d#'9=&+b|x)̧4>̉+ $U,p _1_5Xt:Qi9fseEhtQcp4RkrWR2FXh?ݴX]4{.FaOS0'J~﹘=)e()$58h!ˣq>y }b+ ^X. >Xh'`v .4[t Kp4 .|UUN )jm|d=DsU=tbI7Հ'},2_=A"oǝ aw~KP-ICDy 击'jLl,W11cD-L\.!h/$M3$Ds_x3ոI;GCO饆euQf3j|OJ(TS&&DNKGa6: @m]T`xV<ՒLbM}-ٲϜgh$?`'|'Bܟ,W^}dd2+ XT(=>Ll?kZp1~ ^MҕN@;gN<`Sel#݂%J+_Aw^p0F{}(pVF`;@|@yMO=,gⴢB:aЌF-S\Y^ HNifiاp!%Hxk/(e%UDݔ>kK_V *W vUT``©tM@aÅf i ⬅C79βLj~n:qaQÄ$;Z]XϢ G0:Ā{"/VQǔCb~~oEt јb"BZ8:vobP£yB;,9)Aj>mt両$QjɅR Za)i8Yg~otVmXQ'*TH ;+ ͩ0 ,\N5$f{ ]qhǎ#{dޱWD|aT9oI"irJ}E&k]3yBT}(5&ښ) t-R*(ZP3 :([n3 粂 ~9įaVT`i)BqvyBfA0+&.o F?Pd8U V7j*<*cèsӳ7M2U*?Qg}_g3\!-Yx!If3BR4.>K8?5YxɣSB_ü,**r*U59ͥ`& J6-IMooP Bw ~(MiΛ:dJ>#2/||1G u HJk]VqRaRJ?X{è5aO) 0ΙldrӢ ]a?;|\2$q5 B#9&_6yL&a,vt@K ˂G nV]5x \jzOv$XHN\5mV{ZR D_:7oV\Yрuե hFY﯄Vk6+~^~8JW']Mde#n}Yg+%\4xEOf@NOȸ`UɋNJʸX*̖7OUemdX Q-Ot jgͿp%xaZ<2.xB&(6Tgh2ش_GGOl1l"*6OicnZ`꺞A~k{^iT+ 6 PeC)F̭x&A'6 uIa@0wC0HWPTa`oƏoN3ܛGkyeO>2B^Q!v{|)P0Xt%QC5A-ea?);J9j|/NX1>e//c4jd#z3B_~"s]S/m#Jr}Jiћ]ge;AkAg֢W}t*lB=x(I|벁Y$fC;#sZ{oɗvPY`;GUrz>"EQsOih=O_֩{ˆonKf.ɱnPd],'6(2*}7ZDKb:FTR $9NDh ~Ŕ:&Nva"|eR?DD8ʻcIs-g\7 fö5N-CO4bU:OZ%0Xrr'~TF\;>P0 s+| Zl9{k`ݸwwm1p#J5|b5$®/5$4[WBD1mGH5g`Dـkk"Tlj3хsJTl8q:IU(RlVN`bx xTEkx_yem4ө_ne%1;h.'.ĨО!"Ҧ [9u!<]pєpɮw\ ZF|L9EfڰRv!W]7BO?MP_rCq{7MӧyЕm_hWރwnHwigZyzhZM1'23#F1{*!;/*^]Ut9ua9SШVq= ֐DW Ķ##CCq0 {n7|ыy:g nE,Y]6aiƔnGqJZSA#k*3xϖ797Yu7W_{9&u lZ:N^ID!U]#S3,X8J2M˃V1UBўytjS&ꖐa|?[[qN{;]h6% 2K}ŠK@6+nnYi9/ܞJUфᱼ?4X':V>,&rB@,-,:K¼w`p5וiT_1lzSxR?:%:a,f `Jm~Mt6UY.O%[ D8ƅIpȱ=Vῄ#s{X:! (ODԋlBDy11=]$!s]c(`F P'oٌČbT|ZȨEFa85>"{]@l ɦR%s=dwgOKUȣl$* (FQ<08[.@lCi>`UEl/.tC.x]^yG8(/ v+O7M"ivOyZ=HԌcKJ>!EqFB}c-O/M5roU5b)b%%2F#_s9a۷,zFmrl{nGn8l)be(Lw1AT%CGgB/* R?>_a׿:U-ȝI9u@GpM!XiVYoᴦ~C9+AbxrA^PxU'_`0'Z<[(UU_\M{e/W^9sZ:~_K_~V9բ2{2*a\?H ~MSO@i_i쁞]ϝAԞptwU? ]E ]v43 3Ȍj2Hv^j4_4MUYLՉK\$%xZІ?ã._(ڼ "dlç"[a^!e,RXcX_YB}-×ԩFbL߲"1=#3B51cDkX|esUx:"".M\ ]BuA&SE(8u bKK_xTp7Rpc LC wgm[>FzEoYhFDhW@PώfEEҾ]:Am37䖳hP 1^5J$r}J6^¿}b~hX;Cv83fσT~=߃r}Mpm }OՐ.aNmz;C jmTNiz^Y(! ~Tr|rn"!4@rSizFd jVImxbD+!4sSw8Vt<9tDw\V"z0) wnB=j,&wJvcXZ>R[ XD$xQ82ʸ2gjpk%,w4)6_c61g~ aE(O3\@8w8i ;l*mTT{]utː&3O"L{GdA{ƍ(DGb mJ-lA2'7Dj:KVI)eP.Yĸ;Kzv]#p$ m0:U7'AvAP^*qU `^2&(軡T INɍĺ@̈́DZ2g܄|QTJnPH=h1^yx40҃STkCG:|&Ax"?u0[̕j͛nv.꽰mbMEpv/uF a`w p 1<#KC1b39"Yw:Cxy+$I!z :pHDސ%i/c*k3 ؈[p˥I_rPnJ;- _QC erYV`LzYHu#x󕙢ӵ>{`T6NV\hf[%2G"13vҔN,$t6C;6.*AI܏rk gO$&'!+Bxsɥ5y «ꧻ en'jm{+ḬƝR1Vq`P@ ή;w=~o2ϩԩU]|䪐^ :T>9,:`fח2iW.Ka}O]ҩxŅS'ȣGh17eLG?l0u_noԡPEx *K,bZ[ MyO{\I; ?}NpK׶p%黼"RTj ~*&ܶZw|3 hZE$ͱ<F:$gAB]8xKسEۑo/;; mSk㻻h]HӿTRKL쫘!b;/F*:h@ >?jSORNRG8Dm^up+VuyU3:]41[JYA ꯀ'M6d~cD-{酞X_{tn"R iu(]wD$L歃g(-D&N ҡ*j_XCE1D8ce'cn] r8}B*J>zBxƀ Ac/b  L.xÿ0Ɖ"H5+?dWw EεxN1p<[1ZI H )>,!)ƨN/F5o>"tSLlBCp@bMp 1,ю|0,Gf8Vam{ @[v^K, >ʣ"IHcſwIXE jxYÎb ǘmYyηpT<qiG̔腝hFdnɹcIaVDstPO;I6duQɺ9FcÆ쎺JVAI8} CY'UNT203[8ơE!ڦ],6Gk}AR}aOOqpcW" ˖G~׫_DÅHwa C0?,ljri(6 :lJCH-0AM)jdz5(IĉNb=V^0٧B* zf}*pWU=:[UV5m+(͓Ğ}ﶞgYlva&X70pAՐ4ga bi+bC@EBQ~k|䇸@hpJkI12 (ƞ_YUiJ0t SL%_]&rHEig,st^EftVcHEM4IAoߞr !.gŵyL ]sq%mHbAlCg> 5:N!q"4Gs][j5Ex&(IkxyI*;\gN| A~sE&Yô҉ʸ ΨVM>{Ϲ"U 5~ r 豇ͱ\[;Z?e-ZN&˳KUe駱;x JҾ i8u Y!Υ5Gu*I8`CqxWwݗ6j 9h5MI_Ϯ>[4!ո"^@1(f׸ٱN{52*Uي(;@۫t5߀k(+x?@=Cݿe_Xʓ#wx ձ䝐Z_xT;@ZI/p 9r7z7a-:0 WRjiVr5VNgk QU)z|7^Aa!am=[`؂gP-Ilu7G48l, 5eY EQN:85?9Y:3|66<X4F.ˏΞ b+bG9F@2n>k6p9 tr-vz2&'=qh2\%hřnpoEm <ֺDvO OO endstream endobj 357 0 obj << /Length1 1748 /Length2 108337 /Length3 0 /Length 108215 /Filter /FlateDecode >> stream xڤpfݶ6[tc۶ѱm۶ӱm۶u=NުQk1|3Z^9E~#ckGZzND?&aHTm97w3"-mc q0988\00hc 1([[[;غٛ9+_ rf涶1Z%emdmdl'`jbnm 76(ژ8 mhl`oaD9'Ks").fa"R/޽?759:r_#&Ǝg?43Qe,[ֿ-ߖoew0Pl\_gddoS՟90 Ʀ0tRr50Mq/ho ФgוFl- .oe wU # ` agg0X ,(ofD_&6$nd!k߲{$?E0KZ,ߒ3ʿ]1EWF97e/Kw(ZM3/ZG:YZS"VnC_wAHiW(Vq0BR237im`G4?,ֆ6FRO 5״&36v56YY1 xv99,4 YdʺUv:UG}E~>]`AqxdK bsSiՃI\$^<2"CLx"îU("^崶wJ%4'4S_<(ϣ#d0nFūbiTADsקU`;؄ڼY=3g؉ Wm5koRRw m9.bPMc>A'Y͵ zeٮW". c 6?6aCT)@ ` 6#.Z<1g(Cgk jd_ P,Yַ24 ಇ Ne@q86Σ;:d.g'4ɵ4%`j.D9$4B@f _]Wq2ۑx)և&.aR0@TZL/2 YF{>jC IL 2LA&ΓFb\ 6e7%U]r&i3~;b&I (KviYP괈WԳvxNH7_K4\Lrv+raY6ՇZn_e@;Ԗfi{N-v)QsZ ۾1@9йƍzbvS@ӕno;[U]߾ ?Dԋ}Bm'v}Uj3-*+Ѻ KLDi-ߛ`ZgUN\vR(V3 08#XD^oіDÙ٥_ 3I7.buÚ 6(]'嚅Ԟf-7&"+-g SKBQ'<}ֵ ^k" Jt\6.SyX(hŊF~ȵD*_^ 4ķ5ls ^^Hk969^sf@hd#Ly'?j*)+Ȣ"4)%OmF+5o~p̈gYgzT5жL8RְgB"ޙ1BD6)=%ͣe xR8w=L]?DbIYr5qp/ ~k_h;[RzXϼ=W8K9[g;hE5K3<}4 IqoOh>76ʹpryˈ%ۚ3.Va$|00ǛIuiP*gJx;L4@VWOA͂-(uapRbC@!8~RD))ӘǼ*{/mEXC ;#RηDtN1針wC22g1΍G'/c2HU0)>6nUA~ Loӻ! ={^[[dˎÏk-N=LH!R(*Q*ìT2 ~XYUH a7}'ͳBǭm5 ΉZXBIQh98l=VqZpK FAm-[zWʳ~2R[ #lR ЃFReg0z_C1d{鉹\ˈQX ; `)%Vw%6Æպ%͉r>FF!'zhuT JT`esT>fuaO=n)yCy㣆B;MĕAMtH3 +fd7-d4 <,DسG4ҥ?Dud W

RxV@pivhX9Pט(,Nп)zS| H> 걱P{z9(QV.<~zikE8EΗt#"$t*|D~%doJk@8Eb!i%|csa̍qmD.' shA]U'S8jWefuhaRO= "#q9RSN<UV.MaLܕ4<,T&"{[e~_b ;#d,Dd77e;@ggr V@h [xW oi.Fl3)U/6pf#龙-Ww_]jp {R΍yUp9.Cu#8x[*-'DB&&%>{7H; Nr&&ֈb^|z@%f%P{.46^0,B~Qu~5n.#0O,Byib=5 MD/_L":ݒ{Hk&&Fk]LI&0KGw NU@*)(-Wt,Dv|lYNo6gQ2[ԑӶzO ^Er7gSd]\S,ʉn ۧ-([1JvlG@a hejVjʂ"c'(>FT I%,Nt)i˛lkf]hE].Jê|S'c L2xJq3VsL[Zr\F'3C7FE iP%77yKd}ů_3^UX9KA!)Կxՠu}zJ R2!,;? qNO~ْzXgۈ`xL`EE^@TNg~`Uk,̓5ZaOAnbvoGॳ AD.icG+;2qXQ8 @)L|8:t O~F۴Wfd275}.*x*{ME3F[GIo" _FyS#}؄eCm 9'6n8"pS}&g;BC 3@ܵ:$<'_QLo]ܙ~;uv+,Ep\l64 7MEUXՅ Q_;S9]l?y^J0zaPU#63xaв EPuIkۊFDLx UC۴?z5;?KR"Zʼn6M7FgS0TcpprI`۲0^&>HW"@4'ݒR!ikNN"BC&Vfc 3d1, 2]Z^{Ҁ@f9u]CxH ۻ3J]O6Sp̈́Xzo< 2QPvT vT~ @N@sb2WWO 3 LbcqL];IZ *ry'UE޹i=W^Kbzj *p 7I"dNULNYwha}d'_LfM^z4ӳJJ4#%Ot/" FH\DxMp-߲YG;JΝ<Ѕ.lߴUeuVr/'|zΨ0/XJev{; =4" 'HٺB>#،_*ms@_1 sOAF Ȩy`]'"K+>c5DEN u0փR-q5]`} [ܧY6YfFA5,'Wu8#gP 3E~~I`.o 4){AM3eI1i@;v^(AiVPk<>Vrge*m|+F7b.S؊_#K1(ղ)A *0 ,"JKсK^#*BhmB^m,*^JVfF]/iZKH7iUJ=Ny F%m8/ZTT`{qѲnF/2OAЇ.pFc_#}`>v{L\x{\O+a!؛ tu-6佥߁D L9P?ۯZ:xq'OG^//!^->+*p3{6D u#hn Srm!O[纔poDZY;"ٚ>Eh?fÑCg+PС2~SGhB/J:ʓ/@oOEi?)n9Xc Mp4ujy áw={HG+(<?Bl\b~4A&{)aLS"ґr4@<})ρJ w 3.&5D3뤬4vLZȔ Bȯ[ 6À y᭟zA1@E4Z <?"K[ L ̳ k;rRO'ssU&N]4vU|ŠizaR6;)FEu@>Y`9d#r٫Lizs֩_nݘzdհ̅rv00Ћϯ6[5EeU`5]q)402,II`EU&-R3`tXګtZй:ЛPZ>j4b[ j}=\(x"+(A}0}PH 'w̗,h"֠SJ9C=|⋘_hYWp N 6t)`X\(/^?c ;Wgu<ŎU<1}QfI?΅X;FhCg\xɑ%ɴvPM,V$-|EI0ؾIZ%,nqX"z^ m9OLk#tY' 2#IlWMF&G%SE? 'FZ7& 8[pBM\ #DQ6TZW2 nY$9*x(LK&3,՜> p<  ; VގdOȠb /H6|cܪ,,&lyYY<_úii e:?_ܘU>.{{hq 9I7Ff ]BcǤ 㸞oqCPoPzjS {Po^;f|B/,aOሎz8?(6:^pD? ]ˌgY<:)Ln])ql="b$p,Τ0=*W ~>9'L#N$6jSz-;uYu*Z YU.T8irQyS:ET=7bH` >xL Ohm.kQH&0rDXƈpFr&q׋pKu_3kzvV|IyL Y=1sQܖ(%5Vݘr@b20NRcFir{0~U6i)Q\{nv޵ ZΤʫsgx`n!b^2Df-p?}ÿ(W2;? Sfw ;fҥ[FtIa;j5?RI3&b:8n$40udYg[o'Ÿä6=:+lӾhܾ!"t?LE~P?Lw/W aCJb?+(TQ:х\ KVR3OvQK|GG$Lq]cbfSMuϬE6ß*4w{mrYIaT(/=*5_ޘ7s:;Й]ܻ}\"k!ӣiOuy<<}gEg%}ޯ*L乬תl#>- *5΃N UF)#~ddR`t=^:!{_(Neǖ˖[`oф9h$ oY / ".Qm.-1KT;J%e_B,]W 6D_wtDh >mPI\(o00Ă<8@`ko6f]$?]yJ,S蕘X.ɹ1ЯY_~!a<(hq4uT0b 6O‚c{*Ъm< Y=rK s]l㣨[FTN񨽗dOlN%HB o%(Ӑyj8\ Ónhaɂ/_bi}Ijn:WWxgᄰ J>&L 窽R ܷ8%ٮ4T :b;\/fXC4] u U}V0$IdtvM2ôSuV4+e=uj\߫I{5M4E Pk' "etB'x5X[Oi !50fQ9zZ8NW `6Y VFL)yc4.37DJϴhWyZf/CG78uhyjeԨpu{U>9>%IРyeÛe] MM( q|~1a Hc,v=&ƘZ@"fٙO\Ydˉ7e-NIw7#[JbܰhLry$iMTJMG]]&v E/80+hS`q?eީYjW/]yڧiqJz?dz{6/qJGŌ7Y6XZɷˉL摓YvxWNjF3+ݶaiufOR0=yud}Y;\YU Qw 0+s]p#|2JrH^4~Wc91^CPy"*@IHoGḰйccg5HE~u2hT7{}_rU谪a|}= h62;>sG[Z"*cȸ(vo|8h!_k" 4'G2( J&P^ͼo,`Ou+'ۊJ(Ka|gilSይׁM*V3U)]EDY%߫2؈wsYaT MNt!'ՆYܑA#@fgkZ/OY ^%!3e5{Dz ݋ S{dtr3JH护aK}3&3Aa0ZƎh΃zwh1Ls1֖Aģ`  RLy 왠\/$ˬ.It&- Q5sb`M'3̼P6%/ JTt$NȂ 64G0N<WꂀM;= ְ5Vi0t)`L-Snoqp CY/p;]6:jD9 ,H5>VKwlGS& at/-LV`1jɿoH#}M~H0\?Gg14o`*K!텺&IYp$L(K !D vMpRߺqɻm75&Ui#&Z ql)dTƷl°DZ(ZhPzRsL9tOH=6\)zu,yiaQ1mt_̱[QbEQCoZ԰a^e#@^b3 º`c#c0KE@7^7coW__&Wli<"~ٛ#r0[pvBE9᯹usbHs*W&<)l=sp!>fﮥlzoO؍ =% M_`ZwUWer(B8f}>ExM @unFV9y`Kֵ痠@, J[ =dKoÏ6G*f[b>wPv |Ej@3|l~@K+vPPuр5eij]}|}!焥 ն;RZo<hbPPz;&U+jZ$uhԜ4OJPj '^84EA~W}=BP3r7QFLdl#DϞwUIbNd&V ԡd0T"CB*9r53aGNQVp#_;%*lv嶉1v Fjyl[Wk*?V/ V&wq`#{>aRL ''NZ3Dv3ƞqC߯8V`i\s.3W)Kʹ[b좭3蝫UW$(=U|E9Ǡ*h+ XdnRk>bѮs|x7카T$v&3@ ? S_7ZQ[p/\'Gfr n?X J8`>'+X9};u Ջ\?QI@&l0ϚAnT1);:~OtkR[;-=)0 gUw<ެ p)HވY~>]KU3J`ࢷt=r/(\rF_WVgQXUzi >Ò~NDr 2 ^A*-v5Dcd^&YT :3l=kb&RF12BN?IHP 2s)u/`lj *<:|pVA,V$q+qu8yU,$##;y~!?8Ow6?B; T4˭Dd\~t<*wmrSϤQ0-xV_Y8 B<,fS 0c.qjK*&Y4["3-.s X vM ܩ@ Hx4&D/ɣnc"W?pc#dmx:zEqOE/Aw"oe(\ŵB< 6)5uw;̳D TY+OpU4*P M|D-hTta[Ew.L'e`4IKMj'4L$[` iз2Q `X8ٷxyPj S#96t*ڮ$ƽD,)AEzVhIH=1k챩P5{3u:u3/@,T3M0Na"1 {zHC):ӷMR! &vlŖa çͩI,VuotpCI"G!%', %EmЮ K=7x S5iE@r,!xP7)vorGhZXp>^o`C+Ր'[{ga @Dl CV2*õEhD*%Je{DؿwP+sDa|T ^VM.h+.ۗpοPm9PtpѶwք[`a#_IjRA o r/$"`iVNhX*> vWxgEh0?}D8,HX!$58s3)0yw^P9*]xTl(9WPFUO8NvPF_Xvmӏ2Yҳ "Hdv Zx^6@/o ^ S7m@V` C(gi2!:vـg$C5%զWbkowҌrV4ycfqeY{=NT֡ PdDyyyx76=,#O`XG߸*G/`7w?L!@>Baeޖq+LWV57ϸt*64ok0y!se+coȬ7UDJj~ZczD]@%DU4WMU3Xn^ 1ak(ގrOCHGn۪<=4liis*p4kW>PRr:>0ë+hbHuuJ 1$emDTǸn<9_]~$XF@Qh_-P.,: 0hv+O?MuO"Dk)x>$噾1hP$X^tzDYٱvYZDN'/m+dU/TQh]$m#s)<.DG硛f'\/ñak5-i"M$X}*E]EK3C db]ֻ-VA=tAvWq Y17m[ %׺@裮}c)&<'qHU$AafTru|ʑ\Yn뫮2b"W &{[f.47] уL)Q/M0FDZȀx>E'li7Q$RU7;>l{Q&۲r**sEmp NR 8`!D\c)}ʿ~C߃ XW,l9YZUg\HCjuDT {ΧׁGɖj"]N6;x/'؅P۫H-T/0.:jOqfsd*G'DW:[㼐M,*ʌ8 @Aq;#no-fSh(3 IAfJ~}8F`ҧ,4p#Y T r2'|pNSi5Ƞ2|_Y˅UkFOjw39p-BhVC) zದYK~ Ũbi0G$&G2y⇿.3TԃrvT%mazUw]6Ƃ*\[D3i=%VUf6B͔وpviPOn%$_#5EcpVw)܍hJ 1FU\rAkJ]--̦Nr˰;^fJ`f2(EQtI-%m-@V) yR}3ۢ]فNJA8Mf|k6Hļp}{YpzObWQW((ww283 <#DjnKAgvBESb( 䴗lbF;K&&J1 у נ=LwCѡ\o㼬3>u*~hb}\ĥz!mPPFS@yfd Q7iӁ)6-`/҂<%i>\Gݠ\S4zDOya^—֫VmR>Kո気W(!M*ބf~oF6R: Sj+c8%aȎm۶m۶m۶m۶m?cW[?T*;I+Ht.z~P:;aB2Vt-?ǐf`aKpdpSt%;D.J+`}uJU.d8Ѹ`8Rm[Nx&H9?\*i7O|Vezeb23M]*||mt(@de1.$ȘմQ-o&`re`qytIcAiMjypb(7/r "PYfaN*'<-M}cfaR+ ^m_:YDRQPM&>vk&@GûO3*P;ČG~QV)E*q mfo BQ]P9hcΈ1 ?HQ#pdle IƧvpQ~(n|Us\ p֞SeC.߾04Q#^:= "w1e躲R ۗ(!ģJTG\RY{4%Q:#`eyܕ"BB{Qz|bND{  QrW]y`Yil4۹tDuF'ݶ @:Cj% mי;ܢh[SM"غVt@>m,* !cB SCB7o~Ǩ';C:Q`*$ii+;Zq gօ\6C}}m k]'t#hr2#J74jQho T %|Z7Kss L5([j"uf9pKn%4 .Ā(;ݶ#~lGb[Cɂ IޖUoӶz:2"n"5Im1R~\PCg9"tEwFLj~wU[wSжma}Us}KJ]"Hu,',<[Hn;m-7r"ڙS8k7)_qd`'d%1* e ̖#ô9%m0׹uEyn&tǧ oh$KgB]SPw:>o X>l87G3t#)Nl=Y_SZE7|P{۷|>ҧnqmgNJrR9gSx9yy9:Z; qGInl-}Ү3!|Ϧ̄M`G>HVghfo>DI7^zl<{n57ؒ6%AkIFPvlŹqJpI88` T $@YUkllsOإzЈY[c%(HϨ1)b2\ @޸|_oUBv9m\i~y!c0Fh򯡆޽O F]aݠ? Y<6Yup|=rWW1 ="K%6AEgq~t!Tf:hw S`k;%i5]=G)]{?T9 _W36 Tt0M3S3zoByg^a 9'}R@R. ?ɒ"$ӥG1 C HqoEi8&' &O43YpJ"Өt*/lPsPλ!"4yicSbp(-4k-޾[U?~GU=U Q !%?Л 9`)J (Ie;+E1_DF8~]tֈd)}mbECuwF4W,A9q~N9=ŀHduq:eTF"g0`d$ [zH[ъ]Gi:_(Mۥ1|̑#{ݯ[,C'?"X.V":P0Z ~m"xE@xcEP0lWR 싘{X^p.IIKEOK2-s]oCmMG0B(`Oݍ{UB"rl>83M"Fu%֟ ~As|&:_29c;I.`jhbFLY| +%$\M^*.RJޣHuS @^`[F㚾ƭ>z횲'\1jX0x qb22>25=1dElBЧ(gljs 05%,y ꚛ"bLHc%}'͵l*Om({[&h: e19c '!n/0䊒qlSB阏<耙ĿE*dfH>/ ~A),ޡkMRd%m7C˻&Lv`PҒBEt_2tRۢ~-*8 8p^0ɿ>EC Vۨ3nt!ZITr6}$(L i:j""D>'yE%d3wnSK @>:G!Y H԰QLխȺ4.k~)`Oe Ҫ^.|n emU s ]"94SleZT2Odbsk%F Q5PR-⒮hzPR7!9Y6((GvvKÌȊK}7+5G|v:ed&"f+rSj`WnJk]],.1M^Q#T^HO#59yU(C}Hٚݶzt'S 繅i@u@<6C*9ҮNC u7Uۼ6X!'YS ׶&6*x9xs͕hq85\f2O$yH/h+`Q_jBNpxFjo x\wlZ!-o .nԄ++& ܾl鋚-FK'"$ݵa|\E#iE< NilklC;"'C$woEOmŋ<:Я|R f ~/ 2lcLN}WGTn~Qj:Gdn5\A:4F<&—*d@Hc"e]v}֕<ǐYTr \[5R?y 1{9h9m󧤒D ?dDYdj#5= ܜ?o@#CSd7x1ŝ~~v#%8"b &"Pݽ HrbMdJ;',ж=-$cH8^RIP[^(tBE El[)|oөT.ŊD[1bO `r'1lx/uQu麙%? EmЖuJ oezEr`셴[zǧ;f*k?SbB1:/H k^(q`t_.~J0wiQIpQ r=qyBRᢣe~}թƓYj0+G9E˳tINң1V2u;{~Wz >TܸMt IoAW862}?([p.cЅR?@mj/eaOmrJɳD0Y5]:VpV 6,AD'ɬՆ=mmƥ }=MoyӹfDY\X5Zv IBdB#ǝYV!~0*qqB]N'iQDȸTx(=-k3yexs0ӟ#S~Ftl.RU8>/ &|-ۋ+ NJ~^-"~^UB6ܰS)S=ޯlB.R1~ FOMFKV\aŸ8¶:>Eo_v-!tk=zg@A2~`7`{ރTcNm Ppp}zK3 TL\jMUhOǻkDQF~-XSN9ϼ#q 8, Q(Dĭe`|3֠1׫ ɚɥʁEkmԊ} )j+jjwR NioWe yoo@ ߯"EXIذN;ۻ$B릌 ~w<&y.ʋF5ހ:.7;vUGւJ*sC-ΦB`./pp5qU%)zK^ELxV` | l: O@4$p arm`nͫTW!ؼ)E'%cei8Ѣ\4KB]~2Qsqؔh-㘜eҋ /V\GU>p~. x7_فY@o1y/;C ԇ"W$J.}=<5:a{@+P ה!/CRr:<.GO+%tǦ hۊ~Ӎ(At9njB6>{@fᵰ$[! gWw;>$#值C, \΍=9͗TWXw-˴00ro߻M,zTD@ܭ-䭯K7j&;{7B*>(,ge|r7U[^PW{͛bw5CI*QcT ךr {! kڝl+@_R^Lo <}g%  Bܱ1sٟ [Jd&_d^j#l\R! Q39ɠf[@u-H⟗7UszH>$/L?8C 2d)Rv]XrG̡7?vdJ8ا/2hc;`D㌤j>skX{mRǛ0hh`:}Ha >'.9i_[xP7zW%X|hrkĶ\X/T`}ޫuBs DPp"d71j^p(gʖ!\y#Ȼh.ac+`dƾ`.H^e|NN=_ BVw +XB0,"')?+:w~牕:Jbr )`D EfJֈOqQS ?c34A0-jؗiC `-PAza$hEF@9=6t 0bU݈@TRZbӞ5䳊)ݪz5@- h'SĪU}D?MSw ]'k_an_;,`"h$,-9wQ2TIZnE.RꞋ$RN\y\,~]: BhqɒQqmw&CYApar,e:خS w:Y'*RޖBT(\dc˝!wˋ^"%T}ܝ2zH_0cO!eQ^©va(o{75r1 Dbm:Ik(qLjAdUrk}:O0fb8Qɥ"s%@g2$ v"&cS]e~Ѯ}OD{D;UEx"Ener86ĕ>skj|%c5Q)8Z-ϛtf͌ŘK7N~Ú)\7Ռ(D%cGzt>!Lyu>W3UY'Zbki{' P(*C$ut&v,_"rxi&ZANM?%+> \SoxfThAyLew)bFi鎥xjQ?T8[7(!l? eFG\y)#/RxTAP 6EDB lhA xkϯC'|A5ɎeF}Qe zD ϻTҭ_LIxRy~cv0r Gj"NPo5!SևR/ew53&@-nh~߃0;:3a<(_NlEtD'F[ْvx3ӿ"#Hb5"~'"0NB?XkTyX7}ObPC^..o.wiV,O6dxhmĈjމcw3!IB ,E=1i!Ó_ 90̪ǃF٬a]vXygg9VWMoVHU3/(ٙ$̯1/':<G[ga΍$5@DIݪս+*@:`͡6wy"hnt8Y kbJ)7Nߍl4CH1u!UWqaȠ?L]&SЄsSDdZ kzF‡4]j=Б'T]4ӑ NOgpY{i> 3G{My gK͹OW߸5~s~dDdP> qa.ECOL6}UdTv߭WZ3:͛>N[;OlP4>;W~X|Gtjh˚UEmIH<.Y'V'Ҡ P\_ky{0*0ڳmӒ۶f6 LEG|P sQ\!>}ؑhg,hzs[-L\hI;/]349К*{@A6mt0ik) *8tScx]b{/^M2w\t?^[b3Y2eAR9ҡ反!d[HZlDr;qlZ'Fq`du.FnCp:QWNc_3a 窵LNɄxtfyo_s C[BZkBNS(֡ nO)+p઎ABa o]znCPL#7J p4!G Lw} a1$g$ B "cogwȾ`ct@j+n=VGJ?!vX"UM@p( YXzrDTlK}lI=mjyf$4c{9qRLt1PSRyR]@=52X)^ )c rgj3?*;cp(QA}P͊dt1)IwYwC!:s}ޯ>54̢uC[_vߔf4 mA`ot3<"+SMVm]/#B8y ϘDw@`ԐNXU!΃orseN_l@.fzwccy+^VkwMl2Qj@Okieg!p?A9gus n>-\8K\Ϳ I\bFIJ|(;:. % M")b@7ֱ&hyxL^6Vi*O8[xzġ0>!c DZn}гdn@-{6Mex zmYPƴatcmS!^FFry\ WeK2@>!!dj S>6 ,| Df!GתvWjP[ѧwwJʞWTD3jE!Uw-Cמ|mJX1P_JeO%֐D&Ă8ު f2d|T:eX'3+‰ڛ3thubGP%ko.\ߙb6 '(5vFvLm8*kYF}'.-xC`]°$eMl0-}~fdБ t4HYįKJw;gc(T$ИhOVP\suZV6*&xVFQn4l!ڴ=خp₱+L><;|qs=WR9U؇~S!4a[gn2/ش1,^ ~1 (dvkUjRPRE;cN4J:Z2v k]&B_ ol̍V,lGsʼn?6R9:zd(}-霝t0dGWV@ Qvu*=^W0vZxlEvmkiHSFd\V/457}q[Pi1gD[YF+tgx*"RRIkDD( Ғ3hŝL] I1-: elCe{>4;ĄlI&(u.y>浚%pWsx…S3QB$Q(S(M8;H1Pl%fֹ՝Iv[%n@dY> ֯<8gn=9YaI`2k;sq$%1h3|ɌσK7(;?B$1 uz&:T!a"FHOd9ŁFte+N++RLڊmB4ӢIj!}Pi6mgF,ޝ$e rHt;#CjzaB O1 j_J'1'jX(&Fp&ڦ}"jO RδFa><m9Q_le;;3őVAԪ8 pb<5v 5v*iw[Ua{ Z\w7pxZC3kp<ҥOnY"ѼfiT5['u%oRor/ŵՠJZ D7Yy#7Ebac8/G7`D`앑 [Pi,jDTdUZe\1piQ $Fmv:{2OUȥGxą"þY ;as=rKGƊg8CfH\Xp~WO} j񭁋ۚ-%뉛/o0USqۨs8rDOU)(Do,d{c<7By~|bc [d"+d3<A-gF"aO6d PJ7?{S(ÌSANРbCo^G'P 0",T.~+9D=ENZÞ d9}5>/{hʛhfy2Nr۳4ق6 :(b"MuޢG\D?8WoY[^[8oɸȍ7}I=@u;ٲ`Ȯ!,TW A8Ŀ$|%|Unf[?#BfOOغ Ϯ klpg]bKethh.F:yAb狳0޶RO;s(DgKGQ."LNS#6BJNd$}OҠL@?ZH_(*:"Hx!s<;C{(.mݴZbe8r[vY yz{}u/h;@tףWlmIs>Mi_K4ίW5XN\m70s/軁3"]Lu.^l+KnVAϟp~6s  Scӏ:/'uLr!7?]<.<RotT"Xp6 TC@O2_Z@\=3-U޿zһ+u 2o'W[Zlߘ'nғqGL3zdYJ'LjA KɈnYW6Z/ XG~iCL)1*8+)-f@(B ZG: zn ltٿBNhmzA[ݏgܽ*ꢹ$ ==EH9i[p< S%'6)_PG*!*'>1x[$!m`ϝ|ʀp¢6Pm$IFݧzJ9?a؇@)K6U'ۃ7 P,|6m, 7/sBMh7'8ق8wү9 #wM:`nуI={* $5<{ XbNF9d1PTDO%ѸtS:z EYLZއ%~S`S_oU?`kHd떇dꅢD&\.O'h `ӲƐbOwYĵk)@ xX֊J.HECI{eǪ=#/n2B- o Z2njKH81HT~Bۈogr_4Ki֡ÙOM`K R8\[Hw ӬQGwF"f`~l?xM cmp6ؿ){'}7#}8@aI%r̓:Na#'= Kx.P!hqƯ+g^Db7]׈;VU/؅<[qF (|Il;P#>+eF`% w[wQ}t`aQuP5F }#87k}=F¼#؉s`䰵t ;BBQRj" Y:bOˊ|55exc|`vGM[4[ s d|ϔR+4+&PQ6rl0h3ra'76pr ᛱv,vj0;vjŞE+QǰDvo 'lle=q1ac t6~"ꮩ1Ȱmjv3j|}`4f߉W{w+MZy$ᖩs9čݚ3ҺT+s2gSk߹>1W' @3WMs> }2GxƇ$`"Q|1jHql7ZesDp& &L"u%%X T ?;J f[*˹q!˺rq=+-գBqj׃7E?72(Ws&2Մ"z6P*^'P@&(w#yxp ]r4vɍBA1j^0ҁ* 1&tǘ'Iy C!D Xi'plCR2B=?MoB 'ku\+m 6c,cq/qӖSJIį3%08N y ˥|sU}$4/{4={ۏ̛$(sm>;)c6Bvxug@PS ~d!,jn XQ!=<t_4"{Zqߪ)E5'x xN@KOC^v>{-S0c&c놆Nͣ﵍ѷJfڹM&76e%Y|j8#@J͍iݻ7\^9Wt sȟ_syFj Hd m"(J8k:Gjf{N4)@KE-Ks:R<__nTƦf3Eh{xz! (J*YtaXcm#ʢ%WGkG  1Ljmy~u+W:EI {VQR!6WbM?_RWd GWMgGNV݈C$ŗs"g6CdX&10W{H/斬cE 07i,XyN{_3=dHqݬ$k>MJL1lNc!VZ!vQ偾YI1B6O'Vmʆ@@}Jn~ SD;uK}ntV~?%"ueo_eͻmq}/X|FrѐtEn%}W?0 tA7Yy $ (gdm$Yl3HFMa3:ͬ䠹Mj xGE&)\"_t T#,W1C  ]w*@lmmgЁYtBCW%c^K!(w],H:;(}Jٺ#U*(z}PLe``1ǪoPf*=[#<@;;vJy=|20@E܆i~(O85lj\Aж1܌Z0?樾4>M7],_iuT'Ubu(|$=9VY8,ݓ C$hi-K I{akWCLY*Rh!R2#%q.K2邭GuBs}yz\BbBA [%C KI8e*A [~wn]/c'[vt9_^[ > 0 ?F7"Pg,W.鄥;oY$jzR5_yBu 4ZbAZU{;h'͒ڝ8oqk1FNFW:w|Z>Zyq Rk3]M×N9nvs U6u VRzys/ Tsv(ڡ%T(Xb+@U`,(HZd- -_~/`-!eeB:I tV Y5V"E (z]SΫQaޙTZG2"na@c,BGθ8I '=@1'VE\UWR ߳P[U|r=[Ucu{W!B 5-L/S70q2zA89)@w 2uisvi qe1K٘;O߶ro7$թ9i{)pQEM1_{1KXЅ 8 <9Vg+pIu֝_v#Hc> Iډ2F$ްk_kGMXG2} ('ZRP>^'ոݸ/ƴx8%bFn{Fj֝ >Shͯ^ k(8ҵ| U0 ݝgCe?72o0l&ح@T[aNAVʑzlLLY6ymï{%0;m,bq\ ο ʙy%UV^YRYf1/Շ5JV欯$»^&K$W_7!њ纷e39JTS~g0M[BYPy]{ , X[缎6SR3ʍi/]gtw={ؤh+ 7:?OpKc>@YWD 6IלI#1v+lkKV\fޅ>2%<|"yfa`kA6ZIj:Zj|*:l%X-- Tb+"f^Jy̧ KPlnE_ fcǕޣnQ>,5SrpK頰HM֖I!2^-<,6#\6S\4Wt,k¬$ݨ6@ ~k] z TGJM#E"Rǣ[HN&uʤUÜ;I_wq_*;ŭPXjsQhWz|fRݴcGNێWLϘ-@'iΒ$2Fzwf`wN]:jMmYWk?pf]E&`h xϜvR0XkBѠțZA V25RqI0'Yl:%èhkITw2T .@i)dnl\:va#SNBB¼ܟxKC/c._+]#y_ֶ f'-,S`vQM^mxa2Hwhx!\ܰwOs^nCC 9?$K@(B=/[TzwM& VƐ˭MwhCu#1ڑ:o?Y:5+`n꘦>&e؝2ķm]5E j9.pG!c$'8:j]mfv#nQ{wQbA lqW_hkgx\Hٓ7dHDۿb:8A8k2VJIu>{OoNd}|U:ôIU0C7=g1td5Wʪ)!DIks) w ߠNʢv5yb$QpV b490tYj] *r2uxύ5G9LYVT? shQaYMaєNK#k(6Wβ9FyҪFp4"dqq#va.8=늪x,?T0n-hڗޭ vy[ͭ:,%fL 6-ͅ1lǡ?*q< 8#B*ȋy;*4.#RhJ<eu+2Ɓa1w4mJ!*Φ@G\QeZCA~V큿| æƎx'zzi+=>BiNf^=PP4(0yqB y~+#a:SR=;Y_u?ųaأ2fg @H Tؕ[lIPEkn(R?kOopߖR: \x+ȯisTK4zKt'?LQ"MwEWV!3| NS09V;CDo{'oC#Y3 ϠÃg%+oYgHA1gJJDt"/vIǴJF!+ ".&9 Dα5:Y֋{6Љ*r,wjF*4 AkJjC}l HF+͖?6ŭn.S6=?W <-GjF:@)*cjw%-Lf"$gQo+NQw)lÂ0VtILdV:F6og#[=g@<1A~ _.QvO~ G'1!ځF2+soMKtKPgf5u<$N(^<:u*+ h<5ν:L,WYđ Tc6/b`x}W?Rơ uiuM43ȍ^F J◭Ҋ& ;>Rz??ie\tn/Ѡ]1Rà25yW:AXf]S7UuOTN^~Eu؇$}06ӱ,rCErG~n2_~\kZpǭipj&}oN5$t=:1/2K2x: ,2Qv6>cZyYhRhExk"YDqm`5zGr!ie6̐Dk Irn" >01Z0 !y"06- ;.ݣBn)vY dק&r _u|ڞqʵ"(ԎҤ]?)e?PoLA9N.$eGÎ9E)}J&Svח;rԌ \mkk̐bƛ2ka꜔5o6ɳ{ o⛠vW&>$VU"OPn\&0VHT^n_N"x+RE+ a\f_b_nn'jJu gCOa^;͛_P&Kߒ@Ap u#W.@t6o1؏>¯eZ=C{Aˣ֊:$E_\љr* %2D Hha$ce07vLR{.q0MQ5؅B~L*U!A2s7^7W2䎝0TIЂ \;4x_F5IzŬ3Ҭ6?7Q>I Tݡ1f'ej֞uFXf.t&S4o*5zaYG8+k3@|++gsdv!LAAiVrחWLlE*LkӽpMI% mxe -pϻ$XM=ذUJVM޹Ey%VoO| zWY=:Yz0g3bl6՗ D&>,gd`aGwfg^K׈Mgg9ZV]#ISJX""wo ڶJc[k]V$午I=pQA4BL,DJ!=j5~fi}yGn"SExj+sXpX`ŪQ4Kч2Rk##^wt\Ӗ6Za'9!dwo6}> hXB/P.` 4-(4X OK-cWl2ɉyR ^T`QZp O4 be𨱬1I^20Zz`0VQcӺ\ RZ Rn{}ʶiʖER Z*^G5QsC+؛B*.*΅ vtJhQl㓋uPA!c."Td3Lϒ&M|=)_&_{} ig PѾkA0 @:A4w`s,rۙh5Іotwfu.k=b_gJbL+wV};Q4*);A`1oi1)r.`y.*IG9U&w86е|^_IM4 =5dO)AF 6GTj٢~*TiopzN^2Q6u0Ңv1;YHExy:hpSzS\e-!7ߒ7Ů_4_!\w.q5࣋r_w#EW)J ?wq۩x/wjKϵ0.ΗXLGY_t4S'dV.2扺$D ܬDǦ@ lUAsN@C9) K} 7ǃՍ(j8Mܻ8` k6tN'Y)|Cr'*( {6{zzSH>_zۚl{#2TGl" D.G!61]4/F`I\*bOY߫0i>oyn@KΒ:ngïSY[򈦉fn6"$ ;%u#˜RnwO{e#`uXt'i5F"WMŁc+8<lXǸ2u=ߍς&J/HJBMcbjMy[ݎ6Sd{0(3cD>;:`TxF ¦ImE%#x@ U*3P: (8q9-GS;s81 lc-r6vwDh.&g 5,#O,vd3-Tyh0j"R5FT"*}1Mtpv{AT}w[L !T6q#ncKjX "U-qm2Kv)pXGD^B o^qTYܟPkQGk" m4Ю]snF&8 @:6T#+FmѮ=f"dev0bɤN%yx|?֪^H4ښk+?17A/hR":잂GM[ :X8[.V-;asPb UF{s A+C ` A7'vm܍U-{j"bɠn;`* hժwO7J4D(6+e||01_t!`7LdH܄5HRO[? Df FjM3MCeJ@sn' Q !#y@_Cp)j@0a%=,b50,BxXs}]]4Z3Ŀ[YR4xtPKEb5Hgِeh# Rf!>'d$ y ԲJÔ$mn/8Ε,# H v55~Y?< mTbP5ڵ%neIiU9jDZ]"')DW-fz2Wq `bMpbUgшSrQL@hQ)7ޡsAnt+B+Ay:ed=NIRm ^|;þAG?X]+{ΆR"ܳ_yX-Hu4!aOg;r(5M3MCڂXVn=/]`:wrXxoA!C+Y >ut4NE5%ퟑ5)\)TWɸӰzQsqZ&zb7F o說rWMrЮRc֝~=&nt A)˚ ,h[@|C1'_i5-dӼ~Ilf n5jW(aPuWHdcV̖컒B>Ksq)X7<3de)](' /-~ᑲL|&m3Ni#%/=vR83 TWS]@]hVsndľ]sYKG)gx)! 0)b^sTM(f wft+IBKq ~bx,dLukg>eٌ{@~9-xir» C/8\ z*c0X"l_!!m*a7@i2)Y+^̠{z<} gq6Cn DD AE`"fS7mpұa V=Q2ef`0ѯ%wQIV5$(Ca|U+Xeh2+vd\ZDVҷ;Z=(=!)DvRiƣKF dFl(FF8N[8 w|͚Q]-/W5&# xz{쵠 r9NEG/}$ba(G ؍N5Ӣ٢r5a'?RpBHCw59 {GT^+emLhL_xdG (M*+.͡#췖Х3a8%L -ro '0a?`^f+u*f@Vy0@8:OeoUW;1A4_C,$vyfϤ⃏ }'z(欥֫˜ ۀQ+NCy3tl'|EGfJ+{8xGO+o{2ABK(x2B c!ĈfQqFU?G^!EJNOX&~,"OpѿUOZVc\cR< 8Ӿ_E>g>*IU󻛠5ܨi\l|Gmvw&_qd||H(\x$t} 1v(ǭl.CS)UsY-T2ZW |x &A+4î!I.!,e;>fVv ޴j:,cZSq&a&3; j KEgY: Mh)iG4dȋXD]ӣ Ĉ>HSA(U!yqa9^}X dNĴ%QH'PPZUq׻IZA@FeQRM' nV"%z?joh [<^DR as+=g *ҳc,OEiK*& (S's0gv`8'.Z~8HD CyTɵ}V@|iyjHX[&9ucᘳt" P.+^i7q[4$$&(KtBsxq.L=brT*^:,@zӬm\A>_?s!H.C%_k}YAV#NQpFRL gLk/NBRDv#b/|VzӜ.'ǽ4_Ojh!RѬ6<2Y7 S_Ϧxwm~=ܱ7KAh)CejR C埭94+>C ҳ,klAM:yu٣#FL%oG]%-z5!_\jW {.!/JO咧'mYcL 炫asrc[wIxcaϠFs蝔Mm &>Xlχʑ9o~&5ʼH]I%"nǍ  Ǐ\5ݭ #!qya$8$zHHGUVϚ ]Dkb 12q},a6Tf2qz4<r2ڪ;\3}*F}p|ܑjA6Oɐ\7)B!]A&]C EЖͤHA3G;7ʊR¸_hHYqa.s*Űr> "r%owȕc%,QEȢIsh~ cR~h8@3 t.S9RIy/} MKʉ+plN$ϖ% E.%iCWu,>.^FC(5c) fUnmUTꟙh̑IɎ,'YG<<j1ɓEjoUdmr U.>WLz/7ttGGrԦUk)INr3.3,ʄUω=&3Kl-oj4sڿN[&P<9)>mP#/n&,ΐij$xKg &³G0Ƥ? 64naCvֳN)V4m!0Q)Wx#_ߢ8-UwuD\2hn5P^&SB|vmJbeALsм%Gʧ}ձA (_[ s?|ԱRR8A+临' bd UkzQpÖ$V#_&{&@j7&,`lg32&A8yg 8 ^sՏ=^0:@#IMq#zaÔvA3&5AmhR|玗˚n#=->wײ EĺwhR%NHtz`@{Q]]sRjf\k ǹ4\pt(ޞ=9xu͕PĿ6' fp/Մ=+vT{}`kuJ\ !=r)O4'%߈7?=kJ;)uEB=-ZhL(  &~~tnP,IרsQ,q%;c+K&qq0p@,ןDԛT_ʼn.JY7cf7x}f8̨>ռTqD$:0hV}Y@._/0abNdm&q̷51G?*#O1D%ʜƺC]O՚|eb;b$ܧ`C8BZ'jdVݺQÀN9]1l^Rx&N~"#g RUįvhpLwIux¹vCXB19؀N NN"ȗ9F!aW6IjY _}[j[,ɇ1jw(0ܓUZfEqRzG K{4.+<60v>M48_^x0x1SՇ(379)[_e-^M*?."|H׭ɚ"w]oS_$fAaR`~>z0HG~ q[1&Y-Fʢ}Ԃ4o&f<YX$ ArJ5tWmtWWw{顣g_M|<|**a§c4DFGNj_V6jQoZWiN )0\, #V\hsgQ#@CkG&9bwO'ș>hMzqL>ex*KȷpŸM U9H,# ua[Gc/ ;O! U>2!'K"fSC b\wM{*h*[seIg:l~ |sSBT\Ό\7{}GI>3r3k}({m3%°zpDoQT2WN nuanutb@s \K㯃OJV?ذ@lDecC]H_`C؍Up-HP0=Ё]o9ꊅz>~aA*Q3l(!YF%G{+^Z+($E<NЁ2p7)jrD[>ED.q_TR` ԅKyqė;s_A]eU `0vK0#0i*o!PŒ(zY#ØV=)Ĥ&<^.F3Iц>O1jfBl1Hr'; lBťB(xV~pDS zU>h`oJgӵ~<6o b#?q6)A .nAŒT~3Xv 7ͰUl aK.Iئ՟cm'E'{ ;W|dMȧ0*hgDq#B+_b,7bJmNfzBX|2#+nQzsޮՌ0_xrnCcpsnۡiZWM)ұ\GYY6TWjc)cFfAWD{ 0|i7XqT78S!m&fqH3ڃ|덳^Y,Vy"|s*mz f$.(dXJ>=-eOؼRx4-c``hE`322PeKN2h4;;k!1?OWq081qJ8%?*2TZDE]\@ND]Bk\ U^#vӾ-s]ë G@ O.RB= }7^\y/bT=p #U"Qָ*#X9:BӢLqzPp5DV3;:̬B0x6p݊RЄޜ A;kasUoëGLq&KfP&awPD-aWWK֋^ZI|ō? 2I#0i9$Sq,_7|P +KnJ/"A[8GrQkeRN9۽ځb_ ̨|>Cګ6n V=AZk8gݏÞ쨳4B>oZ]2X *Ny5?$83ksiw XR֌ &y[)UkpMI/B_U5DM',tetG+2'mje>_+Lɰsw)Z"I&ZfUNw6y)PYe`SX}?R:ܚI+7& 8qogE+ K׬ɚZ1ހiÐVܔlK!][+ 2~#ql?d|Y,eש@'bCSdꕷC4~ek S|Wm~\1i2#k;3;@uza< Cj@5ov [lskF`z+Ԫ [i&$d!eLINkW5UB ¥ BǵCvMVk3=%{0cOXV66V>eKcKI{9q^q:CM;u(Z N{\Cv~4&r 3xm2t@f;3ng A A֎V܋i|.^يkYϺy<.9+ʁdaF?%>?"(ֱQAQ~za/!47?5XS?PHwU3˜G cԐEZH$HB_y#/2]]כ#؟b KlVܞ۞!^ i%ZYy=>lݮM7q־*g kY&Ăg0ٟE/oFsҖX8 6v Oxz?7#E5ע(xsP_EQɯ3 YP(|5.^ehȁɣGonXVhU/؈.0*{?0< EB P1. }3 h+3D@ JUo$$T)@h" 4a|@)VHs*\=.^IK)0?9`'wکX(eMh~gV9pQyH[_PZz"" w4lrߣ-iv33t%;.f؛k^w3ut R]hYrGp&uZkR#qA A*)1fpo3>+7Fń*<α }-s$qªr{M-u],jgվSU$2JeEśܱ`A0\0c^Wʳ4QIpŰ(ڦIuL^wn8&CďevǧY?ܷ$QV!TT?a8ʺn0UnE,ds.Dy=<*?v^&ZP 4+9TgzPtŋD J8Lޏ`eVŚ΢+ONHOAo)ʁI'_m{ǎ̺Hlg^ (7WܺR/R|]]b\\#t^ lvv4Ųxո|.^jru #~\ߎYF Q:ǹa$K~WnzC!AoWG[?8ڙR*OʻVPYW{=]7V;^K@ }s=ˬ!<Ơ[aKҏ/̹5IT$}Ie`rt%XK\ >14d/H%o7ZH޾x+:: i"WId2Y#epv!,58_,Oʫx&~`B$dړ~]I IW쭝6g& V1*IjUh@^Pz;RXN85N ѣĐ]Q 7 Q؏'8o2̟;4l):!WZFePO܌<+cX8ج6+{69Y| g_$$26En2]Sczۄ+VhTy 3;dx9$nڏ}3f6=9vtswmq'_î<1smf-ǐ2LĕoPՏ8|X%X!+>ceZA2 B'ѻ^ S2#X Uc3ZVO=b]d<",(JQ|EE(JGlǠHd\{ S?6AOJ:_U _i`wo 6gdW`s+/!Ґc}Wwo4T$9D_jPADŖYCd{0cʞ*xQ39"Gs 4r|?9 Mp^ S[@*t\6(j,py2T+'4׬˝{H|0sar9&9{ 0n~<|)?|h~1POĈ8aj8ql+іݞz'O}(D={UQ$4k6E~mAvZU0|l9C[@/c&^p1? !/<a^7P< Է2^>yV0!Kl0LVjOue=y"ŏ=44FIٮ18mvzݓzpZ1'`h!=YؑNA5 ]qG~ԵË &C"iѐx9WEL <z>VpKbd*č!I?1,mgB:vYA:-'A #aP ;İf|[o˦ S>Q0ff߇F%1".c |}huw2ؔΦhSYU{'QT<=r0d'a-D%xrW@ /~ GBHד9i$NNSs΢ߖ =W][\ OA:W?d*"O|Ւ^v}_ ~y.L:ێ )7m& e26S|$ՆH#+jƣZ8JǗ]JGӃ}:LJ@Ew )~mr*Or]?`Qز Ӿ HGo/#HoVbK0X7e(lB<L5B{1VKgJ )QՑ|"hNNxb{VԷ}Irsjr:9\ւ&V[5Axs$'9MoXZvs0yh>P:T|[^`*bỳwՂ=M .hr,JԢ$`>y#nqʐ|BHC_>y7 ww .lYf!lհREavdI98uنbJ}*?zOssAO;|~%84. L\^>faK]%4L% i12-pvI}MF4.Q3@o ՎŒ=;sh}",>f^6uW|eJ$3b[Tdzw5fLS ˽gIA:K3i|`;+mF)&/DoFf~OpĜ"~\ RDHCŅeΘ4 /~`(QdEZxsRRCa%xG/c@l`W~8ϫl_ypQsd ̈́*&:HShI:=x+g^edC,^d7+AP9jgUr"8- |C[E/`zУONZG6㈦ 2vp`LrЬFIt\G#n J[ƞ6Tg!C5~n d닾@=U:,\WGG3)|լ4Y<70 [!_o ďBosڂ[:LaD4Lo;>--wJ"Y_f VN&1y'f OB _y3s Bm@}v( p>>WGM[1q+nd) x/CC"=1\5]=iϿ,S}<MI ěCݚaP]_G-Wx[F^b6ܬd@EOIDKxOm<:>q:@'NiS*P`irw#磲Uyy@eicpudujT_ږV_%Ƒѿ3YAVP:!AHr%zxѭj:!`O5>zHhП+~> mZR7/s-S~}"o=9wny.ٍ?s3RA *;.P{^*ȗZ'\CN 6Hϱ%;Q~K n×!iUskD5~ѧ@ۮ-1ǎ^RK I/ L/\(+zݧDH7oxʣ1P^mRaV1"! >,㷬 mYί_ggjבѡ@ dW_Yx _3aY6=(@}E"n0iPW`Cw⊡]"\W5|enx1ōSD dR""\pcQB!a+՞F)"0Q(>~mI?b%vү#8:S}BCOe0u>>huj>yu1+֨{3x2h@fW}qƙSgSxki+ZIVF5>lU{GZfW)dU0MOgXl!Ӵ)vni7qXchV(!n0~De/9b)m >vpHxFAlT!46C’W%k3Q F܀NKĴ0|b9~7>a2=Wu,k*4'm v;?iEctE8n +L5D pG]')~l?_u"@o 0wAβ^CIf7U6/\M}0t8[($aN:ֳG-/Qds6f[ ކh e:~M*o\3SAMue᧬2TN4ۄcV:rưK,ZW Lra'83ATOD S*'#$8{hygЌM{Uyf@k5LeA ш)Xbc1[Rִ 2SOhq;k2٢jj$w!h+2@~!"u] ٙk|xL߸`P?Dj0okZ|4@Nd#vrekP~_{z> 4b%F8K:ͺ9T8@W?"p` #?Vb%(7ܷ]pxA{;;OwU`2X4,0iӜ?YYU+%=l&vR' kc'F1sQ cYslDIqK9X'$(%w-zm aQ2t(iY.D&C?"_̩.em^tKyрn7,౛C+2QNk|cKij!q߾M `Н-L7s:]_) uܴZH'J6ю`kk+/G{eB^ p g {ĽiUme| ^&iei4OmТg?bFb9<ƶl[+HQr޼MǢ?x3sk_ˢęUbG\ݷ|N@O7 nK:gvezV/0x 'GŋÏW.zLCԇDhr0Eq6J R=E>dϝ)͌A<rPW;-Tx9jYâ(5!01 [_ CeQgݖpGA9JP}®vc`0D)^ڐf,?| 30l9wO3X~~b (fc3ٚƁ/l[y7@ ]oJA^UEx28ĦBVqvڲkp8l#DvTZn0UR6xE'{?YI9M׺/ Yl)%Ì]7fd)^F^J#{qQ_"EH7αӉ $3V߄{3 %vI1xK@!]Hr[;( nupE* 3̈́X$>!/,Vtߵ&k*&]I$΢th!:GH}CƟ?L`'B)ihdg8ܫ Ӑw`Ս TpCCri3 ]y#1X~j '2!"&4PXÛXz&~06t+Vcpv6լˢy?h5@$ `,n kj&Q5"G|;Eݏ0O^-Im`7 9ru{5W3Y{1l }G}j`Oo J迍.#e&ڈy{mx`֣˝coTZLQm[q}V ˆ4^78c!zѲZ LtO"1dKzsY+ɋ7*QQr= <i? ?ј%\{:F{zdFh:.QJB*&OTio&,`f8[ّ)wo{UJtJ.g5yP@<,/ΓG3wjT }((h64@(uM:ZsHu<4!Kk[=^x.@+Ȝ@EHH=A ŰMk"+Fojߡm_^SӘ ޻O1ڋmywfcҧ> µS-8B`KF[Wg/ ~!9^MY՞~"|U.x د6٨I}|8> m\(X9wqOCB!D=|8OXdy]hvY \n~S$Rds":tOͧ>Pmt ؠ{K&*L=i_v<p1hg NmU(OiR"^P˵}џ6aWËM}T[>_6:tBM.hHLtf"ݹh&-[5+ϓX扃ujkd 7`݌,kojscɇgHj!r%Ax.b qutrx0&sDrWR {V=몌E9"sp`dY~OAr3/d A6HZqث9~g kIU ra2^v 5plm 8Py$pIT?CyBp8 M,~EF!O@}/l=#ۅ=83uWl2cΘi-mCIPz^̐R)TJPD\T!Q'D5߶^iek4 +UlR cr Kx"cXQcsP4}1\.׌b! K|_ev%H1}!  vb/?gEcR꧄VvBA8 ZX?St:^ܹd"l4N__Hbd]mbVr>)O={v{}:ц&dvx)Zy2/!]G@)(AWl|25=c7 \ZSv6&5F7ꐆvUO86#B>Y2D3Vnj&49۹.[|wzU',Ȃ`2,,^-pS75&nLb ,HpxD ?TAS),5c(]o:W]q(>!p GhaqEڷw& MHnJK ,x1% u͞9$wxAc{K_o vMS"P?k3dU.TwVM1?!܍Z^)[\EGQD^''p,쨼 iA8J[>@,p0A&/!Y:ZC *{֕m(6ңz;DZygYֻ`Y<[:AR 5\9{kރk@@av维*e:5"{l>TlQԛ8е_+!!^rN!o(1j|jDA,}%u-Z?lF@#7w&+5 [I)[;OLq a@c|(k+dL(-g]%OO]< |J B pEAVǠD5 jO(Ҿ0Q9S#))1 _*:(K\z_{wcZw}yz*6-X umϛ}`xe^(q;;&աx P"3-~(i;Dkг( 0_lt4`l(/ٮn(/1,-Zoh1Mu3K=GdzjĀuR8d·Vx}@rs"L~d?a)}hݰBE(>,[M_ޭw^Y.AxlPKZ—"fŁABfJVFؕw ޳ ^|ܮܚMTr R5|oh?ߠ4˳;ֶ&ҵK)l-7=n#.vb3DOͬx3@{aY:mV(jM-( ܔ=ߜc o %< M4s7LPOxڞ￶6˵a iZ|r=C(bOH"Ś<ڙK5iŽwPC̗10ݱ :[te52SAY-r[_n{pɫ: ̴lS>)r,縢`=Ul#VhAX{Lp{QLne_Ơ.mqlLӊ/fٳRL:[~غݯ̿[uHTWPF $Ä|fc~{q?v=8zmXuLq:fTb">8+d] #ZK[HOj 8a$BfD:>)> 0L9~1砒P j*],- է6iilJ x.M4'u0<&#{&e-K#oE-]<ɘS &۵Y.w9aާx۠pUCTX`փxu_T/p"^"7Ds u[!'w\Sb87S㯱m4%@P##[x<"0l^>j'gw4uwM/J#f` _HYAO>CQ9[Q` 5[%!,?6:EV_Npt/:|:2:(p6NS[i/,h %FhuƣTl>>uۙ2xhqqcM'pU[mvC1)V@7|9_b^ѠIl:vu5T$bDBwe r^j A?b{wt ߫+/Z㖪%'Eh,)0@H\-e5vzb $,TC466nU TaU:ߦ Y8(:V-1zL -0f!QM.g|T6lOӞ4Q޺ۄ^^mK TFsvt,LN'u== Vd*يID2e9c3"B2N߃Fʌks_nzҹ֙|¯K*5^E>;V@DXRV?:ys>ePkb"*mwTFʴG,B[lwiл MK2_Q,cG.evydk'lڸ"C"yc鐴>TGU49oٔq)Khe&˦6nl8a*W6Qw玔=Sj1JTAPr(؀{oLNs~nhRE`\<`;Y^6u9}c 4,-Eg͇s [F׬VP^|+PCv01 sNoҙ+9 1oJe5`ҿţoܴ;<+ >g@m~ޅ+ԃ3 K*r&4ܢ?"&ֈ,ެ|5A追kkden"+WQ Ŷ;}E1COiY.E-ݩ{5:)2@PG{XR A QLj~a5+ ()zTmEz^ hq(?I+>"ZWbPƮrg;)J11e=|2*_ъz(2g{ ']ZW˦MٝLAHW)%HP~`}?0_ -o5hїʗL lT'Xsجc@Ze?v[(WTԄU@h&tǴ NwTG}_SiF3g2Ո7xnCxm@l+6]_'<~ xlEطÍG |sXo-H [(RH#nV{s Ab;j=$-,Wr bΑjN!F|?(.LfH" Vop0٢Z뜑ن]4ε~( iE)-@ר4׶ =w{m{pz\{Hc$ PK!7ee~/f.&itjgeDS`:/YIrDAOjBVmpp1N7g$aV ƪn)Ṇ;-J%ָAcBq?]XBHθg .s`HŞ M *5%wXœ)ay @2k1, IAd2.[&z8, g Da~,/:oLmg3,\Le]Xҹ="Ku1L]C6Qcfax׏H8 42zM?|0Y@AI+<^w6рDUK@0aO=< K p%iܐJOB*xw)-_3oiU:&[{8D*H-{"O& B'UƬZ_6At (sǙ:8¢_x { ̆0UG4ǝ90 X7ې3{U%a Q0P粷i1zIE//SnxN)ߊVA;fi%P}t;kQh-D`Us:_R {~u=b`R=`HQQ%q|нe7M;2CWKAA~_494wB2WD rҶ\X@l*l<3H| o M}{LS_&ö7?.Whap0x +Ym~!5.KヒS KxpP 13EMWD"4l#{?oPi92Y u0/r!de%p_DG,,2?"`ީ4Sip ȧt2sil`E)e o`+'j(S%Va(} $|V3zgw/h6+5}ۧpp4șDZJjJm-vCPGFWV}AN\]Oߠg?b튁5N6TBbo*'D& [\|4uM7ퟝ6?Xf;y;XE}\|bfK5}:p~AS)97{j,"}*Hg {[34d3J4w.e( Iís5A  c7DXR#F9adͮ EjʧК_qWʇ"|gV1ʼn]ʠcʅ ^YKwGmx~1/,f;~ viDtuzygl4(qAEO G 6$|igs:@v{gnL#.r|Q1 |Ż1uX&R8}(8O0'4$@\ezfrQw;Ta E~Adr!#(xĝ2[)1 5|_roΟ/O =*nk98f1B aT,;-m/*ZJEA!z4)jV.*򚫺PĉE9kHwԞ{vʑL'R.Ew=kn*49 y~Bka[n]k9Fe:acuKzr) #5'{anKx+pCd3Q=,ffw߽R$\lf@n +zUp3FEr_ qrT/l{dͫx͇:̸壆-_%\t+`g:u<}[>0/Vk8l00)-SX)ws|Xo `>Q>I*)(>]C&M뜭ѻ(fO窩]i?7VCHC642BHPnT?_x5B$5H*O4gHsLp/q sn@ =CRf(Z_w?ySoa܋UlpON`rm uxXu-13W+dSc8b AT0+pq (/ $SP+NU韁gkX ) ~7o'{ oѬo7$zOPDK0P{48,h hXWu{T(?dӒ( ]Ƕm۶m۶m۶m۶m{挙!]{/3',Qu!qw-БtheaF4/'fKC'(ρ~;߼`!$B^I vUJZrPReM81y/_EzU|@ﱜb$C'G~NoÂLͭcsph0'Lqj7fe묱XM#[c;u?Wdӌ8RoL2</;CIyU3*Dg?#ZwQ%{ XfQ4Ʌ3(]鶑?Z%P{5yt3q.?"_&j'jUҮЕ)%. Q1]Y0)O^q#qD$ !O7 e!YnGii}( nÌ{'2Sw֛&>G:;8 *] ?-, L\iH헫nz;:7RGNSH vM/;i\,wTRIz\ʅ:U`1NJ!vXEPy0gpη7M\-: Z'@h1Ԣ uNoدğΟ1o,G,`s=O/V@)Lʽ΀2hz?KFB,zR(Z.Vr_)e3X{u נO#hgV,]6Hvd2N"Pu9~ׯɨ-\=;[g%U=ѝbh9f fJ2L9$9Vd[~yQn52¨d[&S(x=nyTd%:BQQc,B?O9_: u͢ݝ{Ios+DUFC &IRK)]PHfj6Ug(@{r^S,y[0-Ɇ}6CVn&ѱ,JMl1J=~nCEGZi{R{m \ X¡o#:O!ܼ#؛S4!)&]K^A W'DkUw0nVPR~ǒ=Hܣ3:џiҍag %6 BwD#щvF%*tG^^y͉KxLHP-CtTð)u V3ߵu,<@t)`'-IL-z4))0d\ׂ&Hpv-zezVB~m"C]-nOK0FY{u94֪wr2+.&a"Lã!% 9@ew]ptҵzΏ۳\" `t@/;ٍ?OKh-K(M Jvj2c+6,LrifOaFe (2Qꌢ5vo&[[@>ŞTB0]޸xuS@S !M5NZ1'{x?mf}TQR`Y^Y\ÃpHCgV0!qT 3sru2ZQDO˗`}AՍw}D䬜yiͱ*CTbbL^eKU;FgOvY}/5$n o3|P%Gٟ:Au8,TLG2Bz!%43eAo`UH$˭ U5k1L.`}+Q$$pS hIt_,m]D`rQ#Yӻ3^0:HQ́Uɾ}OSؾi1{s^v*^}h}(IØ|ذlMh@5 3vDW4txC"g?v5ěaNzKspۄu.'ܳ e.`򿴦J0SaK8[گO΋р%gE|s ,:1k}H9%Gq/QXN>4=p."6  XL19.?@&zQXٰ:#GGI.tkgd 67^y%yh q(W;xN, XMVb#BX<=&L&Fpuf,Zѥ3loGpd7Y;hvaϬpJwHG>Rᰚ*4`SCԥc"1Xw'BYP/aXbtYrl#AI( >-Q ˭Iy& VôiVuwJ-ԆRWR,8I8-aW1gb!iiØA >kOBds( yޞr@ww):jחRGn)/PD+ Ҷ< El`ڈCMP."G y%wam!$_$!m}@Q DZF \;ɤ"Yˇ1L~ /G%v gfG1Չ2[βH}RM6di,F/YPoNc:OZ%O}Ntf l&%Wa:2{*JC7ٗTZM֞cFHЯw)d9R2~H>6< v $S_Vz/jBM!lͲb؍3}>(-P|5XgK"?GZ=ʫXVvjT/z{q!ALj\^mu {!#]A?I^K<2ȗkWKGz:{*օ:`j\h4۷EtteAt}Wfmc4a^3Age6V|gp HH j$ΏtQ0L. eqb;Ձ)}S!Q7䗤Pm\--JvXY4SNXc697UltO3x Yf\Eƿ4l{X[g5@S9Zܵ 'vde6%-w@z xViTKª݄|4 +$^'$6={3g̬4"T,W%iuAJHl ij S&P2(-NcF˨" BnKݤF097?=rxҸouW ڒsMIrA2p!"Ga`3^EoRHH |_$Poo/4k0kBR"̓P0rk}%yuBz%U6'j1~*&|ff0_BWp3̋Go*o{)o l˴6m{] ,=r(1wTnѥVjeV+%fi4"#HB^B%-h:^oDuև>7U`%0o kVx-AztpMMtI%_ S(ܪ0cHPcM(|al.-.L6C&Xg{ڣ zzlO$㸭V&$m+Q65UdRK02u)&|S6{ɨ-: v.z.,궱xSZ M%p ,A |OxV50?r눟SƑH/zW3h(>"PӞ08Yυ(ݩRng ԡj ?v=@^pÚBv^l;6#9}>+,SyS.'"?LU*]PO~eq)HԔֈvFZfnosoKl>Zjf /XgM#9,ePDOmZsO LR9#&S9y$t_&,NِИA:3W/z9u_"O5冰6n)OW{~l>Hs.?ywMN_y@!L8^ۊ"K~q nO}/Aҩ*"ͪ@}L덋ܕu=/uƖ-h.{9B`Vy>یϟnT!u}h*? O_4{u-loq6^ݗ2;!ʃ .pc$ڞ_T8#ݪix4ײjnwCصpOklbmWu[o +]b暃+2ϴ٦gs~HMdW~>Q>|E1¥;x mȼ V8 a{45Ԑ&Xv9la#KrJ{\1~_[NF֗XhPkWX2-B@|JfwL`Pw_(Y TV(b f"$~9) >K4\RZd̦tgUk5%]=۶&8!Z ?*jžFm9 Z#8E,=߱u+521 @5,ØG Qv硲&=<튩&P_OР%#0u#^6I0Cv S[rG 6ㅶ3D3d;Y˜S iFPʹ^~ 7#cL-:^`5JK^j[WI4_Lx'{c`hXV/q%̟(*I:jnx`&_ xNDM "HͪbɥLr/b#3$YP0B6^T5.9,kWO\Aٶes9H kySr_9J@SE%'8zݠNpW` Hs`XC9 :CsC>1?%v1ɫ֑fNru]^W#{:RWe/?nŨ'7t;5sf|swD*a UY0 xTa,2}tQMRB=JU{h̯AY)^ &,L;^* 5@։4$hg TRTK`5NKpPa+Wi>MЂ@t+5eUH)(5US1r氊'kj} e 8.pєg3s8Cų]l&g@=mWih_דΫKzlՁ8S~MhKn_;v;%&S&+ FR9}fе$ ؘ-k!G?/F/ʎaWb-w&ʗ :*C"L[nH{?su6Y>3N^$,55BJYf0-Ȭ "j `2`R8u"0Xf 4J86E? v8ѵD f1#࿇24:Q&Ũ)yj>@ R7PF另'Ꮯ-ezTofmHMA]}KmN%Q3 Q|0B]kg,PyĬ0 qM NÐ yE@|+OyLwX[4wVB} ?TI4%Sm'0eScݼ ^ ܍hИjQ >D9Ji:b|eHۯ1ӌ(53{/KaiInh3oȪV52"]jczKf9 &/9-ͣ}`LDK♪xzO~g"cBLE4|ҍ)j$Jzp>gշn|=7]#}ڄj2)@JʩQ3$AnJ| AW.Tb 1%W4sc!ai1ኆjRd;'.µ@usэ{ *3ۉP̉݃;Ӥ4ik^RyIkqI-uz1a!UϞѯg]rQ'[6HUzf|GZn0tSP19@!ΈrܻEgdS۽wQLSo 2fݱ`Rqtj^_;|mǀC%":uCwI EVsS7e>dvZyLYN 0f.70.QhAQgF@l'Ƚ/֝9Ԣ錢;n9#U-ZRwA 3AAmb9B 7(%=VZ9mT4)cQ1ܧ{&v*T`qs6ymHkK-!b݅e`oixV6`%bFf' L-V'Xj.U"Saԩ;d .B_Զ 7%(p{͂gȘkM^@9SAe¥+g(b1GI,(>AL.Q^w_UB8uSR#YtT6XOUpy T yk^ne1]|2!>^($u{YnwOug>)} Edz[ܑ$ wIDt|ivtծq*fEp6AܩJ30s5:caU 8}£C$[7 b<wmW߭O9C ?ӣYUϚFk :L0,$#3ySՎsKt^-o) BjGo9HU2gcМx|j^1Vcr)$\ Y&`ڿP+I8]{'nnezvS]kOrO N3~[JqyQba8nF[OV>N)kFX7\z*CeEAgbC 4H&\r:>2|z9z6yQV4DJ@; #%$| 7v҄i .:iƐxz =yK{ wE;M"FٻԞhZ/Q}\\vr9w`%Al;qؘu㓞%+!*W2~"D}XMv#Na̓PJPL*jNvc芇b QlR#/29d9YꈰFC}3 z4gƟHE|+dq9{U />1oP 71VX'v-­`@voqѯlʞŷ8kUhWP߰JXcE{(\G݁8}+_ ;@d)2Xѕp>)g~^_GC cT8Irૂ;xDm٬)*;=<; sha49 dS͂ќzklwokzab x TY<$8lenZSaRY.1/xUd1xBee 7e6Cų㝪$$JAR3-ERA.>2G+R͕^eأ),x{Y6)rFwrmm]? l k7X7d;('qJ ND;1kl̇aέn% 8(Sf)^F?CݟliKdSlvj!/Δ%ZwKAFP~JB 2Ǧ@1^fͧ3xJ&tvJuHWCl,o`됊YDduy ᰿-]l#rz=F}8VĀ/Hr lP˓0ӵ^ߎZSTC35OVVrʣQy6%|,|\3l e^ 8{w[t6;xRS~S XB\!HqC [q`N Ogni;`PGgT0G܍kMWKlDѽ~0Z!#Xu!˚;"(EtԂY>GU)zculdfܦe'C,eQ&7TY}©4:~4 "ES/x|ܧIr+ZQkjh=/w=ؕ[@#|>N:. ˳^|\W?(w[3v%DYX \*i27N:J sXi9N%=+/&ؔt̯׭(K .$swΦM G O#_, ř@+Ez.`+UK)P{ 4`ZLEV:M Q@r`fO;ߞ.T*P9RJ2w4m: 7Z:f1*ۊ`\8iiGew@R}(b=Vu\5g[ۼZ1\FNϤ[f~yFJE̔ Zy fn5~])imt)}uXhz S; yHqjѕvx BG+VN ıEMG8NF !r>x{&_&u:]'E^a@M_q!$' qͿ.Lfz"h{/bf ļYcTyVL'63y8ciׁ25j&)Sx,[Y̼U;/i|v \o5j]_4EX֖˥r!oZ5؉%T<A tIOD[Pe$| n)಼>-:NS@Wt㶊 .u})v8@jLMKjMSjRSaͦ(ni3F[Y6lH`I^yY.kBQ_l.X =Q%`KB0m {2#+ݨߥ*" "&.*;t ;3) ”ٮ hg̛u/[~gNwfL8wv|w Q'Ñ6ګaRІ-N!]3뎝,cud'#,FAsP׷T&d@!7yJkA!O4ظ Z_.O9ٚV&]V~ Wkڗyw+EA ԄǕթAAᜳ'[=u6, +<9؄DYU>C]_8M"Y&]CfndG(<"3 6ł-dqlJe~JF /9a[CۮkdnN=|VJY2UًN Na4{L NE2nVi`4k-H;ljf0g &KސqdW>d{niܝ\uIDŽx*qRqU\ʇ}΅o7:@Fa~j. %7'3NLXLMmb`2+E}qb2pSwX@,Z!?!5H;9- Ka|>l`f8H@EU8Gn_A ?MFź:}c:M˹e'/^Aæ6ß,)/`T0h"8?iDy8FO6"W $Hc޾nm頃Xzc)0 -nʳo_y9%Rw!"f+# a1b Jj+q zzO6wòtS{ՒN Cl>Ro{DwGe>ubfo9 XyٜLE(Py"|τbC6dx$_h,'QW5/mu8LGU7@ԑjy ~zM0ϒ\M_%2 K{%x6idUp_)Ѭc>?n[и`"A oEe.N059-^ELm8VUYP=,щ%Ϳ xFxzY~"KGv ^.+m&]kH1^ͳ{l:x[dӔz&ŋ.Q4-hrfVih؞8_D|VχޑA)]Զ,:ZQ^8fMNB7v"V|ܽM .r)\d8!*8SQ966"l2DANhC ̼_?""IAUv(FFL?aCW}aFPHLI=r(eXOUYR#2 ,SAĸ~c(:ccL^[欺2)TJ;jЊbe#췶#y;+٬ D ߣll֥b !Rn-L`(lS;_} F>02oRjBo=6D/L|NQxW вDo w2Y0dN^ <NLbI;]P5K0m9 {&_\BszHz<&5MxnŔ.nP}#J:z ax[ozݢj^ K# +`5c]hn"C³7z9[UsNs8["}(蝬غv3|okǟ/{j'T fe-{bu|h\/?+ z]}vЇzmIhJ`6~qԅ?׵݀.~F?0>>pjg ; T;xdH8Wun}T$bew)ft߉cM~G=Gß1íY~' o., Jb~TI0eU!]t\zVZdL/HҗDDsm+3@ Ceʽ.sq` (v;PжK=?rB&㯨Rŗ%dke;SGŊwSZeY baM2Y~Q":U gӿAZ<j^=J<1[)+&#~4à XUjQV"=MϜ9D 2Iڝ0h}1ᙽ/۾P5DUn-ht_KRqp^p{I%?,ykϙI2JfQ> QTyk{]{]L.r2Y[*^B£oa/MͶ+^<ˉ!YUlկ>C|F;`ި$R""~Rߋ}E~yث?L l yN ǜz8"`#ʙ؆~Pgitp@:zx(91ZzaX=a ώEgo H0_P* 1-sPy>]M 3q|T>phI+5\JdD:iJz-'?l/] n>(dDaC1qO7w+b Xߍ!n2:ykbՍ\']bT!mUs"}vЄWCAIk,AtljZFu#I 2,@IMДNTZҢ΢38┹<@MSd^i"m'QxB~F_+ʹdjנ$ƞt)œ%v!)j`5I Vu#.yĶ} >QY݈3R@QX: c,~]HWQ4~s^4v8/D|FcJ!'&Y g/:)vGv>B(YupW,%{δ*ybt{o3;iV/%}A ]=exmqˈN.P\r.1; v zɂ-s61MMo*(h̊&ڔW} =/s̫pN:Qt4\fP4aҨypDWktXOSM߈R"-O]kO៾t _Qh)4iG |8wzn':Ô JQdLPoaw,^EZWB8s$t83^Nɥ{mdX`#Sˍ;\FBC "GtG(윽fſ8N]'n}EzEݦ٢ߟt P/aG&GZ:6[:r}.UO%L/?DXguVKѺ>|*D!G}Hw-14ԇ1(a jU__@C,<%IQ!Oh?S]<"KN0K$C |iܐ@Ւ'N9֞o:YޱYl:4z]|~*"*Ddn5jj1D]Oi" > _~Ϛ69oլD+Ex4qa 4a$#7/]IgZNnc,, [JDzљ~*P`I@}᤼\iE MfW\8+ڎHfϵ)뙓)[fMKY(.ZH!2Ͼm9׋?pQ5Rư+p)ҨI gwYƳ%Sx<,LWJ~;ވuLbEҪ-/)`b eU#r㢠ZuDʤ>Y\X;r3mB6܁]\ioBxv|N (4ֶl֒$=4W9rRI%Y$ss^v'V:A{op^0 O^vy$}ytNǎ̡=TSdiTcwMPE*ZݖhaN}fF`eےe8 uSYDW- p{Ӗ~]Z@PW ;@SCQ>dB| {d)i=l hO]-C$UrqʓF)" _SUݼqeKTl7uca+oA꼰JU;XYCOo:V4!!)$9!;=.9|܎x㷧c\;}?jYC"vN//Ck:%ӬG|`&z|H`wnkrhOH$ <6J6v*n2ǜ@㑨)vp44HZ/ܰl^\c5#th2+wa @lʼn=e _slEsx 6UZH~2M73h5h򤾾B% ߥ$c=*p{GgM〜\ֿ:HmGm71CfjڞBn)ޑg!!tINo78wzYjQ8Ht'H(}zFqt$=8K"YA0dBh BStP#e-2#߈ls,~w²8j+d^19xVCϘQmd?/ƐOf`WPg-ZcP h BDn\(-Ҳu ՑDoʄTqx|#XHP'8oۊ5˞V&迃N--8́a4QY^{6nɩ&^CkD*?m{R e8hvI =aHq'~* E'fKȪe7᭍G 嚿kڨkCj#IW*6 RvIKǭ޶\b]nQ?KǛDߜvoԥRy*Pk>>Ergބ̎tUhʱK2>B_1-e>AM$% .ӫDKK u݀+0=8_#^(d`&0 .kL4 @m>)%z |Z2 'pd$•m^ov%?πWm A?WY*D;"Yg 7ohC/qMϘ>vvk8ZbJĠ(/Lz9a;d1}\ %`/5+ LSJ̮-DQ5`d}!Í\l"n:@,ayA'R"qH?nU٘G%Z]t qrE}"|*',jC[;Hzp 9xʏ,O gu11Y0gk 1C4ONV .{(IgܒV!$hTF>/{bC5t' V[.2*s^'6Y.]2E4}&2,B'"|%UOT,oCj(6w 9QE3DfOb1KԬ}1:WQT0Aɐ@R:|柎c'8$Wb qJ4LseO#'dBON]ȥP/ RAN,xQV5>zJYM ѹ/ N8׼maK)\&nf|GdGpH@름׬oV'~]Z/6wi1Eۃ2q~N+n$Vwe >oY'sP$a5D=V E^u+ W@F?Q4ۨ]1(v^rǏ-Ii] CI6!>J2XT%~Јbb% ,Pfl8N߶[,$Y׹-FDpQNJ1D ;'q脭xW=KqnAֽ0t"&)@Xc_ab {~ 3;3xb_ȫoHA$Ne2MKQ&ȼTԺ!0MrBBW$R60Dbح{V9' l9 v,8HP Ώ1_'8ctk G`w}6EA1+ݪH{r-DI7i 9.^1I FzRS>t;Q}`=RqjؾR)@H a+!H6Ė蚴M- EVaT+1br@:-NТCA1@WdO%<(??tXX@Pnz_g>"MlrI^sZ'OLl{Y%t,@\Zu?\7)7y41Ȯ P.m('VFEn{ڊ|Og~iD]}t:x7l L~icqA9XE=~zYeqvb"4HpyK3d fZםEEYUwv_$  ⭧}Rs 8y+ %yX0ki3~2WpqԳ$ :8"-؇UU9PljLshv^+Mتg㎁ɦM=ϐ;[Aa;pxfrbK 5PF9;90"pͫ4FH"]n:xzK^Up샀{` <$Ho\bF<׿(ok)o_]N,"Kw[Qb vJt9E~a߻x+30FKzyFP^+xXGG >wMm "hȾAmދ$\fVUpoLR)s&9JɁ~ ɬ'IM?\1iq.g͖PLbP3(=[_2%{wg !m9o+ph̐9դlGO:^KKaМPo͋ FI85imUpY|dFfAt~5>Oߗoygץgrښ20dmkFB_+ L77&,# Cc?BK;N˥܌RP&@>5M4B-Nn(sN ,r0 #9̜ItS amĢ@2gߌm~;_r<)v_?ʶ䯠'EY)OAYpSKCC9WxE^Cur3{VRNz3گڛb8L.au+=Xm>LӁyĮe@Fq./**];"2acqsI-6"+FٟSh &eB=!1N]`ڈ1Caݜf*Y !sjuMd], њ7Ғp@REBh!#&<)QlKߌ[! ̐+P~%)l` w]ܤLā?O"~Ϥ w0  S_kJ3z qجRa9i} Q吁Ŏy.[дGⴴrf<4AϞH\+xS'=qٚ-]U9FO7<& 8&?lFjQ"&qD3lLn[~&!mbBRm\&oN7*$2)fPF bsRILv%M2Dbݞ}oIs/%B ok诜b?Ux4g%U#P26vl @~ɓ{(\H@d@J&N!Z,^$~n)͌TpgФ2Yxz@$Qӧ}n!p1&@Y[1C/obV,fK8|GrA`^0ɮ3E=I!ѬF=n/DBgCge\RSs ^U ff`ڔM}4U׼*>in7RS^@? ؉xg 3 _å&IH&ZA:%k {}VpH)sW Ú ˎ'6dGEUl]ޟ=?*sr+wYkrJ<>2vC"/|3t5~aZS ovIKġ,/wԩcqΰHśJ9#4O+ r!q?bHiB/i&&ך~G&Qǵ`8a >PANU'o+ ZK5#Cӵ)nw=ݨ7.F(^$=;G`tCh.g@;cD f?Yx(ӗ~2i1yڼC PBbEj! PNQGPﶻ8ĭ+`PǟL0M1wp;Dʂ8TlV$rG֡h@ts%YV#& Uzty0qߡL 4 hM8 Zm*<%Y5@>O:dӊ4W׹K. QX;en@"ВlxPNeAzKZ03*a=\*0ľP'шUSHAc窹>JkKQ|G]ndlpK}k,:;.!$r42~Wl;MQMH$́I,X%AŸAT!dpy\gunM&g΁Rki*XzWKm$z!ON;w&nU՚j,L2KXq햰DUGs@fse]7_U endstream endobj 359 0 obj << /Length1 1756 /Length2 102004 /Length3 0 /Length 102120 /Filter /FlateDecode >> stream xڤf[-Yi۶m۶mvm۶W}Nj⋘Zcb9+:0sK[J[8:[ؚ( 22C([8[.-pB&V ele\Y98Y<00hȉ/hglbkkb E"dghafw*we77ŗ7-_w56q  __Oh#['' #&/O.fbkh`/bhmaO$x2q72r/>?s43'7wv礣+_+N&'陨[-ߖo2;UVZ_gddoKS͟9A1[9YBJ2ΎZ c;[kؘөʫ)Q.saggħabdge`cgg`_I.akjʍ]Y?tO)=_HTse YϚ'˿]75EWF97}/Kx(ݴ?xi0ibmToSsZPE l,=u;I8K_c$jnb,ol9k'?,摆?-lMQ*9郁6rqts=|nj>w#%;#`Z,7I=fi0T^]$1 aPn׶0Ep$*:0 ltd Ev'rZMqj:+ H\ׄ3vF8/RaIApә UK]ԗ rDo&+6nM4>HƷ<)쏗7=րM; !gCi#&FޙqM,E8HF|4q"]HUK>#W鐨fUk$#g;` *cie5c%u!OY.fd6+u#5X-QDIɫ|󘖯6)XJ%4l=G0apfx]#!im 91' ԇaѨL^?O!G}<Ȅvkd\LjeOgVuVs31n| (mS#<,{"ћZkto4ͬ@E+'h-35_u"%]` M&9mQW8Aâo(+:4H OHFc J"pN^"%ի|L;,ݔ~pk$aXn͖h{I'>\|., n{qCgmWF j++jQґiVwG*zGjUBIwH"Jd{>B]G7tFiƛzp裛9LnP/ )}?(IW[.+-Ձ}sBQ<H2oR#ԳѴf?-ICeZoJ;r6C:RFBn ݋g byB#F"47$~(WjU,d,7'qH=$J`w=;va 'H5 B.C h mWcLz/||f; ^^D}gϮSX1Z_ 5)WR@0*s'8Z dCR.$sB3PiDcQӪ &%zwc3M_&KaV"o32cl"%- zeReiLHmksF&%LVK2`w1u(6~V^@jip-4 ip|9i}cyb7{R!a&+:ShQ-H>?vKs6QbRG~ˀZό& ^E9nUNO߼b#r3?y;; דiGݴ.gk! ؟)1ګ71Q8aU>3D B+).C}| &JXvl;[>< [`aHT2;^/l7m?YT왞SMVFaP Dܲ+XKg5j~- u\ 2j ln>*9Ɖ&O@V/ 7;vmN{Nq61#}-r @lWhWZ-*eON2-O B%ŀ l&ey2pݧδ.g -i_Hfш͐ΤS;hXQ/܂=F%"in+;( o(J6j4i2̢RN%yQUS(7J,gli_vfD)mb T>?tD/K wA 9D;>&5.P6 cSX t❭]HGIMYP7Nc0!ڄ"p_=iGbo&jpABPpUmWl—9"dj3L++&MwTDtO; 5EԞ5i"C7u号$^ amhL{Q352ߘo94G9ƿ$(Jk X;@wZל.0aj/(`Z̎yq+1yր-ߩyih&ioT%jtOXC!* @:;ywv}prlђ8Ƅ#ƧF7u%rĒ7sޛm{ d8WR,vp0|md4Rg4ftћ 7Rigʺ#?f5^D4e-Uڿիfy&775w1uǨT'SfϜ{ժ!H{tq/4rOܓtfus g|Zv DzLcmɥFs+cr)A<]8O3zL`υSцzmmh$ _4mq}M @_N9v!XgyZNt W,՘=tE;hT Sҗe>qNcbTZQ'X4#S}zɷDj#DʔIfV\xUzBZٝbݦ /vQI^Ο`5% rzaqdF_1H9$1W^@!{iF~4bd8:!".U&=a3Q^Kh̚<~mR H&sWY? 3=$ &1Όf|K rJbiDM@+gx)`!S4}ZˉdejܼjGM<|ONj*YUB0l 2 %z![eLWZNOY_F 6[;{0 1&_s2.r.! |ԘRpN9fm`bkc P,ODsi|垓p+9!h1m$0E_t?E~^V+?E6voe,{Ӄ˩ HILGr{yqyƒ6b5a\vG6߲GгTo\}Űv\66s9M)=zy ׮!5%C߉8)+(u9~iU#l:rE^&#e [hsޤS?rjmDq=HhhGE sE~t Wvз0sIBu>jj9Q-1}ܕvqQ9=e'G#w;庾ÇÔZ- "7li" &rp5l9Gj}&8>4p7ixM#h VPR=rfl|='ǯKǹiI~֠iPiThaHFV*2*rx9Gj榭>b9l8.}0XߦH8Yebp_|n1-Il\hȧa8/&ͨsPϦtg_2&NyD,ǯLF:َt1R+2]ΡX 8 ?*i!l'$4K@jbO%o,sN"[FԈGIKπ혩eՊQ$[gN*aiX=ó77 pŭLm~%ai8v89,D!s4gWde9hg/5M-o$9ecKԖU'N9PAXYH|˃{8Xa#djqֹBe\ŕv(Un{fxR:I:Y6jd5~9Uy˛iwMUzG#mE/'_Zn`v*Y(+B1߹rf5Y _H^f쭳C?*ՌPAO$ueO^SC,ш2pjU]TIn7ҙ4usfY51qiڟ1J{PmipvvDmk?  7V4L(Q{E3V/+Y,kV)xaV_1pN jks${t}袋XJSA6SDuc±I8 ;NmXJy‱ j6\2cڥrŏf"ԩi!6S}6]jdB:ans^Qn!"VdgR3nkc?EzD >L~X$)::m)Wnt?KMj ۚ_gцVWoue6bˎoĖmvk))0 f}ti)ō+6d9R`6I@ri`vxu :z3)>vJk5CjՆD(9bU!6!S>egQf҅_v!p2?j@#~6ٟ w0WQ谍8Yv(lG/Cl2!,ݙKH#+T4%Z 9 3:Ϫ2ܜ.V) x ;@edDDKaPA8;(Sp-LmX1egHtpaE%f<`O?W#&DtuyXi"$Z}6?,Ԟj}\{<S^jrϻGkaU+cq]m4,Eo^TNZ#[MUR.4\n3{,Xos٫T\$ %P%g;UBsO:ב (pRVU)ԌSƣ .htOC'W0(\9Vj`W!1ȃJG2K,%47S(LQ1$ NM-λl1drOHz] 8?`]@B8x/{1uH Qdc >,‰EQ{Sl,R`I(DqzecY(G8}ô _@!g si`=O`j\*ᅳLpE2"V):b϶Đo &=4]>7rv#⡉ *ZNyDgƛu8ࢂ]1UKa?AK;H)7"6j%>P",B[ }ĕ(o3td-f'T6T;)f0s!jIޭnOؐ^ ?:">_P,򰚧ZgV/Рu=!j9RfJ!6FT#KX;oC hGiwP("5DY2.V#2~4hÍ3A#1`>ͱ7_VP$Ĭ0eGxP$XAp[5fs<;1/̽K 칁i EYHᕎĵ5ՍeHp?!t֟E,ҥc:X{uSiyzy 6|nzAGi'јrX^1 b9MR0F,i=&(JdYtG)E},n =R(dU~ x_һn(d9`4eCIt"M=?ڇhC~OaJ} n@6pE.9){%D- q$8srVIh[¡I!_;%`wO vPweA+6jHL+cPA4.I:{d}>¥Jb}H.)P^e4;wt\oL87]G\n<)'ve_@>?A쌍x7ސQgex4erswV;,A襂n FB7ln1:>¦FKc/Ba.`Fձ(aNF2K1Gx{+\&Z4Oyʏ&0EwەĬX'izi+ضk,y}mk&l^y1Sם\m+M? .n3{?b(Oc (*NVa39Zwψbu1Ǩ/Uokdo"JnRsQdo|M*0dl0Վz*Mϟ,hkHYE /0dgVxE +8RI+Op( INM-hR1$>Sfz7hqͺLeћ}F4s(JdPDlˌUSl~gޏ2X~ C.s^5OA+pZwBMȃ9LVFg1CqL=qg:J†~%fCEgPt''B1ל? KSږvmAcJMy>hCaoNq0Bh`f+Tȩ~i!86Xt(i fvZHP42AyS$? 3&>7A2Ay" 9/tZMWTѬuʀ9LYJ" $\8HD#nb릔)1!R |Z 8e/fٹtڗv񐝬\.sGZ6tg c-eyh;jP !rXujtf,N2@Ns3"e̻.kfD$nd~'ꑲRzPX'藌?Y4t+* hGR1.6yŔQg% |7Q˓?b1otgp맾啇U`oQ;:fʫ' |[C|4ZI}Vw I+K;t!? w{*!əIUu!dXa[ڄ"x6NXNpsV Qw(]uVP$4T]W*67Qтh.g oK8$'Xy=g*]]`)w,U5~/&1l0%-N`Fqʪ&BG+Խ=ȼtT~*mKRf,, {D1l3ԕsJzl^}˾h ` ,Nfsw` 3C &LM)si- 9iqC܍ϣ`PXs2Mf@$Yޖ:ǚwH;$%QyheiX.fhAS[xRʦ(NyhIy2qG7ږ=m)rFDuWp>wG#jsWi"0[HUꮵoB еicyo͸twԆX"M'mdbLr./iJ-{=L#|ef+5!&d^|%[Z{]/bˇ>c.>KE7&2,j|AV^_;Qp?`{`DRfNKsA&ONJ%m= 2O(]&5VK %/7,9w9ȉ|pʂW3Q8>Awk3ReA,s7#I1[V$,|w\P/O1ӧ5m&D\dh+ۀ,PZ4X 6$b&BB[vqO__} n*NiuR'i5rQui]":RsOvx/whu寵"yDbvn^$t,8v<L؞":aJy|e٫eWbKL._8x!B9~|&ғyCs 5\ƍ++/A] 6xrQUao楴d4t4 "E]+g 3i"G'b[niqpYKz(N;lv}+:gv߄terNGXG)Itw1ʂarx.Y5na\'. }U͵ 9uGcNYaŧj Q51\}h~גb" j&*=7@itepP;c.bUGWLk;(-ICYy[ky;T lN@x>x xDr,S\W}p(6éyJ U~k~4ڻQxI'DX P# gQvbK-&M^C =,ud9tCmզqGoʦ?pn s8g@%Uom1؜7ZrEȝ'ϋE"4s"J 6TnI%X}M}Ӝ/b,C ṃɆ*^3HTCKa,5kON1ABB s-w›J3]&vX[asZ=>+ ݱffT~Lo|Iv Hk4eQGŠz :H qblᖩo1?\fw"\^+]@lq3zArVHo΄X '7S<4ž0l xX effŽ^qAYIczaQʛkL$ڱW\!mjΓxa3JJtD2.,Nb~9a3zND8OT ÄJ!y$-hS/t=w%Bl͋MѤJ'`3B: X2زadS4RT55M3xaа$I?~D͝/"/UR'kOYNdGH>*+fbG TWr{7o|41Wu  ;JO GL4NVM앺܎;Rp "J)1/ⲉ+.I"kY((IUcEs%Q,@9f2ps5ϧ%m.Vr*i0$yV+]K^d{JTv3- dx]"R䈬'0Nxw|tn# YɼK3țctCM胻ʅL -U5Eٮ|/rcbW'm(R*Mcᥙՠh܎J$#*9"8tz T(ⅽ~l窑~TVRUZ~lHuH ꡨh B~B!!S[]Yk"ūGnkW gBYftw&Sf&~`e6nۚ@.l砘NNRCgUumqmWf7$' C!tz夿lr-ʆ|2_ _*-z3*dz Ek\ҴóALZS0S65LLۀjv|fY55|)VUBI.ߺtg9Y?@6}BU܅e(/ }=%A~vMQ-rj7ʩ?)C>|i٢|K$S+y[΍Y*إG`FM0qXn)>Tus>[FX`w(#[8ywO!Y}|Fi^pszNҘda:8|;Nv-vcԽmL;y{׆d7ύ?W"dB,˫`Ni"Ԡ4(ok4ޏ0a^Tk?Ɖ4i]OeHN Y,b *o,Z^ +4 sJ7`biVE3 Z<7;w'.́pq73kQ ZU $:"~ f!'\@iMG )MT9ki\˕Ak̶LU_PRr) MX *ge"+0#$m쥋͏(Uu` Y1mc"`BobiY.鐅a *5"0]1rf`_&i%NWX'-ᦞ/d]qsv g㣾:ԿG+Oi%pvċYP=\4H12XۄG(tX\Ėh=AX .+Ed8YS=j8"h R ]RMS˵m~F6a!묑XW!v/+F*4Ve1Uyb&{!fRC!6*k}K϶;;#j߰6@ M\$ܓw|6>aD)zMtFASF.UgQnm6Ǥ6}6di{іT%G mSsDUFN}d@pBTpD^pYN]X! gN³\dz%, t(, vI ^[S| $m;{Ƕ>b\P 4 Gl{ĕx#xgbŷQ?X09rh$:؊ w ,EЛ:.yTi|S\$a!m11Qc|\o}. 06wzo bVcj=M%B"䴤*TfCRq8?k:چ%lsQ9mh)r]`0[iD؃&3Do-{-Ml2U@ܨJ @ԕMڄDkrc̵'c!h_h"o=>ўL#sܠ'B4] ښϗxr^j2Arme3\tު\zԄø35ݳNu$+1k4)[{b|%hͺ8ܺSy#.810}trY嚬Zh(kE4r"v( DXoWo" Z-[-%lx ? 7b#X4fB@:YM~RT7'nqghP%R;!XV)]TL;!7Q dؑ%؂! HaC*$& 8VȷѶyF|SđvFRf6!ͺ_AI,]"Vظ3,:wX3/$ #U.## ZP@w~>~"ݩ P|_uKxSl\˙änE%K4bzeIgH#8Ti\=Yކw|,vm,jwj>n>L|@ZpN:u X$^}G6!Ԭ+B!j.d~-Mp]vöЙQ|2b1a 4MFWヵ;Ԋ1#`&7 ̐ y "E*"| 7v(A\'؜!c4v=F1Ca %mUb ut2P_ ]U7M4)O:9 NX@G|qIXTm~|=0n&JhMJ:X$=&|-Ş.1ڱ;Pn5cbR.PcxhF0tlDM?ot;ʒ̈!t5:jnQD],Zi i\*w9?Unk\!jDj>$Z?6iW{";Ξt*La6#'|#nԄzZBD*Q"f+kS$ahs9#j'=UCa?w 8J}i"t{H -K{^TWfSZ'@ij⭂H wܚŅS2+/+X8l .dmcʒ ޽UWlh3+;ImU% bS`}nK̶Rcg7F)/?*XԤ΋:C춄:y_/Cwz?R]KΗI&6x(p2VB<[,w7ƯE;>A**(†1v&|WuRCzӈ[J8_BKxls JlOZ.u|a+x K{6GEN+*dk9|+Bx_g2_6\˗/>Np;K§~nXfفό4Uiϙcڥ pv%t-)=6J{LU=#=338x"F \nXS y}+WjՍmO^CcufFi^ DuK6 F0!܉7+5՘vѵfzRuJ_`jcCgPL` a S<{⧅hB,~|t= U"xظ،taueKumEHӟxvПZ̷tO9"׆  &grZ.Ƣk 2"bA磳# l )EO`ܰ@+zSOC#⊥& _["62E_?Cf@렾?\8u]=qy! RK4b_*Cv[C#-AFT>ضݮ)0'4Xlg]AijtAE3spf绞 wf+l^_ nV`*^ #|RParJ5H+0pDP 1n#)>,7t_tGz~> 2;fF.~FvXslDB8ҡY>LYd-,P"5=D$MS)5&ҭ./IUab%W<8%_=-eKxnX)IRpK1zPLфl"8CW߭b`U8JЙpW 47N{gegF ɰ3l>iG|p8u&~'f &6 cVYd3ˏn=` U˓ \A*֯ /0QO]G3::l#}S@9U<-[y:o} —, Gf-.ޤp%,o="Xfn_ Ɵ0s5$_e3G~-#([@%Җ3m4?hE:MCo !L@tu!̞v$M7ZZZÛp!& S9Uxp鐷Їu=BQwQ6kŹ>̾VDCVyMDtj?vx,Z8wH9>`IEgfR(?~*u-Fu8baR+(*F8= vjxQ-K{L3fM;S}3i4VTɸ _QYF+qV^sN xӁYs͞ ILF,"p~#Ru*DMM)n\|6_<Q5|)o 5v`x\Q%+HN 9ŕ_ bOW8*S>᭳=кW+3y` 7:@$Cz7E{l*^飰,꒍/+K|Z0U 湝.mMł̌ N^f]bmo:D8l{U~;v^g3O)f6d+@f(<-9 ZLNt9Z]r6dBZ_1!X+Aq=,rFw6168mij#R9PƏJ=P/mwvJI2RdŞD3/T;c&+dګUYy瘯SCcLs`=3qgz^9\ %^ 9Py̯BhAs-F$+68!RwrO$#%Z?Ț5tk aJ&PƐfrHc܇jhqH<~mw'4<ثzn{]64t.&"?U?9O2.<<}C5@zw `rqPq+`. A^MnZ O_zgy6[}둏!eM/x4xr]S\1NIՌXJC{F)q8S KTA Yc^vC;QxqbZ!2 Yu6V;MIuiםN0O\G&0 yh,0 t̺P 987j.#®? zA8$v$6r]ur!JE.k  ^ qw<:9.sI¦#s O%ٟ}SV#IwN~ܕ.12 MKLЯ ϬͰ*``Щ i5 _Q͙cuO)uNOŴ  3Ļ buFQHErE+&$&yPn2bicBmq'=ϧ²$ɶUy%> cJ޳7_Id0\ IeP3-;2OSF`!1#:l}H_)`5.ly63=h=fq%0@-yNӏVP. sW3' U=H9oZּz j9g%<_CAtiK"+sxAEĖ1nGgTj? 3ac7T32m'm#6"zZ>."JY_)m-?_2BLy^!B3*LGeKy>~-9ᓿF.궴vkz lʪ<'EG,9&P)UHq&[0#ɵ;Bmf&[nbp~4{?UD*\UZ.Sl+nfu+- xRnNZ7jcd߬go3EU%dW,Tc̠|2.Kğ-|vj# W$)۵Џ/>j3TSoNP`Iܬj/-E$ urZ]>ʼ3 ULTȜ{ĵb/Q"eE ʉARqkN,.I,Wu#IOjJbQK+p ~G8*fSVdŭrqn2z7¯2Oxs(&w #Y9 Ojl8\ɧjgʯ.<üFg}Sv8?BM)bmEtH,XDk2Ǹ:~ǿz7x?b {T0zTO/2hU"8sup^hk҅Wbe.@Ҥzb+{wjű_) Z5DՃK]]2fz::ێ7z^]48t)jR7YUX$ww-Kh3x*z3D^}@$S\Gˏ TCV%҆ ;G.EYFۄ%IF><)BN)HyŸ#C : ;r?1=Ebb<1x]fl@Hڕwޔš);}&>f^g#%# ]c̄(UT]_xR]'$OԠzLΚegc8ge>Y57c"AGcL.gh^Y OeM%աSA^B2v6g\1"IOԔRD"Mp"\Z"`E9[GH1٢E ~@埿Bj|w3Z;<߲Ib~,"[:4BX7WQHÈ\i$ܑCVTMvOϋN&v9p (IWn|6&Y-ِ]0O]t}Snjl[wJ&I>%w!RP2 rB.q wnzv;բ;x'nG)Vd}⸉bަ/1"@\mOOE*_ʮ0h^"+Do\9 }´QH;ۓ{f٢59[?6hS$ˠQ5CB$|ADcȫ@CGAhGy[\/f(* ' Ʈ\Ap+CNYulDe[o.nhnvKcN_S)x\W(|ifj̅ j'wذ¦?s5rbٜS,B=9 F/%(GOsl%k5d0UE/c3OKz$yhH_|h ;48; ?9麐9ÚM{4$z\ {&237jtgAl׮ZVR@qGSkDLB[d;,zi/4ˆ-b4xt9 T"oIEX>k]{ $a=bA|7ܤKpvۆ\zr5dI^=C ~l(85`Gc4'[hĠX݈*\)L2]Z୽D1:87_Lax\j RAߧL6l qKDLh|g<+ 㡓8ȵ#npt-L3I)Q:3tV66_ƛR8LvF* nm Bt rŽ<Q8C,UF duƞkr5d0Û2ǨѵN\ӱ5Ʒݭ (+bSf[wka6&D/WBt5x\yOi}{95:M9?QYi,8eBlfXiNpėgǖXr8K=HR1DD?X3\?&ep o/Y$2r8Ey}V;VAàsN29Y36nKBkxpB9Lj&tǓ䟱ep{M_fX{K3v<ܨ`_/i^T.`ϸ̸{=zl,CA:H~}TO? EhG4tK6j[.dl'qi5uNP pw%Yb,ijubН*"'y $aL4(%!T/w4$ w# l1~A% g=L|e:8"SLMdΙM#IRqܳM22uǦKɭ1'3 ewWhi<4B*`m`"_${KZz\ҏ>x09jlyj~*ƎgS,ar9TgC6uu=Y5o/Tz:OJTIKNqze<(?U\%- x[,ܚdy=aI|B&p2a 0 zF3,D <[ fi n,ւcBr~2^OeFDO#W48\v-?@\( ֶR#ń's+MU8ֆԏ/ҟ97(豺 2IʖM[p}nX4fEu &֔7"&(3ΞېkqcI 5Kiw|\Bq#ž6ƛY|5ULXSg9CN%?RftWīd|z˄[9ޔMCh7i PVLtyNTDdN/l]Qm&{8+n65rAWȹ՞;UOmVН!_1 ?FQ跐u9a/;ټ)H3Sxh!5Ř1.ꆏAKH?=v6X1W|4^gtTӛM94 Y8/>`jg 2:#5|} 7g3aZ > ֶa3Ȍ0> ):{u+nٻ/Ҁ%I?mYi>}\XTASox - 37ũ]Xk I )AU|+Ȭ.%$nA:9زOepU+Tox k <>PYZFkZl+<Q _*^foIS_X&ܧl#krYy;F{^x;sf*w}h$3fV;,piΉ ) r Se7,<)m/h[h,}$!Lao<(R-Lb\fкB ܡU쉃lM\ ^dJ_!>=@p6aEy#T 1 ak-x? 8g&R0U]_҈!#o>})-cG㥖TD$[  e[$G}DH-c#HGDdɱ58D#En$Y¸&^چXnoWD-=>bcsۣ|P ]I^ =@P:,!q)pSE]Ǩ2}'[{|QBs;|FbFc"nz3pQR !ɔrHyN@I̸IY>,;5n%7l(:BL`q:2>_O·UkzԞDv4 K.oCH=}dfujCbର)dw4dLpSIt`ch_2 uBڐlߝ"Z'_}R4k=f ҂,MqgwҠNz|1zVIrj'YV>lG%R(>|ʁP]>Q85UA(r3YN)V2 &3!>M_v)|}x'9,YSf]ҏa(x=w, _0/O[D@@`O ЪE_]]LdjǩgX/C&wi2M[pć*J,@"gm˜Ǚ0h$槔Oe8J.rU׆g7zn39 d簇D"X;.|K+ PӜWc]?yzy [ #'2=ZDWR#d4kҰ]L+)fƭE}sZjWJϲH5C~=vR+'t#Zxc:CrlgӁԫb <ȠF(pK+r\۳0bv739qNL />۬fF`* P05 K;4dnUx>Uʹga"@&u.C{7y*5 %$פSj4y@iPx#zlP@Gp'HBͬ07C3Z04pdz'Ca 4Tw i6Lن4 XKkYyص QB+_5IKT'FN]mPDaKPtG\Y0^KvWw PXH_Ql\t @&[p5v/V%&kϬw#Iwf|g0k kYLRcd,rl@z}=e;?i]偍(Ļx7M ze$b}V adn->!&,YΖSbqHgftՊG6ud0 Z.o} C%9Y*h>]~ E:1,]yY9(%rU1!lhٰF %_ySx*;C^mG)jsڲuBRCG.H -E"uHK}Pz2%YQ'"!{~zx6ƈ6"~ &d"b NU+ 9LS$ 88ȍ1BCK1Pr$dFa@dz[ө,;.^|a+ܼ۽SN&g;)`2=c۟aɹ͚]+jNlOS0BЋH(XlQs^2~l1"As@O]6ڀbI?Qj5xȳ=UK 8xR"'=4FP,7dV`z,| )%80}xs,^]j-| _侚.Q6b5pIxڭV+]LPn+tj!J?,~qS C٢w -GAcCo8d蘩p-uWtzPKa HO}&O,4N.›❛f>hZ{yIG9EӾc~ҵM%`hw3pjUeW|-~~%3?k+!$Ԝ=y N%(&z&\[ ߲uF"lkb7PٟLLI>,nV.54)雬J 5=!tw(ZH&.l(!(:2.: (={T7s~E)gk90tIUN.Rs"y($[Üqҽ7UCUkZ(WBF0MA A3dؕ{)+y aȋ9 ݼHBJ é_bE#>TI0bIM`c/6 3r`e7ސ.BIeA҆Hv7œ5mSvmDA^gs_RCN^dWwyL&Ha0{wBܛ]eHL{ /ۏ':'qχl{KZa罡nT6&;ql* 0&a.l9Rֺc$$7M Uiq?"K0(D7*Cv#<2$.]b0_tj>2*6L .N枛":uvGSM/q0یž(@Mg/̇<[`@$MEGa2!JXv4 jKN!.ľqxEŶxWFpqdpKO?\i*ʝ.ۍ%R%~͚bjR3>F%FM4aQN/LL%*PO TN>o1bC~?LBbN%I-g9Do"G+cWyvࡨ@j|YCe@M5KIEo~ݤMb6JNG8@+LI"dkAF$Jh;l옄LjxI%ŁwB9ThF-HmɸzBn%`חV(-"X#f/nedrP <-@Ew>9O/'; obqD,|ɵ>)^ute2f-Lɓb?z~M] t@u3A CD eKLf~ϐ!\|بMCL7ʧp'ɟ59p0u'/6J>" vB`enu6^3v\TTqfXe>Uף^͡L϶ޕ΀ dF%]w F)=RsHʸ<FUz%Sk3t. V-ٻKKÔXh0M뫈RlƛШ '4`JǨ<7VVߞ'[ yHL$y"/ِT[VU^-5˙0Y'\Bـ>tkw=ߕe顜1jxDkLaU')='fDBPvX{ќ/])fX_2Z>g/I)8=O+BCW(H<Ϙ\'xOޣQDPͷA! ҵЍSO_:cѶ D/ƪ:"c 7-R m97=AT#X7Q8bN @νeiI2wym$& Dlju;j|T"V2O|٤Q ޟ xЎ jzv: p[NcS/+k-F*i:?0^uc'f!7%Q:(jQV Q̗osEqPIH4n͢ن :xL\E-PWݰzJ-M"NI]k|6I';p~@_ cr5?@2dGr:85ʉh> Nz(˘ 0//v纇c@VT0w2h2 >wLLN uw/LS]=^+1.`\Gקm?+|M)KmLquN[(0-۶m۶m۶m۶mۻlv~DdIՈѺ_b)"F=^wdo5懤׋cyOCǽpBWp495b&(@%ػ"=s5Po?B# ud+:xR ed$M^4X#W)BTeyii5mמ z* R3&?.@% q: m'ɬՆ=mm5-J"cs, "K#b"rpw.;-t0P`G>̥lAclg p&*3ePOMh@ϻ瑃mkĬHMM?d`$}Qw>y<a%BRyĚ]pASi~29XLyKF\ޖ/'f'a#dHt#Z[ 5nر( .Z yfhйM,tP&ܽٸ?/(c|ALWl 'Es[|h.I%%)SAv"!lX*[xO90?;DAu-\D]I@YD\Wjbl,x\SŲ k)'ӿ8rĬ+ɤT8¨QS+.z#cOzpO5%%FWM:V% kX"zL~ސ\-j0w0C5h:8CM#GԎ,&ZFSM6cY1&w9q@O}2?\}Zr+}SוnLSߐLA F]_njaLKV L`NË+TTP |؜}U[S[`8$( )M#2֕ԟ rCsZJ!4o>~;zTk׎5`.a |"8j (/Z/2= E!qțpkSy{7p9$xxGlir2_\ҿN3ŌÍ w(X)W_7t8ꖊ(Ԥ6n |#QMsn*=>6wW0TKaeӫXTS5@aG1 ޲jBE?I9"de(z8q IU'Zcw3G$[+|$˔. ֫m!n-Wfގ(t3$$K{Q*g $fo$js}N3WTQ1QtFec2J^X`sKڇRsp؍BŷnJ: ̷10Z0ӨŅ ~Г4I~x(:gȅ?rdyO{'1cdkն2ꚷW-Jw!-m1RBlXgb]MQI++) =Q)H<UcI(-e2=cAod.v%B I "t{3Fm%v#, F? |2r.>m(4'bCTN34_vI )CZRU`mBMX]b4ٻXX<{%E n!YxO?PEI@=(ܛ[ʁ84A1+k4ޙn#<ӗ1c"EE#Vgf >vn.Sj\SO 2N ͇%hT.An_5)EsRgoΉryr39dc"0Uce !U#;Nq)vtPAbd8m9w8յ q;C(LD>/ ")5(hĴ_km 𥳐яkTe-cl|BP~Fݽ=Opў 'hOI"$tni%-5;Nꋎ6^7`>xg{DxL":.1x:( ꔩ\A- 0^"lUs}I Tn;ƋX=yތ|+N2E&UWqjfme  <~+WW0*kg= {y}쐜x<HDGy|XFיɆToQu5 N:#k?)os!?Xz6~J`ln4!udx dui.WsqF2@Q89{&6a) QvML Z94ja) }X'G*Ob?#ڭw[U{[B =0-Hk#N\\i6:ȱ"#K i)E.nd~b3u̟8mބz bh\‰ȸ,n3Ȓ qgN{M2#3Ơ5neݑZ2 JDjWB+?rjn ݂V^ϻ<am>T\!f A plB E3yp5(2 Hzz0|P>o @BpI,(OAlOss!'LtUpՔM Q9ɭwVHūaFP]G[)\| X2塴r_շ_X=_K612r:wvNyCHr)fUi͂'snߢn!h7M0¼q-̓%a'(k x$Tkg]K#Շtn ]=ToVYnnrGV}G^}O S`_Lhp7y* Re:J'lyR ?=z#0lb0̩uA]Q戋 #\LuZ s,YMQV@g!KT^RT'f>[t10A=gr޾!d5=8ѱxO'_rҿe{L~dK:ĵ=q#z油:Z`b?ښDOIrԋ |7?PGtL}=:A 9jWmna?'UL0Vl9BޟB-_6\*T95D}EAk9N%Ԭ ;M6Vd '8gSd Mdew Bde葄 7#1Y_ܔPgnK Ĵ tĕ"]uk1xgFMM=s+bx<Lf/,5-^LFH\WP\!j̽ЦkQɤ9ѹ*@GԯCS)hTOh ?B"rl+8%L.J:ygP S 50 .]yTދάF-?1+'ٟ 8ȑ ht6=abF;ڻ9 \_3Y) [MS z3"D!|/YF+mr.F/]!=cA3t!O#ج4AF Pdsރ,[^oy\6ӫ&5P ,SRա]u0pyMv9\s<21oc |3d2]?'-<+NoTo$iTg9EsWX3p&95=)+lч4&5[" h0ABV!.Ch0?DӹYDСKA5 Z f힉֟( >ڼժqCu>9(']Pt.u*-\&00!Xv»_tҲesRI1<:6E5my1zFFYu%#kDwUOD!^oς% Z7e\V(eDs mJಗHg#X^ 9pٲ"g(|QjE]\q,HP/i%Vo8ͪ 7E3BK";qF%}2  ($f*b#ɯ7acq^(P(ϯp AgJ(WYk̊LOI+SAe"T9z1x$)ukЄ덌0ZWt㐙S&%eRܦN2`N XrC~D҉ܠ F1<'+Rf/ 愯?ǀ`k028_iQcX32[*Sڡazbj5xzgm!o` Fy1咧gn u_Jr< ƣH&Gֵ^ -&".y4-\u*nĘEX-2Yd~vs5.Qnn܎){Ȥ]/??żda܆~]QjۅY1Z I?},*:qT7F_^&L "jok(9B>C1übS\H5H0,{h/1)<|ῶtaF'~hfaerx\)Ϲ4~'3D nEjX+,i`^S=ǭuJz(O wq8>2hc "D>6f_b#sS#!Oy};P@ (ygz<ޞN=^Hg [! =N^{e^.An5O⳯jr.Y xعAr1MfkG꒪m:Du:].wIP~~'e.׻$X`!ѷ?9'>T"sK[G@z罤p"*mآB8)pb ΦI؝ -UM[/`liUL=C~As6fn>w"7zgBIhCKa7i';9FU{IKh>TSoH5 ;CBGPRj"88E5{=6T9etP%E;#r1erʇo΁0Ǡs_[ (~}"qݠSEsYhmpr@8 ߠP}lQ6y f~z>~.}g2}˺JC;dA<9kAlG +C^*MlPb$wuh*YVTn>KZt% ! "e֘Y"d[mF=W.6nT8QW8m t+rj.cE2 -yMK[H!=Rckp0 7 JE9$g< w[HAyQ~lb#cKVtO.M4F']BO/k\}q&t:ɻ+s40i1X: ,jE9O\<V F~i椖;m H&e.%ho+l2S%xӌ 3N{uL4O^H)>[{>7; m"O^Uf"N\¹z 5C1\/'}ϽYpcO Ǐg)#J¸TSJ:UpU b(Ln>Z֖ҹ]0jC:=OfjOw6^:' WlgKf:o{`8^[o $%qiQTA%L6jR2̂%)I65^T_D4W(!i8:{j9ëm_Dh2B7ܑ{-NaMbnX`ِ\ŕEcu@$ũ3䀾. Eh0TlJ}96u ؐtqq),q9-c?۾FWe8|-0lN{r4j3ɫK6pF>2,,6_rp7尤5k/Qn9YVk2T_Dn7\lYOR\wmL4[:%WB,' J⒵$[5<)vWދe$NU7՘w7aB֊`]Gl%=3?f:d/=8-1*pj6{s;mS;( *{S/.o3r+kF暑]qIz.NŹ.PGtHi"x|!I~N :Zr_e=.+@AoBnP--{kI0 $94^Y J%-T6 [f.8h\<&̨hw8͖ZVU}OPyBGYķIVpĎԙUվri_ɛJ s// $/lr*s9.i,x5ⓗ_IJnP(eǨ /T\* nl/4hV! 6f;~>_46E"^ U3/Y䳺c#4ܪ2l V=AXP@=ZfQ Hsk` $9vk_𱱗6Zc͙D岁"dN:9Ns OF+31*oYdH6xW4栱vQ2geoK?(^RJHPV" Q ;;{1T:"{0 `_\R'm1WUx"r%<r7\X`"WZDeBo!e-K`擎i0‰i@CR c1mԣl)ޗ$:T yg>k;PrtNh 3۽Hm lr͟I `UpTtp1Wsj;{`^X6MZ>}G(mB\3ԋ$3#&2wK5?eY4:L-sGHC8Bь.Jg=k fu`Ջk 'ڌH!2=xTwSS?wR{FU mudw-Pɑc, !"K< Im{y ķQw~?er%.9Dh?=цhދ-+!Ҷ d̸&a$/+J筍)fS> /łW:B3g8`A#+$RjJBx@&.N-wNU>, I BZ弃JO>`'| [@nZ9ԯ=&g`$cȔ7kcn69VQlQZ<9҄ 1D0IӉ]ABP#R }NuU#4؎ 9,Nq؟ ]Hĺ~U[2BRd8)GV{PBHv@}NkJS3_Bȳ Nߍ3D+ ]in\?BjRr[]]KC*KMMZÌӛ#'ĭ!| Ky]wi%c_jOw'jVw͜n6N1\VE_xJ#PLIa*&cu@֙ bFQQ^jD }e!#@ĶAqtpY/䏁4u61@8*3}^ߊ0Ʈ%Ĩ ɪ"T"3,Y;1)?ؗx4}U"DbwsO{mFI6~=;,]QMU-+{f'4 S/Stj-ZTİ/3m wޘ>݄DsB}B3wr|(ө)^pܼ?¼MK>{M}&\#Y Ts ˈ [?"GX~vS{IX_tF?nù.1.Njl{ݍp Ư"d[9JEK'_;e %)1g='hI YD Mq&qvd?!۰q}kLhȱra3 BRȋvS%[klC$Cδ,WgE+S46Z'h2xω:lqkʁ؉VKa/( t^UѸC4UVN5Fi'Npy Ԛ9uŪ{y**QW,$;4!C̩r($cU/K[G=p$Qp-=\j¾=}۽{~1#7@~F~IeQ^Z zA#X̥/ٚt2#@qC F/ZKq)K&^ ,PXVqN'jVHܻeА&&))ÓG_ >M"69mD1~]"k$LùR<.]5?ڶch(>񈂧jAf0㴺dCn2: gYTnE (Ys:n{ial=OdRQJsPVs, l {k31%fy y@/3d? }=e؇"֥ެO7:rt[Qu) fV١>%ZJbil"omRSBoF>S/0@j< Ew% ՘zxeBt(i$TdtkZz1Ĝ+.*,2ɽ>Vm sؿw{gP芙 HoqyFd_J6.|Ay͘zn˪]YTgKq$ۦ#!srq(㌼Q$ *D#Z# KHcLWg$ĞjB \_&yE"5d1޾ 4ըc}dz2<71gj"+"?y=TBĽ[㊢:Ce˵"6V~V82a :{՗h\`KQ!a2V'ax(>Ȁ#,&zh:i3&TgVb5)ėTrƈ)B9 &\gp/)M;ÖAB9I9p/7MX7*Nt򏮘(S׺)j5m[j[xtO:p:@5pLj ; 4jG .&(^%pxV݄5iI9I rG\U&S*Y[5!<7=+ӋGuA@WJ !N4喢F4Rj kX}dt{2r;剴R@@@–(#pno COFy|/efc #1,;)~07729',.Ji9UR |+Sa6S9S>i![ OX(XGaLJDj|pu7E'ZǙ,Tr() J"t9m:f|rf([go TމֱM  ,mY?SO`f,Hh]]KBUeMv@v}<0^f|kܒ_;qνisu:[4ħtT>x"7Oî{+_I65rS> GK5!C&n@gSB΃%4w!l: *KTL-'WK9y PV>;Il,͸p]ffsS9W ~mnR!]G7 Jv+1O1V9quQ(R;TA:I&V0  SUI/CoVny%ny*(hWʋ0 awx|O=zwid"jhLndpA҇]h=OmIw|/lGI#U*ϾR'+IxC|D&Ļ^fhnn(eksU.^RRfTGpVL1r1h9=WS5o ⍐72Z&:@#@|}%F FfC_hl+TZZj]S6Ohc=qrk`| d}-a%B.bB P[;ݒCzP Y @_-緡`꣮CbH"A̐VJ4iMʠ5v͊{SI zt>UZoPK/ QUuF]˙v/ģ3;Mًɛֵ0<.҆*k& 67&Ca"Dg3XZ|O @' d$[s tw S1?B_H3hƋщY Ef:]nnr1¬ns8IŹJvJ 7$0rqפxqْ8/F):(:scV `q#n_(Ie!Azsspo0"!Q_x]x(:fgN/˽513%CϿa Uܕ3Fvƥ;5s:@mC,KjJ*BNS8}4NaoM,F&},u +S+XD$>wV^ (0s C1M{׋݌YЕi) ._p5|_ug#tCYq!stPWA6*|)K܆JFb.M߀{0a l(k"{:-R]ڣTKbFǐ z!74j=~A9 4hIZ Df?44%UEʴwAeux(N(=!*v}%VhBZmu|3QAGR6i++KG5_s{7G ٺs=)Idx0q96uQN<`v.Pe\@}EэEv2D]Yl1(udqSK#6vbg{ gwu]_g lmWaM;C5'!"uta:yX$>Ƶ {0{2ݯra9Eby۶' xҤ)F#Н(!WvV\~^mQP@Cx㔎@juy#`_#>@i\"pJQvTdr2LqaxN%&؎eolj m%9s~_(]@?iKm٢L۶m۶m۶m۹Ҷm۶myvk>G!{4. "/-S9331mcJ[.KZM V3g)̎ٺC6i+&9Mu]qY$Vi?:04~Q$[׉c{\&)&Ya<@2d.<|,YxzLZ\@SYG׎'* s_ȃ,H]lg 𦨔?P.(!zHjx$eꟜb2%r~pͳW"tIwt- dCH|8yMKW+w<*k$> R-c!IRhl ƌF/b Y(g&3,&\cRxE̥ժX<1xtv[Nern㝛a&7h024W_'br(%QM'Gn !N2] IphlMQ,xۯM̸ e[K ϷQi ez(6>,E;xPq*4T#s7Ww(_ iqSS&0NYJR9܅VŏEZb)e;)|2WY#2dxVw/ {Ɏ@&:qtY*4bvO MacghKj/eʕCFIH詇EHHX_vilU7VqpT ΛGLD#H-)N%F[|& &\3WNh09;y6r<{ *KH&fisΤT `r k Ѯ[l4ia/֡ AV{8sSEQ XAq0rqr${dKGL8P;-6GQ: aSkAN]2 ^eCzcd2oUpg/^U5OFw\%OB̼)]''ns(`d)/~c{ñNZ$R%4"Nw$–yNd3ѽ.y#c?( rK e,h?j#nw6B?FDhcl7]jak=5b ғ[\)濜N7 *D4 $FMq0$f0%&Ӟs^T5}ZKJiQ #J6[٨s ܋qq\'`kBʼ e/ڮ-A*]>عa/E-Mq֝[8v߶̜RfѺ! q-/zʃ Q/v+sv$$#$ֹ& 2spCQ\D*xԔ3 jfM?Um E3p_H|]nN;D)yX߬us* = -T"ȉ:!(M %m=ɃC0R5*[m*R̹"pr5a6ۑ+35'}@f Ի9oq*飲JuҭNN]Dd?]tv( $fw19xp.HmOĚ (2})!s9`^n32wbxr: 6,v]Y\o8=IMU{ιp&8qN1NU¾-Ž9iFpjL=J n.=_fۚy>ʳ+Q t Gټ]䢮O#l:oPFߵd]^M!2 ;BW_K]W(0 R5+1a/&j ] :<idrLJ3vrz$a@rz^:k%7شhl17]ݠGw~԰93KB$-)74HƝV{S+2tQYgH'<p{> տ&FZ١c{t!՚~Ob0p+qY:?md ؟x{ eުhsoKkH~F9)/ G}Lsj9n@ o=ZГ"鄕{=&O@ q18pRFoo "FaDجX6vX赗Rl.cyrTC}MЌXzD"%:KA#/6BQL~:; m2”vL37 8/mkL R` v4+(MKF$w뷄ꞕhqҺ/n~ג@D4!Wðy-kn@{.j]g?3v}ak'l&"YCfaA9|iQ%)}#+k ʭ'K0ɮԥ?$[Otjd<6]î@+9׬jQ8:vR"]EJ?JBqK;.!t: @Ips;duD5`_vW|X_1d=(`[4`UkE7|V3,yK;X Mv?b/G3>֥4l By熛\oBDnS6, Ҏd}(La=3dozE%&<1fAr$ѬY JȄ{3) zQfOcر(^;enBe\6xpc\9<Nܹ'Rn92pIKF*9CTcΧ̻v+! {QY9~DSh\WY;]='4^תķҡ/ePLTUncRaSsL<z7DcC׉;kqFbeB ֹ0?c^YP6VXe5]VJTYۣ5Ӳ7)'/I-҉2X7mvS?ٚTdcmǷ `0`J=k{uy!ć\%Ǧ|$H{NJf6K ( lZ2赇/'TvەyNYDŽ>f'RU (g `d %p"L4QcoHCGZX|F*KV}frTM*)oP;];} 9*(JqUZƅSjQnH,:.as5 ?Ȗe4nw#_q# (W z?z x5l9N& I_ۚ*S.>dv߲>W-}TFC^3 gQ75웸^7>5K#E.WAlaJ yp{bAHkQM8>$0ƿSjKJND:7 |V(:/zdhG oav!1KD&zFqrcfU"EJm>/>Af>|v%5sU!%dK.y xV4]vy{=!mHE7g{lc|G~?AFH%}}h͇}%Ex;3+h*( MXC_X%?g)lB?1ʼғa.'h*P>KHX RgZ|x@wv:qeIuA;o5AfOa}y?r11Ghq sjFeZ0MjNh '%P9z 2d`HU|E N& 9l#: cW\/DK kmц LI/H0d)ϑg1X]EW{N|M#ʣ7bʺ>[;P?n1Mλz9YCEc(!˒nE{KsΪ |)SJCuʞ+pFsCc0|S*綅h~1?M 4\?3Uˇ"psH:V֓EQǭ ͖^u`8v\FLMnv ?dg_ՑQY3{ ֧tīL~(&l٥$>Cs> U.K& ]2C6UUFXpx0UwJ8WM%&"g# Z)r^?_|V4llv[,413r) ^]gS֗ ?CiMU+vHN nHImSW D(&&CcQTiύ4^쌓!g")LTs5ۯYɡ;Qz=٘&֡}ݖUz^SG^51W3~U"wUJ j5+o(L%1X,8p7,5l>y<[HFANSyh> W{͏6ƃ)1r 5OnN\퐑KS CJ r=MN.#W ~ރ^a0ciο:Jւ W |tWS:^&im̹g48U0;nc}۞̶\x?Q] gb1߰>a^-RY}!'nρby~&pG 'iuYJol^Q@{KGhw\L^;rI@@>f\*6¯{]K׃# f<7czb@%CZXRe+EL B"5v(H? 4&*$';+ lB8U[ZJKM(@6!:)aSN&UyƘ㸀٬؂!*qX 2V2aC9z !г&wA.ٷ{B9yyʦ_kəgqkO(}0gU"y4CWB/ c?[\EmJFO.LN5 )},IG  ;Dpši\IWehBy2m 'L ۼn (;љD.=S/I#N`r.LVwӥ$. EP}Jt0~O%}[cf\Aj?o}3H0ZkNΐuL捹!/NA~_TI" Z hB"^Zt&=ʆ2oE9x^Jcn_9*!!R",֯]uWؼ\T_,AZu<"eGAiDB,$ K+e[r=f_PO8SI^YP#_,hgtt*4OQkmn ZoųסY j1`8{?++rh Njjs< ,%>l*Ba"Ew7NaXw7YvVAp\a 6_$}kޠVaU `8x#0'V3oD'\N>IXmT")AZ(M{u3`0A9cBpHzIoϨYV+-8h= J{9nBDkiM8;#S)*[myb2Ξ Mj1c\DIE26[O #WJ;`pev~=Nsg^<Ćd"lfB[qjgh.δ#TdށL뢭h;(k@%Wھ2P~x*h$pj4!>0S)]3!@C(߬nY]v"< -PTfSXoUmt>ciӒA|D-WG4IOU1[69xp퍑yfմI$ד]$ؐFX.wH)~|$BeVYFgq4~AF/ޚH+ī5l1c;bh#Rm~k$1JT\w.(*3ߤlsi[a`;8(KaG?(b'x>_n4sLiZ,?OBuma>u dW4DHܒ6+Z!LL˔es V&n }B DImgKf X|(*$K]` pzk;1Lcsf~ױj7ai1H濏X?aMQv8$ٰ>xn趖nοO Wn{)M?6 !nB<1ۙa t"K[EZ#~(Mh}1p~PO9%HYъ]G ـq6_7TrCyn՘Xãٓtݎ6oKwT8#|Z'&1aKYyTKT ƚta `~ɖ~4Cgk =E*::G?`G+bFԋ⹞6Ux]!9F4F)c#oyq4$X6@ fLd B*$L&$Xieغ+L WkZSi~AzU.\]E( C3[΂X{sp6cvJrxQgJ:'&S@ M^{Ⴏ_!Y_scF=+^sH(ddzJ[5ـO#'Z_Iz{]-m*̸;Y먉PD N\WnЪv8$zD6}jEAVXs0O(G&$He2TOVeLwߌ.s6i4vVeZj5} # 6\ʺ Ҙӆxu6P;K3iFmX#pi #?e}$Ќ}09]wIjW1+@8+#w;TfJfC01D ;ނ1f^?v\~UPfHT@Qy9ʦ8p])f=Q@Nn3O2!&?7nIM j7~n1 mv?}i5}O0Fy}N2+" } Դ*z]~>|ұ֟(C M;~sLZA,`Dn]I"D[-%#(5 5w$cMtPޱ8nת'=7"BݔXv05 lR>a62H!SVw~WoȈ+e( z5rtQޟ*d9w2Zy2=51Ex19|LtN|'~r-of(3)̠ sήՌ Ub CeGmf-"v]CZcº <#wz(xw)N~.%JxgPV}*% ].Y=9 IgQKu b#8{etjVd٣fvgkXNxs43͐D$m1ELw9{Y};V5kOp5,hg*1cBuяݨ!MW1ƽj.|Eaы>4I W,\k.7:dWރǣHO/W3s b/+lnћ``nBe!(&h׼`$-8vϸOӹ8V"fGuؙ9O0k ȜZݞ 5} ;D]$$Č G[YCJ9'5TK]FqgSqA7RqKGSllKfr!rkh`UO} ᝦ}r̛:&Yݷ0 YbzVS{* L ʐ[( 5Ůܵe&]ԀsЍ+WKH#}ftɂ+nAsD|ְd'h8(AGD4 ]Pș[EWܪ!Ikg-̈XʋHaue&E a 7ݜ5[^J)dt )p5[Ę.Dͩ3 W$Wwfrp$ 5#] y\&3ؿnU|;?z,[V@yv\5~R?禿Gk%Ov0펐ޫu(`syT'7q7R)xRY-p \xy"ْsYw6[o;{IziV^gGUeu c2>8&P do:Ă%9J6aЧ#`)vZ(A>Rϝ^p@n۲T#α+VDA1}⨀^ ?]gCTjF+gԧkY"a ^ڒGY> {v= 5}}6Sܡhb&vRfgOO c8gUf#1${dn7~k-Qvh> ֓OoWJ1``d'tH!wЮ"#:aYt q91Z&0 Hae?I7<Ǿg΋?Y-1h5ǹ}֟x^ RHn,(R^y9pX§F#^lXհo3\C3pj1p/n0oTH ,[u'{ф r\(EFD* :T 㫛!IW&Lo~Ne>GJ>Dh]63~ț(RUӳĮ1BQJ!R )6 2VOlИ^\a`©\/j#g*? ED3%pӋYgYٿx;Puwǎʒ }wTN *Ф  NJ K/!0e-EP7[Z m v2癙GpR<`꣫a|i`嫝+RLRcV;& yNK NB~0tẍ0VX٠~fǷ>bÆ~HF@50V6HDE9QR~T" 8Y.SZ]Cee /̋Lە aյ тs {|a볾gns,n! bN¹f) 4nm9{(r5uI{M"B}62M|6ԊZބ~Ė蹼6mtɝ]U\ 9$gNµ=H77bnf7BF33d4N6d)$1هΘo"t sV~FvwX~3`YCX;c(817]?w%ˎ*]6_ٮE4R㴁 jXeT)a[x"?DyBTϋ~Y.g'>|§ UI֩"KT+_0A/.$yaI U:grL=R9>Wߊfo[qSl"穂*@Rc2=+.wJb֩j^Tj3= Ku(3(UQj֒V$MII,:v'GXۣ&`ܟfjƾi|=2xL YQx3"Ũi/B]g)Rۯ) tǩG 4jSױ|.G8@Fjn@LV4~55TI<+~ic~oY!0R<濫N*篒9輱,f./ίs(rUc'@ Fxq m8ժ6"aI24xh[]p؛Azb@_;Afp$W]@A'0Rh@WYpoq3&VLwQ*ﶆZX>UHbrJ'^g N͍$d Asqriu)[O!% ͯb3~]7٣bBc촑ؙ !NWI7`~dYO\V-6!潬&@lf&QpQAr  Z#ѽ~qH<3p<'s^]<Ě*;Jw!Ƚ\Z4ed8 GiB^j A[X/*qmhn|9,]j+gvjN ^kε{5-|rm*}WSLӊs> l`))8Id @lo˛?C6Hw0sg_gD5?qF uYIю*t9Uw] 'cJ7SqBD1 ɖpLwr:[HB18'0囪 wclY,r6ڛIG~|K+~n_xҳKڮ?(~ g]z4 -ր[\T( ; g@%5hIqdZUE M‘d_ljm Xj9hFMei:݋L4QĤ5;@oI`WCq4Q e XR3ݙovqWVֱ!Eb.o+tF8S5u@ g])-D,GmR%HlZUچU,?k@;D9r\#EEzbՏaC ۹xn^dL2r'ou"J& kX=Ns$ݰer2sj^#/bI )e௥5D= bo^hbOZCe~g'4 * *E\̍6bJ%*BRyx`% 41҃B`DO:B}26uPUW P#Ik " =$ T]"Vz3,\2I&5$o*PGM%+c;(i1Ye5_ yd5 Fhn!搂ǹ)b5.9?gB>Dv%-o:5za m۶m۶m۶m۶mO۶{gV9_g7UrJ$(*&8N'TUF5֊JSR*75 c OЉ|WR d4XqLda= hZCO~>]tCyrLݐK{1S^N:Xr wÐpN+)AsZItYb#,A0_ڲ{[2aFAQ(PYRzRn7?j43bUI0`jА<R@uDO"y5ė.@'O q3Ms# ݂K7_E N*'/|* VZkc JF(W_\ȣ@BDg0',T.k9+;wﶔV}qNE>H?HS;U{Ygh <&6z5]ҊFx=ģ,A!]PSAnGLRQxyw]LF r<୏Nd_6$sZ|([5D*0D/l:y eύWץ8"X'V=yCPɻJ`b"ٰ"2+FI rcc$4[M?(}<xTҒ7 [02֡FjE7kj}pF9_/?L%O c7@0pk#d1`%{K ąT]A y`ӅY7wL7Qb'$5 }7xs/DVmG}@ދۘj ]49z5Tx&HT~na!Ja\ۀ-GLv+i}'.DY42`2Zd7\nN| SH#C_xOh%G6/2.>e.ȋG1m8#bZܛ"1JpWД!IeMT31Lm~WGVF|%u;o=V/=Ǜ8g`\B v />lE["c!߀S#4GJ]rAAdODiy GH}S3*eؼ2[S X*4S߰: s/[BnN+@-PSEˠ1ȭ&e0C֭=(0#RY[cv\2y't3a5 "R36O&]x<$.w> HԄP{Js9U1l]7_'[/_/:E6U "^5sݡSzSR1=82, yp V17۪SH1U{k!E]4 ysi^ ,.Q3 &}G)-2ap{ 8ܿ/E6?pLuDw'oHK0]Q|mi76Ǽn)ItmVm4߀,ԉfE %Hu a ^ 'w(Ϝ\\xwN dV|5R/Se^C3b조TpOg D@50ؿRvU 7걋 _q*C<ޫIh(ͳ44s*VDI{k{`#%%W Q:[QXVq\v\bR “(jΪ*c#7jw(햂p"T*X$ -d]-ryJE4P&!g7ꄿ9<P$&,cIr1A }G-R>1 #FIKo/ni8ѿ;Kc|;Kl[891{ Kh~]4\64W!n&,"~$GK$?$_ބվK^tWeKo_~i!eZD/$(syC'RG=vꍝrJ]IRL[;&)-DOdSy$kQ)0 |!;mf9l5RP#j#lH5`eim0cb pX{+c ġMb3W3ȝ3Y]u\t[;Qc-̫VDkfA' .&(fG%Ň!}[4<)Lcp K#1KptZ5$;ȘɣIꑰs(N/2r9wY*ˎ+Rt Oplؿm]"ua*1MUf?0߹OehgJi0bX.مIn̐^x|۝SBkkahzn)+y1h5Q9Cr4Vȣz"V⒗Qrd&w{`YE&_k@lAr-@rCԆcmh\/5snquvbEĴOS/d|A=S^'16:jz٢?}b7hR:>C R S}A*}`F*n[kkd0|s"n+v䷷I هá3=kh"'"uǹ!z&Ē[vKF۹d@'u0e{3ӥC̪wq|P|d[ ! ӧ .¸7m>E=O=$]"Zo,[%Wq'^Kkx$\QcSrX# ʀ+D_+ÞVƀM'vrmH|ptW´{yce6I#뇌ke$SpPAcp(7a@;xw0Mmm{pт#Hrzk0mDޱv l]I#@%rQ2щc4tD"k排#DIj͠7= pVU*Mr9CB; D (:Ya0M}.mE' )8Sp-׊tXa5NV8VN64E .kN凜jѨÀ/SFAz㉎<@Ou@iP!-={VMu%0 uGXQS^l>S*ȐxS*c#:ׇUv|(WN~s'r*vR\9zia #'h?G3Lsw`c30b{rS6Wlƾfmr-՛1ϯCBh'@ĊJ,C9f$ *"= iXm6hWL(O-l<-]S1}&$B52-G *RC|2O !ty⹢}iپ4yi]wV*`za11=1m[&WA8@]&0T/Ȱ`TyPlXJElx"SlX?u@Q=@:8}43lCWKS|Zl@>M:dҘ>A,K-tNe iJ|ҥmY Q`Pi,jDP΢'v'<%I+q.MVr^n&K=_%n-f(oYD $!y!=8ٴ#Sф06Io̅hHj OVɿEG|_{< ɳ8 5Nn ems"0Ȫt\*%sٍ-wNZGZXe [ϒdv%!růN]!I=E(t1Z57Y1E-&Li8tcd`_P7 CGݑJrd@Qwo͚ J;z h}f;Ww,lxֿ =OL3((޸͐,.FmG-ZN BpS9ϏlfjBTٓ S{Ίjw{1})~:r)QUJѺ)؎3='UɥNl0-lu,v_g̙䐎ymo1uvnD]"[tIC3i)&_ #5 =Elz: ق%4 dZydsKjvZm(vNd zDDxɜ23a⛅y)?(7%*Iе$NI~z $6Z(sHG*Nt,vrpp42Wn( .[$q2+K*M'cN*MPwASNh@;\dF[‘oy~^H9[ |ii^04c -Rֿ̽єi9Y+$V*p]U>$y;"}UUt"Sx j'NJ]!p)Sp6YݫlD?;ř&, -G K3.Nv\i(  !Dы}ˡ]eks/F ZiPUk7I  &ok'w)m+(vvx{ OjC*yf(Fֱa< g Pny} /Z?#a2D zmY19tjpSyrޙM_n:Eq)[/ڨ.'AS \ j6JUBUbF f]jHZA>xsRJP)] uߎ7RX#Ci@`&86VYV:lqf1 (w²*zH{XSkSX94jOo/rE P_ l}ny@nDKf<|e<\Z,w;4V//z"K#xBXěMn4ׂyFgdzx~13Ap:F:NMV}, ȁZGk%lk%Q˫;q0,똍f&%tӆ]?_]"6WxںUΒ1K턕k Oi~Y[c\V f ϶#9\ ?ϲ|L4x4B$͘X3Qw?Ԉ sa8vVEWzB0+r#DoGKɆ2.#}k:YALݎy5Eb`$M܃l{%soS!Jk dBY qfc1H|!>b2׬M*ʼ[ Z3D6B Ui[ _Nrڅ%Iˏ/̞6Gr F: ^fIV#&mIz۩(:#+:Ab"o]+62o`X7 aP 4?|&6%͙zkrjdQ/@%&'{9)"fSiڽ&a `x%£g_`OV>Uûd)dm}5OhD=婲s HTnVIRb#Ύ5ZIbc,]SMֹi;:F,дZ,<>EZjf $*<$z{X_` sʆ ۆn|m6Mm (7)E#-ZR! _7F.bS^cG3$dJ3]XhG.,T3(WtǭÃioУn*>e O4\24"ao+uT寪w秇Nn=3iu~׻ < OAo6Lbd/N>c_DϾDfzx:5Q3m&Y̦UpjuR Uvwj4l.co6Cd 3t/.i+gzolU~?kG5S lXzEa0$6ѩ@muYrD!g *Ut@f s芥2?*-\l[1}=rn IU]$Dv4ޜ<* qM3#V+0mYX[vy$V1Mqn".ϭLp$S<Ϸ0c]}֠bҚ/- -=tփf*Ni@cUyotzŎXDWρVݬ%Q=AU"ok aa5|a)e@\ݫpzR:"_wM_C94YϚW͝ #ȳOiA4鲱_@wxnNbF`:|SSf07F˕aJru֍=F 8ڂ|emC*wi=a\Yu>OK^+&޹Hbj\& Qo.E wF݀^&74 ٖJRlR7xxyY_*rsV=rڅDreup1oЈL:EV8 YU%߃o冽-96QE릝DT MiHi=j/BW i_;oa#HJ]iYa {3C7GgUh7:mP]$Fk6?0`b@*t%8H2M˖~BUv7I1%>a`Yn"͔WKuO[Gi0-5dg⺩/D3?ʊp'F6P0V1_L@ g(J/xĄajȊIȔXFc8դyK$(Wn7I%Xi"E8C-38ς>H- B!0h)<KMu!aoxo& 1HAx)[s(4آ~%}II ٺGŀŔ Pny_c!U24)YmlvF77FШ0su ܽ1n/8B@jn^ЋIADS乵;Ch蛶+"\J @q9 JvX&y" 7\ / c@0.*n6f=ԠJyu֓No+!bphSR ֙NXL:CVc +0-yK2F{3N0sD.uŝdg%ĵpLHyl~aT:G:dr^-ڀ(Au[ G|;[̧#fi-<7!2(z^x ;4?mdA9Vֳ߱[aT~2wRV{r[N*̀t\ ZGN)9v09,`T}tziC27Θ1Q_1D1 P:Qlܹo.m (eIRָ;LR~(naw]ct%}f>̚FJ n9AEn>oa T~{j-<G ei%{29N !BG|A?.yz'Sڛ,s}vN5?ybhȚ0a 34>gض;}ۆT32MvIӵD`@ru_@$ %n@rno), m 9I-贄5̷3 Gixyz6Jo_C,-mHy; mWA\{( PE[,I^ޥAYhh֚ #NXSzG}1lr۔Hn(Kz~U;*D d;gݴn=bCuab&}2_ N56[앖֥yl-f2{Dod .fJu|0 *0 E, 'z?1>W5U?}bcH4Np<Ľ4+Doix0XOA|!TJ~%]LGoӀZpm{*@g>$2YGB}媪#(~e  8j95,K/h|i_5Xo5 z9VTabm lxv􁭾~-L>txa"O{@U\G3ӎ>7i;(IڪONPxbP/tsMKxQo6|Ѐz!|P`Uq756+g"pWSo0oDՕC]MgOZ'}\57 ѽ,\n^^ *~N a̱Tg!Z)+;1)ڋ*\c0_խ{k!Y.0%54AM0l& Xu@nEFb"mJy=$[UFa=YV1t)\?Nr(GWfA~WYR}w5$4r d(<9)ޠÂQӷs%)Ignkİsw' vuztڿ57'{|RX@/l.F$h&wO1f1TdzU)$D^#qȻs[gPZy'B3 ed.W]蓃y=f}Ո0ɓ.늟zl8.&ZTeu^5@ N*Z2:d< =&‰ӏ,@D3wR,^а{&jC$: oԝȈVty6 /XF07.ˎމ s~\b4ꑂCS._&4MfV[eq@ Af1* 'V2ee{X/^pB"4E; }=QW^i(]GuM 9H1ޡ0vC[{ Ϝ(՛yemiyx{4,%Z$.3XUKTy_FS SfxZxւaͲ"6a pU*tPZ^+3Kphq ѥ܉֤9.$4_s^_LgI+8 Đ.l#0Z N^+ D g2JH0wH8eC Mqae#O@ hq 罸*E lEU-m> 6a"C+oՔ/&h=ܒu'wL<ctcA8<f MA:mkC?NS)+RGڣQ +`òt!΃yu[,?3]شfx݋6i<۰ԗL{a[RC)k C&tuBGqwho6٥կױ" )}f_8utG";j܀h:]&[fbjU-ޤYDgm4Ç i!/\ɚiJ? /1@ӓD = ?y:{aŋn @^SH =x "Y*J&CߘQc |vVIg#fkfýΐs<^|SfjK'bGU< BXU˲,?ЗyaH뙁YЋ /@(!Q89XU;߫RG)*U]bA J:ɬGtִ`{=la2F󕝉QOlr_۝D \*'=]1!gh^(cjnHN^qT!<{ϩ\! Ou-"yT!mV?隕kIYrCKtIޥk2/k.)1njrBCpКYi*cҷE2Wa`Qtɪ~VʮP wvdͿs_iStuM*b}kًp0!??v7ppl}I>zHI'ȤeRG) Md);7N5Ƒϓ #6+i#3!E1m_'wAAg{M-^|1O,mpqA-XR|P9{ 5u,mI|mDEWv-_?\Q4$C2iZt*XQ7:r~~jȃgSin[(BO01V.=m q~8y-ͪhlsZ2:$m.v=u܈A\_5P=a~lV־/kt(ɀ_A$JUѫg_s !ptyQKOv ׀S;*0G:;ae=)sjC7\6_[3& i _)6y|:O*Cya/Z~?mءȰ\#M'rX_ N:gf兇ũM;5X~Vcw{g5}]ϐLH˸Q68\ȕJWxME? ]`w=MKf'!RbDr%F=&oY|-_$W_YI5GۨEu] && v]24T 25p+P}sjW%< 뢽in(xIa~&,4f3cFա` zL='RWEtV1մXcȕcֈ&'~v_2N@+&R!;d[NŨyi@MV޳4~Q6_ I:u_BOYjE(Vett=# ,5 ]ND=ܷ*~p7`Ot9x"yd E'ZO^|y&1 uк3 fN<FA$׽/?V. iOSg,1b,\u)7cɕԧE"tR-Zn Y~0S9(biY4HXJ;~*szivw^A ;o04I]=c(O>hBf`dT:u%W뀼DX/;N3x%ET+@[w`ߣD{a@(Cԣ-'jkP;2diZ:&T|Km7X) q1 }'v%b( &\odRa5aFJ[LY.j^ f\>9]Q>v4tv#@_:7U:}fla=p qmUկ: ^)1ՖUB̾ '*jhlA[܉0F}*6q߉qa8b%F.5#R=9ߴ $Q*U <&^≔R>dZe[mP@*8ZJoт},t%.4;͛߱oY`e89Y4ػű أ~p:{W "?'m(X:Jd*q Z \aņCw~^˭:@y5@~SIi_Ff$^7HRlD/]uƯm{4:[|\m2^rҐ.5Q~ (%vUÑ\BzBVJwۭHџ@L ;i)GáEسn Joi8t~ %2ov "PsE6mKpM7~ɷ-5:}ݰ*Kוn/Q?,ȹQg.`D&vo1~o yiAb9 !0p|2~{뀌x*& 4N` _B2 hbTS +ÊqDGԪeQvnpqϧBYO(%/R ]fFZfá+Ilh/*9BIJnzpZ~'Z~U^SI&ɀ>\_d"fY0m``- AW#n / 0*cu/ r-/QB,59<^jӻ _l+ż@RZ?tF| OV`%w<Q|TSj {Xw@y@gnGjwg?mbAs9t;S9nnR}⋷ t&F%U$ ~H{lܨhV9b<ޯqA?|`C˪=# vԔu0IJ2o'5K Zͳ3ԦxfZNRea|PL mFh vlbR9(HlkN]-)x1pcn6"m?=Itƣw3F[~[ep· |קm2tT̻֮ZbeTZsDm2ʡ^땫xDjjXoP2( GJ; R&UKs#Gr ɓߡGRMi*ΨKU712y6}6p^QH:g%XniQ͐PC+6XB*3$>9vq#bg( &8hZBE$R9vDǮ1}0 q-w*;:;b+/1϶M.~~q<- mMuR_7UwvKڭ֓N,!< h$!"$;$uƞίdD˼yf+0QIUwk<9I b@9ؚŹҫ'Pq]'j1 ZvF`ns)2r{njQD,-y6kLӫzEӢdQJê7], * & [aZ_yF-wijXq0# u^o`*ԶA8QQqg"VIjګ4 e>a^4Z 6\(y 0swլ&h8Aћ^+B~L5yY0SYSJNȈŲ@JƟ-'׌0 *uCk[RNꢣ^~ܡsFfWNEpʟ% x%= oqڏ13>f7%Qݒ%h2ԝ\\oR]U-hѰwKʯCBr&\J#QQW“LG|(1/51Rv6ZQIB@`D㣹먕pUG*T]6ܒ仾Hh-mC9Na ^,{ l?b0OfϋTyƫQy4l3Iр<ԇG =6'iض Ť[*BiMΔ3vh%]%E 3k,hq:Z/|U,),xuݬ2ѠaY /` f}im%Jz=5=[kЮvo9}D;#~DJ"tœϾ_ٍK'<͛w>0 䙖+Jv,GF{UqY|J'.^qmҾ6_ۿo RqOnlPixW(nm}kqҬKQ~/8׊A U8sqd0`ٴ7է)5F3&vH1^0y.% wR}bRMՒɭ댤`fεߠhJ oԩ_҉7=G?֯jP]thG粖B _R{L}fD< SE*ۻ5(i`l/HU8b37>g'f S&a,}:hcް,ػ%׫#%< L7շ-}>m eש Mgw±:6Br3MdY@W0 PM_>*D=}XG 3'Pr)x;5|m^-Ƿ{Ypn?fX Ps.uiWC+O1ʻ k>b]PpZga<QkQJw5Vs*ehT@D*jy(k(Y`AHϢv%aoFPd G16:?F3ǿ/ [ 9R=J='AS~ w@KR״h4ؔ?a~ADF*t1<&]#K&'SQQحjy!muѪ02tMםYL|ꐬ M7TU?yzpO57|}=.Bvv%WKTM>E3R潴;U1*S*cEO9#7>LO%o\*bJAv<@PE? 5+Zez5OʤI\C!u؛ɹOf;yձWY6 8v\ p8`”(HS ]O&8kX !RtDN2Nҍ35?rIckOp񄙎qd UIޯ*l [Q?sgW pڦ?QoTOr+tPz ig ]/λG\(ҽ Izͬ˗ss-%ae ᢉDCE?x64v|9/A'Dc{f򱭨q-W5 9z5ELl$ ?a'BlBBwmq(_?}r՝,$8Lv6`/0( V1ftۂQvsd I}af%ݤb{ްJ+ltᙽ8gi:TsYE7i{4c"6/4{ųN].<&D%N BƍT/оz2N\4)٥@)rV[Y+n/{*un/Sd.BwksZm8Sg`Aٓ!F.e;[dMogqRESw{S  'A>W5 6}aOHO$X6J,4d)Q6[WQPB^q8)|Ěv}<4kDɳ&SP%< |+OY㱩 Bc7뗶UduD;ж1`:ЙS޽gt{-|2M䥏PTp. ߻;oh왰 ^YA?ʀ}TkLZ F~ѭ `ugp$Y Wsl6Wn tHZѩ&{p%pG~l2c⾍hM3hSYyJʯ6!{Q?4AOax3r_.clKKRGiGLn}|œ|M@s:RHT7}.P]WHGDbYlV4~nJH+3ӔE~ Ee_Jn\0s >NǙͫ`ꗴ.߬# Jd0_V.mH z rcBU)6PUn@PBe X{AcYR+iS&եl*@3y{|^lx\H+mͬq|c+!P98d'rsKaw!]ZQGO\Puˊm5Tw  (卵1B*W21e<_]6I1p^I{X& RlǵmRPX}~h _nZuADb3X"rSD$=Z.[&,\m6fl(LCǁ>Ӟ݆|ę=k;)|U929Z?^.uc7Q.;=հ8aj3kÄmV` ,*]j'd R͘l~sbxybn\ol@9hhLDbxBq2 zr^8ҠP`[bSM+~ p7zE.G1a9%4c?8}w̯L)h""){8$њX~x cцMf h {u^!s8 M\PZCWOr:/`,#Iц"ȅ4sT1 Pe3t7[El0 | Cc@l n Rq|r3u$~/-G"iCʭSӻ@^j}եr%&aT;gnhf[˩5~XT@6-{=&=KR89hRã?{b]Ʈ.{TIstrO+g3uæ>)xդ&rL 0ࠦc?/WY;r#OHv{Gr"- A|>ݔ Fs-zg*Bl+/7`SDSu$: fx>wHڷK׾P|qzPf:p#e==E_!9jx:H_$M]_mθ}AB+BHcm֋pFL@ZWpUizv& SR3H4gs`d[^)2-&þZBELx2 zNI+4ooDl9#'@)5-adkhJ- 1{I8wFJlC/sLۉξ^J'#ј@q*wn-BR@~Y-mD٬š2әT7q'/zz3`>2:,8795ϧtpDx@ @;@/鮄&M9M#߰IC8h#s)nS,ܒlzD[#!<)'w(a oᙂYv^5av>;lnu)1@MKRHڞ+,Xv",2da"C @6CTS1˺Fa~uט0+*er[D r,FbsuճL&B7%B}ڋңLZ)^t`5ڨ0X'Zy4z O N$#~1 v@$)?O" R}|TuL 1SH$0'6EmO},Cz ;ۀYV6DhR u˧bZ2q%X`JLBII[$n2{Fn:BEb:A^ş,ۚ`':v4BR ӷ*#`BV*} sCx ]c2QĺpOҭEc~ 9KNWq*7VVEx)j |zQ'DpUp~x870/a Q"RLI rێ rQӆ FCr}cI fVϨOG+pں7et*dQw ?;`זq9s ,:ĝ־Wki" $VwU=uZҏٞ]5t!ד~1 K<\پkNVb0n,>;>ps Sq \~_N|`thc(}hgabV  H[!c`hg[TQFf(m^6:< Ham--MBrLV\FSj'9Z.xO4B@%||u@Wf~{=_4gj2L~[GM-*j,裪Pa#]eڔuHiW1,IAϨ&-wO̭B8o;NIA_ՎM,7YPBez/ *lZP%!X՞{&9${SL qm75蛨-Dh(TR*yXU'8H| =R6OHv%>@GFNʌ3I~aIZg2q۴?#!{ q`~fzw.=kI4CkMfyhns+%_-*# I˜h=W:KJF$_mno݂Qeʈqv?Yq.89`Y"-f)&@]iDvYͺ;VEQ$܈hPϟ+[T>7OomiP9HAm OV~ػX5B*?kBGZރN)5}EÜ`zRQؠU/e9\s+12iK瀩V:>CLm0NV$ֿtϟ|eKʜ;VYC!%Z္;fO ohHV3L0Z,I2Il6yFj/!׺Nl,ZWVH@Ij_L:p44vd1Y[ S@Ay1/,t=:O\$maRHtœ֐7=O@`*1ΰo{7׈Ɲ EaUpǟQ;Tp>5Wڎ_~'2u=JGی5]Q*\d4f&Fgs=;_ &g 3v2۰q35nLxka2 %|nF8;#\Ѹ MhώU-?(d ~<.?;MG—zd`=kcNI*vf`/t"l@u iAqJޓ=zIA34OCXW%R`}*{=g9[.w/bm|[5k7G?p6J}$b[µ'7pT^lsq|9t;rM 5ڤYnjbB #b索"3em*^:M!(ՁV |`?tdY JҘ1.)@]Kbqm3eW-KV:2oDthJ.tݗ0:779sh2!Jz3?ƣ\F`e=JH( aEpoA QO7#rw~"!^X]>h`OҮi[[LL4j$$1]6w28Jᬃ0 )!sTrbv,6xLh]f)WJ%Ur_Fy%nGDvc}tDCTK#OOWjѴޔ2r ] Ra٩ϥ3j%6q=yec2vξFS2M& |@5Ƃ>8*ܿ)hB-߶hlҟĭŃs"5r^+'XL*[ʝo!VM%kz8"QL}05϶2$JZ9맰D6>3!z_;%d=lX%Ù`' HMj**s\/]_.3DF*msbY^ )$"]0RtM ݙ >:s֝Y|[N>d 0G; !-Y([GvK+w*;,dS%.PŃ/n<@"RSNV9Qs#PMxNjUf[F%SaaI .@Ĉ;bƙp_ Mnfѧ/4[m\U.ߟ!Q H$yG uXLK,Ky:%hr t`~gAFR(m~|]'M "pԘ{45 4v0tῠ q ~_ ѻ'[#WGκB`[ 07оQ%gvW.Jm\䮎;ȵ08ECl9~RbB:fg R)+ITŝRǼ;A,du3knS ~x^@'E'5k}gǫB j8uv P x OPY+wLD8UAt Lhhd^Y1N :Dx#gK4X c|Hn@dV`F"waЧb4R0ڜn/dX`Jd|Y?ڪaPP3h)`*NeQGO4[:d=i(ׁ@):| 7\* p1> .{wr$V!1Iɞ{7 \vX$r}zZ򹣬jt`,RF*ܣ{֡aԃGc3>O,;@gD|RjI( w$2@4+$8 "9~oO\6bd-*,fzf%+_+{Y b!hl)&4q3tk`Lxo{FK{+vGX.FP>,w:o{xw6І|;})o&^6of R1^$g/[?E)Wv 'd`n{>n[r\{ŷaayd_ѾcZZ_v40밵::鳂YIk"Shv`+4L9| 3Ji3_**V4Ur1~Ci tEG<^+;(PrW6ُ4kN<P)~C-Z}ccAȵwr|^JG@k yg"@>vetF50\M0pjMi Abr\%!B* Za9Ul`D`0mO2hC؋~P}6>;0~zF!Jۇ tRԾkriNJ_c/1NOpKvSt:#9*Q #Qu3g {V5qviFʸ,)_zm6,?4QƽyJ _`ρce/5;{eZ+I1G e(m `˩~0ҡ&Y!S'eԵSU \L j`ehS$g 1cKm$tb uvr 7(B8<zMܦ >I-qxc^{T LT`" 4sm6`FэV^ͬϙ- p8a/*3*~sQLgDJ_np=WЀ[a̟dg.xW cJ3)^Y꿾FH*zi^;g3V dWv-c?` Sd{OqYޱ+UlC0 8%cK62EK/j}^-U**]N;Ɗ9ى*KsdiV +2Rb҄R9ES+Z6ŋ`BS\F *xZHK=c\YB15` _ߕIKc>70 RN4z; CDg6ar-a#)x4{ W;Q\J; "KTNΆ:dΤl~9㸽L$<2Si&Ighvt>vW:<7A %0ّ#tpJHj,?{"9':Pi_7Kƒ7׻˒yISZBZ )XagNx%!&88,dZbKW=\^o7Վ #F6[OϏׁ أ,`עW'8pGoH6OH _Ηr9D{䧺s Lc_pg$ЉW|Q.=̅HoHwĥϗK?غ@ (`1)dH>ۏ`u4C;/JՔy ˤnҁjoaym{];j Rn ]^YQZp1mC e w<瑽`-O8ض[U/<v9xWv0dWiN)ȭ@Ui{ %ݹɃPmNFJX)e A! h2cgW\.)M[,u6̒x(%Ŭ8Gr`ewK/W}XÀrWii?m.*URfщ,  'RZ`~-ߵm9#pgGz)% b/*˕ܩ"lx8/|s2i/2!3OIJwe׸Oz\.p%s߂LÝWYh{_:&_?w/+>گ Fڽkg <QnBmt=qk1*rV-WH ИWTzG7K8f6͝H`ܘB;U$H&p,qyDBAzYQ?feiQL,](O )S M|2g41]M٦3Hg)2CAd4dtm/F -w#h5]qoV B 0OE \:bOI5]g\s۠p^ml3saVti+v ؜GFͨ|tDבi!!Əj* lR%j~]]Rch>V^u Jzճ=ctė4Hd8дq7_NsB?Rȳǿ܉l՞Z[IDA4 ^m y4{5y{ Ȅ];ep[N;?wB/CtQ_g Z$Wpig|IL(7 7jn&j Nŝ$(]<@5o1;^}]ԪN)sCݗF tix W5F *<@Q #',$*w#"o'_ٸ&ye|t+ n 8n V[lЋ[;qTUYT%HYeZ> }LkYG+;E\Z Tc BMU+iZt$CLL!fo?t&' @#9<#!Z\GdU_"rv *7P[κ ?8{U xwH^L9<)TjqcD)N#x8UjoUn+Ok` b>7Wcu Z9 [U~4c{QDYJUc+.{~ZC4TWP,|D5(  |T>$Equ|LG'/g:([1w 5Bko(&bL6@"p_ Ѭ4}ZKGoAγyuy)O* 5+>Mt5%Q9'N^k S@~ Ҧn*sSog==2ls Tb-+}g fP˟<=p0ivMg( endstream endobj 361 0 obj << /Length1 909 /Length2 60279 /Length3 0 /Length 60636 /Filter /FlateDecode >> stream xttfݲ5;xbض'8vl۶m;ضmuy7sUUs֮XQ^(ngL4::[U pSKg1_F?F9U)Iu$ekf. ttP#N pڸ(oliPuq.haiciod()mp5:T?vfn;WK[s#P3sv5r3:x$eT@[ @ܺWKg*t3;ylM Of0ho꿜v=Jcd-lDxT7PCRz]xD(nBq=H8l7qU q[@[E:~7Z5^OAgX6ܸE1 /4h˦oB{>֨*ؼlVFyŘkٰ2|T-ʃGj"d {…s7?R͓k9^ls D,XJ(lzNIŽN3Sq7uh]gQby>J %rģѰ4mt.H3#K_/+YۀW@7|,gOS[Dh<}~s2l{N+I]GX5 8`.d!8 hZ_w < '#煀ZXm?( xVev)fT*E\E~Wn%lxġ6B) l0 2\L 5 [2j˼ԑyZk)DP+ƒ7GC1XO>it0D&c=R&,r:#;?xf`WϢɔN~C #KV՞pz,^\ǨJVEMO'a)m̜~h )!2,@ [VrCT$Wo^\Rx/k,>UZ2"{wd- SD׍2piEaW$ت}X6 IiPm4GBRQnx3k$ 4qğPPbGG-%Ph%ffS}zdN2قU0{/ %~4gujC:QQ;X|ܶO< XqM@$m 'Cx'T%Bsijj4!禫\acRK>ҊyC7T<DYKjŝZEC[>5n4N2ݻܞ0k;oo8 RZR"!W>(`'P~wXĥOݍ-n'd L;S׺XJ]ם-JN6,v6H[&c>0Kq GO|Y?lW/d0N;k,?(<ߞCeb&+t; >`k+Xgoq}Y?Tk0UP_~?z?[I$om }? ~ fh.[cJFBچ' xW#ηzg 7HԵNX񟖫)'i3Z2< IMh/8o%O+7ܯ\T.lH<gJ\/@K8dTT|AwcȐ.cTMOa&#f(  f\:&Js ("aI}92v*N6G:';]N56'c|} SfxSUe]59S=`VF}کobB~tL)w gx `h9K=)-n0&wi## $"/{ 2Iqq^S3tݣGMeҞ],>^yXe1WҚЎ P7-)^rSSپ['݂S37*|:i &u20suχW7RJF>iL&}(Ry1M#Oܑ⧝9Uftb\jYl2}[ˆAZ`Hvw~:z^Pk7r)̠rwe/=? |d.R -r4iU٨~fDfk0PҤnp|)4F e^ .*8FeVk ;O:KH4~|B#Jf\;;\~ NR PAb aIP]ܐ#+:Pb|vj&F-+N&3aGs$*_kT uZ~nX+U&zgg .2aܷ$eTRœ[ɁnI+ "A9;S5]Jb,]3!ΟQe ڵIU!8 bV-Ä}|^5ܞ[~|mJ˜ .|?+bfID)ivdr()d&Tdf(,Kt,9X [V=r0H`+TnUZ!rxJ#v ǘh!Ɵtn=ueW]KR%M7هۙ z.W|C]Ɵ<Dɉ-;Xkb3FŜ4o>>Jl?ҭNy6Mӫ+Z/Ui k *Y_o*40Rcڳ=Lq%1^9*0v.Vk$\oG< wm^ .3 ͙zÏү_獪 K~Gwh_ vm^J~edY7f;c=q); x:ZBo[ ]Տ .sD Mb>e-Hs;4%Md0hSwvijs`Q̂Ms|AOb;PLBUqM:W]as|qXkI8s.I$o(vk%>! c>Lř!  ݌h hp ͌7\%.|7ŞӞO(g{%k~ŷcjrX1^WSn?IjLJfI(}Sx"{}$ڊggҹKa]BE3%.cp,Dp_-s\l!_y.S4tG;HP% (R,-x}В3X ,ER7t_ß@<]򺙥M{R!ɾ>iEDf6jD; =-v ZĬLW0:r.%cFScUDtG2Bb[4"l|p,[$eᐥ%VSGT3U` -'  L-)a3BVeφ?=]&BdRAqfpf#Q03a)ܸ 9$R0fݯ3 `=dkǂԟQ. u| +c%gXFs6gY6x:[}j(a{،b_ z/r:B๲g]Q<:Wļ:M.9Ε<Ə6Y I]ңP.ѧAߚmƫIsW/9,W5~%h- .ωɉ=O]s3m?C;,5ު1';kҜ1.}t g',rNrK-Eݧɷ0+ x?嗥G݄ sM CCESReV3f&!M~ב)0+'ݜ4@m\:nz暎sEs_)2R)8D2ߔ@ OVSr]r0)t-O2u+>:Uúg!vgXjEq~kmWZ0ݚ.qRY.G7@k]&ľ`F $s?7,'"<#֬yg"\F$4/Q~f u@ B5uy^cĈ'F B-*.Ez\i Nթz+8Z3CQ|y#=shJ%KA2ܦ/V7:ͱ r CK٭P;bOr) sW]ʕ0 #iBh0ķû̻؄3Tvo<4#nu }gS-~ Z%Ӑ{h.bSz|xۼ \' \$ kW&،8ꗖNt3\>v螎PK,U(l_fuJt [D- *Vw\$he.&-\ `i0xĢZjMVdHl.+: .r=yt)K#r?}?+}T5Ef W Jg2wY"Ɩkk-/)70 !cT ""J\>-1\_.tD-LXX l^k4tɆx ,;Ŀ^))QSfmד_"our5RtxU^nE^ ?%˘â2_@𲍱vɵGjY gpdb f8wXAJ.v3S 5My\Ôfk [<|mLDq[t0?D?D[ilDE7awAt% _e"_%H^b9v<>>h LWw9j&TfRK#cvvN"95+&LLw 0{)' F$?8DZ30?(~ͦH*/{B/P3\xjzw蕋r#Ma]ʼn?I0r>봩K7L(gg &Ђ?LS3UT;0Tu4H2rjw.?ڣ`(|Uxs߷'tƐ%v*Vuh{DAČCԅA TVQ8]0JϢ&P%-}EAѼboʴjj([D nfmGʋD(v}"c#Bm.Iy:>3Z:ږ'@Tv:$F9v71 /E_{şo'uެe̸V"qK38v5_!-XպR- |P^ccS0.~c*]*zWн6$V4V$\)&z(}{z(61׋/puGमI8fqCq6#J76 ` CPo()lnI] }f V&tIZ9uY ;ϳb_$7;xϳV%p^}-̥:s|1?DeU,EH`ܠ2]- ~[vcȄ[1C'qಂLҧVs/-/i ]n3(1 QIOF-0{>X*!tbפJڴ~ٵHdKM``O"eg'5quyZqaXat(+.}ܶ/U JG)h==tݪ.־ݞY|yyVN˽[oCH1G;?VvޭU/TL?V=CQW?EIm5n;´IDx5%}[sba:PМm S^jNxx_-~hE˃M1SP4[()i4=nذ sH:/IV^Gs Ӻr mx> یKմ`qAH~$sYK f܁G a*%'wӛ휰=3M | MVqrhck2OPxg눳c$s;KRlZ7f ~ .>Jޖ`7"[ϔ3]mX8,T|rK YY& U ^dS?d8F'QLDm؛+,[l+o|kKZtG2󝤥&ZPx2ő}ƩHmdmsZ3(׽A=A*MFwM1BLO/o؟mNAYm?;ΜwnHFъ(T5\O-܇L$-pwcr{'簕ec_/'8]5!\2ɚ)/v)*"t7|G\԰Q)<6B:Y~_^(~R)Ax}̽]uL7'Q1Yu ECC~ʌ=j")\zZUnw#M\N#㸩ak/GʺkzYMX/p" !T?p^3.Q t-&fOB=JAVq%#!gtKaplXu]+6xpe`G\ 1rh3Ԗ/P!%]氼&,WIEVJ41×F^w$KK5/OG>Fy;D02<]Ɖ1"{~u'f(oYq -ʰˀKtskj`4$Zص2b{l%66?Oǝ_ǫƢ\ˇm1+_aKsvaGXR;?f l ~v~"7PW*gfuJ4kdӵStD]~X'[v;t:O% TE߲ J9(_mǵm_wI8)"qeZ@³<\Tw'Jha6X_ 9gJ *^񃞎UNy"~wܯ*;(7bu2L;:Zr4S[BbCdcv9"h\ AΣ*`4(l'?nb &ҀB/ѳ5zhz-0sʹp7uPC %76x?ԍ%4!r\;&{2U4Lv>{cw^Eonc-<;?\ХzKImHZZ>2v>"XMt<33P*8K.A,rNX0Bh¾TTUzu !"XFpS }K\>0F*EX(ڪ z'7eF}T(E G_PNY01>m:͊GU@gk\Ს%b>ٽ[6/Fg]zϺÿS7I[۾JKL{1P::^Ck?AչK&ẺyJijZm2ub;48uJvv1y0K>_9pOLUSh9g r"\ -;zJ#}뫵ĒLa>ndҾs3dFW$Vp{'dzK%zsZ~O-R%r;8dzE)*Q&D ^$ڶ8/^>+eSk2nK p [7>x (싡pPArW+rK1HsTQ,׺].b|ۇLr 4bʾ֕ɈRD "1n`(%[y aI$*.艠 7r{\t rUDx$Z,TƭrST=-2vj2LЛz`A~P4`eևJxGHPyPn/E\yWc^Iԑ"<&rDgio؀!t.LdM? 辉5<[wsߚϚm1H[摞)+։, bϧCRdm@-<8YX|^󅣼yV%v9|5P4tI-|c2E}$N]YM# T`K 4"AN{!=Xq$blX:A.Dk[K b5|*muGJ$CQ t:9`t"p$#]feݥVIm7fjdtdf츳iT,"2RvXzd\ʦHϚow¸gi=M rp9 ce0c4`t&[AE)pb;L„' B[~i)/{h 0P;4DfƬU{q.Fv+qԾ+{iX1z7&\$b. m{郭[tPZ%a}lDۙ%Mol,x8^Ñ o6v!9: S9r }JZll"+4Kx+CM;鸯Wi϶żԵ!siU;„賂 kPm?Ӽf2ђkJy/K(°dǾ/tϴ*,FC`QY~~:D8rCԚaB2r3aHǯc=<h_Ob=b]x (9p>f,3 p!bfISFYQtU R;'䧥m #TfB{˫Ǵr$ٰ>PzZ;oM#1FHۭWji ,`[{ݷ j1'<O&IU S-6;2>`$ = u3Q#Ij&D3@ ztX.%Xj)MC'1֨y,'} 6^V:v:Rͯ8)*nc&#~_ ͱl+2h!19[AC ܡce< 17̓XkvׅB|,ی;KTB%*Z9%o\v/Kؙvkb)ͫY} hR#귭=KΜvJ ÆU [ri˦*IN^קYY| _4=v{ԂĕqlBօ2]B n{0+9R&D~Yk;5V&?܄NwRO\Q"ss߃[C΃*_: qPU#L~Ճ@r_SjQ'lY>G?E! Ji4-i-7f5wT'q]#7BQN|JuMmK\9˭.(eت JPmFi핌?VܹHw#*pQ4z~;uCܣ$k@b#E ?S]r5:.¶,|3ׯN+I(~YDs)y%8sٙmVL+D?PQ':UNG.?β념v5$`qQ)l}8C/=|owDVky'k`WB|b0awH_2(;%_w*l}liRt FɪY6BjB_>f`p[BFs*- pO c]wѠ#:f&[rKOc|v([|w\%^ãf:0pHtOlL?l2d)k0&Z~a&Nvq) zz- 5L9ZMYCX'G+y^>OLN I]WTbW){oMb Q2}2 e]Hul7{4 'B텄QJt2G8ˤ!Ib{2)Y-O=pR_Yo5?A70`f)GޢJUHh}s|ʑFovHEX0L!Ħ&%ʇiR=ט2rݹ6?K<o5MC;= 9;Vb;\son A)1kY/޻rM* >tC?#7AnF+ds+Ƿw-:kdV|̥a57s^ ?;mnceK m^*UVZ:2q,=bh69k@ uv|$_ `I|\aԮ|`'lv' = :޿6&lޕƕ4HdPAXv뎦LG;r6򉯫Ti)ó~m<1ٖyIurѓDrж=/9Q: Avx25~2S=U.oK¿z1Ո/e%U[8ů>̦u(#z q1P*+,sPJG.jٕԞxPB.o7r#8“{Z+e +ɹ+l]^橸H5]1H@D?Jd-xtX]TibMOR_>mGqXo:Qc;ʺ5xL'0%~ C"\ӷ)X5|YL)ʖ̹ cKj[;e>j1xW~e:͢kav 0L fUv '9qp!lto)!όkj+6?Q6Tp=)q5!1zҿ$r>Aty-r+9a t\u\5`JM mqqNK>m۶m۶m۶m۶m۶m߹3JΎL< L Qs8rOrPdn+`6.81;tp21H>R\ooaT(ciC.޴?I '5tpC>SFPIT'ꃏSMPBύ=S, /Q*,ylaHWZك+{!6`.(.a?^U_!c#JLEzdD4(DaG^ʘI0.Vo~- r`e 5ЭӗOŒļA^c-'g"fhhLX4E@xfQ(S>YcoN\(DhI׌+(l:'AU{f`U5Y[Wϳ7F3LufNq'7a2 8}Aف{A?GapE}Fיp3:E;]jML n`Z7t)s +do۩L t$'ˍU{1~ŃXyeͳ@|%A=%(%a(Iemr'l}%F\bqAWW}'燆+^wtq>W9=9pS(nl^+L&ϹrM;V&Ẇ# h%=?gWW d`D?;P.f6޺Di;x`1Lh8N:^?ڲDC9z~Jbu7Y?sZ8M6 TKf80q>0&Lgk"W\+ 8=cb4 Nˈ-NA8ҡʐV5N8~4𨳫HXrt'dA#g,K[@W+.i #F f>jfr t>ƙT!om kBWaW3f{0O%,{\~tUTKou^S#qK߲7DaqFw?ň9 +sPLYoHrp.g#%mU춆';y >LqC{N9ϕdG㺂uA5jCMcxXCԏJKg(^s%1htQp3?ϕHn#GvJ &KVk)Ne@sBK@m3̟E\#1DE*Ibԗqv.I8{;0U.6n5b:ucawk% *mDpuv5(zH;#˝H9 +!)9?CbQ*ٯ6A%TyXUc[d]:z^ l̈x𑥘3Hy'9tJ?-"+*8dFa(יL^(3sZEiFg0c4^vtarzmnJ]{%KRetz(9QvPdC9/%X @y/ɤs:L֚C(|B$$nZ|Tof*Z\*w8BA.P/$aN8uA[u;:H>57P9+*潆[zATO'sww-V~ӃE "Ƅx'WQ%緰˧b)?paP75UR'E1?y1ʷrN$s%;qxϗQOv4[S5 :RI2fW!*y#z;X,"Rd**['))Gk{Eo7 u:a꛼VVJ{G^;W7 6uu !\ez%-eG,'ǯ=&Ճ?ETYl `\fBd],8nr[++}YW]۴], VM9gs?iҨPNE2/30cDɫJ%YJI1r+1E_ҌG#<:ɾ⼿$҅@wˠq<& "o;:s3 mŒL zґ\mg-jIQhm= f踶Tm<ȝIUZȣ_ђ~X/wic&C7F*}WkLnif.yേpa) F[M#C_1/ G}!-a.3|ty05F3QȔ&Ɵ҄z /W@sg="ـPcyg#z+4p{OwɶŕIۦadAN%J̝=}.hC_OȻ,o빏L*mqX,ְM/\| !!)10 cZf(\ns>(wTm;ID"P'|kah~3[˯* 8aJI T&Jϵ{ Cqf)2yb;3^ʀBe, ev~sq"jx g `<Tt.9v7Н8<թ<'ZRLt` zHUvymdTWI?NE~5wwWk%?(ڥFfHG$^ou HW𴃃Ksîx{=BòG˵a@r( @sv}qz'C3XYJi]߀<+EԤRcs,2;1E!Ny/b)˓[4v0܈~Bv`H?BS26: HU/ӑ*[4߷S䵱e2)>æ=4MDc&j]0s*%ҡ27LNz R,Pac6[pcTl [1Afou 6iȹNCtUF⇜(6|tI#H*ݱ9TwAfOj EĂSqHXwy{y>Y,{EAi\v`xԥEd_~Q@mO%DJ]vT#zTfowȮdA++tEwb{ǏM4qo,{:a?tt3pkw1~w:u mYp [ND miWܤhKSdGp@ZsH`8e<}ZF CYG2;KQf5:g|CJԬ_ő?I[32Έ z ]@@[|d}v P{`/IXq~ma5qcAߦPxat2Dp2 *u3kFK10>*5-Xn9oySb .v}nλZ+E'1Pe*Xq<\5VOƵ'wz $N4K>:s!{Q"SFnf}أ`}UN_nV)@CNt+eܒcgm\Fxc i Ek?k H_=1'}QNG ZS"7 L={u]0nYqj 9֋޿rr.v-oc/bPUt>,]#6oЃ_kT_ҷąY`Ho L\O,RTS\9:8Ҽ]\oUxg2:tSRlSiHhmmOVJ#7RWfڃ"a2CH o OA~8puĊ &]3S]֣Rү2~fl\T}߾Eg[DbJO?Ty/0]2Aa]P4^ F?> h5beo8e[LO4':n]f-5׾2M`ʽ>%tv %>S%.9Ktp[U@ջ+P>&r&4_EM,]4Q. Ekr*DӞ5m# R-bHOg:F_L'JGP%DuDs*?䎤 Y& ={*wr|iLAMq0avc[7N^@CD lƬqK]HJSSu4|jk ;naLB-~GN.~" ZU&#"t-1^HjlŞNS83[-z`י2c] 5?'rUF8B#S *؎Z6Qw*twGR2ghLh)!7OG]D"یVQfCP~7 B%"퍭;i^T&lYΜMu*j1 #m;޼ӈyl>.BV &~_R4uOP19Ea|) U;;X< !a_75Djyϙ wLCEt'O7t _?`K|ؑ4E2ӑ2fCNj"ʋ+p&E4TKTf \,8+%J͓;3?7]ۮ1h]4)P6/Y^*Ox JS/bs8@`,=zn[.-8^Ռ刬=p|ƏmwӸtcu8O:|đOGJ8(pG[ +ߧ8IV*dZEL,C{HhQRkG3,̴n$&ASe+u!?:.E{LPCF<'&8l-V);Bȓm d$I5XieKwʨ ԖFmYJ~ /ŠP Lۍ{i" &¸VWRy{ٌ~yjq=1D~[P&kr9PB4FĪ}iR=6asox$Oo'q3|:/,|7dHcǡuGbC;ϕ,2!Fx[MKXAI%~c-wL̺U[p).4 `09HLA`س1AܐpνmW5Zg_2}|I/bs\dY<.UDxxD$X6rylftỉγ7@Pٸk qyEme.Li67\ ͹pۣԄQ1N,*9+N`bf1eޔYNT yNzr@Yow`8GL7eVC{*uH=}웱D.֡H~H+Cq; o&_}!ʶ |n]M{ j`` O߽7 uԤ\&TyVpܾq]9E2ȇ+<VsEPy*5.O aFU]1IXJA|(Xow(MEd]L} PUh)g]4?lQXjk JWXZ[Hό̡Dqo(;E:z&ezz'~ 9񾒚Y:k%o펏Iw8mCs^%O"C\`]ܼ yBiZdEB5(#L9 #B8&lp 6RZW\Nȩ G..ӱh@&Wg/r>V  T{jN$jkSB6cX A>ڞlz;,[hG8N;wxZ)&*R:泛Dj~)'@#"^eOY$RisBL/iW$?0!Tg&Nb x=2 ~n. '|Dipfk±I}piw)[ z/!\h`ڙڪ,~ܞ}m3v";w@:fudr(HuʁIwSg$AM%.|Dkh!UI966 /JW h/xWP\h>,SЋVۗ#Q>4RR"AwZX @DAGx[[S[;G+',: ʱEE00;B=]͡x+%M֣#t1G׊*p! 8;I<s)=HH*_.ǐGHx!N$n COvHPx:}@`8љЍ[g#&^k?x/e(SERQi*fۻ>Vyfc`_&7ϣk2oypuX~Ҕ[L\D,@dFl}: ^}A ?+I}f[r76}&+~ӳB t}ܟ{$کcsș!ZCR\5GH079s˖enFjS0EO>_$4YfyiߺApc\|s/ć t0+T1 یқ\ìVwʓ)c1P^fx;]WJq#&Z6>MIR2?>֘- u80Q(.A"c QL,)9DUbzq v0ET‡l {[)i qcV~֋E\K?97mf_U  mxjjDA>%G3/<ʽ߸ʰ/ח[ Z28K_0,YAbYX\Rp**ьL/i=t5&Hzh!'e*K 2I1A&-)x* SuoQ#dkm}YջSw:uT ::*a PHE}ʚrg0҄%q8C} |׼]?jdǫ',pL%tX-MFA2[g檃wrVϿBu Auv<_)X~+Nʷ^;QVä̚)t3iܦteO+dP.,y~7B~1 H!'\<BN?C7륄%y`NssAޯ> Qd7k#O9QK EZޜDPfvK3Vʘh[<4P3X[s>%7\.,?Ο zklFjLg+J6zLPӤ (Qp? |hgȯ"Y,roQf9eudbq+VethD>lM;1R_6l+eJx0iK诚\v um15KEoY+.8#5A~.n [/}E^h2{Von :lokh,66]ɸiK[l7d@B'1KE =5^|"_ow>]xo)B 0Y]/E6{DH?#kO{6/gd̄HGyLMAWV`"_4 pdlҸO!ŬK2jM#۰q&1LzV 3<'![Qu:QQ*iQ;~q#}=NCHFKNrNNwNѸ?9n7u8G9l,%SpZ7~hO# mGQ@lxwG,7ZZ z$& GC>y*_n#KG˯)% |f)2Zc'2Ss&0s͂nOdP2x#rMFDa"~>rk#]P9[rI*k*Wi SCOTb+$wB%i' o|^rJed#OsYڈ EhUN?/Ҥ)iv,^XbIKFt#V<(Yaۺ)ćKy&Gwe,'w:?s7 k?NrԖu*A"!Ly{ Фjb] o[Hz|8:7C?K XS_gI ttvCv<ʞ48*?YË߭0-a%0lwkqO-FsJz1lsmprB^qnQaѰ8W%xɏ%e)j pHAhΨm껐D–F-بa:餚=(-I-(ލ,h-vj];G0횾^I2ˍ˸btWHy1?S6V xu_r!`fؙ4*Xvu|1urf}Ɵ/?SL'ffrwP |QamjoHJUyQoo=q{]8 N7Jn5J`K&T\7{5 D sp}FUP~_<A(.e'=^WvqQä>sB/PO:Ү܇<dK?z$JT"xb3\@h}_ XY?XR~쩿r}4ؓ;DD.)4܅*tRIre+6Negg^_.5?e@sy I@U 1sd2x"blʯ 60 ls3#kxaЍTBی '!!kH5S,eϊNYE7+fƲmr:Qhw5jz{0bv dS(#+|[Jʋ1uYЧʀDֱHaB:sUH.QsMIN8[Ni2g_VDn|S/zCY {MHgP~cRS1Bz\bRH\cz2MAշP`,*yQ==P4jI,9^<2g?͋67nM\ny/҈l>CRX ,sb/,(C:#uZ bU8R>׃[vl FP {Ad!Blͧ[#PUb6$TF4p{(cn&e 2;1$!{~; :@+% Z6 70񏘛0@ѠH Zh3O܊,FfZ1Ad%Q=Ex=dS|~sD4Oy!B,S@UW^d5ԇAAFh2 I!gir@\ *H$qxss/bo-٥幯Su|I%nɰX-;Qa'Zqa7ߕ8*e2=t9M#e~YFP3ٝHyF^Q& ?jɫp|Bk6dd%Ҥ[ݿc(x[(&fuHx7ڞN6_zA;kP:^.(z7Ej{\U:U}FqyYVt&SuZ:i,{;yDL_0 vFLM7 K+(Gٰ!ޚP$x^!-KT!"ƒWQ^`8Gǁ9jWJEXyvQHЍʜ DEW& v(;qzS5a~u ɀ0m՗,[*੗_&j u! uؕV(Z:':%If>vde&$p7^w$VIѹSw,+t"q NdKEu JZc?kUE`<Ĩ3݅*=tFR>:z ռ h\ϰtm~ 0m9t pot'摺S=ͼ~_ Nka ]1U!& у{l%^~<\47E#Yz?f-A)-tTf QA Y ]6|+C&[xf>O-^teqCv^4 1e+7hjtcSBz{]K< 1g[pi`7N[Lu~R|zU YA_H//A Pn^daP(~qĴ['1X?>ƈش%r.Zp/@i Yx'Xbn%1zw'>-m!WUQ;?*^>ύ怬͊T$ilOų#}o3ߘĸ0& nydy 1ص[EhPY&G%'mֶk̡B0n6"Z@+X^>&$hƈFR-?UQk쌎 goI<@lTƝDAN^Y7BmjD $O bcIǪ~rlcy­043G\^ԅ{6SIsi.*# 8כ$Ȫ5yEF? (pRI`/"vs.\ޏ.g/ṉ̃I${UnӍl aOӫ:@+[51AK\MJt+0NŴjsv / ;VQQ[Q̢1lKYSDRT1Mts#l`]TB,AJyfi |8 9)՚#>3]z_|)fGxnx!,P⁠*1JAhDzqp15GJwY%^bn,Y\A{LwsZ ' h!sf8e5iy{j!HnͫqZz^}y]cMտeu9 te_R7V8oLe}1qGPԔ-gRq>mI3Ol; Zv!zP?.Aݻ(bljIFK>Z#:6:Th0v'?PGg6xAa.u^m{/9Ѣ?+$rQL ^Wwb:b߈_؃>Vx)i֩|x i ɹJ(GPM|T5Ư052lV?L |H3@;h(҉h?KE3p40"LZij aTZ M/1xN23qlIYc /ϸk,K=6]O*hGCMy{O-򩴯H>f#W)!Lִgϥ]FefBBߋ)C^ĥ&ij1Z TXVE\>-DgЙHq0r9`~o~U<8{s&ڌ]y9&r:= ψZCBgtdg oHFG^(z ._7(E_P/hj5yt"(n Xe?9QMvU7 Ms~'iK k/.bShkx`],Yِދq2􉥚m\U(@H|>"b1Ʈnu$E!6FFwW"tڱ>IXsFhɵX ^h@7bM*KLthz_aG@t[b׵4iB v_~v4M PZ^sU4LN>{eNWyp܆>D S5{r10 !¬u{JExId魓Cr=sMYl>7n [#'*C,TYnv)J$/`7X4_c@o]d eX=n}I0>ߑP2v5a_2eO2  ֩28M~]Z 4_:JurE1:=98~ D 1jNT`vP:hnb qTߝ|emWY#>LZ:K^%dw ZIL|1Lf73* sd^E*gۢwk3vS7g }Om33Lfb"Jf )&A3qr~ln/,Z|k[wADkP?rs"HĵqSZ'(l $@$iwuk9៽~qkCL'Jʻ)pOxI\W7iMxZKE[e䤓YT⦣?)ӐǬ*[D`iŰ}rM}- 2q]2X @)s6<6٭({22]$^?aS;DzZŽw?%_xub!()&#RJY[T|p|M!DUooʎ)xaԌapXT`.9Ϗ @ei䦽!AUH FQh`fZd;Eq䒆2F0 +9_ -ihA&Kixqkaن$FWIܻts?G .-IA}_D w dڳbˈR`(dFr|/P^CTm D¾I?:}]$n7!\M_894Pp"a:D!=fB3%rDXͧԈ䉱9 *_gv_  [asO D #uUND&CI)lV;FH/cfǢMmD]SڷH Uqj+]$Vha&lUYj Y޵9u2_3vʼnC-5)Ţt F hlr? Ēk`ZR>Y$ km۶m۶m۶m۶m۶ڽuC*t=mW^9 mJgaǫ̯H<:V UHXB<62'2ch_ ]/r_PE,VۺmB{:vR9ylBoL\WCF4k;9WHOaT [+$N6FO3$:eZqys Ik(Z_Ԉ&jP5j '`ۋ9tx";0܍r/9dSk~G;ɺoaVc(m\6|~:RÄJTVW[NQ4.K棷U7;DW @K0+B&:?r.@5W>19 0kGw%6W.Tg瀳s(n9BXm۩\#.NkŗnӈM]e$$`.(pNCs_,f%Ţ35E,Hw,7" w1ĆW\dkPA `⊗~INnЈݙFD$%zO R ,?R泖 bT {=?mg`0Beڄ`5adwUxOn@窛Cs%-* 3|8jK:4glxaz&]+o_߇# tHke4mU  ͬ矦dtLf>d%{'Isx m ;sوLa?zˏwNJ 婊$X_S5Vր] .W3蹁߸n7Ͽ`+o|ɘWչk'Ѯ98mZHNpfՍ7RqBfQ *IvV~0\46EOSŤvrHۤuyG^,Qb͆ﺫAU.VX,yE*DQp8F9G쾸GhIf*I˅ovN,) wX"=ר/AbdXQx$}oJ̜wұO9 ?uTjq=!8-YFG Zl[?b|o !35YZ;FC|Ǒ.MնLr^@EO"?i{oq`~+x(ߖrYU\sTadpwf'7($"dus:d=%/0Ι: :_[lw0Hq|N }m0tF- ]V+reѮR#BJ{ԕNhzԲ.'f^wZ6DtJ,?)SW1PuY=zD~jbO#&Y<^.n@e=ywqŐzZrVf)KOe E˂Lt^GM:Fڇr, xGGTwl,@i{7e} l_Ũ5` Kiģ\nu퍘J*)$͎H*KFvz8K A xm)1hDΈr Qs(лyG Q9B#@C9PAۂb1n|ilOlrt䯿)4 jniQ@;n2=8 _J-e *I?M* oF|رf,/Ӝ}]@g&/&:H hH=+On{ q}1DOB$ |{O3UEó_nIajɺ^B7m! f BZC\F>{,j=50~ lM =YժgǿKL )rhIߛ1Yt }P5A5cb J/&@@m^X)DPq )@,֣u6nv _U! T=43r؀Te։rel_po`|&Fd`Gl1̣H 6TE/ Dk_rF8 ^zh=Ԓ(!:o}{`V+j1mvsQ<yTPBb>gTuc~ K%Y&EZ ^鿉D3F*Ud'e\0K3aSo!PSR j*1f/υd"Pe6/ox\ONVS("PK_u֏\i 5Sנe3&`')XQv`NpwBA"@,H,$RXi{m(Ip<ѷ{ɤcjʇD94%mQH^54:GՉo NA_9-ulR+/1ф|MIlª_Jv$Ti3: =-3g/OM7=Ƈ{c42M;PQIQ*ל 4^0x{Ty%eTIx^TL!5@D O(!7:FL8NC(= ŭM~V>evLk+dt~lݚa~ (:WceE?>:"Ԥ1&¹[W#fw&d'NyˊVBRTGn7!]xٌKmkH{"b jzbe' pv+A d 4F> qrg ı+`SB#?LE`~C)㪾fӔ (>Ky pI\O1`LUרXVD3rA6>6q;ċ,2yU =%ն d9<색46#q7:Y'$chy;'¸þ9U\Vϱ UA5 TZu 1^e &w7syW\ +D`Lɶܤ\HQPj[ _O*.%Y$X!x,/UhNKJU*8. eJs2d*)ܮ=}SG3 ech @v$x [pz?Q(lL~rDƈ 3wJЎːʇ<:4$K/m>UkiУ3V O:{ b$# 2$iQE%&?jΆ7Ms:H¹#;oHxvBeg `ͩZ9dLD`SktdlQ:M-ߧP Tɴ4e1rjs4HG7Sq ӦPVif:8U @a~q6&OͿwrX v԰do1t@}Z t k$" _=9(cĬQ-s =uN'er!bf;$01xy邊/p KL]!eN /I:[ׂhZ]! HǣݩM )VLj}93 PDyC4zn7u ovùߟ4MLuE:jv>pmDeJV|Lc.YmHvuS2.TfQ#`&/ʐw]o7'ăh̼h ctLCl"k_mF\(IMQ7ޜ׳\'E)RʊT`qn!MWJ][ztInlD_>68՛Ϳ•ɦDTE+5ZR6ŕ!ۦ\?~wo)_'|. P(uc*)җԩqo)' -r&SolGL:qZTz% ;ʧ9p=vǥ9L dQ2{' #V*^ ]?8U|D0NRXXYq7D*_~'R۽*z0jK=!;&0^d%u[;nl3'`S2ΏX[#/kP*9P(apIkh_k5@ ~$hk3pbz0ȎAg!( >O2q{{qVDZBaBaؒE?X_/?u?aNdha1SQ=H7*7D-cy:C3#ܣ to"3.OLhc֩.u'+ҩ9Qp4R\6ıe9KOzμ0 gg9NpfサB(;*hE}Z iOB:n8$NRXV]:l6MOa8 '0Hvmd]RY,j][2SO,# R!h>{){/UNmC ğL*$lYwL3jѠ.#H1oa"/Ӣ;| aP5J9#*n7r0-F_pf?lwKQ|aՀ֕W?w0QF.=r= c.uJgc8'OcC#e}zf{qӨFHҸy̖ͭ7hM>##߽L?DL]riG#9K.H_Vk>v9M*zT"h\];隠}uH|]GT[0!c1r3")B? 2~@Hޒb$' 0۠}וD7(tMk>i4#fu mlVT H'skNd1 0 m{jh=y* -OU$0'hT%HN6v}7 ô'"12ݨaD?i`XrAmZܨ$PwM`.ǵ:}]G=#WrER*:r!-nܓMvTN0VkO!fGbfP[$ Z1Er-nV/Dn!2~:iee%fkDf0.rUu>z8?5C psVGpy؞47d^rxcP,KRe&QL%%E^W]m_閧3 ?AߦvLQ['ܻ\?f}>Ѭv8HD2 C5^Zx :]hN v%:7ㄨ7ϘP2^ԣ`t$ v-uiLjE(v] pr@?{dV{N>pxp0{{1)WTY#|v 9ͤ%JaoJNr'߆4WsrV],w|ȓՕ(MtQe&lPx4?M$ 8Y±T7ŶTͿx-pO!mبc$(i@cc r^NVol7+;ӺBC Z~٦tĔHp̤܉+/i+_w,Q?֍RYNAmiKs~f0Rh5OL ^H _YC!JJMSŒ_#BƸ3g$]us6mG`3 [7.KC o#g1|E.^ۉ9BnddI0#2M隈EpkˁԮzOПp':|Ky4fd"tˋY&y|>uU n`Ծ(`STթ9΍;cAݿK;SL7&I7!#O%(˔! ޏ(J ~j[ l8qOP1Z9TǸBUq H ,J(DMoԂSռ*б U/B ճ!;4t58ƒ 4'(3G(1̪o áyLه1qPr]*p@zѓUkd#fs˿Y[P&Գ:.ł[9xńXPN|y>lЅ*RaC.$@_ѯKeD ӈX̱O12fqzA#H\Y`X"DW&@XƉK nPaLC`1>qe[[?CpquiU,a$K:9$$dhn}k[&D)(ɮ NJhrb;)-$(0EfwݮB*Em6 Fldє84}?- .K{HmbDRJ+rH`7 >*qLչ{K8=m ;x(cqm$_`^?ݼoCUJm8=|R;m`Zfn?K;YF쒢r_%B;Q(s+߿)Dd`\V " ߠFt!0RѪKKB gva)S9pFwdv75G@3Ν-6e9,gqO_77c4\ 2,1ܾ C p@yzWjj?G;gfZGG43’U>2ibDgH;rK[1ggrkHHH8e723"U-RPj1z2>)W+$߈Mͣev9IpD?Cp(r@_RҊPZkPʈˈc\欅WȜsUz*N31-5X0j) \`1OJfx]@_(>+KũHى(4:E~1AaK-8Ar=衰-ǎFI. Gm D{bӐ7 3f?T\"iz+t PQctx@h'_ iְ{oZTFÝ׫34#2~EXY+)t]z #l,ŃG+rb|v-di>+F'ծ(nLa[+-gZNCql7IRGf6ưyUo ԃ-L^A"(z-w~+Sqbtcז7|B|s"Om+YVZ[|aRjy!kwČp?x:`O۹Ǎ1/{<DҚ,Q_n3z} D~F4;gej3sNkCjUd8ģNy.B]+\eyi^BB(n\rB&#8dT"K*_}MT\s{%+d{#E>z4_\eGZηȇ,ϒrAkzw -'Z-ن]0تTѿ2ʿ ZxqX #x.DN.&cXD)of@5ߚf0яA+NF`P$| zӨбizd"&@/و!R&Os: yO 4ٔf*阚Mq|t>n, Þ`a5fjJ أ%!灏(ֵ7WfD ?zYhpث*-;QYE{uJ<5{c7/<4S׼er6-h`>S hһbTä%R,pogw``n(\*K0%#J;mC%Oqfj ]r .M'9#`'1EaM -/nrDMqwvKiZ8a?;y\y\-ER(ɍbyHXrfM0zml2c zo5a ";, :y2Ђ-ʒJVC o%邨~ْygjBU6[o}pP_~%bRKGW6bƵGieZqXVj> kr|PDoWcwpd]}@V;*yWKcV顠ٍ)ĝ0zI,fFuD]żXufjN3ԫ LS<&mbc]x 8js/O oy*SA߅gv| q^y)!]8IGb2Q߯t bɋ?5l{Cԭ"֮2^$%(A D :JdQ޻Šd鳧!EOՏ.͂L#ܣ/2b_K0KWxl>Ieer*v|5qTkiDZS/m\"j֢,@KԹ1 nI΢lYyɶTEe5<6`;g&O(%L+ 8 { \QXJaƠ+mv.eڝ+1Y H)~xjK65pG:0 .8׭JD[,S>rΝD:{_êy\FC*% fӚx4tPB}+YCe6/ʚ]f{':SBT CeHCiYLԲW酴!1v׫fCTC0E ~c?c 饩!ҽx9Iv%3v}ߡn>ƷմD#Zk?I4!41(e!O<U !H5-? vpgFc$Od7JcsC9:$eĥpazr nZ49dJDCIJ7Q0MJv'q,9.JZlarT;GC(USZe8T,[C.Q%}1(5W0|,EfYPv3_ EeA9\+ o{>ㄉڻ[ W[ ~+4ٌSTaO]h #5PDD1#@܄dVn"\DLC;3i:Y*Svq]ps:j (PLmת}ⰡV{0Ú@ڼ݈9 wa@0|YwhHv h VSk \<#$EY>$AQʴydBFP[\oS/P0:` .`L5 F9 x@X;r хwHbXQX3ИrL9WϪz ,.(q*'o k@ ps6k+ ۞.K`X0SLÖy^?ߺ:̈DՍǑFAazDR@#?P-{ce,ہoO0wO%R +]BYMG,#MM6{2&:3%K+Nys80ђS9R{Z;chWrА#*Iʹ;]Ce=^QyY!uCTײRgFyz[Q%<7_Y_3X;#%BVУ7ݹ':W+௒==Z;UqGwbdb濭y;#K.2:b)dt-;7%]6nF}'d+:؋1487g@ڬLĽ坤LV;Z(#i[d_UJ3TY>T( jMb ^hf'_QjEVLz_q)T@r읙׎%}<ʴFߴ.#7L]e+YVzuhXf ~-wq"%~]!{ZF}/2v'Ofx xX mY+hLLG$~Vp>@y/\\,\ 'ݬ}MBİ`G%[1LxNEc'3uty]eRpX'`8f⍋,ַ!,[fb.(dS+v^v' _v-+U3AA㽠c&mc-;VyhfG;,ՙ) Uw8:ț0Qf"IdᎼtPM4fqb N@#:N/2G|" nn+E.y=Ő4CnIhTխx;=7eғC-9 6qkVf-ΝA󀯙+w(QEdzwۧܲ^PE R] 1 xmZz(s8St2Tm^#E@__U@- ^|M_jìuMwxW#dm?$iRR|ݩzb񘤡M>AM+RFJ0E encK [.THgW ˡڜGT6Y]M5uC\pCz- wG@/jx2]P&c),[[J` H׫enͨZNMYa 'qdu6b2΃Fmv@=s:>FYǚ4feZY׶-ChڱA+Oc蜢á5H x0{Ul]C Tm<وTA<] _fbfJcsp<Rmaa^<ŽQu)R IL3})G<ʷ|L2.2\-g4Ư<;'g' xa{%T1"g:÷A ^# *YوK#~v:Fb-O6ΫF,'qfQwCV;DoƄJ 3F8yًH^gw7eC0(tS ]C#pRS2qY+fIA(^jsm?o: M&#D!?6N5뙤2/ȧvJ%vMd 7Lel¼W 0% J:ARzsɬc3]q˥\nvy)d|-sOmYJ"gHxOy%XֺP naULj 7ۅkJ^X#{_46@,#7eUf) ɶ>+KC.:C'+̰0ycܟ +T>Gvü3So(ngAᑓspZA4`Œz-vuJ &;xu\% 8iӡY3Z,zE<OOAJL[`DY{B߆ݼ+ԚJ,<=H7,0U}.Svz»S-&I2r !; -Lޖ≊r7#O_1 M TNp-v'߁M8WD{zv0y !N f\Қ7Q_*AAёXNǵɊ%m➛˜K *Kp<+ȡ&"_ +q!fy<\G we& 8PBV|WXfrxwх8%r M@n$L_]cw&cv&&ض9d7m۶m۶m;s˽NW=2{8՘VIƂrdsx;l.C:uO"wՌ~ָ(DE>#" d~"-!OiƅLy j~[n]gx՝D\Il㵩77JcTDK1 Mʿ4*E6G/,MC'"JH#~^3 e8Cm`-}Q_ka!ҫg*;ev4r{*xl"wTL٥"3ԧqSH\b aVvp|MÐ >qͳAONDղ) Q.Ck eZ>$Bx! } ;0F F<,&*M>TK&\Hw3lAc0rUtSHHxWg]3N1/7[ܽ|%:ׯHGq41vìER"m~Ir! H6PPQh)eD[zn8.ijb4-8ρӾmGG̯4[VB1U:޲w,58F{2/OĜ;fh7lEr$u٨s[7i+сD6$Bf^X}79!T4 A=tMN^ e2fhnخ͞3CZ]ZPǹ-|-ycVo7Metcu\lغțHIٍp>PF龇gJduEFW5S >ȁ8wBKB քܘd n啭5ELb" aۇsMPWvHqTx1:GQc,6|$Wc}b1,ծT} z6,ᡑ1.]._m%4D2"քb-79 ܖ'>N3Qޥ+0 & G+(9 E|EP/ַ;#Jr8] 5'e]PQ&g9agOwKC|E-=qa˳52_ Ѕ"EK% qEo"C[%ǡ^ߠJzj8j\rەZsՌԂ~x>1;IR}UR+)>9map _xeZBϕ|CcM\B f=i:>UWJnd~/rˑ4Azg :1#!m}2Ƙ?aKi>,Z6x3ZޞMbKjH0٭7"anXWW =^"G XW>@"Oj_Z]g QV_7n#!*ݦ5Ӊ@_P/ B8nwiIM$x/UvJǭCz0;C=<4:]Sث`9rnBwyƃA0q~pVA+oq[6n_v MTԦY~\K?QX3G >y=v6ҬӲ ǎąSN%x9um]],,'}BT$(#V6[ٓ )L}N%ZnBU:X=ҕ3Fe\o_rH-tywd`8VH~adfDs&LV<{Z7`(e^XjWl"]c,{jDˆ\ s٧Fra3x*Xf w svSRfI.%kkJgH Qw7sRX8⭪DGAt mQl iՙO~{?7#"Nr.:' 5ba~hU ݝa&KHvd{qC>\E"ă1;SfN Z @H<* 3=EU8К6oHF܅O9\)6 nWo$A&0?j'GeMgV(jb/XDSyd6I~#n1s9@urr[ԟP\f._| w=!.6鋓19׸>\KOEziNsK7;9 BC1N̻㈇r?4Kϱ jZ`$-8[BM[܀m%]eΕ"qxn[2sSo#X>]|o{NqQxV瘓YB-E2,Mx;r_/1=3dS !)ⲏy Z+W{ЕԪa, %z5\e(j_B'm -JـA䥼N?a[?OR)zo^^٦h*x vtOFv[y Ot[rc,E"IM+Ux,%M@OaSZ8̈j4\^lCX 脌~?U\P$/bhVp؈y_컱R%T b$#Gr&4 ^ţf EtJNDBbG' BSw!LQD1lRY356\dsz:ED ۫@3mdRWVe/&2"q%VNYsjb&=K^zd͓Sot,?~:bT!x@-/CPZY9\غNR#xr>Dڅ#($r|zǘ;VAA }&MOעÓ̐ǷϽau-:<:т=THP^TtU?HAW;6)hu5p4|q?Fhlz5qdVdEfQO*Һ V%2o_ iWe構Rӿ[O;~]r/4kc̈́ /(g1~ڢ psQ8|`)PAAQjz4ʚ5ͮfrG:Buyȱj/$3YScje%]lUG!@VV}hg51A/Hҩn84b M!g7@L7wV7C?F1e)djrܼi~ q i cs}_^"7p*UZto"];t"QD9'I pl`|qTH8xvoP-#6~șrܶ{.eTA?r T &A4mgRsĥchfY5]VDD3M8͊$+;F>f>kfYJu`!xG5X7}ܫX)%Oi4,d[9OdDs8<`-:L(gԅg64S{h`!SR)!^(:Xo>?BPS0#wȀ;xZJw٤Yb\FafJרe~ظϮ17>a+aeZ_?n[΅$ㅤ($duS|9 iw!#OUͳ n Q q)B -|5Fz c "%p '=z̺-ǕԳ  Q'kmSk~л1A⅙wI8]̞gDmGq⫔5Q"Y63sw4f'23`?1_u+cۤ=ŠR Nޠ:k}Q8_n~RG{Mjk0Qy9Q=2W) dB Kܭ3K{&`>yW7arL1ͼQ߱4 ttAxÀ170\]y;Lj6?AicpD-Zgl78b$9p" ,?%xA*G{{Yŕ)ŸFLf ִOm|;F& ʲ^m.B6yvU̪ߵm1TkA"(gUJR̢x(彘<iٮ#)*K-(ƾ,.0BT:̎͢TkoCt BXK ɀ! L G>fMC{ʘQa>K}vl_Ĺ޷@ySsT#ԉvڲJ~T9c4c"TWhi6TfJk-pkO߅lɂ'Pcza/ Sxv!76#y ՞uyR =sJ,)EL%T<9c'8Kv4z8# TPMm~1n)[~,ͰY-uzDX)wpĦopa vBrcJN:\"/L Qa6vq Kr!![ 91븨5z"m*CZ' 1'{&''G.gEVjuv՟hv9,-P߲5U)~9wng$vВ\)_9pghD gU&_b=lowTXe?ep%&^ t_<"x?\a_]`a-D2 tѺe}(`!E?࠹-4lnEi"\t_l!Vka&HqfrJ{[IKlI/ccI;)Gu5+򬭀ZAs \Yu3r!vTbY+ (6Qkϯa@WsbqCSy$xx8<5^{orکYJf]C"xn3# ::¼ݞXB[$\3pD+l|o\':ķ+xaC(Vff;uT^ V;M+ƅ/55WeM>OUХWy"-J?ӻ4XF-nZ4-#,+gɶv\g[,ߎarKO;{1lԉSٮ?Wf+Ρ.Ⱥҡ u&(]jhEoGabO3ْ]1%Q~Z3ȳ^][=^LKV~L_WEy ^x>0XpH-5J,6}P]u5{c#J&ah/|zX:y@t* R1:Bc-ˉ%հ=E.ZOYH:M} ) oxVO8+: $¤_rp =<{%iFh>_qE^)(is.vU'Pkq&KQ.dy^e;ʗ8oUNPnSy2`< ie3%o:K &N̥5A i6/K]Wiqa3+c ZW!/!ηG3^Xb}-kEƜOUIҽ A*enA. N@p,M2fH/=VKCeNT4EEd/@g=w^Yy`˔;n8ba<2JhK =&A qi;{(Za'gbd=eW@`ؚZ+f~J&$m' nP/M#tkr]r:W'Ś/xOeb.^Ih^}2Hݏ65AlIE]*VGREeF>/r˙6&@ah f M$$hMB_N:lX#r %IEVևcD> stream xڍwX}?R"!"HMJ HFlc4H#)%tHH ")!% ~~zk׵}9S9mw (!majHV$(j PD&4c]`8Mah 2t*,D@"H\ h) nh!0 2兆;8bqy><8ow+ B]P8 2X,JJHCDxp#av_- ? qᘿ FH{ .p( O"!N!mՊ#2DiF Hc FYS/>Ԭ:܎sf?,ձ{ :M^^H9bbl{f"UŻEI*okI{SmVh^{guiWCl2xnWקzl2'd UT=]QZA;aXjU&ѫU斸odتPذ-I9u\ݰÝ)hd >aFM* V"䄳4%aLg+2;kj{MMt|i/_7A|iӯU}~%U>,u?>C 3as46ciɐր""JB =8koWrBD{Mf>; D+{{.Vy.X"*\?RF#9;"Cb[#*,<9`)Ǐ++;{ۇl!s/ >>葡꽉^ܻ)m: ֟K/\k~"pPqv/uFz!hnҒ/ܱAk O[rxk'_k+ $|-kc_ā^uVvkKK%&¹Ӿfl3_Cvא0H2ء:qȶ%Kצ11Oǃm9)i>ױٍ4G|.~4 uI+lҚEtmoa7lSMO6 6Ig*aD=}om=B! V"^\AD3}7r BiP+[ePiˈ6WI3~w>mZD^D)[Wma_UDmp=$-8X<z0''xcj8r#c|A,%ֲM&KѺEOu_H^8ve~~p+x6dԯfe4:Lp~-,LSUBp+g絧&٭>r1ByUϕ]srg/8҉ED^P)Q]!XZ+t4ȓEjz[agg,F*k+ddr?4F2h~3tUu#d RP 6~("E8 @}t| 5d&FG`Cg^m [BᐅCѽKm^_x4?ZzqF?oCO;OEd\61H[=u؃ 8~-kjW uEw]ly$_ ӝ %5LL[; *XkN=Kz Ģ'suӗN6c/jjIIVP(lW*Hw+Iָ̹ĝˏǠ"ZW^'1}X[8s,PU>f'9_n1>vSp sS'YIja"@7Xi1v3 U$ΊDZ,ӗV[g*o'0)4 IKj^YQ`IH壽|3Y_MP/dĪj*R= j^Xx5 nɷ昮i520:CB鼧jhR?kΘ3Љpx^IQBh n2 &a\1ؙfH#_B ;TG|k:{ +Wt??PL%_{wdޏNf*Q㾻9w"#/nM$J[?&3HhlM~0mQ9}$$JX[֠ӂqˍLFD${s^.A:WZa_llmv2*ҝJ}Qm/2wJ슦XC_hXxg Qu2%E쁆kMu^fھc{;SثNJvkޟE:'Vk.>؜]`kf/2x ]MO[#>/LH jp陱yiۊA7l͓0}oFzKQdoU^P B=uTv(E6>>+f~oHЉe"4ȫyny4s[LSA,I5˞s̓ޯR+(8^ E}jV;L~ Pg=Zbl}3ZkDsJvj^8-쟽ftQ.Tax' ?!uBŜ"3?SAN|:Q\U,Bv=itzфv\afezsc{|WĨ:&mlڝo={pyaR{*hiQie!q*^fp}^4"oͣ/Wji9xeR;Y}КOf~u{%]LearYNP.󬊱}ݹkAThu10 w ce4LL6_8\? %/4b\xnc .@NO;Rk߬G^9*|^bH]Ǫ:sUf Tvr^(,aԖSբt{ ~vm/էOPgo1Ia@zvr^7W}iW__zfCڸ',n7MTVePI\|Ō6L<2JRw#5%)tU`wdKс AC!gHW;%h y'6DZo/ZU'Vo nW2$g/*HFICZ($BS- 䛔UwovH ^MD4:^jJ8]lSMh5"s-G'ax$mayt]T.7\9luL݄tѧB\Ͳ~4.(xcl0~q9џϻ1 ։6!ԜE'! R]f-mlBX$ 38gwLDnTeOl/)]wD58]PȧN)27K1R•j]:k4KxH `An ʄ%'N; -&!3Gn<}GY$Ii{פCj<qj"!uJ!NJ 8v/0̹Vղ;3'JX[&q4"?ɻVŔ;Ķak.chGB'~~D,PRV[ZAǍڤfUp [tWư%c(Pr7m]j\ʫh3ffrE-8I9?F yND6>0yVLonY}c!ty1kնbz[AْK9>0rOYOTۢqfwE^!b(m}}&w?A(Wr_Â֏?iD^E'`(e۲0p+NB5]DxM ^QxtB̾M칲6b7F$Y2'Y-WsHRdy[J p>XzHP x:-`-,m߶+K:5Nh 0uv}9TjX\Yڢ^)O+T|Uca~,(e=L^>{&O4(!*mYe ^=l|p}iFlMJ|pLe\v_ Ow~ZUx?\M'u2R_@ PvpԌT-<+1dm)x\Dj{\GqS">@Ul .C,zq;h}I4*3y/29 I|:T!ƄԹ[Y:'*v*EEv6r I?cOpI~-zUYSqWS>S̥2//6:4mW׿Șzƒ>UcM(RwB (.+'R}x6M􉸯N<~F┑5 q7qF!]m9 mۄ1 {rx&x~{|!|AB[z Xw'p]l3<'6k%Lծk9iL9-ܸ1H =%e -=AN.:"_j&™-#=)gtw׊HLgy& m9GϦMirb=a&ȿ5T-0괟G\ൃ@v-ߵ{6huȼH:92<[c1O6wzOe[LӸ#>{E/jB|#TO2^c:q}rEx?{NE@{^f5{m&˧;=c?A{:Z/(I28wk7,eA=RϽ 'S-z1)l~~+RZ9iVnEڥ=f}+peTfvzbC>紣+'U:ׯu~.Жb } l,<ڂZ!͝]my6N|-V+rE200C{e</nM_%Q]RZ endstream endobj 365 0 obj << /Length1 1493 /Length2 9326 /Length3 0 /Length 10341 /Filter /FlateDecode >> stream xڍT6NHKKH0CwJwt0 Cw#tJ+HtwtJeA Gxpi .6??}5#lpsR%vMO(,uNPVfL JT'áS]>XOvcΓTKzH9ϫI__ִh^"= Xz˔`_gpBRW:gsf|hn`lױܤ &&1nf#(|EMoe}O/T=' -|gJegI}2oi%*Lj]0i3Df\y!5}'>kK1G2-&iG1l5^$jiltol_`Z`"mO<뫉K>!ϡ &d!\=*_ɍ6U#2(EbBf6m۟VL:)0cI .T7ѯ!Y[|xg8g"x& X⇙ KlrrvJ ڪtRB8h[υASk%y|\1Ԇz;߯4}9$4h%Dy؄Oor4L&+A&tWʍUǟ+Hzc(+ԟUnԳ eq+M;(,4zW2 UU9ZF*~l^`ŋVeNT*k12:q[VϕDjF? ꏹ|:8dΪ'Jey*szoϲ{bjv {Z{!nwo+R]yHFLNR%oG.~=[m4L5NHyhw]l+6(6A77WAL]I<זxMK;WR9NG d oenqL@̓kuDK&}iMM" ^`ϩK<QN_h~kѕc{ٙ¤%ϛ#Jc æ+Ƴ-^Jz$@\*Q&o*Qw q%L=3Rάs"a{9Jw:9D p7UB `Чj+KGZLiM~O&)|4 3FKƨNe>#oѱKo>wHV@Ɓew ,-@s/֓4)herﶨ= ~RHnn< B;WO#43>ɝ4>/Dj:\ږLBiEcyUгO X8u^+1ߥArm>]ٜ桨 <\ Mn͏PfaO4vY& z9V>$uduhϜ/]-J0YU > ^ټM$cbNS}yn][5F]QHQY 9If֎r (Y{&5VFGDRc.Na$V(s[.0X9I :7eC[GF`*ۛ8۫a} q//|"3m̟;k(?ҀPSYO $!bp]lI@bhq7*|!YjG+S:#Ţ;; gO1&lʕl/>D`n SBle0/3{8l3N򂏉k<{4E5 ;Lx -KhWcE3~A^#=51S͏eѨ*Wɡ:}` /H3&>4t7WR=-5ԺV@֗=8dB5m _ KM$0*)o!9͸M.~Cˎz,/ၓ+<0s{TRLdi욝4Z j_UڕWVC t}m_Lǖ|M%!Sn[[̛ڂ3X1 ,O.E7OTy}* T.6H+=b])aG59P.E kLxAf̨HN*O @G>=#D-#&M#_{EC@U|c\]VJ._5jwݵyQL0F7l`nYspx"*Ӯu|eͯt ٹAeS ]t|oX;B;Ԑk+$@ReX25*F#$I!iL@P+uF$Nfgh] %\ 78Ib26wteeȫy.1J3H<ئOE]oT5sZs I88S!dàܲ\ۻyCtGk<ӯxlV {7K wXl0&i_~vƚM09 )h*=`5#Y3|RWlȀ8Q"g/,*K~Ot8P~*TNfY%YLutGg0uֳ8t8R]Â(aŃ¢E1>pn]Vw%],wpg5_Zdo\>-v^d%/wǶvh_2ʼn;,GnEdmCEβ[5ûX+!? ZJvq)Fv~ OW22a?mC0#_f ['A^rUJ5)_5tcFIz1>v$U~KP7ːFNj9G;Zr$ܧr˻~Ԛ}Tt0WLǸG;~T2Bc۶NĞTXblAQ'|'pcb>[CB{YPfY8!˟q64:K$}xgl덖#"ƓE;"TK,_2nz'} 5^Gt ~̚@ VTf]gOƘbX#޳0Htxk$;1pFًl~-B쀖dz1jKZټ G_'9D}ƕ㭃:<),i(lC,ȈWKʋ>EH݂EU:JǼN#Y#|H¥6ܗ XB`񥘩"9h[[T@SkD{kV ͭab},7ƻQK$~yT_Z6rތg_%iG<RPnYYĹ&yӫQ!T%XGr!/"tyxݽ7n[A^(H+C]Ay~M [KlQ!wl'v$6  $Q8nθ\ ҉تBq~ڣ(ۥ[37./ASNE2|q'8]?&ݩd,~&):#>'C@:zev࿣I**~?TTC:>`9>>]veqTOB9~2Vcj4- D\F-H9ݕnWGҦU }z$MF3 :xyOxA3|f \3T!SEڵxKyt|PwvTIKpU6Ʈo+ptl9x(>QWWbz}ǰM{3v+e@/<B}$@ `Y㑴J:h5AIlѪQ北%4$ڙ)( bCV1)E0]8K[E_nʞ(3 M3=ݲT/,3% FvE!pIF O\ԘveʖV5YC*˨Z8ƾ@jQ{rN:bS >@nouϑ{Ȥ zQ;P'Lڪs^G(NNL0톱;u`N{NK)w&fͽ 8ľ"uMҬ:dhq#(^Xl\ Nwu5Zkx%4V7Z`.@K%EHnL8Sk@:|K9踋2B01|ChqY#fyה+scH{ZbcK褷*;b9'k[Q(<@R^0wr%YCgain+ܕ&!"G!KTԽz}Wj/OьTJZzl`u(!jiX9QӨxͻ"5:Ը~~m|:c8t½%+ȑ{& X KT&hLՑH٦-sוODxq{\-j7H#[-<0SiKbP7)G\5~=P6Bq?|eB$m^"$ R*%=]r F-5~ig56r4f7umKO?)R4zWUJ,øf}X%#ª4F^M.O}#$#a*hh/S?5EĎ)K:mS 6/5ۛhKJ!+$Yw1fwzir(r r#xq^4Ro=@>dln# YwO7H:q+syM fk &jgy~ .{J"ۺ7)+gU"&֎V\XRRz)\oJR %Pjw<<_%B)Vܲ짎+}p`]Rb<:븯P,-YGz6'@$´>+>4d 0Gj?%Q̐*M8[#nm+X,_b]t;z" mώAyK\0~L6G>$ʩfY]fM#Qt%_ݗ㱍X|mÛV1BN#ñ'8uUV+H`q`zۋ>1 /9E/?c冿-"f*P^>N),@渖qߙ(Z1u_' >G䇷 ![Z͢__洏laT삳k6Qly9 sG) SO$9v*cOXaLex<_ {UeqZ]l$I\޶ڻz~V!n15gՠB^=,jc5ۊ~- jq%*&7v*yR Ƹ4_ +:`5ܶ+F]pdgR͡GL1˩ڣC^:o_"[؉ vb?[E6&uFU# um%_Ưwo_pom}=)Tq_CȅjK$RF’'YiAI);pZaדwC>eaǻCS7megxi=ťr|B^-  C*9jV#}Fe7.g?5aA$w~ =W@qpC,zvoU4nT|Wb)2ܞ?쬐vA^Q%_߿pB9=}ѽP~ M`>d~( {3bIleDJ>>τpM:˔4 M ggŢn?A9-`lc &{%:w~#cwawNX*uD2c<;cKuXBC᫃T7%ԘYeAS!+ [< (j7BΫ)34J?vġl#OF(e\I?CX  7r芠PIR-^jllMh[H<3W]kSX~AS14K䢭ZÀzdם"ZsVVC0o9pekd\!Bq,ctdbkBj_|ՁU5g\?1:8:Pfƾ؍')4:v_~ wDjP\Z  Z, VL݊ttl7>)ͰMqlB79^$&v\TLt͸;x)^$N uκvy/}@Wdh[ᛱZE{UZi,VYxm ydrG{փgXG, vAd˦ +n4OK z"pet@W3j<;ua[GVr3B:i>,>] ivu=ok̖jqFB XE`wlq6o9#8Mug}˅iICfbr~? mj}RtsyEclD[/b Jb60';4-qmَSM%pCɽ?/1I+u>Qʲ{. 3A隵*>qXYԾ OG;5 ~̆}^kھ^cr{ִ'Pg@ JS.7׃C_:S`1Wuh ;׎n5[ixn̢kb]|LjKAO%KOlxsc'U7߱>k|nt++q,T:>@.&e5ڷ3nO`KLP_qrAgr$EV^9![2~~ @}ӎgNkU-ү'd-f$}ð7Q YLɶtg Q[^ex"D۴T6/N"I샻 dRcJm݈5_Y\> stream xZ[o6~_\ Ix8MA1˶ȝ~\[l@s?eCVd̘L" ̤VU&C3LWl ¹L[LG;P.dFGc|YQ̢(2'mLfT;XEK8ɢ`hx?P>fR| P , @Y` @Sʨ0o炄L \3 B+CJ#F6^EX"Ʊ_0@rR4G~ئ 4@JFVotSF2dH2:1Y0nD,gXֲ38{0޳#?L(!<]_*43cDJ`8C,mAI,e H2)<`xH5ZKzDB@PAhnA@ ³\6*: 3/ y3oA66AN 4> fQCAS4J i MEC"c PZ)@k%`Tx<|8OC)י񧟳rwBNNVXs`w;/r ](rk\t^{klLqM%r9]A/Xisg/ 6ꜲՋe\)o\suqe|!I#Mĸ밙x\pT/æ)X^z}yv Ɏح'Ma&v!XnKVk{LFx w퐅pm`#~rԎwՋOztP6!{7&[eIOș4夙x>Y}5^RCbe#dHd$=fN1"H*W[r5 殈_ .Ϩ K&#fDEuRtMLxqpuԤ| vq9M ޓH,/Ty>LDWpjdY oFUS_|K-c"™3EH3ݘ/nAb898,v %cZ^Hq]6 J|  EwFDuqxHWR5oRy((حl\=\'B=7i>v$BģѨ8?ci.gكQSTD$j$5§c6r #x樾.xWނ']bKeP%~0%8z:_QEr `%@r X+VAEaU̝c.H FFHl$\7$ d 6e _ +&حFb({ZhsV{"VȾ#k{ՒlC=2z#IӓʤTO.r*lOn\?`YdzԓuC\-DVrceIKқޅ.Zmf܎!J܍Iݻꢫ-YɃp&i9rUJoըʙ8gܥ VI}M8kr9rS|u| "jIu|G1OPQ5Y=mc%܃1oJᬹ,*ZDu7eUu^Q~u:WL溮Kr$[tq&o,} ,&XX,zb4`m*uXT~{8cş8xW,[>L\\NOBIy {u-vKQ<96HORA0֚L}?TBUQK\ @w93Q} 6H:[Ƕ2sd0X3ԁ%H:'xC[cWtLk16WRew_k4*pIfUO5-XEXbDZ*-NG(U z=Ȁ,Y*\&-s_Z; im9)O9Kglٗu?c&Y$%Q$)}eq&,'U.Ȁy^cl{Ur3|6ʴ J:I*ɧtcQHsNy! P_:&yND;j$Γ|mA,OyNxA*Ut-\ky2żB~ua9/OlvYPQ\8qb^jB6 mY&gK?B6b^ SɪUZ 61{xSV+,^e7-yJHD336iC$|J \E8eRtSEie (]P}Ȇ妚&|Jxw"NLscx!Ks"΋t3LßѴli.5߿{o/NU|OgivY >`q\Fv :=ëxkjhr:.b -8<>NFo[v+ ]d+:*M5)_n!!0=qK|aRa..KɰJ##'n?wx ͯŁx#~?P /.l89٨j|\a#pt>gghMt8*IӶ95fэva$Fyq1Ǣ UQv5h<'⤺.I}5tZr*٧˳r"*8c1.g3q!&b h=N'5:.%bCU},.W3nqHVTĬZg5UE˅F4g9l>J\MƨZ|'Q?xQ;[T RRRݦRJ!{[U(h!XR;($ʧ,Zv'Nv\3h3>ytZ>$y=8SXrWXX[nnilY[[mj<. lݎu\ǰH:ÚK⧓_NX~D*ϰTVDW+sq vB\1 3d>i9fsd}MsnS JmI5dkqG6>OnT}|u}ܹM!y *d!R!ې⊩-Z)jPf|lrU;5tpM:jB+Js6׌6ܤ`]6kW国]޶lD qrM2|&tp[=\0AѺovEL;[8>U7_wTgoΫw{,nfN^I+[\p^ᤌffKrUG:M ߽ٓW6w$kHZ[ ځJœ%'g-A< endstream endobj 405 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20160204111346+01'00') /ModDate (D:20160204111346+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Arch Linux) kpathsea version 6.2.1) >> endobj 367 0 obj << /Type /ObjStm /N 77 /First 673 /Length 3009 /Filter /FlateDecode >> stream xZ[o~ׯǺE.P=nl'78%f#HIYR2QNP93ͷ.fSZ3#RiZd"n2&ՠT&4hDŽ5IpMg"gL,c2)fd@ag.0`3Dwb @T yhb8S" 7og+YTdV1A{Pô0b*-dUKCZo4:2Ȇ(1vv.0TtchA&OIf43V1l2+1(:@ h`S /x HƑL PeCX&{=4XȠMP̃`'QXSЯTd/3(,f(2',V2 8˰bӄby=O|/gyn%W %/9*y}s~Unī#1ƲrQ.A|[; >C?OS?/1'WȆ7/هF{p|/9`/-_|+^ g7 jˁd **|}goe}`L-v$9Oa^ᯘW ۥzd75(7=L~wr|]K[CE^U<_\X0yu/A//7900+yCAl5mu9fEQy~32Ȍ$AՖJps?obk+x @i:s:&`b_"w9x,/5^nR|/xA 1_j1O^jl1*e?{3Ȏ sSqn><wXŰ?,z)ǥ/ף4=+\bM5xN壢\0D'y5[\þFž5ȋuU?a0' (Min/Bg꤀N)\zK.!0؞yw~~r2@fȴ!d@oOCF1\f/."MBWRbZ;\0ew SSIo^\f!2u a'ol,/:TRJ~C`cLr`O]Xdd^5=@Jzy'g5=;{E7MOjw:G/9c!rNC+u |f26 V¡b_ %A[m\($$}atoFX dz-jZ[uVXꝥoi??xTɶnqcn4ۥܨ7ܺiҤzGUw OO?ݺO&aF, kacX7])4jǰ ƒ`Xc w۪vԲvl>\ܑ-~.גZj.:PN;Jin`]jjϦ^ݓrzk&^\e,8쳡TT 9j3f'mQ>|\緈MemtUC!DShmJDM'(;???4[RhGxۑ͋*1mޭ檸=yUO҃JâB qa귥n>/~Nh:0rյ`wlͮ?b(GinYhnӤ7E沅X$ti`4&44S!@DmT@L(-3M*TTPt~@4T9LH~-P=K2h@`HPPQA"U'u ?DQ5g`'\uWg;E5RVQV*TL@&Fi8f*'xDKi3Gi3"cl,2M `@EDRP/%ARQRS/fbv 5Rq JGipJW OJQyܟ;JFӑdeHIV MԐ51e-( GYDX&fc@CԈ4ȱi2 MS$l2}Cbb`7Ei~NSLJ)[Ki0p_b.IS{~LM0&q!bCʅ.ztEX^%C  .**K4BM`2 bH,B,M af㙩@bݦ%KQhBi,~*&v?Mjz ] /Length 916 /Filter /FlateDecode >> stream x9SUAEaSYdWAdey&VejXFZ~w;}o!  xB&X}6.j@ؤF.}jDWSCZ.SIQkLZ Jݥv JZi)(6IԶ5 V-[ZzjpZ=:Ik[vjJ0b'zNIV WvX$*\:iV=,5$ݠN E/p/c#B Y0O:!0 F(`<#0 c0 f&  `B,zX+` Q]XZ+{ !83vf?ώ;.v.u9,29tN{OzD+‰^W9Fr!N?B_91sMt {8N- 8p,"Q0&pqI1#0_'ArI5"-[|q>1ꂆZM.<#R@%USԣ} /6YAсٻEf>*:Ͽ[YщeZ3˾zOQ[ M>&Mjx!l a&Mt6!lyi qB >wR''z`,%˾ }- endstream endobj startxref 424373 %%EOF andi-0.9.6.1/configure.ac000066400000000000000000000067471265514611600151130ustar00rootroot00000000000000AC_INIT([andi], [0.9.6.1]) AM_INIT_AUTOMAKE([-Wall foreign ]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AC_PROG_CXX AC_PROG_MAKE_SET AC_PROG_CPP AC_PROG_RANLIB m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) # Make sure, also the C++ programs are compiled with OpenMP AC_LANG(C++) AC_OPENMP # Execute all tests using C AC_LANG(C) AC_OPENMP AC_CHECK_LIB([m],[cos]) AC_CHECK_LIB([gslcblas],[cblas_dgemm], [], [have_gsl=no]) AC_CHECK_LIB([gsl],[gsl_ran_binomial], [], [have_gsl=no]) AS_IF([test "x$have_gsl" = "xno"],[ AC_MSG_ERROR([Missing the Gnu Scientific Library.]) ]) # By default try to build with libdivsufsort. AC_ARG_WITH([libdivsufsort], AS_HELP_STRING([--without-libdivsufsort], [Build without libdivsufsort and use psufsort instead.])) AS_IF([test "x$with_libdivsufsort" != "xno"], [ AC_CHECK_HEADERS([divsufsort.h],[have_libdivsufsort=yes],[have_libdivsufsort=no]) AC_CHECK_LIB(divsufsort, divsufsort, [], [have_libdivsufsort=no]) ], [ have_libdivsufsort=no # psufsort needs C++11 AX_CXX_COMPILE_STDCXX_11([],[mandatory]) ] ) AS_IF([test "x$have_libdivsufsort" = "xno"], [AS_IF([test "x$with_libdivsufsort" != "xno"], [AC_MSG_ERROR([Configuration for libdivsufsort failed. Either install libdivsufsort, or use our replacement, psufsort, instead. ./configure --without-libdivsufsort The latter may result in longer runtimes.]) ]) ]) AM_CONDITIONAL([BUILD_WITH_LIBDIVSUFSORT],[test "x${with_libdivsufsort}" != "xno"]) # The unit tests require GLIB2. So by default do not build the test. # If enabled, check for glib. AC_ARG_ENABLE([unit-tests], [AS_HELP_STRING([--enable-unit-tests],[build unit tests @<:@default: no@:>@])], [try_unit_tests=${enableval}],[try_unit_tests=no] ) AM_CONDITIONAL([BUILD_TESTS],[test "x${try_unit_tests}" = xyes]) # The user may set a seed for the unit tests, so that builds are reproducible. # A value of 0 makes the tests random. AC_ARG_WITH([seed], [AS_HELP_STRING([--with-seed=INT], [random seed for reproducible builds. @<:@default: 0@:>@])], [SEED=$withval], [SEED=0]) AC_SUBST([SEED]) if test "x${try_unit_tests}" = xyes; then have_glib=yes PKG_CHECK_MODULES([GLIB], [glib-2.0], [], [have_glib=no]) if test "x${have_glib}" = xno; then AC_MSG_ERROR([Missing Glib 2. Either install it or build without unit tests.]) fi AX_CXX_COMPILE_STDCXX_11([],[mandatory]) fi # Check for various headers including those used by libdivsufsort. AC_CHECK_HEADERS([limits.h stdlib.h string.h unistd.h stdint.h inttypes.h err.h errno.h fcntl.h]) AC_C_INLINE AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_INT32_T AC_TYPE_UINT8_T AC_HEADER_STDBOOL # Until someone convinces me otherwise, I will deactivate the macros # AC_FUNC_MALLOC and AC_FUNC_REALLOC. They only check if `malloc(0)` retuns a # non-null pointer. This breaks the build on systems using uClibc, including # my laptop. # As requesting zero bytes is not useful, and implementation-defined behaviour, # it should be avoided in the first place. Thus I really don't need these checks. AC_CHECK_FUNCS([floor pow sqrt strdup strerror]) AC_CHECK_FUNCS([strndup strcasecmp]) AC_CHECK_FUNCS([strchr strrchr strchrnul]) AC_CHECK_FUNCS([strtoul strtod]) AC_CHECK_FUNCS([reallocarray]) AM_CONDITIONAL([HAVE_REALLOCARRAY], [test "x$ac_cv_func_reallocarray" = xyes]) AM_CONDITIONAL([HAVE_STRCHRNUL], [test "x$ac_cv_func_strchrnul" = xyes]) AC_CONFIG_HEADERS([src/config.h:src/config.hin]) AC_CONFIG_FILES([ Makefile docs/andi.1 docs/Makefile libs/Makefile opt/Makefile opt/psufsort/Makefile src/Makefile test/Makefile ]) AC_OUTPUT andi-0.9.6.1/docs/000077500000000000000000000000001265514611600135375ustar00rootroot00000000000000andi-0.9.6.1/docs/Doxyfile000066400000000000000000002234061265514611600152540ustar00rootroot00000000000000# Doxyfile 1.7.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "andi" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES andi-0.9.6.1/docs/Makefile.am000066400000000000000000000015261265514611600155770ustar00rootroot00000000000000dist_man_MANS = andi.1 dist_noinst_DATA = Doxyfile # I intentionally do not list any of the manual files here. I neither want them # distributed nor installed. The reason is that building the manual requires # LaTeX with a whole bunch of packages installed. Plus, so many things can go # wrong, when building, so it's better to inspect the result. Thus, the manual # has to be build by hand and copied to the right place for distribution. .PHONY: code-docs code-docs: doxygen manual/version.tex: manual/version.tex.in $(top_srcdir)/configure.ac sed "s/VERSION/$(VERSION)/" manual/version.tex.in > manual/version.tex manual/andi-manual.pdf: manual/andi-manual.tex manual/version.tex @echo "error: manual rebuild of the manual required (no pun intended)." @exit 1 # maintainer-clean-local: # rm -f manual/*{aux,log,out,toc} manual/andi-manual.pdf andi-0.9.6.1/docs/andi.1.in000066400000000000000000000066041265514611600151470ustar00rootroot00000000000000.TH ANDI "1" "June 2015" "@VERSION@" "" .SH NAME andi \- estimates evolutionary distance .SH SYNOPSIS .B andi [\fI-jlv\fR] [\fI-b INT\fR] [\fI-p FLOAT\fR] [\fI-m MODEL\fR] [\fI-t INT\fR] \fIFILES\fR... .SH DESCRIPTION .TP \fBandi\fR estimates the evolutionary distance between closely related genomes. For this \fBandi\fR reads the input sequences from \fIFASTA\fR files and computes the pairwise anchor distance. The idea behind this is explained in a paper by Haubold et al. (see below). .SH OUTPUT The output is a symmetrical distance matrix in \fIPHYLIP\fR format, with each entry representing divergence with a positive real number. A distance of zero means that two sequences are identical, whereas other values are estimates for the nucleotide substitution rate (Jukes-Cantor corrected). For technical reasons the comparison might fail and no estimate can be computed. In such cases \fInan\fR is printed. This either means that the input sequences were too short (<200bp) or too diverse (K>0.5) for our method to work properly. .SH OPTIONS .TP \fB\-b, \-\-bootstrap\fR Compute multiple distance matrices, with \fIn-1\fR bootstrapped from the first. See the paper Klötzl & Haubold (2016, in review) for a detailed explanation. .TP \fB\-j\fR, \fB\-\-join\fR Use this mode if each of your \fIFASTA\fR files represents one assembly with numerous contigs. \fBandi\fR will then treat all of the contained sequences per file as a single genome. In this mode at least one filename must be provided via command line arguments. For the output the filename is used to identify each sequence. .TP \fB\-l\fR, \fB\-\-low-memory\fR In multithreaded mode, \fBandi\fR requires memory linear to the amount of threads. The low memory mode changes this to a constant demand independent from the used number of threads. Unfortunately, this comes at a significant runtime cost. .TP \fB\-m\fR, \fB\-\-model\fR Different models of nucleotide evolution are supported. By default the Jukes-Cantor correction is used. .TP \fB\-p\fR Significance of an anchor pair; default: 0.05. .TP \fB\-t\fR The number of threads to be used; by default, all available processors are used. .br Multithreading is only available if \fBandi\fR was compiled with OpenMP support. .TP \fB\-v\fR, \fB\-\-verbose\fR Prints additional information. Apply multiple times for extra verboseness. .TP \fB\-h\fR, \fB\-\-help\fR Prints the synopsis and an explanation of available options. .TP \fB\-\-version\fR Outputs version information and acknowledgments. .SH COPYRIGHT Copyright \(co 2014, 2015 Fabian Klötzl License GPLv3+: GNU GPL version 3 or later. .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. The full license text is available at . .PP .SH ACKNOWLEDGMENTS 1) andi: Haubold, B. Klötzl, F. and Pfaffelhuber, P. (2015). andi: Fast and accurate estimation of evolutionary distances between closely related genomes .br 2) Algorithms: Ohlebusch, E. (2013). Bioinformatics Algorithms. Sequence Analysis, Genome Rearrangements, and Phylogenetic Reconstruction. pp 118f. .br 3) SA construction: Mori, Y. (2005). Short description of improved two\-stage suffix sorting algorithm. http://homepage3.nifty.com/wpage/software/itssort.txt .SH BUGS .SS Reporting Bugs Please report bugs to or at . .SS andi-0.9.6.1/docs/manual/000077500000000000000000000000001265514611600150145ustar00rootroot00000000000000andi-0.9.6.1/docs/manual/andi-manual.tex000066400000000000000000000444531265514611600177360ustar00rootroot00000000000000\documentclass[a4paper, 10pt, english, DIV=12, BCOR=8mm]{scrbook} \usepackage[utf8x]{inputenc} \usepackage{babel} \usepackage{listings} \usepackage{xcolor} \usepackage{hyperref} \usepackage{siunitx} \usepackage[T1]{fontenc} \usepackage{isodate} \usepackage{graphicx} \usepackage{amsthm} \usepackage{acronym} \usepackage{amssymb} \usepackage{tikz} \usepackage{pgfplots} \usepackage{caption} \usepackage{subcaption} \usepackage{booktabs} \usepackage{xspace} \usepackage{overpic} \bibliographystyle{alpha} \DeclareSIUnit\byte{B} \DeclareSIUnit\basepairs{bp} \DeclareSIUnit\bit{bit} \definecolor{oceangreen}{cmyk}{1,.0,.20,.78} \addtokomafont{sectioning}{\rmfamily\color{oceangreen}} \definecolor{bluekeywords}{rgb}{0.13,0.13,1} \definecolor{greencomments}{rgb}{0,0.5,0} \definecolor{turqusnumbers}{rgb}{0.17,0.57,0.69} \definecolor{redstrings}{rgb}{0.5,0,0} \definecolor{lightgray}{rgb}{0.9,0.9,0.9} \usepackage{libertine} \fontfamily{libertine} \selectfont %\usepackage[scaled]{berasans} \newcommand{\thymine}{\textsc{m}\oldstylenums{2}\xspace} \newcommand{\local}{\textsc{m}\oldstylenums{1}\xspace} \newcommand{\algo}[1]{\textsc{{#1}}} \newcommand{\andi}{\algo{andi}\xspace} \newcommand{\word}[1]{\textsf{\small#1}} \newcommand{\wchar}[1]{\textsf{\small#1}} \newcommand{\eco}{\textsc{eco}\oldstylenums{29}\xspace} \newcommand{\pneu}{\textsc{Pneu}\oldstylenums{3085}\xspace} \include{version} % Todos at the margin \newcommand{\todo}[1]{ \marginpar{\fbox{\begin{minipage}{0.9\marginparwidth} \scriptsize\sloppy\raggedright #1 \end{minipage}}} } \newtheorem{definition}{Definition} \lstset{backgroundcolor=\color{lightgray}} \lstdefinestyle{shell}{ language=bash, columns=flexible, xleftmargin=12pt, xrightmargin=12pt, breaklines=true, basicstyle=\small\ttfamily, morekeywords={make, tar, git, sudo, andi, time, man, head, cut, fneighbor, fretree, figtree, brew, aura, autoreconf}, % literate={~} {$\sim$}{1} } \lstset{style=shell} \title{Documentation of \algo{andi}} \subtitle{Rapid Estimation of Evolutionary Distances between Genomes\\ {\small\url{https://github.com/EvolBioInf/andi}}} \author{Fabian Klötzl\\ \href{mailto:kloetzl@evolbio.mpg.de}{kloetzl@evolbio.mpg.de}} \date{Version \version, \isodate\today \\ \vspace*{2cm} \centering\includegraphics[width=0.8\textwidth]{andi_labels.pdf}} \begin{document} \maketitle \section*{Abstract} This is the documentation of the \andi program for estimating the evolutionary distance between closely related genomes. These distances can be used to rapidly infer phylogenies for big sets of genomes. Because \andi does not compute full alignments, it is so efficient that it scales well up to thousands of bacterial genomes. This is scientific software. Please cite our paper \cite{andi} if you use \andi in your publication. Also refer to the paper for the internals of \andi. Additionally, there is a Master's thesis with even more in depth analysis of \andi \cite{kloetzl}. \vspace*{1cm} \section*{License} This document is release under the Creative Commons Attribution Share-Alike license. This means, you are free to copy and redistribute this document. You may even remix, tweak and build upon this document, as long as you credit me for the work I've done and release your document under the identical terms. The full legal code is available online: {\small\url{https://creativecommons.org/licenses/by-sa/4.0/legalcode}}. \tableofcontents \chapter{Installation} %%%%% \section{Package Manager} The easiest way to install \andi is via a package manager. This also handles all dependencies for you. \noindent OS X with homebrew: \begin{lstlisting} ~ % brew install science/andi \end{lstlisting} \noindent ArchLinux: \begin{lstlisting} ~ % aura -A andi \end{lstlisting} \noindent Debian and Ubuntu (soon): \begin{lstlisting} ~ % sudo apt-get install andi \end{lstlisting} \andi is intended to run in a \algo{Unix} commandline such as \lstinline$bash$ or \lstinline$zsh$. All examples in this document are also intended for that environment. You can verify that \andi was installed correctly by executing \lstinline$andi -h$. This should give you a list of all available options (see Section~\ref{sec:options}). \section{Source Package} \label{sub:regular} Download the latest \href{https://github.com/EvolBioInf/andi/releases}{release} from GitHub. Please note, that \andi requires the \algo{Gnu Scientific Library} and optionally \algo{libdivsufsort}\footnote{\url{https://github.com/y-256/libdivsufsort}} for optimal performance \cite{divsufsort}. If you wish to install \andi without \algo{libdivsufsort}, consult Section~\ref{sub:wo-divsufsort}. Once you have downloaded the package, unzip it and change into the newly created directory. \begin{lstlisting} ~ % tar -xzvf andi-0.9.tar.gz ~ % cd andi-0.9 \end{lstlisting} \noindent Now build and install \andi. \begin{lstlisting} ~/andi-0.9 % ./configure ~/andi-0.9 % make ~/andi-0.9 % sudo make install \end{lstlisting} \noindent This installs \andi for all users on your system. If you do not have root privileges, you will find a working copy of \andi in the \lstinline$src$ subdirectory. For the rest of this documentation, I will assume, that \andi is in your \textdollar\lstinline!PATH!. Now \andi should be ready for use. Try invoking the help. \begin{lstlisting} Usage: andi [-jlv] [-b INT] [-p FLOAT] [-m MODEL] [-t INT] FILES... FILES... can be any sequence of FASTA files. If no files are supplied, stdin is used instead. Options: -b, --bootstrap Print additional bootstrap matrices -j, --join Treat all sequences from one file as a single genome -l, --low-memory Use less memory at the cost of speed -m, --model Pick an evolutionary model; default: JC -p Significance of an anchor pair; default: 0.05 -v, --verbose Prints additional information -t, --threads The number of threads to be used; by default, all available processors are used -h, --help Display this help and exit --version Output version information and acknowledgments \end{lstlisting} \noindent \andi also comes with a man page, which can be accessed via \lstinline$man andi$. % But once you are done with this documentation, you will require it scarcely. \section{Installing without \algo{libdivsufsort}} \label{sub:wo-divsufsort} In case you cannot or do not want to install \algo{libdivsufsort}, \andi comes with its own implementation of a \emph{suffix array construction algorithm}. It is called \algo{psufsort} and is also available, separately.\footnote{\url{https://github.com/kloetzl/psufsort}} To activate it for \algo{andi}, proceed as described in Section~\ref{sub:regular}, but with the following twist: \begin{lstlisting} ~/andi % ./configure --without-libdivsufsort \end{lstlisting} Please note that this requires a C++11 compiler. Also, \algo{psufsort} may be slower than \algo{libdivsufsort} and thus lead to inferior runtimes. \section{Installing from Git Repository} To build \andi from the \algo{Git} repo, you will also need the \algo{autotools}. Refer to your OS documentation for installation instructions. Once done, execute the following steps. \begin{lstlisting} ~ % git clone git@github.com:EvolBioInf/andi.git ~ % cd andi ~/andi % autoreconf -i \end{lstlisting} \noindent For old versions of \algo{autoconf} you may instead have to use \lstinline$autoreconf -i -Im4$. \noindent Continue with the \algo{Gnu} trinity as described in Section~\ref{sub:regular}. \chapter{Usage} %%%%% The input sequences for \andi should be in \algo{Fasta} format. Any number of files can be passed. Each file may contain more than one sequence. \begin{lstlisting} ~ % andi S1.fasta S2.fasta 2 S1 0.0000 0.0979 S2 0.0979 0.0000 \end{lstlisting} If no file argument is given, \andi reads the input from \algo{stdin}. This makes it convenient to use in \algo{Unix} pipelines. \begin{lstlisting} ~ % cat S1.fasta S2.fasta | andi 2 S1 0.0000 0.0979 S2 0.0979 0.0000 \end{lstlisting} The output of \andi is a matrix in \algo{Phylip} style: On the first line the number of compared sequences is given, \lstinline!2! in our example. Then the matrix is printed, where each line is preceded by the name of the $i$th sequence. Note that the matrix is symmetric and the main diagonal contains only zeros. The numbers themselves are evolutionary distances, estimated from substitution rates. \section{Input} \label{sec:join} As mentioned before, \andi reads in \algo{Fasta} files. It recognizes only the four standard bases and is case insensitive (RegEx: \lstinline![acgtACGT]!). All other residue symbols are excluded from the analysis and \andi prints a warning, when this happens. If instead of distinct sequences, a \algo{Fasta} file contains contigs belonging to a single taxon, \andi will treat them as a unit when switched into \algo{join} mode. This can be achieved by using the \lstinline!-j! or \lstinline!--join! command line switch. \begin{lstlisting} ~ % andi --join E_coli.fasta Shigella.fasta [Output] \end{lstlisting} When the \algo{join} mode is active, the file names are used to label the individual sequences. Thus, in \algo{join} mode, each genome has to be in its own file, and furthermore, at least one filename has to be given via the command line. If \andi seems to take unusually long, or requires huge amounts of memory, then you might have forgotten the \algo{join} switch. This makes \andi compare each contig instead of each genome, resulting in many more comparisons! To make \andi output the number of genome it about to compare, use the \lstinline$--verbose$ switch. \section{Output} The output of \andi is written to \lstinline$stdout$. This makes it easy to use on the command line and within shell scripts. As seen before, the matrix, computed by \algo{andi}, is given in \algo{Phylip} format \cite{phylip}. \begin{lstlisting} ~ % cat S1.fasta S2.fasta | andi 2 S1 0.0000 0.0979 S2 0.0979 0.0000 \end{lstlisting} If the computation completed successfully, \andi exits with the status code 0. Otherwise, the value of \lstinline$errno$ is used as the exit code. \andi can also produce warnings and error messages for the user's convenience. These messages are printed to \lstinline$stderr$ and thus do not interfere with the normal output. \section{Options} \label{sec:options} \andi takes a small number of commandline options, of which even fewer are of interest on a day-to-day basis. If \lstinline$andi -h$ displays a \lstinline$-t$ option, then \andi was compiled with multi-threading support (implemented using \algo{OpenMP}). By default \andi uses all available processors. However, to restrict the number of threads, use \lstinline$-t$. \begin{lstlisting} ~ % time andi ../test/1M.1.fasta -t 1 2 S1 0.0000 0.0995 S2 0.0995 0.0000 ./andi ../test/1M.1.fasta 0,60s user 0,01s system 99% cpu 0,613 total ~ % time andi ../test/1M.1.fasta -t 2 2 S1 0.0000 0.0995 S2 0.0995 0.0000 ./andi ../test/1M.1.fasta -t 2 0,67s user 0,03s system 195% cpu 0,362 total \end{lstlisting} In the above examples the runtime dropped from \SI{0.613}{\second}, to \SI{0.362}{\second} using two threads. Giving \andi more threads than input genomes leads to no further speed improvement. \, The other important option is \lstinline$--join$ (see Section~\ref{sec:join}). By default, the distances computed by \andi are \emph{Jukes-Cantor} corrected \cite{jukescantor}. Other evolutionary models are also implemented (Kimura, raw). The \lstinline$--model$ parameter can be used to switch between them. Since version 0.9.4 \andi includes a bootstrapping method. It can be activated via the \lstinline$--bootstrap$ or \lstinline$-b$ switch. This option takes a numeric argument representing the number of matrices to create. The output can then be piped into \algo{phylip}. \begin{lstlisting} ~ % andi -b 2 ../test/1M.1.fasta 2 S1 0.0000 0.1067 S2 0.1067 0.0000 2 S1 0.0000 0.1071 S2 0.1071 0.0000 \end{lstlisting} \section{Example: \algo{eco29}} Here follows a real-world example of how to use \algo{andi}. It makes heavy use of the commandline and tools like \algo{Phylip}. If you prefer \algo{R}, check out this excellent \href{http://holtlab.net/2015/05/08/r-code-to-infer-tree-from-andi-output/}{blog post} by Kathryn Holt. As a data set we use \algo{eco29}; 29 genomes of \textit{E. Coli} and \textit{Shigella}. You can download the data here: {\small{\url{http://guanine.evolbio.mpg.de/andi/eco29.fasta.gz}}}. The genomes have an average length of 4.9~million nucleotides amounting to a total \SI{138}{\mega\byte}. \algo{eco29} comes a single \algo{fasta} file, where each sequence is a genome. To calculate their pairwise distances, enter \begin{lstlisting} ~ % andi eco29.fasta > eco29.mat andi: The input sequences contained characters other than acgtACGT. These were automatically stripped to ensure correct results. \end{lstlisting} \noindent The \algo{eco29} data set includes non-canonical nucleotides, such as \word{Y}, \word{N}, and \word{P}, which get stripped from the input sequences. The resulting matrix is stored in \lstinline$eco29.mat$; Here is a small excerpt: \begin{lstlisting} ~ % head -n 5 eco29.mat | cut -d ' ' -f 1-5 29 gi|563845 0.0000e+00 1.8388e-02 1.8439e-02 2.6398e-02 gi|342360 1.8388e-02 0.0000e+00 4.4029e-04 2.6166e-02 gi|300439 1.8439e-02 4.4029e-04 0.0000e+00 2.6123e-02 gi|261117 2.6398e-02 2.6166e-02 2.6123e-02 0.0000e+00 \end{lstlisting} \noindent From this we compute a tree via neighbor-joining using a \algo{Phylip} wrapper called \algo{Embassy}.\footnote{\url{http://emboss.sourceforge.net/embassy/\#PHYLIP}} \begin{lstlisting} ~ % fneighbor -datafile eco29.mat -outfile eco29.phylipdump \end{lstlisting} \noindent To make this tree easier to read, we can midpoint-root it. \begin{lstlisting} ~ % fretree -spp 29 -intreefile eco29.treefile -outtreefile eco29.tree <>stream x+r 26S030VIr *T0T0Bf endstream endobj 7 0 obj <>>>/MediaBox[0 0 793 639]>> endobj 2 0 obj <> endobj 1 0 obj <>/Font<>>>/Subtype/Form/BBox[0 0 793 639]/Matrix [1 0 0 1 0 0]/Length 1617/FormType 1/Filter/FlateDecode>>stream xWKsGﯘcr0==ϣ- `CL֦I}im@I3_%FqOJ>qsx;< ZSPj%n/=~lrU*WyK)thk<rmgAh%,%1H"p$Al?(q*^j< '-Hc+c:&^X`a +FE8@ҢV ` :@cUyOJ'*^7XeNLNPHvc6 :迡:Hm;.oRZ@Eg EY),E>J f<Pr1Q/羚aŵk_VWm=)pJkP56 X_tg<͗0Sl:m<><^~R< ҉F %Ҥ-YW@ҋRl;.*.&Қ󪾑7wwbu; :I fy'Q6=Nm.Z}ܯh=6Ul$tA"=]J:_߶N~ 7_eZE}E]΢Qp7*lri r~yb -V5bO9\CnڀIZSL^xZ+:jB_iJvL WS[wzEciu~TS*zUEDlev?=E.HOBc#*ʹ4]7o~QzA?{ 꾬^qA>I&'a"^G7A$؜`$Xmxv񉮂wmr'~R;q`MQ endstream endobj 3 0 obj <> endobj 4 0 obj <> endobj 6 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj xref 0 10 0000000000 65535 f 0000000334 00000 n 0000000246 00000 n 0000002161 00000 n 0000002192 00000 n 0000000015 00000 n 0000002223 00000 n 0000000130 00000 n 0000002274 00000 n 0000002319 00000 n trailer <<2fd9b203f0cc5c36c5491af452364469>]/Info 9 0 R/Size 10>> %iText-5.4.5 startxref 2472 %%EOF andi-0.9.6.1/docs/manual/references.bib000066400000000000000000000061421265514611600176160ustar00rootroot00000000000000@misc{divsufsort, author="Yuta Mori", year="2005", title="Short description of improved two-stage suffix sorting algorithm", note="\url{http://homepage3.nifty.com/wpage/software/itssort.txt}" } @article{andi, author = {Haubold, Bernhard and Klötzl, Fabian and Pfaffelhuber, Peter}, title = {andi: Fast and accurate estimation of evolutionary distances between closely related genomes}, volume = {31}, number = {8}, pages = {1169-1175}, year = {2015}, doi = {10.1093/bioinformatics/btu815}, URL = {http://bioinformatics.oxfordjournals.org/content/31/8/1169.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/31/8/1169.full.pdf+html}, journal = {Bioinformatics} } @book{Felsenstein, author={Joseph Felsenstein}, title={Inferring Phylogenies}, year={2004}, publisher={Sinauer Associates, Inc.} } @misc{GPL, author={{Free~Software~Foundation}}, year={2007}, title={Gnu General Public License}, note={\url{https://gnu.org/licenses/gpl.html}} } @misc{phylip, author={Felsenstein, J.}, year={2005}, title={PHYLIP (Phylogeny Inference Package)}, version={version 3.6}, howpublished={Distributed by the author}, note={Department of Genome Sciences, University of Washington.} } @InProceedings{LLVM, Author = {Chris Lattner and Vikram Adve}, Title = {{LLVM}: A Compilation Framework for Lifelong Program Analysis and Transformation}, Booktitle = "Code Generation and Optimizatio", Month = {Mar}, Year = {2004}, pages = {75--88}, Publisher={International Symposium on Code Generation and Optimization} } @article{ms, author = {Hudson, Richard R.}, title = {Generating samples under a Wright–Fisher neutral model of genetic variation}, volume = {18}, number = {2}, pages = {337-338}, year = {2002}, doi = {10.1093/bioinformatics/18.2.337}, URL = {http://bioinformatics.oxfordjournals.org/content/18/2/337.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/18/2/337.full.pdf+html}, journal = {Bioinformatics} } @article{valgrind, author = {Nethercote, Nicholas and Seward, Julian}, title = {Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation}, journal = {SIGPLAN Not.}, issue_date = {June 2007}, volume = {42}, number = {6}, month = jun, year = {2007}, issn = {0362-1340}, pages = {89--100}, numpages = {12}, url = {http://doi.acm.org/10.1145/1273442.1250746}, doi = {10.1145/1273442.1250746}, acmid = {1250746}, publisher = {ACM}, keywords = {Memcheck, Valgrind, dynamic binary analysis, dynamic binary instrumentation, shadow values} } @misc{figtree, title="FigTree", author={Andrew Rambaut}, year={accessed 2015}, note={\url{http://tree.bio.ed.ac.uk/software/figtree/}} } @article{jukescantor, author={Jukes, T. H. and Cantor, C. R.}, year={1969}, title={Evolution of protein molecules}, journal={Mammalian protein metabolism}, volume={3}, pages={21-132}, publisher={Academic Press} } @mastersthesis{kloetzl, author={Fabian Kl{\"o}tzl}, school={University of L\"ubeck}, year={2015}, title={Efficient Estimation of Evolutionary Distances} } andi-0.9.6.1/docs/manual/version.tex.in000066400000000000000000000000401265514611600176220ustar00rootroot00000000000000 \newcommand{\version}{VERSION} andi-0.9.6.1/libs/000077500000000000000000000000001265514611600135405ustar00rootroot00000000000000andi-0.9.6.1/libs/Makefile.am000066400000000000000000000002551265514611600155760ustar00rootroot00000000000000# (C) 2015, Fabian Klötzl ISC License noinst_LIBRARIES= libpfasta.a libpfasta_a_SOURCES= pfasta.c pfasta.h libpfasta_a_CPPFLAGS= -I$(top_srcdir)/opt andi-0.9.6.1/libs/pfasta.c000066400000000000000000000325411265514611600151670ustar00rootroot00000000000000/* * Copyright (c) 2015, Fabian Klötzl * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ #include #include #include #include #include #include #include #include #include #include #include "pfasta.h" #define BUFFERSIZE 4096 /** @file * * Welcome to the code of `pfasta`, the pedantic FASTA parser. For future * reference I here explain some general, noteworthy things about the code. * * - Most functions returning an `int` follow the zero-errors convention. On * success a `0` is returned. A negative number indicates an error. Positive * numbers can be used to signal a different exceptional state (i.e. EOF). * - All functions use pointers to objects for their parameters. * - The low-level Unix `read(2)` function is used to grab bytes from a file * descriptor. These are stored in a buffer. The contents of this buffer is * checked one char at a time and then appended to string buffer. Finally, * the resulting strings are returned. * - To work around the fact that C has no exceptions, I declare some nifty * macros below. * - As the length of the sequences are not known in advance I implemented a * simple structure for growable strings called `dynstr`. One character at * a time can be appended using `dynstr_put`. Internally an array is * realloced with growth factor 1.5. * - The functions which do the actual parsing are prefixed `pfasta_read_*`. */ #define PF_EXIT_ERRNO() \ do { \ pf->errno__ = errno; \ pf->errstr = NULL; \ return -2; \ } while (0) #define PF_EXIT_FORWARD() return -1 #define PF_FAIL_FORWARD() \ do { \ return_code = -1; \ goto cleanup; \ } while (0) #define PF_FAIL_ERRNO() \ do { \ pf->errno__ = errno; \ pf->errstr = NULL; \ return_code = -2; \ goto cleanup; \ } while (0) #define PF_FAIL_STR(...) \ do { \ pf->errno__ = 0; \ (void) snprintf(pf->errstr_buf, PF_ERROR_STRING_LENGTH, __VA_ARGS__); \ pf->errstr = pf->errstr_buf; \ return_code = -1; \ goto cleanup; \ } while (0) static int buffer_init(pfasta_file *pf); static inline int buffer_peek(const pfasta_file *pf); static inline int buffer_adv(pfasta_file *pf); static int buffer_read(pfasta_file *pf); typedef struct dynstr { char *str; size_t capacity, count; } dynstr; static inline int dynstr_init(dynstr *ds); static inline int dynstr_put(dynstr *ds, char c); static inline void dynstr_free(dynstr *ds); static inline char *dynstr_move(dynstr *ds); static inline size_t dynstr_len(const dynstr *ds); int pfasta_read_name(pfasta_file *pf, pfasta_seq *ps); int pfasta_read_comment(pfasta_file *pf, pfasta_seq *ps); int pfasta_read_seq(pfasta_file *pf, pfasta_seq *ps); /* * When reading from a buffer, basically three things can happen. * * 1. Bytes are read (success) * 2. Low-level error (fail) * 3. No more bytes (EOF) * * A low-level error is indicated by `buffer_adv` returning non-zero. As * end-of-file is technically a successful read, EOF is instead signalled by * `buffer_peek`. */ /** @brief Initialises the read buffer. First, memory is allocated and then * filled. Both operations may fail. But this ensure we detect problems with * an unreadable file at the the initialisation of the parser! * * @param pf - The parser we want to initialise. * @returns 0 iff successful. */ static int buffer_init(pfasta_file *pf) { char *buffer = malloc(BUFFERSIZE); if (!buffer) PF_EXIT_ERRNO(); pf->buffer = pf->readptr = pf->fillptr = buffer; if (buffer_read(pf) < 0) PF_EXIT_FORWARD(); return 0; } /** @brief Returns the current character or EOF. * * @param pf - The parser to read from. * @returns The current character or EOF. */ static inline int buffer_peek(const pfasta_file *pf) { if (pf->readptr < pf->fillptr) { return (int)*(pf->readptr); } return EOF; } /** @brief Advances the read pointer in the buffer to the next character. If * needed, the buffer is filled with fresh bytes. A non-zero value is returned * if reading fails. * * @param pf - The parser which should be advanced. * @returns 0 iff successful. */ static inline int buffer_adv(pfasta_file *pf) { if (buffer_peek(pf) == '\n') { pf->line++; } if (pf->readptr < pf->fillptr - 1) { pf->readptr++; return 0; } if (buffer_read(pf) < 0) PF_EXIT_FORWARD(); return 0; } /** @brief Fills the buffer with new data. * * @param pf - The parser which should be updated. * @returns 0 iff successful. */ static int buffer_read(pfasta_file *pf) { ssize_t count = read(pf->fd, pf->buffer, BUFFERSIZE); if (count < 0) PF_EXIT_ERRNO(); if (count == 0) { // EOF pf->fillptr = pf->buffer; pf->readptr = pf->buffer + 1; return 1; } pf->readptr = pf->buffer; pf->fillptr = pf->buffer + count; return 0; } /** @brief Frees all data associated with a parser. Also nulls pointers to avoid * a potential double-free. * * @param pf - The parser that shall be freed. */ void pfasta_free(pfasta_file *pf) { if (!pf) return; free(pf->buffer); pf->buffer = pf->readptr = pf->fillptr = pf->errstr = NULL; pf->errno__ = 0; pf->fd = -1; pf->line = 0; pf->unexpected_char = '\0'; } /** @brief Creates a new parser for the given file. This includes allocating the * buffer and reading the first few bytes. These are then used to break on empty * or non-FASTA files. * * @param pf - A pointer to the parser structure we intend to initialise. No * assumption is made about the referenced memory except its existence. * @returns 0 iff successful. */ int pfasta_parse(pfasta_file *pf, int file_descriptor) { assert(pf && file_descriptor >= 0); int return_code = 0; pf->errno__ = 0; pf->buffer = pf->readptr = pf->fillptr = pf->errstr = NULL; pf->fd = file_descriptor; pf->line = 1; pf->unexpected_char = '\0'; if (buffer_init(pf) != 0) PF_FAIL_FORWARD(); int c = buffer_peek(pf); if (c == EOF) PF_FAIL_STR("Empty file"); if (c != '>') PF_FAIL_STR("File does not start with '>'"); cleanup: return return_code; } /** @brief Frees the memory of a FASTA sequence. **/ void pfasta_seq_free(pfasta_seq *ps) { if (!ps) return; free(ps->name); free(ps->comment); free(ps->seq); ps->name = ps->comment = ps->seq = NULL; } /** @brief Reads the next sequence from the parser into the memory pointed to by * the parameter `ps`. This may fail for various reasons. No matter, what * happens, always free `ps` after usage! * * @param pf - The parser to read from. * @param ps - A reference to memory for the sequence data. * * @returns 0 if successful, 1 if the end of the file was reached and a negative * number on error. */ int pfasta_read(pfasta_file *pf, pfasta_seq *ps) { assert(pf && ps && pf->buffer); *ps = (pfasta_seq){NULL, NULL, NULL}; int return_code = 0; int c = buffer_peek(pf); if (c == EOF) return 1; if (c != '>') { PF_FAIL_STR("Expected '>', but found '%c' on line %zu", c, pf->line); } if (pfasta_read_name(pf, ps) < 0) PF_FAIL_FORWARD(); if (isblank(buffer_peek(pf))) { if (pfasta_read_comment(pf, ps) < 0) PF_FAIL_FORWARD(); } if (pfasta_read_seq(pf, ps) < 0) PF_FAIL_FORWARD(); // Skip blank lines while (buffer_peek(pf) == '\n') { if (buffer_adv(pf) != 0) PF_FAIL_FORWARD(); } cleanup: return return_code; } /** @brief Reads the sequence name and saves it into the structure. * * @param pf - The parser used for reading. * @param ps - The structure used to hold the name, later. * * @returns 0 iff successful */ int pfasta_read_name(pfasta_file *pf, pfasta_seq *ps) { int return_code = 0; dynstr name; if (dynstr_init(&name) != 0) PF_FAIL_ERRNO(); while (1) { if (buffer_adv(pf) != 0) PF_FAIL_FORWARD(); int c = buffer_peek(pf); if (c == EOF) { PF_FAIL_STR("Unexpected EOF in sequence name on line %zu", pf->line); } if (!isgraph(c)) break; if (dynstr_put(&name, c) != 0) PF_FAIL_ERRNO(); } if (dynstr_len(&name) == 0) PF_FAIL_STR("Empty name on line %zu", pf->line); ps->name = dynstr_move(&name); cleanup: dynstr_free(&name); return return_code; } /** @brief Reads the sequence comment and saves it into the structure. * * @param pf - The parser used for reading. * @param ps - The structure used to hold the comment, later. * * @returns 0 iff successful */ int pfasta_read_comment(pfasta_file *pf, pfasta_seq *ps) { int return_code = 0; dynstr comment; if (dynstr_init(&comment) != 0) PF_FAIL_ERRNO(); while (1) { if (buffer_adv(pf) != 0) PF_FAIL_FORWARD(); int c = buffer_peek(pf); if (c == '\n') break; if (c == EOF) { PF_FAIL_STR("Unexpected EOF in sequence comment on line %zu", pf->line); } if (dynstr_put(&comment, c) != 0) PF_FAIL_ERRNO(); } ps->comment = dynstr_move(&comment); cleanup: dynstr_free(&comment); return return_code; } /** @brief Reads the sequence data and saves it into the structure. * * @param pf - The parser used for reading. * @param ps - The structure used to hold the data, later. * * @returns 0 iff successful */ int pfasta_read_seq(pfasta_file *pf, pfasta_seq *ps) { int return_code = 0; dynstr seq; if (dynstr_init(&seq) != 0) PF_FAIL_ERRNO(); while (1) { // The only guaranty is !graph && !blank assert(!isgraph(buffer_peek(pf)) && !isblank(buffer_peek(pf))); // deal with the first character explicitly if (buffer_adv(pf) != 0) PF_FAIL_FORWARD(); int c = buffer_peek(pf); if (c == EOF || c == '>' || c == '\n') break; goto regular; // read line while (1) { if (buffer_adv(pf) != 0) PF_FAIL_FORWARD(); c = buffer_peek(pf); if (c == '\n') break; if (c == EOF) break; regular: if (!isgraph(c)) { PF_FAIL_STR("Unexpected character '%c' in sequence on line %zu", c, pf->line); } if (dynstr_put(&seq, c) != 0) PF_FAIL_ERRNO(); } } if (dynstr_len(&seq) == 0) { PF_FAIL_STR("Empty sequence on line %zu", pf->line); } ps->seq = dynstr_move(&seq); cleanup: dynstr_free(&seq); return return_code; } /** @brief Returns an explanatory string for encountered errors. */ const char *pfasta_strerror(const pfasta_file *pf) { if (!pf) return NULL; if (pf->errno__ == 0) { return pf->errstr; } else { return strerror(pf->errno__); } } /** @brief Creates a new string that can grow dynamically. * * @param ds - A reference to the dynstr container. * * @returns 0 iff successful. */ static inline int dynstr_init(dynstr *ds) { *ds = (dynstr){NULL, 0, 0}; ds->str = malloc(61); if (!ds->str) return -1; ds->str[0] = '\0'; ds->capacity = 61; return 0; } /** @brief A append a character to a string. * * @param ds - A reference to the dynstr container. * @param c - The new character. * * @returns 0 iff successful. */ static inline int dynstr_put(dynstr *ds, char c) { if (ds->count >= ds->capacity - 1) { char *neu = reallocarray(ds->str, ds->capacity / 2, 3); if (!neu) { dynstr_free(ds); return -1; } ds->str = neu; ds->capacity = (ds->capacity / 2) * 3; } ds->str[ds->count++] = c; return 0; } /** @brief Frees a dynamic string. */ static inline void dynstr_free(dynstr *ds) { if (!ds) return; free(ds->str); *ds = (dynstr){NULL, 0, 0}; } /** @brief Returns the string as a standard `char*`. The internal reference is * then deleted. Hence the name *move* as in *move semantics*. * * @param ds - The dynamic string to move from. * * @returns a `char*` to a standard null-terminated string. */ static inline char *dynstr_move(dynstr *ds) { char *out = ds->str; out[ds->count] = '\0'; *ds = (dynstr){NULL, 0, 0}; return out; } /** @brief Returns the current length of the dynamic string. */ static inline size_t dynstr_len(const dynstr *ds) { return ds->count; } andi-0.9.6.1/libs/pfasta.h000066400000000000000000000031031265514611600151640ustar00rootroot00000000000000/* * Copyright (c) 2015, Fabian Klötzl * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ #ifndef PFASTA_H #define PFASTA_H /** The following is the maximum length of an error string. It has to be * carefully chosen, so that all calls to PF_FAIL_STR succeed. For instance, * the line number can account for up to 20 characters. */ #define PF_ERROR_STRING_LENGTH 100 typedef struct pfasta_file { char *buffer, *readptr, *fillptr; char *errstr; int errno__; int fd; size_t line; char errstr_buf[PF_ERROR_STRING_LENGTH]; char unexpected_char; } pfasta_file; typedef struct pfasta_seq { char *name, *comment, *seq; } pfasta_seq; int pfasta_parse(pfasta_file *, int file_descriptor); void pfasta_free(pfasta_file *); void pfasta_seq_free(pfasta_seq *); int pfasta_read(pfasta_file *, pfasta_seq *); const char *pfasta_strerror(const pfasta_file *); #endif /* PFASTA_H */ andi-0.9.6.1/m4/000077500000000000000000000000001265514611600131275ustar00rootroot00000000000000andi-0.9.6.1/m4/ax_cxx_compile_stdcxx_11.m4000066400000000000000000000123351265514611600202750ustar00rootroot00000000000000# ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014 Alexey Sokolov # Copyright (c) 2014, 2015 Google Inc. # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; struct Base { virtual void f() {} }; struct Child : public Base { virtual void f() override {} }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; auto l = [](){}; // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test() { func(0); } } ]]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) andi-0.9.6.1/opt/000077500000000000000000000000001265514611600134115ustar00rootroot00000000000000andi-0.9.6.1/opt/Makefile.am000066400000000000000000000003211265514611600154410ustar00rootroot00000000000000noinst_LIBRARIES= libcompat.a libcompat_a_SOURCES= compat-string.h compat-stdlib.h if !HAVE_STRCHRNUL libcompat_a_SOURCES+= strchrnul.c endif if !HAVE_REALLOCARRAY libcompat_a_SOURCES+= reallocarray.c endif andi-0.9.6.1/opt/compat-stdlib.h000066400000000000000000000001201265514611600163150ustar00rootroot00000000000000#include void *reallocarray(void *optr, size_t nmemb, size_t size); andi-0.9.6.1/opt/compat-string.h000066400000000000000000000001051265514611600163450ustar00rootroot00000000000000#ifndef HAVE_STRCHRNUL char *strchrnul(const char *s, int c); #endif andi-0.9.6.1/opt/psufsort/000077500000000000000000000000001265514611600152765ustar00rootroot00000000000000andi-0.9.6.1/opt/psufsort/Makefile.am000066400000000000000000000003671265514611600173400ustar00rootroot00000000000000noinst_LIBRARIES = libpsufsort.a libpsufsort_a_SOURCES = psufsort.cxx c_interface.cxx interface.h $(top_srcdir)/src/global.h libpsufsort_a_CXXFLAGS = $(OPENMP_CXXFLAGS) -Wall -Wextra libpsufsort_a_CPPFLAGS = $(OPENMP_CXXFLAGS) -I$(top_srcdir)/src andi-0.9.6.1/opt/psufsort/c_interface.cxx000066400000000000000000000004701265514611600202650ustar00rootroot00000000000000#include #include #include std::vector psufsort(const std::string& T); extern "C" int c_psufsort(const char *str, int* SA){ if( !str || !SA){ return 1; } auto T = std::string(str); auto temp = psufsort(T); memcpy(SA, temp.data()+1, T.size() * sizeof(int)); return 0; } andi-0.9.6.1/opt/psufsort/interface.h000066400000000000000000000003041265514611600174040ustar00rootroot00000000000000#ifdef __cplusplus std::vector psufsort(const std::string& T); #else #ifdef __cplusplus extern "C" { #endif int c_psufsort(const char *str, int* SA); #ifdef __cplusplus } #endif #endif andi-0.9.6.1/opt/psufsort/psufsort.cxx000066400000000000000000000156301265514611600177140ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include void mk_sort (std::vector& SA, const std::string& T, size_t l, size_t r, size_t depth); void insertion_sort (std::vector& SA, const std::string& T, size_t l, size_t r, size_t depth); void TSQS (std::vector& SA, const std::string& T, size_t l, size_t r, size_t depth); void mk_buildin (std::vector& SA, const std::string& T, size_t l, size_t r, size_t depth); std::vector psufsort(const std::string& T); class Bucket { public: size_t start, size; constexpr Bucket() noexcept : start(0), size(0) {}; }; class PSufSort { const std::string& T; std::vector& SA; size_t threshold; public: PSufSort(const std::string& _T, std::vector& _SA, size_t size) : T(_T), SA(_SA) { threshold = std::log(size); } ~PSufSort() {}; // All intervals are semi-open: [l,r) void sort(size_t l, size_t r, size_t depth, size_t calls); void sort_tsqs(size_t l, size_t r, size_t depth, size_t calls); void sort_insert(size_t l, size_t r, size_t depth, size_t calls); void sort_heap(size_t l, size_t r, size_t depth, size_t calls); void build_heap( int* rSA, size_t n, size_t depth); void heapify( int* rSA, size_t heap_size, size_t i, size_t depth); char median3(size_t a, size_t b, size_t c, size_t depth); void swap_range(size_t a, size_t b, size_t n); inline char char_at( size_t sai, size_t depth); inline const char *str_from( size_t sai, size_t depth); }; std::vector psufsort(const std::string& T){ auto n = T.size(); auto SA = std::vector(n+1); auto L = std::vector(256); auto bucket_SM = std::vector(256*256); // S- auto bucket_SS = std::vector(256*256); // S* auto SM = [&](size_t X, size_t Y) -> Bucket& { return bucket_SM[(X<<8) + Y]; }; auto SS = [&](size_t X, size_t Y) -> Bucket& { return bucket_SS[(X<<8) + Y]; }; // classify suffixes and compute the bucket sizes ssize_t i = n -1; while( i >= 0){ if( T[i] >= T[i+1]){ L[T[i]].size++; i--; continue; } SS(T[i], T[i+1]).size++; i--; while( i >= 0 && T[i] <= T[i+1]){ SM(T[i], T[i+1]).size++; i--; } } // Deal with the null byte SS(0,0).size = 1; SA[0] = n; // compute bucket starting points int j = 0; for(i=0; i<256; i++){ L[i].start = j; j += L[i].size; for(auto k =i; k< 256; k++){ SS(i, k).start = j; j += SS(i, k).size; SM(i, k).start = j; j += SM(i, k).size; } } // fill in S* buckets i = n -1; while( i >= 0){ auto c = T[i]; if( c >= T[i+1]){ // skip L i--; continue; } SA[SS(c,T[i+1]).start] = i; SS(c,T[i+1]).start++; i--; while( i >= 0 && T[i] <= T[i+1]){ // skip S- i--; } } // correct the `++` from the previous loop. for(i=0; i<256*256; i++){ bucket_SS[i].start -= bucket_SS[i].size; } // sort all S* suffixes #pragma omp parallel for shared(SA,T) schedule(dynamic, 1) num_threads( (FLAGS & F_LOW_MEMORY) ? THREADS : 1) for(i=0; i<256*256; i++){ const auto buc = bucket_SS[i]; if( buc.size > 1){ int b = buc.start; int e = b + buc.size; auto sorter = PSufSort( T, SA, buc.size); // sort sorter.sort( b, e, 2, 0); } } // induced insert all S- for(i=n; i >= 0;i--){ int j = SA[i]; if( j == 0) continue; auto a = T[j-1]; auto b = T[j]; if( a <= b){ SA[SM(a, b).start + SM(a, b).size - 1] = j-1; SM(a, b).size--; } } // induced insert all Ls for(i=0; i= T[j]){ SA[L[a].start] = j -1; L[a].start++; } } return SA; // move doesnt move } inline char PSufSort::char_at( size_t sai, size_t depth){ return T[sai + depth]; } inline const char *PSufSort::str_from( size_t sai, size_t depth){ return &T[sai + depth]; } void PSufSort::swap_range(size_t a, size_t b, size_t n){ auto& SA = this->SA; for(auto i=0; i< n; i++){ std::swap(SA[a++], SA[b++]); } } void PSufSort::sort (size_t l, size_t r, size_t depth, size_t calls) { if(l >= r){ return; } auto m = r - l; if( m < 2 ){ return; } if (m <= 16){ sort_insert(l, r, depth, calls); return; } if( calls < threshold){ sort_tsqs(l, r, depth, calls); } else { sort_heap(l, r, depth, calls); } } void PSufSort::sort_insert (size_t l, size_t r, size_t depth, size_t unused){ auto cmp_from = [&]( size_t a, size_t b){ auto ta = T.data()+ a +depth; auto tb = T.data()+ b +depth; return strcmp(ta,tb); }; for(auto j = l+1; j < r; j++){ auto X = SA[j]; auto i = j; for(; i > l && cmp_from( SA[i-1], X) > 0 ; i--){ SA[i] = SA[i-1]; } SA[i] = X; } } char PSufSort::median3(size_t b, size_t a, size_t c, size_t depth){ auto key = [&](size_t i){ return char_at(SA[i], depth); }; if( key(a) > key(b) ){ std::swap(SA[a], SA[b]); } if( key(b) > key(c) ){ std::swap(SA[b], SA[c]); } if( key(a) > key(b) ){ std::swap(SA[a], SA[b]); } return key(b); } void PSufSort::sort_tsqs (size_t l, size_t r, size_t depth, size_t calls){ auto K = median3(l, (r-l)/2 + l, r-1, depth); // pick K auto a = l; auto b = l; auto c = r-1; auto d = r-1; while(true) { for(; b <= c && char_at(SA[b], depth) <= K; b++){ if( char_at(SA[b], depth) == K){ std::swap(SA[a], SA[b]); a++; } } for(; b <= c && char_at(SA[c], depth) >= K; c--){ if( char_at(SA[c], depth) == K){ std::swap(SA[c],SA[d]); d--; } } if( b > c) break; std::swap(SA[b],SA[c]); b++, c--; } auto m = std::min(a-l, b-a); swap_range(l, b-m, m); m = std::min(d-c, r-d-1); swap_range(b, r-m, m); auto i = l + b - a; auto j = r - d + c; this->sort(l, i, depth, calls + 1); this->sort(i, j, depth+1, calls + 1); this->sort(j, r, depth, calls + 1); } constexpr inline size_t LEFT(size_t i) noexcept { return (i << 1) + 1; } constexpr inline size_t RIGHT(size_t i) noexcept { return (i << 1) + 2; } constexpr inline size_t PARENT( size_t i) noexcept { return (i-1) >> 1; } void PSufSort::build_heap( int* rSA, size_t n, size_t depth){ auto heap_size = n; for( ssize_t i= PARENT(n-1); i>=0 ; i--){ heapify(rSA, heap_size, i, depth); } } void PSufSort::heapify( int* rSA, size_t heap_size, size_t i, size_t depth){ // aka. siftDown auto key = [&](size_t j){ return T.data() + j + depth; }; auto l = LEFT(i); auto r = RIGHT(i); auto largest = i; if( l < heap_size && strcmp( key(rSA[l]) , key(rSA[i])) > 0 ){ largest = l; } if( r < heap_size && strcmp( key(rSA[r]) , key(rSA[largest])) > 0){ largest = r; } if( largest != i){ std::swap(rSA[i], rSA[largest]); heapify(rSA, heap_size, largest, depth); } } void PSufSort::sort_heap(size_t left, size_t right, size_t depth, size_t calls){ auto rSA = SA.data() + left; auto n = right - left; auto heap_size = n; build_heap(rSA, n, depth); for( auto i = n-1; i ; i--){ std::swap(rSA[0],rSA[i]); heap_size--; heapify(rSA, heap_size, 0, depth); } } andi-0.9.6.1/opt/reallocarray.c000066400000000000000000000023721265514611600162410ustar00rootroot00000000000000#include #include #include "compat-stdlib.h" /* * Copyright (c) 2008 Otto Moerbeek * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW */ #define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4)) void *reallocarray(void *optr, size_t nmemb, size_t size) { if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && nmemb > 0 && SIZE_MAX / nmemb < size) { errno = ENOMEM; return NULL; } return realloc(optr, size * nmemb); } andi-0.9.6.1/opt/strchrnul.c000066400000000000000000000003561265514611600156050ustar00rootroot00000000000000/* @brief Here follows a simple implementation of the GNU function `strchrnul`. * Please check the gnulib manual for details. */ char *strchrnul(const char *s, int c){ char *p = strchr(s,c); return p != NULL ? p : strchr(s, '\0'); } andi-0.9.6.1/scripts/000077500000000000000000000000001265514611600142765ustar00rootroot00000000000000andi-0.9.6.1/scripts/maf2phy.awk000066400000000000000000000023511265514611600163510ustar00rootroot00000000000000# maf2phy.awk # Author: Bernhard Haubold, haubold@evolbio.mpg.de # Contributors: Fabian Klötzl, kloetzl@evolbio.mpg.de # Date: June 19, 2014 # Last Modified: February 5, 2015 BEGIN{ if(!n){ print "maf2phy.awk: Convert mutation annotation format (maf) as generated by the program mugsy to PHYLIP"; print "Usage: awk -f maf2phy.awk -v n= file.maf > file.phy"; exit(-1); } numName = 0; test = "mult=" n; }{ if(/^a/){ if($0 ~ test) open = 1; else open = 0; } if(open && /^s/){ if(!s[$2]) names[numNames++] = $2; s[$2] = s[$2] $7; } }END{ # check equal length of sequences len = -1; for(i=0;i 0){ if(length(s[name]) != len){ print "sequence length should be " len " but is in fact " length(s[name]); exit(-1); } }else len = length(s[name]); } print numNames, len; start = 1; l = 60; for(i=0;i /dev/null # In theory we have to calculate the anchors distance here using the previously # computed matches. But since vmatch is already significantly slower than andi, # we skip this step. done andi-0.9.6.1/src/000077500000000000000000000000001265514611600133765ustar00rootroot00000000000000andi-0.9.6.1/src/Makefile.am000066400000000000000000000013341265514611600154330ustar00rootroot00000000000000bin_PROGRAMS = andi if !BUILD_WITH_LIBDIVSUFSORT PSUFSORT=$(top_builddir)/opt/psufsort/libpsufsort.a # This is a hack to make sure, andi is created with a C++ compiler DUMMY=dummy.cxx endif andi_SOURCES = andi.c esa.c process.c sequence.c io.c global.h esa.h process.h sequence.h io.h dist_hack.h \ model.h model.c andi_CPPFLAGS = $(OPENMP_CFLAGS) -I$(top_srcdir)/libs -I$(top_srcdir)/opt -std=gnu99 andi_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra -Wno-missing-field-initializers andi_CXXFLAGS = $(OPENMP_CXXFLAGS) -Wall -Wextra andi_LDADD = $(PSUFSORT) $(top_builddir)/libs/libpfasta.a $(top_builddir)/opt/libcompat.a nodist_EXTRA_andi_SOURCES = $(DUMMY) .PHONY: perf perf: CFLAGS+= -g -O3 -ggdb -fno-omit-frame-pointer perf: andi andi-0.9.6.1/src/andi.c000066400000000000000000000175501265514611600144650ustar00rootroot00000000000000/** * @file * * This is the main file. It contains functions to parse the commandline * arguments, read files etc. * * @brief The main file * @author Fabian Klötzl * * @section License * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU 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 * General Public License for more details at * http://www.gnu.org/copyleft/gpl.html * */ #include #include #include #include #include #include #include #include #include "global.h" #include "process.h" #include "io.h" #include "sequence.h" #ifdef _OPENMP #include #endif /* Global variables */ int FLAGS = 0; int THREADS = 1; long unsigned int BOOTSTRAP = 0; double RANDOM_ANCHOR_PROP = 0.05; gsl_rng *RNG = NULL; int MODEL = M_JC; void usage(void); void version(void); /** * @brief The main function. * * The main function reads and parses the commandline arguments. Depending on * the set flags it reads the input files and forwards the contained sequences * to processing. */ int main(int argc, char *argv[]) { int c; int version_flag = 0; struct option long_options[] = {{"version", no_argument, &version_flag, 1}, {"help", no_argument, NULL, 'h'}, {"verbose", no_argument, NULL, 'v'}, {"join", no_argument, NULL, 'j'}, {"low-memory", no_argument, NULL, 'l'}, {"threads", required_argument, NULL, 't'}, {"bootstrap", required_argument, NULL, 'b'}, {"model", required_argument, NULL, 'm'}, {0, 0, 0, 0}}; #ifdef _OPENMP // Use all available processors by default. THREADS = omp_get_num_procs(); #endif // parse arguments while (1) { int option_index = 0; c = getopt_long(argc, argv, "jvht:p:m:b:l", long_options, &option_index); if (c == -1) { break; } switch (c) { case 0: break; case 'h': usage(); break; case 'v': FLAGS |= FLAGS & F_VERBOSE ? F_EXTRA_VERBOSE : F_VERBOSE; break; case 'p': { errno = 0; char *end; double prop = strtod(optarg, &end); if (errno || end == optarg || *end != '\0') { warnx( "Expected a floating point number for -p argument, but " "'%s' was given. Skipping argument.", optarg); break; } if (prop < 0.0 || prop > 1.0) { warnx("A probability should be a value between 0 and 1; " "Ignoring -p %f argument.", prop); break; } RANDOM_ANCHOR_PROP = prop; break; } case 'l': FLAGS |= F_LOW_MEMORY; break; case 'j': FLAGS |= F_JOIN; break; case 't': { #ifdef _OPENMP errno = 0; char *end; long unsigned int threads = strtoul(optarg, &end, 10); if (errno || end == optarg || *end != '\0') { warnx("Expected a number for -t argument, but '%s' was " "given. Ignoring -t argument.", optarg); break; } if (threads > (long unsigned int)omp_get_num_procs()) { warnx( "The number of threads to be used, is greater then the " "number of available processors; Ignoring -t %lu " "argument.", threads); break; } THREADS = threads; #else warnx( "This version of andi was built without OpenMP and thus " "does not support multi threading. Ignoring -t argument."); #endif break; } case 'b': { errno = 0; char *end; long unsigned int bootstrap = strtoul(optarg, &end, 10); if (errno || end == optarg || *end != '\0' || bootstrap == 0) { warnx( "Expected a positive number for -b argument, but '%s' " "was given. Ignoring -b argument.", optarg); break; } BOOTSTRAP = bootstrap - 1; break; } case 'm': { // valid options are 'RAW' and 'JC' if (strcasecmp(optarg, "RAW") == 0) { MODEL = M_RAW; } else if (strcasecmp(optarg, "JC") == 0) { MODEL = M_JC; } else if (strcasecmp(optarg, "KIMURA") == 0) { MODEL = M_KIMURA; } else { warnx("Ignoring argument for --model. Expected Raw JC or Kimura"); } break; } case '?': /* intentional fall-through */ default: usage(); break; } } if (version_flag) { version(); } argc -= optind; argv += optind; // at least one file name must be given if (FLAGS & F_JOIN && argc == 0) { errx(1, "In join mode at least one filename needs to be supplied."); } dsa_t dsa; if (dsa_init(&dsa)) { errx(errno, "Out of memory."); } const char *file_name; // parse all files int minfiles = FLAGS & F_JOIN ? 2 : 1; for (;; minfiles--) { if (!*argv) { if (minfiles <= 0) break; // if no files are supplied, read from stdin file_name = "-"; } else { file_name = *argv++; } if (FLAGS & F_JOIN) { read_fasta_join(file_name, &dsa); } else { read_fasta(file_name, &dsa); } } size_t n = dsa_size(&dsa); if (FLAGS & F_VERBOSE) { fprintf(stderr, "Comparing %zu sequences\n", n); fflush(stderr); } RNG = gsl_rng_alloc(gsl_rng_default); if (!RNG) { err(1, "RNG allocation failed."); } // seed the random number generator with the current time gsl_rng_set(RNG, time(NULL)); seq_t *sequences = dsa_data(&dsa); // compute distance matrix if (n >= 2) { calculate_distances(sequences, n); } else { warnx("I am truly sorry, but with less than two sequences (%zu given) " "there is nothing to compare.", n); } dsa_free(&dsa); gsl_rng_free(RNG); return 0; } /** * Prints the usage to stdout and then exits successfully. */ void usage(void) { const char str[] = { "Usage: andi [-jlv] [-b INT] [-p FLOAT] [-m MODEL] [-t INT] FILES...\n" "\tFILES... can be any sequence of FASTA files. If no files are " "supplied, stdin is used instead.\n" "Options:\n" " -b, --bootstrap \n" " Print additional bootstrap matrices\n" " -j, --join Treat all sequences from one file as a single " "genome\n" " -l, --low-memory Use less memory at the cost of speed\n" " -m, --model \n" " Pick an evolutionary model; default: JC\n" " -p Significance of an anchor pair; default: 0.05\n" " -v, --verbose Prints additional information\n" #ifdef _OPENMP " -t, --threads \n" " The number of threads to be used; by default, all " "available processors are used\n" #endif " -h, --help Display this help and exit\n" " --version Output version information and acknowledgments\n"}; printf("%s", str); exit(EXIT_SUCCESS); } /** * This function just prints the version string and then aborts * the program. It conforms to the [GNU Coding * Standard](http://www.gnu.org/prep/standards/html_node/_002d_002dversion.html#g_t_002d_002dversion). */ void version(void) { const char str[] = { "andi " VERSION "\n" "Copyright (C) 2014, 2015 Fabian Klötzl\n" "License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n\n" "Acknowledgments:\n" "1) Andi: Haubold, B. Klötzl, F. and Pfaffelhuber, P. (2015). " "Fast and accurate estimation of evolutionary distances between " "closely related genomes\n" "2) Algorithms: Ohlebusch, E. (2013). Bioinformatics Algorithms. " "Sequence Analysis, Genome Rearrangements, and Phylogenetic " "Reconstruction. pp 118f.\n" "3) SA construction: Mori, Y. (2005). Short description of improved " "two-stage suffix sorting alorithm. " "http://homepage3.nifty.com/wpage/software/itssort.txt\n"}; printf("%s", str); exit(EXIT_SUCCESS); } andi-0.9.6.1/src/dist_hack.h000066400000000000000000000034201265514611600154770ustar00rootroot00000000000000/** @file * @brief This file is a preprocessor hack for the two functions `distMatrix` * and `distMatrixLM`. */ #ifdef FAST #define NAME distMatrix #define P_OUTER _Pragma("omp parallel for num_threads( THREADS)") #define P_INNER #else #undef NAME #undef P_OUTER #undef P_INNER #define NAME distMatrixLM #define P_OUTER #define P_INNER _Pragma("omp parallel for num_threads( THREADS)") #endif /** @brief This function calls dist_andi for pairs of subjects and queries, and *thereby fills the distance matrix. * * This function is actually two functions. It is one template that gets *compiled into two functions via * preprocessor hacks. The reason is DRY (Do not Repeat Yourselves). * The two functions only differ by their name and pragmas; i.e. They run in *different parallel modes. * `distMatrix` is faster than `distMatrixLM` but needs more memory. * * @param sequences - The sequences to compare * @param n - The number of sequences * @param M - A matrix for additional output data */ void NAME(struct model *M, seq_t *sequences, size_t n) { size_t i; //#pragma P_OUTER for (i = 0; i < n; i++) { seq_t *subject = &sequences[i]; esa_s E; if (seq_subject_init(subject) || esa_init(&E, subject)) { errx(1, "Failed to create index for %s.", subject->name); } // now compare every other sequence to i size_t j; P_INNER for (j = 0; j < n; j++) { if (j == i) { M(i, j) = (struct model){.seq_len = 9, .counts = {9}}; continue; } // TODO: Provide a nicer progress indicator. if (FLAGS & F_EXTRA_VERBOSE) { #pragma omp critical { fprintf(stderr, "comparing %zu and %zu\n", i, j); } } size_t ql = sequences[j].len; M(i, j) = dist_anchor(&E, sequences[j].S, ql, subject->gc); } esa_free(&E); seq_subject_free(subject); } } andi-0.9.6.1/src/esa.c000066400000000000000000000361511265514611600143200ustar00rootroot00000000000000/** * @file * @brief ESA functions * * This file contains various functions that operate on an enhanced suffix * array. The basic algorithms originate from the book of Ohlebusch * "Bioinformatics Algorithms" (2013). Most of these were heavily modified * for improved performance. One example is the lcp-cache. * * The ESA structure defined in esa.h contains a `cache` field. This cache is * used to quickly look up lcp-intervals. Consider the queries "AAGT" and * "AACG". In both cases the interval for "AA" has to be looked up in the * ESA. If we simply store the interval for "AA" in the cache, once and use it * for each query we are significantly faster (up to 7 times). */ #include #include #include #include "esa.h" static void esa_init_cache_dfs(esa_s *, char *str, size_t pos, lcp_inter_t in); static void esa_init_cache_fill(esa_s *, char *str, size_t pos, lcp_inter_t in); static lcp_inter_t get_interval(const esa_s *, lcp_inter_t ij, char a); lcp_inter_t get_match(const esa_s *, const char *query, size_t qlen); static lcp_inter_t get_match_from(const esa_s *, const char *query, size_t qlen, saidx_t k, lcp_inter_t ij); static int esa_init_SA(esa_s *); static int esa_init_LCP(esa_s *); static int esa_init_CLD(esa_s *); /** @brief The prefix length up to which LCP-intervals are cached. */ const size_t CACHE_LENGTH = 10; /** @brief Map a code to the character. */ char code2char(ssize_t code) { switch (code & 0x3) { case 0: return 'A'; case 1: return 'C'; case 2: return 'G'; case 3: return 'T'; } return '\0'; } /** @brief Map a character to a two bit code. */ ssize_t char2code(const char c) { ssize_t result = -1; switch (c) { case 'A': result = 0; break; case 'C': result = 1; break; case 'G': result = 2; break; case 'T': result = 3; break; } return result; } #define R(CLD, i) ((CLD)[(i)]) #define L(CLD, i) ((CLD)[(i)-1]) /** @brief Fills the LCP-Interval cache. * * Traversing the virtual suffix tree, created by SA, LCP and CLD is rather * slow. Hence we create a cache, holding the LCP-interval for a prefix of a * certain length ::CACHE_LENGTH. This function it the entry point for the * cache filling routine. * * @param self - The ESA. * @returns 0 iff successful */ int esa_init_cache(esa_s *self) { lcp_inter_t *cache = malloc((1 << (2 * CACHE_LENGTH)) * sizeof(lcp_inter_t)); if (!cache) { return 1; } self->cache = cache; char str[CACHE_LENGTH + 1]; str[CACHE_LENGTH] = '\0'; saidx_t m = L(self->CLD, self->len); lcp_inter_t ij = {.i = 0, .j = self->len - 1, .m = m, .l = self->LCP[m]}; esa_init_cache_dfs(self, str, 0, ij); return 0; } /** @brief Fills the cache — one char at a time. * * This function is a depth first search on the virtual suffix tree and fills * the cache. Or rather it calls it self until some value to cache is * calculated. This function is a recursive version of get_inteval but with more * edge cases. * * @param C - The ESA. * @param str - The current prefix. * @param pos - The length of the prefix. * @param in - The LCP-interval of prefix[0..pos-1]. */ void esa_init_cache_dfs(esa_s *C, char *str, size_t pos, const lcp_inter_t in) { // we are not yet done, but the current strings do not exist in the subject. if (pos < CACHE_LENGTH && in.i == -1 && in.j == -1) { esa_init_cache_fill(C, str, pos, in); return; } // we are past the caching length if (pos >= CACHE_LENGTH) { esa_init_cache_fill(C, str, pos, in); return; } lcp_inter_t ij; // iterate over all nucleotides for (int code = 0; code < 4; ++code) { str[pos] = code2char(code); ij = get_interval(C, in, str[pos]); // fail early if (ij.i == -1 && ij.j == -1) { esa_init_cache_fill(C, str, pos + 1, ij); continue; } // The LCP-interval is deeper than expected if (ij.l > (ssize_t)(pos + 1)) { // Check if it still fits into the cache if ((size_t)ij.l < CACHE_LENGTH) { // fill with dummy value esa_init_cache_fill(C, str, pos + 1, in); char non_acgt = 0; // fast forward size_t k = pos + 1; for (; k < (size_t)ij.l; k++) { // In some very edgy edge cases the lcp-interval `ij` // contains a `;` or another non-acgt character. Since we // cannot cache those, break. char c = C->S[C->SA[ij.i] + k]; if (char2code(c) < 0) { non_acgt = 1; break; } str[k] = c; } if (non_acgt) { esa_init_cache_fill(C, str, k, ij); } else { esa_init_cache_dfs(C, str, k, ij); } continue; } // If the lcp-interval exceeds the cache depth, stop here and fill esa_init_cache_fill(C, str, pos + 1, in); continue; } // Continue one level deeper esa_init_cache_dfs(C, str, pos + 1, ij); } } /** @brief Fills the cache with a given value. * * Given a prefix and a value this function fills the cache beyond this point * the value. * * @param C - The ESA. * @param str - The current prefix. * @param pos - The length of the prefix. * @param in - The LCP-interval of prefix[0..pos-1]. */ void esa_init_cache_fill(esa_s *C, char *str, size_t pos, lcp_inter_t in) { if (pos < CACHE_LENGTH) { for (int code = 0; code < 4; ++code) { str[pos] = code2char(code); esa_init_cache_fill(C, str, pos + 1, in); } } else { ssize_t code = 0; for (size_t i = 0; i < CACHE_LENGTH; ++i) { code <<= 2; code |= char2code(str[i]); } C->cache[code] = in; } } /** * @brief Initializes the FVC (first variant character) array. * * The FVC is of my own invention and simply defined as * `FVC[i] = S[SA[i]+LCP[i]]`. This expression is constantly used in * get_interval. By precomputing the result, we have less memory * accesses, less cache misses, and thus improved runtimes of up to 15% * faster matching. This comes at a negligible cost of increased memory. * * @param self - The ESA * @returns 0 iff successful */ int esa_init_FVC(esa_s *self) { size_t len = self->len; char *FVC = self->FVC = malloc(len); if (!FVC) { return 1; } const char *S = self->S; const int *SA = self->SA; const int *LCP = self->LCP; FVC[0] = '\0'; for (size_t i = len; i; i--, FVC++, SA++, LCP++) { *FVC = S[*SA + *LCP]; } return 0; } /** @brief Initializes an ESA. * * This function initializes an ESA with respect to the provided sequence. * @param C - The ESA to initialize. * @param S - The sequence * @returns 0 iff successful */ int esa_init(esa_s *C, const seq_t *S) { if (!C || !S || !S->S) return 1; *C = (esa_s){.S = S->RS, .len = S->RSlen}; int result; result = esa_init_SA(C); if (result) return result; result = esa_init_LCP(C); if (result) return result; result = esa_init_CLD(C); if (result) return result; result = esa_init_FVC(C); if (result) return result; result = esa_init_cache(C); if (result) return result; return 0; } /** @brief Free the private data of an ESA. */ void esa_free(esa_s *self) { free(self->SA); free(self->LCP); free(self->CLD); free(self->cache); free(self->FVC); *self = (esa_s){}; } /** * Computes the SA given a string S. To do so it uses libdivsufsort. * @param C The enhanced suffix array to use. Reads C->S, fills C->SA. * @returns 0 iff successful */ int esa_init_SA(esa_s *C) { // assert c.S if (!C || !C->S) { return 1; } C->SA = malloc(C->len * sizeof(saidx_t)); if (!C->SA) { return 2; } saidx_t result = 1; #ifdef HAVE_LIBDIVSUFSORT result = divsufsort((const unsigned char *)C->S, C->SA, C->len); #else result = c_psufsort(C->S, C->SA); #endif return result; } /** @brief Initializes the CLD (child) array. * * See Ohlebusch. * * @param C - The ESA */ int esa_init_CLD(esa_s *C) { if (!C || !C->LCP) { return 1; } saidx_t *CLD = C->CLD = malloc((C->len + 1) * sizeof(saidx_t)); if (!C->CLD) { return 2; } saidx_t *LCP = C->LCP; typedef struct pair_s { saidx_t idx, lcp; } pair_t; pair_t *stack = malloc((C->len + 1) * sizeof(pair_t)); pair_t *top = stack; // points at the topmost filled element pair_t last; R(CLD, 0) = C->len + 1; top->idx = 0; top->lcp = -1; // iterate over all elements for (size_t k = 1; k < (size_t)(C->len + 1); k++) { while (LCP[k] < top->lcp) { // top->lcp is a leaf last = *top--; // link all elements of same lcp value in a chain while (top->lcp == last.lcp) { R(CLD, top->idx) = last.idx; last = *top--; } // store the l-index of last if (LCP[k] < top->lcp) { R(CLD, top->idx) = last.idx; } else { L(CLD, k) = last.idx; } } // continue one level deeper top++; top->idx = k; top->lcp = LCP[k]; } free(stack); return 0; } /** * This function computed the LCP array, given the suffix array. Thereto it uses * a special `phi` array, which makes it slightly faster than the original * linear-time algorithm by Kasai et al. * * @param C The enhanced suffix array to compute the LCP from. * @returns 0 iff successful */ int esa_init_LCP(esa_s *C) { const char *S = C->S; saidx_t *SA = C->SA; saidx_t len = C->len; // Trivial safety checks if (!C || !S || !SA || len == 0) { return 1; } // Allocate new memory // The LCP array is one element longer than S. saidx_t *LCP = C->LCP = malloc((len + 1) * sizeof(saidx_t)); if (!LCP) { return 3; } LCP[0] = -1; LCP[len] = -1; // Allocate temporary arrays saidx_t *PHI = malloc(len * sizeof(saidx_t)); saidx_t *PLCP = PHI; if (!PHI) { free(PHI); return 2; } PHI[SA[0]] = -1; saidx_t k; ssize_t i; for (i = 1; i < len; i++) { PHI[SA[i]] = SA[i - 1]; } ssize_t l = 0; for (i = 0; i < len; i++) { k = PHI[i]; if (k != -1) { while (S[k + l] == S[i + l]) { l++; } PLCP[i] = l; l--; if (l < 0) l = 0; } else { PLCP[i] = -1; } } // unpermutate the LCP array for (i = 1; i < len; i++) { LCP[i] = PLCP[SA[i]]; } free(PHI); return 0; } /** @brief For the lcp-interval of string `w` compute the interval for `wa` * * Say, we already know the LCP-interval ij for a string `w`. Now we want to * check if `wa` may also be found in the ESA and thus in the subject. So we * look for the sub interval of `ij` in which all strings feature an `a` as * the next character. If such a sub interval is found, its boundaries are * returned. * * @param self - The ESA. * @param ij - The lcp-interval for `w`. * @param a - The next character. * @returns The lcp-interval one level deeper. */ static lcp_inter_t get_interval(const esa_s *self, lcp_inter_t ij, char a) { saidx_t i = ij.i; saidx_t j = ij.j; const saidx_t *SA = self->SA; const saidx_t *LCP = self->LCP; const char *S = self->S; const saidx_t *CLD = self->CLD; const char *FVC = self->FVC; // check for singleton or empty interval if (i == j) { if (S[SA[i] + ij.l] != a) { ij.i = ij.j = -1; } return ij; } int m = ij.m; int l = ij.l; char c = S[SA[i] + l]; goto SoSueMe; do { c = FVC[i]; SoSueMe: if (c == a) { /* found ! */ saidx_t n = L(CLD, m); ij = (lcp_inter_t){.i = i, .j = m - 1, .m = n, .l = LCP[n]}; return ij; } if (c > a) { break; } i = m; if (i == j) { break; // singleton interval, or `a` not found } m = R(CLD, m); } while (/*m != "bottom" && */ LCP[m] == l); // final sanity check if (i != ij.i ? FVC[i] == a : S[SA[i] + l] == a) { ij.i = i; ij.j = j; /* Also return the length of the LCP interval including `a` and * possibly even more characters. Note: l + 1 <= LCP[m] */ ij.l = LCP[m]; ij.m = m; } else { ij.i = ij.j = -1; } return ij; } /** @brief Compute the longest match of a query with the subject. * * The *longest match* is the core concept of `andi`. Its simply defined as the * longest prefix of a query Q appearing anywhere in the subject S. Talking * about genetic sequences, a match is a homologous region, likely followed by a * SNP. * * This function returns the interval for where the longest match of the query * can be found in the ESA. Thereto it expects a starting interval for the * search. * * @param C - The enhanced suffix array for the subject. * @param query - The query sequence. * @param qlen - The length of the query. Should correspond to `strlen(query)`. * @param k - The starting index into the query. * @param ij - The LCP interval for the string `query[0..k]`. * @returns The LCP interval for the longest prefix. */ lcp_inter_t get_match_from(const esa_s *C, const char *query, size_t qlen, saidx_t k, lcp_inter_t ij) { if (ij.i == -1 && ij.j == -1) { return ij; } // fail early on singleton intervals. if (ij.i == ij.j) { // try to extend the match. See line 513 below. saidx_t p = C->SA[ij.i]; size_t k = ij.l; const char *S = (const char *)C->S; for (; k < qlen && S[p + k]; k++) { if (S[p + k] != query[k]) { ij.l = k; return ij; } } ij.l = k; return ij; } saidx_t l, i, j; lcp_inter_t res = ij; const saidx_t *SA = C->SA; const char *S = C->S; // Loop over the query until a mismatch is found do { // Get the subinterval for the next character. ij = get_interval(C, ij, query[k]); i = ij.i; j = ij.j; // If our match cannot be extended further, return. if (i == -1 && j == -1) { res.l = k; return res; } res.i = ij.i; res.j = ij.j; l = qlen; if (i < j && ij.l < l) { /* Instead of making another look up we can use the LCP interval * calculated in get_interval */ l = ij.l; } // By definition, the kth letter of the query was matched. k++; // Extend the match for (int p = SA[i]; k < l; k++) { if (S[p + k] != query[k]) { res.l = k; return res; } } } while (k < (ssize_t)qlen); res.l = qlen; return res; } /** @brief Get a match. * * Given an ESA and a string Q find the longest prefix of Q that matches * somewhere in C. This search is done entirely via jumping around in the ESA, * and thus is slow. * * @param C - The ESA. * @param query - The query string — duh. * @param qlen - The length of the query. * @returns the lcp interval of the match. */ lcp_inter_t get_match(const esa_s *C, const char *query, size_t qlen) { // sanity checks if (!C || !query || !C->len || !C->SA || !C->LCP || !C->S || !C->CLD) { return (lcp_inter_t){-1, -1, -1, -1}; } saidx_t m = L(C->CLD, C->len); lcp_inter_t ij = {.i = 0, .j = C->len - 1, .m = m, .l = C->LCP[m]}; return get_match_from(C, query, qlen, 0, ij); } /** @brief Compute the LCP interval of a query. For a certain prefix length of * the query its LCP interval is retrieved from a cache. Hence this is faster * than the naive `get_match`. If the cache fails to provide a proper value, we * fall back to the standard search. * * @param C - The enhanced suffix array for the subject. * @param query - The query sequence. * @param qlen - The length of the query. Should correspond to `strlen(query)`. * @returns The LCP interval for the longest prefix. */ lcp_inter_t get_match_cached(const esa_s *C, const char *query, size_t qlen) { if (qlen <= CACHE_LENGTH) return get_match(C, query, qlen); ssize_t offset = 0; for (size_t i = 0; i < CACHE_LENGTH && offset >= 0; i++) { offset <<= 2; offset |= char2code(query[i]); } if (offset < 0) { return get_match(C, query, qlen); } lcp_inter_t ij = C->cache[offset]; if (ij.i == -1 && ij.j == -1) { return get_match(C, query, qlen); } return get_match_from(C, query, qlen, ij.l, ij); } andi-0.9.6.1/src/esa.h000066400000000000000000000040021265514611600143130ustar00rootroot00000000000000/** * @file * @brief This header contains the declarations for functions in esa.c. * */ #ifndef _ESA_H_ #define _ESA_H_ #include "sequence.h" #include "config.h" #ifdef HAVE_LIBDIVSUFSORT #include #else #include "../opt/psufsort/interface.h" typedef int saidx_t; #endif /** * @brief Represents LCP-Intervals. * * This struct is used to represent LCP-intervals. The member `i` should * coincide with the lower bound whereas `j` is the upper bound. Both bounds * are inclusive. So if `i == j` the interval contains exactly one element, * namely `i`. To represent an empty interval please use `i == j == -1`. * Other variants, such as `i == j == -2` can be used to indicate an error. * The common prefix length is denoted by l and should always be non-negative. * Variables of this type are often called `ij`. */ typedef struct { /** @brief The common prefix length */ saidx_t l; /** @brief lower bound */ saidx_t i; /** @brief upper bound */ saidx_t j; /** The new middle. */ saidx_t m; } lcp_inter_t; /** * @brief The ESA type. * * This structure holds arrays and objects associated with an enhanced * suffix array (ESA). */ typedef struct esa_s { /** The base string from which the ESA was generated. */ const char *S; /** The actual suffix array with indexes into S. */ saidx_t *SA; /** The LCP holds the number of letters up to which a suffix `S[SA[i]]` equals `S[SA[i-1]]`. Hence the name longest common prefix. For `i = 0` and `i = len` the LCP value is -1. */ saidx_t *LCP; /** The length of the string S. */ saidx_t len; /** A cache for lcp-intervals */ lcp_inter_t *cache; /** The FVC array holds the character after the LCP. */ char *FVC; /** This is the child array. */ saidx_t *CLD; } esa_s; lcp_inter_t get_match_cached(const esa_s *, const char *query, size_t qlen); lcp_inter_t get_match(const esa_s *, const char *query, size_t qlen); int esa_init(esa_s *, const seq_t *S); void esa_free(esa_s *); #ifdef DEBUG char code2char(ssize_t code); #endif // DEBUG #endif andi-0.9.6.1/src/global.h000066400000000000000000000024251265514611600150120ustar00rootroot00000000000000/** * @file * @brief Global Definitions * * This file contains the declaration of global variables and * their related values. The actual definition is located in andi.c */ #ifndef _GLOBAL_H_ #define _GLOBAL_H_ #include #include "config.h" /** * The *global* variable ::FLAGS is used to set different options * for the execution of the program. Use `FLAGS & F_NAME` to check * if `F_NAME` was set. */ extern int FLAGS; /** * The *global* variable ::THREADS contains the number of threads the program * should use. */ extern int THREADS; /** * The ::RANDOM_ANCHOR_PROP represents the probability with which a found * anchor is a random match and not homologous. Its value can be set using * the `-p` switch. */ extern double RANDOM_ANCHOR_PROP; /** * The number of matrices that should be bootstrapped. */ extern long unsigned int BOOTSTRAP; /** * A globel random number generator. Has to be seedable. */ extern gsl_rng *RNG; /** * The evolutionary model. */ extern int MODEL; enum { M_RAW, M_JC, M_KIMURA }; /** * This enum contains the available flags. Please note that all * available options are a power of 2. */ enum { F_NONE = 0, F_VERBOSE = 2, F_EXTRA_VERBOSE = 4, F_NON_ACGT = 8, F_JOIN = 16, F_LOW_MEMORY = 32, F_SHORT = 64 }; #endif andi-0.9.6.1/src/io.c000066400000000000000000000116601265514611600141550ustar00rootroot00000000000000/** * @file * @brief This file contains the definitions for various io methods. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include "global.h" #include "io.h" /** * @brief Joins all sequences from a file into a single long sequence. * * Apart from reading all sequences from a file, this function also * merges them into one long sequence. * * "I didn't learn joined up handwriting for nothing, you know." * ~ Gilderoy Lockhart * * @param in - The file pointer to read from. * @param dsa - An array that holds found sequences. * @param name - The name of the file to be used for the name of the sequence. */ void read_fasta_join(const char *file_name, dsa_t *dsa) { if (!file_name || !dsa) return; dsa_t single; dsa_init(&single); read_fasta(file_name, &single); if (dsa_size(&single) == 0) { return; } seq_t joined = dsa_join(&single); /* In join mode we try to be clever about the sequence name. Given the file * path we extract just the file name. ie. path/file.ext -> file * This obviously fails on Windows. */ const char *left = strrchr(file_name, '/'); // find the last path separator left = (left == NULL) ? file_name : left + 1; // left is the position one of // to the right of the path // separator const char *dot = strchrnul(left, '.'); // find the extension joined.name = strndup( left, dot - left); // copy only the file name, not its path or extension dsa_push(dsa, joined); dsa_free(&single); } /** * @brief This function reads sequences from a file. * @param in - The file pointer to read from. * @param dsa - An array that holds found sequences. */ void read_fasta(const char *file_name, dsa_t *dsa) { if (!file_name || !dsa) return; int file_descriptor = strcmp(file_name, "-") ? open(file_name, O_RDONLY) : STDIN_FILENO; if (file_descriptor < 0) { warn("%s", file_name); return; } int l; int check; seq_t top = {}; pfasta_file pf; if ((l = pfasta_parse(&pf, file_descriptor)) != 0) { warnx("%s: %s", file_name, pfasta_strerror(&pf)); goto fail; } pfasta_seq ps; while ((l = pfasta_read(&pf, &ps)) == 0) { check = seq_init(&top, ps.seq, ps.name); // skip broken sequences if (check != 0) continue; dsa_push(dsa, top); pfasta_seq_free(&ps); } if (l < 0) { warnx("%s: %s", file_name, pfasta_strerror(&pf)); pfasta_seq_free(&ps); } fail: pfasta_free(&pf); close(file_descriptor); } /** * @brief Prints the distance matrix. * * This function pretty prints the distance matrix. For small distances * scientific notation is used. * * @param D - The distance matrix * @param sequences - An array of pointers to the sequences. * @param n - The number of sequences. * @param warnings - Print warnings? Set to 0 for bootstrapped matrices. */ void print_distances(const struct model *D, const seq_t *sequences, size_t n, int warnings) { size_t i, j; int use_scientific = 0; double *DD = malloc(n * n * sizeof(*DD)); if (!DD) err(errno, "meh."); #define DD(X, Y) (DD[(X)*n + (Y)]) typedef double(estimate_fn)(const model *); estimate_fn *estimate; switch (MODEL) { case M_RAW: estimate = &estimate_RAW; break; case M_JC: estimate = &estimate_JC; break; case M_KIMURA: estimate = &estimate_KIMURA; break; } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { model datum = D(i, j); if (!(FLAGS & F_EXTRA_VERBOSE)) { datum = model_average(&D(i, j), &D(j, i)); } double dist = DD(i, j) = i == j ? 0.0 : estimate(&datum); double coverage = model_coverage(&datum); if (isnan(dist) && warnings) { const char str[] = { "For the two sequences '%s' and '%s' the distance " "computation failed and is reported as nan. " "Please refer to the documentation for further details."}; warnx(str, sequences[i].name, sequences[j].name); } else if (dist > 0 && dist < 0.001) { use_scientific = 1; } else if (i < j && coverage < 0.05 && warnings) { const char str[] = { "For the two sequences '%s' and '%s' less than 5%% " "homology were found (%f and %f, respectively)."}; warnx(str, sequences[i].name, sequences[j].name, model_coverage(&D(i, j)), model_coverage(&D(j, i))); } } } printf("%zu\n", n); for (i = 0; i < n; i++) { // Print exactly nine characters of the name. Pad with spaces if // necessary. printf("%-9.9s", sequences[i].name); for (j = 0; j < n; j++) { // use scientific notation for small numbers printf(use_scientific ? " %1.4e" : " %1.4f", DD(i, j)); } printf("\n"); } free(DD); } /** * @brief Prints the coverage matrix. * @param D - The distance matrix * @param n - The number of sequences. */ void print_coverages(const struct model *D, size_t n) { size_t i, j; printf("\nCoverage:\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%1.4e ", model_coverage(&D(i, j))); } printf("\n"); } } andi-0.9.6.1/src/io.h000066400000000000000000000011001265514611600141460ustar00rootroot00000000000000/** * @file * @brief This header contains function declarations for io procedures. */ #ifndef _IO_H_ #define _IO_H_ #include #include #include #include "sequence.h" #include "model.h" /** * This is a neat hack for dealing with matrices. */ #define D(X, Y) (D[(X)*n + (Y)]) #define M(X, Y) (M[(X)*n + (Y)]) void read_fasta(const char *, dsa_t *dsa); void read_fasta_join(const char *, dsa_t *dsa); void print_distances(const struct model *, const seq_t *, size_t, int); void print_coverages(const struct model *, size_t); #endif // _IO_H_ andi-0.9.6.1/src/model.c000066400000000000000000000143501265514611600146450ustar00rootroot00000000000000/** @file * @brief This file contains all functions for the mutation matrix and the * estimation of evolutionary distances thereof. */ #include #include #include #include #include "global.h" #include "model.h" /** * @brief Sum some mutation count specified by `summands`. Intended to be used * through the `model_sum` macro. * * @param MM - The mutation matrix. * @param summands - The mutations to add. * @returns The sum of mutations. */ static size_t model_sum_types(const model *MM, const int summands[]) { size_t total = 0; for (int i = 0; summands[i] != MUTCOUNTS; ++i) { total += MM->counts[summands[i]]; } return total; } #define model_sum(MM, ...) \ model_sum_types((MM), (int[]){__VA_ARGS__, MUTCOUNTS}) /** * @brief Average two mutation matrices. * * @param MM - One matrix * @param NN - Second matrix * @returns The average (sum) of two mutation matrices. */ model model_average(const model *MM, const model *NN) { model ret = *MM; for (int i = 0; i != MUTCOUNTS; ++i) { ret.counts[i] += NN->counts[i]; } ret.seq_len += NN->seq_len; return ret; } /** * @brief Compute the total number of nucleotides in the pairwise alignment. * * @param MM - The mutation matrix. * @returns The length of the alignment. */ size_t model_total(const model *MM) { size_t total = 0; for (size_t i = 0; i < MUTCOUNTS; ++i) { total += MM->counts[i]; } return total; } /** * @brief Compute the coverage of an alignment. * * @param MM - The mutation matrix. * @returns The relative coverage */ double model_coverage(const model *MM) { size_t covered = model_total(MM); size_t actual = MM->seq_len; return (double)covered / (double)actual; } /** * @brief Estimate the uncorrected distance of a pairwise alignment. * * @param MM - The mutation matrix. * @returns The uncorrected substitution rate. */ double estimate_RAW(const model *MM) { size_t nucl = model_total(MM); size_t SNPs = model_sum(MM, AtoC, AtoG, AtoT, CtoG, CtoT, GtoT); // Insignificant results. All abort the fail train. if (nucl <= 3) { return NAN; } return (double)SNPs / (double)nucl; } /** * @brief Compute the Jukes-Cantor distance. * * @param MM - The mutation matrix. * @returns The corrected JC distance. */ double estimate_JC(const model *MM) { double dist = estimate_RAW(MM); dist = -0.75 * log(1.0 - (4.0 / 3.0) * dist); // jukes cantor // fix negative zero return dist <= 0.0 ? 0.0 : dist; } /** @brief computes the evolutionary distance using K80. * * @param MM - The mutation matrix. * @returns The corrected Kimura distance. */ double estimate_KIMURA(const model *MM) { size_t nucl = model_total(MM); size_t transitions = model_sum(MM, AtoG, CtoT); size_t transversions = model_sum(MM, AtoC, AtoT, GtoC, GtoT); double P = (double)transitions / (double)nucl; double Q = (double)transversions / (double)nucl; double tmp = 1.0 - 2.0 * P - Q; double dist = -0.25 * log((1.0 - 2.0 * Q) * tmp * tmp); // fix negative zero return dist <= 0.0 ? 0.0 : dist; } /* @brief Bootstrap a mutation matrix. * * The classical bootstrapping process, as described by Felsenstein, resamples * all nucleotides of a MSA. As andi only computes a pairwise alignment, this * process boils down to a simple multinomial distribution. We just have to * resample the elements of the mutation matrix. (Paper in review.) * * @param MM - The original mutation matrix. * @returns A bootstrapped mutation matrix. */ model model_bootstrap(const model MM) { model datum = MM; size_t nucl = model_total(&MM); double p[MUTCOUNTS]; for (size_t i = 0; i < MUTCOUNTS; ++i) { p[i] = MM.counts[i] / (double)nucl; } unsigned int n[MUTCOUNTS]; gsl_ran_multinomial(RNG, MUTCOUNTS, nucl, p, n); for (size_t i = 0; i < MUTCOUNTS; ++i) { datum.counts[i] = n[i]; } return datum; } /** * @brief Given an anchor, classify nucleotides. * * For anchors we already know that the nucleotides of the subject and the query * are equal. Thus only one sequence has to be analysed. See `model_count` for * an explanation of the algorithm. * * @param MM - The mutation matrix * @param S - The subject * @param len - The anchor length */ void model_count_equal(model *MM, const char *S, size_t len) { size_t local_counts[4] = {0}; for (; len--;) { char s = *S++; if (s < 'A') { continue; } unsigned char nibble_s = s & 7; static const unsigned int mm1 = 0x20031000; unsigned char index = (mm1 >> (4 * nibble_s)) & 0x3; local_counts[index]++; } MM->counts[AtoA] += local_counts[0]; MM->counts[CtoC] += local_counts[1]; MM->counts[GtoG] += local_counts[2]; MM->counts[TtoT] += local_counts[3]; } /** * @brief Count the substitutions and add them to the mutation matrix. * * @param MM - The mutation matrix. * @param S - The subject * @param Q - The query * @param len - The length of the alignment */ void model_count(model *MM, const char *S, const char *Q, size_t len) { size_t local_counts[MUTCOUNTS] = {0}; for (; len--; S++, Q++) { char s = *S; char q = *Q; // Skip special characters. if (s < 'A' || q < 'A') { continue; } /* We want to map characters: * A → 0 * C → 1 * G → 2 * T → 3 * The trick used below is that the three lower bits of the * characters are unique. Thus, they can be used to compute the mapping * above. The mapping itself is done via tricky bitwise operations. */ unsigned char nibble_s = s & 7; unsigned char nibble_q = q & 7; static const unsigned int mm1 = 0x20031000; // Pick the correct two bits representing s and q. unsigned char foo = (mm1 >> (4 * nibble_s)) & 0x3; unsigned char baz = (mm1 >> (4 * nibble_q)) & 0x3; /* * The mutation matrix is symmetric. For convenience we define the * mutation XtoY with X > Y. */ if (baz > foo) { int temp = foo; foo = baz; baz = temp; } /* * Finally, we want to map the indices to the correct mutation. This is * done by utilising the mutation types in model.h. */ static const unsigned int map4 = 0x9740; unsigned int base = (map4 >> (4 * baz)) & 0xf; unsigned int index = base + (foo - baz); local_counts[index]++; } for (int i = 0; i != MUTCOUNTS; ++i) { MM->counts[i] += local_counts[i]; } } andi-0.9.6.1/src/model.h000066400000000000000000000027571265514611600146620ustar00rootroot00000000000000/** @file * @brief This header contains all structures and prototypes for creating a * mutation matrix and estimating distances trough an evolutionary model * thereof. */ #pragma once #include /** * This enum contains all possible mutations. Some of them are considered * symmetric (e.g. AtoT and TtoA) and thus have the same value. The total number * of different possible mutations is MUTCOUNTS. */ enum { AtoA, AtoC, AtoG, AtoT, CtoC, CtoG, CtoT, GtoG, GtoT, TtoT, MUTCOUNTS, CtoA = AtoC, GtoA = AtoG, GtoC = CtoG, TtoA = AtoT, TtoC = CtoT, TtoG = GtoT }; /** @brief The mutation matrix. * * We need to keep track of the different types of mutations between two * sequences. For this the following matrix is filled. * * To A C G T * From * A ( ) * C ( ) * G ( ) * T ( ) * * The cells are absolute counts. Together with seq_len (the query length), * we can deduce the substitution rate and coverage. */ typedef struct model { /** The absolute counts of mutation types. */ size_t counts[MUTCOUNTS]; /** The query length. */ size_t seq_len; } model; void model_count_equal(model *, const char *, size_t); void model_count(model *, const char *, const char *, size_t); model model_average(const model *, const model *); double model_coverage(const model *); double estimate_RAW(const model *); double estimate_JC(const model *); double estimate_KIMURA(const model *); model model_bootstrap(const model); andi-0.9.6.1/src/process.c000066400000000000000000000243671265514611600152340ustar00rootroot00000000000000 /** * @file * @brief This file contains various distance methods. */ #include #include #include #include #include #include "esa.h" #include "global.h" #include "io.h" #include "model.h" #include "process.h" #include "sequence.h" #include #include #include #ifdef _OPENMP #include #endif double shuprop(size_t x, double g, size_t l); int calculate_bootstrap(const struct model *M, const seq_t *sequences, size_t n); /** * @brief Calculates the minimum anchor length. * * Given some parameters calculate the minimum length for anchors according * to the distribution from Haubold et al. (2009). * * @param p - The probability with which an anchor is allowed to be random. * @param g - The the relative amount of GC in the subject. * @param l - The length of the subject. * @returns The minimum length of an anchor. */ size_t minAnchorLength(double p, double g, size_t l) { size_t x = 1; double prop = 0.0; while (prop < 1 - p) { prop = shuprop(x, g / 2, l); x++; } return x; } /** * @brief Calculates the binomial coefficient of n and k. * * We used to use gsl_sf_lnchoose(xx,kk) for this functionality. * After all, why implement something that has already been done? * Well, the reason is simplicity: GSL is used for only this one * function and the input (n<=20) is not even considered big. * Hence its much easier to have our own implementation and ditch * the GSL dependency even if that means our code is a tiny bit * less optimized and slower. * * @param n - The n part of the binomial coefficient. * @param k - analog. * @returns (n choose k) */ size_t binomial_coefficient(size_t n, size_t k) { if (n <= 0 || k > n) { return 0; } if (k == 0 || k == n) { return 1; } if (k > n - k) { k = n - k; } size_t res = 1; for (size_t i = 1; i <= k; i++) { res *= n - k + i; res /= i; } return res; } /** * @brief Given `x` this function calculates the probability of a shustring * with a length less than `x`. * * Let X be the longest shortest unique substring (shustring) at any position. * Then this function computes P{X <= x} with respect to the given parameter * set. See Haubold et al. (2009). * * @param x - The maximum length of a shustring. * @param g - The the half of the relative amount of GC in the DNA. * @param l - The length of the subject. * @returns The probability of a certain shustring length. */ double shuprop(size_t x, double p, size_t l) { double xx = (double)x; double ll = (double)l; size_t k; double s = 0.0; for (k = 0; k <= x; k++) { double kk = (double)k; double t = pow(p, kk) * pow(0.5 - p, xx - kk); s += pow(2, xx) * (t * pow(1 - t, ll)) * (double)binomial_coefficient(x, k); if (s >= 1.0) { s = 1.0; break; } } return s; } /** * @brief Divergence estimation using the anchor technique. * * The dist_anchor() function estimates the divergence between two * DNA sequences. The subject is given as an ESA, whereas the query * is a simple string. This function then looks for *anchors* -- long * substrings that exist in both sequences. Then it manually checks for * mutations between those anchors. * * @return An estimate for the number of mutations within homologous regions. * @param C - The enhanced suffix array of the subject. * @param query - The actual query string. * @param query_length - The length of the query string. Needed for speed * reasons. */ model dist_anchor(const esa_s *C, const char *query, size_t query_length, double gc) { struct model ret = {.seq_len = query_length, .counts = {0}}; lcp_inter_t inter; size_t last_pos_Q = 0; size_t last_pos_S = 0; size_t last_length = 0; // This variable indicates that the last anchor was the right anchor of a // pair. size_t last_was_right_anchor = 0; size_t this_pos_Q = 0; size_t this_pos_S; size_t this_length; size_t num_right_anchors = 0; #ifdef DEBUG size_t num_matches = 0; size_t num_anchors = 0; size_t num_anchors_in_rc = 0; size_t num_right_anchors_in_rc = 0; size_t length_anchors = 0; double off_num = 0.0; double off_dem = 0.0; #endif size_t threshold = minAnchorLength(1 - sqrt(1 - RANDOM_ANCHOR_PROP), gc, C->len); // Iterate over the complete query. while (this_pos_Q < query_length) { inter = get_match_cached(C, query + this_pos_Q, query_length - this_pos_Q); #ifdef DEBUG num_matches++; #endif this_length = inter.l <= 0 ? 0 : inter.l; if (inter.i == inter.j && this_length >= threshold) { // We have reached a new anchor. this_pos_S = C->SA[inter.i]; #ifdef DEBUG num_anchors++; length_anchors += this_length; if (this_pos_S < (size_t)(C->len / 2)) { num_anchors_in_rc++; } #endif // Check if this can be a right anchor to the last one. if (this_pos_S > last_pos_S && this_pos_Q - last_pos_Q == this_pos_S - last_pos_S) { num_right_anchors++; #ifdef DEBUG if (this_pos_S < (size_t)(C->len / 2)) { num_right_anchors_in_rc++; } #endif // classify nucleotides in the qanchor model_count_equal(&ret, query + last_pos_Q, last_length); // Count the SNPs in between. model_count(&ret, C->S + last_pos_S + last_length, query + last_pos_Q + last_length, this_pos_Q - last_pos_Q - last_length); last_was_right_anchor = 1; } else { #ifdef DEBUG double off = fabs((double)(this_pos_Q - last_pos_Q) - (double)(this_pos_S - last_pos_S)); if (off < 100) { off_num += off; off_dem++; } #endif if (last_was_right_anchor) { // If the last was a right anchor, but with the current one, // we cannot extend, then add its length. model_count_equal(&ret, C->S + last_pos_S, last_length); } else if ((last_length / 2) >= threshold) { // The last anchor wasn't neither a left or right anchor. // But, it was as long as an anchor pair. So still count it. model_count_equal(&ret, C->S + last_pos_S, last_length); } last_was_right_anchor = 0; } // Cache values for later last_pos_Q = this_pos_Q; last_pos_S = this_pos_S; last_length = this_length; } // Advance this_pos_Q += this_length + 1; } #ifdef DEBUG if (FLAGS & F_EXTRA_VERBOSE) { const char str[] = {"- threshold: %ld\n" "- matches: %lu\n" "- anchors: %lu (rc: %lu)\n" "- right anchors: %lu (rc: %lu)\n" "- avg length: %lf\n" "- off: %f (skipped: %.0f)\n" "\n"}; #pragma omp critical { fprintf(stderr, str, threshold, num_matches, num_anchors, num_anchors_in_rc, num_right_anchors, num_right_anchors_in_rc, (double)length_anchors / num_anchors, off_num / off_dem, off_dem); } } #endif // Very special case: The sequences are identical if (last_length >= query_length) { model_count(&ret, C->S + last_pos_S, query, query_length); return ret; } // We might miss a few nucleotides if the last anchor was also a right // anchor. if (last_was_right_anchor) { model_count(&ret, C->S + last_pos_S, query + last_pos_Q, last_length); } return ret; } /** * @brief Computes the distance matrix. * * The distMatrix() populates the D matrix with computed distances. * @param sequences An array of pointers to the sequences. * @param n The number of sequences. */ #define FAST #include "dist_hack.h" /** * @brief Computes the distance matrix. * * The distMatrixLM() populates the D matrix with computed distances. * @param sequences An array of pointers to the sequences. * @param n The number of sequences. */ #undef FAST #include "dist_hack.h" /** * @brief Calculates and prints the distance matrix * @param sequences - An array of pointers to the sequences. * @param n - The number of sequences. */ void calculate_distances(seq_t *sequences, int n) { int i; // check the sequences for (i = 0; i < n; i++) { if (sequences[i].S == NULL || sequences[i].len == 0) { errx(1, "Missing sequence: %s", sequences[i].name); } if (sequences[i].len < 1000) { FLAGS |= F_SHORT; } } if (FLAGS & F_SHORT) { warnx("One of the given input sequences is shorter than a thousand " "nucleotides. This may result in inaccurate distances. Try an " "alignment instead."); } // Warn about non ACGT residues. if (FLAGS & F_NON_ACGT) { warnx("The input sequences contained characters other than acgtACGT. " "These were automatically stripped to ensure correct results."); } model *M = malloc(n * n * sizeof(*M)); if (!M) { err(errno, "Could not allocate enough memory for the comparison " "matrix. Try using --join or --low-memory."); } // compute the distances if (FLAGS & F_LOW_MEMORY) { distMatrixLM(M, sequences, n); } else { distMatrix(M, sequences, n); } // print the results print_distances(M, sequences, n, 1); // print additional information. if (FLAGS & F_VERBOSE) { print_coverages(M, n); } // create new bootstrapped distance matrices if (BOOTSTRAP) { int res = calculate_bootstrap(M, sequences, n); if (res) { warnx("Bootstrapping failed."); } } free(M); } /** Yet another hack. */ #define B(X, Y) (B[(X)*n + (Y)]) /** @brief Computes a bootstrap from _pairwise_ aligments. * * Doing bootstrapping for alignments with only two sequences is easy. It boils * down to a simple multi-nomial process over the substitution matrix. * * @param M - the initial distance matrix * @param sequences - a list of the sequences, containing their lengths * @param n - the number of sequences * * The number of bootstrapped distance matrices to print is implicitly * passed via the global `BOOTSTRAP` variable. * * @returns 0 iff successful. */ int calculate_bootstrap(const struct model *M, const seq_t *sequences, size_t n) { if (!M || !sequences || !n) { return 1; } // B is the new bootstrap matrix struct model *B = malloc(n * n * sizeof(*B)); if (!B) return 2; // Compute a number of new distance matrices while (BOOTSTRAP--) { for (size_t i = 0; i < n; i++) { for (size_t j = i; j < n; j++) { if (i == j) { B(i, j) = (struct model){.seq_len = 1.0, .counts = {1.0}}; continue; } // Bootstrapping should only be used with averaged distances. model datum = model_average(&M(i, j), &M(j, i)); datum = model_bootstrap(datum); B(j, i) = B(i, j) = datum; } } print_distances(B, sequences, n, 0); } free(B); return 0; } andi-0.9.6.1/src/process.h000066400000000000000000000003271265514611600152270ustar00rootroot00000000000000/** * @file * @brief This file contains the declarations of functions in process.c * */ #ifndef _PROCESS_H_ #define _PROCESS_H_ #include "sequence.h" void calculate_distances(seq_t *sequences, int n); #endif andi-0.9.6.1/src/sequence.c000066400000000000000000000134371265514611600153620ustar00rootroot00000000000000/** * @file * @brief Sequence utilities * * This file contains utility functions for working with DNA sequences. */ #include #include #include #include #include #include "sequence.h" #include "global.h" void normalize(seq_t *S); /** Create a new dynamic array for sequences. */ int dsa_init(dsa_t *A) { // allocate at least 4 slots so the growth by 1.5 below doesn't get stuck // at 3 slots. A->data = malloc(sizeof(seq_t) * 4); if (!A->data) { return 1; } A->capacity = 4; A->size = 0; return 0; } /** Add a sequence to an array. */ void dsa_push(dsa_t *A, seq_t S) { if (A->size < A->capacity) { A->data[A->size++] = S; } else { // use the near-optimal growth factor of 1.5 seq_t *ptr = reallocarray(A->data, A->capacity / 2, sizeof(seq_t) * 3); if (ptr == NULL) { err(errno, "out of memory?"); } A->capacity = (A->capacity / 2) * 3; A->data = ptr; A->data[A->size++] = S; } } /** Frees the array and all sequences stored within. */ void dsa_free(dsa_t *A) { size_t i; for (i = 0; i < A->size; i++) { seq_free(&A->data[i]); } free(A->data); *A = (dsa_t){}; } /** Returns the number of sequences stored within an array. */ size_t dsa_size(dsa_t *A) { return A->size; } /** Get the raw C array. */ seq_t *dsa_data(dsa_t *A) { return A->data; } /** * @brief Convert an array of multiple sequences into a single sequence. * * This function joins all sequences contained in an array into one * long sequence. The sequences are separated by a `!` character. The * caller has to free the initial array. * * @returns A new sequence representation the union of the array. */ seq_t dsa_join(dsa_t *A) { seq_t joined = {}; if (A->size == 0) { return joined; } if (A->size == 1) { /* If we are to join just one sequence, _move_ its contents. */ joined = A->data[0]; A->data[0] = (seq_t){}; return joined; } seq_t *data = A->data; seq_t *it = data; // Compute the total length size_t total = 0, i; for (i = 0; i < A->size; i++, it++) { total += it->len + 1; } // A single malloc for the whole new sequence char *ptr = malloc(total); if (ptr == NULL) { return joined; } char *next = ptr; // Copy all old sequences and add a `!` in between it = data; memcpy(next, it->S, it->len); next += it->len; for (i = 1, it++; i < A->size; i++, it++) { *next++ = '!'; memcpy(next, it->S, it->len); next += it->len; } // Don't forget the null byte. *next = '\0'; joined.S = ptr; joined.len = total - 1; // subtract the null byte return joined; } /** * @brief Frees the memory of a given sequence. * @param S - The sequence to free. */ void seq_free(seq_t *S) { free(S->S); free(S->RS); free(S->name); *S = (seq_t){}; } /** * @brief Compute the reverse complement. * @param str The master string. * @param len The length of the master string * @return The reverse complement. The caller has to free it! */ char *revcomp(const char *str, size_t len) { char *rev = malloc(len + 1); if (!str || !rev) return NULL; char *r = rev; const char *s = &str[len - 1]; rev[len] = '\0'; do { char d; switch (*s--) { case 'A': d = 'T'; break; case 'T': d = 'A'; break; case 'G': d = 'C'; break; case 'C': d = 'G'; break; case '!': d = ';'; break; // rosebud default: continue; } *r++ = d; } while (--len); return rev; } /** * @brief This function concatenates the reverse complement to a given master * string. A `#` sign is used as a separator. * @param s The master string. * @param len Its length. * @return The newly concatenated string. */ char *catcomp(char *s, size_t len) { if (!s) return NULL; char *rev = revcomp(s, len); char *temp = realloc(rev, 2 * len + 2); if (!temp) { free(rev); return NULL; } rev = temp; rev[len] = '#'; memcpy(rev + len + 1, s, len + 1); return rev; } /** * @brief Calculates the GC content of a sequence. * * This function computes the relative amount of G and C in the total sequence. */ double calc_gc(const seq_t *S) { size_t GC = 0; const char *p = S->S; for (; *p; p++) { if (*p == 'G' || *p == 'C') { GC++; } } return (double)GC / S->len; } /** @brief Prepares a sequences to be used as the subject in a comparison. */ int seq_subject_init(seq_t *S) { S->gc = calc_gc(S); S->RS = catcomp(S->S, S->len); if (!S->RS) return 1; S->RSlen = 2 * S->len + 1; return 0; } /** @brief Frees some memory unused for when a sequence is only used as query. */ void seq_subject_free(seq_t *S) { free(S->RS); S->RS = NULL; S->RSlen = 0; S->gc = 0.0; } /** @brief Initializes a sequences * * @returns 0 iff successful. */ int seq_init(seq_t *S, const char *seq, const char *name) { if (!S || !seq || !name) { return 1; } *S = (seq_t){.S = strdup(seq), .name = strdup(name)}; if (!S->S || !S->name) { seq_free(S); return 2; } normalize(S); // recalculate the length because `normalize` might have stripped some // characters. S->len = strlen(S->S); const size_t LENGTH_LIMIT = (INT_MAX - 1) / 2; if (S->len > LENGTH_LIMIT) { warnx("The input sequence %s is too long. The technical limit is %zu.", S->name, LENGTH_LIMIT); return 3; } return 0; } /** * @brief Restricts a sequence characters set to ACGT. * * This function strips a sequence of non ACGT characters and converts acgt to * the upper case equivalent. A flag is set if a non-canonical character was * encountered. */ void normalize(seq_t *S) { char *p, *q; char local_non_acgt = 0; for (p = q = S->S; *p; p++) { switch (*p) { case 'A': case 'C': case 'G': case 'T': case '!': *q++ = *p; break; case 'a': case 'c': case 'g': case 't': *q++ = toupper((unsigned char)*p); break; default: local_non_acgt = 1; break; } } *q = '\0'; if (local_non_acgt) { #pragma omp atomic FLAGS |= F_NON_ACGT; } } andi-0.9.6.1/src/sequence.h000066400000000000000000000022331265514611600153570ustar00rootroot00000000000000/** * @file * @brief Functions and structures for DNA sequences * */ #ifndef _SEQUENCE_H_ #define _SEQUENCE_H_ #include #include #include /** * @brief A structure for sequences. * * This structure is used to represent a DNA sequence of some kind. */ typedef struct seq_s { /** This is the DNAs forward strand as a string. */ char *S; /** This member contains first the reverse strand and then the forward strand. */ char *RS; /** The length of the forward strand. */ size_t len; /** Corresponds to strlen(RS) */ size_t RSlen; /** A name for this sequence */ char *name; /** * @brief GC-Content * * The relative amount of G or C in the DNA. */ double gc; } seq_t; void seq_free(seq_t *S); int seq_subject_init(seq_t *S); void seq_subject_free(seq_t *S); int seq_init(seq_t *S, const char *seq, const char *name); /** * A dynamically growing structure for sequences. */ typedef struct dsa_s { seq_t *data; size_t capacity, size; } dsa_t; int dsa_init(dsa_t *A); void dsa_push(dsa_t *A, seq_t S); void dsa_free(dsa_t *A); size_t dsa_size(dsa_t *A); seq_t *dsa_data(dsa_t *A); seq_t dsa_join(dsa_t *dsa); #endif andi-0.9.6.1/test/000077500000000000000000000000001265514611600135665ustar00rootroot00000000000000andi-0.9.6.1/test/Makefile.am000066400000000000000000000021221265514611600156170ustar00rootroot00000000000000check_PROGRAMS = test_esa test_seq test_fasta dist_noinst_DATA = test_extra.sh test_random.sh test_join.sh if !BUILD_WITH_LIBDIVSUFSORT PSUFSORT=$(top_builddir)/opt/psufsort/libpsufsort.a # This is a hack to make sure, the test_esa executable is created with a C++ compiler DUMMY=dummy.cxx endif test_seq_SOURCES = test_seq.c ../src/sequence.c test_seq_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/opt -DDEBUG -std=gnu99 test_seq_CFLAGS = -Wall -Wextra $(GLIB_CFLAGS) -Wno-missing-field-initializers test_seq_LDADD = $(GLIB_LIBS) $(top_builddir)/opt/libcompat.a test_esa_SOURCES = test_esa.c ../src/esa.c ../src/sequence.c $(top_srcdir)/src/esa.h test_esa_CPPFLAGS = $(OPENMP_CFLAGS) -I$(top_srcdir)/libs -I$(top_srcdir)/opt -I$(top_srcdir)/src -DDEBUG -std=gnu99 test_esa_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra $(GLIB_CFLAGS) -Wno-missing-field-initializers test_esa_LDADD = $(GLIB_LIBS) $(PSUFSORT) $(top_builddir)/opt/libcompat.a test_esa_CXXFLAGS = $(OPENMP_CXXFLAGS) -Wall -Wextra nodist_EXTRA_test_esa_SOURCES = $(DUMMY) test_fasta_SOURCES = test_fasta.cxx .PHONY: all all: $(check_PROGRAMS) andi-0.9.6.1/test/test_esa.c000066400000000000000000000115311265514611600155420ustar00rootroot00000000000000#include "esa.h" #include #include "global.h" #include #include int FLAGS = F_NONE; int THREADS = 1; extern const int CACHE_LENGTH; char code3char( ssize_t code){ switch( code & 0x7){ case 0: return 'A'; case 1: return 'C'; case 2: return 'G'; case 3: return 'T'; case 4: return '!'; case 5: return ';'; case 6: return '#'; } return '\0'; } typedef struct { esa_s *C; seq_t *S; } esa_fixture; void assert_equal_lcp( const lcp_inter_t *a, const lcp_inter_t *b){ g_assert_cmpint( a->i, ==, b->i); g_assert_cmpint( a->j, ==, b->j); g_assert_cmpint( a->l, ==, b->l); } void assert_equal_cache_nocache( const esa_s *C, const char *str, size_t qlen){ lcp_inter_t a = get_match_cached(C, str, qlen); lcp_inter_t b = get_match(C, str, qlen); assert_equal_lcp( &a, &b); g_assert(strncmp(str, C->S + C->SA[a.i], a.l) == 0); g_assert( str[a.l] != C->S[ a.l + C->SA[a.i]] || str[a.l] == '\0'); } void setup( esa_fixture *ef, gconstpointer test_data){ ef->C = malloc( sizeof(esa_s)); ef->S = malloc( sizeof(seq_t)); g_assert( ef->C != NULL); g_assert( ef->S != NULL); const char *seq = { "TACGAGCACTGGTGGAATTGATGTC" "CAGTCTTATATGGCGCACCAGGCTG" "ATAGTAGTAGCAGTTTGCTTATCTC" "ATCGCGTGTTTCCGGATGACAGAGA" "TACGTGCACTGGTGGGATTGATGTC" "TAGTATTATATGGCGCACCAGGATG" "ATAGTAGTAGCAGTTTGCTTATCCC" "ATCGCGTGTTTGCGGATGACCGAGA" }; g_assert( seq_init( ef->S, seq, "S0" ) == 0); seq_subject_init( ef->S); g_assert( ef->S->RS != NULL); int check = esa_init( ef->C, ef->S); g_assert( check == 0); } void setup2( esa_fixture *ef, gconstpointer test_data){ ef->C = malloc( sizeof(esa_s)); ef->S = malloc( sizeof(seq_t)); g_assert( ef->C != NULL); g_assert( ef->S != NULL); const char *seq = { "TACGAGCACTGGTGGAATTGATGTC" "CAGTCTTATATGGCGCACCAGGCTG" "ATAGTAGTAGCAGTTTGCTTATCTC" "ATCGCGTGTTTCCGGATGACAGAGA" "!" "TACGTGCACTGGTGGGATTGATGTC" "TAGTATTATATGGCGCACCAGGATG" "ATAGTAGTAGCAGTTTGCTTATCCC" "ATCGCGTGTTTGCGGATGACCGAGA" }; g_assert( seq_init( ef->S, seq, "S0" ) == 0); seq_subject_init( ef->S); g_assert( ef->S->RS != NULL); int check = esa_init( ef->C, ef->S); g_assert( check == 0); } void teardown( esa_fixture *ef, gconstpointer test_data){ esa_free(ef->C); free(ef->C); seq_free(ef->S); free(ef->S); } extern int count; void basic( esa_fixture *ef, gconstpointer test_data){ esa_s *C = ef->C; g_assert( C->SA); lcp_inter_t a = get_match_cached(C, "AAGACTGG", 8); lcp_inter_t b = get_match(C, "AAGACTGG", 8); assert_equal_lcp( &a, &b); g_assert(strncmp("AAGACTGG",C->S + C->SA[a.i], 8) == 0); a = get_match_cached(C, "AATTAAAA", 8); b = get_match(C, "AATTAAAA", 8); assert_equal_lcp( &a, &b); g_assert(strncmp("AATTAAAA",C->S + C->SA[a.i], a.l) == 0); a = get_match_cached(C, "ACCGAGAA", 8); b = get_match(C, "ACCGAGAA", 8); assert_equal_lcp( &a, &b); g_assert(strncmp("ACCGAGAA",C->S + C->SA[a.i], a.l) == 0); a = get_match_cached(C, "AAAAAAAAAAAA", 12); b = get_match(C, "AAAAAAAAAAAA", 12); assert_equal_lcp( &a, &b); g_assert(strncmp("AAAAAAAAAAAA",C->S + C->SA[a.i], a.l) == 0); //g_assert_cmpint(count, >=, 1 << (2*8)); } void normq_cached( esa_fixture *ef, gconstpointer test_data){ esa_s *C = ef->C; g_assert( C->SA); lcp_inter_t a, b; a = get_match_cached(C, "A", 1); b = get_match(C, "A", 1); assert_equal_lcp( &a, &b); a = get_match_cached(C, "C", 1); b = get_match(C, "C", 1); assert_equal_lcp( &a, &b); a = get_match_cached(C, "CT", 2); b = get_match(C, "CT", 2); assert_equal_lcp( &a, &b); a = get_match_cached(C, "AAGACTGG", 8); b = get_match(C, "AAGACTGG", 8); assert_equal_lcp( &a, &b); a = get_match_cached(C, "AATTAAAA", 8); b = get_match(C, "AATTAAAA", 8); assert_equal_lcp( &a, &b); a = get_match_cached(C, "ACCGAGAA", 8); b = get_match(C, "ACCGAGAA", 8); assert_equal_lcp( &a, &b); a = get_match_cached(C, "AAAAAAAAAAAA", 12); b = get_match(C, "AAAAAAAAAAAA", 12); assert_equal_lcp( &a, &b); } size_t MAX_DEPTH = 11; void prefix_dfs( esa_s *C, char *str, size_t depth); void prefix( esa_fixture *ef, gconstpointer test_data){ esa_s *C = ef->C; char str[MAX_DEPTH+1]; str[MAX_DEPTH] = '\0'; prefix_dfs( C, str, 0); } void prefix_dfs( esa_s *C, char *str, size_t depth){ if( depth < MAX_DEPTH){ for( int code = 0; code < 4; ++code){ str[depth] = code2char(code); prefix_dfs( C, str, depth + 1); } } else { assert_equal_cache_nocache(C, str, depth); } } int main(int argc, char *argv[]) { g_test_init( &argc, &argv, NULL); g_test_add("/esa/basic", esa_fixture, NULL, setup, basic, teardown); g_test_add("/esa/sample cache", esa_fixture, NULL, setup, normq_cached, teardown); g_test_add("/esa/sample cache 2", esa_fixture, NULL, setup2, normq_cached, teardown); g_test_add("/esa/full cache", esa_fixture, NULL, setup, prefix, teardown); g_test_add("/esa/full cache 2", esa_fixture, NULL, setup2, prefix, teardown); return g_test_run(); } andi-0.9.6.1/test/test_extra.sh000077500000000000000000000010171265514611600163060ustar00rootroot00000000000000#!/bin/sh -f # Test if andi exists, and can be executed ./src/andi --version > /dev/null || exit 1 # Test andi for more than just two sequences at a time ./test/test_fasta -l 100000 -d 0.01 -d 0.01 -d 0.01 -d 0.01 | ./src/andi > /dev/null || exit 1 # Test low-memory mode ./test/test_fasta -l 10000 > test_extra.fasta ./src/andi test_extra.fasta > extra.out ./src/andi test_extra.fasta --low-memory > extra_low_memory.out diff extra.out extra_low_memory.out || exit 1 rm -f test_extra.fasta extra.out extra_low_memory.out andi-0.9.6.1/test/test_fasta.cxx000066400000000000000000000051071265514611600164520ustar00rootroot00000000000000/** * This program can create genome sequences with a specific distance. */ #include #include #include #include #include using namespace std; void usage(); void print_seq( unsigned, unsigned, int, int, double); int main(int argc, char *argv[]){ random_device rd{}; auto seed = rd(); int length = 1000; int line_length = 70; int raw = 0; auto seqs = vector{0}; int check; while((check = getopt(argc, argv, "s:l:L:d:r")) != -1){ switch(check) { case 's': { seed = static_cast(stol(optarg)); if( seed == 0){ seed = rd(); } break; } case 'l': length = stoi(optarg); break; case 'L': line_length = stoi(optarg); break; case 'd': seqs.push_back(stod(optarg)); break; case 'r': raw = 1; break; case '?': default: usage(); return 1; } } if( seqs.size() < 2){ seqs.push_back(0.1); } if( !raw){ for(auto& dist : seqs) { auto d = dist; auto p = 0.75 - 0.75 * exp(-(4.0/3.0) * d); dist = p; } } auto base_seed = seed; for( int i=0; i< seqs.size(); i++){ cout << ">S" << i << " (base_seed: " << base_seed << ")" << endl; print_seq( base_seed, seed++, length, line_length, seqs[i]); } return 0; } static auto ACGT = "ACGT"; static auto NO_A = "CGT"; static auto NO_C = "AGT"; static auto NO_G = "ACT"; static auto NO_T = "ACG"; void print_seq( unsigned base_seed, unsigned mut_seed, int length, int line_length, double divergence){ char line[line_length+1]; line[line_length] = '\0'; auto base_rand = default_random_engine{base_seed}; auto base_dist = uniform_int_distribution{0,3}; auto base_acgt = [&]{return ACGT[base_dist(base_rand)];}; auto mut_rand = default_random_engine{mut_seed}; auto mut_dist = uniform_real_distribution{0,1}; auto mut = bind( mut_dist, mut_rand); auto mut_acgt = uniform_int_distribution{0,2}; auto mutate = [&](char c){ int idx = mut_acgt(mut_rand); switch(c){ case 'A': return NO_A[idx]; case 'C': return NO_C[idx]; case 'G': return NO_G[idx]; case 'T': return NO_T[idx]; default: return 'X'; } }; double nucleotides = (double)length; double mutations = nucleotides * divergence; for(int i= length, j; i > 0; i -= j){ j = min(line_length, i); for(auto k=0; k /dev/null || exit 1 # Simple join test ./test/test_fasta -l 1000 -L 1000 -d 0.1 > p1.fasta ./test/test_fasta -l 1000 -L 1000 -d 0.1 > p2.fasta ./test/test_fasta -l 10000 -L 10000 -d 0.1 > p3.fasta head -qn 2 p1.fasta p2.fasta p3.fasta > S0.fasta tail -qn 2 p1.fasta p2.fasta p3.fasta > S1.fasta rm p1.fasta p2.fasta p3.fasta; RES=$(./src/andi -m RAW -t 1 -j S0.fasta S1.fasta | tail -n 1 | awk '{print ($2 - 0.1)}' | awk 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1-$2) < 0.01}' ) if test $RES -ne 1; then echo "The last test computed a distance deviating more than one percent from its intended value." echo "See S0.fasta and S1.fasta for the used sequences." exit 1; fi #unbalanced number of contigs ./test/test_fasta -l 1000 -L 1000 -d 0.1 > p2.fasta ./test/test_fasta -l 10000 -L 10000 -d 0.1 > p3.fasta head -qn 2 p3.fasta > S0.fasta tail -qn 2 p2.fasta p3.fasta > S1.fasta rm p2.fasta p3.fasta; RES=$(./src/andi -m RAW -t1 -j S0.fasta S1.fasta | tail -n 1 | awk '{print ($2 - 0.1)}' | awk 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1-$2) < 0.01}' ) if test $RES -ne 1; then echo "The last test computed a distance deviating more than one percent from its intended value." echo "See S0.fasta and S1.fasta for the used sequences." exit 1; fi #unbalanced number of contigs 2 ./test/test_fasta -l 1000 -L 1000 -d 0.1 > p1.fasta ./test/test_fasta -l 1000 -L 1000 -d 0.1 > p2.fasta ./test/test_fasta -l 10000 -L 10000 -d 0.1 > p3.fasta head -qn 2 p1.fasta p3.fasta > S0.fasta tail -qn 2 p1.fasta p2.fasta p3.fasta > S1.fasta rm p1.fasta p2.fasta p3.fasta; RES=$(./src/andi -mRAW -t 1 -j S0.fasta S1.fasta | tail -n 1 | awk '{print ($2 - 0.1)}' | awk 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1-$2) < 0.01}' ) if test $RES -ne 1; then echo "The last test computed a distance deviating more than one percent from its intended value." echo "See S0.fasta and S1.fasta for the used sequences." exit 1; fi rm S0.fasta S1.fasta andi-0.9.6.1/test/test_random.sh000077500000000000000000000044061265514611600164500ustar00rootroot00000000000000#!/bin/sh -f # This scripts test the accuracy of andi with random inputs. For that # it uses the small program test_random to generate pairs of sequences # with a given distance. By default, test_random creates a new set of # sequences each time it is called. Thus, this test has a small, but # non-zero probability of failing. That is a problem with Debian's # reproducible builds effort. So this script acts as a wrapper around # this issue. # # Simply calling this script via # % ./test/test_random.sh # checks a new test-case every time. But with the right parameter # % RANDOM_SEED=1729 ./test/test_random.sh # one specific set of sequences is validated. ./src/andi --help > /dev/null || exit 1 LENGTH=100000 # If RANDOM_SEED is set, use its value. Otherwise 0 is used to signal # to test_random that a new set of sequences shall be generated. SEED=${RANDOM_SEED:-0} for dist in 0.0 0.001 0.01 0.02 0.05 0.1 0.2 0.3 do for n in $(seq 10) do if test $SEED -ne 0; then SEED=$((SEED + 1)) fi res=$(./test/test_fasta -s $SEED -l $LENGTH -d $dist | tee ./test/test_random.fasta | ./src/andi -t 1 | tail -n 1 | awk -v dist=$dist '{print $2, dist}' | awk 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1-$2) <= 0.02 && abs($1-$2) <= 0.02 * $2}') if test $res -ne 1; then echo "The last test computed a distance deviating more than two percent from its intended value." echo "See test_random.fasta for the used sequences." echo "./test/test_fasta -s $SEED -l $LENGTH -d $dist" head -n 1 ./test/test_random.fasta exit 1; fi done # raw for n in $(seq 10) do if test $SEED -ne 0; then SEED=$((SEED + 1)) fi res=$(./test/test_fasta -r -s $SEED -l $LENGTH -d $dist | tee ./test/test_random.fasta | ./src/andi -m RAW -t 1 | tail -n 1 | awk -v dist=$dist '{print $2, dist}' | awk 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1-$2) <= 0.02 && abs($1-$2) <= 0.02 * $2}') if test $res -ne 1; then echo "The last test computed a distance deviating more than two percent from its intended value." echo "See test_random.fasta for the used sequences." echo "./test/test_fasta -r -s $SEED -l $LENGTH -d $dist" head -n 1 ./test/test_random.fasta exit 1; fi done done rm ./test/test_random.fasta andi-0.9.6.1/test/test_seq.c000066400000000000000000000027461265514611600155720ustar00rootroot00000000000000#include #include "global.h" #include #include #include "sequence.h" int FLAGS = F_NONE; void test_seq_basic(){ seq_t S; seq_init( &S, "ACGT", "name"); g_assert_cmpstr(S.S, ==, "ACGT"); g_assert_cmpstr(S.name, ==, "name"); g_assert_cmpuint(S.len, ==, 4); seq_free( &S); } void test_seq_full(){ seq_t S; seq_init( &S, "ACGTTGCA", "name"); int check = seq_subject_init( &S); g_assert_cmpint(check, ==, 0); g_assert_cmpstr(S.RS, ==, "TGCAACGT#ACGTTGCA"); g_assert_cmpuint(S.RSlen, ==, 8*2+1); g_assert( S.gc == 0.5); seq_free( &S); } void test_seq_nonacgt(){ seq_t S; seq_init( &S, "11ACGTNN7682394689NNTGCA11", "name"); seq_subject_init( &S); g_assert_cmpstr(S.S, ==, "ACGTTGCA"); g_assert_cmpuint(S.len, ==, 8 ); g_assert( FLAGS & F_NON_ACGT); g_assert_cmpstr(S.RS, ==, "TGCAACGT#ACGTTGCA"); g_assert_cmpuint(S.RSlen, ==, 8*2+1); g_assert( S.gc == 0.5); seq_free( &S); FLAGS = F_NONE; seq_init( &S, "@ACGT_!0TGCA ", "name"); seq_subject_init( &S); g_assert_cmpstr(S.S, ==, "ACGT!TGCA"); g_assert_cmpuint(S.len, ==, 9 ); g_assert( FLAGS & F_NON_ACGT); g_assert_cmpstr(S.RS, ==, "TGCA;ACGT#ACGT!TGCA"); g_assert_cmpuint(S.RSlen, ==, 9*2+1); seq_free( &S); FLAGS = F_NONE; } int main(int argc, char *argv[]) { g_test_init( &argc, &argv, NULL); g_test_add_func("/seq/basic", test_seq_basic); g_test_add_func("/seq/full", test_seq_full); g_test_add_func("/seq/non acgt", test_seq_nonacgt); return g_test_run(); }