hhsuite-2.0.16/0000775172256617226630000000000012110431065015560 5ustar hauserscientific_computinghhsuite-2.0.16/lib/0000775172256617226630000000000012110431047016326 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/0000775172256617226630000000000012075476615017775 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/VERSION0000664172256617226630000000001012075476615021034 0ustar hauserscientific_computing0.9.9.1 hhsuite-2.0.16/lib/ffindex/test/0000775172256617226630000000000011670345140020740 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/test/testfile0000664172256617226630000000001111670345140022472 0ustar hauserscientific_computingtestfile hhsuite-2.0.16/lib/ffindex/test/data2/0000775172256617226630000000000011670345140021733 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/test/data2/foo0000664172256617226630000000001211670345140022432 0ustar hauserscientific_computingfooo fooo hhsuite-2.0.16/lib/ffindex/test/data/0000775172256617226630000000000011670345140021651 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/test/data/b0000664172256617226630000000000311670345140022006 0ustar hauserscientific_computingbb hhsuite-2.0.16/lib/ffindex/test/data/a0000664172256617226630000000000211670345140022004 0ustar hauserscientific_computinga hhsuite-2.0.16/lib/ffindex/test/data/c0000664172256617226630000000000311670345140022007 0ustar hauserscientific_computingcc hhsuite-2.0.16/lib/ffindex/README0000664172256617226630000000564012075476614020661 0ustar hauserscientific_computing* Copyright FFindex was written by Andy Hauser . Please add your name here if you distribute modified versions. FFindex is provided under the Create Commons license "Attribution-ShareAlike 3.0", which basically captures the spirit of the Gnu Public License (GPL). See: http://creativecommons.org/licenses/by-sa/3.0/ * Thanks Thanks to Laszlo Kajan for creating and maintaining Debian packages and many suggestions to improve the build and user experience. * Overview FFindex is a very simple index/database for huge amounts of small files. The files are stored concatenated in one big data file, seperated by '\0'. A second file contains a plain text index, giving name, offset and length of of the small files. The lookup is currently done with a binary search on an array made from the index file. * Installation $ cd src $ make $ make test If you have MPI and want to compile ffindex_apply_mpi: $ make HAVE_MPI=1 On OS X use for the first make line: $ make -f Makefile.osx # Please use a sensible value for INSTALL_DIR, e.g. /usr/local or /opt/ffindex # or $HOME/ffindex instead of "..". $ make install INSTALL_DIR=.. and with MPI: $ make install INSTALL_DIR=.. HAVE_MPI=1 * Usage Please note that before querying or unlinking entries a ffindex must be sorted, although you can add to it without. So either specify -s with ffindex_build or sorted later with ffindex_modify -s. Setup environment: $ export PATH="$INSTALL_DIR/bin:$PATH" $ export LD_LIBRARY_PATH="$INSTALL_DIR/lib:$LD_LIBRARY_PATH" On OS X set DYLD_LIBRARY_PATH instead of LD_LIBRARY_PATH. Build index from files in test/data and test/data2. $ ffindex_build -s /tmp/test.data /tmp/test.ffindex test/data test/data2 Retrieve three entries: $ ffindex_get /tmp/test.data /tmp/test.ffindex a b foo Unlink (Remove reference from index) an entry: $ ffindex_modify -u /tmp/test.ffindex b Retrieve three entries, "b" should now be missing: $ ffindex_get /tmp/test.data /tmp/test.ffindex a b foo Convert a Fasta file to ffindex, entry names are incerental IDs starting from 1: $ ffindex_from_fasta -s fasta.ffdata fasta.ffindex NC_007779.ffn Get first entry by name: $ ffindex_get fasta.ffdata fasta.ffindex 1 Get first and third entry by entry index, this a little faster: $ ffindex_get fasta.ffdata fasta.ffindex -n 1 3 Count the characters including header in each entry: $ ffindex_apply fasta.ffdata fasta.ffindex wc -c Count the number of characters in each sequence, without the header: $ ffindex_apply fasta.ffdata fasta.ffindex perl -ne '$x += length unless(/^>/); END{print "$x\n"}' Parallel version for counting the characters including header in each entry: $ mpirun -np 4 ffindex_apply_mpi fasta.ffdata fasta.ffindex -- wc -c Parallel version for counting the characters including header in each entry and saving the output to a new ffindex: $ mpirun -np 4 ffindex_apply_mpi fasta.ffdata fasta.ffindex -i out-wc.ffindex -o out-wc.ffdata -- wc -c hhsuite-2.0.16/lib/ffindex/.hgignore0000664172256617226630000000003711766637446021607 0ustar hauserscientific_computing.*\.o test_big bin lib include hhsuite-2.0.16/lib/ffindex/rpm/0000775172256617226630000000000012075476615020573 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/rpm/ffindex.spec0000664172256617226630000000201312075476615023066 0ustar hauserscientific_computingSummary: FFindex is a very simple index/database for huge amounts of small files. Name: ffindex Version: 0.9.8 Release: 1 License: Create Commons license "Attribution-ShareAlike 3.0" Group: Utilities/System Source: http://pubshare.genzentrum.lmu.de/scientific_computing/software/ffindex/ffindex-0.9.8.tar.gz %description FFindex is a very simple index/database for huge amounts of small files. The files are stored concatenated in one big data file, seperated by '\0'. A second file contains a plain text index, giving name, offset and length of of the small files. The lookup is currently done with a binary search on an array made from the index file. %prep %setup %build make %install make install INSTALL_DIR=%{buildroot}%{_prefix} %files %doc README LICENSE /usr/bin/ffindex_build /usr/bin/ffindex_get /usr/bin/ffindex_modify /usr/bin/ffindex_from_fasta /usr/bin/ffindex_apply /usr/bin/ffindex_unpack /usr/include/ffindex.h /usr/include/ffutil.h %{_libdir}/libffindex.a %{_libdir}/libffindex.so %{_libdir}/libffindex.so.0.1 hhsuite-2.0.16/lib/ffindex/LICENSE0000664172256617226630000005265511670345140021003 0ustar hauserscientific_computingAUTHOR FFindex was designed and implemented by Andreas Hauser . Please add your name here if you distribute modified versions. This file must be distributed with any source or binary distribution including parts of this work. SHORT SUMMARY OF THE LICENSE Ffindex is provided under the Create Commons license "Attribution-ShareAlike 3.0", which basically captures the spirit of the Gnu Public License (GPL). See: http://creativecommons.org/licenses/by-sa/3.0/ Basically you are free: * to Share — to copy, distribute and transmit the work * to Remix — to adapt the work Under the following conditions: * Attribution You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). * Share Alike If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. LICENSE THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. 3. "Creative Commons Compatible License" means a license that is listed at http://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. 4. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. 5. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. 6. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. 7. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. 8. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. 9. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. 10. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. 11. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, 4. to Distribute and Publicly Perform Adaptations. 5. For the avoidance of doubt: 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. 2. You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. 3. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. 4. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. hhsuite-2.0.16/lib/ffindex/Makefile0000664172256617226630000000033112075476614021431 0ustar hauserscientific_computingOS:= $(shell uname) ifeq ($(OS), Darwin) MFILE=Makefile.osx else MFILE=Makefile endif all: $(MAKE) -C src -f $(MFILE) $@ %: $(MAKE) -C src -f $(MFILE) $@ release: hg archive -t tgz ffindex-`cat VERSION`.tar.gz hhsuite-2.0.16/lib/ffindex/src/0000775172256617226630000000000012110431000020525 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/src/ffindex.h0000664172256617226630000000625112075476615022364 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * Ffindex is a very simple database for small files. The files are stored * concatenated in one big data file, seperated by '\0'. A second file * contains a plain text index, giving name, offset and length of of the small * files. */ #ifndef _FFINDEX_H #define _FFINDEX_H 1 #include #define FFINDEX_VERSION 0.980 #define FFINDEX_MAX_INDEX_ENTRIES_DEFAULT 40000000 #define FFINDEX_MAX_ENTRY_NAME_LENTH 32 enum ffindex_type { PLAIN_FILE, SORTED_FILE, SORTED_ARRAY, TREE }; typedef struct ffindex_entry { size_t offset; size_t length; char name[FFINDEX_MAX_ENTRY_NAME_LENTH]; } ffindex_entry_t; typedef struct ffindex_index { enum ffindex_type type; char* filename; FILE* file; char* index_data; size_t index_data_size; void* tree_root; size_t num_max_entries; size_t n_entries; ffindex_entry_t entries[]; /* This array is as big as the excess memory allocated for this struct. */ } ffindex_index_t; int ffindex_insert_memory(FILE *data_file, FILE *index_file, size_t *offset, char *from_start, size_t from_length, char *name); int ffindex_insert_file(FILE *data_file, FILE *index_file, size_t *offset, const char *path, char *name); int ffindex_insert_list_file(FILE *data_file, FILE *index_file, size_t *start_offset, FILE *list_file); int ffindex_insert_dir(FILE *data_file, FILE *index_file, size_t *offset, char *input_dir_name); FILE* ffindex_fopen_by_entry(char *data, ffindex_entry_t* entry); FILE* ffindex_fopen_by_name(char *data, ffindex_index_t *index, char *name); char* ffindex_mmap_data(FILE *file, size_t* size); char* ffindex_get_data_by_offset(char* data, size_t offset); char* ffindex_get_data_by_entry(char *data, ffindex_entry_t* entry); char* ffindex_get_data_by_name(char *data, ffindex_index_t *index, char *name); char* ffindex_get_data_by_index(char *data, ffindex_index_t *index, size_t entry_index); ffindex_entry_t* ffindex_get_entry_by_index(ffindex_index_t *index, size_t entry_index); ffindex_entry_t* ffindex_get_entry_by_name(ffindex_index_t *index, char *name); ffindex_index_t* ffindex_index_parse(FILE *index_file, size_t num_max_entries); ffindex_entry_t* ffindex_bsearch_get_entry(ffindex_index_t *index, char *name); void ffindex_sort_index_file(ffindex_index_t *index); int ffindex_write(ffindex_index_t* index, FILE* index_file); ffindex_index_t* ffindex_unlink(ffindex_index_t* index, char *entry_name); ffindex_index_t* ffindex_index_as_tree(ffindex_index_t* index); ffindex_index_t* ffindex_tree_unlink(ffindex_index_t* index, char* name_to_unlink); ffindex_index_t* ffindex_unlink_entries(ffindex_index_t* index, char** sorted_names_to_unlink, int n_names); int ffindex_tree_write(ffindex_index_t* index, FILE* index_file); int ffindex_insert_filestream(FILE *data_file, FILE *index_file, size_t *offset, FILE* file, char *name); char* ffindex_copyright(); #endif hhsuite-2.0.16/lib/ffindex/src/ffindex_apply0000775172256617226630000351126412110430236023331 0ustar hauserscientific_computingELF>@@0 @8@*'@@w w w wlwlX XX@X@DDw wlwl(`QtdGNUGNU32o r_xl%Exl% Exl%hBxl%PBxl%09Bxl%IByl%Eyl%OByl%Ayl%6H yl%E(yl%EH H%u,h%u,h%u,h%u,h%u,h%u,h%u,h%u,h%u,h%u,h%u,h%u,h1I^HHPTI`@H@H@wHHt,HtHÐUHSH=@,u_wlH:,HwlHHH9s$fDHH,wlH,H9r⸀IHt HK&| ߁,H[U`fIHHt`lHKa H=ks,tHtxlÐAWAVAUATUSHHHFLfHnHD$8HFH5 LHD$0*H5 HHD$(H|$(HD$ H|$ H|$(H$g H|$ 1HD$ HIpH\$@HD$@H{C1H޿ DŽ$Ml$8MH$1HD$ f.H{HI9HLHHH|$Iu D$ $aH|$HHSIHt`1E1&u$ֿ$ux6Lc LKdHItPQuIE8HHL)u!IE8H,$AyHL[]A\A]A^A_KtdH|$HRHHt$HH8AIE8Hfffff.Hw8H %H@0GSHH6HsH H[H\$Hl$HHHH|$ HU8Hu@LH0H\$8Hl$@HHDUHSHH?toHtuHK8HHIHHT@H)HHHuHHK8HH[]HRHp0HH@HK8fDH[]5DHj,H5 HH81SHHHHt HH[[fffff.SHHHHt HH[[fffff.ff.UHSHHHƿ轹HD$0HHAx&H3E1ɹ1HĘ[]DH U H H= HĘH[]AVAUIATIUSHH+A@prAZbLAHHH_Hp Lh0L`LH{ HCH.H}EHHE H9Lt$IE11Ic< t(HvHHTPHH< uHvHcɺ LAHHDDPH|$IE@ LH|$IEHI0HEHE HH9nMcMLe8t)HH[]A\A]A^L4vII@HE8H= 1cHH[]A\A]A^H=, 1EHCH1Hg,H5 LH81XH H H=7 )Z@AWMAVAUATIUHSHHHLt$Ht$H$fHLHIt;LLL@HI9tHQ H= LH`LLD$Ht H= HL u+LL+$H5) H $H|$L=HtH A H H= H1[]A\A]A^A_fDH=Z 1MDHl$HH\$Ld$Ll$HL|$Lt$HHHML2IHL¾M HI9tHZ H=w L5fH|$HD$Ht H=֖ HHtHH H H H= F 1H\$Hl$ Ld$(Ll$0Lt$8L|$@HH@LH5 LLLM)Ld$IH5@ H\$Hl$HLl$Lt$HH(IMxHHt@HMHLLLH߉H$Hl$Ld$Ll$Lt$ H((AWIAVAUATIUSHH|$HHt$跜HH+Hl$ L ILHC|,/t BD, /IINl-L$ H$H$HD$@HxHtsx.tLpLLQLHitt$8%=uHT$Ht$MH|$HwHHuf.HȜH$I1H[]A\A]A^A_fH H= HvlH H=Ɠ L`AWIAVAUIATIUHSH(HH\$L$H$HHHHtkHHIH!%tHLD$DHVHDHH)LD$HLLL=H$IH(1[]A\A]A^A_ÐHfff.U SHdL %IAAIdH%d%H,dH% IIǁIIDŽ$@H$=$w d%Hd%Ht@DŽ$E1E1ҺH$ډ$t ,Hg`,H,ldH%IIǁlIǁlH߮,HЮ,n,d%H\$11HH$@HDŽ$H }1H!H$@DŽ$[HAH D$1H޿H$lH$HHAwHDŽ$HD,HE,1H$HDHHH#,趰u*H$HtH=?w HDŽ$@fDHDŽ$ RH,H$@@lHg,!@H,` @HH9HFHTHH!H$H_,13Y,Hz,H[]d%!tÐ1)9Fu~uHE,HpHxHPdH<%@d%щЃd %9uLJHd4%HADH,H _H=,H d4%HDfDHd% tHf.1)9Fu~ud%f‰у 9tud %9udH%0td %dH<%f|fffff.Ð15,H"^,H=pylu8HH=pylt%H@9u O,pHDH),H=lu1@HH=ltH@9ufff.H15,.H],H=pylu7HH=pylt%H@H9uHtH , HH,H=lt8H@HH9tHH=ltH@H9tHH=lu1DHi,dL%HtIHHt,L\,IzpylLHBpylIH\,HHJHHHRHL\,pylI91A@MIpylM@M9tAAǀAIH,AtIRPLAƀH׺HfIHtHLHAƀHH uMIpylhI2H [,HylHtfAPHH=yluHpylt+HFylH[,HH[,HBHn[,Hw[,IH٨,IIHJIH1H,H-[,pyld%H[,pylH],lHJ,luwIǃpylIǃpylHZ,HZ,Z,H?,,HZ,HxylHHBylHZ,LZ,IǃlIǃlH,H,ff.AW1AVAUATUSHd%E1E1d%E1fDdN$MtZL1H HlHHHt/I|HtHEI9IDuHEHtDII uDd%t+AA_dH%H@1HHdH<Ht轸dHHH ud%H[]A\A]A^A_fffff.AU1ATUS5[,LX,dH%IpylxAADMIpyltTM@L9tA\tIyDD/uE1Һd4%HAytMIpyluL,Il|AAfMIltTM@L9tA\tIyDD/uE1Һd4%HAytMIlu ),[]A\A]fff.AT1USH5,H-W,Hpyltr@HH+@HHH@HHHH<HHHDH L(HI)L81LHHmHpyluH-[,HltpfHH+@HHH@HHHH<HHHDH L(HI)71LHwHmHlu ,[]A\S|5ã,HVV,Hpylu[HHpyltLH@HHH)HtHdt Z,s[HU,HyluYfDHHyltGH@HHH)H#tHduHHylu1뀐ATHU,UHH=ylSHXuHylHSH|HL@A$H,HHHHJH@H1LI$H,H)v,I$I$DuH9-Q,s[]A\FfDHH15 ,BHH,HHHqHHH,ulHHH ء,H aT,HǂylHHAHDT,H,HH,H=H,w e,H1HdfH\$Hl$HLd$H(II҉u[S,L1IHٺ=Lֿ6@L$u9d%1H\$Hl$Ld$ H(þ1*IT$(HtIt$0Hc=w1AD$tHc<HcH8=pHcd<% HcWfD R,1t"HH d Dd4%HHfAWAVAUATUISHHHHEHt$HL$0H|$ HT$(-HM H5R,HHEE Y,PH,L%,Hc҃IHAIAAHELUHAI!AI!LH!I9}15,HQ,H=yl[1HHH=yltBHH@HI9wt HtH;sHH=yluHJH9LǃL-,HHHPHHLHH`,HP,HǃpylHLhL-P,H1,HH), ,H{H1HǃHD$HǃHT$8HǃhHWLT$HHHJLT$HI9NHD$L)L)H9LHǃHǃHǃHHHH+c,H H[HHL$(udH%H|$0H@ HH` 1 EHEH(HPHPHXHXH`H`<8<8dH%(HC(dH%0HC0H|$t EHD$ H1d%H}(tVADd%HHAuEt HHD[]A\A]A^A_1E1EtHtH ,HH9$HE H- HH#,H)H1HHHHƃHHHHECHH,,d%HCHd%ǃHHA 15 ,H,HHǃlHHBHʚ, Ӛ,^ Ś,PhƃHH\AǃXH`H,HhHy,uP`@fDE<E  uH81  Hc}HHc}89}>1ud4%HHHA9D6E8@Y1 <@ E3H|$8DLLT$lLT$uL1LH|$8HdD015,`L-$,HHHPHHH, ֘,D1HHt$H|$8跷EA DD ,"fELd$u ITHT$Ht$E11A"DLT$8HHD$8LT$~HL$HHHCHHHU,A,d%HCHǃd%HLT$=HLT$15,\ LLHH,H.J,HǃpylHLhL-J,H, _,* Q,EHHLT$H)H<LT$zHdD0EfHt$H|$89Ht$H|$8A ˵HdD0A d A A11jfffff.AVI1AUATUS5f,P H-H,L ,dH%AA HpyltoAAAfDL@L9t>AIAǀ@A@ uHmHpyluH-,HltpAAAL@L9t>AFIAǀ@A@ uHmHluIi AAfLG,E1IpyluA[Hcd<%!HcD=w.AA AMIpyltI@H9t@u1L,IluDqfDHcd<%!HcD=w.AA AMIlt/I@H9t@u1E1d4%HDHAQ uEH-F,HpyltdAfH@H9t?HUH@t1 uLJd4%HHDHmHpyluH-,Hlt`AfH@H9t?HUH@t1 uLJd4%HHDHmHluIqIyIQA=% #,, []A\A]A^f@2Aǀd4%HIDHmHpyl@jAǀd4%HIDHmHl:H\DD7eE1Һd4%HDA9t?DH\DD7E1Һd4%HDA9tHdSHHH15,HHő,HHHJHHH,HHH,H D,HǃylHHBHC,HP,HHF,H=H1,w$ ,W[Hǃ+ 1H ff.AWAVAUATUSHH|$1H H dH% HHH¸dH1RHHD$UH$HDŽ$HDŽ$&u=H$dH%HD$dH<%Hd%@dH%01d%E1E1d%E1dN$MtZLLH HlHHHt/I|HtHEI9IDuHEHtDII u1d%t+AA_dH%H@1HHdH<Ht dHHH ud%n aA,HD$H\$2HpHHcH)HH!H@w8H|$H9(t=@1<H0[]A\A]A^A_H@w@ɺd4%HHH|$Ht$1 A1HH D$wHAE11d4%HDHT$@uǂ1H‹P ,Hht ǂX H`Hb,HL$HhHM,u`‰H\$`1ȣH=,H%aHĀPH=Ҍ,HbHĀqH=,H`HĀH=,HXbHĀH=u,H`HĀH=V,HbHĀH=7,Hk`HĀ+H=,HaHĀH=,H-`HĀ$H=ڋ,HaHĀnH=,H_HĀH=,H`aHĀ%HH_HĀH=^,H_HĀ@dL4%LLW[L9AI9(1MuuZD[1LWHǃt H0HEH1H\$0Hl$8Ld$@Ll$HLt$PHXfDH1M1H?u@<aA#⹃IDljD$G[1LVD$xnАHH9(tcdH%H9teH9(t\t H1H(u#Ht H0H1HHfD#HÐHH\$Ld$HLl$Hl$ILt$HHI&H9(dH %H9H9(H(1H  @@HUYAƋuMDY1H{UMt H0I$H1H\$ Hl$(Ld$0Ll$8Lt$@HHI}ɚ;v6DAY1HUHǃ(DfD#렐HL[DAFY1HTEuWfe[dH%Ð1H9Ð黅,Ðx=,0ÐH\$Hl$HLd$Ll$H(HIԅ1 E1 t?@tcE|ADH\$Hl$Ld$Ll$ H(H8~tR A@uD蝄<t @Eu<E8A$rfD E1 BAWHHWHĀ HHTYHĀH\$Hl$HLd$H(AHՅ~k1u{HHuaHꋻD范t?D<E1҃ `8uVH\$Hl$Ld$ H(úHd΋;~$HHHVHĀfHH\XHĀ뎐USHH~W4$1uaHHuJHmt+,$  1҉8uCH[]úHdۋ9}$HH#VHĀHHWHĀ롐1SHH-HHC1[ÐHH(蓓1HÐG1Ðt ug1ÃO1øÐHGH1ÐHw1Ð1ÐH\$Hl$HLd$HI߁{赁tt A$9|9~H$Hl$Ld$HK 1ܐG1Ðw O@w0ÐG1Ðv@u g1DO0ÐG1Ðu g1D_DÐHGH1ÐHwO1ÐHG HHDA2,H1ÐH?vHw 0ÐHO HH HHGH1ÐH?vOHHW Hw0ÐH\$Hl$HLd$Ll$HLt$L|$Hh1:8E<H9(E EHHHEHMHE HHEE1AMLL聕HIHLHIiAu,IvLkA&u!HE(HE0E0 uLu(Le0}DH\$8Hl$@Ld$HLl$PLt$XL|$`HhÐLA 뼃E II6HIt6H葀t2HdD8LZMEiHdD8A$HD$(E1HD$ Lt$ L|$(̀A$A$u\L LLH~DH|$(HL$HT$1IīuH`.,H;T$rHD$H9r!IHD$AH|$(4H$HEL)E1H9HU vHE HHPHĀHHgRHĀdS`IHHHDH%0tH=t @_ujHGHHGHGHG %@GtGс0t% t%1tOH[fD GۉӃ@G uu.,t묐Ht$H<$lL.,H<$Ht$ѐGu W u G1ÐAVAUATUSHd,%G3v[]A\A]A^HHHAA?9i1+tWEu s@E1Һd#4%HH߃=v(C@@E{CdH%HS HHPdH%HC HdH%HHCdH%dH%OHHLO dL %E1@uA?9cD;{@Q@tΉȁ 39ȉ;oAAAA~iA9DDj EAEDAD#D9tQEADD ‰A9uLD9t!sE1DDHցd#4%HDD D9uCkC 1[]A\A]A^D9EGى¸#dG.C1BNZIZHW HdH%XCdH%HLHdH%HC dH%HHCdL %dH%6CCdH%HLHdH%HC dH%HHCdL %dH%nA_DhOdH%C #CCdH%HS HHPdH%HC HdH%HHCdH%dH%CE11ҾH߸dH%wdH%#cC tdH%7CtfDwI|u1dD %u,1A8"A@ EH1Lu9E;HtA8 A@AP tÃ0APÃuL=ۦ,tAtAHdL dO0@09P~!A0t0E;H#6Ap1A8AH)ʉA@H;HKHĀQH;HKHĀqI8HXIHĀI8H=IHĀI8H"IHĀ\AUATUSHHd,%WHЃHCvH[]A\A]$If;o7AAALdA9DDheuDΉȃ39ȉ%E9uD.ed@1%oG 0?;o_1oG0҃G H dH<%1@uA?9+t@t{U@@tщЁ  9Љ뙐AAtHG HdH%%?9(1+t=@dH%+H[]A\A]fDEt\{dH%HS HHPdH%HC HdH%HHCdH%dH%kC 1Cf.dH%HHxdH%HC dH%HHCdH<%dH%1҉kC C4@к#?G0҉CC dH%fDC1҉CCCdH%HHxdH%HC dH%HHCdH<%dH%XEu s@E11d#4%HH߃=vMuHdH%ADakC CC@#CCdH%HS HHPdH%HC dH%HHCdH%dH%_9Cu dH%/trdH%C CE11ҾH߸dH%dH%#dH%#H;HEHĀ@AWAVAUATUSHHXHt$dD,%wHHCv"DHX[]A\A]A^A_$IfD;of1; ŅuDkC 1D;oL|$0AL$U^9D$?t$Do_]l$AAD39AADHsLT$ DHցd#4%HD#9DD#‰99tHT$Hzɚ;1LHT$+VHL$8HT$HiHH+D$0HJHD$ HHL$(SHʚ;HHL$(HD$ 9D;o1;=DCDk1C "f.LO dL %1Af@uU?A9DD;z{QnH@M@tщЁD  9Љ@AAtHG HdH%%?A9Z1D+'E9@LT$d#4%HH߃=tYrHt$ 1HT$HHRH+T$(H+D$ HHD$@HT$HpHxH\$@HHzLun=j,1KdL dO01 D9D@u1SA)A@EAIЉCjDE{$CdH%HS HHPdH%HC HdH%HHCdH%dH%,C1Crf.afCdH%HLJdH%HS dH%HHSdL %dH%Of.sC@#CCdH%HS HHPdH%HC HdH%HHCdH%dH%rf.#^fD9Dd$fDDd$D1Z$nCb$dH%Cm CCdH%HLHdH%HC dH%HHCdL %dH%qs1; Hʚ;HHT$HHD$@vA C dH%t@CE11ҾH߸dH%dH%#H;HT$H;HĀH;HT$H;HĀH;HT$H>HĀfH;HT$Hy;HĀH;H<HĀWIЃ3v $8Id%9Gfd%?9utށ$1I@ dH%IP IxHHHxI@I@HHI@ AHtAh A dH%1@d%%?9Gd%96A@A@R|fDd %ǁ?9t;AxEqfd%9GGG1d %%?9Gd%9~AP1APIP HdH%IH IxHHHzIPI@HH I@ A@tAh Axd%1At/A@LljD@d#4%HdH%1fDd%9GGGt 1AA@tAh  f.AAщAEuv&ApLցd#4%HDϾTfuDG=dGGuBnf.G=tGGu DOHȃ|u?u#Btj ΁ 1Ãu(d%9Gt 1ztÃtd%9GuӃ?uDfffff.wH@|u!u'Bj  1þu%d%9GtËO1ɉOttd%9Guփ?uI8H7HĀH:H7HĀH:H7HĀ\1Ð1Ð1Ðtu1fD'1øÐ%1Ðw % 1ÐHزIHD1HH1>B0N1td%HB1Ð1ÐM1Ҿ17u\Gu_t?0t9GtsWuuwd34%HHH17uXO1Gt.uHËw4d;%u#܋w!6O O 뾋w6끋wHe4뚐ATAUAVHII17AD$A|$A|$0I}ʚ;AD$Et$A $<%DlI}A3t$MADI|$H¾1A4$AL$HRn 1AD$tFA $u0HHA^A]A\Ëwd3 d;%7#At$L4AL$ AL$ At$L4 At$L3_H’@hH1H`HD$HIMI}H+ $H)y Hʚ;HHxH $H|$At$d34%HIDM1Ҿ17u\Gu_t9GtoW uqwd34%HH H 17uTO1d%GuHËw 2d;%u#܋w3O ȋwm3녋w1뢐ATAUAVHII17AD$A|$I}ʚ;AD$Et$ A $<%DlI}A3t$MADI|$ H¾1A4$AL$H^n1d%AD$A $u0HHA^A]A\Ëw0&d;%1#At$LC2AL$ At$L(2&At$L0eH’FtH1H`HD$HIMI}H+ $H)y Hʚ;HHxH $H|$At$d34%HIDHw1:uJru&JtB0uJABtE1 fDAr u'DÉJA H:H/HĀH:H 1HĀHw1:u5JuBtAr u1DDd%E1BH:H/HĀH:H0HĀ뷐17ukuOuXGLW ut<LWAuG wd34%HL1fffff.u 1Ëwp.닋w/w/믐G11ÐG1Ðtuw1øÐ1Ðt tu71øÐHGt>HGHGHGG(G,H?H?HG 1@1G(HGHG HG1HGG,ÐH\$Hl$ILd$Ll$Lt$H 11A0CA1I@I9@v%EA9EH(I@AIx HGHw"wցd#4%HEIX(5AE1AfDAE1DDHDDDA8EH(Aw1H\$Hl$Ld$Ll$Lt$f.ADtTA1AfDAE1DDH߉DA0EH(AwqAE1fAoE1Dd4%HHDDA0dEH(Aw1AAfASE1Dd4%HDHDA8FEH(AwD1A86E1佀I8H*HĀI8H ,HĀI8H,HĀI8Ht*HĀ(I8H+HĀII8H+HĀ\I8H)HĀaI8Hh+HĀvI8H)HĀI8Hb+HĀI8H)HĀI8H)HĀHd$H H|$Ht$tHw 17JH|$1H|$HGGG(H|$LOW,LL$T$W!+($M1H Ht7LGA@0 uAH=rd 4%HE1<$,(H|$17W,HGLO;T$uL;L$^I9UHGo(Hu4G(u,H(Hd4%HDH(urH|$Eu jQHd$(L1H E(H Ex)H E'!H E@)rIH|$tH E)LUffffff.HD$H|$17tH EB'W,;T$uHGH;GvHGGHGo(1Hu9G(u1H H(d4%HDH(tH ER(u(HHd4%HDH|$OH|$bATAUAVAWH8Hzʚ;H H|$Ht$ItHw <%Dlm17H|$1H|$HGGG(H|$LOW,LL$T$I}IƒDg$$M H tMLG A@0 u81G(D LHAH=r3HE11G(AD LHIƋ<$$H|$17W,HGLO;T$u%L;L$vI9wIHGGAnM1M1HGo(Hu4G(u,H(Hd4%HDH(H|$EuMHIDH8A_A^A]A\aHLH EU$&H E%bH E$H E%cH|$H$uH Eg%H$KE117H|$1>uH|$HGGG(H|$LOW,LL$T$H|$(Ht$ IMIUH+L$ H+T$(y Hʚ;HHH|$IƒxdHL$ HT$(Dg3"$LT$ H Ld4%HDHIƋ<$]"H|$17ulW,HGLO;T$L;L$v I9I'H E"H E$GH EX"xHD$H|$17tH E""W,;T$uHGH;GvHGGHGo(M1Hu:G(u2H H(d4%HDH(AtH E0#Mu(HHd4%HDH|$JH|$L|$8Lt$@Ll$HLd$P+I17HIHI;HvI@Ix tIH DYA0A t!d 4%HAAH=s1þIM1DLGH=rd#4%HAu1H E NLH E!Ő17HLOL;O LO LOMDG(LGOIA@A@0 t,d4%HAH=1þAH=rrffff.Ou1H Ep,HH E HIE HId4%HDB1Ð1Ð1Ðtu1 Љ1øÐ1Ðt u  17Ð1Ðu 1?1DÐ1Ðt]H`IHEƋt*uF1GWGW 1f.GWW d%HG1øÐwH1@zuB;B u1Ër@JuHzHZHĀHzHHĀȐ1wuyOt?OwM1Ҹ9tG W9>u O1 wG W9>uOuËwHHlwH ͋wHHNwHg1Ð1Ð1Ðtu71øÐ1@HHt;HHHluL@L9sL@LluHȆl1D Ðw(HlШtHlu1DÐw?HdH%HHBHtHHlH9 uHB1Áv1ÉdHHtHHH뫐H\$Ld$Hl$Ll$H(dH%Iw\HHl@t@HHt d%L`H(1H\$Hl$Ld$Ll$ H(fDځwHl@tAAdJHtH؃HH1Ht EH¸ HtdJ뾐HHtHHu&HcA‰1فGHH|$ HHt$H!L$븐~5Vv&d<%HcHcHc‰1فGøÐHl$Ll$H\$Ld$HIՅUv^1HH4$D$d%D$8Ll$D$d<%)IHcHcHc‰1فGH$H$L$L$HĨøѐ~kHƒ 9tփ滃 tu1fDƃ1u͋d<% HcHc=vøÐHd%ใtHdH%0d %dH<%Hv HDd%D$ T$ tKHщЃ9ʉt$d %D$ D$ 9ể t?1HHt{щЃ9ʉt݉d %D$ D$ 9td %dH<%у9td %D$ D$ 9uу9ed %D$ D$ 9AӉ Hv HDd%D$ T$ tKHщ9ʉt$d %D$ D$ 9ể tC1HDHщ9ʉtىd %D$ D$ 9tdH%0d %dH<%@у9td %D$ D$ 9gу9Wd %D$ D$ 93Ӊt1VM1ҋ©uZ q,ut1Щud4%HWWT$_Hd 4%HH1DH<$Id 4%HLBhIHt H w! wH~ 1øÐUSHH1HՉH H Ņt:d%9t.0@HtTHt$ғHHt$t@H+ H@dH% H)H1HHHiʚ;1HHC1H[]Hd䐐SHt5d%9t)0@Ht,JHt"H 1[f.dH% 1[Hd[Ðx21tGHG1fDd%HGHG1HdÐ1ÐUHH]؉H@LeLmILuL}IH޿I?t?M1҄tIt L HH]LeLmLuL}D5=,IE LLH8IE>HH)L|$II H@Ѝ@(lLIHHIG\Ht3HHP@MI9! c=,A1H8@HItcMtkH@I AGMgLLIHHIGIt Ѝ@(lL_a1HLwLNM1bE1Aع 1`[IqUHAWAVAUATSHlHL@HUHMH=m,u{DHWIHG(AA  w1ILcLMtIutHHu1HoHd$IHdD HdHdnATAUAVHIIID$1HH`HD$HI}IuH+<$H)y Hʚ;HHAnxjH<$Ht$:D$ILw1IƋ|$xMtIu,A$xHHA $u1Il$HA^A]A\IHdD2H<$HoHIl$HLt$Ll$ Ld$(m=t3p7uHt wHx1øKHdÐdH%HGHdH%HGPdH<%fff.HGHdH%ÐdH%HGHdH%HGPd%uWXdH<%ÉщЃd %9tىfffff.HHGHdH%GXt2d%u%щЃd %9u:d%ใtHdH%0d %dH<%L뭐H7HWdH%HGdH<%fHGdH%uDHWHHH7HWdH%HGd%uWdH<%ÉщЃd %9tى@HHGdH%Gu u HHWHHHd%uӉщЃd %9u5d%ใudH%0d %dH<%벐HHdH<%dH%pdH%x@З@Hp@:HhI!:H\$Hl$Ld$Ll$Lt$L|$HHdH%dL$%HHt9Muvue1H\$Hl$ Ld$(Ll$0Lt$8L|$@HHfDLLD$L $L $H)1LD$IQ0HdH3%0H)H9r덾L98MiPLL $蹠L $M9mLuEILI)H)I9UM|$L $I|$A$M9L $t/LMLH)I9sfHZHzL $I9HL $uLdH%DHdH%dH%pdH%x@HWHHpЗ@8HG7AUdH%ATUSHHHdH%HtoHHHG0H)HLo0HdH3%0H)H9sHII)I9r,9HIEHHdH3%0H)H)H9sI9sH{H[Hu1dH %H[]A\A]Ðd%AAA9tdD%uAA tHdH%0d %dH<%f.u'd%AAdD%uD؃ tdH<%M1Hd4%Hd%ːARRM1Һd4%H9uЇuZAZfDARRM1Һd#4%H9uЇuZAZÃ<%DltYH:xMAQIAd#4%H 9u ttuډAYønHzʚ;APAQATAUAVVHIIպA$tH1H`HD$HI}IuH+<$H)y Hʚ;HHx?H<$Ht$It$d#4%HLA$t unH A^A]A\AYAXøVRd4%HZ^fffff.VRd#4%HZ^ATAUIIHH1H`HD$HI}IuH+<$H)y Hʚ;HHx6H<$Ht$A$tI1L?u 1HA]A\HunꐐARRM1ҁd#4%H@u+9tu ud%uZAZfffff.<%DlH:xuAQIAd#4%H @u<9t Hu ud%uAYÃtunHzʚ;APAQATAUVH IIHD$H1H`HD$HI}IuH+<$H)y Hʚ;HHH<$Ht$HT$Ё@uS9tA$Hu&It$ d#4%HLHA$u)d%A$uH(A]A\AYAXøÃ0nݐ_d4%d%:WHtd4%=(Ð=MX,uH=(HjH$H<$HHHH=(Ð=W,uH=d(H H$H<$HSHHH=0(Ð=W,uH=(HH$H<$HHHH='ÐHD$ HT$D$IHD$HD$HD$tLHcHcHH=wgD%,uLcAHHT$LD=w |$tED$ÃuBL¾ LDH=w<%,HdD$HdHdfDUSHHxH$HT$PD$HD$HD$@HD$ uL V,tG=HAHcHH=DljD$pD$Hx[]D t+HHcHcHH=vHdċ$,uLcAHHT$0LD=v4uHھ LDH=wFE$,l|$0t D$4TD$4IHd%Hd멃=T,u+H=d%H H$+H<$HSHHH=0%Ð=T,u*H=%HH$*H<$HHHH=$ÐSH )T,u!E1E1LcHc-H=waH [HT$ $Ht$|$* $|$E1E1HT$Ht$-LcHcHHw%HD$LHD$HdHHdHɐ=}S,uIʸ-H=#HH$Iʸ-H<$HHHH=#Ð=S,u/H=#H:H$/H<$HHHH=`#ÐSH R,u!E1E1LcHc,H=waH [HT$ $Ht$|$ $|$E1E1HT$Ht$,LcHcHHw%HD$HD$HdHHdHɐ= R,u.H="H*H$.H<$HsHHH=P"Ð=Q,uIʸ,H=!"HH$Iʸ,H<$H HHH=!Ð=MQ,uJH=!HjH$JH<$HHHH=!Ð=P,uH=d!H H$H<$HSHHH=0!Ð=P,uH=!HH$H<$HHHH= Ð=-P,u#H= HJH$#H<$HHHH=p Ð=O,uH=D HH$H<$H3HHH= Ð=mO,u"H=HH$"H<$HHHH=Ð= O,uIʸH=H'H$IʸH<$HmHHH=JÐ=N,uIʸH=!HH$IʸH<$H HHH=ÐHJN,u! THcH=wGHÉ|$X|$A THcHHw#DljD$D$HdHd̐HM,Hu E11H=H=wEHH|$E1A1Ht$H=HHw#DljD$D$HdHd̐H( M,uE1HcHc=H=wUH(ÉT$Ht$|$T$|$AE1Ht$=HcHcHHw#DljD$;D$HdHd̐=mL,uIʸFH=HH$IʸFH<$HHHH=Ð= L,uIʸEH=H'H$IʸEH<$HmHHH=JÐUHSHHK,u|HtHHuJAA11HD=vt=vHĘ[]@E1HĘ[]HH\$HD$HH!D$VHAt+HHtHH\$HD$HH!D$AA11HD=vt=vE1DljD$CD$WH=wHdf.HZJ,uH=w?HH|$oH|$HHw"׉D$D$HdHd0͐d %d4%HcHc1)ǸHcH=wHdÐAHIdL%L9Bt12uILBBH:H+HĀؐHdH4%H9rt:1 tH0Hp@fB1ҐHBBu HB uH:HHĀ搐ffffff.HHHIHHD$(HFHD$@HFHD$HHFHD$PHF HD$XHF(HD$`HF0HD$hHF8HD$pHF@HD$xHFHH$HFPH$HFXH$HF`H$HFhH$HFpH$HFxH$HH$HD$8@ HHD$0HT$1HL$(MAHcHDHHHE H=MHT$IHT$IPHT$IPHT$IPHT$IP HT$IP(HT$IP0HT$IP8HT$IP@HT$IPHHT$IPPHT$IPXHT$IP`H$IPhHT$IPpHT$IPxHT$IHT$AHT$IHHdffff.GvHdÐHdH%ÐHdHÐIHIIHcIF=vHf.HL1I<H)P1HÐULcAHSHLL$I,KHBIHH)HD$HH I9ILELLL׉=1Ƀu=wtHH]H^E,1fH]SHHH9E,Huef.<uJHH9wHc=v H[@d%8d%@1H[øH[ËH$Ht$H$Ht$uHD,념UHHSHHHu(HtnHU0H9s<Ht 4@<u*HH9r蜦HU0H1H9wH[]H[]@H)1HOH1[]HھO1뻐ATHIUHSHHHC,HtuH9r&fDHH9v|t[]A\fDI9\$0I|$(H)HǸ HtI|$(I\$0HH[]1A\dH%\uH9C,g@I|$(#[]ID$(ID$01A\I|$(땐1Ðtu@1fD'1øÐGt t d%G1ÐGu HWHH%01Ðvu% 17øÐSH uV+t!~ 1H[؉1H[@Ht$ +Ht$ȐH+t19|J;5+B%9u7 % 17HD4$H|$#+H|$4$벸ҐUSdH%H ``1 1 t.@tRt8H[]fH8t: @u<t2 @f 1 lf.jf8H[]ÐH+|+HH\$Hl$Ld$Ll$Lt$L|$AHHAdH%dH%HmD"AD++ HLE9ELAt!+D)HcLɉL1E9t?1;D*  <@dt@0H\$Hl$ Ld$(Ll$0Lt$8L|$@HHfDE`8A9ʼn$>D9}<H yHd(DE9>E95El$D9~&AD9D)HcɋLtfD++ )HH< HHD%z+AD"dH%;DH8 tZHd( D <tJ @{fDD,$ 1 >f.Hd(-+HHHĀ'HHHĀ0HHHĀHHPHĀG@t 1øÐH\$Hl$HLd$Ll$Lt$L|$H8G@Ilֽ+m9U;-ý+I%9:Sd%9CDAEEDAD3D9tUEAADD A%A9u3E9t!sE1DDHցd#4%HDD D9uA1MtE,$1t% ʼn+sHցd#4%H1H\$Hl$Ld$Ll$ Lt$(L|$0H8#Bt̓AD+ADbf.fU+ATIHUHSH bHHA"wtdH%I9tuA$0IH1V71HAt]HHDHHuZHdDAtIcH D[]A\1H>E1tHdDH []DA\HxE1H9AGHdD땐ATA"IUSHH HvfdH%H9th0IH1c611HtSHLHHu[HdDAtHcH D[]A\@1=E1tHdDH []DA\fDHxE1HdD럐d%!GtDGAVAUATUSHd,%G3v[]A\A]A^HHHAA?9}1tWEu s@E1Һd#4%HH߃=v,#C@LE{CdH%HS HHPdH%HC HdH%HHCdH%dH%WHHLW dL%E1ɁAf.@uB?9cDD;{@H@t9ȉ;oAAAAA9DDEAEDAD D9tREADD ‰A9uHD9t!sE1DDHցd#4%HDD D9uCk1[]A\A]A^D9EJ݉¸#X G6C16b]@HW HdH%HCdH%HLPdH%HC dH%HHCdL%dH%6CCdH%HLPdH%HC dH%HHCdL%dH%k ZAKD;ndH%C #CCdH%HS HHPdH%HC HdH%HHCdH%dH%k CE11ҾH߸dH%_dH%#KC qdH%Ctfffff.wI|u,dD %u$1A8EH1uHH!HtyID1LHHH)H<9H=+LLHL$H,+<HL$J49ID0lH6Hvt3Iy[fLLL)H<9H=<+f.%=,HHO,L%@,L-),L5*,HG,H+@H ,,H,, lH+@ltiID1HIIH+H+,HDH+,HH H H+ HCH+,H[]A\A]A^A_fD@AWAVAUATUSH(H3,,HtvHg,,H HH)HH9rUDH8H9sG8uL`0Hh(Lp LhI LHD$HD$ A -fDHD$HD$ A 1E1E11H+L|IIH H#L$HtrHD1LHHH)H<9H=S+LLHL$H,B+HL$J49ID0lH6Hvt,I"YfLHH)H<9H=+f.%,HH,H-,L-,L5,H,H+@H),H), lH+@ltiHD1HHHH+H),HDHb),HH I H+ ICHE),H([]A\A]A^A_fD@ID$I$ LHD$LHHD$BSwlHwlHHtf.wlHu[ffff.AVAwlIwlAUIIMATIUSt"1LLwlHL9rAwlIwlI2Mt1LLwlHL9r[]A\A]A^AUA@HI@ATILUSHMtE=C1%uGL%21@@1@SHL#HH%uHPL9I$rH[]A\A]ÿIV1/H\$Hl$HHE@u۸HD؉DHuH1ҿxՐLG0LOHW8IdL3%0IdL3 %0HdH3%0HLgLoLw L(LL⸐@HtHÐAHcH=wHdÐHt 1HHdÐH(dH%H9,t41=&,t5, 5,H,u,z,t=ItbtHtCfDH$ 1,HH$ ,,w,S,, P,c,,,u/H,=r%,t y, k,dH%H9S,t41=+%,t51, 5",H,,&1HH$+HHHH9u1HDŽ$+a1+׈+3H=+HHĀH=v+HJHĀH=W+HHĀ#AWE1AVIAUATIUHSHHLD$@MM9s0O,>HILIHH$HT$|tM}M9rH$H$H[]A\A]A^A_ÐAWAVAUATUSHHHH|$Ht$(HT$IIIILLM)HHH|$LHHD$HPHh L8H@H$HT$HD$ HBH(MtgL|$L|$ IHEHMt:MLHL$AEIIEHMufL|$MtLLHIԈHD$HT$H|$(Hp HHL)[]A\A]A^IA_駈HH[]A\A]A^A_ÐHHMtMtHT$ HL$HHLILMHuOf.MAL|$L|$ (HIHHEHM McLHL$IEIIHEȐHELt$0MIHD$!f.LIMH9wJL|$HMpH|$0Hl$8HT$ LLJ\=$LHl$0MH9vH+L$HL)H HHH90HpH9 IILH/11oHfDHI9wHHHH9Hl$80HHHH HH9DLHLBMHIL|$fDML|$L|$ $HIHHEHM\MtLH3I}$IEIIHE@MLt$0(HT$HH9fDHT$8HHH HH9;HT$8UHAWAVMAUATISHHxH H}HxILIH n+Hm5W+1HcLHH9ILdAh hHHpdAHEH H]HELeLuHxHEHHEIL}I7I9HEsHULHHHH9EwHuHxH}HEHEHxjHEfDHEM$L;eteH}HuHrH}HMf.LH+E1IH LAHu(LHuI IAHLI@H t}HHHIIJtHH,=,t +w +iHt"dH3%0HHnH^HV1HH[]LHtHpH@넾HT$1HHT$oH +HH +ff.AT1IUHSHH=,t5+ 5+I$HI1IIHt?HyHt?HJ<uKHIt HDH>H LAHu(LHuI IAHLI@H tHHHIIJtHH,=(,t O+% A+Ht"dH3%0HHnH^HV1HH[]A\LHtHpH@낾HT$1HHT$mI $HI$H=+HܷHĀH=+HMHĀnH=z+H螷HĀH=[+HHĀxH=<+H`HĀ"H=+HѸHĀH1dLfffff.HdLAWAVAUATUSHH(I@Ht$E1E1$MHhIHADI tIAEHADI u<-<+D$@0I^ UJ11Hc@L@I`IL$L9HMLE1E1LcHL$f.NЀ vRHt01A84$t&fE D: u HH9wH9kIHh@DqIHx 79M9MNH7@H9hH|$tHD$H8E|$HHHL9T$LH؅IDHd1H([]A\A]A^A_MW 11IAuf9t$2fDHA7@1I911H|$tLH)H~IUI@xIM1IEAx0uH1S >HcfD11譿u Hd8t1== ,t5+ 5+++u"1Ҿl1Ҿ l= ,t + w+[AT1IUSHpHT$H$DŽ$HHH=~ ,t5 +{ 5+l+P+u4 lH:)lH D= ,t +. + H$Hs1HL$H @1HÅH$hHDŽ$@0@H$HH$h18H=lj$hL$l} 7@$h1L藽HHu Hd:tHc$hH9t DŽ$l1= ,t5+? 5+0+|+ur1Ҿ l1ҾlutFDŽ$l= ,t 7+ )+$lHp[]A\@1H1tDŽ$lH$@1Q@H$hH$@0@ާm-+= ,t +u +gdH-n+d+1Ҿ ld+뫾1= ,t5A+7 52+("++gH1Ҿld+N1Ҿ l@HDŽ$ IHDŽ$(IL$0HDŽ$81Ҿl1HH+H$ I+q+ZHDŽ$hdyfffff.SHHt,u$H[fIH[H|$ H|$߉D$ D$H=+H~HĀH=+HHĀ.H=+H@HĀuH=y+H豫HĀH=Z+HHĀH=;+HsHĀH=+HTHĀzH=+H襩HĀHSHtO?tJ/8WHHHt:zHBu01H9s4z/HBt 8H8/u/H9HrD.I[ÐHBuH[H9rfDH9Hs̀x/HPu[ÐAWHIAVAUATUSHL$1HHL9HLYLnM9D IM9w|GdE8uDREt+G:THKLtѐyHH@8uXuM9w7HL$HL)ȃHcH9t.~'HItI9hL9IB[]A\A]A^HA_LHD$ILl$f.DpLxEuD0IELAM9ELLt5F:LuRHJLDDyHH@8u/CuHI9I)MM9u(LLmkHI9vI)MM9$Ht$ DM9 Et3F8Lu;HJLDfDyHH@8uCuI9vDHI9vI)E1yHHT$0H@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$,HÐHHT$0H8@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$HÐHHT$0H@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$JHÐH\$Hl$HLd$HHHtU>A"ItJH(LIHH" K1H$H$L$HDAgKLffff.H\$Hl$HH(HH=+dtHHl$ H\$H(.T$,T$tZljT$ŋT$tDIljT$HT$t7HHHD$HD$H\$Hl$ H(HBH=S+rT$+H=<+T$WUHAVLAUIATSHHH@H@HHLPH)HULXH)z)r)j)b)Z)R)J)BHEHD+DžDž0HH0H HI'HHHH)Ht$HHHIUH9IILHHt|f1f1AoDHfofofdf`fhfofefofifafofLfof$fefafifT fD0HI9wH9t@AT HH9wLHLHe[A\A]A^LHu(He[A\A]A^HV@I91fDAL HH9w떐ATUSH vfxLHdH,%H9jt01=+t 2 2HHjB ƒ fxHBBH1HPL1=f+t5<,G 5-,8I|$H#I$#=)+t ,* +H;݅+t H;܅+tH;ۅ+tH[]A\@H{HtHZHJŋh~@HB=+t  f;Hx4HBBu HB=C+t  u|HeH:H{HĀ1H=+H\HĀH=+H͠HĀH:H負HĀBH:H藠HĀiHl$H\$ЉLd$Ll$Lt$L|$H8 uDH fDHC=i+t uw uqH1f;Hx0HBBuHB=+t uD u>Hv`H:HWHĀH;H̛HĀtH:H豛HĀ몐GtHt0t+Iɹ IHOHHH@DH\$Hl$1Ld$Ll$H(I8HACHHHH1HAIH1`dHHǃ@I]>DHLH,EHtRCtt0t+ IIHOHHH@HHl$H\$Ld$Ll$ H(HaH1АH\$Hl$HLd$8HI1[HHHH1HAIH1xcHHǃ@Iu=LHHBDHtLCtt0t+ IIHOHHH@HHl$H$Ld$HH`H1֐Ld$IH\$LHl$Ll$H(IIHHMf9xJHdL %L9Jt01=2+t 2 2HLJBLLHMf;Hx=HCCu)HC=+t  DI9t H1IHHH\$Hl$Ld$Ll$ H(@1f;Hx0HBBuHB=X+t uD u>H\H:H蔖HĀ H;H HĀPH:HHĀ몐Ll$IH\$LHl$Ld$H(IIHHMf9xJHdL %L9Jt01=+t 2  2HLJBtbtg11f;xHCCtwL9t@u H1IHHH\$Hl$Ld$Ll$ H(ǃHLLHP8HH@z1@HC=+t ug uaof;Hx0HBBuHB={+t uA u;HZH:H跔HĀH;H,HĀH:HHĀ뭐AWAVAUATIUSHH(HHt$T$HfxLHdH,%H9jt01=+t 26 2+HHjB HI<$t HD$H8u#HL$xHxWHI$JLsLkM)MHD$$HiLsLkHl$M)t$LLAHIt IM)IHl$Il-HHL$HEHH9v0L4I<$L9LCLHI$HD$L0LsH|$I<$LLVLkMHI$(fx8HBBu$HB=>+t  H(H[]A\A]A^A_Hhuf.HLsLkM)HHdHHdKOf;Hx0HBBuHB=+t uD u>HWH:HőHĀH:H:HĀH:HHĀ몐AWAVAUATAUHSHH(MHt$DD$LL$tA@1HL|$uFI9DLLCLs?HHu{LLLL)MTLkHt>LsLkM)MHeD9HAIHu@LH+D$H([]A\A]A^A_fHŋD$L)x H|$HHLLH $CTL+|$H $HKH([JD=]A\A]A^A_H|$tHT$LH+D$끃|$~ E'If`DHFPǃAWAVAUATAUHSHH(Ht$DD$1HL|$u?{I9DLLCL=HHusLLLL)M_SLmHt6LuLmM)MH.dtA9HAIHuLH+D$H([]A\A]A^A_ft$HL)x H|$HHLLHL$RL+|$HL$HMH(J;[]A\A]A^A_Ã|$~ E'I{DH`EkDžHl$Ld$HLl$H\$HE11IIվHHDŽ$9YHHHHHDŽ$InLLHHD$(H;D$0s-H$H$L$L$H1HCʐH\$Hl$E1Ld$Ll$HIHIH1ɺHDŽ$yXLH11HDŽ$InLHH1~H$H$L$L$HÐSH t"HH[H@H@ f.[fffff.USHH(HHH;PHWH;WHHx0HT$HPXLD$HP`HHKHP0HxHpXHHPH|$Hx8HSH<$HLUHD$HCHHH;Pr&HdT H([]fH([]"tHHSHx0HT$GHx@Ht #HH Hd ff.H\$Hl$HLd$Ll$ALt$L|$HHE1HAHPH9P/Eu 1A?HPH9P wtHHHx0 A*AxEHHH{ HK8H1H+SH9H9H#HKH)HK(HK HHHK0HHHSHP0HPHHPHP HPHP(xH1H @HH$H$L$L$L$L$HH;HA1HLLAW "HSH+SHHH,*HQH+HHH)HHt%HE1HHHtyH1VHDHHH1HS8#HHHSHSHSHS(HS HS0HHJ0HJH HJHJ HJHJ(D$%=sHl$0E1UHC8HS@IHH)H)H!I)I9~HE1H1HHIxoMXHEH@pHs8LHI9H0HLAH)E1HH H9HA@H@HxHt #HD_HC8HC(HC HC0HCHCHCHHP0HP HPHP(HPHHPHLHP`LL+@HPXHHKHSIHXAW0HcHHCHCHHHHHCH+CH,(H@HHd11HS8L#HHIHSHS(HS HS0HHKLkHJ0HJH HJHJ HJHJ(Hs8HS@H)Y@AWAVAUATUSHHH2HHH;PHWH;WLHG8HGHGHGHHC0HC(HC HHx0Hk+HfxVLdL %M9Ht91=+t A0 A0} LHMk+MHA@%=f}HLl$0Lt$ U:HHs1E1HP0HHPHPHP(HP HPf.HS@HHH)PpH HHCHt HHHHHJXHJ`LSHKLS HMLHPLHHpXHT$H@8LH$AT$Ht$01HsHHHz0H9z*tKHu8H{H9HkH)Hw,HLcHHsHsHsfHL)uXHuHdT HH[]A\A]A^A_DHusHun HH[]A\A]A^A_H)HLH7DHKH)HHL$6HL$HCHHCHHsHsd@ HcHdTP@HH[]A\A]A^A_HT$8HPXLD$8HP`HHOHP0HpXHHPHWHxH|$Hx8H<$LLAT$HSHSHHt$8H H;JHsHSH{8H)6HCH+CHC8HCHC8HCHCyDHBBHB=I+t [  Q H2fDH{HHt :#HYHC8HCHCHCHx@Ht #HTHHPHAI<.LI)I9LGLL\$VAHL\$MLHJLJHrXLHL$HR8HH$LAT$HL\$HL$0HL)IHH)HLHIHsHs Hd f}Hx8HBBu$HB=+t  HGfffff.H\$Hl$HLd$Ll$ILt$L|$HhHHLHW0LO(L9u(Hw H9tH)&LK(f.Ls(L|$( DLK(IHHC@I MLLLt$HXH$AUHs HS(H߉D$H)i&L$t_HD$(HL)IHH)ՅtuIIvHuHHP0HPHHPHP HPt5HHP(H\$8Hl$@Ld$HLl$PLt$XL|$`HhfDHP8fH\$Hl$1Ld$Ll$ILt$L|$H8HHHttA$L IE(I} IH)E1HHIugLLLI)Et$I$HP HpH9tH)LHHL)H\$Hl$Ld$Ll$ Lt$(L|$0H8H9LFIA AVE>@4HCH9DDE411@ofH9rB4D)E9ЉL 3H47t1A  HyAJHH4I} HL)IDIE8H)HH9w@HH9s7z LrtDL9s#IA> uI)AIIFtE1iHLEJ4IE oHGH9A@H 1fHH9uHIH\$Hl$HLd$HHHP HpH9v*H)HuKHL L+`IMu{ `H\$Ld$HLl$Hl$H(IIHLJHHLLPxHHHC8HCHCHCHC(HC HC@HC0HH\$Hl$Ld$Ll$ H(fHWHw H9vHH)1HtHMfDfdLfE[Rffffff.H\$Hl$1Ld$Ll$HLt$L|$H8HIHKI% = ]HG0H(IH9weHHPHM@H+M81HvL1HMI)MK4'LH I)fDH)E11HILcH9ILFI%AAEEd@ZIT$H9<DƃAo$)A9I fHtD1H@2HyAILO<H}(HL)IMMHL)H\$Hl$Ld$Ll$ Lt$(L|$0H8@H(HE@E11H)H9H H9y HQtI9H: uL)AHBLLO<,#HE(>L)HMHE;f.HWI9A@HItLH HH9ufLLH"I)I9E1HLf{ff.AU1IATIUHSHHH4H)H~XHAD$tuUA|$pHHgHyA $ LH)I$Hx HI$H[]A\A]fLH)A|$pHHqgH@p!hSHH8Hs@H)LHC@HC8{p[gHwpHGtu pHZgp[gHHff.USHHHWH;WOH8lHrG+HfxVLdL %M9Ht91=d+t A0 A0LHG+MHA@%=uHHPf}x=HBBu)HB=+t  DHHs8HS@HHH)HsHsHsHs0Hs(Hs PpH~BHHCHt HHHCH[]fH[]fDu> H[]HHHt Z#H7qD  Hd {f}Hx8HBBu$HB=+t  H&H\$Hl$HLd$Ll$HLt$HHGH9GAAHG HS(E1EDDHDH9H{8gAAEHH!H{ HK8H1H+SH9H9H#HKH)HK(HK HHK0HHHSxH1HH fDHH$H$L$L$L$HĸDHHH-HU+HDHHHtHS8#HHSHSHSHS(HS HS0afDuHC8HS@IHH)H)H!I)I9~HE1H1HHI_MbHEH@pHs8LHI9H:HLAH)HCH+CHHHH*E1EfD$%=Hl$0DHG H;G(AHgi@H{Ht #Hd4HC8HC(HC HC0HCHCHC\EJH1HHH.f.HXH11HS8L#HHIHHSLkHKHS(HS HS0lHdHRHs8HS@H)Tffffff.SH)Ht"HC8HC0HC(HC HCHCHCH[Ð1H[fH\$HLd$Hl$HCtHEĉ։1hŅ}DA% kp AtHV"HHl$H$Ld$HH1HPHHuHd8t`D11FhifDH\$Hl$H $HHH!kpH\$Hl$H@HSHHLJ@IHǀ@IZ(Ht%HC8HC0HC(HC HCHCHCH[@HHǃIHǀ@`I1[ffffff.SpHt,DE~RHHpHP H)H@tH1[/,HHH1[ ,DHw HW(H)tf@H\$Hl$HLd$Ll$H(HIHu"1H\$Hl$Ld$Ll$ H(HWHw H9t"HH)ֺHt^HHHHLPxHIuTDHC8EHCHCHCHC(HC ~XHC@L9HC0MEDHLJftLfufDSHW(HHw H9w_HsH+suHǃ1[fDHHHt HCHCHd8t[@DE~4HHpHP H)H mf.H)ݐH\$Hl$HLd$HFtYHw HTHW(H9S@\@*HHS( @H$Hl$Ld$HH HWcHsH9s@tvHS@DHs(Hs HS0HSEHSHS~HaftHs0HEDHHl$H$Ld$H)HHs8HsHsy0Hs HH) fD Hd H-HS8HSHSHSDE~5HHHpHP H)HyHS(cH)HLcHI)HCHH+S8HƋI9IFH)HsHskffffff.ATAUSD9gpH1%=H-"HHAċ~ZHHx@tHji111HjHH@HH@H@ H@H@(111HHCHCHHCHC(HC HC0`E $CpHǃDD[]DA\f~&HHpHP H)H[@Hw HW(H)pfUHAVAUATSHHH {pt1He[A\A]A^fDA11AA@+m7xDKtQLAeQ?b(fD"+u/ADKtMžmxDKtAPIHe6btD+u'ADKtI;mJxDKtLAIebfZ+StD ƃ1^AEDcp%D AA1HYI} ISIHMII,ILL)LHP!HH)HLt$ILA&H=l Ll LLE13<_t6<-t2<.t.<,t*<:t&f8x8HBBu$HB=˩+t ,$ "$d+Y+u/HP+=+t 8+ $ *+#fHW`HH+GHtHcJHH9HOHuff.HGHWX'HWHGXHWHGHHWHHGHGDHWHGXHOHHWXHWHGHOHWHHGDHG(H;G SHwJu3H;CHS8HSvHC#HCHC0HC(HC 1[HSPHSfDHPtHC(fffff.u LJHH@ffffff.f.HSHP tHSHHS[fff.HH@@H1H@Hffffff.HGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@ffff.1ffff.HSHGHH;Gv HP@@8tHHP0t#[fDHWffffff.HGH;GSHvHPHW@#[ÐHP0u[f.HcHH9s,x HHtf.H9sH9 u)@:@HWHB`HtH9u @H9tHHHuH`fHHfG+FfHWHtuHB+B‹G)HB+Bffff.HVH9tËFxI tbHB HJXHBXHBHJHJHHBHFHJHJHH1HJf. t)HJHH1HJfHJf.HBHzH HJXHBXHBHJHzHJHBHFfHf.H1ffff.f.fffff.H(+1ffff.HGhff.Hfff.dH%H9؄+t41=+t5+ 5+H++f++u/Hz+=+t b+q T+cfff.6+0+H)+H\$Hl$HH(H8HHtt6Hk8HS@u Hl$ H\$H(Ã#Hl$ H\$H(fDHs@HT$ $HH)H $HT$fff.SHtMHWXHGHWHGXHCHHHCHCH{HׂHCHHCXHCP[DHHfAV1HIAUATIUHSHH}(Lm0L9I)L9LFIMteIIE@IL$HwH9Ao$HIHf1H@2HHyJ /MHM(L)HtAHA4$HPt*IHEDLLMrHE(@LH)[]A\A]A^fI9[J /LfHHH9uaHYAWAVAUATIULSHHHG`HwH)HHHHczHH9HOHuLCXH{HHH)MI)L9HI)Hx]Hu8N,/HLkPtA)D)`HHu1H[]A\A]A^A_LHLkHHsHC`I4(HLHLHsLH)H{HH)uLkHHsHC`pLGXHH1MI)JLrdH$HL$LqHH$HHL$NHx4HHsLmdLH{HHkHLHsHkXHC`HHsXLmdL{HHLjLLHL)H\$Hl$؉Ld$Ll$HLt$L|$H8HwHGH9vDItzIFHCAn@H\$Hl$Ld$Ll$ Lt$(L|$0H8HHtEHCLsX HCXHCHLsHsHHCLsfDFHV9tN48HsLLrH{Y~LcMLsLcLsPtffff.AW@E1AVAUATUSH(HAEH$NAHD$dH%H9a~+t41=+t5?~+m 50~+^H+~+!~+H!+- ~+Hۉ~+dL$%AE1f.H +Hf;H}+x@HL9bt/DD=+t 2 2HLbB%=f;x8HBBu$HB=+t  ;}+H8}+98H[hH; }+|+u/H|+=6+t |+` |+REt H1*:H([]A\A]A^A_HHP"H1ҾNA9fff.AWE1AVAUATUSH(to@HH$NAHD$@E1dH%H9/|+t41=g+t5 |+ 5{+H{+{+H-+D%{+E1HD$tdL4%f.H-+HAf}H-{+xAHL9rt01=Ě+t 2/ 2$HLrBHHPH9P vHHPDDf}x?HBBu+HB=<+t  z+Hz+A9HmhH tz+z+fDEt H17H(D[]A\A]A^A_H-Y+HtAċH-\z+~HHHJH9J vHHPt0"z+A9Hz+uHmh@HU H9U(w@AHy+=+t y+ y+$@HM H9M(kDH1ҾNA6ABfAV1AUATUSHZ+AHdL$%AA%twtmHL;btD=R+t**ukHL`@E1=x+u H11HPXAǃH[hHY[]A\DA]A^DfHL;bD=+t**u!HL`@A^@SfAJHS8H8x+HHHC@Hx+H)HHBBHB= +t  BB8ffffff.fDUSHH(a 1@H@ŅSH$NAHD$dH%H9w+t41=R+t5v+) 5v+Hv+v+Hv+f;xJHdL%L9Bt01=+t 2 2HLBBv+f;Hl+He+HChxHBBEv+HNv+/v+u/H&v+=g+t v+y v+kt H1\3H([]DH1ҾNA2@HB= +t > 4Xffffff.USHH(?@1H@ŅH$NAHD$dH%H9Ou+t41=+t5-u+ 5u+Hu+u+Hu+f;xJHdL%L9Bt01=)+t 2 2HLBBH+Ht5H9HBhHt#H9uH9HPhH@hHu#f;xHBBLt+HUt+6t+u/H-t+=n+t t+ t+t H1c1H([]HhHChs+H[DH1ҾNA0]@HB=+t  9HChs+Hn+fHGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@҉xeHHA0HA8HAHHAHAHA HA(HA@HAHHAPL@HLJ@HGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@LJHLJfSH`HtHG`H{HHHtIt%HKXH{HCHSHSHKH{HHCXpHCHHCXHCP[fDUE1A" SH1H8}HHt%H{8Htt!#Hk8H Hk@H[]Hs@HH)H}@H\$Hl$HLd$HHHIP`MtHuwH{8HHt Hk8HHk@HC0HC(HC HCHCHCHHl$H$Ld$HH{8ƒHtt"Hk8L Hk@f.1@Hs@HH)H{@Hs@HH)H{1fAVIAUIATUHSHwHLgI9I)I9LGIMtwAAD$EAHVI9Dǃo)A9ILfAEHt:H@9HyAILMHsL)HǃdHsLcL9't1HsHLLcXHSXHSI9LcHsHSHHsH{`H{HHHtGt%HKXH{HCHSHSHKH{HHCXmmHCHHCXHCPHHP tHsLcrfD L[H)]A\A]A^LLLcIfIUH9jA@HI|L HHH9u|fLHEHqHD{fTHL UHSHHHuu7HSu+SUHC`HEHk`H[]D+SUHF(H;F wCu1H;CHS8HSHvHCHCHC0HC(HC ȀHSPHSHHH߾Pt HC(랋Vffff.USHH(H8Ht HC`Ht@H@HHuH{HHt ZkHCH;@1H@ŅH$NAHD$dH%H;k+t41=Ҋ+t5xk+ 5ik+Hdk+Yk+Hfk+f;xJHdL%L;Bt01=t+t 2V 2KHLBBH +Ht8H9JHBhHt&H9ufDH9HPhH@hHu#f;xHBBj+Hj+~j+u/Huj+=+t ]j+ Oj+t H1'H([]@Hs@HH)HvHC@HC8HhDHChi+H+DH1ҾNA&*@HB= +t &  HChi+H +SHLJHSHsH9H{`H{HHHtGt%HKXH{HCHSHSHKH{HHCXwhHCHHCXHCPHH[H@(fD[[HHsXHKHSXHSHHsHKHH9HSHSBHHS[HfDHpifDSHLJHCHsH9H{`H{HHHtGt%HKXH{HCHSHSHKH{HHCX7gHCHHCXHCPHH[H@ fD[[HHsXHKHSXHSHHsHKHH9HSHSB[f.[HH(a|ff.H\$Hl$HLd$HH8tH$Hl$Ld$Ht ~AHHPhuH{8LHHtt#Lc8Hk@ fDLHHs@HH)HrH:Hu)HĀH="f+HV)HĀH=f+H'HĀJH=e+H)HĀ~H=e+Hi'HĀH:HN'HĀH:H(HĀFH=pe+H(HĀH=Qe+H&HĀAH:H&HĀH:HO(HĀ,H=d+H0(HĀ3H:H(HĀ%H=d+Hf&HĀH:HK&HĀH=d+H'HĀvH:H'HĀH=Nd+H%HĀH:H%HĀYH=d+HH'HĀH:H-'HĀUH=c+H~%HĀ_H:Hc%HĀH=c+H&HĀ?H:H&HĀHW(HGH9Hw(H% = t)HWH9ʸs@HW% = uHG0'HWHOHG(fffff.HG(H9GHCGH+Gfffff.SHH8Ht uHC8H1[Dt tkff.H\$Ld$1Lt$Hl$ALl$L|$HHHo8HW@HIH)H9}HG0L H$t2H\$Hl$ Ld$(Ll$0Lt$8L|$@HHf.HFdHD$HHItHt$HS@H+S8HH^HHC8HT$H$LHITL)IyEuTLLk H)HCLH)HCLH)HCLH)HC(HC@HC0LK|=1L)61LLkH)HC LH)HC(LH)HC0LH)HCHC@HCf.H\$Hl$HLd$Ll$H8HAtKLo(L9oLCoHGI)Hu=H\$Hl$ Ld$(Ll$0H8tYt|Lo(L9oLCoL+oAJD-AHDHL9HHC HC(Hf.tHCH+CoHC(H+C [Lo(L9oLCoHGI)At4JT-AHDHxPL9WHHCLHCHCHHkH)HC(H+C H@1HH=HHH߉L$L$uHCfH\$Hl$HLd$Ll$E1Lt$L|$HHAĨt91EuH\$Hl$ Ld$(Ll$0Lt$8L|$@HH tPHW(Lk8L{@HH+s IcM)LH9sOEtHS(H9SsHSf.@*HHS(HWHOHW(HOfFKD?dI9HD$3HHIMtLLHLHC8HT$K<>1L)HT$LHILLs L)HCLL)HCLL)HCHHS(HC@HS(HC0fDH\$Hl$HLd$Ll$H(HHIub1HI1LHH=MHk HkHktLLc(Lk0LcHǃHl$H\$Ld$Ll$ H(@HIH9LB@Hk(Hk0LkfH\$Hl$Ld$Ll$H(HHIIHHu^1HLI1LHHMHk HkHktHLc(Lk0LcHǃHl$H\$Ld$Ll$ H(HIH9LBDHk(Hk0Lkf.H\$Hl$Ld$HIHHHHuV1H蔅ILHH1Hk HkHkHk(Hk0LcHǃ Hl$H$Ld$HHIH9LB뤐+1ҾЃ=z+t 5e+5 e+IlAE1fDD=z+t 2o 2oHhHluHM+HB+AHd+HT[+HI[+pAHd+dIdIHd+d+fDIdI:tЃ=y+t5Cd+to 54d+eo-ffff.+ld+ad+Hd+HdHHc+lHn+Hc+HZ+=Yy+t o nHhHluԃ=-y+t c+n rc+nfffff. +HH lc+1H?c+dHHDc+H+H>c+HY+lfH9t HpHHhH=luHb+b+1c+ffffff.5.c+u>c+H9+pAHNY+ AH++AH(+ Ab+ffff.HtHGuHDtH1DHHffffff.H\$Hl$H(@HoH_@H4$H|$8IH|$H4$HHH!tJHtDH t>Ht5H@t/Ht&HtHtH@fD1HHl$ H\$H(@NX+HHt!H *a+H9wH `+LI9sDHvuHHDt@;HIHH I HD19@@H9tEH[HHH9s MDH?HHH92H)H 9@H9uH@9H HHHOHHH)HL H HHUIHI HH D1@9@H9~HHHH9s!fDHwHHH9jH)H 9@H9u3HOEt.HHH,H9-_+*HDHH9HHHl$H\$Ld$H8HH׃@u!H\$ Hl$(Ld$0H8@Ht$1ɺD$IǕH9IvIM9A0wIH!v+Hپ8IH(IHHDЃ1ޞ@H1;KĞgMf.AWIAVAUATUSH8H=w^+yd<%tOLwXLWPLOD1IHDID$LIT$L;`L;bI|$HPHBvIT$ HIFHI^HXvHC HC(HLsHCHH,+HSMLHCL{HHL$+Ml$IuDHH)HHCHSH;XyH;ZoH{HPHBv HS HFM9`Xt4CD,Id$7DM9IfDLIXXHHkB@HOhHL$fE~D$H(flHfo5u<fDofDo%w<fDo~<fDo<fo=<fo<DfofAfAofAofAfofsfsffpfAfpfofs fbfffDofDbfjfofDfAofAfAoffs fffofs ffs ffofAfs fs fffs ffs fffofAflfmffHfoflfmfH f@0H@H9HH@H@HH@H@HH@H@IltHA@A@HA@IHXH8[]A\A]A^A_HGXHHH@H@HH9uH[+R+밃=p+t Af Axf=*Hھ2ILD$LL$ LT$(J1LD$=Wp+t A0Qf A0EfLL$ LT$(5=(p+t A>f A3f=*L2ILD$LL$ LT$(1LD$=o+t A0 f A0fLL$ LT$(Hx t3HC(HB(HC(HP Hx t=ID$(HB(ID$(HP H9tJHP HS(HP(HS HB(HS(HB ZI9t1HP IT$(HP(IT$ HB(IT$(HB H@(H@ $H@(H@ kUSH=*1=n+t50P+2e 5!P+#el~ vYHX+HtH9X+r HHX+=n+t O+d O+dH[]$ILHMX+1foHcۺH)X+l@&X+$X+HX+B1ҁw Hc۲HW+W+HW+@HcW+HW+HW+HcW+HgW+HW+W+HfW+^*HNW+foHcۺH!W+H"W+`D3fD۸uH8W+*HcHHAUATUSHD *ExH[]A\A]*HV+V+H~V+HcV+>V+HH^V+HV+M+HU+ldHlhI{V+HHV+}AHV+~AHV+AtH@lHV+V+qHV+D%A*Ht&1 8MHHHuHtEu&HL+Ht*H[]A\A]pXDu*Et-*V+t V+ V+H)*pAH>L+ AH*AH* AmxAJxL@xL6xO,xC"x_II1HL=uHH $ILnIItIDEILttILtI}1 YU aEX uILut>I} 1 UI}1 TE aILt kILsI} 1 TLEOILst\XILsgI} 1 >TFI} 1 T%I} 1 Sff.USHHqS+H;AELDtH[]HC1=ch+t5I+^ 5I+^d<%t I+H{/HHtHBHHVR+fHOI+HI+AXlQ+~Q+xQ+HfI+gQ+AlfI+AA~f I+fI+HC H%I+HI+L~fHyHHH0H0H9H@H@HJ0H=H+HAXlHJ8HyH H+Hz8HyHJ0IHHHHH5HJ0HtRH{~H?qHHHz8DHxHAHHHHHHA l AL덐H@H@fDHH HwCH[#f.HHH|;(HHHH0w3H0H9`HH H w+Hnf.HH Hw!H[DHHHw HwHH H HnHHo|HICoHKHAH]G+H=Xlt2DHPHHvH@ H@(H@H=XluH HHO+Hc(HO+H0H.O+H8H(O+@@O+HHHO+P*HXHN+hO+lO+HpHO+HxHO+~O+uBDwO+Eu6dO+H*pAHE+ AHs*AHp* AH~*HH\N+HHVN+HHN+=1d+t xE+Z jE+Z1HHHwHwH[1=_+t A7V A7VH\$ 1HD$HD$11f.IDHHp1HH@HHuHHHtHHTHHFHHTHTHHPuH|$IXE1E1Hl$MGhHWHtpH9L$xL$pH$`H$hDHBHRIIH9HGH9HBH9uL$xL$pH$`H$hLxMIPIAIIAIAHtII9tDH111fDHBHRHHH9HGH9HBL9uIqI)IyIIIHuIAIMaII M9g=]+t AT AT1HD$Mn(IF8HHD$Mf IF0HH HtMH L tMtHKHS辈II~@LC1XHDHD1HL$xMIIxMIFIVMII~@HL$HT$HT$H$1bXIlt~I_XI~@I1HHKHS6XHCIFHCIIv@HHI[]A\A]A^A_I~@L$pIH$hH$`1W:HE+I~@I1HWHE+IFIL$xL$pfff.USHx *Ht$`D$hHD$HHD$XHD$@HD$PHD$8HD$0HD$(HD$ Hl$ IlfDHIHhHluHD$ LL$@ILD$HHL$PHT$XH|$`HD$HD$(HD$HD$0HD$HD$8H$1V1Hx[]Ht$`gSHH H=8E+1=Z+t5E+Q 5D+QLD+MtIpHD+=|Z+t D+Q D+QMtB1=LZ+t A0Q A0QHdLLH [H 9;+HH= D+H5ZD+H9H9L;+M1ې؃=Y+tAAtJMhL;:+uքtIlLDKC+1=Y+t A0Q A0 QHdLIhH:+LH [f.H IC+Ht$H U:+H=.C+H5C+ f.H=C+H5bC+H9LFHd<%tL>C+H9H5B+HHQHL@ LHT$fE~D$HHflHfo|"fofDo"fDo "fo5"fo-"fo"fofAfofEofAfofsfsffpffpfDofAs fbfDffofofAbfAjffDofofAfs fDfAfs ffs ffofffDofofAfs fDfAfs ffs ffofflfmf!fQfoflfmfQ fI0H@H9HHIHIHHIHIHHIHIIlnAHAHIHAHHHIPXIIIxH *H.;+foHcH;+`ffD۸uH ;+H:+2HcHHff.AWAVAUIATUSHH(HFT$ HHHHH9@HH;-:+H.HBHHH;x5|:+Id<%tAeITILH9fH9HqHt HrHSHd<%tHH9uHt9H([]A\A]A^A_DDL$ E1EIEXH9YAEL$+Mt$AIIM;x|5{9+jCuDHH)HHCHSH;XH;Z H{HPHBv HS HM9eX7CD43ID$IT$L;`OL;bEI|$HPHBvIT$ HQLIEXHPH;B-HHSHCvHC HC(HXHHZHH,+HCHRAEIlI]XH7+!8+HHD$L;HC HT$IoXH9HHT$HLHD Iz@H$:H$BHu>H+*HEHUH;hH;jH}HPHBv HU HID$ IIoXLuH9LLgID$ITH+HJHHHIuL2H)HLL9HGI)xHGH)Z7+HH97+H7+fDD$ =L+tAu+E AuEADId$DH.+HXHH;R6+ ~6+1HH+B6+HDHHhHH~e1*IH-+HI9uKHH*H(-+H1*Ht"I)tH-+L)L)%5+HHX@|$ (=K+t AMUD AMIDH([]A\A]A^A_DH6Hߋ5+H)Ht5HH H-{5+H)55+H([]A\A]A^A_i8fIHLuHD$H+D$MI1IDHt$L`Ld$L;d$4LsM)I#Dd*EJJ<3LL$.8L$M)LsM)xIL)%!5+LUIL_DLI]XHHHCJfL(LI|$ HSu#=a*H([]A\A]A^A_IEt҃=)J+t AMB AMB=*HS|$ Z1=I+tAuB AuB,\I`IV=I+t AB AB=*H2Ic1=uI+t A7|B A7pB|$ 0ID$ =7I+tAuXB AuKBHB0IHHI;x=H+t AM/B AM#BHUH{XStISHUH{6S~J<3E1A1ҹ2LL${5HL$Lsf\HShIfHx IHE(HB(HE(HP Hx ID$(HB(ID$(HP XIHx tvHC(HB(HC(HP =G+t AM6A AM*A=*Hھ2I1=G+tAuA Au AH9HP HS(HP(HS HB(HS(HB =QG+t AM@ AM@=F*L2I1=G+tAu@ Au@{H9t.HP HU(HP(HU HB(HU(HB rH@(H@ H@(H@ XIxInHPxIHHI97PI9t$HP IT$(HP(IT$ HB(IT$(HB H@(H@ ffffff.HHWHwu:lu H1dH8jf.HH%H8fHOHHH4 0+H)HH HuHǃ-/+H)5/+2@H=*hI{ff.HSHt|1=yE+t5&+@? 5&+1?1HHH@u>l=(E+t o&+? a&+?[f=D+t @&+> 2&+>HFHHHH)HЋ.+HH HuT[Hƃ-.+H).+1D=D+t %+> %+>Hڋ=*\I[@[=m*HVhI+ff.AWIAVAUATUSHHxHrHFA HHHLGL;=R.+EAADHLHH4HyHHVd<%tH~H9Hu "HHtXHMHd<%tH H9uHEA9 -+HHxH[]A\A]A^A_DIwgDLChDT$ IDHhH9HHUH;jbJL=HlHPHBvHMlDLHH0LH H[D$ CLChuHLD$LT$[LT$LD$LDLHH Hl$(0L$Xl$\HD$0L[LLH HHD$`IG HT$PHL$HnwHl$@LcX|T$lL$hAl$dHD$8E1ITDDщփDHI\HCHcAH]A XA'HEHhHkIIl$I9;HUH]HyI;xlHIw I9>I9I\$LcHOHHH0H0D^HDHI<HGH9H_HH;Ss#HP(HE HU(Hj Hh(HH@ HXH9rH9RHP(HE HU(Hh(HU(Hj HXHH HwH[U@HH H HnHDHI<HGH96Hm(Hm HVIE`H9H;T$8L)LLHIl$Il$Im`LeLevHE HE(1HlHXIHTHI HLx*+HHMH݅AHHHHw H@ILL$ D̓΍D 鋔XIDfDt 9v>wxXtщIDu HɅtHhH9>H!ꉔX@HHHH|+HkXLmIIL;l$8kCHLD$DL$LT$%D$XILD$DL$LT$D$ ,H|$(0T$\T$ H|$0L$`L$ H|$P l$ll$ H|$HD$hD$ H|$@~BT$dT$ JL=IlDHM:l$ D-IDHPH97L;z-HR(HJIIM9wHhH9HjH9MHHMHUM)H;h'H;jH}HPHBv HU HsIJL-HltHMH]K'+H݅LHpGl@0D$ H1d 4LmHEHUIMM)H;hH9jH}HPHBv$HU HtHx h HE(HB(HE(HP IIT$L9bJD=IL`HPHBID$wHC`IvH@ H@(1HlN40IHI LHL}HP>LH H v9LHHwYwD$ HJL-HlnD$ HLD$LT$LD$LT$LD$ ~HP|HCT$ T$ i=;+t AM_5 AMS5=*HUIDL$LD$LT$DL$1D΃=:+tAu-5 Au 5HULT$LD$$+L;=$+HD$ ($+;$+HL$ Jl9HHH!I9HkXD$(LmIIHlIHT$8IID$L)HHD$0+HT$LT$ HT$LT$HHHHH!HL$0HI|$H9IL$H+L$0HxIT$HH$+IH+D$0M)IH#+MfHxH;vHHEHH9D$81HlJt=LL)HHHsXH HH]HUHF1H'1HlLJL=HHM)H IHKXHELiH5"+I@LT$HLT$fHPHxIuHPH#+HNHL`H H HHHCXHPHT HBHH HHuHD$(IT$@IL9bucJD=IL`HPHBID$vH@ H@(1HlN40IHI LHL}HPI=7+t W2 M2=п*HU1=7+t 3?2 3421 hI뢃=y7+t /2 %2=r*H2ILT$,1=>7+t 32 32LT$=7+t 2 1=*H2ILT$1=6+t 31 31LT$HEYHBPHx HE(HB(HE(HP mHy +Lt$ IT +HL)HDHL$ N42HI!HL$(MLLT$LLt$!*HIHT$LT$toH8+Ht LT$LT$1H=@ +uL%7 +LH5+JT-L9H5+O,.ILmH-]+%+uHT$ ITLH#T$(HALGM9sE1A1"LLT$["HILT$t +HtL6=+MD$0@L9ELH)H40H5+LL1J (HT$LT$J1IH)HD$ H#D$(L$L*HHT$LT$H +Ht HD$HT$LT$HD$HT$LT$LLH+H)HHBH +|$0t+I ILHIHEJD-JD-w*H1*HT$LT$HG1E1HlLT$EH-+LT$IH)I=3+t +. +.ILLT$h1=z3+t5+. 5+.H-+LT$@JL*LT$1*LLT$HκHL$H)I<1HlKt%L)HHHH кHFIEL IEyIEH$Hl$HLd$Ll$Lt$ H(@HQHIFIFINHHI^IL1HA'Ld$Ll$IH\$Hl$Lt$H(D-*Ex+AƃIIII!Hh*HHdHHK1=5'+t 3h$ 3]$Cth5:+HJT&HHH!,HHtT=&+t <$ 2$HH$Hl$Ld$Ll$Lt$ H(HhfDHl=&+t # #1=i&+t5+# 5+#lLLjHŃ=0&+t w+# i+#6fD3{Ktt 11 HfH=+HD؃=%+t +# +~#Ktt HߺHHLLHHŃ=z%+t \# R#HT$(LLH$Hl$Ld$Ll$Lt$ H(Ld$H\$IHl$Ll$H(*OH*D-!+HHdHH41=$+t 3" 3"CtQ5+LHHHtH=$+t " "HH\$Hl$Ld$Ll$ H(HfDHl=<$+t o" e"1=$+t5_+b" 5P+S"lLLHŃ=#+t '+I" +;"BfDKt% 11HH1 H=0 +HD؃=m#+t +! +!HL`HHLLHVHŃ=#+t ! !HT$(LLH\$Hl$Ld$Ll$ H(ffff.H\$Ld$HHl$Ll$H(H*IHHw$H\$Hl$HLd$Ll$ H(|@H HFHdH(Ht{1=M"+t u! u!LHHVHIt^="+t M M LH\$Hl$Ld$Ll$ H(@Ht3 11HHuE1DHl=!+t M M 1=!+t5+ 5+ lLHIŃ=N!+t + +u ,H= +HD=!+t `+m R+_ HL HHLHHIŃ= +t M> M3 HT$(H\$Hl$Ld$Ll$ H(ffff.H\$Hl$HHHHi*茳HHHl$H\$HsSHH@Hu@HHHPHu0Ht+H*Hu&:HHҸ tH0[fD[HT$Hffff.H+HHHGHwu#lt HH%H81 +u.H;w +v%H=wHHH H [ +HD + fHHHWHH)H4] +HH HuHǃ-5 +H)5F +1 H4$H=*hIթDH\$Hl$HLd$Ll$ILt$H8HFHHHI$xH9L4IvHHH9H9Is[M9t$X.AD63IL9'IVINL;rHqI9I~HJHHQLH)HvjIlH4+HH HkHLHH HVHL5HCH\$Hl$Ld$ Ll$(Lt$0H81HIlHL H HkJL+HN HMHz 9HV(HHQ(IN IV(HJ &@H42HM H9HuLHT$I1HT$MBIEIML9HHsHH HSIUHVIUHVIUv=HVIUHV IU v(HV( IU(HV0IU0uHF8IE8HF@IE@HLLH 1H{lf1IlƒH)HH HH HCH+ID$XHpHCUfDLXfDHH{L, ¼I=+t A $ A $x=*HS諦1=+tA4$i A4$\1޼I뚃=+t A $V A $J=*L2IA1=S+tA4$7 A4$*H{ H9t$HJ IN(HHJ(IN HQ(IN(HQ HR(HR HfDHl$Ld$HH\$Ll$ILt$L|$HHH*HHWHSHGLoIILHI9SAIHHVA HHHLGl1=8+t 3: 3/LLLH Hƒ=+t $ HHHH\$Hl$ Ld$(Ll$0Lt$8L|$@HHLH%Ha+I]M LDHMI!M9ImfH1d vHu*LH\$Hl$ Ld$(Ll$0Lt$8L|$@HH)T18DLHIIWHHL21LHELLLH)1L$LL$HL$LL$t?L,LM)H)HHI]L+L;+L+L+IGI9L\HHtbIWHHH~L:P=C*HI16HT$HH\$Hl$ Ld$(Ll$0Lt$8L|$@HH1ff.H\$Hl$HHHH*H*HHHl$H\$HAUATUSH(H-'**HXlkHEuHHH"=K+t * *rD%;*DAA1=+t5<*I 5-*:1*IHAH+HcHKIT HDHH!H)H*HI$H*HtL+-+L1H-*N,+L)HL-+H]H([]A\A]fDL)Iqu*uH`+H*HTH9H(1[]A\A]Ht$1ɺHD$I6H9Iv@IM9A0wIHA+DI8IH(IHHDЃ1?fDDI;K1?`Hd HSH1=$+t5j* 5[*p11xHslHHƒ=+t $*o *aHtdHFH~HHHHHHH)H9r%H-H9sHH)Hw(و HHHH 1@<H[fH1d fffff.HSHdH8t^1=+t5b* 5S*=+t =* /*H[@H=-*pAt[Hle1xHslJHtlHPHpHуHHHHHH)H9r0f.HH9sHH)Hw(و HHH 1@4[AWAVAUIATUSHH8H"HjH@A1D=+t5* 5*Ht$(LIă=+t * *MLKID$IL{ DIMIIMGHHD$=-+t5s*Y 5d*JIl$@HT$LD$`HT$LD$&HHT$IIGLlHHH=+t * *HtjHEHuHHHHHHH)H9r+fDH-H9sHH)Hw(و HHHH 1@4H8H[]A\A]A^A_D**M<$HLNt8HMI!LI9uqHhDH1d fDHD$(1111s=*LI_1H5HNL1L)LHLL$LT$ HLL$LT$t>LLI)L)IILxL5M*L;5N*L5?*+L5:*HD$LHI93LL$NLL$LοlHHHT$LHHuL蜭ATHUHSHH HFHLfI1=I+t5* 5*11xLHl=HHƒ=+t G* 9*|HtgHFH~HHHHHHH)H9r(H-H9sHH)Hw(و HHHH 1@<[]HA\Hu"fH1d H[]A\1=2+t5x* 5i*~11xHslHHƒ= +t 2* $*HNHFH~HHHHHHH)H9r H-H9HH)HwfAWAVAUATUSH8=[*H|$(GHD$lD$$HT$1= +t 2 2H轘*AID$M|$Hl$1AI/MHXID;l$}AucH]H9uXH[H9tGHCHL9vJ<#HL!H)HI9sHƺL!H[H9ufDAHA{1H|$l HT$ D$$= +t  HhH=lHD$D$$H8[]A\A]A^A_LHH0w 0D$LH Hwh[D$5*HA*1HXHFH+D$(HHHHhHH~"1L$W*IH*L$HI9tb1 LH H w nD$QLHHw wD$8LHP|H~B‰D$$HHӒ*H*L$HtЋL$1L$*HL$cI)ZHL*L)L)%b*HHX^H:H٬HĀH=*H躬HĀ|H:H/HĀH=*HHĀI8HHĀmI8HJHĀ頙I8H迭HĀ鲙I8HHĀH=*HHĀ龚H=*HfHĀH=*H跫HĀH=*H(HĀH=u*HyHĀҥH=V*HHĀ钦I?H?HĀ\I?H贬HĀH= *HHĀH=*HvHĀI8H˪HĀ,I8H谪HĀخI8H蕪HĀ鸱H=~*HvHĀñH=_*HHĀݱH;HHHĀmI>H[HĀI>H@HĀH=*H葦HĀH=n*HHĀH=O*HHĀI>HȧHĀGI<$HHĀI<$H萧HĀ*I<$HtHĀUH=*HťHĀcH=*H6HĀxH=*HHĀI<$HHĀH=H*HLHĀTH=)*H车HĀH;HHĀH;H臦HĀH;HlHĀH=*H轤HĀH=*H.HĀH={*HHĀcH;HHĀH;HIHĀ&H;H辥HĀFH;H裥HĀH=*HHĀH=*HeHĀH=*HFHĀH;H+HĀ(H}HHĀH}HHĀH}HפHĀFH=$*H(HĀTH=*H虤HĀlH=*HzHĀH}H^HĀI<$HBHĀlI<$H薢HĀI<$H HĀI<$H^HĀH;HCHĀH;H踣HĀH=*H虣HĀoH=*HHĀH=*HˡHĀZH=*H*uH@H?H?0w?0w:fffOfVfftftffсHHHHE19t&wAБHLHI)LOc O A@fofftftffDAD)>HIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs|fff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<fff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffсHfoIPfo fofofsfs fftftffсXHfokff.ftfufIJfo fsfsfff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffс^HfoIPfo fofofsfs fftftffсHfokff.ftfufIJfo fsfs fff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs| fff.ffofoftfs ftffDAD)U fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs< fff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffсX Hfokff.ftf€ufIJfo fsfs fff.ffofoftfsftffDAD) fofHALWIIfIfo fofofsfsfftftffс^ HfoIPfo fofofsfsfftftffс Hfokff.ftfufIJfo fsfsfff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |fff.ffofoftfsftffDAD)UfofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs <fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсXHfokff.ftfufIJfo fs fs fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffс^HfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |fff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<fff.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсu\Hfooffffff.ftfufIJfo fsfsftfffID H<H4EtHff.H )1fffff.)ÐH?H?0w?0w:oofftftffс2HHf.HHE19t&wAБHLHI)LOc O A@fofftftffDAD) HIfH@fof:cHRvfof:cHRv f.y HL )f.ffofoftfsftffDAD) fofHALWIIHfDIJfof:Df:c HI&fof:Df:c| HfDIfoDfsf:c:w; fffff.ffofoftfsftffDAD)+ fofHALWIIHfDIJfof:Df:c HI&fof:Df:c HfDIfoDfsf:c: w[ fffff.ffofoftfs ftffDAD)K fofHALWIIHIPfof:Df:c HI,fof:Df:c Hfff.IfoDfsf:c: w{ fffff.ffofoftfs ftffDAD)k fofHALWIIHfDIJfof:Df:c HI&fof:Df:c HfDIfoDfsf:c: w fffff.ffofoftfs ftffDAD) fofHALWIIHfDIJfof:Df:c HI&fof:Df:cHfDIfoDfsf:c: wfffff.ffofoftfs ftffDAD)fofHALWIIHfDIJfof:Df:c@HI&fof:Df:cHfDIfoDfsf:c: wfffff.ffofoftfs ftffDAD)fofHALWIIHfDIJfof:Df:c`HI&fof:Df:c<HfDIfoDfsf:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:cHI&fof:Df:c\HfDIfoDfsf:c:wfffff.ffofoftfsftffDAD) fofHA LW IIHfDIJfof:D f:cHI&fof:D f:c|HfDIfoDfs f:c:w;fffff.ffofoftfsftffDAD)+fofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:w[fffff.ffofoftfsftffDAD)KfofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:w{fffff.ffofoftfsftffDAD)kfofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:wfffff.ffofoftfsftffDAD)fofHA LW IIHfDIJfof:D f:c HI&fof:D f:cHfDIfoDfs f:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:c@HI&fof:Df:cHfDIfoDfsf:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:cvdHI*fof:Df:cvDHfffff.IfoDfsf:c:wf:cfff.s=HJ|Et)H<H4EtHDH )1fffff.)ÐH\$Hl$1Ld$1HHtH$Hl$Ld$HHs*HHdDet&dDeHl$H$Ld$HHLHH(*dDeuH$Hl$Ld$IJH˖H\$Hl$HLd$Ll$HLt$L|$HXxP;=&}HLcJ4JHt;JmHHHl$0H\$(Ld$8Ll$@Lt$HL|$PHXLcIJ-HIHt$I1L D$&I9HLIFHI:I9rHvD+lfDHT$HLL)HL)H9HG?ŐH1?f0woftfЅuzHHHHftH)f!uQfffffft@fЅuCftH fхuFftP0f҅uIftX@fH@@tH)HHffff.H)HHDH)HHD H)HHD0ÐH+H-IӉH?H?0wI0wDfffOfVfftftffсIHHHHE19t&wAБHLHI)L/Oc O A@fofftftffDAD).NLM9OMFMHIfffff.fo foftftffсIHfo foftftffсIHfDffofoftfsftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсnIHfoWftfu IvfI4f.fo fsfsfff.ffofoftfsftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|fff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsfff.ffofoftfs ftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffсIHfoWftfu I vfI4f.fo fsfs|fff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsfff.ffofoftfs ftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffс IHfoWftfu I vfI4f.fo fsfs| fff.ffofoftfs ftffDAD)U foNLM9r Mi MfHALWIIffffff.Ifo fofofsfs fftftffс I HfoIVfo fofofsfs fftftffсn I HfoWftf€u I vfI4f.fo fsfs fff.ffofoftfsftffDAD) foNLM9 M MfHALWIIffffff.Ifo fofofsfsfftftffс> Ih HfoIVfo fofofsfsfftftffс I HfoWftfu IvfI4f.fo fsfs| fff.ffofoftfsftffDAD)U foNLM9r Mi MfHA LW IIffffff.Ifo fofofs fsfftftffс I HfoIVfo fofofs fsfftftffсn I HfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHA LW IIffffff.Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |fff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIffffff.Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHA LW IIffffff.Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |fff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIffffff.Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|fff.ffofoftfsftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсurIHfo[ff.ftfu IvfI4f.fo fsfsftfffID H<H4EtHff.HI)v  )1f)Ð=)*uH0!*tHÐHW IЉHHfftf M\I I MQqIfftFfЅy I JHJTHWHHH1IHI)It1HtLQIILZIc I Ik fofHHftfЅ IA fo f HftfЅI fo f HftfЅIfo f HftfЅIfo f HftfЅ\]ffff.1M97Dfo\ftfЅIbf:fHM9fo\ftfЅI)f:fHM9fff.1M9Dfo\ftfЅIf:fHM9ifo\ftfЅSIf:fHM90fff.1M9Dfo\ftfЅIBf: fHM9fo\ftfЅI f: fHM9fff.1M9Dfo\ftfЅlIf: fHM9Ifo\ftfЅ3Iyf: fHM9fff.1M9Dfo\ftfЅI"f: fHM9fo\ftfЅIf: fHM9fff.1M9gDfo\ftfЅLIf: fHM9)fo\ftfЅIYf: fHM9fff.1M9Dfo\ftfЅIf: fHM9fo\ftfЅIf: fHM9`fff.1M9GDfo\ftfЅ,Irf:fHM9 fo\ftfЅI9f:fHM9fff.1M9Dfo\ftfЅIf:fHM9yfo\ftfЅcIf:fHM9@fff.1M9'Dfo\ftfЅ IRf:fHM9fo\ftfЅIf:fHM9fff.1M9Dfo\ftfЅ|If:fHM9Yfo\ftfЅCIf:fHM9 fff.1M9Dfo\ftfЅI2f:fHM9fo\ftfЅIf:fHM9fff.1M9wDfo\ftfЅ\If:fHM99fo\ftfЅ#Iif:fHM9fff.1M9Dfo\ftfЅIf:fHM9fo\ftfЅIf:fHM9vt1M9vkffo\ftfЅuPIf:fHM9v1fo\ftfЅuIvif:fHM9v1LILLHHAIHAI wD HLyIc I ffffff.1LHHIIHLFIc I fff.Hfff.HHLH1tHLtuHDIuffIuÐfffNfOIufIuVWIjfVWIJfVWI*fHHIffff.HHVW I HHVW I HHVW I HHVW I HHHNHO I fDHHHNHOIFDHHHNHOI&HHHVHWI f.HHHVHWNOIffffff.HHHVHWfNfOIffff.HHHVHWNOIffffff.HHHVHWNOIPffffff.HHHVHWHN HO Iffff.HHHVHWHNHOIffff.HHHVHWHNHOIffff.HHHVHWHNHOIffff.HHHVHWHNHOVWIXHHHVHWHNHOVWI(HHHVHWHNHOVWIHHHVHWHNHOVWIHHHVHWHNHOHVHWIDHHHVHWHNHOHVHWIfDHHHVHWHNHOHVHWI6DHHHVHWHNHOHVHW I DfnHf`Hff`ɃfofpH)foHftftff!!1 u"foHfoftftffˉ tDAu tHDD)AD!tHDÐfnHf`HHf`tDfofpH)ftHf!u"H9vfo7HvftfȅuH9w1HD7HHtH9vÐ=i*u"Ha*tH3HHH)II It7IH)It7ItzH9urIt7It^H9uVItHH7It@HH9u7oo7ftf1tCH  )H9t"II)IHHHH)Ð1IIIIt%oo7ftfсaIJ|H_Hto7ftfЁ*HMIL9H t:o7ftfЁHo7ftfЁHMIL9}qo7ftfЁHo7ftfЁHo7ftfЁuxHo7ftfЁu_HI9uMIL9}7o7ftfЁu5Ho7ftfЁuHI9uI)zMfH3MIL9}Htfo7ftfЁuHI9tMIH t6fo7ftfЁuHfo7ftfЁxHI9fo7ftfЁRHfo7ftfЁ5Hfo7ftfЁHfo7ftfЁHI9uMIL9fo7ftfЁHfo7ftfЁHL9uI) M%fAUHH)ATIUHSHHH9HHvfHIՃI)Ht'HHLHHHuH>I,<LHHHLHHHLHtf.HUHHuHL[]A\A]fDHH2H,:HvoHIՃI)Ht(HHHDHHH2@0uH)H)tQLHHHLHH)H)AtLDHHHUuSLHHH6@LHHH=*uRHkD*tHHHu@7IIHIILLtC$fHwHHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfHpHxHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWÐHvH~HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWÐHuH}HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWWfffff.HtH|HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfHsH{HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWWffffff.HrHzHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWfffff.HqHyHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWWff.IIIM)ILM)L.vC$f.WWHWn@WHWaWUff.WfWHW=WfW1WW"WfWWHW WfWWfHnflILL vC$fPf`fpfGfGfGfGfGfGfGfGfOf_foffGfGfGfGfGfGfGWfNf^fnf~fGfGfGfGfGfGfGfWfMf]fmf}fGfGfGfGfGfGfGfWWfLf\flf|fGfGfGfGfGfGfGWfKf[fkf{fGfGfGfGfGfGfGWWfJfZfjfzfGfGfGfGfGfGfGWfWfIfYfifyfGfGfGfGfGfGfGWfWWfHfXfhfxfGfGfGfGfGfGfGHWfGfWfgfwfGfGfGfGfGfGfGHWWfFfVfffvfGfGfGfGfGfGfGHWfWfEfUfefufGfGfGfGfGfGfGHWfWWfDfTfdftfGfGfGfGfGfGfGHWWfCfSfcfsfGfGfGfGfGfGfGHWWWfBfRfbfrfGfGfGfGfGfGfGHWWfWfAfQfafqfGfGfGfGfGfGfGHWWfWWDD i(*M9T@M@IffGfG fG0fG@fGPfG`fGpH}LLpC$ItM@IffGfG fG0fG@fGPfG`fGpH}LLpC$@I swLHtRHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<LkC$fD )'*M9MGvIsLIHtHHHM)wAJ<LjC$@LHteHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<L3jC$ÐH szt HHtfHHt HHtHHHHt#HLFHLGHvHuHÐt)HTHvHuffffff.Hwwt`HLFLNLVHLGLOLWHv H t6HLFLNLVHLGLOLWHv H ufff.HL%*I9LGLIHtHfL)HuHL$*I9LGLIHLt$Ll$Ld$H\$=V*HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8 @ Hv@H@FHHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@t]HHH^LNLVL^ Lf(Ln0Lv8@HH_LOLWL_ Lg(Lo0Lw8Hv@H@JH\$Ld$Ll$Lt$L)Hu?Hffff.HHLt$Ll$Ld$@@HHLFLNLVL^ Lf(Ln0Lv8HLGLOLWL_ Lg(Lo0Lw8HF@LFHLNPLVXL^`LfhLnpLvxHG@LGHLOPLWXL_`LghLopLwxHHMLd$Ll$Lt$HÐH Hswt HHtfHH@t HHtHHHHt@HLFHLGHvHuHD$t4HTfff.HvHuffffff.Hwwt`HLFLNLVHLGLOLWHv H t6HLFLNLVHLGLOLWHv H ufff.HD$L *I9LGLIHtHfL)HuHD$@La *I9LGLIHLt$Ll$Ld$H\$؃=*HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8 @ Hv@H@FHHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@t]HHH^LNLVL^ Lf(Ln0Lv8@HH_LOLWL_ Lg(Lo0Lw8Hv@H@JH\$Ld$Ll$Lt$L)Hu?HD$f.HHLt$Ll$Ld$@@HHLFLNLVL^ Lf(Ln0Lv8HLGLOLWL_ Lg(Lo0Lw8HF@LFHLNPLVXL^`LfhLnpLvxHG@LGHLOPLWXL_`LghLopLwxHHMLd$Ll$Lt$HD$ÐHЃ$IHHHHNHHGfHF HO HN(HG(HF0HO0HN8HG8H@HH@HHHNHGHFHOHNHGfDHHHHHHHfDHHtoHfHHH0H8d@HHH(H0D@HHH H($@HHHH @Hff.AHUA@AHSD)HHtQHtHtBLHnHHfHLL^IDLIL H[]ÐH.H^HHILVIDHI LOML^IDHI LOH HtH LH.HDIL HIH^IDIM LOHLVHHHHf.HЃ$ILFHvH(HHLLI Hp fHqLHLIHpHqLHHMH7HxLAIp8LHLO8LI0Hp0Hq(LH(LI Hp LFH0LNHHLHt?LFH8HvHLH@HLFLNzf.LO8f.LFHHvHHL-DLFHLNHHLDLFHHvHHLDLFH LNHHLDAHѸ@AHAH\$Hl$D)HLd$Ll$%HHt%HtMLNHH.H^IMofH HLNLHnu2IDLHH HGH\$Hl$Ld$Ll$ML$HIYIDMHII L_HMl$HDHH IjLM\$HDHH IZLLHDI)HH HH7IzV{fLNHHLnHIMDLNHL.L^HIM돐=*uBH*tHXfnHf`Hf`ɃfofpH)ftf!ufoGHftfȅtHÐfnHf`Hf`ɃfofpH)ftfȸ!uf:aOHsHHÐfnHf`Hff`ɃfofpH)foHftftff !u foHfoftftff tHDÐHHHHvpIIDHOEDG$DFHOEDGDFHOEDGDFHOEDGHItH>HHH@9@uIIAI9LGMHHHHII)M9rL9tZL)IIMIMt7fNT1@IHII9fCwLL)L9tHHufHH)HT2HIHHzH?H?0w?0w:fffOfVfftftffсHHHHE19t&wAБHLHI)LdOc O A@fofftftffDAD)^HIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIzfo fofof:ftftffсJHfoIC$f.WWHWn@WHWaWUff.WfWHW=WfW1WW"WfWWHW WfWWfDI swLHtRHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<LV9C$fD i)M9MGvIsLIHtHHHM)wAJ<L9C$@LHteHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<L8C$ÐHa*t" a*BEHEH蛀fAWHA1AVAUATIHUHSHӺHX DHHAH)IHLHH 2H9vDL E 9D8 rtHNAfL9LJHLHA1I%f.HLAL)IILHH 2H9vLN+ED8 wtHNAf.L91LRHLLIHI9sMIHl$HT$PH$P~L$flfoDfHH9uHtHM14HHLPHH9wJ< M9HLhHMUHD$HL)L)l$H1HT$0KL}Hl$(E1LL$8HT$@HHLl$ Ll$(1LT$Nl-LH)I<<ЭHLT$MCD,HDPHL;t$ HD$ ICL9s,I : *I , :uoHL9rL;t$ HL$@BL:)I4,THH:T0uHI9rIL9uHl$8Lt$0LfHl$HHE11HX[]A\A]A^A_MtH;D$8HBD$0HMEHD$0L)LuHL9Hl$ IBL)l$0E1HHT$8KHT$(DI,/1LD$HH)I<@AA)tAtn@@ ƒ Vv Aaf.@F1ۿu &هމƒun1ۿu هމƒu:fAWAVAAUATUSH(Ll$Ld$D$D$D$ AT$AtjLLƉHLLމHunLLDHuYt$LLHuCD9t$ vAfD0T$ Dw|$HHEDH([]A\A]A^A_ÐH\$Hl$Ld$HR*t#t.EH$Hl$Ld$HfKrR*uҋ5~R*5nR*HHHA3DHR*DIR*Ak1ADȃND9uAAAt1A A rEYfDH[H~H@HH-&)HH)HH@HH5)HH)HHEH?IHHIILM~)=wwt uyK4 !x  O*fDAAD ǃiLLH?HIpDrjuAAAAA!Ae5P*HAHf.HO*tt5t 1HÐ|$oO*|$H5O*HH鷯SH_(Ht6HG(HG HsH{itH;Hs]tH[-@[fffff.SE1HHHL$H1uHt$HvH<$ t1H[@H3H$H[H\$Ld$E1Ll$Hl$H8Ld$HHUIILZHt$Hv7H<$sHfH\$Hl$ Ld$(Ll$0H8H$HsHHE1LHUIL~ubHt$HvgH<$.sH$HCHsH;sfH;tM1H{kHWHCfDH$HsHHCu럸#Uh@HAWAVAUATSHHHt @lػH{(( HI DC4HAHMII AH1H҃f/HHuH)IDHH)Ll$ILt L HHA HuHLuL}E1LUILLL}HuHvjH}qHEI$ID$I<$Ht It$eqL*HC(IPl@Ht @l!He[A\A]A^A_fHEIt$HI$tE1LLUIL|uHuHH}pHE1HID$]Lc(HC Bo@I$2/HH/HHEpIgKHEH藫fIt$HEfUSHHHdHH(HE(Ht=HHHHH:HKHHHKH@HCtBHCH8t@H[]H`JItH=HE(말HH`=HÐH\$Hl$HLd$Ll$H(@AH*~uHۿ(AtH{8LCk8I}(H(@LhH@H@H@ H\$Hl$Ld$Ll$ H(1]p1EtHHcd1dfD1Ҿ$G*%fD( HtA 8fffff.S?1 CG*tF~e(H@HPH@H@H@ [1Ҿb'G*1:yHHcd2d21[( HtӺ eHd1[ÐHSt&[Hd[ÐAU1ATUSHHHdDe=iF*t s sHCLk($fDITJHHCHJHK H:uBH;CrHS;LH~HCHC1u2dDe1=E*tKu<Ku5HH[]A\A]1d}uH{HHĀEH{HuHĀ벐AVIHcNAUATUSH=wXM$IM9s@L@CLsLAlzlH{HPL芚C@kHI9Iw[]A\LA]A^HId␐UHAUATSHL%D*MPAD$(tHD*HJ(uE1 AD$(IID$HtH H\$HL#M$$LkMu9dD %Dd%dL%1M1 8H=(A4HC*HtHd%d%1H H dH% p@H4D*HtLaZI4DLxHL@H@DI,I9uHH4)H)H)H)H))t%@HHPHtHH[@(Hu.*HeD[A\A]HAddD %HtAHHPHtHH(„tP,td4%Hx(DH[HuHeD[A\A]fD1HcIA<fH׉H=wHDH=vdAdA߸;H=wHdÐH,*UHH]LeHLuLmIL}HĀ?ItN/tLHLHLuHd8t8H]LeLmLuL}DHdHE1f.HAHHuEoMcIIIIL)E1HD$HHpAHILpt'IcHLHHAHHHAuH8LHL DIQHI5HAgHLHMgHML@IN<:IL};HEHEHHH)L|$IMI|LLCHEHHEHE@/EHEHE:LΰI9IL}tLHLH)H}L)ILHLHdtJ-}t EA>MnfDnttH}tHuLH>HdHE1HAHHuAUH}HcHH<:H9HHH)HL$HHMH}teHEAHILxoHIcHTHfH AHHHAu:}tHd H}H}z111HLxMl1HIuAE:HMLELEHMLHULEBHUHMLEH}HUHMLEHIHEHUHMLE/HUAHUHHEHELAeLeIlfÐUHLeLmIH]LuIL}HIdE<$VHHH0@dH0HLH8H0 dH8IH0HD)HH)H\$HH肞H/POSIX_VHx LHIVf@6_迢H@H޿ HdE<$H]H?LeLmHLuL}fDIKH\$Hl$GLd$HXv0"EJ[=JH\$@Hl$HLd$PHX|9HdHDHt$ Y I11HAtHDHcHu Hd8tIcHgHt$8H !&HT$8H9C /f.$IIADHHHiIIpf\R H>4*c  @HHH¸H1 HHw8m1fD`V7LH@6 ,9H :H@@ H\;HDfDHt$  HD$ H=HHD$ Hl$Ld$HH\$Ll$H\I3m!srfgKfDHt MtH9HULAD,HHl$pH\$hLd$xL$HĈfQ4fZONbLtZMtRfH1dpclb _^HþIH?HHHgKHHw8I?E1=H~*HPOSIX_V6H_ILP32_OD$FF32H<$Ht$AH MAHHHPOSIX_V6H_ILP32_O@FFBIHHP@GHHSB, HIPOSIX_V6L(:HLkfde@{vptduSE1H~*HPOSIX_V7I_ILP32_OD$FF32H$L\$AH,MAHHIPOSIX_V7I_ILP32_O@FFBILLH@GHHSB, HIPOSIX_V7LI_LP64_OFf@F6@4LXHDIyfpNI@t2!TtUfDI}IDMHDfHþIH?HH0HgKHH IB, HLkHHrB, HLkHHMLH(D}E1H~"IXBS5_ILPI32_OFF32L$LL$A~{HMu}AHHIXBS5_ILPH32_OFFBI@GLHxHHSB, HHXBS5_LP6@4_OFf@ F6H@4HU IFfDB, HLkHHxMu@H@`t&IA u\@0@4@0HA>uI\@0@1@1H\@0@1@2H\@\H\@\Hq\@\Hi\@\HHHt)HUHH]LeILmHH I^OHH HLHH)H\$HH̉HfcL\1HtH]LeLmAVAUAATIUHSHHf?xOHdL%L9Bt01={'*t 2 2HLBBDHDHH H2HHH t t#ttHf  H u1HpHHψVLH?t~\LAuyLA@0@\@1uy3uy4HyuF\HfDHH H' H1HtHI$HuH t tH1҄Hu&  @Hu߉1HXHfH@sLH?tM1@\LAuyLA@0@\@1uy3uy4HyuC\H@HID$u H t tH҉1Hu!.f< 6< fD(Hu߉1HZHfH@sLH?tM1@\LAuyLA@0N@\4@1uy3uy4HyuC\H@HIT$u RH t tH51Hu!.f 8 @+H u߉1HHHfH@qLH;tM2@\LBuZLB0\1uz3uz4HZuA\HHID$IL$$IT$ 1SI\ trtvf}x8HBBu$HB=i#*t  HL[]A\A]A^ID$gKID$gKID$gKAD$ AD$$|H{0H HS0HC2C\HL y@4_@1DIHyA1A2C HC\HLy@4@1hDIHyA1A2KC HHfDA\HLZ41DJHZA1&A2A HF\HL y@4t{@1DIHyA1A2F Hff}ytE1y0HysC Hpy0HyC Hy0HymF Hiz0HZA HHBBtHB= *t ux urE1uA HF HC HC HH:HHĀH:H[HĀ H:H@HĀs=9 *t 0 * " *r ff.@)t=8)fffff.H1=*t5 *C 5 *4  *u%H *ܧ)1HUD=ʧ)U)a *1HD$#HD$HƇfDATHUStH=8 *҉5, *ttf=h)tlD *EuDHnld+cdD#=))#)A[d+q[]A\@=))u *I/dev/logf *L *H *H *H *H *H *H *H *H *H *H *H *H * *D*E 5&)1ҿ!lj)*u*D *Ep1)f.D1=)=)@ƃ5{)#*Znld+dD#=F)@)A[d+1=!)[]A\)@5)1 lj)*H/dev/logf*H-*H*H*H*H*H*H*H*H*H*H*H*H}*{*tW=*yu5+)1lj) *1)Ddv*1ҿnlj)\*ut7H*iJHd:hhd;ufDAHI1=*t5*| 5*mDL~1H1HD$wHD$Hf.Hl$Ld$Lt$L|$AH\$Ll$HIHT$IHDŽ$HDŽ$dE.q)=i)H$H$ DEHH!H$IH1zHHt$HՇHk(Hs0AJHIH)HHHHk(H=*HHH g*]H=]*t.HC(H;C0:HHC(H9C0 HHC(AdE.7HT$LDH%HH$* taH$H(HT$PHH)HT$X| tHD$`>>KHD$hHL$pHt$P1ۿH9HEH$H$HDŽ$1=x*t5n* 5_* C*=) #*="*t * *H$HD$pH9tH$H$L$L$L$L$HfD`I#1WSfH=ٟ)HH=w*@H$H$@=)HD-0*E=q)5*H=*1S)*D%*EH$H$@=)qH=*=)耾*ߞ)*f1ҾI1 IHH$ǾI1"$D56*H=3*1҃=f)*H$;IH1DHt$LH>H\$pIout of mIemory [L|$pLt$xLD$\HkgfffLDH))0҈uLH1H)DwHP]@H$HH)H$::HlHC( HlH$HHn}HH#H[}ff.HH0HHL$8H 3BLD$@LL$HH)H$)y)q)i)a)Y)Q)I)AH$H$D$0HD$HD$ HD$HHHT$0HBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$HH=)H臷HĀoH=)HصHĀH=e)H蹵HĀtH=F)H蚵HĀH=')H HĀ Iʸ H=Ð H=Ð H=ÐH=}ÐATHIUSHu-[]1A\f.HuHAԅt"HuHHIH.Huf.[H]A\H\$Hl$HLd$HHHAtm1HDH{Ht AT$HHDH{Ht AT$HDHHH$Hl$Ld$HHufHu fHt1D@UHAWAVAUATSHHH}HUHL$HHu1He[A\A]A^A_fL.MtLE1E1E(fDIEI]IHtHAHMH0H}UAHMtOD;etEJ1L+yI]IEAD$HLEIHH)H|$HvH븐L IAMAHMLELL9tHIGE/Mt A@,IcHtHHBL9$D@At+AAD@JL@HPLBHHpHBH4HXHtuDCAtjHHHtAujJAA HKDCHJHKHCHHHSHbL<DLIDHXHt7Ct1ZH وHbHHaHHHPHJH뗐HAIMtA@DA@j@HBD@At+AAD@JL@HPLBHHpHBH4HXHDCAHHHt AJAA HKDCHJHKHCHHHSHbMcMyIII?N1AIHtrMLD;euAD$HLLELMEIHH)H|$HtLMHLEfDIcHDHH9xtiL@bfDLGGHXH{CqZH وHbHHaHHHPHJHL@DAW1AVAUATIUSHH(HHT$HHt`H.E11E1E1D$HHuHT$+I$HHHHpHAFHaHHHtaMtgIMy@tYDD$I7EAEAE8R@yN`EHxHHHyHHHpHNIHEHuHLMDt$tH.AIIH T$H4$HT$H4$HHL9HH@H@t~HHYIHtcHYHtcI${@tOEIuA@A8}@{NaHQHYHSHQHqHVIMfH([]A\A]A^A_ÐHuHEIaNEHAHqHFI]cNHSHsHVH([]A\A]A^A_fH(H[]A\A]A^A_fDHxHHHyHHHpHNIHAHqHF?HQHYHSHQHqHVHSHsHV fH\$Ld$HHl$Ll$ILt$H(HoHt}LmMt-I}HtI}HtHI}LLmMt0I}HtHI}HtHsI}LH}HIl$HLmMt0I}HtH/I}HtHI}LpLmMt~MuMt/I~HtHI~HtHI>L/MuMt/I~HtHI~HtHI>LI}LH}HI<$LH$Hl$Ld$Ll$Lt$ H(H\$Hl$HHHHt?HHt)H{HtHH;HHl$H\$H]DH\$Hl$HÐUHAWAVAUIATSH8HHu:/L`JIHELuL}1HtIHFHuHHHILLLHLmkI9tHHUIH=F)HDHRHe[A\A]A^A_LxLuI@L)HuIH\$LLLmHHgkI9tH5)IHe[A\A]A^A_H\$Ld$ILl$Hl$H(H=)HId+~gH)1I4MtLLtH5e)I蓷H=T)d+IH\$Hl$1Ld$Ll$ H(DH)1 IMt-H= )LL/H )"I;H=܍)d+%IH\$Hl$1Ld$Ll$ H(mffff.SHHff.HHT$0HpBHt$(HL$8HH)H$LD$@LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$5Hffff.H\$Hl$HHH=Ќ)H~CH$)I1hHHH5)H\$ Hl$HfDH)1 I%HtH=a)HHn-H=O)HG(H;G0s HHG(H\$Hl$HH\$Hl$ H[ff.SHHff.HHT$0HBHt$(HL$8HH)H$LD$@LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$uHffff.SHHHT$0HBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$ffff.SHHHT$0HQBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$TAUIATI)IUSH HDŽ$ u HHtL$ HDŽ$ H HHtE1LLHkuQHH$ HcHH?HH$ H>H$ HuHd&H []A\A]@7IfDGIfDH\$Hl$HLd$L|$HLl$Lt$HXL1L* |$LD$IMLM)LQHLD$2HHM9,$LH\$(Hl$0Ld$8Ll$@Lt$HL|$PHXLLHUHI$|$H+LI$H+I4$H)ҧLcMM<$ M<$L+LL)LPHdM9LH)HRHH?HHLH)HD$1@M<$L LPA LI$HI$uOI9uRHT$|$HI,$'LcMyfDE1I9t M9IFL+L+IM@U HAWAVAUATSH(eXIMII IEH)1Ld$IO,,LmLm蝮Et_1LuL}HƿIu&@0 }MLLLHuHc}He؉[A\A]A^A_1cI%Et0LuL} qI (}LMLLHHuyfAW{IAVAUATUSHXHHLt$E1AIfHXHtSxuHpLHuLx LLHtHD$L9t8HA HuHȶHD[]A\A]A^A_A䐐)dDÐH\$Hl$HHHt/H.Ht'/H5MHt(HHU)HHC)H\$Hl$H@H-1)ڐHHHHHNH>HLMLT$8H~t1Hu%Hu'd%d%X_HIʸH=ÐIʸH=Ð)H=ÐdH%HHPHwdH%HHHDH9Ðd%AAA9tdD%uAA tHdH%0d %dH<%f.u'd%AAdD%uD؃ tdH<%M1Hd4%Hd%ːH)Hd<%tH=)H9uHfAT1IUHSHH=)t5); 5),`lH1fDH00p0uLLHHHp FFHHtMIHhL`(IlH]HU@H)Hd<%tH5)H9uHHHT=)t @) 2)HH[] A\f.H H HT$1HHHT$tH)/HH )H=)H胛HĀH=)HHĀ\HHH=)1117lHÐSHHàdH;uWuGGuPHGfDuH|$H|$fGDdH;d<%tH/)H[G~/dH;fSGHt6H)H90tvDGE~ H߾[uDtD?usuCf{DHCu>HfCD[,@[f1[ÐUHHH}Eu~6HuC\E~HUHcHH<ÃufD1fff.UHSH^u1;V VtHH[fHcHuHH7HuHV~HHcHH9\ufDH[ÐAWAVAUATUSHt$T$H$H$H1H$HT$r@H$H?vH|$ H$HD$(HHD$0IHD$8AH|$@AA@HD$HH$H;EHHHD IH;H)HH$1HD(IHT$IJD4 E|$JD, ;HV[I9H7HĀH:H謖HĀrH:H葖HĀ몐Hqs)HH')Hff.AUATIUSHHHH )HHH9rFHjH)HuI,HHIEtHHr|HH>HBHHH)HHLdHHH[]A\A]ùI1ҾI H)j^f.HHHtTdH%H H; Y)uHHHt1H;Bs)H5*)HHvL)LL9sHHH; 7s1ffff.=)uH)HBH)H)H)H )HH9wAL1HH)L9rHIHt#LLHH)L9sHH|1tHH9v})ff.AVAAUATE1USHoHLmHE"I}uH}Ht IEHI9rLEu []A\A]A^@H+1q)H []A\A]A^eDAWAVAUATUSHHH|$GLwH )E1H5)E1@H1MH9J8H9HXHHHlfHT$H)HHHHJ<2HHHBD2H L(HH $I)TQL1HH $H5 )HH9HseJ;HH9rtHHEHtHUH@I9LBH[HHHJ2HHHBD0HHH9rH5)II9s HI@M&HD$H[]A\A]A^A_fATH=O)USHo)HHHH H@@1Hu\u?u2H=)LgH虼HtLL HHCH[]A\ÐfHtHtH1H[]A\fDHQfDH{f@,fHffffff.AWAVAUATUSHHHH=)HoH譻HnLpH(H\$LsH )H5)E1E1H1MH9J8H9HXHHHlf.HT$H)HHHHJ<2HHHBD2H L(HH $I)dNL1HH $H5)HH9HseJ;HH9wtHHEHtHUH@I9LBH[HHHJ2HHHBD0HHH9rH5)II9s HI@M&H\$HH[]A\A]A^A_1L%l)H=\)LHHtN 1 ALd$Luu@@u{HHttftH=)LgH誹Ht,L HT$H1IHHB:fH1$zfhSHHH;:j)H5)u*H@j)HH!uH1 )s)[ø[H[dÐAVHAUHATUSL5M)D-)1L%)H-)1HU)L)1Di)D )Li)HHw$ILw@HHHu@L5)D-w)L%P)H-)H)Lc)D4i)D 5)Li)u ) Ѓi)[]A\A]A^@L_HHHLwLGHHH,WDWHAHH,@DoHHHH_HHH3wHHHD3wHHHD3OHHHbD3OHHHBmDHoHHH$OLgHHH/ffffff.H=)H*)llHffff.AUATUSH1H H H=)H)ueHH)IgKH IHDÀ82)HIH)IHDÀ8)H5IHDÀ8){HEIHDÀ8)[HH)t 8hf)IIHDH)tHIH=Iv'IH1HHXHIr1WI襪H)Ht 8PuIHHHl$11HH~H=HT$H9E11Ʉ.uwHZI1HIH7H=wWHT$H9tM.u8HZI0I1HHM H=wH9\$t I MH= )Ht H)H)Ht>H55)Ht2;QtdHC81@HH8QtdtoHH9rH[]A\A]d)TDH)AI)B IIM MED%)9C_m)H[]A\A]@gI,H+7H HH)H8 fDH8t,HH9uIL+AL;A(sظf.1ffff.AWP@AVAUATUHSHH(HHT$HL$t `l;L)MAlE1IHfH;@H;H@uYIL+H4HH)H8 H8PHH>uLH+~H;~(sHPHUH@HUHP:}HPpHLRHPhHRHT$HDzw:LE1L,1C &HH4HfDHHHRIDBfEuHztRDJAAtCLZMLL9r4fEt LBMu L9t LBML9sHtL;_v D;:w@HtIM9t7HGH@HCIIM91GLH|$tHL$HH|$tHL$HH HRHL$HHMHU`d@Ht `l`MH([]A\A]A^A_HP`H|$HtHRzHkI<:1I9IfII9XAJƃ@wރtEBfEtDIJHI1H9rfEt MBMu H9t MBI40H9sHtH9JsE;:IGIJHzHEHE 1vH`)HHUc)St[49t_)[19uᐐATUSHHHJuhHł11MQЀ w{UH]0r@ w" HLJr@ v Ȁ.u5t$Hk11IPy7H[]A\ÃH) []A\H$@H܆I2M~?I?INƄHwH\$Hl$Ld$HHHIt UtY=k)h)m)H-n)L%)2LHHl$H$Ld$HnfDg)뱐1Sntel3)Genut!E11Ҹ()D %))[ÐineIu؋=))‰ )AA) A))tzzcAMDdAuthXentiLAp)A ])AE)C) E) AA/vGq)Aиf.ADH IIuH@It =)})St `l[fD1ntell)GenuineI=d)K)‰ :)AA') A))#cAMDuAuthuentit(E11Ҹ)D ))`l[@A)A )Ay)w)t })AиDAA/vC=)ZADH IIuH@It =)H)H)H\$Hl$HHHH?H6uHuH{Hl$H\$HjfH\$Hl$HÐH6H?MDH\$Hl$HH?Ht?GGu2Ho@HtHdH3,%0H~ZHH;zHH\$Hl$Hff.0@H\$Hl$Ld$H8HHH6ClzgHT$HHwuD$H\$ Hl$(Ld$0H8fDClHH,$2HtHH@HHEClHH$ HtHH@HHEHH뇃=)bg )Qff.AV1AUATUHSH=$)t5)  5) H[IHLdŘYII<$tGAD$AD$u6Mt$@MtIdL34%0LXLAI<$xI$IhMuHHm=)t Z) L)z []A\A]1A^ff.UHHAWAVAUATSHHH}HEHHpH}HEHuHUlCHxLXL`HEHEHE\HHHXH`LhLpKDmL2L)MIDI\Ƙo xHHHPLx H@(HC0HS(L{8HC@Mt5IdL3<%0LuWHAHC0HtdH3%0HHC0HhMt$CIPSuH{HnL{81He؉[A\A]A^A_Hx]H@HxH\$HH;H@HCHpLd$CCHCHC IHC(HI$ID$(ID$HAD$AD$ID$ID$ Lc(I(HhLPE1EAL}IA_D9GA9BL5)Mt2M'DMv0MtI6Lt/}Mv Mu@M(UDMIUADL}@MfA$:uAD$:uuH}mLeA^HMLHuDyE~][H}tHuL@D;mD9mD;}HhDH[(HH3LuE;CHEHhLsHC DHFHt0HV XHHBHt@HR XHHBHu^NHv(HuH}HMufDHI(Ht:AHQ HYBCRASA9ʼnQu9}HI(HɐufDMv(MHMUAŋYiHUA^LeDzE~]fH]HufH[(HH3LpuC;E9EEDA9xD;}} D9iMv(UDMbL}M(ML}MIG(HtAW9PvHxHpHExIG 1H}1HtH@ HHuH[Hf.ɉH9HHH9HzI9HHHH(fwHT$8D$4HHfD|$4:|$4uT$tJI1H9v*Hl$ H18Hu H@|HH9Iw)HT$ HB D$4D$4HĈ[]A\A]A^A_HHD$4HHD$4IHl$p1H9t@tH7LHt$"@HHH9rHrI9rHHHH(fvH9ÉMuOD$4PLHt$)HHH9RHrI92HHHH(fvH9ÉMuHH)HH9rvIvD$4I9Hl$pDHDDHH9vHvD$p(f&AIHcHt$ 'NH)IHDIH9R HHHt$HH.>L$4Ht$@HD$hH*HH)žHHH?HI)HT$ HB HBD$4H|$(1,$,$E1LL$@11H|$Pt$Ht$XT$(D$4HT$HL2LHt$D$4LHt$D$4|H|$8ttHD$8HD$4GAWHGhAVIHH8AUATUHSHHD$HFHt$LD$@LL$8$HT$PHD$ u'LL$HHhMI(LL$ tIdL3 %0LL$ 1H|$@HT$L:H|$8HD$XHT$hHDT$X$LL$HD$hMiHT$XMLT$LH9HL$0UIwI9"ALHD$AD$,f.HsI9HxHHH9uHH|$@IHT$Lb0Mt7fDI|$Ht!*I|$ILIHt$AT$Md$ MuHL$AAI9LT$H|$ IHD$`)D$E1$LL$8HHT$`Ht$PH|$HD\$T$ tJH9\$`yHL$ML9ALH9LL$HL$0HLD$,|$,tƒ|$,$MLT$L\$AD)IR >n H\$HH9Iv(HI? H9uHL$H)ٍLk 2BD$,D$,HĈ[]A\A]A^A_Í>с" AJ<AH9s!DA?ID M9FEAAĀtM9H|$XELT$XLD$,IzD$,uL\$I[ MAHcD~ILL$LLL$p{DD$pHH9v?AAȀEHwHT$@|$pDH)HH9M_D$,M9HT$p>@< HHw HH9wt$pL LRA7D$,I9HcI)MLLT$H)IABML\$LIHT$HAAItAAEc(QD$,D$pHT$pI.H >AA)ЃDHH9*H? LT$IB HABD$,6H|$ %D$$E1LL$811Ht$PH|$HD\$T$ D$,HL$@L9vHD$LD$,HD$@HkD lj;CD$,ƁLL$8HD$hHI>AL M9D :EAAĀA?HD H9wHtADAEt(H|$XtptlHL$XL:MD$,Hnu_H9w놉u!4D$,oHrHIH)L9sHtM97Hc LDH))D$,H)ID$p+>HI9v[:H? uA TkA-k 3CtD$,|$,`HT$HL$B"HL$HT$LLd$`Ht$0DAIA,LOM9LL$LN(H|$LH9uHl$0ƁRHPH9Hv8 Hu&Iсu&AH9D$,сuUAuUDuUAсuUA.uhuhAME1IJH9#IB€tuCg1HH :I9IH? :t+$I9Ht$0L\$0I9MHT$j>AN L9DD\$0AAÀD\$0HA?D I9wIt AAEt(SH|$XKEBLT$XHI7ƁHVH9I HH؉сu Aсu0AI9? сuAсuA1HHH9H€tAWHIHHhAVH8AUATIUSH^H|$hHt$0LD$HLL$@D$HD$PHT$XHD$8u"HhH@(HD$8tHdH3%0HD$8EH|$H3HT$0HHT$(HD$0H|$@HD$`HDŽ$LpH$HDD$`$HD$`tHT$0Lj AUfIHL$(AAHT$ HT$xH$NHBI9;H$I9 HH$HD$xHT$xI9uH$LH|$HI$HD$0Lh0Mt4DI}HtI}IHL$(IHt$ AUMm MuHT$0BBH9\$(sfHT$0H|$8HH$$E1$LL$@H$Ht$XH|$PL$HT$8At/H9$Du#HT$0HL$0HYHT$(tt݃uR$tHI1I9v+H|$0H10H_ H@t HI9IwD)HT$0HB HĨ[]A\A]A^A_Åt9t+tHHH< I9r*@3H$H?ʀH wH$HD$(IH$HD$xH$1H9sATHAUHH)HI9L9t$(L$HH$AHI9vHvދ$IL$HD$ HT$(H@2HHD$xH$1HPHH$L93IcEL)HL$xAeHL$(H)HD$0IXlH$IDM'I9# HH$HH|$`HD$0HX0HH;HL$`H$HSMLD$xHt$0H$H|$hHL$Iu\H[ HL$01HA HAH|$8T$D,$E1LL$@11Ht$XH|$PD$T$8YHT$xH$EHT$xH$HL$HHHL$HH HL$(HT$0HD$ L$HL$(Ht$ jIHD$xDHL$pMAƒ8HFI9HT$pI9w/HHT$pHD$xHt$xI9uELd$ s# t HHuH I9r0@2HD$pH?ɀH w{EHt$ HL$(H;L$pHT$ IpHD$0DhbH|$`tHD$0HX0HtfH;DT$HL$`HD$pHSMLD$xHt$0H$H|$hHL$IDT$uH[ 밃HL$xEHL$ [uHT$xEHT$ EHD$`HD$xH)HD$0XG t HHuHT$(HI9HL$(HD$xHL$(H?ʀHw@1HL$ H)HAMH˃H)IT$ ) AUH9D$ mHAUH$IHL$@H$HHHT$`HD$xHH|$`HD$0LALP0LHteH;L\$HL$`HD$xHSLL$ L$Ht$0H$H|$hHL$IL\$uH[ IH$H DIuH$HH$HT$`HHPHH$AWHIHHhAVH8AUATIUSH^H|$hHt$(LD$HLL$@D$HD$PHT$XHD$0u'HT$PHhHR(HT$0tHdH3%0HT$0EH|$HHT$(HHT$ H|$@HD$`H$HDD$`$HT$(HDŽ$LrHD$`tLj AUfMHT$ AAH\$ HT$xLL$I9tHfHJI9I9PH$HH$H\$xI9uLH|$HIHD$(Lh0MtGLt$8ALI}HtZI}IHL$ IHAUMm MuDLt$8HT$(BB(H9\$ s\HT$(H|$0HHD$x$E1$LL$@HHT$xHt$XH|$PD$T$0t.HT$xH9Ņu#HT$(HD$(HXHT$ tt݃uR$tHI1I9v+H|$(H10H_ H@t HI9IwD)HT$(HB HĨ[]A\A]A^A_ý=H|$`HD$(Hh0HH\$` Hm HnH}LT$HD$xHUMH\$L$IH$Ht$(H|$hULT$twH\$xH$HD$ IH$H$HL$x1H9sATHAUHH)HI9bL9t$ L$HHL$xAHI9vHvIL\$xHD$8$HT$ 1HHH$HD$xHHD$xL96IcUL)AeH)HT$(IH$ZHD$ `H$H\$xEt!HD$`HH$HH$H$HʉxH$H\$xnHT$HHHHT$@H$HJHD$HHHD$ cH)HIHT$(1HB HBgH|$0$D,$E1LL$@11Ht$XH|$PD$T$0-#HD$(X;=H|$`HT$(LALR0LHH;L\$HD$`HSLD$xLL$8IHt$(H|$hHD$H$H$L\$u0H[ HT$xIDM'I9j HHT$xHIHD$xDIuHD$xIC1HD$xHD$xHT$`HHHD$xHT$8AMH)HHʃH)ЋT$8IHD$x) AUH9D$8HAUHD$xIffff.AWIHH8HGhAVAUATUHSHxHT$XVHt$ LD$HLL$8$HD$PHD$(u'HD$PHhH@(HD$(tHdH3%0HD$(<H|$HH\$ L3H|$8HD$@HD$hHDD$@H\$ HD$hLkHD$@IH9HD$\IFI9yZH|$@HT$L@HHI9HH +HH9Չ uD$4HHH|$HI"HT$ Lb0Mt2I|$Htq I|$ILIHt$AT$Md$ MuHD$ @@L9HT$ H|$(HHD$` $E1H$LL$8HT$`Ht$XH|$PD$T$(HD$`H9HD$ L0PIH9HD$HLD$4@H|$@HL$LD$4H*fD҉HH9HXHI9rHHHQyH\$@HHD$4H|$4RD$4Hx[]A\A]A^A_HD$4\HT$LHHI9rHH xKHH9Չ uHT$LDHHI9rHH xHH9Չ uD$4HT$LD$4HD$HHCHT$8HHD$hH.H)HػHH?HI)[L$4HT$ HB HBD$4H|$( $$E1LL$811Ht$XH|$PD$T$(D$4HD$HL0nff.AWHGhIAVIHV8AUATUSHHT$`VHL$LD$HLL$@$HD$XHD$8u"HhH@(HD$8tHdH3%0HD$8H|$HM/IGH|$@HD$PHD$xHD$hHD$xHDD$P$HD$PtIG 0@@M&HD$hLHL$L)L)H9HOHpHHILHHt93H|$P!1DH HHH9wH9D$ID$ D$t#HH9D$҃H9D$T$ D$H|$HIo0Ht.@H}Ht H}ILILUHm HuAGAG4L9IH|$8HD$p$E1$LL$@HHT$pHt$`H|$XD$T$8tfHT$pH9M/AW@H|$PL1AHHH9wI@|$t|$ tP$tFI1H9T$v)H10I_ H@t HH9D$IwL$)IG D$ D$HĈ[]A\A]A^A_L1Lx#fDH HHH9yLD$ D$=LL1fDxH HHH9wHIH9L$v&Hw:9H@|HIHw!H9L$wHwD$ މ0(xPAUPAUPAUPAUI AWHT$PHlHT$@HD$xIHtH)I HT$HHD$D$ KIG HAGD$H|$8D$$E1LL$@1Ht$`H|$XT$1T$8D$IHD$HL(D$+,AWHIHHhAVH8AUATIUSH^H|$hHt$0LD$HLL$@D$HD$PHT$XHD$8u"HhH@(HD$8tHdH3%0HD$8EH|$H2HT$0HHT$ HD$0H|$@HD$`HDŽ$LpH$HDD$`$HD$`tHT$0Lj AUfIHL$ AAI9HT$(H$HL$xHt^fHrI9HKI9Y=(ffHL$xH$HHI9uLH|$HI9HD$0Lh0Mt3@I}Ht2I}IHL$ IHt$(AUMm MuHT$0BBWH9\$ s\HT$0H|$8HHD$x$E1$LL$@HT$xHt$XH|$PL$HT$8t.HT$xH9Ņu#HD$0HT$0HZHD$ tt݃uR$tHI1I9v+H|$0H10H_ H@t HI9IwD)HT$0HB HĨ[]A\A]A^A_H|$`t E=H|$`tHD$0Hh0HH\$` Hm HH}HL$xHUMH\$L$Ht$0H $H|$hIUtH\$xH$HT$`H$HHHD$ IH$H$HL$x1H9sATHAUHH)HI9HT$ HI9L$1HHL$xA4HI9vHvILT$xHD$($=({HL$ H$ffIB1HD$xL95IcUL)AeH)HT$0IH$ZHD$ "H$H\$xEt5HD$`HH$HvH$HbH$XH$H\$xFHL$@H$HHH)HIHL$01HA HAIH|$8[$D,$E1LL$@11Ht$XH|$PD$T$8HL$HH HL$ HL$HHHD$0XH|$`JAHL$`IB1HD$xHv=]H|$`HT$0LALZ0LHH;LT$~HL$`H$HSLL$(LD$xHt$0H$H|$hHL$ILT$u0H[ HT$xIDM'L9 HHT$xHIHD$xDIuiHD$xHL$(H)HAMHʃH)ЋT$(IHD$x) AUH9D$(HAUHD$xI߽rHD$xHT$`HHHD$x#ffff.AWIHH8HGhAVAUATUHSHHT$XVHt$ LD$HLL$@$HD$PHD$(u'HD$PHhH@(HD$(tHdH3%0HD$(H|$H:H\$ L3H|$@HD$8HD$hHDD$8$H\$ HD$hLkHD$8tHs IH9H\$HHH9IFI9*H|$8HLHt$)fHJH9eHCI9@HHf(fɉ HH9uD$7D$0H|$HIHD$ L`0Mt2I|$HtI|$ILIHt$AT$Md$ MuHT$ BB I9&HT$ H|$(HHD$`L$E1H$LL$@HT$`Ht$XH|$PD$T$(HD$`H9IHD$ H9L0PH\$wLHD$7D$0H|$8LHT$0f.HNH9HPI9HHHH f(fH9 uHHrD|$0B|$7tT$tJI1H9v*H|$ H10H_ H@t HH9Iw)HT$ HB D$0D$0HĈ[]A\A]A^A_HHD$7D$0HHD$7D$0IH|$p1H9s"\HD$7D$0HH)HH9@I^D$0I9^H|$pDHDHH9vHvD$pf(fAIHcH\$ &H)ЋSI\LHT$(fHNH9HPI9HHHH f(fH9 u+LHT$/fHNH9HPI9HHHH f(fH9 uHD$8H5HDI/H9HHHT$ HB HBD$0H|$($$E1LL$@11Ht$XH|$PD$T$(D$0HD$HL0LHT$D$7D$0L$0D$7#HH\$@HD$hHH)HػHH?HI)+HT$HH?LHT$D$7D$09H|$8ttHD$8HD$0ffffff.AWHGhIAVIHV8AUATUSHHD$`FHL$@LD$PLL$H$HT$hHD$8u'HT$`HhHR(HT$8tHdH3%0HT$8H|$PM/IWH|$HHD$XHD$xHT$0HT$xHDT$X$HT$XtIW 2@M&HT$0LHL$@L)L)H9HOHrHHILHHt;4H|$X 1fDȅxHHHH9wH9T$@ID$ D$t#HCH9D$0҃H9D$0T$ D$H|$PIo0Ht,fH}Ht"H}ILILUHm HuAGAG7L9IH|$8HD$p$E1$LL$HHHT$pHt$hH|$`D$T$8tfHT$pH9yM/AG@H|$XL1AȅHHH9wIf|$t|$ tP$tFI1H9T$@v)H10I_ H@t HH9D$@IwL$@)IG D$ D$HĈ[]A\A]A^A_LL1@ȅ/HHHH9wLL1@ȅHHHH9wHIH9L$@v&HwO9H@|HIHw6H9L$@wHw)D$ މ2:ID$ D$zBAEBAEBAEBAEI"AGHD$XHkHT$HHD$xIHqH)IHT$PHHT$PL*BLD$ D$)IG HAGD$pH|$8H$$E1LL$H11Ht$hH|$`D$T$8D$5D$D$ %D$H)HIDAWHGhIAVIHV8AUATUSHFHL$@LD$PLL$h$HD$XHT$`HD$Hu"HhH@(HD$HtHdH3%0HD$HH|$PI/IWHT$8$IO uHIH9T$@v.H&2H@tHIH H9T$@wHD$ ÉD$HĈ[]A\A]A^A_L,K,Nl-H9D$@ID$ D$t#IEH9D$8҃H9D$8T$ D$H|$PI_0Ht/DH{HtRH{MHILSH[ HuAGAGgL9IH|$HHD$x $E1$LL$hLHT$xHt$`H|$XD$T$HtvHT$xL9 I/M&HD$8IHT$@H)L)H9HOHHHHI1LHHAȉDHH9w|$t|$ s$dI611H9t$@Hv&H|$@IO H\HH9IwL$@)IG D$ AEAEAEAEH! L)IM/^D$D$ MHT$PL*HD$PH(3IG HAGD$H|$Hd$$E1LL$h1Ht$`H|$XT$1T$HD$XAWHGhIAVAUATUSHHV8HFHL$@LD$PLL$h$HD$XHT$`HD$Hu"HhH@(HD$HtHdH3%0HD$HH|$PM/$IWHT$8tIO 1@DL#HD$8LHT$@L)LL)H9HOHPHHIHIHIHD$@H;D$ D$t#IFH9D$8҃H9D$8T$ D$H|$PIo0Ht-H}HtH}MLHLUHm HuAGAGjM9spIH|$HHD$x$E1$LL$hLHT$xHt$`H|$XD$T$Ht"HT$xL9M/@|$t|$ tT$tIH;11H9|$@Hv'Hl$@0IO H@tHH9HwL$@)IG D$ D$HĈ[]A\A]A^A_HHH9T$@v&Hw7:H@|HHHwH9T$@wHwD$ Ɖ1AAEAAEAAEAAEI!L)HM7D$D$ HT$PL2@HD$PL(pIG HAGD$H|$H$,$E1LL$h1Ht$`H|$XT$1T$HD$Ha)H=a)tJfffff.UHH]LeHLmLuIL}H@I薑LHE芑HULpLIDHH)Ld$ILLLHDLl HHHtlHBLb HCHC0HC`HC(HB(Lc8HC@1Mt5IdL3$%0LHAHS0HtdH3%0HHS0H]LeLmLuL}f.H\$Hl$IHzHH+k)tH$H$HĨ11ItHƿ8Ht$0HE11AعH5(`)UHH`)HcH=_)?$ upWH_)H9s`WH9vWOftNHH9rBW H9v9W H9r01H=_)vHH_)Hc=_)tsKHy_)H^_)H=W_)9HH@_)tH?_)1H4(H)?HsH_)HH9sH_)H5_)T^)AWAVAUATUSHHxH^)H|$0HT$XHL$HDD$THD$(H|$(~HT$(HJ DrDjIfL$fInHD$(1Lt$H\$ MD`AAt$H Z^)Dd$HL$@1DzHT$(B)L$HE?AuHI46HT$HHHHHOHA|$H@HI<>HTA$HBUIBHB`IHB ?AD$ILA>HL$H1Hf.Hx[]A\A]A^A_ÐAL$Lt$HTIHL$ HL$(A HH;D$@vHx[]A\A]A^A_L=[)H|$0AGEgIO$'HD$kAo1҉Lt$huH [)l$HL$@1AG)AՉL$*IHT$IW ?Bt LI46A$Ih9|1#A|$HI<>ѧA}HI<>軧eHD$BD$tHHBDH9\$ 1HL$(Q LdL%Y)A$f6ЃHcHkBT"H9vH@MdDB| LI<>HL$(H\$H/Bf.AWAVAUATIUSH8H +Y)Ht$HT$ HDqDiH $N41N,)%iH $1҉i}1ADzHX))‰T$AIL1ftA9D$v#LT$I46H $kT$H $t=DDD)9w)fHt$LkHT$ 1H8[]A\A]A^A_IH|$fL$.H ;X)DqDiH $N41N,)HhH $1҉i}1ADzHX))‰T$B;fDIL1f]9D$v%H|$T$I46H $kT$H $tDDD)9w)@QD$.)HT$ H81[]A\A]A^A_ÐSHu7H;xW)t>CPw!CuH{Ht HC[Åt[f.k[f.H=!W)H=W)CNUC lSHH|$H|$LHtH;#HHCIH HHCtyH{IH{HC IHC(HCdH3%0HHCHC HtdH3%0HHC HC(HtdH3%0HHC(CH_1H6H?hAWIAVAUATUSH(|$"AE1A1iIcHlHD$HH$H$HvIH\HE~EtI7H|$hDEA .AAAtD9l$uIHcT$HD$HEI{JHgtJHgu{JH(H[]A\A]A^A_HH.HHtI7H(H[]A\A]A^A_HHAE1A1@AtLH H$HHL$΃HIcH$vIHL$H\HE~ Eu&fDA AAHI7HfH$DEH .HH|$tgHA1E@HcL,liIHIeHx=LeA ;HxsAt9l$uM/HcD$HA1DAItHcM/iIHIeHx=LpeA ;Hx~6UHLeLcH]LmLuAL}H0I HH=h@Ht @lM|$HN4lLqeu5Pl@Ht@lQN4lLH]LeLmLuL}ÿIHEHEkHt 801A-N4IE1HPMt7HuH}HPDHI"x0t@0HPH{JtH8HHPHPDHHMtJ IN<倄lHtLPJ<lI9tH{Jt9N,lH=(H9tH{Jt9H([)Pl@Ht @lH}r9LPfDtHcȃ HP~;HcH A LP@LcHuH}K ZHJx0t@0NPI{JJlLHH%cHCJPA݉ÃmAfDLuL}Ⱦ:HLL轑u:`ILLPl@Hr@lE13@Lp6HJPt)CXN4lJP{Jt׉D Dcu;@E1DPl@Ht @lH}7fDAtHcHPH{JtH;<ltQ7A ufHPH{Jt+7HDžPLHIEAE1AAAtIcH<ݠIHtH݀lH IHtLPH<lI9tH{Jt6L<lA ~H=(I9tH{Jtj6L5(X)1HHHHHAHHH)H|$H:Iľ=L`HI3L)HtsH HW IL'`tw(IL `Pl@Ht @lHE1dIL_1҅tIL_uI}HcҾ;HP_HtfL` ILk_t ILP_t 0IL5_) |1 tHcH9PuI;H uC IL^ IL^HHgH 4H u$ ;ILc^W Hu$HIL9^- HWIL ^ RE1H L*f<_t.<-t*<.t&<,ft <:tMtA>u=I{JMcI{JJI@HLeH]LmLuL}L_(.{JLz\tJLi\tHu!LD=HHuM7A`IL>HIL1HLMcHHAHHH)H|$7H蓷HMHUHuLMLEHJAHEEiINlLMLELDHHD$HELIIL]D$ LT$LUHD$HEH$DHHLUL]AzLj1MH}I}LH}HtpI:[u AE4LAE0FLAE07IaHIt8u9IciIHIcaHIt8uILaIIIDHUHUJ&1HpHIt\HpH~FIIHLDH(L0HH(L0HNH)H8dA>E1Dž8IcfH31HHHHQIcDvIAHD$HH)iILd$IHILH8ƫ/SYS@_HxH8IV1L1UALƿADž8E1UHAWAVAUATSHHH L%A)MuT@LHStM$$Mt8Ml$I9uHL(HcIDHe[A\A]A^A_f.HSHtL`@<@tH=@)OH@)HHHHoHt14HH9wHɉALE1ҋGOA̓HHLILH1HHJLIIHvL<HLtfDMM9IIA6IVAFL9uՉHHHHLWRHHLuBCHD g?)H1 tHcЋt\D3E9HHۃ HH~xHIHH8%HIEiH?)A1IEL-u?) AtLcLHHH3HKDtIU@@0HA ~IEHHHcIDgLL)1DHe1[A\A]A^A_þ@L*ILHM)L4HItLLH,nu C|5H1LHHHHLHLH)LIIIIDHH)L|$ILLqLLHL\HLH誫L%11IH=)lAlƿL-X=)E11EL1HHP@Hk HHJ$R HklHHH9HL‹QQH9HLI9r3IcHD-~<)H5k<)L$1LH1Ic1cH(HưHJ@HB@HH d(HPHHZ(H@HdH>lHI(tDHdHHdHHdHÐHdH8t dH%H¨dHHHRXHdHfHdH8t dH%H¨dHHHRHHdHfHdH8t dH%H¨dHHHR@HdHאAE111Hl$HH\$Ld$HEHt t[1HHl$H$Ld$HH}HIċEtqMtH}H1}HDH}HdHЃHHlEkH}H18HdDMtPf=E4)H]"H}HHE $ŨJ1I91I91I91I91I9LH)J!L1HHL1HHHIw1I9jUHSHHv8HH{ tYH} H}8t>Ku'H3H}KuHsH}KuE+CH[]H}8f.Hs8f.UHAWAVAUATISHD_H}HuMLxEHEHXHH{`Dk(LgLEGDKX1҉DShAAqA1EuEȉA)D)LeHK`AEHuf.{=DHHC00;urSH3N@ȉH}HƉHHXDPGJHHXDPCA4E9ADBDD@ȉHbDHHC00fDDHHC00뷐@@DLeDpHEI1H]IM9HUDBL*HZ0EuQM9M|O4'H}IBtIt5FxօMfM9MHEHHC8HȉɃL4 HEfDHEHHC8DpN42HEfD F4)H;4)HHEHdHHHHE~DmHpE1LuDpH]HMh@Ht HߪHKxHHMjH{pHIH`IDlH]HpL|IMI?HIEuDlH`MPl@HVHE=4:)t5"3) 53)H2)Lu1H 2)LmL}HHEpH=&3)iHcH52)HH3)HH 2)HHPH2)HH~2)HEHH g2)HvHUHULDI|$HuMLLuRH 2) Ht.Ha2)YH=I2)HH?2)H1)H1)=8)t 1) 1) IJIHIt 8w1)4=o8)t ^1) P1)~ E1HUH/1)HuHH)HHIL$HH)H1)HHHUH0)H0)=7)t 0)4 0)& ID$HDlH`HuHpHHkHIAH}HCp.HHE'HkEHuH}LE1ɺgKII4$HuID$HJHAHPHp   1f t t t HLuHBHHH)L|$IL褘1HEf/HHuH+EH)HH)HELD$ILt+HuH HHHuH1L@/HHuL)AH!HH)Ht$HHt H xHIAHuHIT$LxID$HCx>H1LHHHHHHzHIHHt LH蠛L=Y.)HspHp/HHHTRANSLIT/HPH /HH=/H1t'Pl@Ht H胨H}E1-ID$I=4)t5-) 5-)I|$tY=4)t p-) b-)ID$uPl@HtHI1OD{@HID$ID${AUATIUSHN$#HLoII;HŸHHCfDHt+1H=HxL9rHH[]A\A]fHHH[]A\A]ffffff.UHAWAVAUATSHHHXHxH8TLHDdA >A4 f@Ht@lr`lhHXdHXHD(HxHEωMHUHXHEHIYHPHLHH)H|$HȘHH0HEt lޟH}ClH@Pl@Ht lH@tH@HP;4)wHL-4)dM퉅HX@1MmMIuHy<uMIUHp:/H׻XL` @Hd8"wHHH\ JD#HHHH)dLt$IL~HtI]1LLp|;Hxf/H[;HcdJDiIZBHIIHt 8 dHHX(XLH(XH(LHD#HH)HL$HHHh:f/H(HxHX_H.moWHHH)Ld$ID<:LA$CAD$A$:1uAD$:1L濙JHhHpLLHItHxLEȹLHHfHHSH@IiH@H 2)PHULx Lp(HP0DTHEdPl@Ht@l`l٢LxfHxHe[A\A]A^A_f.Pl@Ht@l蜢`l蒢Hd DTEtHHtH8Hx@tHH<:uD5(EY/L[9HC<:"HI HH E1HxAIcI| Ht-LEȹHL[HtMcH O| 4H d:/P:/HDE1HDžp0JDTEu.HX(Pl@Ht@l"`lHxHtH=H=n)HBHHH?HHgH5@)H9L )H 1)L H)H )H= )H5 )H=)Cc IH@@HdHIH@@HdHIH@@HdHA$IH@@HdHH  )IE1I)LH H ])HL; #H7HwIHfff.U1SHH=)t5 ) 5 )H )H$HH=o(t}HD<:HufH<:tHHuft H<:uHH9r tRH)H(rHoH=(u1҃=")t )uq )ugHH[]H(H5#)ACHH!HP먐H6H?H=~ )HHĀH=_ )H胵HĀzATHUHSHL1A1@0@AHt҃0 DCHH9wEu|HcHtcEHu|HtS1LvL wDA HHH9v) ADpu0 wHHH9w[]A\@HcAyisoHxuAWAVAUATUSHxH|$8LHt$PHT$HL$,LD$0LL$@7HËD$,L$D$Xq1T$,T$d>E1L$,L$h E1D$,D$lE1L;7HL$HHTH1LLLH<HHHT$HHt$PHuHt$H:HJJHD$HH|/Ht$0H|$X;t$dL$hT$lHx/LxHT$8L"Mt3LE1DH}HtHf| IHmHuH|$PHt$HQHT$,L$,⪪UU ʁ33ʉѺHcHH<(HHIHt$HH|$PH]GHDMAVIFCID$IFMt$Ht$HH|$PGDl$,AHDEl$,E1ED$,Hl$XЉD$,HD$PHD$HHDADl$,u1H|$HtH@H9s1HHXH9vHtH4H$HPLL$@H$LD$0HH|$8L|$HL$H$HD$H $DKD IHuH\$PDHl$XKD HxH[]A\A]A^A_H$c4Lpf.H$C4Lhf.H$#4L`f.H|$@4Hh~DHi@H$Hx0.H$Hx.H$Hxl_Ht$@HxOfD$,1҃HL$8HIFL1AWAVAUATUSHxH|$8LHt$PHT$HL$,LD$0LL$@ 3HËD$,L$D$l1T$,T$h^E1L$,L$d*E1D$,D$XE1L2HL$HHTH1LLLH<:HHHT$HHt$PH\qHt$H:HEHD$HH|/Ht$0HDd$lEaD\$hE3DT$dEDL$XEHx/LE1HT$8H*H\@H}HtH'~IHmHuD$E[H|$PHt$HCT$,L$,⪪UU ʁ33ʉѺHcHH<(HHIHt$HH|$PH'CHXMAVIFWID$IFMt$Ht$HH|$PBDl$,AHDEl$,D$,E1ED$,HD$PHD$HHl$XHfADl$,u1H|$HtH@H9s1HQHXH9vHtHC0H$HPLL$@H$LD$0HH|$8L|$HL$H$HD$H $D*KD IHuH\$PDHl$XKD HxH[]A\A]A^A_H$/Lpf.H$/Lhf.H$s/L`f.H|$@V/Hh^DH i1}@H$Hx.H$Hx.H$Hx_Ht$@Hxf.D$,1҃HL$8HIFL1IATUSH HHIIH><_<@<.HfDt<@ft<.t H<_uH9߉t1<@tN1<_@!@.t[@@t3HHt 8DIHt 8DH []A\fHCH{EH{I8s@@$@Hu t H<@uH9mHHT$HL$H)L$LL$bLL$HIHT$HL$L$II8HHT$HL$L$OHT$HL$L$3fDHH<.u<@tTH<.tu@1HT$HL$L$1qHT$H0HL$L$wƽkHcL$3HT$HL$L$EiATHUSHhtHttmH[]A\HoHt&EHHkHt&E HrHkHtEtOtqHKH[]A\?I|$.I|$$I|$LLeMt'A$LLeMtA$t*tt*LffI|$I|$I|$L2DH}wH}nLeMA$tZtKtZLFH>fI|$&I|$I|$#DI|$I|$I|$H}H}H}LeMA$xez@g[]A\AVAUIATAAUSx9IcL4HHTDMuzf.H HHtdy HHt8Eix%IcITHAHAH\tIc1[]A\A]A^ExIcMtI\(ft;t+LAxL3HMtAuI~I~I~wDUE1AHAWADAVAAUATLSH MH8HHDžJFfD MIH9I'IM'I)􉍨DII'LLGI\$KHHD%HH)Ll$ILO|ufLHLK\eLfMFDKDEH9O$McC J=tC>w Hc J45wHc6@J9C @JLcʸG JD)Ѓ HI@McJML)I)LMd$HBC JHJ475DJHMLQD6JAA=u fL9tkHIHJ=t5wHf@JuDJA|DtAHIDžI$SfHe[A\A]A^A_@AkDDž$ՀJHcf;6@JD6JIT$I$At$HUHUHELLDLLD2fHH2@uc@H2@tS@ t@ t@|@HzHHHn11|bH1H1W AIHɸEII$@$JI$HUHE11111LLD`HLLDI$HPID$IT$I$HUHEHU?IT$I$HUHEHUIT$It$I$HuHUHEHUI$HSHHVCDHK98HW7HH!HH?=uHH!HWH 1?=uHH!HH HH!HHHH!HHcHH!HH=?=,HH!HWH  ?=HH!HHQHcҍq@ w!HH40HcHrq@ vHHHH!HHqR1KHH!HWH 9HH!HWH AUATIUHSHH(H¾JʾJHIHMHX @ ttHHdHdH9@HtMHtnDJ u0< w7Ht$ HH;\$tIHEHL,$t!fDI$JHEH([]A\A]HD$I$HHP@HdHx1'@HHHt H1HH1HuÐ|$D$f?f% f|$l$ÐHHdH3%0HHGLgLoLw L(HT$dH3%0HHW0H$dH3%0HHG8 SHu11S@[HWH11{uډS@1[ÐAWAVAUMATUSHHhHH|$PHT$KHHHT$XJHHD$PHT$`Ht$L|$HHD$`HD$ HD$HHD$hHT$Ht$PIHL$@Ht$HHt$8Ht$HHt$(HH)Ht$HD$0HD$8H+D$ 1Ht$Ld$ LHt$ HHD$ILӅyLLH|$8ӅLt$ Hl$8Lt$LfDLLLӅy @LLHLӅxI9-H|$HL IFH9rH|$HL$(11fAoHoLfA fDHH9wHt$H9t$HT$HD$HL$0IHDt!28@:H@0HHuM9(I9MDLt$LI9HH+D$ H9D$XpHD$8Lt$ L)H9D$Xr!Hl$@HD$@HT$@HHRHD$ HT$8HL$H9L$@A$Hh[]A\A]A^A_HHt$HHt$HLd$PLd$XL;d$HL|$PLGd$HL|$Ht$M9M47Hl$PML|$MIHHLLAՅIHIM9sH;l$PLHD$ML|$M4H%HD$PH HEH9D$PHL$HHHH0H|$P11oDHo fLfHH9wHL$HT$HHD$PH)M4HH9t$M0@uHHHuHt$M47Hl$HHMHL$L;t$HMM$.@ILLLӅxLd$M9?Lt$IvI9wH|$I<>I9DHHHv @HH(HI9vHHHDI9vl@Lt$Nt5LHH+D$ H9D$XHT$8L)H9T$XH9~}HL$@Ht$ Lt$ H1HiHHL$@Lt$4HEI9HL$HLD0:@8H@2HHuM9IHD$@HT$8L0HPHHD$@Hl$8 HT$I|H|$\HD$ L LID$H9D$ *H|$HL$ Ht$(11AoHo fA fHH9wHD$ Ht$HD$H9t$HT$HL$0I28@:H@0HHuH|$Mt$@@bHD$8L RL9t$85H|$GHL$8Ht$(11AoHo fA fHH9wHD$8Ht$HD$H9t$HT$HL$0It28@:H@0HHuLHt$ LӅ)HD$ L #@L9t$ H|$HL$ 11AoHo fA fHH9T$(wHD$ Ht$HD$H9t$HT$HL$0I28@:H@0HHuHD$8HI9HT$8HL$L0:@8H@2HHuHD$ HI9HT$ HL$L0:@8H@2HHuHD$ HI9HT$ HL$L0:@8H@2HHuHD$PHH9HD$PHT$M0@uHHHuHD$M4QHLHL$UHD$PHT$HD$8LHL$HD$ LHL$7HD$ LHL$H\$Ld$L|$Hl$ILl$Lt$H8HW(IHu'1H\$Hl$Ld$Ll$ Lt$(L|$0H8fA?tAtSH+E/ILpHtfD;muH}LLBuB|%=tfHH+HuHAHiҀ=f;u #f;tHHHuCf.H2JD5!H1=~(t5\(d 5M(UH=0(H;=I(t?H(==(t (C (51HfHt6H(fAUATUSHHH?=HHH1=(t5( 5t(L-W(Mt/MeMt&HHLuA<,=tHIMeMuڃ=D(t #( (zH1[]A\A]f.LDHHHHPuyHdH[]A\A]fUHAWAVIAUATISH8HuȉMH}HHEtH}HHE1=|(t5Z( 5K(H .(E1HtRL)MtBHLLHM^HMuA|=tHIL)MuHt H9rJ4H=(HIMtzJN4H5(H;5(t HLPKDL-{(L-(=(t t( f( 1He[A\A]A^A_HEHLHAHAAHH)Lt$IHLLHMDEJK=HUHxHuMd9PX@lLgHHMDEt[HHI$EHHM赻HI$HMtjLHHOM4$X@lLDI$LHMHMLHMQE1HIHM=7(t ( (M4$sHHMHMHHME1HIHM=(t ( (}H=('L}MtL1HEL|IIGAHH)Ll$IHLLHMDEJ=HUHxHu\NX@lLHHMDEt L0MsEMt2LHMݹHIHMLLHHMMHMX@lLHMaHMH\$Hl$HLd$HHHAt??t:=8Hu+DHHHl$H$1Ld$HifHdH$Hl$Ld$HH=(HWHĀH=(HȊHĀH=(HHĀ'H=(H芊HĀgH=o(HۈHĀH=P(HLHĀH=1(H-HĀH=(HHĀde(t1KH1dLfffff.HdLAWAVAUATUSHH(I@Ht$E1E1$MHhIHADI tIAEHADI u|<-@<+D$m@0> 5B1E1H@L@I`ID$oM9fHMLE11LcHL$NЀ vJHt(1A84$tE D: u HH9wH9SIHh@DqIHx 79I9L9IHH7@I9mH|$tHT$H:EcL$HHڅHEH([]A\A]A^A_DHd1H([]A\A]A^A_M. 1E1IAufD9t$EfDHA7@DI9D1H|$tLH)H~IUI@xIM1MhEPA}0uH1Hd"HA@JJLE tzt5tNfDH1HHHAHuHfHHHHAu@HHHHAu@HfDHHHHHHH)HA8H׈uHDATUSHH Hl$ IHHT$ H9III)I IHPH9vnLHHHH11oHfHH9wHI9H;tDH HH9wL)J\# H H[]A\fHSH9wHDH HH9wH말H\$HHl$Ld$Ll$H(Lc(Hs HEA)u4L;c0spA,$I@Lc(H\$Hl$Ld$Ll$ H(DHMcLP8HPIĸHwH{ LL)J4'I1Lc(Lc(@HHl$H\$Ld$Ll$ H(3fH\$Hl$HLd$Ll$HH!TLJCtHH$ H H$( H$ H$0 DŽ$ E1DŽ$ HDŽ$ $t HDŽ$ JŸ@HAE HDŽ$!P@H$!f;xJHdL%L9Bt01=[(t 2rS 2gSHLBBH$ L$( A)E~HIcHP8A9ŸEf;xHBBtxEt!H$!1xfH$(!H$0!L$8!L$@!HH!H$!HھP@KxfDHB=a(t R R_UHAWIAVAUATISHHHHujA $AƍA<}vHeH[A\A]A^A_fHUHވMH)HBHH)Ll$IL;I9H]MsIcII|HHufI9sHD1HH@3A $xttAIHHI9ňr.fI9rfDAL$mDUHAWAVAUATISHJHHHU.IH{L,AkMAWLH)HHBAHH)Ld$IHLg:H]IIM9w_APЀ w{H¨dHHHT@HHUH)HHUtLLHuIM9vEuL;HeH[A\A]A^A_fMu H`<,HUt<.HUuHH1HHH) H  Hu$HHUHUHHUE1}HIHU]HMH}DHEHHM9HHMufE.H}HDHE9HYfE,Nffff.UHH]LmHLuL}ILeHIIdALJD#AMAIE%LHIEHIEHaGfEHDžxz@H#HDžP@HDžfExJHdL%L9Bt01=(t 2CN 28NHLBBLHLHM)LP8I9AHDžHDžH貵H覵f;x8HBBu$HB=M(t M Mt%H1@sfD`ADH]LeLmLuL}dAALLHADdA fDIDHE):HHPLƅHDžIHH DžHDžhHDž(HDžHI~.DHEvDD ZwAƃ H JH JHƅ@ DžDžDž|DžHDžDž\DžlDžDž8Dž`Dž0Dž<HDžHHHMdHHHEAUHHHH)LD$I/h+IEAU0LHL^5HILG|)`u=~9HcѾ H߉¸D)L9GF$"HLLHP8I9ƋGIcԸH)I9oGD`t*~&HcѾ H&¸D)99GF$"HH@HHHH%BHH+IHHHHHP8HH9!IcԸH)H9!D+EA>f"h5HHHMdHHHEHHHH)HchLD$IHkHHH1HHpHcF0H48LHLP3HILEd$)u=~9HcѾ H߉}¸D)L9EF$"HLLHP8I9ƋeEIcԸH)I9QED$t*~&HcѾ H}¸D)9EF$"HLHIvIV HHH)P8IN IvHH)H9IcH)H9h)F$!HchH9u HkHLIAF щ։‰׉‰Ɖщ‰҉ $׃AN ։AVA64ANdAVAV,t#HpHcH2҉dAVCAF(t!HpHH8ABd9M(J HcHE?HHcHDžHH)HL$HHD HLg(MtaLK<tRI~81HHH)HT$HAF0HHpHH9rLHCȃ 6HHA DHp1HDžHDžMHLHL!I8HHMHHIM,HHMLw^Mm HHLA}I9MLwO,$Ie8IEOd%HH)HL$HJ)I9MDHHLHH:L葨H&HC(H;C0o/%HHC(A LchAMkHL0HH Ȉ HC(H;C0i6.HHC(A Ic>HA 1DDH0HC(H;C0 5HHC(A; HAH9wAvt*HC(H;C0 3@0HHC(AAD)A9G$ HchHkHHH/Hc@0HpHL0MC/ƅxDžE1DžDž $Ctt )HchLHkHI*/4W(IcF0HpHH8IcHHDž4IM(4'(S(V'HdHHHcL觡E1IDdA) uaEt\IcҾ H߉LDDn¸D)LD9D!F$"HL‰LDLDHP8LDDL9IcԸH)I9Ãt2Et-IcҾ H>n¸DD)9}F$"E'LchMkHL 4du*~&Hc׾ Hm¸D)9F$"HchHkHHH3HHpHcB0H4HC(H;C03@0HHC(AALG:Hc Hm¸D)9`F$"L`@0DHH@ Ȉ HDž(IEHPIUAU/wlIEAUHfD AH7AH'IEHPIU ڃ dAVAF DžIEHPIU듾#H 5+HLL+H߉w HLLNIEHPIUDAU/w:IEAUHIEHPIUIEHPIU0鰸IEHPIUMLDqHcpM)I)nHH|HHHcHHH)H|$HI>Hc HZ(HLTHL-H߉a6dA"A)HHΌHHHZHHHHHHbIEHPIUu$AU/w@IEAUHE1D :AU/w*IEAUHE1fD IEHPIUIEHPIUH:H.*HĀ~H:H+HĀ[H:H)HĀ魱H:Hm+HĀ91ɍP}w/DD9v#Hx<tD)DŽuލG1AÐUSLHAB0t Az,f$LK MHSI9HCH{HL1HHS HKHsH)HHSHH.tHH{HBH<uZH f.H4HHHHHuHCHCH[0]H{1 H]HtHSHKHHHSH[0]HSH{ HHHH+HH[0]ÐAR(BAB(0H[]ÐHCmUHAWAVAUATISHJHHHUL.IH+ML,AMMAWLH)HHBAHH)Ld$IHLH]IIM9w_APЀ w{H¨dHHHT@HHUCH)HHUtLLHuIM9vEuLdHeH[A\A]A^A_fMu H`<,HUt<.HUuHH1HHH) H  Hu$HHUhHUHHUE1-VHIHU]HMH}DHEHHMyHHMufE.H}HDHERHYfE,Nffff.UHAWAVAUATISHHEEN \HdH6H6H~@H@D~Xs @@HǸdH?H?Lo`A}@}D\EHdH H I`HDž0ɉ<-%E1@Dž<fDH@xf(xBhHhH8HEdHH,#HcS8JA(JPhJ%4JHELEEDs@AAEA1҅IC @\I$1HH"Hx H;x("7@HHx @I$1H"Hx H;x(s"7@HHx @I$DjqHo"HP H;P(a"2HHP A1fDE1Dž<HDž0@6H@x(<$۽rxۭ}EBfDHƸdH6H6H~PH@?uHdH?H?H@H@DEHdH6H6D~Xf.f(@xxfWf.9<$@x۽9xۭHEdHHJ$HcSHJA,JPXJ%0JHELEWfHdH?H?LoP3f@PB9AMID$(II9D$0#HID$(ID$(I9D$0AM#HID$(ID$(I;D$0AM"HID$(DjEHeD[A\A]A^A_þ-L牕H5H%DAHdHHH@HDž<H0H08E1@H`LuHM̾HHLH(<$VHxD@EHE1)ʃ?HcHHH)H|$H)HL$H)HT$HHHpHHhH`hA?LxLHx/DV?MAHHcHHHLu݋UDJ?HHcN LxAA?~3AH?EHpDH1AIcHHH9LUA E1L DIMAX7KDžPEDLYINIHhHH4 (KHHH;xb,HU EIANAL 9HtIFIH`HhH ((KL@VIVHUHJHHHDDH`LuHMf(HHHLH(zHxD@D\EPɸD<<HdH H HIXDž<H0vHdH H HDž0ɉ<< D\EGMcƾ LLHLf,HLL9?EDLD ?)B?HHcH<HpHxDUDJ?HHcHxHHxtHpHxHыEHhHpHHzH@HhH`HHMHUH`HDAAA?A)ĸ PPD\EI$HHp H;p(-HHp D\EI$HHp H;p(}+HHp 뱐HxA Le~HxHpHxEHH{dH HSHc e f EDuE } Dž(UHcljPHHDžC EPE1MHDžDžt3(LDhHcHDHH?H9hHcPH9THL4IIDžIL)H|$HHLDUIEt }fD(1LDžELDMHD(LLHLAfDAMHE9鋅(MLDHLIL(DE"C uP Hx D9AHE11҅ L(LIDLAHDEDfAAIB4;A9|D9P~=Hx~&LH0AuEuP뷐HpH8uDALLL(DLHLHDPHxHD 4HxLD5CMqHAD9J9AE1 D9u0HA0D9uD;uE~ ADPA9V0A9PAx0I@u I9uC uE9xMHt MMt" EfDmE#A}IAIq҃-M  <9~AgfffA)׉0EH щU˃0LNE̅Gs Lɋ L)HHPH)׃ s0D\ECLcLLL$LL9ED D\E6 I$HHP H;P(y-HHP C A ua ~W{0uQ\Hc 0LLHH $HLH9.D \1HDžHDžHC cHHD\EHPLPHIHPD\I$HLLEIEP8I9E/ C \@ Lc sLL #L9;D @E1Js @PDPHMLDL I҉u;H`HHKHpH9:E1 fDH<uAIcLJ4HHtJLAA?EMcM)M~$H 1DH4HH4HL9|HxLUL)H~$HpH1H:HHHx~$M0A$uEuAHpH8uLL(LDPE1LH#f.ID$(I;D$0 -HID$(ID$(I;D$0( +HID$(ID$(I;D$0 HID$(LLLȉNI4K -HID$(Ic޾ LHEf ɉPHcvEHcEPADžpHD(HHHHpJHt H9OEA@E)D9FIcLDH)AHPLDmHpLMcHxDH+PL)uJ4D_mHxHpHH+PL)H|HDHxzLc sLLI}f<A1}EEuE9c+IH)HI)BDžSAD9yLxIH}MHpIJ|t]HA0DžmHDz HHxAX7KDLLkHpHxA LHxLH(EHʋUELDžPL DUH9S6HCHxHH9nH HhIHH4((KHpkHxHHKLiHHHhLDMEH)ыUN4)NIA1HpLfkHE11E1E1DLHDeHpDHxDHeHHxHpHxHhA.HuH@HUD)HLHEgeULHpAOLHBeIUHxHpJUDHpH84HE~1~hHcHzD0HEdHH4HcCLB%Dž EEC tHdHHH@@HdHs L牕HH@pLL牕HH@HH>H> -LLZLg+L牕H趵Hqg}xJLLLIVE~I9sI NLI~0H)HH̻LI+-LLL +HAd"XHdHHHP@HdHHHL.HHHHL HHHHHH+-eLD }f0C &IvH9A>0P0L牕ɳAL牕褳pL牕KHdHHH@XHdHLD_DLD}-HHDžDHdHHH@@HdHs 1HUHSH1=Z(t5T( 5T(H ]](HtHH^(Hc1H,H؃=Z(t T( T(tH[]HT$(HH](HT$tHH \(fDHdUHSH1= Z(t5T( 5S(H m\(HtHH](Hc1H,H؃=Y(t S( S(H[]HT$'HH\(HT$tHH [(fDHdH=HdHHHc]AXJXHJ%,JLD0JHD؉$hD$hH$`AAHgA^ $t$pL$`7KMH LH }A$8KHDHHHHHuL$ 1Ƀ}ALD$HLT$PMK L\$XLLL$@uLD$HILL$@LT$PL\$XI@LH9vfHIH90A0w$vfff1%$ D$EE1DŽ$|$pM H$H$ LLL$@HL$1tLL$@L$TIHLIHHHHI)HB`7KIAuEDu D$`+D$+T$pL$pBDɍD$lAu3H|$xT$(LD$HLL$@LT$PzLT$PLL$@ALD$HT$(D)AA u E E1E E @, t@L$llI$HHP H;P(  HHP AT$lI$HgHP H;P(Y0HHP uD$l I$H3HP H;P(%2HHP AE u]E~X}0uR|$l Mc0LLLD$HLL$@LT$PD\$XLD$HLL$@LT$PD\$XL9Eރ|$l$ I$HVHP H;P(H2HHP E|$pEn |$l H|$x1HHHtKHLqLIHD$xHHD$xID$(I;D$0HID$(AMuIHՃ|$pHcT$pML|$pM)I9HT$`LO|$ls MtLI^HEL@HAID$(II;D$0 HID$(AHuIEHH\$pH\$`L)H~E|$lHھ0LLD$HLT$PD\$XLD$HLT$PD\$XH9Aŋu|$lI$HHH H;H(1HHH $-$-|$l?I$HHX H;X(3HHX A]Ll$M)Ճ|$lPEMMID$(I;D$0AHID$(II3ID$(HI9D$0 @0HID$(ID$(I;D$03 @0HID$(ID$(I;D$0[ HID$(ZAHĘ[]A\A]A^A_DHdHHHcUAXJ0JPHJ%,JLDHDw-LT$(L$0pL$0T$(1fefD=DŽ$)$DŽ$$Lc$MMK Az0uABII0t|$pHcD$pLLc$L)H9A<8IL$pHcH94|$pATLc$BЃ 8IDD$pAIcI<79ID7I-A00HHL)H9dI HPH҃H 1+DdAADICH0DE6HPH ƅ@HDž(DžpHDžHDžHDžhHHL8QLqDJZwJHJHH`Dž DžtDžDžH DžxDžDžDžDžDžDžDžDžHDž@Hu6~2HcѾ H߉¸D)9F$"AU/*IEAU0HH<HP H;P(<2HHP ?A2At*~&HcѾ H/¸D)9F$"H@FMF%LLLHIHHHM)LILP8I9Hj!IcԸH)I9V!1E |u*~&HcH߾ \¸D)9,F$"HcHkHHH 0H HHcG0H4HHW9HB H;B(I90HHB AA|H t:~1Hc H¸D)9oH F$"H@HHHHHqHQ H)HP8HHQ H+QHH9Ic̺H)H9AHcH9fHkHHHA ׉։‰\׉‰։‰|҉,‰փlq @׉ƒ0׋Q9q(Q,y@7t"HHcH2҉Q'7A(t HHH879M5B HH4H7HHcHDž@HH)Ht$HHH m5LP3(M]5LcK<K5LQ81JHH)HT$HL96A0HHH܋LHPVDžIM5%S%LE-HcLtHHHHAHDž HH)LD$IHHMHuLLHEHHLADE)1|ucEt^IcҾ HHLD D¸HD)LD 9DF$"HHLHLHD DP8HLD DH9,IcԸH)H9Ẽ|t2Et-IcҾ H¸LD)9F$" U5HcHkHHR?|u&~"Hc׾ H¸D)9woF$"HcHkHHH C6H HHcB0H<諌HHtHB H;B(?HAA@)H HcHkHHLA8JHH)H|$HMt%DI011AHHHL9rHH9HB H;B(}9%HHB A (Dž AA$' DEA@$HH9HF H;F(9+HHF A EAЋ $DEȃy0~9A t=HH8HB H;B(8IHHB A|AA*L H 1IH4`7KHA1uL9U*LEILAHx H;x(sD7HHx =A=HAH9)3I$HuLHHD_HHDuLIDžAȉ Z5H H@HEHT$HH H$6H0?5DL0IHDž HHDž1HDž@HDž H3Hn5H HHHHHHH H@HHMLHLs H@HAHH HH9wHHa:HCHHH)HHL$HHH9HDH HHH~@H H HIDžA6 Z2JHJAU/$IEAULM%SOBLEl.HcL7H H HH2HDžHH)LD$IH HMHuLLHEČHHLADE)!ucEt^IcҾ HHLD D¸HD)LD 9DGF$"HHLHLHD DP8HLD DH9IcԸH)H9Ẽt2Et-IcҾ H¸LD)9F$"LFHH6HB H;B(6%HHB AJHcAHkHHHcHkHH`H2 Hc@0HHL0MLDž I?HELEHM?\H H 1HDžƅ7 HB0HH9HHHHH |HHs )\M Ȉ t BDЃuEu t7 ,ElHHQ5HA H;A(C5-HHA AA t !~&HcҾ0Hq¸D)9AF$"HHHHHHHP8HH9IcԸH)H9AHk`HHuDžHcHkHH`HHc@0HE1HL8DžDžDžDž HcHkHHH aH HUHHcF0HHHED)9F$ H HcHkHHH K#H HUHHcF0HHHExIDžA Z JHJHcHkHH,2Hc@0HHLHcHkHH`H3Hc@0HHLM3DžxDž,E1Dž\Dž0EIAЉ Z)H1IDžA> ZCtt p&+HcHHkHH4$HcA0HHH0IcHDžAU/8IEAULE1DžDž ME1Dž X`7K8KHDȃ H L1HHHuHH gH H+HHHL9 HHHIH LHЅD  D)M"t BDЃuEu t &EGHHA/HH H;H(3/-HHH A$At  ~&HcҾ0H¸D)9F$"HHHHHHHP8HH9IcԸH)H9ADžsIA> ZDž DžIDžA ZnIA> ZDžDžlHH3HP H;P(2%HHP AA!AU/IEAULMLDž I?HELEDž EIAȉ Z.DžDžJHJIAЉ Z DžDžXIA6 ZvAU/IEAULM.DžxDžE1DžDžCtt p 2AU/IEAUHIcHA0 fDDBIArЉу v+1v Z}DžxDžfDLLH,AfdA H HھP@/Dž<D#cE,HH$HB H;B($-HHB A}AtMt ~*Hc0HX¸D)9(F$"HHHHHHHP8HH9IcԸH)H9 +AHcEHH$HB H;B($-HHB ApA\tMt E ~*Hc0HK¸D)9F$"HHHHHHHP8HH9IcԸH)H9 +A~&HcҾ H¸D)9F$"Hk`HHƅ7 X`7K8KHDȃ X T H L1HHHuH, P H H+HcHHHe\aMXKHH HH)0H HDž@nHH HHHH(HHDž@MHH HH)0H0 Hc@0HE1HDDžDžHHx&HB H;B(j&+HHB qHHHA H;A(+HHA  HHHH H;H(+HHH LDHEH9@HC@H@H H9@Hk@HHHH)HD$HHH@H@HHHH ICtILL MHL LE1DHMMMMLHHcS0Lc[HH H(LHHITBLIHHL;sTC,t HADC(t HADHs8HtHuHcC0S4H ATHcC0S@DHMMMH@4MHI1LL@/?HP@HHH9@w~t1hNu H5n(HO"H@몋@/wHP@HHHHHrHHt8uHHHHHrHHH2zH0x*H H HDžE1Dž HA0HLcDž AcHHHB H;B(+HHB xAU/IEAUDE1DžDžCDžH LHHHHHHH)HҋH։uHHHHrHH~4HcҾ HD 蠾¸D D)9iF$"1DHPDH E1Dž HDžHhHH HLD LLHD LH LHHHHҋuFH LHHHHҋuH LHHHHHHH)HҋH։uHrHcLLruDžHALH 1ƅ7 HDžHWtH HLD LHH HLD LH)HHHD~4HcҾ HD C¸D D)9 F$"1HcLL\tDž HALIEHPIU?IEHPIU(H HLD HH HHcD LH)HHHH+hHH HLD HD HLH LHHHHҋuH LHHHHҋuuJAU/.IEAUDE1DžDžIEHPIUAU/IEAUDE1DžDžCHH$HB H;B(0HHB AHHHB H;B(8HHB AA.Dž DžJHJLMRHHHF H;F(-HHF P:HH3HF H;F(% HHF H1󫋅d`lh4\  ȍ  | Ѓ , Ȉl(m7p+IEHHHPIUPHUHEHEHUH`HHE蜂HHHD LHP8HD H9IcԸH)H9mG$!i0Hc@0HHLNlNHc@0HE1HDDžDž0HHHF H;F('HHF A  AU/0IEAULE1DžDžZHHHH H;H( HHH HHHB H;B(#HHB A Dž AAIEHPIUdHc@0HE1HDDžDž0 AU/ IEAUDE1DžDžHHHA H;A(0HHA A3HHHA H;A(0HHA AAyE1Dž1AI@HH" HB H;B( HHB AU/IEAUH0HtHB H;B(lHԹn(IEHPIUIAFIvH0 v?AU/ IEAU IHzЃ k DIEHPIU1HLHHH HH HP H;P( 0HHP ABHH HP H;P( :HHP  AALEIՃ9HHaHB H;B(S.HHB AHcL 1IH`7KHAuLAEILII$3HHx H;x(7HHx lAWHAH9wLEIՋqtBHHHB H;B(0HHB AAD)A9G$ HDžxDžJHJH1󫋅dƅm`lh4\  ȍ  | Ѓ , ȃl7pIEHHHPIUPHUHEHEHUH`HHEDZIEHPIUHHvHH H;H(h0HHH A'HHHH H;H(1HHH AAHHHD LHP8HD H9IcԸH)H9HcG$!HkHHIEHPIUADž AJHHHB H;B( HHB R1HLHHH ڃ QA Dž|DžHs HLLJIEHPIUHHHCȃHDD)9F$ HHH HH =HH8H@H@HHcHH 'L..HHDHD9HHD輯HD+H߉茯0H߉eH߉CW+HLLhHFL0Hݮ1IDžIEHPIUAU/wGIEAU8iVHHtHB H;B(HeIEHPIUHHJHHH HH@HgH@H +H߉߭-H8_TH8H4pJ3% H߉耭?IEHPIU1lAU/IEAUDE1DžDžHHH?HHIEDž: HLL IEHPIUfAU/ IEAUDE1DžDžHV! H߉5WIEHPIUdAAeHH@HE@@_IHDž@HDžBHdHHH`hH@PH<tHDžAUwBIEAUHHE#HH4HiIEHPIU뽃tSAU/wAU/ZIEAULS-H߉藧%Hvx HdHHH`hH@PH<t tHDžHc@0HHLo-H߉8'H߉HDD 讦HDD HH]HIEHPIUAUw*IEAUHHEIEHPIUIEHPIUՃAJO髾AU/IEAULH߉趥 5DžDžAJi$YDžAJ>0H߉<OIEHPIUELqLiH@kHHHHHI&Dž ޽IEHPIUAU/IEAULiIEHPIUxLʿL¿LHHDCHHDQLAU/IEAUHIc1HHcH|H HcH@HHH)H|$HH8LcH'H HLBTH HLIEHPIUh0AU/wkIEAUH1D ,lu,HcA0HHHD IEHPIUyHcA0HHH0fD ۸IEHPIU딃ljAU/LIEAUH1D 陸+HL臢L\Խ%He鹽dA"A鬽HωHAHHHHH@HXH@H AH8tHH8H4pIEHPIUIEHPIUAU/wNIEAUHfD еIEHPIUAU/w)IEAUH1fD 2IEHPIUIEHPIUH\$Hl$HLd$Ll$IH숂I³t0H$hH$pL$xL$HĈfDH$HLHLH$(H$CtE1H$H$H$DŽ$DŽ$HDŽ$$tHDŽ$؀@JŸ@HAEHDŽ$@P@H$Hf;xJHdL%L9Bt01='t 2 2HLBBH$HpLh I)IE~HIcHP8A9ŸEf;xHBBtDE{H$@1TgH$@HھP@!fDHB='t uY uSH:H;HĀ&H:H谋HĀ鶰H:HHĀH:HzHĀ땐UHAWAVAUATISHHXHH`H dHHHHHH@HBHHHBHP^LJ(%M(DHHQHr@HHRHH:HEH@H҅҉}HDžP@Hf@LHHHEHDžHE1HǻHDžPHDžHDž8HDž(E1Dž|Dž\E1HD6E1E1EAƀfHA%HAHAhDP AHCH;C]D(HHCEMZtEHIcHGhDP t0HSH;SED*HHSIcIDP uEE9E1HMD6E1EE1f;H t H D '\;HPt5HPH8HPHDž\\He[A\A]A^A_HLL HHUHDALLALHHKH;KYcHHKD*A9~AIHEHMMAfHD1DžhAƃ0  hDqHHAփ0 w3hEHATVD0A΃0 vhA$DhDžDžhEDDAVLX.LaDfDt6LXALEuAAct A[u%DA%ASAAntACt@I|HdAdAAbHCH;C?ZD(HHCIHBhIcDx uA|dAfIAHA%DLLL&;ASLLLD"EB$JH|d\ADž\HxHDpHHDž1H fA*tAIu<D2HA'HBuA*tAIt߉ A'DfDA։E1JЃ GHFDBJЃ vD0|Hd0\f;A-$՘JLAHD0HBB`HB=\'t 8p .p7HdL%L9Bt01='t 2p 2 pHLBBq LAlICASAlB&LAh&LASt s CtsLVLACDžAFHCH;CjD(HHCA+MZA-1A0AAMA)L9%A0HCH;C7^D(HHCIEtHAHGpnO$6ILBID$HH)L|$IHHLLDLL#LLDHAHCH;C=4D(HHCDIcMHDžpHDžhLpL@MZ!Eĉ0E8<tADEAHCH;C'D(HHCIcIE8<uLpL@IAHLMDLLLLLHhM9E,HH0H3HHpH`LD`HL0Ht7HPHHH8HHHHhHH9JHDžhAHCH;C%D(HHCIcMZE8<H8DLLhIDEM߁!pu/D.pHtHPH8HHHH9EID$I;D$"D(HID$HIcID8uLhLMAH8IIAHLLLLLLM9E+H8H!H8HPHH:H)H;HH)HH;bH4LLHLL0HPH!EH8D)HEH8~ A HCH;CD>D(HHCHIcIHFhDP t?hH H`H󥋽h H( rʉ/vHEIM]1M'I IH|EMd0HHH8DLhMIDD)HPHIH8HH9 ~ ;ID$I;D$X=D(HID$HIcIHFhDP =L듃/ H(n,ЃH0 u/ H(<<ЃH0 H H`H󥋵h H( zʉ}/vHHHHPHHWHHHPHH H H`H󥋽h H( qщt /vH/ H( ȃH0 HHHPHHHHHPHH)H H`H󥋽h H( qщt /vH/ H(ȃH0 H|d0WO 6ILBIAHH)Ld$IMLLLLLLLH#AHAdTHfHIcLpH8IHHLxLhDHPIH9HH9 D*HID$I;D$TD(HID$IILHHHPHHGHHHPHHrH H`H󥋽h H( qщt /vH/ H( ȃH0 H H(HD$HHHpH(1mh@/YHP@HHHLHLHLAIMLI9HPIH>LHDLzHHDLtHHDIHPLHH40HA$I|$fwH H(HD$HHPHH(1h@/yHP@HH8H8L@L0>HHHHLkHHLN'HPHѥHHHH^ FH(H]E1L;#8JDH8JDIHH H`H󥋽h H( qщt /vH/ H( ȃH0 %HPH(6HHHPHHTh @/h HP@HH8H8%" h@/tHP@HME1Dihue@/wFHP@HH8H8HHHPHHHHHPHHH H`H󥋍h H(t/wH/ H(%$ЃH0 KLHLHEtH8H!H8HPH8H8H)H;HLLfHLLHPHxH H(HD$HHHHH(1 HHHPHHYH H`H󥋍h H(t/wH/ H(#ЃH0 H H`H󥋍h H(t/wH/ H("ЃH0 HAfAL|$IfAHA$fALt$IASHPH(.HAHfALd$IH H(HD$HHHpH(1nHPH(H H(HD$HHPHH(1HHHPHHMH|DždmHAHfALd$IL4HLL薈HHL 2HPHH H H`H󥋽h H( rʉt /vH/ H(w'ЃH0 HPH(HPH(HDž\dH H`H󥋽h H( rʉl/vHHAHHHPHHH H`H󥋍h H(t/wH/ H(ЃH0  HHPHHAHDHDžP\fO$6ILBID$HH)L|$IH LLDLLiLLLD"H H`H󥋍h H(t/wH/ H(ЃH0 H H(HD$HHHxH(1MLpDL@H H`H󥋍h H(t/wH/ H(!ЃH0 WHHHPHH@L1HLLALLHHBh%O$6ILBID$HH)L|$IHLLDLLiLLLD-LLhMAH8LqH H`H󥋽h H( rʉ|/vHIGLH9MMIL莃HLpHPHH-HfALd$IGAEIM IAHDLLDLLHHHPHHH H`H󥋍h H(t/wH/ H(sЃH0 OHLDL~ALDLHd|O$6ILBID$HH)L|$IHLLDLLLLLDHPH(\HHHPHHH H`H󥋍h H(t/wH/ H(ЃH0 5HHHPHHHHHPHH.H H`H󥋍h H(t/wH/ H(2ЃH0 HHHPHHH H`H󥋍h H(t/wH/ H(=ЃH0 h@/eHP@HME1DHHHPHHH H`H󥋍h H(t/wH/ H(ЃH0 &IMEnAHCH;CD(HHCIE~AMƅppAH H`H󥋍h H(t/wH/ H(w'ЃH0 HPH(HPH(HDLLRADLLHd|H|d0L牕HDLAŋHDLHLLhMAH8Ld|LrHDLLdADLL8Hd|'HPLsLH8|HLHPHHHDLLADLL5HPH(eHA$fALt$IA*HHHPHHH H`H󥋍h H(t/wH/ H(w'ЃH0 HPH(THPH(H AHdD0HHPH(HHHPHHH H`H󥋍h H(t/wH/ H(%ЃH0 )HDLL ADLL߳,LHL AHLLLhLpH8LHHAd|HPH>H8H)H;H `LLhH8LpLHHL ALHMLpDL@d|!LJDLL[HHDLL@H0LpEDžLMEāEA1DDž@LIHADOH0HN'N%1ۃ1LD;LpDuN%AA9A~I^^ML7HID$IA9H;sEtTID$I;D$rLD DuMAHd|N%JMAL9vQAtHAIIA7H~IM9wHSLH)IIFH)D<1L芜@HJ%I@ HLDHLD09HDž@HHOL1AA9A~Mfu|DIA<$ht6HCH;CD8HHCA$ID9t.M9saAtAHI,IT$I9s=LIIA7HIM9rLLIFIL)HID:1LHH@HH@ HLLDAEEO@ @ +0D@A0EL;1HpEA)AF 2tTHCH;C\D8HHCIIMAׄ?LDHMLH|dK6H=HHCHHHH)HL$HHpHpHLHDHDHp0HEAEOMHpEDH@WL;F<6H@IH@E?EHCH;CsXD8HHCIAH@A9tEHpMA0PHpH߉HLaANjHLxHH@EHpMAd|EEEOILIH@H9LMEDž At:HAHHHLLHHIIIL9s7AuHLI@LLLpMOLL+@MEmDž MEHpMAK6H=HCHHHHH)Ld$IHtSLL牍LLLLMLpMEDž NLhH߉eANjHd|A$N@ NLAԉ0zMLDHAHd|N%N%LMLpEMDž K@H`Dž0E1LLHL0DHHHJ:J=uRHHUHE;HHpHE1D;@}j1AؔHxHDLLADLL;HAd|HDL&DL HDLDL2ڠHDLDL騠HDLLADLLHAd|HAfAL|$IfACHDLLADLLHPH(-HPH(HPH(bHLALHHLL0LHdHH|HLLEALL-HPHHHHH8HfHHHLt)HPHHH۴HPH( mHP\AHDžPHD=HDLLeADLL@騧HPH(HLLALLL!HHLLHLLrdAHDLLADLLHd|醡HHHPHH8HHHeHHHPL$H#HLLALL[L8@HLLALL>Hd|0HLLoALL:Hd|,HHDLLAHDLLcHEIMd|M0u 0\JDLLeEHHDLL2A]HCH;CD(HHCIH.DLLEHHUƉHEBHHDLLTHƄkH11HHL9uEHHDLLLLDD0A E$HHE1DH0HHA H,LLQDH0LL HHULLHEHHLLlIcHUHkHƄAHH0A 7AHMD0@pC:L7HLLDDžLMII݃0LO0A9XH;%EHIUI;UHIUIAH1HHHHBH,HHI9ADLLD 04LLDA tGHHA|$0LLIBH0LLQH1AHHHAHSHHHDHǪvDLLHDLL/ADLLHd|H|d8LMHDMd|L9vGtLMwyIIM9vA7LaHCIT$MH)I)MI rMLLLLAAIAHLLLLMLLLLAŃ0N0 0M90C7I0AtoHCH;Cs/D(HHC10I)0*MHL@ALuHMd|H|MdMO$6ILBID$HH)HL$HMtLHLHLHLI LLIAt|M9HtB3IIHIO$6ILBIT$HH)H\$HHtLHLL LLALƅIH h'AHaAH h'HHHIHHHH4?HHH)H)`JHL$HIHHHH 6HHH)H)`JEHIHHHH< HHH)H)`JAHIHHHH<6HHH)H)`JAHIHHHH< HHH)H)`JHt$HIHHHH)H)HT$`JH|$ g1L$,Hd <Ht$ HT$00wHd9tIH[]A\A]A^A_ÐHdHdËt$,1d1H$1#H$HH3$Hf'8fff.H\$Hl$HLd$Ll$HLt$L|$HHIIt 9EAAFJHH苓Hv&HT:/tf|/u HHwITL9QMEHپHyH:HZHĀHսH:HHĀH;H+HĀbH:HHĀ몐Sf?HxJHdL%L9Bt01=T't 2 2HLBB1ɺ1HH‹Htu+fxHCCt2fHtJH[DHKHH+KXHfHC=AT't u} uwfHdudf;Hx0HBBuHB=S't uD u>HHH:H)HĀH;HHĀnH:HHĀ몐UHSHHG8HtnH]@H)EtHHH4E11A"H0@HHtHHv H[]f.HE8뇐AUAJATIUSH t]0A JtR@t$@t$I@t$ @t$ @t$ @t$ @t$ @t$@t$@t$@t$@t$@t$@t$@t$@4$1 8~0I$LLP8HHtHH[]A\A]~I$HcLLP8HH[H]A\A]ÐSHH tF|Pt9HH@t+tGxgH߉T$L$Ht$RHt$L$T$HHH@HH [HHtu;tYH{H+{HfH߉T$L$Ht$kT$L$Ht$@HdHH [X*H\$Hl$HLd$H(f?HAxMLdL %M9Ht21=P't A0 A0yLMHA@Et@t/HHy@t!H߉T$T$HDHHPHHf;x8HBBu$HB=P't  HH\$Hl$Ld$ H(H{Hte ZCHKH+KHFH߉T$ĬT$HHHdA(f;Hx0HBBuHB=MO't uD u>H訷I8HHĀlH:HHĀH:HHĀ몐H\$Hl$HLd$HHrHItH$Hl$Ld$HHLHHP8H¸L9uːAUA@JATIUSHH tM0AJtBt$IIfSH`HtHG`H{HtZt_HHPHHPHxHPPHP@HHHx@HPH{!HH@@H@PH@H[f.HHx@UE1A" SH1H-HHt2HHx0HtUStt'Hh0HHh8StH[]fDH@8H)HH4H-HStDUHSHHHuuGHu+HH+PHUHC`HEHk`H[]f.HH+PHUHHPH9P wMu:HP0HPHP H;PvHPHHP(HP HPʀyfHPHHPHP H@HPt H둋2fSH|ftQuhHHHpH9H{`Hu$HH[H@  [fDHHHH9H HH0HHHH H;HvHHHHH(HH HHHpH H9U[fHP@ HHPHpPHpHHPH9HHHp@H(@H=;HHHHHHH [H{HHH@HPHffffff.AVIAUATIUHSH@M$I0I@H)HHH9ILCIE1MA AQEHFH9DD,E11ofH9rB<D)E9L;H<>t1 A HyAMJHHI0L)HtL@L[H)]A\A]A^LHMHI$JHf.HCH9AB1H fHH9uTHI0SHtmHH:HrH9HBPHrP HJ@HrHBH9HJH Hr@HHH [D[fDHHJH9J HJ0HJHJ H;JvHJH HrH:HJ(HJ HJH9 =HH:[H{`tiHtHH[H@(HCHJHHJHJ cHz@tHIH@HPHfffff.H\$Hl$HLd$HHHx0tH$Hl$Ld$HfL8H<u]H@PhuHHx0L8H<Ht0Ctu*H@8H)HH4H&H@L`0Hh8KtcHWHJXuBH;BLE1ffff.HGH@LH\$Ll$HLt$Hl$ILd$HHLOPLgHHD$PMHwpHGXI<$Il$(t HdH3,%0HHT$HT$E1LHsPD$$LL$LՉHD$IEHD$XHKPHw ҋJH\$ Hl$(Ld$0Ll$8Lt$@HHffffff.H\$Ll$HHl$Ld$HHLHMHHI<$Il$(t HdH3,%0HE1E11HD$$LL$LՉHIEw ҋJH\$(Hl$0Ld$8Ll$@HHDH\$Ll$HLt$Hl$ILd$HHLLHD$PMHHI<$Il$(t HdH3,%0HHT$sHT$E1LHD$$LL$LՉHD$IEHD$XHHw ҋ JH\$ Hl$(Ld$0Ll$8Lt$@HHffff.UIHLmLuIL}H]ILeHPHUIPLgHHwpIHH)HD$HHGPLHGXI<$I\$(t HdH3%0H{HUIvPD$$LMLLE1HEH]LeLuL}D)LmH\$Hl$1Ld$Ll$HHH| @@LHID$Ml$hLID$XI$ID$ID$ HH@`1LHID$pEID$x0EIDŽ$PEIDŽ$E1HD$IDŽ$0EHIDŽ$EIDŽ$@EI$H$ADŽ$ADŽ$ADŽ$I$HIDŽ$HXI$HD$I$HD$ADŽ$ADŽ$ADŽ$I$HIDŽ$0JHXI$ HH@HHH\$(Hl$0Ld$8Ll$@HHfDېSf?HIxMLdL%M9Qt21=3't A1 A1LMQAALH1HDf;x0HCCuHC=d3't uf u`[f;Hx0HBBuHB='3't uA u;H肛I9HcHĀAH;HHĀH:HHĀ뭐H\$Hl$HLl$Ld$XH8HHIu 1H\$Hl$ Ld$(Ll$0H8DH IHIt1LLl$謠HD$L LHǀ@JH)HD$ HǀAHǀAHHZHG(H;G0SHt*HHS HHC(H+C HH1[1Hk(f.USHHHs(HH HH)|HEHHHt&HC(H+C HC(H+C HHC8HHH1[]H\$Hl$AILd$Ll$HXH$PHAHIԾ1HHDŽ$ HHDŽ$(@IxDHbH$PHLH%D$PYt:$~rH$HHpHP H)HQEH$(1HPH$8H$@L$HL$PHXfH$pH$xHH)xH߽뛐Ld$IH\$LHl$HHHMtct)t.11HHHHl$H$Ld$H@ǁHHLHP8HtI9ufD1벐H\$Hl$HLd$HHD"A D߉VHHHcOAHu*1A HA D#HH$Hl$Ld$H tH1d> uDHfD1붐H\$Hl$HLd$HHUIċuEǃHLHHP8H¸L9tH$Hl$Ld$HÃu뾐=/'uROH/'tHfnHf`Hff`ɃfofpH)foHftftff!! u foHfoftftff tt HD9t1Ð@iffnΉf8ʃItHIfAoftftfftƅt9wMHffff.u8IfA:cv)IfA:cvIfA:cvIfA:cvr1ÐIÐ=9.'uMH1.'tHHHtكHHuIHHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHHÐ1҉HHfftfI MQtnIfftFfЅJHJTHWHHH1HI)It1Ht%LQIIL%Ic I f.fofHHftfЅ6fo f HftfЅfo f HftfЅfo f HftfЅfo f HftfЅt1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅ\f: fHfo\ftfЅ6f: fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf: fHfo\ftfЅvf: fHf1fffff.fo\ftfЅ<f: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ\f:fHfo\ftfЅ6f:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅuzf:fHfD1fffff.fo\ftfЅu@f:fHfo\ftfЅuf:fHf.1LILLHHHLIc I Dff.ffffffNfOÐff.VWDVWDVWDHHfHHVWHHVWHHVWHHVWHHHNHOÐHHHNHOÐHHHNHOHHHVHWfHHHVHWNOff.HHHVHWfNfOfHHHVHWNOff.HHHVHWNOff.HHHVHWHN HO fHHHVHWHNHOfHHHVHWHNHOfHHHVHWHNHOfHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐH\$Hl$HHHHhH>Ht!HHHl$H\$HH]DH\$Hl$HÐH\$Hl$HHZHxHHHt&(HHHl$H\$Hf1H\$Hl$HÐHHtSfHIIHfoftAH)AI)fD!u!L)vfoGHftfЅuHwL)HH9HCÐAWAVAUATUS t%=o~sff: f:c AfoA݉ȅt3fHcfoHHftfۍ []A\A]A^A_Å L^AAfDDE݃McHL$LcAE1IIHL$fuLEAfCo3foftfHD$$ŰJ@HHHHljAtBAA~2LcfoIfBoftfDAEt$0Jof:c AAȹAEEHHAЃqAA]LcfoIfBoftfDAE8$ͰJfsARAA>LcfoIfBoftfDAE$0Jfs fDfs fDfs fDfs fDfs fDfs fDfsfDfsfDfsfDfszfDfsjfDfsZfDfsJfDfs:fDfs*fDfs fDfs fDfs fDfs fDfs vfDfsffDfsVfDfsFfDfs6fDfs&fDfsfDfsfDfsfDfsfDo1EE@EEt9~1fBo&DfoftftHD$$ŰJf.oEuGfoAfof`fsf`fpftfЅt=AtBADEDE9ENMcLǀ?tQ%=~EHcfoHfoftft($0JEunHufDof:c AA=DAoHGLtftftff91[]A\A]A^A_HcfHfoftf $ͰJt)%=~HcHfo ftfof:c AAʼnȃHcH[]A\A]A^HA_ÉtC%=~7HcfHfoftft  fsfoKoBfs fofs fofsfofs fosfs foefs foWfsfoIfsfo;fsfo-fsfofsfofsfofsfofsfofsfofsfofsfofsfofsfofsfofsfoufsfogfsfoYfsfoKfs fo=fs fo/fs fo!fs fofs fofsfofsfo)fsfofs fo fs fofs fofs fofs fofsfofsfofsfofsfofsfofsfofsfosfsfoefsfo@fsfo2fsfo$fsfofsfofs fofs fofs fofs fofsfofsfofsfofsfofsfofs fo|EfuoHHljt8%=~,HcfoHfo ftft vGfsof:c ȹÅut*H1H$0J fsi$͠Jfsfo!fs fofs fofs fofs fofs fofsfofsfofsfofsfofsfofsfofsfoyfsfokfsfo]$J~8H1fs _fs Ufs Kfs Afs 7fs-fs#fsfsfsfsfsfsfsfs fs fs fsfsfsfsfsfsfsfsfsfs fs fs fo&fs fofs fo fs fofs fofsfofsfofsfofsfofsfofsfofsfofsfo~fsfop='u3H'tHHHtكHHuIHHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHHÐ1҉HHfftfI MQtnIfftFfЅJHJTHWHHH1HI)It1Ht%LQIILIc I f.fofHHftfЅ6fo f HftfЅfo f HftfЅfo f HftfЅfo f HftfЅt1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅ\f: fHfo\ftfЅ6f: fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf: fHfo\ftfЅvf: fHf1fffff.fo\ftfЅ<f: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ\f:fHfo\ftfЅ6f:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅuzf:fHfD1fffff.fo\ftfЅu@f:fHfo\ftfЅuf:fHf.1LILLHHHL Ic I DHffHGDfffNfOHGffff.HGVWHGÐVWHGÐVWHGÐHHHGDHHVWHGffffff.HHVWHG ffffff.HHVWHG ffffff.HHVWHG ffffff.HHHNHOHG ffff.HHHNHOHG ffff.HHHNHOHGHHHVHWHGf.HHHVHWNOHGHHHVHWfNfOHGDHHHVHWNOHGHHHVHWNOHGHHHVHWHN HO HGDHHHVHWHNHOHGDHHHVHWHNHOHGDHHHVHWHNHOHGDHHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.='ub'H"'uHB'uHU@=i'u"'Hk"a'uHAN'uH@HdHDHxbH?H?fo-fo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс/!HHHHE19t&wAБHLHI)LoOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)T HIfffff.fo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсTHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсxHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8Hfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)ofofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс(Hfoff.ftf€ufIfo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfslfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)OfofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs \ fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)? fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs L fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)/ fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсx HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs <fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ,fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8HfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.H H] )1ÐHC )ÐHdHDHx@H?H?fo%fo-fo500w{oofofDofDofDofdfDdfDdfDdfAfEffDffAfftftffсHHfHHE19t&wAБHLHI)LOc O A@fofftfofofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)HIfHfffff.fofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvhfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvKff.HL H )ffff.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)FfofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:clH#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c*HIpfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c: ;f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)6fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cvHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c\H#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c:  +f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)&fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfsf:c: { f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)v fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cL H#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfs f:c:  f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cV HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: kf.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)ffofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c<H#IfoDfs f:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cFHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: [f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)VfofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c,H#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c|H#IfoDfsf:c: fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfsZHJ|EtH )H<H4Et HH H )1ÐH )ÐATE1HUHSHtfDHIH\HHu[]LA\ÐH\$Hl$HLd$Ll$Lt$H(IILhILHI$ uGDHt.H9uI;$vJxtDHufMt;M.1҉H$Hl$Ld$Ll$Lt$ H(If.I<$跥II$1M.뫐I$I1뗐ATHAUHSHu*@HDeHHH蒤HH)HHZw[]A\ÐH\$Hl$HLd$Ll$HLt$H(HIALp1IvqLHuH;ĩHH HtRHHEA$Ht1IA$D9uH;vCxt=A$HuDLu1H$Hl$Ld$Ll$Lt$ H(DI띐fHHfoftH)f!uf:cOHuHHÐHdHDHx-!H?H?fo-9fo5Afo=I00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс? HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)dHIfffff.fo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсdHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftf€ufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.H H )1ÐH )Ð1H9t)HRpHDHA+uEuÐ1t^WtUD_EtJDW Eu.8fDLHBEt(DD HBEtHB4tH‹LHBuÐHH7HHvZHJHIHHHv_u[t$1fnL$fpf.HHHH9fwHLH<8HtH7t HwuwfHH2rrr HHw벐Ll$AH\$AHl$Ld$H|ǀtRHdHH(H](H*H{HHh0uRHtMH8t HdH3,%0H AH;H\$hHl$pLd$xL$HĈHD$_Ld$HD$8Dl$_D$$HD$PHD$XD$(D$ HD$@HD$HHD$ID$(HD$0HH8Hh(t HdH3,%0HHL$PHT$PD$$E1LL$HLH;HՃtt D$X H`JIH}SH](HҸlHDHHH1H\$Ll$lHl$Ld$ILt$HHHD$pHDHHDHH1HCD$4D$8D$0HL$@HD$(HHD$PH\$ dHH(Le(MMHILBI$H8Hh(t HdH3,%0HLl$`D$$E1HT$`Ht$ LL$hLI<$ՃtuNH9\$ t1҅tHT$`L)HH$H$L$L$L$HĨ@tHtHHdTHúAgKH`JAIHHT$QLe(HT$UHAUATSHHxHuldHHHHHH)HD$HHHDHLdHEEEHUHEL H]A$HHEMl$(MIEH8L`(t IdL3$%0EuPLI}E111HuD$$LMAԃHEHHeH)[A\A]ÐHELHEHMI}E1HUHuD$$LMHAԃt>t:t5HdTHeH[A\A]DumHEhHEI`JAILOMl$(lHHDHdLTHl$Ll$lLt$H\$HLd$L|$HHDŽ$4DŽ$8HDHDŽ$0H$@HDŽ$PIIdHHHC(HL`I<$I\$(t HdH3%0HM}LNt5LHH$ HD$L$(HD$E1LH$ D$$L$`LILH$ HH)Huuz;tttHHdTHH$H$L$L$L$L$Hĸf.uzuImLl$ MHhH$@H$hL|1HL$(H$pH$pH$@fDHL$ E1H$hD$$L$`LLLH$ L)HՃtu+Hf.IEHH`JIHLHC(H\$Ld$lLl$Hl$ILt$L|$HMILD1H&HHrHL$DŽ$4DŽ$8DŽ$0L$@HHDŽ$PwL|HHL$dHHHC(HL0I>In(t HdH3,%0MIDHL$ H$(E1LH$ D$$L$hLLH$ L)HHtttpt+t&t!tHHdTHH$H$xL$L$L$L$HĨDHALuI$HsI$Ld$ 1M$H$XH$@HL$(H$`H$`H$@fHL$ E1LH$XD$$L$hLLH$ HL)HHӃttyHH`JIH5JHC(HL$HHHt{WttHttHVL@HHHtNDLEtDHHHt:DDEt0HHHt'D\ EtHHH9t DEuDH1øðÐHt9u9t HuÐAWAVAUATUSHIHt$(H|$ HDŽ$DDŽ$HDŽ$@H$PHDŽ$`HC(HL I<$Il$(t HdH3,%0H|$ H\$(HH ]HD$ H$hL$xL$hL$0H$0HH$8@fH$hH9{ H$0H$8H)HHt`HHL$|sHL$HH\E1D$$MHLLLՃtyH$hH$0H+T$ H\$(H HHuhHL$ H uH\$(HHӃ…!ʄtttHHdTHĈH[]A\A]A^A_@t@H$0bHD$(L|$0L$xL$hHHH$h;HDI1HD$(H$PHHT$ H$8H$pH$pH$PHL$0E1LD$$MHL$(Ht$ LH$0L)HHӃttHH 1H`JINHHT$FHC(Ht$3@lHHH`HÐA;;<DF;AGFifff.US9w(DFQDimDEYDADD))AGAHcHiɀQt:GHiQHGw(H+GH HO []G1ɃuGHHiҀQHf;v@uQAd)A9HQD{@M1D_ DVAQAdAHfADCA -9KDADAк*AA)DAA)DEJRA)ӺgfffAC[E\DAA@D)EATEHAEAIFE$IE E)DB D)Ѝ)D)W)DOAv3D-:KBA)D9}¸ jD9} D9rHcHHiҀQH*fDQAd)A9u)iҐ9} u\@)iҐ9H\$Hl$HLd$HvH lAԁlsPllEtCH&H &H9P1H9~?C HHŀlHS0HHDHH(lHC(H$Hl$Ld$H1H9H91H9fAVE1AUIATUSH&HHu 2@HHCH9wH)LLdLAtAHHuIH}E1~_HHt"L`HHhLL蔗MtI[]LA\A]A^H&ffffff.U l1 HAWAVAUIHATLeSHHHLH&gKH]&gK8HPHLHH)H|$HLHHþ0J1Lp_A}<IHH@IHdHHAEHru<+t<-t<>zHH)HjIH胳L5&IMu5fIIFI9wL)HITHHU襖HUtNIHuI]1Ht6HPHLxHHEHHUMHUHMxIH&AE<-<-H<+t MIH&L}LuLE1MLLHH)HLiHH&AEH<-<+t kIH&LE1MLLL95Hf}&IH&t<,W& t<,l& H@l1E@!=T&1HH/+1H$D$ Ht"EHs(H+4$HH*uh1ۃ='&t y& ty&HHl$ H\$Ld$(Ll$0H8fDH}HL$ HIDw@D$ C HC0}J1HC(_fs lLml sPllEHx&H y&H9_1I9}3C HHŀlHS0HHDHH(lHC(D1I9fDH1dI9͸|1I9H=Dx&H4 HĀH=%x&H!HĀ3H=x&HHĀKH=w&Hg!HĀYH=w&HHĀH=w&H)!HĀ#AWAVAUATMUHSHHH|$;Lw&H &H &MH=&Ht$H97IHL L9TI)Hu"LHLI?HL)E1I9IQDHH9J HH;4|IH Sw&H5\w&@H= &MD,H&IHCw&1H;Bw&N,.HH Wv&HXv&H=&HE&H&AEAD$ HHŀlID$0IEID$(Hv&Lv&HHHH|$EIL@Ht$H1HHHIH9HJH H|$H9:tH[]A\A]A^A_HHrHHHHIH9s}HEtH3HH92uH[HH9ZuHID5HXHH9Xu&HXH0HHH9HHɉủUH[]A\A]A^A_f.II)J;4XI vIMH;4IUH;4})IU@HH;4LjHB| DHQIHBu&HHCu&x DpH=;u&H$Mc7Lu&JlH$M9H t&H5t&IM9B)HHDpx McJ&H5qs&2H=s&MH3H|$1L#H|$L{HDs&HHH=>s&H;=s&?Hs&H&H1HHH< H&Hr&y H=r&Hr&Hv&Hr&L-r&pH5r&LH=}r&HHII94DBHHEty H=Zr&]H5Fr&H&H&E1E1UHAWAVAUATISHH(HD-y&Hy&D7Eu,H= z&VHy&He[A\A]A^A_fD%t&A/\JH׀Huf.A/J謇HS8JHH苝HDrHHHfDxHHG47IIIL)Lt$ILHxH/DL Et6HH޿BEuHp&H9f.H߾IHHH蟟Hƿz uEuHI4H+5a&I4fi&H([]A\A]A^A_Ha&I@Ha&H a&IHA@ A@Dh N42@IHH`&Hi&L%%H-%:HHt#DH8uHH)H9v$H h&HHI9WHHHL`&SAWIAVAUMATUSHIAHL$@Ht$@ILD$pHD$hHv0 L$LHt$x L$LvHH$HE1IH|$ILD$`1fLL)H HtEHIHq<%u1E1E1HYI0#-fE1rЃ v]AEE1Oz%HA4G$FdbH эrЃ wA ~AfD^t#_pf.DH/@AfE1HL[]A\A]A^A_7]A[@$JfDHA fl$L ED$LD$L&EHD$XJDHCAAHH%uHHE1E)LEIL)EMcI9.H~E~HA0McH LHL$ DD$0LL$8D\$LmD\$LL$8DD$0HL$ EMcMtL@tIUxTHuLHMDHMExDMcH0LHL$ DD$0LL$8D\$LlHL$ DD$0LL$8D\$UDMcHHLHL$ LL$8LZLL$8HL$ TH|$@1҅DELD$hE1w &HI|@T$0L$ t$8DT$(D\$ T$0A)ALL$ t$8DT$(D\$AIL)F McI9vHE~NA0Mc HLL$ DD$0LL$8D\$LkHT$@D\$LL$8DD$0L$ r1 HL$hMc&MHHt@t#LLIUpTHuf.LMH1HD$XJfHL$@HT$X1LD$pMHDT$(D\$DD$P1+T$PLDT$(D\$ID$PL)H$HH9H$G1HthI~,A0Lc HLD\$Nd%jD\$LD$pHL$@MHT$XH$LD\$6HcD$PD\$IL$Et"H9vfDMIUxUHH9wHHHD$XJAEHT$@AAEM̿$IJr)))Ѝt)׉HL$`ޅDDH)ƃ0@1u߅tH-A-jt$`DA)t$PȅD$X~yA_LMcL)I9tHtE-HHIHLcd$Xt1HL0HL$ DT$(LD\$iD\$DT$(HL$ MAE1|$PE1LD)A)AEIL)AMcI9HHE~HA0McH LHL$ DD$0LL$8D\$LhD\$LL$8DD$0HL$ EgMcMLtIUxTHuEHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8貄DD$0A)ĉHt$8DT$(D\$EIALMcL)I9 HE~OA0McH LL$ LD$0D\$LgHT$@H|$hD\$LD$0L$ BHt@ELcMt"LLIUxTHufLMHrAEAOHt$@EAEŐVlAOAEHL$hHHL$XtDEڃɃH|$xt HT$x:u5Ht$@F xH|$p?HHŀlHD$xH|$xIH|$xL$ DT$(D\$D\$DT$(AL$ 1E)AIDLcLL)I9HE~FA0eMcH LL$ DD$0LL$8D\$LeD\$LL$8DD$0L$ RMcMKHt$xLLIUpTHu%Ht$@EAEO̺$IN)))QEHD$XJ.AE$HD$@AQdHlEEO)‰)) EHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8fDD$0A)ĉHt$8DT$(D\$EIALMcL)I9H>E~VA0AMcH LL$ LD$0D\$L@dHT$@H|$hD\$LD$0L$ BHt@Ej LcMLLIUxTHuEHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8KDD$0A)ĉHt$8DT$(D\$EIALMcL)I9H#E~VA0rMcH LL$ LD$0D\$L%cHT$@H|$hD\$LD$0L$ BHt@EO LcMLDLIUxTHuEDLDIL)E`McI9Ht?ɸ%~-A0Hcɾ HHHL$ lbHL$ H͈EHfMHH D1ILcLL)I9yHtą~*A0P Hcɾ HHHL$ aHL$ HE HAEHD$@AAEM̋PAET$LAAEMA-A0_DEHD$hHHD$X8JHED$XHD$XAE9HT$@AAEM̋J+J$I)EAEHL$@AAEM̋!AEH|$@AAEM̋WAEAAT$LEMAEHD$@AAEM̋PHt$@HDN EDN(E D1IHHD$PLL)H9D$PHt_~SA0 HcH HHL$ DD$0DL$8DT$(D\$`HL$ D\$DT$(DL$8DD$0HE+HLt$PDȿdB AD)AAEM< )Љ)AE^ HD$@AAQEM̿dH))уd)¸d)щTAE HL$@AAEM̋QgAOAEHL$hHHL$XAEHL$@AEEŐQAEH|$@AAEM̋W AErHt$@AAEM̋V AOMAERHD$hHHD$XDEEHT$@HL$hBHt@DD$0DT$(D\$HHt$8zDD$0A)ĉHt$8DT$(D\$EIALMcL)I9!HE~VA06 McH LL$ LD$0D\$L]HT$@H|$hD\$LD$0L$ BHt@ELcMLDLIUxTHuAE Ht$@AAEM̋V-Ht$@H$DT$(D\$HH$HFH$HFH$HFH$HF H$HF(H$HF0H$. HHHL$`H?DT$(D\$uIHgfffffffHHHH?HH)HH)ƉHփ0H҈uAfDHgfffffffHHHH?HH)HH)ƉH؃0H҈uAEHD$@Ht$@HT$@DHvRt$PA~+t$P׉T$X$Il))D)֍t$1@u9Qd)¸9u1Am$IA)D+D$P~A)))ADx $GgQ$AA$IEM̋$$)D1ILcLL)I9H&~*A0Hcɾ HHHL$ XZHL$ HE HAOfHt$h׉T$0DL$8DT$(D\$ HT$0DL$8DT$(D\$+HHD$ vHT$0HL$ DL$8DT$(D\$A1E)AIDLcLL)I9H.E~HA0McH LHL$ DD$0LL$8D\$LjYD\$LL$8DD$0HL$ EtQMcMLf.tIUxTHuDT$AȃT$PDMcHHLLL$8蒴LL$8hMcH0LHL$ DD$0LL$8D\$LXHL$ DD$0LL$8D\$%DLcLL)I9HtDLH HL$ L$0LL$8DT$(D\$QXLL$8D\$DT$(DD$0HL$ LDM+D$XD;d$XADO(Lc0HLNd%WD\$@E1 H|$hMc&MHHt@QLfDLIUxTHu-LcHLD$0L:LD$0PHE1EEMcMHt$xLLIUxTHu1 McLD$hL&HHIt@LL$8軲LL$8Mc0HLDD$0LL$8VHD$@LL$ DD$0LL$8D\$pMcH0LDD$0LL$8LVHL$ DD$0LL$8D\$:AAQEM)¸d)׉JdAEEOoHT$hHHT$X:FHT$hHHT$X:LD$hMLD$XA8|$X1k@u(@d@uf1@A1m$IAD+L$PA~DD)DD))Ѝt$qD1IHHD$PLL)H9D$PHt^~RA0AHcH HHL$ DD$0DL$8DT$(D\$THL$ D\$DT$(DL$8DD$0HE-HLt$PAHcɾ0HYHcɾ0HMcH0LL$ DD$0LL$8D\$LTL$ DD$0LL$8D\$Ht$hH|$@DD$0DT$(D\$HDD$0DT$(D\$!H@(HD$XE1HD$xgKHt$hH|$@DD$0DT$(D\$HIDD$0DT$(D\$Hp H1H1HуA)AIHHD$PLL)H9D$PHtrE~@A0 Mc HLL$ LL$8D\$LoSLL$8D\$L$ Iq ELcMtLLIUxTHuLLt$PHkHt$hH|$@DD$0DT$(D\$HDD$0DT$(D\$lH|$@EAEŐW+PP@PHt$xMcHLLL$8YLL$8/L$ DT$(D\$LD$pHT$@D\$DT$(L$ AB HcH0HHL$ DD$0DL$8DT$(D\$DRHL$ DD$0DL$8DT$(D\$H9McH0LL$ LD$0RHt$@H|$hLL$ LD$0D\$FHt@McH0LL$ LD$0QHt$@H|$hLL$ LD$0D\$FHt@Hcɾ0HMcH0LL$ LD$0_QHt$@H|$hLL$ LD$0D\$FHt@McH0LL$ LD$0QHt$@H|$hLL$ LD$0D\$FHt@HcH0HHL$ DD$0DL$8DT$(D\$PHL$ DD$0DL$8DT$(D\$HLcHL7WMc0HLL$ LL$8nPLL$8LL$ D\$Iq fff.HMLD$D$HÐH\$Hl$HLd$Ll$Lt$L|$H8}h@Ht @lYHk(HEt=Pl@HGH\$Hl$@lLd$Ll$ Lt$(L|$0H8雸DM0L9uHEtK4HH)HLE1LuHEHAD 1;+DC@I|$ 1IH{ NHx1H{(NHxL1L)L$IALH{0Hx1H{8HHM9L`I$HID$HCID$HCID$HCC9CW1;+DC@XH\$Hl$Ld$Ll$ Lt$(L|$0H8DH}Ht #HEEafDC9C |C;Cz0fHHHC(!HǹHHHHC pFH}_#HEHExf.H\$Hl$HHV(HHt$JtHcHl$HH\$HHHH8HU(1HuH\$Hl$Hfffff.UHSHHHF(HpL@KkDK MH15fDz9~{9|nu;j f|euD;J~]HHHI9vNrH9~Njz9|?uNjz9|6tm9fuD;J}fDHXHE(H_1H[]fuzf;j cD;J}WfD;J뿐H\$Ld$Hl$Ll$ILt$H(cv)1HHl$H$Ld$Ll$Lt$ H(H8t˸h@Ht @l0Il$(HU(u`M$E(MtB E1HHEu *HEN4(1LI KI LpuIl$(Ht3HEHt*HظPl@H'@l$1ؿ0jHHID$(tHǹHHHID$ pFB(u,H\$Hl$Ld$Ll$H8cv!1HHl$ H\$Ld$(Ll$0H8HP8tҸh@Ht@lHt$گHt$Hn(HM,uYLPE,MtF HHE t`1I@LL$(1LH H L`u@Lm Mt$I\Pl@H+@lв1߿0Ht$Ht$HHHF(tHǹHHHHF pF1fAWAAVAUATUHSHHH|$HPDEh@Ht @l誮Lu(M EF(ELAF(Mt? E1_HIFu '@IFN, 1LIHI LhuLu(MuDE1APl@Ht @l觱AtH|$L7HD[]A\A]A^A_MvML4$tE11AH$L,LeL9IvHHLeDDMDHHduf0wHIHE(C1 LHE pFA~(SH_(Ht6HG(HG H;NH{EH{ <H[3[Ð?H= Ðd%~ud%@tø'ud%ÐkÐhÐlÐHwHHָH=wÐHdHdÐSH= ÐH= ÐH\$Hl$HLd$H(HHuJHT =MHcHHt$ HIHt$uf.1.@HtILOH=wXxjHt%HIDHHl$H\$Ld$ H(HuHcL HH1dHdf.HgL돐HHHHHÐIHT$ȾTHcH=wyutT$AT$APT$APL$ԁAH L$AP4AP8IPAHHL$IHHL$HJL$fJL$JIP$I@$BB HdÐH H=w+1H9H5&wDHd HH4&1dȐH(9&uHcHcH=wTH(ÉT$Ht$|$=T$|$AHt$HcHcHHw&DHD$=HD$HdHHdHȐAUATIUSHHdHL(I;tQ1D1HBxHXt4HHLECuAHDIDH[]A\A]DH1[]A\A]ÐHStH;Vs;t1N#N H2t#NHf.[ÐSHxHcǃ@HttHcǃH t tHcǃ H(ttHcǃfǃ[Ht6tHcǃH;HǃH t6 tHcǃ H Hǃ H(_tHcǃH(Hǃ(fǃ[ÐHH%ffff.AWAJAVAJAUAATIUHSH zH] t tHLLHLHJ HaIt,HJIL$ ]f.t* S GH] 6uH[]A\A]A^A_H}1 ` sA$ A$]@H}1 ( MA$]ffDH} 1 AD$]=DA$]&A$] HJt5J Hu6IL$]AD$]IL$]J Ht!JHLu$IL$@]vId$]dJH\t(JH[u$IL$]&IL$]JH[uIL$@]/JH[IL$ ]AWAVAUATUSHH H5&GHGH0fCD>JCfCfC5CHǃǃǃHǃHǃfǃfǃfǃHǃfǃHǃ fǃHǃ(fǃCHD$D$HHHu<ƃHSPHkHD$t[HsxH91< tH|$@< EHEH9< u< |$fDEHD$IJJ:HI8HHSPHl$PE1D$HD$ HCxHT$0HUD$HD$@HEHT$8HD$(@L HHD$P<#t<;tڿ[JH-D$V< t$uHu@H< t< t< ttH|$ :ƃtH< < < HT$ fD< < < HuD$< < xHE< hfD<  fDH*HHE1ɿ |$#< bJH#D$V< L$jHufDH< t< t< IAH|$ 9ƃH|$ :HtHT$ HL$0HD$ HSHtkHD$@H9HHL$0HD$ 1f !Ht)H9r߄t tfD tH KHD$t@< iJ HD$Z< |$Lu IA< t< t< MH$p L%HcD$$p D$D$HHTfDfD5< jtJHDt$XA A HT$(lLl$HH\$IA ufIEuA tA tA EA;1EMt[DfA;ExEHdHHIDP u&IE7EvA޿J7HtH$p AL$p HD$Mc޿JB$_7H$A_E7I; HH¨IdHdH2fDHHDP uIA;[dHH$p A$p HT$BAA AAMXA +fD}JHD$W< Ht$8VJH,gD$C+D$~D$f+D$fALD +T$uHHCPHCHJHJfCfC5CHǃǃǃHǃHǃfǃfǃfǃHǃfǃHǃ fǃHǃ(fǃ7HD$D$HHH0ƃHSPHkHD$tyHsxH91< tf|$.EHEt;H97< 8< t< @t΅tH*HHE1ɿuʼn|$@EHD$IJJ/HIHHSPHl$PE1D$HD$ HCxHT$0HUD$HD$@HEHT$8HD$(@L HHD$P<#t<;tڿ[JHD$V< t< DL$EuHufDH< t< t< ttH|$ /ƃtH< M< E< =HT$ fD< -< %< HuD$< HE< ph< u_bJHuD$V< :< 2iJ HuD$Z< < @tJHDt$XA t A A HT$(NLl$HH\$IfA uf.IEuA tA tA EA;EM?A;ExEHdHH:IDP u&IE7EA޿J-HtH$p AL$p HD$Mc޿JB$b-H$A_E7I;I@:HH¨IdHdH2IA;tt|HHDP tdHH$p Ao$p HT$BAA AAwMODD$ErHufDH< t< t< QIH|$ +ƃH|$ 4,HtHT$ HL$0HD$ HSHHD$@H9H1HD$ (H~H9g tۀ tօtH1H|$Lu IA< t< t< Mt/@< < fD< IAu־%LA+HItA?H$P L -HIf f@5M@H$P IGH$X IGpAGHcD$LDŽfDŽCD$f.}JHcD$W< t< RHt$8VJH(;ʅҸ HT$Bt;rfD1eD$C+D$~D$f+D$fALD |$uHHCPHCHJ0HtJHHSHKHĈ 1[]A\A]A^A_f.HT$BȅHD$BwfLl$HH\$ DGHG9fCDHl$PH. .H(HHpH'|$|$M*A!H t t uHD$,%=DHT$ HD$M1TI H$p L zHcD$$p D$D$HHTfDfD5HdHHH@@HdHHD$ HL$0HH@@Hd$P %=tM$P INt/H$h HX6AGH$h 8M@$Q uINHH $AGH $fff.SHxHcǃHHt6tHcHǃHǃH Ht6 tHcH ǃ ~Hǃ H(Ht6tHcH(ǃHt$74HT$H;T$t# HrHt$ uH9w={HH|$(Mt}H8[]A\A]A^A_DHL$H9 $sJHrHt$ruJHHT$-uH9,$H9D$vkt7Nd%I)MqH>H|$(H8[]A\A]A^A_L$$I)Hd t̓tFuL$$L+d$뒐H\$Hl$Ld$HHH#Ax\HǾ1\$Ic¸x'HH#H\$0Hl$8Ld$@HHHd8t1d1ʐH\$Ld$IHl$HHxhLH"1H3^x*HcD$H\$0Hl$8Ld$@HHHHcd2t1d&1DUHSHH fHH{HuuHH[]f.AWAVAUATUSH8H|$D$D$D$HD$ HD$(1҅XH|$1҅!Hl$ Ht$@0HUHMHtkHvew\@H)HvIH‹v?H9r89r uۋZ;]uZft!fÃH)HwfDHmH{HHIHLd$ E11MADI\$Il$HH w-H)HHËH9s ;t$uˋsA;t$usffuECH IHO47AvlDC HC fAv\AH9rSfxu4DLDfAv4AH9r+HfxHxEAAL)HwAH)H DM$$MDHIH@H|$HT$H|$aHT$H8H[]A\A]A^A_H{$HHT$HIFHT$hALH1di닐Hc?Dff.ATUHSHdDeHtHHHudDe[]A\fDU1ҾSHH&ljxK HH$D$f$x2;HT$ HD$ xD$C1H[]Hc;ffffff.UHAWAVAUATSHHWHELt$ILuLpLeHEDžpftfDžvDž|xEfEAEEfE;1A MLLeHuEHd8tHe[A\A]A^A_1(׀(‰C>xL}L0HEDž8 L@HDžHHDžPH0HDžXDž`f;1LtHIuHd8tAfH/Efj` ISALDI99{LE1&fDH)HvYH‹vOH9wH9z uۋr;surIftMfu#Hd1Mu He1[A\A]A^A_ùI|$ H8Hx HLLH(3wL(H{ I@CM`A@t'HCLLCvBHdLCfU1ҾHAWAVAUATSHHXHEEEHEHECH] HEEHEfEI}HUHE +EH]H߉E3,H߃EH}H uIE1E1EE1IQIIHHvyvrH9s#iH)HvYH‹vOH9wH9r uDBE;AuDBfAt-fA1fAÃAH)HwfDM MdEDeIL'1dEuMuD@dEuHc}He؉[A\A]A^A_H}IHdEuuLL'MufDH HvbDB Lj fAvREL9rIfA}u)HMEEfAv-EI9w$IfA}t%EAAL)HwAIMAEۿMiKt:HHEEHHHHBHHH)L\$ILLLMLMLLmDžTIYMaHII9M4fMI)IJHË<L91MS ;UuƋSA;RuSff%fuuLKEA~KAA_ 1A9K Du"HcI<?A9 A9H}H}fDMDM MTtK}tEHiEHuH]IT II9tA;uHiɸHH}HMHX1H 0fDMMM MVuf}HSHUDB$AA 1A9 DMHcI<tA9A9HFDLiθHuLMHiL H}H HGAAGIIfDL9IqDIy8ILpHhMH0H8IIH@LxHHHL`H}LfDf>M%H)HIAfrDI9eMAWIIwft?vffuMi0LLLOt%2pALwfI$hfAǁH@LLMoLEHuFAFfAHHIy(A IT$HHELLMIAH$kALI$fAA8H0LLMFoLEaCHUBAA<BfAA@H8AIIhHhLxLpL`DMILxLmLpHhL`Ix.I@H0f fI@\fI@ ]f f111HfAp\!Aq)Ή@}߃9FH1H9r9t\AA)EAEAEt5foL:1DfAID9rDDHE9tH9wHTEM-HiLMIHVDHiƸHuHEHiҸHTu@HcLi¸LEA@~HBH}HiLLy胅TIJAAMqf7I9+IxiFYAECPAfH6H AdHHH8HHFHG%=t>FAEDHH(AHHHGHFHG%=t>zFjAEGAf.HFGAzHKHFHiƸHEVHHHhAH;AyA19DufDHcI49tqA9fAqE9IP` IPdHc}I1dEuHiHEH@I@ ELM[HQ>HiHMHEHiҸHLM0HE+EHEA;HEHEaH1YSH@H`t[Ð>E1@{tT1@8:tH<@:<u@uEt@}t:1fD@/t@tt@:t1HA>띐Hff.H\$Hl$HH'HhHNHt!HHHl$H\$HHmfDH\$Hl$HfAWAVE1AUAATUSHHHL|$8H|$8HT$LD$0LL$ Ht$L3HIL'HHAJEHm&HuHHH9h uHxH9LHuMT1H9uxH9t HI9wL9XJIHCHw1HHvA|,/tA,/HCH:A<$/*DH|$ HD$(tH|$ &HHD$(HM~%H|)H|$(HHH+~%HLHL$H|(HyJ`H;-%HL$Hi vH-%1A<$/L}%@MHQ(HH)HƒL9IGHl1fDt(HH9rI9tkMI)MINMtDt$ LT(1fnL$ fpfDHHHI9fA:wLM9tf.t(HI9wH|$ HD$0HAJ|)HT$(Ht$ HL$H<9cHL$HAH%HH %J IJJHHH[]A\A]A^A_A1A<$/H9t: H9 LKI HAoLKu1J11 2ifAUATE1USHHHo8Hu8DHEHt'HHuHuH[]A\A]fIHu#HxLhHHt2HxLHAbHEHEEIl$H[]A\A]ùOK1H޿ zhf.UHAWAVAUATIkKSH(HP{%H%HuHUHHH)1OrI$Ll$IHHPHUHUH9UIUAHUDHP HpL]Hz%IHtv1I$|(tYHLHHz%HPH0\L9H9E@E8KyKHEL1pH_z%E1HH9rII$HtHUH9PPH}tYHE8uHy%HHEHUHu}K1~pHe[A\A]A^A_A}/`DWHuK1@pfffff.H\$Hl$؉Ld$Ll$HLt$L|$H8IMMLt$@t蟡LLMtAFhL1HMfffff.U1HAWAVAUATMSHHHu1H}DMALuH@DDUIdL衠HUH?HDUH0KLAFIv 9KA~fA~>AFffA~68=AF8Iv M<6HIII)I4H9O$'M9LA&H HH8HH)IH9;uLk IvH{0vHsH}J.H;M$6 K8A $AT$HHHHHT IMH9I)ILHLuMAD$AL$AT$A\$us{%t'9wHfDHeD[A\A]A^A_A~u<`HEȁxELFmA~A$DHAdAF8fDIE1DLEDUHH)SLd$DULIDL8I9LEDUf KDID$1DDUHH)L|$DULIDLL9DUAF8HIII)@KLDUDU$HKKdD'EHD؀}u2HUIE11DDHD$H$E1KH}1HHuDUHHAHHH)H|$H[H}ILmDUA~tE1JkE1什K^A~tFE1JJHKdD"5fwE1XKE1(KAF<tt E1KAFtt E1仿K<wI~ 9KDUE1K6KDUHEf.UHAWAVAUATSHHH H(HLHLHHHs%DžH%HHH)HHT$HL 1H8HHH1%#HIT$ It$H8UHws%H01HE1E1H/AD$AOH$s%IH9HCHA|$tLHr%H0HPH0#UH(H H UIL+8T%MLE E1HUHH8eAD$6A ǃ7I@EDtHdMDH HL MH}DH}t%HUHB0HHHluPL8HH@AH8uX%=@AD$1A Hq%qDLHHHH8LHWfHe؉[A\A]A^A_AD$d H81K1h'=p%H@οu YtɘHHp%dc記0IT$H9HIT$HHHztH:HpxlHHfU`xlXxlHAWAVAUATSHHH5k%H=%Ho%HIHo%Ho%HHOHHLH)H<8GJƅIE$1HH)Ld$G։$ILLL9AKsDAV(LE1L)A2LHAK2H%ƒ vэA2HT@LH)H wLH)HLH)H LH)H 1AKIHEHHU HT$HH $HH$ H1=$ҁ0H(~8Hk8HAKH(LW8HHk8@H1AHKH11AK1AKH=5%1HHHHBHH|1AIzHOK1ҿ EHHH9HH~ǃHHxH4.HHHAK@H@HHH)H{8u衸y H茸1AKHSD$(xKL$0HHD$D$1D$HL$ L8L $LANE tSH;AAMAH@H8D ЈHHqƅAsK11AKHU HK18NHHzHShHHrHpa1A`KH!σHLLMAKHLLgH5%HHH!LL 6V%H}<_%A8K1A KH7%HH%%HH A(KfDAWKAAVHEAUATMUHSHHHlL$,HtXIAMmMt9Au uLHEtLHĸH[]A\A]A^A_fHD$+/HƄ$uH|$+1HHHH$t6|$+HHt$PL$1AH:AHE;H|T%H$HT$PEIHLd$D4$H$H$HD$H%@HMLE09tLH޿K1tKHS%HHH%HD$8dH_H(QH=S%|$+H/%H$Ht$8DLL$PL$HL$H߹@xlD$HEŁH$ZtT%>>K1t$ Jt$ @HH7KHHlC|$+tHHHLtFHt$8H$DLL$PL$LHHD$D$H,$BH(HyHUhHpKLHrHIuD%D$0H HIte|$+/HHt$PL$E1ɹLt(LD$ *HH$t$ Nz|$+HHt  H=R%H$Ht$8LL$PL$pxlHHT$T$0D$@H$t#|$+H%HD$0D1D|$HDt$LMIT$DAIaH$T$DHt$8LL$PL$LHL$HD$H,$L;l$0A MMtNIHtHIuIHIEhHrKLHHpitXDLDt$LMD|$HH|$0HT$0<HHsIIH[|$+HD$0H$Ht$8DLL$PL$HL$HLD$HEŁH$|IDž_IH7IUhHHRHPHHT$ HT$ LILHHD$ zHT$ LMDt$LD|$HIiĐHlOIiĐHlHDžKH KLHHHL$0HpLHQhKHrHT$0pe=N%LH޿K1EH$D$ t$ |$,%HPHItiMEHDHHa$HtMLHHǀ`IǀHD$ )'HT$ HǂLw K1H޿ :$tK1H1:H0K1Hd8:ffffff.AWAAVIAUATUSHH(FHE1I(HlL-=M%ItpEIEDIHHHH,HP HQHpHHHL$IUhHpIKHrLcgIHVFIDžAf.HЀ JЀ HD@JHPЀ w>GHFD@PЀ vDJA w# HLJDJA vA9lD)ÍJЀ v&8uHH=ø)Ã@HH=]%HGHwH5\%H<%Hffffff.AWAVAUATIUSH(%H%HHYH-%HH %H# %HDmH%H AHHADA)HcHkD4A9E<$E1ۉLHtDf.D@A DBA HDHDBHPЀ w;G HFLHPЀ vDRA wGHFDBDRA vE9jDD)tvDkE9|!C+HcH@D4A91H(H[]A\A]A^A_DBA vy8HH؃u\$ID{IcHkD4A91LHL$HtHL$DD[:C L5%AAIDN43Hk LlHcHk E)DA9A4$1ɉMI| DHA DJA IDPADJHPЀ wJf.GIFTPAPЀ vDZA w$G HFLJDZA vE9ZDD)ȃtx|]D}D9AAHHk DA9DJA v8IHAM)Dl$MI܅]HcHk ADA9LT$ItT$뽾IKZK19)Hc1HkL|0;\$~0AGA9vMv9KHXHDž`OKHDžpWKHEbKLPAgKLxLDHPHhHExKLuHEWKILMlbKIHPIxKIxLImIDHsymbol HH)Ll$?II}HXI}WKHLHbKHHPH޻xKHѻLHֻ;uH0%HKHHDLH޺K1I$He1[A\A]A^A_LHEHEH@H8OMHULEHXLHD$(D$ Lt$L$I $HT$HUH$uH1L MuH}tL9mjI$LmHELAZL9mtHULmLA>I$Ht @<tH}tI$1QMgKtI]MM.gKAWKMLDHXHHDž`KLpLx1HHhHLIHLHHKHL)HHD -HH)Lt$?ILI~HX˹LHLHŹ;uH.%HKHHDLKH1AgKM"H]AH@HDž8L 1IHHMH9 uH8IuHKEAKKLC0LEȀ9u H6.%H>IU0uH#.%H0KHHDHX1H<$Km%MtI6K1$r>>K1$aǃAE)I9tAu8M1IHH8t%H8HHtH9tH]E1MtEL1A9vHHHH9tՃEH`H0H(uPP@H`lDxDDIiE0HlH9yHH@1d%u$dH%d4%HHxP@Ht&`lL DDL IH981HHHH9`d@Ht `lqH(t d%EtIH@MHUMDLHXL $H@HT$LQH0H;`k1gIHtjI9tm19HpHH9tH,H0H;`uA<t<1D AD9vDI;\QAD9wAuA9vhIH\I%@IMME09u H*%HHsHS0>u H*%H0K11!HXDž8 |HIAtDIJHxLH HLL K\AI8MHA#18H<:AWMAVAUAATIUHSHHHDD$fHPHH$mxHIH$IpIF(IHhHIN8H $IH $IpDI^AA Ʃ%A@KIX11MM~0HIIdžxHlHtHIXMuUfDII$HuI1IĸL$+II@H"H@/HD$HAE1HLH豍HIt(LHlHHIMd8"tL虈HfI8HL[]A\A]A^A_AdžIXIĸL9%@D$HBI1Eu]'%tIdž8xMuHyHHHEfDHT$H{ fHЀx/HPuH9HE1LL?x/Ht/LH몸PUP@HSHHHt lHTHHlHt[HH@HuHS HZHDHlH%H`HH %`d@HtHl[]aHlH[]HH@uHH0H; %wH %HJ'%H)H=vH8H- IL(L9rH)H1HL)HHH)HG(H5%H@u1ml.%1`ffff.HcH\$Hl$HLd$HHHHBHH` Kկw2ڃ@H1@J@JPHu1#@J@JP@JP@JP @JP@JPH[H%SHHPH7HHH!HXH!H9tH)x[HHs K1d8VfDHSdH<%H+@dH %HHHH< HHHD H H(HH)'H1H[ѮfHH@tH0H; %vHwK11H%H$%H)H=vH8H- IL(L9rH)H1HL)HHH)HG(H5H%H@u HH+%Hffffff.UHAWAVAUATAASHHH`T a%  H HDž@HChEEH@HXEH_HSx11EHEHEHEHtHJHHMH@HEH8 HEHRHCPHUHMUH@DeHEHEHuILL#H~ H8HHH}trL9s2AvMM.HHH MeIM9wHHH9}HUL#HHRHHIHHuILuHSpE1HRHUHHt#rHHHH9HGL,RIHN,)tMH8HHH@M9Hx?LhLpMuHxHMLpM}HLAH Iu H%H0 K1HH8H8HEH@JHH8H8HEH@HH8H8HEH@H%HIIII1I$1I A;$cI$I$HEfxH8H8HHHDž@IEILI#MHtMI8Hk8H I9rEH=%H@psGHH^HO%IEHg%H0Ld$HIM(HHIH!Ht H!H)It$I#}H;I<$}xCAE@bQsH@L@I|$AD$H(KHHs1d8KIEI$IIFHL8L8IEHH8cH8HEH@L@AT$It$I<$袂xlMd$MHCPHt]Hp cHH(P KaH{%HKH KHHD1| R K( K뿾KgH\$Hl$HHLd$Ll$Lt$L|$H8I!%L-%L0IH-%LHM4$L-ԏ%H\$Hl$Ld$Ll$ Lt$(L|$0H8ÐSH H|$Ht$HT$HL$ LD$(HD$8!%H$HH|$H1H$՛uOH$HD$0H|$(HT$ H$H$HHD$HT$HHD$HH [H$H$HHD$0HT$HHT$HD$8HD$@HT$Dfffff.H\$Hl$ظ KLd$Ll$ILt$L|$HXHHALDH %L0HgKHDMH=LHX1LxI<dHIFtCLLHHHHAFIEI~DDDjIgKIFR KAFfgKEHuk}"IAgK KILEHۺ` KHDH%HHD$HL$HL,$HHD־ K1OHt$ D"Iyfff.H\$Hl$HLd$Ll$H(%AIHu/H %HtHHHDH\$Hl$Ld$Ll$ H(H=ٌ%* KA0 K: KLD1HLHDHltHHHlHt0HHD=%H@gGHHlHx HPHxtÐK KH9tZHH)HHH?HHHH9w.fDH9Ht0H)HHH?HHHH9sHJH9u@fffff.UHSHHHvӚt'H[8Hu,@H[HtH3H謚uH[]@H1[]UIHAWE1AVAAULmATIE E1SHHXHDE~1EIcAAHHDŽ LR%IEHHt %t uHIcH)HHHt HA%tU HQHcIcHHe[A\A]A^A_ftH%ufDHHpA 0*A.HFZGHXuL<%stA /IAA H8Ic̉HLHH CHLH zHcH9HGH cLPH1Hc A蛮L9LvHL9 wE:E H9bAT$HcHHHXPAlHH1uA /)IQA H:H0L\$IISH8x HDLDLD1衭DDLLAHMcH)I9~II)ÐLIHIKDI9IcAHH H vfDx_HHpA0A*YA/IAAHDHF.7~*H^[A/IAAHHFIcHHHDŽAIAHPIQtA /vwIQHJII:9IAHHIIIcHHDŽHIcAHHHDŽIQHJIIIQA :IAHPIQHH)LDHHT$0HnGHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$H1$D$0HD$HD$ HD$Hffff.HHT$0H5oGHt$(HL$8H)H$LD$@LL$HH)z)r)j)b)Z)R)J)BH$H=%$D$0HD$HD$ HD$gHffffff.HHT$0HoGHt$(HL$8H)H$LD$@LL$HH)z)r)j)b)Z)R)J)BH$H=:%$D$0HD$HD$ HD$Hffffff.H\$Hl$1Ld$Ll$IH17Ix/HƿXxHD$0HI$u9I/LH$H$L$L$HĸE1AعH1tI벐ATKYUSHH=AwsH=,%HޮHxHYHHH5%HHDHKfDx/HPuHH9wHH[]A\@<$[tt)Al$Hcŀ</uuDHcŀ</tdAu1XHHt(AtRHcHHHH[]A\fHHH[]A\f.A|$HcfDf/CH\$Hl$HHd%uf1H\$Hl$HH-Ά%HtLHEH1wH|HHE1h%HEHtHH|HE5fHEHu뙿WHHi%tHXH1q%HeYH8H$HL$HT$Ht$H|$ LD$(LL$0Ht$@H|$8 eILL$0LD$(H|$ Ht$HT$HL$H$HHAffffff.H H$HD$HHH@HcH$LD$LL$HL$Ht$ H|$(Hl$0HC0HD$8)D$@)L$P)T$`)\$p)$)$)$)$=%u1I۸L1u1Ѓk%$$$@$$$$@$$$$$$$$ $0HHS0Hs(H{ LCzaIHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($by)$yt $o$D$@bq)$yt $o$L$Pbi)$yt $@o$@T$`ba)$yt $o$\$pbY)$yt $o$$bQ)$yt $o$$bI)$ yt $@o$@$bA)$0yt $o$$LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I APy0y@HSHs(H{ ^H$HT$(D$(L$ y)$uoD$Pq)$u o$l$@l$0HH$H0fHHS0Hs(H{ LCx^IHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I y0y@HSHs(H{ ]H$HT$(D$(L$ l$@l$0HH$H0ÐH=%tHH<$`f.fffff.HH<$`;ff.SHWHE1E1HH7HGHHD$$HHCH[fSHWHE1H0H7HGHD$'KHD$ LD$HD$HD$c HD$$?HCH0[DSHH1HHi%wL >%D/%H$H?+jHCH[ÐHHpyGH<$HT$?H|$0Ht$(IHD$5KHD$(H|$(Ht |$?u HH@k^HHfDHT$1HtHHT$HBtHlHHf.H8IyGH|$ HT$/Ht$HD$H|$1Ht|$/uH8f.D$]D$H8fffff.HH yGH<$Ht$H|$0HT$?Ht$(IHD$(H|$(Ht$1|$?u HHfDk]1HH@HT$1HtHHT$HBHHHHpyGH<$Ht$H|$0HT$?Ht$(IHD$(H|$(Ht$1|$?u HHfD\1HH@HT$1HtHHT$HBHHH\$Hl$yGLd$HhLd$OH\$@Hl$8LD$ H|$ t$(HLHHD$@H|$@Ht21|$OuH\$PHl$XLd$`HhDC\1HD$0HIpyGLHHD$5KHD$8H$H|$8Ht-|$OuH|$0ܲHD$0D[fHT$1HtHHT$HBtH|$0Hl蕲HD$0:dH%HH@ff.H@dH+%fHHH$H|$HHt$Ht$HLD$LL$ LT$(L\$0HT$8HL$@cH$H|$Ht$LD$LL$ LT$(L\$0HT$8HL$@HP HHH$H|$HHt$H5LD$LL$ LT$(L\$0HT$8HL$@衆H$H|$Ht$LD$LL$ LT$(L\$0HT$8HL$@HHg UHAWI/AVAUATSHXH}HUMHt!Hx/܄HtxHXt1E/L賄Ht!Hx/蠄HtxHPHUsj8|A8uAG:ZjDEH}HMHULϫEHEHt6IE1 II<$tL ID$MHuHEHHH)HxKHHEHEHHUHE1HGHHHHH)`HUH{L}E1HEH]HMHEH]LeHHH)MHL8Ll@IO0fD1I|$uHI9\$ID$JH4HEJ|0轂uID$0HEHtHUH}Jt2 Ѕu\(JHIT$ H@ LHIT$(HPIT$8HPHUHPIW@HtHJ HR HuHMd$M2HUHH;U}HEA BT0TiHcHoIHIGIHHEHUIGIhI8H;UHEHUHEHe[A\A]A^A_HMQ:grQ:gbHdHHLL2HH!HLHH)Ld$ILf//@Lexg AG:jgHdHHLLɝHH!HLHH)L|$IL7f//@HdD#HuH}dD#EHEH}HdD#t|HMH}H]HHHHHH)L|@DM/Mu 'fDMIEMu HLUMuII8UHtHH]H}U?HH+UHBHH)H|$HHuHHE虜HPHHHH)H|$HiI<,uIA$<,tID$L,,LpuM1EJpILFHH{ GHuYfDHx GtIHHBHuHPHt$HHHHHFPKHFHF G^HrAM<,uf.IA$<,t3ID$@L,LpuML)LHBHH)H|$HIJCKL3~twHIuf.IIuHtJL}*IEHuHP1HT$HMHL"IUMI)HPH\$HHHCPKHCHC GHHP1H\$HHL#}II}@HkE8UHMT SHFMtID$IEID$MI\$H@AWIAVIAUATUHSHH8HLL$H1IHHHD$ tHHL$ HD$ HHH)HHPL@HCH8L`(t IdL3$%0HLmMHCHD$( ILE1H{D$$LL$LHHt$(AԃuHUL9tHKHcIHH I9sMt#I?tHL$ HT$ HHH)HTIH8[]A\A]A^A_fDL8HT$ HD$ HsH{LL$HHH)HHxD$E111҃$AԅlH1@A$HH8H9T$ sHAWAVIAULoHATUSHH_L?@ImHu "DLHELe HuSHPMuAEt$LtPHHL[]A\A]A^A_I}Ht JPAEuI8H}륐SHH@^HHCHHt6XKCHtHSHsH;ЅtH{HHCH[DH{HlKHHC tH{HxKH{HHC0XKH{HHC(KCPHC81[H\$Hl$HLd$Ll$Lt$1H(=o%t5j% 5yj%}G(lHa\HItqH8HGHHtZ1HtE=n%t 5j%X 'j%JH$Hl$Ld$Ll$Lt$ H(f{c@H;谕H=Xp%HhHAv"HuH3IE18AHp%H|h[@HIt1 LHI|$XHI<$H3L5o%ID$@HI6HEtu@II6HI|$@L+wHHLLu1G(lL5`HII6Ht4I|$@L+owHHLL.so+uDID$@I$H@PHHPHSHPHSHPHSHP HS HP(HS(HP0HS0HP8HS8D{hfDH6H?MwDAWMAVAUATUSHH?IHW(H|$(Ht$8LD$PHD$0HT$@tHdH3%0HT$@HdHH(HH0HD$HH@L8HD$XHD$0LHHT$ HD$HI9LT$LT$ 1HT$HIB AHD$0D9Hu9T M,AUt>HI9wݸHĘ[]A\A]A^A_fDL M,u@HL$XLl$`Lt$pL$Lt$@L|$xAFLT$hDDAfH41ۅHt"H DHA HHAuI44LHL$H$IEH$HL$E1D$$L$H$Ht$8H|$(I AփlAUHD$0DLl$`HcLT$hLt$pL|$xHI9vuAE;rmHT$LT$ H9T$ PHdHHf`uVPtBHD$0HXHI9L9|$0SNfDILT$L돸0HD$PHhLHD$0HA(I9r1);kw)‰1s9_H 9QH$H$H|$@HH$nE1HLH$D$$L$Ht$8H|$(T$@6t]H$H$HSt!EH$H$H-HT$PH$IcHHH1HD$PH$HH1H$HL$PIHL1H=c%H HĀdH=c%H4 HĀHHcdHHÐHHfH~H!H>H1HHH H?!ÐHfH~H!HH)H?ÐHD$T$HD$T$T$L$ T$ȁ% ‰ к)!ÐHD$T$HD$D$T$L$% D$ɉ  ¸)ÐH1dHfffff.HdHH1dH>'fffff.HdH 'H1dHIfffff.HdHIAWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH 'KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$(qHIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,ŀ'KHHH ŀ'KLLpHII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHHjDIłHI)HHA I)DHDL$H/QiDL$EEHHƁd"LʼnrkDHHl$ H\$Ld$(Ll$0H8VfDH~Eu"H\$Hl$ Ld$(Ll$0H8ÐfDEtSHHHHnH~ZDHWd!DHuDHHHfDH/1HAHA HnHHhH Hfff.AWIIAVAUATUSH(HAH|$8HD$PHD$HHX@LD$(LT$ HLD$(Ld$8HD$`LT$ HDŽ$I@hIIA,$HDP u@-J @+D$p` @8HCLt@~HH@8HH)߄uA<IM)@uOLHPPHT$P}HpHHt$H>ڃ@T$8Dރ@%@tT$D$1HD$@@H16AWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH 'KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$NHIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,ŀ'KHHH ŀ'KLL1NHII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHH%DIHI)HHA I5>DHDL$H/FDL$EEHHd"LʼnrhDHHl$ H\$Ld$(Ll$0H83rH~Eu"*oH\$Hl$ Ld$(Ll$0H8ÐofDEtkHHH HHHgHH!H-JfHfWd!ofHuDHHHsH/1HA4HA HnHHEHH HfDAWIIAVAUATUSHHAH|$8SHD$PHD$HHX@LD$(LT$ HfLD$(Ld$8HD$`LT$ HDŽ$I@hIIA,$HDP u@-R @+D$pp !@8HCLt@~HH@8HH)߄uA<Ht$@H$H>H( H$HH$rH3 H$HL$PHH|$@LuNH)NH49 H$HDŽ@HH$H9L$8HH)ÅHHH$H5SHDŽ$D$`D$8H$~2Ht$@HcHHf.HcH@H HuHxcHsHHHH< {HrfLD$@1fDHHHH9fAwH9tHD$@HHH9}|$85HDŽH@<HEHD$XT$HfDL9HtMJ@HHIHHLHD1L9@L)H)H9w uJ;@v HLsHT$XHt$PHH|$@fH;@tHt$@HT$PHHH7T$HJ@H@~,T$H BHcHcH@H@D$8mH}HH$?HcH)@)H$55@)щT$`HHH$xHcH@tA?D$D+D$`HpA T$pH|$hMcHh2H<@eu |$XI9ML7fDH͋ aDIIA)IA,$D$pf.fWIA,$fIL$I@pIM)@uOLaHPPHT$P}HpHHt$H>~ڃ@T$8Dރ@HHu91ҹH HH H HD$D$1HD$@HH fH1AWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH 'KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$,HIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,ŀ'KHHH ŀ'KLLa+HII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHH¿%DIHI)HHA I@^DHDL$H/.$DL$EEHHd"LʼnrhDHHl$ H\$Ld$(Ll$0H8OH@~Eu"KH\$Hl$ Ld$(Ll$0H8KEtcHHjH9H+v|HnHHs#HH H@tNfDHd!oHuDHHHHyHH?Չ-?H/1HA?HA AWIIAVAUATUSH(HAH|$0+HD$PHD$8HX@LD$ LT$HCLD$ Ld$0HD$XLT$HDŽ$I@hIIA,$HDP u@-; @+D$dF @8HCLt@yHH@80HH)@uA<H$?)HHD$@HT$@HL)HDރ@ڃ@T$0H$JHL)Ht$@HIM)@uOl IAmHd"3Ht$8LDHHD8i>IM)@uOLLH1vH4Hnɸ@)noH~H4HL9~#IK HwI1L9K>Ld$(H@HD$Ht$0HHHHDHHD$(IŋD$8Ht$HL$LHNI)HLl$8HD$ HHHt$HLHT$HHHHl$@Mt$AHl$ "Ht$HLIK>L9~$IJLHwI1L9K>Hl$@DHL$ L<HT$HD$LHHL$(H LHT$@HHD$HT$0HHt$HHHT$0HH}IHl$8AIHl$((Ht$HLIK>L9~$IJLHwI1L9K>Hl$8DH HHt$H~L4HN|5I LmL|$AIHl$ %Ht$HLHIKD5L9~%IJLHwEI1L9KD5LL|$LD$@HT$HHLO4K@HT$Ht$HHE1`D$8HEI91fDIHTHH9uHAH9G1fDHHHHHH9uTHUHAHEI9HHHH611@oDHfAHH9wH9gfDHTIHH91SHHD$0HD$HH9D$0HHHHH|$LD$011DoHfAHH9wH9HL$Ht$0DHHHH91}HFHAHD$HI9HHHH?H|$11fDoHfAHH9wH9xHT$fHIHH91HHM@CHD$HH9"HHHHH|$11fDoHfDHH9wH9IHL$fHHTHH91L4N|5IKHHL$(HLHL$H|$LL $L $LHLL $L $uHLLHHHMH<HHLHK<~cMD$Ll$AMM#@HHLIKHI HD$(HHD$HLHHL $L $HT$HHIHl$Ll$ IMALM&fDHLHIJD=L9~$HK HwI1L9JD=MHl$MLl$ xHH+LcN<IJT=HT$HLe,fLLL2HKH2H:HkHĀH;H^mHĀnH:HCmHĀ몐Ld$IH\$LHl$HHHMu1HHl$H$Ld$HHLH!I9t1HHʐH8KKHtHlHÐSHH0HwHtR Ku H0[HT$(1H/HHD$(;tHD$(HtHx0uH{荨ff.P@HHuH$@lHþ3HhlNuffff.0@Hl$Ld$H\$HHHI`0HllZUH$HtnH{Ht{uOHCHSHsH{MH`31H{C1H{Hl$H$Ld$H@蛧f@Ht=$NHHq 蠕HHt!p@HL=$HN9@l/=$ $ffffff.U0@SHHHD$p`0Hll$T@H6=H$MHHCt8HCHt!R KHtH膦HCHD$H[]fHsHt;Ht$utJ HSI"IgKH|$8K:HD1THCR KHHD$HCCH[]#HsJH荂HSI"IgKH|$I龣8K:HD1}HD$또@lfDHxq=$ $DSHH0HwHtR Ku)H)p@Ht =$1LH0[@HT$(1H/HHD$({tHD$(HtHx0uH{ͤff.H8H5-$HtR Ku H8DHT$(1H/HHD$( tHD$(HtHx0uH=׿$Z붐11tt11DH1fD1H(H|$t$5HHH $HT$H(ÐSHH{ v8K111B0fC$8KfD1HHHSH[HCHW0H[HCH8[Hs1[D@Hs[1H8H{[GHCHHHH[Ð;vH8H<$Ht$ 6HHT$HL$ 1uH|$DH|$HD$H8SHHH?uGwHW gKHL $D$HHDH.$1H$խHCH[ù(9K11.=$uH&$uHG$uHU@=$uBH{&$uHGn$uH@HdHDHxlH%H%IӉH?H?fo-fo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс%I0%HHHHE19t&wAБHLHI)L?Oc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)4$NLM9b$MY$MHIffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс#I#Hfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс#IQ#HffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)"foNLM9"M"MfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс!I!HfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс!IU!Hfoftfu IvfIf.fo fsfs\ fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)? foNLM9i M` MfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfs fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIOHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс.IeHfoftfu I vfIf.fo fsfslfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)OfoNLM9yMpMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсxIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9)M MfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс(I_HfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftf€u I vfIf.fo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI%Hfoftfu IvfIf.fo fsfs,fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM99M0MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8IoHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9 M MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсN I Hfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)o foNLM9 M MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I5 Hfoftfu IvfIf.fo fs fs < fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9I M@ MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHIHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI/HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс^IHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIEHfoftfu IvfIf.fo fsfsLfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)/foNLM9YMPMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.HI)v Hx )1fff.HS )ÐHdHDHx}FHU HZ IӉH?H?fo%fo-fo500oofofDofDofDofdfDdfDdfDdfAfEffDffAfftftffсIHHDHHE19t&wAБHLHI)LOc O A@fofftfofofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)NLM9MMHIfH@fofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvxIOfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvI7I)HL H })@ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9-M$MfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c&I}HI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9=M4MfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c6IHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9% ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)+foNLM9MMDMfHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cPIHI|fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI3HfIfoDfsf:c:L9E 7ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)KfoNLM9mMdMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIEH ff.IfoDfsf:c:L9U Gffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)[foNLM9}MtMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cvIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIUH ff.IfoDfsf:c:L9e Wffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)kfoNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIeH ff.IfoDfsf:c:L9u gffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD){foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIuH ff.IfoDfsf:c:L9wffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c.IH ff.IfoDfsf:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c I HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c> I H ff.IfoDfs f:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c I HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cN I H ff.IfoDfs f:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI- HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c^IH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI=HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cnIH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIMHI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c~IH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9 MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI]HI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cImHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9s fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cffff.s_I)vZHJ|EtH )H<H4EtHHI)v Hȉ )1fff.H )ÐHl$H\$HHHHt't~u2 H8t5uDHE@HHl$H\$HfDH谌HtHHEfDH{ڐHdHDHx=%H%H %IӉH?H?fo-Szfo5[zfo=cz00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс)$I@$HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)D#NLM9r#Mi#MHIffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс"I"Hfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс*"Ia"HffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)!foNLM9!M!MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I!HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс> Iu Hfoftfu IvfIf.fo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu IvfIf.fo fsfs<fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu I vfIf.fo fsfs|fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu I vfIf.fo fsfs<fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftf€u I vfIf.fo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu IvfIf.fo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu IvfIf.fo fs fs | fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_ foNLM9 M MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I5 Hfoftfu IvfIf.fo fs fs < fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9I M@ MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсP I HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I Hfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 M MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu IvfIf.fo fs fs |fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu IvfIf.fo fsfs<fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.HI)v Hc )1fff.Hc )ÐHt;H9t6HIpHDDHAB+u EtHufD1ÐHH9tu1ÐAUHW)QΠEATUHSHHHHH?HH H)HiQH)Hy/@HHƀQxHQ~f.HQHHQHH|jYHHYHHH?H H)‰UHiH)HHHHH?HHH)HUHH)HH)H%I$I$IHH؉uH?HH)HH)H)Åۉ؉]I ףp= ףH3l>,fDHIII?HHHL)HHHH9uHL)HHHH9nH9HIIHHH?HH)HHL M)MLVI?L)ILMIL 2ILIH?IyILIHIH)M)I)O$MI MO$HIM)MII>I?KLL)H?H)HHHI)HII?L)II?LHIHIL)L)HIAHHHIL)HH)LIL)I>HHHI)LH?HJL)H?HHH4HHH4HHLH)H?H)HH2mH9yHEHH9tHdK1[]A\A]fDHMuMHH ףp= ףHHH?HHHH)HHHH9uvHH)HHHH9t^1H:K CH9|H)uAE []A\A]HSH9E띐AT1EAQAMcUHcMcSHH@A)A1AMcL)A)ÉA)‰؍,l)D)AD)DD$G$D)AHcD$8AD)I)HcD$0H)HcD$(I)HcD$ H)HHHHƉ)D))HcHH[[I]HHA\H)HHHH)If.AWAVAUATUH*SHHHOH$WDG D$xG $O$1҅ ‰ȉT$@HcS)Ɖ4@)ω)HHHHT$8;1?HMcD$|<:H4H‹|$xHH$HcH40H6:KH$HNLD$`|$x;HD$H;D$|;HD$8QHc$Hc$L$L$8H$HHt$hD$01H)D$0H|$XD$0L$0E1D$0))ȋL$0)HD$8T$DT$TDD$THFHHHA#+D$DHT$`HHH@HLHHH)HLHHH)Ћ$HcH)HD$HHD$pH$0IH$81HHHc~1LcN@)QA)A)DLcF)HD$XL)IHD$hL)IHD$8H)HHHHc~HH))HD$`)L$0L$T+L$DHcHH$8H@IHHHH)IHcJII)I)LD$HIH9I?D8u&HHHH9~ HAH9I9u4L;$0t*$|$@Å8AA1ۃ$L$0LH$0H$8LHHbH$8E11HH`L$D$H$MHI.HL)HLH$8LLAHtIHHHH?HLH9HyLH)HH9 H$H$H+D$p$9T$xH$N<8HL>H$HH$HSH$HSH$HSH$HS H$HS(H$ HS0:IHL9HA f.HHH[]A\A]A^A_MLHMD$$L$HH$8HwfDt$xt$|Hc|$|H|$HAHH ףp= ףHHD$8HT$8H?HH)HL IL9L$81HufDHhLL$8LHPt$@H$$xy;T$@tsxop, Hl$0H\$X@DŁp, HAAAHcHH9‰H$(8uAtHϐIDD$(H$H$(T$0HDD$(tL$@9$H$8fL$(1MtDt$D\$HHDD$TLt$0>fLH)HHH$(H$H$(AHtHLILH?HHI9tMyHL)HLDHDt$D\$HHDD$T9H0DD$(H$(H$H$(T$0DD$($$$Ht$`D$DD$|D$$H|$8H\$XHl$0D$$D$$$sH$(HH9@H?@8u(HHAHHH9HOH$8LLHH$8ID$|E1u E1t@tA@:H5g1ID$HD$t$dL9MtbI$E,ED0;KH$I/HH$t\+D$ Ł'LLt$D$MLt$IuHHdHHLxXIdL>uA:5\$tbA<$IFH9D$HAnL1AD$dL>Lt$ofDH;:1nH|$`LL>D$0L$LtIFH9D$+AnAH|$thH9D$ +\$~8Ht$HcÃHLHD$ HpH)fDXHHH9uHD$ HHD$(HB!H9D$t1A.IFH9D$H|$0D$0E11+HtyDEA wFDt ESEEk BlЁ:@/uAA%륅. AH1|AL$0Afffff.Hl$Ld$HLl$H\$HHHH(IMH]HHH vHGhHRH@T HOpH4RHHqHt$FSHHHIQLRILAPd%A6HHT$D $AHD$HHHlId%uvHD$Ht1MtIHX@ !$uH]I$HL%HHl$0H\$(Ld$8Ll$@HHfE161d%wdH<%d4%HHQd%AFH^H KHAUHvSHH(HH_pHGhHQH@J H*H4IHHsHHt$FHHHRJLRILEHEd%A6HHT$D $AHD$HHHkId%uPHt$1Ht MtIHFV t( $uHDH([]DE1eH1d%udH<%d4%HH{d%A&$H\$Hl$Ld$Ll$Lt$H$H$H)H9HCH)H9 $H{$HHL,PAUHt@He$IIN,+IUH H9{AMfH H9aIL$ $A 9$9L%$L$9svL4IKL2Hd<%t$T$DD$HHO42 AMIO fAIM1fDd<%to$A f$9uAUfd<%tAD$ԋD$9K$vd<%t6$D$ԋD$HHH$fAEAEH:HrBHH$Hf@d<%t$d<%tBH\$Hl$Ld$Ll$Lt$fDIUH*H9TDIN,+AMfuIU5EmHd$EIN,+UHAWAVAUATSHL$AIHHH)H H9L%$1HIHMIfDH8H9s5LH#H9uLHKT HP(M!L!L9IGH9HGH8H9rHHIH(\(e$$LdHHIH=l$LH)HHd$HHXHHHH12$"$2HDžP>HDžH ]LuL}HMH]HsecondsAFEEHXHEHEh0H=$EIG H]Ef@@EsAH=$HAHD(H5$HH)H\$HH$/H5$Hx~$H.profile@HB1HAHƿx%=HA;KDdD0H`D?HHL16He[A\A]A^A_$HDžPHHDžH[HAU;KdD0sfHPHXHPH HJH9Pt8DH c$Hھ;K1DHH8HPE11EHDH(L(HXH MH@IPMlIEL-e$HN$BLLuFAPu>Ix(LL(L0"L(L0u AEMHPL+H11HOA;KHH$H81HBHH)HD$HHH@F"H5$1DHH#PHAfHa$H@DHH#PoH[Hd8tAo;KH8KALL2@t ftHzA@L(@@1t ftH$@HHHXL(L0HHQ$L(L0H.$LX9$/$ NL$9s$HtdHkL$H$H LH =$LZHHHH=$HHHI<8LfOf0uH$I)L9Xs01LHXHƸHwHv91HHXHL(%$HHI9vFHXL1HH1IĸIf5'#fL1HHX1HHZHHHHkHHHPHPL;K1UHH]LeLmLuIL}H@IIEP@Ht`lLhkLhIIH=$HEHUHuH}LpPHLeLMHEHELpxLmHEDuHEcALH}+`d@Ht `l,HEH]LeLmLuL}fH=$]H$MMI,M1H$HH=$lAHHHt IL9wL9L1Lh蔁Lh@IiĐltHlTfDMt$MO|=MHL)L9MFMEO MHL)L9MPMOIHL)H9SIBHHD$8|IHHHT$PHH+T$PH9HVHHT$@HD$PHt$@HH)HD$hHH9iHVHHT$HHD$hHt$HHH)HD$`HH9HVHHT$01HD$`Ht$0HH)HD$XHH9iHvHtMHT$XLD$LL$LT$ L\$(HLD$LL$LT$ L\$(HL$0H|$XH9H=$HH+T$XHL$0HpHHTHt$H HHH!H|$XHHDL$H+t$XH9rHT$HH|$`H:U11fHHIT@H9H HHHtfHHIHztH n$HBHJ 0H;=?$HR$MHptIHL)HITf.I9H HHHt+fHH}@HHIT@H9H HHHtfHHIHztH $HBHJ H;=$H$MHptEHL)HITf.I9H HHHtkfLI<$#HHITH9H HHHt+HHHI|tHH$IDHJH;=$:H$MHpt@HL)HITI9H HHHtLI>5HHITH9H HHHtsHD$8HHHHxtH 4$Ht$8H@HH 2H;=$}H$H|$PHPtAHH+T$PHL$8HHTH9|$PH HHHtLI84Ht$8HHHLH9H1HHHtHBHT$@HHHztH q$Ht$@HBHH 0H;==$HP$H|$hHpt=HH+T$hHL$@HHTH9|$htKH HHHt+LI:7HL$@HHHTH9vH HHHtHt$8H|$PH>HBHT$HHHHztH $Ht$HHBHH 0H;=p$H$HH+T$`HL$HHpHt$HHHTH|$`HHDL$HH+t$`H9sZH HHHtJHBHT$0HHHztH $Ht$0HBHH 0H;=#THL$@H|$hH9f.UHHHHAWAVAUATSHH#H9t#@= He[A\A]A^A_Ë#BH0HiϐH}HlHMHH@Hes#AĉEID$HHH)H\$H)JLl$HHHIH)HHT$HHHUt%H1HH@HHuL1Hr L1Le 9MHcHUA|L uHI#HH9=ADIAǁHtIHBHRHt<tHcҀ<uHr9NHHHuIHCDE71DHtt$HcҀ<u9JIDD9rƒ9MHMH}HL+M̅L}IE1EEE1EAHx@A>I+m#HHtLHHH H HPHҍBt/DmDeIỈfD؃AăuLDeDmHHt HHB A<]E9EGAIID9m0EDeHx=#HeHEHu`#A<h<pHv1AHLMHHLE1HFHAHtH9t $uHFIHHuEILXdI9LHEPE1"fDHt J I1L7HMt$L9t A$uNL7IHMuII9JHDXxtUDXD@uHEHxHtHǃǃHHtt HǃE9EGHHzHytfH<uPHHHAH2ECHxH`HhLpDXHHEHHH`HhLpDX HE1LMAHu1qh@HEhUHULRArMFI u PI  tЅuUǍ9t9oL11DH1 u9tAK4ȃH9rAzd%P@Ht lPu9ugAE1E1EIDHUMA<MHH(HvHC HHSHPHEhHCHtHS HP HlH8HtZHNO#@H{8LeH{8I HtHߋGH_uHuLLeHHHXH9txAHHtHHtHAD9mv#MMHE1E1E`d@Ht lb}t$H#HHH#L;5#tRHUH:HuF"f=#}#HeHCHuHHaL=W#1oXK AcHsHU&>K1MmIHw1h=K2mH#HBH9EFHiҐH€lHH HHH޿=Kk蟳HS0Hs=K1lH5#HtKHH1LpLhLpLhuHf#H?#L@IvGMM9ML+(M9H#I9I9M9MMEH#H#}u }uH#HH8 ,#L%e#MI$HHI|I$E,L=C#MMEL -#EML+(MtMEfSHu;t3P@Ht `lLH-`d@Ht [`l_[HwH>K11`HH@HHH)HHH9t HP@Ht `lK`d@Htֿ`lHL_fff.H\$Hl$HLd$HHHHHoL'HBI9tH\$0Hl$8Ld$@HH@P@Ht`lHt$JHt$HI9t"f`d@Ht`l^f.HFhU H}GHxHFpL RILHLL$(AAAAHHt$H@P%L@ILA@uE1AHHT$(AHD$$H=LL$(Mt4H@Hv;HEIAH)HCH`}G @HHEHCHp}GHHD$MHD$LL$(H@륐IH4HKJƫ1H11x[HH I&H;SP@H HHT$H<$Ht$t `l9FH激 I1J&`d@HD\$Ht `lYHH [DSHHWHwH?\-HC[ÐSP@H0HH<$Ht$HL$HT$t `lEH I1%`d@HD\$ Ht `liYHH0[SHHOHWHwH?,HC [ÐHIH H1HHft( Ht Ht HH uHBfffff.H8 t!H8 tH8 t H8 uHHHH1HDÐHH+# #HH?HHH%HHHHHH;#sHH#fff.H\$Hl$HLd$Ll$HHIHAH=@#t^1Ҿl,y1H$H$L$L$H@1ҾlxIHlH#L%#H-#D-#H$ IDŽ$HDŽ$HD$xHD$pHD$hHD$`HD$XHD$PHD$HHD$@HD$8HD$0HD$(HD$ HD$HD$HD$!HDŽ$@BH$H$H$lHH$H$+@1H=#l1Ҿl*N1ҾlH`#s2#ÐSHH?KDC LO0EHsHC [AWHHAVAUATUSHxH7H|$hHD$P HH8HHD$`HD$`HT$`HH`uHT$PHHHT$H⟃ HHHPH@HT$XHu!DHD$XHT$XHH`uHT$HHHHT$@⟃ HH9HPH@HT$8Hu!"DHD$8HT$8HH`uHT$@HHHT$0⟃ HHHPH@HT$(HuHD$(HT$(HH`uHT$0HHHT$ ⟃ HH.HPH@HT$Hu&f.HD$HT$HH`uHT$ HHHT$⟃ HHHPH@HT$Hu!DHD$HT$HHn`uHT$HII⟃ HH LpH@Hu@IIH`uIMo⟃ HHHhH@HuHHEH`uIEMe⟃ HHtDHL[HNL@LXA L9AuBxHkHHHHEHhHEH@ddLHhL~IE1IHIGhI_TH@L}}HEHEPEHHHhE1HX%@Mt DAIDHHHHWLuLs$LhHNLHuLEHUH}`IHE&OHuHHE`xH0H}xHT$HHBHBHWៃ HU.IIE1MtfEt$DIDC|6H軴HH EHxLIL8ALHJK1:QD1@H0|RHHI8H0HwH|H0Gx>K1L1FHEd>1Džx]H} yH;Vt2HHqHuHXHƹHXHEHXH}HFHqH;uHvHDHqHr HH}Ht HRHVHMHQHt HI HJ HMHPHR HQ HPHMHJ HUHJ H,HQHUIW:u HdX#HH?K1O!#H}LEHUHu`IDH}H}ݸ1HHHv=X#e1HLI8HHHHpHHHHH=i#LHCY#LH9HB1HHHpHDHH)HT$H8HH;U>K1L1zD}HMEEHu1҉\DH0@8OHI8H@H08H#1+HU#H;`mE1E1D;m]HN< L9tIHtWxtQAIH@H`1EHBHRHu؉MIILLL19s,H1tH1HtAHЉщ0H<H[HI0Ht4HxPHLH8hu HR#H0@K1%J딄u HR#H01?K JI`AIuAIH#uyHtH@IELHL$HHL$IHIMmHRHT$Lh19D$vc$HL$LHAU$IHL$Մu HQ#H01?KHL$IIHL$WI@H#>搐UHAWAVAUATSHHXHHuHUHeE1HHAH1HBHH)LL$ILLM;ELMEHEHHEBEWEL;EHUK<1LMDUL)HLMDUEDHu HL#H01Hڿ&>KDIUHH]LeLLmL}ALuH<#I@hD|IILpbHhHHHPf:u D9bBHf:tE:Hu1ɺ HHEHE@KHE@KH1H@KHHCHH)̹Ld$ILI|$Hh@KHǹL@B LHp4I46Hp61H]LeLmLuL}ËM|tLHE@KLmHE@KL}HE;u HpJ#H211p.9p|HEh@KL}LHE;u HKD#H011 @KDAUAATAU1SHHHtfDt1H[ HuH[]A\A]DDDHuȐSHE1HH7LGHW(CHHHD$$HH[fUHAWIAVIAUIATISHHy#H#DlHEHHHDžp0lHDžxHtT@L;@r7L;Hs.@ HLH`H`HRHuH#HxH9xs'HpHHHpyf.MIH;#HHHHuHUHH\$$E1MHL1HHU1HtHtHHBR  He[A\A]A^A_H #HlI$HUE1MLLHD$$ H|d%u%lHHUHD$$7lL}H]LuEHEHEd%HUHuH}LEP4IHE-1d%u!dH<%d4%HHHuHuHHMDHtL;@r L;HH(AK111-E1IHDLHHHBHH)H|$HW'HuILDHHHHBHH)H|$H&'}It H}L1Lu-DA1H(HHH$D$ E1DHAEDPHEI AE{DHHELAEtcDPHELAEtKLH@HELAȄt1HIH AIAL1IL1uAfDD$HE1HD$H(Ð&H=ÐHE118HHHI @x?w@t HHI Lf.HHHH?Hff.HHHHHffffff.HGHtHDfDH@H#Hc0u<H t 裗7tHHDHHH @HI#HcH 0u tRf7HtHfDHHH= #t fDH2@tƇHW8Hfff.ɺ#ú############{#u#o#i#H(HHAH1HHED$H(ffff.UHHAWAVAUIATISHHXHǁ dH%(HU1H9IHHH?IH9HML5;LE1HMfDHDс@t*~A/胕A?M$`NM$HH9vII$HH?IH9rHEdH3%(He[A\A]A^A_ÐA?E108HH!HI @xM$XICD"O "m@EKc LA?ICD"CE11D8HH!HI @xE11fD8HH!HI @xM$XICD!IO!E$pAEDɃp tfDrE1APHEHHHHAH I$HfHI$`H I$HEE118HH!HI @xE11fD8HH!HI @xM$XICD!O!E118HH!HI @xICD!E11@8HH!HI @xICD!bE11@8HH!HI @xICD!*HI$`H I$H HI$`H I$HE118HH!HI @xE11fD8HH!HI @xICD!O!HIH LL)HM$ XM$ L)LHI L3E11D8HH!HI @xM$01E1fD8HH!HI @xM$(ADŽ$@E11D8HH!HI @xM$0ADŽ$@E11D8HH!HI @xM$(OI$8ADŽ$@E11D8HH!HI @xL E11fD8HH!HI @xI1CD!K!E1D8HH!HI @xLE11fD8HH!HI @xLHHULEIHMCD'I$XHULEK '>E118HH!HI @xLM$0HHULEHMADŽ$@I$XHULEI$(LHHULEGI$XHUHMLEI$(E118HH!HI @xE11fD8HH!HI @xM$XICD!O!5E118HH!HI @xLHHULEI|HMCD'I$XHULEK 'E118HH!HI @xI1CD!K!E1D8HH!HI @xLlL1fDHHdžHHu:E11@8HH!HI @xMHEE1DɃ H5zHc H@P;0fM'H0H1H2ApALDUEI42HH H0HHuHHULEDMLUHuHULEDMLUHc0H닋0H0Hw11MDHL!HH ExMJM^MRH`LL$IZoCffffff.AUATIUHSH(@t_HF8tRHL-ʯ#1H|I4uHt%AtA|tZ譋DID$8말HttH9t ATHHu@u,HU81Ht5H([]A\A]fDHt$H7fDHU8t1HuLH+I$H([]A\A]I$HT$LAWAVAUIATUHSHXH9HL$0H$HH$@H$8L%L5#HD$HT$ HL$(HPDv xIcL@H7HGf?wHcHǃHt0H9wtHcHL0HXH[]A\A]A^A_@E11HHЃHI DŽxHt$A]H@IMcC>KLtC=Hu &H1H$HCE11H0HHHI @xAH@IMcCKLtCHH1Ht$Ap"AvHH$HH|fKHHcH|0HH$HHHEafDHc<Ht0SHcHL0HHcHKSCHcHHcHt0LD0LL0LL0LD0Ht0APAH@IMcC>KTtC=Hu <WH2HyfAwHd@*SCHcHHL0Ht0Ht0HL0FKHcH9H$HH)HGHt0DCHHt0HDCHHt0HfDHt$ H$@f11HfDHLƒHH Ex_Hc7HGL@7HG=D7HGHc)f7HG@7HGHc7HG@D?HGAA уp =@"P0}MAPIу [H5=Hc HfD;<HcHt0tQv/<#<< D HH/<<HHHt E1EH0HHpMDLEH6IE1HHH0HMMH6HxHGvJ'@fDE11HDHLʃHI ExL6 H0HHc0H0H0H11DHL!HH ExHt$(Hlj$LD$LL$H$8$LD$LL$H9H@@fH9H@@SH HHH41HD IcL@0HHHH @xDqL,8AMHHLDA$LIt1HH1[]A\A]A^A_ÃKHH1Ht#ApALDT$ EIHy HfDHP)@1fD8HH!HH @xIƃrHAMf.H|$ E11fHGHHxHtLLL{efDUA@APA0HAP1I H5Hc H41A1Hǃ@CCC(C8Hr(CHCXChǃHFxǃHǃ0ǃǃǃHH)ǃH)HǃH(HH)H HH)HKHH)HK HH)HK0HJpH)HK@HJhH)HKPHJxH)HK`HJ0H)HHJ8H)HHJ@H)HHJHH)HHJPH)HHJXH)HHJ`H¨H)ǃǃH)HHǃhHƃs1HHHt$(H$DD$LL$LT$;H$HDD$HD$0LL$LT$HcHHH11@DHL!HH ExkH0H1HtAIDHEHy H fHH?0H11DHL!HH ExH0HHt$0HH$HD$8Ht$0H$LD$_Hc0HS0HHHPHHBH ZH?i_Hf1H\$Hl$Ld$HLl$HHHHHIH$HH@Hu7H=#tH5RH= #v)t = #t= #u#=#ۘ#՘#Ϙ#ɘ#Ø############p@H$tƃH$HHDŽ$@HDŽ$0HC8HDŽ$(LH$H$L$L$Hĸff.UHAWLPAVAUIATIHuSHHHUHdH%(HE1 %LHAՅu+At+LHLH'AtυtAHUdH3%(DuHĈ[A\A]A^A_*fAWAVAUATIUHSHLwLdMMHHUAօubtbH$PHt"MHHU Ѓt8u.HLHLPtu fDHĈ[]A\A]A^A_ffffff.UHHEHUH]LeHLmLuIL}H0HUIHuIHdH%(HE1jHHHMl$LMt$LLt*HUdH3%(uH]LeLmLuL}(LHLhH`HLHLdHEHL HUH]LeLmLuL}HmHAUATIUHSH?H$PHt ILI$Ѓt<u2uAHHHH1IT$H9tHĈ[]A\A]pUHHEHUHuH]LeHLmLuLL}H0HUIHdH%(HE1LHHI}uLLtOpLLuLH LhH`HLHLdHEHL HUH]LeLmLuL}HmHUIISHHH$HHdH%(H$x1HHH@HL$H$@t+1H$xdH3%(HHĈ[]D$@tH1!t$HD HHH=tLE uHLEHL H$(HCH$0fH$hfH$PHCH$xHC@%@UHAWHuAVLAUILATLPSHRPHxHUdH%(HE1HLH>utHHt ILIUЃtUuHLHLHuHUdH3%(H]LeLmLuL}@̐H`IEHLIEHHLDuHLtLhH`HL{HLdHEHL HUH]LeLmLuL}HmH$DUHHELeIHUH]LmLuL}H0dH%(HE1Hu0KHUdH3%(H]LeLmLuL}fHHUHuLHHHHLLUtlLH]LhH`HLdHLdHEHL HUH]LeLmLuL}HmHn#HSHtwtqH=#HF HHVHNH~fF t+H=#jH##H=܏#HC(H#[+H#HF(H5#f[fffff.11gHF F fN H=#SHHHVHNH~t+H=V#H#H=C#HC(Hx#[Hk#[HF(H5_#fffff.11wHJH9NHvH;rFDAWEAVAUATDd UHSHHE9H|$|HxIcEL4HcIH|$L$I4$ՅyMII$DI$Gd-IE9~2El$E9~Icĉ $H|$L4HTI6Յ $xEH[]A\A]A^A_ÐIcL4AWLzAVIAUIATIUSHHBHHD$Hx!ALLLy\$~=HcIlDHUID$A1LLIT$HELHH[]A\A]A^A_fH@tVt>~t'@t9ifuHfHfDHfD1HfH@t*p t.~0t7P@thfu,1HDHFHHFHthfD@PSIDHDȃ v[hH qHcH DHHHtApAHDH@yHIH[DHHfD11@DAHM!IL Ex?wA@tIIL HcHs@HdDHS@11@DAHM!IL Ex#@HHHH[IHÐUHo SHHH;KHpH3HB { zt 1H[]HxDHx@HxH]fHxUHl$RuEDLuHHRt+Pu8HP1HHRufDH[]fDHz|3 t ,xuHB AWAVAUATIUSHH86HD$HD$(E1E11HD$6DHD$I;$I$HfH\ CtHEHHlH9tVHM=ADLD$D|IAD$ fffA9tAL$ HL$HSLDDHHw HHHD$(HHH\ 0HD$H8[]A\A]A^A_T$f% fAD$ pHD$ffff.AWAVAUATIUSHH(H4$o Hf@rDIEHD$E1HD$9@H{tH$HHtHPH\HHPH\;CtAD$ t*HHL|M9tLMLIƅtHL$HSDLD6DNHHw HHHT$HH\;eH([]A\A]A^A_ÐH\$Hl$HLd$Ll$H8 IHIf@;{ HL$IUHHf@{ IT$HHf@oH$H9T$H $H\$Hl$ Ld$(Ll$0H9L$FH8f.H\$Hl$HLd$Ll$H8HcFIIHH|>LHL$IUHƉHcCHH| LPHSHHH$H9T$H $H\$Hl$ Ld$(Ll$0H9L$FH8f.AWAVIAUATIUSHHH8o f@DIE4HD$(HL$ E1HD$HL$<HCHD$(HSHHT$ tLH)H9H\D ECtAD$ t*HHLlM9tLML9ItHL$DHSLDLD$HL$DHƒ1pDHLD$Hw HHHD$(HAHT$ LH)H9-H8H[]A\A]A^A_fD1fff.H@t*p t.~0t7P@tI`fu,1HDHFHHFHt`fDAWAVAUATUSHHXH/LGH/AHDZ(E;HG H;#HW(H;#L%#1E1MtJH3L&fHPH9Ht#HP(HHt"HIHH9vHPHuHufDOHH1E1E1E1E1/fDPtdHHHtFI8HAuHIxL;L9wHIP(I9sHIAHufMt3EufMt)Ik}DHX[]A\A]A^A_1HX[]A\A]A^A_HMUDHMEDMtHuH/#HhLXL` L0HPqHH(IJ(H #HH(H#HW(H8#HA#H#H #H@H@H@H0H9uOH0#E1H#C(H#1HHVL9HhLXHP(IR(L`(HT#}H}HL$HHUH}I@t };HCHt$HHHHD$ H$D$ HD$HCHt$HD$HHC :HcPHH|Lc HމKIHL$8HL%HD$8HC H'@H}HL$@LHHL$@H!HcH;HTH9HL$Ic$HTH9sOH1HHH9HHHL$Mc$NDL9rHLcNDL9sH9siMcl$Nl-IcEHI|tDDHHL$8DIT1Ic$HHT$8HH9sLk HHCa[1E1SH0THH[6fDSHu[@0SHH[zf.AWAVAUATUSHHXHt$ G &HCHT$@E1HT$HD$LpHD$HHD$M9rXM9GMHT$O$>IJlHcEHH|2DHDsHL$HUHDHL$D1HHD$@H;D$ wHD$HH;D$ \M|$b@W HHL$HT$H,HRHHD$0H@HRHHD$8tH@C HkHUHt$Ld$0HLHHUHuLt$0MtHD$I;FC L-ufC L-HNLDLd$8MIVHHT$uIFH-O}#HD$1LxL9|$IlvkIlH$}#H9u,=DH+l$H }#HHEI,IH9tKtHUHAՅxLLxL9|$Ilw111DITHITHH9D$v!I|uITHITHH9D$wH|$0HT$8INIt$HBHGH9D$LHHT$8HD$0HT$(HRHD$HHT$LpHD$HT$(HMHD$L|HD$Jlu#6HEHT$HDHMtMLHuHAՅMfMHT$H|$IDHT$L<+HD$MHD$mHoHuHuHHD$HuHHHuHE{#HC fC HCHT$ H9C HsHT$ HHHXH[]A\A]A^A_C fH{1H_H9sCHDH9Hs0HHHlHMH9L$ HurHH9L$ rHPfD1Hw#HHD$ T$C %щ ȉC H9T$t%C H|$fDfLsHDE1DHD$DHT$@MnD$HD$HHT$HD$(M9rUDL9GIK\%HL$(Ht$DHIlHUHL$|$1HHD$HH9D$ rHD$@H9D$ LcHT$(HBHT$HBHD$8HD$(H|$(\HD$0HSHHCK HSHt$0H\oLcI4$HuDII4$HHT$ HHHtLL11ZW LLHj_pTAVAUATIUHSH@L5"Mt H=[x#L-x#MuDMm(MM;erLLHHMt H= x#eHIEHEIEHEAE fAE DLDHL$8HSHD"HD$8HEH@H[]A\A]A^fHIE(L*jL-w#MtuIE(LLHw#NHHw#Hw#HtIMH9s DH9rHP(H@(HuHIE(L*tHcCHH|*1H=HL$$HD$HD$HD$HD$ D$( H\$ HHD$HEHD$HEHD$HEATHUHSu []1A\DtL%"Mt H=Ov#Hv#Ht)H9kHsv#uH9ktrHC(H[(HuHVv#Ht9HJv#HCH9(t_HC(HtNHS(HC uH9kuHC(H@Mt H=u#Ht4H[]A\fHS(H1@HC(HH{hXqQff.HuHÐHH/XH\$Hl$LLd$Ll$HLt$L|$Hxt&H\$HHl$PLd$XLl$`Lt$hL|$pHxu @L耸HItHHD$t HrHD$EeHD$IHD$ AttEEApA EPAFfDKPIUIHHD$ t%AHDEHHT$ yH HL$ A}MetDA$IxE,$1I1fDA$IHЃHH ƄxI44HHt$3HL;d$HD$AHl$0H\$8AApHD$(At A M<$IMtAHDIEyM?AuL1 H HcHf.H8APALA HEJc HfI$IHtAHDHEyHAA EtAt@1APL1 XH HcHfD1YuM<$IE11ɐA4$IHHI @x?@HHHI Mc<$IE<$IyE<$IkE11fDA4$IHHI @x>I$I11@A<$IHHH @x11f.A<$IHHH @x?b@YHHHH CIc$I6A$I)A$II<$IHtAHDHEyH?A$IxL|$L9|$IL9|$L9d$LDI<$IIc<$IA<$IA<$I{11E$ILƒHH ExN11fE$ILƒHH Ex?"A@HHHH f.1AUI11EEIL!HH ExIUI{11f.EEIL!HH Ex?EA@;HHH )IcUIAUIfA@APlA01 XfDL1efDA@APH"{JHu#EDH;Hkl>Hd>Ht'HH{HKtHtEDfDH="H{Jt#>Hh"{JH[] USHHcV#HRf.H{H+=H{HG HtH{=H{HG HtH{=H{ HG HtH{ =H{(HG HtH{(t=H{0HG HtH{0\=H{8HG HtH{8D=H{HHG HtH{H,=H{PHG HtH{P=H{XHG HtH{X 5<#u3H<#HpH<#='R#t z<#u( p<#uH=e<#H]HĀH=I<#HHĀSHKHHKsHHHKr[USHHŠdH]CuH[]ËxHcǃHHt6tHcHǃT1HǃH Ht6 tHcH ǃ 1Hǃ H(Ht6tHcH(ǃ0Hǃ(fǃdHEH@H[]H[HUSAGE: %s DATA_FILENAME INDEX_FILENAME PROGRAM [PROGRAM_ARGS]* Designed and implemented by Andy Hauser . ffindex_apply.cffindex_index_parse%s:%d %s: %s: %s %s %zd %zd tree is NULLffindex.cWarning: could not find '%s' mmap failedFailed to allocate %ld bytes malloc failedindex with 0 entriesfreadffindex_insert_filestreamffindex_insert_memoryProblem with data file. Is it empty or is another process readning it?Designed and implemented by Andy Hauser .ffindex_tree_unlinkffindex_index_parseffindex_mmap_dataffindex_insert_filestreamffindex_insert_dirffindex_insert_memory  @@  < 8P@P P@h@@  @ @@@@@ @H@@S@(S@S@S@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@`S@`S@`S@`S@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@S@S@S@S@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@S@S@S@S@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@TR@R@R@R@R@JX@Y@@X@[@X@X@X@X@X@X@X@X@X@X@X@X@Z@Z@Z@Z@X@X@X@X@X@X@X@X@X@X@X@X@Z@Z@Z@Z@X@X@X@X@X@X@X@X@X@X@X@X@Z@Z@Z@Z@X@X@X@X@X@X@X@X@X@X@X@X@xX@xX@xX@xX@p`@a@p`@p`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@Pa@a@Pa@Pa@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@Pa@a@Pa@Pa@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@3`@b@b@P`@b@rc/proc/self/maps%lx-%lx/proc/mounts/etc/fstabtmpfs/dev/shm/dev/shm/sem./proc/self/task/%u/comm FATAL: exception not rethrown FATAL: kernel too old FATAL: cannot determine kernel version /dev/full/dev/nullcannot set %fs base address for thread-local storageunexpected reloc type in static binaryUUUUUUUU?33333333*$I$I$qqqE]tEUUUUUUU;;I$I$I8885P^Cy 0 0 0 袋. ,d! p= ףp= ؉؉ %^B{ $I$I$ =B!B|PuPuPqq-c/bin/shexit 0w+@A@A`AEEA2ApAPA?AA0E8A7A,A`8A8A TA0TA@A@A AEEA2ApAPAP@AA0E8A7A,Ap8A8A TA0TA@A@A AEEA2ApAPAP@AA0E8A7A,A`8A8A TA0TALIBC_FATAL_STDERR_/dev/tty======= Backtrace: ========= ======= Memory map: ======== ,ccs=@A@CA8APA@YA4A2A;APA?ABAE8A7A,A`8A8A TA0TA@A@CA1APA@YA4A0AP+APAP@A,AE8A7A,Ap8A8A TA0TA@A@CA.APA@YA4A`.AP,APAP@ABAE8A7A,A`8A8A TA0TAvAzAvAPAvA0VAjA`xAPAhAQAPhATATASAQASA TA0TAcorrupted double-linked listTOP_PAD_PERTURB_MMAP_MAX_ARENA_MAXARENA_TESTTRIM_THRESHOLD_MMAP_THRESHOLD_ Arena %d: system bytes = %10u in use bytes = %10u Total (incl. mmap): max mmap regions = %10u max mmap bytes = %10lu free(): invalid pointerfree(): invalid sizeinvalid fastbin entry (free)malloc(): memory corruptionrealloc(): invalid old sizerealloc(): invalid next sizerealloc(): invalid pointermalloc: top chunk is corrupt*** glibc detected *** %s: %s: 0x%s *** munmap_chunk(): invalid pointer double free or corruption (fasttop)free(): invalid next size (normal)free(): invalid next size (fast)double free or corruption (top)double free or corruption (out)double free or corruption (!prev)free(): corrupted unsorted chunksmalloc(): memory corruption (fast)malloc(): smallbin double linked list corruptedmalloc(): corrupted unsorted chunksmalloc(): corrupted unsorted chunks 2break adjusted to free malloc spaceAAHA`AAȊAA AA`AAAYAAAAAAA>AAAhAAAAA@AAAMpNPO0PQQRSTpUPV0WXXYM 9`:;< >`?@A C`DEF H`IJ8Unknown errorUnknown error ^0`a0cd0fg0ij0lm0op0rs] 0P` @`@pЂ0` Pu`~}P}|0|{{zy`yx@xw wv-PBzPBQBjQBQBRBzRBRBPBvPBQBfQBQBRBvRBRBPBrPBQBbQBQBRBrRBRBPBnPBQB^QBQBRBnRBRBPBjPB QBZQBQB RBjRBRBPBfPBQBVQBQBRBfRBRBPBbPBQBRQBQBRBbRBRBPB^PBPBNQBQBQB^RBRBPBZPBPBJQBQBQBZRBRBPBVPBPBFQBQBQBVRBRBPBRPBPBBQBQBQBRRBRBPBNPBPB>QBQBQBNRBRBPBJPBPB:QBQBQBJRBRBPBFPBPB6QBQBQBFRBRBPBBPBPB2QBQBQBBRBRBPB>PBPB.QBQBQB>RBRBPB7PBPB'QBQBQB7RBRBPB0PBPB QBQBQB0RBRBPBSB@SBcSB`SBsSBpSBSBSB&SB0SBSSBPSB#SB SBSBSBSBBTBTBTBUBcUBUBUBFVBVBVB%WBtWBWB XB\XBSB=TBTBTBUB^UBUBUBAVBVBVB WBoWBWBXBWXBSB8TBTBTBUBYUBUBUBXBSBTBfTBTBTB@UBUBUB#VBkVBVBWBQWBWBWB9XBSBTB^TBTBTB8UBUBUBVBcVBVBVBIWBWBWB1XBSBTBVTBTBTB0UBzUBUBVB[VBVBVBAWBWBWB)XBSBTBNTBTBTB(UBrUBUB VBSVBVBVB9WBWBWB!XBSBSBFTBTBTB UBjUBUBVBKVBVBVB1WB|WBWBXBdBdB0dBHdB`dBxdBpcBcBfBfBfBfBgB0gBeB`fBО0PpЧ0PP>@q@0 Fº»`5111Qq.ƹ6V{{{{{;{`````p `}BʔBjBBBjBʖB*BBƔBfBBBfBƖB&BB”BbBBBbB–B"BBB^BBB^BBBBBZBB BZBBB BBVBBBVBBBBBRBBBRBBBBBNBBBNBBBBBJBBBJBB BBBFBBBFBBBBBBBBBBBBBBB>BBB>BBBBB:BBB:BBBBB6BBB6BBBBB2BBB2BBBBB.B~BޕB.BBBޔBB'BwBוB'BBBהBB BpBЕB BBBДBBBBB×BBBBvBBBBsBpBӗBЗBNB5B0BBpBBB B[BڣBڣBڣBբBڣBբBӣBբḄBբBţBBBBBBڣBڣBڣBբBڣBբBӣBբḄBբBţBBBBBߣB  @     @ @@@`!@"@ #@ %@ )@ @,@0@9@:@;@<@=@>@?@A B C D E  F@ @G@ H @0I@@J @ `K@ L @ M@ N@``@@f@ g@@h@x@y@z@{@|@}@ @@     @@@ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ ANSI_X3.4-1968//TRANSLITI I`IUIjC`?CUI`IcCGETCONF_DIR/usr/libexec/getconf/proc/sys/kernel/ngroups_maxILP32_OFF32ILP32_OFFBIG/proc/sys/kernel/rtsig-max*BBBBٿBBBeBeB=B=B=B=B=B=B=B=B=B=B=B=B=B=B*B*BBoB*BB=B%h %e %T [%d]/dev/console%s out of memory ???%s: %m %s: %m /proc/meminfoMemFree: %ld kBMemTotal: %ld kB/proc/stat/proc/cpuinfoprocessor/sys/devices/system/cpu(+0x-0x[0xcannot create TLS data structuresdlopenxCCXCCCCCC8CCCCCCCCCCCCpCCPCCCCCCCC0C/var/tmp/var/profileGCONV_PATHGETCONF_DIRHOSTALIASESLD_AUDITLD_DEBUGLD_DEBUG_OUTPUTLD_DYNAMIC_WEAKLD_LIBRARY_PATHLD_ORIGIN_PATHLD_PRELOADLD_PROFILELD_SHOW_AUXVLD_USE_LOAD_BIASLOCALDOMAINLOCPATHMALLOC_TRACENIS_PATHNLSPATHRESOLV_HOST_CONFRES_OPTIONSTMPDIRTZDIRLD_WARNLD_LIBRARY_PATHLD_BIND_NOWLD_BIND_NOTLD_DYNAMIC_WEAKLD_PROFILE_OUTPUT/etc/suid-debugMALLOC_CHECK_LD_ASSUME_KERNEL/proc/sys/kernel/osrelease-aliasmoduleISO-10646/UCS4/=INTERNAL->ucs4=ucs4->INTERNALUCS-4LE//=INTERNAL->ucs4le=ucs4le->INTERNALISO-10646/UTF8/=INTERNAL->utf8=utf8->INTERNALISO-10646/UCS2/=ucs2->INTERNAL=INTERNAL->ucs2ANSI_X3.4-1968//=ascii->INTERNAL=INTERNAL->asciiUNICODEBIG//=ucs2reverse->INTERNAL=INTERNAL->ucs2reverse.soUCS4//ISO-10646/UCS4/UCS-4//ISO-10646/UCS4/UCS-4BE//ISO-10646/UCS4/CSUCS4//ISO-10646/UCS4/ISO-10646//ISO-10646/UCS4/10646-1:1993//ISO-10646/UCS4/10646-1:1993/UCS4/ISO-10646/UCS4/OSF00010104//ISO-10646/UCS4/OSF00010105//ISO-10646/UCS4/OSF00010106//ISO-10646/UCS4/WCHAR_T//INTERNALUTF8//ISO-10646/UTF8/UTF-8//ISO-10646/UTF8/ISO-IR-193//ISO-10646/UTF8/OSF05010001//ISO-10646/UTF8/ISO-10646/UTF-8/ISO-10646/UTF8/UCS2//ISO-10646/UCS2/UCS-2//ISO-10646/UCS2/OSF00010100//ISO-10646/UCS2/OSF00010101//ISO-10646/UCS2/OSF00010102//ISO-10646/UCS2/ANSI_X3.4//ANSI_X3.4-1968//ISO-IR-6//ANSI_X3.4-1968//ANSI_X3.4-1986//ANSI_X3.4-1968//ISO_646.IRV:1991//ANSI_X3.4-1968//ASCII//ANSI_X3.4-1968//ISO646-US//ANSI_X3.4-1968//US-ASCII//ANSI_X3.4-1968//US//ANSI_X3.4-1968//IBM367//ANSI_X3.4-1968//CP367//ANSI_X3.4-1968//CSASCII//ANSI_X3.4-1968//OSF00010020//ANSI_X3.4-1968//UNICODELITTLE//ISO-10646/UCS2/UCS-2LE//ISO-10646/UCS2/UCS-2BE//UNICODEBIG//ICICICI oCI0ZC.I0MC`?CNIGC^Ip?CIjC`?CIcCIp{CIsCGCONV_PATH/usr/lib64/gconv/gconv-modules.cachegconvgconv_initgconv_endLOCPATHLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMELC_MESSAGESLC_PAPERLC_NAMELC_ADDRESSLC_TELEPHONELC_MEASUREMENTLC_IDENTIFICATION +3?HP[hw   `CLC_ALLLANG`JK`K` K@KK KK`K KKKn- /usr/lib/localeVo. IIIIIIIII I4I@I  /usr/lib/locale/locale-archive     `     `  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   ~~~~>>xx(( 8HHHHHIupperloweralphadigitxdigitspaceprintgraphblankcntrlpunctalnumtouppertolower{JVIIJIJJJJJJJHTIKI4KqKDJJFJJHJLJJTJ\JdJlJtJ|JJJIKI4KqKDJJFJJHJ0123456789J`J*JUJ@jJI J J J J@ J JJ`JJ JJJ JJ  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~ 23IRRSS                    " $ % & / 5 6 7 9 : < D G H I _ ` a b c !!!!! ! ! ! !!!!!!!!!!!!!!!"!$!&!(!,!-!.!/!0!1!3!4!9!E!F!G!H!I!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!""""#"6"<"d"e"j"k"""$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$#$$$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%% %%%%%$%,%4%<%%t*u*v*00Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2222222222222222q3r3s3t3u3v333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333) MNOPRTUVWYZ[\_`abcdefhijk  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    !"#$%&'()*+,-./0123456789;<=>@ABCDFJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ %,37:>BFJNRVZ^aeimquy} !#%).38=@EJMPSVY\_behlorux{ $'+06:=AFILORUY^beintx{  !&+05:?DINRW\`dhlpux| $*06<BHNTZ^bfjnrvz~ #(-27<AFKPUZ_dinsx} "',16;@CFILORUX[^adimrux~ &,159>BFJNRVZ^bfkquy} "+/37;?CGKOSW[_cgkquy}             ! # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n p s v y |          ! $ ' * - 0 3 6 9 < ? B E H K N Q T W Z ] ` c f i l o r u x { ~          # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n q t w z }          " % ( + . 1 4 7 : = @ C F I L O R U X [ ^ a d g j m p s v y |          ! $ ' * - 0 3 6 9 < ? B E H K N Q T W Z ] ` c f i l o r u x { ~   #&),/258;>ADGJMPSVY\_behknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy|  !$'*-0369<?BEHKNQTWZ]`cfilorux{~  #&),/258;>ADGJMPSVY\_behknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy| (C)<<-(R)u,>> 1/4 1/2 3/4 AExssaeIJij'nOEOEoeoesLJLjljNJNjnjDZDzdz'^'`_:~ -------'','"",,"+o...... ``````<>!!/???!!? RsEURINRa/ca/sCc/oc/ugHHHhIILlNNoPQRRRTEL(TM)ZOhmZBCeeEFMoiDdeij 1/3 2/3 1/5 2/5 3/5 4/5 1/6 5/6 1/8 3/8 5/8 7/8 1/IIIIIIIVVVIVIIVIIIIXXXIXIILCDMiiiiiiivvviviiviiiixxxixiilcdm<--><-><==><=>-/\*|:~<=>=<<>><<<>>>NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUSSPDEL_NL(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(0)-|+++++++++o::====== =(21)(22)(23)(24)(25)(26)(27)(28)(29)(30)(31)(32)(33)(34)(35)(36)(37)(38)(39)(40)(41)(42)(43)(44)(45)(46)(47)(48)(49)(50)hPadaAUbaroVpcpAnAuAmAkAKBMBGBcalkcalpFnFuFugmgkgHzkHzMHzGHzTHzulmldlklfmnmummmcmkmmm^2cm^2m^2km^2mm^3cm^3m^3km^3m/sm/s^2PakPaMPaGParadrad/srad/s^2psnsusmspVnVuVmVkVMVpWnWuWmWkWMWa.m.BqcccdC/kgCo.dBGyhaHPinKKKMktlmlnloglxmbmilmolPHp.m.PPMPRsrSvWbfffiflffifflst+___,.;:?!(){}#&*+-<>=\$%@!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzACDGJKNOPQSTUVWXYZabcdfhijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABDEFGJKLMNOPQSTUVWXYabcdefghijklmnopqrstuvwxyzABDEFGIJKLMOSTUVWXYabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789579023456789libcPOSIXANSI_X3.4-1968`JK`K` K@KK KK`K KKKIJJ{J{J{J{J{J{J{J{J{J{J{J{J{JdCTCDC;C0C#CC CCCpCOUTPUT_CHARSETcharset=LANGUAGEmessages/usr/share/localeldlilolulXI/usr/share/localeCCC_C;CCCCCCCC1CEC"C"C"C"C"C"C"C"C"CEC"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"CC"C"C"CCC"CCC{CC"CC"CCLCLCLCLCLCLCLCLCLCLCCECCCLCC"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"CC"C"C"C"C"C"C"C"C"C"C"C"C"CC" '+"5                        plural=nplurals= J J0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZto_outpunct(nil)(null)*** %n in writable segment detected *** *** invalid %N$ use detected *** 2D2D2D2D2D2D2D2D2D2D2D2D2D2D[0D0D(1Df+Dz9D>D7DBD:5D5D5DW'D:?D2D2D2D.D.D.D.D.D.D.D.D.D.D.D.D.D.DQCD?D@D9D;DD>DBDe%D#=D.D.D.D.D.D.D.D.D.D.D.D.D.D.D-D.D.DQCD?D@D9D;DD>DBDe%D#=D.D.D.D.D.D.D.D.D.D.D.D.D.DNBD.D.D.DQCD?D@D9D;D.D.D.D.D>D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.DBD-D-DQ.DQCD?D@D9D;DD>DBDe%D#=D.D0D.D.D.D.D.D.D.D.D.D.D@DBD-D-DQ.DQCD?D@D9D;DD>DBDe%D#=D.D0D.D.Dy?DDDBDFD8D"9DDD@D@DBD-D-DQ.DQCD?D@D9D;DD>DBDe%D#=D.D0DCD       @mADPAPA@YA0VAjAQAPAhAQAPhATATASAQASAnaninfINFNANnaninfINFNAN0.0001(nil)(null)DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDIDDDlDDDDEDD3DDDDDDDDDDDDDDDDDDDDDrelocation errorsymbol lookup errornormalprotected [%s] undefined symbol: cannot allocate memory in static TLS blockcannot make segment writable for relocation%s: Symbol `%s' causes overflow in R_X86_64_32 relocation %s: Symbol `%s' causes overflow in R_X86_64_PC32 relocation %s: Symbol `%s' has different size in shared object, consider re-linking %s: no PLTREL found in object %s %s: out of memory to store relocation results for %s cannot restore segment prot after reloc (lazy) relocation processing: %s%s XG@ZG[GXGXGH[G@ZG@ZGXGXG[GXGXGXGXGXGZGZG`ZGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGYG [Gx]G]G(_Gx]Gx]G^G]G]Gx]Gx]Gs^Gx]Gx]Gx]Gx]Gx]G[^GB^G^Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]Gx]G]G^Gunexpected reloc type 0xunexpected PLT reloc type 0xcannot apply additional memory protection after relocationDYNAMIC LINKER BUG!!!%s: %s: %s%s%s%s%s fatalcontinued%s: error: %s: %s (%s) out of memoryerror while loading shared libraries =???/proc/self/exeGLIBC_PRIVATE_dl_open_hookIGNOREUIgconv_trans_contextgconv_transgconv_trans_initgconv_trans_end^[yY]^[nN]{JKKgKgKJ{J.gKgKgKgKgKgKgK(K(K(K(K(K(K(K(KI(K(K(K(K(K(KgKgK(K(K(K(K(K(K(K(K(K(K(K(K(K(Ku'u'J{J.IgKgK.JSunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturdayJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberAMPM%a %b %e %H:%M:%S %Y%a %b %e %H:%M:%S %Z %YSunMonTueWedThuFriSatSundayMondayFridayJanFebMarAprMayJunJulAugSepOctNovDecMarchAprilJuneJulyAugustAMPMTuesdayWednesdayThursdaySaturdayJanuaryFebruarySeptemberOctoberNovemberDecember%a %b %e %H:%M:%S %Y%m/%d/%y%H:%M:%S%I:%M:%S %p%a %b %e %H:%M:%S %Z %Y{JopKtKxK|KKKKKKKKKKKKKKKKKKKKKKKKKK KKKKK#K-K5K>KGKJKMKJJJgKgKgKgKgKgKgKKKKKKKKKKKKK,KKHKXKhKxKKKKKKKKK0KPKK KK8KLK`KxKKKK|KKKhKKKIIIIIbK:0dKfKhKfKgKjKKJ{J)J%p%t%g%t%m%t%f{JxKgKgKgKgKgKJ%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N{J KgKgKgKgKgKgKgKgKgKgKgKJ+%c %a %l{JKgKgKgKJ{JfKJISO/IEC 14652 i18n FDCC-setKeld Simonsenkeld@dkuug.dk+45 3122-6543+45 3325-6543ISO1.01997-12-20ISO/IEC JTC1/SC22/WG20 - internationalizationC/o Keld Simonsen, Skt. Jorgens Alle 8, DK-1615 Kobenhavn Vi18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999{JKXKK KK(K6KgKDKgKgKgKHKLKKJ{J@!K@"KJ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~inity d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJ d'o#ſt[Am-jd8n헧?O>. 8/t#ڰͼ3&N|.[Ӿr؇/PkpnJؕnq&fƭ$6ZB<TcsUe(U܀n_SlgrwFo]:FGWvyuD;s(!>p%"/.Q]OᖬW2Sq$^c_䭫*sf\wI[iCsFEHis 84c)r+[[!|nN5 }L,D4fl}C}Ο+#U>#`e!Q4\Ycɟ+1*ZibBtz["؊4س?ŏmk1Ke6ukG܉ـ( f13j~{j6h߸\A)\='_Djzp؊4|ElݾV}*@|gu "Ωo$po?b(UxI>Nkw};u  #6'0q'"(\؄t.z-TMеub <4 9Ԣ7.~2!'{n $-PԓX+1"#+%? D~br*~xxކzos{'~j=jr1|òAv09&Ѷ~j2=_+0cm-X%<|b 7w ʐ,5P6xPnx [4? E,W8 9qIHۚ풴lMP#*wg:8-ñj@?F[$GtJL0s-o|;#o`Is{Kҵ65m1 k?f%(炸r;v=4tPw?j&ATN4 @SZ E3TɤAc+;={CpfU,ie.O\Oߢݭ9^2XX%-VNqv4§v=ЉMOT+}\ IA?7߻D!WDGn®8pp;3,f%k;ܑyٸZNh.ltH Ic/~=otgx!RJݼ-ݎW5YAV9 T<!{>;b.w_ W5ƶ(NT ]=!̇odI@BuhؖҋcU4ph{3'"2I%% dKE)0b 62 kg SP)E7J G |l'5$50123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_dlfcn_hook%s%s%s%s%s%s: %sunsupported dlinfo request5HP5H`5H5Hp5H5H5H5H5H5H05Hinvalid namespace&(*,.02p4`6P8@:0< >@BP%p` P@0 GJ@LNPS@UWY\@^`be@g F;Zx0Nm<[y1On/proc/netnet/unix net/if_inet6net/ax25net/nr net/rosenet/ipxnet/appletalksys/net/econetsys/net/ash net/x250123456789abcdefgmon%s: cannot open file: %s %s: cannot create file: %s %s: cannot map file: %s %s: cannot stat file: %s %s: file is no correct profile data file for `%s' Out of memory while initializing profiler invalid mode for dlopen()cannot extend global scopecannot create scope listno more namespaces available for dlmopen()invalid target namespace in dlmopen()opening file=%s [%lu]; direct_opencount=%u cannot load any more object with static TLSTLS generation counter wrapped! Please report this. closing file=%s; direct_opencount=%u file=%s [%lu]; destroying link map TLS generation counter wrapped! Please report as described in . calling fini: %s [%lu] dlcloseshared object not openinvalid mode parameterDST not allowed in SUID/SGID programscannot load auxiliary `%s' because of empty dynamic string token substitution empty dynamic string token substitutionload auxiliary object=%s requested by file=%s load filtered object=%s requested by file=%s cannot allocate dependency listcannot allocate symbol search listFilters not supported with LD_TRACE_PRELINKING calling init: %s calling preinit: %s checking for version `%s' in file %s [%lu] required by file %s [%lu] no version information available (required by cannot allocate version reference tableunsupported version of Verdef recordweak version `' not found (required by of Verneed record RTLD_NEXT used in code not dynamically loaded1_(\Hn%^cJ>6PPPP-D'' 'T D 4  DDtT$L'                 '' 'g''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''d kkEPk\gr}k 2\i]R\9F\!  pdYMggg"X#H#8#"""""""(#" <=== <\:\:\:\:6=(== :>h<(:(:(:(:==->h<9I?;??99999?x??9=}>o>e>=9999>P>[>=stack smashing detected*** %s ***: %s terminated _A IIIPIIIIIIIПII@I0IIzRx Lл\BBB B(A0A8J 8A0A(B BBBG l$MMI@[@ 808 0$("AZ E AD8MD@H\pRD N F yT|BBE D(A0D` 0A(A BBBK D 0C(A BBBA ,(UBAD JABX`sNP} E <BNPsL\BEB E(A0A8DP 8D0A(B BBBA  AZKNP|4ADG J AAH d AAJ <0"AZ E A\@"AZ E A|P4HADJI AAF fHA\BBE D(A0D@( 0D(A BBBA k 0D(A BBBA L, KBEB B(D0D8J  8C0A(B BBBG ,| HRQP E $HTQ0O D LhBEB B(D0A8G" 8A0A(B BBBJ L$BEB E(D0D8G 8C0A(B BBBt(,0AKGAA DQ K H @zRxLG GD  "H LlG GD T "H LfG GD  "H L 5G GD  "H L\G GD y "H LG GD 0 Q"H LG GD  "H LLqG GD  "H L@G GD U "H LG GD  "H L<G GD  h"H LG GD z "H L|G GD 1 "H L,KG GD  *"H L|G GD  "H LG GD V d"H LG GD  "H LlG GD  "H LVG GD { "H L %G GD 2 "H L\G GD  "H LG GD  e"H LG GD W "H LLaG GD  "H L0G GD  \"H LG GD | 7"H L<G GD 3 9"H LG GD  z"H LlG GD  "H L, ;G GD X "H HLh2BDB B(A0A8D@8A0A(B BBB44XTBIA A(A ABB,l0BHA !ABA A ,`BHJ  ABA D A $ nMI0f A L4B BBB B(A0F8D 8D0A(B BBBA <BLB A(A0R (A BBDC HA A LHBBB B(A0A8Gj 8C0A(B BBBA 4x%DLLDk A T A l$mMV` G ,Ds I g I I G Ip$hdMMIP D  4 Ld|Lt G GD  "H L G GD  "H $4MN0q D L<G GD  #"H LG GD n "H $MI0z A LG GD o "H LTG GD # "H ,ACG0\ CAA XHTXDO,` DX\` tXP$HjMI B H  ',D!\ t !LGG GD  Y"H LG GD c "H ,0wM`p B $AI  AG LC GD  "H L,C GD o "H L|iC GD " "H L4C GD  "H LC GD  "H L BBB A(A0a (A BBBH c (A BBBA #LC GD P "H LDBBA A(G0g (C ABBD  (F ABDG Lt CE GD C "H L CE GD  "H L CE GD  "H Ld CE GD k 1"H L[C GD $ "H L$BBB B(A0A8Gk 8C0A(B BBBH LTC GD 3 0"H LeC GD  "H L0C GD  "H d|  '  $<;Tl<wBBB D0 BBBA0(<eBBB D0 BBBA0LC GD  o"H LLuC GD ~ B"H  ]LpC GD I "H L8C GD  "H t!H!!x!p!h!`"h"`4"hL,LC GD  "H L|C GD  "H LC GD  "H LC GD 6 d"H LlxC GD  8"H LCC GD  "H L C GD O "H L\C GD  ~"H LC GD  <"H LoC GD h "H LL:C GD  "H LC GD  "H  &|gzPLRxI $vLE0fA0DD6*vLBBB B(D` (B BBBA & & & & "' ,' D' \' t' gLl!v D GD  "H L!? D GD  "H ,( 6D( \( t( ( ( V( 6(Hq$(LN0_ G )bD{ A 4)E$L)LQ A t){) >DT A $)@,D N F X H $)H<D N F Z F ,`@vLLBA EG]H ,*D*,\*AAG0| AAA $*`bDq K L A T*H*L$ G GD R  "H L%G GD  "H ,+8AC FRKS F ,+kAC L D +6L+@BGB B(A0A8G\ 8A0A(B BBBD L,&G GD  "H L|&G GD u  "H ,P -XAb E ,$-(AH H B ^ A T-DNvLSRALd[vLz^ASfBB D8 BBBA8zRx zRx 8$D.$\.t.R.PxDJ A ..$.L.D\ H K E /@G,/D$D/[bPW G l/ AD/(! D4/ !BKA A(D0(A ABB/!Vp/!\$08"*BAdB$,0@"0BAjBTT0H")RJWBB B(B0A8DP0B(B BBB$0 #"AA^A$0(#(AAdA,00#BBJ(fBBA($,1#RBALB\T1#VbAPVBB B(A0DP(B BBBGP1$6A \1%Qac1`%Qac2%Qac2%,42&PACGm AAF d2'Qac|20(Qac$2x(AD0i AA 2)Wdf2H)Qac$2)AD0i AA 3*Qac,3`*WdfD3*Qac\3*Qact38+Qac3+Qac3+Qac3,Qac3X,Wdf3,Wdf4,D j A $4h-D l A D4-D0f A d4h.Wdf|4.Wdf44.ADJP CAE L AAA 4/&4/D b A 5h0E50L/0C GD  z"H 5H0650XL/0C GD t ]"H 6x0#zRSx|0 ww( w0 w8 w w wwwwwwwwwwww6(0G A 626272 72ZGn K Y,<7P2AL FG.s C G 4l72AG B AE ^ AA I AA D783AGG G AAH D FAE Q CAA D73BGD A ABG { ADH s AVA 48H4 L8@4'd8X4&|8p48x48p4!,84WAD f AD J AE 84dD v F L28G GD " "H LD38G GD " "H L38G GD ["  "H L3e8G GD " "H 4T:3AAM S CAJ AC:4)Dd$:4aDP G :7,:7MZ@5 D D;X9BGD D@  DABD e  AAED D\;:BJA G@p  DABE b  AAEG ;:L5AC GD * d%"H L5@C GD ) 6("H L<6@C GD o) C("H L6i@C GD ") ("H L64@C GD ( 7("H L=9Ld=9"BBB A(A0a (A BBBH o (A BBBA ===?$=?QBID J >A$>A{GJ A D>(CcL\>C,BBB B(A0A8DP  8A0A(B BBBG L>`EuBBB B(A0A8D`) 8A0A(B BBBG >G3Am<?GBOL D(C0](A BBB<\?HBYI A(D0N (A ABBA ?PH?HHJN ,?HPs     ~ }|{?H@H*,@H$L$: KG GD J H"H Lt:JG GD J I"H L:JG GD OJ xI"H 4AG4GDLApJ{BEE B(D0D8GPS8A0A(B BBBdAJBBB B(A0A8D 8D0A(B BBFL D 8A0A(B BBBB 4APN2AC GGD1 I f J 4BXQ$LBPQ.BEA D(F0tBXR1ACD Lt<WG GD W eS"H L<WG GD EW S"H L=WWG GD V S"H Ld=&WG GD V 1T"H L=VG GD jV T"H L>VG GD !V T"H tDQ&A A ,DRAKG0" AAA 4DTBFI G0  AABA DVEVd,EVIBBB B(A0A8G` 8A0A(B BBBA  8A0A(B BBEA \EYBEB B(A0A8\ 0A(B BBBF x 0A(B BBED L?aG GD a \"H L$@aG GD Ca w\"H Lt@UaG GD ` u\"H L@$aG GD ` x\"H LA`G GD h` ]"H LdA`G GD ` %]"H LA`G GD _ V]"H LB``G GD _ L]"H tHYA4HZ"BPA G=  AABE ,H^_AD S AG V AA $H_DZ B P H cD$I(`+BHB B(A0A8 0A(B BBEA lIbGIbGIbG$I`cMLY F $IcMD0l E d H 4Jd AF IEF D W I L4D^hC GD /h ff"H LD)hG GD g f"H LDgG GD g hf"H L$EgC GD Pg f"H LtEgC GD g rf"H 4%dtvLBAA J CBE $L0gLX@M G L$FkC GD ck 3j"H LtF]kC GD k j"H LF(kC GD j vj"H $ 'ivLV  F \Mj;$tMjLN0 A $MkMN  A LGmC GD m l"H LGmC GD Ym l"H LDHkmC GD m l"H $(kMvLHW0 E LHnC GD kn Am"H L IenC GD n m"H L\I-nC GD m ~m"H $) lvLHW0 H LItpC GD Ep n"H L$J?pC GD o o"H LtJ pC GD o Xo"H L*lvLBBB B(D0A8G` 8D0A(B BBBA d4QoBBB B(D0D8G` 8A0A(B BBBJ ~ 8A0F(B BBBA dQpTBBB B(D0D8G` 8A0A(B BBBJ @ 8E0A(B BBBA $RqMQ A $,R@r^{L4LC GD [ y"H LLUC GD  |"H LL C GD  }"H zPRxI $q2AX W A4DqEAAG@ AFJ F AAH ,|rMMQl I -wvLBBB B(A0A8GW 8A0A(B BBBF Q 8F0A(B BBBH ~ 8A0A(B BBBH ,4|^MMNp) G $d~_YN@ H $@ZMI m E DxrACG c CAF P AAV O AAO LOC GD j "H LlOaC GD  ݃"H U`U$ V0,$V(8AF ȃ A TV8AlV@`VA]$VxMNp G $VMI  J ,V^ADJ B AAE LQfC GD 7 )"H LTQ1C GD  7"H LQC GD  "H $؉MI ] E D@ADG | AAF l AAB V AAH D)HV B HdZA~ A YH@pQi F IMI qAS,AAJ AAG $,PM[@m K $THGAQ F ] A KL|pBEE A(A0 (D EBBI ~ (D EBBE $А1MN0 J ,YN@| E <$BGD D(G0X (A ABBJ d|-Ag%DM E LD4/vLAAG [ AAJ G AAG I FAH $MY, F D7Am B F$dȚHN i A p<N mqHC E `$|A{ L V J $H*MN0e H $ PAh G { E ,D 1MI i A  H ,t gBGA  AEJ 468nvLAC J[ G  A LV,C GD  ƨ"H LLWG GD  "H LWG GD k "H LWG GD " "H Ll7Dc I LrBMB B(K0D8O 8A0A(B BBBA dHBEB B(A0D8DpM 8D0A(B BBBB O 8G0A(H BBBK \p|th[Ag H J F D A S F L A } A O A F A F A F A F A F A F A F A D A U C QLHBEE E(A0A8FP 8A0A(B BBBH DDBBH B(A0C8D`8A0A(B BBB0S j C $WD Z B \ L Jԟ(  BAv I A$ PMAJ o AE KA$4x=[@] H ,\NAH Lh C ,yAAG Q AAA DX$Ԡ2MN0 I $ Ak D T D j$-DL H TL$D GD  "H LtD GD m ""H <hBIA A(G0 (D ABBA <$HBMB A(A0W (A BEBA 4dwAC S A  G P!̢0 ,(sAC KKPH F x,,pAC Kd G $\PGT`M H $MQ J ģܣ $<T4D \ H tDDPԤX`hp4xLdN C G #D ^(A\LsC GD D `"H L>C GD  "H LT C GD  #"H 4Ħ8zBAD a AEB ACE4AH IV I S E 4XDS$L`mAC KNO Dt+BBE D(D0JX 0D(A BBBA LvG GD K "H LEG GD  "H L<G GD  3"H LG GD p K"H LܢG GD ' 7"H  VP%$VhTpwLD R J <\V:BDA y ABE  ABQ fwLG A E ,ԃ@wLL^ G VWG$W8GX`h̪p4xXBGA F ADK qDB$MI p J D,\ AC LG.f C |BDB B(D0A8G` 8A0A(B BBBB \ 8A0A(B BBBJ D 8D0A(B BBBG $ MV0$4(gN @ J N4\p0AC IT D _ $hMN0{ J n`AԬhG,MD L K T A S$A<G\ AO|AO< BGI A(G@(A ABBܭ  $ M[`l A ,4H.AH M A LdHBGB B(A0A8DP 8D0A(B BBBA ̮aN E E  7zRx 5<4YLPdX|`hBVpį\LUG GD * "H L !G GD ޓ "H L\*G GD  "H LG GD  "H '4xA4TjBFD L0  AAEK `#D^$xAD h FM ,̱Au J  I A G C$`TAC @ A N $$tAC HZ J C LLBBB B(A0A8G 8A0A(B BBBG L|Z C GD +  P "H L̬% C GD  V "H L C GD  > "H ,dP=wLAIG  CAF  <Գ BBD A(D0 (A ABBA  c,p LD {BEB D(A0F (A BBBE O(A BBBL wBBB B(A0A8DP^8A0A(B BBB<H 1BHA  ABB F ABG L$H BBB B(A0A8GP 8D0A(B BBBA $tTA A F A H<aBEE A(A0 (A BBBE ܵ#L'BBA A(D@ (A ABBD e (A ABBE DcL\@BGB B(A0D8G`{ 8C0A(B BBBA $DGE D \ D DԶ BAA G  AABA Q  JADA  D$4xX e K \C{ B $|GJ G  E L--G GD - "H LԱ,G GD , &"H L$,G GD p, )"H Lt,G GD ', )"H LIJi,G GD + @*"H L8,G GD + *"H Ld,G GD L+ q*"H Թ<hBEA A(D0 (D ABBE $DOMD h G Nl eN V$X@I G <̺BDB A(D0(A BBD,  AF h A $<'\N` B <dȉBBB A(A0 (A BBBA 4(AAD  FAL DAAL8G GD 8 ."H L y8G GD 68 ."H |"\)BEE A(F0t (A BBBB H (A BEBE i(A BBB,)JAF Ln G L$,BED A(G0y (D ABBK D (A ABBF ,t(-HAJ }r F ,H0AC m E ,Խ6ADG AA8L8BOF B(D0A8G 8C0A(B BBBA Ll?/BIB B(A0A8Jf 8A0A(B BBBA LE BFL B(A0D8G 8A0A(B BBBA L PR BOF B(D0A8G 8C0A(B BBBA L\[#BOF B(D0A8G 8C0A(B BBBA Lpb%BPB B(A0D8D 8A0A(B BBBA LPfBII B(A0A8G 8A0A(B BBBA LLjBOF B(D0A8G 8C0A(B BBBA LrBPB B(A0D8Gg 8A0A(B BBBA L@xBII B(A0A8G 8A0A(B BBBA L<|BII B(A0A8G 8A0A(B BBBA L@pBIB B(A0A8N6 8A0A(B BBBA `X :,$HAC KKK T(Vm A dt؅BBB B(A0A8G 8A0A(B BBBB m 8F0A(B BBBD dBGB B(D0A8Dp 8A0A(B BBBD 8C0A(B BBBD%D`$\pVD{ A E K EAU,AKD0F AAH  dBEB B(A0A8D` 8D0A(B BBBD [ 8D0A(B BBBP ,l@AC GOXm A ,AFD AA(R,pAC KKNP H ,WAr M <L 2BEA D(F0 (D ABBA , AE KK_ A ,PAAD AA4AC e] J  A $hz<Х7T7l 7HL|.G GD  "H LG GD  "H L̼G GD q گ"H LlG GD ( "H LjG GD ߻ ̲"H L 9G GD  "H $|`HN v D HA,vADK F AAH ,8 AC Kg D L$BBD A(K0I (D ABBJ G(D ABB,t^AC B K $IAAD @AA,uAH KKW A LG GD  0"H L,G GD ^ "H <PBBA A(G0 (D ABBL ,0AL K_ G L G GD  "H L<G GD  "H ,`AM \ E ,/AHG0 DAA  ,$8BDD  ABE LTBBB B(A0A8DD 8D0A(B BBBA LHBBB B(A0A8Dd 8D0A(B BBBA 4ZBAA D@  CABC D,}BDA ^ ABH  ABL AB<t BBE H(C0 (A BBBA ,AL HKKH E <hBBD D(GP (A ABBA $84<`ThWl5CM H \LBBB E(A0A8J e 8A0A(B BBBA $PWN@x C LG GD  5"H L4G GD Z "H LlG GD  >"H L;G GD  5"H L$ G GD  "H LtG GD 6 "H LG GD  "H LwG GD  "H LdG GD  q"H LG GD  @"H $(Dr J LDBBA A(G0 (C ABBK r(F ABB,x8AC GGLJ H $MI | N eD D  $<dTBBB B(A0A8G` 8A0A(B BBBF T 8A0A(B BBBA \pBEB B(A0A8. 0A(B EHFG Q 0A(B BBBF 44BAA G@  DABC LLSC GD dS "H L^SC GD S x"H L)SC GD R }"H L<RC GD }R "H $HS0G F a$ MQB I ,+AC EIDp J ,,AC KD J ,\#OAC KKm A Q?LRiAAG  ADH r ADI g CDB \ AAB ,(SAC KD J ,$U(AC KD A L4EG GD  h}"H LG GD ~ D}"H L~G GD ~ }"H L$~G GD ?~ d}"H ,(|ADF0 CAH ,|ADF0 CAH L(~BBB B(D0D8G 8C0A(B BBBF L$G GD T "H LtNG GD  "H (Az E GLC GD  ˝"H LTC GD R "H LdC GD  "H L/C GD  P"H $d8HS0_ F u,AC GGDa I ,^AC IEU A ,NAC KKRz J $MMG@ G L$cC GD Pc "H LtJcC GD c "H ,x[wAC KD I bL,b4BBB B(A0C8I 8A0A(B BBBB ,|eM^ F DgWBDA K0  DABF ;  AABI DnBHA G0  DABF   AABI ,<uAAJ AAD LLgwC GD 8w zv"H L2wC GD v kv"H LvC GD v Kv"H $4uKwLD F A E v v@N qvBD \ H w$wLZPw$4wObPR D L<zC GD y x"H LyC GD y y"H LyC GD Ry x"H $$w[YwLMI  I LTzC GD az Yy"H L[zC GD z y"H L&zC GD y ty"H $<hx8hwLA F ,yADD j AAK L0zBHD A(D@ (D ABBD \(D DBBL}C GD i} {"H L<c}C GD } %|"H L.}C GD | ||"H ,yAG0e AB q AA $zvwLMI0 I $T|mMI t A L||BHD A(Dp (D ABBD \(D DBB}0}G~50~14X~1L~(H_l~}HB F ~?Ar E AH_ I @DxDhmA^ A 4GN w$TN0C G T D |AS L LBEB B(D0A8GP 8A0A(B BBBD $ЃL[@ B LXBGB B(D0D8G@^ 8A0A(B BBBD d؆At K ,HAYI D AAG ,ADG w AAK ,xAY F Y G ] C <BEB D(D0  (D BBBI ,TXAy F Y G d D b F $MI ` J  $MMIP$@MNP$D؎MMIP,lAG K_ $0ZP G LC GD ג "H LђC GD  "H LDC GD : "H $(wLA A $@MS@j F FIk D $$(mAAG XFA$LpRa J $tHR y E $MI f D $wMI Y A )|4)L  d$|WN p J N$8aN t N Pmtآ BEB D(A0A8 0A(B BBBA T 0A(B BBBA  0A(B BBEA \P)tX P8<`<XP&",49BGD eAE$dMU0 H ,CBGD rAB$ MV0 F <6!, 2DHh\ t $(H] D  $ OY# E 4 P"AC H B j F D#,\$\Qh K ,&\Qu F ))"L)0BBB B(A0A8G 8D0A(B BBBE <,T, l,DMLdq@G GD F@ E="H L@@G GD ? 6="H L@G GD ? ="H LT?G GD k? <"H L?G GD "? <"H L|?G GD > ="H d*4$|*AD AH cGDB$-MI  D <.BEE A(A0 (A EBBA ,$.s AO IIa D 4T8ACD R AAD DAP:D:jDe$ ;MN@ G |=BBB B(D0D8GP 8A0A(B BBBI  8A0A(B BBBK X 8A0A(B BBBF ,dhC%AC KDV G LhRBBB B(D0D8G`7 8A0A(B BBBH L8T BEB E(A0A8G 8D0A(B BBBI 4sD V,LtvMX@k H : F $|PvbN q A a,vADG  AAC $xwYLV0f H $xGLN@b D L$yBHB B(A0D8DP 8D0A(B BBBH t({BAw H AX{`{8{{x{ p{D${<{$T{MI0 H ||DPQ|@}X}D0c A L~BBD A(D0_ (A ABBF D(C ABB4H~RDM$T~A I |DILBHH H(D0D8D@ 8A0A(B BBBD 4Xd(AAD W AAA AAL BBB B(A0A8JAU 8C0A(B BBBA lLt BBB B(A0A8JA 8C0A(B BBBK AdBFB B(I0I8Dp 8F0A(B BBBF h 8F0A(B BBBA $\pLIPW D $؛MIPQ I $P6ADG `DALhBBB B(A0A8Dp 8D0A(B BBBA $ <,T:BAH kAB,AHL0a AAH <AC LG.  A  A ,HAJ N A $AUDu$\WN p J NLHBBE E(A0A8G 8A0A(B BBBA LBBD A(G0p (A ABBJ K (A ABBA ,$AC Km4 H $TxsL[@,|зAE KS A ,>AC L H ,AM L E L `BLE E(D0A8J` 8D0A(B BBBA ,\-AFF M AAD 4HRSPT O d A  E LXoBIH G(A0 (S BBBG I (A LBBA ,xAC GEEb] A LDHQBII B(D0D8JX 8D0A(B BBBC LXBEE B(A0A8G`N 8A0A(B BBBA 1DlLBBB B(D0A8D` 8D0A(B BBBA d8$|oMN@ K L BEB E(A0A8G 8A0A(B BBBH <H` AC HEEEla H  I L4hBEB E(D0D8JP 8D0A(B BBBH 4AIG r FAF MAADS I  XDPZHw A  gD^<pD A K,\ AC KH B $M[@V$AG AA $t\Q$MN0B B ,YD\r4t(YADG x FAE DCA,P[AF EEFID C  G!G!G$< "YGo A Td"JBPA G z  DABE f  DABC N  DABK #MD a A P$aDPZzRx L$]D8DH R DC8  DA8  DC8  D\)"t) <pPBBA A(D0 (A ABBH p)h)GAQ sA)kAN@ZA$)?AP lA$D*DPG E I G elp*bD@A K Q$*}DPE G K E \$+}DPE G K E \$p+%XpZ F x,p,4],L^,qBDXil,sEPk,-AC E[ A L4BJE B(A0D8Gp 8A0A(B BBBG L 86BBE F(A0A8D@K 8G0A(B BBBH L4>G GD = Q7"H L=G GD = ;7"H $ 5AY F W$ 6MZ0 C D 8 L\ 8*BEB B(A0A8G 8A0A(B BBBG  = =5 0=$ H=N =?$ =< =T =l = = =L =BLB E(D0E8G` 8D0A(B BBBA , ?MN@ K n B L4 ABHB B(A0A8G 8A0A(B BBBA  _ L _BLB E(D0E8G` 8D0A(B BBBA , Pa MN@ H n B L 0cBHB B(A0A8G 8A0A(B BBBH l  L BLB E(D0E8G` 8D0A(B BBBA , 8MN@ H l D LBHB B(A0A8G" 8A0A(B BBBJ T( l /8;L`HBEB B(A0A8GE 8A0A(B BBBA `bl4AC EGED H q G T1<lBBE D(D0u (A BBBC L BEB E(D0D8D@w 8A0A(B BBBE dPBBB B(D0D8D 8A0A(B BBBE $ 8A0A(B BBBJ dd BBB E(D0D8D{ 8A0A(B BBBD  8A0A(B BBBB ,AC EGED} J  /8B,p$DA K Y G l$:?L G GD  "H L G GD  "H LThBLB A(A0 (A BLBA A (A BBGA DBIA A(  ALBA A  ABGA 4DaAAD J DAE DAA<$8oBAA z ADE  ADA LD C GD  "H L C GD d "H L vC GD  "H $,8wLA F $| ]HR b D XDZ$`eAG@[ AD 3IT A $1X  E 4,AFD0 AAC  AAD $dXAG@z AE hD@^ F  / /D0hD8AG H L D H H G I J F L L V B <ID@D$ThAG K AA |@<h< `X6& 0N C G ,DF%\CCtDDDBLA D()  ABBG   ABBH ,GBRG ENLH7 BBB B(A0I8JB 8A0A(B BBBH LTR BBB B(A0A8J  8D0A(B BBBE X\$`\MQ@ B \\T\BAA D@Z  AABJ   FABA   AABD LlmJBBB B(A0D8D 8A0A(B BBBI Ln,BBB B(A0D8D 8A0A(B BBBF d poBBB B(A0A8Ge 8A0A(B BBBH ~ 8A0A(B BBBH tr$rORPE J ,tuAGH@ AAF vg,xxAC Br H ,482AC JKR C <dHBDB A(D0 (A BBBG ؄jBGB B(A0A8Gf 8A0A(B BBBA  8A0A(B BBBA  8D0A(B BBBE W 8C0A(B BBBE d<<BGB E(A0A8D`V 8A0A(B BBBJ  8F0A(B BBBK ,?AAD  AAE ,k1 D ,ؒ AZ c[ A $4H\A} J A A \tDDL H g$MIPm E @8hG$ؠM[ G 0DD0$4hxAG L AA \DVtȢ[AI0OAAX`AI@TA@A\ @M,U$D"MQ] E l8AvL(BIB B(A0A8Dv8A0A(B BBF,xVAF t A L$ BBE B(D0D8F` 8A0A(B BBBA ,t hOAC L< A , ~AC T B , wAC Kk A ,!(AC K^5 A <4!aBED C(G0e (C ABBF t!>AJ qA4!([AC EEEEkD I !P !HD0! "(F,"`D"X\"Pt"X"P"H"@"8"0#(#0PD~ F G<#`PD} G G\#4Dot#x# #D0^,#8 AF IED B L#(-BBD D(DP (A ABBG D (A ABBA L$$8BBB E(A0D8G 8D0A(B BBBE Lt$BGB B(D0A8G 8A0A(B BBBE $$HMD o H Y|$BIB B(A0G8G 8A0A(B BBBE P 8F0A(B BBBI  8C0A(B BBBA $l%YL,%AC IGEL A L%BBB B(D0D8G8C0A(B BBB4&AC W Kk\ A V <L&pBBD D(Gp (A ABBA ,&AC [ a ,&,AMJp AAF <&kAC OELHM  E  D <,'AC K qm C  D l'D\ E \' 'r[~ E H'X 'PL'XBEB B(F0D8GP 8A0A(B BBBB DD(BFE E(D0A8DP8A0A(B BBB,(0gDy C I G I G F$(pjDv F H H H H $(?Ee F 4 )AEJ0j AAD  AAG LD)BBB B(D0A8Gp6 8A0A(B BBBD L)/BBB B(D0A8G`8A0A(B BBB$)MN@$ *`MN@L4*tBBE B(D0A8JpB 8D0A(B BBBG $*(jDv F H H H H d*pBBB B(A0A8GP 8F0A(B BBBH F 8A0A(B BBBH +AT4+&AJ E QLT+BBB B(A0A8G1 8D0A(B BBBA D+ BBB D(D0Dp 0D(A BBBJ <+ BDD C ADF  ABC ,, D,x !DJ B I$d, aM[l D ,D,7ADI L,BGE E(A0A8DO 8D0A(B BBBK -HN`x4- pd;  O "xC*'\         f=Ma   r gF  `  e `lllllB 4HllHyl@lX@l@@@@@.@>@N@^@n@~@@8I@pylpylylyll l|l@I yll}l@I zll@l@I{lIIIylzl{lAAA0A@gKgKTG CUIIIIUIIUIIIIUIIUIIIIUI.I>IUINIUI>I^InIUIIUInIIIUIIUIII`JK`K` K@KK KK`K KKKIJJ{J{J{J{J{J{J{J{J{J{J{J{J{J!JSJ}J}J |G {GzGP}G I I I I1H4H4H4H5HBstapsdtFHKlibcrtld_map_complete-8@72(%rsp) 8@%r14Estapsdt GHKlibcrtld_map_start-8@32(%rbp) 8@-232(%rbp)FstapsdtHHKlibcrtld_map_complete-8@40(%rbx) 8@48(%rsp)AstapsdtXHHKlibcrtld_reloc_start-8@40(%rbx) 8@%r14Hstapsdt0HHKlibcrtld_reloc_complete-8@40(%rbx) 8@48(%rsp)HstapsdtHHKlibcrtld_unmap_start-8@-128(%rbp) 8@-88(%rbp)KstapsdtIHKlibcrtld_unmap_complete-8@-128(%rbp) 8@-88(%rbp)GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4),@\, @,u @ main-ffnchompfferror_printu 4ffindex_copyrightRffindex_restoreffindex_get_entry_by_indexffindex_get_data_by_offset+ffindex_get_data_by_entrynffindex_get_data_by_indexffindex_tree_writeffindex_write ffindex_index_as_tree ffindex_tree_unlinkK ffindex_tree_get_entry ffindex_unlink_entries_ ffindex_sort_index_file ffindex_fopen_by_entry ffindex_bsearch_get_entry4 ffindex_unlink ffindex_fopen_by_name ffindex_get_data_by_namec ffindex_get_entry_by_name ffindex_mmap_dataXffindex_index_parse ffindex_insert_filestreamffindex_insert_memoryffindex_insert_fileffindex_insert_dirffindex_insert_list_fileffindex_copyright_text =@@8|)intkMiwi!bb8%i%i1 x Tb     ( p0 [8 /     " $ &b 5*b a,{ ;0F f1T 62 /6 e? H I J K L- Nb P   s  b8x8'g#c 8$8 wF8p"i#b3$%F@ A BpG Hb GIb mJiO P Qp mRi W4 X Yp UZb [ \aI %bgj hi `ibp;D<Ct>K_rtS]c4IjIb8 4  5b -6b 8b ]kjlh T#)5b Tu  "pjbj T   y $5  ,$ R /b ( 2  0  f -  -  !6 " R@ $  %  &  ' R (  )-  *(  +-0 4 ,-8  -8 . b@@a bM a6)R*'+qE,a~.%/4-5Z7g`x?v~_E-F-.@J-@retMbNm3QU@}@'L]b=gkMlwob  =   =   @@8|)intiwi1Tb (p0[8/  "i$o&b5*ba,p;0Ff1T62u/6e?{HIJKL-NbP  i si o b8  81  8 @4@sOlen-tb@@@d3b'+b]o=ooo=oo @g@i|)intBk;;;BB;B^w^j ^^ ^B(y( z{^T/ 0et5=> @pA{ CW$ Ee(s J0N8YP [J\ ]j ^ Bw  B Cf c 4!-"f v B DIR    Bxlk# ~ 1 qT W      (p 0[ 8/      " $ &W5 *Wa ,; 04f 1I6 2/ 6e ? H I J K L NW P  s   Wxq  BW 0 1f    !  "R@ $ % & 'R ( )  *( +04 ,8 - 1B .<SW< W (TW4l '@@W@@~UT Q@@ZU@T1{ @ @+UfT! @ @n!U!2 @B @2 Z2] @2 4  WP @ @Z   @ @ZF |   !z"retWz#"retW@#{ UW @ @ ZU4 U #$i[ #P!]1s @% @~ ZI #$i # %W0 @B @ &, ϗ &4 ϗK '- n '5  P @ @F Z  '( F  I!1 @ @ Z] !1e @ @Y ZeeY eW5$igWX#$niW#@ kB#$cmpoW#ms) O @ @ ZOu= @@ @ =N=q!g?PQ@ @ @4 &Z& *1] @=@ Z m:D@@b@ DZDDF: 'p@@c 'pZ' ')%9@@ ZU T@@@=&[&=+sb(~,fdW( S I-@@.#. S BC @@@&&''Z(  I,iWw,d,end[#0,pWW @k@&~&&f=K&& /+W*_'+&'s(  I0L @1m@@'A  2B  B ;.Wp@}@&~.&.(&f.=q&R.& .& .9/+0W'+1'A 2(   I*801D@  BV W@ @&~&L&f=&n& 'J,retWG[W@@&~[&[ &[=L & [ ,dir] (  I'Zd'!*ne^'fm]!'n!#p+sbt(~3@u.'!."v  B"MW@g@3&~MN"&M"&M="&1M"*fO*nP_4 4= 4 4%4 4= 4 5% Hyl% : ; I$ > $ > I!I/   I  : ; : ;I8 : ;  : ;  : ; I8  : ;  : ;  : ; I : ;  : ; I' I'  : ; ( !I.? : ; ' I@ : ; I4: ; I4: ; I  U4: ; I  4: ; I? < % : ; I$ > $ >   I : ; : ;I8 : ;  : ;  : ; I8 I !I/ &I.? : ; ' I@ : ; I: ; I : ; I4: ; I4: ; I? < % $ > $ > : ; I  I : ;  : ; I8 I !I/  : ;  : ; I < & : ; (  : ; : ;I8 : ; &I : ; !I.? : ;' I : ;I.? : ; I@ .? : ; ' I@ : ; I .? : ;' I@ : ;I : ;I4: ;I .: ;' @ H !4: ;I "4: ;I # U$4: ;I%.: ; ' I@ &: ; I'4: ; I(4I4  ).? : ;' @ *4: ; I +4: ; I ,4: ; I-1X Y .1/4: ; I 0 : ; 1 2!I/31RUX Y 44: ; I? < 54: ; I?   /usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/include/bits/usr/include/usr/include/sysffindex_apply.cstddef.htypes.hstdio.hlibio.htypes.hsigset.hsiginfo.hsignal.hsigaction.hffindex.h @ = HKK[YYZdZg"rZY;= fW[\x6w̭;=iLY;KfiH>0zf/;/!Tt,JYS7Nt tK8F,X w! /usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/include/bits/usr/includeffutil.cstddef.htypes.hlibio.hstdio.h  @V>\9?p#guu( / /usr/include/sys/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/includeffindex.cstat.htypes.hstddef.htime.hstat.hdirent.hsearch.hstdio.hlibio.hffindex.hdirent.h @'f˲L g[gYI/nL =*."]K1y5wvW1qMmv~.W=40yXt>/I19HL .rJ<v.L,> tt.[sJv [;m =X><[Y^&hrfX g[gY\ g[gYiX}Y;=Y-=3gpx<!M;g fGLKWKhHy"$WuzOZVLWxJ wJ >:L2W#f!v~\h/=YYKit+>:??Y=YYK w)Xsg;JgY;=1=;/ZSfY;YY;=nVV>gMBX} vh<}Z0v fujm.Kk__off_tsi_utime_IO_read_ptr_chainsi_addrsi_errno_shortbufentry_indexnewfdsa_flags_IO_buf_base__sighandler_tlong long unsigned intsi_stime_IO_backup_base/data/hauserws2/home/andy/wrk/dev/compbio/hhsuite/lib/ffindex/srclong long intffindex_index_t_fileno_IO_read_end_sigchld__ssize_t_IO_buf_end_cur_columnsi_overrunindex_filename_old_offsetsi_sigval__off64_tsigval_tsi_pidprogram_name_IO_markerstdin__valdata_filenamepipefd_IO_write_ptr__sigset_t_sbufshort unsigned intsi_uidsiginfo_t_IO_save_basesival_int__clock_t_lock_flags2stdout_pad_sigpollindex_data_sifieldsfiledata_IO_write_enddata_fileffindex_entry_t_IO_lock_tPLAIN_FILE_IO_FILEsi_tidstderrrange_end_poschild_pid_markersTREEindex_data_size_sigfaultffindex_typeunsigned char__pid_tshort intsival_ptrffindex_apply.cwrittensi_statusrange_start__uid_t_next__sigaction_handlertree_rootsi_signo_IO_read_base_kill_IO_save_endffindex_entrysiginfosa_sigactionsa_mask__pad1__pad2__pad3__pad4__pad5num_max_entries_unused2sa_restorern_entries_timerprogram_argvffindex_indexsi_fd_vtable_offsetsa_handlerSORTED_ARRAYsi_bandargnSORTED_FILEmain_IO_write_baseGNU C 4.4.6 20120305 (Red Hat 4.4.6-4)si_codemessageffnchomperrstrlinefferror_printffutil.cfunction_namemyerrnosourcecode_filenameffindex_insert_dirinput_dir_name_lenn_entries_to_moveread_sizeffindex_copyrightbufferstart_offsetst_blksizeffindex_insert_filestreamffindex_get_data_by_index__nlink_tffindex_restored_name__ino_tffindex_tree_unlinkoffset_beforeffindex_get_entry_by_namefstatst_blocksd_reclenpreorderffindex_fopen_by_entry__unusedtv_nsecsorted_names_to_unlink__mode_td_typeffindex_get_entry_by_indexpostorderst_gidst_mode__ino64_tst_nlinkffindex_sort_index_fileleaftimespecEXCEPTION_ffindex_insert_memoryffindex_bsearch_get_entryendorderst_inoffindex_get_data_by_offsetffindex_compare_entries_by_nameffindex_mmap_data__dev_tdepthn_namesnbytes__pad0ffindex.cffindex_unlink_entriesinput_dir_namewhichffindex_insert_list_file__gid_tdirentst_mtimfrom_startffindex_unlink__pathffindex_index_as_treeffindex_copyright_textsearchffindex_get_data_by_entrynoded_off__blksize_tffindex_tree_get_entryffindex_fopen_by_namest_atimfrom_lengthtv_sec__dirstreampentry1pentry2__fdwrite_sizeEXCEPTION_ffindex_insert_file__time_tst_sizeffindex_writed_inoVISITst_uidst_ctimst_devffindex_get_data_by_name__func____blkcnt_t__statbufname_to_unlinkst_rdevffindex_index_parseffindex_tree_write<UUTS~H~HS\~H%EsE\\;\\)EsEV\VAE~E~~\~A~~\~UYPY}}\}eP}}\}P}}};}P\\\0P0;\000|8]]]0 VVP707?P'0S'6P6S!P!SSG^P^}'9P9}P}mqPPRsP_s0^PQPQ U P MUMV MTM\ MQM] MRM^PVpVSPWbPb~wPST`gUg{S{US`jTjnU`nQoPPUTwUUTTQQuPqp@rUr\\U\@rTr]]T][r0|V,U,bVbeP$,0PVS,B s0v"#@BV s0v"#@pxUxupptTpxUxupptTttpUSSTT&U&MV/T`U]P2]`T`Q|u81Vv|V2V|__2_w^2^PPp|Q'p|@OUOYu@`kU`gTg{SUVTU'S')P)USUZU[}ST(V)VVVZT[}VP)CP[gPqQ)4QUSUSTUQPPUSUSTUQPPUJVKVTISK~S(@PKnPHWHK~KvWv~PU\U\\\T]T]\] ^^\^PSVSVPS\V0\0s<U<AuAqU{~UUHH10ALR`U \ \`T _`Q S S`R V V`X _ _ w _ wP ] ]P U V V T _ _ Q ~ S S R U X \ \ Y ] ] q s ^ ^  P U  V= G V T . \= I \ Q 3 ]= I ] R X 8 ^= I ^  P $ S= D PD I S  P  VP o Uo ^P x Tx ^P x Qx _ _P x Rx \ \ P } S S P ]   P Q ~mQ g P ~m V \ \ V V V  U \  T ]  Q _  R Vp-size_tp__uid_t{__off_t__off64_t__pid_t__clock_t__ssize_tFILEx_IO_lock_t_IO_marker_IO_FILEssize_tpid_t$__sigset_tFsigvalisigval_tsiginfo siginfo_t__sighandler_tvsigactionffindex_typeffindex_entryffindex_entry_tffindex_indexffindex_index_t^-size_tp__off_t{__off64_t1_IO_lock_t8_IO_marker_IO_FILE|u e__dev_tp__uid_t{__gid_t__ino_t__ino64_t__mode_t__nlink_t__off_t__off64_t__time_t__blksize_t__blkcnt_tsize_ttimespec(statdirentvDIRVISITFILEq_IO_lock_tx_IO_marker_IO_FILEffindex_typeffindex_entry1ffindex_entry_t<ffindex_indexffindex_index_t S[fkkx$V&>BPbe2|tx~2~2~2[_ I   .symtab.strtab.shstrtab.note.ABI-tag.note.gnu.build-id.rela.plt.init.text__libc_freeres_fn__libc_thread_freeres_fn.fini.rodata__libc_atexit__libc_subfreeres__libc_thread_subfreeres.stapsdt.base.eh_frame.gcc_except_table.tdata.tbss.ctors.dtors.jcr.data.rel.ro.got.got.plt.data.bss__libc_freeres_ptrs.note.stapsdt.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_str.debug_loc.debug_pubtypes.debug_rangesX@X )x@x$<@ F@A@L@x R I d0I0 }8I8 `I`  HHKHH PHKPH hHKH HKH HKH L-vLv wlw (wlw 8wlw wlw  xlx xlx pxlx 8 xlx x)@yl@y /@l0 u 4l0 0H0 V0 ,_܈ nl ~   + 0Ƿ  &# Vc S  )  X@x@@@@@ I0I 8I `I HHK PHK HKHKHKvLwlwlwlwlxlxlxlxl@yl@ll !"#$%&@wl*wl8HKKxlX@n@l}Hlp@`l0wlvLxlI @R0 @/ I= IK IY Ig Iu Il@@ Il9@pyl9@:@5:@l/lCylOT:@[s:@i:@u:@:@:@;@-;@%@n6@L;@ I8k;@;@;@;@+;@:lPlb<@q%<@~D<@c<@<@<@<@<@<@=@<=@[=@ >@  @@C@9C@,D@71D@DD@OD@DJ@\&J@ `IjpK@ Q@Q@Q@Q@R@W@_@ _@ _@ _@ #`@2 `@Nd@cd@qe@ زIk@k@l@0l@lp@p@p@p@p@p@q@)q@Dq@_q@ zq@q@#x@ `I6}@}@A@/T@fŏ@q@ I  "I@ ll@@@@@@З@[l֮@*s@7@@D@Q@]=@kP@"@@@@@ l l@lh l6$@lC@#b@/@>lOl l^!@i@@w_@~@@@l0@ \l@Xll l@@"@ @ @ @, 9@: X@F @V @f@a @o @} @A A A mA A A JA eA }A < A W A r A  A2;  AET !A` !Ao !AD"A~ "A 'A` 'A `*A^ )A P,A) ,AZ ,Ap `.AI! .A2 0AG 3A1T ^NAa yNAp NA NA xl sA `l 7sA VsA usA  I` l l WA sA pl/ sA< sAK sAZ tAg 'tAt BtA ]tA |tA tA tA tA tA  uA *uA EuA duA uA uA+ uA: uAI  HHKw  PHK l |lH l }lH l@lHvAv"}A4 l>0PlV (A[Ai(lzpA0l8lplCA~AbA}AAl0Ip%I1I?lUlkpAx AEAy A'Al`ApA/lAĀlAAA,A=4AA'APl]Akls@l0~FAeAAAAPAxlAAA НAA!A06A=lQlcQAp lzlAAAAAAAAQ 9AUAqAAA,A9AFAUAd3AqOAkAAAAApAAA;AVA qAA'A6ACARA_Al6A{QAlAAAAAAA8AWA vAA)A9AFAUAcAq A%A@A_A~AAAAA A (AGA+fA;AIAYAiAwAA2A0A=ANAjAAAAA AH1 AI;AKAY2AgQAwpAAAAA A*AIAhAA AA+ HKmB|@A9l`9Bk JBiBLPiBSBrBB[B @I %B2BA IhG IhBMBZpBo I|B6BQBpB%lBl%Bllll`B:l lnl#DB/cB;BIBRBcB0uBBII`l !IzBB XHK CtC'C5CClPlZ Iq@ICOl-C-C` C l-C.C!.C@.C_.CII `HKPI". I>.CL`/CJW Ih2Csl~Z=Cy=Cl Il hHK I IlI:ll@C pHKI%  lI"CV3(lBC  xHKPCc Iht Ih0C I4 Ih Ih I I I IL, IG Ib I z I I4 I 4I @I@Plll$ I.l; `J(M *JP*_ UJ(o @jJKCIllCvlllCllC&C5CDCQ9C`Cnl8 HK~Xl l8`lCCClllxlll C pl C& pl>  CL 0Cg `C o  J8v  J  @Jl  @J8  J  J  J  J  Jl  J  J l D l D D D!"D!AD"!l/!`D=!DIK!?IW!^I HKe!Dy!`D ! J%pD!pD!pD+!D! qD!$qD! J[! J " J" J/" JA" JS" Je" Jx" J}"qDi!rD lmD"D"D"ʟD l"D"|lDe!pD!pD!PD^"E"E" J[" J # J# J/# JA# JS# Jy!Ex" Jf# J! @Jx#E#E#E#E#l# `J?#E#žE#ݞE#E # E@ $`EB$E.$ `J?$EKER$fE`$En$ؤEy$E$E$ J$ J$xE!E$E$ @J@$ J@$pE$E $0E$@E$PE$ J %0E% J %E%% J /%EE9%EF%ET% @Jb%EFo% Em~%E|%pE%PE%@E %E%E %F%@E&"%0E&l&l&l&l&l&l&fF4.&0gFIG=&lK&lR& l`[&vFj&l&l&zF&zF&{F&&{F&E{F&d{F HK&l&l&l'l 'l'l"'l,'l2'l='lG'lN'lY'ld'lq' J'F ' Fv'`F'I('pF ' J' HK,( HKl(F(Fu(@FW(F( J(Xxl(l( K(0F(F(`xl)Pxl )Fs) F) 0K*) K>) @K N)G>X)pxli) Ky)@xl)G)Go)`G) `I)l)l)l)9Go *p:G * K#* ` KL-* K;=* lF* R KX* Kxe*hG[ПIx*yG* yGG*pyGk*yG?*l HK*X* PK*G 0l*:G*G +(l+YG+ (K*+ @!K4+ @"K>+0GI+GZ+ &K@>+GI+G f+ &K@>+PGI+Gr+ @'K@Ia~+8l 4l+-H+-H HKn$/Hy$3/H$N/H+lh+/He+`0H3+@l +`l+3H+hlll+ 4Hh+5H+ 6Hh,p]H , 7H6&/,7HB,HM,pl^,|lp,xl, @:K, ;K, 0;K,l,l,l,l,l,l,l,l,l,l,l,PHj-H- I@I!-H1-l HKF-p IxR- I_- Ij- Iv- IU-l-l-l-l-l -l-`I8-I-+Iw-P4I>-4I[.9IF.9I!.l6.:I4J.;Ixd.;I x.EI-.GI8.@OI.RI.SI.@\I.l.^I/`I6/l(C/@lR/gIh/ gIw/gI/hIg/iIj/piI?/jI/kI/`mI//nI0@oI50pItH0qIjZ0qIv0(l08l0l0`l0vI00l0(l0HlI0@0wl1@1wl,1wl=1wlQ1xlg1wlz1wl1B1 `J@1l1B1@ 1@1"@Q1*E)1 JL2"pB2@R&2l12B#A2RA7S2 o2@2`G?2@2@W2"PYF2 E)2E2#A2A@2pB2@& 38I3p8G#3bA/3l:3}IK3" DT3!lb3oGs3QAA3 JH3@mA3@E@3}@63 I 4B4*IB) 4"@W4/I-4iBL>49IP40MC p4ly4!l4A4@48l4k@H4 C4W@ 5"@5 @P5@W(5cG:5`@W5"@A|g5@G@5&5 J\5@Q5"B5"нH5I5"@Q5" F5"z@5@6E@-64H/66CI6Pe@e6Ft6p9I6Pm@6H 6@E6"0F6F86 AM60,Ho6B 7TAN7"B"7G47l;7" AD7p@"]7Er7?@7C7@7!l7PhA|7ȁl7"B#7 @8"D 8`cB568lJ8C#_8@o8l{84A8RG8e@ 8}@8E58B8@E@9l9QA-9"@29"@Q:9vI&K9"BAY9@|@ q9 A~9wF9D9H9G@90@{9"D9E9E:)H:"'@B *: I:: JLV:@$b:P@#w:"7A:@q: f@:@:"A: B:pBa:jC%;'H/;By#;" F+;"Ea3;PH=;lP;@B[;G;e;PYFn;" E@;"A;"3F;B;Ȁl;I8;"e@ < Em <l<PG%<A-<@<<@M< NBU<GC/u<l<e@;<F<pNG<p@)<@m@<l<=@% =dI&= A/= CTI=jAp\=@j=`Bv=0@="B= B=xl=@=""A$=pi@e>" B> `I.>t@-G>p3CHX>"@Ja>D}>0l> K@>pB>I> LI >p|@">@I?"-H8 ?P+A"?0@{:?С@PG?C}Z?@k? @y?l?G$?0@H? m@?1G??"@Q@"0A@ C(@@G@>@"A1K@BR@PA \@@n@pE@@@W@B@ l@(l@Hyl@"B@l@9IA|@ +A@EADOA D8`AlwA I A DA,AA"`VFhAEA"`@WAP@VAe@BDB(BB+'B"G/Bi@ABjFNB"@FVB @cBe@;yB0BgBhB)B#@BPHBFB B0FBcF0B]ICP@VC @Q+Cl?C@@RCplAbC@tC iI C@{C"ЪB C8C@ClC@qCEGC I D|@DПE/D"B!6DzlFDDaD"@ AiD@|@ Dɦ@D"`@WD`%HD@A<D"F8D"`BDh@D@@DlE)@+E"PG 7E@MEF@ gE C|EgGrE BE JLE`@EpAcEZA$E" @E@@0E F"@'F&GP@#NG"BZG#IcGPCvG"B|G0A{G oCGlGPlGЬE}GЀlG"@WHfF H!l"H@Z;HBzGHHC`H`9IoHyl|HpCH^BeH@{H"8IH6H<HBH0VAOH GbH|@HC I"2F9IuD($I lI EIAPIhA'cIRA6oI@IRGI@IPe@I I[ICICcI @JEJ C#J"@Q6J"`@@JCWRJwl_JEAguJlJpFJ@ArJACJA@ J VF2JpGJ@QK{G}KPBKPPA!(K" B-KPJ@BK"pYFJK" @QSKWF[KGeK"@qK @IK@6KC'K"`BK@KG5KACK&K@K (HBL"BzL`8AL A,L"`3FC;LPAIL@LfL4H oLhlL0lLA L J(L"@@QLgAjL IL"FLGLl M`BM J /M" @Q8M"@ CM0BMSMF@iMylxMCM PIMB4MSGZM@k@]M"@B NINB"N"WF(NBN;NFHN"@PNH aNf@xN"0,HoN! 8JNEN lN"@WN @xN `K@NlN"@NyG OE@ OC{2O"B9O @JLTO HeOG{O f@O@O JOlO@JOCODO hIP)H$P~H'P@O0P"`BCP@&PPBBeP@>xP P)I~PBP"PG P @2P E1PE@jPB#QF@ +QC7Q`@3GQaQPl@wQE8Q"FQ0}AQ";AQ&Q`C QpFBQ~B>QCDR"BRTGg6RbI,HRЖ@eRpHoR" BwRlREDRDR"AyR`xAR"EOR0FR G@R"PFDR`F@ S"@BD#SPl@;S"`@WDS"?A7TS" @Q^SFAnqS"ZBRyS0A{S"0@AS"ES0AS@,S!lS $I S @SlT`?C&T" @1T&IT`VFhRTTAdT@vT`@WT @QTp@ T I T@xFjTlTB\T+C UBUIa'UP@ CU@BDMUp8A-aU E0pUP @sUE|U C1U BU" @QUAU"VF UPUp{CV" DVXl2V`@AVB@YV0rGhVlrV"`@yV"B~V*6H<V"PBPVМ@(V"`@V@C2VDG` V=@LV I WBBW`l'W"P@,W JGW `JLbW@4hW@l8~W @W LIW0F@WD5WylW0IX @XPI\XuD($X!l+X"0@?XlLX(xlaX@EkX"@XxX`CzXEOX"PBXE[X LIXCXI@Y@Y@Y JD4YvAFYI!\YA_mYlY0TAYGHY"@YF@ Y@YDWY"@BY" @QY5HIYCZ" EmZhB)!Z0@1ZPFD:Z"F@ZELZ`Cu\Z" @QcZTAtZBzZB@ZvIZlZ"EAgZ 8JZ! 8JZ"@WZl[l[@TA[ G5[ IL[@,c[Hq[ C["_F[HB[C7[@{[!l["@Q[*H:\ HI\" A"\8*\HHK@\8IL\*E<Y\0lv\8A\F@\pC \`d@\"A1\p@\ G\"0Bg\АF]eI"]AZ1]Ay@]"`@L]sGa`]"БGg]0E[w|]`@]"G5]`B]"HB])@]F] I]"Bs]@qD?^Pl@1^@qG^P|@`^@t^F@!^"@Q^B!^AS^"@G ^"0CT^ J^l^F@! _0CT_I+_!l3_@C^@_P@H_kFs Y_ ЫI v_0F@_@_@Ew_0R@_ I _pQG `P*H?&`0I6` ID`vA+S`(lb`0Cx`"e@`@b`"C`yl`"H`nG` TA`"pG a"B+aPB.aF$aF1a H,;a`l8JaPI^a lgagGwa HKaBacC#aE)a"BaйFaBaHJbf@wb"z@M2b0@{?b0FNbzA_bIwbP}GbBbA b@E&"b"P@bPGbpF@'b @bBc`B c2Ac0D4+c_A7cxl@cPATc @Bkcp~GxcAc aIc Ic:Icxlcp?CcFcldE d"pBdBd`C@2dPAA*CdXd@A9dd LI}d Bd"8A/d"AdGdCd @K@d)@dCe@Ae0@7efACeh@deiBope zGe 'KeEe"@Qe"@CA1eP@VepIBue Ae  JN'@B c @tB-"`B #A8"PB.plOA+ȍ@E׍1Hc@@1 :IP!l ;Cp]E@wDq@B FHΎp@A10F:G*%E<2BD; J8Q"D]@ils I E `IP@ɏ"FX͏ @K0R@jF K@!D#O'B=;A@ J@Y"`@WdEp0Ca}l@\@Q 8KȐ0Eݐ TI `d@!4F40@ElR"m@|g IzID JxlpD"A$ǑBϑ@F@`@'vAb@*'@/E> C7RP@#`lpkBY `IPBPl(@F@ƒ`}Gْ@PD@@)Hl/A)BpFUB2a@mH{"@Bp:IP !J  I דBޓ@lPJ@@@QЖ@-@*EG@a Bh" @Qp"@w؀l"@Q@!"@@QĔ!lܔ {G}"B@QEPyl"С@P" @@"P@\"ERe dI | gAsC @W͕ @ԕ JH`@Wl  D DE)%@:@CN@xrA|lPTAAE"E[0D9I̖жB Ӗ8A/E@j@yl0H1A27I :pm@N`'A[B lBs"B|SAPBFl(lA1Η"B-ח@EF @QB# J8:lH`|lU i3Fxm@|@CA1 f@Ƙ |G%٘ D;A@@ "IH7 (z@MA"`@WJpE@f"@QnEy0pG"iBoB@ؙ@"С@P@ "wF"BpC%pB 8 >@mEp+He"@@QnA@ K@pdGcA'fI ̚P@#P@Aq@ll0"B@"t@-W@i I @YAs @"FÛp}Gٛ"pAc`fI ER p@*"`@2"0[F:~HF%P4le&IOsA@ 0A"`@W"@Q@d@֜ jBq"@&@QVF E@5`TACH TlaASj!lz!@0& FÝ(Ax̝eB{!D#O{ll  Ip@'pOA+C"@N@"h@@En XI SAz@ ` JH֞A۞PFRF4@F"@*PA* I> M/Hh"Ht@IV K@l@Cğ"F̟pBWܟ"0Acall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST____do_global_dtors_auxcompleted.5850dtor_idx.5852frame_dummyobject.5877__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxffindex_apply.cffutil.cffindex.caction.4996ffindex_compare_entries_by_name__func__.4968__func__.4691__func__.4740__func__.4654__func__.4550__func__.4592__nptl_initial_report_eventssigcancel_handlersighandler_setxidnptl_versionstack_cache_lock_L_lock_11stack_used_L_unlock_47_L_lock_104_L_unlock_153in_flight_stackstack_cache_actsizestack_cache_L_lock_685_L_unlock_858_L_lock_884_L_unlock_992_L_lock_1018_L_unlock_1080_L_lock_1295_L_unlock_1379do_clone.clone.0start_thread_L_lock_1517default_attr_L_lock_1785_L_unlock_1918_L_unlock_2124_L_lock_2272_L_unlock_2292__nptl_threads_events__nptl_last_event_L_unlock_2364_L_lock_2621_L_unlock_2643_L_unlock_2690_L_lock_2765_L_unlock_2793_L_lock_2914_L_unlock_3618_L_lock_3898_L_unlock_3981_L_lock_4594_L_unlock_4598cleanup_L_lock_31_L_unlock_61_L_lock_29_L_unlock_64_L_lock_26_L_unlock_50_L_unlock_131__pthread_mutex_lock_full_L_robust_lock_261_L_unlock_798_L_lock_854_L_lock_892_L_lock_995_L_unlock_732_L_timedlock_101_L_timedlock_292_L_robust_timedlock_358_L_timedlock_1071_L_unlock_1152__pthread_mutex_unlock_full_L_robust_unlock_106_L_unlock_543_L_unlock_655_L_lock_13_L_unlock_32_L_lock_20_L_unlock_38_L_unlock_105_L_lock_124_L_unlock_179_L_lock_197_L_unlock_227_L_lock_249_L_unlock_283_L_lock_306_L_lock_328__condvar_cleanup2_L_lock_18clear_once_controlcheck_add_mapping_L_lock_97_L_unlock_145defaultmountdefaultdirwalkerthe_semrec_L_lock_37sem_wait_cleanupsem_timedwait_cleanupsem_timedwait_cleanup2unwind_cleanupunwind_stopmiss_F_GETOWN_EX_L_lock_23_L_unlock_16__restore_rt_L_unlock_51_L_lock_225_L_unlock_251__pthread_mutex_cond_lock_full_L_robust_cond_lock_293_L_unlock_830_L_cond_lock_886_L_cond_lock_925_L_cond_lock_1028static_slotinfostatic_dtvstatic_maplockstage_L_unlock_138_L_lock_156msort_with_tmpphys_pages.10078pagesize.10079_L_lock_16_L_unlock_121_L_lock_211_L_unlock_325_L_lock_458_L_unlock_570initialcancel_handler_L_lock_47sa_refcntrquitintr_L_unlock_66do_system_L_lock_98_L_unlock_123_L_lock_254_L_unlock_288_L_unlock_379_L_lock_413perror_internal_L_lock_36_L_unlock_106_L_unlock_186_L_unlock_215_L_unlock_181_L_unlock_241_L_lock_50_L_unlock_104_L_unlock_177_L_lock_51_L_unlock_205_L_unlock_236_L_lock_53_L_unlock_237_L_unlock_351_IO_wfile_underflow_maybe_mmap_IO_wfile_underflow_mmap_L_lock_805_L_unlock_1194_L_unlock_1384_L_unlock_53fmemopen_seekfmemopen_closefmemopen_readfmemopen_write_IO_file_seekoff_maybe_mmap_IO_file_sync_mmapdecide_maybe_mmap_IO_file_xsgetn_maybe_mmapmmap_remap_check_IO_file_xsgetn_mmapnew_do_write_L_lock_2033_L_unlock_2078_L_unlock_2227flush_cleanuprun_fp_L_unlock_24list_all_lock_L_unlock_37_L_lock_860_L_unlock_885buffer_freefreeres_listdealloc_bufferssave_for_backup_L_lock_1783_IO_list_all_stamp_L_lock_1855_L_unlock_1890_L_unlock_1922_L_lock_2021_L_lock_2101_L_unlock_2151_L_unlock_2304_L_unlock_2561_L_lock_2643_L_lock_2673_L_unlock_2711_L_unlock_2751_L_lock_2799_L_lock_2829_L_unlock_2899_L_unlock_2957_L_lock_4072_L_lock_4102_L_unlock_4172_L_unlock_4252__elf_set___libc_atexit_element__IO_cleanup____elf_set___libc_subfreeres_element_buffer_free___IO_stdfile_0_lock_IO_wide_data_0_IO_stdfile_1_lock_IO_wide_data_1_IO_stdfile_2_lock_IO_wide_data_2enlarge_userbufptmalloc_lock_alllist_lock__libc_tsd_MALLOCmain_arenamalloc_atforksave_malloc_hookfree_atforksave_free_hooksave_arenaatfork_recursive_cntr_L_lock_74ptmalloc_unlock_all_L_unlock_108_L_unlock_117ptmalloc_unlock_all2free_listarena_thread_freeres_L_lock_186_L_unlock_192disallow_malloc_checkusing_malloc_checkingmalloc_checkfree_checkrealloc_checkmemalign_checkmem2chunk_checkmp_malloc_printerrmalloc_consolidateglobal_max_fast_L_unlock_1142check_action_L_lock_1159_L_unlock_1176_L_lock_1194mALLOPt_L_lock_1334_L_unlock_1365perturb_byteptmalloc_initnarenasatfork_mem_L_lock_2027_L_unlock_2335_L_lock_2402_L_unlock_2545munmap_chunknew_heapaligned_heap_areami_arena.16358_L_lock_2925_L_unlock_3128arena_get2_L_lock_3405_L_unlock_3419_L_lock_3427narenas_limit.12907next_to_use.12878_L_lock_3519arena_mem_L_lock_3789_L_lock_3794_L_unlock_3801_L_lock_3978_L_unlock_4143_L_lock_4304_L_unlock_4338_int_free_L_lock_5084_L_unlock_5211_L_unlock_5502_L_lock_5514_L_unlock_5568_L_lock_5581_L_lock_5615_L_unlock_5629_L_unlock_5873_L_lock_5884_L_unlock_5913_L_lock_5927_L_lock_6231_L_unlock_6251_L_unlock_6270_L_unlock_6325_int_malloc_L_unlock_7632_L_lock_7645_L_unlock_8064_L_lock_8073_L_unlock_8103_L_lock_8119_L_unlock_8138_L_lock_8151_L_unlock_8595_L_lock_8605_L_lock_8978_L_unlock_9023_L_unlock_9186_L_lock_9192_L_unlock_9201_L_unlock_9225_L_unlock_9247_L_lock_9372_L_unlock_9391_L_unlock_9418_L_lock_9425_L_unlock_9434_L_unlock_9470_L_unlock_9492malloc_hook_ini_L_lock_9556_L_unlock_9636_int_memalign_L_lock_10001_L_unlock_10043_L_unlock_10094_L_lock_10101_L_unlock_10111_L_unlock_10168_L_unlock_10190_L_lock_10271_L_unlock_10307_L_unlock_10353_L_lock_10360_L_unlock_10370_L_unlock_10424_L_unlock_10446_L_lock_10550_L_unlock_10569_L_unlock_10620_L_lock_10627_L_unlock_10637_L_unlock_10652_L_unlock_10674memalign_hook_ini_int_realloc_L_unlock_11385_L_lock_11395_L_unlock_11418_L_lock_11432_L_lock_11543_L_unlock_11554realloc_hook_initop_check_L_unlock_11938_L_lock_11970_L_lock_12223_L_unlock_12241_L_lock_12353_L_unlock_12356_L_lock_12513_L_unlock_12523_L_lock_12551_L_unlock_12606_L_lock_12936_L_unlock_12956_L_lock_13081_L_unlock_13103_L_lock_13189_L_unlock_13354__elf_set___libc_thread_subfreeres_element_arena_thread_freeres____strcmp_sse42__strcmp_sse2buf__strncpy_ssse3__memcmp_sse2__rawmemchr_sse2__rawmemchr_sse42two_way_long_needleintel_02_known_comparehandle_amdintel_check_wordintel_02_knownhandle_intelinit_cacheinfoto_wcto_mb_L_unlock_87__sysconf_check_speccs_path.9616_L_lock_1075_L_unlock_1875_L_unlock_2501syslog_lock_L_unlock_7LogMask_L_lock_46connectedLogTagLogTypeLogFileopenlog_internalLogStatSyslogAddrLogFacility_L_lock_519_L_lock_795_L_unlock_820trecursetdestroy_recurseconvert_and_printphys_pages_infonext_linefree_mem_L_lock_35fork_handler_pool_L_unlock_46_L_lock_106_L_unlock_219__elf_set___libc_subfreeres_element_free_mem__backtrace_helper_L_lock_42_L_unlock_102_L_unlock_158result.11786buf.11787unsecure_envvars.11690free_derivationderivation_compareonce_L_lock_396_L_unlock_462find_derivationknown_derivations_L_lock_2177_L_unlock_2191_L_unlock_2288_L_unlock_2309_L_unlock_2390free_modules_dbempty_path_eleminsert_moduleadd_modulegconv_module_extadd_alias2lock.13773_L_lock_865_L_unlock_874builtin_modulesbuiltin_aliasesmodcounter.13696mapinmask.13808gconv_cachecache_mallocedcache_sizefind_moduleloadeddo_release_alldo_release_shlibrelease_handleknown_comparenew_composite_name_nl_current_used_nl_category_postloadstripcodeset_idx.11263_nl_category_num_items_nl_value_types_nl_value_type_LC_CTYPE_nl_value_type_LC_NUMERIC_nl_value_type_LC_TIME_nl_value_type_LC_COLLATE_nl_value_type_LC_MONETARY_nl_value_type_LC_MESSAGES_nl_value_type_LC_PAPER_nl_value_type_LC_NAME_nl_value_type_LC_ADDRESS_nl_value_type_LC_TELEPHONE_nl_value_type_LC_MEASUREMENT_nl_value_type_LC_IDENTIFICATIONarchloadedarchmappedheadmaparchfnamearchive_stattranslit_from_idxtranslit_from_tbltranslit_to_idxtranslit_to_tblplural_evalroottransmem_listtranscmpoutput_charset_cached.12711output_charset_cache.12710lock.12140_L_lock_1420freemem.12151freemem_size.12152_L_unlock_1550_L_unlock_1602_L_unlock_1633_L_lock_2222_L_unlock_2229plural_lookuptree_lock.11541_nl_loaded_domainslock.12095lock.11836_L_lock_148_L_unlock_178read_alias_filemaxmapnmapstring_space_actstring_space_maxstring_spacealias_compare_L_lock_629locale_alias_path.11130_L_unlock_734_nl_make_l10nflist.clone.0new_expyypactyytranslateyycheckyydefactyyr2yyr1yypgotoyydefgotoyytableplvarploneenvlock_L_lock_9last_environ_L_unlock_18_L_lock_68_L_unlock_107_L_lock_209_L_unlock_316known_values_L_unlock_493_L_unlock_541_L_lock_758_L_unlock_767_IO_helper_overflowbuffered_vfprintf_IO_helper_jumps_L_unlock_289group_number_i18n_number_rewrite_L_lock_972_L_unlock_1058jump_table.14360step0_jumps.14376step4_jumps.14563step3b_jumps.14411step4_jumps.14412step1_jumps.14407step2_jumps.14408step3a_jumps.14409nullhack_digit.15416_L_unlock_45_L_lock_123_L_unlock_147_L_lock_14pa_next_type_L_lock_742_L_unlock_827jump_table.14392step0_jumps.14408step3b_jumps.14443step4_jumps.14444step1_jumps.14439step2_jumps.14440step3a_jumps.14441step4_jumps.14586_L_lock_13641_L_unlock_13717_L_unlock_1211_L_lock_1248value.11473letters_L_lock_33_L_unlock_81_L_unlock_135_IO_cookie_read_IO_cookie_write_IO_cookie_seek_IO_cookie_close_IO_cookie_jumps_IO_cookie_seekoff_L_unlock_112_L_unlock_169_L_lock_32_L_unlock_128_L_unlock_171blankszeroes_L_lock_208_L_unlock_452save_for_wbackupdo_encodingdo_always_noconvdo_max_lengthdo_inCSWTCH.66do_unshiftCSWTCH.68do_outCSWTCH.70do_length_L_unlock_84_L_unlock_124_IO_mem_jumps_IO_mem_sync_IO_mem_finish__strchr_sse2__strchr_sse42__strcpy_sse2__strcpy_ssse3__stpcpy_sse2__stpcpy_ssse3__strcasecmp_l_sse42__strcasecmp_l_sse2__strcasecmp_sse2internalstatecompute_offsetcompute_changetzstring_listold_tztz_rulestzset_internalis_initialized.11097tzset_lock_L_lock_2260_L_unlock_2276_L_lock_2291_L_unlock_2297_L_lock_2332_L_unlock_2393num_transitionstransitionstype_idxstypesrule_stdoffrule_dstoffnum_leapsleapszone_namesnum_typestzspectzfile_inotzfile_devtzfile_mtimedefault_tzdir.5688__strftime_internal_nl_init_era_entriesres_setoptionsres_thread_freeres__res_vinit.clone.1sort_mask_chars__elf_set___libc_subfreeres_element_res_thread_freeres____elf_set___libc_thread_subfreeres_element_res_thread_freeres__getifaddrs_internalis_dstlocal_strdupfillin_rpathcurwd.12181ncapstrmax_dirnamelensystem_dirsadd_name_to_objectprint_search_pathmax_capstrlencapstrloseopen_verifyexpected.13001expected_note.13007expected2.13000open_pathrtld_search_dirssystem_dirs_lenenv_path_listexpand_dynamic_string_tokendecompose_rpath_dl_map_object_from_fddummy_bucket.13401cachecachesizecache_newcheck_match.12333do_lookup_xundefined_msgmsg.12626errstring.12603receiver_dl_out_of_memoryprimes.11683_dl_debug_vdprintfdo_dlclosedo_dlsymdo_dlsym_privatedo_dlopen_dl_open_hookdata.10373internal_trans_names.10119open_translit_L_lock_99trans_comparesearch_tree_L_unlock_127not_availablecollseqmbcollseqwcstr_to_mpnround_and_returnnbits.12487nbits.12476nbits.12475next_bit_L_lock_491_L_unlock_537_dlfcn_hookscheck_freeinitlast_resultstatic_buffree_key_memkeyfinidlinfo_doitdlmopen_doit__strncasecmp_l_sse42__strncasecmp_l_sse2__strncasecmp_sse2ydhms_difflocaltime_offsetlast_family.10601last_type.10602afs.10606max.9534xdigits.9962runninglowpctextsizelog_hashfractiontosfromsnarcspnarcsfromlimitdatafromidxdl_open_workeradd_to_globalfree_slotinforemove_slotinfodl_close_state.12869dlopen_doitdlclose_doitdlsym_doitdlvsym_doitprofil_counterpc_offsetpc_scalensamplessamplesotimer.10168oact.10167openaux_dl_build_local_scopematch_symbolcall_dl_lookupdo_symread_sleb128_Unwind_DebugHookdwarf_reg_size_table_Unwind_SetSpColumninit_dwarf_reg_size_tableexecute_cfa_programuw_install_context_1execute_stack_opuw_update_context_1uw_update_contextuw_frame_state_foruw_init_context_1once_regsizes.8901_Unwind_ForcedUnwind_Phase2_Unwind_RaiseException_Phase2object_mutexunseen_objectsfde_unencoded_compareframe_downheapframe_heapsortsize_of_encoded_valuebase_from_objectread_encoded_value_with_baseget_cie_encodingclassify_object_over_fdesadd_fdesfde_single_encoding_comparefde_mixed_encoding_comparelinear_search_fdesbase_from_cb_data_Unwind_IteratePhdrCallbackadds.8719subs.8720frame_hdr_cache_headframe_hdr_cachesearch_objectmarker.8092terminator.8365seen_objects__rela_iplt_end__fini_array_end__rela_iplt_start__fini_array_start__init_array_end__preinit_array_end_GLOBAL_OFFSET_TABLE___init_array_start__preinit_array_start__vsyslog_chk_nl_C_LC_CTYPE__have_o_cloexec__duplongjmp__libc_tcdrain__recvmsgstpcpy_nl_C_LC_CTYPE_class_printtsearch__lll_robust_lock_wait__morecore__getdtablesize_IO_remove_marker_nl_current_LC_COLLATE_used__libc_sigaction__isnanl__pthread_cleanup_upto__libc_preadmbrlenstrcpy_IO_wdefault_xsgetn__fcloseallpthread_yield__syslogpthread_mutex_consistent_dl_vsym_dl_setup_hash_IO_link_in__daylight_Unwind_Find_FDEunsetenv__malloc_hook_dl_debug_printf_IO_sputbackc_nl_C_LC_CTYPE_class_upper_IO_default_finish__pthread_attr_destroypthread_barrier_destroy_thread_db_td_eventbuf_t_eventnumwarnxbcmp__recvfrom_dl_check_map_versions__GI___rawmemchr_Unwind_GetIPInfo__gconv_transform_utf8_internal__is_smp__malloc_initialize_hook__default_morecore__find_in_stack_list__libc_argc__pthread_rwlock_trywrlock__init_cpu_featurespthread_mutex_timedlockwaitpid__longjmp__msgrcv_dl_receive_errorpthread_mutex_getprioceiling_IO_file_finish__pthread_attr_getstack_nl_current_LC_TELEPHONE_nl_C_LC_CTYPE_width__libc_fsyncgetrlimitioctl_nl_unload_domainpausewritevpthread_cond_signal__connect_nocancel__pthread_attr_getschedparam__dlinfo__get_cpu_features__pthread_mutexattr_destroyif_indextoname_Unwind_GetIPpthread_rwlockattr_setkind_np__mpn_impn_mul_n_basecase_IO_wdoallocbufgetgid__getpid_IO_fread__register_printf_modifier__syslog_chk_IO_list_locksysconf__strtod_internalstdoutvsprintfffindex_get_data_by_name_IO_seekoff_unlockedpthread_tryjoin_np_nl_load_domainffindex_get_entry_by_indexdaylight_IO_default_doallocate__libc_multiple_libcsgetdtablesizepthread_barrierattr_getpshared__strtoull_l_wordcopy_fwd_aligned__concurrency_level_dl_important_hwcapsffindex_restore__attr_list_IO_new_file_xsputn_dl_reloc_bad_typepthread_mutexattr_gettypepthread_spin_trylock_IO_least_wmarker__strstr_sse2pthread_attr_destroy__static_tls_align_m1_IO_default_syncrecvconnect__register_frame_IO_file_sync__pthread_condattr_init_IO_vsprintf__tzset__strtoull_internal__mpn_impn_sqr_n_basecasepthread_attr_getstacksize__pthread_oncestrtoull_l_IO_seekwmark_IO_fflush__mpn_extract_long_doublepthread_create_IO_wfile_jumps_nl_C_LC_CTYPE_class_xdigitsigemptyset__pthread_mutex_lock_IO_file_writepthread_getspecificpthread_rwlock_rdlock__new_sem_destroy_IO_ferrorstrerror__init_misc__gconv_transform_ascii_internal__mpn_sub_n__wcsmbs_clone_convgeteuidstrndupinet_pton_dl_profile_output__getdents__mpn_cmp__mbrlenpthread_attr_initmalloc_get_stateargz_add_sep__sched_get_priority_max__x86_64_data_cache_size_half__mpn_addmul_1pthread_mutexattr_getkind_np__strnlen__static_tls_size__gconv__cfree__xpg_basename__where_is_shmfsmemmove__gconv_transform_ucs2_internal__printf_modifier_tablepthread_rwlock_init__tcgetattr_dl_new_object__lll_timedlock_waitpthread_rwlockattr_getkind_np__pthread_debugpthread_exit_Unwind_Resume_or_Rethrow__calloc_dl_make_stack_executable_IO_default_xsgetnsem_timedwait__endmntent__pthread_mutex_cond_lock_adjustmunmap__sched_getparam__libc_stack_endpthread_barrierattr_destroyfileno_unlockedpthread_rwlock_timedwrlocksched_getparam_nl_default_locale_path__pthread_cond_timedwait__gconv_get_path_longjmp__register_printf_specifier_dl_debug_fd_nl_C_LC_NAME__tsearch_IO_vasprintf_thread_db_pthread_report_eventspthread_condattr_setpshared____strtol_l_internalftello64_IO_file_seekoff_mmap__pthread_once_internal__libc_fcntl__gettext_free_exp__pause_nocancelffindex_write__pthread_multiple_threads__isnan__new_sem_initpthread_rwlockattr_setpshared_dl_load_cache_lookup_nl_current_LC_NUMERIC_used__write_IO_fopen64__gettext_extract_pluralpthread_attr_getstackmalloc_stats__mmap_IO_sgetn__msgrcv_nocancel__pthread_attr_setdetachstate__msgsnd__mprotect_dl_use_load_bias_nl_domain_bindingsffindex_copyright_textstatfs64__gconv_path_envvar_Unwind_GetRegionStartpthread_condattr_getclock__pthread_setaffinity_new__dprintf__add_to_environ_dl_initial_searchlist_thread_db_pthread_schedpolicygetenv_IO_file_seekwcslen__parse_one_specwcpwrite64__pthread_key_create_internal__pthread_mutexattr_settype_itoa_worderrno__getmntent_rstrtold__sendto_nocancel__tz_computegetegid__new_fdopen__pthread_rwlock_init__tdestroy__rawmemchr__free_stacks_dl_profile_fixup__getcwd_nl_current_LC_IDENTIFICATION_used__res_ninit__mbsrtowcs_l_Unwind_Backtrace__pthread_key_create__libc_accept__sem_mappings_lockpthread_setname_np_IO_init_marker__strtol_internal_nl_category_name_idxsbsearchwmempcpy__libc_h_errno__pthread_current_priority__tzname__pthread_getspecific_internal__woverflow_thread_db_dtv_dtvpthread_spin_lock_IO_cookie_initexecve_IO_2_1_stdout___register_printf_functionvsscanfpthread_condattr_init__fsync_nocancel__libc_pwrite64__mpn_mul_n_IO_new_file_initgetpidgetpagesize__pthread_rwlock_wrlockffindex_index_parse__libc_multiple_threads_ptr__accept_nocancel__strtold_lpthread_getcpuclockidpthread_attr_getstackaddr__gconv_lookup_cache_dl_higher_prime_number__dup2_nl_C_LC_CTYPE_class_cntrlqsort__posix_memalign_IO_flush_all_linebufferedfgets__lll_lock_wait_nl_current_LC_TELEPHONE_used_IO_fclose_nl_current_LC_PAPER_nl_expand_alias__gconv_modules_db__strtoll_internal_IO_wdo_writepthread_key_delete__msync_nocancel__getdelim__read__wcschrnul__pthread_cleanup_pop_pthread_cleanup_pop__pthread_atfork_IO_default_underflowpthread_attr_getaffinity_np_dl_rtld_map_IO_funlockfilegetrlimit64_dl_init__gconv_load_cacheprctl__mallinfo__gconv_transform_ucs4le_internal_dl_platformlen_dl_tls_static_used_IO_switch_to_wget_mode__x86_64_data_cache_sizemsgrcv__localtime_r__realloc_hook__pthread_getaffinity_np__hasmntopt__strncasecmp_l_nonascii_Unwind_GetCFA__exit_funcs__gettextparsememcpypthread_cancelsetitimer__strncasecmp__unlink_IO_default_xsputn__mpn_lshiftpthread_condattr_setclock_nl_load_localeargz_count___printf_fp_thread_db_pthread_key_data_data_IO_fwrite_IO_default_setbuf_IO_sungetc__pthread_mutex_cond_lock_dl_try_allocate_static_tlsperrorpthread_mutexattr_destroy__dlsym__gconv_get_cache_dl_addr_inside_object_IO_new_fdopen_IO_fwide__gconv_find_shlib__connect_internalstrtoll_l_nl_unload_locale__DTOR_END___IO_new_file_close_it_dl_debug_mask__netlink_open_IO_wfile_overflow__libc_memalignpthread_equal__strcasecmp_l_nonascii__gconv_translit_find__libc_nanosleep__libc_dlsym_privateerrx__overflowdup2__pthread_mutex_initmbrtowc__accept__btowc__mpn_mulsem_destroy__strtol_ul_max_tab_IO_flockfile_dl_non_dynamic_initgetuid__internal_atexit__isinf__memalign_nl_current_LC_MEASUREMENTsystem__mpn_submul_1hasmntopt_IO_file_close__IO_vsprintfargz_stringify__malloc_trim__pthread_cleanup_push_defer__dladdr_nl_current_default_domain_nl_msg_cat_cntrmalloc__libio_translit__open_IO_unsave_markers_nl_C_LC_CTYPE_classisatty____strtof_l_internal_dl_load_addsconfstr__gettext_germanic_plural__llseeksiglongjmp__wcsmbs_getfctpthread_attr_getscope_IO_2_1_stdin___gconv_transform_internal_ucs4_thread_db_sizeof_td_thr_events_t__get_child_max_dl_protect_relro__pthread_rwlock_tryrdlocksched_setscheduler__asprintf__strerror_rbtowc__wcsmbs_load_conv__strftime_lstrtoll__mpn_impn_sqr_npthread_rwlock_destroyregister_printf_modifiersys_nerropen_memstream__xidcmdrecvfromsem_wait_nl_C_LC_ADDRESS_dl_wait_lookup_donetcdrain_dl_mcount_wrapperpthread_attr_getguardsize_dl_deallocate_tlsstatfs_nl_C_LC_CTYPE_class_graph__mpn_impn_mul_n__current_locale_name__pthread_rwlock_rdlockpthread_mutexattr_getprotocol_nl_C_LC_CTYPE_tolower_dl_profile__libc_longjmp___vfprintf_chkstrtoul__dso_handle__mpn_construct_float__strsepsem_postsched_getscheduler__new_exitfn__libc_alloca_cutoffpthread_testcancel_nl_current_LC_NAME_used_dl_finimktempstrtold_l__nptl_deallocate_tsd_IO_switch_to_main_wget_area__pthread_attr_setschedparam__libc_pthread_init__pthread_attr_getstackaddr__dcgettext__libc_csu_fini_nl_current_LC_CTYPE_usedpthread_rwlock_unlock_IO_ftellstrftime_l_IO_str_init_readonly_IO_file_seekoff_nl_current_LC_TIME_dl_discover_osversion_nl_cleanup_time__memcmp_sse4_1__libc_init_securesocket_dl_nothread_init_static_tls__frame_state_for_pthread_cleanup_pop_restore__offtimereaddir__attr_list_lock_IO_adjust_wcolumn__strtoul_internalpvalloc_IO_str_seekofffopencookie__getgid__pthread_attr_setstacksize_lxstatpthread_attr_getinheritsched_xstat__pthread_rwlock_unlock__pwrite_IO_file_setbuf__lseek64_IO_new_file_fopenmempcpy__libc_mallinfo__pthread_unwind_nextfflush_IO_new_fopen__pthread_setcancelstate_environ_thread_db___nptl_last_eventsem_unlink_dl_cpuclock_offset__gconv_btwoc_ascii_IO_fdopen_nl_current_LC_MESSAGES__wcslen_IO_default_write__syscall_error_1__libc_pwrite__libc_read__fxprintf_thread_db_pthread_specific__tzname_max__have_sock_cloexec__libc_disable_asynccancel__gconv_find_transform__clone__gcc_personality_v0pthread_mutexattr_getrobust__xstat64_IO_file_close_mmapputwc_unlockedffindex_tree_unlink__GI_strchr_dl_allocate_tls_storage__exit_threadlseek__libc_reallocwmemcpy__libc_tsd_CTYPE_TOLOWER__gconv_transform_ucs2reverse_internalclearenv_dl_tls_static_align__libc_sigwait__pthread_getschedparam_dl_scope_free__environ__waitmmapstrncasecmp_Exit__lll_unlock_wakestrtol_l_nl_intern_locale_data_dl_lookup_symbol_xpthread_detach_thread_db_pthread_eventbuf_nl_cleanup_ctype_dl_tls_max_dtv_idxsend_nl_C_LC_CTYPE_map_toupper_nl_C_LC_CTYPE_class_punctabort__libc_setlocale_lock__pread_nocancel_thread_db_sizeof_pthread_key_structpthread_attr_getschedpolicy__sigjmp_save__sched_fifo_min_prio__stack_chk_failffnchomp_dl_close__printf_fptzname__find_thread_by_id_dl_bind_not__libc_enable_secure_IO_wpadnftrylockfile_nl_postload_ctype_IO_fopencookietdelete_IO_fputs_thread_db_sizeof_pthread_key_data__gconv_transform_ucs4_internal__open_nocancel__recvmsg_nocancel_init_nl_C_LC_CTYPE_class_digit_IO_str_pbackfail__libc_thread_freeres_IO_wfile_xsputn__gconv_max_path_elem_len_IO_default_imbue__mpn_divremstrtoqpthread_attr_setstackaddrstrtol__sigsetjmppipe__libc_lseek64__dlmopen__backtrace_symbols_fdstrnlenrawmemchr__libc_csu_irel__lxstatuname__GI_stpcpy_nl_find_domainaccept_IO_default_readverrxpthread_getschedparam__register_frame_table__stack_user_IO_file_close_it__sys_nerr_internal_sys_nerr__libc_pread64_dl_platform__res_initstamp_IO_iter_begin____strtod_l_internal_nl_C_LC_CTYPE_class32pthread_setcancelstate__gethostname_dl_get_tls_static_infombsnrtowcsstrrchr__ctype_tolower_loc__libc_check_standard_fds__after_morecore_hooknanosleep__mpn_construct_double_thread_db_sizeof_pthreadcalloch_errno__start___libc_atexit__setitimerstrcasecmp_l__libc_enable_secure_decided_IO_file_stat__pthread_attr_getscope_dl_start__pthread_mutex_unlockmalloc_usable_size__sscanf__strtold_internaltdestroy__tzfile_default__register_frame_info_bases_IO_wfile_sync__libc_pvalloc__strtoll_l_dl_runtime_resolvestrtod_IO_vfscanf_internal__determine_cpumask_sizeisinf__sched_getschedulerrindex__lseek_nocancel__readonly_area_dl_tlsdesc_resolve_rela_fixupexecvpe__guess_grouping__pthread_rwlock_unlock_internal__pthread_getspecificpthread_condattr_destroyffindex_insert_filepthread_attr_setscopewrite__execve__libc_valloc__strtod_lbacktrace_nl_C_LC_CTYPE_map_tolower__fork_generation_pointer__pthread_attr_setscope__backtrace_nl_locale_subfreeresenviron__dcigettextfprintf__tzset_parse_tz_thread_db_pthread_nextevent__pthread_attr_getschedpolicypthread_mutex_setprioceilingfputs_unlocked__pthread_mutex_trylock_thread_db_pthread_dtvp_dl_add_to_namespace_list__mpn_construct_long_doubledl_iterate_phdr_IO_str_jumps_IO_str_finish__sem_mappings_nl_normalize_codesetpthread_mutexattr_setkind_np__pthread_clock_settimedcgettext_dl_tls_static_sizebind_dl_debug_printf_c_IO_default_showmanycstrtof_lgetmntent_r__get_nprocs__isattyif_nameindexinet_addr_nl_state_lock__profile_frequency_dl_lazy_dl_debug_state_.stapsdt.base__gettimeofday_internal__gconv_transform_internal_ascii__stpcpy__mmap64_nl_parse_alt_digit__gettimeofday__inet_atonpthread_rwlock_timedrdlockpthread_cond_broadcastpthread_onceif_nametoindex_IO_str_overflow__deregister_frame_info_dl_initial_error_catch_tsdmadvise__malloc__GI___strcasecmp_l__send_dl_init_pathspthread_attr_setinheritsched__msgsnd_nocancel__statfs__link_IO_file_xsgetn__hash_string_IO_cleanup_dl_argv_IO_default_seekposffindex_tree_get_entry__gconv_open__free_Unwind_Resume__dlclose_Unwind_DeleteException__fpu_control__gconv_transform_internal_ucs2__netlink_request__x86_64_prefetchwfseekmremap__getrlimitpthread_setschedparam_IO_new_do_write_nl_current_LC_CTYPE__GI_strcmp_thread_db_sizeof_list_t__readdir64_IO_file_underflowgetdelim____strtold_l_internal__gconv_release_shlib_nl_C_LC_MONETARY__read_nocancel_nl_make_l10nflist__fopen_internalpthread_barrierattr_setpshared_IO_no_init__pthread_rwlock_wrlock_internal__strchrnul__libc_register_dl_open_hook_tens_in_limb_IO_padn__nanosleep_IO_file_overflowpthread_key_creatememchr_IO_getline_info_thread_db___pthread_keys__vsyslog__pthread_initialize_minimal__parse_one_specmb__readdirstdintfindwaitbacktrace_symbols_fd_nl_current_LC_TIME_used_dl_runtime_profile__libc_resp__sched_fifo_max_prio_IO_str_init_static_IO_stdout_dl_dst_substitute_fpioconst_pow10_dl_tls_dtv_slotinfo_listpthread_setconcurrencysem_initdprintf_dl_allocate_tls_init__tzname_cur_max__gconv_close__wcrtomb__pthread_mutex_destroymktime_respthread_barrierattr_init__prognametimezone__sched_setparam_startsem_close__deregister_frame_info_bases_thread_db_pthread_key_data_seq__stop___libc_atexit_IO_flush_allpthread_mutexattr_setrobust_npferrorstrstr__lll_timedwait_tid_IO_new_fclose_IO_iter_file__start___libc_thread_subfreeres_IO_adjust_column_IO_flush_all_lockppthread_killftello__libc_errnomalloc_set_state__correctly_grouped_prefixmbpthread_timedjoin_np__libc_init_first_thread_db___nptl_initial_report_eventsread_dl_error_catch_tsd__pthread_initialize_minimal_internal__pthread_exitpthread_getattr_npopenlog_dl_signal_cerrorpread64pthread_attr_setstacksizesendmsg__mpn_extract_doublecloselog__argz_countffindex_bsearch_get_entrystrncmp_nl_current_LC_PAPER_used__strcasecmp_l_ssse3_nl_C_LC_COLLATE_IO_fprintf__secure_getenv_nl_explode_name_IO_vfwprintf_IO_wdefault_doallocate_dl_tlsdesc_resolve_relawcsrtombs__run_exit_handlers__pthread_unregister_cancel__libc_malloc__pread64__linkin_atfork__memset_sse2pthread_rwlock_wrlockffindex_fopen_by_entry__nptl_set_robustpthread_rwlockattr_getpshared_IO_ftrylockfilewmemsetget_avphys_pagespthread_spin_destroy_IO_marker_delta__ioctl__libc_freestrncpyunlinksetenv_IO_file_underflow_mmap_IO_sungetwc__gen_tempnameprogram_invocation_short_namestrcasecmp_wordcopy_bwd_dest_alignedsendto__opendir_IO_str_countsched_get_priority_max__printf_arginfo_table__pthread_attr_setaffinity_new_dl_openfunlockfile_IO_file_underflow_maybe_mmap__pvallocpthread_sigmaskreallocaddmntent_nl_C_LC_CTYPE_class_space__getegid__register_atfork__libc_siglongjmpfcloseall__pread_IO_wfile_jumps_maybe_mmap_dl_check_all_versions_dl_debug_initialize__tz_convert__mkdir__opensock__argz_create_sep__strdup_dl_tls_dtv_gaps__gconv_alias_compare__cxa_atexit__deallocate_stack__libc_send__wmemmove_IO_file_xsputn__brk__pthread_attr_setstackaddrreaddir64_nl_C_IO_wmarker_deltapthread_cond_init__GI_strcpywcsnlenregister_printf_specifier__libc_mallopttowctrans__pthread_cleanup_push_thread_db_link_map_l_tls_modid_IO_default_stat_IO_new_file_syncmemcmp__sched_setscheduler_IO_file_jumps_maybe_mmapsched_get_priority_min__profilpthread_spin_unlock_nl_current_LC_MESSAGES_used__mpn_add_nmalloc_trimpthread_rwlockattr_initfdopen_nl_current_LC_NUMERICfork_nl_current_LC_ADDRESS____strtoul_l_internalsscanf__fwprintf_nl_C_LC_CTYPE_touppersetmntent_Unwind_RaiseException__sched_yieldffindex_index_as_treepthread_mutexattr_getpshared__strcasecmp_l_itowa_lower_digits_IO_marker_difference__pthread_attr_getaffinity_newfputws_unlocked_dl_get_originsem_trywait__libc_pausemsgsndsigaction_dl_phdr__pthread_mutexattr_initwcschr_IO_free_wbackup_area__sigwait__libc_malloc_initialized_dl_name_match_pendmntent__nptl_death_event__res_init_nl_remove_locale__getpagesize_thread_db_pthread_cancelhandlingfread__mbrtowc__dlopen_IO_free_backup_area__syscall_error_nl_C_LC_TIMEpthread_setaffinity_np_IO_file_initsbrk__bind_nl_current_LC_MEASUREMENT_used_itoa_lower_digitsstrdup_nl_C_locobj__libc_close__underflow__make_stacks_executable__gconv_get_builtin_trans_dl_nns__pthread_condattr_destroy_Unwind_SetIPinet_aton__libc_csu_init_thread_db_pthread_key_struct_seqffindex_fopen_by_nameffindex_get_data_by_entry_dl_random__abort_msg_thread_db_pthread_eventbuf_eventmask_event_bits_dl_unmap_dl_scope_free_listpthread_condattr_getpshared__get_nprocs_conf__gconv_release_stepstrtoullindex_pthread_cleanup_push_deferffindex_get_data_by_indexgettimeofday__sigsuspend_nocancel__sigsuspendfopen__bss_start__pipe__pthread_unwind__libc_open_IO_wdefault_xsputn__gconv_transform_internal_utf8localtime_IO_default_uflowmemset__pthread_rwlock_destroy__pthread_getaffinity_newerr__wmempcpy__strtol_lmain__memset_x86_64_dl_start_profile_dl_origin_path__wcsnlen__wcsmbs_gconv_fcts_c__cpu_features_nl_current_LC_MONETARY_used_sys_errlistftell_IO_new_file_finish_dl_tls_setup_dl_tls_generation__gconv_lock_longjmp_unwindget_phys_pagesvfwprintfmbsrtowcs_IO_new_file_attach__GI___stpcpy__pthread_attr_setstackpthread_barrier_init__nptl_nthreadsmallopt__vfprintf_chkfclose__fortify_fail_dl_clktckpthread_attr_setstack_dl_cache_libcmp__mon_yday__sem_searchopen64fferror_print_dl_relocate_object_thread_db___nptl_nthreadspthread_mutexattr_settypemalloc_infotcgetattr__libc_writevsys_errlist_dl_dynamic_weak_IO_vfprintf_internal__strstr_sse42time__libc_recvfromopendir__wunderflow__uflow_thread_db_pthread_start_routine__pthread_attr_init_2_1__register_frame_info_table_bases_nl_select_era_entry__libc_system_dl_dst_count__condvar_cleanup1pthread_mutexattr_setpshared_IO_sscanf__flockfile_nl_C_name_nl_find_msg_IO_least_marker_IO_switch_to_wbackup_areasyslog_IO_list_resetlockffindex_unlink_entrieswcschrnulfwprintfffindex_get_data_by_offset__recvfrom_nocancel_tmbuf__vsscanf__lll_robust_timedlock_wait_dl_call_pltexitpthread_attr_getdetachstate__dlvsymllseek__lseek_nl_default_dirname_nl_POSIX_name__twalk_IO_getline_dl_allocate_static_tls__setmntentmountpointfread_unlocked__x86_64_shared_cache_size__libc_recvmsg__pthread_attr_getdetachstate__pthread_register_cancel_defer__sendmsg_nocancelstrcmp_IO_wdefault_uflow__mpn_rshift__pthread_clock_gettime_nl_C_LC_MEASUREMENT__gconv_get_alias_dbpthread_mutex_unlock_dl_tlsdesc_resolve_holddata_start_nl_find_locale__nptl_setxidpthread_mutexattr_getrobust_np__memchr__malloc_check_init__fork_handlersregister_printf_function__mbsrtowcs__addmntent__printf_function_tabledup__h_errno_location_nl_get_walt_digitstrtoul_l__fopen_maybe_mmap_dl_rtld_di_serinfopthread_barrier_waitgetcwd__wait_lookup_done_dl_sysinfo_dso_nl_C_LC_TELEPHONE__libc_enable_asynccancel__res_state__pthread_attr_getinheritsched_dl_starting_up_nl_C_LC_CTYPE_class_alnum__deregister_frame_IO_setb__dl_iterate_phdr_fini__register_printf_typeffindex_copyright_IO_file_fopen_thread_db_pthread_key_data_level2_data__vfork__write_nocancel__dladdr1__pthread_register_cancel_thread_db_list_t_prevgethostnamememalign_thread_db_pthread_tid_thread_db_td_eventbuf_t_eventdatasprintfvwarn__mempcpy_dl_unload_cache____strtoll_l_internal__reclaim_stacksasprintf__pwrite_nocancel_IO_new_file_setbufmsyncstrerror_r_IO_wfile_seekoffstrtof_IO_wfile_underflow_thread_db_list_t_nextstrtod_l__libc_waitpid__wcsrtombs_IO_file_doallocate_IO_fgets_wordcopy_fwd_dest_aligned__gconv_compare_alias_cache_libc_intl_domainnamestrncasecmp_lpthread_rwlockattr_destroy__gconv_path_elem__libc_multiple_threadssem_open__tens__pthread_attr_setinheritsched_IO_init_wmarkerflockfilesetlocale__libc_tsd_CTYPE_B__getclktck_Unwind_GetTextRelBaseffindex_insert_memory_IO_file_readstderrmmap64_nl_C_LC_CTYPE_class_blank__execvpe__socket__lxstat64vforksetlogmask__libc_setup_tls_IO_file_jumps___asprintfprofilstrsepcfree__strncasecmp_sse42__strtof_lpthread_getaffinity_np__waitpidisnangetifaddrs__libc_forkverrpthread_rwlock_trywrlock__close_nocancel_IO_vsscanfsched_setparam_dl_init_static_tlspthread_rwlock_tryrdlock__pthread_setcanceltypetimelocal_dl_hwcap_mask__res_maybe_init__new_exitfn_called__strend_sse4__fork_lock__fcntl_nocancelfsync_Unwind_FindEnclosingFunction__strsep_g_nl_finddomain_subfreeresvalloc_IO_str_init_static_internal__wctrans_dl_stack_flags_nl_category_name_sizes_nl_get_alt_digitisinfl_dl_mcount__libc_lseek_dl_next_tls_modidisnanl__handle_registered_modifier_mb_IO_fopen_IO_wdefault_finish_dl_mcount_wrapper_checkregister_printf_type_IO_new_file_writemallinfo_IO_stderr__ctype_b_loc__mremap__printf_fphex__connect__pthread_setschedparam_Unwind_GetLanguageSpecificData__strndup_nl_current_LC_NAME__res_iclose_pthread_cleanup_pushpreadpthread_self_dl_init_all_dirspthread_setcanceltype_dl_allocate_tls__res_vinitpthread_spin_initpthread_mutexattr_initfreeifaddrslocaltime_r_dl_tls_static_nelem__tzfile_compute__gconv_get_modules_db__uname__fork_generation_IO_sputbackwc__libc_wait__gconv_read_conf__libc_dlclosetwalk__gconv_close_transform__sprintf__have_futex_clock_realtime_dl_tls_get_addr_soft_IO_file_attachffindex_unlinkargz_create_sepfwrite_unlocked__timezone_sys_nerr_internal_nl_C_LC_NUMERIC__stop___libc_thread_subfreereswmemmove_IO_unsave_wmarkers_IO_file_open__res_randomidffindex_tree_write_dl_map_object__pthread_keys__mbsnrtowcs_nl_archive_subfreeres__libc_tsd_LOCALEfwrite_IO_list_unlock__close__fxstat64__mpn_mul_1access__getuid_itoa_upper_digits_Unwind_ForcedUnwind_edata__xstat_thread_db_dtv_t_pointer_val_dl_load_lockqsort_r__path_search__sched_get_priority_min_IO_switch_to_get_mode_thread_db_sizeof_td_eventbuf_t_end__pthread_enable_asynccancel_dl_fixup_IO_vfscanf_IO_do_write_fitoa_word__strtof_internalpthread_mutex_destroy_nl_locale_file_list_nl_current_LC_COLLATE_IO_getdelim__GI___strncasecmp_lvfscanf_fxstat__gconv_release_cache_thread_db_const_thread_areastrtouq__tzfile_read__new_fclose__wuflow__sysconfpthread_mutex_lockif_freenameindex__sigaction__new_sem_getvalue__argz_stringify__libc_calloc__strncasecmp_ssse3__isinfl__curbrk__gconv_compare_aliassem_getvalue_thread_db_pthread_list__vfwprintf__tfind_nl_global_locale_dl_verbose_IO_default_seekoff_dl_dprintf__strncasecmp_l_IO_doallocbufpthread_cond_wait_dl_signal_error_dl_phnum_flushlbf__ftrylockfile__stack_prot__strtol_ul_rem_tab__libio_codecvt__pthread_create_2_1__errno_location__closedirlink__libc_messageget_nprocs_dl_profile_map_IO_switch_to_backup_area__pthread_kill__dlerror__pthread_mutex_unlock_usercntexit_Unwind_SetGR__free_hook_nl_current_LC_ADDRESS_used__gconv_transform_internal_ucs4lepthread_attr_setguardsize____strtoull_l_internal__pthread_cond_wait__munmap__writev__libc_tsd_CTYPE_TOUPPER__pthread_setspecific__malloc_usable_size__netlink_free_handle__gconv_transliterate__strcasecmp__fxstat_sys_errlist_internal__strtoul_l_IO_sprintf_IO_stdin_thread_db_pthread_schedparam_sched_priority_IO_wsetb_IO_wfile_jumps_mmap__fprintfbrkffindex_insert_filestreampthread_mutex_trylock__tzstring_nl_C_LC_MESSAGES_IO_vfprintf__wcsmbs_named_conv__pthread_selfpthread_atfork__pwrite64_IO_seekoff_dl_aux_init_dl_hwcap__pthread_disable_asynccancel__libc_sendmsg_itowa_upper_digits_IO_wfile_doallocate_thread_db_pthread_key_struct_destr__pthread_mutex_unlock_internal__strcasecmp_ssse3pthread_sigqueue__use_tzfilepthread_cond_destroy_nl_category_names_dl_tlsdesc_resolve_hold_fixup_nl_C_codeset_dl_initfirst__setfpucwfilenovsyslogpthread_attr_setschedpolicypthread_mutexattr_setrobust_IO_str_underflow__sigprocmask_setjmpfgets_unlocked__ctype_toupper_loc__funlockfile__namedsem_once__strcmp_ssse3_IO_stdin_used_exit_dl_load_write_lock__pthread_attr_setschedpolicy_dl_tlsdesc_return__nptl_create_eventpthread_setschedprio__init_sched_fifo_prio__kernel_cpumask_size__malloc_set_state__strcasecmp_sse42__alloc_dir__libc_recv__getsockname__getdents64_Unwind_GetGR_nl_default_default_domain_thread_db_td_thr_events_t_event_bitsvwarnx__libc_argvpthread_mutex_init__libc_start_main__pthread_cleanup_pop_restore__lll_lock_wait_private__pthread_attr_getstacksizestrlenlseek64__recv__x86_64_shared_cache_size_half__sendmsgpthread_mutexattr_setprotocolopenprogram_invocation_name__libc_dlsymclone__libc_write__vfscanf__default_stacksize__fcntl__pthread_tpp_change_prioritypthread_attr_setaffinity_npvdprintf_thread_db_pthread_pid_IO_init__gconv_transform_internal_ucs2reversepthread_mutexattr_getprioceiling__fork_nl_C_LC_CTYPE_class_lower__libc_sendto_dl_all_dirs__setenv__clearenvstrchr__nanosleep_nocancel_dl_add_to_slotinfo__pthread_unregister_cancel_restore__realloc__gconv_alias_db_IO_iter_end__malloptfputs_quicksort_Unwind_GetDataRelBaseexecvp_IO_new_file_underflowpthread_attr_setschedparam__data_start_dlerror_run__malloc_get_state_dl_sym__pthread_cond_init__libc_fatal__get_phys_pages__sbrkmprotect_IO_default_seek__tdelete__access_r_debug__printf_va_arg_table__malloc_statsclosedirffindex_insert_dir_IO_wdefault_pbackfail__netlink_close__libc_msyncwarn__sys_errlist_internal_dl_osversion_IO_list_all_Jv_RegisterClasses__argz_add_sep__pthread_cond_destroy_IO_new_file_overflow__pthread_rwlock_rdlock_internal__libc_dlopen_mode__unsetenv_IO_new_file_seekoffpthread_getname_npvasprintf__mktime_internal__pthread_cond_broadcast__sendtopthread_attr_setdetachstaterecvmsg___vfscanf_dl_sysdep_read_whole_filestrchrnul__prctl_nl_current_LC_MONETARY__pthread_cleanup_routine__libc_sigsuspendfcntlffindex_get_entry_by_nametzsetsched_yield_dl_addr__get_avphys_pagespthread_join__handle_registered_modifier_wc__open64pthread_getconcurrency_nl_C_LC_PAPER_dl_catch_error_IO_un_link__register_frame_info_table__pthread_mutex_lock_internal_IO_file_setbuf_mmap_dl_make_stack_executable_hook_dl_inhibit_rpathget_nprocs_confpthread_cond_timedwaitffindex_mmap_data_thread_db_pthread_eventbuf_eventmask_IO_default_pbackfailffindex_sort_index_filemkdir_dl_tlsdesc_undefweakposix_memalign__register_frame_info_IO_vdprintf__pthread_setspecific_internalsigwaitwcrtomb__strncasecmp_l_ssse3_dl_correct_cache_id_dl_sort_fini__pthread_equal__new_fopenpwriteclosepthread_mutexattr_setprioceilingffindex_insert_list_file__strncpy_sse2pthread_mutex_consistent_np__libc_connect__wmemcpypthread_attr_getschedparam_IO_iter_next_dl_close_worker_dl_pagesize__valloc__memalign_hook__pthread_init_static_tls_nl_current_LC_IDENTIFICATION__resp__geteuidfmemopen_wordcopy_bwd_alignedvfprintf_IO_2_1_stderr___progname_fullstrpbrkpthread_setspecific_IO_switch_to_main_get_areasigsuspend__lll_unlock_wake_privateraise_thread_db_sizeof_pthread_key_data_level2_IO_seekmark__pthread_cond_signal_nl_C_LC_CTYPE_class_alphafree__towctrans_nl_get_era_entry__free_tcb__res_nclosesigprocmask_IO_old_init_IO_file_jumps_mmap__gmon_start____libc_register_dlfcn_hookgetsockname_dl_map_object_deps_nl_C_LC_IDENTIFICATION_dl_ns_nl_load_locale_from_archivewctrans__cache_sysconffopen64hhsuite-2.0.16/lib/ffindex/src/ffindex_apply_mpi.c0000664172256617226630000002242312075476615024430 0ustar hauserscientific_computing/* * FFindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * FFindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * ffindex_apply * apply a program to each FFindex entry */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" char* read_buffer; int ffindex_apply_by_entry(char *data, ffindex_index_t* index, ffindex_entry_t* entry, char* program_name, char** program_argv, FILE* data_file_out, FILE* index_file_out, size_t *offset) { int ret = 0; int capture_stdout = (data_file_out != NULL); int pipefd_stdin[2]; int pipefd_stdout[2]; ret = pipe(pipefd_stdin); if(ret != 0) { fprintf(stderr, "ERROR in pipe stdin!\n"); perror(entry->name); return errno; } if(capture_stdout) { ret = pipe(pipefd_stdout); if(ret != 0) { fprintf(stderr, "ERROR in pipe stdout!\n"); perror(entry->name); return errno; } } // Flush so child doesn't copy and also flushes, leading to duplicate output fflush(data_file_out); fflush(index_file_out); pid_t child_pid = fork(); if(child_pid == 0) { close(pipefd_stdin[1]); if(capture_stdout) { fclose(data_file_out); fclose(index_file_out); close(pipefd_stdout[0]); } // Make pipe from parent our new stdin int newfd_in = dup2(pipefd_stdin[0], fileno(stdin)); if(newfd_in < 0) { fprintf(stderr, "ERROR in dup2 in %d %d\n", pipefd_stdin[0], newfd_in); perror(entry->name); } close(pipefd_stdin[0]); if(capture_stdout) { int newfd_out = dup2(pipefd_stdout[1], fileno(stdout)); if(newfd_out < 0) { fprintf(stderr, "ERROR in dup2 out %d %d\n", pipefd_stdout[1], newfd_out); perror(entry->name); } close(pipefd_stdout[1]); } setenv("FFINDEX_ENTRY_NAME", entry->name, 1); // exec program with the pipe as stdin execvp(program_name, program_argv); // never reached } else if(child_pid > 0) { // parent writes to and possible reads from child int flags = 0; // Read end is for child only close(pipefd_stdin[0]); if(capture_stdout) close(pipefd_stdout[1]); char *filedata = ffindex_get_data_by_entry(data, entry); if(capture_stdout) { flags = fcntl(pipefd_stdout[0], F_GETFL, 0); fcntl(pipefd_stdout[0], F_SETFL, flags | O_NONBLOCK); } // Write file data to child's stdin. ssize_t written = 0; size_t to_write = entry->length - 1; // Don't write ffindex trailing '\0' char* b = read_buffer; while(written < to_write) { size_t rest = to_write - written; int batch_size = PIPE_BUF; if(rest < PIPE_BUF) batch_size = rest; ssize_t w = write(pipefd_stdin[1], filedata + written, batch_size); if(w < 0 && errno != EPIPE) { fprintf(stderr, "ERROR in child!\n"); perror(entry->name); break; } else written += w; if(capture_stdout) { // To avoid blocking try to read some data ssize_t r = read(pipefd_stdout[0], b, PIPE_BUF); if(r > 0) b += r; } } close(pipefd_stdin[1]); // child gets EOF if(capture_stdout) { // Read rest fcntl(pipefd_stdout[0], F_SETFL, flags); // Remove O_NONBLOCK ssize_t r; while((r = read(pipefd_stdout[0], b, PIPE_BUF)) > 0) b += r; close(pipefd_stdout[0]); ffindex_insert_memory(data_file_out, index_file_out, offset, read_buffer, b - read_buffer, entry->name); } int status; waitpid(child_pid, &status, 0); fprintf(stderr, "%s\t%ld\t%ld\t%d\n", entry->name, entry->offset, entry->length, WEXITSTATUS(status)); } else { fprintf(stderr, "ERROR in fork()\n"); perror(entry->name); return errno; } return EXIT_SUCCESS; } int main(int argn, char **argv) { int mpi_error, mpi_rank, mpi_num_procs; mpi_error = MPI_Init(&argn, &argv); mpi_error = MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); mpi_error = MPI_Comm_size(MPI_COMM_WORLD, &mpi_num_procs); int opt, merge = 1; char *data_filename_out = NULL, *index_filename_out = NULL; while ((opt = getopt(argn, argv, "d:i:m")) != -1) { switch (opt) { case 'm': merge = 0; break; case 'd': data_filename_out = optarg; break; case 'i': index_filename_out = optarg; break; } } if(argn - optind < 3) { fprintf(stderr, "Not enough arguments %d.\n", optind - argn); fprintf(stderr, "USAGE: %s [-m] -d DATA_FILENAME_OUT -i INDEX_FILENAME_OUT DATA_FILENAME INDEX_FILENAME -- PROGRAM [PROGRAM_ARGS]*\n" "\t-m\tDo not merge the FFindex parts generated by the different MPI processes\n" "\t\tThis is useful for large MPI Jobs where merge time might be accounted.\n" "\nDesigned and implemented by Andy Hauser .\n", argv[0]); return -1; } read_buffer = malloc(400 * 1024 * 1024); char *data_filename = argv[optind++]; char *index_filename = argv[optind++]; char *program_name = argv[optind]; char **program_argv = argv + optind; FILE *data_file = fopen(data_filename, "r"); FILE *index_file = fopen(index_filename, "r"); if( data_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], data_filename); exit(EXIT_FAILURE); } if(index_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], index_filename); exit(EXIT_FAILURE); } FILE *data_file_out = NULL, *index_file_out = NULL; // Setup one output FFindex for each MPI process if(data_filename_out != NULL && index_filename_out != NULL) { char* data_filename_out_rank = malloc(FILENAME_MAX); char* index_filename_out_rank = malloc(FILENAME_MAX); snprintf( data_filename_out_rank, FILENAME_MAX, "%s.%d", data_filename_out, mpi_rank); snprintf(index_filename_out_rank, FILENAME_MAX, "%s.%d", index_filename_out, mpi_rank); data_file_out = fopen(data_filename_out_rank, "w+"); index_file_out = fopen(index_filename_out_rank, "w+"); if( data_file_out == NULL) { fferror_print(__FILE__, __LINE__, argv[0], data_filename_out); exit(EXIT_FAILURE); } if(index_file_out == NULL) { fferror_print(__FILE__, __LINE__, argv[0], index_filename_out); exit(EXIT_FAILURE); } } int capture_stdout = (data_file_out != NULL); size_t data_size; char *data = ffindex_mmap_data(data_file, &data_size); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_index_parse", index_filename); MPI_Finalize(); exit(EXIT_FAILURE); } // Ignore SIGPIPE struct sigaction handler; handler.sa_handler = SIG_IGN; sigemptyset(&handler.sa_mask); handler.sa_flags = 0; sigaction(SIGPIPE, &handler, NULL); size_t batch_size, range_start, range_end; if(index->n_entries >= mpi_num_procs) batch_size = index->n_entries / mpi_num_procs; else batch_size = 0; range_start = mpi_rank * batch_size; range_end = range_start + batch_size; size_t offset = 0; // Foreach entry if(batch_size > 0) for(size_t entry_index = range_start; entry_index < range_end; entry_index++) { ffindex_entry_t* entry = ffindex_get_entry_by_index(index, entry_index); if(entry == NULL) { perror(entry->name); return errno; } int error = ffindex_apply_by_entry(data, index, entry, program_name, program_argv, data_file_out, index_file_out, &offset); if(error != 0) { perror(entry->name); break; } } ssize_t left_over = index->n_entries - (batch_size * mpi_num_procs); if(mpi_rank < left_over) { size_t left_over_entry_index = (batch_size * mpi_num_procs) + mpi_rank; ffindex_entry_t* entry = ffindex_get_entry_by_index(index, left_over_entry_index); if(entry == NULL) { perror(entry->name); return errno; } //fprintf(stderr, "handling left over: %ld\n", left_over_entry_index); int error = ffindex_apply_by_entry(data, index, entry, program_name, program_argv, data_file_out, index_file_out, &offset); if(error != 0) perror(entry->name); } if(capture_stdout) fclose(data_file_out); if(index_file_out != NULL) fclose(index_file_out); MPI_Barrier(MPI_COMM_WORLD); // merge FFindexes in master if(merge && data_filename_out != NULL && mpi_rank == 0) { char* merge_command = malloc(FILENAME_MAX * 5); for(int i = 0; i < mpi_num_procs; i++) { snprintf( merge_command, FILENAME_MAX, "ffindex_build -as %s %s -d %s.%d -i %s.%d", data_filename_out, index_filename_out, data_filename_out, i, index_filename_out, i); //puts(merge_command); if(system(merge_command) == 0) { snprintf(merge_command, FILENAME_MAX, "%s.%d", data_filename_out, i); unlink(merge_command); snprintf(merge_command, FILENAME_MAX, "%s.%d", index_filename_out, i); unlink(merge_command); } } } MPI_Finalize(); return EXIT_SUCCESS; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ffindex_unpack.c0000664172256617226630000000464412075476615023724 0ustar hauserscientific_computing/* * FFindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * FFindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * ffindex_apply * apply a program to each FFindex entry */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" int main(int argn, char **argv) { if(argn < 4) { fprintf(stderr, "USAGE: %s DATA_FILENAME INDEX_FILENAME OUT_DIR\n" "\nDesigned and implemented by Andy Hauser .\n", argv[0]); return -1; } char *data_filename = argv[1]; char *index_filename = argv[2]; char *out_dir = argv[3]; FILE *data_file = fopen(data_filename, "r"); FILE *index_file = fopen(index_filename, "r"); if( data_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], data_filename); exit(EXIT_FAILURE); } if(index_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], index_filename); exit(EXIT_FAILURE); } size_t data_size; char *data = ffindex_mmap_data(data_file, &data_size); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_index_parse", index_filename); exit(EXIT_FAILURE); } if(chdir(out_dir) < 0){ fferror_print(__FILE__, __LINE__, argv[0], out_dir); exit(EXIT_FAILURE); } size_t range_start = 0; size_t range_end = index->n_entries; // Foreach entry //#pragma omp parallel for for(size_t entry_index = range_start; entry_index < range_end; entry_index++) { //fprintf(stderr, "index %ld\n", entry_index); ffindex_entry_t* entry = ffindex_get_entry_by_index(index, entry_index); if(entry == NULL) { perror(entry->name); continue; } FILE *output_file = fopen(entry->name, "w"); // Write file data to child's stdin. char *filedata = ffindex_get_data_by_entry(data, entry); size_t written = fwrite(filedata, entry->length - 1, 1, output_file); if(written < 1) { perror(entry->name); break; } fclose(output_file); } return 0; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ffindex_build.c0000664172256617226630000001720112075476615023533 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" #define MAX_FILENAME_LIST_FILES 4096 void usage(char *program_name) { fprintf(stderr, "USAGE: %s [-a|-v] [-s] [-f file]* OUT_DATA_FILE OUT_INDEX_FILE [-d 2ND_DATA_FILE -i 2ND_INDEX_FILE] [DIR_TO_INDEX|FILE]*\n" "\t-a\t\tappend files/indexes, also needed for sorting an already existing ffindex\n" "\t-d FFDATA_FILE\ta second ffindex data file for inserting/appending\n" "\t-i FFINDEX_FILE\ta second ffindex index file for inserting/appending\n" "\t-f FILE\t\tfile containing a list of file names, one per line\n" "\t\t\t-f can be specified up to %d times\n" "\t-s\t\tsort index file, so that the index can queried.\n" "\t\t\tAnother append operations can be done without sorting.\n" "\t-v\t\tprint version and other info then exit\n" "\nEXAMPLES:\n" "\tCreate a new ffindex containing all files from the \"bar/\" directory containing\n" "\tsay myfile1.txt, myfile2.txt and sort (-s) it so that e.g. ffindex_get can use it.\n" "\t\t$ ffindex_build -s foo.ffdata foo.ffindex bar/\n" "\n\tAdd (-a) more files: myfile3.txt, myfile4.txt.\n" "\t\t$ ffindex_build -a foo.ffdata foo.ffindex myfile3.txt myfile4.txt\n" "\n\tOops, forgot to sort it (-s) so do it afterwards:\n" "\t\t$ ffindex_build -as foo.ffdata foo.ffindex\n" "\nNOTE:\n" "\tMaximum key/filename length is %d and maximum entries are by default %d\n" "\tThis can be changed in the sources.\n" "\nDesigned and implemented by Andreas W. Hauser .\n", program_name, MAX_FILENAME_LIST_FILES, FFINDEX_MAX_ENTRY_NAME_LENTH, FFINDEX_MAX_INDEX_ENTRIES_DEFAULT); } int main(int argn, char **argv) { int append = 0, sort = 0, unlink = 0, version = 0; int opt, err = EXIT_SUCCESS; char* list_filenames[MAX_FILENAME_LIST_FILES]; char* list_ffindex_data[MAX_FILENAME_LIST_FILES]; char* list_ffindex_index[MAX_FILENAME_LIST_FILES]; size_t list_ffindex_data_index = 0; size_t list_ffindex_index_index = 0; size_t list_filenames_index = 0; while ((opt = getopt(argn, argv, "asuvd:f:i:")) != -1) { switch (opt) { case 'a': append = 1; break; case 'd': list_ffindex_data[list_ffindex_data_index++] = optarg; break; case 'i': list_ffindex_index[list_ffindex_index_index++] = optarg; break; case 'f': list_filenames[list_filenames_index++] = optarg; break; case 's': sort = 1; break; case 'v': version = 1; break; default: usage(argv[0]); return EXIT_FAILURE; } } if(version == 1) { /* Don't you dare running it on a platform where byte != 8 bits */ printf("%s version %.2f, off_t = %zd bits\n", argv[0], FFINDEX_VERSION, sizeof(off_t) * 8); return EXIT_SUCCESS; } if(argn - optind < 2) { usage(argv[0]); return EXIT_FAILURE; } if(append && unlink) { fprintf(stderr, "ERROR: append (-a) and unlink (-u) are mutually exclusive\n"); return EXIT_FAILURE; } if(list_ffindex_data_index != list_ffindex_index_index) { fprintf(stderr, "ERROR: -d and -i must be specified pairwise\n"); return EXIT_FAILURE; } char *data_filename = argv[optind++]; char *index_filename = argv[optind++]; FILE *data_file, *index_file; size_t offset = 0; /* open index and data file, seek to end if needed */ if(append) { data_file = fopen(data_filename, "a"); if( data_file == NULL) { perror(data_filename); return EXIT_FAILURE; } index_file = fopen(index_filename, "a+"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } struct stat sb; fstat(fileno(data_file), &sb); fseek(data_file, sb.st_size, SEEK_SET); offset = sb.st_size; fstat(fileno(index_file), &sb); fseek(index_file, sb.st_size, SEEK_SET); } else { struct stat st; if(stat(data_filename, &st) == 0) { errno = EEXIST; perror(data_filename); return EXIT_FAILURE; } data_file = fopen(data_filename, "w"); if( data_file == NULL) { perror(data_filename); return EXIT_FAILURE; } if(stat(index_filename, &st) == 0) { errno = EEXIST; perror(index_filename); return EXIT_FAILURE; } index_file = fopen(index_filename, "w+"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } } /* For each list_file insert */ if(list_filenames_index > 0) for(int i = 0; i < list_filenames_index; i++) { FILE *list_file = fopen(list_filenames[i], "r"); if( list_file == NULL) { perror(list_filenames[i]); return EXIT_FAILURE; } if(ffindex_insert_list_file(data_file, index_file, &offset, list_file) < 0) { perror(list_filenames[i]); err = -1; } } /* Append other ffindexes */ if(list_ffindex_data_index > 0) { for(int i = 0; i < list_ffindex_data_index; i++) { FILE* data_file_to_add = fopen(list_ffindex_data[i], "r"); if( data_file_to_add == NULL) { perror(list_ffindex_data[i]); return EXIT_FAILURE; } FILE* index_file_to_add = fopen(list_ffindex_index[i], "r"); if( index_file_to_add == NULL) { perror(list_ffindex_index[i]); return EXIT_FAILURE; } size_t data_size; char *data_to_add = ffindex_mmap_data(data_file_to_add, &data_size); ffindex_index_t* index_to_add = ffindex_index_parse(index_file_to_add, 0); for(size_t entry_i = 0; entry_i < index_to_add->n_entries; entry_i++) { ffindex_entry_t *entry = ffindex_get_entry_by_index(index_to_add, entry_i); ffindex_insert_memory(data_file, index_file, &offset, ffindex_get_data_by_entry(data_to_add, entry), entry->length - 1, entry->name); // skip \0 suffix } } } /* Insert files and directories into the index */ for(int i = optind; i < argn; i++) { char *path = argv[i]; struct stat sb; if(stat(path, &sb) == -1) { fferror_print(__FILE__, __LINE__, __func__, path); continue; } if(S_ISDIR(sb.st_mode)) { err = ffindex_insert_dir(data_file, index_file, &offset, path); if(err < 0)fferror_print(__FILE__, __LINE__, __func__, path); } else if(S_ISREG(sb.st_mode)) { ffindex_insert_file(data_file, index_file, &offset, path, path); } } fclose(data_file); /* Sort the index entries and write back */ if(sort) { rewind(index_file); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { fferror_print(__FILE__, __LINE__, __func__, index_filename); exit(EXIT_FAILURE); } fclose(index_file); ffindex_sort_index_file(index); index_file = fopen(index_filename, "w"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } err += ffindex_write(index, index_file); } return err; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ffindex_from_fasta.c0000664172256617226630000000672211740553454024556 0ustar hauserscientific_computing/* * FFindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * FFindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" #define MAX_FILENAME_LIST_FILES 4096 void usage(char *program_name) { fprintf(stderr, "USAGE: %s -v | [-s] data_filename index_filename fasta_filename\n" "\t-s\tsort index file\n" "\nDesigned and implemented by Andreas W. Hauser .\n", program_name); } int main(int argn, char **argv) { int sort = 0, version = 0; int opt, err = EXIT_SUCCESS; while ((opt = getopt(argn, argv, "sv")) != -1) { switch (opt) { case 's': sort = 1; break; case 'v': version = 1; break; default: usage(argv[0]); return EXIT_FAILURE; } } if(version == 1) { /* Don't you dare running it on a platform where byte != 8 bits */ printf("%s version %.2f, off_t = %zd bits\n", argv[0], FFINDEX_VERSION, sizeof(off_t) * 8); return EXIT_SUCCESS; } if(argn - optind < 3) { usage(argv[0]); return EXIT_FAILURE; } char *data_filename = argv[optind++]; char *index_filename = argv[optind++]; char *fasta_filename = argv[optind++]; FILE *data_file, *index_file, *fasta_file; struct stat st; if(stat(data_filename, &st) == 0) { errno = EEXIST; perror(data_filename); return EXIT_FAILURE; } data_file = fopen(data_filename, "w"); if( data_file == NULL) { perror(data_filename); return EXIT_FAILURE; } if(stat(index_filename, &st) == 0) { errno = EEXIST; perror(index_filename); return EXIT_FAILURE; } index_file = fopen(index_filename, "w+"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } fasta_file = fopen(fasta_filename, "r"); if(fasta_file == NULL) { perror(fasta_filename); return EXIT_FAILURE; } size_t fasta_size; char *fasta_data = ffindex_mmap_data(fasta_file, &fasta_size); size_t offset = 0; size_t from_length = 0; char name[FFINDEX_MAX_ENTRY_NAME_LENTH]; int seq_id = 1; for(size_t fasta_offset = 1; fasta_offset < fasta_size; fasta_offset++) // position after first ">" { from_length = 1; while(fasta_offset < fasta_size && !(*(fasta_data + fasta_offset) == '>' && *(fasta_data + fasta_offset - 1) == '\n')) { fasta_offset++; from_length++; } sprintf(name, "%d", seq_id++); ffindex_insert_memory(data_file, index_file, &offset, fasta_data + (fasta_offset - from_length), from_length, name); } fclose(data_file); /* Sort the index entries and write back */ if(sort) { rewind(index_file); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { perror("ffindex_index_parse failed"); exit(EXIT_FAILURE); } fclose(index_file); ffindex_sort_index_file(index); index_file = fopen(index_filename, "w"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } err += ffindex_write(index, index_file); } return err; } /* vim: ts=2 sw=2 et: */ hhsuite-2.0.16/lib/ffindex/src/ffutil.c0000664172256617226630000000213311670345140022204 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * Ffindex is a very simple database for small files. The files are stored * concatenated in one big data file, seperated by '\0'. A second file * contains a plain text index, giving name, offset and length of of the small * files. */ #include #include "ffutil.h" int fferror_print(char *sourcecode_filename, int line, const char *function_name, const char *message) { int myerrno = errno; char* errstr = strerror(myerrno); fprintf(stderr, "%s:%d %s: %s: %s\n", sourcecode_filename , line, function_name, message, errstr); return myerrno; } /* remove \n, assumes UNIX line endings! */ char* ffnchomp(char *s, size_t len) { len -= 1; if(len >= 0 && s[len] == '\n') s[len] = '\0'; return s; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ffindex.c0000664172256617226630000003203512075476615022356 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include "ext/fmemopen.h" /* For OS not yet implementing this new standard function */ #include "ffutil.h" #include "ffindex.h" /* XXX Use page size? */ #define FFINDEX_BUFFER_SIZE 4096 char* ffindex_copyright_text = "Designed and implemented by Andy Hauser ."; char* ffindex_copyright() { return ffindex_copyright_text; } /* Insert a memory chunk (string even without \0) into ffindex */ int ffindex_insert_memory(FILE *data_file, FILE *index_file, size_t *offset, char *from_start, size_t from_length, char *name) { int myerrno = 0; size_t offset_before = *offset; size_t write_size = fwrite(from_start, sizeof(char), from_length, data_file); *offset += write_size; if(from_length != write_size) fferror_print(__FILE__, __LINE__, __func__, name); /* Seperate by '\0' and thus also make sure at least one byte is written */ char buffer[1] = {'\0'}; if(fwrite(buffer, sizeof(char), 1, data_file) != 1) perror("ffindex_insert_memory"); *offset += 1; if(ferror(data_file) != 0) goto EXCEPTION_ffindex_insert_memory; /* write index entry */ fprintf(index_file, "%s\t%zd\t%zd\n", name, offset_before, *offset - offset_before); return myerrno; EXCEPTION_ffindex_insert_memory: { fferror_print(__FILE__, __LINE__, __func__, ""); return myerrno; } } /* Insert all file from a list into ffindex */ int ffindex_insert_list_file(FILE *data_file, FILE *index_file, size_t *start_offset, FILE *list_file) { size_t offset = *start_offset; char path[PATH_MAX]; while(fgets(path, PATH_MAX, list_file) != NULL) ffindex_insert_file(data_file, index_file, &offset, ffnchomp(path, strlen(path)), basename(path)); /* update return value */ *start_offset = offset; return 0; } /* Insert all files from directory into ffindex */ int ffindex_insert_dir(FILE *data_file, FILE *index_file, size_t *start_offset, char *input_dir_name) { DIR *dir = opendir(input_dir_name); if(dir == NULL) { fferror_print(__FILE__, __LINE__, __func__, input_dir_name); return -1; } size_t input_dir_name_len = strlen(input_dir_name); char path[PATH_MAX]; strncpy(path, input_dir_name, NAME_MAX); if(input_dir_name[input_dir_name_len - 1] != '/') { path[input_dir_name_len] = '/'; input_dir_name_len += 1; } size_t offset = *start_offset; struct dirent *entry; while((entry = readdir(dir)) != NULL) { if(entry->d_name[0] == '.') continue; strncpy(path + input_dir_name_len, entry->d_name, NAME_MAX); struct stat sb; if(stat(path, &sb) == -1) fferror_print(__FILE__, __LINE__, __func__, path); if(!S_ISREG(sb.st_mode)) continue; ffindex_insert_file(data_file, index_file, &offset, path, entry->d_name); } closedir(dir); /* update return value */ *start_offset = offset; return 0; } /* Insert one file by path into ffindex */ int ffindex_insert_file(FILE *data_file, FILE *index_file, size_t *offset, const char *path, char *name) { FILE *file = fopen(path, "r"); if(file == NULL) return errno; int ret = ffindex_insert_filestream(data_file, index_file, offset, file, name); fclose(file); return ret; } /* Insert one file by handle into ffindex */ int ffindex_insert_filestream(FILE *data_file, FILE *index_file, size_t *offset, FILE* file, char *name) { int myerrno = 0; /* copy and paste file to data file */ char buffer[FFINDEX_BUFFER_SIZE]; size_t offset_before = *offset; size_t read_size; while((read_size = fread(buffer, sizeof(char), sizeof(buffer), file)) > 0) { size_t write_size = fwrite(buffer, sizeof(char), read_size, data_file); *offset += write_size; if(read_size != write_size) fferror_print(__FILE__, __LINE__, __func__, name); } if(ferror(file)) warn("fread"); /* Seperate by '\0' and thus also make sure at least one byte is written */ buffer[0] = '\0'; if(fwrite(buffer, sizeof(char), 1, data_file) != 1) perror("ffindex_insert_filestream"); *offset += 1; if(ferror(data_file) != 0) goto EXCEPTION_ffindex_insert_file; /* write index entry */ fprintf(index_file, "%s\t%zd\t%zd\n", name, offset_before, *offset - offset_before); if(ferror(file) != 0) goto EXCEPTION_ffindex_insert_file; return myerrno; EXCEPTION_ffindex_insert_file: { fferror_print(__FILE__, __LINE__, __func__, ""); return myerrno; } } /* XXX not implemented yet */ int ffindex_restore(FILE *data_file, FILE *index_file, char *input_dir_name) { return -1; } char* ffindex_mmap_data(FILE *file, size_t* size) { struct stat sb; fstat(fileno(file), &sb); *size = sb.st_size; int fd = fileno(file); if(fd < 0) { fferror_print(__FILE__, __LINE__, __func__, "mmap failed"); return MAP_FAILED; } return (char*)mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0); } static int ffindex_compare_entries_by_name(const void *pentry1, const void *pentry2) { ffindex_entry_t* entry1 = (ffindex_entry_t*)pentry1; ffindex_entry_t* entry2 = (ffindex_entry_t*)pentry2; return strncmp(entry1->name, entry2->name, FFINDEX_MAX_ENTRY_NAME_LENTH); } ffindex_entry_t* ffindex_get_entry_by_name(ffindex_index_t *index, char *name) { return ffindex_bsearch_get_entry(index, name); } ffindex_entry_t* ffindex_bsearch_get_entry(ffindex_index_t *index, char *name) { ffindex_entry_t search; strncpy(search.name, name, FFINDEX_MAX_ENTRY_NAME_LENTH); return (ffindex_entry_t*)bsearch(&search, index->entries, index->n_entries, sizeof(ffindex_entry_t), ffindex_compare_entries_by_name); } ffindex_index_t* ffindex_index_parse(FILE *index_file, size_t num_max_entries) { if(num_max_entries == 0) num_max_entries = FFINDEX_MAX_INDEX_ENTRIES_DEFAULT; size_t nbytes = sizeof(ffindex_index_t) + (sizeof(ffindex_entry_t) * num_max_entries); ffindex_index_t *index = (ffindex_index_t *)malloc(nbytes); if(index == NULL) { fprintf(stderr, "Failed to allocate %ld bytes\n", nbytes); fferror_print(__FILE__, __LINE__, __func__, "malloc failed"); return NULL; } index->num_max_entries = num_max_entries; index->file = index_file; index->index_data = ffindex_mmap_data(index_file, &(index->index_data_size)); if(index->index_data_size == 0) warn("Problem with data file. Is it empty or is another process readning it?"); if(index->index_data == MAP_FAILED) return NULL; index->type = SORTED_ARRAY; /* XXX Assume a sorted file for now */ int i = 0; char* d = index->index_data; char* end; /* Faster than scanf per line */ for(i = 0; d < (index->index_data + index->index_data_size); i++) { int p; for(p = 0; *d != '\t'; d++) index->entries[i].name[p++] = *d; index->entries[i].name[p] = '\0'; index->entries[i].offset = strtol(d, &end, 10); d = end; index->entries[i].length = strtol(d, &end, 10); d = end + 1; /* +1 for newline */ } index->n_entries = i; if(index->n_entries == 0) warn("index with 0 entries"); return index; } ffindex_entry_t* ffindex_get_entry_by_index(ffindex_index_t *index, size_t entry_index) { if(entry_index < index->n_entries) return &index->entries[entry_index]; else return NULL; } /* Using a function for this looks like overhead. But a more advanced data format, * say a compressed one, can do it's magic here. */ char* ffindex_get_data_by_offset(char* data, size_t offset) { return data + offset; } char* ffindex_get_data_by_entry(char *data, ffindex_entry_t* entry) { return ffindex_get_data_by_offset(data, entry->offset); } char* ffindex_get_data_by_name(char *data, ffindex_index_t *index, char *name) { ffindex_entry_t* entry = ffindex_bsearch_get_entry(index, name); if(entry == NULL) return NULL; return ffindex_get_data_by_entry(data, entry); } char* ffindex_get_data_by_index(char *data, ffindex_index_t *index, size_t entry_index) { ffindex_entry_t* entry = ffindex_get_entry_by_index(index, entry_index); if(entry == NULL) return NULL; return ffindex_get_data_by_entry(data, entry); } FILE* ffindex_fopen_by_entry(char *data, ffindex_entry_t* entry) { char *filedata = ffindex_get_data_by_offset(data, entry->offset); return fmemopen(filedata, entry->length, "r"); } FILE* ffindex_fopen_by_name(char *data, ffindex_index_t *index, char *filename) { ffindex_entry_t* entry = ffindex_bsearch_get_entry(index, filename); if(entry == NULL) return NULL; return ffindex_fopen_by_entry(data, entry); } void ffindex_sort_index_file(ffindex_index_t *index) { qsort(index->entries, index->n_entries, sizeof(ffindex_entry_t), ffindex_compare_entries_by_name); } int ffindex_write(ffindex_index_t* index, FILE* index_file) { /* Use tree if available */ if(index->type == TREE) return ffindex_tree_write(index, index_file); for(size_t i = 0; i < index->n_entries; i++) { ffindex_entry_t ffindex_entry = index->entries[i]; if(fprintf(index_file, "%s\t%zd\t%zd\n", ffindex_entry.name, ffindex_entry.offset, ffindex_entry.length) < 0) return EXIT_FAILURE; } return EXIT_SUCCESS; } ffindex_index_t* ffindex_unlink_entries(ffindex_index_t* index, char** sorted_names_to_unlink, int n_names) { int i = index->n_entries - 1; /* walk list of names to delete */ for(int n = n_names - 1; n >= 0; n--) { char* name_to_unlink = sorted_names_to_unlink[n]; /* walk index entries */ for(; i >= 0; i--) { int cmp = strncmp(name_to_unlink, index->entries[i].name, FFINDEX_MAX_ENTRY_NAME_LENTH); if(cmp == 0) /* found entry */ { /* Move entries after the unlinked ones to close the gap */ size_t n_entries_to_move = index->n_entries - i - 1; if(n_entries_to_move > 0) /* not last element of array */ memmove(index->entries + i, index->entries + i + 1, n_entries_to_move * sizeof(ffindex_entry_t)); index->n_entries--; break; } else if(cmp > 0) /* not found */ break; } } return index; } ffindex_index_t* ffindex_unlink(ffindex_index_t* index, char* name_to_unlink) { /* Use tree if available */ if(index->type == TREE) return ffindex_tree_unlink(index, name_to_unlink); ffindex_entry_t* entry = ffindex_bsearch_get_entry(index, name_to_unlink); if(entry == NULL) { fprintf(stderr, "Warning: could not find '%s'\n", name_to_unlink); return index; } /* Move entries after the unlinked one to close the gap */ size_t n_entries_to_move = index->entries + index->n_entries - entry - 1; if(n_entries_to_move > 0) /* not last element of array */ memmove(entry, entry + 1, n_entries_to_move * sizeof(ffindex_entry_t)); index->n_entries--; return index; } /* tree version */ ffindex_entry_t *ffindex_tree_get_entry(ffindex_index_t* index, char* name) { ffindex_entry_t search; strncpy(search.name, name, FFINDEX_MAX_ENTRY_NAME_LENTH); return (ffindex_entry_t *)tfind((const void *)&search, &index->tree_root, ffindex_compare_entries_by_name); } ffindex_index_t* ffindex_tree_unlink(ffindex_index_t* index, char* name_to_unlink) { if(index->tree_root == NULL) { fferror_print(__FILE__, __LINE__, __func__, "tree is NULL"); return NULL; } ffindex_entry_t search; strncpy(search.name, name_to_unlink, FFINDEX_MAX_ENTRY_NAME_LENTH); tdelete((const void *)&search, &index->tree_root, ffindex_compare_entries_by_name); return index; } ffindex_index_t* ffindex_index_as_tree(ffindex_index_t* index) { index->tree_root = NULL; for(size_t i = 0; i < index->n_entries; i++) { ffindex_entry_t *entry = &index->entries[i]; tsearch((const void *)entry, &index->tree_root, ffindex_compare_entries_by_name); //entry = *(ffindex_entry_t **)tsearch((const void *)entry, &index->tree_root, ffindex_compare_entries_by_name); //printf("entry find: %s\n", entry->name); } index->type = TREE; return index; } int ffindex_tree_write(ffindex_index_t* index, FILE* index_file) { int ret = EXIT_SUCCESS; void action(const void *node, const VISIT which, const int depth) { ffindex_entry_t *entry; switch (which) { case preorder: break; case endorder: break; case postorder: case leaf: entry = *(ffindex_entry_t **) node; if(fprintf(index_file, "%s\t%zd\t%zd\n", entry->name, entry->offset, entry->length) < 0) ret = EXIT_FAILURE; break; } } twalk(index->tree_root, action); return ret; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ext/0000775172256617226630000000000011670345140021350 5ustar hauserscientific_computinghhsuite-2.0.16/lib/ffindex/src/ext/fmemopen.c0000664172256617226630000000621311670345140023324 0ustar hauserscientific_computing/** * Copyright (c) 2009 Open Information Security Foundation * * \author Pablo Rincon Crespo * Based on FMem.c of Alexandre Flori (2008/10/17 AF) */ #define _GNU_SOURCE #include #include #include #include "fmemopen.h" #ifdef OS_DARWIN #define USE_FMEM_WRAPPER 1 #endif #ifdef OS_FREEBSD #define USE_FMEM_WRAPPER 1 #endif #ifdef USE_FMEM_WRAPPER /** * \brief Seek the mem file from offset and whence * \param handler pointer to the memfile * \param osffset number of bytes to move from whence * \param whence SEEK_SET, SEEK_CUR, SEEK_END * \retval pos the position by the last operation, -1 if sizes are out of bounds */ static fpos_t SeekFn(void *handler, fpos_t offset, int whence) { size_t pos = 0; fmem_t *mem = handler; switch (whence) { case SEEK_SET: if (offset > 0 && (size_t)offset <= mem->size) return mem->pos = offset; break; case SEEK_CUR: if (mem->pos + offset <= mem->size) return mem->pos = offset; break; case SEEK_END: /* must be negative */ if (mem->size + offset <= mem->size) return pos = mem->size + offset; break; } return -1; } /** * \brief Read from the buffer looking for the available memory limits * \param handler pointer to the memfile * \param buf buffer to read from the handler * \param number of bytes to read * \retval count , the number of bytes read */ static int ReadFn(void *handler, char *buf, int size) { size_t count = 0; fmem_t *mem = handler; size_t available = mem->size - mem->pos; if (size < 0) return - 1; if ((size_t)size > available) size = available; while (count < (size_t)size) buf[count++] = mem->buffer[mem->pos++]; return count; } /** * \brief Write into the buffer looking for the available memory limits * \param handler pointer to the memfile * \param buf buffer to write in the handler * \param number of bytes to write * \retval count , the number of bytes writen */ static int WriteFn(void *handler, const char *buf, int size) { size_t count = 0; fmem_t *mem = handler; size_t available = mem->size - mem->pos; if (size < 0) return - 1; if ((size_t)size > available) size = available; while (count < (size_t)size) mem->buffer[mem->pos++] = buf[count++]; return count; } /** * \brief close the mem file handler * \param handler pointer to the memfile * \retval 0 on succesful */ static int CloseFn(void *handler) { free (handler); return 0; } /** * \brief portable version of SCFmemopen for OS X / BSD built on top of funopen() * \param buffer that holds the file content * \param size of the file buffer * \param mode mode of the file to open * \retval pointer to the file; NULL if something is wrong */ FILE *fmemopen(void *buf, size_t size, const char *mode) { fmem_t *mem = (fmem_t *) malloc(sizeof(fmem_t)); memset(mem, 0, sizeof(fmem_t)); mem->size = size, mem->buffer = buf; return funopen(mem, ReadFn, WriteFn, SeekFn, CloseFn); } #endif hhsuite-2.0.16/lib/ffindex/src/ext/Makefile.osx0000664172256617226630000000023111670345140023614 0ustar hauserscientific_computingINSTALL_DIR=.. LANG=C CFLAGS+=-std=c99 -O3 -g -fPIC -Wall #LDFLAGS+=-Wl,-z,defs #-Wl,--version-script=libffindex.map fmemopen.o: fmemopen.c fmemopen.h hhsuite-2.0.16/lib/ffindex/src/ext/fmemopen.o0000664172256617226630000001452411670345140023344 0ustar hauserscientific_computing 808__text__TEXT0h__debug_frame__DWARF__debug_info__DWARF __debug_abbrev__DWARF' nW__debug_aranges__DWARF 0(__debug_macinfo__DWARF __debug_line__DWARF 0__debug_loc__DWARF `__debug_pubnames__DWARF+[__debug_pubtypes__DWARFJz__debug_inlined__DWARF __debug_str__DWARFM __debug_ranges__DWARF(X__eh_frame__TEXT(XH h P  UHtWt2tHHfH~H;wwH7fHDfDHGHH9rHHHH;GwH7UHLGHx=LH)LcL9r11E1u$HHGA0IHAHM9rDÉLcfDUHLGHx=LH)LcL9r11E1u$HHWA0 HAHIM9rDÉLcfDUHH]LeHIHHHHXL`LH HH5H$Ld$UH1x $q $Z $Z 4@]  $  GNU C 4.2.1 (Apple Inc. build 5664)fmemopen.c/Users/admin.hauser/ffindex/src/extsigned charunsigned charshort intshort unsigned intintunsigned int__int64_t.long long intlong long unsigned intlong intchar__darwin_size_tZ9long unsigned int__darwin_off_tnsize_tP"fpos_tWP__sbufb_basec#_sized#__sFILE_p#_r#_w# _flags#_file#_bf#_lbfsize#(_cookieN#0_close#8_read>#@_seek^#H_write#P_ub#X_extra#h_ur#p_ubuf#t_nbuf#w_lb#x_blksize#_offsett#  N 8 N 8  t^ N t D ~ N ~  d __sFILEX  FILEfmemposf#sizef#buffer8#fmem_tF tq NUoffset tLwhence Qpos!fmem">>NUbuf>8Tsize>Qcount?fmem@Af6U:({UNUbufU~TsizeUtcountVfmemWXf"ON__destNN__valN__lenNfv@bufvNbsizevfmodev~memw>jRjN= ]__CFConstantStringClassReferenceR%  $ > : ; I$ >   : ;  : ; I8  I ' I I &I < I!I/ .: ; ' I@ : ; I : ; I: ; I 4: ; I4: ; I4: ; I.: ; ' I  : ; I.? : ; ' I@ : ; I!4I? 4 < , /usr/include/i386/usr/include/sys/usr/include/usr/include/securefmemopen.c_types.h_types.hstdio.hfmemopen.h_string.h N yqt Xzu< #include #include /* Include this file only for OSX / BSD compilations */ #ifdef OS_DARWIN #define USE_FMEM_WRAPPER 1 #endif #ifdef OS_FREEBSD #define USE_FMEM_WRAPPER 1 #endif #define USE_FMEM_WRAPPER 1 #ifdef USE_FMEM_WRAPPER struct fmem { size_t pos; size_t size; char *buffer; }; typedef struct fmem fmem_t; FILE *fmemopen(void *, size_t, const char *); #endif #endif /* __FMEMOPEN_H__ */ hhsuite-2.0.16/lib/ffindex/src/ffutil.h0000664172256617226630000000147311740553454022226 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * Ffindex is a very simple database for small files. The files are stored * concatenated in one big data file, seperated by '\0'. A second file * contains a plain text index, giving name, offset and length of of the small * files. */ #include #include #include int fferror_print(char *sourcecode_filename, int line, const char *function_name, const char *message); char* ffnchomp(char *s, size_t len); /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/ffindex_apply.c0000664172256617226630000000674111766637446023577 0ustar hauserscientific_computing/* * FFindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * FFindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ * * ffindex_apply * apply a program to each FFindex entry */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" int main(int argn, char **argv) { if(argn < 4) { fprintf(stderr, "USAGE: %s DATA_FILENAME INDEX_FILENAME PROGRAM [PROGRAM_ARGS]*\n" "\nDesigned and implemented by Andy Hauser .\n", argv[0]); return -1; } char *data_filename = argv[1]; char *index_filename = argv[2]; char *program_name = argv[3]; char **program_argv = argv + 3; FILE *data_file = fopen(data_filename, "r"); FILE *index_file = fopen(index_filename, "r"); if( data_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], data_filename); exit(EXIT_FAILURE); } if(index_file == NULL) { fferror_print(__FILE__, __LINE__, argv[0], index_filename); exit(EXIT_FAILURE); } size_t data_size; char *data = ffindex_mmap_data(data_file, &data_size); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_index_parse", index_filename); exit(EXIT_FAILURE); } // Ignore SIGPIPE struct sigaction handler; handler.sa_handler = SIG_IGN; sigemptyset(&handler.sa_mask); handler.sa_flags = 0; sigaction(SIGPIPE, &handler, NULL); size_t range_start = 0; size_t range_end = index->n_entries; // Foreach entry //#pragma omp parallel for for(size_t entry_index = range_start; entry_index < range_end; entry_index++) { //fprintf(stderr, "index %ld\n", entry_index); int ret = 0; ffindex_entry_t* entry = ffindex_get_entry_by_index(index, entry_index); if(entry == NULL) { perror(entry->name); continue; } int pipefd[2]; ret = pipe(pipefd); if(ret != 0) { perror(entry->name); continue; } pid_t child_pid = fork(); if(child_pid == 0) { fclose(data_file); fclose(index_file); close(pipefd[1]); // Make pipe from parent our new stdin int newfd = dup2(pipefd[0], fileno(stdin)); if(newfd < 0) { fprintf(stdout, "%d %d\n", pipefd[0], newfd); perror(entry->name); } close(pipefd[0]); // exec program with the pipe as stdin execvp(program_name, program_argv); // never reached } else if(child_pid > 0) { // Read end is for child only close(pipefd[0]); // Write file data to child's stdin. char *filedata = ffindex_get_data_by_entry(data, entry); ssize_t written = 0; while(written < entry->length) { int w = write(pipefd[1], filedata + written, entry->length - written); if(w < 0 && errno != EPIPE) { perror(entry->name); break; } else if(w == 0 && errno != 0) { perror(entry->name); break; } else written += w; } close(pipefd[1]); // child gets EOF waitpid(child_pid, NULL, 0); } else { perror(entry->name); exit(errno); } } return 0; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/test-unlink.should0000664172256617226630000000001411670345140024240 0ustar hauserscientific_computinga fooo fooo hhsuite-2.0.16/lib/ffindex/src/ffindex_unpack.o0000664172256617226630000003052012075477016023724 0ustar hauserscientific_computingELF>@@AWAVAUATUSHH(GLnHFLvH5LHD$H5ILMHNHHt$L1HIHI@H|$Mu8M1afDL`H5H$LH$LHHH$HHHrHHtNHHI9v%HLHuHI9wf1H([]A\A]A^A_LH(1[]A\A]A^A_HHH5H81HL$HH==HH=L0H=HL9HH=L1% : ; I$ > $ >   I : ; : ;I8 : ;  : ;  : ; I8 I !I/  : ; ( !I.? : ; ' I@ : ; I4: ; I4: ; I  U4: ; I? < K 8intii1<b (08 "t$z&b*b,p0F1T26?{HIJKL-NbP  t t z bC  8<  8  8 0 -  - !" @$ % & ' ( )- *( +-0 ,-8 - 8.% b b )*+-.3-46?-@-D-HKNO-zzzzzz /usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/include/bits/usr/includeffindex_unpack.cstddef.htypes.hstdio.hlibio.hffindex.h  LIMZYs=:>gV>Y;=l#N5iq?Zr<JrX\OSzXzJ4N.s# w!USAGE: %s DATA_FILENAME INDEX_FILENAME OUT_DIR Designed and implemented by Andy Hauser . rffindex_unpack.cffindex_index_parsew0UauUTSa S9s9]] ]&9s9^ ^59s92Aa DKPK\ \RmPmV VvzPz2_A`___P2]A\]]P]20Aa0}82^A^^0 S).SP |p(PAZ|pP VAXVPPAOPOmainO-size_tp__off_t{__off64_tFILE<_IO_lock_tC_IO_marker_IO_FILEffindex_typeffindex_entryffindex_entry_t%ffindex_indexffindex_index_t, 2TVHPTVHP$)  index_filename_old_offset/data/hauserws2/home/andy/wrk/dev/compbio/hhsuite/lib/ffindex/srcentriesindex_data_IO_save_endshort intsize_tentry_index_offsetSORTED_ARRAYout_dirrange_startmainGNU C 4.4.6 20120305 (Red Hat 4.4.6-4)_IO_buf_basefile_markers_IO_read_endffindex_unpack.cindexfilenamedata_filenameffindex_index_tstderrlong long intlong long unsigned intstdin_locklong intoffset_cur_column_posnum_max_entriesdata_sizeargvname_sbufentry_IO_FILElengthunsigned charsigned charindex_filetypeargn_IO_marker_shortbufffindex_typelong unsigned intPLAIN_FILE_IO_write_base_unused2_IO_read_ptr__pad5_IO_buf_endrange_endcharTREEdata_fileffindex_entry_t_next__pad1__pad2__pad3__pad4filedataoutput_filedataSORTED_FILEshort unsigned inttree_rootn_entries_IO_write_ptr_IO_write_end__off64_t__off_t_chain_IO_backup_baseffindex_index_flags2_mode_IO_read_baseindex_data_size_vtable_offsetffindex_entry_IO_save_base_filenoFILEunsigned intwritten_flagsstdout_IO_lock_tGCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)zRx d BBB B(A0A8G`% 8A0A(B BBBH L 8C0A(B BBBA .symtab.strtab.shstrtab.rela.text.data.bss.debug_abbrev.rela.debug_info.rela.debug_line.rodata.str1.8.rodata.str1.1.debug_loc.rela.debug_pubnames.rela.debug_pubtypes.rela.debug_aranges.debug_ranges.debug_str.comment.note.GNU-stack.rela.eh_frame @ "&P,P1PDmO?h%X U P0a2 up2U )~ X0 s0;010k001-^`81  !      ' ! & + 0FN`tzffindex_unpack.c.LC1.LC4.LC0.LC2.LC3main_GLOBAL_OFFSET_TABLE_fopen64ffindex_mmap_dataffindex_index_parsechdirffindex_get_data_by_entryfwritefcloseffindex_get_entry_by_indexperrorstderrfprintffferror_printexit)6=Hjw !%"L"d #nx$%&%&%&% &    ! ) . ; ?B I  P W ^ }l q W| M     t    \ 1 ?   $ 2 f@ pN \ _j x     (         . k=  D P \ h  \ j 2 Q        & v2 > .J V eb n z  ' ] E      6 7     ) &. 8 = G L [ e j (t y    D    @    8       U( 5 B U    hhsuite-2.0.16/lib/ffindex/src/test.should0000664172256617226630000000001711670345140022745 0ustar hauserscientific_computinga bb fooo fooo hhsuite-2.0.16/lib/ffindex/src/ffindex_get.c0000664172256617226630000000731712075476615023222 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include "ffindex.h" #include "ffutil.h" void usage(char* program_name) { fprintf(stderr, "USAGE: %s data_filename index_filename entry name(s)\n" "-n\tuse index of entry instead of entry name\n" "\nDesigned and implemented by Andy Hauser .\n", program_name); } int main(int argn, char **argv) { int by_index = 0; int opt; while ((opt = getopt(argn, argv, "n")) != -1) { switch (opt) { case 'n': by_index = 1; break; default: usage(argv[0]); return EXIT_FAILURE; } } if(argn < 3) { usage(argv[0]); return EXIT_FAILURE; } char *data_filename = argv[optind++]; char *index_filename = argv[optind++]; FILE *data_file = fopen(data_filename, "r"); FILE *index_file = fopen(index_filename, "r"); if( data_file == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_get", data_filename); exit(EXIT_FAILURE); } if(index_file == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_get", index_filename); exit(EXIT_FAILURE); } size_t data_size; char *data = ffindex_mmap_data(data_file, &data_size); ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { fferror_print(__FILE__, __LINE__, "ffindex_index_parse", index_filename); exit(EXIT_FAILURE); } if(by_index) { for(int i = optind; i < argn; i++) { size_t index_n = atol(argv[i]) - 1; // offset from 0 but specify from 1 ffindex_entry_t* entry = ffindex_get_entry_by_index(index, index_n); if(entry == NULL) { errno = ENOENT; fferror_print(__FILE__, __LINE__, "ffindex_get entry index out of range", argv[i]); } else { char *filedata = ffindex_get_data_by_entry(data, entry); if(filedata == NULL) { errno = ENOENT; fferror_print(__FILE__, __LINE__, "ffindex_get entry index out of range", argv[i]); } else fwrite(filedata, entry->length - 1, 1, stdout); } } } else // by name { for(int i = optind; i < argn; i++) { char *filename = argv[i]; ffindex_entry_t* entry = ffindex_get_entry_by_name(index, filename); if(entry == NULL) { errno = ENOENT; fferror_print(__FILE__, __LINE__, "ffindex_get key not found in index", filename); } else { char *filedata = ffindex_get_data_by_entry(data, entry); if(filedata == NULL) { errno = ENOENT; fferror_print(__FILE__, __LINE__, "ffindex_get key not found in index", filename); } else fwrite(filedata, entry->length - 1, 1, stdout); } } /* Alternative code using (slower) ffindex_fopen */ /* FILE *file = ffindex_fopen(data, index, filename); if(file == NULL) { errno = ENOENT; fferror_print(__FILE__, __LINE__, "ffindex_fopen file not found in index", filename); } else { char line[LINE_MAX]; while(fgets(line, LINE_MAX, file) != NULL) printf("%s", line); } */ } return 0; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/lib/ffindex/src/Makefile0000664172256617226630000001104312075476615022223 0ustar hauserscientific_computingINSTALL_DIR?=.. libdir=`([ -d /usr/lib64 ] && echo lib64) || echo lib` LANG=C CC=gcc -fopenmp #CC=icc -openmp CFLAGS+=-std=c99 -O2 -g -fPIC -Wall -pedantic LDFLAGS=-lffindex -L. ifdef FFINDEX_STATIC LDFLAGS+=-static FFINDEX_OBJECTS=libffindex.a else FFINDEX_OBJECTS=libffindex.so libffindex.so.0.1 endif #-Wl,--version-script=libffindex.map OBJECTS=ffindex_apply ffindex_from_fasta ffindex_get ffindex_build ffindex_modify libffindex.a libffindex.so ffindex_unpack ifdef HAVE_MPI OBJECTS+=ffindex_apply_mpi endif all: $(OBJECTS) ffindex.o: ffindex.c ffindex.h ffutil.h ffindex_apply: $(FFINDEX_OBJECTS) ffindex_apply.o ffindex.h ffindex_apply_mpi: $(FFINDEX_OBJECTS) ffindex_apply_mpi.o ffindex.h mpicc $(CFLAGS) -o $@ ffindex_apply_mpi.o $(LDFLAGS) ffindex_apply_mpi.o: ffindex_apply_mpi.c ffindex.h mpicc $(CFLAGS) -c ffindex_apply_mpi.c -o $@ ffindex_from_fasta: $(FFINDEX_OBJECTS) ffindex_from_fasta.o ffindex.h $(CC) -o $@ ffindex_from_fasta.o $(LDFLAGS) -L. -lffindex ffindex_get: $(FFINDEX_OBJECTS) ffindex_get.o ffindex.h $(CC) -o $@ ffindex_get.o $(LDFLAGS) -L. -lffindex ffindex_build: $(FFINDEX_OBJECTS) ffindex_build.o ffindex.h $(CC) -o $@ ffindex_build.o $(LDFLAGS) -L. -lffindex ffindex_modify: $(FFINDEX_OBJECTS) ffindex_modify.o ffindex.h $(CC) -o $@ ffindex_modify.o $(LDFLAGS) -L. -lffindex ffindex_unpack: $(FFINDEX_OBJECTS) ffindex_unpack.o ffindex.h $(CC) -o $@ ffindex_unpack.o $(LDFLAGS) -L. -lffindex libffindex.so.0.1: ffindex.o ffutil.o $(CC) -Wl,-z,defs -shared -Wl,-soname,libffindex.so.0.1 -o libffindex.so.0.1 ffindex.o ffutil.o -lc libffindex.so: libffindex.so.0.1 ln -sf libffindex.so.0.1 libffindex.so libffindex.a: ffindex.o ffutil.o ar rcs libffindex.a ffutil.o ffindex.o test: rm -f /tmp/test.data /tmp/test.ffindex LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_build -s /tmp/test.data /tmp/test.ffindex ../test/data ../test/data2 LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get /tmp/test.data /tmp/test.ffindex a b foo | tee /tmp/test.out LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_modify -u /tmp/test.ffindex b LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get /tmp/test.data /tmp/test.ffindex a b foo | tee /tmp/test-unlink.out LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_build -a -s /tmp/test.data /tmp/test.ffindex ../test/testfile @echo ======== compare results ========= diff /tmp/test.out test.should diff /tmp/test-unlink.out test-unlink.should @echo ======== error handling ========== @echo LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get /tmp/test.data /tmp/test.ffindex nonexistquery b foo || echo LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get /nonexist/data /tmp/test.ffindex a foo || echo LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get /tmp/test.data /nonexist/index a foo || echo time: LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" zsh -c "time ./ffindex_get ../test_big/nr20_11Jan10_a3m_db ../test_big/nr20_11Jan10_a3m_db.ffindex BABBAMIBA.a3m KARDUZEBA.a3m HARPAQIBA.a3m WOQQATEBA.a3m BEBRAQIBA.a3m GIRSAKEBA.a3m NAQTIFIBA.a3m BIWCIQABA.a3m > /dev/null" clean: rm -f ffindex.o ffutil.o ffindex_build ffindex_build.o ffindex_get ffindex_get.o libffindex.so libffindex.so.0.1 ffindex_modify ffindex_modify.o \ libffindex.a ffindex_from_fasta.o ffindex_from_fasta ffindex_apply_mpi.o ffindex_apply.o install: mkdir -p $(INSTALL_DIR)/bin mkdir -p $(INSTALL_DIR)/$(libdir) mkdir -p $(INSTALL_DIR)/include install ffindex_get $(INSTALL_DIR)/bin/ffindex_get install ffindex_build $(INSTALL_DIR)/bin/ffindex_build install ffindex_modify $(INSTALL_DIR)/bin/ffindex_modify install ffindex_from_fasta $(INSTALL_DIR)/bin/ffindex_from_fasta install ffindex_apply $(INSTALL_DIR)/bin/ffindex_apply install ffindex_unpack $(INSTALL_DIR)/bin/ffindex_unpack install libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.so.0.1 install libffindex.a $(INSTALL_DIR)/$(libdir)/libffindex.a ln -sf libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.so install ffindex.h $(INSTALL_DIR)/include/ffindex.h install ffutil.h $(INSTALL_DIR)/include/ffutil.h ifdef HAVE_MPI install ffindex_apply_mpi $(INSTALL_DIR)/bin/ffindex_apply_mpi endif deinstall: rm -f $(INSTALL_DIR)/bin/ffindex_get $(INSTALL_DIR)/bin/ffindex_build $(INSTALL_DIR)/bin/ffindex_modify \ $(INSTALL_DIR)/$(libdir)/libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.a \ $(INSTALL_DIR)/$(libdir)/libffindex.so $(INSTALL_DIR)/include/ffindex.h $(INSTALL_DIR)/include/ffutil.h\ $(INSTALL_DIR)/bin/ffindex_from_fasta rmdir $(INSTALL_DIR)/bin || true rmdir $(INSTALL_DIR)/$(libdir) || true rmdir $(INSTALL_DIR)/include || true hhsuite-2.0.16/lib/ffindex/src/Makefile.osx0000664172256617226630000000366012075476615023041 0ustar hauserscientific_computingINSTALL_DIR=.. LANG=C CFLAGS+=-std=c99 -O3 -g -fPIC -Wall -fnested-functions LDFLAGS= -L. -lffindex #LDFLAGS+=-Wl,-z,defs #-Wl,--version-script=libffindex.map all: ext/fmemopen.o libffindex.a ffindex_get ffindex_build ffindex_modify ffindex_from_fasta ext/fmemopen.o: ext/fmemopen.c cd ext && make ffindex.o: ffindex.c ffindex.h ffutil.h ffindex_get: libffindex.so libffindex.so.0.1 ffindex_get.o $(CC) $(CFLAGS) -L. -lffindex ffindex_get.o -o $@ ffindex_build: libffindex.so libffindex.so.0.1 ffindex_build.o $(CC) $(CFLAGS) -L. -lffindex ffindex_build.o -o $@ ffindex_modify: libffindex.so libffindex.so.0.1 ffindex_modify.o $(CC) $(CFLAGS) -L. -lffindex ffindex_modify.o -o $@ libffindex.so.0.1: ffindex.o ext/fmemopen.o ffutil.o $(CC) $(LDFLAGS) -shared -o libffindex.so.0.1 ext/fmemopen.o ffindex.o ffutil.o -lc libffindex.so: libffindex.so.0.1 ln -sf libffindex.so.0.1 libffindex.so libffindex.a: ffindex.o ffutil.o ar rcs libffindex.a ffutil.o ffindex.o ext/fmemopen.o test: LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_build -s test.data test.ffindex ../test/data ../test/data2 LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get test.data test.ffindex a b foo time: LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" zsh -c "time ./ffindex_get ../test_big/nr20_11Jan10_a3m_db ../test_big/nr20_11Jan10_a3m_db.ffindex BABBAMIBA.a3m KARDUZEBA.a3m HARPAQIBA.a3m WOQQATEBA.a3m BEBRAQIBA.a3m GIRSAKEBA.a3m NAQTIFIBA.a3m BIWCIQABA.a3m > /dev/null" clean: rm -f ffindex.o ffindex_build ffindex_build.o ffindex_get ffindex_get.o libffindex.so libffindex.so.0.1 install: mkdir -p $(INSTALL_DIR)/bin mkdir -p $(INSTALL_DIR)/lib mkdir -p $(INSTALL_DIR)/include install ffindex_get $(INSTALL_DIR)/bin/ffindex_get install ffindex_build $(INSTALL_DIR)/bin/ffindex_build install libffindex.so.0.1 $(INSTALL_DIR)/lib/libffindex.so.0.1 ln -sf libffindex.so.0.1 $(INSTALL_DIR)/lib/libffindex.so install ffindex.h $(INSTALL_DIR)/include/ffindex.h hhsuite-2.0.16/lib/ffindex/src/ffindex_unpack0000775172256617226630000347517112110430237023474 0ustar hauserscientific_computingELF>@@ @8@*'@@i i i ililp@ XX@X@DDi ilil(`QtdGNUGNUk5IzV?sWjl%Ejl%PEkl%PgBkl%ЗBkl%7Bkl%pHB kl%E(kl%@NB0kl%A8kl%)H@kl%EHkl%EH-| H%h,h% h,h%h,h%g,h%g,h%g,h%g,h%g,h%g,h%g,h%g,h%g,h1I^HHPTI@HP@H@'HHf,HtHÐUHSH=`t,u_0jlHZt,H jlHHH9s$fDHH5t, jlH't,H9r⸠sIHt ;KFo s,H[UYIHHtxl;KT H=e,tHt8jlÐAWAVAUATUSHH(GLnHFLvH5 LHD$H5 ILMHNHHt$L21HIHI@H|$Mu8M1afDL`H5 H$L)H$LHH'H$HHHrHHtNHH:I9v%HLHuH'I9wf1H([]A\A]A^A_LH(1[]A\A]A^A_Hd,HH5^ H81HL$HH= =HH= L0sH=w H L9NtHH=O L1-SHT7H: tÐfff.H\$Hl$HLd$Ll$ALt$H8II貽yH$Hc,H5 MMDHH81Hl$H\$Ld$ Ll$(Lt$0H8ÐH9c,HDf.1H9w8v HvHHD@fH7ff.H6SHHHHt HH[[fffff.H8HEH4$Ht$ fD$ IHf HVfF IfFIFD$H(D$H8Htt HDHI:H5ɓ LT$L@HHP1DLT$yABHfffff.AVAUIATIUSH0?H8H1Lt$fDHH0I9l$8viHK@H5< LLH $LCHLD$HCPHD$HCXHD$HC`HD$ HChHD$(1yH0[]A\A]A^f.H01[]A\A]A^f.ATUHSH8HG(t0Lg(1@H[H5LHHH|@H9]8wEH[]A\ff.HH nfffff.H\$Hl$HHH(Ht8H|$ Hs(HHFHHl$@H\$8HH@H HB H= 1ffff.H\$Hl$HHHH|$ xHu(H5HH\$8Hl$@HHfffff.AWAAVAUIATUSHAHo8xuHG@HD$IcHH$H$L0yC>x6Lc LKdHItP!uIE8HHL)u!IE8H,$AyHL[]A\A]A^A_KtdH|$HRHHt$HHAIE8Hfffff.Hw8H %H@0SHH6HsH H[H\$Hl$HHHH|$ HU8Hu@LH0H\$8Hl$@HHDUHSHH?toHtuHK8HHIHHT@H)HHHuHHK8HH[]HRHp0HH?HK8fDH[]5DH],H5 HH81SHHHHt HH[[fffff.SHHHHt HH[[fffff.ff.UHSHHHƿ]HD$0HHAx&H3E1ɹ1/HĘ[]DH H H= HĘH[]AVAUIATIUSHH+A@prAZbLHHH_Hp Lh0L`LH{ HCH.H}EHHE H9Lt$IE11Ic< t(HvHHTPHH< uHvHcɺ LAHHDDP~H|$IE@ LhH|$IEHI0HEHE HH9nMcMLe8t)HH[]A\A]A^L4vII@HE8H=a 1HH[]A\A]A^H= 1HCH1H4[,H5 LH81(H H H= )Z@AWMAVAUATIUHSHHHLt$Ht$H$fHLHIt;LLLHI9tH H= LH0LLD$Ht H=C |HLu+LL+$H5 H $H|$L HtH Q H# H=s H1[]A\A]A^A_fDH= 1*MDHl$HH\$Ld$Ll$HL|$Lt$HHHML2IHL¾MHI9tHʌ H=ڊ L5fH|$HD$Ht H=9 XHHtHH X Hj H=z F 1H\$Hl$ Ld$(Ll$0Lt$8L|$@HH@LH5$ LLLM)Ld$IH5P H\$Hl$HLl$Lt$HH(IMHHHt@HMHLLLH߉rH$Hl$Ld$Ll$Lt$ H((AWIAVAUATIUSHH|$HHt$臜HH+Hl$ L~ ILHC|,/t BD, /IINl-L$ H$H$HD$@HHHtsx.tLpLLLH tt$8%=uHT$Ht$MH|$HwHߜHuf.H蘜H$I1H[]A\A]A^A_fH H=I HvlH H=) L`AWIAVAUIATIUHSH(HH\$L$H$HHHtkHkHIH!%tHLD$DHVHDHH)LD$HLLL=H$IH(1[]A\A]A^A_ÐHfff.U SHdL %IAAIdH%d%H,dH% IIǁIIDŽ$@H$=$w d%Hd%Ht@DŽ$E1E1ҺH$ډ$t  ,HS,Ht,ldH%IIǁlIǁlHO,H@,b,d%H\$11HH$0@HDŽ$H }1H!H$`@DŽ$[HAH D$1H޿H$(lH$HHAwHDŽ$H,H,1H$HDHHH,6u*H$HtH=?w HDŽ$@fDHDŽ$ 蒞HC,H$0@`lHF[,p @H ,@HH9HFHTHH!H$H:S,1,H,H[]d%!tÐ1)9Fu~uH,HpHxHPdH<%@d%щЃd %9uLJHd4%HADHH,H _H=+,H d4%HDfDHd% tHf.1)9Fu~ud%f‰у 9tud %9udH%0td %dH<%f|fffff.Ð15,HQ,H=klu8HH=klt%H@9u ,pHDH,H=lu1@HH=ltH@9ufff.H15^,.HP,H=klu7HH=klt%H@H9uHtH , HH,H=lt8H@HH9tHH=ltH@H9tHH=lu1DHٝ,dL%HtIHHt,L9P,IzklLHBklIHP,HHJHHHRHLO,klI91A@MIklM@M9tAAǀAIH,AtIRPLAƀH׺HfIHtHLHAƀHH uMIklhI2H >O,HklHtfAPHH=kluHklt+HFklHN,HHN,HBHN,HN,IHI,IIHJIH1H ,HN,kld%HN,klH͛,lH,luwIǃklIǃklHSN,HDN,*N,H,,H-N,HxklHHBklH N,LM,IǃlIǃlH,,H,ff.AW1AVAUATUSHd%E1E1d%E1fDdN$MtZL1H HxlHHHt/I|HtHEI9IDuHEHtDII uDd%t+AA_dH%H@1HHdH<Ht荸dHHH ud%H[]A\A]A^A_fffff.AU1ATUS5˙,L^L,dH%IklxAADMIkltTM@L9tA\tIyDD/uE1Һd4%HAytMIkluL,Il|AAfMIltTM@L9tA\tIyDD/uE1Һd4%HAytMIlu ,[]A\A]fff.AT1USH5j,H-J,Hkltr@HH+@HHH@HHHH<HHHDH L(HI)81LHGHmHkluH-˗,HltpfHH+@HHH@HHHH<HHHDH L(HI)71LHHmHlu [,[]A\SZ|53,HI,Hklu[HHkltLH@HHH)HtHdt ʖ,s[HiI,HkluYfDHHkltGH@HHH)H裶tHduHHklu1뀐ATHH,UHH=klSHXuHklHSH|HL@A$H,HHHHJH@H1LI$H,H), I$I$ĵuH9-,s[]A\fDHH15z,BHH,HHHqHHHX,ulHHH H,H G,HǂklHHAHG,H,HH ,H=H,w Ք,H1HdfH\$Hl$HLd$H(II҉u[G,L1IHٺ=Lֿ4@L$u9d%1H\$Hl$Ld$ H(þ1*IT$(HtIt$0Hc=w1AD$tHc<HcH8=pHcd<% HcWfD !F,1t"HH d Dd4%HHfAWAVAUATUISHHHHEHt$HL$0H|$ HT$(譗HM H5E,HHEE SM,PH,L% ,Hc҃IHAIAAHELUHAI!AI!LH!I9}15,H#E,H=kl[1HHH=kltBHH@HI9wt HtH;sHH=kluHJH9LǃL-,HHHPHHLHHБ,HID,HǃklHLhL-,D,H,HH), l,H{H1HǃHD$HǃHT$8HǃhHWLT$HHjHLT$HI9NHD$L)L)H9LHǃHǃHǃHHHH+,H H[HHL$(udH%H|$0H@ HH` 1 EHEH(HPHPHXHXH`H`<8<8dH%(HC(dH%0HC0H|$t EHD$ H1d%H}(tVADd%HHAuEt HHD[]A\A]A^A_1E1EtHtH},HH9$HE H- HH#M,H)H1HHHHƃHHHHECHH,,d%HCHd%ǃHHA 15{,H^,HHǃlHHBH:, C,^ 5,PhƃHH\AǃXH`H,HhH,uP`@fDE<E  uH81  Hc}HHc}89}>1ud4%HHHA9D6E8@Y1 <@ E3H|$8DLLT$LT$uL1LH|$8HdD015,`L-,HHHPHHHm, F,D1HvHt$H|$87EA DD ,"fELd$u ITHT$Ht$E11A"DLT$踫HHD$8LT$~HL$HHHCHHHż,,d%HCHǃd%HLT$HLT$15 ,\ LLHH%,H=,HǃklHLhL-=,H, ϊ,* *E,EHHLT$H)H輪LT$zHdD0EfHt$H|$8l9Ht$H|$8A KHdD0A d A A11jfffff.AVI1AUATUS5։,P H-i<,L ,dH%AA HkltoAAAfDL@L9t>AIAǀ@A@ uHmHkluH-",HltpAAAL@L9t>AFIAǀ@A@ uHmHluIi AAfL9;,E1IkluA[Hcd<%!HcD=w.AA AMIkltI@H9t@u1L,IluDqfDHcd<%!HcD=w.AA AMIlt/I@H9t@u1E1d4%HDHAQ uEH-5:,HkltdAfH@H9t?HUH@t1 uLJd4%HHDHmHkluH-,Hlt`AfH@H9t?HUH@t1 uLJd4%HHDHmHluIqIyIQA=% ,, []A\A]A^f@2Aǀd4%HIDHmHkl@jAǀd4%HIDHmHl:H\DD7eE1Һd4%HDA9t?DH\DD7E1Һd4%HDA9tHdSHHH15),HH5,HHHJHHH,HHH,H|7,HǃklHHBH_7,H,HH,H=H,w$ ,W[Hǃآ+ 1Hff.AWAVAUATUSHH|$1H H dH% HHH¸dH1RHHD$UH$HDŽ$HDŽ$&u=H$dH%HD$dH<%Hd%@dH%01d%E1E1d%E1dN$MtZLLH HxlHHHt/I|HtHEI9IDuHEHtDII u1d%t+AA_dH%H@1HHdH<HtݠdHHH ud%Xc 4,HD$H\$貆HpHHcH)HH!H@w8H|$H9(t=@1<H0[]A\A]A^A_H@@ɺd4%HHH|$Ht$1 A1HH D$wHAE11d4%HDHT$@uǂ1H‹P ,Hht ǂX H`HҀ,HL$HhH,u`‰H\$`1蘣H=a,H%aHĀPH=B,HbHĀqH=#,H`HĀH=,HXbHĀH=,H`HĀH=,HbHĀH=,Hk`HĀ+H=,HaHĀH=i,H-`HĀ$H=J,HaHĀnH=+,H_HĀH= ,H`aHĀ%HH_HĀH=~,H_HĀ@HUYAƋuMDY1H{UMt H0I$H1H\$ Hl$(Ld$0Ll$8Lt$@HHI}ɚ;v6DAY1HUHǃ(DfD#렐HL[DAFY1HTEuWfe[dH%Ð1H9Ð[z,Ðx=u,0ÐH\$Hl$HLd$Ll$H(HIԅ1 E1 t?@tcE|ADH\$Hl$Ld$Ll$ H(H8ytR A@uD=y<t @Eu<E8A$rfD E1 BAWHHWHĀ HHTYHĀH\$Hl$HLd$H(AHՅ~k1u{HHuaHꋻD,xt?D<E1҃ `8uVH\$Hl$Ld$ H(úHd΋;~$HHHVHĀfHH\XHĀ뎐USHH~W4$1uaHHuJH wt+,$  1҉8uCH[]úHdۋ9}$HH#VHĀHHWHĀ롐1SHHyHHC1[ÐHH(c1HÐG1Ðt ug1ÃO1øÐHGH1ÐHw1Ð1ÐH\$Hl$HLd$HIv{Uvtt A$9|9~H$Hl$Ld$HK 1ܐG1Ðw O@w0ÐG1Ðv@u g1DO0ÐG1Ðu g1D_DÐHGH1ÐHwO1ÐHG HHD%,H1ÐH?vHw 0ÐHO HH HHGH1ÐH?vOHHW Hw0ÐH\$Hl$HLd$Ll$HLt$L|$Hh1:8E<H9(E EHHHEHMHE HHEE1AMLLQHIHLHIiAu,IvL;A&u!HE(HE0E0 uLu(Le0}DH\$8Hl$@Ld$HLl$PLt$XL|$`HhÐLA ҏ뼃E IIHIt6Hut2HdD8L*MEiHdD8A$HD$(E1HD$ Lt$ L|$(̀A$A$u\L LLH~DH|$(HL$HT$1I蔫uH!,H;T$rHD$H9r!IHD$AH|$(ˎ4H$HEL)E1H9HU vHE HHPHĀHHgRHĀdSIHHHDH%0tH=t @_ujHGHHGHGHG %@GtGс0t% t%1tOH[fD GۉӃ@G u!,t묐Ht$H<$l!,H<$Ht$ѐGu W u G1ÐAVAUATUSHd,%G3v[]A\A]A^HHHAA?9i1+tWEu s@E1Һd#4%HH߃=v(C@@E{CdH%HS HHPdH%HC HdH%HHCdH%dH%OHHLO dL %E1@uA?9cD;{@Q@tΉȁ 39ȉ;oAAAA~iA9DDj EAEDAD#D9tQEADD ‰A9uLD9t!sE1DDHցd#4%HDD D9uCkC 1[]A\A]A^D9EGى¸#dG.C1BNZIZHW HdH%XCdH%HLHdH%HC dH%HHCdL %dH%6CCdH%HLHdH%HC dH%HHCdL %dH%nA_DhOdH%C #CCdH%HS HHPdH%HC HdH%HHCdH%dH%CE11ҾH߸dH%wdH%#cC tdH%7CtfDwI|u1dD %u,1A8"A@ EH1Lu9E;HtA8 A@AP tÃ0APÃuL=K,tAtAHdL dO0@09P~!A0t0E;H#6Ap1A8AH)ʉA@H;HKHĀQH;HKHĀqI8HXIHĀI8H=IHĀI8H"IHĀ\AUATUSHHd,%WHЃHCvH[]A\A]$If;o7AAALdA9DDheuDΉȃ39ȉ%E9uD.ed@1%oG 0?;o_1oG0҃G H dH<%1@uA?9+t@t{U@@tщЁ  9Љ뙐AAtHG HdH%%?9(1+t=@dH%+H[]A\A]fDEt\{dH%HS HHPdH%HC HdH%HHCdH%dH%kC 1Cf.dH%HHxdH%HC dH%HHCdH<%dH%1҉kC C4@к#?G0҉CC dH%fDC1҉CCCdH%HHxdH%HC dH%HHCdH<%dH%XEu s@E11d#4%HH߃=vMuHdH%ADakC CC@#CCdH%HS HHPdH%HC dH%HHCdH%dH%_9Cu dH%/trdH%C CE11ҾH߸dH%dH%#dH%#H;HEHĀ@AWAVAUATUSHHXHt$dD,%wHHCv"DHX[]A\A]A^A_$8IfD;of1; ŅuDkC 1D;oL|$0AL$U^9D$?t$Do_]l$AAD39AADHsLT$ DHցd#4%HD#9DD#‰99tHT$Hzɚ;1LHT$UHL$8HT$HiHH+D$0HJHD$ HHL$(SHʚ;HHL$(HD$ 9D;o1;=DCDk1C "f.LO dL %1Af@uU?A9DD;z{QnH@M@tщЁD  9Љ@AAtHG HdH%%?A9Z1D+'E9@LT$d#4%HH߃=tYrHt$ 1HT$HHRH+T$(H+D$ HHD$@HT$HpHxH\$@HHzLun=ڏ,1KdL dO01 D9D@u1SA)A@EAIЉCjDE{$CdH%HS HHPdH%HC HdH%HHCdH%dH%,C1Crf.afCdH%HLJdH%HS dH%HHSdL %dH%Of.sC@#CCdH%HS HHPdH%HC HdH%HHCdH%dH%rf.#^fD9Dd$fDDd$D1Z$nCb$dH%Cm CCdH%HLHdH%HC dH%HHCdL %dH%qs1; Hʚ;HHT$HHD$@vA C dH%t@CE11ҾH߸dH%dH%#H;HT$H;HĀH;HT$H;HĀH;HT$H>HĀfH;HT$Hy;HĀH;H<HĀWIЃ3v $XId%9Gfd%?9utށ$1I@ dH%IP IxHHHxI@I@HHI@ AHtAh A dH%1@d%%?9Gd%96A@A@R|fDd %ǁ?9t;AxEqfd%9GGG1d %%?9Gd%9~AP1APIP HdH%IH IxHHHzIPI@HH I@ A@tAh Axd%1At/A@LljD@d#4%HdH%1fDd%9GGGt 1AA@tAh  f.AAщAEuv&ApLցd#4%HDϾTfuDG=dGGuBnf.G=tGGu DOHȃ|u?u#Btj ΁ 1Ãu(d%9Gt 1ztÃtd%9GuӃ?uDfffff.wH@|u!u'Bj  1þu%d%9GtËO1ɉOttd%9Guփ?uI8H7HĀH:H7HĀH:H7HĀ\1Ð1Ð1Ðtu1fD'1øÐ%1Ðw % 1ÐHIHD1HH1>B0N1td%HB1Ð1ÐM1Ҿ17u\Gu_t?0t9GtsWuuwd34%HHH17uXO1Gt.uHËw4d;%u#܋w!6O O 뾋w6끋wHe4뚐ATAUAVHII17AD$A|$A|$0I}ʚ;AD$Et$A $<%dlI}A3t$MADI|$H¾1A4$AL$HRn 1AD$tFA $u0HHA^A]A\Ëwd3 d;%7#At$L4AL$ AL$ At$L4 At$L3_H’@hH1H`HD$HIMI}H+ $H)y Hʚ;HHxH $H|$At$d34%HIDM1Ҿ17u\Gu_t9GtoW uqwd34%HH H 17uTO1d%GuHËw 2d;%u#܋w3O ȋwm3녋w1뢐ATAUAVHII17AD$A|$I}ʚ;AD$Et$ A $<%dlI}A3t$MADI|$ H¾1A4$AL$H^n1d%AD$A $u0HHA^A]A\Ëw0&d;%1#At$LC2AL$ At$L(2&At$L0eH’FtH1H`HD$HIMI}H+ $H)y Hʚ;HHxH $H|$At$d34%HIDHw1:uJru&JtB0uJABtE1 fDAr u'DÉJA H:H/HĀH:H 1HĀHw1:u5JuBtAr u1DDd%E1BH:H/HĀH:H0HĀ뷐17ukuOuXGLW ut<LWAuG wd34%HL1fffff.u 1Ëwp.닋w/w/믐G11ÐG1Ðtuw1øÐ1Ðt tu71øÐHGt>HGHGHGG(G,H?H?HG 1@1G(HGHG HG1HGG,ÐH\$Hl$ILd$Ll$Lt$H 11A0CA1I@I9@v%EA9EH(I@AIx HGHw"wցd#4%HEIX(5AE1AfDAE1DDHDDDA8EH(Aw1H\$Hl$Ld$Ll$Lt$f.ADtTA1AfDAE1DDH߉DA0EH(AwqAE1fAoE1Dd4%HHDDA0dEH(Aw1AAfASE1Dd4%HDHDA8FEH(AwD1A86E1佀I8H*HĀI8H ,HĀI8H,HĀI8Ht*HĀ(I8H+HĀII8H+HĀ\I8H)HĀaI8Hh+HĀvI8H)HĀI8Hb+HĀI8H)HĀI8H)HĀHd$H H|$Ht$tHw 17JH|$1H|$HGGG(H|$LOW,LL$T$W!+($M1H Ht7LGA@0 uAH=rd 4%HE1<$,(H|$17W,HGLO;T$uL;L$^I9UHGo(Hu4G(u,H(Hd4%HDH(urH|$Eu jQHd$(L1H E(H Ex)H E'!H E@)rIH|$tH E)LUffffff.HD$H|$17tH EB'W,;T$uHGH;GvHGGHGo(1Hu9G(u1H H(d4%HDH(tH ER(u(HHd4%HDH|$OH|$ATAUAVAWH8Hzʚ;H H|$Ht$ItHw <%dlm17H|$1H|$HGGG(H|$LOW,LL$T$I}IƒDg$$M H tMLG A@0 u81G(D LHAH=r3HE11G(AD LHIƋ<$$H|$17W,HGLO;T$u%L;L$vI9wIHGGAnM1M1HGo(Hu4G(u,H(Hd4%HDH(H|$EuMHIDH8A_A^A]A\aHLH EU$&H E%bH E$H E%cH|$H$uH Eg%H$KE117H|$1>uH|$HGGG(H|$LOW,LL$T$H|$(Ht$ IMIUH+L$ H+T$(y Hʚ;HHH|$IƒxdHL$ HT$(Dg3"$LT$ H Ld4%HDHIƋ<$]"H|$17ulW,HGLO;T$L;L$v I9I'H E"H E$GH EX"xHD$H|$17tH E""W,;T$uHGH;GvHGGHGo(M1Hu:G(u2H H(d4%HDH(AtH E0#Mu(HHd4%HDH|$JH|$L|$8Lt$@Ll$HLd$PI17HIHI;HvI@Ix tIH DYA0A t!d 4%HAAH=s1þIM1DLGH=rd#4%HAu1H E NLH E!Ő17HLOL;O LO LOMDG(LGOIA@A@0 t,d4%HAH=1þAH=rrffff.Ou1H Ep,HH E HIE HId4%HDB1Ð1Ð1Ðtu1 Љ1øÐ1Ðt u  17Ð1Ðu 1?1DÐ1Ðt]HIHEƋt*uF1GWGW 1f.GWW d%HG1øÐwH1@zuB;B u1Ër@JuHzHZHĀHzHHĀȐ1wuyOt?OwM1Ҹ9tG W9>u O1 wG W9>uOuËwHHlwH ͋wHHNwHg1Ð1Ð1Ðtu71øÐ1@HHt;HHHxluL@L9sL@LxluHxl1D Ðw(HxlШtHxlu1DÐw?HdH%HHBHtHHxlH9 uHB1Áv1ÉdHHtHHH뫐H\$Ld$Hl$Ll$H(dH%Iw\HHxl@t@HHt d%L`H(1H\$Hl$Ld$Ll$ H(fDځwHxl@tAAdJHtH؃HH1Ht EH¸ HtdJ뾐HHtHHu&HcA‰1فGHH|$ HHt$H!L$븐~5Vv&d<%HcHcHc‰1فGøÐHl$Ll$H\$Ld$HIՅUv^1HH4$D$d%D$ 4Ll$D$d<%)IHcHcHc‰1فGH$H$L$L$HĨøѐ~kHƒ 9tփ滃 tu1fDƃ1u͋d<% HcHc=vøÐHd%ใtHdH%0d %dH<%Hv HDd%D$ T$ tKHщЃ9ʉt$d %D$ D$ 9ể t?1HHt{щЃ9ʉt݉d %D$ D$ 9td %dH<%у9td %D$ D$ 9uу9ed %D$ D$ 9AӉ Hv HDd%D$ T$ tKHщ9ʉt$d %D$ D$ 9ể tC1HDHщ9ʉtىd %D$ D$ 9tdH%0d %dH<%@у9td %D$ D$ 9gу9Wd %D$ D$ 93Ӊt1VM1ҋ©uZ ]e,ut1Щud4%HWWT$_Hd 4%HH1DH<$Id 4%HLIHt H  kH~ 1øÐUSHH1HՉH H Ņt:d%9t.@HtTHt$ғHHt$t@H+ H@dH% H)H1HHHiʚ;1HHC1H[]Hd䐐SHt5d%9t)@Ht,JHt"H 1[f.dH% 1[Hd[Ðx21tGHG1fDd%HGHG1HdÐ1ÐUHH]؉H@LeLmILuL}IH޿Ic4t?M1҄tIt L HH]LeLmLuL}D5S1,IE LLH8IE>HH)L|$II oH@@HlLIHHIG8QHt3HHP@MI9! 0,A1H8@HItcMtkH@I AGMgLLIHHIGIt @HlLU1HLwLNM1bE1Aع 1OIqUHAWAVAUATSHlHL@HUHMH=a,u{DHIAVAUATUSHL$LJ/uH$DK I6HHAHl$L$A8IAHLH6HII@LLHt/: uP: uP: u@: uIxLL$.L$uH$wIx辐HeHxHD$W;HHm\,HT$L$t5IpHx/t/Hsem.@HH+4\,H5\,He5H[]A\A]A^A_H\,GIH\, ӾK-II5HHH=*,H8 HĀ?H=*,H HĀHH^*,H9PtfDHQ*,SH15-*,H=H[,@H *,H*,DKH= *,HtTG1ۃGt ),up[@@Hl)KH), HxIH=),GHdH=),H HĀIH=i),H HĀqU@HAUATSHlHH=YZ,u fHWIHG(AA  w1ILcLMtIutHHu1HoHd$IHdD HdHdnATAUAVHIIID$1HH`HD$HI}IuH+<$H)y Hʚ;HHAnxjH<$Ht$:D$ILw1IƋ|$xMtIu,A$xHHA $u1Il$HA^A]A\IHdD2H<$HoHIl$HLt$Ll$ Ld$(=t3p7uHt wHx1øKHdÐdH%HGHdH%HGPdH<%fff.HGHdH%ÐdH%HGHdH%HGPd%uWXdH<%ÉщЃd %9tىfffff.HHGHdH%GXt2d%u%щЃd %9u:d%ใtHdH%0d %dH<%L뭐H7HWdH%HGdH<%fHGdH%uDHWHHH7HWdH%HGd%uWdH<%ÉщЃd %9tى@HHGdH%Gu u HHWHHHd%uӉщЃd %9u5d%ใudH%0d %dH<%벐HHdH<%dH%pdH%x`@@HpE:HI9H\$Hl$Ld$Ll$Lt$L|$HHdH%dL$%HHt9Muvue1H\$Hl$ Ld$(Ll$0Lt$8L|$@HHfDLLD$L $oL $H)1LD$IQ0HdH3%0H)H9r덾L98MiPLL $)L $M9mLuEILI)H)I9UM|$L $I|$A$M9L $t/LMLH)I9sfHZHzL $I9HL $uLdH%DHdH%dH%pdH%x`@HWHHp@脺O8HG7AUdH%ATUSHHHdH%HtoHHHG0H)HLo0HdH3%0H)H9sHII)I9r,9HIEHHdH3%0H)H)H9sI9sH{H[Hu1dH %H[]A\A]Ðd%AAA9tdD%uAA tHdH%0d %dH<%f.u'd%AAdD%uD؃ tdH<%M1Hd4%Hd%ːARRM1Һd4%H9uЇuZAZfDARRM1Һd#4%H9uЇuZAZÃ<%dltYH:xMAQIAd#4%H 9u ttuډAYønHzʚ;APAQATAUAVVHIIպA$tH1H`HD$HI}IuH+<$H)y Hʚ;HHx?H<$Ht$It$d#4%HLA$t unH A^A]A\AYAXøVRd4%HZ^fffff.VRd#4%HZ^ATAUIIHH1H`HD$HI}IuH+<$H)y Hʚ;HHx6H<$Ht$A$tI1L?u 1HA]A\HunꐐARRM1ҁd#4%H@u+9tu ud%uZAZfffff.<%dlH:xuAQIAd#4%H @u<9t Hu ud%uAYÃtunHzʚ;APAQATAUVH IIHD$H1H`HD$HI}IuH+<$H)y Hʚ;HHH<$Ht$HT$Ё@uS9tA$Hu&It$ d#4%HLHA$u)d%A$uH(A]A\AYAXøÃ0nݐ_d4%d%:WHtd4%=(Ð=K,uH=(HjH$H<$HHHH=(Ð=]K,uH=d(H H$H<$HSHHH=0(Ð=J,uH=(HH$H<$HHHH='ÐHD$ HT$D$IHD$HD$HD$tLHcHcHH=wgDZ,uLcAHHT$LD=w |$tED$ÃuBL¾ LDH=w<,HdD$HdHdfDUSHHxH$HT$PD$HD$HD$@HD$ uL zI,tG=HAHcHH=DljD$pD$Hx[]D t+HHcHcHH=vHdċ,uLcAHHT$0LD=v4uHھ LDH=wF,l|$0t D$4TD$4IHd%Hd멃=]H,u+H=d%H H$+H<$HSHHH=0%Ð=G,u*H=%HH$*H<$HHHH=$ÐSH G,u!E1E1LcHc-H=waH [HT$ $Ht$|$* $|$E1E1HT$Ht$-LcHcHHw%HD$LHD$HdHHdHɐ=F,uIʸ-H=#HH$Iʸ-H<$HHHH=#Ð=F,u/H=#H:H$/H<$HHHH=`#ÐSH )F,u!E1E1LcHc,H=waH [HT$ $Ht$|$ $|$E1E1HT$Ht$,LcHcHHw%HD$HD$HdHHdHɐ=}E,u.H="H*H$.H<$HsHHH=P"Ð=E,uIʸ,H=!"HH$Iʸ,H<$H HHH=!Ð=D,uJH=!HjH$JH<$HHHH=!Ð=]D,uH=d!H H$H<$HSHHH=0!Ð=C,uH=!HH$H<$HHHH= Ð=C,u#H= HJH$#H<$HHHH=p Ð==C,uH=D HH$H<$H3HHH= Ð=B,u"H=HH$"H<$HHHH=Ð=}B,uIʸH=H'H$IʸH<$HmHHH=JÐ=B,uIʸH=!HH$IʸH<$H HHH=ÐHA,u! THcH=wGHÉ|$X|$A THcHHw#DljD$D$HdHd̐HA,Hu E11H=H=wEHH|$E1A1Ht$H=HHw#DljD$D$HdHd̐H(z@,uE1HcHc=H=wUH(ÉT$Ht$|$T$|$AE1Ht$=HcHcHHw#DljD$;D$HdHd̐=?,uIʸFH=HH$IʸFH<$HHHH=Ð=}?,uIʸEH=H'H$IʸEH<$HmHHH=JÐUHSHH?,u|HtHHuJAA11HD=vt=vHĘ[]@E1HĘ[]HH\$HD$HH!D$VHAt+HHtHH\$HD$HH!D$AA11HD=vt=vE1DljD$CD$WH=wHdf.H=,uH=w?HH|$oH|$HHw"׉D$D$HdHd0͐d %d4%HcHc1)ǸHcH=wHdÐ[AHIdL%L9Bt12uILBBH:H+HĀؐHdH4%H9rt:1 tH0Hp@fB1ҐHBBu HB uH:HHĀ搐ffffff.HHHIHHD$(HFHD$@HFHD$HHFHD$PHF HD$XHF(HD$`HF0HD$hHF8HD$pHF@HD$xHFHH$HFPH$HFXH$HF`H$HFhH$HFpH$HFxH$HH$HD$8P@ HHD$0HT$1HL$(MAHcHDHHHE H=MHT$IHT$IPHT$IPHT$IPHT$IP HT$IP(HT$IP0HT$IP8HT$IP@HT$IPHHT$IPPHT$IPXHT$IP`H$IPhHT$IPpHT$IPxHT$IHT$AHT$IHHdffff.GvHdÐHdH%ÐHdHÐIHIIHcIF=vHf.HL1I<H)ER1HÐULcAHSHLL$I,KHBIHH)HD$HH I9ILELLL׉=1Ƀu=wtHH]H8,1fH]SHHH8,Huef.<uJHH9wHc=v H[@d%8d%@1H[øH[ËH$Ht$H$Ht$uH8,념UHHSHHHu(HtnHU0H9s<Ht 4@<u*HH9rlHU0H1H9wH[]H[]@H)1HkPH1[]HھUP1뻐ATHIUHSHHHB7,HtuH9r&fDHH9v|t[]A\fDI9\$0I|$(H(HǸ HtI|$(I\$0HHީ[]1A\dH%\uH6,g@I|$(#[]ID$(ID$01A\I|$(땐1Ðtu@1fD'1øÐGt t d%G1ÐGu HWHH%01Ðvu% 17øÐSH uƶ+t!~ 1H[؉1H[@Ht$+Ht$ȐHv+t19|J;5k+B%9u7 % 17HD4$H|$#-+H|$4$벸ҐUSdH%H ``1 1 t.@tRt8H[]fH8Nt: @um<t2 @f 1 lf.jf8H[]ÐHB+R+HH\$Hl$Ld$Ll$Lt$L|$AHHAdH%dH%HmD"AD++ HLE9ELAt!T+D)HcLɉL1E9t?1;D*  <@dt@0H\$Hl$ Ld$(Ll$0Lt$8L|$@HHfDE`8A9ʼn$>D9}<HuyHd(DE9>E95El$D9~&AD9D)HcɋLtfD*++ )HH< HHD%+AD"dH%;DH8~tZHd( D<tJ @{fDD,$ 1 >f.Hd(-%+HHHĀ'HHHĀ0HHHĀHHPHĀG@t 1øÐH\$Hl$HLd$Ll$Lt$L|$H8G@IlF+m9U;-3+I%9:Sd%9CDAEEDAD3D9tUEAADD A%A9u3E9t!sE1DDHցd#4%HDD D9uA1MtE,$1t% ʼn+sHցd#4%H1H\$Hl$Ld$Ll$ Lt$(L|$0H8#Bt̓AD+ADbf.fů+ATIHUHSH zbHHA"wtdH%I9tuA$UIH1&71HAt]HHDHHuZHdDAtIcH D[]A\1H3E1tHdDH []DA\HxE1H9AGHdD땐ATA"IUSHH HvfdH%H9thUIH13611HtSHLHHu[HdDAtHcH D[]A\@142E1tHdDH []DA\fDHxE1HdD럐{d%!GtDGAVAUATUSHd,%G3v[]A\A]A^HHHAA?9}1tWEu s@E1Һd#4%HH߃=v,#C@LE{CdH%HS HHPdH%HC HdH%HHCdH%dH%WHHLW dL%E1ɁAf.@uB?9cDD;{@H@t9ȉ;oAAAAA9DDEAEDAD D9tREADD ‰A9uHD9t!sE1DDHցd#4%HDD D9uCk1[]A\A]A^D9EJ݉¸#X G6C16b]@HW HdH%HCdH%HLPdH%HC dH%HHCdL%dH%6CCdH%HLPdH%HC dH%HHCdL%dH%k ZAKD;ndH%C #CCdH%HS HHPdH%HC HdH%HHCdH%dH%k CE11ҾH߸dH%_dH%#KC qdH%Ctfffff.wI|u,dD %u$1A8EH1u+@Hs!,Hp!,@lHM!, HJ!, H Ha!,HH Hh+1ffff.AWAVAUATUSHH!,HtVH",H HH)HH9w5DH8H9v'8uHX0HL`(Lp LhH9HBfDH1E1E1E1Hӡ+1H|=L|MLHILLHL(HH$+>HH!HtyID1LHHH)H<9H=+LLHL$HH+ + HL$J49IDPlH6Hvt3II[fLLL)H<9H=+f.%+HH+L%+L-+L5+H+HD+@Hy,Hv,@lHK+`ltiID1HIIH+H^,HDH",HH H HU+ HCH,H[]A\A]A^A_fD@AWAVAUATUSH(H,HtvH,H HH)HH9rUDH8H9sG8uL`0Hh(Lp LhI LHD$HD$ A -fDHD$HD$ A 1E1E11Hj+L|IIH H#L$HtrHD1LHHH)H<9H=+LLHL$H++赐HL$J49IDPlH6Hvt,IXfLHH)H<9H=\+f.%]+HHo+H-`+L-I+L5J+Hg+H+@H),H&,@lH+`ltiHD1HHHH1+H,HDH,HH I H+ ICH,H([]A\A]A^A_fD@ID$I$ LHD$LHHD$BSjlHjlHHtf.jlHu[ffff.AVAjlIjlAUIIMATIUSt"1LLjlHL9rAjlIjlI4Mt1LLjlHL9r[]A\A]A^AUA@HI@ATILUSHMtE=2%uGL%2@@1@SHL#HH%uHPL9I$rH[]A\A]ÿ@IxV1I$H\$Hl$HHE@u۸HD؉DHuH1ҿxՐLG0LOHW8IdL3%0IdL3 %0HdH3%0HLgLoLw L(LL@@HtHÐAHcH=wHdÐH(dH%H9a+t41=9,t5?+ 50+H++++t=ItbtHtCfDH$ 1+HH$ ++wp+e+Y+ PN+cO+9+:+u/H1+=,t + + dH%H9+t41=,t5+ 5+H++&1HH$+HHHH9u1HDŽ$U+a1D+׈9+3H=5+H HĀH=+HzHĀH=+HHĀ#AWE1AVIAUATIUHSHHLD$@MM9s0O,>HILIHH$HT$|tM}M9rH$H$H[]A\A]A^A_ÐAWAVAUATUSHHHH|$Ht$(HT$IIIILLM)HHH|$LHHD$HPHh L8H@H$HT$HD$ HBH(MtgL|$L|$ IHEHMt:MLHL$AEIIEHMufL|$MtLLHIԈHD$HT$H|$(Hp HHL)[]A\A]A^IA_駈HH[]A\A]A^A_ÐHHMtMtHT$ HL$HHLILMHuOf.MAL|$L|$ (HIHHEHM McLHL$IEIIHEȐHELt$0MIHD$!f.LIMH9wJL|$HMpH|$0Hl$8HT$ LLJ\=$LHl$0MH9vH+L$HL)H HHH90HpH9 IILH/11oHfDHI9wHHHH9Hl$80HHHH HH9DLHLBMHIL|$fDML|$L|$ $HIHHEHM\MtLH3I}$IEIIHE@MLt$0(HT$HH9fDHT$8HHH HH9;HT$8UHAWAVMAUATISHHxH H}HxILIH +Hm5+1HcLHH9ILdAh hHHpdAHEH H]HELeLuHxHEHHEIL}I7I9HEsHULHHHH9EwHuHxH}HEHEHxjHEfDHEM$L;eteH}HuHrH}HMf.LH+E1IH LAHu(LHuI IAHLI@H t}HHHIIJtHH7 ,=X ,t +w q+iHt"dH3%0HHnH^HV1HH[]LHtHpH@넾HT$1HHT$oH +HH+ff.AT1IUHSHH= ,t5+ 5+I$HI1IIHt?HyHt?HJ<uKHIt HDH>H LAHu(LHuI IAHLI@H tHHHIIJtHH ,= ,t +% +Ht"dH3%0HHnH^HV1HH[]A\LHtHpH@낾HT$1HHT$mI $HI$H=X+H HĀH=9+H}HĀnH=+HηHĀH=+H?HĀxH=+H萷HĀ"H=+HHĀH1dLfffff.HdLAWAVAUATUSHH(I@Ht$E1E1$MHhIHADI tIAEHADI u<-<+D$@0I^ UJ11Hc@L̀IIL$L9HMLE1E1LcHL$f.NЀ vRHt01A84$t&fE D: u HH9wH9kIHh@DqIHx 79M9MNH7@H9hH|$tHD$H8E|$HHHL9T$LH؅IDHd1H([]A\A]A^A_MW 11IAuf9t$2fDHA7@1I911H|$tLH)H~IUI@xIM1IEAx0uH1S >HcfD11ݿu Hd8t1=,t5+ 5p+`+U+u"1Ҿl*1Ҿ@l=,t %+ +[AT1IUSHpHT$H$DŽ$HHH=,t5+{ 5+l+P+u4@lHj)lHPD=+t T+. F+ H$Hs1HL$H 0@1HÅH$hHDŽ$@@H$HH$h18H=lj$hL$l} 7@$h1LǽHHu Hd:tHc$hH9t DŽ$l1=+t5F+? 57+0'++ur1Ҿ@l1ҾlutFDŽ$l=4+t + +$lHp[]A\@1HatDŽ$lH$@1聨@H$hH$@@m-J+=+t >+u 0+gdH-+d+1Ҿ@ld+뫾1=?+t5+7 5+(++gH1Ҿld+~1Ҿ@l@HDŽ$ ˨IHDŽ$(èIL$0HDŽ$8A1Ҿl01HHb+H$ ƨI++ZHDŽ$hdyfffff.SHHt +u$H[fΨIH[H|$nH|$߉D$D$H=v+H讪HĀH=W+HHĀ.H=8+HpHĀuH=+HHĀH=+H2HĀH=+H裫HĀH=+H脫HĀzH=+HթHĀHSHtO?tJ/8WHHHt:zHBu01H9s4z/HBt 8H8/u/H9HrDSI[ÐHBuH[H9rfDH9Hs̀x/HPu[ÐAWHIAVAUATUSHL$1HHL9HLYLnM9D IM9w|GdE8uDREt+G:THKLtѐyHH@8uXuM9w7HL$HL)ȃHcH9t.~'HItI9hL9IB[]A\A]A^HA_LHD$ILl$f.DpLxEuD0IELAM9ELLt5F:LuRHJLDDyHH@8u/CuHI9I)MM9u(LLmkHI9vI)MM9$Ht$ DM9 Et3F8Lu;HJLDfDyHH@8uCuI9vDHI9vI)E1yHHT$0H(@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$!HÐHHT$0H@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$HÐHHT$0HH@HL$8LD$@H)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$JHÐH\$Hl$HLd$HHHtU>AItJH(LIHHJ1H$H$L$HDA'KLffff.H\$Hl$HH(HH=}+dtHHl$ H\$H(.T$,T$tZljT$ŋT$tDըIljT$HT$t7HHHD$HD$H\$Hl$ H(HBH=|+rT$[H=|+T$WUHAVLAUIATSHHH@Hg@HHLPH)HULXH)z)r)j)b)Z)R)J)BHEHDE|+DžDž0HH0H HI'HHHH)Ht$HHHIUH9IILHHt|f1f1AoDHfofofdf`fhfofefofifafofLfof$fefafifT fD0HI9wH9t@AT HH9wLHCLHe[A\A]A^LH%He[A\A]A^HV@I91fDAL HH9w떐ATUSH vfxLHdH,%H9jt01=+t 2 2HHjB ƒ fxHBBH1HPL1=+t5+G 5+8I|$HMI$@=+t +* +H;}y+t H;|y+tH;{y+tH[]A\@H{HtHZHJŋh~@HB=)+t  f;Hx4HBBu HB=+t  u|H:ZH:H諟HĀ1H=+H茟HĀH=i+HHĀH:HHĀBH:HǠHĀiHl$H\$ЉLd$Ll$Lt$L|$H8 uDH fDHC= +t uw uqH1f;Hx0HBBuHB=+t uD u>HUH:H臚HĀH;HHĀtH:HHĀ몐GtHt0t+Iɹ`IHOHHH@DH\$Hl$1Ld$Ll$H(I8HACHHHH1HAIH1`dHHǃI]>DHLH,EHtRCtt0t+`IIHOHHH@HHl$H\$Ld$Ll$ H(HaH1АH\$Hl$HLd$8HI1[HHHH1HAIH1xcHHǃIu=LHHBDHtLCtt0t+`IIHOHHH@HHl$H$Ld$HH`H1֐Ld$IH\$LHl$Ll$H(IIHHMf9xJHdL %L9Jt01=+t 2 2HLJBLLHMf;Hx=HCCu)HC=r+t  DI9t H1IHHH\$Hl$Ld$Ll$ H(@1f;Hx0HBBuHB=+t uD u>HSQH:HĖHĀ H;H9HĀPH:HHĀ몐Ll$IH\$LHl$Ld$H(IIHHMf9xJHdL %L9Jt01=2+t 2  2HLJBtbtg11f;xHCCtwL9t@u H1IHHH\$Hl$Ld$Ll$ H(ǃHLLHP8HH@z1@HC=Y+t ug uaof;Hx0HBBuHB=+t uA u;HvOH:HHĀH;H\HĀH:HDHĀ뭐AWAVAUATIUSHH(HHt$T$HfxLHdH,%H9jt01=V+t 26 2+HHjB HI<$t HD$H8u#HL$xHxWHI$JLsLkM)MHD$$HiLsLkHl$M)t$LLAHIt IM)IHl$Il-HHL$HEHH9v0L4I<$L9LCLHI$HD$L0LsH|$I<$LLVLkMHI$(fx8HBBu$HB=+t  H(H[]A\A]A^A_Hhuf.HLsLkM)HHdHHdKOf;Hx0HBBuHB=)+t uD u>HLH:HHĀH:HjHĀH:HOHĀ몐AWAVAUATAUHSHH(MHt$DD$LL$tA@1HL|$uFI9DLLCLs?HHu{LLLL)MTLkHt>LsLkM)MHeD9HAIHu@LH+D$H([]A\A]A^A_fHŋD$L)x H|$HHLLH $CTL+|$H $HKH([JD=]A\A]A^A_H|$tHT$LH+D$끃|$~ E'If`DHFPǃAWAVAUATAUHSHH(Ht$DD$1HL|$u?{I9DLLCL=HHusLLLL)M_SLmHt6LuLmM)MH.dtA9HAIHuLH+D$H([]A\A]A^A_ft$HL)x H|$HHLLHL$RL+|$HL$HMH(J;[]A\A]A^A_Ã|$~ E'I{DH`EkDžHl$Ld$HLl$H\$HE11IIվHHDŽ$9YHHHHHDŽ$InLLHj HD$(H;D$0s-H$H$L$L$H1HCʐH\$Hl$E1Ld$Ll$HIHIH1ɺHDŽ$yXLH11HDŽ$InLHH1.H$H$L$L$HÐSH t"HH[H@H@ f.[fffff.USHH(HHH;PHWH;WHHx0HT$HPXLD$HP`HHKHP0HxHpXHHPH|$Hx8HSH<$HLUHD$HCHHH;Pr&HdT H([]fH([]"tHHSHx0HT$GHx@Ht #H诣H Hd ff.H\$Hl$HLd$Ll$ALt$L|$HHE1HAHPH9P/Eu 1A?HPH9P wtH薑HHx0 A*AxEHHH{ HK8H1H+SH9H9H#HKH)HK(HK HHHK0HHHSHP0HPHHPHP HPHP(xH1H @HH$H$L$L$L$L$HH;HA1觏HLLAW "HSH+SHHH,*HQH+HHH)HHt%HE1HHHtyH1VHDHHH1HS8#HHHSHSHSHS(HS HS0HHJ0HJH HJHJ HJHJ(D$%=sHl$0E1UHC8HS@IHH)H)H!I)I9~HE1H1HHIxoMXHEH@pHs8LHI9H0HLAH)E1HH H9HA@H@HxHt #HD_HC8HC(HC HC0HCHCHCHHP0HP HPHP(HPHHPHLHP`LL+@HPXHHKHSIHXAW0HcHHCHCHHHHHCH+CH,(H@HHd11HS8L#HHIHSHS(HS HS0HHKLkHJ0HJH HJHJ HJHJ(Hs8HS@H)Y@AWAVAUATUSHHH2HHH;PHWH;WLHG8HGHGHGHHC0HC(HC HHx0HB_+HfxVLdL %M9Ht91=4+t A0 A0} LH^+MHA@%=f}HLl$0Lt$ U:HHs1E1HP0HHPHPHP(HP HPf.HS@HHH)PpH HHCHt HHHHHJXHJ`LSHKLS HMLHPLHHpXHT$H@8LH$AT$Ht$01HsHHHz0H9z*tKHu8H{H9HkH)Hw,HLcHHsHsHsfHL)uXHuHdT HH[]A\A]A^A_DHusHun HH[]A\A]A^A_H)HLH7DHKH)HHL$6HL$HCHHCHHsHsd@ HcHdTP@HH[]A\A]A^A_HT$8HPXLD$8HP`HHOHP0HpXHHPHWHxH|$Hx8H<$LLAT$HSHSHHt$8H H;JHsHSH{8H)6HCH+CHC8HCHC8HCHCyDHBBHB=+t [  Q H2fDH{HHt :#HYHC8HCHCHCHx@Ht #HHHPHAI<.LI)I9LGLL\$VAHL\$MLHJLJHrXLHL$HR8HH$LAT$HL\$HL$0HL)IHH)HLHIHsHs Hd f}Hx8HBBu$HB=[+t  H;fffff.H\$Hl$HLd$Ll$ILt$L|$HhHHLHW0LO(L9u(Hw H9tH)&LK(f.Ls(L|$( DLK(IHHC@I MLLLt$HXH$AUHs HS(H߉D$H)i&L$t_HD$(HL)IHH)ՅtuIIvHuHHP0HPHHPHP HPt5HHP(H\$8Hl$@Ld$HLl$PLt$XL|$`HhfDHP8fH\$Hl$1Ld$Ll$ILt$L|$H8HHHttA$L IE(I} IH)E1HHIugLLI)Et$I$HP HpH9tH)LHHL)H\$Hl$Ld$Ll$ Lt$(L|$0H8H9LFIA AVE>@4HCH9DDE411@ofH9rB4D)E9ЉL 3H47t1A  HyAJHH4I} HL)IDIE8H)HH9w@HH9s7z LrtDL9s#IA> uI)AIIFtE1iHLEJ4IE oHGH9A@H 1fHH9uHIH\$Hl$HLd$HHHP HpH9v*H)HuKHL L+`IMu{ `H\$Ld$HLl$Hl$H(IIHLJHHLLPxHHHC8HCHCHCHC(HC HC@HC0HH\$Hl$Ld$Ll$ H(fHWHw H9vHH)1HtHMfDfdLfE[Rffffff.H\$Hl$1Ld$Ll$HLt$L|$H8HIHKI% = ]HG0H(IH9weHHPHM@H+M81HvL1HMI)MK4'LH I)fDH)E11HILcH9ILFI%AAEEd@ZIT$H9<DƃAo$)A9I fHtD1H@2HyAILO<H}(HL)IMMHL)H\$Hl$Ld$Ll$ Lt$(L|$0H8@H(HE@E11H)H9H H9y HQtI9H: uL)AHBLLO<,#HE(>L)HMHE;f.HWI9A@HItLH HH9ufLLH"I)I9E1HLf{ff.AU1IATIUHSHHH4H)H~XHAD$tuUA|$pHHgHyA $ LH)I$Hx HI$H[]A\A]fLH)A|$pHHgH@pQhSHH8Hs@H)HC@HC8{p[hHwp鰄HGtu pHgpgHHff.USHHHWH;WOH8lH;+HfxVLdL %M9Ht91=+t A0 A0LH:+MHA@%=uHHPf}x=HBBu)HB=+t  DHHs8HS@HHH)HsHsHsHs0Hs(Hs PpH~BHHCHt HHHCH[]fH[]fDu> H[]HHHt Z#H7qD  Hd {f}Hx8HBBu$HB=^+t  HH\$Hl$HLd$Ll$HLt$HHGH9GAAHG HS(E1EDDHDH9H{8gAAEHH!H{ HK8H1H+SH9H9H#HKH)HK(HK HHK0HHHSxH1HH fDHH$H$L$L$L$HĸDHHH-HU+HDHHHtHS8#HHSHSHSHS(HS HS0afDuHC8HS@IHH)H)H!I)I9~HE1H1HHI_MbHEH@pHs8LHI9H:HLAH)HCH+CHHHH*E1EfD$%=Hl$0DHG H;G(AHgi@H{Ht #Hd4HC8HC(HC HC0HCHCHC\EJH1HHH.f.HXH11HS8L#HHIHHSLkHKHS(HS HS0lHdHRHs8HS@H)Tffffff.SH)Ht"HC8HC0HC(HC HCHCHCH[Ð1H[fH\$HLd$Hl$HCtHEĉ։1hŅ}DA% kp AtHV"HHl$H$Ld$HH1HPHHuHd8t`D11vhifDH\$Hl$H $HHH!kpH\$Hl$H@HSHHLJIHǀ@IZ(Ht%HC8HC0HC(HC HCHCHCH[@HHǃ@IHǀ@I1[ffffff.SpHt,DE~RHHpHP H)H@tH1[/,HHH1[ ,DHw HW(H)tf@H\$Hl$HLd$Ll$H(HIHu"1H\$Hl$Ld$Ll$ H(HWHw H9t"HH)ֺHt^HHHHLPxHIuTDHC8EHCHCHCHC(HC ~XHC@L9HC0MEDHLJftLfufDSHW(HHw H9w_HsH+suHǃ1[fDHHHt HCHCHd8t[@DE~4HHpHP H)H mf.H)ݐH\$Hl$HLd$HFtYHw HTHW(H9S@\@*HHS( @H$Hl$Ld$HH HWcHsH9s@tvHS@DHs(Hs HS0HSEHSHS~HaftHs0HEDHHl$H$Ld$H)HHs8HsHsy0Hs HH) fD Hd H-HS8HSHSHSDE~5HHHpHP H)HyHS(cH)HLcHI)HCHH+S8HƋI9IFH)HsHskffffff.ATAUSD9gpH1%=H-"HHAċ~ZHHx@tH^111H^HH@HH@H@ H@H@(111HHCHCHHCHC(HC HC0`E $CpHǃDD[]DA\f~&HHpHP H)H[@Hw HW(H)pfUHAVAUATSHHH {pt1He[A\A]A^fDA11AA@+m7xDKtQLAeQ?b(fD"+u/ADKtMžmxDKtAPIHe6btD+u'ADKtI;mJxDKtLAIebfZ+StD ƃ1_AEDcp%D AA1HYI}`IӺIHMII,ILL)LHP!HH)HLt$ILA&H=U` L^` LLE13<_t6<-t2<.t.<,t*<:t&f8x8HBBu$HB=k+t ,$ "$~+}+u/H}+=1+t }+ $ }+#fHW`HH+GHtHcJHH9HOHuff.HGHWX'HWHGXHWHGHHWHHGHGDHWHGXHOHHWXHWHGHOHWHHGDHG(H;G SHwJu3H;CHS8HSvHC#HCHC0HC(HC 1[HSPHSfDHPtHC(fffff.u LJHH@ffffff.f.HSHP tHSHHS[fff.HH@@H1H@Hffffff.HGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@ffff.1ffff.HSHGHH;Gv HP@@8tHHP0t#[fDHWffffff.HGH;GSHvHPHW@#[ÐHP0u[f.HcHH9s,x HHtf.H9sH9 u)@:@HWHB`HtH9u @H9tHHHuH`fHHfG+FfHWHtuHB+B‹G)HB+Bffff.HVH9tËFxI tbHB HJXHBXHBHJHJHHBHFHJHJHH1HJf. t)HJHH1HJfHJf.HBHzH HJXHBXHBHJHzHJHBHFfHf.H1ffff.f.fffff.H+1ffff.HGhff.Hfff.dH%H9xx+t41=+t5Vx+ 5Gx+HBx+7x+f.x+#x+u/Hx+=[+t x+q w+cfff.w+w+Hw+H\$Hl$HH(H8HHtt6Hk8HS@u Hl$ H\$H(Ã#Hl$ H\$H(fDHs@HT$ $HH)HƄ $HT$fff.SHtMHWXHGHWHGXHCHHHCHCH{HׂHCHHCXHCP[DHHfAV1HIAUATIUHSHH}(Lm0L9I)L9LFIMteIIE@IL$HwH9Ao$HIHf1H@2HHyJ /MHM(L)HtAHA4$HPt*IHEDLLMrHE(@LH)[]A\A]A^fI9[J /LfHHH9uaHYAWAVAUATIULSHHHG`HwH)HHHHczHH9HOHuLCXH{HHH)MI)L9HI)Hx]Hu8N,/HLkPtA)D)`HHu1H[]A\A]A^A_LHLkHHsHC`I4(HLHLHsLH)H{HH)uLkHHsHC`pLGXHH1MI)JLrdH$HL$LqHH$HHL$NHx4HHsLmdLH{HHkHLHsHkXHC`HHsXLmdL{HHLjLLHL)H\$Hl$؉Ld$Ll$HLt$L|$H8HwHGH9vDItzIFHCAn@H\$Hl$Ld$Ll$ Lt$(L|$0H8HHtEHCLsX HCXHCHLsHsHHCLsfDFHV9tN48HsLLrH{Y~LcMLsLcLsPtffff.AW0@E1AVAUATUSH(HAEH$0MAHD$dH%H9r+t41=9+t5q+m 5q+^Hq+q+H+-q+Hۉq+dL$%AE1f.Hy+Hf;H{q+x@HL9bt/DD=+t 2 2HLbB%=f;x8HBBu$HB=6+t  p+Hp+98H[hH;p+p+u/Hp+=֏+t }p+` op+REt H1Z:H([]A\A]A^A_HHP"H1Ҿ0MA9fff.AWE1AVAUATUSH(to0@HH$0MAHD$0@E1dH%H9o+t41=+t5o+ 5o+Ho+o+H-+D%o+E1HD$tdL4%f.H-I+HAf}H-Io+xAHL9rt01=d+t 2/ 2$HLrBHHPH9P vHHPDDf}x?HBBu+HB=܍+t  zn+Hwn+A9HmhH tCn+8n+fDEt H18H(D[]A\A]A^A_H-+HtAċH-m+~HHHJH9J vHHPt0m+A9Hm+uHmh@HU H9U(w@AH}m+=+t em+ Wm+$@HM H9M(kDH1Ҿ0MA6ABfAV1AUATUSH+AHdL$%AA%twtmHL;btD=+t**ukHL`@E1=l+u H11HPXAǃH[hHY[]A\DA]A^Ds[HL;bD=X+t**u!HL`@A^@#[AJHS8Hk+HHHC@Hk+H)HHBBHB=+t  BB8ffffff.fDUSHH(a 10@H@ŅSH$0MAHD$dH%H9j+t41=+t5j+) 5j+Hj+yj+Hj+f;xJHdL%L9Bt01=+t 2 2HLBB'j+f;H +H +HChxHBBi+Hi+i+u/Hi+=+t i+y i+kt H13H([]DH1Ҿ0MA!3@HB=+t > 4Xffffff.USHH(?0@1H@ŅH$0MAHD$dH%H9h+t41='+t5h+ 5h+Hh+h+Hh+f;xJHdL%L9Bt01=ɇ+t 2 2HLBBHL +Ht5H9HBhHt#H9uH9HPhH@hHu#f;xHBBg+Hg+g+u/Hg+=+t g+ g+t H11H([]HhHChg+H[DH1Ҿ0MA 1]@HB=+t  9HCh%g+H +fHGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@҉xeHHA0HA8HAHHAHAHA HA(HA@HAHHAPL@HLJ@HGt7HG8HG@HGHHGHGHG HG(HG0HGhHGHHGPHGXHG`fLJt@H@LJHLJfSH`HtHG`H{HHHtIt%HKXH{HCHSHSHKH{HHCXpHCHHCXHCP[fDUE1A" SH1HqHHt%H{8Htt!#Hk8H Hk@H[]Hs@HH)Hq@H\$Hl$HLd$HHHIP`MtHuwH{8HHt Hk8HHk@HC0HC(HC HCHCHCHHl$H$Ld$HH{8ƒHtt"Hk8L Hk@f.1@Hs@HH)Hp@Hs@HH)Hp1fAVIAUIATUHSHwHLgI9I)I9LGIMtwAAD$EAHVI9Dǃo)A9ILfAEHt:H@9HyAILMHsL)HǃdHsLcL9't1HsHLLcXHSXHSI9LcHsHSHHsH{`H{HHHtGt%HKXH{HCHSHSHKH{HHCXmmHCHHCXHCPHHP tHsLcrfD L[H)]A\A]A^LLLcIfIUH9jA@HI|L HHH9u|fLHEHqHD{fTHL UHSHHHuu7HSu+SUHC`HEHk`H[]D+SUHF(H;F wCu1H;CHS8HSHvHCHCHC0HC(HC ȀHSPHSHHH߾Pt HC(랋Vffff.USHH(H8Ht HC`Ht@H@HHuH{HHt ZkHCH;0@1H@ŅH$0MAHD$dH%H;:_+t41=r~+t5_+ 5 _+H_+^+H_+f;xJHdL%L;Bt01=~+t 2V 2KHLBBH+Ht8H9JHBhHt&H9ufDH9HPhH@hHu#f;xHBB4^+H=^+^+u/H^+=V}+t ]+ ]+t H1'H([]@Hs@HH)H6kHC@HC8HhDHCh]+H+DH1Ҿ0MA!'*@HB=|+t &  HChD]+H-+SHLJHSHsH9H{`H{HHHtGt%HKXH{HCHSHSHKH{HHCXwhHCHHCXHCPHH[H@(fD[[HHsXHKHSXHSHHsHKHH9HSHSBHHS[HfDHpifDSHLJHCHsH9H{`H{HHHtGt%HKXH{HCHSHSHKH{HHCX7gHCHHCXHCPHH[H@ fD[[HHsXHKHSXHSHHsHKHH9HSHSB[f.[HH(a|ff.H\$Hl$HLd$HH8tH$Hl$Ld$Ht ~AHHPhuH{8LHHtt#Lc8Hk@ fDLHHs@HH)HfgH:H)HĀH=Y+H)HĀH=Y+H'HĀJH=Y+HH)HĀ~H=eY+H'HĀH:H~'HĀH:H(HĀFH=Y+H(HĀH=X+H%'HĀAH:H 'HĀH:H(HĀ,H=X+H`(HĀ3H:HE(HĀ%H=bX+H&HĀH:H{&HĀH=(X+H'HĀvH:H'HĀH=W+H"&HĀH:H&HĀYH=W+Hx'HĀH:H]'HĀUH=zW+H%HĀ_H:H%HĀH=@W+H'HĀ?H:H&HĀHW(HGH9Hw(H% = t)HWH9ʸs@HW% = uHG0'HWHOHG(fffff.HG(H9GHCGH+Gfffff.SHH8Ht uHC8H1[Dt tkff.H\$Ld$1Lt$Hl$ALl$L|$HHHo8HW@HIH)H9}HG0L H$t2H\$Hl$ Ld$(Ll$0Lt$8L|$@HHf.HFdHD$HHItHt$HS@H+S8HH^HHC8HT$H$LHITL)IyEuTLLk H)HCLH)HCLH)HCLH)HC(HC@HC0LK|=1L)趌1LLkH)HC LH)HC(LH)HC0LH)HCHC@HCf.H\$Hl$HLd$Ll$H8HAtKLo(L9oLCoHGI)Hu=H\$Hl$ Ld$(Ll$0H8tYt|Lo(L9oLCoL+oAJD-AHDHL9HHC HC(Hf.tHCH+CoHC(H+C [Lo(L9oLCoHGI)At4JT-AHDHxPL9WHHCLHCHCHHkH)HC(H+C H@1HH=HHH߉L$L$uHCfH\$Hl$HLd$Ll$E1Lt$L|$HHAĨt91EuH\$Hl$ Ld$(Ll$0Lt$8L|$@HH tPHW(Lk8L{@HH+s IcM)LH9sOEtHS(H9SsHSf.@*HHS(HWHOHW(HOfFKD?dI9HD$3HHIMtLLHLHC8HT$K<>1L)aHT$LHILLs L)HCLL)HCLL)HCHHS(HC@HS(HC0fDH\$Hl$HLd$Ll$H(HHIub1H興I1LHH=MHk HkHktLLc(Lk0LcHǃHl$H\$Ld$Ll$ H(@HIH9LB@Hk(Hk0LkfH\$Hl$Ld$Ll$H(HHIIHHu^1ḢI1LHHMHk HkHktHLc(Lk0LcHǃHl$H\$Ld$Ll$ H(HIH9LBDHk(Hk0Lkf.H\$Hl$Ld$HIHHHHuV1HILHH1Hk HkHkHk(Hk0LcHǃ Hl$H$Ld$HHIH9LB뤐*1ҾЃ=bn+t 5X+5X+I lAE1fDD=#n+t 2o 2oHhH luH*H*AH[X+HN+HN+AHJX+dIdIH?X+pX+fDIdI:tЃ=m+t5W+to 5W+eo-ffff.j* X+X+HW+HdHHW+ lH*HW+H N+=l+t o nHhH luԃ=l+t W+n W+nfffff. *HH W+1HV+dHHV+H]*HV+HoM+ lfH9t HpHHhH= luHV+wV+V+ffffff.5V+u>V+H*AHL+AH* AH*AV+ffff.HtHGuHDtH1DHHffffff.H\$Hl$H(@HoH_@H4$H|$=H|$H4$HHH!tJHtDH t>Ht5H@t/Ht&HtHtH@fD1HHl$ H\$H(@K+HHt!H T+H9wH >T+LI9sDHvuHHDt@;HIHH I HD19@@H9tEH[HHH9s MDH?HHH92H)H 9@H9uH@9H HHHOHHH)HL H HHUIHI HH D1@9@H9~HHHH9s!fDHwHHH9jH)H 9@H9u3HOEt.HHH,H9-0S+*HDHH9HHHl$H\$Ld$H8HH׃@u!H\$ Hl$(Ld$0H8@Ht$1ɺD$IwH9IvIM9A0wIHi+HپxIHhIHHDЃ1ޞ@H1G.KĞgMf.AWIAVAUATUSH8H=R+yd<%tOLwXLWPLOD1IHDID$LIT$L;`L;bI|$HPHBvIT$ HIFHI^HXvHC HC(HLsHCHH,+HSMLHCL{HHL$+Ml$IuDHH)HHCHSH;XyH;ZoH{HPHBv HS HFM9`Xt4CD,Id$7DM9IfDLIXXHHkB@HOhHL$fE~D$H(flHfo551fDofDo%71fDo>1fDoE1fo=M1foU1DfofAfAofAofAfofsfsffpfAfpfofs fbfffDofDbfjfofDfAofAfAoffs fffofs ffs ffofAfs fs fffs ffs fffofAflfmffHfoflfmfH f@0H@H9HH@H@HH@H@HH@H@I ltHA@A@HA@IHXH8[]A\A]A^A_HGXHHH@H@HH9uHN+E+밃=Cd+t Af Axf=:*HھrILD$LL$ LT$(J1LD$=c+t A0Qf A0EfLL$ LT$(5=c+t A>f A3f=*LrILD$LL$ LT$(1LD$=|c+t A0 f A0fLL$ LT$(Hx t3HC(HB(HC(HP Hx t=ID$(HB(ID$(HP H9tJHP HS(HP(HS HB(HS(HB ZI9t1HP IT$(HP(IT$ HB(IT$(HB H@(H@ $H@(H@ kUSH=*1=b+t5C+2e 5C+#e l~ vYHbL+HtH9IL+r HHI} 1 UI}1 TE ILu ILxuI} 1 TLEIL4ut\ILugI} 1 >TFI} 1 T%I} 1 Sff.USHHG+H;AELDtH[]HC1=\+t5I=+^ 5:=+^d<%t %=+H{/HHtHBHHE+fH<+H,=+Axl$E+E+E+Hf<+E+A lf<+AA~f<+f<+HC H<+H<+L~fHyHHH0H0H9H@H@HJ0H=<+HAxlHJ8HyH l<+Hz8HyHJ0IHHHHH5HJ0HtRH{~H?qHHHz8DHxHAHHHHHHA (l AL덐H@H@fDHH HwCH[#f.HHH|;(HHHH0w3H0H9`HH H w+Hnf.HH Hw!H[DHHHw HwHH H HnHHo|HICoHKHAH:+H=xlt2DHPHHvH@ H@(H@H=xluH HHBC+Hc(HB+H0HB+H8HB+@B+HHHB+P*HXHlB+hB+lB+HpHB+HxHB+C+uBDC+Eu6C+H!*AH69+AH* AH*AH~*HHA+HHA+HH8B+=W+t 9+Z 9+Z1HHHwHwHA+@HHo|HICD;B+EZHO*Hd8+HA*H>*A+AV='*AUATUSHC1=V+t5@8+Z 518+ZH|8+HLPE1E11H(lHtfHPH@AHIHuHH uLҿxlHIfHGH9tHHH@HHH9uHHhluD%M@+H-?+L-W@+L5`@+=V+t `7+]Y R7+OYA+)Dc DkCDsHDKsS DCDS$[]A\A]A^P lHR7+DHH7HPH)HHH42?+H Hu-?+H)5?+C=r*HPIH\$Ld$HIHl$Ll$LH('HH=?+HE11A"@BHIH?+uuLHcHHH!HBLI\$I\$H\$Hl$Ld$Ll$ H(H]IF@H{BE111A"@?BHtmLIMI)u#I$H=>+L)'B%fHLBI$18LA1#E111A"@AHIt©HA1ff.AWIIAVMAUATUSHHARHIz@BABH1>[1=0S+t A7V A7VH\$ 1HD$HD$11f.IDHHp1HH@HHuHHHtHHTHHFHHTHTHHPuH|$IXE1E1Hl$MGhHWHtpH9L$xL$pH$`H$hDHBHRIIH9HGH9HBH9uL$xL$pH$`H$hLxMIPIAIIAIAHtII9tDH111fDHBHRHHH9HGH9HBL9uIqI)IyIIIHuIAIMaII M9g=PQ+t AT AT1HD$Mn(IF8HHD$Mf IF0HH HtMH L tMtHKHSȰII~@LC1XHDHD1HL$xMIIxMIFIVM@II~@HL$HT$HT$H$1bXI lt~I_XI~@I1HHKHS6XHCIFHCIIv@HHI[]A\A]A^A_XI~@L$pIH$hH$`1W:H9+I~@I1HWH9+IFIL$xL$pfff.USHx *Ht$`D$hHD$HHD$XHD$@HD$PHD$8HD$0HD$(HD$ Hl$ I lVfDHIHhH luHD$ LL$@0ILD$HHL$PHT$XH|$`HD$HD$(HD$HD$0HD$HD$8H$1V1Hx[]Ht$`gSHH H=8+1=\N+t58+Q 58+QL8+MtIpH8+=N+t o8+Q a8+QMtB1=M+t A0Q A0QHdLLH [H .+HH=7+H57+H9H9L.+M1ې؃=gM+tAAtJMhL;x.+uքtI lLD6+1=%M+t A0Q A0 QHdLIhH#.+LH [f.H 6+Ht$H -+H=6+H57+ f.H=6+H57+H9LFHd<%tL6+H9H5f6+HHQHL@ LHT$fE~D$HHflHfo<fofDo?fDo Ffo5Nfo-Vfo^fofAfofEofAfofsfsffpffpfDofAs fbfDffofofAbfAjffDofofAfs fDfAfs ffs ffofffDofofAfs fDfAfs ffs ffofflfmf!fQfoflfmfQ fI0H@H9HHIHIHHIHIHHIHII lnAHAHIHAHHHIPXIIIxH 4+tH)HHIPXH)AHHBH1dLЃ=*J+t A09N A0-NމЃ=J+t5X4+-N 5I4+NH3+IhL3+=I+t 4+N 4+NfT$GKT$~,HcH *+@H*+ lA lH*+H=X3+H53+H3+ *+HHxHhHIHIHH9uNH52+Hd<%tH ;3+E1 AWAVAUATUSH=*-2+H*A lE1DptDPt1=H+t 3L 3LHCXHHx11HDHt@HPH@HHHuHH uHHsXHHHHDHFH9tHPH@HHH9uHH9uLxH=*DID)ȉD$1OH=*D"I1D|$ OT$H=*;I1Ol$ Dl$={G+t L KHhH ltAHeHCXH *TI_H=*"I1 OH=*D;I1N1+H=*iI1NH1+H=*I1NH*D ptH[]A\A]A^A_4ffffff.USH5*1=jF+t5'+K 5'+J l^ vYHB0+HtH9)0+r HH0+= F+t T'+J F'+JH[]$혵IDH/+1foHcۺH/+l@/+/+H/+B1ҁw Hc۲HR/+l/+HQ/+@HcO/+H/+H(/+Hc'/+H.+H/+:/+H.+*H.+foHcH.+`ffD۸uH.+Hy.+2HcHHff.AWAVAUIATUSHH(HFT$ HHHHH9@HH;-C.+H.HBHHH;x5.+Id<%tAeITILH9fH9HqHt HrHSHd<%tHH9uHt9H([]A\A]A^A_DDL$ E1EIEXH9YAEL$+Mt$AIIM;x|5-+jCuDHH)HHCHSH;XH;Z H{HPHBv HS HM9eX7CD43ID$IT$L;`OL;bEI|$HPHBvIT$ HQLIEXHPH;B-HHSHCvHC HC(HXHHZHH,+HCHRAEI lI]XH++++HHD$L;HC HT$IoXH9HHT$HLHD Iz@H$z/H$BHu>H+*HEHUH;hH;jH}HPHBv HU HID$ IIoXLuH9LLgID$ITH+HJHHHIuL2H)HLL9HGI)xHGH)*+HH9D++H3++fDD$ =P@+tAu+E AuEADId$DH!+HXHH;)+ *+1HH+)+HDHHhHH~e1*IHk!+HI9uKHH*H +H1*Ht"I)tH.!+L)L)%D)+HHX@|$ (=]?+t AMUD AMIDH([]A\A]A^A_DH6HߋL)+H)Ht5HH H-)+H)5,)+H([]A\A]A^A_-fIHLuHD$H+D$MI1IDHt$L`Ld$L;d$4LsM)I#D*EJJ<3LL$,L$M)LsM)xIL)%(+LUIL_DLI]XHHHCJfL(L I|$ HSu#=*H([]A\A]A^A_IEt҃==+t AMB AMB=*HS|$ Z1==+tAuB AuB,I`ɯIV=M=+t AB AB=D*HrIc1==+t A7|B A7pB|$ pID$ =<+tAuXB AuKBHBpIHHI;x=<+t AM/B AM#BHUH{TISHUH{T~J<3E1A1ҹ2LL$+*HL$Lsf\HSIfHx IHE(HB(HE(HP Hx ID$(HB(ID$(HP IHx tvHC(HB(HC(HP =|;+t AM6A AM*A=q*HھrI1=B;+tAuA Au AH9HP HS(HP(HS HB(HS(HB =:+t AM@ AM@=*LrI1=:+tAu@ Au@{H9t.HP HU(HP(HU HB(HU(HB rH@(H@ H@(H@ XسIxHInHPIHHI97PI9t$HP IT$(HP(IT$ HB(IT$(HB H@(H@ ffffff.HHWHwu: lu H1dH8jf.HH%H8fHOHHH4 #+H)HH HuHǃ-x#+H)5#+'@H=Y*I{ff.HSHt|1=9+t5_+@? 5P+1?1HHH@u> l=8+t +? +?[f=8+t +> +>HFHHHH)HЋ"+HH HuT[Hƃ-a"+H)r"+m&D=18+t x+> j+>Hڋ=*I[@[= *HVI+ff.AWIAVAUATUSHHxHrHFA HHHLGL;=!+EAADHLHH4HyHHVd<%tH~H9Hu "HHtXHMHd<%tH H9uHEA9 k!+HHxH[]A\A]A^A_DIwgDLChDT$ IDHhH9HHUH;jbJL=H lHPHBvHMlDLHH0LH H[D$ CLChuHLD$LT$[LT$LD$LDLHH Hl$(0L$Xl$\HD$0L[LLH HHD$`IG HT$PHL$HnwHl$@LcX|T$lL$hAl$dHD$8E1ITDDщփDHI\HCHcAH]A XA'HEHhHkIIl$I9;HUH]HyI;xlHIw I9>I9I\$LcHOHHH0H0D^HDHI<HGH9H_HH;Ss#HP(HE HU(Hj Hh(HH@ HXH9rH9RHP(HE HU(Hh(HU(Hj HXHH HwH[U@HH H HnHDHI<HGH96Hm(Hm HVIE`H9H;T$8L)LLHIl$Il$Im`LeLevHE HE(1H lHXIHTHI HLx+HHMH݅AHHHHw H@ILL$ D̓΍D 鋔XIDfDt 9v>wxXtщIDu HɅtHhH9>H!ꉔX@HHHH|+HkXLmIIL;l$8kCHLD$DL$LT$%D$XILD$DL$LT$D$ ,H|$(0T$\T$ H|$0L$`L$ H|$P l$ll$ H|$HD$hD$ H|$@~BT$dT$ JL=I lDHM:l$ D-IDHPH97L;z-HR(HJIIM9wHhH9HjH9MHHMHUM)H;h'H;jH}HPHBv HU HsIJL-H ltHMH]+H݅LHHl@0D$ H1d 4LmHEHUIMM)H;hH9jH}HPHBv$HU HtHx h HE(HB(HE(HP IIT$L9bJD=IL`HPHBID$wHC`IvH@ H@(1H lN40IHI LHL}HP>LH H v9LHHwYwD$ HJL-H lnD$ HLD$LT$LD$LT$LD$ ~HP|HCT$ T$ i=.+t AM_5 AMS5=*HUIDL$LD$LT$DL$1D΃=l.+tAu-5 Au 5HULT$LD$`+L;=.+HD$ (5+;3+HL$ Jl9HHH!I9HkXD$(LmIIH lIHT$8IID$L)HHD$0+HT$LT$`HT$LT$HHHHH!HL$0HI|$H9IL$H+L$0HxIT$HH+IH+D$0M)IH+MfHxH;vHHEHH9D$81H lJt=LL)HHHsXH HH]HUHF1H'1H lLJL=HHM)H IHKXHELiH5u+I@LT$HLT$fHPHxIuHPH+HNHL`H H HHHCXHPHT HBHH HHuHD$(IT$IL9bucJD=IL`HPHBID$vH@ H@(1H lN40IHI LHL}HP(I=w++t W2 M2=p*HU1=E++t 3?2 3421 I뢃=++t /2 %2=*HrILT$,1=*+t 32 32LT$=*+t 2 1=*HrILT$1={*+t 31 31LT$HEYHBPHx HE(HB(HE(HP mH+Lt$ IT e +HL)HDHL$ N42HI!HL$(MLLT$LLt$*HIHT$LT$toH +Ht LT$LT$1H=+uL%+LH5M+JT-L9H5>+O,.ILmH- +% +uHT$ ITLH#T$(HALGM9sE1A1"LLT$ HILT$t : +HtL6=$ +MD$0@L9ELH)H40H5_+LL1J (HT$LT$J1IH)HD$ H#D$(L$LF*HHT$LT$H \ +Ht HD$HT$LT$HD$HT$LT$LLH +H)HHBH +|$0t+I ILHIHEJD-JD-w*H1*HT$LT$HG1E1H lLT$EH-& +LT$IH)I=\'+t +. +.дILLT$h1='+t5`+. 5Q+.H-+LT$@JL*LT$1*LLT$HκHL$H)I<<HL$LT$ IL$HkXH9t@HP HU(HP(HU HB(HU(HB LH>APIH@(H@ VHJD-HHuHHHkXLT$|$(HkXE1A1"HLT$HLT$HHHP+;++~+H-+H;-+H-+vH-+HXH9t!HP HU(HP(HU HB(HU(HB H@(H@ {fDHLl$IH H\$Hl$Ld$Lt$H(LH9H*HHdL0Mt1=$+t A6, A6x,MfXIl$HI ltLH%H@L)H9HBLLHH)=b$+t A<, A1,HCHSt7D+E}HHl$H$Ld$Ll$Lt$ H(DY+HEuL9tsHPHHH wrHHHCHCvHHCHC vH HC(HC0fHC8HC@QH9HG1H;211LHI1I l=,#+t A!+ A+1=#+t5M++ 5>++ lLHÃ="+t +* +*H`wfDH=P +IMEƃ="+t +* +*LLHI"LHfHÃ=<"+t A* A*lHt$(LHHLH$Hl$Ld$Ll$1Lt$ HH(Y:H1LHH9H1d L1H:qHl$H\$HLd$HH{*HHdL M1=X!+tA4$) A4$)HLRHHt:=#!+t A $) A $)HHl$H$Ld$H@I l= +t A $) A $)1= +t5+) 5+~) lHHÃ= +t +w) +i)SD1H1HI1/fH= +IMEă= +t a+1) S+#)HLmHIHHHÃ=+t A $) A $(Ht$H$Hl$Ld$HDSHHy* H[SH1H=K+t5+( 5+( lBHCHCH+HAELDHCHC(HC 1!@HT0HlHT8HH=t;HlHxlH9uHD8HD0HH=uf.H+H HC+(H^+H0HX+H8o+@HF+HHM*PH+Hǃ`HX,+h(+lH++HpH%+Hx+H#+HH+HH+HH +H=+t * ' *&H[fH\$Hl$HLd$Ll$HLt$H(HHw= Hv[Hd 1H$Hl$Ld$Ll$Lt$ H(DHFHtH t @HH9wHHwHA HHHHLGIt H1Ht1HLiHHLtHHI!ILL)Hw ILL)HYHHH)ЃH lHHI^ILHAH LHH MHAIEuLIT$ HH9v>1H lKt%L)HHHH кHFIEL IEyIEH$Hl$HLd$Ll$Lt$ H(@HQHIFIFINHHI^IL1HA'Ld$Ll$IH\$Hl$Lt$H(D-9*ExB+AƃIIII!H*HHdHHK1=+t 3h$ 3]$Cth5+HJT&HHH!,HHtT=+t <$ 2$HH$Hl$Ld$Ll$Lt$ H(HhfDH l=,+t # #1= +t5O*# 5@*# lLLjHŃ=+t *# *#6fD3{Ktt 11 HfH=0+HD؃=m+t *# *~#Ktt HߺHHLLHHŃ=+t \# R#HT$(LLH$Hl$Ld$Ll$Lt$ H(Ld$H\$IHl$Ll$H(*OH*D-+HHdHH41=n+t 3" 3"CtQ5s+LHHHtH=1+t " "HH\$Hl$Ld$Ll$ H(HfDH l=+t o" e"1=+t5*b" 5*S" lLLHŃ=+t *I" *;"BfDKt% 11HH1 H=+HD؃= +t T*! F*!HL`HHLLHVHŃ=+t ! !HT$(LLH\$Hl$Ld$Ll$ H(ffff.H\$Ld$HHl$Ll$H(HV*IHHw$H\$Hl$HLd$Ll$ H(|@H HFHdH(Ht{1=+t u! u!LHHVHIt^=+t M M LH\$Hl$Ld$Ll$ H(@Ht3 11HHuE1DH l=L+t M M 1='+t5m* 5^* lLHIŃ=+t 5* '*u ,H=|*HD=+t *m *_ HL HHLHHIŃ=h+t M> M3 HT$(H\$Hl$Ld$Ll$ H(ffff.H\$Hl$HHHH *茳HHHl$H\$HsSHH@Hu@HHHPHu0Ht+H*Hu&:HHҸ tH0[fD[HT$Hffff.H*HHHGHwu# lt HH%H81F*u.H;*v%H=wHHH H *H* fHHHWHH)H4*HH HuHǃ-*H)5*H4$H=*IթDH\$Hl$HLd$Ll$ILt$H8HFHHHI$xH9L4IvHHH9H9Is[M9t$X.AD63IL9'IVINL;rHqI9I~HJHHQLH)HvjI lH4+HH HkHLHH HVHL5HCH\$Hl$Ld$ Ll$(Lt$0H81HI lHL H HkJL+HN HMHz 9HV(HHQ(IN IV(HJ &@H42HM H9HuLHT$I1HT$MBIEIML9HHsHH HSIUHVIUHVIUv=HVIUHV IU v(HV( IU(HV0IU0uHF8IE8HF@IE@HLLH 1H{lf1I lƒH)HH HH HCH+ID$XHpHCUfDLXfDHH{L, I=+t A $ A $x=*HS諦1=]+tA4$i A4$\1I뚃=-+t A $V A $J="*LrIA1=+tA4$7 A4$*H{ H9t$HJ IN(HHJ(IN HQ(IN(HQ HR(HR HfDHl$Ld$HH\$Ll$ILt$L|$HHHa*HHWHSHGLoIILHI9SAIHHVA HHHLG l1= +t 3: 3/LLLH Hƒ= +t $ HHHH\$Hl$ Ld$(Ll$0Lt$8L|$@HHLH%Hab*I]M LDHMI!M9ImfH1d vHu*LH\$Hl$ Ld$(Ll$0Lt$8L|$@HH)T18DLHIIWHHL21LHELLLH)1L$LL$/HL$LL$t?L,LM)H)HHI]La*L;b*LS*LN*IGI9L\HHtbIWHHH~L:P=*H;I16HT$HH\$Hl$ Ld$(Ll$0Lt$8L|$@HH1ff.H\$Hl$HHHHY*HV*HHHl$H\$HAUATUSH(H-*HxlkHEuHHH"= +t 2* $*rD%ے*DAA1= +t5*I 5*:1_*IHAHP*HcHKIT HDHH!H)H$*HI$HA*HtL+-[*L1H-*N,+L)HL-*H]H([]A\A]fDL)Iq*uH*Hy*HTH9H(1[]A\A]Ht$1ɺHD$I+H9Iv@IM9A0wIH +DVIxIHhIHHDЃ1?fDDVIG.K1?`Hd HSH1=+t5 * 5*p11xHs lHHƒ=}+t *o *aHtdHFH~HHHHHHH)H9r%H-H9sHH)Hw(و HHHH 1@<H[fH1d fffff.HSHdH8t^1=+t5* 5*=+t * *H[@H=*At[H le1xHs lJHtlHPHpHуHHHHHH)H9r0f.HH9sHH)Hw(و HHH 1@4[AWAVAUIATUSHH8H"HjH@A1D=l+t5* 5*Ht$(LIă=6+t }* o*MLKID$IL{ DIMIIMGHHD$=+t5*Y 5*JIl$@HT$LD$`HT$LD$&HHT$IIGL lHHH=K+t * *HtjHEHuHHHHHHH)H9r+fDH-H9sHH)Hw(و HHHH 1@4H8H[]A\A]A^A_D*M<$HLNt8HMI!LI9uqHhDH1d fDHD$(1111s=@*L;I_1H5HNL1L)LHLL$LT$HLL$LT$t>LLI)L)IILxL5*L;5*L5*+L5*HD$LHI93LL$NLL$Lο lHHHT$LHHuL蜭ATHUHSHH HFHLfI1=+t5/* 5 *11xLH l=HHƒ=+t * *|HtgHFH~HHHHHHH)H9r(H-H9sHH)Hw(و HHHH 1@<[]HA\Hu"fH1d H[]A\1=+t5* 5 *~11xHs lHHƒ=+t * *HNHFH~HHHHHHH)H9r H-H9HH)HwfAWAVAUATUSH8=*H|$(GHD$ lD$$HT$1=+t 2 2H轘*AID$M|$Hl$1AI/MHXID;l$}AucH]H9uXH[H9tGHCHL9vJ<#HL!H)HI9sHƺL!tH[H9ufDAHA{1H|$ l HT$ D$$=*t  HhH= lHD$D$$H8[]A\A]A^A_LHH0w 0D$LH Hwh[D$5h*H*1HXHFH+D$(HHHHhHH~"1L$*IH*L$HI9tb1 LH H w nD$QLHHw wD$8LHP|H~B‰D$$HHs*H*L$HtЋL$1L$Q*HL$cI)ZH*L)L)%*HHX^H:H HĀH=b*HHĀ|H:H_HĀH=(*H@HĀI8H%HĀmI8HzHĀ頙I8HHĀ鲙I8HDHĀH=*H%HĀ龚H=r*H薭HĀH=S*HHĀH=4*HXHĀH=*H詫HĀҥH=*HHĀ钦I?HoHĀ\I?HHĀH=*H5HĀH=*H覬HĀI8HHĀ,I8HHĀخI8HŪHĀ鸱H=*H親HĀñH=*HHĀݱH;HlHĀH;HHĀH=*H2HĀH=*H裫HĀ'I}HHĀƺI}HkHĀ電I}HOHĀI}H裩HĀ:I?HHĀVI?HmHĀuI}HQHĀ陽I}HŪHĀI}H詪HĀ麾I}HHĀھI}HqHĀ I}HŨHĀ-H=*H覨HĀH=*HHĀH=*HHĀH=*H٩HĀ9I}H轩HĀI}HHĀH;H膩HĀH;HۧHĀH;HPHĀH;H襧HĀH;HHĀH;HoHĀH=*HHĀH=*H1HĀ:I>HHĀmI>H苨HĀI>HpHĀH=-*HHĀH=*H2HĀH=*HHĀI>HHĀGI<$HLHĀI<$HHĀ*I<$H褧HĀUH=a*HHĀcH=B*HfHĀxH=#*HGHĀI<$H+HĀH=*H|HĀTH=*HHĀH;HBHĀH;H跦HĀH;H蜦HĀH=Y*HHĀH=:*H^HĀH=*H?HĀcH;H$HĀH;HyHĀ&H;HHĀFH;HӥHĀH=*H$HĀH=q*H蕥HĀH=R*HvHĀH;H[HĀ(H}H诣HĀH}H#HĀH}HHĀFH=*HXHĀTH=*HɤHĀlH=*H誤HĀH}H莤HĀI<$HrHĀlI<$HƢHĀI<$H:HĀI<$H莢HĀH;HsHĀH;HHĀH=*HɣHĀoH=*HHĀH=g*HHĀZH=H*HlHĀH=5*H轡HĀ0H=*H.HĀ5H=*HHĀ6H=*HHĀKH=*HAHĀH=*H貢HĀH=o*HHĀ=H=P*HtHĀeH=1*HŠHĀH=*H6HĀHIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs|fff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<fff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffсHfoIPfo fofofsfs fftftffсXHfokff.ftfufIJfo fsfsfff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffс^HfoIPfo fofofsfs fftftffсHfokff.ftfufIJfo fsfs fff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs| fff.ffofoftfs ftffDAD)U fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs< fff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffсX Hfokff.ftf€ufIJfo fsfs fff.ffofoftfsftffDAD) fofHALWIIfIfo fofofsfsfftftffс^ HfoIPfo fofofsfsfftftffс Hfokff.ftfufIJfo fsfsfff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |fff.ffofoftfsftffDAD)UfofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs <fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсXHfokff.ftfufIJfo fs fs fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffс^HfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs fff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |fff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<fff.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсu\Hfooffffff.ftfufIJfo fsfsftfffID H<H4EtHff.H )1fffff.)ÐH?H?0w?0w:oofftftffс2HHf.HHE19t&wAБHLHI)LϧOc O A@fofftftffDAD) HIfH@fof:cHRvfof:cHRv f.y HL )f.ffofoftfsftffDAD) fofHALWIIHfDIJfof:Df:c HI&fof:Df:c| HfDIfoDfsf:c:w; fffff.ffofoftfsftffDAD)+ fofHALWIIHfDIJfof:Df:c HI&fof:Df:c HfDIfoDfsf:c: w[ fffff.ffofoftfs ftffDAD)K fofHALWIIHIPfof:Df:c HI,fof:Df:c Hfff.IfoDfsf:c: w{ fffff.ffofoftfs ftffDAD)k fofHALWIIHfDIJfof:Df:c HI&fof:Df:c HfDIfoDfsf:c: w fffff.ffofoftfs ftffDAD) fofHALWIIHfDIJfof:Df:c HI&fof:Df:cHfDIfoDfsf:c: wfffff.ffofoftfs ftffDAD)fofHALWIIHfDIJfof:Df:c@HI&fof:Df:cHfDIfoDfsf:c: wfffff.ffofoftfs ftffDAD)fofHALWIIHfDIJfof:Df:c`HI&fof:Df:c<HfDIfoDfsf:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:cHI&fof:Df:c\HfDIfoDfsf:c:wfffff.ffofoftfsftffDAD) fofHA LW IIHfDIJfof:D f:cHI&fof:D f:c|HfDIfoDfs f:c:w;fffff.ffofoftfsftffDAD)+fofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:w[fffff.ffofoftfsftffDAD)KfofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:w{fffff.ffofoftfsftffDAD)kfofHA LW IIHfDIJfof:D f:cHI&fof:D f:cHfDIfoDfs f:c:wfffff.ffofoftfsftffDAD)fofHA LW IIHfDIJfof:D f:c HI&fof:D f:cHfDIfoDfs f:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:c@HI&fof:Df:cHfDIfoDfsf:c:wfffff.ffofoftfsftffDAD)fofHALWIIHfDIJfof:Df:cvdHI*fof:Df:cvDHfffff.IfoDfsf:c:wf:cfff.s=HJ|Et)H<H4EtHDH )1fffff.)ÐH\$Hl$1Ld$1HHtH$Hl$Ld$HH*HHdDet&dDeHl$H$Ld$HHLHH*dDeuH$Hl$Ld$жITJH{H\$Hl$HLd$Ll$HLt$L|$HXxP;=f}HLcJ4JHt;TJHHHl$0H\$(Ld$8Ll$@Lt$HL|$PHXLc޶ITJ݊HIHt$I1L D$I9HLIFHI:I9rHvD+lfDHT$HLL)HL)H9HG?ŐH1?f0woftfЅuzHHHHftH)f!uQfffffft@fЅuCftH fхuFftP0f҅uIftX@fH@@tH)HHffff.H)HHDH)HHD H)HHD0ÐH+H-IӉH?H?0wI0wDfffOfVfftftffсIHHHHE19t&wAБHLHI)LOc O A@fofftftffDAD).NLM9OMFMHIfffff.fo foftftffсIHfo foftftffсIHfDffofoftfsftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсnIHfoWftfu IvfI4f.fo fsfsfff.ffofoftfsftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|fff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsfff.ffofoftfs ftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffсIHfoWftfu I vfI4f.fo fsfs|fff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsfff.ffofoftfs ftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffс IHfoWftfu I vfI4f.fo fsfs| fff.ffofoftfs ftffDAD)U foNLM9r Mi MfHALWIIffffff.Ifo fofofsfs fftftffс I HfoIVfo fofofsfs fftftffсn I HfoWftf€u I vfI4f.fo fsfs fff.ffofoftfsftffDAD) foNLM9 M MfHALWIIffffff.Ifo fofofsfsfftftffс> Ih HfoIVfo fofofsfsfftftffс I HfoWftfu IvfI4f.fo fsfs| fff.ffofoftfsftffDAD)U foNLM9r Mi MfHA LW IIffffff.Ifo fofofs fsfftftffс I HfoIVfo fofofs fsfftftffсn I HfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHA LW IIffffff.Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |fff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIffffff.Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHA LW IIffffff.Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |fff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIffffff.Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs fff.ffofoftfsftffDAD)foNLM9MMfHALWIIffffff.Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|fff.ffofoftfsftffDAD)UfoNLM9rMiMfHALWIIffffff.Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсurIHfo[ff.ftfu IvfI4f.fo fsfsftfffID H<H4EtHff.HI)v  )1f)Ð=ɴ*uH0*tHÐHW IЉHHfftf M\I I MQqIfftFfЅy I JHJTHWHHH1IHI)It1HtLQIILIc I Ik fofHHftfЅ IA fo f HftfЅI fo f HftfЅIfo f HftfЅIfo f HftfЅ\]ffff.1M97Dfo\ftfЅIbf:fHM9fo\ftfЅI)f:fHM9fff.1M9Dfo\ftfЅIf:fHM9ifo\ftfЅSIf:fHM90fff.1M9Dfo\ftfЅIBf: fHM9fo\ftfЅI f: fHM9fff.1M9Dfo\ftfЅlIf: fHM9Ifo\ftfЅ3Iyf: fHM9fff.1M9Dfo\ftfЅI"f: fHM9fo\ftfЅIf: fHM9fff.1M9gDfo\ftfЅLIf: fHM9)fo\ftfЅIYf: fHM9fff.1M9Dfo\ftfЅIf: fHM9fo\ftfЅIf: fHM9`fff.1M9GDfo\ftfЅ,Irf:fHM9 fo\ftfЅI9f:fHM9fff.1M9Dfo\ftfЅIf:fHM9yfo\ftfЅcIf:fHM9@fff.1M9'Dfo\ftfЅ IRf:fHM9fo\ftfЅIf:fHM9fff.1M9Dfo\ftfЅ|If:fHM9Yfo\ftfЅCIf:fHM9 fff.1M9Dfo\ftfЅI2f:fHM9fo\ftfЅIf:fHM9fff.1M9wDfo\ftfЅ\If:fHM99fo\ftfЅ#Iif:fHM9fff.1M9Dfo\ftfЅIf:fHM9fo\ftfЅIf:fHM9vt1M9vkffo\ftfЅuPIf:fHM9v1fo\ftfЅuIvif:fHM9v1LILLHHAIHAI wD HL9uIc I ffffff.1LHHIIHLuIc I fff.Hfff.HHLH1tHLtuHDIuffIuÐfffNfOIufIuVWIjfVWIJfVWI*fHHIffff.HHVW I HHVW I HHVW I HHVW I HHHNHO I fDHHHNHOIFDHHHNHOI&HHHVHWI f.HHHVHWNOIffffff.HHHVHWfNfOIffff.HHHVHWNOIffffff.HHHVHWNOIPffffff.HHHVHWHN HO Iffff.HHHVHWHNHOIffff.HHHVHWHNHOIffff.HHHVHWHNHOIffff.HHHVHWHNHOVWIXHHHVHWHNHOVWI(HHHVHWHNHOVWIHHHVHWHNHOVWIHHHVHWHNHOHVHWIDHHHVHWHNHOHVHWIfDHHHVHWHNHOHVHWI6DHHHVHWHNHOHVHW I DfnHf`Hff`ɃfofpH)foHftftff!!1 u"foHfoftftffˉ tDAu tHDD)AD!tHDÐfnHf`HHf`tDfofpH)ftHf!u"H9vfo7HvftfȅuH9w1HD7HHtH9vÐ= *uH*tH3HHH)II It7IH)It7ItzH9urIt7It^H9uVItHH7It@HH9u7oo7ftf1tCH  )H9t"II)IHHHH)Ð1IIIIt%oo7ftfсaIJ|H_Hto7ftfЁ*HMIL9H t:o7ftfЁHo7ftfЁHMIL9}qo7ftfЁHo7ftfЁHo7ftfЁuxHo7ftfЁu_HI9uMIL9}7o7ftfЁu5Ho7ftfЁuHI9uI)zMfH3MIL9}Htfo7ftfЁuHI9tMIH t6fo7ftfЁuHfo7ftfЁxHI9fo7ftfЁRHfo7ftfЁ5Hfo7ftfЁHfo7ftfЁHI9uMIL9fo7ftfЁHfo7ftfЁHL9uI) M%fAUHH)ATIUHSHHH9HHvfHIՃI)Ht'HHLHHHuH>I,<LHHHLHHHLHtf.HUHHuHL[]A\A]fDHH2H,:HvoHIՃI)Ht(HHHDHHH2@0uH)H)tQLHHHLHH)H)AtLDHHHUuSLHHH6@LHHH=9*uHkDA*tHHHu@7IIHIILLGiC$fHwHHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfHpHxHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWÐHvH~HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWÐHuH}HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWWfffff.HtH|HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfHsH{HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWWffffff.HrHzHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWfffff.HqHyHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWWff.IIIM)ILM)LjC$f.WWHWn@WHWaWUff.WfWHW=WfW1WW"WfWWHW WfWWfHnflILL jC$fPf`fpfGfGfGfGfGfGfGfGfOf_foffGfGfGfGfGfGfGWfNf^fnf~fGfGfGfGfGfGfGfWfMf]fmf}fGfGfGfGfGfGfGfWWfLf\flf|fGfGfGfGfGfGfGWfKf[fkf{fGfGfGfGfGfGfGWWfJfZfjfzfGfGfGfGfGfGfGWfWfIfYfifyfGfGfGfGfGfGfGWfWWfHfXfhfxfGfGfGfGfGfGfGHWfGfWfgfwfGfGfGfGfGfGfGHWWfFfVfffvfGfGfGfGfGfGfGHWfWfEfUfefufGfGfGfGfGfGfGHWfWWfDfTfdftfGfGfGfGfGfGfGHWWfCfSfcfsfGfGfGfGfGfGfGHWWWfBfRfbfrfGfGfGfGfGfGfGHWWfWfAfQfafqfGfGfGfGfGfGfGHWWfWWDD *M9T@M@IffGfG fG0fG@fGPfG`fGpH}LLeC$ItM@IffGfG fG0fG@fGPfG`fGpH}LLXeC$@I swLHtRHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<L_C$fD *M9MGvIsLIHtHHHM)wAJ<Lx_C$@LHteHHHWHWHWHW HW(HW0HW8HW@HWHHWPHWXHW`HWhHWpHWxHuAJ<L^C$ÐH szt HHtfHHt HHtHHHHt#HLFHLGHvHuHÐt)HTHvHuffffff.Hwwt`HLFLNLVHLGLOLWHv H t6HLFLNLVHLGLOLWHv H ufff.HL*I9LGLIHtHfL)HuHLq*I9LGLIHLt$Ll$Ld$H\$=*HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8 @ Hv@H@FHHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@t]HHH^LNLVL^ Lf(Ln0Lv8@HH_LOLWL_ Lg(Lo0Lw8Hv@H@JH\$Ld$Ll$Lt$L)Hu?Hffff.HHLt$Ll$Ld$@@HHLFLNLVL^ Lf(Ln0Lv8HLGLOLWL_ Lg(Lo0Lw8HF@LFHLNPLVXL^`LfhLnpLvxHG@LGHLOPLWXL_`LghLopLwxHHMLd$Ll$Lt$HÐH Hswt HHtfHH@t HHtHHHHt@HLFHLGHvHuHD$t4HTfff.HvHuffffff.Hwwt`HLFLNLVHLGLOLWHv H t6HLFLNLVHLGLOLWHv H ufff.HD$L1*I9LGLIHtHfL)HuHD$@L*I9LGLIHLt$Ll$Ld$H\$؃=*HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@HHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8 @ Hv@H@FHHH^LNLVL^ Lf(Ln0Lv8HH_LOLWL_ Lg(Lo0Lw8Hv@H@t]HHH^LNLVL^ Lf(Ln0Lv8@HH_LOLWL_ Lg(Lo0Lw8Hv@H@JH\$Ld$Ll$Lt$L)Hu?HD$f.HHLt$Ll$Ld$@@HHLFLNLVL^ Lf(Ln0Lv8HLGLOLWL_ Lg(Lo0Lw8HF@LFHLNPLVXL^`LfhLnpLvxHG@LGHLOPLWXL_`LghLopLwxHHMLd$Ll$Lt$HD$ÐHЃ$IHHHHNHHGfHF HO HN(HG(HF0HO0HN8HG8H@HH@HHHNHGHFHOHNHGfDHHHHHHHfDHHtoHfHHH0H8d@HHH(H0D@HHH H($@HHHH @Hff.AHUA@AHSD)HHtQHtHtBLHnHHfHLL^IDLIL H[]ÐH.H^HHILVIDHI LOML^IDHI LOH HtH LH.HDIL HIH^IDIM LOHLVHHHHf.HЃ$@ILFHvH(HHLLI Hp fHqLHLIHpHqLHHMH7HxLAIp8LHLO8LI0Hp0Hq(LH(LI Hp LFH0LNHHLHt?LFH8HvHLH@HLFLNzf.LO8f.LFHHvHHL-DLFHLNHHLDLFHHvHHLDLFH LNHHLDAHѸ@AHAH\$Hl$D)HLd$Ll$%HHt%HtMLNHH.H^IMofH HLNLHnu2IDLHH HGH\$Hl$Ld$Ll$ML$HIYIDMHII L_HMl$HDHH IjLM\$HDHH IZLLHDI)HH HH7IzV{fLNHHLnHIMDLNHL.L^HIM돐=)*uH!*tHXfnHf`Hf`ɃfofpH)ftf!ufoGHftfȅtHÐfnHf`Hf`ɃfofpH)ftfȸ!uf:aOHsHHÐfnHf`Hff`ɃfofpH)foHftftff !u foHfoftftff tHDÐHHHHvpIIDHOEDG$DFHOEDGDFHOEDGDFHOEDGHItH>HHH@9@uIIAI9LGMHHHHII)M9rL9tZL)IIMIMt7fNT1@IHII9fCwLL)L9tHHufHH)HT2HIHHzH?H?0w?0w:fffOfVfftftffсHHHHE19t&wAБHLHI)LXOc O A@fofftftffDAD)^HIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIzfo fofof:ftftffсJHfoI@AA)tAtn@@ ƒ Vv Aaf.@F1ۿu &هމƒun1ۿu هމƒu:fAWAVAAUATUSH(Ll$Ld$D$D$D$ AT$AtjLLƉHLLމHunLLDHuYt$LLHuCD9t$ vAfD0T$ Dw|$HHEDH([]A\A]A^A_ÐH\$Hl$Ld$HWF*t#t.EH$Hl$Ld$Hff%F*uҋ5F*5F*HHHA3DE*DE*Ak1ADȃND9uAAAt1A A rEYfDH[H~H@HH-)HH)HH@HH5)HH)HHEH?IHHIILM~)=wwt uyK4 !x  B*fDAAD ǃiLLH?HIpDrjuAAAAA!Ae5C*HAHf.HC*tt5t 1HÐ|$7daC*|$H5FC*HH鷯SH_(Ht6HG(HG HsH{iH;Hs iH[-@[fffff.SE1HHHL$Hxt1uHt$HvH<$h1H[@H3H$H[H\$Ld$E1Ll$Hl$H8Ld$HHIIL tHt$Hv7H<$NhHfH\$Hl$ Ld$(Ll$0H8H$HsHHE1LHILsubHt$HvgH<$gH$HCHsH;gfH;tM1H{kHWHCfDH$HsHHCu럸#Upg@HAWAVAUATSHHHt `lH{(( HI DC4HAHMII AH1H҃f/HHuH)IDHH)Ll$ILt L HHA HuHLuL}E1LILLqHuHvjH}AfHEI$ID$I<$Ht It$fL*HC(Ik@Ht `lQHe[A\A]A^A_fHEIt$HI$tE1LLILXquHuHH}eHE1HID$]Lc(HC `Bo@I$2/HH/HHEI'KHEH藫fIt$HEfUSHHHdHH(HE(Ht=HHHHH:HKHHHKH@HCtBHCH8t@H[]H JItH=HE(말HH`=(HÐH\$Hl$HLd$Ll$H(@Ai<*~uHۿ(AtH{8LCk8I}(H(@LhH@H@H@ H\$Hl$Ld$Ll$ H(1p1EtHHcd1dfD1ҾT;*%fD( HtA 8fffff.S?1 s2;*tF~e(H@HPH@H@H@ [1Ҿ:*1jyHHcd2d21[( HtӺ eHd1[ÐHSt&[Hd[ÐAU1ATUSHHHdDe= :*t s sHCLk($fDITJHHCHJHK H:uBH;CrHS;LH~HCHC1u2dDe1=y9*tKu<Ku5HH[]A\A]1d}uH{H1HĀEH{HHĀ벐AVIHcNAUATUSH=wXM$IM9s@L@CLsLAlzlH{HPL芚C@kHI9Iw[]A\LA]A^HId␐UHAUATSHL%Y8*MPAD$(tH@8*HJ(uE1 AD$(IID$HtH H\$HL#M$$LkMu9dD %Dd%dL%1M1 8H=(A4H7*HtHd%d%1H H dH%  @H7*HtLaZI4DLxHL@H@DI,I9uHHԿ)H)H)H)H))t%@HHPHtHH[@(Hu="*HeD[A\A]HAddD %HtAHHPHtHH(„tP,td4%Hx(DH[HuHeD[A\A]fD1HcIA<fH׉H=wHDH=vdAdA߸;H=wHdÐfÐUHLeLmIH]LuIL}HIdE<$8PHHH0hH0HLH8H0hH8IH0HD)HH)H\$HHH/POSIX_VHx LHIVf@6_OH@H޿[HdE<$H]H?LeLmHLuL}fDIKH\$Hl$GLd$HXv0"EJT=J+H\$@Hl$HLd$PHX|9HdHDHt$ I11HAtHDiHcHu Hd8tIcHgHt$8H *HT$8H9C /f.$@IIADHHHiIIpf\R H>4*c  @HxH¸Ha_HHw]1m1fD`V,1LH@6 ,2H 4H@@H4HD;fDHt$ HD$ H=HHD$ H= ÐH= ÐH= ÐH= ÐH=m ÐH=M ÐH=- ÐHHtHHH$Huᐐ<H= HwHHָH=wÐHdHdÐwHcHָH=wfHdHdÐH= Ð H= ÐPH= ÐVH= ÐWH= ÐaH=m ÐH\$Hl$HH)*HHt;ն)u1Ht~QHHr9x0HHl$H\$HfD1x H(*@HHHH9rH<+릐H!.*HEÐHH¸I$HÐS11HyH[ÐATUHSHHn`H[I9DH9tx,uB =t2t.,t),H=EHt HXHHDHHu[]HA\Ð[1]HA\fDUHAWAVAUIATSH(F L~LvLfHEȋF$1E%tY< ~< v< @j<\Hu+[< P< H< @<\8HuA$tW< < < f<\Lu+< < < <\HuAtX<  < < <\Lu+< < < <\HuAtR< < < <\Lu%< < < t|<\ftvHuۋEMMLHھILD$Eȉ$1k2x'LoHe[A\A]A^A_Heظ[A\A]A^A_@L]HHH)HL$HH& tK t^\HA?t&IA u\@0@4@0HA?uI \@0@1@1H\@0@1@2HH(]HHH)HL$HH% tK t^\H;t$H u\@0@4@0H;uHafD\@0@1@1H\@0@1@2HL\HHH)HL$HH' tK t^\HA<$t(IA$ u\@0@4@0HA<$uI\@0@1@1H\@0@1@2HL[HHH)HL$HH& tK t^\HA>t&IA u\@0@4@0HA>uI\@0@1@1H\@0@1@2H\@\H\@\Hq\@\Hi\@\HHHtb4HUHH]LeILmHH IZHH HLHH)H\$HHHfcLHHH t t#ttHf  H u1HpHHψVLH?t~\LAuyLA@0@\@1uy3uy4HyuF\HfDHH H' H=HtHI$HuH t tH1҄Hu&  @Hu߉1HXHfH@sLH?tM1@\LAuyLA@0@\@1uy3uy4HyuC\H@HID$u H t tH҉1Hu!.f< 6< fD(Hu߉1HZHfH@sLH?tM1@\LAuyLA@0N@\4@1uy3uy4HyuC\H@HIT$u RH t tH51Hu!.f 8 @+H u߉1HHHfH@qLH;tM2@\LBuZLB0\1uz3uz4HZuA\HHID$IL$$IT$ 1 I+trtvf}x8HBBu$HB=Y"*t  HL[]A\A]A^ID$'KID$'KID$'KAD$ AD$$|H{0H HS0HC2C\HL y@4_@1DIHyA1A2C HC\HLy@4@1hDIHyA1A2KC HHfDA\HLZ41DJHZA1&A2A HF\HL y@4t{@1DIHyA1A2F Hff}ytE1y0HysC Hpy0HyC Hy0HymF Hiz0HZA HHBBtHB=*t ux urE1uA HF HC HC HH:HfHĀH:HHĀ H:HHĀs=)*t *  *r ff.0)t=()fffff.H1=*t5 *C 5 *4  *u%H *̦)1HUD=))Q *1HD$#HD$H趇fDATHUStH=( *҉5 *ttf=X)tlD*EuDHnld+LcdD#=)).A[d+q[]A\@=))u*I/dev/logf*L*H*H*H*H*H*H*H*H~*H{*Hx*Hu*Hr*p*D*E 5)1ҿ!lj)*u*D *Ep1 )f.D1=)=)@ƃ5k)*Znld+idD#=6)0)KA[d+1=)[]A\)@5)1 lj)*H/dev/logf*H-*H*H*H*H*H*H*H|*Hy*Hv*Hs*Hp*Hm*k*tW=*yu5)1lj ) *1Sݢ)Ddf*1ҿnlj)L*ut78*iJHd:hhd;ufDAHI1=*t5*| 5*mDL~1H1HD$wHD$H f.Hl$Ld$Lt$L|$AH\$Ll$HIHT$IHDŽ$HDŽ$dE.a)=Y)H$H$ DEHH!H$>IH1 HHt$HŇHk(Hs0AJHCIH)HHHHk(H=v*HHH W*]H=M*t.HC(H;C0:HHC(H9C0 HHC(AdE.7HT$LDH%H,%H$* taH$H(HT$PHH)HT$X| tHD$`0KHD$hHL$pHt$P1ۿH9HEH$H$HDŽ$1=h*t5^* 5O* 3*=p) *=*t * *H$HD$pH9tnH$H$L$L$L$L$HfDI#1WSfH=ɞ)HH=g*@H$H$@=)pHD- *E=a)|5 *H=*1C)*D%*EH$H$@=)H=*=)*ϝ)u*f1ҾRI1IHH$Ǿ_I1$D5&*H=#*1҃=V)*H$+MIH1DHt$LH>H\$pIout of mIemory [L|$pLt$xLD$\HkgfffLDH))0҈uLH1H)蔂HP]@H$HH)H$::H!xHC( H xH$HH^}HHsHK}ff.HH0HHL$8H cBLD$@LL$HH)H$)y)q)i)a)Y)Q)I)AH$H$D$0HD$HD$ HD$HHHT$0HBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$H$D$0HD$HD$ HD$HH=)HHĀoH=t)HXHĀH=U)H9HĀtH=6)HHĀH=)HHĀ Iʸ H=ZÐ H==Ð H=ÐH=ÐATHIUSHu-[]1A\f.HuHAԅt"HuHHIH.Huf.[H]A\H\$Hl$HLd$HHHAtm1HDH{Ht AT$HHDH{Ht AT$HDHHH$Hl$Ld$HHufHu fHt1D@UHAWAVAUATSHHH}HUHL$HHu1He[A\A]A^A_fL.MtLE1E1E(fDIEI]IHtHAHMH0H}UAHMtOD;etEJ1L+yI]IEAD$HLEIHH)H|$HH븐L IAMAHMLELL9tHIGE/Mt A@,IcHtHHBL9$D@At+AAD@JL@HPLBHHpHBH4HXHtuDCAtjHHHtAujJAA HKDCHJHKHCHHHSHbL<DLIDHXHt7Ct1ZH وHbHHaHHHPHJH뗐HAIMtA@DA@j@HBD@At+AAD@JL@HPLBHHpHBH4HXHDCAHHHt AJAA HKDCHJHKHCHHHSHbMcMyIII?N1AIHtrMLD;euAD$HLLELMEIHH)H|$HkLMHLEfDIcHDHH9xtiL@bfDLGGHXH{CqZH وHbHHaHHHPHJHL@DAW1AVAUATIUSHH(HHT$HHt`H.E11E1E1D$HHuHT$+I$HHHHpHAFHaHHHtaMtgIMy@tYDD$I7EAEAE8R@yN`EHxHHHyHHHpHNIHEHuHLMDt$tH.AIIH T$H4$.HT$H4$HHL9HH@H@t~HHYIHtcHYHtcI${@tOEIuA@A8}@{NaHQHYHSHQHqHVIMfH([]A\A]A^A_ÐHuHEIaNEHAHqHFI]cNHSHsHVH([]A\A]A^A_fH(H[]A\A]A^A_fDHxHHHyHHHpHNIHAHqHF?HQHYHSHQHqHVHSHsHV fH\$Ld$HHl$Ll$ILt$H(HoHt}LmMt-I}HtI}HtHI}LNLmMt0I}HtHI}HtHsI}LH}HIl$HLmMt0I}HtH/I}HtHI}LLmMt~MuMt/I~HtHI~HtHI>LMuMt/I~HtHI~HtHI>LGI}L9H}H+I<$LH$Hl$Ld$Ll$Lt$ H(H\$Hl$HHHHt?HHt)H{HtHH;HHl$H\$HDH\$Hl$HÐUHAWAVAUIATSH8HHu:L`JIHELuL}1HtIHFHuHHHILLLHLmkI9tHHUIH=6)HDHRHe[A\A]A^A_LxLuI@L)HuIH\$LLLmHHWkI9tH5э)hIHe[A\A]A^A_H\$Ld$ILl$Hl$H(H=)HId+~gH)1I4MtLLtH5U)I蓷H=D)d+IH\$Hl$1Ld$Ll$ H(DHy)1I Mt-H=)LL/H )I;H=̌)d+IH\$Hl$1Ld$Ll$ H( ffff.SHHff.HHT$0HBHt$(HL$8HH)H$LD$@LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$5Hffff.H\$Hl$HHH=)H~CH)I1hHHH5)H\$ Hl$HfDHы)1Iu HtH=Q)HHn-H=?)HG(H;G0s HHG(H\$Hl$HH\$Hl$ Hgff.SHHKff.HHT$0H@BHt$(HL$8HH)H$LD$@LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$uHffff.SHHHT$0HBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$ ffff.SHHHT$0HBHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$$D$0HD$HD$ HD$TmAUIATIIUSH HDŽ$ HHtL$ HDŽ$ H HHtE1LLH uQHH$ HcHH?HH$ H H$ HuHd&H []A\A]@IfDIfDH\$Hl$HLd$L|$HLl$Lt$HXL1L* |$LD$IMLM)L\HLD$2HHM9,$LH\$(Hl$0Ld$8Ll$@Lt$HL|$PHXLLH=aHI$|$H+LI$H+I4$H)RLcMM<$ M<$L+LL)L?\HdM9LH)HRHH?HHLH)HD$1@M<$L L[A LI$HI$uOI9uRHT$|$HI,$觲LcMyfDE1I9t M9IFL+L+IM@U HAWAVAUATSH(eIMII IEH)1Ld$IO,,LmLmEt_1LuL}HƿGIu&@0 }MLLLHuHc}He؉[A\A]A^A_1I襹Et0LuL} )I (}LMLLHHuyfAW3IAVAUATUSHHHLt$E1AGIfHHtSxuHpLHuLx LLHtHD$L9t8HA\HuHHD[]A\A]A^A_A䐐)dDÐH\$Hl$HHHt/H.Ht'/HXHt(HHE)HH3)H\$Hl$H@H-!)ڐHH0H'HHNH>HLMLT$8Ht1Hu%Hu'd%d%X_H?IʸH=ÐIʸH=zÐ)H=]ÐdH%HHPHwdH%HHHDH9Ðd%AAA9tdD%uAA tHdH%0d %dH<%{f.u'd%AAdD%uD؃ tdH<%M1Hd4%Hd%ːH)Hd<%tH=)H9uHfAT1IUHSHH=q)t5); 5),lH1fDH00p0uLLHHHp FFHHtMIHhL`(IlH]HU@H)Hd<%tH5)H9uHHHT=)t 0) ")HH[] A\f.H H HT$ 1HHHT$tH)/HH )H=)HHĀH=)HtHĀ\HHH=)1117lHÐSHHàdH;uWuGGuPHGfDuH|$H|$fGDdH;d<%tH)H[G~dH;fSGHt6H)H90tvDGE~ H߾[eDtD?usuCf{DHCu.HfCD[@[f1[ÐUHHH}Eu~6HuB\E~HUHcHH<ÃufD1fff.UHSH^u1;V VtHH[fHcHuHH7HuHV~HHcHH9\ufDH[ÐAWAVAUATUSHt$T$H$H$H1H$HT$r@H$H?vH|$ (H$HD$(HHD$0KIHD$8AH|$@AA(HD$HH$H;EHHHD MIH;H)HH$1HD(IHT$IJD4 E|$JD, .KH)JT4(JD,(Mt$Ml$IH$1JD$ UIH;JD$(IIH4H$|$Ht$ JD4 JD, JH)JT4(DJD,(P9l$~BH;H$H$1pAAAE1NfDH[]A\A]A^A_fDHHHHD QIH+;DH$HHt@HD$0KIHD$8AH$AALf.AAAAUIЉHSHHf?xMLdL%M9Qt21=)t A1 A1LMQAA~KtLH~SCtCtf;Ctx0HBBuHB=;)t uy usH[]DCt뱃ctf;Hx0HBBuHB=)t uD u>HF[I9H跠HĀH:H,HĀrH:HHĀ몐Har)HH)Hff.AUATIUSHHHH)HHH9rFHjH)HuI|HHIEtHHr|HH>HBHHH)HHLdHHH[]A\A]ù`I1ҾI Hw)Z^f.HHHtTdH%H H; I)uHHHt1H;Bs)H5)HHvL)LL9sHHH; 7s1ffff.=)uH)HBH)H)H)H )HH9wAL1HH)L9rHIHt#LLHH)L9sHH|1tHH9vm)ff.AVAAUATE1USHoHLmHE"I}uH}Ht IEHI9rLEu []A\A]A^@H+!p)H []A\A]A^DAWAVAUATUSHHH|$GLwH )E1H5)E1@H1MH9J8H9HXHHHlfHT$H)HHHHJ<2HHHBD2H L(HH $I)\L1HH $H5)HH9HseJ;HH9rtHHEHtHUH@I9LBH[HHHJ2HHHBD0HHH9rH5)II9s HI@M&HD$H[]A\A]A^A_fATH=?)USHvn)HHHH H@@1Hu\u?u2H=)LgHHtLL HHCH[]A\ÐfHtHtHP1H[]A\fDHQfDH{f@,fHffffff.AWAVAUATUSHHHH=)HoHHnLpH(H\$LsH )H5)E1E1H1MH9J8H9HXHHHlf.HT$H)HHHHJ<2HHHBD2H L(HH $I)YL1HH $H5 )HH9HseJ;HH9wtHHEHtHUH@I9LBH[HHHJ2HHHBD0HHH9rH5)II9s HI@M&H\$HH[]A\A]A^A_1L%k)H=L)L,HHtN 1 ALd$Luu@@u{HHttftH=)LgHHt,L HT$H1IHHB:fH$zfhSHHH;:i)H5)u*H@i)HH!uH1 r)[ø[H[dÐAVHAUHATUSL5=)D-)1L%)H-)1HE)L)1Dh)D )Lh)HHw$ŠILw@HHHu@L5)D-g)L%@)H-y)H)LS)D4h)D %)Lh)u) Ѓh)[]A\A]A^@L_HHHLwLGHHH,WDWHAHH,@DoHHHH_HHH3wHHHD3wHHHD3OHHHbD3OHHHBmDHoHHH$OLgHHH/ffffff.H-)H)llHffff.AUATUSH1H H H=)H)ueHH)I'KHIHDÀ8")HIHIHDÀ8)HIHDÀ8){HIHDÀ8)[HH)t 8he)IIHDH)tHIH=Iv'IH1HHXHIr1I蕪H)Ht 8P5IHHHl$11HH~H=HT$H9E11Ʉ.uwHZI1HIH7H=wWHT$H9tM.u8HZI0I1HHM H=wH9\$t I MH=)Ht 7H)H)Ht>H5%)Ht2;QtdHC81@HH8QtdtoHH9rH[]A\A]c)TDHu)AI)B IIM MED%)9COl)H[]A\A]@'I,H+7H HH)H8 fDH8t,HH9uIL+AL;A(sظf.1ffff.AW0O@AVAUATUHSHH(HHT$HL$t sl^GLw)MAlE1IHfH;@H;H@uYIL+H4HH)H8 H8PHH>uLH+~H;~(sHPHUH@HUHP:}HPpHLRHPhHRHT$HDzw:LE1L,1C &HH4HfDHHHRIDBfEuHztRDJAAtCLZMLL9r4fEt LBMu L9t LBML9sHtL;_v D;:w@HtIM9t7HGH@HCIIM91GLH|$tHL$HH|$tHL$HH HRHL$HHMHUc@Ht slXH([]A\A]A^A_HP`H|$HtHRzHkI<:1I9IfII9XAJƃ@wރtEBfEtDIJHI1H9rfEt MBMu H9t MBI40H9sHtH9JsE;:IGIJHzHEHE 1vH_)HHUc )St[9t^)[ԣ19uᐐATUSHHH:uhHł11MQЀ w{UH]0r@ w" HLJr@ v Ȁ.u5t$Hk11FIКy7H[]A\ÃH) []A\H$@H\I貒M~?I?INƄHH\$Hl$Ld$HHHIt %tY=j)f)])H-^)L%)2LHHl$H$Ld$HnfDf)뱐1Sntel#)Genut!E11Ҹ)D ))[ÐineIu؋=))‰ )AA) A))tzzcAMDdAuthXentiLA`)A M)A5)3) 5) AA/vGq )Aиf.ADH IIuH@It =)}z)St l[fD1ntel\)GenuineI=T);)‰ *)AA) A))#cAMDuAuthuentit(E11Ҹ)D ))l[@A)A )Ai)g)t m)AиDAA/vC-)ZADH IIuH@It =)H)H)H\$Hl$HHHH?H6YuHuH{Hl$H\$H:fH\$Hl$HÐH6H?DH\$Hl$HH?Ht?GGu2Ho@HtHdH3,%0HnZHH;zHH\$Hl$Hff.@H\$Hl$Ld$H8HHH)ClrHT$HHwuD$H\$ Hl$(Ld$0H8fD0ClHH,$2HtHH@HHE0ClHH$ HtHH@HHEHH뇃=)bg )Qff.AV1AUATUHSH=)t5)  5) H[IHLdŘYII<$tGAD$AD$u6Mt$@MtIdL34%0LXLAI<$xI$IhMuHHm=s)t J) <)z []A\A]1A^ff.UHHAWAVAUATSHHH}HEHHpH}HEHuHUlCHxLXL`HEHEHE\HHHXH`LhLpKDmL2L)MIDI\Ƙo xHHHPLx H@(HC0HS(L{8HC@Mt5IdL3<%0LeWHAHC0HtdH3%0HHC0HhMt$CIPSuH{HnL{81He؉[A\A]A^A_Hx]H@HxH\$HH;k H@HCHpLd$CCHCHC IHC(HI$! ID$(ID$HAD$AD$ID$ID$ Lc(I(HhLPE1EAL}IA_D9GA9BL5)Mt2M'DMv0MtI6LTt/}Mv Mu@M(UDMIUADL}@MfA$:uAD$:uH}mLeA^HMLHuDyE~][H}tHuL@D;mD9mD;}HhDH[(HH3LhuE;CHEHhLsHC DHFHt0HV XHHBHt@HR XHHBHu^NHv(HuH}HMufDHI(Ht:AHQ HYBCRASA9ʼnQu9}HI(HɐufDMv(MHMUAŋYiHUA^LeDzE~]fH]HufH[(HH3L@uC;E9EEDA9xD;}} D9iMv(UDMbL}M(ML}MIG(HtAW9PvHxHpHExIG 1H}1HtH@ HHuH[Hf.ɉH9HHH9HzI9HHHH(fwHT$8D$4HHfD|$4:|$4uT$tJI1H9v*Hl$ H18Hu H@|HH9Iw)HT$ HB D$4D$4HĈ[]A\A]A^A_HHD$4HHD$4IHl$p1H9t@tH7LHt$"@HHH9rHrI9rHHHH(fvH9ÉMuOD$4PLHt$)HHH9RHrI92HHHH(fvH9ÉMuHH)HH9rvIvD$4I9Hl$pDHDDHH9vHvD$p(f&AIHcHt$ 'NH)IHDIH9R HHHt$HH.>L$4Ht$@HD$hH*HH)žHHH?HI)HT$ HB HBD$4H|$(!,$,$E1LL$@11H|$Pt$Ht$XT$(D$4HT$HL2LHt$D$4LHt$D$4|H|$8ttHD$8HD$4GAWHGhAVIHH8AUATUHSHHD$HFHt$LD$@LL$8$HT$PHD$ u'LL$HHhMI(LL$ tIdL3 %0LL$ 1H|$@HT$L:H|$8HD$XHT$hHDT$X$LL$HD$hMiHT$XMLT$LH9HL$0UIwI9"ALHD$AD$,f.HsI9HxHHH9uHH|$@IHT$Lb0Mt7fDI|$Ht*I|$ILIHt$AT$Md$ MuHL$AAI9LT$H|$ IHD$`)D$E1$LL$8HHT$`Ht$PH|$HD\$T$ tJH9\$`yHL$ML9ALH9LL$HL$0HLD$,|$,tƒ|$,$MLT$L\$AD)IR >n H\$HH9Iv(HI? H9uHL$H)ٍLk 2BD$,D$,HĈ[]A\A]A^A_Í>с" AJ<AH9s!DA?ID M9FEAAĀtM9H|$XELT$XLD$,IzD$,uL\$I[ MAHcD>ILL$LLL$p{DD$pHH9v?AAȀEHwHT$@|$pDH)HH9M_D$,M9HT$p>@< HHw HH9wt$pL LRA7D$,I9HcI)MLLT$H)IABML\$LIHT$HAAItAAEc(QD$,D$pHT$pI.H >AA)ЃDHH9*H? LT$IB HABD$,6H|$ %D$$E1LL$811Ht$PH|$HD\$T$ D$,HL$@L9vHD$LD$,HD$@HkD lj;CD$,ƁLL$8HD$hHI>AL M9D :EAAĀA?HD H9wHtADAEt(H|$XtptlHL$XL:MD$,Hnu_H9w놉u!4D$,oHrHIH)L9sHtM97Hc LDH))D$,H)ID$p+>HI9v[:H? uA TkA-k 3CtD$,|$,`HT$HL$B"HL$HT$LLd$`Ht$0DAIA,LOM9LL$LN(H|$LH9uHl$0ƁRHPH9Hv8 Hu&Iсu&AH9D$,сuUAuUDuUAсuUA.uhuhAME1IJH9#IB€tuCg1HH :I9IH? :t+$I9Ht$0L\$0I9MHT$j>AN L9DD\$0AAÀD\$0HA?D I9wIt AAEt(SH|$XKEBLT$XHI7ƁHVH9I HH؉сu Aсu0AI9? сuAсuA1HHH9H€tAWHIHHhAVH8AUATIUSH^H|$hHt$0LD$HLL$@D$HD$PHT$XHD$8u"HhH@(HD$8tHdH3%0HD$8EH|$H3HT$0HHT$(HD$0H|$@HD$`HDŽ$LpH$HDD$`$HD$`tHT$0Lj AUfIHL$(AAHT$ HT$xH$NHBI9;H$I9 HH$HD$xHT$xI9uH$LH|$HI$HD$0Lh0Mt4DI}HtI}IHL$(IHt$ AUMm MuHT$0BBH9\$(sfHT$0H|$8HH$$E1$LL$@H$Ht$XH|$PL$HT$8At/H9$Du#HT$0HL$0HYHT$(tt݃uR$tHI1I9v+H|$0H10H_ H@t HI9IwD)HT$0HB HĨ[]A\A]A^A_Åt9t+tHHH< I9r*@3H$H?ʀH wH$HD$(IH$HD$xH$1H9sATHAUHH)HI9L9t$(L$HH$AHI9vHvދ$IL$HD$ HT$(H@2HHD$xH$1HPHH$L93IcEL)HL$xAeHL$(H)HD$0IXlH$IDM'I9# HH$HH|$`HD$0HX0HH;HL$`H$HSMLD$xHt$0H$H|$hHL$Iu\H[ HL$01HA HAH|$8D$D,$E1LL$@11Ht$XH|$PD$T$8YHT$xH$EHT$xH$HL$HHHL$HH HL$(HT$0HD$ L$HL$(Ht$ jIHD$xDHL$pMAƒ8HFI9HT$pI9w/HHT$pHD$xHt$xI9uELd$ s# t HHuH I9r0@2HD$pH?ɀH w{EHt$ HL$(H;L$pHT$ IpHD$0DhbH|$`tHD$0HX0HtfH;DT$xHL$`HD$pHSMLD$xHt$0H$H|$hHL$IDT$uH[ 밃HL$xEHL$ [uHT$xEHT$ EHD$`HD$xH)HD$0XG t HHuHT$(HI9HL$(HD$xHL$(H?ʀHw@1HL$ H)HAMH˃H)IT$ ) AUH9D$ mHAUH$IHL$@H$HHHT$`HD$xHH|$`HD$0LALP0LHteH;L\$HL$`HD$xHSLL$ L$Ht$0H$H|$hHL$IL\$uH[ IH$H DIuH$HH$HT$`HHPHH$AWHIHHhAVH8AUATIUSH^H|$hHt$(LD$HLL$@D$HD$PHT$XHD$0u'HT$PHhHR(HT$0tHdH3%0HT$0EH|$HHT$(HHT$ H|$@HD$`H$HDD$`$HT$(HDŽ$LrHD$`tLj AUfMHT$ AAH\$ HT$xLL$I9tHfHJI9I9PH$HH$H\$xI9uLH|$HIHD$(Lh0MtGLt$8ALI}HtJI}IHL$ IHAUMm MuDLt$8HT$(BB(H9\$ s\HT$(H|$0HHD$x$E1$LL$@HHT$xHt$XH|$PD$T$0t.HT$xH9Ņu#HT$(HD$(HXHT$ tt݃uR$tHI1I9v+H|$(H10H_ H@t HI9IwD)HT$(HB HĨ[]A\A]A^A_ý=H|$`HD$(Hh0HH\$` Hm HnH}LT$HD$xHUMH\$L$IH$Ht$(H|$hULT$twH\$xH$HD$ IH$H$HL$x1H9sATHAUHH)HI9bL9t$ L$HHL$xAHI9vHvIL\$xHD$8$HT$ 1HHH$HD$xHHD$xL96IcUL)AeH)HT$(IH$ZHD$ `H$H\$xEt!HD$`HH$HH$H$HʉxH$H\$xnHT$HHHHT$@H$HJHD$HHHD$ cH)HIHT$(1HB HBgH|$0$D,$E1LL$@11Ht$XH|$PD$T$0-#HD$(X;=H|$`HT$(LALR0LHH;L\$HD$`HSLD$xLL$8IHt$(H|$hHD$H$H$L\$u0H[ HT$xIDM'I9j HHT$xHIHD$xDIuHD$xIC1HD$xHD$xHT$`HHHD$xHT$8AMH)HHʃH)ЋT$8IHD$x) AUH9D$8HAUHD$xIffff.AWIHH8HGhAVAUATUHSHxHT$XVHt$ LD$HLL$8$HD$PHD$(u'HD$PHhH@(HD$(tHdH3%0HD$(<H|$HH\$ L3H|$8HD$@HD$hHDD$@H\$ HD$hLkHD$@IH9HD$\IFI9yZH|$@HT$L@HHI9HH +HH9Չ uD$4HHH|$HI"HT$ Lb0Mt2I|$Hta I|$ILIHt$AT$Md$ MuHD$ @@L9HT$ H|$(HHD$` $E1H$LL$8HT$`Ht$XH|$PD$T$(HD$`H9HD$ L0PIH9HD$HLD$4@H|$@HL$LD$4H*fD҉HH9HXHI9rHHHQyH\$@HHD$4H|$4RD$4Hx[]A\A]A^A_HD$4\HT$LHHI9rHH xKHH9Չ uHT$LDHHI9rHH xHH9Չ uD$4HT$LD$4HD$HHCHT$8HHD$hH.H)HػHH?HI)[L$4HT$ HB HBD$4H|$( $$E1LL$811Ht$XH|$PD$T$(D$4HD$HL0nff.AWHGhIAVIHV8AUATUSHHT$`VHL$LD$HLL$@$HD$XHD$8u"HhH@(HD$8tHdH3%0HD$8H|$HM/IGH|$@HD$PHD$xHD$hHD$xHDD$P$HD$PtIG 0@@M&HD$hLHL$L)L)H9HOHpHHILHHt93H|$P!1DH HHH9wH9D$ID$ D$t#HH9D$҃H9D$T$ D$H|$HIo0Ht.@H}HtH}ILILUHm HuAGAG4L9IH|$8HD$p$E1$LL$@HHT$pHt$`H|$XD$T$8tfHT$pH9M/AW@H|$PL1AHHH9wI@|$t|$ tP$tFI1H9T$v)H10I_ H@t HH9D$IwL$)IG D$ D$HĈ[]A\A]A^A_L1Lx#fDH HHH9yLD$ D$=LL1fDxH HHH9wHIH9L$v&Hw:9H@|HIHw!H9L$wHwD$ މ0(xPAUPAUPAUPAUI AWHT$PHlHT$@HD$xIHtH)I HT$HHD$D$ KIG HAGD$H|$84$$E1LL$@1Ht$`H|$XT$1T$8D$IHD$HL(D$+,AWHIHHhAVH8AUATIUSH^H|$hHt$0LD$HLL$@D$HD$PHT$XHD$8u"HhH@(HD$8tHdH3%0HD$8EH|$H2HT$0HHT$ HD$0H|$@HD$`HDŽ$LpH$HDD$`$HD$`tHT$0Lj AUfIHL$ AAI9HT$(H$HL$xHt^fHrI9HKI9Y=(ffHL$xH$HHI9uLH|$HI9HD$0Lh0Mt3@I}Ht"I}IHL$ IHt$(AUMm MuHT$0BBWH9\$ s\HT$0H|$8HHD$x$E1$LL$@HT$xHt$XH|$PL$HT$8t.HT$xH9Ņu#HD$0HT$0HZHD$ tt݃uR$tHI1I9v+H|$0H10H_ H@t HI9IwD)HT$0HB HĨ[]A\A]A^A_H|$`t E=H|$`tHD$0Hh0HH\$` Hm HH}HL$xHUMH\$L$Ht$0H $H|$hIUtH\$xH$HT$`H$HHHD$ IH$H$HL$x1H9sATHAUHH)HI9HT$ HI9L$1HHL$xA4HI9vHvILT$xHD$($=({HL$ H$ffIB1HD$xL95IcUL)AeH)HT$0IH$ZHD$ "H$H\$xEt5HD$`HH$HvH$HbH$XH$H\$xFHL$@H$HHH)HIHL$01HA HAIH|$8K$D,$E1LL$@11Ht$XH|$PD$T$8HL$HH HL$ HL$HHHD$0XH|$`JAHL$`IB1HD$xHv=]H|$`HT$0LALZ0LHH;LT$nHL$`H$HSLL$(LD$xHt$0H$H|$hHL$ILT$u0H[ HT$xIDM'L9 HHT$xHIHD$xDIuiHD$xHL$(H)HAMHʃH)ЋT$(IHD$x) AUH9D$(HAUHD$xI߽rHD$xHT$`HHHD$x#ffff.AWIHH8HGhAVAUATUHSHHT$XVHt$ LD$HLL$@$HD$PHD$(u'HD$PHhH@(HD$(tHdH3%0HD$(H|$H:H\$ L3H|$@HD$8HD$hHDD$8$H\$ HD$hLkHD$8tHs IH9H\$HHH9IFI9*H|$8HLHt$)fHJH9eHCI9@HHf(fɉ HH9uD$7D$0H|$HIHD$ L`0Mt2I|$HtI|$ILIHt$AT$Md$ MuHT$ BB I9&HT$ H|$(HHD$`<$E1H$LL$@HT$`Ht$XH|$PD$T$(HD$`H9IHD$ H9L0PH\$wLHD$7D$0H|$8LHT$0f.HNH9HPI9HHHH f(fH9 uHHrD|$0B|$7tT$tJI1H9v*H|$ H10H_ H@t HH9Iw)HT$ HB D$0D$0HĈ[]A\A]A^A_HHD$7D$0HHD$7D$0IH|$p1H9s"\HD$7D$0HH)HH9@I^D$0I9^H|$pDHDHH9vHvD$pf(fAIHcH\$ &H)ЋSI\LHT$(fHNH9HPI9HHHH f(fH9 u+LHT$/fHNH9HPI9HHHH f(fH9 uHD$8H5HDI/H9HHHT$ HB HBD$0H|$($$E1LL$@11Ht$XH|$PD$T$(D$0HD$HL0LHT$D$7D$0L$0D$7#HH\$@HD$hHH)HػHH?HI)+HT$HH?LHT$D$7D$09H|$8ttHD$8HD$0ffffff.AWHGhIAVIHV8AUATUSHHD$`FHL$@LD$PLL$H$HT$hHD$8u'HT$`HhHR(HT$8tHdH3%0HT$8H|$PM/IWH|$HHD$XHD$xHT$0HT$xHDT$X$HT$XtIW 2@M&HT$0LHL$@L)L)H9HOHrHHILHHt;4H|$X 1fDȅxHHHH9wH9T$@ID$ D$t#HCH9D$0҃H9D$0T$ D$H|$PIo0Ht,fH}HtH}ILILUHm HuAGAG7L9IH|$8HD$p$E1$LL$HHHT$pHt$hH|$`D$T$8tfHT$pH9yM/AG@H|$XL1AȅHHH9wIf|$t|$ tP$tFI1H9T$@v)H10I_ H@t HH9D$@IwL$@)IG D$ D$HĈ[]A\A]A^A_LL1@ȅ/HHHH9wLL1@ȅHHHH9wHIH9L$@v&HwO9H@|HIHw6H9L$@wHw)D$ މ2:ID$ D$zBAEBAEBAEBAEI"AGHD$XHkHT$HHD$xIHqH)IHT$PHHT$PL*BLD$ D$)IG HAGD$pH|$88$$E1LL$H11Ht$hH|$`D$T$8D$5D$D$ %D$H)HIDAWHGhIAVIHV8AUATUSHFHL$@LD$PLL$h$HD$XHT$`HD$Hu"HhH@(HD$HtHdH3%0HD$HH|$PI/IWHT$8$IO uHIH9T$@v.H&2H@tHIH H9T$@wHD$ ÉD$HĈ[]A\A]A^A_L,K,Nl-H9D$@ID$ D$t#IEH9D$8҃H9D$8T$ D$H|$PI_0Ht/DH{HtBH{MHILSH[ HuAGAGgL9IH|$HHD$x$E1$LL$hLHT$xHt$`H|$XD$T$HtvHT$xL9 I/M&HD$8IHT$@H)L)H9HOHHHHI1LHHAȉDHH9w|$t|$ s$dI611H9t$@Hv&H|$@IO H\HH9IwL$@)IG D$ AEAEAEAEH! L)IM/^D$D$ MHT$PL*HD$PH(3IG HAGD$H|$HT$$E1LL$h1Ht$`H|$XT$1T$HD$XAWHGhIAVAUATUSHHV8HFHL$@LD$PLL$h$HD$XHT$`HD$Hu"HhH@(HD$HtHdH3%0HD$HH|$PM/$IWHT$8tIO 1@DL#HD$8LHT$@L)LL)H9HOHPHHIHIHUIHD$@H;D$ D$t#IFH9D$8҃H9D$8T$ D$H|$PIo0Ht-H}HtH}MLHLUHm HuAGAGjM9spIH|$HHD$x$E1$LL$hLHT$xHt$`H|$XD$T$Ht"HT$xL9M/@|$t|$ tT$tIH;11H9|$@Hv'Hl$@0IO H@tHH9HwL$@)IG D$ D$HĈ[]A\A]A^A_HHH9T$@v&Hw7:H@|HHHwH9T$@wHwD$ Ɖ1AAEAAEAAEAAEI!L)HM7D$D$ HT$PL2@HD$PL(pIG HAGD$H|$H$,$E1LL$h1Ht$`H|$XT$1T$HD$H`)H=`)tVfffff.UHH]LeHLmLuIL}H@ILHEڜHULpLIDHH)Ld$ILBLLHLl HHHtlHBLb HCHC0HC`HC(HB(Lc8HC@1Mt5IdL3$%0LHAHS0HtdH3%0HHS0H]LeLmLuL}f.H\$Hl$EIHzHHj)tH$H$HĨ11PI'$tHƿ8Ht$0HE11AعH5_)UHH_)HcH=^)?$ upWH^)H9s`WH9vWOftNHH9rBW H9v9W H9r01H=^)SH^)Hc=z^)tsSi^)HN^)H=G^)BEHH0^)tH/^)1H4(H)HsH^)HH9sH])H5])T])AWAVAUATUSHHxH])H|$0HT$XHL$HDD$THD$(H|$(~HT$(HJ DrDjIfL$fInHD$(1Lt$H\$ MD`AAt$H J])Dd$HL$@1DzHT$(B)L$HE?AuHI46HT$HHHHHOHA|$H@HI<>HTA$HBIBHB`IHB ?AD$ILA>HL$H1Hf.Hx[]A\A]A^A_ÐAL$Lt$HTIHL$ HL$(A HH;D$@vHx[]A\A]A^A_L=Z)H|$0AGEgIO$'HD$kAo1҉Lt$huH Z)l$HL$@1AG)AՉL$*IHT$IW ?Bt LI46A$Ih9|1#A|$HI<>ѧA}HI<>軧eHD$0ND$tHHNDH9\$ 1HL$(Q LdL%X)A$f6ЃHcHkBT"H9vH@MdDB| LI<>HL$(H\$HMf.AWAVAUATIUSH8H X)Ht$HT$ HDqDiH $N41N,)%iH $1҉i}1ADzHW))‰T$AIL1ftA9D$v#LT$I46H $xT$H $t=DDD)9w)fHt$LxHT$ 1H8[]A\A]A^A_IH|$fL$.H +W)DqDiH $N41N,)HhH $1҉i}1ADzHV))‰T$B;fDIL1f]9D$v%H|$T$I46H $wT$H $tDDD)9w)@QD$.)HT$ H81[]A\A]A^A_ÐSHu7H;hV)t>CPw!CuH{Ht HC[Åt[f.k[f.H=V)H=V)ЋCNUC@lSHH|$H|$LHtMtA>u=I;JMcI;JJ`I@HLeH]LmLuL}L_(.;JLJitYJL9itHu!LD=HHuM7A IL>HIL1HLMcHHAHHH)H|$7HHMHUHuLMLEHJAHEE)INlLMLELDHHD$HELI IL]D$ LT$LUHD$HEH$DHHLUL]AzLj1MH}I}LH}HtI hu AE4LAE0FLAE07HIaHIt8u9Ic)IHǠIcaHIt8uOILaIIIDHUHUJ&1Hp (HIt\HpH~FIIHLDH(L0zHH(L0HNH)H8dA>E1Dž8IcfH31HHHHQIcD6IAHD$HH))ILd$IHILH8/SYS@_HxH8IVX1L1ALƿADž8E1UHAWAVAUATSHHHL%@)MuT@LH`tM$$Mt8Ml$I9uHL(HcIDHe[A\A]A^A_f.H{`HtL`@<@tH=r?)OHu?)HHHH({Ht14HH9wHɉALE1ҋGOA̓HHLILH1HHJLIIHvL<HLtfDMM9IIA6IVAFL9uՉHHHHL'_HHLuBCHD W>)H1 tHcЋt\D3E9HHۃ HH~xg$HIHH8%HIEiHx>)A1IEL-e>) AtLcLHHH3HKDtIU@@0HA ~IEHHHcIDgLL)1DHe1[A\A]A^A_þ@LzILHM)L4HItLLH|yu C|5H1LHHHHLHLH)LIIIIDHH)L|$ILLLLHL謲HLHL011@IH <)l]Alƿ(L-H<)E11EL1HHP@Hk HHJ$R HklHHH9HL‹QQH9HLI9r3IcHD-n;)H5[;)L/1LH1Ic1cH (HưHJ@HB@HH T(HPHHJ(H@HdH>vlH9(tDHdHHdHHdHÐHdH8t dH%H¨dHHHRXHdHfHdH8t dH%H¨dHHHRHHdHfHdH8t dH%H¨dHHHR@HdHאAE111Hl$HH\$Ld$HEHt t[1HHl$H$Ld$HH}HIċEtqMtH}H1}HDH}HdHЃHHlEkH}H18HdDMtPf=E4)H]"H}HHE $hJ1I91I91I91I91I9LH)J!L1HHL1HHHIw1I9jUHSHHv8HH{ tYH} H}8t>Xu'H3H}qXuHsH}`XuE+CH[]H}8f.Hs8f.UHAWAVAUATISHD_H}HuMLxEHEHXHH{`Dk(LrLEGDKX1҉DShAAqA1EuEȉA)D)LeHK`AEHuf.{=DHHC00;urSH3N@ȉH}HƉHHXDPWHHXDPCA4E9ADBDD@ȉHbDHHC00fDDHHC00뷐@@DLeDpHEI1H]IM9HUDBL*HZ0EuQM9M|O4'H}IBtIt5SxօMfM9MSx뺋{Ht>HEHHC8HȉɃL4 HEfDHEHHC8DpN42HEfD 63)H+3)HHEHdHHHHE~DmHpE1LuDpH]HMpg@Ht H_HKxHHMjH{pHIH`IDlH]HpL|IMI?HIQuDlH`Mk@HVHeE=$9)t52) 52)H1)Lu1H 1)LmL}HHEpH=2)iHcH51)!*HH1)HH 1)HHPH1)HHn1)HEHH W1)HvHUHULDI|$HuMLLuRH0)mHt.HQ1)YH=91)HH/1)j$H0)H0)=7)t 0) 0) IJIHIt 8g0)4=_7)t N0) @0)~ E1HUH0)HuHH)HHIL$HH)H/)HHHUH/)H/)=6)t /)4 /)& ID$HDlH`HuHpHHk(HIAH}HCpHHE'HkEHuH}LE1ɺ'KII4$HuID$HϩJHbNHPHp   1f t t t HLuHBHHH)L|$IL1HEf/HHuH+EH)HH)HELD$ILt+HuH HHHuH1L@/HHuL)AH!HH)Ht$HHt H HIAHuHIT$LhID$HCx>H1LHHHHHHHIHHt LHL=I-)HspHp/HHHTRANSLIT/HPH /HH=/H1t'k@Ht HH}E1W -ID$I=3)t5,) 5~,)I|$tY=q3)t `,) R,)ID$uk@HtHI`1OD{@ HID$ID${AUATIUSHN$#HLoII;HŸHHCfDHt+1HJHxL9rHH[]A\A]fHHH[]A\A]ffffff.UHAWAVAUATSHHHXHxH8TLHDdA >A4d@Ht`llHXdHXHD(HxHEωMHUHXHEsHIHeHPHLHH)H|$HHH0HEt l^H}ClH@k@Ht l`H@tH@HP;3)wHL-w3)dM퉅HX@1MmMIuHIIuMIUHp:/H׻BdL` @Hd8"wHHH\ JD#HHHH)dLt$ILnHtI]1LLpLHHxf/H+HHcdةJD)IZBHIĠIHt 8 dHHXxcLH(icH(LHD#HH)HL$HHHhGf/H(HxHX话H.mocHHH)Ld$ID<:LA$CAD$A$:1uAD$:z1LYJHhHpLLHItHxLEȹLHHfHHSH@IiH@H0)PHULx Lp(HP0DTHEdk@Ht`lclYLxfHxHe[A\A]A^A_f.k@Ht`llHd DTEtHHtH8Hx@tHH<:uD5(EY/L+FHC<:"HI HH E1HxAIcI| Ht-LEȹHL[HtMcH O| 4H d:-/P:/HDE1HDžpJDTEu.HX(k@Ht`l袬l蘬HxE1L$,L$h E1D$,D$lE1LBHL$HHTH1LLLH<HHHT$HHt$PHHËD$,L$D$l1T$,T$h^E1L$,L$d*E1D$,D$XE1L=HL$HHTH1LLLH<HHHT$HHt$PH|Ht$H:HEHD$HH|/Ht$0H!Dd$lEaD\$hE3DT$dEDL$XEHx/LE1!HT$8H*H\@H}HtH!~IHmHuD$E[H|$PHt$HCT$,L$,⪪UU ʁ33ʉѺHcHH<(8HHIHt$HH|$PHCHXMAVIFWID$IFMt$Ht$HH|$PBDl$,AHDEl$,D$,E1ED$,HD$PHD$HHl$XHfADl$,u1H|$HtH@H9s1H! HXH9vHtH;H$HPLL$@H$LD$0HH|$8L|$HL$H$HD$H $D*KD IHuH\$PDHl$XKD HxH[]A\A]A^A_H$;Lpf.H$:Lhf.H$:L`f.H|$@:Hh^DHpi1}@H$Hx.H$Hx.H$Hx_Ht$@Hxgf.D$,1҃HL$8HIFL1IATUSH HHIIH><_<@<.HfDt<@ft<.t H<_uH9߉t1<@tN1<_@!@.t[@@t3HHt 8DIHt 8DH []A\fHCH{EH{I8s@@$@Hu t H<@uH9mHHT$HL$H)L$LL$bLL$HIHT$HL$L$II8HHT$HL$L$HT$HL$L$3fDHH<.u<@tTH<.tu@1HT$HL$L$1AHT$H0HL$L$wƽkHcLt3HT$HL$L$EiATHUSHhtHttmH[]A\#HoHt&EHHkHt&E HHkHtEtOtqHH[]A\I|$.I|$$I|$LbLeMt'A$L2LeMtA$t*tt*LffI|$I|$I|$L2DH}wH}nLeMA$tZtKtZLHfI|$&I|$I|$#DI|$I|$I|$H}H}H}LeMA$xez@g[]A\AVAUIATAAUSx9IcL4HHTDMuzf.H HHtdy EHHt8Eix%IcITHAHAH\tIc1[]A\A]A^ExIcMtI\(ft;t+LAxL3HMtAuI~I~I~wDUE1AHAWADAVAAUATLSH MH8HHDžJFfD MIH9I'IM'I)􉍨DII'LLGI\$KHHD%HH)Ll$ILO|uqLHLK\eLqMFDKDEH9O$McC J=tC>w HcJ45wHc6J9C JLcʸG @JD)Ѓ HI@McJML)I)LMd$HBC `JHzJ475D~JHMLQD6JAA=u fL9tkHIHJ=t5wHfJuDJA|DtAHIDžI$SfHe[A\A]A^A_@AkDDž$@JHcf;6JD6JIT$I$At$HUHUHELLDLLD2fHH2@uc@H2@tS@ t@ t@|@HzHHHn11|bH1H1W AIHɸEII$@$JI$HUHE11111LLD`HLLDI$HPID$IT$I$HUHEHU?IT$I$HUHEHUIT$It$I$HuHUHEHUI$HSHHVCDHK98HW7HH!HH?=uHH!HWH 1?=uHH!HH HH!HHHH!HHcHH!HH=?=,HH!HWH  ?=HH!HHQHcҍq@ w!HH40HcHrq@ vHHHH!HHqR1KHH!HWH 9HH!HWH AUATIUHSHH(HJJHIHMHX @ ttHHdHdH9@HtMHtnDJ u0< w7Ht$ HH;\$tIHEHL,$t!fDI$JHEH([]A\A]HD$I$HHP@HdHx1'@HHHt H1HH1HuÐ|$D$f?f% f|$l$ÐHHdH3%0HHGLgLoLw L(HT$dH3%0HHW0H$dH3%0HHG8 SHu11S@[HWH11uډS@1[ÐAWAVAUMATUSHHhHH|$PHT$KHHHT$XJHHD$PHT$`Ht$L|$HHD$`HD$ HD$HHD$hHT$Ht$PIHL$@Ht$HHt$8Ht$HHt$(HH)Ht$HD$0HD$8H+D$ 1Ht$Ld$ LHt$ HHD$ILӅyLLH|$8ӅLt$ Hl$8Lt$LfDLLLӅy @LLHLӅxI9-H|$HL IFH9rH|$HL$(11fAoHoLfA fDHH9wHt$H9t$HT$HD$HL$0IHDt!28@:H@0HHuM9(I9MDLt$LI9HH+D$ H9D$XpHD$8Lt$ L)H9D$Xr!Hl$@HD$@HT$@HHRHD$ HT$8HL$H9L$@A$Hh[]A\A]A^A_HHt$HHt$HLd$PLd$XL;d$HL|$PLGd$HL|$Ht$M9M47Hl$PML|$MIHHLLAՅIHIM9sH;l$PLHD$ML|$M4H%HD$PH HEH9D$PHL$HHHH0H|$P11oDHo fLfHH9wHL$HT$HHD$PH)M4HH9t$M0@uHHHuHt$M47Hl$HHMHL$L;t$HMM$.@ILLLӅxLd$M9?Lt$IvI9wH|$I<>I9DHHHv @HH(HI9vHHHDI9vl@Lt$Nt5LHH+D$ H9D$XHT$8L)H9T$XH9~}HL$@Ht$ Lt$ H1HiHHL$@Lt$4HEI9HL$HLD0:@8H@2HHuM9IHD$@HT$8L0HPHHD$@Hl$8 HT$I|H|$\HD$ L LID$H9D$ *H|$HL$ Ht$(11AoHo fA fHH9wHD$ Ht$HD$H9t$HT$HL$0I28@:H@0HHuH|$Mt$@@bHD$8L RL9t$85H|$GHL$8Ht$(11AoHo fA fHH9wHD$8Ht$HD$H9t$HT$HL$0It28@:H@0HHuLHt$ LӅ)HD$ L #@L9t$ H|$HL$ 11AoHo fA fHH9T$(wHD$ Ht$HD$H9t$HT$HL$0I28@:H@0HHuHD$8HI9HT$8HL$L0:@8H@2HHuHD$ HI9HT$ HL$L0:@8H@2HHuHD$ HI9HT$ HL$L0:@8H@2HHuHD$PHH9HD$PHT$M0@uHHHuHD$M4QHLHL$UHD$PHT$HD$8LHL$HD$ LHL$7HD$ LHL$H\$Ld$L|$Hl$ILl$Lt$H8&!HG(IHu'1H\$Hl$Ld$Ll$ Lt$(L|$0H8fA?tAtSH+E/ILpHtfD;muH}LL!uB|%=tfHH+HuHAHiҀ=f;u #f;tHHHuCf.H2JD5!H1=n(t5L(d 5=(UH= (H;=9(t?H (=-(t (C (51HfHtH(fAUATUSHHH?=oHHVH1=(t5s( 5d(L-G(Mt/MeMt&HHLuA<,=tHIMeMuڃ=4(t ( (zH1[]A\A]f.LDHHHHPuyHdH[]A\A]fUHAWAVIAUATISH8HuȉMMH}HHEtH}2HHE1=l(t5J( 5;(H (E1HtRL)MtBHLLHMHMuA|=tHIL)MuHt H9rJ4H=(KHIMtzJN4H5(H;5(t HLC\KDL-k(L-(=(t d( V( 1He[A\A]A^A_HEHLHAHAAHH)Lt$IHLLHMDEJBW=HUHxHuMd[X@lLgHHMDEt[HHI$EHHMHI$HMtjLHH*[M4$X@lLDI$LHMHMLHME1HIHM='(t ( (M4$sHHMHMHHM5E1HIHM=(t ( (}H=('L}MtL1HEL|IIGAHH)Ll$IHLLHMDE`U=HUHxHuYX@lLHHMDEt L0MsEMt2LHM-HIHMLLHHMKYHMX@lLHMaHMH\$Hl$HLd$HHHAt??t:=Hu+DHHHl$H$1Ld$HifHdH$Hl$Ld$HH=(HהHĀH=(HHHĀH=(H虔HĀ'H=~(H HĀgH=_(H[HĀH=@(H̕HĀH=!(H譕HĀH=(H莕HĀdd(t1KH1dLfffff.HdLAWAVAUATUSHH(I@Ht$E1E1$MHhIHADI tIAEHADI u|<-@<+D$m@0> 5B1E1H@LŀIID$oM9fHMLE11LcHL$NЀ vJHt(1A84$tE D: u HH9wH9SIHh@DqIHx 79I9L9IHH7@I9mH|$tHT$H:EcL$HHڅHEH([]A\A]A^A_DHd1H([]A\A]A^A_M. 1E1IAufD9t$EfDHA7@DI9D1H|$tLH)H~IUI@xIM1MhEPA}0uH1Hd"HAJ@JLE tzt5tNfDH1HHHAHuHfHHHHAu@HHHHAu@HfDHHHHHHH)HA8H׈uHDATUSHH Hl$ IHHT$ H9III)I IHPH9vnLHHHH11oHfHH9wHI9H;tDH HH9wL)J\# H H[]A\fHSH9wHDH HH9wH말H\$HHl$Ld$Ll$H(Lc(Hs HEA)u4L;c0spA,$I@Lc(H\$Hl$Ld$Ll$ H(DHMcLP8HPIĸHwH{ LL)J4'I@=Lc(Lc(@HHl$H\$Ld$Ll$ H(B?fH\$Hl$HLd$Ll$HH!TLJCtHH$ H H$( H$ H$0 DŽ$ E1DŽ$ HDŽ$ $t HDŽ$ @JŸ0@HAE HDŽ$!@H$!f;xJHdL%L9Bt01=K(t 2rS 2gSHLBBH$ L$( A)E~HIcHP8A9ŸEf;xHBBtxEt!H$!1tfH$(!H$0!L$8!L$@!HH!H$!Hھ@˃fDHB=Q(t R R_UHAWIAVAUATISHHHHu A $AƍA<}vHeH[A\A]A^A_fHUHވMH)HBHH)Ll$ILFI9H]MsIcII|HHufI9sHD1HH@3A $xttAIHHI9ňr.fI9rfDAL$mDUHAWAVAUATISHdJHHHU.IHkL,A[MAWLH)HHBAHH)Ld$IHLEH]IIM9w_APЀ w{H¨dHHHT@HHU H)HHUtLLHuIM9vEuLHeH[A\A]A^A_fMu H`<,HUt<.HUuHH1HHH) H  Hu$HHUHUHHUE1ʹHIHU]HMH}DHEHHM9HHMufE.H}HDHE9HYfE,Nffff.UHH]LmHLuL}ILeHIIdALJD#AMAIE%LHIEHIEHRfEHDžxz0@H#HDž@HDžfExJHdL%L9Bt01=(t 2CN 28NHLBBLHLHM)LP8I9AHDžHDžHHf;x8HBBu$HB==(t M Mt%H1~fD`ADH]LeLmLuL}dAALLHADdA fDIDHE):HHPLƅHDžIHH DžHDžhHDž(HDžHI~"DHEvDD ZwAƃ HJHJHƅ@ DžDžDž|DžHDžDž\DžlDžDž8Dž`Dž0Dž<HDžHHHMdHHHEAUHHHH)LD$I/h+IEAU0LHLN5HILG|)`u=~9HcѾ H߉¸D)L9GF$"HLLHP8I9ƋGIcԸH)I9oGD`t*~&HcѾ H&¸D)99GF$"HH@HHHH%NHH+IHHHHHP8HH9!IcԸH)H9!D+EA>f"h5HHHMdHHHEHHHH)HchLD$IHkHHH1HHpHcF0H48LHL@3HILEd$)u=~9HcѾ H߉}¸D)L9EF$"HLLHP8I9ƋeEIcԸH)I9QED$t*~&HcѾ H}¸D)9EF$"HLHXIvIV HHH)P8IN IvHH)H9IcH)H9h)F$!HchH9u HkHLIAF щ։‰׉‰Ɖщ‰҉ $׃AN ։AVA64ANdAVAV,t#HpHcH2҉dAVCAF(t!HpHH8ABd9M(J HcHE?HHcHDžHH)HL$HHD HLW(MtaLK<tRI~81HHH)HT$HAF0HHpHH9rLHCȃ 6HHA DHp1HDžHDžMHLHL!I8HHMHHIM,HHMLw^Mm HHLA}I9MLwO,$Ie8IEOd%HH)HL$HJ)I9MDHHLH=)H:LH&HC(H;C0o/%HHC(A LchAMkHL0HH Ȉ HC(H;C0i6.HHC(A Ic>HA 1DDH0HC(H;C0 5HHC(A; HAH9wAvt*HC(H;C0 3@0HHC(AAD)A9G$ HchHkHHH/Hc@0HpHL0MC/ƅxDžE1DžDž $Ctt )HchLHkHI*/4W(IcF0HpHH8IcHHDž4IM(4'(S(V'HdHHHcL藡E1IDdA) uaEt\IcҾ H߉LDDn¸D)LD9D!F$"HL‰LDLDHP8LDDL9IcԸH)I9Ãt2Et-IcҾ H>n¸DD)9}F$"E'LchMkHL 4du*~&Hc׾ Hm¸D)9F$"HchHkHHH3HHpHcB0H4HC(H;C03@0HHC(AALG:Hc Hm¸D)9`F$"L`@0DHH@ Ȉ HDž(IEHPIUAU/wlIEAUHfD AH7AH'IEHPIU ڃ dAVAF DžIEHPIU듾#H]5+HL;L+H߉w HLLNIEHPIUDAU/w:IEAUHIEHPIUIEHPIU0鰸IEHPIUMLDqHcpM)I)nHH|HHHcHHH)H|$HI>Hc HJ(HLTHL-H߉a6dA"A)HHΌHHHeHHHHHHbIEHPIUu$AU/w@IEAUHE1D :AU/w*IEAUHE1fD IEHPIUIEHPIUH:H5HĀ~H:H#7HĀ[H:Hx5HĀ魱H:H6HĀ91ɍP}w/DD9v#Hx<tD)DŽuލG1AÐUSLHAB0t Az,f$LK MHSI9HCH{HL1HHS HKHsH)HHSHH.tHH{HBH<uZH f.H4HHHHHuHCHCH[0]H{1 HMHtHSHKHHHSH[0]HSH{ HHHH+HH[0]ÐAR(BAB(0H[]ÐHCmUHAWAVAUATISHdJHHHUL.IHML,A MMAWLH)HHBAHH)Ld$IHLgH]IIM9w_APЀ w{H¨dHHHT@HHU蓷H)HHUtLLHuIM9vEuL;pHeH[A\A]A^A_fMu H`<,HUt<.HUuHH1HHH) H  Hu$HHUhHUHHUE1}aHIHU]HMH}DHEHHMiHHMufE.H}HDHEBHYfE,Nffff.UHAWAVAUATISHHEEN \HdH6H6H~@H@D~Xs @@HǸdH?H?Lo`A}@}D\EHdH H I`HDž0ɉ<-%E1@Dž<fDH@xf(xBhHhH8HEdHH,#HcSJAJP(J%JHELEEDs@AAEA1҅IC @\I$1HH"Hx H;x("7@HHx @I$1H"Hx H;x(s"7@HHx @I$DjqHo"HP H;P(a"2HHP A1fDE1Dž<HDž0@6H@x(<$۽bxۭ}EBfDHƸdH6H6H~PH@?uHdH?H?H@H@DEHdH6H6D~Xf.f(@xxfWf.9<$@x۽)xۭHEdHHJ$HcSJAJPJ%JHELEWfHdH?H?LoP3f@PB9AMID$(II9D$0#HID$(ID$(I9D$0AM#HID$(ID$(I;D$0AM"HID$(DjEHeD[A\A]A^A_þ-L牕H5H%DAHdHHH@HDž<H0H08E1@H`LuHM̾HHLH(<$FHxD@EHE1)ʃ?HcHHH)H|$H)HL$H)HT$HHHpHHhH`hA?LxLHx/DV?MAHHcHHHLu݋UDJ?HHcN LxAA?~3AH?EHpDH1AIcHHH9LUA E1L DIMA*KDžPEDLYINIHhHH4KHHH;xb,HU EIANAL 9HtIFIH`HhH KL@FIVHUHJHHHDDH`LuHMf(HHHLH(jHxD@D\EPɸD<<HdH H HIXDž<H0vHdH H HDž0ɉ<< D\EGMcƾ LLHLf,HLL9?EDLD ?)B?HHcH<HpHxDUDJ?HHcHxHHxtHpHxHыEHhHpHHzH@HhH`HHMiHUH`HDAAA?A)ĸ PPD\EI$HHp H;p(-HHp D\EI$HHp H;p(}+HHp 뱐HxA LU~HxHpHxEHH{dH HSHc e f EDuE } Dž(UHcljPHHDžC EPE1MHDžDžt3(LDhHcHDHH?H9hHcPH9THL4IIDžIL)H|$HHLDUIEt }fD(1LDžELDMHD(LLHLAfDAMHE9鋅(MLDHLIL(DE"C uP Hx D9AHE11҅ L(LIDLAHDEDfAAIB4;A9|D9P~=Hx~&LH0AuEuP뷐HpH8uDALLL(DLHLHDPHxHD 4HxLD5CMqHAD9J9AE1 D9u0HA0D9uD;uE~ ADPA9V0A9PAx0I@u I9uC uE9xMHt MMt" EfDmE#A}IAIq҃-M  <9~AgfffA)׉0EH щU˃0LNE̅Gs Lɋ L)HHPH)׃ s0D\ECLcLLL$LL9ED D\E6 I$HHP H;P(y-HHP C A ua ~W{0uQ\Hc 0LLHH $HLH9.D \1HDžHDžHC cHHD\EHPLPHIHPD\I$HLLEIEP8I9E/ C \@ Lc sLL #L9;D @E1Js @PDPHMLDL I҉u;H`HHKHpH9:E1 fDH<uAIcLJ4HHtJLAA?EMcM)M~$H 1DH4HH4HL9|HxLUL)H~$HpH1H:HHHx~$M0A$uEuAHpH8uLL(LDPE1LH#f.ID$(I;D$0 -HID$(ID$(I;D$0( +HID$(ID$(I;D$0 HID$(LLLȉNI4K -HID$(Ic޾ LHEf ɉPHcvEHcEPADžpHD(HHHHpJHt H9OEA@E)D9FIcLDH)AHPLDmHpLMcHxDH+PL)uJ4DOmHxHpHH+PL)H|HDHxzLc sLLI}f<A1}EEuE9c+IH)HI)BDžSAD9yLxIH}MHpIJ|t]HA0DžmHDz HHxA*KDLLukHpHxA LHxLH(EHʋUELDžPL DUH9S6HCHxHH9nH HhIHH4KHpkHxHHKLiHHHhLDMEH)ыUN4)NIA1HpLfkHE11E1E1DLHDeHpDHxDHeHHxHpHxHhA.HuH@HUD)HLHEWeULHpAOLH2eIUHxHpJUDHpH84HE~1~hHcHzD0HEdHH4HcCLB%Dž EEC tHdHHH@@HdHs L牕HH@pLL牕HH@HHIHI -LLZLg+L牕HHqg}8JLL޻LIVE~I9sI NLI~0H)HH輻LI+-LLNL +HAd"XHdHHHP@HdHHHL<:HHHHL HHHHHH+-eLD }f0C &IvH9A>0P0L牕AL牕pL牕ϾKHdHHH@XHdHLD_DLD8HHDžDHdHHH@@HdHs 1HUHSH1=Y(t5S( 5S(H M\(HtHH\(Hc1H,H؃=Y(t S( S(tH[]HT$44HH\(HT$tHH [(fDHdUHSH1=X(t5R( 5R(H ][(HtHH\(Hc1H,H؃=X(t R( R(H[]HT$D3HH[(HT$tHH Z(fDHdH=,R(HHĀHH= R(HHĀmH=Q(HHĀH=Q(HCHĀAWAVAUATIUHSHND$pL$`F ˃\$lHdHHHH@HL$x@X$u @AH@t$XHHH$L$H$p$xHT$(HL$0HT$(HL$0t$X%D$yf.HdHHHXPH\$x$u @AkH@t$Xf($pL$0t$XL$0dD$wHAdHHHcUAJJP(J%JLEHEED|$`u@Pt D|$`AAEP 1E E @ ! D$lI$A6IH HX H;X( 3@HHX @eI$A6HHX H;X(3@HHX @)I$ZAvHZHP H;P(L2@HHP @Hf(L$0E11L$0FfDAHDH$L$E1HT$(HL$01HT$(HL$0t>HdHHHc]AJXJ%JLDJHD؉$hD$hH$`AAHgA^ $t$pL$ *KMH LH }A$*KHDHHHHHuL$ 1Ƀ}ALD$HLT$PMK L\$XLLL$@uLD$HILL$@LT$PL\$XI@LH9vfHIH90A0w$vfff1%$ D$EE1DŽ$|$pM H$H$ LLL$@HL$1tLL$@L$TIHLIHHHHI)HB *KIAuEDu D$`+D$+T$pL$pBDɍD$lAu3H|$xT$(LD$HLL$@LT$P߅LT$PLL$@ALD$HT$(D)AA u E E1E E @, t@L$llI$HHP H;P(  HHP AT$lI$HgHP H;P(Y0HHP uD$l I$H3HP H;P(%2HHP AE u]E~X}0uR|$l Mc0LLLD$HLL$@LT$PD\$XLD$HLL$@LT$PD\$XL9Eރ|$l$ I$HVHP H;P(H2HHP E|$pEn |$l H|$x1HHHtKHLqLIHD$xHHD$xID$(I;D$0HID$(AMuIHՃ|$pHcT$pML|$pM)I9HT$`LO|$ls MtLI^HEL@HAID$(II;D$0 HID$(AHuIEHH\$pH\$`L)H~E|$lHھ0LLD$HLT$PD\$XLD$HLT$PD\$XH9Aŋu|$lI$HHH H;H(1HHH $-$-|$l?I$HHX H;X(3HHX A]Ll$M)Ճ|$lPEMMID$(I;D$0AHID$(II3ID$(HI9D$0 @0HID$(ID$(I;D$03 @0HID$(ID$(I;D$0[ HID$(ZAHĘ[]A\A]A^A_DHdHHHcUAJJPJ%JLDHDw-LT$(L$0pL$0T$(1fefD=DŽ$)$DŽ$$Lc$MMK Az0uABII0t|$pHcD$pLLc$L)H9A<8IL$pHcH94|$pATLc$BЃ 8IDD$pAIcI<79ID7I-A00HHL)H9dI HPH҃H 1+DdAADICH0DE6HPH ƅ@HDž(DžpHDžHDžHDžhHHL8QLqDJZwJHŠJHH`Dž DžtDžDžH DžxDžDžDžDžDžDžDžDžHDž@Hu6~2HcѾ H߉¸D)9F$"AU/*IEAU0HH<HP H;P(<2HHP ?A2At*~&HcѾ H/¸D)9F$"H@FMF%LLLHIHHHM)LILP8I9Hj!IcԸH)I9V!1E |u*~&HcH߾ \¸D)9,F$"HcHkHHH 0H HHcG0H4HHW9HB H;B(I90HHB AA|H t:~1Hc H¸D)9oH F$"H@H_HHHHqHQ H)HP8HHQ H+QHH9Ic̺H)H9AHcH9fHkHHHA ׉։‰\׉‰։‰|҉,‰փlq @׉ƒ0׋Q9q(Q,y@7t"HHcH2҉Q'7A(t HHH879M5B HH4H7HHcHDž@HH)Ht$HHH m5L@2(M]5LcK<K5LQ81JHH)HT$HL96A0HHH܋LHPaDžIM5%S%LE-HcLdHHHHAHDž HH)LD$IHHMHuLLHEHHLADE)1|ucEt^IcҾ HHLD D¸HD)LD 9DF$"HHLHLHD DP8HLD DH9,IcԸH)H9Ẽ|t2Et-IcҾ H¸LD)9F$" U5HcHkHHR?|u&~"Hc׾ H¸D)9woF$"HcHkHHH C6H HHcB0H<蛌HHtHB H;B(?HAA@)HHcHkHHLA8JHH)H|$HMt%DI011AHHHL9rHH9HB H;B(}9%HHB A (Dž AA$' DEA@$HH9HF H;F(9+HHF A EAЋ $DEȃy0~9A t=HH8HB H;B(8IHHB A|AA*L H 1IH4 *KHA1uL9U*LEILAHx H;x(sD7HHx =A=HAH9)3I$HuLHHD_HHDuLIDžAȉ Z5H H@HEHT$HHPH$6H0?5DL0IHDž HHDž1HDž@HDž H3Hn5H HHHHHHH H@HHMLHLs H@HAHH HH9wHHa:HCHHH)HHL$HHH9HDH HHHK@H HHIDžA6 Z2JHŠJAU/$IEAULM%SOBLEl.HcL'H H HH2HDžHH)LD$IH HMHuLLHE贌HHLADE)!ucEt^IcҾ HHLD D¸HD)LD 9DGF$"HHLHLHD DP8HLD DH9IcԸH)H9Ẽt2Et-IcҾ H¸LD)9F$"LHH6HB H;B(6%HHB AJHcAHkHHHcHkHH`H2 Hc@0HHL0MLDž I?HELEHM?\H H 1HDžƅ7 HB0HH9HHHHH |HHs )\M Ȉ t BDЃuEu t7 ,ElHHQ5HA H;A(C5-HHA AA t !~&HcҾ0Hq¸D)9AF$"HHHHHHHP8HH9IcԸH)H9AHk`HHuDžHcHkHH`HHc@0HE1HL8DžDžDžDž HcHkHHH aH HUHHcF0HHHED)9F$ H HcHkHHH K#H HUHHcF0HHHExIDžA Z JHŠJHcHkHH,2Hc@0HHLHcHkHH`H3Hc@0HHLM3DžxDž,E1Dž\Dž0EIAЉ Z)H1IDžA> ZCtt p&+HcHHkHH4$HcA0HHH0IcHDžAU/8IEAULE1DžDž ME1Dž X *K*KHDȃ H L1HHHuHH gH H+HHHL9 HHHIH LHЅD  D)M"t BDЃuEu t &EGHHA/HH H;H(3/-HHH A$At  ~&HcҾ0H¸D)9F$"HHHHHHHP8HH9IcԸH)H9ADžsIA> ZDž DžIDžA ZnIA> ZDžDžlHH3HP H;P(2%HHP AA!AU/IEAULMLDž I?HELEDž EIAȉ Z.DžDžJHŠJIAЉ Z DžDžXIA6 ZvAU/IEAULM.DžxDžE1DžDžCtt p 2AU/IEAUHIcHA0 fDDBIArЉу v+1v Z}DžxDžfDLLH,AfdA H Hھ@诿Dž<D#cE,HH$HB H;B($-HHB A}AtMt ~*Hc0HX¸D)9(F$"HHHHHHHP8HH9IcԸH)H9 +AHcEHH$HB H;B($-HHB ApA\tMt E ~*Hc0HK¸D)9F$"HHHHHHHP8HH9IcԸH)H9 +A~&HcҾ H¸D)9F$"Hk`HHƅ7 X *K*KHDȃ X T H L1HHHuH, P H H+HcHHHe\aMXKHH HH)0H HDž@nHH HH"HH(HHDž@MHH HH)0H0 Hc@0HE1HDDžDžHHx&HB H;B(j&+HHB qHHHA H;A(+HHA  HHHH H;H(+HHH LDHEH9@HC@H@H H9@Hk@HHHH)HD$HHH@H@HHHH ICtILL (HL LE1DHMMMMLHHcS0Lc[HH H(LHHITBLIHHL;sTC,t HADC(t HADHs8HtHuHcC0S4H ATHcC0S@DHMMMH@4MHI1LL@/?HP@HHH9@w~t1hNu H5^(HO"H@몋@/wHP@HHHHHrHHt8uHHHHHrHHH2zH0x*H H HDžE1Dž HA0HLcDž AcHHHB H;B(+HHB xAU/IEAUDE1DžDžCDžH LHHHHHHH)HҋH։uHHHHrHH~4HcҾ HD 蠾¸D D)9iF$"1DHPDH E1Dž HDžHhHH HLD LLHD LH LHHHHҋuFH LHHHHҋuH LHHHHHHH)HҋH։uHrHcLLbuDžHALH 1ƅ7 HDžHWtH HLD LHH HLD LH)HHHD~4HcҾ HD C¸D D)9 F$"1HcLLLtDž HALIEHPIU?IEHPIU(H HLD HH HHcD LH)HHHH+hHH HLD HD HLH LHHHHҋuH LHHHHҋuuJAU/.IEAUDE1DžDžIEHPIUAU/IEAUDE1DžDžCHH$HB H;B(0HHB AHHHB H;B(8HHB AA.Dž DžJHŠJLMRHHHF H;F(-HHF P:HH3HF H;F(% HHF H1󫋅d`lh4\  ȍ  | Ѓ , Ȉl(m7p+IEHHHPIUPHUHEHEHUH`HHE蜂HHHD LHP8HD H9IcԸH)H9mG$!i0Hc@0HHLNlNHc@0HE1HDDžDž0HHHF H;F('HHF A  AU/0IEAULE1DžDžZHHHH H;H( HHH HHHB H;B(#HHB A Dž AAIEHPIUdHc@0HE1HDDžDž0 AU/ IEAUDE1DžDžHHHA H;A(0HHA A3HHHA H;A(0HHA AAyE1Dž1AI@HH" HB H;B( HHB AU/IEAUH0HtHB H;B(lHԹn(IEHPIUIAFIvH0 v?AU/ IEAU IHzЃ k DIEHPIU1HLHHH HH HP H;P( 0HHP ABHH HP H;P( :HHP  AALEIՃ9HHaHB H;B(S.HHB AHcL 1IH *KHAuLAEILII$3HHx H;x(7HHx lAWHAH9wLEIՋqtBHHHB H;B(0HHB AAD)A9G$ HDžxDžJHŠJH1󫋅dƅm`lh4\  ȍ  | Ѓ , ȃl7pIEHHHPIUPHUHEHEHUH`HHEDZIEHPIUHHvHH H;H(h0HHH A'HHHH H;H(1HHH AAHHHD LHP8HD H9IcԸH)H9HcG$!HkHHIEHPIUADž ApJHHHB H;B( HHB R1HLHHH ڃ QA Dž|DžHs HLLJIEHPIUHHHCȃHDD)9F$ HHH HH =HHH@H@HHcHH 'L~.HHDHD9HHD輯HD+H߉茯0H߉eH߉CW+HLLhHFL0Hݮ1IDžIEHPIUAU/wGIEAU8YVHHtHB H;B(HeIEHPIUHHJHHH\HH@HgH@H +H߉߭-H8OTH8H4pJ0 H߉耭?IEHPIU1lAU/IEAUDE1DžDžHHH?H/HIEDž: HLL IEHPIUfAU/ IEAUDE1DžDžHV! H߉5WIEHPIUdAAeHH@HE@@_IHDž@HDžBHdHHH`hH@PH<tHDžAUwBIEAUHHE#HH4HiIEHPIU뽃tSAU/wAU/ZIEAULS-H߉藧%Hvx HdHHH`hH@PH<t tHDžHc@0HHLo-H߉8'H߉HDD 讦HDD HHHIEHPIUAUw*IEAUHHEIEHPIUIEHPIUՃATJO髾AU/IEAULH߉趥 5DžDžATJi$YDžATJ>0H߉<OIEHPIUELqLiH@kkHHHHHI&Dž ޽IEHPIUAU/IEAULiIEHPIUxLʿL¿LHHDCHHDQLAU/IEAUHIc1HHcH|H HcH@HHH)H|$HH8LcH'H HLBTH HLIEHPIUh0AU/wkIEAUH1D ,lu,HcA0HHHD IEHPIUyHcA0HHH0fD ۸IEHPIU딃ljAU/LIEAUH1D 陸+HL臢L\Խ%He鹽dA"A鬽HωHAHHHMHH@HXH@H AH8dHH8H4pIEHPIUIEHPIUAU/wNIEAUHfD еIEHPIUAU/w)IEAUH1fD 2IEHPIUIEHPIUH\$Hl$HLd$Ll$IH숂I³t0H$hH$pL$xL$HĈfDH$HLHLH$(H$CtE1H$H$H$DŽ$DŽ$HDŽ$$tHDŽ$؀JŸ0@HAEHDŽ$@@H$Hf;xJHdL%L9Bt01='t 2 2HLBBH$HpLh I)IE~HIcHP8A9ŸEf;xHBBtDE{H$@1ԑgH$@Hھ@c!fDHB='t uY uSH:H軕HĀ&H:H0HĀ鶰H:H腕HĀH:HHĀ땐UHAWAVAUATISHHXHH`H dHHHHHH@HBHHHBHP^LJ(%M(DHHQHr@HHRHH:HEH0@H҅҉}HDž@Hf@LHHHEHDžHE1HǻHDžPHDžHDž8HDž(E1Dž|Dž\E1HD6E1E1EAƀfHA%HAHAhDP AHCH;C]D(HHCEMZtEHIcHGhDP t0HSH;SED*HHSIcIDP uEE9E1HMD6E1EE1f;H t H D '\;HPt5HPH8CHPHDž\\He[A\A]A^A_HLLHHUHDALLALHHKH;KYcHHKD*A9~AIHEHMMAfHD1DžhAƃ0  hDqHHAփ0 w3hEHATVD0A΃0 vhA$DhDžDžhEDDAVLX.LaDfDt6LXALEuAAct A[u%DA%ASAAntACt@I|HdAdAAbHCH;C?ZD(HHCIHBhIcDx uA|dAfIAHA%DLLLvFASLLLD"EB$JH|d\ADž\HxHDpHHDž1H fA*tAIu<D2HA'HBuA*tAIt߉ A'DfDA։E1JЃ GHFDBJЃ vD0|Hd0\f;A-$XJLAHD0HBB`HB=L't 8p .p7HdL%L9Bt01='t 2p 2 pHLBBq LAlICASAlB&LAh&LASt s CtsLVLACDžAFHCH;CjD(HHCA+MZA-1A0AAMA)L9%A0HCH;C7^D(HHCIEtHAHGp4L9rH0HML@LpHQHH)IIHE/H)N2fDDỈф EA(;5HCH;CHLwpOD(HHCAIHA<nHALpp/HCH;COD(HHCAIHA<iHALqpHCH;C.FD(HHCAIHA<lcAHCH;C[D(HHCA)?MIA$0AMk1EE,$A)HCH;CCD(HHCIA0AI΋79Dž rHuLLLLHEL?HA1f;_DHLL-Hu+HCH;Cb)D(HHCID @HMZ pHu3ht)HPHHH8HHHH9J#~  #HCH;CgED(HHCHIcIHGhDP hL@L0M^AHLL0LLDpEHH!HtRHPH:H)HH;HH4t0LL5HLLt HPH\E1HDžPfHDž1H DA*tAIHD2HA'HBuA*tAIu݃h-H H`H󥋵h H( xЉ/vHHM1Lu+HHCH;CD(HHCID MHIDEHCH;CGD(HHCHIHhHH#HHMHHHھ@\szH1sIjH|Ad8HfALd$I{O ILBIAHH)Lt$IMLLLLLL:LLLAA$<-t<+AASAHAo-f.D|L0HSH;S22D*HHSIcHIT$hD AuHdD0HhtxH H`H󥋽h H( rʉ@/vHh\%@/HP@HHUAAHE1 ,DA!h*,@/ HP@HHPHPdDLL腤HPHH8DLLHH(u"H(HH HP]"H(HPHDžHdHLHAHCH;CCD(HHCHIcMZHGhDP u]!EEE~ AHSH;SWRD*HHSIcIDP tLHLHIAHLLg*LL<DA!h$@/!HP@HHPHPDLLL跢HPHHDLLLH H( H(HH HP H(HPHDžHdHtHDADDA!h]$@/$HP@HHPHPADANLLHHHH苡HPHH8DLLHH(_#H(HH HPG#H(HPHHtA HCH;C(=D(HHCEMZo%!L8EAE.IEhOHCH;CCD(HHCĨhk@/MHP@HHUf8htH H`H󥋵h H( zʉ/vH惽h@/HP@HHHh@/pHP@HHHRH H`H󥋵h H( xЉ/vHHDž\d D ]r@8{@ƃA@82wgHHDDLLCAHDDLLTHd|AZu LM"A?"HoHH!HC7I;LM9IuO$6ILBID$HH)L|$IH6LLDDLL1LLDDaDEt+HIcHGhDPtM9d F,6IIMHApHGp: M9"pB6Iƅ@ƅAMnHLEƅEOHLEEOLL)HhHIA:;@AHA8IH9H|H9 AA9t)D*HHSAIAD9EIA?EHSH;SrHHDDLL@AHDDLLgHd|>nO$6ILBID$HH)L|$IHHLLDLLL/LLDHAHCH;C=4D(HHCDIcMHDžpHDžhLpL@MZ!Eĉ0E8<tADEAHCH;C'D(HHCIcIE8<uLpL@IAHLMDLL LLLHhM9E,HH0H3HHpH`LD`HL0Ht7HPHHH8HHHHhHH9JHDžhAHCH;C%D(HHCIcMZE8<H8DLLhIDEM߁!pu/D.pHtHPH8HHHH9EID$I;D$"D(HID$HIcID8uLhLMAH8IIAHLLLLLLM9E+H8H!H8HPHH:H)H;HH)HH;bH4LL_HLL0HPH!EH8D)HEH8~ A HCH;CD>D(HHCHIcIHFhDP t?hH H`H󥋽h H( rʉ/vHEIM]1M'I IH|EMd0HHH8DLhMIDD)HPHIH8HH9 ~ ;ID$I;D$X=D(HID$HIcIHFhDP =L듃/ H(n,ЃH0 u/ H(<<ЃH0 H H`H󥋵h H( zʉ}/vHHHHPHHWHHHPHH H H`H󥋽h H( qщt /vH/ H( ȃH0 HHHPHHHHHPHH)H H`H󥋽h H( qщt /vH/ H(ȃH0 H|d0WO 6ILBIAHH)Ld$IMLLLLLhLLH=/AHAdTHfHIcLpH8IHHLxLhDHPIH9HH9 D*HID$I;D$TD(HID$IILHHHPHHGHHHPHHrH H`H󥋽h H( qщt /vH/ H( ȃH0 H H(HD$HHHpH(1mh@/YHP@HHHLHLHLAIMLI9HPIH>LHDLʚHHDLtHHDIHPLHH40HA$I|$fwH H(HD$HHPHH(1h@/yHP@HH8H8L@L0>HHHHL軙HHLN'HPHѥHHHH^ FH(H]E1L;#8JDH8kJDIHH H`H󥋽h H( qщt /vH/ H( ȃH0 %HPH(6HHHPHHTh @/h HP@HH8H8%" h@/tHP@HME1Dihue@/wFHP@HH8H8HHHPHHHHHPHHH H`H󥋍h H(t/wH/ H(%$ЃH0 KLHLHEtH8H!H8HPH8H8H)H;HLL趖HLLHPHxH H(HD$HHHHH(1 HHHPHHYH H`H󥋍h H(t/wH/ H(#ЃH0 H H`H󥋍h H(t/wH/ H("ЃH0 HAfAL|$IfAHA$fALt$IASHPH(.H.'AHfALd$IH H(HD$HHHpH(1nHPH(H H(HD$HHPHH(1HHHPHHMH|DždmHK&AHfALd$IL4HLLHHL 2HPHH H H`H󥋽h H( rʉt /vH/ H(w'ЃH0 HPH(HPH(HDž\dH H`H󥋽h H( rʉl/vHH$AHHHPHHH H`H󥋍h H(t/wH/ H(ЃH0  HHPHHAHDHDžP\fO$6ILBID$HH)L|$IH LLDLLLLLD"H H`H󥋍h H(t/wH/ H(ЃH0 H H(HD$HHHxH(1MLpDL@H H`H󥋍h H(t/wH/ H(!ЃH0 WHHHPHH@L1HLL%"ALLHHBh%O$6ILBID$HH)L|$IHLLDLLLLLD-LLhMAH8LqH H`H󥋽h H( rʉ|/vHIGLH9MMILގHLpHPHH-HfALd$IGAEIM IAHDLLiDLLHHHPHHH H`H󥋍h H(t/wH/ H(sЃH0 OHLDLALDLHd|O$6ILBID$HH)L|$IHLLDLLVLLLDHPH(\HHHPHHH H`H󥋍h H(t/wH/ H(ЃH0 5HHHPHHHHHPHH.H H`H󥋍h H(t/wH/ H(2ЃH0 HHHPHHH H`H󥋍h H(t/wH/ H(=ЃH0 h@/eHP@HME1DHHHPHHH H`H󥋍h H(t/wH/ H(ЃH0 &IMEnAHCH;CD(HHCIE~AMƅppAH H`H󥋍h H(t/wH/ H(w'ЃH0 HPH(HPH(HDLLADLLHd|H|d0L牕HDL4AŋHDLHLLhMAH8Ld|LrHDLLADLL8Hd|'HPLsLH8HHLHPHHHDLL(ADLL5HPH(eHA$fALt$IA*HHHPHHH H`H󥋍h H(t/wH/ H(w'ЃH0 HPH(THPH(H(AHdD0HHPH(HHHPHHH H`H󥋍h H(t/wH/ H(%ЃH0 )HDLLTADLL߳,LHLAHLLLhLpH8LHHAd|HPH>H8H)H;H `LLhH8LpLHHLhALHMLpDL@d|!LJDLL[HHDLL@H0LpEDžLMEāEA1DDž@LIHADOH0HN'N%1ۃ1LD葪;LpDuN%AA9A~I^^ML7HID$IA9H;sEtTID$I;D$rLDaDuMAHd|N%JMAL9vQAtHAIIA7HIM9wHSLH)IIFH)D<1LZ@HJ%I@ HLDHLD09HDž@HHOL1AA9A~Mfu|DIA<$ht6HCH;CD8HHCA$ID9t.M9saAtAHI|IT$I9s=LIIA7HIUM9rLLIFIL)HID:1LߧHH@HH@ HLLDAEEO@ @ +0D@A0EL;1HpEA)AF 2tTHCH;C\D8HHCIIMAׄ?LDHMLH|dK6H=HHCHHHH)HL$HHpHpHLHDHDHp0HEAEOMHpEDH@WL;F<6H@IH@E?EHCH;CsXD8HHCIAH@A9tEHpMA0PHpH߉HLANjHLxHH@EHpMAd|EEEOILIH@H9LMEDž At:HAHHHLLHHIIIL9s7AuHLILLLpMOLL+@MEmDž MEHpMAK6H=HCHHHHH)Ld$IHtSLL牍LLLLMLpMEDž NLhH߉ANjHd|A$N@ NLAԉ0zMLDH$AHd|N%N%LMLpEMDž K@H`Dž0E1LLHL0DHHHJ:J=eRHHUHE+HHpHE1D;@}j1A訡HxHDLL ADLL;HAd|HDLvDL HDLDDL2ڠHDLDL騠HDLLADLLHAd|HAfAL|$IfACHDLL^ADLLHPH(-HPH(HPH(bHLALHHLL0LHdHH|HLLALL-HPHHHHH8H4rHHHLt)HPHHH۴HPH( mHP\AHDžPHD=HDLLADLL@騧HPH(HLLiALLL!HHLL%HLLrdAHDLLADLLHd|醡HHHPHH8HHH^pHHHPL$H#HLLEALL[L8@HLL ALL>Hd|0HLLALL:Hd|,HHDLLgAHDLLcHEIMd|M0u 0\JDLLUEHHDLL2A]HCH;CD(HHCIH.DLLrEHHUƉHE2HHDLLTHƄkH11HHL9uEHHDLL˔LLDD0A E$HHE1DH0HHA H,LLADH0LL HHULLHEHHLLlIcHUHkHƄAHH0A 7AHMD0@pC:L7HLLDDžLMII݃0LO0A9XH;%EHIUI;UHIUIAH1HHHHBH,HHI9ADLLD 0LLDA tGHHA|$0LL9BH0LLQH1AHHHAHSHHHDHǪDLLHDLLADLLHd|H|d8L,MHDMd|L9vGtLMwIIM9vA7LHCIT$MH)I)MI rMLLLLAAIAHLL8LLMLLLLAŃ0N0 0M90C7I0AtoHCH;Cs/D(HHC10I)0*MHLALuHMd|H|MdMO$6ILBID$HH)HL$HMtLHLHLHLI LLIAt|M9HtB3IIHIO$6ILBIT$HH)H\$HHtLHLL]LLALƅIH g'AHaAH g'HHHIHHHH4?HHH)H) JHL$HIHHHH 6HHH)H) JEHIHHHH< HHH)H) JAHIHHHH<6HHH)H) JAHIHHHH< HHH)H) JHt$HIHHHH)H)HT$ JH|$ W1L$,Hd <Ht$ HT$00wHd9tIH[]A\A]A^A_ÐHdHdËt$,1d1H$1.H$HH3$He'8fff.H\$Hl$HLd$Ll$HLt$L|$HHIIt 9EAAJHH۞Hv&HT:/tf|/u HHwITL9QMEHپJH1gs1H$H$L$L$L$L$HDHDD$;DD$HIƸLCE1JL|$^HtLHƿHD$;HL$tkHt(LH޿:uD$(%=@LJ:u@D$(%=@u0JJ@D$(%=@uHHdHdL|$pATIUSHHWHDC C HT$C0C ADC C G0 weLWLT$w@ƃ0 w5HGl@HD$Iln0HDA0A vׅt @$HT$G <) A tC C,C<*/0 1C(HЀ:.c c H nk'fCHHD$HxL.H|$*HD$fH=j'H|$CC@AHC87HC81f{0~CKH{%HC HH[]A\D$JfDK @HHT$C0A DC fDA@DC fDAȀDC fDADC fDADC fD$PJfD$JfDHrHt$r@0 w*H@HT$DF2H@0 v݉CHT$1 fDK HhHHH{ H{H[]A\LBLD$r0 w[HjHl$B0 w/H4HT$HՍtpH0 v܅t<$Dc,LD$IL½XfDHBHD$r@*@0 wmHJHL$J0 w,HHT$DA H0 v߉HD$HyDc0Hk8lfDDC ADC lHfD?hOK HDC H|$ADC 뺐EIRC0HHT$H9HCHABDC C4C \C4C4wC FC4UDC4?C4'C4C4LJLL$z0 w{HBHD$rDA0A w0H@<@HT$HЍ|~2HDA0A v؅t,@$u&H1WS(H9HCHH1HD$Dc(HILL$Lu-C rC4!C4C4HFC,H9HCօHHUHT$8HGK HD$WHvHH|$H<8H|$HJH|$H1H e'HHH;HHK@HS4HH|$HC89ATHGIUSHHB0HD$DJ ADJ R C S DGAPЃ wTwHoHl$DVA w(H f.HTVЋ7HDVA vt $HD$@A HA)/HT$A tC C,C*0 1C(Hǃ8.c c Hd'fCHu!H|$BHH|$.w3$ňJH<tH|$HzuH|$HH=(c'SH|$C@<AHC87HC81D{0NC#H{%HC HH[]A\DEB$JDK @HDEHD$fDC0A DK fDA@DK fDAɀDK fDADK fDADK fD$PJHpHt$p~Ѓ w!HHōTVЋ0H~Ѓ vHl$SHD$1@K HHHH{ H{H[]A\HDc0Hk8f.PHxH|$*[0 HHHL$HqЃ w(H HǍTQЋHqЃ vH|$H|$zPL@LD$0 wDpHxH|$nЃ w H @HǍTVЋ0H@nЃ vt $Dc,LD$ILfDDK HAfDK ADK luHH|$+?hOK HDK H|$ADK HrHEs0H1HD$DEH9HBHDK @C4C4C4C4C C4mDC4WC4?C C4PLHLL$0 wlp Hx H|$DFA w HfHǍTVЋ0H@DFA vt2$u-H1B҉C(H9HBHHH|$Dc(HILL$LC4guC jC4AC40Hr҉s,H9HC…HHGHD$JEDHGK WHHD$Ht^'HcHHHHK@HS4HH|$HC8USHHGpxEHHx1D$%= tqHl$8H~HH E11A"HHHtH.HZHĘ[]HT$(HHH % -w!Hl$8 H^p{pH 7͐HSHf?xJHdL%L9Bt01=Y't 2 2HLBBHHP`f;x0HCCuHC=VY't uq uk[D[f;Hx0HBBuHB=Y't uD u>HiH:HHĀHŽH:H6HĀH;HHĀbH:HHĀ몐Sf?HxJHdL%L9Bt01=S't 2 2HLBB1ɺ1HH‹Htu+fxHCCt2fHtJH[DHKHH+KXHfHC=1S't u} uwfHdudf;Hx0HBBuHB=R't uD u>H8H:HHĀH;HHĀnH:HHĀ몐UHSHHG8HtnH]@H)EtHHH4E11A"H0@HHtHHv H[]f.HE8뇐AUAJATIUSH t]0AJtR@t$@t$I@t$ @t$ @t$ @t$ @t$ @t$@t$@t$@t$@t$@t$@t$@t$@4$1 8~0I$LLP8HHtHH[]A\A]~I$HcLLP8HH[H]A\A]ÐSHH tF|Pt9HH@t+tGxgH߉T$L$Ht$RHt$L$T$HHH@HH [HHtu;tYH{H+{HfH߉T$L$Ht$軹T$L$Ht$@HdHH [5H\$Hl$HLd$H(f?HAxMLdL %M9Ht21=O't A0 A0yLMHA@Et@t/HHy@t!H߉T$T$HDHHPHHf;x8HBBu$HB=O't  HH\$Hl$Ld$ H(H{Hte ZCHKH+KHFH߉T$T$HHHdA 4f;Hx0HBBuHB==N't uD u>H蘷I8H HĀlH:H~HĀH:HcHĀ몐H\$Hl$HLd$HHbHItH$Hl$Ld$HHLHHP8H¸L9uːAUAJATIUSHH tM0A@JtBt$IIfSH`HtHG`H{HtZt_HHPHHPHxHPPHP@HHHx@HPH,HH@@H@PH@H[f.HHx@UE1A" SH1H-HHt2HHx0HtUStt'Hh0HHh8StH[]fDH@8H)HH4H-HStDUHSHHHuuGHu+HH+PHUHC`HEHk`H[]f.HH+PHUHHPH9P wMu:HP0HPHP H;PvHPHHP(HP HPʀyfHPHHPHP H@HPt H둋2fSH|ftQuhHHHpH9H{`Hu$HH[H@  [fDHHHH9H HH0HHHH H;HvHHHHH(HH HHHpH H9U[fHP@ HHPHpPHpHHPH9HHHp@H(@H=;HHHHHHH [H{HHH@HPHffffff.AVIAUATIUHSH@M$I0I@H)HHH9ILCIE1MA AQEHFH9DD,E11ofH9rB<D)E9L;H<>t1 A HyAMJHHI0L)HtL@L[H)]A\A]A^LHMHI$JHf.HCH9AB1H fHH9uTHI0SHtmHH:HrH9HBPHrP HJ@HrHBH9HJH Hr@HHH [D[fDHHJH9J HJ0HJHJ H;JvHJH HrH:HJ(HJ HJH9 =HH:[H{`tiHtHH[H@(HCHJHHJHJ cHz@tHIH@HPHfffff.H\$Hl$HLd$HHHx0tH$Hl$Ld$HfL8H<u]H@PhuHHx0L8H<Ht0Ctu*H@8H)HH4H&H@L`0Hh8KtcHWHJXuBH;BLE1ffff.HGH@LH\$Ll$HLt$Hl$ILd$HHLOPLgHHD$PMHwpHGXI<$Il$(t HdH3,%0HHT$HT$E1LHsPD$$LL$LՉHD$IEHD$XHKPHw ҋJH\$ Hl$(Ld$0Ll$8Lt$@HHffffff.H\$Ll$HHl$Ld$HHLHMHHI<$Il$(t HdH3,%0H51E11HD$$LL$LՉHIEw ҋJH\$(Hl$0Ld$8Ll$@HHDH\$Ll$HLt$Hl$ILd$HHLLHD$PMHHI<$Il$(t HdH3,%0HHT$cHT$E1LHD$$LL$LՉHD$IEHD$XHHw ҋJH\$ Hl$(Ld$0Ll$8Lt$@HHffff.UIHLmLuIL}H]ILeHPHUIPLgHHwpIHH)HD$HHGPLHGXI<$I\$(t HdH3%0HkHUIvPD$$LMLLE1HEH]LeLuL}D)LmH\$Hl$1Ld$Ll$HHH| @@LHID$Ml$hLID$XI$ID$ID$ HH@`'1LHID$p EID$x`EIDŽ$EIDŽ$@E1HD$IDŽ$`EHIDŽ$EIDŽ$pEI$H$ADŽ$ADŽ$ADŽ$I$HIDŽ$HXI$HD$I$HD$ADŽ$ADŽ$ADŽ$I$HIDŽ$0`JHXI$ HH@HHH\$(Hl$0Ld$8Ll$@HHfDېSf?HIxMLdL%M9Qt21=2't A1 A1LMQAALH1HDf;x0HCCuHC=T2't uf u`[f;Hx0HBBuHB=2't uA u;HrI9HHĀAH;HXHĀH:H@HĀ뭐H\$Hl$HLl$Ld$XH8HHIu 1H\$Hl$ Ld$(Ll$0H8DH I HIt1LLl$HD$L LHǀJHyHD$ Hǀ0AHǀ`AHHZHG(H;G0SHt*HHS HHC(H+C HH1[1QHk(f.USHHHs(HH HH)!HEHHHt&HC(H+C HC(H+C HHC8HHH1[]SH\$Hl$AILd$Ll$HXH$PHAHIԾ1HHDŽ$pHHDŽ$(IlDHnH$PHLH%D$PYt:$~rH$HHpHP H)H]EH$(1HPH$8H$@L$HL$PHXfH$pH$xHH)ՃH߽@뛐Ld$IH\$LHl$HHHMtct)t.11HHHHl$H$Ld$H@ǁHHLHP8HtI9ufD1벐H\$Hl$HLd$HHD"A D߉VHHHcLHu*1A HA D#HH$Hl$Ld$H tH1d> uDHfD1붐H\$Hl$HLd$HH`IċuEǃHLHHP8H¸L9tH$Hl$Ld$HÃu뾐=.'uROH.'tHfnHf`Hff`ɃfofpH)foHftftff!! u foHfoftftff tt HD9t1Ð@iffnΉf8ʃItHIfAoftftfftƅt9wMHffff.u8IfA:cv)IfA:cvIfA:cvIfA:cvr1ÐIÐ=)-'uMH!-'tHHHtكHHuIHHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHHÐ1҉HHfftfI MQtnIfftFfЅJHJTHWHHH1HI)It1Ht%LQIILD%Ic I f.fofHHftfЅ6fo f HftfЅfo f HftfЅfo f HftfЅfo f HftfЅt1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅ\f: fHfo\ftfЅ6f: fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf: fHfo\ftfЅvf: fHf1fffff.fo\ftfЅ<f: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ\f:fHfo\ftfЅ6f:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅuzf:fHfD1fffff.fo\ftfЅu@f:fHfo\ftfЅuf:fHf.1LILLHHHLOIc I Dff.ffffffNfOÐff.VWDVWDVWDHHfHHVWHHVWHHVWHHVWHHHNHOÐHHHNHOÐHHHNHOHHHVHWfHHHVHWNOff.HHHVHWfNfOfHHHVHWNOff.HHHVHWNOff.HHHVHWHN HO fHHHVHWHNHOfHHHVHWHNHOfHHHVHWHNHOfHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOVWHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐHHHVHWHNHOHVHWÐH\$Hl$HHSHhHHt!HHHl$H\$HH齒DH\$Hl$HÐH\$Hl$HHZHxH>HHt&(HHHl$H\$HYf1H\$Hl$HÐHHtSfHIIHfoftAH)AI)fD!u!L)vfoGHftfЅuHwL)HH9HCÐAWAVAUATUS t%=o~sff: f:c AfoA݉ȅt3fHcfoHHftfۍ []A\A]A^A_Å L^AAfDDE݃McHL$LcAE1IIHL$fuLEAfCo3foftfHD$$pJ@HHHHljAtBAA~2LcfoIfBoftfDAEt$Jof:c AAȹAEEHHAЃqAA]LcfoIfBoftfDAE8$pJfsARAA>LcfoIfBoftfDAE$Jfs fDfs fDfs fDfs fDfs fDfs fDfsfDfsfDfsfDfszfDfsjfDfsZfDfsJfDfs:fDfs*fDfs fDfs fDfs fDfs fDfs vfDfsffDfsVfDfsFfDfs6fDfs&fDfsfDfsfDfsfDfsfDo1EE@EEt9~1fBo&DfoftftHD$$pJf.oEuGfoAfof`fsf`fpftfЅt=AtBADEDE9ENMcLǀ?tQ%=~EHcfoHfoftft($JEunHufDof:c AA=DAoHGLtftftff91[]A\A]A^A_HcfHfoftf $pJt)%=~HcHfo ftfof:c AAʼnȃHcH[]A\A]A^HA_ÉtC%=~7HcfHfoftft  fsfoKoBfs fofs fofsfofs fosfs foefs foWfsfoIfsfo;fsfo-fsfofsfofsfofsfofsfofsfofsfofsfofsfofsfofsfofsfoufsfogfsfoYfsfoKfs fo=fs fo/fs fo!fs fofs fofsfofsfo)fsfofs fo fs fofs fofs fofs fofsfofsfofsfofsfofsfofsfofsfosfsfoefsfo@fsfo2fsfo$fsfofsfofs fofs fofs fofs fofsfofsfofsfofsfofsfofs fo|EfuoHHljt8%=~,HcfoHfo ftft vGfsof:c ȹÅut*H1H$J fsi$`Jfsfo!fs fofs fofs fofs fofs fofsfofsfofsfofsfofsfofsfofsfoyfsfokfsfo]$J~8H1fs _fs Ufs Kfs Afs 7fs-fs#fsfsfsfsfsfsfsfs fs fs fsfsfsfsfsfsfsfsfsfs fs fs fo&fs fofs fo fs fofs fofsfofsfofsfofsfofsfofsfofsfofsfo~fsfop='u3H'tHHHtكHHuIHHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHHÐ1҉HHfftfI MQtnIfftFfЅJHJTHWHHH1HI)It1Ht%LQIILtIc I f.fofHHftfЅ6fo f HftfЅfo f HftfЅfo f HftfЅfo f HftfЅt1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅ\f: fHfo\ftfЅ6f: fHf1fffff.fo\ftfЅf: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf: fHfo\ftfЅvf: fHf1fffff.fo\ftfЅ<f: fHfo\ftfЅf: fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ|f:fHfo\ftfЅVf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅ\f:fHfo\ftfЅ6f:fHf1fffff.fo\ftfЅf:fHfo\ftfЅf:fHf1fffff.fo\ftfЅf:fHfo\ftfЅuzf:fHfD1fffff.fo\ftfЅu@f:fHfo\ftfЅuf:fHf.1LILLHHHL Ic I DHffHGDfffNfOHGffff.HGVWHGÐVWHGÐVWHGÐHHHGDHHVWHGffffff.HHVWHG ffffff.HHVWHG ffffff.HHVWHG ffffff.HHHNHOHG ffff.HHHNHOHG ffff.HHHNHOHGHHHVHWHGf.HHHVHWNOHGHHHVHWfNfOHGDHHHVHWNOHGHHHVHWNOHGHHHVHWHN HO HGDHHHVHWHNHOHGDHHHVHWHNHOHGDHHHVHWHNHOHGDHHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOVWHGffffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.HHHVHWHNHOHVHWHGffff.='ur'H"'uHB'uHU@=i'u2'Hk"a'uHAN'uH@HdHDHxbH?H?fo-yfo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс/!HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)T HIfffff.fo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсTHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсxHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8Hfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)ofofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс(Hfoff.ftf€ufIfo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfslfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)OfofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs \ fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)? fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs L fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)/ fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсx HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs <fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ,fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8HfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.H H )1ÐH )ÐHdHDHx@H?H?fo%9fo-Afo5I00w{oofofDofDofDofdfDdfDdfDdfAfEffDffAfftftffсHHfHHE19t&wAБHLHI)LOc O A@fofftfofofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)HIfHfffff.fofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvhfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvKff.HL H V)ffff.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)FfofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:clH#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c*HIpfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c: ;f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)6fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cvHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c\H#IfoDfsf:c:  f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c:  +f.ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)&fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfsf:c: { f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)v fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cL H#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfs f:c:  f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cV HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: kf.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)ffofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c<H#IfoDfs f:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHA LW IIH@Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cFHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: [f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)VfofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c,H#IfoDfsf:c: f.ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)fofHALWIIH@Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c|H#IfoDfsf:c: fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfsZHJ|EtH )H<H4Et HH H] )1ÐHC )ÐATE1HUHSHtfDHI,H\HHu[]LA\ÐH\$Hl$HLd$Ll$Lt$H(IILhIL}HI$ uGDHt.H9uI;$vJxtDHufMt;M.1҉H$Hl$Ld$Ll$Lt$ H(If.I<$II$1M.뫐I$I1뗐ATHAUHSHu*@HDeHHH蒤HH)HHZw[]A\ÐH\$Hl$HLd$Ll$HLt$H(HIALp1IvqLHuH;$HH HtRHHEA$Ht1IA$D9uH;vCxt=A$HuDLu1H$Hl$Ld$Ll$Lt$ H(DI띐fHHfoftH)f!uf:cOHuHHÐHdHDHx-!H?H?fo-fo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс? HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)dHIfffff.fo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсdHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftf€ufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.H HM )1ÐH3 )Ð1H9t)HRpHDHA+uEuÐ1t^WtUD_EtJDW Eu.8fDLHBEt(DD HBEtHB4tH‹LHBuÐHwHHHvZHJHIHHHv_u[t$1fnL$fpf.HHHH9fwHLH<8HtH7t HwuwfHH2rrr HHw벐Ll$AH\$AHl$Ld$H|ǀtRHdHH(H](H*H{HHh0uRHtMH8t HdH3,%0H AH;H\$hHl$pLd$xL$HĈHD$_Ld$HD$8Dl$_D$$HD$PHD$XD$(D$ HD$@HD$HHD$ID$(HD$0HH8Hh(t HdH3,%0HHL$PHT$PD$$E1LL$HLH;HՃtt D$X H JIH^H](HҸlHDHHH1H\$Ll$lHl$Ld$ILt$HHHD$pHDHHDHH1HCD$4D$8D$0HL$@HD$(HHD$PH\$ dHH(Le(MMHILBI$H8Hh(t HdH3,%0HLl$`D$$E1HT$`Ht$ LL$hLI<$ՃtuNH9\$ t1҅tHT$`L)HH$H$L$L$L$HĨ@tHtHHdTHúA'KH JAIHHT$]Le(HT$UHAUATSHHxHuldHHHHHH)HD$HHHDHLdHEEEHUHEL H]A$HHEMl$(MIEH8L`(t IdL3$%0EuPLI}E111HuD$$LMAԃHEHHeH)[A\A]ÐHELHEHMI}E1HUHuD$$LMHAԃt>t:t5HdTHeH[A\A]DumHEhHEI JAIL&[Ml$(lHHDHdLTHl$Ll$lLt$H\$HLd$L|$HHDŽ$4DŽ$8HDHDŽ$0H$@HDŽ$PIIdHHHC(HL`I<$I\$(t HdH3%0HM}LNt5LHH$ HD$L$(HD$E1LH$ D$$L$`LILH$ HH)Huuz;tttHHdTHH$H$L$L$L$L$Hĸf.uzuImLl$ MHhH$@H$hL|1HL$(H$pH$pH$@fDHL$ E1H$hD$$L$`LLLH$ L)HՃtu+Hf.IEHH JIHDXHC(H\$Ld$lLl$Hl$ILt$L|$HMILD1H&HHrHL$DŽ$4DŽ$8DŽ$0L$@HHDŽ$PwL|HHL$dHHHC(HL0I>In(t HdH3,%0MIDHL$ H$(E1LH$ D$$L$hLLH$ L)HHtttpt+t&t!tHHdTHH$H$xL$L$L$L$HĨDHALuI$HsI$Ld$ 1M$H$XH$@HL$(H$`H$`H$@fHL$ E1LH$XD$$L$hLLH$ HL)HHӃttyHH JIHUHC(HL$HHHt{WttHttHVL@HHHtNDLEtDHHHt:DDEt0HHHt'D\ EtHHH9t DEuDH1øðÐHt9u9t HuÐAWAVAUATUSHIHt$(H|$ HDŽ$DDŽ$HDŽ$@H$PHDŽ$`HC(HL I<$Il$(t HdH3,%0H|$ H\$(HH ]HD$ H$hL$xL$hL$0H$0HH$8@fH$hH9{ H$0H$8H)HHt`HHL$|sHL$HH\E1D$$MHLLLՃtyH$hH$0H+T$ H\$(H HHuhHL$ H uH\$(HHӃ…!ʄtttHHdTHĈH[]A\A]A^A_@t@H$0bHD$(L|$0L$xL$hHHH$hHDI1HD$(H$PHHT$ H$8H$pH$pH$PHL$0E1LD$$MHL$(Ht$ LH$0L)HHӃttHH 1H JINHHT$~QHC(Ht$3`lHHH`HÐA;;<DF;AGFifff.US9w(DFQDimDEYDADD))AGAHcHiɀQt:GHiQHGw(H+GH HO []G1ɃuGHHiҀQHf;v@uQAd)A9HQD{@M1D_ DVAQAdAHfADCA -,KDADAк*AA)DAA)DEJRA)ӺgfffAC[E\DAA@D)EATEHAEAIFE$IE E)DB D)Ѝ)D)W)DOAv3D-,KBA)D9}¸ jD9} D9rHcHHiҀQH*fDQAd)A9u)iҐ9} u\@)iҐ9H\$Hl$HLd$HvH@lAԁlspllEtCH&H &H9P1H9~?C HHŠwlHS0HHDHHHlHC(H$Hl$Ld$H1H9H91H9fAVE1AUIATUS}H&HHu 2@HHCH9wH)LLdL!tAHHuIH}E1jHHt"L`HHhLLtMtI[]LA\A]A^H&ffffff.U@l1 HAWAVAUIHATLeSHHHLH&'KH]&'K蘿HPHLHH)H|$HhLHHþJ1LД_A}<IHH@IHdHHAEHru<+t<-t<>zHH)HjIHL5&IMu5fIIFI9wL)HITHHU腣HUtNIHuIDi1Ht6HPHLxHHEHHUӢMHUHMxIH&AE<-<-H<+t MIH&L}LuLE1MLLJLLd$L4$Vk1H=Ȅ&H&Hn&L%&1=<+]ȃ0 NfHQ&1H;x&L%Y&HHHy& &H&L%m&@LH5HF&H9w!HH9vH2&He[A\A]A^A_H&EădHIH &H&1LHھJL%AE<<5IMHHHHdHHLBBu<+t<-t<>HH)HLiHH&AEH<-<+t kIH&LE1MLLJLLd$L4$K#H &HH &AEt <,u4A}u-Hh&H5y&H=B& & AE<,IAEL95Hf}&IH&t<,W& t<,l& H`l1E@!=T&1HH/+1H$D$ Ht"EHs(H+4$HH*uh1ۃ='~&t x& tx&HHl$ H\$Ld$(Ll$0H8fDH}HL$ HIDw@D$ C HC0=J1HC(_fs@lLml spllEHw&H x&H9_1I9}3C HHŠwlHS0HHDHHHlHC(D1I9fDH1dI9͸|1I9H=Dw&H+HĀH=%w&H5-HĀ3H=w&H+HĀKH=v&H,HĀYH=v&HH+HĀH=v&H,HĀ#AWAVAUATMUHSHHH|$;Lv&H&H&MH=&Ht$H97IHL L9TI)Hu"LHLI?HL)E1I9IQDHH9J HH;4|IH Sv&H5\v&@H=&MD,H&IHCv&1H;Bv&N,.HH Wu&HXu&H=&HE&H&AEAD$ HHŠwlID$0IEID$(Hu&Lu&HHHH|$EIL@Ht$H1HHHIH9HJH H|$H9:tH[]A\A]A^A_HHrHHHHIH9s}HEtH3HH92uH[HH9ZuHID5HXHH9Xu&HXH0HHH9HHɉủUH[]A\A]A^A_f.II)J;4XI vIMH;4IUH;4})IU@HH;4LjHB| DHQIHBt&HHCt&x DpH=;t&H$Mc7Lt&JwlH$M9H s&H5s&IM9B)HHDpx McJ&H5qr&2H=r&MH3H|$1L#H|$L{HDr&HHH=>r&H;=r&?Hr&H&H1HHH< H&Hq&y H=q&Hq&Hv&Hq&L-q&pH5q&LH=}q&HHII94DBHHEty H=Zq&]H5Fq&H&H&E1E1UHAWAVAUATISHH(HD-x&Hx&D7Eu,H= y&PbHx&He[A\A]A^A_fD"%t&A/\AJH跍Huf.A/EJ輇HS8JHHHDrHHHƨDxHHG47IIIL)Lt$IL HxH/DLkEt6HH޿rEuHo&H9f.H߾IcHHHHƿlEH=w&L}A`H Hnw&Hn&HHn&HXHn&Hٺ,L諫HLKJEUHHcMUHn&LcHcɋULc‹UH5n&AH n&Hc}O,(HAI|=HHvHGHH4X@@Hhg JH`JH:uA`JE JJDHm&H9,Hm&H9Xfu&HpqqHLH9/HTHHHHH9HL<2LHL9MIIILHHH9HAHDžI HH5H+L9HLHH<9'PHHu&HpH l&HHl&H LHl&H l&H l&HHAHl&3Hl&MtHl&HHHHA H)l&H=rt&Hپ ݨH;l&Ht9H=l&H5l&H91D H9HH9rAaHt+H t&1f.HHHHH9k&wH=k&"LeDE1IL$It$MI@HSH;SHHSAHSH;SHHSHSH;SHHSA$HSH;SHHSAD$HSH;SHHSH j&LHDHKH;KHHKHcL9]H j&ID EL9=j&H j&HHDH=yj&HLL9HH=ij&3LeIcDHE1E1IT$ID$HIH)j&HEHJ*HSH;SCHHSA$HSH;SHHSHHSH;SHHSAHSH;SHHSAFHi&IA$HJD*IL9={i&vIHHپLH; HIi&A$HJ*E1HtBL@HSH;SHHSLHHh&D IM9rHh&I9s%LHHh&H IHI9rE1HtIL@HSH;S@HHSLHHOh&D IM9rH2h&I9s-LH#h&HH h&H @IHL9wH=0h&t-HSH;SeHHS Hh&HyH=g&t31DHg&HHH| H=g&H9g&wHmg&H:%H7%HA fDHt[Hz uEuHI4H+5`&I4fh&H([]A\A]A^A_H`&I@H`&H `&IHA@ A@Dh N42@IHH_&Hh&L%%H-%:HHt#DH8uHH)H9v$H g&HHI9WHHHL_&SAWIAVAUMATUSHIAHL$@Ht$@ILD$pHD$hHv0 L$LHt$x L$LvHH$HE1IH|$ILD$`1fLL)H HtEHIHq<%u1E1E1HYI0#-fE1rЃ v]AEE1Oz%HA4G$FdbH эrЃ wA ~AfD^t#_pf.DH/@AfE1HL[]A\A]A^A_7]A[@$ըJfDHA fl$L ED$LD$L&EHD$XJDHCAAHH%uHHE1E)LEIL)EMcI9.H~E~HA0McH LHL$ DD$0LL$8D\$LtzD\$LL$8DD$0HL$ EMcMtL@tIUxTHuLHMDHMExDMcH0LHL$ DD$0LL$8D\$LyHL$ DD$0LL$8D\$UDMcHHLHL$ LL$8LLL$8HL$ TH|$@1҅DELD$hE1w &HI|@T$0L$ t$8DT$(D\$lT$0A)ALL$ t$8DT$(D\$AIL)F McI9vHE~NA0Mc HLL$ DD$0LL$8D\$LxHT$@D\$LL$8DD$0L$ r1 HL$hMc&MHHt@t#LLIUpTHuf.LMH1HD$XtJfHL$@HT$X1LD$pMHDT$(D\$DD$P1+T$PLDT$(D\$ID$PL)H$HH9H$G1HthI~,A0Lc HLD\$Nd%wD\$LD$pHL$@MHT$XH$LD\$6HcD$PD\$IL$Et"H9vfDMIUxUHH9wHHHD$X}JAEHT$@AAEM̿$IJr)))Ѝt)׉HL$`ޅDDH)ƃ0@1u߅tH-A-jt$`DA)t$PȅD$X~yA_LMcL)I9tHtE-HHIHLcd$Xt1HL0HL$ DT$(LD\$uD\$DT$(HL$ MAE1|$PE1LD)A)AEIL)AMcI9HHE~HA0McH LHL$ DD$0LL$8D\$LduD\$LL$8DD$0HL$ EgMcMLtIUxTHuEHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8DD$0A)ĉHt$8DT$(D\$EIALMcL)I9 HE~OA0McH LL$ LD$0D\$LltHT$@H|$hD\$LD$0L$ BHt@ELcMt"LLIUxTHufLMHrAEAOHt$@EAEŐVlAOAEHL$hHHL$XtDEڃɃH|$xt HT$x:u5Ht$@F xH|$p?HHŠwlHD$xH|$xIH|$xL$ DT$(D\$rD\$DT$(AL$ 1E)AIDLcLL)I9HE~FA0eMcH LL$ DD$0LL$8D\$LrD\$LL$8DD$0L$ RMcMKHt$xLLIUpTHu%Ht$@EAEO̺$IN)))QEHD$XJ.AE$HD$@AQdHlEEO)‰)) EHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8ƌDD$0A)ĉHt$8DT$(D\$EIALMcL)I9H>E~VA0AMcH LL$ LD$0D\$L qHT$@H|$hD\$LD$0L$ BHt@Ej LcMLLIUxTHuEHT$@DEHL$hBHt@DD$0DT$(D\$HHt$8請DD$0A)ĉHt$8DT$(D\$EIALMcL)I9H#E~VA0rMcH LL$ LD$0D\$LpHT$@H|$hD\$LD$0L$ BHt@EO LcMLDLIUxTHuEDLDIL)E`McI9Ht?ɸ%~-A0Hcɾ HHHL$ LoHL$ H͈EHfMHH D1ILcLL)I9yHtą~*A0P Hcɾ HHHL$ nHL$ HE HAEHD$@AAEM̋PAET$LAAEMA-A0_DEHD$hHHD$X8JHED$XHD$XAE9HT$@AAEM̋J+J$I)EAEHL$@AAEM̋!AEH|$@AAEM̋WAEAAT$LEMAEHD$@AAEM̋PHt$@HDN EDN(E D1IHHD$PLL)H9D$PHt_~SA0 HcH HHL$ DD$0DL$8DT$(D\$lHL$ D\$DT$(DL$8DD$0HE+HLt$PDȿdB AD)AAEM< )Љ)AE^ HD$@AAQEM̿dH))уd)¸d)щTAE HL$@AAEM̋QgAOAEHL$hHHL$XAEHL$@AEEŐQAEH|$@AAEM̋W AErHt$@AAEM̋V AOMAERHD$hHHD$XDEEHT$@HL$hBHt@DD$0DT$(D\$HHt$8DD$0A)ĉHt$8DT$(D\$EIALMcL)I9!HE~VA06 McH LL$ LD$0D\$LmjHT$@H|$hD\$LD$0L$ BHt@ELcMLDLIUxTHuAE Ht$@AAEM̋V-Ht$@H$DT$(D\$HH$HFH$HFH$HFH$HF H$HF(H$HF0H$. HHHL$`H?DT$(D\$uIHgfffffffHHHH?HH)HH)ƉHփ0H҈uAfDHgfffffffHHHH?HH)HH)ƉH؃0H҈uAEHD$@Ht$@HT$@DHvRt$PA~+t$P׉T$X$Il))D)֍t$1@u9Qd)¸9u1Am$IA)D+D$P~A)))ADx $GgQ$AA$IEM̋$$)D1ILcLL)I9H&~*A0Hcɾ HHHL$ 8gHL$ HE HAOfHt$h׉T$0DL$8DT$(D\$ HT$0DL$8DT$(D\$+HHD$ HT$0HL$ DL$8DT$(D\$A1E)AIDLcLL)I9H.E~HA0McH LHL$ DD$0LL$8D\$LJfD\$LL$8DD$0HL$ EtQMcMLf.tIUxTHuDT$AȃT$PDMcHHLLL$8LL$8hMcH0LHL$ DD$0LL$8D\$LeHL$ DD$0LL$8D\$%DLcLL)I9HtDLH HL$ L$0LL$8DT$(D\$1eLL$8D\$DT$(DD$0HL$ LDM+D$XD;d$XADO(Lc0HLNd%dD\$@E1 H|$hMc&MHHt@QLfDLIUxTHu-LcHLD$0L蚾LD$0PHE1EEMcMHt$xLLIUxTHu1 McLD$hL&HHIt@LL$8LL$8Mc0HLDD$0LL$8cHD$@LL$ DD$0LL$8D\$pMcH0LDD$0LL$8LcHL$ DD$0LL$8D\$:AAQEM)¸d)׉JdAEEOoHT$hHHT$X:FHT$hHHT$X:LD$hMLD$XA8|$X1k@u(@d@uf1@A1m$IAD+L$PA~DD)DD))Ѝt$qD1IHHD$PLL)H9D$PHt^~RA0AHcH HHL$ DD$0DL$8DT$(D\$aHL$ D\$DT$(DL$8DD$0HE-HLt$PAHcɾ0HYHcɾ0HMcH0LL$ DD$0LL$8D\$LeaL$ DD$0LL$8D\$Ht$hH|$@DD$0DT$(D\$HDD$0DT$(D\$!H@(HD$XE1HD$x'KHt$hH|$@DD$0DT$(D\$HIDD$0DT$(D\$Hp H1H1HуA)AIHHD$PLL)H9D$PHtrE~@A0 Mc HLL$ LL$8D\$LO`LL$8D\$L$ Iq ELcMtLLIUxTHuLLt$PHkHt$hH|$@DD$0DT$(D\$HDD$0DT$(D\$lH|$@EAEŐW+PP@PHt$xMcHLLL$8蹹LL$8/L$ DT$(D\$LD$pHT$@D\$DT$(L$ AB HcH0HHL$ DD$0DL$8DT$(D\$$_HL$ DD$0DL$8DT$(D\$H9McH0LL$ LD$0^Ht$@H|$hLL$ LD$0D\$FHt@McH0LL$ LD$0^Ht$@H|$hLL$ LD$0D\$FHt@Hcɾ0HMcH0LL$ LD$0?^Ht$@H|$hLL$ LD$0D\$FHt@McH0LL$ LD$0]Ht$@H|$hLL$ LD$0D\$FHt@HcH0HHL$ DD$0DL$8DT$(D\$]HL$ DD$0DL$8DT$(D\$HLcHL藷WMc0HLL$ LL$8N]LL$8LL$ D\$Iq fff.HMLD$D$HÐH\$Hl$HLd$Ll$Lt$L|$H8}pg@Ht `lHk(HEt=k@HGH\$Hl$`lLd$Ll$ Lt$(L|$0H8+DM0L9uHEtK4HH>5HLE1LuHEHAD 1;+DC@I|$ 1IH{ [Hx1H{([HxL1L)L$IALH{0Hx1H{8HHM9L`I$HID$HCID$HCID$HCC9CW1;+DC@XH\$Hl$Ld$Ll$ Lt$(L|$0H8DH}Ht :/HEEafDC9C |C;Cz0 HHHC(!HǹHHHHC FH}.HEHExf.H\$Hl$HHV(HHt$JtHcHl$HH\$HHHH8HU(1HuH\$Hl$Hfffff.UHSHHHF(HpL@KkDK MH15fDz9~{9|nu;j f|euD;J~]HHHI9vNrH9~Njz9|?uNjz9|6tm9fuD;J}fDHXHE(H_1H[]fuzf;j cD;J}WfD;J뿐H\$Ld$Hl$Ll$ILt$H(cv)1HHl$H$Ld$Ll$Lt$ H(H8t˸pg@Ht `lIl$(HU(u`M$E(MtB E1JHHEu *HEN4(1LIWI LpuIl$(Ht3HEHt*Hظk@H'`l贿1ؿ0HHID$(tHǹHHHID$ FB(u,H\$Hl$Ld$Ll$H8cv!1HHl$ H\$Ld$(Ll$0H8HP8tҸpg@Ht`lHt$jHt$Hn(HM,uYLPE,MtF HHE t`1I@LL$(1LH H L`u@Lm Mt$I\k@H+`l`1߿0Ht$xHt$HHHF(tHǹHHHHF F1fAWAAVAUATUHSHHH|$HPDEpg@Ht `l:Lu(M EF(ELAF(Mt? E1HIFu '@IFN, 1LIbUI LhuLu(MuDE1Ak@Ht `l7AtH|$L7HD[]A\A]A^A_MvML4$tE11AH$L,L`pL9IvHHL*qDDMDHHduf0HIHE(C1 LHE FA~(SH_(Ht6HG(HG H;(H{(H{ (H[([Ð?H=]Ðd%~ud%@tø'ud%ÐkÐhÐlÐHwHHָH=wÐHdHdÐSH=}ÐH=]ÐH\$Hl$HLd$H(HHuJHd =MHcHHt$HIHt$uf.1.@HtILOH=wXxjHt%HIDHHl$H\$Ld$ H(HuHcL+HH1dHdf.HgL_&돐HHHHHÐIHT$ȾTHcH=wyutT$AT$APT$APL$ԁAH L$AP4AP8IPAHHL$IHHL$HJL$fJL$JIP$I@$BB HdÐH H=w+1H9H4&wDHd HH3&1dȐH(8&uHcHcH=wTH(ÉT$Ht$|$=T$|$AHt$HcHcHHw&DHD$>HD$HdHHdHȐAUATIUSHHdHL(I;tQ1D1HOxHXt4HHL%PuAHDIDH[]A\A]DH1[]A\A]ÐHStH;Vs;t1N#N H2t#NHf.[ÐSHxHcǃ@HttHcǃH t tHcǃ H(ttHcǃfǃ[Ht6tHcǃH"HǃH t6 tHcǃ H ["Hǃ H(_tHcǃH("Hǃ(fǃ[ÐHH%ffff.AWAJAVAJAUAATIUHSH zH] t tHLLHLHJ H!It,HJIL$ ]f.t* S GH] 6uH[]A\A]A^A_H}1 +sA$ A$]@H}1 +MA$]ffDH} 1 `+AD$]=DA$]&A$] HJt5J Hu6IL$]AD$]IL$]J Ht!JHLu$IL$@]vId$]dJHbgt(JHLgu$IL$]&IL$]JHguIL$@]JHfIL$ ]AWAVAUATUSHH H4&GHGH0fCDJCfCfC5CHǃǃǃHǃHǃfǃfǃfǃHǃfǃHǃ fǃHǃ(fǃCHD$D$HHHUIƃHSPHkHD$t[HsxH91< tH|$@< EHEH9< u< |$fDEHD$I JNFHI8HHSPHl$PE1D$HD$ HCxHT$0HUD$HD$@HEHT$8HD$(@L HHD$P<#t<;tڿJH-D$V< t$uHu@H< t< t< ttH|$ GƃtH< < < HT$ fD< < < HuD$< < xHE< hfD<  fDH*HHE1ɿ |$#< "JH#D$V< L$jHufDH< t< t< IAH|$ FƃH|$ FHtHT$ HL$0HD$ HSHtkHD$@H9HHL$0HD$ 1f !Ht)H9r߄t tfD tH KHD$t@< )J HD$Z< |$Lu IA< t< t< MH$p L%HcD$$p D$D$HHTfDfD5< j4JHDt$XA A HT$(lLl$HH\$IA ufIEuA tA tA EA;1EMt[DfA;ExEHdHHIDP u&IE7EvA޿UJDHtH$p AL$p HD$Mc޿UJB$?DH$A_E7I; HH¨IdHdH2fDHHDP uIA;[dHH$p A$p HT$BAA AAMXA +fD=JHD$W< Ht$8JH,gD$C+D$~D$f+D$fALD Z7T$uHHCPHCHEJXHt$G4HT$H;T$t# HrHt$ uH9w={H &H|$(vMt}H8[]A\A]A^A_DHL$H9 $sJHrHt$ruJHHT$-uH9,$H9D$vkt7Nd%I)MqH%H|$(H8[]A\A]A^A_L$$I)Hd t̓tFuL$$L+d$뒐H\$Hl$Ld$HHH#Ax\HǾ1\$Ic¸x'HH/H\$0Hl$8Ld$@HHHd8t1d1ʐH\$Ld$IHl$HHxhLH/1H3^x*HcD$H\$0Hl$8Ld$@HHHHcd2t1d&1DUHSHH fHWH{HuuHH[]:f.AWAVAUATUSH8H|$D$D$D$HD$ HD$(1҅XH|$1҅!Hl$ Ht$@0HUHMHtkHvew\@H)HvIH‹v?H9r89r uۋZ;]uZft!fÃH)HwfDHmH{HHIHLd$ E11MADI\$Il$HH w-H)HHËH9s ;t$uˋsA;t$usffuECH IHO47AvlDC HC fAv\AH9rSfxu4DLDfAv4AH9r+HfxHxEAAL)HwAH)H DM$$MDHIH@H|$HT$H|$aHT$H8H[]A\A]A^A_H{$HHT$HIFHT$hALH1di닐Hc?Dff.ATUHSHdDeHtHHHudDe[]A\fDU1ҾSHH6ljxK HH$D$f$x2;HT$ HD$ xD$C1H[]Hc;ffffff.UHAWAVAUATSHHWHELt$ILuLpLeHEDžpftfDžvDž|xEfEAEEfE;1A MLLe2HuEHd8tHe[A\A]A^A_1(׀(‰C>xL}L0HEDž8 L@HDžHHDžPH0HDžXDž`f;1LHIuHd8tAfH/Efj` ISALDI99{LE1&fDH)HvYH‹vOH9wH9z uۋr;surIftMfu#Hd1Mu He1[A\A]A^A_ùI|$ yH8Hx HLLH(蓂L(H{ I@CM`A@t'HCLLCvBHdLCfU1ҾHAWAVAUATSHHXHEEEHEHESH] HEEHEfEI}HUHE +EH]H߉E3,H߃EH}H uIE1E1EE1IQIIHHvyvrH9s#iH)HvYH‹vOH9wH9r uDBE;AuDBfAt-fA1fAÃAH)HwfDM MdEDeIL'1dEuYMuD@dEuHc}He؉[A\A]A^A_H}IHdEuuLL'MufDH HvbDB Lj fAvREL9rIfA}u)HMEEfAv-EI9w$IfA}t%EAAL)HwAIMAEۿMiKtHHEEHHHHBHHH)L\$ILL$LMLMLLmDžTIYMaHII9M4fMI)IJHË<L91MS ;UuƋSA;RuSff%fuuLKEA~KAA_ 1A9K Du"HcI<?A9 A9H}H}fDMDM MTtK}tEHiEHuH]IT II9tA;uHiɸHH}HMHX1H 0fDMMM MVuf}HSHUDB$AA 1A9 DMHcI<tA9A9HFDLiθHuLMHiL H}H HGAAGIIfDL9IqDIy8ILpHhMH0H8IIH@LxHHHL`H}LfDf>M%H)HIAfrDI9eMAWIIwft?vffuMi0LLLOt%{ALwfI$hfAǁH@LLMS{LEHuFAFfAHHIy(A IT$HHELLMIAHvALI$fAA8H0LLMzLEaCHUBAA<BfAA@H8AIIhHhLxLpL`DMILxLmLpHhL`Ix.I@H0f fI@\fI@ ]f f111HfAp\!Aq)Ή@}߃9FH1H9r9t\AA)EAEAEt5foL:1DfAID9rDDHE9tH9wHTEM-HiLMIHVDHiƸHuHEHiҸHTu@HcLi¸LEA@~HBH}HiLLy胅TIJAAMqf7I9+IxiFYAECPAfH6H AdHHH8HHFHG%=t>FAEDHH(AHHHGHFHG%=t>zFjAEGAf.HFGAzHKHFHiƸHEVHHHsAH;AyA19DufDHcI49tqA9fAqE9IP` IPdHc}I1dEuHiHEH@I@ ELM[HQ>HiHMHEHiҸHLM0HE+EHEA;HEHEH1YSH@H`t[Ð>E1@{tT1@8:tH<@:<u@uEt@}t:1fD@/t@tt@:t1HA>띐Hff.H\$Hl$HH 3HhHHt!HHHl$H\$HHqDH\$Hl$HfAWAVE1AUAATUSHHHL|$8H|$8HT$LD$0LL$ Ht$L3HILo2HHABJEHm%HuHHH9h uHxH9LHuMT1H9uxH9t HI9wL9XJIHCHw1HHvA|,/tA,/HCH:A<$/*DH|$ HD$(tH|$ e1HHD$(H]}%H|)H|$(HHH;}%HLHL$H|(HykH;-%HL$Hi vH-%1A<$/L|%@MHQ(HH)HƒL9IGHl1fDt(HH9rI9tkMI)MINMtDt$ LT(1fnL$ fpfDHHHI9fA:wLM9tf.t(HI9wH|$ HD$0HAJ|)HT$(Ht$ HL$H<9nHL$HAH%HH %J IJJHHH[]A\A]A^A_A1A<$/H9t: H9 L濸J) HAoL濰Ju1XJ11 2ifAUATE1USHHHo8Hu8DHEHt'HHuHuH[]A\A]fIH.HxLhxHHt2HxLHmHEHEEIl$H[]A\A]ùJ1H޿ zhf.UHAWAVAUATI+JSH(H`z%H%HuHUHHH)1OrI$Ll$IHHPHUHUH9UIUAHUDHP HpLphHy%IHtv1I$|(tYHLHHy%HPH00hL9H9E@Ek+K9JHEL1pHoy%E1HH9rII$HtHUH9PPH}tYHE8uHx%HHEHUHu=J1~pHe[A\A]A^A_A}/`DWHuRJ1@pfffff.H\$Hl$؉Ld$Ll$HLt$L|$H8IMMLt$@t/LWLOMtAFhL1HMfffff.U1HAWAVAUATMSHHHu1H}DM致ALuH@DDUIdL1HUH?HDUHJLAFIv JA~fA~>AFffA~68=AF8Iv M<6HIII)I4H9O$'M9LA&H HH8HH)IH9;uLk IvH{0vHsH}J.H;M$6J8A $AT$HHHHHT IMH9I)ILHLuMAD$AL$AT$A\$us{%t'9wHfDHeD[A\A]A^A_A~u<`HEȁxELFmA~A$D莪HAdAF8fDIE1DLEDUHH)Ld$DULIDLȩI9LEDUfJDID$1DDUHH)莰L|$DULIDLsL9DUAF8HIII)JLDU DU$HZJpJdD'EHD؀}u2HUIE11DDHD$H$E1仜JH}1HHuDUHHAHHH)H|$HHHH[]HpPADHf/tt%:fDHu fDHwWAA/tEt,A:"HPOfHH<HODGHHH\$HHl$Ld$Ll$HLt$L|$$HHHA HuxH HhHHt:HHHl$ H\$Ld$(HLl$0Lt$8L|$@HHYf.1H\$Hl$ Ld$(Ll$0Lt$8L|$@HHDHHIqIE1HLDHLHHL$H8HHLDHHH=%HT$HC%H9HBHIH|H9DHHH\$Hl$ HLd$(Ll$0Lt$8L|$@HHA_HH8H@He1m_HJ0HwLDHLHffff.AVH%AUIHATIHUSLrHH1Hڄtyf<:HHuH<HHMMH1ɺJHH[I,$AD$]A\A]A^fDH[]I$1A\A]A^ùJ11 R=Sd%*LDtH)H<8GJƅIE$1HH)Ld$Gf$ILLQL9AZJsDAV(LE1L)A2L(HAMJ2H%ƒ vэA2HT@LH)H wLH)HLH)H LH)H 1AxJIHEHHU HT$HH $HH$ H1$b0H(~8Hk8IHAJH(LW8HHk8`KH1AJH11AJ1A@JH=5%蒶1HHHHBHH1AIzHJ1ҿ EHHH9HH~ǃHHxH9HHHAhJ@H@HHH)H{8uy H1AJHSD$(8JL$0HHD$D$1D$HL$ L8L $LANE tSH;AAMAH@H8D ЈHHqƅA3J11AhJHU HJ18NHHzHShHHrHpa1A JH!σHLL]AJHLLgH5%HHH! LL FU%H}<^%AJ1AJH7%HH%%HH AJfDAWKAAVHEAUATMUHSHHHlL$,HtXIAMmMt9Au uLHEtLHĸH[]A\A]A^A_fHD$+/HƄ$UH|$+1HHHH$t6|$+HHt$PL$1AH:AHE;HS%H$HT$PEIHLd$D4$H$H$HD$H%@HMLE09tLH޿J1tKHS%HH;H%HD$8dH_H(QH=R%|$+H/%H$Ht$8DLL$PL$HL$H߹pjlD$HEŁH$ZtT%0K1t$ Jt$ @HH7KHHlC|$+tHHHLtFHt$8H$DLL$PL$LHHD$D$H,$BH(HyHUhHpJLHrHIuD%D$0H HIte|$+/HHt$PL$E1ɹLt(LD$ *HH$t$ ޅ|$+HHt  H=&Q%H$Ht$8LL$PL$jlHHT$T$0D$@H$t#|$+H%HD$0D1D|$HDt$LMIT$DAIaH$T$DHt$8LL$PL$LHL$HD$H,$L;l$0A MMtNIHtHIuIHIEhHrJLHHpitXDLDt$LMD|$HH|$0HT$0<HHsIIH[|$+HD$0H$Ht$8DLL$PL$HL$HLD$HEŁH$|IDž_IH7IUhHHRHPHHT$ HT$ LILHHD$ zHT$ LMDt$LD|$HIiĐHlOIiĐHlHDžJH JLHHHL$0HpLHQhJHrHT$0pe=M%LH޿J1EH$D$ yt$ |$,%HPHItiMEHDHHa$HtMLHHǀIǀHD$ )'HT$ HǂL׹J1H޿ :$tJ1H1:HJ1Hd8:ffffff.AWAAVIAUATUSHH(FHE1I(HlL-ML%ItpEIEDIHHHH,HP HQHpHHHL$:HL$HhIEHADHuMItzMEIEDIHHHH,HP HHpHHHL$:HL$HhIEHADHuAEtCHHHH([]A\A]A^A_ICHx H@ HBHIEHu#f.ICHx H@ HBHIEHuzf./EHEFH1)/EHEL-J%I%EIEuYEIILHH,HP HviHpHH8HhIEIAADHuICHx H@ HBHIEHuf./EHEfI(HIVhHpIJHrL08MI'fMAIHHEHZEHILHH,HP H^HpHHHL$LD$LL$7HL$LD$LL$HhHIAADHuMMPI~0QL-%MAM98A<%IHHpEHEHILHH,HP H*HpHHHL$6HL$HEHIAHADHuHCHx H@ IBHHHu/EHEIHttIUhHpIJHrLLL$LL$IH@HCHx H@ HBHHHuIDžPIdž/EHIHt>IUhHpIJHrLcgIHVFIDžAf.HЀ JЀ HD@JHPЀ w>GHFD@PЀ vDJA w# HLJDJA vA9lD)ÍJЀ v&8uHH=ø)Ã@HH=]%HGHwH5\%H<%Hffffff.AWAVAUATIUSH(%H%HHYH-%HH %H# %HDmH%H AHHADA)HcHkD4A9E<$E1ۉLHtDf.D@A DBA HDHDBHPЀ w;G HFLHPЀ vDRA wGHFDBDRA vE9jDD)tvDkE9|!C+HcH@D4A91H(H[]A\A]A^A_DBA vy8HH؃u\$ID{IcHkD4A91LHL$HtHL$DD[:C L5%AAIDN43Hk LlHcHk E)DA9A4$1ɉMI| DHA DJA IDPADJHPЀ wJf.GIFTPAPЀ vDZA w$G HFLJDZA vE9ZDD)ȃtx|]D}D9AAHHk DA9DJA v8IHAM)Dl$MI܅]HcHk ADA9LT$ItT$뽾 JJ19)Hc1HkL|0;\$~0AGA9vMvJHXHDž`JHDžpJHE"JLPA'KLxLDHPHhHE8JLuHEJILMl"JIHPI8JILIIDHsymbol HH)Ll$?II}HXI}JHLH"JHHPH8JHLH;uH0%HRJHHDLH޺aJ1I$He1[A\A]A^A_LHEHEH@H8OMHULEHXLHD$(D$ Lt$L$I $HT$HUH$uH1L MuH}tL9mjI$LmHELAZL9mtHULmLA>I$Ht @<tH}tI$1QM'KtI]MM.'KAJMLDHXHHDž`JLpLx1HHhHLIHLHHJHL)HHD -HH)Lt$?ILI~HXLHLH;uH-%HRJHHDLrJH1A'KM"H]AH@HDž8L 1IHHMH9 uH8IuHKEAJJLC0LEȀ9u HF-%H>IU0uH3-%H0RJHHDHX1H<$Jm%MtI6J1$r0K1$aǃAE)I9tAu8M1IHH8t%H8HHtH9tH]E1MtEL1A9vHHHH9tՃEH`H0H(uP0O@HslDDDIiE0HlH9yHH@1d%u$dH%d4%HHx0O@Ht&slL DDL IH981HHHH9c@Ht sl$H(t d%EtIH@MHUMDLHXL $H@HT$LQH0H;`k1gIHtjI9tm19HpHH9tH,H0H;`uA<t<1D AD9vDI;\QAD9wAuA9vhIH\I%@IMME09u H)%HHsHS0>u H)%H0xJ11!HXDž8 [HIAtDIJHxLH HRLL K\AI8MHA#18H<:AWMAVAUAATIUHSHHHDD$HPHH$̓HIH$IpIF(IHhHIN8H $I]H $IpDI^AA ƨ%A@KIX11MM~0HIIdžxHlHtHIXMuUfDII$HuI1IĸL$+II@HH@/HD$HAE1HLHHIt(LHlHHIMd8"tLHfI8HL[]A\A]A^A_AdžIXIĸL9%@D$HBI1Eum&%tIdž8xMuHHHHEfDHT$H fHЀx/HPuH9HE1LLx/Ht/LH몸PU0O@HSHHHt sl HTHHlHt[HH@HuHS HZHDHlH%H`HH %c@HtHsl[]HlH[]HH@uHH0H; %wH %HJ&%H)H=vH8H- IL(L9rH)H1HL)HHH)HG(H5%H@u1ml-%1`ffff.HcH\$Hl$HLd$HHHHBHH J赼w2ڃ@H1JJPHu1#JJPJPJP JPJPH[H%SHHPH7HHH!HXH!H9tH)x[HHsJ1d8VfDHSdH<%H+@dH %HHHH< HHHD H H(HH)H1H[鱻fHH@tH0H; %vHwJ11H%H#%H)H=vH8H- IL(L9rH)H1HL)HHH)HG(H5H%H@u HH*%Hffffff.UHAWAVAUATAASHHH`T a%  H HDž@HChEEH@HXEH_HSx11EHEHEHEHtHJHHMH@HEH8 HEHRHCPHUHMUH@DeHEHEHuILL#H~ H8HHH}trL9s2AvMM.HHH MeIM9wHHH9}HUL#HHRHHIHHuILuHSpE1HRHUHHt#rHHHH9HGL,RIHN,)tMH8HHH@M9Hx?LhLpMuHxHMLpM}HLAH Iu H%H0xJ1HH8H8HEH@JHH8H8HEH@HH8H8HEH@H%HIIII1I$1I A;$cI$I$HEfxH8H8HHHDž@IEILI#MHtMI8Hk8H I9rEH=%H@fGHH^HO%IEHg%H0Ld$HIM(HHIH!Ht H!H)It$I#}H;I<$荃xCAE@bQsH@L@I|$AD$HJHHs1d8JIEI$IIFHL8L8IEHH8cH8HEH@L@AT$It$I<$貂xlMd$MHCPHt]Hp oHH(JaH%HKHJHHD1| ]HJJ뿾JgH\$Hl$HHLd$Ll$Lt$L|$H8I %L-%L0IH-%LHM4$L-Ԏ%H\$Hl$Ld$Ll$ Lt$(L|$0H8ÐSH H|$Ht$HT$HL$ LD$(HD$8 %H$HH|$H1H$uOH$HD$0H|$(HT$ H$H$HHD$HT$HHD$HH [H$H$HHD$0HT$HHT$HD$8HD$@HT$Dfffff.H\$Hl$ظJLd$Ll$ILt$L|$HXHHALDH%L0H'KHDMHLHXLxI<4pHIFtCLLHHHHOAFIEI~DDDvI'KIFKAFf'KEHuk}IA'KJILEHۺ KHDH%HHD$HL$HL,$HHD־J1ZHt$ DvIyfff.H\$Hl$HLd$Ll$H(%AIHu/H %HtHHHDH\$Hl$Ld$Ll$ H(H=ً%JAJJLD1HLHDHltHHH(lHt0HHD=%H@[GHHlHx HPHxtÐK`KH9tZHH)HHH?HHHH9w.fDH9Ht0H)HHH?HHHH9sHJH9u@fffff.UHSHHHv賧t'H[8Hu,@H[HtH3H茧uH[]@H1[]UIHAWE1AVAAULmATIE E1SHHXHDE~1EIcAAHHDŽ LR%IEHHt %t uHIcH)HHHt HA%tU HQHcIcHHe[A\A]A^A_ftH%ufDHHpA 0*A.HFZGHXuL<%stA /IAA H8Ic̉HLHH HLH zHcH9HGH cLPH1Hc A諮L9LvHL9 wE:E H9bAT$HcHHHXPAlHH1uA /)IQA H:H0L\$IISH8x HDLDLD1豭DDLLAHMcH)I9~II)ÐLIHIKDI9IcAHH H vfDx_HHpA0A*YA/IAAHDHF.7~*H^[A/IAAHHFIcHHHDŽAIAHPIQtA /vwIQHJII:9IAHHIIIcHHDŽHIcAHHHDŽIQHJIIIQA :IAHPIQHH)LDHHT$0HaGHL$8LD$@HH)H$LL$H)z)r)j)b)Z)R)J)BH$H1$D$0HD$HD$ HD$Hffff.HHT$0HUbGHt$(HL$8H)H$LD$@LL$HH)z)r)j)b)Z)R)J)BH$H=%$D$0HD$HD$ HD$gHffffff.HHT$0HcGHt$(HL$8H)H$LD$@LL$HH)z)r)j)b)Z)R)J)BH$H=:%$D$0HD$HD$ HD$Hffffff.H\$Hl$1Ld$Ll$IH1wCIx/HƿKXxHD$0HI$u9I{;LH$H$L$L$HĸE1AعH1tI벐ATKYUSHH=AwsH=,%H>HxHdHHH5%HHHKfDx/HPuHH9wHH[]A\@<$[tt)Al$Hcŀ</uuDHcŀ</tdAu1PdHHt(AtRHcHHHH[]A\fHHH[]A\f.A|$HcfDf/CH\$Hl$HHd%uq1H\$Hl$HH-΅%HtLHEH1wH|HHE1h%HEHtHH|HEqHEHu뙿KcHHi%tHXH1q%HOqYH8H$HL$HT$Ht$H|$ LD$(LL$0Ht$@H|$8 eILL$0LD$(H|$ Ht$HT$HL$H$HHAffffff.H H$HD$HHH@HcH$LD$LL$HL$Ht$ H|$(Hl$0HC0HD$8)D$@)L$P)T$`)\$p)$)$)$)$=%u1I۸L1u1Ѓk%$$$@$$$$@$$$$$$$$ $0HHS0Hs(H{ LCzaIHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($by)$yt $o$D$@bq)$yt $o$L$Pbi)$yt $@o$@T$`ba)$yt $o$\$pbY)$yt $o$$bQ)$yt $o$$bI)$ yt $@o$@$bA)$0yt $o$$LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I APy0y@HSHs(H{ ^H$HT$(D$(L$ y)$uoD$Pq)$u o$l$@l$0HH$H0fHHS0Hs(H{ LCx^IHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I y0y@HSHs(H{ ]H$HT$(D$(L$ l$@l$0HH$H0ÐH=%tHH<$`f.fffff.HH<$`;ff.SHWHE1E1HH7HGHHD$$HHCH[fSHWHE1H0H7HGHD$KHD$ LD$HD$HD$c HD$$?HCH0[DSHH1HHh%wL >%D/%H$H?+jHCH[ÐHHlGH<$HT$?H|$0Ht$(IHD$KHD$(H|$(Ht |$?u HH@iHHfDHT$1HtHHT$HBtHwlHHf.H8I0lGH|$ HT$/Ht$HD$H|$1Ht|$/uH8f.D$7iD$H8fffff.HH@lGH<$Ht$H|$0HT$?Ht$(IHD$(H|$(Ht$1|$?u HHfDh1HH@HT$1HtHHT$HBHHHHlGH<$Ht$H|$0HT$?Ht$(IHD$(H|$(Ht$1|$?u HHfDKh1HH@HT$1HtHHT$HBHHH\$Hl$mGLd$HhLd$OH\$@Hl$8LD$ H|$ t$(HLHHD$@H|$@Ht21|$OuH\$PHl$XLd$`HhDg1HD$0HI๐lGLHHD$KHD$8H$H|$8Ht-|$OuH|$0ܲHD$0D;gfHT$1HtHHT$HBtH|$0Hwl蕲HD$0:dH%HH@ff.H@dH+%fHHH$H|$HHt$Ht$HLD$LL$ LT$(L\$0HT$8HL$@cH$H|$Ht$LD$LL$ LT$(L\$0HT$8HL$@HP HHH$H|$HHt$H5LD$LL$ LT$(L\$0HT$8HL$@衆H$H|$Ht$LD$LL$ LT$(L\$0HT$8HL$@HHg UHAWI/AVAUATSHXH}HUMϑHt!Hx/輑HtxHXt1E/L蓑Ht!Hx/耑HtxHPHUj8|A8uAG:iDEH}HMHUL߫EHEHt6IE1 II<$tL ID$MHuHEHHH)HxeVHHEHEHHUHE1HGHHHHH)@HUH{L}E1HEH]HMHEH]LeHHH)MHL8Ll@IO0fD1I|$uHI9\$ID$JH4HEJ|0蝏uID$0HEHtHUH}Jt2 Ѕu\(bUHIT$ H@ LHIT$(HPIT$8HPHUHPIW@HtHJ HR HuHMd$M2HUHH;U}HEA BT0TiHcHTHIGIHHEHUIGIhI8H;UHEHUHEHe[A\A]A^A_HMQ:grQ:sgbHdHHLL蒩HH!HLHH)Ld$ILf//@Leg AG: gHdHHLL)HH!HLHH)L|$ILf//@HdD#HuH}dD#EHEH}HdD#t|HMH}H]HHHHHH)L|@DM/Mu 'fDMIEMu HLHI9wݸHĘ[]A\A]A^A_fDL M,u@HL$XLl$`Lt$pL$Lt$@L|$xAFLT$hDDAfH41ۅHt"H DHA HHAuI44LHL$H$IEH$HL$E1D$$L$H$Ht$8H|$(I AփlAUHD$0DLl$`HcLT$hLt$pL|$xHI9vuAE;rmHT$LT$ H9T$ PHdHHf`uVPtBHD$0HXHI9L9|$0SNfDILT$L돸0HD$PHhLHD$0HA(I9r1);kw)‰1s9_H 9QH$H$H|$@HH$nE1HLH$D$$L$Ht$8H|$(T$@6t]H$H$HSt!EH$H$H-HT$PH$IcHHH1HD$PH$HH1H$HL$PIHL1H=b%HSHĀdH=b%HHĀHHcdHHÐHHfH~H!H>H1HHH H?!ÐHfH~H!HH)H?ÐHD$T$HD$T$T$L$ T$ȁ% ‰ к)!ÐHD$T$HD$D$T$L$% D$ɉ  ¸)ÐH1dHfffff.HdHH1dH>'fffff.HdH 'H1dHIfffff.HdHIAWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH @KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$(qHIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,@KHHH @KLLpHII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHHjDIłHI)HHA I)DHDL$H/QiDL$EEHHƁd"LʼnrkDHHl$ H\$Ld$(Ll$0H8VfDH~Eu"H\$Hl$ Ld$(Ll$0H8ÐfDEtSHHHHnH~ZDHWd!DHuDHHHfDH/1HAHA HnHHhH Hfff.AWIIAVAUATUSH(HAH|$8HD$PHD$HHX@LD$(LT$ H`LD$(Ld$8HD$`LT$ HDŽ$I@hIIA,$HDP u@-J @+D$p` @8HCLt@~HH@8HH)߄uA<H+$1H9HT$hHHDB@Hd"4HL$HM1@0tE@tJ@8H|$HINDHHE8kDOIM)EuIMIA.IHt$HLDHHD8>IM)@uOLHPPHT$P}HpHHt$H>ڃ@T$8Dރ@%@tT$D$1HD$@@H16AWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH @KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$NHIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,@KHHH @KLL1NHII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHH%DIHI)HHA I5>DHDL$H/FDL$EEHHd"LʼnrhDHHl$ H\$Ld$(Ll$0H83rH~Eu"nH\$Hl$ Ld$(Ll$0H8ÐnfDEtkHHH HHHgHH!H-JfHfWd!ofHuDHHHsH/1HA4HA HnHHEHH HfDAWIIAVAUATUSHHAH|$8SHD$PHD$HHX@LD$(LT$ HqLD$(Ld$8HD$`LT$ HDŽ$I@hIIA,$HDP u@-R @+D$pp !@8HCLt@~HH@8HH)߄uA<Ht$@H$H>H( H$HH$rH3 H$HL$PHH|$@LuNH)NH49 H$HDŽ@HH$H9L$8HH)ÅHHH$H5SHDŽ$D$`D$8H$~2Ht$@HcHHf.HcH@H HuHxcHsHHHH< {HrfLD$@1fDHHHH9fAwH9tHD$@HHH9}|$85HDŽH@<HEHD$XT$HfDL9HtMJ@HHIHHLHD1L9@L)H)H9w uJ;@v HLsHT$XHt$PHH|$@fH;@tHt$@HT$PHHH7T$HJ@H@~,T$H BHcHcH@H@D$8mH}HH$?HcH)@)H$55@)щT$`HHH$xHcH@tA?D$D+D$`HpA T$pH|$hMcHh2H<@eu |$XI9ML7fDH͋ aDIIA)IA,$D$pf.fWIA,$fIL$I@pIM)@uOLaHPPHT$P}HpHHt$H>~ڃ@T$8Dރ@HHu91ҹH HH H HD$D$1HD$@HH fH1AWLZMIAVAUE1ATIU1SHH(Lt$hLD$`HMVfDPЀ vMt A:LKTHHLlP~%uI$HM/@0I$E1IH~)HcH9I$HcH @KH1M/I$H(H[]A\A]A^A_ANz:KLHtLzHH@84HL)uH"H#NJLLLD$LL$LT$L$,HIL$I$LD$LL$LT$ILL9M/w%1E11HI$I I$HHHHHtfDII$HcL,@KHHH @KLLa+HII$IIL9M/w(1HI$I HI$HtHHHHt¸%볿ffffff.H\$Hl$HLd$Ll$H8HAHH¿%DIHI)HHA I@^DHDL$H/.$DL$EEHHd"LʼnrhDHHl$ H\$Ld$(Ll$0H8OH@~Eu"KH\$Hl$ Ld$(Ll$0H8~KEtcHHjH9H+v|HnHHs#HH H@tNfDHd!oHuDHHHHyHH?Չ-?H/1HA?HA AWIIAVAUATUSH(HAH|$0+HD$PHD$8HX@LD$ LT$H@OLD$ Ld$0HD$XLT$HDŽ$I@hIIA,$HDP u@-; @+D$dF @8HCLt@yHH@80HH)@uA<H$?)HHD$@HT$@HL)HDރ@ڃ@T$0H$JHL)Ht$@HIM)@uOl IAmHd"3Ht$8LDHHD8i>IM)@uOLLH1vH4Hnɸ@)noH~H4HL9~#IK HwI1L9K>Ld$(H@HD$Ht$0HHHHDHHD$(IŋD$8Ht$HL$LHNI)HLl$8HD$ HHHt$HLHT$HHHHl$@Mt$AHl$ "Ht$HLIK>L9~$IJLHwI1L9K>Hl$@DHL$ L<HT$HD$LHHL$(H LHT$@HHD$HT$0HHt$HHHT$0HH}IHl$8AIHl$((Ht$HLIK>L9~$IJLHwI1L9K>Hl$8DH HHt$H~L4HN|5I LmL|$AIHl$ %Ht$HLHIKD5L9~%IJLHwEI1L9KD5LL|$LD$@HT$HHLO4K@HT$Ht$HHE1`D$8HEI91fDIHTHH9uHAH9G1fDHHHHHH9uTHUHAHEI9HHHH611@oDHfAHH9wH9gfDHTIHH91SHHD$0HD$HH9D$0HHHHH|$LD$011DoHfAHH9wH9HL$Ht$0DHHHH91}HFHAHD$HI9HHHH?H|$11fDoHfAHH9wH9xHT$fHIHH91HHM@CHD$HH9"HHHHH|$11fDoHfDHH9wH9IHL$fHHTHH91L4N|5IKHHL$(HLHL$H|$LL $L $LHLL $L $uHLLHHHMH<HHLHK<~cMD$Ll$AMM#@HHLIKHI HD$(HHD$HLHHL $L $HT$HHIHl$Ll$ IMALM&fDHLHIJD=L9~$HK HwI1L9JD=MHl$MLl$ xHH+LcN<IJT=HT$HLe,fLLL2HKH2H:HywHĀH;HxHĀnH:HxHĀ몐Ld$IH\$LHl$HHHMu1HHl$H$Ld$HHLHb,I9t1HHʐHP+KKHtHwlHÐSHH0HwHtKu H0[HT$(1H#HHD$(KtHD$(HtHx0uH{ff.~@HHuH$`lHþ&HlSZuffff.@Hl$Ld$H\$HHHI#Hl`H$HtnH{Ht{uOHCHSHsH{MH`31H{C1H{Hl$H$Ld$H@f~@Ht=$ZHHq HHt! @HL=$H\Z9`l/=$ $ffffff.U@SHHHD$p#Hl_~@H6=H$[YHHCt8HCHt!KHtHHCHD$H[]fHsHt;Ht$utTJHSII'KH|$\+K:HD1THCKHHD$HCCH[]HsTJH蝂HSII'KH|$Ic+K:HD1}HD$또`lfDHذq=$ $DSHH0HwHtKu)H艰 @Ht =$12XH0[@HT$(1H#HHD$(tHD$(HtHx0uH{-ff.H8H5-$HtKu H8DHT$(1H#HHD$(tHD$(HtHx0uH=׾$躯붐11tt11DH1fD1H(H|$t$ (HHH $HT$H(ÐSHH{ vn+K111B0fC$Ő+KfD1HHHSH[HCHW0H[HCH8[Hs1[D@Hs[1H8H{['HCHHHH[ÐKvH8H<$Ht$@)HHT$HL$ 1uH|$DH|$HD$H8SHHH?uGwHW 'KHL $D$HHDH.$1H$խHCH[ù+K11.=$uH&$uHG$uHU@=$uRH{&$uHGn$uH@HdHDHxlH%H%IӉH?H?fo-fo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс%I0%HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)4$NLM9b$MY$MHIffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс#I#Hfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс#IQ#HffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)"foNLM9"M"MfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс!I!HfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс!IU!Hfoftfu IvfIf.fo fsfs\ fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)? foNLM9i M` MfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfs fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIOHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс.IeHfoftfu I vfIf.fo fsfslfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)OfoNLM9yMpMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсxIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9)M MfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс(I_HfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftf€u I vfIf.fo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI%Hfoftfu IvfIf.fo fsfs,fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM99M0MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8IoHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9 M MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсN I Hfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)o foNLM9 M MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I5 Hfoftfu IvfIf.fo fs fs < fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9I M@ MfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHIHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI6fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI/HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс^IHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIEHfoftfu IvfIf.fo fsfsLfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)/foNLM9YMPMfHALWIIfI6fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXIHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.HI)v H )1fff.H )ÐHdHDHx}FHU HZ IӉH?H?fo%3fo-;fo5C00oofofDofDofDofdfDdfDdfDdfAfEffDffAfftftffсIHHDHHE19t&wAБHLHI)L_Oc O A@fofftfofofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)NLM9MMHIfH@fofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvxIOfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvI7I)HL H )@ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9-M$MfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c&I}HI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9=M4MfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c6IHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9% ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)+foNLM9MMDMfHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cPIHI|fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI3HfIfoDfsf:c:L9E 7ffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)KfoNLM9mMdMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIEH ff.IfoDfsf:c:L9U Gffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)[foNLM9}MtMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cvIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIUH ff.IfoDfsf:c:L9e Wffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)kfoNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIeH ff.IfoDfsf:c:L9u gffofoftfs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD){foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIuH ff.IfoDfsf:c:L9wffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c.IH ff.IfoDfsf:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c I HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c> I H ff.IfoDfs f:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c I HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cN I H ff.IfoDfs f:c:L9  ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foNLM9 M MfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI- HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c^IH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI=HI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cnIH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHA LW IIHf.Ifof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIMHI~fof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c~IH ff.IfoDfs f:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9 MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cI]HI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9ffofoftfsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foNLM9MMfHALWIIHf.Ifof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cImHI~fof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cIH ff.IfoDfsf:c:L9s fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cffff.s_I)vZHJ|EtH )H<H4EtHHI)v Hh )1fff.HC )ÐHl$H\$HHHHt't~u2 H8t5uDHE@HHl$H\$HfDH谌HtHHEfDH{ԑڐHdHDHx=%H%H %IӉH?H?fo-yfo5yfo=z00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс)$I@$HHHHE19t&wAБHLHI)LOc O A@fofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)D#NLM9r#Mi#MHIffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс"I"Hfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс*"Ia"HffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)!foNLM9!M!MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I!HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс> Iu Hfoftfu IvfIf.fo fsfs|fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu IvfIf.fo fsfs<fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu I vfIf.fo fsfsfff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu I vfIf.fo fsfs|fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu I vfIf.fo fsfs<fff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftf€u I vfIf.fo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu IvfIf.fo fsfsfff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu IvfIf.fo fs fs | fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_ foNLM9 M MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I5 Hfoftfu IvfIf.fo fs fs < fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) foNLM9I M@ MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсP I HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс I Hfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9 M MfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIGHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс~IHfoftfu IvfIf.fo fs fs fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9MMfHA LW IIfI&fo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс>IuHfoftfu IvfIf.fo fs fs |fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_foNLM9MMfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсI5Hfoftfu IvfIf.fo fsfs<fff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)foNLM9IM@MfHALWIIfI&fo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсPIHfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсIHfoftfu IvfIf.fo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftfffff.ID H<H4EtHff.HI)v Hxc )1fff.HSc )ÐHt;H9t6HIpHDDHAB+u EtHufD1ÐHH9tu1ÐAUHW)QΠEATUHSHHHHH?HH H)HiQH)Hy/@HHƀQxHQ~f.HQHHQHH|jYHHYHHH?H H)‰UHiH)HHHHH?HHH)HUHH)HH)H%I$I$IHH؉uH?HH)HH)H)Åۉ؉]I ףp= ףH3l>,fDHIII?HHHL)HHHH9uHL)HHHH9nH9HIIHHH?HH)HHL M)MLVI?L)ILMIL 2ILIH?IyILIHIH)M)I)O$MI MO$HIM)MII>I?KLL)H?H)HHHI)HII?L)II?LHIHIL)L)HIAHHHIL)HH)LIL)I>HHHI)LH?HJL)H?HHH4HHH4HHLH)H?H)HH2mH9yHEHH9tHdK1[]A\A]fDHMuMHH ףp= ףHHH?HHHH)HHHH9uvHH)HHHH9t^1H,K CH9|H)uAE []A\A]HSH9E띐AT1EAQAMcUHcMcSHH@A)A1AMcL)A)ÉA)‰؍,l)D)AD)DD$G$D)AHcD$8AD)I)HcD$0H)HcD$(I)HcD$ H)HHHHƉ)D))HcHH[[I]HHA\H)HHHH)If.AWAVAUATUH*SHHHOH$WDG D$xG $O$1҅ ‰ȉT$@HcS)Ɖ4@)ω)HHHHT$8;1?HMcD$|<:H4H‹|$xHH$HcH40H6,KH$HNLD$`|$x;HD$H;D$|;HD$8QHc$Hc$L$L$8H$HHt$hD$01H)D$0H|$XD$0L$0E1D$0))ȋL$0)HD$8T$DT$TDD$THFHHHA#+D$DHT$`HHH@HLHHH)HLHHH)Ћ$HcH)HD$HHD$pH$0IH$81HHHc~1LcN@)QA)A)DLcF)HD$XL)IHD$hL)IHD$8H)HHHHc~HH))HD$`)L$0L$T+L$DHcHH$8H@IHHHH)IHcJII)I)LD$HIH9I?D8u&HHHH9~ HAH9I9u4L;$0t*$|$@Å8AA1ۃ$L$0LH$0H$8LHHbH$8E11HH`L$D$H$MHI.HL)HLH$8LLAHtIHHHH?HLH9HyLH)HH9 H$H$H+D$p$9T$xH$N<8HL>H$HH$HSH$HSH$HSH$HS H$HS(H$ HS0:IHL9HA f.HHH[]A\A]A^A_MLHMD$$L$HH$8HwfDt$xt$|Hc|$|H|$HAHH ףp= ףHHD$8HT$8H?HH)HL IL9L$81HufDHhLL$8LHPt$@H$$xy;T$@tsxop, Hl$0H\$X@DŁp, HAAAHcHH9‰H$(8uAtHϐIDD$(H$H$(T$0HDD$(tL$@9$H$8fL$(1MtDt$D\$HHDD$TLt$0>fLH)HHH$(H$H$(AHtHLILH?HHI9tMyHL)HLDHDt$D\$HHDD$T9H0DD$(H$(H$H$(T$0DD$($$$Ht$`D$DD$|D$$H|$8H\$XHl$0D$$D$$$sH$(HH9@H?@8u(HHAHHH9HOH$8LLHH$8ID$|E1u E1$HcH40HT$x6,KEHH,(Hl$P|$p;HD$@;D$t;L|$01QHc$Lc$H$L$(H$IAHH|$`LD$XA)E1DDD)))HD$0T$<T$HHFHHHD$H+D$z .z tu  7$1҉<=y y tu |7$`1҉}<D=y y tu $7$@1҉%<D_=py `y tu D6$E61҉;=,yr y tu Ds6$E1҉s;=x x tu D 6$E1҉;W=xZ x tu D5$E1҉:=cxm Sx n[=q5$1҉r:=&x x - 5$1҉!:`=w w 4$1҉9=w w ~4$1҉9HdH []A\Ë= 0$D5/$1;9fDv tu =3$ 1҉83$u 3$o u tu  X3$d 1҉[8A3$u )3$5 tnu tu 2$ 1҉72$u. 2$  u tu 2$1҉7t tu D%=2$E1҉=7|t tu D1$E1҉64~t tu D1$E1҉6Jt tu D e1$E01҉e6t tu D1$EP1҉6\s tu =0$B1҉5st 0$1҉5u0$u|]0$@1҉W5=0$u%0$aJ@1҉50$u/$l@1҉4/$u/$@-j+$h+$H []A\1҉4}/$ue/$@1҉_4E/$u-/$@1҉'4 /$ut.$@1҉3.$u\.$@1҉3.$uD.$@1҉3e.$uM.$8(@1҉G3-.$u.$QA@H|$-KFH'fDI|$-KEH OfDI|$,-KEH1wfDHd9I|$@-KiEHTAfDHd9!!Hd999Hd9qqHd9IIHd9aaHd9yyHd9Hd9I|$T-K9DH$ifD1҉1+$u\+$\L@I|$h-KCHYfDI|$|-KCHfD1҉o0U+$u=+$ @I|$-K9CH$nfD1҉0*$u*$@1҉/*$ul*$@I|$-KBH^fDI|$-KiBHT@fD1҉7/*$u*$@I|$-KBH)ofD1҉.)$u)$|@1҉.})$u|e)$@Hd9Hd91҉%.Hd91҉-1҉-Hd9Hd9mmHd9Hd9Hd9Hd9aaHd9Hd9iiHd9Hd9qqAWAVAUATUHSHHIHt$D$0dAdAD$0 woHT$0Ld$(AIHT$HI;L9wBHT$( .uV=w.L9w)BHj0 wH1LHWBHuT$1dAHH[]A\A]A^A_u7H9tH+\$9-KrH|$t  D$0HT$D$dA|HdH7Ht HDN tHƨdH6H6Hv@HdH7fDAWAVAUATUHSHHID$0dAdAD$0 wlHT$0Ld$(AIHT$HI8@L9wBHT$( .uV=w.L9w)BHj0 wH1LHAHuD$dAHH[]A\A]A^A_Dt|HdH7Ht.HDN tH9tH+\$;-KwT$ D$0dAHƨdH6H6Hv@HdH7볐AWAVAUATUSHHHt2 HdaHH[]A\A]A^A_Ht$0D$011f.HtDxЃ we>t@tA@:H5Og1ID$HD$t$dL9MtbI$E,ED-KH$IuA:5\$tbA<$IFH9D$HAnL1AD$dL>Lt$ofDH;:1nH|$`LL>D$0L$LtIFH9D$+AnAH|$thH9D$ +\$~8Ht$HcÃHLHD$ HpH)fDXHHH9uHD$ HHD$(HB!H9D$t1A.IFH9D$H|$0D$0E11+HtyDEA wFDt ESEEk BlЁ:@/uAA%륅. AH1|AL$0Afffff.Hl$Ld$HLl$H\$HHHH(IMH]HHH vHGhHRH@T HOpH4RHHqHt$FSHHHIQLRILAPd%A6HHT$D $AHD$HHHlId%uvHD$Ht1MtIHX@  $uH]I$HL%HHl$0H\$(Ld$8Ll$@HHfE161d%wdH<%d4%HHQd%AFH^H KHAUHvSHH(HH_pHGhHQH@J H*H4IHHsHHt$FHHHRJLRILEHEd%A6HHT$D $AHD$HHHkId%uPHt$1Ht MtIHFV t( $uHDH([]DE1eH1d%udH<%d4%HH{d%A&$H\$Hl$Ld$Ll$Lt$H$H$H)H9HCH)H9 $H{$HHL,PAUHt@He$IIN,+IUH H9{AMfH H9aIL$ $A 9$9L%$L$9svL4IKL2Hd<%t$T$DD$HHO42 AMIO fAIM1fDd<%to$A f$9uAUfd<%tAD$ԋD$9K$vd<%t6$D$ԋD$HHH$fAEAEH:HrBHH$Hf@d<%t$d<%tBH\$Hl$Ld$Ll$Lt$fDIUH*H9TDIN,+AMfuIU5EmHd$EIN,+UHAWAVAUATSHL$AIHHH)H H9L%$1HIHMIfDH8H9s5LH#H9uLHKT HP(M!L!L9IGH9HGH8H9rHHIH(\(e$$LdHHIH=l$LH)HHd$HHXHHHH12$"$2HDžP>HDžH N]LuL}HMH]HsecondsAFEEHXHEHEh0H=$EIG H]Ef@@EsLMH=$H=MHD(H5$HH)H\$HHq1/H5$Hx^1H.profile@HB1HQAHƿ"x%=HAd.KDdD0?H`D[KHHL16He[A\A]A^A_$HDžPHHDžH[HA.KdD0sfHPHXHPH HJH9Pt8DzH c$Hھ.K1DHH8HPE11EHDH(L(HXH MH@IPMlIEL-e$HN$BLLuFAPu>Ix(LL(L0/L(L0u AEMHPL;H11HOAK.KHH$H81HBHH)HD$HHH@&/H5$1DHH#PHAfHa$H@DHH#PH[Hd8tA/.KH8KALL2@t ftHzA@L(@@1t ftH$@HHHXL(L0CHHQ$L(L0H.$LX9$/$ NL$9s$HtdHkL$H$H LH =$LZHHHH=$HHHI<8LfOf0uH$I)L9Xs01LHXHƸHwHv91HHXHL(%$HHI9vFHXL1HH1IĸIf5'#fL1HHX1HHZHHHHkHHHPHPL.K1zUHH]LeLmLuIL}H@IIE0O@HtslLh~wLhIIH=$HEHUHuH}LppHLeLMHEHELpxLmHEDuHEcALH}+c@Ht sl輊HEH]LeLmLuL}fH=$]H$MMI,M1H$HH=$lAHHHt IL9wL9L1Lh蔁Lh@IiĐltHlTh/K1L)H.K1ҿH}Htu $Hc@Ht sltHuH1HHHHH<H;}tsHCHHH)Ll$IL蓃}uCHuL1D~IiԐ1 HlID$ǂlH/$H}1HHHHHBHH)Ll$II\LH]sc@Ht sl蒈8/K1L}fffff.AV1AUATUHSt3FLH<1DIJDHH9uHE0H HHHlHCHtwH{D:L9tGL1fDIuHKH H9rHCx1[]A\A]A^fDHC@TH<HSHLcHAT$I4$H貁I$HCxI@HHHlHL4HL)4HItLHSLHHYHCLsL d%u:L*HCxHCHE8.K1ҿ H0|$AW$AVAUATUSHHXL'GLD$,&HH$LsH- $HPlIH\$0E1HHMtLfM;@r*M;Hs!A@LL%*MmMuH-$IL9v LmHŐHH\$0LK(IDD$,1HLA8HHHC jHcT$,@HT$8THDD$,111HA(t4E1HDHHx(H<AA9rHs(1|@HD$0| $Dl$,AIIID$HuE1Lt$0Md$ ID$(u!EuI$1DLAiI9uNjLE1E1)f.uI(AA9HDL4A uIHHSE1L9uL9IJHuIHIxH9IHIAA9N,k@EtH $HHH $EHK@HS8Hs0 7D$,HD$80 $@#HX[]A\A]A^A_E1fDH(fH\$0LLK(I*HLM0LK(11AKD$,A E1H&@HX[]A\A]A^A_LK(I/LLL$1"HLL$HC(E1zIXH9HT$@t HHHHL$HLD$DL$HT$HHIHL$LD$DL$IILHL$LLD$DL$LT$ |IH9|$@LT$ HL$LD$DL$LMtÃDL$ILD$HL$HD$HIx/K1ҾI vLAtd%u7LAJ#ALT$@HD$HIHv/K1ҾI1Av/Kx$@tHP0Hp/K1+D$,eXHXH[]A\A]A^A_HU0/KHuHX1[]A\A]A^A_H\$Hl$HLd$Ll$H)Lt$L|$HL.HHL9LfMN,*M<$HL)L9HHIHztH =$HBHJ H;=$H!$MHpTHL)HITDI9H HHHtH=$AfHHHHztH $HBHH 0H;=$t=H\$xH$L$L$L$L$HĨHY$HHt@HH)HHDH9gHHHHtH=$fHHHT@H9'H HHHtH=$>fDMt$MO|=MHL)L9MFMEO MHL)L9MPMOIHL)H9SIBHHD$8|IHHHT$PHH+T$PH9HVHHT$@HD$PHt$@HH)HD$hHH9iHVHHT$HHD$hHt$HHH)HD$`HH9HVHHT$01HD$`Ht$0HH)HD$XHH9iHvHtMHT$XLD$LL$LT$ L\$(HLD$LL$LT$ L\$(HL$0H|$XH9H=$HH+T$XHL$0HpHHTHt$H HHH!H|$XHHDL$H+t$XH9rHT$HH|$`H:U11fHHIT@H9H HHHtfHHIHztH n$HBHJ 0H;=?$HR$MHptIHL)HITf.I9H HHHt+fHH}@HHIT@H9H HHHtfHHIHztH $HBHJ H;=$H$MHptEHL)HITf.I9H HHHtkfLI<$#HHITH9H HHHt+HHHI|tHH$IDHJH;=$:H$MHpt@HL)HITI9H HHHtLI>5HHITH9H HHHtsHD$8HHHHxtH 4$Ht$8H@HH 2H;=$}H$H|$PHPtAHH+T$PHL$8HHTH9|$PH HHHtLI84Ht$8HHHLH9H1HHHtHBHT$@HHHztH q$Ht$@HBHH 0H;==$HP$H|$hHpt=HH+T$hHL$@HHTH9|$htKH HHHt+LI:7HL$@HHHTH9vH HHHtHt$8H|$PH>HBHT$HHHHztH #Ht$HHBHH 0H;=p#H#HH+T$`HL$HHpHt$HHHTH|$`HHDL$HH+t$`H9sZH HHHtJHBHT$0HHHztH #Ht$0HBHH 0H;=#THL$@H|$hH9f.UHHHHAWAVAUATSHH#H9t#@= He[A\A]A^A_Ë#BH0HiϐH}HlHMHH@Hes#AĉEID$HHH)H\$H)JLl$HHHIH)HHT$HHHUt%H1HH@HHuL1HRL1LE9MHcHUA|L uHI#HH9=ADIAǁHtIHBHRHt<tHcҀ<uHr9NHHHuIHCDE71DHtt$HcҀ<u9JIDD9rƒ9MHMH}HL+M̅L}IE1EEE1EAHx@A>I+m#HHtLHHH H HPHҍBt/DmDeIỈfD؃AăuLDeDmHHt HHB A<]E9EGAIID9m0EDeHx=#HeHEHu`#A<h<pHv1AHLMHHLE1HFHAHtH9t $uHFIHHuEILXdI9LHEPE1"fDHt J I1L7HMt$L9t A$uNL7IHMuII9JHDXxtUDXD@uHEHxHtHǃǃHHtt HǃE9EGHHzHytfH<uPHHHAH2ECHxH`HhLpDXHHEHMHH`HhLpDX HE1LMAHu1qh@HEhUHULRArMFI u PI  tЅuUǍ9t9oL11DH1 u9tAK4ȃH9rAzd%0O@Ht sl+\u9ugAE1E1EIDHUMA<MHH(HvHC HHSHPHEhHCHtHS HP HH8HtHO#@H{LeH{8I HtHߋGH_upHuLLeHXHHXH9t@xAHHt%HHtH AD9mv#MMHE1E1Ec@Ht slzn}t$H#HHH#L;5#tRHUH:HuF"f=#}#HeHCHuHHaL=W#1o/K1Ҿ1K AcHsHU0K1MmIHw1(0K2mH#HBH9EFHiҐH lHH HHH޿x0KkHS0HsP0K1lH5#HtKHH1LpLhLpLhuHf#H?#L@IvGMM9ML+(M9H#I9I9M9MMEH#H#}u }uH#HH8 ,#L%e#MI$HHI|I$EE,L=C#MMEL -#EML+(MtMEfSHu;t30O@Ht slWH-c@Ht [slXk[Hw1K11`HH@HHH)HHH9t H0O@Ht slWc@HtֿslHjfff.H\$Hl$HLd$HHHHHoL'HBI9tH\$0Hl$8Ld$@HH@0O@HtslHt$VHt$HI9t"fc@HtslLjf.HFhU HqGHxHFpL RILHLL$(AAAAHHt$H@P%L@ILA@uE1AHHT$(AHD$$H=LL$(Mt4H@Hv;HEIAH)HCHpG @HHEHCHpGHHD$MHD$LL$(H@륐IH4HDHL[HNL@LXA L9AuBxHkHHHHEHhHEH@ddLHhL~IE1IHIGhI_TH@L}}HEHEPEHHHhE1HX%@Mt DAIDHHHHWLuLs$LHHNLHuLEHUH}IHE&OHuHHE`xH0H}xHT$HHBHBHWៃ HU.IIE1MtfEt$DIDC|6HHH EHxLIL8AL2TJTHL0I]D L(D)L8B9OJ4JHEBTHXHxIH`LHpt HpV}He[A\A]A^A_H=t H={LuLs$LHtLH;Hu9#HuLEHUH}IHHuAHH0HXHD$HMHHXHUHWtHMDAILHUH`HXHAៃ HUHJ Ht HRHQHUHJHt HR HQ HUHHHI HJ HPHMHJ HUHJ HtHQHUxHuH9XHHHJ.HXAHE1HDHHHHBHH)H|$H1Džx]H}kyH;Vt2HHqHuHXHƹHXHEHXH}HFHqH;uHvHDHqHr HH}Ht HRHVHMHQHt HI HJ HMHPHR HQ HPHMHJ HUHJ H,HQHUIW:u HtW#H2K1O!#H}LEHUHuIDH}H}=1HHHv=W#e1HLI8HHHHpHHHHH=i#LHCY#LH9HB1HHHpHDHH)HT$H8HH;U1K1L1zD}HMEEHu1҉\DH0@8OHI8H@H08H#1+HU#H;`mE1E1D;m]HN< L9tIHtWxtQAIH@H`1EHBHRHu؉MIILLL19s,H1tH1HtAHЉщ0H<H軳HI0Ht4HxPHLH8GIw2K1ҿBHsX2K1ҿ BHσHHBH`X2K Hr1tBH`82K1Hw XBH`EHLHHHx!G]H`H4HxHLHxF}IW:u HS#H1K1K7AWAVIAUATIUHSH(L-#L@HHMHt ME$EI$ADL,AuIuARIH#HtH@IELHIH{IMmHRHT$LhX1fD$LHAU$I9D$wE1H([]A\A]A^A_LiIE#uJI$IGE1@H$LHAH$HE9w@IIt$>u HQ#H02K1%J딄u HQ#H012K JI`AIuAIH#uyHtH@IELHL$HHL$IHIMmHRHT$Lh19D$vc$HL$LHAU$IHL$Մu HP#H012KHL$IIHL$WI@H#>搐UHAWAVAUATSHHXHHuHUHeE1HHAH1HBHH)LL$ILLMELMEHEHHEBEWEL;EHUK<1LMDUL)HLMDUEDHu HK#H01Hڿ0KDIUHH]LeLLmL}ALuH<#I@hD|IILpbHhHHHPf:u D9bBHf:tE:Hu1ɺ HHEHE3KHE3KH1H3KHHCHH)̹Ld$ILI|$HH3KHǹL@B LHp4I46Hp61H]LeLmLuL}ËM|tLHE3KLmHE3KL}HE.KS3KIFMdL9IDLHH)Hweak verLd$II|$I$AD$sionfAD$ `AD$J3KH=LH2Lf)1Hs>u HI#H211p.9p|HE(3KL}LHE.KH(3KHHMHH)̹/Ld$ILI|$.LLf)1gIPIH0:u HH#HIML2K1+AmLMHE3KLmHE3KL} HE.K1ҾI1HHHtIu H[C#H011 X3KDAUAATAU1SHHHtfDt1H[ HuH[]A\A]DDDHuȐSHE1HH7LGHW(CHHHD$$HH[fUHAWIAVIAUIATISHHy#H#DlHEHHHDžpPlHDžxHtT@L;@r7L;Hs.@ HLH`H`HRHuH#HxH9xs'HpHHHpyf.MIH;#HHHHuHUHH\$$E1MHL1HHU1HtHtHHBR  He[A\A]A^A_H #HlI$HUE1MLLHD$$ H|d%u%lHHUHD$$7lL}H]LuEHEHEd%HUHuH}LEp'IHE-1d%u!dH<%d4%HHHuHuHHMDHtL;@r L;HH3K111-E1IHDLHHHBHH)H|$H2HuILDHHHHBHH)H|$H2}It H}dL1Lu-DA1H(HHH$D$ E1DHAEDPHEI AE{DHHELAEtcDPHELAEtKLH@HELAȄt1HIH AIAL1IL1uAfDD$HE1HD$H(Ð&H=-ÐHE118HHHI @x?w@t HHI Lf.HHHH?Hff.HHHHHffffff.HGHtHDfDH@H#Hc0u<H t 7tHHDHHH @HI#HcH 0u t貢f7HtHfDHHH= #t ~fDH2@tƇHW8Hfff.ɹ#ù############{#u#o#i#H(HHAH1HHED$H(ffff.UHHAWAVAUIATISHHXHǁ dH%(HU1H9IHHH?IH9HML5LE1HMfDHDс@t*~A/A?M$`NM$HH9vII$HH?IH9rHEdH3%(He[A\A]A^A_ÐA?E108HH!HI @xM$XICD"O "m@EKc LA?ICD"CE11D8HH!HI @xE11fD8HH!HI @xM$XICD!IO!E$pAEDɃp tfDrE1APHEHHHHAH I$HfHI$`H I$HEE118HH!HI @xE11fD8HH!HI @xM$XICD!O!E118HH!HI @xICD!E11@8HH!HI @xICD!bE11@8HH!HI @xICD!*HI$`H I$H HI$`H I$HE118HH!HI @xE11fD8HH!HI @xICD!O!HIH LL)HM$ XM$ L)LHI L3E11D8HH!HI @xM$01E1fD8HH!HI @xM$(ADŽ$@E11D8HH!HI @xM$0ADŽ$@E11D8HH!HI @xM$(OI$8ADŽ$@E11D8HH!HI @xL E11fD8HH!HI @xI1CD!K!E1D8HH!HI @xLE11fD8HH!HI @xLHHULEIHMCD'I$XHULEK '>E118HH!HI @xLM$0HHULEHMADŽ$@I$XHULEI$(LHHULEGI$XHUHMLEI$(E118HH!HI @xE11fD8HH!HI @xM$XICD!O!5E118HH!HI @xLHHULEI|HMCD'I$XHULEK 'E118HH!HI @xI1CD!K!E1D8HH!HI @xLlL1fDHHdžHHu:E11@8HH!HI @xMHEE1DɃ H5Hc H@P;0fM'H0H1H2ApALDUEI42HH H0HHuHHULEDMLUHuHULEDMLUHc0H닋0H0Hw11MDHL!HH ExMJM^MRH`LL$IZoCffffff.AUATIUHSH(@t_HF8tRHL-ʮ#1H|I4uHt%AtA|tZ DID$8말HttH9t AT#HHu@u,HU81Ht5H([]A\A]fDHt$H7fDHU8t1HuLH+I$H([]A\A]I$HT$LAWAVAUIATUHSHXH9HL$0H$HH$@H$8L%L5#HD$HT$ HL$(HPDv ؕIcL@H7HGf?wHcHǃHt0H9wtHcHL0HXH[]A\A]A^A_@E11HHЃHI DŽxHt$A]H@IMcC>KLtC=Hu &H1H$HCE11H0HHHI @xAH@IMcCKLtCHH1Ht$Ap"AvHH$HH|fKHHcH|0HH$HHHEafDHc<Ht0SHcHL0HHcHKSCHcHHcHt0LD0LL0LL0LD0Ht0APAH@IMcC>KTtC=Hu <WH2HyfAwHd@*SCHcHHL0Ht0Ht0HL0FKHcH9H$HH)HGHt0DCHHt0HDCHHt0HfDHt$ H$@f11HfDHLƒHH Ex_Hc7HGL@7HG=D7HGHc)f7HG@7HGHc7HG@D?HGAA уp =@"P0}MAPIу [H5Hc HfD;<HcHt0tQv/<#<< D HH/<<HHHt E1EH0HHpMDLEH6IE1HHH0HMMH6HxHGvJ'@fDE11HDHLʃHI ExL6 H0HHc0H0H0H11DHL!HH ExHt$(Hlj$LD$LL$H$8$LD$LL$H9H@@fH9H@@SH HHH41HD IcL@0HHHH @xDqL,8AMHHLDA$LIt1HH1[]A\A]A^A_ÃKHH1Ht#ApALDT$ EIHy HfDHP)@1fD8HH!HH @xIƃrHAMf.H|$ E11fHGHHxHtLLL{efDUA@APA0HAP1I H5Hc H41A1Hǃ@CCC(C8Hr(CHCXChǃHFxǃHǃ0ǃǃǃHH)ǃH)HǃH(HH)H HH)HKHH)HK HH)HK0HJpH)HK@HJhH)HKPHJxH)HK`HJ0H)HHJ8H)HHJ@H)HHJHH)HHJPH)HHJXH)HHJ`H¨H)ǃǃH)HHǃhHƃs1HHHt$(H$DD$LL$LT$;H$HDD$HD$0LL$LT$HcHHH11@DHL!HH ExkH0H1HtAIDHEHy H fHH?0H11DHL!HH ExH0HHt$0HH$HD$8Ht$0H$LD$_Hc0HS0HHHPHHBH ZH?i_Hf1H\$Hl$Ld$HLl$HHHHHIH$HH@Hu7H=#tH5RH= #5t = #t= #w#=#ۗ#՗#ϗ#ɗ#×############p@H$tƃH$HHDŽ$@HDŽ$0HC8HDŽ$(LH$H$L$L$Hĸff.UHAWLPAVAUIATIHuSHHHUHdH%(HE1 %LHAՅu+At+LHLH'AtυtAHUdH3%(DuHĈ[A\A]A^A_*fAWAVAUATIUHSHLwLdMMHHUAօubtbH$PHt"MHHU Ѓt8u.HLHLPtu fDHĈ[]A\A]A^A_ffffff.UHHEHUH]LeHLmLuIL}H0HUIHuIHdH%(HE1jHHHMl$LMt$LLt*HUdH3%(uH]LeLmLuL}(LHLhH`HLHLdHEHL HUH]LeLmLuL}HmHAUATIUHSH?H$PHt ILI$Ѓt<u2uAHHHH1IT$H9tHĈ[]A\A]1|UHHEHUHuH]LeHLmLuLL}H0HUIHdH%(HE1LHHI}uLLt{LLuLH LhH`HLHLdHEHL HUH]LeLmLuL}HmHUIISHHH$HHdH%(H$x1HHH@HL$H$@t+1H$xdH3%(HHĈ[]D$@tH1!t$HD HHH=tLE uHLEHL H$(HCH$0fH$hfH$PHCH$xHC@%@UHAWHuAVLAUILATLPSHRPHxHUdH%(HE1HLH>utHHt ILIUЃtUuHLHLHuHUdH3%(H]LeLmLuL}@̐H`IEHLIEHHLDuHLtLhH`HL{HLdHEHL HUH]LeLmLuL}HmH$DUHHELeIHUH]LmLuL}H0dH%(HE1Hu0KHUdH3%(H]LeLmLuL}fHHUHuLHHHHLLUtwLH]LhH`HLdHLdHEHL HUH]LeLmLuL}HmHn#HSHtwtqH=#HF HHVHNH~fF t+H=#H##H=܎#HC(H#[ H#HF(H5#f[fffff.11gHF F fN H=#SHHHVHNH~t+H=V#aH#H=C#HC(Hx#[" Hk#[HF(H5_#fffff.11wHJH9NHvH;rFDAWEAVAUATDd UHSHHE9H|$|HxIcEL4HcIH|$L$I4$ՅyMII$DI$Gd-IE9~2El$E9~Icĉ $H|$L4HTI6Յ $xEH[]A\A]A^A_ÐIcL4AWLzAVIAUIATIUSHHBHHD$Hx!ALLLy\$~=HcIlDHUID$A1LLIT$HELHH[]A\A]A^A_fH@tVt>~t'@ttfuHfHfDHfD1HfH@t*p t.~0t7P@t)tfu,1HDHFHHFHtsfD@PSIDHDȃ vsH HcH DHHHtApAHDH@yHIH[DHHfD11@DAHM!IL Ex?wA@tIIL HcHs@HdDHS@11@DAHM!IL Ex#@HHHH[IHÐUHo SHHHKHpH3HB { zt 1H[]HxDHx@HxH]fHxUHl$RuEDLuHHRt+Pu8HP1HHRufDH[]fDHz|3 t ,xuHB AWAVAUATIUSHH86HD$HD$(E1E11HD$6DHD$I;$I$HfH\ CtHEHHlH9tVHM=ADLD$D|IAD$ fffA9tAL$ HL$HSLDDHHw HHHD$(HHH\ 0HD$H8[]A\A]A^A_T$f% fAD$ pHD$ffff.AWAVAUATIUSHH(H4$o Hf@rDIEHD$E1HD$9@H{tH$HHtHPH\HHPH\;CtAD$ t*HHL|M9tLMLIƅtHL$HSDLD6DNHHw HHHT$HH\;eH([]A\A]A^A_ÐH\$Hl$HLd$Ll$H8 IHIf@;{ HL$IUHHf@{ IT$HHf@oH$H9T$H $H\$Hl$ Ld$(Ll$0H9L$FH8f.H\$Hl$HLd$Ll$H8HcFIIHH|>LHL$IUHƉHcCHH| LPHSHHH$H9T$H $H\$Hl$ Ld$(Ll$0H9L$FH8f.AWAVIAUATIUSHHH8o f@DIE4HD$(HL$ E1HD$HL$<HCHD$(HSHHT$ tLH)H9H\D ECtAD$ t*HHLlM9tLML9ItHL$DHSLDLD$HL$DHƒ1pDHLD$Hw HHHD$(HAHT$ LH)H9-H8H[]A\A]A^A_fD1fff.H@t*p t.~0t7P@tkfu,1HDHFHHFHtfkfDAWAVAUATUSHHXH/LGH/AHDZ(E;HG H;#HW(H;#L%#1E1MtJH3L&fHPH9Ht#HP(HHt"HIHH9vHPHuHufDOHH1E1E1E1E1/fDPtdHHHtFI8HAuHIxL;L9wHIP(I9sHIAHufMt3EufMt)Ik}DHX[]A\A]A^A_1HX[]A\A]A^A_HMUDHMEDMtHuH/#HhLXL` L0HPqHH(IJ(H #HH(H#HW(H8#HA#H#H #H@H@H@H0H9uOH0#E1H#C(H#1HHVL9HhLXHP(IR(L`(HT#}H}HL$HHUH}I@t };HCHt$HHHHD$ H$D$ HD$HCHt$HD$HHC :HcPHH|Lc HމKIHL$8HL%HD$8HC H'@H}HL$@LHHL$@H!HcH;HTH9HL$Ic$HTH9sOH1HHH9HHHL$Mc$NDL9rHLcNDL9sH9siMcl$Nl-IcEHI|tDDHHL$8DIT1Ic$HHT$8HH9sLk HHCf1E1SH0b_HH[6fDSHu[@06_HH[zf.AWAVAUATUSHHXHt$ G &HCHT$@E1HT$HD$LpHD$HHD$M9rXM9GMHT$O$>IJlHcEHH|2DHDsHL$HUHDHL$D1HHD$@H;D$ wHD$HH;D$ \M|$b@W HHL$HT$H,H^HHD$0H@H]HHD$8tH@C HkHUHt$Ld$0HLHHUHuLt$0MtHD$I;FC L-ufC L-HNLDLd$8MIVHHT$uIFH-O|#HD$1LxL9|$IlvkIlH$|#H9u,=DH+l$H |#HHEI,IH9tKtHUHAՅxLLxL9|$Ilw111DITHITHH9D$v!I|uITHITHH9D$wH|$0HT$8INIt$HBHGH9D$LHHT$8HD$0HT$(HRHD$HHT$LpHD$HT$(HMHD$L|HD$Jlu#6HEHT$HDHMtMLHuHAՅMfMHT$H|$IDHT$L<+HD$MHD$mHoHuHuHHD$HuHHHuHEz#HC fC HCHT$ H9C HsHT$ HHHXH[]A\A]A^A_C fH{1H_H9sCHDH9Hs0HHHlHMH9L$ HurHH9L$ rHPfD1Hw#HHD$ T$C %щ ȉC H9T$t%C H|$fDfLsHDE1DHD$DHT$@MnD$HD$HHT$HD$(M9rUDL9GIK\%HL$(Ht$DHIlHUHL$|$1HHD$HH9D$ rHD$@H9D$ LcHT$(HBHT$HBHD$8HD$(H|$(fgHD$0HSHHCK HSHt$0H\oLcI4$HuDII4$HHT$ HHHtLL11ZW LLHj__AVAUATIUHSH@L5"Mt H=[w#fL-w#MuDMm(MM;erLLHHMt H= w#HIEHEIEHEAE fAE DLDHL$8HSHD"HD$8HEH@H[]A\A]A^fHIE(L*jL-v#MtuIE(LLHv#NHHv#Hv#HtIMH9s DH9rHP(H@(HuHIE(L*tHcCHH|*1H=HL$$HD$HD$HD$HD$ D$( H\$ HHD$HEHD$HEHD$HEATHUHSu []1A\DtL%"Mt H=Ou#ZHu#Ht)H9kHsu#uH9ktrHC(H[(HuHVu#Ht9HJu#HCH9(t_HC(HtNHS(HC uH9kuHC(H@Mt H=t#Ht4H[]A\fHS(H1@HC(HH{c\ff.HuHÐHHcH\$Hl$LLd$Ll$HLt$L|$Hxt&H\$HHl$PLd$XLl$`Lt$hL|$pHxu @L耸HItHHD$t HrHD$EeHD$IHD$ AttEEApA EPAFfD[IUIHHD$ t%AHDEHHT$ yH HL$ A}MetDA$IxE,$1I1fDA$IHЃHH ƄxI44HHt$3HL;d$HD$AHl$0H\$8AApHD$(At A M<$IMtAHDIEyM?AuL1 H HcHf.H8APALA HEJc HfI$IHtAHDHEyHAA EtAt@1APL1 XH 1HcHfD1YuM<$IE11ɐA4$IHHI @x?@HHHI Mc<$IE<$IyE<$IkE11fDA4$IHHI @x>I$I11@A<$IHHH @x11f.A<$IHHH @x?b@YHHHH CIc$I6A$I)A$II<$IHtAHDHEyH?A$IxL|$L9|$IL9|$L9d$LDI<$IIc<$IA<$IA<$I{11E$ILƒHH ExN11fE$ILƒHH Ex?"A@HHHH f.1AUI11EEIL!HH ExIUI{11f.EEIL!HH Ex?EA@;HHH )IcUIAUIfA@APlA01 XfDL1efDA@APSfDH=Y\#Q@HH=U\#Ik]H@\#Hff.SHHHtH[5QUSHHHHf#dHH8 Kt+H="HG" KH;JtPH";JHu%GH;HkPHPHt'HH{H KtHtEDfDHHHe#dHH8 Jt:CH" JHtu H="H;Jt0PH";JHu$FfDH;Hk PHPHt'HH{H JtHtDfDHHH\e#dHH8Kt+H="H"KH;JtOHd";JHu#EDH;HklOHdOHt'HH{HKtHtDfDHHHd#dHH8Kt+H="HE"KH;JtNH";JHu#EDH;HkNHNHt'HH{HKtHtUDfDHHH d#dHH8 Kt+H=8"H" KH;JtONH";JHu#EDH;Hk,NH$NHt'HH{H KtHtDfDHHHc#dHH8Kt+H="H%"KH;JtMH";JHu#EDH;HkMHMHt'HH{HKtHtDfDHHHb#dHH8 Kt+H= "H" KH;JtMH";JHu#EDH;HkLHLHt'HH{H KtHtuDfDHHH\b#dHH8`Kt+H="H"`KH;JtoLHd";JHu#EDH;HkLLHDLHt'HH{H`KtHtDfDHHHa#dHH8 Kt+H="He" KH;JtKH";JHu#EDH;HkKHKHt'HH{H KtHt5DfDHHH,a#dHH8Kt+H=X"H"KH;Jt/KH4";JHu#EDH;Hk KHKHt'HH{HKtHtDfDHHH`#dHH8`Kt+H="H5"`KH;JtJH";JHu#EDH;HklJHdJHt'HH{H`KtHtDfDHHH_#dHH8`Kt+H=("H"`KH;JtIH";JHu#EDH;HkIHIHt'HH{H`KtHtUDfDH="H;JtIHh";JH[] USHHcU#HRf.H{H+4IH{HG HtH{IH{HG HtH{IH{ HG HtH{ HH{(HG HtH{(HH{0HG HtH{0HH{8HG HtH{8HH{HHG HtH{HHH{PHG HtH{PtHH{XHG HtH{X\HH{`HG HtH{`DHH{hHG HtH{h,HH{pHG HtH{pHH HHtHH=0S#HS#tR59S#H=&S#H S#fIHS#Hu 'Hs H;Hk>IHGHuH[]SH`]#Ht<H{HHJHC]#tTGH{KGHCGH$]#HuH=X"HJt"GH=S#`ASH=S#HS#Ht%f.HHS#FH=S#Hu[USHHS#Hu .@HH{Ht'H;HkFHFHuH[]AUATUSHHHHJtVH{xtOE11I}HtHIH9kxv+MLkpI}#FI}HGHwFfDH{pEd@Ht HIH{ ECu!H;EHH[]A\A]EHsH;LGH1=X#t5R#} 5R#urH=C#H;=R#tKHC#=X#t R#ud R#uZH=R#`A+QHR#HHtEHkR#H=RR#HNHĀoH=3R#HHĀHH=R#HtHHR#DH=R#HuH=R#DHR#HAUATUSHH=X#H;=pX#u @HHEDH9VX#uH%X#HtvAlE1ImHtTfDHE8HxH@Hu HtHߋGH_uCHuu2HmHuHW#IIŐI9rH[]A\A]HCUSHH Z#HtH1@H<(HtH`CHHuHY#HHuHH[]6CH[]AWAVAUIATUSH(HHFHkHLeMXMt$MM~MIWH`HJHHqH[HFHHxHT$HL$Ht$]HT$HL$Ht$H~LMt01HItfMH(IMusHI9wHT$HL$Ht$BHt$HL$HT$HFHqLM1H~Hu#HI9dL@(HMtfD1fDH([]A\A]A^A_fLAHEHkHuHt11H}HuHH9sfDHH(HHuHH9rHJAHCI]H3Ht81H{HfHH9sDHH(HHGHH9rH@IEH([]A\A]A^A_f.HHT$@HT$HBIWH:Ht:1HzHf.HH9sHp(HHt1Hh@IGM~I7H1ILHH9swHH(HHt1kL@ID$LeI4$H^1I|$L-DHH9;HH(HHt1L?IFMt$I6Ht1I~LHH9cHH(HHt1HHT$HL$]?HL$HT$HAHJLMk1HyHkHI9KHx(HHt1OUSHHR#Ht!l1H;HHÐH9rHQ#H{HtPHtCH{H7Ht*1HHt)fDHJ(HHuHH9wu>HCH=^R#HSR#H[]P>HSJ; Q#`HQ#H:HH$>H R#;HdHdHHtV1=ZQ#t 5;#u> 5;#u3H;#HpH;#='Q#t z;#u( p;#uH=e;#HHĀH=I;#HaHĀSx;KH;KsHH;Kr[USHHŠdH]CuH[]ËxHcǃHHt6tHcHǃ. ffindex_unpack.cffindex_index_parsew%s:%d %s: %s: %s %s %zd %zd tree is NULLffindex.cWarning: could not find '%s' mmap failedFailed to allocate %ld bytes malloc failedindex with 0 entriesfreadffindex_insert_filestreamffindex_insert_memoryProblem with data file. Is it empty or is another process readning it?Designed and implemented by Andy Hauser .ffindex_tree_unlinkffindex_index_parseffindex_mmap_dataffindex_insert_filestreamffindex_insert_dirffindex_insert_memory  @@  < 8P@P P@h@@  @ @@@@@ @H@@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R@R@R@R@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R@R@R@R@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R@R@R@R@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0Q@0Q@0Q@0Q@V@`X@V@0Z@V@V@V@V@V@V@V@V@V@V@V@V@X@X@X@X@V@V@V@V@V@V@V@V@V@V@V@V@PY@PY@PY@PY@V@V@V@V@V@V@V@V@V@V@V@V@PY@PY@PY@PY@V@V@V@V@V@V@V@V@V@V@V@V@(W@(W@(W@(W@ _@_@ _@ _@^@^@^@^@^@^@^@^@^@^@^@^@`@@`@`@`@^@^@^@^@^@^@^@^@^@^@^@^@`@p`@`@`@^@^@^@^@^@^@^@^@^@^@^@^@a@Xa@_@a@2.12rc/proc/self/maps%lx-%lx/proc/mounts/etc/fstabtmpfs/dev/shm/dev/shm/sem./proc/self/task/%u/comm FATAL: exception not rethrown FATAL: kernel too old FATAL: cannot determine kernel version /dev/full/dev/nullcannot set %fs base address for thread-local storageunexpected reloc type in static binaryUUUUUUUU?33333333*$I$I$qqqE]tEUUUUUUU;;I$I$I8885P^Cy 0 0 0 袋. ,d! p= ףp= ؉؉ %^B{ $I$I$ =B!B|PuPuPqq-c/bin/shexit 0w+P?AAAПEEA0A APOA=A`A`E07A@6A`+A6A 7ARARAP?AA AПEEA0A APOA>A`A`E07A@6A`+A6A 7ARARAP?AA` AПEEA0A APOA>A`A`E07A@6A`+A6A 7ARARALIBC_FATAL_STDERR_/dev/tty======= Backtrace: ========= ======= Memory map: ======== ,ccs=P?AAA`7AOAWAp3A0A9APOA=AAAЏE07A@6A`+A6A 7ARARAP?AAA00AOAWAp3A/A)APOA>A+AЏE07A@6A`+A6A 7ARARAP?AAA0-AOAWAp3A,A*APOA>AAAЏE07A@6A`+A6A 7ARARAuAxAtAOA@uATAhAvAPOAPgA PAfARARA`RA PApRARARAcorrupted double-linked listTOP_PAD_PERTURB_MMAP_MAX_ARENA_MAXARENA_TESTTRIM_THRESHOLD_MMAP_THRESHOLD_ Arena %d: system bytes = %10u in use bytes = %10u Total (incl. mmap): max mmap regions = %10u max mmap bytes = %10lu free(): invalid pointerfree(): invalid sizeinvalid fastbin entry (free)malloc(): memory corruptionrealloc(): invalid old sizerealloc(): invalid next sizerealloc(): invalid pointermalloc: top chunk is corrupt*** glibc detected *** %s: %s: 0x%s *** munmap_chunk(): invalid pointer double free or corruption (fasttop)free(): invalid next size (normal)free(): invalid next size (fast)double free or corruption (top)double free or corruption (out)double free or corruption (!prev)free(): corrupted unsorted chunksmalloc(): memory corruption (fast)malloc(): smallbin double linked list corruptedmalloc(): corrupted unsorted chunksmalloc(): corrupted unsorted chunks 2break adjusted to free malloc spaceAAȉAA AHAxAAwAAAyAٍA{AAyAyAyAyAA A AAA@AhAAAAAXYZp[P\0]^^_`apbPc0de@X`DEF H`IJK M`NOP R`STUCUnknown errorUnknown error ipklpnopqrptupwxpz{p}~ iP`p @` P@pЎ0` pP0`ЁNBNBOBOBJPBPBPBZQBJOBNBOBOBFPBPBPBVQBFOBNBOBOBBPBPBPBRQBBOBNBOBOB>PBPBPBNQB>OBNBOBOB:PBPBPBJQB:OBNBOBOB6PBPBPBFQB6OBNBOBOB2PBPBPBBQB2OBNB~OBOB.PB~PBPB>QB.OBNBzOBOB*PBzPBPB:QB*OBNBvOBOB&PBvPBPB6QB&OBNBrOBOB"PBrPBPB2QB"OBNBnOBOBPBnPBPB.QBOBNBjOBOBPBjPBPB*QBOBNBfOBOBPBfPBPB&QBOBNBbOBOBPBbPBPB"QBOBNB^OBOBPB^PBPBQBOBNBWOBOBPBWPBPBQBOBNBPOBOBPBPPBPBQBOBRBQBQBQBQBQBRBRBQBQBQBQBQBQBRBRB~RBRB SBQSBSBSB-TBxTBTBUBYUBUBUB?VBVBVByRBRBSBLSBSBSB(TBsTBTB UBTUBUBUB:VBVBVBtRBRBRBGSBSBSB#TBnTBTBUBOUBUBUB5VBVBVBoRBRBRBBSBSBSBTBiTBTBTBJUBUBUB0VB~VBVBjRBRBRB=SBSBSBTBdTBTBTBEUBUBUB+VByVBVBeRBRBRB8SBSBSBTB_TBTBTB@UBUBUB&VBtVBVB`RBRBRB3SB~SBSBTBZTBTBTB;UBUBUB!VBoVBVB[RBRBRB.SBySBSB TBUTBTBTB6UBUBUBVBjVBVBVRBRBRB&SBqSBSBTBMTBTBTB.UBzUBUBVBbVBVBNRBRBRBSBiSBSBSBETBTBTB&UBrUBUB VBZVBVBFRBRBRBSBaSBSBSB=TBTBTBUBjUBUBVBRVBVB>RBRBRBSBYSBSBSB5TBTBTBUBbUBUBUBJVBVBbBbBbBbBbBbBaBhbBeB eBPeBpeBeBeB`dBdBЧ0Ppа0Pp0~p`2P@0u!qqq!QnVVVv6W;;;[{@ @`BJBB:BBBJBBBFBB6BBBFBBBBBB2BBBBBBB>BޓB.BBޔB>BBB:BړB*BBڔB:BBB6B֓B&BB֔B6BBB2BғB"BBҔB2BBB.BΓBB~BΔB.BB~B*BʓBBzBʔB*BBzB&BƓBBvBƔB&BBvB"B“BBrB”B"BBrBBBBnBBB~BnBBB BjBBBzBjBBBBfBBBvBfBBBBbBBBrBbBBBB^BBBnB^BBBBWBBBgBWBBBBPBBB`BPBjBB3B0BCB@BcB`BBB#B BBBSBPBΡBBBBBBBBۡBZBZBZBUBZBUBSBUBLBUBEB>B7B0B)BwBZBZBZBUBZBUBSBUBLBUBEB>B7B0B)B_B  @     @ @@@`!@"@ #@ %@ )@ @,@0@9@:@;@<@=@>@?@A B C D E  F@ @G@ H @0I@@J @ `K@ L @ M@ N@``@@f@ g@@h@x@y@z@{@|@}@ @@     @@@ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ ANSI_X3.4-1968//TRANSLITI`III ^C2CIIVCGETCONF_DIR/usr/libexec/getconf/proc/sys/kernel/ngroups_maxILP32_OFF32ILP32_OFFBIG/proc/sys/kernel/rtsig-maxBB߹BչBɹBٸBBUBUB-B-B-B-B-B-B-B-B-B-B-B-B-B-BBBB_BBB-B,BsBB_BBBBiBBBB BsBiBBiB-B-B-BBB-B-BBBBBBBB}BBBBBBB-B-B}B}BDBsBB}BBB-B-B-B-B-B-BBBNBoB_BBeBBUBUBUBUB-BBBUBUBUBBøB͸B_ByBBsBٸBBBøB͸BB8BBBBB"BiB_B_B_B_B7BFBUBBUBUBUB-B-BBBB-BBBBBBBBBBBBBBBB-B-BUBBUBB-BBBBB-BBBBBBBBBBBB7BFBUBBBBBBBXBXBXBXBXBXBXBXBXBXBXBXBXBXB B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B-B-B7BFBUBB BBBBBB%s %s %s %s %d %d %d %d syslog: unknown facility/priority: %x<%d>%h %e %T [%d]/dev/console%s out of memory ???%s: %m %s: %m /proc/meminfoMemFree: %ld kBMemTotal: %ld kB/proc/stat/proc/cpuinfoprocessor/sys/devices/system/cpu(+0x-0x[0xcannot create TLS data structuresdlopenCCCCCCCChCHC(CCCCCCCCCCCCCCCCCCCC`C/var/tmp/var/profileGCONV_PATHGETCONF_DIRHOSTALIASESLD_AUDITLD_DEBUGLD_DEBUG_OUTPUTLD_DYNAMIC_WEAKLD_LIBRARY_PATHLD_ORIGIN_PATHLD_PRELOADLD_PROFILELD_SHOW_AUXVLD_USE_LOAD_BIASLOCALDOMAINLOCPATHMALLOC_TRACENIS_PATHNLSPATHRESOLV_HOST_CONFRES_OPTIONSTMPDIRTZDIRLD_WARNLD_LIBRARY_PATHLD_BIND_NOWLD_BIND_NOTLD_DYNAMIC_WEAKLD_PROFILE_OUTPUT/etc/suid-debugMALLOC_CHECK_LD_ASSUME_KERNEL/proc/sys/kernel/osrelease-aliasmoduleISO-10646/UCS4/=INTERNAL->ucs4=ucs4->INTERNALUCS-4LE//=INTERNAL->ucs4le=ucs4le->INTERNALISO-10646/UTF8/=INTERNAL->utf8=utf8->INTERNALISO-10646/UCS2/=ucs2->INTERNAL=INTERNAL->ucs2ANSI_X3.4-1968//=ascii->INTERNAL=INTERNAL->asciiUNICODEBIG//=ucs2reverse->INTERNAL=INTERNAL->ucs2reverse.soUCS4//ISO-10646/UCS4/UCS-4//ISO-10646/UCS4/UCS-4BE//ISO-10646/UCS4/CSUCS4//ISO-10646/UCS4/ISO-10646//ISO-10646/UCS4/10646-1:1993//ISO-10646/UCS4/10646-1:1993/UCS4/ISO-10646/UCS4/OSF00010104//ISO-10646/UCS4/OSF00010105//ISO-10646/UCS4/OSF00010106//ISO-10646/UCS4/WCHAR_T//INTERNALUTF8//ISO-10646/UTF8/UTF-8//ISO-10646/UTF8/ISO-IR-193//ISO-10646/UTF8/OSF05010001//ISO-10646/UTF8/ISO-10646/UTF-8/ISO-10646/UTF8/UCS2//ISO-10646/UCS2/UCS-2//ISO-10646/UCS2/OSF00010100//ISO-10646/UCS2/OSF00010101//ISO-10646/UCS2/OSF00010102//ISO-10646/UCS2/ANSI_X3.4//ANSI_X3.4-1968//ISO-IR-6//ANSI_X3.4-1968//ANSI_X3.4-1986//ANSI_X3.4-1968//ISO_646.IRV:1991//ANSI_X3.4-1968//ASCII//ANSI_X3.4-1968//ISO646-US//ANSI_X3.4-1968//US-ASCII//ANSI_X3.4-1968//US//ANSI_X3.4-1968//IBM367//ANSI_X3.4-1968//CP367//ANSI_X3.4-1968//CSASCII//ANSI_X3.4-1968//OSF00010020//ANSI_X3.4-1968//UNICODELITTLE//ISO-10646/UCS2/UCS-2LE//ISO-10646/UCS2/UCS-2BE//UNICODEBIG//I zCI0uCI}CIPbCI`MCI`@C2CI0:CI2C?I ^C2CPIVCnInCIgCGCONV_PATH/usr/lib64/gconv/gconv-modules.cachegconvgconv_initgconv_endLOCPATHLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMELC_MESSAGESLC_PAPERLC_NAMELC_ADDRESSLC_TELEPHONELC_MEASUREMENTLC_IDENTIFICATION +3?HP[hw   CLC_ALLLANG JK K KKK K`K KK`K`Kn- /usr/lib/localeVo. @I`II@II`ItIIIIII  /usr/lib/locale/locale-archive     `     `  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   ~~~~>>xx(( 8HHHHHIupperloweralphadigitxdigitspaceprintgraphblankcntrlpunctalnumtouppertolower;JV`I`I`I`IJ J`J_J`I`IHTӨIKJIK1JJJJlJJ JLJJJ$J,J4J@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~ 23IRRSS                    " $ % & / 5 6 7 9 : < D G H I _ ` a b c !!!!! ! ! ! !!!!!!!!!!!!!!!"!$!&!(!,!-!.!/!0!1!3!4!9!E!F!G!H!I!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!""""#"6"<"d"e"j"k"""$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$#$$$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%% %%%%%$%,%4%<%%t*u*v*00Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2222222222222222q3r3s3t3u3v333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333) MNOPRTUVWYZ[\_`abcdefhijk  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    !"#$%&'()*+,-./0123456789;<=>@ABCDFJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ %,37:>BFJNRVZ^aeimquy} !#%).38=@EJMPSVY\_behlorux{ $'+06:=AFILORUY^beintx{  !&+05:?DINRW\`dhlpux| $*06<BHNTZ^bfjnrvz~ #(-27<AFKPUZ_dinsx} "',16;@CFILORUX[^adimrux~ &,159>BFJNRVZ^bfkquy} "+/37;?CGKOSW[_cgkquy}             ! # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n p s v y |          ! $ ' * - 0 3 6 9 < ? B E H K N Q T W Z ] ` c f i l o r u x { ~          # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n q t w z }          " % ( + . 1 4 7 : = @ C F I L O R U X [ ^ a d g j m p s v y |          ! $ ' * - 0 3 6 9 < ? B E H K N Q T W Z ] ` c f i l o r u x { ~   #&),/258;>ADGJMPSVY\_behknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy|  !$'*-0369<?BEHKNQTWZ]`cfilorux{~  #&),/258;>ADGJMPSVY\_behknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy| (C)<<-(R)u,>> 1/4 1/2 3/4 AExssaeIJij'nOEOEoeoesLJLjljNJNjnjDZDzdz'^'`_:~ -------'','"",,"+o...... ``````<>!!/???!!? RsEURINRa/ca/sCc/oc/ugHHHhIILlNNoPQRRRTEL(TM)ZOhmZBCeeEFMoiDdeij 1/3 2/3 1/5 2/5 3/5 4/5 1/6 5/6 1/8 3/8 5/8 7/8 1/IIIIIIIVVVIVIIVIIIIXXXIXIILCDMiiiiiiivvviviiviiiixxxixiilcdm<--><-><==><=>-/\*|:~<=>=<<>><<<>>>NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUSSPDEL_NL(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(0)-|+++++++++o::====== =(21)(22)(23)(24)(25)(26)(27)(28)(29)(30)(31)(32)(33)(34)(35)(36)(37)(38)(39)(40)(41)(42)(43)(44)(45)(46)(47)(48)(49)(50)hPadaAUbaroVpcpAnAuAmAkAKBMBGBcalkcalpFnFuFugmgkgHzkHzMHzGHzTHzulmldlklfmnmummmcmkmmm^2cm^2m^2km^2mm^3cm^3m^3km^3m/sm/s^2PakPaMPaGParadrad/srad/s^2psnsusmspVnVuVmVkVMVpWnWuWmWkWMWa.m.BqcccdC/kgCo.dBGyhaHPinKKKMktlmlnloglxmbmilmolPHp.m.PPMPRsrSvWbfffiflffifflst+___,.;:?!(){}#&*+-<>=\$%@!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzACDGJKNOPQSTUVWXYZabcdfhijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABDEFGJKLMNOPQSTUVWXYabcdefghijklmnopqrstuvwxyzABDEFGIJKLMOSTUVWXYabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789579023456789libcPOSIXANSI_X3.4-1968 JK K KKK K`K KK`K`K`I`I`I;J;J;J;J;J;J;J;J;J;J;J;J;JCCtCkC`CSCFC9C,CCCOUTPUT_CHARSETcharset=LANGUAGEmessages/usr/share/localeldlilolulXI/usr/share/locale@CCCCkCCCCCCCCaCuCRCRCRCRCRCRCRCRCRCuCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCICRCRCRC#CCRCCCCCRCCRCC|C|C|C|C|C|C|C|C|C|CCuCMCC|CCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCCRCRCRCRCRCRCRCRCRCRCRCRCRCC" '+"5                        plural=nplurals= JJ0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZto_outpunct(nil)(null)*** %n in writable segment detected *** *** invalid %N$ use detected *** &D&D&D&D&D&D&D&D&D&D&D&D&D&D#D#DX$DD,D 2D*D5Dj(D(D+)DDj2D&D&D&D"D"D"D"D"D"D"D"D"D"D"D"D"D"D6D2D13D,D&/D5/D6Dg$Dj1D1D5DDS0D"D"D"D"D"D"D"D"D"D"D"D"D"D"D*!D"D"D6D2D13D,D&/D5/D6Dg$Dj1D1D5DDS0D"D"D"D"D"D"D"D"D"D"D"D"D"D~5D"D"D"D6D2D13D,D&/D"D"D"D"D1D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D65D D*!D!D6D2D13D,D&/D5/D6Dg$Dj1D1D5DDS0D!D#D"D"D"D"D"D"D"D"D"D"D4D65D D*!D!D6D2D13D,D&/D5/D6Dg$Dj1D1D5DDS0D!D#D"D"D2D7D-6D59D+DR,D8D@3D4D65D D*!D!D6D2D13D,D&/D5/D6Dg$Dj1D1D5DDS0D!D#D6D       kADOAOAWATAhA0PAPOAPgA PAfARARA`RA PApRAnaninfINFNANnaninfINFNAN0.0001(nil)(null)tDtDtDtDtDtDtDtDtDtDtDtDtDtDD#DDyDDDDDDDuDDcDtDtDtDDDDDDDDDDDDDDDlDDDEDDD"DDDDD~DDDDDDDDDDDDDDDDLDDDlDDDEDDD"DDDDD~DDDDDDDDDDDDDDDDDDDlDDDEDDDDDDDDDDDDDDDDDDDDDDDDDLD DlDDDEDDD"DDDDD~DDD8DDDDDDDDDDDDDDLD DlDDDEDDD"DDDDD~DDD8DDDDDDD{DD)D:DDDDLD DlDDDEDDD"DDDDD~DDD8DD       EDOAOAEpEE0PAPOAPgA PAЪERARA`RA PApRAto_inpunctE E E E E E E E E E E E E E E E E E E E E E E E E E E EE E8E EEEE E E E E E E E E E E E@E E E E E E E EE E E E E EE E+EEEEE EE E E E E|EmE E E E3E E$E E E E EEEEEEEEEEEEEEEEEEEEET EEEEEEE8 EE: EE E EEEE EEE: EEEEEE: ETMPDIR/tmp%.*s/%.*sXXXXXXabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789SuccessOperation not permittedNo such file or directoryNo such processInterrupted system callInput/output errorNo such device or addressArgument list too longExec format errorBad file descriptorNo child processesCannot allocate memoryPermission deniedBad addressBlock device requiredDevice or resource busyFile existsInvalid cross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentToo many open files in systemToo many open filesText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeNumerical result out of rangeResource deadlock avoidedFile name too longNo locks availableFunction not implementedDirectory not emptyNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedInvalid exchangeInvalid request descriptorExchange fullNo anodeInvalid request codeInvalid slotBad font file formatDevice not a streamNo data availableTimer expiredOut of streams resourcesMachine is not on the networkPackage not installedObject is remoteLink has been severedAdvertise errorSrmount errorCommunication error on sendProtocol errorMultihop attemptedRFS specific errorBad messageName not unique on networkFile descriptor in bad stateRemote address changedStreams pipe errorToo many usersDestination address requiredMessage too longProtocol not availableProtocol not supportedSocket type not supportedOperation not supportedProtocol family not supportedAddress already in useNetwork is downNetwork is unreachableConnection reset by peerNo buffer space availableConnection timed outConnection refusedHost is downNo route to hostOperation already in progressOperation now in progressStale NFS file handleStructure needs cleaningNot a XENIX named type fileNo XENIX semaphores availableIs a named type fileRemote I/O errorDisk quota exceededNo medium foundWrong medium typeOperation canceledRequired key not availableKey has expiredKey has been revokedKey was rejected by serviceOwner diedState not recoverableResource temporarily unavailableInappropriate ioctl for deviceNumerical argument out of domainToo many levels of symbolic linksValue too large for defined data typeCan not access a needed shared libraryAccessing a corrupted shared library.lib section in a.out corruptedAttempting to link in too many shared librariesCannot exec a shared library directlyInvalid or incomplete multibyte or wide characterInterrupted system call should be restartedSocket operation on non-socketProtocol wrong type for socketAddress family not supported by protocolCannot assign requested addressNetwork dropped connection on resetSoftware caused connection abortTransport endpoint is already connectedTransport endpoint is not connectedCannot send after transport endpoint shutdownToo many references: cannot spliceOperation not possible due to RF-kill_JgJJJJJJJJJ+JJ>JUJgJsJJJJJJJJJ$J@J8JGJVJnJ{JJJ`JJJJJ J#JJ7JRJeJJJJJJJJJ(JCJQJZJoJ|JJJJJJJJ#J9JIJWJsJJJJJJJJJJ(JHJxJJJJJJ%JBJ(JSJjJJJJHJJxJJJJJJ(JJJ8JhJBJWJjJwJJJJJJ J)J>JOJcJsJJJJJJJJJEEEEEEEEEEEEEpEEE`EEEEEEEEEEEEEEEEEEEEEEEEE8EEEEEEEEEEEEEEEEEEEhEEEEEHEEEEEEEEEEE0EHEEEEEHEEEEEEHEEEEІEEHEEEHEEEEEEEEEEEEEEE8EEEEEEEEEEEEEEȅEE8EEEEEEEEEE8EEEEEE8E0E(E(E(E(E(E(E(E(E(E(E(E(E(EE(E(E(E(E(E(E(E(E(E(E(E(E(EE(E،E(EE(E(E(E(E0E(E(EE(E(E(E(E(EE(EqEqEEqEqEqEEqEqEqEEqEEqEqE؊EqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEEEYEEYEEEEYEYEYEYEYEYEYEYEYEYEYEEYEYEYEYE0EYEYEYEYEYEYEYEYEEYEE0EEEEYE0EYEYEYEYEE0EEYEYEȍEYE0EYEYE0EP?AAA`7AOAWAp3AhAEPOA=AAAЏE0EPEEEpRARARA 0000000000000000 0000000000000000 E`EE@E`EEpE0GPExAtAOA@uATAhAvAPOAPgAEfARARA`RA PApRARARA 0@P`p @` @`P0pP0pEEEEEME[EiEwEEEEEE?EE+E+E9EGEUEcEqEEEEEEEEEEEEEEEEEEEEEpE`EPEE E0E0E EEEEEEEEEEEpE`E@EEE#EEEEEmE{EEEEEEE1EEEEEEEEE EE'E5ECEQE_EE~E~EpEbETEFE8E*EEEEEEEEEEEEE}EsEiE_EUEKEEEEEqEcEUEGE9E+EEEEEEEEE-E#EEEEEEEEEEE7EAE @`0Pp@p0` `@ `@@@@@@@@@@@@@@@@@[[[[[[[[[[[[[[[[  P"$%`')*p, ./10346p  0@P`=?ACEGIKMOQSUWY`<%[A-Za-z]%n%hu%n:%hu%n:%hu%nM%hu.%hu.%hu%nTZ/etc/localtimeUniversalUTCGMT../TZDIRTZifposixrules/usr/share/zoneinfo%H:%M:%S%H:%M%m/%d/%y%Y-%m-%d%I:%M:%S %pF(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(FF(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(FFpF"F9F(F FsFFF(F(F(FoF(F(FʼnF(F"FKFF FsF0FrF>FF(F(F(F(F(F(F+F#FFԗFF(FsF#F(F;Frelocation errorsymbol lookup errornormalprotected [%s] undefined symbol: cannot allocate memory in static TLS blockcannot make segment writable for relocation%s: Symbol `%s' causes overflow in R_X86_64_32 relocation %s: Symbol `%s' causes overflow in R_X86_64_PC32 relocation %s: Symbol `%s' has different size in shared object, consider re-linking %s: no PLTREL found in object %s %s: out of memory to store relocation results for %s cannot restore segment prot after reloc (lazy) relocation processing: %s%s KG`MGNGKGKGhNG`MG`MGKGKG NGKGKGKGKGKGMGMGMGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGMG@NGPGQGHRGPGPGQGQGQGPGPGQGPGPGPGPGPG{QGbQG8QGPGPGPGPGPGPGPGPGPGPGPGPGPGPGPGPGPGPGQGunexpected reloc type 0xunexpected PLT reloc type 0xcannot apply additional memory protection after relocationDYNAMIC LINKER BUG!!!%s: %s: %s%s%s%s%s fatalcontinued%s: error: %s: %s (%s) out of memoryerror while loading shared libraries =???/proc/self/exeGLIBC_PRIVATE_dl_open_hookIGNOREIgconv_trans_contextgconv_transgconv_trans_initgconv_trans_end^[yY]^[nN];JYK_K'K'K_J;J.'K'K'K'K'K'K'KKKKKKKKKaIKKKKKK'K'KKKKKKKKKKKKKKKu'u'_J;JSI'K'K._JSunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturdayJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberAMPM%a %b %e %H:%M:%S %Y%a %b %e %H:%M:%S %Z %YSunMonTueWedThuFriSatSundayMondayFridayJanFebMarAprMayJunJulAugSepOctNovDecMarchAprilJuneJulyAugustAMPMTuesdayWednesdayThursdaySaturdayJanuaryFebruarySeptemberOctoberNovemberDecember%a %b %e %H:%M:%S %Y%m/%d/%y%H:%M:%S%I:%M:%S %p%a %b %e %H:%M:%S %Z %Y;Jo0K4K8K<K@KDKHKLKSKZKbKlKuK|KKKKKKKKKKKKKKKKKKKKKKKKKK K KJtJJ'K'K'K'K'K'K'KDKTKdKtKKKKKKXKxKKKKKK(K8KHKXKhKxKKKKKKKKKHKK K K8K`KKK<KHKK( KP Kx KIIIII"K:0$K&K(K&K'K*K K_J;J)_J%p%t%g%t%m%t%f;J8K'K'K'K'K'K_J%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N;J K'K'K'K'K'K'K'K'K'K'K'K_J+%c %a %l;JK'K'K'K_J;J&K_JISO/IEC 14652 i18n FDCC-setKeld Simonsenkeld@dkuug.dk+45 3122-6543+45 3325-6543ISO1.01997-12-20ISO/IEC JTC1/SC22/WG20 - internationalizationC/o Keld Simonsen, Skt. Jorgens Alle 8, DK-1615 Kobenhavn Vi18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999i18n:1999;JKKHKKKKK'KK'K'K'KK KK_J;JKK_J  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~inity d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJ d'o#ſt[Am-jd8n헧?O>. 8/t#ڰͼ3&N|.[Ӿr؇/PkpnJؕnq&fƭ$6ZB<TcsUe(U܀n_SlgrwFo]:FGWvyuD;s(!>p%"/.Q]OᖬW2Sq$^c_䭫*sf\wI[iCsFEHis 84c)r+[[!|nN5 }L,D4fl}C}Ο+#U>#`e!Q4\Ycɟ+1*ZibBtz["؊4س?ŏmk1Ke6ukG܉ـ( f13j~{j6h߸\A)\='_Djzp؊4|ElݾV}*@|gu "Ωo$po?b(UxI>Nkw};u  #6'0q'"(\؄t.z-TMеub <4 9Ԣ7.~2!'{n $-PԓX+1"#+%? D~br*~xxކzos{'~j=jr1|òAv09&Ѷ~j2=_+0cm-X%<|b 7w ʐ,5P6xPnx [4? E,W8 9qIHۚ풴lMP#*wg:8-ñj@?F[$GtJL0s-o|;#o`Is{Kҵ65m1 k?f%(炸r;v=4tPw?j&ATN4 @SZ E3TɤAc+;={CpfU,ie.O\Oߢݭ9^2XX%-VNqv4§v=ЉMOT+}\ IA?7߻D!WDGn®8pp;3,f%k;ܑyٸZNh.ltH Ic/~=otgx!RJݼ-ݎW5YAV9 T<!{>;b.w_ W5ƶ(NT ]=!̇odI@BuhؖҋcU4ph{3'"2I%% dKE)0b 62 kg SP)E7J G |l'5$50123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_dlfcn_hook%s%s%s%s%s%s: %sunsupported dlinfo request.(Hp(H(H.(H(H(H(H.(H.(H(HP(Hinvalid namespaceP'@)0+-/02468:<>p@`B% p ` P@0!0 H`JLN Q`SUW Z`\^` c`egF;Zx0Nm<[y1On/proc/netnet/unix net/if_inet6net/ax25net/nr net/rosenet/ipxnet/appletalksys/net/econetsys/net/ash net/x250123456789abcdefgmon%s: cannot open file: %s %s: cannot create file: %s %s: cannot map file: %s %s: cannot stat file: %s %s: file is no correct profile data file for `%s' Out of memory while initializing profiler invalid mode for dlopen()cannot extend global scopecannot create scope listno more namespaces available for dlmopen()invalid target namespace in dlmopen()opening file=%s [%lu]; direct_opencount=%u cannot load any more object with static TLSTLS generation counter wrapped! Please report this. closing file=%s; direct_opencount=%u file=%s [%lu]; destroying link map TLS generation counter wrapped! Please report as described in . calling fini: %s [%lu] dlcloseshared object not openinvalid mode parameterDST not allowed in SUID/SGID programscannot load auxiliary `%s' because of empty dynamic string token substitution empty dynamic string token substitutionload auxiliary object=%s requested by file=%s load filtered object=%s requested by file=%s cannot allocate dependency listcannot allocate symbol search listFilters not supported with LD_TRACE_PRELINKING calling init: %s calling preinit: %s checking for version `%s' in file %s [%lu] required by file %s [%lu] no version information available (required by cannot allocate version reference tableunsupported version of Verdef recordweak version `' not found (required by of Verneed record RTLD_NEXT used in code not dynamically loaded+gL/ 9^BS\pppppppppppppppppppppp%WN[QD  | l \ $  TD lllllD D llD llll4llllllDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtD  P  & 1 D [ n wwww P 8 p __XXXXpc_ {$$$$F<o#####""""@#0###l< >==l<::::===l<<>>><:::::>>>>>>P> : : : : ?>>P>stack smashing detected*** %s ***: %s terminated p^A@IIIpIIIIII0IIГI`IPI0IzRx d BBB B(A0A8G`% 8A0A(B BBBH L 8C0A(B BBBA $MMI@[  $<"AZ E A\MD@HtHRD N F yTBBE D(A0D` 0A(A BBBK D 0C(A BBBA ,UBAD JAB048sNP} E TBNPsLtBEB E(A0A8DP 8D0A(B BBBA X` AZ`KNP|4ADG J AAH d AAJ T"AZ E At"AZ E A(4 ADJI AAF fHA\xBBE D(A0D@( 0D(A BBBA k 0D(A BBBA LDKBEB B(D0D8J  8C0A(B BBBG , HRQP E $HTQ0O D L@BEB B(D0A8G" 8A0A(B BBBJ L<pBEB E(D0D8G 8C0A(B BBB,AKGAADQ K   $zRxLG GD u "H LloG GD , "H L>G GD  "H L  G GD  x"H L\G GD Q _"H LG GD  )"H LzG GD  "H LLIG GD v "H LG GD - W"H LG GD  X"H L<G GD  @"H LG GD R }"H LTG GD  "H L,#G GD  "H L|G GD w "H LG GD . <"H LG GD  "H Ll_G GD  "H L.G GD S "H L G GD  "H L\G GD  d"H LG GD x ="H LjG GD / "H LL9G GD  "H LG GD  4"H LG GD T "H L<G GD  "H LuG GD  R"H LDG GD y "H L, G GD 0 "H  L@2BDB B(A0A8D@8A0A(B BBB4L0TBIA A(A ABB,X0BHA !ABXA A ,8BHJ  ABA D A $$nMI0f A LLB BBB B(A0F8D 8D0A(B BBBA <BLB A(A0R (A BBDC  A A L BBB B(A0A8Gj 8C0A(B BBBA LP%DdhLDk A T A $mMV` G ,Ds I g I I G IH$ @dMMIP D 4 L dx|phLt G GD  "H L YG GD ^ }"H $LMN0q D L<G GD  "H LG GD F "H $hMI0z A LG GD G "H LTG GD  "H ,ACG0\ CAA  0HT,0DOD8 \0t8 0($ jMI B H h`h ,`'Dx\p!t  x!LG GD  1"H LG GD ; "H ,wM`p B $AI  AG pLC GD  "H L,vC GD G "H L|AC GD  "H L C GD  "H LC GD ` "H L BBB A(A0a (A BBBH c (A BBBA #LC GD ( n"H L\BBA A(G0g (C ABBD  (F ABDG Lt CE GD  "H L CE GD  "H L CE GD  "H Ldc CE GD C "H L3C GD  "H L<BBB B(A0A8Gk 8C0A(B BBBH LTr C GD  "H L= C GD  "H L C GD q "H |X     '$ < T ;l  <` wBBB D0 BBBA0 < eBBB D0 BBBA0LC GD  G"H LLMC GD V "H  ]LHC GD ! "H LC GD  "H !` H! !P!H!@"8"@4"8L"@L,$C GD  "H L|C GD  Z"H LC GD [ "H LC GD  <"H LlPC GD  "H LC GD t "H L C GD ' "H L\C GD  V"H L|C GD  "H LGC GD @ "H LLC GD  "H LC GD  ["H $& |gzPLRxsI $hThLE0fA0DDX6bhLBBB B(D` (B BBBA & && 'x",' D'\'t''gLl!ND GD  "H L!D GD  l "H D(x6\( t((((V(6( q$)LN0_ G ,)`bD{ A L)E$d)LQ A ){)>DT A $),D N F X H $) <D N F Z F ,8xhLLBA EG]H D*\*,t*AAG0| AAA $*8 bDq K L A T* H* L$'G GD * o"H L%'G GD  "H ,+ AC FRKS F ,+!kAC L D +$6L,%BGB B(A0A8G\ 8A0A(B BBBD L,&'G GD  "H L|&h'G GD M "H -(& -0&Ab E ,<-'AH H B ^ A l-'D'hLSRALdX(hLz^ASfBB D8 BBBA8zRx )zRx 8$m)\.)$t.).)R.(*xDJ A .*.*$.*L /*D\ H K E ,/`+@GD/+D$\/+[bPW G /,AD/- D4/,BKA A(D0(A ABB/-Vp0-\$0.*BAdB$D0.0BAjBTl0 .)RJWBB B(B0A8DP0B(B BBB$0."AA^A$0/(AAdA,1/BBJ(fBBA($D1h/RBALB\l1/VbAPVBB B(A0DP(B BBBGP106A \10Qac281Qac21Qac421,L22PACGm AAF |23Qac24Qac$2P4AD0i AA 24Wdf2 5Qac$3h5AD0i AA ,35QacD386Wdf\36Qact36Qac37Qac3X7Qac37Qac37Qac308Wdf4x8Wdf48D j A <4@9D l A \49D0f A |4@:Wdf4:Wdf44:ADJP CAE L AAA 4;&4;D b A 5@AL FG.s C G 47>AG B AE ^ AA I AA D7?AGG G AAH D FAE Q CAA D8h?BGD A ABG { ADH s AVA L8 @ d8@'|80@&8H@8P@8H@!,8`@WAD f AD J AE  9@dD v F L2DG GD . *"H LD3DG GD |. *"H L3nDG GD 3. +"H L3=DG GD - +"H 4l:?AAM S CAJ AC:h@)Dd$:@aDP G :C,:CMZ@5 D D,;0EBGD D@  DABD e  AAED Dt;EBJA G@p  DABE b  AAEG ;FL5LC GD 5 <1"H L5LC GD 5 4"H L<6vLC GD G5 4"H L6ALC GD 4 3"H L6 LC GD 4 4"H d=DL|=D"BBB A(A0a (A BBBH o (A BBBA =I=XK$=`KQBID J$>M<>M{GJ A \>OcLt>XO,BBB B(A0A8DP  8A0A(B BBBG L>8QuBBB B(A0A8D`) 8A0A(B BBBG ?hS3Am<4?SBOL D(C0](A BBB<t?SBYI A(D0N (A ABBA ?(T? TJN ,?XTPs     ~ }|{@xT,@T*L :VG GD V T"H L\:VG GD XV WU"H L:jVG GD V 8U"H 4AS4GDLA0V{BEE B(D0D8GPS8A0A(B BBBdAhVBBB B(A0A8D 8D0A(B BBFL D 8A0A(B BBBB 4AZ2AC GGD1 I f J 4B]$LB].BEA D(F0tB^1ACD L\<ycG GD Nc %_"H L<HcG GD c y_"H L<cG GD b _"H LL=bG GD sb _"H L=bG GD *b R`"H L=bG GD a `"H tDX]&A A ,Dh^AKG0" AAA 4D_BFI G0  AABA DaEad,EaIBBB B(A0A8G` 8A0A(B BBBA  8A0A(B BBEA \EeBEB B(A0A8\ 0A(B BBBF x 0A(B BBED L?wmG GD Lm Fh"H L @FmG GD m 7h"H L\@mG GD l 5h"H L@lG GD ql 8h"H L@lG GD (l h"H LLAlG GD k h"H LAQlG GD k i"H LA lG GD Mk i"H tHeA4HHf"BPA G=  AABE ,H@j_AD S AG V AA $HpkDZ B P H cD$Ik+BHB B(A0A8 0A(B BBEA lImGI@nGInG$I oMLY F $IoMD0l E d H 4J@p AF IEF D W I LDtC GD s &r"H LlDsG GD s Ur"H LDsG GD ]s (r"H L EsC GD s Xr"H L\ERsC GD r 2r"H 4%phLBAA J CBE $LrLX@M G L FRwC GD #w u"H L\FwC GD v Pv"H LFvC GD v 6v"H $&thLV  F \Mv;$tMvLN0 A $MwMN  A LGyC GD fy yx"H LG`yC GD y ox"H L,H+yC GD x yx"H $t(XwMhLHW0 E LHZzC GD +z y"H LH%zC GD y hy"H LDIyC GD y >y"H $)whLHW0 H LI4|C GD | y"H L J{C GD { z"H L\J{C GD k{ {"H L*xhLBBB B(D0A8G` 8D0A(B BBBA d4QH{BBB B(D0D8G` 8A0A(B BBBJ ~ 8A0F(B BBBA dQp|TBBB B(D0D8G` 8A0A(B BBBJ @ 8E0A(B BBBA $Rh}MQ A $,R~^{LLJC GD  "H LlLC GD Α h"H LLC GD  "H zPRxsI $h}2AX W A4D}EAAG@ AFJ F AAH ,|~MMQl I -`hLBBB B(A0A8GW 8A0A(B BBBF Q 8F0A(B BBBH ~ 8A0A(B BBBH ,4^MMNp) G $dȉ_YN@ H $ZMI m E D8rACG c CAF P AAV O AAO LOYC GD * "H LTO!C GD ڏ "H U U؏$ V,$V8AF ȃ A TVAlV`VHA]$VHxMNp G $VMI  J ,VX^ADJ B AAE LP&C GD  "H L "H L4l#@G GD > ("H Ll?C GD C> "H Ll?C GD = "H L$m?G GD = "H LtmW?G GD d= "H Lm&?C GD = I"H Ln>C GD < "H Ldn>C GD }< ;"H Ln>G GD 4< "H LoV>G GD ; "H LTo%>C GD ; "H Lo=C GD Q; F"H Lo=G GD ; "H LDp=G GD : "H LpY=D GD s: ?"H Lp%=D GD ': "H L4q<D GD 9 "H Lq<D GD 9 "H Lq<C GD B9 "H L$rT<C GD 8 p"H Ltr<D GD 8 H"H Lr;D GD ]8 $"H Ls;D GD 8 "H Lds;D GD 7 "H LsO;D GD y7 "H Lt;D GD -7 `"H LTt:G GD 6 "H Lt:G GD 6 "H Lt:G GD R6 H"H LDuT:G GD 6 H"H Lu#:D GD 5 T"H Lu9D GD q5 ;"H L4v9C GD $5 "H Lv9C GD 4 "H LvQ9C GD 4 P"H L$w9C GD =4 %"H Ltw8C GD 3 "H Lw8C GD 3 "H Lx}8G GD Z3 u"H LdxL8G GD 3 Q"H Lx8C GD 2 7"H Ly7C GD w2 1"H LTy7C GD *2 "H Ly|7G GD 1 "H LyK7G GD 1 "H LDz7G GD O1 o"H Lz6C GD 1 O"H Lz6D GD 0 "H L4{6D GD j0 "H L{L6D GD 0 y"H L{6G GD / >"H L$|5G GD / "H Lt|5G GD C/ "H L|5D GD . "H L}Q5G GD . "H Ld} 5G GD e. N"H L}4C GD . "H L~4C GD - "H LT~4C GD ~- } "H L~P4G GD 5- B "H L~4G GD ,  "H LD3G GD , "H L3C GD V, "H L3C GD , 5 "H L4S3C GD +  "H L3C GD o+ "H LԀ2G GD &+ "H L$2G GD * "H Lt2G GD * "H LāV2C GD G* u"H L!2D GD ) "H Ld1D GD ) "H L1D GD c) "H L1G GD ) t"H LTT1G GD ( C"H L#1G GD ( "H L0D GD <( "H LD0D GD ' b "H L0D GD ' 2 "H LV0D GD X' "H L4"0D GD ' "H L/C GD & { "H Lԅ/C GD r& C "H L$/G GD )& "H LtS/G GD % "H LĆ"/G GD % "H L.G GD N% "H Ld.G GD % ;"H L.G GD $ "H L^.G GD s$ "H LT-.G GD *$ {"H L-G GD # ~"H L-G GD # "H LD-G GD O# "H Li-G GD # q"H L8-G GD " "H L4-G GD t" "H L,C GD '" "H LԊ,C GD ! "H \`thpSԑȱ1N0 E $ pGP@t E L4(/BEB B(A0A8DpH 8A0A(B BBBA ,=ACF  CAH LBBA A(D0P (A ABBH & (A ABBD ,)AAG a AAD <4{BIB A(A0D (A BBBA t(P$`MT0 A LBJE B(A0A8G#8 8F0A(B BBBE ,AFD AAA ,4AG0 AH  AK Ld1BBB B(A0A8DP 8A0A(B BBBA ,EACF  CAH Q BBB E(A0A8G` 8A0A(B BBBF  8A0A(B BBBF x 8A0A(B BBBN  8A0A(B BBBE |,xED J M [ s E ALĕBEB B(A0A8G 8D0A(B BBBF ,P[0 H " E $DX MI  E Yl@AW@A, MV0G F o I ,ܖyMS0 I w, `SMN0 A ,<CMN0t I  E Ql=MD g$cAH G F A $̗MMI@ D 4M[P H  E 5 B , HMD rLL IBBA A(DP9 (A ABBG D (C ABBD  E C $H_ I N M LyBBB E(A0A8Gp 8D0A(B BBBF <4'BED  AEH \ ABI LtBBB B(A0A8Dpo 8A0A(B BBBA ę$DVܙ!A_#<X8,$9,DFW ^ A y E |$tXGM[`S A PHII̚Pa)hakpHqu,q)Dq<\uBHD D(G0 (D ABBG w)(w <̛REEEEEExEEEE< ЅeEEEEEExEEEEL5$d(&GUa AB 0{{{Ĝ)ܜ`SL o$q<PYT>l7Dc I LؾrBMB B(K0D8O 8A0A(B BBBA dBEB B(A0D8DpM 8D0A(B BBBB O 8G0A(H BBBK \0|t([Ag H J F D A S F L A } A O A F A F A F A F A F A F A F A D A U C QLBEE E(A0A8FP 8A0A(B BBBH DDHBBH B(A0C8D`8A0A(B BBBS j C $WD Z B \ L Jԟ BAv I A$ MAJ o AE KA$48=[@] H ,\PNAH Lh C ,pyAAG Q AAA DX$Ԡ2MN0 I $Ak D T D j$-DL H TL D GD y "H L\sD GD - "H <(BIA A(G0 (D ABBA <$BMB A(A0W (A BEBA 4dXwAC S A  G P!̢,AC Kd G $GT`M H <Tḷ4D \ H D4DLPdX|`hpĤxܤN C G #D ^, A\LkC GD < X"H Ld6C GD  "H LC GD  "H 4<0zBAD a AEB ACE4txAH IV I S E PDS$ĦXmAC KNO D+BBE D(D0JX 0D(A BBBA LnG GD C "H LL=G GD  "H L G GD  +"H LG GD h C"H L<G GD  /"H UH%U`h9iLD R J <U:BDA y ABE  ABQ fGiLG A E ,48SiLL^ G dV|VGV0GPX,`Dh4\pXBGA F ADK qDB$MI p J ,ԪAC LG.f C |BDB B(D0A8G` 8A0A(B BBBB \ 8A0A(B BBBJ D 8D0A(B BBBG $MV0$ gN @ J N4ԫh0AC IT D _ $ `MN0{ J n4XAL`G,lMD L K T A SAGԬAOAO<BGI A(G@(A ABBT l $M[`l A ,@.AH M A Lܭ@BGB B(A0A8DP 8D0A(B BBBA ,DaN E E d7zRx -<QĮHܮPX `B$Vp<\L=G GD  "H Ll G GD Ɣ r"H L"G GD  "H L G GD ~ "H '`A4̰jBFD L0  AAEK X#D^$pAD h FM ,DAu J  I A G C$tXTAC @ A N $tAC HZ J C LıBBB B(A0A8G 8A0A(B BBBG LܫR C GD #  H "H L, C GD  N "H L| C GD  6 "H ,ČH uiLAIG  CAF 4 <L BBD A(D0 (A ABBA  ch L {BEB D(A0F (A BBBE O(A BBBL  wBBB B(A0A8DP^8A0A(B BBB<\@ 1BHA  ABB F ABG L@BBB B(A0A8GP 8D0A(B BBBA $TA A F A H<aBEE A(A0 (A BBBE T#Ll'BBA A(D@ (A ABBD e (A ABBE cLԵ8BGB B(A0D8G`{ 8C0A(B BBBA $$DGE D \ D DL BAA G  AABA Q  JADA x D$pX e K ԶC{ B $xGJ G  E L%.G GD - "H L4-G GD -  "H L-G GD h- *"H LԱ-G GD - *"H L$a-G GD , 8+"H Lt0-G GD , +"H LIJ,G GD D, i+"H Ld<|PBEA A(D0 (D ABBE $OMD h G N eN V$X@I G <DBDB A(D0(A BBD,x AF h A $'\N` B <ܺBBB A(A0 (A BBBA 4AAD  FAL DAAL9G GD w9 /"H Llq9G GD .9 x/"H "\ *BEE A(F0t (A BBBB H (A BEBE i(A BBB,l*JAF Ln G L-BED A(G0y (D ABBK D (A ABBF , .HAJ }r F ,@1AC m E ,L7ADG AA|9Lx9BOF B(D0A8G 8C0A(B BBBA L@/BIB B(A0A8Jf 8A0A(B BBBA L4F BFL B(A0D8G 8A0A(B BBBA LHS BOF B(D0A8G 8C0A(B BBBA LԾ\#BOF B(D0A8G 8C0A(B BBBA L$hc%BPB B(A0D8D 8A0A(B BBBA LtHgBII B(A0A8G 8A0A(B BBBA LĿkBOF B(D0A8G 8C0A(B BBBA LrBPB B(A0D8Gg 8A0A(B BBBA Ld8yBII B(A0A8G 8A0A(B BBBA L}BII B(A0A8G 8A0A(B BBBA L8pBIB B(A0A8N6 8A0A(B BBBA TXlP:,@AC KKK  Vm A dІBBB B(A0A8G 8A0A(B BBBB m 8F0A(B BBBD dTBGB B(D0A8Dp 8A0A(B BBBD 8C0A(B BBB%D`$hVD{ A E K EAU,4AKD0F AAH d d|BEB B(A0A8D` 8D0A(B BBBD [ 8D0A(B BBBP ,8AC GOXm A ,AFD AAD\ R,thAC KKNP H ؝WAr M <2BEA D(F0 (D ABBA ,AE KK_ A ,48AAD AA4dxAC e] J  A `zȦ777@Lܿ&G GD  ߯"H L,G GD  ܰ"H L|ĽG GD i Ұ"H LG GD  "H LbG GD ׼ ij"H Ll1G GD  "H $XHN v D 0A,<vADK F AAH ,l0 AC Kg D LBBD A(K0I (D ABBJ G(D ABB,^AC B K $IAAD @AA,DuAH KKW A L<G GD  ("H LG GD V "H <8BBA A(G0 (D ABBL ,T(AL K_ G LLG GD  "H LG GD  "H ,$XAM \ E ,T/AHG0 DAA  ,0BDD  ABE LBBB B(A0A8DD 8D0A(B BBBA L@BBB B(A0A8Dd 8D0A(B BBBA 4lZBAA D@  CABC D}BDA ^ ABH  ABL AB< BBE H(C0 (A BBBA ,,AL HKKH E <\`BBD D(GP (A ABBA 04X`W5CM H \LBBB E(A0A8J e 8A0A(B BBBA $THWN@x C LDG GD  -"H LG GD R "H LdG GD  6"H L43G GD  -"H LG GD w "H LG GD . "H L$G GD  "H LtoG GD  "H LυG GD  Y"H LG GD  ("H  Dr J LBBA A(G0 (C ABBK r(F ABB, p8AC GGLJ H $<MI | N edȃD D dBBB B(A0A8G` 8A0A(B BBBF T 8A0A(B BBBA \4hBEB B(A0A8. 0A(B EHFG Q 0A(B BBBF 4BAA G@  DABC LTC GD \T "H LVTC GD T p"H LL!TC GD S u"H LSC GD uS "H $$HS0G F a$L MQB I ,t+AC EIDp J ,AC KD J ,x#OAC KKm A R?LSiAAG  ADH r ADI g CDB \ AAB ,l TAC KD J ,V(AC KD A L=G GD  `~"H L G GD  <~"H L4G GD  ~"H LG GD 7 \~"H , }ADF0 CAH ,<}ADF0 CAH Ll BBB B(D0D8G 8C0A(B BBBF LwG GD L "H LFG GD  "H \ Az E |GLdC GD  Þ"H LC GD J "H L\C GD  "H LT'C GD  H"H $0HS0_ F u,AC GGDa I ,4^AC IEU A ,dNAC KKRz J $MMG@ G LwdC GD Hd "H LBdC GD c "H ,\p[wAC KD I cLc4BBB B(A0C8I 8A0A(B BBBB ,fM^ F D$hWBDA K0  DABF ;  AABI DloBHA G0  DABF   AABI ,vAAJ AAD L_xC GD 0x rw"H L*xC GD w cw"H LLwC GD w Cw"H $xviLD F A E w w@N q4wBD \ H Tw$lxLZPx$xObPR D L{C GD z y"H LzC GD z y"H L<zC GD Jz y"H $x[iLMI  I L{C GD Y{ Qz"H LS{C GD { z"H LT{C GD z lz"H $`y8iLA F ,zADD j AAK L4({BHD A(D@ (D ABBD \(D DBBLL~C GD a~ |"H L[~C GD ~ }"H L&~C GD } t}"H ,4zAG0e AB q AA $d{iLMI0 I $}mMI t A L}BHD A(Dp (D ABBD \(D DBBDx~0\~G|5(1P1x(H_}HB F ?Ar E $AH_ I D8D\pDt`mA^ A GN w$N0C G T D xAS L LBEB B(D0A8GP 8A0A(B BBBD $dȄL[@ B LPBGB B(D0D8G@^ 8A0A(B BBBD ЇAt K ,@AYI D AAG ,,ADG w AAK ,\pAY F Y G ] C <BEB D(D0  (D BBBI ,PAy F Y G d D b F $MI ` J $ <T$lMMIP$8MNP$ЏMMIP,AG K_ $(ZP G LC GD ϓ "H LTɓC GD  "H LC GD 2 "H $ iLA A $T8MS@j F |FIk D $ mAAG XFA$hRa J $HR y E $MI f D $<wMI Y A d)||) $WN p J N$ aN t N PDhmt\ BEB D(A0A8 0A(B BBBA T 0A(B BBBA  0A(B BBEA 8)@ 8 <4H<Ld|@8&",9BGD eAE$MU0 H ,CBGD rAB$4MV0 F \<t6!20h  x$ H] D D!$\!OY# E 48#AC H B j F $,$\Qh K ,x'\Qu F 4)L*"Ld*0BBB B(A0A8G 8D0A(B BBBE -- x-DMLYAG GD .A ->"H L(AG GD @ >"H Ld@G GD @ ="H L@G GD S@ ="H L@G GD @ ="H LTd@G GD ? ="H +4$+AD AH cGDB$4h.MI  D <\/BEE A(A0 (A EBBA ,p/s AO IIa D 49ACD R AAD DA8;D;jDe$4<MN@ G |\>BBB B(D0D8GP 8A0A(B BBBI  8A0A(B BBBK X 8A0A(B BBBF ,PD%AC KDV G L PSBBB B(D0D8G`7 8A0A(B BBBH L\ U BEB E(A0A8G 8D0A(B BBBI tD V,tvMX@k H : F $8wbN q A a,wADG  AAC $L`xYLV0f H $tyGLN@b D LzBHB B(A0D8DP 8D0A(B BBBH |BAw H A @|$H|8<p|Th|l`|X|D||$|MI0 H }DPQ }$(~X<p~D0c A L\~BBD A(D0_ (A ABBF D(C ABB0RDM$pA I ؀DIL BHH H(D0D8D@ 8A0A(B BBBD 4\@e(AAD W AAA AALh BBB B(A0A8JAU 8C0A(B BBBA ؎LЎt BBB B(A0A8JA 8C0A(B BBBK LAdlBFB B(I0I8Dp 8F0A(B BBBF h 8F0A(B BBBA $XLIPW D $MIPQ I $$86ADG `DALLPBBB B(A0A8Dp 8D0A(B BBBA  ,:BAH kAB,AHL0a AAH <,pAC LG.  A  A ,l0AJ N A AUu$WN p J NL0BBE E(A0A8G 8A0A(B BBBA LLpBBD A(G0p (A ABBJ K (A ABBA ,AC Km4 H $`sL[@,AE KS A ,$x>AC L H ,TAM L E LHBLE E(D0A8J` 8D0A(B BBBA ,-AFF M AAD 4HRSPT O d A  E L<@oBIH G(A0 (S BBBG I (A LBBA ,`AC GEEb] A L0QBII B(D0D8JX 8D0A(B BBBC L @BEE B(A0A8G`N 8A0A(B BBBA \t1DlLBBB B(D0A8D` 8D0A(B BBBA  $oMN@ K L BEB E(A0A8G 8A0A(B BBBH <l0` AC HEEEla H  I LPBEB E(D0D8JP 8D0A(B BBBH 4AIG r FAF MAA4hDS I TXDPtZHw A  gD^X D A K, AC KH B $xM[@V$,AG AA $Tt\Q$|MN0B B hYr4YADG x FAE DCA,$8[AF EEFID C Th!Gt!Gx"G$#YGo A T#JBPA G z  DABE f  DABC N  DABK 4$MD a A T8%aDPZzRx Lx%]D8DH R DC8  DA8  DC8  D*"* <XQBBA A(D0 (A ABBH DX*\P*GAQ sA|*kAN@ZA*?AP lA$*DPG E I G eX+bD@A K Q$+}DPE G K E \$,,}DPE G K E \$TX,%XpZ F |`-X-E-F-qBDXi-sEPk,.AC E[ A L,5BJE B(A0D8Gp 8A0A(B BBBG L| 7BBE F(A0A8D@K 8G0A(B BBBH L>G GD > 98"H L>G GD > #8"H $l 6AY F W$ h7MZ0 C  9 L 9*BEB B(A0A8G 8A0A(B BBBG $ =< =5T >$l 0>N h>? > > > > > >L, >BLB E(D0E8G` 8D0A(B BBBA ,| @MN@ K n B L BBHB B(A0A8G 8A0A(B BBBA  ` L _BLB E(D0E8G` 8D0A(B BBBA ,d 8b MN@ H n B L dBHB B(A0A8G 8A0A(B BBBH   L BLB E(D0E8G` 8D0A(B BBBA ,L  MN@ H l D L| BHB B(A0A8G" 8A0A(B BBBJ    /  ;LHHBEB B(A0A8GE 8A0A(B BBBA dHb|l4AC EGED H q G 1<BBE D(D0u (A BBBC L$x BEB E(D0D8D@w 8A0A(B BBBE dt8BBB B(D0D8D 8A0A(B BBBE $ 8A0A(B BBBJ d BBB E(D0D8D{ 8A0A(B BBBD  8A0A(B BBBB ,DAC EGED} J t/ BX$A K Y G $:?L G GD  "H LD G GD  "H LPBLB A(A0 (A BLBA A (A BBGA DBIA A(  ALBA A  ABGA 4dEaAAD J DAE DAA< oBAA z ADE  ADA L C GD  "H L C GD L "H LD ^C GD  "H $8iLA F $]HR b D @DZ$4HeAG@[ AD \3IT A $|1X  E 4AFD0 AAC  AAD $@AG@z AE hD@^ F $ </T/D0hDl AG H L D H H G I J F L L V B ID@D$hAG K AA (< P<$< THl@6&N C G F%DCDDDBLA D()  ABBG   ABBH ,LHBRG ENL|I7 BBB B(A0I8JB 8A0A(B BBBH LS BBB B(A0A8J  8D0A(B BBBE @]$4H]MQ@ B \]t]T]BAA D@Z  AABJ   FABA   AABD LxnJBBB B(A0D8D 8A0A(B BBBI L4xo,BBB B(A0D8D 8A0A(B BBBF dXpBBB B(A0A8Ge 8A0A(B BBBH ~ 8A0A(B BBBH s$sORPE J ,,uuAGH@ AAF \vg,|`yAC Br H , 2AC JKR C <0BDB A(D0 (A BBBG jBGB B(A0A8Gf 8A0A(B BBBA  8A0A(B BBBA  8D0A(B BBBE W 8C0A(B BBBE d<BGB E(A0A8D`V 8A0A(B BBBJ  8F0A(B BBBK ,@AAD  AAE ,Lk1 D ,| AZ c[ A $0\A} J A A hpDDL H g$ MIPm E 4(8LPG$lM[ G DD0$PxAG L AA DV[AI0OA$AXD`AI@TAd(A\(MU$"MQ] E 8AvLBIB B(A0A8Dv8A0A(B BBF,l`VAF t A LBBE B(D0D8F` 8A0A(B BBBA ,POAC L< A , p~AC T B ,L wAC Kk A ,| AC K^5 A < aBED C(G0e (C ABBF  >AJ qA4 ![AC EEEEkD I D!8 \!0D0t!!F!H!@!8!@"8"04"(L" d"|""PD~ F G"HPD} G G"x4Do"x##D0^,#  AF IED B LL#-BBD D(DP (A ABBG D (A ABBA L#8BBB E(A0D8G 8D0A(B BBBE L#BGB B(D0A8G 8A0A(B BBBE $<$0MD o H Y|d$BIB B(A0G8G 8A0A(B BBBE P 8F0A(B BBBI  8C0A(B BBBA $$YL, %pAC IGEL A L<%BBB B(D0D8G8C0A(B BBB4%AC W Kk\ A V <%XBBD D(Gp (A ABBA ,&AC [ a ,4&h,AMJp AAF <d&hkAC OELHM  E  D <&AC K qm C  D &xD\ E \' 'r[~ E H<'@ T'8Ll'@BEB B(F0D8GP 8A0A(B BBBB D'BFE E(D0A8DP8A0A(B BBB,(gDy C I G I G F$4(XjDv F H H H H $\(?Ee F 4(AEJ0j AAD  AAG L(BBB B(D0A8Gp6 8A0A(B BBBD L )/BBB B(D0A8G`8A0A(B BBB$\)MN@$)HMN@L)tBBE B(D0A8JpB 8D0A(B BBBG $)jDv F H H H H d$*XBBB B(A0A8GP 8F0A(B BBBH F 8A0A(B BBBH *AT*&AJ E QL*BBB B(A0A8G1 8D0A(B BBBA D+ BBB D(D0Dp 0D(A BBBJ <d+ BDD C ADF  ABC +h +` !DJ B I$+p aM[l D ,D,7ADI L<,BGE E(A0A8DO 8D0A(B BBBK ,0N`x, pd;  O "xC*'\         f=Ma   r gF  `  e `lvlvlvlvlB@'H slhkl@X@rl@@@@@.@>@N@^@n@~@@PI@klklklkl l lnlI kllplI lll`qlImlIIIklllml`A@APAA@'K'K0GGCIpIIpIIIIIIIIIIIIIIIIIIIII.II?II.IPIaIInIIaII JK K KKK K`K KK`K`K`I`I`I;J;J;J;J;J;J;J;J;J;J;J;J;JJJ=J=J@oG@nGmGppG@HH@HH%H'H'H'H(HBstapsdt#F;Klibcrtld_map_complete-8@72(%rsp) 8@%r14Estapsdt@G;Klibcrtld_map_start-8@32(%rbp) 8@-232(%rbp)Fstapsdt%H;Klibcrtld_map_complete-8@40(%rbx) 8@48(%rsp)AstapsdtxH;Klibcrtld_reloc_start-8@40(%rbx) 8@%r14HstapsdtPH;Klibcrtld_reloc_complete-8@40(%rbx) 8@48(%rsp)Hstapsdt?H;Klibcrtld_unmap_start-8@-128(%rbp) 8@-88(%rbp)KstapsdtH;Klibcrtld_unmap_complete-8@-128(%rbp) 8@-88(%rbp)GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4),@ ,O@, p@ Omain-Offnchompfferror_print 4ffindex_copyrightRffindex_restoreffindex_get_entry_by_indexffindex_get_data_by_offset+ffindex_get_data_by_entrynffindex_get_data_by_indexffindex_tree_writeffindex_write ffindex_index_as_tree ffindex_tree_unlinkK ffindex_tree_get_entry ffindex_unlink_entries_ ffindex_sort_index_file ffindex_fopen_by_entry ffindex_bsearch_get_entry4 ffindex_unlink ffindex_fopen_by_name ffindex_get_data_by_namec ffindex_get_entry_by_name ffindex_mmap_dataXffindex_index_parse ffindex_insert_filestreamffindex_insert_memoryffindex_insert_fileffindex_insert_dirffindex_insert_list_fileffindex_copyright_textK @@^8D{Iuint6iiv1<Vb (088h "t$zF&b*b,pb0F1T2\6?{>HEILJSKL-xNbP d t 8t z nbC  8<  81?  8o *0 -  - !(" @$ E% & #' ]( )- *( s+-0 ,-8 - 8.% b@@ b 6 )*+&-.3-I46?- @-DD-@vHcK8ZNNO-Vz]z*zVz]z*z @o@ ^8D{Iuint6ii1Vb (088h "i$oF&b*b,pb0F1T2u\6?{>HEILJSKL-xNbP d i 8i o nb8  81  8w@@slen-tb@o@dbF|ob2Vo]o*oVo]o*o* rp@@{IDuint6NB|;;B~B:;tB^^^Y^b^^By(z{^/90e5=v>*@poA{ kCW$Ee(J05N8P[\1]j ^ B?1  B fS 4C!-"f v B DIR    Bxe$~v 1 qV W      ( 0 8 8  h  " $F &W *W ,b 04 1I 2\ 6 ?> HE IL JS K Lx NW Pd  8  n Wxq  BW o*0 1   ! ( "@ $E % &# '] (  )  *(s +0 ,8 - 1B .<WWm(W4m'p@{@~W@@UTQJ@@UT1@@+IUT-!@@nI!Uv!iZ2@@I222v4AW@M@w LP@@ZGV=vs!z"retWz#"retW@#UW@v @ UU. #$i[ #!*]1 @ @~  # $i #PvT %W @ @ &ϗ &ϗ ' '1  @s @F i w (YF  I!&1e @ @   !&1|e @ @Y eA #eY \eW $igW #$niWo #wk # $cmpoW#sN)O @ @ O= @ @ I=v=!Z?P @; @4 &2&h*&1@ @ @ w v|D @ @ IDDlDvF@' @B @c I''W'v)P @U @ UT<` @ @=&#&=/+sb(~,fdWx(YS I-t @ @.. S BC @@&3&s'd'Z(Y I,iW,dM,end#,pW@W@@&U&&=&#&h/W*!_''(Y I0@1@X@'G 2B  B .W @-@&.j&.&.=&.E&.{&./0W'1 '2k(Y  @I*!80D@  BW0@@&&&= &i&'#,retW1[W@@@&[g&[&([=&[ ,dir]i(Y  I'd*e^'m'vn #+sbt(~3/@`u.'m.v  BMW@@@3&M&M &(M=E &M{ *O*P_4V 4] 4* 4%4V 4] 4* 5% hkl% : ; I$ > $ >   I : ; : ;I8 : ;  : ;  : ; I8 I !I/  : ; ( !I.? : ; ' I@ : ; I4: ; I4: ; I  U4: ; I? < % : ; I$ > $ >   I : ; : ;I8 : ;  : ;  : ; I8 I !I/ &I.? : ; ' I@ : ; I: ; I : ; I4: ; I4: ; I? < % $ > $ > : ; I  I : ;  : ; I8 I !I/  : ;  : ; I < & : ; (  : ; : ;I8 : ; &I : ; !I.? : ;' I : ;I.? : ; I@ .? : ; ' I@ : ; I .? : ;' I@ : ;I : ;I4: ;I .: ;' @ H !4: ;I "4: ;I # U$4: ;I%.: ; ' I@ &: ; I'4: ; I(4I4  ).? : ;' @ *4: ; I +4: ; I ,4: ; I-1X Y .1/4: ; I 0 : ; 1 2!I/31RUX Y 44: ; I? < 54: ; I?   /usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/include/bits/usr/includeffindex_unpack.cstddef.htypes.hstdio.hlibio.hffindex.h @ LIMZYs=:>gV>Y;=l#N5iq?Zr<JrX\OSzXzJ4N.s# w! /usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/include/bits/usr/includeffutil.cstddef.htypes.hlibio.hstdio.h @V>\9?p#guu( / /usr/include/sys/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/usr/includeffindex.cstat.htypes.hstddef.htime.hstat.hdirent.hsearch.hstdio.hlibio.hffindex.hdirent.h p@'f˲L g[gYI/nL =*."]K1y5wvW1qMmv~.W=40yXt>/I19HL .rJ<v.L,> tt.[sJv [;m =X><[Y^&hrfX g[gY\ g[gYiX}Y;=Y-=3gpx<!M;g fGLKWKhHy"$WuzOZVLWxJ wJ >:L2W#f!v~\h/=YYKit+>:??Y=YYK w)Xsg;JgY;=1=;/ZSfY;YY;=nVV>gMBX} vh<}Z0v fujm.Kkindex_filename_old_offset/data/hauserws2/home/andy/wrk/dev/compbio/hhsuite/lib/ffindex/srcindex_data_IO_save_endshort intentry_indexSORTED_ARRAYout_dirrange_startmainGNU C 4.4.6 20120305 (Red Hat 4.4.6-4)_IO_buf_base_markers_IO_read_endffindex_unpack.cdata_filenameffindex_index_tstderrlong long intlong long unsigned intstdin_lock_cur_column_posnum_max_entriesargv_sbuf_IO_FILEunsigned charargn_IO_marker_shortbufffindex_typePLAIN_FILE_IO_write_base_unused2_IO_read_ptr__pad5_IO_buf_endrange_endTREEdata_fileffindex_entry_t_next__pad1__pad2__pad3__pad4filedataoutput_fileSORTED_FILEshort unsigned inttree_rootn_entries_IO_write_ptr_IO_write_end__off64_t__off_t_chain_IO_backup_baseffindex_index_flags2_IO_read_baseindex_data_size_vtable_offsetffindex_entry_IO_save_base_filenowritten_flagsstdout_IO_lock_tmessageffnchomperrstrlinefferror_printffutil.cfunction_namemyerrnosourcecode_filenameffindex_insert_dirinput_dir_name_lenn_entries_to_moveread_sizeffindex_copyrightbufferstart_offsetst_blksizeffindex_insert_filestreamffindex_get_data_by_index__nlink_tffindex_restored_name__ino_tffindex_tree_unlinkoffset_beforeffindex_get_entry_by_namefstatst_blocksd_reclenpreorderffindex_fopen_by_entry__unusedtv_nsecsorted_names_to_unlink__mode_td_typeffindex_get_entry_by_indexpostorderst_gidst_mode__ino64_tst_nlinkffindex_sort_index_fileleaftimespecEXCEPTION_ffindex_insert_memoryffindex_bsearch_get_entryendorderst_inoffindex_get_data_by_offsetffindex_compare_entries_by_nameffindex_mmap_data__dev_tdepthn_namesnbytes__pad0ffindex.cffindex_unlink_entriesinput_dir_namewhichffindex_insert_list_file__gid_tdirentst_mtimfrom_startffindex_unlink__pathffindex_index_as_treeffindex_copyright_textsearchffindex_get_data_by_entrynodeactiond_off__blksize_tffindex_tree_get_entry__uid_tffindex_fopen_by_namest_atimfrom_lengthtv_sec__dirstreampentry1pentry2__fdwrite_sizeEXCEPTION_ffindex_insert_file__time_tst_sizeffindex_writed_inoVISITst_uidst_ctimst_devffindex_get_data_by_name__func____blkcnt_t__statbufname_to_unlinkst_rdevffindex_index_parseffindex_tree_write0UauUTSa S9s9]] ]&9s9^ ^59s92Aa DKPK\ \RmPmV VvzPz2_A`___P2]A\]]P]20Aa0}82^A^^0 S).SP |p(PAZ|pP VAXVPPAOP U P MUMV MTM\ MQM] MRM^PVpVSPWbPb~wPST`gUg{S{US`jTjnU`nQoPPUTwUUTTQQuPqp@rUr\\U\@rTr]]T][r0|V,U,bVbeP$,0PVS,B s0v"#@BV s0v"#@pxUxupptTpxUxupptTttpUSSTT&U&MV/T`U]P2]`T`Q|u81Vv|V2V|__2_w^2^PPp|Q'p|@OUOYu@`kU`gTg{SUVTU'S')P)USUZU[}ST(V)VVVZT[}VP)CP[gPqQ)4QUSUSTUQPPUSUSTUQPPUJVKVTISK~S(@PKnPHWHK~KvWv~PU\U\\\T]T]\] ^^\^PSVSVPS\V0\0s<U<AuAqU{~UUHH10ALR`U \ \`T _`Q S S`R V V`X _ _ w _ wP ] ]P U V V T _ _ Q ~ S S R U X \ \ Y ] ] q s ^ ^  P U  V= G V T . \= I \ Q 3 ]= I ] R X 8 ^= I ^  P $ S= D PD I S  P  VP o Uo ^P x Tx ^P x Qx _ _P x Rx \ \ P } S S P ]   P Q ~mQ g P ~m V \ \ V V V  U \  T ]  Q _  R VO-size_tp__off_t{__off64_tFILE<_IO_lock_tC_IO_marker_IO_FILEffindex_typeffindex_entryffindex_entry_t%ffindex_indexffindex_index_t^O-size_tp__off_t{__off64_t1_IO_lock_t8_IO_marker_IO_FILE| e__dev_tp__uid_t{__gid_t__ino_t__ino64_t__mode_t__nlink_t__off_t__off64_t__time_t__blksize_t__blkcnt_tsize_ttimespec(statdirentvDIRVISITFILEq_IO_lock_tx_IO_marker_IO_FILEffindex_typeffindex_entry1ffindex_entry_t<ffindex_indexffindex_index_t2TVHPTVHP$)  [fkkx$V&>BPbe2|tx~2~2~2[_ I   .symtab.strtab.shstrtab.note.ABI-tag.note.gnu.build-id.rela.plt.init.text__libc_freeres_fn__libc_thread_freeres_fn.fini.rodata__libc_atexit__libc_subfreeres__libc_thread_subfreeres.stapsdt.base.eh_frame.gcc_except_table.tdata.tbss.ctors.dtors.jcr.data.rel.ro.got.got.plt.data.bss__libc_freeres_ptrs.note.stapsdt.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_str.debug_loc.debug_pubtypes.debug_rangesX@X )x@x$<@ F@A@L@{ R@I@ dPIP }XIX I  ;K; ;K; hx;Kx; ;K; ;K; ,ThLTh ili (jlj 8jlj  jl j  8jl8j @jl@j pjlj ( jlj x)`kl`k /`xlPx u 4lPx 0HPx V0z ,_z n{ ~~ P d 0 5    x `)  X@x@@@@@@IPI XI I ;K ;K x;K;K;KThLiljljl jl8jl@jljljl`kl`xll !"#$%&@jl* jl8;KK8jlX@n`xl}hxlp@xl0jlPhL8jlIP@R @0 I> IL IZ Ih @Iv Ixl0@`@ Il8@kl8@8@8@ l0lDklP9@\#9@jB9@va9@9@9@9@9@@$@n4@9@ I8:@::@Y:@x:@,:@;lQlc:@r:@:@;@2;@Q;@p;@;@;@;@;@ <@ <@ >@A@ A@-B@8B@EC@PC@EH@]H@ Ik J@ SP@nP@P@P@P@oV@3^@ S^@ s^@ ^@ $^@3^@Oc@dc@rc@ IMj@ej@j@j@o@7o@Ro@mo@o@o@o@o@o@p@ *p@Ep@$w@ I7|@|@B`@/U@@gu@r@ >I  GI@ (l0l@ @H@2@E@`@@[8l @+#@8P@ @E@Rι@^@l@"H@c@~@@@@l@l`lh l7@l@$@0@?lPl l_@j@x@@@<@ l@ |l@xll@l@p@"=@ \@ {@ @- @; @G @W @g!@b @@p _@~ z@*@ E@ `@ A A #A A A A A A A ` A2<  AEU 2 Aa M Ap h AE)!A A!A &A` `&A (A^ (A *A) +AZ p+Ap ,AI" P-A3 /AH 02A1U LAb LAq MA 0MA l qA l qA qA qA @I` l l VA rA l0 3rA= NrAL irA[ rAh rAu rA rA rA sA 6sA QsA psA sA sA sA sA sA tA, 9tA; XtAJ  ;Kx  ;K l nlH l plH l`qlH`uAv#P|A5,l?0Q lW A\AjHl{APlXllAp}AAA0~A8lPIp&I2ܙI@lVllAyAE AyA'pAl`AA/ lArl7ARA mA- A=5ABAQ(l^`Al0lt`l0AAA#A0APAl`ABA]A PAxA"A1A>lRldAq@l{AA&AEA`A{AAAQ AAA A)A-DA:_AG{AVAeArAAA&AEAdAAAAAA A A('A7BAD]AS|A`AmA|AA A*AIAdAAAAA AA*@A:1AGPAV`AdoArAAAAAA8ASAnAA AA,A<AJAZ9AjUAxtAAAA=@AAAA"A>AYA!PAH2AI<tALAZAhAxAA.AMAlAAAAAA&AAA, x;KnB}A9l7BkHBgBLgBSBr B0B[B I & B3BB IhH `IhBNB[`BpKB}fBBB%l6BslUBll slslB:lln sltB#B/B=BFBWB0iByBI%Il AIBB ;KBtBB)0B7lDlN Ie`IuCOl C CC l!C2!CQ!Cp!C!C II ;KpI"" I2!C@"CJK I\%Cg lr0C~0Ctl Il (;K I @I(lI:8l0lpC 0;KI%@lIЋCV'Hl6C  8;KDCW `Ihh Ih~`C I4 @Ih Ih @I `I I @IL  I; `IV tI n I I4 I I I@plll @I"l/ J(A `JP*S GJ(c ]JKsCIl lCvlllοCll C C)+C8JCEiCTCbl8 @;Krxl@l8lCCCllllll C l C wl2 :C@ `C[ C c  J8j  Jv  Jl~  J8  @J  `J  zJ  ~J  Jl  J  J l D l D D 3D RD!qD!l#!D1!DI?!_IK!~I H;KY!Dm!D ! @J&dD!dD!D+!D!9dD!TdD! J[! J! J" J#" J5" JG" JY" Jl" vJq"dDi! fD l D"D"ےD"D l"ǮD"wlDY!D!D!D^"E"E" J[" J" J# J## J5# JG# Jm!El" pJZ# J! Jl#,Ez#GE#{E#{E#l# J?#בE#E# E#0E #PE@$EB$E"$ J3$E{EF$ET$Eb$Em$#E{$>E$ J$ J$E!ÜE$ޜE$ J@$ @J@$E$@E $`E$pE$E$ J $`E% J % E% J #%EθE-%E:%EH% JV%EFc%PEmr% E|%E%E%`E %E%E %F%`E&"%PE&l &l &l &l &l &l&ZF4"&PZFIG1&l?&lF&@l`O& iF^&0ls&4l~&mF&nF&'nF&FnF&enF&nF P;K&l&l&l&l&l 'l'l 'l&'l1'l;'lB'lM'lX'le' `Jx'F '@Fv'F'0I('F ' UJ' X;K ( ;K`(0Ft(Fu{(`FW(F( BJ(jl( l( J(PF(F(jl(jl(Fs)@F) J) J2) J B)0F>L)jl]) Jm)pjl{)0G)Go)G) I)(l)8l)0l) ,Go)-G * J* JL!* J;1*@l:* KL* `KxY*[G[Il*0lGw*@lGG*lGk*mG?*wl `;K*X* K*{G Pl*ZG* G *Hl+yG+ K+ K(+ K2+PG=+GN+ @K@2+G=+0G Z+ K@2+pG=+Gf+ K@ГIar+Xl Tl{+ H+ H h;Kb$8"Hm$S"H{$n"H+wlh+#He+#H3+`l +l+&H+ll+@'Hh+ (H+@)Hh+PH ,@*H6&#,0*H6,HA,lR,ld,lt, -K~, -K, -K,l,l,l,l,l,l,l,l,l,l,l,pHj,H-@I`I-H%-l p;K:-HxF-0HS-H^- Hj-HUy-l-l-l-l-l - l-I8-I-Iw-p'I>-'I[-0,IF.-I.l*.-I4>. .IxX..I l.8I-. :I8.`BI.FI.FI.`OI.l.QI /SI*/ l(7/`lF/ ZI\/@ZIk/[Iz/[Ig/ \Ij/\I?/]I/^I/`I//aI0`bI)0 cIt<0dIjN0eIj0Hxlt0Xl~0l0l0jI0Pl0Hl0hl~I0@0jl0@ 1jl 1jl11jlE1jl[1jln1jl1@B1 J@1l1PB10@ 1p@1"@Q1*E)1 JL1"B2@@R2rl%2B#52QA7G2 c2`@t2G?}2@@2@W2"pLF2PE)2E2!A2p@@2B2@@&2 +I3+G3`A#3 l.3pI?3"CH3!rlV3bGg3@PAAu3 `IH3kA3C@3P|@63 I 3B3*pHB)3"@@W 4 "I!4gBL24,ID4`@C d4lm4!l4`A4@4Xl4j@H4P C4V@5"@ 5@P5P@W5WG.5@K5"P?A|[5E@s5&5 `J\5p@Q5"мB5"H5I5"P@Q5"@F5"x@59@6`D@!6'H/*6C=6d@Y6Fh6,Iv6l@60G 6pE6"PF6F86AM6PHo6B7SAN7"pB7G(7rl/7" A87 @"Q7Ef7@>@y7C7@7! l7fA|7sl7"B#7}@8"0 D8aB5*8l>8C#S8@c8lo8p3A8EG8Pd@ 8{@8E58B8C@8 l9 PA!9"@&9"0@Q.9iI&?9"AAM9z@ e9 Ar9jFz9D9 G9E@9@{9"0 D9E9E90H:"%@B : I.: ILJ:0O@#_:"@6An:~@q:d@:0@: A:B:Ba: ^C%:H/:By ;"@F;"Ea;pH%;l8;BC;G;M;pLFV;"C@h;"`Ay;"&F;B;rl;H8;"Pd@ ;@Em;(l<pyG <`A<@$<@5<LB=<0:C/]<lu<d@;<0F<AG< @)<k@<0l<0<@%<WI=A=CT1=hApD=@R=B^=@="B=pB=Hjl=}@="`!A$= h@e="pB= I>ps@-/>&CH@>"@JI>De>Pslr> `K@>B>H> lI > {@">@I>"!H8>)A ?@{"?@P/?C}B?Y@S?@a?4l|?G$?@H?k@?%G??"p@Q?"A?PC@E@&@"A13@B:@@OA D@Y@V@ D@t@@W}@ B@@sl@Hl@hkl@"0B@l@,I@P{@ A@-AD7AD8HAl_A I ~A0CA`+AA"IFhAEA"@WA~@VA`d@A DA(B B+B" GB@)B0]F6B"`F>B@KBd@;aB`BglBPgB)xB"@BpHBFB BPFBVF0BQIB~@VCС@QC l'C@:CjAJC@\C )I sC@{{C"PB C8C@CwlC~@qCEGC I C{@DED" B!Dll.DDID" AQDz@ gDy@xD"@WDHD>A<D"F8D"BDpg@D @D8lE١@E"pG E@5EE@ OEPCdE[Gr|E JLE@EAcE@YA$E"@E@0E E"@F&FC/.FlAF@TFA^bF`~@6uF9@F" AF"О@QFpVF"F@$F@$F@FOAF"`@G G@#/G"мB;GIDGCWG"B]GA{hGPbCGlGplGE}GrlG"P@WGYF G!rlH@ZHBz(H HCAH,IPHkl]HClHp]BesH@{H",IH)H<HBHTAOH@GbH`{@HCH"0%F9H0hD(I I &I@A1IPgA'DIPA6PI0@jI0EGI@Id@I@H[I@CI0CcI@IеEIPCJ"0@QJ"@!JCW3J0jl@JDAgVJleJFtJArJ`ACJ`@@ J@IF2J|GJ@QJnG}JBJNA! KI@K"LF&K"С@Q/KJF7K GAK"0@MK IaKP@6oKC'K"PBK @KG5K`ACK&K@@K@HBK"BzK6AK AL"&FCLA%L0@LBL'H KLwlfLPlwL0A ~L `J(L"@QL`fAjL `IL"FLЉGLlL J M"Х@Q M"0@ MBM'MPE@=MklLM zClM xIM0B4MFGZMi@]M"BM0HM`BM"JFM@BNN FN"`@$N H 5Nd@LN"PHoeN! JnN E}N@lN"@@WNА@xN K@NlN"p@N lG N@D@ N0B{O"0B O JL(O@G9OGOOd@gO@O `IO lO@JOBODO IOH$O0qHOp@OP"BP`@&$PBB9P0@>LP eP I~nPBuP"pG P@2PPE1PpD@jPB#PE@ PШC Q@3Q5Qk@KQЖE8UQ" F`Q{AvQ"9AQ&Q C QFBQ|B>Q@ CDQ"BQ0GGg R0UI,R@9RHCR"BKRl\REDoRDR"AyRvAR"ГEORPFRE@R"pFDRE@ R"BDRk@S"@WS"=A7(S"Х@Q2SpEAnES"YBRMSA{]S"@AsS"EzSASp@,S!lS DI SЏ@S(lS2CS"@T&TIFh&TRA8TS@JT@WXTО@QdT@ oT I T`kFjTlTB\T@CTBTsIaT@ UBD!U6A-5UPE0DU @sXU E|dU0B1}UpBU"Х@QU@AU"IF UPUnCU"PCUxlV@V@@-VPeGa ;KMaBeaVC#aE)a"BaFaBaHJae@wa"y@Ma@{bPFbxA&bsI>bppGZb@Bbb0A kb`E&"b"@bpFb"pBb E@'b@b0BbBb0Ab`C4bp^Ac@jl cPOA!c @B8cqGEc`ALc@TI[cHec -I}cwlc2Cc0FclcEc"BcмBcB@c?A*d%dA91d tIJdBVd"`7A/id" ArdGd0Cd K@dٞ@dCd@d}@edAepg@1e0hBo=e@mGZe @KheEqe"@Q}e"AA1e~@VeGBueAe \I eBe@@e`EWfBfrlf"`BX$f"@)f"@B>f WffG]kfwfklfzAfrlf`Ff (K8flf@@g"@H gDgpBgBw0glAg0{GOgPNFYgJ@qgH xgl8}g}@ g slg!(lgPBg@g@grIg I h;Khp`A -h"@'Lh" AShЗB7Zh@nh@}hRAhx;KhPA<hp[Ah@Eh!H8h(h"A)i@+!i>@d6i CHi PI pi"О@Quiwli@@i0<@%i@F@wiBfiZGi"@WiE@ j"@QjH*jB3j0%F9@j @KZj`BIbj |j(F6!j K@j"@jDjCZjDNjЪEjpGok"PPFk@.,k@Hk0A Vk"@W`kB'pkpNB ~kpg@k @ k @kk@k@XkJFk"B l{@l`QA3+lH3l`A?l7B)Gl"BNl"PDUl00AGmlEAzl|E4l! sll*E<leB{l"@WlpBltAl"Bmlm@9m`H2Bm"@#Nm0-AlmAyvm @bm@Am"Bm @JDm`Fm@Bjm@Jm"!Am"@Wm `In'Ia%nZGY:nkFGnFOnHZnp%FlnpEWunln0C n@n`#@n@nJF n"p3AnFXnE@ o"Bo `Iho`ED'o" l@9oEEo"UFMo"Dgo@AEvo"pFRo@o I opRAoAAopHB)oBo Ip"B'p@H"0p{@ Dp apG/mp"Aypk@p"@p pн@p&p Dp@pEp `I q"Bmq`VIk,qкB:q @UPqd@ mqE<|q *KqPQAq`@qEmqdGJq`@$qP@Qq"@Wr"`@rHlrc@ 0rpH7rEmMr@Wrrlqr[GYr"Br@r BrCRrBr I r"AMrLFr@HDsPTA^sP@*s K@8s"@Os">A<]s"BbsHis s J$s"pEWs Js0@QsoAEs!@s0CsPlt{@t,I-t"HJ7tP@Gt hI it @"t@tPjltlt I tHtXlt{@ uB-u@CeBu"DKu*E)Qu0@Lmu@"u"Bu0@&u`@u"AuPxlu @@u@QupEu`MC vYF$vOA$6v@NB)=vd@Vv@Zpv BtvPB v"@v@ vBvpHv`lvUFv I vl$v w! J8w"ЖE8 wP?A|4w@cBwlUwlbw @rw"B w"DNw"0PFw@)AwEwF@!w{@gwklw"@AEwB x"@x`|I7!xhl,xF@!Bx#GSx ,K4^x@6kx"@Qrx@x`HGx 8I x`d@x@Ax"0Fx@Fx! J8xll yD#O yE /yYF4y@@WDy"pBLy`EYy`nA:ay I yC@yYIryFby@_yG-yr@z d@'z@(zP@64z ;J?z0C LzMA%]zE1xzBzSA z @z"pVF"z"Ez@zI@z`l8z" Az@{`H){D@ E{H`N{"Х@QU{"Х@Q]{ Jq{ YJ{`B{ AT{GG{Bm{Pl{"H]{sl{@Q{D@ |@R:|@M|A<T|ПE(g|Glt|Ѕ@| `K@|C|c@|qGr| `kl|pC|/@ }"@ ,}GBu5}~ASI}lY}"Dr}0PF~}B}Xl}"PB}@}FG}"0 D}@;}G}|@~"F~@T,~pl<~ K@O~PBVi~@ u~E@ ~ ~ JL~sI!~SA~|I~ XI~D p@ "pEAn+ I S0@6[y@l'H/v@$ I "H"`AC xI  ,I `@BYBR$G1@I60@G"0HP@b=A7v"0@Q|"`B A"GA I ˀ"`G Ԁ@PPFЏE@  cB&(CD TJZ*)H<hk@ll@k K  E@'܁pE"P@6C@B -I7 @ M07A%[rlb"Bi `JDBpFD"0@6B`@, Iɂ0HՂ"@H"܂"0qH"`APH"G "@Z"@)"G$/F:PBwF BKj@Hd9@u A"PBHsli@]@<Ճ"H ߃lBl'F<!`l-@>"p@QD.I#b0qHmII"AS@zAFXslń 6I ݄@FY"0GNHХ@QB!"G?(HH"AREfkG""D@6A"A{rlC7ɅB҅ D"0@QB@,I#Ea-&AгFN@d"@WjP@@ wxl@<pB`Ft {@ Άc@ @F"YF lnF#C:FB`lTE?c@o)CmGb"`BC`@dlԇ0Bc"@)A@ @ "p%F E)(l4 JG K@X;Kx"JF @E=A`F@MňGQԈxl@SFI"@A PSAD0"0@Q8BDCG1O"FVPB_ @J$rRIPxlBD I sl(@2ɉ@E׉BPNAr |I' l,@VI`HuS`E[w_"?A*l DxGJ@lh&̊ Aي@*H6&"{E"BDPC I1"D9tF%G@TE]pBg0O@#zF6`@@&FCAɋqH݋0GNlC"@ `I *DN6`BX>vlPl\0PApPaG|)H<pA"`p@XGtlȌ"@YA$Ҍ@X`jl I# J%@B '@8pB-C"BH!A8W"B.blr NA+@E%Hb@č @1ɍ@-IP׍!l }Cp!PD@; DS`p@gBp@FyH @0A1PF:ӎ0G*E<BD J8"0 D!`@-rl7 I d@En I@"FX@KP@]F̏ K@ޏD#OB=P@@ @"@W(КE4`CaAlK`@\i@Qx *K`E tI Őc@'F@ l"l@|+ I>HD] _JklyC`!A$BD@@'ˑtAbݑ@@*p@EPC7@#$l4 jBYC IRдBPXsl(lD@pG@C@ƒ@)ݒhlA)F0B2%@1H?"BL-IPZ J u I B`lI@@Qӓ@@* E@%B,"Х@Q4"@;rl["@Qe@!"@Q!sl@nG}"Bp@Q{Eʔpklޔ"@Pж@"@ "ER) I @eAIgCpд@Wн@ IH@WlΕPDוPCE)@pB`@x6@A@lQRA^@AEh" E[n`Cy,I`7A/pD@j–`klϖ#H1ܖ`A+I  l@ %AB )B0" B9`RAJBTF]l(fl|A1"pB-@E0F Η0@Qۗ@B J8lnl &&F5l@|LAA1bd@@oG%C9A@ɘ"HӘH7 y@M"@W D@#"@Q+{E6PcGQ"0hBo[Bc{p@`@"@PP @Ǚ"jF͙"кBٙCB <@mH""@Q+@@B K@QWGaPbA'mZI 0O@#>Aq`slۚl"B"ps@-` @& ؞I LWAsb @z"FpG"AcYI ERț @"@"PNFqHF% Tsl"IO0`@@ @AL"@WS"0@QY0@dz@@hBq"@@&0@Q͜IF ל`D@RAH lAS'!rl7p @0Q&ov@F&AxPdB{D#Omlslȝ@HН @MA+"`@ P@"%@E+ IUQAbx@x IH`ApFR0F3@FΞ"@@*ڞpOA @I "H%"H1`IVE `K@]ldpC"FBW"Acall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST____do_global_dtors_auxcompleted.5850dtor_idx.5852frame_dummyobject.5877__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxffindex_unpack.cffutil.cffindex.caction.4996ffindex_compare_entries_by_name__func__.4968__func__.4691__func__.4740__func__.4654__func__.4550__func__.4592__nptl_initial_report_eventssigcancel_handlersighandler_setxidnptl_versionstack_cache_lock_L_lock_11stack_used_L_unlock_47_L_lock_104_L_unlock_153in_flight_stackstack_cache_actsizestack_cache_L_lock_685_L_unlock_858_L_lock_884_L_unlock_992_L_lock_1018_L_unlock_1080_L_lock_1295_L_unlock_1379do_clone.clone.0start_thread_L_lock_1517default_attr_L_lock_1785_L_unlock_1918_L_unlock_2124_L_lock_2272_L_unlock_2292__nptl_threads_events__nptl_last_event_L_unlock_2364_L_lock_2621_L_unlock_2643_L_unlock_2690_L_lock_2765_L_unlock_2793_L_lock_2914_L_unlock_3618_L_lock_3898_L_unlock_3981_L_lock_4594_L_unlock_4598cleanup_L_lock_31_L_unlock_61_L_lock_29_L_unlock_64_L_lock_26_L_unlock_50_L_unlock_131__pthread_mutex_lock_full_L_robust_lock_261_L_unlock_798_L_lock_854_L_lock_892_L_lock_995_L_unlock_732_L_timedlock_101_L_timedlock_292_L_robust_timedlock_358_L_timedlock_1071_L_unlock_1152__pthread_mutex_unlock_full_L_robust_unlock_106_L_unlock_543_L_unlock_655_L_lock_13_L_unlock_32_L_lock_20_L_unlock_38_L_unlock_105_L_lock_124_L_unlock_179_L_lock_197_L_unlock_227_L_lock_249_L_unlock_283_L_lock_306_L_lock_328__condvar_cleanup2_L_lock_18clear_once_controlcheck_add_mapping_L_lock_97_L_unlock_145defaultmountdefaultdirwalkerthe_semrec_L_lock_37sem_wait_cleanupsem_timedwait_cleanupsem_timedwait_cleanup2unwind_cleanupunwind_stopmiss_F_GETOWN_EX_L_lock_23_L_unlock_16__restore_rt_L_unlock_51_L_lock_225_L_unlock_251__pthread_mutex_cond_lock_full_L_robust_cond_lock_293_L_unlock_830_L_cond_lock_886_L_cond_lock_925_L_cond_lock_1028static_slotinfostatic_dtvstatic_maplockstage_L_unlock_138_L_lock_156msort_with_tmpphys_pages.10078pagesize.10079_L_lock_16_L_unlock_121_L_lock_211_L_unlock_325_L_lock_458_L_unlock_570initialcancel_handler_L_lock_47sa_refcntrquitintr_L_unlock_66do_system_L_lock_98_L_unlock_123_L_lock_254_L_unlock_288_L_unlock_379_L_lock_413perror_internal_L_lock_36_L_unlock_106_L_unlock_186_L_unlock_215_L_unlock_181_L_unlock_241_L_lock_50_L_unlock_104_L_unlock_177_L_lock_51_L_unlock_205_L_unlock_236_L_lock_53_L_unlock_237_L_unlock_351_IO_wfile_underflow_maybe_mmap_IO_wfile_underflow_mmap_L_lock_805_L_unlock_1194_L_unlock_1384_L_unlock_53fmemopen_seekfmemopen_closefmemopen_readfmemopen_write_IO_file_seekoff_maybe_mmap_IO_file_sync_mmapdecide_maybe_mmap_IO_file_xsgetn_maybe_mmapmmap_remap_check_IO_file_xsgetn_mmapnew_do_write_L_lock_2033_L_unlock_2078_L_unlock_2227flush_cleanuprun_fp_L_unlock_24list_all_lock_L_unlock_37_L_lock_860_L_unlock_885buffer_freefreeres_listdealloc_bufferssave_for_backup_L_lock_1783_IO_list_all_stamp_L_lock_1855_L_unlock_1890_L_unlock_1922_L_lock_2021_L_lock_2101_L_unlock_2151_L_unlock_2304_L_unlock_2561_L_lock_2643_L_lock_2673_L_unlock_2711_L_unlock_2751_L_lock_2799_L_lock_2829_L_unlock_2899_L_unlock_2957_L_lock_4072_L_lock_4102_L_unlock_4172_L_unlock_4252__elf_set___libc_atexit_element__IO_cleanup____elf_set___libc_subfreeres_element_buffer_free___IO_stdfile_0_lock_IO_wide_data_0_IO_stdfile_1_lock_IO_wide_data_1_IO_stdfile_2_lock_IO_wide_data_2enlarge_userbufptmalloc_lock_alllist_lock__libc_tsd_MALLOCmain_arenamalloc_atforksave_malloc_hookfree_atforksave_free_hooksave_arenaatfork_recursive_cntr_L_lock_74ptmalloc_unlock_all_L_unlock_108_L_unlock_117ptmalloc_unlock_all2free_listarena_thread_freeres_L_lock_186_L_unlock_192disallow_malloc_checkusing_malloc_checkingmalloc_checkfree_checkrealloc_checkmemalign_checkmem2chunk_checkmp_malloc_printerrmalloc_consolidateglobal_max_fast_L_unlock_1142check_action_L_lock_1159_L_unlock_1176_L_lock_1194mALLOPt_L_lock_1334_L_unlock_1365perturb_byteptmalloc_initnarenasatfork_mem_L_lock_2027_L_unlock_2335_L_lock_2402_L_unlock_2545munmap_chunknew_heapaligned_heap_areami_arena.16358_L_lock_2925_L_unlock_3128arena_get2_L_lock_3405_L_unlock_3419_L_lock_3427narenas_limit.12907next_to_use.12878_L_lock_3519arena_mem_L_lock_3789_L_lock_3794_L_unlock_3801_L_lock_3978_L_unlock_4143_L_lock_4304_L_unlock_4338_int_free_L_lock_5084_L_unlock_5211_L_unlock_5502_L_lock_5514_L_unlock_5568_L_lock_5581_L_lock_5615_L_unlock_5629_L_unlock_5873_L_lock_5884_L_unlock_5913_L_lock_5927_L_lock_6231_L_unlock_6251_L_unlock_6270_L_unlock_6325_int_malloc_L_unlock_7632_L_lock_7645_L_unlock_8064_L_lock_8073_L_unlock_8103_L_lock_8119_L_unlock_8138_L_lock_8151_L_unlock_8595_L_lock_8605_L_lock_8978_L_unlock_9023_L_unlock_9186_L_lock_9192_L_unlock_9201_L_unlock_9225_L_unlock_9247_L_lock_9372_L_unlock_9391_L_unlock_9418_L_lock_9425_L_unlock_9434_L_unlock_9470_L_unlock_9492malloc_hook_ini_L_lock_9556_L_unlock_9636_int_memalign_L_lock_10001_L_unlock_10043_L_unlock_10094_L_lock_10101_L_unlock_10111_L_unlock_10168_L_unlock_10190_L_lock_10271_L_unlock_10307_L_unlock_10353_L_lock_10360_L_unlock_10370_L_unlock_10424_L_unlock_10446_L_lock_10550_L_unlock_10569_L_unlock_10620_L_lock_10627_L_unlock_10637_L_unlock_10652_L_unlock_10674memalign_hook_ini_int_realloc_L_unlock_11385_L_lock_11395_L_unlock_11418_L_lock_11432_L_lock_11543_L_unlock_11554realloc_hook_initop_check_L_unlock_11938_L_lock_11970_L_lock_12223_L_unlock_12241_L_lock_12353_L_unlock_12356_L_lock_12513_L_unlock_12523_L_lock_12551_L_unlock_12606_L_lock_12936_L_unlock_12956_L_lock_13081_L_unlock_13103_L_lock_13189_L_unlock_13354__elf_set___libc_thread_subfreeres_element_arena_thread_freeres____strcmp_sse42__strcmp_sse2buf__strncpy_ssse3__memcmp_sse2__rawmemchr_sse2__rawmemchr_sse42two_way_long_needleintel_02_known_comparehandle_amdintel_check_wordintel_02_knownhandle_intelinit_cacheinfoto_wcto_mb_L_unlock_87__sysconf_check_spec_L_lock_1075_L_unlock_1875_L_unlock_2501syslog_lock_L_unlock_7LogMask_L_lock_46connectedLogTagLogTypeLogFileopenlog_internalLogStatSyslogAddrLogFacility_L_lock_519_L_lock_795_L_unlock_820trecursetdestroy_recurseconvert_and_printphys_pages_infonext_linefree_mem_L_lock_35fork_handler_pool_L_unlock_46_L_lock_106_L_unlock_219__elf_set___libc_subfreeres_element_free_mem__backtrace_helper_L_lock_42_L_unlock_102_L_unlock_158result.11786buf.11787unsecure_envvars.11690free_derivationderivation_compareonce_L_lock_396_L_unlock_462find_derivationknown_derivations_L_lock_2177_L_unlock_2191_L_unlock_2288_L_unlock_2309_L_unlock_2390free_modules_dbempty_path_eleminsert_moduleadd_modulegconv_module_extadd_alias2lock.13773_L_lock_865_L_unlock_874builtin_modulesbuiltin_aliasesmodcounter.13696mapinmask.13808gconv_cachecache_mallocedcache_sizefind_moduleloadeddo_release_alldo_release_shlibrelease_handleknown_comparenew_composite_name_nl_current_used_nl_category_postloadstripcodeset_idx.11263_nl_category_num_items_nl_value_types_nl_value_type_LC_CTYPE_nl_value_type_LC_NUMERIC_nl_value_type_LC_TIME_nl_value_type_LC_COLLATE_nl_value_type_LC_MONETARY_nl_value_type_LC_MESSAGES_nl_value_type_LC_PAPER_nl_value_type_LC_NAME_nl_value_type_LC_ADDRESS_nl_value_type_LC_TELEPHONE_nl_value_type_LC_MEASUREMENT_nl_value_type_LC_IDENTIFICATIONarchloadedarchmappedheadmaparchfnamearchive_stattranslit_from_idxtranslit_from_tbltranslit_to_idxtranslit_to_tblplural_evalroottransmem_listtranscmpoutput_charset_cached.12711output_charset_cache.12710lock.12140_L_lock_1420freemem.12151freemem_size.12152_L_unlock_1550_L_unlock_1602_L_unlock_1633_L_lock_2222_L_unlock_2229plural_lookuptree_lock.11541_nl_loaded_domainslock.12095lock.11836_L_lock_148_L_unlock_178read_alias_filemaxmapnmapstring_space_actstring_space_maxstring_spacealias_compare_L_lock_629locale_alias_path.11130_L_unlock_734_nl_make_l10nflist.clone.0new_expyypactyytranslateyycheckyydefactyyr2yyr1yypgotoyydefgotoyytableplvarploneenvlock_L_lock_9last_environ_L_unlock_18_L_lock_68_L_unlock_107_L_lock_209_L_unlock_316known_values_L_unlock_493_L_unlock_541_L_lock_758_L_unlock_767_IO_helper_overflowbuffered_vfprintf_IO_helper_jumps_L_unlock_289group_number_i18n_number_rewrite_L_lock_972_L_unlock_1058jump_table.14360step0_jumps.14376step4_jumps.14563step3b_jumps.14411step4_jumps.14412step1_jumps.14407step2_jumps.14408step3a_jumps.14409nullhack_digit.15416_L_unlock_45_L_lock_123_L_unlock_147_L_lock_14pa_next_type_L_lock_742_L_unlock_827jump_table.14392step0_jumps.14408step3b_jumps.14443step4_jumps.14444step1_jumps.14439step2_jumps.14440step3a_jumps.14441step4_jumps.14586_L_lock_13641_L_unlock_13717_L_unlock_1211_L_lock_1248value.11473letters_L_lock_33_L_unlock_81_L_unlock_135_IO_cookie_read_IO_cookie_write_IO_cookie_seek_IO_cookie_close_IO_cookie_jumps_IO_cookie_seekoff_L_unlock_112_L_unlock_169_L_lock_32_L_unlock_128_L_unlock_171blankszeroes_L_lock_208_L_unlock_452save_for_wbackupdo_encodingdo_always_noconvdo_max_lengthdo_inCSWTCH.66do_unshiftCSWTCH.68do_outCSWTCH.70do_length_L_unlock_84_L_unlock_124_IO_mem_jumps_IO_mem_sync_IO_mem_finish__strchr_sse2__strchr_sse42__strcpy_sse2__strcpy_ssse3__stpcpy_sse2__stpcpy_ssse3__strcasecmp_l_sse42__strcasecmp_l_sse2__strcasecmp_sse2internalstatecompute_offsetcompute_changetzstring_listold_tztz_rulestzset_internalis_initialized.11097tzset_lock_L_lock_2260_L_unlock_2276_L_lock_2291_L_unlock_2297_L_lock_2332_L_unlock_2393num_transitionstransitionstype_idxstypesrule_stdoffrule_dstoffnum_leapsleapszone_namesnum_typestzspectzfile_inotzfile_devtzfile_mtimedefault_tzdir.5688__strftime_internal_nl_init_era_entriesres_setoptionsres_thread_freeres__res_vinit.clone.1sort_mask_chars__elf_set___libc_subfreeres_element_res_thread_freeres____elf_set___libc_thread_subfreeres_element_res_thread_freeres__getifaddrs_internalis_dstlocal_strdupfillin_rpathcurwd.12181ncapstrmax_dirnamelensystem_dirsadd_name_to_objectprint_search_pathmax_capstrlencapstrloseopen_verifyexpected.13001expected_note.13007expected2.13000open_pathrtld_search_dirssystem_dirs_lenenv_path_listexpand_dynamic_string_tokendecompose_rpath_dl_map_object_from_fddummy_bucket.13401cachecachesizecache_newcheck_match.12333do_lookup_xundefined_msgmsg.12626errstring.12603receiver_dl_out_of_memoryprimes.11683_dl_debug_vdprintfdo_dlclosedo_dlsymdo_dlsym_privatedo_dlopen_dl_open_hookdata.10373internal_trans_names.10119open_translit_L_lock_99trans_comparesearch_tree_L_unlock_127not_availablecollseqmbcollseqwcstr_to_mpnround_and_returnnbits.12487nbits.12476nbits.12475next_bit_L_lock_491_L_unlock_537_dlfcn_hookscheck_freeinitlast_resultstatic_buffree_key_memkeyfinidlinfo_doitdlmopen_doit__strncasecmp_l_sse42__strncasecmp_l_sse2__strncasecmp_sse2ydhms_difflocaltime_offsetlast_family.10601last_type.10602afs.10606max.9534xdigits.9962runninglowpctextsizelog_hashfractiontosfromsnarcspnarcsfromlimitdatafromidxdl_open_workeradd_to_globalfree_slotinforemove_slotinfodl_close_state.12869dlopen_doitdlclose_doitdlsym_doitdlvsym_doitprofil_counterpc_offsetpc_scalensamplessamplesotimer.10168oact.10167openaux_dl_build_local_scopematch_symbolcall_dl_lookupdo_symread_sleb128_Unwind_DebugHookdwarf_reg_size_table_Unwind_SetSpColumninit_dwarf_reg_size_tableexecute_cfa_programuw_install_context_1execute_stack_opuw_update_context_1uw_update_contextuw_frame_state_foruw_init_context_1once_regsizes.8901_Unwind_ForcedUnwind_Phase2_Unwind_RaiseException_Phase2object_mutexunseen_objectsfde_unencoded_compareframe_downheapframe_heapsortsize_of_encoded_valuebase_from_objectread_encoded_value_with_baseget_cie_encodingclassify_object_over_fdesadd_fdesfde_single_encoding_comparefde_mixed_encoding_comparelinear_search_fdesbase_from_cb_data_Unwind_IteratePhdrCallbackadds.8719subs.8720frame_hdr_cache_headframe_hdr_cachesearch_objectmarker.8092terminator.8365seen_objects__rela_iplt_end__fini_array_end__rela_iplt_start__fini_array_start__init_array_end__preinit_array_end_GLOBAL_OFFSET_TABLE___init_array_start__preinit_array_start__vsyslog_chk_nl_C_LC_CTYPE__have_o_cloexec__duplongjmp__libc_tcdrain__recvmsgstpcpy_nl_C_LC_CTYPE_class_printtsearch__lll_robust_lock_wait__morecore__getdtablesize_IO_remove_marker_nl_current_LC_COLLATE_used__libc_sigaction__isnanl__pthread_cleanup_upto__libc_preadmbrlenstrcpy_IO_wdefault_xsgetn__fcloseallpthread_yield__syslogpthread_mutex_consistent_dl_vsym_dl_setup_hash_IO_link_in__daylight_Unwind_Find_FDEunsetenv__malloc_hook_dl_debug_printf_IO_sputbackc_nl_C_LC_CTYPE_class_upper_IO_default_finish__pthread_attr_destroypthread_barrier_destroy_thread_db_td_eventbuf_t_eventnumwarnxbcmp__recvfrom_dl_check_map_versions__GI___rawmemchr_Unwind_GetIPInfo__gconv_transform_utf8_internal__is_smp__malloc_initialize_hook__default_morecore__find_in_stack_list__libc_argc__pthread_rwlock_trywrlock__init_cpu_featurespthread_mutex_timedlockwaitpid__longjmp__msgrcv_dl_receive_errorpthread_mutex_getprioceiling_IO_file_finish__pthread_attr_getstack_nl_current_LC_TELEPHONE_nl_C_LC_CTYPE_width__libc_fsyncgetrlimitioctl_nl_unload_domainpausewritevpthread_cond_signal__connect_nocancel__pthread_attr_getschedparam__dlinfo__get_cpu_features__pthread_mutexattr_destroyif_indextoname_Unwind_GetIPpthread_rwlockattr_setkind_np__mpn_impn_mul_n_basecase_IO_wdoallocbufgetgid__getpid_IO_fread__register_printf_modifier__syslog_chk_IO_list_locksysconf__strtod_internalstdoutvsprintfffindex_get_data_by_name_IO_seekoff_unlockedpthread_tryjoin_np_nl_load_domainffindex_get_entry_by_indexdaylight_IO_default_doallocate__libc_multiple_libcsgetdtablesizepthread_barrierattr_getpshared__strtoull_l_wordcopy_fwd_aligned__concurrency_level_dl_important_hwcapsffindex_restore__attr_list_IO_new_file_xsputn_dl_reloc_bad_typepthread_mutexattr_gettypepthread_spin_trylock_IO_least_wmarker__strstr_sse2pthread_attr_destroy__static_tls_align_m1_IO_default_syncrecvconnect__register_frame_IO_file_sync__pthread_condattr_init_IO_vsprintf__tzset__strtoull_internal__mpn_impn_sqr_n_basecasepthread_attr_getstacksize__pthread_oncestrtoull_l_IO_seekwmark_IO_fflush__mpn_extract_long_doublepthread_create_IO_wfile_jumps_nl_C_LC_CTYPE_class_xdigit__pthread_mutex_lock_IO_file_writepthread_getspecificpthread_rwlock_rdlock__new_sem_destroy_IO_ferrorstrerror__init_misc__gconv_transform_ascii_internal__mpn_sub_n__wcsmbs_clone_convgeteuidstrndupinet_pton_dl_profile_output__getdents__mpn_cmp__mbrlenpthread_attr_initmalloc_get_stateargz_add_sep__sched_get_priority_max__x86_64_data_cache_size_half__mpn_addmul_1pthread_mutexattr_getkind_np__strnlen__static_tls_size__gconv__cfree__xpg_basename__where_is_shmfsmemmove__gconv_transform_ucs2_internal__printf_modifier_tablepthread_rwlock_init__tcgetattr_dl_new_object__lll_timedlock_waitpthread_rwlockattr_getkind_np__pthread_debugpthread_exit_Unwind_Resume_or_Rethrow__calloc_dl_make_stack_executable_IO_default_xsgetnsem_timedwait__endmntent__pthread_mutex_cond_lock_adjustmunmap__sched_getparam__libc_stack_endpthread_barrierattr_destroyfileno_unlockedpthread_rwlock_timedwrlocksched_getparam_nl_default_locale_path__pthread_cond_timedwait__gconv_get_path_longjmp__register_printf_specifier_dl_debug_fd_nl_C_LC_NAME__tsearch_IO_vasprintf_thread_db_pthread_report_eventspthread_condattr_setpshared____strtol_l_internalftello64_IO_file_seekoff_mmap__pthread_once_internal__libc_fcntl__gettext_free_exp__pause_nocancelffindex_write__pthread_multiple_threads__isnan__new_sem_initpthread_rwlockattr_setpshared_dl_load_cache_lookup_nl_current_LC_NUMERIC_used__write_IO_fopen64__gettext_extract_pluralpthread_attr_getstackmalloc_stats__mmap_IO_sgetn__msgrcv_nocancel__pthread_attr_setdetachstate__msgsnd__mprotect_dl_use_load_bias_nl_domain_bindingsffindex_copyright_textstatfs64__gconv_path_envvar_Unwind_GetRegionStartpthread_condattr_getclock__pthread_setaffinity_new__dprintf__add_to_environ_dl_initial_searchlist_thread_db_pthread_schedpolicygetenv_IO_file_seekwcslen__parse_one_specwcpwrite64__pthread_key_create_internal__pthread_mutexattr_settype_itoa_worderrno__getmntent_rstrtold__sendto_nocancel__tz_computegetegid__new_fdopen__pthread_rwlock_init__tdestroy__rawmemchr__free_stacks_dl_profile_fixup__getcwd_nl_current_LC_IDENTIFICATION_used__res_ninit__mbsrtowcs_l_Unwind_Backtrace__pthread_key_create__libc_accept__sem_mappings_lockpthread_setname_np_IO_init_marker__strtol_internal_nl_category_name_idxsbsearchwmempcpy__libc_h_errno__pthread_current_priority__tzname__pthread_getspecific_internal__woverflow_thread_db_dtv_dtvpthread_spin_lock_IO_cookie_initexecve_IO_2_1_stdout___register_printf_functionvsscanfpthread_condattr_init__fsync_nocancel__libc_pwrite64__mpn_mul_n_IO_new_file_initgetpidgetpagesize__pthread_rwlock_wrlockffindex_index_parse__libc_multiple_threads_ptr__accept_nocancel__strtold_lpthread_getcpuclockidpthread_attr_getstackaddr__gconv_lookup_cache_dl_higher_prime_number_nl_C_LC_CTYPE_class_cntrlqsort__posix_memalign_IO_flush_all_linebufferedfgets__lll_lock_wait_nl_current_LC_TELEPHONE_used_IO_fclose_nl_current_LC_PAPER_nl_expand_alias__gconv_modules_db__strtoll_internal_IO_wdo_writepthread_key_delete__msync_nocancel__getdelim__read__wcschrnul__pthread_cleanup_pop_pthread_cleanup_pop__pthread_atfork_IO_default_underflowpthread_attr_getaffinity_np_dl_rtld_map_IO_funlockfilegetrlimit64_dl_init__gconv_load_cacheprctl__mallinfo__gconv_transform_ucs4le_internal_dl_platformlen_dl_tls_static_used_IO_switch_to_wget_mode__x86_64_data_cache_sizemsgrcv__localtime_r__realloc_hook__pthread_getaffinity_np__hasmntopt__strncasecmp_l_nonascii_Unwind_GetCFA__exit_funcs__gettextparsememcpypthread_cancelsetitimer__strncasecmp__unlink_IO_default_xsputn__mpn_lshiftpthread_condattr_setclock_nl_load_localeargz_count___printf_fp_thread_db_pthread_key_data_data_IO_fwrite_IO_default_setbuf_IO_sungetc__pthread_mutex_cond_lock_dl_try_allocate_static_tlsperrorpthread_mutexattr_destroy__dlsym__gconv_get_cache_dl_addr_inside_object_IO_new_fdopen_IO_fwide__gconv_find_shlib__connect_internalstrtoll_l_nl_unload_locale__DTOR_END___IO_new_file_close_it_dl_debug_mask__netlink_open_IO_wfile_overflow__libc_memalignpthread_equal__strcasecmp_l_nonascii__gconv_translit_find__libc_nanosleep__libc_dlsym_privateerrx__overflow__pthread_mutex_initmbrtowc__accept__btowc__mpn_mulsem_destroy__strtol_ul_max_tab_IO_flockfile_dl_non_dynamic_initgetuid__internal_atexit__isinf__memalign_nl_current_LC_MEASUREMENTsystem__mpn_submul_1hasmntopt_IO_file_close__IO_vsprintfargz_stringify__malloc_trim__pthread_cleanup_push_defer__dladdr_nl_current_default_domain_nl_msg_cat_cntrmalloc__libio_translit__open_IO_unsave_markers_nl_C_LC_CTYPE_classisatty____strtof_l_internal_dl_load_adds__gettext_germanic_plural__llseeksiglongjmp__wcsmbs_getfctpthread_attr_getscope_IO_2_1_stdin___gconv_transform_internal_ucs4_thread_db_sizeof_td_thr_events_t__get_child_max_dl_protect_relro__pthread_rwlock_tryrdlocksched_setscheduler__asprintf__strerror_rbtowc__wcsmbs_load_conv__strftime_lstrtoll__mpn_impn_sqr_npthread_rwlock_destroyregister_printf_modifiersys_nerropen_memstream__xidcmdrecvfromsem_wait_nl_C_LC_ADDRESS_dl_wait_lookup_donetcdrain_dl_mcount_wrapperpthread_attr_getguardsize_dl_deallocate_tlsstatfs_nl_C_LC_CTYPE_class_graph__mpn_impn_mul_n__current_locale_name__pthread_rwlock_rdlockpthread_mutexattr_getprotocol_nl_C_LC_CTYPE_tolower_dl_profile__libc_longjmp___vfprintf_chkstrtoul__dso_handle__mpn_construct_float__strsepsem_postsched_getscheduler__new_exitfn__libc_alloca_cutoffpthread_testcancel_nl_current_LC_NAME_used_dl_finimktempstrtold_l__nptl_deallocate_tsd_IO_switch_to_main_wget_area__pthread_attr_setschedparam__libc_pthread_init__pthread_attr_getstackaddr__dcgettext__libc_csu_fini_nl_current_LC_CTYPE_usedpthread_rwlock_unlock_IO_ftellstrftime_l_IO_str_init_readonly_IO_file_seekoff_nl_current_LC_TIME_dl_discover_osversion_nl_cleanup_time__memcmp_sse4_1__libc_init_securesocket_dl_nothread_init_static_tls__frame_state_for_pthread_cleanup_pop_restore__offtimereaddir__attr_list_lock_IO_adjust_wcolumn__strtoul_internalpvalloc_IO_str_seekofffopencookie__getgid__pthread_attr_setstacksize_lxstatpthread_attr_getinheritsched_xstat__pthread_rwlock_unlock__pwrite_IO_file_setbuf__lseek64_IO_new_file_fopenmempcpy__libc_mallinfo__pthread_unwind_nextfflush_IO_new_fopen__pthread_setcancelstate_environ_thread_db___nptl_last_eventsem_unlink_dl_cpuclock_offset__gconv_btwoc_ascii_IO_fdopen_nl_current_LC_MESSAGES__wcslen_IO_default_write__syscall_error_1__libc_pwrite__libc_read__fxprintf_thread_db_pthread_specific__tzname_max__have_sock_cloexec__libc_disable_asynccancel__gconv_find_transform__clone__gcc_personality_v0pthread_mutexattr_getrobust__xstat64_IO_file_close_mmapputwc_unlockedffindex_tree_unlink__GI_strchr_dl_allocate_tls_storage__exit_threadlseek__libc_reallocwmemcpy__libc_tsd_CTYPE_TOLOWER__gconv_transform_ucs2reverse_internalclearenv_dl_tls_static_align__libc_sigwait__pthread_getschedparam_dl_scope_free__environ__waitmmapstrncasecmp_Exit__lll_unlock_wakestrtol_l_nl_intern_locale_data_dl_lookup_symbol_xpthread_detach_thread_db_pthread_eventbuf_nl_cleanup_ctype_dl_tls_max_dtv_idxsend_nl_C_LC_CTYPE_map_toupper_nl_C_LC_CTYPE_class_punctabort__libc_setlocale_lock__pread_nocancel_thread_db_sizeof_pthread_key_structpthread_attr_getschedpolicy__sigjmp_save__sched_fifo_min_prio__stack_chk_failffnchomp_dl_close__printf_fptzname__find_thread_by_id_dl_bind_not__libc_enable_secure_IO_wpadnftrylockfile_nl_postload_ctype_IO_fopencookietdelete_IO_fputs_thread_db_sizeof_pthread_key_data__gconv_transform_ucs4_internal__open_nocancel__recvmsg_nocancel_init_nl_C_LC_CTYPE_class_digit_IO_str_pbackfail__libc_thread_freeres_IO_wfile_xsputn__gconv_max_path_elem_len_IO_default_imbue__mpn_divremstrtoqpthread_attr_setstackaddrstrtol__sigsetjmp__libc_lseek64__dlmopen__backtrace_symbols_fdstrnlenrawmemchr__libc_csu_irel__lxstatuname__GI_stpcpy_nl_find_domainaccept_IO_default_readverrxpthread_getschedparam__register_frame_table__stack_user_IO_file_close_it__sys_nerr_internal_sys_nerr__libc_pread64_dl_platform__res_initstamp_IO_iter_begin____strtod_l_internal_nl_C_LC_CTYPE_class32pthread_setcancelstate__gethostname_dl_get_tls_static_infombsnrtowcsstrrchr__ctype_tolower_loc__libc_check_standard_fds__after_morecore_hooknanosleep__mpn_construct_double_thread_db_sizeof_pthreadcalloch_errno__start___libc_atexit__setitimerstrcasecmp_l__libc_enable_secure_decided_IO_file_stat__pthread_attr_getscope_dl_start__pthread_mutex_unlockmalloc_usable_size__sscanf__strtold_internaltdestroy__tzfile_default__register_frame_info_bases_IO_wfile_sync__libc_pvalloc__strtoll_l_dl_runtime_resolvestrtod_IO_vfscanf_internal__determine_cpumask_sizeisinf__sched_getschedulerrindex__lseek_nocancel__readonly_area_dl_tlsdesc_resolve_rela_fixup__guess_grouping__pthread_rwlock_unlock_internal__pthread_getspecificpthread_condattr_destroyffindex_insert_filepthread_attr_setscopewrite__execve__libc_valloc__strtod_lbacktrace_nl_C_LC_CTYPE_map_tolower__fork_generation_pointer__pthread_attr_setscope__backtrace_nl_locale_subfreeresenviron__dcigettextfprintf__tzset_parse_tz_thread_db_pthread_nextevent__pthread_attr_getschedpolicypthread_mutex_setprioceilingfputs_unlocked__pthread_mutex_trylock_thread_db_pthread_dtvp_dl_add_to_namespace_list__mpn_construct_long_doubledl_iterate_phdr_IO_str_jumps_IO_str_finish__sem_mappings_nl_normalize_codesetpthread_mutexattr_setkind_np__pthread_clock_settimedcgettext_dl_tls_static_sizebind_dl_debug_printf_c_IO_default_showmanycstrtof_lgetmntent_r__get_nprocs__isattyif_nameindexinet_addr_nl_state_lock__profile_frequency_dl_lazy_dl_debug_state_.stapsdt.base__gettimeofday_internal__gconv_transform_internal_ascii__stpcpy__mmap64_nl_parse_alt_digit__gettimeofday__inet_atonpthread_rwlock_timedrdlockpthread_cond_broadcastpthread_onceif_nametoindex_IO_str_overflow__deregister_frame_info_dl_initial_error_catch_tsdmadvise__malloc__GI___strcasecmp_l__send_dl_init_pathschdirpthread_attr_setinheritsched__msgsnd_nocancel__statfs__link_IO_file_xsgetn__hash_string_IO_cleanup_dl_argv_IO_default_seekposffindex_tree_get_entry__gconv_open__free_Unwind_Resume__dlclose_Unwind_DeleteException__fpu_control__gconv_transform_internal_ucs2__netlink_request__x86_64_prefetchwfseekmremap__getrlimitpthread_setschedparam_IO_new_do_write_nl_current_LC_CTYPE__GI_strcmp_thread_db_sizeof_list_t__readdir64_IO_file_underflowgetdelim____strtold_l_internal__gconv_release_shlib_nl_C_LC_MONETARY__read_nocancel_nl_make_l10nflist__fopen_internalpthread_barrierattr_setpshared_IO_no_init__pthread_rwlock_wrlock_internal__strchrnul__libc_register_dl_open_hook_tens_in_limb_IO_padn__nanosleep_IO_file_overflowpthread_key_creatememchr_IO_getline_info_thread_db___pthread_keys__vsyslog__pthread_initialize_minimal__parse_one_specmb__readdirstdintfindwaitbacktrace_symbols_fd_nl_current_LC_TIME_used_dl_runtime_profile__libc_resp__sched_fifo_max_prio_IO_str_init_static_IO_stdout_dl_dst_substitute_fpioconst_pow10_dl_tls_dtv_slotinfo_listpthread_setconcurrencysem_initdprintf__chdir_dl_allocate_tls_init__tzname_cur_max__gconv_close__wcrtomb__pthread_mutex_destroymktime_respthread_barrierattr_init__prognametimezone__sched_setparam_startsem_close__deregister_frame_info_bases_thread_db_pthread_key_data_seq__stop___libc_atexit_IO_flush_allpthread_mutexattr_setrobust_npferrorstrstr__lll_timedwait_tid_IO_new_fclose_IO_iter_file__start___libc_thread_subfreeres_IO_adjust_column_IO_flush_all_lockppthread_killftello__libc_errnomalloc_set_state__correctly_grouped_prefixmbpthread_timedjoin_np__libc_init_first_thread_db___nptl_initial_report_eventsread_dl_error_catch_tsd__pthread_initialize_minimal_internal__pthread_exitpthread_getattr_npopenlog_dl_signal_cerrorpread64pthread_attr_setstacksizesendmsg__mpn_extract_doublecloselog__argz_countffindex_bsearch_get_entrystrncmp_nl_current_LC_PAPER_used__strcasecmp_l_ssse3_nl_C_LC_COLLATE_IO_fprintf__secure_getenv_nl_explode_name_IO_vfwprintf_IO_wdefault_doallocate_dl_tlsdesc_resolve_relawcsrtombs__run_exit_handlers__pthread_unregister_cancel__libc_malloc__pread64__linkin_atfork__memset_sse2pthread_rwlock_wrlockffindex_fopen_by_entry__nptl_set_robustpthread_rwlockattr_getpshared_IO_ftrylockfilewmemsetget_avphys_pagespthread_spin_destroy_IO_marker_delta__ioctl__libc_freestrncpyunlinksetenv_IO_file_underflow_mmap_IO_sungetwc__gen_tempnameprogram_invocation_short_namestrcasecmp_wordcopy_bwd_dest_alignedsendto__opendir_IO_str_countsched_get_priority_max__printf_arginfo_table__pthread_attr_setaffinity_new_dl_openfunlockfile_IO_file_underflow_maybe_mmap__pvallocpthread_sigmaskreallocaddmntent_nl_C_LC_CTYPE_class_space__getegid__register_atfork__libc_siglongjmpfcloseall__pread_IO_wfile_jumps_maybe_mmap_dl_check_all_versions_dl_debug_initialize__tz_convert__mkdir__opensock__argz_create_sep__strdup_dl_tls_dtv_gaps__gconv_alias_compare__cxa_atexit__deallocate_stack__libc_send__wmemmove_IO_file_xsputn__brk__pthread_attr_setstackaddrreaddir64_nl_C_IO_wmarker_deltapthread_cond_init__GI_strcpywcsnlenregister_printf_specifier__libc_mallopttowctrans__pthread_cleanup_push_thread_db_link_map_l_tls_modid_IO_default_stat_IO_new_file_syncmemcmp__sched_setscheduler_IO_file_jumps_maybe_mmapsched_get_priority_min__profilpthread_spin_unlock_nl_current_LC_MESSAGES_used__mpn_add_nmalloc_trimpthread_rwlockattr_initfdopen_nl_current_LC_NUMERICfork_nl_current_LC_ADDRESS____strtoul_l_internalsscanf__fwprintf_nl_C_LC_CTYPE_touppersetmntent_Unwind_RaiseException__sched_yieldffindex_index_as_treepthread_mutexattr_getpshared__strcasecmp_l_itowa_lower_digits_IO_marker_difference__pthread_attr_getaffinity_newfputws_unlocked_dl_get_originsem_trywait__libc_pausemsgsndsigaction_dl_phdr__pthread_mutexattr_initwcschr_IO_free_wbackup_area__sigwait__libc_malloc_initialized_dl_name_match_pendmntent__nptl_death_event__res_init_nl_remove_locale__getpagesize_thread_db_pthread_cancelhandlingfread__mbrtowc__dlopen_IO_free_backup_area__syscall_error_nl_C_LC_TIMEpthread_setaffinity_np_IO_file_initsbrk__bind_nl_current_LC_MEASUREMENT_used_itoa_lower_digitsstrdup_nl_C_locobj__libc_close__underflow__make_stacks_executable__gconv_get_builtin_trans_dl_nns__pthread_condattr_destroy_Unwind_SetIPinet_aton__libc_csu_init_thread_db_pthread_key_struct_seqffindex_fopen_by_nameffindex_get_data_by_entry_dl_random__abort_msg_thread_db_pthread_eventbuf_eventmask_event_bits_dl_unmap_dl_scope_free_listpthread_condattr_getpshared__get_nprocs_conf__gconv_release_stepstrtoullindex_pthread_cleanup_push_deferffindex_get_data_by_indexgettimeofday__sigsuspend_nocancel__sigsuspendfopen__bss_start__pthread_unwind__libc_open_IO_wdefault_xsputn__gconv_transform_internal_utf8localtime_IO_default_uflowmemset__pthread_rwlock_destroy__pthread_getaffinity_newerr__wmempcpy__strtol_lmain__memset_x86_64_dl_start_profile_dl_origin_path__wcsnlen__wcsmbs_gconv_fcts_c__cpu_features_nl_current_LC_MONETARY_used_sys_errlistftell_IO_new_file_finish_dl_tls_setup_dl_tls_generation__gconv_lock_longjmp_unwindget_phys_pagesvfwprintfmbsrtowcs_IO_new_file_attach__GI___stpcpy__pthread_attr_setstackpthread_barrier_init__nptl_nthreadsmallopt__vfprintf_chkfclose__fortify_fail_dl_clktckpthread_attr_setstack_dl_cache_libcmp__mon_yday__sem_searchopen64fferror_print_dl_relocate_object_thread_db___nptl_nthreadspthread_mutexattr_settypemalloc_infotcgetattr__libc_writevsys_errlist_dl_dynamic_weak_IO_vfprintf_internal__strstr_sse42time__libc_recvfromopendir__wunderflow__uflow_thread_db_pthread_start_routine__pthread_attr_init_2_1__register_frame_info_table_bases_nl_select_era_entry__libc_system_dl_dst_count__condvar_cleanup1pthread_mutexattr_setpshared_IO_sscanf__flockfile_nl_C_name_nl_find_msg_IO_least_marker_IO_switch_to_wbackup_areasyslog_IO_list_resetlockffindex_unlink_entrieswcschrnulfwprintfffindex_get_data_by_offset__recvfrom_nocancel_tmbuf__vsscanf__lll_robust_timedlock_wait_dl_call_pltexitpthread_attr_getdetachstate__dlvsymllseek__lseek_nl_default_dirname_nl_POSIX_name__twalk_IO_getline_dl_allocate_static_tls__setmntentmountpointfread_unlocked__x86_64_shared_cache_size__libc_recvmsg__pthread_attr_getdetachstate__pthread_register_cancel_defer__sendmsg_nocancelstrcmp_IO_wdefault_uflow__mpn_rshift__pthread_clock_gettime_nl_C_LC_MEASUREMENT__gconv_get_alias_dbpthread_mutex_unlock_dl_tlsdesc_resolve_holddata_start_nl_find_locale__nptl_setxidpthread_mutexattr_getrobust_np__memchr__malloc_check_init__fork_handlersregister_printf_function__mbsrtowcs__addmntent__printf_function_tabledup__h_errno_location_nl_get_walt_digitstrtoul_l__fopen_maybe_mmap_dl_rtld_di_serinfopthread_barrier_waitgetcwd__wait_lookup_done_dl_sysinfo_dso_nl_C_LC_TELEPHONE__libc_enable_asynccancel__res_state__pthread_attr_getinheritsched_dl_starting_up_nl_C_LC_CTYPE_class_alnum__deregister_frame_IO_setb__dl_iterate_phdr_fini__register_printf_typeffindex_copyright_IO_file_fopen_thread_db_pthread_key_data_level2_data__vfork__write_nocancel__dladdr1__pthread_register_cancel_thread_db_list_t_prevgethostnamememalign_thread_db_pthread_tid_thread_db_td_eventbuf_t_eventdatasprintfvwarn__mempcpy_dl_unload_cache____strtoll_l_internal__reclaim_stacksasprintf__pwrite_nocancel_IO_new_file_setbufmsyncstrerror_r_IO_wfile_seekoffstrtof_IO_wfile_underflow_thread_db_list_t_nextstrtod_l__libc_waitpid__wcsrtombs_IO_file_doallocate_IO_fgets_wordcopy_fwd_dest_aligned__gconv_compare_alias_cache_libc_intl_domainnamestrncasecmp_lpthread_rwlockattr_destroy__gconv_path_elem__libc_multiple_threadssem_open__tens__pthread_attr_setinheritsched_IO_init_wmarkerflockfilesetlocale__libc_tsd_CTYPE_B__getclktck_Unwind_GetTextRelBaseffindex_insert_memory_IO_file_readstderrmmap64_nl_C_LC_CTYPE_class_blank__socket__lxstat64vforksetlogmask__libc_setup_tls_IO_file_jumps___asprintfprofilstrsepcfree__strncasecmp_sse42__strtof_lpthread_getaffinity_np__waitpidisnangetifaddrs__libc_forkverrpthread_rwlock_trywrlock__close_nocancel_IO_vsscanfsched_setparam_dl_init_static_tlspthread_rwlock_tryrdlock__pthread_setcanceltypetimelocal_dl_hwcap_mask__res_maybe_init__new_exitfn_called__strend_sse4__fork_lock__fcntl_nocancelfsync_Unwind_FindEnclosingFunction__strsep_g_nl_finddomain_subfreeresvalloc_IO_str_init_static_internal__wctrans_dl_stack_flags_nl_category_name_sizes_nl_get_alt_digitisinfl_dl_mcount__libc_lseek_dl_next_tls_modidisnanl__handle_registered_modifier_mb_IO_fopen_IO_wdefault_finish_dl_mcount_wrapper_checkregister_printf_type_IO_new_file_writemallinfo_IO_stderr__ctype_b_loc__mremap__printf_fphex__connect__pthread_setschedparam_Unwind_GetLanguageSpecificData__strndup_nl_current_LC_NAME__res_iclose_pthread_cleanup_pushpreadpthread_self_dl_init_all_dirspthread_setcanceltype_dl_allocate_tls__res_vinitpthread_spin_initpthread_mutexattr_initfreeifaddrslocaltime_r_dl_tls_static_nelem__tzfile_compute__gconv_get_modules_db__uname__fork_generation_IO_sputbackwc__libc_wait__gconv_read_conf__libc_dlclosetwalk__gconv_close_transform__sprintf__have_futex_clock_realtime_dl_tls_get_addr_soft_IO_file_attachffindex_unlinkargz_create_sepfwrite_unlocked__timezone_sys_nerr_internal_nl_C_LC_NUMERIC__stop___libc_thread_subfreereswmemmove_IO_unsave_wmarkers_IO_file_open__res_randomidffindex_tree_write_dl_map_object__pthread_keys__mbsnrtowcs_nl_archive_subfreeres__libc_tsd_LOCALEfwrite_IO_list_unlock__close__fxstat64__mpn_mul_1access__getuid_itoa_upper_digits_Unwind_ForcedUnwind_edata__xstat_thread_db_dtv_t_pointer_val_dl_load_lockqsort_r__path_search__sched_get_priority_min_IO_switch_to_get_mode_thread_db_sizeof_td_eventbuf_t_end__pthread_enable_asynccancel_dl_fixup_IO_vfscanf_IO_do_write_fitoa_word__strtof_internalpthread_mutex_destroy_nl_locale_file_list_nl_current_LC_COLLATE_IO_getdelim__GI___strncasecmp_lvfscanf_fxstat__gconv_release_cache_thread_db_const_thread_areastrtouq__tzfile_read__new_fclose__wuflow__sysconfpthread_mutex_lockif_freenameindex__sigaction__new_sem_getvalue__argz_stringify__libc_calloc__strncasecmp_ssse3__isinfl__curbrk__gconv_compare_aliassem_getvalue_thread_db_pthread_list__vfwprintf__tfind_nl_global_locale_dl_verbose_IO_default_seekoff_dl_dprintf__strncasecmp_l_IO_doallocbufpthread_cond_wait_dl_signal_error_dl_phnum_flushlbf__ftrylockfile__stack_prot__strtol_ul_rem_tab__libio_codecvt__pthread_create_2_1__errno_location__closedirlink__libc_messageget_nprocs_dl_profile_map_IO_switch_to_backup_area__pthread_kill__dlerror__pthread_mutex_unlock_usercntexit_Unwind_SetGR__free_hook_nl_current_LC_ADDRESS_used__gconv_transform_internal_ucs4lepthread_attr_setguardsize____strtoull_l_internal__pthread_cond_wait__munmap__writev__libc_tsd_CTYPE_TOUPPER__pthread_setspecific__malloc_usable_size__netlink_free_handle__gconv_transliterate__strcasecmp__fxstat_sys_errlist_internal__strtoul_l_IO_sprintf_IO_stdin_thread_db_pthread_schedparam_sched_priority_IO_wsetb_IO_wfile_jumps_mmap__fprintfbrkffindex_insert_filestreampthread_mutex_trylock__tzstring_nl_C_LC_MESSAGES_IO_vfprintf__wcsmbs_named_conv__pthread_selfpthread_atfork__pwrite64_IO_seekoff_dl_aux_init_dl_hwcap__pthread_disable_asynccancel__libc_sendmsg_itowa_upper_digits_IO_wfile_doallocate_thread_db_pthread_key_struct_destr__pthread_mutex_unlock_internal__strcasecmp_ssse3pthread_sigqueue__use_tzfilepthread_cond_destroy_nl_category_names_dl_tlsdesc_resolve_hold_fixup_nl_C_codeset_dl_initfirst__setfpucwfilenovsyslogpthread_attr_setschedpolicypthread_mutexattr_setrobust_IO_str_underflow__sigprocmask_setjmpfgets_unlocked__ctype_toupper_loc__funlockfile__namedsem_once__strcmp_ssse3_IO_stdin_used_exit_dl_load_write_lock__pthread_attr_setschedpolicy_dl_tlsdesc_return__nptl_create_eventpthread_setschedprio__init_sched_fifo_prio__kernel_cpumask_size__malloc_set_state__strcasecmp_sse42__alloc_dir__libc_recv__getsockname__getdents64_Unwind_GetGR_nl_default_default_domain_thread_db_td_thr_events_t_event_bitsvwarnx__libc_argvpthread_mutex_init__libc_start_main__pthread_cleanup_pop_restore__lll_lock_wait_private__pthread_attr_getstacksizestrlenlseek64__recv__x86_64_shared_cache_size_half__sendmsgpthread_mutexattr_setprotocolopenprogram_invocation_name__libc_dlsymclone__libc_write__vfscanf__default_stacksize__fcntl__pthread_tpp_change_prioritypthread_attr_setaffinity_npvdprintf_thread_db_pthread_pid_IO_init__gconv_transform_internal_ucs2reversepthread_mutexattr_getprioceiling__fork_nl_C_LC_CTYPE_class_lower__libc_sendto_dl_all_dirs__setenv__clearenvstrchr__nanosleep_nocancel_dl_add_to_slotinfo__pthread_unregister_cancel_restore__realloc__gconv_alias_db_IO_iter_end__malloptfputs_quicksort_Unwind_GetDataRelBase_IO_new_file_underflowpthread_attr_setschedparam__data_start_dlerror_run__malloc_get_state_dl_sym__pthread_cond_init__libc_fatal__get_phys_pages__sbrkmprotect_IO_default_seek__tdelete__access_r_debug__printf_va_arg_table__malloc_statsclosedirffindex_insert_dir_IO_wdefault_pbackfail__netlink_close__libc_msyncwarn__sys_errlist_internal_dl_osversion_IO_list_all_Jv_RegisterClasses__argz_add_sep__pthread_cond_destroy_IO_new_file_overflow__pthread_rwlock_rdlock_internal__libc_dlopen_mode__unsetenv_IO_new_file_seekoffpthread_getname_npvasprintf__mktime_internal__pthread_cond_broadcast__sendtopthread_attr_setdetachstaterecvmsg___vfscanf_dl_sysdep_read_whole_filestrchrnul__prctl_nl_current_LC_MONETARY__pthread_cleanup_routine__libc_sigsuspendfcntlffindex_get_entry_by_nametzsetsched_yield_dl_addr__get_avphys_pagespthread_join__handle_registered_modifier_wc__open64pthread_getconcurrency_nl_C_LC_PAPER_dl_catch_error_IO_un_link__register_frame_info_table__pthread_mutex_lock_internal_IO_file_setbuf_mmap_dl_make_stack_executable_hook_dl_inhibit_rpathget_nprocs_confpthread_cond_timedwaitffindex_mmap_data_thread_db_pthread_eventbuf_eventmask_IO_default_pbackfailffindex_sort_index_filemkdir_dl_tlsdesc_undefweakposix_memalign__register_frame_info_IO_vdprintf__pthread_setspecific_internalsigwaitwcrtomb__strncasecmp_l_ssse3_dl_correct_cache_id_dl_sort_fini__pthread_equal__new_fopenpwriteclosepthread_mutexattr_setprioceilingffindex_insert_list_file__strncpy_sse2pthread_mutex_consistent_np__libc_connect__wmemcpypthread_attr_getschedparam_IO_iter_next_dl_close_worker_dl_pagesize__valloc__memalign_hook__pthread_init_static_tls_nl_current_LC_IDENTIFICATION__resp__geteuidfmemopen_wordcopy_bwd_alignedvfprintf_IO_2_1_stderr___progname_fullstrpbrkpthread_setspecific_IO_switch_to_main_get_areasigsuspend__lll_unlock_wake_privateraise_thread_db_sizeof_pthread_key_data_level2_IO_seekmark__pthread_cond_signal_nl_C_LC_CTYPE_class_alphafree__towctrans_nl_get_era_entry__free_tcb__res_nclosesigprocmask_IO_old_init_IO_file_jumps_mmap__gmon_start____libc_register_dlfcn_hookgetsockname_dl_map_object_deps_nl_C_LC_IDENTIFICATION_dl_ns_nl_load_locale_from_archivewctrans__cache_sysconffopen64hhsuite-2.0.16/lib/ffindex/src/ffindex_modify.c0000664172256617226630000001202512075476615023722 0ustar hauserscientific_computing/* * Ffindex * written by Andy Hauser . * Please add your name here if you distribute modified versions. * * Ffindex is provided under the Create Commons license "Attribution-ShareAlike * 3.0", which basically captures the spirit of the Gnu Public License (GPL). * * See: * http://creativecommons.org/licenses/by-sa/3.0/ */ #define _GNU_SOURCE 1 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include "ffindex.h" #include "ffutil.h" #define MAX_FILENAME_LIST_FILES 4096 void usage(char *program_name) { fprintf(stderr, "USAGE: %s [-s|-u|-v] [-t] [-f file]* index_filename [filename]*\n" "\t-f file\tfile each line containing a filename\n" "\t\t-f can be specified up to %d times\n" "\t-s\tsort index file\n" "\t-u\tunlink entry (remove from index only)\n" "\t-v\tprint version and other info then exit\n" "\nDesigned and implemented by Andreas W. Hauser .\n", program_name, MAX_FILENAME_LIST_FILES); } int main(int argn, char **argv) { int sort = 0, unlink = 0, version = 0, use_tree = 1; int opt, err = EXIT_SUCCESS; char* list_filenames[MAX_FILENAME_LIST_FILES]; size_t list_filenames_index = 0; while ((opt = getopt(argn, argv, "stuvf:")) != -1) { switch (opt) { case 'f': list_filenames[list_filenames_index++] = optarg; break; case 's': sort = 1; break; case 't': use_tree = 1; break; case 'u': unlink = 1; break; case 'v': version = 1; break; default: fprintf(stderr, "Option %c not recognized\n", opt); usage(argv[0]); return EXIT_FAILURE; } } if(version == 1) { /* Don't you dare running it on a platform where byte != 8 bits */ printf("%s version %.2f, off_t = %zd bits\n", argv[0], FFINDEX_VERSION, sizeof(off_t) * 8); return EXIT_SUCCESS; } if(optind >= argn) { usage(argv[0]); return EXIT_FAILURE; } char *index_filename = argv[optind++]; FILE *index_file; index_file = fopen(index_filename, "r+"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } ffindex_index_t* index = ffindex_index_parse(index_file, 0); if(index == NULL) { perror("ffindex_index_parse failed"); return (EXIT_FAILURE); } fclose(index_file); /* Unlink entries */ if(unlink) { if(use_tree) { /* Build tree */ index = ffindex_index_as_tree(index); /* For each list_file unlink all entries */ if(list_filenames_index > 0) for(int i = 0; i < list_filenames_index; i++) { printf("Unlinking entries from '%s'\n", list_filenames[i]); FILE *list_file = fopen(list_filenames[i], "r"); if( list_file == NULL) { perror(list_filenames[i]); return EXIT_FAILURE; } /* unlink entries in file, one per line */ char path[PATH_MAX]; while(fgets(path, PATH_MAX, list_file) != NULL) index = ffindex_unlink(index, ffnchomp(path, strlen(path))); } /* unlink entries specified by args */ for(int i = optind; i < argn; i++) index = ffindex_unlink(index, argv[i]); } else { char** sorted_names_to_unlink = malloc(FFINDEX_MAX_INDEX_ENTRIES_DEFAULT * sizeof(char *)); if(sorted_names_to_unlink == NULL) fferror_print(__FILE__, __LINE__, __func__, "malloc failed"); /* For each list_file unlink all entries */ if(list_filenames_index > 0) for(int i = 0; i < list_filenames_index; i++) { printf("Unlinking entries from '%s'\n", list_filenames[i]); FILE *list_file = fopen(list_filenames[i], "r"); if( list_file == NULL) { perror(list_filenames[i]); return EXIT_FAILURE; } /* unlink entries in file, one per line */ char path[PATH_MAX]; while(fgets(path, PATH_MAX, list_file) != NULL) sorted_names_to_unlink[i++] = ffnchomp(strdup(path), strlen(path)); ffindex_unlink_entries(index, sorted_names_to_unlink, i); } /* unlink entries specified by args */ int y = 0; for(int i = optind; i < argn; i++, y++) sorted_names_to_unlink[y] = argv[i]; ffindex_unlink_entries(index, sorted_names_to_unlink, y); /* Sort the index entries and write back */ if(sort) { ffindex_sort_index_file(index); index_file = fopen(index_filename, "w"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } err += ffindex_write(index, index_file); } } } /* Write index back */ index_file = fopen(index_filename, "w"); if(index_file == NULL) { perror(index_filename); return EXIT_FAILURE; } err += ffindex_write(index, index_file); return err; } /* vim: ts=2 sw=2 et */ hhsuite-2.0.16/CHANGES0000664172256617226630000005074712110430072016565 0ustar hauserscientific_computing Bugs? Ideas? Need for improvement? soeding@genzentrum.lmu.de _______________________________________________________________________________ HH-suite 2.0.16 June 2012 * cstranslate: Understand now -i stdin and -o stdout. * hhblitsdb.pl: Some help list updates and stdin and stdout fixes. Added options for adding (-a) and removing (-r) files from the database. * hhblits: Fixed -i stdin, -oa3m stdout and -v 0. * hhsearch/hhalign: Fixed small bug that removed all sequences from output alignment when trying to use append HH-suite 2.0.15 June 2012 * Fix hhalign regression introduced in 2.0.14. * Fix a bug in the counting of the number of sequences found. * Code cleanup * Removed a regression in -nodiff option: sequences in query MSA were filtered by normal, active filters such as -diff and -id. Only db MSAs were not filtered. * Removed a regression that read sequences from query HHM or .a3m even when a sequence file query.seq was given. * Simplified code in hhblits. * Renamed option -nodiff to -all. The name -nodiff is very misleading as the diff option is not actually switched off on the query and db alignments. * Improved the filtering section of the help lists * Fixed problem for small -e thesholds by declaring par.e as double instead of float. _______________________________________________________________________________ HH-suite 2.0.14 May 2012 * All error messages are now written to stderr (not stdout) and are of the form "Error in : " * Improved error handling in hhblitsdb.pl, addss.pl, multithread.pl * Added more flexible format recognition in cstranslate binary which is called in hhblistdb.pl * Added -nodiff and -diff to standard help * In hhblitsdb.pl we force the MSA files to have extension a3m now. Same for hhm (HHsuite model) and hmm (HMMER model) files. _______________________________________________________________________________ HH-suite 2.0.13 February 2012 * Added script splitfasta.pl to split multiple-sequence FASTA file in multiple single-sequence FASTA files. These are needed to run hhblits in parallel using multithread.pl. * Implemented -maxmem option specifying maximum memory in GB. This changes the maximum length, up to which database sequences will be realigned using the memory-hungry maximum accuracy algorithm. This change will lead to more accurate results for longer HMMs (>5000 match states). * more sensible memory size defaults in init_prefilter(), fixes a segfault * Improved error messages if databases are too big (e.g. >2GB on 32bit systems). * Made code segfault-safe when name lengths and other strings exceed usual sizes. Now, all strings should be cut at maximum length. E.g., name lengths of sequences and HMMs at >=512 characters (const int NAMELEN in util.C) * Merged some Makefile changes for Debian from Laszlo Kajan * Corrected calculation of "Identities" for pairwise query-template alignments. Now, gaps '-' in aligned match states of query and template master sequences are not counted as identical residue anymore. (hhfullalignment.C, line 182) * Added detailed description in user guide of how Identities, Similarity, and Sum_probs are calculated * Fixed bug in hhblitsdb.pl (printf on line 272) introduced in 2.0.12 _______________________________________________________________________________ HH-suite 2.0.12 February 2012 * Reworked SSE flags: Support compilation without SSE3 (make NO_SSE3=1), without SSE2 (make NO_SSE2=1) with SSE4.1 (make WITH_SSE41=1) and enable all other instructions avalable on compilation host (make WITH_NATIVE=1). * hhblitsdb.pl: The requirement for identical file names and names of master sequences is dropped. Violation of this requirement manifested itself as file-not-found error during Viterbi-stage of hhblits. The code was streamlined. * Added progress dots ... for prefiltering stage * Cleaned up output for -v 1 and -v 0 options in hhblits and hhsearch: -v 1 should print out only warnings and errors * Fixed segfault occuring with very long sequence names * Minor improvements of documentation on installation _______________________________________________________________________________ HH-suite 2.0.11 February 2012 * Corrected wrong paths for calls of ffindex binaries in hhblitsdb.pl * Elminated rare segfault in realignment step that occurred in particular with repeat proteins as queries * Minor improvements of documentation on installatin, HHblits databases, FAQs etc. _______________________________________________________________________________ HH-suite 2.0.2 January 2012 * The iterative HMM-HMM search method HHblits has been added and the entire package is now called HH-suite. HHblits brings the power of HMM-HMM comparison to mainstream, general-purpose sequence searching and sequence analysis. * The speed of HHsearch was further increased through the use of SSE3 instructions. * A local amino acid compositional bias correction was introduced. Improvements are slight (<=1%) on a standard SCOP single domain benchmark. However, the improvement for more realistic sequences containing multiple domains, repeats, and regions of strong compositional bias will is probably more pronounced. The score shift parameter was changed from -0.01 to -0.03 bits and the mact parameter from 0.5 to 0.35. * The memory requirement for HMM-HMM aligment in hhsearch, hhblits, and hhalign was reduced by a factor of ~2 by a better implementation of the Forward- Backward algorithm * Removed hhalign's -sto option for generating stochastic alignments. Sorry! A better, deterministic replacement is planned for the future. _______________________________________________________________________________ HHsearch 1.6.1 April 2011 * Increased speed by using SSE3 instructions in some functions * Adding new option "-atab" for writing alignment as a table (with posteriors) to file * HHsearch is now able to read HMMER3 profiles (but should not be used due to a loss of sensitivity) * Removed a bug related with "neutralize HIS-tag" option * Removed a bug related with empty alignments (no match states) _______________________________________________________________________________ HHsearch 1.6.0 November 2010 * A new procedure for estimation of P- and E-values has been implemented that circumvents the need to calibrate HMMs. Calibration can still be done if desired. By default, however, HHsearch now estimates the lamda and mu parameters of the extreme value distribution (EVD) for each pair of query and database HMMs from the lengths of both HMMs and the diversities of their underlying alignments. Apart from saving the time for calibration, this procedure is more reliable and noise-resistant. This change only applies to the default local search mode. For global searches, nothing has changed. Note that E-values in global search mode are unreliable and that sensitivity is reduced. Old calibrations can still be used: -calm 0 : use empirical query HMM calibration (old default) -calm 1 : use empirical db HMM calibration -calm 2 : use both query and db HMM calibration -calm 3 : use neural network calibration (new default) * Previous versions of HHsearch sometimes showed non-homologous hits with high probabilities by matching long stretches of secondary structure states, in particular long helices, in the absence of any similarity in the amino acid profiles. Capping the SS score by a linear function of the profile score now effectively suppresses these spurious high-scoring false positives. * The output format for the query-template alignments has slightly changed. A 'Confidence' line at the bottom of each alignment block now reports the posterior probabilities for each alignment column when the -realign option is active (which it is by default). These probabilities are calculated in the Forward-Backward algorithm that is needed as input for the Maximium ACcuracy alignment algorithm. Also, the lines 'ss_conf' with the confidence values for the secondary structure prediction are omitted by default. (They can be displayed with option '-showssconf'). To compensate, secondary structure predictions with confidence values between 7 and 9 are given in capital letters, while for the predictions with values between 0 and 6 lower-case letters are used. * In the hhsearch output file in the header lines before each query-database alignment, the substitution matrix score (without gap penalties) of the query with the database sequence is now reported in bits per column. Also, the sum of probabilities for each pair of aligned residues from the MAC algorithm is reported here (0 if no MAC alignment is performed). * The buildali.pl script now uses context-specific iterative BLAST (CSI-BLAST) instead of PSI-BLAST. This considerably increases the sensitivity of buildali.pl/HHsearch. * Removed a bug which produced a segfault for input alignments with more than 15000 match columns. Now, the HHsearch binaries will issue a warning and will transform only the first 15000 match columns into an HMM. * Removed a bug in the multi-threading code that could lead to occasional hang-ups (race condition) in situations where slow file access was impeding program execution and inter-thread signaling was unreliable. * Removed a memory leak and optimized memory management. * Removed a bug in hhalign that could lead to unreasonably significant E-values and probabilities due to calibration problems. * HHsearch now performs realign with MAC-alignment only around Viterbi-hit _______________________________________________________________________________ HHsearch 1.5.0 August 2007 * By default, HHsearch realigns all displayed alignments in a second stage using the more accurate Maximum Accuracy (MAC) alignment algorithm (Durbin, Eddy, Krough, Mitchison: Biological sequence analysis, page 95; HMM-HMM version: J. S\"oding, unpublished). As before, the Viterbi algorithm is employed for searching and ranking the matches. The realignment step is parallelized (`-cpu `) and typically takes a few seconds only. You can switch off the MAC realignment with the -norealign option. The posterior probability threshold is controlled with the -mact [0,1[ option. This parameter controls the alignment algorithm's greediness. More precisely, the MAC algorithm finds the alignment that maximizes the sum of posterior probabilities minus mact for each aligned pair. Global alignments are generated with -mact 0, whereas -mact 0.5 will produce quite conservative local alignments. Default value is -mact 0.35, which produces alignments of roughly the same length as the Viterbi algorithm. The -global and -local (default) option now refer to both the Viterbi search stage as well as the MAC realignment stage. With -global (-local), the posterior probability matrix will be calculated for global (local) alignment. Note that '-local -mact 0' will produce global alignments from a local posterior probability matrix (which is not at all unreasonable). * An amino acid compositional bias correction is now performed by default. This increases the sensitivity by 25% at 0.01 errors per query and by 5% at 0.1 errors per query. By recalibrating the Probabilities, the increased selectivity of this new version allows to give higher probabilities for the same P-values. Also, the score offset could be increased from -0.1 bits to 0 as a consequence. * The algorithm that filters the set of the most diverse sequences (option -diff) has been improved. Before, it determined the set of the N most diverse sequences. In the case of multi-domain alignments, this could lead to severely underrepresented regions. E.g. when the first domain is only covered by a few fairly similar sequences and the second by hundreds of very diverse ones, most or all of the similar ones were removed. The '-diff N' option now filters the most diverse set of sequences, keeping at least N sequences in each block of >50 columns. This generally leads to a total number of sequences that is larger than N. Speed is similar. The default is '-diff 100' for hhmake and hhsearch. Speed is similar. Use -diff 0 to switch this filter off. * The sensitivity for the -global alignment option has been significantly increased by a more robust statistical treatment. The sensitivity in -global mode is now only 0-10% lower than for the default -local option on a SCOP benchmark, i.e. when the query or the templates represent single structural domains. The E-values are now more realistic, although still not as reliable as for -local. The Probabilities were recalibrated. * A new binary HHalign has been added. It is similar to hhsearch, but performs only pairwise comparisons. It can produce dot plots, tables of aligned residues, and it can sample alternative alignments stochastically. It uses the MAC algorithm by default. * HHsearch and hhalign can generate query-template multiple alignments in FASTA, A2M, or A3M format with the -ofas, -oa2m, -oa3m options * Return values were changed to comply with convention that 0 means no errors: 0: Finished successfully 1: Format error in input files 2: File access error 3: Out of memory 4: Syntax error on command line 6: Internal logic error (please report) 7: Internal numeric error (please report) 8: Other * Added script buildali.pl to automatically build PSI-BLAST multiple sequence alignments, including predicted and DSSP secondary structure. Buildali.pl prunes sequences individually from both ends to reduce corruption by non-homologous fragments (J. Soeding, unpublished). * Added script hhmakemodel.pl that parses hhsearch results files and can generate FASTA or PIR multiple alignments or build rough 3D models. * Removed a bug due to which pseudocounts where added to HMMer HMMs (which already have their own pseudocounts added). This bug severely reduced sensitivity for HMMs read in HMMer format. * Moved a lot of memory allocation from stack to heap to avoid segmentation faults under some Windows systems. * Removed a bug due to which the query-template alignments where not displayed on some platforms when output was directed to stdout * Removed a bug that caused occasional segfaults under SunOS when reading HMMer files * Added multi-threading (-cpu ) for Windows x86 platform * Cleaned up output formatting of summary list for Windows x86 * Stopped support for the Alpha/DEC platform * Anyone still interested in Mac OSX/PPC or SunOS support? _______________________________________________________________________________ HHsearch 1.2.0 January 2006 * Parallelized hhsearch for SMPs: using option -cpu , hhsearch can be run in parallel on several CPUs of a symmetric multiprocessor (SMP) machine. Speed with two CPUs is ~1.9x, with two Dual Core AMDs ~3.4x. Memory requirements for dynamic programming matrix is now ~100kb*(Query_length+2) * number of queue bins. Number of queue bins = floor(1.2*CPUs+1) (for cpu>1), 1 otherwise * HHsearch can now automatically detect and read HMMER format (ASCII). Predicted secondary structure (or consensus secondary structure) can be used in HMMER format in the same way as in HHsearch format. The script addpsipred.pl is able to add the information for predicted secondary structure to a HMMER file (as well as to a FASTA alignment). However, representative sequences for query-template alignments are not supported by HMMER's format. Performance is not as good HMMer-format as for hhm format, so use hhsearch's hhm format as far as possible. * Multiple databases can now be searched with -d 'db1.hhm db2.hhm ...' * Added option -alt for displaying up to alternative alignments that have no residue pairs in common (e.g. when aligning repeat proteins) * Added percent sequence identity to alignment information * Increased speed of hhsearch database searching by ~15% * Added possibility to read from standard input and write to standard output * Removed the limit 30 000 on maximum number of HMMs in database. * Increased maximum number of match states in HMM from 6000 to 15000. * Checked code sanity with Valgrind (a great tool! http://valgring.org) and removed a bug that was responsible for rare segmentation faults. * Removed a bug in the maximum sequence identity filtering routine. Before, when two sequences had no overlap, the shorter of the two was filtered out. This could have affected HMMs for multidomain proteins quite badly. * Changed options for minimum and maximum numbers of sequences in output file (options -p, -E, -B, -b, -Z, -z) * Impoved sensitivity somewhat (~10%) by using option '-diff 100' as default for hhmake and hhsearch (use '-diff 0' to turn this option off). Optimized internal pseudocount admixture parameter with -diff 100 setting. Results between HHsearch 1.2 and earlier versions may therefore differ slightly. * Perl scripts: Added -Q option to alignblast.pl that allows to include query sequence as first sequence of extracted alignment. Script addpsipred.pl can now add PSIPRED-predicted secondary structure also to HMMER model files. * Included binaries for Windows32 (a bit slow, no threads supported) _______________________________________________________________________________ HHsearch 1.1.4 March 2005 * Removed small memory allocation bug in function that reads .hhdefaults file. * Reserve dynamic programming memory dynamically. Memory requirement is now 6*MAXRES*(Query_length+2) bytes (+ space for ALL sequences in SEQ records of HMM database). * Changed maximum number of sequences in input alignments from 20 000 to 30 000 * Changed maximum length of sequences in input alignments from 20 000 to 30 000 * Changed maximum number of match states MAXRES in input alignments from 5000 to 6000 * In output alignments, changed the name of the consensus sequences from 'Cons-' to 'Consensus'. * Added secondary structure-dependent gap penalties ('-ssgap' option). Gap opening within SS elements costs X bits after 1st, 2X bits after 2nd and 3X bits after third SS residue, where X is 1.0 bit by default and can be changed with the '-ssgapd X' option. => A small benchmark on the CAFASP4 targets showed NO improvement! * Included binaries for MacOSX (Darwin) and OSF1/Tru64_UNIX (thanks to Paul Sarokas, GSK) _______________________________________________________________________________ HHsearch 1.1.3 November 2004 * Allowed up to 10000 sequences to be displayed in output alignments * Added warning message when not enough memory available * Corrected warning message when not enough different superfamilies are contained in the searched database to fit the score distribution. * Removed a bug in the part that builds the output alignments that could cause a segmentation fault on rare occasions. * Remove carriage return (CR) symbols in names of input sequences that could mess up output alignments when sequences were read in via a web form. * Corrected a bug in the calculation of transition probabilities for insert states. (Improvement in sensitivity by ~2%.) Need to recalculate old HMMs. * Changed format of hitlist in output. Now, the first 30 characters of the sequence name and description are shown, not only the ID and the family code: (No Hit Prob E-value...). This is more suitable for databases other than SCOP * Removed limit of 200 characters for sequence descriptions to be able to display the extensive annotation for Pfam and SMART alignments, for instance. * In the output alignment the numbering of the consensus sequence did not correspond to the match columns anymore. This has been corrected. _______________________________________________________________________________ HHsearch 1.1 August 2004 * Format of *.hhm files was changed. Transition pseudocounts are now calculated on the basis of the effective number of sequences that are in M states, I states and M states, respectively. These numbers are listed as Neff, Neff_I, Neff_D in seperate columns of the hhm files. (Improvement in sensitivity by a few percent.) * Reduced memory requirements by a factor of four. Memory requirement now is approx. 6*MAXRES^2 bytes ( + space for ALL sequences in SEQ records of HMM database). MAXRES is maximum number of query residues, 5000 at the moment _______________________________________________________________________________ HHsearch 1.0 May 2004 * Version used for benchmark published in Soding J, Bioinformatics (2005). hhsuite-2.0.16/README0000664172256617226630000001377012110430072016445 0ustar hauserscientific_computing***************************************************************************** ***************************************************************************** HH-suite for sensitive sequence searching version 2.0.15 (June 2012) (C) Johannes Soeding, Michael Remmert, Andreas Hauser, Andreas Biegert 2012 This README only serves as a quick start guide. For full documentation see the user guide in hhsuite-userguide.pdf ######################################################################## The hhsuite contains in file hhprefilter.C code adapted from Michael Farrar (http://sites.google.com/site/farrarmichael/smith-waterman). His code is marked in the file hhprefilter.C. For the copy right of that code, please see the LICENSE file that comes with HHsuite. Reference: Farrar M. Striped Smith-Waterman speeds database searches six times over other SIMD implementations. Bioinformatics. 2007, 23:156-61. Many posthumous thanks to Michael Farrar for his great code! ######################################################################## ***************************************************************************** Installation ***************************************************************************** 1. Downloading Download the sources from ftp://toolkit.genzentrum.lmu.de/HH-suite/, e.g. $ mkdir ~/programs/hh/ $ cd ~/programs/hh/ $ wget ftp://toolkit.genzentrum.lmu.de/HH-suite/hhsuite-latest.tar.gz Unzip and untar $ tar -xzvf hhsuite-latest.tar.gz This will unpack the sources to hhsuite-. 2. Compilation The following dependencies exist: perl, libpng, libz $ cd hhsuite-/ $ make Compilation produces by default static binaries. If you encounter missing library errors, also make sure you have the static versions installed, e.g. glibc-static, zlib-static and libpng-static. Package names and whether they are automatically installed or varies with distribution. On RHEL/Fedora/SL/CentOS etc. eg.: $ yum install glibc-static libpng-static zlib-static A dynamically linked version of the programs can be compiled with: $ make all On Mac OS X only dynamic linking is supported. Notes on SSE support. To compile code for CPUs without SSE3 you can compile with NO_SSE3 set: $ make NO_SSE3=1 To see whether your CPU supports SSE3 you can check the output of: $ grep pni /prc/cpuinfo If your CPU supports SSE4.1 you can enable with with WITH_SSE41=1: $ make WITH_SSE41=1 To see whether your CPU supports SSE4.1 you can check the output of: $ grep sse4_1 /prc/cpuinfo If you only use the programs on your local machine or of the exact type you can further enable the use of all other instructions supported by your CPU with WITH_NATIVE: $ make WITH_NATIVE=1 This is independent of the SSE flags. 3. Installation Either install in current directory: $ make install Or set INSTALL_DIR to the base directory (absolute path), e.g. /usr/local, where you want to install: $ make install INSTALL_DIR=/usr/local 4. Set paths 4.1. In your shell set environment variable HHLIB to $INSTALL_DIR/lib/hh, e.g (for bash, zsh, ksh): $ export HHLIB=/usr/local/lib/hh HHsearch and HHblits look for the column state library file cs219.lib and the context library file context_data.lib in $HHLIB/data/. The hh-suite perl scripts also read HHLIB to locate 4.2. Specify paths to BLAST, PSIPRED, PDB, DSSP etc. in $INSTALL_DIR/lib/hh/scripts/HHPaths.pm where they are read by the perl scripst in hh-suite. 4.3 For dynamic builds only To use a dynamic build, in the lib subdirectory must either be in the system library path, e.g. the ones configured in /etc/ld.so.conf on linux, or a variable must be set for the run-time linker to find the libraries. Assuming INSTALL_DIR was set to /opt/hhsuite, on linux LD_LIBRARY_PATH must be set, e.g. in bourne shell format (bash, zsh etc): $ export LD_LIBRARY_PATH=/opt/hhsuite/lib on Mac OSX DYLD_LIBRARY_PATH must be set, e.g.: $ export DYLD_LIBRARY_PATH=/opt/hhsuite/lib 5. Download Databases Download current databases from our FTP-server: ftp://toolkit.genzentrum.lmu.de/HH-suite/databases/hhsuite_dbs/ ftp://toolkit.genzentrum.lmu.de/HH-suite/databases/hhsearch_dbs/ The latter directory contains old-style HHsearch databases which will in the longer run be replaced by the HH-suite formatted versions. To build up multiple sequences alignments using HHblits, either one of uniprot20 or nr20 dbs is sufficient. ***************************************************************************** * Usage ***************************************************************************** For performing a single search iteration of HHblits, run HHblits with the following command: $ hhblits -i -o -n 1 -d For generating an alignment of homologous sequences: $ hhblits -i -o -oa3m -d You can get a detailed list of options for HHblits by running HHblits with the "-h" option. Example (if HHLIB is set): $ hhblits -d $HHLIB/hhblits_dbs/uniprot20_02Sep11 -i $HHLIB/data/query.a3m ***************************************************************************** * License ***************************************************************************** The HHsearch/HHblits software package is distributed under Gnu Public Licence, Version 3. This means that the HH-suite 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. See the copy of the GNU General Public License in the LICENSE file. If you do not have this file, see http://www.gnu.org/licenses/ -- For full documentation see the user guide in hhsuite-userguide.pdf We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de hhsuite-2.0.16/rpm/0000775172256617226630000000000012110430072016353 5ustar hauserscientific_computinghhsuite-2.0.16/rpm/hhsuite.spec0000664172256617226630000000266712110430072020713 0ustar hauserscientific_computingSummary: Protein sequenging analysing tools using HMM-HMM comparison Name: hhsuite Version: 2.0.16 Release: 1 License: GPL Group: Utilities/System Source: ftp://toolkit.genzentrum.lmu.de/HH-suite/releases/hhsuite-2.0.16.tar.gz Requires: libpng, perl BuildRequires: libpng-devel BuildRoot: /tmp/hhsuite-build %description Protein homology detection tools using HMM-HMM comparison. %prep %setup %build make all %install mkdir -p "$RPM_BUILD_ROOT/usr" make install INSTALL_DIR="$RPM_BUILD_ROOT/usr" %files %doc CHANGES LICENSE README hhsuite-userguide.pdf /usr/bin/hhmake /usr/bin/hhalign /usr/bin/hhsearch /usr/bin/hhfilter /usr/bin/hhconsensus /usr/bin/hhblits /usr/bin/ffindex_build /usr/bin/ffindex_get /usr/bin/ffindex_unpack /usr/bin/ffindex_modify /usr/bin/ffindex_from_fasta /usr/bin/ffindex_apply /usr/include/ffindex.h /usr/include/ffutil.h /usr/lib/hh/bin/cstranslate /usr/lib/hh/data/context_data.lib /usr/lib/hh/data/cs219.lib %{_libdir}/libffindex.a %{_libdir}/libffindex.so %{_libdir}/libffindex.so.0.1 /usr/lib/hh/scripts /usr/lib/hh/scripts/create_profile_from_hmmer.pl /usr/lib/hh/scripts/hhmakemodel.pl /usr/lib/hh/scripts/Align.pm /usr/lib/hh/scripts/create_profile_from_hhm.pl /usr/lib/hh/scripts/HHPaths.pm /usr/lib/hh/scripts/reformat.pl /usr/lib/hh/scripts/splitfasta.pl /usr/lib/hh/scripts/addss.pl /usr/lib/hh/data/do_not_delete /usr/lib/hh/data/do_not_delete.phr /usr/lib/hh/data/do_not_delete.pin /usr/lib/hh/data/do_not_delete.psq hhsuite-2.0.16/hhsuite-userguide.pdf0000664172256617226630000117517612110430072021735 0ustar hauserscientific_computing%PDF-1.5 % 5 0 obj << /Length 1954 /Filter /FlateDecode >> stream xڍXKs6ϯި!sd3\{! 5"璿~QTܭ=4~~@+ZV|o_Xő8[=mW:.Ue*K^} B?äȂmֻڱiѶ*ԕJdƙ{k n߻vǛ5;sw'vmc[5d@*I,(*?8(W_?/sUU,XEY.ޑ.I{|[;I81*b0TeY G%U$Ζ4!D>w{Ӷֳ ( (Zݻ:.&b,ߴuog̈ )֢: mMIc`dOn9"\_,zAL2UE,|iz7z3(rnyܱ:=C:L,x8"lӑ b8 l/ng?-oFTeTJD%1y,zƀK JUy (ִ >]ΗӨLӡ3p؁=FXDkd:ABcÅ7SNFP]s4T|X)><~ oy|zswk<iD%kS#{N֔,r8D=0ct] /SUQ\>#0v޸I7}RE٩3)8_8grzq`74gLg쭮z:b7~AEtV5֋l G*aGJZQ`Uqٌ҃|' =rDQ"X:\8jQHQ4`B E B)=O7Q95ywP(a«NfP|G[H5ܮb0Bi9ZeNpJ{C]d&ztN/*-%}ӻߌ endstream endobj 61 0 obj << /Length 2221 /Filter /FlateDecode >> stream xIsF<@[.))YIT9&2@p̗4@ XI>a#Ұ,Ňw^ܾ;DQ/n׋0A(S[46i?oqv^'H<_z4սh&8p~VV҅mڮ ΂ȣF:<鉺 s&꒘:Zllڹr6k:v:hNvj>⣋n1?fBpj^̓#c.j]B=캬υ!r$O}lq6kY[UY=e[:*匤8xg g%K@VK9A谍[4fNAAN5+Z`RaYKU7xoy֍0/YǶ⏆O^|$Y;!pMtD*&RMYe,W)a)vL)LOӤ ӿ݋}?iIU8V07Af`Q?a 73eMOڤ?Iu.hk}-yI䩻oek}ksNͮ 6M *0HGWLPm2Wa˜#aĺ(-+-| J`S 4R9Usm?۲(rpb3h+=H;͈3}p~G3SRٙ{1h^ekh=LԐYӯqLm=bPRѹ 9u)SfۂKp՚wXjSV? r황ej[;m~@pNF8g ٳպ1Ix}D4K| 1⠷PYtj_𺪝kyL8+F40A ܛuJ Nنr=b!i!^s)؏vsmPZs%B}E%mƒw^\@j1("[g-\u B:ȏ_(R~pX7>!@]@qlJoV2Q0qp2;$$Kā'm]G~$%^#sKWR6TMwƔjߩFBkm /E9bdJ9o'%`w^vhiW$L_84`kUU];g$` ˄G#m]7ʕ6J2:XfzI}.z$9TO|jHlMϝf0_kNe(z{d/ =vH$A v00[U/WX5_*v$+oO C"ir}]x>G:in q,MI}l}:WUK1ߺUӚJx?q*' msSj>)DR-RC@ŋ>Sߡ9 9hF9U"E Ďd [nMJKs~sR|X;s)nb#]9{wirdwx*"mIjϰ)d]&fQN+b^PkLU3-mnfkeVsT t*K%׆=_5ض Gxڹ>|!/_K^X&}oovZGS;;FԋB> stream x] @D)6w{9 A,+1V0!_1 ~GS΂ZvdK h4:=_S{-R>W܍R~1%%V*T !% endstream endobj 126 0 obj << /Length 3684 /Filter /FlateDecode >> stream xڕZIsW*jCV9F3vF)+Qyvݍ2ytSsi=tps n] ߻7#MQޤq}*oz. U7Q ]{o96> 7aA"f~:۝]?Ajo7۝J=v}{nUOn+NB<t^ܛݍ#oCo44):y-tvMWy_(M6 r]Fs@L~ym79@A]{ZоNiErӾC/sߵbM]EހENvp:/xL = w:s j,*_J@L4swB>1sYC~czbTd:sX%=|CSy\s_{즹uy8K,PXϡmZg;b](cJ%5[]=V}IcR#P olWv|2(̓8s5;1pt( fbR~Ybfp(|;$(eMR؆ *) d^jJO7D u2rS7X;[Pkzik{ӉPyI*COL(j۴R<ز".nԎB 6:PnpRiOAӁaVj]rU1a kk.ɑe5ob {\+D3px~X -i74#4q kc R_1СP,;TռgBcD OI?7hk{GйVTԂtI=2as / ?>Q{hARhf(-vZ ,PXhH~\"؝@'$ݍr5.[ jbs1Nq$$nSbNV:ix!37G^%={OZi PG&tLP=9,pl76xVaR5 ]A*6 { _0pҔSڼ[n1 Ʀ.N.LGꖅuyQN03BcVSRKFUK7P* isVm:Y#.ť^ ݐyP:hZc7ז;+7 "F%vtaCNa_'+G15ظw& *A6 .Qnʕ;Fvm.fJ3`Mj+wZ]\&5Wҹ؛tBXCn43֬Kga4O#[\xjXB"eH&X#X3$H z06@'G@W VCm@D/?|yK0z|!8HhTzKKZ:}C 2]JD"8RrKˡWn{#x" H+}T De@h-Z#J=aPh@U$ SڪWP۪?: YF(VuZ`%?Dl"q (Ƥy6ܙC1o#JrHye7ɄP)@qA"7r8jX!MXza@^Ї\ cc<&++B4BXb!`UDLN+'e'5iă/=8,k!q{d865bkmf}(Lsqk@:HΜw䍠|F82B>kᚡi3wEO$ݿr'nR(@\մ )E9PBt.ߡ;XzBҿ?32&v|Gb-FH}%l[ ҦI5ÅW襘hbM1\愙:,`CHѰw+rM0u95׹rT +YX:5[YVq j! 3K9T'qrUB TJgF0:*J2p@&P{t*jLU0Į9hD:7,P3Iǁ,}O誢 ^p spjtEwvAATLKt]$HkȪRwGR1ɖ Z-?$%xS8Ȝ[Jhu(~AX#&e>zBB_@KoWgt69~ JqU #EmEm(ۇVr+s^=Q,ڭ]$9 zΡM%uѝ,Dծn%ϙ1<\8"Ky顠uf#S'sd$MI O$B)҂| %tfTuˉ&WZ7c6ˊ굧*5v,1&|Mi݌HcFeAx2v/O809,q;~݁_eUxz3I3yyvkC1+IMe4񱡽iL5D+r@8ʗ3_y ]- rf& O}E<7b fnmL!쑞@8k+8Y"H d6.(pS Gtemfp|HέVs?@` |ҷ "i$VV0ٴᚤOC]eF]D~KX;Xp˳1|ϼ=P#E.݈D$i,•XFGE?1_8KJ]f%JbAkyʕcVRFqiH`uzQ"RGB]F¾*'I0KtPQtc9 &l ArzE{i۶T?,cH,*m(vg[H3H A-`'q~tYU-;4Nd* *(AʼP#k*aBwo\+^0uHC<<9|MC3*C $^Ht, zC5c`+VVӀnhtGpI p{ɽٞ+CZa {>߂?uiO 5r9$OP Ā M|eh=Sh񤮙k`?I 8% ӶG"o"(p/P?\Z, jdJV,uE-2+]0֯N&<IjpGlcGN'AOo *8e>:@n$C[UY҉-6xIgf(!E Ly(1Q%J4+$ywGVG&䙐# Byrҩ':x{> stream xڕio{~P`[Xќ] G֛F4 40E<֫k(RO|z1 fY0{M Ww\~ <~$~Yg~߻7o]tŲhM_q윫*<Xmgku|ݮ֌-me yqAMjb3FlMc^k:[!3M' Zdy۟xSz>Z=Pm8p={r`uUQSi['^Iꎥ,y M[Xڒ)Ŋq^tkzOFTwPwp"\{}0FNYX~4HSd@i}4ڹ8L\( wd×KE`&ݻD<`|`[`0^ں7l8F7s\=p;Fk޶? /u8x ݓwv'kPq;@DتL[{--탤%:Ad Sﵚ$"Hi]0Ln:r+$D~$)t¯OIB8Z i\v_n߷{m~[4햻oꋉ#R݉ 7*@MGeGzߗŀQ^CeYZKe `I1Hı\t=g7rLƆW;>Od!Rnn0X#)/(=v}Q yI8<[XLs8G  r|f18˺V0 1RJ1Ec[ DQxi% ar?3u; z8Ś7`ɒQ]\㦧AwwI!Ơ#cñ}1)A05-ALE~AMMQƜ@=Jǐۮ(Bs3eYp}=o{ 10 Gpmji'PLJ¨f%& g; t{SQ(xtUJ}XIߥȳm׾<+q*({:~ɾCIJlxgTA9=1IBKI P>Ve]P=L'tO?z4Z(Gq4|==.2/<0̙5tpm5H t !aaZxHA{ $NW"\(H31U)8~]Qɢ==dbeV'՗φBOF뢃C6Jbƞ2 dPڝ 4w 0]jK}կ UgbYx$az̐Э==Ak ְۙ#-;ջ_V;֪2* ShL; LrQXaS!o೦*tIeZ@~:Vdo%-h#.u. +,uW8 Cܪ!$@5-m}GQx"2T}{% *GptI|]!}o1.|FStY-Sl#p'#a9J* IStbŹ{ca"|u(t,"ʒq婪k]gb!2l̼+R^KW#}"6a &l=T$X,'ZdmK!| 0?CAn:.vL1ED{<6E_vrٸDcLu%C(8Bߊs#LȨc[k[ǡ•- ^{r0y`&NE!<ll! qE @J[VW-J-xԘO u37QFD<"D,38X(yY5 oAXZQD'Rc4,зxcͦf!r_x֌c4H]h82yol H6&1KO-nkG=sP~9&PqA8 M$$.$ŭЫWa:^~=zYXK3{Sܘέ*,\*'1u nn/8Ƴp$Lc&k(/HssвTUB|WqK:Q%h0# à b C!ö퓷l9a>^naKR2@.:-s_PLJ`ƜQ9B>Q"J%}3n4G:v%R%B,?pUA57ᙓ|\sf\.λñwӃe*1gMq>YOuCP- (8=uu<\qNO\=_e w=nٟ@C`9[F1û>׽s8xu CȄTSL> stream xڥWێ6}W!@e`Eu[$&iMwQH@h[, !%G4Oކ3g.r&3cfh8ľNIϣЏH y:dĝڔuUTuIbj{oءTF.9K_j|:˟PNL]v}^C`FLȺ/rzQ+5`S8LVn͔ńjU߼٬"f5YZ6;fU5YͧԚ}ģU~`WB"P5ٕ2GUC1< 8Q3v4(;+XdW6Nzg3;ܯy &u"P^)␕(&EMЂN8١vFU*z[ S9dº%0*Y*spd߅@[^cx916C<!"4q7_Į0\B0f}lvV-GY12\e- (s^^((Q.d6̴-/WHdÌ8 ]BΩ\p~C[{Z=)_%M^z-ȺZiknDр|R˪*+ָg Ƚ,ʃ~VN(FګPh/$j]oc58DJ)! YX.̗@2}YkB$XKZۊYp waWJVhdav L9AwvPT?( !s \{W*2uw Fn<[8qpIIiµ5(<a=21qo( cXK7_%}B~w"eK io[ea=&M~*;FR gޟ#fHkbo WՔ&5OO3,lh{HS5ނA&ہ_#%tcwK/7 fZE#ۃv-ʫ8:'DJ3 dQZfLtI߻H*-ѣep kCSͫAҙfAԡ$`|v|gmhF{0"v&@S/ "\004Ԧf-ǐGꡣKcxaaTr cp@qn^>c }$;jci1MZj=hQOm|UA8٢lhhLWi:cA5G. o  zvyv\WЇ(g*AEpuB,> stream xڭYobrEzޥ©Sp ĵX >N|r(j8fogl#gezL> {>;I~̝uBN氐3lts1ϐs|!>8N:U=oU%EqЫeC=e~ln I&{D 5xy*tnQp~D޳(-`RrE.5Hٙm)ifK/.B G1'40}05j SzZ u\KNIFit5v!!\'3ƯK作bD,1?J/pPI/'拶ם6㨦 MA"mMF%մ' )x2d!q ˏIlSN](^8Yl1&$atB8+]%V-Rh3G S(qwt gQ c5b$}CԾ 5i G\>APF/.=qov5cFk@?/`^*zMG]^P .GA=IP'F]-Rۍ,d"E/udIkzҙNXSQoLȄ~gzUQ@I\^&F8r6H۫u'G ]v 4Dh,$l9w¸Pq1CΧXLĻzxL+8'9ȄcXQO[DQ}ФPDꊎoћ@uiC Jx1h[:^Tw* 1 S%xhёC(b0)LЎ +ZoeQI׏Da꽝ȽדB'-]O.hwwX0zWzԝ s~4ϭ9ldL+X`}krA2mb;Bؔ4/lDFG 6bZ)eJ<cEEvi+X ;̢Wj{T]~lE( G%D<ٔ}\!s 6ϺUtή ɳ<΃6GiǖT*~fj_tЪ&#y뵮2ruK sನoQ6? #mf.SHml;|^?j{OC{;? bm@Jh !\hJw2.r~dƭni4H u4&0p xCo\iysL9IE/I)T(`zxIl ј[Kե"X`=eȇet]Jx#3M`!,|l1)1gH6vtge\왚?TԀ]D<馮ʽCX@DW` ewRk)R? @E&vZZRow=+m%]L[ƠH`S!@~xLwot@`r $PKqDI7tHN4yBωݴ^;k@l3ΰls/Ftg%Gvy4% At'+(R#Э]$Yt kMBg{Xcq 'ӹylzr;+MǧDqZ!eȕ =FVw/tvB8J+/B?Q@ 2#40SՀFV/C#Ǯv^VgSDpjB[IJcW0n0 ;Wfh?.7 )tbg+.a  ~C7Џ~;ÑwI ೴<;!3= &]Š?z`pY³^ZiMn>Ҥ?> stream xڽZmo_OC!yk NAPEȒ!>\9ckekUɮvgg g8L&ň!q&Od@Hp %SJ! 2"zaCtJσPl| >.OA'D<D 9] zWL YL`ǥ\(d D&F<3 &׋&f<R@ 2^p$iL31 $"܌&y%bB}2Qी!D;S8A~կ|_?WyW.r񕋯\|*P%T.r K\B*P%V.rK\b+X%V.\p• W.\p• W.Tr]?Mf_F͛lh>7͏OPB!j4 um$"쵹|[|fР(\ ǹsl9(p(2ل8a5y'eoy !#|b52"zۘs?=d 6GbK(PP8ڬtRIц8,eud.cl[@b#\l$P(qDL yFDgH7"ѲǖLPxx((agAtW:h"COvH!la+yp螆ZF}V:Û "P#sO >kۋC&0vvHH7feB')"eC =zmU2 ۼ4<@^GmZH TOS"~E3~(ex( EAvͷ uxΖdIkbD!'Ih ,GB`iBaH8"T7B^3{R:͖4 {2|@EtgXlN|% ҍ;,GZAI׽ Vm7nw}n53)"-]Z@`ݤֶ,26rOWDnW<(JHݚmnۺݶn[rF]Ӎumg2!TDIT/ڢ/^de1?xI㋳9`ZDұ$q-zxd8<^b@8 N|p 98^,/s@)si=A-wǏ|6^hp`uIz+&սƊ3.6TSu.;;q0߽Q% j(f:9S;zkB&ebqafbC9fBBOJ8Hkv% h/1't/jF7uNjӋin&&CˬLɽYX un悺:nf;nS$#W[W||mTvZSի6Oi}Q}wZ]l̮'xf/#ڏoD銁)4foxOwoť5\-[psw3u'z_,h[z:҇p2=,gg=MrdGڑA{'ji߰חvzy= H*-B)蠥qCutLeDO\3Б22k/Yvr.mu`Flȥe'5"MV6ڼ(8j{?“werE?wr7]u:#چ6EEVju*hЮw<7N~uXo=[f> stream xڵWmo6_* 4]YC@[tDD\yl9NH;ޛ'p:$uRw0;ÄNg#'t(K&֒ʼ>a[aX%Ez­vpx9bUzV񥬑SI_79)Cעg5"  ^@e`$ RN. xs\3^,;R e#@d@6HQKG]ѝ'`ikvo<hx#fz˵w~tS/)beYI߼VFyAۯoYUGvEItOeۯr/'7/ӄ_j4/h7=ICP:(آerT%foYPUn:pGqS.u,0[h5r(]}A58s9kFռlsCbI"}WOą;LiC0m'mz#$0i d_ _0LuZ [\[ɯH%RF>fFtPa NKU MN) Ytn%iE @PU=ׁ ҩWlRޝ.Z_u'%Z9jPk[zåf_ R<'qyUAsӡԳh&5^!_7Ul HHFAj͈p,,m(wQVtjn<_\'g7,kKJ);*3V;',|G)0DM 4 O l+Oغ }{=ڇ~eGuc0揢/w Ow0jA槼ذ.q}WQd~һn?Nk endstream endobj 187 0 obj << /Length 3227 /Filter /FlateDecode >> stream xڕYY ~nҵYl`;nT2Olmu=әʍlm*c9(͑|*;niXncO!9p_kzNtMPWdj7 1`1f rʞ4 ҝl9s_EؓeNFgPTι)b㑨'9At/"m-S o~@`n/ tB7ROxAs.\-8us.`}h穌*ts2LaoQN[yA\h-ߗ0J_bL,sOGpzhc9'|5Ѝ[գzZ4# ᅍLWGj~rnW1h% cb;&֥\\o@y  d]J-Ȝ"U5J8=usNk83QB s ,l-L8\}*!͖rʇLҎ^233F$sc"oxd$&(7<lGBa10 LU}!tKcAi=pL'`I fY8-GF+o톁x}M%pOXD%Chw=3*Ub!!Ew~eeNV a_rd6E*ܜJ1loh&mG[_:C`a,)#Q߀8)mB?`ioY0p>Vj1d>.GG C kId2D||(hd>6g"@kk O/~cgWL=L]9hr^=ϠT$HOfE awc!,5`n;ƪW9 \R)c ORd 1c:˂j>\zV9벻/ ag(q${[7_|)ػ4UF܏t[jhp )dW3C3FN)f3W!c!hG;09ށ %ЁR^թ.knRVjO`3PmO^ fVË1I Lye+"G 'Lij켙brŇjx"/(8Uw}ǢɢDlL-FK$xM2]^n,ӈ^IVq"(.2Oe H yoAp'v82e05lu\4^>!,r@yJ F0$fhm8GC\lG~)iWm~ÂE~9+Petb:H~P\~6gE'l'1tlS$KZ-ӬY+hQ6Bc1T6bz"r$; 䗼 S4]eĒuE?3Y76X>9CJDq1;TI-E3` F)$tka/du 95ؠVk,ۄ9zHhqv$$˸4C fJgHȥG8m&d׾yˏ8mV)uL;C4BnBQc1YyjĻєsQ@a(ڐ[H:Dh;OW{F֡Yʅ(&]jNs^ 67BޡqrfrV3jӣJ{ iўT=۽]B橭iO[ئ;M 5G,eTe7l;$,)nJA^{pV4AhEm&AxR;zrR?˩ BJ jŦ@U\R$K?=˝ `cȳCΓj %%@ ,}KoI𲔱|m- _aJ?qt=Ǒ9/l "/w ~!ykPH+ f y=1lpAFcd+W:|.bluNA0 mu箴|TZ՗ s0Mx\?O s4e{@/ROi />|> stream xڥn}BD^ZtC+;1lCEĆymiSUM<>.}u{]}lazzX̓h-|1l)V?ZN&`6n^x'Пyc-k-Yب'VWο?[x# &&keHT ydtٌDYm\lS<{Nj'}>T["=ܞޯԚ"FbO2 Rw"ӏIZ˼SVM9`;'gv7TU>UŻX9;ru2deQ QL쪧)`MK?jSOSZ:>M`jFiIO4)cW'm|&5ҍι`қH 淴'3C3X\_B9F&#peYf;^Na|J@dl 9<H*\5B'؈֜\_.P,Cfy~^R,d裍LMrF6즗l{b|c=Zu&WIN&lS67<*j5tE:*d^2Cndq.bO" ab (G.b^q"n86`osw8W$|C#ۇrX(3DM5;QC'*>YJV#-h|2YBOF'8>QŸ'AC}Wud,%CqNqLL1J{ {NĚ^ƜT aX/1(dɪLu30ゥ4+7G`Ŭo?IV\L}ھE}F%^,qE>QܐȆUN3v ԯ\HaBH0,! `jgS}pAy &0ҥ5fbqс@Q1RW71c!S,-a&hZJ+4!:/C%-I`Ƽl"{jUD']ȭ~ye(\ o GVUۗh~N%us^p ( BU934oҺLW$5Py%RA B8OHg{vdYQuk=[\f BҹkO&0b q!$lycXE93-3:Z_4@yuU?s# lxK[:ޔdUj[ :rnNбf"'U!2+܂]*qmX9Rn|/5&"bi|ӪĀ*vtm ځ`֍Va&6윑CNYƈɆ=[i*ڀ{n=__ oFp"㮲C OGb cC{R6MT,ze?/PC'0 B73( pvZݑ*ּ>Ns5C'v'?:j JEXmU|\0D9TLjIX9?K7ѓڋ*nq6g~in/E ]>v/VJϺغvArvLV2Ľ[̀hR,ȧRxT;̚P\9.K7V2 `NtWS%μe*h;*]/!&q}[#})DY:4\$~սX[ͱmnc Ds&l<}XBes6:ym AsqN,/ endstream endobj 203 0 obj << /Length 2394 /Filter /FlateDecode >> stream xڍXYo6~}PnZyf2wc;{ Y hkD)뷊EJyw`,b_oÅoW,qc|D)`|,6zjI }zDZ5Q"Um^$j*W&N*h>v46rg~\ _A,"R-.ej|2+c D].]dk9ݓ[tGNuxPqM{9!bص0}B=c?^?h}G_vg< IAIB ZCm:a\r+RoČvs|taOD jەkcz Jk)e5hAUQ bP}-[{]ݽ A);!K4t\zPrȷʪ=XBIjRv{oʤgޛ= @qq3Mo 0q PKH=\YlmɠY;9XFjVCd"ph5`a86==A^Q *ፎ0VOHlSD WYvy?FHîD-˞I#})K hf~o>X|&t%Tǹ܇fW#8YV;Uf=6NQҠ'獣' {NwuE ~FvPPau3B]Aowa쑮ܻZE0Ήhҹg~0[mwϽ[g.QWb;նΝ@d4"G iOYS!Kb`ȧZ3PKH~ZFRhg,αKT; }HH hjݱMKSF"_?ҝdχʩv"taz6(>YXb'WЙ``Eڃny?T԰(i*27z/f~잵Gt#]A28C,_vN[40ri:[(d{<v `6H<G;Z5%X96Q@r+8~~YؠkئyH,>7fl'B#wAcn_B]b8p$KO5J^8fyzjee+=jYe5TڢWfn4Ea^/0ј؃|]NGwLnErwK27e9&_Jx9 bG+i6ߙfOVp!mz^qyPг̸C9Du*7O~Dȼwm 8Y̕i^ v tBiUoKZ9K iQȧھ|,G~^Y5F2;j: lBRU]k"O^h[Y5Trľ\7 x,_wbJK *{ EcYic5z&}~2E\56!Ƕ@!0WO4&&`G> $h(P2D;< yP=3B8j[uV&pC!P/ Ƕ0 6iTM%%arAB,y$lXn:.XW~w(`[- ̳FlpW-\Y0L)b[-i>z%[{ j94Qa7ys~df+Jbf“ڒuuͧqg!Ṡ3AGЪ _,#B]|>6qx.̟:P{a)>t/|?h-y3!NH1374M#ɤMTeZ6zA&i{A\iQ {;Z1=*0+HFINv@w,&(I Z!粋AG,#Ɗ;O VN_Ndfa1ptuGDJţ/e5 G%mUOZJRoqۄ '){iom#-RYS|}~,޻OOΥ.h5G ,ʱ:M 5a ,>mUU].1OHvۻST/ޓZ endstream endobj 199 0 obj << /Type /XObject /Subtype /Image /Width 1601 /Height 1201 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 22398 /Filter /FlateDecode >> stream x݋r:.PKgrI$4kUf#26@4_u:V%F^EoYhUV>IO)pd+KxEX$X `@k"KDX*/a:ªU~+kAian-V"S o^H/xS>ElCVN>N'k7Rp")7Lwc/U ^*=)vW~x[?]vy:KK{a 2tHZ櫏DX/aPRn%Mν ѭDXQEXcUvyӯ:V_ +߼Tt EX7yM[E 8\xu=E7N卾[|-",j"_u񭊿/`]")WÜVP~(F~^?9w U"i80/5׎Oқw}0QKxM]߆a'@SQ@U; hM%XrLh?aU~&ªbhMUК5V; ",@%", v?P J5/~A+0xiGƛFX5$b:it"$LU##=۳ҕ&>V[VA (^.*x"_'j}+q ^EuEX>Yb~_h@ (^:ºASWe6 P )ឹ?-52\[.PFBDiae #c{Oe@ (C>!DX#oma_]",&U ҽ"VU~#aMTpozU ҽFX5aNwV_.ylîjN^ËIUw9#% _@vc@ (,^uHquz_@vc@ (,^uZmv|zG+pxV+pxU^9$ºZf2W @ (^5$jzQU P =˾ۧ7b_x"B{h@ (L^~WE{+uc*/:*+0xU=ambTCRVl:'c@ (lpϚ_EW*Ũ>kFU¿LQ P>#j}K~Kt" a ޭ=6%Yu"&*+px:a^ZG#3MaW@|N" (΁WxaִyXf +px:bSVV"5MEfPX i_&ZEXMokq!% E ^EZwkCBau JA+xULE\VힽFo?j9н=0W>^>C:[eK{DXW@`&{$<iF`vj4D!a^Eb$`)o_I^GXWu{{@ ( `3ok"ODyrCܟnϭA+0xUht[e-O+d*_%ܟ>A+0xU=k2;,*8Ή1!_jbht"LU~+\sڐk<** +nA+bW@+{н,uн0m(flQн舧",DX`]W@fk@ ( ؈A (y P@ (^EoнLoнhkнhkA (3؈+@a P@ (^Et"lt"at"akн 6b@ (r6{нW@+ۥA+`+`t"86н ^Et"P@ (^i@ (0^i@ (Yt"Nt"89н ^Et"PA+vf+vft"89 X׀PU " _W@+{н,Eн н A (c3؈+@ȹ P@ (^u t"t"at"a,jн 6b@ (r5{нW+(W@U6GW@0`W@1`5^Epl{1{pllĀPн^E+9ۢA+ۢA+vf+vft"89нu ^Et"W@{A+{A+vfн{ypr,X-;}ftY5;( ؋a~h\<\",غ7l0<7pya'55[yma'eSjUX׽Ǔ\2" 46nx_&R@; ,0of'e10;(Y y pl10 ĿMW/DX8uo/L'/DX{G:%^~MaJ ]]e'7^~`) FCf(=a@; ,0[/{K0XE X+-6gX톊89hH3+;nR"Sأ;00,DXlIUFX7|Cߊb*!ҽaE"@yw ҽ2~;KQ6tljTFLFKU#Acf{e+{"ąVE6A;JʮD57꿊)0Xu \VW޳*󟱗AfًhJ!We3;( 6ba[^EN"Pj֌t"y~l{ 7b++vY&ھP@; ֬A~ψt"N`aJ ( 6bX>;ҽmJ (fb++L؎t"0a &ҽ}[J (#,X&nV?tvYQlUS^3؈ [,ך?W+,}5 xVO+3s$U{Ӌ"c[={ojhZ{l|{ɱdiP@; ֬A௭jJ (Y:-Z0ҽ89s-*+i l[V^E85:&ҽgweluj`{`fJ`{ V}J`{,f|Jf{,Xl9K'W2++3؈uVW@'gF.\ɬt"ЕTd=C(PSc+t"܃,\ɬt"#;0[{,*xJf{,`Q;G&W++3`#>y^V^E8cJf{@+1ar%ҽɕJ (?+P` Wy+Q ";A.|W@0`lV3+t"h,FuJlPlļJlPjjplr]ѽ?0[{?*[{H ph\нms8OV^1Yx@; Xu22%W{eFgʔc3`͂uMJl鸙&)86q\н3|ܬpX%sAP`{7\{n"r?,P_"W&Ev;IV^ou ( X9+o.E``z: W^i3DX(YM@JD$~a3؈BՕoBʸx̯L'ZL@J\|$@)ے+н>yqC&W{t<;YC֒+н:# Ev79%W{ő E^Qm$W{,0n\QAнhF\iH@ (:_o\VN^usY@)-Atӌ E8K@ʗabSqlr%vcϰKPr_3@Fѐ\1/~(YPeLGl3ܤv`u=Kr^W𐗁":bArWUst@ gtg@W^+n(P>++@ pcgt|pC"a ^@0`ݣ~ ZԀPvF ^E`٩?3 ^E`#Y1н51o{iaotWPٹ ?++v` |P@G ,|z}ەu ^EvmW6b@ (ZW۝E='PWW@|^{ @ (g}>SJr{]sU5 ÞLuav`Y^Y׀a3K +1{53"Byv^ŝB=Nu0k(OM++EA(?/ tMDK@H=&R+PXt2t}WW&%vY4 @j"DX(Y?c+н9M/EkG^و+-'ġ3U{F ^"Gx{\5 @Jt|"\l$н;#'S)ۮ<WO E)@S$нkjLh{^YԀPiF ^E lĀP=$S++M|=t1Y(?O2++>2e( C";A!н2\|"af9^^c.?xqP@; ,;?+н'SN8pr8|6b@JD$~aXW[; {i"?~P*|Kl T͵A?ѕW&"+.^rEXD'@:D$~a==e)Cn~~ @o4&^91yMCvY֞}|u͹x dXe[_rE`Ͳ+@t܄Z,IMe'j1(\W6b3=◉'@zD `&ݫ0 (3 +a(P{\ ن 9_{\0`<@tKї_a]W;& E0`r+5u鸏LN΀5;K_aQ^a30s ؈ {>2k(0v{zJR^ 4/S+c'fvL,S8H%B^o+LD/s/|%+н>DX(hkqah,jK"3`Ͷ+SE {=|"?~PprhVqW`#t</W{%k.s-"o+qj2+^8#s,}) tL Ev>]^ӄ"vf?Q؈+3Xs+W@f`ʪr ^ ^Ef+sV4a(PA.+aFP d^v!B`=eOo+B"{ DJ~+q"B@; X)Aj~؈+H"c3`~S+b@J2q(86+Wf2"_8NнR3M",ݶ+^25+_U:猈P%ݫu[V+@:D@+@:D <هlĀ!Bci@!xί1{e\P8^%{%^Y(<{+@ɲPyW^ġ~}ġ0v нn5M",VkV~6b.S#BpJW`#н.=#b+؀@DHP8aaץ'¤p120DgIo^"G۷paW@ p(F~^Ea`5_F {a Jx6b+ ̶W`#н3o3 8@ (x+@ (LLj+0"t"]+@ (K,طJx^Ea`5)_@ (89J~6bNa(PXe IW0Q W't0!t&¤0!t38(0Wo"B`V\ 뱳#B`g k5+_@jdY(89jnx%1˻ ]11&B'aAtt/A-[{|*)_$@ʷI X(|PW'۫L( нR05?hBQ30j^@JDTN Ex\ lW>ND\PE^ɯF {埉0(4-Yɕ <@ (L^+{z|{&+@ (L^s+{5ౌ*tmW,؈t\"3}A^)pN@(1Pw_W@`j[+0yaW@`j_+pcf` }#,kнg>f:>²`F {f_*&a@J̀PprB}xF {fEX(t~3P?W нy_^Eн-xH~u+peJAklW@hм`#tD Exнa.DX(7o_W:N@`>YM+O͏Z`/нR0Ef{`#t<{ ?н2h. X~{]n.Li812ThL5Xr{]p.DX(gU^ >NJΠof+5a.PXq2ln˂kݫ0pA؋tO@^*| 6ba(Pm/*a(&w'sno4W#{" ?ο}R+䏑н.1bCz;(b+ؾtFOxVUR*/"f8}, W,zo4CxgEXeSSyy0f,s,؈V",Ѝ9׆z cEXNP.X`#Ѝe h xYأ׍3>a)$7Z6@tOA{VSg GQo׽N5«Af,W?+јd.?J&Rob\Wz1D3{* C~"R@; =gV,wo4fʏ5aqԂ2[Y`#ظW 'ou c%,naQ`#8W 'ou ecU1N͸"l[?FU/@Xdk[{pWYP6V)a]rE8?~ `^:D|K(7<pVOi`^:D|K>}_)Uϋv`!g8c4 >z^)U]\=-~CTstġ00`н::d:plfG&a5!Bj3+1ePK{xB&N8@%Խ"k$WW@dt|}<\_w!aS {%j?a~gTeW Y@@; =x b3*²`нnUaYu {fEX(86g/%1.BP?  ftsN@"B&нy" %@:D KUT=6PC'01z,k@ (hxaB tC"c3\7Mx彰1^a(Ppr[_yt1.a(P +PEX^1E8:%FX^:#E84eUk꽌@ʨbPg?",kнyB"^7jYtFca)Oo^X+(0 %W~!p ^E ݇WW@PJ{uEWz{x+tBeq3fg/+‚tBSN,l%FXX`Q^uSN}ePprfOuaGT!r5`*$@\<~+wl<н27cPU+_7(J*н&" EX|ODXE W1D$~afg,!aY`]{]q"?~Pplf'*?_}KYtי&" E'gfxc꺾 F {ս4DX([\*I",t/п\K(I+t+}eP%ufVW^WP˔5g`$ɯj8^{ E01GSe^Wa?cc[`Y`Q{djLN4|$fKDX+?WI ^EkV_J +AػWJ +7:aнn:5 Ef%W=",Uf}6U&E"vU_Of@HPpr>qV̩>=p`@t|)ͻMͺ!՗GMx`#н "k ꩦ> u1(0f}V5ExD8zA-A5Erhz (vAX})bltODK@vOˬ̠5 {=u"^veZUdX`][M'%86vDX,`Q^3t(892WބF u߹1(iAa^uy({A-aнxF^3\(0ׂ;+oT=C"]W$o@\P/6}~`tN3ͅ Ebc",`Q{'gǼ2+EX6b+K,\YW@ (0R0+QO@Dxvt$gL tO E,I`Ez6u'B"vx} k,jt/ oš,j+mfP6#,l^O8C" !+]Qr*н>wEBVNuDX{ ]",нx_{w8ުLwbSI{էt &Š+׆N(P ~KNKk{'(aFr$5W8%G a`#нq(t\FUWoo%7CM>M{mp#̯P˺5+O+nUHFX{/g'T߲b+W@BAEW@̱y.aMyFI Pܵ-7k$֬g+ v̯@uE;nZ{2^KwrPΦ t\n);m05 FU,{s/"ړ5"m{=^M9 Hjt܈_EٯW݋S6btnq(uB7QOW@{`u! r42+nou! V0+7nFX(}{eF ~m"pPfU`FQku~ơ}[i0 HjtMŇ(|JݔPx/н^÷A6:b~%^Yy;;"p@x E)S))нx,]@M&Kz-ve*^EWL`M-+j0Tt"pREu%_ys*-+гXgxu׽=iy2‚S^VEjz+Px75S@R` t.ՆHBfNDpP*м3:w!A8{ h^VME 0{ h^V 0{ h^Vm 0{ P C*F+м"iJT^Eo+99+мa96+гx(w@"m߽}O  t+]?7h^$hXf gI hUVñ, ۽͋c3؈߽͋Wy0  4/V^E@aTt",W@ rW@l^Et"P@ ( ^E@; HXt", t"c3؋н@l#W@+P@ (za@{0 ay {F P@ (^Et"0 PÀ@ WWylSh9 ;hPi=dE+(`/p/Y̷X ڢ m(G~ik{WP.qЭKv"9 HjjP`>|'gzk=m"+"=^_uYFX"su$pbK$5Qd:7R4Agv(r 7R4F mnYuya)Ŗ6R8 *KKK_4輘oǭ٥ J6R gI @j,c#,El2VO" 6baKL >|jWj,q.|&עм N_ O)ojо N_SFX?^6K r@o ay P1W@@ ({нp\gB+(rr^E@ (A@ (^Et"W[P@{0 gI P^  E~t"P@ (W[P@+86bt" 6b(ܽW@++ {Z , нc3 gI POP@ (^E@y@ 4,Ud+й(VpVг{: l^Eн^E+l~nUU+й(Mp\Iа{:u l{нW@ʗA@ *jWC+й(Dp\а{:Ul{нW@ A@ **W1+й(;p\а{:5=W@+{?K 4^E@㊃ +й0v/^Et"U "hUT8ݺWsPO: Post"+P=/^EȜhUx|+t"bP@ (Lt"dNsA@ *v@"P {!" ^Et"2Zнg +ж( -{н^Ej { skA+@X@ (^Eؐрy*8;"W@ (yнW@6$ P sJTJjA+@MV@ (yнhr@ (нd>Ab8P f*{tWPؓkW@&Plн7t"W@ i%{ȜPн"t"W@ #{H;нl t"W@i"{ض^EzW@.{XW@m8P &{t"i @L@ (vнXW@+\RR ^Eȼa^ @ gA+@,P)н7&qt"P` ^E8W@@ ^ELqI {l4^E.{X)B^E+&P&нi7qt"@ (,]Tt"KH+yh+gHp+yTJjqt"KBp@ (X BZ+p(\нP@@ (-^EwV(@p(GAt"@;(P P@+m̅Wt"XнHԂ{Ӄ,P P8@j)W@I2Zt"pzd_+2I+^E ˷&HX@$ $, [A)/mEyɿz@$,v [Oy]#_ V2L[T'(GP +7 /Jٲ38cl$,4L=SgAJ e;9L HXiQ޻VA[ײ# xøa[18 3ߣt#3ۯ.Q ~#'!ae*[?|*Cm \T=Iڲ_j7!e3uƖמ6’W۫7=UOlgz_:c;cKXglyV^%W&~g-{FK>[:c;cKX۫lp۫^%,d+IҖ}>L[^e뺇^%*a![Ng!2[O"c%amFX*amW ,veIްhUy_q#,-[>Oj{W۫vy@~`FXaFX@0 9#,M_ #,3 *+^3W# A2\T!8=_%T>ƓQ:C1x|̓MW! C>~'3(!tF>& JCž|'t& *nؖdΐgs ^A:#dtU8e¶|3H=c '34B@S:0%$(IeѮ I *mz^HtЧe!(!tF>& ͫPL#,9y!I>Jg@ƁS07$(N|4‚Jtd8s *mz^HqTG#,9y!I>Jg@ƁS07$(N|4‚Jtd8s *mz^HqTG#,9y!I>Jg@ƁS07$(q%8$9 y631O6Igh^Jt`JaAQ IQ: h6G=/$G H:]pJsɘ$31O6Igh^`)aC>ƓQ:C1x|̓MW! U>UJl+Hgclм і OW<$yc<3W<$^r3_=oq?"JR+?"JOmZ9)6ŠG,o86ŠWa|XtS VRV8}a`"XaŃA6 ^" #, VR9@.{n~;!7>l֧\ƳƋ=o|%½8w̽Զ`۟GćE/aK׼ѸnOW6F"v&.毗 w^8}Yu`טH/u"o5l$D}לVM?%G}ы`Ǹq+ޝC|sjNoۙ2wLT0Xߘh+>Xڏ҉WXIGXPDFXCSƘsR"~7=^[oJTcz #w}#Oqf-eoZ#ak_q'u-ٜ5ºnӯ(Գpo+G{p1W묾?dkQRM/e&~"+aYfC*/04)]#)"~|S> 7jN2Šۆ{Ƽ($.FX^#g!>\!k4a]y~|~ǜ2Xx kg;a-Z~ֺYVڊ_w_ zRN+]=.C~KEz`>#w7p"-r5º:\7wz/a}L>҇k={kyFXn(}ܬzݩ#;Sgon=@ɀPd;3ECX@(2鷀 E}Dp endstream endobj 209 0 obj << /Length 2884 /Filter /FlateDecode >> stream xZY~ChffX Ȗ0Vxx<>u5 v,'uW_Uu|Ք;//|ū7*)\O$P8rvF~hlB'mG+pܸlRwАu 1mo H}d?cݿ:ejn8Yyw0?\t7yEW⶗[v[~%ZބR;B/rVձ-˥XyZY ҂p@C xlM9V̌L82k۞M{Ev8h٪*X+P|]bwr/P"ܽcyJ 3FR]1 /g$傫1m?,a$_2qo(Cİ:2=⟃_{􊰑jC^SX↡Y$P 9tf*|0:^`jo{@ZX, g֦4xG&sdM3K4eӸ%q3bgKE6[7D6Nfm|C* Un PbO^9(پ/VhlVQC1hjԲ*;xeN)(Be[`lgSQ|,KdC_ j%:B_0y>:y>ԋpi|ZVȇ]se{5Sbᢙv֭*0Ta<:6c$c+Cwz vd, XHgہ7`p$&XHnLI@t?֔=pe%)/{= HJH[DBOlT;h٣tb IiVmM-%Ȇ`fH28b2f+pS=Ks,oV 0YbkQhHq5<= nMb+uk{܂KwJyy 2q #Prh` t =aʐ~̵LqM9 2= dbF.C</H"O?Q' qteQ:mu3oX\g~хïJ޳ 2q|ked })c0pX4t_h{`~|,δ!keԎ G3L}c4l f;x2q;Ye/z w1Why#:K7W+4bt(N]¦߁u᪞ú[ Boa_°9ؠs4('W -|gUK|npLrn qHC 1QAӨyҴdTڀ@5 ^l]ymiLR†۲Dt Yh+X#![NSG:]hjCD7d O/pS{SIK!?FaPZcmAxs+wur?O{zUj_tڡVNJvGљ0{Hm<P6 $*U,q"E{SRꎁrQB7n44U4".KxⓡMRrۏGf;%!\z AX9EF@HԵFR2OhimJ' s,)3E^#S E\ECkWgah7 M!{e.v<_^^fT]AҿDX8w0ma|4!Ƕ 'a2} *kP{Ht]ɲ'|J#&Wma=\Uԡ<-7X*V$5Ɏs} Oŵ q+F6e9BypW^|)q/b[ݤsPrC&?vPfryxYKRaEeSi@|VeoS )Mu|RIh=&.nŏ[gRqx?|Fk[~O^/6viʯ~ꠎHCh??iQ*ptL8M삛/*p /$i:׀hpPǁV]ʨ78+C jJ-nT̾ endstream endobj 216 0 obj << /Length 3275 /Filter /FlateDecode >> stream xڥێܶ=_-2$R (㮃nnч gF.Q(ifvC9*7|_?~m^QXFe|ʲP*Oաml{7ZE-428foh{k<@/鷸‘aOps2Ԙ:MaQ=J#?ꭊ4, uHD_o$ '2T޺ŽUS6:Va˫ |SwUqF'z9C Ȃǣ܁grrv{^OjogN(LK_TM*Ő|o=Ӳﻆ fb<64P `+rU%  t)I]d:[8kQ9W'FM2qcW3@nȰʅ0;9ƪ=pe>b8ր !Q1Hr9"7~z!Ipg Qv@gaMg9ŭ$q2Wp=q-Pc8~zv~bO jG@;H8ϤKh6vY_|;FdcK52,d2!f}ݙok*GqON=9-<+far( fřRưNmp ||**4\Tp=;QHF ۱F7UBƍ3W8T;Վ#=F E5e SIr:1ƶKKd P/*/r{Cv|T}:thVH+B@^  -bI ZMϨ.p*h j0S,Vťict[;yƌkfZZxTeꂊP25m,w~kQjIU,9P50ujQ>2$ oC(`tC_&G]i<̳BӉl8iBUO1,e2㑃^ - 9TtHxJ4ՠ"WMȝN}7$ؐzt 3k迗W"a\h>_XG w6--HB81TjA!tF5S%$Pdqp6AѡMŖkج ~V:2LA6@^` -$K-Y"vش(( y!x4[PSvC'vC?nZV-G^x,5aI!lo>)/kBq>@^wE< ,HXYd pkKo4b_.\Pt8v4h|4?1I爩4N0TB7@& ;?e7aNѪY0t)=- d8Pƀ{pOp\vCtZ{h/55q^S/j/" }3sp1_ 1߼f@CYC'ֻ;"E;J i0Z-C_YAY1)*) 7 9pqc7EneS N#s/9Xs@I[,}>0rg=FJXvJ%2i3yyYXdJ)s!wQePwwbd]5 nJ +B/Yxd#2=4+*E FKj3&`^: >Bj0|2,Nmt0,]'3;Po0X#ue@a{ǎBE"h8i4""Xt7ƦɰPT@j7l?&M}"&]ud8B,,r"Oገ@l* Km=P|еd~p8m*|];vfVaQ D^]!͜C.]\ZɃ-A)e' Xjr=1*t|*OPgZr:ԥR8AXu9!wz*OɈ/]a[|4l]jj lL(=!wKFBwv&U urw(8E";8 1,vVpg8(a3n`2K~#k.g2$BJ :!KV{gOir8Q-&=f"h힆F78K 9skC>PzKz1yk-Y~ުG-tjMVk↓R)[k CjCB],dE2Z1Ps`S&WcdKKl/ʳtBKલ2)(yE.T DqțL;v0P,b! (Ms{kl&.u2UD@ gyvL)`eT5hFJ={~j_t9,h jv\*o~p| .'Dx|U?L:>s%+sOqA(,f@ΐ~|濘^D endstream endobj 223 0 obj << /Length 3156 /Filter /FlateDecode >> stream xڽZYo~_Yhh6on 69F It,ٔsAqW?Fz[D~$p*x,1 ^e$0 WcG޻Y#r|fbC]MNܳg q8*o8(oĆH3iOߎUOkqT quTi'aO׸:C4LkHO^d~alX󸰈=VKn{[o?>1'*P?~.LKM 右=-JLavR3颩!IִOs fۼ$H*&&ܻxDBoa\:/ ON1Wls03Q+ ^ELWQ#++<(<0 %-Wry ։E3IS<>?̳27AƲd?%cjYq+_`ڟ9lDCP)g]%oLh/jBǦhԯa* SW^I(( An&Ezk,*YԀ}0hDr ZYzOGZ;taMa )pZ)f¤Z0 mkbX$^`,i2:Z"3R?2UXe;J 4s \ cո-w5z :\eڛA)\L9q}d/2Vjz W4[(8Z!$OA\W eRI*qVL w;@!QD T[Okn9tv߽ c5‚`yժ2dr9nr*i@C_R' =W4uq?搸aE`>$j 3d#||/?2E/?_V5>"ÿ:j/Rxp-qKɅ -LM91bsN?ʩ[%졳e+χ"},ul٣l"\S{3p+1.+$8VK\lCśI?}_D endstream endobj 227 0 obj << /Length 2551 /Filter /FlateDecode >> stream xڥYmܶ_qXʒHC+hPiV]ZiCIE{捒vC%#r8|8 79D7~^}7qQ }w"O†Jc0 Q<4Mfn0/';Nc3YS=s < A#_cχ x=y?p39!$Ū~W6M߱zkI0z}Ѳ{L/B)@a2)0}Y Wtߙ`ENWI靎HV䠒b IQ-XWe`y5+ 5Y15\zt!epfg~TvU $: #^z 4+R@h+bD,NL)k54awOM1E@Ol^Yis#A\[KH jr vp$v( 8>n)4b(s-+G@'IpBZղX׬LT֡_EK {ILlgE\۹f_RұG_Psb1T>)tb~Y ( Ɏ nlu: Db|'{ZF@~-Hӈiik 1UUM}>rq/% !D"kٮӶqX8s#2LBn1R ciS( J%GO8ԍ,<4π*gPDw?BqC6;Lm [3[Rs:{?uoN_GЪ"==K{4hTw33ldA}a~dw1bN_dtQ oY&!qOƟm,*Ik'Y\Nۃ/*y %\ahŃɩ Bv1xp(\︽Zoww=sd8Dk/M,O&fl+;mۛkp xuȐ2'TX~:ʁu\*q(;e xDr"AaI ܧ)xBTԐh\` (]VFEF)D~8áWrЖ)9e6ȆyV@D*Q *Ю= nähoefsZb"Fn8BF5¶|'&R}HQ+HXcAOpԙ(Np+3eL|.0]h/MUb!P4d#K'\V$iRDAǓcKdND؛SdQ/(!I47Gk^݌׬VŰL+0:+xÆBgxj8cPP-q,99b2dο"BOJc !\zCRJW<-E@|ԍ#~ ^WKK K-~/dk~I²PP$p(N b.WJ_^B8S.jzʿ8Rgf|9%jJ pjzIz6_mXRuTpuĨ" *!s–K"`VǺ6J#x2s׷GE3R B` T\9@d>'yp3JP[_nik-yG6/6ψrR\ F#]7!b|+Ͻe0 q`?Y-g3^G endstream endobj 239 0 obj << /Length 3295 /Filter /FlateDecode >> stream xڍZY7~ϯyh}X؉1 !3ߺִy4Y,b_Qo›GM4o7yK] l(΂* 6nDUeܟpQ W'[4^ժI~dp/LuzV{9\MGSYsoKIh(d+[3ѯO }e3|t,3eK }kzU,Ϗ =֔=$DTOzYI>4?0k}r|N 38v{uD>LU%3Y'mVLXɰ孝QJp0\2~VdYIPHza*6 Tkt`䆝L)\U*ss]V dޟznt{[i߽Gpln)ȉ:__ϣݘ!`9,r꾊Z+i]YN&LI `!׃O[YYtNSr1jBec]8@N""YD2Ǡ SNKЀ$#)D@$ދ?PCՍƝ$QlJK5N_.g!]r*ZRF#"Va~sZWP(!sk'L+aJAgI~Wq!M^FkpwZݸ`ùWU^;΋_u57Bdh]aaK%ϥ9&]pG~h>}~v 'ׂ],nn4K2 ynr 4/*MѸM $q>J4*X :!rɒy2 "ndF%#:|0X="`@aY$pWL,:`IMʂD{J]I;&\7|#sZAgvBk|ƹ`gyt.O0 3>vJS>f/!ZIPɜ6jeIJk8QpM.H/tR46fYRxTFĢCV5[IyGʫT*Y^H2,3}c3A1ClvM\)q?>r( ɓya]Y6B5[ >]N|W!WHD l%{6~ȉʋ`ЏT; GmKO*л#B u&q7~y]-ʽxlG07$eaQg;~>Ze #.|ziEeKEO-< ^l><жjQ*>̦䇌 k8h&=L01̦ܿT]θ3 XqAS#DNU[?#j,=!j7nRM<?$xJQrMyuEFeD5۟e̘ .1yh]#yh6KS;YDR/2*60Y$bMh)3 ('MRo;$ /~M;_rҜ7&g-Wn.{q%x[R:vqHb(#>ǪU1D?P>\Kx~Ρ:د PoEexyl+|f7/5_S\p :@x6@ne(iz"bSj+n¿K^Gr GѮHŮT'@2 endstream endobj 248 0 obj << /Length 3405 /Filter /FlateDecode >> stream xڕZY~j`ZDCx6A<@~ШjfuI:zSE,Uw_ǯ0 C?|$R]g~=1 ץGީ3w/]]u^c[E{eWV3#|ǿo]y[pw?J4r2bFc[ dڒnn$#}=S(.Ƌy=ċrdҴ'sل?.zMr@6ƮB:861rд/w)p*rh:-_8#9E՘/l`VKdÔ6.darz{:qbYL=N 045R^Ɔї:-c{,tf-µDY :Oy݌_83xHضo-lȱLiw監bQa~bިBaO5v 4{6Mh,(d9+`~#4Пq #i@0 t;8ՇY󺅬7Lm9f*F&]߰\LŷƓ+7uAҹg!:0LEXxac<Ha܁l+!ap_:>ف@X<QAEF@  [awN.PJ = $ܙ x:u$)0ߍ. JH7?:DQ ".`L ]V tY "ZVAO3.1jZlp3U|0 ~]J3?Pi7~nJLN z\ -A8*F-+t}EE -k˻8kO3:TkA ToPtcTY1*FEݎNDA.:DU5בl6+'&h pݶ;dDFq*REbLȅJ@[f=N"eJjxJWz0 T=F"ġ˶':w |IcPb̎1(qҝ#:5b0u/~]ූc Dfm nCpK-˺dRhnь+d?X\>Lv){K͉kdh(OS@&Ξqܦݪ @/u*"(4Bk )0Ip1;s)66pl\j%t]+yג~WZ) +EҬI(IdG 5*7LU4$?(`e[Lӹ'VVi*m+Xإ@<h@f0ENeR ǐ}ŖV*s&dv07p/<Lz \ ;ZODF#P#G9ǧKAÉ(@@S'nʽi0\OT8BB6-ey/Zaפǎ7Sry ? 3?%c vא &lEx7Ri#&˱  DVhn,;I M1IM7gP⧩Zl9VnK_EHuxLGa*އMU:Q<I:$X{}GIF (8<*',1_4͕gO.E pUU&u($x—=WHH-u}Qѓc=5wҷT V l+JsoDi4Cox1LqGsYDqJQ(˱F*L> stream xڍZY~pF\އ+c{dSdTjI r_4nu.@zͷQx~.8K>x_>]ޠ'exUW o#S}g *߅|ͷa\ȍ%xwfdǠIDfU20 c׿}g >?- _xRxU6-A'~P, A@N%yz6O W!\o/(NMvQoݙQU5[Y{%_|T z˓3d%&:4' Gq^+Q앬4pZ89hR!op-M ֒( 40wE42(iGt/f@! ۈ$CVN"f,qiPĴ <%AlxGlm]R0s%v?DU9g .tF۞ PLx;4MwTeՑ Kۣ2΢qxeȔTl*Ӡ8[&I f$qֈi |8dh؛G<a %-FmmΖ>cax) K {fY8)',u9dA[ê3.)(E12] n@a pjRWQQk'c? @+ܐؼ`T:"GN WdM 78UMa LDX^1N-3Ί3-oz7;`yTFĎsȲ? |:p88 C AVX8\! hxq9f0NVTLEwEؽLw=avw4Y@l~& =;)@;5 Pg2+Ж VCBA<ZMuIUx2#Didl%i[Agqt!A&!x"cݤ,&kO9j4jgK<Cj\lȔP*_871<Ҳ-)0~qd%l*#I0+m,:@Y.;n6SxEMXC@oeWZr뼢`ym`UG%5Pb*):^DN Mho Vy.+ sIMfVH0Б-mEE% >J?@ȊnX .6lfnbe"D1¡S9_v,b0 B7[TW,.^vB-AjRG:g6yQ,Rt@?aTVT.ʘhg9[0 8ŗ+vrLSh,?i6- ۲ b=_ =N}q t)xeg:ˌplUiNhY-Y[8E1. 2M#qE? rEy<EU!Sh8 @Rs)RtNi`KQGY[SH.( &f؇{G-P!pbX@ `x!8l€Џz%aC4q!@c.BUAiy_$lw*+3bt 1ضu ^ 4oDm1k'PfX,F'RSp-gX T}[A~o{\0-( Ң`O/[U*1ռ]Z0za<FAs3^t>UxuF@(u$IXDrH1}fF5mt(qnw@?m^|G ] hSc.J@eiƾk$E\B? 5{)$L1 /^Fc5"\ѹẤJS=`$SXDܹPQ.q'@@9z|)EM]iPbH2 /`pb}r0kdޮNjlwϋi}[ \>LT0;3piCԽBC[jfg뻣]yBqWd[3ɡ'wͫ-Iws$⺙KsH՝ȄC,ʹLY'!?)VN݋UOS& J *"tU.,p.qST$s-hO]oՆ?O]ߞq_<M~ ,$zzwk?CЬK{&Ul(bߺд1^|k Cڠ&>1 _s6`r(CF#tVjDڌ(.H(`>]w b#$b% [r./oB]ktP Ҫ \G\qFY, YY cz3fbe뷙b0-EOV, ׊rF (X uA#aQpHB&26!/ 9t@//yz uFw~DMQNiӗ'W4Y8R8?y/}'*w!z DŪDthIǔ[*ڊP<L7kh y3u>/hVD[pӠhɮq4J]hͱDAAmGYn;ia*\c'CH*>|F4-kMJ,RsP1ypZ(7FQ'UTe.Ū7O_ _ endstream endobj 267 0 obj << /Length 3520 /Filter /FlateDecode >> stream xۮ=_,Kr Mq6 A%QkRyqs[Wq/Kl"f{sC56h- džƱ ~5p\tES};-Z@9 8H m90Znh:ItM ǻ3xVm >TE62ӤD%hM2:$  ЦYi&W $2@%]rMG_HA Fb L9;b8(DJCe>H:K>0A4bĘӴc%[ Z ?vcj PtڂGð6s[ı8x1p+sHd.qlh_cIl$1&D\c2&^.lp;p t8hJP]ٴa6mk{Zj"7tMՠ.a=hp=G$1QctOqd(g'>{dw~R2@:%!G@ "y7Eݷ iN]}grFl":#^J:m:2mxPlP UqƖYTQ#EÑwP-@)h8-- z+wx1mŽH{&ikA_J)0d^1-+ Ӌ(5UOW?<B] wFQ~] \n94i͸̊rCP.zX^ڤ!#b#_Wh+2%)V>$KvD4 ә䒈T}~:SM~^6򠤰* S>FM;dSDB`, q˚GRdL'g,rM5W?(0~Y&r~ǒ,lΦ`z|tBkZ%Ue$t!r-);x4ڑ]ʢO \Ob>4xXEYOЃ*^R1RាהE?v+gƉ0 $O% BAOAtȡ s1f oygҷpX? *t|<9,9Ɛ5S0u٦v#^9Xفm=6^ 엵}A}-v]7{>`kNoYBcWSP9pE<#@,Kk_rsNygތ!K88g,}i $s (G703DwI"qi5FL,eHf)!D" cdZIH =I瞓0&Uxշcu<> 0YD$jZNq\0I=B@>% H_9#nʌ:S /nr 37(q%KK3vq(k,g9ڳ+UD xTςˈ$$)/pCڳ{" U4Qr|PGqLb@$WBV.IlcKcLX -ed&-o҉-4n;vBǞ k(Nո-yhm8y{p~TL?tf0J'!{" hI%tqªܮfX_{yh/*ڳ fVt:ve:a#{-S!]5 ]s *ʱBG q`$Zb1S$Rm*Ʈ4)3=xoa`ϑD)V):?TMUSm xxˏGITs]J/{ -(h6txC;Gͼ+d( {`&M`2 w%,>? 3*T'm_^E٧(ʧ7*{Drq*~$DU=mm93-/IeF/f=E0v"u\p}V 5Wܴ!9t3:-Cʀ=o| LY)cb]pU w{niӤ' p:Nَh<OH.^0PisPkެ޵s"% R]`'hdn7Ŭб\|Y'%ӫIOI*}ϔ$sl @6'Ko rdL/f" - oz (|lX}dMMhܣc,Bw\8`_ ;ΟcⲁHc^Ȅ|E h5%!Э:?N˻wr:⋦ D}/%KKeBnS݋ྨn 50˄*_ } endstream endobj 276 0 obj << /Length 3724 /Filter /FlateDecode >> stream xڕr6;Źޒ;˸9C$B\ \dN&s 4@;\ ᫷* "(«Uq^/P^ꝯ7k5$A{LsHxu4tˆ:t̂vOSq{L/XXm,g`mi;`4j\~z)Zᘛ0ӤtmMcM^ާm4@|9Z]GӰ$_U>]׫ - ¤Tu{;s{YFfgKh_>z'Wzz TjjJlbT!d?8 \%:+mgkUUx-xV$[ @qÇ+3Avi ;2ݰNU+{MȻ?) ?|  mlx06 e#+YNk4zNqXNڡ)Ug4 8o?E\ qJGᖧܶq=۫wI`!5pύP H! Ӵ4 q@jhAFLɁjvElsa&vbQ5"l›2 SG(L@|bl17$8[9@F* _4Р^Ci;`2}vg7._2m5Zdey"xތmq7 2yAJgYN0 -[o6lXQ6Bo4şF?sAH=~x n`FDЇoe -.gzb1\t=h{S Am16GO@FpxZ?Î^Fi^?߾}VzCd^6gsg-[[!ÅK>]j{{6U-UpjPAX0&6 "ؼݠՌNnT\ l\$64y`9榧7F[zH%:6czmEAC Z}{ f =D69Zޣ HdIꎫHz8P($( Pf 5݁ uLǑi4[i,nhd/*1`29BԙuuӭVc%xI"zzi[>  N 9Ę3 q2 X9X}2]K0{%7wD4ɜ9w{BF!L1ң96M%2eљ;ע]&(VώS[U{|@''Ya1FXق[V.|Xw"$N&+fr;ŶcPΏ y14G15ðc!$p`0`.VV è{TZ9uie<;~QDɥDT$btwtE >e7I\޺!NAjbS\ƲFD ?}-@ Lt_sz&:r: {:NRxw!7 3 2ʪzaR̭Rohz7 -O##yxs䃍d[pߦ- 7 ꟫5| ,/ۼݗ|<(Bn3y'baj5*f&pxXҼ'-$Ht9#ˬtE inʢ$w)Fu Ļr14H*BjMڮSfK^Ix=s(䣭XBޠ<ɓS4@|VFy~9 b,9p$*d<a wVZ* p{Ey1Rެi*۔ym4wH*[nr<-׀R`4ZpC{a: BYҭE51JA!JUXHTmE %g,o6SJpTb68NƮ+O (hqc gF+uSKe> stream xڽkܶ-Т:+z+hS\P;"WC .wED+;/')Zp,r8 ɍ7j텒7w/_x\o$Po8s7ョl.{.az'{,q4gxY cPt3Z_:`k~P:z[ԻlDޝo{ nM',˻I9If\d$ ҙrK{'bؽHowEkY\$8 虾PL&Ws R K{ՓdO*ZMFv4ZStMc/ 4[J3#{[q_r͆O{FGۗϨI'%$0N6' h*c-voyrdy/*~-gg "|ƑO^5/<Ə6  H)DY9eV8g PAkJZbhkFE x +Zb;Td$2>ȜFFe%<Ē])0N`㝿v+H917(/A,y!%=U<}k qeCG4:@T7v TL9VIg~ϜGiI9Q9Fqz =} ^})pn_ ""HEkb.Gw M]?06wѯ!'jNYQ|$#VI鈟:|h=oN_qӘ"sez 6=e^n0C$1?Cͦ㳊_ ٜy(#88_ 00D?  &Bd|[L7^b!%$+EEK(TZbF{) in[ -d?ࡰ% x^t'q*Ar;N9&$>?rz `MJI0̼woEחZk&ɿa0jL=c{ȅkϹ-}2 ð_Eԗ\.?g1`QcIՆ-_- ESŝ0 WkvJy(4P!/8KF z1~Y;e9% e+$y oxwιag}Ox4AgM?x<55> QyIQznQ" g 008io8[Pc0Mwj(t;F?&-r s݈OT!]Y#cҙϳ%?f W ~a_Sה,5%KaPz`d~"Ȥk^yuwo@ endstream endobj 173 0 obj << /Type /ObjStm /N 100 /First 865 /Length 2354 /Filter /FlateDecode >> stream xZmo_۝ٗ@ ;pmE F@Q5E|I>s$R$ţqA3{g|r&\(36"5z0~K|v&gob=$ &K Jⵌg/c)uIX*ZK]AWΤ1<-NHL&1Ǡ!/sD9# V`1=.+Z PiqWų) RKVȏeJrbWh>xbS3~hܐh^b2͔czS Q{٪[`)0+* t96Κ|8W?߽ѿo~pn`xۅׯ-Y=nn'?_]ξkKkS C۪N۪NPKRW m(-;ۑr+@\`m`Q4- @fƭonpYMZѨ t.L-.gu[6|k0w0[|Cq\^xn~#9r Q=d5Q.?ځG^7YϻXK¾ϰ[VU|G*niME:}qLz77NUgHr6èa,wjj7lv-iwKkRaN8 PvD#X{CdJ?`94^Te2tt]0DNVk js>z{CiXr$`vFiQ:/0c[FMҥOz0 RF;7Zҗ=,^ eۃnDmF:60@pR @ZS zs눰A{_Bs zyt1:"_h*:+:E"=BdkI} DlBRILX! _qΊQJsQ+πoHA87+RSO']'WWYBYBYB iZJ-9x׈/ڇvxVOw (B~N>dE=0z=w1gjtPyw`4>zBOEܤ2#l4_Vؔ \> fu=+71G бM$CB䄚b$aN?`cG!v^GW?nbGy%7d s(6nxtO*v+[o1L#V+cH3VmǶNT}Cː[q1spBAzo}Zpw?1afNV` VQ8u;a`Qe8۵ʾPұ ϙ?-fǏEKgx$k0M΁sqzwr)[ZBCi ([Zr6YhDWzFƇE=%> _ endstream endobj 289 0 obj << /Length 2826 /Filter /FlateDecode >> stream xڽZrH}WmQĀ;8E㙰l%nΆHMC h˚̺Qj쎙YA]UUd,Qz>|trJr#)ȑYQ;&[ݯ^9#JԴ^5TE_.. qp)Ͳ7fdFIʍ~WnmwU7m3fjnbpF07jG  g~WR/{-3!rsp -@Msrs"~}\qv*s釗O_Xխ霝ix[u֒źZO‰o_P?s;?mOފr=V@BO< Lt4Y_GᥢxX*`#3GQa(۾.{ %%M)6gc*X ,t-.} ]qU6[[7AuI]KiJGY8ЕĿ]y궻i\Iou$@L t=xw/m$g8P;L\> wdCóem5q;0$K\>'1eU[E(&4 Ӡsti grbs-"j""ljrHgPJc*؄sE3rEr@g|Q4} NڀiBRvyA$NLS yřˁC>?NUPS{j:Z䐟@#f Y||⭲!OENYP'N/o WqF9+YvQ>5~Y"aYmE "V) ȹPIdَaXs§Yxe!͆N2 gˁ7d>y ^8 x'w*?d=ӔE+$x!N5.f(4{R溄8ĥP| 3*g8^Je߭֟ )E=hIT|PdA"" Ig=SQ7^O-y});I"*fEi,\$枱IQw{!}Qvjm>agV€q(Yc̿Y\'tO!>pgt|# [IF&9kzaV %L]r$%gq*5̿G9,cޔM]G3mBwl2|NwK %a䌈#0\ӂi {L\9,6Uˣ%wMLmՃ(Dz;7ۭ\8,c ;s_Une=[ue.O_T@W$*ZװU1Un_ E~a7ix^ϸFww\o/c*ZUEwr,T16W]zq~OXJΩ=2mZ !0Qz܁Q./dz1N*sqU%\&1`Nj>*37ͽQ KTT_ XYv(n0!?g'.NZ88)(Z""VQ$":;8]jY_> ٽs& p0P]Hwar6M<ᯍb7*jPЪx|0_6! 9OVTJ漸|?GNS endstream endobj 293 0 obj << /Length 3208 /Filter /FlateDecode >> stream xڥis{~N cq#SgF)\dt" qXV @A#c'd7388YݟxB|s|=MǟôG~|3N6tlhlƣx8qM&&<2}-.[1"` <-.fدw8tV@~ô{Bˤ=y6(xCRmy d@##˭ v _Kw a6[$YY̐{X?TŻ}Vra˹:̲JX[UxbpR7d]u! [i%iR!/*dpVX2 eqXpkJdR`B0 Ә{LE(L&DIxZ^W})]T)"ҨDa]Ue1u1w:I&rLIDPBbRNŠ %AgJvy%^•t]?+1aQñQ{ܨ}2^Y<:uU+"a&\}\u9v9cSkpZ:8>#x 0MޑW‘|(ND5pTeu,#.1csٌ|VUE~̘O !s &RڏIüt:")vYY@6iGGX z_.·@x}}YҎZnG[\!"wbb2؂0&*2<_]q?Lub6_iWR`^ZY)bI@7@Gva*l7ފH&eCdvjұ$$XN's/QGaWCةKyJVUg'؟݄{iLD;rHcm8Ac,ÔF߰XI>(qgKE 갵]//?L' 1E%kBU8zRA?aGuU)'8AA  cjQpNhmahSr%pn%vYTGq`l~G^82A.ɷC|%|@ٰ1V G7r4.%ٝU1v((<͖LPس<-n&lNǡ˒i"9N l*`;eGɐM6oP><2 75后C$;۳Ү(lwZDjYJ2I$:"%CP诤N'U[]_L+&EQ }t}ؾ'p\mӓ7p,z@v~ߵq\eR>*e<ӻnn KFz1YG]뫍V\!?2J[.P\ht=!AUNQ;R.쌞;w8+5CT0$$Ȍ_V G\ÅoRb%oB孡 S(}!!loquF He\o*?KRb}ĵ@Ի-w[ԍVھR$7@g[,v c|%] 3 2VnۿMܧ٩Hʅmlry0_-/.ӫXz>]onS_N].NOō\4:*d[͎;˳LM}oS6MY`|XoOOt}O'W4a4L|(+nb3>&gcDѼIiJt5i3q&k&梙5&Q'58'0ecuٵJ(`:-lZ]u=?ρ5 \z!ZB^S1,)a~6@+I[0#HM@"ADN 2%]Hk;x3 !SL>n3߁F8ɡp.Q5h[tP*,G([>{şFE9R6rXRJݧl[Fc*6*縷rU>f̃]^#n˔"2,RJD\zJ]YY֎ :f3}'>Z]h9L 4$۠{] N2p YToZ"д@eBCה2'3_݅/ ɤG/T &[] l`3 5E>8l4Xew &02`WgEG y q>rI (>)Arj]eFR8\X"D`Dt" VUU؅eEU߻≡Pb#$с?x/=C?K 7)c.p3>%sC|Y߁ϩjA/]ѫ!_^)ҁ)HuN=ʀ鼐# ;2XX2ZD|JՒJ.|)\c?$yymSHڗqsG>&/nz% ݉M&M1uʣ7 }X<ϲX!y#^sy֤'hT8P K{:xZ6tͿXT endstream endobj 297 0 obj << /Length 3121 /Filter /FlateDecode >> stream xڽَ}b^s67ۀI( `F/iLjF |{iyQ]]]]w߹\2IWn*w] ߗ8LD |s{,ۗ/|wI "Cǩm:]b }wF*z%~]?膊gk/h)tNq/ZݘI^R08UY:UkEn(ݮ`+g^ 5Nv8A!|-{:*5A95s*\9\MƋ$p62{s_`(U7DZ.z/j.'sL!RuPx es,zp|DYSX!CsJ͕AJAUQ㲾pyb:! y/8*B#>dM٪g;dlA U ܰnj>;^ o䆻E؊wQM/ M@Pқ4.u(F]4/ɦFdƁ#u7]H錥8LÆ!P%~вYq3L /p(JF[L"$yG|v TzG 9s78!+$ `۬a#V,Gf$QPzEsf`JwyTv7|H"Ϛ:6US6bB,HƀG`Nismz Z^H[ojsݹbARoHjK!')qS 9Pr`feݪ G]h{P1r(< }R&|1XNw}Fmji]ȶAg?`I2d y=EGnT!'D(k+NO eC6@ jN7] ƕ&ۄ;V[di;KuWd-˥HhM-@Ģ~MO>%zGыpJab酉:+> EE 욇 e!\T8[;pkWzc]deoNGw{Kx%1b ܋d"sPH!ST ኘATsC }<{9FF иupuk@5{o71c~)bYbx#8 fDˆE}_lZY C zME֑z~{J(d߅i˪_ww9‡3AV;_ܽzʼnr3"ǽ@/E YDMjnisN|r84rs2p`x S)د6mBc%܍<D:|XHXrp& &_svڔsX2K94RFbGښ/ 6^l81WIA;#.@g 20|m=rjȬŬôYgTCX{%f/ס)=%S 1l̡kwek` |MU~nci68{. wL6dmx(u!D$ϲ٘/_x"wDh~B؉ܿ `WeO}Q-^&nQ(8>Y.LM &䄓gh{J>ao%Y$B7,2 cuD" 7x;"dJjp$:LI%ie(^iJMu!#Ve&-yy9Fdpe7&x>k|@>kZn|e`B'?s d:v  洛nK x *9?m+}4JVʃGQ<^H1f@ܣ $e2AcN_qn2y ͧ38|x9`B\-Y]ji5"†K'qEV<1oyĸGh3KFAKpu0 7[A$T(y yU!*/Çw%?Bu"SWA>WQ,ÆOrm- V=Vc wS(2%0l@+}0nD22xϹ2ưh :kf`@̈C h6u]JdI{Ψ~ HP^A\Öyf1O3fSa#|`V 03dTۇDxy8LclCEoxj]/)ײU S/Op_4`T`2[ DJ|OkflGF.8:A[* xΏa%l +61=تqo緃"ˁ[<&  Fcç<"󔊧Eٜ 0qxsa˭ )m?g#[y!Adi[~3jslL3I3K>m1{&jjLTq?zE@T~"蝦,C|5JFD9r\ﳢ,'Qj%>C4kI7[/Q'ҩ3Qg -xYjLS[tmК a> stream xڭXmo8_T*UԻvnlǾ> E؊-TzieˎW936=wJ᫷cfzCϲ]g=tA I_6\[L̤yB4'z+Yї5GZgC5oǺݔ鰛M|"HIJHBV4[kuaIFɞoXuufKdi|fiNǴslI>knHOf0ׄKYwIKJ_t]PA΀ĖM4IE}k?ŎVUuREICΥ&g^SG#*y`㾣j@\1Y+ &o`S&v^* `GסyiNW`JEҘ>hɉjkC Zٌ"kvy=>@,UNGA{g & 2;QUqk DmO5B-Rvd9GNFk:ZF 0H2^a5x N:mR/|yEXk膥*!60͔iڦPsf;WWCS&&ϚNUGAbǘyy f)eM4<+J@-mkMĄq1& Ci@22(c*|WdtdАgbe: t~jTixI&Hu yGOJtܖP$]^^$/1*4tBC gq^N$JN*k:.0u)öv$o=6F;b 9Hk%nO]N,g3ؖ|V)gHPp |.4ԥiCؖ.$bq\N j GlV!Z?B'[jpWy­Xn]tY7]v5Qwt=A\g\=d[=\l,f_?}{ƹW,]axQaSL?3g< |!'[I+W3ӆ8VNh]ObF(dXnyCS2Z,p8,`C\ moe;ie8os @Ͽ2SߡJn-c1 EפhìHk*Q =&}ğ/f!p4^.[Ϗ !s@nGŎ]X+Ə׹rdnh~ &L69'͗笠Bѣ#rK;/ wH4 Dm@urn~j 'QA"iS?i=~ Ͷ,tY=?ia$ztKIZ6N3\O7tlVuまJ*cx#ɻu{;[.nx I?u %=Gp ˎUss>s'M2dy1pGG6;3x y?7_}6 B0fsCy iH2~:&to U ef10| 1W~!.Gfp'{%Dg,:yv͉#w]D.:tȨѩ-@/wE+huRʴ-`PxPRyڪjSa&{(f)٤yNu ;<5K% ѠjvY6Y 8tATy/EQE1?M#QV&Un:ccQ %@ i,|("3vB/7.Ӻ'fIA`}XPv%Ԧ`Y% %}[h5*Vm kjM%ʒL4f6t<.TDQ̑69˴y<ZBtIx`jIR^HoB5L'%JX)y(Crpa^@&_'e%Zw}Aol}VbŇ<"d5m>n:dWq Qe endstream endobj 307 0 obj << /Length 2434 /Filter /FlateDecode >> stream xYmoH>>]$6&'X16kCW6;%h.W=]UO#u;RgA_WEȒ8r'xrYqU6M4y6qU$ۓeND|@StN纫uR=~^MTcSbJ9 #__t{* (S7Izone7Daorj6gMoD铎3rYWp(¿@ǟ5ugnS. [eہD}L + y|TUEϟBO̞,]U2NS.o7uqͧmd>w% 6rKw0 $ {4xk;a8Eph 40L$8if{x $w|! ;J~I/I5$!wO!l_>ы Ptw&vxxhzmoB cY$qǠXk̓``q]Z,L,k.)}\b*r@q DM43!2sH/| \.:\n\kbq4E!cg3(diy.a.3e6u(7ŐOE0w>\zߴ0\7@ck…rH=GA<(P@=pHkŷPCx^^`A5 ol'gئ~5y 4>EQ58TS=R&s(*]^G ob_VGЯݲ15@H2. |.tX>gN(sϽÎC>]X~ fK' sːx*QH)gYDذ];GXT:=ޣٝ@<~d/l<};ɤ7$GI tC؆4<ِZ;eD%*̭fr03" 7@ ~ J+J~ʮ3#eM\%{w*CnArj"6fircxpִߓHv";bpC]:kݞijŒ+9c'rlbO-LI*)${%:.k\eU5~2g ~c/4CgDjqtMVR#}Qeu4+I223>lѢ?pEXsp.K%M,ٙy E@†vqHUDYksވoAK J.mA@O0[1u | d -AGMW1ښBaf\ceD ||áEEyҔ ~ur7xȬQUb&w[.l&O :D"2~? xZ<&Y''`k^ "5 "&\~KҔFp* wUQm2l0xF(Of&*ahYiRe}тrw|prYP簨qOlo'2_ yn4 S{ϓ FN)pbmӬ8[4ũ*R[QjXUAq80G$ (*O)A2h34Vr8=$|'#Pq "biltUaKKŚ$#XY_I5 [ԑNgӻ6O!QuL JD XD6eI'r U p.4ҞTS$!}7{:0qXJMlӓe^;W3Z~Fk4*spk5ԗ7 4e^DMb NbA$ZC` %g§,8:n~aIcݚx+ިNfUS-˱*?ٺ^a"ZVO,I^ /2ſIL?x,J^=ٷsڐJWD`?[luVoi**/xKeEisG솆R\< Ҏ;&<9q4h|/ endstream endobj 315 0 obj << /Length 2550 /Filter /FlateDecode >> stream xko8{6P+ Ȇ,EJ-Զzf8-'Joq_h+rfH ɲM?0Ǚ0⧞i*{a+|MK?a/j.OTf85(iBU,JN\nlQ=5dYzlj[ϛ 7P5ԉx L*炙a݇VfGLpGDXfz>[#gDO!\Ni *ܴ9(PLA  ydCaC´ " fJL@#(P0Gdim&$U);y#-^ptN4rۺlM6 Vp]ʸ>!l{f=Kq,vPKa\KU=l*K(ij4<'BPLM ٯ`CGN\.Q 4c*\vMӲU.e4MCB!hn 2 nGr^m}JG0v,CM4rٗũ"TO; oςeYcoѝ$6ZzUjÕ7Nb깋(k ;h4oi0^ oی5?>;}RiDYv 8tw?‰p<w4\%{ՇkY_q<V^]{bx<T*8׹TH70Aх J(M ` Zom.ns9`nW3^ +_!DO`j> " O qSRh uUR5iFIS7H@p̀dGLulV7<êN&r0RZMbq!2s5:\ 7Næk[w::rBc$7*ԱYoNtYZ"+BŚ} mW͂Pmdc.XUn!T +݂5!{O~T_*Q>CRt0ޗ낾Tf@ QJ:lFUxf WRew/],73Ԇm…TPx a&į`öN䆣8i{{^àESkք}5 `5 OgƵA4 `̌2۱5Lq|G"\'W"u&?|m7ڪt'<5LIgaFc` ડ0]q˪FЮڗ7Qc^i^+j%.Y~t\JV!ii[+U/~]`vN0NO?$ dKD MXI6ˑG0eQg 6JMdg~a%kַ^ӱ{<ڣvQ֌sv5)Vd(!׵   3BszhW~OUmQoh 22/XT endstream endobj 321 0 obj << /Length 2745 /Filter /FlateDecode >> stream xڵYYoF~ϯV"s-1N%qG"&[aS0꫺ί9jkR[oTIoo3Ř W-T8g-˰hl=ME0~|qY{&eqe@Y{o]TjͮC}b7?F: wV[ v2uڴ?h"Jyhv;ƆhYwCgk5a퓎$I)g99'CHN}FvK(wACwȒ7?[>eIf Ga+֧V h\=w3 Ű5nr;JIA~w,^(`cK ELz%"~xzxY-%UUANh8q$]4p{Tp/&-!^m9k_2Y"Ka`. QuLsJ➅!5Hk4I;@O"5/~eyPkE a^;s`APvQV81Z>%\$-JZ¡Z ZJO"K}%2 VEd(Mի[E7y nN)NU"XN{Ā4:I-ug.1L 1)hjDPJQS4e,Q2/pIXqYHiƅ 17IqLb G@ZTE(˳ F_u ܴ_ϘwYE DEJ*PLX 3rQaN8'qX02%f&#}_pmE8_ly| Ihy/ՠninV:H,\0LKq!$ Lmᱴ!!F@SFQ)HXQX"0Y*ZE{d2N7,]FL2jQVyLY@esq`|nBogkFYJzSKWNaNBLS)^)z]JҢtMbʼn A:Jry3-4: Wgݾo sBFjQvէ:t7-#j-Kq,x3/dh_mєzlZF9 S5}O7'l?< 8R&gm6luC( D?(:vS- JS,tb,BF|'2#!šW tݰVC-L"$u^& h*c ި'r)3EERQ|Om%pt8w%6j=AG`z<^0z]t:O59u2l Y'lOp`@$åǐbQ 2FpZ$I8 \R&?M ~{#4fσp_ 6!q9WC0sẽ]w6fΧc, ̮&s4RFYUɓ<ehͩh2aV PٗځT?pbH>3P'^0 &;YF op%@ruЛs #Z'EtYlO>b]GtP3A(ݟ_M3ôsx uS> stream xڝˎX YCC$9RVVE.N`p=39I|dsA]]]*n|soM,~{co(buxU&KvQnRoZd5f(&)ǛJyv#&L#avطdwdVũݗVmL#6M@w lBJr$qxk\oЉ1\4VL[\{^%7*8'%ǓL#VU3ј8D wC6Ge8 VLX}ջq7ѡ΅\wt}6on&7_N'ްo6mS Z8Ab6Yn`%"/ PL58NU|,mB,L|ŕCzUqvk|p_.|0j%|dǹ@3OK>W{Ç|ztx9(wz!mtvpK] +؜g`hAtJ[QAQb\4p-x!$9jEEv>5Źy\wZ;>C~tG#Z9RjsSt't\ `ÞbI4&8ﻟVU'8071VE@q-h'W*HFKҖ+]:8FVUŻ)|x+#`fxo@@Ϩ"jhKq_!2;6 qۋ,f#Dl珎 m=I1ר.5TZvs|_cz~zWIDۣK;}m4)ggA/;+)R 8򀐁һl9W@7:!Zu$zG߅I!"UҨ";W _ģ7H*Us&뜎!홌kNcIbd HN#@raaƘC7—2ztx8TTuT7"m3 J43"b!!"v0 i]_!~zlwB6TmoQ5+,ɖC zLƪP]7`xn1GWB}@EVA*={"~Omd jKzt=9]HgT]im c/ 1i=zrvφp3D9#z:#E"1=ή=gp 쵋LT\\qaGB*辒ZCLWT7>LG({aCǼ\OM @7T {Rj7@wb誯tGqw !E)iAvdQS'߻bj}r0:f΁ab#u p#i+H{8R]EaQnEzF޴Ry+)^Tyz@,>gUjriG,y%QBȕ6r,Ѣ$y5/ni# ;^CéZF{*.eF怣r#觧yFn1FfZQGVEvMn~*QV/!u#'K6q~ac\y 8j`0=@Q3P݀ςQdr-48!8UW,D\utSTհo}hl뚝훩WaO>:xNt'Q~ mLcwQG&/D)C]DI/l v(u("aB?Lch1"(Sq@1q} vsB+|ӡW;4狄e!i+'b B+(dACtcJ>}LɹL lBP !>+j>W\+=  }'{. bWelulԔ/c)N00-hLJpdpf-vkCUZ4o{es!o!ɌOE I\8f&lkע\23a|Հr!NO@ vPFb˯Zl)'2@Ƴ˚S l 6\݆1b 7ty{< yЯU)W{Wp=@Aj? KF~;uriɨDzL.*\^VJȼx ^woF ɰfZ{ʔa~/*bķ3fS;~YbldfZŕE&YbDw&~2@.p~s)-:HEψ߱o0$qNJ uZ5p*rEWrJ! }XhT^l$I} n{m5N ɧ y%l̽yޒaolIv&X3'd%0KW ȶͯʧ>+ Zw)_*;5p+0=I:K5Qbӻo#Ρ endstream endobj 335 0 obj << /Length 2052 /Filter /FlateDecode >> stream xڵYmsܶ_qo*R|93Ԫ܎&nf8;b̷e%GRd `/ g~ />,lϾ}vqA? zEQ[/mxdJ/.TUTw<+꣗ۿuj.//^)-jhC,c AEnAR5mE7HV^AbD/íSK7ΞknFSyjzS)QҌ~A2}Y:h@]U\F}aug$Q,pJ( bcNV;3*3(JuM!:uK?ls8p[dܚs D,6hemayv9:T0ؿg9)I ao%MF>{dǤY8HE7#kdy~Oı*6ð6=J8)V84\QPhg?琧tmXS8sνgzm)R0B[b`Yy{ \ WlCk]ֵXx@s+?WGt}8XCrR'}5Fya~'^0! Ϻ6F3uexs\y`DAnښs߹@Ͼ5]Qj| x.`_x ?GV˞-81;j칻`tv*R<={ 5A4:7=+EVWy[XzA^B m4P+*iIq9NBD/v y`aM Dػkt>]94(/S֤}^D^5/g#JŢbI_B's`tmщ㣓tj)d+r˱*˞]$|`Ӟȅ҃*ޡX֧;(Kt,0frL5ЗI&3zUBvp3Nxpo ^`I%} ?5 ŋ:gxn*$Lۘfkp Ix%\8=TmYS(Zr$?;P:ޏb\[cMy@:@ ߝu4(o`W׳x~K')硛#2(؟7p? |/bi}i+0=<04bYԩȘ1.6o!m%bc'O*^O礲bijNϟO{^Q> stream xڽYYoF~ϯK)R24UԉU!4wi(;^#i|s}3qrw/\yubvZj֑u9ʳN3|Yк=CEǶnɢcs}(" Dž+&OpNXiG3[e!6mK P$"RVAU X)3,FM8Ņbކro "xԭ"8ҌU~iǞ/HَD*ulo)^d2myQ&.J 8!ro>9^uQ&fHlq1B'҉B:,?UBEb3}9;f 9$_i>@$uX.V9m;+bփۡFn  J.CR'Y=/ iw{dGs,J&)0x7 sp2P7nÈ6,"fx1W^B3:pY"&}l$cĶ>ؚܡȏ%v.ߛ溑Fx#"ām ~MdAq -Muy`@}~@3Ǚ-Q&tJE 2KʗMMLyFz>wHg~:*1^3?ꩺ3=V'dBr(aF59@.xhVX<ԸrW؜O܊v6Aya,A5u5U+>TBϹ2NxYyN/^7QN`A#޹]p`tNEL@MZ ׇ:3,Kʐ6,L )g8"eU q=a(lbQdJHtƋ2t( !iCc9[v٦%& FMCR\),pՂ=MJ{`r<̻ -kllI:R^ux\!o?ЇXzTB b_Tnm;x0:n|U7(M endstream endobj 345 0 obj << /Length 1861 /Filter /FlateDecode >> stream xڵYr6}WSbmI't8S;3m]?@"(bB4ZV\p)'q73G~vt;=xu8x=u09R z8yέf_H"cU 9ΩLo"UuE]srquvx{`:\xEQ)iU?RW(kZlZ?̊<9A#S!چ *VR ִmi!IzTO!dV!^@ӟ[(.@h4n"*.*nO %B :no3|okˏ882 $ Lb`t5ٴEcah%9m`Mj> stream xڽY[o6~[Ԓ%+-ki$K4Elu Ia}G"DɒbERs>Sox/<هbrOs=1YgyOͱ`4d\<{Xe;56"/HG\*esptq^AR)}R<8 r%/Rh|r/N'fmꁫxlrS}zypט<(4RB o,\*&x.Bk WO~[6O ?l,<7=,LD~y"E :X>d1(=RE†}@\=/1H #r_űSt{ߓS}܍|'K_ [c;Կ5h$ ejYK^jm0;X+brk-쁉 ›%|[<|o4X%.쩔g&]ƅfK#Z}%+ĕBUmW,)SSA[pkτ(7s}uU'h^#dmBw7oCߡ*jwFY'+E:6TvW*%'釯p$.Ĺr0Rnzmu4I{0ub 7f/$+BCBQ}3v zʢiVy̒ n"7O}`X%aa+y.&ok N(Øg \Z.|IR;}}1A'dBҲݺז?A-uVv$W\ɖwY`}Xcb!Gn0zPKD:P/mE\.hTH*$b`,`:R{Uщ's03~u:k~~K endstream endobj 353 0 obj << /Length 1785 /Filter /FlateDecode >> stream xXmo6_}(j#emM 0 + ڢ#"zq%:iPH%ё݇׻Cۑ?zKd1 g( H< FI<' +ך7/+QӉ?vXMژﻫ+SXW(q_0/A!Tɧ_/";/̌`*͍=9[yQՏ,J}{?YW 7"秦P *C6.)lD풋-E#*nYLX0C ,пǼ؊Z@o Tr%D.#\*i9'QlK3.q{\>Tb OMo(uN͊F4du񕁅eYYLh%/mMͲB)9 YTb\M#2F]BE(fPNIy1,a1#M<( "=AXiWPWkހ"B)/H8K PKܖ/'a2iʏ A+LCJJ!5DRHyx ]38ȢTr('V{qn֔¬NXX!J#Ѫi Aamj7LY5Xf8Tn~yڮ\s&ʺwpA⹱%K"ɮڪc|ҾIHpGΠRsZ۝og,Dxty(8hW h!r\wEle783֕T3*WS,n+*ISTݘ,4Q7lˉX"yjG/ KԖSIc;ŖϦCj9rD=ތtxehfbofr?(,gӷ1%%۟LO$ ȡϐWy5 CS&JcmvIe[^BTCVNGѴW0;b"p&4?}C9?y$g"t6e'Qya8/~;z&>t˷Ħ uِV>SЩ[:}BfG?@zn(+n kt9w}ԩh}HP"?m"+ai~bx2 2uy#GZ?EΦwp5Cu yyp%+p+U-YЗ'^[RhtӬUHf達 C8Ag51FΜg: endstream endobj 357 0 obj << /Length 1893 /Filter /FlateDecode >> stream xڽXYo6~ϯؗkX4N]IE ""D@|Pj7z;I6JZOb4D AFc):=6l1m\%xcðF"]E눇FwhoaiXZDf-h3iU:؃ #A./"zbks} hQV(MA_I;8(Jk-V|%czbSSlfRwtw5(d7rgSu^0% tM"4Cbpf i;&)Ec΅#nbRJ544hM>4pcĸ8Ȩ՛FS4IM NAFi5z6zz3M` x $"RZSQ4F9L) ЗLD Kq}-eGEȅhqN#}\Q[hDsvDVm[ܰt[c*xm{m[vKae*܌,de;~oP!qP[\H[Kf`@|4ㄹ0{1M*=0E.v|^hj`-SA8rt|{qpQWKHkgvR4]O0y+[Aۅڰ@99!qLP穹> stream xڵYn8}We]b;v6n.,hV~RPdmBrf2h;rF=sճ{ěVh;Vhz|ak珸/<ҙgy{E㬽+VT:|;ϳоءd[ o=,~3ZѾoPBY30vS/ud/~TzYJp|A)wz8zH;˟#z'&p'x'< mB291On7Q:u=qSDVOBg. Qs؎iÐU*BoІ$N4+bǝ K,wG 31b8S3/(j~6#!#:oNyd~ _Ӱ$/G([xWvA&X `$LP#Ȅ79+98dq9HA)\^>b&cspC^|1o 4j#%_0%*> I6y>2 ^:hKG.(zhXC m1EBihkb}mDЅ7m ?>pt Mva&Jsd$-ZSԙ7BwmwkBJʕ}-9vO&LFSk!$ h B|^%!|ba`H#k.[5_IPi&uuIogy\j[c"fL%L8K Ju-/F6B~ `, W@|gFKH37 N0ðEU OBoƖ%(O cm:AHFun_|X-l沁C94 ֤?1-K| wb(rӰ4 }Omo.,^{5"+ V܌53JXO`4&e>|B!;齪yj ·`{sPy*QTWYP͹SQJgG_JpqC=L׈S0I5^\y2ě4H' uEa598ђ!DTvG1W${}UAxp28o_W"Fe@3r'Wg㷘D+{>og]:Rdt'd:< U R>^R5PJSu {p唛/{,HbwN8O+e|NS\w`n0a+˂qvw` U_.ѿv,r*53pcOx:̩G#(#L+B'9wg[ endstream endobj 365 0 obj << /Length 1430 /Filter /FlateDecode >> stream xX[o6~ gU]"9ΰllh=`CWD$)7CZ$R$wn9T4LO"|>]>zr'q.,,ד<4̳pe9y5/OӬ4f"kD,ϝ'ay_ ?KmxM)%QEY%b1%yF JJ8!MQ@zn\t,OJ]E͌ @d78qSAoa - = 6)}ݣ"\I@E]dC/fYy.&^1nf^XʛL+77x%v ._kD9sMgh1J3:CI.0UdeQ2kq / ,axM#FDKH"ߙJy<_D`e{RQNa0̂["IAXKh݆ 5 [j @㚒VT5q|Faֆ$*G"|0$`?h?1?N\mL)2b`R⟭~Ƞ%J+NiC0Wӌ8غiE7s7~ee77^Ԅ@wY=-#u(]ݙ/Ϟzr!#`,2{<@;8RZ1AF"YG~UkQX Əu)Wy錟C$&RU,?Ip|B摷asǃ8~DI{$ҟc.qqTEs*sp)ja{] 4KGU9AfPeڧx-ؚ'T<A޺vL?syB0hESmF-^A.z_ ~ĩP3΢))QcZـK٭DQėGIDU1FHZm堅%il!iB M#hH)ߜ$`RS69z`D lr%[ρCޜ*w9,jk~T*YRYzeViDYѠ|i}J&pqq> |OdXWTJ!#,XǤ=DEjr>VbKRf`z]H}z{<%rL}ې9c$ONt> stream x]sH=BoAUr9wk1*A c_j?yŶ8-׳"%qe]f_K;Uv|B޶"1Xx,]xmVe)^j7JO]ZEˮ5}/o hZ_^ e~nb ^Hc!b\DCl .Yڲif:'77DDuIDNQvJla쪮VL[o;U k(cV}Q5^@U! kПrd8~\D݀^.Q5!puDt)R;PRj{ ;]NFthmCr4dו| 0NiZj[cpg1<]AP-7I), !'>?h;QAj1^CZ`rc_M#)1BXL;f@4F%&N붻cqI>!@ 6X}j[ho9t4LGw˪"x(^//(M`j&1:#v(S;\m`Y|KijMa;Qe}OVm+|1 de-z׾ؼrR%8tA7<S0sW $Ȏu\3nD-s^;A,ib+PQ2` bgp'npfy_WC*kT+E&Ql +XBX➍#!!MʲִcK/BQOMbLhO4U|tjHHal(TX3S r1ţa15tSg/l)pfΧкdb1?׸_J6C Aѐ]c4i)LNsOU Ljm6X@< `92DK??ٯ /\`~aaJ rӃj+yɬC%$h]V_ރ7ܵ1Ac| 5`/3sq@ x,iY25ѹJIbKXUm a1o;PWje ͡oV8/MysdE1;Tr=^5+M%ԄɊ&̳y  N ڴ =:- Ǿ!F(A{H9Pp9iv8f|rpi/OpcsFS(mgOLKe8>ZͲUfY6IdGa}niU).h8Ff-ŕᆛݫNrnB|K ;X6Zme>ZY# ٠홆CKXO5m@|ޠ}5kӓ@N[mMjS"FsC.ԧ# Ƞ:Y.UZiSFSXhzӉdIHI ؙ>hЏpyuI&=NDT C, {@@ړpn%n+='ZĎ_;h`)2;P(wn.MS5ODÜI-Sٿ&zAo呡7yse+:!`/<鞀ͥ]U6ȶ;wy2fX5pݰߛz"a6e@f݁G=shi,Lߝ؅vcY k'v,OV2~c]h43yRndg`9@͚?,VB2Aw&RP`%;y'{ ؐ-f*zz~T>,|k*2zm 3/Mttt濻h endstream endobj 375 0 obj << /Length 1535 /Filter /FlateDecode >> stream xXnF}W@XFED `'NNmX+iʥ|iW^DNOZ3gΜc-zQO|NJPzu!G5(]">5خ8{+T&{9uEk2/ث7j屽* 5I䫬HHx~]wĴO\fhaٮ pJyFZy]ȑ$ڃmvvS9,Y x xX"T ̃CЊi 0&q]T(sqט4_]7jg5?/޽WCٛqkK00%ۀ]f{`+h%&ŵ:47\5: j/> RP 0A x)kZ~ˍ$di} SXцܹ%mxߞHAXxB^u6ibm6zbŇ1S_xpTq&fH)KRHZM*ѼܪjųެUŵXgR$';@]3yn4>$b\,Y+$ZrQA@LE$lY@YgO zp=o%QU%W8GF{{KBK%V#|T"q:1Ԗ@Zs|Ұ܂jyAڏ&=9 N"~%XeC? rϣX*$%AH.2<`..;|@tG:-=o /i1!ݏ)}CـPp&V @O>4 `97o_ZnLL/ L/>Cn$XqYa@ )mU"QV %eh0B!81x/<:!U@aօK 1 5b׉A'rQ߸bFn$SHΨn vm? cEՆdhVFG}-Z޽ΈP6Kކ)tտ|D|Fn(3w m@ܴ]Mމ{(+ՌEu/zsg<4'xz O&$7cG<'6p7FNQ4|v0l}HSh2M?CnR˚ڦ4d%VH1p1$> stream xڝXmo6_aj,JlmK Z4! Zmz^fx,>"xs'[R%3=ZoGg:g s u0MfMoά-MER(2,E$ULbZp\6X%4~< hm4O$bn$ zyfU&;q'E9]9dy{mҳ=&sFޜvQ83{w\{rFbzET/~Vegwz߬vbs'``O$}pUIoR/cC:~AIRz^TJ%<'4ΤѴ~?e>ݯL'1]#.Jk)"L^#pڇz /'NoAA0f:Aw23kTF(ҭ6HOO3[@WX 6"ߤ1qrL;3v:cHe >yFHٙĉ;ZD9(?76H\:5XEaEɏ5k.:7_*/' ]ݬ'Kwmd 6bq &!)f3sz3 Md~"Qa\e?$M6OJc+|[j??{lDצnܔƮ4+!|u:9[lΩj*q=-S;e j1x"iqdh xCGNQT9R]SZhj ,Raj6%]fxdVnBfV% vWaXsZى"y飶Va@#@K:=>?ޒubdy8iՊguäSиkP'r\dƊҘ$KoI7%޽8Ҡ rm ԔՀrҋCpqu/˓Yzh .i;?!\TeBIJٮ8u>uq7TȫgwCC`3>$ {h6 5 o{P_{PGmu2yZ.gmK:%[%џJ\3#FKM1-S><(6]}=R^w /kˢ,.L&\q=j'4h-k b`IGbaZl ű~"UL)M˴I8:mV-BhmG̃.=sja&'ڛЭ w>?GgOX-]]_I!x=͑( 4M\ 5|,DBSBɫ?k8!PWiqy аv6ͯ)IR|D->x42 ؘ/[dd;5%[`O&Kr|:ki<,RKJث%44ZFSuqد;ӪrOO29'20P`ؖ) 8(~] _!  c%84\BdXJ) f͹sEsA&XAPR;K#-&(#nVUzuYJ\,Dzkud. endstream endobj 383 0 obj << /Length 3187 /Filter /FlateDecode >> stream xڽZYܶ~_1oVihCҕJjHQR%*ɃraH J<ק/p8#J_vp4@mh7_JMUTś2 wU)2Ri6GqqۿxE܄)"{Է4M{&eu,xkXܑGo"P;zQ+Y8Lqp85Yi&Yp2,ڙ=./l8Ln9N!.UzKeKZe`,>r-4z>PtN0gmD*fO1vT igS7OhgKD;U˽}sxgvMix::fcoP?b5'4Ay욹UE<ۋoyaVVm$a+/? ?U`/k{ify7D$]`:2{Pgըa&Ql*DnƆ'_|:eg:|{l9)^,p|E&c hږ[ȵ cHs3~o(q1Q5 B6 tMz]KsbOMee, r&߲QFS,b:iC¤~W0?7<Y~D8I4[G8 >.E028CS!ho˞Ȋ~4;O/=BTr,""oW#:Fʹ4e a4ERѽŒj[&kØϋ'ݰD3CiB~:pìFqAF^`OQ@{HOrjYp'.t$ToH+:8z$pe< i#pe'SY2om6v7^Ip41?C^ aX2gzEQìW"JE(+(j#ْnfefٗ$e8emaS N('OC@Aͮh|Gʩa"Ń)Awnρ>ZKVg)xڜ݀ ʿןԑD\I'_񉛬X 7N=qih/y0w&,6a+ϰSNET霽As=O)a"&ry>;,gJ?4L'-NQUHjk&mKI qdqjdhz :Đ%1i~Fd8Dds:Q \H C*"E2DhVZȠ[nB7Mhbyș,34e{40#<$#YOrN*1(^]ox tr}s>Hq[A)D ׶ƻŅHFÀGi8:|b[1IĬdJv'3Z WoX>9iEIWtf?Aǎ +]\q~M_ii_n%-wR=7-|;f 3)^:;&@!1!ǡ0oq4NZ\籃fZB12U*lËw z*6R CHER!/;SOy0 0/?r ;tv(/ JE:CilrqZ>UbsN'/V`{b퇩?f"$/$>+xd">f"D嬈_)7id5Fzҧ8ҫVsuA~Ţpϛ^̴W<9t(9+'Y¬l%P"co I.gIE5֞i}Ws(ƒz"~,w|V_=kiwL}V aK~;bq.ϴfI0XT۩#[W9p%`^x>7.@ꘔ `p j^x:̗".B Wp#%JlbL<儫LNJLKpP&R_$[\Ma*,K28CHR2 endstream endobj 387 0 obj << /Length 3115 /Filter /FlateDecode >> stream xَ]_/9$-[v"A 9=dLCU3g}J-me0l; XGS4UO ƪ,up41JwUðK <#%ZBߺ3oH9A)&:pnl{]Vp* )4L HL;1?tUG|o6\#p\):gcUG8dQ$ʂr Ú6_!Dsf6uå8jh4HP^!Ouc{p@Ԝ "!dJwQ9\$I5SOUHͯ(gYL +?I]!, 43/ s{0'odWҠȓ/bK!Ub-, /4C@Fی=׊SKn~q)yDcj2yv\ 79QzzogaȻ򑧑"b҈5Dh2nSUU=^'_@'I)̦up4]M&s~FBp}'De}1Cz?< &6Ru?MUv޹Ը;/X$.sebR9ה8MXp0kIje<')cӘqum`d,_@ЂγA!hD9'k{ sϦ_Z:D[ݓ3*zmBACv qJldrAEFsyǃY&~A>iQGw5UV-K B-N'"Dm7W1hb Qzýi9 SG w ȊuC +F>7N4^j2DZ4zN OXw4b`|FU<$k CA˕4V@=juL.LbI @ L;.%GsJF zMTsEQ20"7(^VN6^@F줶B5Gx@!0<_rʖC?[ϱ|kq|. yǰAH)P6 \<OiZEmPMZ]d۸OxIZ9[4+[7-}θ HI0ܙS[ {XTmLLt!Bn8W6> AqԷ[$A X%BS,d4q1yQåuU2C+#u!|\DkX݃at> stream xYQoF ~$ɻ"(V`yHS! ؝c~>*nXr&[$ȏyG)jť_(}]{u.A&8cVvd 9q5 uApD\.JrOx1`ӌ'78JɎXsd 8HǞǚ]upܶ؁̸/z t,ǡjQ}iGX^eZxB~v۔]5cE/E%DJU\ ٣BxaϗABuxMwoOŗUzlZs~nb^"T<,}*rm0]́ ?,?4gI'p</j ۶]gmXwHvxˮVW~e;G4Yf}ABƂ17͟˳69ҒĞ?s{x ^pD^c-i ZYbvyɎep}] eW@~:JЦ+=آ2--Ʊ)#TQyeHY:\˅_,Ӌf꯿\Ͷ<``? l(7 `kuo1/%;/yǮhW5:t[nu:mvBhH{{MGzvt 4 y} XJ K~@s-3k!1EceS(Xe.2&*)Qnge$*Rz1sEEQv+˒Wcv,eP\$v;3O8y1}/?>|NtLݡaMQVy~7:<TUIKvOcQ;p,XWsalB Apm=em'#D4wOEFFt'Y0)$y6;w<4? endstream endobj 392 0 obj << /Length 2313 /Filter /FlateDecode >> stream xXKoϯK2:x=k1 vs`1ztHi>寧գqY8{IǪp7&VQuzx\ U:jP ?^^% Q%%^cQ׭t"0R ?Mbos_'e5ĨV5BӬNN?Co  NM wD]+;\1PTqWo؀V!XNn ݞh"XRky\Ƨv4AYxf2ڑ00i ז=6Άc_."Ϟ=B}q¾%*Bg4v=ĝk.l 4-ms SЖOQa8Ǚ7l?{c+Gx*NjٹВ~5H= F;AKs4ݩ7bq7@U P+K {g0|њQ:Xh,!&E KUaPMKz!Kj(%ute/ɍ =PXq=XتRTKNjbXc647ڎ;_Q AEh,MH:_< ^> /vzξqw4  ȃΌ}4N,+;vVz \/82 Z8Lc0|h(=A`MCoaZp@Ju uARZ"ImmPwϫe w' 0}&gqx>l$d+3O˪5J)*g ",0⽿+琭a1ZgE[@`<У6O^~-sn8k/Yo*6$1X\%4Tw.#ÇԳwO8<^7CoS*3 ׯ怩|GN0( [&}'1? %w [ǂD?.ЉO/r1> AYOf=1T endstream endobj 408 0 obj << /Length 2520 /Filter /FlateDecode >> stream xڍKL_N*fx&{Yf̌I*l/6 .o*+~r[juRct66zsso:NDN۶C݃1J;_43M&Y"ZtFa1 3<meюh+=۶qti.Mj/+Ih8A[koIC#RBTT4}(\М~KG}MTuVu7=2ycj;d CjϺ] @4I\Ф'@/.қbn$M%R󧤲uHFT;`1ZvMMaQ* PtBG푠ޢM|F^6w&OG)0 L׉ /I&Gpl"]({6\CHW=&`,F/{5}UnxGB^\(h2 Uq ,Kb_<9C"[P{>ALFcD?خi\ӿ&)/tIay&tEk aE iD.EGoI}b0H?_Ӱx@=N`q,] TT vz; HV+U&KEgy Ձphh52OiQ(R(a*;`T#$dscbI<4/ MѸ0`vY5ے ɹHym(7L»` ڪfLv פآl8zk!rF[G>}6ˋ)zYmnrRG}GR ub 5qk]Ll&DkY ΰ GTеkϴcxGJ2~צāXQ'LdB12l gTcL*XՇ}*&Fl[K.mr =)wf-e ruSA{`oMf49Rb׈ WH] ..ଠuN u؃ɋҾPg*l)EUo:3>v0*\KFNw8Ҿ> ߕWdqr[KWdD]A6|JsFjZTE(jXmy蘪L'ivhdcA]aH™@e{P~ʶ;SZ%6qfX+$~Y]C}%W%Xk[.b j˰Bdq8R9g{Z |j>z +p_J^J=4QvX8FJXGn[$ F|O8<ٜ'pFhΣ9 Ց6 .>_P Z.Rpvi0Ù1l?\I?W:/>-Ç1'@JQ$ltWNY #?Ẃs=ӢW]gnr7EKXhhZ~ W/=s9=+YpzI-\F:hUK%L.9)unl.~QO_RE%DԿm\Yۡ_̯W%P*[M:#V\32~4u2.WڈWsF{g)=,'m@Sq5!2&ܶ?P3au望G/YWl츱XK$ XlDV׍*7i[ q4vOl{ӵM=2ɖb u؞vϣ7$"u}- 8M)LSx\QdZ2[Rt$:ppHFx7;~sIlCG?vOCnX=GpLC!^psRN*pMG2/hL@7,O*CԌ!&)\yzWXR_%o_YU(C^feF,Ut -\v*x׿ $UҔYn֟9۪Vhmy !​yч_׼ċjg~xmkw[Q0jd#QoXcY.N\1nG> stream xڍYKs8Qx$Rl읮902c"K^=ғ}e!vϖg'oW^p湝ȍY , zHeqé䱮<;=+=e%O4V+p.zp6 +b U)zzTgx }箎SD aЛ4p]FNvNG#!AAۉ³ !:%ݿw~\^4ApJ0'ϙ>q\?>bS/;Bg. NkN-ɘ9dpWD1u6v(OVFYu\ՅJ/NLr=?Vda)}c@䲥JzCS=OpJ"QB |AtIƒ&y-/WI]hI =M|e3u.E4Meۭ1kR/Iv`:;eVO,Na'nʮwy`97:M8VsejR|d]ՙ5F-gB y6 ZB1qTgLZboK,mS>x9g07pksYw̚^H`3pmVseF&/֦ 9f,7>x 3@hE@2nJ] bA Bynߞ Έs, 3wj9;ٜ㻉Gl Sh') €r.=5h#&Fd[w`]Q"|zc(x)PlPB1 z7*%)P!i|5*km+IRqV"1r$ |UwK[@ Hځ/604VSH01!Y*QeE48VWp*SVilH$]ٜ5<.={8MxP}+`H"HfʽC6Sk)1I$K\>) A] L}b*%ܤsԛy7HxoEzbF=/8 q?>gh*tV2MKiLc7QvӁ]j.?PHIJpuj|*5.ؾ]b#I#Ä0muhО'=ϗY?hW"qϔ"o{b+E^W?493_l$R$#%<{2i5,Tj,@c~IJUcVInq^X0Ge47%68n|0$8`Uf)BJisLuCtAs HޢhIJ7@nTkE Jz}|uAv,AsT;kuE.䉁x{S$,S;{ m,Gd8C,VjKM3sNzb^]w{h%n;TcRv[A_`oq7JD_ .} qNwd𽎄v);"* 0p"Y`IG߳)QNYD̓wp ( C?}9ǴB[j-˴!Y1&K4,Uygs`|;lWo EGc>$ZijW ;QQRLm-MXABT]n9(n80 )pghK0N/A Ѓm"˚wB `Wjj~^87fä[3ȋE&=bY4q448Fпm/DJ ͸A6lԑY_(ɭ>avÃFwdvíֻ>P`. 3Q(ic?mOa endstream endobj 419 0 obj << /Length 559 /Filter /FlateDecode >> stream x}RMs0W<}ؖ̉hLs؊i,gd8בB2 IvRT#,w,E m(ˈ Tߛ myzC8ߐ(Yobk톷Q_Qp*cbE\o1eIY 큮1us8û2>Vbj]rtݠ"ƺz؅gxW+v`I9Ixb&H@{h[}Bsgs/`M)TXB.T|U%0.PDq)*2T $>O*n'˽ډӌPɅ "W]SX{R^ /[S_t|uc3\vS&IS/\N8Ssj0MJף5SG\*#Kdx]|7Sa5hכj/qc-p #J@]sj?{=4HxWKߍdtoևt:&Ǽnlɡ ϑTK",o=UIQȜd3O]|,~ endstream endobj 389 0 obj << /Type /ObjStm /N 100 /First 882 /Length 2026 /Filter /FlateDecode >> stream xXs۸~_! ~x܍/i8H@˴9KtE[ &%!{@\,XJ2c.%Zᩙ46LyeZI<3#J<3VY2SY#N2HN0NxS`I!3IIZ΄jU/&F Xd X -C/ ,H˔$ D&&*iB XSbR0-dXSL@Ex)@݈ؔ)0C 3s  4O% chW5 Jex8sy_8=1xcTKgAPdIS8 MWa, Cc` Gqf()bo(R5iG:4۱"a40p$l%L3DfNkLcKt8p,aP9d)'u 0dKtHw4c!y @ he`} 4 %l_8.(LV^Ϭ+>,t[E5'ŏأ^[@InjZ!חM} [Z#sy(bj`opyo,^`Uj@7X ,Ym8%,Yxi31A,YgáȒ5;)J.}H;ԓc$aG8].hKu&śfuYm\_ VɲFYp!s:=\$b盋5T/-NON z,z}(ljV̧%=S­di@Hz ϚfvSi&jVov1__jQ-;HsA,q~)K}Y~KD)[bd{KNtΊO i|18~ց{/Y*xX%2e=0lM*J' Kod樬dQq3e5r aoꞞޤ7v9Ryy9[> yBqt#@u*frdS%r,3^QdˇS՝%k<4KVJ)' vO=c!?H#8(ںn_w/Bw,YS撚 5v._Dڤ*jnbSmBaDڝ餯wUqUrwnw/S]"ڨq"h,mlxvăWERԮRR-vߵqzLSFGC;>D_p6lH2CP=K(g(ͺLL}|{Wi HTQ0=lbI&S2IE.(Wqzw83ަnUf>c`3{T[E}lMك{ F\G:B#e9fhQ;XD'ܤnoĕ=[;tAy7͞>0MaK[;YGj6@W>u3F w%7seE@_l5dܰDYDiˣ=."? r>086PeҼq̣GiԾg./3=0.G{%)>^`x]kҾYD|~pD4'N{hd<vh|êa7)u=o) 6j~/\Gf#U|obcĜz}O#mSk泫rgj_sF:}z`ٚc~s(2Jy_R0ޤ [gʘGR5W4t jOj}[nO?V+ ۆ1B endstream endobj 569 0 obj << /Length1 2428 /Length2 20523 /Length3 0 /Length 21923 /Filter /FlateDecode >> stream xڌT\ =twww754 0tHtw twwI^|}kݻX {4-A@3; @RYB ƁHMeZ 9 e! 4s{I* vN;;? W%@r%Aޮ6ny@gA`e t0s(_3Z94A@7 A'd,bfZ3֝gWC}Eh9E>1ou%*~?]8`Jigt<[Ȓ"Y8 \L6hJ}S)8Mff4;`==ah~u\Nn)d_,\{ m_3=+◝؆|h oQ,0(Qmۜ9 |+ّJ$|2vtlԲ‚~m{ze*h2ׇLZp+2I#ZdA&lщ=9~#Nz"dY?WonvH;>E/?n 'NmShbwDe8n[sBKۍ[S&nBCa1MU9շeұC=Ӊ),݅ezb+Gѓ iw|\ #;h]R9fOȻ-SU%&̮+q m.!{_>!(IBZ 8+ D<(}s#Ltfm]Ӡ=ީt{@BGU<]! ]7 C<;XX"+aOoo?9<B]cf/W$iA֥-4ljyvh9/PY<8AДMHFU`QP3 f˚쟾O2H(`c[ 0FxˢĀDv&g;PJEunr'WZh5h1D<=Xfw;1_=G(IL0Aa$bYȡ .M_6'p%yS&B8X',$e|'axJlʺQ oZͷӷ")E2g22\av*ȫM=f/,!azf_ ݻd!20N!~|^=yaSa7[ se"49+cR2?|ˏ] ™wD%c\ q/ aĒL \ F1j ǣff)dlOA.]m_x JA-=DD&׋_-]6α܏d#%4Ϊ=Jkmă<Y>RKAˁ&q <@fGxK1ðՈi/pNHW [ާ嘕%B:gMQ[Ѩ{7?BD3x)&)rO ŰnKVs{8k s)7yXڎseB To>I[Bu?/nVܓ!z/C˲eмGVx I^tDH6;%! bI|&Xp+g+ \,$2kɅr!e}d8զЬ,gC;N'HӬ4m}~> hM>\(l:/Rrl!OT p_R1?b"*եT$F,[5{ͪx*Mf/ym3,t‘5 ߕIu$CI1+m>[~mb> %kucg<y2=,KGfCqyHfHTWp}f( ܊~o]BB;Ы/vbj~\2/ z_JX8 uq6صsdP@L\R|qT;򤡇)<l${V-GE^k '%);/fWt3Hz>>$xu#9PߘTTUKfglJ)ryE)tBz,YdSrG(rae q7jw)q-$ZZېtdOҊƖԍ_4Xshx]=e 2t"U:^gx\8 nFY:-3CET=Tm f-_Pla߼0QI5Diq{"tSuk%Gˬh .~l 6T$&Ͽn˚l>-8^&ֵ8.g}xo6bÊdENc Tĩk<+y tTx:/g͛dwC 'ͭ)Bg@XpmяK]P(ò k΀2#1EK2u"yL=j*2aY_NOC{hʘN*Z| 6uֽ ҠŇrȔ&m%Q/䉀o) @e~2?-u ϩqy@"*ي Zk HLAᓨul/JT.z>t8q~ n4 Iőq{k9>4 4&@荿(ģ]!o;utTHV4/MMr>T3ˎ42%Y$I&nfZǗ8"5);Jgm^Q2c aVt{s3 '> )Nu4Nem>V-do牏h8FRRulPpO>A/#Ejy .ɡآ[kPe5HkuQ(4^辴@/ ԞD^1M4kh ^E)Txy ;7|徨%Ee@~Vʢ:ҮPB!M7R?kt!6`~ndbgWVC d%TOa1[}{GUJ$rij񹝄p-diĔwSض}|ښ޸ǻN1IIߣL2h1\f㞟݆$һMyn!?AEZg \@̍#g-vQ72>_^H_LQxj=v1#[9 tb (4gvZ3X-|m4blfa)EQ›|% N9*_Ⱥ۟ퟫQNTe.h:mS݊ nS4a|2l>%\ixuiQ62_^|Q獃ع'"7}֓2 ,l 4ZWE(wUmF,Q_Oav?g?/7Vs%#BBIKOsafwf}~Dlyњty]ChHy, aTw$Xw2\ `es=+:70GP>U}<$6[wSǸԮ,h29SX«#EEΈf wדwګ%%lt7=_%dIlUer4{Z;L Hhj5u ph:kQ-'TRMJMX5]HQ q9,>u0k^!6eMA+A.-4Q2PҚg=PtF?^'=kf;lNn8Q⏳Ԫ 2`B ^*3+9橡xV[} *:s *kulE̒'脕K̵chu=T$veP)&uΊ`6I+0Amy F(Xvv?ut`bOۮ<Ƀ۟K,J[y_j}15VYh<ġ!ov2vPlUoq1;`X0=tZqOM++>qhe~Lj`|J.nw~;wf YdB8<ɹWySÑZeY:$h$ѫ_ UCnb2DXzw34(_b%QhS[!ik ~RC=K2]gIoh'CَBgђa|*v{h;C 4M~u uLrVS $dž8${UMUU'k$< ԴMbwW-K Ru34|OC71F-K7(CVCX:w 򅙵tJl9u;w<^2##nV2k`ZW9l' >AcSh~;Sx'k] GX'LL6z>,`DxXbW`Ţj=xDˤ8Kki/O>BvW-#B?37`0E8j+ RS>c1RƸ@ozeTD %t6T( Q:OB4Mp÷m5uB>f ?Ǔ;!zhxdA6A{;6 pjK,`,N.bo]¥yɰn?[@yMU[)qE02LdXn`2{PbDHLyZ@yI?5*ܳANݮơ; ^i6|RUyj*ܽl l{r01W^5wRnY&8wC$)Y>YLD=N1(Ҵp6CXL6]Pf~RNHŇ(g;\o^?wDcPGR>CUu_/o֡ }qJ ]Y<}vdS5 a Uc5Y5jǵ/?ˈgk?+vS dGXLQٗ )pְLZE [oEQ-k41^ŰMbǡ쇈#]Rii#3F n A-DtoE"KeRV /oH a೐>'wL5q@r-dFǎe(_gİSY[7;)T,mô=0E5"(477묎am/7宅L|UA Tv2MTdR_Y"=5:o.臀Ǵ EVqi}^nP1SB+l) ^dL4I=$]T#͉;/Hsٲ̞/0O l* 4:nL<J+3TÄ'yFoBH:]q~/OߴE Uclߔ ߒL*u$[[c4@ 4IWrfTF~]Zڧiϼ =]'T\97b ?P:=#Ex?TjsImH:$ OoE#ޔI?baYS 8t.Kf0fʝ{ؒ^nzK*(#l2op#u%ݐ lgʊ2xt .ܢ í)8m;.>j_>YAhИ^=X2?bXR6~YnݖcУݓqLirkc49BQxXFiʗ.٥(V6gY.psl Y.4spz1ƍ>R\-Q7ɦ,K޿/`:1vvS6.tt~SvNNQH[ A1N գVӰ{%|m$':rL]=d%d)Gi0&Jt␼ET'D 25,cI2J)͕1f䁾]@4@,|UXQE^Ǥn_Χtj cCV)H=Ov%[?RzB&+>l V8_|R?EY zhrcaQ0&qv3U" iDt+W>  |Ǭwmct%^=6%%|MKfZ@}d[k$OY" GU2R<(_}L .B/J78;B-ҌcN*-799"̄UBinlcw+$f8)3ht]lm\XƆtiLp 0 .|ܬƌ! b×ސhNIŮCƳ'G+$jB<Ş|(_16k+/륳=O[5N7k<@%w{׏!b$]΋-MA0H!ZÓN{vH׋XVlw' k bF7 2:j^!O l+P(7n:2$at∞X6(*KWDn}ڳ{BAapQ:kʍP4컻 OfPB2cnR)[w~dlS##]Yj?\7סMC9٪]cۿ%%3qvU%_$niyfHΛ:Ͱm1탌E܈ ]5,338(.(O0{0W)A?WILf_6'9$+(l8,?YOL5>7w?^/~ohYkq:S ߔ[b>44cTa0t0EeYqo#\qkHL[t]/oLiG!J+9h r[ũ}q+6 -xP/e2YorŪ25zXzz/Ï#@W zolZ^{ ߚ}k <.0ՆK?5nrY4ocaoy=~}>xqx=QB,QQaSU$  A`D}"ã7%!D/Pޜ"_ُY$QPQ,cD]+1¼Fħ Ww)%@fM ]C(kUx=_)}J>+=ܯ+i6~#!=Yyvqn-S{ et⩸TZf|M`+ڣfT@% G5#K%C Gw7tOV?R3_Vqw MBC}Lo խhE5wpzo?8a!6k<j4~?d|xr{ %X"cR|yŹόGj1^Ti(@j$p2B@Sa]5fjYo!Wzs[?G-ZLpw}P a7Vv2㒄">F` jCېD,4"8ݩ3wLdž?#Ln飿[U wvPjH+[*W) aSXa(ӳ:nR`m]|& ic b9y;T"~YGR̓T{dƮ xn!a5P'c^ [CnA6e)5}[QC{B0B >li P~9U_7jk2͂fA35]Pɧux0,fQ>Q63 RihT$򭿀$B"pU~2ʝ9edB!9~4tmZڡ"_O=q;-4c`EMX$ uZc}nw!qF>p|xFޣMP#ĮC4?N8FĀFߒRLs}WQH¼i Rcgs1[snxOFU'8#< $[+NK!Cb\y˿ rq(-LU9J"}>A[#Z`4,"Yf zH`r>WՅ5h}|^OG,AuB6HlϠLE6̘`(oܿV4 Yh:d:qN$'ǰҗ\(.ThKu-Q6M./xsehFW R쌓c/="/;o[SR}*#MUعr]d<t&ka"i˾MkNͺRLJ!+34~w+C_֫7OD]̏g?cg b 2aobUFN?nin Au̇Wo ZCzۗX'acbvpNȵ`?4]ӃMÇuzaN'(0;#,/Z,Eg)L`bgXV< BjK3!?Y46ibGlt+:BJRX{/@B;-ӑ*CDtWn 6 1?u1K$ pN{t춊#!!o >9S5g='@E;Wc wB6PF̺U쫽W5 gnKʧWaLn 6_ 7/52x22|“}{-$a'CEti Ө\㍒FW X14i`DU _ Dj[Snɛ$z"~VCZ :烤:@/ -A9Ä=gJD4@ӷYg@٢C8{|+M  ~N֐KK8wENa}Dev2sֹ^ߵpXďGTҝܺ}y^e[ BeiAϓo}!ٸ]ȣaT:fr<:fq !)9cLFJ4M#-VKbM8‰K g .JĭJ-U9%?iQ()v jM ?=G3r$oEjEEr(R~)0Hj/C"dhwn;F,YNq’TõNǣGe"ӆQL'#PngKNA dh7eP}VP EˀC%4qJ)oHh~@4FO=&_gOU #WôcWjSo험.5:r+)LTW8]Ggҩ4ڭS~0SfukIs^,Rorn۱|!Ѽ#KWl;:ޖKӁ8#2 WoWssނ)9STug 6| ymG:2pUɦˀuݠL>&YY )iqfz*:gyxd[b*8'AZ4˺tmܼu;vݦ4E^wIa:SR J;s3'PE8QGA̕w|u'2\qۘ?*Ĥ,CȎ$ly式"M.%bVKE;x&mrG4(Ԁo^d.x't{wlRYyKқ$C>܏d'ͥ++mJ%z=(o6D&('2Ӄ)d'xlfraUF<0Yv AgX?ZU?PԈ2PplQu-Kc~Ƽ.ڢ.hs}*7ÇC6g7wvANWNoɣ:RFI%l+ZJF:<򣅙^͆ c 6$L Cn yjh|jәZФ\ȁFл[B8 E?;#]eHuUX H*(p +ڟ~+ҿ;IGn> Ysj&§Rq(_L&{l6 &ah{&ZlPLG5TXw*j49.@dɰ8.A5\ M1C ġVnO|dyMў#`겡3 P}^O!ꄅXx%靋ƻ VMk\OAUNpO+'U6G!p]$4goYZISXWTdͲ*}бz.!Ąw8>bricY&5zv?a[x/$qYI|{6):w%mng#;u>$j&#C of8QҺ3JR[tx.6Z}<ڊZQFJkV IDL܃zqcƵ2XV uHkܿGw*SrR|)4JҜ9^=Doܻ֨=Ao\HgQGZaTr6 Q)p((WȖ %t0 cSݞ%ĺPSOsIʞ;nWL+Y-I>8Ф]VuɑxYiFyUOLy1}Hհ.PG rqE]YsXo'ֱ~Fsv%%FκsfGsؾP a~j[N#4ah?*Becܺ %mQsc|5%@ O#GYt~9Hz9y 590,H0ٕ9#Z^;]Tlի!OO<id d#l!Usjyw)3u-zx ycgj^,?:)DϷ#?ϯdk?%Xm1?yPs[2cQSLWb%~8 v%hG}x@h?4me_@[Ow:RwfGEUBާ |#ӻB<{Jhn}Mk3nN+`;ad w?>7se;CC9F?^1#"76rם~O  _*J p{{ Ż_=BD쵕tg!+0›,}_2җN$dcL>ܭߏn-- R zYW?6C5JNu#B{I^|nol96Jj 63}Rˢx+xe`MDnyŋA;UVxR-8w-1S>[||"\6TnZE֧nzIhG21K&t11{,h eFbOF*q*!p(ZHAVzutKIWǨr`>Tv9{. ''c ͉t[qݲz|\HZQ\pҁF52Wsd7tFAccg)#NWnBLzR F77^ {M--ARE?Z[$awD*k7)_+KMJVcWi̳8^Y34QpQ*r{ ͻ?tO8yܒP: ]+!`'iah' QN9^L)š`^C?SFrikC^'_Ku6R%wS]G:$:DttK#m \aJ剀/.vͶjq?TĢ1ZdKH6 L S wT;jHMWѕ\Ěiret?CF714 4|X1wѬ\wP:x4ˣ0vōgo}/5LҘϠc;nϐo#nRln IxةzbIGOsZA-rdPJZX |gнD襂#S5dmou=7cryyXXeOFJDiX9? U5OdVv3_+"܍ɯw$,g*g9%)cpgXwObD6KhRivN?UsQVҪ ̢3t3|o 3ۦz:cwnND:]ʔ+"ufzW}ȝ%-gF 7 _%f'[80r&RY"fB#u۽P``h{RqivSUfm=y2F L/ Wa!W+9KCjxD Nvcu)15g) ;UN'o#8>-d{$@d5|C/=:#Y1北H7F^ ??8ggƬƦ s2c=6Z>%z_{ t!߸:h6[;.K>`CcLxA=|cdzƁ6};1iZc [[f"s9Є"Oh{T*#v lm~MT?`=&1\Uϛވ2uɋ:]WKѫN q=LwNOt 욠77=V"͗ﵘ ^  Ww"ȶ+`|Dael"' FbމږwՖ֕ Iz1X[3T qۢj"9,f<ڞ:{4?p!OsL~g|?e\͓p;A BSrX9I). !z'ý}yy;9Iil%kmol1o>soRԓX9]u(DrF+:xEX4{||!zџ2Y>w5ڨ`#KXBh)]T@YR\v~/C"ˑ1;w|Zb [A.>DLb~q-4tb A[r65|X{Q^ 1OЊwBk|\i+Dﳅ B-tŲgcoÄ!``,Q;~+*=g=7y1ecНU r d»a:eM 乜D Dz)|}_ R; <7='ZA,-1w~=)Y`lw%܈ isIߚ7ܽ]g*@&Fyity~MuVe7F /TsFF_7/wFRկ<]R3_7C݇gVN?YZ>P3sacUG\xL4b|9]ŢnFm6DDnEOTgQ鱷߻@ZJKYYVhP8.gO .iX +BeY uJ 7A5Kՠ]F"_rUVX}[]F.tb " e, 圛/> stream xڌP CqwVܡKpw"b8w{qww䕽9$׭e= %* Pޕ &/`aagbaaTrGOtvrBh  2nVv+/+7/ ?μqcw+3<@O)lea SZ+7;=@hhjl Pu0zO~KWWG^ff&c;&g AZ%@tv P0K fiB lL. 7{33*-Ptc,XX_Yllj`hleeo0%\=]fۺ8ݍlM@ ) 01 _ *[9MAub6>AVf0ssdVrrJkY],,,\<ijW5/GJֿ ~>s 9b:|T/geYLV𿣃@0V]Xz>hm~bf 5)W)* ad0qXYyܜ, R%cO;A7hb zc=z vV^Z Z]A"boa2ZHZy͔\M-tbׅ`dea?:Ιڀ.PVA+)%M=6N.< h89>%5z=f&{W D` WG8"A\f߈,0q%#Vo`#o'F| Y=(oʧF|joʧ_Bƿ(on_ ҙ:؂Z_c6mb׀ tHP/],p0 A!)~d /@&@P!~''Dj? 6G :o5(#qeo 4]3SJPqA=~_ jȻ&QN oZE+$]-DP ? @PƞH'/ǥa^iMZfA|@'(|'k=R&֣Т0y']dL5L=S$9jģY&B#e!ܕEߒ#- xj'>!UNJL~0$RQ:$?c*eL`a暯!OUÓ<& qƥ+SUգb "ngbSoCSIFcJLaw0 jFDեX>L=\իhcdmLjǍ1Vis eqlԀد.(B?܆FmƢ1ou%b=ۭ8wy´ m2%Nbz6`㦔ӤGr-s.ͤ׀O{?I岀v8k%DWbc"rKk@h5e#eBd8W Kم)ۧ% ὘!f8C.A&).dwC Q/tW}Dzf.0L(WУJJQHFdﯩg s 2+*nK8}#o`(n>]c;V:wL_:]i3ɎuyjnwsG5X_H39}܃|<A~DCt'a6?, Nm[Da֌wn:f:xs u(Fx'LҬ_ĞٶF8+bxqk <G` *VJ~+-ZMHOفHh%z |K/{g/ t\] }՟'Y*0~|&:5.ja,̹*NȪxM%p8hr;dz'f/<,%: hSahx p8V8JZ81Hc2HƔ7-kb6'VdrVҠUo?ɣ Yb=ȌZe9 dkm9Tn#4<q6(Qu fXUoI[LFO Wd^Ă9/ ] kO䌒KɸʶO#@\nRD\^}q7%f#$d$K ``NOZqiYVyH(VC1)e;2K\OM¹rtlT'gx/w,PZZ=lmZry|'TH}f)+I̚A ^Weʲ>FB5[[:B(Jro&ePd\r$JZk&߳uLނNh)qdPV*64 3q6ϗn*M^ll׫?L#L3&>t0pOAmj lx_*\֦b.Q)E?.Z~\ gظ ǿr8MY$5^<h,eE-R妖?k!Ϙ,7eU^۸cQ.Rg=m6a \mi7g [ff{Mc*v`S ]O&'a9T6GGzN;|mفv+fݹS@pL'G#m{C0* Qo~>`'s @J}u께#X);ɀ6DD!ɱ*Ћk<$x o)ZB^>YkAh@;/JTg=әgD|z Ď޹ɝ|ENfLz)i|a0iЭ'$9aMfANXdckYvT(;O :/ -\-i@ZM1)'nQSM@rgFkkXteݳmIcfUw|z)/wga.Ckzi}ExޝKcoB>9;[Rs_ayrm.<ir-֚~T0" ot(tzxu -JAlx8_oF}摁R&ySFٔ'MZ#*6.%h8ʑ̻Te"Z?q`,\A$m${՜C`&ggw6uU(Ӱ`4l4+UgXO'kص brR `5*Ooah=[f(Z/LpΪI4 Ap2F!c&(}k-=i)-~a to^OFX#Jעv$Ԛ˿] ak,>V yvҾ^sV2S S5ͫ<`sfJǩxJ:/4{ذZǒO%{ɴ$V:`3v;A`_+nZi-^/)ɨPaf5 ǎ Upg}^>c{wkf&C:I0>$e\Oco6WiXI(*>Gb~fC [5-/ٓq7-͕N; RO 4},F#&GjT^Od½&]"g#7qVk3|DT,)hxTeV &ՁNMO@`=*@C(alRwm~jm #P 6V@].fڜsf]p pN:oS Wηhp\Kݚ 3+e]zHz| fCԣԎ ;ķˆbh8sfCdu)m٤m" = LGDo}7 TtvJ,0`fcP3~="qra) oRoZqdgڰ04ܶY47e[qTL,eq73WI1;ZHl-C\~8_KI]\GT0t{m j 7;4tR?pkKmhG!גͱnA-y_lNApT=yZ!Gv=$,'1*E8pdoʓgBXˋy/'& [|Q.=#$3Ӹ:̛&- ?̓]&z~r1 CQHP$M>Lڳʦ%2Ǩ *ϼy6tBѢi߂$lŌJsb+@w]]#aW݉ J>cA@Ösˇ#ňg&H.}<~z,K@o0!ݵp>³/- fzW\ѩ'3 MfuQ0k tsQa5ZdDnd(ňbHk7r!ekDtxosڻ|qT]RРd =oUwK.\z,J(] f=/đX=,USد:5D09)z6\Z77g]|)JYaM7/c eSɺ߃˛_="uN^Wk#`&VV3lL1w}x(sz;˯?IkU?y3ZbT2@~7pwkl#h>PάkCm8bvW$bC(6M{႔ř B+gb.ok8cIǼ3`L&Q@Xt@CĮdxLQ_!ts>IѢGN.ꥬ`2( [:K,1\*2pxcJ mwЍ 3FBD!pY+כ;娂\ d(0=trPB7 li\Ȁ퓳X?Xie畘1&S=![q/6B|(Ϗ Pg!uPZ8؏XNʭӨ;`et^ wPKڂ3ɨO 1 e,mh5p8-cs %µ7L^||`( F.7w>E`<,`^RƤ>q;1u"NkPZ6|4a( ȗ(9F|{R?JIS=eNo(:[p|mQfœ^[8=jzvw[`ݰ)"3Sy})[E`U̅H9;RnՙM"C!|urTpgr՗_V l- oPo㟧T,e" ~Dd'٠)l Z.YV~ Րdb0}NH[c,}M8SއaPC$?:;v0#ڷskC(I-g,v%ѭ~&(pQc qzn/:b@6yŸ<Ѹ+S`DC"qhYV,{۫$)UkU-vw54ѓw}QG`J(MXG>㱒ll9M+Bm^/֌A&}c v ʻ}h5DװʬbZ>.y;q{5;,o薕AGpv|60)?G2r)H=sO7YϱYZ1vP*"fgG |{?E}m9{pQ*woV l/}q{~hi'UA1Ujj){_uΡX}h2Z2.^+$lve 5?JZjVE WVj|VPAqM qս h}A*M[TYԧ[Б(b;xgʬ ig&amwvv9hG-Iv'!y~tcc[r|lA&_zIq>D(mYB#c_<ܢ<,lJ4V~}s礌x`SߖyaѲQ&}F>өwV5f JQ1?s߰fʋ8Equ%&iUD래;xmDrJv>v ͇ёf Y9T7rz\˝KXn V4g+9uM&GCzUDw=ab&ia{nt쐖ϨEj]&ge*}dŶ^Ɖ[dfc6n?sxMpťu?6.-Ͽ Cs@j}֑d$: Ee6YҊH\=2zVfBz6[d/} LR0Ck^J]LI|0JW{ Q/lzcc.{([w?3Ss1Rg,4(ZC1`{Gf7(ɛ-"'Z)Btn bRKsxvj޳!5N~2h $pv WҠubL0\(OJhLjNGF#8シ SZ_Z'VE%Gx@+v6O@譲εe#"8]*QTyi׋ /# |&Et멺V߻NL*츍5H,NCq4"_ n=^h4Rc:{NL؆rʛ$M̭zRD:l:}){ϓ[&Ë'?5`ڝ x;"AA7!uC*kn!v@ [%z%lȖJ?I@oB;F;LoS&f".CNJ$Ś*( ސ:8R̎PʕD.Ogm$M=>E ׈2"AFFPG̛ Гƕo@5J21-!3~>x P&P t[N!-k.[}Vzwi9TC;FOJkm7S>N9-{Z{#A|!!Ž5׳x>w"f7S2^Ik7({&%$m}@UO }u\^;' ƅ Ù>^6 i3SݶXz Ot/';妇edXb{jJp߱HziV_cְShaE 1sKPN+XQ }f.^&!=E~xSQNwڥz/$D-iSo&"#12 c)~ Wox jF˷܌io5¤I$e%g3Q~xY6AeFَARVybQUatEw%[F6[w0X^ėCzFC d?oFGW蚢S+w=ѝ#y∈MuÍ!->zqD|j -wXic@\Sˉ5`Fuv6bbL~?D8!KxITTR>τ?tgx|'%L(1vq0SGh/Bع]T]sF AYRȈ&j6 y]qE'u `_";kR0ܮHWpw(9RAaTL|W `ՔY+mdet;Fl 2VGF?:->o&Twj(ɟ} ѽ> /}s›VJhvcSՁtd:hC0Ý8(\2S~Л^o^Tӆ9^Qo Ѫy^JX;H1aoNOfyv%aȦaiJu=wl=}%+ײ` ںǀ%a7et3U~Bp)ijDoJ:Ј<,J]<,,t+N'B/ Ԕܧql_~8%RVJMFNF#/‰XpD-kX{89Ĺ4?&Yf lmMYOp;-ye`4{=~3lAV7d;`&żoV-!c-,׉l3|L |YaKsQFj$ꧯ4]X;w2++6*jGVaߊKׅ8|9 m@<5k(2"bm2JR5P-{6׻:&+ eϵ%<KɠsK2E0õ]5&s$uJn'Y 59Xf*VTbHv-^~o+>"tC%)馵3| 4Gh bdek joA:fp ܨWXڦUD}"U}ڧD1EL~e%gN 8c^e?M 6]87b_]Q'Tc")u} 4gg:粎l^&rx{&N@ȵl(^!N(*2;#7L_)>z=Qftm$ʻ}Cnj|zR'"A:F&H'Cf2VJ6iUG4z3ʄ/B6gJss 9{¼A{Oa#{|RpXd{<;͚ABza^l[a'*\]DǚstԻaH|K45`lА𞟱ZLzmàUBM5^*QmzH5-,.R̐o7JE㈧üqD:.ŦMԇ=]v;Vl 1[F\x>bCbz8Y tҨʊb&<Z[1cʞ7alJDR9oB)0Y3%}q̿v"́=rQ՘ "<~Z`^7Lgy{޽2jxcDk=d MWks|Y&pS,Q0㫔/&_FL<.cKU RCK}nA(s^[hs$ @I(ZG U$юOv*ĉF}[lO1b|e =.)Av֮e@.o¼:/R8 ώٞ)K $˦hxSGWǟp#`C8uxYet;Xa.!Щ{"`!VLvd9qTI "y tƴ 4ۄ>%]8 Kwq<~"XJCql*OǬW:,w~"v3 KT @ 6!:ZPann#> w|cXF3e2'^\'+[p{@';).x%"(Z"/%zk .oLqԤtV \~`A:Z׀wqcwK(g&kW}m a,n#\Oi̞vc}^\@Nΰ\ rg>Pail[暇fR~P_mB'v-f_,~mO:Vto:W{+(XQ{y2ן9Ә~6ma i 6 `xpeInwkzE^kT( rX=b cF6>qV& ,@?$>xO8lwz/Z0lH n9ڤ ͦWRWDFψjJ) ԙHqM,,O.h蟸X B<3zXZI. RZi\ o<6nji,F& a.(#ߞx-`{wGdcLWsluab$?+4n+ٌ*)}qڲXMG(lbm6/jtN>cW21gbGMksj3 ci0dL(D[̎LT#DfZ[;.n !zn4bxσK`vZ錄g,ۅ̤~AfDYac-clˆ0& z4>`9ύJG14 V^a2Y>cՋq(>B1d4>okٰvěx$4Ve'4k>;c4X H,f%[%hTsz{ut^MD拡b'\El#gH̲~ 'NH҅ƾmSLWj9GQ:^'w:ې(8˨.hf5L,`ooNlxgUҠzk?mw {4Hev;6ȭI`'⳱՞r#RIk {5EJA` "f? )S%IQދQǂݳO^F.GK ;m?ˀ]50=wS6{(1KTk;5y:lZA lƅޤ`ūé*Jt:P5#|![HH"Pɂ 4'su"Z4lvfȬoq|UKp:1Nj}?5yITO_Ri$- ~|xrGtw ~Ŧ ڞSia"7gbO0Rԯz'5I5| d`c">9%6F+QyUXW檿v*7⒊dBoeݹlI؈-J}O.RG~th4 LZNҰ[JDki\YK!d Gb [񜥧c>SgP3Pk*C򆿼7~5B+dѸ/%[Yyz@hZm^%Plי>)ԝQ ;)iS}bشSnBIiHiXR7'U?W@S4>bd,0am&/gJUZbG=(Jy(ucn=MEQFB[eq?M$[q?n$jƄ:u̍~QE"H@x8ށx-| '}Lڞ?I8DH} 탢=FB~4u2U2e f"^ၥ;1"yv[[%cqg6O ǦGSorlK$ -zt.KUbcX=;J db7suKߨ";物-;q|Z~ngF }K \-wERJ8+z;] iӁ^td%5<$W[Rm1!ϔ%EhyA`W&8.DRhIuJs$X xnnLFM LeK)d›aВ =7"&J*iʵܻꇰ"|ݒqÒ%hz}UC99`٩D*lk'Vɉ j[&C,Ɂ~Ag[{^?`*1g^ef13O<y+5B΍L`&xFK#1kqn'9|N$P "u'cf oxA0׉cտXRÅEWx Nl;z?HJ~`$/xtzure9&vJ ayڀbvsǿ Jf3K P)& OE %`bm_DxF+Wf@2*D(2I"}8kO LGn4/(&26au\;3|_ӻHdT*,&k OLH|9;^e"7dT[ʵ4;5)$" $0lr61r딋|N"^ P~ Ś˙AOenp5ZY))(R~)O+z}mW$JF1:xTbl8o_ɵ6z#̎~%b]]>Z:T1V4GrK2N SbKʜMa:]n0(,e ^d~'Ѩ +*Ȉ$KJZ *Ula2k0e޾6*8j&K20$@ (NN)hAZޏC=Nlq&TH9_8LwyjQv~t_a$IZ} zYcop8AF<=:K5!0 fEF @>f)1"IۨXO=a Qo\Bv2e6Cer`91w TV=IYBGIc|[̥}[YzDr| *IJavINxq"!v7$Yֵ֒AD!5 *q _f׳4<ɻ1 \&úzmh,6f@ /&rDlsWwCNjiB["X?snx~V;09R-vro,v"ȉ?H(css"f`) Y-OBNƭ,)&Q-|֜R^u\HL*wU\T%̠e;'p4DUo}^,moUKtTYzpWƕnϧ U[Ng& j0s_BygHW%`H cKb HV҇b  3&Rsvـ=^si< 8ޑ7zcrS.QTuk>-_qK1Yx*iS^|R]1P 2%QXpZyЫtF}F+xK.+E\V -xҐEi(2S !19D8y@M~b&YЁIaHC'WTQ,0 mL[ޕ$ 5_cO" a@иLh endstream endobj 573 0 obj << /Length1 1406 /Length2 5931 /Length3 0 /Length 6889 /Filter /FlateDecode >> stream xڍuT6U:ҋ {/"!%j轋HQt邂T))s>ֽ+k%;XPi@"Ђ ! @UWB@) NeCy@`4֦AcH$ IȀ$e@(7A|]!=$EʥG:?xp; B]掭P8  }u@C2 {n8 Jm:ACHO A}3\WG88!l{zô`&ۜ`h8PZDRB¿ {~;AXAKwaH1^a)pC{AX33v(]?'0v7XXG\E͜9UT~@PDZ$%EALMsHpDbmL|YA]hoB_ ~WuFnn<?]ho4VHD 5h]ZhV$'59P9`ӻ0; ˇ^N U?K#H_@P(?)vؓ8{B$ 8"Qf*{y~a~_nzPX^lϿ3SHlK]dIM_\y13vD cneu#OlGgV[IGm)4QZ 4 soǕ-EiPH{۫WW]ԪZ6yٸ`iMXW}$5 1͞4y=' N-X-$NUxflĂDnFe=GLi dG+MEc0w68>}ZJeP%}[ Lxg$Ӕ {7oQ6-;6&N A@5uqrpQ⨧}9 2w *+$`dE#>g<4_b$hQj Z=w {POi/EbLӝ ]:~JsŅzI?g\`TR".Uru&Qzbj{b[Rӧ4 “//9+n>20sIjܺ!wgzĕ nrOD;o|g,o,I)GS@ C3_pkя)V;oZ9} EtX}uīcP]%ʾv 0VDݺz(T{a`SuRc`[XfoW<-鷤5!6eJkSo~܍zQ;6挐p˰h%kץe~lKNP^筚/>*8f jO!3%d~2y!fHQB%sɎ/)b3 ˾7HM{Q}SQ}XAəc\Dam\^t-'ؤѼAocDu`t/p.kQ:5jôc Xrg#+_bl>Ib-~\!=N*n\Y(*|-vmz̸Ņ߫ۆZ+> 9 O}[t\]lx-R뎭Λo60d(*)Nվ JS SJ]'-tEdQTsN_{ӏ` 7OR>T[&ިdc|kXfP?h#rOW{.%vW2gҩo;? *UP8L_wQp4@7]!Di.*75ەb)*|8;=łe%Qx?Z|M/߷Y9-?޻ύI<75{\"ZYLΒ&UE`J$?%H&YgԩrURPHEEkKh3 w`@r6{x &ܐ:ՖSCIk 6iUY)2O OdBW|+stUe!˫ʘcN2<ԋ$74)Y~Q{fUl$᯸>&PNÄDjI'1ɮ)hmկ=_ujb.P5O1q|SMөSnwCv<Y&]r"f=nN dDbQJiiCZvXnnǝj46+)8fSH+` '& -z$eɓdfORFWH$\aTiHNd5.' r՚ώٷ81K I1%*қȚvdm3QN,kO:\H:yiwpqš3Z{;krz|*uuU 8J' ]Y{Lb\x/h߲xxKw@,ё9b&)ζHʀfcq6oحi.|jƃ,Hc f$ŠD\A{+N)[<Ӻ磰:f a,,w%o(vgg7hXJ kR\ꣀSԁKjR0pc)uHd }Lտ[S^*!8ᤒq]%m$+~-xF>, EF)qPs9#W k'9lT㫇vVFv&NwĖr>r(f\s_3/SQ.5K"[\K4zMlܽo6G4>rS]FLtc9z- v7,ud4YUq'x1jz=}5}G*ZOOqeAж9Qoj| D3ʒiF7hp%f顭Jkʛ[yF%g4f÷VT 0Uژ+&';lc]'q[#VdW.'MBJR:Dd5P2*a[,QMLnH6()%(D?E4GA; 23l~fO3NIH\t'&9~˴̛SVGpWCw-L0RZ3 W,i]?QǨ 砅We.}aʠZCy󊪪BXv"f@L f7r͙G@4gʪBWPlؗ~'ƕGD )խ̦-ya4,R7oUS 22FWʜݞ @mTfWwfۀK}{u\uEUExa)CDO)_"{5\Q=]?,1x]{=~0L[ycB *`%NGe^ ܯ'2U,[}hߊQ>y$D3`6 r .S{vlTuslr;6HҖd3BCJ5,6G>Q̌=_kPj)p_ab1N>)dNM]? Y}:1&d`Wg9M a nOFCvXNXث,338^Dh, ?iY|jĕXr4&'"E GxF̭{К4F<ꩤ.2Q+dJ٪pB ~E9&m6|{xV֪]!CM'|Btv "`WK8Zfv-^~sOȈw 5 *'{y77gH|diA#/%hF6I$嫗%I3jOžÃw e2rbZS16 =bD6W5PzrWd!x$6"Ou=[g7*~C(u qBFFLX\5&L|$!!/ z%ev\2x"ev^ fÕih@^[ -NZZS/fLc` ^?v%%͋>\-k8gOK\~\d)i6ޥ!̂+77Wx*8 Tf:H}4W=$=Lc8ǔB2#"(WXՋWE!\lfŏq$֒+D1^V6ͮ^_(n.I3xg aO NsQ,eNGrtvњ9B98ZG%^j̼U1.REfd ԜL-j/ʰT*Oj cUv%neNȱ'4-/ȧ.F0CsFW,*4_?2#(iqQMP(b@3p:_Χ}7f+_=zB*deɹKyPIwYL3)sqWSP-G'+嗭q`@d/u/>d_Y@4j zP8㨵Av:ZG'ɭ}el>+V#N3 1;7/+oI0sk9pʊKm]cpZViqL9CIqG~&oMP} endstream endobj 575 0 obj << /Length1 1700 /Length2 9283 /Length3 0 /Length 10387 /Filter /FlateDecode >> stream xڍT.Lq)Nq (ݵh${^\kіR(R(E(E.33Z|ww}aaZpv.Na'AwGɠvAq2YP Pvwp99ܜB1 dAk@ a2@] vNAA>NC[X `Xb~<;ߊF\\k` 8cQ ? 0|'GYC1c@u}UֿJ[)- pع8\wSRM+ ;*J<_{ GBL߄y p#(W3iу Y<jq_S;V z\)gGsrp)!^`kMO2g9!`M( yY9<^.Ǚxc9䜭ֿwrsyc>R|@g(X?{|oH@T h7z./ {< >rr?s9YZQ<2/ogPY?L seX?s+w7ǡ,RVP+0ưz) OqQ+Cn3tܔzNn΂J }Uܩf[o v[˄ه'3ɾtminCT1x}ֶC: ~/&{2U (wWS |ӆ[;#}uFITzh5fg%Aw1![p|9huKE8Y CUiW'v'L)}v)6\>T.KDn֋y4H#ɗ0LbJ7*pɵ[wt%0&6$f8Ďir9{6EKL3Ƃv]eKBaA<<Z=`R _Ӟi׺8X%›#.V 2>N~u^릪#NR.'ksPaMޛ8R(ōWՈ U7gğ]<7>wYuL>(DzmG~wk):Iqi̶a-"$_oMljH.2ciMz%v֞<@1iWX0:Л9g<9b84=4PgҔ%7!ZN h~!nfNv/aa)% G'ힱ5ӊ苹CF8]?6pٿ AiQYŕ[24 =2fO9n4D$̰#i /bD 'pgڳ5~͚cQ88kRǁ%X}S Bc#:0ׯ b-}>>Kn,:b\~{`=͑S%>j3tcLc+w>K}t& +oQpp)ɥ,?;WVr)غ%HĚXwOmƃ蹕kYVghu>U!q%WM cDW{6-*m+ gNxB샡[$ ՏK\ ɉ /Zvu٠F|QP:s0WhclyU\"panCmϬuaHlp&#c)m8aâ:Wxؚ͍d s} a7 h-}YzhCzk3q72N-qjBEvļhfeǒ`3kA=hlMY)G1Xz] SImsL3IJ¶oK査gSʂr_R5RzW"Gg2wS[.WGpZA@bGT2;=X)7}5$l&W/aci,*#ϧuf' W <4ׯ'E[|.ےAVK.4k_6뀵Nv[3{yڴ`/Œma;UЈT]cpM'I!.1S fmuu8iB􏌮p4) tψל˗qZ:*|n`_U5Yiykg<>fO,.7Hk8ԧrU8^PtU|굌) _$#8B"#JO&}RzUl\ 01=BM, 7uF P-^ō:H&$y;!-dר4)@>Kc6 As6J,6dbj< ]?%Vֶh0%WTdtӺHh(%T9^iyi ݾzN!:VgN)<2J.Svr{A<xӭ<,s rewbONh[WGǢwTE1Ҕ[:3}%%vv!,V6&M CbKoFbuS< CÆ"Z"tVjfhۑ)dCIH/`IrW.P¢\;b-BXz]mR"*5O]?pj:L^7+k,T!U_n@'ht#oVb/m/V3ϳЧ;еm|Σ-T署AewB#vNfn}M#Oa:pfeNˬh}I*sܗ3`<98v'uɘވ^!2՘96^ܲLi!c 9ʉ70o7n+HԧroؑZqvB+}Ӷ^բMїJWb" IfW(ƹ9MaIg~YL ļLҍw]yig:Ukb%WK^l#@gc8#Ź|<=B5\Jt?lݣ.B@:TuLF '(Ys~}ટ@Ojrfb^Huý^ ?Dѽ-Xz$]x8+bR[\9z;+x 1ȵ/4+^Sg1e׷Lj:;~tH+WL 2((_ݻqU&+9!0TW َ ^w2AB;T'% 6hVeu١.!h9x% 3#RxH@'ոzsh_!OtJXIy[\)ʁ 9Nn/(Mt1ΐp_8{x&٭d?÷_`Gz5Lm]g of P.\"fNPBK1͛mb],%L~Hmp\-FyVa'LC GhRLjvn0W(ʟbfw$ j),Rs7$bh3& tSm8Oo rwz"r[N]o˽|u)=U*^<kT5ٻ & ^qm%Jupq5 3Q)Ww4ǖfD.;lV[Y,b`mDɰ. bzކ0\$tØ; ' jVzfzJQMnqT{LG(Dkû%{6Zl#h^ты\_DKш;_-UhxaOH Q.][~ O8[SV&upF[ Mk ؔŘ~.(4) *l^V(mHir[`( kt_捀m|{ aki1!s#,7piC1h";q 8*.921JV$6[J ORjf]ۖ?6]5Yq:Kq|-Ui=?m ]^t4㰿6hNNNl$Ui@7P)׏leإș{C_֐HG(>Fujw1L9ztY~fY!f6'afVسsx[P+2ɞ^-h$$T`e\vQ%%K(>r㌇V]Tk7%i_VTɾ~pfu^iFDUԲKmB'uhaێ97 /2f21;Dbn i'D95Lܦ˽`\&)˟Xfq'8D-4thT$䮷U(XOL1b^.<=ߌ ]CQY- o.jG ,.r喒Zc"ډyIQua-ԝ;*_UuCW 楺 xMY`%T)F+XH1d:ZIM@Xx!H?Ѫ9];rӍRaWdv*oED? Tbzhꎤ-Ftfp9'jʨ󪘴,lK=obzGy|*#M#X̫c%fkC2kzݔVi ֺ.y*=} a߷dQ:)ϼeS{ќ ̟'Yƀ<,pk hΡB^Jq[ *j8b_x>I兕zz:F"r8a~%zFj}Ҵ/vj`"=%:B%vƞ Vaȿި*snIvZ5+m6͓{q1`n/#.rJF6b# 덶8V )g*Řʚb9M*GHQT+QsrSW/2<~Ihycگ+YO |^ovV?'=>>b yLi˾ұ ѽ{bm,cU 3ֆ{Si4u)j-{W@Yd`B,`J$tl= &P=5rYHBZ,$b`?tɺ O.0(QW@v η_6t,d"uJE-K\\+Sp] ʩc^ /z$? ? (r6B| B>BGP XOUzogu=FV؅-읨&3 Eve&6l+KUc"Uв%|19Q,,&~a['¼9m0k#͏18YfГ㺟CfH\գնL=r.SeRwad vx) T{nWv];G~J|,4/gC-~IieEM#Mm2+] !R[BS`-V6tev#~ϥfao ׺=>*w+[dFwi 0n䞵 +_R}Gw?=yD1ҾoegJȸZ(?,ޏQK}4:pB >B83"t#[+je5ˍp,A V` %U죥y|VUʏ9VIq0rν Y-.rZp(I63zhlim*w^p9?Y+M1G,_#3M'[=QOu' >UcK!6~mGA ]~ s2z5@Ͱ2߃'gK5d t&:ꅎmnu꙳*2vUL-b `tm,k(,=3O$Xf2>a&j)!4LK,$0?إzK/'UsLjX,dfO?(^`ƛlgyAB(ܬǕ^2OL$t+8)^=hAA懏(.XZR4:'$d^zF$`sRQ5L_!<~o,Zhvu[v O0m]֤qx*,Uk/zPTNi\~ GG-+?%8,OO'^0!~S= DjIG'R0/i1TII,AW6rshYc YwtOHepK,)szA'w9XʟI @ǜ'>G/ 1C"}?/kdLc ho(Ϋk/a%U?|i뇺2#iP%2IXi r(Fk@WvW7dU82k+';ߕ*nBV4VV/74$Eaq}ҹsϷԶO xSNvb?8pc%cf+b!'1%XCM\ >÷.ɫ,tJSӑ) [Z3 9c2VߓuJx@ﮜ;S3P C/,_[vLnYr\qãT{?wQF5pػq^ary{?%ƍ勹ƓRSlgM" j4Yތ?LpTiGkh:\o}Kvs&f-IǎtO׾h;)?*km2-T| UZ0l4ܷ-!'jT|vE.horX/Jdy~ #ɣA:e8M$Mi} y[Ek)'T*9^Pcwn8G<ə׵wM$5@FMC`ץ꘴{>^?[@3brmNOgkʣvUn|fRuhܡD;g!hMT`;<,~-ErFJ8co0y,ط#D>wcJN)Xnh}ZL5WL#HJn "_jK)ɍ4^oBr"5:^Kf)xQ 1vpYwovH^令7_\=|vJ߂k}3w낾{(}q[\yBc`ZDOo׸aԃLsa˯v$qE!FBӦ?Pkݺ+nl#U82*܅0DӒ&0a[RY6Nf7c*G車u.· dEAL3> l{|q!Ed7gq#lOXTIy,vM::z_/m"DB3tUF-K,#6a&QhʗY$-9jB1dA2c@7$0t;sWDOhG/וyy(F?0C@=:GsQ1'x)@GU``X܂ܳɈ|<GQ1`7=32;@`sR 4 {=V'tI_5+U[ZbO!CVu;.\ ȃ-̼%eG DOBy{&'' ܻSK= Y%6N$fxQyi%-o:R{;z#\K Sj"J&з\{.&4CcDUe]px+XV`+~$py-p6R7L`UtϩsJD+FI~ϱׯzO*<,5dDvF5i*q^$yƔd 8F֯<ķdj],$%aBd+^;٤l$ebteۀE-zƗ) d7f䇮DOW1eߟ]z*)[ Vlo) j] O?uhݨ# |ZSRRʡS@#1v]F`"C>٦]sky8;.j~/!LE4!|umdVASmNGi^O2 v?[y2e%SY{gN2"CɁ-qilDZ݃2y}A_ӃLgq626jFRkmU|% ׋ӬwcjU;e'[ /^)O%kSōrY}2L?34>Nr \Í=Z-mVgMB'y8l0+x}'t 47otC206JgUb@U;VVIk=\?rirgKpk0ytd+$<ɫ8?V*8 G@%W0z_vI;Y(CV^=ڑMֱ+nn(V3"oM5{8^o3Dz&Ճy +{cOG/[G!*?e|ayMӗº%z1i5F%KvU&^vݟY,3(?Xp_ⴑ%g\1}]CQ+RLqc|^ a140 8K^x €s_Τ]Aski~c蓫> stream xڍvT>HI4 FFw!5``lFKwK# ( 4)- t7}sz빯9cez+o h^0H&@ BVV}LjuCPtBB"pXJ@H@@ hԑ(Uw@ck Ey~䝡n0A;@1;@= W )4EӓCp9"`IesAP0/`nYatv"(_SAm0GgHOE݅su)1c 1QA1AqU^ e0uA0$~0;(nP?t[ ` !1CA_Wy"pPH˘^_^!0AQe><蟊j;$S7 EO]p93oĈ Gf a )?ivs?n3 gFh\h!1ӁP#;W ̇<q^H; >mP_!(د'3v6Ng. 3)96H_( ,A 1 a/3P߂!hL `t#f1/o$*WF1~ C0T¿_( jC8; u||Z#OɻQ w7Xc>[yr%IyFlX±M[4gqw[蘗QeӞd:)F|4RnG1dzO_Id["֬^SyN۪.u!{sBXtLf 3$j]1A?XʒtJBxՆ$_3)|U(gҥ"U,HyKev 3v̎rH&JER~&(";ak+v:dw N>đ |l?@^/1Ɣ(:u'DtV.]&a8ֹLb+@KA.2 yTFoCwsaCgj 6i)y2jDxG/3HһZ1~0 ANY|/7͸!%2a7P;AlbMXTk^ HookzHTP8bR^N &G7TLALQAL,kΏiM.7&ߧ- Տ׮f+J\r}=dOn5nme(CD%bC!\ű"!A˺S7o$j_cS\-ȕ (R3OSL Φ[pW `d;&UV}7:TcL5A~)ۏ"Ui21؉lj^lowSYl˷ݍI}ptVz=`LT2L PiSaօJt[^F&JxLGRAg)"qQo/QGm<ӽEqf!*1 wfI&m?-,ja5%ZL݄铤9Fw1 {x&w*'2̽ S>ܢ*t$3`:0J\`56H=m 6%?nf3#axҁf7.Ilݥ3-6>dt2-#"Ȉ\z;?]O rEby9a?j_ O|8%%IMn|h8i{S",n)u8' r}SduEyH|.bҎ 1y|;h+\m"9ڰҫ ه|7=D=깭3rOGZ&|[:Aѐ_XIGV"\ΰ `Js}sݹWTbFMX^E7'JJzaFK}IT7ֶp7/Vo%s=XB'>q6pM#;[2,$t[1|4rz@42zڤ3HqCv},n\FIUkqp܂Ls&zWm؍4 ؓON+gК1pPb@of4\yZo6S\NK9h EމYOQ) 83 >7 ͒ q+)Ę:㺊O^ƈ+vkda:[9^-~K PjWk{W& mߞy,j|nM lH'pM]#O@vg*#545r,Tߪ3-hᴟm.")\.=rgѹƺ=Iߖ{_ilɷbA6PSo,lyY=CԬjע4!JTq91,.L/)Őcu%qީl gg; BlJ_?MЯbSE,-:N {%x$rI@ ]cٶ>+]#Bh e(/@ mqd[4e]'qbAtr\)6z|4O](/b{MOmn*7!%iJF?U^3G(^7O| J9B{<ͩcgPBLd뼅Uk} 23wsSu=QUA z6A+M|sOvRkĎQ_Lj=MiU9,3q#tNBf yVkDzf G&qďy|,64֢~>l@!s;}45p۷ەx|;CWd5y0}[.YIgo}bi^aM`} ( ᤺;㯔!ܶ'<3WkuO~A۵CW]T^Tmq/ɹa8#岋n$j;}a! y]?|m~<.(6R.qJӆjyr)!d xv;q"r_⬃'!6U#}бY\d13fŰ?8*k)wRQTF{D[O8 xs]Eӻw޹} Kw +vpkuR/@eQ}:Pez&w[YS\յ'j~·T\ɏT8+/bsȩ(F9ǀ=4ÉG{J{u> o}raSd~\hp;L5np._$N3'GTtT5IʀNjPʝ: 2R%J7td3SC>+\QzZg>sD63, 1_VAs2 xˇIAdu^ݾ*-t#-.7y4jz|zG1R4 ۵\Ffj'ՃC' 'N4G#q2ו1|N+$ݽK+cǦKf#xY^\;78opOvuZb:*5ٖ~ TNq|-ܒjյ0J4V|䍟dv(XUVo49/Hi/ X xFqQwfLmG~C0᥆JI59sQ8~f<sе,N{_qaVs<.0VbWYb밂+1Gusy儯o;(F=}^b&1C\vճal^pg*K>$/W͙>%t+ p6y?##6A"RgFAǻ{29|Seljf+@z 눠jEF/:S@O5NHD0z1P9Nr;]ZōrTkD/܊:QEhBqs|f3CAًq,1ɝVdž.o?%;o<>7xfT9~;2Tfy MEKuA{=qN_[ZX*:׃?C#Fg_;M<6RLr"J5m/=KkM;TCޖPWX%i/w}iİ-\oWyzo4n 4ʩc~y{}͔:)%tKNhGz9/tYWf}^)B|<ҙڭ0I!U%$+ 51 ~MlV2k`ڷ'eX4i ̺-ڷ= F|1A6޵+kXB#{h~BS% %k\&}]FW~PiԺgJKJS ϥ!h$1NDLmB p`7>Rlɖ! e)e,H;Rkvsmiaʀ>*H ~ZU/1'Li$F_-ˮ#Bc1g S)oyѮVضއސRYu g[|Wo)u9 ^|q>'Kua]/~b4M]ndi%r 9n?n2<#:Vk3{б$(qg}GR^n2W^:INCԟqH֘HV\ҵ&c0d :>=#ܥ{K5qf˃Y Gَ=4^G4%*xź d-fM~^IZ+Us 3'Coo1;h}ښsYű AI;,%sdDǿA|'t᫜~/X endstream endobj 579 0 obj << /Length1 2878 /Length2 24967 /Length3 0 /Length 26565 /Filter /FlateDecode >> stream xڌPX ];qwAKp-8w'@pۙoU[T5ٲĊ*B&vF@q;[gzf&23\\dag󇂈#$5t]̬ffN&& y&9- \_TfnnNB6@G cC[9bglt *>sgg{FF777C';G3j:9@tt~' 79@o#X[m@.&@G(8@EJ`[Yo:?030ߎ,l264675ZX tC[ߊNv {CWC kC#_ BJCPdhada;En@U5:;'j4݃ZڹzL-lML'abϨfkG${LLLܬnl۽=CbP>^vSP@ S +`ba 0Y½zcP-Lc0.hLl=^/({&,lgcг3'[%Trx5pxge oe uuؙA/s_B.Suslhcah]Ak!gZ{&.6TBfIhhll @E;'ߗ ԰sZ8c+Ѕ_G@>7ca::zZB/fІm#3J`jFߢQqE^QqELFW `xE,FW `zElFW"@\d_+qE . ".W@\_+qQ}E .jEh"W/q@v"6C'ФY8YDr1r44/?XmAΌA/WRG(XN[U DT2F56.AE1} ? ohG~쬿+1߂x\R0fM9 L-bYAG3;Eu1}ӚwI^9|a$ǠG? `t=r%{ 6P]evxotJW*4įׁ3?$Y^Pss_}Uf=3tTW #'8k* b1:;XP+0pbǠ @P=_Ɂ(ѷK0I0Z#ѝY+])S^3Z]^+C7!)ͷC []>_7sc3׎X^ H,uJa-~z4 x&|˼Y |{YOEݩ| ꜵnK QGi9 XJ%`L`)zhl&Y!D\PG;|_j-qJGu&eezvwnaC1AٝN iBE7[?z`HU]mb5TF;JD) dBtE {p b_5Դ)R!|FY!TmAWOE6sgnjtuF/{Tx -5~gӈU57Eꌙ~[aR6V& #I@A UBZ,ML{FJ'U+2~N-p5aj?a'v9>eOK*Gl[T&eMɲJG*&2 c c&6L]U,8uyBIrFDz LڹNj*4@}gǬċHƒa$937qX302流;%xIzLBfoچϫC槫9Ak0uu_f1x|?]$"2"/GZS CE:VsEϵ6쳯1!ΚÉNs.+vTsדoUƑLkerwrZL#^kI:=ltV7ISZ2 2?I x|j#$XB aQ`VOR$#~8/oO|݉}8`!7K2 Is+g\uIH Io)BF,|+^{ߛ/eL}fC,۹}Vx-[[n+YHcFآ`;>Tݡ6:cԠ0`11SBV̀?yoE]iR齔wd\a_Pxꘑ`M`J=8n>v.emU(JVeIxsLئyjz4V@ 2u5a iQWI1H"wӦWAGHvAͲ9B*$ͽA!tonZ"UOuK.,._)/vR,LkJT󚐶P $0``A\^v ]喝5N!dgS4Pמ=_8rn `s3ψY=IӶ&$>7ZpcjbyGQ2?%(k?( !K-;o$.h1D9ТY2W9tYKcշFZ6 *Yf/D:\E04ٵ^M+vy%AƯ*X1le{PLxrء×iEG=m]xsyNBpU>P!@\a Ke^'l30+8Cyڱ|'!whryzV~J6 XӬA7[sqOV WO6 h*[ݢ-# D؜XyZW"*l$\%2ofףG6O«+lD|hwMK͸uO $dyˠ [nK9: }\Bp)^9o<9BrD9 才^4!V.|HrFE8/àl6,-j6֞-ګ*SbIf6X 0V*]KTq9a'Y&xw[V4mSu~ Np[A\GDazx<& Osъ#"P GIJp r=w-e ޡX|ȏsG=ѨN۱ uIeAB~"0Z@1=$`ÛAm1yArޯ!ͮ[ti0g7LiZWH`zN^45܎sϙLA׼Xi,-i4~a{ɢV,>1w5 v|pS0)pD_p&i\\!Ir%$7pyS`-y`_y-BїdAĝ=$4K*HZU0'KS BeaM-0hhW;d5*ZKؕ)/lc_~>g.!;KGY.\XPv<agh  -=#{_n^PO`[5Le.ow~.*;Ygc~A}xS'$E^Viұx՜${=ܧ7oy`;*Duz?"Jp(=MRf*6^Z/7:KC3 *LਾЍ Uz$N: ];^8/ 7aN_VkG+CGy,ÆK3 C3Q9Z)T*A؋ջ|Ԉ "g׻*cm!!419Al2403r>M7z[#G_HL&,-~p;&yz~PѽW: S*++kQ+xP(e0ߨ$ޛKí|'_,K<2Bۨх݈ @C5%~ pV=dAq͚ܨVdx GP,/5d&LE KS[=q7mZV&,[&.G?# L]tCW& Jxt8)(.}+ UC=1H1#U5%ӓްzaBD+Ld= z [Ju~ o5&Zw[^ϒZL$kT."O 01bsf;c 4yZBv𢦫y"JXjzL3qÒSi+q)2n>+EpsLw >b& x6db}0AqmQEhY|T j%;8f?uO@: HV]]>Mƽ[Xq͕xyb]^]yjt\˺bV2LuFP4bW\Ng6A'a'uere+> h__^Վ|mia~ǻ K惂FSwAPUlm(dSc )ϻ=Q^^Lm 2`V%?X\e@ tZc% 1Y%&Rc+"fDs'?ncw-bRrkw()\v+4⮑8f*h೑K VMdd v0WX#I0]w򓍔Myl[p" 0\H2Eqv=P{ir0c?ahh_wF:8cч=3)ˉUm|M[a`dbʧ.>8X3=@D& 6%hF1L1mUFyQxls  #FSbdñHo5,zU:nޫ{RA}cne(7(MO$>07HD))|Qp#:̕BN'8E+c#z=ߘШ?q_"zBhqA5^N~QGHJڰ=tb<3wrJ`60O! :$A LH=~W ´fsf16N=^"V1=ڔQE΄A|ّDhC9 }92&>*(;/;qרح3 vEQCf<} \_3xMVi{;-2́8:s00t}Xӳ "@$젘TElOI.{rU5k95u#0[ $sfIxҹO fUOV$Jivb\. ~'8ansvMٕ-<;<2CGy#`,e *\ ggQzp(0j+^]FDl%1nNk/tW"N)K[K4^JU[aM kdҹ6ExA8D S=vf2FЁO{MH3?\2Xkd.ߴUk^ۣBXaOwqQktoQ4$KjexjC\!v+`=i22LUkJ-Txri3v~Ⱥ֡!߃pqg5{|u uGszV_D>=oC&_M!sXڿeMn)tIW$qsԾh]. 3u P>LK7MWgrw;"b,Yb?t5ݙ+ c9J(Tw>01C!ҜIן?ke8ס®}m}'Yԕ'PWfnK},v j`$leUT jV#lL u_}!@7: G~59<8Td7ee;RcχeOkn2|?鮲|}. -.g!dU@ߒDIw&.g{K) LD $_g^hxRΥ|3ʅu `ᮽ|$x]Omu㗑E 7E7"2lV&Ŝ'Fhti7?QV* `rI4= PΣ(C-X_ޜ;bO8B,d[+k.FWbzF!~tz60p60P VP,>+pT."gMfu#-dkF8di@D"};9 ԃ{ C6\}1*x7Bn鞤K)UÄFehPT,p}5?n1{+Ǽ8*})_mz^ t[QEU (PF {C.ceů)^Bb3xBҢ uukmIJfp!版r8_¯QjB!2'zy[jI8b7;dೳZyp '܉^zue=P̭Zc<똀BY~vjfhW))6YS5NLYCdu㏥ joKO%\c8MIVy<,jOr ڝ5~"c=uC*B^4hE'+rQWl,' sմi%RDZ(M.N]~tDB.f%s2e\ԶX_n{'ۣ =éR~/BhuHwxQJ1>l5 7I n 4o*}NnRj]Uݧ&Pd_SlF28 ofojgZ10/-5<0?D[qZNCd]x1%b*C ͆SF~B{;ʠ;g̛٣CEM)ךƅgY}hމ>{q+6=޾[%<>ʹ6P-V,u@3'Tl esšծd`N<_w{Ĺ!PesM͊yb4*L8 ˦/aȗMp;z_ -4foߞ2 92: :reS0X`Ϟ Oҍ?a-]Oԑe@N ٻR2.ϦYl9ƄҐG%q]r"5 W8\#YÐ-`6m\B,`UQk>3WVwc6km8 5|AcvN=<кCCW߸=,˵>mM˷Kn Np;ma}ƞMTn^ Ut~Nm/ ڽu 6nw'|Eq|xPV|>!r{ ~J8ɵ? LGwC֥aJGآe~ ųׯ^i/ݬcI$n H37PF|J|$zz`R^ `r]uQ`J١eXbAyk_q5 Re?c4rދCGMR8fKHD- q* X=pyL5p-HA)x>Bjr14|1i/4uvHkdn'i{1 F{E"3#Rn4nL5E8,"B,R-o!q]M[Ğ ak`bʁ}z4W(|Xi%#d(uFq/YRL_@s,pW\7=r>Yn!˙}}׳z[6ܪ.Ȍs E>"[f^fVcBA[_k{[ 9̩lGzݓ 0MaVbpݼ&Rzg_o 5$bJhzc)^=Ǻ諒5NfbN!.kWog1,'bk7p7T%(7^=IE56L_ O>cu7kO;S)([bSS#p:'AYй%|`OIq\pInip#?A#&+d% oI oˢ uWP굤,X !R92^+`\2~#g ٌ[n3h!pV81Jnj8ΉJЏu! DG$WuTi_\fIecj;#X )Ƈ?v!lc,<^r~:n.qXqy{vzITf*uot q"Q\9hofcߴS_T e9m\n{#͇wVcL :x?ltcl4Mޱ=r~O3❄S,՜ج=!9=OkƐΡoshk}4v5ӜO:ޅO O;1NW7!Ɂf,JHa)u)9\IO{A>n"jE>W5ALa]ݍl*2G4ealѯ~ŵ~gzZQ(#XeFvD.䑒int3>)A1͞)Q'oHN?]`︸,C(թFZӚl1P٢q.'4xHY f:8h=ֺ!K9# M}~Es?`jG"+}>dAzO<ڰn}̡N\ [dY'-8p x[QBKz|6CD) Hj)ҁ xI?6;r.-"g#m7VVm}GqSzZTvJ׿_gfBgv||T[¯ g(|nfS ]},1>W. {:28+f{k7L?W2вqUd?%mB”sqbYRHbD%YQQ~yq ܏ܟƦ|_Rp=5lZ@l9d5z18FXҕA {6eМw!Y+7wo꺊MBzU<{ck@e;SXN?/^F'|Gpz%~w rWD+ܜt25kbIzwjHՏYB~͓t`1{.@ +3*)U3Pv=ʨ xkp$Ҟ#bn0}iȶ5vLs`'eҌ\uMwtd,IU]d()y9I D}OA>Fja@v}^'։C;ِ:O4 jd mz|j^^0]jJb<ԏm{:PDʾ7+nd?874~}" 3 +y^OHw5ߣCsZ}'3(qdP,YH5wT.āD./Y tmqJ~kBvLh L/mS;2.DiɾNİ}=Wf@5D9-!r6>{y,gU>-07$amE,f X}ؾC qw=pҧ)~0ˡ6t]ӒKv$Uq=#Ӧ3ܢIADҺK1BDĢ~Lg3=G|B&\m[ebr })z9A:UV9ͣCt}D$o^[cGr$!%ۓcs)U{ֹ}ɕYM5l}CRD~J_w@vʻG9| )g呆Jif6!O;!8R+S߭؃q~k[cVT|v(+2ߩdoF`m[6p[$KD34eCaU,Ki S^fO#3!ة VZdgKfq-μ!!gvO,iJZw[W)Pwi HL 6k&3^fH6:776 ES0-.|}RPp-9:gݑ|,`Qˢ: g%"CM+<¨e`Pڪ;dD/o:Pp3QېLqbv 8uL5iegYnܘG::na1,\4B6b- 9aP?~c+v {g|UYZ. tz:'TFYs\()Ȇ\:{[sB+ 5tJ>:p[< $ a.HZ*{U*,$',1UZ`WӽH)n@Z.զC (&/z79O_VY=~kI7 ͛.{MWU0̄h:}[SD*2z3 vNb4ޤ Wi-s/ ,dځmsiUP?Sb|8" 86\58M^^_iRpZLJ{A>V>qmvDAGS !8*rU;(Gq9o &|35}hnڝGlU)+aYAad1ɛވx5w:Zb[6V竎[2d9ETu4p۝T:y/isD[aW4hEvԎ7^2We WUH(&AW/MTux]bXL騢FdBw+']c@_+0ʃ=kE'*{wdKvO?D[Qa\kRJͱp h")!4ݫ¨rpSx 9ȱϹOI1UD@*QټD;_4dLj^mt Y]h!hb!C ܈9#)^p-SdA̬Vd !C?' .压o(j5t<>J`Jz\Er=C1. 1T==@`fq1UkpsT(;ۼ(dR,2+ڡ,R b=Q3^ݻF-8g,yIQ5h2TBB &&f%_2 ֺdm2k| $Щ;_AT"-z+ ۪RM\Z )Td=9EiqgI*-Ycϩw0NG X|3Fb=T)'-KJc=oa~i-4 rFEH$D0Z9qxg"efO-s*s^Šю}r k .Wby43{H(QcoشG:>aIBKQ-yZmYgl [6pxR6ɻ6J$NҸE=yR= ux dʀ]2hs]9-ή\/wEҪH@ ㄋmQ,b&Oү M ĸ3߬%tDr"kvDTPɈ t^[oSFV=Gdcu8%W\!IٓA=X,C\U dyUH؛ɫo^_єbI{R߿bcy47uT*HW3cvP&ryQ@UD1u,?٘! o7nanm&g鉈 9ł]mJ4 Q}(G*b\QY?5\&j9;{ /,y;0@+ʔ<,+v7[w5RJ'G͎ 4yt-zeu4FmFWX!tX^X}l o A_;u]xI$DrQK"^{B&Ml"/?ug{ 靇prыdf jH`cj Lh4J_D~ɴ>:t8zǸfܓ5<zJ8$JaWGQ 55sHaq牚݉dAQA ,!$6vVcNN Wcb#Xp? t+z6>Pa+ľ٧.pְP1Z0WG| :ipVsi@v%"^}aj\hh,q- 7Nt*XɎYP )[ҘY` y3kq G]r"hE9vkFO&R4:Gk&Yɑ:n17ķCfHwG-42~ n>_ͫl=4@#~Yue˵Шikt>nzWz+0+߼WgZ"4Qر?,2X_-ګv } ڲ7(q]SNئ$68P[4_E.F$޵uq և Stu *(,E^1 YTH4w4zLYE:d*~i_]~-A\;FGߓ'fS\-R.3Y<]w0ROv\XJ(G }υ3{a& F7[qMkcɽp{y* azjhKMeBZ؝!Gȁ!Ik Uzqj= ؅ wX%9Zg$yJ+!^⍩}uGq{,E3зY=JȮ/[aUfQ|{ ZE%9oS_W'-MW%uM/ DN*S- NiAF&BU"D .:j:V`r99 _GdN̅\2ښ Dm Q(ime>="]bֵpeW1?ehv~i4ۡ7d~{_'>o%L>ﭹ\q%|Νg ޻"Xot5Yp »B"OnH$LbhmO:z:F<8Pu8͌9q__~MG. o2fTq{dC0*ҥso,dSnju % { vn X{gb ̈́rj3bL۴\C09nwjU'b x@v!u_N--z+Y-T&eQMzR<`"F}ԟ^Jb3xwL@對#O4ئ){_S\~lF6iNyN2/qDGJ&8Ko d|j aU/u1 G=oq 0I&KaYi߲z}n͊[LjɱIGqpIJtš;k2?/lo%h`g ?%ތSWX1(֙ \fxFW]*QzEu;Y+$/_#á^bRhC}k1]ĜL䭍\4D=qY$<\,6[pQ't--nj㛒?~Ź$#s7%À~%mnЃ̈́anY,;AG{CWc'ƙ.N1@#wG&rKPˬꨂq&vAcJ(Yósj` z4*qB5x$-S@6'ȩjeYr@h>۸@c(ڏ:RZ.0faS%lg\q&}n3H>|g+NW0:%ǽ;>⣪k-%HY;F[+R%q6q<$R7iJ=nɃp[p^##gS2OkqňCD">^Bk$`(e~IkлkU*voN]q_]f5B caԗ-*k~ 錎ЖCT;aw:\0K܀YӇcD S)_e;k%9  s^=XƕU:wAdQ*jo-'_x[VIͰ_շӑLxFW)^獥y I3Ҋ֯x=< l߲ z$VDD Mw$tAqj<-6Wm"2S/x!U`'0-.N;u~3ȻKJ-hSh(63*dHn&!~:ҧ7ZbhuE!{ %}]o(µ_ CBMz }ۍTv$dAH8 I[(jN!NL딭c/ P3x#E&S6"nDb&|,/3֭g$X{uyi3oHX͏1/ŎXWVe!n*Թ5>댃Ӽ5@8fC u @%iFE4C`t'g u[ ́t D}*|l͠kϳV(CVY?VD J# h;N1IKi~=DpmO)=/=OV6uVRi _,C*m7.An˿vCvRS6}}7rҙV\,,vg6|)6>pp+2@Е9T5_k A:uղC7r& 񜄰+{hksAWD*5E6]?aSnyx99S 06+.Hnu7;=m/kw TOJnŗ3Eq y?Sw]g3o)&.%uXAM-4n> y7u/lfBvݷH_5U]khUdߧ(%TzXw͏<0!GIoDd}V/74k|xZm&pAAc~zQ#('՛(V]ØCy:γFj Φghrx;+H> stream xڍTT헦K$e`a[DNA@iQw97>}ec~d'o aH> $@Q[_ (_PP8L $JBܴ0;|J$B9$J -@lpo7u_G (!!; v؀`m쌺m `Rp>t@"]$<==A~ /t`7-\?CmCz w- `upÁ+;dcwv!0{ h##A dr]8"aqA"/ҠYfwvÐ_)A6WV'E1 VW"GgFD$+e + U `؁Qtswÿ% ` A?Qj2n/ x@'sl0?+k&(OHD7>AM0;8@ ǟs\A1EmPC7?QqB[9 ziGm8j.`km!iUGP! lq@ _kjlPo5JRf5sB"țx$~ n DLK[%_;Ea j-@z|n(Ujz3 /6s3p5[Ϫ=6F'6qι_pUe=[v;O@2<ӵ﷦:dK+DOcԽk{ 6]0k庺?ʣ8V)[ ۬ռsU68,xu4 dd-F"nB_i C!D}ZFcqv_wg}K ݆RۆW_ۜ>:gn_ZJr`RG,7%93'g|XR)dMBj-kR)e5V#ɽx;=4t?EXnR^@Y=S:VښTJ _r+Z?c 9K-8~cPR5.>>~Pm!hB % rgwedԲX‡tb[9Tq(bMR:lW, + t R DnCj TmՃucDl"Fm36UٞEmVc,ؤ B 8>sug6mvbSAEC?f 7[D]r^T˵ϩ|Au" ZA}ӞXҺMGZ46gx$JUb#}VvFw*0iRErg*ضcTGf_s!J5Bk[_ДALfxZ8ܤ!P$J@ IC|^IPqgY#u9vi#J(HGyU]r2zxhQc=[?/NuSE7|ֱ4@ZNqa6JiS ),W+AHvD0BGo Z?/(a:};3GfuvR}lA+xq`N(1gI$kc6渶c+B8esQͤ-ӯGH_=m]x6m!!D/) :jiOl wlU\o*ЅԷg})r>gT(S'donO5+x{z/劓|L!;D_gē31 ٝ17&›R׆.ƸW)B%[ DIR53Δn&u2slE~ȋ3AhDnSнtpԉ ]-cJ޺my>Kd5SͪK73׭Il5*Dw1)Sf˴Eab 6+]Ѭo'+qRv$iGdBۏ ;OYBǪ] u͵p̂ (2+p&RBLۣ#'XoSJM6ˠߧ7W-,G}^F(c[Us電 z|bD:'RE8QT pTq.zEk<Іaz,1zK/]Dѡ6R%`y>4Qō\A8Y7y5wFWGk1 /lki6kݢLe`_/a3kA~*Vfw-Şƃ,F8Xy'|yN1?gL&JrM)8؎w|cU9P!#>µqavtu]VBCXPn\#ixG^I7:h2nT>eA[aPŢL;Bؽ͖[w /׎`Wm΋blVNxmszvl^9YpZ>uuG7)WcF)pMΫ|3'Oe޺6=4Gw='N?d~6c8b'F=e\Q)3SM -8S qp/ gpCʠ? t^P0Wq`b,JGy=3ç$w%2nzNK1d& K m(J;̈́t&}po^_aWwhUuI3iwC\d.t}n͡!C$>TA5٧ #PI(m%Rgn*<|J7+0z6uGjMWɇ < ϒLU* tlV嵐]M5-U[z8a6g]Nڗމq{w +OYu)PmW VFdzƏ;O͹bf`.t1';55ט$!BO(5*}na<Z9۸dS%a<تy=)TP̓g*귆j+j VIh'Y)J7&Aa 06w'o J>3ş9NGОϔ4wL64u <~TeMnN>ˣ%ȫ;v9R7m˝)y, 3Jc5Z2ʋ=6E3~_ #7/)뇽51Z.-6-b=7{bWA*&t\#aLeS5E@N g`މ8cYڨ!DA qlꤥqg((  FYb4m3$^doYA* LQU]&d/R9=c>Ndu2=Qq&}XͪzC8S$iB&YiB uA] w#@Y"뀣]TaSO2zut頉Hu3辖1^t z(=~ Ń)C] 9SČZੰFˁݲQS 3~}_Zln61#448`힊3~v G6 %qW֦M)4b,hA##gZAH_uqHyi4ut嘝)k#urcI' 2b$u/TFS֧de.BrYoJ0}(9u8sF.0ӭ38pZ&_(F2Jɳ(n6O\OAO=OH3>S{CxC&`#&L F0+YLɇld ĜW_ż9wRxNz3?r370D逛AUCwf֏L1w!{M:5NmoC %tN/}dk}QY(|`S90g_}zsԊrKE .P[vt~'y~g!%ÙNh^Q4PgԹĜt.: jl~.hB(;lb P{:2- #[K_UeEҴm[ZDfc۰~t[e!*KYZ _K>{[v}ծŋ޲pnhxqƸP1#2ՙ.7׍WjUt<=UM}l/D,fz2cį)"0\š.thy\APC̀oHE+S o"+5WH[Yrr+X;lC9|,5s Aч258l]i>z[Ƴ"'P?Xt /*jfP[IM?l$_~}\ . W}k=}x>Z Ne$~.hr#Q&.wO%g+kc+a7ru:Hܛ3ȋ;oi.dGt C}|}xs]>ݱ#,fo0#x^aC]QSM..N#:$ ˆ^kI.^bWWPW@vs/v@Wi"W%W>q*Ω救 |G9M8{U_{d!u;Ivˣt> #,~ *}Xx3췪=Vˈc;h ;*V͟%{2³3+7C2X0hDk,Zw'Q^fЋp|j9閶tՍpQ}eX`tz'?];)? !d>9ű߇mL*[]RFj*؅2U  & K,9^!bFAQDiGJ U9N7s8qQ{4_FMX-cdʋ&?UE]kQC e kBdpu>װ ;c j=vk)"CDFVKx߫6"<'1o뫞ʲ ׀1WFh:ŘpgŶV÷ 縁=IsJ"Oj c{7YjWS<#! ڻ$[E*{7C9;MzpJXLgֆp=(F0^$f`j{yh|դ:&'iSrs.͆/T '}_^> TWN3 鏴 uV 9i\~^!g'AwWP~zJ&Egu@V\ ">T}O¡ǿfʗOX>5V`xvyWl!pVhli |HvċoZӻ,%Dqņ1)W]^tPLrOR79%ʷŒ8{c(dVo)an=mϸ^Z(R5IFk& b>&^aC2 }&:ߌڢn wTJ5> ' h\+=$M9JK^9Xs)=w K7yB\ hY|.q{(w(qko/y9@UBQy_{g<"cvMKmFmEs]!R[q-"vG2o<"Io >Ĺ|0՞uR-als lqj܏ib80s:1.$n=))#}[nwILmW[vU471vWѸkc=fgxN kN߯ >ƕZ_Dvafj,V*󈢐[d~}H8h0b%˽>]_([0{M>9.StOK37:|=;"gypS`o%%+~IpٻF>7/u~to%6ЋdT1 A>:s8,#y-wcu=X\ꗨ1M&XB_.{.iHp\|4.Vdp&6ulF^1{6,I<,%p|JV{ kWo<؝ sZXV$%wcjdžHK@RBi̢*gyͩ ]XM:Eü9Oϒ)2cv2~G\謯WW\``Ǐ/#$ endstream endobj 583 0 obj << /Length1 1558 /Length2 7143 /Length3 0 /Length 8199 /Filter /FlateDecode >> stream xڍT}7tt )cltwt HtJ  J "Noy?}~;"d*fB!!Q!!|vvC0g7y 01T<@vH"jàG(@XBFXRFH "$$7!x`vh  > vrFr%~@`mt<  B3 sC;K`sDzy('@yhht _d|? c/C`oe; NG0U@ vP_D;ҷCQߡԔv zH /32BT`nn (+`Uw_?u¼P_i8x`wOƃ?  IKH @YC_87!Qi ? @zx[0 DAN`(`_gT=> ! ~yBM wMu4xPYKK%gճ,j@a鿒@UDLןۃ 5 RH\z^*u7"5O䷜/Gna mjCK5 J5vQ:_XL@H/PH_w3P> `(HwPZBB#Cu P--6~U@ïyx&u v{P@pyj8@=QM@ (?0o)jMP\ ?!A$ oLL ry*E "DQݱ+mf=}} @> 'P6¥!Nޛ$q$sg-Iwe[LيO<>B2 T֔ 8ybr9IfƮ$3Z`Zp||Q|ݍ4JHY2OwП ,I=,< 5ƮџΕ;iY$d/.=.쯕%$e29Q+CYL"=-c VrT!Qf'Pݠ-0O}K 6빆?hRb2ٔkΆjE!TL[)XY|K(0Uj1ĦLټxe>;ř ~X]f5RՒ(ޡ8Hkd1hyچޱŹz([g9 lZv?&aqRDva"hΎ-y 'mqdó~EzGC~s05^zJUlZ?nǎ1[.;j#+2K~_dzu-f#NP^{/L3I{6gO'm+٥3մҽ)ӟikYf[*`-2/Jky!D*VҒ>./iX8Msc9Dȳú_czê-j#,BRdA|TMnlS&=<U"yޗQL=X]?NZ9#DxDfUexiHcn11s#7E1Y6-^~}nK֪-9ϖ`?pƧ%R#r%zjTҸгFlˡ(uxϕ x.3)]Fh]$=]׉c?gڴu wG-q&M5(/oh"ژd'ċP',Lyq?zܚS"UOsGNߥ:S/LRP:Iwpڍ;1Wb{7U)!|z0'Ky%q1,Yw/[GgMY^Yϰr=9"'"9""^ &Zs~}bGtR?7޸BeZ(- _I8[BYl m[X?9q^Aa%?8?fbbT0 (nai˴%NEځ3;Ga>}fE*lkPx]E7i>Bc{d!$5˙T"V7ƫϦ F$5>uyykْFo=^LҮd TS|tͬR]heGXU/(KYg|x:RXFkmGw] f8pVoo!|+&H?`?J롏LM6Yk~EHXjt)py vw:.Waϧ'-Yqygf^~m˯؈#Dn}My7V?~V4(WL⠰XoJInUǤ٬wOmVr`cƖkB?=1kYvR!t]Wh$[p 1Z5(R罘x ޤ6>6ah֜1R g#1rTt7Y% Kwq 򭚅 zx6ۍ˫!a&w< lsVDjJzhh?7MjG>4(OcEHuGgnpv4]vvMi=u]?01]H,u,Fvax(-[f}:&8{To!';ٔ)pk4mh#sֽ콓0mIloGi?W_ cT :`<{cO a.F{g>.x|.x>5kBhcCa]rf] ]a xU{GŰ +l7jx~N,1"T|. "t! yZ? kR_9V -[էQf2> b;V-JrbֆD\DmiQr]*.ޥ f8}z4O> Hub1<(.H^|eSӞ`su1QiԟǺ>dsij^;Pa~XKqnIK_C-3}Sn頣aQ-뤱oϤ>RO'c^x٥lw #uJ@DH\4/H[ 6n2taO9y9h$4WG3ϻ&o*yӀ5!-rAnlPi8M7z~uR\z]ȡ')= ׹e%b|NmouuNۓw\}E/`qh!'x_Xv'Q8Sb٧qSzɁrbIW Kt_fEܤVt h<ځ鲷JeU^daw u.P##F"{*pn3<"iܒfm"A/s寢:h-ZFoC=Od*DgX݅^^g5FO2վ]豾4IR(Uqsd\q_si'Cl_~ߗP}(CF{WۼÇ[M?gS+ܱ1w"Ah쳹BuY= &6LaCC*IGM<;boeUO8;Wla[ꈸ:ٝ<I> &n:Z9 \0ӞZUI|Z}lCƄV.sR$i,V2s ^l)EފBaq @Aqfd2[A+}'P/C$A?Tt?x$ͺ({ =ϫkJPBϣW)jFuB7Oy?kOEѲOUM!}`Vf*Y{_I. >AT4VV^1J5!r^~:&ǰ ^EJi {x8ܠEYmZlm\.ȲeXh/jj@ Ml2]@CY09{7ao:k(f{eI#-?q̂"(̳Ř4c1+UlP(V9X5l5];|KxrFJZS٫M{:/e oj;iq)ڦB2m6 Hw8H"fQJW~ɥkIQEi-gx>c)U eQYÌ΂e1C,J}0=Q4݁RWUPg7!^8ޭ`4-i:/'fQfg708V6Kgj 07.z$ҫ5Rŏ'*['VQ&m `k]$޾-~gb] 䗦|SU0zd]&]u RWU6"r2y1Iw }ucy1 o*tٵ5–ͳ^QӖtkjBⷣ_EL;fVH/޴"[n; ]*JX˚6N> Ҋs.@O0#l䞅KR.ߤcybW3pE<̗S$[[\Fn.1NƷ4lobNH1|X|gvJX ]e~XU8%V?oUd7Î\Wu޴NZ[a2xJrJ w38U >4uZtF1Rm)(5b]5Y[LB{OVa 8VL#:UqH/iOd*Os_ /y7_FYBj}pJxI6o<3W!I39;1& ;Y>AZJy_0 .Z1ܭ{ȪpJG gǦ#r/:*NhY>!5#`aLljx=rQ8u*?,:tqѪ ]I'5W,1۲%LƸ὾ikXZy0@l98"[zw$x>,P-O%ˡѤ@ Iuܓa)^>2A^_Yj#l6&KhzD']Ma:"YS]NJZ%CQpYط V\'s#{יYL{B!IlÕ )|LL߹"dE!MK#˞BFWka6ԉﴒ/K]ɵeïFj&o︿A?~Mb^\ 2uhիMSr|FvʐfbNS]@{ks[_BFz$H "z~bՇ`Z}~{}Cvr<_MeBQ|"GP˓|Fd.*R:K ge97)$ ,Xqx}kQ|$ 3H%Y,pVuPFhxI08ty= psB&q.eFSsquS-;|ņVLٖÍD#bOA_#"ofײf YYru՘^ z(A2FdwNE)\ _Z0$tKj x8u*(?/*.-o'6,!ފW"` iKT(!}Alej$S{2M,-΋1A(}HO|) e̙hzё\,>LFo:^SYEl^2~S/Z>{}5ήS7/_=c"1KAoAՖBW uY 6u50!LUWGpOnGNO,|{}.t q;kV4gO~jv% {=^ҁnUB_ϸ 9{&D7TDmzI@^J]ˀQh י5Ǝw^N8Y0 ٗO9$*M+9ݳW?|&j ~gJ˖-N $*ϛ'UʄVf"u|OWuG?; 7`{`^Pҁ˴&5CeA$%ռ"ss39rS!yBsQkTIn#1#-]T.֍I:}&Nk6w2c%h/7̆j)/6^]Kx+XA@zzOj.u`% CEK5I~ G endstream endobj 585 0 obj << /Length1 1877 /Length2 14017 /Length3 0 /Length 15181 /Filter /FlateDecode >> stream xڍPҀn%kp08 %'8=hpw!e9{{*^5:)PffgaH(jȱ8Y85vȑ. YH8Mo2I𛡢 `g`c3?@ QK88z:[[Z#ΌOw=P4[2̬` A'h;򳲺ػ88[ 3ܭV5 he=XV.),&@ rysqor eG /c #5Og33{G5`am(K+=L&v.o&n&v&onSuw.f֎`k?zd#1K% IZ;ݓ˵9C s?0wudY;$y!#lllafG OGJ?o=z;:8,Z[ y`gWKHsk30hi B'hݿ#' 3wyc(K3ofNn37 ?*&Wr _Mq{2^zfPrxg gf3{y t7D[ݟz &v[ͳ+m76M-"j&o;"|sfv.6.@sk_xag 8Xyپ-.oW YW d` rpLM<&ojs,  G_3`CXK9{? `U/YCo%72L|f?g5X·$d/-'_`/rqSśoe j-B;ÿ4rۼ;oV[·\o·B]o u!U'Ԙ:;=H|Ł@Ҽ@MmH];8jE۞j%רE_QXG%M:xl>QxKmL>XBG. ;;9AxgjW3LNs24͕Vg,(P1Q(P!b5b3rT.'IF8˘ 7ӉQ2?wOfw邮BL]FE(v&/d/vb,e6Ҡ%6)~o xn 0tJ|\J(-./FD]D:eQJ4pIɚI/dnTQ^`2C vfo o`g4,hAE&G<$= * 8M}dmemJd=9%1ug2 GȮ1AqSp4VHe.)&ȷk h&I)ԝ2C Ywyn&dR'NTslj[;5fͨEB$rDSSnuꝵeunTuWuTH_rTD 8 .ʿq@bպ}m"wݹSC9(Tobu13XMߊ*C:tTz7K!Ok!,`"Tб[5wGWMj`NǍA;%He Th)@TgB^g`^1kOSc=ڦ(E$8C9ʢG90/;6MJc%OA@޾F`t򺟒UE$5ۙ'Ɋ ON ܒLE(z֜gZQ(|XnOce>zL,(4'pF`ZhNzAGJSZH467vlrڜ5 70cfHP1z= 4M*N3bvu 㐓4V aJ/@u&jCEFnz=,bU!V{J+Jtx<0 $ew5g_E3_Ԅt*}V)G%d5od}N/2@y֦AecW щ\P#VĪ_ LJ|- TemX[y>e) oO,U1+"\"_B4pNJ`8Sr4]C@"b2^t } ^?Z%d7:XD'EfqC bCy^Y1g" 6a묡a,]ٔ K} fnW7g$!ZgbHYʃK9Dd^nɬ0Xsӑρ^95)Џ$ rӯ֭vN‘PhbvI!倪ʤ8#_\Q!?J/Lv.a*.X,Y\|e~Y/TSЫY9^x_v[KY f̵Q> a|kMfs ToZqf5.;ׯBMvi'Oi9XAeכ4XzU;N| 7E(urUmU 8e +RKa܇BBWWf_{A%[%'[(*g+FĬ[<".?ͤ 3LP][DHvp[BchXN%aGH`>"r+O)mi¿8'^ztwɦ47> 7 aDJY u%UiU2A['0x_bj-x ֜yf%$Z7*nս6!MY*ܵcu1CK)IgSӶDc^f7l[h%HUjaYp se'rfX?TC'-fjy}~uءsE1jǎ)1El9_"Q-w~4W馺4DXpPM`XGMBVRJ0[ WZ#i$JɄ?~fȹJ;H["pp+KG#u 8˹TiM?yg)kFז3nm: &vfNWi1`kft&Kg(<7$p{D8 (11V˹VXOr˖ϝ"^V!@n@|rld8t e*|Gᴧ =6-0?moBKOhٵ߿/ht9W[ʀA+crAĎcdZEv^:?V 7WR+uiEf'8`n=6OdRu=C@`]ye$)RcqY벇I[.m.C1lZH()~=);~ 6;t,vA@7KI6prkn%rn`uzn-7RY3=. Uټr/2:qL%$x^12|h}eNc !)+ ps3l id3' [PjpMcȨ0NxeA'v ]Mq~~֤=Aҩʯ26ڥ5^tz&j,4a"Vx[ޣ4 +j#В0y5lbYOk)ɹ)<#nFr Lՠư0H}0Z=do &%珑RN9i/_3‘_C;k-Qh-zD[# zsk)\&AJg-L^&;c`UQ@ 6VׅiS8N<LԜKַE%>!f57_ ي¢XgsusŷgwB>Q HOIt#{Jd0c\HmӇlU-IY ͣ_hB6H:$KB8c*ô;][o{xͽձT QurWV]6><"&":ݒe"dfs+$O`~:a/9xj4vkM3k3T(m2OY@! ~ FTMSY[" L:FؒC.b  f١µX&QPrYœ2 C/-mk{Y9c*^t ,%LVZ0޸+ 7i4<ߓtL=lre*0O> :#x]biĶCSA!1*-"] yֆͽNN}Tw1TiKC '5 JB?#)x!>CcI5)pFJP׫Dy%YŰI+bO悢Fk6Bss{_R_?/,[Q)λ4+RlʵN@U=`-YM-;`doB 9'59š ?i4}ʣxvq(4oѮ-|C^hK;*XJ X|RaTUUxtz!p\3,DOH︓9~>8nGsaё ڬvs8Nc9Rs؏ 彏zð^>_ 6I#χajy tK5go ZGOc_{ŵX3A Uog 毰D` Kƌzp2^T= Q5_4~*y [R :c݉z7AZz^j*#ʈdCO}S8}[8S l;[)s1ywp㍹Cy(e4dpP> !B?ao/l /a1I]zX= (yj&²QRГνXJGJ'2#< yxJ\HDMvT c4 lǶ\*~y _ךvב sjXL}DzNUj3_^^ GMWُ[xRTw{'hyy)mƖW)j% )Ul;iJ(KIk>ee806E{4qjunMV_8׫GA?/jm&gh%BX-.2&z5yք4unCN.A]%L[U"j2&wD"(OG qژaMw%ĽئXb~H`ˑy mZIAʻr34 l#Q_~Z-U P<f)C["ə02?ϧlK٧]abXd_€e!}|jK(ȊcbUhۜ+q.%077?2qt}$q d\dS\v?tԠ'},LCQƒ ?2|x H$r ( f,~2׋i=>~NdȈǪk e羸wQ@ 3Cr@TjōTRRx&a/N)->mvVһw0p b'SMvPìwYIWy(k!)PUzXbƯO$_F]dn%gw&ssO99FFl5(\n9{鷉 >ե(|"fj6Omڠa ٷHg ==;+m}xQL/&]to9 S 6п2CWSq 4s"^K] N?1J*W.0]z,AM =k8 N|^Ni&d uhq'֛Na+68!Zpw}Q0|9GI"+δ.ע\ϟư9J YWL =R~@lD@^sl0ܚ&2`Ige-oQH:m+a{Mt\YN{-fDVڙT60Fx"1Շ-T.$]8rL"T:ro{QbIm()!7h 壄lź:FcIM!ՓzT RC[m =f0JPjdʘ6:,aCu)uP;a EbR$ 1=GT@<@\N[aٌ{<: ٛܣG ?ENatKqW>Qca]~r ޕQz;d0kH7 þ[Jpu4T.o]ȷid/?5 M$ALˁ ccqT$nmy_ەPp:c[gCO6,(P>}reX S {925Ƙ2U9-YoQIa>?_x]cDݸ1#l10*ya ')  m&aYy|Cs<6Ynf'ݍ0kQpHrY{]1͒S]oN>~lªo~41'1nc5s2ҜEcُ/͕02[|^=pYs g%2m-X:H }BWh<3pv=,Fӳ*J$6RsΣ4nhUR/rљ簅IN4:H@/\1hĜo^%yhlm6.b(|=)ȷe)þ$A!)TɈ|Ŵw4oJ;3_MEݟh4ZonwQ | ϲ(P6'5%%~]ldԕR9$0r.TT{.E 3%S&#<R28mo^nMe T*♐t? &H*VEK_dS?^8 ~꿫"9_'hO(GѢnĬI8VO|ҜVy۷IDj@A<#wjZd"4ę:_gԤ#Er^n(nj̳Έ0tGyynE ]s ʈ)ڠR`/pd榦Ӳ &?恐ys Tcȉ3t>.??ivy~PT*\5N֟jp@uoE(6TVI#N{ ӂ{$m*1r5-UτC fʥktZ$2+_} )i~-5`A>tQWOrSt7$"1{`_ks^F{$t0& {d?+@ǍZRE /J\gFC/?pZ+yP/Z#aVfx[29uEIPHuŔg D; ,u, NF .<&9LV #v*X/~Qmr8dQZQWe"k,mzGx}˭Ϡp"^J)Nggʉv_`&Rnz(^ _H&Іܜ 1B}ދF+).L|^#h: *I+л݃2QI"Lʹ_C:R-(Q.ҹukO!˂l;f-uIgCN+` n 92ʊ*Trilf[7TpP9._ǧ>h6w6[}V.^s[p΂M~#oe~C[gQ(Csl'dl)E>l?*0{.@|ݐ YxCvdP +z< ^eKT焾y4'g}()~Jp 4ۉ܈̑TDib*+ᅯF3W]J:U?%|aN%!6T|Ap6f|z0(b~IN`Gz(hu׊!_=']Š4Ʃ -XM][t~§;ͻ)3c *Rc#ʓy mRUi8ui8Qo(rmkܦ/ gk|6-1?;wo4*R"jHEn/4[A r)C" u1 d-g|7+F| jj631IЏٙO` ^B3>.\١Z3D6B“+\?sLLڙ1ѡ- 1[F4.zq-qtm=[{!tgxKh|Z"v2c&o SyTKɡb^kyҹ"Bg$fWĮ| )eMd_@&5hgD]^t teD9a6%ldFPU9~Aϱ.]RKlh j(w4">6HhWxlՁ "1ӥ 7xzbp:azSYgi$H2jtv]!X"e%"}1@,#~EYǣbmM`y@ơHEX6 YPUĆŮ&XwZ.KݱE&CYtΤSk:>ILo(b*peT](A'i4&+5)Sk/ɢd st.ܗa[7l_ Iפk,J=%Gv38D lnjW_ Z#1_R#8 ]p}64ї׷I;O}Ǯ&ѐ\YEM{I}HpЧy<,+-gشnAY=F~[g֩aJaxDŽ 'x~] qef)HTs/MkIӘ qs[D@T v$ *CzB3<-! tTl#δoܓjU؞<^!`&D3 u$BqEXW\3(mBJ~ L9`1WLAN0㓕}traa6H4u{Kւ!V܄эD>S.?Rӣ$gMMң$yҷ#f{G o$:RڂYtmcQ.v8?䊸fWF3T?eL(ʛi-/+%" ]6@{8/Wb T]NKB7e8Ys~|da)_8I_JkgԌ9&v9^?Z4r}6E2:7٩YGގe1+ͬJd iI>-n\c/dl [Q}㱥^nKHֆ2d=]0h&U\Jߖz;WaY*0"%g&3ۂ_y“^__4FkD}iC",jB!yFψKvM\h KgX]ϱGEc=Z fwbŠYAgCA 3#-.n00zdu'JO3(4\ O襚Ŗb!Bz.vى|ЅѭR${6/R,:9YF㵤<*#dyEi#=YTVpq#K [0(wt^k>Ѧ)}O)/R9Qi2[a5 mihH?{vK{ʹ,8fEQIi|^<P6D|* .pwRC]j##CHqZ+QI5FGh< s6݈?XT:ir<\ѹ!""@FD.mz}hJ|]r`bgCK[+b?D@sCJׄqc +qg8rʰ7wGCOBhq&m}w@.Ӳ,]!/旿T?|߅vC-Z,V&>ǜa{:Wx_JMį P~",-4}8*-p\4 OEʚLpt,ۓMҊdut Z$-3Qf1:ǜ+T w/j/-c`.nBG.Ҹ~' p"5(j>즥+Fry} =O< ^1]>,q^.>2.'lHX/o*LxL)cb~ VV?ݴ'; ؿē P&'qY(ǹNn!DeǵkmghyBq28n@oɒD*:pm"wtDkRԐ`V}=G磲Ckpأ:('4w$5ݔ dE6i{K~]"Fe"p܊~IW:G#U< &?;ez|nwlf6x&yjނU: 11O [wsνby[3(@p[w5VșX|;|n,u6hم՟S/cEGNz/B`JNC8h=z;MeK;`ŏwmQ^ oMh|,;YgeH0" -uH)g9BPBq]=Q~el(Nu!u!z<8, $Һk~٫8NzxVL[3gC?} lƗuP暚j+ Jq5H6{п L;ΝUyx1fNR-Vm(ܱ;9+QX>4^ݽL1BuB7rU[Йd=N%1Fa*Y~EK`;*N"vICx/Y2%)kz]ʋc"Mr +N]&RZѪܫ9X$= ڊiyjEm,+\v! 5Nom߾9.tCS~*ga+$u"6<.w38P!補Svƾ{͇at*=G8KJo.B#1OŋQauͿ`+j~Bws6_Cs صEgW\GqIk.ίOJd:λnTWjP|hM>TZ&)bOtJJHV6Y~K#՝G>˷U9Pl/m_UsF YDҞN{S$kŔ24%ι (@)Vx(5[9la F#qb4]ҌqtmMtwnto^$3/#,"'uḞxݲd3/϶ 'WQ=/Hc.):ķ*QL>h?kzs%8#C8q P%t12+'qWXePs$]D7uUrZ~`|.~Yi[wɘ+1}%#` [F0Zc;qihBNӚ\ON 2xqh0:|`y%=!!gH?n}H*׆],P9D3JZCM86دdo;>PH*T Yo,nd endstream endobj 587 0 obj << /Length1 2924 /Length2 20968 /Length3 0 /Length 22610 /Filter /FlateDecode >> stream xڌT/LI))!=twwtK7 -%]tJ7  s}kXk߿s=Ċ*&F@ ['zf&*3\d/dk󇄨 L3t ̬ffN&& mxb. @H.jk23wW15/u5dlh3t2Z=ZTlA@'3wradtuue0vdu0@G +e5 0TlM\ 0 d q8ۘ`)Y?²]3?ed󗲡; ` $dܜ6& m. +C#_$ d#/32ۘZ[m'rws-ml]m)9ŷw,X^+?Jo+` Sfmt 17)NwE4w3!-ٱ; pa~ Z`l|.صѯ쏐6mbf'j a~UlS}e}Qh =f//F߉B@ǿNl":M3 MJVrZ=d.l|m68Y/fpr݂>F'sC `οß-ρ 6{u;f%"ץb_>/qly,j\wwS=ڝᒨ3nzPWũ~z7Å$(>z=)O".LbO #@WiS<ޙ Y1k羲ѐ]jOe"u?͐e;#u'A?wCFϙx!E>b-`XPeq!zG}>:E)r,=YR?D>G5I|ʣ-+d-9J_];:cw MŽz{a&r.1p{0ך2ǧuڦ[[+"b?C1` -2Jj=ZLMwFF+LJCA}[|(-B5wN7Β23iިV*̣+~UDz#qܩfrZ8]gNPL-IT \m~Yޣ m1q8̌VVoSc:~5F{vMƥm>ƒ¼оH,<"q(=l7H;(,M+3ɱD/%z͔dJ?~SV hzA(.[C:5ݭ>6XYZ;N!7}Aް2K}uz΂AxT{U(~טii7Y=ͪQ$ݷvLb]^B9YG^ waֆjdf3nV(W#V< ZK⮞dէt-ͦ JHaq ar =*("3FFhfzecYij\;-NJHo慫Js9ڣؘ!ߧ̲;k jMNbiv64TY)h~dLHEh_dNP ~$ :Kmꬿ8XCIJϧ\Lmx_ [pv^RQ@N2BLڇ᪭LJ63':O|k\BfZP',LuSlI ElzҕX)TSlq4ŌHa#[&e`{/EV,1A+󛨧V?)n:$ӹҕݣSNG>!gilkʞ 0Kbd o3xמ7DltTK[=Z9_(b+C!<$R?~5Pe_,T0?:\aE΀UO1Gf"NVY9LHF'7&1P|'*u=:Pg>ɲ78y!IX ? :,} Trq E͍R3)=BziJX2(2[H9htZ.Wٍ}2J㮅ǐ6fJfͱX["DXQ=/?ϵ5堰.r`\獪jT@/hcѷ_s WoSnW%vaT0{7s:*JO^"P{Qa=pw%4NKwdˊhh՞. @!怫oA^VWa@\"TU #4Mo{2fKp'n{- U06 MvÈ7e&:z޷OTK̝.9rO `~ZSdh杀]xa qPzlKԮEHnI)w?{ |-g*t2M=Z9PL bO#jAtm;ݞK#sǻK.BԠ&f<:dC?=@%`?DV]?䩿j$]Ð-` qmK虤I+SArhӫҜgFMkBP5~] _}:,\Q4O?Fx"^W|n QH/̛ Asj.QLFCTbs'F9h &Hvu22FGuuf]'OZ dMg~.xҁm3%7AxH նCBgu4kG@Rc~C XʐIOI-Rt$Y 7F"9O\^+˒kg:- oWib2 l`n5'b9~$oM2 Wj{ )b'o-zO8\= c"@n]HR'G181KhH*G*& j}6.쩼}7*{g;etI *UK 3 & T<[g P)veWXzntKzcƺ[U! ykNTWDNx'u0ܛEle囷IS/f'iI\˛ :Ϋ/ژaxD Yb9{tflB䥉#&.~JTZVԽC3j}iN;;X*7!%.5G\懋 .&ҲXoߒe}UF?h65nqo~gfuǮY-3ﯲ{{l(V>q#zr%bَoϼޔlVIB՝ R͜8z0&cܐLG9ק.槻nUJ)sp<$!*l8:DFF* NVlRע:|/0$:i`o8^="0z;΅Do0p~˂[^JUj?{* NB, f7] %`Ye16L%/s03 t;$sؗ燡V?jd$oOP2^ݸEf¬g^Wz(|Tg?|%^Pc ^#Zx8j]>(,cCƚ&1OO^~P/ C֔ 똾N=SV%SݪB&"m9++[ܨz0#$Y͕}S')1Y>Qii^,PvWݡm>aVޤ,;qߥ3QK&;WTј_XE>3imᗾ+^Y-{ԫޫR%6@z= n~MWk?J>u}6`2H>|X^DS 5v K5O0u<, ,|3c,u\X)9Zxsl8p&7CFi4Ee^yׄhJ{!Ph)k~'wLX;C3*]\}v6GBozkoQvF8}>]G%O}``!d(+u?$yB/QIvSy d݉ 3G5ty@@$[}ˏwJ{TI7K$0+F4&9RJ5Þ=ȋ!屋H;?' HVcFcʀhb>,R Z.eT[8{X8~ڏM\"VC +ol 'f\eTǘ.mš64L 2Hz>~|֒.QfLIOu*R_ި8 H6Fθ\/[-]ȼ*A'LvJnS>x\g/b JFF-( 1 la! AD튊^JfF␎1"Z}ͣ1}13Y l3lwPLtiiR1>/4"h%+6&!rʚiFЍ.ƂfrZ;%9@`J<-4VnYBsmNY00 g4?u.ypAb-^5t؞ոF RojPtQӠd@Z_zӌ[7ļC x4rgFr28)F2R{6SjAMxfݳQ^qh({*sRstzuAsfQZ '!Uω%\(rap<.$AMeg nXo >[F]9nzql dD'Gjl1d'/9 +s(y-XLYxXEEcyP]H|? rw΄Oxxi rC-gUm9-C~Q My,n㩧jϝr> ەuQPcɃܣkI2 N}8'6#PvKX(ߨNC%:ԟ}po0%`|vW%}<ޛcL?"}w vhU'`spxV*8*I׸6Dm1ܠmu#4uD=HHtu$I.ƍL]2 )fCUN}i0 >ŤH(UrkBr\BI= =LKYT+^->DNkB8xLNCq'WjQ:ÅCҬftl>$spJIDnM!>4-˙@]Ư?dGXS@xO-DlNk \T7e 0nx|;0?Į9 y~OkʇZv[R'=݃;!/s,zQejjվ/|(pְ#$ӘۜmFCIwl.5>fg qi[X'jyYym@*7?%^OvӪ7/R扩wɠ ݦ1et@V7B9pcMګNWgO}V9+?t0x\fʂaznqTQ)2\s AשǺCa0˨I4 wU~"v"e.:~"Ao2 [x'/yNɭq=P`AT~%ӌ)|}L'\;R<*91mGm }MNv ZJ2s'* ΓwW.8H:+ߵG9…S〸@#ȹ$= ^vFE0Sgߦu'a4XdgE48#:2LjsQ|5uyI$K 4SP*w{H\ &qgSu1>}P5#}aJOl!4c'@{8ɓ3까i$l./&s{xo>as |KqhV,]&>'"ц_#>M·/e;syz'͛PL2#%^VP8q)qo' e*:/G]T"o|oղ硚!r7L*7i֢G ־\^+S uOE3`֭7^bWޥ1c_Z4\=ѸꝧٮLD( 5:yѺƺ2y͌&wQKAΤT: j.:|T/vZ ;DYD5@b*4vCF" ة3t4,mZ3xDw'TI Fq =3u1yz#P6'%%NxKrh&]AjEg"94*n-:~ 8jF\I>QOhꆚi'E ē`:7jXӢ  eHh3eE޵0lT)|XC{<)E%p;{rx<&U݇όc|ۜ:Lt YQ;b*gO҃,roRC:_f׎,5R>L<r`2 [2J%%퉓tffoc3>Qz/3!'1 awG v^+ؕHBܡmTSLG\r^$.swO!ϊFjǤۺI!+χ9QVzzF.;`R4CVw|)'g :P XVCوbLqP0PU)pJOeS JQVԴؘUS W G v^Y~"VHX(I-fI;N^͛br&];Ȉ_l`TpL$i>1@y/k[4X3kA7e-̶d^4!jJYRFW[_nmHY:]Cw  |G0f^oDi9_ޘ%S_&PXC'Mk2o6;1/S*T4|ww0 ]8m@1e0+? moq)F?5U#3Nf!y;@w;3QUFNȊEQk-/qn憼z]L%)mª")"/QJ<^Mj-i8j X0ސ̿R셡0{rS>LkY4Ci[&C.B_6Aۚ-5^1sbc~+m[a.(;Ky-_HYS#/ډe~)zQ +Ƹ"; ؎T~]'hPPj?{DVMPd-\"VI/hF z~0N+ѫoZChW}NACed˰~}<5:Cj^:1l7*U:5[إL.%e GV("^χqM=0u~lӹjB&^G):/a RXPKzWFK2hLY/7{ETOz*ܲ]Qxp"ebpNiCL * FU]/1E@e !q*&չ}Gl(gUl=q[;( ӐWAnUyYnQD ;ȥ6gޡ]}ͫc^4=YǞnHb㲖S ~?zR5规B 'wѸ"]-o|1ۮ0coxG Cu%_rQ 7+ @EUiae(査N%cUw׍ߐpF[[孥([d"`)~6ڀd;sBLN ̉a2q<| i@ qn(LA^hwX41NO-**֖rb7~&*߆/5 bS;XyҰFHo KqsXh=[E;/%j>cr+Sg:F;֣&,ƒAq6/}q GtvݝCAM66]L1@BF/+V]S u$RhR)fexqBqtrk2IֶVr%^'"KDckAچX}º*wxqUHÓ'=C)S+yzJ\y]0_~G:2WmزXGd{ aP7}kO"-e+2ZpWNF DHw&\Vh,^m8$<֦r"lWZᴷ+.^%DJw>wI]fڢ/'c(tZ#lKTn{rmiAXLݹƝb{  L;RF 9K#Oډ["L>-(R\t%{(#OU1c0JpS7+G&EFk3$/i!޳QR]]X俎H*`T.L u\)K>1E%#?ں=ŽJwr C%x-aJ5NdX_%Vb1yĽRHK6rbHWL 累QyvkVfhD5<Te+brZwcpmF7f7HdR(t/rO<&kC}xa'YnxgI>JF_762d$*,YXPy6#}^9[l#شzF ;q]"9Q<O_ĬiJD-QӨ+v.2d'UŏGV"_ݻ'q(ڼ9Ka@%7X3 =E{F "4`ӇƯH+E7vЎA^.T}M^/QBFp;tjYa3 sک%6^{jjcэ/<ǝU覫=$@k]%]y(+@쪮ZC3mtkd ^FM֘oe}, ^T'Z~N9N/X%ݫVDMkI&{oOʪ薝,FWe?'tvĘiV߃CjI}GoDv[DO;H<;x5ro`0 uuu`..Aߤ/M}w9Z YʛGU+@M2Hit=TnP9pUvr dѥ.*W<:@P) iܷ0֘C޺&eK70SLn6&n"x?|elw#cyJ>I1V$MrR@FdqT :sށ֤Ƨ3!X.;d<DU3:~>wbqiwRRMPe yfFp!m|x{}eڢGHu-ܲP ȡ8xÈ[x4nN}}5=A]ksֿ?d‹޸N| +.#k(%n_)l$yqGsY10 )W_is BpTzu³ax+(?a|f{n-5j1bcC!_Gn%b49n o?놮 %0RԽ_* 0 S3 +8 Ng?-aWmN,]5̣瑒XoˬSH~*k0aoAJ(2ʕ“ʻ ~K1)E~) ȗt56v,K/?b48vqnOKhQHj{Gcv55ZhХh&Q|=㺼,*{*P ~m\7kcz=(nHhhV]O.<^%L)_<᝶)G!V7I@#\)UVHă-aMY!͵vE;"oCmtZq rO(*G83op\yyAmЮ#Tf ܒ%qX0iPl:G1֮ifMfgq(sNcW ^]l 2q^x&ipg93C8æs~> I9n5 S*B{029e1 l3T¦wMsW}uaۡT ⅊ +q/t%shix#Q*r,Ft@qgrE)-#|=ux/X1+#Q¦AS+ MN4wkbK5&io\56>F'o<"M߆M ꛤSw*Y0+<-7U+4Gı豇=CHOh "I 4ucY`VFl"xNHQ)Ҁހv'i-\Mv`je-nd9qP"hrC 3hLL\Ɔ&M 5уٹk *}j@"cp@;gMLt*OPc=<3S;\_xL@ԧND-:Q#ttTYR!iK elŰ6!rt^``w u%/ݼ|*$ QwAw>K ^jYxR&U=xq C.a^\ cpBꕠ{d)NH2Ej/J中£=`[9,ŻF1ZmnL(` B}(=%^KH|h0PySW[ 𽸇c3?zJy[ ʳ#M5?ay2o16#~za`n!&GŦj l9 <*`]>QU~}3}8z眃0^'$}Nc>{XO&Hh*A'zyˢIPx559 kB_4Nl[%OjDU2BǼ/Wk }vWYgDfna7Yz%p&191Zr~#9 TwCʹ?:Z*7J_̻{c~hQok@bbIc\:4qqC,i޷Řz#vo\ PK]ܐv؆C˧U4BY3)8ـL R@|+R) ]_Aj{a1.(d=C}R0҅훜L"H'SIm⾫m@TV>R),v&"V#_>%hM"euD4@5q)"O-X𴌥Is\V;`D9e MO^0Q;DΜz9S7ml\퀖~ L%f\zlf2{QiON(%Ե}֬T6/i)ȱևy|oq2;c(JfR]p|"%Mi p >|0b|!BBgيsE;#Nι(}3;gS&s)4ncFuZ"ы4yn"E X&>F6؛,h8Tʙ-ߑ/! #BX^Tg[ -(=@!tq`QG{xݜ{z*Fx VT*/ &uC:jZXi"m|wfGi9tm&LWQԦgQzbiXDq/N魄B{U.U]ވ+.zL.Yo;޽+ Z5aN>{ -Xϧ!;GsGEW*Ә~m٤17}蛕mXwXl*/b WzKH$w}oÂ8~ Rr (R;Ԏ辷4ri ˶Β*1ܾnQ(vwM ʞ,8vv(g>x>\R;|W?2Q !hvSg$fe!TLKi|2'ğ T"\Ki;EVC 4L^\TB5^O[-q+,o@XmA I.x00R+=-Í.U3Գ-p8Scp MT7SM>KuZ3t@TE'[M\q~ Z<@ZA@w1A +]w2~m~yw;{AHz ;{v@~RP׻ ͸s_ehI&}Ϳ]P3)|<^>+ўUa0jSdB%RIJ`Aio=@ELjI 8mVh57uH3Q벂f&|M{524U`hEYjm_*ܙ$z[v=:y 1^4Wo{w\84ԕ&/3N:**K'~LkF ^ޤڸlԈ^A!OkgO|<_w٭j"m7yݨW W#PoXY"WezNP 槬k) TO,] s+ZUlDShDu XQ߹ c4)yCD0q))ꞲwKfZ8ۅכOP6[KS>Vz#;{(diWͰW/+6O;hZ=;( wL <% 2ƐUP5LZR&UZ.Q4uze[]$DYdӅvP+'O(eAg]n[cR`}옐>g.(I>pTz0y0 |!Vѹ5If d业"?ެvM:,P x,cȼHmRfģDMR9&xXyo.]dSjX `>nZ`2IDPiqRhtaDZ&]^<߄9 GTT nAol&7ã5Zn/UoM; *cG=~|O("WYzۏboR n7,8F$r˼/?Wh+%ӌZU% p"-zu\[ʔ`S7N6ي~TpYֲeTv aE<>8}e@_T%vk;LThL 5{sl8kQ~\LA7~Z*%sAx#%VxqyI4/[ҼW^*p&U7) `#SpIsRy[7*qAldy!)5l` !08]=EY՗Lw-i`Wĕ}=]VdBzwFAZ6X*R zE !hIFE<*Rˀ\4ՅVhfx\ᗏ,TL.7 V媘NE$Yk*fonzc\>#w(]o* RN} Aw78 ۯ7]l)h穞]qPfMӜT%4J(g~Lv \'IY֘^]͢{{gG䰜LVLv E%}P Ku;- t7o?`˖ulUmIeEX8vZH~Z|h{K5Ml? lP7Vxaϙj&vK.P" 1vtṘ\lAؾng;_4̄-SuZmcS ٞb?/OCӪ<=f@U(aq!9?Fp1HBq|\hl*vr^_V"vKYL`œtle] >HXm!PL7D}cUu'Φ|4agPn[Ք&S={I|)bS? B^ӋT(GZQ13Ĥ*^x F309IGQ5;w9Rd sֶrKܖba8 pXq# Z.}sly bcbHp kҝ(J3LTvѬt/kYV;YtW03!h/Z4GFHܥˠ endstream endobj 589 0 obj << /Length1 1677 /Length2 4043 /Length3 0 /Length 5077 /Filter /FlateDecode >> stream xڍt 4mؾdeI13ƒ}'Kvc0f6Ȗeˮ"!#oh9w朙G\ZF 42PY {*@ 0YD$.n&c 3H" ǩl%"dMNfc  TI ߁x Aec<I ~Dq￀UVV:hcD4NH,DXh$_%qnp ȇ+#`:0ж D4L%1e׬scH䧇&"{jO]PhjSš)H#_1 I I @zH_x?r 434\ !F!? $ )Ȁ F (pC#Ȁ+0#Q?1D/`al~sdLb$q} 2P@F&( @[ J`o>B}1H@;@ [)߬P0-πǢ1~"L!364E\H74_m;EIh_ؚm`TǠqH < 2P?>!o Ѭ-Q>Qm"'~ c PƎ!}FdF PDfK0|2FAn #A9a}۠Fo ^ fdP 6Ƞ4"1 7A 2AFyd0l:B$2`7zH_$ P ,Xʌsݤs U[{֥]1<;)Qe'r꿘"]Xr>qW}edJ3>ù ~/jҵڏ;=;1iPM4gwv)Y.[aB'O¸C**st;ZL,'5) >= +7U#RqK+.>R_h5R*^$Jj̐ߏ+̠K FNTn&jJ)DΨϦ:9eCDbH s2[us-dh9GҺotzVP˧NVch״GQoiyV.< h%>/nssGjI}bu=A}?a|^:o*ӮС}9T禯Aˁ) OzD1xsz\+~]f/tb-^h6Qs/*ǀ'tbsoUϸ_w>'48q,OԝWr}ޟ+}o;EMyWrE}-g_s]Jy[ z<ܰLWEqK;䉹jK}ަwD b9#4u/{N4>e /nCsW+Z?:Cp|olD y*)qXr4"^裺6^?Xھ|9D~ 7Wi_rU}Wkqb5qzB oFb.}T\W1UHϯԉ7(}8+ZpM[(ܻ'XMT:>{شZ~SCBPU]*ZgW $5k,V@ j)=BtΊ&yc5kv詟:"4jxpb/KכL٧w򨂻& Gfpwy4eIy]DCɰS?+ Oeu׹˳bבQ%% (IO/cl/j"SsCd.5U^YD=dPxrt*†(qcU A 'o|н*2u&eOn1>k/k!Ŕq$}ϛ\'sy&}f FLTe&&aws.,>a.s~}w2f}Eݳp;`7)f0QxhOY?{Yf>ۺfMwe^}^^(sv6Z꽊%?i\ezT>֨ӻoSvruG&% 3_j,I6їyR*^G5k%h^ ]QTUrX6M#gii l wmcAXg}X=~e.,D Xr&Us2/Nj.c-GhO*=c5<av]0һ / X9t0pV! 5/n--꼠nd@ἄTBd8>S Ŏu/-1Zq0&xF\ʋ>7QeL7,2_si\( ,g+M}f;h!U_r42@pzP$9W rEKWvܻVQN8#RM$ɥĒ"e4[gY1rTNJkq_ҖklDH{[<95Sb.yˏN*?2&=Pb+PB{b29T3WxEx 2hIEG,D)'ٛzGKWln{4PoRzVUicYB~-fFo_挾XLq^t$6Kz4k*lUdBu“.qum{ms•xؑ92HQI:iZӴy㳯-ʼ hG_=qzJ7{@* rv wn޾ZwxzJQa`]Lpޘb-8_9+6;M$],G'7j$x_^+/O>dLg# *٬qޑr[T+1eWХA{~*rW:{\I8}vWWx~(`{/uD稂-c7Y/l\hMms^[%]sgUObs::γu#qw8I#Pt)B Tq5~#E"q<Ǯ:sM}{'1Ҝnȹ6&}1UYm*h/h\zʼn&nRғj ptƭOي 2>v,(z_S͹Q0-'"iU(|Q1q3.M6Z\~I]~w:57S3bV:]չFʕ&+;o*c./*݋ OݰI}/-A0r2o2KŚ]:w&/T0kѿ}\)5Q7I.^_s_o^Pucos5b;GV:q.ߵ jf.yV':U&h=BP>W| ^;^{r=ؙ:5]tC/99۱ b.Hְ~>;`b%$}Qxh kxiPߏo[@pǑ ٜ oMVmbuuolϺ:X2z(%?ۉhmW9hpv7'3]hvU#r2/MoftNJ^{gΗ:|58u~| V4i5Ú=򲏪ly=\cA-i]hsG6"v~Ww }w :+ݭXS=Y,"La?RiDˋ-z7~[5kXD4+ǹ|^Azfl=A©Z<{GJGe~=G}Y^%. &_j\T(h%_7vc -ZWmВrK8V~ =%Jxy]Rc6(=eX+ ճIIipO+-lO_RE\*+Zg|:V;xš6fU8HӉ\SY*ӕ#u/eFwM:l{dpoYf瑺\NL,F{5Phҿ0po- uT endstream endobj 591 0 obj << /Length1 2727 /Length2 12868 /Length3 0 /Length 14397 /Filter /FlateDecode >> stream xڍT ӍH7 HJwww043tt7*݂ %)!]";{zZ0g9-$ p T\h6h gX)g+T&m Sn.  ;;]gA@\h ^6V֮4`28rH8mf`5hfЂm@^ l(j qedxظZ4A. gwwU3ߕm\kA,]=̜A@= g49@KAm38X9 @6࿜̀@ldY]=]f`߆f.9/fY s:8.wheR7?igv/O ,mpsd81ОdV W;;;?;y~r-VqXBX|\AWg7ϟ"4 `=EAc;x ١`񲀀:_69 %=+W') X88<<^[JKnf5x `K@ _ ? oUtA7baBq\M(o ɺfK6s:nХP@WM@/ j\͠!6.6 uW_CF!.6o ;A hM\G ]f!`l.Nt=-@5 q,!h&[7I>!>I?!̿&8lrO&l O\rQyBP.OE_\4rzBP.OE A>!('\^\ _ j_97o1tm\\Ipr57sC- Y!Go?\*࿈J쿜K:l@hʧOz'7?@afiGjM`X=E~?Π?MDhCch aLm#B;'ch Oy`N+f9K`}1 O1!xqp@r|RCs8Bu J }0Kfy:,nh\ 8]By]@66 ?: } %bobG`('з@w4М}qB P 4gh$o s/ݜw^}5k b0wRO&cFR]I kj<52 NA'uĒIO͘sbeI+/?Ũ~[-43AdB$jwsl0af9SF烊zD tQbʆ\bQ-LS!kVԀٲCe`t:VUmTQ~GWX48Jݽ15\9A\N4;>dSiAfQ'_߰)f8]GB2$X[`hH,1oB?BMR跧QA4Žl-k]r>$i+]}?Sǵ'MM(ϾQ[g1,~9T[I* v\`Wlt +tеX,を'4[}^iPbk28u]/uy?{zКy~9rO?qAZa&x^'s9Oմ21QvSWHS#!6z cçWXý=+ޱ-ǢČX!mFUzO J .AL#t IP(Alry '&!(l`QZlXh!?^3G2aŶ΄y!EQ4gzbgӚsN9Y'cMcN8^]8(o)Z_uo ͘@= RuLI[1Q@DcSo^,ͳ7#J)KRY^H7V:tJ)jPUF_ LQ8Lf6_I΀Zy(qU=binP]UN*2KV+_ip0;Ržm LZh+5;q#Υ[K/Ѹci*s)VUq}bWՋى7CݳsЀ*"5*IYĮ3c|pҔq ej{ϔƛg]ɏ|ned ?'Sw+bK`냢o#>r M,ncjNQN*ǯF\ ¡Ov6x"Uv)nײi޾ b}Fe0R:pdUk#BH2 .ꏳ|šΡ} AX1͹j> o|$ьٓQ5;Ԕkou&r-|{Y{<_)+u[Lo>;<Խs6ٜuޒكA3ȵT:?=pS*e(5:xyOݱl5lf|iUF+s$WcH RRc6}h:-w6G 5q'D}z= lhs03^ /k/aHy!V.,vWIΑʭr\ rsQ~d6F{_)PZ%M_ɰ.Gz{^pŚt_C49F -ޒT>]aƃƪ /.3E 5zr$3*@aLŹXX=+,CKd9KX]ʋӑh$ԳJI&WjUj犙FmB!Do097S趚kƽjÂ)Xly^ͤF}<SP~U%|nvͯ/CA5( <֟גW5[A#ض"ײlAE=Њlg;\"JRsur46l}NSӜʗ $Fac֌vʓClb8س#[4)]pmL;_]z厤,{"~d#g4V):dU"иHJ[3~ԓUii!?=I((bGY/?רK(^~Z .q ӫiCU mSKlwA@zpwHD(=?(l$B,cۣkIgz`HKeNsbqf9bؑoo.qۂAAvN8^KC/c4`iZJ,^:SM|COH*ⱔޗǻ. >\e9"1׋oN]o},_@rgmYM.jLNh҂Xf9Q(%" \8 8ˡҧGݗj9zL]鄰8GsŲ}-Aϰf`EMFַ8fQ l9MM5rF%VO.O%ڍRӚ`^D>+ wсhS r;Գ kpGFA2賈]͆h#*v3xD:ƄiB: ɑ ړWa?"IL\מ|Qo5$}o,rJ§iIdDWϟ A^Rδ|fS.,ݛlVu4oվa1E RsH P::qxUjcv{B /0zv}-RfÖG ׉g}C@wA.Y`ӴԈpZ31=8XKVcN6AJp*@%?BlA~%.g{&nlwgn!U.':r8yI8Ad ڄ:oW='_wGԖ(W t.nNBb"H^Do1tN]1)hn5y^dpk @\%Eϳ-%4eGժn-g9Ό 6=2_^>axnlϬ `kMNy^(SxLVGcbA~&N TU nx[!M]U;%m vᅖR-8^rfpeYd['jQ {;OA~uV"@ĥWS9}ɣE"Н+[ot$b 5Jls=d!pVܵ'0Kh~~A僅ZiCU+'h]XOtޫWIn͙Z$ uI6>`e NZo)7m0B]UdV̚7QDιJC ضh0I6R5e^6>?>Gy+E~"ML\?N|BEJtJPCa*:PV1sSH%BZO2V1b…|0ː@~$`DtAW(ȸj5]ɋO1"PkwL54ɪ΃"FdX{ )XXYs|Ȟa,2 dj&$]cw@ğk |$:+DߪFD«6FiV:2]p<]5J߽SXК.Zr8kb|Q5stXxO/8eOgqg }MC>Y|IpH/Lg;+LLuwԘci+86鶸Hδz!zYh/~y~OvJܣ'G?ry1a ̚[p:;q>Y;teSFSl[~X3NgTM+0{oU>X@RWH{Z2]IQ8uz3T}b}'Os,H :6#Yn|/J+*,-J`QtML@#r[>c Q؇B¥ )1rEcj4Anu4ҏAC͏XB0 #h;$&X2(A76YdAo& ~~bTͽaL8jO||!\$0vުդdv8aμ˭إ !/QwWu%=_쿎>,{4-7GiZf2aQ$Y/{VGZmꃽƅC=Ar_ntie*^h%c]q@%oB;t,CPV-A_ȅXDnsUsQ>);qtm-`xcxż~hNlmN s!y3N]iǼd´ wЩ[wf\ gawk;3PlqiX_iQvJ>%ԡyR;IĹG4F^nclC2s [Ni:!sӘ&hm-[5"UXTJ0hq[dC,u&띶1~bA`qq=% &x퟇Xhn1KyqTZ)h}vCh>amߗ.39)H8 [:N/FSڮ*}ceOx"c(xs;N͟h$FqY~ݡ"Kd#a;R̩Dc6"{<7yh4"x e~J$}`Bp`#ihDVs|8ƮjU}-F )tKC*xha9"d|ҥAd Kk۫EC!;K_^B02@l]+ x|tHQevLj{f%L-|vh%7Ӑ8'a-rB>T8uRʳ8 ?'QBX/Ǻײp]cGێ_}]rdn?n\!F>̊|_' EBxBH)/@i'ұJG w*,Z8gu$[zJjHR<;`ʔ("p)//kKLIS&Tn /gut{m N8ߏL|gI/x wFz:2R[W[͋kB/9 nK b)K#2/h}E‚{y: C] p͊Cu 3G ET2aPjp K*!^֗ۑ_ BF -'~R%NPT +#@䤇xhs:-k9a CƉO3B0\xhX< &WYp}&jv.[ii]Lx<֊̰wLMK.FG|\N_ÿɛ/ۋqpSE#Aߺn2'#,(="9)hfɽ\ )bǭGf7aA)v6FN"Xst.=YOg9ґ4g,LوR3ZL+'r/ SBZ}djI12w*gb$YF_ Cx3%:.5|ZE=ooO=ƚ>s#J Q4J@'zRאșRg@uԨ뽤JOT 2m> 6*H9?%m%4xC`j &$2B6_gmWW}@$Kj~(cΐpR8H|08I&-<γ/>nψuzetz,V] VYN ۊ,z_]d{x<f[n= &)t长e>7閙?f:"+qR)@DfL8j!į1 ?;]+}/"o%ٝ]г4".IOɛDL)/UoY@H xr!R163{rs (3'*|mT /,76vɛvۭ5H)s9cw("0 [?[[h_ ;n@g%D`,mAQ8/-U80lh%!9U>tn.VѠV%| * *2x} K--myȀo0JKUETzIrK1Bߡ}im$v=D .pڎDE"I˙ ]_5:0$d11.R3HGh 99r—nU# EJm}"GI VKoҙt]Qh.+^hZ;ۯ{Q%e)˛@pUppJV.Xe-_/S`{R7YCSNrGb[O^7M(ejدhDԻ-[a43gt8-.mk&ǁ,"bkhU0o]ɭ{QE4D tKXbq(HD-R {([47O_'z ALû2)@PA[(ovn[GRvF=tf9#oyIb M-kL\/\*MVEs6)߸%+ćKm4p͕PjS>qo>>Sw +V=<u*E@̚=/]RձNVz?,TqX2o82 PQE61lBh"ۈ6 Qcp# &z`;WȢM_5}\$(FxO[vsJh׊GLy2ߞp$ Q,(+~ kmx_$x!}H?[@X%':tƾ $㴣3+ܺBnesϵ;{Pk_KWք]WzْuUQjn.Sl[dos_`dX,T {N/ۿ%}őd/YfyDih?r^;GΔY1rn gf~V֑gd[2Pu"۾3Uͩd)aѭ5ӫAY#VΝa[-8!ԭ /n־[ m эl.`GRC8`iFhTIX_VA wӌu2]5Ƞ&K|L~!ĕ}M.w(€'Q5C7S}Mm w]H~,4{Bƙpbj'ifߖDa񘃽S9j 93BI/Y:^ xlqif9q`yb>闤Q?8)8a|Izw1[0b<4.l<sW*1aJaRCpƕ#Y^uC(nО!Wɍﱳ1p}HTc#jEiV|ăYwHB$Vx7rxa{ ]{1#Vz'˶&n 'eJ~s2FB%W~Ū DHᆕ#%!6ɺE1m.?;v^4Yɪ׫k_obWp͍X<p{?§_6Uఽ@:uXco-vHER0bjutD֫OL$ !FΚƜ7tG4;72lǝZkjv2@"Y ,D8}Ը.:ORR%nlzź&M{9HQbIȥ UX?+ҢP4-^kypܪ029e2u{N>C.h'q×{F\Q rmz D;y淕OfUg^=j0eؔ{CJyyg5UK =7)L37E]rW(,$1f~G /.yVdͯ4]p}7@Bm>rZ&ōfU7N˰bC)2[f5|x ˑ~ NqV@wˆ>5,Q)` uҤY3gHY8Y-ě.vgcM_i,Chprޭvֹ;D0[o]ӝ# #pg3✉4̞Vfz)o[;uc$K 5Q#k{}21`̘תVv~rc:iF6YΙa>ttc?8OB*%PLyp(eˋ( V A16E>+baMPtjjxDԍ[L0En)"h݈_lr >aɰtf`e E(?ZOG_~*:թjsK`C/pn9Yگ>⋍Bqz94Q`O ;ih$geŋrjӤ%8yXf\wd>ylIAăW~y;O06AHə9C{c0+X> ˰ I+Me͟HЫ˾g/ <3eKbÜa)'K{6Uب*C2 8]=B {#LE} .kupܨΪxf[jb$!䦸4BT€*OQs-m"kzę})LlMtY RJf%i[b=G&+K9tKv;cw-A8 >Y/ɵZ 0nbߏR|rCor1*L]b%O!' D\~Km?xᅋC*F*y0jVUAb 06{CO_ȱL$M>gH(F{?7cw]ySg~`e,34#?/*hB,[ 81k!㏵" ~l}Bm mtve;.'<gIPc?' ,Vy a1qӟPV7/[.D%>1^.-R5X+I2+QZ7T}mek4ą6|I#זMe>cXKe;'-/֕)ݖ32(X3jV=;68b´Ws %rcJ6!tR8co7nU-Cέ=>SF}EIf]zPHi'KTNS}Wpx.ujzV&) (l":a<@] *u3|51Zkd~nB6fiW4}:b\!gI]U~/͆ƯGXInka0dpXcSzܳUxiE'c ݃fb]txY1`+ VΔzB+^Zx+)5'It3mU|bF^&㍵WRgS$rfc2 ((=CIo # ^Qi:mnV<[9$k8=MKiƍ|mTGD'+Za!iq S+V1s.o>NiL%n1[b,a>‚^ jF"-;urY})_{l\UY)M ZbR2-` i3$.b:a&F A2-US`%għ_m>-hp3|Q.ꅣ.Sn#|1>eC:9c2{"PQŏF(?P~JWb22Y]Yri@۷C_, O*kRF|t䳍)iR<' qr"pX-*~)hvRp@O\h G, cq`@YBvq܏KaOW  F x(?mLhe1-yc[D.z%i/+g7֛(Ohpf "N\BkRUAt;| Fƒ{E|9;~7+VpVL᣾+W%C*50]JXώڎyIlغ;Xy.w7A>mԾ]i^qf-å~T}uRXzKy4j$:_d#;)R|p-lPD`.+HQ?-m.y+fBP1nF);L&2mts80?;/>cV))}OiC52ڝy`ws1G ­"ǷF_XVXa$`&_i19b7E endstream endobj 499 0 obj << /Type /ObjStm /N 100 /First 933 /Length 4481 /Filter /FlateDecode >> stream x\YoDz~ׯV[lI@c7pH>VU7g3{ {zkk(:BWYH:N Bp #D!P! :1BC)U::6@ǃ% #QuKaԅ4T22pbd^JGB|)BlÎ/] `1Z@h81D4 qDhIk 6oY0eC ,pG^g + *fys:T+ gmƪ 'kI 0 "`Pܹq J,),i=``BzV(I_Ye@)'pZ":Xnj*QXAPz0Ppޝ 9#DA(@B8 t`>"pu {48R'Jm!<:! Yh3 h08 $Ǟ2DJa YG`7 [2^`D 8'?s6SlLJl~㵪GW Q͆^פe{'l,jQMUxO(y?T˪ZNS{*,~9I4j 6,'̕_ ֊֊k-YS u w$_MO\Ԩ׶VZz,.lwQ ˺ ;6>܁j/jS.kśhu&YzƤ'oޢ[b6ohC*ͭoƹSFC ul0FכE6Y  OӞ(`UMc6gMU/k7kA:3z'a&&5XuA!CڱÙmql&nc)ySSiސeeYZlTM<~=u zwYXNW[p]ԡYzr^:tOt +6mj J 62)`7y[onݪ繨rP; GUzvO Ϗ<hszkW7r;@_ySs>xx'Qwf#&=2MsCy;w>B'6LܩG# x !igҬ /yt3W=e)N8ms0[!ZWshzFq.c!FF*`̑=|1R946i s]ܣQ)g#bҬ=AvxE DH -#zQ5 _iBaq%ЕN{JkmR?\A N? ECۮ>mҌ,h=3}|c!i 10iT@zO'3T[L:^ap8OV] Z 崽Ѷ1E8>DTh]MA=~CEsCZO?_ʂ=ϖj1['trt 3^_<|__&Б|ힱ={?bvV]%@yt\,k' =,GzZbY޾8=a">Ӕ}ݰw7M؟lnٌ&;vW.P{NckUV7tKD V \VMG [͢,9[o}ea);M ƆoN~y/x^=}mGn v³i83`H=#',E9a蛀q`?y8o`/S8N6h`] %ڨT+~̍RQ/~2Jɔ ;Mm{aNv5P@a׋r;BdʦM˪PkBaP_!~׻_| ?-RN{t$dg|vW5<|]uڰn%םt|00 WbtgԐ19tυ\դfh/WR)5QnrpwfrQMg;Uh|t،/c}]3>n'SAg_/^?}4IԺp`rv0ʄ$2w/:.>fPܣ$xd0qtwfwv@,bn'3t9~env2-rtPz~AaR!p<,2ǛS[_;쒸7tp|/o3,E) !2m)ȯ{d[I5!®& m/'qMqc-(u*Ni =BP6[T|v5WE-7>l@`i níֻm>㇯'8s O!|[NcKmtvNe+i|Nieu[d\M,MJkc"5WHeox(C.^.IO2{ ţ*Ӹ 2T22]Й x['YwFB8RmM*jRyҗ}&wt/C٤0M\@\;r %hEe-x.2 Dr(ukԫE~djլD^Vz[W'M^_BL?Wr41$ݨ.~"E-2FZH\7ՙš2 /hK66^gt/j^me2^WRo%ۼx2}- V^S` endstream endobj 629 0 obj << /Author(\376\377\000J\000o\000h\000a\000n\000n\000e\000s\000\040\000S\000o\000e\000d\000i\000n\000g)/Title(\376\377\000H\000H\000-\000s\000u\000i\000t\000e\000\040\000U\000s\000e\000r\000\040\000G\000u\000i\000d\000e)/Subject(\376\377\000H\000H\000-\000s\000u\000i\000t\000e\000\040\000f\000o\000r\000\040\000s\000e\000n\000s\000i\000t\000i\000v\000e\000\040\000s\000e\000q\000u\000e\000n\000c\000e\000\040\000s\000e\000a\000r\000c\000h\000i\000n\000g\000\040\000b\000a\000s\000e\000d\000\040\000o\000n\000\040\000H\000M\000M\000-\000H\000M\000M\000\040\000a\000l\000i\000g\000n\000m\000e\000n\000t)/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.12)/Keywords() /CreationDate (D:20120615151422+02'00') /ModDate (D:20120615151422+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 597 0 obj << /Type /ObjStm /N 63 /First 551 /Length 2054 /Filter /FlateDecode >> stream xڍYK5A"\B  Q'ġlFLf,Omw״8\W/ *q* }heU^emOP6Ѳ6 4*HAF坦OU'D߭am-=8zHȓ A AgI2IGz@aq3D2B7!9z H8hr =0/Z7`џe O,DIYNF⃔L_uN9 Hry+ ˥KҸHr4E| >!=PHHHYF*Rm+bJ5ȼYT ZcdK/R!Zr-P PՌ7H6K EJT|_CO=a<}F~x|ݝ%{*ֈ f,,̄ TXZK~vuŠ QE2oPH8_ig9y)>Ú1)^H([lo J]E2 cc3Eka+\6Blwtt-f%<:\$֓uXV aX˼XvK7X(aM04X 7a&4XZšg&PRUAsնTnҶ#͡mKm.ILNʤHfRM{ kX`2` R``h,p)Hs(C y,,]γaI]ipiLHipn< Noaf64v db-vnsy Xd9'CI_g6sP}tKwTW}zk-%% cIwgaY8~_2R w ,12ZX`+-yM.G%gcА5ɰ% HW_'/bG%Ѣw\; rMwhI+;ffXk\mw>wbfcqe\w]؎6PG$+[1~GSџGlWG?p~V^rfj/ϧl2 bY;߾?dWa7 Fn 0#{s8瞕r :l2RA]_.v5 ![H:[oOw=w5h؆_][9J\]_Nw#, _e:>Aި+ycxYdu)> $7ad_'%%PXX]~RIKI 1jH5 7o$3];%N0| 5uGiݬ%ӲTgrvR I -ʎ 1dICݺ+'bg?[FZr܌Wxݬ%r||:aC_'qz| i*8=P刃I 1NOvY pzb8=Xs|ap2d^|`|-낭ydfX(bL*u|Q?}7)qdr-er.̑;V\,>Bܸ RKLq\5`CVN:zNnZjV ""s ZSMhƙ WH~)me\||7ş22圙()=sZS;,-MBqL9+9Sƕ2(? rz#li 0hWDVs'9ANASOuJ<> ՚l9f%-I?CYIri+]o5_V&mk4$H^S* r*r }ⶴَ$ʛxA>Uv@ay#}_.5XZ׍P2Rr,[1X咊:_x)7,2k(}ߛD/ˍMlJU Kwg再.?*\}?.>N&ۏzx9Y2]ׇ~T&Yf~ endstream endobj 630 0 obj << /Type /XRef /Index [0 631] /Size 631 /W [1 3 1] /Root 628 0 R /Info 629 0 R /ID [<75689CAE27033450919265B25AC45E96> <75689CAE27033450919265B25AC45E96>] /Length 1489 /Filter /FlateDecode >> stream x%KlE-J@ymiҖRhM\qcbXLbtVjt˜QwB0n P &q6_̝gwNCQB$z#y a$8 ΀a0ز` Pml;NP v` AՠA-G@=8 @#8@3h '@7%6v'Yp Q)A}9p\%p̃q 5/-H{@7} `+I"$EH(^ Eԩ(ӊ6H*QD"E :D*_`b=y)5.Ġ"^,޲0!EM,2]4G24"zjpvVxEf<,Aʋ>2gly;vp\+EnU<`ă>W}A8jAbHR"I$%" xX'4Y}d E>| ^mr.OoB7}"/\?ełȗ {ڍ8&}8&D~z mD뢯8#>7 ^*Xy]Ca^$s뒝|Q"ؔ_N1$J:H@R;h+ 6`*7?E$H͠JJJ"f_ lKs; rMRpғz<R"Qi? ه /4B轂S?zO!i6& F)BipП 8.]"%ץ9B' IJͦ%BO6]%䭀kPo«5NH-H/ds(¼Q9J8Y)o&Bg||q#TW5o|.[z6/-<ƋY0mHqA#F~ 7`C9# Og%ۨC浘` jF2ꐡbe(F;z6/<ݨH./%>$Q>QQ>>GGoGɿtGGH(bL 8ZPzp4Fp 4fZA8M ܿ ܵ [!(G?ɫ endstream endobj startxref 324525 %%EOF hhsuite-2.0.16/LICENSE0000664172256617226630000010726212110430072016572 0ustar hauserscientific_computing The hhsuite contains in file hhprefilter.C code adapted from Michael Farrar (http://sites.google.com/site/farrarmichael/smith-waterman). His code is marked in the file hhprefilter.C. The copy right of his code is shown below: Copyright 2006, by Michael Farrar. All rights reserved. The SWSSE2 program and documentation may not be sold or incorporated into a commercial product, in whole or in part, without written consent of Michael Farrar. For further information regarding permission for use or reproduction, please contact Michael Farrar at: farrar.michael@gmail.com THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Reference: Farrar M. Striped Smith-Waterman speeds database searches six times over other SIMD implementations. Bioinformatics. 2007, 23:156-61. Michael Farrar died unexpectedly in December 2010. Many thanks posthumously for your great code! Johannes ********************************************************************** 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 . hhsuite-2.0.16/bin/0000775172256617226630000000000012110431065016330 5ustar hauserscientific_computinghhsuite-2.0.16/Makefile0000664172256617226630000001022712110430072017217 0ustar hauserscientific_computing# This can be overridden e.g.: make install INSTALL_DIR=... INSTALL_DIR?=$(PWD) # Guess wether to use lib or lib64 #libdir=`([ -d /usr/lib64 ] && echo lib64) || echo lib` # We don't have platform specific lib stuff libdir=lib # Overriding this is currently not fully supported as the code won't know # to what this is set then. You can try setting HHLIB. INSTALL_LIB_DIR?=$(INSTALL_DIR)/$(libdir)/hh INSTALL_SCRIPTS_DIR?=$(INSTALL_LIB_DIR)/scripts INSTALL_DATA_DIR?=$(INSTALL_LIB_DIR)/data INSTALL_LIB_BIN_DIR?=$(INSTALL_LIB_DIR)/bin dist_name=hhsuite-2.0.16 .PHONY: all_static all_static: ffindex_static $(MAKE) -C src all_static .PHONY: all all: ffindex $(MAKE) -C src all doc: $(MAKE) -C src hhsuite-userguide.pdf hhblits_static: hhblits_static $(MAKE) -C src hhblits_static hhblits: ffindex $(MAKE) -C src all .PHONY: ffindex ffindex: $(MAKE) -C lib/ffindex ffindex_static: $(MAKE) -C lib/ffindex FFINDEX_STATIC=1 install: $(MAKE) -C lib/ffindex install INSTALL_DIR=$(INSTALL_DIR) mkdir -p $(INSTALL_DIR)/bin install src/hhblits $(INSTALL_DIR)/bin/hhblits install src/hhalign $(INSTALL_DIR)/bin/hhalign install src/hhconsensus $(INSTALL_DIR)/bin/hhconsensus install src/hhfilter $(INSTALL_DIR)/bin/hhfilter install src/hhmake $(INSTALL_DIR)/bin/hhmake install src/hhsearch $(INSTALL_DIR)/bin/hhsearch mkdir -p $(INSTALL_LIB_DIR) mkdir -p $(INSTALL_LIB_BIN_DIR) install src/cstranslate $(INSTALL_LIB_BIN_DIR)/cstranslate mkdir -p $(INSTALL_DATA_DIR) install -m 0644 data/context_data.lib $(INSTALL_DATA_DIR)/context_data.lib install -m 0644 data/cs219.lib $(INSTALL_DATA_DIR)/cs219.lib install -m 0644 data/do_not_delete $(INSTALL_DATA_DIR)/do_not_delete install -m 0644 data/do_not_delete.phr $(INSTALL_DATA_DIR)/do_not_delete.phr install -m 0644 data/do_not_delete.pin $(INSTALL_DATA_DIR)/do_not_delete.pin install -m 0644 data/do_not_delete.psq $(INSTALL_DATA_DIR)/do_not_delete.psq mkdir -p $(INSTALL_SCRIPTS_DIR) install -m 0644 scripts/Align.pm $(INSTALL_SCRIPTS_DIR)/Align.pm install -m 0644 scripts/HHPaths.pm $(INSTALL_SCRIPTS_DIR)/HHPaths.pm install scripts/addss.pl $(INSTALL_SCRIPTS_DIR)/addss.pl install scripts/create_profile_from_hhm.pl $(INSTALL_SCRIPTS_DIR)/create_profile_from_hhm.pl install scripts/create_profile_from_hmmer.pl $(INSTALL_SCRIPTS_DIR)/create_profile_from_hmmer.pl install scripts/hhmakemodel.pl $(INSTALL_SCRIPTS_DIR)/hhmakemodel.pl install scripts/reformat.pl $(INSTALL_SCRIPTS_DIR)/reformat.pl install scripts/splitfasta.pl $(INSTALL_SCRIPTS_DIR)/splitfasta.pl install scripts/multithread.pl $(INSTALL_SCRIPTS_DIR)/multithread.pl install scripts/hhblitsdb.pl $(INSTALL_SCRIPTS_DIR)/hhblitsdb.pl deinstall: $(MAKE) -C lib/ffindex deinstall INSTALL_DIR=$(INSTALL_DIR) rm -f $(INSTALL_DIR)/bin/hhblits $(INSTALL_DIR)/bin/hhalign \ $(INSTALL_DIR)/bin/hhconsensus $(INSTALL_DIR)/bin/hhfilter $(INSTALL_DIR)/bin/hhmake $(INSTALL_DIR)/bin/hhsearch rm -f $(INSTALL_DATA_DIR)/context_data.lib $(INSTALL_DATA_DIR)/cs219.lib $(INSTALL_DATA_DIR)/do_not_delete \ $(INSTALL_DATA_DIR)/do_not_delete.phr $(INSTALL_DATA_DIR)/do_not_delete.pin $(INSTALL_DATA_DIR)/do_not_delete.psq rm -f $(INSTALL_SCRIPTS_DIR)/Align.pm $(INSTALL_SCRIPTS_DIR)/HHPaths.pm $(INSTALL_SCRIPTS_DIR)/splitfasta.pl \ $(INSTALL_SCRIPTS_DIR)/addss.pl $(INSTALL_SCRIPTS_DIR)/create_profile_from_hhm.pl \ $(INSTALL_SCRIPTS_DIR)/create_profile_from_hmmer.pl $(INSTALL_SCRIPTS_DIR)/hhmakemodel.pl \ $(INSTALL_SCRIPTS_DIR)/reformat.pl $(INSTALL_SCRIPTS_DIR)/multithread.pl $(INSTALL_SCRIPTS_DIR)/hhblitsdb.pl rm -f $(INSTALL_LIB_BIN_DIR)/cstranslate rmdir $(INSTALL_LIB_BIN_DIR) || true rmdir $(INSTALL_DIR)/bin || true rmdir $(INSTALL_DATA_DIR) || true rmdir $(INSTALL_SCRIPTS_DIR) || true rmdir $(INSTALL_LIB_DIR) || true .PHONY: clean clean: cd lib/ffindex && $(MAKE) clean $(MAKE) -C src clean dist/$(dist_name).tar.gz: make clean mkdir -p dist git archive --prefix=$(dist_name)/ -o dist/$(dist_name).tar.gz HEAD cd dist && tar xf $(dist_name).tar.gz mkdir -p dist/$(dist_name)/bin cd dist/$(dist_name) && rsync --exclude .git --exclude .hg -av ../../lib . cd dist && tar czf $(dist_name).tar.gz $(dist_name) hhsuite-2.0.16/scripts/0000775172256617226630000000000012110430072017244 5ustar hauserscientific_computinghhsuite-2.0.16/scripts/addss.pl0000775172256617226630000006661012110430072020713 0ustar hauserscientific_computing#!/usr/bin/env perl # # addss.pl # Add PSIPRED secondary structure prediction (and DSSP annotation) to an MSA or HMMER file. # Output format is A3M (for input alignments) or HMMER (see User Guide). # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding and Michael Remmert, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use Align; # Needleman-Wunsch and Smith-Waterman alignment functions use File::Temp qw/ tempfile tempdir /; use strict; my $ss_cit="PSIPRED: Jones DT. (1999) Protein secondary structure prediction based on position-specific scoring matrices. JMB 292:195-202."; # Module needed for aligning DSSP-sequence $|= 1; # Activate autoflushing on STDOUT # Default values: our $v=2; # verbose mode my $numres=0; # number of residues per line for secondary structure my $informat="a3m"; # input format my $neff = 7; # use alignment with this diversity for PSIPRED prediction my $program=$0; # name of perl script my $pdbfile; my $help=" addss.pl from HHsuite $VERSION Add PSIPRED secondary structure prediction (and DSSP annotation) to a multiple sequence alignment (MSA) or HMMER (multi-)model file. If the input file is an MSA, the predicted secondary structure and confidence values are added as special annotation sequences with names >ss_pred, >ss_conf, and >ss_dssp to the top of the output A3M alignment. If no output file is given, the output file will have the same name as the input file, except for the extension being replaced by '.a3m'. Allowed input formats are A3M (default), A2M/FASTA (-fas, -a2m), CLUSTAL (-clu), STOCKHOLM (-sto), HMMER (-hmm). If the input file contains HMMER models, records SSPRD and SSCON containing predicted secondary structure and confidence values are added to each model. In this case the output file name is obligatory and must be different from the input file name. Usage: perl addss.pl [] [-fas|-a3m|-clu|-sto] or perl addss.pl -hmm \n"; # Variable declarations my $line; my @seqs; # sequences from infile (except >aa_ and >ss_pred sequences) my $query_length; my $header; # header of MSA: everything before first '>' my $name; # query in fasta format: '>$name [^\n]*\n$qseq\n' my $qseq; # residues of query sequence my $infile; my $outfile; my $ss_pred=""; # psipred ss states my $ss_conf=""; # psipred confidence values my $ss_dssp; # dssp states as string my $sa_dssp; # relative solvent accessibility from dssp as string {A,B,C,D,E} A:absolutely buried, B:buried, E:exposed my $aa_dssp; # residues from dssp file as string my $aa_astr; # residues from infile as string my $q_match; # number of match states in query sequence my $xseq; # sequence x returned from Align.pm my $yseq; # sequence y returned from Align.pm my $Sstr; # match sequence returned from Align.pm ############################################################################################### # Processing command line input ############################################################################################### if (@ARGV<1) {die ($help);} my $options=""; for (my $i=0; $i<@ARGV; $i++) {$options.=" $ARGV[$i] ";} #Input format fasta? if ($options=~s/ -fas\s/ /g) {$informat="fas";} elsif ($options=~s/ -a2m\s/ /g) {$informat="a2m";} elsif ($options=~s/ -a3m\s/ /g) {$informat="a3m";} elsif ($options=~s/ -clu\s/ /g) {$informat="clu";} elsif ($options=~s/ -sto\s/ /g) {$informat="sto";} elsif ($options=~s/ -hmm\s/ /g) {$informat="hmm";} if ($options=~s/ -v\s+(\d+) / /g) {$v=$1;} # Set input and output file if ($options=~s/ -i\s+(\S+) //) {$infile=$1;} if ($options=~s/ -o\s+(\S+) //) {$outfile=$1;} if ($options=~s/^\s*([^-]\S*) //) {$infile=$1;} if ($options=~s/^\s*([^-]\S*) //) {$outfile=$1;} # Warn if unknown options found or no infile/outfile if ($options!~/^\s*$/) {$options=~s/^\s*(.*?)\s*$/$1/g; die("Error: unknown options '$options'\n");} if (!$infile) {print($help); exit(1);} my $v2 = $v-1; if ($v2>2) {$v2--;} if ($v2<0) {$v2=0;} if ($informat eq "hmm" && !$outfile) { print("Error: no output file given. With the -hmm option an output file is obligatory\n"); exit(1); } ############################################################################################### # Reformat input alignment to a3m and psiblast-readable format and generate file with query sequence ############################################################################################### my $inbase; # $inbasename of infile: remove extension my $inroot; # $inbasename of infile: remove path and extension if ($infile=~/(.*)\..*/) {$inbase=$1;} else {$inbase=$infile;} # remove extension if ($inbase=~/.*\/(.*)/) {$inroot=$1;} else {$inroot=$inbase;} # remove path # Create tmpfile my $tmpdir; if ($v<=3) {$tmpdir = tempdir( CLEANUP => 1);} else {$tmpdir = tempdir( CLEANUP => 0);} my ($tmpf, $tmpfile) = tempfile( DIR => $tmpdir ); my $tmpfile_no_dir; if ($tmpfile=~/.*\/(.*)/) {$tmpfile_no_dir=$1;} else {$tmpfile_no_dir=$tmpfile;} # remove path ############################################################################################ if ($informat ne "hmm") { if (!$outfile) {$outfile="$inbase.a3m";} # Use first sequence to define match states and reformat input file to a3m and psi if ($informat ne "a3m") { &HHPaths::System("$hhscripts/reformat.pl -v $v2 -M first $informat a3m $infile $tmpfile.in.a3m"); } else { &HHPaths::System("cp $infile $tmpfile.in.a3m"); } # Read query sequence open (INFILE, "<$tmpfile.in.a3m") or die ("ERROR: cannot open $tmpfile.in.a3m!\n"); $/=">"; # set input field separator my $i=0; $qseq=""; $header = ; $header =~s />$//; while ($line=) { $line=~s/>$//; if ($line=~/^ss_/ || $line=~/^aa_/) {next;} $seqs[$i++]=">$line"; if(!$qseq) { $line=~s/^(.*)[^\n]*//; $name=$1; $qseq=$line; $qseq=~s/\n//g; } } close(INFILE); $/="\n"; # set input field separator if ($qseq =~ /\-/) { # First sequence contains gaps => calculate consensus sequence &HHPaths::System("hhconsensus -i $tmpfile.in.a3m -s $tmpfile.sq -o $tmpfile.in.a3m > /dev/null"); } else { $query_length = ($qseq=~tr/A-Z/A-Z/); $qseq=~tr/A-Z//cd; # remove everything except capital letters # Write query sequence file in FASTA format open (QFILE, ">$tmpfile.sq") or die("ERROR: can't open $tmpfile.sq: $!\n"); printf(QFILE ">%s\n%s\n",$name,$qseq); close (QFILE); } # Filter alignment to diversity $neff if ($v>=1) {printf ("Filtering alignment to diversity $neff ...\n");} &HHPaths::System("hhfilter -v $v2 -neff $neff -i $tmpfile.in.a3m -o $tmpfile.in.a3m"); # Reformat into PSI-BLAST readable file for jumpstarting &HHPaths::System("$hhscripts/reformat.pl -v $v2 -r -noss a3m psi $tmpfile.in.a3m $tmpfile.in.psi"); open (ALIFILE, ">$outfile") || die("ERROR: cannot open $outfile: $!\n"); printf (ALIFILE "%s",$header); # Add DSSP sequence (if available) if ($dssp ne "") { if (!&AppendDsspSequences("$tmpfile.sq")) { if ($numres) { $ss_dssp=~s/(\S{$numres})/$1\n/g; # insert a line break every $numres residues } printf (ALIFILE ">ss_dssp\n%s\n",$ss_dssp); if ($v>=1) {print("\nAdding DSSP state sequence ...\n");} } } # Secondary structure prediction with psipred if ($v>=2) {print("Predicting secondary structure with PSIPRED ... ");} &RunPsipred("$tmpfile.sq"); if (open (PSIPREDFILE, "<$tmpfile.horiz")) { $ss_conf=""; $ss_pred=""; # Read Psipred file while ($line=) { if ($line=~/^Conf:\s+(\S+)/) {$ss_conf.=$1;} elsif ($line=~/^Pred:\s+(\S+)/) {$ss_pred.=$1;} } close(PSIPREDFILE); $ss_conf=~tr/0-9/0/c; # replace all non-numerical symbols with a 0 if ($numres) { $ss_pred=~s/(\S{$numres})/$1\n/g; # insert a line break every $numres residues $ss_conf=~s/(\S{$numres})/$1\n/g; # insert a line break every $numres residues } printf(ALIFILE ">ss_pred PSIPRED predicted secondary structure\n%s\n",$ss_pred); printf(ALIFILE ">ss_conf PSIPRED confidence values\n%s\n",$ss_conf); } # Append alignment sequences to psipred sequences for ($i=0; $i<@seqs; $i++) { printf(ALIFILE "%s",$seqs[$i]); } close(ALIFILE); if ($v>=2) {print("done \n");} } ############################################################## # HMMER format else { if (!$outfile) {$outfile="$inbase.hmm";} my $log2 = log(2); my @logoddsmat; my @lines; my $length; my $query; my $scale=0.13; # empirically determined scale factor between HMMER bit score and PSI-BLAST score, 0.3 for HMMER3 my $acc; my $name; my $desc; my $nmodels=0; open (INFILE, "<$infile") || die("ERROR: cannot open $infile: $!\n"); open (OUTFILE, ">$outfile") || die("ERROR: cannot open $outfile: $!\n"); # Read HMMER file model by model while ($line=) { # Search for start of next model while ($line && $line!~/^HMMER/ && $line!~/^NAME /) { $line=; } if ($line=~/^HMMER3/) { $scale = 0.3; @logoddsmat=(); @lines=($line); while ($line=) {push(@lines,$line); if ($line=~/^LENG/) {last;}} $line=~/^LENG\s+(\d+)/; $length=$1; # number of match states in HMM $query=""; # query residues from NULL emission lines while ($line=) {push(@lines,$line); if ($line=~/^\s*m->m/) {last;}} push(@lines,$line=); if ($line !~ /^\s*COMPO/) { die("Error: need null-model probablities (Parameter COMPO)!\n"); } $line=~s/^\s*COMPO\s+(\S.*\S)\s*$/$1/; my @nullmodel = split(/\s+/,$line); @nullmodel = map {$_ = exp(-1 * $_)} @nullmodel; # Transform to probabilities push(@lines,$line=); # state 0 insert emission push(@lines,$line=); # transisitions from begin state while ($line=) { push(@lines,$line); if ($line=~/^\/\//) {last;} $line=~s/^\s*\d+\s+(\S.*\S)\s+\d+\s+(\S)\s+\S\s*$/$1/; $query .= $2; my @probs = split(/\s+/,$line); @probs = map {$_ = exp(-1 * $_)} @probs; # Transform to probabilities # calculate log-odds my @logodds = (); for (my $a = 0; $a < scalar(@probs); $a++) { my $logodd = (log($probs[$a] / $nullmodel[$a]) / $log2) * 1000; push(@logodds, $logodd); } push(@logoddsmat,\@logodds); push(@lines,$line=); push(@lines,$line=); } } else { $scale=0.13; if ($line!~/^HMMER/ && $line!~/^NAME /) {last;} # first line in each model must begin with 'HMMER...' @logoddsmat=(); @lines=($line); while ($line=) {push(@lines,$line); if ($line=~/^LENG/) {last;}} $line=~/^LENG\s+(\d+)/; $length=$1; # number of match states in HMM $query=""; # query residues from NULL emission lines while ($line=) {push(@lines,$line); if ($line=~/^\s*m->m/) {last;}} push(@lines,$line=); while ($line=) { push(@lines,$line); if ($line=~/^\/\//) {last;} $line=~s/^\s*\d+\s+(\S.*\S)\s*$/$1/; my @logodds = split(/\s+/,$line); push(@logoddsmat,\@logodds); push(@lines,$line=); $line=~/^\s*(\S)/; $query .= $1; push(@lines,$line=); } } # Write mtx matrix open (MTXFILE, ">$tmpfile.mtx") || die("ERROR: cannot open $tmpfile.mtx: $!\n"); printf(MTXFILE "%i\n",$length); printf(MTXFILE "%s\n",$query); printf(MTXFILE "2.670000e-03\n4.100000e-02\n-3.194183e+00\n1.400000e-01\n2.670000e-03\n4.420198e-02\n-3.118986e+00\n1.400000e-01\n3.176060e-03\n1.339561e-01\n-2.010243e+00\n4.012145e-01\n"); while (@logoddsmat) { my @logodds = @{shift(@logoddsmat)}; print(MTXFILE "-32768 "); splice(@logodds, 1,0,-32768/$scale); # insert logodds value for B splice(@logodds,20,0, -100/$scale); # insert logodds value for X splice(@logodds,22,0,-32768/$scale); # insert logodds value for Z for (my $i=0; $i<23; $i++) { printf(MTXFILE "%4.0f ",$scale*$logodds[$i]); } print(MTXFILE "-32768 -400\n"); } close(MTXFILE); # Start Psiblast from checkpoint file tmp.chk that was generated to build the profile if (-e "$datadir/weights.dat4") { # Psipred version < 3.0 &HHPaths::System("$execdir/psipred $tmpfile.mtx $datadir/weights.dat $datadir/weights.dat2 $datadir/weights.dat3 $datadir/weights.dat4 > $tmpfile.ss"); } else { &HHPaths::System("$execdir/psipred $tmpfile.mtx $datadir/weights.dat $datadir/weights.dat2 $datadir/weights.dat3 > $tmpfile.ss"); } # READ PSIPRED file if (open (PSIPRED, "$execdir/psipass2 $datadir/weights_p2.dat 1 0.98 1.09 $tmpfile.ss2 $tmpfile.ss |")) { $ss_conf=""; $ss_pred=""; # Read Psipred file while ($line=) { if ($line=~/^Conf:\s+(\d+)/) {$ss_conf.=$1;} elsif ($line=~/^Pred:\s+(\S+)/) {$ss_pred.=$1;} } close(PSIPREDFILE); } # Add secondary structure to HMMER output file and print foreach $line (@lines) { if ($line=~/^SSPRD/ || $line=~/^SSCON/|| $line=~/^SSCIT/) {next;} if ($line=~/^HMM /) { $ss_pred=~s/(\S{80})/$1\nSSPRD /g; # insert a line break every 80 residues $ss_conf=~s/(\S{80})/$1\nSSCON /g; # insert a line break every 80 residues printf(OUTFILE "SSCIT HHsearch-readable PSIPRED secondary structure prediction:\n"); printf(OUTFILE "SSPRD %s\n",$ss_pred); printf(OUTFILE "SSCON %s\n",$ss_conf); printf(OUTFILE "SSCIT %s\n",$ss_cit); } printf(OUTFILE $line); } $nmodels++; } close(OUTFILE); close(INFILE); &HHPaths::System("rm $tmpfile.mtx $tmpfile.ss $tmpfile.ss2"); if ($v>=2) {printf("Added PSIPRED secondary structure to %i models\n",$nmodels);} } if ($v<=3) { unlink("$tmpfile.in.a3m"); unlink("$tmpfile.in.psi"); unlink("$tmpfile.horiz"); unlink("$tmpfile.dssp"); } exit; ############################################################################################## # Run SS prediction starting from alignment in $tmpfile.in.psi (called by BuildAlignment) ############################################################################################## sub RunPsipred() { # This is a simple script which will carry out all of the basic steps # required to make a PSIPRED V2 prediction. Note that it assumes that the # following programs are in the appropriate directories: # blastpgp - PSIBLAST executable (from NCBI toolkit) # makemat - IMPALA utility (from NCBI toolkit) # psipred - PSIPRED V2 program # psipass2 - PSIPRED V2 program my $infile=$_[0]; my $basename; #file name without extension my $rootname; #basename without directory path if ($infile =~/^(.*)\..*?$/) {$basename=$1;} else {$basename=$infile;} if ($basename=~/^.*\/(.*?)$/) {$rootname=$1;} else {$rootname=$basename;} # Does dummy database exist? if (!-e "$dummydb.phr") { if (!-e "$dummydb") {die "Error in addss.pl: Could not find $dummydb\n";} &HHPaths::System("cp $infile $dummydb"); &HHPaths::System("$ncbidir/formatdb -i $dummydb"); if (!-e "$dummydb.phr") {die "Error in addss.pl: Could not find nor create index files for $dummydb\n";} } # Start Psiblast from checkpoint file tmp.chk that was generated to build the profile &HHPaths::System("$ncbidir/blastpgp -b 1 -j 1 -h 0.001 -d $dummydb -i $infile -B $tmpfile.in.psi -C $tmpfile.chk 1> $tmpfile.blalog 2> $tmpfile.blalog"); #print("Predicting secondary structure...\n"); &HHPaths::System("echo "."$tmpfile_no_dir".".chk > $tmpfile.pn\n"); &HHPaths::System("echo "."$tmpfile_no_dir".".sq > $tmpfile.sn\n"); &HHPaths::System("$ncbidir/makemat -P $tmpfile"); # Start Psiblast from checkpoint file tmp.chk that was generated to build the profile if (-e "$datadir/weights.dat4") { # Psipred version < 3.0 &HHPaths::System("$execdir/psipred $tmpfile.mtx $datadir/weights.dat $datadir/weights.dat2 $datadir/weights.dat3 $datadir/weights.dat4 > $tmpfile.ss"); } else { &HHPaths::System("$execdir/psipred $tmpfile.mtx $datadir/weights.dat $datadir/weights.dat2 $datadir/weights.dat3 > $tmpfile.ss"); } &HHPaths::System("$execdir/psipass2 $datadir/weights_p2.dat 1 0.98 1.09 $tmpfile.ss2 $tmpfile.ss > $tmpfile.horiz"); # Remove temporary files if ($v<=3) { unlink(split ' ', "$tmpfile.pn $tmpfile.sn $tmpfile.mn $tmpfile.chk $tmpfile.blalog $tmpfile.mtx $tmpfile.aux $tmpfile.ss $tmpfile.ss2 $tmpfile.sq");} return; } ############################################################################################## # Read query sequence and extract dssp sequence ############################################################################################## sub AppendDsspSequences() { my $qfile=$_[0]; my $line; #input line my $name; #name of sequence in in file, e.g. d1g8ma1 my $qrange; #chain and residue range of query sequence my $aas=""; #amino acids from in file for each $name my $dsspfile; my $pdbfile; my $pdbcode; #pdb code for accessing dssp file; shortened from in code, e.g. 1g8m my @ss_dssp=(); #dssp states for residues (H,E,L) my @sa_dssp=(); #dssp states for residues (H,E,L) my @aa_dssp=(); #residues in dssp file my @aa_astr=(); #residues from infile my $length; #length of sequence # Default parameters for Align.pm our $d=3; # gap opening penatlty for Align.pm our $e=0.1; # gap extension penatlty for Align.pm our $g=0.09; # endgap penatlty for Align.pm our $matrix="identity"; # Read query sequence -> $name, $nameline, $range, $aas open (QFILE, "<$qfile") || die ("cannot open $qfile: $!"); while ($line=) { if ($line=~/>(\S+)/) { $name=$1; # SCOP ID? (d3lkfa_,d3grs_3,d3pmga1,g1m26.1) if ($line=~/^>[defgh](\d[a-z0-9]{3})[a-z0-9_.][a-z0-9_]\s+[a-z]\.\d+\.\d+\.\d+\s+\((\S+)\)/) { $pdbcode=$1; $qrange=$2; } # PDB ID? (8fab_A, 1a0i) elsif ($line=~/^>(\d[a-z0-9]{3})_?(\S?)\s/) { $pdbcode=$1; if ($2 ne "") {$qrange="$2:";} else {$qrange="-";} } # DALI ID? (8fabA_0,1a0i_2) elsif ($line=~/^>(\d[a-z0-9]{3})[A-Za-z0-9]?_\d+\s+\d+\.\d+.\d+.\d+.\d+.\d+\s+\((\S+)\)/) { $pdbcode=$1; $qrange=$2; } else { if ($v>=3) {print("Warning: no pdb code found in sequence name '$name'\n");} close(QFILE); return 1; # no astral/DALI/pdb sequence => no dssp states available } $aas=""; } else { chomp($line); $line=~tr/a-z \t/A-Z/d; $aas.=$line; } } close(QFILE); if ($v>=3) {printf("Searching DSSP state assignments: name=%s range=%s\n",$name,$qrange);} # Try to open dssp file $dsspfile="$dsspdir/$pdbcode.dssp"; if (! open (DSSPFILE, "<$dsspfile")) { if ($v>=3) {printf(STDERR "Warning in $program: Cannot open $dsspfile!\n");} $pdbfile = &OpenPDBfile($pdbcode); if ($pdbfile eq "") {return;} system("$dssp $pdbfile $tmpfile.dssp 2> /dev/null"); system("cp $tmpfile.dssp $dsspfile 2> /dev/null"); $dsspfile="$tmpfile.dssp"; if (! open (DSSPFILE, "<$dsspfile")) { if ($v>=3) {printf(STDERR "Warning in $program: dssp couldn't generate file from $pdbfile. Skipping $name\n");} return 1; } } #....+....1....+....2....+....3....+....4 # # RESIDUE AA STRUCTURE BP1 BP2 ACC etc. # 623 630 A R < 0 0 280 etc. # 624 !* 0 0 0 etc. # 625 8 B A 0 0 105 etc. # 626 9 B P >> - 0 0 71 etc. # 292 28SA K H 4 S+ 0 0 71 etc. (1qdm.dssp) # 293 29SA K H > S+ 0 0 28 etc. # Read in whole DSSP file for (my $try = 1; $try<=2; $try++) { $aa_dssp=""; $sa_dssp=""; $ss_dssp=""; while ($line=) {if ($line=~/^\s*\#\s*RESIDUE\s+AA/) {last;}} while ($line=) { if ($line=~/^.{5}(.{5})(.)(.)\s(.).\s(.).{18}(...)/) { my $thisres=$1; my $icode=$2; my $chain=$3; my $aa=$4; my $ss=$5; my $sa=$6; my $contained=0; my $range=$qrange; if ($aa eq "!") {next;} # missing residues! $thisres=~tr/ //d; $chain=~tr/ //d; $icode=~tr/ //d; $sa=~tr/ //d; if ($try==1) { do{ if ($range=~s/^(\S):(-?\d+)[A-Z]-(\d+)([A-Z])// && $chain eq $1 && $icode eq $4 && $2<=$thisres && $thisres<=$3) { $contained=1; #syntax (A:56S-135S) } elsif ($range=~s/^(\S):(-?\d+)[A-Z]?-(\d+)[A-Z]?// && $chain eq $1 && $2<=$thisres && $thisres<=$3) { $contained=1; #syntax (R:56-135) } elsif ($range=~s/^(-?\d+)[A-Z]-(\d+)([A-Z])// && $chain eq "" && $icode eq $3 && $1<=$thisres && $thisres<=$2) { $contained=1; #syntax (56-135) } elsif ($range=~s/^(-?\d+)[A-Z]?-(\d+)[A-Z]?// && $chain eq "" && $1<=$thisres && $thisres<=$2) { $contained=1; #syntax (56-135) } elsif ($range=~s/^(\S):// && $chain eq $1) { $contained=1; #syntax (A:) or (A:,2:) } elsif ($range=~s/^-$// && $chain eq "") { $contained=1; #syntax (-) } $range=~s/^,//; # print("qrange=$qrange range='$range' ires=$thisres chain=$chain contained=$contained\n"); } while($contained==0 && $range ne ""); if ($contained==0) {next;} } # end if try==1 $aa_dssp.=$aa; $ss_dssp.=$ss; $sa_dssp.=&sa2c($sa,$aa); } } # if not enough residues were found: chain id is wrong => repeat extraction without checking chain id if (length($aa_dssp)>=10) {last;} close(DSSPFILE); open (DSSPFILE, "<$dsspfile"); } close(DSSPFILE); if (length($aa_dssp)==0) {print("WARNING: no residues found in $dsspdir/$pdbcode.dssp\n"); return 1;} if (length($aa_dssp)<=20) {printf("WARNING: only %i residues found in $dsspdir/$pdbcode.dssp\n",length($aa_dssp)); return 1;} # Postprocess $aa_dssp etc $aa_dssp =~ tr/a-z/CCCCCCCCCCCCCCCCCCCCCCCCCC/; $ss_dssp =~ tr/ I/CC/; $ss_dssp =~ s/ \S / /g; $ss_dssp =~ s/ \S\S / /g; # Align query with dssp sequence $aa_astr = $aas; $xseq=$aas; $yseq=$aa_dssp; my ($imax,$imin,$jmax,$jmin); my (@i,@j); my $score=&AlignNW(\$xseq,\$yseq,\@i,\@j,\$imin,\$imax,\$jmin,\$jmax,\$Sstr); # Initialize strings (=arrays) for dssp states with "----...-" my @ss_dssp_ali=(); # $ss_dssp_ali[$i] is dssp state aligned to $aa_astr[$i] my @sa_dssp_ali=(); # $sa_dssp_ali[$i] is solvent accessibility string my @aa_dssp_ali=(); # $aa_dssp_ali[$i] is dssp residue aligned to $aa_astr[$i] for (my $i=0; $i<=length($aa_astr); $i++) { # sum up to len+1 # because 0'th element in @ss_dssp and @aa_dssp is dummy "-" $ss_dssp_ali[$i]="-"; $sa_dssp_ali[$i]="-"; $aa_dssp_ali[$i]="-"; } # To each residue (from i=0 to len-1) of input sequence $aa_astr assign aligned dssp state @ss_dssp = split(//,$ss_dssp); @sa_dssp = split(//,$sa_dssp); @aa_dssp = split(//,$aa_dssp); @aa_astr = split(//,$aa_astr); my $len = 0; unshift(@aa_dssp,"-"); #add a gap symbol at beginning -> first residue is at 1! unshift(@ss_dssp,"-"); #add a gap symbol at beginning -> first residue is at 1! unshift(@sa_dssp,"-"); #add a gap symbol at beginning -> first residue is at 1! unshift(@aa_astr,"-"); #add a gap symbol at beginning -> first residue is at 1! for (my $col=0; $col<@i; $col++) { if ($i[$col]>0) { if ($j[$col]>0) {$len++;} # count match states (for score/len calculation) $ss_dssp_ali[$i[$col]]=$ss_dssp[$j[$col]]; $sa_dssp_ali[$i[$col]]=$sa_dssp[$j[$col]]; $aa_dssp_ali[$i[$col]]=$aa_dssp[$j[$col]]; } if ($v>=4) { printf ("%s %3i %s %3i\n",$aa_astr[$i[$col]],$i[$col],$aa_dssp[$j[$col]],$j[$col]); } } shift (@ss_dssp_ali); # throw out first "-" shift (@sa_dssp_ali); # throw out first "-" shift (@aa_dssp_ali); # throw out first "-" $aa_dssp=join("",@aa_dssp_ali); $ss_dssp=join("",@ss_dssp_ali); $sa_dssp=join("",@sa_dssp_ali); # Debugging output if ($v>=4) {printf(STDOUT "DSSP: %s: length=%-3i score/len:%-5.3f\n",$name,$len,$score/$len);} if ($v>=4) { printf("IN: %s\n",$xseq); printf("MATCH: %s\n",$Sstr); printf("DSSP: %s\n",$yseq); printf("\n"); printf(">ss_dssp $name\n$ss_dssp\n"); printf(">sa_dssp $name\n$sa_dssp\n"); printf(">aa_dssp $name\n$aa_dssp\n"); printf(">aa_astra $name\n$aa_astr\n\n"); } if ($score/$len<0.5) { printf (STDOUT "\nWARNING: in $name: alignment score with dssp residues too low: Score/len=%f.\n\n",$score/$len); printf("IN: %s\n",$xseq); printf("MATCH: %s\n",$Sstr); printf("DSSP: %s\n",$yseq); return 1; } return 0; } ################################################################################################ ### Return solvent accessibility code ################################################################################################ sub sa2c () { my %maxsa = (A=>106, B=>160, C=>135, D=>163, E=>194, F=>197, G=>84, H=>184, I=>169, K=>205, L=>164, M=>188, N=>157, P=>136, Q=>198, R=>248, S=>130, T=>142, V=>142, W=>227, X=>180, Y=>222, Z=>196); # maximum solvent accessiblity if ($_[1]=~/[a-z]/) {return "F";} # disulphide bridge if (!defined $maxsa{$_[1]}) {return "-";} # no amino acid my $rsa=$_[0]/$maxsa{$_[1]}; # printf("aa=%s sa=%5.1f max_sa=%5.1f rsa=%5.3f\n",$_[1],$_[0],$maxsa{$_[1]},$rsa); if ($rsa<=0.02) {return "A";} elsif ($rsa<=0.14) {return "B";} elsif ($rsa<=0.33) {return "C";} elsif ($rsa<=0.55) {return "D";} else {return "E";} } # Find the pdb file with $pdbcode in pdb directory sub OpenPDBfile() { my $pdbcode=lc($_[0]); if (! -e "$pdbdir") { if ($v>=3) {print(STDERR "Warning in $program: pdb directory '$pdbdir' does not exist!\n");} return 1; } if (-e "$pdbdir/all") {$pdbfile="$pdbdir/all/";} elsif (-e "$pdbdir/divided") {$pdbfile="$pdbdir/divided/".substr($pdbcode,1,2)."/";} else {$pdbfile="$pdbdir/";} if ($pdbdir=~/divided.?$/) {$pdbfile.=substr($pdbcode,1,2)."/";} if (-e $pdbfile."pdb$pdbcode.ent") {$pdbfile.="pdb$pdbcode.ent";} elsif (-e $pdbfile."pdb$pdbcode.ent.gz") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.gz |";} elsif (-e $pdbfile."pdb$pdbcode.ent.Z") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.Z |";} elsif (-e $pdbfile."$pdbcode.pdb") {$pdbfile."$pdbcode.pdb";} else { if ($v>=3) {printf(STDERR "Warning in $program: Cannot find pdb file $pdbfile"."pdb$pdbcode.ent!\n");} return ""; } if (!open (PDBFILE, "$pdbfile")) { if ($v>=3) {printf(STDERR "Error in $program: Cannot open pdb file: $!\n");} return ""; } return $pdbfile; } hhsuite-2.0.16/scripts/hhblitsdb.pl0000775172256617226630000004551412110430072021560 0ustar hauserscientific_computing#!/usr/bin/env perl # # hhblits.pl # Creates HH-suite database files from A3M and HHM/HMMER-formatted files # Usage: Usage: perl hhblitsdb.pl -o [-ia3m ] [-ihhm ] [-ics ] [more_options] # # HHsuite version 2.0.16 (Sept 2012) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; #use File::Glob 'bsd_glob'; # splits patterns delimited by spaces into multiple patterns and applies them using OR $|= 1; # Activate autoflushing on STDOUT # Default values: our $v=2; # verbose mode my $a_if_append = ""; # do not append by default (default: create new db) my $remove = 0; # do not remove by default (default: create new db) my $hhmext = "hhm"; # default HHM-file extension my $csext = "seq219"; # default HHM-file extension my $cpu = 8; # Variable declarations my $line; my $command; my $a3mdir = ""; # name of input A3M directory my $hhmdir = ""; # name of input HHM/HMM directory my $csdir = ""; # name of input cs directory my $a3mfile = ""; # name of packed ouput A3M file my $hhmfile = ""; # name of packed ouput HHM file my $csfile = ""; # name of cs sequence db file my $dbname = ""; # output db name my $logfile = "/dev/null"; # log file my $file; my $numcsfiles= 0; my $num_chars = 0; my $numa3mfiles=0; my $numhhmfiles=0; my $fileglob=""; my $help=" hhblitsdb.pl from HHsuite $VERSION Builds HH-suite database from a3m formatted MSAs and/or from HMMs (-o). MSAs and HMMs can also be added (-a) to or removed (-r) from an existing database. Usage: hhblitsdb.pl -o|-a|-r [-ia3m ] [-ihhm ] [-ics ]... With option -o, the following HH-suite database files can be generated: .cs219 column-state sequences, one for each MSA/HMM (for prefilter) .cs219.sizes number of sequences and characters in .cs219 _a3m_db packed file containing A3M alignments read from _a3m_db.index index file for packed A3M file _a3m.db.index.sizes number of lines in _a3m_db.index _hhm_db packed file containing HHM-formatted HMMs read from _hhm_db.index index file for packed HHM file _hhm_db.index.sizes number of lines in _hhm_db.index Options: -o create database with this name -a append files to database with this name -r remove files from database with this name -ia3m input directory (or glob of directories) with A3M-formatted files These files MUST have extension 'a3m'. -ihhm input directory (or glob of directories) with HHM (or HMMER) files These files MUST have extension 'hhm' (HHsuite) or 'hmm' (HMMER3). -ics input directory (or glob of directories) with column state sequences -log log file recording stderr stream of cstranslate and hhmake commands -csext extension of column state sequences (default: $csext) -hmm use HMMER-formatted files. These MUST have extension hmm (WARNING! HMMER format results in decreased performance over HHM format) -v [1-3] verbose mode (default: $v) -cpu number of threads to generate cs219 and hhm files (default = $cpu) -f 'file_glob' string with list of glob expression of files to remove Example 1: only -ia3m given; cs sequences and hhm files are generated from a3m files perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ Example 2: only -ihhm given; cs sequences are generated from hhm files, but no a3m db file perl hhblitsdb.pl -o databases/mydb -ihhm mydb/hhms/ Example 3: -ia3m and -ihhm given; cs sequences are generated from a3m files perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ -ihhm mydb/hhms/ Example 4: -ics, -ia3m, and -ihhm given; all db files are created perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ -ihhm mydb/hhms/ -ics mydb/cs/ Example 5: using glob expression to specify files (note the singe quotes) perl hhblitsdb.pl -o databases/mydb -ihhm 'mydbs*/hhms/*.hhm' Example 6: add files to database; cs sequences and hhm files are generated from a3m files perl hhblitsdb.pl -a databases/mydb -ia3m 'mydbs/a3ms/g1a*.a3m' Example 7: remove files from database perl hhblitsdb.pl -r databases/mydb -f 'mydbs/a3ms/g1a*.* mydbs2/' \n"; ############################################################################################### # Processing command line input ############################################################################################### if (@ARGV<1) {die ($help);} for (my $i=0; $i<@ARGV; $i++) { if ($ARGV[$i] eq "-ics") { if (++$i<@ARGV) { $csdir=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing directory after -ics option!\n"); } } elsif ($ARGV[$i] eq "-ia3m") { if (++$i<@ARGV) { $a3mdir=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing directory after -ia3m option!\n"); } } elsif ($ARGV[$i] eq "-ihhm") { if (++$i<@ARGV) { $hhmdir=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing directory after -ihhm option!\n"); } } elsif ($ARGV[$i] eq "-log") { if (++$i<@ARGV) { $logfile=$ARGV[$i]; unlink $logfile; } else { die ("$help\n\nERROR! Missing filename after -log option!\n"); } } elsif ($ARGV[$i] eq "-csext") { if (++$i<@ARGV) { $csext=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing extension after -csext option!\n"); } } elsif ($ARGV[$i] eq "-hmm") { $hhmext="hmm"; print("\nWARNING! HMMER format results in decreased performance over HHM format. We recommend to generate hhm files directly from multiple sequence alignments using hmake.\n"); } elsif ($ARGV[$i] eq "-v") { if (++$i<@ARGV) { $v=$ARGV[$i]; } else { $v = 2; } } elsif ($ARGV[$i] eq "-cpu") { if (++$i<@ARGV) { $cpu=$ARGV[$i]; } } elsif ($ARGV[$i] eq "-f") { if (++$i<@ARGV) { $fileglob=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing expression after -f option!\n"); } } elsif ($ARGV[$i] eq "-r") { if (++$i<@ARGV) { if ($dbname!="") {die("$help\n\nERROR! options -o and -r not compatible!\n");} $dbname=$ARGV[$i]; $remove=1; } else { die ("$help\n\nERROR! Missing filename after -o option!\n"); } } elsif ($ARGV[$i] eq "-a") { if (++$i<@ARGV) { if ($remove==1) {die("$help\n\nERROR! options -r and -a not compatible!\n");} if ($dbname!="") {die("$help\n\nERROR! options -o and -a not compatible!\n");} $dbname=$ARGV[$i]; $a_if_append="a"; } else { die ("$help\n\nERROR! Missing filename after -o option!\n"); } } elsif ($ARGV[$i] eq "-o") { if (++$i<@ARGV) { if ($remove==1) {die("$help\n\nERROR! options -r and -o not compatible!\n");} if ($a_if_append) {die("$help\n\nERROR! options -a and -o not compatible!\n");} $dbname=$ARGV[$i]; } else { die ("$help\n\nERROR! Missing filename after -o option!\n"); } } else { if ($dbname="") { $dbname=$ARGV[$i]; } else { print "WARNING! Unknown option $ARGV[$i]!\n"; } } } # Check input if (!$dbname) {print($help); die("ERROR! Name of database is missing! Use -o \n");} $a3mdir=~s/\/$//; $a3mfile = $dbname."_a3m_db"; $hhmfile = $dbname."_hhm_db"; $csfile = $dbname.".cs219"; if ($hhmdir) {$hhmdir=~s/\/$//;} if ($a_if_append eq "" && $remove==0) { unlink $csfile, $a3mfile, $a3mfile.".index", $hhmfile, $hhmfile.".index"; } if ($a3mdir eq "" && $hhmdir eq "" && $csdir eq "" && $remove==0) { print($help); print "ERROR! At least one input directory must be given!\n"; exit(1); } # If $csdir is simple directory instead of glob expression, turn it into glob expression if ($csdir) { if ($csdir !~ /\*/ && $csdir !~ /\?/ && $csdir !~ / /) { $csdir .= "/*.".$csext; } } if ($a3mdir) { if ($a3mdir !~ /\*/ && $a3mdir !~ /\?/ && $a3mdir !~ / /) { $a3mdir .= "/*.a3m"; } } if ($hhmdir) { if ($hhmdir !~ /\*/ && $hhmdir !~ /\?/ && $hhmdir !~ / /) { $hhmdir .= "/*.".$hhmext; } } # If in append mode, initialize size counters with present sizes if ($a_if_append || $remove==1) { open (IN, "<$a3mfile.index.sizes") || die("Error: can't open $a3mfile.index.sizes: $!"); $line = ; close IN; $line =~ /^(\S*)/; $numa3mfiles = $1; open (IN, "<$hhmfile.index.sizes") || die("Error: can't open $hhmfile.index.sizes: $!"); $line = ; close IN; $line =~ /^(\S*)/; $numhhmfiles = $1; open (IN, "<$csfile.sizes") || die("Error: can't open $csfile.sizes: $!"); $line = ; close IN; $line =~ /(\S*)\s+(\S*)/; $numcsfiles = $1; $num_chars = $2; printf("Current number of a3m files in db: %i\n",$numa3mfiles); printf("Current number of $hhmext files in db: %i\n",$numhhmfiles); printf("Current number of $csext files in db: %i\n\n",$numcsfiles); } else { $numa3mfiles = 0; $numhhmfiles = 0; $numcsfiles = 0; $num_chars = 0; } # Create tmp directory (plus path, if necessary) my $tmpdir="/tmp/$ENV{USER}/$$"; # directory where all temporary files are written: /tmp/UID/PID my $suffix=$tmpdir; while ($suffix=~s/^\/[^\/]+//) { $tmpdir=~/(.*)$suffix/; if (!-d $1) {mkdir($1,0777);} } unlink glob("$tmpdir/*"); # clean up directory if it already exists unlink $logfile; ############################################################################################## # Remove files? ############################################################################################## if ($remove==1) { printf("Removing files from indices...\n"); # Read numbers of sequences and characters in csfile open (IN, "<$csfile.sizes"); $line = ; close IN; $line =~ /(\S*)\s+(\S*)/; $numcsfiles = $1; $num_chars = $2; # Remove names from a3m and hhm index files my $files = " ".join(" ", glob($fileglob)); $files =~ s/\S*\///g; &HHPaths::System("ffindex_modify -su $dbname"."_a3m_db.index ".$files); &HHPaths::System("ffindex_modify -su $dbname"."_hhm_db.index ".$files); # Adjust number of files in $a3mfile.index.sizes $numa3mfiles = 0; open (IN, "<$a3mfile.index") || die("Error: can't open $a3mfile.index: $!"); while() {$numa3mfiles++;} close IN; open (OUT, ">$a3mfile.index.sizes") || die("Error: can't open $a3mfile.index.sizes: $!"); printf(OUT "%i\n",$numa3mfiles); close(OUT); # Adjust number of files in $hhmfile.index.sizes $numhhmfiles = 0; open (IN, "<$hhmfile.index") || die("Error: can't open $hhmfile.index: $!"); while() {$numhhmfiles++;} close IN; open (OUT, ">$hhmfile.index.sizes") || die("Error: can't open $hhmfile.index.sizes: $!"); printf(OUT "%i\n",$numa3mfiles); close(OUT); # Remove sequences of globbed files from cs file my $skipseq=0; $numcsfiles = 0; $num_chars = 0; open (IN, "<$csfile"); open (OUT, ">$csfile".".tmp"); foreach my $line () { if ($line =~ /^>(\w*)/) { my $name = $1; if ($files =~ / $name\./) { # found name in list of globbed file names? $skipseq=1; } else { $skipseq=0; printf(OUT "%s",$line); $numcsfiles++; } } else { if (!$skipseq) { printf(OUT "%s",$line); $num_chars += length($line); } } } close(OUT); close(IN); unlink($csfile); &HHPaths::System("mv $csfile".".tmp ".$csfile); # Adjust $csfile.sizes open (OUT, ">$csfile.sizes"); print OUT "$numcsfiles $num_chars\n"; close OUT; } else { ############################################################################################## # Generate new db or append to old ############################################################################################## ############################################################################################## # Generate column-state database file ############################################################################################## # Generate column-state sequences in $tmpdir if no -ics directory given if (!$csdir) { my $x = 0.3; # parameters for cstranslate my $c = 4; # parameters for cstranslate if ($a3mdir) { print("Generating seq219 files in $tmpdir/ from a3m files $a3mdir\n\n"); $command = "$hhbin/cstranslate -i \$file -o $tmpdir/\$base.seq219 -D $context_lib -A $cs_lib -x $x -c $c 1>>$logfile 2>>$logfile"; &HHPaths::System("$hhscripts/multithread.pl '".$a3mdir."' '$command' -cpu $cpu"); } elsif ($hhmdir) { if ($hhmext eq "hmm") { print("\nGenerating prf profile files in $tmpdir/ from hmm files $hhmdir/\n\n"); $command = "$hhscripts/create_profile_from_hmmer.pl -i \$file -o $tmpdir/\$base.prf 1>/dev/null 2>>$logfile"; &HHPaths::System("$hhscripts/multithread.pl '".$hhmdir."' '$command' -cpu $cpu"); } else { # $hhmext eq "hhm" print("\nGenerating prf profile files in $tmpdir/ from hhm files $hhmdir/\n\n"); $command = "$hhscripts/create_profile_from_hhm.pl -i \$file -o $tmpdir/\$base.prf 1>/dev/null 2>>$logfile"; &HHPaths::System("$hhscripts/multithread.pl '".$hhmdir."' '$command' -cpu $cpu"); } print("\nGenerating seq219 files in $tmpdir/ from prf files in $tmpdir/\n\n"); if ($hhmext eq "hmm") { $command = "$hhbin/cstranslate -i \$file -o \$name.seq219 -A $cs_lib 1>>$logfile 2>>$logfile"; } else { # $hhmext eq "hhm" $command = "$hhbin/cstranslate -i \$file -o \$name.seq219 -A $cs_lib -D $context_lib -x $x -c $c 1>>$logfile 2>>$logfile"; } &HHPaths::System("$hhscripts/multithread.pl '".$tmpdir."/*.prf' '$command' -cpu $cpu"); } $csdir = $tmpdir."/*.$csext"; } # Write columns state sequences into cs database file, # replace names in cs sequences with filenames: ">name+description" => ">filename" if ($a_if_append) { open (OUT, ">>$csfile"); } else { open (OUT, ">$csfile"); } foreach my $seq219file (glob($csdir)) { open (IN, "<$seq219file"); my @lines = ; close(IN); $seq219file =~ s/.*?([^\/]*)\.$csext\s*/$1/ or die ("Error: $seq219file does not have the extension $csext!?\n"); foreach my $line (@lines) { if ($line =~ /^>/) { $line = ">".$seq219file."\n"; $numcsfiles++; } else { $num_chars += length($line); } printf(OUT "%s",$line); } } close(OUT); open (OUT, ">$csfile.sizes"); print OUT "$numcsfiles $num_chars\n"; close OUT; ############################################################################################## # Generate hhm files with hhmake from a3m files if no -ihhm directory given ############################################################################################## if (!$hhmdir) { if ($a3mdir) { print("\nGenerating hhm files in $tmpdir/ from a3m files $a3mdir/\n\n"); $command = "hhmake -i \$file -o $tmpdir/\$base.hhm 1>/dev/null 2>>$logfile"; &HHPaths::System("$hhscripts/multithread.pl '".$a3mdir."' '$command' -cpu $cpu"); $hhmdir = $tmpdir."/*.$hhmext";; $numhhmfiles += scalar(glob("$hhmdir")); } } ############################################################################################## # Generate packed A3M and HMM files and index files ############################################################################################## # Generate packed A3M file and index file? if ($a3mdir ne "") { print "Creating packed A3M database file $a3mfile ...\n"; open (OUT, ">$tmpdir/a3m.filelist"); my @files = glob("$a3mdir"); $numa3mfiles += scalar(@files); foreach $file (@files) { print OUT "$file\n"; } close OUT; # Build packed file (concatenated with '\0' as delimiters) and index file from files in file list # The ffindex binaries are contained in /lib/ffindex/bin/ $command = "ffindex_build -".$a_if_append."s -f $tmpdir/a3m.filelist $a3mfile $a3mfile.index"; &HHPaths::System($command); open (OUT, ">$a3mfile.index.sizes"); print OUT "$numa3mfiles\n"; close OUT; } # Generate packed HHMM file and index file? if ($hhmdir ne "") { print "Creating packed HHM database file $hhmfile ...\n"; open (OUT, ">$tmpdir/hhm.filelist"); my @files = glob("$hhmdir"); $numhhmfiles += scalar(@files); foreach $file (@files) { print OUT "$file\n"; } close OUT; # Build packed file (concatenated with '\0' as delimiters) and index file from files in file list # The ffindex binaries are contained in /lib/ffindex/bin/ $command = "ffindex_build -".$a_if_append."s -f $tmpdir/hhm.filelist $hhmfile $hhmfile.index"; &HHPaths::System($command); open (OUT, ">$hhmfile.index.sizes"); print OUT "$numhhmfiles\n"; close OUT; } } # end if $remove==0 print("\n"); printf("New number of a3m files in db: %i\n",$numa3mfiles); printf("New number of $hhmext files in db: %i\n",$numhhmfiles); printf("New number of $csext files in db: %i\n\n",$numcsfiles); my $err=0; if ($numa3mfiles && $numhhmfiles && $numa3mfiles != $numhhmfiles) { print("************************************************************************** WARNING: Number of a3m files not equal to number of $hhmext files\n"); $err=1; } if ($numcsfiles && $numhhmfiles && $numcsfiles != $numhhmfiles) { print("************************************************************************** WARNING: Number of $csext files not equal to number of $hhmext files\n"); $err=1; } if ($numcsfiles && $numa3mfiles && $numcsfiles != $numa3mfiles) { print("************************************************************************** WARNING: Number of $csext files not equal to number of a3m files\n"); $err=1; } if ($err==1) {print("************************************************************************** $tmpdir will not be removed to check for missing files **************************************************************************\n");} elsif ($v<3) { $command = "rm -rf $tmpdir"; # &System($command); } wait; exit; hhsuite-2.0.16/scripts/pdb2fasta.pl0000775172256617226630000011264012110430072021456 0ustar hauserscientific_computing#! /usr/bin/env perl # # pdb2fasta.pl - generate FASTA nonredundant sequence file from SEQRES records of globbed pdb files. # HHsuite version 2.0.16 (April 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; $|= 1; # Activate autoflushing on STDOUT # Default parameters my $v=2; my $help=" pdb2fasta.pl - Generate FASTA nonredundant sequence file from SEQRES records of globbed pdb files. For updating purposes, you can write only those sequences to pdb_new.fas that are not already contained in an old file by giving as third argument the old pdb.fas file. Usage: pdb2fasta.pl 'pdb-fileglob' pdb_newseqs.fas [options] Options: -u oldfile update: write only those sequences to pdb_new.fas that are not contained in oldfile -scop file read dir.cla.scop.txt_1.65 and list SCOP fold(s) in sequence name -dali dir read FoldIndex.html and domain_definitions.txt in DALI directory and list DALI fold(s) in sequence name -v int verbose mode -t MTH-YR use only structures released until the given month and year, e.g. APR-12 or SEP-99 -all include all sequences instead of nonredundant set Examples: pdb2fasta.pl '*.ent' /data/pdbfas/pdb_20Apr2012.fas pdb2fasta.pl '*.pdb' pdb_new.fas -u pdb.fas -dali /data/dali -scop /data/scop/dir.cla.scop.txt_1.75 \n"; my $TOTLEN=160; # maximum length of name, description, and keywords my $DESCLEN=80; # maximum length of description if (@ARGV<2) {die($help);} my @pdbfiles; my $newseqfile; my $oldfile=""; my $dalidir=""; my $scopfile=""; my $date=""; my %months=("JAN"=>1,"FEB"=>2,"MAR"=>3,"APR"=>4,"MAY"=>5,"JUN"=>6,"JUL"=>7,"AUG"=>8,"SEP"=>9,"OCT"=>10,"NOV"=>11,"DEC"=>12); my %oldpdbids=(); # hash contains all pdbids in $oldfile our $pdbfile; my $pdbid; # four-letter PDB identifier, e.g. 1hz4 my $resolution; # experimental resolution in Angstrom my $rvalue; # R-value my $free_rvalue; # free R-value my $molid=0; # molecule id (for multichain structures) my $length; # number of residues in a chain my @seqres=(); # three-letter code of chain currently read in my $seqres; # my %descript; # $descript{"A"} contains the description for chain A my $descript; my %organism; # $organism{"A"} contains the organism for chain A my $organism; my $organism_common; my @chain; # $chain[$molid] my $chain; # either A for chain A or "" if no chain id my @chains; # my @keywds; # keywords for the structure my $keywds; # keywords for the structure my $token; my $synonym; # read from COMPND SYNONYM records of pdb files my @synonyms; # read from COMPND SYNONYM records of pdb files my $line; # line read in from file my @sequences=(); # contains all sequences of chains to be printed to outfile my @resolution=(); # $resolution[$nc] contains resolution of $nc'th sequence, where $nc=$nchains{$seqres} my %nchains; # $nchains{$seqres} is index in @sequences of sequence with these residues my $nchains=0; # number of chains written to $newseqfile my $k=0; # counts pdb files processed my @equiv_pdbs; # list of pdbids (including _chain) with identical residues (maximum one pdbid_chain per pdb file) my %dalifamids=(); # $foldids{$pdbid} contains a list of (one or more) DALI or SCOP foldids my %scopfamids=(); # $foldids{$pdbid} contains a list of (one or more) DALI or SCOP foldids my $het; # $het contains list of hetero ligands with at least 10 atoms in current pdb file (e.g. "DAC,PTR") my %words; # for debugging upper case -> lower case my $nr=1; # 1: create nonredundant set 0:do not eliminate redundant sequences my %three2one=( "ALA"=>"A","VAL"=>"V","PHE"=>"F","PRO"=>"P","MET"=>"M","ILE"=>"I","LEU"=>"L","ASP"=>"D","GLU"=>"E","LYS"=>"K", "ARG"=>"R","SER"=>"S","THR"=>"T","TYR"=>"Y","HIS"=>"H","CYS"=>"C","ASN"=>"N","GLN"=>"Q","TRP"=>"W","GLY"=>"G", "2AS"=>"D","3AH"=>"H","5HP"=>"E","ACL"=>"R","AIB"=>"A","ALM"=>"A","ALO"=>"T","ALY"=>"K","ARM"=>"R","ASA"=>"D", "ASB"=>"D","ASK"=>"D","ASL"=>"D","ASQ"=>"D","AYA"=>"A","BCS"=>"C","BHD"=>"D","BMT"=>"T","BNN"=>"A","BUC"=>"C", "BUG"=>"L","C5C"=>"C","C6C"=>"C","CCS"=>"C","CEA"=>"C","CHG"=>"A","CLE"=>"L","CME"=>"C","CSD"=>"A","CSO"=>"C", "CSP"=>"C","CSS"=>"C","CSW"=>"C","CXM"=>"M","CY1"=>"C","CY3"=>"C","CYG"=>"C","CYM"=>"C","CYQ"=>"C","DAH"=>"F", "DAL"=>"A","DAR"=>"R","DAS"=>"D","DCY"=>"C","DGL"=>"E","DGN"=>"Q","DHA"=>"A","DHI"=>"H","DIL"=>"I","DIV"=>"V", "DLE"=>"L","DLY"=>"K","DNP"=>"A","DPN"=>"F","DPR"=>"P","DSN"=>"S","DSP"=>"D","DTH"=>"T","DTR"=>"W","DTY"=>"Y", "DVA"=>"V","EFC"=>"C","FLA"=>"A","FME"=>"M","GGL"=>"E","GLZ"=>"G","GMA"=>"E","GSC"=>"G","HAC"=>"A","HAR"=>"R", "HIC"=>"H","HIP"=>"H","HMR"=>"R","HPQ"=>"F","HTR"=>"W","HYP"=>"P","IIL"=>"I","IYR"=>"Y","KCX"=>"K","LLP"=>"K", "LLY"=>"K","LTR"=>"W","LYM"=>"K","LYZ"=>"K","MAA"=>"A","MEN"=>"N","MHS"=>"H","MIS"=>"S","MLE"=>"L","MPQ"=>"G", "MSA"=>"G","MSE"=>"M","MVA"=>"V","NEM"=>"H","NEP"=>"H","NLE"=>"L","NLN"=>"L","NLP"=>"L","NMC"=>"G","OAS"=>"S", "OCS"=>"C","OMT"=>"M","PAQ"=>"Y","PCA"=>"E","PEC"=>"C","PHI"=>"F","PHL"=>"F","PR3"=>"C","PRR"=>"A","PTR"=>"Y", "SAC"=>"S","SAR"=>"G","SCH"=>"C","SCS"=>"C","SCY"=>"C","SEL"=>"S","SEP"=>"S","SET"=>"S","SHC"=>"C","SHR"=>"K", "SOC"=>"C","STY"=>"Y","SVA"=>"S","TIH"=>"A","TPL"=>"W","TPO"=>"T","TPQ"=>"A","TRG"=>"K","TRO"=>"W","TYB"=>"Y", "TYQ"=>"Y","TYS"=>"Y","TYY"=>"Y","AGM"=>"R","GL3"=>"G","SMC"=>"C","ASX"=>"B","CGU"=>"E","CSX"=>"C","GLX"=>"Z", "LED"=>"L" ); # Read command line options my $options=""; for (my $i=0; $i<=$#ARGV; $i++) {$options.=" $ARGV[$i]";} if ($options=~s/ -u\s+(\S+)//) {$oldfile=$1;} if ($options=~s/ -dali\s+(\S+)//) {$dalidir=$1;} if ($options=~s/ -scop\s+(\S+)//) {$scopfile=$1;} if ($options=~s/ -v\s*(\d+)//) {$v=$1;} if ($options=~s/ -v//) {$v=2;} if ($options=~s/ -all//) {$nr=0;} if ($options=~s/ -t (\w\w\w)-(\d\d)//) {$date=($months{$1}-1)/12+$2+100*($2<50);} if ($options=~s/^\s*([^- ]\S+)\s*//) { if ($v>=2) {print("Globbing...")}; @pdbfiles=glob($1); if ($v>=2) {print(" found ".scalar(@pdbfiles)." files\n")}; } if ($options=~s/^\s*([^- ]\S+)\s*//) {$newseqfile=$1;} # Warn if unknown options found or no infile/newseqfile if ($options!~/^\s*$/) {$options=~s/^\s*(.*?)\s*$/$1/g; die("Error: unknown options '$options'\n");} if (!@pdbfiles) {print($help); print("Error: no input files given\n"); exit;} if (!$newseqfile) {print($help); print("Error: no output file given\n"); exit;} # Updating option? if ($oldfile) { # Reading pdb codes from $oldfile if ($v>=3) {printf("Reading pdb codes from $oldfile ... \n");} open (OLDFILE,"<$oldfile") || die ("ERROR: cannot open $oldfile for writing: $!\n"); while ($line=) { if ($line=~/^>(\S\S\S\S)/o) {$oldpdbids{$1}=1;} } close(OLDFILE); } # Add fold identifiers? if ($dalidir) {&ReadDaliFiles();} if ($scopfile) {&ReadScopFile();} ############################################################################################ # Read one pdb file after the other foreach $pdbfile (@pdbfiles) { $k++; if ($pdbfile=~/^.*\/(.*?)$/) {$pdbid=$1;} else {$pdbid=$pdbfile;} # remove path if ($pdbid=~/^(pdb)?(.*)\..*$/) {$pdbid=lc($2);} else {die("Error: globbed file $pdbfile has no extension\n");} if (exists $oldpdbids{$pdbid}) {next;} if ($v>=1) { print("."); if (!($k%100)) {print("$k\n");} } elsif ($v>=2) {printf("Reading %4i %s\n",$k,$pdbfile);} open (PDBFILE, "<$pdbfile") || die ("Error: couldn't open $pdbfile: $!\n"); if ($v>=4) {print("Reading $pdbfile...\n");} $line=; # Initialize before reading new pdb file $resolution=0; $rvalue=0; $free_rvalue=0; $molid=0; $token="MOLECULE"; $descript=""; $organism=""; $organism_common=""; $keywds=""; $chain=""; %organism=(); %descript=(); @keywds=(); @chain=(); @seqres=(); $synonym=""; @synonyms=(); $het=""; # will contain list of hetero groups (if found) # COMPND ASPARTATE AMINOTRANSFERASE (E.C.2.6.1.1) WILD TYPE COMPLEXED 1ASA 3 # COMPND 2 WITH PYRIDOXAL-5'-PHOSPHATE AND MALEATE 1ASA 4 # or # COMPND MOL_ID: 1; # COMPND 2 MOLECULE: ACTIN-LIKE PROTEIN 3; # COMPND 3 CHAIN: A; # COMPND 4 SYNONYM: ARP3; ACTIN-RELATED PROTEIN 3; ACTIN-2; # COMPND 5 OTHER_DETAILS: PART OF THE ARP2/3 COMPLEX; # COMPND 6 MOL_ID: 2; # COMPND 7 MOLECULE: ACTIN-LIKE PROTEIN 2; # COMPND 8 CHAIN: B; # COMPND 9 SYNONYM: ARP2; ACTIN-RELATED PROTEIN 2; # COMPND 10 OTHER_DETAILS: PART OF THE ARP2/3 COMPLEX; # or # COMPND MOL_ID: 1; # COMPND 2 MOLECULE: PHOSPHATE SYSTEM POSITIVE REGULATORY PROTEIN # COMPND 3 PHO4; # COMPND 4 CHAIN: A, B; # COMPND 5 FRAGMENT: DNA BINDING DOMAIN; # COMPND 6 SYNONYM: BHLH; # COMPND 7 ENGINEERED: YES; # COMPND 8 BIOLOGICAL_UNIT: DIMER; while ($line && $line!~/^COMPND /o && $line!~/^REMARK /o) {$line=;} if (!$line || $line!~/^COMPND /) { if ($v>=2) {print("\n\nWarning: no COMPND line found in $pdbfile; skipping pdb file\n");} next; } while ($line && $line=~/^COMPND /o && $line!~/^REMARK /o) { $line=~s/^(.{70}).*/$1/; if ($line=~/^COMPND\s+\d*\s+MOL_ID:\s*(\d+)/) { if ($molid>0) { &SetDescript(); } else {$molid=$1;} $descript=""; $synonym=""; } elsif ($line=~/^COMPND\s+\d*\s+MOLECULE:\s*(.*\S)/) {$descript=$1; $token="MOLECULE";} elsif ($line=~/^COMPND\s+\d*\s+CHAIN:\s*(.*\S)/) {$chain=$1; $token="CHAIN";} elsif ($line=~/^COMPND\s+\d*\s+SYNONYM:\s*(.*\S)/) {$synonym=$1;} elsif ($line=~/^COMPND\s+\d*\s+FRAGMENT:/) {$token="";} elsif ($line=~/^COMPND\s+\d*\s+EC:/) {$token="";} elsif ($line=~/^COMPND\s+\d*\s+ENGINEERED:/) {$token="";} elsif ($line=~/^COMPND\s+\d*\s+MUTATION:/) {$token="";} elsif ($line=~/^COMPND\s+\d*\s+BIOLOGICAL UNIT:/) {$token="";} elsif ($line=~/^COMPND\s+\d*\s+OTHER_DETAILS:/) {$token="";} else { $line=~/^COMPND\s+\d*\s+(.*\S)/; if ($token eq "MOLECULE") {$descript.=" ".$1;} elsif ($token eq "SYNONYM") {$synonym.=" ".$1;} elsif ($token eq "CHAIN") {$chain.=" ".$1;} } $line=; } &SetDescript(); if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} # SOURCE (ESCHERICHIA COLI) 1ASA 5 # or # SOURCE MOL_ID: 1; # SOURCE 2 ORGANISM_SCIENTIFIC: BOS TAURUS; # SOURCE 3 ORGANISM_COMMON: BOVINE; # SOURCE 4 ORGAN: THYMUS; # SOURCE 5 MOL_ID: 2; # SOURCE 6 ORGANISM_SCIENTIFIC: BOS TAURUS; # SOURCE 7 ORGANISM_COMMON: BOVINE; # SOURCE 8 ORGAN: THYMUS; $molid=0; $token="ORGANISM"; # $organism="Synthetic?"; while ($line && $line!~/^SOURCE /o && $line!~/^REMARK /o) {$line=;} if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} if ($v>=2 && $line!~/^SOURCE /) {print("\n\nWarning: no SOURCE line found in $pdbfile\n");} while ($line=~/^SOURCE /o && $line!~/^REMARK /o) { $line=~s/^(.{70}).*/$1/; if ($line=~/^SOURCE\s+\d*\s+MOL_ID:\s*(\d+)/) { if ($molid>0) { &SetOrganism(); } else {$molid=$1;} } elsif ($line=~/^SOURCE\s+\d*\s+ORGANISM_SCIENTIFIC:\s*(.*\S)/) {$organism=$1; $token="ORGANISM";} elsif ($line=~/^SOURCE\s+\d*\s+SYNTHETIC/) {if ($organism eq "") {$organism="Synthetic"; $token="";}} elsif ($line=~/^SOURCE\s+\d*\s+FRAGMENT:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+ORGANISM_COMMON:\s+(.*\S)/) {$organism_common=$1; $token="";} elsif ($line=~/^SOURCE\s+\d*\s+STRAIN:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+VARIANT:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+CELL_LINE:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+ATCC:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+ORGAN:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+TISSUE:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+CELL:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+ORGANELLE:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+SECRETION:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+CELLULAR_LOCATION:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+PLASMID:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+GENE:/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+EXPRESSION_/) {$token="";} elsif ($line=~/^SOURCE\s+\d*\s+OTHER_DETAILS:/) {$token="";} else { $line=~/^SOURCE\s+\d*\s+(.*\S)/; if ($token eq "ORGANISM") {$organism.=$1;} } $line=; } &SetOrganism(); if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} # KEYWDS KETOLISOMERASE, XYLOSE METABOLISM, GLUCOSE-FRUCTOSE # KEYWDS 2 INTERCONVERSION, HYDRIDE TRANSFER, ALPHA-BETA BARREL, # KEYWDS 3 METALLOENZYME, THERMOPHILE while ($line && $line!~/^KEYWDS /o && $line!~/^REMARK /o) {$line=;} if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} while ($line=~/^KEYWDS /o) { $line=~s/^(.{70}).*/$1/; if ($line=~/^KEYWDS\s+\d*\s+(.*\S)/) {$keywds.=" ".$1;} $line=; } $keywds=~s/CRYSTAL STRUCTURE,?\s*//i; $keywds=~s/X-RAY STRUCTURE,?\s*//i; $keywds=~s/THREE-DIMENSIONAL STR.CTURE,?\s*//i; $keywds=~s/NMR,?\s*//i; if ($keywds) { $keywds=~s/\s+/ /g; $keywds=~s/^\s+/ /; $keywds=~s/\s*;?$/;/; @keywds=split(/[,;]\s+/,$keywds); } else {@keywds=();} # Include keywords up to 50 chars taken my @these_keywds=@keywds; if (@these_keywds) { # Remove keywords that are substring of description or organism for (my $k=0; $k<@these_keywds; $k++) { $keywds=$these_keywds[$k]; my $ddescript=$descript; my $kkeywds=$keywds; my $oorganism=$organism; $ddescript=~tr/a-zA-Z//cd; $kkeywds=~tr/a-zA-Z//cd; $oorganism=~tr/a-zA-Z//cd; if ($ddescript=~/$kkeywds/i) {splice(@these_keywds,$k,1); $k--;} elsif ($kkeywds=~/$ddescript/i) {splice(@these_keywds,$k,1); $k--;} elsif ($oorganism=~/$kkeywds/i) {splice(@these_keywds,$k,1); $k--;} } # Add keywords until length limitation is exceeded ($TOTLEN chars) if (@these_keywds) { $keywds=$these_keywds[0]; for (my $k=1; $k<@these_keywds && length($descript.$keywds.", ".$these_keywds[$k].$organism)<$TOTLEN; $k++) { $keywds.=", ".$these_keywds[$k]; } $keywds=~s/^(\S)/ $1/; # add space at first position } else {$keywds="";} } else {$keywds="";} foreach my $chain (keys(%descript)) {$descript{$chain}.=$keywds;} # Check date? if ($date) { while ($line && $line!~/^REVDAT 1/o && $line!~/^REMARK /o) {$line=;} if ($line=~/^REVDAT 1/) { if ($line=~/^.{16}(\w\w\w)-(\d\d)/) { my $thisdate=($months{$1}-1)/12+$2+100*($2<50); # print("This date: $thisdate date=$date\n$line"); if ($thisdate>$date) {next;} } elsif ($v>=2) { print("WARNING: no valid date in header: \n$line"); } } } # REMARK 2 RESOLUTION. 2.00 ANGSTROMS. while ($line && $line!~/^REMARK 2 /o && $line!~/^SEQRES /o) {$line=;} if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} if ($v>=2 && $line!~/^REMARK 2 /) {print("\n\nWarning: no REMARK 2 line found in $pdbfile\n");} while ($line=~/^REMARK 2 /o && $line!~/^SEQRES /o) { if ($line=~/^REMARK 2\s+RESOLUTION\.\s+(\d+\.?\d*)/) {$resolution=$1; last;} $line=; } # REMARK 3 R VALUE (WORKING SET) : 0.216 # REMARK 3 FREE R VALUE : 0.251 while ($line && $line!~/^REMARK 3 /o && $line!~/^SEQRES /o) {$line=;} if (!$line) {if ($v>=2) {print("\nFormat error in $pdbfile. Skipping file ...\n");} next;} if ($v>=2 && $line!~/^REMARK 3 /) {print("\n\nWarning: no REMARK 3 line found in $pdbfile\n");} while ($line=~/^REMARK 3 /o && $line!~/^SEQRES /o) { if ($line=~/^REMARK 3\s+R VALUE\s+\(WORKING SET\)\s*:\s*(\d+\.?\d*)/o) {$rvalue=$1;} if ($line=~/^REMARK 3\s+FREE R VALUE\s*:\s*(\d+\.?\d*)/o) {$free_rvalue=$1;} $line=; } # Record current position in PDBFILE my $file_pos = tell(PDBFILE); # Search for hetero groups BEFORE adding seqeunces => read pdb file twice :( while ($line && $line!~/^HET /o && $line!~/^ATOM /o) {$line=;} if (defined $line && $line=~/^HET /o) { while ($line) { # ----+----1----+----2----+----3 # HET DAC A 172 18 if ($line=~/^HET\s+(\S+) ..........\s*(\d+)/) { if ($2>=10 ) { my $this_het=$1; if ($het!~/$this_het/) { # don't list any hetgoup twice if ($het eq "") {$het=" HET: $1";} else {$het.=" $1";} } } } else { last; } $line=; } } if ($het ne "") {$het.=";";} # Rewind the current position in PDBFILE back before SEQRES records seek (PDBFILE,$file_pos,0); # SEQRES 1 396 MET PHE GLU ASN ILE THR ALA ALA PRO ALA ASP PRO ILE 1ASA 60 # SEQRES 1 A 366 SER ARG MET PRO SER PRO PRO MET PRO VAL PRO PRO ALA @seqres=(); my $newchain="@"; # make sure that sequence is not printed before first chain has been read my $newlength; # compare previous to current chain to find out when one chain is finished while ($line && $line!~/^SEQRES /o) {$line=;} if (!defined $line) { if ($v>=2) {print("\n\nWarning: no SEQRES line found in $pdbfile. Skipping file ...\n");} close (PDBFILE); next; } while ($line=~/^SEQRES /o) { if ($line=~/^SEQRES\s+\d+\s+(\S?)\s+(\d+)\s+(.{51})/o) { $chain=$newchain; $newchain=$1; $length=$newlength; $newlength=$2; $seqres=$3; $seqres=~s/\s*$//; # print($line); # printf("line $.: prevlen=%-4i counted=%-4i newchain=%1s chain=%1s \n\n",$length,scalar(@seqres),$newchain,$chain); # Compare previous to current chain to find out when one chain is finished if ($chain ne $newchain && $chain ne "@") { if (scalar(@seqres)!=$length) { if ($v>=2) {printf("\nWarning: in $pdbfile, line $., sequence length=$length, counted residues = %i\n",scalar(@seqres));} } &AddSequence(); @seqres=(); } push(@seqres,split(/\s+/,$seqres)); } else { print("\nError: found invalid SEQRES record in $pdbfile, line $. : line=$line"); next; } $line=; } $chain=$newchain; $length=$newlength; &AddSequence(); close (PDBFILE); } # end foreach $pdbfile ############################################################################################ # Print all sequences open (NEWSEQFILE,">$newseqfile") || die ("ERROR: cannot open $newseqfile for writing: $!\n"); for (my $nc=0; $nc<@sequences; $nc++) { if ($equiv_pdbs[$nc] ne "") { $sequences[$nc]=~s/^(.*)/$1 PDB:$equiv_pdbs[$nc]/; # Add list of equivalent pdb codes } printf(NEWSEQFILE "%s",$sequences[$nc]); } close(NEWSEQFILE); foreach my $word (keys(%words)) {print("$word ");} print("\n"); print("Written $nchains chains to $newseqfile\n"); exit; ################################################################################## # Set description when a new MOL_ID line is found, or at the end of COMPND records ################################################################################## sub SetDescript() { my $i; # print("chain=$chain\n"); if ($chain eq "NULL;") {$chain="";} $chain[$molid]=$chain; $molid=$1; if ($descript=~/^DNA[ ;]/) {$het=" HET: DNA";} # Cut description down to max. $DESCLEN letters $descript=~s/\s*;\s*$//; if (length($descript)>$DESCLEN) { $descript=~s/(.{$DESCLEN}\S*).*/$1.../; # remove everything after first comma } # Add synonyms with a maximum of 16 letters to description if ($synonym ne "") { @synonyms=split(/;\s+/,$synonym); for ($i=0; $i16) { splice(@synonyms,$i,1); } else { $synonyms[$i]=~s/;\s*//; $token="SYNONYM"; } } } # Choose shortname (<=16 characters) from synonyms unshift(@synonyms,$descript); for ($i=0; $i=scalar(@synonyms)) {$i=0;} $descript=$synonyms[$i]; $descript=~s/^\s*//; $descript=~s/\s*$//; splice(@synonyms,$i,1); for $synonym (@synonyms) {$descript.=", ".$synonym;} if ($descript ne "") { $descript=~s/\s+/ /g; $descript=~s/^\s+//g; $descript=~s/\s*;*\s*$//; # remove ';' } $descript.=";"; # append a semicolon ';' if ($chain ne "") { $chain=~s/\s*;\s*$//; @chains=split(/[,; ]\s*/,$chain); foreach $chain (@chains) { $descript{$chain}=$descript; # printf("chain='$chain' description='$descript'\n"); } } else { $descript{$chain}=$descript; # printf("chain='$chain' description='$descript'\n"); } } ################################################################################## # Set organism when a new MOL_ID line is found, or at the end of SOURCE records ################################################################################## sub SetOrganism() { if ($organism eq "" && $organism_common ne "") {$organism=$organism_common;} if (!exists $chain[$molid]) {$molid=1-$molid;} $chain=$chain[$molid]; $molid=$1; $organism=~tr/$//d; $organism=~s/^\s*([^;:]*).*/$1/; if ($organism=~/^\S*\s*\(([\w ]*)/) {$organism=$1;} # bovine (Bos taurus) elsif ($organism=~/^([\w -]+)/) {$organism=$1;} # BACTERIOPHAGE T4 (MUTANT GENE DERIVED ...) elsif ($organism=~/^(\S+\s+\S+)/) {$organism=$1;} # maximum two words elsif ($organism=~/^(\S+)/) {$organism=$1;} $organism=~s/\s*$//g; if ($chain ne "") { $chain=~s/\s*;\s*$//; @chains=split(/[,; ]\s*/,$chain); foreach $chain (@chains) { $organism{$chain}=$organism; # printf("chain='%s' organism{chain}='%s'\n",$chain,$organism{$chain}); } } else { $organism{$chain}=$organism; # printf("chain='%s' organism{chain}='%s'\n",$chain,$organism{$chain}); } } ################################################################################## # Print out sequence of last chain read in ################################################################################## sub AddSequence() { my $seqres=""; my $pdbidchain; my $nc; # $nc= either next chain number OR, if identical seq exists with better resolution, index of this seq foreach my $aa (@seqres) {$seqres.=&Three2OneLetter($aa);} if ($v>=3) { printf("CHAIN ='%s'\n",$chain); printf("DESCRP='%s'\n",$descript{$chain}); printf("KEYWDS='$keywds'\n"); printf("ORGANI='%s'\n",$organism{$chain}); printf("SEQRES='%s'\n",$seqres); } if (length($seqres)<=20) {return 1;} # skip short protein/DNA chains (for DNA's ADGT &Three2OneLetter() returns "") if ($chain ne "") {$pdbidchain=$pdbid."_".$chain;} else {$pdbidchain=$pdbid;} # Check for nonredundancy if ($nr==1 && defined $nchains{$seqres} ) { $nc=$nchains{$seqres}; # $sequences[$nchains{$seqres}]=~/^(\S+)/; # print("Sequence $pdbid"."_$chain redundant with $1. Res now: $resolution Res before: $resolution[$nc]\n"); if ($resolution==0 || $resolution[$nc]<=$resolution) { # PDB identifier not yet contained in list of equivalent pdb ids? if ($equiv_pdbs[$nc]!~/$pdbid/ && $sequences[$nc]!~/^>$pdbid/) { $equiv_pdbs[$nc].=" $pdbidchain"; # Add new pdbid_chain to list $equiv_pdbs[$nc] if ($het ne "") {$equiv_pdbs[$nc].="*";} } return 1; } else { # Sequence redundant # => Throw out earlier sequence and keep this one # => Keep list $equiv_pdbs[$nc] from earlier sequence and append its pdbid $sequences[$nc]=~/>(\S+)/; $equiv_pdbs[$nc].=" $1"; if ($het ne "") {$equiv_pdbs[$nc].="*";} } } else { $nc=$nchains{$seqres}=$nchains; $nchains++; $equiv_pdbs[$nc]=""; } $resolution[$nc]=$resolution; # If descript{chain} does not exist, it was not specified seperately for each chain if (exists $descript{$chain}) {$descript=$descript{$chain}} $descript=~s/;*$//; # remove ; at the end # If organism{chain} does not exist, it was not specified seperately for each chain if (exists $organism{$chain}) { $organism=lc($organism{$chain}); } else { if($organism=~/\((.*)\)/) {$organism=$1;} $organism=lc($organism); } if ($v>=3) { printf("Accept:\n",$chain); printf("CHAIN ='%s'\n",$chain); printf("DESCRP='%s'\n",$descript); printf("KEYWDS='$keywds'\n"); printf("ORGANI='%s'\n",$organism); printf("SEQRES='%s'\n",$seqres); } # Correct upper/lower case $descript=" $descript "; $descript=~s/([a-zA-Z]{5,})/\L$1/g; # make everything longer than 5 word characters lower case $descript=~s/([\s]OF[\s])/\L$1/g; $descript=~s/([\s]OR[\s])/\L$1/g; $descript=~s/([\s]ON[\s])/\L$1/g; $descript=~s/([\s]NO[\s])/\L$1/g; $descript=~s/([\s]IN[\s])/\L$1/g; $descript=~s/([\s]IS[\s])/\L$1/g; $descript=~s/([\s]BY[\s])/\L$1/g; $descript=~s/([\s]AT[\s])/\L$1/g; $descript=~s/([\s]TO[\s])/\L$1/g; $descript=~s/([ -]ALL[ -])/\L$1/g; $descript=~s/([ -]AND[ -])/\L$1/g; $descript=~s/([ -]ARM[ -])/\L$1/g; $descript=~s/([ -]BOX[ -])/\L$1/g; $descript=~s/([ -]BOX[ -])/\L$1/g; $descript=~s/([ -]EGG[ -])/\L$1/g; $descript=~s/([ -]EYE[ -])/\L$1/g; $descript=~s/([ -]FOR[ -])/\L$1/g; $descript=~s/([ -]HAS[ -])/\L$1/g; $descript=~s/([ -]HEN[ -])/\L$1/g; $descript=~s/([ -]HOT[ -])/\L$1/g; $descript=~s/([ -]LOW[ -])/\L$1/g; $descript=~s/([ -]MOL[ -])/\L$1/g; $descript=~s/([ -]NON[ -])/\L$1/g; $descript=~s/([ -]ONE[ -])/\L$1/g; $descript=~s/([\s]OUT[\s])/\L$1/g; $descript=~s/([ -]SEX[ -])/\L$1/g; $descript=~s/([ -]SIX[ -])/\L$1/g; $descript=~s/([ -]TEN[ -])/\L$1/g; $descript=~s/([\s]THE[\s])/\L$1/g; $descript=~s/([ -]TWO[ -])/\L$1/g; $descript=~s/([ -]WAY[ -])/\L$1/g; $descript=~s/([\W]ACID[\W])/\L$1/g; $descript=~s/([\W]ACYL[\W])/\L$1/g; $descript=~s/([\W]ALDO[\W])/\L$1/g; $descript=~s/([\W]ANTI[\W])/\L$1/g; $descript=~s/([\W]AUTO[\W])/\L$1/g; $descript=~s/([\W]AXIN[\W])/\L$1/g; $descript=~s/([\W]BASE[\W])/\L$1/g; $descript=~s/([\W]BEAN[\W])/\L$1/g; $descript=~s/([\W]BETA[\W])/\L$1/g; $descript=~s/([\W]BILE[\W])/\L$1/g; $descript=~s/([\W]BLUE[\W])/\L$1/g; $descript=~s/([\W]BONE[\W])/\L$1/g; $descript=~s/([\W]BOND[\W])/\L$1/g; $descript=~s/([\W]CELL[\W])/\L$1/g; $descript=~s/([\W]COAT[\W])/\L$1/g; $descript=~s/([\W]COIL[\W])/\L$1/g; $descript=~s/([\W]COLD[\W])/\L$1/g; $descript=~s/([\W]COLI[\W])/\L$1/g; $descript=~s/([\W]CORE[\W])/\L$1/g; $descript=~s/([\W]CRYO[\W])/\L$1/g; $descript=~s/([\W]DRUG[\W])/\L$1/g; $descript=~s/([\W]DUAL[\W])/\L$1/g; $descript=~s/([\W]DUCK[\W])/\L$1/g; $descript=~s/([\W]ENDO[\W])/\L$1/g; $descript=~s/([\W]FAST[\W])/\L$1/g; $descript=~s/([\W]FIVE[\W])/\L$1/g; $descript=~s/([\W]FOLD[\W])/\L$1/g; $descript=~s/([\W]FOOT[\W])/\L$1/g; $descript=~s/([\W]FORM[\W])/\L$1/g; $descript=~s/([\W]FOUR[\W])/\L$1/g; $descript=~s/([\W]FROM[\W])/\L$1/g; $descript=~s/([\W]FLAP[\W])/\L$1/g; $descript=~s/([\W]FREE[\W])/\L$1/g; $descript=~s/([\W]GENE[\W])/\L$1/g; $descript=~s/([\W]GOOD[\W])/\L$1/g; $descript=~s/([\W]HALF[\W])/\L$1/g; $descript=~s/([\W]HAND[\W])/\L$1/g; $descript=~s/([\W]HAVE[\W])/\L$1/g; $descript=~s/([\W]HEAD[\W])/\L$1/g; $descript=~s/([\W]HEAT[\W])/\L$1/g; $descript=~s/([\W]HEME[\W])/\L$1/g; $descript=~s/([\W]HEXA[\W])/\L$1/g; $descript=~s/([\W]HIGH[\W])/\L$1/g; $descript=~s/([\W]HOLO[\W])/\L$1/g; $descript=~s/([\W]IRON[\W])/\L$1/g; $descript=~s/([\W]KETO[\W])/\L$1/g; $descript=~s/([\W]KNOT[\W])/\L$1/g; $descript=~s/([\W]LATE[\W])/\L$1/g; $descript=~s/([\W]LENS[\W])/\L$1/g; $descript=~s/([\W]LIKE[\W])/\L$1/g; $descript=~s/([\W]LONG[\W])/\L$1/g; $descript=~s/([\W]LOOP[\W])/\L$1/g; $descript=~s/([\W]MAIN[\W])/\L$1/g; $descript=~s/([\W]MEAN[\W])/\L$1/g; $descript=~s/([\W]MINI[\W])/\L$1/g; $descript=~s/([\W]MITE[\W])/\L$1/g; $descript=~s/([\W]MODE[\W])/\L$1/g; $descript=~s/([\W]MONO[\W])/\L$1/g; $descript=~s/([\W]MUCH[\W])/\L$1/g; $descript=~s/([\W]NINE[\W])/\L$1/g; $descript=~s/([\W]NULL[\W])/\L$1/g; $descript=~s/([\W]ONLY[\W])/\L$1/g; $descript=~s/([\W]OPEN[\W])/\L$1/g; $descript=~s/([\W]PARA[\W])/\L$1/g; $descript=~s/([\W]PLUS[\W])/\L$1/g; $descript=~s/([\W]POST[\W])/\L$1/g; $descript=~s/([\W]POLY[\W])/\L$1/g; $descript=~s/([\W]PORE[\W])/\L$1/g; $descript=~s/([\W]PUMP[\W])/\L$1/g; $descript=~s/([\W]RICH[\W])/\L$1/g; $descript=~s/([\W]RING[\W])/\L$1/g; $descript=~s/([\W]ROLE[\W])/\L$1/g; $descript=~s/([\W]ROLL[\W])/\L$1/g; $descript=~s/([\W]SALT[\W])/\L$1/g; $descript=~s/([\W]SEMI[\W])/\L$1/g; $descript=~s/([\W]SITE[\W])/\L$1/g; $descript=~s/([\W]STEM[\W])/\L$1/g; $descript=~s/([\W]TAIL[\W])/\L$1/g; $descript=~s/([\W]TATA[\W])/\L$1/g; $descript=~s/([\W]TRAP[\W])/\L$1/g; $descript=~s/([\W]TUBE[\W])/\L$1/g; $descript=~s/([\W]TURN[\W])/\L$1/g; $descript=~s/([\W]TWIN[\W])/\L$1/g; $descript=~s/([\W]TYPE[\W])/\L$1/g; $descript=~s/([\W]WELL[\W])/\L$1/g; $descript=~s/([\W]WILD[\W])/\L$1/g; $descript=~s/([\W]WITH[\W])/\L$1/g; $descript=~s/([\W]WROM[\W])/\L$1/g; $descript=~s/([\W]ZETA[\W])/\L$1/g; $descript=~s/([\W]ZINC[\W])/\L$1/g; $descript=~s/DE NOVO/de novo/ig; $descript=~s/(\W)KDA(\W)/$1kDa$2/g; $descript=~s/(\S+[CBDFGJKLMNPQRTVWXZ]{4,}\S+)/\U$1/ig; $descript=~s/(\W)(\S[CBDFGHJKLMNPQRSTVWXZ]{4,}\W)/$1\U$2/ig; # no vowels for at least 4 letters -> abbreviation -> upper case $descript=~s/(\W)([CBDFGHJKLMNPQRSTVWXZ]{4,}\S\W)/$1\U$2/ig; # no vowels for at least 4 letters -> abbreviation -> upper case $descript=~s/(\w+ii+\w+)/\U$1/ig; $descript=~s/([\W]rossman[\W])/\u$1/g; $descript=~s/([\W]nadph[\W])/\U$1/g; $descript=~s/([\W]gapdh[\W])/\U$1/g; $descript=~s/([\W]f[\W])/\u$1/g; $descript=~s/(\W)(\w{0,3})RNP(\W)/$1\L$2\URNP$3/ig; $descript=~s/(\W)(\w{0,3})RNA(\W)/$1\L$2\URNA$3/ig; $descript=~s/(\W)(\w{0,3})DNA(\W)/$1\L$2\UDNA$3/ig; $descript=~s/RNASE(\W)/RNAse$1/ig; $descript=~s/DNASE(\W)/DNAse$1/ig; $descript=~s/barnase/barnase/ig; $descript=~s/atpase(\W)/ATPase$1/ig; $descript=~s/gtpase(\W)/GTPase$1/ig; # Write amino acid three letter symbols with one capital letter foreach my $aa ("Ala","Cys","Asp","Glu","Phe","Gly","His","Ile","Lys","Leu","Met","Asn","Pro","Gln","Arg","Ser","Thr","Val","Trp","Tyr","MSe") { $descript=~s/$aa([ -;:.+])/$aa$1/ig; } # Write ions as chemical elements foreach my $ion ("Zn","Mg","Na","Ka","Ca","Fe","Cu","Se","Al","Mn") { $descript=~s/([ -:;])$ion([ -;:.+])/$1$ion$2/ig; $descript=~s/([ -:;])$ion([ -;:.+])/$1$ion$2/ig; } $descript=~s/^\s*//; $descript=~s/\s*$//; $descript="\u$descript"; # first letter of description upper case $organism="\u$organism"; # first letter of organism upper case $organism=~s/ ([\w\d]{0,2})$/ \U$1/; # Influenza A virus $organism=~s/ (\w+\d+\w*)$/ \U$1/; # Influenza A virus if ($v>=2 && $organism eq "") {print("\n\nWarning: no organism found for chain $chain in $pdbfile\n");} my $foldid=""; if ($dalifamids{$pdbidchain}) {$foldid=" $dalifamids{$pdbidchain}".$foldid;} if ($scopfamids{$pdbidchain}) {$foldid=" $scopfamids{$pdbidchain}".$foldid;} my $res; if ($resolution>0) {$res=$resolution."A";} else {$res="NMR";} # Set sequence record $seqres=~s/(\S{1,100})/$1\n/g; # insert newlines after each 70 characters $sequences[$nc]=sprintf(">%-6.6s %s;%s %s {%s}%s\n",$pdbidchain,$descript,$het,$res,$organism,$foldid); $sequences[$nc].=sprintf("$seqres"); if($v>=3) {print($sequences[$nc]);} return 0; } sub ReadScopFile() { # Read dir.cla.scop.txt_1.65 if ($v>=2) {print("Reading $scopfile ... ");} open (SCOPFILE,"<$scopfile") || die ("ERROR: cannot open $scopfile: $!\n"); #d1dlwa_ 1dlw A: a.1.1.1 14982 cl=46456,cf=46457,sf=46458,fa=46459,dm=46460,sp=46461,px=14982 my $n=0; my $scopfamid; my $chain; my $pdbidchain; while($line=) { if ($line=~/^\S+\s+(\S\S\S\S)\s+(\S+)\s+(\w\.\d+\.\d+\.\d+)/) { $pdbid=$1; $chain=$2; $scopfamid=$3; $pdbidchain=$1; # printf("chain=$chain\n"); if ($chain!~/([A-Za-z\d]):/) { if ($scopfamids{$pdbidchain}) { $scopfamids{$pdbidchain}.=" ".$scopfamid; # printf("scopfamids($pdbidchain)=%s\n",$scopfamids{$pdbidchain}); } else { $scopfamids{$pdbidchain}="SCOP: ".$scopfamid; # printf("scopfamids($pdbidchain)=%s\n",$scopfamids{$pdbidchain}); } $n++; } else { my %chains=(); while ($chain=~/([A-Za-z\d]):/) { $chain=~s/([A-Za-z\d]):[^A-Za-z:]*//; if ($chains{$1}) {next;} if ($1 ne "") {$pdbidchain="$pdbid"."_$1";} $chains{$1}=1; if ($scopfamids{$pdbidchain}) { $scopfamids{$pdbidchain}.=" ".$scopfamid; # printf("scopfamids($pdbidchain)=%s\n",$scopfamids{$pdbidchain}); } else { $scopfamids{$pdbidchain}="SCOP: ".$scopfamid; # printf("scopfamids($pdbidchain)=%s\n",$scopfamids{$pdbidchain}); } $n++; } } } } close(SCOPFILE); print(" found $n domains in SCOP file $scopfile\n"); } sub ReadDaliFiles() { # Read FoldIndex.html if ($v>=2) {print("Reading $dalidir/FoldIndex.html ... ");} open (FOLDINEXFILE,"<$dalidir/FoldIndex.html") || die ("ERROR: cannot open $dalidir/FoldIndex.html: $!\n"); # 1.1.1.1.1.1 1cunA_2 ... # 1.1.1.2.1.1 ___1lvfA_1 ... my $n=0; my $dalifamid; my %fold_for_repr; while($line=) { if ($line=~/(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)\s+_*(\S+)(_\d+)/) { $fold_for_repr{$2.$3}=$1; if ($3 eq "_0") { $dalifamid=$1; $pdbid=$2; $pdbid=~s/^(\S\S\S\S)(\S)/$1_$2/; $dalifamids{$pdbid}="DALI: ".$dalifamid; } $n++; } } close(FOLDINEXFILE); if ($v>=1) {print(" found $n representative domains in DALI's FoldIndex.html\n");} # Read domain_definitions.txt my $domainfile="$dalidir/domain_definitions.txt"; my $repr; if ($v>=2) {print("Reading $domainfile ... ");} open (DOMAINFILE,"<$domainfile") || die ("ERROR: cannot open $domainfile: $!\n"); # 1cunA/1-106 1cunA_1 1 ALPHA SPECTRIN $n=0; while($line=) { if ($line=~/^(\S+)\/\S+\s+(\S+)/) { if (!$fold_for_repr{$2}) { if ($v>=2) {print("WARNING: no fold for DALI representative $2 in $domainfile\n");} next; } $pdbid=$1; $repr=$2; $pdbid=~s/^(\S\S\S\S)(\S)/$1_$2/; if ($dalifamids{$pdbid}) { $dalifamids{$pdbid}.=" ".$fold_for_repr{$repr}; } else { $dalifamids{$pdbid}=" DALI: ".$fold_for_repr{$repr}; } $n++; } } close(DOMAINFILE); print(" found $n domains in DALI file $domainfile\n"); } ################################################################################## # Convert three-letter amino acid code into one-letter code ################################################################################## sub Three2OneLetter { my $res = $three2one{uc($_[0])}; if (defined $res) { return $res; } elsif ($_[0] =~ /^\s+$/) { return ""; } else { return "X"; } } hhsuite-2.0.16/scripts/HHPaths.pm0000775172256617226630000001056512110430072021113 0ustar hauserscientific_computing# HHPaths.pm # HHsuite version 2.0.15 (June 2012) # (C) J. Soeding, A. Hauser 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de # HHsuite version 2.0 # PLEASE INSERT CORRECT PATHS AT POSITIONS INDICATED BY ... BELOW # THE ENVIRONMENT VARIABLE HHLIB NEEDS TO BE SET TO YOUR LOCAL HH-SUITE DIRECTORY, # AS DESCRIBED IN THE HH-SUITE USER GUIDE AND README FILE package HHPaths; # This block can stay unmodified use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); use Exporter; our $VERSION = "version 2.0.16 (January 2013)"; our @ISA = qw(Exporter); our @EXPORT = qw($VERSION $hhlib $hhdata $hhbin $hhscripts $execdir $datadir $ncbidir $dummydb $pdbdir $dsspdir $dssp $cs_lib $context_lib $v); ############################################################################################## # PLEASE COMPLETE THE PATHS ... TO PSIPRED AND OLD-STYLE BLAST (NOT BLAST+) (NEEDED FOR PSIPRED) #our $execdir = ".../psipred/bin"; # path to PSIPRED V2 binaries #our $datadir = ".../psipred/data"; # path to PSIPRED V2 data files #our $ncbidir = ".../blast/bin"; # path to NCBI binaries (for PSIPRED in addss.pl) our $execdir = "/cluster/toolkit/production/bioprogs/psipred/bin"; # path to PSIPRED V2 binaries our $datadir = "/cluster/toolkit/production/bioprogs/psipred/data"; # path to PSIPRED V2 data files our $ncbidir = "/cluster/toolkit/production/bioprogs/blast/bin"; # path to NCBI binaries (for PSIPRED in addss.pl) ############################################################################################## # PLEASE COMPLETE THE PATHS ... TO YOUR LOCAL PDB FILES, DSSP FILES ETC. #our $pdbdir = ".../pdb/all"; # where are the pdb files? (pdb/divided directory will also work) #our $dsspdir = ".../dssp/data"; # where are the dssp files? Used in addss.pl. #our $dssp = ".../dssp/bin/dsspcmbi"; # where is the dssp binary? Used in addss.pl. our $pdbdir = "/cluster/databases/pdb/all"; # where are the pdb files? (pdb/divided directory will also work) our $dsspdir = "/cluster/databases/dssp/data"; # where are the dssp files? Used in addss.pl our $dssp = "/cluster/databases/dssp/bin/dsspcmbi"; # where is the dssp binary? Used in addss.pl ############################################################################################## # The lines below probably do not need to be changed # Setting paths for hh-suite perl scripts our $hhlib = $ENV{"HHLIB"}; # main hh-suite directory our $hhdata = $hhlib."/data"; # path to data directory for hhblits, example files our $hhbin = $hhlib."/bin"; # path to cstranslate (path to hhsearch, hhblits etc. should be in environment variable PATH) our $hhscripts= $hhlib."/scripts"; # path to hh perl scripts (addss.pl, reformat.pl, hhblitsdb.pl etc.) our $dummydb = $hhdata."/do_not_delete"; # Name of dummy blast db for PSIPRED (single sequence formatted with NCBI formatdb) # HHblits data files our $cs_lib = "$hhdata/cs219.lib"; our $context_lib = "$hhdata/context_data.lib"; # Add hh-suite scripts directory to search path $ENV{"PATH"} = $hhscripts.":".$ENV{"PATH"}; # Add hh scripts directory to environment variable PATH ################################################################################################ ### System command with return value parsed from output ################################################################################################ sub System() { if ($v>=2) {printf("\$ %s\n",$_[0]);} system($_[0]); if ($? == -1) { die("\nError: failed to execute '$_[0]': $!\n\n"); } elsif ($? != 0) { printf("\nError: command '$_[0]' returned error code %d\n\n", $? >> 8); return 1; } return $?; } return 1; hhsuite-2.0.16/scripts/multithread.pl0000775172256617226630000001310412110430072022125 0ustar hauserscientific_computing#!/usr/bin/env perl # # multithread.pl: # Run a command with different file names as arguments on multiple threads in parallel # Usage: multithread.pl '' [-cpu ] # # # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; use POSIX; # Variables my $cpu=8; # number of cpus to use my $parent_pid=$$; # main process id my $pid; # process id of child my %pid=(); # hash has all running PIDs as keys and the file name as data my $children=0; # number of child processes running my $options=""; my $file; my $ifile=0; my $v=1; my $numerr=0; if (scalar(@ARGV)<2) { die(" multithread.pl from HHsuite $VERSION Run a command for many files in parallel using multiple threads Usage: multithread.pl '' '' [-cpu ] [-v {0,1,2}] can include symbol \$file for the full filename, e.g. /tmp/hh/1c1g_A.a3m, \$name for the filename without extension, e.g. /tmp/hh/1c1g_A, and \$base for the filename without extension and path, e.g. 1c1g_A. -cpu number of threads to launch (default = $cpu) -v {0,1,2} verbose mode (default = $v) Example: multithread.pl '*.a3m' 'hhmake -i \$file 1>\$name.log 2>>error.log' -cpu 16 \n"); } $|=1; # autoflush on my @files=glob($ARGV[0]); my $command=$ARGV[1]; $SIG{'CHLD'}='IGNORE'; $SIG{'USR1'}=\&ChildFinished; $SIG{'INT'} =\&KillAllProcesses; if (@ARGV>2) { $options.=join(" ",@ARGV[2..$#ARGV]); } # Set number of cpus to use if ($options=~s/-cpu\s*(\d+)\s*//g) {$cpu=$1;} if ($options=~s/-v\s*(\d+)\s*//g) {$v=$1;} # Warn if unknown options found if ($options!~/^\s*$/) {$options=~s/^\s*(.*?)\s*$/$1/g; print("WARNING: unknown options '$options'\n");} if ($v>=1) {print (scalar(@files)." files read in ...\n");} foreach $file (@files) { $ifile++; # All cpus occupied? -> wait for a cpu to become free if ($children>=$cpu) { if ($v>=2) {print("\nParent $$ is sleeping (children=$children) ");} my $count=0; while ($children>=$cpu) { if ($count++>=10) { $count=0; if ($v>=2) {print("\nProcesses running:");} $children=0; foreach $pid (keys(%pid)) { if (! kill(0,$pid)) { # kill($pid,0) returns false if process is dead (finished) if ($v>=2) {printf("\nPID %5.5s: %s is removed from process table",$pid,$pid{$pid});} delete($pid{$pid}); # remove process from hash of PIDs } else { if ($v>=2) {printf("\nPID %5.5s: %s",$pid,$pid{$pid});} $children++; # In case a USR1 signal was caught twice (??) } } if ($v>=2) {print("\n");} } else { if ($v==1) {print(".");} select(undef, undef, undef, 0.1); # sleep 0.1 seconds } } } if ($pid=fork()) { # Main process $children++; $pid{$pid}="$file ($ifile)"; # Print out running processes and remove defunct ones select(undef, undef, undef, 0.1); # sleep 0.1 seconds } elsif (defined $pid) { # Child process my $name; # filename without extension my $base; # basename without path if ($file =~/(.*)\..*?$/) {$name=$1;} else {$name=$file;} if ($name =~/.*\/(.*?)$/) {$base=$1;} else {$base=$name;} my $lcommand = $command; # need local variable for thread $lcommand=~s/\$file/$file/g; $lcommand=~s/\$name/$name/g; $lcommand=~s/\$base/$base/g; &System("$lcommand"); if ($v>=2) {printf("\nProcess $$ for file %s (%i) finished.",$file,$ifile);} kill(USR1 => $parent_pid); $SIG{'CHLD'}='IGNORE'; exit; } else { die("\nError: fork returned undefined PID: $!\n"); } } # Wait for all children to finish while (wait() != -1) {} if ($v>=1) {print ("\nAll processes should be finished now\n");} if ($numerr>0) {print(STDERR "WARNING: $numerr commands returned with error code.\n");} exit(0); sub ChildFinished() { $children--; $SIG{'USR1'}=\&ChildFinished; if ($v>=2) {printf("\nChildren counter reduced to children=$children",$file,$ifile);} return; } sub KillAllProcesses() { foreach $pid (keys(%pid)) { if ($v>=2) {printf("\nKill process $pid: returned %i\n",kill(-9,$pid));} } die ("\nInterrupt: Killed main process $$\n"); } ################################################################################################ ### System command ################################################################################################ sub System { if ($v>=2) {print("\n");} if ($v>=1) {print("\n".$_[0]," ");} if (system($_[0])) { # Why is always -1 returned??? # print(STDERR "\nERROR: command '$command' returned error code $?\n"); # $numerr++; }; } hhsuite-2.0.16/scripts/hhmakemodel.pl0000775172256617226630000013550212110430072022070 0ustar hauserscientific_computing#! /usr/bin/env perl # # hhmakemodel.pl # Generate a model from an output alignment of hhsearch. # Usage: hhmakemodel.pl -i file.out (-ts file.pdb|-al file.al) [-m int|-m name|-m auto] [-pdb pdbdir] # (C) Johannes Soeding 2012 # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; use Align; $|=1; # force flush after each print # Default parameters our $d=7; # gap opening penalty for Align.pm; more than 2 mismatches - 2 matches ## previously: 1 our $e=0.01; # gap extension penatlty for Align.pm; allow to leave large gaps bridging uncrystallized regions ## previously: 0.1 our $g=0.1; # endgap penalty for Align.pm; allow to shift SEQRES residues for uncrystallized aas to ends of alignment ## previously: 0.9 my $v=2; # 3: DEBUG my $formatting="CASP"; # CASP or LIVEBENCH my $servername="My server"; # my $MINRES=30; # minumum number of new query residues required for a hit to be used as additional parent my $infile=""; my $outfile=""; my $outformat="fas"; my $pickhits="1 "; # default: build one model from best hit my $Pthr=0; my $Ethr=0; my $Prob=0; my $shift=0; # ATTENTION: set to 0 as default! my $NLEN=14; # length of the name field in alignments of hhsearch-output my $NUMRES=100; # number of residues per line in FASTA, A2M, PIR format my $program=$0; # name of perl script my $usage=" hhmakemodel.pl from HHsuite $VERSION From the top hits in an hhsearch output file (hhr), you can * generate a MSA (multiple sequence alignment) containing all representative template sequences from all selected alignments (options -fas, -a2m, -a3m, -pir) * generate several concatenated pairwise alignments in AL format (option -al) * generate several concatenated coarse 3D models in PDB format (option -ts) In PIR, PDB and AL format, the pdb files are required in order to read the pdb residue numbers and ATOM records. The PIR formatted file can be used directly as input to the MODELLER homology modelling package. Usage: $program [-i] file.hhr [options] Options: -i results file from hhsearch with hit list and alignments -fas write a FASTA-formatted multiple alignment to file.fas -a2m write an A2M-formatted multiple alignment to file.a2m -a3m write an A3M-formatted multiple alignment to file.a3m -m [ ...] pick hits with specified indices (default='-m 1') -p minimum probability threshold (default=$Pthr) -e maximum E-value threshold (default=$Ethr) -q use the full-length query sequence in the alignment (not only the aligned part); the query alignment file must be in HHM, FASTA, A2M, or A3M format. -N use query name from hhr filename (default: use same name as in hhr file) -first include only first Q or T sequence of each hit in MSA -v verbose mode (default=$v) Options when database matches in hhr file are PDB or SCOP sequences -pir write a PIR-formatted multiple alignment to file.pir -ts write the PDB-formatted models based on *pairwise* alignments into file.pdb -al write the AL-formatted *pairwise* alignments into file.al -d directories containing the pdb files (for PDB, SCOP, or DALI sequences) (default=$pdbdir) -s shift the residue indices up/down by an integer (default=$shift); -CASP formatting for CASP (for -ts, -al options) (default: LIVEBENCH formatting) Options when query is compared to itself (for repeat detection) -conj include also conjugate alignments in MSA (with query and template exchanged) -conjs include conjugate alignments and sort by ascending diagonal value (i.e. i0-j0) \n"; # Options to help extract repeats from self-alignments: # 1. default 2. -conj 3. -conj_diag 4. -conj_compact # ABCD ABCD ---A ABCD # BCD- BCD- --AB BCDA # D--- CD-- -ABC CDAB # CD-- D--- ABCD DABC # ---A BCD- # --AB CD-- # -ABC D--- # Variable declarations my $line; # input line my $score=-1; # score of the best model; at the moment: Probability my $qname=""; # name of query from hhsearch output file (infile) my $tname=""; # name of template (hit) from hhsearch output file (infile) my $qnameline=""; # nameline of query my $tnameline; # nameline of template my $pdbfile; # name of pdbfile to read my $pdbcode; # four-letter pdb code in lower case and _A if chain A (e.g. 1h7w_A) my $aaq; # query amino acids from hhsearch output my @aaq; # query amino acids from hhsearch output my @qname; # query names in present alignment as returned from ReadAlignment() my @qfirst; # indices of first residues in present alignmet as returned from ReadAlignment() my @qlast; # indices of last residues in present alignmet as returned from ReadAlignment() my @qseq; # sequences of querys in present alignment as returned from ReadAlignment() my @tname; # template names in present alignment as returned from ReadAlignment() my @tfirst; # indices of first residues in present alignmet as returned from ReadAlignment() my @tlast; # indices of last residues in present alignmet as returned from ReadAlignment() my @tseq; # sequences of templates in present alignment as returned from ReadAlignment() my $aat; # template amino acids from hhsearch output my @aat; # template amino acids from hhsearch output my $aapdb; # template amino acids from pdb file my @aapdb; # template amino acids from pdb file my $qfirst=0; # first residue of query my $qlast=0; # last residue of query my $qlength; # length of query sequence my $tfirst=0; # first residue of template my $tlast=0; # first residue of template my $tlength; # length of template sequence my $l=1; # counts template residues from pdb file (first=1, like for i[col2] and j[col2] my $col1=0; # counts columns from hhsearch alignment my $col2=0; # counts columns from alignment (by function &AlignNW) of $aat versus $aapdb my @i1; # $i1[$col1] = index of query residue in column $col1 of hhsearch-alignment my @j1; # $j1[$col1] = index of template residue in column $col1 of hhsearch-alignment my @j2; # $j2[$col2] = index of hhsearch template seq in $col2 of alignment against pdb template sequence my @l2; # $l2[$col2] = index of pdb template seq in $col2 of alignment against hhsearch template sequence my @l1; # $l1[$col1] = $l2[$col2] my $res; # residue name my $chain; # pdb chain from template name my $qfile; # name of query sequence file (for -q option) my $qmatch; # number of match states in alignment my $hit; # index of hit in hit list my $k; # index of hit sorted by position in alignment with query (k=1,...,k=@first-2) my %picked=(); # $picked{$hit} is defined and =$k for hits that will be transformed into model my @remarks; my @printblock; # block 0: header block k: k'th hit my $keyword=""; # either METHOD for CASP format or REMARK for LIVEBENCH format my $conj=0; # include conjugate sequences? Sort in which way? my $conjugate=0; # when query is compared to itself: do not include conjugate alignments my $onlyfirst=0; # include only first representative sequence of each Q/T alignment my $dummy; # dummy my $addchain=1; # 1: PDB files contain chain-id as in 1abc_A.pdb (not 1abc.pdb or pdb1abc.pdb etc.) my $pdbdirs=$pdbdir; # default pdb directory with *.pdb files my $options=""; # Processing command line options if (@ARGV<1) {die $usage;} for (my $i=0; $i<@ARGV; $i++) {$options.=" $ARGV[$i] ";} # Set options if ($options=~s/ -i\s+(\S+) / /g) {$infile=$1;} if ($options=~s/ -q\s+(\S+) / /g) {$qfile=$1;} if ($options=~s/ -ts\s+(\S+) / /ig) {$outfile=$1; $outformat="TS";} if ($options=~s/ -pdb\s+(\S+) / /ig) {$outfile=$1; $outformat="TS";} if ($options=~s/ -al\s+(\S+) / /ig) {$outfile=$1; $outformat="AL";} if ($options=~s/ -pir\s+(\S+) / /ig) {$outfile=$1; $outformat="PIR";} if ($options=~s/ -fas\s+(\S+) / /ig) {$outfile=$1; $outformat="FASTA";} if ($options=~s/ -a2m\s+(\S+) / /ig) {$outfile=$1; $outformat="A2M";} if ($options=~s/ -a3m\s+(\S+) / /ig) {$outfile=$1; $outformat="A3M";} if ($options=~s/ -p\s+(\S+) / /g) {$Pthr=$1;} if ($options=~s/ -e\s+(\S+) / /g) {$Ethr=$1;} if ($options=~s/ -s\s+(\S+) / /g) {$shift=$1;} if ($options=~s/ -d\s+(([^-\s]\S*\s+)*)/ /g) {$pdbdirs=$1;} if ($options=~s/ -m\s+((\d+\s+)+)/ /g) {$pickhits=$1; } if ($options=~s/ -first\s+/ /ig) {$onlyfirst=1;} # Self-alignment options if ($options=~s/ -conj\s+/ /ig) {$conj=1;} if ($options=~s/ -conjs\s+/ /ig) {$conj=2;} # Switch formatting and method description if ($options=~s/ -CASP\s+/ /ig) {$formatting="CASP";} if ($options=~s/ -LIVEBENCH\s+/ /ig) {$formatting="LIVEBENCH";} if ($options=~s/ -server\s+(\S+)/ /g) {$servername=$1;} # Set verbose mode? if ($options=~s/ -v\s+(\d+) / /g) {$v=$1;} elsif ($options=~s/ -v\s+/ /g) {$v=1;} # Read infile and outfile if (!$infile && $options=~s/^\s*([^-]\S+)\s*/ /) {$infile=$1;} if (!$outfile && $options=~s/^\s*([^-]\S+)\s*/ /) {$outfile=$1;} if ($options=~s/ -N / /ig) { $qname=$infile; $qname=~s/^.*?([^\/]+)$/$1/; # remove path $qname=~s/^(.*)\.[^\.]*$/$1/; # remove extension $qnameline=$qname; } # Warn if unknown options found or no infile/outfile if ($options!~/^\s*$/) {$options=~s/^\s*(.*?)\s*$/$1/g; die("Error: unknown options '$options'\n");} if ($infile eq "") {die("$usage\nError in $program: input file missing: $!\n");} if ($outfile eq "") {die("$usage\nError in $program: output file missing: $!\n");} my @pdbdirs = split(/\s+/,$pdbdirs); # Find query name in input file open (INFILE, "<$infile") || die "Error in $program: Couldn't open $infile: $!\n"; while ($line=) { if ($v>=3) {print("$line");} if ($qname eq "" && $line=~/^Query:?\s*(\S+)(.*)/) {$qname=$1; $qnameline=$1.$2;} if ($line=~/^Match_columns:?\s*(\S+)/) {$qmatch=$1; last;} } if (!($line=)) {die ("Error in $program: wrong format in $infile: $!\n");} # Prepare hash %pick with indices of hits that will be transformed into model # No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM # 1 153l Lysozyme (E.C.3.2.1.17) 100.0 0 0 381.0 19.4 185 1-185 1-185 (185) # 2 1qsa_A Soluble lytic transglyc 100.0 2.1E-39 2.5E-43 225.8 8.3 149 21-182 423-600 (618) # 3 1ltm 36 kDa soluble lytic tr 95.9 3.5E-06 4.1E-10 50.3 11.0 95 28-122 76-221 (320) # option '-m m1 m2 m3': pick models manually my @pickhits = split(/\s+/,$pickhits); $k=1; foreach $hit (@pickhits) { if (!defined $picked{$hit}) {$picked{$hit}=$k;} $k++; } if ($outformat eq "AL" || $outformat eq "TS") { &MakePairwiseAlignments(); } else { &MakeMultipleAlignment(); } exit; ################################################################################## # Construct AL or TS formatted alignment as a list of pairwise alignments ################################################################################## sub MakePairwiseAlignments() { # Scan through query-vs-template-alignments from infile and create first (combination) model $hit=0; # counts hits in hit list my $models=0; while ($line=) { if ($line=~/^>(\S+)/) { $hit++; if ($Pthr || $Ethr || defined $picked{$hit}) { # Found right alignment (hit) if (defined $picked{$hit}) {$k=$picked{$hit};} else {$k=$hit;} if ($line=~/^>(.*?)\s+E=.*$/) { $line=$1; # remove E=1.3E-30 etc. at the end } else { $line=~/^>(.*)/; $line=$1; } my $nameline=$line; my $evalue; $line=; if ($line=~/Probab\s*=\s*(\S+).*E-value\s*=\s*(\S+)/) {$score=$1; $evalue=$2} else {$score=0; warn("WARNING: could not print score $line");} if ($line=~/Aligned_cols=\s*(\S+)/) {;} else {warn("WARNING: could not find aligned_cols\n");} if ($Pthr && $score<$Pthr) {last;} # Probability too low -> finished if ($Ethr && $evalue>$Ethr) {last;} # Evalue too high > finished # Commented out in CASP format if ($formatting eq "LIVEBENCH") { $printblock[$k] ="PFRMAT $outformat\n"; $printblock[$k].="TARGET $qname\n"; } $remarks[$k]="REMARK $k: $nameline\n"; $remarks[$k].="REMARK $line"; &ReadAlignment(); $qfirst = $qfirst[0]; $qlast = $qlast[0]; $aaq = $qseq[0]; $tfirst = $tfirst[0]; $aat = $tseq[0]; $tname = $tname[0]; if ($v>=3) { for (my $i=0; $i<@qfirst; $i++) { printf("Q %-14.14s %s\n",$qname[$i],$qseq[$i]); } printf("\n"); for (my $i=0; $i<@tfirst; $i++) { printf("T %-14.14s %s\n",$tname[$i],$tseq[$i]); } printf("\n"); } # Extract pdbcode and construct name of pdbfile and return in global variables $pdbid and $chain if (&ExtractPdbcodeAndChain($tname[0])) {next;} if ($chain eq "[A ]") {$pdbcode.="_A";} elsif ($chain eq ".") {;} else {$pdbcode.="_$chain";} # Read score (=probability) $printblock[$k].="REMARK $nameline\n"; $printblock[$k].="REMARK $line"; $printblock[$k].="SCORE $score\n"; $printblock[$k].="PARENT $pdbcode\n"; $printblock[$k].="MODEL $k\n"; &WritePairwiseAlignments(); $printblock[$k].="END\n"; $models++; } } } $k=$#printblock; # set $k to last index in @printblock if ($k<0) { $printblock[1]="PARENT NONE\nTER\n"; $printblock[1].="END\n"; if ($v>=1) {print("WARNING: no hits found for model!\n");} } close (INFILE); if ($v>=2) { printf("$models models built\n"); } # Write model file header #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 # Print header my $date = scalar(localtime); if ($formatting eq "CASP") { $printblock[0]="PFRMAT $outformat\n"; $printblock[0].="TARGET $qname\n"; } $printblock[0].="REMARK AUTHOR $servername\n"; $printblock[0].="REMARK $date\n"; # $printblock[0].="REMARK J. Soeding \n"; # Add remarks for ($k=0; $k<@remarks; $k++) { if (defined $remarks[$k]) { $printblock[0].=$remarks[$k]; } } $printblock[0].="REMARK \n"; # Print @printblock into outfile open (OUTFILE, ">$outfile") || die "Error in $program: Couldn't open $outfile: $!\n"; foreach my $printstr (@printblock) { my @printarr=split(/\n/,$printstr); if ($outformat eq "TS") { foreach $printstr (@printarr) { printf(OUTFILE "%-80.80s\n",$printstr); } } else { foreach $printstr (@printarr) { printf(OUTFILE "%s\n",$printstr); } } } close (OUTFILE); if ($outformat eq "TS") { # Call MaxSprout to generate sidechains } return; } ################################################################################## # Construct multiple alignment in FASTA, A2M, or PIR format ################################################################################## sub MakeMultipleAlignment() { my @hitnames=(); # $hitnames[$k] is the nameline of the ihit'th hit my @hitseqs=(); # $hitseqs[$k] contains the residues of the ihit'th hit my @hitdiag=(); # $hitdiag[$k] = $qfirst[0]-$tfirst[0] my @conjnames=(); # $hitnames[$k] is the nameline of the ihit'th conjugate hit my @conjseqs=(); # $hitseqs[$k] contains the residues of the ihit'th conjugate hit my @conjdiag=(); # $hitdiag[$k] = $qfirst[0]-$tfirst[0] for conjugate alignments my $new_hit; # residues of new hit my $i; # residue index my $j; # residue index my $k; # sequence index $hitnames[0]=""; $hitseqs[0]=""; $hitdiag[0]=0; $conjnames[0]=""; $conjseqs[0]=""; $conjdiag[0]=0; open (INFILE, "<$infile") || die "Error in $program: Couldn't open $infile: $!\n"; $hit=0; # counts hits in hit list # Read one alignment after the other while ($line=) { # Found new aligment if ($line=~/^>(\S+)/) { $hit++; # Is alignment selected by user? if ($Pthr || $Ethr || defined $picked{$hit}) { if ($line=~/^>(\S+)(.*)/) {$tname=$1; $tnameline=$1.$2;} else {die("\nError: bad format in $infile, line $.: code 1\n");} $line = ; if ($line=~/Probab\s*=\s*(\S+).*E-value\s*=\s*(\S+)/) { if ($Pthr && $1<$Pthr) {last;} # Probability too low -> finished if ($Ethr && $2>$Ethr) {last;} # Evalue too high > finished } else { die("\nError: bad format in $infile, line $.: code 2\n"); } # Read next alignment with $aaq, $qfirst, @tseq, @first, and @tname &ReadAlignment(); chomp($tnameline); if ($tnameline=~/\S+\s+(.*)/) {$tname[0].=" $1";} # template seed sequence gets its description # Format sequences into @hitseqs and @hitnames &FormatSequences(\@hitnames,\@hitseqs,\@hitdiag,\@qname,\@qseq,\@qfirst,\@qlast,\$qlength,\@tname,\@tseq,\@tfirst,\@tlast,\$tlength); # Use conjugate alignments? if ($conj>0) { &FormatSequences(\@conjnames,\@conjseqs,\@conjdiag,\@tname,\@tseq,\@tfirst,\@tlast,\$tlength,\@qname,\@qseq,\@qfirst,\@qlast,\$qlength); } } # end: if ($Pthr>0 || defined $picked{$hit}) } # end: if ($line=~/^>(\S+)/) # found new alignment } # end while close (INFILE); # Insert full-length query sequence? if ($qfile) { $hitseqs[0]=""; open (QFILE, "<$qfile") || die "Error in $program: Couldn't open $qfile: $!\n"; while ($line=) { if ($line=~/^>/ && $line!~/^>ss_/ && $line!~/^>sa_/ && $line!~/^>aa_/ && $line!~/^>Consensus/) {last;} } while ($line=) { if ($line=~/^>/ || $line=~/^\#/) {last;} $line=~tr/\n\.-//d; $line=~tr/a-z/A-Z/; $hitseqs[0].=$line; } close(QFILE); if ($v>=2) {printf("\nQ(full) %-14.14s %s\n",$qname,$hitseqs[0]);} } # DEBUG if ($v>=3) { printf("\nQuery %-14.14s %s\n",$qname,$hitseqs[0]); for ($k=1; $k<@hitnames; $k++) { printf("T hit %3i %-14.14s %s\n",$k,$hitnames[$k],$hitseqs[$k]); } printf("\n"); printf("\nQuery %-14.14s %s\n",$qname,$conjseqs[0]); for ($k=1; $k<@conjnames; $k++) { printf("T conj %3i %-14.14s %s\n",$k,$conjnames[$k],$conjseqs[$k]); } printf("\n"); } # Include conjugate sequences? if ($conj>0) { shift(@conjseqs); # delete zeroth ("query") sequence of @conjseqs shift(@conjnames); # shift(@conjdiag); # # Sort by diagonals $hitdiag[], $conjdiag[] &Sort(\@hitdiag,\@hitseqs,\@hitnames); &Sort(\@conjdiag,\@conjseqs,\@conjnames); # Append conjugate sequences to hitseqs splice(@hitseqs,scalar(@hitseqs),0,@conjseqs); splice(@hitnames,scalar(@hitnames),0,@conjnames); if ($v>=3) { printf("\nQuery %-14.14s %s\n",$qname,$hitseqs[0]); for ($k=1; $k<@hitnames; $k++) { chomp($hitnames[$k]); printf("T tot %3i %-14.14s %s\n",$k,$hitnames[$k],$hitseqs[$k]); $hitnames[$k].="\n"; } } } # Insert gaps: my @len_ins; # $len_ins[$j] will count the maximum number of inserted residues after match state $j. my @inserts; # $inserts[$j] contains the insert (in small case) of sequence $k after the $j'th match state my $insert; my $ngap; # For each match state determine length of LONGEST insert after this match state and store in @len_ins for ($k=0; $k<@hitnames; $k++) { # split into list of single match states and variable-length inserts # ([A-Z]|-) is the split pattern. The parenthesis indicate that split patterns are to be included as list elements # The '#' symbol is prepended to get rid of a perl bug in split $j=0; @inserts = split(/([A-Z]|-)/,"#".$hitseqs[$k]."#"); # printf("Sequence $k: $hitseqs[$k]\n"); # printf("Sequence $k: @inserts\n"); foreach $insert (@inserts) { if( !defined $len_ins[$j] || length($insert)>$len_ins[$j]) { $len_ins[$j]=length($insert); } $j++; # printf("$insert|"); } # printf("\n"); } # After each match state insert residues and fill up with gaps to $len_ins[$i] characters for ($k=0; $k<@hitnames; $k++) { # split into list of single match states and variable-length inserts @inserts = split(/([A-Z]|-)/,"#".$hitseqs[$k]."#"); $j=0; # append the missing number of gaps after each match state foreach $insert (@inserts) { if($outformat eq "FASTA") { for ($i=length($insert); $i<$len_ins[$j]; $i++) {$insert.="-";} } else { for ($i=length($insert); $i<$len_ins[$j]; $i++) {$insert.=".";} } $j++; } $hitseqs[$k] = join("",@inserts); $hitseqs[$k] =~ tr/\#//d; # remove the '#' symbols inserted at the beginning and end } # Remove columns at beginning and end with gaps in all sequences my $remove_start; my $remove_end; my $len; $hitseqs[0]=~/^(-*)/; $remove_start=length($1); $hitseqs[0]=~/(-*)$/; $remove_end=length($1); for ($k=0; $k<@hitnames; $k++) { $hitseqs[$k]=~s/^.{$remove_start}(.*).{$remove_end}/$1/; } $len=($hitseqs[0]=~tr/a-zA-Z/a-zA-Z/); # Prepare name line of query if ($outformat eq "PIR") { my $qnametmp=$qname; $qnametmp=~tr/:/;/; $qnameline=~/^\S+\s*(.*)/; my $qnamelinetmp=$1; $qnamelinetmp=~tr/:/;/; $hitnames[0] = sprintf(">P1;%s\nsequence:%s:%4i: :%4i: :%s: : 0.00: 0.00\n",$qnametmp,$qnametmp,$remove_start+1,$len+$remove_start,$qnamelinetmp); } else { # outformat is "FASTA" or "A2M" or "A3M" or ... $hitnames[0] = ">$qnameline\n"; } # If pretty diagonally sorted order is wanted... if ($conj>0) { if ($conj==2) { my $center = 0.5*(scalar(@hitseqs)-1); @conjseqs = splice(@hitseqs,$center+1,$center); splice(@hitseqs,0,0,@conjseqs); @hitseqs = reverse(@hitseqs); @conjnames = splice(@hitnames,$center+1,$center); splice(@hitnames,0,0,@conjnames); @hitnames = reverse(@hitnames); # Shorten namelines of all but first sequence my %count; for ($k=0; $k<@hitnames; $k++) { if ($k==$center) {$k++;} $hitnames[$k]=~/(\S{1,14})/; if (!defined $count{$1}) {$count{$1}=0;} my $count = ++$count{$1}; # printf("vorher: %s ",$hitnames[$k]); $hitnames[$k]=~s/^(\S{1,14}).*/$1:$count/; # printf("nachher: %s\n",$hitnames[$k]); } } else { for ($k=0; $k<@hitnames; $k++) {$hitnames[$k]=">$qname\n";} } } # Remove gaps? Captialize? if ($outformat eq "PIR") { for ($k=0; $k<@hitnames; $k++) { $hitseqs[$k].="*";; # Transform to upper case $hitseqs[$k]=~tr/a-z./A-Z-/; # Transform to upper case $hitseqs[$k]=~s/(.{1,$NUMRES})/$1\n/g; # insert newlines every NUMRES positions } } elsif ($outformat eq "FASTA") { for ($k=0; $k<@hitnames; $k++) { $hitseqs[$k]=~tr/a-z./A-Z-/; # Transform to upper case $hitseqs[$k]=~s/(.{1,$NUMRES})/$1\n/g; # insert newlines every NUMRES positions } } elsif ($outformat eq "A2M") { for ($k=0; $k<@hitnames; $k++) {$hitseqs[$k]=~s/(.{1,$NUMRES})/$1\n/g;} # insert newlines every NUMRES positions } elsif ($outformat eq "A3M") { for ($k=0; $k<@hitnames; $k++) {$hitseqs[$k]=~tr/.//d;$hitseqs[$k].="\n";} # Remove gaps aligned to inserts } # Write sequences into output file open (OUTFILE, ">$outfile") || die ("cannot open $outfile:$!"); for ($k=0; $k<@hitnames; $k++) { print(OUTFILE "$hitnames[$k]$hitseqs[$k]"); } close OUTFILE; if ($v>=2) { printf("%i sequences written to $outfile\n",scalar(@hitnames)); } } # Format sequences into @hitseqs and @hitnames # & Call with FormatSequences(\@hitnames,\@hitseqs,\@qname,\@qseq,\@qfirst,\@qlast,\$qlength,\@tname,\@tseq,\@tfirst,\@tlast,\$tlength); sub FormatSequences() { my $p_hitnames = $_[0]; # typeglob to $hitname my $p_hitseqs = $_[1]; # ... my $p_hitdiag = $_[2]; # ... my $p_qname = $_[3]; # my $p_qseq = $_[4]; # my $p_qfirst = $_[5]; # my $p_qlast = $_[6]; # my $p_qlength = $_[7]; # my $p_tname = $_[8]; # my $p_tseq = $_[9]; # my $p_tfirst = $_[10]; # my $p_tlast = $_[11]; # my $p_tlength = $_[12]; # my $i; if ($v>=2) { if (defined $picked{$hit}) { print("hit=$hit picked=$picked{$hit} tname=$tname[0]"); } else { print("hit=$hit picked=evalue<$Ethr tname=$tname[0]"); } for (my $i=1; $i<@{$p_tname}; $i++) { print(", $tname[$i]"); } print("\n"); } my $qfirst = ${$p_qfirst}[0]; my $qlast = ${$p_qlast}[0]; my $qlength = ${$p_qlength}; my $aaq = ${$p_qseq}[0]; @aaq = unpack("C*",$aaq); # needed for transforming template sequences into a3m based on query residues (NOT HMM match states!) $aaq=~tr/.-//d; # remove all gaps from query sequence # For all template sequences in the present alignment for (my $k=0; $k<@{$p_tname}; $k++) { $tname =${$p_tname}[$k]; $tfirst=${$p_tfirst}[$k]; $aat =${$p_tseq}[$k]; # Transform template residues into a3m format: # match states are those where query has residue (NOT where HMM has match state!) # This makes sense since we want to build a model for the query sequence. @aat = unpack("C*",$aat); $aat=""; # Transform all columns with residue in query into match/delete states, all others to inserts for ($i=0; $i=2) { printf("\nQ %-14.14s %s\n",$qname,$aaq); printf("T %-14.14s %s\n",$tname,$aat); } # Outformat is PIR? => read residues and indices from PDB ATOM records if ($outformat eq "PIR") { # Extract pdbcode and construct name of pdbfile and return in global variables $pdbid and $chain if (&ExtractPdbcodeAndChain($tname)) {next;} # Read sequence from pdb file if (!open (PDBFILE, "$pdbfile")) { die ("Error in $program: Couldn't open $pdbfile: $!\n"); } $aapdb=""; $l=0; my @nres; # $nres[$l] = pdb residue index for residue $aapdb[$l] my $nres=-1e6; my $resolution=-1.00; my $rvalue=-1.00; while ($line=) { if ($line=~/^REMARK.*RESOLUTION\.\s+(\d+\.?\d*)/) {$resolution=$1;} if ($line=~/^REMARK.*R VALUE\s+\(WORKING SET\)\s+:\s+(\d+\.?\d*)/) {$rvalue=$1;} if ($line=~/^ENDMDL/) {last;} # if file contains NMR models read only first one if (($line=~/^ATOM\s+\d+ .. [ A](\w{3}) $chain\s*(-?\d+.)/ || ($line=~/^HETATM\s+\d+ .. [ A](\w{3}) $chain\s*(-?\d+.)/ && &Three2OneLetter($1) ne "X") ) && $2 ne $nres ) { $res=$1; $nres=$2; $nres[$l]=$2; $res=&Three2OneLetter($res); $aapdb[$l++]=$res; $aapdb.=$res; } } close (PDBFILE); if (length($aapdb)<=0) {die("Error: chain $chain not found in pdb file $pdbfile\n");} # Align template in hh-alignment ($aat) with template sequence in pdb ($aapdb) my $xseq=$aat; $xseq=~tr/-/~/; # transform Deletes to '~' to distinguish them from gaps '-' inserted by Align.pm my $yseq=$aapdb; my ($jmin,$jmax,$lmin,$lmax); my $Sstr; my $score; # The aligned characters are returend in $j2[$col2] and $l2[$col2] $score=&AlignNW(\$xseq,\$yseq,\@j2,\@l2,\$jmin,\$jmax,\$lmin,\$lmax,\$Sstr); # DEBUG if ($v>=3) { printf("Template (hh) $xseq\n"); printf("Identities $Sstr\n"); printf("Template (pdb) $yseq\n"); printf("\n"); if ($v>=4) { for ($col2=0; $col2<@l2 && $col2<1000; $col2++) { printf("%3i %3i:%s %3i:%s -> %i\n",$col2,$j2[$col2],substr($aat,$j2[$col2]-1,1),$l2[$col2],substr($aapdb,$l2[$col2]-1,1),$nres[$l2[$col2]-1]); } } } # check for reasonable alignment my $num_match = 0; for ($i=0; $i<@l2; $i++) { if ($j2[$i] > 0 && $l2[$i] > 0) { $num_match++; } } if (($score/$num_match) < 1) { print "WARNING! Match score with PDBfile (score: $score num: $num_match score/num:".($score/$num_match).") to low => $pdbfile not included!\n"; next; } # Assign a3m-formatted amino acid sequence from pdb file to $aapdb $aapdb=""; my @xseq=unpack("C*",$xseq); my @yseq=unpack("C*",$yseq); for ($i=0; $i<@yseq; $i++) { if(($xseq[$i]>=65 && $xseq[$i]<=90) || $xseq[$i]==ord('~')) { # if $aat has upper case residue or Delete state # Match state $aapdb.=uc(chr($yseq[$i])); } else { # Insert state if ($yseq[$i]!=45) {$aapdb.=lc(chr($yseq[$i]));} # add only if not a gap '-' } } # Remove overlapping ends of $aapdb $aapdb=~s/^[a-z]*(.*?)[a-z]*$/$1/; # Glue gaps at beginning and end of aligned pdb sequence and add sequence to alignment push (@{$p_hitseqs}, ("-" x ($qfirst-1)).$aapdb.("-" x ($qlength-$qlast)) ); # use ATOM record residues $aapdb! # Write hitname in PIR format into @hitnames my $descr; my $organism; my $struc=$pdbcode; if ($tnameline=~/^(\S+)\s+(.*)/) {$descr=$2; $descr=~tr/://d;} else {$descr=" ";} if ($tnameline=~/^(\S+)\s+.*\s+\{(.*)\}/) {$organism=$2;} else {$organism=" ";} if (length($chain)>1 || $chain eq ".") { # MODELLER's special symbol for 'chain unspecified' $chain="."; } elsif ($addchain && $chain ne " ") { $struc.="_$chain"; } # push (@{$p_hitnames}, sprintf(">P1;%s\nstructureX:%4s:%4i:%1s:%4i:%1s:%s:%s:%-.2f:%-.2f\n",$struc,$struc,$nres[$lmin-1],$chain,$nres[$lmax-1],$chain,$descr,$organism,$resolution,$rvalue) ); my $descrtmp=$descr; $descrtmp=~tr/:/;/; $organism=~tr/://d; push (@{$p_hitnames}, sprintf(">P1;%s\nstructureX:%4s: :%1s: :%1s:%s:%s:%-.2f:%-.2f\n",$struc,$struc,$chain,$chain,$descrtmp,$organism,$resolution,$rvalue) ); push (@{$p_hitdiag}, $tfirst-$qfirst); } else { # outformat is "FASTA" or "A2M" or "A3M" or ... # Write hitname in FASTA format into @hitnames push (@{$p_hitseqs}, ("-" x ($qfirst-1)).$aat.("-" x ($qlength-$qlast)) ); push (@{$p_hitnames}, ">$tname\n" ); push (@{$p_hitdiag}, $tfirst-$qfirst); } if ($onlyfirst>0) {last;} # extract only first (seed?) sequence in each alignment } # end: for (my $k=0; $k<@{$tname}; $k++) # Paste aligned subsequence of query over $hitseqs[0] if (${$p_hitseqs}[0] eq "") {${$p_hitseqs}[0] = "-" x $qlength;} if (!$qfile) {substr(${$p_hitseqs}[0],$qfirst-1,length($aaq),$aaq);} return; } ################################################################################## # Read Alignment from infile (*.hhr file) # Results: # $aaq: query residues in present alignment # $qfirst: index of first query residue in present alignment # @tname: template names in present alignmen # @tfirst: indices of first residues in present alignmet # @tseq: sequences of templates in present alignment ################################################################################## sub ReadAlignment() { @qname=(); # name of $it'th query in this alignment @qfirst=(); # index of first residue in $it'th query in this alignment @qlast=(); # index of last residue in $it'th query in this alignment @qseq=(); # residues of $it'th query in this alignment @tname=(); # name of $it'th template in this alignment @tfirst=(); # index of first residue in $it'th template in this alignment @tlast=(); # index of last residue in $it'th template in this alignment @tseq=(); # residues of $it'th template in this alignment if ($v>=3) {printf("Searching for Q $qname vs T $tname\n");} $line=; # Search for first line beginning with Q ot T and not followed by aa_, ss_pred, ss_conf, or Consensus while (1) { my $i; # index for query sequence in this alignment # Scan up to first line starting with Q; stop when line 'No\s+\d+' or 'Done' is found while (defined $line && $line!~/^Q\s(\S+)/) { if ($line=~/^No\s+\d/ || $line=~/^Done/) {last;} $line=; next; } if (!defined $line || $line=~/^No\s+\d/ || $line=~/^Done/) {last;} # Scan up to first line that is not secondary structure line or consensus line while (defined $line && $line=~/^Q\s+(ss_|sa_|aa_|Consens|Cons-)/) {$line=;} # Read next block of query sequences $i=0; while ($line=~/^Q\s+/) { if ($line!~/^Q\s+(ss_|sa_|aa_|Consens|Cons-)/ && $line=~/^Q\s*(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+\((\d+)/) { $qname[$i]=$1; if (!$qfirst[$i]) {$qfirst[$i]=$2;} # if $qfirst is undefined then this is the first alignment block -> set $qfirst to $1 if (!$qseq[$i]) {$qseq[$i]=$3;} else {$qseq[$i].=$3;} $qlast[$i]=$4; if ($i==0) {$qlength=$5} $i++; } $line=; } if ($i==0) { die("\nError in $program: bad format in $infile, line $.: query block\n"); } # Scan up to first line starting with T while (defined $line && $line!~/^T\s+(\S+)/) {$line=;} # Scan up to first line that is not secondary structure line or consensus line while (defined $line && $line=~/^T\s+(ss_|sa_|aa_|Consens|Cons-)/) {$line=;} # Read next block of template sequences $i=0; while ($line=~/^T\s+/) { if ($line!~/^T\s+(ss_|sa_|aa_|Consens|Cons-)/ && $line=~/^T\s*(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+\((\d+)/){ $tname[$i]=$1; if (!$tfirst[$i]) {$tfirst[$i]=$2;} # if $tfirst is undefined then this is the first alignment block -> set $tfirst to $1 if (!$tseq[$i]) {$tseq[$i]=$3;} else {$tseq[$i].=$3;} $tlast[$i]=$4; if ($i==0) {$tlength=$5} $i++; } $line=; } if ($i==0) { die("\nError in $program: bad format in $infile, line $.: template block\n"); } } # end while ($line=) # if (!$qfirst) {$qfirst=1;} # if still $qfirst==0 then set $qfirst to 1 # for (my $i=0; $i<@tfirst; $i++) { # if (!$tfirst[$i]) {$tfirst[$i]=1;} # if still $tfirst[$i]==0 then set $tfirst to 1 # } # Check lengths if (length($qseq[0])!=length($tseq[0])) { print("\nError: query and template lines do not have the same length in $infile, line $.\n"); for (my $i=0; $i<@qfirst; $i++) { printf("Q %-14.14s %s\n",$qname[$i],$qseq[$i]); } printf("\n"); for (my $i=0; $i<@tfirst; $i++) { printf("T %-14.14s %s\n",$tname[$i],$tseq[$i]); } printf("\n"); exit 1; } if ($v>=3) { for (my $i=0; $i<@qfirst; $i++) { printf("Q %-14.14s %s\n",$qname[$i],$qseq[$i]); } printf("\n"); for (my $i=0; $i<@tfirst; $i++) { printf("T %-14.14s %s\n",$tname[$i],$tseq[$i]); } printf("\n"); } return; } ################################################################################## # Write Alignment to $printblock[$k] ################################################################################## sub WritePairwiseAlignments() { #Delete columns with gaps in both sequences $aaq=uc($aaq); $aat=uc($aat); @aaq=split(//,$aaq); @aat=split(//,$aat); my $col=0; for ($col1=0; $col1<@aaq; $col1++) { if ($aaq[$col1]=~tr/a-zA-Z/a-zA-Z/ || $aat[$col1]=~tr/a-zA-Z/a-zA-Z/) { $aaq[$col]=$aaq[$col1]; $aat[$col]=$aat[$col1]; $col++; } } splice(@aaq,$col); # delete end of @aaq; splice(@aat,$col); $aaq=join("",@aaq); $aat=join("",@aat); # Count query and template residues into @i1 and @j1 for ($col1=0; $col1<@aaq; $col1++) { if ($aaq[$col1]=~tr/a-zA-Z/a-zA-Z/) { $i1[$col1]=$qfirst++; #found query residue in $col1 } else { $i1[$col1]=0; #found gap in $col1 } if ($aat[$col1]=~tr/a-zA-Z/a-zA-Z/) { $j1[$col1]=$tfirst++; #found template residue in $col1 } else { $j1[$col1]=0; #found gap in $col1 } } # DEBUG if ($v>=3) { printf ("col Q i1 T j1\n"); for ($col1=0; $col1<@aaq; $col1++) { printf ("%3i %s %3i %s %3i\n",$col1,$aaq[$col1],$i1[$col1],$aat[$col1],$j1[$col1]); } printf ("\n"); } # Read protein chain from pdb file # ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 # ATOM 1 N SER A 27 38.637 79.034 59.693 1.00 79.70 # ATOM 2083 CD1 LEU A 22S 15.343 -12.020 43.761 1.00 5.00 C # Extract pdbcode and construct name of pdbfile and return in global variables $pdbid and $chain if (&ExtractPdbcodeAndChain($tname)) {next;} # Read sequence from pdb file if (! defined $pdbfile) {die ("Error in $program: Couldn't find pdb code in $tname\n");} open (PDBFILE, "$pdbfile") || die ("Error in $program: Couldn't open $pdbfile: $!\n"); if ($chain eq "[A ]") {$pdbcode.="_A";} elsif ($chain eq ".") {;} else {$pdbcode.="_$chain";} $aapdb=""; $l=1; $line=; while ($line) {if ($line=~/^ATOM/) {last;} $line=;} # advance to ATOM records my @nres; # $nres[$l] = pdb residue index for residue $aapdb[$l] my @coord; # $coord[$l] = coordinates of CA atom of residue $aapdb[$l] while ($line) { if ($line=~/^ATOM\s+\d+ CA [ AB](\w{3}) $chain\s*(-?\d+.) (\s*\S+\s+\S+\s+\S+)/ || ($line=~/^HETATM\s+\d+ CA [ AB](\w{3}) $chain\s*(-?\d+.) (\s*\S+\s+\S+\s+\S+)/ && &Three2OneLetter($1) ne "X") ) { $res=$1; $nres[$l]=$2; $coord[$l]=$3." 1.00"; $res=&Three2OneLetter($res); $aapdb[$l]=$res; $aapdb.=$res; $l++; } elsif ($l>10 && $line=~/^ATOM\s+\d+ CA/) {last;} elsif ($line=~/^ENDMDL/) {last;} # if file contains NMR models read only first one $line=; } close (PDBFILE); # Align template in hh-alignment ($aat) with template sequence in pdb ($aapdb) my $xseq=$aat; my $yseq=$aapdb; my ($jmin,$jmax,$lmin,$lmax); my $Sstr; my $score; $xseq=~tr/-/~/d; # transform Deletes to '~' to distinguish them from gaps inserted by Align.pm #the aligned characters are returend in $j2[$col2] and $l2[$col2] if ($v>=3) { printf("Template (hh) $xseq\n"); printf("Identities $Sstr\n"); printf("Template (pdb) $yseq\n"); printf("\n"); } $score=&AlignNW(\$xseq,\$yseq,\@j2,\@l2,\$jmin,\$jmax,\$lmin,\$lmax,\$Sstr); # DEBUG if ($v>=3) { printf("Template (hh) $xseq\n"); printf("Identities $Sstr\n"); printf("Template (pdb) $yseq\n"); printf("\n"); if ($v>=4) { for ($col2=0; $col2<@l2 && $col2<200; $col2++) { printf("%3i %3i %3i\n",$col2,$j2[$col2],$l2[$col2]); } } } # DEBUG # Construct alignment of $aaq <-> $aapdb via alignments $aaq <-> $aat and $aat <-> $aapdb: # Find $l1[$col1] = line of pdb file corresponding to residue $aat[$col1] and $aaq[$col1] $col2=0; for ($col1=0; $col1<@aaq; $col1++) { if ($j1[$col1]==0 || $i1[$col1]==0) {$l1[$col1]=0; next;} # skip gaps in query and gaps in template while ($j2[$col2]<$col1+1) {$col2++;} # in $j2[col2] first index is 1, in $col1 first column is 0 $l1[$col1] = $l2[$col2]; if ($v>=4) {printf("l1[%i]=%i l2[%i]=%i\n",$col1,$l1[$col1],$col2,$l2[$col2]);} } if ($pdbcode ne "NONE") { if ($outformat eq "TS") { for ($col1=0; $col1<@aat; $col1++) { if ($i1[$col1]==0) {next;} # skip gaps in query if ($j1[$col1]==0) {next;} # skip gaps in template sequence if ($l1[$col1]==0) {next;} # skip if corresponding residue was skipped in pdb file $printblock[$k].=sprintf("ATOM %5i CA %3s %4i %-50.50s\n",$i1[$col1],&One2ThreeLetter($aaq[$col1]),$i1[$col1]+$shift,$coord[$l1[$col1]]); if ($v>=4) { printf("ATOM %5i CA %3s %4i %-50.50s\n",$i1[$col1],&One2ThreeLetter($aaq[$col1]),$i1[$col1]+$shift,$coord[$l1[$col1]]); } } } else { for ($col1=0; $col1<@aat; $col1++) { if ($i1[$col1]==0) {next;} # skip gaps in query if ($j1[$col1]==0) {next;} # skip gaps in template sequence if ($l1[$col1]==0) {next;} # skip if corresponding residue was skipped in pdb file $printblock[$k].=sprintf("%1s %3i %1s %s\n",$aaq[$col1],$i1[$col1],$aat[$col1],$nres[$l1[$col1]]); if ($v>=4) {printf("%1s %3i %1s %s\n",$aaq[$col1],$i1[$col1],$aat[$col1],$nres[$l1[$col1]]);} } } } $printblock[$k].=sprintf("TER\n"); return; } # Extract pdbcode and construct name of pdbfile and return in global variables $pdbid and $chain sub ExtractPdbcodeAndChain() { my $name=$_[0]; $name=~/^(\S+)/; $name=$1; # SCOP ID? (d3lkfa_,d3grs_3,d3pmga1,g1m26.1) if ($name=~/^[defgh](\d[a-z0-9]{3})([a-z0-9_.])[a-z0-9_]$/) { $pdbcode=$1; if ($2 eq "_") {$chain="[A ]";} else {$chain=uc($2);} } # PDB ID? (8fab, 1a0i) elsif ($name=~/^(\d[a-z0-9]{3})$/) { $pdbcode=$1; $chain="[A ]"; } # PDB ID? (8fab_A) elsif ($name=~/^(\d[a-z0-9]{3})_(\S)$/) { $pdbcode=$1; $chain=$2; } # PDB ID? (1u1z_ABC) elsif ($name=~/^(\d[a-z0-9]{3})_(\S\S+)$/) { $pdbcode=$1; $chain="[$2]"; } # DALI ID? (8fabA_0,1a0i_2) elsif ($name=~/^(\d[a-z0-9]{3})([A-Za-z0-9]?)_\d+$/) { $pdbcode=$1; $chain=$2; } else { $pdbcode=$name; $chain="A"; # return 1; # no SCOP/DALI/pdb sequence } &FindPDBfile($pdbcode); if ($pdbfile eq "") { if ($v>=2) {print("Warning: no pdb file found for sequence name '$name'\n");} return 1; } return 0; } # Resort arrays according to sorting array0: # Resort(\@array0,\@array1,...,\@arrayN) sub Sort() { my $p_array0 = $_[0]; my @index=(); for (my $i=0; $i<@{$p_array0}; $i++) {$index[$i]=$i;} @index = sort { ${$p_array0}[$a] <=> ${$p_array0}[$b] } @index; foreach my $p_array (@_) { my @dummy = @{$p_array}; @{$p_array}=(); foreach my $i (@index) { push(@{$p_array}, $dummy[$i]); } } } ################################################################################## # Convert three-letter amino acid code into one-letter code ################################################################################## sub Three2OneLetter { my $res=uc($_[0]); if ($res eq "GLY") {return "G";} elsif ($res eq "ALA") {return "A";} elsif ($res eq "VAL") {return "V";} elsif ($res eq "LEU") {return "L";} elsif ($res eq "ILE") {return "I";} elsif ($res eq "MET") {return "M";} elsif ($res eq "PHE") {return "F";} elsif ($res eq "TYR") {return "Y";} elsif ($res eq "TRP") {return "W";} elsif ($res eq "ASN") {return "N";} elsif ($res eq "ASP") {return "D";} elsif ($res eq "GLN") {return "Q";} elsif ($res eq "GLU") {return "E";} elsif ($res eq "CYS") {return "C";} elsif ($res eq "PRO") {return "P";} elsif ($res eq "SER") {return "S";} elsif ($res eq "THR") {return "T";} elsif ($res eq "LYS") {return "K";} elsif ($res eq "HIS") {return "H";} elsif ($res eq "ARG") {return "R";} # The HETATM selenomethionine is read by MODELLER like a normal MET in both its HETATM_IO=off and on mode! elsif ($res eq "MSE") {return "M";} # SELENOMETHIONINE elsif ($res eq "ASX") {return "B";} elsif ($res eq "GLX") {return "Z";} else {return "X";} # The following post-translationally modified residues are ignored by MODELLER in its default SET HETATM_IO=off mode # elsif ($res eq "SEC") {return "C";} # SELENOCYSTEINE # elsif ($res eq "SEP") {return "S";} # PHOSPHOSERINE # elsif ($res eq "TPO") {return "T";} # PHOSPHOTHREONINE # elsif ($res eq "TYS") {return "Y";} # SULFONATED TYROSINE # elsif ($res eq "KCX") {return "K";} # LYSINE NZ-CARBOXYLIC ACID } ################################################################################## # Convert one-letter amino acid code into three-letter code ################################################################################## sub One2ThreeLetter { my $res=uc($_[0]); if ($res eq "G") {return "GLY";} elsif ($res eq "A") {return "ALA";} elsif ($res eq "V") {return "VAL";} elsif ($res eq "L") {return "LEU";} elsif ($res eq "I") {return "ILE";} elsif ($res eq "M") {return "MET";} elsif ($res eq "F") {return "PHE";} elsif ($res eq "Y") {return "TYR";} elsif ($res eq "W") {return "TRP";} elsif ($res eq "N") {return "ASN";} elsif ($res eq "D") {return "ASP";} elsif ($res eq "Q") {return "GLN";} elsif ($res eq "E") {return "GLU";} elsif ($res eq "C") {return "CYS";} elsif ($res eq "P") {return "PRO";} elsif ($res eq "S") {return "SER";} elsif ($res eq "T") {return "THR";} elsif ($res eq "K") {return "LYS";} elsif ($res eq "H") {return "HIS";} elsif ($res eq "R") {return "ARG";} elsif ($res eq "U") {return "SEC";} elsif ($res eq "B") {return "ASX";} elsif ($res eq "Z") {return "GLX";} else {return "UNK";} } # Find the pdb file with $pdbcode in pdb directory sub FindPDBfile() { my $pdbcode=lc($_[0]); foreach $pdbdir (@pdbdirs) { if (! -e "$pdbdir") {warn("Warning in $program: pdb directory '$pdbdir' does not exist!\n"); next;} if (-e "$pdbdir/all") {$pdbfile="$pdbdir/all/";} elsif (-e "$pdbdir/divided") {$pdbfile="$pdbdir/divided/".substr($pdbcode,1,2)."/";} else {$pdbfile="$pdbdir/";} if ($pdbdir=~/divided.?$/) {$pdbfile.=substr($pdbcode,1,2)."/";} if (-e $pdbfile."pdb$pdbcode.ent") {$pdbfile.="pdb$pdbcode.ent";} elsif (-e $pdbfile."pdb$pdbcode.ent.gz") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.gz |";} elsif (-e $pdbfile."pdb$pdbcode.ent.Z") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.Z |";} elsif (-e $pdbfile."$pdbcode.pdb") {$pdbfile.="$pdbcode.pdb";} else {next;} return $pdbfile; } printf(STDERR "Warning in $program: Cannot find pdb file $pdbfile"."pdb$pdbcode.ent!\n"); return ""; } hhsuite-2.0.16/scripts/pdbfilter.pl0000775172256617226630000003156012110430072021564 0ustar hauserscientific_computing#! /usr/bin/env perl # pdbfilter.pl - Read pdb or SCOP sequences from infile and write representative set of sequences to outfile # # HHsuite version 2.0.16 (April 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; $|= 1; # Activate autoflushing on STDOUT # Default options my $idmax=90; # maximum sequence identity threshold my $Evalmin=10.1; # minimum BLAST E-value (should be <0.01 to ensure that sequences being filtered out are homologous to some representative sequence my $covmin=90; # minimum coverage threshold (should be large enough to ensure that no structural domain is lost from the filtered set just because it occurs in a sequence with, say, 2 other domains similar to some representative sequence) my $v=2; my $blastpgp="$ncbidir/blastpgp"; my $help=" pdbfilter.pl - Read pdb or SCOP sequences from infile and write representative set of sequences to outfile Compares each sequence with all others using BLAST (blastpgp). If two sequences are sufficiently similar, the sequence with lower resolution will be removed. The exact criterion for removal is: IF more than \$covmin\% of the sequence with lower resolution is covered by the BLAST alignment AND the sequence identity is larger than \$idmin AND the E-value is better than \$Evalmin AND the sequence has lower coverage than the already accepted representative sequence. The input file must have been prepared with pdb2fasta.pl or scop2fasta.pl. Sequences with fewer than 15 residues are suppressed. Usage: pdbfilter.pl infile filtered_file [-u old_filtered_file] [-id int] [-cov int] Options -id maximum sequence identity between representative sequences (default=$idmax) -e minimum E-value between representative sequences (default=$Evalmin) -cov minimum coverage of a sequence with a similar one to get thrown out (default=$covmin) -u update the old filtered file; this saves a lot of execution time -v verbose mode Example: pdbfilter.pl pdb.fas pdb70.fas -u pdb70.fas -id 70 -cov 90\n "; if (@ARGV<2) {print($help); exit;} my $infile; my $outfile; my $oldfile; my $root=""; # $outfile without extension my $line; my $pdbid=""; # e.g. 1ahs_C my $qpdbid; # pdbid of query sequence my $seq=""; # sequence record (name+residues) in FASTA my @seqs; # sequence records as they were read my $len=0; # length of sequence to be read in my %len; # $len{$pdbid} is length of sequence my $resol; # experimental resolution in Angstroem my %resol; # experimental resolution in Angstroem my %excluded; # representative sequences are all those not in this hash my %accepted; # representative sequences accpeted so far my %similar; # $similar{$pdbid} contains list of all pdbids (SCOPIDs) that are represented by (i.e. similar to) $qpdbid my %het; # $het{$pdbid} is "*" if sequence $pdbid has a HET: record (i.e. contains HET group with >=10 atoms), "" otherwise my $id; # sequence identity to query my $cov; # coverage my $Evalue; # BLAST E-value my $nold=0; # number of sequences in oldfile my $ntot=0; # total number of sequences in oldfile and infile my $k=0; # counts sequences read in so far my $sort_by_family=1; # set to 0 if at least one non-SCOP sequence found # Read command line options my $options=""; for (my $i=0; $i<=$#ARGV; $i++) {$options.=" $ARGV[$i]";} if ($options=~s/ -id\s+(\S+)//) {$idmax=$1;} if ($options=~s/ -cov\s+(\S+)//) {$covmin=$1;} if ($options=~s/ -e\s+(\S+)//) {$Evalue=$1;} if ($options=~s/ -u\s+(\S+)//) {$oldfile=$1;} if ($options=~s/ -v\s*(\d+)//) {$v=$1;} if ($options=~s/ -v//) {$v=2;} if (!$infile && $options=~s/^\s*([^- ]\S+)\s*//) {$infile=$1;} if (!$outfile && $options=~s/^\s*([^- ]\S+)\s*//) {$outfile=$1;} # Warn if unknown options found or no infile/outfile if ($options!~/^\s*$/) {$options=~s/^\s*(.*?)\s*$/$1/g; die("Error: unknown options '$options'\n");} if (!$infile) {print($help); print("Error: no input file given\n"); exit;} if (!$outfile) {print($help); print("Error: no output file given\n"); exit;} $covmin*=0.01; if ($outfile=~/^(\S*?)\.(.*)$/) {$root=$1;} else {$root=$outfile;} # Read sequences from oldfile if ($oldfile) {$nold=&ReadSequences($oldfile,0);} # Read NEW sequences from infile (the ones that are not yet in oldfile) $ntot=&ReadSequences($infile,$nold); # Sort by resolution @seqs=sort SortByResolution @seqs; #foreach $seq (@seqs) {print("$seq");} # Record resolution and length of all sequences in hashes for ($k=0; $k<@seqs; $k++) { $seqs[$k]=~s/^(\S+?)!(\S+?)!>(\S+)(.*)/>$3$4/o; $len{$3}=$1; $resol{$3}=$2; my $pdbid=$3; if ($seqs[$k]=~s/ PDB:\s*(( \d\S{3,5}\*?)+)//) { $similar{$pdbid}=$1; } elsif ($seqs[$k]=~s/ SCOPID:\s*(( [a-z]\d\S{5}\*?)+)//) { $similar{$pdbid}=$1; } else { $similar{$pdbid}=""; } if ($seqs[$k]=~/ HET:/) { $het{$pdbid}="*"; } else { $het{$pdbid}=""; } } # Format BLAST database, initialize if ($v>=2) {printf("Doing PSI-BLAST runs\n");} &PrintSequences("$root.db",$nold); &System("$ncbidir/formatdb -i $root.db"); my $nacc=0; # number of accepted sequences = number of BLAST searches already performed my $done=0; # number of sequences already processed my $nexcl=0; # number of already excluded chains my $step=($ntot>1000)*0.05+($ntot<=1000)*0.1; my $reformat=$step; # when X% of the total number of sequences have been excluded, reformat database #################################################################################################### # For each sequence in infile, do BLAST search and exclude hits that are too similar to query foreach $seq (@seqs) { $seq=~/^>(\S+)/o; $done++; if($excluded{$1}) {next;} $qpdbid=$1; $resol=$resol{$1}; $len=$len{$1}; if ($v>=2 && !($nacc%100)) { printf("\nSearches:%-4i Done:%3i%% DB-size:%3i%% ",$nacc,100*($nexcl+$nacc)/$ntot+0.5,100*($ntot-$nexcl)/$ntot+0.5); } # When a substantial number of sequences have been excluded, reformat database WITHOUT excluded sequences if (!$oldfile && ($nexcl+$nacc)/$ntot>$reformat) { if ($v>=2) {printf("\b\b\b%2i%%",100*$reformat+0.5);} elsif ($v>=3) { printf("\nReformatting search database containing %i out of %i sequences\n",$ntot-$nexcl,$ntot);} # Write updated database with all seqs with index >=$done that have not yet been excluded # (Don't have to compare A->B and B->A, hence exclude seqs with index <$done) &PrintSequences("$root.db",$done); &System("$ncbidir/formatdb -i $root.db"); $reformat+=$step; } open (TMPFILE,">$root.tmp") || die ("ERROR: cannot open $root.tmp for writing: $!\n"); print(TMPFILE $seq); close(TMPFILE); # Find hits that are too similar if ($v>=3) {print("\n$blastpgp -i $root.tmp -d $root.db -v 1 -b 1000 -s T -z $ntot");} open(BLAST,"$blastpgp -i $root.tmp -d $root.db -v 1 -b 1000 -s T -z $ntot|"); while ($line=){ if ($line=~/^>(\S+)/o && $1 ne $qpdbid && !$excluded{$1} && !$accepted{$1}) { $pdbid=$1; while ($line=){if ($line=~/^ Score = /o) {last;}} $line=~/ Expect =\s*(\S+)/ or die("Error: format error in '$blastpgp -i $root.tmp -d $root.db -v 1 -b 1000 -s T -z $ntot|', line $.\n"); $Evalue=$1; $Evalue=~s/^e/1e/; $Evalue=~s/,$//; $line=; $line=~/^ Identities =\s*\d+\/(\d+)\s+\((\d+)\%\)/o or die("Error: format error in '$blastpgp -i $root.tmp -d $root.db -v 1 -b 1000 -s T -z $ntot|', line $.\n"); $len=$1; $id=$2; # Coverage = (length of whole alignment (including gaps) - gaps in query or HSP) / length of HSP if ($line=~/Gaps =\s*(\d+)\/\d+/) {$cov=($len-$1)/$len{$pdbid};} else {$cov=$len/$len{$pdbid};} ## Main filtering criterion: remove sequence from representative set if... if ($id>=$idmax && $Evalue<=$Evalmin && $cov>=$covmin && $resol<=$resol{$pdbid}) { $excluded{$pdbid}=1; # if ($similar{$qpdbid} ne "") {$similar{$qpdbid}.=",";} # separate pdbids with identical sequences with ',' if (!$similar{$qpdbid}) {$similar{$qpdbid}="";} $similar{$qpdbid}.=" ".$pdbid.$het{$pdbid}.$similar{$pdbid}; $nexcl++; if ($v>=4) { print($line); printf("Rep: $qpdbid excl: $pdbid (len=%3i cov=%3.0f id=$1)\n",$len{$pdbid},100*$cov); } } } } close(BLAST); $nacc++; $accepted{$qpdbid}=1; if ($v>=2) {print(".");} } if ($v>=2) {print("\n");} #################################################################################################### if ($sort_by_family) {@seqs=sort SortByFamily @seqs;} # Print out all representative sequences to outfile &PrintSequences($outfile,0); if ($v>=2) { printf("Written %i out of %i sequences to $outfile\n",$ntot-$nexcl,$ntot); } unlink("$root.tmp"); unlink(glob("$root.db*")); exit; # Read sequences in infile beginning at index $k sub ReadSequences() { my $infile=$_[0]; my $k=$_[1]; my $k0=$k; my $nres=0; # skip sequences with fewer than 15 real residues if ($v>=3) {printf("Reading $infile ... \n");} open (INFILE,"<$infile") || die ("ERROR: cannot open $infile for reading: $!\n"); while ($line=) { if ($line=~/^>/) { if ($pdbid && !$len{$pdbid} && $nres>=15) { if ($len<26) {chomp $seq; $seq.=('x'x(26-$len))."\n";} # add 'x' to make $seq at least 26 resiudes long $seqs[$k++]="$len!$resol!$seq"; } # Read pdbid (or SCOP id) and resolution from name line if ($line=~/^>(\S{4,6}) .*; (\d+\.?\d*|NMR)A? \{/o) { # PDB sequence $pdbid=$1; if ($2 eq "NMR") {$resol=10;} else {$resol=$2;} $seq=$line; $len=$nres=0; $sort_by_family=0; } elsif ($line=~/^>([a-z]\S{6}) .* (\d+\.?\d*)\s*$/) { # SCOP sequence $pdbid=$1; if ($2 eq "" or $2 eq "NMR") {$resol=10;} else {$resol=$2;} $resol=$2; $line=~s/^(>.*) (\d+\.?\d*)\s*$/$1\n/; # remove resolution at the end of the name line $seq=$line; $len=0; } else {print("WARNING: nameline format not recognized: $line");} $nres=0; } else { $seq.=$line; $len+=length($line)-1; $nres+=($line=~tr/a-wyA-WY/a-wyA-WY/); } } if ($pdbid && !$len{$pdbid}) { if ($len<26) {$seq.=('X'x(26-$len))."\n";} # add 'X' to make $seq at least 26 resiudes long $seqs[$k++]="$len!$resol!$seq"; } close(INFILE); if ($v>=2) {printf("Read %i sequences from $infile ... \n",$k-$k0);} return $k; } # Print all sequences that have not been excluded so far to file, beginning at index $k sub PrintSequences() { open (OUTFILE,">$_[0]") || die("Error: could not write to $_[0]: $!\n"); for (my $k=$_[1]; $k<@seqs; $k++) { $seqs[$k]=~/>(\S+)/o; if (!$excluded{$1}) { my $seq=$seqs[$k]; if ($similar{$1} ne "") { my $pdbs=$similar{$1}; # Limit number of represented pdbs to 30 if ($pdbs =~/^(\s+\S+){31,}/) {$pdbs =~/^((?:\s+\S+){30})/; $pdbs=$1." ...";} if ($pdbs=~/^\s*\d\S{3,5}/) { $seq=~s/^(.*)/$1 PDB:$pdbs/; } elsif ($pdbs=~/^\s*[a-z]\d\S{5}/) { $seq=~s/^(.*)/$1 SCOPIDS:$pdbs/; } } print(OUTFILE $seq); } } close(OUTFILE); } sub SortByResolution() { my $aa; my $bb; if ($a!~/^\d+!(\S+)!>/o) { $a=~/^(\S+)/o; printf("Error: sequence %s does not contain resolution in right format\n",$1); return 0; } $aa=$1; if ($b!~/^\d+!(\S+)!>/o) { $b=~/^(\S+)/o; printf("Error: sequence %s does not contain resolution in right format\n",$1); return 0; } $bb=$1; return ($aa<=>$bb); } sub SortByFamily() { my $aa; my $bb; if ($a!~/^>\S+ (\S+)/) { $a=~/^(\S+)/o; printf("Error: sequence %s does not contain resolution in right format\n",$1); return 0; } $aa=$1; if ($b!~/^>\S+ (\S+)/) { $b=~/^(\S+)/o; printf("Error: sequence %s does not contain resolution in right format\n",$1); return 0; } $bb=$1; return ($aa cmp $bb); } sub System() { $v--; &HHPaths::System($_[0]); $v++; } hhsuite-2.0.16/scripts/renumberpdb.pl0000775172256617226630000003173712110430072022124 0ustar hauserscientific_computing#!/usr/bin/env perl # renumberpdb.pl - generate a PDB file with renumbered indices that match residue indices in input sequence # Usage: renumberpdb.pl [options] infile [outfile] # Example: renumberpdb.pl d1hz4a_.a3m d1hz4a_.pdb # (C) Johannes Soeding, 2012 # # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use Align; # Needleman-Wunsch and Smith-Waterman alignment functions use strict; $|=1; # autoflush on # Default parameters for Align.pm our $d=3; # gap opening penalty for Align.pm our $dx=20; # gap opening penalty for sequence x Align.pm our $e=0.1; # gap extension penalty for Align.pm our $g=0.09; # endgap penalty for Align.pm our $v=2; # verbose mode our $matrix="identity"; # Global variables my $infile; # input file my $outfile; # output file my $line; # input line my $nameline=""; # characters following '>' in input file my $aaq=""; # amino acid sequence read from input file my $outdir; # directory path of input file my $program=$0; # name of perl script my $replaceMSE=1; # replace HETATM MSE records by ATOM MET my $dopt=0; my $altloc="A"; my $pdbfile; $program=~s/.*\///; # remove path if (scalar(@ARGV)<1) { print(" $program - generate a PDB file with renumbered indices that match residue indices in input sequence The program reads an input sequence in FASTA/A3M which must have a SCOP domain, PDB chain, or DALI domain identifier (e.g. d1hz4a_, 1hz4_A, or 1hz4A_1). It reads the corresponding PDB file from the given pdb directory and generates a new PDB file by aligning the input sequence to the sequence extracted from the ATOM records of the corresponding pdb chain and renumbering the residues in columns 23-26 according to the position in the input sequence. (HETATM records for MSE (selenomethionine) will be interpreted as ATOM records for MET in the alignment. MSE will be changed to MET in the output file.) Usage: $program [options] infile [outfile] Example: $program d1hz4a_.a3m /cluster/tmp/d1hz4a_.pdb Options: -o output file (default: .pdb -d give directory of pdb files (default=$pdbdir) -a [A|B] filter alternative location identifier (e.g. A or B) \n"); exit; } my $options=""; for (my $i=0; $i<@ARGV; $i++) {$options.=" $ARGV[$i] ";} # General options if ($options=~s/ -d\s*(\S+) / /) {$pdbdir=$1; $dopt=1;} if ($options=~s/ -a\s*(\S+) / /) {$altloc=$1;} if ($options=~s/ -i\s*(\S*) //) {$infile=$1;} if ($options=~s/ -o\s*(\S*) //) {$outfile=$1;} if ($options=~s/ -v\s+(\d+) / /g) {$v=$1;} if (!$infile && $options=~s/^\s*([^-]\S*)\s* / /) {$infile=$1;} if (!$outfile && $options=~s/^\s*([^-]\S*)\s* / /) {$outdir=$1;} if (!$outfile) { $outfile=$infile; $outfile=~s/^(.*)\..*?$/$1.pdb/; } # Read query sequence in infile if ($v>=3) {print("Reading $infile...\n");} open(INFILE,"<$infile") or die("Error: can't open $infile: $!\n"); while ($line=) { # find query sequence if ( $line=~/^>/ && $line!~/^>(aa|ss)_/){last;} } $line=~/^>(.*)/; $nameline=$1; # Read query sequence while ($line=) { if($line=~/^>/) {last;} chomp($line); $aaq.=$line; } # $aaq=~tr/X.-//d; # Remove symbol for inserted domain or missing residues if (&MakePdbFile($nameline,$aaq,$outfile) !=0) {exit(1);} close(INFILE); if ($v>=2) {print("Done\n");} exit(0); ################################################################################## # Make a pdb file $base.pdb with correct resdiue numbers from query sequence in $base.hhm ################################################################################## sub MakePdbFile() { # >g1avo.1 a.24.8.1 (A:,B:) Proteasome activator reg(alpha) {Human (Homo sapiens)} my $nameline=$_[0]; # everything in line following '>' in infile my $aaq=$_[1]; # query amino acids my $outfile=$_[2]; # query amino acids my $pdbcode; # e.g. 1hz4 my $chain; # chain id of query sequence for hmmfile my $line; # currently read input line my $header; # PDB file header my @remarks; # PDB file remarks my $date=`date`; chomp($date); $nameline=~/^(\S+)/; my $name=$1; # SCOP ID? (d3lkfa_,d3grs_3,d3pmga1,g1m26.1) if ($nameline=~/^[d-u](\d[a-z0-9]{3})([a-z0-9_.])[a-z0-9_]\b/) { $pdbcode=lc($1); $chain=uc($2); if ($chain eq "_") {$chain="[A ]";} else {$chain=uc($2);} $header="HEADER SCOP domain $name $date"; } # DALI ID? (8fabA_0,1a0i_2) elsif ($nameline=~/^(\d[a-z0-9]{3})([A-Za-z0-9])?_\d+\s+\d+\.\d+.\d+.\d+.\d+.\d+/) { $pdbcode=lc($1); $chain=$2; if ($chain eq "") {$chain="A";} $header="HEADER DALI domain $name $date"; } # PDB ID? (8fab_A, 1a0i, 1a0i_2) elsif ($nameline=~/^(\d[a-z0-9]{3})_?(\S?)\b/) { $pdbcode=lc($1); $chain=$2; if ($chain eq "") {$chain="[A ]";} $header="HEADER PDB chain $name $date"; } # T0289_B or similar elsif ($dopt && $nameline=~/^([^_\s]+)/) { $pdbcode=$1; if ($nameline=~/^[^_\s]+_(\S)/) {$chain=$1;} else {$chain=".";} $header="HEADER $pdbcode $date"; } else { die("Error: no pdb code found in sequence '$nameline'\n"); } my $i; # index for residues in scop sequence my $l; # index for residue record in pdb file: l-1'st character in $aapdb <=> l'th record of $pdbline my @pdbline; # $pdbline[$l][$natom] = line in pdb file for l'th residue in $aapdb and atom N, CB, or O my $natom; # runs from 0 up to 2 (N, CB, O) my $res; # residue in pdb line my $atom; # atom code in pdb file (N, CA, CB, O, ...) my $aapdb=""; # template amino acids from ATOM record of pdb file my $col; # column of alignment query (from hhm file) versus pdb-residues my $nres; # residue number in pdb file if ($v>=3) {print("Looking for pdb file with pdb code $pdbcode ...\n");} $pdbfile = &OpenPDBfile($pdbcode); if ($v>=3) {print("Opening pdb file $pdbfile ...\n");} if ($pdbfile eq "") {return 1;} $l=0; $nres=-1e6; while ($line=) { # ATOM 1 N GLY A 1 -19.559 8.872 4.925 1.00 16.44 N # ATOM 2 CA GLY A 1 -19.004 8.179 6.112 1.00 14.30 C if ($line=~/^ENDMDL/) {last;} # if file contains NMR models read only first if ($line=~/^ATOM \s*\d+ (....)[ $altloc](\w{3}) $chain\s*(-?\d+\w?).*/ || $line=~/^HETATM\s*\d+ (....)[ $altloc](MSE) $chain\s*(-?\d+\w?).*/) { $atom=$1; $res=$2; # New residue? if ($3 ne $nres) { # $3<$nres if new chain (A:,B:) $nres=$3; $l++; $res=&Three2OneLetter($res); $aapdb.=$res; $natom=0; } if ($replaceMSE) { $line=~s/^(HETATM\s*\d+ )SE(...MSE)/$1 S$2/ && $line=~s/SE(\s*)$/ S$1/; $line=~s/^HETATM(\s*\d+ .....)MSE/ATOM $1MET/; } $pdbline[$l][$natom++]=$line; } } close (PDBFILE); # Align scop query sequence ($aaq) with query sequence in pdb ($aapdb) my $xseq=$aaq; my $yseq=$aapdb; my ($imin,$imax,$lmin,$lmax); my $Sstr; my $score; my (@i,@l); # The aligned characters are returend in $j[$col] and $l[$col] if ($v>=3) {print("Aligning query sequence with sequence from pdb ATOM records \n");} $score=&AlignNW(\$xseq,\$yseq,\@i,\@l,\$imin,\$imax,\$lmin,\$lmax,\$Sstr); # DEBUG if ($v>=3) {print("Generating renumbered pdbfile \n");} # Set remarks etc. my $author ="AUTHOR J. Soeding johannes\@soeding.com"; push(@remarks,"REMARK This file was generated by $program. Its residue numbers refer"); push(@remarks,"REMARK to the following SEQRES sequence, for which $program was called:"); push(@remarks,"REMARK >$nameline"); $line=uc($aaq); while ($line) { $line=~s/^(\S{1,60})//; push(@remarks,"REMARK $1"); } # Print scop-pdb file if (!open (OUTFILE,">$outfile")) {warn("Error: can't open $outfile: $!\n"); return 3;} printf(OUTFILE "%-80.80s\n",$header); printf(OUTFILE "%-80.80s\n",$author); foreach my $remark (@remarks) {printf(OUTFILE "%-80.80s\n",$remark);} my $match=0; my $len=length($aaq); for ($col=0; $col<@i; $col++) { if ($i[$col] && $l[$col]) { $match++; for ($natom=0; $natom=4) {printf("%s%4i %s\n",$1,$i[$col],$2);} $line=sprintf("%s%4i %s\n",$1,$i[$col],$2); # $pdbline[$l[$col]][$natom]=~/(^......\s*\d+ .....\w{3} $chain).{4}(.*)/; # if ($v>=4) {printf("%s%4i%s\n",$1,$i[$col],$2);} # $line=sprintf("%s%4i%s\n",$1,$i[$col],$2); print(OUTFILE $line); } } } $line=~/^ATOM\s+(\d+)......(.........)/; printf(OUTFILE "TER %5i %s \n",1+$1,$2); print(OUTFILE "END \n"); close (OUTFILE); # Warn? if ($v>=2 || ($v>=1 && $len-$match>5)) { if ($v>=1 && $len-$match>1) { printf("\nWARNING: could not find coordinates for %i query residues:\n",$len-$match); } else { printf("\n"); } $nameline=~/^(\S+)/; printf("%-14.14s $xseq\n","Q $1:"); printf("%-14.14s $Sstr\n","Identities:"); printf("%-14.14s $yseq\n","T $pdbcode"."_$chain:"); printf("\n"); if ($v>=4) { for ($col=0; $col<@l && $col<200; $col++) { printf("%3i %3i %3i\n",$col,$i[$col],$l[$col]); } } } return 0; } # End MakePdbFile() ################################################################################## # Convert three-letter amino acid code into one-letter code ################################################################################## sub Three2OneLetter { my $res=uc($_[0]); if ($res eq "GLY") {return "G";} elsif ($res eq "ALA") {return "A";} elsif ($res eq "VAL") {return "V";} elsif ($res eq "LEU") {return "L";} elsif ($res eq "ILE") {return "I";} elsif ($res eq "MET") {return "M";} elsif ($res eq "PHE") {return "F";} elsif ($res eq "TYR") {return "Y";} elsif ($res eq "TRP") {return "W";} elsif ($res eq "ASN") {return "N";} elsif ($res eq "ASP") {return "D";} elsif ($res eq "GLN") {return "Q";} elsif ($res eq "GLU") {return "E";} elsif ($res eq "CYS") {return "C";} elsif ($res eq "PRO") {return "P";} elsif ($res eq "SER") {return "S";} elsif ($res eq "THR") {return "T";} elsif ($res eq "LYS") {return "K";} elsif ($res eq "HIS") {return "H";} elsif ($res eq "ARG") {return "R";} elsif ($res eq "SEC") {return "U";} elsif ($res eq "ASX") {return "B";} elsif ($res eq "GLX") {return "Z";} elsif ($res eq "KCX") {return "K";} elsif ($res eq "MSE") {return "M";} # SELENOMETHIONINE elsif ($res eq "SEP") {return "S";} # PHOSPHOSERINE else {return "X";} } # Find the pdb file with $pdbcode in pdb directory sub OpenPDBfile() { my $pdbcode=lc($_[0]); if (! -e "$pdbdir") { print(STDERR "Error in $program: pdb directory '$pdbdir' does not exist!\n"); return 1; } if (-e "$pdbdir/all") {$pdbfile="$pdbdir/all/";} elsif (-e "$pdbdir/divided") {$pdbfile="$pdbdir/divided/".substr($pdbcode,1,2)."/";} else {$pdbfile="$pdbdir/";} if ($pdbdir=~/divided.?$/) {$pdbfile.=substr($pdbcode,1,2)."/";} if (-e $pdbfile."pdb$pdbcode.ent") {$pdbfile.="pdb$pdbcode.ent";} elsif (-e $pdbfile."pdb$pdbcode.ent.gz") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.gz |";} elsif (-e $pdbfile."pdb$pdbcode.ent.Z") {$pdbfile="gunzip -c $pdbfile"."pdb$pdbcode.ent.Z |";} elsif (-e $pdbfile."$pdbcode.pdb") {$pdbfile."$pdbcode.pdb";} else { printf(STDERR "Error in $program: Cannot find pdb file $pdbfile"."pdb$pdbcode.ent!\n"); return ""; } if (!open (PDBFILE, "$pdbfile")) { printf(STDERR "Error in $program: Cannot open pdb file: $!\n"); return ""; } return $pdbfile; } hhsuite-2.0.16/scripts/reformat.pl0000775172256617226630000006743112110430072021436 0ustar hauserscientific_computing#! /usr/bin/env perl # reformat.pl # Reformat a multiple alignment file # # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; use warnings; my $numres=100; # number of residues per line my $desclen=1000; # maximum number of characters in nameline my $ARGC=scalar(@ARGV); if ($ARGC<2) { die(" reformat.pl from HHsuite $VERSION Read a multiple alignment in one format and write it in another format Usage: reformat.pl [informat] [outformat] infile outfile [options] or reformat.pl [informat] [outformat] 'fileglob' .ext [options] Available input formats: fas: aligned fasta; lower and upper case equivalent, '.' and '-' equivalent a2m: aligned fasta; inserts: lower case, matches: upper case, deletes: '-', gaps aligned to inserts: '.' a3m: like a2m, but gaps aligned to inserts MAY be omitted sto: Stockholm format; sequences in several blocks with sequence name at beginning of line (hmmer output) psi: format as read by PSI-BLAST using the -B option (like sto with -M first -r) clu: Clustal format; sequences in several blocks with sequence name at beginning of line Available output formats: fas: aligned fasta; all gaps '-' a2m: aligned fasta; inserts: lower case, matches: upper case, deletes: '-', gaps aligned to inserts: '.' a3m: like a2m, but gaps aligned to inserts are omitted sto: Stockholm format; sequences in just one block, one line per sequence psi: format as read by PSI-BLAST using the -B option clu: Clustal format If no input or output format is given the file extension is interpreted as format specification ('aln' as 'clu') Options: -v int verbose mode (0:off, 1:on) -num add number prefix to sequence names: 'name', '1:name' '2:name' etc -noss remove secondary structure sequences (beginning with >ss_) -sa do not remove solvent accessibility sequences (beginning with >sa_) -M first make all columns with residue in first seuqence match columns (default for output format a2m or a3m) -M int make all columns with less than X% gaps match columns (for output format a2m or a3m) -r remove all lower case residues (insert states) (AFTER -M option has been processed) -r int remove all lower case columns with more than X% gaps -g '' suppress all gaps -g '-' write all gaps as '-' -uc write all residues in upper case (AFTER all other options have been processed) -lc write all residues in lower case (AFTER all other options have been processed) -l number of residues per line (for Clustal, FASTA, A2M, A3M formats) (default=$numres) -d maximum number of characers in nameline (default=$desclen) Examples: reformat.pl 1hjra.a3m 1hjra.a2m (same as reformat.pl a3m a2m 1hjra.a3m 1hjra.a2m) reformat.pl test.a3m test.fas -num -r 90 reformat.pl fas sto '*.fasta' .stockholm \n"); # clu: clustal format (hmmer output) # sel: Selex format # phy: Phylip format } my $informat=""; my $outformat=""; my $infile=""; my $outfile=""; my $num=0; # don't use sequence number as prefix: '>n|name' my $noss=0; # don't remove secondary structure my $nosa=1; # remove solvent accessibility sequences my $line; my $options=""; my @names; # names of sequences read in my @seqs; # residues of sequences read in my $n; # number of sequences read in my $k; # counts sequences for output my $remove_inserts=0; my $remove_gapped=0; my $matchmode=""; # do not change capitalization my $match_gaprule=0; # columns with less than this percentage of gaps will be match columns my $v=2; my $update=0; my $nss=-1; # index of secondary structure sequence my $lname; # length of sequence name in clustal, stockholm, psi format my $titleline; # first line beginning with "#" in A3M, A2M, or FASTA files my @informats= ("fas","a2m","a3m","sto","psi","clu"); my @outformats= ("fas","a2m","a3m","sto","psi","clu","ufas"); my $found; my $element; my $gap="default"; my $case="default"; # Process optionsz for (my $i=0; $i<$ARGC; $i++) {$options.=" $ARGV[$i] ";} if ($options=~s/ -i\s+(\S+) / /) {$infile=$1;} if ($options=~s/ -o\s+(\S+) / /) {$outfile=$1;} if ($options=~s/ -num / /) {$num=1; $desclen=505;} if ($options=~s/ -noss / /) {$noss=1;} if ($options=~s/ -sa / /) {$nosa=0;} if ($options=~s/ -g\s+\'?(\S*)\'? / /) {$gap=$1;} if ($options=~s/ -r\s+(\d+) / /) {$remove_gapped=$1;} if ($options=~s/ -r / /) {$remove_inserts=1;} if ($options=~s/ -lc / /) {$case="lc";} if ($options=~s/ -uc / /) {$case="uc";} if ($options=~s/ -v\s*(\d+) / /) {$v=$1;} if ($options=~s/ -v / /) {$v=2;} if ($options=~s/ -M\s+(\d+) / /) {$matchmode="gaprule"; $match_gaprule=$1;} if ($options=~s/ -M\s+first / /) {$matchmode="first"; $match_gaprule=$1;} if ($options=~s/ -u / /) {$update=1;} if ($options=~s/ -l\s+(\S+) / /) {$numres=$1;} if ($options=~s/ -lname\s+(\S+) / /) {$lname=$1;} if ($options=~s/ -d\s+(\S+) / /) {$desclen=$1;} # Assign informat, outformat, infile, and outfile if ($outfile eq "") { if ($options=~s/(\S+)\s*$//) { $outfile=$1; } else { die("Error: no output file given: '$options'\n"); } } if ($infile eq "") { if ($options=~s/(\S+)\s*$//) { $infile=$1; } else { die("Error: no input file given: '$options'\n"); } } if ($options=~s/(\S+)\s*$//) { $outformat=$1; } else { if ($outfile=~/\S*\.(\S+?)$/) { $outformat=lc($1); if ($outformat eq "aln") {$outformat="clu";} elsif ($outformat eq "fa") {$outformat="fas";} elsif ($outformat eq "fasta") {$outformat="fas";} elsif ($outformat eq "afa") {$outformat="fas";} elsif ($outformat eq "afas") {$outformat="fas";} elsif ($outformat eq "afasta") {$outformat="fas";} } else { print ("Using FASTA output format: '$options'\n"); $outformat="fas"; } } if ($options=~s/(\S+)\s*$//) { $informat=$1; } else { if ($infile=~/\S*\.(\S+?)$/) { $informat=lc($1); if ($informat eq "aln") {$informat="clu";} elsif ($informat eq "fa") {$informat="fas";} elsif ($informat eq "fasta") {$informat="fas";} } else { print ("Using FASTA input format: '$options'\n"); $informat="fas"; } } # Warn if unknown options found if ($options!~/^\s*$/) { $options=~s/^\s*(.*?)\s*$/$1/g; print("\nWARNING: unknown options '$options'\n"); } # Check if input and output formats are valid $found=0; foreach $element (@informats) {if ($informat eq $element) {$found=1; last;}} if(!$found) {die("\nError: $informat is not a valid input format option\n");} $found=0; foreach $element (@outformats) {if ($outformat eq $element) {$found=1; last;}} if(!$found) {die("\nError: $outformat is not a valid output format option\n");} #if($outformat eq "psi") { # $remove_inserts=1; #} if($outformat eq "ufas") {$gap="";} if ($infile=~/\*/ || $outfile=~/^\./) # if infile contains '*' or outfile is just an extension { $outfile=~/.*\.(\S*)$/; my $outext=$1; my @infiles=glob($infile); printf("%i files to reformat\n",scalar(@infiles)); foreach $infile (@infiles) { if ($infile!~/(\S+)\.\S+/) {$infile=~/(\S+)/} $outfile="$1.$outext"; if ($update && -e $outfile) {next;} if ($v>=3) {print("Reformatting $infile from $informat to $outformat ...\n");} &reformat($infile,$outfile); } exit 0; } else { if ($v>=3) {print("Reformatting $infile from $informat to $outformat ...\n");} &reformat($infile,$outfile); exit 0; } ################################################################################################ # Reformat a single file ################################################################################################ sub reformat() { $infile=$_[0]; $nss=-1; $titleline=""; ################################################################################################ # Input part ################################################################################################ my $skip=0; open (INFILE,"<$infile") or die ("ERROR: cannot open $infile: $!\n"); # Read a2m, a3m, fas format if ($informat eq "fas" || $informat eq "a2m" || $informat eq "a3m") { $/=">"; # set input field seperator $n=0; my $seq=; if ($seq=~s/^(\#.*)//) {$titleline=$1;} # remove commentary lines at beginning of file $seq=~s/(\n\#.*)*\n//; # remove commentary lines at beginning of file # If first line has no sequence name, use >root_name if ($seq ne ">") { $infile="/$infile."; # determine root name 1 $infile=~/^.*\/(.*?)\..*/; # determine root name 2 $names[$n]=$1; # don't move this line away from previous line $seq=~s/([^\n]*)//; $seq=~tr/\n //d; # remove newlines and blanks $seqs[$n]=$seq; $n++; } while ($seq=) { $seq=~s/\n\#.*//g; # remove commentary lines while ($seq=~s/(.)>/$1/) {$seq.=;} # in the case that nameline contains a '>'; '.' matches anything except '\n' if ($seq=~/^aa_/) {next;} if ($seq=~/^sa_/ && $nosa) {next;} if ($seq=~/^ss_/) { if ($noss) {next;} # do not read in >ss_ and >sa_ sequences # if ($seq=~/^ss_conf/) {next;} # comment out to read sequence with confidence values # if ($nss>=0) {next;} # comment out: allow for two or more >ss_dssp and >ss_pred lines $nss=$n; } $seq=~s/^\s*(.*)//; # divide into nameline and residues; '.' matches anything except '\n' if (defined $1 && $1 ne "") { $names[$n]=$1; # don't move this line away from previous line $seq=~s/([^\n]*)//; } else { $names[$n]=$n; } $seqs[$n]=$seq; $n++; } $/="\n"; # reset input field seperator } # Read Stockholm format elsif ($informat eq "sto") { my %seqhash; my $name; my $first_block=1; $n=0; while ($line = ) { $line=~tr/\r//d; $line=~s/\s+/ /g; if ($line=~s/^\#=GC SS_cons/ss_dssp/) {} # skip commentary and blank line if ($line=~/^\#/) {next;} # skip commentary and blank line if ($line=~/^\/\//) {last;} # reached end of file if ($line=~/^\s*$/){$first_block=0; next;} # new sequence block starts if ($line!~/^\s*(\S+)\s+(\S+)/) { die ("\nERROR found in stockholm format: $!"); } if (!(exists $seqhash{$1})) { if ($line=~/^aa_/) {next;} # do not read in >aa_ sequences if ($line=~/^sa_/ && $nosa) {next;} # do not read in >sa_ sequences if ($line=~/^ss_/) { if ($noss) {next;} # do not read in >ss_ and >aa_ sequences # if ($line=~/^ss_conf/) {next;} # comment out to read sequence with confidence values # if ($nss>=0) {next;} # comment out: allow for two or more >ss_dssp and >ss_pred lines $nss=$n; } $line=~/^\s*(\S+)\s+(\S+)/; $names[$n]=$1; $seqs[$n]=$2; $seqhash{$1}=$n++; $first_block=1; } else { if ($first_block) {die ("\nERROR: sequence $1 appears more than once per block\n");} $seqs[$seqhash{$1}].=$2; } # printf("%3i %s\n",$n-1,$seqs[$n-1]); } } elsif ($informat eq "clu") { my $residues_per_line=50; # default number of characters for namefield residues # (only needed if no gap between name and residues in first sequence -> SMART) my $block=1; # number of block currently read my $name; my $residues; $n=0; # sequence number of first block $k=0; # sequence index to zero for first block while ($line = ) { # print($namefieldlen.$line); $line=~tr/\r//d; if ($line=~/CLUSTAL/i) {next;} if ($line=~/^\#/) {next;} # skip commentary and blank line if ($line=~/^\/\//) {last;} # reached end of file if ($line=~/^\s*$/){ # new sequence block starts if ($k) { if ($n && $n!=$k) {die("\nError: different number of sequences in blocks 1 and $block of $infile\n");} $block++; $n=$k; $k=0; # set sequence index to zero for next block to read } next; } if ($line!~/^(\S+)\s+([ a-zA-Z0-9.-]+?)(\s+\d+)?$/) { if ($line=~/^[*.: ]*$/) {next;} if ($noss && ($line=~/^aa_/ || $line=~/^ss_/ || $line=~/^sa_/)) {next;} # do not read in >ss_ and >aa_ sequences chomp($line); if ($line!~/^(\S{1,20})([a-zA-Z0-9.-]{$residues_per_line})(\s+\d+)?$/) { die ("\nError found in Clustal format in $infile, line $.: '$line'\n"); } $name=$1; $residues=$2; print("WARNING: Found no space between name and residues in $infile, line $.: '$line'\n"); } else { if ($noss && ($line=~/^aa_/ || $line=~/^ss_/ || $line=~/^sa_/)) {next;} # do not read in >ss_ and >aa_ sequences if ($line=~/^aa_/ || $line=~/^sa_/) {next;} # do not read in >ss_ and >aa_ sequences if ($line=~/^ss_/) { # if ($line=~/^ss_conf/) {next;} # comment out to read sequence with confidence values # if ($nss>=0) {next;} # comment out: allow for two or more >ss_dssp and >ss_pred lines $nss=$n; } $line=~/^(\S+)\s+([ a-zA-Z0-9.-]+?)(\s+\d+)?$/; $name=$1; $residues=$2; $residues=~tr/ //d; $residues_per_line=length($residues); } if ($block==1) { $names[$k]=$name; $seqs[$k]=$residues; } else { $seqs[$k].=$residues; if ($names[$k] ne $name) { print("WARNING: name of sequence $k in block 1 ($names[$k]) is not the same as in block $block ($name) in $infile\n"); } } # printf("%3i %3i %-16.16s %s\n",$block,$k,$names[$k],$seqs[$k]); $k++; } if ($k && $n && $n!=$k) {die("\nError: different number of sequences in blocks 1 and $block of $infile\n");} if (!$n) {$n=$k;} } # Read psi format elsif ($informat eq "psi") { my $block=1; # number of block currently read my $name; my $residues; $n=0; # sequence number of first block $k=0; # sequence index to zero for first block while ($line = ) { # print($namefieldlen.$line); $line=~tr/\r//d; if ($line=~/^\s*$/){ # new sequence block starts if ($k) { if ($n && $n!=$k) {die("\nError: different number of sequences in blocks 1 and $block of $infile\n");} $block++; $n=$k; $k=0; # set sequence index to zero for next block to read } next; } if ($noss && ($line=~/^aa_/ || $line=~/^ss_/ || $line=~/^sa_/)) {next;} # do not read in >ss_ and >aa_ sequences if ($line=~/^aa_/ || $line=~/^sa_/) {next;} # do not read in >ss_ and >aa_ sequences if ($line=~/^ss_/) { # if ($line=~/^ss_conf/) {next;} # comment out to read sequence with confidence values # if ($nss>=0) {next;} # comment out: allow for two or more >ss_dssp and >ss_pred lines $nss=$n; } $line=~/^(\S+)\s+([ a-zA-Z0-9.-]+?)(\s+\d+)?$/; $name=$1; $residues=$2; $residues=~tr/ //d; if ($block==1) { $names[$k]=$name; $seqs[$k]=$residues; } else { $seqs[$k].=$residues; if ($names[$k] ne $name) { print("WARNING: name of sequence $k in block 1 ($names[$k]) is not the same as in block $block ($name) in $infile\n"); } } # printf("%3i %3i %-16.16s %s\n",$block,$k,$names[$k],$seqs[$k]); $k++; } if ($k && $n && $n!=$k) {die("\nError: different number of sequences in blocks 1 and $block of $infile\n");} if (!$n) {$n=$k;} } close INFILE; # Empty input file? if ($n==0) {die("\nERROR: input file $infile contains no sequences\n");} ################################################################################################ # Transforming to upper-case ################################################################################################ if ($informat ne "a3m" && $informat ne "a2m") { # Transform to upper case if input format is not A3M or A2M for ($k=0; $k<$n; $k++) {$seqs[$k]=~tr/a-z/A-Z/;} } ################################################################################################ # Removing non-alphanumeric symbols ################################################################################################ for ($k=0; $k<$n; $k++) { $seqs[$k]=~tr/A-Za-z0-9.~-//cd; $seqs[$k]=~tr/~/-/; } ################################################################################################ # Filling up with gaps '.' or deleting gaps ################################################################################################ # Insertion of '.' only needed for a3m if: NOT -r option OR -M first OR -M option if ($informat eq "a3m" && (!$remove_inserts || $matchmode)) { print("inserting gaps...\n"); my @len_ins; # $len_ins[$j] will count the maximum number of inserted residues after match state $i. my $j; # counts match states my @inserts; # $inserts[$j] contains the insert (in small case) of sequence $i after the $j'th match state my $insert; # Determine length of longest insert for ($k=0; $k<$n; $k++) { # split into list of single match states and variable-length inserts # ([A-Z]|-) is the split pattern. The parenthesis indicate that split patterns are to be included as list elements # The '#' symbol is prepended to get rid of a perl bug in split @inserts = split(/([A-Z]|-|~|[0-9])/,"#".$seqs[$k]."#"); $j=0; # printf("Sequence $k: $seqs[$k]\n"); # printf("Sequence $k: @inserts\n"); # Does sequence $k contain insert after match state j that is longer than $ngap[$j]? foreach $insert (@inserts) { if( !defined $len_ins[$j] || length($insert)>$len_ins[$j]) {$len_ins[$j]=length($insert);} $j++; # printf("$insert|"); } # printf("\n"); } my $ngap; # Fill up inserts with gaps '.' up to length $len_ins[$j] for ($k=0; $k<$n; $k++) { # split into list of single match states and variable-length inserts @inserts = split(/([A-Z]|-|~|[0-9])/,"#".$seqs[$k]."#"); $j=0; # append the missing number of gaps after each match state foreach $insert (@inserts) { for (my $l=length($insert); $l<$len_ins[$j]; $l++) {$insert.=".";} $j++; } $seqs[$k] = join("",@inserts); $seqs[$k] =~ tr/\#//d; # remove the '#' symbols inserted at the beginning and end } } ################################################################################################ # Match state assignment ################################################################################################ # Default match state rule for a3m is -M first if ($matchmode eq "" && ($outformat eq "a3m" || $outformat eq "a2m")) {$matchmode="first";} # Use gap rule for match state assignment? if ($matchmode eq "gaprule") { my @gaps=(); my $residues; my @residues; # Determine number of gaps per column for ($k=0; $k<$n; $k++) { @residues=unpack("C*",$seqs[$k]); for (my $l=0; $l<@residues; $l++) { if ($residues[$l]==46 || $residues[$l]==45) { if (defined $gaps[$l]) {$gaps[$l]++;} else {$gaps[$l]=1;} } } } # Set columns with more gaps than $match_gaprule to lower case, for ($k=0; $k<$n; $k++) { @residues=unpack("C*",$seqs[$k]); $residues=""; for (my $l=0; $l<@residues; $l++) { if (!defined $gaps[$l] || $gaps[$l]<0.01*$match_gaprule*$n) { if ($residues[$l]==46) { $residues .= "-"; } else { $residues .= uc(chr($residues[$l])); } } else { if ($residues[$l]==45) { $residues .= "."; } else { $residues .= lc(chr($residues[$l])); } } $seqs[$k]=$residues; } } } # Use first sequence for match state assignment? if ($matchmode eq "first") { my @match=(); my $residues; my @residues; # Determine which columns have a gap in first sequence for ($k=0; $k=2) {print("Sequence contains only gaps and is removed: $names[$k]\n");} splice(@seqs,$k,1); splice(@names,$k,1); $k--; $n--; } } # Cut down sequence names to $desclen characters maximum for ($k=0; $k<$n; $k++) {$names[$k]=substr($names[$k],0,$desclen);} if ($outformat eq "a3m") { # Remove all '.' gaps for ($k=0; $k<$n; $k++) {$seqs[$k]=~tr/.//d;} } elsif ($outformat eq "fas" || $outformat eq "clu" || $outformat eq "sto" || $outformat eq "psi" ) { # Substitute all '.' by '-' for ($k=0; $k<$n; $k++) {$seqs[$k]=~tr/./-/;} } if ($gap ne "default") { for ($k=0; $k<$n; $k++) {$seqs[$k]=~s/\./$gap/g; $seqs[$k]=~s/-/$gap/g;} } if ($case eq "uc") { for ($k=0; $k<$n; $k++) {$seqs[$k]=~tr/a-z/A-Z/;} } elsif ($case eq "lc") { for ($k=0; $k<$n; $k++) {$seqs[$k]=~tr/A-Z/a-z/;} } #################################################### # Check that sequences have same length #################################################### if ($outformat ne "a3m" && $outformat ne "ufas") { my $len=length($seqs[0]); for($k=1; $k<$n; $k++) { if (length($seqs[$k])!=$len) { printf("\nError: Sequences in $infile do not all have same length, e.g. >%-.20s (len=%i) and >%-.20s (len=%i)\n", $names[0],$len,$names[$k],length($seqs[$k])); if ($v>=3) { printf("%.20s %s\n%.20s %s\n\n",$names[0],$seqs[0],$names[$k],$seqs[$k]); } exit 1; } } } #################################################### # Remove html tags #################################################### for($k=0; $k<$n; $k++) { $names[$k]=~s/<[A-Za-z\/].*?>//g; # remove html tags } ################################################################################################ # Output part ################################################################################################ my $ndssp=-1; my $nsa=-1; my $npred=-1; my $nconf=-1; my $nquery=-1; for ($k=0; $k<$n; $k++) { if ($names[$k]=~/^ss_dssp/){$ndssp=$k; } elsif ($names[$k]=~/^sa_dssp/){$nsa=$k; } elsif ($names[$k]=~/^ss_pred/){$npred=$k; } elsif ($names[$k]=~/^ss_conf/){$nconf=$k; } elsif ($nquery==-1 && $names[$k]!~/^aa_/) {$nquery=$k;} } #Write sequences into output file open (OUTFILE, ">$outfile") or die ("cannot open $outfile:$!\n"); if ($outformat eq "sto" || $outformat eq "psi") { my $refline; if ($outformat eq "sto") { print(OUTFILE "# STOCKHOLM 1.0\n\n"); # Write reference annotation line for match states (-M first) if (!$lname) {$lname=32;} $names[$nquery]=~/^\S+\s+(.*)/; printf(OUTFILE "%-$lname.$lname"."s %s\n","#=GF DE",$1); $refline=$seqs[$nquery]; $refline=~s/[a-z]/-/g; printf(OUTFILE "%-$lname.$lname"."s %s\n","#=GC RF",$refline); if ($ndssp>=0) { printf(OUTFILE "%-32.32s %s\n","#=GC SS_cons",$seqs[$ndssp]); } } if ($num) { my $num=2; for ($k=0; $k<$n; $k++) { if ($k==$ndssp || $k==$npred || $k==$nconf || $k==$nquery) {next;} $names[$k]=~s/^(\S+)\#\d+/$1/; $names[$k]=~s/^(\S{1,25})\S+/$1\#$num/; $num++; } } for ($k=0; $k<$n; $k++) { if ($k==$ndssp || $k==$npred || $k==$nconf) {next;} $names[$k] =~ /\s*(\S+)/; if (!$lname) {$lname=32;} printf(OUTFILE "%-$lname.$lname"."s %s\n",$1,$seqs[$k]); } if ($outformat eq "sto") {print(OUTFILE "//\n");} } elsif ($outformat eq "clu") { printf(OUTFILE "CLUSTAL\n\n\n"); if ($num) { my $num=2; for ($k=0; $k<$n; $k++) { if ($k==$ndssp || $k==$npred || $k==$nconf || $k==$nquery) {next;} $names[$k]=~s/^(\S+)\#\d+/$1/; $names[$k]=~s/^(\S{1,10})\S*/$1\#$num/; $num++; } } while($seqs[0] ne "") { # While there are still residues left for ($k=0; $k%s\n%s\n",$names[$k],$seqs[$k]); } } close OUTFILE; if ($v>=2) { if ($nin==1) {print("Reformatted $infile with 1 sequence from $informat to $outformat and written to file $outfile\n");} else { if (!$nin==$n) {printf("Removed %i sequences which contained no residues\n",$nin-$n); } print("Reformatted $infile with $n sequences from $informat to $outformat and written to file $outfile\n"); } } return; } hhsuite-2.0.16/scripts/create_profile_from_hmmer.pl0000775172256617226630000001521612110430072025007 0ustar hauserscientific_computing#!/usr/bin/env perl # # create_profile_from_hmmer.pl # Create a profile (.prf) from a given HMMER/HMMER3 file # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Michael Remmert and Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; $|= 1; # Activate autoflushing on STDOUT # Default values: our $v=2; # verbose mode my $factor = 1; # mix orig sequence and HMMER profile with this factor (1 = 50/50, 2 = 33/66, 0.5 = 66/33 (orig/HMMER)) my $scale = 1000; my $log2 = log(2); my $help=" create_profile_from_hmmer.pl from HHsuite $VERSION Create a profile (.prf) from a given HMMER/HMMER3 file Usage: perl create_profile_from_hmmer.pl -i [-o ] Options: -i Input file in HMMER/HMMER3 format -o Output file in prf-format (default: infile.prf) -v [0-5] verbose mode (default: $v) \n"; # Variable declarations my $line; my $infile; my $outfile; my $i; my $a; my @counts; # count profile (normalised to 1) my $name; # name of HMMER profile my $len; # length of HMMER profile my @hmmer_prof; # HMMER profile # A C D E F G H I K L M N P Q R S T V W Y my @hmmeraa2csaa = ( 0, 4, 3, 6, 13, 7, 8, 9, 11, 10, 12, 2, 14, 5, 1, 15, 16, 19, 17, 18); my @aminoacids = ('A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V'); my %aa2i; for ($a = 0; $a < 20; $a++) { $aa2i{$aminoacids[$a]} = $a; } ############################################################################################### # Processing command line input ############################################################################################### if (@ARGV<1) {die ($help);} my $options=""; for (my $i=0; $i<@ARGV; $i++) {$options.=" $ARGV[$i] ";} if ($options=~s/ -i\s+(\S+) //) {$infile=$1;} if ($options=~s/ -o\s+(\S+) //) {$outfile=$1;} if ($options=~s/ -factor\s+(\S+) //) {$factor=$1;} if ($options=~s/ -v\s+(\S+) //) {$v=$1;} if (!$infile) {print($help); print "ERROR! No input file!\n"; exit(1);} if (!$outfile) { $infile =~ /^(\S+)\.\S+?$/; $outfile = "$1.prf"; } ############################################################################################## # Main part ############################################################################################## ###################################### # Read HMMER sequence and profile ###################################### open (IN, $infile); $line = ; if ($line =~ /^HMMER3/) { while ($line = ) { if ($line =~ /^NAME\s+(\S+)/) { $name = $1; } elsif ($line =~ /^LENG\s+(\d+)/) { $len = $1; } elsif ($line =~ /^HMM/) { last; } } $line = ; $line = ; # Skip header lines if ($line =~ /^\s*COMPO/) { $line = ; $line = ; # Skip null model lines } # Read profiles and query seq $i = 0; while ($line = ) { if ($line =~ /^\/\//) { last; } $line =~ s/^\s*\d+//; # sequence position for ($a = 0; $a < 20; $a++) { $line =~ s/^\s*(\S+)\s/ /; $hmmer_prof[$i][$hmmeraa2csaa[$a]] = exp(-1.0*$1); } # Read query char in count profile for ($a = 0; $a < 20; $a++) { $counts[$i][$a] = 0; } $line =~ /^\s*\d+\s+(\S)/; $counts[$i][$aa2i{$1}] = 1; $line = ; $line = ; $i++; } } elsif ($line =~ /^HMMER/) { my @pb; while ($line = ) { if ($line =~ /^NAME\s+(\S+)/) { $name = $1; } elsif ($line =~ /^LENG\s+(\d+)/) { $len = $1; } elsif ($line =~ /^NULE/) { $line =~ s/^NULE//; # sequence position for ($a = 0; $a < 20; $a++) { $line =~ s/^\s*(\S+)\s/ /; # pb[a] = (float) 0.05 * fpow2(float(ptr)/HMMSCALE); $pb[$a] = 0.05 * (2**($1/1000)); } } elsif ($line =~ /^HMM/) { last; } } $line = ; $line = ; # Skip header lines # Read profiles and query seq $i = 0; while ($line = ) { if ($line =~ /^\/\//) { last; } $line =~ s/^\s*\d+//; # sequence position for ($a = 0; $a < 20; $a++) { $line =~ s/^\s*(\S+)\s/ /; # prob = pb[a]*fpow2(float(ptr)/HMMSCALE); $hmmer_prof[$i][$hmmeraa2csaa[$a]] = $pb[$a] * (2**($1/1000)); } # Read query char in count profile $line = ; for ($a = 0; $a < 20; $a++) { $counts[$i][$a] = 0; } $line =~ /^\s*(\S)/; $counts[$i][$aa2i{$1}] = 1; $line = ; $i++; } } else { print($help); print "ERROR! Unknown input format!\n"; exit(1); } ###################################### # build count_profile (mix orig sequence and HMMER-profile) ###################################### for ($i = 0; $i < $len; $i++) { my $sum = 0; for ($a = 0; $a < 20; $a++) { $counts[$i][$a] += $factor * $hmmer_prof[$i][$a]; $sum += $counts[$i][$a]; } # Normalize to one my $fac = 1 / $sum; for ($a = 0; $a < 20; $a++) { $counts[$i][$a] *= $fac; } } ###################################### # write count_profile ###################################### open (OUT, ">$outfile"); # Write header printf(OUT "CountProfile\n"); printf(OUT "NAME\t%s\n", $name); printf(OUT "LENG\t%i\n", $len); printf(OUT "ALPH\t20\n"); # 20 amino acid alphabet printf(OUT "COUNTS"); for ($a = 0; $a < 20; $a++) { printf(OUT "\t%s", $aminoacids[$a]); } printf(OUT "\tNEFF\n"); # Write profile for ($i = 0; $i < $len; $i++) { printf(OUT "%i", $i+1); for ($a = 0; $a < 20; $a++) { if ($counts[$i][$a] == 0) { printf(OUT "\t*"); } else { printf(OUT "\t%i", int(-(log2($counts[$i][$a]) * $scale)+0.5)); } } printf(OUT "\t%i\n", 1 * $scale); # set Neff to 1 } printf(OUT "//\n"); close OUT; exit; sub log2() { my $n = shift; return (log($n)/$log2); } hhsuite-2.0.16/scripts/Align.pm0000775172256617226630000005633612110430072020654 0ustar hauserscientific_computing# Package Align.pl # (c) Johannes Soeding, 2006 # Perl functions for Smith-Waterman and Needleman-Wunsch sequence alignment # HHsuite version 2.0 # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Johannes Soeding and Michael Remmert, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de ############################################################################# # Subroutine AlignSW # Smith-Waterman local alignment # usage: # 1. Use global variables of package Align.pm: # $score = &AlignSW(); # printf(" XSEQ: $Align::xseq\n"); # printf(" MATCH: $Align::Sstr\n"); # printf(" YSEQ: $Align::yseq\n"); # etc. # # 2. Use references and/or global variables # $score = &AlignSW(\$xseq,\$yseq); # $score = &AlignNW(\$xseq,\$yseq,\@i,\@j,\$imin,\$imax,\$jmin,\$jmax,\$Sstr,\@S); # printf(" XSEQ: $xseq\n"); # printf(" MATCH: $Sstr\n"); # printf(" YSEQ: $yseq\n"); # # Input: $xseq, $yseq : sequences x and y as strings # Param: $main::d : gap opening penalty # $main::e : gap extension penalty # Output: return value : bit score # $xseq, $yseq : aligned residues of x and y (with - as gap) # @i : $i[$col],$j[$col] are aligned residues in column $col # @j : (first is 1 (NOT 0!), 0 means gap) # $imin : first aligned residue of sequence x # $imax : last aligned residue of sequence x # $jmin : first aligned residue of sequence y # $jmax : last aligned residue of sequence y # $Sstr : string belonging to $xseq and $yseq showing quality of alignment # $S[$col] : match score for aligning positions $i[$col] and $j[$col] ############################################################################# ############################################################################# # Subroutine AlignNW # Needleman-Wunsch global alignment # usage: $score = &AlignNW(); # $score = &AlignNW(\$xseq,\$yseq); # $score = &AlignNW(\$xseq,\$yseq,\@i,\@j); # $score = &AlignNW(\$xseq,\$yseq,\@i,\@j,\$imin,\$imax,\$jmin,\$jmax,\$Sstr,\@S); # # Input: $xseq, $yseq : sequences x and y as strings # Param: $main::d : gap opening penalty # $main::e : gap extension penalty # $main::g : end gap penalty # Output: return value : bit score # $xseq, $yseq : aligned residues of x and y (with - as gap) # @i : $i[$col],$j[$col] are aligned residues in column $col # @j : (first is 1 (NOT 0!), 0 means gap) # $imin : first aligned residue of sequence x # $imax : last aligned residue of sequence x # $jmin : first aligned residue of sequence y # $jmax : last aligned residue of sequence y # $Sstr : string belonging to $xseq and $yseq showing quality of alingment # $S[$col] : match score for aligning positions $i[$col] and $j[$col] ############################################################################# package Align; use strict; use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&AlignSW &AlignNW $matrix); our $xseq; # first sequence our $yseq; # second sequence our $ri; # reference to input array: $i[$col] -> $ri->[$col] our $rj; # reference to input array: $j[$col] -> $rj->[$col] our $imin; # first aligned residue of sequence x our $imax; # last aligned residue of sequence x our $jmax; # first aligned residue of sequence y our $jmin; # last aligned residue of sequence y our $Sstr; # $Sstr annotates the match quality our $rS; # reference $rS->[$col] -> $S[$col] = match score for aligning positions $i[$col] and $j[$col] our $matrix; my $firstcall=1; my @Sab; # Substitution matrix in bit # A B C D E F G H I J K L M N O P Q R S T U V W X Y Z my @ch2i=( 0, 3, 4, 3, 6,13, 7, 8, 9,20,11,10,12, 2,20,14, 5, 1,15,16, 4,19,17,20,18, 6); my @Gonnet = ( # A R N D C Q E G H I L K M F P S T W Y V X # The Gonnet matrix is in units of 10*log10() [ 2.4,-0.6,-0.3,-0.3, 0.5,-0.2, 0.0, 0.5,-0.8,-0.8,-1.2,-0.4,-0.7,-2.3, 0.3, 1.1, 0.6,-3.6,-2.2, 0.1,-1.0,-9.9], # A [-0.6, 4.7, 0.3,-0.3,-2.2, 1.5, 0.4,-1.0, 0.6,-2.4,-2.2, 2.7,-1.7,-3.2,-0.9,-0.2,-0.2,-1.6,-1.8,-2.0,-1.0,-9.9], # R [-0.3, 0.3, 3.8, 2.2,-1.8, 0.7, 0.9, 0.4, 1.2,-2.8,-3.0, 0.8,-2.2,-3.1,-0.9, 0.9, 0.5,-3.6,-1.4,-2.2,-1.0,-9.9], # N [-0.3,-0.3, 2.2, 4.7,-3.2, 0.9, 2.7, 0.1, 0.4,-3.8,-4.0, 0.5,-3.0,-4.5,-0.7, 0.5, 0.0,-5.2,-2.8,-2.9,-1.0,-9.9], # D [ 0.5,-2.2,-1.8,-3.2,11.5,-2.4,-3.0,-2.0,-1.3,-1.1,-1.5,-2.8,-0.9,-0.8,-3.1, 0.1,-0.5,-1.0,-0.5, 0.0,-1.0,-9.9], # C [-0.2, 1.5, 0.7, 0.9,-2.4, 2.7, 1.7,-1.0, 1.2,-1.9,-1.6, 1.5,-1.0,-2.6,-0.2, 0.2, 0.0,-2.7,-1.7,-1.5,-1.0,-9.9], # Q [ 0.0, 0.4, 0.9, 2.7,-3.0, 1.7, 3.6,-0.8, 0.4,-2.7,-2.8, 1.2,-2.0,-3.9,-0.5, 0.2,-0.1,-4.3,-2.7,-1.9,-1.0,-9.9], # E [ 0.5,-1.0, 0.4, 0.1,-2.0,-1.0,-0.8, 6.6,-1.4,-4.5,-4.4,-1.1,-3.5,-5.2,-1.6, 0.4,-1.1,-4.0,-4.0,-3.3,-1.0,-9.9], # G [-0.8, 0.6, 1.2, 0.4,-1.3, 1.2, 0.4,-1.4, 6.0,-2.2,-1.9, 0.6,-1.3,-0.1,-1.1,-0.2,-0.3,-0.8,-2.2,-2.0,-1.0,-9.9], # H [-0.8,-2.4,-2.8,-3.8,-1.1,-1.9,-2.7,-4.5,-2.2, 4.0, 2.8,-2.1, 2.5, 1.0,-2.6,-1.8,-0.6,-1.8,-0.7, 3.1,-1.0,-9.9], # I [-1.2,-2.2,-3.0,-4.0,-1.5,-1.6,-2.8,-4.4,-1.9, 2.8, 4.0,-2.1, 2.8, 2.0,-2.3,-2.1,-1.3,-0.7, 0.0, 1.8,-1.0,-9.9], # L [-0.4, 2.7, 0.8, 0.5,-2.8, 1.5, 1.2,-1.1, 0.6,-2.1,-2.1, 3.2,-1.4,-3.3,-0.6, 0.1, 0.1,-3.5,-2.1,-1.7,-1.0,-9.9], # K [-0.7,-1.7,-2.2,-3.0,-0.9,-1.0,-2.0,-3.5,-1.3, 2.5, 2.8,-1.4, 4.3, 1.6,-2.4,-1.4,-0.6,-1.0,-0.2, 1.6,-1.0,-9.9], # M [-2.3,-3.2,-3.1,-4.5,-0.8,-2.6,-3.9,-5.2,-0.1, 1.0, 2.0,-3.3, 1.6, 7.0,-3.8,-2.8,-2.2, 3.6, 5.1, 0.1,-1.0,-9.9], # F [ 0.3,-0.9,-0.9,-0.7,-3.1,-0.2,-0.5,-1.6,-1.1,-2.6,-2.3,-0.6,-2.4,-3.8, 7.6, 0.4, 0.1,-5.0,-3.1,-1.8,-1.0,-9.9], # P [ 1.1,-0.2, 0.9, 0.5, 0.1, 0.2, 0.2, 0.4,-0.2,-1.8,-2.1, 0.1,-1.4,-2.8, 0.4, 2.2, 1.5,-3.3,-1.9,-1.0,-1.0,-9.9], # S [ 0.6,-0.2, 0.5, 0.0,-0.5, 0.0,-0.1,-1.1,-0.3,-0.6,-1.3, 0.1,-0.6,-2.2, 0.1, 1.5, 2.5,-3.5,-1.9, 0.0,-1.0,-9.9], # T [-3.6,-1.6,-3.6,-5.2,-1.0,-2.7,-4.3,-4.0,-0.8,-1.8,-0.7,-3.5,-1.0, 3.6,-5.0,-3.3,-3.5,14.2, 4.1,-2.6,-1.0,-9.9], # W [-2.2,-1.8,-1.4,-2.8,-0.5,-1.7,-2.7,-4.0,-2.2,-0.7, 0.0,-2.1,-0.2, 5.1,-3.1,-1.9,-1.9, 4.1, 7.8,-1.1,-1.0,-9.9], # Y [ 0.1,-2.0,-2.2,-2.9, 0.0,-1.5,-1.9,-3.3,-2.0, 3.1, 1.8,-1.7, 1.6, 0.1,-1.8,-1.0, 0.0,-2.6,-1.1, 3.4,-1.0,-9.9], # V [-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,+1.0,-9.9], # X [-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9,-9.9] # ~ ); # A R N D C Q E G H I L K M F P S T W Y V X my @BLOSUM62 = ( [ 4,-1,-2,-2, 0,-1,-1, 0,-2,-1,-1,-1,-1,-2,-1, 1, 0,-3,-2, 0, 0,-9], [-1, 5, 0,-2,-3, 1, 0,-2, 0,-3,-2, 2,-1,-3,-2,-1,-1,-3,-2,-3,-1,-9], [-2, 0, 6, 1,-3, 0, 0, 0, 1,-3,-3, 0,-2,-3,-2, 1, 0,-4,-2,-3,-1,-9], [-2,-2, 1, 6,-3, 0, 2,-1,-1,-3,-4,-1,-3,-3,-1, 0,-1,-4,-3,-3,-1,-9], [ 0,-3,-3,-3, 9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-2,-9], [-1, 1, 0, 0,-3, 5, 2,-2, 0,-3,-2, 1, 0,-3,-1, 0,-1,-2,-1,-2,-1,-9], [-1, 0, 0, 2,-4, 2, 5,-2, 0,-3,-3, 1,-2,-3,-1, 0,-1,-3,-2,-2,-1,-9], [ 0,-2, 0,-1,-3,-2,-2, 6,-2,-4,-4,-2,-3,-3,-2, 0,-2,-2,-3,-3,-1,-9], [-2, 0, 1,-1,-3, 0, 0,-2, 8,-3,-3,-1,-2,-1,-2,-1,-2,-2, 2,-3,-1,-9], [-1,-3,-3,-3,-1,-3,-3,-4,-3, 4, 2,-3, 1, 0,-3,-2,-1,-3,-1, 3,-1,-9], [-1,-2,-3,-4,-1,-2,-3,-4,-3, 2, 4,-2, 2, 0,-3,-2,-1,-2,-1, 1,-1,-9], [-1, 2, 0,-1,-3, 1, 1,-2,-1,-3,-2, 5,-1,-3,-1, 0,-1,-3,-2,-2,-1,-9], [-1,-1,-2,-3,-1, 0,-2,-3,-2, 1, 2,-1, 5, 0,-2,-1,-1,-1,-1, 1,-1,-9], [-2,-3,-3,-3,-2,-3,-3,-3,-1, 0, 0,-3, 0, 6,-4,-2,-2, 1, 3,-1,-1,-9], [-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4, 7,-1,-1,-4,-3,-2,-2,-9], [ 1,-1, 1, 0,-1, 0, 0, 0,-1,-2,-2, 0,-1,-2,-1, 4, 1,-3,-2,-2, 0,-9], [ 0,-1, 0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1, 1, 5,-2,-2, 0, 0,-9], [-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1, 1,-4,-3,-2,11, 2,-3,-2,-9], [-2,-2,-2,-3,-2,-1,-2,-3, 2,-1,-1,-2,-1, 3,-3,-2,-2, 2, 7,-1,-1,-9], [ 0,-3,-3,-3,-1,-2,-2,-3,-3, 3, 1,-2, 1,-1,-2,-2, 0,-3,-1, 4,-1,-9], [ 0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2, 0, 0,-2,-1,-1,+1,-9], [-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9] ); # print("Substitution matrix:\n"); # for ($a=0; $a<=20; $a++) { # for ($b=0; $b<=20; $b++) { # printf("%6.1f ",$Sab[$a][$b]); # } # printf("\n"); # } # Set substitution matrix in bits (do only at first call of one of the alignment routines) sub SetSubstitutionMatrix { if ($firstcall) { # Transform to bits; if (defined($matrix) && $matrix eq "Gonnet") { for (my $a=0; $a<=20; ++$a) { for (my $b=0; $b<=20; ++$b) { $Sab[$a][$b] = $Gonnet[$a][$b]*0.3322; # 1*log(10)/log(2); } } } elsif (defined($matrix) && $matrix eq "Blosum62") { {printf("Using Blosum62 matrix...\n");} for (my $a=0; $a<=20; $a++) { for (my $b=0; $b<=20; $b++) { $Sab[$a][$b] = $BLOSUM62[$a][$b]; } } } else { for (my $a=0; $a<20; ++$a) { for (my $b=0; $b<20; ++$b) { $Sab[$a][$b] = -1; } $Sab[$a][$a] = 2; } for (my $b=0; $b<=20; ++$b) { $Sab[20][$b] = $Sab[$b][20] = 0; $Sab[21][$b] = $Sab[$b][21] = -10; } $Sab[20][20] = $Sab[20][20] = +1;# if in doubt, match X with X } $firstcall=0; } } # maxbt(val1,...,valx,\$bt) finds maximum of values and puts index of maximum into $bt sub maxbt { my $rbt=pop @_; # last element of @_ is address of $bt my $max = shift; my $i=0; $$rbt = 0; foreach $_ (@_) { $i++; if ($_>$max) {$max=$_; $$rbt=$i;} } return $max; } # max3bt(val1,val2,val3,\$bt) finds maximum of values and puts index of maximum into $bt sub max3bt { if ($_[1] < $_[0]) { if ($_[2] < $_[0]) { ${$_[3]}=0; return $_[0]; } else { ${$_[3]}=2; return $_[2]; } } else { if ($_[2] < $_[1]) { ${$_[3]}=1; return $_[1]; } else { ${$_[3]}=2; return $_[2]; } } } # max2bt(val1,val2,\$bt) finds maximum of values and puts index of maximum into $bt sub max2bt { if ($_[1] < $_[0]) { ${$_[2]}=0; return $_[0]; } else { ${$_[2]}=1; return $_[1]; } } ############################################################################# # Subroutien AlignSW # Smith-Waterman local alignment ############################################################################# sub AlignSW { if (@_>=1) {$xseq=$_[0];} if (@_>=2) {$yseq=$_[1];} if (@_>=3) {$ri=$_[2];} if (@_>=4) {$rj=$_[3];} if (@_>=5) {$imin=$_[4];} if (@_>=6) {$imax=$_[5];} if (@_>=7) {$jmin=$_[6];} if (@_>=8) {$jmax=$_[7];} if (@_>=9) {$Sstr=$_[8];} if (@_>=10) {$rS=$_[9];} if (length($$xseq)<1) {warn ("ERROR in Align.pm: sequence x is empty\n"); return 0;} if (length($$yseq)<1) {warn ("ERROR in Align.pm: sequence x is empty\n"); return 0;} my @xchr; # ASCII characters of $xseq my @ychr; # ASCII characters of $yseq my @xres; # internal integer representation of residues of x my @yres; # internal integer representation of residues of y $$xseq =~ s/\s//g; $$yseq =~ s/\s//g; @xchr = split(//,$$xseq); @ychr = split(//,$$yseq); my $Lx=@xchr; # length of sequence x my $Ly=@ychr; # length of sequence y my @M; # $M[a][b] = score of best alignment of x[1..a] and y[1..b] ending in match state my @A; # $A[a][b] = score of best alignment of x[1..a] and y[1..b] ending in gap in x my @B; # $B[a][b] = score of best alignment of x[1..a] and y[1..b] ending in gap in y my @Mbt; # $Mbt[a][b] = 0:STOP 1:M 2:A 3:B my @Abt; # $Abt[a][b] = 0:A 1:M my @Bbt; # $Bbt[a][b] = 0:B 1:M my $score; # bit score of alignment my $bt; # backtracing variable set by &maxbt: which argument was largest? (first=0) my $state; # STOP:0 M:1 A:2 B:3 my ($i, $j); # indices for sequence x and y, respectively my $dx = $main::dx; my $dy = $main::dy; if (! defined $dx) {$dx = $main::d;} if (! defined $dy) {$dy = $main::d;} # Transform @xres and @yres to integer for ($i=0; $i<@xchr; $i++) { my $a=ord(uc($xchr[$i])); if ($a<65 || $a>90) { if ($a!=ord(".") && $a!=ord("-") && $a!=ord("~")) { printf(STDERR "\nWARNING: invalid symbol '%s' in pos $i of first sequence to be aligned\n",$xchr[$i]); } $xres[$i]=21; } else { $xres[$i]=$ch2i[$a-65]; } } for ($j=0; $j<@ychr; $j++) { my $a=ord(uc($ychr[$j])); if ($a<65 || $a>90) { if ($a!=ord(".") && $a!=ord("-") && $a!=ord("~")) { printf(STDERR "\nWARNING: invalid symbol '%s' in pos $j of second sequence to be aligned\n",$ychr[$j]); } $yres[$j]=21; } else { $yres[$j]=$ch2i[$a-65]; } } unshift (@xres,21); unshift (@xchr," "); # insert dummy 0'th element unshift (@yres,21); unshift (@ychr," "); # insert dummy 0'th element &SetSubstitutionMatrix; # Initialization for ($i=0; $i<=$Lx; $i++) { $M[$i][0]=-999; $A[$i][0]=-999; $B[$i][0]=-999; } for ($j=1; $j<=$Ly; $j++) { $M[0][$j]=-999; $A[0][$j]=-999; $B[0][$j]=-999; } # Iteration for ($i=1; $i<=$Lx; ++$i) { my $Mi =$M[$i]; my $Mi1=$M[$i-1]; my $Ai =$A[$i]; my $Ai1=$A[$i-1]; my $Bi =$B[$i]; my $Bi1=$B[$i-1]; my $Sabx=$Sab[$xres[$i]]; my $j1=0; for ($j=1; $j<=$Ly; ++$j, ++$j1) { ${$Mi}[$j] = max3bt(${$Mi1}[$j1], ${$Ai1}[$j1], ${$Bi1}[$j1], \$Mbt[$i][$j]) + ${$Sabx}[$yres[$j]]; ${$Ai}[$j] = max2bt(${$Ai}[$j1]-$main::e, ${$Mi}[$j1]-$dx, \$Abt[$i][$j]); ${$Bi}[$j] = max2bt(${$Bi1}[$j]-$main::e, ${$Mi1}[$j]-$dy, \$Bbt[$i][$j]); } } # Finding maximum $score = -1000; for ($i=1; $i<=$Lx; $i++) { my $Mi =$M[$i]; for ($j=1; $j<=$Ly; $j++) { if (${$Mi}[$j]>$score) {$score=${$Mi}[$j]; $$imax=$i; $$jmax=$j;} } } # Backtracing @$ri=(); @$rj=(); @$rS=(); $state=1; # last state is M $i=$$imax; $j=$$jmax; $$xseq=""; $$yseq=""; while ($state) { if ($state==1) { # current state is M (match-match) unshift(@$ri,$i); unshift(@$rj,$j); $state = $Mbt[$i][$j]; $$xseq=$xchr[$i].$$xseq; $$yseq=$ychr[$j].$$yseq; unshift(@$rS, $Sab[$xres[$i]][$yres[$j]]); $$imin=$i; $$jmin=$j; $i--; $j--; } elsif ($state==2) { # current state is A (gap in x) unshift(@$ri,0); unshift(@$rj,$j); $$xseq="-".$$xseq; $$yseq=$ychr[$j].$$yseq; $bt = $Abt[$i][$j--]; if ($bt) { # previous state was M unshift(@$rS,-$dx); $state = 1; } else { # previous state was A unshift(@$rS,-$main::e); } } else { # current state is B (gap in y) unshift(@$ri,$i); unshift(@$rj,0); $$xseq=$xchr[$i].$$xseq; $$yseq="-".$$yseq; $bt = $Bbt[$i--][$j]; if ($bt) { # previous state was M unshift(@$rS,-$dy); $state = 1; } else { # previous state was B unshift(@$rS,-$main::e); } } } # Set annotation string representing match quality $$Sstr=""; for (my $col=0; $col<@$ri; $col++) { if ($xres[$ri->[$col]] eq $yres[$rj->[$col]]) { $$Sstr.=uc($xchr[$ri->[$col]]); } elsif ($rS->[$col] > 0 ) { $$Sstr.="+"; } else { $$Sstr.="."; } } return $score; } ############################################################################# # Subroutien AlignNW # Needleman-Wunsch global alignment ############################################################################# sub AlignNW { if (@_>=1) {$xseq=$_[0];} if (@_>=2) {$yseq=$_[1];} if (@_>=3) {$ri=$_[2];} if (@_>=4) {$rj=$_[3];} if (@_>=5) {$imin=$_[4];} if (@_>=6) {$imax=$_[5];} if (@_>=7) {$jmin=$_[6];} if (@_>=8) {$jmax=$_[7];} if (@_>=9) {$Sstr=$_[8];} if (@_>=10) {$rS=$_[9];} if (length($$xseq)<1) {warn ("ERROR in Align.pm: sequence x is empty\n"); return 0;} if (length($$yseq)<1) {warn ("ERROR in Align.pm: sequence x is empty\n"); return 0;} my @xchr; # ASCII characters of $xseq my @ychr; # ASCII characters of $yseq my @xres; # internal integer representation of residues of x my @yres; # internal integer representation of residues of y $$xseq =~ s/\s//g; $$yseq =~ s/\s//g; @xchr = split(//,$$xseq); @ychr = split(//,$$yseq); my $Lx=@xchr; # length of sequence x my $Ly=@ychr; # length of sequence y my @M; # $M[a][b] = score of best alignment of x[1..a] and y[1..b] ending in match state my @A; # $A[a][b] = score of best alignment of x[1..a] and y[1..b] ending in gap in x my @B; # $B[a][b] = score of best alignment of x[1..a] and y[1..b] ending in gap in y my @Mbt; # $Mbt[a][b] = 0:STOP 1:M 2:A 3:B my @Abt; # $Abt[a][b] = 0:A 1:M my @Bbt; # $Bbt[a][b] = 0:B 1:M my $score; # bit score of alignment my $bt; # backtracing variable set by &maxbt: which argument was largest? (first=0) my $state; # STOP:0 M:1 A:2 B:3 my ($i, $j); # indices for sequence x and y, respectively my $dx = $main::dx; my $dy = $main::dy; if (! defined $dx) {$dx = $main::d;} if (! defined $dy) {$dy = $main::d;} printf("dx=%f dy=%f\n",$dx,$dy); ##############DEBUG############# # Transform @xres and @yres to integer for ($i=0; $i<@xchr; $i++) { my $a=ord(uc($xchr[$i])); if ($a<65 || $a>90) { if ($a!=ord(".") && $a!=ord("-") && $a!=ord("~")) { printf(STDERR "\nWARNING: invalid symbol '%s' in pos $i of first sequence to be aligned\n",$xchr[$i]); } $xres[$i]=21; } else { $xres[$i]=$ch2i[$a-65]; } } for ($j=0; $j<@ychr; $j++) { my $a=ord(uc($ychr[$j])); if ($a<65 || $a>90) { if ($a!=ord(".") && $a!=ord("-") && $a!=ord("~")) { printf(STDERR "\nWARNING: invalid symbol '%s' in pos $j of second sequence to be aligned\n",$ychr[$j]); } $yres[$j]=21; } else { $yres[$j]=$ch2i[$a-65]; } } unshift (@xres,21); unshift (@xchr," "); # insert dummy 0'th element unshift (@yres,21); unshift (@ychr," "); # insert dummy 0'th element &SetSubstitutionMatrix; # Initialization $M[0][0]=$A[0][0]=$B[0][0]=0; for ($i=1; $i<=$Lx; $i++) { $M[$i][0] = -999; $A[$i][0] = -999; $B[$i][0] = -$i*$main::g; $Bbt[$i][0] = 0; # previous state was B as well (gap in y) } for ($j=1; $j<=$Ly; $j++) { $M[0][$j] = -999; $A[0][$j] = -$j*$main::g; $B[0][$j] = -999; $Abt[0][$j] = 0; # previous state was A as well (gap in x) } # Iteration for ($i=1; $i<=$Lx; ++$i) { my $Mi =$M[$i]; my $Mi1=$M[$i-1]; my $Ai =$A[$i]; my $Ai1=$A[$i-1]; my $Bi =$B[$i]; my $Bi1=$B[$i-1]; my $Sabx=$Sab[$xres[$i]]; my $j1=0; for ($j=1; $j<=$Ly; ++$j, ++$j1) { ${$Mi}[$j] = max3bt(${$Mi1}[$j1], ${$Ai1}[$j1], ${$Bi1}[$j1], \$Mbt[$i][$j]) + ${$Sabx}[$yres[$j]]; ${$Ai}[$j] = max2bt(${$Ai}[$j1]-$main::e, ${$Mi}[$j1]-$dx, \$Abt[$i][$j]); ${$Bi}[$j] = max2bt(${$Bi1}[$j]-$main::e, ${$Mi1}[$j]-$dy, \$Bbt[$i][$j]); } } # Finding maximum $score = -1000; for ($i=1; $i<=$Lx; $i++) { my $endgappenalty = ($Lx-$i)*$main::g; if ($M[$i][$Ly]-$endgappenalty > $score) { $score=$M[$i][$Ly]-$endgappenalty; $$imax=$i; $$jmax=$Ly; $state = 1; } if ($A[$i][$Ly]-$endgappenalty > $score) { $score=$A[$i][$Ly]-$endgappenalty; $$imax=$i; $$jmax=$Ly; $state = 2; } if ($B[$i][$Ly]-$endgappenalty > $score) { $score=$B[$i][$Ly]-$endgappenalty; $$imax=$i; $$jmax=$Ly; $state = 3; } } for ($j=1; $j<$Ly; $j++) { my $endgappenalty = ($Ly-$j)*$main::g; if ($M[$Lx][$j]-$endgappenalty > $score) { $score=$M[$Lx][$j]-$endgappenalty; $$imax=$Lx; $$jmax=$j; $state = 1; } if ($A[$Lx][$j]-$endgappenalty > $score) { $score=$A[$Lx][$j]-$endgappenalty; $$imax=$Lx; $$jmax=$j; $state = 2; } if ($B[$Lx][$j]-$endgappenalty > $score) { $score=$B[$Lx][$j]-$endgappenalty; $$imax=$Lx; $$jmax=$j; $state = 3; } } # Make sure the end gapped regions are also backtraced if ($$jmax<$Ly) { $Abt[$Lx][$$jmax+1] = $state; for ($j=$$jmax+2; $j<=$Ly; $j++) {$Abt[$Lx][$j] = 0;} $state = 2; } elsif ($$imax<$Lx) { $Bbt[$$imax+1][$Ly] = $state; for ($i=$$imax+2; $i<=$Lx; $i++) {$Bbt[$i][$Ly] = 0;} $state = 3; } else { $state = 1; } # Backtracing @$ri=(); @$rj=(); @$rS=(); $i=$Lx; $j=$Ly; $$xseq=""; $$yseq=""; while ($i || $j) { if ($state==1) { # current state is M (match-match) unshift(@$ri,$i); unshift(@$rj,$j); $state = $Mbt[$i][$j]+1; # previous state $$xseq=$xchr[$i].$$xseq; $$yseq=$ychr[$j].$$yseq; unshift(@$rS, $Sab[$xres[$i]][$yres[$j]]); $$imin=$i; $$jmin=$j; $i--; $j--; } elsif ($state==2) { # current state is A (gap in x) unshift(@$ri,0); # $ri->[$col]=0 for gap in $x unshift(@$rj,$j); $$xseq="-".$$xseq; $$yseq=$ychr[$j].$$yseq; $bt = $Abt[$i][$j--]; if ($bt) { # previous state was M if ($i==$Lx || $i==0) { unshift(@$rS,-$main::g); # end gap } else { unshift(@$rS,-$dx); # gap opening } $state = 1; } else { # previous state was A if ($i==$Lx || $i==0) { unshift(@$rS,-$main::g); # end gap } else { unshift(@$rS,-$main::e); # gap extension } } } else { # current state is B (gap in y) unshift(@$ri,$i); unshift(@$rj,0); # $j[$col]=0 for gap in $y $$xseq=$xchr[$i].$$xseq; $$yseq="-".$$yseq; $bt = $Bbt[$i--][$j]; if ($bt) { # previous state was M if ($j==$Ly || $j==0) { unshift(@$rS,-$main::g); # end gap } else { unshift(@$rS,-$dy); # gap opening } $state = 1; } else { # previous state was B if ($j==$Ly || $j==0) { unshift(@$rS,-$main::g); # end gap } else { unshift(@$rS,-$main::e); # gap extension } } } } # Set annotation string representing match quality $$Sstr=""; for (my $col=0; $col<@$ri; $col++) { if ($xres[$ri->[$col]] eq $yres[$rj->[$col]]) { $$Sstr.=uc($xchr[$ri->[$col]]); } elsif ($rS->[$col] > 0 ) { $$Sstr.="+"; } else { $$Sstr.="."; } } return $score; } 1; hhsuite-2.0.16/scripts/create_profile_from_hhm.pl0000775172256617226630000001103512110430072024446 0ustar hauserscientific_computing#!/usr/bin/env perl # # create_profile_from_hhm.pl # Create a profile (.prf) from a given HHM file # HHsuite version 2.0.16 (January 2013) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # (C) Michael Remmert and Johannes Soeding, 2012 # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; $|= 1; # Activate autoflushing on STDOUT # Default values: our $v=2; # verbose mode my $help=" create_profile_from_hhm.pl from HHsuite $VERSION Create a profile (.prf) from a given HHM file Usage: perl create_profile_from_hhm.pl -i [-o ] Options: -i Input file in HHM format -o Output file in prf-format (default: infile.prf) -v [0-5] verbose mode (default: $v) \n"; # Variable declarations my $line; my $infile; my $outfile; my $i; my $a; my @counts; # count profile my @neffs; my $name; # name of HHM profile my $len; # length of HHM profile # A C D E F G H I K L M N P Q R S T V W Y my @hhmaa2csaa = ( 0, 4, 3, 6, 13, 7, 8, 9, 11, 10, 12, 2, 14, 5, 1, 15, 16, 19, 17, 18); my @aminoacids = ('A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V'); my %aa2i; for ($a = 0; $a < 20; $a++) { $aa2i{$aminoacids[$a]} = $a; } ############################################################################################### # Processing command line input ############################################################################################### if (@ARGV<1) {die ($help);} my $options=""; for (my $i=0; $i<@ARGV; $i++) {$options.=" $ARGV[$i] ";} if ($options=~s/ -i\s+(\S+) //) {$infile=$1;} if ($options=~s/ -o\s+(\S+) //) {$outfile=$1;} if ($options=~s/ -v\s+(\S+) //) {$v=$1;} if (!$infile) {print($help); print "ERROR! No input file!\n"; exit(1);} if (!$outfile) { $infile =~ /^(\S+)\.\S+?$/; $outfile = "$1.prf"; } ############################################################################################## # Main part ############################################################################################## ###################################### # Read HHM profile ###################################### open (IN, $infile); while ($line = ) { if ($line =~ /^NAME\s+(\S+)/) { $name = $1; } elsif ($line =~ /^LENG\s+(\d+)/) { $len = $1; } elsif ($line =~ /^HMM/) { last; } } $i = 0; while ($line = ) { if ($line =~ /^\/\//) { last; } if ($line =~ s/^\S \d+ //) { for ($a = 0; $a < 20; $a++) { $line =~ s/^\s*(\S+)\s/ /; $counts[$i][$hhmaa2csaa[$a]] = $1; if ($counts[$i][$hhmaa2csaa[$a]] !~ /\*/ && $counts[$i][$hhmaa2csaa[$a]] == 0) { $counts[$i][$hhmaa2csaa[$a]] = 1; } } $line = ; $line =~ /^\s*\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s+/; $neffs[$i] = $1; $i++; } } ###################################### # write count_profile ###################################### open (OUT, ">$outfile"); # Write header printf(OUT "CountProfile\n"); printf(OUT "NAME\t%s\n", $name); printf(OUT "LENG\t%i\n", $len); printf(OUT "ALPH\t20\n"); # 20 amino acid alphabet printf(OUT "COUNTS"); for ($a = 0; $a < 20; $a++) { printf(OUT "\t%s", $aminoacids[$a]); } printf(OUT "\tNEFF\n"); # Write profile for ($i = 0; $i < $len; $i++) { printf(OUT "%i", $i+1); for ($a = 0; $a < 20; $a++) { if ($counts[$i][$a] == '*') { printf(OUT "\t*"); } else { printf(OUT "\t%i", $counts[$i][$a]); } } printf(OUT "\t%i\n", $neffs[$i]); } printf(OUT "//\n"); close OUT; exit; hhsuite-2.0.16/scripts/splitfasta.pl0000775172256617226630000000705612110430072021766 0ustar hauserscientific_computing#! /usr/bin/env perl # splitfasta.pl # Split a file with multiple, FASTA formatted sequences into many single-sequence FASTA files # # (C) Johannes Soeding, 2012 # # HHsuite version 2.0.15 (June 2012) # # Reference: # Remmert M., Biegert A., Hauser A., and Soding J. # HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. # Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). # 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 . # We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de use lib $ENV{"HHLIB"}."/scripts"; use HHPaths; # config file with path variables for nr, blast, psipred, pdb, dssp etc. use strict; use warnings; my $ext="seq"; my $usage=" splitfasta.pl from HHsuite $VERSION Split a file with multiple, FASTA formatted sequences into multiple single-sequence FASTA files. Write files into current directory and name each file by the first word after \">\" in the name line. Usage: splitfasta.pl infile [option] Option: -fam : use family-based name (for SCOP/ASTRAL sequences -name : use sequence name as file name (default) -ext : extension for sequence files (default=$ext) \n"; if (@ARGV<1) {die $usage;;} my $line; my $infile=$ARGV[0]; my $outfile; my $sequence=""; my $options=""; my $fam=0; # option -fam? my $famid=""; my %numfams=(); my $n=0; # number of name lines read in so far if (@ARGV>1) { $options.=join(" ",@ARGV[1..$#ARGV]); } # Set number of cpus to use if ($options=~s/-fam//g) {$fam=1;} if ($options=~s/-name//g) {$fam=0;} if ($options=~s/-ext\s+(\S+)//g) {$ext=$1;} open (INFILE,"<$infile") || die("ERROR: Can't open $infile: $!\n"); if ($fam) { while ($line=) { if ($line=~/^>(\S+)\s+(\S+)/) { $famid=$2; if ($n) { open (OUTFILE,">$outfile") || die("ERROR: Can't open $outfile: $!\n"); print(OUTFILE $sequence); close(OUTFILE); } if (defined $numfams{$fam}) {$numfams{$fam}++;} else {$numfams{$fam}=1}; $outfile="$fam.".$numfams{$fam}.".seq"; $sequence=$line; $n++; } else { $sequence.=$line; } } if ($n) { open (OUTFILE,">$outfile") || die("ERROR: Can't open $outfile: $!\n"); print(OUTFILE $sequence); close(OUTFILE); } } else { my %exists=(); while ($line=) { if ($line=~/^>(\S+)/) { if ($n) { open (OUTFILE,">$outfile") || die("ERROR: Can't open $outfile: $!\n"); print(OUTFILE $sequence); close(OUTFILE); } if ($exists{$1}) {print("\nWarning: id $1 appears more than once in $infile\n");} $exists{$1}=1; my $tmp = $1; $tmp =~ s/\|/_/g; $tmp =~ s/\./_/g; $outfile="$tmp.seq"; $sequence=$line; $n++; } else { $sequence.=$line; } } if ($n) { open (OUTFILE,">$outfile") || die("ERROR: Can't open $outfile: $!\n"); print(OUTFILE $sequence); close(OUTFILE); } } close(INFILE); printf("Created %i sequence files\n",$n); hhsuite-2.0.16/src/0000775172256617226630000000000012110430072016344 5ustar hauserscientific_computinghhsuite-2.0.16/src/hhsearch.C0000775172256617226630000023627712110430072020261 0ustar hauserscientific_computing// hhsearch.C: // Search for a multiple alignment (transformed into HMM) in a profile HMM database // Error codes: 0: ok 1: file format error 2: file access error 3: memory error 4: command line error 6: internal logic error 7: internal numeric error // (C) Johannes Soeding and Michael Remmert 2012 // 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 . // We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de // Reference: // Remmert M., Biegert A., Hauser A., and Soding J. // HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. // Nat. Methods 9:173-175 (2011); epub Dec 25, doi: 10.1038/NMETH.1818 // // TODOs // // * Allow using the base name (without extension) in hhsearch to make it compatible with the ussage of hhblits // ////#define WINDOWS #define PTHREAD #define MAIN #include // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // min,max #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // islower, isdigit etc #include // clock_gettime etc. (in realtime library (-lrt compiler option)) #include // perror() #include #include #include // access() #ifdef PTHREAD #include // POSIX pthread functions and data structures #endif #include //#include //#include "efence.h" //#include "efence.c" #ifdef HH_SSE41 #include // SSSE3 #include // SSE4.1 #define HH_SSE3 #endif #ifdef HH_SSE3 #include // SSE3 #define HH_SSE2 #endif #ifdef HH_SSE2 #ifndef __SUNPRO_C #include // SSE2 #else #include #endif #endif using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; #include "cs.h" // context-specific pseudocounts #include "context_library.h" #include "library_pseudocounts-inl.h" #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.C" // list data structure #include "hash.C" // hash data structure #include "hhdecl.C" // Constants, global variables, struct Parameters #include "hhutil.C" // MatchChr, InsertChr, aa2i, i2aa, log2, fast_log2, ScopID, WriteToScreen, #include "hhmatrices.C" // BLOSUM50, GONNET, HSDM #include "hhhmm.h" // class Hit #include "hhhit.h" // class Hit #include "hhalignment.h" // class Alignment #include "hhhalfalignment.h" // class HalfAlignment #include "hhfullalignment.h" // class FullAlignment #include "hhhitlist.h" // class Hit #include "hhhmm.C" // class HMM #include "hhalignment.C" // class Alignment #include "hhhit.C" // class Hit #include "hhhalfalignment.C" // class HalfAlignment #include "hhfullalignment.C" // class FullAlignment #include "hhhitlist.C" // class HitList #include "hhfunc.C" // some functions common to hh programs ///////////////////////////////////////////////////////////////////////////////////// // Global variables //////////////////////////////////////////////////////////////////////////////////// const char HHSEARCH_REFERENCE[]="Soding, J. Protein homology detection by HMM-HMM comparison. Bioinformatics 21:951-960 (2005).\n"; const int MAXTHREADS=256; // maximum number of threads (i.e. CPUs) for parallel computation const int MAXBINS=384; // maximum number of bins (positions in thread queue) enum bin_states {FREE=0, SUBMITTED=1, RUNNING=2}; int v1; // verbose mode int threads=0; // number of threads (apart from the main thread which reads from the databases file) 0:no multithreading int bins; // number of bins; jobs gets allocated to a FREE bin were they are waiting for exection by a thread char bin_status[MAXBINS]; // The status for each bin is FREE, SUBMITTED, or RUNNING int jobs_running; // number of active jobs, i.e. number of bins set to RUNNING int jobs_submitted; // number of submitted jobs, i.e. number of bins set to SUBMITTED char reading_dbs; // 1: still HMMs to read in a database; 0: finshed reading all HMMs, no db left const char DEBUG_THREADS=0; // Debugging flag HMM* q = new HMM; // Create query HMM with maximum of par.maxres match states HMM* t[MAXBINS]; // Each bin has a template HMM allocated that was read from the database file Hit* hit[MAXBINS]; // Each bin has an object of type Hit allocated with a separate dynamic programming matrix (memory!!) HitList hitlist; // list of hits with one Hit object for each pairwise comparison done Hit hit_cur; // current Hit element read from hitlist int* format; // format[bin] = 0 if in HHsearch format => add pcs; format[bin] = 1 if in HMMER format => no pcs int read_from_db; // The value of this flag is returned from HMM::Read(); 0:end of file 1:ok 2:skip HMM int N_searched; // Number of HMMs searched char line[LINELEN]=""; // input line int bin; // bin index struct Thread_args // data to hand to WorkerLoop thread { int thread_id; // id of thread (for debugging) void (*function)(int); // pointer to function (=job) to execute by WorkerLoop once old job is done }; #ifdef PTHREAD struct Thread_args thread_data[MAXTHREADS]; // store a threads thread_id and function to call (AlignByWorker, RealignByWorker) pthread_t pthread[MAXTHREADS]; // info on thread's structures (needed by system) pthread_attr_t joinable; // attribute set for describing threads int rc; // return code for threading commands // With this condition variable the main thread signals to the worker threads that it has submitted a new job pthread_cond_t new_job = PTHREAD_COND_INITIALIZER; // Mutex assures exclusive access to bin_status[], jobs_sumitted, jobs_running, and new_job by threads pthread_mutex_t bin_status_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex assures exclusive access to hitlist pthread_mutex_t hitlist_mutex = PTHREAD_MUTEX_INITIALIZER; // With this condition variable a worker thread signals to the main thread that it has finished a job pthread_cond_t finished_job = PTHREAD_COND_INITIALIZER; #endif /////////////////////////////////////////////////////////////////////////////////////// //// For multi-threading: return a bin with the desired status, return -1 if no such bin found ////////////////////////////////////////////////////////////////////////////////////// inline int PickBin(char status) { for (int b=0; b input/query multiple sequence alignment (a2m, a3m, FASTA) or HMM\n"); printf(" -d HMM database of concatenated HMMs in hhm, HMMER, or a3m format,\n"); printf(" OR, if file has extension pal, list of HMM file names, one per\n"); printf(" line. Multiple dbs, HMMs, or pal files with -d ' ...'\n"); if (all) { printf("\n"); printf(" may be 'stdin' or 'stdout' throughout.\n"); } printf("\n"); printf("Output options: \n"); printf(" -o write results in standard format to file (default=)\n"); if (all) { printf(" -Ofas write pairwise alignments of significant matches in FASTA format\n"); printf(" Analogous for output in a3m, a2m, and psi format (e.g. -Oa3m)\n"); printf(" -oa3m write MSA of significant matches in a3m format\n"); printf(" Analogous for output in a2m, psi, and hhm format (e.g. -ohhm)\n"); printf(" -e [0,1] E-value cutoff for inclusion in multiple alignment (def=%G) \n",par.e); printf(" -seq max. number of query/template sequences displayed (def=%i) \n",par.nseqdis); printf(" Beware of overflows! All these sequences are stored in memory.\n"); printf(" -cons show consensus sequence as master sequence of query MSA \n"); } printf(" -nocons don't show consensus sequence in alignments (default=show) \n"); printf(" -nopred don't show predicted 2ndary structure in alignments (default=show)\n"); printf(" -nodssp don't show DSSP 2ndary structure in alignments (default=show) \n"); printf(" -ssconf show confidences for predicted 2ndary structure in alignments\n"); printf(" -p minimum probability in summary and alignment list (def=%G) \n",par.p); printf(" -E maximum E-value in summary and alignment list (def=%G) \n",par.E); printf(" -Z maximum number of lines in summary hit list (def=%i) \n",par.Z); printf(" -z minimum number of lines in summary hit list (def=%i) \n",par.z); printf(" -B maximum number of alignments in alignment list (def=%i) \n",par.B); printf(" -b minimum number of alignments in alignment list (def=%i) \n",par.b); if (all) { printf(" -aliw [40,..[ number of columns per line in alignment list (def=%i)\n",par.aliwidth); printf(" -dbstrlen max length of database string to be printed in hhr file\n"); } printf("\n"); printf("Filter query multiple sequence alignment \n"); printf(" -id [0,100] maximum pairwise sequence identity (%%) (def=%i) \n",par.max_seqid); printf(" -diff [0,inf[ filter MSA by selecting most diverse set of sequences, keeping \n"); printf(" at least this many seqs in each MSA block of length 50 (def=%i) \n",par.Ndiff); printf(" -cov [0,100] minimum coverage with query (%%) (def=%i) \n",par.coverage); printf(" -qid [0,100] minimum sequence identity with query (%%) (def=%i) \n",par.qid); printf(" -qsc [0,100] minimum score per column with query (def=%.1f)\n",par.qsc); printf(" -neff [1,inf] target diversity of alignment (default=off)\n"); printf("\n"); printf("Input alignment format: \n"); printf(" -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert;\n"); printf(" '-' = Delete; '.' = gaps aligned to inserts (may be omitted) \n"); printf(" -M first use FASTA: columns with residue in 1st sequence are match states\n"); printf(" -M [0,100] use FASTA: columns with fewer than X%% gaps are match states \n"); if (all) { printf(" -tags do NOT neutralize His-, C-myc-, FLAG-tags, and trypsin \n"); printf(" recognition sequence to background distribution \n"); } printf("\n"); printf("HMM-HMM alignment options: \n"); printf(" -norealign do NOT realign displayed hits with MAC algorithm (def=realign) \n"); printf(" -mact [0,1[ posterior probability threshold for MAC re-alignment (def=%.3f)\n",par.mact); printf(" Parameter controls alignment greediness: 0:global >0.1:local\n"); printf(" -glob/-loc use global/local alignment mode for searching/ranking (def=local)\n"); // printf(" -vit use Viterbi algorithm for searching/ranking (default) \n"); // printf(" -mac use Maximum Accuracy MAC algorithm for searching/ranking\n"); // printf(" -forward use Forward probability for searching \n"); printf(" -alt show up to this many significant alternative alignments(def=%i)\n",par.altali); if (all) { printf(" -vit use Viterbi algorithm for searching/ranking (default) \n"); printf(" -mac use Maximum Accuracy (MAC) algorithm for searching/ranking\n"); printf(" -forward use Forward probability for searching \n"); printf(" -excl exclude query positions from the alignment, e.g. '1-33,97-168' \n"); printf(" -shift [-1,1] score offset (def=%-.2f) \n",par.shift); printf(" -corr [0,1] weight of term for pair correlations (def=%.2f) \n",par.corr); printf(" -sc amino acid score (tja: template HMM at column j) (def=%i)\n",par.columnscore); printf(" 0 = log2 Sum(tja*qia/pa) (pa: aa background frequencies) \n"); printf(" 1 = log2 Sum(tja*qia/pqa) (pqa = 1/2*(pa+ta) ) \n"); printf(" 2 = log2 Sum(tja*qia/ta) (ta: av. aa freqs in template) \n"); printf(" 3 = log2 Sum(tja*qia/qa) (qa: av. aa freqs in query) \n"); printf(" 5 local amino acid composition correction \n"); } printf(" -ssm {0,..,4} 0: no ss scoring \n"); printf(" 1,2: ss scoring after or during alignment [default=%1i] \n",par.ssm); printf(" 3,4: ss scoring after or during alignment, predicted vs. predicted \n"); if (all) { printf(" -ssw [0,1] weight of ss score compared to column score (def=%-.2f) \n",par.ssw); printf(" -ssa [0,1] SS substitution matrix = (1-ssa)*I + ssa*full-SS-substition-matrix [def=%-.2f)\n",par.ssa); printf("\n"); printf("Gap cost options: \n"); printf(" -gapb [0,inf[ Transition pseudocount admixture (def=%-.2f) \n",par.gapb); printf(" -gapd [0,inf[ Transition pseudocount admixture for open gap (default=%-.2f) \n",par.gapd); printf(" -gape [0,1.5] Transition pseudocount admixture for extend gap (def=%-.2f) \n",par.gape); printf(" -gapf ]0,inf] factor to increase/reduce the gap open penalty for deletes (def=%-.2f) \n",par.gapf); printf(" -gapg ]0,inf] factor to increase/reduce the gap open penalty for inserts (def=%-.2f) \n",par.gapg); printf(" -gaph ]0,inf] factor to increase/reduce the gap extend penalty for deletes(def=%-.2f)\n",par.gaph); printf(" -gapi ]0,inf] factor to increase/reduce the gap extend penalty for inserts(def=%-.2f)\n",par.gapi); printf(" -egq [0,inf[ penalty (bits) for end gaps aligned to query residues (def=%-.2f) \n",par.egq); printf(" -egt [0,inf[ penalty (bits) for end gaps aligned to template residues (def=%-.2f) \n",par.egt); printf("\n"); printf("Pseudocount (pc) options: \n"); printf(" -pcm {0,..,3} position dependence of pc admixture 'tau' (pc mode, default=%-i) \n",par.pcm); printf(" 0: no pseudo counts: tau = 0 \n"); printf(" 1: constant tau = a \n"); printf(" 2: diversity-dependent: tau = a/(1 + ((Neff[i]-1)/b)^c) \n"); printf(" (Neff[i]: number of effective seqs in local MSA around column i) \n"); printf(" 3: constant diversity pseudocounts \n"); printf(" -pca [0,1] overall pseudocount admixture (def=%-.1f) \n",par.pca); printf(" -pcb [1,inf[ Neff threshold value for -pcm 2 (def=%-.1f) \n",par.pcb); printf(" -pcc [0,3] extinction exponent c for -pcm 2 (def=%-.1f) \n",par.pcc); // printf(" -pcw [0,3] weight of pos-specificity for pcs (def=%-.1f) \n",par.pcw); } printf("\n"); printf("Context-specific pseudo-counts: \n"); printf(" -nocontxt use substitution-matrix instead of context-specific pseudocounts \n"); printf(" -contxt context file for computing context-specific pseudocounts (default=%s)\n",par.clusterfile); printf(" -cslib column state file for fast database prefiltering (default=%s)\n",par.cs_library); if (all) { printf(" -csw [0,inf] weight of central position in cs pseudocount mode (def=%.1f)\n", par.csw); printf(" -csb [0,1] weight decay parameter for positions in cs pc mode (def=%.1f)\n", par.csb); } printf("\n"); printf("Other options: \n"); printf(" -cpu number of CPUs to use (for shared memory SMPs) (default=1)\n"); #ifndef PTHREAD printf("(The -cpu option is inactive since POSIX threads ae not supported on your platform)\n"); #endif printf(" -v verbose mode: 0:no screen output 1:only warings 2: verbose \n"); if (all) { printf(" -maxres max number of HMM columns (def=%5i) \n",par.maxres); printf(" -maxmem [1,inf[ max available memory in GB (def=%.1f) \n",par.maxmem); printf(" -scores write scores for all pairwise comparisions to file \n"); printf(" -calm {0,..,3} empirical score calibration of 0:query 1:template 2:both \n"); printf(" default 3: neural network-based estimation of EVD params \n"); // printf(" -opt parameter optimization mode (def=off): return sum of ranks \n"); // printf(" of true positives (same superfamily) for minimization \n"); // printf(" and write result into file \n"); printf("\n"); } else { printf("An extended list of options can be obtained by calling 'hhblits -help'\n"); } printf("\n"); printf("Example: %s -i a.1.1.1.a3m -d scop70_1.71.hhm \n",program_name); cout<=4) cout<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help() ; cerr<=argc || argv[i][0]=='-') {help(); cerr<=argc) {help(); exit(4);} par.exclstr = new(char[strlen(argv[i])+1]); strcpy(par.exclstr,argv[i]); } else if (!strcmp(argv[i],"-v") && (i0.35 && par.mact<0.351) {par.mact=0;} } else if (!strncmp(argv[i],"-loc",4)) par.loc=1; else if (!strncmp(argv[i],"-alt",4) && (i='0' && argv[i][0]<='9') {par.Mgaps=atoi(argv[i]); par.M=2;} else cerr<=argc || argv[i][0]=='-') {help() ; cerr<=4) cout<Log2LinTransitionProbs(1.0); // transform transition freqs to lin space if not already done int nhits=0; int N_aligned=0; // Longest allowable length of database HMM (backtrace: 5 chars, fwd: 1 double, bwd: 1 double long int Lmaxmem=((par.maxmem-0.5)*1024*1024*1024)/(2*sizeof(double)+8)/q->L/bins; long int Lmax=0; // length of longest HMM to be realigned // phash_plist_realignhitpos->Show(dbfile) is pointer to list with template indices and their ftell positions. // This list can be sorted by ftellpos to access one template after the other efficiently during realignment Hash< List* >* phash_plist_realignhitpos; phash_plist_realignhitpos = new Hash< List* > (2311,NULL); // Some templates have several (suboptimal) alignments in hitlist. For realignment, we need to efficiently // access all hit objects in hitlist belonging to one template (because we don't want to read templates twice) // We therefore need for each template (identified by its index between 0 and N_searched-1) a list of elements // in hitlist that store the alignments with the template of that index. // This list is pointed to by array_plist_phits[index]. List** array_plist_phits; array_plist_phits = new List*[N_searched]; for (int index=0; index= par.realign_max && nhits>=imax(par.B,par.Z)) break; if (hit_cur.Eval > par.e) { if (nhits>=imax(par.B,par.Z)) continue; if (nhits>=imax(par.b,par.z) && hit_cur.Probab < par.p) continue; if (nhits>=imax(par.b,par.z) && hit_cur.Eval > par.E) continue; } if (hit_cur.L>Lmax) Lmax=hit_cur.L; if (hit_cur.L>Lmaxmem) {nhits++; continue;} // fprintf(stderr,"hit.name=%-15.15s hit.index=%-5i hit.ftellpos=%-8i hit.dbfile=%s\n",hit_cur.name,hit_cur.index,(unsigned int)hit_cur.ftellpos,hit_cur.dbfile); if (nhits>=par.premerge || hit_cur.irep>1) // realign the first premerge hits consecutively to query profile { if (hit_cur.irep==1) { // For each template (therefore irep==1), store template index and position on disk in a list Realign_hitpos realign_hitpos; realign_hitpos.ftellpos = hit_cur.ftellpos; // stores position on disk of template for current hit realign_hitpos.index = hit_cur.index; // stores index of template of current hit if (! phash_plist_realignhitpos->Contains(hit_cur.dbfile)) { List* newlist = new List; phash_plist_realignhitpos->Add(hit_cur.dbfile,newlist); } // Add template index and ftellpos to list which belongs to key dbfile in hash phash_plist_realignhitpos->Show(hit_cur.dbfile)->Push(realign_hitpos); } if (! array_plist_phits[hit_cur.index]) // pointer at index is still NULL { List* newlist = new List; // create new list of pointers to all aligments of a template array_plist_phits[hit_cur.index] = newlist; // set array[index] to newlist } // Push(hitlist.ReadCurrentAddress()) : Add address of current hit in hitlist to list... // array_plist_phits[hit_cur.index]-> : pointed to by hit_cur.index'th element of array_plist_phits array_plist_phits[hit_cur.index]->Push(hitlist.ReadCurrentAddress()); } nhits++; } if (Lmax>Lmaxmem) { Lmax=Lmaxmem; if (v>=1) { cerr<<"WARNING: Realigning sequences only up to length "< option (currently "<forward_allocated) hit[bin]->AllocateForwardMatrix(q->L+2,Lmax+1); if (!hit[bin]->backward_allocated) hit[bin]->AllocateBackwardMatrix(q->L+2,Lmax+1); } if (v>=2) printf("Realigning %i database HMMs using HMM-HMM Maximum Accuracy algorithm\n",nhits); v1 = v; if (v>0 && v<=3) v=1; else v-=2; // Supress verbose output during iterative realignment and realignment ///////////////////////////////////////////////////////////////////////////////////////////////////// // Start premerge: align the first par.premerge templates? if (par.premerge>0) { // Read query alignment into Qali Alignment Qali; // output A3M generated by merging A3M alignments for significant hits to the query alignment char qa3mfile[NAMELEN]; char ta3mfile[NAMELEN]; RemoveExtension(qa3mfile,par.infile); // directory?? strcat(qa3mfile,".a3m"); FILE* qa3mf=fopen(qa3mfile,"r"); if (!qa3mf) OpenFileError(qa3mfile); Qali.Read(qa3mf,qa3mfile); fclose(qa3mf); delete[] Qali.longname; Qali.longname = new(char[strlen(q->longname)+1]); strcpy(Qali.longname,q->longname); strcpy(Qali.name,q->name); strcpy(Qali.fam,q->fam); RemovePathAndExtension(Qali.file,par.hhmfile); // If par.append==1 do not print query alignment if (par.append) Qali.MarkSeqsAsNonPrintable(); if (v>=2) printf("Merging best hits to query alignment %s ...\n",qa3mfile); bin=0; nhits=0; hitlist.Reset(); while (!hitlist.End() && nhits=imax(par.B,par.Z)) break; if (nhits>=imax(par.b,par.z) && hit_cur.Probab < par.p) break; if (nhits>=imax(par.b,par.z) && hit_cur.Eval > par.E) continue; if (hit_cur.irep>1) continue; // Align only the best hit of the first par.premerge templates if (hit_cur.L>Lmaxmem) {nhits++; continue;} //Don't align to long sequences due to memory limit // Open HMM database file dbfiles[idb] FILE* dbf=fopen(hit_cur.dbfile,"rb"); if (!dbf) OpenFileError(hit_cur.dbfile); read_from_db=1; // Forward stream position to start of next database HMM to be realigned hit[bin]->index = hit_cur.index; // give hit a unique index for HMM hit[bin]->ftellpos = hit_cur.ftellpos; fseek(dbf,hit_cur.ftellpos,SEEK_SET); hit[bin]->dbfile = new(char[strlen(hit_cur.dbfile)+1]); strcpy(hit[bin]->dbfile,hit_cur.dbfile); // record db file name from which next HMM is read hit[bin]->irep = 1; // Needed for min_overlap calculation in InitializeForAlignment in hhhit.C char path[NAMELEN]; Pathname(path,hit_cur.dbfile); /////////////////////////////////////////////////// // Read next HMM from database file if (!fgetline(line,LINELEN,dbf)) {fprintf(stderr,"Error in %s: end of file %s reached prematurely!\n",par.argv[0],hit_cur.dbfile); exit(1);} while (strscn(line)==NULL && fgetline(line,LINELEN,dbf)) {} // skip lines that contain only white space if (!strncmp(line,"HMMER3",6)) // read HMMER3 format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer3(dbf,hit_cur.dbfile); par.hmmer_used = true; } else if (!strncmp(line,"HMMER",5)) // read HMMER format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer(dbf,hit_cur.dbfile); par.hmmer_used = true; } else if (!strncmp(line,"HH",2)) // read HHM format { format[bin] = 0; read_from_db = t[bin]->Read(dbf,path); } else if (!strncmp(line,"NAME",4)) // The following lines are for backward compatibility of HHM format version 1.2 with 1.1 { format[bin] = 0; fseek(dbf,hit_cur.ftellpos,SEEK_SET); // rewind to beginning of line read_from_db = t[bin]->Read(dbf,path); } else if (line[0]=='#') // read a3m alignment { Alignment tali; tali.Read(dbf,hit_cur.dbfile,line); tali.Compress(hit_cur.dbfile); // qali.FilterForDisplay(par.max_seqid,par.coverage,par.qid,par.qsc,par.nseqdis); tali.N_filtered = tali.Filter(par.max_seqid_db,par.coverage_db,par.qid_db,par.qsc_db,par.Ndiff_db); t[bin]->name[0]=t[bin]->longname[0]=t[bin]->fam[0]='\0'; tali.FrequenciesAndTransitions(t[bin]); format[bin] = 0; } else { cerr<=2) fprintf(stderr,"Realigning with %s ***** \n",t[bin]->name); /////////////////////////////////////////////////// N_aligned++; if (v1>=2 && !(N_aligned%10)) { cout<<"."; if (!(N_aligned%500)) printf(" %-4i HMMs aligned\n",N_aligned); cout.flush(); } // Prepare MAC comparison(s) PrepareTemplateHMM(q,t[bin],format[bin]); t[bin]->Log2LinTransitionProbs(1.0); // Align q to template in *hit[bin] hit[bin]->Forward(q,t[bin]); hit[bin]->Backward(q,t[bin]); hit[bin]->MACAlignment(q,t[bin]); hit[bin]->BacktraceMAC(q,t[bin]); // Overwrite *hit[bin] with Viterbi scores, Probabilities etc. of hit_cur hit[bin]->score = hit_cur.score; hit[bin]->score_aass = hit_cur.score_aass; hit[bin]->score_ss = hit_cur.score_ss; hit[bin]->Pval = hit_cur.Pval; hit[bin]->Pvalt = hit_cur.Pvalt; hit[bin]->logPval = hit_cur.logPval; hit[bin]->logPvalt = hit_cur.logPvalt; hit[bin]->Eval = hit_cur.Eval; hit[bin]->logEval = hit_cur.logEval; hit[bin]->Probab = hit_cur.Probab; hit[bin]->irep = hit_cur.irep; // Replace original hit in hitlist with realigned hit //hitlist.ReadCurrent().Delete(); hitlist.Delete().Delete(); // delete the list record and hit object hitlist.Insert(*hit[bin]); // Read a3m alignment of hit and merge with Qali according to Q-T-alignment in hit[bin] strcpy(ta3mfile,hit[bin]->file); // copy filename including path but without extension strcat(ta3mfile,".a3m"); Alignment Tali; FILE* ta3mf=fopen(ta3mfile,"r"); if (!ta3mf) OpenFileError(ta3mfile); Tali.Read(ta3mf,ta3mfile); // Read template alignment into Tali fclose(ta3mf); Tali.Compress(ta3mfile); // Filter database alignment Qali.MergeMasterSlave(*hit[bin],Tali,ta3mfile); // Convert ASCII to int (0-20),throw out all insert states, record their number in I[k][i] Qali.Compress("merged A3M file"); // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) Qali.N_filtered = Qali.Filter(par.max_seqid,par.coverage,par.qid,par.qsc,par.Ndiff); // Calculate pos-specific weights, AA frequencies and transitions -> f[i][a], tr[i][a] Qali.FrequenciesAndTransitions(q); // Comput substitution matrix pseudocounts if (par.nocontxt) { // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] q->PreparePseudocounts(); // Add amino acid pseudocounts to query: p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] q->AddAminoAcidPseudocounts(); } else { // Generate an amino acid frequency matrix from f[i][a] with full context specific pseudocount admixture (tau=1) -> g[i][a] // q->PrepareContextSpecificPseudocounts(); //OLD q->AddContextSpecificPseudocounts(); } // Transform transition freqs to lin space if not already done q->AddTransitionPseudocounts(); q->Log2LinTransitionProbs(1.0); // transform transition freqs to lin space if not already done q->CalculateAminoAcidBackground(); nhits++; } } // End premerge: align the first par.premerge templates? ///////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef PTHREAD // Start threads for realignment for (int j=0; jContains(dbfiles[idb])) continue; // phash_plist_realignhitpos->Show(dbfile) is pointer to list with template indices and their ftell positions. // This list is now sorted by ftellpos in ascending order to access one template after the other efficiently phash_plist_realignhitpos->Show(dbfiles[idb])->SortList(); // Open HMM database file dbfiles[idb] FILE* dbf=fopen(dbfiles[idb],"rb"); if (!dbf) OpenFileError(dbfiles[ndb]); read_from_db=1; /////////////////////////////////////////////////////////////////////////////////////// // The loop (reads HMMs from the database file and) submits jobs into free bins as soon as they become available phash_plist_realignhitpos->Show(dbfiles[idb])->Reset(); while (! phash_plist_realignhitpos->Show(dbfiles[idb])->End()) { // Submit jobs until no bin is free anymore while (! phash_plist_realignhitpos->Show(dbfiles[idb])->End() && jobs_submitted+jobs_runningShow(dbfiles[idb])->ReadNext(); hit[bin]->index = hitpos_curr.index; // give hit[bin] a unique index for HMM fseek(dbf,hitpos_curr.ftellpos,SEEK_SET); // start to read at ftellpos for template // Give hit[bin] the pointer to the list of pointers to hitlist elements of same template (for realignment) hit[bin]->plist_phits = array_plist_phits[hitpos_curr.index]; // fprintf(stderr,"dbfile=%-40.40s index=%-5i ftellpos=%l\n",dbfiles[idb],hitpos_curr.index,hitpos_curr.ftellpos); char path[NAMELEN]; Pathname(path,dbfiles[idb]); /////////////////////////////////////////////////// // Read next HMM from database file if (!fgetline(line,LINELEN,dbf)) {fprintf(stderr,"Error in %s: end of file %s reached prematurely!\n",par.argv[0],dbfiles[idb]); exit(1);} while (strscn(line)==NULL && fgetline(line,LINELEN,dbf)) {} // skip lines that contain only white space if (!strncmp(line,"HMMER3",6)) // read HMMER3 format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer3(dbf,dbfiles[idb]); par.hmmer_used = true; } else if (!strncmp(line,"HMMER",5)) // read HMMER format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer(dbf,dbfiles[idb]); par.hmmer_used = true; } else if (!strncmp(line,"HH",2)) // read HHM format { format[bin] = 0; read_from_db = t[bin]->Read(dbf,path); } else if (!strncmp(line,"NAME",4)) // The following lines are for backward compatibility of HHM format version 1.2 with 1.1 { format[bin] = 0; fseek(dbf,hitpos_curr.ftellpos,SEEK_SET); // rewind to beginning of line read_from_db = t[bin]->Read(dbf,path); } else if (line[0]=='#') // read a3m alignment { Alignment tali; tali.Read(dbf,dbfiles[idb],line); tali.Compress(dbfiles[idb]); // qali.FilterForDisplay(par.max_seqid,par.coverage,par.qid,par.qsc,par.nseqdis); tali.N_filtered = tali.Filter(par.max_seqid_db,par.coverage_db,par.qid_db,par.qsc_db,par.Ndiff_db); t[bin]->name[0]=t[bin]->longname[0]=t[bin]->fam[0]='\0'; tali.FrequenciesAndTransitions(t[bin]); format[bin] = 0; } else { cerr<=2) fprintf(stderr,"Realigning with %s\n",t[bin]->name); /////////////////////////////////////////////////// hit[bin]->dbfile = new(char[strlen(dbfiles[idb])+1]); strcpy(hit[bin]->dbfile,dbfiles[idb]); // record db file name from which next HMM is read N_aligned++; if (v1>=2 && !(N_aligned%10)) { cout<<"."; if (!(N_aligned%500)) printf(" %-4i HMMs aligned\n",N_aligned); cout.flush(); } #ifdef PTHREAD // Lock access to bin_status if (threads>0) rc = pthread_mutex_lock(&bin_status_mutex); #endif // Send the job in bin to a thread bin_status[bin] = SUBMITTED; jobs_submitted++; if (threads==0) // if no multi-threading mode, main thread executes job itself { RealignByWorker(bin); bin_status[bin] = FREE; jobs_submitted--; break; } #ifdef PTHREAD // Restart threads waiting for a signal rc = pthread_cond_signal(&new_job); // Unlock access to bin_status rc = pthread_mutex_unlock(&bin_status_mutex); if (DEBUG_THREADS) fprintf(stderr,"Main: put job into bin %i name=%-7.7s Jobs running: %i jobs_submitted:%i \n",bin,t[bin]->name,jobs_running,jobs_submitted); #endif } #ifdef PTHREAD if (threads>0) { // Lock mutex rc = pthread_mutex_lock(&bin_status_mutex); // Wait until job finishes and a bin becomes free if (jobs_submitted+jobs_running>=bins) { if (DEBUG_THREADS) fprintf(stderr,"Master thread is waiting for jobs to be finished...\n"); #ifdef WINDOWS rc = pthread_cond_wait(&finished_job, &bin_status_mutex); #else #ifdef HH_MAC // If no submitted jobs are in the queue we have to wait for a new job ... struct timespec ts; struct timeval tv; gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + 1; rc = pthread_cond_timedwait(&finished_job, &bin_status_mutex,&ts); #else // If no submitted jobs are in the queue we have to wait for a new job ... struct timespec ts; clock_gettime(CLOCK_REALTIME,&ts); ts.tv_sec += 1; rc = pthread_cond_timedwait(&finished_job, &bin_status_mutex,&ts); #endif #endif } // Unlock mutex rc = pthread_mutex_unlock(&bin_status_mutex); } #endif } // End while(1) /////////////////////////////////////////////////////////////////////////////////////// fclose(dbf); } reading_dbs=0; #ifdef PTHREAD if (threads>0) { // No more HMMs in database => wait until all threads have finished if (DEBUG_THREADS) fprintf(stderr,"No more jobs read from database Jobs running:%i jobs_submitted:%i \n",jobs_running,jobs_submitted); // Free all threads still waiting for jobs rc = pthread_mutex_lock(&bin_status_mutex); rc = pthread_cond_broadcast(&new_job); rc = pthread_mutex_unlock(&bin_status_mutex); // Unlock mutex // Wait for all jobs to finish => join all jobs to main for (int j=0; j=2) cout<<"\n"; v=v1; // Print for each HMM: n score -log2(Pval) L name (n=5:same name 4:same fam 3:same sf...) if (*par.scorefile) { if (v>=3) printf("Printing scores file ...\n"); hitlist.PrintScoreFile(q); } // Delete all hitlist entries with too short alignments nhits=0; hitlist.Reset(); while (!hitlist.End()) { hit_cur = hitlist.ReadNext(); // printf("Deleting alignment of %s with length %i? nhits=%-2i par.B=%-3i par.Z=%-3i par.e=%.2g par.b=%-3i par.z=%-3i par.p=%.2g\n",hit_cur.name,hit_cur.matched_cols,nhits,par.B,par.Z,par.e,par.b,par.z,par.p); if (nhits>=imax(par.B,par.Z)) break; if (nhits>=imax(par.b,par.z) && hit_cur.Probab < par.p) break; if (nhits>=imax(par.b,par.z) && hit_cur.Eval > par.E) continue; if (hit_cur.matched_cols < MINCOLS_REALIGN) { if (v>=3) printf("Deleting alignment of %s with length %i\n",hit_cur.name,hit_cur.matched_cols); hitlist.Delete().Delete(); // delete the list record and hit object // // Make sure only realigned alignments get displayed! JS: Why? better unrealigned than none. // if (par.B>par.Z) par.B--; else if (par.B==par.Z) {par.B--; par.Z--;} else par.Z--; // if (par.b>par.z) par.b--; else if (par.b==par.z) {par.b--; par.z--;} else par.z--; } nhits++; } // Delete hash phash_plist_realignhitpos with lists phash_plist_realignhitpos->Reset(); while (!phash_plist_realignhitpos->End()) delete(phash_plist_realignhitpos->ReadNext()); // delete list to which phash_plist_realignhitpos->ReadNext() points delete(phash_plist_realignhitpos); // Delete array_plist_phits with lists for (int index=0; index1 && !strcmp(argv[i],"-v0")) v=0; else if (argc>1 && !strcmp(argv[i],"-v1")) v=1; else if (argc>2 && !strcmp(argv[i],"-v")) v=atoi(argv[i+1]); } par.SetDefaultPaths(program_path); // Read .hhdefaults file? if (par.readdefaultsfile) { // Process default otpions from .hhconfig file ReadDefaultsFile(argc_conf,argv_conf,program_path); ProcessArguments(argc_conf,argv_conf); } // Process command line options (they override defaults from .hhdefaults file) ProcessArguments(argc,argv); // Check command line input and default values if (!*par.infile || !strcmp(par.infile,"")) // infile not given {help(); cerr<MAXTHREADS) { threads=MAXTHREADS; if (v>=1) fprintf(stderr,"WARNING: number of CPUs set to maximum value of %i\n",MAXTHREADS); } RemoveExtension(q->file,par.infile); // get rootname of infile (no directory path, no extension) Extension(inext,par.infile); // get extension of infile if (!*par.outfile) // outfile not given? Name it basename.hhm { RemoveExtension(par.outfile,par.infile); strcat(par.outfile,".hhr"); if (v>=2) cout<<"Search results will be written to "<MAXSEQDIS-3-par.showcons) par.nseqdis=MAXSEQDIS-3-par.showcons; //3 reserved for secondary structure if (par.aliwidth<20) par.aliwidth=20; if (par.pca<0.001) par.pca=0.001; // to avoid log(0) if (par.b>par.B) par.B=par.b; if (par.z>par.Z) par.Z=par.z; if (par.maxmem<1.0) {cerr<<"Warning: setting -maxmem to its minimum allowed value of 1.0\n"; par.maxmem=1.0;} // Input parameters if (v>=3) { cout<<"Input file : "<(fin); fclose(fin); cs::TransformToLog(*context_lib); lib_pc = new cs::LibraryPseudocounts(*context_lib, par.csw, par.csb); } // Set secondary structure substitution matrix if (par.ssm) SetSecStrucSubstitutionMatrix(); // Set (global variable) substitution matrix and derived matrices SetSubstitutionMatrix(); // Read input file (HMM, HHM, or alignment format), and add pseudocounts etc. char input_format=0; ReadQueryFile(par.infile,input_format,q); PrepareQueryHMM(input_format,q); // // Rescale matrix according to query aa composition? (Two iterations are sufficient) // if (par.pcm==4) // { // q->RescaleMatrix(); // q->PreparePseudocounts(); // q->AddAminoAcidPseudocounts(); // SetSubstitutionMatrix(); // q->RescaleMatrix(); // q->PreparePseudocounts(); // q->AddAminoAcidPseudocounts(); // } // Reset lamda? if (par.calibrate>0) {q->lamda=LAMDA; q->mu=0.0;} // Set query columns in His-tags etc to Null model distribution if (par.notags) q->NeutralizeTags(); if (par.forward>=1) { if (v>=2 && par.forward==1) printf("Using Forward algorithm ...\n"); if (v>=2 &&par.forward==2) printf("Using maximum accuracy (MAC) alignment algorithm ...\n"); } else if (v>=3) printf("Using Viterbi algorithm ...\n"); // Prepare multi-threading - reserve memory for threads, intialize, etc. if (threads==0) bins=1; else bins=iround(threads*1.2+0.5); jobs_running = 0; jobs_submitted = 0; reading_dbs=1; // needs to be set to 1 before threads are created for (bin=0; binAllocateBacktraceMatrix(q->L+2,par.maxres); // ...with a separate dynamic programming matrix (memory!!) if (par.forward>=1) hit[bin]->AllocateForwardMatrix(q->L+2,par.maxres); if (par.forward==2) hit[bin]->AllocateBackwardMatrix(q->L+2,par.maxres); bin_status[bin] = FREE; } #ifdef PTHREAD // Start threads for database search for (int j=0; j* doubled; doubled = new(Hash); doubled->New(16381,0); char** dbfiles = new char*[par.maxnumdb+1]; char* dbfile_cur=strscn_(par.dbfiles); // current file name char* dbfile_next; // next file name after current while (*dbfile_cur && ndbContains(dbfile_cur)) { doubled->Add(dbfile_cur); if (!strcmp(dbfile_cur+strlen(dbfile_cur)-4,".pal")) { char dbfile[NAMELEN]=""; // input line FILE* palf = NULL; if (!strcmp(dbfile,"stdin")) palf=stdin; else { palf = fopen(dbfile_cur,"rb"); if (!palf) OpenFileError(dbfile_cur); } while(fgetline(dbfile,NAMELEN,palf) && ndbContains(dbfile)) { doubled->Add(dbfile); dbfiles[ndb]=new(char[strlen(dbfile)+1]); strcpy(dbfiles[ndb],dbfile); if (ndb<5 && ndb>0 && access(dbfiles[ndb],R_OK)) OpenFileError(dbfiles[ndb]); // file not readable? // printf("dbfiles[%i]='%s'\n",ndb,dbfiles[ndb]); ndb++; } else if (v>=1) fprintf(stderr,"WARNING: skipping doubled datbase file %s\n",dbfile); } fclose(palf); } else { dbfiles[ndb]=new(char[strlen(dbfile_cur)+1]); strcpy(dbfiles[ndb],dbfile_cur); if (ndb<5 && ndb>0 && access(dbfiles[ndb],R_OK)) OpenFileError(dbfiles[ndb]); // file not readable? // printf("dbfiles[%i]='%s'\n",ndb,dbfiles[ndb]); ndb++; } } else if (v>=1) fprintf(stderr,"WARNING: skipping doubled datbase file %s\n",dbfile_cur); dbfile_cur=dbfile_next; } //fprintf (stderr,"ndb: %i par.maxnumdb: %i\n",ndb,par.maxnumdb); if (v>=1 && ndb>=par.maxnumdb && *dbfiles[ndb-1]) fprintf (stderr,"WARNING: maximum of %i allowed databases surpassed. Skipping the rest.\n",par.maxnumdb); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Search databases // Initialize N_searched=0; v1=v; if (v>0 && v<=3) v=1; else v-=2; if (print_elapsed) ElapsedTimeSinceLastCall("(preparing for search)"); // For all the databases given in -d '...' option ... for (int idb=0; idbindex = N_searched; // give hit a unique index for HMM hit[bin]->ftellpos = ftell(dbf); // record position in dbfile of next HMM to be read char path[NAMELEN]; Pathname(path,dbfiles[idb]); /////////////////////////////////////////////////// // Read next HMM from database file if (!fgetline(line,LINELEN,dbf)) {read_from_db=0; break;} while (strscn(line)==NULL && fgetline(line,LINELEN,dbf)) {} // skip lines that contain only white space if (strscn(line)==NULL) break; if (!strncmp(line,"HMMER3",6)) // read HMMER3 format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer3(dbf,dbfiles[idb]); par.hmmer_used = true; } else if (!strncmp(line,"HMMER",5)) // read HMMER format { format[bin] = 1; read_from_db = t[bin]->ReadHMMer(dbf,dbfiles[idb]); par.hmmer_used = true; } else if (!strncmp(line,"HH",2)) // read HHM format { format[bin] = 0; read_from_db = t[bin]->Read(dbf,path); } else if (!strncmp(line,"NAME",4)) // The following lines are for backward compatibility of HHM format version 1.2 with 1.1 { fseek(dbf,hit[bin]->ftellpos,SEEK_SET); // rewind to beginning of line format[bin] = 0; read_from_db = t[bin]->Read(dbf,path); } else if (line[0]=='#') // read a3m alignment { Alignment tali; tali.Read(dbf,dbfiles[idb],line); tali.Compress(dbfiles[idb]); // qali.FilterForDisplay(par.max_seqid,par.coverage,par.qid,par.qsc,par.nseqdis); tali.N_filtered = tali.Filter(par.max_seqid_db,par.coverage_db,par.qid_db,par.qsc_db,par.Ndiff_db); char wg=par.wg; par.wg=1; // use global weights t[bin]->name[0]=t[bin]->longname[0]=t[bin]->fam[0]='\0'; tali.FrequenciesAndTransitions(t[bin]); par.wg=wg; //reset global weights format[bin] = 0; } else { cerr<=4) printf("Aligning with %s\n",t[bin]->name); /////////////////////v>=4 /////////////////////////////////////////////////// hit[bin]->dbfile = new(char[strlen(dbfiles[idb])+1]); strcpy(hit[bin]->dbfile,dbfiles[idb]); // record db file name from which next HMM is read ++N_searched; if (v1>=2 && !(N_searched%20)) { cout<<"."; if (!(N_searched%1000)) printf(" %-4i HMMs searched\n",N_searched); cout.flush(); } #ifdef PTHREAD // Lock access to bin_status if (threads>0) rc = pthread_mutex_lock(&bin_status_mutex); #endif // Send the job in bin to a thread bin_status[bin] = SUBMITTED; jobs_submitted++; if (threads==0) // if no multi-threading mode, main thread executes job itself { AlignByWorker(bin); bin_status[bin] = FREE; jobs_submitted--; break; } #ifdef PTHREAD // Restart threads waiting for a signal rc = pthread_cond_signal(&new_job); // Unlock access to bin_status rc = pthread_mutex_unlock(&bin_status_mutex); if (DEBUG_THREADS) fprintf(stderr,"Main: put job into bin %i name=%-7.7s Jobs running: %i jobs_submitted:%i \n",bin,t[bin]->name,jobs_running,jobs_submitted); #endif } #ifdef PTHREAD if (threads>0) { // Lock mutex rc = pthread_mutex_lock(&bin_status_mutex); // Wait until job finishes and a bin becomes free if (jobs_submitted+jobs_running>=bins) { if (DEBUG_THREADS) fprintf(stderr,"Master thread is waiting for jobs to be finished...\n"); #ifdef WINDOWS rc = pthread_cond_wait(&finished_job, &bin_status_mutex); #else #ifdef HH_MAC // If no submitted jobs are in the queue we have to wait for a new job ... struct timespec ts; struct timeval tv; gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + 1; rc = pthread_cond_timedwait(&finished_job, &bin_status_mutex,&ts); #else // If no submitted jobs are in the queue we have to wait for a new job ... struct timespec ts; clock_gettime(CLOCK_REALTIME,&ts); ts.tv_sec += 1; rc = pthread_cond_timedwait(&finished_job, &bin_status_mutex,&ts); #endif #endif } // Unlock mutex rc = pthread_mutex_unlock(&bin_status_mutex); } #endif } // end while(read_from_db!=0) /////////////////////////////////////////////////////////////////////////////////////// fclose(dbf); } reading_dbs=0; #ifdef PTHREAD if (threads>0) { // No more HMMs in database => wait until all threads have finished if (DEBUG_THREADS) fprintf(stderr,"No more jobs read from database Jobs running:%i jobs_submitted:%i \n",jobs_running,jobs_submitted); // Free all threads still waiting for jobs rc = pthread_mutex_lock(&bin_status_mutex); rc = pthread_cond_broadcast(&new_job); rc = pthread_mutex_unlock(&bin_status_mutex); // Unlock mutex // Wait for all jobs to finish => join all jobs to main for (int j=0; j=2) cout<<"\n"; v=v1; if (print_elapsed) ElapsedTimeSinceLastCall("(search through database)"); // Sort list according to sortscore if (v>=3) printf("Sorting hit list ...\n"); hitlist.SortList(); // Fit EVD (with lamda, mu) to score distribution? if (par.calm==3) { hitlist.CalculatePvalues(q); // Use NN prediction of lamda and mu } else if ((par.calm!=1 && q->lamda==0) || par.calibrate>0) { if (v>=2 && par.loc) printf("Fitting scores with EVD (first round) ...\n"); hitlist.MaxLikelihoodEVD(q,3); // first ML fit: exclude 3 best superfamilies from fit if (v>=3) printf("Number of families present in database: %i\n",hitlist.fams); // DEBUG if (hitlist.fams>=100) { if (par.loc) { if (v>=2) printf("Fitting scores with EVD (second round) ...\n"); hitlist.MaxLikelihoodEVD(q,0); // second ML fit: exclude superfamilies with E-value=2) fprintf(stderr,"WARNING: E-values for global alignment option may be unreliable.\n"); hitlist.ResortList(); } } else { if (v) { fprintf(stderr,"\nWARNING: no E-values could be calculated.\n"); fprintf(stderr,"To calculate E-values you have two options:\n"); fprintf(stderr,"1. Calibrate your query profile HMM with a calibration database:\n"); fprintf(stderr," > hhsearch -i yourHMM.hhm -d cal.hhm -cal\n"); fprintf(stderr," This will insert a line in yourHMM.hhm with lamda and mu of the score distribution.\n"); fprintf(stderr," cal.hhm contains 1220 HMMs from different SCOP superfamilies and is supplied with HHsearch.\n"); fprintf(stderr," Instead of cal.hhm you may also use any SCOP database file, e.g. scop70_1.69\n"); fprintf(stderr," Note that your HMM needs to be recalibrated when changing HMM-HMM alignment options.\n"); fprintf(stderr,"2. Append cal.hhm to your own database:\n"); fprintf(stderr," > cat cal.hhm >> yourDB.hhm\n"); fprintf(stderr," But note that HMMs contained in cal.hmm will pop up among your hits.\n"); } } if (par.calm==2) hitlist.GetPvalsFromCalibration(q); } else hitlist.GetPvalsFromCalibration(q); // Optimization mode? if (par.opt) hitlist.Optimize(q); // Set new ss weight for realign par.ssw = par.ssw_realign; // Realign hits with MAC algorithm if (par.realign && par.forward!=2) { perform_realign(dbfiles,ndb); } else { // Print for each HMM: n score -log2(Pval) L name (n=5:same name 4:same fam 3:same sf...) if (*par.scorefile) { if (v>=3) printf("Printing scores file ...\n"); } } // // Print for each HMM: n score -log2(Pval) L name (n=5:same name 4:same fam 3:same sf...) // if (*par.scorefile) { // if (v>=3) printf("Printing scores file ...\n"); // hitlist.PrintScoreFile(q); // } // Print FASTA or A2M alignments? if (*par.pairwisealisfile) { if (v>=2) cout<<"Printing alignments in "<<(par.outformat==1? "FASTA" : par.outformat==2?"A2M" :"A3M")<<" format to "<=1) fprintf(stderr,"WARNING: Using HMMER files results in a drastically reduced sensitivity (>10%%).\nWe recommend to use HHMs build by hhmake.\n"); // Print summary listing of hits if (v>=3) printf("Printing hit list ...\n"); hitlist.PrintHitList(q,par.outfile); // Write only hit list to screen? if (v==2 && strcmp(par.outfile,"stdout")) WriteToScreen(par.outfile,1009); // write only hit list to screen // Print alignments of query sequences against hit sequences hitlist.PrintAlignments(q,par.outfile); // Write whole output file to screen? (max 10000 lines) if (v>=3 && strcmp(par.outfile,"stdout")) WriteToScreen(par.outfile,10009); // Write HMM to output file without pseudocounts if (par.calibrate) q->InsertCalibration(par.infile); // Generate result alignment or HMM file? if (*par.alnfile || *par.psifile || *par.hhmfile) { Alignment Qali; // output A3M generated by merging A3M alignments for significant hits to the query alignment Hit hit; int nhits=0; // Read query alignment into Qali char qa3mfile[NAMELEN]; char ta3mfile[NAMELEN]; RemoveExtension(qa3mfile,par.infile); // directory?? strcat(qa3mfile,".a3m"); FILE* qa3mf=fopen(qa3mfile,"r"); if (!qa3mf) OpenFileError(qa3mfile); Qali.Read(qa3mf,qa3mfile); fclose(qa3mf); // If par.append==1 do not print query alignment if (par.append) Qali.MarkSeqsAsNonPrintable(); if (v>=2) printf("Merging hits to query alignment %s ...\n",qa3mfile); // If query consists of only one sequence: // realign templates to query HMM enforced by sequences from up to the 10 best templates v1=v--; // For each template below threshold hitlist.Reset(); while (!hitlist.End()) { hit = hitlist.ReadNext(); if (hit.Eval > 100.0*par.e) break; // E-value much too large if (hit.Eval > par.e) continue; // E-value too large // Read a3m alignment of hit from .a3m file and merge into Qali alignment strcpy(ta3mfile,hit.file); // copy filename including path but without extension strcat(ta3mfile,".a3m"); Alignment Tali; FILE* ta3mf=fopen(ta3mfile,"r"); if (!ta3mf) OpenFileError(ta3mfile); Tali.Read(ta3mf,ta3mfile); // Read template alignment into Tali fclose(ta3mf); Tali.Compress(ta3mfile); // Filter database alignment Qali.MergeMasterSlave(hit,Tali,ta3mfile); nhits++; } // Convert ASCII to int (0-20),throw out all insert states, record their number in I[k][i] Qali.Compress("merged A3M file"); // Sort out the nseqdis most dissimilar sequences for display in the result alignments Qali.FilterForDisplay(par.max_seqid,par.coverage,par.qid,par.qsc,par.nseqdis); v=v1; // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) float const COV_ABS = 25; // min. number of aligned residues int cov_tot = imax(imin((int)(COV_ABS / Qali.L * 100 + 0.5), 70), par.coverage); if (v>2) printf("Filter new alignment with cov %3i%%\n", cov_tot); Qali.N_filtered = Qali.Filter(par.max_seqid,cov_tot,par.qid,par.qsc,par.Ndiff); // Calculate (and write) output HMM? if (*par.hhmfile) { strcpy(Qali.longname,q->longname); strcpy(Qali.name,q->name); strcpy(Qali.fam,q->fam); RemovePathAndExtension(Qali.file,par.hhmfile); // Calculate pos-specific weights, AA frequencies and transitions -> f[i][a], tr[i][a] HMM* Q = new HMM; // output HMM: generated from Qali Qali.FrequenciesAndTransitions(Q); // Add *no* amino acid pseudocounts to query. This is necessary to copy f[i][a] to p[i][a] Q->AddAminoAcidPseudocounts(0, 0.0, 0.0, 1.0); Q->CalculateAminoAcidBackground(); // Write HMM to output file in HHsearch format? Q->WriteToFile(par.hhmfile); delete Q; } // Write output A3M alignment? if (*par.alnfile) Qali.WriteToFile(par.alnfile,"a3m"); // Write output PSI-BLAST-formatted alignment? if (*par.psifile) Qali.WriteToFile(par.psifile,"psi"); } // Write alignments with posteriors etc. to alitabfile? if (*par.alitabfile) { FILE* alitabf=NULL; if (strcmp(par.alitabfile,"stdout")) alitabf = fopen(par.alitabfile, "w"); else alitabf = stdout; if (!alitabf) OpenFileError(par.alitabfile); // Store all dbfiles and ftell positions of templates to be displayed and realigned int nhits=0; hitlist.Reset(); while (!hitlist.End()) { hit_cur = hitlist.ReadNext(); if (nhits>=imax(par.B,par.Z)) break; if (nhits>=imax(par.b,par.z) && hit_cur.Probab < par.p) break; if (nhits>=imax(par.b,par.z) && hit_cur.Eval > par.E) continue; fprintf(alitabf, ">%s\n", hit_cur.longname); WriteToAlifile(alitabf,&hit_cur); nhits++; } fclose(alitabf); } // Delete memory for dynamic programming matrix for (bin=0; binDeleteBacktraceMatrix(q->L+2); if (par.forward>=1 || par.realign) hit[bin]->DeleteForwardMatrix(q->L+2); if (par.forward==2 || par.realign) hit[bin]->DeleteBackwardMatrix(q->L+2); delete hit[bin]; delete t[bin]; } if (par.dbfiles) delete[] par.dbfiles; if (dbfiles) { for (int idb=0; idb=2) printf("Done\n"); } exit(0); } //end main ////////////////////////////////////////////////////////////////////////////////////////////////////// // END OF MAIN ////////////////////////////////////////////////////////////////////////////////////////////////////// hhsuite-2.0.16/src/util.C0000775172256617226630000010447612110430072017444 0ustar hauserscientific_computing// Utility subroutines #ifndef MAIN #include // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // exit #include // clock #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #endif #include #include #include #include #include // domain_error #include #include #include #include // strcmp, strstr #ifdef HH_SSE2 #ifndef __SUNPRO_C #include // SSE2 #else #include #endif #endif using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; ///////////////////////////////////////////////////////////////////////////////////// // Arithmetics ///////////////////////////////////////////////////////////////////////////////////// //// max and min inline double dmax(double x, double y) { return (x>y? x : y);} inline double dmin(double x, double y) { return (xy? x : y);} inline int imin(int x, int y) { return (x=0? x : -x);} // Rounding up, rounding down and rounding to nearest integer inline int iceil(double x) {return int(ceil(x));} inline int ifloor(double x) {return int(floor(x));} inline int iround(double x) {return int(floor(x+0.5));} //// Generalized mean: d=0: sqrt(x*y) d=1: (x+y)/2 d->-inf: min(x,y) d->+inf: max(x,y) inline double fmean(double x, double y, double d) { return pow( (pow(x,d)+pow(y,d))/2 ,1./d);} // log base 2 inline float log2(float x) {return (x<=0? (float)(-100000):1.442695041*log(x));} inline float log10(float x) {return (x<=0? (float)(-100000):0.434294481*log(x));} ///////////////////////////////////////////////////////////////////////////////////// // fast log base 2 ///////////////////////////////////////////////////////////////////////////////////// // Fast log2 // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // Maximum deviation: +/- 2.1E-5 // Run time: ~1.2E-8s on Intel core2 2.13GHz, log2(): 5.4E-8s // For a negative argument, -128 is returned. // The function makes use of the representation of 4-byte floating point numbers: // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // s is the sign, eee eee e gives the exponent + 127 (in hex: 0x7f). // The following 23 bits give the mantisse, the binary digits after the decimal // point: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeeee-127) // Therefore, log2(x) = eeeeeeee-127 + log2(1.mmmmmm...) // = eeeeeeee-127 + log2(1+y), where y = 0.mmmmmm... // ~ eeeeeeee-127 + ((a*y+b)*y+c)*y // The coefficients a, b were determined by a least squares fit, and c=1-a-b to get 1 at y=1. // Lower/higher order polynomials may be used for faster or more precise calculation: // Order 1: log2(1+y) ~ y // Order 2: log2(1+y) = (a*y + 1-a)*y, a=-0.3427 // => max dev = +/- 8E-3, run time ~ ? // Order 3: log2(1+y) = ((a*y+b)*y + 1-a-b)*y, a=0.1564, b=-0.5773 // => max dev = +/- 1E-3, run time ~ ? // Order 4: log2(1+y) = (((a*y+b)*y+c)*y + 1-a-b-c)*y, a=-0.0803 b=0.3170 c=-0.6748 // => max dev = +/- 1.4E-4, run time ~ ? // Order 5: log2(1+y) = ((((a*y+b)*y+c)*y+d)*y + 1-a-b-c-d)*y, // a=0.0440047 b=-0.1903190 c=0.4123442 d=-0.7077702 1-a-b-c-d=1.441740 // => max dev = +/- 2.1E-5, run time ~ 1.2E-8s inline float flog2(float x) { if (x<=0) return -128; int *px = (int*)(&x); // store address of float as pointer to long int float e = (float) (((*px & 0x7F800000) >>23 )-0x7f); // shift right by 23 bits and subtract 127 = 0x7f => exponent *px = ((*px & 0x007FFFFF) | 0x3f800000); // set exponent to 127 (i.e., 0) x -= 1.0; // and calculate x-1.0 x *= (1.441740 + x*(-0.7077702 +x*(0.4123442 +x*(-0.1903190+x*0.0440047)))); // 5'th order polynomial approx. of log(1+x) return x+e; } // Fast SSE2 log2 for four floats // Calculate integer of log2 for four floats in parallel with SSE2 // Maximum deviation: +/- 2.1E-5 // Run time: ~5.6ns on Intel core2 2.13GHz. // For a negative argument, nonsense is returned. Otherwise, when <1E-38, a value // close to -126 is returned and when >1.7E38, +128 is returned. // The function makes use of the representation of 4-byte floating point numbers: // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // s is the sign, eee eee e gives the exponent + 127 (in hex: 0x7f). // The following 23 bits give the mantisse, the binary digits after the decimal // point: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeeee-127) // Therefore, log2(x) = eeeeeeee-127 + log2(1.mmmmmm...) // = eeeeeeee-127 + log2(1+y), where y = 0.mmmmmm... // ~ eeeeeeee-127 + ((a*y+b)*y+c)*y // The coefficients a, b were determined by a least squares fit, and c=1-a-b to get 1 at y=1. // Lower/higher order polynomials may be used for faster or more precise calculation: // Order 1: log2(1+y) ~ y // Order 2: log2(1+y) = (a*y + 1-a)*y, a=-0.3427 // => max dev = +/- 8E-3, run time ~ 3.8ns // Order 3: log2(1+y) = ((a*y+b)*y + 1-a-b)*y, a=0.1564, b=-0.5773 // => max dev = +/- 1E-3, run time ~ 4.4ns // Order 4: log2(1+y) = (((a*y+b)*y+c)*y + 1-a-b-c)*y, a=-0.0803 b=0.3170 c=-0.6748 // => max dev = +/- 1.4E-4, run time ~ 5.0ns? // Order 5: log2(1+y) = ((((a*y+b)*y+c)*y+d)*y + 1-a-b-c-d)*y, a=0.0440047 b=-0.1903190 c=0.4123442 d=-0.7077702 // => max dev = +/- 2.1E-5, run time ~ 5.6ns? #ifdef HH_SSE2 __m128 _mm_flog2_ps(__m128 X) { const __m128i CONST32_0x7f = _mm_set_epi32(0x7f,0x7f,0x7f,0x7f); const __m128i CONST32_0x7fffff = _mm_set_epi32(0x7fffff,0x7fffff,0x7fffff,0x7fffff); const __m128i CONST32_0x3f800000 = _mm_set_epi32(0x3f800000,0x3f800000,0x3f800000,0x3f800000); const __m128 CONST32_1f = _mm_set_ps(1.0,1.0,1.0,1.0); // const float a=0.1564, b=-0.5773, c=1.0-a-b; // third order const float a=0.0440047, b=-0.1903190, c=0.4123442, d=-0.7077702, e=1.0-a-b-c-d; // fifth order const __m128 CONST32_A = _mm_set_ps(a,a,a,a); const __m128 CONST32_B = _mm_set_ps(b,b,b,b); const __m128 CONST32_C = _mm_set_ps(c,c,c,c); const __m128 CONST32_D = _mm_set_ps(d,d,d,d); const __m128 CONST32_E = _mm_set_ps(e,e,e,e); __m128i E; // exponents of X __m128 R; // result E = _mm_srli_epi32((__m128i) X, 23); // shift right by 23 bits to obtain exponent+127 E = _mm_sub_epi32(E, CONST32_0x7f); // subtract 127 = 0x7f X = (__m128) _mm_and_si128((__m128i) X, CONST32_0x7fffff); // mask out exponent => mantisse X = (__m128) _mm_or_si128((__m128i) X, CONST32_0x3f800000); // set exponent to 127 (i.e., 0) X = _mm_sub_ps(X, CONST32_1f); // subtract one from mantisse R = _mm_mul_ps(X, CONST32_A); // R = a*X R = _mm_add_ps(R, CONST32_B); // R = a*X+b R = _mm_mul_ps(R, X); // R = (a*X+b)*X R = _mm_add_ps(R, CONST32_C); // R = (a*X+b)*X+c R = _mm_mul_ps(R, X); // R = ((a*X+b)*X+c)*X R = _mm_add_ps(R, CONST32_D); // R = ((a*X+b)*X+c)*X+d R = _mm_mul_ps(R, X); // R = (((a*X+b)*X+c)*X+d)*X R = _mm_add_ps(R, CONST32_E); // R = (((a*X+b)*X+c)*X+d)*X+e R = _mm_mul_ps(R, X); // R = ((((a*X+b)*X+c)*X+d)*X+e)*X ~ log2(1+X) !! R = _mm_add_ps(R, _mm_cvtepi32_ps(E)); // convert integer exponent to float and add to mantisse return R; } #endif // This function returns log2 with a max absolute deviation of +/- 1.5E-5 (typically 0.8E-5). // It takes 0.80E-8 s whereas log2(x) takes 5.4E-7 s. It is hence 9.4 times faster. // It makes use of the representation of 4-byte floating point numbers: // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // s is the sign, // the following 8 bits, eee eee e, give the exponent + 127 (in hex: 0x7f). // The following 23 bits give the mantisse, the binary digits after the decimal // point: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeeee-127) // In the code, *(int *)&x is an integer which contains the bytes as the // floating point variable x is represented in memory. The expression // (((*(int *)&x) & 0x7f800000 ) >>23 )-0x7f is the exponent eeeeeeee, // i.e., the largest integer that is smaller than log2(x) (e.g. -1 for 0.9). inline float fast_log2(float x) { static float lg2[1025]; // lg2[i] = log2[1+x/1024] static float diff[1025]; // diff[i]= (lg2[i+1]-lg2[i])/8096 (for interpolation) static char initialized=0; if (x<=0) return -100000; if (!initialized) //First fill in the arrays lg2[i] and diff[i] { float prev = 0.0f; lg2[0] = 0.0f; for (int i=1; i<=1024; ++i) { lg2[i] = log(float(1024+i))*1.442695041-10.0f; diff[i-1] = (lg2[i]-prev)*1.2352E-4; prev = lg2[i]; } initialized=1; } int a = (((*((int *)&x)) & 0x7F800000) >>23 )-0x7f; // exponent int b = ((*((int *)&x)) & 0x007FE000) >>13; // first 10 bits of mantisse int c = ((*((int *)&x)) & 0x00001FFF); // further 13 bits of mantisse return a + lg2[b] + diff[b]*(float)(c); } // This function returns log gamma and uses fast lookup table for computation. // This function returns log gamma with a max abolute deviation of +/- 1E-5. // It makes use of the representation of 4-byte floating point numbers: // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // s is the sign, // the following 8 bits, eee eee e, give the exponent + 127 (in hex: 0x7f). // The following 23 bits, m, give the mantisse, the binary digits behind the decimal point. // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) // The expression (((*(int *)&x) & 0x7f800000 ) >>23 )-0x7f is the exponent eeeeeeee, i.e. // the largest integer that is smaller than log2(x) (e.g. -1 for 0.9). *(int *)&x is an integer which // contains the bytes as the floating point variable x is represented in memory. // Check: assert( sizeof(f) == sizeof(int) ); // Check: assert( sizeof(f) == 4 ); inline float fast_log_gamma(float x) { static float log_gamma[1025]; // log_gamma[i] = lgammaf(1+x/1024) static float diff[1025]; // diff[i]= (lg2[i+1]-lg2[i])/8096 (for interpolation) static char initialized=0; if (!initialized) { //First fill in the arrays log_gamma[i] and diff[i] assert(x>=1.0); assert( sizeof(x) == sizeof(int) ); assert( sizeof(x) == 4 ); float prev = 0.0f; log_gamma[0] = 0.0f; for (int i=1; i<=1024; ++i) { log_gamma[i] = lgammaf(1.0f + i*9.765625E-4); diff[i-1] = (log_gamma[i]-prev)*1.2352E-4; prev = log_gamma[i]; } initialized=1; } float res = 1.0f; float lres = 0.0f; while (x>=2.0f) { x -= 1.0; res *= x; if (res>1E30) { lres += fast_log2(res); res = 1.0f; } } int b = ((*((int *)&x)) & 0x007FE000) >>13; // exponent must be 0 int c = ((*((int *)&x)) & 0x00001FFF); return (lres + fast_log2(res) ) * 0.6931471806 + log_gamma[b] + diff[b]*(float)(c); } ///////////////////////////////////////////////////////////////////////////////////// // fast 2^x // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // Relative deviation < 4.6E-6 (< 2.3E-7 with 5'th order polynomial) // Speed: 2.1E-8s (2.3E-8s) per call! (exp(): 8.5E-8, pow(): 1.7E-7) // Internal representation of float number according to IEEE 754: // 1bit sign, 8 bits exponent, 23 bits mantissa: seee eeee emmm mmmm mmmm mmmm mmmm mmmm // 0x4b400000 = 0100 1011 0100 0000 0000 0000 0000 0000 // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) ///////////////////////////////////////////////////////////////////////////////////// inline float fpow2(float x) { if (x>FLT_MAX_EXP) return FLT_MAX; if (x= w-neg-1 || -log10val > 3) { // positive exponential 1.234E+06 // negative exponential 1.234E-06 int d = w-6-neg; sprintf(str,"%*.*e",w,d<1?1:d,val); } else { int d = log10val>0? w-2-neg-int(log10val): w-2-neg; sprintf(str,"%#*.*f",w,d,val); } return str; } ///////////////////////////////////////////////////////////////////////////////////// // String utilities ///////////////////////////////////////////////////////////////////////////////////// // Safe strcpy command that limits copy to a maximum of maxlen+1 characters // including the '\0' character. // (Different from standard strncpy, which pads with \0 characters) // Returns maxlen minus the number of non-\0 characters copied // If the string is cut prematurely it will return 0! inline int strmcpy(char* dest, const char* source, size_t maxlen) { while (*source && (maxlen--)>0) *dest++ = *source++; *dest = '\0'; return maxlen; } // Scans string for integer number starting from ptr and returns this number. // The ptr will then be moved to the first position after the integer number. // If no integer number is found, it returns INT_MIN and sets ptr to NULL. inline int strtoi(const char*& ptr) { int i; const char* ptr0=ptr; if (!ptr) return INT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; if (*ptr=='\0') { ptr=0; return INT_MIN; } if (*(ptr-1)=='-' && ptr>ptr0) i=-atoi(ptr); else i=atoi(ptr); while (*ptr>='0' && *ptr<='9') ptr++; return i; } //Same as strint, but interpretes '*' as default inline int strtoi_(const char*& ptr, int deflt=INT_MAX) { int i; if (!ptr) return INT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; if (*ptr=='\0') { ptr=0; return INT_MIN; } if (*ptr=='*') { ptr++; return deflt; } if (*(ptr-1)=='-') i=atoi(ptr-1); else i=atoi(ptr); while (*ptr>='0' && *ptr<='9') ptr++; return i; } // Returns leftmost integer in ptr and sets the pointer to first char after // the integer. If no integer is found, returns INT_MIN and sets pt to NULL int strint(char*& ptr) { int i; char* ptr0=ptr; if (!ptr) return INT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; if (*ptr=='\0') { ptr=0; return INT_MIN; } if (ptr>ptr0 && *(ptr-1)=='-') i=-atoi(ptr); else i=atoi(ptr); while (*ptr>='0' && *ptr<='9') ptr++; return i; } // Same as strint, but interpretes '*' as default int strinta(char*& ptr, int deflt=99999) { int i; if (!ptr) return INT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; if (*ptr=='\0') { ptr=0; return INT_MIN; } if (*ptr=='*') { ptr++; return deflt; } if (*(ptr-1)=='-') i=atoi(ptr-1); else i=atoi(ptr); while (*ptr>='0' && *ptr<='9') ptr++; return i; } // Returns leftmost float in ptr and sets the pointer to first char after // the float. If no float is found, returns FLT_MIN and sets pt to NULL float strflt(char*& ptr) { float i; char* ptr0=ptr; if (!ptr) return FLT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; if (*ptr=='\0') { ptr=0; return FLT_MIN; } if (ptr>ptr0 && *(ptr-1)=='-') i=-atof(ptr); else i=atof(ptr); while ((*ptr>='0' && *ptr<='9') || *ptr=='.') ptr++; return i; } // Same as strint, but interpretes '*' as default float strflta(char*& ptr, float deflt=99999) { float i; if (!ptr) return FLT_MIN; while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; if (*ptr=='\0') { ptr=0; return FLT_MIN; } if (*ptr=='*') { ptr++; return deflt; } if (*(ptr-1)=='-') i=-atof(ptr); else i=atof(ptr); while ((*ptr>='0' && *ptr<='9') || *ptr=='.') ptr++; return i; } // Removes the newline and other control characters at the end of a string (if present) // and returns the new length of the string (-1 if str is NULL) inline int chomp(char str[]) { if (!str) return -1; int l=0; for (l=strlen(str)-1; l>=0 && str[l]<32; l--); str[++l]='\0'; return l; } // Emulates the ifstream::getline method; similar to fgets(str,maxlen,FILE*), // but removes the newline at the end and returns NULL if at end of file or read error inline char* fgetline(char str[], const int maxlen, FILE* file) { if (!fgets(str,maxlen,file)) return NULL; if (chomp(str)+1>=maxlen) // if line is cut after maxlen characters... while (fgetc(file)!='\n'); // ... read in rest of line return(str); } // copies substring str[a,b] into substr and returns substr char *substr(char* substr, char* str, int a, int b) { if (b1000) {printf("Function substr: >1000 chars to copy. Exiting.\n"); exit(6);} char* dest=substr; char* source=str+a; char* send=str+b; while (*source!='\0' && source<=send) *(dest++) = *(source++); *dest='\0'; return substr; } // Returns pointer to first non-white-space character in str OR to NULL if none found inline char* strscn(char* str) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr<=32) ptr++; return (*ptr=='\0')? NULL: ptr; } // Returns pointer to first white-space character in str OR to NULL if none found inline char* strscn_ws(char* str) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr>32) ptr++; return (*ptr=='\0')? NULL: ptr; } //Returns pointer to first non-white-space character in str OR to NULL if none found inline const char* strscn_c(const char* str) { if (!str) return NULL; const char* ptr=str; while (*ptr!='\0' && isspace(*ptr)) ptr++; return (*ptr=='\0') ? NULL : ptr; } // Returns pointer to first non-white-space character in str OR to end of string '\0' if none found inline char* strscn_(char* str) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr<=32) ptr++; return ptr; } // Returns pointer to first non-c character in str OR to NULL if none found inline char* strscn(char* str, const char c) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr==c) ptr++; return (*ptr=='\0')? NULL: ptr; } // Returns pointer to first non-c character in str OR to end of string '\0' if none found inline char* strscn_(char* str, const char c) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr==c) ptr++; return ptr; } // Cuts string at first white space character found by overwriting it with '\0'. // Returns pointer to next non-white-space char OR to NULL if no such char found inline char* strcut(char* str) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr>32) ptr++; if (*ptr=='\0') return NULL; *ptr='\0'; ptr++; while (*ptr!='\0' && *ptr<=32) ptr++; return (*ptr=='\0')? NULL:ptr; } // Cuts string at first white space character found by overwriting it with '\0'. // Returns pointer to next non-white-space char OR to end of string '\0' if none found inline char* strcut_(char* str) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr>32) ptr++; if (*ptr=='\0') return ptr; *ptr='\0'; ptr++; while (*ptr!='\0' && *ptr<=32) ptr++; return ptr; } // Cuts string at first occurence of charcter c, by overwriting it with '\0'. // Returns pointer to next char not equal c, OR to NULL if none found inline char* strcut(char* str, const char c) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr!=c) ptr++; if (*ptr=='\0') return NULL; *ptr='\0'; ptr++; while (*ptr!='\0' && *ptr==c) ptr++; return (*ptr=='\0')? NULL:ptr; } // Cuts string at first occurence of charcter c, by overwriting it with '\0'. // Returns pointer to next char not equal c, OR to end of string '\0' if none found inline char* strcut_(char* str, const char c) { if (!str) return NULL; char* ptr=str; while (*ptr!='\0' && *ptr!=c) ptr++; if (*ptr=='\0') return ptr; *ptr='\0'; ptr++; while (*ptr!='\0' && *ptr==c) ptr++; return ptr; } // Cuts string at first occurence of substr, by overwriting the first letter with '\0'. // Returns pointer to next char after occurence of substr, OR to NULL if no such char found inline char* strcut(char* str, const char* substr) { char* ptr; //present location in str being compared to substr const char* sptr=substr; //present location in substr being compared to substr // while not at end of str and not all of substr is matched yet while (1) { for (ptr=str, sptr=substr; *ptr==*sptr && *ptr!='\0'; ptr++, sptr++) ; if (*sptr=='\0') {*str='\0'; return ptr;} if (*ptr=='\0') return NULL; str++; } } // Cuts string at first occurence of substr, by overwriting the first letter with '\0'. // Returns pointer to next char after occurence of substr, OR to end of string '\0' if no such char found inline char* strcut_(char* str, const char* substr) { char* ptr; //present location in str being compared to substr const char* sptr=substr; //present location in substr being compared to str // while not at end of str and not all of substr is matched yet while (1) { for (ptr=str, sptr=substr; *ptr==*sptr && *ptr!='\0'; ptr++, sptr++) ; if (*sptr=='\0') {*str='\0'; return ptr;} if (*ptr=='\0') return ptr; str++; } } // Copies first word in ptr to str. In other words, copies first block of non whitespace characters, // beginning at ptr, to str. If a word is found, returns address of second word in ptr or, if no second // word is found, returns address to end of word ('\0' character) in ptr string. If no word is found // in ptr NULL is returned. inline char* strwrd(char* str, char* ptr) { ptr=strscn(ptr); // advance to beginning of next word if (ptr) { while (*ptr!='\0' && *ptr>32) *(str++) = *(ptr++); *str='\0'; while (*ptr!='\0' && *ptr<=32) ptr++; return ptr; } else return NULL; } // Copies first word in ptr to str. In other words, copies first block of non whitespace characters, // beginning at ptr, to str. If a word is found, returns address of second word in ptr or, if no second // word is found, returns address to end of word ('\0' character) in ptr string. If no word is found // in ptr NULL is returned. inline char* strwrd(char* str, char* ptr, int maxlen) { ptr=strscn(ptr); // advance to beginning of next word if (ptr) { while (*ptr!='\0' && *ptr>32 && (maxlen--)>0) *(str++) = *(ptr++); *str='\0'; while (*ptr!='\0' && *ptr<=32) ptr++; return ptr; } else return NULL; } // Copies first word ***delimited by char c*** in ptr to str. In other words, copies first block of non-c characters, // beginning at ptr, to str. If a word is found, returns address of second word in ptr or, if no second // word is found, returns address to end of word ('\0' character) in ptr string. If no word is found // in ptr NULL is returned. inline char* strwrd(char* str, char* ptr, const char c) { ptr=strscn(ptr,c); // advance to beginning of next word if (ptr) { while (*ptr!='\0' && *ptr!=c) *(str++) = *(ptr++); *str='\0'; while (*ptr!='\0' && *ptr==c) ptr++; return ptr; } else return NULL; } // Similar to Perl's tr/abc/ABC/: Replaces all chars in str found in one list with characters from the second list // Returns the number of replaced characters int strtr(char* str, const char oldchars[], const char newchars[]) { char* ptr; const char *plist; int ntr=0; for (ptr=str; *ptr!='\0'; ptr++) for (plist=oldchars; *plist!='\0'; plist++) if (*ptr==*plist) { *ptr=newchars[plist-oldchars]; ntr++; break; } return ntr; } // Similar to Perl's tr/abc//d: deletes all chars in str found in the list // Returns number of removed characters int strtrd(char* str, const char chars[]) { char* ptr0=str; char* ptr1=str; const char *plist; while (*ptr1!='\0') { for (plist=chars; *plist!='\0'; plist++) if (*ptr1==*plist) break; if (*plist=='\0') {*ptr0=*ptr1; ptr0++;} ptr1++; } *ptr0=*ptr1; return ptr1-ptr0; } // Similar to Perl's tr/a-z//d: deletes all chars in str found in the list // Returns number of removed characters int strtrd(char* str, char char1, char char2) { char* ptr0=str; char* ptr1=str; while (*ptr1!='\0') { if (*ptr1>=char1 && *ptr1<=char2) {*ptr0=*ptr1; ptr0++;} ptr1++; } *ptr0=*ptr1; return ptr1-ptr0; } // Counts the number of characters in str that are in range between char1 and char2 int strcount(char* str, char char1, char char2) { char* ptr=str; int count=0; while (*ptr!='\0') { if (*ptr>=char1 && *ptr<=char2) count++; ptr++; } return count; } // transforms str into an all uppercase string char* uprstr(char* str) { char* s=str; while (*s !='\0') {if (*s>='a' && *s<='z') *s+='A'-'a';s++;} return(str); } // transforms str into an all uppercase string char* lwrstr(char* str) { char* s=str; while (*s !='\0') {if (*s>='A' && *s<='Z') *s+='a'-'A'; s++;} return(str); } // transforms chr into an uppercase character inline char uprchr(char chr) { return (chr>='a' && chr<='z')? chr+'A'-'a' : chr; } // transforms chr into an lowercase character inline char lwrchr(char chr) { return (chr>='A' && chr<='Z')? chr-'A'+'a' : chr; } // Replaces first occurence of str1 by str2 in str. Returns pointer to first occurence or NULL if not found // ATTENTION: if str2 is longer than str1, allocated memory of str must be long enough!! inline char* strsubst(char* str, const char str1[], const char str2[]) { char* ptr = strstr(str,str1); strcpy(ptr,str2); return ptr; } // Gives elapsed time since first call to this function inline void ElapsedTimeSinceFirstCall(const char str[]) { timeval t; static double tfirst=0; if (tfirst==0) { gettimeofday(&t, NULL); tfirst = 1E-6*t.tv_usec + t.tv_sec; } gettimeofday(&t, NULL); printf("Elapsed time since first call:%12.3fs %s\n",1E-6*t.tv_usec + t.tv_sec - tfirst,str); } // Gives elapsed time since last call to this function inline void ElapsedTimeSinceLastCall(const char str[]) { timeval t; static double tlast=0.0; if (tlast==0.0) { gettimeofday(&t, NULL); tlast = 1.0E-6*t.tv_usec + t.tv_sec; } gettimeofday(&t, NULL); printf("Elapsed time since last call:%12.3fs %s\n",1.0E-6*t.tv_usec + t.tv_sec - tlast,str); tlast = 1.0E-6*t.tv_usec + t.tv_sec; } inline char* RemovePath(char outname[], char filename[]) { char* ptr; #ifdef WINDOWS ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name #else ptr=strrchr(filename,'/'); //return adress for LAST / in name #endif if (!ptr) ptr=filename; else ptr++; strcpy(outname,ptr); return outname; } inline char* RemoveExtension(char outname[], char filename[]) { char *ptr1; ptr1=strrchr(filename,'.'); //return adress for LAST '.' in name if (ptr1) {*ptr1='\0'; strcpy(outname,filename); *ptr1='.';} else strcpy(outname,filename); return outname; } inline char* RemovePathAndExtension(char outname[], char filename[]) { char *ptr, *ptr1; #ifdef WINDOWS ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name #else ptr=strrchr(filename,'/'); //return adress for LAST / in name #endif if (!ptr) ptr=filename; else ptr++; ptr1=strrchr(filename,'.'); //return adress for LAST '.' in name if (ptr1) {*ptr1='\0'; strcpy(outname,ptr); *ptr1='.';} else strcpy(outname,ptr); return outname; } inline char* Extension(char extension[], char filename[]) { char* ptr; ptr=strrchr(filename,'.'); //return adress for LAST '.' in name if (ptr) strcpy(extension,ptr+1); else *extension='\0'; return extension; } // Path includes last '/' inline char* Pathname(char pathname[], char filename[]) { char* ptr; char chr; #ifdef WINDOWS ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name #else ptr=strrchr(filename,'/'); //return adress for LAST / in name #endif if (ptr) {chr=*(++ptr); *ptr='\0'; strcpy(pathname,filename); *ptr=chr;} else *pathname='\0'; return pathname; } // Swaps two integer elements in array k inline void swapi(int k[], int i, int j) { int temp; temp=k[i]; k[i]=k[j]; k[j]=temp; } // QSort sorting routine. time complexity of O(N ln(N)) on average // Sorts the index array k between elements i='left' and i='right' in such a way that afterwards // v[k[i]] is sorted downwards (up=-1) or upwards (up=+1) void QSortInt(int v[], int k[], int left, int right, int up=+1) { int i; int last; // last element to have been swapped if (left>=right) return; // do nothing if less then 2 elements to sort // Put pivot element in the middle of the sort range to the side (to position 'left') ... swapi(k,left,(left+right)/2); last=left; // ... and swap all elements i SMALLER than the pivot // with an element that is LARGER than the pivot (element last+1): if (up==1) { for (i=left+1; i<=right; i++) if (v[k[i]]v[k[left]]) swapi(k,++last,i); // Put the pivot to the right of the elements which are SMALLER, left to elements which are LARGER swapi(k,left,last); // Sort the elements left from the pivot and right from the pivot QSortInt(v,k,left,last-1,up); QSortInt(v,k,last+1,right,up); } // QSort sorting routine. time complexity of O(N ln(N)) on average // Sorts the index array k between elements i='left' and i='right' in such a way that afterwards // v[k[i]] is sorted downwards (up=-1) or upwards (up=+1) void QSortFloat(float v[], int k[], int left, int right, int up=+1) { int i; int last; // last element to have been swapped void swapi(int k[], int i, int j); if (left>=right) return; // do nothing if less then 2 elements to sort // Put pivot element in the middle of the sort range to the side (to position 'left') ... swapi(k,left,(left+right)/2); last=left; // ... and swap all elements i SMALLER than the pivot // with an element that is LARGER than the pivot (element last+1): if (up==1) { for (i=left+1; i<=right; i++) if (v[k[i]]v[k[left]]) swapi(k,++last,i); // Put the pivot to the right of the elements which are SMALLER, left to elements which are LARGER swapi(k,left,last); // Sort the elements left from the pivot and right from the pivot QSortFloat(v,k,left,last-1,up); QSortFloat(v,k,last+1,right,up); } //Return random number in the range [0,1] inline float frand() { return rand()/(RAND_MAX+1.0); } hhsuite-2.0.16/src/hhsuite-userguide.tex0000775172256617226630000047431212110430072022547 0ustar hauserscientific_computing% ???? % TO DO: % Include description of how to visualize MSAs using hhfilter and reformat! %\documentclass[final,1p,times]{elsarticle} \documentclass[11pt,a4paper]{article} \usepackage{url} \usepackage{cite} \usepackage{longtable} \usepackage{graphicx} \setlength{\parindent}{0mm} \setlength{\oddsidemargin}{-2mm} \setlength{\oddsidemargin}{-2mm} \setlength{\topmargin}{0mm} \setlength{\textheight}{245mm} \setlength{\textwidth}{165mm} \setlength{\headheight}{0mm} \setlength{\headsep}{0mm} \setlength{\parskip}{3mm} \usepackage{bookmark,hyperref} \hypersetup{ % bookmarks=true, % show bookmarks bar? unicode=true, % non-Latin characters in Acrobat’s bookmarks pdftoolbar=true, % show Acrobat’s toolbar? pdfmenubar=true, % show Acrobat’s menu? pdffitwindow=false, % window fit to page when opened pdfstartview={FitH}, % fits the width of the page to the window pdftitle={HH-suite User Guide}, % title pdfauthor={Johannes S\"oding}, % author pdfsubject={HH-suite for sensitive sequence searching based on HMM-HMM alignment}, % subject of the document pdfnewwindow=true, % links in new window colorlinks=true, % false: boxed links; true: colored links linkcolor=black, % color of internal links citecolor=black, % color of links to bibliography % filecolor=black, % color of file links % urlcolor=black, % color of external links } %\urlstyle{same} % show urls using the same font as the text \newcommand{\hhversion}{Version 2.0.16, January 2013} %\title{HH-suite for sensitive sequence searching\\[2mm] based on HMM-HMM alignment} \begin{document} \bibliographystyle{elsarticle-num} %\maketitle \begin{center} \vspace{20mm} {\huge \bf HH-suite for sensitive protein sequence\\[2mm] searching based on HMM-HMM alignment}\\[4mm] {\Large \bf User Guide} \hhversion\\[2mm] {\copyright Johannes S\"oding, Michael Remmert, Andreas Hauser, Markus Meier, Andreas Biegert, Christof Angerm\"uller, and Martin Steinegger}\\[2mm] Available under the GNU Public License (version 3)\\[2mm] We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de {\bf \Large Summary} \end{center} \noindent The HH-suite is an open-source software package for sensitive protein sequence searching based on the pairwise alignment of hidden Markov models (HMMs). It contains HHsearch [1] and HHblits [2] among other programs and utilities. HHsearch takes as input a multiple sequence alignment (MSA) or profile HMM and searches a database of HMMs (e.g.\ PDB, Pfam, or InterPro) for homologous proteins. HHsearch is often used for protein structure prediction to detect homologous templates and to build highly accurate query-template pairwise alignments for homology modeling. In the CASP9 competition (2010), a fully automated version of HHpred based on HHsearch and HHblits was ranked best out of 81 servers in template-based structure prediction. HHblits can build high-quality MSAs starting from single sequences or from MSAs. It transforms these into a query HMM and iteratively searches through uniprot20 or nr20 databases by adding significantly similar sequences from the previous search to the updated query HMM for the next search iteration. Compared to PSI-BLAST, HHblits is faster, up to twice as sensitive and produces more accurate alignments. HHblits uses the same HMM-HMM alignment algorithms as HHsearch, but it employs a fast prefilter that reduces the number of database HMMs for which to perform the slow HMM-HMM comparison from tens of millions to a few thousands. \\[2mm] {\bf References:} \begin{tabular}[t]{ll} [1] & S\"oding J. (2005)\\ & Protein homology detection by HMM-HMM comparison.\\ & {\it Bioinformatics} {\bf 21}, 951-960.\\[2mm] [2] & Remmert M., Biegert A., Hauser A., and S\"oding J. (2011) \\ & HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. \\ & {\it Nat.\ Methods} {\bf 9}, 173-175.\\ \end{tabular} \newpage \setlength{\parskip}{0mm} \tableofcontents \setlength{\parskip}{2mm} \newpage \section{Introduction} The HH-suite is an open-source software package for highly sensitive sequence searching and sequence alignment. Its two most important programs are HHsearch and HHblits. Both are based on the pairwise comparison of \textit{profile hidden Markov models} (HMMs). Profile HMMs are a concise representation of \textit{multiple sequence alignments} (MSAs) \cite{Durbin:2008,Krogh:1994}. Like sequence profiles, they contain for each position in the master sequence the probabilities to observe each of the 20 amino acids in homologous proteins. The amino acid distributions for each column are extrapolated from the homologous sequences in the MSA by adding \textit{pseudocounts} to the amino acid counts observed in the MSA. Unlike sequence profiles, profile HMMs also contain position-specific gap penalties. More precisely, they contain for each position in the master sequence the probability to observe an insertion or a deletion after that position (the log of which corresponds to gap-open penalties) and the probabilities to extend the insertion or deletion (the log of which corresponds to gap-extend penalties). A profile HMM is thus much better suited than a single sequence to find homologous sequences and calculate accurate alignments. By representing both the query sequence and the database sequences by profile HMMs, HHsearch and HHblits are more sensitive for detecting and aligning remotely homologous proteins than methods based on pairwise sequence comparison or profile-sequence comparison. HHblits can build high-quality multiple sequence alignments (MSAs) starting from a single sequence or from an MSA. Compared to PSI-BLAST \cite{Altschul:1997}, HHblits is faster, finds up to two times more homologous proteins and produces more accurate alignments. It uses an iterative search strategy, adding sequences from significantly similar database HMMs from a previous search iteration to the query HMM for the next search. Because HHblits is based on the pairwise alignment of profile HMMs, it needs its own type of databases that contain multiple sequence alignments and the corresponding profile HMMs instead of single sequences. The HHblits/HHsuite databases uniprot20 and nr20 are generated regularly by clustering the UniProt database \cite{uniprot:2010} from EBI/SIB/PIR and the nonredundant (nr) database from the NCBI into groups of similar sequences alignable over at least 80 \% of their length and down to $\sim 20 \%$ pairwise sequence identity. These databases can be downloaded together with HHblits. HHblits uses the HMM-HMM alignment algorithms in HHsearch, but it employs a fast prefilter (based partly on code from Michael Farrar, \cite{Farrar:2007}) that reduces the number of database HMMs for which to perform the slow HMM-HMM comparison from tens of millions to a few thousands. At the same time, the prefilter is sensitive enough to reduce the sensitivity of HHblits only marginally in comparison to HHsearch. By generating highly accurate and diverse MSAs, HHblits can improve almost all downstream sequence analysis methods, such as the prediction of secondary and tertiary structure \cite{Jones:1999, Marks:2011}, of membrane helices, functionally conserved residues, binding pockets, protein interaction interfaces, or short linear motifs. The accuracy of all these methods depends critically on the accuracy and the diversity of the underlying MSAs, as too few or too similar sequences do not add significant information for the predictions. As an example, running the popular PSIPRED secondary structure prediction program \cite{Jones:1999} on MSAs generated by HHblits instead of PSI-BLAST improved the accuracy of PSIPRED significantly even without retraining PSIPRED on the HHblits alignments \cite{Remmert:2011}. HHsearch takes as input an MSA (e.g.\ built by HHblits) or a profile HMM and searches a database of HMMs for homologous proteins. Many HHsearch databases can be downloaded (see next section). The pdb70 database, for instance, consists of profile HMMs for a set of representative sequences from the PDB database \cite{PDB:2004}; the scop70 database has profile HMMs for representative domain sequences from the SCOP database of structural domains \cite{SCOP:2000}; the Pfam \cite{Finn:2010}, InterPro \cite{Hunter:2009} and CDD \cite{Marchler:2011} domain databases are large collections of curated MSAs and profile HMMs for conserved, functionally annotated domains. HHsearch is often used to predict the domain architectures and the functions of domains in proteins by finding similarities to domains in the pdb70, Pfam, InterPro or other databases. In addition to the command line package described here, two interactive web servers at \url{http://hhpred.tuebingen.mpg.de} \cite{Soding:2005b, Hildebrand:2009} and \url{http://hhblits.genzentrum.lmu.de} run HHsearch and HHblits. They offer extended functionality, such as Jalview applets for checking query and template alignments, histogram views of alignments, and building 3D models with MODELLER \cite{Sali:1993}. In the CASP9 competition (Critical Assessment of Techniques for Protein Structure Prediction) in 2010, a fully automated version of HHpred based on HHsearch and HHblits was ranked best out of the 81 servers in template-based structure prediction, the category most relevant for biological applications, while having an average response time of minutes instead of days like most other servers \cite{Mariani:2011} (\url{http://predictioncenter.org/casp9/groups_analysis.cgi?type=server&tbm=on}). Other popular programs for sensitive, iterative protein sequence searching are PSI-BLAST \cite{Altschul:1997} and HMMER (\url{http://hmmer.org/}). Since they are based on profile-to-sequence and HMM-to-sequence comparison, respectively, they have the advantage over HHblits and HHsearch of being able to search raw sequence databases. \section{Installation of the HH-suite and its databases} The HH-suite source code, executable RPM and DPKG packages for most Linux 64 bit platforms, MAC OS X, and BSD Unix, utility scripts in Perl, and databases can be downloaded at \begin{verbatim} ftp://toolkit.genzentrum.lmu.de/HH-suite/ \end{verbatim} \subsection{Supported platforms} \label{installation} HH-suite has been extensively tested on Linux, in particular Debian, Ubuntu, Scientific Linux (SL), and Red Hat. We have done limited testing under BSD, MAX OS X, and CygWin. We plan to offer a Windows version compiled under MinGW in the future. \subsubsection*{Support for SSE2 instruction set} HHblits needs to run on CPUs supporting at least the SSE2 (serial SIMD extension 2) instruction set. (See \url{http://en.wikipedia.org/wiki/SSE2} for an explanation of SSE2.) Starting with the Pentium 4 in 2001, all Intel CPUs support SSE2. AMD introduced SSE2 with their Opteron and Athlon 64 ranges of AMD64 64-bit CPUs in 2003. By default, the HH-suite binaries are compiled using the SSE3 instruction set, which is a minor extension of the SSE2 set. Intel introduced SSE3 in early 2004 with the Prescott revision of their Pentium 4 CPU. AMD introduced SSE3 in revision E (Venice and San Diego) of their Athlon 64 CPUs in April 2005. A simple way to find out if your computer's CPU supports SSE3 is to run the \verb`hhblits` binary and see if you get an ```Illegal instruction'' error. If your computer's CPU does support SSE2 but not SSE3, the precompiled standard binaries will not work, but you can build the HH-suite from sources by running \verb`make NO_SSE3=1` with the \verb`NO_SSE3` flag set (see next subsection). There will be no disadvantages except for a slightly (1\%-2\%) reduced speed of HHblits and HHsearch. If your computer does not run on Intel or AMD CPUs it probably does not support SSE2. In that case, you can still run all executables except \verb`hhblits`. Simply build the HH-suite from sources by running \verb`make NO_SSE2=1` with the \verb`NO_SSE2` flag set (see next subsection). HHsearch speed will be reduced by around 50\%-70\%. \subsection{Installation from source code} \newcounter{mycounter} \newenvironment{enum} {\begin{list}{\arabic{mycounter}.~~}{\usecounter{mycounter} \labelsep=0em \labelwidth=0em \leftmargin=0em \itemindent=0em}} {\end{list}} \begin{enum} \item Download the sources from \url{ftp://toolkit.genzentrum.lmu.de/HH-suite/}, for example \begin{verbatim} $ mkdir ~/programs/hh/ $ cd ~/programs/hh/ $ wget ftp://toolkit.genzentrum.lmu.de/HH-suite/hhsuite-latest.tar.gz \end{verbatim} \vspace{2mm} \item Then unzip and untar the file \begin{verbatim} $ tar -xzvf hhsuite-latest.tar.gz \end{verbatim} This will unpack the sources to \verb`hhsuite-`. \vspace{2mm} \item Compilation: Run make in the source directory: \begin{verbatim} $ cd hhsuite-/ $ make \end{verbatim} This compiles all programs and creates the binaries in \verb`src/`. Binaries are by default static. If you encounter missing library errors, also make sure you have installed the static versions of zlib, libpng, and glibc, e.g.\ zlib-static, libpng-static, and glibc-static. If you don't need to generate dotplots with hhalign, zlib and libpng are not needed and you can compile without them: \begin{verbatim} $ make NO_PNG=1 \end{verbatim} A dynamically linked version of the programs can be compiled with: \begin{verbatim} $ make all \end{verbatim} On Mac OS X only dynamic linking is supported. \vspace{2mm} \item Installation: Either install in current directory: \begin{verbatim} $ make install \end{verbatim} Or set \verb`INSTALL_DIR` to the absolute path of the base directory where you want install HH-suite. (\verb`` in the following). For example, to install into \verb`/usr/local`: \begin{verbatim} $ make install INSTALL_DIR=/usr/local \end{verbatim} The HH-suite binaries will then be put into \verb`/bin` and the library files into\\ \verb`/lib/hh`. \vspace{2mm} \item Set HHLIB and paths: In your shell, set the environment variable HHLIB to \verb`$INSTALL_DIR/lib/hh`, e.g, for bash, zsh, or ksh, \begin{verbatim} $ export HHLIB=/lib/hh \end{verbatim} and, for csh or tcsh: \verb`$ setenv HHLIB=/lib/hh`. HHsearch and HHblits look for the column state library file \verb`cs219.lib` and the context library file \verb`context_data.lib` in \verb`$HHLIB/data/`. The hh-suite perl scripts also read HHLIB (via file \verb`scripts/HHPaths.pm`) to locate hh-suite binaries and data files. Put the location of your hh-suite binaries and scripts into your search path: \begin{verbatim} $ export PATH=$PATH:/bin:$HHLIB/scripts \end{verbatim} To avoid typing these commands every time you open a new shell, you may add the following lines to the \verb`.bashrc`, \verb`.kshrc`, \verb`.cshrc` or equivalent file in your home directory that is executed every time a shell is started: \begin{verbatim} export HHLIB=/usr/local/lib/hh PATH=$PATH::$HHLIB/scripts alias hhblits='hhblits -d ' \end{verbatim} The last line defines a default database for hhblits. \vspace{2mm} \item If you compiled dynamically, the run-time linker needs to know about the lib subdirectory of the hh-suite in \verb`/lib/`. Otherwise, you will get an error message such as \begin{verbatim} ffindex_build: error while loading shared libraries: libffindex.so.0.1: cannot open shared object file: No such file or directory \end{verbatim} You can either add the \verb`/lib` library to your shared library search path. Under Linux, for example, these are configured in \verb`/etc/ld.so.conf`. Or the \verb`/lib/` library must be appended to a system-dependent environment variable containing the additional shared library paths for the run-time linker. Under Linux, this variable is called \verb`LD_LIBRARY_PATH` and the bourne shell version (bash, zsh etc.) looks like this: \begin{verbatim} $ export LD_LIBRARY_PATH=/lib \end{verbatim} Under Mac OSX, the equivalent command in bourne shell format is: \begin{verbatim} $ export DYLD_LIBRARY_PATH=/lib \end{verbatim} \vspace{2mm} \end{enum} \subsection{Package installation} \subsubsection*{Installation under x86 64bit Linux with the red hat package manager RPM} If you use a RPM based distribution like Scientific Linux (SL), Red Hat Enterprise Linux (RHEL) or CentOS we provide precompiled x86\_64 packages for Version 6.x, which might also work on Version 5.x and other RPM based distros like SuSE. \begin{enum} \item Download and install:\\[-6mm] \begin{verbatim} $ cd # wherever you want to install HH-suite $ wget ftp://toolkit.genzentrum.lmu.de/HH-suite/hhsuite-latest.x86_64.rpm $ rpm -hvU hhsuite-latest.x86_64.rpm \end{verbatim} \vspace{2mm} \item Set paths: To allow the HH-suite perl scripts to find the binaries, set the HHLIB variable to your hh directory and put the location of your hh-suite binaries and scripts into your search path:\\[-6mm] \begin{verbatim} $ export HHLIB=/hhsuite--linux-x86_64/lib/hh $ export PATH=$PATH:/hhsuite--linux-x86_64/bin:$HHLIB/scripts \end{verbatim} To avoid typing these commands every time you open a new shell, you may add the following lines to the \verb`.bashrc`, \verb`.kshrc`, \verb`.cshrc` or equivalent file in your home directory that is executed every time a shell is started: \begin{verbatim} export HHLIB=/hhsuite--linux-x86_64/lib/hh PATH=$PATH:/hhsuite--linux-x86_64/bin:$HHLIB/scripts alias hhblits='hhblits -d ' \end{verbatim} The last line defines a default database for hhblits. \end{enum} \subsubsection*{Installation under x86 64bit Linux with the Debian package manager DPKG} To follow. %\verb` $ dpkg --install ~//hh-suite-latest.deb` %Then follow instructions under point 5 and 6 of the first subsection. \subsubsection*{Installation under x86 64bit Max OS X} To follow. \subsubsection*{Installation under x86 64bit BSD Unix} To follow. \subsection{HHsuite databases} \label{hhblits_dbs} The following HHsuite databases, which can be searched by HHblits and HHsearch, can be downloaded at \url{ftp://toolkit.genzentrum.lmu.de/HH-suite/databases/hhsuite_dbs}: \small \begin{verbatim} 1 uniprot20 based on UniProt db from EBI/SIB/PIR, clustered to 20 % seq. identity 2 nr20 based on nonredundant db from NCBI, clustered to 20% seq. identity 3 pdb70 representatives from PDB (70% max. sequence identity), updated weekly 4 scop70 representatives from SCOP (70% max. sequence identity) 5 pfamA Pfam A database from Sanger Inst., http://www.sanger.ac.uk/Software/Pfam/ \end{verbatim} \normalsize The databases consist of up to eight files, which all start with the name of the database, followed by different extensions: \begin{verbatim} .cs219 column state sequences for prefiltering .cs219.sizes number of sequences and characters in .cs219 _hhm_db packed, concatenated HMM models in HHM format _hhm_db.index index file for packed HMM model file _hhm_db.index.sizes number of lines in _hhm_db.index _a3m_db packed, concatenated file with MSAs in A3M format _a3m_db.index index file for packed MSA file _a3m_db.index.sizes number of lines in _a3m_db.index \end{verbatim} HHsearch needs just the single \verb`_hhm_db` file out of these eight. The packed files \verb`_hhm_db` and \verb`_a3m_db` contain simply the concatenated A3M MSAs and HHMs, respectively, with a \verb`\0` character at the beginning of each file. They are therefore human-readable and are parsable for specific MSAs or models using tools such as grep or search functions in text editors (which however should be able to ignore the \verb`\0` character). The \verb`.index` files contain indices to provide fast access to these two packed files. The \verb`a3m` files are not needed for a single search iteration when no output MSA is requested. To get started, download the uniprot20 or nr20 database files. For example: \begin{verbatim} $ cd /home/soeding/hh % change to hh-suite directory $ mkdir databases; cd databases $ wget ftp://toolkit.genzentrum.lmu.de/HH-suite/databases/hhsuite_dbs/ uniprot20_.tar.gz $ tar -xzvf uniprot20_.tar.gz \end{verbatim} Note that, in order to generate multiple sequence alignments (MSAs) by \emph{iterative} sequence searching using HHblits, you need to search either uniprot20 and nr20, since since only these databases cover essentially all of the sequence universe. The pdb70, pfamA, and pdb70 are not sensible to use for iterative searching to build MSAs. Uniprot20 and nr20 are obtained by clustering UniProt \cite{uniprot:2010} and the non-redundant database from NCBI, respectively. Clusters contain sequences that need to be almost full-length (80\%) alignable and typically have pairwise sequence identities down to 20\%-30\%. The clustering is done by kClust (Hauser M, Mayer CE, and S\"oding J., to be published), a very fast algorithm for all-against-all sequence comparison and clustering developed in our group. Sequences in each cluster are globally aligned into an MSA (using ClustalOmega \cite{Higgins:2011}). The clusters in uniprot20 and nr20 thus treat all member sequences equally, and the annotatation of the cluster is a non-redundant sum of all annotations found in the cluster member sequences. You need this type of database to build MSAs using iterative HHblits searches. Both uniprot20 and nr20 yield MSAs of equivalent quality and diversity, so which one you should choose depends on what sequence annotation and name formats you prefer. In the pdb70 and scop70 databases, each master sequence from the original sequence database is represented by an MSA. The MSAs are built by HHblits searches starting with the master sequence as a query. The MSAs and HMMs typically carry the name and annotation of the master sequence. In contrast to the clusters in the uniprot20 or nr20 databases, sequences can in principle occur in several MSAs. These homologous sequences merely serve to contribute evolutionary information to the master sequence. As the sequences in this type of database do not cover the entire sequence space, they are not suited for iterative searches. See section \ref{building_dbs} for how to build your own type 2 databases. \subsection{Old-style HHsearch databases} \label{hhsearch_dbs} For backward compatibility, the HHsearch databases read by older versions of HHsearch prior to HH-suite 2.0 are still available. They will at some point be superseded by the HHsuite databases as all these databases become available in the new HH-suite format described in the previous subsection. For the time being, however, more databases for HHsearch are still availble in the old format. The following HHsearch databases can be downloaded at \url{ftp://toolkit.lmb.uni-muenchen.de/HH-suite/databases/hhsearch_dbs} \small \begin{verbatim} 1* pdb70 representatives from PDB (70% max. sequence identity), updated weekly 2* scop70 representatives from SCOP (70% max. sequence identity) 3* PfamA http://www.sanger.ac.uk/Software/Pfam/ 4* SMART http://smart.embl-heidelberg.de/, downloaded from NCBI site 5* PfamB based on ProDom, downloaded from Pfam site 6* COG http://www.ncbi.nlm.nih.gov/COG/new/ 7* KOG http://www.ncbi.nlm.nih.gov/COG/new/ 8* CD/NCBI http://www.ncbi.nlm.nih.gov/Structure/cdd/cdd.shtml 9 Panther http://www.pantherdb.org/, from InterPro 10 TIGRFAMs http://tigrblast.tigr.org/web-hmm/, from InterPro 11 PIRSF http://pir.georgetown.edu/pirsf/, from InterPro 12 Superfamily http://supfam.mrc-lmb.cam.ac.uk/SUPERFAMILY/, from InterPro 13 CATH/Gene3D http://cathwww.biochem.ucl.ac.uk/latest/, from InterPro \end{verbatim} \normalsize The eight databases marked by asterisks contain both HMMs in HHsearch format (*.hhm.tar files) and the multiple sequence alignments (MSAs) in A3M format (*.a3m.tar files). The *.hhm.tar and *.a3m.tar files untar into thousands of separate files, so before unzipping and untarring, first create a directory for the database and untar the tar file within this directory. Under Linux, type \begin{verbatim} $ mkdir scop70_1.75 $ cd scop70_1.75 $ tar -xzvf scop70_1.75.hhm.tar.gz \end{verbatim} To generate an old-style HHsearch database file, concatenate all *.hhm files: \begin{verbatim} $ cat *.hhm > scop70_1.75.hhm \end{verbatim} For the databases without asterisks, you can download the HMM models in HMMER format (\url{http://hmmer.org/}) as *.hmm.tar files. Each *.hmm.tar file untars into a single concatenated HMMER-formatted database file that can be read by HHsearch. For theses databases, unfortunately no alignments are publicly available. (Information to the contrary is welcome!) The pdb70 and scop70 databases are built at the Gene Center using in-house scripts to select representatives and using two iterations of HHblits to generate MSAs for the representative sequences. They are distributed freely under the Lesser GNU Public License. For the other databases, different copy right regulations may apply. Please refer to the databases' original web sites for the copy right notes and references to cite. \subsection{How to run HH-suite efficiently on a computer cluster} When HHblits runs on many cores of a compute cluster and accesses the HH-suite database(s) via a central file system, hard disk random access times and file system throughput can quickly become limiting instead of the available compute power. To efficiently search with HHblits with millions of sequences in parallel on a compute cluster, we therefore recommend one of the following options, with strongly decreasing preference and efficiency . 1. The ideal solution is to write a script that loads the needed HHblits databases from the file system into the virtal {\it RAM drive} of each compute node upon boot-up. This requires enough memory in your computer. Software for RAM drives exist on all major operating systems. On Linux from kernel 2.4 up, a RAM drive is installed by default at \verb`/dev/shm`. When memory is low, this software can intelligently swap rarely used files to a hard drive. This solution is also attractive because it eliminates the mechanical wear of disk drives. 2. You put a copy of the needed HHblits databases onto the local hard disk drive of each of your compute nodes that can accept HH-suite jobs. This helps, because each of the local disk drives can serve out files, increasing file access throughput by a factor equal to the number of compute nodes. But file access can still be a serions bottleneck if each local hard drive serves a lot of strong CPU cores (see estimation below). 3. You (or your sysadmin) can make sure that your compute nodes at least have sufficient memory reserves and proper cache settings in order to keep the prefiltering database file in cache (size: a few GB). You can check this by running HHblits on a fresh computd node twice and observing that the second run takes much less time to read the prefiltering database file. But this only solves the problem of having to read the prefiltering file every time hhblits is called. Another, usually more serious bottleneck is reading the a3m and hhm files that passed the prefilter via the file system. These can also be cached, but since each time only a small subset of all files are read, caching is inefficient for these. Let us estimate the random file access bottleneck at an example. Suppose you want to search the uniprot20 database with HHblits on four compute nodes with 32 CPU cores each. You let each job run on a single core, which is the most efficient way when processing many jobs. Let's say aach HHblits iteration through uniprot20 on a modern 3GHz Intel/AMD core takes around 60s on average and after each search iteration, HHblits needs to read around $3000$ a3m or hhm files on disk that passed the prefilter. The total number of file accesses per second is thus estimated at \begin{equation} \textrm{number of file accesses} = 4 \textrm{(nodes)} \times 32 \textrm{(cores)} \times 3000 \textrm{(files)} / 60s = 6400/s \end{equation} A typical hard disk has a latency of around $5 ms$ and can therefore ranmdomly access only 200 files per second. Hence, if all cores need to access the files from the same RAID disk array, only 4 CPU cores would already saturate the RAID's disk drives! (You can slightly decrease latency by using RAIDs with striping, but this will not be nearly enough.) Now suppose you have the luck of having a file server that caches the hhblits databases in RAM, uses a RAM drive to store them, or uses a solid state drive (SSD) with typical random access times below $100 \mu s$. Then file access time is not problematic anymore, but data throughput might get limiting. The four servers would need to read \begin{equation} \textrm{data transfer rate} = 4 \textrm{(nodes)} \times 32 \textrm{(cores)} \times 3000 \textrm{(files)} \times 5 kB/ 60s = 256 Mb/s \end{equation} If data transfer from the file server has to be shared with many other copmute servers, this rate may also not be available. Again, point 1 above offers an ideal solution. \section{Brief tutorial to HH-suite tools} \subsection{Overview of programs} \small \begin{verbatim} hhblits (Iteratively) search an HH-suite database with a query sequence or MSA hhsearch Search an HHsearch database of HMMs with a query MSA or HMM hhmake Build an HMM from an input MSA hhfilter Filter an MSA by max sequence identity, coverage, and other criteria hhalign Calculate pairwise alignments, dot plots etc. for two HMMs/MSAs reformat.pl Reformat one or many MSAs addss.pl Add PSIPRED predicted secondary structure to an MSA or HHM file hhmakemodel.pl Generate MSAs or coarse 3D models from HHsearch or HHblits results hhblitsdb.pl Build HH-suite database with prefiltering, packed MSA/HMM, and index files multithread.pl Run a command for many files in parallel using multiple threads splitfasta.pl Split a multiple-sequence FASTA file into multiple single-sequence files renumberpdb.pl Generate PDB file with indices renumbered to match input sequence indices Align.pm Utility package for local and global sequence-sequence alignment HHPaths.pm Configuration file with paths to the PDB, BLAST, PSIPRED etc. \end{verbatim} \normalsize % To be included with HH-suite 2.1.0 %mergeali.pl Merge MSAs in A3M format according to an MSA of their seed sequences %pdb2fasta.pl Generate FASTA sequence file from SEQRES records of globbed pdb files %pdbfilter.pl Generate representative set of PDB/SCOP sequences from pdb2fasta.pl output %replaced by hhblits: %buildali.pl Build a PSI-BLAST MSA from a sequence or MSA, add sec. structure %alignhits.pl Extract an MSA from a BLAST/PSI-BLAST output Call a program without arguments or with \verb`-h` option to get more detailed explanations. \subsection{Searching databases of HMMs using HHsearch and HHblits}\label{searching_hm_dbs} We will use the MSA \verb`query.a3m` in the \verb`data/` subdirectory of the HH-suite as an example query. To search for sequences in the \verb`scop70_1.75` database that are homologous to the query sequence or MSA in \verb`query.a3m`, type \begin{verbatim} $ hhsearch -cpu 4 -i data/query.a3m -d dbs/scop70_1.75_hhm_db \end{verbatim} (The database file \verb`scop70_1.75_hhm_db` is contained in the HHsuite database tar archive \url{ftp://toolkit.genzentrum.lmu.de/HH-suite/databases/hhsuite_dbs/scop70_1.75.tar.gz}. If the input file is an MSA or a single sequence, HHsearch calculates an HMM from it and then aligns this query HMM to all HMMs in the \verb`scop70_1.75` database using the Viterbi algorithm. You should see a dot printed for every twenty HMMs aligned. After the search, the most significant HMMs are realigned using the more accurate Maximum Accuracy (MAC) algorithm (subsection \ref{MAC}). After the realignment phase, the complete search results consisting of the summary hit list and the pairwise query-template alignments are written to the default output file, \verb`query.hhr` (where the query file extension is replaced with \verb`hhr`). The \verb`hhr` result file format was designed to be human readable and easily parsable. The \verb`-cpu 4` option tells HHsearch to start four POSIX threads for searching and realignment. This will typically results in almost fourfold faster execution on computers with four or more cores. Since the management of the threads costs negligible overhead, this option could be given by default through an alias definition of hhsearch and hhblits (see section \ref{installation}). \begin{figure}[h] \begin{center} \includegraphics[width=0.5 \textwidth]{hhblits-hhsearch.png} \caption{Benchmark of HHsearch and HHblits on a SCOP20 dataset.} \label{fig:hhsearch_hhblits_bench} \end{center} \end{figure} The hhblits tool can be used in much the same way as hhsearch. It takes the same input data and produces a results file in the same format as hhsearch. Most of the hhsearch options also work for hhblits, which has additional options associated with its extended functionality for iterative searches. Due to its fast prefilter, hhblits runs between 30 and 3000 times faster than HHsearch at the cost of only a few percent lower sensitivity (Fig. \ref{fig:hhsearch_hhblits_bench}). Whereas HHsearch only needs the file \verb`_hhm_db`, HHblits needs the other files belonging to the HH-suite database as well. The same search as above is performed here using hhblits instead of hhsearch: \begin{verbatim} $ hhblits -cpu 4 -i data/query.a3m -d dbs/scop70_1.75 -n 1 \end{verbatim} Note that instead of specifying the up to eight database files explicitly, only their common prefix is given (in this case \verb`dbs/scop70_1.75`). HHblits first scans the column state sequences in \verb`scop70_1.75.cs219` with its fast prefilter. HMMs whose column state sequences pass the prefilter are read from the packed file \verb`scop70_1.75_hhm_db` (using the index file \verb`scop70_1.75_hhm_db.index`) and are aligned to the query HMM generated from \verb`query.a3m` using the slow Viterbi HMM-HMM alignment algorithm. The search results are written to the default output file \verb`query.hhr`. The option \verb`-n 1` tells hhblits to perform a single search iteration. (The default is 2 iterations.) \subsection{Generating a multiple sequence alignment using HHblits}\label{msa_hhblits} To generate an MSA for a sequence or initial MSA in query.a3m, the database to be searched should cover the entire sequence space, such as uniprot20 or nr20. The option \verb`-oa3m ` tells HHblits to generate an output MSA from the significant hits, \verb`-n 1` specifies a single search iteration. \begin{verbatim} $ hhblits -cpu 4 -i data/query.seq -d dbs/uniprot20 -oa3m query.a3m -n 1 \end{verbatim} At the end of the search, HHblits reads from the packed database file containing the MSAs the sequences belonging to HMMs with E-value below the threshold. The E-value threshold for inclusion into the MSA can be specified using the \verb`-e ` option. After the search, \verb`query.a3m` will contain the MSA in A3M format. We could do a second search iteration, starting with the MSA from the previous search, to add more sequences. Since the MSA generated after the previous search contains more information than the single sequence in \verb`query.seq`, searching with this MSA will probably result in many more homologous database matches. \begin{verbatim} $ hhblits -cpu 4 -i query.a3m -d dbs/uniprot20 -oa3m query.a3m -n 1 \end{verbatim} Instead, we could directly perform two search iterations starting from \verb`query.seq`: \begin{verbatim} $ hhblits -cpu 4 -i data/query.seq -d dbs/uniprot20 -oa3m query.a3m -n 2 \end{verbatim} See section \ref{2_vs_1+1} for an explanation why the results can be slightly different. In practice, it is recommended to use between 1 and 4 iterations for building MSAs, depending on the trade-off between reliability and specificity on one side and sensitivity for remotely homologous sequences on the other side. The more search iterations are done, the higher will be the risk of non-homologous sequences or sequence segments entering the MSA and recruiting more of their kind in subsequent iterations. This is particularly problematic when searching with sequences containing short repeats, regions with amino acid compositional bias and, although less dramatic, with multiple domains. Fortunately, this problem is much less pronounced in hhblits as compared to PSI-BLAST due to hhblits's lower number of iterations, its more robust Maximum Accuracy alignment algorithm, and the higher precision of its HMM-HMM alignments. The parameter \verb`mact` (maximum accuracy threshold) lets you choose the trade-off between sensitivity and precision. With a low mact-value (e.g.\ \verb`-mact 0.01`) very sensitive, but not so precise alignments are generated, whereas a search with a high mact-value (e.g.\ \verb`-mact 0.9`) results in shorter but very precise alignments. The default value of mact in HHblits is $0.35$ (changed from 0.5 in the beta version). To avoid unnecessarily large and diverse MSAs, HHblits stops iterating when the diversity of the query MSA -- measured as number of effective sequences, see section \ref{aliformats} -- grows passed a threshold of 10.0. This threshold can be modified with the \verb`--neffmax ` option. See subsection \ref{hhmformat} for a description of how the number of effective sequences is calculated in HH-suite. To avoid the final MSAs to grow unnecessarily large, by default the database MSAs that are going to be merged with the query MSA into the result MSA are filtered with the active filter options (by default \verb`-id 90` and \verb`-diff 1000`). The \verb`-all` option turns off the filtering of the result MSA. Use this option if you want to get all sequences in the significantly similar uniprot20 clusters: \begin{verbatim} $ hhblits -cpu 4 -i data/query.seq -d dbs/uniprot20 -oa3m query.a3m -all \end{verbatim} The A3M format uses small letters to mark inserts and capital letters to designate match and delete columns (see subsection \ref{aliformats}), allowing you to omit gaps aligned to insert columns. The A3M format therefore uses much less space for large alignments than FASTA but looks misaligned to the human eye. Use the \verb`reformat.pl` script to reformat \verb`query.a3m` to other formats, e.g.\ for reformatting the MSA to Clustal and FASTA format, type \begin{verbatim} $ reformat.pl a3m clu query.a3m query.clu $ reformat.pl a3m fas query.a3m query.fas \end{verbatim} Next, to add secondary structure information to the MSA we call the script \verb`addss.pl`. For \verb`addss.pl` to work, you have to make sure that the paths to BLAST and PSIPRED in the file \verb`scripts/HHPaths.pm` are correctly filled in. Then type \begin{verbatim} $ addss.pl query.a3m \end{verbatim} When the sequence has a SCOP or PDB identifier as first word in its name, the script tries to add the DSSP states as well. Open the \verb`query.a3m` file and check out the two lines that have been added to the MSA. Now you can generate a hidden Markov model (HMM) from this MSA: \begin{verbatim} $ hhmake -i query.a3m \end{verbatim} The default output file is \verb`query.hhm`. By default, the option \verb`-M first` will be used. This means that exactly those columns of the MSAs which contain a residue in the query sequence will be assigned to Match / Delete states, the others will be assigned to Insert states. (The query sequence is the first sequence not containing secondary structure information.) Alternatively, you may want to apply the 50\%-gap rule by typing \verb`-M 50`, which assigns only those columns to Insert states which contain more than 50\% gaps. The \verb`-M first` option makes sense if your alignment can best be viewed as a seed sequence plus aligned homologs to reinforce it with evolutionary information. This is the case in the SCOP and PDB versions of our HMM databases, since here MSAs are built around a single seed sequence (the one with known structure). On the contrary, when your alignment represents an entire family of homologs and no sequence in particular, it is best to use the 50\% gap rule. This is the case for Pfam or SMART MSAs, for instance. Despite its simplicity, the 50\% gap rule has been shown to perform well in practice. When calling \verb`hhmake`, you may also apply several filters, such as maximum pairwise sequence identity (\verb`-id `), minimum sequence identity with query sequence (\verb`-qid `), or minimum coverage with query (\verb`-cov `). But beware of reducing the diversity of your MSAs too much, as this will lower the sensitivity to detect remote homologs. Previous versions of HH-suite (the 'HHsearch package') included a perl script \verb`buildali.pl` to build MSAs for a query sequence using PSI-BLAST as its search engine. Because HHblits performs better than PSI-BLAST in all aspects that we have tested, we decided to remove this script from HH-suite. It can still be downloaded as part of HHsearch version 1.5.0. \subsection{Visually checking an MSA for corrupted regions} Iterative search methods such as PSI-BLAST and HHblits may generate alignments containing non-homologous sequence stretches or even large fractions of non-homologous sequences. The cause for this is almost always the overextension of homologous alignments into non-homologous regions. This has been termed \emph{homologous overextension} in \cite{Gonzalez:2010}. This effect occurs particularly in multidomain and repeat proteins. A single overextended alignment in the search results leads to more of such sequences to be included in the profile of the next iteration -- usally all homologous to the first problematic sequence but with even longer non-homologous stretches. Thus, after three or more iterations, large sections of the resulting MSA may be non-homologous to the original query sequence. This risk of homologous overextension is greatly reduced in HHblits in comparison to PSI-BLAST, because fewer iterations are usually necessary for HHblits and because HHblits uses the Maximum Accuracy alignment algorithm (see section \ref{MAC}), which is much less prone to overextend alignments than the Smith-Waterman/Viterbi algorithm used by most other programs including PSI-BLAST. Still, in many cases, it is worth investigating an interesting homology prediction by visually checking the MSAs of the query and the matched database protein for the presence of corrupted regions containing non-homologous sequence stretches. The recommended procedure to visually check an MSA is the following. We first reduce the MSA to a small set of sequences that could still fit into a single window of an alignment viewer: \begin{verbatim} $ hhfilter -i query.a3m -o query.fil.a3m -diff 30 \end{verbatim} The option \verb`-diff` causes hhfilter to select a representative set of at least 30 sequences that best represent the full diversity of the MSA. Sequences that contain non-homologous strechtes are therefore usually retained, as the tend to be the most dissimilar to the main sequence cluster. Next, we remove all inserts (option \verb`-r`) with respect to the first, master sequence in the MSA. The resulting MSA is sometimes called a master-slave alignment: \begin{verbatim} $ reformat.pl -r query.fil.a3m query.fil.fas \end{verbatim} This alignment is now very easy to inspect for problematic regions in any viewer that allows to color the residues according to their physico-chemical properties. We can recommend \verb`alnedit` (downloadable from \url{www.eb.tuebingen.mpg.de/?id=421}) or \verb`jalview`, for example: \begin{verbatim} $ java -jar ~/bioinfo/alnedit.jar query.fil.fas . \end{verbatim} %Here is an example of a corrupted MSA, visualized as described here with alnedit %\begin{figure}[h] %\begin{center} %\includegraphics[width=0.5 \textwidth]{hhblits-hhsearch.png} %\caption{Corrupted alignment: The master-slave MSA for sequence XXXX generated using three iterations of PSI-BLAST shows ...} %\label{fig:hhsearch_hhblits_bench} %\end{center} %\end{figure} \subsection{Building customized databases} \label{building_dbs} It is simple to build custom HH-suite databases using the same tools we use to build the standard HH-suite databases (except uniprot20 and nr20). An example application is to search for homologs among all proteins of an organism. To build your own HH-suite database from a set of sequences, you first need to generate an MSA with predicted secondary structure for every sequence in the set. This can conveniently be done using the script \verb`multithread.pl` in the HH-suite. This script runs a command for many files in parallel, distributing the individual jobs to multiple cores on your server, one file per thread. This will shorten the run-time roughly by the number of cores. To run \verb`multithread.pl`, you need first to have each sequences in a separate FASTA-formatted file. If your sequences are contained in a single multiple-sequence FASTA file \verb``, first split them up into multiple single-sequence files using \verb`splitfasta.pl`: \begin{verbatim} $ mkdir tmp/scop70_1.75; cd tmp/scop70_1.75 $ splitfasta.pl \end{verbatim} Now, to build an MSA with HHblits for each sequence \verb`tmp/scop70_1.75/*.seq`, run\\[-1mm] \verb`$ multithread.pl 'tmp/scop70_1.75/*.seq' `\\ \verb` 'hhblits -i $file -d dbs/uniprot20 -oa3m $name.a3m -n 2'`\\[-1mm] The first argument is the file globbing expression (protected from the shell by quotes), which selects the files with which to run the command. The command is given as second argument within quotes. In this command, the string \verb`$file` is replaced by the actual, globbed file. You might also want to pipe the stdout and stderr streams of the command into log files, for example using the following command string: { \begin{verbatim} 'hhblits -i $file -d dbs/uniprot20 -oa3m $name.a3m -n 2 1>out.log 2>err.log'. \end{verbatim} } The MSAs are written to the file \verb`$name.a3m`. Here, \verb`$name` stands for the globbed file name without its extension. The number of threads to launch can be specified with option \verb`-cpu ` (default value is 8). To be sure that everything went smoothly, check that the number of \verb`*.a3m` files is the same as the number of \verb`*.seq` files, and browse the file \verb`'stderr.log'` for error messages. The number of HHblits search iterations and the HMM inclusion E-value threshold for hhblits can be changed from their default values (2 and 0.01, respectively) using the \verb`'-n '` and \verb`'-e '` options. A higher number of iterations such as \verb`'-n 3'` will result in very high sensitivity to discover remotely homologous relationships, but the ranking among homologous proteins will often not reflect their degree of relationship to the query. The reason is that any similarities that are higher than the similarities among the sequences in the query and database MSAs cannot be resolved. Now, add PSIPRED-predicted secondary structure to all MSAs: \begin{verbatim} $ multithread.pl 'tmp/scop70_1.75/*.a3m' 'addss.pl $file' -cpu 16 \end{verbatim} Again, piping stdout and stderr into log files and inspecting the warnings and errors is recommended. An HH-suite database consists of eight files, as described in subsection \ref{hhblits_dbs}. These files can be generated by a single call to \verb`hhblitsdb.pl`: \begin{verbatim} $ hhblitsdb.pl -o dbs/scop70_1.75 -ia3m tmp/scop70_1.75/ -cpu 16 \end{verbatim} In order to build the file containing the column state sequence for prefiltering, \verb`hhblitsdb.pl` will generate a column state sequence for each A3M-formatted MSA in the directory given by the \verb`-ia3m` option. As this can take some time, the script calls \verb`multithread.pl` to distribute the jobs to multiple cores. The script also needs to generate an HHM files for each MSA file, for which again \verb`multithread.pl` is called. In the end, the \verb`ffindex` utility generates the packed files containing the A3M MSAs and HHM models with corresponding index files. The script will report the number of files of each category (column-state, A3M, HHM) and warn if the numbers differ. The option \verb`-log err.log` pipes the stderr stream of each command executed into a log file. As with all perl scripts in the HH-suite, a list of additional options can be retrieved by calling the scripts without parameters. Alternatively, if you have a set of HHM or HMMER model files but no MSA files, for example for Pfam, you can build an HH-suite database with the command \begin{verbatim} $ hhblitsdb.pl -o dbs/pfamA_25 -ihhm tmp/pfamA_25/ -hmm -cpu 16 \end{verbatim} The script will then build the column state sequences from the HMMER files in the directory given by the \verb`-ihhm` option. It will then generate the five database files that are needed by \verb`hhblits` for non-iterative searches throug the database. (The three files referring to the A3M MSAs cannot be built since no MSAs were supplied. However, these file are only needed to build output MSAs with the -oa3m option or to build a query MSA for a second search iteration. They are dispensable for non-iterative searches.) Please note that HHblits and HHsearch lose quite a lot of performance when using HMMER-formatted HMMs instead of HH-suite-formatted ones. We therefore strongly recommend to build HH-suite formatted HMMs directly from the MSAs if possible. (Pfam MSAs can be retrieved from our ftp site.) \subsubsection*{Old-style HHsearch databases} An old-style HHsearch database consists simply of concatenated hhm files. Start from the a3m files including predicted secondary structure, generated as described above. Then generate the \verb`hhm` files using \verb`multithread.pl`: \begin{verbatim} $ multithread.pl 'tmp/scop70_1.75/*.a3m' 'hhmake -i $file' -cpu 8 \end{verbatim} The \verb`hhm` files will have the same name but with a different extension as their \verb`a3m` files. You can then concatenate your individual HMMs into your database: \begin{verbatim} $ cat *.hhm > scop70_1.75.hhm \end{verbatim} or, if the maximum command line buffer size is exceeded, \begin{verbatim} $ find $tmpdir -name '*.seq219' -exec cat '{}' + >> scop70_1.75.hhm \end{verbatim} \subsection{Modifying or extending existing databases} There are two ways to add, remove, or replace HMMs and A3M files in HH-suite databases. The computationally efficient way is the following. Suppose you want to add a3m and hhm files for \verb`mydb1/myseq.a3m` and all files \verb`mydb2/*.a3m` to the uniprot20. You can do that by using \verb`hhblitsdb.pl` with the append option \verb`-a`: \begin{verbatim} $ hhblitsdb.pl -a dbs/uniprot20 -ia3m 'mydb1/myseq.a3m mydb2/*.a3m' \end{verbatim} The expression in apostrophes is a globbing expression that has the same syntax as Linux command line glob expressions (with * representing any string, ? a wildcard character etc.). For each a3m file, hhblitsdb.pl will generate column state sequences and hhm files and will add these to the database. If you already have hhm files \verb`mydb2/*.hhm` for \emph{all} the a3m files, you can give these on the command line to save the time to generate them from the a3m files: \\[-1mm] \verb`$ hhblitsdb.pl -a dbs/uniprot20 -ia3m 'mydb1/myseq.a3m mydb2/*.a3m'`\\ \verb` -ihhm 'mydb1/myseq.hhm mydb2/*.hhm'`\\[-1mm] Since the file names are used for retrieving the files in the ffindex data structure, it is very important to add only files whose file name does not yet exist in the HH-suite database. To remove files, call hhblitsdb.pl with the remove option \verb`-r`, listing the files to remove in a glob expression after the \verb`-f` option: \begin{verbatim} $ hhblitsdb.pl -r dbs/uniprot20 -f 'mydb2/*.hhm mydb2/*.a3m' \end{verbatim} Don't forget to remove both a3m and hhm files from the database. The cs files will be removed automatically. When the HH-suite database to modify is not too large (such as the PDB, SCOP, Pfam etc.), you might also extract all files into a directory: \begin{verbatim} $ ffindex_unpack _a3m_db _a3m_db.index tmp/mydb/ $ ffindex_unpack _hhm_db _hhm_db.index tmp/mydb/ \end{verbatim} Now add, replace, modify, or remove the a3m and hhm files in \verb`tmp/mydb/` as desired. Last, build a new HH-suite database from the modified set of a3m and hhm files in \verb`tmp/mydb/`: \begin{verbatim} $ hhblitsdb.pl -o dbs/mydb -ia3m tmp/mydb/ -ihhm tmp/mydb/ \end{verbatim} Don't try that with the uniprot20 or nr20 databases, though. It would take many hours just to unpack the ffindex data files into the original MSA and HMM files. \section{Frequently asked questions} \subsection{How do I report a bug?} If you find a bug, PLEASE tell us about it. But first, make sure the problem is not due to wrong usage or wrong file formats. This requires having read the relevant sections of the user guide. (Sorry!) Check for possible warnings. Rerun the command with verbose option \verb`-v 3` or \verb`-v 4` to see if you can find where things go awry. If the problem persists, we will need everything to reproduce the bug on our machines. Please send us (1) the input file, (2) the database name and version, or, if it is not a standard database, the link to your ftp server to download the database files, (3) the output files, (4) the command and its screen output, (5) the operating system and CPU on which the bug occurred. Under Linux, please send us the output of \small \begin{verbatim} $ echo $HHLIB $PATH; uname -a; lsb_release -a; head -n 25 /proc/cpuinfo; ulimit -a; free \end{verbatim} \normalsize Thanks a lot! \subsection{What is HMM-HMM comparison and why is it so powerful?} When searching for remote homologs, it is wise to make use of as much information about the query and database proteins as possible in order to better distinguish true from false positives and to produce optimal alignments. This is the reason why sequence-sequence comparison is inferior to profile-sequence comparison. Sequence profiles contain for each column of a multiple alignment the frequencies of the 20 amino acids. They therefore contain detailed information about the conservation of each residue position, i.e., how important each position is for defining other members of the protein family, and about the preferred amino acids. Profile Hidden Markov Models (HMMs) are similar to simple sequence profiles, but in addition to the amino acid frequencies in the columns of a multiple sequence alignment they contain information about the frequency of inserts and deletions at each column. Using profile HMMs in place of simple sequence profiles should therefore further improve sensitivity. Using HMMs both on the query and the database side greatly enhances the sensitivity/selectivity and alignment quality over sequence-profile based methods such as PSI-BLAST. HHsearch is the first software to employ HMM-HMM comparison and HHblits is the first profile-profile comparison method that is fast enough to do iterative searches to build MSAs. \subsection{When can the HH-suite be useful for me?} Sequence search methods such as BLAST, FASTA, or PSI-BLAST are of prime importance for biological research because functional information of a protein or gene can be inferred from homologous proteins or genes identified in a sequence search. But quite often no significant relationship to a protein of known function can be established. This is certainly the case for the most interesting group of proteins, those for which no ortholog has yet been studied. In cases where conventional sequence search methods fail, HHblits and HHsearch quite often allow to make inferences from more remotely homologous relationships. HHblits builds better MSAs, with which more remote homologs can then be found using HHsearch or HHblits, e.g.\ by searching the PDB or domain databases such as Pfam. If the relationship is so remote that no common function can be assumed, one can often still derive hypotheses about possible mechanisms, active site positions and residues, or the class of substrate bound \cite{Todd:2001, Pawlowski:2000}. When a homologous protein with known structure can be identified, its stucture can be used as a template to model the 3D structure of the protein of interest \cite{Rychlewski:1998}, since even protein domains that shared a common ancestor some 3 billion years ago mostly have similar 3D structures \cite{Kinch:2002,Soding:2006a,Alva:2010}. The 3D model may then help to generate hypotheses to guide experiments. \subsection{What does homology mean and why is it important?} Two protein sequences are homologous to each other if they descended from a common ancestor sequence. Generally, homologous proteins (or protein fragments) have similar structure because structures diverge much more slowly than their sequences \cite{Chothia:1986}. Depending on the degree of divergence between the sequences, the proteins may also have similar cellular functions, ligands, protein interaction partners, or enzymatic mechanisms \cite{Todd:2001}. On the contrary, proteins that have a similar structure by convergence (i.e., by chance) are said to be analogous. They don't generally share similar functions or biochemical mechanisms and are therefore much less helpful for making inferences. HHsearch and HHblits are tools for homology detection and as such do not normally detect analogous relationships \cite{Alva:2010,Remmert:2010}. \subsection{How can I verify if a database match is homologous?} Here is a list of things to check if a database match really is at least locally homologous. {\bf Check probability and E-value}: HHsearch and HHblits can detect homologous relationships far beyond the twilight zone, i.e., below 20\% sequence identity. Sequence identity is therefore not an appropriate measure of relatedness anymore. The estimated probability of the template to be (at least partly) homologous to your query sequence is the most important criterion to decide whether a template HMM is actually homologous or just a high-scoring chance hit. When it is larger than 95\%, say, the homology is nearly certain. Roughly speaking, one should give a hit serious consideration (i.e., check the other points in this list) whenever (1) the hit has $>50\%$ probability, or (2) it has $>30\%$ probability and is among the top three hits. The E-value is an alternative measure of statistical significance. It tells you how many chance hits with a score better than this would be expected if the database contained only hits unrelated to the query. At E-values below one, matches start to get marginally significant. Contrary to the probability, when calculating the E-value HHsearch and HHblits do not take into account the secondary structure similarity. Therefore, the probability is a more sensitive measure than the E-value. {\bf Check if homology is biologically suggestive or at least reasonable}: Does the database hit have a function you would expect also for your query? Does it come from an organism that is likely to contain a homolog of your query protein? {\bf Check secondary structure similarity}: If the secondary structure of query and template is very different or you can't see how they could fit together in 3D, then this is a reason to distrust the hit. Note however that if the query alignment contains only a single sequence, the secondary structure prediction is quite unreliable and confidence values are overestimated. {\bf Check relationship among top hits}: If several of the top hits are homologous to each other, (e.g.\ when they are members of the same SCOP superfamily), then this will considerably reduce the chances of all of them being chance hits, especially if these related hits are themselves not very similar to each other. Searching the SCOP database is very useful precisely for this reason, since the SCOP family identifier (e.g.\ a.118.8.2) allows to tell immediately if two templates are likely homologs. {\bf Check for possible conserved motifs}: Most homologous pairs of alignments will have at least one (semi-)conserved motif in common. You can identify such putative (semi-)conserved motifs by the agglomeration of three or more well-matching columns (marked with a '\verb`|`' sign between the aligned HMMs) occurring within a few residues, as well as by matching consensus sequences. Some false positive hits have decent scores due to a similar amino acid composition of the template. In these cases, the alignments tend to be long and to lack conserved motifs. {\bf Check residues and role of conserved motifs}: If you can identify possible conserved motifs, are the corresponding conserved template residues involved in binding or enzymatic function? {\bf Check query and template alignments}: A corrupted query or template alignment is the main source of high-scoring false positives. The two most common sources of corruption in an alignment are (1) non-homologous sequences, especially repetitive or low-complexity sequences in the alignment, and (2) non-homologous fragments at the ends of the aligned database sequences. Check the query and template MSAs in an alignment viewer such as Jalview or ALNEDIT. {\bf Realign with other parameters}: change the alignment parameters. Choose global instead of local mode, for instance, if you expect your query to be globally homologous to the putative homolog. Try to improve the probability by changing the values for minimum coverage or minimum sequence identity. You can also run the query HMM against other databases. {\bf Build the query and/or database MSAs more aggressively}: If your query (or template) MSA is not diverse enough, you could increase sensitivity substantially by trying to include more remotely homologous sequences into the MSA. Try using our HHsenser web server at \url{http://toolkit.tuebingen.mpg.de/hhsenser} \cite{Soding:2006b}. Check the HHsenser alignment manually using an alignment editor. Have non-homologous sequences or sequence segments been accidentally included? You can also try to build a more diverse MSA manually: Inspect the HHblits results after the first iteration and consider including hits above the E-value inclusion threshold of 0.001, based on biological plausibility, relatedness of the organism, a reasonable looking alignment, or just guessing. Then start the second HHblits search iteration HHblits with this manually enriched alignment. {\bf Try out other tools}: Try other tools (e.g.\ for profile-profil comparison) and servers for remote homology detection and structure prediction. A list of servers can be found in \cite{Mariani:2011} and \cite{Battey:2007}. {\bf Verify predictions experimentally}: The ultimate confirmation of a homologous relationship or structural model is, of course, the experimental verification of some of its key predictions, such as validating the binding to certain ligands by binding assays, measuring biochemical activity, or comparing the knock-out phenotype with the one obtained when the putative functional residues are mutated. \subsection{What does the maximum accuracy alignment algorithm do?} \label{MAC} HHblits and HHsearch use a better alignment algorithm than the quick and standard Viterbi method to generate the final HMM-HMM alignments. Both realign all displayed alignments in a second stage using the more accurate Maximum Accuracy (MAC) algorithm \cite{Durbin:2008,Biegert:2008}. The Viterbi algorithm is employed for searching and ranking the matches. The realignment step is parallelized (\verb`-cpu `) and typically takes a few seconds only. Please note: Using different alignment algorithms for scoring and aligning has the disadvantage that the pairwise alignments that are displayed are not always very similar to those that are used to calculate the scores. This can lead to confusing results where alignments of only one or a few residues length may have obtained significant E-values. In such cases, run the search again with the \verb`-norealign` option, which will skip the MAC-realignment step. This will allow you to check if the Viterbi alignments are valid at all, which they will probably not be. The length of the MAC alignments can therefore give you additional information to decide if a match is valid. In order to avoid confusion for users of our HHpred server \cite{Soding:2005b, Hildebrand:2009}, the \verb`-norealign` option is the default there, whereas for you pros who dare to use the command line package, realigning is done by default. The posterior probability threshold is controlled with the \verb`-mact` option. This parameter controls the alignment algorithm's greediness. More precisely, the MAC algorithm finds the alignment that maximizes the sum of posterior probabilities minus mact for each aligned pair. Global alignments are generated with -mact 0, whereas -mact 0.5 will produce quite conservative local alignments. The -global and -local options now refer to both the Viterbi search stage as well as the MAC realignment stage. With -global (-local), the posterior probability matrix will be calculated for global (local) alignment. When -global is used in conjunction with -realign, the mact parameter is automatically set to 0 in order to produce global alignments. In other words, both following two commands will give global alignments: \begin{verbatim} $ hhsearch -i -d -realign -mact 0 $ hhsearch -i -d -realign -global \end{verbatim} The first version uses \emph{local} Viterbi to search and then uses MAC to realign the proteins globally (since mact is 0) on a \emph{local} posterior probability matrix. The second version uses \emph{global} Viterbi to search and then realigns globally (since mact is automatically set to 0) on a \emph{global} posterior matrix. To detect and align remote homologs, for which sometimes only parts of the sequence are conserved, the first version is clearly better. It is also more robust. If you expect to find globally alignable sequence homologs, the second option might be preferable. In that case, it is recommended to run both versions and compare the results. \subsection{How is the MSA diversity Neff calculated?} The number of effective sequences of the full alignment, which appears as NEFF in the header of each hhm file, is the average of local values \verb`Neff_M(i)` over all alignment positions $i$. The values \verb`Neff_M(i)` are given in the main model section of the hhm model files (subsection \ref{hhmformat}). They quantify the \emph{local} diversity of the alignment in a region around position $i$. More precisely, \verb`Neff_M(i)` measures the diversity of subalignment $Ali_M(i)$ that contains all sequences that have a residue at column $i$ of the full alignment. The subalignment contains all columns for which at least 90\% of these sequences have no end gap. End gaps are gaps to the left of the first residue or to the right of the last residue. The latter condition ensures that the sequences in the subalignment $Ali_M(i)$ cover most of the columns in it. The number of effective sequences in the subalignment $Ali_M(i)$ is exp of the average sequence entropy over all columns of the subalignment. Hence, \verb`Neff_M` is bounded by 0 from below and 20 from above. In practice, it is bounded by the entropy of a column with background amino acid distribution $f_a$: $N_\mathrm{eff} < \sum_{a=1}^{20} f_a \log f_a \approx 16$. Similarly, \verb`Neff_I(i)` gives the diversity of the subalignment $Ali_I(i)$ of all sequences that have an insert at position $i$, and \verb`Neff_D(i)` refers to the diversity of subaligment $Ali_D(i)$ of all sequences that have a Delete (a gap) at position $i$ of the full alignment. \subsection{More frequently asked questions} {\bf How can I retrieve database A3M or HHM files from my HH-suite database?} For reasons of efficiency, the MSA A3M and HHM model files are packed into two files, \verb`_a3m_db` and \verb`_hhm_db`, each with its own index file. The contained files are easy to extract from the packed files. For example, to dump \verb`d1aa7a_.a3m` in \verb`scop70` to standard output, type \begin{verbatim} $ ffindex_get scop70_a3m_db scop70_a3m_db.index d1aa7a_.a3m \end{verbatim} You may write the extracted file to a separate file by appending \verb`'> d1aa7a_.a3m'` to the above command. If you want to extract all files in the ffindex data structures to directory \verb`tmp/scop70`, type \begin{verbatim} $ ffindex_unpack scop70_a3m_db scop70_a3m_db.index tmp/scop70/ . \end{verbatim} {\bf Do HHsearch and HHblits work fine with multi-domain sequences?} HHblits and HHsearch have been designed to work with multi-domain queries. However, the chances for false positives entering the query alginment during the HHblits iterations is greater for multi-domain proteins. For long sequences, it may therefore be of advantage to first search the PDB or the SCOP domain database and then to cut the query sequence into smaller parts on the basis of the identified structural domains. Pfam or CDD are - in our opinion - less suitable to determine domain boundaries. {\bf How can I build my own UniProt database for HHblits?} The procedure to cluster the nr or UniProt databases is more complicated than building a database for a genome or for the sequences in the pdb. As its first step it involves clustering these huge databases down to 20\%-30\% sequence identity. The clustering is done in our lab using a new method, kClust (Hauser M, Mayer CE, and S\"oding J., to be published), available under GPL at \url{ftp://ftp://toolkit.lmb.uni-muenchen.de/kClust/}. We will add all scripts to build these HH-suite databases to the HH-suite in due time. These scripts generate A3M files, HHM files, and consensus sequences. Because of the large number of files to generate, these scripts need to be run on a computer cluster and this will require considerable computer savvyness. {\bf Will you offer an HH-suite database that includes environmental sequences?} We have not seen significant improvements in remote homology detection through inclusion of environmental sequences. A problem with these sequences is their low quality, in particular chimeric sequences from wrong assemblies. This can lead to corrupted profiles in iterative searches. We therefore have no immediate plans to provide a UniProt+env or nr+env for hhblits. If you think you really need the env sequences, you have to use our old \verb`buildali.pl` script or PSI-BLAST for the time being. An alternative is to use kClust to cluster the database yourself. See the previous question. {\bf How do I best build HMMs for integral membrane proteins?} Despite the biased amino acid composition in their integral membrane helices, membrane proteins behave very well in HMM-HMM comparisons. In many benchmark tests and evolutionary studies we have not noticed any higher rates of false positives than with cytosolic proteins. {\bf Don't I need to calibrate my query or database HMMs anymore?} No. If you don't specify otherwise, the two parameters of the extreme-value distribution for the query are estimated by a neural network from the lengths and diversities ($N_\mathrm{eff}$)) of query and database HMMs that was trained on a large set of example queries-template pairs, in an approach similar to the one used in \cite{Sadreyev:2008}. However, the old calibration is still available as an option in HHsearch. {\bf Why do I sometimes get the same database hit twice with different probabilities?} Each line in the summary hit list refers to an alignment with an HMM in the database, not to the database HMM itself. Sometimes, alternative (suboptimal) alignments covering a different part of either the query or the database HMM may appear in the hit list. Usually, both the optimal and the alternative alignments are correct, in particular when the query or the database HMMs represent repeat proteins. {\bf Why do I get different results using hhblits and hhsearch} when I search with the same query through the same database? There are two reasons. First, some hits that hhsearch shows might not have passed the prefilter in hhblits. The option \verb`-prepre_smax_thresh ` lets you modify the minimum score threshold of the first, gapless alignment prefilter (default is 10 bits). Option \verb`-pre_evalue_thresh ` sets the maximum E-value threshold for the second, gapped alignment prefilter (default is 1000). Second, while the probabilities and P-values of hhblits and hhsearch should be the identical for the same matches, the E-values are only similar. The reason is that hhblits heuristically combines the E-values of the second prefilter with the E-values from the full HMM-HMM Viterbi alignment into total E-values \cite{Remmert:2011}. These E-values are slightly better in distinguishing true from false hits, because they combine the partly independent information from two comparisons. {\label{2_vs_1+1} \bf Why do I get different results when I perform $2$ and $1+1$ iterations with HHblits?} When you do a single iteration and start a second iteration with the A3M output file from the first iteration, the alignments should be the same as if you do two iterations (\verb`-n 2`), but the significance values can be slightly different. The reason is that the HHblits P-value is calculated by a weighted combination of the P-value of the Viterbi pairwise HMM alignment and the prefilter E-value. The prefilter E-values differ in the two cases described, since in the first case the E-value is calculated for the first prefilter search (before the first full search) and in the second case it is calculated for the second prefilter search, performed with the query MSA obtained \emph{after} the first search iteration. {\bf How do I reconcile overlapping and conflicting domain predictions}, for example when domain A is predicted from residues 2-50 with 98\% probability and domain B from 2-200 with 95\% probability? The probability that a pair of residues is correctly aligned is the product of the probability for the database match to be homologous (given by the values in the \verb`Probab` column of the hit list) times the posterior probability of the residue pair to be correctly aligned given the database match is correct in the first place. The posterior probabilities are specified by the confidence numbers in the last line of the alignment blocks (0 corresponds approximately to 0-10\%, 9 to 90-100\%). Therefore, an obvious solution would be to prune the alignments in the overlapping region such that the sum of total probabilities is maximized. There is no script yet that does this automatically. {\bf How can I build a phylogenetic tree for HMMs?} I would use a similarity measure like the raw score per alignment length. You might also add the secondary structure score to the raw score with some weight. Whereas probabilities, E-values, and P-values are useful for deciding whether a match is a reliable homolog or not, they are not suitable for measuring similarities because they strongly depend on the length of the alignment, roughly like $\mathrm{P-value} \propto \exp(\lambda \times \mathrm{average\_similarity} \times \mathrm{length})$, with some constant $\lambda$ of order 1. The probability has an even more complex dependence on length. Also, the ``Similarity'' given above the alignment blocks is a simple substitution matrix score per column between the query and template master sequences and does not capture the evolutionary information contained in the MSAs (see subsection \ref{aliblocksformat}). One note of caution: Large, diverse MSAs are usually more sensitive to find homologs than narrower ones. Therefore, I would limit the diversity of all HMMs to some reasonable number (perhaps around 5 or 7, depending on how far diverged your HMMs are). This filtering can be done using \verb`$ hhfilter -i -o -neff 5`. {\bf Should I use the \verb`-global` option to build MSAs} for an HH-suite database if I am intersted in global alignments to these database HMMs? Never use \verb`-global` when building MSAs by iterative searches with HHblits. Remember that global alignments are very greedy alignments, where alignments stretch to the ends of either query of database HMM, no matter what. Global alignments will therefore often lead to non-homologous segments getting included in the MSA, which is catastrophic, as these false segments will lead to many false positive matches when searching with this MSA. But you may use \verb`-global` when searching (with a single iteration) for global matches of your query HMMs through your customized HH-suite database, for example. {\bf How many iterations of hhblits should I use to search my customized genome database?} One iteration! Doing more than one search iterations in general only makes sense in order to build up a diverse MSA of homologous sequences by searching through the uniprot20 or nr20 databases. {\bf How do I read the sequence/HMM headers in the pdb70 databases?} The pdb70 database is clustered to 70\% maximum pairwise sequence identity to reduce redundancy. The PDB identifiers at the end of the description line of sequence $X$ lists the sequences with lower experimental resolution that were removed for having higher than 70\% sequence identity with PDB sequence $X$. The asterisks indicate that a multi-atom ligand is bound in the structure. \section{HHsearch/HHblits output: hit list and pairwise alignments}\label{outformat} \subsection{Summary hit list} Let's do a search with the human PIP49/FAM69B protein, for which we generated an MSA in \verb`query.a3m` with two iterations of HHblits in subsection \ref{msa_hhblits}: \scriptsize \begin{verbatim} Search results will be written to query.hhr query.a3m is in A2M, A3M or FASTA format Read query.a3m with 272 sequences Alignment in query.a3m contains 431 match states 149 out of 270 sequences passed filter (up to 91% position-dependent max pairwise sequence identity) Effective number of sequences exp(entropy) = 5.2 .................................................. 1000 HMMs searched .................................................. 2000 HMMs searched .................................................. 3000 HMMs searched .................................................. 4000 HMMs searched .................................................. 5000 HMMs searched .................................................. 6000 HMMs searched .................................................. 7000 HMMs searched .................................................. 8000 HMMs searched .................................................. 9000 HMMs searched .................................................. 10000 HMMs searched .................................................. 11000 HMMs searched .................................................. 12000 HMMs searched .................................................. 13000 HMMs searched .................................... Realigning 183 query-template alignments with maximum accuracy (MAC) algorithm ... Query sp|Q5VUD6|FA69B_HUMAN Protein FAM69B OS=Homo sapiens GN=FAM69B PE=2 SV=3 Match_columns 431 No_of_seqs 149 out of 272 Neff 5.2 Searched_HMMs 13730 Date Wed Jan 4 17:44:24 2012 Command /cluster/user/soeding/hh/src/hhsearch -i query.a3m -d /cluster/user/soeding/databases/scop.hhm -cpu 18 No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM 1 d1qpca_ d.144.1.7 (A:) Lymphoc 99.7 4.5E-17 3.2E-21 154.3 10.2 99 203-320 56-157 (272) 2 d1jpaa_ d.144.1.7 (A:) ephb2 r 99.7 4.3E-17 3.1E-21 156.8 8.8 99 203-321 75-177 (299) 3 d1uwha_ d.144.1.7 (A:) B-Raf k 99.7 5.1E-17 3.7E-21 154.8 7.7 100 203-322 52-154 (276) 4 d1opja_ d.144.1.7 (A:) Abelson 99.7 6.2E-17 4.5E-21 154.8 8.3 100 203-321 61-164 (287) 5 d1mp8a_ d.144.1.7 (A:) Focal a 99.6 9.9E-17 7.2E-21 151.3 8.6 100 203-322 56-158 (273) 6 d1sm2a_ d.144.1.7 (A:) Tyrosin 99.6 1.2E-16 8.8E-21 150.3 8.8 99 203-321 48-150 (263) 7 d1u59a_ d.144.1.7 (A:) Tyrosin 99.6 2.4E-16 1.7E-20 150.9 9.5 99 203-321 57-158 (285) 8 d1xbba_ d.144.1.7 (A:) Tyrosin 99.6 2.2E-16 1.6E-20 150.2 8.6 97 203-320 56-155 (277) 9 d1vjya_ d.144.1.7 (A:) Type I 99.6 2.6E-16 1.9E-20 151.3 8.8 98 204-320 46-156 (303) 10 d1mqba_ d.144.1.7 (A:) epha2 r 99.6 4.4E-16 3.2E-20 148.0 8.7 193 203-422 57-272 (283) ... 64 d1j7la_ d.144.1.6 (A:) Type II 97.3 0.00014 1E-08 65.0 6.3 33 292-324 184-216 (263) 65 d1nd4a_ d.144.1.6 (A:) Aminogl 96.7 0.0012 8.5E-08 58.5 6.6 31 292-322 176-206 (255) 66 d1nw1a_ d.144.1.8 (A:) Choline 96.6 0.0011 7.8E-08 63.9 5.8 37 203-239 92-128 (395) 67 d2pula1 d.144.1.6 (A:5-396) Me 95.6 0.0071 5.2E-07 58.3 6.4 32 290-322 222-253 (392) 68 d1a4pa_ a.39.1.2 (A:) Calcycli 91.7 0.12 8.9E-06 40.0 5.4 62 140-202 18-80 (92) 69 d1ksoa_ a.39.1.2 (A:) Calcycli 91.2 0.17 1.2E-05 39.5 5.8 56 147-203 28-83 (93) 70 d1e8aa_ a.39.1.2 (A:) Calcycli 90.5 0.23 1.7E-05 38.3 6.0 56 147-203 27-82 (87) ... 175 d1qxpa2 a.39.1.8 (A:515-702) C 23.7 29 0.0021 28.8 3.8 49 137-197 69-118 (188) 176 d1tuza_ a.39.1.7 (A:) Diacylgl 23.5 55 0.004 25.3 5.3 55 143-201 44-106 (118) 177 d1ggwa_ a.39.1.5 (A:) Cdc4p {F 23.1 26 0.0019 27.0 3.2 66 129-197 35-101 (140) 178 d1topa_ a.39.1.5 (A:) Troponin 22.8 72 0.0052 24.5 6.0 58 140-199 65-123 (162) 179 d1otfa_ d.80.1.1 (A:) 4-oxaloc 22.5 66 0.0048 21.5 5.0 40 267-306 12-53 (59) 180 d1oqpa_ a.39.1.5 (A:) Caltract 22.2 32 0.0023 24.0 3.2 32 165-197 3-34 (77) 181 d1df0a1 a.39.1.8 (A:515-700) C 21.7 43 0.0032 27.0 4.5 51 137-199 67-118 (186) 182 d1zfsa1 a.39.1.2 (A:1-93) Calc 21.1 41 0.003 24.6 3.8 30 170-199 8-38 (93) 183 d1snla_ a.39.1.7 (A:) Nucleobi 20.9 23 0.0016 26.2 2.2 24 174-197 18-41 (99) Done \end{verbatim} \normalsize The summary hit list that is written to the screen shows the best hits from the database, ordered by the probability of being a true positive (column 4: 'Prob'). The meaning of the columns is the following: \vspace{5mm} \renewcommand{\arraystretch}{1.2} \begin{description} \item{\verb`No`}: the index of the datbase match. \item{\verb`Hit`}: the first 30 characters of the name line. \item{\verb`Prob`}: the Probability of template to be a true positive. For the probability of being a true positive, the secondary structure score in column \verb`SS` is taken into account, together with the raw score in\ column \verb`Score`. True positives are defined to be either globally homologous or they are at least homologous in parts, and thereby locally similar in structure. More precisely, the latter criterion demands that the MAXSUB score between query and hit is at least 0.1. In almost all cases the structural similarity will we be due to a global OR LOCAL homology between query and template. \item{\verb`E-value`}: The E-value gives the average number of false positives ('wrong hits') with a score better than the one for the template when scanning the database. It is a measure of reliability: E-values near to 0 signify a very reliable hit, an E-value of 10 means about 10 wrong hits are expected to be found in the database with a score at least this good. Note that E-value and P-value are calculated without taking the secondary structure into account! \item{\verb`P-value`}: The P-value is the E-value divided by the number of sequences in the database. It is the probability that in a \emph{pairwise} comparison a wrong hit will score at least this good. \item{\verb`Score`}: the raw score is what comes out of the (Viterbi) HMM-HMM alignment excluding the secondary structure score. Informally speaking, it is the sum over the similarities of aligned profile colmuns minus the gap penalties. \item{\verb`SS`}: the secondary structure score. This score tells you how well the PSIPRED-predicted (3-state) or actual DSSP-determined (8-state) secondary structure sequences agree with each other. PSIPRED confidence values are used in the scoring, low confidences getting less statistical weight. \item{\verb`Cols`}: the number of aligned Match columns in the HMM-HMM alignment. \item{\verb`Query HMM`}: the range of aligned match states from the query HMM. \item{\verb`Template HMM`}: the range of aligned match states from the database/template HMM and, in parenthesis, the number of match states in the database HMM. \end{description} \subsection{HMM-HMM pairwise alignments}\label{aliblocksformat} The output file d1bpya1.hhr contains the same hit list plus the pairwise HMM alignments. One example is give here: \scriptsize \begin{verbatim} No 68 >d1a4pa_ a.39.1.2 (A:) Calcyclin (S100) {Human (Homo sapiens), P11 s100a10, calpactin [TaxId: 9606]} Probab=91.65 E-value=0.12 Score=40.00 Aligned_cols=62 Identities=16% Similarity=0.149 Sum_probs=42.0 Q ss_pred ccCCCCCCcHHHHHHHHHHHHHhhcccCccHHHHHHHHHhhhhccCCCCcCHHHHHHH-HHHHH Q sp|Q5VUD6|FA69 140 FDKPTRGTSIKEFREMTLSFLKANLGDLPSLPALVGQVLLMADFNKDNRVSLAEAKSV-WALLQ 202 (431) Q Consensus 140 ~d~p~~g~s~~eF~emv~~~i~~~lg~~~~l~~L~~~~~~~~d~nk~g~vs~~e~~sl-waLlq 202 (431) ||+..-..|.+||.+++.......++.+.+ ...+..++..+|.|+||+|++.|...+ ..|.. T Consensus 18 yd~ddG~is~~El~~~l~~~~~~~~~~~~~-~~~v~~~~~~~D~n~DG~I~F~EF~~li~~l~~ 80 (92) T d1a4pa_ 18 FAGDKGYLTKEDLRVLMEKEFPGFLENQKD-PLAVDKIMKDLDQCRDGKVGFQSFFSLIAGLTI 80 (92) T ss_dssp HHGGGCSBCHHHHHHHHHHHCHHHHHHSCC-TTHHHHHHHHHCTTSSSCBCHHHHHHHHHHHHH T ss_pred HcCCCCEEcHHHHHHHHHHhccccccccCC-HHHHHHHHHHHhCCCCCCCcHHHHHHHHHHHHH Confidence 444433449999999998876655554332 234566677899999999999997544 44443 \end{verbatim}\normalsize This alignment shows an EF hand embedded in a kinase domain in PIP49/FAM69B. The first line, which begins with with a ``\verb`>`'', contains the name and description line of the template/database HMM. (We use ``template HMM'' and ``matched database HMM'' synonymously.) The next line summarizes the main statistics for the alignment: The probability for the query and template HMMs to be homologous (\verb`Probab`), the \verb`E-value`, the raw \verb`Score`, and the number of aligned columns are repeated from the summary hit list. The \verb`Identities` give the percentage of aligned residue pairs of the query and the template master sequences that are identical. The \verb`Similarity` is the arithmetic mean of the substitution scores between the aligned residue pairs from the query and template master sequences. The substitution matrix is the same as the one used to calculate the pseudocounts for the database HMMs, by default the Gonnet matrix. (The matrix can be changed with the \verb`-Blosom` option.) The \verb`Sum_probs` value is the sum over the posterior probabilities of all aligned pairs of match states. These probabilities are calculated by the Forward-Backward algorithm. (They are used by the maximum accuracy algorithm which computes the final alignments.) When the template HMM has secondary structure annotation from DSSP, the \verb`sum_probs` value runs only over aligned pairs for which the template has a valid DSSP state, not a \verb`-` sign. A \verb`-` would indicate that the structural coordinates of that residue are missing in the template. For homology modelling, this special treatment of templates with known structure makes \verb`sum_probs` a useful feature to use for ranking templates. The pairwise alignment consists of one or more blocks with the following lines: \small \begin{verbatim} Q ss_dssp: the query secondary structure as determined by DSSP (when available) Q ss_pred: the query secondary structure as predicted by PSIPRED (when available) Q : the query master sequence Q Consensus: the query alignment consensus sequence \end{verbatim}\normalsize The predicted secondary structure states are shown in capital letters if the PSIPRED confidence value is between 0.7 and 1.0, for lower confidence values they are given in lower-case letters. With the option {\tt '-ssconf'}, {\tt 'ss\_conf'} lines can be added to the alignments which report the PSIPRED confidence values by numbers between 0 and 9 (as in versions up to 1.5). The consensus sequence uses capital letters for well conserved columns and lower case for partially conserved columns. Unconserved columns are marked by a tilde \verb`~`. Roughly speaking, amino acids that occur with $\ge 60\%$ probability (before adding pseudocounts) are written as capital letters and amino acids that have $\ge 40\%$ probability are written as lower case letters, where gaps are included in the fraction counts. More precisely, when the gap-corrected amino acid fraction \[p_i(a)*N_\mathrm{eff}(i)/(N_\mathrm{eff}+1)\] is above 0.6 (0.4) an upper (lower) case letter is used for amino acid a. Here, $p_i(a)$ is the emission probability for a in column i, $N_\mathrm{eff}$ is the effective number of sequences in the entire multiple alignment (between 1 and 20) and $N_\mathrm{eff}(i)$ is the effective number of sequences in the subalignment consisting of those sequences that do not have a gap in column i. These percentages increase approximately inversely proportionally with the fraction of gaps in the column, hence a column with only cysteines and 50\% gaps gets a lower case letter. The line in the middle shows the column score between the query and template amino acid distributions. It gives a valuable indication for the alignment quality. \small \begin{verbatim} = : column score below -1.5 - : column score between -1.5 and -0.5 . : column score between -0.5 and +0.5 + : column score between +0.5 and +1.5 | : column score above +1.5 \end{verbatim}\normalsize A unit of column score corresponds approximately to 0.6 bits. From the column score line the excellent alignment around the conserved {\tt 'D.n.DG.i...E'} motif in the turn between two helices is evident. The alignment around the gap by contrast scores only a bit better than zero per residue and is therefore not very reliable. After the template block, which consists of the following lines, \small \begin{verbatim} T Consensus: the template alignment consensus sequence T : the template domain sequence T ss_dssp: the template secondary structure as determined by DSSP (when available) T ss_pred: the template secondary structure as predicted by PSIPRED (when available) \end{verbatim}\normalsize The last line in the block ({\tt Confidence}) reports the reliability of the pairwise query-template alignment. The confidence values are obtained from the posterior probabilities calculated in the Forward-Backward algorithm. A value of 8 indicates a probability that this pair of HMM columns is correctly aligned between 0.8 and 0.9. The {\tt Confidence} line is only displayed when the -realign option is active. \section{File formats} \subsection{Multiple sequence alignment formats} \label{aliformats} Multiple alignments can be read in A2M, A3M, or aligned FASTA format. (Check the -M option for using an input format different from the default A3M). You can transform MSAs from Clustal or Stockholm format to A3M or aligned FASTA with the \verb`reformat.pl` utility supplied in this package. To reformat from Clustal format to A3M: \begin{verbatim} $ reformat.pl test.aln test.a3m \end{verbatim} or explicitly, if the formats can not be recognized from the extensions: \begin{verbatim} $ reformat.pl clu a3m test.clustal test.a3m \end{verbatim} To reformat from Stockholm to aligned FASTA: \begin{verbatim} $ reformat.pl test.sto test.fas \end{verbatim} \subsubsection*{Example for aligned FASTA format:} \scriptsize \begin{verbatim} >d1a1x__ b.63.1.1 (-) p13-MTCP1 {Human (Homo sapiens)} PPDHLWVHQEGIYRDEYQRTWVAVVEE--E--T--SF---------LR----------ARVQQIQVPLG-------DAARPSHLLTS-----QL >gi|6678257|ref|NP_033363.1|:(7-103) T-cell lymphoma breakpoint 1 [Mus musculus] HPNRLWIWEKHVYLDEFRRSWLPVVIK--S--N--EK---------FQ----------VILRQEDVTLG-------EAMSPSQLVPY-----EL >gi|7305557|ref|NP_038800.1|:(8-103) T-cell leukemia/lymphoma 1B, 3 [Mus musculus] PPRFLVCTRDDIYEDENGRQWVVAKVE--T--S--RSpygsrietcIT----------VHLQHMTTIPQ-------EPTPQQPINNN-----SL >gi|11415028|ref|NP_068801.1|:(2-106) T-cell lymphoma-1; T-cell lymphoma-1A [Homo sapiens] HPDRLWAWEKFVYLDEKQHAWLPLTIEikD--R--LQ---------LR----------VLLRREDVVLG-------RPMTPTQIGPS-----LL >gi|7305561|ref|NP_038804.1|:(7-103) T-cell leukemia/lymphoma 1B, 5 [Mus musculus] ----------GIYEDEHHRVWIAVNVE--T--S--HS---------SHgnrietcvt-VHLQHMTTLPQ-------EPTPQQPINNN-----SL >gi|7305553|ref|NP_038801.1|:(5-103) T-cell leukemia/lymphoma 1B, 1 [Mus musculus] LPVYLVSVRLGIYEDEHHRVWIVANVE--TshS--SH---------GN----------RRRTHVTVHLW-------KLIPQQVIPFNplnydFL >gi|27668591|ref|XP_234504.1|:(7-103) similar to Chain A, Crystal Structure Of Murine Tcl1 -PDRLWLWEKHVYLDEFRRSWLPIVIK--S--N--GK---------FQ----------VIMRQKDVILG-------DSMTPSQLVPY-----EL >gi|27668589|ref|XP_234503.1|:(9-91) similar to T-cell leukemia/lymphoma 1B, 5; -PHILTLRTHGIYEDEHHRLWVVLDLQ--A--ShlSF---------SN----------RLLIYLTVYLQqgvafplESTPPSPMNLN-----GL >gi|7305559|ref|NP_038802.1|:(8-102) T-cell leukemia/lymphoma 1B, 4 [Mus musculus] PPCFLVCTRDDIYEDEHGRQWVAAKVE--T--S--SH---------SPycskietcvtVHLWQMTTLFQ-------EPSPDSLKTFN-----FL >gi|7305555|ref|NP_038803.1|:(9-102) T-cell leukemia/lymphoma 1B, 2 [Mus musculus] ---------PGFYEDEHHRLWMVAKLE--T--C--SH---------SPycnkietcvtVHLWQMTRYPQ-------EPAPYNPMNYN-----FL \end{verbatim}\normalsize The sequence name and its description must be contained in a single name line beginning with the $>$ symbol and followed directly by the sequence name. The residue data is contained in one or more lines of arbitrary length following the name line. No empty lines should be used. In aligned FASTA the gaps are written with '-' and the n'th letter of each sequence (except newlines) is understood to build the n'th column of the multiple alignment. \subsubsection*{The same alignment in A2M format looks like this:} \scriptsize \begin{verbatim} >d1a1x__ b.63.1.1 (-) p13-MTCP1 {Human (Homo sapiens)} PPDHLWVHQEGIYRDEYQRTWVAVVEE..E..T..SF.........LR..........ARVQQIQVPLG.......DAARPSHLLTS.....QL >gi|6678257|ref|NP_033363.1|:(7-103) T-cell lymphoma breakpoint 1 [Mus musculus] HPNRLWIWEKHVYLDEFRRSWLPVVIK..S..N..EK.........FQ..........VILRQEDVTLG.......EAMSPSQLVPY.....EL >gi|7305557|ref|NP_038800.1|:(8-103) T-cell leukemia/lymphoma 1B, 3 [Mus musculus] PPRFLVCTRDDIYEDENGRQWVVAKVE..T..S..RSpygsrietcIT..........VHLQHMTTIPQ.......EPTPQQPINNN.....SL >gi|11415028|ref|NP_068801.1|:(2-106) T-cell lymphoma-1; T-cell lymphoma-1A [Homo sapiens] HPDRLWAWEKFVYLDEKQHAWLPLTIEikD..R..LQ.........LR..........VLLRREDVVLG.......RPMTPTQIGPS.....LL >gi|7305561|ref|NP_038804.1|:(7-103) T-cell leukemia/lymphoma 1B, 5 [Mus musculus] ----------GIYEDEHHRVWIAVNVE..T..S..HS.........SHgnrietcvt.VHLQHMTTLPQ.......EPTPQQPINNN.....SL >gi|7305553|ref|NP_038801.1|:(5-103) T-cell leukemia/lymphoma 1B, 1 [Mus musculus] LPVYLVSVRLGIYEDEHHRVWIVANVE..TshS..SH.........GN..........RRRTHVTVHLW.......KLIPQQVIPFNplnydFL >gi|27668591|ref|XP_234504.1|:(7-103) similar to Chain A, Crystal Structure Of Murine Tcl1 -PDRLWLWEKHVYLDEFRRSWLPIVIK..S..N..GK.........FQ..........VIMRQKDVILG.......DSMTPSQLVPY.....EL >gi|27668589|ref|XP_234503.1|:(9-91) similar to T-cell leukemia/lymphoma 1B, 5; -PHILTLRTHGIYEDEHHRLWVVLDLQ..A..ShlSF.........SN..........RLLIYLTVYLQqgvafplESTPPSPMNLN.....GL >gi|7305559|ref|NP_038802.1|:(8-102) T-cell leukemia/lymphoma 1B, 4 [Mus musculus] PPCFLVCTRDDIYEDEHGRQWVAAKVE..T..S..SH.........SPycskietcvtVHLWQMTTLFQ.......EPSPDSLKTFN.....FL >gi|7305555|ref|NP_038803.1|:(9-102) T-cell leukemia/lymphoma 1B, 2 [Mus musculus] ---------PGFYEDEHHRLWMVAKLE..T..C..SH.........SPycnkietcvtVHLWQMTRYPQ.......EPAPYNPMNYN.....FL \end{verbatim}\normalsize A2M format is derived from aligned FASTA format. It looks very similar, but it distinguishes between match/delete columns and insert columns. This information is important to uniquely specify how an alignment is transformed into an HMM. The match/delete columns use upper case letters for residues and the '-' symbol for deletions (gaps). The insert columns use lower case letters for the inserted residues. Gaps aligned to inserted residues are written as '.' Lines beginning with a hash \# symbol will be treated as commentary lines in HHsearch/HHblits (see below). \subsubsection*{The same alignment in A3M:} \scriptsize \begin{verbatim} >d1a1x__ b.63.1.1 (-) p13-MTCP1 {Human (Homo sapiens)} PPDHLWVHQEGIYRDEYQRTWVAVVEEETSFLRARVQQIQVPLGDAARPSHLLTSQL >gi|6678257|ref|NP_033363.1|:(7-103) T-cell lymphoma breakpoint 1 [Mus musculus] HPNRLWIWEKHVYLDEFRRSWLPVVIKSNEKFQVILRQEDVTLGEAMSPSQLVPYEL >gi|7305557|ref|NP_038800.1|:(8-103) T-cell leukemia/lymphoma 1B, 3 [Mus musculus] PPRFLVCTRDDIYEDENGRQWVVAKVETSRSpygsrietcITVHLQHMTTIPQEPTPQQPINNNSL >gi|11415028|ref|NP_068801.1|:(2-106) T-cell lymphoma-1; T-cell lymphoma-1A [Homo sapiens] HPDRLWAWEKFVYLDEKQHAWLPLTIEikDRLQLRVLLRREDVVLGRPMTPTQIGPSLL >gi|7305561|ref|NP_038804.1|:(7-103) T-cell leukemia/lymphoma 1B, 5 [Mus musculus] ----------GIYEDEHHRVWIAVNVETSHSSHgnrietcvtVHLQHMTTLPQEPTPQQPINNNSL >gi|7305553|ref|NP_038801.1|:(5-103) T-cell leukemia/lymphoma 1B, 1 [Mus musculus] LPVYLVSVRLGIYEDEHHRVWIVANVETshSSHGNRRRTHVTVHLWKLIPQQVIPFNplnydFL >gi|27668591|ref|XP_234504.1|:(7-103) similar to Chain A, Crystal Structure Of Murine Tcl1 -PDRLWLWEKHVYLDEFRRSWLPIVIKSNGKFQVIMRQKDVILGDSMTPSQLVPYEL >gi|27668589|ref|XP_234503.1|:(9-91) similar to T-cell leukemia/lymphoma 1B, 5; -PHILTLRTHGIYEDEHHRLWVVLDLQAShlSFSNRLLIYLTVYLQqgvafplESTPPSPMNLNGL >gi|7305559|ref|NP_038802.1|:(8-102) T-cell leukemia/lymphoma 1B, 4 [Mus musculus] PPCFLVCTRDDIYEDEHGRQWVAAKVETSSHSPycskietcvtVHLWQMTTLFQEPSPDSLKTFNFL >gi|7305555|ref|NP_038803.1|:(9-102) T-cell leukemia/lymphoma 1B, 2 [Mus musculus] ---------PGFYEDEHHRLWMVAKLETCSHSPycnkietcvtVHLWQMTRYPQEPAPYNPMNYNFL \end{verbatim}\normalsize The A3M format is a condensed version of A2M format. It is obtained by omitting all '.' symbols from A2M format. Hence residues emitted by Match states of the HMM are in upper case, residues emitted by Insert states are in lower case and deletions are written '-'. A3M-formatted alignments can be reformatted to other formats like FASTA or A2M with the \verb`reformat.pl` utility: \begin{verbatim} reformat.pl test.a3m test.a2m \end{verbatim} Lines beginning with a hash \# symbol will be treated as commentary lines in HHsearch/HHblits (see below). Please note that A3M, though very practical and space-efficient, is not a standard format, and the name A3M is our personal invention. \subsubsection*{Secondary structure information in A3M/A2M or FASTA MSAs for HHsearch/HHblits} The alignments read in by HHblits, HHsearch or HHmake can also contain secondary structure information. This information can be included in sequences with special names, like in this A3M file: \scriptsize \begin{verbatim} >ss_dssp CCSEEEEEETTEEEETTSCEEEEEEEECSSCEEEEEECCCCCCCSCCCHHHHTTCSSCSEEEEETTTEEEETTSC >aa_dssp PPDHLWVHQEGIYRDEYQRTWVAVVEEETSFLRARVQQIQVPLGDAARPSHLLTSQLPLMWQLYPEERYMDNNSR >aa_pred PPDHLWVHQEGIYRDEYQRTWVAVVEEETSFLRARVQQIQVPLGDAARPSHLLTSQLPLMWQLYPEERYMDNNSR >ss_pred CCCEEEEECCCEECCCCCEEEEEEEEECCCCCCEEEEEEECCCCCCCCCCCCCCCCCCCEEEECCCCCEECCCCC >ss_conf 987689961870104587078999970578640132153103788788777774424614787217702035631 >d1a1x__ b.63.1.1 (-) p13-MTCP1 {Human (Homo sapiens)} PPDHLWVHQEGIYRDEYQRTWVAVVEEETSFLRARVQQIQVPLGDAARPSHLLTSQLPLMWQLYPEERYMDNNSR >gi|6678257|ref|NP_033363.1|:(7-103) T-cell lymphoma breakpoint 1 [Mus musculus] HPNRLWIWEKHVYLDEFRRSWLPVVIKSNEKFQVILRQEDVTLGEAMSPSQLVPYELPLMWQLYPKDRYRSCDSM >gi|7305557|ref|NP_038800.1|:(8-103) T-cell leukemia/lymphoma 1B, 3 [Mus musculus] PPRFLVCTRDDIYEDENGRQWVVAKVETSRSpygsrietcITVHLQHMTTIPQEPTPQQPINNNSLPTMWRLESMNTYTGTDGT >gi|11415028|ref|NP_068801.1|:(2-106) T-cell lymphoma-1; T-cell lymphoma-1A [Homo sapiens] HPDRLWAWEKFVYLDEKQHAWLPLTIEikDRLQLRVLLRREDVVLGRPMTPTQIGPSLLPIMWQLYPDGRYRSSDSS \end{verbatim}\normalsize The sequence with name \verb`>ss_dssp` contains the 8-state DSSP-determined secondary structure. \verb`>aa_dssp` and \verb`>aa_pred` contain the same residues as the query sequence (\verb`>d1a1x__` in this case). They are optional and used merely to check whether the secondary structure states have correctly been assigned to the alignment. \verb`>ss_pred` contains the 3-state secondary structure predicted by PSIPRED, and \verb`>ss_conf` contains the corresponding confidence values. The query sequence is the first sequence that does not start with a special name. It is not marked explicitly. \subsubsection*{Name lines in alignments} If you would like to create HMMs from alignments with a specified name which differ from the name of the first sequence, you can do so by adding name lines to your FASTA, A2M, or A3M alignment: \scriptsize \begin{verbatim} #PF02043 Bac_chlorC: Bacteriochlorophyll C binding protein >ss_pred CCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHCCCCCCCCCCCCCCCCCCCCCCCCCCCCHHHHHHHCC >ss_conf 9863234658887677777750019999999998878886403445886666775655576678777660667633039 >CSMA_CHLAU/1-79 ATRGWFSESSAQVAQIGDIMFQGHWQWVSNALQATAAAVDNINRNAYPGVSRSGSGEGAFSSSPSNGFRPKRIRSRFNR >CSMA_CHLPH/2-51 NGGGVFTDILAASGRIFEVMVEGHWATVGYLFDSLGKGVSRINQNAYGNM----------------------------- ... \end{verbatim}\normalsize When creating an HMM from an A3M file with hhmake, the first word of the name line is used as the name and file name of the HMM (PF02043 in this case). The following is an optional description. The descriptions will appear in the hit list and alignment section of the search results. The name lines can be arbitrarily long and there can be any number of name/description lines included, marked by a '\#' as the first character in the line. Note that name lines are read by HHmake but are not a part of the standard definition of the FASTA or A2M format. \subsection{HHsearch/HHblits model format (hhm-format)} \label{hhmformat} HMMs can be read by HHsearch/HHblits in HHsuite's own hhm format, as well as in HMMER format (extension hmm) (\url{http://hmmer.org/}). Performance is severely reduced when using HMMER-format, because HMMER adds more pseudocounts than HHsearch/HHblits that we cannot remove anymore. \emph{We therefore strongly advise against using models from HMMER with HHsuite.} We recommend to get the original MSA files and generate hhm-formatted models using \verb`hhmake`, as described in subsection \ref{msa_hhblits}. If you absolutely need to use HMMER format, you can convert it to hhm format with \verb`hhmake`: \begin{verbatim} $ hhmake -i test.hmm -o test.hhm \end{verbatim} This works only for a single HMM per file, not for concatenated HMMs. You may add predicted secondary structure to the hmm file with \verb`addss.pl` as for hhm format. HHsearch/HHblits uses a format HMM that is unchanged since HHsearch version 1.5. This is the example of an HHM model file produced by HHmake: \scriptsize \begin{verbatim} HHsearch 1.5 NAME d1mvfd_ b.129.1.1 (D:) MazE {Escherichia coli} FAM b.129.1.1 FILE d1mvfd_ COM hhmake1 -i d1mvfd_.a3m -o test.hhm DATE Wed May 14 10:41:06 2011 LENG 44 match states, 44 columns in multiple alignment FILT 32 out of 35 sequences passed filter (-id 90 -cov 0 -qid 0 -qsc -20.00 -diff 100) NEFF 4.0 SEQ >ss_dssp CBCEEETTEEEEECCHHHHHHTTCCTTCBEEEEEETTEEEEEEC >ss_pred CCCCCCCCCCCCCCHHHHHHHHCCCCCCEEEEEEECCEEEEEEC >ss_conf 93233467666600578899808998986889874993798739 >Consensus sxIxKWGNSxAvRlPaxlxxxlxlxxgdxixxxxxxxxivlxPv >d1mvfd_ b.129.1.1 (D:) MazE {Escherichia coli} SSVKRWGNSPAVRIPATLMQALNLNIDDEVKIDLVDGKLIIEPV >gi|10176344|dbj|BAB07439.1|:(1-43) suppressor of ppGpp-regulated growth inhibitor [Bacillus halodurans] TTIQKWGNSLAVRIPNHYAKHINVTQGSEIELSLgSDQTIILKP- >gi|50120611|ref|YP_049778.1|:(3-43) suppressor of growth inhibitory protein ChpA [Erwinia carotovora] -TVKKWGNSPAIRLSSSVMQAFDMTFNDSFDMEIRETEIALIP- >gi|44064461|gb|EAG93225.1|:(2-42) unknown [environmental sequence] -SVVKWGSYLAVRLPAELVLELGLKEGDEIDLVKDDGPVRVR-- >gi|31442758|gb|AAP55635.1|:(1-44) PemI-like protein [Pediococcus acidilactici] TRLAKWGNSKAARIPSQIIKQLKLDDNQDMTITIENGSIVLTPI >gi|44419085|gb|EAJ13619.1|:(3-43) unknown [environmental sequence] SAIQKWGNSAAVRLPAVLLEQIDASVGSSLNADVRPDGVLLSP- >gi|24376549|gb|AAN57947.1|:(3-44) putative cell growth regulatory protein [Streptococcus mutans UA159] SAINKWGNSSAIRLPKQLVQELQLQTNDVLDYKVSGNKIILEKV >gi|11344928|gb|AAG34554.1|:(1-44) MazE [Photobacterium profundum] TQIRKIGNSLGSIIPATFIRQLELAEGAEIDVKTVDGKIVIEPI >gi|45681193|ref|ZP_00192636.1|:(2-44) COG2336: Growth regulator [Mesorhizobium sp. BNC1] -TIRKIGNSEGVILPKELLDRHNLKTGDALAIVEEGSDLVLKPV # NULL 3706 5728 4211 4064 4839 3729 4763 4308 4069 3323 5509 4640 4464 4937 4285 4423 3815 3783 6325 4665 HMM A C D E F G H I K L M N P Q R S T V W Y M->M M->I M->D I->M I->I D->M D->D Neff NeffI NeffD 0 * * 0 * 0 * * * * S 1 * * * * * * * * * * * * * * * 1012 988 * * * 1 0 * * * * * * 2817 0 0 S 2 2307 * * * * * * * * * * * * 3178 3009 2179 1546 * * * 2 0 * * * * * * 3447 0 0 V 3 * * * * * * * 917 * 3009 * * * * * * * 1530 * * 3 0 * * * * * * 3447 0 0 . . . V 44 * * * * * * * 1309 * * * * * * * * * 745 * * 44 0 * * 0 * * * 2533 0 0 // \end{verbatim} \normalsize The first line (\verb`HHsearch 1.5`) gives the format version, which corresponds to the HHsearch version for which this format was first introduced. Newer versions of HHsearch/HHblits may use previous format versions. The \verb`NAME` line gives the name of the HMM and an optional description. The first 30 characters of this field are used in the summary hit list of the search results in hhr format, the full name line is given above the query-template alignments of the search results. The \verb`FAM` line contains the family if the sequence is from SCOP of PFAM (used for calibration). \verb`COM` is the command that was used to generate the file. \verb`NEFF` is the diversity of the alignment, calculated as $\exp$ of the negative entropy averaged over all columns of the alignment. The \verb`SEQ` section contains a number of aligned, representative (pseudo) sequences in A3M format and is terminated with a line containing only a \verb`#`. The first sequence represents the DSSP secondary structure (if available, i.e., if contained in the A3M or FASTA alignment from which the HMM model was built), the second and third sequences contain the predicted secondary structure and the corresponding confidence values in the range 0--9 (if available). The fourth sequence is the consensus annotation sequence that is shown in the pairwise query-template alignments in the hhsearch output. The first \emph{real} sequence after the pseudo sequences is the \emph{seed} or \emph{master} sequence from which the alignment was built (\verb`>d1mvfd_`, in our example). If the alignment does not represent a single master sequence but an entire family, as in the case of PFAM alignments for example, the first real sequence may be a consensus sequence calculated for the entire alignment. This master sequence is shown in the pairwise query-template alignments in the hhsearch output. The next line specifies the null model frequencies, which are extracted from the selected substitution matrix used to add pseudocounts. Each of the positive integers is equal to 1000 times the negative logarithm of the amino acid frequency (which is between 0 and 1): \begin{equation} -1000 \times \log_2( frequency) \label{transformation} \end{equation} After the two annotation lines that specify the order of columns for the emission and transition probabilities that follow, there is a line which is not currently read by HHsearch and that lists the transition frequencies from the begin state to the first Match state, Insert state and Delete state. The last block contains two lines for each column of the HMM. The first line starts with the amino acid in the master sequence at that column in the HMM and the column number. Following are 20 positive integers representing the match state amino acid emission frequencies (see eq.\ \ref{transformation}). Asterisks \verb`*` stand for a frequency of 0 (which would otherwise be represented by 99999). Please note that, unlike in HMMER format, \emph{the emission frequencies do not contain pseudo-counts} in the HHsearch model format. The second line contains the seven transition frequencies (eq.\ \ref{transformation}) coded as in eq.\ \ref{transformation}. The three local diversities, \verb`Neff_M`, \verb`Neff_I`, and \verb`Neff_D` are given in units of 0.001 (see next paragraph). The end of the model is indicated by a line containing only \verb`//`. \section{Summary of command-line parameters} This is just a brief summary of command line parameters for the various binaries and perl scripts as they are displayed by the programs when calling them without command line parameters. On the help pages of our HHpred/HHblits web servers \url{http://toolkit.tuebingen.mpg.de} or \url{http://toolkit.genzentrum.lmu.de} you can find more detailed explanations about some of the input parameters ('Parameters' section) and about how to interpret the output ('Results' section). The FAQ section contains valuable practical hints on topics such as how to validate marginally significant database matches or how to avoid high-scoring false positives. \subsection{{\tt hhblits} -- HMM-HMM-based lighting-fast iterative sequence search} HHblits is a sensitive, general-purpose, iterative sequence search tool that represents both query and database sequences by HMMs. You can search HH-suite databases starting with a single query sequence, a multiple sequence alignment (MSA), or an HMM. HHblits prints out a ranked list of database HMMs/MSAs and can also generate an MSA by merging the significant database HMMs/MSAs onto the query MSA. t \small \begin{verbatim} Usage: hhblits -i query [options] -i input/query: single sequence or multiple sequence alignment (MSA) in a3m, a2m, or FASTA format, or HMM in hhm format may be 'stdin' or 'stdout' throughout. Options: -d database name (e.g. uniprot20_29Feb2012) (default=/cluster/databases/hhblits/uniprot20) -n [1,8] number of iterations (default=2) -e [0,1] E-value cutoff for inclusion in result alignment (def=0.001) Input alignment format: -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert; ' -' = Delete; '.' = gaps aligned to inserts (may be omitted) -M first use FASTA: columns with residue in 1st sequence are match states -M [0,100] use FASTA: columns with fewer than X% gaps are match states Output options: -o write results in standard format to file (default=) -oa3m write result MSA with significant matches in a3m format -opsi write result MSA of significant matches in PSI-BLAST format -ohhm write HHM file for result MSA of significant matches -oalis write MSAs in A3M format after each iteration -Ofas write pairwise alignments of significant matches in FASTA format Analogous for output in a3m and a2m format (e.g. -Oa3m) -qhhm write query input HHM file of last iteration (default=off) -seq max. number of query/template sequences displayed (default=1) -aliw number of columns per line in alignment list (default=80) -p [0,100] minimum probability in summary and alignment list (default=20) -E [0,inf[ maximum E-value in summary and alignment list (default=1E+06) -Z maximum number of lines in summary hit list (default=500) -z minimum number of lines in summary hit list (default=10) -B maximum number of alignments in alignment list (default=500) -b minimum number of alignments in alignment list (default=10) Prefilter options -noprefilt disable all filter steps -noaddfilter disable all filter steps (except for fast prefiltering) -nodbfilter disable additional filtering of prefiltered HMMs -noblockfilter search complete matrix in Viterbi -maxfilt max number of hits allowed to pass 2nd prefilter (default=20000) Filter options applied to query MSA, database MSAs, and result MSA -all show all sequences in result MSA; do not filter result MSA -id [0,100] maximum pairwise sequence identity (def=90) -diff [0,inf[ filter MSAs by selecting most diverse set of sequences, keeping at least this many seqs in each MSA block of length 50 (def=1000) -cov [0,100] minimum coverage with master sequence (%) (def=0) -qid [0,100] minimum sequence identity with master sequence (%) (def=0) -qsc [0,100] minimum score per column with master sequence (default=-20.0) -neff [1,inf] target diversity of multiple sequence alignment (default=off) HMM-HMM alignment options: -norealign do NOT realign displayed hits with MAC algorithm (def=realign) -mact [0,1[ posterior probability threshold for MAC re-alignment (def=0.350) Parameter controls alignment greediness: 0:global >0.1:local -glob/-loc use global/local alignment mode for searching/ranking (def=local) -realign_max realign max. hits (default=1000) -alt show up to this many significant alternative alignments(def=2) -premerge merge hits to query MSA before aligning remaining hits (def=3) -shift [-1,1] profile-profile score offset (def=-0.03) -ssm {0,..,4} 0: no ss scoring 1,2: ss scoring after or during alignment [default=2] 3,4: ss scoring after or during alignment, predicted vs. predicted -ssw [0,1] weight of ss score (def=0.11) Gap cost options: -gapb [0,inf[ Transition pseudocount admixture (def=1.00) -gapd [0,inf[ Transition pseudocount admixture for open gap (default=0.15) -gape [0,1.5] Transition pseudocount admixture for extend gap (def=1.00) -gapf ]0,inf] factor to increase/reduce gap open penalty for deletes (def=0.60) -gapg ]0,inf] factor to increase/reduce gap open penalty for inserts (def=0.60) -gaph ]0,inf] factor to increase/reduce gap extend penalty for deletes(def=0.60) -gapi ]0,inf] factor to increase/reduce gap extend penalty for inserts(def=0.60) -egq [0,inf[ penalty (bits) for end gaps aligned to query residues (def=0.00) -egt [0,inf[ penalty (bits) for end gaps aligned to template residues (def=0.00) Pseudocount (pc) options: -pcm {0,..,3} position dependence of pc admixture 'tau' (pc mode, default=2) 0: no pseudo counts: tau = 0 1: constant tau = a 2: diversity-dependent: tau = a/(1+((Neff[i]-1)/b)^c) 3: CSBlast admixture: tau = a(1+b)/(Neff[i]+b) (Neff[i]: number of effective seqs in local MSA around column i) -pca [0,1] overall pseudocount admixture (def=0.9) -pcb [1,inf[ Neff threshold value for -pcm 2 (def=4.0) -pcc [0,3] extinction exponent c for -pcm 2 (def=1.0) -pre_pcm {0,..,3} PREFILTER admixture (pc mode, default=3) -pre_pca [0,1] PREFILTER pseudocount admixture (def=0.8) -pre_pcb [1,inf[ PREFILTER threshold for Neff (def=2.0) -pre_pcc [0,3] PREFILTER extinction exponent c for -pre_pcm 2 (def=1.0) Context-specific pseudo-counts: -nocontxt use substitution-matrix instead of context-specific pseudocounts -contxt context file for computing context-specific pseudocounts (default=/home/soeding/hh/data/context_data.crf) -cslib column state file for fast database prefiltering (default=/home/soeding/hh/data/cs219.lib) Predict secondary structure -addss add 2ndary structure predicted with PSIPRED to result MSA -psipred directory with PSIPRED executables (default=) -psipred_data directory with PSIPRED data (default=) Other options: -v verbose mode: 0:no screen output 1:only warings 2: verbose (def=2) -neffmax ]1,20] skip further search iterations when diversity Neff of query MSA becomes larger than neffmax (default=10.0) -cpu number of CPUs to use (for shared memory SMPs) (default=2) -scores write scores for all pairwise comparisions to file -atab write all alignments in tabular layout to file -maxres max number of HMM columns (def=15002) -maxmem [1,inf[ max available memory in GB (def=3.0) Example: hhblits -i query.fas -oa3m query.a3m -n 1 \end{verbatim} \normalsize \subsection{{\tt hhsearch} -- search a database of HMMs with a query MSA or HMM} \small \begin{verbatim} Usage: hhsearch -i query -d database [options] -i input/query multiple sequence alignment (a2m, a3m, FASTA) or HMM -d HMM database of concatenated HMMs in hhm, HMMER, or a3m format, OR, if file has extension pal, list of HMM file names, one per line. Multiple dbs, HMMs, or pal files with -d ' ...' may be 'stdin' or 'stdout' throughout. Output options: -o write results in standard format to file (default=) -Ofas write pairwise alignments of significant matches in FASTA format Analogous for output in a3m, a2m, and psi format (e.g. -Oa3m) -oa3m write MSA of significant matches in a3m format Analogous for output in a2m, psi, and hhm format (e.g. -ohhm) -e [0,1] E-value cutoff for inclusion in multiple alignment (def=0.001) -seq max. number of query/template sequences displayed (def=1) Beware of overflows! All these sequences are stored in memory. -cons show consensus sequence as master sequence of query MSA -nocons don't show consensus sequence in alignments (default=show) -nopred don't show predicted 2ndary structure in alignments (default=show) -nodssp don't show DSSP 2ndary structure in alignments (default=show) -ssconf show confidences for predicted 2ndary structure in alignments -p minimum probability in summary and alignment list (def=20) -E maximum E-value in summary and alignment list (def=1E+06) -Z maximum number of lines in summary hit list (def=500) -z minimum number of lines in summary hit list (def=10) -B maximum number of alignments in alignment list (def=500) -b minimum number of alignments in alignment list (def=10) -aliw [40,..[ number of columns per line in alignment list (def=80) -dbstrlen max length of database string to be printed in hhr file Filter query multiple sequence alignment -id [0,100] maximum pairwise sequence identity (%) (def=90) -diff [0,inf[ filter MSA by selecting most diverse set of sequences, keeping at least this many seqs in each MSA block of length 50 (def=100) -cov [0,100] minimum coverage with query (%) (def=0) -qid [0,100] minimum sequence identity with query (%) (def=0) -qsc [0,100] minimum score per column with query (def=-20.0) -neff [1,inf] target diversity of alignment (default=off) Input alignment format: -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert; '-' = Delete; '.' = gaps aligned to inserts (may be omitted) -M first use FASTA: columns with residue in 1st sequence are match states -M [0,100] use FASTA: columns with fewer than X% gaps are match states -tags do NOT neutralize His-, C-myc-, FLAG-tags, and trypsin recognition sequence to background distribution HMM-HMM alignment options: -norealign do NOT realign displayed hits with MAC algorithm (def=realign) -mact [0,1[ posterior probability threshold for MAC re-alignment (def=0.350) Parameter controls alignment greediness: 0:global >0.1:local -glob/-loc use global/local alignment mode for searching/ranking (def=local) -alt show up to this many significant alternative alignments(def=2) -vit use Viterbi algorithm for searching/ranking (default) -mac use Maximum Accuracy (MAC) algorithm for searching/ranking -forward use Forward probability for searching -excl exclude query positions from the alignment, e.g. '1-33,97-168' -shift [-1,1] score offset (def=-0.03) -corr [0,1] weight of term for pair correlations (def=0.10) -sc amino acid score (tja: template HMM at column j) (def=1) 0 = log2 Sum(tja*qia/pa) (pa: aa background frequencies) 1 = log2 Sum(tja*qia/pqa) (pqa = 1/2*(pa+ta) ) 2 = log2 Sum(tja*qia/ta) (ta: av. aa freqs in template) 3 = log2 Sum(tja*qia/qa) (qa: av. aa freqs in query) 5 local amino acid composition correction -ssm {0,..,4} 0: no ss scoring 1,2: ss scoring after or during alignment [default=2] 3,4: ss scoring after or during alignment, predicted vs. predicted -ssw [0,1] weight of ss score compared to column score (def=0.11) -ssa [0,1] SS substitution matrix = (1-ssa)*I + ssa*full-SS-substition-matrix [def=1.00) Gap cost options: -gapb [0,inf[ Transition pseudocount admixture (def=1.00) -gapd [0,inf[ Transition pseudocount admixture for open gap (default=0.15) -gape [0,1.5] Transition pseudocount admixture for extend gap (def=1.00) -gapf ]0,inf] factor to increase/reduce the gap open penalty for deletes (def=0.60) -gapg ]0,inf] factor to increase/reduce the gap open penalty for inserts (def=0.60) -gaph ]0,inf] factor to increase/reduce the gap extend penalty for deletes(def=0.60) -gapi ]0,inf] factor to increase/reduce the gap extend penalty for inserts(def=0.60) -egq [0,inf[ penalty (bits) for end gaps aligned to query residues (def=0.00) -egt [0,inf[ penalty (bits) for end gaps aligned to template residues (def=0.00) Pseudocount (pc) options: -pcm {0,..,3} position dependence of pc admixture 'tau' (pc mode, default=2) 0: no pseudo counts: tau = 0 1: constant tau = a 2: diversity-dependent: tau = a/(1 + ((Neff[i]-1)/b)^c) (Neff[i]: number of effective seqs in local MSA around column i) 3: constant diversity pseudocounts -pca [0,1] overall pseudocount admixture (def=1.0) -pcb [1,inf[ Neff threshold value for -pcm 2 (def=1.5) -pcc [0,3] extinction exponent c for -pcm 2 (def=1.0) Context-specific pseudo-counts: -nocontxt use substitution-matrix instead of context-specific pseudocounts -contxt context file for computing context-specific pseudocounts (default=/home/soeding/hh/data/context_data.lib) -cslib column state file for fast database prefiltering (default=/home/soeding/hh/data/cs219.lib) -csw [0,inf] weight of central position in cs pseudocount mode (def=1.6) -csb [0,1] weight decay parameter for positions in cs pc mode (def=0.9) Other options: -cpu number of CPUs to use (for shared memory SMPs) (default=1) -v verbose mode: 0:no screen output 1:only warings 2: verbose -maxres max number of HMM columns (def=15002) -maxmem [1,inf[ max available memory in GB (def=3.0) -scores write scores for all pairwise comparisions to file -calm {0,..,3} empirical score calibration of 0:query 1:template 2:both default 3: neural network-based estimation of EVD params Example: hhsearch -i a.1.1.1.a3m -d scop70_1.71.hhm \end{verbatim} \normalsize \subsection{{\tt hhfilter} -- filter an MSA} Filter an alignment by maximum pairwise sequence identity, minimum coverage, minimum sequence identity, or score per column to the first (seed) sequence etc. \small \begin{verbatim} Usage: hhfilter -i infile -o outfile [options] -i read input file in A3M/A2M or FASTA format -o write to output file in A3M format -a append to output file in A3M format Options: -v verbose mode: 0:no screen output 1:only warings 2: verbose -id [0,100] maximum pairwise sequence identity (%) (def=90) -diff [0,inf[ filter MSA by selecting most diverse set of sequences, keeping at least this many seqs in each MSA block of length 50 (def=0) -cov [0,100] minimum coverage with query (%) (def=0) -qid [0,100] minimum sequence identity with query (%) (def=0) -qsc [0,100] minimum score per column with query (def=-20.0) -neff [1,inf] target diversity of alignment (default=off) Input alignment format: -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert; '-' = Delete; '.' = gaps aligned to inserts (may be omitted) -M first use FASTA: columns with residue in 1st sequence are match states -M [0,100] use FASTA: columns with fewer than X% gaps are match states Example: hhfilter -id 50 -i d1mvfd_.a2m -o d1mvfd_.fil.a2m \end{verbatim} \normalsize \subsection{{\tt hhmake} -- build an HMM from an input alignment} Build a profile hidden Markov modes from an input alignment, formatted in A2M, A3M, or FASTA, or convert between HMMER format (.hmm) and HHsearch format (.hhm). An old-style HHsearch database file is generated by simply concatenating these HMM files. \small \begin{verbatim} Usage: hhmake -i file [options] -i query alignment (A2M, A3M, or FASTA), or query HMM Output options: -o HMM file to be written to (default=) -a HMM file to be appended to -v verbose mode: 0:no screen output 1:only warings 2: verbose -seq max. number of query/template sequences displayed (def=10) Beware of overflows! All these sequences are stored in memory. -cons make consensus sequence master sequence of query MSA -name use this name for HMM (default: use name of first sequence) Filter query multiple sequence alignment -id [0,100] maximum pairwise sequence identity (%) (def=90) -diff [0,inf[ filter MSA by selecting most diverse set of sequences, keeping at least this many seqs in each MSA block of length 50 (def=100) -cov [0,100] minimum coverage with query (%) (def=0) -qid [0,100] minimum sequence identity with query (%) (def=0) -qsc [0,100] minimum score per column with query (def=-20.0) -neff [1,inf] target diversity of alignment (default=off) Input alignment format: -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert; '-' = Delete; '.' = gaps aligned to inserts (may be omitted) -M first use FASTA: columns with residue in 1st sequence are match states -M [0,100] use FASTA: columns with fewer than X% gaps are match states Pseudocount (pc) options: -pcm {0,..,3} position dependence of pc admixture 'tau' (pc mode, default=0) 0: no pseudo counts: tau = 0 1: constant tau = a 2: diversity-dependent: tau = a/(1+((Neff[i]-1)/b)^c) 3: CSBlast admixture: tau = a(1+b)/(Neff[i]+b) (Neff[i]: number of effective seqs in local MSA around column i) -pca [0,1] overall pseudocount admixture (def=0.9) -pcb [1,inf[ Neff threshold value for -pcm 2 (def=4.0) -pcc [0,3] extinction exponent c for -pcm 2 (def=1.0) Context-specific pseudo-counts: -nocontxt use substitution-matrix instead of context-specific pseudocounts -contxt context file for computing context-specific pseudocounts (default=/home/soeding/hh/data/context_data.lib) -cslib column state file for fast database prefiltering (default=/home/soeding/hh/data/cs219.lib) Example: hhmake -i test.a3m \end{verbatim} \normalsize \subsection{{\tt hhalign} -- align a query MSA/HMM to a template MSA/HMM} Align a query alignment/HMM to a template alignment/HMM by HMM-HMM alignment. If only one alignment/HMM is given it is compared to itself and the best off-diagonal alignment plus all further non-overlapping alignments above significance threshold are shown. The command also allows to sample alignments randomly, to generate png-files with dot plots showing alignments or to print out a list of indices of aligned residue pairs. \small \begin{verbatim} Usage: hhalign -i query [-t template] [options] -i input query alignment (fasta/a2m/a3m) or HMM file (.hhm) -t input template alignment (fasta/a2m/a3m) or HMM file (.hhm) -png write dotplot into PNG-file (default=none) Output options: -o write output alignment to file -ofas write alignments in FASTA, A2M (-oa2m) or A3M (-oa3m) format -Oa3m write query alignment in a3m format to file (default=none) -Aa3m append query alignment in a3m format to file (default=none) -atab write alignment as a table (with posteriors) to file (default=none) -index use given alignment to calculate Viterbi score (default=none) -v verbose mode: 0:no screen output 1:only warings 2: verbose -seq [1,inf[ max. number of query/template sequences displayed (def=1) -nocons don't show consensus sequence in alignments (default=show) -nopred don't show predicted 2ndary structure in alignments (default=show) -nodssp don't show DSSP 2ndary structure in alignments (default=show) -ssconf show confidences for predicted 2ndary structure in alignments -aliw int number of columns per line in alignment list (def=80) -P for self-comparison: max p-value of alignments (def=0.001 -p minimum probability in summary and alignment list (def=0) -E maximum E-value in summary and alignment list (def=1E+06) -Z maximum number of lines in summary hit list (def=100) -z minimum number of lines in summary hit list (def=1) -B maximum number of alignments in alignment list (def=100) -b minimum number of alignments in alignment list (def=1) -rank int specify rank of alignment to write with -Oa3m or -Aa3m option (def=1) Dotplot options: -dthr probability/score threshold for dotplot (default=0.50) -dsca if value <= 20: size of dot plot unit box in pixels if value > 20: maximum dot plot size in pixels (default=600) -dwin average score over window [i-W..i+W] (for -norealign) (def=10) -dali show alignments with indices in in dot plot = ... or = all Filter input alignment (options can be combined): -id [0,100] maximum pairwise sequence identity (%) (def=90) -diff [0,inf[ filter most diverse set of sequences, keeping at least this many sequences in each block of >50 columns (def=100) -cov [0,100] minimum coverage with query (%) (def=0) -qid [0,100] minimum sequence identity with query (%) (def=0) -qsc [0,100] minimum score per column with query (def=-20.0) Input alignment format: -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert; '-' = Delete; '.' = gaps aligned to inserts (may be omitted) -M first use FASTA: columns with residue in 1st sequence are match states -M [0,100] use FASTA: columns with fewer than X% gaps are match states HMM-HMM alignment options: -glob/-loc global or local alignment mode (def=local) -alt show up to this number of alternative alignments (def=1) -realign realign displayed hits with max. accuracy (MAC) algorithm -norealign do NOT realign displayed hits with MAC algorithm (def=realign) -mact [0,1[ posterior probability threshold for MAC alignment (def=0.300) A threshold value of 0.0 yields global alignments. -sto use global stochastic sampling algorithm to sample this many alignments -excl exclude query positions from the alignment, e.g. '1-33,97-168' -shift [-1,1] score offset (def=-0.010) -corr [0,1] weight of term for pair correlations (def=0.10) -ssm 0-4 0:no ss scoring [default=2] 1:ss scoring after alignment 2:ss scoring during alignment -ssw [0,1] weight of ss score (def=0.11) Example: hhalign -i T0187.a3m -t d1hz4a_.hhm -png T0187pdb.png \end{verbatim} \normalsize \subsection{{\tt reformat.pl} -- reformat one or many alignments} Read one or many multiple alignments in one format and write them in another format \small \begin{verbatim} Usage: reformat.pl [informat] [outformat] infile outfile [options] or reformat.pl [informat] [outformat] 'fileglob' .ext [options] Available input formats: fas: aligned fasta; lower and upper case equivalent, '.' and '-' equivalent a2m: aligned fasta; inserts: lower case, matches: upper case, deletes: '-', gaps aligned to inserts: '.' a3m: like a2m, but gaps aligned to inserts MAY be omitted sto: Stockholm format; sequences in several blocks with sequence name at beginning of line (HMMER output) psi: format as read by PSI-BLAST using the -B option (like sto with -M first -r) clu: Clustal format; sequences in several blocks with sequence name at beginning of line Available output formats: fas: aligned fasta; all gaps '-' a2m: aligned fasta; inserts: lower case, matches: upper case, deletes: '-', gaps aligned to inserts: '.' a3m: like a2m, but gaps aligned to inserts are omitted sto: Stockholm format; sequences in just one block, one line per sequence psi: format as read by PSI-BLAST using the -B option clu: Clustal format If no input or output format is given the file extension is interpreted as format specification ('aln' as 'clu') Options: -v int verbose mode (0:off, 1:on) -num add number prefix to sequence names: 'name', '1:name' '2:name' etc -noss remove secondary structure sequences (beginning with >ss_) -sa do not remove solvent accessibility sequences (beginning with >sa_) -M first make all columns with residue in first seuqence match columns (default for output format a2m or a3m) -M int make all columns with less than X% gaps match columns (for output format a2m or a3m) -r remove all lower case residues (insert states) (AFTER -M option has been processed) -r int remove all lower case columns with more than X% gaps -g '' suppress all gaps -g '-' write all gaps as '-' -uc write all residues in upper case (AFTER other options have been processed) -lc write all residues in lower case (AFTER other options have been processed) -l number of residues per line (for Clustal, FASTA, A2M, A3M formats) (default=100) -d maximum number of characers in nameline (default=1000) Examples: reformat.pl 1hjra.a3m 1hjra.a2m (same as reformat.pl a3m a2m 1hjra.a3m 1hjra.a2m) reformat.pl test.a3m test.fas -num -r 90 reformat.pl fas sto '*.fasta' .stockholm \end{verbatim} \normalsize \subsection{{\tt addss.pl} -- add predicted secondary structure to an MSA or HMM} Add PSIPRED secondary structure prediction (and DSSP annotation) to a multiple sequence alignment (MSA) or HMMER (multi-)model file. If the input file is an MSA, the predicted secondary structure and confidence values are added as special annotation sequences with names \verb`>ss_pred`, \verb`>ss_conf`, and \verb`>ss_dssp` to the top of the output A3M alignment. If no output file is given, the output file will have the same name as the input file, except for the extension being replaced by \verb`'.a3m'`. Allowed input formats are A2M/FASTA (default), A3M (-a3m), CLUSTAL (-clu), STOCKHOLM (-sto), HMMER (-hmm). If the input file contains HMMER models, records SSPRD and SSCON containing predicted secondary structure and confidence values are added to each model. In this case the output file name is obligatory and must be different from the input file name. \small \begin{verbatim} Usage: perl addss.pl [] [-fas|-a3m|-clu|-sto] or perl addss.pl -hmm \end{verbatim} \normalsize \subsection{{\tt hhmakemodel.pl} -- generate MSAs or coarse 3D models from HHsearch results file} From the top hits in an hhsearch output file (hhr), you can \begin{itemize} \item{generate a MSA (multiple sequence alignment) containing all representative template sequences from all selected alignments (options -fas, -a2m, -a3m, -pir)} \item{generate several concatenated pairwise alignments in AL format (option -al)} \item{generate several concatenated coarse 3D models in PDB format (option -ts)} \end{itemize} In PIR, PDB and AL format, the pdb files are required in order to read the pdb residue numbers and ATOM records. The PIR formatted file can be used directly as input to the MODELLER\cite{Sali:1993} homology modeling package. \small \begin{verbatim} Usage: hhmakemodel.pl [-i] file.hhr [options] Options: -i results file from hhsearch with hit list and alignments -fas write a FASTA-formatted multiple alignment to file.fas -a2m write an A2M-formatted multiple alignment to file.a2m -a3m write an A3M-formatted multiple alignment to file.a3m -m [ ...] pick hits with specified indices (default='-m 1') -p minimum probability threshold -e maximum E-value threshold -q use the full-length query sequence in the alignment (not only the aligned part); the query alignment file must be in HHM, FASTA, A2M, or A3M format. -N use query name from hhr filename (default: use same name as in hhr file) -first include only first Q or T sequence of each hit in MSA -v verbose mode Options when database matches in hhr file are PDB or SCOP sequences -pir write a PIR-formatted multiple alignment to file.pir -ts write the PDB-formatted models based on *pairwise* alignments into file.pdb -al write the AL-formatted *pairwise* alignments into file.al -d directories containing the pdb files (for PDB, SCOP, or DALI sequences) -s shift the residue indices up/down by an integer -CASP formatting for CASP (for -ts, -al options) (default: LIVEBENCH formatting) \end{verbatim} \normalsize \subsection{{\tt hhblitsdb.pl} -- Build an HH-suite database } Builds HH-suite database from a3m formatted MSAs and/or from HMMs (-o). MSAs and HMMs can also be added (-a) to or removed (-r) from an existing database. \small \begin{verbatim} Usage: hhblitsdb.pl -o|-a|-r [-ia3m ] [-ihhm ] [-ics ]... With option -o, the following HH-suite database files can be generated: .cs219 column-state sequences, one for each MSA/HMM (for prefilter) .cs219.sizes number of sequences and characters in .cs219 _a3m_db packed file containing A3M alignments read from _a3m_db.index index file for packed A3M file _a3m.db.index.sizes number of lines in _a3m_db.index _hhm_db packed file containing HHM-formatted HMMs read from _hhm_db.index index file for packed HHM file _hhm_db.index.sizes number of lines in _hhm_db.index Options: -o create database with this name -a append files to database with this name -r remove files from database with this name -ia3m input directory (or glob of directories) with A3M-formatted files These files MUST have extension 'a3m'. -ihhm input directory (or glob of directories) with HHM (or HMMER) files These files MUST have extension 'hhm' (HHsuite) or 'hmm' (HMMER3). -ics input directory (or glob of directories) with column state sequences -log log file recording stderr stream of cstranslate and hhmake commands -csext extension of column state sequences (default: seq219) -hmm use HMMER-formatted files. These MUST have extension hmm (WARNING! HMMER format results in decreased performance over HHM format) -v [1-3] verbose mode (default: 2) -cpu number of threads to generate cs219 and hhm files (default = 8) -f 'file_glob' string with list of glob expression of files to remove Example 1: only -ia3m given; cs sequences and hhm files are generated from a3m files perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ Example 2: only -ihhm given; cs sequences are generated from hhm files, but no a3m db file perl hhblitsdb.pl -o databases/mydb -ihhm mydb/hhms/ Example 3: -ia3m and -ihhm given; cs sequences are generated from a3m files perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ -ihhm mydb/hhms/ Example 4: -ics, -ia3m, and -ihhm given; all db files are created perl hhblitsdb.pl -o databases/mydb -ia3m mydb/a3ms/ -ihhm mydb/hhms/ -ics mydb/cs/ Example 5: using glob expression to specify files (note the singe quotes) perl hhblitsdb.pl -o databases/mydb -ihhm 'mydbs*/hhms/*.hhm' Example 6: add files to database; cs sequences and hhm files are generated from a3m files perl hhblitsdb.pl -a databases/mydb -ia3m 'mydbs/a3ms/g1a*.a3m' Example 7: remove files from database perl hhblitsdb.pl -r databases/mydb -f 'mydbs/a3ms/g1a*.* mydbs2/' \end{verbatim} \normalsize \subsection{{\tt multithread.pl} -- Run a command for many files in parallel using multiple threads} \small \begin{verbatim} Usage: multithread.pl '' '' [-cpu ] [-v {0,1,2}] can include symbol $file for the full filename, e.g. /tmp/hh/1c1g_A.a3m, $name the filename without extension, e.g. /tmp/hh/1c1g_A, and $base for the filename without extension and path, e.g. 1c1g_A. -cpu number of threads to launch (default = 8) -v {0,1,2} verbose mode (default = 1) Example: multithread.pl '*.a3m' 'hhmake -i $file 1>$name.log 2>>error.log' -cpu 16 \end{verbatim} \normalsize \subsection{{\tt splitfasta.pl} -- Split multi-sequence FASTA file into single-sequence files} \small \begin{verbatim} Write files into current directory and name each file by the first word after ">" in the name line. Usage: splitfasta.pl infile [option] Option: -fam : use family-based name (for SCOP/ASTRAL sequences -name : use sequence name as file name (default) -ext : extension for sequence files (default=seq) \end{verbatim} \normalsize \subsection{{\tt renumberpdb.pl} -- Renumber indices in PDB file to match input sequence indices} \small \begin{verbatim} The program reads an input sequence in FASTA/A3M which must have a SCOP domain, PDB chain, or DALI domain identifier (e.g. d1hz4a_, 1hz4_A, or 1hz4A_1). It reads the corresponding PDB file from the given pdb directory and generates a new PDB file by aligning the input sequence to the sequence extracted from the ATOM records of the corresponding pdb chain and renumbering the residues in columns 23-26 according to the position in the input sequence. (HETATM records for MSE (selenomethionine) will be interpreted as ATOM records for MET in the alignment. MSE will be changed to MET in the output file.) Usage: renumberpdb.pl [options] infile [outfile] Example: renumberpdb.pl d1hz4a_.a3m /cluster/tmp/d1hz4a_.pdb Options: -o output file (default: .pdb -d give directory of pdb files (default=) -a [A|B] filter alternative location identifier (e.g. A or B) \end{verbatim} \normalsize \section{Selected changes from previous versions} \subsection{Up to 2.0.16 (January 2013)} \begin{itemize} \item Renamed option -nodiff to -all. The name -nodiff is very misleading as the diff option is not actually switched off on the query and db alignments. \item All error messages are now written to stderr (not stdout) and are of the form \verb`Error in : `. \item Added script splitfasta.pl to split multiple-sequence FASTA file in multiple single-sequence FASTA files. These are needed to run hhblits in parallel using multithread.pl. \item Implemented -maxmem option specifying maximum memory in GB. This changes the maximum length, up to which database sequences will be realigned using the memory-hungry maximum accuracy algorithm. This change will lead to more accurate results for longer HMMs (>5000 match states). \end{itemize} \subsection{Up to 2.0.2 (January 2012)} \begin{itemize} \item The iterative HMM-HMM search method HHblits has been added and the entire package is now called HH-suite. HHblits brings the power of HMM-HMM comparison to mainstream, general-purpose sequence searching and sequence analysis. \item Context-specific pseudocounts have been implemented HHsearch, improving its sensitivity and quality of alignments. \item The speed of HHsearch was further increased through the use of SSE3 instructions. \item An option \verb`-atab` for writing alignment as a table (with posteriors) to file was introduced \item HHsearch is now able to read HMMER3 profiles (but should not be used due to a loss of sensitivity). \item An optional local amino acid compositional bias correction was introduced(options \verb`-sc 5` and \verb`-scwin `). No improvements are seen on a standard SCOP single domain benchmark. However, their probably will be an improvement for more realistic sequences containing multiple domains, repeats, and regions of strong compositional bias. \item The score shift parameter and mact parameter have been optimized together on the optimization set of HHblits \cite{Remmert:2011}, which resulted in slight improvements of sensitivity and alignment quality. New default values are \verb`shift -0.03` bits and \verb`-mact 0.30`. \item Use of \verb`.hhdefaults` still works but is deprecated. Use an alias in your \verb`.bashrc` or equivalent file instead (See Installation). \item We removed a bug in \verb`-neff ` option that lead to the input MSA being reduced to only the master sequence when the target diversity was higher than the diversity of the input MSA. \item We removed a bug in addss.pl that could lead to errors for FASTA-formatted MSAs. \end{itemize} \subsection{1.6.0 (November 2010)} \begin{itemize} \item{A new procedure for estimation of P- and E-values has been implemented that circumvents the need to calibrate HMMs. Calibration can still be done if desired. By default, however, HHsearch now estimates the lambda and mu parameters of the extreme value distribution (EVD) for each pair of query and database HMMs from the lengths of both HMMs and the diversities of their underlying alignments. Apart from saving the time for calibration, this procedure is more reliable and noise-resistant. This change only applies to the default local search mode. For global searches, nothing has changed. Note that E-values in global search mode are unreliable and that sensitivity is reduced. \\ Old calibrations can still be used:\\ -calm 0 : use empirical query HMM calibration (old default)\\ -calm 1 : use empirical db HMM calibration\\ -calm 2 : use both query and db HMM calibration\\ -calm 3 : use neural network calibration (new default) } \item{Previous versions of HHsearch sometimes showed non-homologous hits with high probabilities by matching long stretches of secondary structure states, in particular long helices, in the absence of any similarity in the amino acid profiles. Capping the SS score by a linear function of the profile score now effectively suppresses these spurious high-scoring false positives. } \item{The output format for the query-template alignments has slightly changed. A 'Confidence' line at the bottom of each alignment block now reports the posterior probabilities for each alignment column when the -realign option is active (which it is by default). These probabilities are calculated in the Forward-Backward algorithm that is needed as input for the Maximum ACcuracy alignment algorithm. Also, the lines 'ss\_conf' with the confidence values for the secondary structure prediction are omitted by default. (They can be displayed with option '-showssconf'). To compensate, secondary structure predictions with confidence values between 7 and 9 are given in capital letters, while for the predictions with values between 0 and 6 lower-case letters are used. } \item{In the hhsearch output file in the header lines before each query-database alignment, the substitution matrix score (without gap penalties) of the query with the database sequence is now reported in bits per column. Also, the sum of probabilities for each pair of aligned residues from the MAC algorithm is reported here (0 if no MAC alignment is performed). } \item{HHsearch now performs realign with MAC-alignment only around Viterbi-hit. } \end{itemize} \subsection{1.5.0 (August 2007)} \begin{itemize} \item{By default, HHsearch realigns all displayed alignments in a second stage using the more accurate Maximum Accuracy (MAC) alignment algorithm (Durbin, Eddy, Krough, Mitchison: Biological sequence analysis, page 95; HMM-HMM version: J. S\"oding, unpublished). As before, the Viterbi algorithm is employed for searching and ranking the matches. The realignment step is parallelized (\verb`-cpu `) and typically takes a few seconds only. You can switch off the MAC realignment with the -norealign option. The posterior probability threshold is controlled with the \verb`-mact` option. This parameter controls the alignment algorithm's greediness. More precisely, the MAC algorithm finds the alignment that maximizes the sum of posterior probabilities minus mact for each aligned pair. Global alignments are generated with -mact 0, whereas -mact 0.5 will produce quite conservative local alignments. Default value is -mact 0.35, which produces alignments of roughly the same length as the Viterbi algorithm. The -global and -local (default) option now refer to both the Viterbi search stage as well as the MAC realignment stage. With -global (-local), the posterior probability matrix will be calculated for global (local) alignment. Note that '-local -mact 0' will produce global alignments from a local posterior probability matrix (which is not at all unreasonable). } \item{An amino acid compositional bias correction is now performed by default. This increases the sensitivity by 25\% at 0.01 errors per query and by 5\% at 0.1 errors per query. By recalibrating the Probabilities, the increased selectivity of this new version allows to give higher probabilities for the same P-values. Also, the score offset could be increased from -0.1 bits to 0 as a consequence. } \item{The algorithm that filters the set of the most diverse sequences (option -diff) has been improved. Before, it determined the set of the N most diverse sequences. In the case of multi-domain alignments, this could lead to severely underrepresented regions. E.g.\ when the first domain is only covered by a few fairly similar sequences and the second by hundreds of very diverse ones, most or all of the similar ones were removed. The '-diff N' option now filters the most diverse set of sequences, keeping at least N sequences in each block of >50 columns. This generally leads to a total number of sequences that is larger than N. Speed is similar. The default is '-diff 100' for hhmake and hhsearch. Speed is similar. Use -diff 0 to switch this filter off. } \item{The sensitivity for the -global alignment option has been significantly increased by a more robust statistical treatment. The sensitivity in -global mode is now only 0-10\% lower than for the default -local option on a SCOP benchmark, i.e., when the query or the templates represent single structural domains. The E-values are now more realistic, although still not as reliable as for -local. The Probabilities were recalibrated. } \item{A new binary hhalign has been added. It is similar to hhsearch, but performs only pairwise comparisons. It can produce dot plots, tables of aligned residues, and it can sample alternative alignments stochastically. It uses the MAC algorithm by default. } \item{HHsearch and hhalign can generate query-template multiple alignments in FASTA, A2M, or A3M format with the -ofas, -oa2m, -oa3m options } \item{Returned error values were changed to comply with convention that 0 means no errors: \begin{enumerate} \item{Finished successfully} \item{Format error in input files} \item{File access error} \item{Out of memory } \item{Syntax error on command line} \item{Internal logic error (please report)} \item{Internal numeric error (please report)} \item{Other} \end{enumerate} } \end{itemize} Is anyone still interested in Mac OSX/PPC or SunOS support? \section{License} The HHsearch/HHblits software package is distributed under Gnu Public License, Version 3. This means that the HH-suite 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 in the file \verb`LICENSE`. If not, see \url{http://www.gnu.org/licenses/}. The hhsuite contains in file \verb`hhprefilter.C` code adapted from Michael Farrar (\url{http://sites.google.com/site/farrarmichael/smith-waterman} and \cite{Farrar:2007}) His code is marked in the file hhprefilter.C. The copy right of his code is shown below: \begin{verbatim} Copyright 2006, by Michael Farrar. All rights reserved. The SWSSE2 program and documentation may not be sold or incorporated into a commercial product, in whole or in part, without written consent of Michael Farrar. For further information regarding permission for use or reproduction, please contact Michael Farrar at: farrar.michael@gmail.com THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \end{verbatim} %\bibliographystyle{model3-num-names} \bibliography{../../papers/johannes} \section{Acknowlegements} We thank the many users of HH-suite who sent bug reports and who gave critical feedback that led to improvements in the software. %We gratefully acknowlege contributions from Martin Steinegger, Christof Angerm\"uller, and Andreas Biegert, and Markus Meier to the code. We are grateful to Lazlo Kajan, Stefan M\"oller and the Debian team for making the HH-suite software available as a Debian package. J.S. thanks Andrei Lupas for his invaluable support, encouragement, and feedback during the first five years of the work on HH-suite in his department. \vspace{20mm} \begin{center} Good luck with your work! \vspace{5mm} Johannes S\"oding, Michael Remmert, Andy Hauser\\[2mm] Gene Center Munich\\ Ludwig-Maximilians-Universit\"at M\"unchen\\ Feodor-Lynen-Strasse 25\\ 81377 Munich\\ http://www.soeding.genzentrum.lmu.de\\ soeding@genzentrum.lmu.de \end{center} \end{document} hhsuite-2.0.16/src/hhhmm.h0000775172256617226630000001552612110430072017632 0ustar hauserscientific_computing// hhhmm.h class CSCounts; class HMM { public: HMM(int maxseqdis=MAXSEQDIS, int maxres=par.maxres); ~HMM(); HMM& operator=(HMM&); int n_display; // number of sequences stored for display of alignment (INCLUDING >ss_ and >cf_ sequences) int n_seqs; // number of sequences read in (INCLUDING >ss_ and >cf_ sequences) char** sname; // names of stored sequences char** seq; // residues of stored sequences (first at pos 1!) int ncons; // index of consensus sequence int nfirst; // index of first sequence (query sequence of HMM) int nss_dssp; // index of seq[] with secondary structure by dssp int nsa_dssp; // index of seq[] with solvent accessibility by dssp int nss_pred; // index of seq[] with predicted secondary structure int nss_conf; // index of seq[] with confidence values for secondary structure prediction int L; // length of HMM = number of match states; set in declaration of HMM object int N_in; // number of sequences in alignment int N_filtered; // number of sequences after filtering float* Neff_M; // Neff_M[i] = diversity of subalignment of seqs that have residue in col i float* Neff_I; // Neff_I[i] = diversity of subalignment of seqs that have insert in col i float* Neff_D; // Neff_D[i] = diversity of subalignment of seqs that have delete in col i float Neff_HMM; // average number of Neff over total length of HMM char* longname; // Full name of first sequence of original alignment (NAME field) char name[NAMELEN]; // HMM name = first word in longname in lower case char file[NAMELEN]; // Basename (with path, without extension) of alignment file that was used to construct the HMM char fam[NAMELEN]; // family ID (derived from name) (FAM field) char sfam[IDLEN]; // superfamily ID (derived from name) char fold[IDLEN]; // fold ID (derived from name) char cl[IDLEN]; // class ID (derived from name) float lamda, mu; // coefficients for aa score distribution of HMM using parameters in 'Parameters par' // Make a flat copy of q void FlatCopyTo(HMM* t); // Read an HMM from a HHsearch .hhm file and return 0 at end of file int Read(FILE* dbf, char* path=NULL); // Read an HMM from a HMMer .hmm file; return 0 at end of file int ReadHMMer(FILE* dbf, char* filestr=NULL); // Read an HMM from a HMMer3 .hmm file; return 0 at end of file int ReadHMMer3(FILE* dbf, char* filestr=NULL); // Add transition pseudocounts to HMM void AddTransitionPseudocounts(float gapd=par.gapd, float gape=par.gape, float gapf=par.gapf, float gapg=par.gapg, float gaph=par.gaph, float gapi=par.gapi, float gapb=par.gapb); // Generate an amino acid frequency matrix g[][] with full pseudocount admixture (tau=1) void PreparePseudocounts(); // Add context specific amino acid pseudocounts to HMM: t.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] void AddContextSpecificPseudocounts(char pcm=par.pcm, float pca=par.pca, float pcb=par.pcb, float pcc=par.pcc); // Fill CountProfile with HMM-counts for CS pseudocount calculation void fillCountProfile(cs::CountProfile *csProfile); // Add amino acid pseudocounts to HMM: t.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] void AddAminoAcidPseudocounts(char pcm=par.pcm, float pca=par.pca, float pcb=par.pcb, float pcc=par.pcc); // Calculate amino acid backround frequencies for HMM void CalculateAminoAcidBackground(); // Add no amino acid pseudocounts to HMM: copy t.p[i][a] = f[i][a] void NoAminoAcidPseudocounts() {for(int i=1; i<=L; i++) for(int a=0; a<20; a++) p[i][a]=f[i][a];}; // Divide aa probabilties by square root of locally averaged background frequencies void DivideBySqrtOfLocalBackgroundFreqs(int D); // Factor Null model into HMM t void IncludeNullModelInHMM(HMM* q, HMM* t, int columnscore=par.columnscore); // Write HMM to output file void WriteToFile(char* outfile); // Insert calibration line 'EVD lamda mu hashvalue' into HMM file void InsertCalibration(char* infile); // Transform log to lin transition probs void Log2LinTransitionProbs(float beta=1.0); // Set query columns in His-tags etc to Null model distribution void NeutralizeTags(); // Calculate effective number of sequences using profiles INCLUDING pseudocounts float CalcNeff(); // Add secondary structure prediction to HMM void AddSSPrediction(char seq_pred[], char seq_conf[]); // Initialize f[i][a] with query HMM void MergeQueryHMM(HMM* q, float wk[]); // Rescale rate matrices P[a][b], R[a][b] according to HMM av. aa composition in pav[a] void RescaleMatrix(); // Needed for SSE2 prefiltering with HHblits with amino acid alphabet float** p; // p[i][a] = prob of finding amino acid a in column i WITH OPTIMUM pseudocounts float pav[NAA]; // pav[a] = average freq of amino acids in HMM (including subst matrix pseudocounts) bool divided_by_local_bg_freqs; // avoid dividing p[i]a[] by sqrt(pb[a]) more than once private: float** f; // f[i][a] = prob of finding amino acid a in column i WITHOUT pseudocounts float** g; // g[i][a] = prob of finding amino acid a in column i WITH pseudocounts float** tr; // tr[i][X2Y] = log2 of transition probabilities M2M M2I M2D I2M I2I D2M D2D char* ss_dssp; // secondary structure determined by dssp 0:- 1:H 2:E 3:C 4:S 5:T 6:G 7:B char* sa_dssp; // solvent accessibility state determined by dssp 0:- 1:A (absolutely buried) 2:B 3:C 4:D 5:E (exposed) char* ss_pred; // predicted secondary structure 0:- 1:H 2:E 3:C char* ss_conf; // confidence value of prediction 0:- 1:0 ... 10:9 int* l; // l[i] = pos. of j'th match state in aligment char trans_lin; // transition probs are given in log or lin space? (0: p_tr 1: log(p_tr) bool dont_delete_seqs; // set to one if flat copy of seqs and sname was made to a hit object, to avoid deletion bool has_pseudocounts; // set to true if HMM contains pseudocounts // Utility for Read() int Warning(FILE* dbf, char line[], char name[]) { if (v) cerr<<"\nWARNING in "< // cin, cout, cerr #include // ofstream, ifstream #include // printf using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // clock #include // islower, isdigit etc #include "cs.h" // context-specific pseudocounts #include "context_library.h" #include "library_pseudocounts-inl.h" #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.C" // list data structure #include "hash.C" // hash data structure #include "hhdecl.C" // Constants, global variables, struct Parameters #include "hhutil.C" // MatchChr, InsertChr, aa2i, i2aa, log2, fast_log2, ScopID, WriteToScreen, #include "hhmatrices.C" // BLOSUM50, GONNET, HSDM #include "hhhmm.h" // class Hit #include "hhhit.h" // class Hit #include "hhalignment.h" // class Alignment #include "hhhalfalignment.h" // class HalfAlignment #include "hhfullalignment.h" // class FullAlignment #include "hhhitlist.h" // class Hit #endif ///////////////////////////////////////////////////////////////////////////////////// //// Class HMM ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // Object constructor ///////////////////////////////////////////////////////////////////////////////////// HMM::HMM(int maxseqdis, int maxres) { sname = new char*[maxseqdis]; // names of stored sequences seq = new char*[maxseqdis]; // residues of stored sequences (first at pos 1!) Neff_M = new float[maxres]; // Neff_M[i] = diversity of subalignment of seqs that have residue in col i Neff_I = new float[maxres]; // Neff_I[i] = diversity of subalignment of seqs that have insert in col i Neff_D = new float[maxres]; // Neff_D[i] = diversity of subalignment of seqs that have delete in col i longname = new char[DESCLEN]; // Full name of first sequence of original alignment (NAME field) ss_dssp = new char[maxres]; // secondary structure determined by dssp 0:- 1:H 2:E 3:C 4:S 5:T 6:G 7:B sa_dssp = new char[maxres]; // solvent accessibility state determined by dssp 0:- 1:A (absolutely buried) 2:B 3:C 4:D 5:E (exposed) ss_pred = new char[maxres]; // predicted secondary structure 0:- 1:H 2:E 3:C ss_conf = new char[maxres]; // confidence value of prediction 0:- 1:0 ... 10:9 l = new int[maxres]; // l[i] = pos. of j'th match state in aligment f = new float*[maxres]; // f[i][a] = prob of finding amino acid a in column i WITHOUT pseudocounts g = new float*[maxres]; // f[i][a] = prob of finding amino acid a in column i WITH pseudocounts p = new float*[maxres]; // p[i][a] = prob of finding amino acid a in column i WITH OPTIMUM pseudocounts tr = new float*[maxres]; // log2 of transition probabilities M2M M2I M2D I2M I2I D2M D2D // tr_lin = new float*[maxres]; // linear transition probabilities M2M M2I M2D I2M I2I D2M D2D for (int i=0; i n_display) { for (int k=n_display; k n_display) { for (int k=n_display; k n_display) { for (int k=n_display; k=4) cout<<"Reading in HMM "< k=n int h; // index for character in input line int l=1; // index of character in sequence seq[k] int i=1; // index of match states in ss_dssp[i] and ss_pred[i] sequence int n_seq=0; // number of sequences to be displayed EXCLUDING ss sequences cur_seq[0]='-'; // overwrite '\0' character at beginning to be able to do strcpy(*,cur_seq) k=-1; while (fgetline(line,LINELEN-1,dbf) && line[0]!='#') { if (v>=4) cout<<"Read from file:"<') //line contains sequence name { if (k>=MAXSEQDIS-1) //maximum number of allowable sequences exceeded { if (v>=2) cerr<<"WARNING in "<ss_dssp",8)) nss_dssp=k; else if (!strncmp(line,">sa_dssp",8)) nsa_dssp=k; else if (!strncmp(line,">ss_pred",8)) nss_pred=k; else if (!strncmp(line,">ss_conf",8)) nss_conf=k; else if (!strncmp(line,">Cons-",6) || !strncmp(line,">Consensus",10)) ncons=k; else { if (nfirst==-1) nfirst=k; // if (n_seq>=par.nseqdis) // {while (fgetline(line,LINELEN-1,dbf) && line[0]!='#'); k--; break;} n_seq++; } //If this is not the first sequence then store residues of previous sequence if (k>0) { seq[k-1]=new(char[strlen(cur_seq)+1]); if (!seq[k-1]) MemoryError("array of sequences to display"); strcpy(seq[k-1],cur_seq); } // store sequence name strcut(line+1); //find next white-space character and overwrite it with end-of-string character sname[k] = new (char[strlen(line+1)+1]); //+1 for terminating '\0' if (!sname[k]) MemoryError("array of names for sequences to display"); strcpy(sname[k],line+1); //store sequence name in **name l=1; i=1; } else //line contains sequence residues { if (k==-1) { cerr<'\0' && l=0 && line[h]!='.') { char c=ss2ss(line[h]); cur_seq[l]=c; if (c!='.' && !(c>='a' && c<='z')) ss_dssp[i++]=ss2i(c); l++; } else if (v && ss2i(line[h])==-2) cerr<'\0' && l=0) { char c=line[h]; cur_seq[l]=c; if (c!='.' && !(c>='a' && c<='z')) sa_dssp[i++]=sa2i(c); l++; } else if (v && sa2i(line[h])==-2) cerr<'\0' && l=0 && ss2i(line[h])<=3 && line[h]!='.') { char c=ss2ss(line[h]); cur_seq[l]=c; if (c!='.' && !(c>='a' && c<='z')) ss_pred[i++]=ss2i(c); l++; } else if (v && ss2i(line[h])==-2) cerr<'\0' && l='0' && line[h]<='9')) { cur_seq[l]=line[h]; ss_conf[l]=cf2i(line[h]); l++; } else if (v && cf2i(line[h])==-2) cerr<'\0' && l=0 && line[h]!='.') // ignore '.' and white-space characters ' ', \t and \n (aa2i()==-1) {cur_seq[l]=line[h]; l++;} else if (aa2i(line[h])==-2 && v) cerr<=0) { seq[k]=new(char[strlen(cur_seq)+1]); if (!seq[k]) MemoryError("array of sequences to display"); strcpy(seq[k],cur_seq); } n_seqs=k+1; // DEBUG if (v>=4) { printf("nss_dssp=%i nsa_dssp=%i nss_pred=%i nss_conf=%i nfirst=%i\n",nss_dssp,nsa_dssp,nss_pred,nss_conf,nfirst); for (k=0; k"< 1.1 to generate hhm files.\n"); else if (!strcmp("AVER",str4)) {} // AVER line scrapped else if (!strcmp("NULL",str4)) { ptr=line+4; for (a=0; a<20 && ptr; ++a) //s2[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids pb[s2a[a]] = (float) fpow2(float(-strinta(ptr))/HMMSCALE); if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("\nNULL "); for (a=0; a<20; ++a) printf("%5.1f ",100.*pb[s2a[a]]); printf("\n"); } } ///////////////////////////////////////////////////////////////////////////////////// // Read transition probabilities from start state else if (!strcmp("HMM",str3)) { fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels fgetline(line,LINELEN-1,dbf); // Skip line with transition labels ptr=line; for (a=0; a<=D2D && ptr; ++a) tr[0][a] = float(-strinta(ptr))/HMMSCALE; //store transition probabilites as log2 values // strinta returns next integer in string and puts ptr to first char // after the integer. Returns -99999 if '*' is found. // ptr is set to 0 if no integer is found after ptr. Neff_M[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with M->? transition Neff_I[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with I->? transition Neff_D[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with D->? transition if (!ptr) return Warning(dbf,line,name); ///////////////////////////////////////////////////////////////////////////////////// // Read columns of HMM int next_i=0; // index of next column while (fgetline(line,LINELEN-2,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') { if (strscn(line)==NULL) continue; // skip lines that contain only white space // Read in AA probabilities ptr=line+1; int prev_i = next_i; next_i = strint(ptr); ++i; if (v && next_i!=prev_i+1) if (++warn<=5) { cerr<L) { cerr<par.maxres-2) { fgetline(line,LINELEN-1,dbf); // Skip line continue; } for (a=0; a<20 && ptr; ++a) // f[i][s2a[a]] = (float)pow(2.,float(-strinta(ptr))/HMMSCALE); f[i][s2a[a]] = fpow2(float(-strinta(ptr))/HMMSCALE); // speed-up ~5 s for 10000 SCOP domains //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids l[i]=strint(ptr); if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("%s",line); printf("%6i ",i); for (a=0; a<20; ++a) printf("%5.1f ",100*f[i][s2a[a]]); printf("%5i",l[i]); printf("\n"); } // Read transition probabilities fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels if (line[0]!=' ' && line[0]!='\t') return Warning(dbf,line,name); ptr=line; for (a=0; a<=D2D && ptr; ++a) tr[i][a] = float(-strinta(ptr))/HMMSCALE; //store transition prob's as log2-values Neff_M[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with M->? transition if (Neff_M[i] == 0) { Neff_M[i] = 1; } Neff_I[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with I->? transition Neff_D[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with D->? transition if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf(" "); for (a=0; a<=D2D; ++a) printf("%5.1f ",100*fpow2(tr[i][a])); printf("%5.1f %5.1f %5.1f \n",Neff_M[i],Neff_I[i],Neff_D[i]); } } if (line[0]=='/' && line[1]=='/') break; } else if (v) cerr< stop reading in // Set coefficients of EVD (= 0.0 if not calibrated for these parameters) // lamda = lamda_hash.Show(par.Key()); // mu = mu_hash.Show(par.Key()); if (lamda && v>=3) printf("HMM %s is already calibrated: lamda=%-5.3f, mu=%-5.2f\n",name,lamda,mu); if (v && i!=L) cerr<par.maxres-2) {i=par.maxres-2; cerr<=2) cout<<"Read in HMM "<=4) cout<<"Reading in HMM "<=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SADSS records with more than %i residues.\n",name,par.maxres); else strcat(seq[nsa_dssp],ptr); } } else if (!strncmp("SSPRD",line,5)) { if (nss_pred<0) { nss_pred=k++; seq[nss_pred] = new(char[par.maxres+2]); sname[nss_pred] = new(char[15]); strcpy(seq[nss_pred]," "); strcpy(sname[nss_pred],"ss_pred"); } ptr=strscn(line+5); if (ptr) { strcut(ptr); if (strlen(seq[nss_pred])+strlen(ptr)>=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SSPRD records with more than %i residues.\n",name,par.maxres); else strcat(seq[nss_pred],ptr); } } else if (!strncmp("SSCON",line,5)) { if (nss_conf<0) { nss_conf=k++; seq[nss_conf] = new(char[par.maxres+2]); sname[nss_conf] = new(char[15]); strcpy(seq[nss_conf]," "); strcpy(sname[nss_conf],"ss_conf"); } ptr=strscn(line+5); if (ptr) { strcut(ptr); if (strlen(seq[nss_conf])+strlen(ptr)>=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SSPRD records with more than %i residues.\n",name,par.maxres); else strcat(seq[nss_conf],ptr); } } else if (!strncmp("SSCIT",line,5)) continue; else if (!strcmp("XT ",str4)) continue; else if (!strcmp("NULT",str4)) continue; else if (!strcmp("NULE",str4)) { ptr=line+4; for (a=0; a<20 && ptr; ++a) //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids pb[s2a[a]] = (float) 0.05 * fpow2(float(strinta(ptr,-99999))/HMMSCALE); if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("\nNULL "); for (a=0; a<20; ++a) printf("%6.3g ",100.*pb[s2a[a]]); printf("\n"); } } else if (!strcmp("EVD ",str4)) { char* ptr=line+4; ptr = strscn(ptr); sscanf(ptr,"%f",&lamda); ptr = strscn(ptr); sscanf(ptr,"%f",&mu); if (lamda<0) { if (v>=2 && ignore_hmmer_cal==0) cerr<=4) { printf(" "); for (a=0; a<=D2D && ptr; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); printf("\n"); } // Prepare to store DSSP states (if there are none, delete afterwards) nss_dssp=k++; seq[nss_dssp] = new(char[par.maxres+2]); sname[nss_dssp] = new(char[15]); strcpy(sname[nss_dssp],"ss_dssp"); ///////////////////////////////////////////////////////////////////////////////////// // Read columns of HMM int next_i=0; // index of next column while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') { if (strscn(line)==NULL) continue; // skip lines that contain only white space // Read in AA probabilities ptr=line; int prev_i = next_i; next_i = strint(ptr); ++i; if (v && next_i!=prev_i+1) if (++warn<5) { cerr<L) { cerr<L && v) cerr<=par.maxres-2) { fgetline(line,LINELEN-1,dbf); // Skip two lines fgetline(line,LINELEN-1,dbf); continue; } for (a=0; a<20 && ptr; ++a) f[i][s2a[a]] = (float) pb[s2a[a]]*fpow2(float(strinta(ptr,-99999))/HMMSCALE); //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("%6i ",i); for (a=0; a<20; ++a) printf("%6.3g ",100*f[i][s2a[a]]); printf("\n"); } // Read insert emission line fgetline(line,LINELEN-1,dbf); ptr = strscn(line); if (!ptr) return Warning(dbf,line,name); annotchr[i]=uprchr(*ptr); if (*ptr!='-' && *ptr!=' ' && *ptr!='X' && *ptr!='x') annot=1; // Read annotation character and seven transition probabilities fgetline(line,LINELEN-1,dbf); ptr = strscn(line); switch (*ptr) { case 'H': ss_dssp[i]=1; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'E': ss_dssp[i]=2; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'C': ss_dssp[i]=3; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'S': ss_dssp[i]=4; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'T': ss_dssp[i]=5; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'G': ss_dssp[i]=6; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'B': ss_dssp[i]=7; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'I': dssp=1; case '~': ss_dssp[i]=3; seq[nss_dssp][i]=*ptr; break; case '-': // no SS available from any template case '.': // no clear consensus SS structure case 'X': // no clear consensus SS structure ss_dssp[i]=0; seq[nss_dssp][i]='-'; break; default: ss_dssp[i]=0; seq[nss_dssp][i]=*ptr; break; } ptr+=2; for (a=0; a<=D2D && ptr; ++a) tr[i][a] = float(strinta(ptr,-99999))/HMMSCALE; //store transition prob's as log2-values if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf(" "); for (a=0; a<=D2D; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); printf("\n"); } } if (line[0]=='/' && line[1]=='/') break; } } //while(getline) if (L==0) return 0; //End of db file -> stop reading in // Set coefficients of EVD (= 0.0 if not calibrated for these parameters) // lamda = lamda_hash.Show(par.Key()); // mu = mu_hash.Show(par.Key()); if (lamda && v>=2) printf("HMM %s is already calibrated: lamda=%-5.3f, mu=%-5.2f\n",name,lamda,mu); if (v && i!=L) cerr<=par.maxres-2) {i=par.maxres-2; cerr<0) strcat(longname," "); strncat(longname,name,DESCLEN-strlen(longname)-1); // longname = ACC NAME DESC if (strlen(name)>0) strcat(longname," "); strncat(longname,desc,DESCLEN-strlen(longname)-1); longname[DESCLEN-1]='\0'; ScopID(cl,fold,sfam,fam);// get scop classification from basename (e.g. a.1.2.3.4) RemoveExtension(file,filestr); // copy name of dbfile without extension into 'file' // Secondary structure if (!dssp) { // remove dssp sequence delete[] seq[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed delete[] sname[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed nss_dssp=-1; k--; } else { seq[nss_dssp][0]='-'; seq[nss_dssp][L+1]='\0'; } if (nss_pred>=0) { for (i=1; i<=L; ++i) ss_pred[i] = ss2i(seq[nss_pred][i]); if (nss_conf>=0) for (i=1; i<=L; ++i) ss_conf[i] = cf2i(seq[nss_conf][i]); else for (i=1; i<=L; ++i) ss_conf[i] = 5; } // Copy query (first sequence) and consensus residues? if (par.showcons) { sname[k]=new(char[10]); strcpy(sname[k],"Consensus"); sname[k+1]=new(char[strlen(longname)+1]); strcpy(sname[k+1],longname); seq[k]=new(char[L+2]); seq[k][0]=' '; seq[k][L+1]='\0'; seq[k+1]=new(char[L+2]); seq[k+1][0]=' '; seq[k+1][L+1]='\0'; for (i=1; i<=L; ++i) { float pmax=0.0; int amax=0; for (a=0; apmax) {amax=a; pmax=f[i][a];} if (pmax>0.6) seq[k][i]=i2aa(amax); else if (pmax>0.4) seq[k][i]=lwrchr(i2aa(amax)); else seq[k][i]='x'; seq[k+1][i]=i2aa(amax); } ncons=k++; // nfirst is set later! } else { sname[k]=new(char[strlen(longname)+1]); strcpy(sname[k],longname); seq[k]=new(char[L+2]); seq[k][0]=' '; seq[k][L+1]='\0'; } if (annot) // read in some annotation characters? { annotchr[0]=' '; annotchr[L+1]='\0'; strcpy(seq[k],annotchr); // overwrite the consensus sequence with the annotation characters } else if (!par.showcons) // we have not yet calculated the consensus, but we need it now as query (first sequence) { for (i=1; i<=L; ++i) { float pmax=0.0; int amax=0; for (a=0; apmax) {amax=a; pmax=f[i][a];} seq[k][i]=i2aa(amax); } } // printf("%i query name=%s seq=%s\n",n,sname[n],seq[n]); nfirst=k++; n_display=k; n_seqs=k; // Calculate overall Neff_HMM Neff_HMM=0; for (i=1; i<=L; ++i) { float S=0.0; for (a=0; a<20; ++a) if (f[i][a]>1E-10) S-=f[i][a]*fast_log2(f[i][a]); Neff_HMM+=(float) fpow2(S); } Neff_HMM/=L; for (i=0; i<=L; ++i) Neff_M[i] = Neff_I[i] = Neff_D[i] = 10.0; // to add only little additional pseudocounts! Neff_M[L+1]=1.0f; Neff_I[L+1]=Neff_D[L+1]=0.0f; if (v>=2) cout<<"Read in HMM "<=4) cout<<"Reading in HMM "<=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SADSS records with more than %i residues.\n",name,par.maxres); else strcat(seq[nsa_dssp],ptr); } } else if (!strncmp("SSPRD",line,5)) { if (nss_pred<0) { nss_pred=k++; seq[nss_pred] = new(char[par.maxres+2]); sname[nss_pred] = new(char[15]); strcpy(seq[nss_pred]," "); strcpy(sname[nss_pred],"ss_pred"); } ptr=strscn(line+5); if (ptr) { strcut(ptr); if (strlen(seq[nss_pred])+strlen(ptr)>=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SSPRD records with more than %i residues.\n",name,par.maxres); else strcat(seq[nss_pred],ptr); } } else if (!strncmp("SSCON",line,5)) { if (nss_conf<0) { nss_conf=k++; seq[nss_conf] = new(char[par.maxres+2]); sname[nss_conf] = new(char[15]); strcpy(seq[nss_conf]," "); strcpy(sname[nss_conf],"ss_conf"); } ptr=strscn(line+5); if (ptr) { strcut(ptr); if (strlen(seq[nss_conf])+strlen(ptr)>=(unsigned)(par.maxres)) printf("WARNING: HMM %s has SSPRD records with more than %i residues.\n",name,par.maxres); else strcat(seq[nss_conf],ptr); } } else if (!strncmp("SSCIT",line,5)) continue; else if (!strcmp("XT ",str4)) continue; ////////////////////////////////////////////////////////////////////////////////////////////////////// else if (!strncmp("STATS LOCAL",line,11)) continue; else if (!strcmp("EFFN",str4)) { ptr=line+4; float effn = strflt(ptr); // Calculate Neff_HMM by using f(x) = ax^0.1 + bx^0.5 + cx + d (fitted with scop25 dataset) Neff_HMM = -1.403534 * pow(effn, 0.1) + 4.428118 * pow(effn, 0.5) - 0.2885410 * effn - 1.108568; } ///////////////////////////////////////////////////////////////////////////////////// // Read transition probabilities from start state else if (!strncmp("HMM",line,3)) { fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels fgetline(line,LINELEN-1,dbf); // Skip line with transition labels ptr=strscn(line); if (!strncmp("COMPO",ptr,5)) { ptr=ptr+5; for (a=0; a<20 && ptr; ++a) //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids pb[s2a[a]] = (float) exp(-1.0*strflta(ptr,99999)); if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("\nNULL "); for (a=0; a<20; ++a) printf("%6.3g ",100.*pb[s2a[a]]); printf("\n"); } fgetline(line,LINELEN-1,dbf); // Read next line } fgetline(line,LINELEN-1,dbf); // Skip line with 0-states insert probabilities ptr = strscn(line); for (a=0; a<=D2D && ptr; ++a) tr[0][a] = log2((float) exp(-1.0*strflta(ptr,99999))); //store transition probabilites as log2 values // strinta returns next integer in string and puts ptr to first char // after the integer. Returns -99999 if '*' is found. // ptr is set to 0 if no integer is found after ptr. if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf(" "); for (a=0; a<=D2D && ptr; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); printf("\n"); } // Prepare to store DSSP states (if there are none, delete afterwards) nss_dssp=k++; seq[nss_dssp] = new(char[par.maxres+2]); sname[nss_dssp] = new(char[15]); strcpy(sname[nss_dssp],"ss_dssp"); ///////////////////////////////////////////////////////////////////////////////////// // Read columns of HMM int next_i=0; // index of next column while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') { if (strscn(line)==NULL) continue; // skip lines that contain only white space // Read in AA probabilities ptr=line; int prev_i = next_i; next_i = strint(ptr); ++i; if (v && next_i!=prev_i+1) if (++warn<5) { cerr<L) { cerr<L && v) cerr<=par.maxres-2) { fgetline(line,LINELEN-1,dbf); // Skip two lines fgetline(line,LINELEN-1,dbf); continue; } for (a=0; a<20 && ptr; ++a) f[i][s2a[a]] = (float) exp(-1.0*strflta(ptr,99999)); //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf("%6i ",i); for (a=0; a<20; ++a) printf("%6.3g ",100*f[i][s2a[a]]); printf("\n"); } // Ignore MAP annotation ptr = strscn(ptr); //find next word ptr = strscn_ws(ptr); // ignore word // Read RF and CS annotation ptr = strscn(ptr); if (!ptr) return Warning(dbf,line,name); annotchr[i]=uprchr(*ptr); if (*ptr!='-' && *ptr!=' ' && *ptr!='X' && *ptr!='x') annot=1; ptr = strscn(ptr); switch (*ptr) { case 'H': ss_dssp[i]=1; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'E': ss_dssp[i]=2; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'C': ss_dssp[i]=3; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'S': ss_dssp[i]=4; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'T': ss_dssp[i]=5; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'G': ss_dssp[i]=6; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'B': ss_dssp[i]=7; seq[nss_dssp][i]=*ptr; dssp=1; break; case 'I': dssp=1; case '~': ss_dssp[i]=3; seq[nss_dssp][i]=*ptr; break; case '-': // no SS available from any template case '.': // no clear consensus SS structure case 'X': // no clear consensus SS structure ss_dssp[i]=0; seq[nss_dssp][i]='-'; break; default: ss_dssp[i]=0; seq[nss_dssp][i]=*ptr; break; } // Read insert emission line fgetline(line,LINELEN-1,dbf); // Read seven transition probabilities fgetline(line,LINELEN-1,dbf); ptr=line; for (a=0; a<=D2D && ptr; ++a) tr[i][a] = log2((float) exp(-1.0*strflta(ptr,99999))); //store transition prob's as log2-values if (!ptr) return Warning(dbf,line,name); if (v>=4) { printf(" "); for (a=0; a<=D2D; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); printf("\n"); } } if (line[0]=='/' && line[1]=='/') break; } } //while(getline) if (L==0) return 0; //End of db file -> stop reading in if (v && i!=L) cerr<=par.maxres-2) {i=par.maxres-2; cerr<0) strcat(longname," "); strncat(longname,name,DESCLEN-strlen(longname)-1); // longname = ACC NAME DESC if (strlen(name)>0) strcat(longname," "); strncat(longname,desc,DESCLEN-strlen(longname)-1); longname[DESCLEN-1]='\0'; ScopID(cl,fold,sfam,fam);// get scop classification from basename (e.g. a.1.2.3.4) RemoveExtension(file,filestr); // copy name of dbfile without extension into 'file' // Secondary structure if (!dssp) { // remove dssp sequence delete[] seq[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed delete[] sname[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed nss_dssp=-1; k--; } else { seq[nss_dssp][0]='-'; seq[nss_dssp][L+1]='\0'; } if (nss_pred>=0) { for (i=1; i<=L; ++i) ss_pred[i] = ss2i(seq[nss_pred][i]); if (nss_conf>=0) for (i=1; i<=L; ++i) ss_conf[i] = cf2i(seq[nss_conf][i]); else for (i=1; i<=L; ++i) ss_conf[i] = 5; } // Copy query (first sequence) and consensus residues? if (par.showcons) { sname[k]=new(char[10]); strcpy(sname[k],"Consensus"); sname[k+1]=new(char[strlen(longname)+1]); strcpy(sname[k+1],longname); seq[k]=new(char[L+2]); seq[k][0]=' '; seq[k][L+1]='\0'; seq[k+1]=new(char[L+2]); seq[k+1][0]=' '; seq[k+1][L+1]='\0'; for (i=1; i<=L; ++i) { float pmax=0.0; int amax=0; for (a=0; apmax) {amax=a; pmax=f[i][a];} if (pmax>0.6) seq[k][i]=i2aa(amax); else if (pmax>0.4) seq[k][i]=lwrchr(i2aa(amax)); else seq[k][i]='x'; seq[k+1][i]=i2aa(amax); } ncons=k++; // nfirst is set later! } else { sname[k]=new(char[strlen(longname)+1]); strcpy(sname[k],longname); seq[k]=new(char[L+2]); seq[k][0]=' '; seq[k][L+1]='\0'; } if (annot) // read in some annotation characters? { annotchr[0]=' '; annotchr[L+1]='\0'; strcpy(seq[k],annotchr); // overwrite the consensus sequence with the annotation characters } else if (!par.showcons) // we have not yet calculated the consensus, but we need it now as query (first sequence) { for (i=1; i<=L; ++i) { float pmax=0.0; int amax=0; for (a=0; apmax) {amax=a; pmax=f[i][a];} seq[k][i]=i2aa(amax); } } // printf("%i query name=%s seq=%s\n",n,sname[n],seq[n]); nfirst=k++; n_display=k; n_seqs=k; // If no effektive number of sequences is given, calculate Neff_HMM by given profile if (Neff_HMM == 0) { for (i=1; i<=L; ++i) { float S=0.0; for (a=0; a<20; ++a) if (f[i][a]>1E-10) S-=f[i][a]*fast_log2(f[i][a]); Neff_HMM+=(float) fpow2(S); } Neff_HMM/=L; } for (i=0; i<=L; ++i) Neff_M[i] = Neff_I[i] = Neff_D[i] = 10.0; // to add only little additional pseudocounts! Neff_M[L+1]=1.0f; Neff_I[L+1]=Neff_D[L+1]=0.0f; if (v>=2) cout<<"Read in HMM "< pI2I=0 gape=1 -> pI2I=0.75 gape=inf -> pI2I=1. pI2I=1.0*gape/(gape-1+1.0/0.75); pI2M=1-pI2I; // gape=0 -> pD2D=0 gape=1 -> pD2D=0.75 gape=inf -> pD2D=1. pD2D=1.0*gape/(gape-1+1.0/0.75); pD2M=1-pD2D; for (i=0; i<=L; ++i) //for all columns in HMM { // Transitions from M state p0 = (Neff_M[i]-1)*fpow2(tr[i][M2M]) + gapb*pM2M; p1 = (Neff_M[i]-1)*fpow2(tr[i][M2D]) + gapb*pM2D; p2 = (Neff_M[i]-1)*fpow2(tr[i][M2I]) + gapb*pM2I; if (i==0) p1=p2=0; //from M(0) no transition to D(1) and I(0) possible if (i==L) p1=p2=0; //from M(L) no transition to D(L+1) and I(L+1) possible sum = p0+p1+p2+FLT_MIN; tr[i][M2M] = fast_log2(p0/sum); tr[i][M2D] = fast_log2(p1/sum)*gapf; tr[i][M2I] = fast_log2(p2/sum)*gapg; // Transitions from I state p0 = Neff_I[i]*fpow2(tr[i][I2M]) + gapb*pI2M; p1 = Neff_I[i]*fpow2(tr[i][I2I]) + gapb*pI2I; sum = p0+p1+FLT_MIN; tr[i][I2M] = fast_log2(p0/sum); tr[i][I2I] = fast_log2(p1/sum)*gapi; // Transitions from D state p0 = Neff_D[i]*fpow2(tr[i][D2M]) + gapb*pD2M; p1 = Neff_D[i]*fpow2(tr[i][D2D]) + gapb*pD2D; if (i==L) p1=0; //from D(L) no transition to D(L+1) possible sum = p0+p1+FLT_MIN; tr[i][D2M] = fast_log2(p0/sum); tr[i][D2D] = fast_log2(p1/sum)*gaph; } if (v>=4) { printf("\nPseudocount transition probabilities:\n"); printf("pM2M=%4.1f%%, pM2I=%4.1f%%, pM2D=%4.1f%%, ",100*pM2M,100*pM2I,100*pM2D); printf("pI2M=%4.1f%%, pI2I=%4.1f%%, ",100*pI2M,100*pI2I); printf("pD2M=%4.1f%%, pD2D=%4.1f%% ",100*pD2M,100*pD2D); printf("tau = %4.1f%%\n\n",100.*gapb/(Neff_HMM-1+gapb)); printf("Listing transition probabilities WITH pseudocounts:\n"); printf(" i dssp pred sacc M->M M->I M->D I->M I->I D->M D->D\n"); for (i=1; i<=L; ++i) //for all columns in HMM { printf("%4i %1c %1c %1c %6.3f %6.3f %6.3f ",i,i2ss(ss_dssp[i]),i2ss(ss_pred[i]),i2sa(sa_dssp[i]),fpow2(tr[i][M2M]),fpow2(tr[i][M2I]),fpow2(tr[i][M2D])); printf("%6.3f %6.3f ",fpow2(tr[i][I2M]),fpow2(tr[i][I2I])); printf("%6.3f %6.3f ",fpow2(tr[i][D2M]),fpow2(tr[i][D2D])); printf("%1i %2i %1i\n",ss_pred[i],ss_conf[i],ss_dssp[i]); } printf("\n"); printf("nss_dssp=%i nss_pred=%i\n",nss_dssp,nss_pred); } return; } ///////////////////////////////////////////////////////////////////////////////////// // Generate an amino acid frequency matrix g[][] with full pseudocount admixture (tau=1) ///////////////////////////////////////////////////////////////////////////////////// void HMM::PreparePseudocounts() { for (int i=0; i<=L+1; ++i) for (int a=0; a<20; ++a) g[i][a] = ScalarProd20(R[a],f[i]); } ///////////////////////////////////////////////////////////////////////////////////// // Generate an AA frequency matrix g[][] with full context specific pseudocount admixture (tau=1) ///////////////////////////////////////////////////////////////////////////////////// void HMM::AddContextSpecificPseudocounts(char pcm, float pca, float pcb, float pcc) { int i; //position in HMM int a; //amino acid (0..19) if (has_pseudocounts) { pcm = 0; } cs::CountProfile ali_profile(L); fillCountProfile(&ali_profile); cs::Admix *admix = NULL; switch (pcm) { case 1: admix = new cs::ConstantAdmix(pca); break; case 2: case 4: admix = new cs::HHsearchAdmix(pca, pcb, pcc); break; case 3: // TODO break; case 5: // use CS-BLAST Admix for prefiltering admix = new cs::CSBlastAdmix(pca, pcb); break; } if (admix == NULL) { // write cs-pseudocounts in HMM.p for (i=1; i<=L; ++i) for (a=0; a<20; ++a) p[i][a] = f[i][a]; } else { cs::Profile profile(lib_pc->AddTo(ali_profile, *admix)); delete admix; // write cs-pseudocounts in HMM.p for (i=1; i<=L; ++i) for (a=0; a<20; ++a) p[i][a] = profile[i-1][a]; } // DEBUGGING output if (v>=3) { float sum; cout<<"Context specific pseudocounts added!\n\n"; switch (pcm) { case 0: cout<<"No pseudocounts added (-pcm 0)\n"; return; case 1: cout<<"Adding constant AA pseudocount admixture of "<=4) { cout<<"\nAmino acid frequencies WITHOUT pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; for (i=1; i<=L; ++i) { printf("%3i: ",i); sum=0; for (a=0; a<20; ++a) { sum+=f[i][a]; printf("%4.1f ",100*f[i][a]); } printf(" sum=%5.3f Neff_M=%4.2f\n",sum,Neff_M[i]); } cout<<"\nAmino acid frequencies WITH pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; for (i=1; i<=L; ++i) { printf("%3i: ",i); sum=0; for (a=0; a<20; ++a) { sum+=p[i][a]; printf("%4.1f ",100*p[i][a]); } printf(" sum=%5.3f\n",sum); } } } } ///////////////////////////////////////////////////////////////////////////////////// // Fill CountProfile with actual aa-frequencies ///////////////////////////////////////////////////////////////////////////////////// void HMM::fillCountProfile(cs::CountProfile *csProfile) { for (int i=0; ineff[i] = Neff_M[i+1]; for (int a=0; a<20; ++a) csProfile->counts[i][a] = f[i+1][a] * Neff_M[i+1]; } } ///////////////////////////////////////////////////////////////////////////////////// // Calculate amino acid background frequencies in HMM ///////////////////////////////////////////////////////////////////////////////////// void HMM::CalculateAminoAcidBackground() { int a, i; // initialize vector of average aa freqs with pseudocounts for (a=0; a<20; ++a) pav[a]=pb[a]*100.0f/Neff_HMM; // calculate averages for (i=1; i<=L; ++i) for (a=0; a<20; ++a) pav[a] += p[i][a]; // Normalize vector of average aa frequencies pav[a] NormalizeTo1(pav,NAA); for (a=0; a<20; ++a) p[0][a] = p[L+1][a] = pav[a]; } ///////////////////////////////////////////////////////////////////////////////////// // Add amino acid pseudocounts to HMM and calculate average protein aa probabilities pav[a] // Pseudocounts: p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] ///////////////////////////////////////////////////////////////////////////////////// void HMM::AddAminoAcidPseudocounts(char pcm, float pca, float pcb, float pcc) { int i; //position in HMM int a; //amino acid (0..19) float sum; float tau; //tau = pseudocount admixture if (has_pseudocounts) { pcm = 0; } // Calculate amino acid frequencies p[i][a] = (1-tau(i))*f[i][a] + tau(i)*g[i][a] switch (pcm) { case 0: //no pseudocounts whatsoever: tau=0 for (i=1; i<=L; ++i) for (a=0; a<20; ++a) p[i][a]=f[i][a]; break; case 1: //constant pseudocounts (for optimization): tau = pca tau = pca; for (i=1; i<=L; ++i) for (a=0; a<20; ++a) p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a]; break; case 2: // diversity-dependent (i.e, Neff_M[i]-dependent) pseudocounts if (par.pcc==1.0f) for (i=1; i<=L; ++i) { tau = fmin(1.0, pca/(1. + Neff_M[i]/pcb ) ); for (a=0; a<20; ++a) p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a]; } else for (i=1; i<=L; ++i) { tau = fmin(1.0, pca/(1. + pow((Neff_M[i])/pcb,pcc))); for (a=0; a<20; ++a) p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a]; } break; case 3: // constant-diversity pseudocounts // Is this still used? => scrap? (JS) for (i=1; i<=L; ++i) { float x = Neff_M[i]/pcb; pca = 0.793 + 0.048*(pcb-10.0); tau = fmax(0.0, pca*(1-x + pcc*x*(1-x)) ); for (a=0; a<20; ++a) p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a]; } if (v>=2) { printf("Divergence before / after addition of amino acid pseudocounts: %5.2f / %5.2f\n",Neff_HMM, CalcNeff()); } break; } //end switch (pcm) //turn on pseudocount switch to indicate that HMM contains pseudocounts if (pcm!=0) has_pseudocounts=true; // DEBUGGING output if (v>=3) { switch (pcm) { case 0: cout<<"No pseudocounts added (-pcm 0)\n"; return; case 1: cout<<"Adding constant AA pseudocount admixture of "<=4) { cout<<"\nAmino acid frequencies WITHOUT pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; for (i=1; i<=L; ++i) { printf("%3i: ",i); sum=0; for (a=0; a<20; ++a) { sum+=f[i][a]; printf("%4.1f ",100*f[i][a]); } printf(" sum=%5.3f\n",sum); } cout<<"\nAmino acid frequencies WITH pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; for (i=1; i<=L; ++i) { printf("%3i: ",i); sum=0; for (a=0; a<20; ++a) { sum+=p[i][a]; printf("%4.1f ",100*p[i][a]); } printf(" sum=%5.3f\n",sum); } } } return; } ///////////////////////////////////////////////////////////////////////////////////// // Divide aa probabilties by square root of locally averaged background frequencies // !!!!! ATTENTION!!!!!!! after this p is not the same as after adding pseudocounts !!! ///////////////////////////////////////////////////////////////////////////////////// void HMM::DivideBySqrtOfLocalBackgroundFreqs(int D) // 2*D+1 is window size { if (divided_by_local_bg_freqs) {cerr<<"WARNING: already divided probs by local aa frequencies!\n"; return;} divided_by_local_bg_freqs=1; int i; // query and template match state indices int a; // amino acid index float fac=1.0/(2*D+1); // 1 / window size float** pnul = new float*[L+1]; // null model probabilities for (i=0; i<=L; ++i) pnul[i] = new(float[NAA]); for (a=0; a average over entire length L if (L <= 2*D+1) { for (i=1; i<=L; ++i) for (a=0; a average over window size 2*D+1 else { // Calculate local amino acid background frequencies in leftmost window (1,..,2*D+1) for (i=1; i<=2*D+1; ++i) for (a=0; a=3) { cout<<"\nLocal amino acid background frequencies\n"; cout<<" A R N D C Q E G H I L K M F P S T W Y V sum\n"; for (i=1; i<=L; ++i) { printf("%-5i ",i); float sum = 0.0; for (a=0; a<20; ++a) { printf("%4.1f ",100*fac*pnul[i][a]); sum += fac*pnul[i][a]; } printf("%4.1f\n",100*sum); } } for (i=0; i<=L; ++i) delete[] pnul[i]; delete[] pnul; return; } ///////////////////////////////////////////////////////////////////////////////////// // Factor Null model into HMM t // !!!!! ATTENTION!!!!!!! after this t->p is not the same as after adding pseudocounts !!! ///////////////////////////////////////////////////////////////////////////////////// void HMM::IncludeNullModelInHMM(HMM* q, HMM* t, int columnscore ) { int i,j; //query and template match state indices int a; //amino acid index // Multiply template frequencies with amino acid weights = 1/background_freq(a) (for all but SOP scores) switch (columnscore) { default: case 0: // Null model with background prob. from database for (j=0; j<=t->L+1; ++j) for (a=0; a<20; ++a) t->p[j][a] /= pb[a]; break; case 1: // Null model with background prob. equal average from query and template float pnul[NAA]; // null model probabilities used in comparison (only set in template/db HMMs) for (a=0; a<20; ++a) pnul[a] = 0.5*(q->pav[a]+t->pav[a]); for (j=0; j<=t->L+1; ++j) for (a=0; a<20; ++a) t->p[j][a] /= pnul[a]; break; case 2: // Null model with background prob. from template protein for (j=0; j<=t->L+1; ++j) for (a=0; a<20; ++a) t->p[j][a] /= t->pav[a]; break; case 3: // Null model with background prob. from query protein for (j=0; j<=t->L+1; ++j) for (a=0; a<20; ++a) t->p[j][a] /= q->pav[a]; break; case 5: // Null model with local background prob. from template and query protein // if (!q->divided_by_local_bg_freqs) q->DivideBySqrtOfLocalBackgroundFreqs(par.half_window_size_local_aa_bg_freqs); if (!q->divided_by_local_bg_freqs) InternalError("No local amino acid bias correction on query HMM!"); if (!t->divided_by_local_bg_freqs) t->DivideBySqrtOfLocalBackgroundFreqs(par.half_window_size_local_aa_bg_freqs); break; case 10: // Separated column scoring for Stochastic Backtracing (STILL USED??) for (i=0; i<=q->L+1; ++i) { float sum = 0.0; for (a=0; a<20; ++a) sum += pb[a]*q->p[i][a]; sum = 1.0/sqrt(sum); for (a=0; a<20; ++a) q->p[i][a]*=sum; } for (j=0; j<=t->L+1; j++) { float sum = 0.0; for (a=0; a<20; ++a) sum += pb[a]*t->p[j][a]; sum = 1.0/sqrt(sum); for (a=0; a<20; ++a) t->p[j][a]*=sum; } break; case 11: // log co-emission probability (no null model) for (a=0; a<20; ++a) pnul[a]=0.05; break; } if (v>=4) { cout<<"\nAverage amino acid frequencies\n"; cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; cout<<"Q: "; for (a=0; a<20; ++a) printf("%4.1f ",100*q->pav[a]); cout<<"\nT: "; for (a=0; a<20; ++a) printf("%4.1f ",100*t->pav[a]); cout<<"\npb: "; for (a=0; a<20; ++a) printf("%4.1f ",100*pb[a]); } // cout<<"\nWeighted amino acid frequencies WITH pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; // for (i=1; i<=L; ++i) // { // printf("%3i: ",i); // float sum=0; // for (a=0; a<20; ++a) // { // sum+=t->p[i][a]; // printf("%4.1f ",100*t->t->p[i][a]); // } // printf(" sum=%5.3f\n",sum); // } return; } ///////////////////////////////////////////////////////////////////////////////////// // Write HMM to output file ///////////////////////////////////////////////////////////////////////////////////// void HMM::WriteToFile(char* outfile) { const int SEQLEN=100; // number of residues per line for sequences to be displayed int i,a; if (trans_lin==1) InternalError("tried to write HMM file with transition pseudocounts in linear representation"); if (divided_by_local_bg_freqs) InternalError("tried to write HMM file with amino acid probabilities divided by sqrt of local background frequencies\n"); FILE *outf=NULL; if (strcmp(outfile,"stdout")) { if (par.append) outf=fopen(outfile,"a"); else outf=fopen(outfile,"w"); if (!outf) OpenFileError(outfile); } else outf = stdout; if (v>=2) cout<<"Writing HMM to "< ",(int)strlen(par.argv[i])); fprintf(outf,"\n"); // print out date stamp time_t* tp=new(time_t); *tp=time(NULL); fprintf(outf,"DATE %s",ctime(tp)); delete tp; // Print out some statistics of alignment fprintf(outf,"LENG %i match states, %i columns in multiple alignment\n",L,l[L]); fprintf(outf,"FILT %i out of %i sequences passed filter (-id %i -cov %i -qid %i -qsc %.2f -diff %i)\n",N_filtered,N_in,par.max_seqid,par.coverage,par.qid,par.qsc,par.Ndiff); fprintf(outf,"NEFF %-4.1f\n",Neff_HMM); if (has_pseudocounts) { fprintf(outf,"PCT true\n"); } // Print selected sequences from alignment (including secondary structure and confidence values, if known) fprintf(outf,"SEQ\n"); for (int n=0; n%s\n",sname[n]); //first sequence character starts at 1; 0 not used. for(unsigned int j=0; jM\tM->I\tM->D\tI->M\tI->I\tD->M\tD->D\tNeff\tNeff_I\tNeff_D\n"); // print out transition probabilities from begin state (virtual match state) fprintf(outf," "); for (a=0; a<=D2D; ++a) fout(outf,-iround(tr[0][a]*HMMSCALE)); fout(outf,iround(Neff_M[0]*HMMSCALE)); fout(outf,iround(Neff_I[0]*HMMSCALE)); fout(outf,iround(Neff_D[0]*HMMSCALE)); fprintf(outf,"\n"); // Start loop for printing HMM columns int h=1; for (i=1; i<=L; ++i) { while(islower(seq[nfirst][h]) && seq[nfirst][h]) h++; fprintf(outf,"%1c %-4i ",seq[nfirst][h++],i); // Print emission probabilities for match state for (a=0; a<20; ++a) fout(outf,-iround(fast_log2(p[i][s2a[a]])*HMMSCALE )); fprintf(outf,"%-i",l[i]); fprintf(outf,"\n"); // Print transition probabilities fprintf(outf," "); for (a=0; a<=D2D; ++a) fout(outf,-iround(tr[i][a]*HMMSCALE)); fout(outf,iround(Neff_M[i]*HMMSCALE)); fout(outf,iround(Neff_I[i]*HMMSCALE)); fout(outf,iround(Neff_D[i]*HMMSCALE)); fprintf(outf,"\n\n"); } // end for(i)-loop for printing HMM columns fprintf(outf,"//\n"); if (strcmp(outfile,"stdout")) fclose(outf); } ///////////////////////////////////////////////////////////////////////////////////// // Write HMM to output file ///////////////////////////////////////////////////////////////////////////////////// void HMM::InsertCalibration(char* infile) { char* line = new(char[LINELEN]); // input line char** lines = new(char*[3*L+100000]); int nline=0; int l; char done=0; // inserted new 'EVD mu sigma' line? // Read from infile all lines and insert the EVD line with lamda and mu coefficients ifstream inf; inf.open(infile, ios::in); if (!inf) OpenFileError(infile); if (v>=2) cout<<"Recording calibration coefficients in "< remove, i.e., read next line while (!done && !strncmp(line,"EVD ",3) && !(line[0]=='/' && line[1]=='/') && nline<2*par.maxres) inf.getline(line,LINELEN); if ((line[0]=='/' && line[1]=='/') || nline>=2*par.maxres) FormatError(infile,"Expecting hhm format"); // Found the SEQ line? -> insert calibration before this line if (!done && (!strncmp("SEQ",line,3) || !strncmp("HMM",line,3)) && (isspace(line[3]) || line[3]=='\0')) { done=1; lines[nline]=new(char[128]); if (!lines[nline]) MemoryError("space to read in HHM file for calibration"); sprintf(lines[nline],"EVD %-7.4f %-7.4f",lamda,mu); nline++; } lines[nline]=new(char[strlen(line)+1]); if (!lines[nline]) MemoryError("space to read in HHM file for calibration"); strcpy (lines[nline],line); nline++; } inf.close(); // Write to infile all lines FILE* infout=fopen(infile,"w"); if (!infout) { cerr<=2) printf("Neutralized His-tag between positions %i and %i\n",imax(i0-8,1),i-1); } // Neutralize C-myc tag if ( (pt=strstr(qseq,"EQKLISEEDL")) ) { if (v>=2) printf("Neutralized C-myc-tag at position %i\n",int(pt-qseq)+1); for (i=pt-qseq+1; i<=pt-qseq+10; ++i) for (a=0; a=2) printf("Neutralized FLAG-tag at position %i\n",int(pt-qseq)+1); for (i=pt-qseq+1; i<=pt-qseq+8; ++i) for (a=0; a1E-10) Neff-=p[i][a]*fast_log2(p[i][a]); return fpow2(Neff/L); } ///////////////////////////////////////////////////////////////////////////////////// // Add secondary structure prediction to alignment (overwrite existing prediction) ///////////////////////////////////////////////////////////////////////////////////// void HMM::AddSSPrediction(char seq_pred[], char seq_conf[]) { unsigned int i; if ((int)strlen(seq_pred)!=L+1) { cerr<<"WARNING: Could not add secondary struture prediction - unequal length!\n"; return; } if (nss_pred >= 0 && nss_conf >= 0) { strcpy(seq[nss_pred],seq_pred); for (i=0; i=0; --k) { seq[k+2] = seq[k]; sname[k+2] = sname[k]; } if (nss_dssp >= 0) { nss_dssp += 2; } if (nsa_dssp >= 0) { nsa_dssp += 2; } if (ncons >= 0) { ncons += 2; } if (nfirst >= 0) { nfirst += 2; } nss_pred=0; seq[nss_pred]=new(char[L+2]); strcpy(seq[nss_pred],seq_pred); for (i=0; i * Based on FMem.c of Alexandre Flori (2008/10/17 AF) */ #define _GNU_SOURCE #include #include #include #include "fmemopen.h" #ifdef OS_DARWIN #define USE_FMEM_WRAPPER 1 #endif #ifdef OS_FREEBSD #define USE_FMEM_WRAPPER 1 #endif #ifdef USE_FMEM_WRAPPER /** * \brief Seek the mem file from offset and whence * \param handler pointer to the memfile * \param osffset number of bytes to move from whence * \param whence SEEK_SET, SEEK_CUR, SEEK_END * \retval pos the position by the last operation, -1 if sizes are out of bounds */ static fpos_t SeekFn(void *handler, fpos_t offset, int whence) { size_t pos = 0; fmem_t *mem = (fmem_t*)handler; switch (whence) { case SEEK_SET: if (offset > 0 && (size_t)offset <= mem->size) return mem->pos = offset; break; case SEEK_CUR: if (mem->pos + offset <= mem->size) return mem->pos = offset; break; case SEEK_END: /* must be negative */ if (mem->size + offset <= mem->size) return pos = mem->size + offset; break; } return -1; } /** * \brief Read from the buffer looking for the available memory limits * \param handler pointer to the memfile * \param buf buffer to read from the handler * \param number of bytes to read * \retval count , the number of bytes read */ static int ReadFn(void *handler, char *buf, int size) { size_t count = 0; fmem_t *mem = (fmem_t*)handler; size_t available = mem->size - mem->pos; if (size < 0) return - 1; if ((size_t)size > available) size = available; while (count < (size_t)size) buf[count++] = mem->buffer[mem->pos++]; return count; } /** * \brief Write into the buffer looking for the available memory limits * \param handler pointer to the memfile * \param buf buffer to write in the handler * \param number of bytes to write * \retval count , the number of bytes writen */ static int WriteFn(void *handler, const char *buf, int size) { size_t count = 0; fmem_t *mem = (fmem_t*)handler; size_t available = mem->size - mem->pos; if (size < 0) return - 1; if ((size_t)size > available) size = available; while (count < (size_t)size) mem->buffer[mem->pos++] = buf[count++]; return count; } /** * \brief close the mem file handler * \param handler pointer to the memfile * \retval 0 on succesful */ static int CloseFn(void *handler) { free (handler); return 0; } /** * \brief portable version of SCFmemopen for OS X / BSD built on top of funopen() * \param buffer that holds the file content * \param size of the file buffer * \param mode mode of the file to open * \retval pointer to the file; NULL if something is wrong */ FILE *fmemopen(void *buf, size_t size, const char *mode) { fmem_t *mem = (fmem_t *) malloc(sizeof(fmem_t)); memset(mem, 0, sizeof(fmem_t)); mem->size = size, mem->buffer = (char*)buf; return funopen(mem, ReadFn, WriteFn, SeekFn, CloseFn); } #endif hhsuite-2.0.16/src/pngwriter.h0000775172256617226630000011620312110430072020544 0ustar hauserscientific_computing//********** pngwriter.h ********************************************** // Author: Paul Blackburn // // Email: individual61@users.sourceforge.net // // Version: 0.5.4 (19 / II / 2009) // // Description: Library that allows plotting a 48 bit // PNG image pixel by pixel, which can // then be opened with a graphics program. // // License: GNU General Public License // Copyright 2002, 2003, 2004, 2005, 2006, 2007, // 2008, 2009 Paul Blackburn // // Website: Main: http://pngwriter.sourceforge.net/ // Sourceforge.net: http://sourceforge.net/projects/pngwriter/ // Freshmeat.net: http://freshmeat.net/projects/pngwriter/ // // Documentation: This header file is commented, but for a // quick reference document, and support, // take a look at the website. // //************************************************************************* /* * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * */ #ifndef PNGWRITER_H #define PNGWRITER_H 1 #define PNGWRITER_VERSION 0.54 #include // REMEMBER TO ADD -DNO_FREETYPE TO YOUR COMPILATION FLAGS IF PNGwriter WAS // COMPILED WITHOUT FREETYPE SUPPORT!!! // // RECUERDA AGREGAR -DNO_FREETYPE A TUS OPCIONES DE COMPILACION SI PNGwriter // FUE COMPILADO SIN SOPORTE PARA FREETYPE!!! // #ifndef NO_FREETYPE #include #include FT_FREETYPE_H #endif #ifdef OLD_CPP // For compatibility with older compilers. #include #include #include #include using namespace std; #endif // from ifdef OLD_CPP #ifndef OLD_CPP // Default situation. #include #include #include #include #endif // from ifndef OLD_CPP //png.h must be included before FreeType headers. #include #include #include #define PNG_BYTES_TO_CHECK (4) #define PNGWRITER_DEFAULT_COMPRESSION (6) class pngwriter { private: char * filename_; char * textauthor_; char * textdescription_; char * texttitle_; char * textsoftware_; int height_; int width_; int backgroundcolour_; int bit_depth_; int rowbytes_; int colortype_; int compressionlevel_; bool transformation_; // Required by Mikkel's patch unsigned char * * graph_; double filegamma_; double screengamma_; void circle_aux(int xcentre, int ycentre, int x, int y, int red, int green, int blue); void circle_aux_blend(int xcentre, int ycentre, int x, int y, double opacity, int red, int green, int blue); int check_if_png(char *file_name, FILE **fp); int read_png_info(FILE *fp, png_structp *png_ptr, png_infop *info_ptr); int read_png_image(FILE *fp, png_structp png_ptr, png_infop info_ptr, png_bytepp *image, png_uint_32 *width, png_uint_32 *height); void flood_fill_internal( int xstart, int ystart, double start_red, double start_green, double start_blue, double fill_red, double fill_green, double fill_blue); void flood_fill_internal_blend( int xstart, int ystart, double opacity, double start_red, double start_green, double start_blue, double fill_red, double fill_green, double fill_blue); #ifndef NO_FREETYPE void my_draw_bitmap( FT_Bitmap * bitmap, int x, int y, double red, double green, double blue); void my_draw_bitmap_blend( FT_Bitmap * bitmap, int x, int y,double opacity, double red, double green, double blue); #endif /* The algorithms HSVtoRGB and RGBtoHSV were found at http://www.cs.rit.edu/~ncs/ * which is a page that belongs to Nan C. Schaller, though * these algorithms appear to be the work of Eugene Vishnevsky. * */ void HSVtoRGB( double *r, double *g, double *b, double h, double s, double v ); void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v ); /* drwatop(), drawbottom() and filledtriangle() were contributed by Gurkan Sengun * ( , http://www.linuks.mine.nu/ ) * */ void drawtop(long x1,long y1,long x2,long y2,long x3, int red, int green, int blue); void drawbottom(long x1,long y1,long x2,long x3,long y3, int red, int green, int blue); void drawbottom_blend(long x1,long y1,long x2,long x3,long y3, double opacity, int red, int green, int blue); void drawtop_blend(long x1,long y1,long x2,long y2,long x3, double opacity, int red, int green, int blue); public: /* General Notes * It is important to remember that all functions that accept an argument of type "const char *" will also * accept "char *", this is done so you can have a changing filename (to make many PNG images in series * with a different name, for example), and to allow you to use string type objects which can be easily * turned into const char * (if theString is an object of type string, then it can be used as a const char * * by saying theString.c_str()). * It is also important to remember that whenever a function has a colour coeffiecient as its argument, * that argument can be either an int from 0 to 65535 or a double from 0.0 to 1.0. * It is important to make sure that you are calling the function with the type that you want. * Remember that 1 is an int, while 1.0 is a double, and will thus determine what version of the function * will be used. Similarly, do not make the mistake of calling for example plot(x, y, 0.0, 0.0, 65535), * because * there is no plot(int, int, double, double, int). * Also, please note that plot() and read() (and the functions that use them internally) * are protected against entering, for example, a colour coefficient that is over 65535 * or over 1.0. Similarly, they are protected against negative coefficients. read() will return 0 * when called outside the image range. This is actually useful as zero-padding should you need it. * */ /* Compilation * A typical compilation would look like this: * * g++ my_program.cc -o my_program freetype-config --cflags \ * -I/usr/local/include -L/usr/local/lib -lpng -lpngwriter -lz -lfreetype * * If you did not compile PNGwriter with FreeType support, then remove the * FreeType-related flags and add -DNO_FREETYPE above. * */ /* Constructor * The constructor requires the width and the height of the image, the background colour for the * image and the filename of the file (a pointer or simple "myfile.png"). The background colour * can only be initialized to a shade of grey (once the object has been created you can do whatever * you want, though), because generally one wants either a white (65535 or 1.0) or a black (0 or 0.0) * background to start with. * The default constructor creates a PNGwriter instance that is 250x250, white background, * and filename "out.png". * Tip: The filename can be given as easily as: * pngwriter mypng(300, 300, 0.0, "myfile.png"); * Tip: If you are going to create a PNGwriter instance for reading in a file that already exists, * then width and height can be 1 pixel, and the size will be automatically adjusted once you use * readfromfile(). * */ pngwriter(); pngwriter(const pngwriter &rhs); pngwriter(int width, int height, int backgroundcolour, char * filename); pngwriter(int width, int height, double backgroundcolour, char * filename); pngwriter(int width, int height, int backgroundcolour, const char * filename); pngwriter(int width, int height, double backgroundcolour, const char * filename); /* Destructor * */ ~pngwriter(); /* Assignment Operator * */ pngwriter & operator = (const pngwriter & rhs); /* Plot * With this function a pixel at coordinates (x, y) can be set to the desired colour. * The pixels are numbered starting from (1, 1) and go to (width, height). * As with most functions in PNGwriter, it has been overloaded to accept either int arguments * for the colour coefficients, or those of type double. If they are of type int, * they go from 0 to 65535. If they are of type double, they go from 0.0 to 1.0. * Tip: To plot using red, then specify plot(x, y, 1.0, 0.0, 0.0). To make pink, * just add a constant value to all three coefficients, like this: * plot(x, y, 1.0, 0.4, 0.4). * Tip: If nothing is being plotted to your PNG file, make sure that you remember * to close() the instance before your program is finished, and that the x and y position * is actually within the bounds of your image. If either is not, then PNGwriter will * not complain-- it is up to you to check for this! * Tip: If you try to plot with a colour coefficient out of range, a maximum or minimum * coefficient will be assumed, according to the given coefficient. For example, attempting * to plot plot(x, y, 1.0,-0.2,3.7) will set the green coefficient to 0 and the red coefficient * to 1.0. * */ void plot(int x, int y, int red, int green, int blue); void plot(int x, int y, double red, double green, double blue); /* Plot HSV * With this function a pixel at coordinates (x, y) can be set to the desired colour, * but with the colour coefficients given in the Hue, Saturation, Value colourspace. * This has the advantage that one can determine the colour that will be plotted with * only one parameter, the Hue. The colour coefficients must go from 0 to 65535 and * be of type int, or be of type double and go from 0.0 to 1.0. * */ void plotHSV(int x, int y, double hue, double saturation, double value); void plotHSV(int x, int y, int hue, int saturation, int value); /* Read * With this function we find out what colour the pixel (x, y) is. If "colour" is 1, * it will return the red coefficient, if it is set to 2, the green one, and if * it set to 3, the blue colour coefficient will be returned, * and this returned value will be of type int and be between 0 and 65535. * Note that if you call read() on a pixel outside the image range, the value returned * will be 0. * */ int read(int x, int y, int colour); /* Read, Average * Same as the above, only that the average of the three colour coefficients is returned. */ int read(int x, int y); /* dRead * With this function we find out what colour the pixel (x, y) is. If "colour" is 1, * it will return the red coefficient, if it is set to 2, the green one, and if * it set to 3, the blue colour coefficient will be returned, * and this returned value will be of type double and be between 0.0 and 1.0. * Note that if you call dread() outside the image range, the value returned will be 0.0 * */ double dread(int x, int y, int colour); /* dRead, Average * Same as the above, only that the average of the three colour coefficients is returned. */ double dread(int x, int y); /* Read HSV * With this function we find out what colour the pixel (x, y) is, but in the Hue, * Saturation, Value colourspace. If "colour" is 1, * it will return the Hue coefficient, if it is set to 2, the Saturation one, and if * it set to 3, the Value colour coefficient will be returned, and this returned * value will be of type int and be between 0 and 65535. Important: If you attempt * to read the Hue of a pixel that is a shade of grey, the value returned will be * nonsensical or even NaN. This is just the way the RGB -> HSV algorithm works: * the Hue of grey is not defined. You might want to check whether the pixel * you are reading is grey before attempting a readHSV(). * Tip: This is especially useful for categorizing sections of the image according * to their colour. * */ int readHSV(int x, int y, int colour); /* dRead HSV * With this function we find out what colour the pixel (x, y) is, but in the Hue, * Saturation, Value colourspace. If "colour" is 1, * it will return the Hue coefficient, if it is set to 2, the Saturation one, and if * it set to 3, the Value colour coefficient will be returned, * and this returned value will be of type double and be between 0.0 and 1.0. * */ double dreadHSV(int x, int y, int colour); /* Clear * The whole image is set to black. * */ void clear(void); /* Close * Close the instance of the class, and write the image to disk. * Tip: If you do not call this function before your program ends, no image * will be written to disk. * */ void close(void); /* Rename * To rename the file once an instance of pngwriter has been created. * Useful for assigning names to files based upon their content. * Tip: This is as easy as calling pngwriter_rename("newname.png") * If the argument is a long unsigned int, for example 77, the filename will be changed to * 0000000077.png * Tip: Use this to create sequences of images for movie generation. * */ void pngwriter_rename(char * newname); void pngwriter_rename(const char * newname); void pngwriter_rename(long unsigned int index); /* Figures * These functions draw basic shapes. Available in both int and double versions. * The line functions use the fast Bresenham algorithm. Despite the name, * the square functions draw rectangles. The circle functions use a fast * integer math algorithm. The filled circle functions make use of sqrt(). * */ void line(int xfrom, int yfrom, int xto, int yto, int red, int green,int blue); void line(int xfrom, int yfrom, int xto, int yto, double red, double green,double blue); void triangle(int x1, int y1, int x2, int y2, int x3, int y3, int red, int green, int blue); void triangle(int x1, int y1, int x2, int y2, int x3, int y3, double red, double green, double blue); void square(int xfrom, int yfrom, int xto, int yto, int red, int green,int blue); void square(int xfrom, int yfrom, int xto, int yto, double red, double green,double blue); void filledsquare(int xfrom, int yfrom, int xto, int yto, int red, int green,int blue); void filledsquare(int xfrom, int yfrom, int xto, int yto, double red, double green,double blue); void circle(int xcentre, int ycentre, int radius, int red, int green, int blue); void circle(int xcentre, int ycentre, int radius, double red, double green, double blue); void filledcircle(int xcentre, int ycentre, int radius, int red, int green, int blue); void filledcircle(int xcentre, int ycentre, int radius, double red, double green, double blue); /* Read From File * Open the existing PNG image, and copy it into this instance of the class. It is important to mention * that PNG variants are supported. Very generally speaking, most PNG files can now be read (as of version 0.5.4), * but if they have an alpha channel it will be completely stripped. If the PNG file uses GIF-style transparency * (where one colour is chosen to be transparent), PNGwriter will not read the image properly, but will not * complain. Also, if any ancillary chunks are included in the PNG file (chroma, filter, etc.), it will render * with a slightly different tonality. For the vast majority of PNGs, this should not be an issue. Note: * If you read an 8-bit PNG, the internal representation of that instance of PNGwriter will be 8-bit (PNG * files of less than 8 bits will be upscaled to 8 bits). To convert it to 16-bit, just loop over all pixels, * reading them into a new instance of PNGwriter. New instances of PNGwriter are 16-bit by default. * */ void readfromfile(char * name); void readfromfile(const char * name); /* Get Height * When you open a PNG with readfromfile() you can find out its height with this function. * */ int getheight(void); /* Get Width * When you open a PNG with readfromfile() you can find out its width with this function. * */ int getwidth(void); /* Set Compression Level * Set the compression level that will be used for the image. -1 is to use the default, * 0 is none, 9 is best compression. * Remember that this will affect how long it will take to close() the image. A value of 2 or 3 * is good enough for regular use, but for storage or transmission you might want to take the time * to set it at 9. * */ void setcompressionlevel(int level); /* Get Bit Depth * When you open a PNG with readfromfile() you can find out its bit depth with this function. * Mostly for troubleshooting uses. * */ int getbitdepth(void); /* Get Colour Type * When you open a PNG with readfromfile() you can find out its colour type (libpng categorizes * different styles of image data with this number). * Mostly for troubleshooting uses. * */ int getcolortype(void); /* Set Gamma Coeff * Set the image's gamma (file gamma) coefficient. This is experimental, but use it if your image's colours seem too bright * or too dark. The default value of 0.5 should be fine. The standard disclaimer about Mac and PC gamma * settings applies. * */ void setgamma(double gamma); /* Get Gamma Coeff * Get the image's gamma coefficient. This is experimental. * */ double getgamma(void); /* Bezier Curve * (After Frenchman Pierre Bzier from Regie Renault) * A collection of formulae for describing curved lines * and surfaces, first used in 1972 to model automobile surfaces. * (from the The Free On-line Dictionary of Computing) * See http://www.moshplant.com/direct-or/bezier/ for one of many * available descriptions of bezier curves. * There are four points used to define the curve: the two endpoints * of the curve are called the anchor points, while the other points, * which define the actual curvature, are called handles or control points. * Moving the handles lets you modify the shape of the curve. * */ void bezier( int startPtX, int startPtY, int startControlX, int startControlY, int endPtX, int endPtY, int endControlX, int endControlY, double red, double green, double blue); void bezier( int startPtX, int startPtY, int startControlX, int startControlY, int endPtX, int endPtY, int endControlX, int endControlY, int red, int green, int blue); /* Set Text * Sets the text information in the PNG header. If it is not called, the default is used. */ void settext(char * title, char * author, char * description, char * software); void settext(const char * title, const char * author, const char * description, const char * software); /* Version Number * Returns the PNGwriter version number. */ static double version(void); /* Write PNG * Writes the PNG image to disk. You can still change the PNGwriter instance after this. * Tip: This is exactly the same as close(), but easier to remember. * Tip: To make a sequence of images using only one instance of PNGwriter, alter the image, change its name, * write_png(), then alter the image, change its name, write_png(), etc. */ void write_png(void); /* Plot Text * Uses the Freetype2 library to set text in the image. face_path is the file path to a * TrueType font file (.ttf) (FreeType2 can also handle other types). fontsize specifices the approximate * height of the rendered font in pixels. x_start and y_start specify the placement of the * lower, left corner of the text string. angle is the text angle in radians. text is the text to be rendered. * The colour coordinates can be doubles from 0.0 to 1.0 or ints from 0 to 65535. * Tip: PNGwriter installs a few fonts in /usr/local/share/pngwriter/fonts to get you started. * Tip: Remember to add -DNO_FREETYPE to your compilation flags if PNGwriter was compiled without FreeType support. * */ void plot_text(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double red, double green, double blue); void plot_text(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, int red, int green, int blue); /* Plot UTF-8 Text * Same as the above, but the text to be plotted is encoded in UTF-8. Why would you want this? To be able to plot * all characters available in a large TrueType font, for example: for rendering Japenese, Chinese and other * languages not restricted to the standard 128 character ASCII space. * Tip: The quickest way to get a string into UTF-8 is to write it in an adequate text editor, and save it as a file * in UTF-8 encoding, which can then be read in in binary mode. * */ void plot_text_utf8(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double red, double green, double blue); void plot_text_utf8(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, int red, int green, int blue); /* Bilinear Interpolation of Image * Given a floating point coordinate (x from 0.0 to width, y from 0.0 to height), * this function will return the interpolated colour intensity specified by * colour (where red = 1, green = 2, blue = 3). * bilinear_interpolate_read() returns an int from 0 to 65535, and * bilinear_interpolate_dread() returns a double from 0.0 to 1.0. * Tip: Especially useful for enlarging an image. * */ int bilinear_interpolation_read(double x, double y, int colour); double bilinear_interpolation_dread(double x, double y, int colour); /* Plot Blend * Plots the colour given by red, green blue, but blended with the existing pixel * value at that position. opacity is a double that goes from 0.0 to 1.0. * 0.0 will not change the pixel at all, and 1.0 will plot the given colour. * Anything in between will be a blend of both pixel levels. Please note: This is neither * alpha channel nor PNG transparency chunk support. This merely blends the plotted pixels. * */ void plot_blend(int x, int y, double opacity, int red, int green, int blue); void plot_blend(int x, int y, double opacity, double red, double green, double blue); /* Invert * Inverts the image in RGB colourspace. * */ void invert(void); /* Resize Image * Resizes the PNGwriter instance. Note: All image data is set to black (this is * a resizing, not a scaling, of the image). * */ void resize(int width, int height); /* Boundary Fill * All pixels adjacent to the start pixel will be filled with the fill colour, until the boundary colour is encountered. * For example, calling boundary_fill() with the boundary colour set to red, on a pixel somewhere inside a red circle, * will fill the entire circle with the desired fill colour. If, on the other hand, the circle is not the boundary colour, * the rest of the image will be filled. * The colour components are either doubles from 0.0 to 1.0 or ints from 0 to 65535. * */ void boundary_fill(int xstart, int ystart, double boundary_red,double boundary_green,double boundary_blue,double fill_red, double fill_green, double fill_blue) ; void boundary_fill(int xstart, int ystart, int boundary_red,int boundary_green,int boundary_blue,int fill_red, int fill_green, int fill_blue) ; /* Flood Fill * All pixels adjacent to the start pixel will be filled with the fill colour, if they are the same colour as the * start pixel. For example, calling flood_fill() somewhere in the interior of a solid blue rectangle will colour * the entire rectangle the fill colour. The colour components are either doubles from 0.0 to 1.0 or ints from 0 to 65535. * */ void flood_fill(int xstart, int ystart, double fill_red, double fill_green, double fill_blue) ; void flood_fill(int xstart, int ystart, int fill_red, int fill_green, int fill_blue) ; /* Polygon * This function takes an array of integer values containing the coordinates of the vertexes of a polygon. * Note that if you want a closed polygon, you must repeat the first point's coordinates for the last point. * It also requires the number of points contained in the array. For example, if you wish to plot a triangle, * the array will contain 6 elements, and the number of points is 3. Be very careful about this; if you specify the wrong number * of points, your program will either segfault or produce points at nonsensical coordinates. * The colour components are either doubles from 0.0 to 1.0 or ints from 0 to 65535. * */ void polygon(int * points, int number_of_points, double red, double green, double blue); void polygon(int * points, int number_of_points, int red, int green, int blue); /* Plot CMYK * Plot a point in the Cyan, Magenta, Yellow, Black colourspace. Please note that this colourspace is * lossy, i.e. it cannot reproduce all colours on screen that RGB can. The difference, however, is * barely noticeable. The algorithm used is a standard one. The colour components are either * doubles from 0.0 to 1.0 or ints from 0 to 65535. * */ void plotCMYK(int x, int y, double cyan, double magenta, double yellow, double black); void plotCMYK(int x, int y, int cyan, int magenta, int yellow, int black); /* Read CMYK, Double version * Get a pixel in the Cyan, Magenta, Yellow, Black colourspace. if 'colour' is 1, the Cyan component will be returned * as a double from 0.0 to 1.0. If 'colour is 2, the Magenta colour component will be returned, and so on, up to 4. * */ double dreadCMYK(int x, int y, int colour); /* Read CMYK * Same as the above, but the colour components returned are an int from 0 to 65535. * */ int readCMYK(int x, int y, int colour); /* Scale Proportional * Scale the image using bilinear interpolation. If k is greater than 1.0, the image will be enlarged. * If k is less than 1.0, the image will be shrunk. Negative or null values of k are not allowed. * The image will be resized and the previous content will be replaced by the scaled image. * Tip: use getheight() and getwidth() to find out the new width and height of the scaled image. * Note: After scaling, all images will have a bit depth of 16, even if the original image had * a bit depth of 8. * */ void scale_k(double k); /* Scale Non-Proportional * Scale the image using bilinear interpolation, with different horizontal and vertical scale factors. * */ void scale_kxky(double kx, double ky); /* Scale To Target Width and Height * Scale the image in such a way as to meet the target width and height. * Tip: if you want to keep the image proportional, scale_k() might be more appropriate. * */ void scale_wh(int finalwidth, int finalheight); /* Blended Functions * All these functions are identical to their non-blended types. They take an extra argument, opacity, which is * a double from 0.0 to 1.0 and represents how much of the original pixel value is retained when plotting the * new pixel. In other words, if opacity is 0.7, then after plotting, the new pixel will be 30% of the * original colour the pixel was, and 70% of the new colour, whatever that may be. As usual, each function * is available in int or double versions. Please note: This is neither alpha channel nor PNG transparency chunk support. This merely blends the plotted pixels. * */ // Start Blended Functions void plotHSV_blend(int x, int y, double opacity, double hue, double saturation, double value); void plotHSV_blend(int x, int y, double opacity, int hue, int saturation, int value); void line_blend(int xfrom, int yfrom, int xto, int yto, double opacity, int red, int green,int blue); void line_blend(int xfrom, int yfrom, int xto, int yto, double opacity, double red, double green,double blue); void square_blend(int xfrom, int yfrom, int xto, int yto, double opacity, int red, int green,int blue); void square_blend(int xfrom, int yfrom, int xto, int yto, double opacity, double red, double green,double blue); void filledsquare_blend(int xfrom, int yfrom, int xto, int yto, double opacity, int red, int green,int blue); void filledsquare_blend(int xfrom, int yfrom, int xto, int yto, double opacity, double red, double green,double blue); void circle_blend(int xcentre, int ycentre, int radius, double opacity, int red, int green, int blue); void circle_blend(int xcentre, int ycentre, int radius, double opacity, double red, double green, double blue); void filledcircle_blend(int xcentre, int ycentre, int radius, double opacity, int red, int green, int blue); void filledcircle_blend(int xcentre, int ycentre, int radius, double opacity, double red, double green, double blue); void bezier_blend( int startPtX, int startPtY, int startControlX, int startControlY, int endPtX, int endPtY, int endControlX, int endControlY, double opacity, double red, double green, double blue); void bezier_blend( int startPtX, int startPtY, int startControlX, int startControlY, int endPtX, int endPtY, int endControlX, int endControlY, double opacity, int red, int green, int blue); void plot_text_blend(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double opacity, double red, double green, double blue); void plot_text_blend(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double opacity, int red, int green, int blue); void plot_text_utf8_blend(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double opacity, double red, double green, double blue); void plot_text_utf8_blend(char * face_path, int fontsize, int x_start, int y_start, double angle, char * text, double opacity, int red, int green, int blue); void boundary_fill_blend(int xstart, int ystart, double opacity, double boundary_red,double boundary_green,double boundary_blue,double fill_red, double fill_green, double fill_blue) ; void boundary_fill_blend(int xstart, int ystart, double opacity, int boundary_red,int boundary_green,int boundary_blue,int fill_red, int fill_green, int fill_blue) ; void flood_fill_blend(int xstart, int ystart, double opacity, double fill_red, double fill_green, double fill_blue) ; void flood_fill_blend(int xstart, int ystart, double opacity, int fill_red, int fill_green, int fill_blue) ; void polygon_blend(int * points, int number_of_points, double opacity, double red, double green, double blue); void polygon_blend(int * points, int number_of_points, double opacity, int red, int green, int blue); void plotCMYK_blend(int x, int y, double opacity, double cyan, double magenta, double yellow, double black); void plotCMYK_blend(int x, int y, double opacity, int cyan, int magenta, int yellow, int black); // End of Blended Functions /* Laplacian * This function applies a discrete laplacian to the image, multiplied by a constant factor. * The kernel used in this case is: * 1.0 1.0 1.0 * 1.0 -8.0 1.0 * 1.0 1.0 1.0 * Basically, this works as an edge detector. The current pixel is assigned the sum of all neighbouring * pixels, multiplied by the corresponding kernel element. For example, imagine a pixel and its 8 neighbours: * 1.0 1.0 0.0 0.0 * 1.0 ->1.0<- 0.0 0.0 * 1.0 1.0 0.0 0.0 * This represents a border between white and black, black is on the right. Applying the laplacian to * the pixel specified above pixel gives: * 1.0*1.0 + 1.0*1.0 + 0.0*1.0 + * 1.0*1.0 + 1.0*-8.0 + 0.0*1.0 + * 1.0*1.0 + 1.0*1.0 + 0.0*1.0 = -3.0 * Applying this to the pixel to the right of the pixel considered previously, we get a sum of 3.0. * That is, after passing over an edge, we get a high value for the pixel adjacent to the edge. Since * PNGwriter limits the colour components if they are off-scale, and the result of the laplacian * may be negative, a scale factor and an offset value are included. This might be useful for * keeping things within range or for bringing out more detail in the edge detection. The * final pixel value will be given by: * final value = laplacian(original pixel)*k + offset * Tip: Try a value of 1.0 for k to start with, and then experiment with other values. * */ void laplacian(double k, double offset); /* Filled Triangle * Draws the triangle specified by the three pairs of points in the colour specified * by the colour coefficients. The colour components are either doubles from 0.0 to * 1.0 or ints from 0 to 65535. * */ void filledtriangle(int x1,int y1,int x2,int y2,int x3,int y3, int red, int green, int blue); void filledtriangle(int x1,int y1,int x2,int y2,int x3,int y3, double red, double green, double blue); /* Filled Triangle, Blended * Draws the triangle specified by the three pairs of points in the colour specified * by the colour coefficients, and blended with the background. See the description for Blended Functions. * The colour components are either doubles from 0.0 to 1.0 or ints from 0 to 65535. * */ void filledtriangle_blend(int x1,int y1,int x2,int y2,int x3,int y3, double opacity, int red, int green, int blue); void filledtriangle_blend(int x1,int y1,int x2,int y2,int x3,int y3, double opacity, double red, double green, double blue); /* Arrow, Filled Arrow * Plots an arrow from (x1, y1) to (x2, y2) with the arrowhead at the second point, given the size in pixels * and the angle in radians of the arrowhead. The plotted arrow consists of one main line, and two smaller * lines originating from the second point. Filled Arrow plots the same, but the arrowhead is a solid triangle. * Tip: An angle of 10 to 30 degrees looks OK. * */ void arrow( int x1,int y1,int x2,int y2,int size, double head_angle, double red, double green, double blue); void arrow( int x1,int y1,int x2,int y2,int size, double head_angle, int red, int green, int blue); void filledarrow( int x1,int y1,int x2,int y2,int size, double head_angle, double red, double green, double blue); void filledarrow( int x1,int y1,int x2,int y2,int size, double head_angle, int red, int green, int blue); /* Cross, Maltese Cross * Plots a simple cross at x, y, with the specified height and width, and in the specified colour. * Maltese cross plots a cross, as before, but adds bars at the end of each arm of the cross. * The size of these bars is specified with x_bar_height and y_bar_width. * The cross will look something like this: * * ----- <-- ( y_bar_width) * | * | * |-------| <-- ( x_bar_height ) * | * | * ----- * */ void cross( int x, int y, int xwidth, int yheight, double red, double green, double blue); void cross( int x, int y, int xwidth, int yheight, int red, int green, int blue); void maltesecross( int x, int y, int xwidth, int yheight, int x_bar_height, int y_bar_width, double red, double green, double blue); void maltesecross( int x, int y, int xwidth, int yheight, int x_bar_height, int y_bar_width, int red, int green, int blue); /* Diamond and filled diamond * Plots a diamond shape, given the x, y position, the width and height, and the colour. * Filled diamond plots a filled diamond. * */ void filleddiamond( int x, int y, int width, int height, int red, int green, int blue); void diamond(int x, int y, int width, int height, int red, int green, int blue); void filleddiamond( int x, int y, int width, int height, double red, double green, double blue); void diamond(int x, int y, int width, int height, double red, double green, double blue); /* Get Text Width, Get Text Width UTF8 * Returns the approximate width, in pixels, of the specified *unrotated* text. It is calculated by adding * each letter's width and kerning value (as specified in the TTF file). Note that this will not * give the position of the farthest pixel, but it will give a pretty good idea of what area the * text will occupy. Tip: The text, when plotted unrotated, will fit approximately in a box with its lower left corner at * (x_start, y_start) and upper right at (x_start + width, y_start + size), where width is given by get_text_width() * and size is the specified size of the text to be plotted. Tip: Text plotted at position * (x_start, y_start), rotated with a given 'angle', and of a given 'size' * whose width is 'width', will fit approximately inside a rectangle whose corners are at * 1 (x_start, y_start) * 2 (x_start + width*cos(angle), y_start + width*sin(angle)) * 3 (x_start + width*cos(angle) - size*sin(angle), y_start + width*sin(angle) + size*cos(angle)) * 4 (x_start - size*sin(angle), y_start + size*cos(angle)) * */ int get_text_width(char * face_path, int fontsize, char * text); int get_text_width_utf8(char * face_path, int fontsize, char * text); }; #endif hhsuite-2.0.16/src/list.h0000775172256617226630000001550412110430072017500 0ustar hauserscientific_computing// list.h //////////////////////////////////////////////////////////////////////////////// // Double-linked list implementation with head and tail dummy elements // We set head->prev=head and tail->next=tail. // This makes sure that repeated current=current->next; ends up in tail // and repeated current=current->prev; ends up in head. // head and tail optionally contain a NULL element of Typ defined by method Null(Typ) //////////////////////////////////////////////////////////////////////////////// template class List { protected: template class ListEl //elements of List; essentially a data structure { public: Typ1 data; //Typ is type of data to be stored in list ListEl* prev; //points to previous list element ListEl* next; //points to next list element ListEl() : prev(0), next(0) {} ListEl(Typ1 d) : data(d), prev(0), next(0) {} ListEl(ListEl* p, ListEl* n) : prev(p), next(n) {} ListEl(Typ1 d, ListEl* p, ListEl* n) : data(d), prev(p), next(n) {} // Note: If data is a pointer to another data structure, that structure is not deleted }; ListEl* head; //points to dummy element at beginning of list ListEl* tail; //points to dummy element at end of list ListEl* current; //current element position within list int size; //Number of elements in list // Use QUICKSORT to sort list in asscending order between two list elements void SortList(ListEl*, ListEl*, int); // Use QUICKSORT to sort list of pointers by comparing elements they point to void SortPointerList(ListEl*, ListEl*); // Swap two list elements by making a flat copy (don't need two copies of data) // Warning: Gets slow if Typ is composite type with many variables (>=5) void SwapContent(ListEl* e1, ListEl* e2) { Typ d; if (e1!=e2) {d=e1->data; e1->data=e2->data; e2->data=d;} } public: //////////////////////////////////////////////////////////////////////////////////////////// // General methods List(); List(Typ d); ~List(); // note: if data is a pointer to another data structure, that structure is not deleted! List& operator=(List&); // Set Null element that will be returned when trying to read from an empty list void Null(Typ null) {head->data = tail->data = null;} //////////////////////////////////////////////////////////////////////////////////////////// // Methods that act at the end of the list // Insert Element after LAST element of list (and return address of data element) Typ* Push(Typ); // Remove and return LAST element of list. Returns head->data if list empty Typ Pop(); // return LAST element of list. Returns null element in head->data if list empty Typ ReadLast() {return tail->prev->data;} //////////////////////////////////////////////////////////////////////////////////////////// // Methods that act at the beginning of the list // Insert element as FIRST element of list (and return address of data element) Typ* Enqueue(Typ); // Remove and return element at BEGINNING of list. Returns head->data if list empty Typ Dequeue(); // return FIRST element of list. Returns null element in head->data if list empty Typ ReadFirst() {if (size) return head->next->data; else return head->data;} //////////////////////////////////////////////////////////////////////////////////////////// // Methods that work with 'current' position in the list // Advances current position by 1 and reads next element; returns head->data if at end of list. Typ ReadNext(); // Reads current element again Typ ReadCurrent(); // Moves current position back by 1 and reads previous element; returns head->data if at beginning of list. Typ ReadPrevious(); // Advances current position by 1 and reads address of next data element; returns NULL if at end of list. Typ* ReadNextAddress(); // Reads address of current data element again, returns NULL if at end of list Typ* ReadCurrentAddress(); // Sets current position to k and reads k'th element (first=1). Returns head->data if current points to no data element Typ Read(int); // Inserts element AFTER CURRENT element; current element will be set to inserted element void Insert(Typ); // Removes and returns element at CURRENT position. New position is one BEFORE current position. // Returns head->data if current points to no data element. After Reset() delete first element (not 0'th) Typ Delete(); // Overwrites data at current position with new data void Overwrite(Typ d) {current->data=d;} // Reset current position to 0 (one BEFORE the first) int Reset() {current = head; return size;} // Reset current position to End (one AFTER the last) int SetToEnd() {current = tail; return size;} //////////////////////////////////////////////////////////////////////////////////////////// // Methods that return information about the list // Return number of list elements (size>=0) int Size() {return size;} // return true if end of list, i.e. ReadNext would give tail->data (i.e. current position >= Size) char End() {return (current==tail || current==tail->prev);} char End(void* curr) {return ( curr == tail || curr == tail->prev);} // return true if start of list, i.e. ReadPrevious would give head->data (i.e. current position <=1) char Start() {return (current==head || current==head->next);} // Get current position within list (0 <= pos <= Size+1) int GetPos(); //print out list (elements assumed int) void PrintList(); // Get largest data element (Null element for empty list) Typ Largest(); // Get smallest data element (Null element for empty list) Typ Smallest(); //////////////////////////////////////////////////////////////////////////////////////////// // Methods that manipulate the list as a whole // Reverse list void Reverse(); // Copies list into list object void Copy(List* list); // Appends a copy of list to class object void AppendCopy(List* list); // Appends list to class object list void Append(List* list); // Use QUICKSORT to sort list in ascending order. Use only for UNSORTED lists, otherwise time O(N^2) instead of O(N*log(N)) /* void SortList() {if (size>1) SortList(head->next, tail->prev);} */ void SortList() {if (size>1) SortList(head->next, tail->prev, size);} void QuickSort() {if (size>1) SortList(head->next, tail->prev, size);} // Use QUICKSORT to sort list of pointers in ascending order. Use only for UNSORTED lists, otherwwise time O(N^2)! void SortPointerList() {if (size>1) SortPointerList(head->next, tail->prev);} void QuickSortPointer() {if (size>1) SortPointerList(head->next, tail->prev);} // Use INSERTSORT to sort list in asscending order. Use only for PRESORTED lists, otherwise time O(N^2)! void ResortList(); }; hhsuite-2.0.16/src/hhhitlist.h0000775172256617226630000000723412110430072020526 0ustar hauserscientific_computing// hhhitlist.h ///////////////////////////////////////////////////////////////////////////////////// // HitList is a list of hits of type Hit which can be operated upon by several anaylsis methods ///////////////////////////////////////////////////////////////////////////////////// class HitList : public List { private: double score[MAXPROF]; // HHsearch score of each HMM for ML fit double weight[MAXPROF]; // weight of each HMM = 1/(size_fam[tfam]*size_sfam[hit.sfam]) for ML fit int Nprof; // Number of HMMs for ML fit public: int fams; // number of families found found in hitlist int sfams; // number of superfamilies found in hitlist int N_searched; // number of sequences searched from HMM database Hash* blast_logPvals; // Hash containing names and log(P-values) read from BLAST file (needed for HHblits) HitList() {blast_logPvals=NULL;} ~HitList() {if (blast_logPvals) delete blast_logPvals;} // Print summary listing of hits void PrintHitList(HMM* q, char* outfile); // Print alignments of query sequences against hit sequences void PrintAlignments(HMM* q, char* outfile, char outformat=0); // Return a figure of merit for distinction of the score with positive from the scores with negatives void Optimize(HMM* q); // Print score distribution into file score_dist void PrintScoreFile(HMM* q); // Write alignments in tabular output void WriteToAlifile(HMM* q, bool scop_only=false); // Log likelihood for fitting the EVD to the score distribution double LogLikelihoodEVD(double* v); // Static wrapper-function for calling the nonstatic member function LogLikelihoodEVD() static double LogLikelihoodEVD_static(void* pt2hitlist, double* v); // Subroutine to FindMin: new point given by highest point ihigh, fac and replaces ihigh if it is lower double TryPoint(int ndim, double* p, double* y, double* psum, int ihigh, double fac, double (*Func)(void* pt2hitlist, double* v)); // Find minimum with simplex method of Nelder and Mead (1965) float FindMin(int ndim, double* p, double* y, double tol, int& nfunc, double (*Func)(void* pt2hitlist, double* v)); // Do a maximum likelihood fit of the scores with an EV distribution with parameters lamda and mu void MaxLikelihoodEVD(HMM* q, int nbest); // Calculate HHblits composite E-values void CalculateHHblitsEvalues(HMM* q); // Calculate Pvalues as a function of query and template lengths and diversities void CalculatePvalues(HMM* q); // Set P-values, E-values and scores according to q->lamda and q->mu (if calibration from database scan is impossible) void GetPvalsFromCalibration(HMM* q); // HHblits: read PSI-BLAST E-values to determine correlation void ReadBlastFile(HMM* q); // Print first 20 hits of hitlist void Debug() { Hit hit; int i=0; Reset(); printf("TARGET FAMILY LEN COL LOG-PVA S-AASS PROBAB SCORE_SORT\n"); while (++i<=20 && !End()) { hit = ReadNext(); printf("%-10.10s %-10.10s %3i %3i %7.4f %7.2f %6.2f %6.2f\n",hit.name,hit.fam,hit.L,hit.matched_cols,-1.443*hit.logPval,-hit.score_aass,hit.Probab,hit.score_sort); } } // Used only for transitive scoring?? /* // Matrix manipulation */ /* void PrintMatrix(float** V, int N); */ /* void PrintMatrix(double** V, int N); */ /* float NormalizationFactor(double** Csub,float* w, int M); */ /* void Normalize(float* Ztq, char** fold, Hash& excluded); */ /* void InvertMatrix(double** B, double** A, int N); */ /* void TransposeMatrix(double** V, int N); */ /* void SVD(double **A, int n, double w[], double **V); */ }; hhsuite-2.0.16/src/hhfilter.C0000775172256617226630000002527012110430072020266 0ustar hauserscientific_computing// hhfilterC: filter alignment in a2m format with maximum sequence identity of match states and minimum coverage // // (C) Johannes Soeding 2012 // 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 . // We are very grateful for bug reports! Please contact us at soeding@genzentrum.lmu.de // Reference: // Remmert M., Biegert A., Hauser A., and Soding J. // HHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment. // Nat. Methods, epub Dec 25, doi: 10.1038/NMETH.1818 (2011). #define MAIN #include // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // clock #include // perror(), strerror(errno) #include // islower, isdigit etc #include #ifdef HH_SSE41 #include // SSSE3 #include // SSE4.1 #define HH_SSE3 #endif #ifdef HH_SSE3 #include // SSE3 #define HH_SSE2 #endif #ifdef HH_SSE2 #ifndef __SUNPRO_C #include // SSE2 #else #include #endif #endif using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; #include "cs.h" // context-specific pseudocounts #include "context_library.h" #include "library_pseudocounts-inl.h" #include "list.h" // list data structure #include "hash.h" // hash data structure #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "hhdecl.C" // Constants, global variables, struct Parameters #include "hhutil.C" // MatchChr, InsertChr, aa2i, i2aa, log2, fast_log2, ScopID, WriteToScreen, #include "hhmatrices.C" // BLOSUM50, GONNET, HSDM #include "hhhmm.h" // class HMM #include "hhhit.h" // class Hit #include "hhalignment.h" // class Alignment #include "hhhmm.C" // class HMM #include "hhalignment.C" // class Alignment #include "hhfunc.C" // some functions common to hh programs ///////////////////////////////////////////////////////////////////////////////////// // Exit function ///////////////////////////////////////////////////////////////////////////////////// void help() { printf("\n"); printf("HHfilter %s\n",VERSION_AND_DATE); printf("Filter an alignment by maximum sequence identity of match states and minimum coverage\n"); printf("%s",COPYRIGHT); printf("%s",REFERENCE); printf("\n"); printf("Usage: %s -i infile -o outfile [options] \n",program_name); printf(" -i read input file in A3M/A2M or FASTA format \n"); printf(" -o write to output file in A3M format \n"); printf(" -a append to output file in A3M format \n"); printf("\n"); printf("Options: \n"); printf(" -v verbose mode: 0:no screen output 1:only warings 2: verbose\n"); printf(" -id [0,100] maximum pairwise sequence identity (%%) (def=%i) \n",par.max_seqid); printf(" -diff [0,inf[ filter MSA by selecting most diverse set of sequences, keeping \n"); printf(" at least this many seqs in each MSA block of length 50 (def=%i) \n",par.Ndiff); printf(" -cov [0,100] minimum coverage with query (%%) (def=%i) \n",par.coverage); printf(" -qid [0,100] minimum sequence identity with query (%%) (def=%i) \n",par.qid); printf(" -qsc [0,100] minimum score per column with query (def=%.1f)\n",par.qsc); printf(" -neff [1,inf] target diversity of alignment (default=off)\n"); printf("\n"); printf("Input alignment format: \n"); printf(" -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert;\n"); printf(" '-' = Delete; '.' = gaps aligned to inserts (may be omitted) \n"); printf(" -M first use FASTA: columns with residue in 1st sequence are match states\n"); printf(" -M [0,100] use FASTA: columns with fewer than X%% gaps are match states \n"); printf(" \n"); printf("Example: %s -id 50 -i d1mvfd_.a2m -o d1mvfd_.fil.a2m \n\n",program_name); cout<=4) cout<argc-1 || argv[i][0]=='-') {cerr<<"Error in "<argc-1) {cerr<<"Error in "<argc-1) {cerr<<"Error in "<='0' && argv[i][0]<='9') {par.Mgaps=atoi(argv[i]); par.M=2;} else cerr<=4) cout<1 && !strcmp(argv[i],"-v0")) v=0; else if (argc>1 && !strcmp(argv[i],"-v1")) v=1; else if (argc>2 && !strcmp(argv[i],"-v")) v=atoi(argv[i+1]); } par.SetDefaultPaths(program_path); // Read .hhdefaults file? if (par.readdefaultsfile) { // Process default otpions from .hhconfig file ReadDefaultsFile(argc_conf,argv_conf); ProcessArguments(argc_conf,argv_conf); } // Process command line options (they override defaults from .hhconfig file) ProcessArguments(argc,argv); // Check command line input and default values if (!*par.infile) {help(); cerr<<"Error in "<=2) { cout<<"Input file = "<-10) SetSubstitutionMatrix(); // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) qali.N_filtered = qali.Filter(par.max_seqid,par.coverage,par.qid,par.qsc,par.Ndiff); // Atune alignment diversity q.Neff with qsc to value Neff_goal if (par.Neff>=1.0) qali.FilterNeff(); // Write filtered alignment WITH insert states (lower case) to alignment file qali.WriteToFile(par.outfile); // Print 'Done!' FILE* outf=NULL; if (!strcmp(par.outfile,"stdout")) printf("Done!\n"); else { if (!*par.outfile) { outf=fopen(par.outfile,"a"); //open for append fprintf(outf,"Done!\n"); fclose(outf); } if (v>=2) printf("Done\n"); } exit(0); } //end main hhsuite-2.0.16/src/hash.C0000775172256617226630000004360112110430072017402 0ustar hauserscientific_computing// hash.C // Class for Hash data structure // * works in the same way as a hash in Perl // * keys are strings of type char* // * data elements are of type Typ // * objects have to be declared with maximal size, e.g. Hash hash1(10000) (num_slots should not be a power of 2) // * works also if maximal size is exceeded, but gets slower by a factor ~num_keys/num_slots #ifndef HASH #define HASH #ifndef MAIN #include // cin, cout, cerr #include // printf #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // islower, isdigit etc #include // clock #include // perror() using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; #endif #ifndef JLIST #define JLIST #include "list.h" // List //// #include "list.C" ////////////////////////////////// DEBUG #endif #include "hash.h" //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// Methods of class Hash //////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// // Private Methods //////////////////////////////////////////////////////////////////////////////////////////// // Constructor and Destructor of Hash //////////////////////////////////////////////////////////////////////////////////////////// // Constructor of class Hash //////////////////////////////////////////////////////////////////////////////////////////// template Hash::Hash() { num_keys=0; max_len=0; prev=curr=num_slots = 0; slot=NULL; } template Hash::Hash(int nslots) { num_keys=0; max_len=0; prev=curr=num_slots = nslots; slot = new Slot*[num_slots]; //Create array of num_slots slots for (int i=0; i(0); } template Hash::Hash(int nslots, Typ f) { num_keys=0; max_len=0; prev=curr=num_slots = nslots; slot = new Slot*[num_slots]; //Create array of num_slots slots for (int i=0; i data is a pointer to another data structure, that structure is not deleted! //////////////////////////////////////////////////////////////////////////////////////////// template Hash::~Hash() { RemoveAll(); delete[] slot; } //////////////////////////////////////////////////////////////////////////////////////////// // Hash function //////////////////////////////////////////////////////////////////////////////////////////// template inline unsigned int Hash::HashValue(char* key) //returns the hash value for key { // Calculate a hash value by the division method: // Transform key into a natural number k = sum ( key[i]*128^(L-i) ) and calculate i= k % num_slots. // Since calculating k would lead to an overflow, i is calculated iteratively // and at each iteration the part divisible by num_slots is subtracted, i.e. (% num_slots is taken). if (key==NULL) {printf("Warning from hash.C: key=NULL\n"); return 0;} unsigned int i=0; // Start of iteration: k is zero char* c = key; while(*c) i = ((i<<7) + *(c++)) % num_slots; key_len = c - key; //cerr<<" Hash value for \'"< void Hash::New(int nslots, Typ f) { fail=f; RemoveAll(); delete[] slot; num_keys=0; max_len=0; prev=curr=num_slots = nslots; slot = new Slot*[num_slots]; //Create array of num_slots slots for (int i=0; i Typ Hash::Show(char* key) { Slot* pslot; int i = HashValue(key); pslot = slot[i]; if (!pslot) return fail; pslot->Reset(); do{ if(!strcmp(pslot->ReadNext().key,key)) return pslot->ReadCurrent().data; } while(!pslot->End()); return fail; } //////////////////////////////////////////////////////////////////////////////////////////// // Add/replace key/data pair to hash and return address of data element //////////////////////////////////////////////////////////////////////////////////////////// template Typ* Hash::Add(char* key, Typ data) { Pair* pairp; Slot* pslot; int i = HashValue(key); pslot = slot[i]; if (!pslot) { num_keys++; KeyLen(); slot[i]=new(Slot); return slot[i]->Push(key_len,key,data);} pslot->Reset(); do { pairp = pslot->ReadNextAddress(); if(!strcmp(pairp->key,key)) { pairp->data=data; pslot->Overwrite(*pairp); return &(pairp->data); } } while(!pslot->End()); num_keys++; KeyLen(); return pslot->Push(key_len,key,data); } //////////////////////////////////////////////////////////////////////////////////////////// // Add key to hash and return address of data element. // If key exists leave data element unchanged, else set it to 'fail'. //////////////////////////////////////////////////////////////////////////////////////////// template Typ* Hash::Add(char* key) { Slot* pslot; int i = HashValue(key); pslot = slot[i]; if (!pslot) { num_keys++; KeyLen(); slot[i]=new(Slot); return slot[i]->Push(key_len,key,fail);} pslot->Reset(); do { if(!strcmp(pslot->ReadNext().key,key)) { return &((pslot->ReadCurrentAddress())->data); } } while(!pslot->End()); num_keys++; KeyLen(); return pslot->Push(key_len,key,fail); } ///////////////////////////////////////////////////////////////////////////////////////////// // Remove key from hash and return data element for key ('fail' if key does not exist) ///////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::Remove(char* key) { Slot* pslot; int i = HashValue(key); pslot = slot[i]; if (!pslot) return fail; pslot->Reset(); do { if(!strcmp(pslot->ReadNext().key,key)) { Pair pair = pslot->ReadCurrent(); num_keys--; pslot->Delete(); // Delete key-Array delete[] pair.key; // if key was the only element in pslot then delete whole list if (pslot->Size()==0) {delete pslot; slot[i]=0;} // return pslot->ReadCurrent().data; return pair.data; } } while(!pslot->End()); return fail; } //////////////////////////////////////////////////////////////////////////////////////////// // Remove all keys from hash; // Note: if data is a pointer to another data structure, that structure is not deleted! //////////////////////////////////////////////////////////////////////////////////////////// template void Hash::RemoveAll() { for(int i=0; i Typ Hash::ReadNext() { Pair* pairp; Slot* pslot; if (curr>=num_slots) {return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots pairp = pslot->ReadNextAddress(); if (pslot->End()) { prev=curr; do // move on to next non-empty list { if (++curr>=num_slots) return pairp->data; pslot = slot[curr]; } while (!pslot); pslot->Reset(); } return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Write next key into variable key and return data. Return 'fail' data and empty key if at end // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! //////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::ReadNext(char* key) { Pair* pairp; Slot* pslot; if (curr>=num_slots) {*key='\0'; return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots pairp = pslot->ReadNextAddress(); strcpy(key,pairp->key); if (pslot->End()) { prev=curr; do // move on to next non-empty list { if (++curr>=num_slots) return pairp->data; pslot = slot[curr]; } while (!pslot); pslot->Reset(); } return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Return data of current key //////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::ReadCurrent() { Pair* pairp; Slot* pslot; curr=prev; if (curr>=num_slots) {return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots Pair pair = pslot->ReadCurrent(); pairp = &pair; if (pslot->End()) { do // move on to next non-empty list { if (++curr>=num_slots) return pairp->data; pslot = slot[curr]; } while (!pslot); pslot->Reset(); } return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Write key last read into variable key and return data // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! //////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::ReadCurrent(char* key) { Pair* pairp; Slot* pslot; curr=prev; if (curr>=num_slots) {*key='\0'; return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots Pair pair = pslot->ReadCurrent(); pairp = &pair; strcpy(key,pairp->key); if (pslot->End()) { do // move on to next non-empty list { if (++curr>=num_slots) return pairp->data; pslot = slot[curr]; } while (!pslot); pslot->Reset(); } return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Remove current key, return data, and advance to next key (after Reset() remove first element) //////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::RemoveCurrent() { Pair* pairp; Slot* pslot; curr=prev; if (curr>=num_slots) {return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots Pair pair = pslot->Delete(); pairp = &pair; num_keys--; // if key was the only element in pslot then delete whole list if (pslot->Size()==0) {delete pslot; slot[curr]=0;} if (!pslot || pslot->End()) { do // move on to next non-empty list { if (++curr>=num_slots) {prev=curr; return pairp->data;} pslot = slot[curr]; } while (!pslot); pslot->Reset(); } prev=curr; return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Remove current key, return data, copy current key into key, and advance to next key // (After Reset() remove first element) // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! //////////////////////////////////////////////////////////////////////////////////////////// template Typ Hash::RemoveCurrent(char* key) { Pair* pairp; Slot* pslot; curr=prev; if (curr>=num_slots) {*key='\0'; return fail;} pslot = slot[curr]; // current list is never empty, except when current=num_slots pairp = &(pslot->Delete()); strcpy(key,pairp->key); num_keys--; // if key was the only element in pslot then delete whole list if (pslot->Size()==0) {delete pslot; slot[curr]=0;} if (!pslot || pslot->End()) { do // move on to next non-empty list { if (++curr>=num_slots) {prev=curr; return pairp->data;} pslot = slot[curr]; } while (!pslot); pslot->Reset(); } prev=curr; return pairp->data; } //////////////////////////////////////////////////////////////////////////////////////////// // Reset current position to beginning of hash //////////////////////////////////////////////////////////////////////////////////////////// template void Hash::Reset() { curr=-1; Slot* pslot; do { curr++; if (curr>=num_slots) {prev=curr; return;} pslot = slot[curr]; } while (!pslot); pslot->Reset(); prev=curr; return; } ///////////////////////////////////////////////////////////////////////////////////////////// // Methods that return usefull information about the data stored in Hash: //////////////////////////////////////////////////////////////////////////////////////////// // Returns 1 if the hash contains key, 0 otherwise //////////////////////////////////////////////////////////////////////////////////////////// template int Hash::Contains(char* key) { Slot* pslot; int i = HashValue(key); pslot = slot[i]; if (!pslot) return 0; pslot->Reset(); do{ if(!strcmp(pslot->ReadNext().key,key)) return 1; } while(!pslot->End()); return 0; } ///////////////////////////////////////////////////////////////////////////////////////////// //print out list of keys and data ///////////////////////////////////////////////////////////////////////////////////////////// template void Hash::Print() { char key[MaxLen()+1]; cout<<"\nPrint hash:\n"; Reset(); while(!End()) cout<"< void Hash::PrintKeys() { char key[MaxLen()+1]; cout<<"\nPrint hash-keys:\n"; Reset(); while(!End()) cout< void Hash::DebugPrint() { Pair* pairp; Slot* pslot; cout<<"\n"; cout<<"Debug-print hash:"; for(int i=0; iReset(); while(!pslot->End()) { pairp = pslot->ReadNextAddress(); cout<<" "<key<<"->"<data; } } } cout<<"\n\n"; return; } #endif /* HASH */ //////////////////////////////////////////////////////////////////////////////// // Main program: test class Hash //////////////////////////////////////////////////////////////////////////////// // int main() // { // Hash ihash(5); // char* key=new char[128]; // int data; // ihash.Fail(1000); // ihash.Add("So many monsters",36); // ihash.Add("So many chickens",25); // // cerr<<"Address of ihash(\"So many monsters\") is "<"<"<"<& seq, const Profile& prof) : query(seq), profile(prof) {} // Constructor to create a PSSM from a PSI-BLAST checkpoint file. Pssm(FILE* fin); // Overwrites existing PSSM with PSSM from PSI-BLAST checkpoint. void Read(FILE* fin) { size_t count = 0; int query_length = 0; count += fread(reinterpret_cast(&query_length), kIntSize, 1, fin); assert(count == 1); assert(query_length > 0); query.Resize(query_length); profile.Resize(query_length); for (int i = 0; i < query_length; ++i) { char c; count += fread(&c, kCharSize, 1, fin); assert(AA::kValidChar[c]); query[i] = AA::kCharToInt[static_cast(c)]; } for(int i = 0; i < query_length; ++i) { for(size_t a = 0; a < AA::kSize; ++a) { double p; count += fread(reinterpret_cast(&p), kDoubleSize, 1, fin); profile[i][a] = p; } } assert_eq(1 + query_length + query_length * AA::kSize, count); } // Writes PSSM in PSI-BLAST binary checkpoint format to stream. void Write(FILE* fout) const { LOG(INFO) << "Writing PSI-BLAST checkpoint ..."; LOG(INFO) << query; LOG(INFO) << profile; int query_length = query.length(); size_t count = 0; count += fwrite(reinterpret_cast(&query_length), kIntSize, 1, fout); for(int i = 0; i < query_length; ++i) { char c = query.chr(i); count += fwrite(&c, kCharSize, 1, fout); } for(int i = 0; i < query_length; ++i) { for(size_t a = 0; a < AA::kSize; ++a) { double p = profile[i][a]; count += fwrite(reinterpret_cast(&p), kDoubleSize, 1, fout); } } assert_eq(1 + query_length + query_length * AA::kSize, count); } // Query sequence with which search was started Sequence query; // Evolving sequence profile Profile profile; }; // class Pssm } // namespace cs #endif // CS_PSSM_H_ hhsuite-2.0.16/src/cs/scoped_ptr.h0000664172256617226630000000152412110430072021266 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SCOPED_PTR_H_ #define CS_SCOPED_PTR_H_ #include "globals.h" // This implementation of scoped_ptr is PARTIAL - it only contains // enough stuff to satisfy our needs. template class scoped_ptr { public: explicit scoped_ptr(T* p = NULL) : ptr_(p) {} ~scoped_ptr() { reset(); } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } operator bool () const { return ptr_ != NULL; } T* release() { T* const ptr = ptr_; ptr_ = NULL; return ptr; } void reset(T* p = NULL) { if (p != ptr_) { if (sizeof(T) > 0) { // Makes sure T is a complete type. delete ptr_; } ptr_ = p; } } private: T* ptr_; DISALLOW_COPY_AND_ASSIGN(scoped_ptr); }; #endif // CS_SCOPED_PTR_H_ hhsuite-2.0.16/src/cs/getopt_pp.h0000664172256617226630000003171512110430072021132 0ustar hauserscientific_computing/* GetOpt_pp: Yet another C++ version of getopt. Copyright (C) 2007, 2008 Daniel Gutson, FuDePAN This file is part of GetOpt_pp. GetOpt_pp 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. board-games 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 . */ #ifndef CS_GETOPT_PP_H_ #define CS_GETOPT_PP_H_ #include #include #include #include #ifndef GETOPT_INLINE # define GETOPT_INLINE #endif namespace GetOpt { typedef std::vector OptionArgs; struct OptionData { enum _Flags { CmdLine_NotExtracted, CmdLine_Extracted, Envir }; _Flags flags; OptionArgs args; OptionData() : flags(CmdLine_NotExtracted) {} void clear() { flags = CmdLine_NotExtracted; args.clear(); } }; typedef std::map LongOptions; typedef std::map ShortOptions; struct _Option { enum Result { OK, ParsingError, OptionNotFound, BadType, NoArgs, TooManyArgs, OptionNotFound_NoEx }; virtual Result operator() (ShortOptions& short_ops, LongOptions& long_ops, std::ios::fmtflags flags) const = 0; virtual ~_Option() {} }; template inline _Option::Result convert(const std::string& s, T& result, std::ios::fmtflags flags) { std::stringstream ss; ss.clear(); ss.flags(flags); ss << s; ss >> result; if (ss.fail() || !ss.eof()) return _Option::BadType; else return _Option::OK; } template <> inline _Option::Result convert(const std::string& s, std::string& result, std::ios::fmtflags) { result = s; return _Option::OK; } template class _OptionTBase : public _Option { const char short_opt; const std::string long_opt; protected: T& target; virtual Result _assign(const OptionArgs& args, std::ios::fmtflags flags) const = 0; public: _OptionTBase(const _OptionTBase& other) : _Option(other), short_opt(other.short_opt), long_opt(other.long_opt), target(other.target) {} _OptionTBase(char short_opt, const std::string& long_opt, T& target) : short_opt(short_opt), long_opt(long_opt), target(target) {} virtual Result operator() (ShortOptions& short_ops, LongOptions& long_ops, std::ios::fmtflags flags) const { Result ret = OptionNotFound; ShortOptions::iterator it = short_ops.find(short_opt); if (it != short_ops.end()) { it->second.flags = OptionData::CmdLine_Extracted; ret = _assign(it->second.args, flags); } else if (!long_opt.empty()) { LongOptions::iterator iter = long_ops.find(long_opt); if (iter != long_ops.end()) { iter->second.flags = OptionData::CmdLine_Extracted; ret = _assign(iter->second.args, flags); } } return ret; } }; template class _OptionT : public _OptionTBase { protected: virtual _Option::Result _assign(const OptionArgs& args, std::ios::fmtflags flags) const { switch (args.size()) { case 0: return _Option::NoArgs; case 1: return convert(args[0], this->target, flags); default: return _Option::TooManyArgs; } } public: _OptionT(const _OptionT& other) : _OptionTBase(other) {} _OptionT(char short_opt, const std::string& long_opt, T& target) : _OptionTBase(short_opt, long_opt, target) {} }; template class _OptionT > : public _OptionTBase > { protected: virtual _Option::Result _assign(const OptionArgs& args, std::ios::fmtflags flags) const { if (!args.empty()) { _Option::Result result; OptionArgs::const_iterator it = args.begin(); T temp; do { result = convert(*it, temp, flags); if (result == _Option::OK) this->target.push_back(temp); ++it; } while(it != args.end() && result == _Option::OK); return result; } else { return _Option::NoArgs; } } public: _OptionT(const _OptionT >& other) : _OptionTBase >(other) {} _OptionT(char short_opt, const std::string& long_opt, std::vector& target) : _OptionTBase >(short_opt, long_opt, target) {} }; template class _DefValOption : public BaseOption { const T default_value; public: _DefValOption(const _DefValOption& other) : BaseOption(other), default_value(other.default_value) {} _DefValOption(char short_opt, const std::string& long_opt, T& target, const T& default_value) : BaseOption(short_opt, long_opt, target), default_value(default_value) {} virtual _Option::Result operator() (ShortOptions& short_ops, LongOptions& long_ops, std::ios::fmtflags flags) const { _Option::Result ret = BaseOption::operator()(short_ops, long_ops, flags); if (ret == _Option::OptionNotFound) { this->target = default_value; ret = _Option::OK; } return ret; } }; template inline _OptionT Option(char short_opt, const std::string& long_opt, T& target) { return _OptionT(short_opt, long_opt, target); } template inline _OptionT Option(char short_opt, T& target) { return _OptionT(short_opt, std::string(), target); } // Defaulted version template inline _DefValOption > Option(char short_opt, const std::string& long_opt, T& target, const T& def) { return _DefValOption >(short_opt, long_opt, target, def); } template inline _DefValOption > Option(char short_opt, T& target, const T& def) { return _DefValOption >(short_opt, std::string(), target, def); } // Defaults for strings: inline _DefValOption > Option(char short_opt, const std::string& long_opt, std::string& target, const char* def) { return _DefValOption >(short_opt, long_opt, target, def); } inline _OptionT Option(char short_opt, std::string& target, const char* def) { return _DefValOption >(short_opt, std::string(), target, def); } class OptionPresent : public _Option { const char short_opt; const std::string long_opt; bool* const present; public: // two combinations: with/without target, and with/without long opt. // WITH long_opt: OptionPresent(char short_opt, const std::string& long_opt, bool& present) : short_opt(short_opt), long_opt(long_opt), present(&present) {} OptionPresent(char short_opt, const std::string& long_opt) : short_opt(short_opt), long_opt(long_opt), present(NULL) {} // WITHOUT long_opt: OptionPresent(char short_opt, bool& present) : short_opt(short_opt), present(&present) {} OptionPresent(char short_opt) : short_opt(short_opt), present(NULL) {} protected: virtual Result operator() (ShortOptions& short_ops, LongOptions& long_ops, std::ios::fmtflags) const { bool found; ShortOptions::iterator it = short_ops.find(short_opt); found = (it != short_ops.end()); if (found) { it->second.flags = OptionData::CmdLine_Extracted; } else if (!long_opt.empty()) { LongOptions::iterator iter = long_ops.find(long_opt); found = (iter != long_ops.end()); if (found){ iter->second.flags = OptionData::CmdLine_Extracted; } } if (present != NULL) { *present = found; return OK; } else { return found ? OK : OptionNotFound_NoEx; } } }; class GetOptEx : public std::exception {}; struct ParsingErrorEx : public GetOptEx{}; struct InvalidFormatEx : public GetOptEx{}; struct ArgumentNotFoundEx : public GetOptEx{}; struct TooManyArgumentsEx : public GetOptEx{}; struct OptionNotFoundEx : public GetOptEx{}; struct TooManyOptionsEx : public GetOptEx{}; enum _EnvTag { Include_Environment }; class GetOpt_pp { ShortOptions _shortOps; LongOptions _longOps; std::ios_base::iostate _exc; _Option::Result _last; std::ios::fmtflags _flags; std::string _app_name; GETOPT_INLINE void _init_flags(); GETOPT_INLINE void _parse(int argc, char* argv[]); GETOPT_INLINE void _parse_env(); public: static const char EMPTY_OPTION; GETOPT_INLINE GetOpt_pp(int argc, char* argv[]); GETOPT_INLINE GetOpt_pp(int argc, char* argv[], _EnvTag); std::ios_base::iostate exceptions ( ) const { return _exc; } void exceptions ( std::ios_base::iostate except ) { _exc = except; } void exceptions_all() { _exc = std::ios_base::failbit | std::ios_base::eofbit; } operator bool() const { return _last == _Option::OK; } GETOPT_INLINE bool options_remain() const; void end_of_options() const throw(GetOptEx) { if (options_remain() && (_exc & std::ios_base::eofbit)) throw TooManyOptionsEx(); } std::ios::fmtflags flags() const { return _flags; } void flags(std::ios::fmtflags flags) { _flags = flags; } const std::string& app_name() const { return _app_name; } GETOPT_INLINE GetOpt_pp& operator >> (const _Option& opt) throw(GetOptEx); GETOPT_INLINE GetOpt_pp& operator >> (std::ios_base& (*iomanip)(std::ios_base&)); // Alternative to manipulators, for those who don't like them: the 'getopt' // method :) // Combination 1: with long option: template inline T getopt(char short_opt, const std::string& long_opt) throw(GetOptEx) { T result; operator >> (Option(short_opt, long_opt, result)); return result; } template inline T getopt(char short_opt, const std::string& long_opt, const T& def_value) { T result; operator >> (Option(short_opt, long_opt, result, def_value)); return result; } // Combination 2: without long option: template inline T getopt(char short_opt) throw(GetOptEx) { T result; operator >> (Option(short_opt, result)); return result; } template inline T getopt(char short_opt, const T& def_value) { T result; operator >> (Option(short_opt, result, def_value)); return result; } typedef std::pair ItPair; template class _iterator { typename Container::const_iterator _it; public: _iterator(ItPair p) { _it = Adapter::adapt(p); } _iterator() {} _iterator& operator = ( const _iterator& other) { _it = other._it; return *this; } bool operator != (const _iterator& other) const { return _it != other._it; } OptionType option() const { return _it->first; } const OptionArgs& args() const { return _it->second.args; } bool extracted() const { return _it->second.flags == OptionData::CmdLine_Extracted; } _iterator& operator ++() { ++_it; return *this; } }; ItPair begin() const { return ItPair(_shortOps.begin(), _longOps.begin() ); } ItPair end() const { return ItPair(_shortOps.end(), _longOps.end()); } struct ShortAdapter { static ShortOptions::const_iterator adapt(ItPair p) { return p.first; } }; struct LongAdapter { static LongOptions::const_iterator adapt(ItPair p) { return p.second; } }; typedef _iterator short_iterator; typedef _iterator long_iterator; }; class Environment { // Coming soon! }; } // namespace GetOpt #endif // CS_GETOPT_PP_H_ hhsuite-2.0.16/src/cs/getopt_pp.cc0000664172256617226630000001133612110430072021265 0ustar hauserscientific_computing/* GetOpt_pp: Yet another C++ version of getopt. Copyright (C) 2007, 2008 Daniel Gutson, FuDePAN This file is part of GetOpt_pp. GetOpt_pp 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. board-games 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 . */ #include #include "getopt_pp.h" #ifdef __APPLE__ extern char** environ; #endif namespace GetOpt { const char GetOpt_pp::EMPTY_OPTION = 0; GETOPT_INLINE void GetOpt_pp::_init_flags() { std::stringstream ss; _flags = ss.flags(); } GETOPT_INLINE void GetOpt_pp::_parse(int argc, char* argv[]) { OptionData* currentData = NULL; _app_name = argv[0]; // parse arguments by their '-' or '--': // (this will be a state machine soon) for(int i=1; i < argc; i++) { const char current = argv[i][0]; const char next = argv[i][1]; if (current == '-' && (isalpha(next) || next == '-' ) ) { // see what's next, differentiate whether it's short or long: if (next == '-' && argv[i][2] != 0) { // long option currentData = &_longOps[&argv[i][2]]; } else { // short option // iterate over all of them, keeping the last one in currentData // (so the intermediates will generate 'existent' arguments, as of '-abc') size_t j=1; do { currentData = &_shortOps[argv[i][j]]; j++; } while (argv[i][j] != 0); } } else { // save value! if (currentData == NULL) currentData = &_shortOps[EMPTY_OPTION]; currentData->args.push_back(argv[i]); } } _last = _Option::OK; // TODO: IMPROVE!! } GETOPT_INLINE void GetOpt_pp::_parse_env() { // this will be optimized in version 3 std::string var_name; std::string var_value; size_t var=0; std::string::size_type pos; OptionData* data; while (environ[var] != NULL) { var_name = environ[var]; pos = var_name.find('='); if (pos != std::string::npos) { var_value = var_name.substr(pos+1); var_name = var_name.substr(0, pos); if (_longOps.find(var_name) == _longOps.end()) { data = &_longOps[var_name]; data->args.push_back(var_value); data->flags = OptionData::Envir; } } else (data = &_longOps[var_name])->flags = OptionData::Envir; var++; } } GETOPT_INLINE GetOpt_pp::GetOpt_pp(int argc, char* argv[]) : _exc(std::ios_base::goodbit) { _init_flags(); _parse(argc, argv); } GETOPT_INLINE GetOpt_pp::GetOpt_pp(int argc, char* argv[], _EnvTag) { _init_flags(); _parse(argc, argv); _parse_env(); } GETOPT_INLINE GetOpt_pp& GetOpt_pp::operator >> ( const _Option& opt) throw (GetOptEx) { if (_last != _Option::ParsingError) { _last = opt(_shortOps, _longOps, _flags); switch(_last) { case _Option::OK: break; case _Option::OptionNotFound: if (_exc & std::ios_base::eofbit ) throw OptionNotFoundEx(); break; case _Option::BadType: if (_exc & std::ios_base::failbit ) throw InvalidFormatEx(); break; case _Option::NoArgs: if (_exc & std::ios_base::eofbit ) throw ArgumentNotFoundEx(); break; case _Option::TooManyArgs: if (_exc & std::ios_base::failbit ) throw TooManyArgumentsEx(); break; case _Option::OptionNotFound_NoEx: break; // Ok, it will be read by casting to bool case _Option::ParsingError: break; // just to disable warning } } else if (_exc & std::ios_base::failbit ) throw ParsingErrorEx(); return *this; } GETOPT_INLINE GetOpt_pp& GetOpt_pp::operator >> ( std::ios_base& (*iomanip)(std::ios_base&)) { std::stringstream ss; ss.flags(_flags); _flags = (ss << iomanip).flags(); return *this; } GETOPT_INLINE bool GetOpt_pp::options_remain() const { bool remain = false; ShortOptions::const_iterator it = _shortOps.begin(); while (it != _shortOps.end() && !remain) { remain = (it->second.flags == OptionData::CmdLine_NotExtracted); ++it; } if (!remain) { LongOptions::const_iterator it2 = _longOps.begin(); while (it2 != _longOps.end() && !remain) { remain = (it2->second.flags == OptionData::CmdLine_NotExtracted); ++it; } } return remain; } } // namespace GetOpt hhsuite-2.0.16/src/cs/alignment.h0000664172256617226630000002017312110430072021103 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_ALIGNMENT_H_ #define CS_ALIGNMENT_H_ #include #include "blast_hits.h" #include "sequence.h" namespace cs { // Forward declarations template class Alignment; // Convince the compiler that operator<< is a template friend. template std::ostream& operator<< (std::ostream& out, const Alignment& ali); // Supported alignment formats for in- and output. enum AlignmentFormat { FASTA_ALIGNMENT = 0, A2M_ALIGNMENT = 1, A3M_ALIGNMENT = 2, CLUSTAL_ALIGNMENT = 3, PSI_ALIGNMENT = 4 }; // A container class for multiple sequence alignments. template class Alignment { public: // Constructs alignment from multi FASTA formatted alignment read from input // stream. Alignment(FILE* fin, AlignmentFormat format); // Constructs an all-gaps alignment with 'ncols' columns and 'nseqs' sequences Alignment(size_t ncols, size_t nseqs); // Constructs an alignment from a single sequence. Alignment(const Sequence& seq); // Constructs a query anchored alignment from BLAST hits. If flag best is set // to true only the best HSP of each hit is included in the alignment. Alignment(const BlastHits& hits, bool best = false); // All memeber are automatically destructed ~Alignment() {} // Accessors for integer representation of character in MATCH column i of // sequence k. uint8_t* operator[](size_t i) { return seqs_[match_idx_[i]]; } const uint8_t* operator[](size_t i) const { return seqs_[match_idx_[i]]; } uint8_t& match(size_t i, size_t k) { return seqs_[match_idx_[i]][k]; } const uint8_t& match(size_t i, size_t k) const { return seqs_[match_idx_[i]][k]; } // Accessors for integer representation of the character at position i // (NOT match column i) of sequence k. uint8_t& operator() (size_t k, size_t i) { return seqs_[i][k]; } const uint8_t& operator() (size_t k, size_t i) const { return seqs_[i][k]; } uint8_t& seq(size_t k, size_t i) { return seqs_[i][k]; } const uint8_t& seq(size_t k, size_t i) const { return seqs_[i][k]; } // Returns the character at position i (NOT match column i) of sequence k. char chr(size_t k, size_t i) const { return Abc::kIntToChar[seqs_[i][k]]; } // Returns index of all-alignment column corresponding to match column i. size_t col_idx(size_t i) const { return match_idx_[i]; } // Returns the number of sequences in the alignment. size_t nseqs() const { return seqs_.ncols(); } // Returns the total number of alignment columns. size_t ncols() const { return seqs_.nrows(); } // Returns the number of match columns. size_t nmatch() const { return match_idx_.size(); } // Returns the number of insert columns. int ninsert() const { return ncols() - nmatch(); } // Returns the header of sequence k. std::string header(size_t k) const { return headers_[k]; } // Sets the header of sequence k. void set_header(size_t k, const std::string& header) { headers_[k] = header; } // Returns the name of the alignment std::string name() const { return name_; } // Sets the name of the alignment void set_name(const std::string& header) { name_ = name; } // Makes all columns with a residue in sequence k match columns. void AssignMatchColumnsBySequence(size_t k = 0); // Makes all columns with less than X% gaps match columns. void AssignMatchColumnsByGapRule(double gap_threshold = 50); // Initializes object with an alignment in FASTA format read from given // stream. void Read(FILE* fin, AlignmentFormat format); // Writes the alignment in given format to ouput stream. void Write(FILE* fout, AlignmentFormat format, size_t width = 100) const; // Returns true if column i is a match column. bool is_match(size_t i) const { return is_match_[i]; } // Removes all insert columns from the alignment. void RemoveInsertColumns(); // Merges the provided alignment with this alignment considering only sequences // that are not already included in this alignment. Warning: Inserts in current // alignment are lost! void Merge(const Alignment& ali); // Returns alignment sequence k as Sequence object without gaps. Sequence GetSequence(size_t k) const; // Rearranges the aligned sequences such that they appear in the same order as // their unaligned counterparts in the given sequence vector. void Rearrange(const std::vector >& seqs); // Prints the Alignment in A2M format for debugging. friend std::ostream& operator<< <> (std::ostream& out, const Alignment& ali); private: // Buffer size for reading static const size_t kBufferSize = MB; // Initializes alignment with given headers and sequences. void Init(const std::vector& headers, const std::vector& seqs); // Resize the sequence matrix and header vector to given dimensions. void Resize(size_t num_seqs, size_t num_cols); // Fills match_idx__ with the indices of all match columns. void SetMatchIndices(); // Reads an alignment in FASTA format. void ReadFasta(FILE* fin, std::vector& headers, std::vector& seqs); // Reads an alignment in A2M format from given stream. void ReadA2M(FILE* fin, std::vector& headers, std::vector& seqs); // Reads an alignment in A3M format from given stream. void ReadA3M(FILE* fin, std::vector& headers, std::vector& seqs); // Helper method that reads a FASTA, A2M, or A3M formatted alignment. void ReadFastaFlavors(FILE* fin, std::vector& headers, std::vector& seqs); // Reads an alignment in PSI format. void ReadPsi(FILE* fin, std::vector& headers, std::vector& seqs); // Writes the alignment in FASTA, A2M, or A3M format to output stream. void WriteFastaFlavors(FILE* fout, AlignmentFormat format, size_t width = 100) const; // Writes the alignment in CLUSTAL or PSI format to output stream. void WriteClustalFlavors(FILE* fout, AlignmentFormat format, size_t width = 100) const; // Row major matrix with sequences in integer representation. Matrix seqs_; // Array with indices of all columns [0,1,2,...,num_cols-1]. std::valarray col_idx_; // Array with indices of match columns. std::valarray match_idx_; // Array mask indicating match and insert columns. std::valarray is_match_; // Headers of sequences in the alignment. std::vector headers_; // Name of the alignment as given by comment line in FASTA file std::string name_; }; // Alignment // Returns the alignment format corresponding to provided filename extension inline AlignmentFormat AlignmentFormatFromString(const std::string& s); // Reads all available alignments from the input stream and puts them into vector. template static void ReadAll(FILE* fin, AlignmentFormat format, std::vector< Alignment >& v); // Calculates global sequence weights by maximum entropy weighting // (Henikoff&Henikoff '94). template double GlobalWeightsAndDiversity(const Alignment& ali, Vector& wg, bool neff_sum_pairs = false); // Calculates position-dependent sequence weights and number of effective // sequences on subalignments. template Vector PositionSpecificWeightsAndDiversity(const Alignment& ali, Matrix& w); // Converts a character to uppercase and '.' to '-'. inline char to_match_chr(char c) { return isalpha(c) ? toupper(c) : (c == '.' ? '-' : c); } // Converts a character to lowercase and '-' to '.'. inline char to_insert_chr(char c) { return isalpha(c) ? tolower(c) : (c == '-' ? '.' : c); } // Predicate indicating if character belongs to match column. inline bool match_chr(char c) { return (isalpha(c) && isupper(c)) || c == '-'; } // Predicate indicating if character belongs to insert column. inline char insert_chr(char c) { return (isalpha(c) && islower(c)) || c == '.'; } } // namespace cs #endif // CS_ALIGNMENT_H_ hhsuite-2.0.16/src/cs/profile.h0000664172256617226630000000300212110430072020555 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_PROFILE_H_ #define CS_PROFILE_H_ namespace cs { // A simple container class acting pretty much like a matrix but with column size // fixed to Abc::kSizeAny template class Profile { public: Profile(); explicit Profile(size_t n); Profile(size_t n, const double &a); Profile(size_t n, const double *a); Profile(const Profile &rhs); ~Profile(); Profile & operator=(const Profile &rhs); double* operator[](const size_t i); const double* operator[](const size_t i) const; size_t length() const { return nn; } void Resize(size_t newn); void Assign(size_t newn, const double &a); private: size_t nn; double **v; }; // Assigns given constant value or default to all entries in matrix template void Assign(Profile& p, double val = 0.0); // Normalizes all profile columns to fixed value. Iff 'incl_any' is true, // normalization also includes values for ANY letter template void Normalize(Profile& p, double val, bool incl_any = false); // Normalizes all profile columns to corresponding value in vector 'norm'. // Iff 'incl_any' is true, normalization also includes values for ANY letter. template void Normalize(Profile& p, const Vector& norm, bool incl_any = false); // Prints profile in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const Profile& p); } // namespace cs #endif // CS_PROFILE_H_ hhsuite-2.0.16/src/cs/assert_helpers.cc0000664172256617226630000000067012110430072022306 0ustar hauserscientific_computing#include #include #include #include "cs.h" // Prints a fatal error message and ends the program. extern "C" void CS_Fatal(const char* file, int line, const char* format, ...) { fprintf(stderr, "\n\n#\n# Fatal error in %s, line %d\n# ", file, line); va_list arguments; va_start(arguments, format); vfprintf(stderr, format, arguments); va_end(arguments); fprintf(stderr, "\n#\n\n"); abort(); } hhsuite-2.0.16/src/cs/application.cc0000664172256617226630000000443612110430072021572 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "cs.h" #include "application.h" #include "getopt_pp.h" using std::string; namespace cs { Application* Application::instance_; const char* Application::kVersionNumber = "2.1.2"; const char* Application::kCopyright = "Copyright (c) 2010 Andreas Biegert, Johannes Soding, and LMU Munich"; Application::Application() : log_level_(Log::to_string(Log::from_int(LOG_MAX_LEVEL))), log_fp_(stderr) { // Register the application instance if (instance_) throw Exception("Second instance of Application is prohibited"); instance_ = this; } Application::~Application() { if (log_fp_ && log_fp_ != stderr) fclose(log_fp_); } int Application::main(int argc, char* argv[], FILE* fout, const string& name) { int status = 0; out_ = fout; app_name_ = name; log_file_ = "stderr"; // Prepare command line parsing GetOpt_pp options(argc, argv, Include_Environment); options.exceptions_all(); try { // Print usage? if (argc < 2 || argv[1][0] == '?' || options >> OptionPresent(' ', std::string("help"))) { PrintHelp(); return 1; } #ifdef LOGGING // Process logging options options >> Option(' ', "loglevel", log_level_, log_level_); Log::reporting_level() = Log::from_string(log_level_); options >> Option(' ', "logfile", log_file_, log_file_); if (log_file_.empty() || log_file_ == "stderr") log_fp_ = stderr; else log_fp_ = fopen(log_file_.c_str(), "w"); Log::stream() = log_fp_; #endif // Let subclasses parse the command line options ParseOptions(options); // Run application status = Run(); } catch(const std::exception& e) { LOG(ERROR) << e.what(); fprintf(fout, "\n%s\n", e.what()); return 1; } return status; } void Application::PrintHelp() const { fprintf(out_, "%s version %s\n", app_name_.c_str(), kVersionNumber); PrintBanner(); fprintf(out_, "%s\n\n", kCopyright); PrintUsage(); fputs("\nOptions:\n", out_); PrintOptions(); #ifdef LOGGING fprintf(out_, " %-30s %s (def=%s)\n", " --loglevel ", "Maximal reporting level for logging", log_level_.c_str()); fprintf(out_, " %-30s %s (def=%s)\n", " --logfile ", "Output file for logging", log_file_.c_str()); #endif } } // namespace cs hhsuite-2.0.16/src/cs/utils.h0000664172256617226630000003575312110430072020277 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert // Collection of commonly used inline utility functions. #ifndef CS_UTILS_H_ #define CS_UTILS_H_ #include #include #include #include #include namespace cs { // Macro-like inline functions template inline T SQR(const T a) { return a*a; } template inline const T& MAX(const T &a, const T &b) { return b > a ? (b) : (a); } inline float MAX(const double &a, const float &b) { return b > a ? (b) : float(a); } inline float MAX(const float &a, const double &b) { return b > a ? float(b) : (a); } template inline const T& MIN(const T &a, const T &b) { return b < a ? (b) : (a); } inline float MIN(const double &a, const float &b) { return b < a ? (b) : float(a); } inline float MIN(const float &a, const double &b) { return b < a ? float(b) : (a); } template inline T SIGN(const T &a, const T &b) { return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a); } inline float SIGN(const float &a, const double &b) { return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a); } inline float SIGN(const double &a, const float &b) { return (float)(b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a)); } template inline void SWAP(T &a, T &b) { T dum=a; a=b; b=dum; } inline bool isnan(double x) { return x != x; } inline bool isnan(float x) { return x != x; } // Returns the base 2 logarithm of x. inline float log2(float x) { return 1.442695041f * log(x); } // Returns the base 2 logarithm of x. inline double log2(double x) { return 1.442695041 * log(x); } // Round to the nearest integer. inline int iround(double x) { return static_cast(floor(x + 0.5)); } // This function returns log2 with a max abolute deviation of +/- 1.5E-5 // It takes 1.42E-8 s whereas log2(x) takes 9.5E-7 s. It is hence 9.4 times faster. // It makes use of the representation of 4-byte floating point numbers: // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // s is the sign, // the following 8 bits, eee eee e, give the exponent + 127 (in hex: 0x7f). // The following 23 bits, m, give the mantisse, the binary digits behind the // decimal point. // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) // The expression (((*(int *)&x) & 0x7f800000 ) >>23 )-0x7f is the exponent eeeeeeee, // i.e. the largest integer that is smaller than log2(x) (e.g. -1 for 0.9). *(int *)&x // is an integer which // contains the bytes as the floating point variable x is represented in memory. // Check: assert( sizeof(f) == sizeof(int) ); // Check: assert( sizeof(f) == 4 ); inline float fast_log2(float x) { if (x <= 0.0f) return log2(x); static float lg2[1025]; // lg2[i] = log2[1+x/1024] static float diff[1025]; // diff[i]= (lg2[i+1]-lg2[i])/8096 (for interpolation) static bool initialized = false; if (!initialized) { float prev = 0.0f; lg2[0] = 0.0f; for (int i = 1; i <= 1024; ++i) { lg2[i] = log(float(1024+i))*1.442695041-10.0f; diff[i-1] = (lg2[i]-prev)*1.2352E-4; prev = lg2[i]; } initialized=true; } int a = (((*((int *)&x)) & 0x7F800000) >>23 )-0x7f; int b = ((*((int *)&x)) & 0x007FE000) >>13; int c = ((*((int *)&x)) & 0x00001FFF); return a + lg2[b] + diff[b]*(float)(c); } // Fast 2^x // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // Relative deviation < 2.3E-7 // Speed: 2.3E-8s per call! (exp(): 8.5E-8, pow(): 1.7E-7) // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) inline float fast_pow2(float x) { if (x == -INFINITY || x > FLT_MAX_EXP || x < FLT_MIN_EXP) return pow(2.0f, x); // store address of float as pointer to long int *px = (int*)(&x); // temporary value for truncation: x-0.5 is added to a large integer (3<<22) float tx = (x-0.5f) + (3<<22); int lx = *((int*)&tx) - 0x4b400000; // integer value of x float dx = x-(float)(lx); // float remainder of x x = 1.0f + dx*(0.693153f // polynomial apporoximation of 2^x + dx*(0.240153f // for x in the range [0, 1] + dx*(0.0558282f + dx*(0.00898898f + dx* 0.00187682f )))); *px += (lx<<23); // add integer power of 2 to exponent return x; } // ///////////////////////////////////////////////////////////////////////////////////// // // fast 2^x // // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // // Relative deviation < ?? (< 2.3E-7 with 5'th order polynomial) // // Speed: ???E-8s (??E-8s) per call! // // Internal representation of double number according to IEEE 754: // // 1bit sign, 11 bits exponent, 52 bits mantissa: seee eeee eeee mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm // // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm... * 2^(eeeeeeeeee-1023) // ///////////////////////////////////////////////////////////////////////////////////// // inline double fast_pow2(double x) { // if (x == -INFINITY || x > DBL_MAX_EXP || x < DBL_MIN_EXP) // return pow(2.0, x); // uint64_t *px = (uint64_t*)(&x); // store address of float as pointer to long int // double tx = (x - 0.5) + (static_cast(3) << 51); // temporary value for truncation: x-0.5 is added to a large integer (3<<51) // // 3<<51 = (1.1bin)*252 = (1.1bin)*2^(1075-1023) // // which, in internal bits, is written 0x4338000000000000 (since 0100 0011 0011 bin = 1075) // const uint64_t kTMP = (static_cast(0x43380000) << 32) | 0x00000000; // uint64_t lx = *((uint64_t*)&tx) - kTMP; // integer value of x // // uint64_t lx = *((uint64_t*)&tx) - 0x4338000000000000ull; // integer value of x // double dx = x-(double)(lx); // float remainder of x // // x = 1.0f + dx*(0.693019d // polynomial apporoximation of 2^x // // + dx*(0.241404d // for x in the range [0, 1] // // + dx*(0.0520749d // // + dx* 0.0134929d ))); // x = 1.0 + dx*(0.693153 // polynomial apporoximation of 2^x // + dx*(0.240153 // for x in the range [0, 1] // + dx*(0.0558282 // + dx*(0.00898898 // + dx* 0.00187682 )))); // *px += ((static_cast(lx) << 32) | 0x00000000); // // *px += (static_cast(lx) << 52); // add integer power of 2 to exponent // return x; // } // Fast 2^x // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // Relative deviation < 2.3E-7 // Speed: 2.3E-8s per call! (exp(): 8.5E-8, pow(): 1.7E-7) // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) inline double fast_pow2(double d) { if (d == -INFINITY || d > FLT_MAX_EXP || d < FLT_MIN_EXP) return pow(2.0, d); float x = d; // store address of float as pointer to long int *px = (int*)(&x); // temporary value for truncation: x-0.5 is added to a large integer (3<<22) float tx = (x-0.5f) + (3<<22); int lx = *((int*)&tx) - 0x4b400000; // integer value of x float dx = x-(float)(lx); // float remainder of x x = 1.0f + dx*(0.693153f // polynomial apporoximation of 2^x + dx*(0.240153f // for x in the range [0, 1] + dx*(0.0558282f + dx*(0.00898898f + dx* 0.00187682f )))); *px += (lx<<23); // add integer power of 2 to exponent return x; } // Fast 2^x // ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! // Relative deviation < 2.3E-7 // Speed: 2.3E-8s per call! (exp(): 8.5E-8, pow(): 1.7E-7) // seee eeee emmm mmmm mmmm mmmm mmmm mmmm // In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) // inline double fast_pow2(double d) { // if (d == -INFINITY || d > DBL_MAX_EXP || d < DBL_MIN_EXP) // return pow(2.0, d); // double y = 1.0; // while (d > FLT_MAX_EXP) { // d -= FLT_MAX_EXP; // y *= FLT_MAX; // } // while (d < FLT_MIN_EXP) { // d += FLT_MAX_EXP; // y /= FLT_MAX; // } // float x = d; // // store address of float as pointer to long // int *px = (int*)(&x); // // temporary value for truncation: x-0.5 is added to a large integer (3<<22) // float tx = (x-0.5f) + (3<<22); // int lx = *((int*)&tx) - 0x4b400000; // integer value of x // float dx = x-(float)(lx); // float remainder of x // x = 1.0f + dx*(0.693153f // polynomial apporoximation of 2^x // + dx*(0.240153f // for x in the range [0, 1] // + dx*(0.0558282f // + dx*(0.00898898f // + dx* 0.00187682f )))); // *px += (lx<<23); // add integer power of 2 to exponent // return y * x; // } // Calculate relative difference between current and previous likelihood. inline double RelDiff(double logp, double logp_prev) { return (logp - logp_prev) / MAX(fabs(logp), fabs(logp_prev)); } // Normalize a float array such that it sums to one. If it sums to 0 then assign // def_array elements to array (optional) inline float Normalize(float* array, size_t length, const float* default_array = NULL) { float sum = 0.0f; for (size_t i = 0; i < length; ++i) sum += array[i]; if (sum != 0.0f) { float fac = 1.0f / sum; for (size_t i = 0; i < length; ++i) array[i] *= fac; } else if (default_array) { for (size_t i = 0; i < length; ++i) array[i] = default_array[i]; } return sum; } // Normalize a double array such that it sums to one. If it sums to 0 then assign // def_array elements to array (optional) inline double Normalize(double* array, size_t length, const double* default_array = NULL) { double sum = 0.0; for (size_t i = 0; i < length; ++i) sum += array[i]; if (sum != 0.0) { double fac = 1.0 / sum; for (size_t i = 0; i < length; ++i) array[i] *= fac; } else if (default_array) { for (size_t i = 0; i < length; ++i) array[i] = default_array[i]; } return sum; } // Reset all entries in a float array to given value or zero if none provided. inline void Reset(float* array, size_t length) { for (size_t i = 0; i < length; ++i) array[i] = 0.0f; } // Reset all entries in a double array to given value or zero if none provided. inline void Reset(double* array, size_t length) { for (size_t i = 0; i < length; ++i) array[i] = 0.0; } // Set all entries in a float array to given value inline void Assign(float* array, size_t length, float value) { for (size_t i = 0; i < length; ++i) array[i] = value; } // Set all entries in a double array to given value inline void Assign(double* array, size_t length, double value) { for (size_t i = 0; i < length; ++i) array[i] = value; } // Gets a good random seed from /dev/random inline unsigned int GetRandomSeed() { unsigned int seed; struct timeval tv; FILE *devrandom; if ((devrandom = fopen("/dev/urandom","r")) != NULL && fread(&seed, sizeof(seed), 1, devrandom) == 1) { fclose(devrandom); } else { gettimeofday(&tv,0); seed = tv.tv_sec + tv.tv_usec; } return(seed); } // Splits a string into multiple strings with character delimiter removed. static inline void Tokenize(const std::string& s, const std::string& delims, std::vector* ss, size_t max = 9999) { std::string::size_type lastPos = s.find_first_not_of(delims, 0); std::string::size_type pos = s.find_first_of(delims, lastPos); while (std::string::npos != pos || std::string::npos != lastPos) { ss->push_back(s.substr(lastPos, pos - lastPos)); lastPos = s.find_first_not_of(delims, pos); pos = s.find_first_of(delims, lastPos); if(ss->size() == (max - 1)) { pos = std::string::npos; } } } // Splits a string into multiple strings with character delimiter removed. static inline void Tokenize(const std::string& s, char c, std::vector* v) { std::string::size_type i = 0; std::string::size_type j = s.find(c); while (j != std::string::npos) { v->push_back(s.substr(i, j-i)); i = ++j; j = s.find(c, j); if (j == std::string::npos) v->push_back(s.substr(i, s.length())); } } // Stringifies the range elemeents delimited by given character. template inline std::string StringifyRange(Fwd first, Fwd last, char delim = ',') { std::ostringstream out; out << "{"; while (first != last) { out << *first; if (++first != last) out << delim << ' '; } out << "}"; return out.str(); } // Stringifies the provided container delimited by given character. template inline std::string StringifyContainer(const C& c, char delim = ',') { return StringifyRange(c.begin(), c.end(), delim); } // sprintf-like helper that returns a string. inline std::string strprintf(const char* str, ...) { char *buffer = new char[1000]; va_list ap; va_start(ap, str); vsprintf(buffer, str, ap); va_end(ap); std::string rv(buffer); delete [] buffer; return rv; } // Returns true if given file name is a regular file inline bool IsRegularFile(const std::string& filepath) { bool ret = false; struct stat fstats; if (stat(filepath.c_str(), &fstats ) == 0) if (S_ISREG(fstats.st_mode)) ret=true; return ret; } // Returns true if given file name is a directory inline bool IsDirectory(const std::string& filepath) { bool ret = false; struct stat fstats; if (stat(filepath.c_str(), &fstats) == 0) if (S_ISDIR(fstats.st_mode)) ret = true; return ret; } // Returns the file extension of the given file name. inline std::string GetFileExt(const std::string& s) { size_t i = s.rfind('.', s.length()); if (i != std::string::npos) { return(s.substr(i+1, s.length() - i)); } return ""; } // Returns the last component of the filename. If ext is false // the file extension is removed. inline std::string GetBasename(const std::string& s, bool ext = true) { size_t i = s.rfind(kDirSep, s.length()); if (i != std::string::npos) { if (ext) return(s.substr(i+1, s.length() - i)); size_t j = s.rfind('.', s.length()); if (j != std::string::npos && j > i) return (s.substr(i + 1, j - i - 1)); else return (s.substr(i + 1, s.length() - i)); } else if (!ext) { size_t j = s.rfind('.', s.length()); if (j != std::string::npos) return(s.substr(0, j)); else return s; } return s; } // Returns all components of the filename except the last one. inline std::string GetDirname(const std::string& s) { size_t i = s.rfind(kDirSep, s.length( )); if (i != std::string::npos) { return(s.substr(0, i)); } return ""; } // Reads all files in 'path' and pushes them onto given vector. void GetAllFiles(const std::string& path, std::vector& files, const std::string& ext = ""); } // namespace cs #endif // CS_UTILS_H_ hhsuite-2.0.16/src/cs/matrix.h0000664172256617226630000002112712110430072020431 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_MATRIX_H_ #define CS_MATRIX_H_ #include "stride_iter.h" #include #include #include using std::valarray; template class matrix { public: // public typedefs typedef T value_type; typedef matrix self; typedef value_type* iterator; typedef const value_type* const_iterator; typedef value_type* row_type; typedef stride_iter col_type; typedef const value_type* const_row_type; typedef stride_iter const_col_type; // constructors matrix() : num_rows_(0), num_cols_(0), m_() {} matrix(int r, int c) : num_rows_(r), num_cols_(c), m_(r * c) {} matrix(const self& x) : num_rows_(x.num_rows_), num_cols_(x.num_cols_), m_(x.m_) {} matrix(int r, int c, const T& val) : num_rows_(r), num_cols_(c), m_(r * c) { for (int i = 0; i < r * c; ++i) m_[i] = val; } template explicit matrix(const valarray& x) : num_rows_(x.size()), num_cols_(1), m_(x.size()) { for (int i =0 ; i < x.size(); ++i) m_[i] = x[i]; } // allow construction from matricies of other types template explicit matrix(const matrix& x) : num_rows_(x.num_rows_), num_cols_(x.num_cols_), m_(x.size()) { copy(x.begin(), x.end(), m_.begin()); } // public functions int num_rows() const { return num_rows_; } int num_cols() const { return num_cols_; } int size() const { return num_rows_ * num_cols_; } // element access row_type row_begin(int n) { return &m_[n * num_cols()]; } row_type row_end(int n) { return row_begin(n) + num_cols(); } col_type col_begin(int n) { return col_type(&m_[n], num_cols()); } col_type col_end(int n) { return col_begin(n) + num_cols(); } const_row_type row_begin(int n) const { return &m_[n * num_cols()]; } const_row_type row_end(int n) const { return row_begin(n) + num_cols(); } const_col_type col_begin(int n) const { return const_col_type(&m_[n], num_cols()); } const_col_type col_end(int n) const { return col_begin(n) + num_cols(); } iterator begin() { return &m_[0]; } iterator end() { return begin() + size(); } const_iterator begin() const { return &m_[0]; } const_iterator end() const { return begin() + size(); } void resize(int r, int c, T v = T()) { m_.resize(r * c, v); num_rows_ = r; num_cols_ = c; } // operators self& operator=(const self& x) { m_.resize(x.size()); m_ = x.m_; num_rows_ = x.num_rows_; num_cols_ = x.num_cols_; return *this; } self& operator=(value_type x) { m_ = x; return *this; } row_type operator[](int n) { return row_begin(n); } const_row_type operator[](int n) const { return row_begin(n); } self& operator+=(const self& x) { m_ += x.m_; return *this; } self& operator-=(const self& x) { m_ -= x.m_; return *this; } self& operator+=(value_type x) { m_ += x; return *this; } self& operator-=(value_type x) { m_ -= x; return *this; } self& operator*=(value_type x) { m_ *= x; return *this; } self& operator/=(value_type x) { m_ /= x; return *this; } self& operator%=(value_type x) { m_ %= x; return *this; } self operator-( ) { return -m_; } self operator+( ) { return +m_; } self operator!( ) { return !m_; } self operator~( ) { return ~m_; } // friend operators friend self operator+(const self& x, const self& y) { return self(x) += y; } friend self operator-(const self& x, const self& y) { return self(x) -= y; } friend self operator+(const self& x, value_type y) { return self(x) += y; } friend self operator-(const self& x, value_type y) { return self(x) -= y; } friend self operator*(const self& x, value_type y) { return self(x) *= y; } friend self operator/(const self& x, value_type y) { return self(x) /= y; } friend self operator%(const self& x, value_type y) { return self(x) %= y; } private: int num_rows_; int num_cols_; mutable valarray m_; }; // Resets all entries in matrix to the provided value or default if none given. template inline void Reset(matrix* m, T value = T()) { const int num_rows = m->num_rows(); const int num_cols = m->num_cols(); for (int i = 0; i < num_rows; ++i) for (int j = 0; j < num_cols; ++j) (*m)[i][j] = value; } template class Matrix { public: typedef T value_type; Matrix(); Matrix(size_t n, size_t m); Matrix(size_t n, size_t m, const T &a); Matrix(size_t n, size_t m, const T *a); Matrix(const Matrix &rhs); ~Matrix(); Matrix & operator=(const Matrix &rhs); T* operator[](const size_t i); const T* operator[](const size_t i) const; size_t nrows() const; size_t ncols() const; void Resize(size_t newn, size_t newm); void Assign(size_t newn, size_t newm, const T &a); T* begin() { return v; } const T* begin() const { return v; } private: size_t nn; size_t mm; T **v; }; template Matrix::Matrix() : nn(0), mm(0), v(NULL) {} template Matrix::Matrix(size_t n, size_t m) : nn(n), mm(m), v(n>0 ? new T*[n] : NULL) { size_t i,nel=m*n; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1;i Matrix::Matrix(size_t n, size_t m, const T &a) : nn(n), mm(m), v(n>0 ? new T*[n] : NULL) { size_t i,j,nel=m*n; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< n; i++) v[i] = v[i-1] + m; for (i=0; i< n; i++) for (j=0; j Matrix::Matrix(size_t n, size_t m, const T *a) : nn(n), mm(m), v(n>0 ? new T*[n] : NULL) { size_t i,j,nel=m*n; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< n; i++) v[i] = v[i-1] + m; for (i=0; i< n; i++) for (j=0; j Matrix::Matrix(const Matrix &rhs) : nn(rhs.nn), mm(rhs.mm), v(nn>0 ? new T*[nn] : NULL) { size_t i,j,nel=mm*nn; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + mm; for (i=0; i< nn; i++) for (j=0; j Matrix & Matrix::operator=(const Matrix &rhs) { if (this != &rhs) { size_t i,j,nel; if (nn != rhs.nn || mm != rhs.mm) { if (v != NULL) { delete[] (v[0]); delete[] (v); } nn=rhs.nn; mm=rhs.mm; v = nn>0 ? new T*[nn] : NULL; nel = mm*nn; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + mm; } for (i=0; i< nn; i++) for (j=0; j inline T* Matrix::operator[](const size_t i) { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Matrix subscript out of bounds"); } #endif return v[i]; } template inline const T* Matrix::operator[](const size_t i) const { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Excpetion("Matrix subscript out of bounds"); } #endif return v[i]; } template inline size_t Matrix::nrows() const { return nn; } template inline size_t Matrix::ncols() const { return mm; } template void Matrix::Resize(size_t newn, size_t newm) { size_t i,nel; if (newn != nn || newm != mm) { if (v != NULL) { delete[] (v[0]); delete[] (v); } nn = newn; mm = newm; v = nn>0 ? new T*[nn] : NULL; nel = mm*nn; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + mm; } } template void Matrix::Assign(size_t newn, size_t newm, const T& a) { size_t i,j,nel; if (newn != nn || newm != mm) { if (v != NULL) { delete[] (v[0]); delete[] (v); } nn = newn; mm = newm; v = nn>0 ? new T*[nn] : NULL; nel = mm*nn; if (v) v[0] = nel>0 ? new T[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + mm; } for (i=0; i< nn; i++) for (j=0; j Matrix::~Matrix() { if (v != NULL) { delete[] (v[0]); delete[] (v); } } // Assigns given constant value or default to all entries in matrix template inline void Assign(Matrix& m, T val = T()) { for (size_t i = 0; i < m.nrows(); ++i) for (size_t j = 0; j < m.ncols(); ++j) m[i][j] = val; } // Prints profile in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const Matrix& m) { out << "Matrix" << std::endl; for (size_t j = 0; j < m.ncols(); ++j) out << "\t" << j; out << std::endl; for (size_t i = 0; i < m.nrows(); ++i) { out << i; for (size_t j = 0; j < m.ncols(); ++j) out << "\t" << std::setprecision(4) << m[i][j]; out << std::endl; } return out; } #endif // CS_MATRIX_H_ hhsuite-2.0.16/src/cs/sequence-inl.h0000664172256617226630000001040212110430072021507 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SEQUENCE_INL_H_ #define CS_SEQUENCE_INL_H_ #include "sequence.h" namespace cs { template Sequence::Sequence(size_t length) : length_(length), seq_(length_ > 0 ? new value_type[length_] : NULL) {} template Sequence::Sequence(FILE* in) : length_(0), seq_(NULL) { Read(in); } template Sequence::Sequence(const std::string& sequence, const std::string& header) : length_(0), seq_(NULL) { Init(sequence, header); } template Sequence::Sequence(const Sequence& other) : length_(other.length_), seq_(length_ > 0 ? new value_type[length_] : NULL), header_(other.header_) { for (size_t i = 0; i < length_; ++i) seq_[i] = other[i]; } template Sequence::Sequence(const Sequence& other, size_t idx, size_t len) : length_(len), seq_(len > 0 ? new value_type[len] : NULL), header_(other.header_) { for (size_t i = 0; i < length_; ++i) seq_[i] = other[idx + i]; } template Sequence& Sequence::operator= (const Sequence& rhs) { if (this == &rhs) return *this; // handle self assignment delete[] seq_; length_ = rhs.length_; if (length_ > 0) { seq_ = new value_type[length_]; for (size_t i = 0; i < length_; ++i) seq_[i] = rhs[i]; } else { seq_ = NULL; } header_ = rhs.header_; return *this; } template void Sequence::Init(std::string sequence, std::string header) { assert(seq_ == NULL); // Init header using swap trick to trim excess capacity std::string(header).swap(header_); // Strip whitespace and newlines from sequence. sequence.erase(remove_if(sequence.begin(), sequence.end(), isspace), sequence.end()); // Strip gap characters from sequence. sequence.erase(remove_if(sequence.begin(), sequence.end(), isgap), sequence.end()); // First validate each character before copying const size_t seqlen = sequence.length(); for (size_t i = 0; i < seqlen; ++i) { if (!Abc::kValidChar[static_cast(sequence[i])]) throw Exception("Invalid character with ASCII number %i at position %zu of sequence '%s'", static_cast(sequence[i]), i, header_.c_str()); } // Copy character sequence in packed format into sequence array length_ = seqlen; seq_ = new value_type[length_]; for (size_t i = 0; i < seqlen; ++i) seq_[i] = Abc::kCharToInt[static_cast(sequence[i])]; } template void Sequence::Read(FILE* fin) { delete [] seq_; const size_t kBuffSize = MB; char buffer[kBuffSize]; int c = '\0'; std::string header; std::string sequence; // Read header while (fgetline(buffer, kBuffSize, fin)) { if (!strscn(buffer)) continue; if (buffer[0] == '>') { header.append(buffer + 1); break; } else { throw Exception("Sequence header does not start with '>'!"); } } // Read sequence and stop if either a new header or delimiter is found while (fgetline(buffer, kBuffSize, fin) && buffer[0] != '/' && buffer[1] != '/') { if (strscn(buffer)) sequence.append(buffer); c = getc(fin); if (c == EOF) break; ungetc(c, fin); if (static_cast(c) == '>') break; } Init(sequence, header); } template void Sequence::Write(FILE* fout, size_t width) const { fprintf(fout, ">%s\n", header_.c_str()); for (size_t i = 0; i < length(); ++i) { // fprintf(stdout, "%i\n", chr(i)); fputc(chr(i), fout); if ((i+1) % width == 0) fputc('\n', fout); } if (length() % width != 0) fputc('\n', fout); } template std::string Sequence::ToString() const { std::string s(length_, '\0'); for (size_t i = 0; i < length_; ++i) s[i] = Abc::kIntToChar[seq_[i]]; return s; } template void Sequence::Resize(size_t newlen) { if (newlen != length_) { if (seq_ != NULL) delete[] seq_; length_ = newlen; seq_ = length_ > 0 ? new value_type[length_] : NULL; } } } // namespace cs #endif // CS_SEQUENCE_INL_H_ hhsuite-2.0.16/src/cs/library_pseudocounts-inl.h0000664172256617226630000000631512110430072024166 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_ #define CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_ #include "library_pseudocounts.h" namespace cs { template LibraryPseudocounts::LibraryPseudocounts(const ContextLibrary& lib, double weight_center, double weight_decay) : lib_(lib), emission_(lib.wlen(), weight_center, weight_decay) {} template void LibraryPseudocounts::AddToSequence(const Sequence& seq, const Admix& pca, Profile& p) const { assert_eq(seq.length(), p.length()); LOG(INFO) << "Adding library pseudocounts to sequence ..."; const double tau = pca(1.0); // effective number of sequences is one Matrix pp(seq.length(), lib_.size(), 0.0); // posterior probabilities Vector pc(Abc::kSize); // pseudocount vector P(a|X_i) // Calculate and add pseudocounts for each sequence window X_i separately for (size_t i = 0; i < seq.length(); ++i) { double* ppi = &pp[i][0]; // Calculate posterior probability of state k given sequence window around 'i' CalculatePosteriorProbs(lib_, emission_, seq, i, ppi); // Calculate pseudocount vector P(a|X_i) Assign(pc, 0.0); for (size_t k = 0; k < lib_.size(); ++k) for(size_t a = 0; a < Abc::kSize; ++a) pc[a] += ppi[k] * lib_[k].pc[a]; // FIXME: is normalization here really needed? Normalize(&pc[0], Abc::kSize); // Add pseudocounts to sequence for(size_t a = 0; a < Abc::kSize; ++a) p[i][a] = (1.0 - tau) * (seq[i] == a ? 1.0 : 0.0) + tau * pc[a]; } } template void LibraryPseudocounts::AddToProfile(const CountProfile& cp, const Admix& pca, Profile& p) const { assert_eq(cp.counts.length(), p.length()); LOG(INFO) << "Adding library pseudocounts to profile ..."; Matrix pp(cp.counts.length(), lib_.size(), 0.0); // posterior probs Vector pc(Abc::kSize, 0.0); // pseudocount vector P(a|X_i) // Calculate and add pseudocounts for each sequence window X_i separately for (size_t i = 0; i < cp.counts.length(); ++i) { double* ppi = &pp[i][0]; // Calculate posterior probability of state k given sequence window around 'i' CalculatePosteriorProbs(lib_, emission_, cp, i, ppi); // Calculate pseudocount vector P(a|X_i) Assign(pc, 0.0); for (size_t k = 0; k < lib_.size(); ++k) for(size_t a = 0; a < Abc::kSize; ++a) pc[a] += ppi[k] * lib_[k].pc[a]; // FIXME: is normalization here really needed? Normalize(&pc[0], Abc::kSize); // Add pseudocounts to profile double tau = pca(cp.neff[i]); for(size_t a = 0; a < Abc::kSize; ++a) p[i][a] = (1.0 - tau) * cp.counts[i][a] / cp.neff[i] + tau * pc[a]; } } } // namespace cs #endif // CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_ hhsuite-2.0.16/src/cs/aa.h0000664172256617226630000000175612110430072017514 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_AA_H_ #define CS_AA_H_ namespace cs { class AA { public: // Size of alphabet excluding wildcard character ANY static const size_t kSize; // Size of alphabet includding wildcard character ANY static const size_t kSizeAny; // Integer code of ANY character static const uint8_t kAny; // Integer code of GAP static const uint8_t kGap; // Integer code of ENDGAP static const uint8_t kEndGap; // For converting from ASCII to the amino acid code static const uint8_t kCharToInt[]; // For converting from integer code back to ASCII character static const char kIntToChar[]; // For testing if ASCII character is from amino acid code static const bool kValidChar[]; // Functional groups of amino acid alphabet needed for coloring of profile logos static const int kFuncGroup[]; // Name of this alphabet static const char kName[]; private: DISALLOW_COPY_AND_ASSIGN(AA); }; } // namespace cs #endif // CS_AA_H_ hhsuite-2.0.16/src/cs/log.h0000664172256617226630000000250412110430072017704 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_LOG_H_ #define CS_LOG_H_ #include #include #include #include #include namespace cs { enum LogLevel { ERROR, WARNING, INFO, DEBUG, DEBUG1, DEBUG2, DEBUG3, DEBUG4 }; class Log { public: Log() {} virtual ~Log(); std::ostringstream& get(LogLevel level = INFO); static LogLevel& reporting_level(); static std::string to_string(LogLevel log_level); static LogLevel from_string(const std::string& log_level); static LogLevel from_int(int log_level); static FILE*& stream() { static FILE* p_stream = stderr; return p_stream; } protected: std::ostringstream os; LogLevel level; private: Log(const Log&); Log& operator =(const Log&); }; #ifndef LOG_MAX_LEVEL #define LOG_MAX_LEVEL DEBUG4 #endif #ifdef LOGGING #define LOG(level) \ if (level > LOG_MAX_LEVEL) ; \ else if (level > Log::reporting_level() || !Log::stream()) ; \ else Log().get(level) #else #define LOG(level) \ if (true) ; \ else if (level > Log::reporting_level() || !Log::stream()) ; \ else Log().get(level) #endif } // namespace cs #endif // CS_LOG_H_ hhsuite-2.0.16/src/cs/substitution_matrix.h0000664172256617226630000000460112110430072023263 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SUBSTITUTION_MATRIX_H_ #define CS_SUBSTITUTION_MATRIX_H_ namespace cs { // Abstract base class for substitution matrix classes. template class SubstitutionMatrix { public: SubstitutionMatrix(double l = 1.0); virtual ~SubstitutionMatrix() = 0; // Return substitution score s(a,b). double s(size_t a, size_t b) const { return s_[a][b]; } // Returns target frequency q(a,b). double q(size_t a, size_t b) const { return q_[a][b]; } // Returns conditional probability P(a|b) "a given b" for symmetric matrices. double r(size_t a, size_t b) const { return rx_[a][b]; } // Returns conditional probability P(a|b) "a given b" on query side double rx(size_t a, size_t b) const { return rx_[a][b]; } // Returns conditional probability P(a|b) "a given b" on database side double ry(size_t a, size_t b) const { return ry_[a][b]; } // Returns equilibrium frequency of alphbet letter a for symmetric matrices. double p(size_t a) const { return px_[a]; } // Returns equilibrium frequency of alphbet letter a on query side. double px(size_t a) const { return px_[a]; } // Returns equilibrium frequency of alphbet letter a on database side. double py(size_t a) const { return py_[a]; } // Prints the substitution matrix in human readable format to stream. friend std::ostream& operator<< (std::ostream& out, const SubstitutionMatrix& m) { m.Print(out); return out; } protected: // Initializes the other matrix data members from target frequencies. void InitFromTargetFreqs(); // Target frequency matrix P(a,b). Matrix q_; // Substitution matrix S(a,b). Matrix s_; // Conditional probability matrix on query side. Matrix rx_; // Conditional probability matrix on database side. Matrix ry_; // Background frequencies of alphabet on query side. Vector px_; // Background frequencies of alphabet on database side. Vector py_; // Scaling factor lambda double lambda_; private: // Prints the substitution matrix in human-readable format to output stream. virtual void Print(std::ostream& out) const; }; // Returns the average number of effective sequences for given substitution matrix template double Neff(const SubstitutionMatrix& sm); } // namespace cs #endif // CS_SUBSTITUTION_MATRIX_H_ hhsuite-2.0.16/src/cs/as.h0000664172256617226630000000423212110430072017526 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_AS_H_ #define CS_AS_H_ namespace cs { class AS62 { public: // Size of alphabet excluding wildcard character ANY static const size_t kSize; // Size of alphabet includding wildcard character ANY static const size_t kSizeAny; // Integer code of ANY character static const uint8_t kAny; // Integer code of GAP static const uint8_t kGap; // Integer code of ENDGAP static const uint8_t kEndGap; // For converting from ASCII to the integer code static const uint8_t kCharToInt[]; // For converting from integer code back to ASCII character static const char kIntToChar[]; // For testing if ASCII character is valid static const bool kValidChar[]; private: DISALLOW_COPY_AND_ASSIGN(AS62); }; class AS90 { public: // Size of alphabet excluding wildcard character ANY static const size_t kSize; // Size of alphabet includding wildcard character ANY static const size_t kSizeAny; // Integer code of ANY character static const uint8_t kAny; // Integer code of GAP static const uint8_t kGap; // Integer code of ENDGAP static const uint8_t kEndGap; // For converting from ASCII to the integer code static const uint8_t kCharToInt[]; // For converting from integer code back to ASCII character static const char kIntToChar[]; // For testing if ASCII character is valid static const bool kValidChar[]; private: DISALLOW_COPY_AND_ASSIGN(AS90); }; class AS219 { public: // Size of alphabet excluding wildcard character ANY static const size_t kSize; // Size of alphabet includding wildcard character ANY static const size_t kSizeAny; // Integer code of ANY character static const uint8_t kAny; // Integer code of GAP static const uint8_t kGap; // Integer code of ENDGAP static const uint8_t kEndGap; // For converting from ASCII to the integer code static const uint8_t kCharToInt[]; // For converting from integer code back to ASCII character static const int kIntToChar[]; // For testing if ASCII character is valid static const bool kValidChar[]; private: DISALLOW_COPY_AND_ASSIGN(AS219); }; } // namespace cs #endif // CS_AS_H_ hhsuite-2.0.16/src/cs/matrix_pseudocounts.h0000664172256617226630000000167312110430072023250 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_MATRIX_PSEUDOCOUNTS_H_ #define CS_MATRIX_PSEUDOCOUNTS_H_ #include "count_profile.h" #include "profile-inl.h" #include "pseudocounts.h" #include "sequence.h" #include "substitution_matrix.h" namespace cs { // Substitution matrix pseudocounts factory. template class MatrixPseudocounts : public Pseudocounts { public: MatrixPseudocounts(const SubstitutionMatrix& m) : m_(m) {}; virtual ~MatrixPseudocounts() {} private: virtual void AddToSequence(const Sequence& seq, const Admix& pca, Profile& p) const; virtual void AddToProfile(const CountProfile& cp, const Admix& pca, Profile& p) const; // Substitution matrix with conditional probabilities for pseudocounts. const SubstitutionMatrix& m_; DISALLOW_COPY_AND_ASSIGN(MatrixPseudocounts); }; // MatrixPseudocounts } // namespace cs #endif // CS_MATRIX_PSEUDOCOUNTS_H_ hhsuite-2.0.16/src/cs/bitset.h0000664172256617226630000000430412110430072020415 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_BITSET_H_ #define CS_BITSET_H_ namespace cs { class Bitset { public: Bitset(uint32_t sz) { uint32_t nwords = (sz >> 5)+1; words_ = new uint32_t[nwords]; assert(words_ != NULL); memset(words_, 0, nwords * 4); sz_ = nwords << 5; } ~Bitset() { delete[] words_; } bool test(uint32_t i) const { bool ret = false; if(i < sz_) { ret = ((words_[i >> 5] >> (i & 0x1f)) & 1) != 0; } return ret; } void set(uint32_t i) { while(i >= sz_) { expand(); } // Fast path words_[i >> 5] |= (1 << (i & 0x1f)); assert(((words_[i >> 5] >> (i & 0x1f)) & 1) == 1); } void flip(uint32_t i) { while(i >= sz_) { expand(); } // Fast path words_[i >> 5] ^= (1 << (i & 0x1f)); } size_t size() const { return sz_; } private: void expand() { uint32_t *newwords = realloc(sz_, words_); delete[] words_; // delete old array words_ = newwords; // install new array } uint32_t* realloc(uint32_t& sz, uint32_t* words) { uint32_t oldsz = sz; if(sz > 0) { sz += (sz >> 1) + 31; // Add 50% more elements, plus a bit sz &= ~31; // Make sure it's 32-aligned } else { sz = 1024; // Start off at 1024 bits to avoid many expansions } uint32_t *newwords; newwords = new uint32_t[sz >> 5 /* convert to words */]; if(oldsz > 0) { // Move old values into new array memcpy(newwords, words, oldsz >> 3 /* convert to bytes */); } // Initialize all new words to 0 memset(newwords + (oldsz >> 5 /*convert to words*/), 0, (sz - oldsz) >> 3 /* convert to bytes */); return newwords; // return new array } uint32_t sz_; // size as # of bits uint32_t *words_; // storage DISALLOW_COPY_AND_ASSIGN(Bitset); }; // Equality operator for bitsets: two bitsets are equal iff they have same size // and same bitpattern. inline bool operator== (const Bitset& lhs, const Bitset& rhs) { if (lhs.size() != rhs.size()) return false; bool rv = true; for (size_t b = 0; b < lhs.size(); ++b) if (lhs.test(b) != rhs.test(b)) { rv = false; break; } return rv; } } // namespace cs #endif // CS_BITSET_H_ hhsuite-2.0.16/src/cs/context_profile.h0000664172256617226630000000711312110430072022330 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_PROFILE_H_ #define CS_CONTEXT_PROFILE_H_ #include "profile-inl.h" #include "count_profile-inl.h" #include "profile_column.h" namespace cs { // Simple struct for working with RGB color values. struct Color { Color(double r = 1.0, double g = 1.0, double b = 1.0) : red(r), green(g), blue(b) {} Color(std::string coldef) { std::vector tokens; Tokenize(coldef, ',', &tokens); red = atof(tokens[0].c_str()); green = atof(tokens[1].c_str()); blue = atof(tokens[2].c_str()); } std::string ToString() const { return strprintf("%4.2f,%4.2f,%4.2f", red, green, blue); } bool operator< (const Color& rhs) const { if (red != rhs.red) return (red < rhs.red); if (green != rhs.green) return (green < rhs.green); return (blue < rhs.blue); } friend std::ostream& operator<< (std::ostream& out, const Color& c) { out << c.ToString(); return out; } double red, green, blue; }; template struct ContextProfile { // Default construction ContextProfile() : prior(0.0), probs(), pc() {}; // Constructs a context profile with 'len' columns explicit ContextProfile(size_t len) : prior(0.0), is_log(false), probs(len), pc() { assert(len & 1); } // Construction from serialized profile read from input stream. explicit ContextProfile(FILE* fin) { Read(fin); } // Constructs a context profile from normalized values in given profile 'p'. explicit ContextProfile(const Profile& p) : prior(0.0), is_log(false), probs(p), pc(&p[(p.length() - 1) / 2][0]) { assert(p.length() & 1); for (size_t i = 0; i < probs.length(); ++i) probs[i][Abc::kAny] = 1.0; pc[Abc::kAny] = 1.0; Normalize(probs, 1.0); Normalize(pc, 1.0); } // Construct a context profile by copying subprofile starting at index 'start' // for 'len' columns and normalizing afterwards. ContextProfile(const Profile& p, size_t start, size_t len) : prior(0.0), is_log(false), probs(len), pc(&p[start + (len - 1) / 2][0]) { assert(len & 1); for (size_t i = 0; i < len; ++i) { for (size_t a = 0; a < Abc::kSize; ++a) probs[i][a] = p[start + i][a]; probs[i][Abc::kAny] = 1.0; } pc[Abc::kAny] = 1.0; Normalize(probs, 1.0); Normalize(pc, 1.0); } // Initializes count profile with a serialized profile read from stream. void Read(FILE* fin); // Initializes count profile with a serialized profile read from stream. void Write(FILE* fin) const; // Returns number of columns. size_t length() const { return probs.length(); } std::string name; // optional name of this context profile double prior; // prior probability bool is_log; // flag indicating if profile is in log-space Profile probs; // profile probabilities (includes ANY) ProfileColumn pc; // predicted pseudocounts (always in lin-space) Color color; // RGB color for profile logos }; // Prints context profile probabilities in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const ContextProfile& cp); // Transforms probabilites in context profile to log-space and sets 'is_log' flag. template void TransformToLog(ContextProfile& cp); // Transforms probabilites in context profile to lin-space and sets 'is_log' flag. template void TransformToLin(ContextProfile& cp); } // namespace cs #endif // CS_CONTEXT_PROFILE_H_ hhsuite-2.0.16/src/cs/io.h0000664172256617226630000001272412110430072017537 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_IO_H_ #define CS_IO_H_ #include #include #include #include #include #include #include #include #include namespace cs { // Removes the newline and other control characters at the end of a string (if // present) and returns the new length of the string (-1 if str is NULL) inline int chomp(char* str) { if (!str) return -1; int l = 0; for (l = strlen(str) - 1; l >= 0 && str[l] < 32; --l) /* do nothing */; str[++l] = '\0'; return l; } // Emulates the ifstream::getline method; similar to fgets(str,maxlen,FILE*), // but removes the newline at the end and returns NULL if at end of file or read // error inline char* fgetline(char* str, int maxlen, FILE* file) { if (!fgets(str, maxlen, file)) return NULL; if (chomp(str) + 1 >= maxlen) // if line is cut after maxlen characters... while (fgetc(file) != '\n') // ... read in rest of line /* do nothing */; return(str); } // Returns leftmost integer in ptr and sets the pointer to first char after // the integer. If no integer is found, returns INT_MIN and sets ptr to NULL inline int strtoi(const char*& ptr) { int i; const char* ptr0 = ptr; if (!ptr) return INT_MIN; while (*ptr != '\0' && !(*ptr >= '0' && *ptr <= '9')) ++ptr; if (*ptr == '\0') { ptr = NULL; return INT_MIN; } if (ptr > ptr0 && *(ptr-1) == '-') i = -atoi(ptr); else i = atoi(ptr); while (*ptr >= '0' && *ptr <= '9') ++ptr; return i; } // Same as strtoi, but interpretes '*' as default inline int strastoi(const char*& ptr, int deflt = INT_MAX) { int i; const char* ptr0 = ptr; if (!ptr) return INT_MIN; while (*ptr != '\0' && !(*ptr >= '0' && *ptr <= '9') && *ptr != '*') ++ptr; if (*ptr == '\0') { ptr = NULL; return INT_MIN; } if (*ptr == '*') { ++ptr; return deflt; } if (ptr > ptr0 && *(ptr-1) == '-') i = -atoi(ptr); else i = atoi(ptr); while (*ptr >= '0' && *ptr <= '9') ++ptr; return i; } // Returns leftmost double in ptr and sets the pointer to first non-whitespace char // after the double. If no integer is found, returns zero and sets ptr to NULL inline double strtof(const char*& ptr) { double rv = 0.0; if (!ptr) return 0.0; while (*ptr != '\0' && isspace(*ptr)) ++ptr; if (*ptr == '\0') { ptr = NULL; return 0.0; } rv = atof(ptr); while (!isspace(*ptr)) ++ptr; return rv; } // Returns pointer to first non-white-space character in str OR to NULL if none // found inline const char* strscn(const char* str) { if (!str) return NULL; const char* ptr = str; while (*ptr != '\0' && isspace(*ptr)) ++ptr; return (*ptr == '\0') ? NULL : ptr; } // Parse serialization record and return integer value following label 'str' in // line read from file pointer 'fp'. inline int ReadInt(const char* line, const char* label, const char* errmsg = NULL) { int rv = INT_MIN; if (strstr(line, label)) { const char* ptr = line + strlen(label); rv = strtoi(ptr); } else if (errmsg) { throw Exception(errmsg); } return rv; } // Parse serialization record and return double value following label 'label' in // line read from file pointer 'fp'. inline double ReadDouble(const char* line, const char* label, const char* errmsg = NULL) { double rv = DBL_MIN; if (strstr(line, label)) { rv = atof(line + strlen(label)); } else if (errmsg) { throw Exception(errmsg); } return rv; } // Parse serialization record and return string following label 'label' in // line read from file pointer 'fp'. inline std::string ReadString(const char* line, const char* label, const char* errmsg = NULL) { std::string rv; if (strstr(line, label)) { const char* ptr = strscn(line + strlen(label)); rv = ptr; } else if (errmsg) { throw Exception(errmsg); } return rv; } // Parse serialization record and return bool value following label 'str' in // line read from file pointer 'fp'. inline bool ReadBool(const char* line, const char* label, const char* errmsg = NULL) { bool rv = false; if (strstr(line, label)) { const char* ptr = line + strlen(label); if (strchr(ptr, 'T') != NULL || strchr(ptr, '1') != NULL) rv = true; else if (strchr(ptr, 'F') != NULL || strchr(ptr, '0') != NULL) rv = false; else if (errmsg) throw Exception(errmsg); } else if (errmsg) { throw Exception(errmsg); } return rv; } // Returns true iff next non-blank line in file 'fp' contains string 'id'. inline bool StreamStartsWith(FILE* fp, const char* id) { char buffer[KB]; while (fgetline(buffer, KB, fp)) if (strscn(buffer)) break; return strstr(buffer, id) == buffer; } // Reads all serialized records of class type 'T' from stream 'fin' into vector. template void ReadAll(FILE* fin, std::vector& vec) { while (!feof(fin)) { // Parse next record vec.push_back(T(fin)); // Check for EOF int c = getc(fin); if (c == EOF) break; ungetc(c, fin); } } // Writes all serialized records of class type 'T' from vector to stream 'fout' template void WriteAll(const std::vector& vec, FILE* fout) { typedef typename std::vector::const_iterator ConstIter; for (ConstIter iter = vec.begin(); iter != vec.end(); ++iter) iter->Write(fout); } } // namespace cs #endif // CS_IO_H_ hhsuite-2.0.16/src/cs/log.cc0000664172256617226630000000545412110430072020051 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "log.h" #include #include #include #include #include namespace cs { inline std::string now_time() { char buffer[11]; time_t now = time(0); strftime(buffer, sizeof(buffer), "%X", localtime(&now)); struct timeval tv; gettimeofday(&tv, 0); char result[100] = {0}; sprintf(result, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); return result; } std::ostringstream& Log::get(LogLevel log_level) { level = log_level; std::string level_str(to_string(level)); os << level_str << std::string(9 - level_str.length(), ' ') << now_time() << " "; os << std::string(level > DEBUG ? (level - DEBUG) : 0, '\t'); return os; } Log::~Log() { if (os.str().find('\n') == std::string::npos) { os << std::endl; fprintf(stream(), "%s", os.str().c_str()); } else { const std::string margin( "\t\t\t" + std::string(level > DEBUG ? (level - DEBUG) : 0, '\t')); std::string s(os.str()); if (*s.rbegin() == '\n') s.erase(s.begin() + s.length() - 1); std::string::size_type i = 0; std::string::size_type j = s.find('\n'); while (j != std::string::npos) { fprintf(stream(), "%s\n%s", s.substr(i, j-i).c_str(), margin.c_str()); i = ++j; j = s.find('\n', j); if (j == std::string::npos) fprintf(stream(), "%s\n", s.substr(i, s.length()).c_str()); } } fflush(stream()); } LogLevel& Log::reporting_level() { static LogLevel log_level = DEBUG4; return log_level; } std::string Log::to_string(LogLevel log_level) { static const char* const buffer[] = {"ERROR", "WARNING", "INFO", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3", "DEBUG4"}; return buffer[log_level]; } LogLevel Log::from_string(const std::string& log_level) { if (log_level == "DEBUG4") return DEBUG4; if (log_level == "DEBUG3") return DEBUG3; if (log_level == "DEBUG2") return DEBUG2; if (log_level == "DEBUG1") return DEBUG1; if (log_level == "DEBUG") return DEBUG; if (log_level == "INFO") return INFO; if (log_level == "WARNING") return WARNING; if (log_level == "ERROR") return ERROR; Log().get(WARNING) << "Unknown logging level '" << log_level << "'. Using INFO level as default."; return INFO; } LogLevel Log::from_int(int log_level) { if (log_level == 7) return DEBUG4; if (log_level == 6) return DEBUG3; if (log_level == 5) return DEBUG2; if (log_level == 4) return DEBUG1; if (log_level == 3) return DEBUG; if (log_level == 2) return INFO; if (log_level == 1) return WARNING; if (log_level == 0) return ERROR; Log().get(WARNING) << "Unknown logging level '" << log_level << "'. Using INFO level as default."; return INFO; } } // namespace cs hhsuite-2.0.16/src/cs/context_library.h0000664172256617226630000001731012110430072022334 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_LIBRARY_H_ #define CS_CONTEXT_LIBRARY_H_ #include "abstract_state_matrix.h" #include "co_emission.h" #include "context_profile.h" #include "pseudocounts.h" namespace cs { // Forward declarations template class ContextLibrary; template class Emission; // Strategy class for initializing a context library template class LibraryInit { public: LibraryInit() {} virtual ~LibraryInit() {} virtual void operator() (ContextLibrary& lib) const = 0; }; // A container of K context profiles representing the most common // sequence motifs in a training database of proteins/DNA sequences. template class ContextLibrary { public: typedef ContextProfile* ProfileIter; typedef const ContextProfile* ConstProfileIter; // Constructs an empty profile library of given dimenions. ContextLibrary(size_t size, size_t wlen); // Constructs a profile library from serialized data read from input stream. explicit ContextLibrary(FILE* fin); // Constructs profile library with a specific init-strategy encapsulated by an // initializer. ContextLibrary(size_t size, size_t wlen, const LibraryInit& init); // Nothing to do here virtual ~ContextLibrary() {} // Returns the number of profiles in the fully assembled profile library size_t size() const { return profiles_.size(); } // Returns the number of columns in each context profile. size_t wlen() const { return wlen_; } // Returns index of central profile column. size_t center() const { return (wlen_ - 1) / 2; } // Accessor methods for state i, where i is from interval [0,size]. ContextProfile& operator[](size_t i) { return profiles_[i]; } const ContextProfile& operator[](size_t i) const { return profiles_[i]; } // Initializes profile at index 'k' with given profile. void SetProfile(size_t k, const ContextProfile& p); // Returns an iterator pointing to beginning of profiles. ProfileIter begin() { return &profiles_[0]; } // Returns an iterator pointing past the end of profiles. ProfileIter end() { return &profiles_[0] + profiles_.size(); } // Returns a const iterator pointing to beginning of profiles. ConstProfileIter begin() const { return &profiles_[0]; } // Returns a const iterator pointing past the end of profiles. ConstProfileIter end() const { return &profiles_[0] + profiles_.size(); } // Writes the profile library in serialization format to output stream. void Write(FILE* fout) const; // Sorts context states by relative entropy of central column and assigns // new state indices according to this new ordering void SortByEntropy(); private: // Initializes the library from serialized data read from stream. void Read(FILE* fin); size_t wlen_; // size of context window. Vector > profiles_; // context profiles ordered by index. }; // ContextLibrary // Prints the library in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const ContextLibrary& lib) { out << "ContextLibrary" << std::endl; out << "size:\t" << lib.size() << std::endl; out << "wlen:\t" << lib.wlen() << std::endl; for (size_t k = 0; k < lib.size(); ++k) out << lib[k]; return out; } // Transforms probabilites in context profiles to log-space and sets 'is_log' flag. template void TransformToLog(ContextLibrary& lib); // Transforms probabilites in context profiles to lin-space and sets 'is_log' flag. template void TransformToLin(ContextLibrary& lib); // Calculates posterior probs for a context library and sequence window X_i // centered at index 'i' and writes them to array 'pp'. Caller is responsible for // making sure that 'pp' has sufficient length. Return value is log sum of all // individual emission terms. The third template parameter specifies the central // position of the context window. template double CalculatePosteriorProbs(const ContextLibrary& lib, const Emission& emission, const ContextInput& input, CenterPos i, double* pp); // Strategy for initializing library by sampling from training set of count // profiles, optionally adding pseudocounts. template class SamplingLibraryInit : public LibraryInit { public: typedef std::vector< CountProfile > TrainingSet; SamplingLibraryInit(const TrainingSet& trainset, const Pseudocounts& pc, const Admix& admix, unsigned int seed = 0) : trainset_(trainset), pc_(pc), admix_(admix), seed_(seed) {} virtual ~SamplingLibraryInit() {} virtual void operator() (ContextLibrary& lib) const; private: const TrainingSet& trainset_; const Pseudocounts& pc_; const Admix& admix_; const unsigned int seed_; }; // SamplingLibraryInit // Strategy that initializes profile probs by sammpling from gaussian distribution // with mean at background frequencies. template class GaussianLibraryInit : public LibraryInit { public: GaussianLibraryInit(double sigma, const SubstitutionMatrix& sm, unsigned int seed = 0) : sigma_(sigma), sm_(sm), seed_(seed) {} virtual ~GaussianLibraryInit() {} virtual void operator() (ContextLibrary& lib) const; protected: double sigma_; const SubstitutionMatrix& sm_; unsigned int seed_; }; // class GaussianLibraryInit // Translate a sequence or count profile into an abstract state sequence. template Sequence TranslateIntoStateSequence(const CountsInput& input, const ContextLibrary& lib, const Emission& emission); // Translate a sequence or count profile into an abstract state profile given // the learned context-to-state mutation probabilities in 'matrix'. template Profile TranslateIntoStateProfile(const CountsInput& input, const ContextLibrary& lib, const Emission& emission, const AbstractStateMatrix& matrix); // Learns a color-space SOM from a full-blown context-library. template void LearnContextMap(const ContextLibrary& lib, ContextLibrary& som, const CoEmission& co_emission, int nsteps, // number of learning steps double sigma = 5.0, // initial neighborhood gaussian sigma double alpha = 0.1, // initial learning rate double tau1 = 0.0, // timescale parameter for sigma double tau2 = 0.0, // timescale parameter for alpha unsigned int seed = 0); // Assigns each context profile in given context lib an RBG color based learned SOM template void AssignContextColors(ContextLibrary& lib, const ContextLibrary& som, const CoEmission& co_emission, double color_offset = 0.2); // Assigns each context profile a unique name based on its position in learned SOM template void AssignContextNames(ContextLibrary& lib, const ContextLibrary& som, const CoEmission& co_emission); } // namespace cs #endif // CS_CONTEXT_LIBRARY_H_ hhsuite-2.0.16/src/cs/application.h0000664172256617226630000000405112110430072021425 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_APPLICATION_H_ #define CS_APPLICATION_H_ #include #include #include #include "globals.h" #include "getopt_pp.h" using namespace GetOpt; namespace cs { // Basic (abstract) application class. // Defines the high level behavior of an application. A new application is // written by deriving a class from Application and writing an implementation // of the Run() and maybe some other (like ParseOptions() etc.) methods. class Application { public: // Register the application instance. Application(); // Clean up the application settings, flush the diagnostic stream. virtual ~Application(); // Main function (entry point) for the application. int main(int argc, // argc in a regular main char* argv[], // argv in a regular main FILE* fout, // output stream const std::string& name // application name ); protected: // Version number for usage output. static const char* kVersionNumber; // Copyright string for usage output. static const char* kCopyright; // Runs the application and return exit code. To be implemented by derived // classes. virtual int Run() = 0; // Parses command line options. virtual void ParseOptions(GetOpt_pp& /* options */) {}; // Prints options summary to stream. virtual void PrintOptions() const {}; // Prints usage banner to stream. virtual void PrintUsage() const {}; // Prints short application description. virtual void PrintBanner() const {}; // Prints copyright notification. void PrintHelp() const; static Application* instance_; // current app. instance std::string app_name_; // application name std::string log_level_; // log reporting level std::string log_file_; // name of logfile FILE* log_fp_; // file pointer to logfile FILE* out_; // file pointer to output stream }; } // namespace cs #endif // CS_APPLICATION_H_ hhsuite-2.0.16/src/cs/cs.h0000664172256617226630000000154512110430072017534 0ustar hauserscientific_computing#ifndef CS_CS_H_ #define CS_CS_H_ // C includes #include #include #include #include #include #include #include #include #include // STL includes #include #include #include #include #include #include #include #include // Special header files for Open-MP and MPI #ifdef OPENMP #include #endif #ifdef PARALLEL #include #endif // Basic includes #include "globals.h" #include "aa.h" #include "as.h" #include "assert_helpers.h" #include "bitset.h" #include "dna.h" #include "exception.h" #include "io.h" #include "log.h" #include "matrix.h" #include "ran.h" #include "scoped_ptr.h" #include "shared_ptr.h" #include "timer.h" #include "utils.h" #include "vector.h" #endif // CS_CS_H_ hhsuite-2.0.16/src/cs/abstract_state_matrix-inl.h0000664172256617226630000001020112110430072024263 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_ABSTRACT_STATE_MATRIX_INL_H_ #define CS_ABSTRACT_STATE_MATRIX_INL_H_ #include "abstract_state_matrix.h" namespace cs { template AbstractStateMatrix::AbstractStateMatrix(std::string matrixfile) : num_contexts_(0), py_(AS::kSizeAny, 0.0) { // Read matrix file char buffer[MB]; FILE* fin = fopen(matrixfile.c_str(), "r"); if (!fin) throw Exception("Can't read abstract state matrix '%s'!", matrixfile.c_str()); // Determine number of contexts fgetline(buffer, MB, fin); // skip alphabet description line while (fgetline(buffer, KB, fin)) if (strscn(buffer)) num_contexts_++; // Resize and assign matrices and vectors q_.Assign(num_contexts_, AS::kSizeAny, 0.0); s_.Assign(num_contexts_, AS::kSizeAny, 0.0); r_.Assign(AS::kSizeAny, num_contexts_, 0.0); px_.Assign(num_contexts_, 0.0); rewind(fin); const char* ptr = NULL; size_t k = 0; fgetline(buffer, MB, fin); // skip alphabet description line while (fgetline(buffer, KB, fin)) { ptr = buffer; for (size_t s = 0; s < AS::kSize; ++s) q_[k][s] = strtof(ptr); k++; } fclose(fin); // Init remaining members based on target freqs Init(); } template void AbstractStateMatrix::Init() { // Check transition probability matrix, renormalize P double sumab = 0.0; for (size_t a = 0; a < num_contexts_; a++) for (size_t b = 0; b < AS::kSize; ++b) sumab += q_[a][b]; for (size_t a = 0; a < num_contexts_; ++a) for (size_t b = 0; b < AS::kSize; ++b) q_[a][b] /= sumab; // Calculate background frequencies for (size_t a = 0; a < num_contexts_; ++a) { px_[a] = 0.0; for (size_t b = 0; b < AS::kSize; ++b) px_[a] += q_[a][b]; } Normalize(&px_[0], num_contexts_); for (size_t b = 0; b < AS::kSize; ++b) { py_[b] = 0.0; for (size_t a = 0; a < num_contexts_; ++a) py_[b] += q_[a][b]; } Normalize(&py_[0], AS::kSize); // Precompute conditional probability matrix R "abstract state b given context a" for (size_t a = 0; a < num_contexts_; ++a) for (size_t b = 0; b < AS::kSize; ++b) r_[b][a] = q_[a][b] / px_[a]; // P(b|a) for (size_t a = 0; a < num_contexts_; ++a) r_[AS::kAny][a] = 1.0; // P(X|a) = 1.0 // Calculate scoring matrix as S[a][b] = (1 / lambda) * log(P(a,b) / (P(a)*P(b))) const double lambda = log(2) / 2.0; for (size_t a = 0; a < num_contexts_; ++a) for (size_t b = 0; b < AS::kSize; ++b) s_[a][b] = (1.0 / lambda) * log(q_[a][b] / (px_[a] * py_[b])); LOG(DEBUG1) << *this; } template void AbstractStateMatrix::Print(std::ostream& out) const { out << "Background frequencies on query side (in %):\n"; for (size_t a = 0; a < num_contexts_; ++a) out << a << "\t"; out << std::endl; for (size_t a = 0; a < num_contexts_; ++a) out << strprintf("%-.4f\t", 100.0 * px_[a]); out << "\nBackground frequencies on database side (in %):\n"; for (size_t a = 0; a < AS::kSize; ++a) out << AS::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < AS::kSize; ++a) out << strprintf("%-.2f\t", 100.0 * py_[a]); out << "\nSubstitution matrix log( q(k,s) / p(k)*p(s) ) (scaled by 1/lambda):\n"; for (size_t b = 0; b < AS::kSize; ++b) out << AS::kIntToChar[b] << "\t"; out << std::endl; for (size_t a = 0; a < num_contexts_; ++a) { for (size_t b = 0; b < AS::kSize; ++b) out << strprintf("%+5.2f\t", s_[a][b]); out << std::endl; } out << "Target frequency matrix q(k,s) (in %):\n"; for (size_t b = 0; b < AS::kSize; ++b) out << AS::kIntToChar[b] << "\t"; out << std::endl; for (size_t a = 0; a < num_contexts_; ++a) { for (size_t b = 0; b < AS::kSize; ++b) out << strprintf("%-.2f\t", 100.0f * q_[a][b]); out << std::endl; } out << "Matrix of conditional probabilities P(s|k) = P(k,s)/p(k) (in %):\n"; for (size_t b = 0; b < AS::kSize; ++b) out << AS::kIntToChar[b] << "\t"; out << std::endl; for (size_t a = 0; a < num_contexts_; ++a) { for (size_t b = 0; b < AS::kSize; ++b) out << strprintf("%-.1f\t", 100.0f * r_[b][a]); out << std::endl; } } } // namespace cs #endif // CS_ABSTRACT_STATE_MATRIX_INL_H_ hhsuite-2.0.16/src/cs/profile-inl.h0000664172256617226630000001263012110430072021344 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_PROFILE_INL_H_ #define CS_PROFILE_INL_H_ #include "profile.h" namespace cs { template Profile::Profile() : nn(0), v(NULL) {} template Profile::Profile(size_t n) : nn(n), v(n>0 ? new double*[n] : NULL) { size_t i,nel=n*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1;i Profile::Profile(size_t n, const double &a) : nn(n), v(n>0 ? new double*[n] : NULL) { size_t i,j,nel=n*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< n; i++) v[i] = v[i-1] + Abc::kSizeAny; for (i=0; i< n; i++) for (j=0; j Profile::Profile(size_t n, const double *a) : nn(n), v(n>0 ? new double*[n] : NULL) { size_t i,j,nel=n*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< n; i++) v[i] = v[i-1] + Abc::kSizeAny; for (i=0; i< n; i++) for (j=0; j Profile::Profile(const Profile &rhs) : nn(rhs.nn), v(nn>0 ? new double*[nn] : NULL) { size_t i,j,nel=nn*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + Abc::kSizeAny; for (i=0; i< nn; i++) for (j=0; j Profile & Profile::operator=(const Profile &rhs) { if (this != &rhs) { size_t i,j,nel; if (nn != rhs.nn) { if (v != NULL) { delete[] v[0]; delete[] v; } nn=rhs.nn; v = nn>0 ? new double*[nn] : NULL; nel = nn*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + Abc::kSizeAny; } for (i=0; i< nn; i++) for (j=0; j inline double* Profile::operator[](const size_t i) { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Profile subscript out of bounds"); } #endif return v[i]; } template inline const double* Profile::operator[](const size_t i) const { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Profile subscript out of bounds"); } #endif return v[i]; } template void Profile::Resize(size_t newn) { size_t i,nel; if (newn != nn) { if (v != NULL) { delete[] v[0]; delete[] v; } nn = newn; v = nn>0 ? new double*[nn] : NULL; nel = nn*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + Abc::kSizeAny; } } template void Profile::Assign(size_t newn, const double& a) { size_t i,j,nel; if (newn != nn) { if (v != NULL) { delete[] v[0]; delete[] v; } nn = newn; v = nn>0 ? new double*[nn] : NULL; nel = nn*Abc::kSizeAny; if (v) v[0] = nel>0 ? new double[nel] : NULL; for (i=1; i< nn; i++) v[i] = v[i-1] + *Abc::kSizeAny; } for (i=0; i< nn; i++) for (j=0; j<*Abc::kSizeAny; j++) v[i][j] = a; } template Profile::~Profile() { if (v != NULL) { delete[] v[0]; delete[] v; } } // Assigns given constant value or default to all entries in matrix template inline void Assign(Profile& p, double val) { for (size_t i = 0; i < p.length(); ++i) for (size_t j = 0; j < Abc::kSizeAny; ++j) p[i][j] = val; } // Normalizes all profile columns to fixed value. Iff 'incl_any' is true, // normalization also includes values for ANY letter template inline void Normalize(Profile& p, double val, bool incl_any) { const size_t abc_size = incl_any ? Abc::kSizeAny : Abc::kSize; for (size_t i = 0; i < p.length(); ++i) { double sum = 0.0; for (size_t a = 0; a < abc_size; ++a) sum += p[i][a]; if (sum != 0.0) { double fac = val / sum; for (size_t a = 0; a < abc_size; ++a) p[i][a] *= fac; } } } // Normalizes all profile columns to corresponding value in vector 'norm'. // Iff 'incl_any' is true, normalization also includes values for ANY letter. template inline void Normalize(Profile& p, const Vector& norm, bool incl_any) { const size_t abc_size = incl_any ? Abc::kSizeAny : Abc::kSize; for (size_t i = 0; i < p.length(); ++i) { double sum = 0.0; for (size_t a = 0; a < abc_size; ++a) sum += p[i][a]; if (sum != 0.0) { double fac = norm[i] / sum; for (size_t a = 0; a < abc_size; ++a) p[i][a] *= fac; } } } // Prints profile in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const Profile& p) { out << "Profile" << std::endl; for (size_t a = 0; a < Abc::kSizeAny; ++a) out << "\t" << Abc::kIntToChar[a]; out << std::endl; for (size_t i = 0; i < p.length(); ++i) { out << i+1; for (size_t a = 0; a < Abc::kSizeAny; ++a) out << strprintf("\t%6.4f", p[i][a]); out << std::endl; } return out; } } // namespace cs #endif // CS_PROFILE_INL_H_ hhsuite-2.0.16/src/cs/abstract_state_matrix.h0000664172256617226630000000371512110430072023517 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_ABSTRACT_STATE_MATRIX_H_ #define CS_ABSTRACT_STATE_MATRIX_H_ namespace cs { // A substitution matrix between contexts on the query side and abstract states // on the database side. template class AbstractStateMatrix { public: AbstractStateMatrix(std::string matrixfile); // Return substitution score s(a,b) of context k and abstract state s. double s(size_t k, size_t s) const { return s_[k][s]; } // Returns target frequency q(k,s) of context k and abstract state s. double q(size_t k, size_t s) const { return q_[k][s]; } // Returns conditional probability P(s|k) "s given k". double r(size_t s, size_t k) const { return r_[s][k]; } // Returns equilibrium frequency of context k on query side. double px(size_t k) const { return px_[k]; } // Returns equilibrium frequency of abstract state s on database side. double py(size_t s) const { return py_[s]; } // Returns number of context profiles on query side. size_t num_contexts() const { return num_contexts_; } // Prints the substitution matrix in human readable format to stream. friend std::ostream& operator<< (std::ostream& out, const AbstractStateMatrix& m) { m.Print(out); return out; } protected: // Initializes the other matrix data members from target frequencies. void Init(); // Number of contexts on query side size_t num_contexts_; // Target frequency matrix P(k,s). Matrix q_; // Substitution matrix S(k,s). Matrix s_; // Conditional probability matrix "s given k". Matrix r_; // Background frequencies of contexts on query side. Vector px_; // Background frequencies of abstract states on database side. Vector py_; private: // Prints the substitution matrix in human-readable format to output stream. virtual void Print(std::ostream& out) const; }; } // namespace cs #endif // CS_ABSTRACT_STATE_MATRIX_H_ hhsuite-2.0.16/src/cs/library_pseudocounts.h0000664172256617226630000000222712110430072023404 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_LIB_PSEUDOCOUNTS_H_ #define CS_CONTEXT_LIB_PSEUDOCOUNTS_H_ #include "count_profile-inl.h" #include "emission.h" #include "profile-inl.h" #include "pseudocounts.h" #include "sequence-inl.h" #include "context_library-inl.h" namespace cs { // Encapsulation of context-specific pseudocounts calculated from a library // of context profiles. template class LibraryPseudocounts : public Pseudocounts { public: LibraryPseudocounts(const ContextLibrary& lib, double weight_center = 1.6, double weight_decay = 0.85); virtual ~LibraryPseudocounts() {} virtual void AddToSequence(const Sequence& seq, const Admix& pca, Profile& p) const; virtual void AddToProfile(const CountProfile& cp, const Admix& pca, Profile& p) const; private: // Profile library with context profiles. const ContextLibrary& lib_; // Needed to compute emission probabilities of context profiles. const Emission emission_; DISALLOW_COPY_AND_ASSIGN(LibraryPseudocounts); }; // LibraryPseudocounts } // namespace cs #endif // CS_CONTEXT_LIB_PSEUDOCOUNTS_H_ hhsuite-2.0.16/src/cs/dna.h0000664172256617226630000000173712110430072017674 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_DNA_H_ #define CS_DNA_H_ namespace cs { class Dna { public: // Size of alphabet excluding wildcard character ANY static const size_t kSize; // Size of alphabet includding wildcard character ANY static const size_t kSizeAny; // Integer code of ANY character static const uint8_t kAny; // Integer code of GAP static const uint8_t kGap; // Integer code of ENDGAP static const uint8_t kEndGap; // For converting from ASCII to 5-letter integer code static const uint8_t kCharToInt[]; // For converting from integer code back to ASCII character static const char kIntToChar[]; // For testing if ASCII character is from DNA code static const bool kValidChar[]; // Functional groups of DNA alphabet for coloring of profile logos static const int kFuncGroup[]; // Name of this alphabet static const char kName[]; private: DISALLOW_COPY_AND_ASSIGN(Dna); }; } // namespace cs #endif // CS_DNA_H_ hhsuite-2.0.16/src/cs/co_emission.h0000664172256617226630000000365012110430072021435 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CO_EMISSION_H_ #define CS_CO_EMISSION_H_ #include "profile-inl.h" #include "substitution_matrix-inl.h" namespace cs { // Functor for calculating co-emission probabilities for two profiles. template class CoEmission { public: // Constructs an emission object with positional window weights. CoEmission(size_t wlen, const SubstitutionMatrix& sm, double w_center = 1.6, double w_decay = 0.85) : center_((wlen - 1) / 2), weights_(wlen), sm_(sm) { assert(wlen & 1); weights_[center_] = w_center; for (size_t i = 1; i <= center_; ++i) { double weight = w_center * pow(w_decay, i); weights_[center_ - i] = weight; weights_[center_ + i] = weight; } } // Calculates the sum of positional weights. float GetSumWeights() const { double sum = 0.0; for (size_t i = 0; i < weights_.size(); ++i) sum += weights_[i]; return sum; } // Calculates weighted sum of log co-emissions probs over all profile columns. // Probabilities in both profiles are assumed to be in lin-space. double operator() (const Profile& p, const Profile& q) const { assert(p.length() & 1); assert_eq(weights_.size(), p.length()); assert_eq(p.length(), q.length()); double rv = 0.0; for (size_t j = 0; j < weights_.size(); ++j) { double prob_j = 0.0; for (size_t a = 0; a < Abc::kSize; ++a) prob_j += (p[j][a] * q[j][a]) / sm_.p(a); rv += weights_[j] * log(prob_j); } return rv; } private: size_t center_; // index of central column in context window Vector weights_; // positional window weights const SubstitutionMatrix& sm_; // neeeded for background frequencies DISALLOW_COPY_AND_ASSIGN(CoEmission); }; // class CoEmission } // namespace cs #endif // CS_CO_EMISSION_H_ hhsuite-2.0.16/src/cs/sequence.h0000664172256617226630000000674612110430072020747 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SEQUENCE_H_ #define CS_SEQUENCE_H_ namespace cs { // A container class representing a sequence consisting of letters over a // sequence alphabet. template class Sequence { public: typedef uint8_t value_type; typedef value_type* Iter; typedef const value_type* ConstIter; // Constructs sequence with specified length. Sequence(size_t length = 0); // Copy constructor Sequence(const Sequence& other); // Subsequence constructor Sequence(const Sequence& other, size_t idx, size_t len); // Constructs sequence from serialized sequence in FASTA format explicit Sequence(FILE* fin); // Constructs sequence with given header and sequence string of characters. Sequence(const std::string& sequence, const std::string& header = ""); // Deallocates sequence array ~Sequence() { delete[] seq_; } // Assignment operator Sequence& operator= (const Sequence& rhs); // Accessors for integer at position i of the sequence. value_type& operator[](size_t i) { return seq_[i]; } const value_type& operator[](size_t i) const { return seq_[i]; } value_type& at(size_t i) { return seq_[i]; } const value_type& at(size_t i) const { return seq_[i]; } // Returns the character at position i of the sequence. int chr(size_t i) const { return Abc::kIntToChar[seq_[i]]; } // Returns the sequence length. size_t length() const { return length_; } // Sets the header to given string. void set_header(const std::string& header) { header_ = header; } // Returns the header information of this sequence. const std::string& header() const { return header_; } // Returns a const iterator to the first integer element of the sequence. ConstIter begin() const { return seq_; } // Returns a const iterator just past the end of the sequence. ConstIter end() const { return begin() + length(); } // Returns an iterator to the first integer element of the sequence. Iter begin() { return seq_; } // Returns an iterator just past the end of the sequence. Iter end() { return begin() + length(); } // Initializes the sequence object with a sequence in FASTA format void Read(FILE* in); // Prints the sequence in FASTA format to output stream. void Write(FILE* fout, size_t width = 100) const; // Resizes current sequence to new length (Note: old sequence is NOT preserved!) void Resize(size_t newlen); // Returns sequence as character string. std::string ToString() const; protected: // Convert the sequence in character representation to integer representation. void Init(std::string sequence, std::string header); // Length of sequence size_t length_; // The sequence itself in integer representation value_type* seq_; // The header without leading '>' std::string header_; }; // Sequence // Prints the Alignment in A2M format for debugging. template std::ostream& operator<< (std::ostream& out, const Sequence& s) { const size_t kWidth = 100; out << '>' << s.header() << std::endl; for (size_t i = 0; i < s.length(); ++i) { out << s.chr(i); if ((i+1) % kWidth == 0) out << std::endl; } if (s.length() % kWidth != 0) out << std::endl; return out; } // Predicate indicating if character is a gap character, that is '-' or '.' inline bool isgap(char c) { return (c == '-' || c == '.'); } } // namespace cs #endif // CS_SEQUENCE_H_ hhsuite-2.0.16/src/cs/assert_helpers.h0000664172256617226630000001744512110430072022160 0ustar hauserscientific_computing#ifndef CS_ASSERT_HELPERS_H_ #define CS_ASSERT_HELPERS_H_ #include namespace cs { extern "C" void CS_Fatal(const char* file, int line, const char* format, ...); // The FATAL, UNREACHABLE and UNIMPLEMENTED macros are useful during // development, but they should not be relied on in the final product. #ifndef NDEBUG #define FATAL(msg) \ CS_Fatal(__FILE__, __LINE__, "%s", (msg)) #define UNIMPLEMENTED() \ CS_Fatal(__FILE__, __LINE__, "unimplemented code") #define UNREACHABLE() \ CS_Fatal(__FILE__, __LINE__, "unreachable code") #else #define FATAL(msg) \ CS_Fatal("", 0, "%s", (msg)) #define UNIMPLEMENTED() \ CS_Fatal("", 0, "unimplemented code") #define UNREACHABLE() ((void) 0) #endif // Used by the ASSERT macro -- should not be called directly. static inline void AssertHelper(const char* file, int line, const char* source, bool condition) { if (!condition) CS_Fatal(file, line, "assert(%s) failed", source); } // Helper function used by the ASSERT_EQ function when given int // arguments. Should not be called directly. static inline void AssertEqualsHelper(const char* file, int line, const char* expected_source, int expected, const char* value_source, int value) { if (expected != value) { CS_Fatal(file, line, "ASSERT_EQ(%s, %s) failed\n# Expected: %i\n# Found: %i", expected_source, value_source, expected, value); } } // Helper function used by the ASSERT_EQ function when given int // arguments. Should not be called directly. static inline void AssertEqualsHelper(const char* file, int line, const char* expected_source, size_t expected, const char* value_source, size_t value) { if (expected != value) { CS_Fatal(file, line, "ASSERT_EQ(%s, %s) failed\n# Expected: %i\n# Found: %i", expected_source, value_source, expected, value); } } // Helper function used by the ASSERT_NE function when given int // arguments. Should not be called directly. static inline void AssertNonEqualsHelper(const char* file, int line, const char* unexpected_source, int unexpected, const char* value_source, int value) { if (unexpected == value) { CS_Fatal(file, line, "ASSERT_NE(%s, %s) failed\n# Value: %i", unexpected_source, value_source, value); } } // Helper function used by the ASSERT function when given string // arguments. Should not be called directly. static inline void AssertEqualsHelper(const char* file, int line, const char* expected_source, const char* expected, const char* value_source, const char* value) { if (strcmp(expected, value) != 0) { CS_Fatal(file, line, "ASSERT_EQ(%s, %s) failed\n# Expected: %s\n# Found: %s", expected_source, value_source, expected, value); } } static inline void AssertNonEqualsHelper(const char* file, int line, const char* expected_source, const char* expected, const char* value_source, const char* value) { if (expected == value || (expected != NULL && value != NULL && strcmp(expected, value) == 0)) { CS_Fatal(file, line, "ASSERT_NE(%s, %s) failed\n# Value: %s", expected_source, value_source, value); } } // Helper function used by the ASSERT function when given pointer // arguments. Should not be called directly. static inline void AssertEqualsHelper(const char* file, int line, const char* expected_source, void* expected, const char* value_source, void* value) { if (expected != value) { CS_Fatal(file, line, "ASSERT_EQ(%s, %s) failed\n# Expected: %p\n# Found: %p", expected_source, value_source, expected, value); } } static inline void AssertNonEqualsHelper(const char* file, int line, const char* expected_source, void* expected, const char* value_source, void* value) { if (expected == value) { CS_Fatal(file, line, "ASSERT_NE(%s, %s) failed\n# Value: %p", expected_source, value_source, value); } } // Helper function used by the ASSERT function when given floating // point arguments. Should not be called directly. static inline void AssertEqualsHelper(const char* file, int line, const char* expected_source, double expected, const char* value_source, double value) { // Force values to 64 bit memory to truncate 80 bit precision on IA32. volatile double* exp = new double[1]; *exp = expected; volatile double* val = new double[1]; *val = value; if (*exp != *val) { CS_Fatal(file, line, "ASSERT_EQ(%s, %s) failed\n# Expected: %f\n# Found: %f", expected_source, value_source, *exp, *val); } delete[] exp; delete[] val; } // Helper function used by the ASSERT function when given floating // point arguments. Should not be called directly. static inline void AssertNonEqualsHelper(const char* file, int line, const char* unexpected_source, double unexpected, const char* value_source, double value) { // Force values to 64 bit memory to truncate 80 bit precision on IA32. volatile double* exp = new double[1]; *exp = unexpected; volatile double* val = new double[1]; *val = value; if (*exp == *val) { CS_Fatal(file, line, "ASSERT_NE(%s, %s) failed\n# Value: %i", unexpected_source, value_source, value); } delete[] exp; delete[] val; } // The ASSERT macro only generates code in debug builds. #undef assert #ifndef NDEBUG #define assert_result(expr) AssertHelper(__FILE__, __LINE__, #expr, expr) #define assert(condition) AssertHelper(__FILE__, __LINE__, \ #condition, condition) #define assert_eq(v1, v2) AssertEqualsHelper(__FILE__, __LINE__, \ #v1, v1, #v2, v2) #define assert_ne(v1, v2) AssertNonEqualsHelper(__FILE__, __LINE__, \ #v1, v1, #v2, v2) #else #define assert_result(expr) (expr) #define assert(condition) ((void) 0) #define assert_eq(v1, v2) ((void) 0) #define assert_ne(v1, v2) ((void) 0) #endif } #endif // CS_ASSERT_HELPERS_H_ hhsuite-2.0.16/src/cs/count_profile.h0000664172256617226630000000604012110430072021772 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_COUNT_PROFILE_H_ #define CS_COUNT_PROFILE_H_ #include "alignment.h" #include "profile.h" #include "sequence.h" #include "substitution_matrix-inl.h" namespace cs { template struct CountProfile { // Constructs a count profile with 'len' columns explicit CountProfile(size_t len = 0) : counts(len, 0.0), neff(len, 1.0) {} // Construction from serialized profile read from input stream. explicit CountProfile(FILE* fin) { Read(fin); } // Constructs a profile representation of given sequence. explicit CountProfile(const Sequence& seq) : counts(seq.length(), 0.0f), neff(seq.length(), 1.0f) { for (size_t i = 0; i < seq.length(); ++i) counts[i][seq[i]] = 1.0f; } // Constructs a count profile from a profile and sets effective number // of sequences to one. Usefull for constructing a count profile from // a pseudocount factory. CountProfile(const Profile& p) : counts(p), neff(p.length(), 1.0) {} // Construction from alignment with specified sequence weighting method CountProfile(const Alignment& ali, bool pos_weights = true, bool neff_sum_pairs = false); // Creates profile by copying subprofile starting at index 'idx' for 'len' cols CountProfile(const CountProfile& other, size_t idx, size_t len) : counts(len), neff(len) { for (size_t i = 0; i < len; ++i) { neff[i] = other.neff[idx + i]; for (size_t a = 0; a < Abc::kSizeAny; ++a) counts[i][a] = other.counts[idx + i][a]; } } // Initializes count profile with a serialized profile read from stream. void Read(FILE* fin); // Writes serialized count profile to stream. void Write(FILE* fout) const; // Returns number of columns. size_t length() const { return counts.length(); } std::string name; // optional name descriptor Profile counts; // absolute counts of alphabet letters Vector neff; // effective number of sequences at column i }; // Returns the average number of effective sequences in given count profile template double Neff(const CountProfile& cp); // Builds and returns a consensus sequence of the given count profile by // calculating at each position the alphabet character that deviates most strongly // from its background probability. template std::string ConsensusSequence(const CountProfile& cp, const SubstitutionMatrix& sm); // Builds and returns a conservation string for given count profile that // indicates conservation of residues by uppercase, lowercase, and '~' template std::string ConservationSequence(const CountProfile& cp, const SubstitutionMatrix& sm); // Prints counts and neff in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const CountProfile& cp); } // namespace cs #endif // CS_COUNT_PROFILE_H_ hhsuite-2.0.16/src/cs/stride_iter.h0000664172256617226630000000404112110430072021436 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_STRIDE_ITER_H_ #define CS_STRIDE_ITER_H_ #include template class stride_iter { public: // public typedefs typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::pointer pointer; typedef std::random_access_iterator_tag iterator_category; typedef stride_iter self; // constructors stride_iter() : m_(NULL), step_(0) {} stride_iter(const self& x) : m_(x.m_), step_(x.step_) {} stride_iter(Iter_T x, difference_type n) : m_(x), step_(n) {} // operators self& operator++() { m_ += step_; return *this; } self operator++(int) { self tmp(*this); m_ += step_; return tmp; } self& operator+=(difference_type x) { m_ += x * step_; return *this; } self& operator--() { m_ -= step_; return *this; } self operator--(int) { self tmp(*this); m_ -= step_; return tmp; } self& operator-=(difference_type x) { m_ -= x * step_; return *this; } reference operator[](difference_type n) { return m_[n * step_]; } reference operator*( ) { return *m_; } self operator+(difference_type y) const { return self(m_ + y*step_, step_); } self operator-(difference_type y) const { return self(m_ - y*step_, step_); } // friend operators friend bool operator==(const self& x, const self& y) { assert(x.step_ == y.step_); return x.m_ == y.m_; } friend bool operator!=(const self& x, const self& y) { assert(x.step_ == y.step_); return x.m_ != y.m_; } friend bool operator<(const self& x, const self& y) { assert(x.step_ == y.step_); return x.m_ < y.m_; } friend difference_type operator-(const self& x, const self& y) { assert(x.step_ == y.step_); return (x.m_ - y.m_) / x.step_; } private: Iter_T m_; difference_type step_; }; #endif // CS_STRIDE_ITER_H_ hhsuite-2.0.16/src/cs/count_profile-inl.h0000664172256617226630000001551712110430072022563 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_COUNT_PROFILE_INL_H_ #define CS_COUNT_PROFILE_INL_H_ #include "count_profile.h" #include "alignment-inl.h" #include "profile-inl.h" #include "sequence-inl.h" namespace cs { template CountProfile::CountProfile(const Alignment& ali, bool pos_weights, bool neff_sum_pairs) : counts(ali.nmatch(), 0.0f), neff(ali.nmatch()) { // Add counts and neff from alignment to count profile if (pos_weights) { // use position-specific sequence weights Matrix w; Vector neff_tmp(PositionSpecificWeightsAndDiversity(ali, w)); assert(neff.size()); for (size_t i = 0; i < counts.length(); ++i) { neff[i] = neff_tmp[i]; for (size_t k = 0; k < ali.nseqs(); ++k) if (ali[i][k] < Abc::kAny) counts[i][ali[i][k]] += w[i][k]; } } else { // use faster global sequence weights Vector wg; double neff_glob = GlobalWeightsAndDiversity(ali, wg, neff_sum_pairs); for (size_t i = 0; i < counts.length(); ++i) { neff[i] = neff_glob; for (size_t k = 0; k < ali.nseqs(); ++k) if (ali[i][k] < Abc::kAny) counts[i][ali[i][k]] += wg[k]; } } // Normalize counts to effective number of sequences Normalize(counts, neff); } template void CountProfile::Read(FILE* fin) { // Parse and check header information if (!StreamStartsWith(fin, "CountProfile")) throw Exception("Stream does not start with class id 'CountProfile'!"); char buffer[KB]; fgetline(buffer, KB, fin); if (strstr(buffer, "NAME")) { name = ReadString(buffer, "NAME", "Unable to parse count profile 'NAME'!"); fgetline(buffer, KB, fin); } size_t len = ReadInt(buffer, "LENG", "Unable to parse count profile 'LENG'!"); fgetline(buffer, KB, fin); size_t nalph = ReadInt(buffer, "ALPH", "Unable to parse count profile 'ALPH'!"); if (nalph != Abc::kSize) throw Exception("Alphabet size of serialized count profile should be %d " "but is actually %d!", Abc::kSize, nalph); // If everything went fine we can resize our data memmbers counts.Resize(len); neff.Resize(len); // Read counts and effective number of sequences for each column size_t i = 0; const char* ptr = buffer; fgetline(buffer, KB, fin); // skip alphabet description line while (fgetline(buffer, KB, fin) && buffer[0] != '/' && buffer[1] != '/') { ptr = buffer; i = strtoi(ptr) - 1; assert(i < len); // TODO: include ANY char in seialization for (size_t a = 0; a < Abc::kSize; ++a) // TODO: save counts as log base e instead of log base 2 counts[i][a] = pow(2, static_cast(-strastoi(ptr)) / kScale); counts[i][Abc::kAny] = 0.0f; neff[i] = static_cast(strtoi(ptr)) / kScale; } Normalize(counts, neff); // normalize probs to counts if (i != len - 1) throw Exception("Count profile should have %i columns but actually has %i!", len, i+1); } template void CountProfile::Write(FILE* fout) const { // Print header section fputs("CountProfile\n", fout); if (!name.empty()) fprintf(fout, "NAME\t%s\n", name.c_str()); fprintf(fout, "LENG\t%zu\n", counts.length()); fprintf(fout, "ALPH\t%zu\n", Abc::kSize); // Print alphabet description line fputs("COUNTS", fout); for (size_t a = 0; a < Abc::kSize; ++a) fprintf(fout, "\t%c", Abc::kIntToChar[a]); fputs("\tNEFF\n", fout); // Print counts matrix and neff vector as negative logs scaled by 'kScale' for (size_t i = 0; i < counts.length(); ++i) { fprintf(fout, "%zu", i+1); // TODO: include ANY char in seialization for (size_t a = 0; a < Abc::kSize; ++a) { // TODO: save counts as log base e instead of log base 2 if (counts[i][a] == 0.0) fputs("\t*", fout); else fprintf(fout, "\t%d", -iround(log2(counts[i][a] / neff[i]) * kScale)); } fprintf(fout, "\t%d\n", iround(neff[i] * kScale)); } fputs("//\n", fout); } // Returns the average Neff in given count profile. template inline double Neff(const CountProfile& cp) { double neff_sum = 0.0; for (size_t i = 0; i < cp.neff.size(); ++i) neff_sum += cp.neff[i]; return neff_sum / cp.neff.size(); } // Builds and returns a consensus string of the given count profile by // calculating at each position the alphabet character that deviates most strongly // from its background probability. template std::string ConsensusSequence(const CountProfile& cp, const SubstitutionMatrix& sm) { Profile prof(cp.counts); Normalize(prof, 1.0); std::string cons(prof.length(), ' '); for (size_t i = 0; i < prof.length(); ++i) { double maxw = 0.0; size_t maxa = 0; for (size_t a = 0; a < Abc::kSize; ++a) { if (prof[i][a] - sm.p(a) > maxw) { maxw = prof[i][a] - sm.p(a); maxa = a; } } cons[i] = Abc::kIntToChar[maxa]; } return cons; } // Builds and returns a conservation string for given count profile that // indicates conservation of residues by uppercase, lowercase, and '~' template std::string ConservationSequence(const CountProfile& cp, const SubstitutionMatrix& sm) { static const char kMixedColChar = '~'; // Precompute similarity matrix for amino acid pairs Matrix sim(Abc::kSize, Abc::kSize); for (size_t a = 0; a < Abc::kSize; ++a) for (size_t b = 0; b < Abc::kSize; ++b) sim[a][b] = sm.q(a,b) * sm.q(a,b) / sm.q(a,a) / sm.q(b,b); // Normalize count profile Profile prof(cp.counts); Normalize(prof, 1.0); std::string cons(prof.length(), ' '); // Now compute conservation string for (size_t i = 0; i < prof.length(); ++i) { double maxw = 0.0; size_t maxa = 0; for (size_t a = 0; a < Abc::kSize; ++a) { if (prof[i][a] - sm.p(a) > maxw) { maxw = prof[i][a] - sm.p(a); maxa = a; } } maxw = 0.0; for (size_t b = 0; b < Abc::kSize; ++b) maxw += prof[i][b] * sim[maxa][b] * sim[maxa][b]; if (maxw > 0.6) cons[i] = toupper(Abc::kIntToChar[maxa]); else if (maxw > 0.4) cons[i] = tolower(Abc::kIntToChar[maxa]); else cons[i] = kMixedColChar; } return cons; } // Prints counts and neff in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const CountProfile& cp) { out << "CountProfile" << std::endl; out << "name:\t" << cp.name << std::endl; for (size_t a = 0; a < Abc::kSizeAny; ++a) out << "\t" << Abc::kIntToChar[a]; out << "\tNeff" << std::endl; for (size_t i = 0; i < cp.counts.length(); ++i) { out << i+1; for (size_t a = 0; a < Abc::kSizeAny; ++a) out << strprintf("\t%6.4f", cp.counts[i][a]); out << strprintf("\t%-5.2f\n", cp.neff[i]); } return out; } } // namespace cs #endif // CS_COUNT_PROFILE_INL_H_ hhsuite-2.0.16/src/cs/as.cc0000664172256617226630000003527512110430072017677 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "cs.h" #include "as.h" namespace cs { // Size of AS62 alphabet const size_t AS62::kSize = 62; // Size of AS62 alphabet including wildcard character ANY const size_t AS62::kSizeAny = 63; // Integer code of ANY character const uint8_t AS62::kAny = 62; // Integer code of GAP const uint8_t AS62::kGap = 63; // Integer code of ENDGAP const uint8_t AS62::kEndGap = 64; // For converting from ASCII to integer-based AS62-code const uint8_t AS62::kCharToInt[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 63, 63, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // For converting from integer code back to ASCII character const char AS62::kIntToChar[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '*', '-', '-' }; // For testing if ASCII character is from AS62 alphabet const bool AS62::kValidChar[] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; // Size of AS90 alphabet const size_t AS90::kSize = 90; // Size of AS90 alphabet including wildcard character ANY const size_t AS90::kSizeAny = 91; // Integer code of ANY character const uint8_t AS90::kAny = 90; // Integer code of GAP const uint8_t AS90::kGap = 91; // Integer code of ENDGAP const uint8_t AS90::kEndGap = 02; // For converting from ASCII to integer-based AS90-code const uint8_t AS90::kCharToInt[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 90, 9, 10, 91, 91, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // For converting from integer code back to ASCII character const char AS90::kIntToChar[] = { '!', '"', '#', '$', '%', '&', '\'', '(', ')', '+', ',', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '*', '-', '-' }; // For testing if ASCII character is from AS90 alphabet const bool AS90::kValidChar[] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; // Size of AS219 alphabet const size_t AS219::kSize = 219; // Size of AS219 alphabet including wildcard character ANY const size_t AS219::kSizeAny = 220; // Integer code of ANY character const uint8_t AS219::kAny = 219; // Integer code of GAP const uint8_t AS219::kGap = 220; // Integer code of ENDGAP const uint8_t AS219::kEndGap = 221; // For converting from ASCII to integer-based AS219-code const uint8_t AS219::kCharToInt[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 219, 9, 10, 220, 220, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218 }; // For converting from integer code back to ASCII character const int AS219::kIntToChar[] = { 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 42, 45, 45 // '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', '\x28', '\x29', '\x2B', '\x2C', '\x2F', '\x30', '\x31', '\x32', '\x33', // '\x34', '\x35', '\x36', '\x37', '\x38', '\x39', '\x3A', '\x3B', '\x3C', '\x3D', '\x3F', '\x40', '\x41', '\x42', '\x43', '\x44', // '\x45', '\x46', '\x47', '\x48', '\x49', '\x4A', '\x4B', '\x4C', '\x4D', '\x4E', '\x4F', '\x50', '\x51', '\x52', '\x53', '\x54', // '\x55', '\x56', '\x57', '\x58', '\x59', '\x5A', '\x5B', '\x5C', '\x5D', '\x5E', '\x5F', '\x60', '\x61', '\x62', '\x63', '\x64', // '\x65', '\x66', '\x67', '\x68', '\x69', '\x6A', '\x6B', '\x6C', '\x6D', '\x6E', '\x6F', '\x70', '\x71', '\x72', '\x73', '\x74', // '\x75', '\x76', '\x77', '\x78', '\x79', '\x7A', '\x7B', '\x7C', '\x7D', '\x7E', '\x7F', '\x80', '\x81', '\x82', '\x83', '\x84', // '\x85', '\x86', '\x87', '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', '\x91', '\x92', '\x93', '\x94', // '\x95', '\x96', '\x97', '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F', '\xA0', '\xA1', '\xA2', '\xA3', '\xA4', // '\xA5', '\xA6', '\xA7', '\xA8', '\xA9', '\xAA', '\xAB', '\xAC', '\xAD', '\xAE', '\xAF', '\xB0', '\xB1', '\xB2', '\xB3', '\xB4', // '\xB5', '\xB6', '\xB7', '\xB8', '\xB9', '\xBA', '\xBB', '\xBC', '\xBD', '\xBE', '\xBF', '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', // '\xC5', '\xC6', '\xC7', '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', // '\xD5', '\xD6', '\xD7', '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', // '\xE5', '\xE6', '\xE7', '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', // '\xF5', '\xF6', '\xF7', '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', '*', '-', '-' }; // For testing if ASCII character is from AS219 alphabet const bool AS219::kValidChar[] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }; } // namespace cs hhsuite-2.0.16/src/cs/ran.h0000664172256617226630000000267412110430072017713 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "utils.h" namespace cs { // Implementation of the highest quality recommended random number generator // from Numerical Recipes. The period of the generator is 3.138e57. struct Ran { typedef unsigned long long int Ullong; Ran(Ullong j) : v(4101842887655102017LL), w(1) { u = j ^ v; int64(); v = u; int64(); w = v; int64(); } inline Ullong int64() { u = u * 2862933555777941757LL + 7046029254386353087LL; v ^= v >> 17; v ^= v << 31; v ^= v >> 8; w = 4294957665U*(w & 0xffffffff) + (w >> 32); Ullong x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4; return (x + v) ^ w; } inline double doub() { return 5.42101086242752217E-20 * int64(); } inline unsigned int int32() { return (unsigned int)int64(); } inline unsigned int operator() (unsigned int n) { return int32() % n; } Ullong u,v,w; }; // Normal diistribution generator also from Numerical Recipes. struct Gaussian : public Ran { typedef unsigned long long int Ullong; Gaussian(double mmu, double ssig, Ullong i) : Ran(i), mu(mmu), sig(ssig) {} double operator() () { double u,v,x,y,q; do { u = doub(); v = 1.7156*(doub()-0.5); x = u - 0.449871; y = std::abs(v) + 0.386595; q = SQR(x) + y*(0.19600*y-0.25472*x); } while (q > 0.27597 && (q > 0.27846 || SQR(v) > -4.*log(u)*SQR(u))); return mu + sig*v/u; } double mu,sig; }; } // namespace cs hhsuite-2.0.16/src/cs/context_profile-inl.h0000664172256617226630000001406712110430072023116 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_PROFILE_INL_H_ #define CS_CONTEXT_PROFILE_INL_H_ #include "context_profile.h" namespace cs { template void ContextProfile::Read(FILE* fin) { // Parse and check header information if (!StreamStartsWith(fin, "ContextProfile")) throw Exception("Stream does not start with class id 'ContextProfile'!"); char buffer[KB]; cs::fgetline(buffer, KB, fin); if (strstr(buffer, "NAME")) { name = ReadString(buffer, "NAME", "Unable to parse context profile 'NAME'!"); cs::fgetline(buffer, KB, fin); } prior = ReadDouble(buffer, "PRIOR", "Unable to parse context profile 'PRIOR'!"); cs::fgetline(buffer, KB, fin); if (strstr(buffer, "COLOR")) { std::string coldef; coldef = ReadString(buffer, "COLOR", "Unable to parse context profile 'COLOR'!"); color = Color(coldef); cs::fgetline(buffer, KB, fin); } is_log = ReadBool(buffer, "ISLOG", "Unable to parse context profile 'ISLOG'!"); cs::fgetline(buffer, KB, fin); size_t len = ReadInt(buffer, "LENG", "Unable to parse context profile 'LENG'!"); cs::fgetline(buffer, KB, fin); size_t nalph = ReadInt(buffer, "ALPH", "Unable to parse context profile 'ALPH'!"); if (is_log) prior = log(prior); assert(len & 1); if (nalph != Abc::kSize) throw Exception("Alphabet size of serialized context profile should be %d" "but is acutally %d!", Abc::kSize, nalph); // If everything went fine we can resize our data memmbers probs.Resize(len); // Read counts and effective number of sequences for each column const char* ptr = buffer; const size_t center = (len - 1) / 2; size_t i = 0; cs::fgetline(buffer, KB, fin); // skip alphabet description line while (cs::fgetline(buffer, KB, fin) && buffer[0] != '/' && buffer[1] != '/') { ptr = buffer; i = strtoi(ptr) - 1; assert(i < len); // TODO: include ANY char in seialization for (size_t a = 0; a < Abc::kSize; ++a) { // TODO: save probs as log base e instead of log base 2 if (is_log) probs[i][a] = log(pow(2 ,static_cast(-strastoi(ptr)) / kScale)); // probs[i][a] = static_cast(-strastoi(ptr)) / kScale; else probs[i][a] = pow(2, static_cast(-strastoi(ptr)) / kScale); // probs[i][a] = exp(static_cast(-strastoi(ptr)) / kScale); } probs[i][Abc::kAny] = is_log ? 0.0 : 1.0; // Set pseudocounts of central column if (i == center) { for (size_t a = 0; a < Abc::kSize; ++a) pc[a] = is_log ? exp(probs[i][a]) : probs[i][a]; pc[Abc::kAny] = 1.0; } } if (i != len - 1) throw Exception("Context profile should have %i columns but actually has %i!", len, i+1); } template void ContextProfile::Write(FILE* fout) const { // Print header section fputs("ContextProfile\n", fout); if (!name.empty()) fprintf(fout, "NAME\t%s\n", name.c_str()); fprintf(fout, "PRIOR\t%-10.8g\n", is_log ? exp(prior) : prior); fprintf(fout, "COLOR\t%s\n", color.ToString().c_str()); fprintf(fout, "ISLOG\t%c\n", is_log ? 'T' : 'F'); fprintf(fout, "LENG\t%d\n", static_cast(probs.length())); fprintf(fout, "ALPH\t%d\n", static_cast(Abc::kSize)); // Print alphabet description line fputs("PROBS", fout); for (size_t a = 0; a < Abc::kSize; ++a) fprintf(fout, "\t%c", Abc::kIntToChar[a]); fputs("\n", fout); // Print probs as negative logs scaled by 'kScale' for (size_t i = 0; i < probs.length(); ++i) { fprintf(fout, "%zu", i+1); // TODO: include ANY char in serialization for (size_t a = 0; a < Abc::kSize; ++a) { // TODO: save probs as log base e instead of log base 2a // double log_val = is_log ? probs[i][a] : log(probs[i][a]); double log_val = is_log ? log2(exp(probs[i][a])) : log2(probs[i][a]); if (log_val == -INFINITY) fputs("\t*", fout); else fprintf(fout, "\t%i", -iround(log_val * kScale)); } fputs("\n", fout); } fputs("//\n", fout); } // Prints context profile probabilities in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const ContextProfile& cp) { out << "ContextProfile" << std::endl; out << "name:\t" << cp.name << std::endl; out << "prior:\t" << strprintf("%-10.8g\n", cp.is_log ? exp(cp.prior) : cp.prior); out << "color:\t" << cp.color << std::endl; out << "is_log:\t" << (cp.is_log ? "true" : "false") << std::endl; const int c = (cp.probs.length() - 1) / 2; for (size_t i = 0; i < cp.probs.length(); ++i) out << "\t " << abs(static_cast(i) - c); out << std::endl; for (size_t a = 0; a < Abc::kSizeAny; ++a) { out << Abc::kIntToChar[a]; for (size_t i = 0; i < cp.probs.length(); ++i) { double val = cp.is_log ? exp(cp.probs[i][a]) : cp.probs[i][a]; out << strprintf("\t%6.4f", val); } out << std::endl; } return out; } // Transforms probabilites in context profile to log-space and sets 'is_log' flag. template inline void TransformToLog(ContextProfile& cp) { if (!cp.is_log) { cp.prior = log(cp.prior); for (size_t i = 0; i < cp.probs.length(); ++i) for (size_t a = 0; a < Abc::kSizeAny; ++a) cp.probs[i][a] = log(cp.probs[i][a]); cp.is_log = true; } } // Transforms probabilites in context profile to lin-space and sets 'is_log' flag. template inline void TransformToLin(ContextProfile& cp) { if (cp.is_log) { cp.prior = exp(cp.prior); for (size_t i = 0; i < cp.probs.length(); ++i) for (size_t a = 0; a < Abc::kSizeAny; ++a) cp.probs[i][a] = exp(cp.probs[i][a]); cp.is_log = false; } } } // namespace cs #endif // CS_CONTEXT_PROFILE_INL_H_ hhsuite-2.0.16/src/cs/exception.h0000664172256617226630000000211112110430072021113 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_EXCEPTION_H_ #define CS_EXCEPTION_H_ #include #include #include // This is a simple but useful class for construction of standard exceptions // The constructor is implemented to take variadic arguments // in the style of printf for simple message construction class Exception : public std::exception { public: Exception(const std::string &m) : msg(m), c(0) {} Exception(const char *str, ...) : c(0) { char *buffer = new char[1024]; va_list ap; va_start(ap, str); vsprintf(buffer, str, ap); va_end(ap); msg = buffer; delete [] buffer; } Exception(const int type, const char *str, ...) : c(type) { char *buffer = new char[1024]; va_list ap; va_start(ap, str); vsprintf(buffer, str, ap); va_end(ap); msg = buffer; delete [] buffer; } virtual ~Exception() throw() {}; virtual const char* what() const throw() { return msg.c_str(); } virtual int code() const { return c; } private: std::string msg; int c; }; #endif // CS_EXCEPTION_H_ hhsuite-2.0.16/src/cs/context_library-inl.h0000664172256617226630000003053012110430072023113 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_CONTEXT_LIBRARY_INL_H_ #define CS_CONTEXT_LIBRARY_INL_H_ #include "context_library.h" #include "abstract_state_matrix-inl.h" #include "context_profile-inl.h" #include "pseudocounts.h" namespace cs { template ContextLibrary::ContextLibrary(size_t size, size_t wlen) : wlen_(wlen), profiles_(size, ContextProfile(wlen)) {} template ContextLibrary::ContextLibrary(FILE* fin) : wlen_(0), profiles_() { Read(fin); } template ContextLibrary::ContextLibrary(size_t size, size_t wlen, const LibraryInit& init) : wlen_(wlen), profiles_(size, ContextProfile(wlen)) { init(*this); } template void ContextLibrary::SetProfile(size_t k, const ContextProfile& p) { assert_eq(wlen(), p.probs.length()); assert(k < size()); profiles_[k] = p; } template void ContextLibrary::Read(FILE* fin) { // Parse and check header information if (!StreamStartsWith(fin, "ContextLibrary")) throw Exception("Stream does not start with class id 'ContextLibrary'!"); char buffer[KB]; size_t size = 0; if (cs::fgetline(buffer, KB, fin)) size = ReadInt(buffer, "SIZE", "Unable to parse context library 'SIZE'!"); if (cs::fgetline(buffer, KB, fin)) wlen_ = ReadInt(buffer, "LENG", "Unable to parse context library 'LENG'!"); // Read context profiles profiles_.Resize(size); size_t k = 0; for (; k < size && !feof(fin); ++k) profiles_[k] = ContextProfile(fin); if (k != size) throw Exception("Serialized context library should have %i profiles but" "actually has %i!", size, k); } template void ContextLibrary::Write(FILE* fout) const { // Write header fputs("ContextLibrary\n", fout); fprintf(fout, "SIZE\t%d\n", static_cast(size())); fprintf(fout, "LENG\t%d\n", static_cast(wlen())); // Serialize profiles for (size_t k = 0; k < profiles_.size(); ++k) profiles_[k].Write(fout); } // Transforms probabilites in context profiles to log-space and sets 'is_log' flag. template inline void TransformToLog(ContextLibrary& lib) { for (size_t k = 0; k < lib.size(); ++k) TransformToLog(lib[k]); } // Transforms probabilites in context profiles to lin-space and sets 'is_log' flag. template inline void TransformToLin(ContextLibrary& lib) { for (size_t k = 0; k < lib.size(); ++k) TransformToLin(lib[k]); } template void ContextLibrary::SortByEntropy() { typedef std::pair EntropyIndexPair; std::vector pairs; for (size_t k = 0; k < profiles_.size(); ++k) pairs.push_back(std::make_pair(Entropy(profiles_[k].pc), k)); sort(pairs.begin(), pairs.end()); Vector > profiles_sorted(profiles_.size()); for (size_t k = 0; k < pairs.size(); ++k) profiles_sorted[k] = profiles_[pairs[k].second]; profiles_ = profiles_sorted; } template void SamplingLibraryInit::operator() (ContextLibrary& lib) const { LOG(DEBUG) << "Initializing context library with by sampling " << lib.size() << " profile windows from training set ..."; assert(trainset_.size() >= lib.size()); Ran ran(seed_); Vector used(trainset_.size(), false); size_t k = 0; while (k < lib.size()) { size_t r = ran(lib.size()); assert(r < trainset_.size()); assert_eq(lib.wlen(), trainset_[r].counts.length()); if (!used[r]) { ContextProfile p(pc_.AddTo(trainset_[r], admix_)); LOG(DEBUG) << p; p.prior = 1.0 / lib.size(); lib.SetProfile(k, p); used[r] = true; ++k; } } LOG(DEBUG) << lib; } template void GaussianLibraryInit::operator() (ContextLibrary& lib) const { Gaussian gauss(0, sigma_, seed_); for (size_t k = 0; k < lib.size(); ++k) { ContextProfile cp(lib.wlen()); cp.is_log = true; cp.prior = log(1.0 / lib.size()); for (size_t j = 0; j < lib.wlen(); ++j) { for (size_t a = 0; a < Abc::kSize; ++a) cp.probs[j][a] = log(sm_.p(a)) + gauss(); cp.probs[j][Abc::kAny] = 0.0; } TransformToLin(cp); Normalize(cp.probs, 1.0); lib.SetProfile(k, cp); } } template double CalculatePosteriorProbs(const ContextLibrary& lib, const Emission& emission, const CountsInput& input, CenterPos i, double* pp) { // Calculate posterior probability ppi[k] of state k given context window // around position 'i' double max = -FLT_MAX; for (size_t k = 0; k < lib.size(); ++k) { assert(lib[k].is_log); pp[k] = lib[k].prior + emission(lib[k].probs, input, i); if (pp[k] > max) max = pp[k]; // needed for log-sum-exp trick } // Log-sum-exp trick begins here double sum = 0.0; for (size_t k = 0; k < lib.size(); ++k) sum += exp(pp[k] - max); double tmp = max + log(sum); for (size_t k = 0; k < lib.size(); ++k) pp[k] = exp(pp[k] - tmp); return tmp; } template Sequence TranslateIntoStateSequence(const CountsInput& input, const ContextLibrary& lib, const Emission& emission) { Sequence as_seq(input.length()); Vector pp(AS::kSize); for (size_t i = 0; i < input.length(); ++i) { // Calculate posterior probabilities given sequence window around 'i' CalculatePosteriorProbs(lib, emission, input, i, &pp[0]); // Find state with maximal posterior prob and assign it to as_seq[i] size_t k_max = 0; double p_max = pp[0]; for (size_t k = 1; k < AS::kSize; ++k) { if (pp[k] > p_max) { k_max = k; p_max = pp[k]; } } as_seq[i] = k_max; } return as_seq; } template Profile TranslateIntoStateProfile(const CountsInput& input, const ContextLibrary& lib, const Emission& emission, const AbstractStateMatrix& matrix) { Profile asp(input.length(), 0.0); Vector pp(lib.size()); // For each i calculate posteriors and translate them into abstract state probs for (size_t i = 0; i < input.length(); ++i) { CalculatePosteriorProbs(lib, emission, input, i, &pp[0]); for (size_t a = 0; a < AS::kSize; ++a) for (size_t k = 0; k < lib.size(); ++k) asp[i][a] += pp[k] * matrix.r(a,k); } return asp; } // Learns a SOM from a full-blown context-library. template void LearnContextMap(const ContextLibrary& lib, ContextLibrary& som, const CoEmission& co_emission, int nsteps, // number of learning steps double sigma, // initial neighborhood gaussian sigma double alpha, // initial learning rate double tau1, // timescale parameter for sigma double tau2, // timescale parameter for alpha unsigned int seed) { assert_eq(lib.wlen(), som.wlen()); const int num_colors = iround(pow(som.size(), 1.0 / 3)); // colors per channel if (tau1 == 0) tau1 = nsteps; if (tau2 == 0) tau2 = nsteps; Ran ran(seed); // for picking input profiles // Perform 'nsteps' training iterations for (int n = 0; n < nsteps; ++n) { // Pick an input profile at random const ContextProfile& x = lib[ran(lib.size())]; // Find best matching SOM profile int rmax = 0, gmax = 0, bmax = 0; double pmax = -FLT_MAX; for (int r = 0; r < num_colors; ++r) { for (int g = 0; g < num_colors; ++g) { for (int b = 0; b < num_colors; ++b) { size_t k = r * num_colors * num_colors + g * num_colors + b; assert(!x.is_log); assert(!som[k].is_log); double p = co_emission(x.probs, som[k].probs); if (p > pmax) { rmax = r; gmax = g; bmax = b; pmax = p; } } } } // Set global learning rate 'alpha_n' and neighborhood width 'sigma_n' double alpha_n = alpha * exp(-n / tau2); double sigma_n = sigma * exp(-n / tau1); LOG(INFO) << strprintf("alpha[%3zu]=%8.5f sigma[%3zu]=%8.5f", n, alpha_n, n, sigma_n); // Update SOM profiles in neighborhood of best matching SOM profile for (int r = 0; r < num_colors; ++r) { for (int g = 0; g < num_colors; ++g) { for (int b = 0; b < num_colors; ++b) { size_t k = r * num_colors * num_colors + g * num_colors + b; ContextProfile& cp = som[k]; double sqr_dist = SQR(rmax - r) + SQR(gmax - g) + SQR(bmax - b); double h = exp(-sqr_dist / (2 * SQR(sigma_n))); LOG(INFO) << strprintf("n=%zu dist=%8.5f k=%zu h=%8.5f", n, sqrt(sqr_dist), k, h); cp.prior += alpha_n * h * (x.prior - cp.prior); for (size_t i = 0; i < cp.probs.length(); ++i) for (size_t a = 0; a < Abc::kSize; ++a) cp.probs[i][a] += alpha_n * h * (x.probs[i][a] - cp.probs[i][a]); } } } } // Set pc probs in SOM profiles for (size_t k = 0; k < som.size(); ++k) for (size_t a = 0; a < Abc::kSize; ++a) som[k].pc[a] = som[k].probs[som.center()][a]; } // Maps each context profile in 'lib' to an RBG color based color-space SOM 'som' template void AssignContextColors(ContextLibrary& lib, const ContextLibrary& som, const CoEmission& co_emission, double color_offset) { const int num_colors = iround(pow(som.size(), 1.0 / 3)); // colors per channel // Each context profile receives the color of the best matching SOM profile. for (size_t k = 0; k < lib.size(); ++k) { int rmax = 0, gmax = 0, bmax = 0; double pmax = -FLT_MAX; for (int r = 0; r < num_colors; ++r) { for (int g = 0; g < num_colors; ++g) { for (int b = 0; b < num_colors; ++b) { size_t l = r * num_colors * num_colors + g * num_colors + b; assert(!lib[k].is_log); assert(!som[l].is_log); double p = co_emission(lib[k].probs, som[l].probs); if (p > pmax) { rmax = r; gmax = g; bmax = b; pmax = p; } } } } // Set color value of profile 'k' Color color(color_offset + (1.0 - color_offset) * (rmax + 1) / num_colors, color_offset + (1.0 - color_offset) * (gmax + 1) / num_colors, color_offset + (1.0 - color_offset) * (bmax + 1) / num_colors); lib[k].color = color; } } // Assigns each context profile a unique name based on its position in learned SOM template void AssignContextNames(ContextLibrary& lib, const ContextLibrary& som, const CoEmission& co_emission) { const char kVowels[] = { 'A', 'E', 'I', 'O', 'U', 'Y'}; const char kConsonants[] = { 'B', 'C', 'D', 'F', 'G', 'H' }; const int num_colors = iround(pow(som.size(), 1.0 / 3)); // colors per channel Vector suffixes(som.size(), 0); // Each context profile receives the color of the best matching SOM profile. for (size_t k = 0; k < lib.size(); ++k) { int rmax = 0, gmax = 0, bmax = 0; double pmax = -FLT_MAX; for (int r = 0; r < num_colors; ++r) { for (int g = 0; g < num_colors; ++g) { for (int b = 0; b < num_colors; ++b) { size_t l = r * num_colors * num_colors + g * num_colors + b; assert(!lib[k].is_log); assert(!som[l].is_log); double p = co_emission(lib[k].probs, som[l].probs); if (p > pmax) { rmax = r; gmax = g; bmax = b; pmax = p; } } } } // Increment suffix counter size_t l = rmax * num_colors * num_colors + gmax * num_colors + bmax; suffixes[l]++; // Build name from position in lattice as "vowel + consonant + vowel + suffix" std::string name; name += kVowels[num_colors - rmax - 1]; name += kConsonants[num_colors - gmax - 1]; name += kVowels[num_colors - bmax - 1]; name += strprintf("%d", suffixes[l]); lib[k].name = name; } } } // namespace cs #endif // CS_CONTEXT_LIBRARY_INL_H_ hhsuite-2.0.16/src/cs/globals.h0000664172256617226630000000262712110430072020554 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_GLOBALS_H_ #define CS_GLOBALS_H_ #include namespace cs { const int KB = 1024; const int MB = KB * KB; const int GB = KB * KB * KB; const int kMaxInt = 0x7FFFFFFF; const int kMinInt = -kMaxInt - 1; const int kScale = 1000; // scaling factor for serialization const int kCharSize = sizeof(char); const int kShortSize = sizeof(short); const int kIntSize = sizeof(int); const int kFloatSize = sizeof(float); const int kDoubleSize = sizeof(double); const int kPointerSize = sizeof(void*); #ifdef _WIN32 const char kDirSep = '\\'; #else const char kDirSep = '/'; #endif // A macro to disallow the evil copy constructor and operator= functions // This should be used in the private: declarations for a class #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) // A macro to disallow all the implicit constructors, namely the // default constructor, copy constructor and operator= functions. // // This should be used in the private: declarations for a class // that wants to prevent anyone from instantiating it. This is // especially useful for classes containing only static methods. #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ TypeName(); \ DISALLOW_COPY_AND_ASSIGN(TypeName) } // namespace cs #endif // CS_GLOBALS_H_ hhsuite-2.0.16/src/cs/substitution_matrix-inl.h0000664172256617226630000001257212110430072024051 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SUBSTITUTION_MATRIX_INL_H_ #define CS_SUBSTITUTION_MATRIX_INL_H_ #include "substitution_matrix.h" namespace cs { template SubstitutionMatrix::SubstitutionMatrix(double l) : q_(Abc::kSizeAny, Abc::kSizeAny, 0.0), s_(Abc::kSizeAny, Abc::kSizeAny, 0.0), rx_(Abc::kSizeAny, Abc::kSizeAny, 0.0), ry_(Abc::kSizeAny, Abc::kSizeAny, 0.0), px_(Abc::kSizeAny, 0.0), py_(Abc::kSizeAny, 0.0), lambda_(l) {} template SubstitutionMatrix::~SubstitutionMatrix() {} template void SubstitutionMatrix::InitFromTargetFreqs() { // Check transition probability matrix, renormalize P double sumab = 0.0; for (size_t a = 0; a < Abc::kSize; a++) for (size_t b = 0; b < Abc::kSize; ++b) sumab += q_[a][b]; for (size_t a = 0; a < Abc::kSize; ++a) for (size_t b = 0; b < Abc::kSize; ++b) q_[a][b] /= sumab; // Calculate background frequencies for (size_t a = 0; a < Abc::kSize; ++a) { px_[a] = 0.0; for (size_t b = 0; b < Abc::kSize; ++b) px_[a] += q_[a][b]; } Normalize(&px_[0], Abc::kSize); for (size_t b = 0; b < Abc::kSize; ++b) { py_[b] = 0.0; for (size_t a = 0; a < Abc::kSize; ++a) py_[b] += q_[a][b]; } Normalize(&py_[0], Abc::kSize); // Precompute conditional probability matrix Px for (size_t a = 0; a < Abc::kSize; ++a) for (size_t b = 0; b < Abc::kSize; ++b) rx_[b][a] = q_[a][b] / px_[a]; // Px(b|a) for (size_t b = 0; b < Abc::kSize; ++b) rx_[b][Abc::kAny] = py_[b]; // Px(b|X) = Py(b) for (size_t a = 0; a < Abc::kSize; ++a) rx_[Abc::kAny][a] = 1.0; // Px(X|a) = 1.0 // Precompute conditional probability matrix Py for (size_t a = 0; a < Abc::kSize; ++a) for (size_t b = 0; b < Abc::kSize; ++b) ry_[a][b] = q_[a][b] / py_[b]; // Py(a|b) for (size_t a = 0; a < Abc::kSize; ++a) ry_[a][Abc::kAny] = px_[a]; // Py(a|X) = Px(a) for (size_t b = 0; b < Abc::kSize; ++b) ry_[Abc::kAny][b] = 1.0; // Py(X|b) = 1.0 // Calculate scoring matrix as S[a][b] = (1 / lambda) * log(P(a,b) / (P(a)*P(b))) for (size_t a = 0; a < Abc::kSize; ++a) for (size_t b = 0; b < Abc::kSize; ++b) s_[a][b] = (1.0 / lambda_) * log(q_[a][b] / (px_[a] * py_[b])); LOG(DEBUG1) << *this; } // template // void SubstitutionMatrix::InitFromScoresAndBackgroundFreqs() { // // Calculate target frequencies // for (size_t a = 0; a < Abc::kSize; ++a) // for (size_t b = 0; b < Abc::kSize; ++b) // p_[a][b] = pow(2.0, s_[a][b]) * f_[a] * f_[b]; // // Check transition probability matrix, renormalize P // double sumab = 0.0f; // for (size_t a = 0; a < Abc::kSize; a++) // for (size_t b = 0; b < Abc::kSize; ++b) sumab += p_[a][b]; // for (size_t a = 0; a < Abc::kSize; ++a) // for (size_t b = 0; b < Abc::kSize; ++b) p_[a][b] /= sumab; // // Precompute matrix R for amino acid pseudocounts: // for (size_t a = 0; a < Abc::kSize; ++a) // for (size_t b = 0; b < Abc::kSize; ++b) // r_[a][b] = p_[a][b] / f_[b]; // R[a][b] = P(a|b) // LOG(DEBUG1) << *this; // } template void SubstitutionMatrix::Print(std::ostream& out) const { out << "Background frequencies on query side (in %):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) out << strprintf("%-.1f\t", 100.0f * px_[a]); out << "\nBackground frequencies on database side (in %):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) out << strprintf("%-.1f\t", 100.0f * py_[a]); out << "\nSubstitution matrix log( q(a,b) / p(a)*p(b) ) (scaled by 1/lambda):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) { for (size_t b = 0; b < Abc::kSize; ++b) out << strprintf("%+5.1f\t", s_[a][b]); out << std::endl; } out << "Target frequency matrix q(a,b) (in %):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) { for (size_t b = 0; b < Abc::kSize; ++b) out << strprintf("%-.2f\t", 100.0f * q_[a][b]); out << std::endl; } out << "Matrix of conditional probs on query side P(a|b) = P(a,b)/p(b) (in %):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) { for (size_t b = 0; b < Abc::kSize; ++b) out << strprintf("%-.1f\t", 100.0f * rx_[a][b]); out << std::endl; } out << "Matrix of conditional probs on database side P(a|b) = P(a,b)/p(b) (in %):\n"; for (size_t a = 0; a < Abc::kSize; ++a) out << Abc::kIntToChar[a] << "\t"; out << std::endl; for (size_t a = 0; a < Abc::kSize; ++a) { for (size_t b = 0; b < Abc::kSize; ++b) out << strprintf("%-.1f\t", 100.0f * ry_[a][b]); out << std::endl; } } template double Neff(const SubstitutionMatrix& sm) { double neff = 0.0; for (size_t b = 0; b < Abc::kSize; ++b) { double tmp = 0.0; for (size_t a = 0; a < Abc::kSize; ++a) if (sm.r(a,b) > FLT_MIN) tmp -= sm.r(a,b) * log2(sm.r(a,b)); neff += sm.p(b) * pow(2.0, tmp); } return neff; } } // namespace cs #endif // CS_SUBSTITUTION_MATRIX_INL_H_ hhsuite-2.0.16/src/cs/aa.cc0000664172256617226630000001145112110430072017643 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "cs.h" #include "aa.h" namespace cs { // Size of alphabet excluding wildcard character ANY const size_t AA::kSize = 20; // Size of alphabet includding wildcard character ANY const size_t AA::kSizeAny = 21; // Integer code of ANY character const uint8_t AA::kAny = 20; // Integer code of GAP const uint8_t AA::kGap = 21; // Integer code of ENDGAP const uint8_t AA::kEndGap = 22; // For converting from ASCII to the amino acid code const uint8_t AA::kCharToInt[] = { /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 32 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, /* - . */ /* 48 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 64 */ 0, 0, 3, 4, 3, 6, 13, 7, 8, 9, 20, 11, 10, 12, 2, 20, /* A B C D E F G H I J K L M N O */ /* 80 */ 14, 5, 1, 15, 16, 4, 19, 17, 20, 18, 6, 0, 0, 0, 0, 0, /* P Q R S T U V W X Y Z */ /* 96 */ 0, 0, 3, 4, 3, 6, 13, 7, 8, 9, 20, 11, 10, 12, 2, 20, /* a b c d e f g h i j k l m n o */ /* 112 */ 14, 5, 1, 15, 16, 4, 19, 17, 20, 18, 6, 0, 0, 0, 0, 0, /* p q r s t u v w x y z */ /* 128 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 176 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 192 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 208 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 224 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // For converting from integer code back to ASCII character const char AA::kIntToChar[] = { 'A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', 'X', '-', '-' }; // For testing if ASCII character is from amino acid code const bool AA::kValidChar[] = { /* 0 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 16 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 32 */ false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, /* 48 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 64 */ false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, /* 80 */ true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, /* 96 */ false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, /* 112 */ true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, /* 128 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 144 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 160 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 176 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 192 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 208 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 224 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, /* 240 */ false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; // Functional groups of amino acid alphabet needed for coloring of profile logos const int AA::kFuncGroup[] = { 4, 8, 6, 5, 3, 6, 5, 4, 7, 1, 1, 8, 1, 2, 9, 4, 4, 2, 2, 1, 0 }; // Shorthand name for this amino acid alphabet const char AA::kName[] = "aa"; } // namespace cs hhsuite-2.0.16/src/cs/pseudocounts.h0000664172256617226630000000561212110430072021661 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_PSEUDOCOUNTS_H_ #define CS_PSEUDOCOUNTS_H_ namespace cs { // Forward declarations template class Sequence; template class Profile; template class CountProfile; // Calculates pseudocount admixture for profile column. struct Admix { public: Admix() {} virtual ~Admix() {} virtual double operator() (double neff) const = 0; }; // An abstract base class for pseudocount factories. template class Pseudocounts { public: Pseudocounts() {} virtual ~Pseudocounts() {} // Adds pseudocounts to sequence and returns normalized profile. Profile AddTo(const Sequence& seq, const Admix& pca) const { Profile rv(seq.length()); AddToSequence(seq, pca, rv); for(size_t i = 0; i < seq.length(); ++i) rv[i][Abc::kAny] = 0.0; Normalize(rv, 1.0); return rv; } // Adds pseudocounts to sequence and returns normalized profile. Profile AddTo(const CountProfile& cp, const Admix& pca) const { Profile rv(cp.counts.length()); AddToProfile(cp, pca, rv); for(size_t i = 0; i < cp.counts.length(); ++i) rv[i][Abc::kAny] = 0.0; Normalize(rv, 1.0); return rv; } private: // Adds pseudocounts to sequence and stores resulting frequencies in given // profile. virtual void AddToSequence(const Sequence& seq, const Admix& pca, Profile& p) const = 0; // Adds pseudocounts to alignment derived profile. virtual void AddToProfile(const CountProfile& cp, const Admix& pca, Profile& p) const = 0; DISALLOW_COPY_AND_ASSIGN(Pseudocounts); }; // Pseudocounts // Calculates constant pseudocount admixture independent of number of effective // sequences. struct ConstantAdmix : public Admix { ConstantAdmix(double a) : pca(a) {} virtual ~ConstantAdmix() {} virtual double operator() (double) const { return pca; } const double pca; }; // Calculates divergence-dependent pseudocount admixture as in CS-BLAST // tau = A * (B + 1) / (B + Neff) struct CSBlastAdmix : public Admix { CSBlastAdmix(double a, double b) : pca(a), pcb(b) {} virtual ~CSBlastAdmix() {} virtual double operator() (double neff) const { return MIN(1.0, pca * (pcb + 1.0) / (pcb + neff)); } double pca, pcb; }; // Calculates divergence-dependent pseudocount admixture as in HHsearch struct HHsearchAdmix : public Admix { HHsearchAdmix(double a, double b, double c = 1.0) : pca(a), pcb(b), pcc(c) {} virtual ~HHsearchAdmix() {} virtual double operator() (double neff) const { double rv = 0.0; if (pcc == 1.0) rv = MIN(1.0, pca / (1.0 + neff / pcb)); else rv = MIN(1.0, pca / (1.0 + pow(neff / pcb, pcc))); return rv; } double pca, pcb, pcc; }; } // namespace cs #endif // CS_PSEUDOCOUNTS_H_ hhsuite-2.0.16/src/cs/emission.h0000664172256617226630000000557412110430072020763 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_EMISSION_H_ #define CS_EMISSION_H_ #include "count_profile-inl.h" #include "profile-inl.h" #include "profile_column.h" #include "substitution_matrix-inl.h" namespace cs { // Functor for calculating multinomial emission probabilities for context profiles. template class Emission { public: // Constructs an emission object with positional window weights. Emission(size_t wlen, double w_center = 1.6, double w_decay = 0.85, const SubstitutionMatrix* sm = NULL) : center_((wlen - 1) / 2), weights_(wlen), logp_(0.0) { assert(wlen & 1); weights_[center_] = w_center; for (size_t i = 1; i <= center_; ++i) { double weight = w_center * pow(w_decay, i); weights_[center_ - i] = weight; weights_[center_ + i] = weight; } if (sm) { for (size_t a = 0; a < Abc::kSize; ++a) logp_[a] = log(sm->p(a)); } } // Calculates the sum of positional weights. float GetSumWeights() const { double sum = 0.0; for (size_t i = 0; i < weights_.size(); ++i) sum += weights_[i]; return sum; } // Calculates the log of the probability that profile 'p' emits the sequence // window centered at index 'idx' in 'seq'. Note that the normalization factor // that is usualy used in multinomial distributions is left out since it // cancels out anyway. double operator() (const Profile& p, const Sequence& seq, size_t idx) const { assert(p.length() & 1); assert_eq(weights_.size(), p.length()); const size_t beg = MAX(0, static_cast(idx - center_)); const size_t end = MIN(seq.length(), idx + center_ + 1); double rv = 0.0; for(size_t i = beg, j = beg - idx + center_; i < end; ++i, ++j) { rv += weights_[j] * (p[j][seq[i]] - logp_[seq[i]]); } return rv; } // Calculates the log of the probability that profile 'p' emits the counts in // a window centered at index 'idx' in 'c'. Note that the normalization factor // that is usualy used in multinomial distributions is left out since it // cancels out anyway. double operator() (const Profile& p, const CountProfile& cp, size_t idx) const { assert(p.length() & 1); assert_eq(weights_.size(), p.length()); const size_t beg = MAX(0, static_cast(idx - center_)); const size_t end = MIN(cp.counts.length(), idx + center_ + 1); double sum, rv = 0.0; for(size_t i = beg, j = beg - idx + center_; i < end; ++i, ++j) { sum = 0.0; for (size_t a = 0; a < Abc::kSize; ++a) sum += cp.counts[i][a] * (p[j][a] - logp_[a]); rv += weights_[j] * sum; } return rv; } size_t center_; // index of central column in context window Vector weights_; // positional window weights ProfileColumn logp_; // log of background frequencies }; // class Emission } // namespace cs #endif // CS_EMISSION_H_ hhsuite-2.0.16/src/cs/shared_ptr.h0000664172256617226630000000337012110430072021260 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_SHARED_PTR_H_ #define CS_SHARED_PTR_H_ #include // The shared_ptr class template stores a pointer to a dynamically allocated // object, typically with a C++ new-expression. The object pointed to is // guaranteed to be deleted when the last shared_ptr pointing to it is // destroyed or reset. template class shared_ptr { public: shared_ptr() : p_(NULL), c_(new long(0)) {} explicit shared_ptr(T* p) : p_(p), c_(new long(1)) {} ~shared_ptr() { if(!--*c_) { delete c_; delete p_; } } // Copy constructor shared_ptr(const shared_ptr& other) : p_(other.p_), c_(other.c_) { ++*c_; } // Generalized copy constructor template shared_ptr(const shared_ptr& other) : p_(other.get()), c_(other.use_count()) { ++*c_; } // Copy assignment shared_ptr& operator= (const shared_ptr &rhs) { if (this != &rhs) { if (!--*c_) { delete c_; delete p_; } p_ = rhs.p_; ++*(c_ = rhs.c_); } return *this; } // Generalized copy assignment template shared_ptr& operator= (const shared_ptr &rhs) { if (this != &rhs) { if (!--*c_) { delete c_; delete p_; } p_ = rhs.get(); ++*(c_ = rhs.use_count()); } return *this; } T& operator*() const { return *p_; } T* operator->() const { return p_; } T* get() const { return p_; } long use_count() const { return *c_; } bool unique() const { return *c_ == 1; } operator bool () const { return p_ != NULL; } // Template function for implicit conversion (see More Effectove C++ // page 176 for details). // template // operator shared_ptr() { return shared_ptr(p_); } private: T* p_; long* c_; }; #endif // CS_SHARED_PTR_H_ hhsuite-2.0.16/src/cs/alignment-inl.h0000664172256617226630000007432512110430072021673 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_ALIGNMENT_INL_H_ #define CS_ALIGNMENT_INL_H_ #include "alignment.h" #include "blast_hits.h" #include "sequence-inl.h" namespace cs { template Alignment::Alignment(FILE* fin, AlignmentFormat format) { Read(fin, format); } template Alignment::Alignment(size_t ncols, size_t nseqs) { // Fill alignment matrix with gaps and assign empty headers Resize(nseqs, ncols); for (size_t k = 0; k < nseqs; ++k) headers_[k] = ""; for (size_t i = 0; i < ncols; ++i) { col_idx_[i] = i; is_match_[i] = true; for (size_t k = 0; k < nseqs; ++k) seqs_[i][k] = Abc::kGap; } // Initialize index array for match columns SetMatchIndices(); } template Alignment::Alignment(const Sequence& seq) { std::vector headers; std::vector seqs; headers.push_back(seq.header()); seqs.push_back(seq.ToString()); Init(headers, seqs); } template Alignment::Alignment(const BlastHits& hits, bool best) { std::vector headers; std::vector seqs; typedef typename BlastHits::ConstHitIter HitIter; typedef typename BlastHits::ConstHspIter HspIter; for (HitIter hit = hits.begin(); hit != hits.end(); ++hit) { for (HspIter hsp = hit->hsps.begin(); hsp != hit->hsps.end(); ++hsp) { // Construct query anchored alignment string std::string seq(hsp->query_start - 1, '-'); for (size_t i = 0; i < hsp->length; ++i) if (hsp->query_seq[i] != '-') seq += hsp->subject_seq[i]; seq.append(hits.query_length() - seq.length(), '-'); headers.push_back(hit->definition); seqs.push_back(seq); if (best) break; } } Init(headers, seqs); } template void Alignment::Init(const std::vector& headers, const std::vector& seqs) { if (headers.size() != seqs.size()) throw Exception("Bad alignment: unequal number of headers and sequences!"); const size_t nseqs = seqs.size(); const size_t ncols = seqs[0].length(); for (size_t k = 1; k < nseqs; ++k) { if (seqs[k].length() != ncols) throw Exception("Alignment sequence %i has length %i but should have %i!", k+1, seqs[k].length(), ncols); } // Validate characters and convert to integer representation Resize(seqs.size(), seqs[0].length()); for (size_t k = 0; k < nseqs; ++k) { headers_[k] = headers[k]; for (size_t i = 0; i < ncols; ++i) { const char c = seqs[k][i]; col_idx_[i] = i; is_match_[i] = match_chr(c); if (Abc::kValidChar[static_cast(c)] || c == '-' || c == '.') seqs_[i][k] = Abc::kCharToInt[static_cast(c)]; else throw Exception("Invalid character %c at position %i of sequence '%s'", c, i, headers_[k].c_str()); } } // Replace gap with endgap for all gaps at either end of a sequence for (size_t k = 0; k < nseqs; ++k) { for (size_t i = 0; i < ncols && seqs_[i][k] == Abc::kGap; ++i) seqs_[i][k] = Abc::kEndGap; for (int i = ncols - 1; i >= 0 && seqs_[i][k] == Abc::kGap; --i) seqs_[i][k] = Abc::kEndGap; } // Name of this alignment is the name of the first sequence if not already set if (name_.empty()) { name_ = headers_[0]; } // Initialize index array for match columns SetMatchIndices(); } template void Alignment::SetMatchIndices() { const size_t match_cols = std::count(&is_match_[0], &is_match_[0] + ncols(), true); match_idx_.resize(match_cols); match_idx_ = col_idx_[is_match_]; } template void Alignment::Read(FILE* fin, AlignmentFormat format) { LOG(DEBUG4) << "Reading alignment from stream ..."; std::vector headers; std::vector seqs; switch (format) { case FASTA_ALIGNMENT: ReadFasta(fin, headers, seqs); break; case A2M_ALIGNMENT: ReadA2M(fin, headers, seqs); break; case A3M_ALIGNMENT: ReadA3M(fin, headers, seqs); break; case PSI_ALIGNMENT: ReadPsi(fin, headers, seqs); break; default: throw Exception("Unsupported alignment input format %i!", format); } Init(headers, seqs); LOG(DEBUG4) << *this; } template void Alignment::ReadFastaFlavors(FILE* fin, std::vector& headers, std::vector& seqs) { headers.clear(); seqs.clear(); char buffer[kBufferSize]; int c = '\0'; while (!feof(fin)) { // Read header while (fgetline(buffer, kBufferSize, fin)) { if (!strscn(buffer)) continue; if (buffer[0] == '#') { name_ = std::string(buffer + 1); } else if (buffer[0] == '>') { if (headers.empty() && strstr(buffer, ">ss_")) { while (fgetline(buffer, kBufferSize, fin)) if (buffer[0] == '>' && strstr(buffer, ">ss_") == NULL) break; } headers.push_back(std::string(buffer + 1)); break; } else { throw Exception("Header of sequence %i starts with:\n%s", headers.size() + 1, buffer); } } // Read sequence seqs.push_back(""); while (fgetline(buffer, kBufferSize, fin)) { seqs.back().append(buffer); c = getc(fin); if (c == EOF) break; ungetc(c, fin); if (static_cast(c) == '>') break; } // Remove whitespace seqs.back().erase(remove_if(seqs.back().begin(), seqs.back().end(), isspace), seqs.back().end()); LOG(DEBUG2) << headers.back(); } if (headers.empty()) throw Exception("Bad alignment: no alignment data found in stream!"); } template void Alignment::ReadPsi(FILE* fin, std::vector& headers, std::vector& seqs) { headers.clear(); seqs.clear(); char buffer[kBufferSize]; const char* ptr; size_t block = 1; // number of block currently read size_t n = 0; // sequence number of first block size_t k = 0; // sequence index to zero for first block while (fgetline(buffer, kBufferSize, fin)) { if (buffer[0] == '/' && buffer[1] == '/') break; // Start of new block if (!strscn(buffer)) { if (k > 0) { if (n > 0 && n != k) throw Exception("Error: different number of sequences in blocks " "1 and %i.", block); ++block; n = k; k = 0; } continue; } // Parse name and sequence characters ptr = strchr(buffer, ' '); if (!ptr) throw Exception("Error: Missing whitespace between identifier and " "sequence characters of sequence %i in block %i.", k+1, block); std::string name(buffer, ptr - buffer); ptr = strscn(ptr); if (!ptr) throw Exception("Error: Missing sequence characters in sequence %i of " "block %i.", k+1, block); std::string seq(ptr); if (block == 1) { headers.push_back(name); seqs.push_back(seq); } else { assert(name == headers[k]); seqs[k].append(seq); } ++k; } if (k > 0 && n > 0 && n != k) throw Exception("Error: different number of sequences in blocks " "1 and %i.", block); } template void Alignment::ReadFasta(FILE* fin, std::vector& headers, std::vector& seqs) { ReadFastaFlavors(fin, headers, seqs); // Convert all characters to match characters for (std::vector::iterator it = seqs.begin(); it != seqs.end(); ++it) transform(it->begin(), it->end(), it->begin(), to_match_chr); } template void Alignment::ReadA2M(FILE* fin, std::vector& headers, std::vector& seqs) { ReadFastaFlavors(fin, headers, seqs); } template void Alignment::ReadA3M(FILE* fin, std::vector& headers, std::vector& seqs) { ReadFastaFlavors(fin, headers, seqs); // Check number of match states const size_t nseqs = seqs.size(); const size_t nmatch_cols = count_if(seqs[0].begin(), seqs[0].end(), match_chr); for (size_t k = 1; k < nseqs; ++k) { const size_t nmatch_cols_k = count_if(seqs[k].begin(), seqs[k].end(), match_chr); if (nmatch_cols_k != nmatch_cols) throw Exception("Sequence %i has %i match columns but should have %i!", k, nmatch_cols_k, nmatch_cols); if (count(seqs[k].begin(), seqs[k].end(), '.') > 0) throw Exception("Sequence %i in A3M alignment contains gaps!", k); } // Insert gaps into A3M alignment std::vector seqs_a2m(seqs.size(), ""); Matrix inserts(seqs.size(), nmatch_cols, ""); std::vector max_insert_len(nmatch_cols, 0); // Move inserts before first match state into seqs_a2m and keep track of // longest first insert size_t max_first_insert_len = 0; for (size_t k = 0; k < nseqs; ++k) { std::string::iterator i = find_if(seqs[k].begin(), seqs[k].end(), match_chr); if (i != seqs[k].end()) { seqs_a2m[k].append(seqs[k].begin(), i); seqs[k].erase(seqs[k].begin(), i); } max_first_insert_len = MAX(max_first_insert_len, static_cast(i - seqs[k].begin())); } // Extract all inserts and keep track of longest insert after each match // column for (size_t k = 0; k < nseqs; ++k) { int i = -1; std::string::iterator insert_end = seqs[k].begin(); std::string::iterator insert_start = find_if(insert_end, seqs[k].end(), insert_chr); while (insert_start != seqs[k].end() && insert_end != seqs[k].end()) { i += insert_start - insert_end; insert_end = find_if(insert_start, seqs[k].end(), match_chr); inserts[k][i] = std::string(insert_start, insert_end); max_insert_len[i] = MAX(inserts[k][i].length(), max_insert_len[i]); insert_start = find_if(insert_end, seqs[k].end(), insert_chr); } } // Build new A2M alignment for (size_t k = 0; k < nseqs; ++k) { seqs_a2m[k].append(max_first_insert_len - seqs_a2m[k].length(), '.'); int i = 0; std::string::iterator match = seqs[k].begin(); while (match != seqs[k].end()) { seqs_a2m[k].append(1, *match); if (max_insert_len[i] > 0) { seqs_a2m[k].append(inserts[k][i]); seqs_a2m[k].append(max_insert_len[i] - inserts[k][i].length(), '.'); } match = find_if(match+1, seqs[k].end(), match_chr); ++i; } } // Overwrite original A3M alignment with new A2M alignment seqs = seqs_a2m; } template void Alignment::Write(FILE* fout, AlignmentFormat format, size_t width) const { switch (format) { case FASTA_ALIGNMENT: case A2M_ALIGNMENT: case A3M_ALIGNMENT: WriteFastaFlavors(fout, format, width); break; case CLUSTAL_ALIGNMENT: case PSI_ALIGNMENT: WriteClustalFlavors(fout, format, width); break; default: throw Exception("Unsupported alignment output format %i!", format); } } template void Alignment::WriteFastaFlavors(FILE* fout, AlignmentFormat format, size_t width) const { for (size_t k = 0; k < nseqs(); ++k) { fprintf(fout, ">%s\n", headers_[k].c_str()); size_t j = 0; // counts printed characters for (size_t i = 0; i < ncols(); ++i) { switch (format) { case FASTA_ALIGNMENT: fputc(to_match_chr(chr(k, i)), fout); ++j; break; case A2M_ALIGNMENT: if (is_match_[i]) fputc(to_match_chr(chr(k, i)), fout); else fputc(to_insert_chr(chr(k, i)), fout); ++j; break; case A3M_ALIGNMENT: if (is_match_[i]) { fputc(to_match_chr(chr(k, i)), fout); ++j; } else if (seq(k, i) != Abc::kGap && seq(k, i) != Abc::kEndGap) { fputc(to_insert_chr(chr(k, i)), fout); ++j; } break; default: throw Exception("Unsupported alignment output format %i!", format); } if (j % width == 0) fputc('\n', fout); } if (j % width != 0) putc('\n', fout); } } template void Alignment::WriteClustalFlavors(FILE* fout, AlignmentFormat format, size_t width) const { const size_t kHeaderWidth = 15; // Convert alignment to character representation std::vector seqs(nseqs(), ""); for (size_t k = 0; k < nseqs(); ++k) { for (size_t i = 0; i < ncols(); ++i) { char c = Abc::kIntToChar[seqs_[i][k]]; if (c != '-' && !is_match_[i] && format == PSI_ALIGNMENT) c = to_insert_chr(c); seqs[k].push_back(c); } } // Print alignment in blocks if (format == CLUSTAL_ALIGNMENT) fputs("CLUSTAL\n\n", fout); while (!seqs.front().empty()) { for (size_t k = 0; k < nseqs(); ++k) { std::string header(headers_[k].substr(0, headers_[k].find_first_of(' '))); if (header.length() <= kHeaderWidth) { header += std::string(kHeaderWidth - header.length() + 1, ' '); fputs(header.c_str(), fout); fputc(' ', fout); // separator between header and sequence } else { fputs(header.substr(0, kHeaderWidth).c_str(), fout); fputc(' ', fout); // separator between header and sequence } size_t len = MIN(width, seqs[k].length()); fputs(seqs[k].substr(0, len).c_str(), fout); fputc('\n', fout); seqs[k].erase(0, len); } fputc('\n', fout); // blank line after each block } } template void Alignment::Resize(size_t nseqs, size_t ncols) { if (nseqs == 0 || ncols == 0) throw Exception("Bad alignment dimensions: nseqs=%i ncols=%i", nseqs, ncols); seqs_.Resize(ncols, nseqs); col_idx_.resize(ncols); match_idx_.resize(ncols); is_match_.resize(ncols); headers_.resize(nseqs); } template void Alignment::AssignMatchColumnsBySequence(size_t k) { if (ninsert() == 0) { // For alignemnts WITHOUT inserts simply assign columns in which the // reference sequence has no residue to be inserts for (size_t i = 0; i < ncols(); ++i) is_match_[i] = (seqs_[i][k] < Abc::kGap); } else { // For alignments WITH inserts we remove all columns in which the // reference sequence has no residue and remove all inserts in the other // sequences. const size_t ref_seq_length = GetSequence(k).length(); Matrix new_seqs(ref_seq_length, nseqs()); size_t j = 0; // column index in new alignment for (size_t i = 0; i < ncols(); ++i) { if (seqs_[i][k] < Abc::kGap) { for (size_t n = 0; n < nseqs(); ++n) { if (n != k && !is_match(i)) new_seqs[j][n] = Abc::kGap; else new_seqs[j][n] = seqs_[i][n]; } ++j; } } seqs_.Resize(ref_seq_length, nseqs()); seqs_ = new_seqs; // Update match indices col_idx_.resize(ref_seq_length); match_idx_.resize(ref_seq_length); is_match_.resize(ref_seq_length); for (size_t i = 0; i < ref_seq_length; ++i) { col_idx_[i] = i; is_match_[i] = true; } } SetMatchIndices(); } template void Alignment::AssignMatchColumnsByGapRule(double gap_threshold) { // FIXME: handle inserts in assignment of match columns by gap rule if (ninsert() > 0) return; LOG(DEBUG) << "Marking columns with more than " << gap_threshold << "% of gaps as insert columns ..."; // Global weights are sufficient for calculation of gap percentage Vector wg; GlobalWeightsAndDiversity(*this, wg, gap_threshold <= 1.0); for (size_t i = 0; i < ncols(); ++i) { double gap = 0.0f; double res = 0.0f; for (size_t k = 0; k < nseqs(); ++k) if (seqs_[i][k] < Abc::kAny) res += wg[k]; else if (seqs_[i][k] != Abc::kEndGap) // ENDGAPs are ignored gap += wg[k]; if (gap_threshold > 1.0) { // interpret as number between 1 and 100 double percent_gaps = 100.0 * gap / (res + gap); is_match_[i] = (percent_gaps <= gap_threshold); } else { // interpret as decimal number double frac_res = res / (res + gap); is_match_[i] = (frac_res > gap_threshold); } } SetMatchIndices(); } template void Alignment::RemoveInsertColumns() { // Create new sequence matrix const size_t match_cols = nmatch(); Matrix new_seqs(match_cols, nseqs()); for (size_t i = 0; i < match_cols; ++i) { for (size_t k = 0; k < nseqs(); ++k) { new_seqs[i][k] = seqs_[match_idx_[i]][k]; } } seqs_.Resize(match_cols, nseqs()); seqs_ = new_seqs; // Update match indices col_idx_.resize(match_cols); match_idx_.resize(match_cols); is_match_.resize(match_cols); for (size_t i = 0; i < match_cols; ++i) { col_idx_[i] = i; is_match_[i] = true; } SetMatchIndices(); } template void Alignment::Merge(const Alignment& ali) { if (nmatch() != ali.nmatch()) return; // FIXME: Keep insert columns when merging two alignments RemoveInsertColumns(); // Copy and keep track of headers that are not already contained in master // alignment. Vector include_seq(ali.nseqs(), false); std::vector headers_merged(headers_); for (size_t k = 0; k < ali.nseqs(); ++k) { if (find(headers_.begin(), headers_.end(), ali.header(k)) == headers_.end()) { include_seq[k] = true; headers_merged.push_back(ali.header(k)); } } // Append new sequences to alignment Matrix seqs_merged(nmatch(), headers_merged.size()); for (size_t i = 0; i < nmatch(); ++i) { for (size_t k = 0; k < nseqs(); ++k) { seqs_merged[i][k] = seqs_[match_idx_[i]][k]; } size_t l = nseqs(); // index of sequence k in merged alignment for (size_t k = 0; k < ali.nseqs(); ++k) { if (include_seq[k]) { seqs_merged[i][l] = ali.seqs_[ali.match_idx_[i]][k]; ++l; } } } // Apply the merging headers_ = headers_merged; seqs_ = seqs_merged; } template Sequence Alignment::GetSequence(size_t k) const { size_t nres = 0; for (size_t i = 0; i < ncols(); ++i) if (seq(k,i) < Abc::kGap) nres++; Sequence sequence(nres); size_t j = 0; for (size_t i = 0; i < ncols(); ++i) if (seq(k,i) < Abc::kGap) sequence[j++] = seq(k,i); sequence.set_header(header(k)); return sequence; } template void Alignment::Rearrange(const std::vector >& seqs) { assert_eq(nseqs(), seqs.size()); // Determine mapping of alignment sequecnes to their position in 'seqs' Vector mapping(nseqs()); for (size_t k = 0; k < nseqs(); ++k) { for (size_t l = 0; l < seqs.size(); ++l) { if (seqs[l].header() == headers_[k]) { mapping[l] = k; break; } } } // Sort headers and sequence matrix std::vector new_headers(nseqs()); Matrix new_seqs(ncols(), nseqs()); for (size_t k = 0; k < nseqs(); ++k) { new_headers[k] = headers_[mapping[k]]; for (size_t i = 0; i < ncols(); ++i) new_seqs[i][k] = seqs_[i][mapping[k]]; } headers_ = new_headers; seqs_ = new_seqs; } template std::ostream& operator<< (std::ostream& out, const Alignment& ali) { const size_t kHeaderWidth = 18; const size_t kWrap = 100; // Convert alignment to character representation Vector seqs(ali.nseqs(), ""); for (size_t k = 0; k < ali.nseqs(); ++k) { for (size_t i = 0; i < ali.ncols(); ++i) { char c = Abc::kIntToChar[ali.seqs_[i][k]]; seqs[k].push_back(c); } } // Print alignment in blocks out << "CLUSTAL\n\n"; while (!seqs[0].empty()) { for (size_t k = 0; k < ali.nseqs(); ++k) { std::string header = ali.headers_[k].substr(0, ali.headers_[k].find_first_of(' ')); if (header.length() <= kHeaderWidth) out << header + std::string(kHeaderWidth - header.length(), ' ') << ' '; else out << header.substr(0, kHeaderWidth) << ' '; out << seqs[k].substr(0, MIN(kWrap, seqs[k].length())) << std::endl; seqs[k].erase(0, MIN(kWrap, seqs[k].length())); } out << std::endl; // blank line after each block } return out; } template void ReadAll(FILE* fin, AlignmentFormat format, std::vector< Alignment >& v) { while (!feof(fin)) { v.push_back(Alignment(fin, format)); uint8_t c = fgetc(fin); if (c == EOF) break; ungetc(c, fin); } } // Returns the alignment format corresponding to provided filename extension inline AlignmentFormat AlignmentFormatFromString(const std::string& s) { if (s.substr(0,2) == "fa" || s.substr(0,2) == "FA"|| s.substr(0,2) == "Fa") return FASTA_ALIGNMENT; else if (s == "a2m" || s == "A2M") return A2M_ALIGNMENT; else if (s == "a3m" || s == "A3M") return A3M_ALIGNMENT; else if (s.substr(0,2) == "cl" || s.substr(0,2) == "CL" || s.substr(0,2) == "Cl") return CLUSTAL_ALIGNMENT; else if (s.substr(0,2) == "ps" || s.substr(0,2) == "PS" || s.substr(0,2) == "Ps") return PSI_ALIGNMENT; else throw Exception("Unknown alignment format extension '%s'! \nAllowed extensions: fa* (FASTA); a2m, A2M (A2M); a3m, A3M (A3M); cl* (CLUSTAL); ps* (PSI-BLAST checkpoints format)\n ", s.c_str()); } template double GlobalWeightsAndDiversity(const Alignment& ali, Vector& wg, bool neff_sum_pairs) { const double kZero = 1E-10; // for calculation of entropy const size_t nseqs = ali.nseqs(); const size_t ncols = ali.nmatch(); const size_t alphabet_size = Abc::kSize; const uint8_t any = Abc::kAny; // Return values wg.Assign(nseqs, 0.0f); // global sequence weights double neff = 0.0f; // diversity of alignment Vector n(nseqs, 0); // number of residues in sequence i Vector fj(alphabet_size, 0.0f); // to calculate entropy Vector adiff(ncols, 0); // different letters in each column Matrix counts(ncols, alphabet_size, 0); // column counts (excl. ANY) LOG(INFO) << "Calculation of global weights and alignment diversity ..."; // Count number of residues in each column for (size_t i = 0; i < ncols; ++i) { for (size_t k = 0; k < nseqs; ++k) { if (ali[i][k] < any) { ++counts[i][ali[i][k]]; ++n[k]; } } } // Count number of different residues in each column for (size_t i = 0; i < ncols; ++i) { for (size_t a = 0; a < alphabet_size; ++a) { if (counts[i][a]) ++adiff[i]; } if (adiff[i] == 0) adiff[i] = 1; // col consists of only gaps and ANYs } // Calculate weights for (size_t i = 0; i < ncols; ++i) { for (size_t k = 0; k < nseqs; ++k) { if (adiff[i] > 0 && ali[i][k] < any) wg[k] += 1.0 / (adiff[i] * counts[i][ali[i][k]] * n[k]); //wg[k] += (adiff[i] - 1.0) / (counts[i][ali[i][k]] * n[k]); } } Normalize(&wg[0], nseqs); // Calculate number of effective sequences if (!neff_sum_pairs) { for (size_t i = 0; i < ncols; ++i) { Reset(&fj[0], alphabet_size); for (size_t k = 0; k < nseqs; ++k) if (ali[i][k] < any) fj[ali[i][k]] += wg[k]; Normalize(&fj[0], alphabet_size); for (size_t a = 0; a < alphabet_size; ++a) if (fj[a] > kZero) neff -= fj[a] * log2(fj[a]); } neff = pow(2.0, neff / ncols); } else { for (size_t i = 0; i < ncols; ++i) { Reset(&fj[0], alphabet_size); for (size_t k = 0; k < nseqs; ++k) if (ali[i][k] < any) fj[ali[i][k]] += wg[k]; Normalize(&fj[0], alphabet_size); double ni = nseqs + 1.0; for (size_t a = 0; a < alphabet_size; ++a) ni -= SQR(fj[a]) * nseqs; neff += ni; } neff /= ncols; } LOG(DEBUG) << "neff=" << neff; return neff; } template Vector PositionSpecificWeightsAndDiversity(const Alignment& ali, Matrix& w) { // Maximal fraction of sequences with an endgap const double kMaxEndgapFraction = 0.1; // Minimum number of columns in subalignments const size_t kMinCols = 10; // Zero value for calculation of entropy const double kZero = 1E-10; const size_t nseqs = ali.nseqs(); const size_t ncols = ali.nmatch(); const size_t alphabet_size = Abc::kSize; const uint8_t any = Abc::kAny; const uint8_t endgap = Abc::kEndGap; // Return values Vector neff(ncols, 0.0f); // diversity of subalignment i w.Assign(ncols, nseqs, 0.0f); // weight of seq k in column i // Helper variables size_t ncoli = 0; // number of columns j that contribute to neff[i] size_t nseqi = 0; // number of sequences in subalignment i size_t ndiff = 0; // number of different alphabet letters bool change = false; // has the set of sequences in subalignment changed? // Number of seqs with some residue in column i AND a at position j Matrix n(ncols, endgap + 1, 0); // To calculate entropy Vector fj(alphabet_size, 0.0f); // Weight of sequence k in column i, calculated from subalignment i Vector wi(nseqs, 0.0f); Vector wg; // global weights Vector nseqi_debug(ncols, 0); // debugging Vector ncoli_debug(ncols, 0); // debugging // Calculate global weights for fallback GlobalWeightsAndDiversity(ali, wg); for (size_t i = 0; i < ncols; ++i) { change = false; for (size_t k = 0; k < nseqs; ++k) { if ((i == 0 || ali[i-1][k] >= any) && ali[i][k] < any) { change = true; ++nseqi; for (size_t j = 0; j < ncols; ++j) ++n[j][ali[j][k]]; } else if (i > 0 && ali[i-1][k] < any && ali[i][k] >= any) { change = true; --nseqi; for (size_t j = 0; j < ncols; ++j) --n[j][ali[j][k]]; } } // for k over nseqs nseqi_debug[i] = nseqi; if (change) { // set of sequences in subalignment has changed ncoli = 0; Reset(&wi[0], nseqs); for (size_t j = 0; j < ncols; ++j) { if (n[j][endgap] > kMaxEndgapFraction * nseqi) continue; ndiff = 0; for (size_t a = 0; a < alphabet_size; ++a) if (n[j][a]) ++ndiff; if (ndiff == 0) continue; ++ncoli; for (size_t k = 0; k < nseqs; ++k) { if (ali[i][k] < any && ali[j][k] < any) { assert_ne(0, n[j][ali[j][k]]); wi[k] += 1.0 / static_cast((n[j][ali[j][k]] * ndiff)); //wi[k] += (ndiff - 1.0) / static_cast(n[j][ali[j][k]]); } } } // for j over ncols Normalize(&wi[0], nseqs); if (ncoli < kMinCols) // number of columns in subalignment insufficient? for (size_t k = 0; k < nseqs; ++k) if (ali[i][k] < any) wi[k] = wg[k]; else wi[k] = 0.0f; neff[i] = 0.0f; for (size_t j = 0; j < ncols; ++j) { if (n[j][endgap] > kMaxEndgapFraction * nseqi) continue; Reset(&fj[0], alphabet_size); for (size_t k = 0; k < nseqs; ++k) if (ali[i][k] < any && ali[j][k] < any) fj[ali[j][k]] += wi[k]; Normalize(&fj[0], alphabet_size); for (size_t a = 0; a < alphabet_size; ++a) if (fj[a] > kZero) neff[i] -= fj[a] * log2(fj[a]); } // for j over ncols neff[i] = (ncoli > 0 ? pow(2.0, neff[i] / ncoli) : 1.0f); } else { // set of sequences in subalignment has NOT changed neff[i] = (i == 0 ? 0.0 : neff[i-1]); } for (size_t k = 0; k < nseqs; ++k) w[i][k] = wi[k]; ncoli_debug[i] = ncoli; } // for i over ncols return neff; } } // namespace cs #endif // CS_ALIGNMENT_INL_H_ hhsuite-2.0.16/src/cs/timer.h0000664172256617226630000000304012110430072020237 0ustar hauserscientific_computing#ifndef CS_TIMER_H_ #define CS_TIMER_H_ #include #include #include namespace cs { // Use time() call to keep track of elapsed time between creation and // destruction. If verbose is true, Timer will print a message showing // elapsed time to the given output stream upon destruction. // Adapted from timer class in bowtie source code. class Timer { public: Timer(FILE* out = stdout, const char *msg = "", bool verbose = true) : t_(time(0)), out_(out), msg_(msg), verbose_(verbose) { } // Optionally print message ~Timer() { if(verbose_) Write(out_); } /// Return elapsed time since Timer object was created time_t elapsed() const { return time(0) - t_; } void Write(FILE* out) { time_t passed = elapsed(); // Print the message supplied at construction time followed // by time elapsed formatted HH:MM:SS unsigned int hours = (passed / 60) / 60; unsigned int minutes = (passed / 60) % 60; unsigned int seconds = (passed % 60); fprintf(out, "%s%02d:%02d:%02d\n", msg_, hours, minutes, seconds); } private: time_t t_; FILE* out_; const char* msg_; bool verbose_; }; static inline void LogTime(FILE* out, bool nl = true) { struct tm *current; time_t now; time(&now); current = localtime(&now); fprintf(out, "%02d:%02d:%02d", current->tm_hour, current->tm_min, current->tm_sec); if (nl) fputs("\n", out); } } // namespace cs #endif // CS_TIMER_H_ hhsuite-2.0.16/src/cs/blosum_matrix.cc0000664172256617226630000001440512110430072022151 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "cs.h" #include "blosum_matrix.h" #include "substitution_matrix-inl.h" namespace { const float g_blosum45[] = { //A R N D C Q E G H I L K M F P S T W Y V 0.0181, 0.0029,0.0130, 0.0026,0.0020,0.0079, 0.0027,0.0020,0.0031,0.0132, 0.0015,0.0006,0.0007,0.0006,0.0094, 0.0024,0.0025,0.0016,0.0017,0.0004,0.0057, 0.0038,0.0031,0.0022,0.0047,0.0007,0.0032,0.0131, 0.0063,0.0022,0.0033,0.0028,0.0010,0.0019,0.0025,0.0285, 0.0013,0.0013,0.0013,0.0012,0.0003,0.0010,0.0014,0.0012,0.0058, 0.0036,0.0016,0.0015,0.0014,0.0008,0.0013,0.0017,0.0019,0.0007,0.0124, 0.0052,0.0029,0.0019,0.0022,0.0015,0.0022,0.0031,0.0032,0.0016,0.0093,0.0263, 0.0037,0.0061,0.0028,0.0028,0.0008,0.0029,0.0045,0.0030,0.0013,0.0020,0.0031,0.0120, 0.0016,0.0010,0.0007,0.0006,0.0004,0.0008,0.0009,0.0011,0.0006,0.0023,0.0041,0.0011,0.0026, 0.0021,0.0014,0.0011,0.0010,0.0007,0.0007,0.0013,0.0017,0.0008,0.0031,0.0057,0.0015,0.0012,0.0124, 0.0024,0.0013,0.0011,0.0015,0.0004,0.0011,0.0023,0.0022,0.0007,0.0016,0.0019,0.0020,0.0007,0.0009,0.0160, 0.0062,0.0026,0.0031,0.0028,0.0011,0.0024,0.0032,0.0049,0.0013,0.0023,0.0032,0.0033,0.0010,0.0017,0.0020,0.0104, 0.0041,0.0020,0.0025,0.0023,0.0010,0.0015,0.0025,0.0027,0.0009,0.0028,0.0038,0.0028,0.0011,0.0017,0.0019,0.0047,0.0086, 0.0006,0.0004,0.0002,0.0002,0.0001,0.0003,0.0004,0.0006,0.0001,0.0005,0.0008,0.0005,0.0002,0.0008,0.0003,0.0004,0.0003,0.0053, 0.0017,0.0014,0.0009,0.0011,0.0004,0.0010,0.0012,0.0014,0.0012,0.0019,0.0031,0.0015,0.0009,0.0034,0.0007,0.0015,0.0013,0.0008,0.0066, 0.0055,0.0021,0.0016,0.0017,0.0012,0.0014,0.0023,0.0025,0.0008,0.0094,0.0088,0.0025,0.0022,0.0031,0.0016,0.0031,0.0038,0.0004,0.0019,0.0141 }; const float g_blosum62[] = { //A R N D C Q E G H I L K M F P S T W Y V 0.0215, 0.0023,0.0178, 0.0019,0.0020,0.0141, 0.0022,0.0016,0.0037,0.0213, 0.0016,0.0004,0.0004,0.0004,0.0119, 0.0019,0.0025,0.0015,0.0016,0.0003,0.0073, 0.0030,0.0027,0.0022,0.0049,0.0004,0.0035,0.0161, 0.0058,0.0017,0.0029,0.0025,0.0008,0.0014,0.0019,0.0378, 0.0011,0.0012,0.0014,0.0010,0.0002,0.0010,0.0014,0.0010,0.0093, 0.0032,0.0012,0.0010,0.0012,0.0011,0.0009,0.0012,0.0014,0.0006,0.0184, 0.0044,0.0024,0.0014,0.0015,0.0016,0.0016,0.0020,0.0021,0.0010,0.0114,0.0371, 0.0033,0.0062,0.0024,0.0024,0.0005,0.0031,0.0041,0.0025,0.0012,0.0016,0.0025,0.0161, 0.0013,0.0008,0.0005,0.0005,0.0004,0.0007,0.0007,0.0007,0.0004,0.0025,0.0049,0.0009,0.0040, 0.0016,0.0009,0.0008,0.0008,0.0005,0.0005,0.0009,0.0012,0.0008,0.0030,0.0054,0.0009,0.0012,0.0183, 0.0022,0.0010,0.0009,0.0012,0.0004,0.0008,0.0014,0.0014,0.0005,0.0010,0.0014,0.0016,0.0004,0.0005,0.0191, 0.0063,0.0023,0.0031,0.0028,0.0010,0.0019,0.0030,0.0038,0.0011,0.0017,0.0024,0.0031,0.0009,0.0012,0.0017,0.0126, 0.0037,0.0018,0.0022,0.0019,0.0009,0.0014,0.0020,0.0022,0.0007,0.0027,0.0033,0.0023,0.0010,0.0012,0.0014,0.0047,0.0125, 0.0004,0.0003,0.0002,0.0002,0.0001,0.0002,0.0003,0.0004,0.0002,0.0004,0.0007,0.0003,0.0002,0.0008,0.0001,0.0003,0.0003,0.0065, 0.0013,0.0009,0.0007,0.0006,0.0003,0.0007,0.0009,0.0008,0.0015,0.0014,0.0022,0.0010,0.0006,0.0042,0.0005,0.0010,0.0009,0.0009,0.0102, 0.0051,0.0016,0.0012,0.0013,0.0014,0.0012,0.0017,0.0018,0.0006,0.0120,0.0095,0.0019,0.0023,0.0026,0.0012,0.0024,0.0036,0.0004,0.0015,0.0196 }; const float g_blosum80[] = { //A R N D C Q E G H I L K M F P S T W Y V 0.0252, 0.0020,0.0210, 0.0016,0.0017,0.0166, 0.0018,0.0013,0.0037,0.0262, 0.0015,0.0003,0.0004,0.0003,0.0172, 0.0017,0.0024,0.0014,0.0014,0.0003,0.0094, 0.0028,0.0023,0.0019,0.0048,0.0003,0.0035,0.0208, 0.0053,0.0015,0.0025,0.0022,0.0006,0.0011,0.0017,0.0463, 0.0009,0.0012,0.0012,0.0008,0.0002,0.0011,0.0012,0.0008,0.0104, 0.0027,0.0010,0.0007,0.0008,0.0011,0.0007,0.0010,0.0009,0.0004,0.0220, 0.0036,0.0018,0.0011,0.0011,0.0014,0.0014,0.0015,0.0016,0.0008,0.0111,0.0442, 0.0029,0.0061,0.0022,0.0020,0.0004,0.0028,0.0036,0.0020,0.0010,0.0012,0.0019,0.0190, 0.0011,0.0006,0.0004,0.0003,0.0004,0.0007,0.0006,0.0005,0.0003,0.0025,0.0052,0.0007,0.0053, 0.0014,0.0007,0.0006,0.0006,0.0005,0.0005,0.0006,0.0009,0.0007,0.0027,0.0052,0.0007,0.0010,0.0211, 0.0021,0.0009,0.0007,0.0009,0.0003,0.0007,0.0012,0.0010,0.0004,0.0007,0.0012,0.0012,0.0003,0.0004,0.0221, 0.0064,0.0020,0.0029,0.0024,0.0010,0.0017,0.0026,0.0034,0.0010,0.0015,0.0021,0.0026,0.0007,0.0010,0.0014,0.0167, 0.0036,0.0015,0.0020,0.0016,0.0009,0.0012,0.0019,0.0019,0.0007,0.0024,0.0028,0.0020,0.0009,0.0011,0.0011,0.0048,0.0156, 0.0003,0.0002,0.0001,0.0001,0.0001,0.0002,0.0002,0.0003,0.0001,0.0003,0.0006,0.0002,0.0002,0.0007,0.0001,0.0002,0.0002,0.0087, 0.0011,0.0007,0.0006,0.0005,0.0003,0.0005,0.0006,0.0006,0.0016,0.0013,0.0020,0.0008,0.0005,0.0046,0.0003,0.0009,0.0008,0.0010,0.0148, 0.0046,0.0013,0.0009,0.0010,0.0013,0.0010,0.0015,0.0014,0.0005,0.0123,0.0089,0.0015,0.0022,0.0022,0.0010,0.0021,0.0033,0.0004,0.0012,0.0246 }; } // namnespace namespace cs { BlosumMatrix::BlosumMatrix(BlosumType matrix) { switch (matrix) { case BLOSUM45: lambda_ = log(2) / 3.0; Init(g_blosum45); break; case BLOSUM62: lambda_ = log(2) / 2.0; Init(g_blosum62); break; case BLOSUM80: lambda_ = log(2) / 2.0; Init(g_blosum80); break; default: throw Exception("Unsupported BLOSUM matrix!"); } } void BlosumMatrix::Init(const float* blosum_xx) { // Read raw BLOSUM data vector size_t n = 0; for (size_t a = 0; a < AA::kSize; ++a) for (size_t b = 0; b <= a; ++b, ++n) q_[a][b] = blosum_xx[n]; // Add uppper right matrix part for (size_t a = 0; a < AA::kSize-1; ++a) for (size_t b = a+1; b < AA::kSize; ++b) q_[a][b] = q_[b][a]; // Let base class init method do the rest. InitFromTargetFreqs(); } BlosumType BlosumTypeFromString(const std::string& s) { if (s == "BLOSUM45") return BLOSUM45; else if (s == "BLOSUM62") return BLOSUM62; else if (s == "BLOSUM80") return BLOSUM80; else throw Exception("Unable to infer BLOSUM type from string '%s'!", s.c_str()); } } // namespace cs hhsuite-2.0.16/src/cs/profile_column.h0000664172256617226630000000644212110430072022145 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_PROFILE_COLUMN_H_ #define CS_PROFILE_COLUMN_H_ namespace cs { template class ProfileColumn { public: ProfileColumn(); explicit ProfileColumn(const double &a); explicit ProfileColumn(const double *a); ProfileColumn(const ProfileColumn &rhs); ~ProfileColumn(); ProfileColumn & operator=(const ProfileColumn &rhs); inline double & operator[](const size_t i); inline const double & operator[](const size_t i) const; inline size_t size() const; private: double *v; }; template ProfileColumn::ProfileColumn() : v(new double[Abc::kSizeAny]) {} template ProfileColumn::ProfileColumn(const double& a) : v(new double[Abc::kSizeAny]) { for(size_t i=0; i ProfileColumn::ProfileColumn(const double *a) : v(new double[Abc::kSizeAny]) { for(size_t i=0; i ProfileColumn::ProfileColumn(const ProfileColumn &rhs) : v(new double[Abc::kSizeAny]) { for(size_t i=0; i ProfileColumn & ProfileColumn::operator=(const ProfileColumn &rhs) { if (this != &rhs) for (size_t i=0; i inline double & ProfileColumn::operator[](const size_t i) { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Profile column subscript out of bounds"); } #endif return v[i]; } template inline const double & ProfileColumn::operator[](const size_t i) const { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Profile column subscript out of bounds"); } #endif return v[i]; } template inline size_t ProfileColumn::size() const { return Abc::kSizeAny; } template ProfileColumn::~ProfileColumn() { if (v != NULL) delete[] (v); } // Assigns given constant value or default to all entries in vector template inline void Assign(ProfileColumn& v, double val) { for (size_t i = 0; i < Abc::kSizeAny; ++i) v[i] = val; } // Prints profile column in human-readable format for debugging. template std::ostream& operator<< (std::ostream& out, const ProfileColumn& col) { for (size_t a = 0; a < Abc::kSizeAny; ++a) out << strprintf(" %c \t", Abc::kIntToChar[a]); out << std::endl; for (size_t a = 0; a < Abc::kSizeAny; ++a) out << strprintf("%6.4f\t", col[a]); out << std::endl; return out; } // Normalizes all profile column to fixed value. Iff 'incl_any' is true, // normalization also includes value of ANY letter template inline void Normalize(ProfileColumn& col, double val, bool incl_any = false) { const size_t abc_size = incl_any ? Abc::kSizeAny : Abc::kSize; double sum = 0; for (size_t a = 0; a < abc_size; ++a) sum += col[a]; double fac = val / sum; for (size_t a = 0; a < abc_size; ++a) col[a] *= fac; } // Calculates entropy of given profile column using logarithm base 2. template inline double Entropy(const ProfileColumn& col) { double rv = 0.0; for (size_t a = 0; a < Abc::kSize; ++a) if (col[a] > FLT_MIN) rv -= col[a] * log2(col[a]); return rv; } } // namespace cs #endif // CS_PROFILE_COLUMN_H_ hhsuite-2.0.16/src/cs/matrix_pseudocounts-inl.h0000664172256617226630000000267112110430072024027 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_MATRIX_PSEUDOCOUNTS_INL_H_ #define CS_MATRIX_PSEUDOCOUNTS_INL_H_ #include "matrix_pseudocounts.h" #include "count_profile-inl.h" #include "profile-inl.h" #include "sequence-inl.h" #include "substitution_matrix-inl.h" namespace cs { template void MatrixPseudocounts::AddToSequence(const Sequence& seq, const Admix& pca, Profile& p) const { assert_eq(seq.length(), p.length()); LOG(DEBUG) << "Adding substitution matrix pseudocounts to sequence ..."; double tau = pca(1.0); for(size_t i = 0; i < p.length(); ++i) { for(size_t a = 0; a < Abc::kSize; ++a) { p[i][a] = (1.0 - tau) * (seq[i] == a ? 1.0 : 0.0) + tau * m_.r(a, seq[i]); } } } template void MatrixPseudocounts::AddToProfile(const CountProfile& cp, const Admix& pca, Profile& p) const { assert_eq(cp.counts.length(), p.length()); LOG(DEBUG) << "Adding substitution matrix pseudocounts to profile ..."; for(size_t i = 0; i < cp.counts.length(); ++i) { double tau = pca(cp.neff[i]); for(size_t a = 0; a < Abc::kSize; ++a) { double sum = 0.0; for(size_t b = 0; b < Abc::kSize; ++b) sum += m_.r(a,b) * cp.counts[i][b] / cp.neff[i]; p[i][a] = (1.0 - tau) * cp.counts[i][a] / cp.neff[i] + tau * sum; } } } } // namespace cs #endif // CS_MATRIX_PSEUDOCOUNTS_INL_H_ hhsuite-2.0.16/src/cs/vector.h0000664172256617226630000000504312110430072020426 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_VECTOR_H_ #define CS_VECTOR_H_ template class Vector { public: typedef T value_type; Vector(); explicit Vector(size_t n); Vector(size_t n, const T &a); Vector(size_t n, const T *a); Vector(const Vector &rhs); ~Vector(); Vector & operator=(const Vector &rhs); inline T & operator[](const size_t i); inline const T & operator[](const size_t i) const; inline size_t size() const; void Resize(size_t newn); void Assign(size_t newn, const T &a); private: size_t nn; T *v; }; // Vector definitions template Vector::Vector() : nn(0), v(NULL) {} template Vector::Vector(size_t n) : nn(n), v(n>0 ? new T[n] : NULL) {} template Vector::Vector(size_t n, const T& a) : nn(n), v(n>0 ? new T[n] : NULL) { for(size_t i=0; i Vector::Vector(size_t n, const T *a) : nn(n), v(n>0 ? new T[n] : NULL) { for(size_t i=0; i Vector::Vector(const Vector &rhs) : nn(rhs.nn), v(nn>0 ? new T[nn] : NULL) { for(size_t i=0; i Vector & Vector::operator=(const Vector &rhs) { if (this != &rhs) { if (nn != rhs.nn) { if (v != NULL) delete [] (v); nn=rhs.nn; v= nn>0 ? new T[nn] : NULL; } for (size_t i=0; i inline T & Vector::operator[](const size_t i) { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Vector subscript out of bounds"); } #endif return v[i]; } template inline const T & Vector::operator[](const size_t i) const { #ifdef CHECKBOUNDS if (i<0 || i>=nn) { throw Exception("Vector subscript out of bounds"); } #endif return v[i]; } template inline size_t Vector::size() const { return nn; } template void Vector::Resize(size_t newn) { if (newn != nn) { if (v != NULL) delete[] (v); nn = newn; v = nn > 0 ? new T[nn] : NULL; } } template void Vector::Assign(size_t newn, const T& a) { if (newn != nn) { if (v != NULL) delete[] (v); nn = newn; v = nn > 0 ? new T[nn] : NULL; } for (size_t i=0;i Vector::~Vector() { if (v != NULL) delete[] (v); } // Assigns given constant value or default to all entries in vector template inline void Assign(Vector& v, T val = T()) { for (size_t i = 0; i < v.size(); ++i) v[i] = val; } #endif // CS_VECTOR_H_ hhsuite-2.0.16/src/cs/cstranslate_app.cc0000664172256617226630000003700512110430072022450 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #include "cs.h" #include "alignment-inl.h" #include "application.h" #include "blosum_matrix.h" #include "context_library.h" #include "count_profile-inl.h" #include "getopt_pp.h" #include "library_pseudocounts-inl.h" #include "matrix_pseudocounts-inl.h" #include "pssm.h" #include "sequence-inl.h" using namespace GetOpt; using std::string; using std::vector; namespace cs { struct CSTranslateAppOptions { static const int kAssignMatchColsByQuery = -1; CSTranslateAppOptions() { Init(); } virtual ~CSTranslateAppOptions() {} // Set csbuild default parameters void Init() { informat = "auto"; outformat = "seq"; pc_admix = 0.30; pc_ali = 4.0; pc_engine = "auto"; match_assign = kAssignMatchColsByQuery; weight_center = 1.6; weight_decay = 0.85; weight_as = 1000.0; verbose = true; } // Validates the parameter settings and throws exception if needed. void Validate() { if (infile.empty()) throw Exception("No input file provided!"); if (alphabetfile.empty()) throw Exception("No abstract states provided!"); } // The input alignment file with training data. string infile; // The output file. string outfile; // The file to which the output should be appended. string appendfile; // Input file with context profile library or HMM for generating pseudocounts string modelfile; // Input file with profile library to be used as abstract state alphabet string alphabetfile; // Input file format string informat; // Output file format (abstract state sequence or abstract state profile) string outformat; // Overall pseudocount admixture double pc_admix; // Constant in pseudocount calculation for alignments double pc_ali; // Pseudocount engine string pc_engine; // Match column assignment for FASTA alignments int match_assign; // Weight of central column in multinomial emission double weight_center; // Exponential decay of window weights double weight_decay; // Weight in emission calculation of abstract states double weight_as; // verbose output bool verbose; }; // CSTranslateAppOptions template class CSTranslateApp : public Application { private: // Runs the csbuild application. virtual int Run(); // Parses command line options. virtual void ParseOptions(GetOpt_pp& ops); // Prints options summary to stream. virtual void PrintOptions() const; // Prints short application description. virtual void PrintBanner() const; // Prints usage banner to stream. virtual void PrintUsage() const; // Writes abstract state sequence to outfile void WriteStateSequence(const Sequence& seq) const; // Writes abstract state profile to outfile void WriteStateProfile(const CountProfile& prof) const; // Parameter wrapper CSTranslateAppOptions opts_; // Profile library with abstract states scoped_ptr< ContextLibrary > as_lib_; // Profile library for context pseudocounts scoped_ptr< ContextLibrary > pc_lib_; // Pseudocount engine scoped_ptr< Pseudocounts > pc_; }; // class CSTranslateApp template void CSTranslateApp::ParseOptions(GetOpt_pp& ops) { ops >> Option('i', "infile", opts_.infile, opts_.infile); ops >> Option('o', "outfile", opts_.outfile, opts_.outfile); ops >> Option('a', "appendfile", opts_.appendfile, opts_.appendfile); ops >> Option('I', "informat", opts_.informat, opts_.informat); ops >> Option('O', "outformat", opts_.outformat, opts_.outformat); ops >> Option('M', "match-assign", opts_.match_assign, opts_.match_assign); ops >> Option('x', "pc-admix", opts_.pc_admix, opts_.pc_admix); ops >> Option('c', "pc-ali", opts_.pc_ali, opts_.pc_ali); ops >> Option('A', "alphabet", opts_.alphabetfile, opts_.alphabetfile); ops >> Option('D', "context-data", opts_.modelfile, opts_.modelfile); ops >> Option('p', "pc-engine", opts_.pc_engine, opts_.pc_engine); ops >> Option('w', "weight", opts_.weight_as, opts_.weight_as); ops >> Option('v', "verbose", opts_.verbose, opts_.verbose); opts_.Validate(); if (strcmp(opts_.outfile.c_str(), "stdout") == 0) opts_.verbose = false; if (opts_.outfile.empty() && opts_.appendfile.empty()) opts_.outfile = GetBasename(opts_.infile, false) + ".as"; if (opts_.informat == "auto") opts_.informat = GetFileExt(opts_.infile); if (opts_.pc_engine == "auto" && !opts_.modelfile.empty()) opts_.pc_engine = GetFileExt(opts_.modelfile); } template void CSTranslateApp::PrintBanner() const { fputs("Translate a sequence/alignment into an abstract state alphabet.\n", out_); } template void CSTranslateApp::PrintUsage() const { fputs("Usage: cstranslate -i -A [options]\n", out_); } template void CSTranslateApp::PrintOptions() const { fprintf(out_, " %-30s %s\n", "-i, --infile ", "Input file with alignment or sequence"); fprintf(out_, " %-30s %s\n", "-o, --outfile ", "Output file for generated abstract state sequence (def: .as)"); fprintf(out_, " %-30s %s\n", "-a, --append ", "Append generated abstract state sequence to this file"); fprintf(out_, " %-30s %s (def=%s)\n", "-I, --informat prf|seq|fas|...", "Input format: prf, seq, fas, a2m, or a3m", opts_.informat.c_str()); fprintf(out_, " %-30s %s (def=%s)\n", "-O, --outformat seq|prf", "Outformat: abstract state sequence or profile", opts_.outformat.c_str()); fprintf(out_, " %-30s %s\n", "-M, --match-assign [0:100]", "Make all FASTA columns with less than X% gaps match columns"); fprintf(out_, " %-30s %s\n", "", "(def: make columns with residue in first sequence match columns)"); fprintf(out_, " %-30s %s (def=off)\n", "-A, --alphabet ", "Abstract state alphabet consisting of exactly 219 states"); fprintf(out_, " %-30s %s (def=off)\n", "-D, --context-data ", "Add context-specific pseudocounts using given context-data"); fprintf(out_, " %-30s %s (def=%-.2f)\n", "-x, --pc-admix [0,1]", "Pseudocount admix for context-specific pseudocounts", opts_.pc_admix); fprintf(out_, " %-30s %s (def=%-.1f)\n", "-c, --pc-ali [0,inf[", "Constant in pseudocount calculation for alignments", opts_.pc_ali); fprintf(out_, " %-30s %s (def=%-.2f)\n", "-w, --weight [0,inf[", "Weight of abstract state column in emission calculation", opts_.weight_as); } template void CSTranslateApp::WriteStateSequence(const Sequence& seq) const { if (!opts_.outfile.empty()) { FILE* fout; if (strcmp(opts_.outfile.c_str(), "stdout") == 0) fout = stdout; else fout = fopen(opts_.outfile.c_str(), "w"); if (!fout) throw Exception("Can't write to output file '%s'!", opts_.outfile.c_str()); seq.Write(fout); if (opts_.verbose) fprintf(out_, "Wrote abstract state sequence to %s\n", opts_.outfile.c_str()); fclose(fout); } if (!opts_.appendfile.empty()) { FILE* fout = fopen(opts_.appendfile.c_str(), "a"); if (!fout) throw Exception("Can't append to file '%s'!", opts_.appendfile.c_str()); seq.Write(fout); if (opts_.verbose) fprintf(out_, "Appended abstract state sequence to %s\n", opts_.appendfile.c_str()); fclose(fout); } } template void CSTranslateApp::WriteStateProfile(const CountProfile& prof) const { if (!opts_.outfile.empty()) { FILE* fout; if (strcmp(opts_.outfile.c_str(), "stdout") == 0) fout = stdout; else fout = fopen(opts_.outfile.c_str(), "w"); if (!fout) throw Exception("Can't write to output file '%s'!", opts_.outfile.c_str()); prof.Write(fout); if (opts_.verbose) fprintf(out_, "Wrote abstract state count profile to %s\n", opts_.outfile.c_str()); fclose(fout); } if (!opts_.appendfile.empty()) { FILE* fout = fopen(opts_.appendfile.c_str(), "a"); if (!fout) throw Exception("Can't append to file '%s'!", opts_.appendfile.c_str()); prof.Write(fout); if (opts_.verbose) fprintf(out_, "Appended abstract state count profile to %s\n", opts_.appendfile.c_str()); fclose(fout); } } char GetMatchSymbol(double pp) { char rv = '='; if (pp > 0.8) rv = '|'; else if (pp > 0.6) rv = '+'; else if (pp > 0.4) rv = '.'; else if (pp > 0.2) rv = '-'; return rv; } inline int GetConfidence(double pp) { return static_cast(floor((pp - DBL_EPSILON) * 10)); } template int CSTranslateApp::Run() { // Setup pseudocount engine if (!opts_.modelfile.empty() && opts_.pc_engine == "lib") { if (opts_.verbose) fprintf(out_, "Reading context library for pseudocounts from %s ...\n", GetBasename(opts_.modelfile).c_str()); FILE* fin = fopen(opts_.modelfile.c_str(), "r"); if (!fin) throw Exception("Unable to read file '%s'!", opts_.modelfile.c_str()); pc_lib_.reset(new ContextLibrary(fin)); TransformToLog(*pc_lib_); fclose(fin); pc_.reset(new LibraryPseudocounts(*pc_lib_, opts_.weight_center, opts_.weight_decay)); } // Setup abstract state engine if (opts_.verbose) fprintf(out_, "Reading abstract state alphabet from %s ...\n", GetBasename(opts_.alphabetfile).c_str()); FILE* fin = fopen(opts_.alphabetfile.c_str(), "r"); if (!fin) throw Exception("Unable to read file '%s'!", opts_.alphabetfile.c_str()); as_lib_.reset(new ContextLibrary(fin)); if (as_lib_->size() != AS219::kSize) throw Exception("Abstract state alphabet should have %zu states but actually " "has %zu states!", AS219::kSize, as_lib_->size()); if (static_cast(as_lib_->wlen()) != 1) throw Exception("Abstract state alphabet should have a window length of %zu " "but actually has %zu!", 1, as_lib_->wlen()); TransformToLog(*as_lib_); fclose(fin); string header; CountProfile profile; // input profile we want to translate if (strcmp(opts_.infile.c_str(), "stdin") == 0) fin = stdin; else fin = fopen(opts_.infile.c_str(), "r"); if (!fin) throw Exception("Unable to read input file '%s'!", opts_.infile.c_str()); if (opts_.informat == "prf") { // read count profile from infile profile = CountProfile(fin);; if (profile.name.empty()) header = GetBasename(opts_.infile, false); else header = profile.name; if (pc_) { if (opts_.verbose) fprintf(out_, "Adding cs-pseudocounts (admix=%.2f) ...\n", opts_.pc_admix); CSBlastAdmix admix(opts_.pc_admix, opts_.pc_ali); profile.counts = pc_->AddTo(profile, admix); Normalize(profile.counts, profile.neff); } } else if (opts_.informat == "seq") { // build profile from sequence Sequence seq(fin); header = seq.header(); profile = CountProfile(seq); if (pc_) { if (opts_.verbose) fprintf(out_, "Adding cs-pseudocounts (admix=%.2f) ...\n", opts_.pc_admix); profile.counts = pc_->AddTo(seq, ConstantAdmix(opts_.pc_admix)); } } else { // build profile from alignment AlignmentFormat f = AlignmentFormatFromString(opts_.informat); Alignment ali(fin, f); header = ali.name(); if (f == FASTA_ALIGNMENT) { if (opts_.match_assign == CSTranslateAppOptions::kAssignMatchColsByQuery) ali.AssignMatchColumnsBySequence(0); else ali.AssignMatchColumnsByGapRule(opts_.match_assign); } profile = CountProfile(ali); if (pc_) { if (opts_.verbose) fprintf(out_, "Adding cs-pseudocounts (admix=%.2f) ...\n", opts_.pc_admix); CSBlastAdmix admix(opts_.pc_admix, opts_.pc_ali); profile.counts = pc_->AddTo(profile, admix); Normalize(profile.counts, profile.neff); } } fclose(fin); // close input file // Create emission functor needed for translation into abstract states Emission emission(1, opts_.weight_as, 1.0); // Prepare abstract sequence in AS219 format Sequence as_seq(profile.counts.length()); as_seq.set_header(header); // Translate count profile into abstract state count profile (Neff is one) CountProfile as_profile(profile.counts.length()); // output profile if (opts_.verbose) fputs("Translating count profile to abstract state alphabet AS219 ...\n", out_); for (size_t i = 0; i < as_profile.length(); ++i) CalculatePosteriorProbs(*as_lib_, emission, profile, i, as_profile.counts[i]); as_profile.name = GetBasename(opts_.infile, false); as_profile.name = as_profile.name.substr(0, as_profile.name.length() - 1); // We also build an abstract state sequence, either just for pretty printing or // even because this is the actual output that the user wants for (size_t i = 0; i < profile.counts.length(); ++i) { // Find state with maximal posterior prob and assign it to as_seq[i] size_t k_max = 0; double p_max = as_profile.counts[i][0]; for (size_t k = 1; k < AS219::kSize; ++k) { if (as_profile.counts[i][k] > p_max) { k_max = k; p_max = as_profile.counts[i][k]; } } as_seq[i] = k_max; } // Build pseudo-alignment for output const size_t nseqs = 5; const size_t header_width = 4; const size_t width = 100; vector ali(nseqs, ""); vector labels(nseqs, ""); labels[0] = "Pos"; labels[1] = "Cons"; labels[3] = "AS219"; labels[4] = "Conf"; BlosumMatrix sm; ali[1] = ConservationSequence(profile, sm); for (size_t i = 0; i < profile.counts.length(); ++i) { ali[0].append(strprintf("%d", (i + 1) % 10)); ali[2].push_back(GetMatchSymbol(as_profile.counts[i][as_seq[i]])); ali[3].push_back(as_seq.chr(i)); ali[4].append(strprintf("%d", GetConfidence(as_profile.counts[i][as_seq[i]]))); } // Print pseudo alignment in blocks if verbose if (opts_.verbose){ fputc('\n', out_); // blank line before alignment while (!ali.front().empty()) { for (size_t k = 0; k < nseqs; ++k) { string label = labels[k]; label += string(header_width - label.length() + 1, ' '); fputs(label.c_str(), out_); fputc(' ', out_); // separator between header and sequence size_t len = MIN(width, ali[k].length()); fputs(ali[k].substr(0, len).c_str(), out_); fputc('\n', out_); ali[k].erase(0, len); } fputc('\n', out_); // blank line after each block } } // Write abstract-state sequence or profile to outfile if (opts_.outformat == "seq") WriteStateSequence(as_seq); else WriteStateProfile(as_profile); return 0; } } // namespace cs int main(int argc, char* argv[]) { return cs::CSTranslateApp().main(argc, argv, stdout, "cstranslate"); } hhsuite-2.0.16/src/cs/blosum_matrix.h0000664172256617226630000000133412110430072022010 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_BLOSUM_MATRIX_H_ #define CS_BLOSUM_MATRIX_H_ #include "substitution_matrix-inl.h" namespace cs { enum BlosumType { BLOSUM45 = 0, BLOSUM62 = 1, BLOSUM80 = 2 }; // BLOSUM family of substitution matrices for class for substitution matrix // classes. class BlosumMatrix : public SubstitutionMatrix { public: BlosumMatrix(BlosumType matrix = BLOSUM62); virtual ~BlosumMatrix() {} private: // Initializes the matrix from target frequencies in raw data array. void Init(const float* blosum_xx); }; // Converts a BLOSUM matrix string to a BLOSUM matrix type. BlosumType BlosumTypeFromString(const std::string& s); } // namespace cs #endif // CS_BLOSUM_MATRIX_H_ hhsuite-2.0.16/src/cs/blast_hits.h0000664172256617226630000000652312110430072021264 0ustar hauserscientific_computing// Copyright 2009, Andreas Biegert #ifndef CS_BLAST_HITS_H_ #define CS_BLAST_HITS_H_ namespace cs { // Simple struct for data associated with a HSP. struct BlastHsp { BlastHsp() : bit_score(0.0), evalue(0.0), query_start(0), query_end(0), subject_start(0), subject_end(0) {} // Score (in bits) of HSP double bit_score; // E-value of HSP double evalue; // Start of HSP in query int query_start; // End of HSP in query int query_end; // Query sequence segment std::vector query_seq; // Start of HSP in subject int subject_start; // End of HSP in subject int subject_end; // Query sequence segment std::vector subject_seq; // Length of the HSP alignment size_t length; }; // Simple struct for data associated with each hit to a database sequence. struct BlastHit { BlastHit() : oid(0), evalue(0.0), bit_score(0.0) {} // The ordinal id of the subject sequence this HSP list int oid; // Name of the subject sequence. std::string definition; // Smallest e-value for HSPs of this hit. double evalue; // Highest bit score for HSPs of this hit. double bit_score; // List of HSP's for one database sequence. std::vector hsps; }; // A container class that class encapsulates all the search results of a // BLAST search. class BlastHits { public: typedef std::vector::iterator HitIter; typedef std::vector::const_iterator ConstHitIter; typedef std::vector::iterator HspIter; typedef std::vector::const_iterator ConstHspIter; // Constructs an empty hits object that can be filled by calling Read BlastHits() : query_length_(0) {} // Constructs an hit object from BLAST output in -m 0 format read from // file stream. explicit BlastHits(FILE* fin) { Read(fin); } // Accessors for integer at position i of the sequence. BlastHit& operator[](size_t i) { return hits_[i]; } const BlastHit& operator[](size_t i) const { return hits_[i]; } BlastHit& hit(size_t i) { return hits_[i]; } const BlastHit& hit(size_t i) const { return hits_[i]; } // Returns a const iterator to the first hit. ConstHitIter begin() const { return hits_.begin(); } // Returns a const iterator just past the end of the hits vector. ConstHitIter end() const { return hits_.end(); } // Returns an iterator to the first integer element of the sequence. HitIter begin() { return hits_.begin(); } // Returns an iterator just past the end of the sequence. HitIter end() { return hits_.end(); } // Returns number of hits. size_t nhits() const { return hits_.size(); } // Returns number of hits. size_t size() const { return hits_.size(); } // Returns length of query sequence. size_t query_length() const { return query_length_; } // Returns true if hit list is empty. bool empty() const { return hits_.empty(); } // Filters hits by e-value threshold. void Filter(double evalue_threshold); // Fills the hits object with with hits parsed from BLAST output. void Read(FILE* fin); // Prints the results for logging friend std::ostream& operator<< (std::ostream& out, const BlastHits& res); private: // List of hits in the BLAST results std::vector hits_; // Length of query sequence size_t query_length_; }; // class BlastHits } // namespace cs #endif // CS_BLAST_HITS_H_ hhsuite-2.0.16/src/hhfullalignment.C0000775172256617226630000003675612110430072021655 0ustar hauserscientific_computing// hhfullalignment.C #ifndef MAIN #define MAIN #include // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // clock #include // islower, isdigit etc using std::ios; using std::ifstream; using std::ofstream; using std::cout; using std::cerr; using std::endl; #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.h" // list data structure #include "hash.h" // hash data structure #include "hhdecl.C" // constants, class #include "hhutil.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "hhhmm.h" // class HMM #include "hhalignment.h" // class Alignment #include "hhhit.h" #include "hhhalfalignment.h" #endif ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // Methods of class FullAlignment ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Output Results: use classes HalfAlignment and FullAlignment // // Example: // Each column list contains at least a match state // Insert states between the match states are omitted // // step 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 // i 0 0 1 2 3 4 5 6 7 8 9 9 9 9 10 11 12 13 14 // // Q ~ ~ X X X X X X X X X ~ ~ ~ X X X X X // T Y Y Y Y Y Y Y Y ~ Y Y Y Y Y Y Y Y ~ ~ // // j 7 8 9 10 11 12 13 14 14 15 16 17 18 19 20 21 22 22 22 // state IM IM MM MM MM MM MM MM DG MM MM GD GD GD MM MM MM MI MI // // nsteps=19 // ///////////////////////////////////////////////////////////////////////////////////// // Constructor FullAlignment::FullAlignment(int maxseqdis) { qa = new HalfAlignment(maxseqdis); ta = new HalfAlignment(maxseqdis); if (!qa || !ta) MemoryError("space for formatting HMM-HMM alignment"); } ///////////////////////////////////////////////////////////////////////////////////// // Destructor FullAlignment::~FullAlignment() { delete qa; delete ta; } ///////////////////////////////////////////////////////////////////////////////////// // Free memory of arrays s[][], l[][], and m[][] in HalfAlignment void FullAlignment::FreeMemory() { qa->Unset(); ta->Unset(); } ///////////////////////////////////////////////////////////////////////////////////// // Add columns for match (and delete) states. ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::AddColumns(int i, int j, char prev_state, char state, float S, float PP) { switch(state) { case MM: //MM pair state (both query and template in Match state) AddGaps(); //fill up gaps until query and template parts have same length symbol[qa->pos] = ScoreChr(S); posterior[qa->pos] = PosteriorChr(PP); qa->AddColumn(i); ta->AddColumn(j); qa->AddInsertsAndFillUpGaps(i); ta->AddInsertsAndFillUpGaps(j); break; case GD: //-D state if (prev_state==DG) AddGaps(); symbol[ta->pos]='Q'; posterior[ta->pos] = ' '; ta->AddColumn(j); //query has gap -> add nothing ta->AddInsertsAndFillUpGaps(j); break; case IM: //IM state if (prev_state==MI) AddGaps(); symbol[ta->pos]='Q'; posterior[ta->pos] = ' '; ta->AddColumn(j); //query has gap -> add nothing ta->AddInsertsAndFillUpGaps(j); break; case DG: //D- state if (prev_state==GD) AddGaps(); symbol[qa->pos]='T'; posterior[qa->pos] = ' '; qa->AddColumn(i); //template has gap -> add nothing qa->AddInsertsAndFillUpGaps(i); break; case MI: //MI state if (prev_state==IM) AddGaps(); symbol[qa->pos]='T'; posterior[qa->pos] = ' '; qa->AddColumn(i); //template has gap -> add nothing qa->AddInsertsAndFillUpGaps(i); break; } } ///////////////////////////////////////////////////////////////////////////////////// // Fill up gaps until query and template parts have same length ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::AddGaps() { while (qa->pospos) qa->AddChar('.'); while (ta->pospos) ta->AddChar('.'); } ///////////////////////////////////////////////////////////////////////////////////// // Build full alignment -> qa->s[k][h] and ta->s[k][h] ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::Build(HMM* q, Hit& hit) { int step; char prev_state=MM, state=MM; int n; int hh; int k; identities=0; // number of identical residues in query and template sequence score_sim=0.0f; // substitution matrix similarity score between query and template ClearSymbols(); // Set up half-alignments // n is the sequence index up to which sequences are prepared for display n = imin( q->n_display,par.nseqdis+( q->nss_dssp>=0)+( q->nsa_dssp>=0)+( q->nss_pred>=0)+( q->nss_conf>=0)+( q->ncons>=0)); qa->Set( q->name, q->seq, q->sname, n, q->L, q->nss_dssp , q->nss_pred , q->nss_conf, q->nsa_dssp, q->ncons); n = imin(hit.n_display,par.nseqdis+(hit.nss_dssp>=0)+(hit.nsa_dssp>=0)+(hit.nss_pred>=0)+(hit.nss_conf>=0)+(hit.ncons>=0)); ta->Set(hit.name,hit.seq,hit.sname, n,hit.L,hit.nss_dssp,hit.nss_pred,hit.nss_conf,hit.nsa_dssp, hit.ncons); // printf("HMM: %s\nstep nst i j state hq ht\n",hit.name); for (step=hit.nsteps; step>=1; step--) { prev_state = state; state = hit.states[step]; // Add column to alignment and compute identities and sequence-sequence similarity score if (hit.P_posterior) AddColumns(hit.i[step],hit.j[step],prev_state,state,hit.S[step],hit.P_posterior[step]); else AddColumns(hit.i[step],hit.j[step],prev_state,state,hit.S[step],0.0); if (state==MM) { char qc=qa->seq[ q->nfirst][ qa->m[ q->nfirst][hit.i[step]] ]; char tc=ta->seq[hit.nfirst][ ta->m[hit.nfirst][hit.j[step]] ]; if (qc==tc && qc!='-') identities++; // count identical amino acids score_sim += S[(int)aa2i(qc)][(int)aa2i(tc)]; //fprintf(stderr,"%3i %3i %3i %3i %3i %1c %1c %6.2f %6.2f %6.2f %6.2f \n",step,hit.nsteps,hit.i[step],hit.j[step],int(state),qc,tc,S[(int)aa2i(qc)][(int)aa2i(tc)],score_sim,hit.P_posterior[step],hit.sum_of_probs); //DEBUG (P_posterior not defined for Viterbi!) } } AddGaps(); //fill up gaps until query and template parts have same length qa->AddChar('\0'); ta->AddChar('\0'); // Change gap symbol '.' (gap aligned to insert) to '~' if one HMM has gap with respect to other HMM for (hh=1; hhpos; hh++) { if (symbol[hh]=='Q') { // Gap in query (IM or GD state) symbol[hh]=' '; for (k=0; kn; k++) if (qa->s[k][hh]=='.') qa->s[k][hh]='-'; } else if (symbol[hh]=='T') { // Gap in template (MI or DG state) symbol[hh]=' '; for (k=0; kn; k++) if (ta->s[k][hh]=='.') ta->s[k][hh]='-'; } } // record in FullAlignment if posteriors were calculated //if (!hit.P_posterior) posterior[0]='\0'; else posterior[0]=' '; if (!hit.P_posterior) posterior[0]='\0'; } ///////////////////////////////////////////////////////////////////////////////////// // Print out header before full alignment ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::PrintHeader(FILE* outf, HMM* q, Hit& hit) { fprintf(outf,">%s\n",hit.longname); fprintf(outf,"Probab=%-.2f E-value=%-.2g Score=%-.2f Aligned_cols=%i Identities=%i%% Similarity=%-.3f Sum_probs=%.1f\n\n", hit.Probab,hit.Eval,hit.score,hit.matched_cols,iround(100.0*identities/hit.matched_cols),score_sim/hit.matched_cols,hit.sum_of_probs); } ///////////////////////////////////////////////////////////////////////////////////// // Print out full alignment in HHR format ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::PrintHHR(FILE* outf, Hit& hit) { const int NLEN=14; //Length of name field in front of multiple alignment int h=0; //counts position (column) in alignment int hh=0; //points to column at start of present output block of alignment int k; //counts sequences in query and template short unsigned int lq[MAXSEQ]; // lq[k] counts index of residue from query sequence k to be printed next; short unsigned int lt[MAXSEQ]; // lt[k] counts index of residue from template sequence k to be printed next; char namestr[NAMELEN]; //name of sequence int iq=hit.i1; // match state counter for query HMM (displayed in consensus line) int jt=hit.j1; // match state counter for template HMM (displayed in consensus line) for (k=0; kn; k++) lq[k]=qa->l[k][hit.i1]; for (k=0; kn; k++) lt[k]=ta->l[k][hit.j1]; while (hhpos-1) // print alignment block { // Print query secondary structure sequences for (k=0; kn; k++) { if (!(k==qa->nss_dssp || k==qa->nsa_dssp || k==qa->nss_pred || k==qa->nss_conf)) continue; if (k==qa->nsa_dssp) continue; if (k==qa->nss_dssp && !par.showdssp) continue; if ((k==qa->nss_pred || k==qa->nss_conf) && !par.showpred) continue; if (k==qa->nss_conf && !par.showconf) continue; strmcpy(namestr,qa->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"Q %-*.*s ",NLEN,NLEN,namestr); if (k==qa->nss_pred && qa->nss_conf>=0) for (h=hh; hpos-1); h++) fprintf(outf,"%1c",qa->s[qa->nss_conf][h]<='6' && qa->s[qa->nss_conf][h]>='0'? qa->s[k][h]+32 : qa->s[k][h] ); else for (h=hh; hpos-1); h++) fprintf(outf,"%1c",qa->s[k][h]); fprintf(outf,"\n"); } // Print query sequences for (k=0; kn; k++) { if (k==qa->nss_dssp || k==qa->nsa_dssp || k==qa->nss_pred || k==qa->nss_conf || k==qa->ncons) continue; strmcpy(namestr,qa->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"Q %-*.*s %4i ",NLEN,NLEN,namestr,lq[k]); for (h=hh; hpos-1); h++) {fprintf(outf,"%1c",qa->s[k][h]); lq[k]+=WordChr(qa->s[k][h]);} //WordChr() returns 1 if a-z or A-Z; 0 otherwise fprintf(outf," %4i (%i)\n",lq[k]-1,qa->l[k][qa->L+1]); } // Print query consensus sequence if (par.showcons && qa->ncons>=0) { k=qa->ncons; strmcpy(namestr,qa->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"Q %-*.*s %4i ",NLEN,NLEN,namestr,iq); for (h=hh; hpos-1); h++) { if (qa->s[k][h]=='x') qa->s[k][h]='~'; if (qa->s[k][h]!='-' && qa->s[k][h]!='.') iq++; fprintf(outf,"%1c",qa->s[k][h]); } fprintf(outf," %4i (%i)\n",iq-1,qa->L); } // Print symbols representing the score fprintf(outf," %*.*s ",NLEN,NLEN," "); for (h=hh; hpos-1); h++) fprintf(outf,"%1c",symbol[h]); fprintf(outf,"\n"); // Print template consensus sequence if (par.showcons && ta->ncons>=0) { k=ta->ncons; strmcpy(namestr,ta->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"T %-*.*s %4i ",NLEN,NLEN,namestr,jt); for (h=hh; hpos-1); h++) { if (ta->s[k][h]=='x') ta->s[k][h]='~'; if (ta->s[k][h]!='-' && ta->s[k][h]!='.') jt++; fprintf(outf,"%1c",ta->s[k][h]); } fprintf(outf," %4i (%i)\n",jt-1,ta->L); } // Print template sequences for (k=0; kn; k++) { if (k==ta->nss_dssp || k==ta->nsa_dssp || k==ta->nss_pred || k==ta->nss_conf || k==ta->ncons) continue; strmcpy(namestr,ta->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"T %-*.*s %4i ",NLEN,NLEN,namestr,lt[k]); for (h=hh; hpos-1); h++) {fprintf(outf,"%1c",ta->s[k][h]); lt[k]+=WordChr(ta->s[k][h]);} //WordChr() returns 1 if a-z or A-Z; 0 otherwise fprintf(outf," %4i (%i)\n",lt[k]-1,ta->l[k][ta->L+1]); } // Print template secondary structure sequences for (k=0; kn; k++) { if (!(k==ta->nss_dssp || k==ta->nss_pred || k==ta->nss_conf)) continue; if (k==ta->nsa_dssp) continue; if (k==ta->nss_dssp && !par.showdssp) continue; if ((k==ta->nss_pred || k==ta->nss_conf)&& !par.showpred) continue; if (k==ta->nss_conf && !par.showconf) continue; strmcpy(namestr,ta->sname[k],NAMELEN-1); strcut(namestr); fprintf(outf,"T %-*.*s ",NLEN,NLEN,namestr); if (k==ta->nss_pred && ta->nss_conf>=0) for (h=hh; hpos-1); h++) fprintf(outf,"%1c",ta->s[ta->nss_conf][h]<='6' && ta->s[ta->nss_conf][h]>='0'? ta->s[k][h]+32 : ta->s[k][h] ); else for (h=hh; hpos-1); h++) fprintf(outf,"%1c",ta->s[k][h]); fprintf(outf,"\n"); } // Print alignment confidence values (posterior probabilities)? if (posterior[0]!='\0') { fprintf(outf,"%-*.*s ",NLEN,NLEN,"Confidence "); for (h=hh; hpos-1); h++) fprintf(outf,"%1c",posterior[h]); fprintf(outf,"\n"); } hh=h; fprintf(outf,"\n\n"); } } ///////////////////////////////////////////////////////////////////////////////////// // Print out full alignment in A2M format ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::PrintA2M(FILE* outf, Hit& hit) { int k; //counts sequences in query and template int h,hh; // Print query sequences for (k=0; kn; k++) { if (k==qa->nsa_dssp) continue; if (k==qa->nss_dssp && !par.showdssp) continue; if ((k==qa->nss_pred || k==qa->nss_conf) && !par.showpred) continue; if (k==qa->ncons && !par.showcons) continue; fprintf(outf,">%s\n",qa->sname[k]); for (h=0,hh=-par.aliwidth; qa->s[k][h]>0; h++,hh++) { if (!hh) {fprintf(outf,"\n"); hh-=par.aliwidth;} fprintf(outf,"%1c",qa->s[k][h]); } fprintf(outf,"\n"); } // Print template sequences for (k=0; kn; k++) { if (k==ta->nsa_dssp) continue; if (k==ta->nss_dssp && !par.showdssp) continue; if ((k==ta->nss_pred || k==ta->nss_conf) && !par.showpred) continue; if (k==ta->ncons && !par.showcons) continue; fprintf(outf,">%s\n",ta->sname[k]); for (h=0,hh=-par.aliwidth; ta->s[k][h]>0; h++,hh++) { if (!hh) {fprintf(outf,"\n"); hh-=par.aliwidth;} fprintf(outf,"%1c",ta->s[k][h]); } fprintf(outf,"\n"); } fprintf(outf,"\n"); } ///////////////////////////////////////////////////////////////////////////////////// // Print out full alignment in A2M format ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::PrintFASTA(FILE* outf, Hit& hit) { // Transform sequences to uppercase and '.' to '-' qa->ToFASTA(); ta->ToFASTA(); PrintA2M(outf,hit); } ///////////////////////////////////////////////////////////////////////////////////// // Print out full alignment in A2M format ///////////////////////////////////////////////////////////////////////////////////// void FullAlignment::PrintA3M(FILE* outf, Hit& hit) { // Remove all '.' from sequences qa->RemoveChars('.'); ta->RemoveChars('.'); PrintA2M(outf,hit); } hhsuite-2.0.16/src/hhmatrices.C0000775172256617226630000006551412110430072020615 0ustar hauserscientific_computing// Substitution matrices and their background frequencies // The following background frequencies were calculated by the formula pa = (P[a,b]/(pa*pb))^(-1) * (1,...,1) // For the Blousum50-matrix this becomes pb[a]= SUM_(b=1,20) (2^(BLOSUM50[a,b]/3))^(-1) // A R N D C Q E G H I L K M F P S T W Y V // Gonnet 7.68,5.14,4.02,5.41,1.89,3.27,5.99,7.56,3.69,5.06,10.01,5.97,2.20,3.50,4.54,4.67,7.12,1.25,3.95,7.28 // BLOSUM50 8.24,6.24,4.46,4.77,2.03,2.90,6.78,6.69,2.53,6.89,10.7 ,5.04,1.49,4.93,3.97,5.95,6.13,1.34,3.45,6.28 #ifndef MAIN #include // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // exit #include // clock #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include "cs.h" // context-specific pseudocounts #include "context_library.h" #include "library_pseudocounts-inl.h" #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.C" // list data structure #include "hash.C" // hash data structure #include "hhdecl.C" // Constants, global variables, struct Parameters #include "hhutil.C" // MatchChr, InsertChr, aa2i, i2aa, log2, fast_log2, ScopID, WriteToScreen, #endif const float Gonnet[]={ // A R N D C Q E G H I L K M F P S T W Y V 10227, 3430, 2875, 3869, 1625, 2393, 4590, 6500, 2352, 3225, 5819, 4172, 1435, 1579, 3728, 4610, 6264, 418, 1824, 5709, // A 3430, 7780, 2209, 2589, 584, 2369, 3368, 3080, 2173, 1493, 3093, 5701, 763, 859, 1893, 2287, 3487, 444, 1338, 2356, // R 2875, 2209, 3868, 3601, 501, 1541, 2956, 3325, 1951, 1065, 2012, 2879, 532, 688, 1480, 2304, 3204, 219, 1148, 1759, // N 3869, 2589, 3601, 8618, 488, 2172, 6021, 4176, 2184, 1139, 2151, 3616, 595, 670, 2086, 2828, 3843, 204, 1119, 2015, // D 1625, 584, 501, 488, 5034, 355, 566, 900, 516, 741, 1336, 591, 337, 549, 419, 901, 1197, 187, 664, 1373, // C 2393, 2369, 1541, 2172, 355, 1987, 2891, 1959, 1587, 1066, 2260, 2751, 570, 628, 1415, 1595, 2323, 219, 871, 1682, // Q 4590, 3368, 2956, 6021, 566, 2891, 8201, 3758, 2418, 1624, 3140, 4704, 830, 852, 2418, 2923, 4159, 278, 1268, 2809, // E 6500, 3080, 3325, 4176, 900, 1959, 3758,26066, 2016, 1354, 2741, 3496, 741, 797, 2369, 3863, 4169, 375, 1186, 2569, // G 2352, 2173, 1951, 2184, 516, 1587, 2418, 2016, 5409, 1123, 2380, 2524, 600, 1259, 1298, 1642, 2446, 383, 876, 1691, // H 3225, 1493, 1065, 1139, 741, 1066, 1624, 1354, 1123, 6417, 9630, 1858, 1975, 2225, 1260, 1558, 3131, 417, 1697, 7504, // I 5819, 3093, 2012, 2151, 1336, 2260, 3140, 2741, 2380, 9630,25113, 3677, 4187, 5540, 2670, 2876, 5272, 1063, 3945,11005, // L 4172, 5701, 2879, 3616, 591, 2751, 4704, 3496, 2524, 1858, 3677, 7430, 949, 975, 2355, 2847, 4340, 333, 1451, 2932, // K 1435, 763, 532, 595, 337, 570, 830, 741, 600, 1975, 4187, 949, 1300, 1111, 573, 743, 1361, 218, 828, 2310, // M 1579, 859, 688, 670, 549, 628, 852, 797, 1259, 2225, 5540, 975, 1111, 6126, 661, 856, 1498, 1000, 4464, 2602, // F 3728, 1893, 1480, 2086, 419, 1415, 2418, 2369, 1298, 1260, 2670, 2355, 573, 661,11834, 2320, 3300, 179, 876, 2179, // P 4610, 2287, 2304, 2828, 901, 1595, 2923, 3863, 1642, 1558, 2876, 2847, 743, 856, 2320, 3611, 4686, 272, 1188, 2695, // S 6264, 3487, 3204, 3843, 1197, 2323, 4159, 4169, 2446, 3131, 5272, 4340, 1361, 1498, 3300, 4686, 8995, 397, 1812, 5172, // T 418, 444, 219, 204, 187, 219, 278, 375, 383, 417, 1063, 333, 218, 1000, 179, 272, 397, 4101, 1266, 499, // W 1824, 1338, 1148, 1119, 664, 871, 1268, 1186, 876, 1697, 3945, 1451, 828, 4464, 876, 1188, 1812, 1266, 9380, 2227, // Y 5709, 2356, 1759, 2015, 1373, 1682, 2809, 2569, 1691, 7504,11005, 2932, 2310, 2602, 2179, 2695, 5172, 499, 2227,11569};// V const float Blosum30[]= { // A R N D C Q E G H I L K M F P S T W Y V 0.0096, 0.0038,0.0109, 0.0031,0.0019,0.0055, 0.0043,0.0026,0.0027,0.0095, 0.0014,0.0011,0.0010,0.0010,0.0070, 0.0031,0.0031,0.0014,0.0018,0.0007,0.0039, 0.0044,0.0031,0.0024,0.0037,0.0018,0.0028,0.0094, 0.0052,0.0032,0.0032,0.0035,0.0011,0.0020,0.0035,0.0173, 0.0016,0.0014,0.0011,0.0011,0.0004,0.0010,0.0018,0.0015,0.0060, 0.0040,0.0022,0.0024,0.0018,0.0012,0.0016,0.0023,0.0036,0.0012,0.0072, 0.0056,0.0039,0.0032,0.0043,0.0023,0.0027,0.0051,0.0051,0.0022,0.0066,0.0139, 0.0044,0.0043,0.0027,0.0032,0.0010,0.0021,0.0053,0.0039,0.0013,0.0026,0.0044,0.0063, 0.0018,0.0012,0.0009,0.0008,0.0004,0.0007,0.0012,0.0013,0.0008,0.0014,0.0027,0.0017,0.0012, 0.0027,0.0023,0.0017,0.0011,0.0008,0.0010,0.0016,0.0022,0.0008,0.0027,0.0055,0.0023,0.0008,0.0077, 0.0028,0.0021,0.0012,0.0021,0.0007,0.0015,0.0030,0.0030,0.0014,0.0017,0.0027,0.0029,0.0005,0.0011,0.0091, 0.0056,0.0035,0.0028,0.0034,0.0013,0.0021,0.0038,0.0051,0.0017,0.0033,0.0047,0.0042,0.0010,0.0027,0.0024,0.0075, 0.0040,0.0019,0.0024,0.0024,0.0009,0.0016,0.0023,0.0028,0.0010,0.0027,0.0046,0.0025,0.0010,0.0016,0.0020,0.0041,0.0046, 0.0005,0.0007,0.0002,0.0004,0.0003,0.0004,0.0007,0.0011,0.0002,0.0005,0.0009,0.0006,0.0002,0.0007,0.0004,0.0005,0.0003,0.0027, 0.0014,0.0022,0.0008,0.0015,0.0004,0.0011,0.0016,0.0016,0.0010,0.0018,0.0045,0.0017,0.0007,0.0024,0.0011,0.0017,0.0014,0.0009,0.0044, 0.0056,0.0031,0.0022,0.0027,0.0012,0.0015,0.0026,0.0033,0.0012,0.0063,0.0074,0.0030,0.0015,0.0032,0.0017,0.0036,0.0036,0.0005,0.0024,0.0083}; const float Blosum40[]= { // A R N D C Q E G H I L K M F P S T W Y V 0.0148, 0.0029,0.0109, 0.0029,0.0019,0.0069, 0.0032,0.0021,0.0031,0.0126, 0.0015,0.0007,0.0007,0.0009,0.0093, 0.0026,0.0024,0.0017,0.0016,0.0004,0.0048, 0.0040,0.0026,0.0023,0.0048,0.0010,0.0032,0.0118, 0.0066,0.0023,0.0035,0.0031,0.0012,0.0020,0.0028,0.0260, 0.0014,0.0012,0.0013,0.0014,0.0003,0.0010,0.0015,0.0014,0.0060, 0.0037,0.0017,0.0017,0.0016,0.0008,0.0012,0.0018,0.0024,0.0009,0.0105, 0.0050,0.0030,0.0021,0.0027,0.0015,0.0023,0.0036,0.0034,0.0017,0.0082,0.0209, 0.0041,0.0051,0.0027,0.0030,0.0010,0.0026,0.0045,0.0035,0.0013,0.0023,0.0037,0.0099, 0.0017,0.0010,0.0007,0.0007,0.0003,0.0007,0.0010,0.0013,0.0007,0.0018,0.0037,0.0012,0.0018, 0.0022,0.0016,0.0013,0.0013,0.0008,0.0008,0.0015,0.0021,0.0009,0.0031,0.0055,0.0018,0.0011,0.0105, 0.0027,0.0014,0.0014,0.0019,0.0005,0.0013,0.0026,0.0028,0.0008,0.0020,0.0021,0.0023,0.0007,0.0010,0.0151, 0.0060,0.0025,0.0030,0.0030,0.0013,0.0026,0.0034,0.0052,0.0013,0.0025,0.0034,0.0034,0.0011,0.0019,0.0022,0.0089, 0.0040,0.0019,0.0022,0.0024,0.0011,0.0015,0.0025,0.0029,0.0009,0.0028,0.0039,0.0029,0.0011,0.0019,0.0022,0.0043,0.0070, 0.0007,0.0005,0.0003,0.0003,0.0001,0.0004,0.0005,0.0008,0.0002,0.0005,0.0009,0.0005,0.0002,0.0008,0.0003,0.0004,0.0003,0.0045, 0.0019,0.0016,0.0010,0.0011,0.0004,0.0010,0.0014,0.0017,0.0012,0.0020,0.0031,0.0017,0.0010,0.0032,0.0009,0.0015,0.0014,0.0008,0.0060, 0.0054,0.0023,0.0017,0.0022,0.0012,0.0014,0.0025,0.0028,0.0008,0.0083,0.0082,0.0027,0.0018,0.0031,0.0018,0.0032,0.0040,0.0005,0.0020,0.0113}; const float Blosum50[]= { // A R N D C Q E G H I L K M F P S T W Y V 0.0192, 0.0027,0.0152, 0.0024,0.0020,0.0101, 0.0026,0.0019,0.0035,0.0161, 0.0015,0.0005,0.0006,0.0005,0.0091, 0.0022,0.0025,0.0016,0.0017,0.0004,0.0057, 0.0034,0.0029,0.0023,0.0048,0.0006,0.0033,0.0141, 0.0062,0.0020,0.0031,0.0028,0.0009,0.0017,0.0023,0.0316, 0.0012,0.0013,0.0015,0.0011,0.0003,0.0010,0.0013,0.0011,0.0064, 0.0035,0.0015,0.0013,0.0012,0.0008,0.0011,0.0015,0.0018,0.0007,0.0140, 0.0048,0.0028,0.0017,0.0018,0.0014,0.0019,0.0026,0.0027,0.0013,0.0104,0.0304, 0.0033,0.0064,0.0027,0.0026,0.0006,0.0029,0.0043,0.0028,0.0014,0.0017,0.0027,0.0130, 0.0016,0.0009,0.0007,0.0005,0.0004,0.0008,0.0008,0.0009,0.0005,0.0022,0.0042,0.0010,0.0029, 0.0020,0.0012,0.0009,0.0008,0.0006,0.0007,0.0012,0.0015,0.0009,0.0030,0.0058,0.0012,0.0012,0.0154, 0.0022,0.0011,0.0011,0.0015,0.0004,0.0011,0.0019,0.0019,0.0006,0.0013,0.0017,0.0018,0.0005,0.0007,0.0171, 0.0062,0.0025,0.0032,0.0028,0.0011,0.0022,0.0030,0.0044,0.0012,0.0021,0.0029,0.0031,0.0010,0.0016,0.0018,0.0111, 0.0039,0.0021,0.0026,0.0022,0.0010,0.0015,0.0024,0.0025,0.0009,0.0029,0.0038,0.0026,0.0011,0.0015,0.0016,0.0047,0.0100, 0.0005,0.0004,0.0002,0.0002,0.0001,0.0003,0.0004,0.0005,0.0002,0.0005,0.0008,0.0004,0.0003,0.0009,0.0002,0.0003,0.0004,0.0059, 0.0015,0.0013,0.0009,0.0009,0.0004,0.0009,0.0012,0.0012,0.0013,0.0018,0.0027,0.0013,0.0007,0.0039,0.0006,0.0013,0.0012,0.0008,0.0077, 0.0054,0.0020,0.0015,0.0016,0.0013,0.0014,0.0020,0.0022,0.0007,0.0107,0.0092,0.0022,0.0021,0.0030,0.0016,0.0029,0.0041,0.0005,0.0018,0.0164}; const float Blosum62[] = { //A R N D C Q E G H I L K M F P S T W Y V 0.0215, 0.0023,0.0178, 0.0019,0.0020,0.0141, 0.0022,0.0016,0.0037,0.0213, 0.0016,0.0004,0.0004,0.0004,0.0119, 0.0019,0.0025,0.0015,0.0016,0.0003,0.0073, 0.0030,0.0027,0.0022,0.0049,0.0004,0.0035,0.0161, 0.0058,0.0017,0.0029,0.0025,0.0008,0.0014,0.0019,0.0378, 0.0011,0.0012,0.0014,0.0010,0.0002,0.0010,0.0014,0.0010,0.0093, 0.0032,0.0012,0.0010,0.0012,0.0011,0.0009,0.0012,0.0014,0.0006,0.0184, 0.0044,0.0024,0.0014,0.0015,0.0016,0.0016,0.0020,0.0021,0.0010,0.0114,0.0371, 0.0033,0.0062,0.0024,0.0024,0.0005,0.0031,0.0041,0.0025,0.0012,0.0016,0.0025,0.0161, 0.0013,0.0008,0.0005,0.0005,0.0004,0.0007,0.0007,0.0007,0.0004,0.0025,0.0049,0.0009,0.0040, 0.0016,0.0009,0.0008,0.0008,0.0005,0.0005,0.0009,0.0012,0.0008,0.0030,0.0054,0.0009,0.0012,0.0183, 0.0022,0.0010,0.0009,0.0012,0.0004,0.0008,0.0014,0.0014,0.0005,0.0010,0.0014,0.0016,0.0004,0.0005,0.0191, 0.0063,0.0023,0.0031,0.0028,0.0010,0.0019,0.0030,0.0038,0.0011,0.0017,0.0024,0.0031,0.0009,0.0012,0.0017,0.0126, 0.0037,0.0018,0.0022,0.0019,0.0009,0.0014,0.0020,0.0022,0.0007,0.0027,0.0033,0.0023,0.0010,0.0012,0.0014,0.0047,0.0125, 0.0004,0.0003,0.0002,0.0002,0.0001,0.0002,0.0003,0.0004,0.0002,0.0004,0.0007,0.0003,0.0002,0.0008,0.0001,0.0003,0.0003,0.0065, 0.0013,0.0009,0.0007,0.0006,0.0003,0.0007,0.0009,0.0008,0.0015,0.0014,0.0022,0.0010,0.0006,0.0042,0.0005,0.0010,0.0009,0.0009,0.0102, 0.0051,0.0016,0.0012,0.0013,0.0014,0.0012,0.0017,0.0018,0.0006,0.0120,0.0095,0.0019,0.0023,0.0026,0.0012,0.0024,0.0036,0.0004,0.0015,0.0196 }; const float Blosum65[]= { // A R N D C Q E G H I L K M F P S T W Y V 0.0222, 0.0022,0.0181, 0.0019,0.0019,0.0148, 0.0021,0.0015,0.0037,0.0225, 0.0016,0.0004,0.0004,0.0004,0.0127, 0.0018,0.0024,0.0015,0.0016,0.0003,0.0076, 0.0029,0.0025,0.0021,0.0049,0.0003,0.0034,0.0168, 0.0057,0.0016,0.0027,0.0024,0.0007,0.0013,0.0018,0.0396, 0.0010,0.0013,0.0014,0.0009,0.0002,0.0010,0.0013,0.0009,0.0096, 0.0031,0.0012,0.0009,0.0011,0.0012,0.0008,0.0012,0.0013,0.0006,0.0191, 0.0043,0.0023,0.0013,0.0014,0.0016,0.0016,0.0019,0.0020,0.0009,0.0115,0.0388, 0.0032,0.0062,0.0024,0.0024,0.0005,0.0030,0.0040,0.0024,0.0012,0.0015,0.0024,0.0166, 0.0013,0.0007,0.0005,0.0004,0.0004,0.0007,0.0006,0.0007,0.0003,0.0025,0.0052,0.0008,0.0045, 0.0016,0.0009,0.0007,0.0007,0.0005,0.0005,0.0008,0.0011,0.0008,0.0030,0.0056,0.0009,0.0012,0.0186, 0.0021,0.0009,0.0008,0.0011,0.0003,0.0008,0.0014,0.0013,0.0005,0.0009,0.0013,0.0015,0.0004,0.0005,0.0195, 0.0065,0.0022,0.0030,0.0027,0.0011,0.0018,0.0029,0.0037,0.0011,0.0017,0.0024,0.0030,0.0008,0.0012,0.0016,0.0137, 0.0037,0.0017,0.0022,0.0019,0.0009,0.0013,0.0021,0.0022,0.0007,0.0027,0.0033,0.0023,0.0010,0.0012,0.0013,0.0048,0.0133, 0.0004,0.0003,0.0002,0.0001,0.0002,0.0002,0.0002,0.0004,0.0002,0.0004,0.0007,0.0003,0.0002,0.0009,0.0001,0.0003,0.0003,0.0074, 0.0013,0.0009,0.0007,0.0006,0.0004,0.0006,0.0008,0.0008,0.0016,0.0015,0.0023,0.0010,0.0006,0.0043,0.0004,0.0010,0.0009,0.0010,0.0113, 0.0049,0.0015,0.0011,0.0012,0.0014,0.0011,0.0016,0.0017,0.0006,0.0120,0.0094,0.0019,0.0023,0.0025,0.0012,0.0023,0.0035,0.0004,0.0015,0.0206}; const float Blosum80[]= { // A R N D C Q E G H I L K M F P S T W Y V 0.0252, 0.0020,0.0210, 0.0016,0.0017,0.0166, 0.0018,0.0013,0.0037,0.0262, 0.0015,0.0003,0.0004,0.0003,0.0172, 0.0017,0.0024,0.0014,0.0014,0.0003,0.0094, 0.0028,0.0023,0.0019,0.0048,0.0003,0.0035,0.0208, 0.0053,0.0015,0.0025,0.0022,0.0006,0.0011,0.0017,0.0463, 0.0009,0.0012,0.0012,0.0008,0.0002,0.0011,0.0012,0.0008,0.0104, 0.0027,0.0010,0.0007,0.0008,0.0011,0.0007,0.0010,0.0009,0.0004,0.0220, 0.0036,0.0018,0.0011,0.0011,0.0014,0.0014,0.0015,0.0016,0.0008,0.0111,0.0442, 0.0029,0.0061,0.0022,0.0020,0.0004,0.0028,0.0036,0.0020,0.0010,0.0012,0.0019,0.0190, 0.0011,0.0006,0.0004,0.0003,0.0004,0.0007,0.0006,0.0005,0.0003,0.0025,0.0052,0.0007,0.0053, 0.0014,0.0007,0.0006,0.0006,0.0005,0.0005,0.0006,0.0009,0.0007,0.0027,0.0052,0.0007,0.0010,0.0211, 0.0021,0.0009,0.0007,0.0009,0.0003,0.0007,0.0012,0.0010,0.0004,0.0007,0.0012,0.0012,0.0003,0.0004,0.0221, 0.0064,0.0020,0.0029,0.0024,0.0010,0.0017,0.0026,0.0034,0.0010,0.0015,0.0021,0.0026,0.0007,0.0010,0.0014,0.0167, 0.0036,0.0015,0.0020,0.0016,0.0009,0.0012,0.0019,0.0019,0.0007,0.0024,0.0028,0.0020,0.0009,0.0011,0.0011,0.0048,0.0156, 0.0003,0.0002,0.0001,0.0001,0.0001,0.0002,0.0002,0.0003,0.0001,0.0003,0.0006,0.0002,0.0002,0.0007,0.0001,0.0002,0.0002,0.0087, 0.0011,0.0007,0.0006,0.0005,0.0003,0.0005,0.0006,0.0006,0.0016,0.0013,0.0020,0.0008,0.0005,0.0046,0.0003,0.0009,0.0008,0.0010,0.0148, 0.0046,0.0013,0.0009,0.0010,0.0013,0.0010,0.0015,0.0014,0.0005,0.0123,0.0089,0.0015,0.0022,0.0022,0.0010,0.0021,0.0033,0.0004,0.0012,0.0246}; // prediction accuracy of Psipred: // Ppred[cf][B][A] = P(A,B,cf)/P(A)/P(B,cf) = P(A|B,cf)/P(A) // A = observed ss state B = predicted ss state cf = confidence value of prediction //float Ppred[MAXCF][NSSPRED][NDSSP]= const float Ppred[]= { //pred/obs - H E ~ S T G B 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=- 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // H 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // E 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=0 1.000, 1.128, 0.519, 0.834, 0.957, 1.488, 2.106, 1.085 , // H 1.000, 0.233, 2.240, 1.216, 0.913, 0.519, 0.923, 1.759 , // E 1.000, 0.640, 1.017, 1.122, 1.069, 1.242, 2.140, 1.999 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=1 1.000, 1.251, 0.485, 0.771, 0.847, 1.371, 2.266, 0.864 , // H 1.000, 0.222, 2.542, 1.069, 0.804, 0.428, 0.671, 1.728 , // E 1.000, 0.474, 1.103, 1.295, 1.232, 1.214, 1.835, 1.989 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=2 1.000, 1.383, 0.426, 0.637, 0.778, 1.349, 2.436, 0.824 , // H 1.000, 0.202, 2.769, 0.999, 0.714, 0.320, 0.551, 1.566 , // E 1.000, 0.395, 1.005, 1.407, 1.376, 1.336, 1.725, 2.063 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=3 1.000, 1.531, 0.369, 0.552, 0.682, 1.280, 2.420, 0.698 , // H 1.000, 0.169, 2.970, 0.954, 0.556, 0.273, 0.489, 1.504 , // E 1.000, 0.352, 0.843, 1.515, 1.542, 1.456, 1.684, 1.958 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=4 1.000, 1.750, 0.305, 0.444, 0.537, 1.134, 2.295, 0.600 , // H 1.000, 0.124, 3.179, 0.847, 0.513, 0.228, 0.413, 1.897 , // E 1.000, 0.282, 0.718, 1.664, 1.630, 1.577, 1.625, 1.877 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=5 1.000, 1.952, 0.250, 0.353, 0.456, 0.982, 2.050, 0.466 , // H 1.000, 0.102, 3.464, 0.699, 0.453, 0.174, 0.284, 1.357 , // E 1.000, 0.227, 0.574, 1.782, 1.846, 1.681, 1.418, 1.885 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=6 1.000, 2.183, 0.171, 0.263, 0.319, 0.792, 1.933, 0.345 , // H 1.000, 0.079, 3.712, 0.612, 0.281, 0.133, 0.196, 1.089 , // E 1.000, 0.173, 0.458, 1.915, 2.007, 1.766, 1.220, 1.704 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=7 1.000, 2.389, 0.132, 0.192, 0.224, 0.605, 1.605, 0.183 , // H 1.000, 0.053, 3.997, 0.449, 0.201, 0.072, 0.141, 0.919 , // E 1.000, 0.109, 0.328, 2.013, 2.304, 1.882, 0.960, 1.512 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=8 1.000, 2.668, 0.065, 0.098, 0.144, 0.354, 1.059, 0.102 , // H 1.000, 0.029, 4.285, 0.284, 0.113, 0.044, 0.059, 0.522 , // E 1.000, 0.053, 0.200, 2.099, 2.444, 2.133, 0.671, 1.290 , // ~ 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=9 1.000, 2.966, 0.009, 0.023, 0.036, 0.113, 0.214, 0.017 , // H 1.000, 0.010, 4.555, 0.119, 0.027, 0.010, 0.013, 0.209 , // E 1.000, 0.026, 0.101, 2.576, 1.853, 2.204, 0.308, 0.499 // ~ }; // float Ppred[]= // { // //pred/obs - H E ~ S T G B // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=- // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=0 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=1 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=2 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=3 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=4 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=5 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=6 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=7 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=8 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ // 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=9 // 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H // 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E // 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ float Pobs[]={0, 0.3268,0.2119,0.2061,0.0913,0.1143,0.0376,0.0120}; float Pevo_full[]= { // - H E C 1.00, 0.00, 0.00, 0.00, 0.00, 0.94, 0.00, 0.04, 0.00, 0.00, 0.92, 0.04, 0.00, 0.06, 0.08, 0.92 }; //psipred accuracy for confidence values 0-9 const float p_acc[]={0.00,0.47,0.53,0.56,0.58,0.62,0.69,0.74,0.82,0.88,0.96}; void SetBlosumMatrix(const float BlosumXX[]) { int a,b,n=0; if (v>=3) printf("Using the BLOSUM%2i matrix",par.matrix); for (a=0; a<20; ++a) for (pb[a]=0.0f, b=0; b<=a; ++b,++n) P[a][b] = BlosumXX[n]; for (a=0; a<19; a++) for (b=a+1; b<20; ++b) P[a][b] = P[b][a]; return; } ///////////////////////////////////////////////////////////////////////////////////// // Set (global variable) substitution matrix with derived matrices and background frequencies ///////////////////////////////////////////////////////////////////////////////////// void SetSubstitutionMatrix() { int a,b; switch (par.matrix) { default: case 0: //Gonnet matrix if (v>=3) cout<<"Using the Gonnet matrix "; for (a=0; a<20; ++a) for (pb[a]=0.0f, b=0; b<20; ++b) P[a][b] = 0.000001f*Gonnet[a*20+b]; break; case 30: //BLOSUM30 SetBlosumMatrix(Blosum30); break; case 40: //BLOSUM40 SetBlosumMatrix(Blosum40); break; case 50: //BLOSUM50 SetBlosumMatrix(Blosum50); break; case 62: //BLOSUM62 SetBlosumMatrix(Blosum62); break; case 65: //BLOSUM65 SetBlosumMatrix(Blosum65); break; case 80: //BLOSUM80 SetBlosumMatrix(Blosum80); break; } // Check transition probability matrix, renormalize P and calculate pb[a] float sumab=0.0f; for (a=0; a<20; a++) for (b=0; b<20; ++b) sumab+=P[a][b]; for (a=0; a<20; a++) for (b=0; b<20; ++b) P[a][b]/=sumab; for (a=0; a<20; a++) for (pb[a]=0.0f, b=0; b<20; ++b) pb[a]+=P[a][b]; //Compute similarity matrix for amino acid pairs (for calculating consensus sequence) for (a=0; a<20; ++a) for (b=0; b<20; ++b) Sim[a][b] = P[a][b]*P[a][b]/P[a][a]/P[b][b]; //Precompute matrix R for amino acid pseudocounts: for (a=0; a<20; ++a) for (b=0; b<20; ++b) R[a][b] = P[a][b]/pb[b]; //R[a][b]=P(a|b) //Precompute matrix R for amino acid pseudocounts: for (a=0; a<20; ++a) for (b=0; b<20; ++b) S[a][b] = log2(R[a][b]/pb[a]); // S[a][b] = log2(P(a,b)/P(a)/P(b)) // Evaluate sequence identity underlying substitution matrix if (v>=3) { float id=0.0f; float entropy=0.0f; float entropy_pb=0.0f; float mut_info=0.0f; for (a=0; a<20; ++a) id+=P[a][a]; for (a=0; a<20; ++a) entropy_pb-=pb[a]*log2(pb[a]); for (a=0; a<20; ++a) for (b=0; b<20; ++b) { entropy-=P[a][b]*log2(R[a][b]); mut_info += P[a][b]*S[a][b]; } printf(": sequence identity = %2.0f%%; entropy per column = %4.2f bits (out of %4.2f); mutual information = %4.2f bits\n",100*id,entropy,entropy_pb,mut_info); } if (v>=4) //Debugging: probability matrix and dissimilarity matrix { cout<<"Check matrix: before renormalization sum P(a,b)= "< // cin, cout, cerr #include // ofstream, ifstream #include // printf using std::cout; using std::cerr; using std::endl; using std::ios; using std::ifstream; using std::ofstream; #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // clock #include // islower, isdigit etc #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.h" // list data structure #include "hash.h" // hash data structure #include "hhdecl.C" #include "hhutil.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "hhhmm.h" #endif ///////////////////////////////////////////////////////////////////////////////////// // Class Alignment ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // Object constructor ///////////////////////////////////////////////////////////////////////////////////// Alignment::Alignment(int maxseq, int maxres) { longname = new(char[DESCLEN]); sname = new(char*[maxseq+2]); seq = new(char*[maxseq+2]); l = new(int[maxres]); X = new(char*[maxseq+2]); I = new(short unsigned int*[maxseq+2]); keep = new(char[maxseq+2]); display = new(char[maxseq+2]); wg = new(float[maxseq+2]); nseqs = new(int[maxres+2]); N_in=L=0; nres=NULL; // number of residues per sequence k first=NULL; // first residue in sequence k last=NULL; // last residue in sequence k ksort=NULL; // sequence indices sorted by descending nres[k] name[0]='\0'; // no name defined yet longname[0]='\0'; // no name defined yet fam[0]='\0'; // no name defined yet file[0]='\0'; // no name defined yet readCommentLine = '0'; } ///////////////////////////////////////////////////////////////////////////////////// // Object destructor ///////////////////////////////////////////////////////////////////////////////////// Alignment::~Alignment() { delete[] longname; for(int k=0; k') //line contains sequence name { if (k>=MAXSEQ-1) { if (v>=1 && k>=MAXSEQ) cerr<=0) //if this is at least the second name line { if (strlen(cur_seq)<=1) // 1, because the sequence in cur_seq starts at position 1 => no residues = length 1 { cerr<no_name_123 { cur_name = no_name; sprintf(cur_name,"no_name_%i",k); } else if (cur_name[0]=='@') cur_name = strscn(cur_name+1); //skip @-character in name l=1; //position in current sequence (first=1) cur_seq[l]='\0'; // avoids taking wrong sequence in case the input alignment is corrupted (two header lines with no sequence line between) // display[k]= 0: do not show in Q-T alignments 1: show if not filtered out later 2: show in any case (do not filter out) // keep[k] = 0: do not include in profile 1: include if not filtered out later 2: include in any case (do not filter out) if (!strncmp(line,">ss_dssp",8)) { if (kss_dssp<0) {display[k]=2; n_display++; keep[k]=0; kss_dssp=k; N_ss++;} else {skip_sequence=1; k--; continue;} } else if (!strncmp(line,">sa_dssp",8)) { if (ksa_dssp<0) {display[k]=2; n_display++; keep[k]=0; ksa_dssp=k; N_ss++;} else {skip_sequence=1; k--; continue;} } else if (!strncmp(line,">ss_pred",8)) { if (kss_pred<0) {display[k]=2; n_display++; keep[k]=0; kss_pred=k; N_ss++;} else {skip_sequence=1; k--; continue;} } else if (!strncmp(line,">ss_conf",8)) { if (kss_conf<0) {display[k]=2; n_display++; keep[k]=0; kss_conf=k; N_ss++;} else {skip_sequence=1; k--; continue;} } else if (!strncmp(line,">ss_",4) || !strncmp(line,">sa_",4)) { display[k]=2; n_display++; keep[k]=0; N_ss++; } else if (!strncmp(line,">aa_",4)) { // ignore sequences beginning with ">aa_" skip_sequence=1; k--; continue; } //store first real seq else if (kfirst<0) { char word[NAMELEN]; strwrd(word,line,NAMELEN); // Copies first word in ptr to str if (strstr(word,"_consensus")) {display[k]=2; keep[k]=0; n_display++; kfirst=k;} else {display[k]=keep[k]=2; n_display++; kfirst=k;} } //store all sequences else if (par.mark==0) {display[k]=keep[k]=1; n_display++;} //store sequences up to nseqdis else if (line[1]=='@'&& n_display-N_ss=4) printf("Reading seq %-16.16s k=%3i n_displ=%3i display[k]=%i keep[k]=%i\n",cur_name,k,n_display,display[k],keep[k]); sname[k] = new(char[strlen(cur_name)+1]); if (!sname[k]) {MemoryError("array for sequence names");} strcpy(sname[k],cur_name); } // end if(line contains sequence name) else if (line[0]=='#') // Commentary line? { // #PF01367.9 5_3_exonuc: 5'-3' exonuclease, C-terminal SAM fold; PDB 1taq, 1bgx (T:271-174), 1taq (271-174) if (name[0]) continue; // if already name defined: skip commentary line char *ptr1; ptr1=strscn_(line+1); // set ptr1 to first non-whitespace character after '#' -> AC number strncpy(longname,ptr1,DESCLEN-1); // copy whole commentary line after '# ' into longname longname[DESCLEN-1]='\0'; strtr(longname,""," "); strcut_(ptr1); // cut after AC number and set ptr2 to first non-whitespace character after AC number // char* ptr2=strcut_(ptr1); // **instead** of previous line // strcpy(fam,ptr1); // copy AC number to fam // if (!strncmp(fam,"PF",2)) strcut_(fam,'.'); // if PFAM identifier contains '.' cut it off // strcut_(ptr2); // cut after first word ... strmcpy(name,ptr1,NAMELEN-1); // ... and copy first word into name readCommentLine = '1'; } //line contains sequence residues or SS information and does not belong to a >aa_ sequence else if (!skip_sequence) { if (v>=4) cout<'\0' && l=0) // ignore white-space characters ' ', \t and \n (aa2i()==-1) {cur_seq[l]=line[h]; l++;} else if (aa2i(line[h])==-2 && v) cerr<'\0' && l=0 && ss2i(line[h])<=7) {cur_seq[l]=ss2ss(line[h]); l++;} else if (v) cerr<'\0' && l=0) cur_seq[l++]=line[h]; else if (v) cerr<'\0' && l=0 && ss2i(line[h])<=3) {cur_seq[l]=ss2ss(line[h]); l++;} else if (v) cerr<'\0' && l='0' && line[h]<='9')) {cur_seq[l]=line[h]; l++;} else if (v) cerr<sa_pred etc { while (h'\0' && l='0' && line[h]<='9') || (line[h]>='A' && line[h]<='B')) {cur_seq[l]=line[h]; l++;} else if (v) cerr<=par.maxcol-1) { cerr<=0) //if at least one sequence was read in { seq[k]=new(char[strlen(cur_seq)+2]); if (!seq[k]) MemoryError("array for input sequences"); X[k]=new(char[strlen(cur_seq)+2]); if (!X[k]) MemoryError("array for input sequences"); I[k]=new(short unsigned int[strlen(cur_seq)+2]); if (!I[k]) MemoryError("array for input sequences"); strcpy(seq[k],cur_seq); } else {cerr< extract from first sequence { char* ptr; // strtr(sname[kfirst],"~"," "); // 'transpose': replaces the tilde with a blanc everywhere in sname[kfirst] strncpy(longname,sname[kfirst],DESCLEN-1); // longname is name of first sequence longname[DESCLEN-1]='\0'; strncpy(name,sname[kfirst],NAMELEN-1); // Shortname is first word of longname... name[NAMELEN-1]='\0'; ptr = strcut(name); // ...until first white-space character if (ptr && islower(ptr[0]) && ptr[1]=='.' && isdigit(ptr[2])) //Scop family code present as second word? { lwrstr(name); // Transform upper case to lower case strcut(ptr); // Non-white-space characters until next white-space character.. strcpy(fam,ptr); // ...are the SCOP familiy code } else if (name[0]=='P' && name[1]=='F' && isdigit(name[2]) && isdigit(name[3]) ) //Pfam code { strcpy(fam,name); // set family name = Pfam code } } // Checking for warning messages if (v==0) return; if (v>=2) cout<<"Read "<=3) cout<<"Query sequence for alignment has number "< WARNING static short unsigned int h[MAXSEQ]; //points to next character in seq[k] to be written // for (k=0;k%s\n%s\n",k,sname[k],seq[k]); // DEBUG // Initialize for (k=0;k=3) { if (par.M==1) cout<<"Using match state assignment by capital letters (a2m/a3m format)\n"; else if (par.M==2) cout<<"Using percentage-rule match state assignment\n"; else if (par.M==3) cout<<"Using residues of first sequence as match states\n"; } // Warn, if there are gaps in a single sequence if (v>=1 && N_in-N_ss==1 && par.M!= 2 && strchr(seq[kfirst]+1,'-')!=NULL) fprintf(stderr, "WARNING: File %s has a single sequence containing gaps, which will be ignored.\nIf you want to treat the gaps as match states, use the '-M 100' option.\n",infile); // Too few match states? if (par.M==1) { int match_states = strcount(seq[kfirst],'A','Z') + strcount(seq[kfirst]+1,'-','-'); if (match_states < 6) { if (N_in-N_ss<=1) { par.M=3; // if only single sequence in input file, use par.M=3 (match states by first seq) fprintf(stderr, "WARNING: single sequence in file %s contains only %i match_states! Switching to option -M first\n seq=%s\n",infile,match_states,seq[kfirst]); } else if (v>=1) fprintf(stderr, "WARNING: Master sequence in file %s contains only %i match_states!\nseq=%s\n",infile,match_states,seq[kfirst]); } } // Create matrices X and I with amino acids represented by integer numbers switch(par.M) { ///////////////////////////////////////////////////////////////////////////////////// // a2m/a3m format: match states capital case, inserts lower case, delete states '-', inserted gaps '.' // The confidence values for ss prediction are interpreted as follows: 0-9:match states(!) '-' :match state '.':insert case 1: default: // Warn if alignment is ment to be -M first or -M <%> instead of A2M/A3M if (v>=2 && strchr(seq[kfirst],'-') ) // Seed/query sequence contains a gap ... { unsigned int len = strlen(seq[kfirst])-1; for (k=1; k=N_in) // ... but alignment contains no lower case residue fprintf(stderr,"WARNING: input alignment %s looks like aligned FASTA instead of A2M/A3M format. Consider using '-M first' or '-M 50'\n",infile); } // Remove '.' characters from seq[k] for(k=0; kss_dssp, >ss_pred, >ss_conf, >aa_... sequences { while((c=seq[k][l++])) // assign residue to c at same time { if (c>='a' && c<='z') I[k][i-1]++;//insert state = lower case character else if (c!='.') //match state = upper case character { X[k][i]=aa2i(c); I[k][i]=0; ++i; } } } else if (k==kss_dssp || k==kss_pred) // does alignment contain sequence of secondary structure states? { while((c=seq[k][l++])) // assign residue to c at same time if (c!='.' && !(c>='a' && c<='z')) X[k][i++]=ss2i(c); //match state = upper case character } else if (k==ksa_dssp) // does alignment contain sequence of prediction confidence values? { while((c=seq[k][l++])) // assign residue to c at same time if (c!='.' && !(c>='a' && c<='z')) X[k][i++]=sa2i(c); //match state = upper case character } else if (k==kss_conf) // does alignment contain sequence of prediction confidence values? { while((c=seq[k][l++])) // assign residue to c at same time if (c!='.') X[k][i++]=cf2i(c); //match state = 0-9 or '-' } else if (k==kfirst) // does alignment contain sequence of prediction confidence values? { while((c=seq[k][l++])) // assign residue to c at same time if (c!='.') { X[k][i]=aa2i(c); I[k][i]=0; ++i; } } else continue; i--; if (L!=i && L!=par.maxres-2 && !unequal_lengths) unequal_lengths=k; //sequences have different lengths L=imin(L,i); } if (unequal_lengths) break; //Replace GAP with ENDGAP for all end gaps for (k=0; k=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; } for (i=1; i<=L; ++i) this->l[i]=i; //assign column indices to match states if (L<=0) { cerr<<"\nError in "< option"<=2) { fprintf(stderr,"WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",L); break; } if (v>=2) cout<<"Alignment in "<=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; } // Add up percentage of gaps for (l=1; l<=L; l++) { float res=0; float gap=0; for (k=0; k< N_in; ++k) if (keep[k]) { if (X[k][l]=4) cout<<"percent gaps["<=par.maxres-2) { if (v>=1) fprintf(stderr,"WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",i); break; } ++i; this->l[i]=l; for (k=0; k=2) cout<<"Alignment in "<=3) printf("Length of first seq = %i\n",L); // Check for sequences with unequal lengths for (k=1; k match state for (l=1; l<=L; l++) if (isalpha(seq[kfirst][l])) match_state[l]=1; else match_state[l]=0; // Throw out insert states and keep only match states for (k=0; k=par.maxres-2) { if (v>=1) fprintf(stderr,"WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",i); break; } ++i; this->l[i]=l; for (k=0; k=2) cout<<"Alignment in "<=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; } delete[] match_state; break; } } //end switch() ///////////////////////////////////////////////////////////////////////////////////// // Error if (unequal_lengths) { strcut(sname[unequal_lengths]); cerr<=2 && !strncmp(infile,"merged A3M",10)) { fprintf(stderr,"Merged MSA:\n"); for (k=0; k<=unequal_lengths; ++k) fprintf(stderr,"%3i\n>%s\n%s\n",k,sname[k],seq[k]); } exit(1); } if (L == 0) { cerr<=2 && !par.cons) { for (i=1; i<=L; ++i) if (X[kfirst][i]==GAP) { printf("NOTE: Use the '-cons' option to calculate a consensus sequence as first sequence of the alignment.\n"); break; } } // DEBUG if (v>=4) for (k=0; k"<9) cout<<"X"; else cout<n_seqs; ++qk) { if (qk==q->ncons) {continue;} // Create space for residues and paste new sequence in seq[k]=new(char[strlen(q->seq[qk])+1]); if (!seq[k]) MemoryError("array for input sequences"); strcpy(seq[k],q->seq[qk]); X[k]=new(char[strlen(q->seq[qk])+1]); if (!X[k]) MemoryError("array for input sequences"); I[k]=new(short unsigned int[strlen(q->seq[qk])+1]); if (!I[k]) MemoryError("array for input sequences"); if (qk==q->nss_dssp) { display[k]=2; n_display++; keep[k]=0; kss_dssp=k; N_ss++; } else if (qk==q->nsa_dssp) { display[k]=2; n_display++; keep[k]=0; ksa_dssp=k; N_ss++; } else if (qk==q->nss_pred) { display[k]=2; n_display++; keep[k]=0; kss_pred=k; N_ss++; } else if (qk==q->nss_conf) { display[k]=2; n_display++; keep[k]=0; kss_conf=k; N_ss++; } else { if (kfirst<0) { display[k]=keep[k]=2; n_display++; kfirst=k; } else { display[k]=keep[k]=1; n_display++; } } // store sequence name if (v>=3) printf("\nReading seq %-16.16s k=%3i n_displ=%3i display[k]=%i keep[k]=%i\n",q->sname[qk],k,n_display,display[k],keep[k]); sname[k] = new(char[strlen(q->sname[qk])+1]); if (!sname[k]) {MemoryError("array for sequence names");} strcpy(sname[k],q->sname[qk]); ++k; } N_in = k; strcpy(longname,q->longname); strmcpy(name,q->name,NAMELEN-1); strmcpy(fam,q->fam,NAMELEN-1); return; } ///////////////////////////////////////////////////////////////////////////////////// // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) or coverage=0) display[kss_dssp]=0; if (ksa_dssp>=0) display[ksa_dssp]=0; if (kss_pred>=0) display[kss_pred]=0; if (kss_conf>=0) display[kss_conf]=0; for (seqid=imin(10,max_seqid); n_displayN) { for (int k=0; k=0) {display[kss_dssp]=1; n_display++;} if (ksa_dssp>=0) {display[ksa_dssp]=1; n_display++;} if (kss_pred>=0) {display[kss_pred]=1; n_display++;} if (kss_conf>=0) {display[kss_conf]=1; n_display++;} delete[] dummy; return n_display; } ///////////////////////////////////////////////////////////////////////////////////// // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) or coverage0, remove sequences with minimum-sequence-identity filter of between seqid1 // and seqid2 (%), where the minimum seqid threshold is determined such that, // in all column blocks of at least WMIN=25 residues, at least Ndiff sequences are left. // This ensures that in multi-domain proteins sequences covering one domain are not // removed completely because sequences covering other domains are more diverse. // // Allways the shorter of two compared sequences is removed (=> sort sequences by length first). // Please note: sequence identity of sequence x with y when filtering x is calculated as // number of residues in sequence x that are identical to an aligned residue in y / number of residues in x // Example: two sequences x and y are 100% identical in their overlapping region but one overlaps by 10% of its // length on the left and the other by 20% on the right. Then x has 10% seq.id with y and y has 20% seq.id. with x. ///////////////////////////////////////////////////////////////////////////////////// int Alignment::Filter2(char keep[], int coverage, int qid, float qsc, int seqid1, int seqid2, int Ndiff) { // In the beginnning, keep[k] is 1 for all regular amino acid sequences and 0 for all others (ss_conf, ss_pred,...) // In the end, keep[k] will be 1 for all regular representative sequences kept in the alignment, 0 for all others char* in=new(char[N_in+1]); // in[k]=1: seq k has been accepted; in[k]=0: seq k has not yet been accepted at current seqid char* inkk=new(char[N_in+1]); // inkk[k]=1 iff in[ksort[k]]=1 else 0; int* Nmax=new(int[L+2]); // position-dependent maximum-sequence-identity threshold for filtering? (variable used in former version was idmax) int* idmaxwin=new(int[L+2]); // minimum value of idmax[i-WFIL,i+WFIL] int* seqid_prev=new(int[N_in+1]); // maximum-sequence-identity threshold used in previous round of filtering (with lower seqid) int* N=new(int[L+2]); // N[i] number of already accepted sequences at position i const int WFIL=25; // see previous line int diffNmax=Ndiff; // current maximum difference of Nmax[i] and Ndiff int diffNmax_prev=0; // previous maximum difference of Nmax[i] and Ndiff int seqid; // current maximum value for the position-dependent maximum-sequence-identity thresholds in idmax[] int seqid_step=0; // previous increment of seqid float diff_min_frac; // minimum fraction of differing positions between sequence j and k needed to accept sequence k float qdiff_max_frac=0.9999-0.01*qid; // maximum allowable number of residues different from query sequence int diff; // number of differing positions between sequences j and k (counted so far) int diff_suff; // number of differing positions between sequences j and k that would be sufficient int qdiff_max; // maximum number of residues required to be different from query int cov_kj; // upper limit of number of positions where both sequence k and j have a residue int first_kj; // first non-gap position in sequence j AND k int last_kj; // last non-gap position in sequence j AND k int kk, jj; // indices for sequence from 1 to N_in int k, j; // kk=ksort[k], jj=ksort[j] int i; // counts residues int n; // number of sequences accepted so far // Initialize in[k] for (n=k=0; k=1; i--) if (X[k][i]=N_in) {seqid1=seqid2; Ndiff=N_in; diffNmax=Ndiff;} // Check coverage and sim-to-query criteria for each sequence k for (k=0; k reject once and for all float qsc_sum=0.0; // Check if score-per-column with query is at least qsc if (qsc>-10) { float qsc_min = qsc*nres[k]; // minimum total score of seq k with query int gapq=0, gapk=0; // number of consecutive gaps in query or k'th sequence at position i for (int i=first[k]; i<=last[k]; ++i) { if (X[k][i]<20) { gapk=0; if (X[kfirst][i]<20) { gapq=0; qsc_sum += S[(int)X[kfirst][i]][(int)X[k][i]]; } else if (gapq++) qsc_sum-=PLTY_GAPEXTD; else qsc_sum-=PLTY_GAPOPEN; } else if (X[kfirst][i]<20) { gapq=0; if (gapk++) qsc_sum-=PLTY_GAPEXTD; else qsc_sum-=PLTY_GAPOPEN; } } // printf("k=%3i qsc=%6.2f\n",k,qsc_sum); if (qsc_sum reject once and for all } //Check if sequence similarity with query at least qid? if (qdiff_max_frac<0.999) { qdiff_max=int(qdiff_max_frac*nres[k]+0.9999); // printf("k=%-4i nres=%-4i qdiff_max=%-4i first=%-4i last=%-4i",k,nres[k],qdiff_max,first[k],last[k]); diff=0; for (int i=first[k]; i<=last[k]; ++i) // enough different residues to reject based on minimum qid with query? => break if (X[k][i]<20 && X[k][i]!=X[kfirst][i] && ++diff>=qdiff_max) break; // printf(" diff=%4i\n",diff); if (diff>=qdiff_max) {keep[k]=0; continue;} // too different from query? => reject once and for all } // printf(" qsc=%6.2f qid=%6.2f \n",qsc_sum/nres[k],100.0*(1.0-(float)(diff)/nres[k])); } if (seqid1>seqid2) { for (n=k=0; k0) n++; return n; } // Successively increment idmax[i] at positons where N[i]max) max=N[j]; if (Nmax[i] k) for (kk=0; kk=100) {in[k]=inkk[kk]=1; n++; continue;} float seqidk=seqid1; for (i=first[k]; i<=last[k]; ++i) if (idmaxwin[i]>seqidk) seqidk=idmaxwin[i]; if (seqid==seqid_prev[k]) continue; // sequence has already been rejected at this seqid threshold => reject this time seqid_prev[k]=seqid; diff_min_frac =0.9999-0.01*seqidk; // min fraction of differing positions between sequence j and k needed to accept sequence k // Loop over already accepted sequences for (jj=0; jjnres[k] anyway because of sorting diff=0; for (int i=first_kj; i<=last_kj; ++i) { // enough different residues to accept? => break if (X[k][i]>=NAA || X[j][i]>=NAA) cov_kj--; else if (X[k][i]!=X[j][i] && ++diff>=diff_suff) break; // accept (k,j) } // // DEBUG // printf("%20.20s with %20.20s: diff=%i diff_min_frac*cov_kj=%f diff_suff=%i nres=%i cov_kj=%i\n",sname[k],sname[j],diff,diff_min_frac*cov_kj,diff_suff,nres[k],cov_kj); // printf("%s\n%s\n\n",seq[k],seq[j]); if (diff=kk) // did loop reach end? => accept k. Otherwise reject k (the shorter of the two) { in[k]=inkk[kk]=1; n++; for (i=first[k]; i<=last[k]; ++i) N[i]++; // update number of sequences at position i // printf("%i %20.20s accepted\n",k,sname[k]); } // else // { // printf("%20.20s rejected: too similar with seq %20.20s diff=%i diff_min_frac*cov_kj=%f diff_suff=%i nres=%i cov_kj=%i\n",sname[k],sname[j],diff,diff_min_frac*cov_kj,diff_suff,nres[k],cov_kj); // printf("%s\n%s\n\n",seq[k],seq[j]); // } } // End Loop over all candidate sequences kk // // DEBUG // printf("\n"); // printf("seqid_prev[k]= \n"); // for (k=0; k=2) { printf("%i out of %i sequences passed filter (",n,N_in-N_ss); if (par.coverage) printf("%i%% min coverage, ",coverage); if (qid) printf("%i%% min sequence identity to query, ",qid); if (qsc>-10) printf("%.2f bits min score per column to query, ",qsc); if (Ndiff0) printf("up to %i%% position-dependent max pairwise sequence identity)\n",seqid); else printf("%i%% max pairwise sequence identity)\n",seqid1); } for (k=0; k=1; i--) if (X[k][i]p[i][a]/pb[a]); logodds[i][ANY]=-0.5; // half a bit penalty for X // printf(" A R N D C Q E G H I L K M F P S T W Y V\n"); // printf("%6i ",i); // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100 * qcore->f[i][a]); // printf("\n"); // printf(" "); // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100 * qcore->g[i][a]); // printf("\n"); // printf(" "); // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100 * qcore->p[i][a]); // printf("\n"); // printf(" "); // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100*pb[a]); // printf("\n"); // printf(" "); // for (a=0; a<20; ++a) fprintf(stdout,"%5.2f ",fast_log2(qcore->p[i][a]/pb[a])); // printf("\n"); } // Main loop: test all sequences k for (k=kfirst+1; ktr[i][D2M]; else score+=qcore->tr[i][M2M]; gap=0; } else if (X[k][i]==GAP) // current state is Delete (ignore ENDGAPs) { if (gap) score+=qcore->tr[i][D2D]; else score+=qcore->tr[i][M2D]; gap=1; } if (I[k][i]) score+=qcore->tr[i][M2I]+(I[k][i]-1) * qcore->tr[i][I2I]+qcore->tr[i][I2M]; // if (k==2) printf("i=%3i %c:%c score_M=%6.2f score=%6.2f score_sum=%6.2f \n",i,i2aa(X[kfirst][i]),i2aa(X[k][i]),score_M,score-score_prev,score); // score_prev=score; } printf("k=%3i score=%6.2f\n",k,score); if (score=2) printf("Diversity of unfiltered alignment %.2f is below target diversity %.2f.\n",y0,par.Neff); return; } y1=filter_by_qsc(x1,keep_orig); while (fabs(par.Neff-y)>TOLY && x1-x0>TOLX) { x = x0 + (par.Neff-y0)*(x1-x0)/(y1-y0); // linear interpolation between (x0,y0) and (x1,y1) y = filter_by_qsc(x,keep_orig); if (v>=2) printf(" %3i x0=%6.3f -> %6.3f x=%6.3f -> %6.3f x1=%6.3f -> %6.3f \n",++i,x0,y0,x,y,x1,y1); if (y>par.Neff) {x0=x; y0=y;} else {x1=x; y1=y;} } v=v1; // Write filtered alignment WITH insert states (lower case) to alignment file if (v>=2) printf("Found Neff=%6.3f at filter threshold qsc=%6.3f\n",y,x); return; } float Alignment::filter_by_qsc(float qsc, char* keep_orig) { HMM q; for (int k=0; kNeff_HMM); return q.Neff_HMM; } ///////////////////////////////////////////////////////////////////////////////////// // Calculate AA frequencies q->p[i][a] and transition probabilities q->tr[i][a] from alignment ///////////////////////////////////////////////////////////////////////////////////// void Alignment::FrequenciesAndTransitions(HMM* q, char* in, bool time) { int k; // index of sequence int i; // position in alignment int a; // amino acid (0..19) int ni[NAA+3]; // number of times amino acid a occurs at position i int naa; // number of different amino acids //if (time) { ElapsedTimeSinceLastCall("begin freq and trans"); } //Delete name and seq matrices of old HMM q if (!q->dont_delete_seqs) // don't delete sname and seq if flat copy to hit object has been made { for (k=0; kn_seqs; k++) delete [] q->sname[k]; for (k=0; kn_seqs; k++) delete [] q->seq[k]; } else // Delete all not shown sequences (lost otherwise) { if (q->n_seqs > q->n_display) { for (k=q->n_display; kn_seqs; k++) delete [] q->sname[k]; for (k=q->n_display; kn_seqs; k++) delete [] q->seq[k]; } } if (v>=3) cout<<"Calculating position-dependent weights on subalignments\n"; if (in==NULL) in=keep; //why not in declaration? if (N_filtered>1) { for (k=0; kNeff_HMM=1.0f; for (i=0; i<=L+1; ++i) // for all positions i in alignment { q->Neff_M[i]=1.0f; q->Neff_I[i]=q->Neff_D[i]=0.0f; for (a=0; a<20; ++a) q->f[i][a]=0.0; if (X[kfirst][i] < ANY) q->f[i][(unsigned int) X[kfirst][i] ] = 1.0; else for (a=0; a<20; ++a) q->f[i][a]=pb[a]; q->tr[i][M2M]=0; q->tr[i][M2I]=-100000.0; q->tr[i][M2D]=-100000.0; q->tr[i][I2M]=-100000.0; q->tr[i][I2I]=-100000.0; q->tr[i][D2M]=-100000.0; q->tr[i][D2D]=-100000.0; } q->tr[0][I2M]=0; q->tr[L][I2M]=0; q->tr[0][D2M]=0; q->Neff_M[0]=q->Neff_I[0]=q->Neff_D[0]=99.999; // Neff_av[0] is used for calculation of transition pseudocounts for the start state } if (v>=3) { printf("\nMatches:\n"); printf("col Neff nseqs\n"); for (i=1; i<=imin(L,100); ++i) printf("%3i %5.2f %3i\n",i,q->Neff_M[i],nseqs[i]); printf("\nInserts:\n"); printf("col Neff nseqs\n"); for (i=1; i<=imin(L,100); ++i) printf("%3i %5.2f %3i\n",i,q->Neff_I[i],nseqs[i]); printf("\nDeletes:\n"); printf("col Neff nseqs\n"); for (i=1; i<=imin(L,100); ++i) printf("%3i %5.2f %3i\n",i,q->Neff_D[i],nseqs[i]); } // Copy column information into HMM q q->L=L; q->N_in=N_in; q->N_filtered=N_filtered; for (i=1; i<=L; ++i) q->l[i]=l[i]; // Set names in HMM q if (strlen(q->name)==0) strcpy(q->name,name); if (strlen(q->longname)==0) strcpy(q->longname,longname); if (strlen(q->fam)==0) strcpy(q->fam,fam); ScopID(q->cl,q->fold,q->sfam,q->fam); // derive superfamily, fold and class code from family name strcpy(q->file,file); // Store basename of alignment file name in q->file // Copy sequences to be displayed into HMM q->nss_dssp=q->nsa_dssp=q->nss_pred=q->nss_conf=q->nfirst=-1; int n=0; if (kss_dssp>=0) q->nss_dssp=n++; // copy dssp sequence? if (ksa_dssp>=0) q->nsa_dssp=n++; // copy dssp sequence? if (kss_pred>=0) q->nss_pred=n++; // copy psipred sequence? if (kss_conf>=0) q->nss_conf=n++; // copy confidence value sequence? //if (time) { ElapsedTimeSinceLastCall("Copy to HMM"); } // Calculate consensus sequence? if (par.showcons || par.cons) { float maxw; int maxa; if (par.showcons) { // Reserve space for consensus/conservation sequence as Q-T alignment mark-up q->ncons=n++; q->sname[q->ncons]=new(char[10]); if (!q->sname[q->ncons]) {MemoryError("array of names for displayed sequences");} strcpy(q->sname[q->ncons],"Consensus"); q->seq[q->ncons]=new(char[L+2]); if (!q->seq[q->ncons]) {MemoryError("array of names for displayed sequences");} } if (par.cons) { // Reserve space for consensus sequence as first sequence in alignment q->nfirst=n++; kfirst=-1; q->sname[q->nfirst]=new(char[strlen(name)+11]); if (!q->sname[q->nfirst]) {MemoryError("array of names for displayed sequences");} strcpy(q->sname[q->nfirst],name); strcat(q->sname[q->nfirst],"_consensus"); q->seq[q->nfirst]=new(char[L+2]); if (!q->seq[q->nfirst]) {MemoryError("array of names for displayed sequences");} } // Calculate consensus amino acids using similarity matrix for (i=1; i<=L; ++i) { maxw=0.0; maxa=0; for (a=0; a<20; ++a) if (q->f[i][a]-pb[a]>maxw) {maxw = q->f[i][a]-pb[a]; maxa = a;} if (par.showcons) { maxw =0.0; for (int b=0; b<20; b++) maxw += q->f[i][b]*Sim[maxa][b]*Sim[maxa][b]; maxw *= q->Neff_M[i]/(q->Neff_HMM+1); // columns with many gaps don't get consensus symbol if (maxw>0.6) q->seq[q->ncons][i] = uprchr(i2aa(maxa)); else if (maxw>0.4) q->seq[q->ncons][i] = lwrchr(i2aa(maxa)); else q->seq[q->ncons][i] = 'x'; } if (par.cons) q->seq[q->nfirst][i] = uprchr(i2aa(maxa)); } if (par.showcons) { q->seq[q->ncons][0]='-'; q->seq[q->ncons][L+1]='\0'; } if (par.cons) { q->seq[q->nfirst][0]='-'; q->seq[q->nfirst][L+1]='\0'; } } //if (time) { ElapsedTimeSinceLastCall("Calc consensus sequence"); } // Copy sequences to be displayed from alignment to HMM for (k=0; k=MAXSEQDIS) { if (par.mark) cerr<<"WARNING: maximum number "<nss_dssp; // copy dssp sequence to nss_dssp else if (k==ksa_dssp) nn=q->nsa_dssp; else if (k==kss_pred) nn=q->nss_pred; else if (k==kss_conf) nn=q->nss_conf; else if (k==kfirst) nn=q->nfirst=n++; else nn=n++; // strcut(sname[k]," "); // delete rest of name line beginning with two spaces " " // Why this?? Problem for pdb seqs without chain q->sname[nn]=new(char[strlen(sname[k])+1]); if (!q->sname[nn]) {MemoryError("array of names for displayed sequences");} strcpy(q->sname[nn],sname[k]); q->seq[nn]=new(char[strlen(seq[k])+1]); if (!q->seq[nn]) {MemoryError("array of names for displayed sequences");} strcpy(q->seq[nn],seq[k]); } } q->n_display=n; // how many sequences to be displayed in alignments? q->n_seqs=n; // Copy secondary structure information into HMM if (kss_dssp>=0) for (i=1; i<=L; ++i) q->ss_dssp[i]=X[kss_dssp][i]; if (ksa_dssp>=0) for (i=1; i<=L; ++i) q->sa_dssp[i]=X[ksa_dssp][i]; if (kss_pred>=0) { for (i=1; i<=L; ++i) q->ss_pred[i]=X[kss_pred][i]; if (kss_conf>=0) for (i=1; i<=L; ++i) q->ss_conf[i]=X[kss_conf][i]; else for (i=1; i<=L; ++i) q->ss_conf[i]=5; } q->lamda=0.0; q->mu=0.0; q->trans_lin=0; // transition probs in log space q->has_pseudocounts=false; q->dont_delete_seqs=false; q->divided_by_local_bg_freqs=false; //if (time) { ElapsedTimeSinceLastCall("Copy sequences and SS"); } // Debug: print occurence of amino acids for each position i if (v>=2) printf("Effective number of sequences exp(entropy) = %-4.1f\n",q->Neff_HMM); //PRINT if (v>=3) { cout<<"\nMatr: "; for (a=0; a<20; ++a) printf("%4.1f ",100*pb[a]); cout<<"\nAmino acid frequencies without pseudocounts:\n"; cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; for (i=1; i<=L; ++i) { printf("%3i: ",i); for (a=0; a<20; ++a) printf("%4.0f ",100 * q->f[i][a]); cout<M M->I M->D I->M I->I D->M D->D Neff_M Neff_I Neff_D\n"); for (i=0; i<=L; ++i) { printf("%4i %6.3f %6.3f %6.3f ",i,pow(2.0,q->tr[i][M2M]),pow(2.0,q->tr[i][M2I]),pow(2.0,q->tr[i][M2D])); printf("%6.3f %6.3f ",pow(2.0,q->tr[i][I2M]),pow(2.0,q->tr[i][I2I])); printf("%6.3f %6.3f ",pow(2.0,q->tr[i][D2M]),pow(2.0,q->tr[i][D2D])); printf("%6.3f %6.3f %6.3f\n",q->Neff_M[i],q->Neff_I[i],q->Neff_D[i]); } } return; } ///////////////////////////////////////////////////////////////////////////////////// // Calculate freqs q->f[i][a] and transitions q->tr[i][a] (a=MM,MI,MD) with pos-specific subalignments // Pos-specific weights are calculated like in "GetPositionSpecificWeights()" ///////////////////////////////////////////////////////////////////////////////////// void Alignment::Amino_acid_frequencies_and_transitions_from_M_state(HMM* q, char* in) { // Calculate position-dependent weights wi[k] for each i. // For calculation of weights in column i use sub-alignment // over sequences which have a *residue* in column i (no gap, no end gap) // and over columns where none of these sequences has an end gap. // This is done by updating the arrays n[j][a] at each step i-1->i while letting i run from 1 to L. // n[j][a] = number of occurences of amino acid a at column j of the subalignment, // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 int k; // index of sequence int i,j; // position in alignment int a; // amino acid (0..19) int naa; // number of different amino acids int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i float Neff[par.maxres]; // diversity of subalignment i int nseqi=0; // number of sequences in subalignment i int ncol=0; // number of columns j that contribute to Neff[i] char change; // has the set of sequences in subalignment changed? 0:no 1:yes float fj[NAA+3]; // to calculate entropy float sum; // Global weights? if (par.wg==1) for (k=0; kNeff_HMM=0.0f; Neff[0]=0.0; // if the first column has no residues (i.e. change==0), Neff[i]=Neff[i-1]=Neff[0] n = new(int*[L+2]); for (j=1; j<=L; ++j) n[j]=new(int[NAA+3]); for (j=1; j<=L; ++j) for (a=0; a=ANY && X[k][i]=ANY) { // ... if sequence k WAS included in i-1 and has to be thrown out for column i change=1; nseqi--; for (int j=1; j<=L; ++j) n[j][ (int)X[k][j]]--; } } //end for (k) nseqs[i]=nseqi; // If subalignment changed: update weights wi[k] and Neff[i] if (change) { // Initialize weights and numbers of residues for subalignment i ncol=0; for (k=0; kMAXENDGAPFRAC*nseqi) continue; naa=0; for (a=0; a<20; ++a) if(n[j][a]) naa++; if (naa==0) continue; ncol++; for (k=0; kMAXENDGAPFRAC*nseqi) continue; for (a=0; a<20; ++a) fj[a]=0; for (k=0; k1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); } if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; } else //no update was necessary; copy values for i-1 { Neff[i]=Neff[i-1]; } } // Calculate amino acid frequencies q->f[i][a] from weights wi[k] for (a=0; a<20; ++a) q->f[i][a]=0; for (k=0; kf[i][ (int)X[k][i] ]+=wi[k]; NormalizeTo1(q->f[i],NAA,pb); // Calculate transition probabilities from M state q->tr[i][M2M]=q->tr[i][M2D]=q->tr[i][M2I]=0.0; for (k=0; ktr[i][M2I]+=wi[k]; else if (X[k][i+1]<=ANY) //next state is M q->tr[i][M2M]+=wi[k]; else if (X[k][i+1]==GAP) //next state is D q->tr[i][M2D]+=wi[k]; } } // end for(k) // Normalize and take log sum = q->tr[i][M2M]+q->tr[i][M2I]+q->tr[i][M2D]+FLT_MIN; q->tr[i][M2M]=log2(q->tr[i][M2M]/sum); q->tr[i][M2I]=log2(q->tr[i][M2I]/sum); q->tr[i][M2D]=log2(q->tr[i][M2D]/sum); // for (k=0; ktr[0][M2M]=0; q->tr[0][M2I]=-100000; q->tr[0][M2D]=-100000; q->tr[L][M2M]=0; q->tr[L][M2I]=-100000; q->tr[L][M2D]=-100000; q->Neff_M[0]=99.999; // Neff_av[0] is used for calculation of transition pseudocounts for the start state // Set emission probabilities of zero'th (begin) state and L+1st (end) state to background probabilities for (a=0; a<20; ++a) q->f[0][a]=q->f[L+1][a]=pb[a]; // Assign Neff_M[i] and calculate average over alignment, Neff_M[0] if (par.wg==1) { for (i=1; i<=L; ++i) { float sum=0.0f; for (a=0; a<20; ++a) if (q->f[i][a]>1E-10) sum -= q->f[i][a]*fast_log2(q->f[i][a]); q->Neff_HMM+=pow(2.0,sum); } q->Neff_HMM/=L; float Nlim=fmax(10.0,q->Neff_HMM+1.0); // limiting Neff float scale=log2((Nlim-q->Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with inserts at specific pos for (i=1; i<=L; ++i) { float w_M=-1.0/N_filtered; for (k=0; kNeff_M[i]=1.0; else q->Neff_M[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_M); // fprintf(stderr,"M i=%3i ncol=--- Neff_M=%5.2f Nlim=%5.2f w_M=%5.3f Neff_M=%5.2f\n",i,q->Neff_HMM,Nlim,w_M,q->Neff_M[i]); } } else { for (i=1; i<=L; ++i) { q->Neff_HMM+=Neff[i]; q->Neff_M[i]=Neff[i]; if (q->Neff_M[i] == 0) { q->Neff_M[i] = 1; } } q->Neff_HMM/=L; } return; } ///////////////////////////////////////////////////////////////////////////////////// // Calculate transitions q->tr[i][a] (a=DM,DD) with pos-specific subalignments ///////////////////////////////////////////////////////////////////////////////////// void Alignment::Transitions_from_I_state(HMM* q, char* in) { // Calculate position-dependent weights wi[k] for each i. // For calculation of weights in column i use sub-alignment // over sequences which have a INSERT in column i // and over columns where none of these sequences has an end gap. // This is done by calculating the arrays n[j][a] and rj[j] at each step i-1->i while letting i run from 1 to L. // n[j][a] = number of occurences of amino acid a at column j of the subalignment, // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 int k; // index of sequence int i,j; // position in alignment int a; // amino acid (0..19) int naa; // number of different amino acids int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i float Neff[par.maxres]; // diversity of subalignment i int nseqi; // number of sequences in subalignment i int ncol; // number of columns j that contribute to Neff[i] float fj[NAA+3]; // to calculate entropy float sum; float Nlim=0.0; // only for global weights float scale=0.0; // only for global weights // Global weights? //if (par.wg==1) if (1) { for (k=0; kNeff_HMM+1.0); // limiting Neff scale=log2((Nlim-q->Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with inserts at specific pos } // Initialization n = new(int*[L+2]); for (j=1; j<=L; ++j) n[j]=new(int[NAA+3]); ////////////////////////////////////////////////////////////////////////////////////////////// // Main loop through alignment columns for (i=1; i<=L; ++i) // Calculate wi[k] at position i as well as Neff[i] { //if (par.wg==0) // local weights? if (0) { // Calculate n[j][a] and ri[j] nseqi=0; for (k=0; k0) { if (nseqi==0) // Initialize only if inserts present! Otherwise O(L*L) even for single sequences! { // Initialization of n[j][a] for (j=1; j<=L; ++j) for (a=0; atr[i][I2M]=-100000; q->tr[i][I2I]=-100000; continue; } // update weights wi[k] and Neff[i] // if (1) { // Initialize weights and numbers of residues for subalignment i ncol=0; for (k=0; kMAXENDGAPFRAC*nseqi) continue; naa=0; for (a=0; a<20; ++a) if(n[j][a]) naa++; if (naa==0) continue; ncol++; for (k=0; k0 && X[k][j]=NCOLMIN) // Take global weights for (k=0; k0) wi[k]=wg[k]; else wi[k]=0.0; // Calculate Neff[i] Neff[i]=0.0; for (j=1; j<=L; ++j) { if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; for (a=0; a<20; ++a) fj[a]=0; for (k=0; k0 && X[k][j]1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); } if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; } // Calculate transition probabilities from I state q->tr[i][I2M]=q->tr[i][I2I]=0.0; for (k=0; k0) //current state is I { q->tr[i][I2M]+=wi[k]; q->tr[i][I2I]+=wi[k]*(I[k][i]-1); } } // end for(k) } else // fast global weights? { float w_I=-1.0/N_filtered; ncol=0; q->tr[i][I2M]=q->tr[i][I2I]=0.0; // Calculate amino acid frequencies fj[a] from weights wg[k] for (k=0; k0) { ncol++; w_I+=wg[k]; q->tr[i][I2M]+=wi[k]; q->tr[i][I2I]+=wi[k]*(I[k][i]-1); } if (ncol>0) { if (w_I<0) Neff[i]=1.0; else Neff[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_I); // fprintf(stderr,"I i=%3i ncol=%3i Neff_M=%5.2f Nlim=%5.2f w_I=%5.3f Neff_I=%5.2f\n",i,ncol,q->Neff_HMM,Nlim,w_I,Neff[i]); } else { Neff[i]=0.0; q->tr[i][I2M]=-100000; q->tr[i][I2I]=-100000; continue; } } // Normalize and take log sum = q->tr[i][I2M]+q->tr[i][I2I]; q->tr[i][I2M]=log2(q->tr[i][I2M]/sum); q->tr[i][I2I]=log2(q->tr[i][I2I]/sum); } // end loop through alignment columns i ////////////////////////////////////////////////////////////////////////////////////////////// // delete n[][] for (j=1; j<=L; ++j) delete[](n[j]); delete[](n); q->tr[0][I2M]=0; q->tr[0][I2I]=-100000; q->tr[L][I2M]=0; q->tr[L][I2I]=-100000; q->Neff_I[0]=99.999; // Assign Neff_I[i] for (i=1; i<=L; ++i) // Calculate wi[k] at position i as well as Neff[i] and Neff[i] q->Neff_I[i]=Neff[i]; return; } ///////////////////////////////////////////////////////////////////////////////////// // Calculate transitions q->tr[i][a] (a=DM,DD) with pos-specific subalignments ///////////////////////////////////////////////////////////////////////////////////// void Alignment::Transitions_from_D_state(HMM* q, char* in) { // Calculate position-dependent weights wi[k] for each i. // For calculation of weights in column i use sub-alignment // over sequences which have a DELETE in column i // and over columns where none of these sequences has an end gap. // This is done by updating the arrays n[j][a] and rj[j] at each step i-1->i while letting i run from 1 to L. // n[j][a] = number of occurences of index a at column j of the subalignment, // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 int k; // index of sequence int i,j; // position in alignment int a; // amino acid (0..19) int naa; // number of different amino acids int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i float Neff[par.maxres]; // diversity of subalignment i int nseqi=0; // number of sequences in subalignment i (for DEBUGGING) int ncol=0; // number of columns j that contribute to Neff[i] char change; // has the set of sequences in subalignment changed? 0:no 1:yes float fj[NAA+3]; // to calculate entropy float sum; float Nlim=0.0; // only for global weights float scale=0.0; // only for global weights // Global weights? //if (par.wg==1) if(1) { for (k=0; kNeff_HMM+1.0); // limiting Neff scale=log2((Nlim-q->Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with dels at specific pos } // Initialization n = new(int*[L+2]); for (j=1; j<=L; ++j) n[j]=new(int[NAA+3]); for (j=1; j<=L; ++j) for (a=0; atr[i][D2M]=-100000; q->tr[i][D2D]=-100000; continue; } // If subalignment changed: update weights wi[k] and Neff[i] if (change) { // Initialize weights and numbers of residues for subalignment i ncol=0; for (k=0; kMAXENDGAPFRAC*nseqi) continue; naa=0; for (a=0; a<20; ++a) if(n[j][a]) naa++; if (naa==0) continue; ncol++; for (k=0; kMAXENDGAPFRAC*nseqi) continue; for (a=0; a<20; ++a) fj[a]=0; for (k=0; k1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); } if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; } else //no update was necessary; copy values for i-1 { Neff[i]=Neff[i-1]; } // Calculate transition probabilities from D state q->tr[i][D2M]=q->tr[i][D2D]=0.0; for (k=0; ktr[i][D2D]+=wi[k]; else if (X[k][i+1]<=ANY) //next state is M q->tr[i][D2M]+=wi[k]; } } // end for(k) } else // fast global weights? { float w_D=-1.0/N_filtered; ncol=0; q->tr[i][D2M]=q->tr[i][D2D]=0.0; // Calculate amino acid frequencies fj[a] from weights wg[k] for (k=0; ktr[i][D2D]+=wi[k]; else if (X[k][i+1]<=ANY) //next state is M q->tr[i][D2M]+=wi[k]; } if (ncol>0) { if (w_D<0) Neff[i]=1.0; else Neff[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_D); // fprintf(stderr,"D i=%3i ncol=%3i Neff_M=%5.2f Nlim=%5.2f w_D=%5.3f Neff_D=%5.2f\n",i,ncol,q->Neff_HMM,Nlim,w_D,Neff[i]); } else { Neff[i]=0.0; // effective number of sequences = 0! q->tr[i][D2M]=-100000; q->tr[i][D2D]=-100000; continue; } } // Normalize and take log sum = q->tr[i][D2M]+q->tr[i][D2D]; q->tr[i][D2M]=log2(q->tr[i][D2M]/sum); q->tr[i][D2D]=log2(q->tr[i][D2D]/sum); } // end loop through alignment columns i ////////////////////////////////////////////////////////////////////////////////////////////// q->tr[0][D2M]=0; q->tr[0][D2D]=-100000; q->Neff_D[0]=99.999; // Assign Neff_D[i] for (i=1; i<=L; ++i) q->Neff_D[i]=Neff[i]; // delete n[][] for (j=1; j<=L; ++j) delete[](n[j]); delete[](n); return; } ///////////////////////////////////////////////////////////////////////////////////// // Write alignment without insert states (lower case) to alignment file? ///////////////////////////////////////////////////////////////////////////////////// void Alignment::WriteWithoutInsertsToFile(const char* alnfile) { if (v>=2) cout<<"Writing alignment to "<=2) cout<<"Writing alignment to "<%s\n",sname[k]); for (int i=1; i<=L; ++i) fprintf(alnf,"%c",i2aa(X[k][i])); fprintf(alnf,"\n"); } // Write other sequences for (int k=0; k0) or display is obligatory (display[k]==2) { fprintf(alnf,">%s\n",sname[k]); for (int i=1; i<=L; ++i) fprintf(alnf,"%c",i2aa(X[k][i])); fprintf(alnf,"\n"); } fclose(alnf); } ///////////////////////////////////////////////////////////////////////////////////// // Write stored, filtered sequences WITH insert states (lower case) to alignment file? ///////////////////////////////////////////////////////////////////////////////////// void Alignment::WriteToFile(const char* alnfile, const char format[]) { FILE* alnf=NULL; char* tmp_name = new(char[NAMELEN]); if(strcmp(alnfile, "stdout") != 0) { if (!par.append) alnf = fopen(alnfile, "w"); else alnf = fopen(alnfile, "a"); } else { alnf = stdout; } if (!alnf) OpenFileError(alnfile); if (!format || !strcmp(format,"a3m")) { if (v>=2) cout<<"Writing A3M alignment to "<%s\n%s\n",sname[k],seq[k]+1); // Write other sequences for (int k=0; k0) or display is obligatory (display[k]==2) fprintf(alnf,">%s\n%s\n",sname[k],seq[k]+1); } else // PSI-BLAST format { if (v>=2) cout<<"Writing PSI-BLAST-formatted alignment to "<0) or display is obligatory (display[k]==2) { strwrd(tmp_name,sname[k],NAMELEN); fprintf(alnf,"%-20.20s ",tmp_name); // for (int i=1; i<=L; ++i) fprintf(alnf,"%c",i2aa(X[k][i])); // fprintf(alnf,"\n"); char* ptr=seq[k]; for (; *ptr!='\0'; ptr++) if (*ptr==45 || (*ptr>=65 && *ptr<=90)) fprintf(alnf,"%c",*ptr); fprintf(alnf,"\n"); } } delete[] tmp_name; if (strcmp(alnfile, "stdout")) fclose(alnf); } ///////////////////////////////////////////////////////////////////////////////////// // Read a3m slave alignment of hit from file and merge into (query) master alignment ///////////////////////////////////////////////////////////////////////////////////// void Alignment::MergeMasterSlave(Hit& hit, Alignment& Tali, char* ta3mfile) { char* cur_seq = new(char[par.maxcol]); // Sequence currently read in int maxcol=par.maxcol; int l,ll; // position in unaligned template (T) sequence Tali.seq[l] int i; // counts match states in query (Q) HMM int j; // counts match states in T sequence Tali.seq[l] int h; // position in aligned T sequence cur_seq[h] int k; // sequence index char c; // if (v>=3) printf("Merging %s to query alignment\n",ta3mfile); // Record imatch[j] int* imatch=new(int[hit.j2+1]); int step = hit.nsteps; for (j=hit.j1; j<=hit.j2; ++j) { // Advance to position of next T match state j while (hit.j[step]3) { printf("step=%-3i i=%-3i j=%-3i i1: %4i i2: %4i j1: %4i j2: %4i\n",step,imatch[j],j,hit.i1,hit.i2,hit.j1,hit.j2); } } // Determine number of match states of Qali for (L=0,l=1; seq[kfirst][l]>'\0'; l++) if ((seq[kfirst][l]>='A' && seq[kfirst][l]<='Z') || seq[kfirst][l]=='-') L++; // For each sequence in T alignment: align to Qali for (k=0; k=MAXSEQ) { fprintf(stderr,"WARNING in %s: maximum number of %i sequences exceeded while reading %s. Skipping all following sequences of this MSA\n",program_name,MAXSEQ,ta3mfile); break; } cur_seq[0]=' '; // 0'th position not used // Add the hit.i1-1 left end gaps to aligned sequence for (h=1; h'\0'; l++) if ((c>='A' && c<='Z') || c=='-') // match state at position l? if ((++j)==hit.j1) break; // yes: increment j. Reached hit,j1? yes: break if (j'\0' && ((c>='a' && c<='z') || c=='.')) ; int di=i-iprev; // number of Match states in Q between T match state j-1 and j int dl=l-lprev; // 1 + number of inserted residues in T sequence between T match state j-1 and j if (di==1) { // One Q match state for one T match state (treated as special case for speed reasons) // i: i-1 i di=1 // Q: XXXXXX.....XXXXXX // T: YYYYYYyyyyyYYYYYY // j: j-1 j // l: lprev l dl=6 // Inserts in lower case for (ll=lprev+1; ll upper case cur_seq[h++] = Tali.seq[k][ll]; } else if (di==0) { // Gap in query: no Q match state for on T match state (special case for speed reasons) // i: i-1 i-1 di=0 // Q: XXXXXX.....~~~XXX // T: YYYYYYyyyyyYYYYYY // j: j-1 j // l: lprev l dl=6 // All T residues (including T match state) in lower case for (ll=lprev+1; ll<=l; ll++) if (Tali.seq[k][ll]!='-' && Tali.seq[k][ll]!='.') cur_seq[h++] = lwrchr(Tali.seq[k][ll]); } else if (di>=dl) { // More Match states in Q than Inserts in the T sequence // => half T inserts y left, half right-aligned in uc, gaps to fill up // Number of T insert residues to be left-aligned: (int)(dl/2) // i: iprev i di=7 // Q: XXXXXXXXXXXXXXXXXX // T: YYYYYYYyyy-yyYYYYY // j: j-1 j // l: lprev l dl=6 // Add left-bounded template residues for (ll=lprev+1; ll<=lprev+(int)(dl/2); ll++) cur_seq[h++]=uprchr(Tali.seq[k][ll]); // Add central gaps for (int gap=1; gap<=di-dl; gap++) cur_seq[h++]='-'; // Add right-bounded residues for (; ll<=l; ll++) cur_seq[h++]=uprchr(Tali.seq[k][ll]); } else if (di half of available space di for left- half for right-aligned T inserts, rest in lc // number of T inserts to be left-aligned in uc: (int)(di/2), // i: iprev i di=5 // Q: XXXXXXXXX.XXXXXXX // T: YYYYYYYyyyyyYYYYY // j: j-1 j // l: lprev l dl=6 // Add left-bounded template residues for (ll=lprev+1; ll<=lprev+(int)(di/2); ll++) cur_seq[h++]=uprchr(Tali.seq[k][ll]); // Add central inserts for (int ins=1; ins<=dl-di; ins++,ll++) if (Tali.seq[k][ll]!='-' && Tali.seq[k][ll]!='.') cur_seq[h++] = lwrchr(Tali.seq[k][ll]); // Add right-bounded residues for (; ll<=l; ll++) cur_seq[h++]=uprchr(Tali.seq[k][ll]); } if (v>4) { printf("i=%-3i j=%-3i l=%-3i cur_seq=%s\n",i,j,l,cur_seq); } iprev=i; lprev=l; if (h>=maxcol-1000) // too few columns? Reserve double space { char* new_seq=new(char[2*maxcol]); strncpy(new_seq,cur_seq,maxcol); //////// check: maxcol-1 ???? delete[](cur_seq); cur_seq=new_seq; maxcol*=2; } } // Add the remaining gaps '-' to the end of the template sequence for (i=hit.i2+1; i<=L; ++i) cur_seq[h++]='-'; cur_seq[h++]='\0'; keep[N_in] = display[N_in] = 1; seq[N_in]=new(char[h]); if (!seq[N_in]) MemoryError("array for input sequences"); strcpy(seq[N_in],cur_seq); X[N_in]=new(char[h]); if (!X[N_in]) MemoryError("array for input sequences"); I[N_in]=new(short unsigned int[h]); if (!I[N_in]) MemoryError("array for input sequences"); sname[N_in]=new(char[strlen(Tali.sname[k])+1]); if (!sname[N_in]) MemoryError("array for input sequences"); strcpy(sname[N_in],Tali.sname[k]); N_in++; if (v>3) { printf("k=%-3i %s\n",k,Tali.seq[k]); printf("Query %s\n",seq[kfirst]); printf("k=%-3i %s\n\n",k,cur_seq); } } // end for (k) // printf("N_in=%-5i HMM=%s with %i sequences\n",N_in,ta3mfile,Tali.N_filtered); delete[] cur_seq; delete[] imatch; delete[] ksort; ksort=NULL; // if ksort already existed it will be to short for merged alignment delete[] first; first=NULL; // if first already existed it will be to short for merged alignment delete[] last; last=NULL; // if last already existed it will be to short for merged alignment delete[] nres; nres=NULL; // if nres already existed it will be to short for merged alignment } ///////////////////////////////////////////////////////////////////////////////////// // Add a sequence to Qali ///////////////////////////////////////////////////////////////////////////////////// void Alignment::AddSequence(char Xk[], int Ik[]) { int i; // position in query and template if (L<=0) InternalError("L is not set in AddSequence()"); X[N_in]=new(char[L+2]); for (i=0; i<=L+1; ++i) X[N_in][i]=Xk[i]; if (Ik==NULL) for (i=0; i<=L+1; ++i) I[N_in][i]=0; else for (i=0; i<=L+1; ++i) I[N_in][i]=Ik[i]; N_in++; delete[] ksort; ksort=NULL; // if ksort already existed it will be to short for merged alignment delete[] first; first=NULL; // if first already existed it will be to short for merged alignment delete[] last; last=NULL; // if last already existed it will be to short for merged alignment } ///////////////////////////////////////////////////////////////////////////////////// // Add secondary structure prediction to alignment (overwrite existing prediction) ///////////////////////////////////////////////////////////////////////////////////// void Alignment::AddSSPrediction(char seq_pred[], char seq_conf[]) { unsigned int i; if ((int)strlen(seq_pred)!=L+1) { cerr<<"WARNING: Could not add secondary struture prediction - unequal length!\n"; return; } if (kss_pred < 0 || kss_conf < 0) // At least one sequence is added { delete[] ksort; ksort=NULL; // if ksort already existed it will be to short for merged alignment delete[] first; first=NULL; // if first already existed it will be to short for merged alignment delete[] last; last=NULL; // if last already existed it will be to short for merged alignment } if (kss_pred < 0) // No ss prediction exists { kss_pred=N_in; keep[N_in]=0; display[N_in]=1; seq[N_in]=new(char[L+2]); strcpy(seq[N_in],seq_pred); X[N_in]=new(char[L+2]); for (i=0; ii while letting i run from 1 to L. // n[j][a] = number of occurences of amino acid a at column j of the subalignment, // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) // then the old values w[k][i] and ncol are used for the new position i. // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 char* in=keep; // to keep the code similar to Amino_acid_frequencies_and_transitions_from_M_state() int k; // index of sequence int i,j; // position in alignment int a; // amino acid (0..19) int naa; // number of different amino acids int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j int nseqi=0; // number of sequences in subalignment i int ncol=0; // number of columns j that contribute to Neff[i] char change; // has the set of sequences in subalignment changed? 0:no 1:yes // Global weights? if (par.wg==1) { for (k=0; k=ANY && X[k][i]=ANY) { // ... if sequence k WAS included in i-1 and has to be thrown out for column i change=1; nseqi--; for (int j=1; j<=L; ++j) n[j][ (int)X[k][j]]--; } } //end for (k) nseqs[i]=nseqi; // If subalignment changed: update weights w[k][i] and Neff[i] if (change) { // Initialize weights and numbers of residues for subalignment i ncol=0; for (k=0; kMAXENDGAPFRAC*nseqi) continue; naa=0; for (a=0; a<20; ++a) if(n[j][a]) naa++; if (naa==0) continue; ncol++; for (k=0; k #else #include #include #endif #endif ///////////////////////////////////////////////////////////////////////////////////// // // Describes an alignment of two profiles. Used as list element in Hits : List ///////////////////////////////////////////////////////////////////////////////////// class Hit { public: char* longname; // Name of HMM char* name; // One-word name of HMM char* file; // Basename (with path, without extension) of alignment file that was used to construct the HMM // (path from db-file is prepended to FILE record in HMM file!) char fam[IDLEN]; // family ID (derived from name) (FAM field) char sfam[IDLEN]; // superfamily ID (derived from name) char fold[IDLEN]; // fold ID (derived from name) char cl[IDLEN]; // class ID (derived from name) char* dbfile; // full database file name from which HMM was read long ftellpos; // start position of HMM in database file int index; // index of HMM in order of reading in (first=0) List* plist_phits; // points to a list of pointers to hitlist elements of same template (for realignment) float score; // Score of alignment (i.e. of Viterbi path) float score_sort; // score to sort hits in output list (negative means first/best!) float score_aass; // first: just hit.score, then hit.logPval-SSSCORE2NATLOG*hit.score_ss;(negative means best!) float score_ss; // Part of score due to secondary structure double Pval; // P-value for whole protein based on score distribution of query double Pvalt; // P-value for whole protein based on score distribution of template double logPval; // natural logarithm of Pval double logPvalt; // natural logarithm of Pvalt double Eval; // E-value for whole protein double logEval; // natural logarithm of Eval float Probab; // probability in % for a positive (depends only on score) double Pforward; // scaled total forward probability : Pforward * Product_{i=1}^{Lq+1}(scale[i]) int L; // Number of match states in template short int irep; // Index of single-repeat hit (1: highest scoring repeat hit) char lastrep; // is current hit last (sub)optimal alignment? 0: no 1: yes int n_display; // number of sequences stored for display of alignment char** sname; // names of stored sequences char** seq; // residues of stored sequences (first at pos 1) int nss_dssp; // index of dssp secondary structure sequence in seq[] int nsa_dssp; // index of of dssp solvent accessibility in seq[] int nss_pred; // index of dssp secondary structure sequence in seq[] int nss_conf; // index of dssp secondary structure sequence in seq[] int nfirst; // index of query sequence in seq[] int ncons; // index of consensus sequence int nsteps; // index for last step in Viterbi path; (first=1) int* i; // i[step] = query match state at step of Viterbi path int* j; // j[step] = template match state at step of Viterbi path List* alt_i; // Path of alternative alignments (query positions) List* alt_j; // Path of alternative alignments (template positions) char* states; // state at step of Viterbi path 0: Start 1: M(MM) 2: A(-D) 3: B(IM) 4: C(D-) 5 D(MI) float* S; // S[step] = match-match score contribution at alignment step float* S_ss; // S_ss[step] = secondary structure score contribution float* P_posterior; // P_posterior[step] = posterior prob for MM states (otherwise zero) int i1; // First aligned residue in query int i2; // Last aligned residue in query int j1; // First aligned residue in template int j2; // Last aligned residue in template int matched_cols; // number of matched columns in alignment against query int ssm1; // SS scoring AFTER alignment? 0:no 1:yes; t->dssp q->psipred 2:yes; q->dssp t->psipred int ssm2; // SS scoring DURING alignment? 0:no 1:yes; t->dssp q->psipred 2:yes; q->dssp t->psipred char self; // 0: align two different HMMs 1: align HMM with itself int min_overlap; // Minimum overlap between query and template float sum_of_probs; // sum of probabilities for Maximum ACcuracy alignment (if dssp states defined, only aligned pairs with defined dssp state contribute to sum) float Neff_HMM; // Diversity of underlying alignment bool realign_around_viterbi; bool forward_allocated; bool backward_allocated; // Constructor (only set pointers to NULL) Hit(); ~Hit(){}; // Free all allocated memory (to delete list of hits) void Delete(); // Allocate/delete memory for dynamic programming matrix void AllocateBacktraceMatrix(int Nq, int Nt); void DeleteBacktraceMatrix(int Nq); void AllocateForwardMatrix(int Nq, int Nt); void DeleteForwardMatrix(int Nq); void AllocateBackwardMatrix(int Nq, int Nt); void DeleteBackwardMatrix(int Nq); void AllocateIndices(int len); void DeleteIndices(); // Compare an HMM with overlapping subalignments void Viterbi(HMM* q, HMM* t, float** Sstruc=NULL); // Compare two HMMs with each other in lin space void Forward(HMM* q, HMM* t, float** Pstruc=NULL); // Compare two HMMs with each other in lin space void Backward(HMM* q, HMM* t); // Find maximum accuracy alignment (after running Forward and Backward algorithms) void MACAlignment(HMM* q, HMM* t); // Trace back alignment of two profiles based on matrices bXX[][] void Backtrace(HMM* q, HMM* t); // Trace back alignment of two profiles based on matrices bXX[][] void StochasticBacktrace(HMM* q, HMM* t, char maximize=0); // Trace back MAC alignment of two profiles based on matrix bMM[][] void BacktraceMAC(HMM* q, HMM* t); // Calculate secondary structure score between columns i and j of two HMMs (query and template) inline float ScoreSS(HMM* q, HMM* t, int i, int j, int ssm); // Calculate secondary structure score between columns i and j of two HMMs (query and template) inline float ScoreSS(HMM* q, HMM* t, int i, int j); // Calculate in log2 space the amino acid similarity score between columns i and j of two HMMs (query and template) inline float Score(float* qi, float* tj); // Calculate in lin space the amino acid similarity score between columns i and j of two HMMs (query and template) inline float ProbFwd(float* qi, float* tj); // Calculate score for a given alignment void ScoreAlignment(HMM* q, HMM* t, int steps); // Comparison (used to sort list of hits) int operator<(const Hit& hit2) {return score_sort // cin, cout #include // #include // using std::cout; using std::cerr; #endif #include "list.h" //////////////////////////////////////////////////////////////////////////////// // Double-linked list implementation with head and tail dummy elements // We set head->prev=head and tail->next=tail. // This makes sure that repeated current=current->next; ends up in tail // and repeated current=current->prev; ends up in head. // head and tail optionally contain a NULL element of Typ defined by method Null(Typ) //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// // Constructors and destructor //////////////////////////////////////////////////////////////////////////// // Creates empty List with two dummy elements //////////////////////////////////////////////////////////////////////////// template List::List() { head=new ListEl(); if (!head) { cerr<<"Could not create new element\n"; return; } tail=new ListEl(head,NULL); if (!tail) { cerr<<"Could not create new element\n"; return; } tail->next = tail; head->prev = head; head->next = tail; current = head; size=0; } //////////////////////////////////////////////////////////////////////////// // Creates List with one element //////////////////////////////////////////////////////////////////////////// template List::List(Typ d) { head=new ListEl(); if (!head) { cerr<<"Could not create new element\n"; return; } tail=new ListEl(); if (!tail) { cerr<<"Could not create new element\n"; return; } ListEl* el = new ListEl(d,head,tail); if (!el) { cerr<<"Could not create new element\n"; return; } head->prev = head; head->next = el; tail->prev = el; tail->next = tail; current = head; size=1; } //////////////////////////////////////////////////////////////////////////// // Destructor deletes List object // Note: If data is a pointer to another data structure, that structure is not deleted! //////////////////////////////////////////////////////////////////////////// template List::~List() { ListEl* n=head->next; while(head!=n) { delete(head); head=n; n=head->next; } delete(head); size=0; } //////////////////////////////////////////////////////////////////////////// // Flat copy //////////////////////////////////////////////////////////////////////////// template inline List& List::operator=(List& l) { head = l.head; tail = l.tail; current = l.current; size = l.size; } //////////////////////////////////////////////////////////////////////////// // Reverse order of list //////////////////////////////////////////////////////////////////////////// template void List::Reverse() { ListEl *n; // next list element; also for swapping ListEl *c; // current element to be sorted in. Everything to the left is already sorted if (Size()<=1) return; for (c=head; c!=tail; c=n) { // Swap prev and next pointers of all list elements n = c->next; c->next = c->prev; c->prev = n; } // Swap prev and next pointers of tail tail->next = tail->prev; tail->prev = tail; // Swap head an tail n = head; head = tail; tail = n; } //////////////////////////////////////////////////////////////////////////////////////////// // Methods that act at the end of the list //////////////////////////////////////////////////////////////////////////// // Insert Element after LAST of list (and return address of data element) //////////////////////////////////////////////////////////////////////////// template Typ* List::Push(Typ d) { ListEl* t=new ListEl(d,tail->prev,tail); if (!t) { cerr<<"Could not create new element\n"; return 0; } tail->prev->next=t; tail->prev = t; size++; return &(t->data); } //////////////////////////////////////////////////////////////////////////// // Remove and return LAST element of list. Returns head->data if empty //////////////////////////////////////////////////////////////////////////// template Typ List::Pop() { if (!size) return head->data; ListEl* t=tail->prev; if (current==t) current=tail; Typ d=t->data; t->prev->next=tail; tail->prev=t->prev; delete t; size--; return d; } //////////////////////////////////////////////////////////////////////////////////////////// // Methods that act at the beginning of the list //////////////////////////////////////////////////////////////////////////// // Insert element as FIRST element of list (and return address of data element) //////////////////////////////////////////////////////////////////////////// template Typ* List::Enqueue(Typ d) { ListEl* h = new ListEl(d,head,head->next); if (!h) { cerr<<"Could not create new element\n"; return 0; } h->next->prev = h; head->next=h; size++; return &(h->data); } //////////////////////////////////////////////////////////////////////////// // Remove element at BEGINNING of list //////////////////////////////////////////////////////////////////////////// template Typ List::Dequeue() { if (!size) return head->data; ListEl* h=head->next; if (current==h) current=head; Typ d=h->data; h->next->prev=head; head->next=h->next; delete h; size--; return d; } //////////////////////////////////////////////////////////////////////////////////////////// // Methods that work with 'current' position in the list //////////////////////////////////////////////////////////////////////////// // Reads next element; advances current position by 1 //////////////////////////////////////////////////////////////////////////// template inline Typ List::ReadNext() { current = current->next; return current->data; } //////////////////////////////////////////////////////////////////////////// // Reads current element again (NULL if nothing read yet) //////////////////////////////////////////////////////////////////////////// template inline Typ List::ReadCurrent() { return current->data; } //////////////////////////////////////////////////////////////////////////// // Reads previous element; moves current position back by 1 //////////////////////////////////////////////////////////////////////////// template inline Typ List::ReadPrevious() { current = current->prev; return current->data; } //////////////////////////////////////////////////////////////////////////// // Reads address next data element; advances current position by 1 //////////////////////////////////////////////////////////////////////////// template inline Typ* List::ReadNextAddress() { current = current->next; if (current==tail) return NULL; return &(current->data); } //////////////////////////////////////////////////////////////////////////// // Reads address of data element if current element again, returns NULL if at end of list //////////////////////////////////////////////////////////////////////////// template inline Typ* List::ReadCurrentAddress() { if (current==tail) return NULL; return &(current->data); } //////////////////////////////////////////////////////////////////////////// // Sets current position to k and reads k'th element (first=1) //////////////////////////////////////////////////////////////////////////// template Typ List::Read(int pos) { if (pos>size) {current = tail; return tail->data;} if (pos<=0) {current = head; return head->data;} current = head->next; for (; pos>1; pos--) current = current->next; //If pos==2 do 1 iteration return current->data; } //////////////////////////////////////////////////////////////////////////// // Inserts element d AFTER current element and sets current element to inserted //////////////////////////////////////////////////////////////////////////// template void List::Insert(Typ d) { ListEl* el = new ListEl(d,current,current->next); if (!el) { cerr<<"Could not create new element\n"; return; } (current->next)->prev = el; current->next = el; current=el; size++; } //////////////////////////////////////////////////////////////////////////// // Deletes current element and returns content of deleted element. Current element // will be previous one after Delete(). After Reset() delete first element (not 0'th) //////////////////////////////////////////////////////////////////////////// template Typ List::Delete() { Typ d; ListEl* p; if (!size || current==tail) return tail->data; if (current==head) current = head->next; // After Reset() delete first element (not 0'th) (current->prev)->next = current->next; (current->next)->prev = current->prev; d = current->data; p = current->prev; delete current; current = p; size--; return d; } //////////////////////////////////////////////////////////////////////////////////////////// // Methods that return useful information about the list //////////////////////////////////////////////////////////////////////////// // Get current position within list (0 <= pos <= Size+1) //////////////////////////////////////////////////////////////////////////// template int List::GetPos() { int pos=0; ListEl* el; for (el = head; el!=current; el=el->next) pos++; return pos; } //////////////////////////////////////////////////////////////////////////// //print out list //////////////////////////////////////////////////////////////////////////// template void List::PrintList() { int j=0; ListEl* c=current; Reset(); printf("List: "); while (!End()) { j++; cout< Typ List::Largest() { Typ* result= &((tail->prev)->data); Reset(); while (!End()) { if (*result Typ List::Smallest() { Typ* result= &((tail->prev)->data); Reset(); while (!End()) { if (ReadNext()<*result) result=ReadCurrentAddress(); } return *result; } //////////////////////////////////////////////////////////////////////////////////////////// // Methods that manipulate the list as a whole //////////////////////////////////////////////////////////////////////////// // Copies list 0 into list object //////////////////////////////////////////////////////////////////////////// template void List::Copy(List* list) { if (list==this) return; while (!End()) Pop(); //empty list list->Reset(); while (!list->End()) Push(list->ReadNext()); } //////////////////////////////////////////////////////////////////////////// // Appends a copy of list2 to class object //////////////////////////////////////////////////////////////////////////// template void List::AppendCopy(List* list2) { List* cpy=new List; cpy->Copy(list2); Append(cpy); delete cpy; } //////////////////////////////////////////////////////////////////////////// // Appends list2 to class object //////////////////////////////////////////////////////////////////////////// template void List::Append(List* list) { if (this==list) { AppendCopy(list); return;} (tail->prev)->next = list->head->next; (list->head->next)->prev = tail->prev; if (current==tail) current=tail->prev; ListEl* t=tail; tail = list->tail; size += list->size; // Reuse old tail as new tail t for list2 and initialize pointers for empty list list->tail=t; list->head->next=t; t->prev=list->head; t->next=t; list->head->prev=list->head; t->data=list->head->data; list->current=list->head; list->size = 0; } //////////////////////////////////////////////////////////////////////////// // Use QUICKSORT to sort list in ascending order between two list elements //////////////////////////////////////////////////////////////////////////// template void List::SortList(ListEl* left, ListEl* right, int sz) { if (sz<=1) return; // when SortList() is called, left=head->next, right=tail->prev ListEl *l=left->prev, *r=right->next; // Choose *random* pivot element!! // (Otherwise, complexity for an already sorted list is N^2 => recursive calls may lead to stack overflow) ListEl *c=left; for (int i=1; i<(int)(float(rand())*sz/(RAND_MAX+0.999)); i++) c = c->next; SwapContent(left,c); Typ pivot = left->data; // Typ* pivot= &(left->data); int sz0=sz+1; // cout<<"Sorting between "<data<<" and "<data<<". Pivot="<prev; sz0--;} while (pivot < r->data); do l=l->next; while (l->data < pivot); if (l==r || l->prev==r) break; SwapContent(l,r); } SortList(left,r,sz0); SortList(r->next,right,sz-sz0); pivot = tail->data; // to avoid calling the destructor of Typ on some real data element } //////////////////////////////////////////////////////////////////////////// // Use QUICKSORT to sort list of POINTERS by comparing the objects the pointers point to //////////////////////////////////////////////////////////////////////////// template void List::SortPointerList(ListEl* left, ListEl* right) { if (right==left || right->next==left) return; ListEl *l=left->prev, *r=right->next; Typ pivot=left->data; // cout<<"Sorting between "<data<<" and "<data<<". Pivot="<prev; // cout<<"r=r->prev. r->data="<data<data)); do { l=l->next; // cout<<"l=l->next l->data="<data<data) < *pivot); if (l==r || l->prev==r) break; SwapContent(l,r); } SortPointerList(left,r); SortPointerList(r->next,right); } // Use INSERTSORT to sort list in asscending order between two list elements. Use only for presorted lists, otherwise time O(N^2)! template void List::ResortList() { ListEl *c; // current element to be sorted in. Everything to the left is already sorted ListEl *n; // next element to be sorted in ListEl *p; // pointer for looping through sorted part of list ListEl *pnext; // for swapping if (Size()<=1) return; c=head->next->next; while (c!=tail) { p=c->prev; n=c->next; if (c->data < p->data) { do {p=p->prev;} while (p!=head && c->data < p->data); // Connect c->prev to c->next ... c->next->prev=c->prev; c->prev->next=c->next; // ... and insert c between p and p->next ... pnext=p->next; p->next=c; c->next=pnext; pnext->prev=c; c->prev=p; } c=n; } } #endif /* JLIST */ // //Main program: test class List // int main() // { // int p; // List* plist=new List(11); // List list(22); // plist->Push(24); // plist->Push(18); // plist->Push(3); // plist->Enqueue(17); // plist->Enqueue(29); // printf("List 1 with pushed and enqueued elements:\n"); // plist->PrintList(); // list.Push(222); // printf("List 1 with list 2 appended:\n"); // plist->Append(&list); // plist->PrintList(); // printf("Pushing one element three times into list 2:\n"); // list.Push(333); // list.Push(444); // list.Push(555); // printf("Printing plist and list with three elements:\n"); // list.PrintList(); // plist->PrintList(); // printf("list.Copy(plist). Printing list 1 and 2:\n"); // list.Copy(plist); // plist->PrintList(); // list.PrintList(); // printf("Appending list 1 to itself:\n"); // plist->Append(plist); // plist->PrintList(); // cout<<"Popping "<Pop()<<"\n"; // cout<<"Popping "<Pop()<<"\n"; // plist->PrintList(); // cout<<"Dequeing "<Dequeue()<<"\n"; // cout<<"Dequeing "<Dequeue()<<"\n"; // plist->PrintList(); // cout<<"Reversing list\n"; // plist->Reverse(); // plist->PrintList(); // cout<<"Reversing to original list\n"; // plist->Reverse(); // plist->PrintList(); // for (p=plist->Reset(); p>=5;p--) // {cout<GetPos()<<": "<Read(p)<<"\n";} // cout<<"Deleting "<Delete()<<"\n"; // cout<<"Deleting "<Delete()<<"\n"; // plist->PrintList(); // plist->Append(plist); // plist->PrintList(); // cout<<"List 1 sorted:\n"; // plist->SortList(); // plist->PrintList(); // } hhsuite-2.0.16/src/hhdecl.C0000775172256617226630000006402112110430072017705 0ustar hauserscientific_computing#ifndef MAIN #define EXTERN extern #else #define EXTERN #endif ///////////////////////////////////////////////////////////////////////////////////// //// Constants ///////////////////////////////////////////////////////////////////////////////////// EXTERN const char VERSION_AND_DATE[]="version 2.0.15 (June 2012)"; EXTERN const char REFERENCE[]="Remmert M, Biegert A, Hauser A, and Soding J.\nHHblits: Lightning-fast iterative protein sequence searching by HMM-HMM alignment.\nNat. Methods 9:173-175 (2011).\n"; EXTERN const char COPYRIGHT[]="(C) Johannes Soeding, Michael Remmert, Andreas Biegert, Andreas Hauser\n"; EXTERN const int MAXSEQ=65535; //max number of sequences in input alignment (must be <~30000 on cluster nodes??) EXTERN const int LINELEN=524288; //max length of line read in from input files; must be >= MAXCOL EXTERN const int MAXSEQDIS=10238;//max number of sequences stored in 'hit' objects and displayed in output alignment EXTERN const int IDLEN=255; //max length of scop hierarchy id and pdb-id EXTERN const int DESCLEN=32765;//max length of sequence description (longname) EXTERN const int NAMELEN=(PATH_MAX>512? PATH_MAX:512); //max length of file names etc., defined in limits.h EXTERN const int MAXOPT=127; //Maximum number of options to be read in from .hhconfig or command line EXTERN const int NAA=20; //number of amino acids (0-19) EXTERN const int NTRANS=7; //number of transitions recorded in HMM (M2M,M2I,M2D,I2M,I2I,D2M,D2D) EXTERN const int NCOLMIN=10; //min number of cols in subalignment for calculating pos-specific weights w[k][i] EXTERN const int ANY=20; //number representing an X (any amino acid) internally EXTERN const int GAP=21; //number representing a gap internally EXTERN const int ENDGAP=22; //Important to distinguish because end gaps do not contribute to tansition counts EXTERN const int HMMSCALE=1000;//Scaling number for log2-values in HMMs EXTERN const int NFAMMAX=5119; //Size of hash for counting number of HMMs in each family EXTERN const int MAXPROF=32766;//Maximum number of HMM scores for fitting EVD EXTERN const float MAXENDGAPFRAC=0.1; //For weighting: include only columns into subalignment i that have a max fraction of seqs with endgap EXTERN const float SMIN= 20.; //Minimum score of hit needed to search for another repeat of same profile: p=exp(-(4-mu)/lamda)=0.01 EXTERN const float LAMDA=0.388; //lamda in score EVD used for -local mode in length correction: S = S-log(Lq*Lt)/LAMDA) EXTERN const float LAMDA_GLOB=0.42; //lamda in score EVD used for -global mode EXTERN const float PMAX=1E-2; //Maximum single-repeat p-value that can contribute to whole-protein p-value EXTERN const float MINEVALEXCL=0.5; //above this E-value from first ML fit hits are not used for final ML fit of EVD EXTERN const int SELFEXCL=3; // exclude self-alignments with j-i55%, 6:S-S bridge) // const char aa[]="ARNDCQEGHILKMFPSTWYVX-"; //Amino acids Sorted by alphabet -> internal numbers a // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // A C D E F G H I K L M N P Q R S T V W Y X EXTERN const int s2a[]={ 0, 4, 3, 6,13, 7, 8, 9,11,10,12, 2,14, 5, 1,15,16,19,17,18,20}; //Internal numbers a for amino acids -> amino acids Sorted by alphabet: // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // A R N D C Q E G H I L K M F P S T W Y V X EXTERN const int a2s[]={ 0,14,11, 2, 1,13, 3, 5, 6, 7, 9, 8,10, 4,12,15,16,18,19,17,20}; enum transitions {M2M,M2I,M2D,I2M,I2I,D2M,D2D}; // index for transitions within a HMM enum pair_states {STOP=0,SAME=1,GD=2,IM=3,DG=4,MI=5,MS=6,ML=7,SM=8,LM=9,MM=10}; ///////////////////////////////////////////////////////////////////////////////////// //// Global variable declarations ///////////////////////////////////////////////////////////////////////////////////// EXTERN char v; //=2 1: show only warnings 2:verbose mode EXTERN char program_name[NAMELEN]; //name of program executed (e.g. hhmake of hhsearch) EXTERN char program_path[NAMELEN]; //path of program executed // substitution matrix flavours EXTERN float __attribute__((aligned(16))) P[20][20]; // P[a][b] = combined probability for a aligned to b EXTERN float __attribute__((aligned(16))) R[20][20]; // R[a][b]=P[a][b]/p[b]=P(a|b); precalculated for pseudocounts EXTERN float __attribute__((aligned(16))) Sim[20][20]; // Similarity matrix Sim[a][b]: how similar are a and b? EXTERN float __attribute__((aligned(16))) S[20][20]; // Substitution score matrix S[a][b] = log2(Pab/pa/pb) EXTERN float __attribute__((aligned(16))) pb[21]; // pb[a] = background amino acid probabilities for chosen substitution matrix EXTERN float __attribute__((aligned(16))) qav[21]; // qav[a] = background amino acid probabilities for query HMM (needed for rate matrix rescaling) // secondary structure matrices EXTERN float S73[NDSSP][NSSPRED][MAXCF]; // P[A][B][cf] = log2 P(A,B,cf)/P(A)/P(B,cf) EXTERN float S33[NSSPRED][MAXCF][NSSPRED][MAXCF]; // P[B][cf][B'][cf'] = log2 sum_B' P(A,B',cf)/P(A)/P(B,cf) * P_b(B'|B) // float S77[NDSSP][DSSP]; // P[A][B] = log2 P(A,B)/P(A)/P(B) // Structure to store data for HHblits early stopping filter EXTERN struct Early_Stopping { int length; // Length of array of 1/evalues int counter; // counter for evalue array double* evals; // array of last 1/evalues double thresh; // Threshold for early stopping double sum; // sum of evalues in array } *early_stopping=NULL; // cs object declarations cs::LibraryPseudocounts *lib_pc; cs::ContextLibrary *context_lib; ///////////////////////////////////////////////////////////////////////////////////// // Class declarations ///////////////////////////////////////////////////////////////////////////////////// // Input parameters class Parameters // Parameters for gap penalties and pseudocounts { public: char** argv; //command line parameters char argc; //dimension of argv char hhlib[PATH_MAX]; // lib base path e.g. /usr/lib64/hh char hhdata[PATH_MAX]; // data base path e.g. /usr/lib64/hh/data char infile[NAMELEN]; // input filename char outfile[NAMELEN]; // output filename char pairwisealisfile[NAMELEN]; // output filename with pairwise alignments char alnfile[NAMELEN]; // name of output alignment file in A3M format (for iterative search) char hhmfile[NAMELEN]; // name of output HHM file for (iterative search) char psifile[NAMELEN]; // name of output alignmen file in PSI-BLAST format (iterative search) char scorefile[NAMELEN];// table of scores etc for all HMMs in searched database char indexfile[NAMELEN];// optional file containing indeices of aligned residues in given alignment char tfile[NAMELEN]; // template filename (in hhalign) char wfile[NAMELEN]; // weights file generated with hhformat char alitabfile[NAMELEN]; // where to write pairs of aligned residues (-atab option) char* dbfiles; // database filenames, separated by colons char* exclstr; // optional string containing list of excluded residues, e.g. '1-33,97-168' int aliwidth; // number of characters per line in output alignments for HMM search char append; // append to output file? (hhmake) float p; // minimum probability for inclusion in hit list and alignments double E; // maximum E-value for inclusion in hit list and alignment list double e; // maximum E-value for inclusion in output alignment, output HMM, and PSI-BLAST checkpoint model int Z; // max number of lines in hit list int z; // min number of lines in hit list int B; // max number of lines in alignment list int b; // min number of lines in alignment list int showcons; // in query-template alignments 0: don't show consensus sequence 1:show int showdssp; // in query-template alignments 0: don't show ss_dssp lines 1:show int showpred; // in query-template alignments 0: don't show ss_pred and ss_conf lines 1:show int showconf; // in query-template alignments 0: don't show ss_conf lines 1:show char cons; // if set to 1, include consensus as first representative sequence of HMM int nseqdis; // maximum number of query or template sequences in output alignments char mark; // which sequences to mark for display in output alignments? 0: auto; 1:all char outformat; // 0: hhr 1: FASTA 2:A2M 3:A3M //0:MAC alignment, master-slave 1:MAC blending, master-slave 2:MAC alignment, combining int max_seqid; // Maximum sequence identity with all other sequences in alignment int qid; // Minimum sequence identity with query sequence (sequence 0) float qsc; // Minimum score per column with query sequence (sequence 0) int coverage; // Minimum coverage threshold int Ndiff; // Pick Ndiff most different sequences that passed the other filter thresholds bool allseqs; // if true, do not filter in output alignment; show all sequences int Mgaps; // Maximum percentage of gaps for match states int M; // Match state assignment by 1:upper/lower case 2:percentage rule 3:marked sequence char matrix; // Subst.matrix 0: Gonnet, 1: HSDM, 2: BLOSUM50 char wg; // 0: use local sequence weights 1: use local ones char pcm; // 0:no pseudocounts, 1:pos-specific pcs, 2:PSIBLAST pcs float pca; // Pseudocount matrix = (1-tau(i))*I + tau(i)*S float pcb; // tau(i) = pca/(1 + ((Neff-1)/pcb)^pcc float pcc; // float pcw; // Decrease pseudocounts for conserved columns float pre_pca; // Pseudocount matrix = (1-tau(i))*I + tau(i)*S for prefiltering float pre_pcb; // tau(i) = pca/(1 + ((Neff-1)/pcb)^pcc for prefiltering float gapb; // Diversity threshold for adding pseudocounts to transitions from M state float gapd; // Gap open penalty factor for deletions float gape; // Gap extend penalty: factor to multiply hmmer values (def=1) float gapf; // factor for increasing/reducing the gap opening penalty for deletes float gapg; // factor for increasing/reducing the gap opening penalty for inserts float gaph; // factor for increasing/reducing the gap extension penalty for deletes float gapi; // factor for increasing/reducing the gap extension penalty for inserts float egq; // penalty for end gaps when query not fully covered float egt; // penalty for end gaps when template not fully covered float Neff; char ssgap; // 1: add secondary structure-dependent gap penalties 0:off float ssgapd; // secondary structure-dependent gap-opening penalty (per residue) float ssgape; // secondary structure-dependent gap-extension penalty (per residue) char ssgapi; // max. number of inside-integer(ii); gap-open-penalty= -ii*ssgapd char ssm; // SS comparison mode: 0:no ss scoring 1:ss scoring AFTER alignment 2:ss score in column score float ssw; // SS weight as compared to column score float ssw_realign; // SS weight as compared to column score for realign float ssa; // SS state evolution matrix M1 = (1-ssa)*I + ssa*M0 char loc; // 0: local alignment (wrt. query), 1: global alignement char forward; // 0:Viterbi algorithm 1:Forward algorithm 2: MAC char realign; // realign database hits to be displayed with MAC algorithm int altali; // find up to this many possibly overlapping alignments int columnscore; // 0: no aa comp corr 1: 1/2(qav+tav) 2: template av freqs 3: query av freqs 4:... int half_window_size_local_aa_bg_freqs; // half-window size to average local aa background frequencies float corr; // Weight of correlations between scores with |i-j|<=4 float shift; // Score offset for match-match states float mact; // Score threshold (negative offset) in MAC alignment int realign_max; // Realign max ... hits float maxmem; // maximum available memory in GB (approximately) char calibrate; // calibration of query HMM? 0:no, 1:yes (write lamda,mu into query profile) char calm; // derive P-values from: 0:query calibration 1:template calibration 2:both 3:Neural Network prediction int opt; // for optimization: compare only every opt'th negative; 0: mode off int readdefaultsfile ; // read defaults file ./.hhdefaults or HOME/.hhdefaults? int min_overlap; // all cells of dyn. programming matrix with L_T-j+i or L_Q-i+j < min_overlap will be ignored int hitrank; // rank of hit to be printed as a3m alignment char notags; // neutralize His-tags, FLAG tags, C-myc tags? unsigned int maxdbstrlen; // maximum length of database string to be printed in 'Command' line of hhr file int maxcol; // max number of columns in sequence/MSA input files; must be <= LINELEN and >= maxres int maxres; // max number of states in HMM; must be <= LINELEN int maxnumdb; // max number of hits allowed past prefilter int maxnumdb_no_prefilter;// max number of hits without prefiltering bool hmmer_used; // True, if a HMMER database is used // Directories for SS-prediction int addss; // 1: calculate secondary structure 0: don't (default: 0) char blast[NAMELEN]; // BLAST binaries (not needed with csBLAST) char psipred[NAMELEN]; // PsiPred binaries char psipred_data[NAMELEN]; // PsiPred data char dummydb [NAMELEN]; // parameters for context-specific pseudocounts float csb; float csw; char clusterfile[NAMELEN]; bool nocontxt; // HHblits int premerge; int dbsize; // number of clusters of input database // HHblits Evalue calculation (alpha = a + b(Neff(T) - 1)(1 - c(Neff(Q) - 1)) ) float alphaa; float alphab; float alphac; // For filtering database alignments in HHsearch and HHblits // JS: What are these used for? They are set to the values without _db anyway. int max_seqid_db; int qid_db; float qsc_db; int coverage_db; int Ndiff_db; // HHblits context state prefilter char cs_library[NAMELEN]; // HHblits prefilter bool prefilter; // perform prefiltering in HHblits? bool early_stopping_filter; // Break HMM search, when the sum of the last N HMM-hit-Evalues is below threshold Hash* block_shading; // Cross out cells not covered by prefiltering hit in HHblits Hash* block_shading_counter; // Cross out cells not covered by prefiltering hit in HHblits int block_shading_space; // space added to the rands of prefilter HSP char block_shading_mode[NAMELEN]; // For HHblits prefiltering with SSE2 short prefilter_gap_open; short prefilter_gap_extend; int prefilter_score_offset; int prefilter_bit_factor; double prefilter_evalue_thresh; int preprefilter_smax_thresh; float wstruc; // weight of structure scores in hhalign int idummy; float fdummy; void SetDefaultPaths(char *program_path); void SetDefaults(); Parameters(); }; void Parameters::SetDefaultPaths(char *program_path) { // set hhlib FILE* testf = NULL; if(getenv("HHLIB")) strcpy(hhlib, getenv("HHLIB")); else strcpy(hhlib, "/usr/lib/hh"); strcat(strcpy(hhdata, hhlib), "/data"); strcat(strcpy(clusterfile, hhdata), "/context_data.lib"); strcat(strcpy(cs_library, hhdata), "/cs219.lib"); testf = fopen(cs_library, "r"); if (testf) fclose(testf); else { if (v>=3) cerr<<"WARNING in HHsuite: Could not open "<=3) cerr<<"WARNING in HHsuite: Could not open "<=3) cerr<<"WARNING in HHsuite: Could not open "<, csh/tcsh: setenv HHLIB=).\n" "The missing files should be in $HHLIB/data/.\n "; exit(2); } return; } void Parameters::SetDefaults() { // Moved from hhdecl.C v=2; // Parameter class maxcol=32765; // max number of columns in sequence/MSA input files; must be <= LINELEN and >= maxres maxres=15002; // max number of states in HMM; must be <= LINELEN maxnumdb=20000; // max number of hits allowed past prefilter maxnumdb_no_prefilter=20000;// max number of hits without prefiltering append=0; // overwrite output file outformat=0; // 0: hhr 1: FASTA 2:A2M 3:A3M p=20.0f; // minimum threshold for inclusion in hit list and alignment listing E=1e6f; // maximum threshold for inclusion in hit list and alignment listing b=10; // min number of alignments B=500; // max number of alignments z=10; // min number of lines in hit list Z=500; // max number of lines in hit list e=1e-3f; // maximum E-value for inclusion in output alignment, output HMM, and PSI-BLAST checkpoint model realign_max=1000; // Realign max ... hits maxmem = 3.0; // 3GB showcons=1; // show consensus sequence showdssp=1; // show predicted secondary structure ss_dssp showpred=1; // show predicted secondary structure ss_pred showconf=0; // don't show secondary structure confidence ss_conf cons=0; // chose first non-SS sequence as main representative sequence (not consensus) nseqdis=1; // maximum number of query sequences for output alignment mark=0; // 1: only marked sequences (or first) get displayed; 0: most divergent ones get displayed aliwidth=80; // number of characters per line in output alignments for HMM search max_seqid=90; // default for maximum sequence identity threshold qid=0; // default for minimum sequence identity with query qsc=-20.0f; // default for minimum score per column with query coverage=0; // default for minimum coverage threshold Ndiff=100; // pick Ndiff most different sequences from alignment allseqs = false; // if true, do not filter result MSA; show all sequences Neff=0; // Filter alignment to a diversity (Neff) with a maximum Neff of par.Neff M=1; // match state assignment is by A2M/A3M Mgaps=50; // Above this percentage of gaps, columns are assigned to insert states (for par.M=2) calibrate=0; // default: no calibration calm=3; // derive P-values from: 0:query calibration 1:template calibration 2:both 3:Neural Network prediction wg=0; // 0: use local sequence weights 1: use local ones matrix=0; // Subst.matrix 0: Gonnet, 1: HSDM, 2: BLOSUM50 3: BLOSUM62 pcm=2; // pseudocount mode: default=divergence-dependent (but not column-specific) pca=1.0f; // default values for substitution matrix pseudocounts pcb=1.5f; // significant reduction of pcs by Neff_M starts around Neff_M-1=pcb pcc=1.0f; // pcs are reduced prop. to 1/Neff^pcc pcw=0.0f; // wc>0 weighs columns according to their intra-clomun similarity nocontxt=0; // use context-specific pseudocounts by default, not substitution matrix pcs pre_pca=0.75f; // PREFILTER - default values for substitution matrix pseudocounts pre_pcb=1.75f; // PREFILTER - significant reduction of pcs by Neff_M starts around Neff_M-1=pcb gapb=1.0; // default values for transition pseudocounts gapd=0.15; // gap open penalty pseudocount; 0.25 corresponds to 7.1*gapf bits gape=1.0; // gap extension penalty pseudocount gapf=0.6; // factor for increasing gap open penalty for deletes gapg=0.6; // factor for increasing gap open penalty for inserts gaph=0.6; // factor for increasing gap extension penalty for deletes gapi=0.6; // factor for increasing gap extension penalty for inserts ssm=2; // ss scoring mode: 0:no ss score 1:score after alignment 2:score during alignment ssw=0.11f; // weight of ss scoring ssw_realign=0.11f; // weight of ss scoring for realign ssa=1.0f; // weight of ss evolution matrix shift=-0.03f; // Shift match score up mact=0.3501f; // Score threshold for MAC alignment in local mode (set to 0.3501 to track user modification) corr=0.1f; // Weight of correlations of scores for |i-j|<=4 egq=0.0f; // no charge for end gaps as default egt=0.0f; // no charge for end gaps as default ssgap=0; // 1: add secondary structure-dependent gap penalties 0:off ssgapd=1.0f; // secondary structure-dependent gap-opening penalty (per residue) ssgape=0.0f; // secondary structure-dependent gap-extension penalty (per residue) ssgapi=4; // max. number of inside-integer(ii); gap-open-penalty= -ii*ssgapd loc=1; // local vs. global alignment as default altali=2; // find up to two (possibly overlapping) subalignments forward=0; // 0: Viterbi algorithm; 1: Viterbi+stochastic sampling; 3:Maximum Accuracy (MAC) algorithm realign=1; // realign with MAC algorithm columnscore=1; // Default column score is 1: null model pnul = 1/2 * (q_av(a)+p_av(a)) half_window_size_local_aa_bg_freqs = 40; min_overlap=0; // automatic minimum overlap used opt=0; // Default = optimization mode off readdefaultsfile=0; // Default = do not read a defaults file ./.hhdefaults or HOME/.hhdefaults maxdbstrlen=200; // maximum length of database string to be printed in 'Command' line of hhr file premerge=0; notags=1; // neutralize His-tags, FLAG-tags, C-myc-tags hmmer_used=false; // Directories for SS-prediction addss=0; strcpy(psipred,""); strcpy(psipred_data,""); // HHblits parameters dbsize = 0; // HHblits Evalue calculation (alpha = a + b(Neff(T) - 1)(1 - c(Neff(Q) - 1)) ) alphaa = 0.4; alphab = 0.02; alphac = 0.1; prefilter = false; //true in hhblits early_stopping_filter = false; //true in hhblits block_shading=NULL; block_shading_counter=NULL; block_shading_space = 200; strcpy(block_shading_mode,"tube"); // For HHblits prefiltering with SSE2 prefilter_gap_open = 20; prefilter_gap_extend = 4; prefilter_score_offset = 50; prefilter_bit_factor = 4; prefilter_evalue_thresh = 1000; preprefilter_smax_thresh = 10; // For filtering database alignments in HHsearch and HHblits //JS: What are these used for? They are set to the options without _db anyway. max_seqid_db=max_seqid; qid_db=qid; qsc_db=qsc; coverage_db=coverage; Ndiff_db=Ndiff; // Initialize strings strcpy(infile,""); strcpy(outfile,""); strcpy(pairwisealisfile,""); strcpy(scorefile,""); strcpy(indexfile,""); strcpy(wfile,""); strcpy(alnfile,""); strcpy(hhmfile,""); strcpy(psifile,""); strcpy(alitabfile,""); exclstr=NULL; // parameters for context-specific pseudocounts csb = 0.85; csw = 1.6; wstruc=1.0f; // Weight of structure score in hhalign idummy=0; return; } Parameters::Parameters() { SetDefaults(); } // Class to store data about hit to realign class Realign_hitpos { public: int index; // index of template in dbfile (1,2,..) long ftellpos; // position of template in dbfile int operator<(const Realign_hitpos& realign_hitpos) {return ftellpos // cin, cout, cerr #include // ofstream, ifstream #include // printf #include // exit #include // strcmp, strstr #include // sqrt, pow #include // INT_MIN #include // FLT_MIN #include // clock #include // islower, isdigit etc using std::ios; using std::ifstream; using std::ofstream; using std::cout; using std::cerr; using std::endl; #include "util.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "list.h" // list data structure #include "hash.h" // hash data structure #include "hhdecl.C" // constants, class #include "hhutil.C" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. #include "hhhmm.h" // class HMM #include "hhalignment.h" // class Alignment #include "hhhit.h" #include "hhhalfalignment.h" #include "hhfullalignment.h" #endif ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// //// Methods of class HitList ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // Print summary listing of hits ///////////////////////////////////////////////////////////////////////////////////// void HitList::PrintHitList(HMM* q, char* outfile) { Hit hit; int nhits=0; FILE* outf=NULL; if (strcmp(outfile,"stdout")) { outf=fopen(outfile,"w"); if (!outf) OpenFileError(outfile); } else outf = stdout; fprintf(outf,"Query %s\n",q->longname); // fprintf(outf,"Family %s\n",q->fam); fprintf(outf,"Match_columns %i\n",q->L); fprintf(outf,"No_of_seqs %i out of %i\n",q->N_filtered,q->N_in); fprintf(outf,"Neff %-4.1f\n",q->Neff_HMM); fprintf(outf,"Searched_HMMs %i\n",N_searched); // Print date stamp time_t* tp=new(time_t); *tp=time(NULL); fprintf(outf,"Date %s",ctime(tp)); delete (tp); // Print command line fprintf(outf,"Command "); for (int i=0; i ",(int)strlen(par.argv[i])); fprintf(outf,"\n\n"); #ifdef WINDOWS fprintf(outf," No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM\n"); #else fprintf(outf," No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM\n"); #endif Reset(); while (!End()) // print hit list { hit = ReadNext(); if (nhits>=par.Z) break; //max number of lines reached? if (nhits>=par.z && hit.Probab < par.p) break; if (nhits>=par.z && hit.Eval > par.E) continue; // if (hit.matched_cols <=1) continue; // adding this might get to intransparent... analogous statement in PrintAlignments nhits++; char Estr[10]; char Pstr[10]; char str[NAMELEN]; sprintf(str,"%3i %-30.30s ",nhits,hit.longname); // #ifdef WINDOWS // fprintf(outf,"%-34.34s %5.1f %8.2G %8.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.Eval,hit.Pval,hit.score,hit.score_ss,hit.matched_cols); // #else // fprintf(outf,"%-34.34s %5.1f %7.2G %7.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.Eval,hit.Pval,hit.score,hit.score_ss,hit.matched_cols); // #endif #ifdef WINDOWS if (hit.Eval>=1E-99) sprintf(Estr,"%8.2G",hit.Eval); else sprintf(Estr,"%8.1E",hit.Eval); if (hit.Pval>=1E-99) sprintf(Pstr,"%8.2G",hit.Pval); else sprintf(Pstr,"%8.1E",hit.Pval); fprintf(outf,"%-34.34s %5.1f %8s %8s ",str,hit.Probab,Estr,Pstr); #else if (hit.Eval>=1E-99) sprintf(Estr,"%7.2G",hit.Eval); else sprintf(Estr,"%7.0E",hit.Eval); if (hit.Pval>=1E-99) sprintf(Pstr,"%7.2G",hit.Pval); else sprintf(Pstr,"%7.0E",hit.Pval); fprintf(outf,"%-34.34s %5.1f %7s %7s ",str,hit.Probab,Estr,Pstr); #endif // Needed for long sequences (more than 5 digits in length) sprintf(str,"%6.1f",hit.score); fprintf(outf,"%-6.6s %5.1f %4i %4i-%-4i %4i-%-4i(%i)\n",str,hit.score_ss,hit.matched_cols,hit.i1,hit.i2,hit.j1,hit.j2,hit.L); } //end print hit list fprintf(outf,"\n"); if (strcmp(outfile,"stdout")) fclose(outf); } ///////////////////////////////////////////////////////////////////////////////////// // Print alignments of query sequences against hit sequences ///////////////////////////////////////////////////////////////////////////////////// void HitList::PrintAlignments(HMM* q, char* outfile, char outformat) { Hit hit; FullAlignment qt_ali(par.nseqdis+10); // maximum 10 annotation (pseudo) sequences (ss_dssp, sa_dssp, ss_pred, ss_conf, consens,...) int nhits=0; FILE* outf=NULL; if (strcmp(outfile,"stdout")) { if (outformat==0) outf=fopen(outfile,"a"); //append to summary hitlist else outf=fopen(outfile,"w"); //open for writing if (!outf) OpenFileError(outfile); } else outf = stdout; Reset(); while (!End()) // print hit list { if (nhits>=par.B) break; //max number of lines reached? hit = ReadNext(); if (nhits>=par.b && hit.Probab < par.p) break; if (nhits>=par.b && hit.Eval > par.E) continue; // if (hit.matched_cols <=1) continue; // adding this might get to intransparent... analogous statement in PrintHitlist and hhalign.C nhits++; // Build double alignment of query against template sequences qt_ali.Build(q,hit); // Print out alignment if (outformat==0) // HHR format { fprintf(outf,"No %-3i\n",nhits); qt_ali.PrintHeader(outf,q,hit); qt_ali.PrintHHR(outf,hit); } else if (outformat==1) // FASTA format { fprintf(outf,"# No %-3i\n",nhits); qt_ali.PrintFASTA(outf,hit); } else if(outformat==2) // A2M format { fprintf(outf,"# No %-3i\n",nhits); qt_ali.PrintA2M(outf,hit); } else // A3m format { fprintf(outf,"# No %-3i\n",nhits); qt_ali.PrintA3M(outf,hit); } qt_ali.FreeMemory(); } if (strcmp(outfile,"stdout")) fclose(outf); } ///////////////////////////////////////////////////////////////////////////////////// // Return the ROC_5 score for optimization (changed 28.3.08 by Michael & Johannes) ///////////////////////////////////////////////////////////////////////////////////// void HitList::Optimize(HMM* q) { const int NFAM =5; // calculate ROC_5 score const int NSFAM=5; // calculate ROC_5 score int roc=0; // ROC score int fam=0; // number of hits from same family (at current threshold) int not_fam=0; // number of hits not from same family int sfam=0; // number of hits from same suporfamily (at current threshold) int not_sfam=0; // number of hits not from same superfamily Hit hit; SortList(); Reset(); while (!End()) { hit = ReadNext(); if (!strcmp(hit.fam,q->fam)) fam++; // query and template from same superfamily? => positive else if (not_fam negative { not_fam++; roc += fam; } if (!strcmp(hit.sfam,q->sfam)) sfam++; // query and template from same superfamily? => positive else if (not_sfam negative { not_sfam++; roc += sfam; } // printf("qfam=%s tfam=%s qsfam=%s tsfam=%s fam=%-2i not_fam=%3i sfam=%-3i not_sfam=%-5i roc=%-3i\n",q->fam,hit.fam,q->sfam,hit.sfam,fam,not_fam,sfam,not_sfam,roc); } // Write ROC score to file or stdout printf("%f\n",float(roc)/float(fam*NFAM+sfam*NSFAM)); // must be between 0 and 1 if (v>=2) printf("ROC=%f\n",float(roc)/float(fam*NFAM+sfam*NSFAM)); } ///////////////////////////////////////////////////////////////////////////////////// // Print score distribution into file score_dist ///////////////////////////////////////////////////////////////////////////////////// void HitList::PrintScoreFile(HMM* q) { int i=0, n; FILE* scoref=NULL; Hit hit; Hash twice(10000); // make sure only one hit per HMM is listed twice.Null(-1); if (strcmp(par.scorefile,"stdout")) { scoref=fopen(par.scorefile,"w"); if (!scoref) {cerr<longname); fprintf(scoref,"FAM %s\n",q->fam); fprintf(scoref,"FILE %s\n",q->file); fprintf(scoref,"LENG %i\n",q->L); fprintf(scoref,"\n"); //fprintf(scoref,"TARGET REL LEN COL LOG-PVA S-TOT MS NALI\n"); //For hhformat, the PROBAB field has to start at position 41 !! // ----+----1----+----2----+----3----+----4----+---- fprintf(scoref,"TARGET FAMILY REL LEN COL LOG-PVA S-AASS PROBAB SCORE LOG-EVAL\n"); // d153l__ 5 185 185 287.82 464.22 100.00 // d1qsaa2 3 168 124 145.55 239.22 57.36 while (!End()) { i++; hit = ReadNext(); if (twice[hit.name]==1) continue; // better hit with same HMM has been listed already twice.Add(hit.name,1); //if template and query are from the same superfamily if (!strcmp(hit.name,q->name)) n=5; else if (!strcmp(hit.fam,q->fam)) n=4; else if (!strcmp(hit.sfam,q->sfam)) n=3; else if (!strcmp(hit.fold,q->fold)) n=2; else if (!strcmp(hit.cl,q->cl)) n=1; else n=0; fprintf(scoref,"%-20s %-10s %1i %5i %3i %8.3f %7.2f %6.2f %7.2f %8.3f\n",hit.name,hit.fam,n,hit.L,hit.matched_cols,-1.443*hit.logPval,-hit.score_aass,hit.Probab,hit.score,-1.443*hit.logEval); } fclose(scoref); } void HitList::WriteToAlifile(HMM* q, bool scop_only) { Hit hit; int i=0, n; Hash twice(10000); // make sure only one hit per HMM is listed twice.Null(-1); FILE* alitabf=NULL; if (strcmp(par.alitabfile,"stdout")) alitabf = fopen(par.alitabfile, "w"); else alitabf = stdout; if (!alitabf) OpenFileError(par.alitabfile); fprintf(alitabf,"NAME %s\n",q->longname); fprintf(alitabf,"FAM %s\n",q->fam); fprintf(alitabf,"FILE %s\n",q->file); fprintf(alitabf,"LENG %i\n",q->L); fprintf(alitabf,"\n"); Reset(); while (!End()) { i++; hit = ReadNext(); if (scop_only && (!strncmp(hit.name,"cl|",3) || !strncmp(hit.name,"UP20|",5) || !strncmp(hit.name,"NR20|",5))) continue; if (twice[hit.name]==1) continue; // better hit with same HMM has been listed already twice.Add(hit.name,1); //if template and query are from the same superfamily if (!strcmp(hit.name,q->name)) n=5; else if (!strcmp(hit.fam,q->fam)) n=4; else if (!strcmp(hit.sfam,q->sfam)) n=3; else if (!strcmp(hit.fold,q->fold)) n=2; else if (!strcmp(hit.cl,q->cl)) n=1; else n=0; if (hit.P_posterior != NULL) { fprintf(alitabf,"\nHit %3i (%-20s %-10s Rel: %i LOG-PVA: %6.2f LOG-EVAL: %6.2f Score: %6.2f Probab: %6.2f):\n i j score SS probab\n",i,hit.name,hit.fam,n,-1.443*hit.logPval,-1.443*hit.logEval,hit.score,hit.Probab); for (int step=hit.nsteps; step>=1; step--) if (hit.states[step]>=MM) fprintf(alitabf,"%5i %5i %6.2f %6.2f %7.4f\n",hit.i[step],hit.j[step],hit.S[step],hit.S_ss[step],hit.P_posterior[step]); } else { fprintf(alitabf,"\nHit %3i (%-20s %-10s Rel: %i LOG-PVA: %6.2f LOG-EVAL: %6.2f Score: %6.2f Probab: %6.2f):\n i j score SS\n",i,hit.name,hit.fam,n,-1.443*hit.logPval,-1.443*hit.logEval,hit.score,hit.Probab); for (int step=hit.nsteps; step>=1; step--) if (hit.states[step]>=MM) fprintf(alitabf,"%5i %5i %6.2f %6.2f\n",hit.i[step],hit.j[step],hit.S[step],hit.S_ss[step]); } } fclose(alitabf); } ///////////////////////////////////////////////////////////////////////////////////// //// Evaluate the *negative* log likelihood of the data at the vertex v = (lamda,mu) //// p(s) = lamda * exp{ -exp[-lamda*(s-mu)] - lamda*(s-mu) } = lamda * exp( -exp(-x) - x) ///////////////////////////////////////////////////////////////////////////////////// double HitList::LogLikelihoodEVD(double* v) { double sum=0.0, sumw=0.0; for (int i=0; iLogLikelihoodEVD(v); // call member function } ///////////////////////////////////////////////////////////////////////////////////// //// Subroutine to FindMin: try new point given by highest point ihigh and fac and replace ihigh if it is lower ///////////////////////////////////////////////////////////////////////////////////// double HitList::TryPoint(const int ndim, double* p, double* y, double* psum, int ihigh, double fac, double (*Func)(void* pt2hitlist, double* v)) { // New point p_try = p_c + fac*(p_high-p_c), // where p_c = ( sum_i (p_i) - p_high)/ndim is the center of ndim other points // => p_try = fac1*sum_i(p_i) + fac2*p_high double fac1=(1.-fac)/ndim; double fac2=fac-fac1; double ptry[ndim]; //new point to try out double ytry; //function value of new point int j; //index for the ndim parameters for (j=0; j=4) printf("Trying: %-7.3f %-7.3f %-7.3f -> accept\n",ptry[0],ptry[1],ytry); y[ihigh]=ytry; for (j=0; j=4) printf("Trying: %-7.3f %-7.3f %-7.3f -> reject\n",ptry[0],ptry[1],ytry); return ytry; } ///////////////////////////////////////////////////////////////////////////////////// ////Find minimum with simplex method of Nelder and Mead (1965) ///////////////////////////////////////////////////////////////////////////////////// float HitList::FindMin(const int ndim, double* p, double* y, double tol, int& nfunc, double (*Func)(void* pt2hitlist, double* v)) { const int MAXNFUNC=99; //maximum allowed number of function evaluations int ihigh; //index of highest point on simplex int inext; //index of second highest point on simplex int ilow; //index of lowest point on simplex int i; //index for the ndim+1 points int j; //index for the ndim parameters double rtol; //tolerance: difference of function value between highest and lowest point of simplex double temp; //dummy double ytry; //function value of trial point double psum[ndim]; //psum[j] = j'th coordinate of sum vector (sum over all vertex vectors) nfunc=0; //number of function evaluations =0 //Calculate sum vector psum[j] for (j=0; jy[1]) {inext=1; ihigh=0;} else {inext=0; ihigh=1;} for (i=0; iy[ihigh]) {inext=ihigh; ihigh=i;} else if (y[i]>y[inext] && i!= ihigh) inext=i; } // If tolerance in y is smaller than tol swap lowest point to index 0 and break -> return rtol = 2.*fabs(y[ihigh]-y[ilow]) / (fabs(y[ihigh])+fabs(y[ilow])+1E-10); if (rtol=MAXNFUNC ) { if (v) fprintf(stderr,"\nWARNING: maximum likelihood fit of score distribution did not converge.\n"); return 1; } nfunc+=2; // Point-reflect highest point on the center of gravity p_c of the other ndim points of the simplex if (v>=3) printf("%3i %-7.3f %-7.3f %-12.8f %-9.3E\n",nfunc,p[ilow*ndim],p[ilow*ndim+1],y[ilow],rtol); // if (v>=2) printf(" %3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); ytry = TryPoint(ndim,p,y,psum,ihigh,-1.0,Func); //reflect highest point on p_c if (ytry<=y[ilow]) { ytry = TryPoint(ndim,p,y,psum,ihigh,2.0,Func); //expand: try new point 2x further away from p_c // if (v>=2) printf("Expanded: %3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); } else if (ytry>=y[inext]) { // The new point is worse than the second worst point temp=y[ihigh]; ytry=TryPoint(ndim,p,y,psum,ihigh,0.5,Func); //contract simplex by 0.5 along (p_high-p_c // if (v>=2) printf("Compressed:%3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); if (ytry>=temp) { // Trial point is larger than worst point => contract simplex by 0.5 towards lowest point for (i=0; i=2) printf("Contracted:%3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); //Calculate psum[j] for (j=0; j size_fam(MAXPROF/10); // Hash counts number of HMMs in family static Hash size_sfam(MAXPROF/10); // Hash counts number of families in superfamily Hash excluded(50); // Hash containing names of superfamilies to be excluded from fit size_fam.Null(0); // Set int value to return when no data can be retrieved size_sfam.Null(0); // Set int value to return when no data can be retrieved excluded.Null(0); // Set int value to return when no data can be retrieved Hit hit; double mu; // EVD[mu,lam](x) = exp(-exp(-(x-mu)/lam)) = P(score<=x) double vertex[2*3]; // three vertices of the simplex in lamda-mu plane double yvertex[3]; // log likelihood values at the three vertices of the simplex int nfunc=0; // number of function calls double sum_weights=0.0; float sum_scores=0.0; float rtol; if (first_call==1) { first_call=0; // Count how many HMMs are in each family if (v>=4) printf(" count number of profiles in each family and families in each superfamily ...\n"); Reset(); while (!End()) { hit = ReadNext(); if (!size_fam.Contains(hit.fam)) (*size_sfam(hit.sfam))++; //Add one to hash element for superfamily (*size_fam(hit.fam))++; //Add one to hash element for family // printf("size(%s)=%i name=%s\n",hit.fam,*size_fam(hit.fam),hit.name) } fams=size_fam.Size(); sfams=size_sfam.Size(); if (v>=3) printf("%-3i HMMs from %i families and %i superfamilies searched. Found %i hits\n",N_searched,fams,sfams,Size()); } // Query has SCOP family identifier? if (q->fam && q->fam[0]>='a' && q->fam[0]<='k' && q->fam[1]=='.') { char sfamid[NAMELEN]; char* ptr_in_fam=q->fam; while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) { char* ptr=strrchr(sfamid,'.'); if (ptr) *ptr='\0'; excluded.Add(sfamid); // fprintf(stderr,"Exclude SCOP superfamily %s ptr_in_fam='%s'\n",sfamid,ptr_in_fam); } } // Exclude best superfamilies from fit else if (nbest>0) { if (sfams<97+nbest) return; // Find the nbest best-scoring superfamilies for exclusion from first ML fit if (v>=4) printf(" find %i best-scoring superfamilies to exclude from first fit ...\n",nbest); hit = Smallest(); excluded.Add(hit.sfam); // printf("Exclude in first round: %s %8.2f %s\n",hit.name,hit.score_aass,hit.sfam); while (excluded.Size()=4) printf(" find best-scoring superfamilies to exclude from second fit ...\n"); Reset(); while (!End()) { hit = ReadNext(); if (hit.Eval < 0.05) excluded.Add(hit.sfam); // changed from 0.5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } tol = 0.001/size_sfam.Size(); // tol=1/N would lead to delta(log-likelihood)~1 (where N ~ number of superfamilies) since (1+1/N)^N = e } // Put scores into score[] and weights into weight[] if (v>=3) printf(" generate scores and weights array for ML fitting ...\n"); Nprof=0; Reset(); while (!End()) { hit = ReadNext(); if (hit.irep > 1) continue; //Use only best hit per template if (Nprof>=MAXPROF) break; char sfamid[NAMELEN]; char* ptr_in_fam=hit.fam; while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) { char* ptr=strrchr(sfamid,'.'); if (ptr) *ptr='\0'; if (excluded.Contains(sfamid)) break; //HMM is among superfamilies to be excluded } if (excluded.Contains(sfamid)) { if (v>=3) fprintf(stderr,"Exclude hit %s (family %s contains %s)\n",hit.name,hit.fam,sfamid); continue; } // ScopID(hit.cl,hit.fold,hit.sfam,hit.fam); //Get scop superfamily code for template // if (*hit.sfam=='\0' || excluded.Contains(hit.sfam)) continue; // skip HMM score[Nprof] = hit.score; weight[Nprof]=1./size_fam[hit.fam]/size_sfam[hit.sfam]; sum_scores +=hit.score*weight[Nprof]; sum_weights+=weight[Nprof]; //DEBUG // if (v>=4) printf("%-10.10s %-12.12s %-3i %-12.12s %-3i %6.4f %6.4f %7.1f\n",hit.name,hit.fam,size_fam[hit.fam],hit.sfam,size_sfam[hit.sfam],1./size_fam[hit.fam]/size_sfam[hit.sfam],sum,hit.score); Nprof++; } //DEBUG if (v>=3) printf("%i hits used for score distribution\n",Nprof); // for (int i=0; i0) {vertex[0]=LAMDA; vertex[1]=mu;} /////////////////////////////////////////// DEBUG else {vertex[0]=q->lamda; vertex[1]=mu;} vertex[2]=vertex[0]+0.1; vertex[3]=vertex[1]; vertex[4]=vertex[0]; vertex[5]=vertex[1]+0.2; yvertex[0]=Func(this,vertex ); yvertex[1]=Func(this,vertex+2); yvertex[2]=Func(this,vertex+4); // Find lam and mu that minimize negative log likelihood of data if (v>=3) printf("Fitting to EVD by maximum likelihood...\niter lamda mu -log(P)/N tol\n"); rtol = FindMin(2,vertex,yvertex,tol,nfunc,Func); if (v>=3) printf("%3i %-7.3f %-7.2f %-7.3f %-7.1E\n\n",nfunc,vertex[0],vertex[1],yvertex[0]-(1.5772-log(vertex[0])),rtol); // printf("HHsearch lamda=%-6.3f mu=%-6.3f\n",vertex[0],vertex[1]); } else { vertex[0]=LAMDA_GLOB; vertex[1]=mu; } // Set lamda and mu of profile q->lamda = vertex[0]; q->mu = vertex[1]; // Set P-values and E-values // CHECK UPDATE FROM score=-logpval to score=-logpval+SSSCORE2NATLOG*score_ss !!!! Reset(); while (!End()) { hit = ReadNext(); // Calculate total score in raw score units: P-value = 1- exp(-exp(-lamda*(Saa-mu))) hit.logPval = logPvalue(hit.score,vertex); hit.Pval=Pvalue(hit.score,vertex); hit.Eval=exp(hit.logPval+log(N_searched)); hit.logEval = hit.logPval+log(N_searched); // hit.score_aass = hit.logPval/0.45-3.0 - hit.score_ss; // median(lamda)~0.45, median(mu)~4.0 in EVDs for scop20.1.63 HMMs hit.score_aass = -q->lamda*(hit.score-q->mu)/0.45-3.0 - fmin(hit.score_ss,fmax(0.0,0.5*hit.score-5.0)); // median(lamda)~0.45, median(mu)~3.0 in EVDs for scop20.1.63 HMMs hit.Probab = Probab(hit); hit.score_sort = hit.score_aass; Overwrite(hit); // copy hit object into current position of hitlist } } ///////////////////////////////////////////////////////////////////////////////////// // Calculate output of hidden neural network units ///////////////////////////////////////////////////////////////////////////////////// inline float calc_hidden_output(const float* weights, const float* bias, float Lqnorm, float Ltnorm, float Nqnorm, float Ntnorm) { float res; // Calculate activation of hidden unit = sum of all inputs * weights + bias res = Lqnorm*weights[0] + Ltnorm*weights[1] + Nqnorm*weights[2] + Ntnorm*weights[3] + *bias; res = 1.0 / (1.0 + exp(-(res ))); // logistic function return res; } //////////////////////////////////////////////////////////////////////////////////// //// Neural network regressions of lamda for EVD ///////////////////////////////////////////////////////////////////////////////////// inline float lamda_NN(float Lqnorm, float Ltnorm, float Nqnorm, float Ntnorm) { const int inputs = 4; const int hidden = 4; const float biases[] = {-0.73195, -1.43792, -1.18839, -3.01141}; // bias for all hidden units const float weights[] = { // Weights for the neural networks (column = start unit, row = end unit) -0.52356, -3.37650, 1.12984, -0.46796, -4.71361, 0.14166, 1.66807, 0.16383, -0.94895, -1.24358, -1.20293, 0.95434, -0.00318, 0.53022, -0.04914, -0.77046, 2.45630, 3.02905, 2.53803, 2.64379 }; float lamda=0.0; for (int h = 0; h