pax_global_header00006660000000000000000000000064132577332360014525gustar00rootroot0000000000000052 comment=2ae86a3315c0e62c2af742ae0daed9252e2f6394 dbacl-1.14.1/000077500000000000000000000000001325773323600126565ustar00rootroot00000000000000dbacl-1.14.1/AUTHORS000066400000000000000000000000371325773323600137260ustar00rootroot00000000000000Laird Breyer: author of dbacl.dbacl-1.14.1/COPYING000066400000000000000000001043741325773323600137220ustar00rootroot00000000000000 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 . dbacl-1.14.1/ChangeLog000066400000000000000000000265351325773323600144430ustar00rootroot00000000000000dbacl 1.14.1: * changed defaults in dbacl.h to allow 16384 categories (thanks Johannes Gerer) * compile using std=c99 dbacl 1.14: * cleanup tempfiles in recalculate_reference_measure (thanks Marcin Mirosław) * removed spherecl code (failed experiment). dbacl 1.13: * updated licence from GPL2 to GPL3. * new classifier command spherecl (unfinished, unusable). * new -Y switch. * fine grained Mheaderid used for expanded token classes. * rearrange options bitfield to make room for extra choices. * new formula used for -U score. * new -O switch. Updated man page. * new -z switch. * fixed compile problems in HPUX (thanks to Frank Spaniak). * new -F switch for classifying several files per invocation. * new checkpoint and restart scripts in the TREC directory. * extra debug information for -d switch. dbacl 1.12: * some tests in make check need C locale (found by Szperacz). * swap order of #include "util.h" and #include for gcc 4.0 * defined dummy yywrap() in risk-parser.y * added the TREC2005 options files to the distribution. * when using -T html:styles, now also shows CSS class. * bug fix: some MMAP calls incorrectly tested NULL instead of MAP_FAILED. * bug fix: std_tokenizer lost tokens with M_OPTION_NGRAM_STRADDLE_NL. * bug fix: xml_character_filter, XTAG attributes straddling newlines. * changed -T email:xheaders semantics slightly. * re-added EXIT_STATUS section in man page (was lost after rewrite). * fixed exit status when learning, to conform with Unix convention, but classifying exit status continues to be nonstandard. * new option -e char for single characters. * updated code in mailinspect.c so that it compiles with slang2. (thanks Clint Adams) * changed util.h and tests/Makefile.am for IRIX make compilation. (thanks to anonymous submitter) * todo: find unchecked null pointers * todo: fix flex linking problem * new hypex command, a Chernoff exponent calculator for dbacl. * optionally scan sources with splint (tricky, incomplete) (thanks to Markus Elfring for pointing out the need for it). dbacl 1.11: * bug fix in mailcross. * bug fix: SIGACTION changed to HAVE_SIGACTION. * add slowdown warning on STDERR when learner hash won't grow any more. * set extra_lines = 0 in process_file when U_OPTION_FILTER applies. * add new switch -S to be used with -w, and make -w more standard. * replace tmpfile() call with mytmpfile() + unlink(). * change the formula for score renormalizations and make complexity into a fractional quantity. * update/edit the manpages and tutorials. * add new function fast_partial_save_learner(). dbacl 1.10: * small changes to the documentation. * add new TREC directory containing spamjig scripts. * apply vpath changes, thanks to Clint Adams, see contrib directory. * change is_binline() to be more robust across locales. * bug fix in test scripts in case program doesn't run in C locale. * -m switch now applies to learning with -o switch. * add "b" to all the fopen() calls, including stdin handling. * fix typos and updated documentation (thanks Keith Briggs). * bug fix: add check for q = NULL pointer in std_tokenizer. * implicit parentheses around regexes with -g switch. * -0 switch is now default, added -1 switch to force preloading. * -X switch no longer default for learning. * convert some E_ERROR messages into E_FATAL. * remove hacks in make_dirichlet_digrams(), agrees with dbacl.ps again. * bug fix: handle style attribute in XTAGS if M_OPTION_SHOW_STYLE. * parsing improvement: detect MIME headers with missing boundary. * loophole fix: IGNORE_MIME_PREAMBLE in mbw.c. dbacl 1.9: * bug fix: bayesol expects '^scores', dbacl writes '^# scores', found by Darryl Luff (thanks). * dbacl -l now accepts directory names as well as mboxes. * add new -U switch, to measure MAP ambiguity. * change "n/a" type confidence value (-X switch) from 101 to 0, which is friendlier to mailinspect. * bug fix: -vnX displayed wrong percentage. * new hmine command. * add two new scoring types in mailinspect (-o switch). * fix interactive compilation of mailinspect, which got broken by previous automake redesign. * new -T email:theaders option. * bug fix: portable categories had been disabled in dbacl.h dbacl 1.8.1: * reformat output scores. * fix -d switch to work during classification. * new -m switch to speed up learning/classifying. * bug fix: is_adp_char/is_cef_char was buggy, now ok + more modular. * stop printing control codes with -D and -d switches. * handle RFC 1153 format. * add -T html:forms switch. * bug fix: add extra newlines to input and flush filter caches. * bug fix: uri encoding. * bug fix: message/rfc822 mime type. * where possible, write portable (byte order) category files. * new make check autotest scripts (finally!). * standardize error messages a bit more. * rework automake system (after doing teh RTFM). * remove boost regex code. * move some common functions to new file util.c. * fix bug in get_token_type() when MBOX mode is off. * redesign the process_file() functions, fixing bugs. * limit single token sizes to prevent numeric overflows in digitization. * replace wcsncasecmp with mystrncasecmp as former is broken on glibc. * cosmetic change to "summarize" testsuite commands. dbacl 1.8: * revise dbacl.ps: fixes typos (thanks to Keith Briggs) and brings theory up to date. * change html:links option to display full unparsed url. * email mode now defaults to -e adp and -L uniform, unlike previous version, whose behaviour can be obtained with -e cef -L dirichlet. * new -e switch parameter (adp). * new support for token classes. Not used much for now. * rework reference measure estimations, modified -L switch. * change default model policy from multinomial to hierarchical. To obtain multinomial from now on, -M must always be used. * add _GNU_SOURCE to shut up posix_memalign warnings on Linux. * bug fix: decode_html_entity. This function just keeps bugging me. * fix slightly the handling of HTML comments. * fix some more options/bugs in the testsuite wrappers. * bug fix: in digitizing digrams, because format has changed. dbacl 1.7: * add -q switch to control learning quality/speed. * rework entropy optimization to reduce variability, and preload weights if category already exists (-0 switch). * improve buffering behaviour when using -f switch. Discovered by Yoav Aner. * add signal handlers with notification to stderr. * add new costs.ps document describing the bayesol cost calculations. * add new -N switch to bayesol. * add basic "plot" commands for mailtoe/mailfoot (needs gnuplot). * add new -o switch. Useful for faster mailtoe/mailfoot simulations. * modify -x switch to skip full messages when used with -T "email" . * add madvise calls for hash tables. * bug fix: memset address was wrong in grow_learner_hash(). * bug fix: more robust quote parser inside xml tags. Discovered by spammers. Thanks, whoever you are ;-) * saving category files is now atomic, and cannot be corrupted. * save category files with 440 permissions only. * remove some deprecated bogofilter wrappers. * forgot to check sscanf return values. * bug fix: no plain_text_filter() for non-plaintext body parts. * bug fix: decode_html_entity. * bug fix: use 64 bit hashes when defining "huge" memory model. * fix dbacl display bug with -N switch and single category. dbacl 1.6: * add new testsuite wrappers for crm114, SpamAssassin, SpamOracle. * new autoconf check for wcstol (in case C library is incomplete). Thanks to Marian Steinbach. * new mailtoe and mailfoot commands similar to mailcross. * merge the mailcross and mailcross.testsuite commands, and invert their exit codes to get normal shell conventions. * new -T switch to scan attachments somewhat like strings(1). * fix a crash in mailinspect when viewing mailboxes with more than 1024 messages. * remove "growing hashtable" warning - it's distracting and useless. dbacl 1.5.1: * fix a trivial, but serious bug: mail messages were not parsed if they didn't start with From_. * streamline html entity decoding inside XTAGS * add new testsuite wrapper script for popfile (tested with 0.20.1 only). * cosmetic changes to the testsuite scripts (e.g. /bin/sh --> /bin/bash everywhere, at least until the scripts become truly portable). dbacl 1.5: * new mailcross.testsuite command. * use poor man's templates (in mbw.c) for parsing functions. * add several new -T switches. * completely rework the xml filter. * add new base64 and quoted-printable decoders. * fix hang bug with signed chars during learning. * fix bugs in mbox parser. * slight reorganization and new features in mailcross. * make digramic transitions semireversible. * rework email.html tutorial. * invert the readline and ncurses tests in configure.in dbacl 1.4: * add the -mieee switch on Alpha processors (to prevent incorrect divide by zero errors - we use IEEE fp). * add a tutorial for email classification. * add dependency on ncurses to satisfy libreadline, following a suggestion by Christian Loitsch. * change slightly the bayesol risk calculation and parse risk spec costs directly on log scale. * add an -e switch to replace alpha character class tokenization. * add a -L switch to replace digramic measure with Laplacian measure. * add -fsigned-char compilation switch to Makefile.in for portability. Discovered by Kerry Todyruik. * change slightly the mbox/MIME parsing algorithm to fix bugs where Base64 encoded attachements aren't skipped. * change some of the sample*.txt files to preempt copyright issues, following a suggestion by Johannes Huesing. * fix misplaced post_line_fun() call in *process_file(). * use AC_FUNC_MBRTOWC in configure script instead of manually checking headers. dbacl 1.3.1: * add basic vi cursor key support in mailinspect. * don't pack structs if not GNU C compiler. * remove hh modifier in fprintf calls. * disable wide character support for BSD style machines. * fix solaris compilation problem with sys/types.h. Thanks to Wes Groleau for pointing out the bug. * fix a typo in tutorial. * fix for gcc-3.x compilation problem. '^M' is now '\r'. Thanks to Mike Frysinger dbacl 1.3: * add a paragraph to the README * dbacl now counts the number of emails found during learning. * mailinspect permits (interactively) sorting an mbox by category * refactored functions to allow sharing in dbacl.c and mailinspect.c dbacl 1.2.1: * new -H switch allows dynamically growing hash tables during learning * bayesol now warns if complexities are disparate + warning in tutorial * new command mailcross to perform cross validation * new -A switch as a companion for -a switch * remove empirical.track_features limitation on line length dbacl 1.2: * add simple-minded feature decimation for memory-constrained operation * add new Bayes solution calculator (bayesol) * add a tutorial dbacl 1.1: * add handler for regex submatch bitmaps. * add a new dump model switch (-d). * add new code for hierarchical type models (incl. -w switch). * speed up hash macros * insert typedefs for fine grained portability control. * reformat the usage strings. * properly separate components in n-grams. * document the theoretical aspects of the design. dbacl 1.0: * add support for regular expressions * add support for internationalization * fix a bug (miscalculation of lambdas) in previous version. dbacl 0.9: * initial stable release. dbacl-1.14.1/INSTALL000066400000000000000000000363321325773323600137160ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. dbacl-1.14.1/Makefile.am000066400000000000000000000010561325773323600147140ustar00rootroot00000000000000AUTOMAKE_OPTIONS = 1.4 gnits ACLOCAL = -I config AUX_DIST = config/config.guess \ config/config.sub \ config/install-sh \ config/missing \ config/mkinstalldirs EXTRA_DIST = bootstrap SUBDIRS = doc src man ts TREC contrib # fix for new auto{conf,make} behaviour ??? datarootdir ?= $(prefix)/share dist-hook: (cd $(distdir) && mkdir -p config) for f in $(AUX_DIST); do \ cp $$f $(distdir)/$$f; \ done trec: make dist && (cat TREC/SFX $(distdir).tar.gz > $(distdir).TREC.sfx.sh) test -e $(distdir).TREC.sfx.sh && chmod +x $(distdir).TREC.sfx.sh dbacl-1.14.1/Makefile.in000066400000000000000000000563361325773323600147400ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS THANKS config/config.guess \ config/config.sub config/depcomp config/install-sh \ config/missing config/mkinstalldirs config/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = -I config AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.4 gnits AUX_DIST = config/config.guess \ config/config.sub \ config/install-sh \ config/missing \ config/mkinstalldirs EXTRA_DIST = bootstrap SUBDIRS = doc src man ts TREC contrib all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnits'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnits \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @case `sed 15q $(srcdir)/NEWS` in \ *"$(VERSION)"*) : ;; \ *) \ echo "NEWS not updated; not releasing" 1>&2; \ exit 1;; \ esac $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-hook dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # fix for new auto{conf,make} behaviour ??? datarootdir ?= $(prefix)/share dist-hook: (cd $(distdir) && mkdir -p config) for f in $(AUX_DIST); do \ cp $$f $(distdir)/$$f; \ done trec: make dist && (cat TREC/SFX $(distdir).tar.gz > $(distdir).TREC.sfx.sh) test -e $(distdir).TREC.sfx.sh && chmod +x $(distdir).TREC.sfx.sh # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/NEWS000066400000000000000000000160161325773323600133610ustar00rootroot00000000000000dbacl NEWS -- history of user-visible changes. From August 2004. Copyright (C) 2004-2012 Laird Breyer. dbacl 1.14.1 This release changes the default settings to allow up to 16384 categories, and fixes some other limits in line with modern standards. dbacl 1.14 Bugfix release. No user visible changes. dbacl 1.13 The new -P switch is intended to help with "unbalanced" training corpora. When one category has much more training data than another, there is an implicit bias in the likelihood scores that are output by dbacl, which causes the optimal classification threshold to shift. The -P switch adds a Poisson prior distribution on the document length, which should normally be an improvement, but possibly too small to notice. Note this only works with the -T email switch. This could also be done more generally with the bayesol(1) utility, but it is more convenient to have the -P switch, because the prior can be adjusted dynamically from the category files. The -U switch, which computes an uncertainty score (more precisely, how unambiguous the best category is), now uses a different formula. The meaning is the same as before, 100% means dbacl is sure of its choice, 0% means it's unsure. The new formula attempts to better represent the amount of uncertainty present during a classification, and is based on the token hit rates as well as the category scores as before. The -O switch is a generalization of the -o switch. With -O, dbacl can read several online learning files (each created with -o) and combine them. These switches are only useful for simple forms of incremental learning, for example -o is used in the TREC scripts. dbacl 1.12 Added the "Can spam filters play chess?" essay to the bundled documentation, look in the doc/chess directory. Added the TREC2005 options files to the TREC directory. Fixed some parsing bugs. There now is a new parser "-e char" which parses single characters. This isn't useful on its own, but together with the -w switch this allows fast construction of character n-gram models up to order 7. Note that you could simply use a series of regular expressions to generate n-grams, but this way doesn't have the regex overhead. dbacl 1.11 For some reason which appears to be a typo, the signal handling code was disabled, but now works as advertised. The score calculations now do renormalization slightly differently, and document complexities are also changed from integers to reals. This should be practically unnoticeable for simple models, but for divergences and complexities of n-gram models it will be, although the impact is minor asymptotically for large complexity. This change allows more meaningful direct comparisons between models based on widely differing tokenization schemes, ie in principle it allows comparing a category which is based solely on alphabetical word tokens with another category which is based solely on numbers, for example, even though they don't compare similar tokens. Which is not to say that you should do it. You're safe if you always learn all your categories with exactly the same set of model switches. When using the -w switch, complex tokens no longer continue past the end of a line and onto the next one. This is more consistent with other switch behaviours, and you can force n-grams to straddle newlines by using the -S switch. When using the -o and -m switches together, some extra memory mapping is now performed. This is useful for keeping the mapped pages invariant for the TREC tests, but doesn't help in speeding up the simulation. DISCUSSION In the spamjig run [which performs classify/learn for every input document], after all pages are locked into place, about 90% of the cpu time is spent optimizing the weights [by contrast, in ordinary use, about 70% of the running time is reading and parsing input]. The only way I can see to improve the cpu bottleneck is to exploit symmetries and compression techniques. However, this can't be done without changing the learner hash structure, which must be thought through carefully [and won't be done soon]. As an added benefit, doing this correctly should imply much reduced memory requirements during learning. dbacl 1.10 A new TREC directory contains the necessary scripts and instructions for running dbacl in the TREC/spam testing framework (spamjig). The mail body parser was tweaked, so it no longer ignores the preamble before the first MIME section. This goes against RFC 2046 (p.20) recommendations, but if a spammer uses it, there's got to be a reason. So now we also parse the preamble (can be disabled, see IGNORE_MIME_PREAMBLE). The -0 switch is now always on by default. Recall that its purpose is to prevent weight preloading if the category file already exists. Weight preloading speeds up the learning operation by starting with the last known set of weights for the category. It's a nice idea, but can cause trouble if the old category feature list is much different from the new feature set to be learned. In particular, if you leave an old category named "dummy" on your system, and months later you decide to learn an unrelated category also named "dummy"... Preloading must now be explicitly enabled with the new -1 switch if you want to experiment with it. The -g switch now scans a given regular expression for captures (parentheses), and surrounds the expression with a single capture if none were found as a convenience. The -g switch is powerful, but hard to explain: Many unix tools use regular expressions. Such an expression normally matches a substring in the input, but if it also contains parentheses, then whatever is inside those parentheses is "captured". So the expression 'Hello .*' matches the string "Hello Fred", but the expression 'Hello (.*)' both matches "Hello Fred" and also captures "Fred". In dbacl, the -g switch lets you construct tokens from captured expressions, but a corollary is that if you don't supply a capture expression, then dbacl won't read any tokens at all! As a convenience, if no parentheses exist, dbacl will now add some. Thus the command line switch -g 'Hello .*' is converted to -g '(Hello .*)' but -g 'Hello (.*)' is left untouched. dbacl 1.9 The categories are now "portable" by default, unless the architecture prevents it. Portable categories are stored in network byte order, and data is converted on the fly when needed. The switch had been disabled in version 1.8.1 by mistake. A new command hforge is available. It scans an email header and checks for signs of forgery. dbacl 1.8.1 This is the first version of dbacl which includes a NEWS file. This was forced at the GNU autotools insistence, and the author is not responsible for the contents ;-). dbacl now makes better use of the autotools, due in no small part on liberal doses of RTFM. The most important aspect is the new self-test suite, which can be invoked via make check. Other changes in dbacl for this release are mainly bugfixes and code cleanup. The -g and -i switches are now incompatible until further redesign. The only other user-visible change is a new -m switch, which can speed up repeated classifications tremendously. dbacl-1.14.1/README000066400000000000000000000174351325773323600135500ustar00rootroot00000000000000 DBACL - digramic Bayesian classifier PURPOSE dbacl is a command line program which can be used to categorize several types of text documents. Each document category is constructed as a maximum entropy language model, with respect to a reference measure based on digrams (character pairs). Before recognition can take place, a number of text corpora must be "learned". For example, an English category could be based on a text file containing the collected works of Shakespeare. The Gutenberg project (http://promo.net/pg/) makes freely available many public domain works in electronic form. After learning, any number of text files can be compared, in terms of Bayesian posterior probabilities, with up to 128 learned categories. The actual number of categories is limited only by available memory, and can be changed by editing dbacl.h and recompiling. Last but not least, dbacl also has special support for email message formats, which permits its use as an email filter. Explanations and instructions are in the man pages and bundled tutorials. dbacl is bundled with a few other utilities: - bayesol is a postprocessor which takes the dbacl output and computes an optimal decision based on costs of misclassification. Together with dbacl, this allows the construction of sophisticated, multilingual, classification scripts, if you're not afraid of some shell scripting. - mailcross performs email classification cross validation. It can be used to assess the performance of custom email classification scripts based on dbacl and bayesol. It also has a testsuite functionality to compare dbacl with other open source email filters on your own email collections (this functionality existed separately in the 1.5 series, but has been merged now). At time of writing, 11 different mail classifiers can be compared. - mailtoe performs train on error (TOE) simulation. This command is virtually identical to mailcross. In particular, it allows TOE comparisons between dbacl and other email filters. - mailfoot performs fully ordered online training simulation. It functions like mailcross and mailtoe. - mailinspect reads an mbox style mail folder and displays the emails in sorted order, based on similarity to any given category. DOCUMENTATION See the bundled manpages. Generic instructions can be found in the file INSTALL. A tutorial is to be found in the file tutorial.html, and an exposition of the algorithms is in dbacl.ps. An alternative tutorial which is specialized for email classification is in the file email.html. All these files are in the doc directory, but should be installed automatically with the programs. LICENSE With the exceptions noted below, DBACL is distributed under the terms of the GNU General Public License (GPL) which can be found in the file COPYING. Some source files have free public licenses, by Bob Jenkins (hash functions) and Stephen L. Moshier (cephes functions). The sample text files are fair use quotes from various sources, and not covered by the GPL. To prevent statistical bias, the samples cannot be marked directly with the author's name: - sample1.txt, sample3 and sampe5.txt are in the public domain, by Mark Twain. - sample2.txt, sample4.txt are in the public domain, by Aristotle. - sample6.txt is a forwarded email, copyright unknown. - japanese.txt is a Japanese translation of the GNU General Public License, copyright by the Free Software Foundation. BUILDING There are several configuration options you can change in the file dbacl.h, if you want to increase the maximum number of categories or optimize hash table overhead. To build and install the program, you can execute the following steps from within the source DBACL directory: (note: you may have to replace make with gmake if you get errors) ./configure make make check make install The last part should be executed with superuser privileges for system wide installation. Alternatively ./configure --prefix=/home/xyzzy make make check make install builds and installs in user xyzzy's home directory, without the need for root privileges. In this case, the following environment variables should be set permanently (e.g. in the file .profile): PATH=$PATH:/home/xyzzy/bin MANPATH=$MANPATH:/home/xyzzy/man INTERNATIONALIZATION dbacl uses the current locale for processing. 8-bit clean multibyte character sets (such as UTF-8) are supported in the default mode, and arbitrary multibyte character sets require the -i command line option. Note that your version of dbacl might not support international (wide) characters. This is checked for during compilation, see the output of configure. The following remarks only apply to previous versions of dbacl. In version 1.8.1 and later, regexes are only available in multibyte code. This is to discard the added complexity of dealing with wide character regexes - wide regexes will be reintroduced in the future, once a clean way of doing so is found.
If you intend to use the -i option together with regular expressions, you must build with a wide character POSIX regex library: ensure that the BOOST library is present on the system and type ./configure WIDE_REGEX=1 make make install Warnings: 1) there is a large performance penalty if you build dbacl this way, which shows up whenever you use regular expressions. Only build this way if you need correct regular expressions in a multibyte environment which isn't 8-bit clean.
2) On some systems (e.g. BSD family), wide character functions are not supported. The configure script will detect this and disable full internationalization in this case. As a side effect, HTML entities won't be converted into characters, which breaks some regression tests when rinning make check. This is harmless. 3) The mailinspect command uses the slang library for interactive mode. If the headers cannot be found in /usr/include or /usr/include/slang, then compilation will skip interactive mode. OTHER DEPENDENCIES The main filter programs dbacl and bayesol have no special dependencies, and can always be compiled. mailinspect uses the readline and slang libraries for screen management in interactive mode. The configure script will check for these libraries and if it can't find them, mailinspect will be compiled without interactive support. mail{cross,toe,foot} are bash shell scripts which call awk and formail at various points. They will test for the existence of these programs in your path and refuse to run if it can't find them. The testsuite functionality is partially implemented by the above scripts, and partially by wrapper scripts for the various email classifiers used. It is imperative that the scripts follow the interface described in the mailcross.testsuite man page. RUNNING There is a tutorial which you can read with any web browser, point it to the file tutorial.html. For command line options and examples of possible use, type after installation: man dbacl man bayesol man mailcross man mailinspect man mailtoe man mailfoot You can also find a technical description of the algorithms and statistics in the postscript files dbacl.ps and costs.ps UPGRADING FROM PREVIOUS VERSIONS For simplicity, dbacl's category files are version coded. If you have categories created by a previous version, simply relearn them with the current version. Every time a category is relearned, the file is rewritten from scratch in the correct format. The mailcross.testsuite command from version 1.5 has been removed, but the interface is unchanged. Any command which used to be of the form "mailcross.testsuite xxx yyy" is now of the form "mailcross testsuite xxx yyy". TUTORIAL SAMPLES The tutorial.html document comes with several sample text files: - sample{1,3,5}.txt are extracts from Mark Twain, Huckleberry Finn - sample{2,4}.txt are extracts from Aristotle's Rhetoric. AUTHOR Laird A. Breyer dbacl-1.14.1/THANKS000066400000000000000000000000001325773323600135570ustar00rootroot00000000000000dbacl-1.14.1/TREC/000077500000000000000000000000001325773323600134135ustar00rootroot00000000000000dbacl-1.14.1/TREC/Makefile.am000066400000000000000000000020471325773323600154520ustar00rootroot00000000000000datarootdir ?= $(prefix)/share documentationdir = $(pkgdatadir)/TREC documentation_DATA = initialize classify train finalize checkpoint restart \ audit-graph audit-scores \ basic-email verify-stderr OPTIONS README \ OPTIONS.adp-dir-d \ OPTIONS.adp-unif-d \ OPTIONS.bi-adp-unif-d \ OPTIONS.cef-dir-d \ OPTIONS.cef-unif-d \ OPTIONS.simple-d \ OPTIONS.simple-v \ OPTIONS.puretext-d \ OPTIONS.adp-u-d \ OPTIONS.bi-simple-d \ OPTIONS.TREC2005.1cefhuj \ OPTIONS.TREC2005.2adphu \ OPTIONS.TREC2005.3adphd \ OPTIONS.TREC2005.4adp \ TREC2005.txt shutupdir = $(datarootdir) EXTRA_DIST = initialize classify train finalize checkpoint restart \ audit-graph audit-scores \ basic-email verify-stderr SFX OPTIONS README \ OPTIONS.adp-dir-d \ OPTIONS.adp-unif-d \ OPTIONS.bi-adp-unif-d \ OPTIONS.cef-dir-d \ OPTIONS.cef-unif-d \ OPTIONS.simple-d \ OPTIONS.simple-v \ OPTIONS.puretext-d \ OPTIONS.adp-u-d \ OPTIONS.bi-simple-d \ OPTIONS.TREC2005.1cefhuj \ OPTIONS.TREC2005.2adphu \ OPTIONS.TREC2005.3adphd \ OPTIONS.TREC2005.4adp \ TREC2005.txt dbacl-1.14.1/TREC/Makefile.in000066400000000000000000000321071325773323600154630ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = TREC DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(documentationdir)" DATA = $(documentation_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ documentationdir = $(pkgdatadir)/TREC documentation_DATA = initialize classify train finalize checkpoint restart \ audit-graph audit-scores \ basic-email verify-stderr OPTIONS README \ OPTIONS.adp-dir-d \ OPTIONS.adp-unif-d \ OPTIONS.bi-adp-unif-d \ OPTIONS.cef-dir-d \ OPTIONS.cef-unif-d \ OPTIONS.simple-d \ OPTIONS.simple-v \ OPTIONS.puretext-d \ OPTIONS.adp-u-d \ OPTIONS.bi-simple-d \ OPTIONS.TREC2005.1cefhuj \ OPTIONS.TREC2005.2adphu \ OPTIONS.TREC2005.3adphd \ OPTIONS.TREC2005.4adp \ TREC2005.txt shutupdir = $(datarootdir) EXTRA_DIST = initialize classify train finalize checkpoint restart \ audit-graph audit-scores \ basic-email verify-stderr SFX OPTIONS README \ OPTIONS.adp-dir-d \ OPTIONS.adp-unif-d \ OPTIONS.bi-adp-unif-d \ OPTIONS.cef-dir-d \ OPTIONS.cef-unif-d \ OPTIONS.simple-d \ OPTIONS.simple-v \ OPTIONS.puretext-d \ OPTIONS.adp-u-d \ OPTIONS.bi-simple-d \ OPTIONS.TREC2005.1cefhuj \ OPTIONS.TREC2005.2adphu \ OPTIONS.TREC2005.3adphd \ OPTIONS.TREC2005.4adp \ TREC2005.txt all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu TREC/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu TREC/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-documentationDATA: $(documentation_DATA) @$(NORMAL_INSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(documentationdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(documentationdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(documentationdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(documentationdir)" || exit $$?; \ done uninstall-documentationDATA: @$(NORMAL_UNINSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(documentationdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(documentationdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-documentationDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-documentationDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-documentationDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am \ uninstall-documentationDATA datarootdir ?= $(prefix)/share # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/TREC/OPTIONS000066400000000000000000000004251325773323600144720ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T email:xheaders -T html:links -T html:alt -L uniform -e cef2' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.TREC2005.1cefhuj000066400000000000000000000004051325773323600170570ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e cef -j' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.TREC2005.2adphu000066400000000000000000000004021325773323600167120ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.TREC2005.3adphd000066400000000000000000000004041325773323600166740ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L dirichlet -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.TREC2005.4adp000066400000000000000000000003301325773323600163570ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:noheaders -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.adp-dir-d000066400000000000000000000004041325773323600162270ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L dirichlet -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.adp-u-d000066400000000000000000000004011325773323600157120ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e adp' DBACL_COPTS='-U' DBACL_CHAM='ham[ ]*#\([^%]*\)' DBACL_CSPAM='spam[ ]*#\([^%]*\)' DBACL_SGN='-' dbacl-1.14.1/TREC/OPTIONS.adp-unif-d000066400000000000000000000004021325773323600164100ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.bi-adp-unif-d000066400000000000000000000003241325773323600170030ustar00rootroot00000000000000DBACL_LOPTS='-H 25 -1 -w 2 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.bi-simple-d000066400000000000000000000002721325773323600165730ustar00rootroot00000000000000DBACL_LOPTS='-H 25 -0 -w 2 -T email -T email:headers -T email:theaders -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.cef-dir-d000066400000000000000000000004071325773323600162230ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L dirichlet -e cef -j' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.cef-unif-d000066400000000000000000000004051325773323600164040ustar00rootroot00000000000000# these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e cef -j' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.puretext-d000066400000000000000000000002021325773323600165630ustar00rootroot00000000000000DBACL_LOPTS='-H 25 -1 -L uniform' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.simple-d000066400000000000000000000002001325773323600161720ustar00rootroot00000000000000DBACL_LOPTS='-H 25 -1 -T email' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/OPTIONS.simple-v000066400000000000000000000001771325773323600162310ustar00rootroot00000000000000DBACL_LOPTS='-H 25 -1 -T email' DBACL_COPTS='-n' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' dbacl-1.14.1/TREC/README000066400000000000000000000116351325773323600143010ustar00rootroot00000000000000DBACL and TREC 2005 This note explains how to use dbacl with the TREC 2005 Spam Filter Evaluation Toolkit (or spamjig for short). The spamjig is a system you can install to test and compare several spam filters with either public data or your own private data. It is/was developed as part of the NIST TREC 2005 conference. The TREC Spam Filter Evalutation Toolkit can be downloaded from the following location: http://plg.uwaterloo.ca/~trlynam/spamjig/ The spamjig has a similar purpose as dbacl's mailcross testsuite commands (see the man page for mailcross(1)), but uses a different methodology with a possibly different selection of open and closed source spam filters, and may be more up to date than the mailcross wrappers for some filters. This README file only covers the spamjig aspects directly related to dbacl, please refer to the spamjig's documentation for other installation and usage instructions. If you have downloaded dbacl as part of the spamjig, then you already have a self extracting archive, named something like this: dbacl-1.9.1.TREC.sfx.sh In that case, you can skip the next section. Otherwise, you will have to create the file above from scratch, as explained below. PREPARING THE DBACL SELF-EXTRACTING SHELL SCRIPT The spamjig expects dbacl to come as a self-extracting shell script. To create this script from the normal dbacl-1.xxx.tar.gz is very easy. Suppose you have downloaded the file dbacl-1.9.1.tar.gz, then you simply type tar xfz dbacl-1.9.1.tar.gz cd dbacl-1.9.1 ./configure && make trec This will automatically create a self-extracting script named dbacl-1.9.1.TREC.sfx.sh and place it into the dbacl-1.9.1 directory. USING THE SELF-EXTRACTING SCRIPT WITH THE SPAMJIG To use the spamjig with a self extracting archive, first create a directory where you would like to run the spamjig test. Normally, this is a subdirectory of the spamjig working directory itself. Next, you should copy the file dbacl-1.xxx.TREC.sfx.sh into your chosen working directory, and type from within that directory ./dbacl-1.xxx.TREC.sfx.sh You will obtain a list of instructions as well as a set of possible optional parameters. Follow these instructions to create (in the current working directory) all the necessary programs and scripts. If something goes wrong, it should be printed on your terminal, so please read the messages. Upon success, you will have several scripts named initialize, classify, train, finalize, in the same directory containing the self extracting archive. These scripts are used by the spamjig, consult the spamjig documentation for details. Note: The self extracting archive checks for a local file named OPTIONS.default. If this file is found in the current directory, then you will not see instructions, but instead all the test jig files will be extracted directly. DBACL VARIANTS The dbacl program has several switches and options which can result in different classification performance. The spamjig scripts supplied with dbacl are designed to allow you to experiment with different settings if you like. The switches and settings used for a simulation are defined in a file called OPTIONS which exists in the share/dbacl/TREC subdirectory, ie the same directory containing this README file. This file is recreated every time initialize is called, so you cannot make changes to it. To change the simulation options, you have two choices: you can either select a predefined OPTIONS file among the variants which are bundled with dbacl, or you can write your own. PREDEFINED VARIANTS The initialize script accepts the name of an OPTIONS file on the command line, eg initialize OPTIONS.simple Here OPTIONS.simple is one among the OPTIONS.* files which are found in the dbacl-xxx/TREC/ source directory, where the program was compiled. Possible options are more or less as follows: OPTIONS.simple-d OPTIONS.simple-v OPTIONS.adp-unif-d OPTIONS.cef-unif-d OPTIONS.adp-dir-d OPTIONS.cef-dir-d OPTIONS.bi-adp-unif-d Remember that initialize will recreate the share/dbacl/TREC/OPTIONS file by overwriting it with one of the above. Each OPTIONS.* file is a text file and contains descriptions of the algorithmic choices it mandates and other relevant information. For the actual TREC conference, a specially named set of OPTIONS.* files exist, but dbacl is packaged with several others for your convenience. CUSTOM VARIANTS You can also create your own OPTIONS.xxx file if the predefined variants are not to your liking. To do so, simply create a file named OPTIONS.custom and place it in the same directory which contains the self extracting archive (ie where also the initialize script is created). Then you can type initialize OPTIONS.custom and the initialize script will look for the file OPTIONS.custom first among its predefined variants, and then in the current working directory if not found. The OPTIONS.custom file will overwrite the share/dbacl/TREC/OPTIONS file, and the simulation will use your custom settings. dbacl-1.14.1/TREC/SFX000066400000000000000000000121601325773323600137760ustar00rootroot00000000000000#!/bin/sh # This is a self extracting archive designed for the TREC 2005 spam # filtering track. It deletes several directories and files in the current # working dir, which will then be replaced. # # We construct the archive by cat SFX dbacl-xxx.tar.gz > dbacl-xxx.sfx # # This script accepts one optional command line argument. If present, # we check whether a corresponding file named OPTIONS.zzz is present # in the TREC subdirectory, where zzz is the argument value. This # file is used to overwrite the OPTIONS file containing the switches # for the simulation. In this way, we can self-install several # variations of the classifier. # # If no options are given, we use OPTIONS.default if it exists in the # current working directory. Each time a command line option is presented, # the OPTIONS.default file is (re)created automatically from that argument. # # If no options are give, and no OPTIONS.default exists in the current # working directory, then we present a help message and a list of # possible OPTIONS. # # NAME=`basename $0 .TREC.sfx.sh` W=$PWD SKIP=`grep -a -n -m 1 '^__ARCHIVE_FOLLOWS__' $0 | sed 's/:.*//'` function usage() { echo "Usage: $0 [XXX]" echo "" echo "Welcome to the dbacl TREC/spam evaluation package." echo "This script unpacks automatically into the current directory" echo "a fresh copy of all the files and programs expected by the" echo "TREC 2005 spamjig (spam filter evaluation system), such as the" echo "initialize script." echo "" echo "If you are seeing this message, then you have yet to select" echo "which algorithms and runtime options are to be tested in this" echo "instance of the spamjig test run. All you have to do is rerun" echo "the present script with the appropriate value of XXX chosen" echo "from the list below. This will copy a file named OPTIONS.default" echo "into the current directory which will lock your chosen options" echo "for all required scripts." echo "" echo "You can change options later by rerunning this script with" echo "another value of XXX, or even edit the OPTIONS.default file" echo "directly if you know what you are doing." echo "" echo "Possible values for XXX:" tail -n +`expr $SKIP + 1` $0 | gunzip -c | tar t | grep 'TREC/OPTIONS.' | sed 's/^.*OPTIONS.//' } function warn_fs { echo "################################################################" echo "# A ramdisk speeds up simulation and protects your disks. #" echo "# If you haven't done so already, use a ramdisk! #" echo "# % mkdir /path/to/ramdisk #" echo "# % mount tmpfs /path/to/ramdisk -t tmpfs -o size=150m #" echo "# % cp OPTTIONS.default dbacl-xxx.TREC.sfx.sh /path/to/ramdisk #" echo "# % cd /path/to/ramdisk #" echo "# % ./dbacl-xxx.TREC.sfx.sh #" echo "# (run simulation, copy results file away from ramdisk) #" echo "# % umount /path/to/ramdisk #" echo "################################################################" echo "Press Ctrl-C to abort, or Enter to proceed." read } OPTARG=$1 if [ -z $OPTARG ]; then OPTARG=default if [ ! -e "$W/OPTIONS.$OPTARG" ]; then usage exit 1 fi fi echo "" echo "Installing $NAME - please wait...." echo "" warn_fs rm -rf "$W/$NAME" tail -n +`expr $SKIP + 1` $0 | gunzip -c | tar x if [ -d "$W/$NAME" ]; then if [ -n $OPTARG ]; then if [ -e "$W/$NAME/TREC/OPTIONS.$OPTARG" ]; then cat "$W/$NAME/TREC/OPTIONS.$OPTARG" > "$W/$NAME/TREC/OPTIONS" cp -f "$W/$NAME/TREC/OPTIONS.$OPTARG" "$W/OPTIONS.default" else echo "No OPTIONS.$OPTARG in $W/$NAME/TREC, trying working directory..." if [ -e "$W/OPTIONS.$OPTARG" ]; then echo "Found $W/OPTIONS.$OPTARG." cat "$W/OPTIONS.$OPTARG" > "$W/$NAME/TREC/OPTIONS" else echo "Could not find $W/OPTIONS.$OPTARG, using defaults." fi fi fi echo "Installing these options:" echo "---------" cat $W/$NAME/TREC/OPTIONS echo "---------" cd "$W/$NAME" ./configure "--prefix=$W" && make && make check && make install if [ -x "$W/bin/dbacl" ]; then for f in initialize finalize classify train checkpoint restart; do rm -f "$W/$f" && cp "$W/share/dbacl/TREC/$f" "$W/$f" chmod u+x "$W/$f" done else echo "Installation did NOT complete successfully." exit 1 fi cd "$W" rm -rf "$W/db" && mkdir "$W/db" rm -f "$W/stderr.log" . $W/share/dbacl/TREC/OPTIONS rm -rf "$W/audit" && mkdir "$W/audit" if [ -f "$W/share/dbacl/TREC/$AUDITCOMMAND" ]; then cp "$W/share/dbacl/TREC/$AUDITCOMMAND" "$W/$AUDITCOMMAND" chmod u+x "$W/$AUDITCOMMAND" "$W/$AUDITCOMMAND" initialize "$W" fi "$W/train" ham "$W/share/dbacl/TREC/basic-email" "$W/train" spam "$W/share/dbacl/TREC/basic-email" if ! cmp -s "$W/stderr.log" "$W/share/dbacl/TREC/verify-stderr" ; then echo "Basic learning failed. See stderr.log below:" echo "---" cat "$W/stderr.log" exit 1 fi else echo "There was a problem while extracting the archive." exit 1 fi echo "Done!" exit 0 # no extra characters allowed after this line! __ARCHIVE_FOLLOWS__ dbacl-1.14.1/TREC/TREC2005.txt000066400000000000000000000051011325773323600152150ustar00rootroot00000000000000TREC 2005 / spam filtering track This is a description of the four dbacl filters that were submitted for the pilot run. Each filter is based on dbacl 1.11, and packaged as a standalong tar.gz file, containing the dbacl-1.11.TREC.sfx.sh script, this README, and an OPTIONS.default text file. To use this, simply unpack the archive and run the self extracting script in the directory containing the OPTIONS.default file. This will unpack the initialize and classify scripts. Then you can run the spamjig scripts to perform all the remaining work. dbacl needs a standard gcc build environment to compile but no special libraries. -------------------------- DESCRIPTION OF PILOT RUNS -------------------------- breyerSPAMp1cefhuj.tar.gz This filter tests the cef tokenizer with full standard header analysis and uniform reference measure, case sensitive tokens. breyerSPAMp2adphu.tar.gz This filter tests the adp tokenizer with full standard header analysis and uniform reference measure, lowercase tokens. breyerSPAMp3adphd.tar.gz This filter tests the adp tokenizer with full standard header analysis and dirichlet reference measure, lowercase tokens. breyerSPAMp4adp.tar.gz This filter tests the adp tokenizer with only Subject analysis, uniform reference measure, lowercase tokens. ==> OPTIONS.1cefhuj <== # these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e cef -j' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' ==> OPTIONS.2adphu <== # these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' ==> OPTIONS.3adphd <== # these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:headers -T email:theaders -T html:links -T html:alt -L dirichlet -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' ==> OPTIONS.4adp <== # these settings are interesting for the SA corpus DBACL_LOPTS='-H 25 -1 -T email -T email:noheaders -L uniform -e adp' DBACL_COPTS='-nv' DBACL_CHAM='ham[ ]*\([^ ]*\)' DBACL_CSPAM='.* spam[ ]*\([^ ]*\)' DBACL_SGN='' ---------------------------- DESCRIPTION OF OFFICIAL RUNS ---------------------------- The enron pilot run was not very useful as a way of choosing interesting options for the official run, so the pilot packages will be repeated as-is. dbacl-1.14.1/TREC/audit-graph000066400000000000000000000056121325773323600155470ustar00rootroot00000000000000#!/bin/sh # builds an audit file audit/index.html with graphical displays of the scores # initialize: $2 is working dir # train: $2 is correct class $3 is message file # finalize: . ./share/dbacl/TREC/OPTIONS printheader() { SOPT=`cat "$1/share/dbacl/TREC/OPTIONS"` cat > "$1/audit/index.html" < Simulation Audit

Simulation options:

$SOPT

EOF1 } printfooter() { FP=`cat ./audit/scores | grep 'ham spam' | wc -l` FN=`cat ./audit/scores | grep 'spam ham' | wc -l` TM=`cat ./audit/scores | wc -l` cat >> ./audit/index.html <

False positives = $FP
False negatives = $FN
Total messages = $TM EOF3 } printdata() { # preparations COUNT=`cat ./audit/COUNT` echo `expr $COUNT + 1` > ./audit/COUNT OUTFILE=`echo $2 | md5sum | sed 's/ .*$//'` VERDICT=`./bin/dbacl -m -UP -c ./db/spam -c ./db/ham $2 2>/dev/null` CLASSTYPE=`expr "$VERDICT" : '\(.*\) #'` FULLSCORES=`./bin/dbacl -m -vUP -c ./db/spam -c ./db/ham $2 2>/dev/null` FROM=`cat $2 | grep -m 1 '^From:' | sed 's/^.*.*$//' | tr '[:punct:]' '_'` SUBJECT=`cat $2 | grep -m 1 '^Subject:' | sed 's/\(.\{0,40\}\).*/\1/' | tr '[:punct:]' '_'` ./bin/dbacl -m -c ./db/spam -c ./db/ham $2 -UPd | grep '^ ' > "./audit/$OUTFILE.tmp" 2>/dev/null echo "# $1 $2" > "./audit/$OUTFILE.txt" ./bin/dbacl -m -c ./db/spam -c ./db/ham $2 -vPd >> "./audit/$OUTFILE.txt" 2>/dev/null VOCAB1=`echo $FULLSCORES | tr -s ' ' | cut -f11 -d' '` VOCAB2=`echo $FULLSCORES | tr -s ' ' | cut -f22 -d' '` # graphical stuff cat > ./audit/cmd.gnuplot </dev/null if [ "$1" != "$CLASSTYPE" ]; then convert -quiet -negate "./audit/$OUTFILE.png" "./audit/$OUTFILE.png.neg" 2>/dev/null mv "./audit/$OUTFILE.png.neg" "./audit/$OUTFILE.png" fi convert -quiet -thumbnail 50x50 "./audit/$OUTFILE.png" "./audit/$OUTFILE.thumb.png" 2>/dev/null # output table row if [ -n "$FULLSCORES" ]; then echo "$1 $VERDICT $FULLSCORES" >> "./audit/scores" # note keep table row on a single line, then it is easy to grep and filter cat >> "./audit/index.html" <

EOF4 fi # clean up rm -f "./audit/$OUTFILE.tmp" } case "$1" in initialize) printheader "$2" echo "0" > "$2/audit/COUNT" ;; train) printdata "$2" "$3" ;; finalize) printfooter ;; esac dbacl-1.14.1/TREC/audit-scores000066400000000000000000000033751325773323600157500ustar00rootroot00000000000000#!/bin/sh # builds a list of extra scores in the audit directory. # initialize: $2 is working dir # train: $2 is correct class $3 is message file # finalize: . ./share/dbacl/TREC/OPTIONS printheader() { SOPT=`cat "$1/share/dbacl/TREC/OPTIONS"` cat > "$1/audit/index.html" < Simulation Audit

Simulation options:

$SOPT

$COUNT$1$VERDICT$VOCAB1 $VOCAB2$FROM
EOF1 cat > "$1/audit/scores" <> ./audit/index.html <

False positives = $FP
False negatives = $FN
Total messages = $TM EOF3 } printdata() { # preparations COUNT=`cat ./audit/COUNT` echo `expr $COUNT + 1` > ./audit/COUNT OUTFILE=`echo $2 | md5sum | sed 's/ .*$//'` VERDICT=`./bin/dbacl -m -U -c ./db/spam -c ./db/ham $2 2>/dev/null` CLASSTYPE=`expr "$VERDICT" : '\(.*\) #'` FULLSCORES=`./bin/dbacl -m -vU -c ./db/spam -c ./db/ham $2 2>/dev/null` FROM=`cat $2 | grep -m 1 '^From:' | sed 's/^.*.*$//'` if [ -n "$FULLSCORES" ]; then echo "$1 $VERDICT $FULLSCORES" >> "./audit/scores" # output table row # note keep table row on a single line, then it is easy to grep and filter cat >> "./audit/index.html" <

EOF4 fi } case "$1" in initialize) printheader "$2" echo "0" > "$2/audit/COUNT" ;; train) printdata "$2" "$3" ;; finalize) printfooter ;; esac dbacl-1.14.1/TREC/basic-email000066400000000000000000000002261325773323600155040ustar00rootroot00000000000000From nobody@localhost Wed Jan 19 04:34:40 2003 Date: Wed, 19 Jan 2003 04:33:48 -0500 (EST) From: nobody@localhost To: nobody@localhost Subject: none dbacl-1.14.1/TREC/checkpoint000066400000000000000000000002351325773323600154650ustar00rootroot00000000000000#!/bin/sh . ./share/dbacl/TREC/OPTIONS if [ -n "$1" ]; then cp -fpr ./db "./check-$1" exit 0 fi echo "checkpoint $1 command failed" >> ./stderr.log exit 1dbacl-1.14.1/TREC/classify000077500000000000000000000005511325773323600151570ustar00rootroot00000000000000#!/bin/sh . ./share/dbacl/TREC/OPTIONS line=`./bin/dbacl -m $DBACL_COPTS -c ./db/ham -c ./db/spam $1 2>>stderr.log` hscore=`expr "$line" : "$DBACL_CHAM" \| 0` sscore=`expr "$line" : "$DBACL_CSPAM" \| 0` score=`echo "$DBACL_SGN ($hscore - $sscore)" | bc` case $score in 0) class='ham' ;; -*) class='ham' ;; *) class='spam' ;; esac echo class=$class score=$score dbacl-1.14.1/TREC/finalize000066400000000000000000000011351325773323600151370ustar00rootroot00000000000000#!/bin/sh W=$PWD . $W/share/dbacl/TREC/OPTIONS if [ -n "$AUDITCOMMAND" ]; then "$AUDITCOMMAND" finalize fi if ! cmp -s $W/stderr.log $W/share/dbacl/TREC/verify-stderr ; then echo "There were errors during the simulation. See stderr.log below:" cat $W/stderr.log exit 1 fi echo "The simulation appears to have run successfully:" for f in ham spam ; do DOCS=`head -3 $W/db/$f | tail -1 | sed 's/.*documents //'` TOKS=`head -3 $W/db/$f | tail -1 | sed 's/.*_features //;s/ documents.*//'` SIZ=`du -h $W/db/$f` echo -e "$SIZ\thas learned $DOCS documents,\t$TOKS tokens." done exit 0dbacl-1.14.1/TREC/initialize000077500000000000000000000020421325773323600155000ustar00rootroot00000000000000#!/bin/bash # # This script searches the current directory for a self extracting # dbacl/TREC archive and runs it. It is only a stub for the self extracting archive. # This script accepts several command line arguments to change its behaviour. # If no options are given, sensible defaults are used. # # initialize [OPTIONS.xxx] [VERSION.yyy] # # VERSION.yyy this option forces the extraction of dbacl-xxx.TREC.sfx.sh # OPTIONS.xxx this option passes the xxx option to the self extracting script OPT="" SFX=`ls dbacl-*.TREC.sfx.sh | sort | head -1` for i in $@ ; do case $i in OPTIONS.*) OPT=`echo $i | sed s/^OPTIONS.//` echo "Passing option $OPT" ;; VERSION.*) V=`echo $i | sed s/^VERSION.//` SFX="dbacl-$V.TREC.sfx.sh" ;; esac done if [ -f $SFX ]; then sh "$SFX" "$OPT" else echo "The file $SFX does not exist :-(" exit 1 fi # return success if dbacl was properly installed # (ie compiled version is identical to installed version) EXE=`ls dbacl-*/src/dbacl | head -1` cmp $EXE "bin/dbacl" dbacl-1.14.1/TREC/restart000066400000000000000000000002571325773323600150260ustar00rootroot00000000000000#!/bin/sh . ./share/dbacl/TREC/OPTIONS if [ -d "./check-$1" ]; then rm -rf ./db cp -fpr "./check-$1" ./db exit 0 fi echo "restart $1 command failed" >> ./stderr.log exit 1dbacl-1.14.1/TREC/train000077500000000000000000000004351325773323600144600ustar00rootroot00000000000000#!/bin/sh # the category files must start with '.' otherwise environment vars # such as DBACL_PATH are consulted . ./share/dbacl/TREC/OPTIONS if [ -n "$AUDITCOMMAND" ]; then "$AUDITCOMMAND" train "$1" "$2" fi ./bin/dbacl $DBACL_LOPTS -m -l ./db/$1 -o ./db/$1.onl $2 2>>stderr.log dbacl-1.14.1/TREC/verify-stderr000066400000000000000000000001551325773323600161440ustar00rootroot00000000000000dbacl:warning: could not mmap ./db/ham, trying stdio. dbacl:warning: could not mmap ./db/spam, trying stdio. dbacl-1.14.1/acinclude.m4000066400000000000000000000020061325773323600150450ustar00rootroot00000000000000dnl @synopsis AX_FUNC_POSIX_MEMALIGN dnl dnl Some versions of posix_memalign (notably glibc 2.2.5) incorrectly dnl apply their power-of-two check to the size argument, not the alignment dnl argument. AX_FUNC_POSIX_MEMALIGN defines HAVE_POSIX_MEMALIGN if the dnl power-of-two check is correctly applied to the alignment argument. dnl dnl @version $Id: $ dnl @author Scott Pakin dnl AC_DEFUN([AX_FUNC_POSIX_MEMALIGN], [AC_CACHE_CHECK([for working posix_memalign], [ax_cv_func_posix_memalign_works], [AC_TRY_RUN([ #include int main () { void *buffer; /* Some versions of glibc incorrectly perform the alignment check on * the size word. */ exit (posix_memalign (&buffer, sizeof(void *), 123) != 0); } ], [ax_cv_func_posix_memalign_works=yes], [ax_cv_func_posix_memalign_works=no], [ax_cv_func_posix_memalign_works=no])]) if test "$ax_cv_func_posix_memalign_works" = "yes" ; then AC_DEFINE([HAVE_POSIX_MEMALIGN], [1], [Define to 1 if `posix_memalign' works.]) fi ]) dbacl-1.14.1/aclocal.m4000066400000000000000000001062331325773323600145230ustar00rootroot00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], [AC_PREREQ(2.50)dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) dbacl-1.14.1/bootstrap000077500000000000000000000002141325773323600146160ustar00rootroot00000000000000#!/bin/sh # run this if the auto scripts start complaining or are missing entirely. aclocal \ && automake --gnu --add-missing \ && autoconfdbacl-1.14.1/config/000077500000000000000000000000001325773323600141235ustar00rootroot00000000000000dbacl-1.14.1/config/config.guess000077500000000000000000001267301325773323600164540ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011 Free Software Foundation, Inc. timestamp='2011-05-11' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-tilera-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dbacl-1.14.1/config/config.sub000077500000000000000000001046061325773323600161150ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011 Free Software Foundation, Inc. timestamp='2011-03-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile-* | tilegx-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; # This must be matched before tile*. tilegx*) basic_machine=tilegx-unknown os=-linux-gnu ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dbacl-1.14.1/config/depcomp000077500000000000000000000442671325773323600155150ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dbacl-1.14.1/config/install-sh000077500000000000000000000325371325773323600161410ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dbacl-1.14.1/config/missing000077500000000000000000000262331325773323600155300ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dbacl-1.14.1/config/mkinstalldirs000077500000000000000000000067221325773323600167400ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dbacl-1.14.1/config/ylwrap000077500000000000000000000140431325773323600153710ustar00rootroot00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, # 2007, 2009 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case "$1" in '') echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input="$1" shift case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac pairlist= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi pairlist="$pairlist $1" shift done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then set X $pairlist shift first=yes # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot="no" if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot="yes" fi # The directory holding the input. input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` # Quote $INPUT_DIR so we can use it in a regexp. # FIXME: really we should care about more than `.' and `\'. input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` while test "$#" -ne 0; do from="$1" # Handle y_tab.c and y_tab.h output by DOS if test $y_tab_nodot = "yes"; then if test $from = "y.tab.c"; then from="y_tab.c" else if test $from = "y.tab.h"; then from="y_tab.h" fi fi fi if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend `../'. case "$2" in [\\/]* | ?:[\\/]*) target="$2";; *) target="../$2";; esac # We do not want to overwrite a header file if it hasn't # changed. This avoid useless recompilations. However the # parser itself (the first file) should always be updated, # because it is the destination of the .y.c rule in the # Makefile. Divert the output of all other files to a temporary # file so we can compare them to existing versions. if test $first = no; then realtarget="$target" target="tmp-`echo $target | sed s/.*[\\/]//g`" fi # Edit out `#line' or `#' directives. # # We don't want the resulting debug information to point at # an absolute srcdir; it is better for it to just mention the # .y file with no path. # # We want to use the real output file name, not yy.lex.c for # instance. # # We want the include guards to be adjusted too. FROM=`echo "$from" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` TARGET=`echo "$2" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? # Check whether header files must be updated. if test $first = no; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$2" is unchanged rm -f "$target" else echo updating "$2" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the first file. This # is a blatant hack to let us support using "yacc -d". If -d # is not specified, we don't want an error when the header # file is "missing". if test $first = yes; then ret=1 fi fi shift shift first=no done else ret=$? fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dbacl-1.14.1/configure000077500000000000000000006325771325773323600146110ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for dbacl 1.14.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and laird@lbreyer.com $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dbacl' PACKAGE_TARNAME='dbacl' PACKAGE_VERSION='1.14.1' PACKAGE_STRING='dbacl 1.14.1' PACKAGE_BUGREPORT='laird@lbreyer.com' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS INCLUDESINTER LDADDINTER YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX CFLAGSIEEE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP YACC YFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures dbacl 1.14.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/dbacl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of dbacl 1.14.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF dbacl configure 1.14.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------- ## ## Report this to laird@lbreyer.com ## ## -------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by dbacl $as_me 1.14.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=dbacl VERSION=1.14.1 # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_config_headers="$ac_config_headers src/config.h" ## Checks for host information. CFLAGSIEEE="" case $host in alpha*-linux*) $as_echo "#define OS_LINUX /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: using -mieee compilation flag to allow divide by zero." >&5 $as_echo "$as_me: using -mieee compilation flag to allow divide by zero." >&6;} CFLAGSIEEE="-mieee" ;; *-*-linux*) $as_echo "#define OS_LINUX /**/" >>confdefs.h ;; *-*-sunos*) $as_echo "#define OS_SUN /**/" >>confdefs.h ;; *-*-solaris*) $as_echo "#define OS_SUN /**/" >>confdefs.h ;; *-*-darwin*) $as_echo "#define OS_DARWIN /**/" >>confdefs.h ;; *-*-hpux*) $as_echo "#define OS_HPUX /**/" >>confdefs.h ;; *-*-*) $as_echo "#define OS_UNKNOWN /**/" >>confdefs.h ;; esac cat >>confdefs.h <<_ACEOF #define TARGETCPU "$target" _ACEOF ## Checks for programs ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ## Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log in -lm" >&5 $as_echo_n "checking for log in -lm... " >&6; } if ${ac_cv_lib_m_log+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char log (); int main () { return log (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_log=yes else ac_cv_lib_m_log=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_log" >&5 $as_echo "$ac_cv_lib_m_log" >&6; } if test "x$ac_cv_lib_m_log" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi LDADDINTER="" INCLUDESINTER="" # Decide if mailinspect will be interactive { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 $as_echo_n "checking for initscr in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_initscr=yes else ac_cv_lib_ncurses_initscr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 $as_echo "$ac_cv_lib_ncurses_initscr" >&6; } if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } if ${ac_cv_lib_readline_readline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else ac_cv_lib_readline_readline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SLsmg_init_smg in -lslang" >&5 $as_echo_n "checking for SLsmg_init_smg in -lslang... " >&6; } if ${ac_cv_lib_slang_SLsmg_init_smg+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lslang $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SLsmg_init_smg (); int main () { return SLsmg_init_smg (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_slang_SLsmg_init_smg=yes else ac_cv_lib_slang_SLsmg_init_smg=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_slang_SLsmg_init_smg" >&5 $as_echo "$ac_cv_lib_slang_SLsmg_init_smg" >&6; } if test "x$ac_cv_lib_slang_SLsmg_init_smg" = xyes; then : LDADDINTER="-lslang -lreadline -lncurses" INCLUDESINTER="-I/usr/include/slang" $as_echo "#define HAVE_LIBNCURSES /**/" >>confdefs.h $as_echo "#define HAVE_LIBSLANG /**/" >>confdefs.h $as_echo "#define HAVE_LIBREADLINE /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libslang missing, disabling interactive mailinspect" >&5 $as_echo "$as_me: WARNING: libslang missing, disabling interactive mailinspect" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libreadline missing, disabling interactive mailinspect" >&5 $as_echo "$as_me: WARNING: libreadline missing, disabling interactive mailinspect" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libncurses missing (needed by readline), disabling interactive mailinspect" >&5 $as_echo "$as_me: WARNING: libncurses missing (needed by readline), disabling interactive mailinspect" >&2;} fi ## Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in features.h langinfo.h unistd.h sys/mman.h mman.h netinet/in.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in wchar.h wctype.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No wide character headers, disabling full internationalization." >&5 $as_echo "$as_me: WARNING: No wide character headers, disabling full internationalization." >&2;} fi done ## Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ## Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5 $as_echo_n "checking whether mbrtowc and mbstate_t are properly declared... " >&6; } if ${ac_cv_func_mbrtowc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { wchar_t wc; char const s[] = ""; size_t n = 1; mbstate_t state; return ! (sizeof state && (mbrtowc) (&wc, s, n, &state)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_mbrtowc=yes else ac_cv_func_mbrtowc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5 $as_echo "$ac_cv_func_mbrtowc" >&6; } if test $ac_cv_func_mbrtowc = yes; then $as_echo "#define HAVE_MBRTOWC 1" >>confdefs.h fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done if ${ac_cv_func_setvbuf_reversed+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_setvbuf_reversed=no fi for ac_func in getpagesize madvise sigaction do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ## the AX_FUNC_POSIX_MEMALIGN was downloaded from the AC archive, ## http://ac-archive.sourceforge.net/doc/acinclude.html and added ## to the acinclude.m4 file. After aclocal was run, it got put into aclocal.m4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working posix_memalign" >&5 $as_echo_n "checking for working posix_memalign... " >&6; } if ${ax_cv_func_posix_memalign_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_func_posix_memalign_works=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { void *buffer; /* Some versions of glibc incorrectly perform the alignment check on * the size word. */ exit (posix_memalign (&buffer, sizeof(void *), 123) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_func_posix_memalign_works=yes else ax_cv_func_posix_memalign_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_func_posix_memalign_works" >&5 $as_echo "$ax_cv_func_posix_memalign_works" >&6; } if test "$ax_cv_func_posix_memalign_works" = "yes" ; then $as_echo "#define HAVE_POSIX_MEMALIGN 1" >>confdefs.h fi if test x$ac_cv_func_posix_memalign_works = xno; then for ac_func in memalign valloc do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF break fi done fi for ac_func in wcstol do : ac_fn_c_check_func "$LINENO" "wcstol" "ac_cv_func_wcstol" if test "x$ac_cv_func_wcstol" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WCSTOL 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Incomplete Unicode implementation, some HTML conversions may suffer." >&5 $as_echo "$as_me: WARNING: Incomplete Unicode implementation, some HTML conversions may suffer." >&2;} fi done ac_config_files="$ac_config_files Makefile doc/Makefile src/Makefile src/tests/Makefile man/Makefile ts/Makefile TREC/Makefile contrib/Makefile doc/chess/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by dbacl $as_me 1.14.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ dbacl config.status 1.14.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/tests/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "ts/Makefile") CONFIG_FILES="$CONFIG_FILES ts/Makefile" ;; "TREC/Makefile") CONFIG_FILES="$CONFIG_FILES TREC/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "doc/chess/Makefile") CONFIG_FILES="$CONFIG_FILES doc/chess/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi dbacl-1.14.1/configure.in000066400000000000000000000057261325773323600152010ustar00rootroot00000000000000AC_PREREQ(2.59) AC_INIT([dbacl],[1.14.1],[laird@lbreyer.com]) AC_CONFIG_AUX_DIR(config) AC_CANONICAL_SYSTEM AC_GNU_SOURCE AM_INIT_AUTOMAKE([dbacl],[1.14.1],[laird@lbreyer.com]) AM_CONFIG_HEADER(src/config.h) ## Checks for host information. AC_AIX AC_MINIX AC_SUBST(CFLAGSIEEE,[""]) case $host in alpha*-linux*) AC_DEFINE([OS_LINUX],[],[this is a Linux system]) AC_MSG_NOTICE([using -mieee compilation flag to allow divide by zero.]) AC_SUBST(CFLAGSIEEE,["-mieee"]) ;; *-*-linux*) AC_DEFINE([OS_LINUX],[],[this is a Linux system]) ;; *-*-sunos*) AC_DEFINE([OS_SUN],[],[this is a Sun system]) ;; *-*-solaris*) AC_DEFINE([OS_SUN],[],[this is a Sun system]) ;; *-*-darwin*) AC_DEFINE([OS_DARWIN],[],[this is a Mac system]) ;; *-*-hpux*) AC_DEFINE([OS_HPUX],[],[this is an HP-UX system]) ;; *-*-*) AC_DEFINE([OS_UNKNOWN],[],[this is an unrecognized system]) ;; esac AC_DEFINE_UNQUOTED([TARGETCPU],"$target",[identify processor if categories not portable]) ## Checks for programs AC_PROG_CC AC_PROG_INSTALL AM_PROG_LEX AC_PROG_YACC ## Checks for libraries. AC_CHECK_LIB([m],[log]) AC_SUBST(LDADDINTER,[""]) AC_SUBST(INCLUDESINTER,[""]) # Decide if mailinspect will be interactive AC_CHECK_LIB([ncurses],[initscr], [ AC_CHECK_LIB([readline],[readline], [ AC_CHECK_LIB([slang],[SLsmg_init_smg], [ AC_SUBST(LDADDINTER,["-lslang -lreadline -lncurses"]) AC_SUBST(INCLUDESINTER,["-I/usr/include/slang"]) AC_DEFINE([HAVE_LIBNCURSES], [], [ncurses needed for readline]) AC_DEFINE([HAVE_LIBSLANG], [], [slang needed for interactive mailinspect]) AC_DEFINE([HAVE_LIBREADLINE], [], [readline needed for interactive mailinspect]) ],[AC_MSG_WARN([libslang missing, disabling interactive mailinspect])]) ],[AC_MSG_WARN([libreadline missing, disabling interactive mailinspect])]) ],[AC_MSG_WARN([libncurses missing (needed by readline), disabling interactive mailinspect])]) ## Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([features.h langinfo.h unistd.h sys/mman.h mman.h netinet/in.h]) AC_CHECK_HEADERS([wchar.h wctype.h],, [ AC_MSG_WARN([No wide character headers, disabling full internationalization.]) ]) ## Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T ## Checks for library functions. AC_FUNC_MBRTOWC AC_FUNC_MMAP AC_FUNC_VPRINTF AC_FUNC_SETVBUF_REVERSED AC_CHECK_FUNCS([getpagesize madvise sigaction]) ## the AX_FUNC_POSIX_MEMALIGN was downloaded from the AC archive, ## http://ac-archive.sourceforge.net/doc/acinclude.html and added ## to the acinclude.m4 file. After aclocal was run, it got put into aclocal.m4 AX_FUNC_POSIX_MEMALIGN if test x$ac_cv_func_posix_memalign_works = xno; then AC_CHECK_FUNCS([memalign valloc],[break]) fi AC_CHECK_FUNCS([wcstol],, [ AC_MSG_WARN([Incomplete Unicode implementation, some HTML conversions may suffer.]) ]) AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile src/tests/Makefile man/Makefile ts/Makefile TREC/Makefile contrib/Makefile doc/chess/Makefile]) AC_OUTPUT dbacl-1.14.1/contrib/000077500000000000000000000000001325773323600143165ustar00rootroot00000000000000dbacl-1.14.1/contrib/Makefile.am000066400000000000000000000001211325773323600163440ustar00rootroot00000000000000EXTRA_DIST = README \ clint_adams-patch-dbacl-1.9.gz shutupdir = $(datarootdir) dbacl-1.14.1/contrib/Makefile.in000066400000000000000000000235031325773323600163660ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = contrib DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README \ clint_adams-patch-dbacl-1.9.gz shutupdir = $(datarootdir) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu contrib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/contrib/README000066400000000000000000000007671325773323600152100ustar00rootroot00000000000000DBACL/CONTRIB DIRECTORY This directory contains patches and code submitted by various people. Each patch is listed together with its copyright status and whether it was incorporated into the dbacl code. Please contact laird@lbreyer.com if the summary below is incorrect. Many thanks go to all contributors. clint_adams-patch-dbacl-1.9.gz Changes a few paths in the Makefiles and test scripts to allow more flexible program builds. Copyright is disclaimed. Has been incorporated in dbacl 1.10. dbacl-1.14.1/contrib/clint_adams-patch-dbacl-1.9.gz000066400000000000000000000063211325773323600216050ustar00rootroot00000000000000‹¸¸†Bclint_adams-patch-dbacl-1.9í\{sâFÿ{õ)º¼¾2.,Yo6ëø{K±]àMö*Î9B@±ÐIØ\¾ûõŒ$@<$±½•Ë® =¦{¦»ý=FŸ:WÓSƒtLÍ–¨Óhlhj€2È¥j^®Ê*¨²\ZÄ9¶x£yý*|·Äy"Ôˆe>‡â-­ÂÈ~°é“l:ÁÓFºþˆ”v&’¿±‰¥¢JJ±,É’r XT׬>u=‰ït ™6<™^_¸¹¾É}@Á¸ˆL,P•@HQÆ BX‡Lˆ#Zšé§Á‘¤ÓÁ¢XC:”4ã‘ØžîÍä’FðSY‘TE*¡Œrågáݼ€\(.dºÄÓû(©%%U* ïºÔ`Ü)CÆ5ížEDáÃÃÌÖG —gÊ Ås…ªœƒ¬‚Ê@¦Þ¾=œ5óUU0íGú@ _~´äu°Ï¨iÔJI}Ó,!±ˆ=êf¸U– b˜ºæCBÈ;Ô°ÝÀH12 PXï\y.èêšm£™ÑT* ‹hNµuQ•3ª‚)ä%EQ¥|á°*!ÁCuâº(<"+Ke¥œ+VÀ%º{¸nŒ‹Aæsýò4Z0×z²e4É!,.”¬%׬ݼ½YaM¹²$ v¸blÈÜ â]s|ëÇ7ŒÎ{gµš¬”d9_DGм#˜L)UUö‡ƒå¹#ÔÐj(lÕ§]K*|ÂÁª€i{pfhwe¬òàX Šö¨ó+ѽ*<1Êô¾ÐD¤´5 {6"þ/©ŠZRKÒ?ÏòùRétNí¡iˆøq\“ÚUP$Y¸ ¶‡‘%ÞN†(¿GÆÞñ·?€Þ×—xG®¨¹ºiNIk¦;¤®éñ>Lµ!´ xÖÃæ*4Gžw¬H©b _ÅÚùÙÅ¥ØÖ&nlê¹Cmÿ!´=ÍáéÖ5Ò…gÓq.‰ÝcùLÉWJŠp‰Ã`s!§ ÂÌ ¼>q “Òî÷ŒŽ¦[è–‘i ÙZÉuAÃSq=—y´†é ©3(vá`?šÍ:—ŽÌÚ%Li+8ˆiëÔR1–AE4Œ© BföŽ]G?nj¤kZDÒB6›‘,µžž‚¨–²þæôT€ú×ÛÖÙ}­Ñ¾…ЪŸÕšu`¬;Ôu%”œx”„»]J½éiÔNêŽla‰‡õ0ô©C\ÉÅä,À #¡_ :O’î‹&õùQ_ßíg.®›7Ëú!ˆµæù÷Ísõ€X¤°*d×ígP=´Ùáñ<9ø¤o0àZ=Å!ÙÚAÛ_>}j|­·Ñ†h<Ãl]òå¿§œj¨÷‰þpß¾þÒºà´ý!óuI›ªÓ3Рã¡è¡ NW/«*6àŽÊ÷õ¹ÅÊpsÖj×[³n–Ù`ä™–D1iÜüJìÁ£L_ŠE Ìw<³ÀtˆÙ©é`‘S©‡]ãà<†Ü|™†WJå¿ ¦³ú~æœïâÞåt¯9Û­7§»Ó½ÏþÃñ}×d<ÄÅ’å¡^¬ c\·‰ëW ½ƒ¡E<‚UÉÔ©Añë§³Æå=ïé#^(qN0`Á{CvÐ÷–¨YÞ¬¡£L£ ‹«ìûuÄ\÷¬ysYo\¡a\É+±\)*‘#5r”‹åáN€wÁˆD‹úRä¨ŒÜ «¢Â°â¿~°¼gå¤é›6a¥õz8Uâ¶Ç™Šc=ɸ îëW?4Z×WÍúËcìÜyãêãÌ% j×µF+rŽý”ùkç —èìcAÜA‡B6¾“‹/-äL’Ê/ xrÖÊ $‘‹Vãf'îv~ƒ†¾‚im]ÜEˆ˜JóUöd>çß¿L,ßäÃbÀªä¾ žÃàˆVpFG~ƒ_púµàˆÿ…}^ÍAl¨hƒøˆ'Ÿ0ÿZ¿Ù%îý?¦–ûóx“®RÙ‚¦±³–Zf ¾ñ­1x@Ñ`Ï3ëíç=6v†è} {l¶âàThÉ€Ó›Rõã*»²ÇóÄv¿–ìß̼2ŒÑ`0ñÖO<ô‰ff9Å}š)Ï!C8øÏ{èknÿ <a¡#OIg¯mŒNV¶ø‰ÚV Q¶Á#¥]£¢leäX·g$ÞçgÜá+GŠŠÏ7±¿d$f£x“,[¹ÆlÁ„˜µzˆ.üwÞsgÿ<çJ{ ¾ÄE1Ìnñr¬;‘xOËTYN-žoÕÛ_.o?î/€ƒ;Ý#$^ÄËœ7Ùüóto B°­r‘v‰¯âÆÀ¬eÛ <þÌ* œ)Õó É%B“K ´C`Xoòšé¹ Œ“rÕ8’ª°(+~mV^1JP†gš}¼a†ZMÿ\cû³ûA‡Žãm¾HÇoDÈÜôþæÿfZ´T»ã ¿úÒüøKXÎ÷–êùÞ´’û…üÞ5'xRy p€ÿÅ.Tؼv5¸áÔ{¼Cá•ÄxOÝîàŠ‚MžØý5@ýÎÔiØuu0׎§qüAë¤ò‘yÒ0YÊ~²”ãÝd­‰ã®jÑÖòÅ8DrÐÿ¥MH±¢ļbþÓl$¢ùÖ¾s6Ê·JåÜõ<)ò.ŽOÆ&êíƃ¡LŸk(Á)Ùóf-ùD ó¯ˆ!*µŠ«¹vS?G£4`„T[cÞ™‹cFòZhŒF[€±’i7X°äLœ„ë­¤ožåÂj Ö.A »Ü©õœoÇ =^ õ\]/@=~¬ÇÛƒú›àô6ÀÌÛ!f;(`S̼ÀÌÛ³ÖÝ`6÷°)³(íÖ)5|æ”XèŠo™TCe·-†õ­Ój šºÜê.*h)1DKߨêö`¯b}k°GŽ™jæ’=/ —!.o qŠ;Õ[Îks›‰íJ®Ý$âðí€D¸æŸ“•DÀ*)ãøp™vsÃzNÉ-ZÇ÷Ö¡¼‘ßéóBR‘!æ$©0äÚ%Êa—›ã¼žó¹Ñèö5Û¦¶˜0#Z ãwÌsþ«{¹Ä[¡™·«×ß:¿ÄU÷·ß’aî.ý:–ØÛõÈ?à7Ë}¸ÆÉÙÃî|¼‡…†¤'ø¡3%LËȸÏå}ŸËÿísß²×¼‚Ï-·$z{ 81ÏÍ…ÏóþsÁ׸‹6ÿ>ÍWöeù.gøH&ƒY‹öô ö^ý~áØ¢½ŒzøçA¤„ÜÙüÉÍÚâ¥ìN=Tåñë)sG(éŸ1Ò$=òKÊ$óDUÅÏ#JrYž÷O¿²˜^žeÆ6—â›sAØ'\WÌõ‘§Ê´¥ hs/¥q‰óH“Ï.…‘*û‘ú7¦ß¦þûôbYU{ñ¨.ò7±Ùª…b°hýq?xuÙ»U€›‹Ïõ‹ÍN/ðGÓXp‘Í{g9Êg<„¥Æúì–ĘR÷NZÝ;/ª{gA…Ž–NõU|é4WÒ¢®¼(êJ<%5ê«SêžuåEQW: *¤D}%_ÍÕÔÁ®¾l´« Q«¦÷õ¬i-|õec^]^5uÔ¯åL©ÊÀW_6òÕ…VÓÇþzÖ´Hí/ÿêB «©3ÀZN¾†wyyîüÒ|%_-TØ¢_¾4?XÌV“Ï-&ŸÒðÅäÁÂàKÖ+œóNụ1ü•ÁI«‡§ë„[$y­pYÎ*|­pY-—N‰ÊŸ-2´&âêeÈ-Ò%±u¶÷MW7lq&gIÖ-Qž[…¼¸ò8_ÃuÇJN®}ˆeÙ£OEœ…ØÑÚäØruògÓ—ëHšš=á<øK÷X7Ü$h  ¯ ‡¶dR3 0=ì÷˜°¸ 3á©oêý@vÆÇ„µMP jKpæúKñOwÀôÁËoS׬@ý#œ;ÛÐPÛÑ€À„ŽPWGÄÀäÓép‚Y¤ïq±Ùñeü>TÏ" #ûœ€ÀìÖð… „Df«:1>]fsö*¥Czšc¸Â|LIAôÆYCÍUsßæ—5æóG(ä_áËhqµÌ¾Þÿeb¾,¯û²FÔ4j±Š;ßø—5äœ"+³/k¤Öྫྷ‘F–-¿¬Q,_ÏÂ/k0G˜LÆ’˜¯*•U_ÖX( QÒ ¾¬‘Xd7+ JNÍ+,89¥¨.Tœ keBU~ÝJºZ†ç~æc±Àæäé‡=ŠÖ¼T¬ØUÍ:T­HU·þͦ 0¨}à1í$/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(documentationdir)" DATA = $(documentation_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = chess documentationdir = $(pkgdatadir)/doc documentation_DATA = dbacl.ps costs.ps tutorial.html email.html is_it_working.html \ sample1.txt sample2.txt sample3.txt sample4.txt sample5.txt sample6.txt \ toy.risk example1.risk example2.risk example3.risk \ prop.pl japanese.txt \ spam_chess.html EXTRA_DIST = dbacl.ps costs.ps tutorial.html email.html is_it_working.html \ sample1.txt sample2.txt sample3.txt sample4.txt sample5.txt sample6.txt \ toy.risk example1.risk example2.risk example3.risk \ prop.pl japanese.txt \ spam_chess.html all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-documentationDATA: $(documentation_DATA) @$(NORMAL_INSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(documentationdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(documentationdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(documentationdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(documentationdir)" || exit $$?; \ done uninstall-documentationDATA: @$(NORMAL_UNINSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(documentationdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(documentationdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-documentationDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-documentationDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am \ install-documentationDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-documentationDATA datarootdir ?= $(prefix)/share # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/doc/chess/000077500000000000000000000000001325773323600145305ustar00rootroot00000000000000dbacl-1.14.1/doc/chess/Makefile.am000066400000000000000000000006511325773323600165660ustar00rootroot00000000000000datarootdir ?= $(prefix)/share documentationdir = $(pkgdatadir)/doc/chess documentation_DATA = dce.sh \ csfpc1.png csfpc2.png csfpc3.png down.png spoiler.png \ dce-basic.sh dce-1.sh dce-2.sh dce-3.sh \ randomizer.awk renorm.awk combine_half_moves.sh EXTRA_DIST = dce.sh \ csfpc1.png csfpc2.png csfpc3.png down.png spoiler.png \ dce-basic.sh dce-1.sh dce-2.sh dce-3.sh \ randomizer.awk renorm.awk combine_half_moves.sh dbacl-1.14.1/doc/chess/Makefile.in000066400000000000000000000307211325773323600166000ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc/chess DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(documentationdir)" DATA = $(documentation_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ documentationdir = $(pkgdatadir)/doc/chess documentation_DATA = dce.sh \ csfpc1.png csfpc2.png csfpc3.png down.png spoiler.png \ dce-basic.sh dce-1.sh dce-2.sh dce-3.sh \ randomizer.awk renorm.awk combine_half_moves.sh EXTRA_DIST = dce.sh \ csfpc1.png csfpc2.png csfpc3.png down.png spoiler.png \ dce-basic.sh dce-1.sh dce-2.sh dce-3.sh \ randomizer.awk renorm.awk combine_half_moves.sh all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/chess/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/chess/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-documentationDATA: $(documentation_DATA) @$(NORMAL_INSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(documentationdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(documentationdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(documentationdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(documentationdir)" || exit $$?; \ done uninstall-documentationDATA: @$(NORMAL_UNINSTALL) @list='$(documentation_DATA)'; test -n "$(documentationdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(documentationdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(documentationdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-documentationDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-documentationDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-documentationDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am \ uninstall-documentationDATA datarootdir ?= $(prefix)/share # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/doc/chess/combine_half_moves.sh000077500000000000000000000001111325773323600206770ustar00rootroot00000000000000#!/bin/sh sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//' dbacl-1.14.1/doc/chess/csfpc1.png000066400000000000000000000071351325773323600164230ustar00rootroot00000000000000‰PNG  IHDR¿ «‘N pHYsaa¨?§itIMEÕ Џ—” üIDATxÚí½n9…[Â}û1˜`:´3 šdà 7wà|à fàPY,°!=Š6à,—ßêbûçv‚Ð÷Þ&»X<<,’ÝÍ›»‡» .Ó4}ýõ+޽¸ÿùþŽž~Â@/¿|ùC{ÞýõND­¹ÅÀ Ø`Ø'{B'§ùoKUÍáŠ:Ó^7îî^__<ýxm#ü*ÿŸ¦É*þ/ ØmBgaË´W‡O?îîîîæÙ#+`š¦ì4Mªôä̧Êäë't¶L{pöh¼SV†ß§6Ö.ÐYØjZ´íA{ÊÂ&es,M¿Q*A5“Ù„™©†„%Ϻ ›~<»öT ?Û³:È>*• ZgrÂ좶„³\÷¤=öB™=J%¨VŒœ°ÕÐ{ÎêÚ£ÕžRϕͱü¯×ž*{” 5½ÏXí©öïh]{öt)!`2$D{ö÷´”JPmÊÄ='Òž{d%ÆkˉÚsíس\Ü#ŒØÑæš™kÞB{†O¿¾2×|xí î–ÿÛRÅÿæäë'tö\Úc¨Œ^ê”J°ç„Ά=—Ù€ÂÝòœMüoKUÍ¡7ù† i¹3pg*°¬†zÜssssr¿,@A{ì°ØˆšËø1ÄÑåq5Ên%Y(¶-3ÏbÞYƒ»Ðº\yeVþ½êÿÖ ñ×ê—ƒÙ3Ä¿› ‹JïÄÚz}}u™ÖÁÍÍÍÆh-²f¬­~¹{ªz“Þ/€AŸB†Ùí;éE·t0´uYÝ 6JØ\qP iõWm'”L_º`Â=êëP'^=|¬~9°¦oþ‡}Å=?„Àbµž®ÚïdLM9´„OoÌ’`6,ë¢Q&çQ}Wh9—õ›¦³T ±alÜs’Éú‹²¥ØXø=[¶õV€¼aУ7#Øo½W¶Ÿï©Þg^ë;ø2¨º–Å©2@ɨ6$‚Y! º]­!¦Áò¢ò`ZQj5îIå$=hI…Ù0}Îé CF0—®*QWB·5¤\î*ʸ­ö¦;«Ç¶Ð°õø³þ„½÷\àx€=öØŽ0ßÃ}™í°ÀpöÜRgÚ¶ì0ÿ›á ªoA˜®ÿ=brïbaû5n¾aNþªÛRcæ°g {zßî#¼µSø5¾”Èœ\ÿª!سöèßIU=_þ5­o[rýkÎ`ÚƒöœX{²ÙݽkŸReѳöLÅË„÷«=Cªü$’6Y· ªÊCë×’=™öL— ·ÆS“b+ Uµ'ãÜ9ÙÓ»Ó”ð¶òL{2!/µGŸyëüÍØ3ÕÞð}ønKÐ}s7‹G÷(…M8cöœ­ [M{fÇ\GО“³g…¸§ª=×÷d=×y õÇ\W0ß356ï˜j—´¢æ3Ç=cç{„úf®íéæš«=]ûçÏææL>)¶Ô€=«jO×.òùšÜœÉ§¹-5:ö©NØv±°ýúúç§QmÉ_Õ/pi²‡~žÈÜ`€=ˆq!3ЄÂÍ1×þý7ÏÅþòÓ—üúwOÿüù_ذúFìÃñíÓ÷iš>|~ŽÃ÷<«öõ·w{¢If3̘me×u°HÏ%W•üQé/?Ö–§·ª¿èö^²Âʰ§´¸úÑ£Ff36l|_{ç¹z¬'[JÕÈf@ùqc®ç—Çç—ÇxŒî²»¤¬LâÉÔp\~“ž¯Ô'ul•WzòþáÉÙžé¹R«xûæ£>‡xòÛ7ã7ÊÆ×òN—¤®ûáó{=]ÒVþüò‹£ïÁ[×Ò+àI¥+üµ©eO°FÈTã¯ÔÑ©¡¡ i”Q'ËPO òB³Ô‰—-¯Nˆ¿ >É®••Bã„YOÊ®ù µ©ïC/½jé¡j‹é±ØK¨kª+2KÒšK=™‘µò¬Fm0½žô׿¥×>s_¦ÍÊ>jˆŸõ÷ Ñ®ej8ߤÇå¯ÃKx¬ôä,wý~ÛÅJEo1bµÅ} Sï†Qf̪Ù[Šåš÷~Ù#t+u¡žbµRã©­<¹†öTû×VÌ/°-“âÌe‹Qi4Õ&S*¶ìLYöº<¹Âè}ƒ;S«1¿2â t™¿4}¼ᢩÒLŠçÈ£ž0Í’÷NVÇÂKBÖfOê÷21¨wé—ÙNyÍÎsT«0% 9ñ'Ù˜Ö0bv¸žz2[&Ú+iÏêøÇ™rÝËí5h6ø0OÖiJ±êt°'ó(Ë#4ýÞy¹E‡³ýޙĆa£¡Ö2¬Ÿ÷Ÿzר…2k&ÇlÔIWªm.^W^+ˆÑ†êê#ÞêO×®«/­YåöSG.‚’@êèhÈ05ä_]%;¯ZÒŠ6RWj¼fX!*—Ó««¤Ù÷KÜÄ2üu)Ðe¡¦¶P—”R$eÌ:Àlè3uÞä4õ,¤ ôä¨Ú¼h\6v¬n¨°–Uò¯­a—ÇB›7Z—Žw‰¿Ž­”±bvO"Ëžêòãúw3*/½¡a.´Þ‚@о· ð46¤6T¿çi@`ì+FÍ­9.ÛδðÚør6ìÁ›Ûpë1×0EÑûDÄ Ô1ذ?ìÁz.@ÜöÏž²gµÝдmÜã·a~؃ Ä=Ä=Ä=€ž‹žëÈ=Ä=Ä=«Ç=›Ìæ®O ¿ {ðÃNêâÖi®ÞhÙ¬uä·a~ØO]÷€…ã ås4t^Z~ü6ìÁ»ª ´¬5æ …êþÿ=Û¾Sx  {ðîêíðLÐ ï™ žFÀ†Ôz.À˜ À{ìöØ`€=À{ì°Ø`€=öØì°ìØ`·ž ÷€Ý û9vÿþ ÙÞ³†Mÿö`ƒðÃ¥×\çþ ß>}/sè2z6 ¡Îü@ÏVŒ{üû3#?à‡>öø÷g(…±·Ë؃ ~Ã}ìñïÏõµÏ/Yàv6 {®ÔÄ=`­¸Ç¿?ÇÏï³ н¹ Cz®øívtÌ÷ø÷gÝj5%ë÷`àç~¸5S'^rÒ½ ½47ÍA¯íÁ†%¨s½~èè¹üû3#?ã‡[½ðxÎÑÐY>g6ŒžÃøáÖIU=a‘ÃrÂs~`Ì–sùƒŽ‘ƒGòƒŠ=þýüƒá=ØàÇÁü@Ïà™  ûT`ƒÝ†{®û‡§8áß¼óÛ§ïáÏiÓçü͆´àëß[Ò5GCÀ%œõWŸ¸"ckýiƒëm|W*B™©“Üà„Ô“½Jœú¿õqä|O™©Áݡńáàí›ÁhÃâpÈPn|­Æî)/ªo|íIë)”¢KŒ[ž &iìñ׿´æla–IZòØ}(+¬¼¯@®Âôî…Șpggø˜1IÓ›DKf¯.S'½¢ž@²'gíYu¶0Æ7U†jîI‹þªÚ­$PFØøôU˜2Fó½Ð?–í^9)—Q'+Å,RÖ ž¼‘6žjmê%ðbs˜æV¶sÔ²Ü*D)x­šKOêoH)œžR›sÝëPÆbzõŽW +¬—QBZaé±¾ ¥PŽQ”bl«M;{FyßIüØYh<bš´¾g5êžl£oW)ò¤‹ÏVÇ¢f·<ÕÛëiŽ—[)ªr³'¯ƒ=eZölèÐ Þc´㇩­Ëµª°ÁÚ^ý™·J!k^éÉì©ç|Ù¸ÇýzÅ\óôÚcÝMÿ—¥rÿÅÉÇ'Tv_Ú#¨ŒZêÄJ°æ„ÊÂNÞcñ {·<1gãþËR%s¨M¾`BeZÜ™ àÎT{€aHÇ=‡Ãaç~™,@ö`öØtˆšãøÑÆÑñq2ÊÎ%éÛÆ™'m# ®Bîr±[˜Yé#ô¤ÿs'¸_“_.¯=‡ÃaÀ¨-W`W—~Ý$¿T^Ý-|®dˆš»™ÎÙ·6ùe{íÈ€;öo€'KP›apûÎ0âV‰³­Óê.°VíD¥=DeøÕŸ´Õ¸f@Á‚šhÒÔjû#¾z‡þ‡uÅ=?’MGitmòÀ˜bì·édzuaÆIïÅ:*èÁ-†­ÈÍp(KÅ©øã÷GAjv3Yd¶3¿½*ëFïÙ¸­ÇJ°`ýÕzÉÚSpðÀmÕó=ÉûÌãc~U[YœŠ”€jM"˜aÐq€§ÝJŽAº’յ솗¦ãdà®îWgò!5™ñsöO(¦jÉßYÅã䀂¨¶&`îêÍczž‰8NÖkò£€@|{Z +Ø€=ØìǪÀ =Ø€=Àlì9:øÎ”mÙ!þß6Ã’oA0ÛÏÂ0ê],d¿ºÍ7Äɯ¼-5 ïÐ{²§öí>Ä[;‰_ÝK‰ÄÉù¯{Ðþ;©’çÓ¿úõ-KÎÍØíöìX{‚ÙÝUkO`¨Ø­úL =ñU-Ö¨=&óÖc±Oç&‘n””‡Ü¯±?í1™— çÆS†±¶çâW|¬«ˆ{ c§)âmåö޵‡ŸyîüÅØ·Œ}ö\‚æ.8îa q~ö*>X´ßgÏÕO{Šc®µhXr®™Mq÷4Œ{’Ú³–¸GVÙ`ϰ1תç{â{Ç®¥K‚ÎÎD·øc¾G9ßCÔ7æš¡=Õâ¹æiµ§jÿâübnÊ䆱¥Ø3T{ªv± Ïçä¦LnJ[jTìS(!ÛÅBök2Ö¬M~e¿À%˼ðÀ9îŠÀì2îAÈ pBáì˜ë?ÿþMs±¿ýòü?×äðÏ_ÿÖcC݈½9ÞžÞ1_¿}±Çö@ŒÇóÏgÕ^¾ßkìq&‰Í ¶Á–Ý^Wi@—ž‹®*ú#Ó_z5¬-M-.UÎíµ…¥?6`Olqò£FÄf,Øø^¾ßk®îêIß–|5’\ã˜ëãóõãóÕ[£«ìŽ)K“Øæ3ÕÇßøç3µGIYåÅž|<_”í¹KÏ囘ÄÝí?wòÝíƒû†ÙørÞ©Ò_¢íu¿~û§‹ßÊ?>_]qø=xîZ|"<Ét…¾6¹ì±Ö™rüå;Ú7Ô¶!êò _¨Hwi{ÑøZö÷+á“àZA)8N(z’v…ÍŸ¨M~z¬UK UsLwÅî¡®¾®Ð,ñkÎ÷ cFÐʃ•i@CÔzR_›ÇZûÄ}|œ6(§ýÈ!~Ðßw¢]ÎT{`¿ñã_›—Âò˜éÉ"wõ~[ÅJEm1\µ¹~ “ï†NfĪY[Š~Í{½ì!:‹ÁEíÔS +1žZÊ“#´'Ù¿æb~‚m.ëd8¥áTM©@Ø‚3iÙ«òä€Ñûw¦&c~fÄg'èqúx ìE}¥!˜äΡG=v$¯0LŽ…{BF³Ç÷{‚Ô;öKq€ãF^ÅyŽdú"$ÇýD“F‡ë¾'ƒe¢E0H{šPG?Τëžn¯Ž@ÅàCcÆDÅÐÇTÞädjRz²Um9.k;VTXÎ*ú×ܰKc¡Ì¹K»»Dˆ_ÛVJ[1ÛÀ“È´§ªü8þnFæ¥4L…Ü[ÀGÝ[ð4lðmH~§9À`SQsn®o[6äæúveÃͲÕf–X¬ÑÛ "bÐsˆ{€=°'îYÇÇ=zâCvc×Öm@܃¸q€ž =z.Úƒ¸qϪØC¼cC6oÀØ• CÙC›5†@zŠïQ؉ ˆ{€Ä=:÷–½ œfMŸ3‡ Ð`ƒc.`& º¿gÁw 7´Aïú6@{€À3uÏTàiØàÛ€ž À˜ Øî˜k OD›Ôž5¬è¹°{øXÃ}¥â=ö ç =â`Jö¬á‰`“ìYÃâ`gìYô{Àü¿S‚´h I÷зm0÷g€üÌÃuÂçM0à N“-¼3÷\~ŸÛ°‡;D/þ‰.iÚCôAèž6ŸG{°gxÏÄ=è¹ ˜ï‘=&z—Ã>Ÿ+‚öh©ãdö÷.°§MÞåöìTxôç€=ÈØ`Ì5 xpì·ñ£çÚÏT`Ÿ Ø ·=€¸{°{ìÀìÀ{°{°ÀìÀìÀ{°X'ðLÀö©€ rÐsˆ{€Õ ú9výþ Áþ´‚MÿÖ`ƒøáXk®r†·§÷8‡*£×`CêLàô\ÀÀ¸G¿?Ã9è1êØ£ßŸ!ÆÚ.c 6è1‡êأߟ!èk?>_ƒÀm64{6êÄ=À¨¸G¿?Ã×o_‚н¸ Mz® üí䨘ïÑïÏ`»ÕdLÖ¯Á†&AÏ~¸SÇ]Òð^›ëçÀ‰×Ö`Cêl×=—~†9rÐc?Üð…Gs‡Îô9k°¡•ðLã‡%Uù„#‡~³E?`ÌôséƒæÈA™üÀb~ý`x 6è1™Ðs à™ €ìSä6,Üs=ž/nB¿yçÛÓ»ýSÚ£´dü­®ì P5;mÀE,Ö™;P€n]¦Š1~ìér¾¯¢ÎÛÓû²7Õ×–þØ&jv+ þIð‘Ÿ[‘‘µ~¿ÁÕ6¾†+¶Î–Êùž¬Ubßÿ¹-ç{âLî¶mÝ%´w·ÖhÁâ°Ín|¹Ædï‰/Êo| jOΓÖ$Ž=úÚ4#g ƒLü’»îƒYañ}túw/8ÆØ;;íÇ€Iœ>ÑYR¼zО,Ú3t¶ÐÅ7I†rîIs’˜´›I €:®ññ«Ðg ç{¢ŒÛ}Òi¢' oø'Y›üàï(¦¼¦·ªŸQK¿UˆXðr5çŸÐ[”žlR›G±Å|#˜±˜-6§ÿrW´ÖÆã(Á¯0ÿ¸+›™c¦ËjSΞVÞWßuÞØ˜Æ¯ïâ1G½ý“—½³lÁ¥ßɹØã9OÕözœãaƒ Á<…Þ“Û`OÜCÛ–] rÁ»Kèwt”š»\ޱðÖêõ_ãÉà©å|ì±Å³¥õçQr%$æü¿ÞSvk}‚c&›[yÒ]"çÉÞëÇ1ÚãœL‡7 9¢‹~Âcëéíé=–½œÞtb³ïÉ`™hŒ±'©£‘VM¿@¤-ö›¹¯ –ï'„Iêˆ=9nÄNJ7ýx^NIeœ¡ ˆ9‚Þtàa uˆZ`NšT°ÇÉ#á æT¯ Àþ~.Hä¯ö‹µ'˜ªŸ–šø¡ÃJÂT&Ž­ eήʨWL0à N#,Ù®ö4)³3hè*©i1IäSåD:p.Úæ.wæÈµÒNÁ_㸧¡G·ƒƒþOÉ«?ž/´ã8núÙ ý#£Gìý<¥[ ž©8¨x¦8ÀӀ؀=À¶ðÿ¸çò×î$ìyþã¾jq8Oð Ã;\H–Ý<IEND®B`‚dbacl-1.14.1/doc/chess/csfpc3.png000066400000000000000000000072431325773323600164250ustar00rootroot00000000000000‰PNG  IHDR¿ «‘N pHYsaa¨?§itIMEÕ µz–yBIDATxÚí]»n$7œæG¤Ï0àÀ /N ÂF¿l¢VYÏ÷Ë{<~ÔÍ!dÅ=c8•xÆGkЫ 3‡ˆz/ÔÑRáIÅÓ{³³ñ€Ò óÔʦoøyOO ÅYW4¤ÖgËV}¡÷lØ×™ cŸF-õ’•q¿ ã`*Aî=bo$9âQ}2:L ´£W”@EíMŒ¤ˆJªPꦛ§Üd¹iK ’Vešê.²#†v>‰ºÊfhcv;:  ÂV• Øî(EóLÄ6‘Øf÷Ø–MÃõ± W*°{°sQbÐìÀ`oì9:¸Î”-Ù!þ_·Â ¢oA˜¶ÿž‡1©W±ýjß¿ò–ÔȼCì©ÈžÒ·ûoí$~µ/%ç¿jìY@{øï¤ŠîOÿê¶·¬8ÿ5g`´Ú3°öx³»«ÖÏP™¯é‘B{Jµg ^&¼Rí™o=–±gpí™/Žîj·§=Sâ%éñÔÄX H¹JÙãÉÌ€ì)]iŠx[¹§=žŠ‡Úï<µ5ö"×{É÷¾Ã¡=üî.0ïa ±ÿ’Úá9´G¦=Ù1׊´ìYmÞÕžµä=â¬Ù‹\ƒ$@ýÇ\kŸï ó•‰\¸„Èš‡Í{êÎ÷í¹fhO±x`®y·ÚS´þ±¶6eñ‰±¤ØÓU{ŠV± ÷çÔ¦,>å–Ô(X§PB¶Š…ì×ëÿŸF•¿²—ÔH²/üðD€»â°{€Ì{2œT89æúû¯Ÿ4ûîû§_þøYSï?þÖcCÙˆ½:^ߦiúüå“Ù6bœÎÿ>«öüõ^c5Il†Ø± æÜÍq•4‰\tSÑ™þÒ¨bkiZq©ö³n/5À;Yúcö„G?jÔHlÆ‚ïùë½æè¶ô}ÉU#™áÇ5޹Þ?^Þ?^ì¶1ºÈî²4‰Mý!SÍvø»?S{”Ô‘5^èÉÓù¢ìÏM"—kbw·üìÎw·öfçKy§H\‰6ÇýüåŸ.n/ÿx±§Ãà©cñˆð$ÓúÖä²ÇXCTÊñ—ëh×PÓ‡8ò¨ãUÈ'Px ,uì¡ÍAÃc™쯄O¼cygÁqBÖ“´+LýDkòcè\ª–ª¦˜nO»…ºººB³Äm9׃–^/÷ZT¦QêI}kÎ¥ö‰c|XÖ;Oó‘C|/Þ7¢]ÊT³a¾q·Ã_«Ÿ…á1Ó“Yîêý¶Š+¥§a›ÍnðèxG0 ´2#VÍÒ³h×½×Ë"Xt>ÕF‘¢ÛYã©¥<ÙC{¢ñ5•óló¤ØsYÓ$Ã* §ÙhJyÂæíIË^‘';ŒÞ¸35šó33>3Açù‹ã50u•†`’݇õ˜A¨W¼tÂ0:n= éÍ×ïa "PïÐ/ÙŽyeç9¢MèˆûmLj‘®»žô.-‚NÚS…:úq&ÝötµÊ&âÉ:ÎY¬‡:ìqç<Âó!º~é¼\ÓaE6îˆI,6 h­´†aþ¼ÿTz8gÎ䘌:î€hŸ³Ç¥¯ØlƒHuù™Gió»×®£l͹ʭ§} LÍÕá+P•aª©?z•Ôû>jI*Ûp]Éñšà Qx9=z•Ôû¾ÅM,Ùä¯HæF]­QHr)â2¦OM}¦Â›œ¦’ )=Y«5gŽËêŽÕ –²Šþ55ìÒX(óFêÐö.â׺RWÌ6ð$2í©"?ö¿›‘yè S!õpQö<\¢ßãi@@°ØuÖÜ©ùÆÒ‰MÚ»n@©|ºHÿDÄ>l@ä÷`O„ѽ4Þ‡†ìÆ®­Û€¼yò‘ ‘ ‘ €ö ïAÞö0ÄwñŒ¡lŽ=´k8ŽË¾Ga÷È{* gN·¦÷Ù‡ ÐÚ,ŠîïÑ?¢¿w}6@{€À3eÏTàiØàÚ€È`ÌlwÌ¥T{ôWeD.{€žìÑßË ïAÞ rˆ\´@Þ€=Lê€@`Š: ØÍØSñ.|Ú` ëþL Р6ðLÀÖ©€ r¹ä=À¶Æ\u±†õ€MjÏÞ× r`ö𱆷\È{÷ r`"ØÈ{€]²g ë3›dÏÖg÷ƒ±g ë3ÐìvN÷÷¬a}Ú¬ x¦àëTÀ¹ Õò;´Æ3¦È{$xÿxïÕ:§óeXùÁzÅì1.3Âóþñrwû0&Nç‹§¾w·úáFF7~á½OÈ{ʨswû08¬¼m°§,S0ƒÆ[Ï…c®»ÛÓÕìÆ˜)³ÁÇ ßÅc.ãµ»Û ÚíI)Í€ ôüõÞË{¹ò‘ÞK–í7˜tsQ‡;/¡ÒŒFèÌŘ½H2ßãþ6\©3òÌEqÖ<ì8‹3s1šsf½ãÆqóÞþqâ×Ìô×ó×{o áå=ƒÜ¶AÏSŒ&?33Æ»Nñ\Þn#_xǘ+ßçÂqû8@ÚÇeOjˆžýi¯Î‚¦–iá/¸À3 X§6Èmˆ~§9ÀìÀìÀ{°{°ÀìÀìÀ{°{°À ðLÀÖ©€ r¹ä=Àj Z§b=ì­=+Xôo 6è±?¯S¡\Ÿáõñ-¬¡Èè5ØP…:;ð"Ð1ïѯϰôØÊØ£_Ÿ!ÆÒ±ô؇ÊØ£_ŸÁ‹µï/^â¶ ªç=õò WÞ£_Ÿáó—O^ Å^܆*‘k~€örÌ÷è×g0a5Z“õk°¡JÒ³?܈©c9ñ^¢šëÖÀÉ×Ö`C êl×]W–ÜG zìÆ7|áÑìá3½Ïl¨%<»ñÃ’ª|Âv³E?`Ì´sé/í£=öä{ô‹ èÃk°Aù‘ PÏT` Ø ·aáÈu:_ì<„~íà×Ç7ó§´GiIÿ[;ì¹/h@YÖlM4 ý1ÛfvC™ õOµ5ÈU5'þúø¶ìMõ¥x'K¬“5Û+ î%ï#¿{EFÖûÝWÚù*^©0m¶ÔPÎõd©»þO}¬9ßV*p·éë¶ »î$º8l*¤;_ª3™ûcƒò;߂ړò¤1‰c¾5§ž³…Sbae7|0,¼¯€nB÷îËsg§ùè1‰­%Ù£·íɬ=]g m~e(çž4+‰Q»™ò¨c;¿ ]Æp¾'âcØï£Nk”îd=IxÃí<ÑÖä'³˜òšhí5??&²–vW!BÁKµœ»CkARz²JkÎb‹ùF0s1sÚœøeh6:\³·ÁÜí¦lfŽQ˜b,kM9{jy_I|,8¼19ÛÞÙmŽz»;/{gÙ‚—~›ÏFäb§ "$SANOUT" 2> "$SANERR" if grep Error "$SANOUT" > /dev/null; then echo "Error (illegal move): $cmd" return 1 else mv $PGN.new $PGN fi return 0 } function do_reset() { rm -f $PGN touch $PGN exec_san "" } function do_move() { if [ "$SANOK" != "yes" ]; then echo "Illegal move (you must use SAN): $1" echo "Error (cannot play): $1" fi if exec_san "$1"; then MOVENOW="yes" fi } function echo_gameline() { cat "$PGN" \ | sed -e 's/\r//g' \ | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \ | sed -e 's/^ *//' \ | grep '^1\.' \ | sed 's/[0-9]*\.[ ]*//g' \ | sed 's/ \*.*$//' } function echo_completions() { # legal moves are in $SANOUT cat "$SANOUT" \ | grep '.* : 1$' \ | cut -f 1 -d ' ' \ | while read move; do echo "`cat $GAMELINE` $move" done } function echo_scorefile() { cat "$1" \ | sort -k 2 -n \ | head -1 \ | sed -e 's/^.* //' } function combine_halfmoves() { sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//' } function split_fullmove() { sed -e 's/.*_//' } function do_engine_move() { if exec_san "enum 1"; then echo_gameline > "$GAMELINE" # make all completions and let dbacl decide echo_completions \ | combine_halfmoves \ | "$DBACL" -n -c "$CATFILE" -f 1 \ > "$SCORES" if [ `cat "$SCORES"| wc -l` = "0" ]; then # no moves left, game over! # the gameline contains the result echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}" return 0 else # pick best scoring move echo_scorefile "$SCORES" \ | split_fullmove \ > "$ENGINEMOVE" if exec_san "`cat $ENGINEMOVE`"; then echo "move `cat $ENGINEMOVE`" return 0 fi fi fi return 1 } while read cmd; do case "$cmd" in xboard) echo "feature san=1 done=1" ;; "accepted san") SANOK="yes" ;; quit) exit 0 ;; new) do_reset ;; variant*) echo "Error (only standard chess please): $cmd" ;; [a-h][x1-8]*) do_move "$cmd" ;; [KQBNRP][xa-h]*) do_move "$cmd" ;; O-O*) do_move "$cmd" ;; analyze) echo "Error (unknown command): $cmd" ;; *) # ignore other commands echo "Error (command not implemented): $cmd" ;; esac if [ "$MOVENOW" = "yes" ]; then if do_engine_move; then MOVENOW="no" else echo "Error (engine blew up): kaboom" exit 1 fi fi done dbacl-1.14.1/doc/chess/dce-2.sh000077500000000000000000000071731325773323600157710ustar00rootroot00000000000000#!/bin/bash # This is the code for dce-2.sh # This script functions as an incomplete chess engine for XBoard. # It is an integral part of the essay # # "Can spam filters play chess?" (c) 2005 Laird A. Breyer # http://www.lbreyer.com/spam_chess.html # # The essay explains the construction of this engine by # successive modifications of the dce-basic.sh script. # # THE dce-*.sh SCRIPTS ARE INCOMPLETE ENGINES AND INTENDED # ONLY FOR ILLUSTRATION OF POINTS RAISED IN THE ESSAY. # IF YOU WANT TO TRY OUT YOUR OWN MODIFICATIONS OF THE # CHESS ENGINE, YOU SHOULD MAKE A COPY OF THE FINAL (dce.sh) # FILE AND CHANGE THAT COPY. DBACL=./dbacl/src/dbacl SAN=./SAN/SAN_SRC/san TMP=. DCE=dce-2 SANOK="no" PGN="$TMP/$DCE.current.pgn" GAMELINE="$TMP/$DCE.current.gameline" SCORES="$TMP/$DCE.current.scores" CAPTURES="$SCORES.cap" ENGINEMOVE="$TMP/$DCE.current.emove" SANOUT="$TMP/$DCE.current.stdout" SANERR="$TMP/$DCE.current.stderr" SIDE="black" MOVENOW="no" CATFILE="./BlackWinDraw-1" trap "" SIGTERM trap "" SIGINT function exec_san() { rm -rf $PGN.new $SANOUT $SANERR echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \ | "$SAN" > "$SANOUT" 2> "$SANERR" if grep Error "$SANOUT" > /dev/null; then echo "Error (illegal move): $cmd" return 1 else mv $PGN.new $PGN fi return 0 } function do_reset() { rm -f $PGN touch $PGN exec_san "" } function do_move() { if [ "$SANOK" != "yes" ]; then echo "Illegal move (you must use SAN): $1" echo "Error (cannot play): $1" fi if exec_san "$1"; then MOVENOW="yes" fi } function echo_gameline() { cat "$PGN" \ | sed -e 's/\r//g' \ | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \ | sed -e 's/^ *//' \ | grep '^1\.' \ | sed 's/[0-9]*\.[ ]*//g' \ | sed 's/ \*.*$//' } function echo_completions() { # legal moves are in $SANOUT cat "$SANOUT" \ | grep '.* : 1$' \ | cut -f 1 -d ' ' \ | while read move; do echo "`cat $GAMELINE` $move" done } function echo_best_move() { cat "$1" \ | sort -k 2 -n \ | head -1 \ | sed -e 's/^.* //' } function combine_halfmoves() { sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//' } function split_fullmove() { sed -e 's/.*_//' } function get_captures() { cat "$SCORES" \ | grep 'x[^ _]*$' \ > "$CAPTURES" if [ `cat $CAPTURES| wc -l` = "0" ]; then return 1 fi return 0 } function do_engine_move() { if exec_san "enum 1"; then echo_gameline > "$GAMELINE" # make all completions and let dbacl decide echo_completions \ | combine_halfmoves \ | "$DBACL" -n -c "$CATFILE" -f 1 \ > "$SCORES" if [ "`cat $SCORES| wc -l`" = "0" ]; then # no moves left, game over! # the gameline contains the result echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}" return 0 else # pick best scoring move echo_best_move "$SCORES" \ | split_fullmove \ > "$ENGINEMOVE" if get_captures; then echo_best_move "$CAPTURES" \ | split_fullmove \ > "$ENGINEMOVE" fi if exec_san "`cat $ENGINEMOVE`"; then echo "move `cat $ENGINEMOVE`" return 0 fi fi fi return 1 } while read cmd; do case "$cmd" in xboard) echo "feature san=1 done=1" ;; "accepted san") SANOK="yes" ;; quit) exit 0 ;; new) do_reset ;; variant*) echo "Error (only standard chess please): $cmd" ;; [a-h][x1-8]*) do_move "$cmd" ;; [KQBNRP][xa-h]*) do_move "$cmd" ;; O-O*) do_move "$cmd" ;; analyze) echo "Error (unknown command): $cmd" ;; *) # ignore other commands echo "Error (command not implemented): $cmd" ;; esac if [ "$MOVENOW" = "yes" ]; then if do_engine_move; then MOVENOW="no" else echo "Error (engine blew up): kaboom" exit 1 fi fi done dbacl-1.14.1/doc/chess/dce-3.sh000077500000000000000000000103221325773323600157600ustar00rootroot00000000000000#!/bin/bash # This is the code for dce-3.sh # This script functions as an incomplete chess engine for XBoard. # It is an integral part of the essay # # "Can spam filters play chess?" (c) 2005 Laird A. Breyer # http://www.lbreyer.com/spam_chess.html # # The essay explains the construction of this engine by # successive modifications of the dce-basic.sh script. # # THE dce-*.sh SCRIPTS ARE INCOMPLETE ENGINES AND INTENDED # ONLY FOR ILLUSTRATION OF POINTS RAISED IN THE ESSAY. # IF YOU WANT TO TRY OUT YOUR OWN MODIFICATIONS OF THE # CHESS ENGINE, YOU SHOULD MAKE A COPY OF THE FINAL (dce.sh) # FILE AND CHANGE THAT COPY. DBACL=./dbacl/src/dbacl SAN=./SAN/SAN_SRC/san TMP=. DCE=dce-3 SANOK="no" PGN="$TMP/$DCE.current.pgn" GAMELINE="$TMP/$DCE.current.gameline" SCORES="$TMP/$DCE.current.scores" CAPTURES="$SCORES.cap" ENGINEMOVE="$TMP/$DCE.current.emove" SANOUT="$TMP/$DCE.current.stdout" SANERR="$TMP/$DCE.current.stderr" SIDE="black" MOVENOW="no" CATFILE="./BlackWinDraw-1" trap "" SIGTERM trap "" SIGINT function exec_san() { rm -rf $PGN.new $SANOUT $SANERR echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \ | "$SAN" > "$SANOUT" 2> "$SANERR" if grep Error "$SANOUT" > /dev/null; then echo "Error (illegal move): $cmd" return 1 else mv $PGN.new $PGN fi return 0 } function do_reset() { rm -f $PGN touch $PGN exec_san "" } function do_move() { if [ "$SANOK" != "yes" ]; then echo "Illegal move (you must use SAN): $1" echo "Error (cannot play): $1" fi if exec_san "$1"; then MOVENOW="yes" fi } function echo_gameline() { cat "$PGN" \ | sed -e 's/\r//g' \ | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \ | sed -e 's/^ *//' \ | grep '^1\.' \ | sed 's/[0-9]*\.[ ]*//g' \ | sed 's/ \*.*$//' } function echo_completions() { # legal moves are in $SANOUT cat "$SANOUT" \ | grep '.* : 1$' \ | cut -f 1 -d ' ' \ | while read move; do echo "`cat $GAMELINE` $move" done } function echo_best_move() { # assume $1 is sorted already cat "$1" \ | head -1 \ | sed -e 's/^.* //' } function combine_halfmoves() { sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//' } function split_fullmove() { sed -e 's/.*_//' } function get_captures() { cat "$SCORES" \ | grep '^.* [^ ]*x[^ _]*$' \ > "$CAPTURES" # we rearrange the captures in order of least important piece to # most important piece grep -v '[NBRQK][^_ ]*$' "$CAPTURES" > "$CAPTURES.new" grep 'N[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'B[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'R[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'Q[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" # king is too valuable to force captures # grep 'K[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" mv "$CAPTURES.new" "$CAPTURES" N=`cat $CAPTURES| wc -l` if [ "$N" = "0" -o "$N" = "1" ]; then # don't recommend capture return 1 fi # tell engine to make a capturing move return 0 } function do_engine_move() { if exec_san "enum 1"; then echo_gameline > "$GAMELINE" # make all completions and let dbacl decide echo_completions \ | combine_halfmoves \ | "$DBACL" -n -c "$CATFILE" -f 1 \ | sort -k 2 -n \ > "$SCORES" if [ "`cat $SCORES| wc -l`" = "0" ]; then # no moves left, game over! # the gameline contains the result echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}" return 0 else # pick best scoring move echo_best_move "$SCORES" \ | split_fullmove \ > "$ENGINEMOVE" if get_captures; then echo_best_move "$CAPTURES" \ | split_fullmove \ > "$ENGINEMOVE" fi if exec_san "`cat $ENGINEMOVE`"; then echo "move `cat $ENGINEMOVE`" return 0 fi fi fi return 1 } while read cmd; do case "$cmd" in xboard) echo "feature san=1 done=1" ;; "accepted san") SANOK="yes" ;; quit) exit 0 ;; new) do_reset ;; variant*) echo "Error (only standard chess please): $cmd" ;; [a-h][x1-8]*) do_move "$cmd" ;; [KQBNRP][xa-h]*) do_move "$cmd" ;; O-O*) do_move "$cmd" ;; analyze) echo "Error (unknown command): $cmd" ;; *) # ignore other commands echo "Error (command not implemented): $cmd" ;; esac if [ "$MOVENOW" = "yes" ]; then if do_engine_move; then MOVENOW="no" else echo "Error (engine blew up): kaboom" exit 1 fi fi done dbacl-1.14.1/doc/chess/dce-basic.sh000077500000000000000000000060501325773323600167020ustar00rootroot00000000000000#!/bin/bash # This is the code for dce-basic.sh # This script functions as an incomplete chess engine for XBoard. # It is an integral part of the essay # # "Can spam filters play chess?" (c) 2005 Laird A. Breyer # http://www.lbreyer.com/spam_chess.html # # The essay explains the construction of this engine by # successive modifications of the dce-basic.sh script. # # THE dce-*.sh SCRIPTS ARE INCOMPLETE ENGINES AND INTENDED # ONLY FOR ILLUSTRATION OF POINTS RAISED IN THE ESSAY. # IF YOU WANT TO TRY OUT YOUR OWN MODIFICATIONS OF THE # CHESS ENGINE, YOU SHOULD MAKE A COPY OF THE FINAL (dce.sh) # FILE AND CHANGE THAT COPY. DBACL=./dbacl/src/dbacl SAN=./SAN/SAN_SRC/san TMP=. DCE=dce-basic SANOK="no" PGN="$TMP/$DCE.current.pgn" GAMELINE="$TMP/$DCE.current.gameline" SCORES="$TMP/$DCE.current.scores" ENGINEMOVE="$TMP/$DCE.current.emove" SANOUT="$TMP/$DCE.current.stdout" SANERR="$TMP/$DCE.current.stderr" SIDE="black" MOVENOW="no" CATFILE="./BlackWinDraw" trap "" SIGTERM trap "" SIGINT function exec_san() { rm -rf $PGN.new $SANOUT $SANERR echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \ | "$SAN" > "$SANOUT" 2> "$SANERR" if grep Error "$SANOUT" > /dev/null; then echo "Error (illegal move): $cmd" return 1 else mv $PGN.new $PGN fi return 0 } function do_engine_move() { if exec_san "enum 1"; then # legal moves are in $SANOUT cat "$PGN" \ | sed -e 's/\r//g' \ | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \ | sed -e 's/^ *//' \ | grep '^1\.' \ | sed 's/[0-9]*\.[ ]*//g' \ | sed 's/ \*.*$//' \ > "$GAMELINE" # make all completions and let dbacl decide cat "$SANOUT" \ | grep '.* : 1$' \ | cut -f 1 -d ' ' \ | while read move; do echo "`cat $GAMELINE` $move" done \ | "$DBACL" -n -c "$CATFILE" -f 1 \ > "$SCORES" if [ `cat "$SCORES"| wc -l` = "0" ]; then # no moves left, game over! # the gameline contains the result echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}" return 0 else # pick best scoring move cat "$SCORES" \ | sort -k 2 -n \ | head -1 \ | sed -e 's/^.* //' \ > "$ENGINEMOVE" if exec_san "`cat $ENGINEMOVE`"; then echo "move `cat $ENGINEMOVE`" return 0 fi fi fi return 1 } function do_reset() { rm -f $PGN touch $PGN exec_san "" } function do_move() { if [ "$SANOK" != "yes" ]; then echo "Illegal move (you must use SAN): $1" echo "Error (cannot play): $1" fi if exec_san "$1"; then MOVENOW="yes" fi } while read cmd; do case "$cmd" in xboard) echo "feature san=1 done=1" ;; "accepted san") SANOK="yes" ;; quit) exit 0 ;; new) do_reset ;; variant*) echo "Error (only standard chess please): $cmd" ;; [a-h][x1-8]*) do_move "$cmd" ;; [KQBNRP][xa-h]*) do_move "$cmd" ;; O-O*) do_move "$cmd" ;; analyze) echo "Error (unknown command): $cmd" ;; *) # ignore other commands echo "Error (command not implemented): $cmd" ;; esac if [ "$MOVENOW" = "yes" ]; then if do_engine_move; then MOVENOW="no" else echo "Error (engine blew up): kaboom" exit 1 fi fi done dbacl-1.14.1/doc/chess/dce.sh000077500000000000000000000121201325773323600156160ustar00rootroot00000000000000#!/bin/bash # This script is a simple chess engine for dbacl and XBoard. # It is based on the essay # # "Can spam filters play chess?" (c) 2005 Laird A. Breyer # http://www.lbreyer.com/spam_chess.html # # The essay explains the construction of this engine by # successive modifications of the dce-basic.sh script. # # THE dce-*.sh SCRIPTS ARE INCOMPLETE ENGINES AND INTENDED # ONLY FOR ILLUSTRATION OF POINTS RAISED IN THE ESSAY. # IF YOU WANT TO TRY OUT YOUR OWN MODIFICATIONS OF THE # CHESS ENGINE, YOU SHOULD MAKE A COPY OF THE FINAL (dce.sh) # FILE AND CHANGE THAT COPY. # # Revision history: # # 28/06/2005 (Laird Breyer) Initial release. # DBACL=./dbacl/src/dbacl SAN=./SAN/SAN_SRC/san TMP=. DCE=dce.$$ SANOK="no" PGN="$TMP/$DCE.current.pgn" GAMELINE="$TMP/$DCE.current.gameline" SCORES="$TMP/$DCE.current.scores" CAPTURES="$SCORES.cap" ENGINEMOVE="$TMP/$DCE.current.emove" SANOUT="$TMP/$DCE.current.stdout" SANERR="$TMP/$DCE.current.stderr" RANPLAY="no" SIDE="black" MOVENOW="no" FORCEMODE="no" CATFILE="./BlackWinDraw" trap "" SIGTERM trap "" SIGINT function exec_san() { rm -rf $PGN.new $SANOUT $SANERR echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \ | "$SAN" > "$SANOUT" 2> "$SANERR" if grep Error "$SANOUT" > /dev/null; then echo "Error (illegal move): $cmd" return 1 else mv $PGN.new $PGN fi return 0 } function do_reset() { rm -f $PGN touch $PGN exec_san "" SIDE="black" FORCEMODE="no" MOVENOW="no" } function do_move() { if [ "$SANOK" != "yes" ]; then echo "Illegal move (you must use SAN): $1" echo "Error (cannot play): $1" fi if exec_san "$1"; then MOVENOW="yes" fi } function echo_gameline() { cat "$PGN" \ | sed -e 's/\r//g' \ | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \ | sed -e 's/^ *//' \ | grep '^1\.' \ | sed 's/[0-9]*\.[ ]*//g' \ | sed 's/ \*.*$//' } function echo_completions() { # legal moves are in $SANOUT cat "$SANOUT" \ | grep '.* : 1$' \ | cut -f 1 -d ' ' \ | while read move; do echo "`cat $GAMELINE` $move" done } function randomizer() { # assume stdin is sorted and $2 is the score awk ' { if( cf == 0 ) { cf = $2; } score[NR] = $2 - cf; line[NR] = $0; } END{ srand(); while(1) { x = int(rand() * NR) + 1; t = -log(rand()); if( log(2) * score[x] < t ) { print line[x]; break; } } } ' } function echo_best_move() { # assume $1 is sorted already if [ "$RANPLAY" = "yes" ]; then cat $1 \ | randomizer \ | sed -e 's/^.* //' else cat "$1" \ | head -1 \ | sed -e 's/^.* //' fi } function combine_halfmoves() { sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//' } function split_fullmove() { sed -e 's/.*_//' } function get_captures() { cat "$SCORES" \ | grep '^.* [^ ]*x[^ _]*$' \ > "$CAPTURES" # we rearrange the captures in order of least important piece to # most important piece grep -v '[NBRQK][^_ ]*$' "$CAPTURES" > "$CAPTURES.new" grep 'N[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'B[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'R[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" grep 'Q[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" # king is too valuable to force captures # grep 'K[^_ ]*$' "$CAPTURES" >> "$CAPTURES.new" mv "$CAPTURES.new" "$CAPTURES" N=`cat $CAPTURES| wc -l` if [ "$N" = "0" -o "$N" = "1" ]; then # don't recommend capture return 1 fi # tell engine to make a capturing move return 0 } function do_engine_move() { if exec_san "enum 1"; then echo_gameline > "$GAMELINE" # make all completions and let dbacl decide echo_completions \ | combine_halfmoves \ | "$DBACL" -n -c "$CATFILE" -f 1 \ | sort -k 2 -n \ > "$SCORES" if [ "`cat $SCORES| wc -l`" = "0" ]; then # no moves left, game over! # the gameline contains the result echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}" return 0 else # pick best scoring move echo_best_move "$SCORES" \ | split_fullmove \ > "$ENGINEMOVE" if get_captures; then echo_best_move "$CAPTURES" \ | split_fullmove \ > "$ENGINEMOVE" fi if exec_san "`cat $ENGINEMOVE`"; then echo "move `cat $ENGINEMOVE`" return 0 fi fi fi return 1 } function get_side_to_play() { N=`echo_gameline | wc -w` if [ "`expr $N % 2`" = "0" ]; then SIDE="white" else SIDE="black" fi } while read cmd; do case "$cmd" in xboard) echo "feature san=1 done=1" ;; "accepted san") SANOK="yes" ;; random) RANPLAY="yes" ;; quit) exit 0 ;; new) do_reset ;; variant*) echo "Error (only standard chess please): $cmd" ;; force) FORCEMODE="yes" ;; white) SIDE="black" ;; black) SIDE="white" ;; go) get_side_to_play FORCEMODE="no" MOVENOW="yes" ;; [a-h][x1-8]*) do_move "$cmd" ;; [KQBNRP][xa-h]*) do_move "$cmd" ;; O-O*) do_move "$cmd" ;; analyze) echo "Error (unknown command): $cmd" ;; *) # ignore other commands echo "Error (command not implemented): $cmd" ;; esac if [ "${FORCEMODE}${MOVENOW}" = "noyes" ]; then if do_engine_move; then MOVENOW="no" else echo "Error (engine blew up): kaboom" exit 1 fi fi done # don't forget to clean up rm -f $DCE.current.*dbacl-1.14.1/doc/chess/down.png000066400000000000000000000004641325773323600162110ustar00rootroot00000000000000‰PNG  IHDRÀA¼bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ 3HucVtEXtCommentThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995LèôÄ_IDAT8Ëc<óÿ?5•Á¨ƒÐ@FFª¤3ÿÿ32ÁÔ0 ÅË”Ь— —9†aR Ŧ–‰X…Īa"U!9&R]AÈõL¤x˜ `-G€íT6qªÙœ>IEND®B`‚dbacl-1.14.1/doc/chess/randomizer.awk000077500000000000000000000005271325773323600174150ustar00rootroot00000000000000#!/usr/bin/awk -f { if( cf == 0 ) { cf = $2; } score[NR] = $2 - cf; line[NR] = $0; } END{ # randomizer seeded by time of day # don't use more often than once per second. srand(); while(1) { x = int(rand() * NR) + 1; t = -log(rand()); if( log(2) * score[x] < t ) { print line[x]; break; } } } dbacl-1.14.1/doc/chess/renorm.awk000077500000000000000000000001141325773323600165350ustar00rootroot00000000000000#!/usr/bin/awk -f { if( cf == 0 ) { cf = $2 } print $2 - cf, $0 } dbacl-1.14.1/doc/chess/spoiler.png000066400000000000000000000002511325773323600167110ustar00rootroot00000000000000‰PNG  IHDRĉbKGDÿÿÿ ½§“ pHYs  šœtIMEÕ ,9v`*tEXtCommentCreated with The GIMPïd%n IDAT×c````^ó*:IEND®B`‚dbacl-1.14.1/doc/costs.ps000066400000000000000000007615431325773323600151420ustar00rootroot00000000000000%!PS-Adobe-2.0 %%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software %%Title: costs.dvi %%Pages: 8 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: CMBX10 CMR8 CMCSC10 CMBX8 CMR10 CMMI10 CMR7 CMSY10 %%+ MSBM10 CMMI7 CMTI10 CMTI8 CMSY7 CMEX10 CMMI5 MSAM10 CMR5 CMTT8 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips costs.dvi -o %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2004.04.22:1832 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: f7b6d320.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 % cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 % cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 % cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 % /TeXf7b6d320Encoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 0ef0afca.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmr5 % /TeX0ef0afcaEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: aae443f0.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 % /TeXaae443f0Encoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf /arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft /arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash /greater /star /partialdiff /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 /flat /natural /sharp /slurbelow /slurabove /lscript /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 /dotlessi /dotlessj /weierstrass /vector /tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: bbad153f.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 % /TeXbbad153fEncoding [ /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast /arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup /arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional /prime /infinity /element /owner /triangle /triangleinv /negationslash /mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur /latticetop /perpendicular /aleph /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 /union /intersection /unionmulti /logicaland /logicalor /turnstileleft /turnstileright /floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright /angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv /backslash /wreathproduct /radical /coproduct /nabla /integral /unionsq /intersectionsq /subsetsqequal /supersetsqequal /section /dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus /.notdef /.notdef /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 74afc74c.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 % /TeX74afc74cEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /sterling /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 09fbbfac.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 /TeX09fbbfacEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /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 /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /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 /braceleft /bar /braceright /asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: texps.pro %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMTT8 %!PS-AdobeFont-1.1: CMTT8 1.0 %%CreationDate: 1991 Aug 20 16:46:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-5 -232 545 699}readonly def /UniqueID 5000830 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE 3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477 C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D 4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7 61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16 6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173 B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31 6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23 C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE 52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9 48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5 351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128 C4CF2F4F438A4E520CD932BAC455BF8775C27AEA6C73EED3EB2F8DB5E356AE27 41B35C8AEFE73C4CD6A591AAE4F45762EBD6D3636C03F08C552BBFD0A13D11D5 491F8369B4BAB8ED9D6F1DE7DB7AFD383986C4338D3AA71C9AF2B8A0955CFD86 0345F16D9798B25156DDF826A7CB6A0CC4CB43078BEBD3E499DA95562A08EED9 7CA27B7A0CE3FA7EBDAA87A602512645CA49799B937B920ED4B12DF325BC1D80 5700E3AF6BA9B919906BD42652AC3D91D9FE631AA1D6D0849B51301E1532CA3B 2A8BB9993EDBF4E768E441CBA62CF3DC2DAC34122EC5306AAAC1F35EF80FBC39 F572EE17ED014B0A45EAA8E7A1D8AFB0ED52A7A8A94B348BD6CB39A055032975 28CB0E254CBCCE33FF41837A67C54DC84BD9344DA8656062065DD96315D3F960 2A16CEB4E787F4E2BFC8A55A164727DF30542C501EB462FCF6BCD2373099DFAA DA05D3F15CD2AAB562CB8E9F26819EE295C21E62E7EFBFC43F79261D1A9C14D4 91F06B03E05ADF2F77F34EE35FBA6845F9F702CE14C85F29B6C62104BE8E57CD D42AC23D253E21F76F93405CD9A09C5B76AEB10160284F23AE002814BBABD5B3 D723264558F1E4C742E16B44251139842E5D722791A266E68533DE9BABB6C298 9216219C0F38D1EEEC69705D84736CF8EF8260D78B6F64FB9C37218725E9D154 EB2A8B630EBE52712FFF7D43301E8DB94C54C41E0950055B30E4B241BF7097F6 E27F8B5F1E5B160DDA74E8C715E0E4180CF3B25A6A8D43C8B234A71C0EAEB92E EEF973B39A400D4676C63609CA49B870F50FB8F0CAA290B9A55FE2CB1AB7C26A 378B105A50B6B6FC457874C1A3E1792CA109DDE132E7D31084DFB7BB7594593F 9AF74CBFDE0D54B3BA977EA9E9ECF695253843015BE50A16DF2682DD7FEA4BCB DBA5B94A20F5C34F76819BE3AD41A8C8668288923CE79583C7EE0BF07F0EEE7B DF1486D373F74A7C4101AA8A0156E6EC7081C1A09BF92BEED6EB29B59568E6ED 2B422644947BFCD9C0975DC523868D9032E321A34A9DCCDE3D984493EEA00353 33BF8529331930291278A27060ECC60BF1E63353C98875D56BF790EFE721B4ED 303B68C659ADFD5021A36F46CD59E11D9339D3C7C34A031EECF2C6F3C6B69BE8 467FBD9FC52005275AA2C34FB42701C578D07525834C6C22FC5114DC6F9187FE F5FB4B420CC364C8C238AA8C87D64639EC9E30AF1F9136D0AD04E72DFEC0702A E7BE1E49FEC80DF3A9212634230A5CDA59969D1008D91F0F6743D932A7A68939 06CC9ED616A548B738FBFC2B35BD172B3AF0A55551BC860135347A7548245FDE 0A58812DC5AB21B7FA37B8481EB78AF3BE8BB8D1F899E80AFCFE4A50DEAF0D91 48AA45AC949172E4E1CE988182757D8F3847C5A5808DF915824F947569D076C8 771F9D677552990729FA79F54E198FA9FACB14378C88B9C515324769A5B066A9 CDC8AB28D35BDFA431C58FCF87F6C3DD6AEA768753DD983EACEFBC7E0AFBF480 B7E784D2AFC7CC2436C6936D73E2C9DDBD4E807CE4284CB04AA65371FAA72378 853E9EE7D40ED128A517829B8C93602F4B736B4D7F428D8C9F09829993E8717F 9C5D7218D7C2DBEEEEDC8EB3B0393832CAE39DE268F1DAC599F6636CDFE60FFA 8504C3367AD6D2460E3567B902687630AC0009089F6FA05B887502A71C15A71E FE74E44A46F3D55A76FEA5507C93CDC01CC873F319407864BDB76189007B06D1 E0607A5DCCB94630E741737EAD6C170F5AA0E33B637A6945AFFF9590DFA364B2 160875100D53E3C34066DFB24271652D19811F68C8C17F5AFE359217FFD47871 B10340BACD837601B6709FE6C08578FE4D6623049ADFEBA8D98FE6D33651EB64 A152B68DB46432C03521052BAFF98E71EBB47C718FAD5CAF668E682F42B3C0FA 7701814CB2DC4D382F582CF0CD1996A44EEA0F3DFAD53C65148E9022512D98E5 35D3FB287D67B7D043E78FF3D9228540ACD65D57965A722FC1A9E64A817D0C25 E5C031A59F980ABF34ACFE23FBBADC076878D7AC08299FBA706DFDE6873D6316 035C55248DAD516B3A5D941200B1B0D5F314462131996D67B3B7BEBE946E5E6C 197DBCDAE0C9BB7419E737E747E8E6D0AF1152D195ED7EC9964BE042BD8B3F9D F619018D87511182EBC9D3B75D973571FFA32A9356549CAA0B7F52B1FEAF82A9 C50A5A540659A7F0CC7B4E6CC1B15E8E7B6D7C75A456466D3FE318EA1EF95A0C 24B3C06140CB0453137F51F720931B5609E871E8E1334A94511D74AED132FF12 3D88DEDE85E63AE50F5DC638DEDF6770EFFCCC10BA459A207721359BC643CE60 C37C7DD17B4EB7715EDBB8406E93E610E6560E64FE5AC9577DACB24DEACDC70C FE6AAD5E1EBFA3225ED97E42E4ED463BF79574B219FA8726C77056D7E79852A9 3EAE51A78A0E5AAE8051B7960F4009B9D11D3536D13A1D81FEF270CF28C865A3 A712709C604BC4FBC0CAE2E90A7B95884BA99B1FA5981842DF03FC73807B4EF3 DC360A17C8708A89403DB289B1146761642FDFB872F3506F86C46438AAAFB6E3 6A4CE3F92015FEBEC36E7E9C7FDF21AA5B101D21E63F62CCFC6B3F90B0020642 B90951EEAA2BF847979B3858A5AD0E93F9544FD5C9266A2B14464B26D65BA06F 8751EB177441B14239F256FA3CDE195E3916860784DE9D46180C362A7F5CAEFA B9E3D2DBB04DACF891CE4EC42371F26B1342ACBE7E799DDC75A9ED8435539234 619372840DD05850B62B6167BEB03FDFF7BC9942FF982CBCEAFA14288F9CE0C9 278D5637B19E8C374FDFBAF930DF8EC791EC0C4A4B6411516E0BF2A96CFC5D30 49E863A84BACB1CF1D1F5BCC8ED135E36D4E754A4DA29C83A5055E92398ED029 40671A96C8A79CB4A453A819A1B32E487AB4B7E4253668B90BFEF4D5136E0B65 FD1611D04C43BDEE61BE6D41E384062A83E0DCBA0AD1BE372AB40828F3345787 087E0EFDCF03224B63CD2B61CF6DD41BA9B9A97DCF809FB86E4B95692D38163B 4AE1A86B90A666A52C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR5 %!PS-AdobeFont-1.1: CMR5 1.00B %%CreationDate: 1992 Feb 19 19:55:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR5) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR5 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-341 -250 1304 965}readonly def /UniqueID 5000788 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC 83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B 41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA 246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C55124CA6C6A2C D961E1362D29A5F4C3393CEA88D53E01D0FDAE7050612947AD1B04F42B0F3B0C 4ECD493606D6321E7773557228E0C71A0C5EEB809E9853FCD689BFE16A61E8BF D7E8683252EAE940B67546EF86DAD7CB9D786603060FDA494D3297F3F70864DD 1C37DA22110220A988706B11409E2F475F486C749DDCF8199C25965925D091D1 819EB866D2CE64D29464F7A6045778F1740A06610F1DD94F2A4EE817CAFAF919 8D241C7C3A7A4BE1016C9A8BA70ED76B436646786E4CE058A6B056B9BF766110 41EE4F93833911E1EAE9B21DF6925E77E2746E2FA82F76494E50D61E33B160DA 780549CEF58DE177E36F5858137038EEBBE70A3A26B51508291B3049E2D392CF 3E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: MSAM10 %!PS-AdobeFont-1.1: MSAM10 2.1 %%CreationDate: 1993 Sep 17 09:05:00 % Math Symbol fonts were designed by the American Mathematical Society. % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (2.1) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (MSAM10) readonly def /FamilyName (Euler) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /MSAM10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 3 /square put dup 66 /triangleright put readonly def /FontBBox{8 -463 1331 1003}readonly def /UniqueID 5031981 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1C87678CE98C24B934A76220 4DD9B2FF3A49786028E35DDE10AD2C926BD30AD47015FFE9469DE1F793D1C53A C8812CBCD402444EAEA7A50EC5FD93D6A04C2783B50EA48059E3E7407537CB8D 4C206846EF0764C05289733920E2399E58AD8F137C229F3CE3E34D2D1EAB2D53 20D44EFAC8EFA4D14A2EFE389D952527F98D0E49BD5BD2C8D58FF9CB9C78D974 75C2AB5467D73D2B5E277A3FDC35909938A9DF0EB91BD9159D3437BE22EE4544 3429AC8E2BFBE34AE54D3BA3AD04BDF3F4F43A2B43992DF88678681B3AB32CFD A23E2C98D1AF00AB206AC95B78BBE6316F7A0AB6BD3236C28C76288B3C25D1EB E9ABB3576C5EC15A71D26177F5883E9B48293D59015615E2EEAF2E9BA04151ED 5497B9A1C41CBA44BAFF13EA218F5EAC11952EE336AD1DBE6CE92F002EAA3B3D 3BE4C3792F3405763C4BD93EFC3B4FC34193439561841BA989DD8D9F9AEE7A7B 24AEB4654B35023C9720B8F31AA9452E29753FB7915CB29977E725611E37C0B7 784BCC26FACF8A7A0EB1E54290D27FFE52B2D87FAD080AD15EE1984C37E0EB30 122C3012D3A16B09C28903D138352AB5462674B6CFB63F1371768D094DDF288C 36FB9B58443F872D61F2CD8CED42FE0EFF3D7E9952A172BB1AFECB60BF79F2B6 04265FDE4F78BC9FD619AA733CD0412F1D9A7C13B271BF827DCBDC8ABAE24FF0 74D3C220621D7FF0EFE62D835A221D0A7C139E2E6681FC2BBA58FA3B80D416EC 3854C63BA040A4262B458340DAA18AA6AEA3BBAC61615CB85982B18664D3D3AF 340C65B969071CF2D0CABEB80E04623D0526F862ECA8280EEE236C535F70561A 854181132E677674AD5E14C6636F57541D3C832D2CCAEC9661F0BCF9863844FD 9167AFD9AF6F4204D2B68EDC823975893E7E2AC90741923869C3B68CB95003D6 0C4C1EC312BB0F0875F1B3C65FF3A58DADAA3EAFE371B5A3FD1769EE04EE9120 9EA510E5713FC9EE026AF61095FB98F6B3822612D581CD73C84D3E6D1D34678B FE76705A0CDA89BFF962063565A85647DA0B35962662EC7AF37CF7A281D1BF60 F6C7785D672E51C4F06415139B6F5D00ADB33F48609533A5593457DB005BAB2D 41A378D78602BD48990556F6D233E2354AB3F0041049226C08D63D5C3E1D2BB3 40ED5777F6CD4247C4CEC16644EC1A568D5080DE69CC899BF3FAE378D87D362C 86DCC7057DB44FE8455E1853552A5A5BE529FA8B50622195AE045CEE5D124899 82023710C21651A3D204806565738887E6BC9B0C84070E35420B4B56C8D448C1 69FC59D0D59BE259AB1571D2CA71D4D1755D39ECF3EE04EDCDFB2E3B799611CC ABFD7C562CDB7AF1B4697357329962D441B5683BEF7C21EB5A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI5 %!PS-AdobeFont-1.1: CMMI5 1.100 %%CreationDate: 1996 Aug 02 08:21:10 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI5) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI5 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{37 -250 1349 750}readonly def /UniqueID 5087380 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F 5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCB59CC30 728C0DC15829632716892C6A528D0D477ED5BF37DDD66EB546B3573388069C8F D69637F909F7E7E9B2530281FD7213C524B624A385EEC4710A6E257A0B32FE75 FB1C2740E8CAC80A38EA219AFF472EEAF134E80B459136C70C3EA89F9780CFE4 80363EF5843F8DB0199258397FAC29CC0144F42F61D3E640F25952AD0AA8108E 9428441CB234C251AF10658EFCE8A2414F5DE13E4BF4A8A1CB98996AEFF338A4 215944347B73FEC2964743BAF12C5F6D2E65263D78D8D0CC448A9BF43A5ECAA1 63B6B12009F36B8E40F38D64DA2CC6E05928DB650F58B83F58C8E43851DFE10D F2D1DEEA0FA6707F375983FB4A7944C584556F92041018137389302ACF6A8869 910BAE01803A35DC2C98F51A44071D326A8DB559E7E1E5953A25F5BBA7937149 EB141465F22B23860CCD7FAC63FD67E2EAC97D8779483D93DD6C7CB714FD1BFD 14A37A76BF763136FC50B6B749A0DB2B1F6BB8D7A14B64C37C7890167A283AF4 CF78AFF918885F53A8564AF3E27A069DECC4C183BB96B90272451686120006CE C2AE2D80A4DBBA92DCB6CEBA708FA377DB5D03D6C96236D8A5AF5BEA8FDE3068 F9B930EDE93436131D4519192D87D63203CE0CEDE339082991EB87981783A8EE 8F722B3C2DFA0A923FF547FCB622A0A042FCA5B8EB3224754E95C05B3EF185A7 F48151C052BDFC3A5A6315D5A1D16FA082CBCA6D367DD5B67C63C75E594FA541 8FA5239A857B6F5510C846E5568BEA6A4AD07D2771778B5200859685FCA95864 5CC853463D0FADC06515A866AD94C9195893D88B37870C0B6D9390F708EF6C82 7694930CE8F5BF456E53CE3E500DED804FF85523AD8EFF70AA67ACB6CEE12823 0547B37BBA574078D1A5AE1584E0E85CBE6307B66C7F106572D119A25B8DF45A CC83B5A9DF8F031C2EC2FC013F5095BD2FFA0BBA2A45D316131E464287CA3AFB BB693E37F3B13B7C500198871838A6641E71CADAFDFAD31E55ED8F51A5446C61 4492913B2971562494BBCCFCCFE2D7DAF325CC6C131C8B993429A85DCD988F58 5397E879407D941D0D9D9D71768D13F775FF1995F72FA79EE28091F98CE9E778 CF6042F6D362454DEF7EC0A0DD3DC204559F8C3E8AF4B787F0A20150BC1724D8 91D77189713F6D1B98A0E48053EE4D18CE7E0254522CF29DAADF2956743EC066 88926F8ABBB9E80E2F91C5EA3131A1018191D5B884EA0F0A4290EA403472D26C 326C20992D2AAAA8A49CE3ADC832385625C67E7306FBD0C5BACB3481ABF6A36B 9DE7E12AABD4905F07ACF22D3813598A2B38BA83190CC57D3D506344322DDEDC 2456566D4EFA0539B1138D900D52F18DF68481C539EABEABD2EEB99CD2199068 FA557A9A38AB3C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMEX10 %!PS-AdobeFont-1.1: CMEX10 1.00 %%CreationDate: 1992 Jul 23 21:22:48 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMEX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMEX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /parenleftbig put dup 1 /parenrightbig put dup 12 /vextendsingle put dup 16 /parenleftBig put dup 17 /parenrightBig put dup 32 /parenleftBigg put dup 33 /parenrightBigg put dup 40 /braceleftBigg put dup 41 /bracerightBigg put dup 56 /bracelefttp put dup 58 /braceleftbt put dup 60 /braceleftmid put dup 62 /braceex put dup 80 /summationtext put dup 88 /summationdisplay put dup 101 /tildewide put dup 110 /braceleftBig put dup 111 /bracerightBig put readonly def /FontBBox{-24 -2960 1454 772}readonly def /UniqueID 5000774 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C 6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 DD4DD1C1CBBAEE2BB90850F7151E01EA5BD583E5AF51B201EDCB8EEFF89369D9 E58CDF131AC4F00F9C2FB8E3293981DA5AE482A65A8A62F84E10346CF111F52D BDB2EA1B796B2F9CE8FF7E541ABDCC6B61DBB64A639519FFE4FB4493773F0388 8E07F5E8C8BF375757D8AF56F94A21123C42DB283D14D3A6C60190717F774603 8F22F695CF4B005885EECAD9356FB802E9FC2D8D49F1CD10A6EA53E8E5C2A09C 085304E2EC5AE93DAE9028BC5B8ED547F2485EFAE68499F752FD403130327374 B8173BE9B1251A21365800645CC1F0FA9A5C2E66205E891C7654DFA73DB944AC 1CD307C6D8FCEE579D2E99A8EEB009324886CDC81ABD58EB94E875E7AC3FBCC5 093AAE6D22FA1B47F7311D363107A3D30FCDD79F678F5C4DE7BFA678D8F3D3D8 2D90E6B1B5791246828D2F529A5CFF9DF90545D1B5F6DD662D893D2DDF06E6DF 8BE4C615534DED2AEFC37605EEE878F901386B24BD888C8DDA702DF521FA67C7 0862B7EAC5B51BE4BA74867C4FD5E857305D7DCB7FF8B7AB95306276E30EB367 A764272FDC564ED17F5C4A548358DA8D1FB98AB6FB190CA0DBCCBBB50D89A9C4 5A137391E847B16C5C7B8837CED42D5B816DFB58BB6383838B9164E80A491645 2FA2D3D89A557E0C97319B94E4B09EE05D767F32D9BCD9CDFC51F5EFB31E3F72 263DFFC579714C25645A2BC70BEF14A8ACF7ACC56BF3A36DF6082824C775DCED 1B16B5D33D5E9CCD36BE31572980E37023657463AA48DB928B3BEF3EBCABA968 FB2EA0B3778FDC53A9D492A4F7246A5D71F8687C9EBC8502971E402F0FD8BB14 B2157A2E11D9917E3FB6E709416B610A2866288B29F83AC7F686DD5E15E3384F A8E353E1B35384BBEB446D25924BC49AFBB38D9FDB90D4CEEDE454FBFDB444C6 49CB3CDBC8C9C6E0ED77F2193B0EAE493B29D24C4801E2EC01AE367AAFDFC514 9C44F7249C5B3B764189E9A1F272A072CDD6380C545C2103FF9F85BFCD1E5AF4 49DBAE63B3D69433481C220120BDA1224E86E04225DC3C4F0A5CFBCAF5E603F1 020612DDA5915DF96F8BAD56B9A677064D5FE0FD0D5397E0C22F6CC3BDB6DEB8 95A7508BDD6E0A1AA5AA702D5CA380BA6172071619D414EE4A4BB47BF9D27CEF D6937F990A995F8DD76CA6F982D15F0937349AB2FFBE3D1446C92BB9415D7C4C 4F69DE01AB526C57B564523785480F2E024D680C00661051FD6D9C76073888B6 0C14002B16D83EF1CC7DEE761273ADDECBFCBC8AE6D0A205596ADE6568BE9948 32889B34839DD7E76B0B72ECA5BFBC8D45F5ABC71AB1A16D38E5B8BAF763ECA2 FDC28C7770A0F4701D670611FBA4AE68E2F62E6A7A1A6D36AC83DF6D2086C2CF 019602DAB76FD1F9B9956F820AD2CD58BCCF37CB64F901AC7AF716B8C0678F93 C6B8CCA0E2DDE0F90B888F36965CCE5DF5DE24795935D68A0DB69E88A0FD0D22 5E363C7D430082665B52B01D1A80363C3AC8C2D60143C7423BD16127826FFC50 A278A6304E6EFB9543FF7A913FDE07F5D88E669E6CB775A9E12C453F6E54C4FD 602EB42DE2BA90AF3089EB75099F5A0F445710CEAF167D70A240CC760A147C43 3ACAFC7B1C3569C82C2B82CEF1097F440F09055654E02E1CE4EDF90AA012B5AD 3E8FD5F9167F87B4247DE4668E066A81B5F42E6262D58897F32598D3BC1FE2BE 511044F18E0872D116037DDB51E86657F9D8CF28709A6C1EDE264925978ECDB3 EDD051121266DE22A23F5BE8BA044D3B067AE32112A7B3D345B17BED50F3E794 5E4E1FF953F79EC551CA46FCD304241FE68EF2BDE26AF0663210D2CAD39071B4 2A99C366ECEEF7CF55A6D8ABFB5376712CB1170360D4AB97EA7196B37851BAF2 3F8E33364D6154C3D3FCAEC6F52B721556C0E5F6A573D40D76457A1462136A6F AF819E857FFCF225630C3D75FF8C518342B4EFA43A3F0CFBFC5BB019121494BB C0AAC6EAB4CBB5595DEE557C63CCCDABA22CC0694C979FAFA67269E23829751C EB222310DBD577A3ED7576344E74310FC5EF4952F06B1CB3B5B36DCDC4FEABAE B78FB189596257081DC248AE5D7A071A5537D95ADA9696C81CD57B3C2E387DF0 3A6916F79B53ED6DFBC1060D79A7528D91D533376A52A10C45147E0A639FA79D D527F76F5E4AFDDED19A84D1596E7969DBEECCF8EFE8E066D1531202751CA6EC D2ACACA0CBC7D25A70FD0E2704C2B598EAA2C0D5BE27AF402BA5F8C3DF70B790 860437CFEE5439A2D93395A4B17B74155BBE8A5C84993BBCA2D2F07DD308C79A 79F9072D667FAEB07F0E0038137E414A41B612C157866347E19A719F1F8A952C B73EED9D433B0DE06D7BC2D0F8D5CC04C6A12EC23B4DEB91F1E7029E048F1331 3A4641A7CEB9EF7E10D4952791241DBA54BC651AE09FDAA4D04F1D55B9F73647 2CD44343BDC7F285F9BD02BB3428E320E6C09A5BBED4E112FFBF01141083C358 BC5CB86E625B1EBEAD8B2F835313B815F5AC6C1F506839058854E5B8AEC0BADF F4118B41FE16BD800AE4E77435341E6B527506075A46EC36CBC7BD0281F21278 4AC33EB8F921475877544C38E6F6DAD4A01C2DBB127CE9E15E7924CBA8054E9D 0AAE420F3380775C82274FCFBEDB648138D0DB0A066F127DEBB5B26F82013052 F8BEA24C33B500A3F9B9471BCA8A11276CC1C7F9C168D22E9011F187BB0B1089 4CCE53338957B324D74F30A6EE3893EE891C5A14AA7F293AA227575E186A495C ECB3AF2D1B94461CE24E6AF217556C97C9012AB0023749E8B9614A03A048D8A9 3BDD1557B2D7117335EE50710BCFCBB8DF050B6654608922353D9292EBCB6A55 812511479EFB81DB8F6177701C1F2A8F9DBEA81DD1F70FF8C283177C661D807E 86DA54EB69D76012DED1C0F5F2D4970ADF79BD5A24BE460B0F7F55506B4DA06C A3E212452247DF6B978DA87514D46E3CAB7740B77A5B555CEF5E5B4E28B0BE22 0002878F86F663219477733772D475D4136CB0CD8E22AD695CB90756A5EF8DD8 541CEDD2816434882E3B55D24177224BADEE25AFEF6A70E280EDED9DAAD22019 F9CA985CCF5D4E91F3E1990585B8220940FF131DDA4ABE2BD7F6E60CD30D1B4B 0FA0C664272F49FD7DF62742157A3A44F7D76BD03F2BA7F0FEB626DB7673E1AD 4CC054443A8C6D9F6C27EDCB584243CB5DD1479094D1EADEDFE3BBD423F52962 42BDE893BC20A21DE26D2CE0F0F2D209FF7A38628D8A7AE2FBDBFBEC63CB31A2 CFD0B0425E27BEFADC85D279E0D64B5B80FF0E605EBDEC8518B94AE31F3855EB 83B4BDE8E95DABAB9477C83A0DBCDCF7E4E66C4FFD5C266537ADBB988EEAC0BA 57DF18B3C7EF41AC390B4E54D68D226AC01D511F2497EA9EF09F44E86DD08C3F C2020E06A8E3E381E370A6009E8C26A0CF0AE684E51E1F09BBB85380F9C4A78A E8C9A4FD3CDCB85394937892E73B4828FDA3DEE101DF7D82D9295D746958BF79 345F77A31F4395C03FC513319B0FF3B52EFBB1DBCA3D3850BC65F2302A1022BE 91F04EF0C0B412BF38DD6EF37BB80B438A404DA2AEC5F555829AA103190BF9FB 75DD0E66123785E59B555E49F050CC510968CA50C5701DCF8B5AA749DDC1339B 16C69C9CAD74ED1C14C828FE77FB83F83C6DF33BED75C08579AA7D104E4FF414 0B85AA3AC9DBFC9A92D3F5B2D5378E4DD64728515B51B72F5D5A56090C51AB0C F4A423E6FDB6B0A46D3BA68E7EA0B7D3FCDC5260B42F8233BB9BBB6354EDF3F2 6DB3077337F8018CEF98F78DA76FA32D413C6A63EF2F3001E6B9F8688D6B93D5 3DE5C03290004C816A57E50ABD825ABD622BE39FBB5880EE3141F310F6BAD5D0 7DEA669D733A1307E21483C9771DB9F39CD184B973D949742B72A625996FBBC8 A803CD2DE9B22D7F8B9560A9C7E9C0A31840BCD3952B9FB0D28AA30B5231C445 469B18BE863413FE1456E71309A1A9B8DE2FA281C227D6ADB053DEDB86BC7841 E89BACFC400F7A417F37CDAB2C1BFB55FE6351C58D2ED8EAAA88741F1C37688A 1ECC0D3605B03CC22C5AEDA263170265CB3FFD8E1A279B87C39B25D16D2D26D0 B0787330654D108EBC79AA1DCE26EAB4BF652FCDF561DC734CB3828E95F1AFA9 D1832849A96ECE8B86BB55FBABF4D15095A919BF28276CC6589C54A75FB62DFD CF09F469EF953F70E95BFADB4E68F29751B8F127B6F413C9ECFE4D31146BAC81 47FB577D77EE923643375497B952CF13DE62EDDD88F63D4DE343422188296B41 CBA976A54FB06A7804B5195F880B599D16E8E90C1AA6B7294F13F668C55EDAAD 5BB12E4E75A9B9F68CAB989392FF9BA1599AEAE2498715AAE6667E68C94AC6BF C6555115552F1E31EC0C495E9939B68448AA1C92A8E236FB39FFA87663EBF288 2707E008680E8BAB49CB8EB9C9D0E229C15805 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY7 %!PS-AdobeFont-1.1: CMSY7 1.0 %%CreationDate: 1991 Aug 15 07:21:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-15 -951 1252 782}readonly def /UniqueID 5000817 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 868AEA25DA3D5413467B76D2F02F8097D28414CA77A720CD4FF49426F88871F5 BFA6E3E24BE3981E341BED36C9C040B10B8F7D2150B2339378E61001DA2934CA 877EF31025B25B9D0774668C7BE30CC0BF14DFA2B8BE800DD5FB6A407C7D2709 BCD45319F84E327234F4EEF8750FFFB21FC286D2E324A41574083DE97C76F08D 7F1B3B9678C32CCB999821D7F6FA04392CEF7103EBE29D0A32586FAA95A2FDE8 A521BBD50D830C4B82DB0FC812FA63E4456E3F4043C929A808240947340437F9 1C6EEA6F058CEEA09AFEC075C943FCD91F4F8F28A8FBB767029E3B6E98FA11AF 02573FCDFEE1796E88B4136F26A83800B10E7B20EB916FCBB8C18EBDF1C34EF1 7A9857D0ECFB53E8F7F155EA76B1D521CBC0779D971A4393AC2BFE6D2DF61AA6 F4B7AECC5CC2D60EB3ED58945044D257F7B8D50AD899138D2E6D563EDB842EAF 8AEA315FBB92D3BB667AF6E8F024821160F9233E591C9440C052E0EDF5E75261 D1A45C8E1A80059DA4A95AC669E70A6D0C346BAEE876F4FCDD1DB0275EA14E47 B08C4C753A9E4B3BBE9A1359BD58A5323C150661872FCE5D629A32F9469CB64B 82542DD29E9D983F66792F3EED3265537431E1B5494795D3D6BB5BD1694CE987 B1B3A1B8577407EF4B05AE03A00EAB271CC2CCFCA44AAA84E88356FEB2BA0F21 3441E59908DE77291B116AE8949F31D0B95145C2841598D9A9671B0EF01A62B9 F8BE9C9CB25735FD5838CF5D09A6DDAADB976582CDE6CCAD35463990CAA39399 B82DFC2A446C7EC9A3AE2476A9BA8317D29F4E3E748B7CB5A5AF3AACC64FD562 86FC06F6D4EABA161D0C7942D522038FAD1DBA47D50BE351B93735C4A885B622 3F029AF61661C9B55864C21A61BCBEC28C7770A0EA64DD56C6DCEC6D974AA7EA F02E6C1D8D11AF83527E8B7A72E735352E5F95FC2593193F44C6E5CCA1E057AB CEFD104542B6E7E70DC4A21593304D20C700CF22BAD042E2965BFEF1067CF272 38AC057C93F2BE12DC1E483058C2048E10C191D23DFD90788438A7A25818EDD8 8922C2D18F9A9B751248F8ED10C1EC7603F2B2CA79F43D63E7C9E7E96ABB6536 94B7214C1FE17BBD296CBFE73906A67E006BB363A28BDAD45F3E8EE88D7A3076 5B3E4D84B6FA85C118A6096DD192748EDC9CDC495F20597F4F65EF5BDE842441 64B2E6B64239B9D5BC2013DAC48AAA895B35B1EF11D6E1D6CFE6868E5E929541 AF6E439FF20DC6575FAB7BBB0F9BE0C11866ADF0F28BF421581C4CB53EA64F94 04637360B9421008F6AA6B76496DA9F4905C9D93628F6F2FA806C939E923DE31 20E618C9CE1239A7C865C129F072DCAF4E1F51D429210EFF64F38F1ABF5B26C0 D795C96A2CF26DE870D6A1B5CFC34B5F0C5EB67C377505C2B97838EE9FD07011 1256AF79D7CE1EBC36C21E391D47B3BB91719F029DD674AD38C2064414C15083 4436262EEF8ED0283F4A85A84ACB3985E1B2DCF6798CD7F91C8B2B72BA13950B 41DE4989788E6F50FB6B0601461CE2AA7AA8FAF6AE85C705ED355481AACBDB77 18D6E20E877A7AA89C9D88C53490241C87E8C0C22C01DD04AA744A2B30651E14 AC4769CC55318CAFBEF337E1128CF871441A47934D051BEE389781028D97F4F8 E9F91C850CD3B0B54708B292842DD96FBF60A8BDE2CE68A117C187E2D14D2332 C0243E275E3F268412C305A7FF02124ECBC3BFC06E085898CC955E1F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI8 %!PS-AdobeFont-1.1: CMTI8 1.0 %%CreationDate: 1991 Aug 18 21:07:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-35 -250 1190 750}readonly def /UniqueID 5000826 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 525003F3DAD7933EB57E7DB1462E9D906F6D8F5BF740206C1EC5F36E00AAFF68 F3EF6F3A2540E5F9564D1C215BC1E7E69C7D04DA5DB1CF195613C9CBF4BAA360 84AEF3E10E24877FBE36AD731DC97305BDE6DB1F934909FAF60B8E28561FBC57 0F5B6225425BFDE8F0C71CD4507B82FF803E9A301397975E38A259DE1E1B4FC0 06BB1DC2D45B987A2268A77CE8DC025CB0D1B39788BBEE149103950650171C94 5FED1063050A90BD38605BD9365D1C2AE42A7DA3DDB9A263FE10BD487F63D908 D4F02758BD9D7BE53E6353A25BEFA29E42B50C1D078A8B3A746EEDB381CCE36C 93FC4BD1A8D1D6ACD0D355E948CFE397B74D243EB51597D251D0BAE6884D70E8 FEE119462E1939A9783414DF59EEA5FF1529F13869D1FF0A44935C5198CC5DAA E1FD2A17AEEBF4974052D06734A409E26C457C06700C55896C90BB33E044A737 46590D9FA242819B9527FD59818D8829D4EB2D26A34CC05A2CC063E66F2DF193 8E4F9670014BC243180E45B51DDB05AD1E6A7F619EE1CE09CFC1A4F02CB7270E 4482FEDF673EDED38EF3173C475C34BFB3F6623C5E942A7797FEDDD0EF1D54E9 1D90D7076C0A9687E334907C22F2E7C603388D8D626B0E5A62B7543DCBB575D7 9A6BE1528EC9BC18570001092524E4FBB02F3B29293BCB4F0EF14A2DD9DB22A5 BB33455799E8120D2A4862424AA4A382972E2845E042506FC8F6E201D11DD0F2 09FAD8DC29C3E12B66293ACBFB13FA0F26238981F2CD52B47A8CDE6DF5CDFAAF 3113E1A6366B806EABA9C34E5D41167CD10D7B639021FB4CFDAE28CE72A93F3C E8929A49C31B778ADB8F79D145E742EE49F9F6256F6F0E2D90DF8A3C29ACF32F 5A65D50EAF617348D2C135E8143280E19C87B90333697DCC314059FB683F37E8 517A760DED7BFA9F2BD20EAA654579FC0EE428A6C5428E7667805585F570414E 215E56C9806FF8A51D94811BF58E509F7DB670746DF6E4DAA41938CC7151766A 25F55112FC4E345B4B6447EDEBD450C4DDAF8E0E05BBC3B014EFA541E2AB6F60 8AF3D5DAA0DD5E2DC70659716A4755CD5E2CBE6B9E85A93ABE5632685A4D5C47 CA82C37A375D90AF33948AF51C9853AF6B89CF67C5F4C3CCABFB8B6B1A1B777C 8D93A791659BE8A4EC1DA2A433ADEF5D1050C22403DA71B97D2E0CA62EBEDBB5 0B8D6E1B54CBFDC795509EC3AAD400BC8C441E5C1AE744B4ECB8416C496224F8 12D1D5F9868130BE2B3CC19BF2C5B48FA3789262D5D9ACB17230B0F6C87ADDFC D43AD7FA16C7DC4060968E4A311BB83564C7BE8CCAB99DDACCEFE7ED1582C9BB D1B21DA34405E33763F05A0B1F0DD5BD5A16D242497440C54A31D32D05E64B9F 2F580110BAE071EB0EAD6D8B4E4377AFE8D820DDC8A66711B4A8E1028A63E9BE 327EDAB68CD26A111F2BA25330D5CCF2FCB2DB631B54904134CBE9534303958F A3B18E275ED5564A3B43AC9AE2075DACCFF2774F861ECA5B4784507C0E77CD90 5242F133AA12AA8CD0A4656BC09376ED135A02A1D094ABF68BD9F410549DF5AF 6C29DAEA0F5778B222EDAF8073E07E1D7C3B16D6D6C4D18C30D48EB5526A1453 3376FBC861E86D2860E5D1F0807EC25EC583F16B7D4C0D96771B3C1BC8D5C2CD 5BB3284DDA59DF217B2F4B4CC73D6725A9F9B6340551EE42F342903294D5D05A 53C33E368A49D8A852774BEB4A3CCC2DC8D0A0AE2CDFC537EADC7EB326786C5C 0A20DACE36D8277E4BD31715A43CA0EA991FFBFE6C78525578291271021E0F1F FEBF6EC5C7DB525DFEAA7FC79382F1E99B518EAB9FD143FF33A38F630D5A151E FE43058F202154D0DC1B9D3A608D5E01F36B39D57B52498A2F8616A4163818D5 A9D84F3F4A1C7BFCC138CC711081FC083FDCCCF54DA653BBB39A168C8604CB65 DC36AE34A2A4A0A7FC8E58F97B8B10D832F2D25CA854C9CA17F48FF0AD177A34 2499FCE1EA64491A490C15C4E1244A6729DB9E063B5A86FA00D90F8D1343B977 4FD04486D78DB7CB36FDCB6B5D669AD8A8B0043360367927CBC4F941AF2F75A4 E980D144AC40A87BFEAC77580D51860C939DED0C7B9981E2F43344B05D313923 50B06A9FCBEC6BB34C207111790F4CDDEB6D3DA6D6A7175C8DABC145B80F2591 FA8E4BD0BF25BD21E3493373E661B86908352216059545C9D0163ED62A69231A D44A8E87081CE683908C498C87F2D4E708A1E78D12778F3A7FEFDD1987419F64 B4A53DE7A8967F627DC5F09810C603BBC9F998CAE244B506F1B257A18496DC86 CBD35A6A1EF1E41873813F6746E12FABC2CA84A6842E84813E2816227C3D8C56 0B24DC953E6C011A5428D2C09653655AD7135E2EF1B24DA7D4940708866BFCFF D1EE4BF2B24A6E52FB2F0CDFB3A85DA7078C4F52EE4F18B4E08E4FC88CA4D98D C3449AB98D8331F87E1E2789F832C2AD51F548FFF91AF23E8EC2851EF05FC83C 7BC3B6D756977EC0BF3BD6C5CE0D61819F53F70DDE84367BAE36A7110B7E0465 DABEECE43DB7E68555DAA080CCEE6E22612EE096C02B84299C1FAAE4CB06869B 0CE8C80C8E6A2AA82514BD104E65D38E80402A49091984F55C064C675F1929E6 AADDAFC8AF02E4F4AC00277B9A35D72F6EE991B45A45EFB6C038453A84D1875F DE770E9FA7C87DFAD675FD78285E55AE7463B1DA199E1934DB9448E682A2C47D 6B04AFA637B74493BF5A6ADC90BA536B945B354ADB25991C1C634A102E6CA101 30EF63C7E83A13944E91D9B4EA611DA32DD5BDDA6CFEA8CD4E5C4538F9F01104 28CF92D74AFC8A1932AB5D15647FFF71331F30ECF0FA8E7E1344B332C87D6861 6B300B29F8752D7F8376CFE913858314FBB1707F2CCA44233CE3AB845754AB45 9D6370A4194EEBD29B496346126F2E5062023640A684105DF3D17173C7495A6D 0AA35BAA8F10BFAA18798F2C0F15384E9D8618F0A5BB0E71881173A7366A177D 90A9F58D2286602CFF96C441DD4A5F4AF5A12AD261891819430E0F069C38713F 1AD6C9F56B674566B2605744CF9E0F494AC4EA6D55F160338B5104C4145C7F64 D2AEC9D748FB99BB3ECD6F2A5422971DD9A7631E2D7F8625AA649D52768A5DFF 0D4100778D048043D55B861E75D077A47CE3D1937D23196D9F4199AAA5F50899 20AE84C0E04A1E7D492ECE41D302B718829A1DF175FE8C08137FDF748117E6CF 1D2C3373B5C83F304C3ADA274ADF35D946A2BF3875794560F4BCE379A3516D4D 6D69001E12299DDB9F5A15DF4AA2B2BE4A4293457F96288E9557AA0386198014 0B0CEFCDFE59DE3A1EB2027E19E7535747F5B8CAEF287DBC2E63919951EC55A5 1BEA68FDE3A25EFDC622C8F3D284D2510AE643C805835195DD5745A0FBB225F7 49D0B0378B02ECF38991DAE114A0DC645F18E48C95A858E887A411CC115B9F90 A2540D2D4FBC888FE1CD9371F13C3F4DD8EAD664D24CBD30211C451CC6D93389 B5FF65E1BF15F7966CA0CE2121E38A588A26531F673352308AB39BA9AA935835 5541F8412E086E1F2DA04B63185F06E0AD22AC1032F36F8F0C3348DF3FDF4A2C E37316DACCA6E9F5D886BE77A53A2DE1FD27C6FE6B6E6B06C6EFDCE717589985 F915408E404450EA36E0EFCDE63886B6727B87F9E196CCEA172424C1128D0127 7AE96DCFD27630F8ED54703C0898E8A9EA5659B90A1CA0DBD9AC3F15478B6864 7200B3F66E725E5FBE73BBE608CB56E212740C5957EFB8A580779E3794E0565F BD6E5AF538115E000121FE6EC1A64D53CA943F238658E320B4BD5B0EA0906FC0 8F1FACEECD6643996C27C1D83B05E95F10A5C6BEBA7E87C016B73F58ECA6BE76 E6643B1A45FD8CA965794ED395064BCED2E0B46A4898EB8C959B64F427FEE266 4957CFC0C9C63DB6517315A3B3C844A21E56BB1B90A10CB2219886476991A6B3 E1A13B9DB1481DB4847C29291B09F2ABC9D8C5F0BD4A72D8694308FBE0A1BEF9 AEF3E8310C3CE2BD221C31E5EB00D265972E72B83FC82FFEBCBB49C68FCCF70A C37DB15EA2BE64C39A573F23F45582F60E8182A24D12F020E322A84072101088 8BBB5F8C6DC2AAB87418DD5A3AB9D66BA4B87B686E16CCF3D0B9D4A58F5A7CAB 3AAE503FDC86FE53292BF5F50C8B5CC57A9E5019016932C21C88FCA56D6ED7C0 84E788636732D0D6874DBF77009F99D6C45E8A394F6EA850B970E3F13409944D 7A39E8EC20F1A740164105A251E88392F1F76323C365C53080F878673FD77EC9 5EED443FD8ED2DB459DBB60948A010F2BE791BCE8086369499219C0980CABB97 3E532E063D85854AA345500E9097643851DEB9BBF9E4D8A707570AE9C448999D 17AF475EB59AFD5416D8BA443DF5AA11FD0CE1DE7630241C7012C40F7E72092A 0DAD83AC5DC06973D5E746193BE35D8AA7A10C2BE4007E6B776B34EA73E76E26 39CBCC8DCD946C2F63E9827136A856ED3CC6EB8A6120AF3D1128FDB85A32407A C004F108F245BA3D88240910ED8967080E2C61C939FB9939BDF5316B0EB31F4C 328788B008A6CED9016D77D599861F7648A6F1031B32827DB22E758DC129AC5B F43A946335045D594C24C03BAEFB150595EB9984DD576D64D41AF57DB71E478A 7EEB066175930A2B5D644AB810C17D467433D509F15897A8E92DBBE5565575FD 04BBA71133A50D74250380BCE7EBD70E05818F83B8E187197006380424AC01AB 1150A7166748DAD6C4FE0B28654927105B0A8881757A11DAB9D0E30612DD284F B747B2F466E021A37C37563A71D81F8E884A051B742CC9C76CDAFEBB10C962C5 881F13E799E0DFCC9D120495303070FCAAB29B335C1C08B52A866805B5E922F2 3E14E1B6A04E7CFDDCD1C01EA1F0B6E81A8B7EA3B6DBA855947CC03B8EFE9F15 441193CE7382FE990C2376A6113BCFF1A1B3C53234306D94D78EAC4336525442 567E4A99D555594A0B952B9EE308C8B123889B673B286FEA7EAEFE3162A81F10 D6810536B0DCE5FBEA95561AF6A63DD9D14C372382DF8F3027716CCA81FF9997 C2DBA3B3F4CE80231ABBF19319531A3CED0E9209CDDCA50F111AF2D881A7787F CE9D33E499F6A1C83211927D4EEE150FB44DBB9507466682CAE89E2D702ED0E7 B6F44FD7F806174E0A937A7E02B983F411E234E4405F01C84206A509F8FC3A47 9905170154AB9DD6D3D798E6E39A0E513E8819C7AC21743843BDBC54C51A5941 3B97D571FD909178BAC7ED98D71F40E51100132A1812C0330BD53CE93097BFC5 4902951CDAC3ADBD5B49BAC0150B46A026ECE23EB4B9029816D06BCD0889A22E A69CC5C50A7A4DD5AC68C92069E7104677DC7A4CC1817CDA15018972DB0D44FE 57AAF2DE7C35E3F443A165BEA98D252A468D52D3826855E51B551C37D5246912 75244402548FE7F45C3A2D1437ACDE9927FFDD791DE6E30228A2B47FA759E94F 91EFBDD517E4DC7EC63771CADA22BBCA85FE4625269BBA45E914C03F0C954F3C A9B73A6AB2A8F0273B8946A35A4597286BF41DD4DF011A659B6CFCB03A568683 45A6CD2F9814A70A36701679830E330A3166C91051A4BDAD1FB6EF377441406F 43CAA0923AD4E293C07B70D6A2138D84B852AF0BF58B68C4888ED22D521C986C 892EBC2A28F1643DAE0D3C10ECB44B7DF5753DDF9292D6C545638075DA66FFE1 2B258E268C32F0B844CF7C6BE3CBB7BB3864B3D4CF2E93A52E737A3EF59E22F9 1EBAD01EC81956DB1DDDD2618A0A74CD6C71D27599A3A46054BE61FF3D2E92B9 FE6F7B11CEAE1EB8C0E6D8C91DD20D22EC6D077E69E8507A433C641F8E7877EF 7EC87ECE974A2C9EE391CBBBA0FF36B911D7A8EBEB2D8C92B892E9DD1FD57C4F A7700A8808EF786548A4E939E7BD265348577CEF68041C804312FC91FC26271F 1638B2819AAC7F96D546DD73E7119E7BBDF77281C99AB9AA93DEA67EAB98F7DC 4A4AB38525DAF59C8ED7809EADCBC526C779C2A053293BE4A85E7337BB5AB44A 1D84F233108E34AEC2569AD95B607262C6534B6FD0B3236B7BD669AF591F8014 2C0B8271C3A8C09DF2E2D92A751EDE2DAFC83C6C811E70B5D11A32880EC003A7 76EB1D3D457815B7F37FE4A753E19BA18A3B955F2558200D175689824008D033 2F349FC0B9206CBBCE8A7B89F56214F65A186438E1E86C1F6D49585C375498E0 D92650634524F28AE71DFE6C25CFF9E3371130DFE91B787CEEBAE642E2CC8F71 191D5F8837557C3F1B7BFA015F0173246E5D4AD119A6763486C3D8E6D08ABD72 96B868011A08F99695D10F33FC2CD9E229AAA5D7B313F9FC37382CB6582B7499 E7228B0DC3E956ED04EBDC0A710EBDA873043D6F7656803B5E622DFBBCC88124 74F192C13D9AE92B607061A3D221ADEB0F826CD7E6AE7AF14B0C3353E8AEC5B8 16C907BC2D631D6DA8C59BEC2A37844B02EA4FB65D0E6A92B600FDF67BB4C80C 83664FA0479B00E00177FDD77D3B3E7C063E3DDF29B03CF6BBB846D83C01B251 C00BD09A80F1A7179557B580BF1096002A7646420D0A6F336EE4A35A5F86A6E6 DE2493E2BA17F229FD056BC52DF2ED1593739A0F40D59D73F109063C66577659 A6085F12682DA0DBDB0AB3FC807272CD25A99F0690090D537C97AD4928A36F42 1FC3FD8037B8064953F845CDE64B71B2EBBEEC227D7D641799AF88BA6C7B6C55 602E62FF9FBC134869AD2D98F9F0E1FC938F5087B3B16E5CC49610AC398C612D 42DCDB893F9ED12E53497D4DAAD8E41A6C2339C0067554A5A3F620D55C622533 F85153824950F34BA1EB90087FD2129FE521F1AA1CE3CE683233AD81C9C9A0EA 6C01872DF9F1E499A0624262B8243A6030F0BDA8DF95E690A0C9EA9738EC2CF3 363C105B563B18F3DEAF99059D4BD6DC01F8A3E46A3D543EB52C77A952866F1B B7375F14AB3747FDD04723B1D6D2BE94FAF3BFEC6967433AC8D2B7A6B2A69BFF 94D21C9CD091C096495E82D44FE0052C8DCAC81C6B40091B72D53E734F496125 22C2DA839AD8D90A48368E0D6462AAF2F54B8528A501BB096E5098D10ADEE17F 6F5385694001BFD06A52837C615B012A54465E3369DE5657DB288C6C3B52779E 1314D0DE88B10FF02BBCDA8A01D17C765A66CE526D4621B420771710397F11DE EB9FF1A498FC2696D4CCF4F30AFF6C1829EF003379EBBE6CEAD330DA47179026 9EE925478BD25A06FDCF6BA81AB0C5939654447BC7C2DE30D8FD3BCB3784BFB9 8E4227F060F0CDD1DF1803AC3686C75B61F980D3E5F710BC0982C279622B52A6 2C53386A485529F4414CFE21B4444DFE7CDFBA58B6A49B731593328A0FF747B7 CBD46A5388114B6CB5E7BBFE840EC345969C806D0088D62F00F89171F83827BA DD973271C4F03B0FE36560C88DAD24B6149234148E42EA20D8ABDF05A3F2413B 53C48C17E0EE556FB43FEDB79CEF4827EDD62C281CE5C34C7604B4256923F844 9407A88890CE82A517722671C0DFE34A662F804A2D980EDF435A6265B8559E6C 09BEED13CB526CEECF963F35F1A2E84720A2075DC77BF66B097C5A67B5777C16 4278EEF5BAE449B521F6D0D3830955524FAFF399D2087E1F777854B378C1A6D2 A39622FE88C4D93D400B24AB7AF89A7FD21988544075C1369066EC0B6C3D2525 E6030D7E2986EC03D3C3033A7F6822533E6BEEF10A9401718542AAA0DEBD797D 4A8892E44CDD35D163C4B3CA853345AEDEF51FD1C5E4EF2E89F4512F0FA6F20B 9A33E466DF42AFD886B496BC3BC293876BF61E669B997B6F4463F6DF7B012C02 7E8B373F70797EB89EEDBD89D37ADEC6D01D31B6515685DC4EA405703CD5E4F8 3A78AED3BC6A71F2A82F08284776E27C604C539F87F838058821775041A0C350 507CFBE7E8FBDB1956064095E3ADD1F8DECD51E91CCA4D4D03EB41C02DA468B1 625F992F2154931AE59D8F5B754872A3C324D4C26BE35A81DCF41CF2ECBC4EEF E474CAE566D50BE73F5770033B9035502CD8C09FE74BA5DBBF32E4EABDB74571 8EE5D61D6DC0C8D68355B62C6B87E343EFEBC42E0F2215DE89D754CFEFC341F9 35231E48929682BCC2786C87F2313070D27D606F832CD7F44A4B01A20807059E FC34B6CB86F913C7D72481D8403CA2B295E1571099075CA5CBAF94EE10148EC8 677DC40CEBABB132D17F46A86FDB222B5D3FFF30C37F48421A85F0D84568617D 3BFF23B8ACA8A9BB7F9CABD1FAAEB64F01FE60635A4075C2A77352AB6F73F022 7AE5CC42144B279667EFC694089FB4C00F2500EFC84503709867BE59B90711B9 A12A3B68974D58B6B70FC90AE1B54AB6F45B6F40DE7ED77950EF647E0656323F 172EA480DC469C940321E03AE79C1A14A7B3E404D06C98C575020DC86D099890 F58DBD08A62685EEB9EB0800B4FE451D1CB00EDA078FB019B6376A1B86C6691A 41A1D1A4AB5447E4160DDE5C09A2ECB8D86F506676A177565280E803BE04F89B F3EB44BBCF81EC067C234452D57DFB99F6A4A5A50390938479DE63B424AF0B6D E7056D6B0B5104AB0D1FB50918ACA8B1AA1347B0789A30BD87AABF4388BF9657 A60A4FA3579E84A41E001C495262B88EEDC32E596CD1F8AA82C40987FA3F0B26 E457C1AED6FEBE9786DB2D521523B191323219D650CCDEC89B0BFFF82BDBDDDF 2FD3CC730C61A96A73FF383322BF047F978C8C44D924B6FB7584B7A9D452076B 2D2A11BDD61CD5D49F4B54CF4DA054E06E6387AE2C0FCBEB0694EB4F5B52DF20 F5ABED7BBEB65733C586B115C13B302027CFF008C6E4E0E19DBCEF73330D173D F337FDF96FEE5271D05D15472D1DDB8ABB004540EF185986123098257367A615 4752EB49420A7BA173725C4FDFDB6560274725C7890CE78E3AECCAD4F7EDD8C5 F5A4E96B5BE44E52CC3F21F0AB15B84B04F597F9B2735B6B52E952310A6A7DF7 E37C06C0047E2325687BF76BC239209D621E421AEEAAB9DFF634712675B022CE 952ADDDCB0C06DD3E0B48D97C3F18DD2C1DCF3645F2FC608A81143CB6A592774 82E6037CBB49532E95007F1B2B51E3738ED71FFF078B3461DCE854FFB63BE70E E3A5BE1EDD9393E878E83EBC09AD0E6CE67220786607C8C5F4F9DF4759C05180 DF22371D0FD3E1D875FC585736095F7FD7D01891C90D05E611B515F4EAEFD379 09BEADE3575ED0214AC4C5642ADA85A20EE475BF44A8D9B0096E59F722195A4E 06D8FEDC76563FE626BDC93012456DD8018F94C5A4437758DC14CE5011F7E75A 26A40D04D32A588A6D50386F03837F76BFA88CF4D023B7A6D11063253ACDF731 7E8C34FA5EE774BCB8507645C735F90A4CA959C2752BD687EDAAF63F11632AC7 04D1B6FDAC3762CAAF5EA9BAC6B98AEDF7DCA987C6740432FE6AAC1B6F27CCB7 E3D3B8C993F23FAC66287EFA444534D9D9457A5F0FCF9F69FCA467876C6CA1FF 2B75950F6FDC88A8E29819E6466D04EA7476356FE30A956E33EA05C08F0CDE08 68376090862E8BA97CB5C85E66908C9D6828D2510D99F1676271996A994B32DF 56AF9A9C7F3AEEE451E8D31E9B251264DF880EBCBF9820544485183407A14559 13DA4617E45FBF845A7F75E42C0DF403CC4C6AF3D92DB27CB32EB6C29FF4257A C6C32F131559204938 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-163 -250 1146 969}readonly def /UniqueID 5000828 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 F42EDDCF39AE522A1DC2D80B2772B05DA60F3DC15A815A6BAFEDC399C7956E75 3851CB3588E22936FBFB63A58300298B11C45D82385C083D07AF133BB1BC941A FDD9F34D5E0B8087EF2A58C54D8AB7580EE3ED58AEB83B72CB9028F472ADBF11 05A77651F118824F6CD00209EFB60C1D32D46A78E8C8DCB8B0E742828E3B7D17 DF5200D68189C91FB8489CDEE8BC223C4281DDCA5F7DA80BD5C2D66A14695EA1 5F05E03500579ADD440ED2C57F535807560C6FE3873143D792734FEAB93AE8DD 633BA6FC5683083402BF086D23594AAC84A4868AFAA32AFBDF86142B350F8F62 E2531321E4CCF34293024EF8AC37C603C44DED8AA74E4D3553D21B95931D46A1 C885E7100118EAD2ADA3CBCC6F229DD62DD40022B4AB9D399F3A67AA30EF507F 86AD5299F95135660196943E3193512FE973A334CB98393BDC3EDD6949D60B4A 23D95AD1754193E904DC79F91470F572A7F53A9249FC930A66E5C33CAEA64854 51789DD089D8EBD8EAEA7BB58CACB31B179B6970F6211D625F4410B24E6A3304 E9F10DEEBF7B7DD274B03DC849354A0CCF2658CA3C42333CF191DD78A6581F3F BD16F27B66D31B83EEBA8FCC7E1FC97A4457F275F57132AE9C766BC32D5D95A9 615950C59BD1F769277ED8C8F04C57CFA6DB72DF35046BF659274F186AD86850 708D43E6B6D672A8DF6944945D3B9BB89A94AEDB334884F17A7CB4AF06FC9096 1FCB6156DB32BB6CE4D0944709D89F04358F0656B9E15F7EF78E7A8F8C3FD27E 8E1569A5A7F1EB97D6E1F4001C361BA5C4418684CD2CDE2DF0737079E18CEF16 5736292CA211D4EC59B883DDD744B8516881AEBFBC7C01EE900645A0E8CA9F81 B561E8A40E887B23852AF6B1FBB29A854EDE236031E22DC082EE0E3D9037304B 26C1FDA194B34BEA4DC07F7FE1EB8B5B98D1D6696B18BBAA0E32C64C174BFDD1 EEE3F1232B108FB1867D65486AFA19DBBEDFCAEE3F89D77A16D4FD21FFC06977 25580EF62449DAB824D33F4AB33901ADD07962E012FCEBF94DD58D90A99E1D52 A384107A2CC05988B39457BA2C39C21CDCA8E5D3E2CBC0D7AB52EDB687192E66 C607C30DCFA6C1222D92940580D8CBA2BDF51C87CE91DC28B6808EC3A230F252 CB85295919308507C21504AACC16C567B866A4C13B1FDD625A14E875AE42A840 FC0F422895068E665E46D9A832B2DFAD04FA0447EC603FA7A5D9002D5B67F9A9 C90FAE5FA26586C2EA9AD0C54DAD10892D6506FA3D151818EEB477FA44C3B8F3 C687C7BFE0D124BDCA646E73A3F3D57EDA4A7D2E3C629C1B61286CBD18706386 60C6EB1060C36DC3AF7C328E1C2039D4BA42090E086ED27480CDA6AA87EA09CE EF1F1DB17EA06CE1FEA5CCCBDB0654BC378C6FC23459008910F6A27E84801174 ECC0E3E31BCA195BAE66A97FCFB3267C7CBA84D2DE9960E040AB5A5B59422488 2D51129A148868F64FF2D0EED7AC11EE85DF6D69F27CCB3B465CF1D2AF6E3190 31FBDDD21688B00184992E0E7C2D95FDCFD96A3106565AB579A5AE18C9F86357 B041262F033102029F0E9C432DD3211BAC148E7EA6EFEE16526E05F42F27A31A 8124EBF1DCC384159C0A8A1BA2971CC911C58EEA970D014A197B8FB5F3345959 70239E21734531A5A32F37AC291921A5AFE343F534E79DB4DCFE30DF14645D88 EE43E75C7F9A21D9007FCA9E73BBEEB7E97AD47994356B9001DB7C8A91096A70 29FC51EDAB4C6AE4E5798D18372EF729F2BF599D03C9013D09D091CEAC540661 4A152D9FB6FC642A81EAECB33B77787902E5B8B6DEE688F84839371F3DA5DA54 514940B406592B97408D2DDC7A7CDC9930B70154E42E0916ED9005EC30FC239A F36F98D44A19F295C050F6EEA49F3D1B674BB6FBD2BA497F6DCDEBA67BD606B5 F4A7E54BE8F61CE777847C827C67FDAD7B5F64ED8DD42AA6329569FCE09944D0 7B995E4974741738475D6733D62E4BACD405A598ED60DC80F4B8F242BD63C7B4 9C36F188B916870DBE17E43FD1499D35A81C0F256F8B19837FDE4E1BA7BF4D7F EFC6AC13B3C7939C2D36DB021C435D62A6C64D147522F8AA8C263A62DFC48D13 63FBE0AAD513246E98E43284F0E018B8289724D33CD67154165FA2C4A3230887 BDF574C6E31E352966B18B708CB7352FF7E58EB1691AE4954B2F0AEC722984B5 A57BAAA95CF413A363DA932D94E416A7A8D20686B56A4C43E1F5AC04162B91DC 20A173C023F058C72972D1B9CAF50336EEC2EB4A4A0CD4712475D77AEA5DE5C2 E83DA04574EB581604FBAB3DB98C4349E4831FBD9EB2F90C16BF84C686CD03AC D33A0617F6C3B7F083C6AC4EE0A8841D1B404EFAA1CA2552C4AFF4FDB1B12A80 5D2347E2C67D582D74C6F4D3EAFC3F805B9EDA22274FD437CD2F4852E18447F2 FECBC8CF60DB8208FCCC4DE81C20CDB6D5E863BB4D4EB9FC5292D76E1198C48D 97DC475A19982C0D3DBE57EC1543A5EEF554D5A7531521AA248700DBCAF3C7F1 6A7DBEA619FDDD949030174B33050D24F76F2CF1A17F228C75EC2BD820081E70 64DFED96C13A359F60BABE2564EC059056E73064893827CBEEEF7EB441AA1757 EA2843C7195B270FA2D2C8A3AE3F1FA9B90A7D372284B26A8979E67895A69227 51321112BF3E53A37A99EB7B53A0C7882EC895BD85947C41CE292CDB5DB50709 795BE09B562A2966F20AC2781864037122569C1193B65325E912C8B139DB1D9A 3116C7128A1E7E4DCD06E8E451600C242668F42AA9C1247AF4B603D296E515C2 122EEAF86084EFF0C9D8C746CF1275DD0B523362D531091423C36E4CF601FADC 4447AD01C980FFB02E2CDF8544DB3E679D5E1E103844964B62850CB2F9E48009 A7D25630A76BD2A0954DA1228BEE82C6F716673897E06071CCBC09914C47CFBD 5E080E0BB0D0892289AF930443887BC0D6D58F1486AE7D0A11F00F5A12CFEE08 D51F350621773C4BA4C2DE1CE4BD20FB1C62878BA149AD551A43AC177EDA8485 B96057F625A16A6EA093FEAA4E48533A738AE8758057266F20F0AC4ACF6CD438 990F040FE9E309A1CE050ED29361B10444F60372B4A315A4FBF7CB8E320695B4 53F3F7BDA1C29E0CAD49D5871909D73D93175B065CD30EB33C640AE11633ACF9 41A86DF9E410811AF2A06EA1AC2F57E921BE0D11B440208E484BB095B3F8C1D6 D54ED483B3F277A6732D683E0CBC9A8B305561906DEDC5BB39507F7D05524977 79433DE5E825E0938FE0EDDA4EF668E2D3EAA15ABA728C25AE1E6997AD501B27 F35CFA8EC7755552D3DE1E8DDDFC00DA051CD2ECA11F85A0C8E694027E1E9BA5 F1680FDDCAB45AE92B52D10F3443FBCE4428F47500F5BBDA66739A14EB0095B2 319D045344F13D3C20314A710228AE52F4315E59652C2DB00783069B205656A0 3ECE99575AF8740D8442C83DA680BCBFBE12197261D9730C167D80115101C77B CDFBE219E0B9B3CFB8B51B0EC2364C92AF1431346565930DEE021B7009ECDD53 52FE3D6229F8BCD29A74EFF11DD9BA70A8E9498247B52A2EF015488B1589BDAF E8450FD5E8D19EFAD6D416CE97D5E33F965BDB83412BBFBD46BE799C784A0672 C1350EFA0B2DE72085BEBB240CD6AE33F94928C79631D48E32655E98E99E63A2 32554F3185E7BE9F1648EA05DF72D2A64B73BB36C58A2054CE886AE24BB411B2 A328E3ED38FA4C5B5F10D9C214E3533638220E6C0E755995369D0AF354561D5F E229B3C7FC3F571D9778FDA16FFD725D369F0FF6C3F888CDA728760FEEF92332 424F8119B4573C94C0CA5017616C0D83515F58FC461FC3D9215285920D3D30F8 0E9448D5A482E231C4C37301BB23622AEC996301F67DC7F7300FE7F61D522C14 2217223B2B98D68056CCCE9435631EBDE6AD847C54A41B12A76CCF9B4AE4EAC9 5804D9299DB6F8FA810D95554328A5A05B068A2342B08C9CAE60E2F7B6838867 8640ECB18BF517C2F12BC87ABD556DE8AB396F57A8BBC57067F84A034DFB01B0 ECEAE1373DAA6E9CA99704CB7937FF7099B09F4B9D7A464B185515DED928ED37 20EFB4D2B4A42B80FFFF2817DB66B321587DB148DA1BEAA5A124A18AA0181235 3F2227CEEB03798E5CAE538D25DF5D185E6E16F199BE65CA97BDDBD8584DBA41 6FA2826DEEEFCE13CD7D3A94EEAF5D71C3DF8435A0D8D58185224C5A334B6BC3 A8A9A953E3B52607FFFE17568170619BC712BFDB77A299857118CE8FBF0B9A7E E998C317BE246ED6FA0F754B681F47445C9174D33BA7C3FF99B81AA44ADDD174 BAC8466776CB0B49D83B99930AED226A90ABDB3F489BE74E729D140673AB341B DD66D0836D16D60837C167AE1F3BDFB2FFB40B6E31C82674338DEB534B05F2F3 0775CF6C0B3391A051237DD1D932A8A4CDC13DCA85796D0CF44434664D729FD4 8253EB2EEF70DD89035EA5F2E0451A856FFE251B9E74B69068B11DEAAA8ED766 3064E5DD61ECDC99ED45FD61889887A661C9E29D7C7EC808A0F604B1148A4390 1A22A8781B793CA618CA024E7A4F0F2CA41346C4788D0CEE6C3FB2FBCCB37ED9 903088A4EAB5914418118B02D0DE80324E85925726A76B10D6ED8B00B7531261 933235DC908EBA6EDA2FA6E35417E882776C3A31E8DB88C0C125DAF4159B67D6 73AB8A764A101608157D545E9893603E931BF74CAAB1F29FDC4DD276C7EAEBE6 C7736DF04CC7F957373E9917BAD84C21B5EC1D76FF5AEE5D073C9A02BB44A58F 9697F24DB49FF4B2FA77FAC53F7DA015F1AE289003B0B1776140F7D525A2A0F4 BC704BC36B6C0848B0DFF04FC6178CAB44A71CC11D9356DBBF17C7F935317DEC 98708262A234B6EE8B156650A551BBEEC386144ADF1F9915DC414D490A04DC14 E0E87E5D7366E2FB702DE4ADE6E43ABFF17F226C148A22A73C5C6A1F459D2659 D17569DF05CCF2B6CA996569D7280EF6542BCBBF8D08594F2500570D52038DB3 4A85B3A1BF171633761443747B6FCB799BA9792868323A1323C1D59C84D79F5F 67C688E02D9B41A1FB813C8D928E205BF5F95A081B0EA666DF51C65B8AFA0479 92D8BA53C5938639C1C67A902F64A59BA7480C2AA15CE90FF227E4AA576D4788 6A32DB979370F21D7D49D4258C0C8A0AFF75D73F5F7890AC73AEEBEF309185C1 366D1F6379D08806EA79D159EAFAA02719E253B627D2BBED5CAE7E475F3FC3C1 0AF0B8AC875CD66A62A08A7E60C30E28AE90902113B108279B4EBAC72843C8F8 F1FC4A6352E74C9CF706E8D3D98485B435A7A479065A3251C60A0FDF05756311 40939BEEBB6F06B5D80EBB190F5F36571735EF89F104C40375A6C332C6815D6B A28936DBC927BBDCDF96A08735D8CF2984C57E20316013A9DECC82948CA69120 88A76A14CE956E5548317DA92C340FDD35BE1AAB7832991EB717E1F43FCED9C7 C53F1DAA0D9A71FB3DCACE49B722D1B2D0029B63EA56F31F7A61AA2D2EA5ABBD 4D973344EEAD78F70BA1455BCEAECCA100B62AF13271D6576A4411889F83C7E0 076BAAE04301D8D613C2525BCB5C3560F2350B08D13A4FA35966CA68B01981C0 9379BE55384A2AC7A5E93D486D777819C8F5E581B787E3D895CA34AE533C3CB4 ABB132D49D9F0338AA5CA171F98299C2BC860F207475002B5C554E6830A025D7 A434193813BA73C2F4FCF13601F17A4C84DF08AFC0B8245CA5F4D924ADBA4856 49BA1AE571A51DDE0FD859BD1FDFE3BF6CDF67F0825C4B33B931C45E7C4542BC F763CA506043E568B22A7302E2FD435F9FDA5BC6F4225D0F4402D38471B093D1 0F7268AE95C8E507E3F2ADE7C94AB1CA52BF38D9B9490CC59302EA4500006333 2858AD026D47F2D191520E883E2680C13068B507DCE3CD46270A3D47CFE2531F 3AB44704BB8C16BD3B0E92E83D46A42E240B6C9E113A88297E3F403AA7845826 99E0E3268418C8AE2C7F5B2206FA6F0654DB9D2A4DF54FB0424A4DA427807B9F 186C841F3F5157EBD7585BD03C39C7F1678FB6E2E25CD20A0FD50883828A81EB 5610CC08CF5E4DDBF9E22F778C03281BDC069B6FC2A64F80F832030AE51BB315 C23A99A98CD3940B289FCE67F6B3538604496E4DF5E73D6A0E3CF9C69F47D3F3 24D9CB671501D864276BD9DDB1BB77FEB5072BB83317784E2FD6AFB8F72C6705 1E161954E4A9D574CDBDE0C23E6DEF0B01517708599B00BA6F766FAD48DDCBE1 23C4EA772335518CBCF2A4D4AF6539EA0BECB04825EC0552E22F185BF42E37FD E72083735918E5E8C85BC674B375941155EAF07CB3B1B12B6FD9168533803A31 A1628F562EE66307CC5A395F712FD4920FB88170DE3EEC8ED98CBEC22B9F946B E1E8790C52E6C330299E5FCF389D7CB8B2BA8870C9E57DD51001F3379F59E46B DEFAFF0478AF2C2246C49F5792A59265AF4F72827CF927376ABCC04E2A663C70 8FEE4179E719E09E67278AF025680992F5821542BAE8FEE8DCB2B20A7B438AEB 6F5DABC6E46DB1264D4F918E141F5CD74EBB0BC4E85670EB35A5D5F58DD6114D 3A4A7073C3DB30FF24A44FD0C75B0195E16999A81F5CD5D09D4BC4053ED8C957 5B8D7E8B88F16B111DA82AD63769DBB6ACF2EA62906F4CD3FEB28B9A067D3F30 DEFB8CD07664CAC69DC14BF00B73BAE490BFB75D27BBAB53AEFA5B14F2885A71 5B22657B44A8107084D2F589CFD9B28552221CAE46DA2DBB3CB9F4D2F8F0AFD4 2B6766522874AE8BF887B685768E60EEFA6B175D0FD71917977600077CEC15E3 068F1A648C188D8453998E88326E054C045F83113E78743739E49398453FFB87 EA68A215C44F597B171EBAF92B5A7FB4FF00DDB6732E4F71348FB052DCD05AA4 7D5E74A24F1BB0D9CCF526872BB0FDB4900ECEE7DE1285E4D726A35E9993DD70 541D9E61E310B322A88FBA125736F075D924953612CBD93747BFF7C30505A9BE 7A2EA643F0ECF6C75C3B208A9392BE376FC79BC2D53913B2804309B4AA796FD9 4A50BEC8948F4999824E27E5D9D0DE46A6561F61AD90B7BA726D045177074768 DA9B19549C0ABBD98AFC9238D94721FB9D7FCB3590E2A3CF9D22D6F014E2F58F 96F32400BBE08BCBF2E5CD87D6DF8DAF422FCCCCBD12CECFD0B79C2F27BE22F6 6CF05D788F3C38917B409CE3E939064D7B6A2A6CC5088FB0CCF7FF6CFD33683C CDDA70E8BE2EF32CE00773164D152ACA2B54F1DBD591A617815722287D79E018 2A95412F5ED14ED909B5C942386A074EABC519E26243E0B03E61D2F82C58EF1E D87EDB9A538ECC14040A76628AA7972F4F77CA30EEAF0AFA750281E735173846 C82122F242A59240F6445402C7869737A050AA4BB04E208C6189531764DB1508 78F288C6D918BE69D3D10B8A88D8A7FC4713C36C1FD8BF3373F823663F71DF1D 03CAC3F581D34B115DA0D40C925CCF77C84F10715A43DEAFE7CF981A886B8761 E5B8C3F145C48758675B97E7F3F2CFAE59741E6707694E7A712E8897F3CA5880 D405668F8F7B8138701FE994C6ECC84FA7A8EF207E8B70FD52F446E3ABF7175F 1CF26B534186F52B23B993188FF218E3B992F35406A1BCDA0C3816F92314B5EF 5F2FAC6D3C99C0D14969C53F76AE28E616140ECBC42E5A96E01FFB35117F9348 AE90767C9257A8808E934BAD9ABEFB2A71DB974515193FA851F0A151EC3E7064 A9A886344613DB4322C71CDB3C2395FC18916CA119E891E8AA69AF34C77B31DD 9E32C32636BBE45CCC553658A4D87E91D07E096C68FC320503867653F779995F 4EE78AF7F4BEB95F2FA0F59B4A5419ED55E3879323416C0D1979ADBF5BF86C0E 993F0E4CB663EDE3543B985258D57FCA1A672FCB124BE41AC434B3FFDDD8AE65 DB0B3AD55AE0B9D3B66C3734DFDF8AAE67850910BBE1E5AA6A708903FDCA75C6 2F72102232868B18224390A1E8A53A7618042BC688B06E6C9D5EBC397BF0577A 1B7DB327816093ADFB4E6F72AEAA14CD5F1EAB416FBD3BEF2D0A0EE9058A7E05 FFC68D8359ED60202007E5EE06CE3849ACCC480B520D6C0121F2FF7E51BE19AC B9185C4BDDF58B9CC98F3B73C3849AB1B50D3CE9FC7D689011437CC8E1D3EF27 E2FE21DEAF3AF11B540365CBF259F0E36D39FDD33BF531435D6FBCB0EED5FD28 E5642AF64071F3F50B708DBDE88CBF371AEEC2567BD99BC42A6B93C84F9D9726 679C7657924336DA9480389F69A07682E1955ED4B51F21679B188157BC168C1C 74B4116EBD4053B7D7F0F5070C2A9707ED79AFE5E494A6CD43C971828778FD86 9D9784FD897F2CE80D2D5ABF23688AFF6C9081008BCBA48A400CDE5D2831B880 ECBBDC1779E6D72E9AA67C1101118A6A1D22A6C498803BE3849402F34AABDBE0 BEEFFC63D55FBFB84D7796B279A4B02F32B53524D5C198D9FA3E68E403C5F616 D26B3744BA59118CBDF4C78244972B7B783674BCD4BCC0DC64F32BABFDFF3EF4 F0963F25393236EB56F1C95A7F0569D134779EE4532D981CAAAF2DA6E93DB0CE 5CEA6994FA3E4B066DF34EC46E267D19AA2ECFB295ED5AA703DDBF1E3BD3E0EE 101DB61D175AB817642FEA1600AFD83336C719165E7800433B74DBD0C807DF0E D4D734C77FBB534F766D6EDAB1F04B6C81BE5073EE91FF08902149B185AC4EBA 80CBB513C5ADCD602FB6B54EFB9F435BCE1ECBAE9AB60BCCC27D3243C842971B B22B328C3B02F023054C146E0315F32641C9F248395F6302F1AB5B9FD0FD67B9 D46382C1C6166FEFE3C4A1923EF42ADABF0216B69A36E7DB2377E9AB4F98A718 09FDB60A6F1A41094CD003E92F1C4442519862A7CAB3BB141E9712BC53DD6125 7A12C1CABBDFFC8E359F545A6C09CC8F452D76CEAF05ED131EE025B0D5BD94DB 3D8BE2E6103E5A48AE2FBBC880ED82347841107406278A684C3F5D8A6F0953AE 63CF363533359170E2260E60BF4E81BBD5A7F866373643AA53408A431D2F20DB B004BADD4ED382CD398FB1B8F4BAE651C9925424B9A284E965C302A6E78C9B03 5F24D181B7D90EE76A151628F8A14671F4B9721927B8FA8B2D40F600E06773CF 915C59292DFF57403481EB6FB52F9979D3E07AF871348D4F92CA2D193528DFD8 BAF9515B6B5BA1DC2DDF8C192ECCB7EDBCD2AFC1F54BBB660555BE4CBE35A3B2 CBDDCDBEE1BE70C96C7DD0647ECAC492908047CD32A3A68CA77752E4CE134B2B E15E11DBE1FA507DD2F0490E16AE746CEF2F58A488BB243C2FFAE42B27E63FF8 727B2DC05A97ED8F22F16690FD422C086833C752DAAB0261DA0D3309DCD495A6 4EC84195822008B433EE257D616E7F40243037D0871E09A144AC9124EC2D0662 2C642FA1B07C963D708FF7D07320BB2235ACD93103DC0CAE894E513B4C8C0B41 A1FDBBD04F6ABA3A576A4F3D15F9B4CB46027B6C28E456D9B308EEEBB4FC49D8 2F892B32A913F1FBBD8CE83A1D81B778E26AB60F37733ADBFDF8F172074B52E5 9A3782028F2BE964FAFC76AEAD5796FC2A71ADB9662342947F6F5ABC3BAE7459 84DE594841BB008231576120D689D1EB9CBDED74C67062AA8D85906B685C930F 7169552EAEE91B207B851BD4440C2006B23AE19087DE88F61D472405C556AE97 B10E15C4E132BA88F4994785BA2DD24A1E9AFF60E343727C1286428A438B624E 5DBF06BB22A76287243648EF6926EF22AC0EBD58D036DE38BCC3D2591A72D504 7C5BEA3414553044CB98E7BBB9D83E4E1F5985045D8B6B727989C89D79370F2C A5B82DAA2BAAFDA14264F8DCFC5EB31669AF7C09CB96305A832510E9EB9552C3 622BBFF7122E0A286FDCB4DDA105F8EC72BC692E5AF2F3BC5A81129A6BD172EA 5FEFBFBF97A11AAE56F034DF7C0445463E16AA9E16B777C638D98F7E199E3542 C426941D626943C5212CBA449940F909C5BB83CA3A8F790435BC2C5527C8A44E 8A89CFF2E3153A9410F3000DF461AB6F5DD06A9494E8207FFDCAE4D612466E23 FACC52D3C7F020FC87DC80F79D5EFD0C00C2872C8A167C8BE59A02F4B601215F 40B9241C0C6310E4B52BF03EE7144C66DBA825844C38E329E7014E1B26CD7AC5 B52484A53232D8E55B5D42D0D0AB08EA922E42223F38A1CDD6A4C1337BD81530 7372379D6E0259B1FE85CE2906A5F8F22F80DEEF157F1F71EA777C8C7BDA8E72 13518E6A4F5DC12286B728FE4E068DC1E8E93BFAFA8DCEB69A2ADA6FC7A40D53 10154E1C013BADAE9EFCFC2FCA91F0E55EE5A163125265DE7E9E1FD305CE8E6D 42A4B4341291529F6E4652849C33A8602F139B40FD797C954A7BF0B8DEA3CA08 242DF30A7D43FF4B670927577DCFA58EF099E84A76865A3BD51645072101B840 F5C37A329947F42410CE0B019A5BA09A6792F3E64A244412F998C6CC2CD3F79B 96238C9B9D0411A876B86D1BE3FAAD738FDDEC1957A5A6A8B522CFAB22ECB36E EBFA0AA048A6AD0EBCA9CD6A0B179C749F2DF75EFAEFFFE480AD718F46141078 D5392FFE2DE8753F7973E717A9DFC6DFC4F53A8D5735B9FE46B859A4A90C482D 939FF1DF48FFD47F822965F49922A7829512EA19636DC97DDF295FDD56E0C02D 0A1EF5593EFA99A6B6AFEB76F4D9666C69DC410F8C0A18EC785628A7781C1D73 2A15A444C5F7145C6C272963325C00BB7516EF16FD2844FA4DC93837BDEE0445 6AC1C018A7E0AFF3D072E4269088C6FDB4E498FCF63BC7F19F9097A340F922F1 2FF4AF1DC8E3B0F73F3A472EB9A6E4EEE3BDA49CF5E5C3339B1C7C361E3CC3FF 5A637F7D2BB810F1D626F1F9140A8B28253F742C18EB653A3F78ED38A8 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI7 %!PS-AdobeFont-1.1: CMMI7 1.100 %%CreationDate: 1996 Jul 23 07:53:53 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{0 -250 1171 750}readonly def /UniqueID 5087382 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB 76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC 4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C 889787CDC2B7473D4BEE78E00E265ADB7C0CEA8499FFD60E919FFD60E9268E51 F67A75C3A5115E20CA1335B9DEADC69A8A3120A651BC7F8B2B66DAD22ED72C2F 9CECB3A7A2A79F0905B1433F369F83890F75C90CBF3A8C5EA6A9C29545303386 A3B3EAB79A915589EC02BCB7F6D5065756236676E5F1E93D0099C93550B40903 CB97E589A5B483E7E9D706CAA04996D261120C41A8BBA2A92B780AA9CB95E474 5E7F9CD8DC880F1E4C33956B025C2E450B4B5C68B5F2ED1289BD3FF9CE3F67D6 522F7184EBBACBD4E1C5E951AEDFAB0B357885231BD861B78D708ECD95F4E90C C8276E29B3DDD0C787D2FF16FAF7826531E4950773ED75F22A25067AC81EDC7E CD928EBE12FDB0438662F9F2340CD12B4DA3E3B6B25CD01881C8B61AD88DC7FB 494A56F71171F8ED0CBC73E1E7C3C3B49375158741FCB247C80D9E33E66F72BB 54237775B563CC34E8A1548B257600E5D946FC949894D17EC02FCFE2C3E54E5D 34822DF185237DBC072DAC4DF35B72138A89C3A266E3C660E0922644FBBF2A89 5057F8112BC6B665BDAC6758A19926095C273BD5E7768A876390152129C7D894 1035B7653AD86827644BCDDB656DE20935D65EE977D5B349824598867D02E19F 3142A63C44217EA8D61747E4BC54E7844A3C180B88610528045EB8B35A63FEBB 562D403BDA74EE2FE0F2C9466AC599182C00564C3CED995DC89E187D42CB14BD 2C3E36C912DD63D0B6FF854C6BD1050DEE1171F2E9366016FC8CC907FFB06634 F2893A55A21B160EAEB4A4AFA6D8240FB36F28B88D999AE39ECD2DAD6EB7A29E 99E666795A96EB12E6E3BE8C2A5B38272B8C2388EFEC358BFC309D05490EB82F C5023E2B9773A229F14E704C02D693565ED8F483D195DA42B5FB02854D091684 F92A77FF511A5EF0455C8ACD13C7D3CAA2B70473BCFB88FF5A3EDEFB598959D5 FDFCB44A711F6A725B2C625E8200B63A207F9A70C87ADEB516006300190003D6 3A9095BBD75A26649391CF1ABBC781AFF32F4A4BF5F9E4F17035A7E0F042BB26 5B467FC7BA742BE16F69F741665B48E8B9F5B2784357DA2DB7AC9A90BB08BF40 2F5BC5861950C7D9B8C8E8D39EEB281894C37E1650404BBD081A374CD52C9567 08809074A5FFE364E405B1EBFEA0849ECA8B595FFCC5F81A8417901BF6FA9FFB 9E95655149712459F59875855B2B2A6ED23D6DF1FC02F1E2016818694AE5781C EF17EBB12605F91EBCD3977F3EEE3BAFFDC1B5034CCC9D8EBCBB6A81F4EBB088 2A8075ACF81FF3DF810D7F43966927B77AA544A7DAB045FA9C398CBF8FD6ECC1 C9A99B572F21CEFB0A3B141C44D03ECC009C868CD79DFC0C073E7DF6CC4A0BD7 ABB0FA4975EAA933FA2252A154D6A5AD15BF84FA006396F063F283F0C84C5E6C B70252794024330326F162C381364DC8298B45AE6DEC0A8CA752A337AC75A25E AC5A3141029F468216AD9510785FE45F4C312CD27CBD0B5ECE0F231DD571D159 4ABA5BD87F2B5E449798DEC75D2972BE70A34445109C3C113AE5C8A43F00EA9A C0A2419522B5CC45B4927928E88D956A4B5D36A71BB1ACF86F34FE2441913BF2 C14D5B9E2A0DC4ED4A4067E5D3FCCDF7E769DE7A1C106E04A56CDE8C657E4464 26FE261B3961140323A22B00CFAC8F38C17E0D6A667F52D1399201D2F8F40C9C CDD6AA2A4C2E9C7AA9E66F9968244D1B4F8B851D3F8DF21AB0D1FC88B17B746F 43F6F5D3EABD4DB4D89D3865774D8CC3BE987D658C3739ED3FE02FC586E4B7CA 40D492C3DB0BC619E219198803B1E3740A9433721C3A5891A9BF7B06AA2260C3 121D8193E2F294902E8C28774D938B00CA582E6DEF1095580AA6784F09EFFA84 396F6DE72F12A12CF1BBDA1527595BE03CB6CA7C69E449110C5D8F1DA821A84D 2368BE94E30AD9FCD768577456959DFC4E28E6C8E8CF5022F5B54D28A0FD0E13 DCEF512657F1AC875AE4007DB0A62D58F4DF99FECAD250C6C40046995B5B1EBE 5784715A665CDE4A1580CFCF38A84890C2822483F9698902AE2D9FE6759E13E5 2C427CC36C837DA4F152AB2274A00C60F056775F37AB52BCFA0EE5FF4646957A 90D90B58E0389E17902A1CAFE0C2CAD8066A6BB51243AFF07379DEE3C0631C72 CABC44C3564D126BD274C4B59D52E9749C3C3D9CAEFAF3CF39354CEBC0CB63E6 62EF044C46594FA36482CC4C6B0E7E028017DF364B602F799F0721C3060B1548 F656E0BD53969DF5429564FA4C5DE210760C54D5DDCCAF49F079025609A0218C A516E8869D41E4F4992EC95A644885F6162637818B8382587E98CAE2E588B66B ABCA407057A454A063BEF3DAA7B0F88582309F5BACD0646A624404264C97A83B 476672BF5BA2C0FA24D30B7159017FBFD31D2C66FDA56C1A64A93B0802695036 200BC5734BE683EF059A64CD822CEF9686CB2FF7C94CC73A7B6DD48354609414 99AEC109F039CAA1DC92184CEF0CCBAA28FFC766606459DEEC1A3BA306BC334B 6B906745087B770F735E9CA39C2DB7F7DED01086FCC25E75D200C32AE466BC48 8F178678069E18ECA2815375E2D97E52ECF4C2B10965EE43FFBC23C96AF677FF AF1B9800126B09208FFD400CDE3A40EBD808FE383B80D65BD351F079FE4966CB 1BFA7A0A1000243268FF0B356D73DB3F7D58E7A9236A5BC913A09835FC256AF3 641F9B42B5A790E546928898AB81BD627B49D2DD9EE53B7A7A5764E192FC0B97 8B2E9A759A7A78E1A625697999B90281A0884885DDD401DB76A72241E483BD19 D2DFEDD724CD6C992CBE19CF7D2C0F6C87C1F05A34672D0D9115F96DC0CACA81 146D5ADA3B9128E2516F7BD8349C69578FA8958727F34A8C36BBDC289AB13385 9BC188298CEE923ABC298CE69833EF8068448F459110BAF5C4982891C05A5AB2 FE02613630674A430284053D410CB87E1A9B103EA69A32CB8D8E86A0284AD52E D0DDFF16E3C0A29284A91F0CBB9C63468970B500CF722C5857D218866787FAD2 48EED5A1B84B11AC00459C0B2D28990B7ED82DEC4C51AECED24AE2E1375D5FB3 CE01B567535C3BC7FED661C55A76DF75B9ED2DB6704B1A0883E1666EB8E6ED55 C2967A6AEE473B199083E8358E9D95C5C19F45DC7B15F1461A85807770280B86 3F44DD7250203D5FB2E1ADC9C88E0D5F0F640B4D3302D60925535E4C652F3617 4C9653EA84440876A1EA1EDAD6F01DB3006D34017AFF27D0B4DE7F898D1A3B1F 2AE1B1B8727D5CC6FB6168B74E612288A73704835C73AC5025DA7E048CA50FC9 CE21D92DD2D655913DAAD79E9D93E023C876FEDFE207C36ACB6354F56D9AD2A5 8E97D196A0F0643E390417041FAED3FF1ACC1418589DC3BC828DA0B5F54A6502 B6AD3B074D34BADF88DBF6789598F670007A166708C06172E24ED77FB9C885FE B96DF7B795F913CF530A5EC9D1AE8A8B4761A2FCF6C5CD13B51CB00BFB080FBA 8EA2ECC14CAEF391056BC39D1C7DEB5394A430F2C377EBF71F4DBBD03C49D000 454652BF3AAA8764931C1E3C869EFBFF2000E64DBEFA67907B40EE9293704838 BD3B170FA8C2D4E8834CBAA7AFAAACA24ECDAEC613D40D9B71B66BA5A6DC3027 2EB97EADF2AA81F79DAF77150A63BFFEDF1BC9DE5C7E4FCC84FB53918DE6426A 0961E8DE195F603AF40ADD4189AB0EC0EEDB0FD38625451965A02046259E4064 EDD2BF312DCCEB7E5FE4F0D9D9B93682E8CBF11B4DDC3704A30924AE71048B46 E9697CABD39437A9F39421B57C758306114C261DBA04B64D16AEE5410F3AAF1C 78402D8469C05DCBC3153AB3F4FB075C973DF1C5FD0FBD4894B47561E2F26AC2 0AE7AA5D9A987166AF9EF0588AF6965D72E4BACB03560F41976015BB7E1B7D14 950C1877FA6AE22E6DF87AE0F4A218CD5875DA1A4ADDEFFFE96749E3C089FBB1 E8FDBBDDAFA6CA5B4388E2D346A2FF583E0FAD181E66AEE9D0018F4ACD612BAC 372E4E094C740B86A39619028BADDB6FDA2B2F174467721E2A95A192F9426B09 297D19BFF69084A61F0AC860E3238B8EEE67DDC69B420AEF3EB062A40EDCC509 0AF7BFFD 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: MSBM10 %!PS-AdobeFont-1.1: MSBM10 2.1 %%CreationDate: 1993 Sep 17 11:10:37 % Math Symbol fonts were designed by the American Mathematical Society. % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (2.1) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (MSBM10) readonly def /FamilyName (Euler) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /MSBM10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 80 /P put readonly def /FontBBox{-55 -420 2343 920}readonly def /UniqueID 5031982 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D 1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 D10F04E2C2822D3E73F25B81C424627D3D9A158EAB554233A25D3C6849ABA86F 1F25C1667CB57D2E79B7803083CB7CC0616467F68450D9A3FEAB534EB9721003 DBFEEFD050F3AC3492F5C74162A9A531ECEC0F47610B4940E946D21CAA771D30 A6C27ECBA11708CC46C62396BF9D1990D579D0C394899D24FE7A4382EA18E7E1 160E7283AF5BE17254790628E79FCC206F28B5566075B3A5697D5209062544FF D85FD89D6F43D6588B242AB2666B5D2861CD38A8CE676503EDFAE84D12A71E77 8405E468FE391F4F3F50D2C57ED55512036B0DB8E76A7EF413ED08673E56DE2C 16A3B65CD478433C0D2F9FEC4E662D54DAA43CFA6957D2A9AF8979BE06F70B68 ED4C8C493D6DAC4971A3F1D010A7726D084EC1074FECD7D12D72AE16C26194AF 21AF5774D9B860EEE8608D34F150092F09C19959BAA670022B9A9F263CD391E3 74DD1D1B4CD4D75273CAA4E37F68C631723E08FA35AD34C0AFB4621AE6689861 854D16CE1C375FD159A337E221A6FF1CFFB5693A0623E7EBB58C2969F590D081 AD92DD9E5322E26D6A15023664AC73A355998BCC48ADD0E7A4BC79790519606F A1FEF6075033BCD422EE8233B83D1E7C20043280D531223D5AD4D5B41669F884 95CE4D6DDE819B588742B930C579EDF743F2C74C95F717FAA6154FADC3FE2975 F59CFB1C1A29059487E75C48505BAEAD7145667D4E18E46E610C868A257173ED 0D30EAA4C090854DD8378E92D0A376226EA7DA63798F247BAC770FE26D70E72F 90CCFAADF118304646955B0310C65F6CA51BEEEF87AFFE294D08C44356A43B9D 27D45A9A51E643B43B1342BFA7EF8FFAAC9855CE2B2F801299D8A139EDFF8DAF 65773C90D2EF4161ABA2280144D849308C9AA80E3550814F4C36F7FC6D81258E 3F9F80FD790E4BC0BD236DC8258A01A7D9974EFAF07B46C0C983F5B63663CD89 7247F1468FC8F4C76F075D8619C72EBD23EB35B9EEB98A7AADD458C7B9FCD5B7 808781BAF6A715741B79B029D6445EFDB123CD88F54DF63FE19946D24F648C04 6807AD29423DC848E555D0BB4CABE944C834DBF5DBE30A0B66442ED66FC2B7BA 42426C373A068EB0A46B157A1576DC55D34AFCA598400ABE9F0E33FA7683DCA4 FB532F159E936E5D9D5A911E4435FBDB859047C69269AC60D0200610B7C51B19 7D027A22AB45AE1ED1302349D756E46EA347D22CD23FB290F48597E13AF985D8 105F214738B1B77F3E93E7674E2BCC5A0AD8209ACB7D3F35B255B1EAB31DEA43 CF22C8411DFB08EDC18F510D96959541D92AC40AE9E5F6782FCC5566BE6262DE 6DDA13EC694F89E9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-29 -960 1116 775}readonly def /UniqueID 5000820 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57034F27CF0B9E4BF1164D21A8A3D9366 48317F1579A4E4772661250F737F41ADCF2ABEE72716CBDEC756B66AD35FDFB6 E37BDDACA68370E604401BE303246CF0F7A46394A52B5E9D34B1E181AE500C2A F3CF1A8DD52495B2BE7A1691A75E7199240341A3C9C27D8308719E04FD5DCA3A 22BD4072C8B52A0C67EECC30DA959DD3F758B52AE0CCF4ACDF9BF5E8BA78DD8D EC8ECBF8B66575438ADCC9B3368DFB970DEAF658C06231105F8764DD6148CB11 1CF298102FBAE64C2B685F7E78C5C5845816F06B4D6E7FB5846F75125D56219B 314F654C716DFBFB63C66ADAF79C6F5BDBD195A414E3B378E75EFA49B00F94EE E0DCD05B161D28722EFF1ED840049DF5D632A5CDF8558863390301BDDEFA4C20 C58DE5E1B58F1880CD92880EFABCB71A48B591620A5518E8ED9CF6AD4687EED0 6AB454A26540EE3A3024F8D2F80DA87E78BF3581AF223564C4C2C3E81A48DC61 B3BA806457B54389A97978DF15BAADF9FDE5F6350763CC13C2BCCCC9E3976F68 146B0B246D0BF3210AE9C5E4666A76C82AEE45099B142173D8BEC819425D493A 57E46C5395C416A287A8F78BD8997EC56587D752FE2A7E05E0877FA7FAD8FD74 281D0F8EE3B9B3FB05A998C7B84C2FA59355B3FF75D74918385A0E210151A3D5 8101296DE05039139D3922DAC7482082BD1010B7A363A984D336D7DF892D3824 55F4DB6568636723E780138D8ED88DF5823AF68C113601847EB5CBE65D6A006F 6FE954B6063A7D3D101E1108F027667D79BD366F56798B655706CF74C2104230 8951B9D4BC6F37BB6586C8761EA833FA2CFB3815EA6B1323EB73D98D3265C315 C07847793ABE96638B7BE9562A35A8BDD70D74266EB7BA750BDF9E7B7916A4A8 124439A1E5E29D24F373F29173137C01D592A80BEAF864EC87674DACBDE2C95C A76607057DED5645FB8C825BE650D1F09C8D18FC10E0702C9331959127D0D1F0 FE8C0347795E87CC4A04EAC1F397D39B4749087D8E8987B0512A71D69918AB15 D82C28EBAE318547466EE42D329C9478AF6D8FB3B1C347188DAA95E1F223E504 0BED46904EF45DD22073DC2C8371FD25DCEBF9C2401D5DB5DC6011D123713C67 1CD11B2C342043DD07C4AB9854C9524FED5E1D504B6C4593131F0AE4A128FA45 5F1F150E5138F4AA5EF64ACA7001E0D30342215BD5B10419370DAE814D8CBECD C5ED828A76C113F385D3E35199BF995AB80E8965B0FB24444BE636BD8EC1C584 921530AF5BB4F158C4F9F4EFD8707A12D49C1AFD05FC6532BA304747F62EF03C 768115A3D4DA89BA634783FA6E434EECEE05D6FD20E2D4E52DC41931D9BFBF23 A8480B6932EF115A974E9D78183805192BD74A307335A1D0BB3EA07614CC9D14 3C43507629DF54270BFCD16392504FFB077DE26742E6DADC2BB4704A8A20B18A 847FFFC321165F47B61E2601F646C4B3810D92E8765C5C0598444979AE3B483E 3026D6AD0CB05F6F3D814CED0EA3FB3D5EA515B9A0B94A478F7F5EC6E370CBCB C588F36B5329E84F2A746A96946C32ABFFF21660FFBBD9260672558D08434EF9 2049F13A2905DBBF8ED90B7206A6A1DD5B242FDA8FB722B30CB241C0259DEBB2 DBCAA40B55B3547273E8A4241A8D3029E2C27EB0A8CD3AFDEB7AD03F0CAE7F4D C7213B71527A0A9939431E95EA5D50111216D8427BC876E477DE5FD36CF5EC74 505A34BAC9FFE71584348B946158DF006CFFEA898A0E389910E851F7178785A6 4A16FB60E362D5929B6A311DAA2FC9B42D3F3C0663D7A190D0E7AFEA48D4A505 E9CD0154939B1978D98ECFDC7984C34444D1FC27CD1B8332CFF10A538E0263CC C010624A52ADEDCC6FD4FD93E887AE43A2007BF9E571866F44186A22965D7D59 AAAEAD89AD3D49EE155E7A14CBFBCE4CB224D5431F81B78D3CBAB75CBE90BF1E F41C1E54872AAE481909E71F5A809DCCDF722836F92FB516705041A64BC79923 ED9CE25169E56F5472BD1341CFC99D74E0AC272AB9AE4ED7985AB28619EABA39 06D5189E854174DD8C9BF41F7979E0DD40305CA05736A68A5E5DD101E544D7D5 D119E5643EE9C3D8E8B3A26AF11D3649D6702F334E9003FC38D26ABE50852E3B 67887D83F80543B580F93B6730A60D108D09F1B094B203A66288F2BF55F0522C 3F072949C85689B67BF6CAD8EDBADB5D2F10585AC7852718D4BEA68E245775F8 C31DC2C896ECC9767EF2BBD0500FB7AC8080A4A99180F57ABCFC748218986D0A F462BA3A368F03A8971A9D59ADB4CCC19E5F578EF503CB8EE0E3A1EE6897ACBA F58C640D932B14361993FC829465CF5C4734B6AFD3C72BE97A7A492E8CCB0E57 AC1B6971EB93465CCA08B6D330246757B14C89D46E3CA91DDCDBC1B044F4836B 752E90E0244D0A363DD587E5F0FE1DBA525FE9C9FBFB831B31180B7986B652B7 C85CDEB54F244E9A6C05B4734B06306BF030CAF0822CF0012661E7D26A3BE7A9 4500628C469653BE97FB2CF4B8C4D3FE84893D3DED4B859745612FA269DAF5F1 92FCE6F8431625B6224733A84B25F49502B303FE87F91E176D91067CAC1947B6 695321E94B8FD6C927C46D637F81B6A117F1D11FC095C8987E7A94A7F6333212 F891E08B0C09F4AE88244BBBCC9BE8234EB19341CFB34554D70E364920F1E276 04750C4A97593D36244BCD24F49E3413B7DE56FE70E1851368553A05616A3F33 FF509771BA6E5E3AA4782A9EF626951ADD2B4FA632E9236696C5BEF549027DF0 50978E354FCB840C5F4ACF86206AD2E7046CB392102A83 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.1: CMR7 1.0 %%CreationDate: 1991 Aug 20 16:39:21 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-27 -250 1122 750}readonly def /UniqueID 5000790 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C 8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E 01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B 52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34E6F4C9A04BEEA891E 4D22B39729EE4F0ECBF3CF3C429B3BB657DF66811D3A108A73513A22D252AEBA 66664B33422FED0E63D93F9F8E24320719C09F50626EABAAE93F5649E1981AEC E8F19F6105EA978C51CBF54E94F3DBC93516313F00B281D1B8C8E4C1DB33363E B81B61D7224245842A6B98939F0ACF3ED081BFE7A813215D36CD6ABC3EBD6B99 A5FAC5AA7A0DB126B0A1FB14B58525546D4D8BB6E95F803D6E48BADA30DFD6BB FB3CF37851BF9757FD00D8E051860B38FD18B359F5B5299E1A612131A3BE87F8 1B55DF839BD8EAF6C2CC87CAC62E90469E8A52464F1CE25319725A7BED248028 A3B075E3A3EF35F8ABA089CA6E694599CAFBA57BCCA75BA0DBE82B2287E5AFEB 11001CAACBC5875A7BB0ACCF3E6A4243C76CC3158940E09B6771161F29D59F33 C52C5E0BFFF7A5221AABCC2117ABBC4CBEA8E3C8235D2297BAB7AD368AF39BFB 6F708C8264F1260D3FA1A9A2A5B922EB448C071EE9530BFB0715F5CCE114357C 40B39C35968239EF08DF39C3E09625CA47D4B89404BC2DC6FF433DB82CF5DD57 78BAE11938D256C25076442541D0E05AD5583E9122F86B961BB95FECF1B9592D 25A03206A45BDE90BDA8ECB4BBEF38C81531162F6DF6D4ED56DCE085B5544388 C06988BB48271CF62798E55EF2C9E60DD2C06A8EBD7A40688D3F89203915852D 0BF0DBF35C3C7933D8F120C18744A204BCC3716FEECADC3D9AEB16CF56232AED 00625F635BBBD77F4BC77CD98487E46B59D86A8A7B01795A00681D6D499F9F6D A03F37F3C08C3B875937E3D30F02240EF55B6162C40D7497C043E2DA18EE1C3C 0D1035E57117757F38D8966546E796D9437B1BFE820D75F4E83AA2BD5D64C1FB 5FD9B7C0B58C109B7D972FA3F6106AA6650F921233D9F890956461E7A2D03C2A F6BC6C8D301DCE1FB9699719E424D280B38BDDF67094120A7E89A73E1090A38B 023B44A0280C750C473E0598DD372D137D06364FC958B191197602BB575E61BA D0B745B8D74B4BD9B0644C74AEF52BA6B248784B52A6C86972770275ED9BB138 B94CFC5D0C0134049D58B6D55FC042F651A5B1768997D2E55E6C1FCF9F5844A1 8FA1804BABCFEAFDF66C5FEC52533129BDDD14AE5210D8024CB99221584D8C50 64102AC99A4D2B545985A5C3F8836CEBDA773328C0A0A26B560B9E71DC8D01A7 7A1E27B3B78FB443CE0C3CE8597BBA2048CEA4283DE3BD4B4B90F1242FF327B5 AE6D201E560BA2AB06FEE3BBA8CF239157B2BB4A9982E05C49B865B8004CB5F8 0A38F54F214022EB66FE387FA7FEB36736B2A917288D8CF1BED7208DBAE0E1F7 6A1D4BEDEB3F8E8EADEF5CD5DA6CC3218A73D8E92CD1A8550F5570840A94CDA1 968F2B47E39519E26D288468BC1284170B336B5C37CE969978A063471C4D4215 D95A08D4F381FA4E82CB1841A7A2B1C69FE7CEB70DE62EC74A8B8F28E09DEDC7 ACB3330A8BEC89C2202551BCB40FEE669441EA968B53262BC5EF77AD7034CE7F 7355974AC3F85762E645D4764CD1E782195D3C7E13A50BFA90DC13D84475AAAF AAB4E5508DDC256B883D65A798E69B984C5CED6CBE888DB9F50AD3E9F8C1801E 4C6DC4C7A0FA3F933A5AE949037F8C009D085C2B48E14D93498B4875E01522A7 F54D8CB0F8F67CAE6A972BBB051F3A792EA1B5C2CEF1A56CE02C9575B0E1C287 F01A5C128B0166C410E8D8F2156A3BD43958988275C13B5C88A0117BD68B74C8 1916EFEB710C0C2F71A7F628C05A016AE5C73018018F77A706852EF276F5425C 79613BE3DA0CCDE65816BA2115FCF965C2277E7EDA1F49DD46142C774400C5E3 DAE8EF242A3633CC7EFD5420F51912384B12DE73B6B00AE7AA28AB2A0BAA32B8 94E40727333EF9F4BA1BCD6E96A9ECFA79885FAFF86114908888FA5410B4CBE3 6FB1644DC561A202058F5B79EA1D4D575871F08B91E7B2D87B2A24D90FD98E65 413539A0CC14A0ED6B64691D3711EBD8CBFE0B9889B1C6709C47C254FD635420 7CE2F8F18022446CFA5AAB734D5730191BEF23A79B7402B828247F1742DCF930 A9A51BCBE840BCCF9ADBB4B2B9C7EF541AC6BB047511B58182D6A1BD96780FC0 0A1DADFC8021895DF1878708E0601AF183A22C10FCF67EC7129CB945FCE3EA8D 434E772C7A21C84A85531B94D17FCD830DBEA97D2B1B2F124ED59D1E59791C7A 6A53AA51D50072234CCF98BA336E54673C2C7986E11B9AF7001BD0D74216E703 096603DD8D4939F7638FBE1E5539801649D9E313EBFC2DB6021BFE7060E88F63 15AFC769F2E1CEFCC22FE3A05DB0C9411D799F55F264E1975CE9A84DD6170A28 C38451E0B772593D39D2205978BF713B5069A89684777EAB54839EB1EDA6F491 3A84487C72D1664563DA780F35A2B98163310D9F4CCC5B235D4FF948C6C6240F 6E5A240C0B06194AB533CCAD6C8852AD4ECBEABD9A94A6D1AFCB5E3D503E8079 C788469801B1A3DCA0F8E0D07D29863954E5F562DDC72B244C61363B820DE4CA 2451141F846B320EC4C257A3F123F89852E31BFE6631E959D44AC6366CE96AED 8251D7DFEB1EEF74F0693EF6AFF70647AAEAAD80A26713D6D43BDBDC3F2ED083 881D07D2229F64B74AADD3EABA85BEF331081B7870B72C8744C5D4A5B0F6B3C9 832FDE7CB6C406D80C66581BD76B92ECFB1F065E6823C2B7C064CAF598C83599 43307F3EE7242D35EC5F5A10701C9D85D65D953A87C6378F2583ECE68B8072E6 862222C327445A968F27ED4BD342548200E3132E6B443D41D91B97A45191AFBC FF4499829D2368C0318873E2CA39F687FC5FE8CA01156F6670D019632F7F909A B0A6C137F1657AADD11C40403756F4C64E4AC26DA95466AD5DBB5191617D6558 C08FD70972684A1DA188C8C8B6BBC22F92EC3CD800A10A34988AF35AF447C3CB BA7004B2117E05FC3EB1486477AD9A724CD1BB99F65AA5039FA47A549918AD6D BFF3496DAE934ADA01C38DED477121C5EBB1738AB8D476264999ACCEB48A66B0 5C4F10434CA3D2C01FD854678578F3117E2C58CD1F2AC33AEE2922FBD57815AF FDC24AFE869AF48B1B80B4BA8F6286B6588ABB3BA64BB251612A154006CF5DB0 69CE75ABA02800C8459B1CA9786E51DCDF472B8EB9E97A1A8AD2E0ACD99E3184 F6890EBCDC21907C15C3BD7FB209EB48E76A1837520A4B58ECEA2BC699F7396C BDE3999ED6D097AF8A53D7734BB8E3D8CEC4914C2075CB8929D58C323D158DE5 C984E751CB7B68BEEACC76E94549D9842CA24DA3994A1112EC76930034EA9A77 BE4CB64C5EE93BAF8667C6ADF85D0AB9020DD839C4579C539B29876F27CBC095 3AD35F193D384B1DDC1B0F6E639212645B27A6FB22913BC2A742A17154DCAF49 9324EA2B2E7FBAA2E1A4966558EBCBB8695017F48C0641E2018F948C81A01C70 C20D415B3B500491C39681D0DA3058A7A3BC7FE928D31140229933567D5C4EA3 3411FE03D9EF8662C95AE8AE06EFE64E0F6C68AD56ECC851566024746B262DA7 7A562260B5BF018EC911F5B54694106C30E53A7B0C75EAADF7B505B69DFF233C 797FB7A0DB327B6D46E03BFA17F251622AE1E01ABB536F67CFF6880EEA5F5FA2 551D6900B91A98817D69F7962ABB9E03297A3354FA2414B1E7F34D1C002133B6 18339A42FEFF4B6719A9031E271CA9DE43506ECADD78BADEC7FA65E892B0FF49 FA0AEA85C7EF5B4C9E7E90D3547CCCACFE830FD197C6688FBB053F579122332E EFA43F7E6DA15104FBFE131E7A2D6F47DB753989F82615C9C713C73840035915 CEE62D0D51A60A4BE929B52EAC4B98E687C0D97BD647BA473D7F19DA16FB924C 2822206D0FA487E4AB4891878D1FAE988974F4F0EA5D7FBB7BAB60F6609176AF 865F5B844A6C25F40B349127F6B97A23B09E77D6DD321CE8410E000C4BD9FFB0 12C26A051C6A942E32D0586E18CB5DFE29B2582C83E194DBFEC1225DC4B04105 7AE94AEB59D6C1F5D743A969834D50672AC0F1C619341357A28050602A6EDCA5 419E74565ADD2B9616926053D81CAEA70BE7CEB6AE3E77EAF35434081B6407F2 3CEC54C996A546BE1A61B4FC39DBEF4DF48C8482DDF53C7792024BB683E2CDF1 8C7F6807DB5A2587F5E92E3C839B72887470638BFC8B0AB0E216E337FFF791C3 B83E36878CC0EF5C69F7E25B549CFB8930B6896597D7DBD30CA9676E44DA4E2A 28993FD7BCC907D9BAAFB6886751A521329358EBAC1387030E037665AFA2348D 8D3B0B3A60B81EE53CBBF9752A9382724F524ACB92CBD9C700CA4873AA38FFF0 29ADE0726AF64022A66DB9519FB5082C5F4E00A5B715BE2FC98036E7B97F3792 4D519BB469BB21CC6ADAD8D3EFC30B5583F621EF49E58ACB1D3A01780B163569 B61F6774821FC87A6E4AD42A243F0C20A0ED8A2E8F1C5CE89426C2A74DB56EB3 C681BD976779A176390A36EF6D4B24E2C08FF8C4AA612DA471A8A9EF940F6A4B AB97767518B1F8B8C8D47E7E0358CA5E3FA1BDA2A902D4030DDDCFFCACAEDF63 62C9691B94D58EADC3DAE459C82F5E7C8FB2CC353C3D885500D626CC22D1B8DB 4E1AA3958182B4CA3032728032D8700C6DDF78FCCE5048EE389194108057CAC2 F11512DAC56DA9F1E5CF1649D71B3038F503867BCF79B7F71C0196B66F7928AE 1DDB796D22F73088CE1A1C6C869547291F39A11A0B1B81067368E659D1607DE6 A628B87CFFAA7B7C99C7D52CAD3EF2855A972CA0CABEC349488341953332830B B79B756A660FADC22F38AC53B8D475C6702490890691CA40BE0C6C88406D4430 F581955CA0257F4E1FF1B871A6BA105A10ED0E87314FC50A809DC1FC7128AA41 B15FF02E5AF8EE2A8A6DAA2C1D41C234A515CAF802EF11ADD9C4A55C99348A95 674E051FD8435F84B5F399549DAE5D7F9F22F97063816C7EECB4642D974F72D1 256102B177EAFE993299E33AE1F547745480DA52EC3290A1206441BEE50EC875 A90F10740B13AD9493981532DF8B86FE1F4E5991C733AA81DD5C91F516F52729 1B221A3BCC9AACC17D8C7A99FAF8866593D0904E17C06C45936A68C273343B01 0E76220F875A515CDA754D7A65133B1147FA219F7D925230683DDD76F41D6F71 B3E6B6089305178B4EABDF074D18468819C8A36742E81530D99758A9D85464D1 291D57179BD16A3A32BF987D661DDD9FDD047A8F42313A589072BF0331D6B7AC 66BE2E6CE8EB81275E6D175E621878D88088CBAE64E8D7E50F4ABAEE597B666F B80E0C1EA609BD5E43062BE4D1DBA413EE624D96CB366CE6A2C155EB33EE26A9 3C7E026886AA5B34FEFBD8A7E0C5AFD6833ECA94B553BFDF20D18EA0203E2DA1 24F392B55A16DEF0A694681DB8F8B0E26AA92F77E087FC3443DF2547AFD491DD 8DF297BED6058313B9D1E4251BB0DCE467BBC314C00CCE7B8A947D661CDDF3C4 82E06BED81C5D772A4F8BB20B97C475C87701E7397A53843790E3A4A9DBA7B0A 6990AB22F1F96C0A05009145450A1B38588BF3625DA7A0009A4C6BC9A8FE9F0A 598C55E2DF9E4338593262704F3DB55100630E2923F616BF35C481D3D8BD5E98 B0B2275872205CD9608C874BE45CFC4B00FFB5BA1B4766A6E9141520F29FF178 38A56D8248BAD3F4F985F17E04FDC362F6EE4CCEAE86B7DC7E5967C701CF01B2 AFC57AC44E1CC1D10D18F3BD2BE34CD2A911BE19A6C82CC5BD44753055521DB9 60A52B5D55C8F0874C625DF38367AE748DEDEE53B62419D2767676DECD4C35F0 02FDE8B2F12949789BEE77E2298C96F2D6C900C7F3D0F2C260EB6DC217A27AFE BBB79370A774ACE8200CA2C5A48171A378F25F83DBAE37D6022714B5F4E7E5FE 8B885AF78B5C4348F6603AE522C126BE33BF2EE600DC68E7C1A03B8B4077FFBA 6CC614CB2DE3B3E865FCAA01D824EBDAD7A20AE52C3EDCD3C6F3394A7E86DE6A 2B1470E3A6C649E28DFF994DB5013A747177D4D57E7BAD45CBEC571ADB1EDBF0 3FD7E00CEB5B390848319E6E425C7A02691CD234231974837FFF86DAB2462186 9D3C9BE93FB89D837C93E49494752FF522DAAE5745D0BF5C925DDDE037DCF8BE F9D2695A02701CBEBCCE43A0A54982817B9C8CD01A45928BAD94D45CB26AFDC3 C52D6C77F1F1F8AD1CA2F6FEA9EC388BA0E123D4C002C92503DC1BEE9F795C4A AAE8E59D065560B66EA3074CE1AE0E7F33B8E67BB09AA2FEF7ADAE679A123044 09A4CC536B5248B061CC78D1084B527630DEC0B61481E00AC395A5C2D95F4604 78B6C9592A4CC768AB0C8C39E984561A6E256566B879D6A1F0D0B5013E3E8B02 2FCF64A25549DF532DBBD455EEF2766FC830D4365BEF22760B102986A767C311 B255CAA7B5DDB22665C3B4B29ED90E2737162D2E43DA1FD154BB17B7E9BA22CC FCE3B873C36A7CA28372A4F21293EBCBBC291DEDA08C2EBCDE57694BD55BF4E7 C4DE15496FD05D17A9BE2D51B7883627C8132B72F557BA035B449A29691783AE DF2DD0A8B7214FE9CEC4324C1C9605B8A3777D2570A5225F4257060338AEB67D A24F8D5C9AFD3ADC2313FEB70DB5FCEB254A0EBDF18413EC990F7BAEDBACFEA6 F381CB3FD0DEE0464C437343B3049DA7C2A68AAB0B10C86A0157621164CD72AE BD0E7727D71F2F9F28A7CA5FFCEE856B7B65538DFEDC1B70EBF3BFB45A7BF37E 211F0BD2934B2EABD0D89BD42560DE555E58547E0873196E1E0394398945D4D4 BB85255617165EF13DEA86A2E32C6CBE5DAA8E608B87A58E8D56E328211B352E 5DA1FF6784EC76C56482016697FB9FB8706398BE546E8B515D8EF53286E0F39C 39B5D58C5EC26FCAB54763A75DE22D3791E5427CCD57E87F6A335DFFA85E799B 7CCFEDA1DF110FECD21AE20C26786C9CBF7D18B3FEF752F460283B52BB7BB301 092CB8E1A3C4629BC2DAC2A40A654EF29D3E7C1905F79D2308232FCDE204D13A D5BAD7F7484CF423C8778E9C4BC0D9A1C11D2E9414C8724F9DD82F0A6B618790 97B32F8D91AA90C11B074908D8B0FA81697B41871E9ACF063901C9677A7D8973 99C3DD2CE9BF153381BCE49581FA29A7A2890A72AFD9F25AEE72C1C633672F48 D7AC1309A4AB8469E5B3F16F98FB0BC7043C652C671C04C942B8778319F43657 B7836A443A118E4E816672C5E368041E0EFEA52A78A97507A7F5C3F223DB1A34 E40B9C2120BEBC9D9A9EF6EE3AAA9C3DBE2326E3929C4242D4BAFEC0CE681B15 E4BD9802363BC0412DAF53D3CEC8504F580F2DC061526F41E8DE153BBD9FCDD2 4B89BFA935BCED030B892B1EF28B49F177A953C6D8D7D18BB79C1475907D6A85 51DC768B825C6364CCB25890CAEDFAB4432B4F6DB69EB813F87F22A03438A01A 8741C1E61ED229D0AB800B7B8436B9741B487BE9603C4088A998355B9FD861FC 6D5841AD4A6DBA8DA9E42C28DD55C1113C19CD9BC0730A21DE5E84DCB192C2E1 E7F759E4ACA36A45A798B9B961968FAFF5E31618C894C2450EE8B3686B12D1AF 5B4043981D806CDDEE6F1C6510E26DE0B942918C3F92F6A22E23DCD508A97865 3AADE974ADD62650129FCFE1D04429F940866390F772867953C2CDF7C8492BED B33E7AE2DB1D64167DA39048624DDE21A6781791727EE7D541AA9FCD06239660 9655E3550A6F905FA5EA7ABA569871C9B0AA479CF0B65D029C69A6D1D96D28A1 B1D8FEB7F33EF023373C21DD1A399E6A69D154FA805FD8CBA44070DA01551BBD DD3A87B8F0829D6BEA523382DB008FD1965840FD10FDEB15DDE2CC598D607FFF 86F555958004D6C7F2DB92ADA42C273B2E2CF5F85AE357B02FE13F6BB8BD9B80 8AA2D7D615A34BD635B6D2794D69BE12138B523D14BB47ACE4A8C8FACC1430F3 70BFB4D05CCE46212515574187048CD69D0F1372A2A487BBE50B232AECF26515 D647A2972C0F6E61F9919037C99B63E291768075C097AC4983BCD3B48123DA60 E5FD01E61AC0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-32 -250 1048 750}readonly def /UniqueID 5087385 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 AFC27E4A7E07D09FB08355F6EA74E530B0743143F2A871732D62D80F35B19FD2 C7FDF08105847F13D50934419AC647CBA71DF74F4531DC02BBDA22AEEA3FBBBB 407E0ACC52BDC60D01A29407CC4F93EB8BF6D4813E9BA858D54F38918AC82720 4956D50291F0546E50FCAFA6DBD0099123F5ECD4AB338DB310DB4CAE11337A89 8ED99B6F483940C97544F888EAF0CBEB11094A13C073D0061808662A04A82BA0 AD35E8782F854AF66C20C0FEF18D0ECDD1646321B93D327E53D88CA0E825FA95 05AA57BD70E52EA0396B20ECDCB589689BC5EE0D3592A8DF868396D687B96501 711E015CD5871E7475DBB3B9421F2C7E9482042EEC1C39A4D7C17F7D317B76F6 A74E11ECB0B78D65925EFE40EFD419517CB867975F096A580AE7B84B33CD2439 57BA47F52DC2A9E6943FFA5C2D1FFAE699271639860C1BDB443B286E3726C29D 7E52225B5DD151671B6C4053078319B6E4FC3C3FBBE6D4AEF655E1A5463CF0C4 E5BCCC2F94BBCDD9074A2D3C943BF48FC8837C0953D590C7B3A325718B478C00 8617897EF7B2B6125CC2A37CA149E09565ECB23331F21347F8D2E7FA334C4E98 6A79C42CD326FCC29B8C6B7F73C90FA349980704815BB1FF26241891B6032289 5213302D87EB349C8630A33D3BA19960B644539EEDF22F8C552EB4A295F3F81E BA9F98C4974D37EA7EB425C5FBC16946E9F28F07714368120786327F076DAD8F 57A319AAFEBFAC9C8D93E62A1B527F18607D4825811CE0436889609BDFE9F43F 66DABCD3F92AB649CC2FC381ECB19E43B7813E6E4A3AEC20821762F0006FF6B9 67C6AEF9A5E584FC5E1183E7703C87083C801A8A245AF9ACB89B0C3F84EA17F4 EAB13F42F90F00064699763665DA488DF95C7A98233F6F7EB6A212AC27C98918 C359AFC5F009903CF41B725BE5A3C4A46DDE7F4A4E61DCAA712C7160EA4C29B0 358EFCED869E06C44708A223D06D592FBEBDCA97AB5325CF889C3B71EB13EED1 ED44011E87A5B4CD6CAB9AE4D211954CF25295EBD1F05308A46AE83BF1F8BB64 F100AE0DE8CC119B6B1F12FC2A24CA7132D17EC9D24861D2BD6D0384E0F9C031 D7CEB60BD19BE6A2E30217EB7E3E867EBBA49E14DFF550B42B497383FCB2E985 2E6A17A4B96C2A011340FC2C7D51E2E62F2D076C24FE2507A2E6B6656A92250F 184A555C5C2A76F3EB4808820D3C2A17142B502AC25AE23BF0A148EB7A7EF0AB 7C888DD9D0F8FE7153C873078EB5F95B5B3A861E22B25FF9E249B956F5CE7C38 76FF95B894C09914175C92BAB98320B514FEB098F6C1A2262ABD5C9980C80588 D06CF011F02F469BF587CD46E8999B9CACBA0929F5D8C8278F03F6405BF4841D 79D4D1A7B9BCFB84845D0EFC7B60F2D0CD1D5B13DE633EC987035DB8E8369C73 2D128DB535F09226662C36E2750F8B74E96C14A413CA19454BD0CE162D074CB8 E47145600A25818DB7D351D84CE304396CD81FCD5B069ED0F5730EFFB64907C9 91D202201C5ED6693A284FBAF1918653BCA23D426342CAD66C75A11EEC7F63B7 0950DD291CBF1E2D79C0C595E9485B64733FAA1A5F5C87F7A22ECAA3E07025FD 8054A675C6A35AD31FF5699955A225C6BB56000185C5303F5638977900DCA0A8 DD8EADCCB4D7D50BCDFB24EEBA6FB8BD5A055CBBAE313676A541089EBF8246CC 402E2912CDF52C32019B2F21CCCDACB21A800A7545514E0111E0FEAB0A59BD17 81A746055FFF8718D4A2F2999A198B0AA50EAC6D6F74FBCA3BFC2A0DEC2FF869 4399B863CC81B2A430DB1555E105CAC4435D3F11E7B21EDE39B7652A9F925A2D EADDC788E2FF383EB92D86D7617F593AE5B5C0D5631981B1C8BEF5E00F908A4B C9FD258C0A1651104A6A23980F1E038B0E1564F8061F839D3EC069575C90FE81 4A1DFC00EB74FB3636C3B995D692AE295F6B87E941182456BCAEA139029AF080 27FF38DF5ABC185E95AE56E7065C367339A2FD74B2513D4F7D0BE1F2172F5079 677C85612CEBD69183D489C595212F7E8868EE1FB5F477B8E5FD4FE5E9F03610 FB12E833F8A31AD94853E248197C24D9F5D89EAE4DA0D209ACFCF6CFD78E14D4 BF1FD2EB438BEAE258E7AA593A2CFFBD68F1D1942AD7EA0B831F71DCD71755CA 7A9585B529E33DF9044751231B2F56B61EFF5834D124C886DBD7C06A8DC9FE42 8B3B87F146FFFA13683B67D3F7B492AFF8D7E748571D83F8C6CF316B63EEAB90 C29A49B2680BF9B9583EB348696DBD99F2D3EF7A3B186023A4816FEBF47D6790 7165715B1AA8691F9F597A3344FD33354FD1E95CE0D175BBC2638B3775FEF984 C671CDFBCE9B4AC8774A4EDF863456488777D99442333E4BAB9ADF194C193344 37F0559978FD33878D9C605CC2138EF579A8C400DF492AEA56934093A4C11C06 DB13BAF77CBA8C47A70B36BF8AFC137243FEEBFE9F08E35CFDC05D9969A0D590 805A9DC60D8D72BE751A6C9583240A2DFF26055033512E635F5777278D15E58D 22E5B79A7E2A32026C7FD5460BDCEDB4AA6015A82ECFB2B508F9EEF5BCF80669 7B302CDDF0A764D360AF3FE7F54A24541AE1471A91BF00A47A618EC6DBBE307B A940E0DD6A45B5AC0570F604DA6F97A0C98D35760C7D84E1121D1DAC575CAE08 38EE15251ED184E1B35530596FF355F542BAAAE0991D0A8692F7A2B04700DAE7 9067EC2884F4E21CD40262D91EB300AA77CCF865AEBDB106C0B4FC3F5A8B2263 BC346461185EAB5596AEB2536A4474C9E8964AEA20D87452C0CFFF99B7383DFF F679E6C0DDB0A355F24A691AE48D705C0E692AA94A58036AB6937C93ABBDECE0 41BE34E51FA06EE05EE0180BD7912472C7043F552A42633E1983C69B0A5611F9 ED2C3B84AEE8620A2A95ED52AE3308E063CDF527D58F57A9444A5FDAB0B68397 838B1E684A12CC1175205DB166CA1E7734DC606113458921138A8499204E8525 081225E9B7B0D1CF9D79D47C10593A410DAED6951A201F93CBAB81CF48ECCACB 609C319B0AE93F9930C5C4AEB9507B7A599A799DFF2B6EAB9940568C0193C33E 501DC3DCBFA7EED36FB4514D397812946CFA970C74107A0F88A46FF5384EBFB6 0E540250E0675081EA4CCCD491A019B3D4FBD1EBCE41AC430161F8F6671B0EEE 891CB68389FA747CA5C96695CFE10125E007BD194FEB1540737BD8452F726DC5 D6F983D162CB05FBDC87CF4DD4A25911AD1331FFCBBBC4C556246A75EA711BF4 1D46954A96B4A64C2EE9EDC47904DD7E22873EAAA9B441A6F95D4961A34220EA 9E47957E77A6A76D86A1441E426D49F53470924C9D017D5A110021A2AAC25407 CC0C57EC6EB5B188F40DE01880D0CF0850011935A2910D45D7A7F877B80F5DE7 41450C7F7C0EE4B79614FC2A96FD3C129C07A4B4C85B46BBBA88BDA58279815D BE6D99052FC0659631D39AE4A7DE483BEDEB12C03B34D2161A34B29C299404D7 46201BE566DA0708981C0A6F23C42CAAED99C7471C302125DDEED6D44C53B52C 2EDE3FEB701252BDCA7C8F2E3965F7E408CC78D6D332DA3F2BC42AB665537F83 8C811D6E3EC7A81DFBAC22DE3C3AA5EC6894D2B21BB3631B4A0889CAA94EE10F 9C82A87A97D785692459393BAF74DCA449DCC30775229C649B26649732D07BC3 962D1D94314F57E33DDA32AAA280B7C7BEBF723EF7C5048A4BE2168CBF9B494A 2EF91CCD8270F09A8BDC16C6150D92F85223C6F97DBFFF2FE432C305E56EF514 39AF6C1C4A11538173D035C718FEC0A0542F3F3319D05AEA44F4A9D01F8CE406 D9DFB6A0417E329ADD6C59B256AEF21BBEDABC61EDD257E562F123FD35119CF7 151053BEAECB4E2CF2CD9A212724F59BB4192589937339817AE1E70B395D0AB9 FB10E34C4747856B2F594CB03D06D9B2EF720B53EFA659ECED8F15DB8E90A723 432CEF6A81BE092E6CCE5C7DE90FA1579F74C79E35155E186C5852EE4AA6F653 2A25667BC4F52563F2704CCBBEDE0C8D5F30C59E974DFE19CB27930E043A2052 6A6D9C40865A7A9E2171CA8E2D590E92299D757B471BF15ED6D164625945EFD8 CB8919E2A177C6DDE3AE0928F5FCBC1DD562AF7865899F10B8B0328CDF0FFF42 35B589E054D1990BBB0664A0A9E556249B8302A9BEBF8A91110DD1D7C6120E94 6AAC0505CAB4D706E5AD9D45974669C03709D3E8C68706A1E520DDA31162E1ED 0B2C166B3998AF44A9675BE00DDFD7E275D664CE49B07B6E3DC713ED0D861E7B 9C4AF1E26F8266E005D41F815B0F7F5326554AC4569140B52987C078B2581275 7B2C33665E2195A8E8E5AF390403F698EF9D270046321AF93F00F771B618A445 272F245BC985F4588A07580AC8CB6E6843D890BC10076E8C49BCE8752F6F60B4 E9EDA45110469664929F338B8D084153339BF2F63DDD569A748828E78128F126 8E64CDAE347C0C437731A581DA67DE7F8049C05B1BE54675659B2580D5FEBB97 B33EE50F5A423847B10FE20692CD695585C783C86F8241F613DE23F1B8D37720 ED0B9EF8CEB066F04A9ACF98D92C065237B228145563FC104FC8B27F86E9CECF D0F3EFD594376222A96118A65E6C967252EA912D76767BECBD710C6C1BB3363C 3ED621ECFE05871CD912C7966D01CA29BCDC83811BF962F58382256B307AFAA3 1D3894A018E3E07DE87631B88B1F336B1202B610892D47A313B2B5064DE3F761 512089A62BA94264888FF589E44D712CF51C3CAF5D6AC86F62721FA2E0B813FA F9FBC9F0CEE8439677FAA21DF1D906AB0497B93BDC9D7BD1304FB199AFD3B65E 194B1DF7AE897F6A2CFB2FCAF6444629AD5DB417B47AF15F1A6FB12B982E9C14 F8D447FD1F380E2254B25042F4EAB94E8D6B5375245ABD0D80DA5CA70E5CF6F8 A7B09FF0BE219D87FE74C577959F2517A32F11597B06DBFA51743C6BD7E42B0A 0E4FEE8A3CC86FF8C7AF964A48078E84FE115A1D750D6A6CB1BFC8C8928A2947 4598B6D30B25FDA0047D8BBBCF06DAC59C074E3EF65DBF361603AC18B6A0378C F4871E168F63118BED4F50473D8CD800341D542849DA9BFA7C9045BD0CBBD000 08122B51AB27689A5CEB50FDBACE477865E9D339F8737D005118B82E2DE104CC C470A6D1476BCDD3A606E57DFBA1CF71771B2B02BE90D8A8D02E3137A35860EA B8106039E3E44A45AA2847D55BF779700F1553F539C99DCE32D510AB64EA27BE 3D035F0817D34381CC229B1F3331F8B23A7FC9E68D51B9885DF0ADA53707632F E7E579AF5DE63E28C691D192AD9DAEE98385A160A68EF8A2A3B3249A3A313D7B 0223F10160E56B6EF597E9899259716EAA2B3BA38408206A1B931A4880741BF1 78672E3AA09605FF71FD2344D51CD14C34F774CA47B0EE24053CA3D08DDE9D1B 4758857BF7AAE1A622F99D64B07443956644ACFAF542666A4CD6CD470E59B76F CD450C6A033F1A2169022B0745FE0B01DEC59DB0E7FE3E5292951E721B475651 915585182647F305AF556F321976E9D3EC369AC445307333E6836B7C33A37F2D 18A7E927DA05E99D399419531F2CE202B013474BA5A412D80A4AB1DF05DA3993 666C6E3886126CA5BBF5ADC5436F356F2B4A1F6D5B6679D8FDA36DDE4D1E4755 1B3B2A483027DFF09C28D2AA2DA15F7E9B31881D6D01130717279FF572B776AF A97F5239594FDA9A0E73CAAD0C372E5E398096F00A8F5FA23020C52C8E3F9ECD C8FE1F40A82E261396B9DE88D7C42440D1EEDEC555152BBEDCAB94A18725DCFE 76C3546796E592DED9786ECC3555060A4299C3BA00AB2E91C8CAB61DA1263474 9EF70E0578A161FF44583E7D2AD825ED6F1ED67716EA80C01AE7EC32E329BD32 91E41AB6A0F113FDD8D28AAD017D91B89B7C38D14CE39B6020EE5E1F6107CB86 EBAB85ED2FEF747AEEB9F0B80D1E8CA8DBB5119DDA7086B1D9C4017EC6F5F6A5 72A05CB7693D2769BDF3B7A8AB629EE387295D1CDBD0EA81DCD5DA61F75458C0 B3F97E2E1041177AAF2E5EB918B87049E89433F1F689BDC2093CE115B29A41E8 118BE24EA1B31D74B7BB447E0EDB9B80899CCD0F46619D8A90B2BF012A15016C 6D153043C782D3AEF8B643807D076B9901943239889D471106B930642EB9E4EF BBEED76C474BD885251D98797FE87C940551C704076EFCF556B3F58EA9BCE20A 10D6DC7323971C75F5B46BD5ABEBA30EC981DE62487F17C7016DD223E2320617 1BDEB41D33B917597BB600B0A6F506941736A5099C6660B64AB98184D56DACE6 25633FFCBD24F7C482C5B4F1AA0B4BE4DB8932B8B4FA51544BFFFF3575A04BE5 CA35E4FBB2BA3AADC252D50894DC20210620D4A6A378A49895475B79E81D0ABD 80B6C5816725E4B85C1604E4BBDDCBB1FE23DDE360F50B33681C9DB8F5094E8D 6AB7E0E412792F4E250E32C946E13185F4A33140FE4CE02279DB0C9A4350F0F3 EE7596DD50925A235BABE2C01AEB8D33668BC0AA6799E075D506F2F0B45F55DD EB0585E2AB5D885E312DB39223D2998E2BBECD67BDE9E8B051A38FD992C179B0 D1FA3F9FC0EBA772398C6467231E6642B36F365FA43E72C284786756B462F260 FFCA07573D335B9DA18FF89C202646CBB8F7FFFE1BD272648B6FA95E8D7CC969 F2C6EDDE0141C8AB81FECDD11BF07D3508056D32C928C19483C66CD75B58568C 521BC27046FF7F297C63A34109502378961DDDC3EAB3B57B66BD090C96D94820 A0597CED9A8CFE51D28AFD2DB07DA441ED2CE7945C7ABB7819D17ECBD3B4DB9C 9A4A84350BF1020F5F028ADF5757D2A9639615754E6F7D6AC0A8AFF3FA873740 9C1C01212748CC2FB71B3D1B9037B17370FD2262C901AC5B73D934DD7142F90D D6BAA0981A47FC0A3B4CC0F9DB6FAA0FDCDB6AFDA206B932FB75A451257C6322 91A94838B5D1843A644D0A4B2543E8CD0659F8FA083758CE5C48D3E945593208 2A2C479ACBF4DA4F0192AB9E81A5ACD0AE6ED3039ECD6312B344F5C5DCC8FABC 702B7E26104B1DE66AAA275A7325B22DAA63E4E7420CDF592EA34E165E9FD895 FD60453DD63ED08BE0F137E7FD8329A2F80747FC1D1A14B673449F4CBF79235D B42E4997E271AB26F3D5124E456CD429E3BE16B0D27E81C232C91AE4EB1DDA47 DDD05BC2EACF889D5EDD0C600A645FC12165E3ABA089672759B3E7F67A92D351 736F36E276CDA3F69E2D1BB5B674BF131D3DC51C547DB0AB617FC5B45606FA0D 23E5E83E3C1B893BB29845705F4E38A355B612C12C1E3459525D19454F73D406 5A52CE1E981DC616F61DD3 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMCSC10 %!PS-AdobeFont-1.1: CMCSC10 1.0 %%CreationDate: 1991 Aug 18 17:46:49 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMCSC10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMCSC10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{14 -250 1077 750}readonly def /UniqueID 5000772 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337 900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA 87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98 076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518 9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9 CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30 40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B 7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5 FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC 81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D 5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90 CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6AD4B2482A 0E7D070D7497892E9E942DF58E88CAF0C8221BF36BF7C435BF2C683A4A2EF4CB E85820A8AD3486155A40143011BA9D76297F46DEF69ECA4596D6E4CAABF84091 22A96A4BC78A8DD072FEB759A68A44BE1164638B6D952147EE3C628F9A022060 1D1941E73310943FA782532ABCCC88593FD63E7E2CECF6665C04DB48D641ABD3 AE1BB468638681E96394B9E7BED1D13E534B897DB90EA6EC706BAAE06BE2FEFF 1DFA5258113E9B4CD2D36655973864574E0E8D6291E48A8C62203F679B7ED838 6F7CBD523C2943ECA994CACE6177CC35E920D61F6399B49BBF87580320D82AFE 5FBAB40EDE091A4A2B52FA3C1CB99700B70F77DAA87CA08DB9E7A8218D2A84D2 0046C14C78EC7F82617DA30765DCAFC9F224A5467B46A3F118EADCA6D2E50E9E 87C7033AEFBC3C456270B09ED42610AFFA8D122147E107A2DECF5EF200E755D7 A88E6E4F703A919449BF5608E1D34FE5B35FE1C3E3F61DC770972B755FF50443 20F48D1B0CB8C62C51FDC625953BD30262461CF481464413A1BE151813EF590E A501F804CDFF0D37FA1A2FDF7774172F9804952F561D8BE00A2B7E69FEF64802 BA886ED43C954EBC76EA6C453E233D85CA0AADE6C53346A94336A2C8819F0DE9 3852BBFC8413B6E67B5A29417673400B9A2066068FC33A9270052FF970BCB524 205078D33E2D1DF8F3B9063C75F31821B8328D89542FC2C48D2411F451DD7DC1 31F958CCAB4209581AA43988E21F24AF93E16EF35F112E10B9F813A5BE0338C7 4A922B0C7AF9461A1788F85B02A66F99CC97995851D43ACC92479203E28006D5 610327C20353EEE247148EED301D118752DE3C6A14E0945512C61354404D795B 7E19F31E5AB48FD5AFC4EB7880571F63EF7FC598818C4F8F2D0143BD12E3CCAB 7E75B6018A68C59D0EB9F5C9C075648503182153DBF00C1524702180AA21DE7E 3C55514B0199E8E3ABFBB72DC91D64BFDB5E9388CABCE9C5FBB7476506E9AB5A C7B50541C5DC0BDC2B9169C68072BFB10944DA4E2EB4BF8E25CBF090F63AE64B 4744E7B08900CDC9ED6FC618C93BDF174FA688EC6BE13D3737F3C719D2F3D188 EE2FA587C0908B4F6C0ED4EFD5D7C8969E4FA906AB6A38DE5897F7879D5AC017 BAA96F645C79D475EEEE363C93AD5E13BB2A88778E0C722B9A9E88AE24DF10FE EB79466F96C22F95E092298740D90F379E747FE2FF329813619BC5A3A54A8502 F439C587F25D11C0D4992C2B9DA7AE27C16CC85D5BEF9E2D0AE27E614BAC7B5F FBB147747438FF277186CEA82E8C45F13C430ADA837B551676C1C1C8C9CB665B A0BA175C56CB65C3111CE69AB7AC178A475588ACD166D29B53BB4E1B8303BB1F A07D65FDA83A4A07487D4BE16E28CF4E77FD78C01ED2C01B0B3E87D6B3611A25 0DDF02CE00B62887C5C516C650BF5BFE6A46F239AE98C1409FEA7F9C5869896B E9927A0D7CCABE99ECD7653C0F610FB0F7A456F4FEA894AF182DB4083C7B2F09 479ECA5432DE09B98D91C8EC263761077CABE2606CD17306EDDB5F7A42AB82A1 1755C73EFBE891AEC17077F521D5B4921B22B05E26A6140A1FF0E1A6F5CA1767 8D96FB9A40625FB1A1E78741CD790DB33AAA363BF875CC783961AA40B24BBAC2 08090AC29AF45F8E1AFDF19D9603402F4F56311D7C0435D60FE3331C316298F7 70305A4C25DF03C2A5614DC69F9113844B4F33B226157A26680E78FDC53DDA86 02A3EF8083856C341109A5CEF14FA967EF6797524F0B477AB370A7BFC80310CC A34F1F663C6CFEE96E1A16028A665A4E9A3CD3EFE6EAB47B2743D597B50F9361 2DE2B0FDC88DA9237B03127F109DCBD9D4BEC10D1B5D39FD99915EC0FFAA8BF1 C5E09C2DF026ED6C15A42BA29B5D81E3AE31F2C0051F15EE45286C81C6994FFD D29AD4A810B52601BF5EEC2A1F920CD4EFA603B996D8502B861637AE15F36B1F 2059EA061A052B3C79D1FF6D5DEE2C9041239E707E8EA1A1C164950344119EAE 9E3C929EFEED02078C2613632AA6E55B35C9F54A571D33E29E5F249AA62855FD 82BB881781323F421927A60B230327CD5A3A04950ACE4AB31EA74A9E76C4322E 37078B858D836A303FCFCEB0A8F3B7E23D0EAA9BBCBA69C9C36DD78EE8E3A2A2 B0E6FB72F6F7B048C5167C818023C104456BB4CCAC6548E6176EC3BBB40A338B 3BA371F4392B842C53A0BF403861643E331E74BEB7956F9D83375F4727FC5B60 36660BAF9A4E035198795C5F8E6AC56A58803EE37AA0CC2D05DA8E9701179077 0D25E1B4DDEBF82E72E57748F6C3CB2220F8B2AA29E81B8D4DAC7106A2135A7F 5A2D52AA5D3078767E953F5FC693A58060DB4AB796EE50F4C37764DCCEEA34E6 0744CEC0AABD65B4F359F7DDF13859E714ABAF45E967B2C599803DB464A92535 D2C1293D95FF3A7BA35B9FAE6FF4CBD67847964F9FD726EB7A183D2BB8555050 671771A5D329C6BDEC340436E692EE8791C7CEAB404A55AD64800C5743F99778 E40890D71CE32BAA4419441EAB60D704E7898165E2E767D89D3C2F268FDC48FF DCF4B45D360CBBC8C2E12F1E76596F66DDBF8C9DC9B67E9220C127131EC683DD 9FF06880FA89A9C57A5D6738D00840F30176CA1CE3772AF084555B708649FE3A FD67F2EDDDDFF1FF37496C9661C89EA370BBE31C25984C95FF08A11DBC53F271 395E0A94B24C79C36D3A56991E22A000277DCD24D423D7D223503644896D676C D3B762E96538375F53D77ACDD4A042143BC229D61A1B8FFA5486C89A9001ED68 C1A2BD6098C55CD74323C82238AC807EC8D2366CCEA6B70B23DEEDE1A2ED3F7B CF0B5FC1850A1C41DD8A9F839F52C0BF0AF811B242CD2FE2B879A3AC860B8E49 9E62F5E45C90046E881C3AF794F5BB5C1249BCFD5E2BE16053DE8BCC60B954E4 7E7965B8C6011D86F986112F1BDD718855A2E5D3C26B793D4A4E7D1301A13C61 1D06DEB145BD207AF18ED9D7D7AEC00CBE43AA61D0F1614A8505FD25BB8F2B54 3B308D49914593BFA37317C7268CC4916C5351393DCDAFD242182AD6A97E0EA3 06DE062C0C328FDB63A68D44482D699B9028A27F316AD85455C1831B2925172F 367CC4B984D533C5014933CDA99C34F31BFE3EBCAC7CAD9BAE4B9732F138A4CF F10DD2FA126C2EC4AE1AFDA585ED5EE1E7E8A7CAD400869DCB0AD1553164A491 EE5977DB67D07A74E1216C6080F4F79FF0BC49465D7D985E842C6F741CBEAFCD DE643093631747D243CACDDA5D48F82554D5E80826A1FB1F9A96A6376F13DCD9 FC209612D4EBFB16AF8EF5FFFF26D4A47EFEE45FA714B843517B7B4BD7F61760 EB46C507B98EA1820CAE8319B0F8F3A265FB6ED54CA1A1D9227CC0500BD184E4 CADE7327CA5107C0C24E41C9224E661193CC1CF98301421021BD1EBD58B320DF B3E88340F99337A393DC1033B16BE9D2F45FFD35AC44517D9D9255AB03E04D4D 5BB7FEBE67CF5326B9EEA92C91FFE556EC0CB271C2E073FD26A6003D1AB236F7 EB26D5E6F0C18C275302205636B544D4AD4878EEED4DD6282F53CFFC21D3A960 62DC2340D0F8D4B6B1A5368FCA23E5E853522228D1BEC2354D05B09D4A1288C9 D58E66C52FBD600E2282FAC65EB8C0E6A323B7F1091E513D990BB5FA98C3CD03 DB0750DC7F0FAA4E665EBC213BDA45DEC925FEB3B160BB30F9574BD1F18ADB2E ECADD6B2796643D39100B8F0452189C7DDC29F3B1008E020E14D532675F8A71C FC09A472415F5E90EC0D2C7E50957982DAFD282A651B064C44AC2CEC9758FC0D 30B75557E26D323CF8759DA629700F3B5E52A1516B325CFC954F2909CB6A83CF 25D4860C9C971CAA4EDCE6D86B1933E264A43178B268BCB10EFFB04CF7606C0F 0B7788C86A7EE2BFF011B47460F7F76A8C0CBF8B606D47F8DDBB13BDF94543CB 1F3A78F89DC68817248A6D02BB2D4DE34A2A19101D3154867BE4713740649BF8 F064E4502E36AE516D748360FDFA9DD6E2BA12313DF8934BB8C77F73D6D1742E 534534E5AAB273F5C48051DD4401B95E3E09FEDD1830144E30F4D710DFEBC26C 7167A3AF78A16728C992479A0CA1902066E88B2A8E2B40E412B5EA62BAEA6859 59D21AD0649E34AA51829FF6882DE61CEC63F9F21B9E1F68C9BFF4416D0A878A 9C588F630C7FF272794E4F0F394B501D099C760566497DFBBE2A7BD586FFC4A4 84A1820FB2D37A45CEC9AD82AF9D0995653D641F3635832C76B481366CCDABD9 72BF86A129ED1D56EE4E169D8455B12818C630D214F5D8A4245FAAA637AC7782 00D505E414C67D3BF3F953534A05AB4A1BA8F036205E1F5D1475A85CB1B585A8 51CC27B67DE529467FBB5E46A29F23DC871C0BA15510B7A06661DBF69383C877 15DFC150C84786445A860DC66FB67623497F735AFEF1B975B1D55834BF982D2F 901E1038F9D10FF8A72E77E5D226AB2B06D0792FAD30AF6B3B5D6ADF0F848F1C F017D7313026F61C3A223B81160810A68756D50BAB31117E922BAEAB399FC5CE 4ACAC996CCF8C63CF90B71739472674003D1EF43D203E4F33438AC488E2F124A 0897162453BFFB97F46B8C0BD7EAEDCFBFCFCCC54FC8FEE864776CF72E60A286 75477BBF969326E7BC37A00BD768DBA4DD83E568A347F65851AD96ACF3D9B16A 08727863320403300F4E47CE7ABF47F48508A720972E3265FF0A5947731CE7BD FF6664C76FF3486CC80AB50092114DEB6B244DD5E9165B4ED2B2EA3042BEB65A 66910B9F9EC198785DC4FC697D7FB7C80228EAC5FDEB71581A50A39BA0D1E558 02328434790143975D8475B19C81BDB108A027A1AE8BC6A67B9260C2509FBAD2 AE333B9512D9A51EA16801731EBB156722330F83CC5328FE9C9464F812EC2D69 0562D690FDA5A5E61665E0979FDC2E0B0D05DB5F342CB594270159D749AC69CE 0377C106347F569BDA47530A5C29690F2B35AA0D5EB8229AE4CF9EE0C517A3CE 99FA1421E0CBA5B5EEAAFE825437BF9DE55C2F0ECABD37DE3550EC78C7DEEFFA 0B56BDEECA3496E6074FB1E9198BCA53F6681880EA209297371852BDFC9A30D5 73DA9C70AE417A37A454DEEE87B80BD0BDD19572EDFF47A881F8F4848E8E6D94 7DB988DB0BCDFB593D6B8F6414B5F70A3885A507DE1197F5D0ADA037F51203A4 64DCD9776E3AD974A4BAA4468120D981CAF6BF0FA37F30F6C8B8FBC9D412D7AE 89A2622AB8C47AA9BD3DE0984AB2F80DDE5B3485D63CF98AB0C0484DA170E0DC C659CD6D8D91573CC40A97F2936C6632C6257EE44C59FE49E3C3AB863A6178F0 DF479AC005D0D828AA0F4B649035E46A906887BDD2CF105A117DFF0A62FCAC21 E4E16C8EE56FD7F0509A050C266E4D84E58FE917E5053EEF9F444976F31FE0B0 89F8531BFE88DC9181874E8E09128CB588EB5EDB634A832BBFCEB4C1FD8914B3 19A6ABF048E8AEEA3D97F70335295781990E7E4A6FF41F5A9378E17EC2631907 D5D0A6E53C3FF305212BDC4DD7BCBA41F57720E4AE797A7B71271216E386FD57 87CF91035BFEFC9B3FCAA5C38E35177708DCA58767F90F531DDDB2AC5C979885 2DC69FAD0FB79605C22B92BF07FC8E51F7E220135268DACC2F9C5B53D57851FF C86DD2D5DE9D5CD5043F8F4C7ADCA814DD6C2BF96EBFBE8DB262210CF2081FE4 08DB5176A4B7CE46979FA852F02B38FF53510410CECCA1BB082C9ED28B014AA6 9B4BDDA049D40D829E3A21A0B57B5F18AB0FC8E2203B998D5B82926C18D957AA 7E2D786822CE069A1D170438C4F5BC1C4FAF4BD8E1D390D5341AF7898FDA997A CBC0CC1081738661F3DDB0B198E35B4D59D181DD72DC5E93A1813F8538B68B91 83D7C433B739CC0A89404636CED2225A773D9A06AD3D14967808033313854C44 7CE85C53A70FC7569D7317D1667809F8D9DAC26428C8D95707F5383432A9D824 886919A71684D288CF0B63C50BEEFC253207C835E6F42945C4F3F6443057EAD5 AA145D7A3245EC72624CC4E18257EABFDB4C62C9BC1BB4904AFF5DAAA967DAC2 77D5AC7DC059892799800A4A754FC33E62179349A2A9DE44130BB34046ADD501 5258352F0E27EA417A60B3D81FF4E75EC3CCD822D257FBC59E9CF0663E5CCB9E 19CE37EAA463F91313E0D5FB439ABD4A418C47A2BE39D6937114F9CD6EE79FAC 46BA09BD951F3BD7EB088888A2B54AF4999375D7828113EDC1A3FEAC64FCEB5F 8C20ACDBCFA055007DC6049ED9536E66F033D302A0FAE0D14FE87F3651F8C934 37B8242AA062B6B84229536F65FB29E20A1A7DC50118DC7215BAD23C5DA159CB 10A232E1B9C878AE6226818B1088085A513F67A84A3F3AADC1E98972F7B02222 41EDDEA79C5DE1FD68DD32449508F8890BD4A2C198BEEF3F3163A5AE96536724 41FA7A08FD4C17577979DD4AAA8FCB41B1ED3D025261D8B24E2EF0367ADF9148 FD9BF00A81247A2BAEDB6DDFDF26D0DD1830F6860ECAB71952220E923847B6EB 8AC4F19D41E11B5EF392DD3A8C98CCDF5479C2203506348F386059406998F414 3D6D813E0EA9EA9EAB07E805DC1E7D75ADAA7DB9B3D24D14ABFE3FD05235C2C8 6E9EFB27CAEABDF7AF4BDBD50C170ADE4BFB069E028D1FA27F1DAE716E4CE96C 774793CA6A509347B61897D79A366BD0F37062EE454945B0BA6F0FF512B0A24B 203550270A00A0B60BF7BAF925AF3BA9FABA514250F39E72009CC8856407233F 4C5834DC0A2DC90198FE5A47D4C236C428A659F05363BA4089DBAEA36D547B38 0567C7DFB80C79D6D61C1E4C5C04DD0229A289608941D629560D7EC42D02EFFF B116E51E60FD46983E5A710914F28F17072408F51B356D1292FD56CF5298C253 352544D99B471391138B7E20E4D8FDC861EC5AC05A2F11A4756F06BE4598AA32 0DF201A139291DE5C98C44F26688A1B491A0CED8E0E61AC0ECD82D6D4A12D9EC 1C61A0C63196D4E33B2077BE0B5817C24EA15AA35F18A77876368BE71D9CE53A 1A23B9387109E1D39CCCE656A3B02C84DA69BE1FDC1ED82C976212F232EA7E5C 6FEC4D00C66F9AF86E77EA654929514BDCEE1C7540A24FD2091A20FF4224AD26 887913DE4084288499DC30F2A061A7DF414AB18469B8D625C6740C0A8F2BE899 3F2A16353736EF6AB83E11741211CFB2E85165E2772AC5000E1EBA7AC81EC561 016076A1715BA4F66076A40A93CC3B32B5ABDD850E7E148737B8BE42F38A2EC3 CBBE9DC3C1EA9C8E8EAF1B52A9C1CD3EBB2FEAF836E5CE9C85C1AA960396B135 3B48A47E80210F1013B9FCB7B7840E3FD8B78548384C426A07001607AF7DEC00 BE9A080242F4A58D60B173C4D65E82E86276F165562514AE7931B253629F671F 49560A07BCEBEE1C9E00 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-251 -250 1009 969}readonly def /UniqueID 5000793 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A 45A24ADAEC63F61C9FD18376D3984449A1F998C318A8FE36D0D5020E18A49625 0F3BB603BA1F3E66FF412F6A32433FF8BD2968D79CE4273AD0E0CDDA5153C2BF F8A46A2244F9394A49D339F763F5A7411A3C29336B21CCB01723705AF589B078 3763035411FE36AB5D744E81379106890688CB5BC41184548B7FEBA08DE7288E E6570FEA20C51FACE8E8F824BB61A4A038AB817C47B87391611B77928B2565A9 3B27A573C05D36ED01D8F27CB2C793370FA9B90021B5696280A55F2CB6117B64 293EAE0EA5A243F56FD007773CA35DF71B3D28643C25210CCE25F37A5095D6E5 9CAFD99DD1DB0D7EAD454C13464DF6FF5DD42339797AE5AE467084550FC00139 6EE818C6365007B2FD6E26285B832CFE6EA7E99665A224C9813C036CED262639 3FB39C1F05FF8F31D2DEF37BB9B883334F51EA1243332FE1E3FC91864C8AEA79 16A726F924AFD84F2F4215FB795FC41DCFFC835C90B9E31D291E47AA4BB8C05C 620F69DF31E91A0FBA8E217CDBFAD7C4D480EBC1EB396029CDE615C227A367AD 72834BA95539D39A38EA0CA3CF7F1123F70792CF315BAAA38BBCB6DFA80B4493 5025F33C3696DAD6A0ADF584C71BCB1D29E523EA4B81FFCE15F3204022BBBEA0 A9483EE8EAC07D581162672A0D66199174821ABD097561A263C0C0F24066FBE6 0951F31FBBF2675141F3FB4457CC2A94A40191EA0AB2A606CF540BBB8887B6DE 715EDB1041EBB9D05D0F4A4672F534397B9529EF8743BE88BBA10C81E0A46259 2F2AA7B638E20C9C8A3A827977AB58ABF7525BE15DB66CE8E9B81457552073B5 85DF3FA70B5231C447C5724E14730B90FA35ED1B5723036F1658CA8E19EF5A6D D333B78E91E4D7032EFBFD40A5A2269B0DFD9F7C3438DB58F94B507EB93032F9 99E5F15D9F5D8CB031BBBFBCA8A15A617ACEDDE70DD9C2D9EE21179FB17AD913 B4BF577A9046994689D1BC6A6985FF5F5A67D699C2FD288FD9E5BBE7CCC7F6D6 093495DB0E6D60D62B0F2F6DC30DBA9BEA46E67410773B64319BA7720FE3EB10 D79982548CD467F99C8D67D5BA5ACCD188EDB290D10D7CC18674717EA7E7E004 1AA6294084F6A73BE7138F2FF2860B24818EB258558D55DEB6BCAB5B3EB90ACD 65CB372AF3107E1B00137B90B54D8E33854AD240C4170BA0644E6EA0B2D2FC43 D017C9CBD011119EC71B98A8D7E4CD8E6E437395BBDAF82CDA932326DBA3C368 81AAD188D821D2C3FAC16D0C8E5FDF9CF4BA34303EDD909455F5C12A18F2DE2B 1F762A15CA901E262B7731495F8080FF32256FCB5F366F6E2B93D6A81F1D01F7 2A5CDB93640CDE961EB62924F76ACBE7DC968DBD38AC5779C09F55AC147B3D15 93E7EFC47659582A7695256CB00BED388A080D873472F7DEABF6A169B888683E 176AF35505444C535819CCF6C999BFDE914558F80358E685D761D10A26E220DC 558D5421F1B9F0E94044FF93CB7CEFAD1AD5449B1B00D33B0F404F765437432F 4F4063ED1978790197F98E4CA31916F7DA29C04F25C1CE10E967A98DD0EF8549 D8030372462C1A73F6AA8DC8C8DDD8C63B0E308B31C6FD3EC6311F17DC7B1E2E 5491AA40DDE3669A57701C10052F9135CEE76CD8194F61022D104B0BBEBDD153 54530A660F530A631F02D6B0B213C531DC5645215EFBB97CD74C32AECFB19399 5DECE9ECC306510CEBD4429496B5ECA56C588D224313B102CA4408B7659734EB 8CC8C85BA8F5AC2C4C9C9D5F9ED115DF5EE09834D91D2C558515975E0F250FF6 AA42EE242A8D7D646D3105E5373B010DA308FAFCF89714BCBC5B4FC4F57CCA79 A084CD776553EF0197516FF723932FC4B6C1F26E272313EE6A428D6DB08061EB 7318CF4C443153AF78C3BD26B0A0430078AD560283420B4165273C513E98E693 A859B2FACA7CF995999D046570228AD4760AE1A4D5940DB076A6A2D60782B938 C838F1AB48E09CA16A6FA3D65F3412094B652C73B8F1F59CAEA647F3499F1298 62F4DA6F583FBC7E6551910D6D4F3797487297A4429BC419F753666A380ED527 A6A0C25587631ED05DE46E2F27C3AECAD320DCC1885EBB7D9F9C7C1238A38EBB A2AEB954749C41485C168AFF974419AE0A2C9DB3AA5DCBCE7D14E857CAEE343B 0185E659FDD963F15EF6E0B0EC720D3DD961D4310877BF89F6A881FDBDD15465 3B3BC8E5A274F2E3B16F032EEF48FB63D3047C73D1C9AFD3100799BBB416A1F0 9721E1B7224610FB9B454ECB1AD68C5FF37711FE76A22DE1F1736785C6A38A49 B2910A132B0CC7E8411249085EF67D13B2B94E07A09A0E6D2A8B83EA30E3C85E 13C2491E6FDD0342721691C34D5FF91C2486AAD15798A09B6772E36F670BA906 77EA73AEA39C9A1D41B74A9FBFC87F96599C9F0412C10CB4BC403415AE12FD5D 0BAD9CFFE393411427254747C43D7DDA79A09241DD02EA19A2FDBCC351A1806F FEA9B85AF8DB6C3276C7AA45D0C40BEAF6E1E1450B42000A0AC218628CA69DE8 77D2F607C068CA13C97EF50863F7B1EF23090B604AA7F3EA52252504C66B849A 31D2DEC6C33FEE7565F8673E43CE7E0D89FC4290621F31D87C1014665B096AB7 2CAA93CFD841EACFDF0CDF3EDC65EA0E90785D22FCE39D0BDC07FFCE4AFEBCAE 1AD88CFE55CF85B57A3EAC8FA013F5FAE755812DD2502AFA842A918D2EA95F58 F6B59CE3D85304D521071D296077CD76A78C7511347F984D3056C643408DE6BA BF3C1FCF7E8C1737248A0018732689D98274F85EAEEA8CDB790650AE9959B7EA D050975FC676DB6E83E8EC0EE209E320C7F30E047F487DE476CFA23B175C02A7 8E856416E61677FC5D863B4651FC1E80F57F598F0B79BDBEAF1DEF670347DB9D C163F0B1E46E3CA32C5638D286E5127D4C0BD192A0F5EF612A44E544DE163274 2DE8AD6297A616C2F32E10886D79B6F5080ED8B25C460023175BA8330B53EC53 A709ABBC357AA767FF914D1D20D0F4B04296FBF0862CE0CF993D4F8632E5BB03 497FD46CC89B39FD269873092CBCBA6277B8FCEB036CD7F7E3C4369548952AE5 2846189AE1A6AE2962F90E3EB7248D2C2AA22D9EE4BE9CF8BEA9EEA5E0AA78BF B0F60A8EB68E4E5A51FE295A65FEEFB79BF668D4E83CB7D8DF0220DD3D23D338 3D84797066986B3C5565284983DAC2D13C52A4542B507C46BC2943F82E04B586 937DC279F9A3B25E54C9F64BBE5922680C66EC1B2874EFC07C3EDC8E1965DE88 A28A42A20D42D1014B0662FBAB496590FCD633B76853D7CBABF751DBC4B3D261 C65D07F0CFDD96D368F8CC72BE58A8108A7082430F6B3C784324FA07633E1591 8097686E8AC4C4219D8B4F85AD9BAE0971FB9FF3BB7178D77B363C322A681708 B31A3EBCEED2A42488C24AF517CFB84387C5DF6EE2F8C998B90C672DB11645FB BB8468B9332B9554DFC60C39DAD893A6D36674315ADA7A99ED36EBF75726E687 B32B33CDD1B2E1E96D108408E280B6983128A21A63A42FD75D9A46439BDF10DC 9A45B3093893385DE79003DDE2345E70E81729EBC5CA32E2E9FF11DED36AA2BF 972363CA0E2CA85B05BB4C7DB67B6F83E440E5081326F898E911BF706DD0EF9A 2A69E94A30A009F881042313ECAF1A66A56FADBC6976BEEE8DB264C2573E9921 CF232F6C9C26687197E0A4918B408A60ECD7346AA488D7963594CB689ED3BD49 8F3EAFD337DC05134D422E50BFEACC5E8F0C3C47DB3C1D8BDEA29E002ECC84E3 6779211557F5471CD68547F165DBA635827299A021F3FFBB9750DDE0E31990D8 A77057D55FE88335E81D45C8CE6DACCB6ADD1C3E5DBA20CBE08D3E317007FCBF 0B481A004BDE581F7E7A8F530B29BCEA8E50B1D750DC8A6A43365564A6557BF5 B9CE5C02E4E2C2DBD86DF1E280572FCAFDD0E74501806EFCE499D2AEEE35AEBC 2DBBDC5C0125E0FA5B8A2DE29944614A4E5FFD996ACFB6BB40C7AF1513B67222 ACC845089A1BFDA33B07C975EEC919948223E0F6F9E3C313BC73D8DEEEA523EC 12F6AB4C674C88B91F4801916B4BCCFB050E03C9814AE34A5F60523BC05CDD8C 77369079536BCE28169083120754F2A6D59DEE2D1A2A98351FFDB1DBB277091D 595D6E5971EE59BFBD275C2D536C8D1B62F664C8C80A74201FC51A5BB1EAC51C D0FBAF51F1E5D241D578D4C6D06BB3C00A67C45530A6C4BBAAF823286187B8EC 97AB3111CB4C78CF6A14BE97EECB99244F182171EAE234F2F5B1CA80F5275E62 560C8EAB73BA68210B408D014538BD2D7C56F958BE63CB1B0368C5026BC05732 C285F725E2D1B6F2C746E3841978F64B9C9C1E122CC4754AEA584EA93DD85974 CB38081A2CB8296E9F90847BD6339298A6D41ED25D8B7B7A285964645FB5C720 6D56559DFC0E1B41DD9A63EA6A2DEE67CBE3DA44B05DDBD9950095E043DA97E4 677F3CB7BBE9767AEF454B77FBC942B12C937E963DDFDBA875A384BC6D867DC3 844FEE370354D4F2E7EAC54696BF0A1BC2F545A4F682201F1F901CD7040A7539 658E7D98233AE8E7C21FB799E82B2E6DE399EE6D21812DE0B6A184FF5D0BDAB8 B08DCCC2CFA2DDB1854BA07F2F055A31AF786EB953C87E3C48F15EEEE5E49086 38E8FB689BCC00DFFA21A8DF57B9D26EBEFD821DD63E82F9FEAADE040E152BC6 A82B44FD297622AEBD6DD3E1E0EBC5C2071FC174EF733B13CDE1EA43815BEF99 11291CE1158BA0F1D947F16A961507609B57699C786AF0E8617276AC5CF2FD5B 4A76C170ADA906E534E96FF6E67A6047FFD1FE3451B14A1D8A009BCC8B3B2A1A 45008107D5AF8D9A019F1152CC0C5FC4D2A420AE07E135CE20B09E944DCD11C3 42A494FF1BA0B2358A4D3F436617BB21A70796B5D9721E0041DCF39B830BF346 F62F283DEE545A498A07A36D0FCEA9E59CED419A1D35966FCCB90E4FAD155529 D071752531FCFCDCA90DA282953A7491C26031CA0BB87E33AAD7C217FC92AABF 350B9FCFB712F1E46470ED99103C242BBBCD384EB3F68175E4CADEEE3F2774DD BB67EA3EC9550CF96F1B017853F93039B618271CD63378BB74F6783296238498 0028C376103B265D4E5112A2246E7AD14ECEAA179681B40EFAB50B64311CAF12 C2204404140BA0FC49F042A62A42F58B0744F3AA4CEDB269F3B15D4C2265B0BF 995B8F7771844327130C89750C074C521C80C9F7EBC6C6D1DCC9EC472CF8E470 56AE95FBE5CAECCA1A317BDDC8B261E9E87B2200892511A20DD41CD21F917C84 1B15AB3B9988546B7148AB53A02CB2E7B65CE0F908CE3FD63C0FC20D75EB86D2 DD352F20DB1EA07D4528011815F20A7E07054048A21211F60E3E860CC2BD1AF9 A7F3C0EBC46F21E3BFF42595F3C84058A39E483B6164DA6EB7DA13C30EE375E1 4ED4AD747A3A43915C111D3AF559D5C4D2F853258C53258468530DFC9464B8DA DC8E92D66D9A2D456F6F752888A9ECD6C3EFDF70F3DDD5B5C8F5C5A570E9A80D B33CAA65B29E257720F602D17065BA7F40A893A8EFBDE0505B85F0DCD78AAE71 87548902856CA69D90709AA6A8B311237EBA21DB192B70CC26EC05CE734A47B8 2D583ED8EDFB2596FEB565F27F0B2EB2A143887D9A87763A20483692BD4F9715 6AA30A76F88289F6881BB3C6BB8194512B28848EF978268D756C8BB2BD9498C2 1D80EF4BF51766C2DE3BAE2A28659E7510FB6CE9E8108998A3B249EA72900F22 ADE4F911546AA5C420C13041DC8B1CCB130BCB93C07CCFF3898F729018008174 20B599C588F0B1082892E068F3F5C532B4580A1900054E37366EC32A903EA92A 36325BB37FE2136A28879C474818FD185A9391FC301A6931A3056A1F7752FEC8 15F77D53BF7A78555086AFD7CA266CE5858E84D080EBE1E212E02723D5F8256E BE021314578C8F49B2830B7EB743471EFB04FA91FCF5FD5540D86E77FB11BEFD 964937B21AB875F79CF568F3822D991F5BAE1D389C3C12323BFCD2349A14073F B6946254842D6CDC6EEC19DB99709DDAE392D16F6FFC174F4AF97E356A648922 656F2CBCDD57A24AF897755576DF065F5A563E9F36B962537319AF921BEA0E3F 71384A356CAF041A842A4E43FE479629286023CF723E0DD453038CE573B4A4A2 381948ABECBA184C613371395B14C6749773F4EF7DE8CDEF1A6859191229536F DCB9D5B8D22EBA1750776BCE9E9245059D36E4F3094CD9173417586301C034A3 9DB253129908625FA223844B1250D7A85661BAA58C61913D4DBA0530FDF8EF13 BDEF505CD5B7D31D8B132815CC59BA53BB8CDEAC3909A4D50102C3CAE3D741EF CDBA391FA4F00447856202E2FE4B1FA41A24FA8CD9B529A1082ACDE4F26C838B 42AFB1F5DC69CBCAF8499096C4ECEF810977D865D21BCE9214D03AAC44365BF8 EB746C4DC0B5823BF92DE7FD5095D7DAB0CCE61D62CE62A81B1ED4012CD83AE8 FE7B02702F0B26791A87CC87618720DCC8940C9A2DB23C2B3D7A79F784FE0998 46D4681FFF021F789A2BD25783743A7FC8215539AA1AA3FF38929D3A1BB6854E D6AF69BA8ABC063806384B010B3433AEA4CE7A19F9DA74B1CA2A8AC1442F9C4E D81CBEBEC3D730FBFDF9A17B2CB297506EB1870B75D4DA481D446E86793D2F27 E5D2D33146D9FCCE1E9E8D6E0F29263E81D36D838CB5879428B39E867F62A162 5E37028E5BAEC281514B1E704193BFBCE354384DDFC474A296AF8E96A9FA4E36 5F15065225246E1CF13CEDB27A61D2F18D84B065D997DC1CF743CA9E848AB55B D62E492785151176EB4294C505AD0755F06609C854A09F8CF20B438F0A15767A 5D774D109D275B85F4611D05A6624018922EADED7A88B38A0B0170D53330BCAE 669ABCC8780C685E9544DB4A08BE2A6D2249B7AE657199B707CED19D9A70F18B E774056CF32EA92559C0E6E957D5B7247CC6590EFE2FC850CA675331B1AC531E AD9C98B52A5BB5543729DD243CE48152D3ED88387DB2B0F998473E60CCE11C97 24D3D788FBA59238362475B53C69C7312B58656D766ABD1F7115A30E3D28A0FF 37903F2FEABED71C7FC57BE553198CF43BA243060171B60BF9E6B9932DE1C3DF 00BF8ABB67C4FED7F2BED9D03BB4FE6240E64B999B86DFDD1032A5084E30F576 F6FCD2B76375CCF38E1FA215270668A00366EDCC292A58CFFD2D9B9E24FE2CD6 76809710886E6641C287C35DB551F04CD0D30E0BAEBD4155440A04916DB6990B 0042188B24DE6BD941E44534E84621B89BD0A9B43C30A0B716BB3F992019A605 1FF92C933AD26B7EF798ECA23CE57548F29CA240F798A43B4A9A7F7E1EBAF977 851FF2FCA4D5F229DB8388082E31782D0992BE6EA31F1227312AE01BE6D4485E 6E02045C34EC53EF0DD7755B84747890E701A8E0155B003964C6B3F4185F0A6E 5A7970C398EA5F1D430F9BFF8F2CA73D50118D1A66CCEB0AA8A011074259D42C D59EBFE14ED4B457FF2D7228A5839C623BA4CE8B6B9C4A26CC1A9A6F384BB116 D6466FF468CB39FAE716D5434888540B46E198AB2879D7823472BA0C08D22DE0 4A7AB5AAEEA53F5006494CD920ED78276EC42390C1DDE0016732E69193049313 B259F2F8F94AD8522EEB3C0124CA8C4D8B4843997B39B1123FFC0106D5F32B16 121FC1B6957C5D16D9832474DC2A5D02B5CC52E785BDBA75B97D30B183690D05 4203736A3F79E1FDE54225595193302CBEA6CFADC71AE699FF685DC9DB842E17 82ACF2543502E6B17F3B1EB2AD64DB9C6BD2D745F7671A3892E0FAC9013FA9E6 A8E33A222D40DE9264456FEF6567D280149AEE08A88862BC93B468A6B4907F46 CEBA92D6FDB87858AFEF6DF7E21D09CD37A40D2F40AD13B7D13C32B014B07454 9AD6EA38A0AEA59FAC78ABD47711EF6BD073D760464A15C8D6F62BF8A72634BC D593BBEBC8EA5AA044520A187F2C39F59B621D25437369DE01755758E43519D8 FB19BB2C5791D4F31F0AE9F15CB2A7E064286CF2A7A8101D32FEC465F042338C 446FA327701A711FA9B2CBCE4FE88FCD0AD64E6166AB9F912A97C84B66E4FD68 84EF9E8C9CC0AC001573789975D4AA8446A56EA402B7386B928C610BA5FEA9D7 D59F6925FF88AA405E8CEAD2F6ED338701FD810B96CB3EAB7A4B8A1D308A466B EB0AEDB191924CB708073CEA73E0F55C3AE1872EAC84F34506FB35F956B20C60 A01EC8F1A366C2EC5E6D88ECF04800FB6C7645EB3B27D77081C2E1CC73D0FC8B 0D9C826B3238FCBC852864A63D00252A8E5C23D9F6CA9C06E67554457386272E 4862FD33F0B5EAD0AB442A722F42AE9957D77B07D4BC11B24C561886F0FA1E77 4BE2A7B755D3CA612DC995F5B3BC1BA13C71C6C4F12A97003C4EAC6365511839 71ECC2068CF1E348D9B48D72FAF003157014A932E34275DBD260800EE15F0551 2A04D45B98FB32A1DC1C19037BE7781A33F16888818A4EB200BADCFBFF5272ED C6256A3116D4F4DD0D4C9D6D3ECF95318C3D1ED08B49AA09C21A63D3A0B0C514 723FB6B9014029F0AAF76F004F93E235B7D5D20819D8B5579CFD81399890A162 AAD834BBD583ED7BE1CD8C4431CE9ED3AE11443C5514CD1D9066E58AF7D56834 74E15D7C53E253260FF720CF412A569EE18F6F1DE5804F59CED38C02D0702452 2F9EAC033A0160F806CD59AE8724265123C12E75ADFEAEA8AC2F8D3D2036ADF3 C55569FAB127DD9CB51BEC77F81426418D2B1B122092C6C3A83E506985BC5BC1 9759378BDE912A8D300D75F3768734D39E59593D5240E8472DC7844BDE3AF38F 9FDA920485B2A882A10419D356631F0BA93C5A3BF39B77F63473B18505CD4E24 8A2A95370E5D83BABF1D393C75E7E3E5D7C8B8D3D3CFEB7EB5C53B9FD5095766 FE77909E81AB41533838C396BB78C2073775868076301DD5F7ACEE7A20D59F09 6868229EF39B03BF3F46D2D2FE27CDBC772072C43766DB51DD4625307A10C363 E0B7FEE1B1F7B9C38B2518753038323256E01CA10049B0B602EBDEEB3F542D81 3C58097FC87A5C570CBCA2113C0245C79F747CB5A447B3A40E0D5774BC8D68BE F2EA495CDF36D18F469566A9B9C8DD5AD4EAACEB9081861EF8723A5ED5E02C89 3325DAF85D549A21784FEC9BD63D9C8B328505669B526F0D97FA7CB55698563D 7B01DFF5CDE8EE53D1317D3D410D1ECA88AAE1F4CAAFEF86E77F379390E0CD14 809017F3ED952F491A23A25298F9722E405B385F4AA2B474210A0CA967B51A45 B8D17CB7224A5A2615612EB0AFBD3AF404AED70B564A18648A35DF9F0E36CCFF F88FA4718A21001E2B5B4000DBA142F262861D45EBA054CE3DA3761B05B3C3FE 29D59D3E81D2CC5CAD6D529EAFC6810D7B8DB7CF9467FC50252B6D7142C95810 0AA968C93C123A3707DD4008BEE6D39F7F4CD28BB2A1D67C1876C641BAAD8BB9 BBBCED59B171B83213D72C1845D58CF692C6C3C80E924EBF9B7FB26152F19F51 9B054E8AE01E5FDD0FF0C77011494083752E76402704034944C103235654F0DB A31FE0042472CF06113A4C2584BF947099EF3A768BA9E14E7F69CBFA9978F9DD D7016C697D973AF60DB6F3C2063B80577FAD99F40F8EC7F31AA12A67C2622F31 5E6449FD36A82905B02D4C2E79003B1F131B86EF9E38AA0FA8DDCAE5BF12F893 82147A83428778366631A9E5508E758F04800AC17D62C6176E84771033DC1120 0B8083BBCEABC2081CB89D5083FE42EE7AF86EA2DCFB64622EF3359F41B10794 994699F02B55457B4873DB855B583D8E69AB301BDFE5CBFF57D8232B18BC0C63 69D294B6A56314ED2AC1319C786CC5BA6751DB4E4CDADA148C600EFDDAACA762 D97F37FF69551CEEC69246732781AE2D5F6D7B2C46AE9493E6848FC2E49CE1BF D0148AAEDE8419A6AFB664F882EF0E318CB4FF77736EA43DECD55D94241BD584 8E3FD7FEC2DF99C60044F2E50F51774D632F317D2E3347A1E77689486214140E 87F437A35D1C8EA9F14A77CD6B920830F991D88976FDF604E9F2A4FBD2FC712D 594FBBB9248263C06E6400DBBC1D9CF844BF7982E6532A7B0B27F37776DD6B7A 796F730FC5A087A2AB91761BCBFDFA5F20B160DBB8426BE384662843D82315C8 F16821FFFCBF1A3DAA3F199511290630926440B983FCD915C038C777295643FF 422536D475AEC44F9C35E899E4D88D0AAF6456A2647BAA02F1C3C6A1D0D853F0 661E2EDA955EC9B98359590AC24841D818D6BD2E299C59734D534E1618EE09EB BB9A18AF0D70837E7251F2242D5D2EFD1420EDADB39F86B32B0B97F7F4D48197 87050F45B68B53197832E542091A1E4BA18E0B6D6301E468778ADDC144EF1F0E 4EC5EE6BF87F090830F6146C644F8E8E48B24C143EEDDC009D4A5FB879C57760 7196BE05D8AC5E880D511FCCDB9CD84490683E88FBCE072464318F26924DCD92 15CE13847C9456E7148BF8A5AFC6C0C307DDAD2760E1B5EE3FCB731B1685BCCE A23BA57F7DD5EE1BEEED1EC18777336C056516F1274550F11E47DCF000983768 18109399237C016E4117D3FF2CF92D42B2C50C2C762D42EED6C7330172D71870 3D6A404BA919354CF3F2138A12D32908C88C11AE07467B733F5AA5A9EF560C74 1B35C963CCEA72099A2EDBD649160339637A32E6DA95A4E92516AC5F695470A8 F458309836A1A2FC6F4365B1FCEDFDA033CA46A95E4A01762A73C8E048296232 0BD46747869C2921EB7D10AD261845DB6B2DCA9EEA0768815DB0DA1C5655F89C E13A5453FC7B797D1A9E0637B0942FFA891C4433BBFF7B5AC0F37DE424A94D17 D23AFE46BB0DD74DCF29F06FDFA7A3F8ADF19C678780AE915527C4B61C628D20 356EBA4427FF8187A94C8E07D45FCDAC09A7D10AB134E23E51AB0E539C83FE95 7897EA507AF5FB19ED2C1C499A6CF0FF73778F1BF6BD5DCBE462C582A1FEB167 096180D5A54CE4C664E93306908AF890CD7200886628E0613DE6FBCB9AFECFB9 3E32277846155398944B36BEB6FCAA1A8EAC1C55B50786A9AA5A1CD2DD2435F2 3C97EBBF7A3D20CC3E19D422404C266185C63B61BF77BE0FD9A919E490396491 87C878F64A31E6CDA0F7270B645C597D9D4150C2976B085EBCDB10F823237A6B E18E0C9A255E71445D8C97296404EBCE4C132E6888CA5ABD5F959EA37E5C5A42 20CEAE0D740703093A2FA825FE3CAED5C85A52A9361FC65DB5900D00F53D8EB0 D24A808AECC126B1B12576735C07D86A228A8175B287ADE7E4F3B8131164CAF9 1A65ACAC821C3060C06BB23A7CA9105BB0695CD11F716C3436B827291F363CD6 992FB93C91AC462877F5ACDA285A126B8F111365B1C1D92D4486D62A1FE91374 2530E46E55EF018EEEF3FCEC3A6EB860D4265880919A5E1BD739A91C781AB20E 36D55FF4B1E5A01724503BB192C75D83A2381CF36B5FAA3313CAF5DA7E11F2A6 932D0D2BF0FB1297BE06C8DEF407CAF8B96415601E72337BD5B1B1EBA0A88320 574B7AB8F58D746422DD419D8F9DCA530398F1BDE82F3F0659F1E48C36EA38CB F57CD38513DED98444EBCE3EABC4457E1CD638874ADF97542CB6D6725EBB9A7F 6882E96AB7964E708402CCFF1045350AE925507059F22D3AFC13384176CFD124 7CA9927A4724B65B11E601419F325EDE6F17631D54AD7060EC5C6CEFB398C8BC F64178597211A96EAE38C55953C232E56DE44FA04CDF0D4FEF2CDEC80E8E99D3 07C9831AC6F43B3E729BB1FC7BD80E3738BF732BA62A331F83F7EB5943DE00ED 436531F1EDFF543A563EAF189F05288D8D67AF7AC50DA5B2592499E1285F5830 E1AEF6CAC96CE58BD65EDA3C0C1DE3A0120E07B2DEB116C9FF9F732D5F8724DC FFD2C4352A3CB21F6D6D8CE2A161495506079A21E71FB6F8255179E1CDCE98B9 E42529ED2130712E6416D258E80D13126380DEE1E545CD13A15081020C2E43EF 27E64EF3C8F76919D1A579C12EC832007FF412F89CFAC92B2D67F9785383B0D5 AA7946CEDCB8AC73869B3326D62C75ABB91E0BB322DF7E27279493BAA4ABF555 B5EEB1FE92F648F0268CBBB035B93BE3AFBC9A6201F8E8D1DA4056F3ECDFE20C 8904BC10F2BABF7D126021FF899AD3E6FF1A07275C505E762E86FE853B3AAB5C 67C92E252853CB9CFE7CBC4444283453C353725ECAF2BAD9DEDEDC9C3EF60589 C6F09182D74C6D2852519A3D3BAF00C24A9204EDB447C7B16A0E1DE8CDAA665D 99F6AE2F0F7161F12DA7FCA414AC5BF998E77C7139DA1D95EB70217B60BF50FF 4BFAA1877356407ADE457836270E519BFD414E23CDCE5C61E35ED211315C00F9 A06FBB05FAAB76A6BA70B553271C39E7E6E818C3704443352A1FA46E29C1C829 B31F5ECCC0DC6155BEAC804931AD83E1B65ACB8BF179DBAC2DE5E1E26288FD5B 7BE448E3473470E4A401EDF37117063CE97A64AC9EFDD25289A0A88C134FEFB6 4554AF7A4CAE2216B3658BCAFA1EB4E4102E12C6F3995CF1CD3FEB1B374948D6 B1A6CD475B9121E3A3427481D86243D21E7A8D09D4E3BF68152618221D422697 0115CE345463F14FCA8A014A375FC973AF72D751B736BF7239C1B8A660186690 5DCDB919FFFC76E7C1DFD017D8E7826D0D669DB98529E1D37219292DD4AD8EFC 543B574D41E533B710FFC1F64627435D6E71F0A0FE3A13B17AF1D6CE166A2447 E373B96184867504612423BFBAFFDC7CB8878C44866CC42B5EC559DD1776D8DF 552E2564AACD4AAA1E35A297AF3541ADF73D222701B92F2DF60EF86CEF3E010A E7DFC8FAF0EAAD216392873DBDA8A55456283DFE78DFEEA0F650E33133F37E20 FF648F7F8F2B9892C7CFD566885D96D8F6850F9D9202F13297B02B2811197EF0 C86457516FFFD6FFB5D6F3FC697A6A757BA52E11884E47A098AE91A40F85E0BB 51440C169B317DE80010F9CF83CC59CF5EC6CC34D08AE174F2D3D409521FE2CB C776E83BF9B09E6DC69E890C0C3551E27CEDA3C8E87EFAE98ED801316E282719 D0C919172F1423029E8D02ECF70AC43BE24744ECB8A5D3F03B08EAA3307CCCD8 F6270E730AB4686C526110638478B0973290219F7207CB909B8685FA0AFBF254 57B2EF73DA09B96D133A14389F142C4E978E58A775681EF0E7EE178738D7F5BD 620E6BFA5A4142D4087D6F914F03E5BD2F89A856F382A790DC1E49B28103467E AC73A97265E93F4CA1345BF01FB2D00984556F6ABBB5320B5746935375C0212C 6165473602FE24449C20CF3035373873F959B138587730113DEADAFDC39D3193 B62B55225346FB74DC82A499AEE6D8D9A3023AB30CC6E9649F518DD13F51899A 80767BD28746F9B1C855575A00EB6ECA3D5A35138FEEE1D5445C59316E2B20C2 556AAAEB4D3D7EA35FEEA699BB87A7E6A07B0D58F774FFEA1FBCBEE5D46B0BB3 6C8ACDCA67D472AA8B605F98347A4E9EEA3BF2341C3A7588F8955DD5B616734A 111AFDF8B2E4CAA4F3D475042C530A0F3EE31907C7C62E3E180A31C28FBF63EB 8CE27FEF74E2A880B65A63483E765CB3C1B2D832A3A23891D4745C12BCDC5CDA D2F803A1D5F5E730505BBB99FDC35CA29B69035BEB2F4F7239D86B7EAC6B9AE8 9E86CD79AD5E123A6CCD4F32A8EE894855EC1D3C780A1D5B4442DB49B11FB6F3 157F398B7A6DF1C63D19E3110C6A073A9163169A4278CDD5A5901BFCD378072A 1F2ABA95A38451B6CC48C7DB554265F96F4A6276883EFE2313626887DCB2329E 03E2986F2AC5E0640128CCB2F47A35B8593861E00AA0F77A0C79319163BF0F32 2571D6EAD10C1B22C6A724AFDE852A11431CC7B3A0F5F093417B6CEDEC0D77CF 2B430548E24F44817D71F3537A4ACD6B9D52AD5F4E3E3483C6E872C76C424963 25A9ECE20BD75D6EF016126E4FB3F048B14CAE1A3502A046B8E09BBFF4A24AC7 6FFCED931CEA89B04931636EC30BCAFC969AF2CAEA7EE38EB6D5135581455F71 D5B9E51D6B9237710C2A946614D4BA2EDBE0F56EB16B589D3B1A2897723A5837 17A449CB958B1809FCF09A76B9A3F85940313CB3896924730BF39E6A8CCA5A77 209823DB9E03E8FE06CFFC794413E3C2F89BC74D5B1C80F172A18263A097E8C5 D6A15B0FE92FF5B1E10B4CEF1335FE4DE130DE31CEA2565AC7353B00963865FB E8298A19212E33E7021F7895181AE6BB2F57CA125BE61D9765DD872EDC588FC3 7C661C35F4E88F405288CE8D899EC5C0FDFAF5BA59F92CC81996FD819BFA74EF 6F9316DBBE437DF56712E8001649A06D0A73D7CDD180194AEDEED5A3F269B27F 7F1A82B3F52A95CF2CA47C09ECF7C4FA14CB6963985D9361A4553CE217D196BC 16C08B44821633D2EF898C825D43A16EF2B3AFBA8AE466C74621DA080219674D AC8D3768FD2E0B5D4BFA2F219FC273AFBFB1710D3828CF882D61DC258B072833 CE1E68B85E6ACD7E12D895541F6D35B8763066CB41A32630C611B89C44F1E911 0559FC3F36B0D3B86D6842C5A4B9A87D15482730EDBF70764A82499C17D0A0BA 285ED8E3B346F32A1F40873873BF76EEDF5E5DBEE6C47A0B131E26BDAEE0A052 6702A5C8C475910212B0758B6A883EF9BDE4FC08E6584122EAE9DCAADAE94BBB 2AC69B901A0178B19D1593C904DF06E63448BCF1FBC4A451283164E8C1AAEF70 2083806A5E76C7959C0CF832FE107456DF22CD311CA0BFA2C654BDD2AA6E6DB7 E6AF7F77EEC9E63979D81EDE1C06A8DB168132F441796FB77AE243D0F330965E 5CE3444CFAC91B4A01AFA2B29AAA98DE5208FC87811EA5CCB770DCCB7502A039 544DE4AB0E49D9110067F9A809D5E5B8B56C62C1E9BC705B3EC38E06EC0B6E33 8452E80CF1FDDE722A8F1418FA3D483D457E17240E249471EB88538101EB20FB C88B12B01C09DF70A0C85BD8EED2CA8C9BE660AE6708DFD4A9646D440FD56696 2FD4E71D504920BD5817D706EAB8166FC60B0AA2A8DE1290287784D07E1C9085 45ECF071A99236E0B6B902F6C495347E1DEB506DA9668917642834D1FA0DBA18 A94312A8E4F3399F7AEA275A1AB7FAEC5C924EB07ED91DA75C63BF47C738AD14 B328606B3D786E6E1B7E2CA6B5BBF7073DFF195F41BE6A116273BE2B65C079D9 A13C05BA55F32199E239283B22AF40410668F2A9242FA0EB3BAF127209FCBAF8 1493374C5572B6BDA477F3EBFB060A7840ECAB947C8649976084B72884F8E9C6 E3E33736080E71148AB001A4CFA588E159C3E655769F6F2003AB5FB64191B622 7784FE8A6390D037F8CB25DB440860B7732A778EBEBF71661B6374807D0DB754 33BB68BC9B5B48695CECFEA594951AA4458E9BE3321273E88CFC13E6A4F22E85 90DC4927632B1670CAFDC1E5BC36438772530C1341256D817083C7D7E93DA98F 3AA701AC42EE95D22DD1B84BE3DAB1AC407B351C2E308457631140D1CE2DD183 EFC88CEC286BB5D16225B4D621D59B5D5F3FC478A2067EB0F2AC3D27169DBA59 614A53894FCEEF80055F61DA79E5F40461BEF3E4C9885D94BD26DE36DFA4B5AC 115BFC152421C5507D7161DCF1B5B8AEC021949401F28C04C54BDB155F371B21 A6EC1D3D2C54E5F94E2BF4A7748544605397C048C61E8117C65D37B778C33859 62397E72FD2A01CB44812575911167CE6E186FB5259AC61C6EB828E48EB81351 E7123E05505BD83DDD2FA8A26B6344406960A1D63631EC68366351B0672BBB08 6277038D76B9549CA1E13B187441B8653649021D82BCE579412E74B55762D049 282DC97F515B484B2648AE25A1E714B32C673B13B691371CE812C888C829AAFF 362034C8FE99A2E4A7191D374B1C86828ED7131083B675CB84201A4A803484C2 C188B1E7C40C6D763E7F8EF2B7A9FBBBBB6F479C2F7752DC181A98DE7DB9C8FE 2D4A9D9A6255148F20C4159DDD111BCAA14D3B061DBDDC8A0727DC0864A85230 C5003C8C0572D5EADC3ED6F29877816746B3F061D6B8EA1AAFEF24662CA3582A 26ACD31B7687808C0CEC080A96828345DB44B819C55F4B8608CDABA6F4412C6B B0CE81041C388AAB2C6C5811ECE1F2B78F64C544410CA49E0EF861EC281E1C8F 5C832EEA7D39C689F93550F3DAC67096D96731F3F9DE1E0206CF2F4B886AC754 CEC1CBF00DCAC8C64068B2BF3436FD421F4081916D23676D647319EBD65BF018 821D03668B1E7F22CDB2AE7A9C5B2C44DC36ADBE59C58C1FB5D540BB6A82A70A 37A661D3B7147D404BFFDAF1ED16FEE2AE71AFFBC76B051030BCD3B01EE88934 E827E883F181D9B0D647CC44FAFFB31B25F377418D0883BAFCDFCF54EED750A9 0ACE9B758BAE0848DA0563852DAF08CC96E789DCE79AFA3DCEB7721CF4A5FBB0 7C23B201DA7A2C529A400B675440397812C5668E0DD55883FB65A361BEEDDC0B FFAC819D65E7BA4B36CCDE93177A4E3382972DC95235339443C7F2D7AC157B42 130CF856AE50661D2D1E4AF76E100D7F5C57A870FD98E33F4CFAE1C2654B5B24 BEADE2A91AC1D1096FE3F639E35F1BCF3E3E2F0C9F225934B9E6432D3C81D179 6480764941DDF410E6938F4DBE69DEF541DBDC36D1973D177EBDD9646329F099 C270BC9A7CF78160ACB95CC411E67B8DFD83838188B8FBAF9BC1059BB585E961 F9A51F4F0C8C721ED78C8E20C35CAC11AC6048A495C8EF2543A31814C385B68F C18CDF2145D519CB2B1337D01319492EF5362AC0D22302E2B9F46896E77AC238 22141EBB29BA191BF73CB70122A4CF3EE29D6C56F4D57D118FD394098254B7CE CEF3C97781C1819AD31285B058CB1A08F00318541919C9249E63D7BA5F197C27 F2675180232ADEDB5EA04AB2966B22E92ED22B4BAD2FAC76634C8D8D28319DDD 25318B6DF5774A44B54ACBFC4BFE2105334AAACE0B3B03AD9A0A0D6E3460F463 0FAC9BCA9EF964090DA866113B8B5AE64B570A96164A762E49C49EC7AA818A0D 4F115910082008BE3B6A2D85B2D1E3F5A259D43A94F8873FC36F9691B50871D3 25819E7E827187BEC2DCF1A53181A332FB9D0E183C3EC17CBDE2C8D16A62D9BE 43ADC8755F19861F1918A9E31612AD0FF45D2353E3741BBD76ADC1357E08CE8C 9355E79A2400E0036DCF61748DDBD73D911956753BA9830C4829D61D4636E192 971D2614 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX8 %!PS-AdobeFont-1.1: CMBX8 1.0 %%CreationDate: 1991 Aug 20 16:36:07 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-59 -250 1235 750}readonly def /UniqueID 5000766 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F05C11F9A72F5DA508C30BC4BF52C8B1EC5FB 7F9DDDD0964A6D59193A389D490DAA6F6ACD02CF71C06802F3AE5A001F2B3A6D EEB60E9DD26DBCE1D29C825A9BEFE3A6572E70DC7B60344C3E0C9C77ABE1804C 7ED61C544F0B4A3D6C7662DE8575C07BED3F6DBA7D64A9C8613AA152B74A140E AAD9B66E0FAEED6AF9D1820F361C1269A5E90519A3E6D40782E06778C0AFAA30 E8CEAB87054C4D156C1B14B4E8471D78648FDAC70A3B8ED474FA356393A77420 4211F60E397D2FEFC6A8D91A80C84EB9E38E663249FB91D5C8A5CBA68BA04272 5D5D42497E1CF5CA1E62EC2B139F5CD4D6318EBBA7AE28614D2D88709C2A3762 611524B8A1FFC7B0FCBAF77AD8159C354F4887DB1A27781DE0A4BA7DF2CE2025 D9278CED48584E8E6BDF30BFD24284BA1DF828B637BF84A02908BBCED67372C9 EF44711BC2B1DA343C8D9D27A9745525C774F5D639B7AEC197CEEDD06FD27923 35ED0D402AEEB51134665A47847429D91CF419CA9B09DC905F610F8DFC54E606 ADCDA19D5CC68A7BC7108EC9236C64205B23CE68B9BC38EF3E5BF9E0E6ADF404 7365C8D0436609438C82EEB2F356F79186DDF6C1C797D3C278108B1767D15178 C4C3E8ADC2482BAB9536AE8419E5CF3EE1B6E53BDCE2A83E2E485F496A562C10 B3F5A131BB19D1E5414C86C5F995521076340536E10613E42779FA15EFDB451F 53495CE8EFF239E4EC442E1439594549D45F5276F93D496C9AC712D762D0B702 E894290BA028837304AFDDD8BAA6564E9DC307A14A7A206550FADDC7784DE3BF 3390188BBCDDD929C82B1D7B529553BA75ACF5B385D31EE3902D96B2B5DDFFF1 9F0F90FD791E54128C1717F313486896868A34FAFF22E23CEF046D02C2745531 F54D6E8D8EFC65E22D757B6256CDCC477AB1F213B700DDCEF95BDFB802CC62D0 BE6FABB902093A4525B41464FEFACC20B308A2F6EA14ECEC3C07141FCD2C493E 40A7F6AD7FD0767DAB2462FDAE8B195B7C059EF6E8F78E6C86552C0FEC53B3FD 183F697BCEF2F860A7DDA0FFDDADF60739A5B9F5B54122BBAEBD911AA43423B0 E51CE2FCF92B03FA1F9A57B18F3442FF3DE1241BCCC19ACEE29B8007077B77F9 0D27C1C23BC4AE4E0A31D1EAC63B74E6612804DE56A1625C76FFCA892AF4BF83 4185AA2A9DCA5CD7008536DF97A7DBE30002318204E89EB0C810E8C0FCF9998F 6937BDB9FA95EE9ECB4084DBCB59908EC4D1F8FB4847A7E4FAE17B9A5D3D9026 672D9F8ACF91A3857B557496556813A5B37065D82F7FF8BF33B317B37BA84C77 881398E92AD1ABA74EB8253118AE8D8DF170A1BBBF3BAEB4057E055A2C5865DD 7ED2134D35043142E724B5F4609A86944950DC8017E54D6E606DAA9D89C4DFC8 EEA602C4D3DF827D41F03509B365C7B40962CDCDCAF6D4A0131FD1BD349BE14F 607F15931676F83E115C782D86FF3C6F80F1FF8E882A03DA3C61080C71A1AE3E 35BE41C3E54D56C51FF93852B756A31B384B69AC557DDFDB9FDC04FC568A3724 7A3A75820A142888E8E477FD76C69688FAB74BE868B3F5914E29C1B4FF2C44E0 6F4D0E97CA0EBDE006C2FDA10BA41027435973234FD5DE19F4F4AF8C402F4DD1 25315B473D6BDB25BD74594F98B9D413309A9F0218576F8C7C5D01FCF2A9A0B1 6ACB2E7E9C0BF33AB01FFC3C21DCFCC5F881704B65BF15129A6F86681EDB8D8C 9DC9787CA5E76D734A090ABCCADF2A62408869831AC60AFB06A9E0BB207193FB 9D9E2719A9C72A27AC57836FD9B2264EC0CEF30A00D64DC2288D0A33B3DD9D63 08681FFE96CCE27DABCB50AA76E4ACA711C8DC8817660B7BEE4B72EE7F518E48 8CBD4F24AE1D07A3DC9D32CDA78EB6B5BC183E68A3ABCE0FDD06F32D6FC4DD26 CF4EB2CB466AA4B4C157A154E04C89DFA603C70302E6A461709CA8F52ABA1881 A60824F714BE611950D9297C14F565BA864793BCAEDB8A55DAEE0C783A474C9E 7BF54F3A63F2DDFD3B7379DA4B3701F0021E339B6EBF74CB075CCFA29E11FB09 0F26B0A57570384327783439CC2DF9DFA8D1D056E72720E600FBDD6D700231CC CE2DD5E38940FF69D81978FB8481C7DAE554FCA186C70B3945B3C84ADD01F4CA 1A59BD7D25CDEA94934E977E7E803E35C723202DC387ED2168C8F5BD373CA2C4 EE0A4D751F034B285CA8727A6B312B7A8E46F3713EBF93CB996A771C3B5C2817 36664775D7451BA5A46008542A12BF466720A2B9064D018D60F4D5913C795068 BF42181AC0AB270526351A277A1B1DF2A40F735DF61A38ED55EA508E6B142546 BED9C4554A762D5443CF510A554AFB82950ECEF2B1F5996F5A88B6FDB08200A1 7A771C77FA1D45B2380981F21455AD98C916676DD12EDBD1AB18411A6996ACB7 CE0F7CB8F7761A1D3777D3E7DD265C64F08168D62373CCF9D88CC60D41BC6BFC F36377724A45B7AFB2DCEC91DC0A2F2F93795CA33529865A186835CC780403EF 919CA1496BD69FD4A9A2995E3CFCCD333D36D4AAE2D2CAE74D30B73FF3A7CEB6 67A05238249AAC9AB827A5E5C3CEDE33A84A45166300C234BE07B33279FDAEC1 454393B60EE0EC18BF4E3CCDA1607075D01118455861827C0056279BA611AB4D E4688B7D6B53F0AA5174F2B3E10107EFC72039EE60787B580C93287924F2F322 792B1455EC910AC7EA7262288E9C481C23A55D1A90597A58E60C57837E0CC3D2 547B04296013C96A1C35DC7CBAEFBE0FEE0EA3DA2D3A0059F1C2B2056693DB5B FF76529C73F8009D2B31A94B9CD16AA6B07B52005431D777C173E1807C77F35B FCBACE33201D56ABAAEA40C92FEAABE85440A95AC35AC95593E76DAB34778D3B 6D5F164973C7BEBE3F239DB5475BF39632F71658153CC0AC7A6CC5076DCA1CFB 277AE44B424F3751A2438FA87CF218CC93A5B79A57A4958F81DFAEE7A20181BC 0C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR8 %!PS-AdobeFont-1.1: CMR8 1.0 %%CreationDate: 1991 Aug 20 16:39:40 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-36 -250 1070 750}readonly def /UniqueID 5000791 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA912A2BCC6CA6105B29 044005DDBEAF88E0F05541BBD233977A447B469F013D8535A9D7023CC0FB7B49 A95CD2B6F18935C37F49E9A73E97A8602C5C26EE13D7A04A188336FCAB4CDEE0 23DE9D803FD6E8D846B3F729BD36137E834E016242CD2F7BF048959DD45AD413 19B985D05E5D422F3D0968375EA6A90FBEBF8B42B15F15280469D69629C08A42 1C298CC027CC288B9C984239ABB96B6A891C1360D08F9ECC22202861E4CE9B39 8BF14D87ADA30D12D77B4DE0213C34482117DD1118A13F464A6577136D86DACA 0C0DD41B3B4FE56333B5D3D6A1E1F92C0D52CCD2C2DEA79A1042F4550FF19D77 46CC85EE5CE04F183093EF47D86F494485E35E45C64F361750E7146A6DCB3458 5A7CF93625E21B5A0651156BAE3EC566D274003DD936CE2A7C2FD27DAC305C19 9A7F93A5A7FEEC624CD7B5473188C1D71D21149BBABDF3990BBBB99F063AF377 002C603D32C9F619D523EF6C378273C1BDECADED0F1D4B0A861598590886C7A7 323220A64C04FC8718B86E4FE81A17FA138B88FC0509B5FEEB4E4716DE5B7568 8B6A8B4DE0DB8CFB531F9957B01BF0CA1F63D063CC6F3692623FB5ECB533F8BF 464ADB06356919FB5CAD99451E048F071E48B9B4B0EF466817EDB858C3186234 9E42B0051F725E80204DA3361B52D1C7FF4526B189A1CA890D26C96A5D6AF6AD 10250632AB38BD9BEBB326A0F22203BF526214DC95D06DE09B3AE691CAE2ADCF F092FD6D3DB416FE6DFE6B734AC2E6580DF636165AE0D0DBD5D1069AC497801C 47A0B13B5EE86A3D7BAE0E37B03E87478600B037A4AC2ED364F4C1ED9A8CFE51 D5749226F205754543108330EB34E4F78CDED7D2A7A8A15C59EB5D009281ED58 BDC82465BB303EF2E74611A215FDAFE903BBEE0148600A4C686662928ECF78D4 5DCC54A4B6902D4C84B098524866ADC7C7DF266DC1250BC5A9FC9726212A5157 94DE6DFFA3EA6BDEC701BFD298FE9CFB2D0C304F65DB019E1D0352D3533BD910 707BA80B074F284018EE77F6AFA62296A2F3F028686B88BF66927C8008DE7C8C 67E3DFBD80B14DE77DF92F75F189322F874306CCFB6F3080E55756C930AD2B2F C51C6DCF265165A61E9C7B3B9D088F8DE4B9E5487D5DE54BF9A8376DBF56F3CC 427ABF7FE6291E7566A80907083A57E347E095F9989B21FCC99F3B8254A11734 E96C31ACCAD6CF709EE1829DFB977E4A59BB29954C37A232BFB297B7F6EAF9CC F7E0245B81CBE916E3FFEC00043164ECBC28394C81FDCBEF0968054A8A548306 8B2C8375608D2B2F4BBEA3B9B9EE8D012CA48B259EEC90D838F5F1431AAAAC72 EF32D14C3BC1BFAC270B8367DA65FC5F9B2BBA81022FD5E25347F2440F64F0A0 4B258B0FFCE1ADE49A10882E41DF3F365B22AE1B9D7122CB8C3307C2DDBE2346 08D71F94F18B5E0AB93BE1EB1105CA6597732265B174EE7230BDC65F3C10E0B6 40195BBF186054769976890446A2466A4FED6013C161D76C1A57DA64396FB95D B54452EFCA199594A475343B141BEE35FE0922F359534CCF1421DB21BEAD77A7 8250ADDF7A83D70CFE06B25281623D32C2AD29D7D498588D04DEC6264A061EF5 0923050AB85BC5B12FE0996936EAC5D0B4E10F3C07A4BF12BB34A65D5FFF0336 6E48B2A382A6FF99D7DB3A616D4B6795F454C8B10BD4E47FC3E6AE4AD46C9B59 173CA4B2A8039B633CF8CC3D12EBC8E65AB7350BDA3560A4415FC323FCC283D1 9CC037E30194ABFFA4AEC60D862437F4654A0229542F8AD3061B743DDB1E2FA8 1DDB66794CE15195B0975B522F13B86221B6D76B669E0EA795695DECF6887FF3 0730BA7DED563E5D4B7750D3127A6B823E642A98046C513F538C69B699E0A5E0 DBE52D94F790D2D51E1011A285501A822912BE8A2A5640C11612C29069CCDE98 952A559E0EFE545F6BF381963B46DCB7EF0295E293D85F247E6584659A1A1BED E57E6FF205E6AA7D12C74E06226B3B3B73217C45295DB63FEC2B85A292F94C32 074953855796C8E8341420C2E59D40138C70F645B63E5F28C55F1E1400AF0C7C 0A412FBAB589C0578AC84C36DF800963AF6D3BDE581B72DAF1E7797CAC4E7CA7 957EA9625B47C36B5416751982B9A6442D43F5D52021D3CD4486F94D27B32E94 DF660C907A1C568A0EC15F58C98073252CB1FF7EA2070387C985A42521820993 DCB6B04170F066F5E839542AF7C8BEEB3D5BF90C0D0316A09B82B2EFC4EDC17D 4B7855A497B8EAFCCB0290EADEB272B76C09F71BCC2F42AAC57C0A81D85EE86C 0ECE75C416F8F11205AFB23848C839C87004111827D4EA2A4E2EC87361908B85 7211AC5711E469DB6EB363C848AC0C9F0D7C38628F86AED061ABE7A0614FE38E 4603DF69CB3502A37594D947970B445C514F6CA0E7E65BB6DDFDF5F000B58674 7A47182ABE8BFEB94DF8DCEE125FFCD526CE9BE93108D57C708D6ACB38715A61 46D231F54FB1417FC08A32C6ABC2779A235F75579C0DCC1A838728DB60A144DC EAC66069328D7CB5D92EAAE05BC53CCE1C9CF0466C2F7F151E4D3E60DBE02E9B 8018BFCD50438CC3A7778025B3477EFD4322B1052F3493DFF7932B3DE8B623E1 8974C9FE440C4FFF0DE0421D69DABF5863A34C9470B837F4C3D5B177F3F19C2B BE7D6AFD8FBC47B2BD98C3806AE4B13EC54DA804D72A8F829D2B5E393C3B213A EC440CF6545A2D6799585ECC33122E9C19DB32C2A677F912D4CD642358BF9A86 4C36604A4535EBD972246E44AD4AE7D1D26049E3477BFCECAD566B697B8AAF79 9A95A5FD3525B8BC26211EFE22DEBC0B3CBAB665A2DDBF4896FD3D3DDB66B6EC AB5314C8479BC7159DF3A7EF712875AF2BF63C13CDE1EA439AB74E8CF63445C5 F23652C3F89E3207B1E72FEBC90168409A7596A819A1F6F21ED83878DF14D1A1 94AEC6964ED0CA804DFA407590C22B5F321DB5B927CCECED7F9C4BACC65CC7A1 DEF51CBDAC09EEC03F11E933FB7200CDB977ED5DEC620C85099B2DF97A9A84E7 6FDB095163111FE25C2D928EB4B37C5DE47412220E34E7A764C978D0B40BD61D 2C877A70C4C0515471A3AF18FE0050B3B097F60AA1F1D1522848D55FD5BCE3BE A5EA6840A8BC88BF43072BEA295632D745BF5CDC3926D211F7D15456C15F6F2C 650C1B08C525539CC134FAD73688B1E01D54E2C1E083E5E1729AFFFBFE7D3A68 26351DD899FDB40AB87A6EDDA05EDA8A7E82CDAF3B5FADC68AB75D63AD07F570 0EC9F4E34877FF8B6CF0D4F5105A58BBB84BE3E10BA76DE6695F7C9977035E09 995868E8E8715A455D0FF75926C7660EAAA1BDBB407824B158C21F01BB52442F F35022A79528BED41EE4D4BCD57C51D2DB01CCDACF1A1663F20DB9E49494ACB3 799F9E295EA00A0C1AECAEE17A7A44B713360AF9ACA889B35CB6ED591E62D70E B2A052772025DA237AA2C47B1B75496BE613EB7CE4000B8FE97DD89C1FDF414E 8052FC336F655D70E64BC55C80FA16FE26D059382E0F8F24C9C4F9A52FD83279 FBD070BC7F4660AD9C6AD1FB86A08916D9D1A382A15E0E3B1F47DAA5B534DC91 5739B75B519D73C8C964A087CEA7F7B43CDEDFFC1CC1BDBEFD1AE8FD4FBBB0F0 02353F08CBA05A6844F3D311EA72EDF4B925DFE1EF2A1408131DA2588CEE862B A7CEBFE9982EB204B4C467F756BA275EBD1E53908CA144C15ADF753737F4BE0C 3100B20EE42EB3F483BFB50A56340F4C7C3095CA0489EADC505638C799CDB67B DE6EECC6D5C16CA0CDCF76F462F70F76D96D683884FD1C95E9A56559444B6F77 60FE5B6B6EEA70888749E67C3BFF0EEA9F6EDA3B1F836C70F602BF608E070A11 5BB363B7D354DEF8FF90A131B7A3E777C813C8C07CE772A14326D2D5E5D6EF1E 65CC2046014A12207CF6F29BA8EDB4E5A8DF7DB26331665418E45204BCEF7AF3 3BE43B09E0DD31C9B0ECD91ED59860788554C73F7852F7706107D4C47F4384DD 25B0FA2CE832A9F0C137D4929C6BFE9906F9E9574439FBA3CDA2C6E09B74FCAE 7BF10D30DBDD62A51042EED31E00B37CF16FE11FCB0AC5CC1BEA426FAC2AF61D F261CE226158BBE1231C3D0ABAB4C120A0E7289C4DCFA4495305F8B3D2E69B62 3BBF966A082A26319E28713ABFECA1C8528621A12D4F20B714FE6A569E491B6D EAD3D5F37CC48E4BE4BBA6C49B6D4812793B13690618197AFA172F62263CD60E 15CCA69888A8488166AC8ADAC4F75CCD908C080FFCC23D2A5C2F85A314838C3D AFEE7C6E95EBE96DDAD947C6C9EDD680FCEB060EDCCD061061ED41216077071E D60F8293440CFE5E227C0A560128B5610ACEB2BD14CA658DA867E9B44DF0B492 2318FA8B9CEFA71E414475F0282B93D41EA8F3ABC607896C921616827810C192 DD48D9C6DBB9B2902F98E945D1F0C274C6813EDFC2E41AC56F4864E265A541AE D2D74A499951B52C6309207D8B5516F0D25CE19A26D1DAB3FDA41AAB71D80DDD D22DE7E1632A7F315B70508A4771FA4B4D73CE16A7B8B5DC296197669533E30D 20233B45F0271CF2D7E3FC5AEEF4DC66204DEBB7FE2465DA1EAB8766A437AE10 0F5A4AE7C1803096E2C553CAB5A67642D09D2627D8CB85CC4731E7A16530CC05 1F4C5EC33A07A4370F2B7C51E82B4C5A9D0C0B5C2930FF85495543989D1DBC38 AAD7E1E686CFC018973D9AAF080F930AE5E587F78B32B01F5353843A42B2FC64 8FBE3C1F86A436D8C7F72A980CD5421822FF6EF86E70C437DA1B93BD72050E6E 7B10A327EEFDD4EB7A6A4E6737A62C94506D3C3785735A3D5026A45A5EB8D601 86F5310DC64F721868E953F8E5C4A5BF895CBA1AC7112A2665601A2B74A6CF2E 1C745D8C80E79AB24DE4A166516D22F9C3471A55BBF3986BD87857004F431AC3 24B154B263541093A0E415398CF645EF24ED35B16D96B25E5A4357F988235138 CBD6829B55B9C74EB881474569CC8A50EE45F94903262D4A0FA88EF5F7E80938 37F04C8CF72F6BD69171006A1E8270A2644FB2A109DD28A1B52B65C742B4CB8E 7180A1E8644E3C2D621327D6CB3D10C6984B9DB6AA749A26D9E9708330E21CA5 946B331970FCBAF5FEE039E6ACD9D027F8FBB8F9594CD94EA7844E7C90DE7806 84B760E071EEDBF43A7BC3A0BC78F47316B03D92D7957E4BE5A2F9C093797324 C2BC9F3145400D60B232EE28B081BDF9D6C8E306B29E6DF19635A7B5C58EE73E B9E58AEB00BF2A294D2D2DDB396FD8F257E78E4D2F7D4D75A2137AD992FBC8A2 40DDC42FA11DDF01119CE4CAE1CF4061EF835920DAB347958A80DFBCAA6DB954 5BB18E9D0278723167EB33FE07C282245456A346CD810EF65717571BC4EE0E84 ABE34A41736F2798DA9E9B246E8ADDAA0D1386BBFF15D00404D055ADA2011406 D05B0FA80ED8B2A684BFEDCE94519528E197D389235E74B8BF0FCE66E3A918E0 B0BB03236AA2A6D37516D54DC444616D0BB5E6A9548134D4BD10B6E34993FE73 0076953F595111C2F9F92B789A0CABA375328B3F4559C27C488D9458D7DD6350 D98C15752E816247BFEE234C32ED1AEE199EA642DD75BADD0543E916965EA897 9A62A052BAB4BA2C984242828DB87D105836CD530715DF797BEE7AAE66EF93B5 ADBDA0CF78BFFE02EECB9B959D113B4376C3801DC0865074BE4A3B69DCFCE14F 6AC2A5A01F3AA22AE80E1302B2DB3841B4C9C67C9BC4E0792FA413D1D54465B9 F8B343EA28B8A88FBF96A5477D3EEB646400152889ACD790515E670B5EFBA720 82C0DBF9049F1A30DAAB4B2476619B2F455CBCDE230738A95624D96D194B0670 3FF24FD1DB3E409343F5950576AD96E013344FED5829F30862B197B30DB9AD55 EA73CA5E01D813A145178631BD89C70CA13061C7D2316B415534E8BD2FADAF63 4A072AEB9F2D596DF39F2B9A09F7FE7FF5D9DD0130BB3AE76F481083264B788A 3B949AF7E812C14C70FBF596A7F0715069F7107A009BD0493F29F03BBC67A6D3 D9A61A944F17DA836CE2EA152E68A391A49931ED34E58BF6A236F620B043C76F 4158F4D145DC16A4B6E87CEB43715A74AE1E4A07A91310568A9366D883345FD9 92A62266FD243563BB9697B1028A659E4DF279C00AE4886B148E3E7C5FE9F846 CFE85174340F541673F6158989CCB096718FC63E35D83163B1838F89FEE1B3EF 0425F01ADF107A206A56C16C49C51935A2092AFE169F06C535960AD962B61672 5FC5B2B0A7A370AFE636F2EC7D5F0ED77F1FF589EE073FEEEB9F2D5F23CF34D2 FFBCF931E50313102BD5B71419999F0B5256544B972095151AF2721BA05D1BE0 540B282E8515086ED78562020CBA030F5DE444115D3EF3301BE262FE8EB889AB BE10857328CCB4949A37B19C2956EAF967016513725BACB396D62F4CBEFBCE54 D886CA84FC327582D689DF1CEC075F578AE5086927EECD7E9E489EA999D127C8 BE09C4340D9F58E5A3D5B69D41A54DE8FD49FCF10AB914815E5D2879CD3BAD32 12256477876A46A9C2593AD7785DF8045D21642574F02B2362E99814472EFF07 64F0DDD012FD3E62EC12537D28B3AB08CD0D4588E25DA7C61D3B2A20229D114A 38246263D5F8D225455DA0193676B9A387E4F22371743DD8DFCD0A88F15DFA2D 89D75B1D57ACF85DD22E549D6E6533F2A2AEEE88DA6541E5DEE6CEA872CDD12A 29A4EE9232E094B10C7396B53DAD52E461BBFC66386B73E3160A136FE36A8471 01C4F899E1A13C423C7D00C190FFCB5FD5F931E34124F7E1876C51BFBEB01182 B9D92220FD2C8C9D69FF2AD62CFDA82202734811DDCDEBDF7DC116C8FBC7F80B 192C4AA04F0C81D8112AE8FDC85B3F91A352D9FDB4F41808691E320BF2B174D1 5B6BA14C06ABBE52BC7190D4BACDE7A27D2348D6771F6071E22D7C70FAAF8E84 72C48AD06A4896893C6E5DD0BED674AA6868F91D131DE8E9ED0A1D676194FFCE 16CE6489B384675EA3936BD0FDC6756E1DED68387C53A9657C4AD6A13847EE3B D55D4DBB362A123CB01845913BEAEFDB69C3C78403DD9F50ADCAD18DAE31F693 89FA4947BAAD3F2F0FB6CFF2278D3077115552A348B90D82AE40572DFA810AC0 C419BF929BBB57A010FAE3386054595864FA75C3AB38266D4DF07A4DE05D3186 9160A774D5D3208092FA1B9E193D7515BE6781A75CF5B19A39F367F6A6E01119 ED9C10AA2FD44F31AD801FEC6DBF5D6659886AA294B5D6D264BA67B6D9714DE8 F8A7239AE537F25529FBD8306558F120928800AD23DFD3002A92BCB163A71560 8EF1C0AD5958DB46483441A5808DF333B61B619F77A48898598E094DE78DBECA D98E968592BD7F256605FBBF4D5CA22CDF6E8C5F10AB270CB11AC93DAD33E6B8 6276AF5D6FE89D77F1F00A7F80DEE9B6CD42F3DF7F3F10A837266A66F9EDEAC3 76D17F2BC6C7E3591204E6C2525DD1A13352CE97DD7ED43F7E713F27B81205D3 65CA176B778DA83DD0AC0DCF613B22FFBFE67B19D0BE69C45061EEE62C590248 037EE405DDB4F1952B0CFC9C9C346719799B605D906B857291D999A623F3A65E FFE994F22F81799C3F6EDF07A239311883E84EEFCC13D6CA58D5BD8A967038CA 2CBD2676EC0638449E14E089F6BD67459AF024342B0F82608CCF5F59E7222539 9B24D2F81709F41AAA29BF9F1CE59A9A9E223C8EA9C72E1143C8F0634B4590E8 F45791B4A872B69A9B2E2B2CFBA26EB70B8E125EF5C5930C301C275A39BF7025 180801D1D79A5A09B3888C070DDCBFC0A82620A8CE569104C393B905AB3F6DD6 E43E84579BF4E7967FAE07DA834835E43F8A9358005154138E96F343913688CC FC202B6061BB6CAD7E9964A56306CDA916E2FFFCF38801F5762D39BC16F55BE8 9243A4604369D57E9A65B86F0C353ABF2DBC28A014F0E8E90EA0411615312CCC D8885C6AD4EB6CEF126827072D3A350F36FCB0D9107BF81C6231BE178BF1D416 3FBC09E0D9C5FB7FA098516628A82A03D772519831F0632A30002AA3B7350426 032C5599E9FDE0996D1B568A290DF841502F332071402909C6AF9C6DA0E0BEAD 20DCEA0CF5ED9A0FFB6D7BC8E516826D20ADBF03B11592CB4EB45EC0304D14B3 2685984B23C2233A3B1523624E5B5AB4037342ECD5D0B65ABC9D54EA09AF9A6A BF9E32414431B255F6283212E147C250277CCD082FE269CA924C55F8F437444A 6176DD7B36105EECD125636430DCD03A4407B53D1D0F1E7E276B353D2F12A7FA 9C7F1C61F1543944FB7C38024DA46141397897EA4BD0E77D5E4077893CE05AD3 D63237F432F66434FE6D3335C2D3BAC121C6E5FD5E9AEE3E76D8A6B5C97590DB 8C1582CD398AE33C87CF71A3D691D39920B14AB98D9B1644C912B273A25E7D0C C099AAE1D2C1A92B912121800D08871EA86D85862AFE86625F42858A877EDDEE 2E615A201CB3D58C8D8002E0B856FDDB2A6DCCFF9BE4191BB827D1B560AE5B27 455E6B1C001005514FFFC6DD8ECAD8EB096B346E25C3194110C57E1D2085413D 552B515379AAC9363822890466B23607888D034CD0AB9A3205C9E5BA4185AE50 CB4DFBBF5EEDACF9CF554490DC93FCB7D9942798074E0E7E9E0D9AFADCA4F65D 58FE568D48C494F9167B55D5A2957C443C6087017251836633E4603991620584 B5806346780046A67B0717C4E2671571E5B717C3822218F66F4D4BE12752E428 48C1452FC17D26AF4F68C12889627FEC414DBD1FCAF3ED5BBF524D0E93021699 697440A56059A66A8B83B9ECFDF04C5D3CF9053782057D54F2A5BB7D82838899 F11C6155314E94C9B4D3140261EE9A35B00BA1FE187DAF59C30AF2A661B7C0C9 407B7824E4E97C31AACF4C84F4661FC087BF1A78D0A776147070648A5FEA6F78 B83D4F59A1FE74BD0FBCF9D106C79F341382E7351327EF98E15B63A204B4CECB D0FE35A1CDD30F7F90D241DF969FA8C5ADC3274515C4CB78F7E42219E01D70E9 DE219D0D403118E15D2A2023AB32F6481786E7328676E7C74697C0BB109753C6 4C0A8475B0DDDC0137B1383943D331E296432769F442E064294E655652578E2C 1C543E430753DACE47AAAF582D669EA63338B2CA4428AA455349AB4C45F49343 DCB826045B2111AA78ADFB4146323CE20C3C2EFC61B1DE2E341661F2F31B537D FA1043CBD68C68D10692BDB282FFDA0D423BC1ACDCBE44991786ED49B4E1FEFD DA153AD44846BFBBEE7D2192C29F93205588742BBDD75370B996194FAA217C34 FD8510C7480849895DC59B34D047AAC565CAD101A3573B7DF64BE45910C79969 9F1C87A61A21FFBC3A26C88EA4EF3B1C977BEEC4F8FEEA7FAECFFD671B5C24A9 2A887985525DB98B8D32CBFDEDBC3E07FC49E1350DDA4F9DB7FC2710DFB628F8 5492F1F463EDDAE3EC75E978988DE2F2C669555A5380DB5107F39B7319569A7C 726592876353D8EA950DB5A7D3EF6DB729F00248962B86799AE6FCD89871DFE1 78C7D6745106AD18FD7606FFAC3C39E04C9F412180EE81FA7FC9295943B7A5C0 72258AD1AB4CE7248B59B5CD5D1E2523C10D890F009BCF44DF8052685112EFD7 B6C923851FFE0129005F5CAC9AFD4C86FDA618EFBC01848EA39A166394D3214D B8D67186BF00CB7B2642E062882F3484F28A668873925D72F44217F28B52FE5C 2ECDE13F05DA587B675D9B9714ED97DBC7235CF75C56FFF840EC363359B9AB43 FE82CADE163AA8CCF12CA2915604727CB8BC2D8216D089C8E8FB732D425EFFDF 7FE3D6FED6B5D6A9609A64F65EC5D352DA00E66D07E95EB2C2C409232B2A77F2 C60910988124651DC39C6222D2EA025853D16525C7B70888F3CAEBFDA5EE64F3 C71AF7E3A8EB44C5D0D918DDA811CC58724EEC676ADAE1CD7BCE63A2156324C0 FABD564BCC7B7526887743DA557E1A3570FB09D38FD5E82A1E8D0E6CB9510D6D B1708B01599998BC1FA5645E0FBA7F8A090B1580B06EC8A511B2D299F49B1C65 2CB227810446C8BCF53FEB9E04785D7B7A13CE9B12EE6E5A9979BCD9EBD7ECB9 9408510C79E05B598838EC9F0B3572AEF8C8DD67F3F2B3C6CEFC032DC3796A86 FE16D76327E9CCB80423317161DBD2FDDCA11DA108D2442090362CF879358DA4 7062675C10E0B2E910E00E9B555922A0ACDA9F30121F3AF7EEA120D038AF319B 95DD677AAC19F03157CC854CC47E1799F45B1DC2C7770E67FDE5A4BCE5E1A06B 3A16A497A70AEDE7F7573262D97DD8D9DB9A70A3C3A26C624DE80DE8D28D46F5 3BCBDA25F1D1D53D8EC898F2591B52E00A920227686ECA0A99AB298A51225C64 825FB0800A6BC11045828C1D07AEA6E4491DA5001C927E6A1FE9426EE14D2E57 2252A476F2DE264796977939D376CB6B128E2172F33FCCEDD43436F56589448C 48C1EBD59029BE768D99D3A18C6FB5BC9B460EC3C56AF5A055F7AF1238A6B9BB 3F96860330440876A2EECC4D397A024B6F11416FA6DD66BC781CDE0C0CF8F98C 9CE3F438332AA75ABFE4F6EFC1920FB2060BED98C953181F612BC820D3D87008 F44C9C4DC30F1E1CE440E9244040AFBFE4DDC5F5E3C22C4FF3016ED8BC63D0ED 07EE8E2CDFEF027C6BE1E5344B6A2F800A3B949EB3D6766953AC19760FC38214 D1C8E66D7A13B82592276804D1DD9EF5503A0B4380000EBEA7964D6122A0AD20 9509638E8D775A20C5D320B88BF48F2C5245CFA95E95F4C070F6BF9FB611B449 09878BD782317ADA2083F5996453E056EF3094AB9FD35D5F0DA04968F1ABC2DF 2FBA9CE0848786C490C33A2BDB5B7D57B547E8A77574644B1BFEC8167E4DFDF0 E30266A7D15E78618EE60C7E5DCC96A1B0B410E32AC938DF9C9F3DDD6D25C031 E28D827296A979F8ACB29DDE1551E9BD231B61B479D74F89B2F6FEF84D475F26 79BD2A9458C59F3BC111FA5E7BF6475E650B634B5739AFE5ED6A1962C1AD7BF9 2E9D9F99643F04A35B3AB454B37B713BA25D526E9BB438C0BB8CD50F367AB488 1F0F4886EB2882A31B4F5AACDD3251EC23ECC8CFA2B0B593B536CC648C44F24C 590B65F0A4F6AF3185C9F78E533F9638C05287F6876CE5CA8F528BDEEC6A17BB C81871257067602B8C1169ACA3B417C027FB0D17C742A5FA7B7BC1B2FA1A3192 7E3F5B9617F4FD7EE4620DE65D43E2FF99AE976BEBC268E85F67E358C561D781 85481422E8923C2B92AEC101AC3C86D6077D3743E65827ED5B3EEC6B3DC876AD FCCD2AC7C25BE8719B0E5F03DDC0C1B4E832995050D760E937FFF9D97243A53E A727E2D3E068ED7177B5B00BF6DA387A57F7C8EAB9BE64B5FE2DD47764D664A0 FB217A45F3559320313D18EAB57BECBC1346E61D3AB22209880230B9DCC4CC18 C167AFD2AA4BE68D61EFD8A0DBC680A0C7C62F5C23A0479F0AA4182CDAA7A337 677A44BB277C4AAC19C8AA8818053BB9E4FA0043C4B47611B430FECDB93DD1E3 35F674B9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX10 %!PS-AdobeFont-1.1: CMBX10 1.00B %%CreationDate: 1992 Feb 19 19:54:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-301 -250 1164 946}readonly def /UniqueID 5000768 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209608D3976637A DB9C73EB3A28623DF758C25574D740385B2C3D10086AEB904A33DD76DA2CC4BF 7E37F9117E9D81D3EFDA12D5BDF0067450C5A8A53959C055C5D6087F1FE6FB5D 8306F16FAD71AB986320F1229440C63ACB5FA24E41CFEB12C2BEA2C25E59A3F9 6CA5B7A04B57F2471D36F5B41E6363DCEFF2DFFE9131F044125884739392333E 15418156EEE8DE92EF4C176742032FE8889839755D8D821CD7F8FAAF8A22C283 19F79216C6D454A864898EE9F830DB5F3372B8F47C464DF19C69ACB3BC0566E2 F25E7FF148B2CDA2B90CB5884440F464CD57295728A4415963CC1BC0635BBEF4 E812CA5E0E788035873D05616F7B0F6A30D36BB285E7955CFD860345F16D952A BF2F7D2702DB352D0874442B2074859EB49313BC27E1067D627362649D82A5C3 A57DC5041B1A13FD2FA89D875019E23C31650A25CBEEC6B93C575C363FAE2164 76ACBDCDFEFC8B7BD24AF41D55196DF6FB2F28DF88349947B448513C7E832EB9 F35B28EF86C231336351C1F89AA9AB1F8C02D0DC35746E97C2B29B7A44CF7418 89DAE02563F58C453F45C231219FC9727D5D477B22EFFAAADAFEC78ABAC4D295 6CD89996036FBD45E53B129E9FE583C1C5083B199AB8C8FB7EA2F8C7D4D3CCEB 9BB7623FF9BE5D7D99B31E627EDABFD4E30851135DBB27457FB4CAE161973476 11DFE63DA3C7CFDF03799B8BB4BE24F032316D141F07ED3153D60FA8A5353CD7 64E4964AA4162ABC9D1A2F3A0F8EFAE7428D3B01E474CF312A19C6AB21673BD6 D67A2A71BEC26114834A6F83FF062A7AECCD6B910687EACAE37680CE6401F30C 7FF2D2054485B1425F2CCAB4F0A4734D223D5EDF478381D04587E7744ECED551 5C36F27DD9E7F0FA2302597B8B3C851034D7A3D930467A1EB08EAB6590E267E7 511DBD0E8735559AF94CD0E6E1398036EAD32D5A7179BFD7E7E55A20B1E44E6B 1297C7155EAB72F20463E8D5768B8DB3AF9DDF627537F717CD05EB5A096396CA 62ADD6CF71B58F3F96A0EF46C7A97DCB5C1AAF8099653AFC4BDE0B934DBC586B B075326BC1061EA7062E1616C58AD50B99310A0DAF0C0640AE01B286AE295A1A 0CBC029245E94EA10FFB4379287AE3313B8D619B84DDD8CD3878A4B306950873 D83FF67E16AC8F8976E9DD1178ED7A8ED2A9A049F8D79E64149E43530B4048DB CC9DE4696143781DDB68EC214116575D6D0663E27CBBAA13E1C658F4A959459E 84E6D392AD188FCA5ED5CC9D1A8CF9027A5F84AE6EECCB5DA1D8CFD55EB82E0C 85A089269EDD6833F4E66CF4EA110AB03B0C896B05D2E06F3512C764B686FAA2 981E623EB3C84170FBC02E61B6EF412D698E61F26D97D0FF2F3814A4FBA0F1F8 CCF619FBA4A1E16878B9DE40B5641D97BBCA0FB7CAB78ECC1D7526CDC344189B B84939C7C911D152639AD70E32DF7B5BABFB87299092EA27E79E04F4D798754B D9116EEAA748426DED5F1D3801D1489844B83B01824464447B1E8119437ACDBC 33696B610C4489DC05DA461FF1913C4294DF060AFD5AF64D80514768BABD59A7 E400ACBEB0CFCB7F1C1D93B96507E54C14E8338ED729A836CAB2B97DC88553CE 64CA3B480726C936949C7033A4BA461DF60ED92B3F1CEF021D4507D5483B14E6 ADB0EC105F1F977E1E5358F182C07E66D0CA134C17B3A627AF45548A40845A8C F15649370CBE911DD20931C7A996F849E88BCC0C821D45C8CE6DB94471DE8DAA 1D70EEBA0DE2DD0264115D663C47B2AE4F20733D2F55F07B9B5319D920905CB1 17BB51CF6DD6DDC7C1C76F56B1E11C76B6266094F5430905A6F8B3EC79C24323 532A96B265EA5D90CA5DFAFD9DB23494891D2A154752FC937670A66724273121 7F26B1F2CBAF23A7A0A69CFD8AFA98F272E89F976FA6B04B138DCE109826ECBD 40C2D560A119F18A9D49312D816538997BB06FB7A7EA580ACD4B5A2F6E7598CE E63ECC9E9405F7985E7FA2B853E3DD5F757D4D33DE044C689767753840D11FFB 467D0DAF0D7751652AD4E1207FB4E186E1B4D75599850EED13912A1F1A407B15 3B4FC6CD88DF88DB6C62369A99C13EC670DC6A6C3BA51930124E3F012BDE18EE 1A58AFEF6B583EB38BFB50A415C9979D08860CF28F6C1BB707B45C549F47A8F9 0E7BEBA462429088E7BD1F6C80D5C8F9A89A7BA5096339B67CCCF9FD2AC8861F 7AC99DAF0412E65AB8D94E5EB2969791CD66731519722C70F0245A746EADAAC2 20D6198C7D0685C501045C5754FF41DEDEB2744D2CC45A1EA4125BA35B94ECA1 51C8148DC1DB652E4B6B89C66B0B6D9219B6A0FCA6109B57D32E67ACA54214A7 BB477D5BC499254877BE75DD3B141F725F27BF6A9E26F30A58A3C8331E34A74D 1EF7F9920A587086B38969A23387FCD1EC4F152B6EEAA60048C0D6D5CBF64814 81827C6A4E13120620BE2AD9D71A1C9608CCF7A12D2B43A7886AF248483D7E36 216905BCC25ECADA71C14EC57555947FDF1EC4D90C3E604853FD26884BF285A9 F5B1FDE2CA9ADC3CF07B64A0C720D0619601B5B65308184CBDAD468ECB55F300 45C6AC933C6EAB2D63B686D98D608DFE28F74CE480ECDA2A09D191B5AD829859 B1EAF6FFFE7516234F12DC8539D8F0B13AD03112F114C1FC2BF9190925E22D8C DA53D8A7BF33945071602C2BE41C58D50904926F2B93DF005E56A2862CF18E9C 023E0DC9055016D46071E23472AB8780C18A2947C828A367D0C08E685216C069 BADF104C408090647D07394214F4877B455F39E3500C1F37E7C9E0C2916F0F3D 3CFE6269E9D5D570E0461AC9ED45E41F5A0BAF2756C93D616AFC1642E02B6AB4 998265EB84819DD4D89ABD8D560F83408D78A76B9ACD32414F1F8229AB51B5B0 F02156A82C84F5E72CB75D0FFFB78C18DA23B316DE922561CEE731799E93F29B 87E2E2EE64BDEB51F66AE1A0E421B7AE47485CDFE69276EA22D6F1BEB777BF7D 1173C83BA8A7DD537A187AC33699958A660504D8F62D48EF52929C25EB8D9C08 BC69DA45A02F3C5E8793B31105790576C205BAB9C7CB130CAA1D1A4845558FB4 8D48F91B8048472EA5467B5CA7F87410CF9E6CCC4847AA988286B51548142A28 7FC18AE9466EE50E149A2381B57CE57C19FA4373C34D66C9E119CA33BBCDFBFA DC55214F28A9C3D7ADA875E9E9C50A42B069D45A3242A4ED0C15EE4BF0754197 B997643E535203480023781E72E5FACC60601789F432B20F6CFE15250F6EE499 4D0007EFC4507827FB546E9FD6C3EEFD6434CD69127E5EBD5457826A537FD144 AB9F7D87B4765F98C8F41CD7E4AEF58F78F673831F6ED14B117508C6F2A41210 6C7F4059396F6462EE50F7E27F38EEB037D16159AB0A4BA519C01A493F8202A7 18E0CEC0189544C8977198B56302A5BC4425352EF57ACAA007B75F4C0EBA1EE7 DD67F264C47BD0D90C2243BBDC8D3D46073D6823AE99E4DD39E5A6C87D9519B6 22DB0622073ED0BA70614410589EB533FDEF0D9BB59B9B1FABD963A11466AD39 CE45B8F9ECC4B3AE089E6465ABB36B50D1CDD44E47B73C910315F6B0054F400D CCC1021C01D72FC4FF83360D67A7361B45A145A730C072BB04E25A24CD3E634D C06B4424F4AF11288B10135DA7727EAC45A119B1AC070DD3E4E7C78899F50CF6 75B441888913A43EB69EA023BADEB3CCEE60D74FB9072A92AB6A0754BD8EE50B 6E6743D4B62BAA9387FE0DB83590F7993A15214B1A3628919019BCD15E94FFC9 6B42A4101AA23826459FA80DC8BF20414B4110636FD50B4717DEA6827C33BCFD 6A8CD5205BC8C118F05D09180A81A90676720EE6C35C86EA8BD0CF9D2E9BC55A CB3A6396EF1A9473AE3A5B9A8392EBA45FB9D13D8E031AB9867D753B0E2BBA13 C22F90CAFFB5498AF7CD2B0C6656B15EF5E6DA501E3A360C913ACAD37E1CAEAD 6CF7D53BEEC4AF44ADF97FAF0317F0F47AD100B1597E31155B0F59EAFC3D97DB AEF5A68D78492A9459DFC9C06FDA458990B2F36F531FD6076DE145D2E4637F40 E886E15E5B9DC8BCF730E56C5EE7ED3E292793FCCB5A6C6F74BC37D418C7908B A99DFE19C6878C8E6D7527DF4E2153962CD1F06591E1D724E1B14F1F19EFE72B 0B5A49D9554447E57BC956535EA0CE995511A965F2E2D224954A4D2E571A5328 AF275B53C98C81A6062193821299FC0826CF3C486A5B6D87D8007BD0111A24BE AB0C46C95C9EFCE1C1963F012B797156748D14893BAA861B4AF53329064D3551 B311CF964E7B4FD36F8796C0D8C3BE7294DFDF8C41ACD636440BAD90DB909C32 64C9367B6EAD51F743CE66A5216CAF498A65653A3C4C68512E0F7CF588B8E764 1A5A4D04298C47EB0ECA54CA87A25365690F88FCF60E391D3F90347DD591B77D C2221C55D72702196B375B180F67A01C65C27AFCD1AE6D9BC2FD7F3368BFD3D9 A6A13CE3C05BC5A859DA22D467869CE0CDF9D9639E4963339BC8B11666B7DBDA C06FD92D40D6FE6B174E388E77DA08D3C4D3485F8736385C4724B16F5C0B7487 51929A0F98C2DF0C44906A1BA1893E0CEF660735C42BEAD962D0FB331708AAE2 1F3042CB34F9263AD16C74F8F8DFC819528D97C5DC318D27D76DAFC4A902E1D1 B6F60D630DD1C9FC5A5053F59F9BFE1F7112414F148F188D2A67A99934F52F03 8A3EE94C0631ED64D27C3D3DC7595DF4B950D28A94CA7C3BC7F2E9E8A2DB340A 76FEE96DF49FF14A0A3DCC5B67F6194D7FCAB2951A4202585F3E43BF7F498A86 0ADE4F7EDCB0356296642001ECA2ECABBA3BCF5185DB58C1B0C431B1CAF57EB4 FDFEECB62E3C1E4F81EB6F3C817246152212EA002BC2641182097B678F0B5DA2 46081D22FF1B0BE3D2D87565D270B86AA53439995519A36BA21BF29FB8193904 1CD9EBEDB276431EDBFD976DC9440FFBD6EFB11AC2EDE798E2DF112053C950DC 36A868A3BDE15D834AC5D863268266AC0E1CCB87D432F46BDB39F34DDF1BE7BF 4A7D015E00328BBE07C54E33BA216F29B00DC4CBBE00CB18ED5C92D0388F8C00 75ADF5995C1B7F224C2132826042C7851CD892B2D1AA82B4D4DE8DDDBC4C41E6 7DC9E5A7F37117991CA9D2948F5CFA840EA8DF31816E6020116F4DBCD323ACE2 0CAF5AACA05F3EE2F1BAF72070EE95E0AE847307543DEF63369B8C8BF1733495 5B803915008F8429A116815183E3160E3A625AA28452ED05878CD0A64493EF94 B377D7CAC16B47132C4530C3A54DA9BB70D0B17B16D234C2520DFDD45EB7203E 049C75172FA9455C2B21E132B55AA834CD25C833843356B0CE106AAA5D966B42 C12EB20B23FABB574D54A6F4008BF5BE2A9C3D9926191A57C133F109CA4073BF 894025AC86AA784C52B9363ACE6FBEF95D97962CC87309360752714F37CBAC6D 86D0156973C3BF9E921989859C649BB5F05DA39F09371CEAD4D7763B6CE0C392 C174AB5949B9DE28D48493C0A94FDEAC4EC4134AAC0B4944ECC115784F39D878 CAEFF77868934DDC838894C689C539E076B6B3818994DB26F6ECD3599D40ABDE F4023A1EB99E96685A35C13708E095914E31460ACF866D5DA499353C85616F8B DC026696BA5443CF59CF6DA906442216A398C4C44CE203CB706790F1242FF30B 0E0647AFCFE52D2AAC8BC20FBE5E99B02831913350504BBFAB60F3E79A9B566E 67DA5E39D78BC4A011549F3569C331D79286E7670DDF39820BA038D7A5CA6911 529A3ED4226B9D9B7BE40E84CC23ED000BE93054F11E234635574854C985E1B3 D0C4F8D515A2913E6D9ACCE0189FB004FA0F61A9269584F66EF3CB806BC17853 F7FAA9178B36F04C1CA6559A59FF380C50346C123AAE449426A917EF95E32673 9EA7D43224E5FD9556E876265620A1647840B87147D497DE18C50603D3A8BBD1 D29F87A588A4974F91F3E15E2817E6748D40C81FFDC941396A436E9510C38DAC 983D8EA3830325C98D0C157FBC29D651EA0155109AA92A777C34C54213066437 780287B1282A63713741CD3A48E5A8FD43C5E557E734CB41177148F3474EA840 6F37DC91E4777242385391E2A2050553D46D7FF5C01A3EC36D5B51AFE212E55A F45CDBA18EBE2421E44D79D8FA6DCE851828DBA903FC55AC3276F335CE92C2D8 D22C77190B4E3EF04BF90DFE3D5D19264A90B1DB902792D28C34D51E74D1E0D2 8EC79A918AEFBCCC49C398C039524EF1F082A3FCC3B73AD213B495232B114534 3CEEAA6A5467BE32508B2A415E2F66D22A4B8E0ACDFBD9D6358E2C3FF0ED561F 078CB136DCA6BA587C4ECAB607006273167E9180EEFF8FF7A4269CF7E2560786 24CAE67C7B0B69EA95E22DDD99EC54B05E5102D6DA6404975A2735DEBFEAB2E2 A7AF96BA19F2021B1A8059B94A257C845B85BE299BF74100368609FC9F03359D FF589DCF8933FFE681BDACB89C7A993A90192ED3EF60649CD42232819DA99C84 D66AD20BD75A5273BF78FD62E44AAFBD1F8C2AF828DE4B9258742B896EFF2B0E F13994CBF6DC94DBE46DDB39F83C52956CBF4020E6800B158930135866FE4801 0CA5FECA9AE2B8365580788B2AFC30E478FAB2A94420EBB0E325D1C952FFD759 C04895132F0047066C2A5D338335AAB2697E51012A1419A3B4AAAEC629641AF2 034695E466583F8C01B6394542BEE9BB773E68F575C75A0F15C8D8364324FCBB FB7DC8C643FB156623D454872471795894CB1679472E550ABD7E3124DBBCCE4D 73FC122BA6821651D09D65BA929F770BC6D9E81B07843B5000A7695558FB5596 4DCA65179725BE6B10F0C3B41631B716E83EF34376F15A06EEE7FBBBD01F84AF F34FA9A283B50E1180645B7DE41A47383CEE9029EEDF60DA8C11FBCA1BAC678A 241BE808ED3270A9AA9B664D60322E2FA5AC432A888D648CB9F62F3B657C7D8D E806D9D6D73EA90AD5AD932155EFA0A036DA8EE63991FC2E1D3496931D4BC5EF 6E60218B8B74C70D441FC7370EF6C2D63204FB3584C129E28443DE14BA06F365 3B104F5939DCEE6F4C43B5F8DDC6867AE2473C322977DC00EEC166FB9E135D3B 614E133FB3DD38FC4F58BC4EC021C5B020A919717D7473175D9460307948A358 4FD4B38CDB5760A274151E66C345F855AB7D6EBE56F0B9DDFC84BA939A484AE9 3123CF05F05D431B6D9D9EB4FAF42ECD54BBAB0730A57F0F654D6745BF69CC0F B083BC9C04B95C35314DE08E343FFF44FAFBE22FCB5905652FFE6803C89E1832 F2B1738A49E6372319D187863CDCACC2175B5965279C68B3E9C2BE4A18EB9032 8E271F99D0D28082625B7BE8C8A2AEC73EC0CD320F8A949045CF2CBB28EA883C 67BF865F0B1149F97DEE9682394DC3B7B0FD5ADDDA7B3D939150FAFADBA6EFF0 DF24A9F2073D921713D8F4F01ABF1447C3EA96D51562A31B6D334A9AD076F675 F5B6D6AAE5F421A9D36A794BD141745ADDEAE05109992F35FD44A27FD77CB547 63B2EF548A11A1536B0D6140AC53656B5F0E6D43BC1E778D148EEF731D4D47A9 E98B0A2C655E4DF2D37A1324656FAB373C967231587E21141D1824F4A1DEC1C9 FCED15A609D119A5F31A03E8795FAD09FC800BA2738D45D6DEA1F6BC9A74F427 800CECFF25384BF952BA67EAF6624C90167180FA172DA7D62E41856BD17507FB 7292BB3492BB009E3F537BBEDBAAF6B9F6556A8AE7B0CB4C4CE523B35CAD23F9 20D8EB6CDCD74A15703B5025410AA2B47566EC2B8D923277D4C630B69166BCEA F496DCC04625881EAC25871518E1183C600647EA6E88816BA3CDB1A91F77D329 97D54773E3A7AB11DC0DCE801C2AF041D3A1A2BEE0DFB3388A6A6E0F7C9B6895 616F398304FCDBADB2DCD571A891412ED8E413EC434017BD2A75CEB55A1F3A59 5E1AA35CA7964CC063743D737BE8D1EF573813E5032EA5EB5576CCF9340CE2D0 CFAA16E7EBD5BEADCD093D679D3794A2FADB6CF7520D1159D66B6467B3A0C3DE 0C67BD096F10F0ED0B5DA68E441A250EE7F41AC01BF9CA809B8EE9ECBC178887 2221A799355B4BBD7D8D0F4E96583A8FE6C8E3EAE184A7ACBD5D4EDC1FCE6071 FCD2F870C990D973260A60F18206F42DC3B71E2305E02BA982C8ABF20E0317C8 820E019A3196F40B8B5A9F6B69482266F7A52C296871F00FEE8A785B2487FB42 782D6BD6B05FF5904B34AC467E28E021FF65CF0F979503A2BCB6E6A50285E608 3FFC5217CA03E805A2406E6EAE4D3A18993CC97168796B6ADACEF7918DC2769B 74A58F2B331BE0A2CAA0E217F62B16D05E9486137F2209D08E474DFC07D009F0 76811F8F8EE5D37025C9DD76AB83CE22F3D54E229AFA72A848512A7AC3BD38B3 B188F5D1EA0E2DBD3BCB7904911248EE955B88BE7F94B0F05ACF38661E3C119E 0786E52492885CD81A65C9B1B92C61E29FCC94FC91B77D0634B0F71B224CF071 C5C031B5C27B6D97071ABA7865E5A60DA0B088DC196B3F53859F615CE0ECB013 C2884E82DF2C6B13228EDA8405FF50882C4B4B2CE4C4EB0D16C4D9177BCFC224 329CACEC536E7BB4AE2D6A9884406FB10BF762C5B2EFC9A351481F9C8450DD7E E0CF9CBD393ACAA35448C0EF98AE74FD884E6FE378431F6B9C046194A4F3BB1A 1FB638D0C6A06763C9E999E895D94FB87C98C84B7A6D78D7169CCBA5D6A0DC38 79AD49E10BFB825571C0829018FBCFFFEB3080F3812E1B62DE5103CA914B4C15 8C754F4C237149AA45054E84640EC6FAF8EC1F670B220C2C8431B51649ECD7BD AC7ECFFDA2E31C445B4E04A4BC479BA67C74DFE149CC8CC4C059B10487AFC1E4 3331A28FA67B8F8388CA27221457367DCAF33EEFF3099F5B9FD78418BA9B92C0 780D1AC3FC2808A3DDF1A539A009D020C2AB6DABA8ECCBB7B52E61B20B9FA1CF E0E6BCE03136386656247C5022A7A612FC6F8827E0DF68F31C36F6EECAEC8F36 4982CEF901D020CABA21E90AC4830F7AC99756D879420EBAA437A1A027BE0D0B 5C224B8E8DFE46A3706EEE3BA8093A8E021AAD24540AB716F1F3D3A31502E745 C950946B66B44E51F34B5F2EB68545EA59C56046D929E833FA23B9CD5F034F98 D4DAE90782D54B4C94AAC573 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 39158280 55380996 1000 600 600 (costs.dvi) @start /Fa 134[35 6[35 2[35 1[35 35 2[35 3[35 35 35 35 35 32[35 17[35 46[{ TeX09fbbfacEncoding ReEncodeFont }13 66.4176 /CMTT8 rf /Fb 206[28 49[{ TeX0ef0afcaEncoding ReEncodeFont }1 41.511 /CMR5 rf /Fc 189[65 62[65 3[{}2 83.022 /MSAM10 rf /Fd 141[28 3[37 4[22 7[32 97[{ TeXaae443f0Encoding ReEncodeFont }4 41.511 /CMMI5 rf /Fe 144[55 55 8[46 12[120 7[88 17[74 1[74 1[74 1[74 14[67 67 6[66 66 14[50 50 3[28 10[38 38{}18 83.022 /CMEX10 rf /Ff 152[34 34 47[0 4[66 15[66 29[34 2[52{ TeXbbad153fEncoding ReEncodeFont }7 58.1154 /CMSY7 rf /Fg 134[35 33 47 1[38 24 29 30 1[36 36 40 58 18 1[22 22 36 2[33 36 33 33 36 12[51 40 5[64 1[55 5[48 54 51 20[22 26 32[40 12[{ TeX74afc74cEncoding ReEncodeFont }30 66.4176 /CMTI8 rf /Fh 133[34 40 39 55 38 45 28 34 35 38 42 42 47 68 21 1[25 25 42 38 25 38 42 38 38 42 12[59 47 2[56 1[62 4[32 4[63 59 1[62 18[25 30 25 31[47 12[{ TeX74afc74cEncoding ReEncodeFont }37 83.022 /CMTI10 rf /Fi 136[48 3[31 31 3[41 2[35 27 23 3[31 1[30 29 36 29[48 7[20 27[41 31[{ TeXaae443f0Encoding ReEncodeFont }14 58.1154 /CMMI7 rf /Fj 175[51 80[{}1 83.022 /MSBM10 rf /Fk 148[42 23 2[42 42 25[57 21[0 4[83 24[65 2[65 65 17[65 23 65{ TeXbbad153fEncoding ReEncodeFont }13 83.022 /CMSY10 rf /Fl 165[40 49 49 67 2[47 37 48 2[51 49 60 41 2[24 49 1[43 45 50 47 46 49 3[51 2[19 1[33 33 33 33 33 33 33 33 33 1[19 2[51 1[26 26 40[{ TeXf7b6d320Encoding ReEncodeFont }34 58.1154 /CMR7 rf /Fm 136[59 40 2[39 37 3[50 1[25 43 34 29 3[39 1[36 36 44 35 5[57 6[51 63 5[57 7[69 59 4[65 42 65 23 23 26[52 12[39 18[{ TeXaae443f0Encoding ReEncodeFont }27 83.022 /CMMI10 rf /Fn 133[42 51 51 69 1[51 49 38 50 1[46 53 51 62 43 53 1[25 51 53 44 46 52 49 1[51 14[66 1[62 2[82 3[34 5[65 1[68 65[{ TeX0ef0afcaEncoding ReEncodeFont }28 83.022 /CMCSC10 rf /Fo 133[37 44 44 60 44 46 32 33 33 44 46 42 46 69 23 44 1[23 46 42 25 37 46 37 46 42 3[23 1[23 3[85 2[60 46 61 1[57 65 62 76 52 65 1[30 62 65 54 57 1[60 59 62 3[65 2[23 42 42 42 42 42 42 42 42 42 42 1[23 28 23 65 1[32 32 23 24[69 46 46 48 11[{ TeXf7b6d320Encoding ReEncodeFont }68 83.022 /CMR10 rf /Fp 134[43 5[32 3[41 2[23 6[37 45 36 45 40 97[{ TeXf7b6d320Encoding ReEncodeFont }9 66.4176 /CMBX8 rf /Fq 139[39 30 40 14[39 39 41 31[54 18[21 46[{ TeX0ef0afcaEncoding ReEncodeFont }8 66.4176 /CMCSC10 rf /Fr 133[31 37 37 51 1[39 27 28 28 1[39 35 39 59 20 2[20 39 35 22 31 39 31 39 35 3[20 1[20 1[53 4[51 39 52 1[48 2[65 44 1[36 3[46 48 54 1[50 53 6[20 35 2[35 1[35 1[35 35 35 1[20 24 20 2[27 27 26[39 39 12[{ TeXf7b6d320Encoding ReEncodeFont }51 66.4176 /CMR8 rf /Fs 134[50 4[37 38 39 2[48 1[80 27 6[44 53 42 53 46 6[58 72 72 99 2[66 53 72 2[72 75 91 57 2[36 75 1[60 63 73 69 68 72 6[27 8[48 2[27 6[27 39[{ TeXf7b6d320Encoding ReEncodeFont }35 83.022 /CMBX10 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: A4 end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 486 716 a Fs(THE)42 b(DBA)m(CL)g(TEXT)g (CLASSIFIER:)f(COST)h(MINIMIZA)-8 b(TION)42 b(WITH)1725 832 y(BA)-8 b(YESOL)1719 1081 y Fr(L.A.)23 b(BREYER)754 1315 y Fq(Abstra)o(ct.)42 b Fr(This)21 b(note)h(describ)r(es)f(the)h (details)f(of)f(cost)i(minimization)f(for)f(the)i Fp(dbacl)754 1440 y Fr(classi\014er,)27 b(as)f(implemen)n(ted)h(in)g(the)g(utilit)n (y)f Fp(ba)n(y)n(esol)p Fr(.)39 b(Due)26 b(to)h(limited)f(precision)h (of)754 1564 y(\015oating)d(p)r(oin)n(t)e(op)r(erations,)h(suc)n(h)g(a) f(minimization)g(cannot)h(b)r(e)g(done)g(in)e(the)i(straigh)n(t-)754 1689 y(forw)n(ard)g(w)n(a)n(y)-6 b(.)1615 2122 y Fo(1.)41 b Fn(Intr)n(oduction)555 2322 y Fs(dbacl)35 b Fo(is)f(a)f(digramic)g (Ba)n(y)n(esian)f(classi\014er)h(for)g(text)h(do)r(cumen)n(ts)g(\(see)g (Brey)n(er,)g(2002\).)456 2471 y(The)k(program)f(reads)g(a)h(corpus)g (of)g(text)h(do)r(cumen)n(ts,)j(and)c(computes)g(a)g(corresp)r(onding) 456 2621 y(maxim)n(um)31 b(en)n(trop)n(y)f(mo)r(del.)50 b(This)31 b(mo)r(del)h(can)f(b)r(e)h(used)g(to)f(compute)h(the)g (probabilit)n(y)f(of)456 2770 y(an)k(unkno)n(wn)g(do)r(cumen)n(t,)i (and)f(thereb)n(y)f(classify)f(it)i(among)e(sev)n(eral)g(previously)g (learned)456 2919 y(corp)r(ora.)555 3069 y(Normally)-7 b(,)38 b Fs(dbacl)e Fo(outputs)h(a)f(set)g(of)g(scores)f(represen)n (ting)f(the)j(a)n(v)n(erage)c(information)456 3218 y(presen)n(t)f(p)r (er)h(do)r(cumen)n(t)g(feature,)h(for)f(eac)n(h)f(mo)r(del)h(to)g(b)r (e)g(compared.)52 b(This)33 b(information)456 3368 y(is)c(measured)f (in)h(bits,)h(and)f(is)g(related)f(to)h(the)g(p)r(osterior)f (probabilit)n(y)g(for)h(the)g(category)e Fm(C)6 b Fo(,)456 3517 y(giv)n(en)26 b(the)i(do)r(cumen)n(t)g(string)f Fm(s)p Fo(,)h(as)f(follo)n(ws:)456 3744 y(\(1\))714 b Fs(score)1487 3756 y Fl(2)1524 3744 y Fo(\()p Fm(s;)14 b(C)6 b Fo(\))24 b(=)f Fk(\000)14 b Fo(log)2026 3764 y Fl(2)2078 3744 y Fj(P)p Fo(\()p Fm(C)20 b Fk(j)14 b Fm(s)p Fo(\))p Fm(=\037)2442 3756 y Fi(C)2497 3744 y Fo(\()p Fm(s)p Fo(\))p Fm(;)456 3970 y Fo(where)27 b Fm(\037)748 3982 y Fi(C)804 3970 y Fo(\()p Fm(s)p Fo(\))h(is)g(the)h (complexit)n(y)e(of)h Fm(s)p Fo(,)g(ie)g(the)h(n)n(um)n(b)r(er)e(of)h (features)g(whic)n(h)g(exist)f(in)i Fm(s)f Fo(and)456 4120 y(are)e(recognized)g(b)n(y)i(the)g(category)d(mo)r(del)j Fm(C)6 b Fo(.)37 b(F)-7 b(ull)28 b(details)g(are)e(giv)n(en)h(in)h (\(Brey)n(er,)e(2002\).)555 4269 y(The)h(score)e(comparison)f(is)j (particularly)d(attractiv)n(e)i(when)g(all)g(categories)f(are)g(based)h (on)456 4418 y(the)i(same)g(feature)g(sets,)g(so)g(that)g Fm(\037)1609 4430 y Fi(C)1665 4418 y Fo(\()p Fm(s)p Fo(\))h(is)f(the)h (same)e(for)h(all)g(categories)e Fm(C)6 b Fo(.)39 b(In)29 b(that)f(case,)456 4568 y(the)k Fh(maximum)i(a)g(p)l(osteriori)g Fo(\(MAP\))f(estimate)f(reduces)f(to)h(\014nding)h(the)f(category)e Fm(C)39 b Fo(for)456 4717 y(whic)n(h)23 b(the)h Fs(score)1039 4729 y Fl(2)1076 4717 y Fo(\()p Fm(s;)14 b(C)6 b Fo(\))24 b(is)g(smallest.)35 b(Geometrically)-7 b(,)23 b Fs(score)2492 4729 y Fl(2)2529 4717 y Fo(\()p Fm(s;)14 b(C)6 b Fo(\))25 b(is)e(lik)n(e)g(a)g(distance)h(to)p 456 4839 499 4 v 555 4962 a Fg(Date)5 b Fr(:)23 b(April,)f(2004.)555 5087 y(1991)27 b Fg(Mathematics)f(Subje)l(ct)f(Classi\014c)l(ation.)37 b Fr(Primary)22 b(60J,)i(Secondary)h(60F.)555 5211 y Fg(Key)g(wor)l(ds)i(and)g(phr)l(ases.)37 b Fr(SP)-6 b(AM,)23 b(Ba)n(y)n(es)h(theorem,)g(email,)f(Maxim)n(um)g(en)n(trop)n(y)-6 b(.)1933 5315 y Fl(1)p eop end %%Page: 2 2 TeXDict begin 2 1 bop 456 251 a Fl(2)1245 b(L.A.)22 b(BREYER)456 450 y Fo(the)31 b(category)d Fm(C)6 b Fo(,)32 b(and)e(then)h(the)g(MAP) g(estimate)g(iden)n(ti\014es)f(the)h(closest)f(category)f(to)h(the)456 600 y(string)d Fm(s)p Fo(.)555 749 y(This)38 b(distance-lik)n(e)e(prop) r(ert)n(y)g(can)h(b)r(e)h(made)f(precise)g(via)g(the)g(in)n (terpretation)g(of)g(the)456 898 y Fs(score)667 910 y Fi(e)702 898 y Fo(\()p Fm(s;)14 b(C)6 b Fo(\))33 b(as)e(a)g(limiting)h (Kullbac)n(k-Leibler)e(div)n(ergence.)48 b(Note)32 b(that)g(w)n(e'v)n (e)f(switc)n(hed)456 1048 y(from)20 b(base)g(2)g(logarithms)f(to)h (natural)g(logarithms.)33 b(Supp)r(ose)21 b(that)g(the)g(sequence)f(of) g(features)456 1197 y(in)33 b Fm(s)g Fo(forms)g(a)g(stationary)f(pro)r (cess)g(with)i(marginal)e(distribution)h Fj(P)p Fo(.)54 b(W)-7 b(e)33 b(assume)g(suc)n(h)g(a)456 1347 y(statemen)n(t)f(can)f(b) r(e)i(made)f(precise,)g(but)h(w)n(e)e(w)n(on't)h(do)g(so)f(here.)50 b(Then)32 b(b)n(y)g(the)g(Shannon-)456 1496 y(McMillan-Breiman)26 b(theorem,)h(and)h(in)f(the)h(notation)g(of)f(\(Brey)n(er,)f(2002\),)g (w)n(e)i(exp)r(ect)1318 1801 y(lim)1247 1858 y Fi(\037)p Fl(\()p Fi(s)p Fl(\))p Ff(!1)1518 1801 y Fm(\037)p Fo(\()p Fm(s)p Fo(\))1674 1759 y Ff(\000)p Fl(1)1777 1801 y Fo(log)14 b Fj(P)1949 1813 y Fi(C)2004 1801 y Fo(\()p Fm(s)p Fo(\))24 b(=)e Fk(\000)p Fm(D)r Fo(\()p Fj(P)p Fk(k)2494 1780 y Fe(e)2479 1801 y Fm(R)2542 1813 y Fi(C)2597 1801 y Fo(\))p Fm(:)456 2107 y Fo(Comparing)k(this)i(with)g(\(1\))g (\(replacing)e(2)h(with)h Fm(e)p Fo(\))g(suggests)e(the)i(connection.) 1539 2523 y(2.)41 b Fn(Minimizing)32 b(Costs)555 2722 y Fo(An)23 b(alternativ)n(e)e(to)h(the)h(MAP)f(estimate)g(consists)g (in)h(sp)r(ecifying)f(a)g Fh(c)l(ost)g Fo(or)f Fh(utility)i Fo(matrix)456 2871 y Fk(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(].)53 b(This)33 b(is)g(the)g(approac)n(h)e(tak)n(en)i(b)n(y)f(the)i (companion)e(utilit)n(y)i Fs(ba)m(y)m(esol)p Fo(,)g(and)f(is)g(the)456 3021 y(fo)r(cus)27 b(of)h(this)g(note.)555 3170 y(Note)e(that)h (minimizing)f(costs)g(or)f(maximizing)g(utilit)n(y)i(are)e (mathematically)h(equiv)-5 b(alen)n(t)456 3320 y(problems,)24 b(and)g(w)n(e)g(shall)g(from)g(no)n(w)f(on)h(assume)g(that)h Fk(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])24 b(is)g(the)h Fh(c)l(ost)h(of)i (misclassifying)456 3469 y(the)j(true)f(c)l(ate)l(gory)h(i)g(as)g(j)p Fo(.)41 b(By)29 b(con)n(v)n(en)n(tion,)e Fk(L)p Fo([)p Fm(i;)14 b(i)p Fo(])25 b(=)f(0)k(for)h(all)f Fm(i)p Fo(,)h(and)f(for)h (a)f(classi\014cation)456 3618 y(problem)f(with)i Fm(k)j Fo(distinct)d(categories,)d(the)j(matrix)f Fk(L)h Fo(is)f(ob)n(viously) f Fm(k)22 b Fk(\002)c Fm(k)s Fo(.)39 b(In)29 b(particular,)456 3768 y(it)34 b(alw)n(a)n(ys)f(has)h(an)g(o)n(v)n(erall)e(minim)n(um)j (v)-5 b(alue,)36 b(and)e(without)h(loss)f(of)g(generalit)n(y)-7 b(,)35 b(w)n(e)f(shall)456 3917 y(therefore)26 b(assume)h(that)h Fk(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])23 b Fk(\025)g Fo(0.)555 4067 y(The)e Fs(ba)m(y)m(esol)g Fo(utilit)n(y)h(is)e(able)h(to)g (handle)g(a)f(quite)h(general)f(form)g(of)h(cost)f(matrix,)i(whic)n(h)f (it)456 4216 y(uses)j(to)g(\014nd)h(the)g(category)e(whose)h(o)n(v)n (erall)e(cost)i(is)h(a)f(minim)n(um.)36 b(More)24 b(precisely)-7 b(,)25 b(consider)456 4366 y(the)31 b(p)r(ossible)g(decisions)f Fm(w)r Fo(,)j(whic)n(h)e(w)n(e)g(iden)n(tify)g(as)g(functions)g(on)g (strings)f Fm(s)p Fo(,)i(whose)f(v)-5 b(alue)456 4515 y(represen)n(ts)29 b(the)i(inferred)f(category)-7 b(.)44 b(Th)n(us)30 b Fm(w)r Fo(\()p Fm(s)p Fo(\))f(=)f Fm(j)35 b Fo(means)30 b(that)h(the)g(decision)f Fm(w)k Fo(yields)456 4665 y(category)27 b Fm(j)35 b Fo(for)29 b(the)h(string)f Fm(s)p Fo(.)42 b(It)30 b(is)g(w)n(ell)f(kno)n(wn)g(that)h(the)g (optimal)f(Ba)n(y)n(esian)f(decision)h(is)456 4814 y(the)f(function)g Fm(w)983 4826 y Ff(\003)1049 4814 y Fo(suc)n(h)f(that)1313 5143 y Fm(w)1372 5155 y Ff(\003)1434 5143 y Fo(=)22 b(arg)14 b(min)1696 5192 y Fi(w)1846 5039 y(k)1804 5064 y Fe(X)1810 5240 y Fi(i)p Fl(=1)1938 5143 y Fk(L)p Fo([)p Fm(i;)g(w)r Fo(\()p Fm(s)p Fo(\)])p Fj(P)p Fo(\()p Fm(C)2413 5155 y Fi(i)2456 5143 y Fk(j)g Fm(s)p Fo(\))p Fm(:)p eop end %%Page: 3 3 TeXDict begin 3 2 bop 772 251 a Fl(THE)29 b(DBA)n(CL)h(TEXT)g (CLASSIFIER:)e(COST)i(MINIMIZA)-5 b(TION)28 b(WITH)i(BA)-5 b(YESOL)282 b(3)555 450 y Fo(By)31 b(writing)g Fm(w)g Fo(=)1163 388 y Fe(P)1251 475 y Fi(i)1292 450 y Fm(i)20 b Fk(\001)h Fo(1)1427 465 y Ff(f)p Fi(w)r Fl(=)p Fi(i)p Ff(g)1623 450 y Fo(,)32 b(it)g(is)f(not)g(hard)f(to)h(obtain)g(an)g (expression)f(for)g Fm(w)3279 462 y Ff(\003)3318 450 y Fo(\()p Fm(s)p Fo(\),)456 600 y(namely)456 834 y(\(2\))760 b Fm(w)1381 846 y Ff(\003)1420 834 y Fo(\()p Fm(s)p Fo(\))23 b(=)g(arg)13 b(min)1815 883 y Fi(a)1958 730 y(k)1916 755 y Fe(X)1923 932 y Fi(i)p Fl(=1)2050 834 y Fk(L)p Fo([)p Fm(i;)h(a)p Fo(])p Fj(P)p Fo(\()p Fm(C)2405 846 y Fi(i)2447 834 y Fk(j)g Fm(s)p Fo(\))p Fm(:)456 1063 y Fo(While)31 b(this)h(expression)d(is)i(easy)g(to)g(compute)g(in)g (principle,)h(the)g(realities)e(of)h(limited)h(pre-)456 1212 y(cision)j(arithmetic)h(render)f(it)i(mostly)e(useless.)62 b(In)36 b(the)h(next)f(section,)i(w)n(e)d(describ)r(e)h(ho)n(w)456 1362 y Fs(ba)m(y)m(esol)27 b Fo(cop)r(es)h(with)g(this)g(problem.)1033 1590 y(3.)41 b Fn(Appr)n(o)n(xima)-6 b(tel)g(y)33 b(identifying)f(the)g (minimizer)555 1789 y Fo(While)25 b(the)g(expression)e(\(2\))i(is)f (simple)h(enough)f(to)g(compute)h(in)f(principle,)i(in)e(actual)g(fact) 456 1939 y(it)k(is)f(next)h(to)f(imp)r(ossible)h(to)f(use)h(accurately) -7 b(,)26 b(due)i(to)f(catastrophic)g(loss)f(of)i(precision.)555 2088 y(The)45 b(problem)e(arises)g(due)i(to)f(the)h(t)n(ypical)f(form)g (of)g(the)h(conditional)e(probabilities)456 2238 y Fj(P)p Fo(\()p Fm(C)598 2250 y Fi(i)639 2238 y Fk(j)14 b Fm(s)p Fo(\))24 b(computed)g(b)n(y)f Fs(dbacl)p Fo(.)36 b(In)24 b(normal)e(cases,)i(these)f(are)g(exp)r(onen)n(tially)g(small,)h(whic)n (h)456 2387 y(is)j(wh)n(y)g(the)h(scores)e(\(1\))i(are)f(the)h (preferred)e(quan)n(tities)h(to)h(use)f(for)g(decisions.)555 2537 y(Practical)17 b(exp)r(erience)h(with)h Fs(dbacl)g Fo(suggests)e(that)i(the)g(range)e(of)i(scores)e(for)h(t)n(ypical)g (email)456 2686 y(classi\014cation)23 b(is)i(b)r(et)n(w)n(een)g(5)g (and)g(100,)f(with)h(most)g(v)-5 b(alues)25 b(distributed)g(b)r(et)n(w) n(en)g(10)f(and)h(20.)456 2835 y(Ev)n(en)d(so,)h(since)f Fj(P)p Fo(\()p Fm(C)f Fk(j)13 b Fm(s)p Fo(\))24 b Fk(\030)e Fo(exp)1487 2768 y Fe(\000)1525 2835 y Fm(\037)1577 2847 y Fi(C)1633 2835 y Fo(\()p Fm(s)p Fo(\))p Fs(score)p Fo(\()p Fm(C)q(;)14 b(s)p Fo(\))2147 2768 y Fe(\001)2186 2835 y Fo(,)24 b(the)g(do)r(cumen)n(t)f(complexit)n(y)f(matters)456 2985 y(m)n(uc)n(h)38 b(more,)j(since)e Fm(\037)1200 2997 y Fi(C)1256 2985 y Fo(\()p Fm(s)p Fo(\))g(has)g(a)f(t)n(ypical)h(range) e(b)r(et)n(w)n(een)i(500)f(and)h(sev)n(eral)e(thousand)456 3134 y(features.)63 b(It)37 b(is)g(therefore)f(clear)f(that)i Fj(P)p Fo(\()p Fm(C)20 b Fk(j)14 b Fm(s)p Fo(\))37 b(cannot)g(b)r(e)g (reasonably)d(represen)n(ted)i(b)n(y)456 3284 y(t)n(ypical)27 b(\015oating)g(p)r(oin)n(t)g(v)-5 b(ariables.)555 3433 y(The)29 b(solution)f(used)h(in)g Fs(ba)m(y)m(esol)g Fo(is)f(to)h(infer)f(the)i(minimizer)e(en)n(tirely)g(in)h(the)g(log)f (scale.)456 3583 y(Let)f Fm(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])22 b(=)h(log)14 b Fk(L)p Fo([)p Fm(i;)g(j)5 b Fo(],)28 b(then)g(w)n(e)f(can)g(rewrite)g(\(2\))h(in)g(the)g(equiv)-5 b(alen)n(t)27 b(form)456 3821 y(\(3\))357 b Fm(w)978 3833 y Ff(\003)1016 3821 y Fo(\()p Fm(s)p Fo(\))24 b(=)e(arg)14 b(min)1412 3871 y Fi(a)1555 3718 y(k)1513 3742 y Fe(X)1519 3919 y Fi(i)p Fl(=1)1647 3821 y Fo(exp)1774 3729 y Fe(\020)1823 3821 y Fk(\000)p Fm(\037)1940 3833 y Fi(C)1988 3841 y Fd(i)2018 3821 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2332 3833 y Fi(e)2368 3821 y Fo(\()p Fm(s;)g(C)2535 3833 y Fi(i)2563 3821 y Fo(\))19 b(+)f Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2910 3729 y Fe(\021)2958 3821 y Fm(:)456 4055 y Fo(Naturally)-7 b(,)25 b(w)n(e)g(generally)f(cannot)h(simply)h(sum)g (the)g(terms)f(in)h(\(3\))g(directly)-7 b(,)25 b(but)i(luc)n(kily)e(w)n (e)456 4205 y(don't)k(need)h(to.)42 b(W)-7 b(e)30 b(can)f(iden)n(tify)h (the)g(sum)g(with)g(appro)n(ximately)d(the)j(smallest)f(v)-5 b(alue)30 b(b)n(y)456 4354 y(comparing)c(the)i(exp)r(onen)n(ts)f (directly)-7 b(.)37 b(Let)456 4561 y(\(4\))679 b Fm(v)s Fo([)p Fm(a;)14 b(i)p Fo(])23 b(=)f Fk(\000)p Fm(\037)1667 4573 y Fi(C)1715 4581 y Fd(i)1745 4561 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2059 4573 y Fi(e)2095 4561 y Fo(\()p Fm(s;)14 b(C)2262 4573 y Fi(i)2290 4561 y Fo(\))19 b(+)f Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])p Fm(;)456 4767 y Fo(and)24 b(supp)r(ose)f(that,)i(for)f(\014xed)g Fm(a)p Fo(,)h(w)n(e)f(reorder)e (these)i(terms)g(in)g(decreasing)f(order,)g(obtaining)456 4917 y(a)34 b(sorted)h(v)n(ector)e Fm(v)1086 4929 y Ff(\003)1125 4917 y Fo([)p Fm(a)p Fo(])i(=)g Fk(f)p Fm(a)1436 4929 y Fl(1)1473 4917 y Fm(;)14 b(:)g(:)g(:)g(;)g(a)1702 4929 y Fi(k)1742 4917 y Fk(g)p Fo(,)37 b(whose)d(\014rst)h(term)g Fm(a)2525 4929 y Fl(1)2597 4917 y Fo(is)g(the)h(largest)e(exp)r(onen)n (t)456 5066 y(max)610 5078 y Fi(i)652 5066 y Fm(v)s Fo([)p Fm(a;)14 b(i)p Fo(])27 b(ab)r(o)n(v)n(e,)g(and)h(whose)f(last)h(term)g Fm(a)1945 5078 y Fi(k)2009 5066 y Fo(=)c(min)2236 5078 y Fi(i)2277 5066 y Fm(v)s Fo([)p Fm(a;)14 b(i)p Fo(])28 b(is)g(the)g(smallest.)38 b(The)28 b(other)456 5216 y(elemen)n(ts)f (satisfy)g Fm(a)1098 5228 y Fi(n)1166 5216 y Fk(\025)c Fm(a)1298 5228 y Fi(n)p Fl(+1)1427 5216 y Fo(.)p eop end %%Page: 4 4 TeXDict begin 4 3 bop 456 251 a Fl(4)1245 b(L.A.)22 b(BREYER)555 450 y Fo(W)-7 b(e)34 b(no)n(w)e(compare)g Fm(v)1260 462 y Ff(\003)1298 450 y Fo([)p Fm(a)p Fo(])g(=)g Fk(f)p Fm(a)1603 462 y Fl(1)1639 450 y Fm(;)14 b(:)g(:)g(:)g(;)g(a)1868 462 y Fi(n)1913 450 y Fk(g)32 b Fo(and)h Fm(v)2194 462 y Ff(\003)2233 450 y Fo([)p Fm(b)p Fo(])e(=)h Fk(f)p Fm(b)2521 462 y Fl(1)2557 450 y Fm(;)14 b(:)g(:)g(:)g(;)g(b)2778 462 y Fi(n)2823 450 y Fk(g)32 b Fo(term)n(wise,)i(from)456 600 y(largest)29 b(to)h(smallest,)g(stopping)g(at)g(the)h(\014rst)f (di\013erence.)45 b(Th)n(us)30 b(w)n(e)g(\014rst)g(compare)f Fm(a)3243 612 y Fl(1)3311 600 y Fo(and)456 749 y Fm(b)492 761 y Fl(1)528 749 y Fo(,)h(and)e(if)h Fm(a)864 761 y Fl(1)926 749 y Fo(=)c Fm(b)1052 761 y Fl(1)1089 749 y Fo(,)k(then)g(w)n(e)f(compare)g Fm(a)1832 761 y Fl(2)1898 749 y Fo(and)g Fm(b)2096 761 y Fl(2)2162 749 y Fo(etc.)40 b(W)-7 b(e)29 b(write)g Fm(v)2729 761 y Ff(\003)2767 749 y Fo([)p Fm(a)p Fo(])20 b Fc(B)e Fm(v)3000 761 y Ff(\003)3039 749 y Fo([)p Fm(b)p Fo(])28 b(if)i(at)e(the)456 898 y(\014rst)k(di\013erence,)h Fm(a)1076 910 y Fi(n)1152 898 y Fm(>)d(b)1283 910 y Fi(n)1328 898 y Fo(,)j(and)g(w)n(e)e(assume)h (that)g(this)h(implies)f(that)h(the)f(corresp)r(onding)456 1048 y(sums)27 b(are)g(ordered)f(the)i(same)f(w)n(a)n(y)-7 b(..)555 1197 y(This)34 b(pro)r(cedure)f(do)r(es)g(not)h(alw)n(a)n(ys)d (yield)j(exactly)f(the)h(smallest)f(sum)h(o)n(v)n(erall,)f(but)i(to)456 1347 y(obtain)30 b(a)h(coun)n(terexample,)g(it)g(is)g(necessary)f(that) h(the)g(terms)g(of)g Fm(v)2660 1359 y Ff(\003)2699 1347 y Fo([)p Fm(a)p Fo(])g(and)g Fm(v)3025 1359 y Ff(\003)3063 1347 y Fo([)p Fm(b)p Fo(])g(b)r(e)h Fh(very)456 1496 y Fo(close.)k(In)27 b(practice,)g(suc)n(h)h(closeness)e(is)h(extremely) g(rare,)g(and)g(can)g(b)r(e)h(ignored.)456 1729 y Fs(Lemma)39 b(1.)45 b Fh(Consider)38 b(two)e(\014nite)g(se)l(quenc)l(es)g Fm(a)f Fo(=)f Fk(f)p Fm(a)2306 1741 y Fl(1)2343 1729 y Fm(;)14 b(:)g(:)g(:)f(;)h(a)2571 1741 y Fi(k)2612 1729 y Fk(g)36 b Fh(and)h Fm(b)d Fo(=)h Fk(f)p Fm(b)3106 1741 y Fl(1)3142 1729 y Fm(;)14 b(:)g(:)g(:)g(;)g(b)3363 1741 y Fi(k)3403 1729 y Fk(g)456 1878 y Fh(such)32 b(that)g Fm(a)863 1890 y Fi(n)936 1878 y Fk(\025)27 b Fm(a)1072 1890 y Fi(n)p Fl(+1)1234 1878 y Fh(and)32 b Fm(b)1433 1890 y Fi(n)1506 1878 y Fk(\025)27 b Fm(b)1634 1890 y Fi(n)p Fl(+1)1795 1878 y Fh(for)33 b(al)t(l)h Fm(n)27 b Fo(=)h(1)p Fm(;)14 b(:)g(:)g(:)f(;)h(k)23 b Fk(\000)d Fo(1)p Fh(.)45 b(De\014ne)32 b Fm(a)20 b Fc(B)3105 1890 y Fi(r)3162 1878 y Fm(b)32 b Fh(if)h(and)456 2028 y(only)d(if)h Fm(a)761 2040 y Fi(j)818 2028 y Fo(=)23 b Fm(b)942 2040 y Fi(j)1006 2028 y Fh(for)31 b Fm(j)d(<)23 b(r)r Fh(,)31 b(and)f Fm(a)1589 2040 y Fi(r)1649 2028 y Fm(>)22 b(b)1772 2040 y Fi(r)1809 2028 y Fh(.)38 b(A)n(lso)30 b(de\014ne,)g(for)h Fm(r)26 b Fo(=)d(1)p Fm(;)14 b(:)g(:)g(:)f(;)h(k)21 b Fk(\000)d Fo(1)p Fh(,)456 2279 y Fo(\(5\))716 b Fm(S)1329 2291 y Fi(r)1366 2279 y Fo(\()p Fm(a)p Fo(\))23 b(=)1629 2175 y Fi(k)1587 2200 y Fe(X)1585 2374 y Fi(n)p Fl(=)p Fi(r)1723 2279 y Fm(e)1762 2245 y Fi(a)1798 2253 y Fd(n)1843 2279 y Fm(;)183 b(S)2100 2291 y Fi(r)2137 2279 y Fo(\()p Fm(b)p Fo(\))23 b(=)2392 2175 y Fi(k)2350 2200 y Fe(X)2348 2374 y Fi(n)p Fl(=)p Fi(r)2486 2279 y Fm(e)2525 2245 y Fi(b)2554 2253 y Fd(n)2599 2279 y Fm(:)456 2515 y Fh(Then)30 b(we)g(have)456 2732 y Fo(\(6\))304 b Fm(a)18 b Fc(B)993 2744 y Fi(r)1048 2732 y Fm(b)29 b Fh(implies)i Fm(S)1448 2744 y Fl(1)1485 2732 y Fo(\()p Fm(a)p Fo(\))24 b Fm(>)f(S)1756 2744 y Fl(1)1793 2732 y Fo(\()p Fm(b)p Fo(\))p Fm(;)44 b Fh(pr)l(ovide)l(d)31 b Fm(a)2331 2744 y Fi(r)2386 2732 y Fk(\000)18 b Fm(b)2505 2744 y Fi(r)2565 2732 y Fm(>)23 b Fo(log\()p Fm(k)e Fk(\000)d Fm(r)r Fo(\))p Fm(:)456 2964 y Fh(Pr)l(o)l(of.)43 b Fo(By)27 b(writing)1159 3205 y Fm(S)1210 3217 y Fl(1)1247 3205 y Fo(\()p Fm(a)p Fo(\))c(=)1470 3101 y Fi(r)r Ff(\000)p Fl(1)1468 3126 y Fe(X)1466 3302 y Fi(n)p Fl(=1)1605 3205 y Fo(+)p Fm(S)1721 3217 y Fi(r)1757 3205 y Fo(\()p Fm(a)p Fo(\))h(=)1980 3101 y Fi(r)r Ff(\000)p Fl(1)1979 3126 y Fe(X)1976 3302 y Fi(n)p Fl(=1)2115 3205 y Fo(+)p Fm(e)2219 3171 y Fi(a)2255 3179 y Fd(r)2292 3113 y Fe(\020)2342 3205 y Fo(1)18 b(+)g Fm(\022)2524 3217 y Fi(r)2560 3205 y Fo(\()p Fm(a)p Fo(\))2668 3113 y Fe(\021)2718 3205 y Fm(;)456 3443 y Fo(and)27 b(similarly)g(for)g Fm(b)p Fo(,)g(it)h(follo)n(ws)f(that)665 3538 y Fe(\()732 3680 y Fm(a)18 b Fc(B)859 3692 y Fi(r)914 3680 y Fm(b)27 b Fo(and)g Fm(S)1189 3692 y Fl(1)1227 3680 y Fo(\()p Fm(a)p Fo(\))c Fm(>)g(S)1497 3692 y Fl(1)1534 3680 y Fo(\()p Fm(b)p Fo(\))1634 3538 y Fe(\))1701 3680 y Fm(;)41 b Fo(if)29 b(and)e(only)g(if)h Fm(a)2305 3692 y Fi(r)2360 3680 y Fk(\000)18 b Fm(b)2479 3692 y Fi(r)2539 3680 y Fm(>)23 b Fo(log)2734 3538 y Fe( )2809 3623 y Fo(1)18 b(+)g Fm(\022)2991 3635 y Fi(r)3028 3623 y Fo(\()p Fm(a)p Fo(\))p 2809 3660 328 4 v 2813 3736 a(1)h(+)f Fm(\022)2996 3748 y Fi(r)3032 3736 y Fo(\()p Fm(b)p Fo(\))3147 3538 y Fe(!)3212 3680 y Fm(:)456 3921 y Fo(But)27 b(clearly)-7 b(,)27 b(0)c Fk(\024)f Fm(\022)1093 3933 y Fi(r)1130 3921 y Fo(\()p Fm(a)p Fo(\))p Fm(;)14 b(\022)1314 3933 y Fi(r)1351 3921 y Fo(\()p Fm(b)p Fo(\))23 b Fk(\024)g Fm(k)e Fk(\000)d Fm(r)k Fk(\000)c Fo(1,)27 b(b)r(ecause)1559 4169 y Fm(\022)1598 4181 y Fi(r)1635 4169 y Fo(\()p Fm(a)p Fo(\))d(=)1940 4065 y Fi(k)1899 4090 y Fe(X)1854 4266 y Fi(n)p Fl(=)p Fi(r)r Fl(+1)2077 4169 y Fm(e)2116 4135 y Fi(a)2152 4143 y Fd(n)2192 4135 y Ff(\000)p Fi(a)2280 4143 y Fd(r)2318 4169 y Fm(;)456 4414 y Fo(and)j Fm(a)661 4426 y Fi(r)721 4414 y Fk(\025)22 b Fm(a)852 4426 y Fi(n)925 4414 y Fo(for)27 b(all)h Fm(n)22 b Fk(\025)h Fm(r)r Fo(.)38 b(Consequen)n(tly)-7 b(,)27 b(w)n(e)g(obtain)g(the)h(claimed)g(b)r (ound.)342 b Fc(\003)456 4646 y Fs(Corollary)36 b(1.)42 b Fh(Supp)l(ose)33 b(that)f(ther)l(e)g(ar)l(e)h Fm(k)i Fh(c)l(ate)l(gories,)f(that)e(for)h Fm(i)28 b Fo(=)f(1)p Fm(;)14 b(:)g(:)g(:)f(;)h(k)s Fh(,)33 b Fm(\037)3171 4658 y Fi(C)3219 4666 y Fd(i)3249 4646 y Fo(\()p Fm(s)p Fo(\))28 b(=)456 4796 y Fm(\037)p Fo(\()p Fm(s)p Fo(\))38 b Fh(is)h(indep)l(endent)g(of)h Fm(s)p Fh(,)g(and)f(supp)l(ose)g(also)h (that)e Fm(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])38 b(=)g Fm(`)p Fo([)p Fm(i;)14 b(j)5 b Fo(])24 b Fk(\001)h Fm(\037)p Fo(\()p Fm(s)p Fo(\))p Fh(.)65 b(If)39 b(for)g(al)t(l)456 4945 y Fm(i;)14 b(j;)g(k)s(;)g(l)r Fh(,)29 b(either)833 5066 y Fe(\014)833 5116 y(\014)833 5166 y(\014)861 5162 y Fs(score)1072 5174 y Fi(e)1107 5162 y Fo(\()p Fm(s;)14 b(C)1274 5174 y Fi(j)1310 5162 y Fo(\))19 b Fk(\000)f Fs(score)1654 5174 y Fi(e)1690 5162 y Fo(\()p Fm(s;)c(C)1857 5174 y Fi(i)1885 5162 y Fo(\))19 b(+)f Fm(`)p Fo([)p Fm(i;)c(k)s Fo(])j Fk(\000)h Fm(`)p Fo([)p Fm(j;)c(l)r Fo(])2491 5066 y Fe(\014)2491 5116 y(\014)2491 5166 y(\014)2542 5162 y Fm(>)22 b Fo(log\()p Fm(k)s Fo(\))p Fm(=\037)p Fo(\()p Fm(s)p Fo(\))p Fm(;)p eop end %%Page: 5 5 TeXDict begin 5 4 bop 772 251 a Fl(THE)29 b(DBA)n(CL)h(TEXT)g (CLASSIFIER:)e(COST)i(MINIMIZA)-5 b(TION)28 b(WITH)i(BA)-5 b(YESOL)282 b(5)456 450 y Fh(or)833 594 y Fe(\014)833 644 y(\014)833 693 y(\014)861 689 y Fs(score)1072 701 y Fi(e)1107 689 y Fo(\()p Fm(s;)14 b(C)1274 701 y Fi(j)1310 689 y Fo(\))19 b Fk(\000)f Fs(score)1654 701 y Fi(e)1690 689 y Fo(\()p Fm(s;)c(C)1857 701 y Fi(i)1885 689 y Fo(\))19 b(+)f Fm(`)p Fo([)p Fm(i;)c(k)s Fo(])j Fk(\000)h Fm(`)p Fo([)p Fm(j;)c(l)r Fo(])2491 594 y Fe(\014)2491 644 y(\014)2491 693 y(\014)2542 689 y Fo(=)22 b(0)p Fm(;)456 891 y Fh(then)29 b(the)h Fs(ba)m(y)m(esol)g Fh(minimizer)h(is)f(the)g(true)f(minimizer.) 456 1115 y(Pr)l(o)l(of.)43 b Fo(F)-7 b(or)25 b(the)h Fs(ba)m(y)m(esol)g Fo(minimizer)f(to)h(b)r(e)g(correct,)e(w)n(e)i(m)n (ust)f(v)n(erify)g(that)h Fm(a)14 b Fc(B)3078 1127 y Fi(r)3129 1115 y Fm(b)25 b Fo(implies)456 1265 y Fm(S)507 1277 y Fl(1)544 1265 y Fo(\()p Fm(a)p Fo(\))35 b Fk(\025)f Fm(S)837 1277 y Fl(1)874 1265 y Fo(\()p Fm(b)p Fo(\))g(for)g(all)g (relev)-5 b(an)n(t)34 b(sequences.)57 b(F)-7 b(rom)34 b(\(3\),)i(the)f(t)n(ypical)f(terms)g Fm(a)3116 1277 y Fi(n)3195 1265 y Fo(and)h Fm(b)3400 1277 y Fi(n)456 1414 y Fo(resp)r(ectiv)n(ely)26 b(ha)n(v)n(e)h(the)h(form)558 1616 y Fm(a)602 1628 y Fi(n)670 1616 y Fo(=)23 b Fm(\037)p Fo(\()p Fm(s)p Fo(\))913 1524 y Fe(\020)963 1616 y Fk(\000)p Fs(score)1238 1628 y Fi(e)1274 1616 y Fo(\()p Fm(s;)14 b(C)1441 1628 y Fi(i)1469 1616 y Fo(\))19 b(+)f Fm(`)p Fo([)p Fm(i;)c(k)s Fo(])1796 1524 y Fe(\021)1844 1616 y Fm(;)180 b(b)2083 1628 y Fi(n)2151 1616 y Fo(=)23 b Fm(\037)p Fo(\()p Fm(s)p Fo(\))2394 1524 y Fe(\020)2444 1616 y Fk(\000)p Fs(score)2719 1628 y Fi(e)2755 1616 y Fo(\()p Fm(s;)14 b(C)2922 1628 y Fi(j)2957 1616 y Fo(\))19 b(+)f Fm(`)p Fo([)p Fm(j;)c(l)r Fo(])3270 1524 y Fe(\021)3319 1616 y Fm(:)456 1818 y Fo(If)27 b Fm(a)582 1830 y Fi(n)650 1818 y Fo(=)c Fm(b)774 1830 y Fi(n)819 1818 y Fo(,)k(then)g(the)h (comparison)d(of)i Fm(S)1783 1830 y Fl(1)1820 1818 y Fo(\()p Fm(a)p Fo(\))g(and)g Fm(S)2167 1830 y Fl(1)2204 1818 y Fo(\()p Fm(b)p Fo(\))g(dep)r(ends)h(on)e(other)h(terms,)g (either)456 1967 y(b)r(efore)d(or)f(after)h(the)h Fm(n)p Fo(-th)g(terms,)f(so)g(w)n(e)g(can)g(assume)g Fm(a)2260 1979 y Fi(n)2328 1967 y Fk(6)p Fo(=)f Fm(b)2452 1979 y Fi(n)2521 1967 y Fo(without)i(loss)e(of)i(generalit)n(y)-7 b(.)456 2117 y(By)37 b(relab)r(eling)h Fm(a)g Fo(and)g Fm(b)g Fo(if)g(necessary)-7 b(,)39 b(let)g Fm(n)f Fo(b)r(e)g(suc)n(h)g (that)h Fm(a)25 b Fc(B)2664 2129 y Fi(n)2734 2117 y Fm(b)p Fo(.)68 b(By)38 b(Corollary)e(1,)456 2266 y(to)e(obtain)g Fm(S)880 2278 y Fl(1)918 2266 y Fo(\()p Fm(a)p Fo(\))h Fk(\025)f Fm(S)1211 2278 y Fl(1)1248 2266 y Fo(\()p Fm(b)p Fo(\),)j(it)e(is)g(su\016cien)n(t)f(that)h Fk(j)p Fm(a)2198 2278 y Fi(n)2262 2266 y Fk(\000)18 b Fm(b)2381 2278 y Fi(n)2426 2266 y Fk(j)35 b Fm(>)f Fo(log)14 b Fm(k)s Fo(.)58 b(Rearranging)32 b(this)456 2415 y(inequalit)n(y)-7 b(,)27 b(w)n(e)g(obtain)g(the)h(stated)g(conditions.)1357 b Fc(\003)555 2615 y Fo(Note)32 b(that)g(for)f(t)n(ypical)g(do)r(cumen) n(ts,)h Fm(\037)p Fo(\()p Fm(s)p Fo(\))e Fm(>)f Fo(500,)i(so)g(that)h (for)f(example)g(with)h(5)f(cate-)456 2764 y(gories)26 b(or)g(less,)h(the)h(scores)e(should)i(b)r(e)g(no)f(closer)f(than)i(0)p Fm(:)p Fo(003,)e(unless)h(they)h(are)f(iden)n(tical.)1220 2983 y(4.)41 b Fn(Connection)31 b(with)h(MAP)f(estima)-6 b(te)555 3183 y Fo(The)22 b(MAP)h(estimate)f(is)g(a)g(sp)r(ecial)f (case)h(of)g(the)g(general)f(cost)h(minimizing)g(estimate.)35 b(The)456 3332 y(MAP)27 b(estimate)h(can)f(b)r(e)h(obtained)f(b)n(y)h (setting)456 3609 y(\(7\))936 b Fm(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])22 b(=)1815 3414 y Fe(8)1815 3489 y(>)1815 3513 y(<)1815 3663 y(>)1815 3688 y(:)1889 3534 y Fo(0)189 b(if)28 b Fm(i)22 b Fk(6)p Fo(=)h Fm(j)1889 3714 y Fk(\0001)83 b Fo(if)28 b Fm(i)22 b Fo(=)h Fm(j:)555 3886 y Fo(It)g(is)f(not)g(hard) g(to)g(see)g(that)g(the)h(cost)f(minimizer)g(agrees)f(with)h(the)h(MAP) f(estimate,)i(since)456 4035 y(\(3\))j(b)r(ecomes)h(simply)907 4269 y Fm(w)966 4281 y Ff(\003)1005 4269 y Fo(\()p Fm(s)p Fo(\))23 b(=)g(arg)14 b(min)1401 4319 y Fi(a)1602 4165 y(k)1561 4190 y Fe(X)1502 4369 y Fi(i)p Fl(=1)p Fi(;i)p Ff(6)p Fl(=)p Fi(a)1753 4269 y Fo(exp)1880 4177 y Fe(\020)1930 4269 y Fk(\000)p Fm(\037)2047 4281 y Fi(C)2095 4289 y Fd(i)2124 4269 y Fo(\()p Fm(s)p Fo(\))19 b Fk(\001)g Fs(score)2499 4281 y Fi(e)2534 4269 y Fo(\()p Fm(s;)14 b(C)2701 4281 y Fi(i)2729 4269 y Fo(\))2761 4177 y Fe(\021)2811 4269 y Fm(;)-2378 b Fo(\(8\))1131 4580 y(=)23 b(arg)14 b(min)1401 4629 y Fi(a)1488 4438 y Fe(\()1555 4580 y Fm(Z)6 b Fo(\()p Fm(s)p Fo(\))18 b Fk(\000)g Fo(exp)1949 4487 y Fe(\020)1999 4580 y Fk(\000)p Fm(\037)2116 4592 y Fi(C)2164 4600 y Fd(a)2203 4580 y Fo(\()p Fm(s)p Fo(\))h Fk(\001)g Fs(score)2578 4592 y Fi(e)2613 4580 y Fo(\()p Fm(s;)14 b(C)2780 4592 y Fi(a)2821 4580 y Fo(\))2853 4487 y Fe(\021)2903 4438 y(\))2970 4580 y Fm(;)456 4839 y Fo(where)26 b Fm(Z)6 b Fo(\()p Fm(s)p Fo(\))23 b(=)971 4777 y Fe(P)1059 4798 y Fi(k)1059 4864 y(i)p Fl(=1)1184 4839 y Fo(exp)1311 4747 y Fe(\020)1361 4839 y Fk(\000)p Fm(\037)1478 4851 y Fi(C)1526 4859 y Fd(i)1556 4839 y Fo(\()p Fm(s)p Fo(\))p Fs(score)1870 4851 y Fi(e)1906 4839 y Fo(\()p Fm(s;)14 b(C)2073 4851 y Fi(i)2101 4839 y Fo(\))2133 4747 y Fe(\021)2182 4839 y Fo(.)37 b(Since)27 b Fm(Z)6 b Fo(\()p Fm(s)p Fo(\))26 b(is)h(indep)r(enden)n(t)g(of)f Fm(a)p Fo(,)h(it)456 4989 y(is)g(easy)g(to)g(see)g(that)h(w)n(e)g(also) e(ha)n(v)n(e)456 5191 y(\(9\))628 b Fm(w)1249 5203 y Ff(\003)1287 5191 y Fo(\()p Fm(s)p Fo(\))24 b(=)f(arg)13 b(max)1691 5240 y Fi(a)1787 5099 y Fe(n)1842 5191 y Fm(\037)1894 5203 y Fi(C)1942 5211 y Fd(a)1982 5191 y Fo(\()p Fm(s)p Fo(\))19 b Fk(\001)f Fs(score)2356 5203 y Fi(e)2392 5191 y Fo(\()p Fm(s;)c(C)2559 5203 y Fi(a)2600 5191 y Fo(\))2632 5099 y Fe(o)2687 5191 y Fm(:)p eop end %%Page: 6 6 TeXDict begin 6 5 bop 456 251 a Fl(6)1245 b(L.A.)22 b(BREYER)555 450 y Fo(Ho)n(w)n(ev)n(er,)30 b(note)h(that)g(in)g(general,)f Fm(Z)6 b Fo(\()p Fm(s)p Fo(\))31 b(w)n(ould)g(dep)r(end)g(on)g Fm(a)f Fo(if)i Fm(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])30 b(is)h(nonzero)e(for)456 600 y Fm(i)22 b Fk(6)p Fo(=)h Fm(j)5 b Fo(.)35 b(Also,)24 b(ev)n(en)f(in)h(the)f(MAP)g(case,)h Fm(Z)6 b Fo(\()p Fm(s)p Fo(\))23 b(can)g(only)g(b)r(e)h(computed)f(v)n (ery)f(appro)n(ximately)-7 b(,)456 749 y(and)27 b(\(9\))h(cannot)f(b)r (e)h(relied)f(on)g(for)h(calculations.)1593 1066 y(5.)41 b Fn(Cost)31 b(rankings)555 1265 y Fo(One)i(big)h(di\013erence)f(b)r (et)n(w)n(een)h(the)g(MAP)f(estimation)h(pro)r(cedure)e(and)i(a)f (general)f(cost)456 1415 y(minimization)27 b(is)h(that)g(the)f(former)g (allo)n(ws)f(a)h(natural)g(ranking)f(of)i(do)r(cumen)n(ts,)f(from)h (most)456 1564 y(probable)36 b(to)h(least)g(probable.)64 b(Suc)n(h)38 b(a)e(ranking)g(is)i(trivial)e(to)h(deduce)h(from)e(the)i (scores)456 1714 y(obtained)27 b(from)h Fs(dbacl)p Fo(,)h(via)e(the)i (form)n(ula)e(\(1\):)38 b(the)28 b(lo)n(w)n(er)f(the)h(score)f (\(closer)g(to)h(zero\),)f(the)456 1863 y(more)f(probable)h(the)h (category)-7 b(.)555 2013 y(By)26 b(con)n(trast,)g(the)g(cost)g (minimization)h(problem)f(induces)g(sev)n(eral)f(natural)g(orderings)g (of)456 2162 y(the)36 b(categories.)61 b(The)37 b(simplest)f(ordering)f (is)h(based)g(on)g(directly)g(using)g(the)h(conditional)456 2311 y(costs)26 b(whic)n(h)h(are)f(minimized)i(in)f(\(3\).)37 b(This)27 b(is)g(appro)n(ximately)e(rep)r(orted)h(via)h Fs(ba)m(y)m(esol)p Fo('s)g Fh(-n)456 2461 y Fo(switc)n(h.)555 2610 y(A)c(practical)f(di\016cult)n(y)g(with)i(this)e(sc)n(heme)g(is)h (that)g(the)g(non-optimal)e(costs)h(often)h(exhibit)456 2760 y(b)n(y)c(v)n(ery)f(little,)k(or)d(no)g(di\013erence,)i(whic)n(h)f (mak)n(es)e(the)i(ordering)e(imp)r(ossible.)34 b(Moreo)n(v)n(er,)19 b(ev)n(en)456 2909 y(in)28 b(the)g(b)r(est)h(conditions,)e(the)i(v)n (ery)d(precision)i(problems)f(whic)n(h)h(plague)f(the)h(minimization) 456 3059 y(also)f(a\013ect)h(the)g(rankings)f(so)h(obtained.)38 b(The)28 b(rep)r(orted)g(costs)f(are)g(only)h(roughly)f(accurate)456 3208 y(on)g(the)h(log)f(scale.)555 3358 y(The)j Fs(ba)m(y)m(esol)f Fo(utilit)n(y)h(also)e(o\013ers)h(a)g(di\013eren)n(t)g(sc)n(heme)g (\(via)g(the)h Fh(-N)f Fo(switc)n(h\))h(to)f(obtain)456 3507 y(a)f(category)f(ordering)h(based)g(on)h(the)g(costs.)41 b(In)29 b(this)g(sc)n(heme,)g(the)g(\014rst)g(category)e(is)i(based)456 3656 y(on)35 b(the)g(minimal)h(cost.)59 b(Next,)37 b(this)f(b)r(est)g (category)d(is)i(remo)n(v)n(ed)f(from)g(the)i(list)g(of)f(a)n(v)-5 b(ail-)456 3806 y(able)29 b(categories,)g(and)h(the)h(second)e(b)r(est) i(category)d(is)i(c)n(hosen)f(to)h(b)r(e)h(that)f(category)f(whic)n(h) 456 3955 y(minimizes)h(the)g(cost)g(for)f(the)h(reduced)g(category)e (set.)44 b(This)30 b(is)g(rep)r(eated)f(un)n(til)i(no)f(further)456 4105 y(remo)n(v)-5 b(als)26 b(are)g(p)r(ossible.)919 4385 y Fm(c)955 4397 y Fl(1)1015 4385 y Fo(=)c(arg)14 b(min)1284 4435 y Fi(a)1427 4282 y(k)1385 4306 y Fe(X)1391 4483 y Fi(i)p Fl(=1)1519 4385 y Fo(exp)1646 4293 y Fe(\020)1695 4385 y Fk(\000)p Fm(\037)1812 4397 y Fi(C)1860 4405 y Fd(i)1890 4385 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2204 4397 y Fi(e)2240 4385 y Fo(\()p Fm(s;)g(C)2407 4397 y Fi(i)2435 4385 y Fo(\))19 b(+)f Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2782 4293 y Fe(\021)919 4690 y Fm(c)955 4702 y Fl(2)1015 4690 y Fo(=)22 b(arg)d(min)1233 4744 y Fi(a)p Ff(6)p Fl(=)p Fi(c)1350 4752 y Fb(1)1509 4586 y Fi(k)1468 4611 y Fe(X)1396 4790 y Fi(i)p Fl(=1)p Fi(;i)p Ff(6)p Fl(=)p Fi(c)1627 4798 y Fb(1)1674 4690 y Fo(exp)1800 4598 y Fe(\020)1850 4690 y Fk(\000)p Fm(\037)1967 4702 y Fi(C)2015 4710 y Fd(i)2045 4690 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2359 4702 y Fi(e)2395 4690 y Fo(\()p Fm(s;)14 b(C)2562 4702 y Fi(i)2590 4690 y Fo(\))k(+)g Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2936 4598 y Fe(\021)992 4913 y Fo(.)992 4947 y(.)992 4980 y(.)915 5167 y Fm(c)951 5179 y Fi(k)1015 5167 y Fo(=)22 b Fk(f)p Fm(i)h Fo(:)g Fm(i)f Fk(6)p Fo(=)h Fm(c)1417 5179 y Fl(1)1454 5167 y Fm(;)14 b(:)g(:)g(:)g(;)g(c)1675 5179 y Fi(k)q Ff(\000)p Fl(1)1800 5167 y Fk(g)p Fm(:)p eop end %%Page: 7 7 TeXDict begin 7 6 bop 772 251 a Fl(THE)29 b(DBA)n(CL)h(TEXT)g (CLASSIFIER:)e(COST)i(MINIMIZA)-5 b(TION)28 b(WITH)i(BA)-5 b(YESOL)282 b(7)555 450 y Fo(This)29 b(metho)r(dology)e(is)i(easy)f(to) g(compute)h(recursiv)n(ely)-7 b(,)27 b(and)i(eac)n(h)f(subproblem)g (has)g(the)456 600 y(same)k(form)h(as)g(the)h(original.)52 b(In)34 b(fact,)h(no)e(c)n(hange)f(in)h(the)h(co)r(de)f(is)g(needed)h (if)g(the)f Fm(L)p Fo([)p Fm(i;)14 b(a)p Fo(])456 749 y(matrix)27 b(is)g(censored)f(appropriately)g(at)i(eac)n(h)e Fm(n)p Fo(-th)i(stage,)f(obtaining)g(a)g(matrix)g Fm(L)3134 761 y Fi(n)3179 749 y Fo([)p Fm(i;)14 b(j)5 b Fo(])27 b(b)n(y)456 898 y(setting)g Fm(L)785 910 y Fl(0)822 898 y Fo([)p Fm(i;)14 b(j)5 b Fo(])23 b(=)f Fm(L)p Fo([)p Fm(i;)14 b(j)5 b Fo(])27 b(and)1189 1328 y Fm(L)1246 1340 y Fi(n)p Fl(+1)1374 1328 y Fo([)p Fm(i;)14 b(j)5 b Fo(])23 b(=)1636 1059 y Fe(8)1636 1133 y(>)1636 1158 y(>)1636 1183 y(>)1636 1208 y(>)1636 1233 y(<)1636 1382 y(>)1636 1407 y(>)1636 1432 y(>)1636 1457 y(>)1636 1482 y(:)1709 1164 y Fo(+)p Fk(1)188 b Fo(if)28 b Fm(i)23 b Fo(=)f Fm(j)28 b Fo(=)23 b Fm(c)2446 1176 y Fi(n)1709 1343 y Fk(\0001)188 b Fo(if)28 b Fm(i)23 b Fo(=)f Fm(c)2296 1355 y Fi(n)2369 1343 y Fo(or)27 b Fm(j)h Fo(=)22 b Fm(c)2656 1355 y Fi(n)1709 1523 y Fm(L)1766 1535 y Fi(n)1811 1523 y Fo([)p Fm(i;)14 b(j)5 b Fo(])83 b(otherwise.)555 1758 y(It)33 b(is)g(imp)r(ortan)n(t)g(to)g(note)f(that)i(the)f(ordering)e Fk(f)p Fm(c)2178 1770 y Fl(1)2215 1758 y Fm(;)14 b(:)g(:)g(:)f(;)h(c) 2435 1770 y Fi(k)2476 1758 y Fk(g)33 b Fo(coincides)f(with)h(the)h(MAP) 456 1908 y(ordering)26 b(in)h(the)h(case)f(when)h Fm(L)f Fo(is)h(c)n(hosen)e(as)h(in)h(Section)g(7.)555 2057 y(This)c(is)f(easy) g(to)h(see)f(inductiv)n(ely)h(as)e(follo)n(ws)h(\(outline\):)36 b(at)23 b(the)h(\014rst)g(stage,)f Fm(c)3060 2069 y Fl(1)3121 2057 y Fo(coincides)456 2207 y(with)32 b(the)h(MAP)g(estimate,)g(b)n(y) f(the)h(argumen)n(t)e(in)i(the)g(earlier)d(section.)51 b(After)33 b(censoring,)456 2356 y(only)39 b Fm(L)707 2368 y Fl(1)783 2356 y Fo(still)h(has)e(the)i(form)f(required)g(for)g (MAP)-7 b(,)39 b(when)h(restricted)e(to)i(the)f(remaining)456 2506 y(categories.)34 b(Th)n(us)28 b Fm(c)1118 2518 y Fl(2)1182 2506 y Fo(coincides)f(with)h(the)g(MAP)f(estimate)h(on)f(the) h(restricted)f(set,)g(ie)h Fm(c)3324 2518 y Fl(2)3389 2506 y Fo(is)456 2655 y(the)g(second)f(b)r(est)h(MAP)f(estimate,)h(and) f(so)g(on.)555 2804 y(Ho)n(w)n(ev)n(er,)g(a)i(suprirising)e(fact)i(is)f (that)h(in)g(the)g(MAP)g(case)f(\(7\),)h(the)g(computed)g(costs)f(do) 456 2954 y Fh(not)19 b Fo(resem)n(ble)f(the)h(MAP)h(costs.)33 b(T)-7 b(o)19 b(see)g(this,)i(w)n(e)e(assume)f(that)i(the)f(Laplace)f (appro)n(ximation)456 3103 y(holds,)33 b(ie)g(that)g(the)g(sum)f(of)h (exp)r(onen)n(tial)f(terms)g(is)h(appro)n(ximately)e(equal)h(to)g(its)h (leading)456 3253 y(term.)41 b(This)29 b(is)h(quite)f(realistic)f(in)i (practical)e(examples,)h(t)n(ypically)f(due)i(to)f(the)h(magnitude)456 3402 y(of)d Fm(\037)p Fo(\()p Fm(s)p Fo(\).)869 3695 y Fs(cost)p Fo(\()p Fm(c)1102 3707 y Fl(1)1140 3695 y Fo(\))c(=)f(min)1334 3745 y Fi(a)1476 3591 y(k)1435 3616 y Fe(X)1441 3793 y Fi(i)p Fl(=1)1568 3695 y Fo(exp)1695 3603 y Fe(\020)1745 3695 y Fk(\000)p Fm(\037)1862 3707 y Fi(C)1910 3715 y Fd(i)1939 3695 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2254 3707 y Fi(e)2290 3695 y Fo(\()p Fm(s;)14 b(C)2457 3707 y Fi(i)2485 3695 y Fo(\))k(+)g Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2831 3603 y Fe(\021)1195 3942 y Fo(=)22 b(min)1334 3992 y Fi(a)1435 3863 y Fe(X)1439 4042 y Fi(i)p Ff(6)p Fl(=)p Fi(a)1568 3942 y Fo(exp)1695 3850 y Fe(\020)1745 3942 y Fk(\000)p Fm(\037)1862 3954 y Fi(C)1910 3962 y Fd(i)1939 3942 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2254 3954 y Fi(e)2290 3942 y Fo(\()p Fm(s;)14 b(C)2457 3954 y Fi(i)2485 3942 y Fo(\))2517 3850 y Fe(\021)1195 4203 y Fk(\030)22 b Fo(min)1334 4253 y Fi(a)1435 4203 y Fo(max)1457 4257 y Fi(i)p Ff(6)p Fl(=)p Fi(a)1589 4111 y Fe(n)1645 4203 y Fo(exp)1771 4111 y Fe(\020)1821 4203 y Fk(\000)p Fm(\037)1938 4215 y Fi(C)1986 4223 y Fd(i)2016 4203 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2330 4215 y Fi(e)2366 4203 y Fo(\()p Fm(s;)14 b(C)2533 4215 y Fi(i)2561 4203 y Fo(\))2593 4111 y Fe(\021o)869 4475 y Fs(cost)p Fo(\()p Fm(c)1102 4487 y Fl(2)1140 4475 y Fo(\))23 b(=)28 b(min)1282 4529 y Fi(a)p Ff(6)p Fl(=)p Fi(c)1399 4537 y Fb(1)1559 4371 y Fi(k)1517 4396 y Fe(X)1445 4575 y Fi(i)p Fl(=1)p Fi(;i)p Ff(6)p Fl(=)p Fi(c)1676 4583 y Fb(1)1723 4475 y Fo(exp)1850 4383 y Fe(\020)1899 4475 y Fk(\000)p Fm(\037)2016 4487 y Fi(C)2064 4495 y Fd(i)2094 4475 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2408 4487 y Fi(e)2444 4475 y Fo(\()p Fm(s;)14 b(C)2611 4487 y Fi(i)2639 4475 y Fo(\))19 b(+)f Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2986 4383 y Fe(\021)1195 4735 y Fk(\030)28 b Fo(min)1282 4790 y Fi(a)p Ff(6)p Fl(=)p Fi(c)1399 4798 y Fb(1)1464 4735 y Fo(max)1445 4790 y Fi(i)p Ff(6)p Fl(=)p Fi(a;c)1605 4798 y Fb(1)1638 4643 y Fe(n)1693 4735 y Fo(exp)1820 4643 y Fe(\020)1869 4735 y Fk(\000)p Fm(\037)1986 4747 y Fi(C)2034 4755 y Fd(i)2064 4735 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2378 4747 y Fi(e)2414 4735 y Fo(\()p Fm(s;)14 b(C)2581 4747 y Fi(i)2609 4735 y Fo(\))2641 4643 y Fe(\021o)1172 4913 y Fo(.)1172 4947 y(.)1172 4980 y(.)865 5167 y Fs(cost)p Fo(\()p Fm(c)1098 5179 y Fi(k)1140 5167 y Fo(\))23 b(=)f(unde\014ned.)p eop end %%Page: 8 8 TeXDict begin 8 7 bop 456 251 a Fl(8)1245 b(L.A.)22 b(BREYER)555 450 y Fo(If)31 b(the)h Fm(\037)840 462 y Fi(C)888 470 y Fd(i)918 450 y Fo(\()p Fm(s)p Fo(\))f(do)f(not)h(dep)r(end)h(on)e Fm(i)h Fo(sa)n(y)-7 b(,)30 b(then)h(it)h(follo)n(ws)d(from)i(these)g (estimates)f(that)456 600 y(log)14 b Fs(cost)p Fo(\()p Fm(c)810 612 y Fl(1)847 600 y Fo(\))20 b(is)f(prop)r(ortional)e(to)j (the)f Fh(se)l(c)l(ond)k(b)l(est)c Fo(score,)g(that)h(log)14 b Fs(cost)p Fo(\()p Fm(c)2830 612 y Fl(2)2867 600 y Fo(\))20 b(is)f(prop)r(ortional)456 749 y(to)40 b(the)g Fh(thir)l(d)i(b)l(est)f (sc)l(or)l(e)f Fo(etc.)75 b(This)40 b(is)g(qualitativ)n(ely)f(quite)h (di\013eren)n(t)g(from)g(the)h(MAP)456 898 y(ordering)26 b(of)h(scores.)555 1048 y(Clearly)-7 b(,)43 b(this)e(result)g(is)f (troubling.)76 b(The)40 b(orderings)f(are)h(the)h(same,)i(but)e(the)g (extra)456 1197 y(qualitativ)n(e)30 b(information)g(ab)r(out)h(the)g (shap)r(e)g(of)f(the)i(p)r(osterior)d(is)i(lost.)46 b(F)-7 b(ortunately)g(,)31 b(it)h(is)456 1347 y(p)r(ossible)26 b(to)g(reco)n(v)n(er)f(the)i(shap)r(e)f(at)h(least)f(appro)n(ximately) -7 b(.)35 b(The)27 b(k)n(ey)e(is)i(to)g(realize)e(that)i(the)456 1496 y Fs(cost)g Fo(function)h(can)g(b)r(e)g(added)f(to)h(a)f(constan)n (t)g(without)h(harming)e(the)i(minimization.)555 1646 y(F)-7 b(or)27 b(a)g(\014xed)h(string)f Fm(s)p Fo(,)h(consider)e(the)i (alternativ)n(e)e(cost)i(function)g Fs(cost')f Fo(de\014ned)h(b)n(y)684 1875 y Fs(cost')p Fo(\()p Fm(s)p Fo(\))23 b(=)g(min)1141 1925 y Fi(a)1284 1771 y(k)1242 1796 y Fe(X)1248 1973 y Fi(i)p Fl(=1)1376 1875 y Fo(exp)1503 1783 y Fe(\020)1552 1875 y Fk(\000)p Fm(\037)1669 1887 y Fi(C)1717 1895 y Fd(i)1747 1875 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2061 1887 y Fi(e)2097 1875 y Fo(\()p Fm(s;)14 b(C)2264 1887 y Fi(i)2292 1875 y Fo(\))19 b(+)f Fm(L)p Fo([)p Fm(i;)c(a)p Fo(])2639 1783 y Fe(\021)2706 1875 y Fo(+)2830 1771 y Fi(k)2789 1796 y Fe(X)2795 1973 y Fi(i)p Fl(=1)2923 1875 y Fj(P)p Fo(\()p Fm(C)20 b Fk(j)14 b Fm(s)p Fo(\))p Fm(:)456 2099 y Fo(As)23 b(the)h(last)f(term)h(do)r(es)f(not)g(dep)r(end)i(on)e Fm(a)p Fo(,)h(it)g(do)r(es)f(not)h(a\013ect)f(the)h(minimization,)h (yielding)456 2249 y(the)j(same)f(ordering)f(as)g(for)i(the)g(original) e Fs(cost)p Fo(.)555 2398 y(By)i(rearranging)c(the)k(equation)f(in)h (the)g(case)f(of)g Fm(L)g Fo(giv)n(en)g(b)n(y)i(\(7\),)e(w)n(e)h (obtain)f(easily)456 2632 y Fs(cost')o Fo(\()p Fm(c)715 2644 y Fl(1)753 2632 y Fo(\))c(=)g(min)947 2682 y Fi(a)1034 2540 y Fe(n)1089 2632 y Fo(2)1245 2528 y Fi(k)1203 2553 y Fe(X)1145 2732 y Fi(i)p Fl(=1)p Fi(;i)p Ff(6)p Fl(=)p Fi(a)1396 2632 y Fo(exp)1523 2540 y Fe(\020)1573 2632 y Fk(\000)p Fm(\037)1690 2644 y Fi(C)1738 2652 y Fd(i)1767 2632 y Fo(\()p Fm(s)p Fo(\))p Fs(score)2082 2644 y Fi(e)2117 2632 y Fo(\()p Fm(s;)14 b(C)2284 2644 y Fi(i)2312 2632 y Fo(\))2344 2540 y Fe(\021)2413 2632 y Fo(+)k(exp)2622 2540 y Fe(\020)2672 2632 y Fk(\000)p Fm(\037)2789 2644 y Fi(C)2837 2652 y Fd(a)2877 2632 y Fo(\()p Fm(s)p Fo(\))p Fs(score)3191 2644 y Fi(e)3227 2632 y Fo(\()p Fm(s;)c(C)3394 2644 y Fi(a)3434 2632 y Fo(\))3466 2540 y Fe(\021o)808 2950 y Fo(=)23 b(2)992 2846 y Fi(k)951 2871 y Fe(X)957 3048 y Fi(i)p Fl(=1)1085 2950 y Fo(exp)1211 2857 y Fe(\020)1261 2950 y Fk(\000)p Fm(\037)1378 2962 y Fi(C)1426 2970 y Fd(i)1456 2950 y Fo(\()p Fm(s)p Fo(\))p Fs(score)1770 2962 y Fi(e)1806 2950 y Fo(\()p Fm(s;)14 b(C)1973 2962 y Fi(i)2001 2950 y Fo(\))2033 2857 y Fe(\021)2101 2950 y Fk(\000)k Fo(max)2243 2999 y Fi(a)2339 2857 y Fe(n)2394 2950 y Fo(exp)2521 2857 y Fe(\020)2570 2950 y Fk(\000)p Fm(\037)2687 2962 y Fi(C)2735 2970 y Fd(a)2775 2950 y Fo(\()p Fm(s)p Fo(\))p Fs(score)3089 2962 y Fi(e)3125 2950 y Fo(\()p Fm(s;)c(C)3292 2962 y Fi(a)3333 2950 y Fo(\))3365 2857 y Fe(\021o)808 3197 y Fk(\030)23 b Fo(max)955 3247 y Fi(a)1050 3105 y Fe(n)1105 3197 y Fo(exp)1232 3105 y Fe(\020)1282 3197 y Fk(\000)p Fm(\037)1399 3209 y Fi(C)1447 3217 y Fd(a)1486 3197 y Fo(\()p Fm(s)p Fo(\))p Fs(score)1801 3209 y Fi(e)1836 3197 y Fo(\()p Fm(s;)14 b(C)2003 3209 y Fi(a)2044 3197 y Fo(\))2076 3105 y Fe(\021o)2181 3197 y Fm(;)456 3399 y Fo(where)20 b(w)n(e)h(again)e(assume)i(that)g (the)g(Laplace)f(appro)n(ximation)f(holds.)35 b(A)21 b(similar)f(calculation)456 3548 y(sho)n(ws)31 b(that)i(log)14 b Fs(cost')p Fo(\()p Fm(c)1265 3560 y Fl(2)1302 3548 y Fo(\))33 b(is)f(prop)r(ortional)f(to)i(the)g(second)f(b)r(est)h (score,)g(etc.)52 b(Th)n(us)32 b(with)456 3698 y(this)20 b(mo)r(di\014ed)h(cost)f(function,)i(w)n(e)e(obtain)g(a)g(natural)g (generalization)e(of)i(the)h(MAP)f(ordering,)456 3847 y(whic)n(h)27 b(k)n(eeps)g(the)h(shap)r(e)f(of)h(the)g(p)r(osterior)e (in)n(tact,)i(at)f(least)g(in)h(the)g(MAP)g(case.)1708 4066 y Fn(References)573 4241 y Fr([1])35 b(Brey)n(er,)23 b(L.A.)g(\(2002\))i Fg(The)h(db)l(acl)h(text)d(classi\014er)p Fr(.)555 4387 y Fg(E-mail)i(addr)l(ess)5 b Fr(:)33 b Fa(laird@lbreyer.com)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF dbacl-1.14.1/doc/dbacl.ps000066400000000000000000020055741325773323600150510ustar00rootroot00000000000000%!PS-Adobe-2.0 %%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software %%Title: dbacl.dvi %%Pages: 30 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: CMBX10 CMR8 CMCSC10 CMBX8 CMMI8 CMR10 CMTI10 CMMI10 %%+ CMTI8 CMR7 MSBM10 CMMI7 CMR5 CMMI5 CMSY10 CMEX10 CMSY7 CMTT10 CMMI6 %%+ MSBM7 CMSY5 TeX-cmex7 CMTT8 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips dbacl.dvi -o %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2004.07.29:1619 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: f7b6d320.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 % cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 % cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 % cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 % /TeXf7b6d320Encoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 0ef0afca.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmr5 % /TeX0ef0afcaEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: aae443f0.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 % /TeXaae443f0Encoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf /arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft /arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash /greater /star /partialdiff /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 /flat /natural /sharp /slurbelow /slurabove /lscript /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 /dotlessi /dotlessj /weierstrass /vector /tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 74afc74c.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 % /TeX74afc74cEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /sterling /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /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 /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /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 /endash /emdash /hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: bbad153f.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 % /TeXbbad153fEncoding [ /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast /arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup /arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional /prime /infinity /element /owner /triangle /triangleinv /negationslash /mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur /latticetop /perpendicular /aleph /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 /union /intersection /unionmulti /logicaland /logicalor /turnstileleft /turnstileright /floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright /angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv /backslash /wreathproduct /radical /coproduct /nabla /integral /unionsq /intersectionsq /subsetsqequal /supersetsqequal /section /dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus /.notdef /.notdef /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: 09fbbfac.enc % Thomas Esser, Dec 2002. public domain % % Encoding for: % cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 /TeX09fbbfacEncoding [ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /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 /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /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 /braceleft /bar /braceright /asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def %%EndProcSet %%BeginProcSet: texps.pro %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginFont: CMTT8 %!PS-AdobeFont-1.1: CMTT8 1.0 %%CreationDate: 1991 Aug 20 16:46:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-5 -232 545 699}readonly def /UniqueID 5000830 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE 3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477 C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D 4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7 61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16 6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173 B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31 6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23 C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE 52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9 48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5 351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128 C4CF2F4F438A4E520CD932BAC455BF8775C27AEA6C73EED3EB2F8DB5E356AE27 41B35C8AEFE73C4CD6A591AAE4F45762EBD6D3636C03F08C552BBFD0A13D11D5 491F8369B4BAB8ED9D6F1DE7DB7AFD383986C4338D3AA71C9AF2B8A0955CFD86 0345F16D9798B25156DDF826A7CB6A0CC4CB43078BEBD3E499DA95562A08EED9 7CA27B7A0CE3FA7EBDAA87A602512645CA49799B937B920ED4B12DF325BC1D80 5700E3AF6BA9B919906BD42652AC3D91D9FE631AA1D6D0849B51301E1532CA3B 2A8BB9993EDBF4E768E441CBA62CF3DC2DAC34122EC5306AAAC1F35EF80FBC39 F572EE17ED014B0A45EAA8E7A1D8AFB0ED52A7A8A94B348BD6CB39A055032975 28CB0E254CBCCE33FF41837A67C54DC84BD9344DA8656062065DD96315D3F960 2A16CEB4E787F4E2BFC8A55A164727DF30542C501EB462FCF6BCD2373099DFAA DA05D3F15CD2AAB562CB8E9F26819EE295C21E62E7EFBFC43F79261D1A9C14D4 91F06B03E05ADF2F77F34EE35FBA6845F9F702CE14C85F29B6C62104BE8E57CD D42AC23D253E21F76F93405CD9A09C5B76AEB10160284F23AE002814BBABD5B3 D723264558F1E4C742E16B44251139842E5D722791A266E68533DE9BABB6C298 9216219C0F38D1EEEC69705D84736CF8EF8260D78B6F64FB9C37218725E9D154 EB2A8B630EBE52712FFF7D43301E8DB94C54C41E0950055B30E4B241BF7097F6 E27F8B5F1E5B160DDA74E8C715E0E4180CF3B25A6A8D43C8B234A71C0EAEB92E EEF973B39A400D4676C63609CA49B870F50FB8F0CAA290B9A55FE2CB1AB7C26A 378B105A50B6B6FC457874C1A3E1792CA109DDE132E7D31084DFB7BB7594593F 9AF74CBFDE0D54B3BA977EA9E9ECF695253843015BE50A16DF2682DD7FEA4BCB DBA5B94A20F5C34F76819BE3AD41A8C8668288923CE79583C7EE0BF07F0EEE7B DF1486D373F74A7C4101AA8A0156E6EC7081C1A09BF92BEED6EB29B59568E6ED 2B422644947BFCD9C0975DC523868D9032E321A34A9DCCDE3D984493EEA00353 33BF8529331930291278A27060ECC60BF1E63353C98875D56BF790EFE721B4ED 303B68C659ADFD5021A36F46CD59E11D9339D3C7C34A031EECF2C6F3C6B69BE8 467FBD9FC52005275AA2C34FB42701C578D07525834C6C22FC5114DC6F9187FE F5FB4B420CC364C8C238AA8C87D64639EC9E30AF1F9136D0AD04E72DFEC0702A E7BE1E49FEC80DF3A9212634230A5CDA59969D1008D91F0F6743D932A7A68939 06CC9ED616A548B738FBFC2B35BD172B3AF0A55551BC860135347A7548245FDE 0A58812DC5AB21B7FA37B8481EB78AF3BE8BB8D1F899E80AFCFE4A50DEAF0D91 48AA45AC949172E4E1CE988182757D8F3847C5A5808DF915824F947569D076C8 771F9D677552990729FA79F54E198FA9FACB14378C88B9C515324769A5B066A9 CDC8AB28D35BDFA431C58FCF87F6C3DD6AEA768753DD983EACEFBC7E0AFBF480 B7E784D2AFC7CC2436C6936D73E2C9DDBD4E807CE4284CB04AA65371FAA72378 853E9EE7D40ED128A517829B8C93602F4B736B4D7F428D8C9F09829993E8717F 9C5D7218D7C2DBEEEEDC8EB3B0393832CAE39DE268F1DAC599F6636CDFE60FFA 8504C3367AD6D2460E3567B902687630AC0009089F6FA05B887502A71C15A71E FE74E44A46F3D55A76FEA5507C93CDC01CC873F319407864BDB76189007B06D1 E0607A5DCCB94630E741737EAD6C170F5AA0E33B637A6945AFFF9590DFA364B2 160875100D53E3C34066DFB24271652D19811F68C8C17F5AFE359217FFD47871 B10340BACD837601B6709FE6C08578FE4D6623049ADFEBA8D98FE6D33651EB64 A152B68DB46432C03521052BAFF98E71EBB47C718FAD5CAF668E682F42B3C0FA 7701814CB2DC4D382F582CF0CD1996A44EEA0F3DFAD53C65148E9022512D98E5 35D3FB287D67B7D043E78FF3D9228540ACD65D57965A722FC1A9E64A817D0C25 E5C031A59F980ABF34ACFE23FBBADC076878D7AC08299FBA706DFDE6873D6316 035C55248DAD516B3A5D941200B1B0D5F314462131996D67B3B7BEBE946E5E6C 197DBCDAE0C9BB7419E737E747E8E6D0AF1152D195ED7EC9964BE042BD8B3F9D F619018D87511182EBC9D3B75D973571FFA32A9356549CAA0B7F52B1FEAF82A9 C50A5A540659A7F0CC7B4E6CC1B15E8E7B6D7C75A456466D3FE318EA1EF95A0C 24B3C06140CB0453137F51F720931B5609E871E8E1334A94511D74AED132FF12 3D88DEDE85E63AE50F5DC638DEDF6770EFFCCC10BA459A207721359BC643CE60 C37C7DD17B4EB7715EDBB8406E93E610E6560E64FE5AC9577DACB24DEACDC70C FE6AAD5E1EBFA3225ED97E42E4ED463BF79574B219FA8726C77056D7E79852A9 3EAE51A78A0E5AAE8051B7960F4009B9D11D3536D13A1D81FEF270CF28C865A3 A712709C604BC4FBC0CAE2E90A7B95884BA99B1FA5981842DF03FC73807B4EF3 DC360A17C8708A89403DB289B1146761642FDFB872F3506F86C46438AAAFB6E3 6A4CE3F92015FEBEC36E7E9C7FDF21AA5B101D21E63F62CCFC6B3F90B0020642 B90951EEAA2BF847979B3858A5AD0E93F9544FD5C9266A2B14464B26D65BA06F 8751EB177441B14239F256FA3CDE195E3916860784DE9D46180C362A7F5CAEFA B9E3D2DBB04DACF891CE4EC42371F26B1342ACBE7E799DDC75A9ED8435539234 619372840DD05850B62B6167BEB03FDFF7BC9942FF982CBCEAFA14288F9CE0C9 278D5637B19E8C374FDFBAF930DF8EC791EC0C4A4B6411516E0BF2A96CFC5D30 49E863A84BACB1CF1D1F5BCC8ED135E36D4E754A4DA29C83A5055E92398ED029 40671A96C8A79CB4A453A819A1B32E487AB4B7E4253668B90BFEF4D5136E0B65 FD1611D04C43BDEE61BE6D41E384062A83E0DCBA0AD1BE372AB40828F3345787 087E0EFDCF03224B63CD2B61CF6DD41BA9B9A97DCF809FB86E4B95692D38163B 4AE1A86B90A666A52C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: TeX-cmex7 %!PS-AdobeFont-1.0: TeX-cmex7 001.001 % Filtered by type1fix.pl 0.05 %%EndComments 13 dict dup begin /FontInfo 16 dict dup begin /Copyright (see\040copyright\040of\040original\040TeX\040font) def /FamilyName (TeX\040cmex7) def /FullName (TeX\040cmex7\040Regular) def /ItalicAngle 0 def /Notice (converted\040after\040April\0402001) def /UnderlinePosition -100 def /UnderlineThickness 50 def /Weight (Regular) def /isFixedPitch false def /version (001.001) def end readonly def /FontName /TeX-cmex7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 80 /P put readonly def /FontBBox {-14 -2954 1627 771} readonly def /UniqueID 4314415 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 89DE8BAE4F093966CD2192CE95EB0F323A6BABFDACCFCF27D91F7869A0E46CA5 9AAF6905783E8AC1F3F9875A76F97187738432F8D14E61574CB292FFB9740871 66839799D8CAF6E0DFE00012EE6D46A2B3655F29705BE37FD5EDA1C765AA2CF5 C5AD37207ED1EE9DB82FF31A33307FFA16911406557336AF92F50B603C7BD336 73EC060F68318378A6F599DDADA5A21504CADBA1E1F4B1A22962BA1BB39ADC7B E8CC92F196549457877C9636A8A7EFAC1C3745644C0FD151C70B9FAD69B02C1F FE5ED071CA1CF3D4A70909B6A3986687D8FAD10BAC5D675125453255B130DA8B 19A84F21259FDDFCE6B5D9D58CB0B70FCBBDFD0732C755064FA6F46BF3DC4070 0E7BFCC89B9E47873B613CF218B1A2D47D9A327D068660F347CBE7CA39EBBBDE 7207CBC6ADE81DFB3BE959E791814CD82E280061D269A3CA635A7D15B39BFF94 0720F9C896D691E9A587268F33A545461308CD8DE199B77A8FF7ACB748F8F755 A17BDBB2CDE606CE176877B7A440F33D25A524EECC3FEBE1B7B924947B4C5ABE 520B354D612DB17019A285D2D962C44E45B7693A17797C6B5FB600A0510D2465 8FBE6C50AF243C31DDB08C0B1AACE01D5EF326FECE655C93BEBA27103A77756C 1AA83982BC70D946F41A4E2930F0B4A7F236C5EC4A9A80F12109406076FD1D7D 016F33FB94D769EC8D5539FE4791D87E6E40C20009F7197EEF370ED30B92D5C1 9B1FCB2896008F9DB468495F4B3488906F68AF6244425DC6B7429DEDEE18F08F 6D7612BF5EADF6A2902730E73952C0014B13B66860E2EA6D8F1BC9B082645710 423AE12AEAFF6886576E1D5D59847B57559806B7D08BF7E7A6A8A014F014231A C67B5E28F219E8330A7EEFA59C6FFABBA4D76243F5A4FC1C5D0C5F7DAC42305F 050C19FFC5586D2E252082322CC9C3C2DD63712FB78C5C1BB56AD7117E0FDCB4 83E4F6F83D90F4C3D5AF83FF805D09070ED91CEECAFBA04DF4036EEBE24571C7 2F779C984CDD28FFD8CCB51947DC5AC68973EF8C7BE3A2FB26F72002EAF660F3 90D377B8C240CA62A39126105B2C39224426A95A0BF9D769FD3486B2ED2FAA67 97C06A8A6ADC41CDF27C293581EC1C3FC3B8FC7A783693165C581AC313F346B8 326D6337FD5C77B59F4A9504CF589036474B8BD641F732C1FCD4AA3764C8BB0C FA215C18696AE6923F7285CBA9362520D8730BAA21BC2D64BAEC7847EDC4CE2E 3B2139806A46F9DF7A5B3362CEC7A2F46321F16A050F1ACA52796660F19DE8CD BFE997570C957EA413289F3D3D60FD34291B40312D4562528517949580925F9A 1EA458F32D34EB34F467E97C08077098E5F2232464EF6582AF97A4A6ABF6B3A4 723BEFA84C5CBF07A461783A9BBFA0E087DEB5E4A5AF57E77E91EC951D75458F 7ECD922621CC8C730ECE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY5 %!PS-AdobeFont-1.1: CMSY5 1.0 %%CreationDate: 1991 Aug 15 07:21:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY5) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY5 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{21 -944 1448 791}readonly def /UniqueID 5000815 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFBAF552B11EFFB6A16C F03FB920C15AE724EFDF0CCBF00A838D34440FF9FED532F44036AD22561184C5 283722DDFA7285E62754372D716D704AC0E00B2F6AB67154241C7449AA047833 94CEDB08E8C92907FE72A0B05AE36A7B9226ACD6E7890A0B528FDDE84A950FC6 801DE75CF2E739E9121149CCB8B1C87A106822648D84A3D3FBF295EE6C4BF403 BBE9A1C1F6DAEDD1E642ACC486E609703D7612BFFD10C324F5DC710811F7F614 3691B400E3773987424C0D2B0D8A736873C6371DDB2442F05E018A2B5CA9A4AA 17AABB95D09E5890CFFFED5AC01495D89A53D3C9AD5A9C23D5050E53AD0EDBCB 74CFD3E2297B2A8DF7D4FE91255B64B1A27882D0E91114C042D0F291AECB4EAB AC972162377FF50153BD28D6BBCFB47331F80F948DB61A4D3554AE1391DF574E 7DAD8619F30B83165A7B3DF5E3A5EC1812AC21480F2E5285915280E1D34678DD F11B5A85E07FA63812E79746BCE02AE950E164D58B92574BB42BB2268A8DCF8F 03B40D6A4B1DF2F179476CF4D7EB8581099F2DC541EE432990951319E9BD6E64 5880F5DC39E70D7200068DA5D3A1FC96579F88E74BFB3E2C160CDFF54A2E8E8A 512E1A8AE52282194DC4DDFBC59BA1B51C8F29A486538F49E261C9E375E1B475 9D42110B21023349350085E073F5DC0432997E5042C9C2F335B37E75C970C2E7 A64EA0B7EF9FF9E995FE06A7898874D7851142031185AAC027541535713691BC FC7B5E42A148F7792F24CFF86C1152664A8E9BD90C6CAC051EE65E8E6E32B8A7 FEA099F2EAFD5411BCEE6ADDE3B55A873EB3304812EF74B2B339 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: MSBM7 %!PS-AdobeFont-1.1: MSBM7 2.1 %%CreationDate: 1992 Oct 17 08:30:50 % Math Symbol fonts were designed by the American Mathematical Society. % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (2.1) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (MSBM7) readonly def /FamilyName (Euler) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /MSBM7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 81 /Q put readonly def /FontBBox{0 -504 2615 1004}readonly def /UniqueID 5032014 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D 1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 D10F04E2CB7C8461B10646CD63AFEB7608468CA0FCFC4D3458FB43D22879B515 27DD9CCF44C2BFCD95A4DE911E4915FBC02335E9999FD9B546134081D6DA3792 EC4A76DEBA77635BE52E09986268A919CB48B5EFB1A1301EE0683CB5709BC8CE D819D799020CBA673BA39C911075501395B1FD20EAD392C9D5A8C9FD1198C737 D1A614CF0C0432F29DDEB4BF9DB026908DBE89EE522B7D55DE9BF64AFBE6248E 2E10466655EB9083E7D23E3F0EE26154F191BEBC9987930CD4B4CABE1275BDF9 8755EF3D531FDF91D54954FC53F15A38D1E8F8D1E36447484FA2C09D34813615 838B6330FEAE536D08376E4A0FDDF58CDF5647C9F1FF3A7D1ACAD376DB3CADB6 9459F7A5D4F1864863B79E9F93A1EDE8B99C3138D26227C01F6FE0AAC800F2E5 94DD81CF7B1355B642CE45CB532FC5B535D66EDFFEA076C009E87406D9772D71 848C3C53B7496A5D6B58679EF11E114C5F457C6A0D3CDE50278E4A89D5393B1C F877CF4E2142A4D045C4AA9138105D748903BACC28FD43DFEDB341E1FCDBE2EA D412498FBB5374D6836CFBEB13D4C2B7B9625C25B037FDA9DCC42F5679C4B3C1 6340E341F73A9215092C0ACC505A859FA935BE5172F4F6D4A30E73914DBD5297 7FE0CEB5CD0B92176B8174870F9FAFD22BD2ADDE02B5705B5FAFDEE372F17857 40C1B4024C9F04375B9CF997E9D0C0F7D82465D678BB9810016E6BCC9C4374EA 6B2CC834894FDCA891643D9417369458A630FD498794823FFA55705315F0687E 7592A5DFC8B8D6FE2F3C64B4A4F9D37F5F2200BAA277F2E0BA8E5A849FDF55F2 AEED6EAC75DD022CB0A85FAC8288B173C8C8C79A8922AEEE32251DFCEFC667D4 E1A2EFC8B27CC5FE79BE99BCE7316A62325F915C703DD7AEF86CDA8E4838243A 6106454F1F0A58139FF3A76F33B11562302666ADE14F30C4334E22F21A3DBD56 1E138F04F7689D777408F39CBB0B5460404348735D2A8B4CC908D13D2B546B88 00F7FB8725F504A014A12B9024F9EB18187DDCF812A5B0B6884CB58284393137 9E723011893FAA1A71DAECC6EF6C1231AE4E301125FE779866D92A027C6221F8 15FB1062672FD1ED587F89061A77A2EB383562CF8F3ABCE31CA45B4AE9A8E062 56C2535B8FE203ABC793A80A5FCDA8022C4211F7F863C2384D25D3B3D0EB4C91 184C4B9B27F5AC8501A3F012F87108C36979D0F47DC1548AA170F9F1E32C7837 F1E1DB1D084EF5372EAC55845096DA222C29D6C8853471022172BE42566A4D48 06FB44DAE7BE12FFA210D50C71C189B155449C4DA407BA0B5B319FD5B1BD69B0 9A10E8BBA9C504616795F814242B346867A7E11F15DF820143D549336A7AE005 209A4B840AF93E7AC468A3D1EC1918C85ACA08010A7CFBAC538ED6DBC4EFA968 608771E1DA0058D461A50DF4D8 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI6 %!PS-AdobeFont-1.1: CMMI6 1.100 %%CreationDate: 1996 Jul 23 07:53:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{11 -250 1241 750}readonly def /UniqueID 5087381 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC 4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E 6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F 3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF 9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 0797B87C709E3C151EB44E478CA576D257DF226C00BEC7E7C367F9F0CC740674 94669D512B172694846EFC49E854D31F779A25CA3DFD01989A3B85B4F487C3DA 2347DCC885FB17A5644325B36F6390D19E25711017E5E38CDB90927446190649 ED63C2EED047AC1C5C1F210F742D6C3F2E9CCA00B6F3E01A281DC72B05ED8E1D 7E3FCA1B208E567633C052AD4FB6A890C199AC991DAEB749B856B3AFEDC853F1 983DE86982126BAEE7E028A0880D3D9076104D892937BC47942DC64977DFF489 DE28CB2CDC0A20A8AA124471FED76DF58E1C76E5CBA320841B9A92153FBFCB47 EB2952D76AEA0027D2361264197E47D5C1E180EDD421AEE6055B2A351E520F97 A3CDBD2BF52EBC2763776205A44BBA0D2F9D5E32E7BB9DD06F4BB3189BA066E1 82B2799039ED171E512EC482164F23E9AA5CE8164C5822D2F72DE4A201C87E2C 2EF7974332FE505C48BB2D6D8D6CB774BBA6C784F803B69DA71464634D2BA45D 1DEBC3FF0300288F74FFF85FEA59F972E93114F651CF3A3AF93F45AFC9549A58 B0CB86E34601E065E1ED5E23FB4733EC2D3C79D2C18EAD9F35D340BCA8F131BB 330E1868A05303665580E8946C3D6A2E2ADC36A69530D971697DA8ED155818AC 16E3DEE6968891225D5E0DD0363A941D20B76CFC6A4531D02110290578D4D118 3475AC1644257BFA84AF546324F3AEA5043D7171D4C251CC8CFF 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.1: CMTT10 1.00B %%CreationDate: 1992 Apr 26 10:42:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-4 -235 731 800}readonly def /UniqueID 5000832 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 BA304FA879392EE0BCC1A80AF17EE772379043D7770D31048E32AF7261E1DC0F 2DB1FF1313F744C7DEB820AF71C602B26191B61BEC3EBD0150816A1C09D66D07 8E478A10BA82974856D3100372E056CD154DCB4F4B0B831D27C7250D6CF29DC6 0C5F34CF57851ABDE24AABF78E78368115A0BDFDDF66CDC5D473AE15997CDFF5 E482A55050B3F35D6D01761DCDA88AED9D5E2C2985D55EFD6E89E70322C72CB2 6CEC6AA0A9196E604BAE56032E6B45D0B3327DECC621D95692741250770685FC 5EECBE80F4F0307AC6A1696E4EF84A74992B541C44C3092FBC68C718702C35B6 334C7A02522F5B039EFC02996FD9F97B621F174AB176D508B97C489CD79E6739 4AEC64377457821CDB3B15AA06EF3FE1D3060095F72715128053E9B14A055D9F 688B1F4DAF4E89C36AC72560140421800FFBFCF4372B123AB0E9EEF114F60F85 935BDBDDA3362A11E0BF7854BF4BBC41209BF77FCCB5ABDC05E978BFAE410EAD 0B667DB403498A3906733A92966C2F11E260A5524656A9A65BCE0F492497BACB 4DB51595758AFDC9C644CC5BF05C17E5FDB9A55FF38EE51356B2B3C5476FB0F6 76D6D59C6EAD4829EF58F68E50A38FA5BDF05D07C4291C778AF20AC0AAA4B084 C25C9D4F03D038DAFC2F77C101780A1DD8CE08BC9CFD4C466847FEAEE0AEB82A DD7DB751EC8C146E17EAAFC942F80C2313118CD8075620330912C3096974CD5B 1B05957074DA4CE593475ECC1140D481213BF1E9E3F318B496AC776043129AB2 7BB61B4A077FADD338C2A01580D84E0135EED3A5D7B47F2FF82DE2060102D12C 16BE43A0786A9DEBB83AD68F33395EB773DDACFEE7878C8F61A5425FCACE8B82 47AC1F598A528B87AD63479EEEE6A142DF63322B7F383B0BA70C72D1ABC8D022 052863F9D197D1CC167624F697609EC9E125A9060656F0392AFD6AAAD2804632 21F975BFA160DAD81AFF0C9D71E7E6E325DD1F7A7B380920D2B416EE2F966701 41911CD281F31397CC6DDD1C4ED4E3AF130D64A0B87A6983AF6C32E8CD4DABA1 282565308ACED3D3338A777E1DEEC16CCA02C328560923A7FE23A1ADA08E31C3 D38D4487A6193C3584047B0F11D74AD58B012A163019CB8ED5B82DDD607A69D6 00CCEC42ABA8C1B880BCEE75124BB5BC968CC504BE0145F20D06D075D8EEE6FA AD0C0EFA3EDF73C6BA35E7B7260257E6AB93ED5F7CB900493A22E052E761B45E AD764BF23FC6C6685E770A86FA9289CB10E87198D3C4DEEACCD70E9D18D16F31 78B0A25A2891B04DE6693E1A448404CF5FFFE8F81F9EE39D2099F8077DA7E16E F8462E7B74089333A1C1616A88C1E5DB628283BFF33ECC64E199FF776DBFE127 ED6F229F55B30E8B3EA56F25972722F818F27D3120B1F2EE96B1515CFCB53B55 3FADCE6F30A38B9DBBB38CBC8103244D8CB78FC9627E2C43999D718D53F2ADBA 6ECE34758114E89D32DE99F87FB7E0823679193CA33EE5295343236FEB6FA064 F8D18042F64A0BF150B0BE07902EFD4A759303EEA66E77635C66D07E6AA0BDE1 304551EA493B65854DE98E6059C004B9B7CFEB3917A97577C8EB419DF41AEE5B BB3383D149994F52CD15EF874641408C84D510CA3F48B0A1B656EBA850E7BE9E CE5E20EC55A99218D9CD548261C446004AC6E37B31802AA5A9C546CCC14C9D3E D07EDB69B9F5EAA37FB185270A4B9B82A5A476D1704A37093175539480345172 4FFBA9688EE132441F4EE24E72945AC89EB3883D5A0D6A7940C6E3ECD342B5BA 3AB5397E63F0036E6F6967B74445F60538082E167BC0969D52D786D974070890 D903332C24EACFAF8B8AA6281D8C722804339FB554A6BD9562BD226BEC79DE12 E685CD5D422DB2978079E8E9EA17D073C14952D7AB732CCFDC2AC0D7ACC382B5 1DCA16A0786F4444380CABB50A70A0B51136027F1AAC4230DAC4952894FEA84A ADD78CF0F724344704A5A9A31563BBDF3F1F2C1475F355728EA30ECE01F623F4 D49CB1DCDAFE957F503EA9942B74B5BF72253AE49CDD7E3206BAB411DF0947C8 337273B3C5C38D036D1767822303D154DFFB277ADCF37750949709B2EE3EE714 8A8DE90C079CF9D0B69A4EBBE24AB596360E0F3DC190547F5F86629B1425ED23 5D83559A4EC0549CBF9B8EADE53C346BB39BAF023DC32179D21B167A44E9EB98 442BC882931A2998877BF92DB63C8AFED238A1F41C85155615CFCA04F3B022B4 CB954A3A52A602A85BB16BA94A059654792168D4D8CFA1753FF2732D6306FDBC 59C8E658B50F018BADBA01A9E9BABA6F87FBA5A2E9C3218517630C9F11A48930 D725063AACA6F50AA1DFCE96A271B4D646326A258576F23DC6B358DB16854A3A E0F031BBC2920BF96A7224BADA7FE93BEFA5C2541984D423B4E83E7E32428AE5 E0857D1C0DC8DA2BB085BFE2F6BD877F102F77D4211A6334BD3028AD6EF37D4B 7C77AE061F830DBDE54B3B9A85D0C0AF862F7A801C1E542F10279216F1FEAB8C 0F3B25846203A46018AE6C2AF6935A4683CE269FC382A17B5ACC6E1293F4A6FE 33309790FC717289AB894D215CF17227146587CE2A99B6B0414F2C055EA92AC0 97BBFB915D63978AAFE03BCDF52D52F2B9E8F8F632FEB0E8D5B794E06143A32A 56A57ABE1BBE45669309316A9E5D2BC6616B52592B6D6E62B28C08A91580FAFF CB7DDAFC29317C17DD9BF1FE081CDD967D842082A47137BBE0B8004A1D328CBC 5B4BC9E3B428923D4B837B867839CEA4F4081BD66C0604D7CC0C7AE5E2118827 A2FAB86FA1794C51ED3AD1E6B38CFDC303F81E0EEA358BD245211D00E7E7FAF6 0F5340D96766ACD54E80F417974ED6E0E23D49BEC4928FE2BA4DC8C8EEBB358C 96900D5B563D3F3232D6B20ED70D08D2B666832FFA105DD647D60951999DE843 22E24153801BC97BD18125DF1465F30DC233AAAF43747CD3028196E27E9AA865 7E4FD99075F563A7C422A6F949BD2FBF9B3481EA3522BD27F47CE1BDD115C83E A9EC8C9F62ECC91DCB5719ED38D9CCA18D6B54D8F96B2CB61B60C17CE05B76C0 453DA208A7F2533F4B2896BB954BB2567AD963BB994FD18B898CF8DF8911A062 AB09A45795468F7BFE1000B2669B983B08EFD93A61C935C18A470D123973ADFC CC425B5EBE2D15804D1BFFC6E34CB4BEFBF0FF53404356EAB6FE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY7 %!PS-AdobeFont-1.1: CMSY7 1.0 %%CreationDate: 1991 Aug 15 07:21:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-15 -951 1252 782}readonly def /UniqueID 5000817 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 868AEA25DA3D5413467B76D2F02F8097D2841D1AB6F1C3098739FC97CC45BD0C 78233B41CEDF70BDBE0991FCEF86726B5074C9E2F279E5BB5CAD3199FD60A7AB 5EAC8BC693564BFE10D24AA3B36473D6631F0CB4A2A1371578EC492127D41847 4BBC1173AC5549AE0B57BD65D982CB22F7AF277C8A9F7C0717555D3626E21407 177374183180ED1D4130019AE26000335947A3C4F18980DFBC41781388D651CD F8BBBA4B5F971CD59ED3185F6487C12BA040FBF4EF09B294EF7A5CF2E14EA12C F5314721E3F64F0B17EFF49A4883BFE08F3500377FC7531EB2649F4323FFC6E2 65CACA7D23B0148E390561F4270E12C90FC56663D690FC86178248A55A38B2A4 72A89ED8FE50341604060BC8E69A9798F3DFDC8CA27EC4B03601FCE62309436E B3B815343EFEB12BED78FA27D88B98604AC9D0D5E4007072B85979F9DECDD951 331A92BDC6C6BBD80C1876C1E995B03DD5033BB820B598F7EA6567B3F0F3909E 257E3D007F430788D33C12B5B54FEB67AAE6D34B83549ADCB7B1056F35E146F3 5D596955BFC56B506C3ACBBAF078ADFC662007C42BB37AA06D18C08A2818AD08 3EEFD7065D841C43F12878BABCAE51E5DF033298C48566303AAD8B8FCA4679AC 5815D077A70D94A9BEB33D05461DD385E7049966F168EBEA2EC8364BC1623CC0 32F7B9DE0BE469224661F35385494328D035C6851484B96BBA39070FD378BC02 1940395B6E5EC2486EA5CF9025E8D82CF7975E6059306ED110E17C7103917C92 E4F8D45EC4024E89509144A0C2E42E30B8E4CE1B22E2109A0ED7F9CE2B64E66E CE34A881AA547E4B6DE3DFF9B3992E99C711FDD8060A8990672833BFCEE6DAA9 B968E3D7F73249DF2A8B9BF90E101E4F49B98A5637E67306FB57CBF05A7AC209 9A7C72C6C1BD06679780CF9F2FF4AE0D38E4A2B4BFF1D5991D3D19CBEE25CF28 3323774B2189D18045E7EDC06E03F0B820D8334EBAF33E1F4200667D9A802A85 7626EC43E87EC4EC87F042F1291114895B5E3EBD918CD88D4B993D7283E1C862 CAE8C6629609C04E1637967FFD9CD920EBD8C991B2B8DD2F0BADE48B9C49E8A7 8FBE8EEADC42E4A0FC5EB3A0EDCDB50D3E1B300827E691525C14A7E4C206AD41 BF26B1221F4EA813DBEFDF03D6DF0AE3A6AAC7D36D52CD32A8C3387956B33DE4 DD77C80DCE784B8A6C06B5BD2D7021A8CD1CC9819056CD4F6E1C3A6269B2020F 708085485FB78E35BB9A5AC2292A9BD04C75EC33C6119A3DE57394ACDD06BDC1 B635F8217E87F9D969B93F455F3F8DDE181388E27920C9AC5EE23674D6EF3618 17814B4D55E0BB9FFE568323EDCBF473BF1E2B30398B9967A9685AA30A723F82 C948BB29FB15DFB8B657F2416FFE1D0245EC46B5CC8F4BA7771A18A87DD6AD18 B2A6B0267B199DBDBA0ED801B4E8C60DE54C0432CBFFE6894764A1FBD925BE1B EE309482F27BA25B3F71727897A0254541A3BAD8E96912C99C4D1B51B3E2CC79 9CDF89E177D7D01598D0E389B6A8B8415891EB43989B21FBAE9FC54C0A2EF22A 6DD47096BE9A4ECF1DC4BDC2E1923FB390C02D8E194254D2E7B5A41137B4E963 C62F7E22A74799089EDF608A673A80A3C18EE4798A1D1DB74994BA9C3BC0FBAD 2488B27817CF0586EB08EB8BA13C270221CA39E119A5F61FC20C13EF0A467905 8B6E117463A7D326F3EF364C9B36622E3DB55A17540914E58BDC54E676C81EA0 2F04EB12FD42FB76763737A34E2C1E79EEEEDE734C478FBBEF66D7D8B561A69D DF8E0FFF0AA3423B739EDE85F297E208FF0F6CF7B6F4B92F7EB2F225CC8389C2 0F2EC2E3DEB9885B23D1E029D228EC52A4931ABFD1CF01D8E4C696693A39B16D 051CFDB4D9429561D8B72AAFDBA2ABAE008C36E7709638F431B50CC85D11E27C 1EBDCF45A1AB76D6C46F16F9AF72CE18007504BFE2150A4EB8011CC6BD1EF4D5 DEF1353736491F9330ED8A837CC5E3F79E90D6C2576B974BF02EB0B63E749F65 DE833D69C6AD6BFE90CD6875287A7C4883CD425E60F5C9D456F1A1AD3C1B75E6 61BC09E98BF97253F65949D58445C67E05F6AB7BF5C2DD250A4A021C6FE0E52A FF9C24845072B70600C21E96E10122D12F5A888FC4B7CF69E34F9D82F7637BC9 DF3499BCFF67B0CA1B208F23852C6F52CEEBBD3E0DCBE70F1E60A64D50F40B20 087F83678DFB09464D19AB6B9F0528E70FA9F783B08445A26DA67AEE01E8D374 95C87E78385F93B0A50761ED2CD84F33733AC33B41AFB5FAE4A10ED64FD4188E 6DB62EAE337D2F1FFA6CF207E15EC760D269D1AAF234C2F0DD0E91C9A2EEBB28 585EC1AC83A7C8D53D183EC3D8E29942F5663B142B8C4D637446B1E73C834DC3 49DD52B70E76DB79D0DF576F62540C3840CFBF3059537B1D6508632AF7446E36 B8E43AE2E1DD24DD0F3CE65FEC30206CC5B254B85BFE6CAD11315F9B329A288E 62D934F7BD3E18779C48B0A51E10227CC54DB029AAB89C6C55E18D9E995C565A F9F2B2CAACD6808E10D944B1D728D1410DF513B52F8CC840C5EA932D3F11B365 0DD4691E9A3E33B0FF3319E7BDFC124C4BA8ACB89F165D4F8F2E674429F4C5AD C87C1B6B1F4F43B738D884ECFCCC4A8C0CD1ED03AD92540044925FFFA607D9A9 2801AF94190B7D7F11D14160650B98C2B6B1CE233C95CFA3D091365252A89746 F126F134A015A9CC5586C8E98EB336C16B2CFC6D7FD5A4C7336B767CBBE815BF EC85BFA6818713AED01E172D3DDBA6E51BC8E6B88F9F799E95C1BFEB257789B6 BA9D9CBA8A6E22A53BD72281576A1A98B94D3A29F9373393B5148407ACE18EBB 6C6C0A1C47C2D1ECB4EA516AB77F124DBB892A8330794F7D9F4CDF01865905C1 C25150BDE185023498904AE81177064F8BC82199C6F94191CDB9DAA14D1C1173 5968CF92EF62DE2D45C969B585830A6C3CD2957C849785FFF5970CED19492233 12D7D7F77A66EF4B0351ADF14908AE2D24E7D9E6DA1A2CDC497FC4FB3F96841A 6F224003F1D72B12D8B97905CDF3DDC1E916F5ED5605A80BB019EC138953D197 72D99A5CB1DDBB012672EA9EFD294653ED7DD06F87340B819988ADE18C6BAB27 0D05BF0942BC90C3D00D872F28F797C8F26D81FF2FDA57FAE55E8CC841867B8F 07B900950B09788DDFD27202A453EF0559A0A3C023754B45EB9EBA92A71E8608 70EE8AA5C57AD7008D1B622C81885DA6C8509CE53179FCFEA3F035686567346A D2CC2DB9F0A5D4C5760D103189F2607FEC98258A03E6815873C55DAE1C483AD6 3B797A0B4356205F9BBAE90806E30BC03DE8F205287D58430887CD 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMEX10 %!PS-AdobeFont-1.1: CMEX10 1.00 %%CreationDate: 1992 Jul 23 21:22:48 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMEX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMEX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /parenleftbig put dup 1 /parenrightbig put dup 2 /bracketleftbig put dup 3 /bracketrightbig put dup 8 /braceleftbig put dup 9 /bracerightbig put dup 16 /parenleftBig put dup 17 /parenrightBig put dup 19 /parenrightbigg put dup 20 /bracketleftbigg put dup 21 /bracketrightbigg put dup 32 /parenleftBigg put dup 33 /parenrightBigg put dup 34 /bracketleftBigg put dup 35 /bracketrightBigg put dup 56 /bracelefttp put dup 58 /braceleftbt put dup 60 /braceleftmid put dup 62 /braceex put dup 80 /summationtext put dup 81 /producttext put dup 82 /integraltext put dup 88 /summationdisplay put dup 89 /productdisplay put dup 90 /integraldisplay put dup 101 /tildewide put dup 104 /bracketleftBig put dup 105 /bracketrightBig put readonly def /FontBBox{-24 -2960 1454 772}readonly def /UniqueID 5000774 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C 6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 DD4DD1C1C82180F9A43EE59C8E9063DE0AFAA2044912C7C48BBEB4B6B7E8AB2E 17C68922DDAE2D64A356B30A532C91D441D5F527B4B560AA0F78D6F350ECEBCE 079D592958A88A7A0DFDADA7654A1ADF90EC08594CCC82F87DC1CD177755A799 519563BA0639561A0FF76F0CCCCC782F5B40309C5152F1401E16341551745E75 12CF07D2FB77D7DF390876C31E1D6FE167A20B10579CE3AE1AC6C53DEDABF758 7ACA42A286B5EDAFCE9792A14B78DD935F1DEDB878491EBB84D8082029FF385A CE8ECD893073883DC75502653BD3DCBEF6D94822597CF5243161EF560B6EDFC8 9AA4BEB804331E4CEB3BDA43AF00C482485EFDFB4F125038115BF140FB645A25 400341E7B304E4E581F4DE48FA59A8E5B1FE64DB6463AFBB053051C7FE64F101 1E84299A672E16C642B3926903DFD932223BC040713E03AC90515B6D871AC2E1 70E3112DDBA026E56EA49154708075C42D778C600E9F4D97D5EFAE2A49BCC396 099295EC06F80B81AF6E7D6FFE4E6732CD72C399F166B853A4179A1B7B976910 ABD4199026435ECABB05B6CD7468CB706C371AE4A5BCD46ACF9655719A2CC694 97DDA11E1730A230B38FAD1A410C52C9EF22AFD1FFC7C71AE0A6A1C0F144B267 1D9AE8DB50994467244E4A32C78CF947191701722036A721A43B7B2AC062702D 7BA7F693C600A43271AFF0CA334F72096F9609241715795DEFBBF77C6C12D08F 40A6105E064B62D38B352537035239D0C602BEFB91121A3A374D577097EA6D2A F2DCC00ACC411EBF4D8FA54C316EE84EDE6C1D487EFA1F719DD09439A91E360D BE9268F8302230904C8E685D71DB8130EC0AE92257B8696813AB5A5C5AE9FE56 570F15D138811D010D6CA50D5F601EFB74B9B67FD93E14272F0BFF1E82037FF9 EF308651C4348DF639EF067E90D2B1FCCB5EAB817519CADCB92A860F99D1AB0C 8089DD8F4F7998BEB8D77C28E09AA941DA9568173DFA9E8AF5387F0F23C0966B 1545790181E10AC8D095824D9465C804C3AEAD48A25F3D4A9426E8A0D3FCF60A 0888E7257D77D5D133D3BE1BE7EE8C965D5FFFE7BF1E836CC242BC3A181F98B8 BEE9CA461A282A3A3E789BC69469E81DFF68641F83D29EB91CDF36B227C7AFCD 0BB82886B8961C7B96EAF25B77BCBED86D9660AC8DD4A88FEFF8D4F9759CBE1B E8900DB382B8CB863E0667C105A4D1B3D07FAFAF6E2E345417F884BFC3C2CDB7 6043A2744EEA8D631CB4FF748A70F4F1B44B404403696ECE990BEF83C9EE5AA6 CED7BFDDB75F88D87C480FFB65B1F32ED83810A50E308ACCC1215291C39AD1DF E0696FCCF653A62FD1B0C004E6008B1709063A451C7F928D39F8AC46FF4493BB 340EBDC6F137FD12B7894088919C76DFB1F54071B296D1347DC288BB14843767 5EE34B5C99BE951C2007C473329B24AE6EEC05EF633239D8D875128C4C2EBAA6 FD4EBB5773D6E032985E66D032B2CA584011B54B333480F12F0F56EC0E13F026 C69FCDF2EAAD2163C71A39001E0B9DADDAD7972D7A18556D000EAED274E2CD01 10AEDAF1B698998625B723B0928748BE57E48D91D0AE37BC0837F102B371C652 C93174B2E61FC0EE0717D6FE45CE72C44B7CAF369AE876FDF1FE1E9023A11914 AAE4F53492B705A8867B4F5547A087E1FD51C073135685F248E73029E0E210E6 A2BFB05E7088B730CE07EAA0D4A7D1CBE16001E9DC6987F06A17CF1D7CE28740 82679FAC53FCD15D62146B040091018811BAD172D9D694AA4A2419072F065368 460005317F9F39BFD3BEC561B9EC26514DC3E484D364885C460BCD50EA4DBA63 F3614C54D847F974A38FAB53AE1F3B96E1316C7C4F3C9005EF3C1AA420BB91EF E51B5E0D6D0C69804A3527AFFE33B484C4E48C96CB0A11A069F32596C0848682 8B2373947ACC2463C6D747257DCEDBC1294C563F4B37F38E5856F2EACA4D8279 93BD360E3A72C263C93DE5600626F8E546DF2BFF7911F5B88FBE96662DFFBF1C D82D13CCAB77D9DC25029DD340CB97A823614A88901581998EFA7DBD8FBFB02E 511E6FAC58CAA3A90BB61F6B7ADA357CA1EF81C71BED2E10B154B061DFD7BB81 25D9B15EE611C65A3AF622B59562E82869B26CA0F51426D37FE6CA36B7BF5A77 CE9CB396ACE48261CA69797477CAE9CCEDECF118BB6C2ABF29A805C58B1DE19D A853CFCF3E7AF163960AAA9147DC30F66556F3E11D449C002D6F8C115C344241 2B70A6FECD534B234BBC0F4E0DB4FEBFF04033927D12AAD6104C99A60A83EFC4 8BB39E21AAAC921B4D6AB1185894CD0B5FCEC39F5036E3AEEE987AC593E9A85E 8D2D905F0D127E96B37EEFD6B3D262AB3B92CB3D511C079FE9CB40D0CFFEFD8C F416A45B1D8F6C051D67B533595BBFD88107CAD4FEB53B66E6BC9ACF4181BF62 6BD3EAFC8792BC94A6CD92B2611718A2A2D469ABAB0C265CD616487C20BA2296 C3917FBFA267B07D37490F103B6FCA83454868CF03E1667CD7EAD944898AF9E2 A4D325360589046D4735574998FE13C36F7B017E9767263723EE4AEADCDF81C4 25407EFCB08A470310D0032F28BB7B565C03422BF89C37CABA73E1DAF3052CD5 81B7B7FF115DF51D0AC86151E821536C0570029070EEF25F3C7B0544B5EAFA86 048CB4B93B9C67FF74464EACF883985E8B56B90D000D68664B7D2C90502838DC 3B368D4DD189EBF0B82E4D40D23822E22C50D53F8F2FE9BFAA325D739A8E88B1 2D0995E739E7588F27629CA0305C8332EB41B392E98EA59D5ECDC9E54DC3B9B8 4C0BC580173F0CB7B5529B61FD1A216A7847EA5D94F42C0616FBDF7DBC6B6850 3A66F3EBFDCEF7FC21176BEE470CABD91941CB43D638C260ABC545751CA784EB B63524AC9EAD3D5119A7D49DF53B200DBAF18990748DE451C83E651D9249BF0E 8ED23C1D1991EDC977CF7BBFF92AAFB8DAE73373179682AED9DC6276CA0E6587 71896EF6B0A1549F305F0A1EE38160E095C468E699A6B0121103319DB132D993 7596A722678B0840E9E804DB8C3AE80616289C46E973E2F212B2F8863C729898 BC0568A50A3EDFF91F107AEB8733C0568B092B978A5FE4A5EE300A92A041C4E8 DF9E9D15606FB31FFE8178E5FDE4FE199AD1EE077669B198934FCBAEF9287537 DAC3328B19EB8CEB76522DF89E9ED6A1C57CE02AC12211BDD791B5803E2D10A7 28659822EE272D6A3550A033E0FBA748DD381C65B92C4A1AF1693A61CA03CDA8 E3F83902B32B6E279C91007ABD5A939EFF3C2D73D8FBFD68558C1AD85246D92A 5C520E30A3EDF4F77483900AE7E0DC7B311A4CCA627C2B934835310ED9DF65FC 0099FFD69F0E64A5612ED810A09B2D32F2A927377DC7FB7EF63F08093EC6DA57 317D16633483AFBC056F2F3DA87A1DA1A09BC4FDC0D373853A352023F127378F 12D59D50CEED592286485034F589BD7333F2210987F2F2E82157944DDF873DED 288367199AA47D14B5B61CD9CFB1C14ABF09133C939424E018A5D6C6DBB75EE5 45050CC161D934A07614F708FA9E4EA825232EE453C509DFB0F99258A36048D8 F22E8B3A3140DF8F2BFBB11591A347C8DB02E5A6B9A4D318F8A95F15BE2C8091 BA6DA94388F81E83FB102C57555A81FC45811B8E0A130DAC973EF154EDB87597 22257123AF03DEA7FF20C6E9BE4663397296156E5D483BC815315E9E4211B38F 828936414822C8C5F6068B467BECEFC567BEC1262228B92ED8637AF7AE39A761 2552BE4E1B03DE86D7EA279C0118EEC48AF47B5920D8789AF801D8115C1844B1 E218470454132E5C110DB96303C7123996918D91A32FE6B33FC73302F9288A31 09600836152CDB6CAF9781B4629AE35B5F6E7CA84A6539B7DE6D257B461C47E2 DBF7D87DCCDB6EC6EB6939929B71A0DA722576970552E8C6F3950EFC2FC16679 93C07D6B649ED55AB525399E5AE0C0A5E7C0E81C2B6EE25D95383DCC0D095740 67F20D82218F4F9D720D2ABE3627FAB96017D8CFEC5BD83D106F4D82ADADFCDD 258DE972309527364405CB1146CFCBFB04CE2A4C25C22D4B918F785238DA2127 BFA7254A1FE38561695B4541B173C657F1596311EEE82FB7A26DC75D817C2AF1 30E9BB8132E0692E8E81AD320DA6E1F1544CD490989725E8D7A47298FFC963BA 78A0D3B790A7A1332BFE2D85E7721E3FCCC06AB3F5846C83CD73B1A41A8A4500 0929EE9B7E3C72FE4FFFC31191B3E1BF289F991748691567CC893709AC1E1C34 ECE333CA381D7734CC41362A4DAD18002AAEB086E116C08AADBFAD8E1FA91E05 29478D9B187042344015A08AE86BA225C322E9310264C0DAA53837CF31540DE5 758EB7E171C5D871727068A86FFFF768BEF1048FA449DCB0FD3651612DE9234A 26982C120FDFBF828894C9AC6317E950915CD240B772463CAD979DBF90C28F6F CF005BEF7BF9CFF44393BFFAE0B68DB5848B62A629B9D66893B92304B2FB2E45 32ABFF758715880EBF1B3E3556D2C147B7ABA1BB66FBAF942E1B2AB54B3EFD0E 038C624DBD869A1F35F1456D57F0B805F024B2DA35BABB7AC8F697427CD0A6F7 B6BA728B3F8A2A6D1D8330BF1CF88DE3D267AD26CD5A3A049D6054F2DBCE0AAD 12C269F833CED66F281AD5F3E4257BC66DFE419D27FC29313062F8B9AF24F173 8F9E5F09E3836E3BB1BBF3B6AF4958FDA88D945B683CC68CDD0D0A28DCCA3D5E 618CC148966953782064C11B855213FDF5E3D56E3BCD173FBDE7B3398D03347F 737E51819F21F27A7CFBDDEA061F4C5C814E6C9969EB9CED04BF79EE4325FBBE 26984D890732C2810125E046D5C0D1108CA8D3A58686B2559DFD31DD8F540EF6 6491C40221BAF3D132113F2823692C848ABF3C9E0C2D1242E8A5FDD1B1995DBB 834CEB77B985B7EE7015878C5AC9B32D889DFC6DC9788DE0C9065E765472C039 95CD7EEAA7F18B98B8A3E8872CCFF1E16234B5182B28055EB5AED88A2D3FD243 798FEE9783DD407B2D96C519235DF6D6BE044860EFCABED261D485DECC6EB896 5D57F5C3D00FCA1E15C6879B49C5C50E592AA844F7E79EE98F514CB9A32555CF AD854243AB26A92ACAF490DF5D5EC0DB8AE6A0A257F6F2119C404B23008008A7 36CC47E5426B3EF4FB33F4F7CEF7A36AFF8219E655662A9E265F3F39222BDA55 A05E4B225C3C2BB9CB60200D0707D5811DCDD4BFAF6A25C9895010377A8A1A90 B619D601B2EEA35AAC3D646BC407B6C7F7A17E6161E06BF99C325AF72B02CC3F A1071E3F2BAB0920D53B0CF97FEEA3D7AE439A4C60C77FE4C1CA2C286454C082 0173A44AE41C46E1CD1EC83C0719015A544CB5EF0507DED2A654F4794C8072E4 D2C8B179179B615F86F33C226B3C4F4539989909B3A29E032BEA3613A6F2D3CF 785CA0E34F7EA37075692B91F9C50878BC41A22AA2C2EA3D6C0A1BE049B4BB8B 8F52825D646C797D7DB21A1600FADBBAA071658DA7A3653EC58C6D9C1FC6C79C DF0EFFD4E654A9A7D760917527EBE7BFD70B431D5CC511ED044E23480FFD4CED 408A0E550C063C8FBCCC404CF829D296B58BA85ED8684869D28FFA121D6593B7 88AF03D4A88758FDEE8F59A54462F3275882668E26BCBA764A8CF05D1666F7BF C4E37FB3D501738617C1F40E43E4B9DC019D4BC7446E98911F02EB679DC38AEE D14ADBA568178921B1D9794DA6C5084328A21A82C4EF1656 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-29 -960 1116 775}readonly def /UniqueID 5000820 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57037078E6B59BD7A2C35420557FC465C B2C852522A5E33F7A19A2B9F3E07BFCD06728523F0FAB87AFF5CC7E3A75EB7AD 0C263DE68DD71164836DFD3ECCA56B1ACE427099BF78A7D98692D1E75C237A92 9B419F9F0E4E7DD1887AAFA6AD6239960B4430058E06FC8E190E9B5E98CA7A63 FCA8D225895E0E1C3F668EF2AB8449E54CC0142806F5F84B2F290E0B231E1E96 44E1AAD1CD6EB6DB03B63881B9BB1B076FBDA758F2D3B3F70FD120B02EABE0D6 2F63889F1246C3BD3AFA8CD08FE5251AC35EC5D7A24CC87B0FF40E9393B53BB7 B4DB2FAA0E1F46C6A2F30FB458156A64A9C697224CE62E93DFE8482E943A08E2 0F2284C42C1EC73E8D79E569CD787A268C70993D9FE8745C6FE3B214354CC409 95AC93E19E1EA5E77D90B7EDA5C506F08CC905EFE5160AEA4457DD88A608B293 62130B96D278AEDFD57BE8A43E56E69CFFB5BA0C1F3CB1016C9FFD0881ADDF5F 45E850BCC900DC4F45E70DAA16AF2419AC21860B1EB89AF7F0180EE124C11112 0CADD9F3F99E899BA151F43339CC63FB6C8BAABF73C386F96F58A10F9E78959F D7DF671443C5FAF4949BA32A84F8C646488298C91F1EC11FA2D6ED7352E5F13B 6AD7BB1C0E165EE7812F3D996CD57F924F6E73A1B4EE2C19FA598FF9C3B518BD A93A1B748240779F35F1E588869A5A55F3B247FA8D8E422F3B0072E683181079 D896DE98BD73D134C88B24BF2B29CCC829A83967C92221708302B68A14CE6766 90F01CC89619C86B4FEEC0E5A50BF863905A0096AEE9E6E647196F88B4F638E5 05A6BCC08065583E29DA0E13E2A007C87E773C7D81D31FAAF92E030285E03575 B2976D135381FFDF46B9191E6253D6AD8A65F9434E4E32F7131AAB82BB6B43E1 80BA54E0E048EA0468470A49E9ED32B012882A90B171A76B32E2DE78B14D8659 427DFBED8829E333FA590BCF5F8DD88DC5AF4F34903F36AB1C30DDD050D15254 3DEB06267631DD6618A27BC4084323693FA1073C14393FF12567FE28FCAAA762 C7EE036DF244DB32BABCC05D6C3E7C65059297198A7E275064194DC63EE6AB16 BD75F6B01420622DD293AFAB2A0FB2F7B5AC757B5F5C13AE8A289E7584EE2D8C 3C4B9629AA7FF2D76DF58E517EF1A06FAEA5530E1442786753C3FB0B1B3FA5CE E263E91F09C34D0D2635B873E0CB0C88CE2496BE8B5AC3005956136AE4ACF206 36FB1ACA3A1C041878D5853EF63266405963EDF1F2A174C703A498E58A89FA56 616A86D4579D3F977D6FBB6DE3509CA74E041A27A5DC9533BFD19734631973C6 2E6C65CCC2416AADADE788D85221D596FB0DC6A8009869316D624B5A2DF3A90A DF5CF0068036CB5A8BE08F4BE00D090263076127A9DDD13F66E363517F94FF03 E76EA2D0F8F096012BA1EE4CD4B5129F6EDFD7ED7225C768E3F8B75AB1BA7042 D99E980A4E9A5E8505771483473C1D0017A75AD7C41B954F2BA77D4947684BB0 32CDF4D8600065A6A40B0ADC075D73E59CA5C7B04C0233F2509AB42F7E60EEB1 849E749208DFEE9350534AD41F49003F98B9873165139732338E69FFDC63FF39 58DF15D4271F6E22F22D914057219FADDBC89C220348A90A74A0ACE9B7DD0DBE AE7539FEFF5736D418EE9E164315F0A9D4190477F20EC815FC3334613983DFE6 CBD3A3875E40FA9AFBAADA78A839737F3DB970942E5DCFB52CE9595CD6E2A1F8 BB86A79C59D04B1528572F702A712F92D0F26BCD35989B294369208EE3173B2B 132B3F048938A036004F61200E184700FCDCA9109C2ACE4910D9EFE48BDB7CDA 6E1C0ED32809557A4BB408D16609092A7BB9B2D05A522BC0F884BCB79B06BE44 14060C3AC645574429E83049191F1A73A8F932B2B3B081D8DF98CEE41853A5E2 E134FE80ECFD186F67F93386B54524B050386E0D10346FD56F54730A83D4BD55 77E28CBAC138C589D78DB716C78F74AED069FF66C451241AE29BAD737C0836C7 465697E527DD4F03490C4ABCC2C7890A17EFE04F541F29BE91FFBBBDA39F86F4 D174D716689DB7202E28D5DA0B3A41C7E8E76176D679ACABA466503D3250A25A 64816B773328680165169D3606A1FA50520BC60999CE2475C7FCDD5112CB0209 97051414D465C2101DEBEA3F91427B92C72DE43018937D3DEF5A1C01D153A52F DDAD8EE767E8165D17C4463502CFEFFA9B03E8B6AED4A75CB9C29D9C35B06023 B98A4E67A589CEAD305D43714D76490E6BE0A15C8CEE8EC36788ED4F71DFAB7E E13AE6C2053D9AED83B715442294BDB2EF96788CCA61B5A167542F161A8778CB A90F6BBB675C24C6647A768005DD388BE6DAA6DD733A18BA377428B84D835ECD D1429C7286A311FDFEF75B265B9BA27F667751AB7CF4C4F4B0EFDB5512469A22 54F9CFEFEC37D1C03334A17AE26A80C2916DE42366ABCCF03FC67837FC15B107 8B1A97F69A5F4DFD3D5BEEFFFDFB8EFA42AB17AAE55180577A6448F6F9297C00 2242EA752626FFA6378B9128913F529920BEA4552B5664396DE7385C5698B7EB 510237C8C87857FCDF278F26B5D567E7D1FF65198E79D7B0BF108712930CED46 AB81BFAAB78474565E40B363799E415409A7B96F9E4FDE53FACF85DA380AA1D2 79F98D3877D2C4622122A92CBC8C6F10B4C537D46037A67964F634E5A0E4D021 76EFCF2E3A7E14672B62AB5F02BE5FB1520A64E29F6210A193B4EB463839AD1B EE16785692708464A3700D8A5B6FB2F68F88CE16CD1965C6713E4E69E45B9CE5 CC272EF96A2AECBC6152964DDAF1F94FC6B2F5029561FC0921ACF4ECDFF4690F CEBD446B6D3EE84FDAF532C8433D1C154D1E6C83A51C46BD8F7018D6E71E5166 F35E0C02D458BFF1271EDB3EC8B076E2E3461762B7DA59A4A70FDCB40D6F7E1D 9D25D6CA9477B14A77AE7793CB5FA0DB91918799D0EB812A5AE1CC9D0D84BCF7 606DA484E9114D8B6DC87CAB1F0DF998ACEE31177B6F60DA04A4636D295B9851 A9E4F8E8B05E3425A7EC72BFAF263D9882D54D19F63D8A1CD84B64F61E52E0B7 9EFF04FC564AC054974BDCD4E8ED878B910A83879B50D4EF90AFB9A944D904C7 C02364F0C7B29946AC16D2738F8189A66DC9C7DEFBCE99C3ECCA961168C5A46A E9FE9CA97F03F05742E573230B112CC860D65CB99298E628AE925608C9C4637F 6D38E397BA847EA56303070E62D4DA105C0C3AC75C90AA49E7122610D80449D4 04F4C2C71A885189F900B4D8380F2B212D28874805C9F34769FEF3D5B790E233 38EB8384FEBEC16264456C60FCB906A7C35FFAEC9A7269A3FA88E7AF1F8305A4 ABB2325707B7473BE9AC9B45E2A8A6A25435538BAF02A271E1540BECBB0B096A 2071D78BD4835D4EFC4475F255CFBB60404C6096932CF688A0D027F23D9FB15F A2F6ABB5C1FA154B1773D7FEE99BAD398260A7D8E10FE1440B9C2CF0C4DB4116 4884EA7B57A3559196CEA8AEF58E1298F67B64292781B45F19D9A9385EA0E8F1 5E9FCC9A3B1E21DCFD77C8C4ACA6B760CA0AD8948AF527D91E74C32605B662EE FB896246139A143CA86ED81B5FF837F1A867F6B75E70C4E710029D9D7ED3AB1E E377B1BD4556F7BB59F7570101392B906B0C5A8E5CC879A8980CF35B95B04B6B 0B68C7F3E1B2FA60EED5733F80B54A590EBAEF6203832F72568D25D77111BE9F 82DA6782BF7EBB28E0420680FE6A3F205B0E3BB11B828E96EBBB2DDAC340D1B1 C6C064F91C842ABFB5815713F35BF024377A74DB91ACF52DD078549F73EA5D16 6AB288DFA9B12003D003EEF67827874FDB2B01AC23432DE2677B21C7A3A8B5BC E6D73CF879A22A19A3F7116DFC42955B0BC8B02FC06D83F18A4B3FE4E6937F00 E1255515BB2DA9490E8A59DF062CC2193D8C065D1CAC0C764956F72E74D9AF63 F24623E1008F53BAF784A2E70460318C92D760EBB8ABC90BA395CB1088A8B4F0 C9E8B07CCB055FFDA70BCAA75ED36225C1BE409874CB4B6BCE1CCD02653A5ED7 2C8B2B4544108DB20145793832EFCA9090BC24DB840DF631B831438141A9F9DB 06E4E6F1B697F72FE477E0972BA39DBAC0F4A2958CA0810B84A080D618AC4E8C 9285F4C6117C89FF5CCB547FAEDB6EAA73F035B23ED7402B9A410C982756DE47 DC10A1FED9E7B9BEB8AB4BA79A09B61C6915DC7EE3CD01DA4D8A41FC55213778 D2A28FE59F52C5EBEE83A26D637176E6CCE597B1C0EBE305A860E2784820E6F3 729436914C733D54C1FE146DF79CAF2D36BDF0D6DDDE5F89615DAD7FFF6A469B BBFAA18190A994F3B8F08132B75741E4C6EB7DF53547CE113CC105505B67595C 496B4DEB3F6487CC8340B2381B44D856C9EDFE7F8186E6FB10041C144DC5F5F6 42F85630C7BABD2778897EB86DE7093C828DCA448B674195E7AA86E09DBDC76C 0664C5AEC3AE3793800F150B6AB35F4867BD77E77ADF0EB1DA65430852CAAE2F 32AAEF37A58FE80ECFB039E6ED2C0171FD2B71617C58F2A525CAFB900A1241BC C92E0E6379E2C7A7E8AF3DB3E449CEFF8E9415051A1990BF68D33C6D93AC7B80 FC0BB21C914DA646D24A0F6997166CC51EA6B7DD7897D468111C329130C10642 CB42EB429C4E2ADC58BE71140B217BDFB92736A986385DBB84198D3A1ADC1BC0 380BCBB348888DF5BC35B7EEA205027EBDD8D4871ED5D9401C919877BE758668 F89F37009FA3F339B342A75ADC39B0ECC457643A6390EE99207E9AC5A6C55CF0 BD4BBF2472BC071355FEF4579B6B144C5ECACB3DB0DB5516B9EEAF5C108448AE 2A950896E5261C6AE8A0A0C11355CF1A840729091308E22944B68C74C0F63BEA 81200A81A910A0F5BF3D8D795320F4241EE520B6AB5C346D5A6FBD29F18C7168 7BD71B3B21AC6FFD96F2970BC625C70ADFB40DB286AE29341301134980499EA2 6A4BA22E8DC951D6001D1B555E65F03C7FA33B74B88EAA8337FA7358FBC7D0BA 43FF2E34E524A1DC4B86E8EF562F8D724B00FACC7BEC345DA6C34A56B6A0AF93 49F74F9F60D93DAC706CBE67F42257F7AAA2D3F52E086BD8D6D41063EFD9C555 4122D9F1BA6F3B37DB35800C06E0554AD80F950816D6068CF089670996D5E85E 9C307A06AD99C84BCED065AA42EC57F8B910562DB54A3E2974E6A2CF7C9CD265 4FCA4430505E0B369D73157B17ADD1334731EA25AD9A8DCC2CAD7DC966D549F1 31AF42EB5E0DA1A156396C07B1193DBC2B96A10C6C8D6825F4094F1D060F2A96 3885ED421D5A8C7A89BA38FCF8A9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI5 %!PS-AdobeFont-1.1: CMMI5 1.100 %%CreationDate: 1996 Aug 02 08:21:10 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI5) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI5 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{37 -250 1349 750}readonly def /UniqueID 5087380 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F 5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCF83D0BE 846D988493CD7AF7D549670AA1C58B97D454D4520306FAE8F5F73D1902A32FA3 819F1E7641E15895D9B7A95C1C65EFB102AA55D12A0235B57EE9BFDBFB9E66FD 628970BDC38EBD9E703AB1D080068D2297C92797B22EF3A426FD8982C9F4C6EB FE77B9BF0D0376D91D22FD191DCC85B675A8C2C3C24BBAD8EF3300983EEEE882 1F64049F6D907BC920E938CB36858A877EDDC0D7E69F05A6F3355875B6A563B0 2B4DCE7429F870F9321F185F43C6F4C3583D5B911A39292FB472CFB7E3444405 47E40F75CF0B28849A15F112A0F56FD07390448497FA4353939537555B915349 3774B12DAB8363AAA2DF8DC844965BCD56392B1DC2496C169A0454C0C3352A13 917DF749F871625B3BA9A1041FAB344F659E739F5EA2C41593222698C4573F38 A205A26C7A389EB38B0DA090CF1C2A266C4D927ADE9CDE8603770859BDFCC0DF E59AE659E1AFF76CD473204CA49F4A90CD0ADC2A2845507467EE817E30D6102F 975E8C3DB9836CFCE4F0B80C4DFC753885911AB49BF267E080BEEF0F946D4773 172451DA839F525D2F7F5A7D4D3A633244FF70D3790222F5CBAF6833A75F6C35 062E1031D8C05647F9987581C3032A1A76EEAC595DC4C824209CBF0855AD797C 63CCC4C2D140787A656F0AF5E12BE22B928653AF93D546CFF166E9A004CFE1D6 ADB4518D4D1D835325F46660A4093842070C1EF2C34C6D2B62ABBDE3B0723899 71E945A268A9524A81F9179F385F851917A0173DB52ECD39CF3CDC9A746D5151 CE33CDAB5AF7C7C550A18047CB5856248517C5B7C020635950AE76F1602748DF F79E901021F8DC015BDE4D2441C2D059F6D4937E7999AC1BAC9B05D2CB0EB2E9 2FE4C798F084BA7EFDA83366312BD3B357B2CE29140EACFED16FF55BD6AF5069 140CDB76D8C31CB74E61411A7A0B588276C03C1CCFEE9C9457CF3165876A17D6 1932F4952A3E82FEE7B6888E3BF450373EDCD185605F8A92BB373110D003DE4E 3C15C0ADD6AEB69E7D4DA585E05316B43841E8B07CD7DA10FCDC9F10F5E4B93A 4326F36A73439B656E5E182DF5234B32C871B20CC7330C56B3F0980B213884C8 577690D36E779AF19C8E5A0999F810B1E4561CEC21955E2E311DC6A19251B60F D41928E893A1F1FBC05B00A6CA9A44D299D4CF621BED51687D0BB70F0BADC28D 958639365C08A036831075BFA05EF4C5A7A77B44392765956824BB71AFCED4AF 10A92E96794DD33EA48A9A749610B85F4EB54D80038215E04F06E49F87F2B6EC 007764075125D29BC705361B7A322D982C8316FD893801A72991F6A40194BA18 CF6E8D56AAEE31B5F74C6BACC53492407F912F1DF5E3EFBA063ACEC425007229 17F87D3EEAE93E0361FCB9FCCD307C4A773EA67D7DB4A4B1D93951225FD094E6 8003E44CB8E732200CCF19E9DD7AB4C0F02B1075C876892BE5D3A3468E2D8F3E 05B784B4CD368C5E20E05683FF3AD805DEEE1A501D53675FAD622F6AF16BEA40 DA5E90AF5F4573A0066B69336DFDA54E3C6A9255B4339C7141E733A411BF23EB A5F1C081AAC9DE2D9C9ED48098D41B0B3218D2527BBD68612724D7861D91066B D6F5F1A0682080B6358BDDEFF6B9CF0B8C5EE705DF470E68B9313B86C8D19F5A E339A44FB0E213D86CD4A25C4ADB9491B7BC88D8BA3BFA3249E76B5078737AA8 38640A50298C30CBAC443A88828AADE5B09BA160869A9C4EC56477FD334182FD 79249F6E2FDA905FBBFA08E5577AC68D5D1E3EF334D94FE5D5CC6DC9F106A2BA 8A4918091E339F5F72FB6C4498F38C68051D686B01CCC44074CB40183AC7EC3A 83463A8FA0C3361154ABF035AB236EEF318FE191C6C809C44865EE39F766C6E2 F9FE38562A6092561C4F53A6C2C364BD95A79D3D4418BD293048A3CCDCC75478 F4EAEDAAF4119DD9AA09F96189EF4874980713F5B91130EBFC40B7D3E1FAE957 C5BF715E659B89051177E39725BE6DFF212D2A1E002EEA7904906CE2132AA1EB 907F102D04DC74A748347908B03C4BE8C89306AB7C0B494D9DAA0C695525A802 AE735B7F0E11401BC0CA6B31EB11B297EA924A46C469FCD1D6159D6C0D33BB35 F8CBF39ACD469D383941C41ACAE8A7FD9DD168FCC592020C72309235A3080FFF 8B05464ECE9027FEF80F08E9FFFAF7B99618A7BC805AC894771086FBB7440BA8 E19C8D09B2BE3D4433A13CB58790B3E0DD3C38977C517E039DF5D896328646A0 5D56AEEA8798D353BDFF9DDA2ED130625E2BD678382E4E45D6D46C51A8B10A45 28C07542E314C8EC1F9E57900B8B50DF37987FF535166904DF0CC1CA709835E8 9CC5D1FBB03C959F5E487B0ECB3D23A93EFC1A2ED634334624432A4C6A0FCEDA 56DA634BCC28E6BAFB4EE9FED1594EDE5B9E770BAA97DF606F3624B7CD356A6E 363CA7AA7E14F36EE50933115D676ED374CDFD05858D03CCD95D0B6324CBABE0 7FEBD5C94383827F28EB79E633A5BA6ECA09419C04FE9316CDC8F809A7BD06B4 AA91A5B1A219BACAC0436BBBE6409B997FA214764C5D71A295E56A7F7008EB5D 9C69BC45788876F27D2D90F93CF8AAD4A6D2ABF00A62110BF85A2D9674CABCEA FD073EBAD58D8A7C7D72E5BF62ACF7F7759C778D87ADF4AA37FC9AC3D22088AE E419FC00E4F6E61B3F7C0FCC6BC9AE0E17DF3556914338F3A676E20EC3E30E1C 6AD09F9272ACD0C881B3A242FBDF4BEEBCD8B36F60027A6E2D422D13D8710CFF 63BF1B287858D8D59F3DD420B1B922C277FDD815EC0628EE757A68343947A730 C9A24C661EA30127775375E166744867AC958BB2CEFB316544D20B89A7731686 DE87254CF5BF979D0BF87E3CC8AE64467A11068F71634EC8C79A39CF894CA949 7084F59B25EE0800808E404BEFF2CF9961E45DB4FC05F33FB8C6EEB34C4652EF 36EA31CB3A0D8D9E6764A297AC0EB5FC53937530EC6029B4C1C97E195C10BEC6 FA00F3B2308F3E3CAF9681265B800075D22C1FA2006F0A4C5259E00DA3984871 18A089F47188EABE3E2C20138162C700B9DD1B9D7F10DAF35769C3DB7A1E7644 38BBA59BFE2DFECF1AC5B994DFB94F7515224E64B16FE22AD04CAE4026A46370 8FA0CA492146C72CC74BB1A56DF322D82411EE9AF8746A2B145D7CFCF8218760 425A50C299E88C7B4EC5317876D75D9B1BA580930527238F15FF7C2ED4BD0AFC 94036F91F9852A13AD93CA97AC6124DDD3FE6729295CDF869E1DE50463330432 427F759442449F9B2C2E7D1BEC51AC21BA307746346474A13C143566369ADA7C E037721F3E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR5 %!PS-AdobeFont-1.1: CMR5 1.00B %%CreationDate: 1992 Feb 19 19:55:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR5) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR5 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-341 -250 1304 965}readonly def /UniqueID 5000788 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC 83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B 41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA 246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C551226DB28A2A 49F6394324396BF03FEDC34E474883399B68A7BEEA16BD2E0EA1E5BC8D21283D 3B455CFEFADAB65FCA0F860892873DD0223AC73D304EA568D9B3448E946AB2CD D21C71AF6BDEA13AFC2EFEAF14E1FA3B7710ED9E0DD23A866F7B04C723B127E6 DA06EA3B19FC87FF963492B20DCC2078BE331632DC664F7E5A3910078B00E1C7 A9C2E43F55C322B2893A4ABFEBF572E2AAEDABDF9F7733A676EFAA9C80B89B89 9BDC77E800E8791BA96521EAF08510250EF175801BE667924FF325241700C6A9 F8C6D4F6F4526D931F45D9A6B48BFEFC61AA079EF95D9ED6E99A4B0A45A756F3 4B7E0A31BBACD7D5B1C6B006BE97CE85BFEF3F5D49AF12BC7ABE50215DD7125A D0DF176A6D8046B4516AABBD78361C6400342F98E6589CAE3E2AF4C081C5930F CF2042647F177395F5944D2E8FAA78D0DEEF4528B2691D0F2CC53A74C9C207FC 2B37EF0B4DECF2DD8DA4413A562EBDFF70330CF8EABB9D27802BC7D235A8AA39 9793ABF75F91626D2B3255AB9D45AF9E91540D301BBEA7E49718A478C9BA6778 2E463377A4B6377951A4935749DBD1C1C685963BABEAA35B5D9288D66C7F225B 2DEC96C8A7FD7CFF6E687EAB103B0157336EE7F79306D1A12EB84D20066CDE16 C7E2EEA2E178F07B059B274E2534B393DA4587BFEAA7660CBFD4A67EE0A19527 EE5B5737D483ADA94A4F5BC4A2702457592BB032F6EA62C7C1A3190BCE90AE81 9602985B1F1D7C4EE7395504D421AEB4 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI7 %!PS-AdobeFont-1.1: CMMI7 1.100 %%CreationDate: 1996 Jul 23 07:53:53 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{0 -250 1171 750}readonly def /UniqueID 5087382 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB 76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC 4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C 889787CDC0D543DA192C0F8C95930A19D3F085527C5A94D137B779774D8C1958 2DBAA7D60042303805B0471526D7ED2DF3063E9A78E97DD0B9B37EAFC9CD92FE 33FBF0ED29FBF8E2F835FE5A2458E33933C391D3FED503A15A90D2F9911F1B69 54A185F84D85009C895ECE81DB396FB34AFF44A8BC9F04496A96DA3C0090F983 EA3626BA6968A98644FADB759F1498647CFCA1E7655CD33887423A913358461E B5730E6CC6E2AA591F076F81C29980B1CC8A2B55A016EAE0B9AD4D9587DBE578 C460B951D54EE2618DBB62E1A44C25A5C4DD3E14AADB813BA0F7FDE7F81FA8F9 4AD4C06EC6D80CC45D4DF5F8F0F404F4DB88DD6EA10526E6D5F943C4913513EB DFA3EDAEA96D2CD1202A98997378F9AEF86DB9F2545D7C234438D57B5E5004DD 7B61DA84E4E66425C49FCA9A4D1FE40D0A5D4A3595827FF4E96D930FDD729F8D C3D91D05151935748B4E2223E66470E4B44665793FC1CE0EE67C4B848CF29A3E 94C18DD453ED42735FEEF4659CC525E021B445E11D3579EE05E86120816C1391 50CA8832A72CBA825EFECB472333ECBC65B294D0EF9B7E418391F7DD3BF94D56 15547E23F33878051B1792CC55546F045299E56D4B7F8FA6D5698C41B488311F 663A39CC0CAF61E9012895A7F1487DB9855AE7EDD70BBC8BE50877F76BD9FD49 0A38D533199336B45D024B3B5EACB3663A86E715B4F4C6FE229DB4DBEEBFC856 C4AB7B266F6798E55397D6DDF2A9A35248C706B1FAD42FBA635E22EAD7E942F8 93489894E2A5E01D14224A4F6887486E5DBA688172243A82216873C8C03FDF0F 8B50664FA8B221D0B86C8DE88B80C25F47DF5C4D23FCE4BF6B2E71A7CA9DAFA1 C5E775DBCBDC55805058C35DAEC9C60D309752BEFCDC8C6AE4454B860792EEAA F372FC014AF0DC8C2CB4C819008D61F6944CD05525FB9E92BC9C861216C12FD0 98482E39BE39DB7F679E8782932AFAF63CDA79C3A344FC8B861DC82FDD023240 102FACE44192D3386BC5F4EE9ED061B2461C0740255CA56A2C49ED08558B17B3 1239E90EE84A2C3E17FF51EEF3BF8AD4C4907E8F1A670BE656AA2BB27A44E63B 0662438420B8423108388FBEFCCC82CF8344AAFC822B45BFD967DB42665279EF B3D7486803971F5B6A6406C0B7F7ECA5F051FF8BD093A659231F6FF41B023A97 05017C935ACEB53C3702820C04B7C11A741B3E85151CA0E5C17126E7E4C318D2 9B7C794FA576538ADD92A94EC096C632D90D20C81DA7DF3BCA6D81C0BA27CBA9 46DD173D53321BA67397DF73DCF85AD44347404677BFAC2C5B3DCE0796DB9B6B 9BBD42AC4EA619C341BD788E47E20488170240D207DE9B07A641F3995FDA7BDD B06EF6CAFAAE78B22846A97C08EF051BB0F53E64B0F04A802E8C9CEA8F9D3416 335345BB3EA809DD67538EB619C37E1778FA7CDC1B9F0C3CFE3308E664E444B2 0015FBF928CDF964031DF0387363E94DC09DB0E32F756A8033D170B9B6B4C6B6 6583D5380F2632BA19F15622B356F5F44802AE610DBAA21916508D7BA68719B9 ABE6FCD6696814C323FE51E0239997C4D4ECAD0B0312AC9E7C694E66E2FBA5F3 D3EE2B76EF56433D38EAD87AA44EC9DD3DB2F6DCBF0986674DD4064AD670145F BE164AD44C58DFDE07CD1B91D8F090A4CFB83D423A7A292FF3D5B8111C7636B9 CAFBD6918C8D2FD983DE769DFC41B5D372605DCFCD003AD658EB3BAFF968C3C3 84E43D14ECECA0631754A1616B0BE3C0D6844F001D323FC1203853EA9F41036C 328CA11B6792C165BD21EFCF683472C5820FAE6C803B0752CC2E9906BE69F3EF DBAE62EACB42743135C9EAE27DA22BDCA0D344C246469A8AB5EAA772173051CF 7D1A1A769F7EDB1EFAD5EA3DF0FC51119BEF7A84B62A5DD42E9B0FFF6E27C439 9E586A22757FF319E65CAD67903E8325E1AFE8CB1A56754FD117EA4226DF01B0 BE079217D08B4345F4C18CA87C54F3E7DD3CB3CD1B330AB1DBF5AE302079F2D6 F9CCCDF6B9963D4E590FCF9D96CFF523E9FB82FA3B25CCC5EDE3FFB95D371115 54568466A1D7AB83D1322834975D1830BC94952B41518D90E5A571A3BDC2C577 DABA2FDB6CC666BF8C49F39C74B0CA7A4865253E1FBFD71EC05142E6C90AD491 D7B9D16B24D0056889BE3441564B480129639EA202CEEE8A7F23F4BAB6DC067C 74BD65FB930703959114EFE04BBC26F06EB6261CB85FDF4977B71600F2193372 A1EB785E2FE3ACF7360400A3B40213067D2C8216ED945B3115777EED4D8F5765 8258A732BE5652833D0CAD82FEEB50CD5FEB6E2F87F41DB49449FF962E237293 EEFC5DCC09BAD7FEE1E51B74E9D7B1DBB231E9CB300FA35CB403BE66BE8DC5D2 DBD5B7161FAAE0CF5A09D29B5CD063505014CB0DFF1F7794C13127FACB97AE33 097497D8E28C2BED8310606C3C91C6B44A784EB105395A7A4F354B1D34D02972 51D75D5EC80F36E1241715415F240AC7F9B6CD91B7D95D0F795C4D264B88FAC4 BCED262219FF0EEB347E94A3ECCE69008874DEE85D8A08E353BA842142B71A6F 8E41ECFB7270348066D09EEEA79F432C253EEE319D0483F8F5B130779FE9460C DEA12BAF54F44316EF6FD9ACDA602B4B5E12A84B4B4ACF6BB7CBCA537E9263A3 50BDA5A0D241DB55CBC923E33D28EF23CF51A7370F02465F071A2F928FBAF7E5 1190FAED2FE3F89CE44305FB9D1AC33C4ECEA058DC0D8A30990BDFA9AC2D501B 18017677D2CA760E282CAD259FEB0178F2F04A664132DA50A3EF614C4AEA2C8E A0307BD4AAC218B93F7CD830FB6E15026A19CC0D971FAC97C1C5FFFECCB99481 0159AA646A131894908D8F8F8BF945376CDD9230DCABE770FFB3214018DF481B 0DB42732BB17B3B76AA5648D54D44575ED6A508DCCEDE2D69683CDB96C866A9F 99A187D6A14A154FE7864149CB28E0A6BC77602CB0616B2CC4008911DCD14346 B47CEAAAC7ED9F550DC0F1A7ABB33F4A213DD37A76BF00A6707D54DDC10816FF CE09FF970E25B9BFAE3A510CFAD6E1D2722B9616C6C2508529EB2FE8472EE64B 97E5C53069E53352C4207F84E464E6A63C22387BC4E09A8C3EFB9463D7421A8B FA60261632B8C317FAB90B1C3573BA97D9DEE3FE8B1BC34C97DE5E91F23ECE8C CF8C6EB1842C46BE321DF41681CB78E06E0B74BFC5AD55D3D7B56FB137282129 0E396C726C2E64B50E9147A8C4D66364E8F4EFD0F488113DC00733A552AB538A 23FBA633421593C0497265E8A92DD7DA9EA012FA0D9D4C11F55E913E3C2392DC CF2B8024A1C179F23EB16937AE19171DCB7F6DD5233C6B19484C8042EEEAFCC7 F748B753E4094BD4AAD4C0A4C9A4BFD72A74F2835D0169974F13FF092DAF628B 972B70458D6E88EB5007A317C7B1CE1A85A54994EDB97DF1F6C6CA9E692198FA CB83BA7D7FBEC9988866FCB81D12CFCE5D949C1DB82A597F02D4D4F7D00269E3 DE522E8FBEB18DDA2CC016D47AD4E2D9A3B0C0284E86EE5B668A06F78DD41D85 7897E46E04F515D29388B22234981602F0682852D7879E8031DBA610B85E8256 9F80BC552BBC610FF32E899AD55407372663E07BED51A6D5DF7C5751F085A3E9 806F70F0D6B6D697E215A8BD5A60DA07A9EDF0E052589555FBF4C7F548834FFF 50A4136819C51773A477EA0CFB9CA18ED0122B9BDAE004B0996A84DEA881308E 5EA3CDF91AA730BF696AC4F3F8018DF8EC5EFBFFAD1028A58BACECC8D281FD59 6CE4B521F24418830AC64433B3F06D7532F8012BB1CF30BA8B3C2A3FB677DFF3 DBFCF9302115BA2C19228B0A650F07EC03FD6A4D6F841B4A913FB363885A0728 E84C3CAD76478C08B01DF1A08E35437E2C975BFED01857A70A62F6C372E3D666 472DF4F13E62E2EEB7F5CB579CF57D427E06F6DD4D6A4585B096BED52BF453B2 4D4E85E1D2ACF390C036EFAC039BEEF572AADC8D3F64AF205191DCE0C79B4137 8E8514996630C520F58FDAD7178AC72D254C42848D88E38C6063CF519DEFD01B 5AC978D9963C63644C9422979BBF276F84A22D363CB7B0350EEE78A77A843EA7 428FF10390C71FD11DDE1A6916B47E0A3893D29B3802144DDF3883E6663E6AC8 609B6DFCDA7A6E09D173534A863D82E73E6939FCC02D8807346DC89632C7960F 3907452CFCCACC60B5D6567184DFA308120B87E4AAED207782882801C73B2050 047D2F706FBEDCCDF36B965D7872264C85867F79C750B646036320BF15CC3BF7 30305ED748895675345DF6E18829A306E7716880C0734F184486A6FD7E307E23 E36B973ACACC4B249076DDF9AB125421C828BA9997CEBADD58DA213E7847CD00 4ADDD886EFF727739565DBBDC88A8A9732119116E395880948CFAD0F5F139159 F6EF3472704A50F93254E42CDC3D195A4C29E2A9C1DA29EE79F75ACA7ED4E914 7B78A104C83E2A001FC656EA24498C05A12ED7A87B05293A45A959A19D1291B5 4010F52E4EF980FF43F81CE993B617F45849A5ABDAF9687761B7D5148A0500BB 0F496036081DDCED6E11274247F4744D4F9E1BC8F88985593AB2671519394503 B0A4D0A738EF710BE536147ECB4FABA8139B8866EF116CF689ACAC0CD66F5267 CD61F77B6A4D51E8C471A8750468915C4778B001BFDCB01F27C2B98B747D0FEE F73014D184A92A10753A751110709C520C0696922F61B62DB974E5BADE7267C4 D0340B7DC5CC22398F3D1B91D730B30A0C49FBA67C139CFA7FFC89D75808E460 A5106B43F3F921C05026F3E30650A292D934DC8CAF596EAB6723C47B9AFE71C6 D92E6E69927E4FF87F226C681A7840809560BA8975A23A2E0AD15E98FBCBCEEF EBCDF9499B0EDAE4DCD95C78E99BF326EC4AD9693246591E737B72669FCFBD5B DCB1BEF85864E263A7E7CDC88C76DEADD972921B532F36070FA84642BCC4283A 9A6D8EDD3CDD7AEC16C45B0F43A3C4B5C19D9FDA6EC2097EC5313CF0CD5D5548 5A0E5645253E5075ECB8643D892176667377F81698FCB4CC46183A3918710EEF F9B4833C3DA8C9526F5FE883172B5691DAD75B9C0162E95577663F5116910E7B 3087CA373ED6F2B02827C88A9D3D3D82F6BF0D633E02B8038AC353C75D598288 372CA4E0CE0D73221AC24C588CE76B3BBFE1D2289FD043EDEC22A2F6767C866F D5C86EBFDD2115ED375AC222029A9282FAC290748FFBD8E686165AC9A8021586 F305228040A262F1F7973A125513F5D51DF44949B6B261C84E777555B7E44901 8DDFF44B1B314B16888706C579DC9C2E2571E459C9F108F9BF446D183F6FE223 C8AB754FF3654CA4713C54EB0EB68E45FF8ADCE0B70651983BA309357717E59E 517E370E94DA3547B164193D5D47E4EE86F01FFF193E4BE2B35153483DE5CBC4 487B0945C593E8161F0BEAA4FF1805FDA187759A08A5C59E911995AA11FC93FB 83D0A3AD31938965FD7D024B61FDADEE2DC3CBA637E788417B4C49CDC6301049 376EB63EE818050E5822E4621257294FC5200A67F3AA71E0C5C16C6F88BF194E 46C926601079A2DCB7FA871DCB1866D48103AB4A9C60877F0A04EDB4A8F41084 583A6DD90EFCCAE38F1F28FD58D07FE397DDD50C84B64354CD5B83E79776117A D33AC8B3FB93011B27311E76BF22F52D58F4AC868B7D24E68065C71EA81457F1 C4FCA04B754BAC905B9F9CC1133FC4B58DC3D09A23513C219300A20936BA2F9C AF8D101D13647689B2FEF3481814D7466918C17F10049E9FA884D2F5F32E3BF6 F2D8A264AF1EEF3BD39BECF62C4A39715FF5A87CE76BADECD6FF4FE614A69788 2CC39A79FF56BB15864A93E38AD128664DDD9FB13B223934129AE6E70045FDD3 94C1C9D3C553D5064E15E509ABA22485F08F488A19048E528062A193199BBC97 1A1E0D3933B4C43E0FB67A31A425C1E0BA2C4694DEF9A7C7599D334970DEB9EF 2875759E50973C563156925B054B402892D042D6A4D21F0D7F216AB553B1754D 4AB5E2B0C68410E1259A4C582808DE6AB52B32C39137C243B6210A5447723CE5 41694F88130AE9DF8A3BD3639B90C79336C1AD43FA81EC0C4C6133E8A3E3A4C5 DBD5B78AF59EF671D93294C47F1A2B43B20D4F2FAF53066BB8D1FBCC5764E33A 0C30CE81B9C9708D5298980ED738DD28E968B01D036FB9B64CB1CCDAB86440A1 2E8027F40B0D44FCA5125FEDAD75DEE62B5193AB27F6A41F969B8E06E40F406F B1101AE05027682600B23A38EEC196859F4ACF87AD8A9C8D1B81421D0D5E8FE5 291CFE23894D1BF7B068B79220EB1CCA9FC5FF1D11CE72D2EABF24D95D163423 6D3E2543C4B358CBB3310391D2AB3FF57271E6B5F7ABE17B9388D31BBAE842B4 3CCF112F6BA78E34EE869D44AB823795FD501E6E07BFAE8FB05DBA274252BB4F 2C6340D08D4355D3C302FFDA9BF4F9C4399CD17CB62042E3CF70A5BDEB87B1F3 CA1D953B0C5B251FEC4DF8B9A8EBA7030C018D84957F4E7C0E729CB573A2DB60 B383960B14D5720DE97585074334A237A2C2465F7961FF6EF87EF2E9219559D3 EBBF70E5A1BC26F0E2EEAAFE72BDBE4F0457C9D53D08D422E4E55F134119F754 63468A8431AF42D9CCD2838B60C02338804D258BAB9065C55B986CD53DA86BE4 E1ED202D46A02539B192FA59245DA5C585447578451BDD3B9ECE75F3A85FCE56 FCC5E3A81E1BF4F987CABB8B3EA33DF10AE3105B963F679F696FFDE4BFB9E7AB 11D12D68E0A26C90F9678A65ACEBDA291E80950E3A9DAE9073EB889C3F5E29CA 91E4898F62AF3BF82323F506DBD41FB83906C866E213AAFEFF2DB5EF1F6836F4 588231F28993B232ADA24516859E00D56043B259021BF8D2F1805F78EFDF9C76 34ADEF3D2BFFF3C7FFF660B3381B041641E1152ECBB559E98EB2084B625A8AE8 5EEE45C9BA057AAA87F1AFE574FF5FFC6449F72887B09EEB29BC0758F2D823AB 1E327406AFB1C29582C11BFBF86CFB52250C7EEF8DFD8E843E7DF92A837FE3A8 62E60A7BAF5B4F1E2C95B4E6F27C28B1F8930651BE824758A42573E7DBC9CDB9 A0352771D6FCDB4EE03CBE389A6AD7CA1CEA6FEEC4E9A23D9422D7EEF4898C98 CDFDB1A930E6DB3084E02EA98F5CCDD567ECF81147A9B3BB4F14FC35B8E34B18 1733D08C64DB7D212297BC2AC9C66825722602941AC899321B5053D7075695F1 2E202BF9EFADF70518B6223CB08BDF22E60137BBA4B93F743D9A101FEE8CEAE7 BB87EFB928AB3658A76CD75DDF6697290EA38A380ADD1210C4DF4B9014268394 CB050DECA104C2850566F87A16170B0F842924DEC94D18A845A3898FF073D7E5 84683D9A14BAB8E90893138643BA475215B114F98283FF39B98C017CFFB3DA18 652222D9C43AC62800922E9AB52B6BB31E05CF1AA2CCCD6EC42BD59FD2C48383 76E544BCA92209F7C8A76621C7E5551751C560419B74C29C668592D925F90D55 E3ADDFF6B6F4CB0F3B259A64AA61ECEA53749DA714558AB3F5C5B9B48363891C 7028D571EF95A5C9E73113A2347614637DC1053538D456AA3D2E4CB236DE55AE 346E74B6DC18596ACC84252289D6030FDDAF12BB088DFEBF7234A0ECD90E3346 A50E3D110B5B14FE236CD9250004CF6ACB10620F9F7ACD2C640090D93A5D7CBA 878972EC520FA196B8A28FC3FC827846B605B7B74A51E3746E1C528173E688F8 86DF736AA49EEF4053C2FF2BAC1310D9AABE574E5148EE12DCF3F57CF6DD3736 11C838602710B00A0B4349EB5A9253C5BC7C08702B9D2AC085CFAB205B2F97F2 3B7AB7875165AA13878E2CD5CB1126B87459B3E1777100A3B12DB67D754BEBA6 4D8976AC0AACC303EF2F82DDDCE0B8C424CC68C0F42AFC1924BC9E8C3B842174 032ECFC9D8C0CA47ACF805EE36529874DD35A9371271A3752AC0694A65ED66D5 DB20D5DD80F68CA3DF0E739C027D3D2F3FA3FA6913D52502E9985EF844693F49 FBC1C818A22D2C1EB9F2F47B9CA4518D90C3FF773AC1FC2B45FBFAC01AD1AB0F B544175DB657EC8753826D3B1C6091735312573374EA7CD90029B84F36BF3DE1 E86A481C842EE10EFF0CD64766239975CC18B75DD7AA9343BD7185D2AE541649 9CA8439D429EE1929159E17A552C2286BBF7B87C6D8C6BECD765263AEB47EDE1 3B92E0A133A262901D8E7DFCACAD9279A3F3C7670A8569D3980C6ADF72E8EC29 EBC01F4E90EE639FA700D8B846033CD27CD523F9D1D5E2B9843750A23224D149 9417C8B84283ACA5A092F8AB1A894B48CA2F553DC12D72B5A603DB873139354F 5116D00E81AC8359B32436BC2D0965707C86DC3D8A1C6C1A8011065287930493 4DA060CD156792DA7763FC38CF8B84FF4F9981CB4132C07A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: MSBM10 %!PS-AdobeFont-1.1: MSBM10 2.1 %%CreationDate: 1993 Sep 17 11:10:37 % Math Symbol fonts were designed by the American Mathematical Society. % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (2.1) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (MSBM10) readonly def /FamilyName (Euler) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /MSBM10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 80 /P put dup 81 /Q put dup 82 /R put readonly def /FontBBox{-55 -420 2343 920}readonly def /UniqueID 5031982 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D 1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 D10F04E2C2822D3E73F25B81C424627D3D9A158EAB554233A25D3C6849ABA86F 1F25C1667CB57D2E79B7803083CB7CC0616467F68450D9A3FEAB534EB9721003 DBFEEFD050F3AC3492F5C74162A9A531ECEC0F47610B4940E946D21CAA771D30 A6C27ECBA11708CC46C62396BF9D1990D579D0C394899D24FE7A4382EA18E7E1 160E7283AF5BE17254790628E79FCC206F28B5566075B3A5697D5209062544FF D85FD89D6F43D6588B242AB2666B5D2861CD38A8CE676503EDFAE84D12A71E77 8405E468FE391F4F3F50D2C57ED55512036B0DB8E76A7EF413ED08673E56DE2C 16A3B65CD478433C0D2F9FEC4E662D54DAA43CFA6957D2A9AF8979BE06F70B68 ED4C8C493D6DAC4971A3F1D010A7726D084EC1074FECD7D12D72AE16C26194AF 21AF5774D9B860EEE8608D34F150092F09C19959BAA670022B9A9F263CD391E3 74DD1D1B4CD4D75273CAA4E37F68C631723E08FA35AD34C0AFB4621AE6689861 854D16CE1C375FD159A337E221A6FF1CFFB5693A0623E7EBB58C2969F590D081 AD92DD9E5322E26D6A15023664AC73A355998BCC48ADD0E7A4BC79790519606F A1FEF6075033BCD422EE8233B83D1E7C20043280D531223D5AD4D5B41669F884 95CE4D6DDE819B588742B930C579EDF743F2C74C95F717FAA6154FADC3FE2975 F59CFB1C1A29059487E75C48505BAEAD7145667D4E18E46E610C868A257173ED 0D30EAA4C090854DD8378E92D0A376226EA7DA63798F247BAC770FE26D70E72F 90CCFAADF118304646955DE0B9D25C4B419FBF62FB42ED17CD96B7343A615ABE 10AB49D23B8AC3CA10553C5B5ABC15FF83B6B5A939E450BBF3FF2C25FBE2646A 6A9E6BB4AAF1D716774D8A9B4A2E0A6E4ED6A9A6795CD10B29D7546F125A21BE 0398B895C916C715516F37A766638676F975E16121A149ADB6004F87454C33E4 391FC10668166B6B67FB6E2BBFF0230C9BC38A29DFFA2DB6138C5AB01BAC2AE7 A20E96CC79CA95C3CFE10D51A2990531795472F073F7EC3FB0448B4340D6B73F 489723A20DAF9AB0CEA00CE2449A636AF0388CBB9B2A2FFEBA1E0E57D5E31128 760B48E679280CBCA68D28BC35FFB82CDACE3EC6DFC1FB027C403CE9526B6788 0B3837C0CCAE8C9A472D14752C743149583EBAA36EE1888DF22132DF186F88DE F122D05DA3F652EA9E302228424B3A9D7CA0DAAE7464AFA860F7EAA371531FE0 D401C99642C01EAFE5601AA5966739FBF7E039BE39B55AF87BEFC2397D3D24F8 AE5CD3BC5879BC45A5B68340DD379EC5F06DEB6F5A5FBFFC1531E66D5FAF68A3 0F10ED2D1CDEA6726B14EFD56F445D267198F8B703F7FE3149D2D4E6BEFB728D 432E427954206D888AB37344E05A2AA9FE94263DEBEED0AA9066F0A123F5731A 2757746EE2C16B6A94C793820C2B0D21B521C668D851C0DC379887B93290AFE6 4D31D1CE63CC5F46FF8C1CAA3F315447DEBA2BBFAE7202E3ED7F6EDB2E3C37C2 A7F54D56F94B336A908960BB1D16BAFA7CE21383158750639CB466E10B0E7AB2 F7A7540539FEF889C66FA32BF432920C6349609AE67EEC3609253EDE2F97DC50 30C0E60005C1EFBA5BE19EC8DDB53BE1F856DABDD3D3DA99662BEFF6F1C78DF8 6D58587EE052D2E0279CD128C2355524E70BA60228F7EB408DEF4FC821DCF612 1E474F6402B669ADCAAA935C813930E46F05A62DF26F5C84C7025B15325D8154 5E5E398B47352A00FB08CECD4CE1DD4B9EA563CD7D591A1977E73CCF004FCE78 FC30DF75E14DEEC16407ED34459DF79D2A7B1F31C597428E2A881CBDB7607F58 D95934554767B7FC0F4AEE43366CF52AC3898A4FD8F89AE28C90F768E12C6198 B7A02D896F260646005E2C7E399C49A575C67AE2004F25DAFB3E85A02A2D0EC8 C58DE9326F84F7F195D5B82D2689192B345314233037E85CBAD689390B6C7567 1A42633FD761ED980BE0C13421B1C8C55933C01BFDA985CA4608DA50120721CD D785F3B74331605D5BDEB37623C2FF22D0EF3403D8E483B32EFA9E692B6DFEB2 703A012A6B66B43F181061683A15E246CF23DD535DEF504E27899C5517AAC7D5 A01F264215A144847B9D5823813C6B8FD2997B5B362417B70D0E1BFDC0B2F4CD CB100B14B1AF771714542560B6677A4D85B41745DED0BEFF089F421D9CF4AD8F 41683409B694477133BAC869BBCCEA9B47EDC11D84DD0802F4 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.1: CMR7 1.0 %%CreationDate: 1991 Aug 20 16:39:21 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-27 -250 1122 750}readonly def /UniqueID 5000790 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C 8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E 01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B 52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34E6F4C9A04BEEA891E 4D22B39729EE4F0ECBF3CF3C429B3BB657DF66811D3A108A73513A22D252AEBA 66664B33422FED0E63D93F9F8E24320719C09F50626EABAAE93F5649E1981AEC E8F19F6105EA978C51CBF54E94F3DBC93516313F00B281D1B8C8E4C1DB33363E B81B61D7224245842A6B98939F0ACF3ED081BFE7A813215D36CD6ABC3EBD6B99 A5FAC5AA7A0DB126B0A1FB14B58525546D4D8BB6E95F803D6E48BADA30DFD6BB FB3CF37851BF9757FD00D8E051860B38DDC2A8603F3C012EA23766F274BBD42C D0EE6C45FAF5FB35BDAB57C5469022CAABD7D9EE8FAEC900D865370F7296295B B99220CB79D74C03584B65C1B4B23450CEE026211DCF66E0C2EF96B4FA68FC37 611DDA015A7C073EE4A244B2612FDD4BF490AB65C7799315FABDEA6C101CD754 A5BDBAAE1A88ACA133044BF35EE18F52BD02EE09AF96937CD671A920FF4B3477 1983D042BFD8172FA8B6043EF35EC00D05E611EC04293D05641F3849E4E437C2 6FBAA5D101761D4BE3CB07B1A7D0E92D0960AC6AD5F3446F93AF30E925293E64 922084169A9B4DD8E4C45D7C66134ED28C8115152613234FC4F17936C1FCF236 3014FE9F97CF2BE7A2CBF51B0B38BBE84FF6FA6981B91A5BAD532BE653B61163 65E8634A33728FAB365B8947232211AAC61939EC53E00981175F836393436991 9B29FE81D7B674D0601FF549548391E260D61232C507569A451022AAD07BC6C0 560B8F7898BF724BB219BD2B36A90AB3CB8F65963A9BCCD09B230455683DABDB 831D4B61950664B19B1828C94D5B42CF91C73AC06014BF96303A4200B29D5DA6 9E9909EE72F9F1596715D50DCC8F74DA1176CD64BA2FF2BFAA1B5D666A501883 670477C42B55D8405F334C2349434213B31862115C7495CF630D62C63C1036F5 8AFFB19419AAFDE68C0698BDF0D3A92578A1EF5D008DA6BB7AFEC7A67C725DE8 B7348EFE24947CE2D60C12623D621EBA091DF6199EF13F0561F771BB76DCBD6E 0DFB8B6E37BEBE39F10D0780DF83F3859FB2286571C93AF1F35B8A2731BFB139 7D1173DEE6CB0F76C613A8AA491AC5DAD6F0A22A6E7DB29985CCA5077CC83F85 B0293585A1B8059A5D63B68EAF2334884B24DB3296B23921B29CB7765388160B 5E690EBF28909F154CFEC54636A71DB49BE53752F32DE0C60BDB42CE676C750B D0C30ED76AE4EE6D12FB01CC59B5F3840D56F75ACBAB33E6FAF070028F723A4E 1A56515E6E5C61316C50B3B7700BFA286B3AF615EEDC53FAE22C99B290652EC7 FAFA39DC640F1A4899E01A4C7BE2FF29DA1C80A3D0B2F0FC3011C9F3B9463EE6 B7828905F9EBF1A1DFE76A6E6F9D8A820A81F0422725496FD6BDF5000E0E09CC 84754B135B3F6486BCC3440AB417CA246BC556D40ED973554A54EA39595E3973 6FD4C318431D946902B9D9C2346E86C1A476F165F8E3859956DCDEE682FBF0C2 0D03BF806899F4D423B2E0C6E998AF8FE75393A5A87B54D572CFB5F9C3A1D906 7C03C391BDBD9071F4AC869991967D9A946EA66A03E724FD89E442601C90E2ED C9BFB6EB5108977389FEEB1E5C50477E59F5124F74209F735950A6FEAF91CBF6 272026C474B923AE8B99D5E0931BE08E396525E0EE9909DF7401415B9F7BCD0F 734D0626A1A9FE5513A13FBCF3DB3DD87D364D5CEE77C887142FF11CA6649C15 073AB6D452C7BBADAB1B8B317026F47E504D97D27086F8E35346DBFC9EF8FB1E 882A832D7945F3AD733318324E0965C465F6CD5EFD402EBDEF0C6B13808300C8 B56A5938D49B7419E2B1713CB13D62504152A55B5D7A1EFC9D783A892F0CDD2A 35DB76E0B74B2EB62E6AF76447656C0488A177DA8929DA918B73A85D774899B5 943B6CDF121C91306787D4F9784152965A63F5493B1ACD8651863B2C47F97AB8 838E6582F667E15C315628EB62E3A97D258D003456A43BF95C4A543834D50033 980AB781AAB2841CB4E5F6FE07E2FB2475A20666A7C2EE7CEFC5EC45931C67E9 0A9193AD47B06522ABB2AF8F74DF9598382D459BCE0402F085ABEB780E813C09 223E86602565390363C37978DFCB14DC7A022114A5F8C3596BFF80D570991DA2 E924BE4A75CB0B7522D5AC5FD76F95B82EAC7F959EA3783F3886845CA220289A A17FFA8BF7AB500ED84425B5F69FCAA4FE816F301BB99200C5EBF3AAD0604741 37C8BBB3BC50AB818C9FE897ED0676A4AD23E720753DFE2273041A39B0363D43 E6435F86CD0CF9B292A8F8E83689DB5F87855198A42382FB36FD66AA9CBD99B4 46B88FC6E5F6760E894D5C374ED152CD1644E78A8A4732DB7070E9EE02406EE5 2C1278B702E87F4DE8FF960E6EEF58D88ED3489416DABC2ACDFA7DBF678A42DE 2282C9F1A7A3102C05C5F20856ABB9460A35831A2407F6B468CB9728F3BD2160 9D27DB0192221E1D25F5D90A0ABD46C40B29B3B3B7A1214D6004907BC351F536 3E71C1C0F5CD72601EAEB0AC53A6A82B28ACB6DC266EAF297FE382279F27F5BD 21E736C1A8E7130BF2B53D5EAB6CAA4D34464E4EDFF579D273D9ACD7F2BF6464 BBB39F2CFFBF0ABDE9E3570F23A820B7191743804F7ACB2B552CE10262DED619 8C05BEFB7168CEB62A5123A9179BB6DA5A0E5EC62377C823C54460C748B8FD64 AF2F3F695E1FA034894043E82A7B070F1147E6067F0B4AA4EFC5F44659032962 2345F51B75A107A22DA6CDA633FFD3110CDEBB53162D496CAFD8F1DE38C93FED 7312796F22E023F34D2F8EFCE0AD210366CAE60297776CFADD6B94E931475703 A733778868D11FBEA27D8C42A406BABD86BE40A9F7D63517B348E6D2B01EF880 46C0447700A09120903263FB66C3EADAE5F396491768758F8CC413A18708092F 03F3B8A79D109384C1D2021812DC389FC98B7C45401D32019A700E23CD5DBF69 D4B7F94F20849F892F981C1399F182CCF2F3996477E1CAD58E5E183A54B38B1B FCC4E078902B4B93A931C03AA058D0CD2874DFBFD0426CABFFA898D5F77080F1 31282FAFD99A56E8998858EF8E338AFCF886DC1227DB73C9A771D08D04740781 FBE02289AEDBB5F377DB8A56B3ABC4817925D74025BCBD5E10DC80AD81A395D4 724893A69411B81157A6449127FE1D08E1BC8981A1C0DEE1877EA5C115AD6FCB 7B758B89ED2C5EF5757F638B0E8091A2955E34188CAEABCA84E020F6E34D8F44 7A2921B6E7B1686409A1496749F5280DA6C72133B646CFB68755055F3D7CCD88 9D467C49A4192ED6496BC5418D835B2CB6A74C2549638CA4F15408AE69DBC526 67D9E7A4AE0A69DE97267D058B2C5CE5B2E3DE249274028649A197660AA4EE6A 5223F4BB7111C1497D1CF3A15907127FC6C5837F4BB177242590D45AAECB64D7 42AF21E68D25710603C9035E9A9054B09D5D64BC545E08F649756F1D2D84A41F 8E6E80427E8B7D7F9CDACC8CD654F16C601F4D5F8900C70AE15AB7C5ABE57F95 C92A3B7DC8BA108D6A51688183C1FC93F74FA03D9B9CE5AF0F8D79D43FE7B371 1BD27875C1A20584D516B778A65CD4272DACD8ADD5F905D7A9A74557017214C8 5794A738C8B49281F3266CF4D0989F82310F169A914B96CF035A541103900E6A 201AE50A452361CD14EF7D1D763B23B2481E94487DFC5962B9A56BFBBC2BAEE2 BB8A2962E5F475A3CB3EF449969F7C75C6F9C4230683A63317BF1ADD26873095 D0874227103F06611E500C72662FB6195653A3082A25846142AFA24A926527AA 223D2BBE493DB7611CA070DE3D41A1D830B2F82381C618E4F1AFCFC7A9B9E973 AF02F2B6642A61C9DB293916EB353F38CF37EFF525AB61FA4EF689763175A5A2 20FBDAEB042BB2C10B3AF3967A9C957885AA030939B34DAE36343DCD8B6934E2 A2FA0870BC7C88FE0C56EE05242036631DB5E0326732F415AF1523D3DF2C7892 9E3AE9ED45DA586F4D9D3AF4F79A28650EE7ED21BB66DD637E3DCD8FADA08FF2 98786863446377B37B879A4FFFDA04B047608302DA764C9D31AD9B89C65134D9 89458A0771CB0B4102D4B57831E9737B704E0E897BAE0AD89D8A5DDDE9930C2F 5F1AF26A67C6216C29C8023A3B3E0CA2F5C50A9043D087B65B7212F50E5B67AD A2E9226072258BF68480A195EDA0668142A029E5E4F28969BFE460A5158BCC71 9EC62EB895C59820C2F83F96A9836D93A7AD48556D0F759259D37D5A64E1F257 C7168BF7411E248EAA40C23F636E37374CF33489336D5C0A002F9EF0AFA52BE0 C9D7ECCEBF889764774B6E9D5F3CCE4B0F8A149AB448E2A98AD1C25C9705FEF7 1559E6751FA6F3E173D950DE3CDB8A9BE3347FA2FE82EF492E6849C851B014F7 DA0DF9A7564D5734FE868DD3AC29FBEA998DD3F0762FDA40AE61FF26D8602CB2 FC43A1A609116DE6C73154F017F3C103148A3CA4B72FBCF62611EF27C93B32E2 C8AA32F9DAA3466B3F665226395AACB62F4914E7ACCD79B259FC40C8B92DD60F F19BBD020BEDF5DCBF290B0E4B5F3A04E350C9F0CF93F615DDC1C9EE20A727E3 187F4DB323EEE3FB6DA6169A68789C850C48F825EEED23B1FC65604F75A2DC35 1D24464480110ED23E064A7620B7F7A44897B8AD3EEE1337CF16D8EF74EB0DAA 59EB4E6CDF4DFF35F41AE98A6A231E2E60CF2A7ED81D9946670BA8AB1023FA28 2F4156134705F102850B50A244E82E595E00B5306CCB2EC7765234D89D41871D 520690EA0D9AF87C4ACD4E6DD2C8EAB72B0213891DD911D8A2B9777AB671C5AA 084C5946CB1284A35484997B66EECB99E4E0A747DAEAF332B7775EA99E683856 8058F93C39422C32395540F62980D30724A1A38DAF5253AC5B5F9C812921B363 416B2106038DF82410229AE6E29E592344CAF9AFEB6C8F00CEB69FE7DBD7138B 6D1A79C6B0B1C1F53A73FE8D1C50978D9A5446CD625357A0B3FC7A6FBD7B4ECF 484920F811EA22477014AD3B869AC17BE489A625D308E7435EECD922BAA48BEE 52D622E4337B16ECBD96ED710CAF9EC4AF73F692A372CFB588292A2604DA70FF 5289B46F40CC29E6D0ECD528C3AC407FD780A1EBDC44D591575FCEDF0181DA5C 54AA33ADF7DB6E518E4CF62ABBADCCF153B975EA28D55D10587CABE08364E25D FDE7919926389DD86DCC2BF5CAC3445086B053E7DDF8501F0030695073C7A9B8 59503C37BB2663DA9AEB3A8888934A2F7BECE7625D7B814A5A2EEFFFFB0FC6E1 3F1D019C60F72753754981B9BE126851C8447F636DAE95E65BA2351C684797E2 022FEC4943D67BA57A6B7508DB22C394424F2FA28B5797B5649B85E3A1BBD2A5 CEDD9EB15974F299D5D541CA3D13E98EF9784C58DCDF0F630431B6364DFD4F19 5915558799CDBBC69869F596DC559F28823736B4086EE231E82A15C051DD5486 5509692CFA40DFA5FE2CB9F3BFE92BD8A842A8C18B50B5DF877A0E2777F2B28B BEE90292C2C712C6AF3B8FD371CF593B9B4110AF878100C9F3D5253EA0944038 1607A86D381ED6C1CFBC88C4F1A4DC7395A10827B825D550B54507348F68D4C7 48503D8B8E58312163F41456CC4B5AD27709A63E2B553A66B0AEF5FD438926FC 6BC0FFBEBA0C520A8EB9DD2447BCC1396892EEF966B3B21B23AE7E7DFCB4ECDF 0175E531B119CD9BFCC36716668627CF45F5D9D6476183D2EC6F843982A2C55B A8AEC5D2C1212A24CBFD29AFFF95B2E1DE8058F3896E1B402BF23A03A7291DC9 80C4A32F811208649C4218F83E75CD1E0AFB6CD948FBAC0C1CE74F93E8D7A014 4BB6E97873DC14C43D3A61C0D690C706A4688A066E67DCEFFE944F7A76BC9726 509342B8C89E972719A271E733122D7D369C30EF50FB45A8E95FFB6B4ED84CB5 552B3467B30F05D4381362BA0B4C036816CA36079572850D7E8D2510ED69114A 6643E89A78366AFEB1F0B01079D2E50629BDC2500D9222C18A713D87C97B98F8 DC2AA4FFBAF7423BD3C25F95FA541D07820D3D4D16111F3B3DD45971F63E9103 200306385E95FC5940D9A0C1248221B5D50C7A4B4A0A63FC79607D33151FAB6A D6A05EA56607A92461847C10CB730827613C855A776368FE67E737F33F3E42FF 0566229253CF794EDE54C2E2A67C2F65DD9AF70415BF5B8299D290579F0187C3 2A3AB51CC0D7438B70D2FA69B014F4F1A6B0D444D5A12368AF582ED5708E6086 9FB3D0E9AE8E48C093DBE9D685C99BBCFF3E8DB25B40D5037F366AD5B4DB47BD C3D87829DA0BFE1295A6BC49DA2693C829FEA9D4FC79AD017F3FFC084D6FE63E 1A181C605EFB3CCFA3E0C595FF6B4D3BE7A744BCBD0A7C20008061DBE0901620 4C9D4F7F33D8526B819914BAFA0C0699415B9A9EDA05891C69C3D995D1246318 FDD03FEE036C91751D22E403437F1237AD8B974E8E9D0CC699D8E141A35618AE 3EADFFADAC9266DFF07AD4CE9FC55852EEE10EB55B4F158825E918D54220E4AC 69C0E0C6C0B2DD99D03B87CF72B6D764440AFD28B5DA13F2292A0FD003AD474D 0D5466456ED6D8FA3E7A95BF7ED1035471A7B0A519BA4D007BEEB79D95489E04 861ECE568CE5129982D64EB3E331558F5518E7EE522C36B3E42DE61D094DD0B1 E7910F04C52510D4F22A8EA0341F641FE1CEDBB5FAA870D4A8040595D36CD1C8 335AE4CE70D7B7896E5A307486678F0CD61B925D59F62D51F74CBC82D9E48C02 2737EB6D4A126BCB0F61F204DB6D1F4EA4E03D61C3A2ECAD9B4C5F428FDC483F 71D7EF19278B458F0C2B20AB33A0CA9A3C1D25732676D962900C551C087DB990 3BEE7119644CC001D54987E78BF9BD67509F36BE6759922DADBA28C490A6363C 379C46F1C200552064B1CDA0D8B0B7653424257CFDECDAF068C41B82B92B779B 8DBF9AE7199245B4E51109598FDF38C80F91C65499784A65487E1AE0BF233E6E 96B12373460F493AFEB5C0797959D69E5476E283D6F2A09BE0A33CB08F42CAF1 1B588B1C4CFA3CF93395C221D0A0F39CF49FC3C441E560C4B15B762E549B8E02 972FEEF9ADDB4EA389E5BDA5510C2602BC7D03F60C724491A3DCAE2DC67CFC47 F054A6C8CE74635F6082E8C4639208CD508E80FD96D5BD8277C140F27705C4A0 26408D39D7D8687B6816DD88883299741CD45820C2807B4E4423F10EA2F3B189 E89117A202B5E289524323EA92740EF92E779D3B4090A18A7F023786025C7E27 3BBE179B249BA5BA1B3FED3B2AFB2D20D1284B6E434061BE0389C0EF9BCC79D6 4942E4477EF225F709E6922EB41AA3E7FC411F469CAFEBE3D2343388B1BF7B59 334664B2376AB681C1A22D23FFFE4A2BA63C460DE8A91A60B31277DDD68923D3 5B2B927CC8426FB5A229E047860D0795A73D7A95E22DC3F1832491AEE6BFD95F 13A664EFE57B088B3A0CB3CF412144BB28670867782556CCCE5736C5CA59CE89 4A6EECEBD8C9D7A9BCE2BC42DAB5BB283BFFA9CB63345FA75F390F114FAB0BAA 3AB7735DE5FBDA1FC4CB390ACF7380D58CE4AA8DA05AF329EE03221C761E4CCE DB95486FE43A40BEEECE01761D06F035D99B40CF0F580725CCA61177D2D1A9C3 624553DECD996501E02C38C4F4DD5816BC9A6439462FF61D9CF294F3F69FBB17 02B23FA0532D9F9E609A18690E2F5A31C9111E2960BFE098FCE9A53684B35A09 B4F06AAB9E08BFB12F0F87FA37563A8E92BF1F4AB920F16EF89F03C1FC806A6C 7EC6AA8756EACC7975BFA2729A0939EDE1CCB626E9A2932D6681A9E2B91F601D E97F8C3F315E24EF214CE33E8091E8FF5C895EC10679635028F86C9F0FED69AE 2D591E41A102B893BEB6F50ED33FB013B3896F252F46EC43777714991CACB08D 003CA8D565789BB72C4CF4CDF4401DDD146CFD21AE1E67AFE679651909A3CC75 640EEEBDE712AB815CB0640E85E0F1634F12F4FABF06E5EA89B83ABAFA7B8D5A EC936B64FFB9D00A9920AE84C0EA4436B7F0CFFE4E00B6758EFC704EB688213D A3D7322BA4C0861B250C2D02C799E7136C428373B3D598A8EAB8208D545880EE 6834B7DCC33BBC14816F40D7E4CE183F3AB0DEFADFA10D46E193D5C744D5EFE1 C19A97F4AD2E468E9FFB39C6DFC0EEDEA01588F573B94EE04270E86E6C07407F 9920 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI8 %!PS-AdobeFont-1.1: CMTI8 1.0 %%CreationDate: 1991 Aug 18 21:07:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-35 -250 1190 750}readonly def /UniqueID 5000826 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 525003F3DAD7933EB57E7DB1462E9D906F6D8F5BF740206C1EC5F36E00AAFF68 F3EF6F3A2540E5F9564D1C215BC1E7E69C7D04DA5DB1CF195613C9CBF4BAA360 84AEF3E10E24877FBE36AD731DC97305BDE6DB1F934909FAF60B8E28561FBC57 0F5B6225425BFDE8F0C71CD4507B82FF803E9A301397975E38A259DE1E1B4FC0 06BB1DC2D45B987A2268A77CE8DC025CB0D1B39788BBEE149103950650171C94 5FED1063050A90BD38605BD9365D1C2AE42A7DA3DDB9A263FE10BD487F63D908 D4F02758BD9D7BE53E6353A25BEFA29E42B50C1D078A8B3A746EEDB381CCE36C 93FC4BD1A8D1D6ACD0D355E948CFE397B74D243EB51597D251D0BAE6884D70E8 FEE119462E1939A9783414DF59EEA5FF1529F13869D1FF0A44935C5198CC5DAA E1FD2A17AEEBF4974052D06734A409E26C457C06700C55896C90BB33E044A737 46590D9FA242819B9527FD59818D8829D4EB2D26A34CC05A2CC063E66F2DF193 8E4F9670014BC243180E45B51DDB05AD1E6A7F619EE1CE09CFC1A4F02CB7270E 4482FEDF673EDED38EF3173C475C34BFB3F6623C5E942A7797FEDDD0EF1D54E9 1D90D7076C0A9687E334907C22F2E7C603388D8D626B0E5A62B7543DCBB575D7 9B3AF95BEA0DC284A53FB40DA68D22E0D0DDA4D06897AA6D0C822190D6AC890C BE4D5A361119B81C6191E2BC6A5BCB6EDB448EFF624A39B084282AA774EBD006 978CBDECE14A9709A6474CFDFA08AD4C76ABC85B16EA7CEB75BD87EC9BA26352 397C0CBA4112C39DFE9A7B2952D41647E886D869E8740C7822CC5C5753BBA2B1 22D756EC9562EACD19CA523D47DBC02C6830F26E441BEC7CA9E4469EE899070B 59620BC5F575C81CA2AF33B23C4C5C62F9E7F4F8BC95FD12C7CEEF855BE1C04B 9145042A5DEFBC9A67AA32005769E67A81650257F937CF9C70F367EDCE0565FC 55B64B8D6ECFC43CDEDB50640C26701B90458DA68F0BE1A88CC5C1ABD3EDD526 9B40081EC2870E89552AC14E7C00FEAFE5373BB0D14AD6F5EBF0819F3AB5C4AE AE95FA6DF3AC4D566FABDF7246B41B8B611FF927005232D537DAE51D50056EEA BD5FD99E96FF4B942944796F937FCB19DED12151487375E05494565459C4F9A9 1E73B665966A3F4FD7DF6152B1C6B5773AD7319BC9F404F87587F30D231CF5A2 5CB5920C067A9A783EC7D1D1CEEF98ACE53403918F9F1DF929B82044CBEBF070 10C5968718751B9F0375A324C2581F1FA5C997F8BE3862265947119C1024CE63 12A1C56DD1C34BFFDB86D9E29AD610A7F646FB11B98424F29D898EDBEFE288C6 821AE6DD01B14F189FE707573F4E4FF9555F821D5CD25768396D61869753B194 B172EBD0FAC1A43A5695C78CB12196D2FED50C7B68FD28B8523FA1290F4B0490 C8B011359140F42287903C058518ACE5952F7F5BF962A04C63AB9399C6890463 EE89D7166162AB2319DD6BAB3D2A6074A9376AED7049C5BAAB39C06879FEBEB3 815AF6C79FBDAF93D34D6565938DE8C42D9E96EEB0A1EB3F99E7DB92402F28D3 8546BCBD22BEC028DF3818CFA1BF62F68F5B9A51052A672C46FF6E01E55D928F BF2FA905E6937C900E079683A4BD79CE192E4C6F6BE54FD78CABBE51EB17FF16 78E463733267A7D7D44257AE7A264A0AE57CC2F16B66E7CE70CAF8CDA4F7A4C6 E19CDCE45650FF8E162FCE41F354A1A5E378F7B0B49959C4CA7C03F0EC449ED7 21F8CD0CEB5B3D567EC2DB098CFA41D2B879B75420DA4B36EE0886F6FFAAD2AF 03CD655CE28BEAFAEA72F023E4A5BD09184BECBCF0CCF81EA839654236A4299D 3D1EDF3903441F5E88C358715EA10B212EDC9CC140F7AEA09C97A835916312E8 A80938B7DC25BC13A3303E40EAA9DA73FF1F75C76DC9D380B6A95C2A9A06266F 90628D2F179542972E1E6B99D8BDB6D446ABEBCDFC368468D1524D9DFCC12DE0 5DA98A355B59E72D045EF804FF06A15FEACB45AE8021DFA17B15FA61D0DFEB3B 539697134502C919156BE2C3D7DA28B37A7CA198DF3506162793E58E1EA075D0 C850B87B7BDFBDDD7CFE766A7E404926EDB5FEBA083F7058E312777F3565F4B5 F1D0492AE0BF697EE64B4D44EC99AB4DFD5F12406825A8AA63262421CD5B1164 27E5FBDA24CB85411C6A87E6380330E53BFBF89308468D94D7C0171D112FCA96 1375A7A9BB5FB01DA6EF6C818F72AD706975C56447D3BB5A982A55B1D2F32C20 FA3B744F5DC2D2758DF1BC6AA95080CC7ACC76C8866847ED167853923F4921B2 C123956DA548A66E4D5B82D7F27AC721A7FCAC1CD483A9898E9A36CAE8A271AD 51215339AD4ECA50BBF739E4E5682789BE0B9D2DBDE5C2DDFA065B070DDA55AC 1179A124D861BF304D057A07772764A75F032888261A5A947DBAF0DD5247A455 ECD97420726A18612FFCD66D60EA3C5363D2B079B8471BC4F7B01F19883881F8 C86240C386C70AD91FAE709445B817C36101D0B21157FBAF54E999A396C9956E D497579182B93F41C4283B423A242476917A24C5CF253029B1005ABF5F8C1A0E EE489DE064CD63D1ACE18FAD8A202280763417D0AB0D4329F11C7B889E6244E8 D5345135BEE03756EA6CF5941C8A3987C3D4B440E6BE9CF5C18414B574569334 33B2CF3D613C039E0B1763C5A93907D94EA6F5EFF1083E3B3F6F9E1EF1CE8CAE E27CC02AA225E1F9CCDCFF7494F2E488CDC462E62C7175A465FA90B6793CA4AA 5D6BE21974324DEE30C29D44E80260DACF357C8189A82775CEA252D92A280DAD E7F5172E65FCDEC9B3478035685E0B9E745AAF1AE230FD827096FBC22200F74A D1242B8D9F41753408F69A1D5BECDA4ACE7CC15F0EE92CB78BCD6769D59A6BED 5EDB5DF571CEF7E350D5C095EB48A1D55FE6C246B4EE6A5591166EA1BC397F8E 18B1616903268660EADE0C83A6E7C62387ECF428C0EF14D5277D1FAEF1B4DED0 91F561B7ED2A06934345D5F47D920988849D15A3FC90109F7D5DE5CB2DCD8664 8081C681CE96EF8BD985E44C2F7529805703913118038E8045E4F4FD4160372B 35E6717F941009FA6FE1F8F5C016D79F608AD19723E4421BC498E9FFFDA3DCFA D6C4241FC9CBF08E172275E3611B1A2DF7B12E969FEA7BD6D936E2F1FC074CA7 7956D7B6206EEEC8D8A8B80745CAC01414E10539C4EB1E81B532DA98C21B99FA 6C1235D1DC342898A78A4A36CA6A56FEC94C727CB91C5050850F8B83F93E4FA0 5CF2A5A69CAC563DD02B9CB6400C1917A4F80DE31BD057E7DECCB5750049047B 5D0415191B3B84A6D0EB7B8010810CDAD40D1B42E1A12AEB2DDC2CCDC0A7BDF6 C5B5361F09A150644B8E9C660595F03C68D50CBA90A3ED098745E6FA80FF43E6 1934004F0A783BDB85D23F86723248341905DDE53E8CBDFD894824340F450F2D CC3DF1E0C671DBD99A13AA981226703DD9DD0E2AA738A1DEE8D2CA2B16ADCB41 A98CCD134CD72532C01F7C955A1DCBC3AFF6098A3BD0FA56CB78ABE2A978D721 1E6B687DC977650FAB941C26152E86784465802A36C9CD8772DB8E74B042762C 5AE38409EBAE769684274A63375FE41D78ECA795EE0C2CD02A1F032A5100D6A8 1AB5C78C7BB91FDC6572F40DF2C6CCD3DAFEF12C0A5BC17980915CD6306E3E7F 7A4A082268BBAD540C8934EABFF8C59F4CD1624854FC2713C9BFA9A3FC8E81B2 7EFA924A9D6F060C07052A04330BC84152CB6D2EBF19AF842451CAD0BB9F17A0 FC8694AB9588B377AA33ED035312342021F8AD0A81B04F694ACE9F847FA8AEC0 28628719DAC66A7DF03FB8337AD3A401B180FD0F57251FC4451B3864332998AD 7316A2B89311BB017C832B2C6598D5BA719B916DDABC7D9349EDAB8828A89DC0 EB87277192C6CCE85D1644EE68D91377C86C16B77128C006D7141431F46A55F4 D3628911A79B95E5B595D578009145F34981B04A4BAE1988372C733B73188E04 3A39C4C7951336F78C5DC1178809AB90C50979C77568E954AAA9E892DC6E5E92 A137CF2960FD4D4EF4C2AEBCBC8BBFAAA5FC5E419899E67492E980D23D911BCE 73B9D6320D1C83DE47FD8B7EC5B37AEF601DDC4E6936F0BCA5104538052F74BE FE0607AAF31133024671A920E1B2DDFE1051777880073E2EB33B7CEA16B5874F 59F5D20CDEC0BA3CD69531ECD3906213005F408042E62CF8136A5E7BD5CD9B29 74BAF0B128249370E212A9494A7B94292E74C22B770A3297DE4B4F0D487E4DE3 C17D57A72777C9C2DA115BF34E12EC28367028FC43D60B473ECF35AFCC3D597F 5A588467E65AB69D23672A9EBE0FA6B28F68C032C5444068BE051C9BA3504822 B2B8F0F252FF8F868DB08F7C92B1EDAF23D7C131C955C7F5CE946ED7132C31C0 8A93C781ACAF2BA69CCA823229B916F7D4C6392D167860A7EB5436CE23856B66 8FB7177E7CA666055F1E28D4F592CFE64FF47530D0DA848B36BE5C5CDF70D3A0 67AE620A0EF6D982BF39421CE999E39EA76566BFBBF879607227E3A5BA74FD59 4C33F0B49AA35658E05208EC8759919D19DE44A92AB79A2EC4B557D3341185AD 8A7B5159031802362A9B89896884120964CB513A75C64BE7CF5B056A9FE1D401 AB69B7A2001315B41FCE6EFF62DD25634FB1892323AAB684CD9313FBA3AD70E2 AE80CC12906C30D42380C5CAB7EF49247B95C52D664E5C36E1763F5D4F4DE807 387A020699007F4E446965339804E70C38B49F71D8BB7DBB0B93C457BDF69B56 55C70313653B72310D249CDF9CEA049363752C49D9E10F23348E1F45333CD0C7 284E2FE94B9A90C239BE46D9C7E80C47D1709DF20BD87D8A1D111EB418DF67C4 3E6147D436C762E2ACE847D16D08229E29266DB1B581B81EED21DA4B04B97ABA 1AB0BF9C21CF08F60FD564C79C678B208A7AD1BCF15E3177443C54F2103D1CC6 08ACC5E4813E5D264F7BEB5A311D8B8F9BD7C745AFBF5721146EC199F492C4FB 27E7F008797C093E257889FE235D1E4794F83C4EE6D132DE73F66BEC86229139 14CE7D8D368872979E57CD68AA22C039B638A4C18501E173151ED64C41ABE42C 424414500A11E7437196C1764F12B8A4CA14DF1048EA198DE0229EE771BB6AD7 E795E198EF6628964549B01FA8D75921F09F3218766A46DCDAFF6F4D23A768BE A155BA60C3C58933923ED3D179B08FAC5F7678506C36983818694E6EDDF36EC5 1B637627C97882E7DCE3B07FAFB633F03251E4B5F477EBFFC95B05832B4D8913 B85658F83DA887B05D64306ED99D1166AAABA7DC809FBC0F5C1B8802E2A8CBE4 9AD3DC7ABAB15624B9D39CE650A7D29AAD3830A7579EAFECCA7027D8A3811E4C CA69D11F2E799EF9CEB4389BE7CF2CB6EB7F83EF1D46CB89AAE5B63045EBC27F 1DC52900262E6F7AB0C4DD304C3141F662C9A0E5422C68DA17F1192F90F8FABA 8A696E9A6E74BC8840F9A1A29908D906FD20B1C94DD3492F048E0CF47D040864 EA1DB44F8EDDAEC49D9539894BC308C6FC160AC3E9D78BFF62AE0D19C4CE9570 54CA66FA733072A3A745DE6A76A71C4128BEC080750756892D4536F881F768E1 6FA23E41B9B72DC41970F9E8E13A78FEBDE7D9D2BD87B2C3DC4542841772F129 E6237AA93985FF875C75D257C98C1BEF0F4C8A3D1AF3C099B51B5AB09BC8E90D CD30E00FAAE31ADF045EE8E12BB7DD941342FDE567EC5324B124AB98C5088F38 0D5DB74A3A4536A465DABB918F79005AE4A6DC384C29526CF0EBED62D40C9E2B 0517D9AE34DDCFDEF65DEB7E482583C82EFC45C9A0146691222BFAEED6F5A9A6 CC153FFD3B4AED87E82A33F1994DF37AE541D4AD67F648BF02A4E37B1BAC8057 14A8211D682D2D513F510FD60543FBC692DAE4CD9A759CAF9E550E7D99F372BE C40FF9AE29A2671504842AA3306F309B3EE5B08B1B6333C389CDDBF7BC5A34B3 E0628EB4A6E3C15AB484426EDB6F8E3598BE261CBBBCC5BAB119EA9EEE0F68A6 4AC2C282986B1266DCB3407755C6D9E4CFC8B3C41260E7AC8D289CB7C75E637B 7CF333247147494ABD0B85E48450819A9A7B1BC7498180312B9DF608F2D315B5 720CBE15C308F96DDB56ABEDD6625C614E2F79B675E9E0E6BA38C954DBAF021C 8A0AD3BD21847D370268FF41AB6CA000F48447982FDACBB02855BADC49C902AC A1E34E6F32B6ED66BA4B3D23ACCAC41B81104B91B94BF3CA943A997A68634350 7AA4D24CF80E82A0BDB4DAACE4094C0F74AE01C16CE884F65C5F2B7CCBDD623A B22692480A24995E33679450C3F8B21869E0FDFB7AC83150486B8ACA30C773C7 A71F22D2C7BB5CE794C8792D940ACAA1D40B7E492CF827D87F3486A7F3BD3359 55988C48F2E31995AF500F4431DFEA58FFAE79EC39007C702D2852CAF9BB5D40 3E148C98ADC35765886A9AC84C1245E08DD5A7E0C630EA23DB8E9A32438B0D07 893639233C3F64DB42B8F40C35366E5E736A288BA6554976B93D0DC7F4B66D23 88C099DDAA0C538CE00FB3101650A8F2EA4FC57CDFB28184DB2F4F86B17BE4C5 01F9FF0384145271EB43137784EBA87E59DF334C0989D210B5CBDE206EBB46D8 6D2BDED70962BC2457AC4521B5BB8A9DB23904E332B0D9FC480C32EFC2F6FE32 D7F974C6934C7740E7D0961BF45D3F3C194DC66E713E121E66FD473F4EA13B66 D2B8451C2C9EF6958114AA0FCC5760FEE79C0CEF12D7FC95CD6D0E920BDBFDE3 D4F40FEF7BBADA9344D7D19DEFD5D9914BEDB63773ADE228C38EA51888D72A2A DB9289F10D9073E3914CB70C5462E1B62FC1A189E8D203FAD9E5E8492EFE38CE FA487E459B625BDBEFDA4C342956754B9BC82BA4C53D6B9D19CD5DDE6CA5F1BD D471C2D07358AEB56755F783ECF59FC40AF9DCDDE8FB135F385D16A940885C32 E574C0C6F798EBEEDC401375B7BD82CB08FBD81103C813B89B64AC656EA54E21 6DD9AB9FB94CD941079349BDA99E2A972E3DCB7E3A5C2AB6B585344052FDF290 A3374B07C8B7A2BBF04512D38F22B08BCA9714BDB1E1F4452476F36BC0CB71B3 DB78FCD012EF43168687C797E7F2A45799C51F09320BAD086C78681582D3E00D 9C7FCBBFE620A3849FB0A7ED8578C8E35892D00F025E39BD7191EB1DECC27C0A 4D3FB14D2FB1557762D9F5AA73B4C9E75120F0B662F844BC04602A26B124067C 46D1522AF395989023746613B06B960C1D22FEE9C775DC6D4F81185DB199AA65 BC43969BFA041687A3427BF76A580CEEB52258B1627DE23A0F0CDCA0985A50D2 FA6C1580FE1D626B62198B09D06972642691447406887D93EED6A4362CF70B50 4DF9F5E6539B6A2F395900A64C91BB957F9F79C4B4E923A69FA97290500071D7 09C0236D05B5B01FE2E2AA0BA6EB757B2F6115000C5F75C5D36EABC61621212D A01C1DB85144DBBAED059C6C7A6BADB453A7F9B5D73FA07BCA1FE2B8F6243889 1A4F615E7EA83485B7B409361AE2A113FD7D48D76285DF79726F61CD17ACAB51 742D47662F5CB0449C3F2C925152BAA2ED427E0B9C87483456A65C491E163165 E08F71F985364AE875F0FD4444766B731FBAF6E54D30D5CE27C0C054C1B5B4F5 4D4C966A0D480F30828FD5091DF0CA0A2696D70B31F802131BE315E31ADF3F19 13E5D9A91F664873EE0787A273A46900D8AEDCDEA58A475588DA10DA11F23F8F 703A3E315CB804481F32EC5CE408C95CA84E51EA91955EF6029F19185B69CB12 BEE7E85CAA23B57980CA0CBE395BB393D07D25CBFD6EFA25F39D1C76D24F3711 713BD6AEBBB79C10605A49E7F3160E28F5331C2344A2A6D4E10ED30D8A6FEC6D DB556352227FF40B044B05E37D5AF701C58DD0B1A8A5A568C71C186A2DE0942C 3CADB0A41C04909ACFF2776E8713D917916900C72D92AEF4F609DAD22D55B693 D56E4DA5805459640B2C400B08ECDF4FAEED5464B88D26793F7E1D768181F6BE 15CEAB2AB5E5DCDD3B8CB05C157CC43E160CEE3D1F3C26DFF2CBE64805159CAE F5BB7055945E4A2C873E1EF54F93FA377F137D17DA23A7F2CC96FA2B280FD366 72F6B69AD14D7F7D206DF30A38986CBDBA75A3ACCB870C792E2BD2429C3DB6C5 C5A1C5FDD1AA85A20CF32BC8A1287824D90F76E913BEB7B5242219E2697307D7 AE02ED4AB5B61641B3FAB6CB0A0366698CDD0215AB1F137332A743FBA3BA35E7 A36C80F91CEF4B1FCBCCACD082D0A826B88187EB14E2841A655A9A378EA3DCF7 5B984FAB62C52503EBDB1911ED10149C87E7A43D8F24187C3015A2EAB3A7288D 8DB0971E769299F9014A1EEEB1EDFF5CDAFD109E5C0BD850747E7C14ADFA4C98 D76979627A8B1796A3536D324177D406E420B20A5AC4D96011BCD5E2E2434575 1A95B5898A55F71452EA4296040331D8DEEA2E05D3C5DBD36E7CB6A6C4014B60 DED826A011A82971D6661B3B9F7004BD134D6523EF780F0E08F51E06BF14F4C9 47FAAF314465D5AC4EE9BB267D67BC733456BE0B2ED6A226774A0A352F53A2C5 9128B13921643D9C61616631E308EE8789C860EEFCC073BCC465F87B2B280E34 2ED7C5E92CB4093C203FF6E4BFA002C7C6EE66B54E3CCCE798B598DCC45B8561 07FE19E1F439B1840567ACC60FB584262BE220F8307F4D863C6FBBDE9C672728 63BC5F021F61CAE985D2FEF03311352DDD29C3BF1F3922C15FFD186420C0B7E5 A9D74CE7B57613A404B089159A66971CA7DF3F0A7FF592C11704A1B7E183464D 992ADD31D550C7D01A630F6BE392515199DC960F07F7C085EABAC70DDDEE8A54 A8DDFF00A428217E07A47C3DDE09D11BF24D6EC1A2A8236CCFAAF88F38EF3DCB D3481CEEFA7A6650858174B2FF7F397B5D6AD131667222B339EFB32055C58EFD 54D9105F558830D1DE47978B4F3CFB3A6C4369A39040EDF7D48083B30698F7E1 C7ACEFD3CCF162CE582B4A1454631F38EE90F2F76117D90798FF8F9E1F478BCF AF7D9C61A86F9A182B14536C053E67BFD3DBDBBBD708B4F652EF4F76E8C495FC EA50F159C0339C45B49A667644DCA14DD8FAF2AFDD59E87099859BC61BDA7A2A 0EEE12C1B29E03103B35D3F37FA7BC94999661612935607BB25FC77656B51758 EFC100F6B0129B831459D72ED6B8917DF1740C184DAE88DA011D9C0B2C99F45F 870FDDEED020912A07FAE394FDBB5A77EFC79246F332047EC582C5F41BE8B059 6906BE2CF36D311E3B52123638C77AEB186C507D1F1739ADBC63843EE3872EDB B2FB075480CAFCE863984625BE2B041AB16AD2588F733C029389951105B49125 5FA11677FEF4740A8F4BD8B68038B70DDFDB10A712FB0C1BAB75021FAFB00220 6E47EB5B9E1A063AAC2EDC7D496C48D868DD20834C429064DE11A437A2A7936B 6E8D2F67FFD1F5E79738B2C5CC8FDADC979A22AB484A33D132992B9B3B7A1397 F9CB19BA5BFF6B2EE1FF3C59B794EDA3CA702887ED6495ADA9C90DB62FD6ABF4 E3231A54B9B00EB740588ED284043CA44E5FB49FA6F6D9192171367A86A3A9EC ED0A722AB88F07B1F0E7249B13002DF29AB031EBD71EC00DDFAE48DA79E5160C D6E7BF8A72F83F19C85A8B74E4F87AAE59577BF79D4525D7E98C852F81CC5333 60F077013CB14ACC2DAD8A0432BF0888059672991CC4CFC28D023AA8F7E2AF92 91E695D90401059C730D96577EDD159CE27184C6F0083D73BCD798AFD71DFD74 0F2B8B27F6C82DE6FFF8828733ECFE3BA21E6CDBE715F00AE36FE19A614781CD 3044F566CC21C3531D60AA1C653245C0B74834DD15DB095CB0A2DA9762C66A9C F691EE93DEB9CB9854D9B004FD7F748FCA0CA336A03EE3867E2DB9CBC511D569 099A47917193AAC9760E9AA1ADC610C09D09E139FB1DFC32C4DA1BC33EFA46E1 7229EEC6520F6141F4ACCF08C5367898B3A97011F6A1B741E1CF90E12FFA97B5 4185B3AFC66506E9302E5EF63CCA54FBE30633B20CE8D446FEA25B10F1960392 33B02B37DE401B68DC3E96D82B0EAD8A9E9D197BF5F00325F9D8B415A2B2B0A9 3EA6A85745A9C0A837323F395F44642A423DD2C9FF77803B1F51573125A15C29 7C36AA77212BCDAB3DF487FA53F935F69A111A8D749EAF122065DA475BA61623 498F4B33574C47332C15A6707564A8C189D00B9D380A9902D939A497CE652B62 603EF57D4BC8D6493517B48BC78C31AAE6F3185F8AFC0434FE6FB69B7525A73E D10C1C96ABB51A0850632748470EA0D2CC7D75E334D986C15F7999338581F8D0 99539BF9EDC2BC5A5DFDE4661D672839FD5F515313C8CBF171AA272BD745C8C6 CE4391D11C8C91E4F34D7E813B75377D1E9CBF13BB703DB371C286C51FEFEBF2 9075014E6D9137BBD359732B45585405030ACA06EFBC7ADC7F3018D9E8AB4487 B611DA8E44812BDEA12B5A5CE6135696B4416CCDF2022A1B14417F867517677F C08D97728FAB09CD6AA8FA8E55EF02FF060643D0B2224FC5E7EE5DAB0DFE3872 D18A23D6A27F98EC2C0637166F8FA9EC1310D01F735E1A729CCA6D5307AF2F51 C59936C2D6ED3B0238647E4980B004DC0F20E411688BF9A349C007B5C9A7ED95 D34DC2C9586A3CD94449652749B41866DA2661C848344437D534384D0F4D2D2B A6267C2420E0652E68F08D5321C77D1E5698AA4044B1267DD9E017523DB4EFA7 A848E4480B37230DD298F82F77C7DB14986AB58D4EC5B93D478AA80AFAB6784B D6719F1557BCA4EC3D5270CD7F172021F72C2621E64ACB2ECDEAD8A5DAEC8BC8 CFE02D7E9AAF4CC3528E37DFCF5FD4FD35E7936D2C2D12B2BC9FAFB1CB67C74B 0132C78A6E5C89969B6FDDC13D63AEDAC4B2C261A38155E7F8FFC6DE4421786C 5089F0E151F16D375C599EE2EE0B64B39A5127784EC1AE9C6F6D36AFB7D1F406 23E28F37DC49E43A15DF71D9B382BBA2855FA733A3F908D608FAB62F14124794 B339AF75EBD0D6DD858791371A4306CA6457156AB46FAC6C99E99A09FE8B638C CF50605C728AEF2AB0B2681AF5328A17C52AEAED9B6C47265E4C0DDA20BB8319 55D51B499F9598D22D312E667CB46C41AE72C76C72F11959E7B0AD4F1E5AE546 D12FAD175BC19B19E22871A25BB16BCCD76448390C84EC7E1FD8CCCD630CD479 5290CC203B64926BB7FFDA72DF7A39EF0AE843F222B21CB20D7E285D512A55F2 19F2FDF3B34C83D5FD831A8150590342868330A19F10132FD7B8781982A702B4 185715CF2A9AD16A71D3C848024D6AE46FE7B27B1D73616E07DAAC31BF2697B3 1513C60615F034BBAE513D0DB979CEF231928D39CF236AB3D29AE98328711205 0ED62B6996900E7591F2F5DB385D2E3468490282860F42A267B55D7AE3CC3943 09930666EF171DCDEA01F018FD5424DF925F854ED79106EC7E4B1D5EB2EA6D26 AF528F860EF8E4BD05EB9B3572FBA4C4238A79C7AAC0962FD74E93B4B5CE9A53 8C769482DE6AB9E2624CB830972E4C6B1DA1568DEDBA9F7F769EBA28F460B050 AAF2734BCD021B1A8AEC6EA551D55571CC58B97D71B58A4A706FD969B555F9FC 6FCED6E62132CD50FC332ECA7435D86B11DA3F6A66BFB5476FAD24CE1AC3414D 78B61EE01A0732E3D138D017F1A4D8181F89031664DFFD2249A15540DDE4701A 1D7AA6388D50E519C3817E27327A24ECF5AA93D69970341CC0B1A7F615A41704 40A480C393206660E90ADE9E3F63CC52F524298D47B52AACD60ECEC9BC33A795 4C59DACF1A9A055EF082FD7A00546A070621C7A4CA802217583F0813CC8A9DC4 24610044FD974269974BD702540A480FB5712B21FCAFE9A70E0EE834AF1A388B AA338D155CE961535184907D1B5142D2C34979E502233C4DF79090F5B683F78A B341D3FCCC82C588882323ED6A1CD9BDEB5802900EA5665D29BAB64E745E720C 970EFB2A75851061C0FBFFB32D9681CE3EC4079F3C2B6436DCBAFAD891AD2EF7 CF59704A5FA1A84C789067DF86C55436A266563C4C71990BC57E2517C71D604D 32C623014115BDC4C3F0FF17C0D0CB09D7135D2E48A6BD81CC2F8A9A6B358D60 9A44B71A96185F0244FE8CA8DD23C7A7995B1BA04A9F22C0C1B12D7DA518FDED 54D19B51CFF66703A3BADD87B395A126E7BE50E7119B4D0B93408B35AE531562 0BC942FF37249672F2FAECDB75689C8F64E2D3ADDC51CD2E9E2EAEEC38087698 1B6D6D5EC6A19FC79E1313B66C209947DF73B76FA5D214EFC08037EBC238D0CD 8E486C24DD7FE0563B920A07B4398D20FF7EC995FEEE68D906CCE3DD1F03811B 3EECA063D01C31273554DDAF03CCEDEC41CAB59A06014C3E02978DE7E28F4154 FF573358A98CEB9D140E4AABEEB64E6B6435D089A19917025243E1089614633C 46AD985898035EFE5D88D3A04CEB20EB897ABF3C776FBB4F070DCAB301A31372 ACB63D1516017215DD0E2BC75767EC2673 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-32 -250 1048 750}readonly def /UniqueID 5087385 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 AFC27E4A7E07D09FB08355F6EA74E530B0743143F2A871732D62D80F35B19FD2 C7FDF08105847F13D50934419AC647CBA71DF74F4531DC02BBDA22AEEA3FBBBB 407E0ACC52BDC60D01A29407CC4F93EB8BF6D4813E9BA858D54F38918AC82720 4956D50291F0546E50FCAFA6DBD0099123F5ECD4AB338DB310DB4CAE11337A89 8ED99B6F483940C97544F888EAF0CBEB11094A13C073D0061808662A04A82BA0 AD35E8782F854AF66C20C0FEF18D0ECDD1646321B93D327E53D88CA0E825FA95 05AA57BD77B0AB2506EBEF3A5AB3EB6E18C449F9133377E7D1E4FA6547001CA2 080D2E9119A8FFE980639FCBB3099943EA7BF33B8BB05EF83AB44078B6E6A8EF 7E7CE75F84E4C34CF1C0A002D074CC093D6405C4D49A54A3F3A4525A102E98CC B99FF6731977E40186DDF81CCD26D4FB10DEFADE281311922DCCD310D5CA0969 2B638B83346AB8E5DE35471E9D1B7B014E28E0DB5A83CD63055215DCBDE003F3 E6A2F698C9183CC6ACF52F02A2338974B58BD43A5374491159B4FFFEA3D02D57 E66E8756F1531087E7F7E5E5D4271B3731F07DFC2E5CE20DC49C380087AF6232 2472AA17AE3C982C357BF92DDF96C2DCFCB1421D49CA21038A3DAA187E845CC8 BAB2CD9278F1FEF973D7EE6D3051BB16AAAC2B3C1479AC12AD0DF6F3DA1BEB3F F2567CBA368A805377E27E3E830BB24A4FF74BA6CF749678142FB035DDFCD2C5 7A2BE2536FD9F26E1DD19E5294681097B41BF674C5CFDFC8C8F35ECF32160FFD 84267A0CD469A786D4F7B7F6170D02D32E6377B75ED29BC0E0DF7A84643FFD38 0F076325CDF3E8A2B95FBECDA0AC038635BE0A098D278698A564C45D3E74958C 1653764791C16516699D54A6E5F542A683C4DCD55F8B7F1F50BB03A75998CB7D F1303AFA5FADDAAFEE07C6EE6991102C14F7F7199E983FC906C2D9B103EA7CA2 5DA0FF9CAF214C035FC07ECD2227A31D3EB620505520A1661B6722BD818BC50D 8995E480359F4418F813FB70F685AE2C65F1795E835BAAFAAA667C77E1716968 36842093EB30EFAAC3C08D4C218153F3B9CFA129645E9E8DBA1902234BBEAAD2 BC61BAE2747B5ABE7F33A123416C485BA7C0C4CA284D539B29CB07B74DCA4C4F C4FB9599CF1A54E68ED6388616EC7D71287E0A8D0385B907926380C60EF6F0FB F172893C3DEE728DA5C456068946FB03C3D728593B85B01AFF4F3766C78D1C34 91819B89E823C51FB01F35545E26D55687B66D4757F67EF4DDE7ADFA014CDDDA FE5EEB2E35F5825D97D0B9AF41F02853158F783FFF7701A889691800576F732F 22BDF8F47D37A6BCFBFED0F2793CF499402C90CC0355914C8441821E9D5A96B9 C2A60E9924E28272A96A5B15A51BAD8F0F36E25805D5EA93350612AA976A6F13 AF74F68EB7193D98BA60E707569EF69BF0D517947B19008A6FC35E34F832D612 34E590A832B6B557A5C5CD4E81F15B9E04F35806F39C32BD21B2F338D99E28DE 815701DC6719E5D47E8F7072491B465A9CA73E13F66850F5E624DB2C00C6CFFA 59E824FE03BDE2DB500D65E504258460E8BA021F937BF98CB82C3728FE6A8ACC 5C08A98A05FA97EB7EB3C389C5DA11244C460315E40A65711CFA6FD4CB4D4C61 B1BEE86DB0240CE8CF2091A6D0B856B194A60DDB9466510145896BF90A80BAEA E43E1F0BA3CFB1206EC050A0452B383EA83F63EA5D5BDC19C874B0C7D3A1BE13 6D15F9485C2B6FCB2B3D342882CF8E24730F69A1172D25EC654B609CCF51000F 08F2041BC4E187F5187DFE79F789D826222C78D2AE12415D40DCD433DA07662F 448448F05B017B35E2B923852BD31E42EE72EBF34D082855C11D0BBB2EBA5C64 D7E111CBE5499A65C1695463026A8FEE4D50D8E29F5310BD9A7CCD64E8A8F439 24EC3AE261C41827A8FB4452E2252664ABC0DFEF43E3E675AA383B20881763B9 63F27C00F44E3FE21D4D47B4E7A400DB2555CC996C7C4803B34E3B95E70689AC 358FF4ADE5A674247CF772B3BBB24F4B8044A472B46A79316949D85918C6FE02 AC193D59470505003660A358B6ED4CE49BE6E9A8952AE5F678B542AF1BFB61EB 3DA029371477809BE1484340F535040C8C1E2D055D9D701A8CE799A82F63F0F5 356E72D49502A059B22053911B58A664CF15089816FB81F8208833E3AC3DAA31 D8D4E4A45BA362BEAAB4BF1131D3B70C818FFAD8E1D36905A55190F35ED0CC52 A168357C0470F402465B7215AA6292DFECBFA4EA9675D394784C852EDA2C1CC7 5A500F9FD50D792A052FB8255FFFB6B683205148C5E5EEB917E684C65B6B03C0 1651087F7EDE8580BCC1D65DE6125E4DDEDE6560DACFC0E3D4840030C5337BFD D95E4D9450113E0CF61FA82207823E6AFFD208D9D3426A87F4431967E13B765A 8958E949C7106C12890E64261632988E145AF113489B2BB0BDF62846FBF2C593 93D60FE46ACC0D354C51AA0FB5F182C8FE9A558CDD0433BD1F847023F261E0A6 40AC9C8667A143E25919B99E4A15C7A35533907B6DBB3B67AF9EC3F454C2CAC6 410886FCFA5921B33D7BB884E4938F559C972F4158E1FC946BB033951F8F67CF 5BE682A23C169DB6A7635AF8CFE24BF7B037D7C9AEC3F48800BD09FAD9622502 E1BDFF583E145FA2B370006B8034E431DE658447797A4D855AFE65A2234FCB79 82649B95D8A151AD275FA29B21AA626698F1EE00D6B37BE32F4D94E5663180F5 DEF6F904BA9B6CED7AB88EB0934BAEEBC14788E29C43D5C4C17680D96B63BF6B 93225004375BB27EC807699733C1B0A4039ECB3ED98ED768E61CAE6FC1BC32BE C53AA8D676784AB8B2FB748756258EFACE453D2E953784EA5E9BD2272A6C4837 2E296EE0A5A05CFDEF97D47F685AEDFB4B4BF6308CDDA71C337F919E92758F75 E1AFCFCB1967E4B224CD1EE2C1AA0CA7F732DD635D362C03A2961CCEF377353F 0A2F3632CD1D298D9F48A17D8837866BC880D525E7FD4C2DAF5E7A041FC4B4EB 0495C34E8A14ECBD8055931A74720E9ECBB0835CE563CA5D13FE4BA65F1ACBBD 549160B35CD6B9AFD6C23BC75E4937B75EB35F4CD559793EA810FF9ECF4559E4 B99D27C9B34A2F0B39685B9784944A1BE68FF8A8B418436F9F553D2794E6286F 011528F82122D7525F52F98AD71E19502E2F80D7BF20B31AAD6A991E81F94F3E D732CA53E366BE3140FD5DCF078BB981C71400D9564A7E121599DE27CF1673FF 0C0142FD79F706C4ED9677D41783E5C752B3C0B4F38A44AED62EBB59DC81CD6E 838173AC4B38F79D9B421FECDCF2859AF6895A03CCB39307A1D98C1637D8D783 0AA1F30F1BD34E06B3EDEAD45E0122DFCB1ED3A5348C332749E8404031628E48 16B2D0149F4DD09C9378ABAC76116C1C5ED8DA7FA956084C04FA0D07730D9C95 FFD0E91DFA431C072DB087668DD442A18646B2A04B9D685645D07EB10DA2B898 9D60C14315F718DCF4BA0BB1361314FAFCE22BB6C2DE5E46FC798ACCD63313E8 A0C12998443188F35A240206AB69F0196F394FC0F011E2C7E366CF677D1CA321 B933F21AE936EE367911E9A196416FDB71753AA7A418EE229A4E475F4936EC00 E36A7EC80813CE2A85266CE3BEE700DE8D294D666526BD0B743D60A0A3EED996 9A0ED9612EEF9A1D74D52326C8A4AA802EAB495CA1932CDCD4AFAED7B3742460 086882A0EC9E0F6C0B16C8C113042DC4CA061D033DB9386D2479CA980D3688A4 AA298C418E1A97780078023E10850F1E0D2509354371B93B061E2D60463579F1 3C4CC43E985C792EA69558C3FCA15EABF0E835B374A9A3D24C157CF482804DAE F32C5D52DDFBDFCCBA0A353656A8E85C2F9C851BBF644951B95080B14C23997B 4BC49A4061AD16D5CE4293656B7C75A825F2CCF5651B7C06F8AE24EB63BDCA9C 44247EAF977369EEACFBC28829CBB2A76B0E41BF8DA03F001879E17F753FEDF1 56D261860ED6B7AE8D9A2B49EFB1120FCB4D1F0D15DA08EF6AB3C50D994B1D77 00BE6F78640C09E5EE058002C57BF29C047C9EFEA908DC6B2599A843DE01575A F03B45221EF55C7E3ED63E361A924CD89F97A5C3F543F121695E6B08EF08C212 ACEC17607308AAFF9E16E379C7B32C10C2CD7DAEC9109935B0A0BAEE21CB3AFF 0E91DED2764BD29311FF859BBF4CC57CD7CF4CE7961BE90BC20F0DFC0BAD65A7 FFEF9D69A8195CD3C31448AC7BE975679EC5E2AA172BD8FF801EF3A02542B078 ED18C7958435C59DD9562C18B9469D173EEF257A9940BEA7FFE0CBF0AE5407A4 7922A2CB3A2CE46058742A0EC24DB6CCC50AB25D95EBE91D45FCD2E7647F3E3B 8E47F2E75928AB1D86B610A7BD373F6DBD530EA50D5CC4168BD8D87904215EEF F8685E0155F8BED0E4AC079C7ABC161D2351AD4C8BB4C795AF2D45935667BE53 094482AEF35AC2F913FDD80FF5A79B7029D2E2DD44FDB43DC4391B6C70936D0E 2FED26BF2F34B0C1B336BCEB25796726DEBF830971365C3FEB90E470870ABC0F FB41B7F41167C1651F1901F5906F83BB6E4C36ACC48628F4FF41DBA30CB38092 848B4E3893A5EAB5697651EBA7EB1CAE166308AB444A586B29B1484B620237CC D7FA0E7A9030A9443CACB86F84FA8B087F3D7AFD95FE8E3E7BC1AE720807A71C 024CF327FB4D6EC2F20BA31C1895DBB7840E3934CF59A077CC6A901A3D65DBAB 9E420221DAA2629FE20E67186CCA6068FBB783F616F99798D61648059D446DC3 5E0B9BD2C5291708644506A2A3335AB98E25A5577F51E4771C075CCF57E3AE25 86D84D929AD78E6E3B97598B0E083E53FF49B7D03E950A9A33C3703049393D87 3B7136F0A063DDA0D1BE6DDDED2873718E93336C72E12ECBB8DDE53F62724D20 923DA0D5541EF86D450A8CE6C5E8DEC7B5EA675BD55DC955611188887F29E5DC 36C9A4751BF2D2F9B99941BBBB2269792E1DA3F73DC422B7C2ACFE50BF2E8749 63397FE49E4070101B7E2B7767BB2EF2982096E584B759F614EBC0BA351B7A06 E248B4718FB0955936968310CB11BDE41FA2653D49F41907BB886A7DEC4095C9 766B866AF9EAF9140BE36A0880CCD2C23DDFD78CDD380159A33DBFA2BCB3DA36 5E18F7F57ABC91CD13DAF24428AD4B7E1CDE56F01D90E9E4B00B268071188236 A430C79543C67F960209C582931EAD6D6C89853111864F7DD3CE3D0121193DA5 6A3F30EF6AED7738178452B8E1DCC88A374FFBEB6AE746AB0D0663DF66456937 049930536055C088816B2CA34000A667204F3A12E58A88EBB93834E2D9D33A0F C52637C8A01A452434DB87B3AD5B410DC988EFA3983EABD3070A1F1E091BDED5 E58C4C24E7A702C9056260D34B7A4D489A17931BE5D443875A7EF9929C97F8BB 53A9206D01B51BFBF09EFDE6D43FF74987B5FE39DF26E777029CD7118A680C98 9B659C63B9F71FD718F70B45B6321FCEF199A8F80DB8B21FCFD1152BDE857E1B A8E4978790A24C4094610912FFE264C9BD1C919AB29D8BAA95E8669362309626 E15B6C8D7E854CC29B33AA405B9A43788D609223C89C4850F96BE37F74EF486D 36D91FE4E5ED84BF980D336662EEDA4B6FD590E7D1A784184F242F0BA25A9725 C96B0B448C5AD612EA8E880E736267BCFC3CC470A1D813F5B416DC04A148A86C 6DA55B7C05411B1542DBDEC10B3BB1D83977CA924F51AE80C6E506E0D6377AF5 5A6687D9DE2DC92720C58239F516D7AA38F68BAE5434FED552E6E56790FBD1AE E8D553B4835D0E7C71DA32DE22F78136C40160E314ED890BF6D6F530A89E7AC5 FEF1B94354A3BF252C099B942F89BC7853826BC150F96E50B2221DCB9FD34908 AA9AAD19B9C28490492141D07EC5D656BC05A0219FF823B69971B1D9944739E9 1F5A8C8F6BCFD49CA8DAE48AB9113A921572A58EB7C08C844ECAD15EFEA6A248 1C9DE2DB0B90C4198C269543FD5FEF11C34765E273CE174EE99546CA66DDF72A BF35C754BC967BB53099D09022B799B2061F5F24CF39E47DF8BBC49F23BC8283 C3375A271E8DDA9957E1DF1B3FACBE1CBF8445ACE95158C3C74052504651AD03 F9DC9492502D52D8CEE541AE4931BE2B89BB6A6E68E623279D66FA7CA4FBE9AB 50580E65DF7CF5AC4EDFB4F213658E0C6D81F4485BC2FC808297AFE8D967AB6B 9DBFDE2E31C1BDD817D457CA6F4DD8B922DE98A04B3D00E894B527B35C0EEEBA 13CCC4FFCAC0E436713E7DF94C1F568993D3EF1C77060503A812836E0CF8BACA 247A8366D084C2EA08CBF57FAC8EF2E9BD357373FDCDBE35FCCB1AE159029BC8 2CCB35734F0BC31B34AFD4698CADBB9C50FCF720A4C536C0B6E881B3EF02C150 0850DBB2BFD5B54BAC362E6FAC6143459438EA17B79F2EDC2D21627069D31D49 1F7F214561BD3445C6A993A3F7DFD3B93F1E4955A0E0CDA2350C7EC8EF767C65 DC01327F886C8DBA0ED67AA8D05AE81CD07C97D8FF0247602975FDD5C9BC104F EC00D08B31EDCA8B4E080855284369FDC40D6B8924C26D870E328A45C02F7534 7E2C5A6DF7023000AB2110C231C5066CC2F8647A036DBD066586FBAC8D21E7DA 2E41250DFB1384DA97B1B78D98021DC61953AC87994DCF9BB94A1BC6F605D146 CC480D3A68C2A30AFE51F2C21C3B026A11D7FBD31F0A57D77F902B97C1A382D1 9D210628210A037ED252DBDE5E949D5ADE5D84DA934345CAB630A9BBB4DB8948 9B0F172CB89FE697AC39708D8B125EBEDF1F72CC932B9ABF77466F7E9CF9EEF0 B6C70CD6F4E1C6C8359C9155CAF8173162A2330F2A49FA13B7525798B87EDBEC 7238C8B253358E6AE89CDFF4F61B17140B13C70133C99FE2A5E0A67AB227646F 01DFB7F06A3BF1FC8E018DEE86CA4F70C64A99BC0C11B40B2183DD8EE242A64E 5EF61F34D4088AB2C49ED7D3674F4E48F5FC8755D4075810CB773086549C31A4 61BCC66B0DAA658D5791F62C2D080A6BC7538CCD8A4E90F3E8855AC1E620741E AA88CC9B749CD01D8F89F8A97D2C4F04EBBBA7A74F2DC893EB194277F92EF5CC 44472B6C0D35CA851D7676AFDF7408CC9370603B3DE83CAA2B6C66D801294ED1 B88C3B68F2508CB7F466026C64D4C417D737F15A33AA3ED9FF42DF063D536F4E B6AD2B13D23CA607970294D7BAA76E1E959DAFF8C2F36324B16B9C4BEAA790CE B618010747CCEA3D62DC1807E42347CE8AFCD126723DD27747F4F2D4A744DBAC 0B8664D0A5233F28F6819756D25C5EA0505341EDD85A64D72160A8F69F836147 6FDBE27D869CEA6683D73106D1A442B3BB1ABCAEDAC7BEBB91D0DB05ACB200B7 ED7CB279237E99A12A36C82B021721457C5002E35BF901BF5DD54B855FDA3D82 FC4D4B6C753947376CD2068AE451761EEFA5F699AA9F807A2634AB3524B86D55 28D1FFD07B3495BB205E3BCE51B74ABAA7BBF1A7FFB641FB3A54956B4B62D06A DC50C1C6A682A0A44BB44F6D416AA8D937DB30CECA20D33BBC345D4AD2F50224 0426AEB46AB17DE753599EEEB23AA76910B18A7E8F0883B1246544E9EE279A49 CE66815312B1D2478B12C9C05B6EF9ED7AF98FD60259CD2235055A856177AE2E 3E2D406FE6D272DC8BF755760EC845345F0B5A90727942354A951ED5D132A74B FEB66E5063D14E552CBC4F32B3B88B7CA10EE8C1F673E60A57FF21EE65262D7E 69A2EFAC35F21E42BF5A8F9B3A4C64B0CFD9511DB5A8DD7EE33A2155B5F1C71D 7A62C216D9F3789B374549C6C599FB5F10C1CFDC93A8FF803C64D44CCD073C5C 43191DABD90F81E8EA6F03217615FEA70057350202453D568522306DE13D0EB7 65E01E30C14DA72D13646B44FBCA371B1EBF7A5B5B58B8148CA488A384DA16E5 E4CBF8F215243F1737C81BF13A8A68FEF466FEA08B666900730B05479A6936DD 9F1E8881092FF550A9B062E7ACC17280245F1EEA906F73EA4348396806145238 F77709752E7D50B19A96649B215B618EA432C90DBB27FEEC0FE4E06895DD9D67 F268B78E4550546E194C74F571E100B1C39A58E64B0CDCDB3C67764E482AC164 84D5806B988A19B209048CDF6C71F9193E4903A12E6E97221616B57AD72A9D88 D7C4C2CC64E967D3B3F32E2C9DC7E07B3195BBA22E1424EAFA1A1499E62B4AEB F0D4E136E2FF16B018D30D9F35317A54C1E84DD7DDBD4C1C14DBB2B8844354AF 0239A8E1A14E5D7204A990AC1CA42375DE7249F110237858C52B043E0A5616F4 6B7E572DCB50EB328674A90B3EFBFC17A612E438895133E4298B61859812E167 AD180D3339B47CE19137D0D60874AF6E75381D160E413A1CE594F263AD783C97 6DAC465C3A7F10E6D0D6FF7184AE6384A505C49FD73F07925BCB51F4B2663251 D99EDE4EB5D0FFAA1C1FEC489BE190A841FF0119444DFC491E1418087ED86BED A0F380EDB78A11CB35E37B643D890887EFA19FDD6A6917F3BA94FC19D28F44F3 5D5D26C284AA71AD2D54D037BC78D64A80DA55135FD2EBA3D8832734710849DA 93BCCB2A327D5D1935CCA340197CD36D33D88FF8AB6BC7B113D26AC9E60A7C2D 39A813FC6835585834FCC8D401FA4953090AF32AA59A04055952364737B618B2 4723D4990E13CA0E904659973C6537603ED761801CCF32A5EE1173CD34065496 60FD32BA2F4994BD6A6C6EC085016349F4ECF01EDF03FC11CAB0BF2FD33C9522 D16E44D4D44554E3370367F296374D100D3CB86D335CB23D7F05D74B18E8FC86 49B9DD4D858EAFBBA0DFCEF2B2D007E72E851002B393C0B6D3C5CA147574148C 80FB756540B13973E74FF8279D0F0F7F2AD411096770178D41924FB3EDDEC531 96B903C9C404FF17E0F09A8576B96845A17AB8177F7D9F42F2273D3A9256E669 75E4AFBAC0A1C2C45AA659273E20C9C90C9536EF7C8C8772EA235A98A4618DB5 F1610E3C72F6897E7B1EC53A17B4B1B29EF3FE50DE611602320D7DD5C29BB753 AF501645A8C0F62121DA53ACE9675D7C17015EB5A2A1B7CA369EDB0785DF4B73 818AF92172E7D949392FA441E315A52CF6ECD798E2B186DA2A3A9611691632F3 E5DA11FFC49D98F91797989E947B8EC83CD66C66503B6D6E2A7FFBD8DB8D4A1F BDD95090A0EDD788561D13D844EA1B03876B45C27914456EED2DCF35DE73D3A6 534CE898A42E4DAFE983E3C9E7ABEEA930DD3F0ADD2263E900D3B0222F0DBA6E 594E215BCF5BE9F80BCC4319781423FFEC69425EDBD2D2B90D95AE0365C6FA62 1508C0176955C33F040FB04792267039B905C6E9D516FE557B46DF22B9672E64 93754A35E6FBDD3F61C343B376AF5C62ACACEBDCA956725B0BB2D37A45CB1742 95FE86656B029AAC28EF870A18A71EF18541B7B215541E4E5E2F8E4805A7B3CF 1A684AA03EE766D8658958498C9C3F73CDACBBC99EB94D33751E9A0FF531CA0B DEDFB73A4055281E3298D05B24CBEAAFF97919042BA921F1664C95C47187F511 0F437EF7A8DD8157BEAFB81963712A6B4EA1D42F470EC3046344C8C4B404E87A 7F2605CDFE34300934A726E6AF7F1B365812AA31ABA3D5CE187C9AFA5BC8E1F7 4FE2845D01E07F3912451E4CB5B7B382577AF99A7B59B2944CA0C9AAAD31239F 3277BA68B143CAC1694070FC1C83B0FE1689F73CB399C5C1A0100462E0E76A16 2FECF0DAB104A60487CCB2BA2BCA6559DC3F880ACD018A5DC12399652F1FD059 A418595114A40191C0516B5F69E5290A3EA40DDCC24318B14660878895D58CD8 9E290501D86A30D4D97324975B366C01583ED2A9C282E9E066409A1B8F0DC49D 572A99DEB25AC362AA31737AAB91463BEC022C23C64E1047F52B5BDF9E550396 5D8C923EFB5E2483D1A755AFF3C1F795C8CC43E98BC5E61AA758E7B9AB40D958 953EE6BB760225C5D42027C3B692BBC5C90C6F2D6C4D4D3F1B381FA9DC6271C1 5B1EC536EAF8D45DBB1749F72B14EBB8E7B61F4D4E6541CFDC8A9D7F05497E83 9473061ADD4360ED1450BB9AC6B687CEADFCCFE671184CFBE451A59C90B42258 712CECEFC780A986CBC3A24FF54B97CB4856238CE97F296918EFAB7AFA99D365 310DEA99229B255C166D764F04B0F2B9684AC0FEE31066C71DE1F79FF9C15053 735A3E45C9391E6EBBD6DAA06254A7E77A568EC52F29332C863264BD55A451FF 27CE78C02828B9BBD5BE834D6E1B5FBB20D031FCAA65A8BF56CF38443B8D8EAE BF639E79E7AC8258EB570B9BB35059566BF49E2641F740FC178697B59F59D956 64779141DB85EEAE6E0CBAD1FE74180F668E0CAFE7CF409A8274B9B2A83E761C 437253B4C7B5CDB73E74233C0C2B7007D43825386AFEF2C59F0D377BEE3A4771 893186BACE1C661FFB12193EB365A0BE6EE4BC14723312A69F1885945B17325E 00E5B442F41677AE0204F0839EDA7A7333610F4B62A2432A920A1DD35B19A160 F84328968BC53F1FE4D05D91D67CD96B363A38B69C50AF2EFBA1FA7C410EAF33 04DFA60A6ECDB5809226557D0A42F4083B591AA8CDE7A466FB4E2152E5052861 154822B30166032E667C7E3CE46CF79F10AA442CAFD909094E79AA90C8C9809B B9FC340BF1F20B77DDA907F9A5E98D0173D887259FF841F4F69C0E52F56D8BDA 0AE3A46963982BD6691C6607FD52DA2FC36918E779DCB5CF875FA5BFD2761F85 191C9CD9615D2558AB3CBEFE936F0B66FD97AA05857BA91BDA2B0D11FA8962E6 857A6E086B5815DF8F9915A009BF19C60A2CB2AE1F45238932C86CAFEA9A2C87 84D0379A724B45E8CCB077D3D569652657613FD2C21C9C77408C417D1C431236 D63A147C20147F7B973CD982019E4717AF7DC3CA77362E2BF6A4D2D7BC7C9519 7061FF438EE207E0D0E3442AA8B9FEA0E3366BF91B8EC27F531FE9D3CC8B1EEC AA7C0A05ABE0F728ACF0EF16E4A4E5FDB06C5F6B250651916E22FFB1660D2E4C 95BA8848E566048BFB0F14265EC50614C8062D86D7A3066F859AC795865709C2 1803D2B6B98E381C531A450A648B8F9D97815B7C71C9F3B7FCD4EDDDE2B7EE3A B3114BC068D16681FB19795283565C6572FD7E80F821C429CF679FE66B8150E5 E399BF037056C4B6E5F9C368982EA3BB3DFC14BF47D3261C3715A4FD0FE6B397 C3C852EDB9B1FC5C45D5FC69F2EB129BE8F7B3E5AA96B5668D7B4FCC710B0CFA 82965FF960541458CD93D8C71C7ED68BAC7A56728B3DABB6579244B83B401E5A EFFDA3DDEC4C838214F49DBBA551CD122A8818F55664B6B9EE298B4E9F0B2273 6D6944D79BFEA1E417368C46A9A2FD3B5614552DEBB52861B0925D5A170172B4 D75678BE1861D917E8074345FDEF7F7648091CD25B5F4F21EBC4E1C399969016 744530E828D3C1A38452EDE1F37486E2F54D215E78639BA6695E692226F945B3 6B2F7A9CA721A26688E080F4950D9107EBB8C854E4BFAFAB3DA727B9F83D20C6 38FD21B1D828295A836152A0ED2E2232B074707433B25AFDCAE4C5746E11FD9E E32A067F1039D53119A6CEA7093ABB1A18D3DFA1E5C2C1DA805613BA11DE938C 125B0C5D1C5B9721409B0F502028711216C71F157F04E0145277518F273E7A23 470B8757CCEA7F7C57AE2436DE261250AC711606C56273FD26F41477DF4D56BE 0852326D852E3A5FE0F3B4793E187911CF4C9203638479A867323B0A33FBFACE 03880D0B1B00576FEC5D46167EDE48182DB9C9F583DFB477B80C5F2989A77855 53C6F85B453120472D080D3264BB4A64AA3B10E9785E0C66061B22081E751AF4 59AA4D9FF7B20C33B2FE7DC8CAFDEDC635089B79735BFF4424E138F595C284E1 F6B1AD4BB4125D7AEEC563731E3F6B72B97CA60EF8381752B1353C69AEDFFEA3 BAAACC145D851CF84422061B083F368F6C0843CFF62921FEE4FEDC8BAB78E806 37568076A9823EC9657C68C3342F7146958959845478B08229C2A82F8D56ADBA BF2208810032517F1E8B0B1849E90BD6CB8AC0265DBF9500850788CFFC566FE4 2406280CFC17D65C0A4218C4F6749C0DC4BD687AB85E63E94F57CCA0ED19BB9E D0A7C2BA6D809C470EFFAA48E46FB8034AC0453E56E8294ABAB8E68FE860BDA7 C7EB6C4C40D430B84944F1B3D0C5A569B9B2BED576B1DADE30E2E267FC87CA7A C64DBF8D535F151E023F92446EA700DE2006848C07E28F3537F6D394FE69B56C 7E57A1F79F524C97D20176D8BB5C363CB757E38C7C20DC729C326363C9D690FB 6E966E03C6DA0AD55F300DD96FC35A66D2FA264A83A68F847966A3D76638E4EA E210B9BEF34C030EC58870250728B290A436BFFF766A15C260412EE838BC1BB4 F78FBAD4D27EFDB797821B91B631097DAA73A91BCBA6AE9AEE5105CBA5D85913 4180BCDD694AE2AE34C129D0FA28193386B1FDA851C09992DC18E632362D1ED3 B269359633D6E00366CF09DAC0E99D2411435D15095C39722C96F364F2B93763 553794789A7E7C252F6EE658DC82CBAFB358506772BA3D42CEBF4F536618F1C6 4B449A81A9E3170159378316858EAB4DCE67EBD57A5F6C2798BBBA5AAB88F70B 2157931BCAF8641FF8B11F62A6414C90EC8DB15FF835C5459069F8DF17D9815F 412A5AC704C4B46FE639A1ED421E26D7D9F7790E0FF0B9B3BC663D958D492E37 207592E684144704CD39D3F8E10FA3BED1C9506706337A7E8133B8102B845176 D400909C3084999D7152E1912DB5C818FF4F6439EBB588979E76601A794B52FB D16769156D43D95EADB71C2D07F34A9C44116B7CF980CBAB0E5B937458F6FD28 5D29F56E0178BFE49D9190C141679CF4B66EA3074CC6E9B8B9DC75CCFDB71AC5 A275A618D65BDD0CC5ABDAC0513AAA28B0FECE450F759CDD6AAD99F0E6446476 9F70B39E9369201AAF6F66F214B9FC104D56F152435A80EF1E75B2685B5B8AC6 FE5B92795DA28B8E8E76DDBD9F12134003652E7FB1F6D900DF173D344C5FF393 4E4039185BB8965D6E3DDF4309B715EEAFD1281EA69E185F513F59F264026D2B C13A9551D60DBB44C97C9E64F21F7F8CD218475C19D598ABADDEC26BF2183140 969FA4B67727CDD670804F77DF83954B3381AE1E812E03FFD15F67387C9C9840 42AA16E2C05CEE4263E52EA3EBE58295CC5ECB2AFE1B2BF96B8549F112FB39F6 2BB2C6D8247B13427E103F5866D486A1918612D366743E365BDBA82592A3F649 8A084B607A7D71838CEF369D86629D2FB7932B171C80818E03E24A14967EF20C 4889E6D7080733FC577B6C31B0369E3FE9A0E8A4AE50B4788906F40E6BB90D49 1A870F8FB13EBFCD9237F391D9CDA88A731C74AAEB57CDF25C1FC94B36D37150 3D437EEA28F501C2AF67B08291191F13999AE6D97CAB2D5F890C7FD5B0B51AD2 962FF82F8D8B4AF0AE8745A9C952C71615C6083608B8DFFE0D88CF01E6DE3C1A 27ECA8024E4A0207044FE9FAB91C8B3365E830EBD3FF223B8843F2089D43E40E A9367BB3724049F685D6659C25E7DFE42D7EC06F92F65BC72A54E0FD4031F92E 9EDE67E634189FCD18C6A37026A02F156F9596DEAB931B0F2BBF819FB83DE0FA BEC30E1EC753F32323E270E2C63029E809FE816F6A4A023EA4807B6B42083C89 8DC21E6408663F49641043CE85F082B9C7425CCDAAE693340C261725ED80ECB2 E4117271AAEBE05ED33A6A3DEA87594CBEBF21E5A77EB327B02792EEDC0A7B23 DDECFB81B9BFC26F20CB8D600B77AFAC8CDF6F5738EDE028FFD84E1EC34011BD F506C64B82F5C65375748B2C76DBA50F78D867B7BC7040E6AD270F63439AC1D8 02CE8B9893D756A02FC56E69675725621FB9CBAF12FF6BD49B44A23378CB7FA9 CC76306D024A7AAEE44196CCC4419EB04989D6BAB30664C92B748C21DAB13417 D7ADBBB2816E68753EB03770BE893C9AC73C92C7ADEA9BBCC502F4B634098F6F FEB44F938905602ED008E46F52243D44099C2AB86782A5C2F41A954ED42C8840 F8D29403D28FA41A68E591F61D6930F79455F5112E2E95CFA79760FC88E84ECD F96B9DC3BFC9005A05B983B23FC6E9CC94587F7B07B44AFA281F55147FD8FA5B 06E298624610E6043D4D5897A432314C9848B7B625F35BA97BBA042E3906170D 599EC85448602CF0784D36FA50C8C5848437321B5356412D5B24C541A8A2A533 E10BCEB5232944A1DF91756D3C0AE4C9C812BB1E3A7BD2B8344D892A26521675 957930244B103D311532597E76184C453A12E9B595FA0EABE706659AC745863E 2DB39FACFC0920993FD6F463891A2466ECF6B48F190D88B5DAF72EF44B6CC734 6A432DE6EDC6C3611EF3AE6122065CEF60616DBD96720819FDF7B83E76F694DF 06603F2EDD983CCD22BBF324F21D3BC7565EE38D1F43E79F8F33F92CB079FF5C EA3B82956C09B67549FB194E50BD70D2041D83FC6A4543CE129816A005C08324 BA93413F09D3F9E92ECF14845402566F6323CA661B7CB4F65DEC6C87D6A87243 BABA627715570491ED5BF6B61E2CC7806D39069E81F3375D8FAB9DBDED767306 514D9BBCCB5D4B9AC3189DE08F8B103A18DBDA5E69A7610D2C10C84BCF75AACC 94A52B71DB92887E323A5884A31BABF04FD4B61A01315A6CA4EA5796C25CF44B 9ACB1442E9329B4B9CAE53B63F9669C01EC6E31737930873DAD07D570A56A9F5 887D9248E4ACC1E5654C2C8D41B0675AC3B3F578475AC92558BF0F0889CDE71E 2BD94D60F7B8DF726E1544B0A8D954267986C53350515FF30E569634166E5942 D6382B939CA06DB5856B0CDB0B87AF234B0E197C8FD7494F51BB94DAB7E40F87 09E3D108648AFB956FBEE15CD9F81E392F877C539DDB75119086A4D5CB5E2303 996679D77D34F800402AF2C4A0649E332BC88AA298954E90D3A11DCB5ABE5A48 F1A11476D2DD4AA7CAF0E6AD2E2D83965AC2B86D998B9404AF607AAB5FC088BA D60DBF9D2B30EC442157B5944F0F4055EF681497D268A43EF048F3BFB7E36890 FD348CE06629655D27BBBDC717B6A2CA63B31C437AF0E5236C5DBDF759645B33 8E350919A8FD979D18C9CEE7B5338A2C4411A4DFF60114511E63EEBC413DD015 11D2C2E36FE7837429D5B01FAF210DAFF22DDEBB5AFA72211C4DFABA710627EA F00774DB20BAB262610BE2CB8C934ABC739CD829553305D278472338F727 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-163 -250 1146 969}readonly def /UniqueID 5000828 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 05965AA02B8A67AEB04D915DADC1B84A531A1D60569ECC2EEFB7B6B0263B8B5C E6EE63CED9FA74FC7C03610F6394D64BAE1BF3B50FB613A39C300CA5F4F16CAE F9B9F4DACFC69B69AF30E4FE9E41A6DB0FC987A13A3AF3F99127E5A44E7FE781 399BF303B773BC0096427B18DFD0DEACAE196EB3927A7EEAE7434F70FEA9BF58 81A9D616F87D300EE8D00E5133F8C8F4CC003E313EBBEB7900321482D9DDFDE7 1208ACB39BE071CE8782DBCE969790F60A3D8D8DB321F9655DA2577C284AF543 847780B6C8180221C63954214012810FF5587FC771E18013003CEA5BC5617BC0 82B774B5DA1DFE6409757B296BCFEDAD41A231F577AE5CDE2F808BA238312125 9DF075E6AFC693F64F423A143FC86E987FCD1E59E7A7A6C4D05EAE1E389EE0B4 FD880255540542E73DBD860E72EF10F77ACAF302A1ABB10BDB99D302AF8EA9FD 0643ADA228EC27CF4183202FAC2BEE8D23357F342DD2114A3C260435A4E6ADD5 1EC9EF2C5458B7AB1765B2048FB015FFDE3D37C212566D4B42F84FD231E9D07A D9CB5E4302C564D948762A65256CA438161EDC179897F0215379C8D2296EED63 95042CCE6820BA3B455F4BAE89B62988462A30EECBFD9AC17E48D2987EB17496 B54585B03C454A9832E6534EC1EB3FB6C7E6EFB9AA691DB19B84D1F4E9B0F3F2 E9466F4586C2036628D453D336902CC63C9DB327998E6335663FA2D8F0268669 1E9FB0C919F2EF481244331F6BEB1715CF6A14026CB3FAAE9B48FC323019CCDB CB689844757A283FB4B3C36A35B674A62DCDDC2F12B77112DEEA0DAF98392926 D0F380F3CB186ACC3C001766F4CCC58AE40CCBFFA16DC4E93A489DB97DEF6182 BA3463600D7D8429260DEE3E757842A0AF618D66483A883B7524348C209175C4 C25B97CA47C121F12237A9DC6C5BCE11B4FEEBD3E018DDDD3957B60F2184055F 657DBB5819EA07084E0D32308D454DD9A2EBFDF0586145EBEAF494048D7E5A64 FE236C271CC1352546232520F0247FE4B63413D22344CA51E003E3A3756080E0 9C3C57F4BA418A27460C6232D645B90B20846BE32D877418DBC49406617A6DDA 7E8F1F9FB71B887751441784504BEE51F245086A35526F704CECF820A7ABC3C6 781A72E94137E5FE19A6275E1285BABCF56F64CB0AF106F0E320B157D1D50E9B 2B397E2F7A352B403F669611604AC2A19DDBA0AFD36BFBCA564215D6D2A2B58E F9110836D6B7D2FAED3555FD9D05033327D4494F85BACF43F0029C4A8FA0C044 9326D57695355C35753C4937597805421143891BE11277FF1C7F93B63C7F39A8 21D4489A6BB1F17AA8C4AB81A92153543D5BE29AC689093EB380B5D8FF0CD5F4 97ECC94E04286082A3623D098E0B3F370C9B0BD14EB32C219EA1C0479E4DA1DE 86634E6791036AB2864B26ABC63DB15014EAC9C424EA37F1DE101A439159B94B 0D0E5B9B5A47BDD911209A20295CA876BD8CDA95E5CA8DFA8431C76E34772A28 367A5A8A5D638209701FB7D196E6B0AAFA1303536FF200E0BA90037ACD80BCF8 0E0CD65E2377D8344B6F496833E97370ACCDC89D38CBB3F143FE150F6520584F F250CF7F61DB81EC1C50AF16CCA7FF3FA7BC348694B6FDCC5841262F5D1D415B 689A54B5763FC3E51E25F4463A8ACE9E5867220F338A40DC9A08C125F527B1E1 E432935ADA337B04FF6F6D27A471C45A1DCBA606F95EA4A6BE24D20593FABA6D 1429FC489FD03E5FA96B076A7F9A5A012FE46DB12B072D4F9368402D10723A55 DED260CE3405DB1F61D673495D521CD246434832AB6B87C94C2CB82208634E41 38BD3246244EA987983B7861015121410C1EE2DC82853D1AB3C89E1F0FA843F3 62730071A5D13A3DFA72F7D85ECD662BBE2DC66EA73940D777BB898FEB9E2F3E 2D7911121ADCA98CB7B6B0F1F0E666E93B291004D73082577E8F4BCD81FF5797 59E8878BE1D1DC6D5D9489EDC4A3C1A9B92C1E57ABF1176F423A42C2E43B7AA8 6DD1CC07894F072A685CA6474AD667427261B22EEFDBB5F313CE74BC3D0131E6 51AB9E297906E4667DCFAAD69ABEF13CFA771F310D4C8C5EE13D8F604A5D5629 2709C27ABD524D29E9762ABC3922DCE5D8E5E455F9540EDA0EE60EAD1D0A02A0 B61EF1F3BB9DA55EAC5E60F5DED677974DBE6465C862F7BFE52EFB211EDD3DC0 6E13DB85145F26BF206B8FE3B76A9CD76AC9D83866DD47DCE10A8569591F8C1E 5AE6782AF5CB632FE5F079211C606DF39A0EB82DA6516782E634666369C56E86 8401A6339F93D04A4A444414D01D8A8277E2BF5B9BF8D526DDFBD3F95AD5D3B5 63DB375BD6A5AE60630B93B34EE019DC8EF2B823683479B4D659FE674FE48628 EE992BB9569975CA25BE977DB9092136BEBCE662B9A8E321AFCA80E6C9E36C99 9255F86077B28E0C3430E757AEF201AAFFDB4AE6BAC5BBCA7FE5B7FFB6B6C152 F9C2A51E1B2AA3E8BB4F3ACA0DDA50B3D5A828E52A8AB495658A9E388C702083 7D3345C709129F752AB5E764768748D6FBA8E6E8CB2FC1785AD000E24E1DDFB5 9E3FEAAD365E19FD7BB97AA736D5288C692BE20F229A2C6AEE6EB251ADF6696A A04D9CDED5946AF877FFDD9C3229FCDCE5DE7C9B926ACCFBCCDD77961B7AFD59 AAE7183BC2F70505E2A33241F2B2ADC83AEEC9AFCA711781ED416A901C0E5E74 6A4B1DEF6EEA69FA976F9E55864D2FBF7AE1693F3F7B85B0AE56EBEE884F5980 36858165FC4352F580EB47BD08F3508B2D5CBF2FCF25F84584BE7435A0DBECC4 6ACBE028B571C23B30549B2DF4E940E3C1F1204D253C1C7C66057B7CD8D0B7FC B7A6AB2CFAD1D57EE13429DFF8371663A6E87302CFFAF01BE84BB4C6A6908720 82296C648DB804105C19DB806C304038E2AD87364A4ADA4848FCF011BD51175F 2F9C20A9D6BEBBCD6BFAC0AB7DB089225C5385799E3F00C1DC0D08736B5DA1B5 6E07EC68232A67371E4D7B95B95E129ACC09CB4C01AFB99D8E787746CB114EBC 3F92FCDAF67A0EEA9B4500ED4257A0E7658BC9539E395C4337371F22082CC9B7 C39570786F5E117534C586EE573629E8E9583DB9492B2F1C534DDE5F6D0F3DE7 B1848632048CB7527AD9439CD413F64346D85DC1CDE98043E646C52D6082D222 94FABFA360CE39C5578D9980DE80529D718528DA9F93E0A0489EA99F8B009141 06B7CD218D0039BF02B733D6B2CA20BFA0E35CE0036E21D6F3D927BDC39C4C3B 5069BF3FAA1FC69EFA6E465A67518ABBEBB2A9FE4792F4869F7F4387BA674631 F2BF0B6AC07FF780F03C8FB721D36FBFC7BE0EE5F6D304C51FEA1F1BB9303515 324D1D1B25BCBE0EE8FC605DED139AA57C3D295CFA7B43910396D5BD579AC0C7 6F3AA61ECF0C95AE18EDDD837F6E6030DF3C64BAD4638F43C58970203EEB9AF6 7C5682456B2212C7988825CF6AF6381C4881B4A0D4CD74716583AD90DCC60D3B 3C172096C3560FC2DB11AF9505E994C01983FCCAC4F7A42D4FDDF43CBD14782A A3F24D2D7B5CFE865FE70081ED038BF642A2BCB4C438E15EB14318005D9DF4FA DA150BD30EEBB31769E5ED810F3E329ED555AFA8AD10642950F285249116A70D A051BBF23E944E761E32374042F8530F6A60DF36E05E9C827D1694E92A1AD56A 7DFE4A9C948107495851CBAB92DC04A9B030D4E1F3D15FBE68653A39C4D5DCB0 62CFDFA7E061CCC24B2F21355579A8DCBEF17878F0A1F0813F6F103E282A3497 5FA1BE2AF46D05E236B62EF72F0EBE7C2392A980F785DEB6982789BAE8A37D0E BA99DD08C8B54F9CC47DD732F001A0D1F625BCF450E3FB512AB48214648D0D02 C3853675E594E0A2B3F4AEDC1D7570B27BBD64F64C0E8331A1421CC3500E9F32 3C13F7D155A6457BAB2B4BECF8EEF404E59CA19DE9BE31D23731E44BA4A8A3EE D1A5426E50E754DDCA06B0B5E9FD65327832EBF51FC643B8FDBB3A0927653334 8EEE99661FCAE144C1C76A7D683075A8D241062FD1D0F538C32E2EC8AFCA6193 BD2FE21CA7E90DC0881146E7DE16FB9957898955C17E682A6AD6CE687A92EA46 1FBC04A888BA6339E1E46EE23DF810B65746633A7BF895FE94536E0BC7C5F862 BED2B1E038F92CFFD9AE27BD72D7656FFC77FF11EC33C8D96B29D9E9735C1590 54D42741F1935CE933087D1339096F815B12352953F43D041B01EEF5B20C1C66 2606E179A01262C722C81552CAF94E7F5D66526C54C1BBAF6729906D88D963FD E628F53C27869A5D34DCA80076BC7328E07AAA023F3772EB1F431725D4018526 264211C488242AEC3F323C454B8FBE70A07C9F6125CCAADD6D10BC7BA1CB07AD D222A5633D2520FB70C4B5E400BEF2F94938DB894B7830DF995357379C3C5F74 478DD927733C2D98E353DFCE0741CB1154B398B0A5C99EC25013B3170A41F907 F138F2D9887454D9DE2766114E2A7C8EB559464B91A9AB45DC6E2F2CB4CDF67D 2A0798BD5A6702031A2B3A140AD184AA86F69499BB8E0E61C900FE46D377CF6A 0ED8160670E484A94227489426680EF10C98625A9DFE6EBF926D207D1D027B52 7C9B4AFC8B5C2D18B4AAECD192080A896086DC31876D32EAE7817E03E2343852 961ABF8E1E3F9C248DBE9C535DD3094A53F539BD5911576E6E5C37A573F1615C 1E34CBDE902F7D490E549BA1F37CCD520C4B4BDB7FDCE8CDA93D08D66994BA69 8DEB5B3C8BF63B1B8B2F0AD4F1F2D1538BEED6071FEA562A04AC11AE5873980B 58BC2F11C1532017886474BDB6C35ABED2286E43B7505DD362D77A12FC7E1F75 5C12CF9369D579B0AC6F253D13664B84607046F749808486B3BCEEBA05FA8826 3430A29D6031CC11A0E9FCBF53927E28B3729A53D8028470AFCAC10889D56C3E 726A69A34E3569DE47A413FB829C3D0EBBAD7878172E7F2D2F3091C21364CDAC 0B3123F3DE796D4A9E985B6D57F39AD192997B1C88CC73C18A07B445ACB6FE01 13C797E10537058767CECE12F02A0F6BB66BFE4239444152667BF9CEF825A56D 38EE28F4F56F8C05D4141E5C6390223ECAF3BB96457F701B973CFF967A3EA08F E3F3C1022ACFEF49B57933A4619236CDCD871ADAABDDC1D7674A5367AE66F44C BA0F997A49319BE7773CC432EEFD07B5034F78DC33636E9266595001FC886364 5BD7D9B24EA7060A754C1DF0B2F5F507EC0B0966EEDC6F4E6D763ED04369CB8C 65F7B07CCAE1BA6416D83DF0F9BEB1E7F00923B0C72A1272734319E830DCAB4A CB29460B9D9AB1CFC14446A845AD603B654059BC07FA549482776A7F2A725F60 8A1226502E3ECB41417FB632D45A9881640B12E95FAAF37C29FB1723D8798EC5 0F3ABB0AEEC83F06298D65132FA9E3D69488C31044F57498ABFC41B5AC1020A6 90ACB952BE0F08BC9BC1B2AD0E95083DE0C6C79EBBCC0A8ABC5D988A839953FD DCF933AEF271EEF5691833FB177C2E2BC07CE0F2D8D13BA842EB36E3D8E5E0A1 06947970CE058E923FB0A254297F531DED2A49F73A0BAE98E42B884A8A76B9EA 52B6071821326BF70E41C07A3E32CF6CCAA0EA9F834631947A2A66BFD8835CE4 BA9AFEA422B6F6E5B551EEC3A726AB58F13B71BFCCEE13519BD81D488C497FCB 6DD70D9F7724D9225F798E05667BF0B904AB81CBC33CE88B9B1CA740DF675093 AB632B43F7C63B2061BBA301E7EDA25BB5AD44A4170FF3F9176A1011DAD499D6 C706DA5BCB550701861A3AED1E9406216AC48AC72D13E9D867883810BA69953C 5940310C7FC444EAD0969CBF540EDB4A49A5B1E0C84C8C8D3E9A2C34BABBF54D 1F972E6F15AE4CF0B228FD7E8DA9C0C33D339D3BAB0846544924206C50707B97 B71A7C20ACE533CA6636B3890E93762F5602FE74FA7336D2FD7325B1564605EE 996669B248BEE486660A597DEE34BC774A46B033D934240FB738E0DAB11DFDFE 8D7ED9E7C41F180847C86ECEC892448B2DC21AABF8A31BF72480BAB41229CE04 1BC24BFE8BE500D4B8A3F8354A8FBB6C392C6B02C040E2923C4C717DDD092F66 B1B70F936F896321689C2512E930C465CB0E684F39F9CD52C395C8508BC09D3D 4CBE4AD797A2BFA6473A61579C3F7AE1A385A1DEAE6DCA8C9AC9557595074EA9 69BC0C7F3007B06566F9E318918F3A1E16A4F56FC3D773005EAE108DFAD6E5AB 3E76D15CEEED6499042100C47D16C90683781764AD6705A0BF08BEF4CFCB317B 0D36493724A3883DB8DC3EF5A7C3B94FE9038737C16A2C984C9431BCE8519B52 3B658895DEDF28BF7D5F8350DAE1E17F795649D31F13E1EF2583D6B6CFD61E79 F356D043B09320A0299F38A4D738C5725437B3C4EB1ECE78566F63795CB7DB18 D564E5E0E88A36F863BEC59907F188D5CBB4B3B2AF51577894E777AA6E4F216A 6426FE8D0D29D444ACF44AD01C4ED7FB627349A6F32B2408E097AE5F21C89960 F69A570B9D677A3395B6D2B6D52018B38B2BB6FC2F6FBD0EC98E040C7298E2D4 33415A412479F4087C1921FB33C9E1F8747BA82639E7D0F5166E4B9A469EDEAC 1A22A5F9ABB531A1A589E7E80E466A1A84FF9C07CAB49FC1BD015DBFD3C378A1 EAF647B24A92D1D4FBF132548D311BA86179FC23087742E6D2A93CED88AFBC18 0E34E9260961A759A9C0D549297BBB42E7807DD8B34EA1358439B763E887DB84 801DC4389D38F28D463C967FF550910704C0D04F18C925E9DFDA6C90B58F8CEA 4B6049DA7EE039464B63EE42144FFA659194155D3AD5EA984C7447DA6BDB37FF 8736F5FAA4F0F44AFB968C24BAE2B313DBD2DE24D97017635C6EF1A22A166C67 20D510F65003D56035AF164FAB6F08FB796B0564BA99A618FE286D6417961349 CD69FAC4020BDE4F28351A0063766C7732CC8C2CB8CC2A1ECF3ABF6B52DA58EB 07A278BE0DDD9BE86541E61771FA184886F2F892AAA93DB9C4027A5E311268E3 05CF30C221BE0C72BC4A67E0D06BC5496074D6958366E3F758BFFB09B464D642 EFFD39CDF117D55273D7060AEC365D51E45796EFB25104E9833F16AE918007B8 02B62BEC90E9E4C7F34F20E433E8DB8420ABBB8291F494686C950AA39343CE9E 5A5F070596CE751CBC0C3480B8CA9C663F19302B8EAD4A34843C5FADCF7AB64E A5F94FD321F292F6CCB0228034C584544AD88F43338459223F0D779EBC84C520 5442EF3A999BA723215EE326611C734E5D8E3C5A52453E6A4C490C36D744731A B1849570620E7052F4F36F1F1AE61E6101CB94F67F140C09553CF982D79CE158 B20F9651E9577B956F2C9244E85F0841ED3D02854BB3960FE61E2A7373FB534E 0077489C6982A2565AB11B6379043C1BDA826229E534F31AE31D038DA373E6E5 CE24640E97A0A78DB8E228BC0A6A4A194E04724B18D06151E87EE66734A89A53 477AB2F230BE1B62FD9CD123674EC8058C5FD0C323C4D3EE6A598119EE5E7BF6 498BB4F164BCDDF48CE42D8B286417FC6DCFADD059676F51C6324B681131ECBC E2A1CAB4AE1424B74A37C1D5D1C703EC429998F2C54666D4FB96C31DB22BE418 F0688380C8DC6F81A3A2B21EF033936C9D50A7A7499C1A728E7C9A20285E358B 6C282A651D425E34A9DFD692013EC64EEF17E1B3349A4943B70C764C24E04E09 1F22B61E8AE6094511A2DBAC75DB2934800A7B27421B192AB1EF887FFDB21A12 5E3BB0B02F736F40F1CF9EE1EE86ECB6FC57E060B3D1595C03D97926FE804AC4 1DF091A41C6E37DC5B7983BCD540D8B68277401E5B8DD7FDCAE1D8A7DA5FD747 EC9748124FF44402E6B330B1F85D020F232580F37B840161FFEE11A26835E813 01DAFB9E0876810E822DA000BE2EDC3E4D8EED6AA16B545CB1553218F4B0E2D8 89DF9C3113EEDE9B68679FA63044512F2D9CA3C3A77CBF7E61AB398F7D1B240F 2AA565B3CA4925067C10FF0826BFAA369E81D1098D3433AE9A536870C69F0338 A0CD5232C162C976228752B327BDD620225D7D6DCDB38770F9E1A39DAC4A1BA4 B56A0CCA722FA6D1338EE6791308C57EC6FB50683C0A6ED93F2EF1790F4B2A38 64878CB273B0CA447B8957269E2925ED5ABDC40D985CD7B9C42892A1C063FC55 4A3F8B8AF71959AB2506E3E63B87D43A253371DFF81AAFAEA72394CBC866D5D7 8E0D3F3079CBEEFAFF3B6E9766D722F241A4DB7683803E2EA45B45B829AE63F2 48EA82C3B4D40E9DBA440B670DCE1EEAB9ABF641E9C333B5FD002824C9DB2AC3 52C1001922786A6305A93CFAF2EE79F691BCF7F229E626A3CE7C60F4468A942A F8FFB3103CDA4F1A983F88F4ED915EA313198FECD71002E60C3DB52AE408C1FD 8E4416CAF9180ADECF5848C7BBAB87209B2BE532BF6D2A670CA6DF9536B23143 7578DAA57E831C3239C58BC9E5D3CEBC6C1D09C8C88F7FDC9DB970E433813E8C 26E7E72EC1BC856A93394174001402245F76840E3741A558132856659CB63C58 CD1A09B15457A944E9E2AC05B687671B46FB237B58C849D71A4E38D6BA7C766A EDA90B98C4AE3DBE54C2884ACEE2D0D973E5D0DABD6679EA5D71583C5B662514 F3BF2F13EAB91A4301892FDB7ADBB7CF7E3C1EC64AB4B90DE001E595EDA33E33 81D815FE991581B38023D6E40837C103C13EAF66DDE21F6AD517BA08AB7230BC 2468F7602680BEB3743F0B080EE326D11A769741BDE9B2D4ECF6AC943BA60527 F85A3855EDD0717C4E43477B7B725BA6E9A5C917555CB99889459AE0FB26CA4B 449F924964BC16D813B540E5DC10333B90DF49CFBE66086C85AEA7C68A567FC4 3C2D882C326C0BEF6C8B84F39ED3517D49DEAAF62E93443321F7407C1D83FB24 18B0CF53CFC2A4E76ED9F37CA5957D649E1E67340A33EDE17D8BC8EAC2508923 ECB9EDB05FFE9EE90AF01B4BAEDD65089D73FEFF92093D91F1D53C74CB2713AB FE7298466EF9F14157D785A62F77BA8A28198502AAA9924C20C461A8D79B2D76 7DACD64996B83296C2A275E5CE7E25A659D9AD0CECA9B5B88265179F54656EE0 4D209E1F6AF61B9E8AFFB3F7255E69991C8D070409D2528B95C8AD04A6FF908A 5AA84C0DFF0A952DBDAD6F8BD013DE3274A1CFF63F0E521E156D1E01D6BE3745 9DB4694D3EFE80B3E7F3991730DCBAE0A323429A55D50B5AC5F96BAD5B222568 3CC7F2D65CD00192699F821D485E67DF1FB7F567EACBD82848892D8B8FAA3413 241C075197DD554A169DFE160A37C6E3344091E9182B845BE8AB66D44315E39F 6F913B7DD06816FB39ED61DA75B49EB1A5A8FB613F803DF04C2FD5EE1856E640 648098D8F05901AD20A9ECEBACB544D43C3A5BEF68859A44CB3D6A6EB69B0C42 A55D9E77DBFFDAD4D4575CF5C0FB63BAD47AE3491F183DF639136E6187FD7C89 C7CE41733D80001FCE53D090C0935C25803085F5B5F7BEF9D112545D942232C0 582A4B676014F8115065BDD8EC2CA3D133AB62AE40F735F6FE4436E3A04EF97E C612F2F18A22922BC22D2315CAA509788C69B41B856FDA23991024DE808EBB2F D626A000F4F40E0540D8B27504DF82696C87CE09CC81E48DA21AD407CBDBF61E 04C33E9E97E16C160A1516EF3FB6A2C2F42ADB9F5FB43EE0677E1FC475A9D2A1 50AF8E7589158820216A78E7A7336D478115655B3D2590FE9AB2B7226028E840 3857C3671A8DE767C2EE7591BFD04BF7A5CE437BEDF93FC78A2CFBFBBCDAC5EE 886720D01EC29AC0CE9C777061BBF3F6692F75A5250DBB0213205FFD7E7FDDF6 4F83E6ADD10836CCC030F294B22757D781B9381E27770A22A6E2F8642DC9FA73 716DCDC0AAD17E4A8F4F8FD2C24E8FEFA09CDC50FE000589FF4389F10ACA183F 87549E17EBE84E76B3039B5571BBFF155502DDB4AD1BBAA5190BA98E8D377D05 61954449BD47CED60FF242D613B3FFD95E37EBF6DC3AE6AB3AC0B93A07E517BE D93C23A68510DE66FA37F0C61BF7506FB6DA9EEFB525F64CFF4607AC56EF0BA5 CC39FD8D9C16751F26100723BA21CB0BBFCB0E26BF96C312C9DAD3581F47724D A054C236E78EA5D5A0FFCAC8DAEFB5A71BD7A71C7E767CF2743A0D9D4317DEBB 7D72F6871894301303FE06197B69BC6D331455F6941B070934F662FAA02A9BA0 D836779302AB48FA0B2B94C75A6534CD5AB5AEF9A0B409205EDFE93B72652020 7730593A0D23363C1AF2EE0F593071BE64070AE453C905F9382C7BA16331F128 2FCA7EB002548F951D941F8990068A1CA0115822C24C6507D2BB68BA4C4FE03B 872CD7AD09371297D1B7C6192D04C739B173CE39EEAE8D76EB26FE8B56BC0BE7 E41DCE3CF49E99428A96113C6CB919EB65C516B0D49D3F8DB781CFA71577E83D 3EA1850B57B0BE684418B8FD67F5A7C589AFC74D7B7BF55A836D198A2932111B 4D6EA0421ED99E76B8AEFCE302719E3E33559425F0FAEBC97779284C0C41879F 323D9A307C1C1DCA581778DAFA51F5FF217D5DEDF8400CC3334EA85E5D23CB16 FB0A782A4E75C0ACC181D547B8B720F4796A2634D8DC4246A7682A63674D5AA4 30373E47F04F13FF1BD77BC11ADCD202BF40ABACE5C578726D68D16FC62DCA4D 4ED9B22D80078B6E1868D24D44891583528ACB5E665BDE8B2EA200C56795230B 8A92BBC52AD1B84C007C479899D2B90FD76D0A4F84A8D1BECFA3FE3C0706AB52 7F84C9AE0F36FAA7933EDB4DA7AF6A7EDFE9C2911A7A0CD9E227ED0D7AD8D429 9178CD5084A89187F5B254E7B40C936B1C38FE114C7B697120C9ED5E1040E644 CBECE71C32E7045CF12F146C48A38E727B3E371A6DE6E0CEB51FFBA051351405 7FF9F3C90146F77DA51C5E8CC4B4116F6023025E5A5FE3482EAE51DC86B13B51 107F068FBD47102847A9E5278C2385EC5EFB04CAD69F0B89C7B9BD765F37F069 555D95F461C8917738AA4D84FCAAB868B576DA2DB3B2365C8D194C67DE69A916 9832F70F27E4C9486767A31D1ECBA08C3E07055D634B205A971BDA52E73285FA E14BE5B940E8481B8480EF4675173683EB5F7F66238A3CCE809D8190164E7856 7BBC380042F091D19C3B1461899ABAE9AA8BB9563B5519DB77D91A43D81258E1 A95A865BBB0DF2BFCCE2E2626D4C210BC787A57D3B5666DA8C7968E9BC97A6A3 363ECC792B63EE2C5B630C0C63E77CA0CD319609D2DDCFA7FFE098F39A9D8BBE FE530EE2594F6802E02176F8186E30CE6388C01C2D061C6FFDCB8B29C99F8676 F6A7868D1C4F91384D62651AC877CD88F59A2751ADD5C239F712232C0D9BB593 9112467ED85DF415C6A1C035DD949EE2B7AC69F51AFB0775592BECC31304B721 D05F9A4D7690A3194F6B23EBD6393750C7B6AD21CD7795BFDF79C146ECB6A4FE BDBBAAA906A13E6D4464773A1F8A4664CE55F8F4D5A3D553FCF257AB2E8C7208 7CD7FB0C60A6DF0E5BB88592903BC67133F525298FDF9C3DDAA041E8ED5AC32F 0F12E6E4A4C420796DE9CEB1943470301C32CB956037D4EDC3BA5E463CE647EA E0A9ECC3CBB1BFD6090B104049EEEB186164C6B37534876F7C5677485D58ED47 3062194796514814482A7DB777279B4731A53B911310109C4A44376638A984C7 CA23B618D981BFD2F455B1B3127073B422E6DE915CE6372A402639760F6D886C 57D3988E219FB8AD8C97C3ABBCD25F1AE196A1425BCE5F7C713D67B5C8F91DE0 58231038A7904AB637B8A7D1BED77778A42F2B70F5547474A7B5CB27142CFF3C CEC8A230FBD13F67E45B3E61258D5D120EE6325B91298DFAE94FE0136787543B 39671E58EA6EBBA7054A64FACB72A731F39312262BFE0D6D96AD4C6BB9B7C3EA 699691B17B8AABCC93EFACCEA564154AACA9EECB4ABA256EE3C2206B2F40E050 EB328674B1BE0A814FC7D93C5DFE9B0640EBB611D805F31A5C990C4978AA4416 002D90558C8DA7274C69211525FF6F445CE39719ADF6668B987B8897696F8108 634B44DA37A928CA75E37D84E05415497958AB1666E355F41541823624B26C0F 6B402D81D64445DBCC76C5FA47E2881B31EF82A644167BE3C6A3A0C59CF6D3F9 EDABAE49E6D875B0BC0A06E5320C8408947A1A4A5385D6F676DAFA1BC2F43751 951CFDAE17198554BDCE65FFAD00F89D02D50C5C82484A315495CB314D714E79 2509590F67702348F69D324965EE06754A0086C354A16AB7B9DECCA85F7B0774 A51946E5614CF3A76D7775538E0246D4EF80A26470D65B18F43CE772654DFA54 E149A9E3525D0A5166816029E2A860AE556C296F0292DB7C2D9AA68D69AF4725 82F9655AEB930517596D1D231BF23C67545AB9D8966771C6A3FF720DBDDCEB4D 027BC90327782EA58FD06395F2FCA3765C31366376874A486B4A4F27DBA47C5B 9F2560E4724EAFBDBB542A2A9D4F8E5F0D959627351CA9F52DB97B9DCDCCA66B 028F2BE6A520B575E13605D443CA44F8E3A33ACC6B25286085764B57D2FF6C80 2C3ACA0D4883B593AE3EF6E9BFDF703072CC60436CCD8B61FB07A6524EE34687 DA3E128F0AAE519EDEBFBEB9D787A6D8ED425C6545FCA781F0C590D788AF8EB3 00A212515D7D88943019ACA671292DE1811E0D34D7B8AEB532AA55BA6AE1F5C5 2E75C9463A8F248417FDA48C07631FF54F0BF896EB206BB2406668BFA539B136 58D8186A5B160FD68BFB5A0B226E7D32C7179A65896BD3ADC8EC14550182FAE9 E6EC1F78E8EC2E9CA17BEF8EAFEA1D03D6 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMCSC10 %!PS-AdobeFont-1.1: CMCSC10 1.0 %%CreationDate: 1991 Aug 18 17:46:49 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMCSC10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMCSC10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{14 -250 1077 750}readonly def /UniqueID 5000772 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337 900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA 87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98 076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518 9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9 CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30 40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B 7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5 FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC 81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D 5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90 CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6AD4B2482A 0E7D070D7497892E9E942DF58E88CAF0C8221BF36BF7C435BF2C683A4A2EF4CB E85820A8AD3486155A40143011BA9D76297F46DEF69ECA4596D6E4CAABF84091 22A96A4BC78A8DD072FEB759A68A44BE1164638B6D952147EE3C628F9A022060 1D1941E73310943FA782532ABCCC88593FD63E7E2CECF6665C04DB48D641ABD3 AE1BB468638681E96394B9E7BED1D13E534B897DB90EA6EC706BAAE06BE2FEFF 1DFA5258113E9B4CD2D36655973864574E0E8D6291E48A8C62203F679B7ED838 6F7CBD523C2943ECA994CACE617067C305C04686F3FC3E99BD87961CF7901031 375D5FBA64A18E683647271C9EA161950E53B6DE87A79D81EE914F3A011EC4C8 872C15AE346ECF9E2F28FE51CFCCBC255A5D504635FF636F45CCCAE28696411D 59A50B68873189ADABECF5071D49ACEC00CCEEB10423C71C530BD1742E0C53C5 1DB8C08C96ED387142D2A7EE2E67A19322F7225CE97EBB272669BF09D1370A90 84E17C68F27C9C7CD510C3BFF7C2BD3370020D6701961426595909753268E11A 2B26697DA07A57ACE40E225B374CC9FC5B3E7E64ABAFAE90D9195C77E95274B2 27A88317AD062A29B4EE6ED9EA0D1D2E5CB37FA374F33187970BD483002971CC 26DE576BD80A4E6D9142143B45DAD1E001D99F6FAEFB0E5450AD05A4597BEFB5 24A3354814C5460DEA7DB73683B911EF910955B868B9FE178AB7D135685C96EA 60395DB2B58D7D74028CF3482AAC9C804F584CCE41B778FBD761A7B55A645FA8 76FDCE3CC38252FA999BF68CA184F38780A58688BD35C7E57BB97B01554130FA 17BB4B3955E422AB7EA8D0B43D4CDFD294FBB28B9FC8DB5EA867C900523A84BE E399679FD07D7D3F62131AF7CB8EF4DA90993CB10FB771D683CC505F8F926DA7 7EBDE7CE918D8A71903F68593366E5D253AFE0ED9DADFCCF3B16A4E93BFDBA0B FD9A14B19CF4BF416ABE7B14E87C882021CE99200005392793284F10C037DDDD 6E00E36FE29E2D94FF45AC4A6EAA5923893F99804F99942D41AE06CC63C1A79D 55E5F4B7C399E55C4E4E6F78427FEE483FEA254E0256A797C35DD053A31D6E3B 392725D6FAE49598D62B9BB06570E407D1793E7EB69A5749974F05568F4EFB48 BE7603D0742C837B0BEA15650C0F8B43C8EE9AD4DFD305ED3FF932676837EBCE 160956964BA6B7413C976D1CFFCFED3BB5CF7D8A73816803D124CDF4F3EBBAC3 D9C7B83D34725490AB9598ECC784D56672A0312655C6AF32DACF0759190324D2 6F48D2835DE17AE94CF4B531DDD38FEA1D1CCD7354E085484E3EE75DDE2FA5D6 CC089FDB0C4632CF83506ABFF370B82395CC27C88C914E4F3DF2E8CD76CBCF74 901B6D98CA32B571833D42F96876956436CC7F6A2D011CBF4686CDFD1A968FAD 3AD5A6B80ECDF4D8BD1ED3C0444D38D2CE3751FF42EE864E9FE7FEE01743806E A258E71A884651C00952C552E08309DAF09AFE424E39C03F40EA78796D0FD28F C387FA6D295E6DBCDEAE95D757F91CDA8B1849778372A4E4F7AB4AF54A244B8F F54A85A3DCB31EEF596541A52A883E9FFC4CF5D9745F05E6A91F5C552ACC0F61 F1C23453474CE4EDE55C63175FA6487B5FFD851AE674BDFDA0630CA8BF9EBE1B 91E4BB446273E386EBC3DBF81E01E4FE45FABB0BE0509CB1EA6AD44183E4086E 519F996BA69E9BE24C8C090E59D32D18F7966EFD5CE6C54F86C078790F4EC9CD 67A1E4E84E8F04A6E03CB36F9326F54F9F7F791F15C8958F841D86548B89F691 870A74B165EF5BD178A519277A40B378B972D3CFFB93CAFD1D46AFEFDB2536BC 925A056CD023FBBAA29DFB41A50B27D745EC8C9B9A0BCCF094BA6782576FCBC4 15D4D2D3EC540A0B4B65355699106B2BBC5121016F609D2CDF197D42B41507EB 1885170D0C5647E7EDCD6A52B7569ACCF4BF5F45485405353EA33C59F86EB17C 4CB353F8C45A1E0A1634A93F479A4B65788A7740D8F4DC4749DCB1140CC00BC7 0D0D1788894C83DC6915AF94FBA899AAA44F41C60C95070213311532A21B77CE F753E1F52D41110990A9923B9F4A4564402C87F5773AFF4CD6FCCB822C30BD99 B51216BC398640F08E41A557541590BE357FCBA0970AAF97C69A1F9AB8C4A443 50B1BC8F87A365BA089897039B1F84403D9EFE542584C1144CC58CAC893BF36F 561829DE7A85B5DC7BD7FABDC00B2D06F2C5D4138C01A5458494E0DF9D5C1D89 32A9A6ADA0A84258791252AC6E77C78F003759D4364C570AEE3A0ECA0C5C1B65 08C9BAFA77EBE0ED40C32C80495A18344ED6CECF51B82CF6FAD1158F81637D83 84C9F7DF09D1D71B2BBF0D623B251F6937AF177221EBC2C937AB22F263BB6912 A37D9A05200BA2405B93FF3C15DBE993F7CE5268BF6337E550FAF13792209F8C E8DDB64CA607C5E01F59771C1317FFB078ABD16E931C42F35E9A49AE402A304C 6ED1C712881D87AF781A9D8C48C678B2DD299CD823FE74C98FE5BA937FD8D5C8 745C6B02F6D988679EA771BC002A2FAFEF05246F9A4899EFB590122A14252A0B 4C4BB776B7895E4C384FFC45B6FF031F35B1E1044CE7E13E5452EBF5069519E3 F0E2580640C21684C8954227042DDEC347B92A72E33A7185957582B1ED6CBE79 17CF0065BB2A7BFCA59476E846455A5D33C2710B6D8B6E1A7B2FD941A7599E98 9ADF366010B66AFAC6A141EA16098DDE3327915C2FE620F0A27907DD9B97C50A 8155336A636BD6F1A099EE7FEDC55D592002CCA778D2261F9DCACBEA18B1065B 42E1911302B3DD0B203300B311D003F93568DAEB132273B5414F80188ABC901C 7B038C8C4411AA61BF2AD72CD9EB6F497FDA95A9754FDB200EFA90DA8B5FF749 E9C4661BD9A3F6F771E33A8D2B09D39C62F64A6DBE90AE25D7BC3CFF661C015C 3DE11E056D80B34192319C8D0E51767FF4FCA37EBB9F4E8822C041D66C3A765C 60515EF8203D3EE45DC93914E8F4538C03F95D4709BABE812D0DE07FA28322A0 05DF80A3F5836433DD421E023DD66D6973D54F6489CC0E8127B3421E58E40A64 32DA5D56512164E38893BEAFEAA0A1A7FF92C419DE20FA169D50EFB746639172 BAABE8D312B5071FC467BE93AFF95BAFAF0143577C3442B3925DCBBA98DABC4F AC68BA77417DD945FE74BAA027D982F60EEBC95B03C4E689F0BD1B868677334A 2E10D6CA38BD34AB5E992891602D90B798CC9CC96CD66ECDB28B50B73A855958 756B07B6D825E884084D8C25046CB9ED4608EF2CAA6532C9FB66EE2647D61F2E CE70F174FAA396204C5351609057EDAC4EE765DE2267729836AF2388A8C11F17 75C08D5F8EA997F93948B7C0D8C6AFA01C5A025B3AA6E8CD8E54CDA9CBB05C19 821875D9158B70CA239D65BC79759858F64290202115F7430C7CFDC8440ED58D C479486E1767789FC148FC0997737843AA42B57A417CF8BB64A45C6720C3CE3D 6E1435297B78AA9C147EC43896616D33F80C9A1ED1BA1FA875C4CB54215C10CB B4603F624D37AEB69EE050EB4A2F59FA0BACA4A4DB5A24E3D269AC016C50DFCA 7FAFD1640F711B8DE389AB038E93730A57FE4AADB6A5C0E7C0AA9A9DFE916967 5451653076B736988A66B050CB1862F9A9DE7EC23C26467393A3BEE40F33F1AB D2E4CBD3F628F12E0B752D83D15E5B47B18731FDDDE2833EB5BA29C5F64015D9 F29829FD1A29EB092382ED6085D90C9727032113359EFC68F0118CFEE47ECB90 12D94C4C38BC254C91757EBEF5EE9C0AACD2C66EB4EDE1637590F5BF6AC176CD F80D5FAFBD50BE2C8A56D5753CA860844298690CC598E66829D0AFB9A1E584DD 49C447A834857AA14A95B52FBFD821C52C14A81DD369BC36D191B212DEB53F38 ECC2542B380BC2CB429981B911F1F96CC06FBCE60666B9023EAE552889034568 45DE6CFB89B5239BFE906A6851C48B8165306C62C09BF321F399F4BC83CE79BB A26DDEFFC6223B54E4C15EB76DF5821A969D0F382F1F81CD75221AF9E7C533CF C7F8FFC1B839EA33275D04912E1E5DAD521BCB23C210A15FBCD0161D53850978 28F33A567BA385BA8877ADFD3AF068CEB59EBE9BC3B4E2B956A968D7C3462CEC 6C640112E6DD1CDAF55446844587DF40414A48B7E0140868D4335E7BA0CF0F39 C936ECA458ED232D1F109C842E42FBB2640032FA49CA593D1D0F559EAE6470E1 6F2C504D8DF2724BAE6EEB5DDAEFBCC6C9006F00A4577F45073AB63873E06A37 C01D957289E3C066C318B677BC6909AC58351CB4A7F6563C08928A7011AE2608 13B6F19DDB47D5B774D578B490355744BAE49098C0B1307924DDC5F8A52F0B6F 6B7DF43175DC49CE09DFDC7BFCA2E3DBFA0C950018F649866871C2B1B64AB2E2 14F49D317F3E885497FF350E7415583308FBC40BED5479F72F2866A49CC7A749 F289BE0CC79F16A61BB20C1AD73A84FACEFEA253AE8BC533A5068239DD7E9B23 E6870B45AD902204F604EF096C4F60969B1729EE14F279009FDA3E134E3F6CA9 D7125F1C9C24BB4FE132EE8D66490BA55B9106BFF84DEFE7E17987402323A70A 3CDAB85A80D9212BAA0FB5F4F18D292B623EDA603EA5937DA447438D3501DD1A B945E90854616397953FD7B8F23D3939C191F1F701D151F1CCBC4FF279F04BAF F8629AEAE5C8962FE5D4EB8A7E03271E6E3CD2CBAFC9EE578EADFB10F9455E74 E9EFDDC00D04E260D12705DC241DC05687CEB0DA99A1C81FA5131EB2460360BD 3048523F91002C902358AC56E337A7E24C0992B1E090F797AF27CDD228177C7B 88A0E18405D48BDFD5B1082CC8C4F70EE58D60CAAF3E1C1848E46525B476B016 B24B1AB608F726348051D4CE46D9BDCB0414EC344A2B46272E8F7D48499B693F 8E45BC273E46C62B24D0DB8A6A3C97752F76D59598A23A3C7E5F9EC56334A98E 2568574205FAD6E483E6F8D1011327E980BF58E36C445C49825FC6EE25F462EC 86216DF07F491E9FEEE145734B6341043C0B8C043FA79AEE79D4506854EF0259 8DB538704F3F1F425FE4C5E751C9B821F0C59C5B7F2DB8EC9E79033CE46E8358 326EF008F232048CB1CB465D2CA54CEF100DC577A9DBE6BE53D40C616D12AA54 93DAB33B13AF9E243AD636C4E4364EA2E4CE5E5D731AEF2460480790B86BCCF1 38B7BB005E58B5FB357CC5B3E2217D2BC83448158C7105B91A7194643C08A3EB B968870B0FC4A54E2FA5E0167AC4066F21BA0E2FFB34E3BF6A17BCA277C657F3 F6F2C2830FCAFDE78F6E66DF28C6CD54563AB7033DDA036474C34F45D098309A 09D1A9CFB9193BDBDB25CF67B9971241110F6EAD9A1C1F463C4F039DE05FD5C2 559937D09E91151F2365DCFFFC7E3E137897FC990D18222EE1DA556AFA117893 6A717ADD767253A072315D54F7B63A27F9BEF49128CF30B92B46B9F89382CD97 02BAC045E66C930DBAB95D62863A217B011E031391FF4C1AD48FA50F4A0A9534 C0997C9C5C25A84E788803C9A50E6C3842CC8D192B0DA265C7EF4CAA9D276240 ADB90FFAE91DEA01EAC532CDFC43A199D45617B314C49DB37119EB9C854BF41D A129C94659DBA82ED9ADABFF2355ED4C6B656F7BD3450E12E1327888423A0147 F45CE24F98F437D8807B936EDEFDAD86CA1E27D92D639944BA9BA9981F679C01 8973086B35602A34AD40C408073075566E468A5EC54C0095BEFC15B42F1F1A16 BA02CA72157A421191F4814059A186248FAD39085DF33893DAF859ED747C9EF9 855FD52D2D2B0B4D9B1B1275FCEB710A911BFE6A0F3EEF11617B2D41E899D2CC E6A6FB0E989CD6AC25DBF7F4F5094C641B398D126BB5AE0C0ED45043C357EA81 D249898A3A24A72A3F170C19D06EA20482BC06B339EC921C43AF0D24E8CFD0EB E7378814FB3331E98E7154C54B68864961EA5D3AC49E4F105FF3056B7A99CCEE 210C3A444C318234150F7473978266DE728077435379882AC7AD6DAC66C6E48B 679600C67BEC4C3F0CA2A0448218DD0F8D9A3BB3E47614F1CE8B2A1BC157DC8B 5E5F9C1128678080E584299E21FDECDFCC8C652D8273C74BA53ED93DA3911680 CC1E393C1A0CBB8B4C12D541508B1186E133A829A30D1C7A94DC04215539586F 2F2BCFD7B5C9D4F5D447FE5B9FCBC74A88318BB2E326F179E52E0A814AC07902 C51D2F74560715AE3A31ADB7FA72D2090CF95D51C91BE779F7104ED48335DA3B 384C6F42F8A02A12F6EDF72FE90B3578856E1FA81DD5A1F776E466D5D06903F3 B7FD3C0975FF6B6289F9D992C67DE10C287F1DAFAB25B09F927E144813AC46C9 F2EF14347E8921284BF85A81EF9CF97CA15B7602399EDC635ACCF7C23AF73324 72D372908E149DD460454FC23065C46E05A3CAB9DFBC2B7C814B0BD34E961868 5D8CC6354E6E33FA84975478CC035DD60E9EA99765D1F711DE20B3329810F95F 9E4CE23E12908792FF149DC20C4185F6684CF7518E302D73D7BCC58E58CEF47D D7E0DA57615EF1302664D7E86697554DB0C213DAEF4FFE0782228A9A97B0ADEE 667990D71B4FF2E27C2E4795BDECF3F80FE5D3CECEDE6B55AEAB22124892DA0A FBFF8B1D7EEA63482A7E8FD49B732BF02EA2F75D69C601FE8BA456FD444DB6F3 3FB5A51192B447CA0C07F3A9E42E98195AF0BA82B213F97A22345A1306B0C625 070A104368C9E584729B4037BABE8865B88CC744D672D06A91CEA2F5B5248168 A32B8721814C1AB6D2715440922537DCAA00570B4970FCB67DFECFC5AB01465D DDC93B47606B921E308C4F2FAB6957C20FA0DDC6FE6E44E1B418C042BA54973F 8A129697201E6873E90EA60167557D36884F91E93DC0315397BB573674BDC73C 00494077EC8A448934B3DCCBB8B5E098F66C7AB70B9527D55CBCE075CA28C420 0EB3D53A43CAD8C6AB572C429B767517D271F03D31499695AAA047EDF9614A73 CF38B28FB9E21AE44127B3D19CD059B82B743E740B87023E4CB0CDFFEE4ABD69 80878D7E3BC0D914D82B7BAD786FE19EDB530675969B22BE63A9067593544589 AADFC5CAD9D8E3E5A31A3CD377C101E3F13E047A6A530BA7B128923E39126D7F 291AB68735DD7AE1A541D9004C1E013BD2EE2A1F2310B3E6231F307A504EA853 BFDE112661952816A80DD2B6595238274DF83AF700B6A1C3749595DD29290DF7 AC9B3C9C9AE6C7A15F1BF0426619B3B986972AD0621F30C9B110D45C44589C86 2E068832BD08255F2105F7DCC39C519D09943107AECC358777C6166B25263DAD 829358E4F8D0EEB8E5B7678B6973503D65127911604F42B0FDCFC0DAF9224497 BF1574B53ECB05E0E9ADB74B5B7AA6B7B59D573A67F0EE281B9D0AA671562AE0 FE8BDBDA08706F6F8C2410C0FD0BF2AE5C24DA32C0CC3B85F0DD65B84E1D30CD 9146A35083A4D2EC2F02CCAD115036F78DAFF2A146939F4442D99C7B97D68731 A929635EFDB0B03A006C37053807BF53C2A21CD6110960C8D0E6C86E3AE9BBF7 250E1908EC6254C6B60FFDA562B989D94EF91A0A67E27D2DE39529BA0BDEB026 E3F49A83C72789BE7F89CD58BDE241978236563BAE3D4FEFC1181E1C1A660F69 5BA2F36FD4007E7D92209DEF6CBD687FA52FE10F132BF9406B4C04EF9F818D9F 8B707BD65B7464A4C4C5989F3F0389BF7A0D1668745A7B47EEB47566B507EF86 A910753F6D10DECD8A0CF72163AD3F1558D108AF6214FB371D48FE167D93472F DF5957B6A3908A9405A8882222C5D9099EB795A4D888D686A850A011D7EEAE48 D24AABEC056168224FE1B57C3D0F797BA97F548DF2F87B0C88BFB2318B672DE7 C058D31644B1D1F3AAF49D42E1736776A481C39F36363F6BA000632AE66030E3 7F37C5D145247F5C417CCBF00EB2705A10FFED663027DD64A277655CFEF8C824 149120862E237388CD47C319FC863886D45EFB76F27F3F01DF75514CC8DF1A35 E3A93619BAB5E3DE274DF775662A86DFCFF92A2848B616F8C903E6E973B1385F ED077E2E4CD199CD91EDBB7F76B0139E13A5C99C15F99363987E0FB1403B217A 7738096952D809D957FCECFFDF787FDA477F9D5D400A5AEFE3440DC8C7D4E51B D532943AEE5A94FAC64FA6ACF145A704A8AD172A58A1F9DC3C526CDC283CFB20 40FCC510D81B640480A07BEA745BFC3CAED0444E969271BD845ADD32F9695082 8613 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-251 -250 1009 969}readonly def /UniqueID 5000793 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A 45A24ADAEC63F61C9FD18376D3984449A1F998C318A8FE36D0D5020E18A49625 0F3BB603BA1F3E66FF412F6A32433FF8BD2968D79CE4273AD0E0CDDA5153C2BF F8A46A2244F9394A49D339F763F5A7411A3C29336B21CCB01723705AF589B078 3763035411FE36AB5D744E81379106890688CB5BC41184548B7FEBA08DE7288E E6570FEA20C51FACE8E8F824BB61A4A038AB817C47B87391611B77928B2565A9 3B27A573C05D36ED01D8F27CB2C793370FA9B90021B5696280A55F2CB6117B64 293EAE0EA5A243F56FD007773CA35DF71B3D28643C25210CCE25F37A5095D6E5 9CAFD99DD1DB0D7EAD454C13464DF6FF5DD42339797AE5AE467084550FC00139 6EE818C6365007B2FD6E26285B832CFE6EA7E99665A224C9813C036CED262639 3FB39C1F05FF8F31D2DEF37BB9B883334F51EA1243332FE1E3FC91864C8AEA79 16A726F924AFD84F2F4215FB795FC41DCFFC835C90B9E31D291E47AA4BB8C05C 620F69DF31E91A0FBA8E217CDBFAD7C4D480EBC1EB396029CDE615C227A367AD 72834BA95539D39A38EA0CA3CF7F1123F70792CF315BAAA38BBCB6DFA80B4493 5025F33C3696DAD6A0ADF584C71BCB1D29E523EA4B81FFCE15F3204022BBBEA0 A9483EE8EAC07D581162672A0D66199174821ABD097561A263C0C0F24066FBE6 0951F31FBBF2675141F3FB4457CC2A94A40191EA0AB2A606CF540BBB8887B6DE 715EDB1041EBB9D05D0F4A4672F534397B9529EF8743BE88BBA10C81E0A46259 2F2AA7B638E20C9C8A3A827977AB58ABF7525BE15DB66CE8E9B81457552073B5 85DF3FA70B5231C447C5724E14730B90FA35ED1B5723036F1658CA8E19EF5A6D D333B78E91E4D7032EFBFD40A5A2269B0DFD9F7C3438DB58F94B507EB93032F9 99E5F15D9F5D8CB031BBBFBCA8A15A617ACEDDE70DD9C2D9EE21179FB17AD913 B4BF577A9046994689D1BC6A6985FF5F5A67D699C2FD288FD9E5BCAD5453EEC5 68287BD7B8872726C28CD288B4DED2246B843577173450B6E5760852CF2E1727 01FDB0FFFBE12CA13ACF6434AEF4B59EFF3E0DB1E87D35075B1D55AC12633167 5A83A39056C077EAE6F2F7D1DDED300BA43830B8034F0A6AEC562D3023270601 6C594D0359DF6F230F7B80B54EBAE4880AF338956B813E3B8DB8BC778BE0F612 7D84939C2878B43EAA45BF10E257F22C28C2C148FF48843D2B52626148E3CAA7 4527B9F246C17BDE21C6E7EAB4906BB6D9E84906CD1832C4BD9E405AFFE33AA2 AE086C25EA26BC23D68986639366B99C87359915EBB76D7162AA667ADE4954D0 B1E18027FAC2468CB2FEA2568E23DBC201E9B6A1151FBF21129A088D89E3E728 28B2785C1A8B2637F368A93EAB459F80506435BE23A85396969E2AC4E0D6E4B0 8B12EACD150049EF8942C108B96843159D4408424394B33603F565D1622FCB78 06CAA5D4130D0B9DF0314D82B7FB44E584809540E129BD5F0A1CB3108C53818D 39B70FE6E70C05FC01BD736790AB6BF1D77666EE567D3E81C64A5E1F12BC358E 2AEDEE9215289A7832505762C24C512BD53A0C4C531F2BF16AB84CA361B3C02B 83D4CC3657C3285EC28534732FCB4435AEF7A4EA5D2A72E304647C7D47C5C476 B9D730BEB2BA80B1D1F02AAD96241F66E2CBBD3DDE14A7526D16A3EA4C0BAA3A 4228E6586967405518699B02E4E1E0791CC09D81BA3E5C8EF30A01E4BA3FE9A8 850A5F36A09D86D0E12ED4E0E50EF072975BDBF7E3851C8B3B54EE1BCCA3AF19 6D224321FB34F037D976A761409C15EEDFD5164B177CE6472EADB81DF5490B59 99576FF5A846615043AAE17FC9A1231558A634FE6FD43140307E3BD4B7D8C011 85E964CB509F61563D2AE34D17FDEDF8A1DE5ABD41795D77A2F0615DB26B1BA5 339FDC3C894822710CC58E2D727AD07D4CE4B790FEBF4D126653359BFDD68E4C 7FBA880445CF8914A7A56C78C44D97FA5D4B372415BC83AC84870E2583CD4B0F DF1B4D13C9CDA7B6E0DF092CB17E9EB0C7FD743DE693A6DE09D0158D8A1B45D7 277F4E37DFBEAA98D9FE44EEFF2F4C3CB72CE37279C2C69FBC12C14DBE1E427D 9985B1263B07E2BA83D5FCE319CEA192B341ED97FDB5758255A1F2A193B86DBB 2EB18553E35C5937A612643372A721035F37F37F1A3BA559124D845181A1C2D6 8721E26BDABBD340E448DB1CD2382BF6DF4085E18EBDA9D0F85C8D0C4DAA927E 62C31362733796212A5FEFA395CCBC6CEBBFA8E7C4BE7FB35DFF6BED7075D4B8 ADCA4BC3281C9C4DEC31ABF4DE7A897363E531F26D8E10AD0FE3BEB6C9FFF50F 3285872BF28BE9D2854967106C2A4CEDAC9C2BEB78FECA3B70A8A938301A6EDE 383F0E422109F4542908D19A8F239272246BCF495AD64548BDDE75C1E1E8722C A11F81E1C8F55DC7B0D5C90BC304268855EE56F127EE6689FA67C5543933F035 A5C7D883094B37D4291033A85E022B9CE189D4C4723CBE67A717F1C3C7153031 D964B5474251266A2BFF9BDB298FFDEDF28239DB5A743FE290FD87A87EF413F9 63884223669B3363DAE2B9EB6D2BCF13039FF12D915A13BB4E2FD401C1AA845B D4D963E2006F8ADDD9498D13C5B2ECF729FDAF66C59FA1BD5BDAA93F63215BE3 C6D3435E68B5364B513E9BCDFE76AC5CCC498C17717EA9B34F55B2F0A748B209 13795CBC78723542E79C21224672957877B5328B6C0BD2BC3065185FD3DEBB77 FB75F6E743382306C4AC4AE463A8C7A22102CCE33F871C371FE307BF43982546 7A8D58E61C7B650C0315D2905CB835327779102AC59F86D71036C7529D3C286A 7CA6DD4FD83969B2D9ECED9857AAF29C75DC9D233C0395BFBA8BA1A93A7CE9CF B257314C5B777E41DF47FF247FE887DA428DFB6956EBA8C31A8C69C0630FFBD5 32BA5B4E5E425C372DB4662322C26AB3ED335F918125CB88EDE882E29B0A8A6C B339FDAA8AA039A13441F3D9754EAEBDA6E0F79584E7AE18D6FCCBC088A04D2E EA1C77E0F653C9E839AE8143123C72A957C49690FADCBDE4171E31236436F4BB 14B738F037FA2AC0045E335DD3C542283A37E8641D9D68B93471916465E9BAB0 4FD5885D0C9CC37B55A108653F41DCC161644CBA27FC65E986D65C3E77130D32 1CB395065FD9EAE42D2EC3BFD5F4BF93148BACE75EEE12042B8D16739EE3E5FF 89737C5377AF17267718C6402113819FCA3CA1FEF1D066890F3C00FC41765A5F 280310B93BC5E8EF9747D789E6516875BA01D6C102CD75EDBAD66FA1F6979D47 80B3D96A7274C4D6EED7F7292DE4342765409D83C74D38840B6C06407C4F3D89 25C1D5ED60401C79CD1C27483374A7A619B5644D05B7ED6117217630362E2AD4 B24CC8B3E0E2C84A372C255A8902C103851A5BC7A3EB3C4598E032BC1701361A 45F02F31CEFF762838331D017DF28DA68F1800C92E25D56067C76652703033CE BBBBAB14A51F80297CF58D040FB80FC025A67ED9AE83DB6856A6610531BC3D10 9722995DCA720B80064E1F21018E55F045E16FC66FE6A908255C6F5B9E47A3DD 144265BF7D6D26289F181B59D6B7922903B6E74AF6A9452488553E8585090E56 B37B30F52AFB4EAF3EC66614A30E95AE32441CF3E7894771AE5E0E52919605FD C91ABD65DB66CAAB0CDE3F8E6DCC6EC9FC5C5095379C8B4927B373B1EB4E2F55 355578092D37FBAB34706933374BD9D21952D6D36C5503D8722E8D2982898D6B D521F8729C98CEDB32C599E19404845BCF741132582B3D4978CB295D0474B8D1 B0AB594B876B121D34864804CCE0384331CBD52B048FF6C112061166BB9B26EA 58BC7A029C4D1E7D3DCA7761CFE9CCBEB0244CBF430284E9B3BFD9BBC9F8A07E C02652BAE458EAACC24706BA5F2E78DEAB09FB493A821A059828BE3736B99DE6 897DCD2E33A2D81304B752A1EF15F6A0D5B9F83A884B9B3655A9E5E3220CFBA3 0E95E5740449E6D9C2204E7F99A3D308C1C85E49410255D73845FE3DE5D4D676 7BA53B7B77AAA9A3AE35C388580A2B53A374B93C0BD2615BD1D2952EAC8444B0 16FE3EC09C813BFC5F1FD8A31D3E75FE296CA10B6D4A781EC5DB69094C6406F1 655E8DBB8A860F36D6BC8CDC73F1897DC2B9E857D62F2D55C1886553845FCE51 56FA3F716155233C612C4FA50E23F4F86B8C1CFBBEE521CE12395CFE1C8F1F79 C1B36D0495DAE326F11F9D4317D030297B60C94DC00A26AE39A30BCC2A012B1F 0E40FD46A48E10B2481E6FF51EEC7353D97DD0E41EA46D9EE6224C66480C4EA0 4115AA240F2F3BE396A27E0D07C220CC2C459A831D6CE04444C496DDD6ABE5D6 866951C32F3B90279A81052649276D274410B7F972A982559EC861E3F86B02AB CBDDEBA7D20D26BB67F1C9E401543EB8BD5109C30D606F7C01F16B2B57CD2D34 4BB0367605D17A3B6B4D59ADFD50F7A87A2B8A928E895784997F0E75A56B5770 9173CD1AB4C62C4AC5AF3CA550BCE880F4D8CD21EADF63F031BD88B7D2E5DF07 D220165FD5BBA85B40933AFF96AE5DAF6B374D098222BC6DDBF157291F9F85FA 5680989DA3445E81F82453BF6E041C78666A0F35D499CDDBB635BC6DED03C0FF 620267618ED6F663D8499D04C6F7440F86F516C0C6B4DBDBC5A6B80CEF169B05 D07572FF3CA71E5C81AF21A82EC04EEC256CD116DA27CD622AAC5A2D5A68B403 017A15C09C8D15D2D8D4850B2626D32D04F32ABA41801C719F25BCD40BB45316 E2B7D94BAEC19A0E3D8503C841CD1402E354B8B6B05ABDF6BD4720F841C88B83 98D021B3D799EBC0F4063EAE9EEC6F9AAA0E49F1374C6AA45B9E17D9C9266A70 E4ADBE5D40B67E91BDCD439477A9D122279DD88C31F99D875E5CA40E0AEE3976 42C15C3D8749E5930054CD11398573A4EA8848B5186521559DCA96CD7F4F0021 B009C12A11BA7FC07723D65ED1584E8B8B86977A931C5CC7C29EBBA92A5BAB6E C856CE37FE6E4DA11CCAE2C83C67E65CA1414434B385ECA594EA409BA4765F23 4790C70A6359474B39C9CED90F711CF2B2C18F0434D071F03FAB71A6120A266D FFC94110C40CCBA70B239EC6016230ABBC1DAC716B969EF9561A48D6FE109B2F 4A16078FC810CD4C126CC81D437192F0D92A7AE56EF5806317B91B2E38BA5FD2 152F57DCC196769E91544B1B3332B5846618F80B98DCCC5AC7034C68B34AA8F1 3C73B96E9DEF51452404E772CE6DA197D87449DF5642BB117F6516510F1E94DD 73194A416E4739119E83EF0463C621EF32F43D657843B55B7A4C98A2005C2F3F A4E475B8FE1E5A76CA6BF3A4C52CE967D5823BE26C0C63D0718E61B1639B3421 45471CCEE84FA7389B7D25E299B74CE0C95D99002020BBD5C27B58EEFEEA13FE 9B175E666EC61198E7FF6DA2668F4190DC608C831F8569DE714E59028067F631 7C31523349262BAA1F255E4F4B2F41C8BE4C4F9E5F4B8CB73B8A81A56BCFC4B0 AEC35EAE6F39281BC599CB4252F579C9E8339E5B4BDC490598F22F2E15C8E299 52A12BE2CE2CF70F62BDFA10E84C751C1305EB0F38359053473AA0E90A78DC05 415545765F28C4C507CA43C80CCD6CF052A90E59B37668390307FB3A4F74B4BD C0E8698AAF18526E61D48AA3EDEE223DE06738AC2C204551DE2D0903AF6D06A4 F5191DCD2C295FCA8AAC0FAB9A4E199E06B397A23065F69ADB9D1B225B81EE10 19182E973B23EB9CFFCE3AEF0BC15A6705057EAD105D90945A7FF8D59DC883D9 722DCB695707BBD4CA558B92F4DC90BA7607711EE1AC4B298BDD184666B783BC F8FAD751CFA495515FD38501DC3162ACAC322E37A9B9502EA32CD6DCAABBA315 3D2F7B704B191DB2DA311027B52CF1187735BE467B877E8C161D977C23B1BA53 BF15A1E3806E12B6861977C4338425C4C3DD07FD15998DED880FEAA0EC3169CB EADBA666DFC67274AD52D11A5237C40E52E1CD399F20334BD8CA8048F744332A 1EAB1B53E477CFCE4117D8EF3B070524A04962E446C9AE63E36C28ADBFFC7197 7978A4FA47A428521AFB6B9981899D22804366B4C35F0A843BBDE100EF900DC3 DF47C41C1FEADFF2FE6553B4F248926AB83D0A7C496A30B0E88BDC3AC4B4AC5C D9DEC892065B384B7A8A8E7DEB11B7C4C21FEED9E9AEDC33758B81411F0F951D FF133AD34288FAEE9A66D205799F46E7AD90A5305AE5073EDC49F92F7EC84B9B 3900B61A5178C73308D682A76766116E8A428D3E3D863AF0445D96DFA38FC050 EDE2B0AB7C45287BBB0E6BCEFD63B237A39801B25E6A71CEDAB53248D99D9129 E1CCB2FCC4BB7CEEB949FB4A13F58F8E74F2B598F6228929908889D1F6577045 7982B7704494603CF4F8EFE0217980C094584571460DC3B5238FB76831FA428A 8C47D7D7594109DB1611C43AF80C6DEB49AE380140CF252E185A6B7ACEF1B50D 83EC10D96D670437F19E5271B8432B7D16C57A987DDE4A9588B2C1B8E9FA4985 605EC0394FD85D4C5F5A509E7CCE080225BCC173F4E53A663EB7EA79B0F70033 C7F50CD240114DF7DCA44A0E53C44D3F2301CD652E6988CB8E298B164E8DE162 E2B9FF004823DA83A24E630EFD03AFEA61FC89E5E8FC60418321DF74E7E48915 398CF921FFE37CB17F0B51912D4BA81574F053B33FBBC4CFC408F7243C540573 4FB92A4A31C212AA0191CCFD11E0732C48C5C7982BE9ADFB3CECD9201E525D9C BFD1D0ECF07718EB9A8454BCCFEB1E7D393714524833BFAB30AA3E399166F2D1 5658A2B05872A68137956E704C07564A9D3C5175B1FE1FE9CC2660CAB6945AD9 EE2C97D3BAB1AC4948A8D10D501F75494A038535167363B31D74951094B841FD 56311A09C95C6CA23F7C472D2A129DA2EB4BE5A5189056ED8A43B9D1EC9CB03C 500E6F53FC51473D803C3921334388FE4BA02DE82096CFDA7A229AC5EE150E7C A3156E805A51C949ADC571A47E2833377FF0DAD7FBE5DC94E6659D9262A8AC58 982360E634CB52A742DE3B77BC0488F243132C7C6DE03522D50ADD0534E45FAD 69B61F65E3E88750BE7679EC7D1013621253841C2FF19C5AF2C0DCAC5BB75A00 8304B7C42455F882E426BFE8343501B6221EDB71995DABDC0EEA1208D71B708D 5985D8231ECA76BD068463E0AAF2BA436C828D139BAE44EE5A8738AD9A87E880 8E0F23C2512960AC35EEE5EB7C302B23F85ABE18332F285830EFE80A533D91C3 D2797DE6E1CFF245E3D8256B526F51FBBC8CC4E41DBF054EAB12714C09501D9E FCF2A3FEB856292FB0AD0EC2AAB1CE25E00C29A22E9053B627D1EAF96DFC7914 11826F1B90D7F800E6EA976F424211874B60DDCBC922446C9A7FE70EE0D1407A 898A838AAFF95B9F172AD009C9F18C39C12469FE50FEB7D33305E07AB04419BF 51BFB599137F8EE56DBDDD5414FC7050F8A884DE914921AA8220352824C5027E 9FBEB98C4DA96AD43908810CE3D121C18267314EADE3721A9AF00EE635A4BA54 61E95FCF0DF304D68BBFD0EC7BDD9288989F422B3AF458BDDDD770E2A9B27A4B 477008F091153D7836183DC5B0A27631375F8E0A57F3BB086CBEFBBD2A186589 2C2F16D9CE6571584885A40B9AF06AEB41D504A2FFCB8F13EF8D91FF6A517CE5 764C28BED09C0F91E7F849D958925E825127E8CFEDDDEE20C3CA54B02AB7A953 F54BFEE8D026CCC1566F691CDE382B8915D4F0152A9E76133B373F944D298D04 E2C7E3CBDB9DC25FF556B2ECC208B23E6ED4D64C537835848FD141F000102F41 72D670BE80907A66CF3809D329FF4FBD204CD8DE182014E94CF066F390BF4F8F 81F59A42100811DAB144489D1EE503C70CAD353D71ADEBC317DDE04228172C11 A5A07E69BBAFD05B7C426C60CE96D40FE617E4EFADAD9978D97F4BF3097F0EDB D782087A89615560A8B4A65E4FD65D2E049CF8A27211542A3B412AD425EB2CF4 41E6F76AFF9AAEC30B7C00E0F1919BFCD6142CBCD27BF88244807FF744DFDE12 1CADF2A56E5A6DCB0500B59B4BC7EF059BED44F33C38D87B1A0FC954254C8B16 5BF224CA8D8E88D354E65732D234D12B931F117B7FC3E7774828785469E42E4E CE7573A6716A0A8E9662439BE56E02FDF83ABFEA9821AC1F9E881EB0709190BA B20AA379A51320F64AAA3C3EE9B01D2296AE08277F00CA0123F7CE73D0A5303E F1209139EF0D13FB9168A049718B1ACF24E37D1FA6904662EE21113B884DCF7D 6A8FB72874876304B569895025D982890A56A706323B2FA094C081D41B12B2A5 E1E774C25173BF6E8B49AB095FB072281CE081B1F87AFFA3C9EC9414F5084E94 6CC0E4606A3731F5FDBF605923870F13633699BB807A2841A0BF5D0A0DEE0C63 8EF0C919DC51E521D1106633A2D5029E342C6731E8577CD99A6347277ED1CBE4 BE2CB8F3ED0139CED26FBE9DF6196C35C4AC1F9447BBE721367856F41FD5F6BA 89438653DAA47691D721AB4E43320B8EBFB60F57B88B9CA686A06DCBEE3C8243 D72C4FA9AF792844A307AD8634F924BEE44CE7985B22F4CCDCB27A12548E9C5C 1342D4770165F244BF844682324AE505F1691F9E3F40F0749C651EFE5C9CAA0B AD25027CE3261F8FCC4C85194A2AEB89E43DF677682C1D8CF2F8877E22CF3495 26DA5114009BD35888FB63FDDFA9B3BEEA2338BEBF7C4173D0DA1301DD1F1807 B7CACD2CC43134B57D9C1BCA4B6FB2C1B130E7ED93DC5ED5DB88FF07136C4ED0 364F0C73CF322A61A917ABBD7B16AAEB796096F38FE58C42629A45CB1C24ED52 39C245C649FDC5B4279FB8F5E7B62CA34A3B6F55260C431BE44B996C698A9945 87E01C43661D7A00DCB44307783A1BFD1FB974E62D5D6A2C3B1C9D9DEDB624E5 209D68F825916F11704F3E0BFB31BCC9FBEA0FC14339B7BDF2B41F99833CA3F6 D74BB1903F2C817DD049DF5469170235938F94F4C6102DC573EEC689013986FA 92CE7968BD07DC5E5AEC9A3EF83ADB1ED55098364465D4A6CC3EFDCD920EF6A7 30315268E4CF0ED0C771BB28BDB80592344590F47FF061C17A08DC545ED09F70 5D9E5A3CE66BE5C3FF8984A7EB4898E480F39A7BBDD02F1B51FBF07CC6CDB142 9C173AF1C076555D81CE61E05F6B3DBE47EA1AA6E32774ACA196C7AC2221222C 8A415C9AADE497F05BF6F253B46D3BDB861E29AB208B82592DC74DA70970964A 884DB3AD0C017788B8A07516E5D7A6A041F8D8F6209DC8E4C88AE1791C6CFEC9 5F9E002017C39661FD2945E0E2E23CACF81F0B2FBAE896D7BFA1920A8D97C8B1 F3A33052B12548DCA6D8F5FF2A80107D124DDB91964486948310F67976887167 388CEF24E7FCD2C6A9569E2BD6A3CE7CC5819C7789DD668EFEF5C0799BAD8B8F B32617A3AFA63EFA745BEA2B547C0A06AC20E23348E9783928257A02C3630A27 393140458D031F74812B9330917AD2E05878F2564CBBF3F5BD6065740D2A01A2 BB56B3AF5178B25963F62C6AE5189BB480FC0E7B7AEF27522B2124F353113ABD DA8F303F1A1257C16536799789594C2151A62A1F02B77D05EC1A8BF9772C88AB 6047039F83EAE2BB6959FAD81F0CC05665C2FAE2C7880ECD89182B9D8A541658 22E850695EA87809EB1FDE41EE00243FD037BBE2D48346F6EC1DAC66CB6B3F4D 23748DC959CDDFAD7451FB2420BF172FA040A7297B40E8F42A855A4D14083E0F E598C2D1EDFFF2CB516CFCA4E029EE59AFCD5C20B3CDC0A7CCFB41F7EAADBC85 E1A62A508C1229A3E83CEEE6066F85AFB0C0C387A8BAAEF3745D30D303B91E44 9A23EF21AA4D81D66B13E1D2F54A1AA05403B1D812D8E17832E42C272651CBFC 9ED9B07232ADED73BD57E8BE6EBC24C2E374A58DC3AE53C56BAAB5919F505A91 F13CC84D2AEB85A623653F1ABB9D2C70DD1E9E84F96F61CCD80985191F8658DC 8C1CA27C6D68F876ED3C7C1558BA43CB7B9180BED3217DACBDB1BE3809CBAA4A A7A599844CF124B29A7EFB6DDD688598C4B553EB4AC2322DF6CE15E781C4AC3E 76BCCADE268175DB8ABFED17B69203A8D3A7F8EEB2B2E99E87526F20BE5903AC 1B8569F0D25BA3F15F484C904EDB23A2B17F8459AEEACF273DAEFF1B4FD8E060 463E018485E9E1F320DF325D2CB845AE74F2D70B32C1E6CB0E42D2239E62BF27 ABF6DD7238471018E57DCFAF5E45AFEC076D2FC2E3109ADC32492A649BD20B9A 730DA0B72820A913DA55157761EA4CB0991C6ED79B783D3C03CEED2A865569D7 9381FAA23F5BFE0C744F65C64FBC2156EFB7D9BB7EAB4E61EE65016A456358D4 AA6F1315872061EB2AB40C93D3B2B6CDAD1F4425C14BC8D49E3A5C68429AC484 7DC590C0DC259A1B91668F55A42E8356D0059F2CCDBFBFD1A761A8A21D2F2820 9DF9422E880943F37CADE411EEB9B99F77F3049591F683184D5080A03F5BBE7F CCB308510E93F5683949A77EF774539D6FABB437D9B052410DF6BE7317E77D13 98FF28F89925F9D602B8E32D00624EF0D873DA3EE51FEF3186DC3D6203CF3E3F 8D3F149D5DA8E67FE41767DECFC8B766786B6E855C168BEC8B5D951DF736B7DE 1C70F80222C1709AC62DE5E6AAA417F5FEAE5EC12F69F18D2984C24477CBEDBD 04D33CBB53FDCAC3B33CE77F0F750A1CF57CE3334590B8305B56C0EB35998DE4 2514ADCA833DF2865AE0CFC194A34729D19FAF6D13B831B456EE4EF1F43C877D A78C86FA52D7EE9DA1B590C9E463B6485921CA39F8508806DFB17A9E1C66E92B E361D1EBF1F2460DFBFF51B4A14C2C194AF5A4BFCC60E00FB5B1E011CF5D1E44 E30313D5F8911B2AB2AB4B1FCE0EE4839333EBF71F6F09375629CDB05565E266 55B4F83390655E539B90D76F48E86540AE0F79480CE29E717FE9DF56638C8C62 C39C84E3363CA96C2C52F1EA0541016C60B6CE8EE0238EC363865428D387FC50 9BFDBC59B23CACD17E9E18ED4BB9BF1F188B0C666EE2192127545418F24FDF77 EFB40AB17A69761F9BACEDE08F62C1575366B9DBC3D314AF0F0DBA3F8351446A 342E5815A58E2D2C8D8160B3FCD7A0638F7D94A4C920EC48D388360372FEC850 1F36207EC33CD7ADB9172501BC547094700B527D49A757ED7452DA34903ADD68 1ED8438F1CA9725B1E16A790FB52BB01A6FBEC1DB79003F7C7FA8B6FA8E20EDF D0CD0896F2ADBC66D356135C01200AE934AF2A4EF46A75BACC83F16516E2129F 18ECF37F2409B8A2B694C66B4AAAA410AA840D0780E8B6C2EF60A75C2C4A0E2A 9F9BAFBC080542495ADC667F78DAA60AC19047FEFF38685E4A95AB2BD64A6ABB 6BB0C83E8E591BE385EC1DCCC169600F7A76783208610B8953C547CE427A3CFE 60869ADEEED395D13EB1D9B5BAE03B173994BDE69EA3BDC399C115A47C326220 47D44035C94B8798F8BF6A3205AC7A0B66666E7E0F5661EB928D049B1F9F85A6 EEE89BCF7657A6A6BDA0916B619604DDFBF3A3CFB30F4330907E30E7A412CC0A E2671EDED3D9541E7986DDDB82D67B634D5FF2885834AF8A184069B77DB5F93B 03917D634DCD21CF682992DA3FC51BA19B935755B65365C875ED140E727AF84D 21137C1B5D8A554F52637EDF49AB64DA73831FF2A91D4C5CC4A191830B21ABEE 8403ACE1384A903BBF438534C3CDB6E99ADF2557498D58FB2DFA65963599F2DE 21BA7CB374A0CC06AB2BC99C56BDFCE49C2B6867C8918389D72D88F0FC2AEECA E8458D401B306B2EAD3A3AB4FC15BE80CE46C1688AA423629B542C198569B926 9DDA54AC7237D610C868838F10D44A8DE5AEC67A2CFEDAD4FF08B5DF450454EA 190D38489281B4AAFBB3772D20A2A7D37B4B51FE00DB08827C6F09A548766466 37471E5EFAACAD0EC75B1DFBCF4B1FF72C5D1E5C7CE96DF2F4B9906DAF36E856 BCDB4BDA470BBAFEA22822A1A14D8B6EA95CC5397C3313061293A169DBD11D7A 0AF4308E43C1749171AC181852C9B983E2EDCF82512C507635A768ECC644F83B F98265D65B73CAB2D02A8F6EF481779A15146D6794A8F9488CE22FF3D150E9D1 06273673E760B6B7F845AE674F48BF52F2167E838ADCE7318A0ADAFF9F076930 CEDB94F464BB01C9A07E892FFB5DD0DA7ECEE316B1DBA78384136EBD4BF89172 90FA957DD697A313FE5AA89DF0E48F8B634955FFF815F6D57291452674401658 70624070D4C1C0965613AE146658E0F924E6D7A9B8D568556C493C0332E01D33 3D2C2D92A4CE69B9F8DDDBEE5E0CB9AAD3904DAC0A3B1EEDB64FA5A2269B75CD 3207DBCDE7998170E614144F1FB6D5283E0CF6595D269FFCAFCF89B586938B1D 1D7C27D935FE4E717A091252B29CC8C5E166EDB4B08553107ED6ECC9C85EB6D4 ABFE231B8664B26049954CD41377C6913DE7951344ACB744A89EE044447DDAD5 FAA1BC11DFCDC85313F79DF89C9361928F1BFF4258084873A11D067F2BD1C0A6 351927D9C6A38D7B4B2B90E22026E7A9D3B280390D43FD640FE409F619C2D871 99193216AB3FD50D65596F30846993DCABD5595FCE5A9CAAD37F7C63FD7980D6 3BEB22428D5C6B1DFA6D893DF5725C1097D40F4A7A68A23ADF8EC6FF10BA8077 85392CEB0BBD9D543ED66202EF11343C7DDED413E801A4D8B86F79E560997304 04EACE92D93210DADAC3701505100439671D9C64FDFA86284ED8F91A17ACC75B 675B1E07F2CB4794DF568B81E35FA7F7A3DB99D9226A5E1F0B953E6140EBA895 B084416193798970F3B2A84825EA8C1C5064928958ADB6BAB062030883C0BBEB D6C9309059FF81333E9145154D0FD86BD8A4922AC8A2C551A91B0A4A194ECA3F 9170CF51F7CBEE6153F112D2194D93DE1674CA1C96F96C5B104BE1BC6E5B9490 8F9CF9EC37487E4044D36890D6E75FC341569242925781FA17BD10638DA4217D 215077EB8149DEEE16C1BD60D1050D2AA2DA177D4A69B05E7C72ACA0AF7D1C72 A7696352C5CE52181133DF1ABC98358DF676E6AF9DE4A843EAF3DD7AED15DAFC 4FC2121630BFD1E751FF6FBBA252D833138A45B2765D123A816AC474C37BC546 A457EEDFE776CEF6EBF63AEF8AA8006C118FA9C71CB8C5E62B7DA18BF48A206F 16963B679B11C2F3C61B367585A34A01CBB3349270773D0521755A7726F2FE39 47D0F9630D4C32BF8C8A638F920FBEBDBE8BC8D66BED18F520CD7CD940756DB8 8CCE96350E4A9E7C2026803BF47424FDA4CDB78D76947A8CA008CCA08F6B09EC 4ADEF29BE6A3DFAAC76E79F032500BCFA160EEA123F07FBD5518A3CA9AE2466F 0641D156159B26B324A2B85C906BB03E79F4177DC9AC8EC49082386E3EACE9ED AA0FABE2ED21AA493E299D3DEB9D7E80763A17052FC1A671D69FD543725B45A0 BCB9E75EE8BCF34D3455143506E31D527BF06F599E831F1FF42FAE6664D80587 C9F93CBA1184DD2426BFEEFD40AB1C75F26475850C14DB1A70F417A5F5711AC7 972320655404ACDA2B7D554E96831558588B2C0D301B37B4618A474B2C239C49 9E65187F551C353FC8E51C0972CD10311549F2644B4BF50AA774296A842BA7B0 3E7404E78CB89679CB272EB0F0DE09D8B62E838AD639825553A5675F4F52D75E 4CC44FAD42516F6142FDF577C5E6EEBF7583CD74429301ADA1E9CCD80AF13CB5 C9BB87EBBF68BFFBCD694F88018A1FF648DA2CACBE271AB81E5B37A7BECF165A 86BC96C6649CFA879B403DB920E093B7575F16C5F72215D0C5F6975029C7004C AD30AF6B3B51EF91D58CD721563F0BDBC6FE7BC27B6B5CCD25CE13FD2885A85D AF7D1A3BA518725C8A2E4A6ED70EA47B29D206828C4B737849FA5020C568CC85 312494AB2ED280F0FC86DB0310C651C9F3D56EEC5DA1B4F26A509072B3DEACCC 51A26884A78FF4B91C56639C8A5AD6CA0CE9A954DF4A242F7B7F360F5E5030DE 97731BF2F61BCB6B49EC7BA565FFCBB07D2363E5FBADC3E250E37FB769457D0A DC6CDF73A2C5ACD481F8E8C47C206A7A96A7AF287D90BC6EE0AC1370128CC8E4 817E644330DE8B2D19F57314DF9E18FC6E65B8C8DFBA38F1A8B05F12EC5A47F2 23159EF6782B3B8A0F3F0B9829EEAB43050114454F45ECF440C28BBAA78B637A 43C347A2F203D2E898697C4CD07DE2643E595540DEAE0CD1737331E607251932 3D2176C89CC9822EAA705059F67662CFF46A187B7BBAA4E385ED12222B94F6A0 C875ACD87D6A6A839BD89AED2FBF407EAD021B2BEE183A562D132BECD1484350 C800D6CD13F3388ED9950D9EF63682DE48A645C6444969CE3A598AC02AAA2035 5D6078A2A9D01CDFA6DB4109AB042D69A2DCCE31E68C8903842F0198092D32F7 F711CA6DB360C7AADB85721A1A135FE6C82DDD2C144F86814A271AA32BBEA6D1 EEBA8F4B0FA55D88FD0F35F89FB6C17B30B32E256AB541408260EC256D5BD3F4 6220E0A1CFF75D94336A22C1F05677F9ACB6795D5EEBA187B2D2CAE64E93BDB2 3ED2D31837FB78A9F64E7B101601818CDA968CB6FEBD18666F0198DE2C7CF84B 07BF6990AA8D922D4879639F4773D328099A85CE475A855418447E287BCF5627 C1E9358538E319B9FF476AFC769990EC2F3227289E623A8F9FADC68DFAB84420 B46C222E9A1E1DE37206D1E67EFC4788E6DE8E20395E64DE927B4DAF277B55BA 5CA1DEE342E89396C708E250E64C0480BEF81006884027E39CD2FF160ADEE625 BA28D981D0F013FCB399832F726598525E9C1F9F2F48D43E72D90637B80DC500 AEECDA5EE61E4B0DAD58C17B8190AEFB079B656288B405EBA3549C03DEB74EDC F6A83F8E1C6E1587A6F16090FB64F012685438A7079D2D8FCCDCDCA6BC73A3F5 2DCED0B48B0996DFF9B21C00BFB13B90D3510C6557298642A6F9B49CB2D0DDBA 78BC2F9FD3A9F550BFE84C8CFEC4684E7374BDA4220E4AC19A016C2169DFFA87 9682E452DBB067F7D58ED102EB42C3B25F343AEC9A40449AE76170A69CBADBB7 F8E786A43A5C20A1E6449BAB93352F0156411E1B05D64353A57B28931C6F3888 899803BA690AF4C2DBA7BF666C8461D191BB3CA0DAD7C29634C0147627095788 956FD0D5870EA8126C058850DF087FB2B26ECF88EF4705FF421F7932FFE064F0 6D2C19DC9B3587BA0844E51C4D0CB34A7390FBF4FBEC9811EEE83CEC9B19AF56 1041094B60845727AF2582967CBC6816974169504EE2F29DAB117B3F6AA8526F 295907CA4817FB6F9F173BC933940275BFDA9A37897E53571F685D9ACC54EDDC 01A148D7FF8EC5C7AE5F7D733FC4F5F3E765C5952AD947EDCA335EFFB0D7CFAF 849DA9F1E7E94626A725E020ACCE421CCFB2947687B197E45A89470F11C0170D E6A9D7DCCFC111C0BA860DDD95A9454D7A5F6D0A000762D4BAAE97F6D2F236F0 51EF0734EE5C873C7A92493D265E81824FF88B57EC0AE85E4C63214C2FFF46E2 6E4D419FF34F629EFB2E7AA70840FBE2A02146DE92C99C75642A583FEA46E8F0 A10857E6FF9E5AA79CD6D3F50837187204E10813648CCA947B681377556338A8 1778776D992101B1F28B38EE7290353D067171E719A89D661F9F94C57FA1E3E5 8887A959A2202BA6845CED2311582652B3585402D489772678C55040FABA6AB0 F3E476E158731924BEA3E3D56737F480EB04ACB646B31868455C6F16205A9645 D0B0998AE10DC7523661680C9FEB221E0EA5BD7ED51F33BF72D4BF032BA66FB9 FD7427572251DC55E2200428AABBE274890C4118D66541556F1570BBB919F803 8887A7E1F036DD58334BBD6D5ABCBBAE11E7CD437D2BA96C5D6B1E7DB912AB0C 793672B034EEFD5AC12AECD60708E382E6B1E316E356A3BB5F75E304D65FFCF0 77F499074895D0D29E96AB4957F6E4787486E314D5ECB961F7B309109ADFBEAC B199C3F3639D5A22833BE16A52A649425F699C62FF5C65D73E7E8E5D0EA67AF1 F4E99225EBF46A57814EF1835B21C290206D33971C89AA8A9775AF318A16FB96 C05E209E8CBE865B20985C0B9B7806750CB21FBD9F34CD8B07E614F14F4DA198 29AF408D27F4A2125E2C538653941EBC9A1D7F336B3DBCE6BC26A3E3CED2888B 05DB41725F9DE091FC10F56FB37ECD0D1041DD9D4E0559D5F42C4EA2E11F75B4 FB8F85AA6A6285A3734C92B174584E093D9DA6750AAE9AE7B347CFBB4C23EA96 2F35C34ECE25D0B1F5A4F09401F51BD9426100C70921A1262C2997E4D9DD6D52 0B1B17AB246DCC951B008F0F1FEC33AD9937A9C9BDC73BB1988E473872B0943B 07CF8711748A56119AE1B510373743C294218C82BDACF138F367BC51362EBBB4 9214B7FF03B63D098880EF7B3D3C3999ED963AFDFBE812591E9252ABE6D6AF11 BE2FBAF37C39CC4EC67F61A4708644599EA7D62F9675387D84178CEC3BCA9831 3EEE6EB86BEC1ABA37955C534B2A67E20B5682A84707F035F20CB8E8D96E304C 88F7ECD16BD596FF9088E50FA40A81A2D55B0EBDFC04EC80356B7ECC5434EF51 2752D2B78030FCBAC020A17094612584F3455CAC38EF66335AA02BE9E7C20641 C6BE5CBE8154E11F8F2A2F9F420BD28A4205B0C75261F100E1A26352B0140F94 715E7862AC33F9996EADB3C10742A5FCA54A23B52249871802482F031059946D AF245A2935F8C7B56E3DAC250AA6D050A2083028373AABFA69D9FB87A7CBBC07 F0E6236004F6895CA759D5D5E821472A41917DB1CE166E83F1548D4A8CBB9D41 E252778BA5E9C914097928D582D931D3C039ABCAC0EB07CAA6031F6F29695339 375FB91214872036DBD8E600A6A97374995BC81BCC727E4CEA9FC1D7AE638250 A857B3AFCC2C58C9C11EF5741421B9C63C97BC469263F21A252CE181C3A1C087 4D7BAC7958AC5C12BF66AD8AD62CA1FAC138A58259ED4B407C9922A96DAF6D4B 4F03BF1BCEB8A454F4F28B02A1F55A5A436A5C78F3435180270A5914589E5F8E FDE8323CD3201DE8BFF81E84E4D9527119BBF7935DA07371F90B8E4F867A24F1 3BEBB5A73A2A348F52F3226F4ADCDAFFF74C3449176C149807ADCAE7153B0B01 43F73752DF79AEC6D9E097FACC59A4FA50D9A333F6C667B01E5E29F8D9A67D49 EFDD694A293C805D448559882E0975DEABA67A0B6CAB6A5CA5C98C4C2EE46BCD 30F3AC3220FEE71A6262A83FDB47BC05E8F25734CF67EB516C3A1EBB93A4775F E8F0F1C709F51ECADFCCEFCC6A95246C3514362660FB3830462AB6A4D7B3F099 105A75FE2831E26743577E9236B6CFEED0DB8FCB7176E9167B9EC748113C9362 D82F22E21C138FD88658DD3880300AE70BE9398CC6074746A61717279CED2C79 20A4316D41100620893E91B3CBA244709322241CCBD290C0D1FF3A4BB0DAC7E6 87FCC6F56A71D348031CEF7EBAA7BBC32E1DD942FCE2C3D36F4BAF5F3B4A2B95 38DA7A0B4FBE0A651DAED16C5AB502265EA8049867C8BCB9AB6FD509AA438939 50EB69BA953F24BD9DBCA82EBB3B4F6682CB82E64E3CC004233D61F7218E3BBF 8E455A43C285386E7E2DE20CAD0C05B3D30833480A1F6C176804432FDE74CF4C 0E89F434FC16809F68056A9E9AC728AFD420A5228974F1D5E78DB57576C5C803 40009649E970069DCE65042DB6DDB2769DE31AA1B42B57DFB88D64D55E4DBFA8 A6F48546FDBE29BEDAC5A06BF05B890D7CC0FDCA22C5C4572A76596C90184EF7 ECD6509505B5AADFEC56F42F55D35B6A9221C25B9A421E66ACCFD6BFAF884411 D9D51587FC78EB57C85EF60A32943DF8BD95660BFB885F79CE94211442DA50D8 89E4C0CE43EA9F9A59CD950F0A4080A3604A879C70D7C0183FC1D48FE223E382 1667570A0FB48F9B29C8C8B0A60A44AA1F865AE83973B89DF1D0A2A7F6228A56 ACE74196698CD652DA798E932C51B08607A7F60B01586900A3F6D9C249E2F1E5 5102EE5FA45CB2EF57D51657C564A1A8C12203A0BD252D249E41980AAD282054 0697204ACD3693C5ED609637F55701E2EDBFC84E32F7D9E30E6ED25FE1D24C38 FCEBA5BCC5D3AC3B1B16C9C205F45FAA7192997CB2881C6AF47D00300FC729A0 06E1E2CEB1D3853C078CD8ABD760FD303BA0F9B29AB16EEDD965F521109E877C A3CF9030D7B7B904D1E7087EDDA279E657ED665BB370390519DD3B344D253CA3 BF4DB6F04F3A135EBC945116CF9CDD9F3CC8D880759E624CAB862BFA2F4631C6 1D90DE368A4D688F69E757B8CD31AD41358586DF667846394914B3DAED64A6A6 CE05BC72BB956AA2A5C173B2D228DFA643796A6F6FFD73F360ECC025EBFAD44D 53FEC6FFB45A3BD1CA12CC1482A755CE3BEC5ED1B146B501E2262D544F49C60C AF71375711F439A7054D87713201455590749A358E8D1D7823C0627C81E39779 610FAB8340A496960DBF4232A1BE5C7951B14F5AD704319E782824EB666FA2AD 1222CB2DDD75AE4FF99658C0F8A504290C2BF077B5A0C2E25585574357A35A94 855890DAF0ED0D02D320E174B92E91190EF4C08E39E5E18EA588EA750CF2C7E0 67D019805DAFED23FEB686B20449717700EA2A88E2D3C758187C0EEE2B13D910 1B5B9DAF42A61ECE87EDD63F722265893F2D69298188DAFD739CFF50B66FAA42 B78F6E098467ED55250BA07E6863952F52F322CC2A11666A613F9C40D90F3386 6F28ACEFC71BF510CFE7146B8D467C553D87385C325CD11E8EFBCD38D1E558C8 A9A9A4263FBC26185B5F659958198D4BFCF1FBD92E3C774CD0AE1383AB50C569 FFCA31FC39410BCBFF5FC40510AD09E65FD287BAA5E5D6D09C458869335481F2 36852F63F150D81F046225CEEE9F5BC650FFAC3E4064F738E3CFAC3064DFB1DA 0AA2894C812F2851DE930EC193582AE633761AC6ABD9ECF4F76B4975CB3CCF30 2431E20283E21C204BDE25BFEB568F4940B4AD609C7563047BBA0981851D856C F2794F76AC67F4D22F67BB77D1759456BE5F053A23763BA3D68189C2F00CFE4D F70736C1EC1F7B336BD6EBD6ADC37F58424FD71604C36CB88F9409F87CB07723 78201C867AAC15E5F329CDAEB8166378F1C7CD4BC64598BE26D16332920EF8FF CE43270589B69F4EE787E154F0E26B38AA984CDD5BE6942EC04554ECB2039943 2400D2211F80E0DFF1F1D1EE65F8BB1BF8C8C441E0669E29D0D84DA392EA6419 3CED360BA6532F8B7293DD95C94339CC659C6547DE2275CAB3F245154132FEF6 8861A329031B771153B0177F52AFED7F2174C9CB16C5ED6A0B441BD7BD1CBA47 0684202101B63AE66E7D85EDAE287FBB3796793B28B96013D4D9D89C4BC216E8 58D467D03E6D4EA9A0595EF417D402F9B4D74AE6753AD9E691613979A8BA8BD0 3129B057911C7ABD1DA09323F68F3CAF0BF432F8FF37FFE773DCE29E9F86BF10 30F44FF752DDFE10772E1B17B46758C931FF91E9418BA51FFECF310F08379C36 B3A3F6A327DFEF8066F49C2AE3BAB3E65D1BE46F752F6928D36FAC96FA01ABAC 7F09A79D80C73E8FC904D89563A11544989126767C415B31F3E4240B716EA93E 0719C28879F870BAE04462610BD3316145F18B3F952C4040B566E5E042E20C55 071430415604D603794E9ED52EEAC7A0BA97BCB1C83CDBEB739ED8656205A008 C8D7BC8C35DB0FF303BE037A2B4BCAB11A0428178A7D1B8CC7467DB54D92A319 784D7C0F08D4200D0F8A6705BC8D6384D30E71F6135757F948B43897A9BEE3DA 279C0489F2F81E41F49F684AC61BBCF62DDC39E130E63DF1DCC1503226A07360 F06953E20FF956842A312E30519963F10BE53CFFB49192F753255AD7704EA054 A15F191E148182E735B4A37C899EDF4FC624D89914CED8AEE92F98885B356AFA 3B09C8B9643F4BCBCDC2DAD540BE8E179E92B4FEFD3B1CBDA143D7BC9CF0DF16 E4C7E11AAF47C65AE1B4A6F95FDB0A1DED943E0C7FE2579C6BD09F9FA81C55A5 12C59B0E80D240911DDE7ECE217BAEB9A2B12034DFAB2517B33B96713EE3D33A 8A9783A52E5D0FD106C5FB565B97A39D63E0EC017DBF13C20FF48515D2C8C847 F300108E5D3AE4F0FB8CC1685B5034DD272CEC79BB5A22E0A348F332FF761CC9 A595A762A7956B0A32C1BE541847078C030412DF3DD66A56C28E4EB5F8AE49B7 1B69922F5DCFC2AC3C91AC5AD9FB001CF03E11B60E040E07F8F8DE592247F955 DEC6923D7495A9BA5C6E405305820FF5DFF22BB4AA42ED7F53A2820E216A1FB2 C43C73338843C91BFA6CF1BB25752A4865C2F3D569EF8EAB87F88E3D3C909AD7 86242DE5E102B352FCB525862A19DF94A8E5BD6C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI8 %!PS-AdobeFont-1.1: CMMI8 1.100 %%CreationDate: 1996 Jul 23 07:53:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-24 -250 1110 750}readonly def /UniqueID 5087383 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC 4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120 788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62 C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32 617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1 D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63 532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B 5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8 4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6 DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2 A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89 8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817 AD389FD24494D365D62017182ABEBCC79E7127AC417197B6109301EFEFD60FA3 94298CD8A0CFA8861BE3814E05368B4CDD4ED901F4CCAA145D0C7A5A6080618A 96D5B23FFA9F70DCA3BC0C0C9B9469A96F50117D57FAFACDC9F059CFD81B50B9 A1654593E5FFA2E906F3C0B6861BC85CEBAB83464F26C049EC0D70F25DC9E399 FCBA99C4E026953949028A6B7E92E0A9F922D3DBDBBD07DA1B1C76BD1D05ADA2 A309199A8C278B6CE76AA34ECA5FAC0370469626C0114ADE1B875C14839D7B00 BBB91354C556CEFBBEC5F726D4263EBD641C785872BF9E7E46ED18B40C8A6620 559352BE65D30967669EF5B5DA24F73B06CB7FE52404F21A51DF14FAE22D33DC 6261A551E0AC1376748E0A385B006CB7F87E6EE4693295EA467AB1A96C856B25 FA1858FAD93BE68C7B9B34D8EFDFC617C94148C7F331AB339F68C574AA89C532 CF18D66E811CCC17EBEC17DE253C106A939B9E31B5649E30247CEBDBBE371301 621F7473065D555CD76E155C6319A44419A41D3D249913ACF852A29E2D707A21 F14CFF15D78D7051CB1E856965E964A224D7AA81416C4980400F53E42DF28F94 BF79487C8647122774277CB88EBC8302DEF4CDB3B50306D801CB3CBD072152C3 7F99ED9002BBB85B3CEF2014297B479914B8887779F15039D683D35D928A3D91 48C2E91AB39E4DA9F0B4A3C2EDBEE791E54F94D7CF2F17AA6797F9676F9EA6D2 191A509382005E771C9789F5E5DF0A9831A3E19BD0D2A539EB52EAC4AEE8ACDF 23502E575D28BCCA41493C8859E85E8CE0109DAE88209A3E18604346F526F9D8 52488337FDDB6A178A9607AEAD726C75CEAE4C58EB1C08FA668FCF1AF216FC00 FCD00A6C7891A5A3C81FD1D28443653546E330B6F41FFE91718BAB3D5417C5DC 5DED177C05A6DF67117B4D535FD55EF7D4F39299A883C79B3C240B0E3C72F027 A55BD7E49A96CBC889ECFCCC1604799C7401CC0D2729266568F0F8EE612A11F9 118554976E62E672DAA54852EEF86178BCEFBD56209EBDECF48C8EDC81F9A3E5 8EB2AF047CF0883ECB1FADDD0718E51A9A3B5C8555512593A28D1D41D3BFF5B8 99F735C6266D1D425CB53E83147685A311DADACE0B5A43983C81320987DAA4B4 C2288494799A6FBF5CA9203F579FA223010A0A23D46DBC52E232AD19A8D7094F F9F68AC01471D967EC0B359B07B1CF1646AAFB8CCA3FA8E9D30FD076E1F34823 A75326D4C62D02FD2956827A78BEEF59FECFF2CBFE22F61B0A07C57F287F419A 49B39942D136C982379167785FC8E18BF15B4975ADC233A58E7594F3A6ACE8B5 96AD3C335213B93698D30B8C52BA5FB603328B6D84C7FDD0DE03A4127524B983 081FF2EDBFA6B50548D77DC41E6D1DCB94F44D495FE7E9AC467E6D7834CE4A3E 4648C5911FBC5C59261BE7D3D9089556B1E618A07C8943DDAE022C11B5C421A7 639F4DEDAEDEE1E4C40E923B2E467F22767759CA9F84A625611DE0DFB8C1EA4F 2B874D6298C9AA23E6B602CED19ED55D65694617756582B632E8BAB3FBB7AEC7 BF6F4B872D6EF3B4FE9DF33506A752F8546269B21148EB72CBDCF95DF4A13749 4F9397C3AAE94FBAF637792A4930D309F73F6EB13BA54538F3A115E7C02C39BB 4D05C643CC60ECD0D40DCAA66A7770D40FBF2F92A9753AC11A5DF7C529D561E5 79A92AB4286B93B2C0C1F59F07247C9E0FEDE010491792C20DF4B4AC3C56C4AB B4C33A9E36AD8AB25EE00FE9DFD56833B2A2B99082EDCC923F74D7024BDC7A35 3A53C07CDBB2AE35A46C0AA5C7670A833617ADA2CFF40EF505289FBD781D6B46 2080DE70189A40A4B45BBA05C16E434CE1840C781BB0125F2B468D8DA416CCA0 5F14E21320F9F084844FFE463C76981EC6E9EDAF9FC2A175F188777F06642CF5 5B57F151982E4549661A127B4214E6A3332056DDC61E8A573FC8DDA7C8DDDD14 A62F8F830B7033 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX8 %!PS-AdobeFont-1.1: CMBX8 1.0 %%CreationDate: 1991 Aug 20 16:36:07 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-59 -250 1235 750}readonly def /UniqueID 5000766 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F05C11F9A72F5DA508C30BC4BF52C8B1EC5FB 7F9DDDD0964A6D59193A389D490DAA6F6ACD02CF71C06802F3AE5A001F2B3A6D EEB60E9DD26DBCE1D29C825A9BEFE3A6572E70DC7B60344C3E0C9C77ABE1804C 7ED61C544F0B4A3D6C7662DE8575C07BED3F6DBA7D64A9C8613AA152B74A140E AAD9B66E0FAEED6AF9D1820F361C1269A5E90519A3E6D40782E06778C0AFAA30 E8CEAB87054C4D156C1B14B4E8471D78648FDAC70A3B8ED474FA356393A77420 4211F60E397D2FEFC6A8D91A80C84EB9E38E663249FB91D5C8A5CBA68BA04272 5D5D42497E1CF5CA1E62EC2B139F5CD4D6318EBBA7AE28614D2D88709C2A3762 611524B8A1FFC7B0FCBAF77AD8159C354F4887DB1A27781DE0A4BA7DF2CE2025 D9278CED48584E8E6BDF30BFD24284BA1DF828B637BF84A02908BBCED67372C9 EF44711BC2B1DA343C8D9D27A9745525C774F5D639B7AEC197CEEDD06FD27923 35ED0D402AEEB51134665A47847429D91CF419CA9B09DC905F610F8DFC54E606 ADCDA19D5CC68A7BC7108EC9236C64205B23CE68B9BC38EF3E5BF9E0E6ADF404 7365C8D0436609438C82EEB2F356F79186DDF6C1C797D3C278108B1767D15178 C4C3E8ADC2482BAB9536AE8419E5CF3EE1B6E53BDCE2A83E2E485F496A562C10 B3F5A131BB19D1E5414C86C5F995521076340536E10613E42779FA15EFDB451F 53495CE8EFF239E4EC442E1439594549D45F5276F93D496C9AC712D762D0B702 E894290BA028837304AFDDD8BAA6564E9DC307A14A7A206550FADDC7784DE3BF 3390188BBCDDD929C82B1D7B529553BA75ACF5B385D31EE3902D96B2B5DDFFF1 9F0F90FD791E54128C1717F313486896868A34FAFF22E23CEF046D02C590BC94 D22388AB8EE4216C124E0E80AC314A73E52DD4C31FD0874344CE306A09A2E916 ADCD69693A3EA65D6E7135C66FF7718888464D4EE67FB499302A16C8953019AA A82E378C5F119997CDD1FE7EB1D83F17C24C4F49EE6381C0E39834CED7D3C33A 3500B17BF2C9C9177F22346980FF55F24A0623DD9E09A19BF28336D917709F92 8A211E3451E18C1D06D82B5BF37023E730B9AE93DE9B8F297FD85C0FE6A8C872 48CC1AD97F36D3E8C78D638810253E861F5BA24C0BE2AA42B66A9D14DD64B083 1142E58D0D478A84E1A3C3E179C83F67443CDA9ADC0C03544A90EA27436AF6FE B71ACA7D3D2A38CF6D6F66EFA8ECEE915CD0253D91CA71C3809D4705E9DC4B94 03809040F26112D02F80F0332E8AF46AD20ABA43443E3E98424C2FB08524B645 B96D0AE05C688BD884A2866A3F9C27C4B831B3FDAD1BB531F042C4EC69740ABE 0CEF41E2C4E874F68E92E310231D4A57D2FDD7A390C10F268021F1F34EE9A449 F9E018F39729C8A3D1DA8C700B9ADD6C0B98DBE481C24CAF0A3A7123847BEC31 450A311D73712D8C2398A38C9BDC61EB6EFC2A1BB7C5B1FEFBF0B5B1F64E1DBC 72B1F5FBC0D3E9F2B9C12793050F0C5C00BA386561C4A6D5045B477F93625509 9A052A0DB7E7DE2E33D545E7579EB77F5F90DD97123116683CE82A844957077D 1384247E4CFC67DADDAFABF6FD36D963E29688550AE91A55EB28246730E4862B 19BB09F4F858CCE3727C402B89D6867392CAFA3634DF7268B02F4BB8878CE6F6 E7DA077B7D42BCA4E1C949069EE02473606DD6C9884C3EEF12AED87C59800C4E 5EFC4BA207992195AAEBAF3B98558CBE64BB6736555903087A4B2E34FB469DCF 1A1E923E0112E14516EB973E09F40C86DA67BC68B3DFB5F5456C0A138571D7D4 F8F25E603115595DD336F9CABAD73AAE6A4B02498A881C16A32A7D31D0496A50 A4F28151CD2484D5DD205830A49CFD6C0AE8F1216D207EC3B48F6DD3BDC0AA3A 762F00F5985D5CFAA741D6A30934C65F7576E59DAF363439C08444C7D3F28D76 F028C00879EC92FF00FE7F924C2B366FF0A0B223B117A78960B70FDFAE5D24ED 614636D64C1199422A82E239F2A3BFD049AA2FAF330236F749B75B8F1BE1CC44 F746D9E94A753CAAA10CA6CE221BFA2545CB 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR8 %!PS-AdobeFont-1.1: CMR8 1.0 %%CreationDate: 1991 Aug 20 16:39:40 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-36 -250 1070 750}readonly def /UniqueID 5000791 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA912A2BCC6CA6105B29 044005DDBEAF88E0F05541BBD233977A447B469F013D8535A9D7023CC0FB7B49 A95CD2B6F18935C37F49E9A73E97A8602C5C26EE13D7A04A188336FCAB4CDEE0 23DE9D803FD6E8D846B3F729BD36137E834E016242CD2F7BF048959DD45AD413 19B985D05E5D422F3D0968375EA6A90FBEBF8B42B15F15280469D69629C08A42 1C298CC027CC288B9C984239ABB96B6A891C1360D08F9ECC22202861E4CE9B39 8BF2767160CF02399389104416CA61509CFCCE11432E69EF2971A74AC48E530F 74B6238E839616D3C5A3E03B1A8A5ADD9E76C77AA11838E6DF9437105AC8FB66 BF0C85B705CB00CE040C4B1BB667C8810CD46BC32E9E3D403341782AA62674B4 ADD1AB5EF2DC12D16DCEF3AD3507173C2EEEDA36005CD76F491A32C148162ABF 34998092DAF1AF8A26E4280D116B602040F46A73FE45CB78FC783807CBC17C35 DE2C8A5AFB8806C3B05A64A750D751F878FB6D8E4E912AD03C61EA25A3AE9921 C5C7C0AEE0E57DCD1C4F541E739AD7C715F5E424AAB0C9D3023A5F44504F5B10 652FAABB8AC82D41B08F99C4241313DC5738C1C6728E53B6D4AB62E50435DE40 E1369C48E911D5A996E295EE529BFE8DD0B4BDE1A203ACAF0C440351ADD1FD16 FDF558006BEE8B99E1271F02B5D4FAF7D1A05EF0946A2AF8C5A39E5D95BEA994 C41A9A8F9E281B7E7C1DB56837112E73EE1F1B27C188E64D5766270942BAB0EC BBBE14E9D26D2230AF950DDF72BEB350FE1272739BB85E8FBA567A9EB9E64CB4 50EFBBD296B70C0A6E6B699B868F073306935525A7C9C4EA9F659E4312C901AC BEF3F485CF162B7792E550C5BC9135376081F0822AAE77EA26174EF02AF5F1FA 127090732189D0A96F096636F13A51AA7D0EF9B3D4F41C9181AF10B5F0209608 4790C04908F595E0F409A731FDE70D23D39C6F66FFDE291718F52FA184219C9F AFFB311931040C251D4EB7C3CCE4418AEE7E8BE71D214CA5BF6FC37629F8E3DB 5750E79B016585EBC32E7DDA270FA7B46552F514BF92B57325CCC6CD5B2DB58F FF4B257322C17DAB47F0D1CDF82E33A79D0D48F9BCB4279468F5B5C31D744239 60BCFF36C1C62F5C06C51AD2F463D9A79FD7EABCC22A9234F1CB0E21B128F76D B272A84109ED8C1A1BC95C89A0589CAC3E01CB203D13EA26D7549BEBDBA04CB9 8125EA4A2D7C96731C136E4D9DCC31A42DC699485F827A55D72329AB660E0EE0 F559FEB14EAE51B25D4947A86BECE8615A32D307146E0508F7026F6C528DB670 D8BBD8CF5FBFA55EB351FB124991CCD35D1B12722C8E0DD5B9B25C567ECFF063 E57CDB9063D22A4877A52EBCDE17607D33270F29215D31C8F2F449F526F94C73 6238E2412901B1B5DFAAD16112894C8C2CAB6E34F5570894E270EB085ADB22BF C138AB9722A7AD98D2A7EDA1A9A1F5F26494A4859D169FD547666C55026AE8E1 3135561826DC39B9F192E3480D0CE94E7444562E930746B3410234D36F814052 61AB3FFCC9ADACCC41F9F03A153BEE0EF6C5DDD73AB461A23921268929DEBC0E B498B8882BB965DEEF2957D63CB3DC90428EE84E2638065C0A63E78DCDA3BFB5 4239CC84E7C3ECD7FAF3CE1596F8F9078A85015A1D1CE24D117C71F6136777ED FAA331AB6B28941A327840D7B057CB662694FE8A314CDB7368DBA28FA5596717 4C6F31FB7E968348087148DC94F26F7DCA24701C606083A74F68447239BEEF7B 3F7CC9894627256187C07560F7152DD8E9013E83A53FBF8B016E3DF7D08D6F11 45507128601436AC75C8ADE29C66510B3602D8D2AC10CA889F763911EA9BC2C2 9D6569F8C890D6F7435A2310DCC3186022BD3D26A781E7DBE01E720EBCA73E81 7C1CFE90F25980373A708A154BA5A8096429D4AE4B9911A4711D8292E464672B E7D3A9EF23DD9E50F4DF65C2956C0FADCFA8876F2D56A42DA4C7401F12F95B7A 655A80978182462E04BCD25F4D622A1CB2310DACEEF222F4AEFDD1BAE17B4CE7 B5DF35A1D0A4E2DCE2C2062AB1980E6AD5422BD026B5B844F91F2C66ED6A7985 DD535B97446FD87332481387F7D461D2EAE8AB70A60725186BE94BB69AAE6C39 25063D2F56F9AD979204B10EC5F8089595160ECB8D4B20342BE50DFF2B9FA7EF 1C8B8F7C803BD864119059ACE1E0307184B774B0EB0905B55ACDD368C5F7583F 79FA230D09341ED692B226BCED95F5CEFF1DED4005851FC4CE361A919D80DF92 99329FD1781D38F4814A66CB2528A9F3FDA62204C261BA10986DAEA049C4651B 7CB6D1137FAEDC5AAA8EFC4504EFD190788D0FED6AAE115522B0DCE3C7B70535 A627A5713852B288F76DE8780B909D7D67F4A10D7230D526C4B5CB2BCF0C815E 8BAF8A9565072A8EEB311D5BC15341E6E9120D443C10DF10B4566CDEF6B9C238 15CD842AA074D2E9B47F9409928D3F4B2D7CAE38A5F1DB5DFCB527882FD49DD6 05FF9E4D595BAE731378F6273F8FFB71D5F7DA0CCF4F9066E2494BA12FC90430 DCC6EDF82661D70C22D5C1FF101A71467794F200C6ED7F859C0C30634E662340 6A320C195ED0C3996F2AA834C8A910EDC53FE845FAD2DF497D829BC5864A1041 04C09EC143319C073E0BAC3EB1B21A8333D5E48920697F6572D3247A3A3D2BB8 3D851C7401FE24097651E2B810E85B48991C6ED8B1AA16877F12A35F8C37746A EE9058E03BB4E95AB45A4E77EE17B9AC994D431314E08B3AB3684E77014E00CB 49F23D808800AA75C62BB761D2DB84E0486F60248FAB97B17E0AB29BC2AE2C4D 5573E472279D3FF634E62BD12732A7B0C91CE93B5BED89D2CC829C8B8C00F81E 5929A072989E86C57B23548EB5DA7AC174905A77C70FE015F0D5E2F9A9E16486 98F15C4CFC2688EBE5A6161F2BB3605884BAA929C20FB51C212EF024F9EAB81D 835FAFB9B7588112D5326DE585090187B46E6A2F13A2236444168C7C4B0B609F FC4EF75EC7744E508E996C5E91752B00B0B121338D84A914E80B5F5733F0E024 15C834CB2680EFB6C4133454755F08D6F7891DB66904413CF7D0BC8E32EE472F 50E3EB31082971EAA1CB13E81BD7D126B95E38DACB3C9C36BAA64198529B27E5 AA0AB2FE78A4788C63BB9900C3209256EB8265AAC557A63DAC897535DD736C1C 67DBBBFE2A24AABF9F4F5D585E5FE169DF1FD3EF2B7C9C90BBAF65AF24B87AEE 8AF0AF6836F5DDE5936D54EED0B34181945CBB0D5E0631AA01314AB2528CDE2E 384A07BDC5F79CBA4D15A94581C97DAF893B33F758CC1DF6509E85BDA5117995 34082CCC29B87858C62EBBAAB449B248244432965918D20BD8C2928F46193F64 05BECC7FD9EB331128E3532042839AF0445E94A59506D7766349BCB010B5247C 11FDEB219978DFB7F2FBECA72000C4E30D544B63CEF95AC8540A3F9019CFB314 394BD3BD6A1D3BAC7DA5290EB737BF4F754C5EFA64C32690012E003E7D1536D2 FA375E01F08B18EAFD751412AF1C6E6C21ACF7A05BF87B0ACC240EE3B07048F0 DAB728AA7A778F4AA6907250698B4545C702CA5C29451B419DEBDA3906B40770 96E52F0F3CBF7C506B0054D1ABC9860D2EA08DD3F3353D99F11F7734FC7DF389 2DE524FAE1AC02BF7E27660675AE251134010E10F8DB78D93C3CB0E36F225D8A F851AAC4D419A94C68E03B12C088FF5CF686EC762F0273CAD02F295ED3D2FC92 3F6A739A3DECDED3C6EBF1316BFACE401EDDC2B099CD2EEF94325B04469455E0 AB5A23AD63B11EE53508C54843957C0AE2F83759035154EADC973FA8E04AD064 EAEC0B7B8AFA643A963FBF2F3CC9DE0ABC85F173DDA79916967712844B85A55D A37AA32E0D841B91063E5E1CDF9190210D6E9A92D53F1720D48669E73995D381 2439E411ED12D8BE258A99AF03836D636AFD5B7839BD4C06FA2D2E3B3F8807FE CE3DF6AB53400F681EFEF8E7F0E13326D286EE07B7D8771343CD1CB4C105D9C6 EC9E5B388CF72F9D5A781B4F78F7459216700B1BB59B173C33B2433A33629388 BB82EF7B5F815F1E5A75412095AC5BFDB1EC81A2B9014E3F83AAFF44DA315DED 2F4293D7C9BA6FD7D0A5E3A193953B922DAD6168233DB137A20E5618A2163203 BAD165ABBD8D3DB5D7FFC664C0218461CE57DBF86F02F2F7CF4473BBC9446B9C 28D6B395DFA5E63DBF845B6C9D4D0750E65146FB1E96828E8F25D01395D32297 F794BB41D26CF7503D323F3C520D8AB78587593BBDF32C90AF09BFAB8BFA58C6 964E7E90ACA7781318293AFBF28B74B3AAD461F1C4579865B65FDE9BC37A9470 4628E44D6212F4537CDD86D0085C6532F7AAF5461F54A9EE757D0676C93167FB FC16970A5B320E411E0D0DD08F2530D49F4FA3443EABE94C82981EEC5D4F1F1A 51C45F5322E9D0A8019D0BCE5303F63595A856F811CE07A400BFAB6805FB59AB 13CF2AADAA11DC5BF4CC4D020A6C02718AA271E82458AF3395751A37F4C08D46 03A97F0369E066A0A8434E0C2792C2445313697C14B89CC8AC641C379D722B26 2AA204BC8E7992F5E30F744D2EAD46AA3AF7A5A6CCBFF1E05470932ADAD16D1C A41273D8DBB1670A98674E1B5B6AE2AC098A68228D5AD9D82F74093F963AD077 CADA50BAAEDFDD4875ABD33F745D0B5969A69FED5D1F08A6C1A79C06B72AC2CB 7381915470C11048549399DC801FF422F2F7D592343CBB46F0DBE5866952AE76 53F4767C8FD3C707DC4F96DB47AD7EC0401C8732430D19DCB130CD85766B3EEC 73079BAC5FFD7077C8B8DE22FBB2931AA6BE940216CCA4B191A9F444689B88B6 A17F2471FF207D9E15DF3274A16EA3E3AB2AC8985B155800DD967B65962CFE18 17BF7FFF4D72272E3AD4628E276AA337051177D4494574A20D9D1768A2FACAEC 2C6148BA549A691CDE43D1B97533BD910A73B4A26CFA374513B849A05C32F7ED 86EC5E65D512D815BDDC2A70361897F001BD5ECF7667F4310AF0815C3F34A741 547C266FCCE83D09128FC5B817FE0E99318BA9293A8C45DA012E19B129F3D279 4F5C408F119F3E51D0B0A2A359504DC61167317320F9BBC94DEB4CE7B9FC8350 89B14366FB0BDB6D44E46F946820DC13691B205DD72508D771EE0E196D4625D5 7A8A247D6728157CB7CD09C3CFDBC467E37053269D93E711B2C9CB94D826611D C9FEA767AF96EB087007A6380033BF6A35CB32973C6F4AFE50E525874030FC1A 9DC83A4A555D269F443BE68BC5B248645C7420C737C4C8A912AAE5FE6178E4E6 BA6EA0CAB3ADA9CC3B899EA0AE8B050EBA8F6C46F05ACEFC78AF3C936530EB23 B83D039871019A05A3F363192039B5E164BE6F14EDEC96FEBCC6E7FC38FA9773 F5DAB8CCB1B0D138E770B6CFCB22C6197566CD55DA7E56DBD5160DC26725AAAC 9330DE3ADB867DDE30664967FE90AE9E20831D7B82009810CE28912BF429CFF1 E564F9C49592396F4765382C08F6ECBFD815348AD96844C5095BBBCDE7474C82 CC2381411A5AAF4DB2EAC2BA8593F2C76495B0E26977CA6E272D7701645150D1 C2C28864DBC6C6265655C1209342530788F4FB7D1948C34C1D0A730363CCA8CE 95B85DF386B4D8C7F958C042C187353228DC53FC699B9D497A73A89989C6F160 C6D922379E3383E9FEC6C03E5AA8E8E55F5B797AE7A6C6A931FCA119A08723F8 48ED2E01ABCC7C15B21E8E2602B01D866254E5A37D343F0FDFF16F4E62369DE3 0F14811B957EDBE46FF4EAC3CD95CC823050EFEDA46FC74AF0EDDFE623EDAD1A 5B0ACFC70412F31DE3F4AB403040DC05B565A7767AC386727C34EEE965E37593 19E1B3CEB57C67F54F7869E619DADF50B3E1627F75418EC8D061A4EC85474501 5FB58E80B7F272D416D8F47E873A092ADDE9039C1793D896EB10E6B6239D8C91 1A0FB1C069571C3BD1362D4F8D3D62B7BC61F6B3907196DCC3E99FCE817A8D77 896A96EBFAA609112572E2E43B110EF1AE647438FE66BA0602834EEB351AA92D B3757FC4896A10FA57D2E4B721C0944903E1366259CC9D54FC03E84C51103A5B 52D24334709F1B9C88079233BC13D264652BF4566A08E942E4410B18B0B29FF4 C933BE4A8875A6106B02D5437B4FE0849A4BE8899F1B06E5602ADB506569A790 0D03D3C8DEC2B425E9A097307A96B81520BEA1DE903D8C3F2CBF515C26401724 C8816F15305EA3FBAD9B9C6B7CFA15989B84A356269664A21601EE14A6CF5FBC 2C2CA6648FF33D5F95E1106CF09DCCD2E63F3C6FB862C63ADCFC430075737B32 0D8B0C2B18A722978DA049817E0CC52CCEEFF657D207FA1CEA0326B26156219B B8FBC454BAD256A8B6B633F794980389D08AED146643E8E5B498A87F9E3CB6A1 3740A31CBD36D85990DC1F130649037F7F2E9857DA277DF2B0E593495B992019 41A068C440F9301AF3E38D190D4F4F9B5D7AADB29721C08BD152E1E3BFAB0EE6 8220FC98FB707809579AAB0CC66CABD18C8389070F0C146217015393B6F2B3D0 D1F4356C5E0A547A8879C6EB5DD802F870148BD574FAB08512C55DF4D956D531 4D8BC496F0403B7B112EA892861ED1B3EDC96B4A5D191A67F4FFD65C84996E36 B52C15087670747AC21BA5D6F03A02CFFBC70E9FDD643C93B6F51EB823415742 2A5C908EB778FC8FB74E5EFEA3A29AD8D9CE361CB2EDBD62DEF086DE229EEDE9 CEECDE1820A57245D67E7DEAAC75896897C41F7EA95C68D097FF1B345F7CE79F 721469690B8C311FEC231CFCA0AE6F6E948D32C8F76B9A65C0D2E1DBD7647A57 6F809A65846BF2FA459C62E22188172848E5FE6899FE8E8DCFA04624E7D5D2F4 FFAE9ADAC998D8EB501253B1F676A6E6762421A37048090F5CF6B2B94E6E42DF EAB08C77FC036D68A455271AAD9185264ED2D83FBC42154930C31B5F8E195C20 B9165DABD05D8BA2285662569ECC2E80A131DE24BFEE5572DFE704C7F5DB6350 F0E7E6A057AAFC264A170852E7F0E3957BD52E4113E3EA0622DFCBE22889516A CA46C5F9B5C98DC931BFCB339DFBB8306F12E5D010C1C85597FD0DD5FEEE7207 14D3D2A20AE0C83018888D47D6F97DB0F5322282D6E2BB0EB7EDB42BC0040B91 7A517D12A5787FE237160919F0BD07B539E9FED55ADB88C646C74D8599BBCF2F 855CFB46FA65FF4BA11564A00103316215351656B5C8CDA3C87F138E0B5B55B7 00915D001DB710E6F40F9F62C892431CFB5EFDAF11278A45635A6DBEF691F646 B81A05ADA3CBCED1133BC0605C4212B28B768E3B0B0D7C3623B4E42C250C4883 96597758EE4FC7388D83A585F1F00B7B2D2E61AA07E81524DAB67792154D7D66 0E47376E27F5255FD369B028FC7DCF8E727DD96A64DD618FF7C80C12E01966CE 2AC87DD2B58BB9547265E6542951AC1F3FE457B9F23E70162DA7B5BCCE49AC48 CFF050FDFD45A4802528F1E342E60D9378961BCB74CCE89BC4AFBC6105D8A39F F338D97538B117ECA4452695769DAD6510704BD12F4826DEB76E43F74355B9D3 96CB54B92DFE7F742A910BB30423AD158191E1A42F9B59A49F91DA620A78D280 E67965BEEAF4AB8AB1A5C737E24DFB56A91A05E60311AF9FA6FB06C9032B9871 9AE67EA0DDE81D69DE9DE72F43AAFF204D41873C44E929F05A4316209724400A 3D35D698A7D3A45D42BECB376DCCD8FF237C35BB262EF96411115B8E2552A6A5 D284295BF631D1C9CA3690C9CBB4BA752FB3DA20628898774372B51B7519B9DE 870FA7CD3DF4799C2BA8442523129C4644D72D994198674B15EFAAF759691158 99B25B3A7675814FDA74F5D7CD789F66065E5598792B4667E0C5FD1BC162C106 21153EE3246B5BEADC84F652A840DBDD6AFC2848AA71AC8FB4C9F312EBD3C7C3 991EFE91919381B9D55E0EC8403B3C832EFB2C93D99715BFD0EB7A97E07B78BA 521950A443FA830A22C11D6002A7A46F0B63DE2A21EA4656A96702B7A22E9987 9A0ED7AB7AB4DE4BC2293D5A0D941E0DB492DB0BAF0004D42638F833564F0533 28017B96F09A85B7386DE37E83DDBFCDE319EBCF54DEE91B8C56E8D17F1325C4 464EF48053D541F0F2D3754AEDAB78B94E1FB89A02C5CA54EBD7C60B881CE564 3461F238FB97780F237EA059774BF982A96939EF856EBA331A3A42807163F6AF EF680EED2EEB8E64D38DC123809E436FC34175ACBCBFEF603F6C16F6C81536C5 4360E28C98DCE6D83F97A91BA44765E925B79E1C248ADE842A800BAF5F2C4B3A CDC8D691EF58520B6E8A28930FC9BF69E473A9FFF60FCDE315A929E21B4E343B 2ECB46A5E05F430A7B96EEB8D57F47834BF396D0FA4F83F4A4AAAB1EC6C4A281 57AE723A3AFC31BE6C6E9A6F2DCF3812825AB3B9D4418CA13FCD18096D753B96 711AB3A1268BD2184F8B03B8F6360E439BD42AAEF9B1E0C46E2B0AC9DEDB627E 894351E6A24C571174980F8AD71A5B27CB761FFE88AE5DFEA6F2F18C4AD91066 CD41C34D1E96F6045C47E31766C8D51795C652153DFB4CA41321B72A117E33ED 5228940C780078FEAC29D37B73B9524C09A6B784883A4E0D69266CABFC0B3B6C 4A48AE07D4908686A4E93A1CF099D4EA90E3313B3D11C6AD8E0A38EFA92E3634 45D0B4DCFADD5381E25A5C37EACB9BE24C6F129CD640321DB6C6C8F85FBC35ED DB4C1FA586786099708D50DCB92C4D0FCAD7060F9B419C24752E73666751D0AE 53B80DA03F503DDA503821BD0F892B2BDB7EA4405E9BAF35D1394F037D31ABB3 F348BF7B0DC782192D8F190051391DA835ECCDC523D9B1B0DC4BCDB14B8EDBC3 120ED1DAFC769AA9A68BA872490189845E313559D8B422DF4C1C7B3D3AFF29AE CCFB9038F52DB22B65BFF38DC7D97BE79FE7C39130BE5B962541FDF59AF75F45 5289890EC5B1262E37399C8604CDE3EF0DB3E4B17CBF3D1234D377513F0A3DF4 D66885B117A4E9BFC54B239BDBC572D76CD7F067737511A87C13B8FBDAA52626 3D24DB66A5B3276071303A65C3ED8F4C55F8D661508CBF763BEDA4DFED578252 82E9435E5E6198B0EBE4092C5A41771D6BCCBB353E103A890616D599971F9E11 E00D96B2F107FFF9D1B94B0397BA31AAB78751A18DA4B9ECBA19E6F5BFBB8A86 4F2DDF5F17612949FB1E8D17864CE3BB70C0B4465152D2C01734C4E797B63E5C 21C204FA7EF68D2929CABA8CA52A59BA70B05A0DE7B065BDF73CFE1EE0FB6847 144D372ED6B1020C10ED3E9D61846E97942A18FB61430CFDB6AAD7DEE3CD4F52 67E4785327E5489FFB1B4DC512B3D60CB05D7FFFC1D9784A7DB08F06C04A7787 651D1685313B27112E3A25093090A2CC4B2AFE84AF6044F980736C898661173D 6C8FBA5219289A44E34A9FE8C42A02BD62A80EEB45563AB424DD1C6456F1236B BC4D5D969AFB8985638C9CA367263C1B9C159D1E0CEB380140B1EDC62AE7C320 8A2829BDBE819540811EB0A3EC52822D629A66F1AF6C7DA79F83FCCD6EF7136E 1893F434F56B157EB52A697748BA4595EDC3881F7C33C0D04E979206B5F5363B D45C4494386F266E3D19724BC0C2C91D2A769AA5574C0FDFC8B8AFB696B0D344 980719C9B9D97147CCC687A6D4FAC3EA8B95A9138AAC56194E2EF9DD601202D7 99C3C47159672F035F31660228A28F8EB842A0E914FAA022E9B4C057EB67A4EB 3CF8549D11ED9FC82F6AFA69715564C9DCBCD11A30545AB4D2DD3B88CD20768B 3F62BEA3F3C7D4E2A77C1D2A5A83AF47200E2BC8B86CFE3FA28D24388F988A9A 5C9664E596451B97ADDFFFF3971F658809FAEC3DA250327706CB894BE37E7AB7 89AED50B17256E7C9E0DDA0B128569A39E4DC6455BA1B186E529F72E83BD9AF3 F77EE232EEC3440A4D8813A4D62F418F4352BF6BB0A10A283574AF6D80F7DF0A AE56E7591899EB1FA356BF1B160B17B7AE93B5D7BDABCCBBE36C2405069B1B47 B5D023B0C46E65F595A968DE34BEC808D92B125B5417220A09BB5D28CEE43FAC 4B4AB626A8EBF91F177F567B7856DF464C3C5E43923A1F7822C67AF07016D05F 97926C6308A1A7DFA4744187A466BCF1A5FE833E2C09A4248113D447C844DF6A 8C3E2F48142FC03636C029DF4F730A26B116005833B7D523027DA3A2AD078F28 C6E95BDCDA1B87FFDCB0BFA142686FB7EF3C5D5A38AF48B3BC7D2BC40E18178E 3917E6639F8B861FD34CAA190DB8FDA6C5DD832385959E731574C5CCDC61703F 2B6FC1F989A081CD7A34512BA8E943CF6DC262A3BFD7B503F28F7DF833EAFE8C 87C34812F6739BA8893D036A0E1BE46AFE8612EED54B61A9C4E17BB901B3A6E0 0EFC87BF9AD5CD9384F23D5EEB07FBFCC11903DC5F84744241A78C83739EFC7E 54940C60E8DD37E643AE94EF7458E8955279F384B42C7927E23A34A68EA5FEF9 FFCE6899808B6ED301B2B9AEB7F07896A4969172E1D86D27AF94D6CC16510238 1034E360E4366BA3408507D2A21B5ECEDA2705E901A9977E594EC7D39EEDF9FE BF60A9BB2FEA35FA1D64483F15B1F2B61427F0A860664C322DB26E8DA2D4F9B8 3635C412E780717947445F7DB7D26F4E0D497C1369EC361C0A847E6CB3B15B91 A5DDD933F735571A6AD0D55C68F293891E16B3DB2BA718EEE25F808FAAE49BC0 8698831B85FE209BFA985CE13FEE8AF0A781351EB39E254EF927EBC1DC2FBB5B ACF7405304CAF5B9966A1AC1854BF2C272E7A897720D294BB7631B74B0F323F3 5D7A3B4F462FDD50806C5CDB96D2433BF84C44BE91CE934652C1706B4C0D9A8B 25D36F372F39E18AB92CB0A8BFAC5558698574352D56FA2E4B953FC8BDEEF16E 7E32E5A6C7268FD35EAAEEFDE0E5811ECF688F39763ACD1C6D5C8D9220F5F574 9F7338BF15B064A3E32C53E11DA2BCE619B176073D912645368CF97BA390685F 73CD546FD74E9DF31194AB1019519CF8344775C0C9E3F8E9B1CEE11FD79D20F4 4B435DDD060A8EB9AD3CDD70655038BDEDD266DD69A5CC48173023C3ECB805F7 6931F84F312CE6C66DD25B7610C85E0CEA6A1681EB83084B509404A94E98E139 AA9171AB45DC108ABDD8BE9E4A83FFFC17B4D72CCB60103415C52D3FF1422EE7 383F41BD41A5D52F76832CEAC15E71C4D4A46380D3398002E6EAD73E72D2DBA1 A419AD0FB7D539EE2E1F1470B65B5C2FDE289CAD6B9F1920AFF0A568B098E921 36550C5BF8C912952416C72B257E05D251BDEF2CDFE557ACFC0D52FC8246F40E AB018509119BF43EC8B7D64488D639BB46DEEBC98162B5B5CF1D9B871CCCDA34 073DAB5606F45BA6C1014E8563E5F625B31EA66EDCC9E91B2799CE6A8D4021A0 EB75E835CC3F082801C0B04AE4F3CB9052AA788EFC63CB91CDE56245ECC67F5A 8531EBD21D5E1303A44260AF66A76E6F840D4B8BEF94F880574220FD4A353392 6F6C4F6E3832A61C5C7FFE1CF76E9E711C6CFE5745CF59F4D8A5C17B15AAF3CB 792028A9D23B882EE27944E497B5B5FE57067D719A0D9E21B05024DAA55A7C85 BD007C3005D69947E24C5D291B081900717ADCC390FD47B3B8F3CD4BB9CC21B3 8011FDFB28A538395AEC9DCA9F77A18E3CB4DC9F17818878ED09410A792E4785 3DF5AD6D94E2CD50920FA28D932284EE8B8281F4A2320D9ED996DADD26F51262 9DE426082663C4B8035AE41BB66AB4E0D2C79BC356A3295142E1635DC8826D74 AC59622FFC963737F6626D62171374CD379DEA60768AF01BAD21422C4C544F22 AB81B92B94EBAC7947E4B4982829CE8BC837240590A76AF6E70F61D8EAFA25EA F56CA8E5602810CA97C71638A0485F0A84922E25CF3D2195BDD7768CF9202FDD 936FA5FEF8610889A837AA154B50E549BDFB923811ED149EDF1485653458C8A1 83747AA17C43E2B00CE94558AA69CDD40A3587EECBCBB8B25D210667A71D7459 D2733D85AD2B0A1FB5517B0641B22FABC018FC47ABC45983C913E71FE97C68F3 0509A15C3050108ABE3DDD17E8A95F6382D461421B15CE618BE4D350C69F27CF 7107BC25A46A054DE19394B9828400EC9E6B7DC7F1F4768EF7A076CD9EBD8DD0 AC4DDE8BE2622DDD07873BF647CA781F4C4DE43875B500AB26219727BBA99BAB C60E22BE5D500E5E9041210D7B4369407FE04A35B9F6EC9C54FE11EBC090AB49 78773DC89845163B4439902F774A0C2F0494CBA04D1A466248514918F6FC6ED2 47C64ABB7A984B5896DB1BBBAC6C9E89639A91608FCE091D6C9BEC176F43C388 DEB1746F8CD7C40563D0819F858AC973D83C9BDE9296D9AF9BD7C7D837B03444 F54813EB5E1A30E1845228D792AACC00681863B9945C90A72003E35E343FFA44 5F1B995D6D3D0B2105B9C7F7B586F43EAA0A99B672261CDDFA27AC7F1A49DDA8 5C61E498E66051DF5E5660F5425C187BF5AD2A5633E27332E241C5CFC4057A3F B6FCC8B339B178EF37383F68459CA708B088D73C50ECDAF2680D8BC9D89BA5F1 AFFD5A34CB73B8714DC527780DCD038831A64B2AE956EBF11DB50414E7237F1E 965CDFFFED717CD956338CB0444D06899097C0987EBA5CB5B6163CE5A3DD8E21 5B37A56AB32FB7D31EB30EA42AB228586D69483398B4AEF762B368DA945A1E07 51211CBD15470088CD0A2E9FD2AF00B3A0A7F62E6A4702ED5E31D83E5D0355C0 ED114F6B2B6AAF918247506CF846D51B227C84C55EDE8C2F7AEBA28F6D6AE7FC 27D9E926F5B26CA3E4E3B8E8526BED186D97C02DF6D9C3DFB5782947C9A95422 3E2073E3B0A912978D904C12EC72F20F674EF63EC8F134692A70F93CA5BA1AF6 246EDD648145DA2431DC74D384D1E458BD58B4E9C69788A8C8E243DF8363FA3D E6BC5338DBB5184325CC0F9A807B002DCF1468240B7081EC975AA17E1B0FC719 8BDEFE066A6BEADC0D9039359FDDF590B999B841A247FC494833B71509BE0945 E0FCD4D9B89B5690BDE0DA9B2108A3412B8FBD7DF9449C0DDA6CAC87C73B3A27 E7D5493C542F3FF27A46A2D0E22DD1245F69319D426AD43FD0E0B64F772AF88A 9DE23F0A7648FCA17BFBE172F305B824DB286AE39C2358A01FA55832D8A414DF 17FA4F3AB969BAB98BED87F76CEFAFB05D7B69EE976AB3CAF2B78E72CF7FAF15 AC9AFD9A2F1C501DB3A68BF41BCD219336DDF25D43F6BAD90ACAF1FF6E44A094 25D4A62757E99136F80ACDC3A63E22D672AF83B8E7E75531FF88DACEB0B5170D D12E0D003F516F8F432E212F5B626E18E9A7174011871CC9102C8AAAD2E5548C 67035189F517FB37341D194286E06A787229737D281FE450A667C5F4B91CEA57 4E3451AD41593C95FB4BFB1D82DEC16CE76468AE7A90B61C6A6E304B7EC68C11 C9199521971175023895335306608BBB701313C6E605072DAB4794663996CA3E 79FE34887DC9285692DBCF7E08A73B180C01440FBD021320B0ADA6DD1FFA044C 77B8CD425E40FA9DA063F0D1B78EC2F79A92105364EE577591D8CD862329F438 2A5381FD531BB0C3B8830B91C90BE21535568EFE96306F2B40DB5B831CEFC1CE 0A5CBA4296B323C3D82341847057AD39B7A62649A0C0C5063443B44D8FC5F3D6 5BC27BC517D4048F01C00AB283252929D8FB6032C767B8DB9AB84B1B089A9880 F83EF3F255BB22648BBD8D22ACE5144D2133B87F69E890CFC04DEBCBCD9A0BF3 D34E743B0EADB84E9A55FD824218AA75D98188C6B7D4D0C21234FD51B872C7B8 EFAB3A1C8E2B46FEA1A9D4B778ECA705C85B262943423717213BF206A2D7EBF0 DC3F303E8752F4D1530C1BB52528413337DA020A887C8F045B5C5CF97A9F6018 9A87D1173E4EB83D770E31B5D81B82CCA49B3A17EC263EEDE44B47EA6AD5392B 7C4FBD8B2E8892CFA88C27A4FC1B092355A088FF41AFB0DBD95290204D3C65C7 5E169846385CD8D5D150D3BD954FBE50A8FFFC1F16267EDDF5C9580932862C5D 17450949399F0AD774C3D1EBEED3AC8253CA3F20631098EC685F652D33644DC8 4973C64DA2277DE4E9EAC446C0BFC8F8ACA4C1C9246C023E63DEE51BA6A38E10 C56D943074307BDB77BC806D1312AD27DE27419D560673F017499A22DBC881B6 592714B540A81CAA185E829404D0C2A65E335D5C471DE166A31EFDCF17BC364B BBE28AC164EF196FF7187872A3C4BDE5BCE601BB76AA48890245336C951C1B9F EF068EF301024B76C4BA68938AEEBCFCFBADAC378BDD7CDF802192D46839F95A 13341257278F28FAD086D820F552C7A6E7EA10981E47EDD85A02044E3BB47C74 81BED605EFA7FADFF233F1DF96952566658EDA9E1AF278A89F1BAF58AB773369 1D67EF0E3DA6B20A4EF554BBE97E982465FD3ABE496F6C0EB8A72788864B78DB EC545CCAFC24FEA017B340CA29C67498D3DB24478D7ABDF93C9B1823C81A979B 940A7959B89DC95998545CF3B6C08ECEDEF99C21454CA314820EAC576DF9900A 0B3F110F567B3A66FAD4BF2C67D59296D8FA82FFC4D8BF769CD805CA229408C9 8194E62A0606344246F96C2A8712DAFCE97C2FC67F1DA6F66272EE579BAE2203 A275152E25F01496412AD89F51544D382B9EC2CE8E24F4565D318B7EFAD93659 643AB948B2E1ADF82C5DD67B935B4EA655DF2AC980A74529B51A27B56D01D8ED 1F083759632BFE22A8F3922D5DB86F51DF142A7A056A6EE77B12F06A00F9BA18 407B97028B8C72459FB3B491B98776C059CD04D8D417D52ED5928CEB537A9455 F69CF9A3092EFFBD815D4518D62010D451188D4A328556D45D94A4B38AAD804D 705677E96758E690ECF39718CB61B53E5F072CA05AA12FDE1B1AFDBBF723AA05 1CF5935DE2B75339125C78CFCE17802251EBA70A60FD4ADC9109E2C0A3307ABF 8A8694D63D49ABE2684FB595D29361974D80D996BE95383359836C2DAB535DC0 F106522EFACC82C1D49AC8AE5FDD362DD687EC8469F576794FA016D2E65C0BA7 563800216394F3930D7E95D0A6FDB9D3B1E8FE9447AF3F5F2028376EC37C3A45 0B9D54C8CF6E1BAE6A20B902A0FCB7F3E65037166EA0FC8B8547A91C0A46450E B51E92D3 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX10 %!PS-AdobeFont-1.1: CMBX10 1.00B %%CreationDate: 1992 Feb 19 19:54:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /.notdef put readonly def /FontBBox{-301 -250 1164 946}readonly def /UniqueID 5000768 def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF 1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E 0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B 61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7 92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F 43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453 FCD9A4F194FA648F9FC0971734BB69CB73439CB0DD021D44A7C11BF295E81733 4DFBA460FF3D654F9FB337E99E6D66FBA87A817EB9CA1536C84833870E3626DA 55D48DE850D3E6F6B29DA0E7C9D681283586F208DB8D58042E3A7CE55BE84822 C98237911453E479EAB0B483D222394299B2E316A364801A09F2A1A3B0A8AA8B DBFA82BD9A0A1E60FC5F7F3EFA1DBEB4DA5200E2F29D25BC8614D6C29F336C5E 9F60656D2F7CC4631005135EF22BFCDD25E2C8CEFD0151FF96E6C9AA83556F53 7B440CDA14BC161005456ECA6F07040973D7B75AD2F840CD8E54FB8436165E85 D442D6F6CE706E77C30D1036B2DDC7B421B9DC4FB5F46FF553E1BC2B5216575B 62167F2C7307EE45EF3C791B051653E24FAA0C1916817F941E6CC1EBD3FC64E3 6904F30D21F88309FCCBD2CCC4A797DA8B43408003FA7386312D6ACB7347D643 E711A27B7A11B892011AA4897527EAE3DF4FA7A938555F390C04FA7BB9CC2F53 D054AAF95DC58EE4F87B18B5F7B07DFB6A1723D41C7DC651D115457F264D28F6 C7AC79A0877D1A660D5056FFD5C14AF62EAF7947EACB24C61A1B305CB312121B A9CC21C956B5867A716446F438B83452AAAE1AF13B492C53C6262FF91B3D0D1A 101E3B4F10898849502B8C8B045ABF751FE6CFDFC3A3615343DA91D2701CB7A4 A99F7FD2C27A7220FD61AD504EE98181624F9A8AEB246B85D8ABE6566507C141 6A073D347430A1B8925506A4AAB5337B999E290BB4078ED610795231E3FE9BE2 CCB2F5D135D2BE120E8CCFBD4A66FC50B2F25BEB8E7E09E14BECF00C9C6AB50C F9AA2FA4A6B60F45D16C05A65DF6F4383F779695C9A969DE58BEC9A6FBC5BF37 9F84C22EA5CAB183E02C5FF40E4C175FDDCB3ECF9288F67E73A4020AD8558D11 7CA119BCF0331A96F1638DF4851784EB30CA1C58CB167D5481A1CAAC5B47606E 93CBC94250BDA24B3BF20A2F8CD7F70F94A70D9EE2FACCC4FFC8DF9C2D5213C8 4B8D69AAB8C78E9EACDB504D11555D065FE9AD4FC8FB42E513FD732ED1B3743F F479F706AD6E682791271BF9945DB9BC53656E7F141386F27E8CB9F10B095DD4 04E8C303DDEE791E4DAAE3B96B8C7AE393ABC1A7A81AD20EE0F62BFC341F3201 14A2D93EDBF2AEC78CADD87015E131FB4B6444812DC01679D8FA6F0FCCDFCE30 8852FF44E8587891F80D7139500F6CF5D0E8C9333C506C1CD81137CA05E017F6 EA82A483E8B474DD26FB86BF3A86166258817EB7DE5778EF5CFC1A874540A8D1 0AB4A50A79A9C3DFF0D44DACCD7A7EA6FE095FA0E81EBC597AEB71BF11DD328C 9C15150CD3FE4E217103A3A34AF3165402E6474FE57777AF63D9752D718D9253 C53A3D5FB2E99B9F5D98C7F1EDCABA0F20993B789F6E23D3760153F8A9F70EC1 720F45381359C2A8A8C5DE961D16772BD10C721D134F80726FCF5C4A74BE35F8 CC74155056022469B8A24AADFC7298BEE0404458401194FA26539669C81804C7 95179095F980A6280B39D9846A541574D35ED87BA829B1AD7046D39F6918887E F1AE10677C2AA0A995FF26D308F38D3D1326C915F7E3406F9A68B4241B958417 C7BAF557D3845FE02905F9BB41CA23A69699CD7EAD6342581940017C1B889956 CA33B6CFDFC125580802A51DD643ADF3EE84F41D8A8DD0F9F26FF9ADA154AA15 F8F524D7513EBE5C2BD85164F88AA96862BC8E2CDC4443316EBE7894133E685C B8C50EDC1273772B47E27BB9425F1AC4582432A7EC3FE66842019352FF262D0D F9023057DF892C7D3DDA16D059833BA8A3BC11621E386551F00D022A14D85DC2 65A9700BD3EA9A0697F79068A7427FB022D0FD39CBD380E5FF7E47A4F7DF2438 2C212A3D033B9F67B1658777DB3BCEC9CBE6C4AAE5EC678ACA19CE697076AD97 33E87C4EF582CE980E0CA7AD3C81C0DBA0D89EB52F2153C1397581B702963FD6 70B5C57D3FF8A556DFEC0F748EE3FCBCDC4428F9F96C8EE3BB73C4B5D3CEC911 DE1C35D13BE9F70713F4916C7B6D4799CC6ECFAA613C036C0AC1FF4BA674C6FB 8D81D8D45F4DFB95AC48C7D901A2D4E8E488D608C3219349872790AC009B68D4 B98D7DD99A7BCDDDC7E610953B8735397478830D8A54C3993F41701E21383875 37743444E3678BFBBD046DB04F360E29D54C1B9BCFB4BD38A1ADF98A0820C2FD A0FE4ED1B85548B7B647321330238D6730508CC3B9705524B6B470050941877F F847CAD75E5BC0293BF70A7FC114652B5969D5BCA3B4ED7A650185CAC631362E 62A281E22DD8760BE3ED58A2A874A7267C97CD82C7C2BC7C9D625C1E198A58BD 076CD96C312B2F183DEC38A68DD60FFE596518EEA974BCCBE41F4AB7CACED310 3A79736760F1C6FA69B770760BF3ACC84AB500EAD03F84EAF1CE44AD11809A88 B4313E592164A00AB59784F62CB51209576C33BCEF370F7E8461C1C057739BBC 491AABEA9E7A9F51D18EC3C821DF1AD6D9FED2C22371F23565486C3DB759FE39 B0824197C29C8C4AC90623DC60799BF81DAB8215C1771F808DB7920FE55486E7 038C3C5BBBCDAB31BBFA8D00E774CC6223D5E2F8D7DB4C04A26AF335C948B0D4 BD871F7FD9356F0994C623EC505BB4700E0ADD4910D8F6DB8278925F25DBAA79 39BAD4C0E376D605AFF0EC0D131993288CA127CDF461905A75D9E7DE50E4A7E1 50190546741732B6BF355820DF8A737E421F9CEB1CD8328CC3AC246623977AF7 D678720129E0E8E82006FB66A7CB2653EA77D6E211DE1E6D590CBA852A1C08C9 184F2CC60D379CDF539194A42987DC54E87578BFF39B6BF39C52B16EC10531EA BDACB73A0C7CD92EE731A4B6F8F6551540915CE5A4C0C68FCEAEBE59435F3E78 9B044FA84252ECBFDD7486BDD081F54B196FA80323BF0AE8CA3BC57F75DA135B 4C0938F5C41B4BEFDE0208455A41A63D9D527700DC716138D704E16EEDBC2492 95638C693B6EF561D8B93EB0FA439869FF7B1A571FDDB0B6FAE0FB9BCF559949 A9B961EF942FF7CE9AC75316D6D233EBE552D6581FA5109C88343C4201CCEF86 26CEFF54E1AA1BDF98442A15B63963807075BDDD50902B7A3B7D110BC90DC3D2 0D33EB8CFB541B67F751B10E957CC2741A2A63E1FC31550C6F1851774D1DD9C1 5D9A00FC60DC326265AFBAAFD1BFB12EFE3D20C17A201E63071D96F8BB2580C0 8592F1ACB4220991FE316E4A18D4C031354D7D6A0053107CEA6B31F322B05B74 1C5B84DA7A2017555C9567369261594CB396D978E1DC9FCD2DC7A9AB92B163B4 3511F87C9C329A57850ED00ED4446B2B84113190ACC39BC13992A434A4DCAE10 0200F993DB59C80C3359B330426C48AAA2AEB66B29E8B41B8A8AB0C3D55070A8 9D00250D503CAA4547F962C5D6A9D1C311D01ED59A3DF54F7A90C0720CB26006 B5E026E87A7C6EBD82B261F4422AE00DBC557A7BE00DFAFAFE250D656B2E0FEA 8D4B237192DB9A5357335120340B919B94EA6F9789A2CFD71DA030E2B375F263 90114CE73C269828B07158876024FBD1100105256E3516D44AAFDF4653A29D87 17FF0F3E8E05B6197E48C42AA48C266781D91CD0AF1D92B9A18D47EB9B685971 C3FB95C9212F02208F0FB37E99E9E172F10921D7F23031A935B84B10930B9602 D52DCC2232B33CE68CF3C8DC3619B581C8D066BA9C795C1D30C28D7B20C5DCE7 1D972689EA3E2201731659DF004525A89F74C2FB8A50838561C4E7D3DD385B91 8151D94F6DA975B81B7BDED9FE6E2D9D65285CDA683269FCF656DE28CC46DA36 C4314D6CF59FF2466EEEB9F0A98AF3C043F4D658BFB73EB3B5DAC24E5754876E D740E6B128E179ECC0FD8BBF6B7D78A4C9A5E3729C9DA92581F847C22160CE6B 949CDE0AA1CAF2D2D07E0AFD4AD5FEE22FCAEE0170E3A14F4B5B682976635151 1BD9A79C572A7FC93391B512DAF5A65273056206DE4041E73F908CA190429ECC 3457881760B6D41AED11094A13881ED3575B380D831487BB2E708AFEF1D623B7 E721CDB010A772F8E8B41C92F5B860AC343D770D5AB453D5444E7F113A8EA0D7 9E3C035CAA4B0B06475BBD1E06FC7BCB122BED656E13A7315F0A6CCA7952E867 21EB8934826CBE77C7F610D7EDCB7D9065B15BB2FAA76453EB286833B4A872CC 7B931BD99BB4E31141FDB8E6DDAD24AE10AA3620CACDD462E671CD6FE69791DE 5D5C9089243087A051DC214744ABA85ABDA5C680A50DB8CADA19223A2BBF27EF E19D0E45293AC8F344CEE8FEF57FF7F4AAA60633895B04226C8227F744CE7F55 AC9EE7BA8949027D4E07D5B34C3AA968634EB5AA1CD9F2F35DB5C3D3E3E6D280 74D1C22B35DC4188C6F7709BB5AAEB05AF1644EFE4F6997366D361D8C881D00D 4DD596F96760DBD01499E5845FD8478EAC7D6BEB0319D80D7668D6E5E62E51E4 95AD8DB3BE50F5A7EEC2952DC4FF40A78E6CF90D6CF67096BD60F6AEBA633728 68AF95C9B58CD8A3257960681246423522DC9C8F9B8ED1264E910B545BAE44E1 3CD408C74D35991DECA3C7626E499BFCEC74551E637BAFBED3248077B8B60DFA F5A82DCB0FC370DC628F9AA5023609ACD047022D8871D27B57A856F8CB1FE4BE 33E52703EFA64485C39A1CAB4C3BCB266FF29C81508557CBE0F9845398F84091 7154A04CCF5506755B863F42459FB2EA5A9E64EDC098DE62625E3E5337259497 00006602C4FA078FE1EACE844DF813DCB634551E5A225BC94D9AC5A9B58D4936 9D9457C79E93115303095F1D3235F6327F00C315114EB0389D0FB7A3E54CE282 51D1A57A660CC69EA8085F829BCB5490432C21654F8081C57173F66529AF2752 83810C41FC0C7A28FEDF398761C87E8ADBD81DBC8E071633E131883FAFC692CC A08BCEE5AB692FF941885D51824D70B347FE57949C9D3EAE086A42F4E085BF4A BF68FF62ED8B7F1DF2BA5928E4839AE6787A39B5A12D69198F3D12B30AC3BDC7 E6A9F529B56181800E4BA3CEC9505C383A1CF0365B88AC1365FE8C2D18098915 BB8A2E76450D78319B8DBC05654BCD2BBAD864F8320AC2A2C6AF14A272A541D8 14313BB565C40F5A9B853799907D3581D3CAD989B2830677E5595EF5B3943C05 5B2FE6CA66835315F59AAE9B85C14ED48C4FAFDDC7745DDDA3CFB26706D41BDD 0C5B8FCE4F9028C1B420D04507D46241A44281FE3FBA4E2FC8740EF65A409595 F4E0EBD89B545D707C96BE0F48F1C340C742AF9B576F9AC02A527A168B9A4936 5992AD894599064F775A9EB250778D6FD0698EC47124117F5104958A732F7238 76A19B5E0EE8BBD212ED2A30E55B907245B967A5B213ECEB5A8AFB59327BFBF8 A97C9988317E702838CBA7EA03BAB9064F3A27375B258E1902E675DC77BF9BC0 D5B88F23B532112F40C13AB1CACF6AAD0FBED9E2A6EF8C899C61682BCC4BABD0 8AD4ED90F6B8137861482D6F458331C93E88F302C38ACE013877EB42B177F8A4 F1ECB0370829265E8FC0B8E81075F70A9443055CE9274B841CE6137BE424A73F 6F9EF12DA7B31D343E8B3548881C3AB49C7A2F4201C17D893DF68DD17D1F5F7E 3DEB9B289D38475B19193EB98439A3038077346377B7FCDA71AD64BEF0B9948F 2AF6AC529509592BD76FD54146CE5A2CA8ADB88D3ADA9D4A23A0DA39ED1D3885 D9E632BA0298AE10D8763EC87F483E0BBCB486C30AEB72558EC3BC21464A8A8D 44C79761C90BA9799F7D1047BF54573A68DED04304E54C51ABD2AF91E9B7CDB2 6D640DDFD6BF490789464BA2231AFE048FE7532BD1ADB787C1825C5F8C55412B 02CC6C2C6AC3B48EBEA4A5833D68394977675F668B731445E1166848C4B65B14 1CFEB20193A7FF2C11398BBB10863045206CF39D65279E0F0EB581B2A083794A C9CBD6F40FCD376ED1D9BDB04F154FA482E0F169843200EF27594A1DD85D3123 0BBD29CE6726564D1A326F8DF07342193CF72DDDD93CD27582F12B179C617BFD F6046781F87FC336D7B683F1E4AAB9AFD21421569302EB8B52FC312660584FC4 CE3357BA52EDB9838EE7740099FA52B8E7745342AEEE3FF319A774DCD52E5B00 F31D597BE6DEDE724CE109416982B1C00698560C94503ED32D62A1E2BE52F9AC AA6B4C9F229B29A44CFC8705A26BF4A42960DCA1C4A5013DAF4477278495ABCB 31339FEBBF09F3E568F1BF199E2599DBEDB8FF1F9698CCBFEE56282FBCD254F4 4CA01A51B626909E44B8BC8F1E5EDAC79C72601651C9010CF3BC450E7D918382 2BACA93F490FD08B6B95C367963E810CD148C5961A4CF016944F1A5C91D87641 750BE190263CC11A31CCDDF482087E485F145A845DFF439A1E11DBF108335DFC D9654A59E031603D1B5311CAA32F2777E445D490E04F6517FD772292FAB41C92 22015D7BF7935A453B45800AB21B2045E3594B8BDA7D159E07CE098744481D0E 1F7CF570B42A0B2A5FDE2E8C18B07916BD56AD29FFB6975CFD757F9867F55986 7DBE7870DC2674C4E0FAB1EC3CB51C10B20D3E6941EF217169EF99B7F6739DE4 9CD3A6A369914EFECF38BF7BA77BB5E8F986EDC4445D1CB41BC088A3442A39D2 ECBB7E395A7A7BDF30EFF2FD762EC36EB0679D50B2D3A5BE6ABF29F78817712A 3369A3E1B3483348B2566E43E855186B3C4D14D59AE3F8017D3D6E1AED8B7FD4 8D963FE37AC222E66441A13E296DA863E831640F43590F9DD086874E232CABD3 136253E68C42BA5D31F6A978A16AF437D6FC037E089F98F9382CEBB710A38A33 88593FD63E7B8A63C379DE86A615AA416021F9AFDD6666949569FD038E7B15A3 46E20589266F944F0F847119B18F7555DCDDB1CF22D2B133974D610080DF1C06 3A201691D9E40E8D334428FA4BB8F6B4B195185FBA1CD8E7CE1CDA34DB5BB5B2 DB6E8B51413C3C21079AC6C635BE8F9A64130422AE11551AAB8C8A74E1EBF1DA C11CD5B85CC17FF20D78B56FED5005B4163367C5726E187C6B02A966F11AB5DD F2654692AA32E05AFBF23F90F06B95FF57F23ED9D94CDB8A01FDDC7287B113C0 49D19C3AE480A75B5741693CA2FF40E1BC1382F2CA45409DAA39766FC01E3C07 BB0C44693BD73EDCDD68E69FF9F7908637C881DC8CEE69AE6D47F399442C7A16 3042F5BCC211502F32D1F1A4E9D2852F734B9191358519FD4B289260BAE8739D 12EB21EE18303742508E09BFE0FB648900B5B1C2C2672F73157A3B70A4A36C20 B477ECAA34EA9F010828B17EB82A501BA9BE2E5994A63B82B5689A7456667767 85F6D543DEF015D0F18E64519014C950BB5638E3E15EB648202437F818042705 0DC9380F44503B0498DC86910C5670DC45C7974A93DCD9375E501217430776A0 C025D967828B95460E3AF5E6D738AFC9B43E3C0DFDD33BDD01C6845B79584700 5C05E39D0185A9AA41F16DE7A81EEC10A20887E6BF8C93D03775B8E9FC457AC3 0194513445E4B34D28880D5ED610E5A08712F9C5B978C47A59549D7FCA366EED E52B3353C2D240C2258C00B9FEBB5C7CA00D1836D11E2719568C2EB845C27A9F 75B85B7D1CBE9CBE1459C2242ED1D0B8DE16F033A1D581CB7EC53333DAD61996 C67AD7C6883EDB7C1B60E0A8DCCF1A0CC1D8B0583BA4914889A16AEAE9E9B967 E252B4124CF981BF65F15C8DBC62827B7EC7632FDB52FEA97B3BE1DD516C3520 99D5B01395DAE3F8A5CD1E065A2927DEF563B5CFA19F02ACE4D7BA92297E1C45 4837423EF7D998AA852D2C85F75EB414AD56A5E9E15330F360DF2D69126633AA 605ED53092A66D98951BADB030CD5ABC16973364CA1823248B71CADA2001707D 7A433EC30F7E937A725DF24C1E84DD48B2EACA8922A63273557CBAE755A32CD1 999836969869F9BD97248ABBA2F848E1B676F0AC9049CA481617A82E63C4AFBC 68B1BA03C1FE6F6367F75AD3D0A8E982E5D492227A5AAEFC6BE9C61F0F725969 B3E205E214D9D876F8089FE59C03E1E78B5EAE0BEE631411F15BD62D18899413 16F6B34F2F53E8EE5E6DC0CBF18AA1D11341C0CC8BE9EFBBEF5A37580B8C116A 031FD86557F29AED111D5C25D7A71B1F4DCBDCDE642854533AD9411E03A13BE2 A741CB22882A0BCAFF4F8E61ACAC240D1751990675FA45E7C0E987A2F897A384 001EEA59E41A4842750FB9F259C4BB699C0C621A01B74562A894D885A18E1674 4CC4AC716E06462B6BBACBDB1D35936B357A006AF60D909E2CC628D885CD25CC AA2C8AB565F80866B22CF531E2E7C895E8720482C7EBB86558699725512E7889 66E8E04E51D496320FDA902D162E6EF6437D65352966C61E13229D4210EDB549 E03011339EE54BE245B603CC6A308368D045CB5968E8EDE5842729AAD3EAA46C A7426B7831EECEEE60B65A89ED0E9C677A58E4268639016D00846E9AC5E735F0 08C1362AF3801CACFC6201D4EED80A44B4A543E03A51E31A4DA2A3FC2D860ECA A1B35EA816F33B054814A48712D996A357C05CCB08EEE6ACB2747FEF2264F902 05770F20CACA3B58569E1C40C929B2446E6114C8D86E08DEC79782E3454BBB9D F9B6F44DAB10D07E524932DC05232D62BD337C9C1969520C1D36B4D4FC6C8F3E 110BC28533B8D7AC1CCA2215284C581FA45CC898E75F93A4A32263F9C0AFA2F8 1EE0CF3CE43E804B55DA02B04595E9DE6C0E173A69FE14B37A2B779F00B8D15F 49DD16260761A65E351C99B8EF71609CEBE786F93ECCC18E3DFA2C1B38B1A725 472AD0CFA7D7764DDEB4BC06B0BF1653CA2E0F926125777F9C3A2AB5909A3323 FD937836427AC8B6E59F63262FE0D4A2CE5EAF927BDDCC3F366705D3549F0B64 21EA0B14C6BE4344BDA53144E8E918B55B37C8A20B58F398CE2C1462492E17D4 C890C6076EEACFEAFEEABAC4C270D08D4A8BC0D5B79E9B5E2D2AF3C4D7013A5C 04D29057353B4C9E70593336D2F56AC5A615A6264FBE1FF26D77A221C203026F 1CF70E779150059DCE81327034F1570AAC658EEB6122AE9786991D036BD019DB D2FBEDE983415F17979E883E5D271670D43551827FE88C681DAAF2B88B54061A 232FB48C6E5823427D34B27F999324CBF68C73109E0D849F37E4EE9FE04B25D9 D218DCE91296BD9235CBB6A19447401E2214F4D9E2890840B414720FDAC32A4C 9DB20E6882BEADA0B2551BA966E65FA1C013FBF1668DF2F5DCFE740EECF64202 855B0E650315686358A9650467455AD6692430A3914BABBB553C9874BAA2D5E2 A378E7F1180BCC98BF92F911E2F79052F4B68B53EF3786280BF000D4B1DA599A 2AB26879BD77292A419A52AB3F54A558833ADD3FF626BEA1D491BD4B8AF8AA1D CA760C6937BB709A11EB01641E55FB51FBE6B8C7EC0D33E371294EF23915244D 6FD7C46CC020C249A9CCCECA7512F116D182858ED060EEB37CD1B663CF344E1B A81991AC5E0816251D27AD6EF9B789F812BE7BF6C74AC0EA544A3E8EBA415A85 4A1239D2500F232230AB634E6DB4395324B34BE4DFFC1A7FE8C95796B7AA38E2 3C5F56ED7C8B9F1E27267F154405B1ED087B1A60437501E33D6AF930835C6851 22789EF8D4A2E80C17DBB8E30C7847C84D82009BAA06CEEBDBC9BA06BA83315C 0F9241338A907D0619C71DDE6B8560AAF6FC8A8D8230DA12B5CDB5E57893F28D 25B282558F9998E8E822FBDF3E3E51E39C73AF49AD1E81AE405D3A12D3A45756 17BF9A18752D823D1CF689E244CD4A34DEF1FC65A131537F6FEE8920C04B739E 92C38F8966D31F6E85B8D380DA440F7876155AD1C81DA62BD39649F3A324F85D EA64550336A68E4E0A6E698E660D609ED3D0A95573570DE96219FD6DD7CE3E8E 2D55629C9CF87B898D2F81F17BC4F3EB992163A3A7C2B4828F08C83CCEF8B46F A8C07FA93BBDDF5936D67A6B00A1568D064766BE43B0D4A31EBE02FF5E8FA73C C6FA453628554939F292714E9D3135D112BF4AD560E787D2FCA0187453F4DF18 DFEA1AAFDA54318E1EC4AF601C05356B878DFD16363BA6FA4184D8AAB1386BFD 9B9DB38E4A1613A059234BE2BB6AA5D844DD78B8960B93A28D812EF7B1C2B00A DE7D40865C5DEA3FF911CF03F5EC73955D89CA3262D9F0815E98955E7554A92F D9495FAA8646AD7B97BF620F357737B828549AD3EAD6C8B17E6BC22B9FE4FF8E 00BE86233CF8B7CC704AB27E037A1D463FE3A2B87AD8DA3A062FF5337E43627D 03F80F8706B097A427E67BDA9C5A2C1F1CE3847B887D227A8A6437273CCEDBCF C2290987A8CFE4448F19F002B960989E286465FE14854346433147FAF8B3B223 AB97B320F994D7B3788EE3C0D28845CCDAA9C4B2D19CFE0B86F6E7F6A7EF365E 51F02715C6033B32B7DACD27BF2B31CA9B80D5275C666FA169A749D07B0E825C 11F3418F0A5F4DA60F2907CF522C3A5A3C2FAA251158DDBB2EF8EF05DAD7BC26 563023397A44FC9AE9E0C18F416E7556EBDB104AA95C45A3299F5B2F74E51A22 B3E1B82B71C672AE63AD9154A46C1A7F38251125383EFB0A1CEF627BB3B5BAAF 423D49DC6A1C524116F3F2CB2B4821EE779B6551B3A822ED29F6B4132C020F11 DB1C1CECFBB3C4504928FF971D277E6561E6404E6D52B46E4C3FC2FA9641C6FB 9B596FEAB03D28F18FDF4371EF22A7CC024AE4CDB09B4B0F595C314F1BCEB815 7693E864B8029D1875C5 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 39158280 55380996 1000 600 600 (dbacl.dvi) @start /Fa 134[35 6[35 2[35 1[35 35 2[35 3[35 35 35 35 35 32[35 17[35 46[{ TeX09fbbfacEncoding ReEncodeFont }13 66.4176 /CMTT8 rf /Fb 175[70 80[{}1 58.1154 /TeX-cmex7 rf /Fc 250[31 4[45{ TeXbbad153fEncoding ReEncodeFont }2 41.511 /CMSY5 rf /Fd 174[45 81[{}1 58.1154 /MSBM7 rf /Fe 139[24 48[44 67[{ TeXaae443f0Encoding ReEncodeFont }2 49.8132 /CMMI6 rf /Ff 139[44 3[44 3[44 3[44 4[44 1[44 2[44 44 1[44 32[44 14[44 8[44 34[{ TeX09fbbfacEncoding ReEncodeFont }12 83.022 /CMTT10 rf /Fg 152[34 34 9[45 21[48 15[0 3[45 66 19 14[66 14[52 7[52 4[34 1[34 1[20 52{ TeXbbad153fEncoding ReEncodeFont }15 58.1154 /CMSY7 rf /Fh 150[39 39 2[46 10[46 106 120 5[39 78 88 17[74 1[74 1[74 1[74 20[48 48 66 66 10[44 44 61 1[50 50 6[48 48 4[35 35 38 38{}28 83.022 /CMEX10 rf /Fi 143[69 1[42 2[42 23 2[42 42 7[55 1[55 55 14[57 5[60 10[42 8[55 83 1[65 13[83 7[65 65 2[65 65 4[42 42 8[42 3[23 65{ TeXbbad153fEncoding ReEncodeFont }25 83.022 /CMSY10 rf /Fj 134[30 33 9[37 51 20 31 24 3[28 34[41 38[28 28[{ TeXaae443f0Encoding ReEncodeFont }10 41.511 /CMMI5 rf /Fk 205[28 28 5[43 43[{ TeX0ef0afcaEncoding ReEncodeFont }3 41.511 /CMR5 rf /Fl 133[32 34 38 48 2[25 31 31 3[41 59 21 35 27 23 39 32 32 2[30 29 36 25[52 42 2[48 4[52 2[20 20 26[41 2[31 4[33 1[39 21[{ TeXaae443f0Encoding ReEncodeFont }29 58.1154 /CMMI7 rf /Fm 173[60 65 51 80[{}3 83.022 /MSBM10 rf /Fn 146[55 8[37 2[33 7[49 49 3[47 37 48 5[41 2[24 49 1[43 45 50 47 46 49 3[51 2[19 33 33 33 33 33 33 33 33 33 33 1[19 2[51 1[26 26 34[49 5[{ TeXf7b6d320Encoding ReEncodeFont } 34 58.1154 /CMR7 rf /Fo 134[35 33 47 1[38 24 29 30 1[36 36 40 58 18 1[22 22 36 33 22 33 36 33 33 36 13[40 52 4[64 45 55 1[27 53 55 1[48 54 51 1[53 15[36 36 1[22 26 5[22 26[40 12[{ TeX74afc74cEncoding ReEncodeFont }40 66.4176 /CMTI8 rf /Fp 133[39 41 47 59 40 48 30 39 37 1[42 1[50 73 1[43 34 29 48 40 41 39 43 1[36 44 35 5[57 48 69 5[63 1[53 63 3[71 2[69 65 53 1[69 59 1[62 2[65 42 65 23 23 18[54 5[52 1[52 2[36 47 1[47 1[41 50 48 9[53 11[{ TeXaae443f0Encoding ReEncodeFont }51 83.022 /CMMI10 rf /Fq 133[34 40 39 55 38 45 28 34 35 38 42 42 47 68 21 38 25 25 42 38 25 38 42 38 38 42 9[83 1[62 59 47 2[56 2[74 52 6[56 63 59 1[62 6[25 11[25 30 25 2[34 34 27[47 12[{ TeX74afc74cEncoding ReEncodeFont }44 83.022 /CMTI10 rf /Fr 134[51 51 2[51 49 38 50 53 46 53 51 62 43 2[25 51 53 44 46 52 49 1[51 12[65 1[66 4[82 57 2[34 2[59 62 69 65 64 7[27 8[46 2[27 46[{ TeX0ef0afcaEncoding ReEncodeFont }33 83.022 /CMCSC10 rf /Fs 133[37 44 44 60 44 46 32 33 33 44 46 42 46 69 23 44 25 23 46 42 25 37 46 37 46 42 2[42 23 42 23 51 2[85 62 62 60 46 61 1[57 65 62 76 52 65 1[30 62 65 54 57 63 60 59 62 3[65 1[23 23 42 42 42 42 42 42 42 42 42 42 42 23 28 23 65 1[32 32 23 3[69 42 23 18[69 46 46 48 2[60 2[62 4[52{ TeXf7b6d320Encoding ReEncodeFont }83 83.022 /CMR10 rf /Ft 139[25 5[43 7[34 19[53 2[54 79[{ TeXaae443f0Encoding ReEncodeFont }5 66.4176 /CMMI8 rf /Fu 147[23 7[45 36 45 40 97[{ TeXf7b6d320Encoding ReEncodeFont }5 66.4176 /CMBX8 rf /Fv 139[39 30 40 14[39 39 41 31[54 18[21 46[{ TeX0ef0afcaEncoding ReEncodeFont }8 66.4176 /CMCSC10 rf /Fw 132[35 31 37 37 51 37 39 27 28 28 1[39 35 39 59 20 1[22 20 39 35 22 31 39 31 39 35 3[20 1[20 43 53 1[72 53 1[51 39 52 1[48 55 53 65 44 55 36 25 2[46 48 54 51 50 53 5[20 20 35 35 35 35 35 35 35 35 35 35 1[20 24 20 2[27 27 27[39 41 11[{ TeXf7b6d320Encoding ReEncodeFont }67 66.4176 /CMR8 rf /Fx 134[50 2[50 53 37 38 39 50 53 48 53 80 27 50 1[27 1[48 1[44 53 42 53 46 8[72 3[66 53 72 1[65 3[57 2[36 75 75 60 63 73 69 68 72 12[48 48 48 48 2[27 32 32[53 12[{ TeXf7b6d320Encoding ReEncodeFont }42 83.022 /CMBX10 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: A4 end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 1198 716 a Fx(THE)41 b(DBA)m(CL)i(TEXT)f (CLASSIFIER)1719 965 y Fw(L.A.)23 b(BREYER)754 1199 y Fv(Abstra)o(ct.)42 b Fw(This)27 b(is)g(a)h(summary)f(of)h(the)g (mathematical)h(asp)r(ects)g(of)e(the)i(design)f(of)754 1323 y Fu(dbacl)p Fw(,)34 b(a)e(digramic)f(Ba)n(y)n(esian)i (classi\014er)e(for)h(text)h(do)r(cumen)n(ts.)57 b Fu(dbacl)32 b Fw(computes)754 1448 y(maxim)n(um)i(\(relativ)n(e\))g(en)n(trop)n(y)h (mo)r(dels)f(for)e(text)j(corp)r(ora)f(and)g(can)g(compute)i(the)754 1572 y(Ba)n(y)n(esian)26 b(p)r(osterior)f(distribution)f(for)g(a)h(giv) n(en)h(do)r(cumen)n(t)g(in)f(terms)f(of)h(an)n(y)g(n)n(um)n(b)r(er)754 1697 y(of)h(previously)h(computed)h(mo)r(dels.)38 b(Both)27 b(learning)f(and)h(classifying)f(is)f Ft(O)r Fw(\()p Ft(n)p Fw(\))i(in)f(the)754 1821 y(n)n(um)n(b)r(er)e(of)g(lines)f(of)g (the)i(input)f(do)r(cumen)n(ts.)1615 2208 y Fs(1.)41 b Fr(Intr)n(oduction)555 2407 y Fx(dbacl)26 b Fs(is)f(a)f(digramic)g (Ba)n(y)n(esian)f(classi\014er)g(for)i(text)g(do)r(cumen)n(ts.)36 b(It)25 b(is)g(a)g(command)f(line)456 2557 y(to)r(ol)i(sp)r (eci\014cally)g(designed)g(to)g(learn)g(features)g(of)g(text)h(corp)r (ora,)e(b)n(y)h(building)h(a)f Fq(maximum)456 2706 y(entr)l(opy)p Fs(-t)n(yp)r(e)34 b(mo)r(del)h(in)g(terms)f(of)g(these)h(features.)57 b(F)-7 b(eature)34 b(selection)g(dep)r(ends)h(on)f(the)456 2856 y(curren)n(tly)24 b(selected)h(lo)r(cale,)h(and)f(can)g(b)r(e)h (sp)r(eci\014ed)g(using)f(regular)f(expressions)f(if)j(required.)456 3005 y(Computed)40 b(mo)r(dels)h(can)f(b)r(e)h(used)f(to)h(calculate)f (Ba)n(y)n(esian)e(p)r(osterior)h(probabilities)h(for)456 3155 y(unkno)n(wn)32 b(text)i(do)r(cumen)n(ts.)54 b(The)33 b Fx(dbacl)h Fs(man)n(ual)f(page,)h(presen)n(ted)f(at)g(the)g(end)h(of) f(this)456 3304 y(do)r(cumen)n(t,)24 b(con)n(tains)f(a)g(quic)n(k)g(in) n(tro)r(duction)g(and)g(some)g(examples)g(of)g(usage.)35 b(The)23 b(purp)r(ose)456 3454 y(of)35 b(this)i(do)r(cumen)n(t)f(is)g (to)f(explain)h(asp)r(ects)f(of)h(the)h(mathematical)e(design.)61 b(T)-7 b(o)36 b(help)g(the)456 3603 y(reader)23 b(unfamiliar)h(with)i (Ba)n(y)n(esian)c(theory)-7 b(,)25 b(w)n(e)g(b)r(egin)f(with)i(a)e (section)h(outlining)f(the)i(main)456 3752 y(probabilistics)g(concepts) h(in)n(v)n(olv)n(ed.)993 3972 y(2.)41 b Fr(Ba)-6 b(yesian)32 b(text)f(classifica)-6 b(tion)32 b(and)f(decisions)555 4171 y Fs(A)i(text)g(do)r(cumen)n(t)g(can)f(b)r(e)i(view)n(ed)e(as)g(a) g(v)n(ery)f(long)h(string)g(of)h(c)n(haracters.)50 b(F)-7 b(rom)32 b(the)456 4320 y(statistical)e(p)r(ersp)r(ectiv)n(e,)i(the)f (c)n(haracters)e(whic)n(h)i(form)g(the)g(w)n(ords)f(and)h(sen)n(tences) g(do)f(not)456 4470 y(o)r(ccur)21 b(randomly)-7 b(,)23 b(but)g(ob)r(ey)f(probabilistic)g(la)n(ws)g(whic)n(h)g(go)n(v)n(ern)e (the)j(app)r(earance)e(of)i(a)f(c)n(har-)456 4619 y(acter,)28 b(giv)n(en)f(the)i(sequence)f(of)g(c)n(haracters)e(immediately)j (preceding)f(it.)40 b(Suc)n(h)28 b(mo)r(dels)g(are)456 4769 y(called)21 b Fp(n)p Fs(-gram)f(c)n(haracter)g(mo)r(dels,)j(where) f Fp(n)g Fs(refers)f(to)h(the)g(n)n(um)n(b)r(er)g(of)g(relev)-5 b(an)n(t)21 b(c)n(haracters)p 456 4843 499 4 v 555 4966 a Fo(Date)5 b Fw(:)23 b(Octob)r(er,)h(2002;)g(Revised)g(No)n(v)n(em)n (b)r(er)h(2002,)f(Ma)n(y)-6 b(,)23 b(June)i(2004.)555 5090 y(1991)i Fo(Mathematics)f(Subje)l(ct)f(Classi\014c)l(ation.)37 b Fw(Primary)22 b(60J,)i(Secondary)h(60F.)555 5215 y Fo(Key)g(wor)l(ds)i(and)g(phr)l(ases.)37 b Fw(SP)-6 b(AM,)23 b(Ba)n(y)n(es)h(theorem,)g(email,)f(Maxim)n(um)g(en)n(trop)n(y)-6 b(.)1933 5315 y Fn(1)p eop end %%Page: 2 2 TeXDict begin 2 1 bop 456 251 a Fn(2)1245 b(L.A.)22 b(BREYER)456 450 y Fs(in)i(the)g(mo)r(del.)35 b Fx(dbacl)24 b Fs(uses)g(a)f Fq(digr)l(am)i Fs(mo)r(del,)f(so)f(that)h(eac)n(h)f(c)n(haracter)f(is)h (predicted)h(based)456 600 y(on)h(its)h(immediate)f(predecessor.)35 b(A)26 b Fq(trigr)l(am)f Fs(mo)r(del)h(w)n(ould)f(dep)r(end)i(on)e(the) h(previous)e(t)n(w)n(o,)456 749 y(but)k(requires)e(m)n(uc)n(h)h(more)g (memory)-7 b(.)555 898 y(A)31 b(text)h(do)r(cumen)n(t)f(can)f(also)g(b) r(e)h(view)n(ed)f(as)g(a)h(v)n(ery)e(long)h(string)g(of)h(w)n(ords.)45 b(The)31 b(same)456 1048 y(statistical)23 b(ideas)h(apply)g(here)f(to)r (o.)36 b(Shannon)23 b(\(1948\))g(describ)r(ed)h(sev)n(eral)e(examples)i (of)g(suc)n(h)456 1197 y(mo)r(dels)j(for)f(English)g(text.)38 b(Since)27 b(eac)n(h)f(p)r(ossible)h(w)n(ord)f(is)h(treated)f(lik)n(e)h (a)g(c)n(haracter)e(in)i(the)456 1347 y(c)n(haracter)c(based)i(mo)r (dels,)g(this)h(can)f(b)r(e)h(view)n(ed)f(as)f(a)h(c)n(haracter)f (based)g(mo)r(del)i(with)g(a)f(v)n(ery)456 1496 y(large)j(alphab)r(et.) 42 b(Practically)-7 b(,)29 b(these)g(t)n(w)n(o)g(t)n(yp)r(es)h(of)f(mo) r(dels)g(are)g(v)n(ery)f(di\013eren)n(t,)j(ho)n(w)n(ev)n(er,)456 1646 y(b)r(ecause)18 b(individual)g(c)n(haracters)f(o)r(ccur)h(so)f (frequen)n(tly)i(that)g(statistics)f(are)f(easy)h(to)g(estimate,)456 1795 y(while)30 b(individual)h(w)n(ords)e(are)g(comparativ)n(ely)f (rare.)44 b(More)29 b(precisely)-7 b(,)30 b(w)n(ord)g(distributions)456 1944 y(tend)25 b(to)g(follo)n(w)f(a)h(p)r(o)n(w)n(er)e(la)n(w,)i(and)g (when)g(classifying)f(an)h(unkno)n(wn)f(do)r(cumen)n(t,)i(it)f(is)g (lik)n(ely)456 2094 y(to)i(con)n(tain)g(w)n(ords)f(whic)n(h)i(ha)n(v)n (e)e(nev)n(er)h(o)r(ccurred)f(in)i(the)g(learning)f(corpus.)555 2243 y(Go)r(o)r(d)g(text)f(classi\014cation)f(algorithms)g(m)n(ust)i (therefore)e(b)r(e)i(able)f(to)g(predict)g(new)h(w)n(ords)456 2393 y(at)35 b(the)g(same)g(time)g(as)g(w)n(eigh)f(existing)h(w)n(ords) f(when)h(comparing)f(do)r(cumen)n(ts.)59 b(Supp)r(ose)456 2542 y(that)28 b(w)n(e)g(can)f(build)i(a)f(probabilistic)f(mo)r(del)h (for)g(the)g(con)n(ten)n(ts)g(of)g(an)f(existing)h(text)g(corpus)456 2692 y Fp(C)6 b Fs(.)75 b(This)41 b(will)f(b)r(e)h(represen)n(ted)e(b)n (y)i(a)f(probabilit)n(y)f(measure)g Fm(P)2606 2704 y Fl(C)2702 2692 y Fs(on)h(strings,)j(whic)n(h)e(is)456 2841 y(concen)n(trated)26 b(on)h(strings)g(similar)g(to)g(those)h (found)f(in)h Fp(C)6 b Fs(.)555 2991 y(The)26 b(maxim)n(um)f(en)n(trop) n(y)f(formalism)h(allo)n(ws)f(the)i(construction)e(of)i(v)n(ery)e (general)g(proba-)456 3140 y(bilit)n(y)j(measures,)g(b)n(y)g(selecting) g(a)h(set)f(of)h(in)n(teresting)f Fq(fe)l(atur)l(es)g Fs(of)h(the)g(learning)f(corp)r(ora)e(as)456 3289 y(represen)n(tativ)n (e)g(\(Berger)h(et)i(al,)g(1996;)d(Della)j(Pietra)e(et)i(al,)g(1997\).) 555 3439 y(Supp)r(ose)19 b(w)n(e)f(ha)n(v)n(e)g(constructed)g (probabilit)n(y)g(mo)r(dels)h Fm(P)2345 3451 y Fl(C)2393 3459 y Fk(1)2429 3439 y Fs(,)h(.)14 b(.)g(.)g(,)21 b Fm(P)2678 3451 y Fl(C)2726 3460 y Fj(k)2784 3439 y Fs(for)e(a)f(set)h (of)g(corp)r(ora)456 3588 y Fp(C)515 3600 y Fn(1)552 3588 y Fp(;)14 b(:)g(:)g(:)g(;)g(C)796 3600 y Fl(k)837 3588 y Fs(.)40 b Fq(A)30 b(priori)p Fs(,)h(w)n(e)d(assume)g(that)h(the) g(new)f(do)r(cumen)n(ts)h(w)n(e)f(wish)g(to)h(classify)f(arise)456 3738 y(from)37 b(category)e(1)k Fi(\024)g Fp(j)44 b Fi(\024)39 b Fp(k)i Fs(with)d(probabilit)n(y)e Fp(\031)2137 3750 y Fl(j)2172 3738 y Fs(.)67 b(These)37 b(probabilities)f(m)n(ust)i (satisfy)456 3825 y Fh(P)543 3845 y Fl(k)543 3912 y(j)s Fn(=1)676 3887 y Fp(\031)723 3899 y Fl(j)786 3887 y Fs(=)27 b(1.)45 b(F)-7 b(or)30 b(equally)f(lik)n(ely)h(categories)f(\(represen) n(ting)g(total)h(ignorance)e(a)i(priori\),)456 4037 y(w)n(e)d(w)n(ould) g(tak)n(e)g Fp(\031)1047 4049 y Fl(j)1105 4037 y Fs(=)c(1)p Fp(=k)29 b Fs(for)e(all)h Fp(j)5 b Fs(.)555 4186 y(Let)38 b Fp(s)g Fs(b)r(e)h(the)f(string)f(corresp)r(onding)f(to)i(an)g(unkno)n (wn)f(text)i(do)r(cumen)n(t)f(w)n(e)g(wish)g(to)456 4336 y(classify)-7 b(.)60 b(The)36 b Fq(a)h(p)l(osteriori)h Fs(probabilit)n(y)d(that)h Fp(s)f Fs(arises)f(from)i(the)g(probabilit)n (y)f(measure)456 4485 y Fm(P)507 4497 y Fl(C)555 4505 y Fj(j)617 4485 y Fs(\(i.e.)28 b(is)f(most)h(similar)f(to)g(the)h(do)r (cumen)n(ts)g(in)f Fp(C)2158 4497 y Fl(j)2194 4485 y Fs(\),)h(is)f(giv)n(en)g(b)n(y)g(Ba)n(y)n(es')f(theorem)h(as)456 4779 y(\(1\))502 b Fm(P)1115 4711 y Fh(\000)1152 4779 y Fp(C)1211 4791 y Fl(j)1261 4779 y Fi(j)14 b Fp(s)1337 4711 y Fh(\001)1398 4779 y Fs(=)22 b Fp(K)1562 4744 y Fg(\000)p Fn(1)1651 4779 y Fm(P)1702 4791 y Fl(C)1750 4799 y Fj(j)1784 4779 y Fs(\()p Fp(s)p Fs(\))p Fp(\031)1934 4791 y Fl(j)1970 4779 y Fp(;)180 b(K)29 b Fs(=)2402 4675 y Fl(k)2360 4700 y Fh(X)2363 4877 y Fl(j)s Fn(=1)2494 4779 y Fm(P)2545 4791 y Fl(C)2593 4799 y Fj(j)2627 4779 y Fs(\()p Fp(s)p Fs(\))p Fp(\031)2777 4791 y Fl(j)2813 4779 y Fp(:)456 5066 y Fs(Note)i(that)h(this)f(assumes)g(that)h Fp(s)f Fs(m)n(ust)h(b)r(e)f(compared)g(only)g(to)g(the)h(corp)r(ora)d Fp(C)3099 5078 y Fn(1)3137 5066 y Fp(;)14 b(:)g(:)g(:)f(;)h(C)3380 5078 y Fl(k)3421 5066 y Fs(.)456 5216 y(The)21 b(normalizing)f(constan) n(t)g Fp(K)27 b Fs(do)r(es)21 b(not)g(allo)n(w)f(for)h(other)g(c)n (hoices,)g(i.e.)h(unclassi\014able)e(text.)p eop end %%Page: 3 3 TeXDict begin 3 2 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)939 b(3)456 450 y Fs(Suc)n(h)32 b(a)f(generalization)f(is)i (p)r(ossible)f(b)n(y)h(mo)r(difying)g Fp(K)6 b Fs(,)32 b(to)g(accoun)n(t)f(for)g(other)h(categories)456 600 y(not)27 b(directly)h(mo)r(delled,)f(but)i(this)f(will)f(not)h(b)r(e)g (discussed)f(here.)555 749 y(The)38 b(simplest)g(decision)f(pro)r (cedure)f(for)h(classi\014cation)g(is)g(the)h(follo)n(wing:)56 b Fq(say)40 b(that)e Fp(s)456 898 y Fq(r)l(esembles)i(c)l(ate)l(gory)g Fp(C)1228 910 y Fl(j)1303 898 y Fq(if)g(the)g(c)l(onditional)h(pr)l(ob) l(ability)h Fm(P)p Fs(\()p Fp(C)2529 910 y Fl(j)2578 898 y Fi(j)14 b Fp(s)p Fs(\))39 b Fq(is)h(gr)l(e)l(atest)p Fs(.)68 b(This)39 b(is)456 1048 y(kno)n(wn)27 b(as)f(the)i(MAP)g (\(Maxim)n(um)g(A)g(P)n(osteriori\))d(estimate.)555 1197 y(More)g(generally)-7 b(,)24 b(w)n(e)h(can)g(in)n(tro)r(duce)g(a)f (loss)h(function)h Fi(L)p Fs([)p Fp(i;)14 b(j)5 b Fs(])25 b(whic)n(h)g(represen)n(ts)f(the)h(loss)456 1347 y(incurred)30 b(when)h Fp(s)f Fs(is)h(misclassi\014ed)f(as)g(resem)n(bling)g Fp(C)2219 1359 y Fl(j)2254 1347 y Fs(,)i(when)f(in)g(actual)f(fact)h (it)g(ough)n(t)g(to)456 1496 y(resem)n(ble)d Fp(C)856 1508 y Fl(i)884 1496 y Fs(.)43 b(Supp)r(ose)29 b(w)n(e)g(pic)n(k)g(an)n (y)g(decision)g(rule)g Fp(w)j Fs(to)e(do)f(the)h(classi\014cation,)e (so)h(that)456 1646 y(if)g Fp(s)f Fs(is)h(an)f(unkno)n(wn)g(text)h(do)r (cumen)n(t,)g Fp(w)r Fs(\()p Fp(s)p Fs(\))d(=)f Fp(j)33 b Fs(means)28 b(that)h Fp(s)g Fs(arises)e(from)h(category)f Fp(C)3409 1658 y Fl(j)456 1795 y Fs(under)i(this)h(rule.)43 b(The)30 b(b)r(est)g(decision)f(according)f(to)i(Ba)n(y)n(esian)e (Theory)g(o)r(ccurs)h(when)h(the)456 1944 y(exp)r(ected)24 b(p)r(osterior)e(loss)h(is)h(minimized:)36 b Fq(say)27 b(that)f Fp(s)g Fq(r)l(esembles)h(c)l(ate)l(gory)g Fp(C)2929 1956 y Fl(j)2991 1944 y Fq(if)g Fp(w)3127 1956 y Fg(\003)3166 1944 y Fs(\()p Fp(s)p Fs(\))c(=)g Fp(j)5 b Fq(,)456 2094 y(wher)l(e)30 b Fp(w)749 2106 y Fg(\003)817 2094 y Fq(minimizes)h(the)f (exp)l(e)l(cte)l(d)g(p)l(osterior)h(loss)f(over)g(al)t(l)h(p)l(ossible) g(de)l(cision)h(rules:)1313 2329 y Fp(w)1372 2341 y Fg(\003)1434 2329 y Fs(=)22 b(arg)14 b(min)1696 2379 y Fl(w)1846 2225 y(k)1804 2250 y Fh(X)1810 2427 y Fl(i)p Fn(=1)1938 2329 y Fi(L)p Fs([)p Fp(i;)g(w)r Fs(\()p Fp(s)p Fs(\)])p Fm(P)p Fs(\()p Fp(C)2413 2341 y Fl(i)2456 2329 y Fi(j)g Fp(s)p Fs(\))p Fp(:)555 2559 y Fs(The)24 b(simplest)h(example)e(o)r(ccurs)g (when)i(there)e(are)g(only)h(t)n(w)n(o)f(categories,)g(and)h(there)g (is)g(no)456 2709 y(loss)k(incurred)h(for)g(correct)f (classi\014cations)f(\(i.e.)j Fi(L)p Fs([1)p Fp(;)14 b Fs(1])25 b(=)h Fi(L)p Fs([2)p Fp(;)14 b Fs(2])25 b(=)h(0\).)42 b(In)29 b(this)h(case,)f(the)456 2858 y(optimal)e(Ba)n(y)n(esian)f (classi\014cation)g(pro)r(cedure)g(is)i(giv)n(en)f(b)n(y:)703 3065 y Fq(Say)j(that)g Fp(s)g Fq(r)l(esembles)g(c)l(ate)l(gory)g Fp(C)1853 3077 y Fn(1)1921 3065 y Fq(if)g(and)h(only)f(if)2487 3009 y Fm(P)2538 3021 y Fl(C)2586 3029 y Fk(1)2622 3009 y Fs(\()p Fp(s)p Fs(\))p 2487 3046 239 4 v 2487 3122 a Fm(P)2538 3134 y Fl(C)2586 3142 y Fk(2)2622 3122 y Fs(\()p Fp(s)p Fs(\))2758 3065 y Fi(\025)2856 3009 y Fp(\031)2903 3021 y Fn(2)2940 3009 y Fi(L)p Fs([2)p Fp(;)14 b Fs(1])p 2856 3046 308 4 v 2856 3122 a Fp(\031)2903 3134 y Fn(1)2940 3122 y Fi(L)p Fs([1)p Fp(;)g Fs(2])3174 3065 y Fp(:)555 3273 y Fs(Note)32 b(that)f Fx(dbacl)h Fs(calculates)f(only)g(the)g(conditional)g(probabilities)g Fm(P)p Fs(\()p Fp(C)2966 3285 y Fl(j)3015 3273 y Fi(j)14 b Fp(s)p Fs(\))31 b(for)g(eac)n(h)456 3422 y(learned)24 b(category)f Fp(C)1135 3434 y Fl(j)1170 3422 y Fs(,)j(more)e(general)f (decisions)h(with)i(arbitrary)d Fq(a)k(priori)g Fs(probabilities)d Fp(\031)3409 3434 y Fl(j)456 3572 y Fs(and)j(loss)g(matrices)g(can)g (easily)g(b)r(e)h(p)r(erformed)f(b)n(y)g(a)g(wrapp)r(er)g(script.)555 3721 y(The)36 b(equation)f(\(1\))h(breaks)e(do)n(wn)h(when)h(there)f (is)h(a)f(single)g(category)f Fp(C)42 b Fs(=)36 b Fp(C)3176 3733 y Fn(1)3250 3721 y Fs(to)f(b)r(e)456 3871 y(classi\014ed.)64 b(In)n(tuitiv)n(ely)-7 b(,)39 b Fx(dbacl)e Fs(should)g(still)g(measure) f(ho)n(w)g(w)n(ell)h(the)g(string)f Fp(s)h Fs(\014ts)g(this)456 4020 y(single)27 b(category)-7 b(.)555 4169 y(One)25 b(p)r(ossible)g(approac)n(h)f(is)h(to)h(simply)f(output)h(the)g (probabilit)n(y)e(of)i Fp(s)f Fs(under)g(the)h(mo)r(del,)456 4319 y(i.e.)c Fm(P)635 4331 y Fl(C)690 4319 y Fs(\()p Fp(s)p Fs(\).)36 b(Ho)n(w)n(ev)n(er,)21 b(in)h(case)g(of)g(strings)f (consisting)g(of)h(more)f(than)h(a)g(few)g(c)n(haracters)e(only)-7 b(,)456 4468 y(this)20 b(is)f(v)n(ery)g(unlik)n(ely)g(to)h(b)r(e)g (useful,)i(since)e(b)n(y)f(the)h Fq(c)l(onc)l(entr)l(ation)j(of)g(me)l (asur)l(e)d Fs(phenomenon,)456 4618 y Fm(P)507 4630 y Fl(C)590 4618 y Fs(is)27 b(highly)h(concen)n(trated)e(around)h(the)h (string)f Fp(C)6 b Fs(,)28 b(lea)n(ving)e(essen)n(tially)h(zero)g (probabilit)n(y)456 4767 y(mass)f(for)i(most)f(other)g(t)n(yp)r(es)h (of)f(strings.)555 4917 y(It)33 b(is)f(p)r(ossible)g(to)g(factorize)f (the)i(output)g(score)e(as)h(a)f(pro)r(duct)i(of)f(the)h(do)r(cumen)n (t)f(com-)456 5066 y(plexit)n(y)f(\(i.e.)h(n)n(um)n(b)r(er)f(of)g (recognized)f(feature)h(tok)n(ens)f(in)i(the)f(do)r(cumen)n(t\),)i(and) e(the)h Fq(cr)l(oss)456 5216 y(entr)l(opy)23 b Fs(of)f(the)h(mo)r(del,) g(whic)n(h)g(measures)e(the)i(a)n(v)n(erage)c(n)n(um)n(b)r(er)j(of)h (bits)g(p)r(er)f(salien)n(t)g(feature)p eop end %%Page: 4 4 TeXDict begin 4 3 bop 456 251 a Fn(4)1245 b(L.A.)22 b(BREYER)456 450 y Fs(required,)i(if)g(w)n(e)g(compress)f(the)i(string)e Fp(s)h Fs(with)h(an)f(optimal)g(co)r(de)g(based)g(on)g(the)h (probabilit)n(y)456 600 y(measure)h Fm(P)830 612 y Fl(C)886 600 y Fs(.)37 b(The)27 b(details)h(are)e(describ)r(ed)i(in)g(Section)f (8.)555 749 y(A)41 b(re\014nemen)n(t)g(of)g(this)g(idea,)j(describ)r (ed)c(in)h(Section)g(9.3,)i(consists)d(in)i(outputting)f(a)456 898 y(con\014dence)25 b(in)g(the)h(n)n(ull)f(h)n(yp)r(othesis)g(that)g (the)h(do)r(cumen)n(t)g(b)r(elongs)e(to)h(the)h(category)-7 b(,)24 b(based)456 1048 y(on)i(the)h(observ)n(ed)e(v)-5 b(alue)27 b(of)g(the)g(score.)35 b(This)27 b(approac)n(h)d(w)n(orks)h (ev)n(en)i(when)f(there)h(is)g(only)f(a)456 1197 y(single)f(category)-7 b(.)35 b Fx(dbacl)26 b Fs(can)g(output)h(a)e(con\014dence)h(p)r(ercen)n (tage)f(related)h(to)g(the)g(empirical)456 1347 y(distribution)35 b(of)g(training)g(do)r(cumen)n(ts.)60 b(This)35 b(p)r(ercen)n(tage)f (is)h(high)g(when)h(the)f(do)r(cumen)n(t)456 1496 y(score)c(is)i(close) g(to)g(the)g(empirical)g(mo)r(del)g(scores,)g(and)g(lo)n(w)g(for)f(un)n (t)n(ypical)h(scores,)g(th)n(us)g(it)456 1646 y(can)27 b(b)r(e)h(view)n(ed)f(as)g(a)g(con\014dence)g(for)g Fq(ac)l(c)l(epting) i Fs(the)f(n)n(ull)g(h)n(yp)r(othesis.)555 1795 y(An)c(imp)r(ortan)n(t) e(prop)r(ert)n(y)g(of)h(this)g(con\014dence)g(v)-5 b(alue)22 b(is)h(that)g(it)h(is)e(uniformly)h(distributed)456 1944 y(when)29 b(the)g(n)n(ull)g(h)n(yp)r(othesis)g(applies)f(for)h(the)g (giv)n(en)f(do)r(cumen)n(t,)i(so)e(it)h(can)g(b)r(e)g(view)n(ed)g(as)f (a)456 2094 y Fq(p-value)c Fs(for)g(the)g(purp)r(ose)g(of)g(Fisher's)f Fp(\037)1756 2064 y Fn(2)1817 2094 y Fs(test.)36 b(This)24 b(test)h(allo)n(ws)d(an)i(easy)f(w)n(a)n(y)g(of)h(deciding)456 2243 y(whether)h(a)g(do)r(cumen)n(t)h(b)r(elongs)f(to)g(some)g (collection)g(of)h(categories:)33 b(Let)26 b Fp(p)2884 2255 y Fn(1)2921 2243 y Fp(;)14 b(:)g(:)g(:)g(;)g(p)3148 2255 y Fl(n)3218 2243 y Fs(b)r(e)26 b(the)456 2393 y(con\014dence)h(in) h(the)f(computed)h(score)e(for)h(categories)f Fp(C)2257 2405 y Fn(1)2294 2393 y Fp(;)14 b(:)g(:)g(:)g(;)g(C)2538 2405 y Fl(n)2611 2393 y Fs(resp)r(ectiv)n(ely)27 b(\(con)n(v)n(erted) 456 2542 y(to)37 b(a)h(real)e(n)n(um)n(b)r(er)i(in)g([0)p Fp(;)14 b Fs(1]\),)40 b(and)d(assume)g(that)i(the)f(mo)r(dels)f(for)h (eac)n(h)f(category)e(w)n(ere)456 2692 y(constructed)27 b(from)g(indep)r(enden)n(t)h(data,)g(then)g(b)n(y)f(Fisher's)g(theorem) 456 2910 y(\(2\))945 b Fp(Y)42 b Fs(=)23 b Fi(\000)p Fs(2)1844 2806 y Fl(n)1805 2831 y Fh(X)1811 3008 y Fl(i)p Fn(=1)1938 2910 y Fs(log)14 b Fp(p)2101 2922 y Fl(i)2152 2910 y Fi(\030)22 b Fp(\037)2291 2875 y Fn(2)2291 2930 y(2)p Fl(n)2370 2910 y Fp(;)456 3148 y Fs(and)37 b(the)i(resulting)e (quan)n(tit)n(y)h Fp(p)p Fs(\()p Fp(Y)19 b Fs(\))40 b(=)g Fm(P)p Fs(\()p Fp(\037)1929 3118 y Fn(2)1929 3169 y(2)p Fl(n)2048 3148 y Fi(\024)g Fp(Y)19 b Fs(\))38 b(measures)f(the)h (con\014dence)g(in)g(the)456 3298 y(v)-5 b(alidit)n(y)27 b(of)h(the)g(comp)r(ound)f(h)n(yp)r(othesis.)1286 3525 y(3.)41 b Fr(Digramic)32 b(reference)h(measure)555 3724 y Fs(F)-7 b(or)24 b(a)f(giv)n(en)h(text)g(corpus)f Fp(C)6 b Fs(,)25 b(the)g(core)e(of)h(the)h(mo)r(del)f(for)f Fp(C)31 b Fs(constructed)23 b(b)n(y)h Fx(dbacl)h Fs(is)f(a)456 3873 y(digramic)i(reference)h(measure)f Fp(R)1532 3885 y Fl(C)1616 3873 y Fs(on)h(tok)n(ens.)36 b(The)28 b(measure)e Fp(R)2579 3885 y Fl(C)2635 3873 y Fs(,)i(as)f(its)g(name)h(suggests,) 456 4023 y(is)h(de\014ned)g(in)h(terms)f(of)g(digrams,)f(i.e.)i(pairs)e (of)h(consecutiv)n(e)f Fq(char)l(acters)j Fs(app)r(earing)d(in)h Fp(C)6 b Fs(.)456 4172 y(This)22 b(measure)f(is)i(used)f(to)h(assign)e (a)h(baseline)g(probabilit)n(y)f(to)i(ev)n(ery)e(v)-5 b(alid)22 b(tok)n(en)g(\(c)n(haracter)456 4322 y(string\),)30 b(as)g(follo)n(ws:)41 b(if)30 b Fp(t)g Fs(is)g(a)g(tok)n(en)g(with)g(c) n(haracter)f(length)h Fp(k)s Fs(,)h(w)n(e)e(write)h Fp(t)e Fs(=)f Fp(t)3122 4291 y Fn(1)3159 4322 y Fp(t)3189 4291 y Fn(2)3240 4322 y Fp(:)14 b(:)g(:)g(t)3381 4291 y Fl(k)3421 4322 y Fs(,)456 4471 y(where)27 b(eac)n(h)f Fp(t)912 4441 y Fl(j)975 4471 y Fs(is)i(a)f(c)n(haracter.)35 b(Then)1157 4688 y Fp(R)1220 4700 y Fl(C)1276 4688 y Fs(\()p Fp(t)p Fs(\))24 b(=)e Fp(p)1523 4700 y Fl(C)1579 4688 y Fs(\()p Fi(\005)p Fp(;)14 b(t)1720 4654 y Fn(1)1757 4688 y Fs(\))1789 4596 y Fh(\020)1874 4584 y Fl(k)1840 4609 y Fh(Y)1839 4786 y Fl(i)p Fn(=1)1960 4688 y Fp(p)2002 4700 y Fl(C)2058 4688 y Fs(\()p Fp(t)2120 4654 y Fl(i)2148 4688 y Fp(;)g(t)2215 4654 y Fl(i)p Fn(+1)2326 4688 y Fs(\))2358 4596 y Fh(\021)2408 4688 y Fp(p)2450 4700 y Fl(C)2506 4688 y Fs(\()p Fp(t)2568 4654 y Fl(k)2609 4688 y Fp(;)g Fi(\005)p Fs(\))p Fp(;)456 4917 y Fs(where)27 b Fi(\005)g Fs(is)g(a)h(sym)n(b)r(ol)f(nev)n(er)f (app)r(earing)h(in)g(the)h(alphab)r(et.)555 5066 y(The)e(c)n(hoice)f (of)h(appropriate)f(conditional)g(probabilities)g Fp(p)2452 5078 y Fl(C)2508 5066 y Fs(\()p Fi(\001)p Fp(;)14 b Fi(\001)p Fs(\))27 b(is)f(a)f(problem)h(in)g(itself.)456 5216 y(Since)h(v)n (ersion)f(1.8,)h Fx(dbacl)h Fs(o\013ers)f(sev)n(eral)f(alternativ)n (es,)g(among)h(them)p eop end %%Page: 5 5 TeXDict begin 5 4 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)939 b(5)661 450 y Fi(\017)41 b Fq(Dirichlet)p Fs(:)j(The)30 b(conditional)g(probabilities)f Fp(p)2251 462 y Fl(C)2307 450 y Fs(\()p Fi(\001)p Fp(;)14 b Fi(\001)p Fs(\))31 b(are)e(estimated)h(from)g(a)g(hier-)744 600 y(arc)n(hical)c(Diric)n(hlet)i(mo)r(del)g(\(MacKa)n(y)e(and)h(P)n(eto,) g(1995\):)1448 809 y Fp(p)1490 821 y Fl(C)1546 809 y Fs(\()p Fp(u;)14 b(v)s Fs(\))23 b(=)1859 753 y(#\()p Fp(v)s Fi(j)p Fp(u)p Fs(\))c(+)f Fp(\013\026)p Fs(\()p Fp(v)s Fs(\))p 1859 790 561 4 v 1871 804 a Fh(P)1958 891 y Fl(r)2008 866 y Fs(#\()p Fp(r)r Fi(j)p Fp(u)p Fs(\))i(+)e Fp(\013)2429 809 y(;)744 1019 y Fs(where)29 b Fp(\026)g Fs(is)g(a)g(probabilit)n(y)f(measure)g(and)h Fp(\013)d(>)g Fs(0,)j(represen)n(ting)e(the)j(maxim)n(um)f(a)744 1169 y(p)r(osteriori)g(estimate)i(of)f(the)g(Diric)n(hlet)h(parameters,)e (and)h(#\()p Fp(r)r Fi(j)p Fp(u)p Fs(\))i(is)e(the)h(n)n(um)n(b)r(er) 744 1318 y(of)41 b(times)g(c)n(haracter)e Fp(r)k Fs(o)r(ccurs)d(in)h Fp(C)47 b Fs(immediately)41 b(preceded)f(b)n(y)g(c)n(haracter)f Fp(v)s Fs(.)744 1468 y(The)c(pro)r(cedure)e(for)g(estimating)h Fp(\013)h Fs(and)f Fp(\026)g Fs(follo)n(ws)f(the)i(approac)n(h)d(tak)n (en)i(in)g(the)744 1617 y(previously)27 b(men)n(tioned)g(pap)r(er.)661 1767 y Fi(\017)41 b Fq(Maxent)p Fs(:)68 b(The)43 b(conditionals)f(are)g (computed)h(b)n(y)f(maximizing)h(en)n(trop)n(y)-7 b(.)82 b(This)744 1916 y(metho)r(d)33 b(is)g(virtually)e(iden)n(tical)h(to)h (that)f(discussed)g(in)h(later)f(sections,)h(replacing)744 2065 y(tok)n(ens)27 b(with)h(digrams,)f(so)g(w)n(on't)g(b)r(e)h (detailed)f(here.)661 2215 y Fi(\017)41 b Fq(Uniform)p Fs(:)d(The)28 b(conditionals)e(are)h(c)n(hosen)g(uniformly)-7 b(,)27 b(i.e.)1423 2425 y Fp(p)1465 2437 y Fl(C)1521 2425 y Fs(\()p Fp(u;)14 b(v)s Fs(\))23 b(=)g(1)p Fp(=)14 b Fi(j)o Fs(alphab)r(et)27 b(size)p Fi(j)14 b Fp(:)744 2635 y Fs(While)27 b(the)f(resulting)g(reference)f(measure)g(do)r (esn't)h(dep)r(end)h(on)e(the)i(data)e(at)h(all,)g(it)744 2784 y(has)j(some)f(in)n(teresting)h(prop)r(erties)f(in)h(practice:)39 b(Firstly)-7 b(,)29 b(it)h(do)r(esn't)f(bias)g Fq(against)744 2934 y Fs(nonsensical)e(tok)n(ens,)g(whic)n(h)h(are)f(often)i(delib)r (erately)e(inserted)h(in)g(junk)h(mail,)f(and)744 3083 y(secondly)-7 b(,)23 b(when)f(used)g(consisten)n(tly)g(for)f(all)h(mo)r (dels,)h(it)g(automatically)e Fq(limits)i Fs(clas-)744 3233 y(si\014cations)e(within)h(the)g(v)n(o)r(cabulary)d(app)r(earing)i (in)h(the)f(training)g(corp)r(ora,)g(b)r(ecause)744 3382 y(an)n(y)27 b(unkno)n(wn)g(tok)n(ens)g(obtain)g(the)h(same)f(reference) g(measure)g(in)g(all)h(mo)r(dels.)555 3552 y(There)f(are)g(t)n(w)n(o)g (further)g(p)r(oin)n(ts)h(w)n(orth)f(men)n(tioning)g(brie\015y:)661 3721 y Fi(\017)41 b Fs(By)20 b(design,)i Fx(dbacl)e Fs(ignores)f(all)h (digrams)f(app)r(earing)g Fq(outside)i Fs(an)n(y)f(v)-5 b(alid)20 b(tok)n(ens)g(\(w)n(e)744 3871 y(de\014ne)31 b(tok)n(ens)e(later\).)45 b(Including)31 b(coun)n(ts)f(for)f(these)i (extra)e(digrams)g(w)n(ould)h(sk)n(ew)744 4020 y(classi\014cation,)25 b(since)h(the)g(extra)f(digrams)f(represen)n(t)h(essen)n(tially)g (formatting)g(data)744 4169 y(in)k(the)h(text)f(corpus)f Fp(C)6 b Fs(.)40 b(The)29 b(sp)r(ecial)g(sym)n(b)r(ol)f Fi(\005)g Fs(is)h(used)g(to)f(mark)g(the)i(b)r(eginning)744 4319 y(and)f(end)g(of)g(tok)n(en,)g(and)f(has)h(the)g(e\013ect)g(of)g (in)n(tro)r(ducing)g(a)f(natural)g(tok)n(en)g(length)744 4468 y(in)g Fp(R)904 4480 y Fl(C)960 4468 y Fs(.)661 4618 y Fi(\017)41 b Fs(In)31 b(in)n(ternational)f(lo)r(cales,)h(c)n (haracter)e(sets)h(can)h(b)r(e)g(essen)n(tially)f(arbitrarily)f(large.) 744 4767 y(Consequen)n(tly)-7 b(,)25 b(the)f(p)r(oten)n(tial)h(n)n(um)n (b)r(er)f(of)g(digrams)f(is)i(un)n(b)r(ounded.)36 b Fx(dbacl)25 b Fs(cop)r(es)744 4917 y(with)e(this)g(b)n(y)f(alw)n(a)n(ys)e (calculating)i Fp(R)1933 4929 y Fl(C)2011 4917 y Fs(in)g(terms)g(of)h Fq(unibyte)f Fs(digrams,)g(rather)f(than)744 5066 y(\(strictly)32 b(sp)r(eaking\))f Fq(char)l(acter)i Fs(digrams.)49 b(Th)n(us)31 b(there)h(are)e(at)i(most)g(\(256\))3247 5036 y Fn(2)3315 5066 y Fs(dis-)744 5216 y(tinct)c(digrams,)d(and)h(the)h(conditional)f (probabilities)g Fp(p)2525 5228 y Fl(C)2580 5216 y Fs(\()p Fi(\001)p Fp(;)14 b Fi(\001)p Fs(\))27 b(ma)n(y)f(or)g(ma)n(y)g(not)g (b)r(e)p eop end %%Page: 6 6 TeXDict begin 6 5 bop 456 251 a Fn(6)1245 b(L.A.)22 b(BREYER)744 450 y Fs(in)n(terpretable)32 b(as)f(go)n(v)n(erning)f(c)n(haracter)g (transitions,)i(dep)r(ending)h(on)f(the)g(c)n(hosen)744 600 y(c)n(haracter)24 b(set)i(\(in)g(lo)r(cales)f(where)g(c)n (haracters)e(require)i(a)g(single)g(b)n(yte,)h(the)g(distinc-)744 749 y(tion)i(is)f(mo)r(ot\).)844 898 y(Wide)39 b(c)n(haracter)e(sets,) 42 b(whic)n(h)d(enco)r(de)f(eac)n(h)g(p)r(ossible)h(c)n(haracter)e(as)h (a)g(\014xed)744 1048 y(width)j(sequence)e(of)h(b)n(ytes,)i(p)r(ose)e (an)f(information)g(loss)g(problem,)j(since)e(man)n(y)744 1197 y(c)n(haracters)c(are)h(enco)r(ded)h(with)g(trailing)g(NUL)g(b)n (ytes.)68 b(This)38 b(mak)n(es)f(the)h(lo)r(cale)744 1347 y(c)n(haracters)29 b(under)i(the)g Fp(R)1591 1359 y Fl(C)1678 1347 y Fs(measure)e(essen)n(tially)h(i.i.d.,)i(with)g(a)e (consequen)n(t)g(loss)744 1496 y(of)38 b(mo)r(delling)h(information.)67 b(The)39 b(resp)r(onsibilit)n(y)e(for)h(using)f(an)h(\\informativ)n(e") 744 1646 y(c)n(haracter)27 b(set)i(is)f(th)n(us)h(relegated)f(to)g(the) i(user,)e(who)h(should)f(use)h(a)f(corpus)g(repre-)744 1795 y(sen)n(ted)g(in)g(a)f(suitable)g(m)n(ultib)n(yte)h(c)n(haracter)e (set.)555 1984 y(It)j(is)f(easy)f(to)h(see)g(that)g(the)h(measure)e Fp(R)1861 1996 y Fl(C)1945 1984 y Fs(has)g(unit)i(mass)e(on)h(all)g (tok)n(ens.)38 b(Since)28 b Fi(\005)g Fs(do)r(es)456 2133 y(not)22 b(app)r(ear)g(inside)g(the)h(string)f Fp(t)p Fs(,)i(w)n(e)e(can)g(iden)n(tify)h Fp(R)2168 2145 y Fl(C)2247 2133 y Fs(with)g(the)g(la)n(w)f(of)g(an)g(excursion)g(from)456 2282 y Fi(\005)j Fs(for)h(the)h(mark)n(o)n(v)d(c)n(hain)h(with)i (transition)e(probabilities)h Fp(p)2384 2294 y Fl(C)2439 2282 y Fs(\()p Fp(x;)14 b(y)s Fs(\).)37 b(Since)27 b(the)f(state)g (space)456 2432 y(is)k(\014nite,)h(and)f(there)f(are)g(no)h(absorbing)e (states,)j(the)f(length)g(of)g(eac)n(h)f(excursion)g(is)h(almost)456 2581 y(surely)c(\014nite,)j(whic)n(h)e(giv)n(es)1375 2519 y Fh(P)1462 2606 y Fl(t)1505 2581 y Fp(R)1568 2593 y Fl(C)1624 2581 y Fs(\()p Fp(t)p Fs(\))d(=)e(1.)1052 2924 y(4.)42 b Fr(Document)31 b(represent)-6 b(a)g(tion)33 b(and)e(fea)-6 b(tures)555 3123 y Fs(When)38 b Fx(dbacl)g Fs(is)g(giv)n(en)e(a)h(text)h(corpus)e Fp(C)44 b Fs(to)38 b(learn,)h(it)f(treats)e(the)i(input)g(as)f(a)g(long)456 3273 y(c)n(haracter)g(string)h(and)h(builds)g(the)h(reference)e (measure)g Fp(R)2419 3285 y Fl(C)2475 3273 y Fs(.)71 b(T)-7 b(o)39 b(obtain)g(sophisticated)456 3422 y(corpus)33 b(mo)r(del)i(probabilities)e(ho)n(w)n(ev)n(er,)h(this)h(stream)e(of)i (c)n(haracters)d(m)n(ust)i(b)r(e)h(con)n(v)n(erted)456 3572 y(in)n(to)20 b(tok)n(ens.)33 b(T)-7 b(o)20 b(cop)r(e)h(with)f (large)f(text)i(corp)r(ora,)f(this)h(tok)n(enization)e(should)h(b)r(e)h (compatible)456 3721 y(with)28 b(a)f(single)g(pass)g(through)g(the)h (data.)555 3871 y(In)33 b(the)h Fq(default)h(mo)l(del)p Fs(,)g(non-alphab)r(etic)e(c)n(haracters)d(are)i(ignored)g(and)g(what)h (is)g(left)h(is)456 4020 y(a)29 b(sequence)g(of)g(alphab)r(etic)h(w)n (ord/tok)n(ens)d(con)n(v)n(erted)h(to)h(lo)n(w)n(er)f(case.)42 b(Th)n(us)29 b(w)n(e)h(can)f(write)456 4169 y(formally)d Fp(C)k Fs(=)22 b(\()p Fp(t)1021 4181 y Fn(1)1059 4169 y Fp(;)14 b(:)g(:)g(:)f(;)h(t)1273 4181 y Fl(n)1318 4169 y Fs(\),)28 b(where)g(eac)n(h)e Fp(t)1858 4181 y Fl(i)1914 4169 y Fs(is)h(a)g(w)n(ord/tok)n(en.)555 4319 y(The)39 b(default)g(mo)r(del)g(has)f(sev)n(eral)f(limitations)h(whic)n(h)h (arise)e(out)i(of)g(the)g(w)n(ord/tok)n(en)456 4468 y(represen)n (tation)31 b(of)h Fp(C)6 b Fs(.)53 b(F)-7 b(or)32 b(example,)i(w)n (ord/tok)n(ens)c(cannot)j(o)n(v)n(erlap,)f(whic)n(h)g(mak)n(es)g(the) 456 4618 y(construction)25 b(of)i Fp(n)p Fs(-gram)e(w)n(ord)g(mo)r (dels)h(programmatically)e(tedious.)37 b(A)26 b(b)r(etter)h(approac)n (h)456 4767 y(is)g(through)g(the)h(use)f(of)h(features.)555 4917 y Fq(A)34 b(fe)l(atur)l(e)e Fs(is)f(a)h(function)h Fp(f)40 b Fs(whic)n(h,)33 b(giv)n(en)e(a)h(string)f(of)h(c)n(haracters) e Fp(s)p Fs(,)j(returns)e(a)h(v)-5 b(alue)456 5066 y Fp(f)9 b Fs(\()p Fp(s)p Fs(\))23 b Fi(2)g(f)p Fs(0)p Fp(;)14 b Fs(1)p Fp(;)g Fs(2)p Fp(;)g(:)g(:)g(:)e Fi(g)p Fs(.)33 b(T)n(ypically)-7 b(,)19 b Fp(f)27 b Fs(will)19 b(simply)f(coun)n(t)h(the)f(n)n(um)n(b)r(er)g(of)h(times)f(a)g(w)n (ord/tok)n(en)456 5216 y Fp(t)25 b Fs(o)r(ccurs)g(in)h Fp(s)p Fs(,)h(written)e Fp(f)1279 5228 y Fl(t)1308 5216 y Fs(\()p Fp(s)p Fs(\).)37 b(Ho)n(w)n(ev)n(er,)24 b(features)i(can)f(b) r(e)h(more)f(general,)g(and)h Fx(dbacl)g Fs(can)p eop end %%Page: 7 7 TeXDict begin 7 6 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)939 b(7)456 450 y Fs(de\014ne)39 b(features)g(in)h(terms)f (of)g(regular)f(expressions.)71 b(Most)39 b(imp)r(ortan)n(tly)-7 b(,)42 b(features)d(can)456 600 y Fq(overlap)p Fs(.)555 749 y(T)-7 b(o)31 b(in)n(tro)r(duce)f(the)h(de\014nition)g(of)g(a)f (tok)n(en)h(asso)r(ciated)e(with)i(a)g(feature,)g(supp)r(ose)f(giv)n (en)456 898 y(a)e(\014nite)h(set)f Fp(G)h Fs(of)f(regular)f (expressions.)38 b(F)-7 b(or)27 b(our)h(purp)r(oses,)g(w)n(e)g(shall)g (b)r(e)h(in)n(terested)f(only)456 1048 y(in)d(expressions)e(whic)n(h)i (tag)f(one)h(or)f(more)g(sub)r(expressions.)35 b(Th)n(us)25 b(eac)n(h)f(regular)f(expression)456 1197 y Fp(g)i Fi(2)f Fp(G)k Fs(acts)f(on)g(an)g(arbitrary)f(string)h Fp(s)g Fs(as)g(follo)n(ws:)790 1480 y Fp(g)s Fs(\()p Fp(s)p Fs(\))d(=)1047 1285 y Fh(8)1047 1360 y(>)1047 1385 y(<)1047 1534 y(>)1047 1559 y(:)1121 1406 y Fs(\()p Fp(s)1192 1418 y Fn(1)1229 1406 y Fp(;)14 b(:)g(:)g(:)g(;)g(s)1453 1418 y Fl(g)1492 1406 y Fs(\))83 b(if)28 b Fp(s)g Fs(matc)n(hes)f Fp(g)j Fs(and)d Fp(s)2341 1418 y Fn(1)2378 1406 y Fp(;)14 b(:)g(:)g(:)g(;)g(s)2602 1418 y Fl(g)2668 1406 y Fs(w)n(ere)27 b(tagged)1121 1585 y Fi(;)444 b Fs(if)28 b Fp(s)g Fs(do)r(es)f(not)g (matc)n(h)h Fp(g)456 1763 y Fs(In)h(the)i(de\014nition)f(b)r(elo)n(w,)g (w)n(e)f(also)g(use)g(the)h(string)f(concatenation)g(op)r(erator)f Ff(cat)o Fs(,)i(i.e.)g(w)n(e)456 1912 y(ha)n(v)n(e)c Ff(cat)o Fs(\()p Fp(s)849 1924 y Fn(1)886 1912 y Fp(;)14 b(s)962 1924 y Fn(2)999 1912 y Fp(;)g(:)g(:)g(:)g(;)g(s)1223 1924 y Fl(n)1268 1912 y Fs(\))23 b(=)g Fp(s)1450 1924 y Fn(1)1505 1912 y Fi(\005)18 b Fp(s)1604 1924 y Fn(2)1660 1912 y Fi(\005)g(\001)c(\001)g(\001)k(\005)g Fp(s)1934 1924 y Fl(n)1979 1912 y Fs(.)456 2140 y Fx(De\014nition)29 b(1.)40 b Fq(L)l(et)29 b Fp(G)g Fq(b)l(e)g(a)g(\014nite)f(set)h(of)g(r) l(e)l(gular)g(expr)l(essions.)39 b(A)29 b Fs(tok)n(en)f Fp(t)g Fq(is)i(a)f(string)g(of)456 2289 y(the)g(form)h Fp(t)23 b Fs(=)g Ff(cat)16 b Fi(\016)h Fp(g)s Fs(\()p Fp(s)p Fs(\))p Fq(,)30 b(for)g(some)g(string)f Fp(s)g Fq(and)h(some)g Fp(g)25 b Fi(2)f Fp(G)p Fq(.)39 b(The)30 b Fs(feature)f Fq(asso)l(ciate)l(d)456 2439 y(with)h Fp(t)g Fq(is)g(the)g(function)f Fp(f)j Fs(=)23 b Fp(f)1451 2451 y Fl(t)1509 2439 y Fq(de\014ne)l(d)30 b(by)539 2684 y Fp(f)580 2696 y Fl(t)609 2684 y Fs(\()p Fp(s)p Fs(\))23 b(=)g(max)977 2617 y Fh(\010)1026 2684 y Fp(k)j Fs(:)d Fq(ther)l(e)30 b(exist)f(distinct)h(minimal)h(substrings)e Fp(u)2600 2696 y Fn(1)2637 2684 y Fp(;)14 b(:)g(:)g(:)f(;)h(u)2869 2696 y Fl(k)2939 2684 y Fq(of)31 b Fp(s)p Fq(,)1689 2871 y(such)f(that)g Ff(cat)17 b Fi(\016)h Fp(g)s Fs(\()p Fp(u)2380 2883 y Fl(j)2414 2871 y Fs(\))24 b(=)e Fp(t)30 b Fq(for)h(al)t(l)f Fp(j)e Fs(=)23 b(1)p Fp(;)14 b(:)g(:)g(:)f(;)h(k) 3290 2803 y Fh(\011)3338 2871 y Fp(:)456 3078 y Fq(A)35 b(fe)l(atur)l(e)g Fp(f)872 3090 y Fl(t)937 3078 y Fq(thus)g(c)l(ounts)g (the)g(numb)l(er)g(of)i(disjoint)g(o)l(c)l(curr)l(enc)l(es)e(of)h(the)g (token)g Fp(t)f Fq(in)h(the)456 3228 y(string)22 b Fp(s)p Fq(.)36 b(The)23 b(set)f(of)h(al)t(l)g(fe)l(atur)l(es)f(of)h Fp(s)f Fq(is)h(written)f Fi(F)8 b Fs(\()p Fp(s)p Fs(\))p Fq(.)36 b(We)23 b(also)g(write)g Fi(F)8 b Fs(\()p Fp(G)p Fs(\))23 b(=)g Fi([fF)8 b Fs(\()p Fp(s)p Fs(\))23 b(:)456 3377 y Fp(s)29 b Fq(a)h(string)p Fi(g)p Fq(.)555 3605 y Fs(The)e Fq(default)i(mo)l(del)f Fs(of)f Fx(dbacl)g Fs(is)f(obtained)h(b)n(y)f(taking)456 3812 y(\(3\))282 b Fp(G)23 b Fs(=)g Fi(f)p Ff("[^[:alpha:]])p Fs(\()p Ff([[:)o(al)o(ph)o(a:])o(]+)o Fs(\))p Ff(")-6 b Fp(;)14 b Ff("^)p Fs(\()p Ff([[:alpha:]]+)p Fs(\))p Ff(")-5 b Fi(g)456 4020 y Fs(whic)n(h)24 b(giv)n(es)f(tok)n(ens)h(represen)n(ted) f(b)n(y)h(alphab)r(etic)g(substrings)f(only)h(\(mo)r(dulo)h(the)g(fact) f(that)456 4169 y(tok)n(ens)i(are)h(also)f(con)n(v)n(erted)h(to)g(lo)n (w)n(ercase\).)555 4319 y(A)n(t)j(this)f(p)r(oin)n(t,)h(it)g(mak)n(es)e (sense)h(to)h(in)n(tro)r(duce)e(the)i(notion)f(of)g Fq(admissible)34 b(string)p Fs(,)c(since)456 4468 y(classi\014cation)f(will)i(dep)r(end) g(only)f(on)h(comparing)e(features)h(of)h(ordinary)e(strings.)45 b(The)30 b(set)456 4618 y(of)25 b(admissible)g(strings)f(can)h (e\013ectiv)n(ely)g(b)r(e)g(en)n(umerated)g(b)n(y)g(listing)g(the)h(v) -5 b(alues)25 b Fi(f)p Fp(f)9 b Fs(\()p Fp(s)p Fs(\))22 b(:)h Fp(f)32 b Fi(2)456 4767 y(F)8 b Fs(\()p Fp(G)p Fs(\))p Fi(g)p Fs(.)555 4917 y(Also,)29 b(to)g(compare)f(di\013eren)n (t)h(text)g(do)r(cumen)n(ts,)h(w)n(e)e(shall)h(consider)f(them)h(as)f (v)n(ery)g(long)456 5066 y(admissible)c(strings.)35 b(Ho)n(w)n(ev)n (er,)23 b(it)h(is)h(di\016cult)g(to)f(compare)f(strings)h(of)g(v)n(ery) f(di\013eren)n(t)i(sizes.)456 5216 y(A)j(training)f(corpus)f(migh)n(t)i (con)n(tain)f(millions)h(of)g(c)n(haracters,)d(while)j(the)g(future)g (text)g(to)g(b)r(e)p eop end %%Page: 8 8 TeXDict begin 8 7 bop 456 251 a Fn(8)1245 b(L.A.)22 b(BREYER)456 450 y Fs(classi\014ed)31 b(ma)n(y)h(only)g(con)n(tain)f(h)n(undreds.)51 b(Moreo)n(v)n(er,)30 b(since)i(the)h(strings)f(are)f(admissible,)456 600 y(they)38 b(ma)n(y)g(con)n(tain)g(sections)g(of)h(irrelev)-5 b(an)n(t)38 b(c)n(haracters,)h(whic)n(h)f(do)h(not)g(app)r(ear)e(in)i (an)n(y)456 749 y(tok)n(en.)d(Th)n(us)27 b(w)n(e)g(also)g(need)h(a)f (notion)g(of)h(complexit)n(y)-7 b(.)456 951 y Fx(De\014nition)39 b(2.)44 b Fq(Consider)38 b(the)f(e)l(quivalenc)l(e)g(r)l(elation)g Fi(\030)e Fq(on)i(strings)f(given)g(by)h Fp(s)e Fi(\030)f Fp(s)3334 921 y Fg(0)3393 951 y Fq(if)456 1101 y(and)41 b(only)g(if)h Fp(f)9 b Fs(\()p Fp(s)p Fs(\))43 b(=)f Fp(f)9 b Fs(\()p Fp(s)1335 1071 y Fg(0)1358 1101 y Fs(\))41 b Fq(for)h(al)t(l)g Fp(f)51 b Fi(2)43 b(F)8 b Fs(\()p Fp(G)p Fs(\))p Fq(.)73 b(Each)42 b(e)l(quivalenc)l(e)f(class)h(is)f(c)l (al)t(le)l(d)h(a)456 1250 y Fp(G)p Fs(-admissible)29 b Fq(string.)38 b(The)31 b Fp(G)p Fs(-complexit)n(y)e Fq(of)i(a)f Fp(G)p Fq(-admissible)i(string)d Fp(s)h Fq(is)g(de\014ne)l (d)g(as)1575 1452 y Fp(\037)1627 1464 y Fl(G)1683 1452 y Fs(\()p Fp(s)p Fs(\))23 b(=)1956 1373 y Fh(X)1897 1555 y Fl(f)7 b Fg(2)p Fl(F)i Fn(\()p Fl(G)p Fn(\))2149 1452 y Fp(f)g Fs(\()p Fp(s)p Fs(\))p Fp(:)555 1697 y Fs(When)27 b(the)g(set)f Fp(G)h Fs(is)f(understo)r(o)r(d,)h(w)n(e)f(will)g(drop)g (the)h Fp(G)p Fs(-pre\014x.)36 b(T)-7 b(o)26 b(p)r(erform)g(a)g (calcula-)456 1846 y(tion)h(later,)g(w)n(e)g(will)h(need)g(the)g(follo) n(wing)f(assumption)g(on)g Fp(G)p Fs(:)456 2049 y Fx(De\014nition)33 b(3.)42 b Fq(The)33 b(set)e(of)i(r)l(e)l(gular)e(expr)l(essions)i Fp(G)f Fq(is)g Fs(simple)f Fq(if)i(ther)l(e)f(exist)f(admissible)456 2198 y(strings)e(which)i(exhibit)g(every)g(c)l(ombination)g(of)f(fe)l (atur)l(e)g(c)l(ounts.)555 2400 y Fs(It)39 b(is)f(easy)f(to)h(see)g (that)h(simple)f(sets)g Fp(G)h Fs(exist.)69 b(F)-7 b(or)37 b(example,)k(if)e Fp(G)f Fs(matc)n(hes)g(single)456 2550 y(c)n(haracters)d(only)-7 b(,)40 b(then)e(a)f(string)g(of)h(complexit)n (y)f Fp(k)k Fs(has)c(exactly)g Fp(k)j Fs(c)n(haracters,)e(and)g(b)n(y) 456 2699 y(iden)n(tifying)24 b(the)h(p)r(erm)n(utations,)g(w)n(e)f (obtain)h(all)f(admissible)g(strings)g(of)h(complexit)n(y)f Fp(k)s Fs(.)35 b(The)456 2849 y Fq(default)f(mo)l(del)f Fs(is)f(another)f(example)g(of)h(a)f(simple)h(set)g Fp(G)p Fs(.)50 b(Ho)n(w)n(ev)n(er,)31 b Fp(n)p Fs(-gram)f(mo)r(dels)i(for)456 2998 y Fp(n)22 b(>)h Fs(1)k(do)h(not)f(arise)g(from)g(a)g(simple)h(set) f Fp(G)p Fs(.)555 3148 y(F)-7 b(or)24 b(admissible)g(strings,)g(the)g (reference)g(measure)f Fp(R)2257 3160 y Fl(C)2337 3148 y Fs(induces)h(a)g(natural)f Fp(\033)s Fs(-\014nite)i(mea-)456 3297 y(sure)35 b Fm(R)700 3309 y Fl(C)791 3297 y Fs(on)h(the)g(set)f (of)h(all)g(admissible)f(strings,)i(as)e(follo)n(ws:)52 b(if)36 b Fp(f)45 b Fs(=)36 b Fp(f)2885 3309 y Fl(t)2950 3297 y Fs(is)g(the)g(feature)456 3447 y(corresp)r(onding)26 b(to)j(a)g(tok)n(en)f Fp(t)p Fs(,)h(w)n(e)f(shall)h(\(ab\)use)g (notation)f(and)h(write)2798 3414 y Fn(1)2860 3447 y Fp(R)2923 3459 y Fl(C)2979 3447 y Fs(\()p Fp(f)9 b Fs(\))25 b(=)g Fp(R)3271 3459 y Fl(C)3327 3447 y Fs(\()p Fp(t)p Fs(\).)456 3596 y(Then)i(if)h Fp(s)g Fs(is)g(admissible,)456 3798 y(\(4\))710 b Fm(R)1332 3810 y Fl(C)1388 3798 y Fs(\()p Fp(s)p Fs(\))24 b(=)e Fp(\037)p Fs(\()p Fp(s)p Fs(\)!)1862 3719 y Fh(Y)1794 3901 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)p Fn(\))2126 3742 y Fs(1)p 2059 3779 177 4 v 2059 3855 a Fp(f)j Fs(\()p Fp(s)p Fs(\)!)2245 3798 y Fp(R)2308 3810 y Fl(C)2364 3798 y Fs(\()p Fp(f)g Fs(\))2478 3763 y Fl(f)e Fn(\()p Fl(s)p Fn(\))2605 3798 y Fp(:)456 4042 y Fs(This)27 b(measure)g(is)g(not)h(a)f(probabilit)n(y)-7 b(.)36 b(Ho)n(w)n(ev)n(er,)25 b(for)i(a)h(giv)n(en)e(complexit)n(y)h Fp(k)k Fs(and)c(a)g Fq(simple)456 4191 y Fs(set)37 b Fp(G)p Fs(,)j(the)d(set)h(of)f(all)g(admissible)g(strings)f Fp(s)h Fs(with)h Fp(\037)p Fs(\()p Fp(s)p Fs(\))h(=)g Fp(k)h Fs(has)d(unit)h Fm(R)2993 4203 y Fl(C)3049 4191 y Fs(-mass,)g(due)456 4341 y(to)562 4279 y Fh(P)650 4366 y Fl(f)707 4341 y Fp(R)770 4353 y Fl(C)825 4341 y Fs(\()p Fp(f)9 b Fs(\))32 b(=)f(1.)52 b(Th)n(us)32 b(it)h(can)f(b)r(e)h(view)n (ed)f(as)g(a)h(family)f(of)h(m)n(ultinomial)g(probabilit)n(y)456 4490 y(distributions,)27 b(indexed)h(b)n(y)f(complexit)n(y)-7 b(.)555 4640 y(In)32 b(the)f Fq(default)k(mo)l(del)d Fs(used)f(b)n(y)g Fx(dbacl)p Fs(,)i(the)f(measure)e Fm(R)2447 4652 y Fl(C)2534 4640 y Fs(has)h(a)g(straigh)n(tforw)n(ard)e(in-)456 4789 y(terpretation.)75 b(Since)41 b(tok)n(ens)e(are)h(lo)n(w)n(er)f (case)h(alphab)r(etic)g(substrings)g(of)h Fp(s)p Fs(,)j(separated)p 456 4863 499 4 v 555 4937 a Fn(1)588 4962 y Fw(Pro)n(vided)24 b(w)n(e)g(restrict)f(ourselv)n(es)h(only)f(to)h(features)g(of)f(the)i (form)d Ft(f)2440 4970 y Fe(t)2491 4962 y Fw(for)h(some)g Ft(t)p Fw(,)h(this)f(notation)i(essen-)456 5087 y(tially)i(sets)h(up)h (a)f(bijectiv)n(e)g(corresp)r(ondence)i(b)r(et)n(w)n(een)g Ft(f)2046 5095 y Fe(t)2101 5087 y Fw(and)f Ft(t)p Fw(,)g(suc)n(h)f (that)i(the)e(measure)g Ft(R)3095 5098 y Fe(C)3147 5087 y Fw(\()p Ft(f)7 b Fw(\))29 b(is)e(the)456 5211 y(image)c(of)h Ft(R)793 5222 y Fe(C)845 5211 y Fw(\()p Ft(t)p Fw(\).)p eop end %%Page: 9 9 TeXDict begin 9 8 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)939 b(9)456 450 y Fs(b)n(y)31 b(non-alphab)r(etic)g(c)n (haracters,)g Fm(R)1628 462 y Fl(C)1716 450 y Fs(is)g(the)i(image,)f (under)f(the)i(equiv)-5 b(alence)31 b(relation)g Fi(\030)p Fs(,)456 600 y(of)k(the)g(la)n(w)f(of)h(a)g(Mark)n(o)n(v)d(c)n(hain)j (on)f(the)i(c)n(haracters)c(of)j(a)g(lo)n(w)n(er)e(case)h(string,)i (where)f(all)456 749 y(non-alphab)r(etic)j(c)n(haracters)e(are)i (amalgamated)f(in)n(to)i(a)f(single)g(arti\014cial)g(state)h Fi(\005)p Fs(.)69 b(The)456 898 y(complexit)n(y)27 b(of)g Fp(s)h Fs(is)f(the)h(n)n(um)n(b)r(er)g(of)f(excursions)f(from)i Fi(\005)p Fs(,)f(and)g(its)h(initial)g(v)-5 b(alue)27 b(is)h Fi(\005)p Fs(.)555 1048 y(With)h(more)d(general)h(t)n(yp)r(es)g (of)h(tok)n(ens,)f(the)h(measure)e Fm(R)2386 1060 y Fl(C)2470 1048 y Fs(is)h(not)h(so)f(easy)f(to)i(in)n(terpret.)1149 1328 y(5.)41 b Fr(Maximum)31 b(Entr)n(opy:)41 b(the)31 b(simple)h(case)555 1528 y Fs(Let)i Fp(G)f Fs(b)r(e)h(a)f Fq(simple)h Fs(set)f(of)g(regular)f(expressions.)52 b(Giv)n(en)33 b(a)g(corpus)f Fp(C)6 b Fs(,)35 b(the)f(digramic)456 1677 y(reference)f(measure)h Fp(R)1205 1689 y Fl(C)1296 1677 y Fs(is)h(\014rst)f(computed,)j(as)d(describ)r(ed)h(in)g(an)f (earlier)f(section.)59 b(This)456 1827 y(measure)23 b(is)i(imp)r(ortan) n(t,)g(since)f(the)i(input)f(corpus)f Fp(C)31 b Fs(ma)n(y)24 b(not)h(con)n(tain)f(all)g(p)r(ossible)g(tok)n(ens)456 1976 y(whic)n(h)36 b Fx(dbacl)h Fs(will)g(b)r(e)g(exp)r(osed)f(to)h(in) f(later)g(use.)64 b(Ho)n(w)n(ev)n(er,)37 b(for)f(a)g(giv)n(en)g(tok)n (en)g Fp(t)p Fs(,)j(the)456 2125 y(probabilit)n(y)27 b Fp(R)944 2137 y Fl(C)999 2125 y Fs(\()p Fp(t)p Fs(\))i(can)f(alw)n(a) n(ys)e(b)r(e)i(calculated.)38 b(Th)n(us)27 b(b)n(y)h(incorp)r(orating)e Fp(R)2984 2137 y Fl(C)3040 2125 y Fs(,)i(w)n(e)g(obtain)456 2275 y(automatically)e(a)h(form)h(of)f(text)h Fq(smo)l(othing)h Fs(\(Zhai)e(and)g(La\013ert)n(y)-7 b(,)27 b(2001\).)555 2424 y(Viewing)e(the)g(corpus)e Fp(C)31 b Fs(as)24 b(a)g(single)g (admissible)g(string)g(with)h(complexit)n(y)f Fp(\037)p Fs(\()p Fp(C)6 b Fs(\),)26 b Fx(dbacl)456 2574 y Fs(computes)34 b(the)i(Maxim)n(um)f(\(Relativ)n(e\))g(En)n(trop)n(y)e(probabilit)n(y)h Fm(P)2593 2586 y Fl(C)2648 2574 y Fs(,)j(with)f(resp)r(ect)f(to)g Fm(R)3366 2586 y Fl(C)3421 2574 y Fs(,)456 2723 y(sub)5 b(ject)38 b(to)h(constrain)n(ts)e(on)i(the)g(mean)f(v)-5 b(alues)38 b(of)h(in)n(teresting)f(features.)69 b(The)39 b(solution)456 2873 y Fm(P)507 2885 y Fl(C)591 2873 y Fs(is)28 b(th)n(us)g(a)g(mem)n(b)r(er)h(of)f(the)h(con)n(v)n(ex)e(set)h (of)h(probabilities)e(\(on)h(admissible)g(strings)g(with)456 3022 y(complexit)n(y)f Fp(\037)p Fs(\()p Fp(C)6 b Fs(\)\))456 3256 y(\(5\))711 b(\005)1335 3268 y Fl(C)1414 3256 y Fs(=)1501 3189 y Fh(\010)1550 3256 y Fm(Q)23 b Fs(:)1684 3143 y Fh(Z)1781 3256 y Fp(f)f(d)p Fm(Q)h Fi(\024)f Fp(a)2106 3268 y Fl(f)2149 3256 y Fp(;)42 b(f)32 b Fi(2)23 b(F)8 b Fs(\()p Fp(C)e Fs(\))p Fi(g)p Fp(:)456 3490 y Fs(Here)18 b(the)i(nonnegativ)n(e)e(real)g(n)n(um)n(b)r(ers)h Fp(a)1755 3502 y Fl(f)1817 3490 y Fs(represen)n(t)f(b)r(ounds)h(on)g(the)h(means) e(for)h(the)h(v)-5 b(arious)456 3639 y(features)28 b(of)g Fp(C)35 b Fs(\(the)30 b(c)n(hoice)e(of)g Fp(a)1522 3651 y Fl(f)1594 3639 y Fs(is)h(discussed)f(later\).)40 b(Pro)n(vided)27 b(\005)2718 3651 y Fl(C)2803 3639 y Fs(is)h(b)r(oth)i(nonempt)n(y)456 3789 y(and)22 b(a)h(\014nite)g(Kullbac)n(k-Leibler)f(distance)g(from)h Fm(R)2079 3801 y Fl(C)2135 3789 y Fs(,)h(the)f(probabilit)n(y)f(of)h (in)n(terest)f(therefore)456 3938 y(satis\014es)456 4172 y(\(6\))657 b Fm(P)1270 4184 y Fl(C)1349 4172 y Fs(=)22 b(arg)38 b(min)1567 4226 y Fd(Q)p Fg(2)p Fn(\005)1706 4234 y Fj(C)1768 4059 y Fh(Z)1865 4172 y Fs(log)1972 4105 y Fh(\000)2010 4172 y Fp(d)p Fm(Q)p Fp(=d)p Fm(R)2263 4184 y Fl(C)2318 4105 y Fh(\001)2356 4172 y Fp(d)p Fm(Q)23 b Fp(<)g Fi(1)p Fp(:)456 4406 y Fs(In)k(that)h(case,)f(it)h(is)g(w)n (ell)f(kno)n(wn)g(\(Csiszar,)f(1984\))g(that)i(the)g(functional)g(form) f(of)h Fm(P)3159 4418 y Fl(C)3242 4406 y Fs(is)456 4640 y(\(7\))618 b Fp(d)p Fm(P)1274 4652 y Fl(C)1330 4640 y Fs(\()p Fp(s)p Fs(\))23 b(=)g Fp(Z)1607 4605 y Fg(\000)p Fn(1)1601 4665 y Fl(C)1709 4640 y Fs(exp)1836 4548 y Fh(\020)1946 4561 y(X)1886 4743 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))2140 4640 y Fp(\025)2188 4652 y Fl(f)2232 4640 y Fp(f)j Fs(\()p Fp(s)p Fs(\))2385 4548 y Fh(\021)2434 4640 y Fp(d)p Fm(R)2537 4652 y Fl(C)2594 4640 y Fs(\()p Fp(s)p Fs(\))p Fp(;)456 4917 y Fs(where)27 b(the)h Fp(\025)887 4929 y Fl(f)958 4917 y Fs(are)e(real)h(n)n(um)n(b)r(ers,)g(and)h Fp(Z)1835 4929 y Fl(C)1918 4917 y Fs(is)f(the)h(appropriate)e (normalizing)g(constan)n(t.)555 5066 y(Moreo)n(v)n(er,)f(it)j(can)e(b)r (e)i(sho)n(wn)f(that)g(the)h Fp(\025)1912 5078 y Fl(j)1975 5066 y Fs(are)e(all)h(nonnegativ)n(e,)f(and)h(in)h(fact)f Fp(\025)3181 5078 y Fl(j)3239 5066 y Fs(=)c(0)k(if)456 5216 y(and)g(only)g(if)875 5149 y Fh(R)945 5216 y Fp(f)9 b(d)p Fm(P)1089 5228 y Fl(C)1167 5216 y Fp(<)23 b(a)1299 5228 y Fl(f)1342 5216 y Fs(.)p eop end %%Page: 10 10 TeXDict begin 10 9 bop 456 251 a Fn(10)1212 b(L.A.)22 b(BREYER)555 450 y Fs(Substituting)30 b(\(4\))e(in)n(to)f(\(7\),)h(w)n (e)f(obtain)675 674 y Fp(Z)732 686 y Fl(C)811 674 y Fs(=)22 b Fp(\037)p Fs(\()p Fp(C)6 b Fs(\)!)1217 595 y Fh(X)1176 774 y Fl(s)28 b Fn(adm.)1117 826 y Fl(\037)p Fn(\()p Fl(s)p Fn(\)=)p Fl(\037)p Fn(\()p Fl(C)t Fn(\))1519 595 y Fh(Y)1452 777 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)p Fn(\))1783 618 y Fs(1)p 1716 655 177 4 v 1716 731 a Fp(f)j Fs(\()p Fp(s)p Fs(\)!)1902 582 y Fh(\020)1952 674 y Fs(exp)2079 607 y Fh(\002)2113 674 y Fp(\025)2161 686 y Fl(f)2205 674 y Fs(1)2247 689 y Fg(f)p Fl(f)e Fg(2F)f Fn(\()p Fl(C)t Fn(\))p Fg(g)2577 674 y Fs(+)18 b(log)c Fp(R)2844 686 y Fl(C)2900 674 y Fs(\()p Fp(f)9 b Fs(\))3014 607 y Fh(\003)3049 582 y(\021)3099 599 y Fl(f)e Fn(\()p Fl(s)p Fn(\))811 1013 y Fs(=)898 921 y Fh(\020)1008 934 y(X)948 1116 y Fl(f)g Fg(2F)f Fn(\()p Fl(G)p Fn(\))1202 1013 y Fs(exp)1329 946 y Fh(\002)1364 1013 y Fp(\025)1412 1025 y Fl(f)1455 1013 y Fs(1)1497 1028 y Fg(f)p Fl(f)h Fg(2F)f Fn(\()p Fl(C)t Fn(\))p Fg(g)1828 1013 y Fs(+)18 b(log)c Fp(R)2095 1025 y Fl(C)2151 1013 y Fs(\()p Fp(f)9 b Fs(\))2265 946 y Fh(\003)2300 921 y(\021)2349 938 y Fl(\037)p Fn(\()p Fl(C)t Fn(\))811 1303 y Fs(=)898 1211 y Fh(\020)948 1303 y Fs(1)18 b Fi(\000)1151 1224 y Fh(X)1091 1406 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))1345 1303 y Fp(R)1408 1315 y Fl(C)1464 1303 y Fs(\()p Fp(f)j Fs(\))19 b(+)1740 1224 y Fh(X)1680 1406 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))1934 1303 y Fp(e)1973 1269 y Fl(\025)2012 1278 y Fj(f)2054 1303 y Fp(R)2117 1315 y Fl(C)2173 1303 y Fs(\()p Fp(f)j Fs(\))2287 1211 y Fh(\021)2337 1228 y Fl(\037)p Fn(\()p Fl(C)t Fn(\))2486 1303 y Fp(;)456 1570 y Fs(whic)n(h)21 b(follo)n(ws,)g(assuming)f Fp(G)i Fs(is)f Fq(simple)p Fs(,)j(b)n(y)c(en)n(umerating)g(the)i(admissible)f(strings) f(via)h(their)456 1719 y(feature)29 b(coun)n(ts.)42 b(Inserting)29 b(\(7\))h(in)n(to)f(\(6\))h(and)f(using)g(the)h(assumption)f Fm(P)2848 1731 y Fl(C)2929 1719 y Fi(2)e Fs(\005)3073 1731 y Fl(C)3129 1719 y Fs(,)j(w)n(e)f(\014nd)456 1868 y(that)e(the)h(parameters)e Fp(\025)1256 1880 y Fl(f)1327 1868 y Fs(m)n(ust)i(b)r(e)g(c)n(hosen)f(to)g(minimize)456 2092 y(\(8\))217 b Fi(\000)p Fp(\037)p Fs(\()p Fp(C)6 b Fs(\))14 b(log)1146 2000 y Fh(h)1185 2092 y Fs(1)k Fi(\000)1389 2014 y Fh(X)1328 2195 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))1583 2092 y Fp(R)1646 2104 y Fl(C)1702 2092 y Fs(\()p Fp(f)j Fs(\))18 b(+)1978 2014 y Fh(X)1917 2195 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))2172 2092 y Fp(e)2211 2058 y Fl(\025)2250 2067 y Fj(f)2292 2092 y Fp(R)2355 2104 y Fl(C)2410 2092 y Fs(\()p Fp(f)j Fs(\))2524 2000 y Fh(i)2582 2092 y Fs(+)2726 2014 y Fh(X)2665 2195 y Fl(f)e Fg(2F)f Fn(\()p Fl(C)t Fn(\))2920 2092 y Fp(\025)2968 2104 y Fl(f)3011 2092 y Fp(a)3055 2104 y Fl(f)3098 2092 y Fp(:)456 2359 y Fs(This)40 b(expression)g(is)h(con)n(v)n(ex)e(as)h(a) h(function)g(of)g(eac)n(h)f Fp(\025)2346 2371 y Fl(f)2390 2359 y Fs(,)k(and)d(can)f(b)r(e)i(optimized)f(one)456 2508 y(comp)r(onen)n(t)21 b(at)h(a)f(time,)j(but)e(some)f(care)g(m)n (ust)h(b)r(e)g(tak)n(en)f(to)h(cop)r(e)f(with)i(n)n(umerical)d (precision)456 2658 y(errors)28 b(when)k Fp(\037)p Fs(\()p Fp(C)6 b Fs(\))31 b(is)g(large.)46 b(Di\013eren)n(tiating)32 b(\(8\))f(with)h(resp)r(ect)f(to)g(a)f(single)h(comp)r(onen)n(t)456 2807 y Fp(\025)504 2819 y Fl(f)575 2807 y Fs(and)c(solving)g(for)g(a)g (ro)r(ot)g(giv)n(es)f(the)i(equation)f(for)g(an)h(up)r(date)g Fp(\025)2645 2819 y Fl(f)2711 2807 y Fi(!)23 b Fp(\025)2865 2777 y Fg(0)2865 2831 y Fl(f)2909 2807 y Fs(,)k Fp(z)2998 2819 y Fl(C)3077 2807 y Fi(!)c Fp(z)3226 2777 y Fg(0)3222 2830 y Fl(C)3277 2807 y Fs(:)1169 3031 y Fp(\025)1217 2997 y Fg(0)1217 3052 y Fl(f)1284 3031 y Fs(=)g(log)14 b Fp(z)1532 3043 y Fl(C)1605 3031 y Fs(+)k(log)1867 2975 y Fp(a)1911 2987 y Fl(f)p 1820 3012 182 4 v 1820 3088 a Fp(\037)p Fs(\()p Fp(C)6 b Fs(\))2030 3031 y Fi(\000)18 b Fs(log)c Fp(R)2297 3043 y Fl(C)2353 3031 y Fs(\()p Fp(f)9 b Fs(\))p Fp(;)-2034 b Fs(\(9\))1166 3247 y Fp(z)1209 3212 y Fg(0)1205 3267 y Fl(C)1284 3247 y Fs(=)23 b(1)17 b Fi(\000)1575 3168 y Fh(X)1514 3350 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))1769 3247 y Fp(R)1832 3259 y Fl(C)1888 3247 y Fs(\()p Fp(f)j Fs(\))18 b(+)2164 3168 y Fh(X)2103 3350 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))2358 3247 y Fp(e)2397 3212 y Fl(\025)2436 3221 y Fj(f)2478 3247 y Fp(R)2541 3259 y Fl(C)2596 3247 y Fs(\()p Fp(f)j Fs(\))p Fp(:)456 3513 y Fs(With)37 b(this)g(particular)e(form)h(of)g(up)r (date,)j(all)d(w)n(eigh)n(ts)g(can)g(b)r(e)g(up)r(dated)h(sim)n (ultaneously)456 3662 y(b)r(efore)27 b(recomputing)g Fp(Z)1242 3674 y Fl(C)1297 3662 y Fs(,)h(whic)n(h)g(is)f(m)n(uc)n(h)g (more)g(exp)r(ensiv)n(e.)555 3812 y(It)h(is)g(apparen)n(t)e(from)h (\(7\))h(that)g(the)g(solution)f(measure)g Fm(P)2419 3824 y Fl(C)2502 3812 y Fs(can)g(b)r(e)h(written)456 4073 y(\(10\))82 b Fm(P)737 4085 y Fl(C)793 4073 y Fs(\()p Fp(s)p Fs(\))23 b(=)g Fp(\037)p Fs(\()p Fp(s)p Fs(\)!)c Fi(\001)1244 3994 y Fh(Y)1176 4176 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)p Fn(\))1508 4017 y Fs(1)p 1441 4054 177 4 v 1441 4130 a Fp(f)j Fs(\()p Fp(s)p Fs(\)!)1642 4052 y Fh(e)1627 4073 y Fp(R)1690 4085 y Fl(C)1746 4073 y Fs(\()p Fp(f)g Fs(\))1860 4039 y Fl(f)e Fn(\()p Fl(s)p Fn(\))1986 4073 y Fp(;)1681 4445 y Fs(where)1937 4424 y Fh(e)1922 4445 y Fp(R)1985 4457 y Fl(C)2040 4445 y Fs(\()p Fp(f)i Fs(\))24 b(=)2265 4250 y Fh(8)2265 4325 y(>)2265 4349 y(<)2265 4499 y(>)2265 4524 y(:)2339 4370 y Fp(Z)2402 4335 y Fg(\000)p Fn(1)2396 4395 y Fl(C)2491 4370 y Fp(e)2530 4340 y Fl(\025)2569 4349 y Fj(f)2610 4370 y Fp(R)2673 4382 y Fl(C)2729 4370 y Fs(\()p Fp(f)9 b Fs(\))83 b(if)29 b Fp(f)i Fi(2)24 b(F)8 b Fs(\()p Fp(C)e Fs(\))2339 4550 y Fp(Z)2402 4514 y Fg(\000)p Fn(1)2396 4574 y Fl(C)2491 4550 y Fp(R)2554 4562 y Fl(C)2610 4550 y Fs(\()p Fp(f)j Fs(\))202 b(otherwise.)456 4767 y(In)32 b(\(10\),)i(the)f(measure)1261 4746 y Fh(e)1246 4767 y Fp(R)1309 4779 y Fl(C)1397 4767 y Fs(is)g(a)f(probabilit)n(y)g(on)g Fi(F)8 b Fs(\()p Fp(G)p Fs(\),)35 b(and)d(the)h(same)f(form)n(ula)g (can)g(b)r(e)456 4917 y(used)26 b(for)g(strings)g(of)g(all)g (complexities,)h(resulting)f(in)h(a)f(consisten)n(t)g Fp(\033)s Fs(-\014nite)h(measure)f(on)g(all)456 5066 y(admissible)i(strings.)39 b(F)-7 b(urthermore,)28 b(for)g(an)n(y)g Fp(\037)d(>)f Fs(0,)29 b Fm(P)2266 5078 y Fl(C)2350 5066 y Fs(is)g(a)f(probabilit)n(y)g(measure)f(when)456 5216 y(restricted)g(to)g(strings)g Fp(s)g Fs(with)h Fp(\037)1503 5228 y Fl(G)1559 5216 y Fs(\()p Fp(s)p Fs(\))c(=)e Fp(\037)p Fs(.)p eop end %%Page: 11 11 TeXDict begin 11 10 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(11)555 450 y Fs(It)31 b(remains)f(to)g(discuss)h(the) g(c)n(hoice)e(of)i(constrain)n(ts,)f(and)g(v)n(erify)g(that)h(a)f (maxim)n(um)h(en-)456 600 y(trop)n(y)26 b(solution)h(exists.)555 749 y(It)20 b(is)f(natural)f(to)h(imp)r(ose)g(the)g(assumption)g(that)g (at)g(least)g(the)h(empirical)e(measure)g(b)r(elongs)456 898 y(to)28 b(\005)620 910 y Fl(C)676 898 y Fs(,)h(or)e(equiv)-5 b(alen)n(tly)28 b(that)g Fp(a)1516 910 y Fl(f)1584 898 y Fi(\025)23 b Fp(f)9 b Fs(\()p Fp(C)d Fs(\).)40 b(Pro)n(vided)27 b Fp(R)2330 910 y Fl(C)2385 898 y Fs(\()p Fp(f)9 b Fs(\))25 b Fp(>)f Fs(0)k(for)f(all)h Fp(f)33 b Fi(2)25 b(F)8 b Fs(\()p Fp(C)e Fs(\),)29 b(the)456 1048 y(requiremen)n(t)d(\(6\))i (follo)n(ws)f(easily)-7 b(,)27 b(and)g(therefore)g(a)g(maxim)n(um)g(en) n(trop)n(y)g(solution)g(exists.)555 1197 y(Ho)n(w)n(ev)n(er,)37 b(the)f(empirical)g(measure)f(in)h(itself)h(has)e(limited)i(predictiv)n (e)f(v)-5 b(alue,)38 b(since)e(it)456 1347 y(places)27 b(all)g(of)h(its)g(mass)f(on)g(the)h(tok)n(ens)f(observ)n(ed)f(in)i (the)g(training)f(corpus)g Fp(C)6 b Fs(.)38 b(T)-7 b(o)27 b(impro)n(v)n(e)456 1496 y(this)35 b(de\014ciency)-7 b(,)37 b(It)e(mak)n(es)f(sense)g(to)h(only)g(consider)f(the)h (empirical)f(measure)g(as)h(a)f(go)r(o)r(d)456 1646 y(mo)r(del)25 b(of)g(some)g(putativ)n(e)g Fm(Q)d Fi(2)i Fs(\005)1551 1658 y Fl(C)1607 1646 y Fs(,)i Fq(c)l(onditional)t(ly)k(on)d(observing) i(only)f(the)g(tokens)f(b)l(elong-)456 1795 y(ing)32 b(to)f Fi(F)8 b Fs(\()p Fp(C)e Fs(\).)45 b(This)29 b(constrain)n(t)g (is)h(actually)f(su\016cien)n(t)h(to)f(deriv)n(e)g(suitable)h(constan)n (ts)e Fp(a)3378 1807 y Fl(f)3421 1795 y Fs(,)456 1944 y(as)f(follo)n(ws:)555 2094 y(According)32 b(to)h(this)g(assumption,)h (let)f Fp(A)g Fs(=)e Fi(f)p Fp(!)j Fs(:)e Fp(f)9 b Fs(\()p Fp(!)s Fs(\))32 b Fp(>)g Fs(0)g(for)27 b(all)33 b Fp(f)41 b Fi(2)32 b(F)8 b Fs(\()p Fp(C)e Fs(\))p Fi(g)p Fs(.)53 b(The)456 2243 y(empirical)24 b(measure)g(has)h(supp)r(ort)g(on)f Fp(A)p Fs(.)37 b(F)-7 b(or)24 b(an)n(y)g(feature)h Fp(f)32 b Fi(2)23 b(F)8 b Fs(\()p Fp(C)e Fs(\),)27 b(w)n(e)d(therefore)h(write) 593 2354 y Fh(Z)690 2467 y Fp(f)9 b Fs(\()p Fp(!)s Fs(\))p Fp(d)p Fm(Q)p Fs(\()p Fp(!)s Fs(\))23 b(=)1197 2354 y Fh(Z)1294 2467 y Fp(f)9 b Fs(\()p Fp(!)s Fs(\))p Fp(d)p Fm(Q)p Fs(\()p Fp(!)s Fi(j)p Fp(A)p Fs(\))18 b Fi(\001)h Fm(Q)p Fs(\()p Fp(A)p Fs(\))g(+)f(0)g Fi(\001)g Fm(Q)p Fs(\()p Fp(A)2388 2433 y Fl(c)2422 2467 y Fs(\))23 b Fi(\031)g Fs(\()p Fp(f)9 b Fs(\()p Fp(C)d Fs(\))p Fp(=\037)p Fs(\()p Fp(C)g Fs(\)\))20 b Fi(\001)e Fm(Q)p Fs(\()p Fp(A)p Fs(\))p Fp(:)456 2691 y Fs(Th)n(us,)27 b(if)h(w)n(e)e(tak)n(e)h Fp(a)1110 2703 y Fl(f)1176 2691 y Fs(=)c Fp(f)9 b Fs(\()p Fp(C)d Fs(\),)28 b(then)f(w)n(e)g(obtain)g(a)g(satisfactory)f(set)h (\005)2766 2703 y Fl(C)2822 2691 y Fs(,)h(con)n(taining)e(b)r(oth)456 2841 y(the)34 b(empirical)f(measure)g(and)h(a)f(range)f(of)i(p)r (ossibilities)g(whic)n(h)g(tak)n(e)f(unseen)h(tok)n(ens)f(in)n(to)456 2990 y(accoun)n(t)26 b(\(in)i(those)g(cases,)e Fm(Q)p Fs(\()p Fp(A)p Fs(\))e Fp(<)e Fs(1\).)1053 3252 y(6.)41 b Fr(Maximum)31 b(Entr)n(opy:)40 b(the)32 b(sequential)f(case)555 3451 y Fs(In)d(this)g(section,)g(w)n(e)f(generalize)f(the)i(maxim)n(um) g(en)n(trop)n(y)f(problem)g(to)h(handle)f(the)h(case)456 3600 y(of)j Fp(n)p Fs(-grams.)45 b(Unfortunately)-7 b(,)32 b(for)e Fp(n)f Fi(\025)f Fs(2,)j(the)h(set)f Fp(G)g Fs(is)g(no)g (longer)e Fq(simple)p Fs(,)k(and)e(w)n(orking)456 3750 y(in)c(terms)h(of)f(admissible)h(strings)e(is)i(di\016cult.)456 3987 y Fx(De\014nition)43 b(4.)k Fq(A)39 b(set)g(of)h(r)l(e)l(gular)g (expr)l(essions)g Fp(G)f Fq(is)h(c)l(al)t(le)l(d)h Fs(sequen)n(tial)e Fq(if,)k(wenever)d(a)456 4136 y(string)30 b(of)h(the)f(form)h Fp(x)1177 4148 y Fn(1)1233 4136 y Fi(\005)19 b(\001)14 b(\001)g(\001)k(\005)g Fp(x)1516 4148 y Fl(n)1592 4136 y Fq(is)31 b(matche)l(d)g(\(with)f(e)l(ach)i Fp(x)2456 4148 y Fl(i)2514 4136 y Fq(not)e(c)l(ontaining)g(the)h(symb)l(ol)456 4286 y Fi(\005)p Fq(\),)h(then)g(al)t(l)h(subsets)e(of)i(the)f(form)g Fp(x)1668 4298 y Fl(k)1729 4286 y Fi(\005)20 b(\001)14 b(\001)g(\001)20 b(\005)f Fp(x)2016 4298 y Fl(k)q Fn(+)p Fl(j)2139 4286 y Fq(,)33 b(for)g Fs(1)26 b Fi(\024)h Fp(k)j Fi(\024)c Fp(n)32 b Fq(and)g Fs(0)27 b Fi(\024)f Fp(j)32 b Fi(\024)27 b Fp(n)20 b Fi(\000)f Fp(k)s Fq(,)456 4435 y(ar)l(e)38 b(also)g(matche)l(d.)63 b(We)38 b(write)g Fi(F)1602 4447 y Fl(j)1636 4435 y Fs(\()p Fp(G)p Fs(\))h Fq(for)f(the)g(subset)f(of)h Fi(F)8 b Fs(\()p Fp(G)p Fs(\))38 b Fq(which)i(is)d(of)i(the)f(form)456 4585 y Fp(f)497 4597 y Fl(a)533 4605 y Fk(1)565 4597 y Fg(\005\001\001\001)o (\005)p Fl(a)728 4605 y Fj(j)763 4585 y Fq(.)555 4821 y Fs(F)-7 b(or)28 b(a)h(\014xed)f Fp(\037)p Fs(,)h(w)n(e)g(shall)f(w)n (ork)f(with)j(strings)d(of)i(the)g(form)g Fp(s)24 b Fs(=)h Fp(x)2702 4833 y Fn(1)2759 4821 y Fi(\005)19 b(\001)14 b(\001)g(\001)19 b(\005)f Fp(x)3043 4833 y Fl(\037)3118 4821 y Fs(only)-7 b(.)40 b(W)-7 b(e)456 4971 y(write)1381 5143 y Fm(R)1441 5155 y Fl(C)1497 5075 y Fh(\000)1535 5143 y Fp(x)1582 5155 y Fn(1)1638 5143 y Fi(\005)18 b(\001)c(\001)g (\001)19 b(\005)f Fp(x)1921 5155 y Fl(\037)1967 5075 y Fh(\001)2028 5143 y Fs(=)2149 5035 y Fl(\037)2116 5064 y Fh(Y)2116 5240 y Fl(i)p Fn(=1)2237 5143 y Fp(R)2300 5155 y Fl(C)2356 5143 y Fs(\()p Fp(x)2435 5155 y Fl(i)2463 5143 y Fs(\))p Fp(;)p eop end %%Page: 12 12 TeXDict begin 12 11 bop 456 251 a Fn(12)1212 b(L.A.)22 b(BREYER)456 450 y Fs(whic)n(h)27 b(is)f(compatible)h(with)h(the)f (earlier)f(de\014nition)h(if)h Fp(G)f Fs(is)g Fq(simple)h Fs(\(if)g(w)n(e)e(iden)n(tify)i Fi(F)3250 462 y Fn(1)3287 450 y Fs(\()p Fp(G)p Fs(\)-)456 600 y(equiv)-5 b(alen)n(t)28 b(strings)f(w)n(e)g(obtain)h(the)h(earlier)e(de\014nition\).)39 b(Consider)27 b(also)g(the)h(sets)g(of)g(prob-)456 749 y(abilit)n(y)f(measures)656 992 y(\005)718 1004 y Fl(k)782 992 y Fs(=)870 925 y Fh(\010)918 992 y Fm(Q)c Fs(:)1052 879 y Fh(Z)1149 992 y Fp(f)9 b(d)p Fm(Q)22 b Fi(\024)h Fp(a)1461 1004 y Fl(f)1504 992 y Fp(;)97 b(f)31 b Fi(2)24 b(F)8 b Fs(\()p Fp(C)e Fs(\))19 b Fi(\\)2065 925 y Fh(\000)2103 992 y Fi([)2158 958 y Fl(k)2158 1013 y(j)s Fn(=1)2277 992 y Fi(F)2337 1004 y Fl(j)2372 992 y Fs(\()p Fp(G)p Fs(\))2501 925 y Fh(\001)q(\011)2588 992 y Fp(;)97 b(k)26 b Fs(=)d(1)p Fp(;)14 b Fs(2)p Fp(;)g(:)g(:)g(:)e(;)i(\037;)456 1236 y Fs(whic)n(h)30 b(are)f(clearly)h(decreasing)e(\(assuming)i(the)h (constrain)n(ts)e Fp(a)2522 1248 y Fl(f)2595 1236 y Fs(are)h(consisten) n(t\).)45 b(By)30 b(the)456 1385 y(Pythagorean)23 b(theorem)j(of)g (Kullbac)n(k-Leibler)e(div)n(ergences,)h(the)h(maxim)n(um)g(en)n(trop)n (y)f(solu-)456 1535 y(tion)i Fm(P)677 1547 y Fl(C;k)809 1535 y Fi(2)c Fs(\005)949 1547 y Fl(k)1018 1535 y Fs(\(relativ)n(e)k (to)g Fm(R)1507 1547 y Fl(C)1563 1535 y Fs(\))h(has)f(the)h(recursiv)n (e)e(form)817 1806 y Fp(d)p Fm(P)911 1818 y Fl(C;m)1041 1806 y Fs(\()p Fp(s)p Fs(\))e(=)f Fp(d)p Fm(P)1350 1818 y Fl(C)1405 1806 y Fs(\()p Fp(s)p Fs(\))h(=)f Fp(Z)1683 1770 y Fg(\000)p Fn(1)1677 1830 y Fl(C;m)1852 1702 y(m)1828 1727 y Fh(Y)1821 1906 y Fl(k)q Fn(=1)1956 1806 y Fs(exp)2082 1664 y Fh(")2307 1727 y(X)2131 1909 y Fl(f)7 b Fg(2F)2263 1918 y Fj(k)2298 1909 y Fn(\()p Fl(G)p Fn(\))p Fg(\\F)f Fn(\()p Fl(C)t Fn(\))2617 1806 y Fp(\025)2665 1818 y Fl(f)2709 1806 y Fp(f)j Fs(\()p Fp(s)p Fs(\))2862 1664 y Fh(#)2910 1806 y Fp(d)p Fm(R)3013 1818 y Fl(C)3069 1806 y Fs(\()p Fp(s)p Fs(\))p Fp(;)-2739 b Fs(\(11\))1532 2123 y(=)1635 2102 y Fh(e)1620 2123 y Fp(Z)1683 2087 y Fg(\000)p Fn(1)1677 2147 y Fl(C;m)1821 2123 y Fs(exp)1948 1981 y Fh(")2182 2044 y(X)1996 2226 y Fl(f)7 b Fg(2F)2128 2234 y Fj(m)2183 2226 y Fn(\()p Fl(G)p Fn(\))p Fg(\\F)f Fn(\()p Fl(C)t Fn(\))2502 2123 y Fp(\025)2550 2135 y Fl(f)2593 2123 y Fp(f)j Fs(\()p Fp(s)p Fs(\))2746 1981 y Fh(#)2795 2123 y Fp(d)p Fm(P)2889 2135 y Fl(C;m)p Fg(\000)p Fn(1)3104 2123 y Fs(\()p Fp(s)p Fs(\))p Fp(;)456 2413 y Fs(whic)n(h)26 b(implies)h(that)g(w)n(e)f(can)h(calculate)f(the)h(w)n (eigh)n(ts)e Fp(\025)2254 2425 y Fl(f)2298 2413 y Fp(;)14 b(f)31 b Fi(2)24 b(F)8 b Fs(\()p Fp(C)e Fs(\))17 b Fi(\\)g(F)2832 2425 y Fl(k)2873 2413 y Fs(\()p Fp(G)p Fs(\))27 b(inductiv)n(ely)-7 b(,)456 2563 y(through)26 b(optimization)i(of)456 2806 y(\(12\))500 b Fi(\000)14 b Fs(log)1318 2785 y Fh(e)1303 2806 y Fp(Z)1360 2818 y Fl(C;k)1487 2806 y Fs(+)1746 2727 y Fh(X)1570 2909 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)t Fn(\))p Fg(\\F)1905 2918 y Fj(k)1939 2909 y Fn(\()p Fl(G)p Fn(\))2057 2806 y Fp(\025)2105 2818 y Fl(f)2148 2806 y Fp(a)2192 2818 y Fl(f)2235 2806 y Fp(;)97 b(k)26 b Fs(=)c(1)p Fp(;)14 b(:)g(:)g(:)f(m:)456 3115 y Fs(Due)31 b(to)g(the)g(form)n(ula)f(log)14 b Fp(Z)1370 3127 y Fl(C;k)1507 3115 y Fs(=)29 b(log)1737 3094 y Fh(e)1722 3115 y Fp(Z)1779 3127 y Fl(C;k)1908 3115 y Fs(+)20 b(log)14 b Fp(Z)2171 3127 y Fl(C;k)q Fg(\000)p Fn(1)2364 3115 y Fs(,)32 b(the)g(optimal)f (set)g(of)f(constan)n(ts)456 3264 y Fp(\025)504 3276 y Fl(f)547 3264 y Fs(,)d(at)g(the)h Fp(k)s Fs(-th)f(stage)f(of)h (optimization,)f(remains)h(the)g(same)f(if)i(w)n(e)e(replace)g(log)3106 3243 y Fh(e)3091 3264 y Fp(Z)3148 3276 y Fl(C;k)3283 3264 y Fs(with)456 3414 y(log)14 b Fp(Z)634 3426 y Fl(C;k)770 3414 y Fs(in)28 b(\(12\))o(.)37 b(T)-7 b(o)27 b(compute)h Fp(Z)1590 3426 y Fl(C;k)1698 3414 y Fs(,)g(w)n(e)f(note)h(\014rst)f (that)h(for)f(an)n(y)g Fp(k)f(<)d(m)f Fi(\024)h Fp(\037)p Fs(,)642 3616 y Fh(X)552 3794 y Fl(b)581 3803 y Fj(k)q Fk(+1)689 3794 y Fl(;:::)o(b)797 3802 y Fj(m)866 3695 y Fp(f)907 3707 y Fl(a)943 3715 y Fk(1)975 3707 y Fg(\005\001\001\001)o (\005)p Fl(a)1138 3716 y Fj(k)1174 3707 y Fg(\005)p Fl(b)1237 3716 y Fj(k)q Fk(+1)1345 3707 y Fg(\005\001\001\001)o(\005)p Fl(b)1501 3715 y Fj(m)1561 3695 y Fs(\()p Fp(s)p Fs(\))g Fi(\024)g Fp(f)1816 3707 y Fl(a)1852 3715 y Fk(1)1884 3707 y Fg(\005\001\001\001)o(\005)p Fl(a)2047 3716 y Fj(k)2087 3695 y Fs(\()p Fp(s)p Fs(\))h Fi(\024)1995 3877 y Fh(X)1905 4056 y Fl(b)1934 4065 y Fj(k)q Fk(+1)2041 4056 y Fl(;:::)o(b)2149 4064 y Fj(m)2219 3956 y Fp(f)2260 3968 y Fl(a)2296 3976 y Fk(1)2328 3968 y Fg(\005\001\001\001)o(\005)p Fl(a)2491 3977 y Fj(k)2527 3968 y Fg(\005)p Fl(b)2590 3977 y Fj(k)q Fk(+1)2697 3968 y Fg(\005\001\001\001\005)p Fl(b)2854 3976 y Fj(m)2913 3956 y Fs(\()p Fp(s)p Fs(\))19 b(+)f Fp(m)g Fi(\000)g Fp(k)s(;)456 4240 y Fs(and)23 b(the)g(\014rst)g(inequalit)n(y)f(is)h(strict)g(only)g(if)h Fp(a)1884 4252 y Fn(1)1930 4240 y Fi(\005)9 b(\001)14 b(\001)g(\001)9 b(\005)g Fp(a)2182 4252 y Fl(k)2246 4240 y Fs(o)r(ccurs)22 b(within)i(the)g(su\016x)f Fp(x)3153 4252 y Fl(\037)p Fg(\000)p Fl(m)p Fn(+1)3403 4240 y Fi(\005)456 4389 y(\001)14 b(\001)g(\001)k(\005)g Fp(x)678 4401 y Fl(\037)752 4389 y Fs(of)27 b(the)h(string)f Fp(s)p Fs(.)37 b(In)28 b(particular,)e(w)n(e)h(ha)n(v)n(e)456 4633 y(\(13\))955 4554 y Fh(X)895 4728 y Fl(a)931 4736 y Fk(1)963 4728 y Fl(;:::)o(;a)1098 4737 y Fj(k)1148 4633 y Fp(\025)1196 4645 y Fl(a)1232 4653 y Fk(1)1265 4645 y Fg(\005\001\001\001)o(\005)p Fl(a)1428 4654 y Fj(k)1469 4633 y Fp(f)1510 4645 y Fl(a)1546 4653 y Fk(1)1578 4645 y Fg(\005\001\001\001)o(\005)p Fl(a)1741 4654 y Fj(k)1781 4633 y Fs(\()p Fp(s)p Fs(\))d Fi(\031)2058 4554 y Fh(X)1995 4733 y Fl(b)2024 4741 y Fk(1)2057 4733 y Fl(;:::)o(;b)2185 4741 y Fj(m)2254 4633 y Fp(\025)2302 4645 y Fl(b)2331 4653 y Fk(1)2364 4645 y Fg(\005\001\001\001)o(\005)p Fl(b)2520 4654 y Fj(k)2561 4633 y Fp(f)2602 4645 y Fl(b)2631 4653 y Fk(1)2663 4645 y Fg(\005\001\001\001)o(\005)p Fl(b)2819 4653 y Fj(m)2879 4633 y Fs(\()p Fp(s)p Fs(\))p Fp(;)456 4917 y Fs(with)h(an)h(error)d (at)i(most)g(max)1412 4929 y Fl(t)1455 4917 y Fi(j)p Fp(\025)1526 4929 y Fl(t)1556 4917 y Fi(j)13 b Fs(\()p Fp(m)i Fi(\000)e Fp(k)s Fs(\).)36 b(T)-7 b(o)25 b(ease)g(the)h (notation,)f(when)h Fp(f)31 b Fs(=)23 b Fp(f)3131 4929 y Fl(a)3167 4937 y Fk(1)3199 4929 y Fg(\005\001\001\001)o(\005)p Fl(a)3362 4937 y Fj(m)3421 4917 y Fs(,)456 5066 y(w)n(e)j(write)g Fp(\034)833 5036 y Fl(j)869 5066 y Fp(f)32 b Fs(=)22 b Fp(f)1070 5078 y Fl(a)1106 5086 y Fk(1)1138 5078 y Fg(\005\001\001\001)o(\005)p Fl(a)1301 5086 y Fj(m)p Fc(\000)p Fj(j)1459 5066 y Fs(for)k Fp(j)i Fs(=)23 b(1)p Fp(;)14 b(:)g(:)g(:)f(;)h(m)i Fi(\000)g Fs(1.)37 b(Also,)26 b Fp(f)2483 5078 y Fl(t)2528 5066 y Fi(\005)16 b Fp(y)26 b Fs(=)d Fp(f)2782 5078 y Fl(t)p Fg(\005)p Fl(y)2880 5066 y Fs(.)37 b(A)27 b(geometrical)456 5216 y(w)n(a)n(y)f(of)i (understanding)e(this)i(appro)n(ximation)e(is)i(giv)n(en)e(in)i(Figure) f(1.)p eop end %%Page: 13 13 TeXDict begin 13 12 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(13)1122 472 y Fs(\()p Fp(k)26 b Fs(=)d(3\))536 b Fp(\025)1969 484 y Fn(123)2156 472 y Fp(\025)2204 484 y Fn(234)2391 472 y Fp(\025)2439 484 y Fn(345)2626 472 y Fp(\025)2674 484 y Fn(456)p 1996 666 4 150 v 2230 666 V 2465 666 V 2700 666 V 1122 771 a Fs(\()p Fp(k)26 b Fs(=)d(2\))335 b Fp(\025)1768 783 y Fn(12)1938 771 y Fp(\025)1986 783 y Fn(23)2173 771 y Fp(\025)2221 783 y Fn(34)2408 771 y Fp(\025)2456 783 y Fn(45)2643 771 y Fp(\025)2691 783 y Fn(56)p 1996 965 V 2230 965 V 2465 965 V 2700 965 V 1122 1069 a Fs(\()p Fp(k)26 b Fs(=)d(1\))166 b Fp(\025)1599 1081 y Fn(1)1736 1069 y Fp(\025)1784 1081 y Fn(2)1954 1069 y Fp(\025)2002 1081 y Fn(3)2189 1069 y Fp(\025)2237 1081 y Fn(4)2424 1069 y Fp(\025)2472 1081 y Fn(5)2659 1069 y Fp(\025)2707 1081 y Fn(6)754 1284 y Fr(Figure)36 b(1.)41 b Fs(Appro)n(ximation)31 b(\(13\))o(:)45 b(F)-7 b(or)30 b(an)n(y)h(string)g Fp(s)e Fs(=)g Fp(a)2741 1296 y Fn(1)2799 1284 y Fi(\005)20 b(\001)14 b(\001)g(\001)21 b(\005)f Fp(a)3085 1296 y Fn(6)3122 1284 y Fs(,)754 1434 y(arrange)h(the)i(w)n(eigh)n(ts)f(for)g(all)h(1)p Fp(;)14 b Fs(2)p Fp(;)g Fs(3-grams)19 b(in)k(an)g(arra)n(y)d(as)i(ab)r(o)n(v)n (e.)34 b(Then)754 1583 y(for)28 b(eac)n(h)f(ro)n(w)f Fp(k)s Fs(,)i(the)g(left)h(hand)e(side)h(of)34 b(\(13\))28 b(is)f(the)h(sum)g(of)g(w)n(eigh)n(ts)f(on)754 1733 y(that)38 b(ro)n(w,)h(while)f(the)g(righ)n(t)e(hand)i(side)f(of)44 b(\(13\))38 b(is)f(the)h(sum)f(of)h(those)754 1882 y(w)n(eigh)n(ts)28 b(whic)n(h)g(ha)n(v)n(e)f(a)g(w)n(eigh)n(t)h(ab)r(o)n(v)n(e)f(them)h (on)g(ro)n(w)f Fp(m)d Fs(=)f(3.)38 b(The)28 b(sum)754 2032 y(of)39 b(the)g(w)n(eigh)n(ts)e(along)h(eac)n(h)g(line)g(has)g (the)h(form)f Fp(\025)2486 2044 y Fl(xy)r(z)2624 2032 y Fs(+)25 b Fp(\025)2762 2044 y Fl(y)r(z)2863 2032 y Fs(+)g Fp(\025)3001 2044 y Fl(z)3081 2032 y Fs(=)754 2181 y Fp(\025)802 2193 y Fl(xy)r(z)933 2181 y Fs(+)18 b Fp(\025)1064 2196 y Fl(\034)1102 2179 y Fk(1)1134 2196 y Fn(\()p Fl(xy)r(z)r Fn(\))1316 2181 y Fs(+)g Fp(\025)1447 2196 y Fl(\034)1485 2179 y Fk(2)1517 2196 y Fn(\()p Fl(xy)r(z)r Fn(\))1681 2181 y Fs(.)555 2448 y(No)n(w)24 b(from)h(\(13\))o(,)h(b)n (y)e(summing)h(o)n(v)n(er)e(all)h(strings)g Fp(s)h Fs(of)f(the)h(form)g Fp(x)2685 2460 y Fn(1)2735 2448 y Fi(\005)13 b(\001)h(\001)g(\001)e (\005)h Fp(x)3001 2460 y Fl(\037)3046 2448 y Fs(,)25 b(w)n(e)g(obtain)456 2597 y(for)i(large)f(v)-5 b(alues)27 b(of)h Fp(\037)p Fs(,)618 2842 y Fp(Z)675 2854 y Fl(C;k)806 2842 y Fs(=)23 b Fp(Z)951 2854 y Fl(C;k)q Fg(\000)p Fn(1)1158 2763 y Fh(X)1202 2938 y Fl(s)1292 2842 y Fs(exp)1419 2700 y Fh(")1643 2763 y(X)1467 2945 y Fl(f)7 b Fg(2F)1599 2954 y Fj(k)1635 2945 y Fn(\()p Fl(G)p Fn(\))p Fg(\\F)f Fn(\()p Fl(C)t Fn(\))1954 2842 y Fp(\025)2002 2854 y Fl(f)2045 2842 y Fp(f)j Fs(\()p Fp(s)p Fs(\))2198 2700 y Fh(#)2247 2842 y Fp(d)p Fm(P)2341 2854 y Fl(C;k)q Fg(\000)p Fn(1)2534 2842 y Fs(\()p Fp(s)p Fs(\))806 3166 y Fi(\031)894 3087 y Fh(X)938 3262 y Fl(s)1028 3166 y Fs(exp)1154 3024 y Fh(")1278 3087 y(X)1203 3269 y Fl(f)e Fg(2F)1335 3278 y Fj(k)1370 3269 y Fn(\()p Fl(G)p Fn(\))1474 3074 y Fh(\020)1524 3166 y Fp(\025)1572 3178 y Fl(f)1615 3166 y Fs(1)1657 3181 y Fg(f)p Fl(f)g Fg(2F)f Fn(\()p Fl(C)t Fn(\))p Fg(g)1988 3166 y Fs(+)2071 3062 y Fl(k)q Fg(\000)p Fn(1)2072 3087 y Fh(X)2074 3264 y Fl(j)s Fn(=1)2206 3166 y Fp(\025)2254 3182 y Fl(\034)2292 3165 y Fj(j)2323 3182 y Fl(f)2366 3166 y Fs(1)2408 3182 y Fg(f)p Fl(\034)2480 3165 y Fj(j)2510 3182 y Fl(f)h Fg(2F)f Fn(\()p Fl(C)t Fn(\))p Fg(g)2789 3074 y Fh(\021)2838 3166 y Fp(f)j Fs(\()p Fp(s)p Fs(\))2991 3024 y Fh(#)3040 3166 y Fm(R)3100 3178 y Fl(C)3156 3166 y Fs(\()p Fp(s)p Fs(\))p Fp(:)456 3446 y Fs(As)36 b(a)g(notational)f (simpli\014cation,)j(b)r(elo)n(w)e(w)n(e)g(shall)g(write)g Fp(\025)2463 3416 y Fl(C)2463 3469 y(f)2557 3446 y Fs(=)h Fp(\025)2707 3458 y Fl(f)2787 3446 y Fs(if)f Fp(f)46 b Fi(2)38 b(F)8 b Fs(\()p Fp(C)e Fs(\),)40 b(and)456 3595 y Fp(\025)504 3565 y Fl(C)504 3619 y(f)583 3595 y Fs(=)23 b(0)k(otherwise.)555 3745 y(No)n(w)j(for)h(eac)n(h)e Fp(s)p Fs(,)j(the)f(substrings)f Fp(x)1751 3757 y Fn(1)1788 3745 y Fp(;)14 b(:)g(:)g(:)g(;)g(x)2020 3757 y Fl(\037)2097 3745 y Fs(are)29 b(indep)r(enden)n(t)j(under)e Fm(R)3010 3757 y Fl(C)3066 3745 y Fs(,)i(and)e(eac)n(h)456 3894 y Fp(f)41 b Fi(2)34 b(F)687 3906 y Fl(k)727 3894 y Fs(\()p Fp(G)p Fs(\))h(dep)r(ends)f(only)f(on)g(consecutiv)n(e)g(substrings)f Fp(x)2418 3906 y Fl(t)2448 3894 y Fp(;)14 b(:)g(:)g(:)g(;)g(x)2680 3906 y Fl(t)p Fn(+)p Fl(k)2797 3894 y Fs(.)55 b(Therefore,)34 b(b)n(y)f(a)456 4044 y(simple)27 b(mo)r(di\014cation)h(of)f(the)h (standard)f(Sano)n(v)f(theorem,)535 4445 y(lim)506 4495 y Fl(\037)p Fg(!1)679 4445 y Fs(\()p Fp(\037)19 b Fi(\000)f Fp(k)j Fs(+)d(1\))1086 4411 y Fg(\000)p Fn(1)1175 4445 y Fs(log)c Fp(Z)1353 4457 y Fl(C;k)1485 4445 y Fs(=)22 b(sup)1616 4511 y Fl(\027)1697 4303 y Fh( )1763 4332 y(Z)1809 4521 y Fg(F)1857 4530 y Fj(k)1893 4521 y Fn(\()p Fl(G)p Fn(\))2001 4353 y Fh(h)2040 4445 y Fp(\025)2088 4411 y Fl(C)2088 4466 y(f)2163 4445 y Fs(+)2246 4342 y Fl(k)q Fg(\000)p Fn(1)2247 4366 y Fh(X)2249 4543 y Fl(j)s Fn(=1)2381 4445 y Fp(\025)2429 4411 y Fl(C)2429 4469 y(\034)2467 4452 y Fj(j)2498 4469 y Fl(f)2541 4353 y Fh(i)2580 4445 y Fp(\027)5 b Fs(\()p Fp(d)-14 b(f)9 b Fs(\))20 b Fi(\000)2884 4389 y Fs(1)p 2882 4426 46 4 v 2882 4502 a Fp(k)2937 4445 y(D)3008 4378 y Fh(\000)3046 4445 y Fp(\027)5 b Fi(k)p Fp(R)3198 4410 y Fg(\012)p Fl(k)3197 4470 y(C)3291 4378 y Fh(\001)3329 4303 y(!)456 4236 y Fs(\(14\))1485 4761 y(=)1585 4705 y(1)p 1582 4742 V 1582 4818 a Fp(k)1652 4761 y Fs(log)1759 4619 y Fh(")1883 4682 y(X)1808 4864 y Fl(f)i Fg(2F)1940 4873 y Fj(k)1975 4864 y Fn(\()p Fl(G)p Fn(\))2093 4761 y Fs(exp)2219 4669 y Fh(\020)2269 4761 y Fp(k)s(\025)2363 4727 y Fl(C)2363 4781 y(f)2438 4761 y Fs(+)2521 4657 y Fl(k)q Fg(\000)p Fn(1)2521 4682 y Fh(X)2524 4859 y Fl(j)s Fn(=1)2656 4761 y Fp(k)s(\025)2750 4727 y Fl(C)2750 4784 y(\034)2788 4768 y Fj(j)2819 4784 y Fl(f)2862 4669 y Fh(\021)2911 4761 y Fp(R)2975 4725 y Fg(\012)p Fl(k)2974 4785 y(C)3068 4761 y Fs(\()p Fp(f)i Fs(\))3182 4619 y Fh(#)3230 4761 y Fp(;)456 5066 y Fs(b)r(ecause)26 b(the)g(optimal)h Fp(\027)32 b Fs(for)25 b(a)h(problem)g(of)h(the)g(form)f(max)2380 5078 y Fl(\027)2422 4974 y Fh(\020)2471 4999 y(R)2540 5066 y Fp(hd\027)c Fi(\000)16 b Fp(D)r Fs(\()p Fp(\027)5 b Fi(k)p Fp(\026)p Fs(\))3048 4974 y Fh(\021)3124 5066 y Fs(is)26 b(alw)n(a)n(ys)456 5216 y(giv)n(en)g(b)n(y)i Fp(d\027)g Fs(=)23 b Fp(e)1027 5185 y Fl(h)1070 5216 y Fp(d\026=)1219 5149 y Fh(R)1287 5216 y Fp(e)1326 5185 y Fl(h)1369 5216 y Fp(d\026)p Fs(.)p eop end %%Page: 14 14 TeXDict begin 14 13 bop 456 251 a Fn(14)1212 b(L.A.)22 b(BREYER)555 450 y Fs(While)31 b(the)f(term)g(in)h(square)e(brac)n(k)n (ets)f(still)i(m)n(ust)h(b)r(e)f(ev)-5 b(aluated)30 b(o)n(v)n(er)e(all) i(p)r(ossible)g(fea-)456 600 y(tures)c Fp(f)32 b Fi(2)23 b(F)874 612 y Fl(k)915 600 y Fs(\()p Fp(G)p Fs(\),)28 b(a)f(simpli\014cation)g(is)g(p)r(ossible)g(b)n(y)f(noting)h(that)h(it) f(equals)g(\010)3017 612 y Fl(C;k)q(;k)3182 600 y Fs(,)g(where)456 858 y(\(15\))490 b(\010)1154 870 y Fl(C;k)q(;l)1327 858 y Fs(:=)1507 779 y Fh(X)1438 961 y Fl(f)7 b Fg(2F)1570 970 y Fj(l)1593 961 y Fn(\()p Fl(G)p Fn(\))1710 858 y Fs(exp)1837 766 y Fh(\020)1887 858 y Fp(k)s(\025)1981 824 y Fl(C)1981 878 y(f)2055 858 y Fs(+)2145 754 y Fl(l)p Fg(\000)p Fn(1)2138 779 y Fh(X)2141 956 y Fl(j)s Fn(=1)2272 858 y Fp(k)s(\025)2366 824 y Fl(C)2366 881 y(\034)2404 864 y Fj(j)2435 881 y Fl(f)2478 766 y Fh(\021)2527 858 y Fp(R)2591 822 y Fg(\012)p Fl(l)2590 882 y(C)2668 858 y Fs(\()p Fp(f)i Fs(\))p Fp(:)456 1136 y Fs(Since)30 b(most)g(of)g(the)g(constan)n(ts)f Fp(\025)1541 1106 y Fl(C)1541 1159 y(f)1628 1136 y Fs(are)g(zero,)g(w)n(e)h(can)g(expand) f(this)i(recursiv)n(ely)-7 b(,)29 b(with)h(the)456 1285 y(b)r(oundary)c(case)h(\010)1065 1297 y Fl(C;k)q(;)p Fn(0)1250 1285 y Fs(=)22 b(1:)456 1543 y(\010)516 1555 y Fl(C;k)q(;l)688 1543 y Fs(=)802 1464 y Fh(X)776 1651 y Fl(\025)815 1631 y Fj(C)815 1671 y(f)864 1651 y Fg(6)p Fn(=0)962 1543 y Fs(exp)1088 1451 y Fh(\020)1138 1543 y Fp(k)s(\025)1232 1509 y Fl(C)1232 1564 y(f)1307 1543 y Fs(+)1396 1440 y Fl(l)p Fg(\000)p Fn(1)1390 1464 y Fh(X)1392 1641 y Fl(j)s Fn(=1)1523 1543 y Fp(k)s(\025)1617 1509 y Fl(C)1617 1567 y(\034)1655 1550 y Fj(j)1686 1567 y Fl(f)1729 1451 y Fh(\021)1779 1543 y Fp(R)1843 1508 y Fg(\012)p Fl(l)1842 1568 y(C)1920 1543 y Fs(\()p Fp(f)9 b Fs(\))18 b(+)2161 1464 y Fh(X)2135 1651 y Fl(\025)2174 1631 y Fj(C)2174 1671 y(f)2223 1651 y Fn(=0)2321 1543 y Fs(exp)2448 1451 y Fh(\020)2497 1543 y Fp(k)s(\025)2591 1509 y Fl(C)2591 1564 y(f)2666 1543 y Fs(+)g Fp(k)2815 1440 y Fl(l)p Fg(\000)p Fn(1)2809 1464 y Fh(X)2811 1641 y Fl(j)s Fn(=1)2942 1543 y Fp(\025)2990 1509 y Fl(C)2990 1567 y(\034)3028 1550 y Fj(j)3059 1567 y Fl(f)3102 1451 y Fh(\021)3152 1543 y Fp(R)3216 1508 y Fg(\012)p Fl(l)3215 1568 y(C)3293 1543 y Fs(\()p Fp(f)9 b Fs(\))688 1886 y(=)802 1807 y Fh(X)776 1994 y Fl(\025)815 1974 y Fj(C)815 2014 y(f)864 1994 y Fg(6)p Fn(=0)962 1886 y Fs(exp)1088 1794 y Fh(\020)1138 1886 y Fp(k)s(\025)1232 1852 y Fl(C)1232 1906 y(f)1307 1886 y Fs(+)1396 1782 y Fl(l)p Fg(\000)p Fn(1)1390 1807 y Fh(X)1392 1984 y Fl(j)s Fn(=1)1523 1886 y Fp(k)s(\025)1617 1852 y Fl(C)1617 1909 y(\034)1655 1892 y Fj(j)1686 1909 y Fl(f)1729 1794 y Fh(\021)1779 1886 y Fp(R)1843 1850 y Fg(\012)p Fl(l)1842 1910 y(C)1920 1886 y Fs(\()p Fp(f)g Fs(\)+)845 2149 y Fh(X)887 2324 y Fl(y)1063 2149 y Fh(X)979 2336 y Fl(\025)1018 2316 y Fj(C)1018 2366 y(\034)1051 2354 y Fk(1)1084 2366 y Fj(f)c Fc(\005)p Fj(y)1184 2336 y Fn(=0)1282 2228 y Fs(exp)1408 2136 y Fh(\020)1458 2228 y Fp(k)s(\025)1552 2194 y Fl(C)1552 2251 y(\034)1590 2234 y Fk(1)1622 2251 y Fl(f)1683 2228 y Fs(+)1773 2124 y Fl(l)p Fg(\000)p Fn(2)1766 2149 y Fh(X)1769 2326 y Fl(j)s Fn(=1)1900 2228 y Fp(k)s(\025)1994 2194 y Fl(C)1994 2252 y(\034)2032 2235 y Fj(j)2063 2252 y Fl(\034)2101 2235 y Fk(1)2133 2252 y Fl(f)2176 2136 y Fh(\021)2225 2228 y Fp(R)2289 2193 y Fg(\012)p Fl(l)p Fg(\000)p Fn(1)2288 2253 y Fl(C)2451 2228 y Fs(\()p Fp(\034)2528 2194 y Fn(1)2566 2228 y Fp(f)k Fs(\))19 b Fi(\001)f Fp(R)2771 2240 y Fl(C)2827 2228 y Fs(\()p Fp(y)s Fs(\))688 2581 y(=)802 2502 y Fh(X)776 2689 y Fl(\025)815 2669 y Fj(C)815 2709 y(f)864 2689 y Fg(6)p Fn(=0)962 2581 y Fs(exp)1088 2489 y Fh(\020)1138 2581 y Fp(k)s(\025)1232 2547 y Fl(C)1232 2601 y(f)1307 2581 y Fs(+)1396 2477 y Fl(l)p Fg(\000)p Fn(1)1390 2502 y Fh(X)1392 2679 y Fl(j)s Fn(=1)1523 2581 y Fp(k)s(\025)1617 2547 y Fl(C)1617 2604 y(\034)1655 2588 y Fj(j)1686 2604 y Fl(f)1729 2489 y Fh(\021)1779 2581 y Fp(R)1843 2545 y Fg(\012)p Fl(l)1842 2605 y(C)1920 2581 y Fs(\()p Fp(f)9 b Fs(\)+)956 2844 y Fh(X)845 3026 y Fl(\034)883 3010 y Fk(1)915 3026 y Fl(f)e Fg(2F)1047 3035 y Fj(k)1082 3026 y Fn(\()p Fl(G)p Fn(\))1200 2923 y Fs(exp)1327 2831 y Fh(\020)1376 2923 y Fp(k)s(\025)1470 2889 y Fl(C)1470 2946 y(\034)1508 2929 y Fk(1)1540 2946 y Fl(f)1602 2923 y Fs(+)1692 2820 y Fl(l)p Fg(\000)p Fn(2)1685 2844 y Fh(X)1687 3021 y Fl(j)s Fn(=1)1818 2923 y Fp(k)s(\025)1912 2889 y Fl(C)1912 2947 y(\034)1950 2930 y Fj(j)1981 2947 y Fl(\034)2019 2930 y Fk(1)2051 2947 y Fl(f)2094 2831 y Fh(\021)2143 2923 y Fp(R)2207 2888 y Fg(\012)p Fl(l)p Fg(\000)p Fn(1)2206 2948 y Fl(C)2370 2923 y Fs(\()p Fp(\034)2447 2889 y Fn(1)2485 2923 y Fp(f)i Fs(\))2567 2781 y Fh( )2632 2923 y Fs(1)18 b Fi(\000)2915 2844 y Fh(X)2775 3026 y Fl(\034)2813 3010 y Fk(1)2845 3026 y Fl(f)7 b Fg(\005)p Fl(y)r Fg(2F)3047 3035 y Fj(l)3070 3026 y Fn(\()p Fl(C)t Fn(\))3188 2923 y Fp(R)3251 2935 y Fl(C)3306 2923 y Fs(\()p Fp(y)s Fs(\))3414 2781 y Fh(!)688 3190 y Fs(=)852 3112 y Fh(X)776 3293 y Fl(f)g Fg(2F)908 3302 y Fj(k)943 3293 y Fn(\()p Fl(C)t Fn(\))1047 3098 y Fh(\020)1097 3190 y Fp(e)1136 3156 y Fl(k)q(\025)1211 3165 y Fj(f)1271 3190 y Fi(\000)18 b Fs(1)1396 3098 y Fh(\021)1459 3190 y Fs(exp)1586 3098 y Fh(\020)1636 3190 y Fp(k)s(\025)1730 3156 y Fl(C)1730 3213 y(\034)1768 3196 y Fk(1)1800 3213 y Fl(f)1861 3190 y Fs(+)g Fi(\001)c(\001)g(\001) 19 b Fs(+)f Fp(k)s(\025)2237 3156 y Fl(C)2237 3215 y(\034)2275 3198 y Fj(l)p Fc(\000)p Fk(1)2372 3215 y Fl(f)2415 3098 y Fh(\021)2464 3190 y Fp(R)2528 3155 y Fg(\012)p Fl(l)2527 3215 y(C)2605 3190 y Fs(\()p Fp(f)9 b Fs(\))19 b(+)f(\010)2881 3202 y Fl(C;k)q(;l)p Fg(\000)p Fn(1)3116 3190 y Fp(:)456 3456 y Fs(Summarizing)29 b(the)i(calculations)e(so)g(far,)i(at)f(the)g Fp(k)s Fs(-th)g(stage,)g(w)n(e)g(can)g(solv)n(e)f(the)i(follo)n(wing) 456 3605 y(optimization)c(problem,)g(whic)n(h)h(is)f(asymptotically)g (equiv)-5 b(alen)n(t)27 b(to)g(\(12\),)456 3854 y(\(16\))41 b Fi(\000)720 3813 y Fn(\()p Fl(\037)p Fg(\000)p Fl(k)q Fn(+1\))p 719 3835 267 4 v 834 3882 a Fl(k)1009 3854 y Fs(log)1116 3712 y Fh(")1240 3775 y(X)1165 3957 y Fl(f)7 b Fg(2F)1297 3966 y Fj(k)1332 3957 y Fn(\()p Fl(C)t Fn(\))1436 3761 y Fh(\020)1485 3854 y Fp(e)1524 3819 y Fl(k)q(\025)1599 3794 y Fj(C)1599 3836 y(f)1653 3854 y Fi(\000)q Fs(1)1761 3761 y Fh(\021)1810 3854 y Fp(e)1849 3767 y Fb(P)1918 3829 y Fj(j)1961 3810 y Fl(k)q(\025)2036 3785 y Fj(C)2036 3837 y(\034)2069 3824 y(j)2101 3837 y(f)2142 3854 y Fp(R)2206 3818 y Fg(\012)p Fl(k)2205 3878 y(C)2299 3854 y Fs(\()p Fp(f)i Fs(\))q(+)q(\010)2540 3866 y Fl(C;k)q(;k)q Fg(\000)p Fn(1)2789 3712 y Fh(#)2838 3854 y Fs(+)2979 3775 y Fh(X)2904 3957 y Fl(f)e Fg(2F)3036 3966 y Fj(k)3071 3957 y Fn(\()p Fl(C)t Fn(\))3189 3854 y Fp(\025)3237 3819 y Fl(C)3237 3874 y(f)3293 3854 y Fp(a)3337 3866 y Fl(f)3380 3854 y Fp(:)456 4124 y Fs(the)24 b(sums)g(are)f(only)g(o)n(v)n(er)f (features)i Fp(f)31 b Fi(2)24 b(F)8 b Fs(\()p Fp(C)e Fs(\),)25 b(and)f(the)g(n)n(um)n(b)r(er)g(\010)2648 4136 y Fl(C;k)q(;k)q Fg(\000)p Fn(1)2922 4124 y Fs(is)g(indep)r(enden)n(t) 456 4273 y(of)30 b Fp(f)36 b Fi(2)28 b(F)773 4285 y Fl(k)814 4273 y Fs(\()p Fp(G)p Fs(\))p Fi(nF)1045 4285 y Fl(k)q Fg(\000)p Fn(1)1170 4273 y Fs(\()p Fp(G)p Fs(\),)k(hence)f(can)f(b)r(e) g(treated)g(essen)n(tially)g(as)f(a)h(constan)n(t.)45 b(F)-7 b(ollo)n(wing)456 4423 y(\(9\),)42 b(w)n(e)e(th)n(us)f(solv)n(e) g(\(16\))g(b)n(y)g(calculating)g(\010)1978 4435 y Fl(C;k)q(;k)q Fg(\000)p Fn(1)2267 4423 y Fs(and)h(making)f(up)r(dates)g Fp(\025)3117 4435 y Fl(f)3204 4423 y Fi(!)k Fp(\025)3378 4393 y Fg(0)3378 4446 y Fl(f)3421 4423 y Fs(,)456 4572 y Fp(z)495 4584 y Fl(C)573 4572 y Fi(!)23 b Fp(z)722 4542 y Fg(0)718 4595 y Fl(C)801 4572 y Fs(of)28 b(the)g(form)991 4830 y Fp(\025)1039 4795 y Fg(0)1039 4850 y Fl(f)1106 4830 y Fs(=)1206 4773 y(1)p 1203 4810 46 4 v 1203 4887 a Fp(k)1273 4830 y Fs(log)1380 4737 y Fh(h)1420 4830 y Fp(z)1459 4842 y Fl(C)1652 4773 y Fp(a)1696 4785 y Fl(f)p 1524 4810 343 4 v 1524 4887 a Fp(\037)18 b Fi(\000)g Fp(k)k Fs(+)c(1)1876 4737 y Fh(i)1934 4830 y Fi(\000)2017 4726 y Fl(k)q Fg(\000)p Fn(1)2018 4751 y Fh(X)2020 4928 y Fl(j)s Fn(=1)2152 4830 y Fp(\025)2200 4795 y Fl(C)2200 4853 y(\034)2238 4836 y Fj(j)2269 4853 y Fl(f)2331 4830 y Fi(\000)2426 4773 y Fs(1)p 2424 4810 46 4 v 2424 4887 a Fp(k)2493 4830 y Fs(log)c Fp(R)2678 4794 y Fg(\012)p Fl(k)2677 4854 y(C)2771 4830 y Fs(\()p Fp(f)9 b Fs(\))p Fp(;)988 5090 y(z)1031 5055 y Fg(0)1027 5110 y Fl(C)1106 5090 y Fs(=)23 b(\010)1254 5102 y Fl(C;k)q(;k)q Fg(\000)p Fn(1)1522 5090 y Fs(+)1681 5011 y Fh(X)1605 5193 y Fl(f)7 b Fg(2F)1737 5202 y Fj(k)1773 5193 y Fn(\()p Fl(G)p Fn(\))1876 4997 y Fh(\020)1926 5090 y Fp(e)1965 5055 y Fl(k)q(\025)2040 5030 y Fj(C)2040 5072 y(f)2111 5090 y Fi(\000)18 b Fs(1)2236 4997 y Fh(\021)2285 5090 y Fp(e)2324 5003 y Fb(P)2394 5065 y Fj(j)2436 5046 y Fl(k)q(\025)2511 5021 y Fj(C)2511 5073 y(\034)2544 5060 y(j)2576 5073 y(f)2618 5090 y Fp(R)2682 5054 y Fg(\012)p Fl(k)2681 5114 y(C)2774 5090 y Fs(\()p Fp(f)9 b Fs(\))p Fp(:)p eop end %%Page: 15 15 TeXDict begin 15 14 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(15)1090 450 y Fs(7.)41 b Fr(Constraints)31 b(in)h(the)f(sequential)h(models)555 649 y Fs(W)-7 b(e)41 b(no)n(w)e(come)h(to)g(discussing)f(the)i(natural)e(form)h(of)g(the)g (constrain)n(ts)f Fp(a)3046 661 y Fl(f)3089 649 y Fs(,)k(and)d(the)456 799 y(probabilistic)27 b(in)n(terpretation)h(of)h(sequen)n(tial)f(mo)r (dels.)40 b(In)29 b(the)g(follo)n(wing,)f(w)n(e)g(shall)h(denote)456 948 y(the)f Fp(j)5 b Fs(-gram)26 b(complexit)n(y)h(of)g Fp(s)h Fs(b)n(y)1569 1167 y Fp(\037)1621 1179 y Fl(j)1656 1167 y Fs(\()p Fp(s)p Fs(\))23 b(=)1946 1088 y Fh(X)1870 1270 y Fl(f)7 b Fg(2F)2002 1279 y Fj(k)2038 1270 y Fn(\()p Fl(G)p Fn(\))2155 1167 y Fp(f)i Fs(\()p Fp(s)p Fs(\))p Fp(:)456 1433 y Fs(Note)27 b(that)h(if)g Fp(s)23 b Fs(=)g Fp(x)1109 1445 y Fn(1)1165 1433 y Fi(\005)18 b(\001)c(\001)g(\001)k (\005)g Fp(x)1447 1445 y Fl(\037)1493 1433 y Fs(,)28 b(then)g Fp(\037)1785 1445 y Fl(j)1820 1433 y Fs(\()p Fp(s)p Fs(\))c(=)e Fp(\037)d Fi(\000)f Fp(j)23 b Fs(+)18 b(1.)456 1655 y(7.1.)40 b Fx(Bigram)32 b(mo)s(del.)40 b Fs(W)-7 b(e)28 b(can)g(build)h(a)f(pure)g(w)n(ord)f(bigram)2518 1623 y Fn(2)2579 1655 y Fs(mo)r(del)h(b)n(y)g(taking)g(the)g(set)456 1805 y Fp(G)g Fs(of)f(regular)f(expressions)g(as)728 2024 y Fp(G)d Fs(=)f Fi(f)p Ff("[^[:alpha:]])p Fs(\()p Ff([[:a)o(lp)o(ha:)o(]])o(+)p Fs(\))p Ff([^)o([:a)o(lp)o(ha)o(:]])o(+)p Fs(\()p Ff([[)o(:a)o(lph)o(a:)o(]]+)o Fs(\))p Ff(")-6 b Fp(;)-2864 b Fs(\(17\))959 2210 y Ff("^)p Fs(\()p Ff([[:alpha:]]+)p Fs(\))p Ff([^[)o(:al)o(ph)o(a:)o(]]+)o Fs(\()p Ff([[:)o(al)o(pha)o(:])o (]+)p Fs(\))p Ff(")-7 b Fi(g)p Fp(:)456 2429 y Fs(Ev)n(ery)24 b(time)i(a)f(matc)n(h)h(\()p Fp(s)1268 2441 y Fn(1)1305 2429 y Fp(;)14 b(s)1381 2441 y Fn(2)1418 2429 y Fs(\))26 b(is)g(found)g(in)g(the)g(corpus)f Fp(C)6 b Fs(,)26 b(it)h(is)e(con)n (v)n(erted)f(in)n(to)i(the)g(tok)n(en)456 2579 y Fp(t)k Fs(=)g Fp(s)650 2591 y Fn(1)708 2579 y Fi(\005)21 b Fp(s)810 2591 y Fn(2)847 2579 y Fs(.)50 b(Let)32 b(us)g(call)f(an)n(y)g(alphab)r (etic)h(w)n(ord)f(suc)n(h)g(as)h Fp(s)2456 2591 y Fn(1)2525 2579 y Fs(or)f Fp(s)2670 2591 y Fn(2)2739 2579 y Fs(a)g Fq(state)p Fs(.)50 b(Then)32 b(from)456 2728 y(\(11\))o(,)c(w)n(e)f(ha) n(v)n(e)g(for)g(an)n(y)f(string)h Fp(s)h Fs(with)g(complexit)n(y)f Fp(\037)2217 2740 y Fn(2)2254 2728 y Fs(\()p Fp(s)p Fs(\),)456 2984 y(\(18\))82 b Fm(P)737 2996 y Fl(C)793 2984 y Fs(\()p Fp(s)p Fs(\))23 b(=)1007 2906 y Fh(Y)1013 3080 y Fl(x;y)1143 2963 y Fh(e)1127 2984 y Fp(R)1190 2996 y Fl(C)1246 2984 y Fs(\()p Fp(x)c Fi(\005)f Fp(y)s Fs(\))1480 2950 y Fl(f)1512 2958 y Fj(x)p Fc(\005)p Fj(y)1612 2950 y Fn(\()p Fl(s)p Fn(\))1699 2984 y Fp(;)1301 3345 y Fs(where)1556 3324 y Fh(e)1541 3345 y Fp(R)1604 3357 y Fl(C)1660 3345 y Fs(\()p Fp(x)h Fi(\005)f Fp(y)s Fs(\))23 b Fi(/)2004 3150 y Fh(8)2004 3225 y(>)2004 3250 y(<)2004 3399 y(>)2004 3424 y(:)2078 3271 y Fp(e)2117 3241 y Fl(\025)2156 3249 y Fj(x)p Fc(\005)p Fj(y)2260 3271 y Fp(R)2323 3283 y Fl(C)2379 3271 y Fs(\()p Fp(x)p Fs(\))p Fp(R)2553 3283 y Fl(C)2610 3271 y Fs(\()p Fp(y)s Fs(\))83 b(if)28 b Fp(f)2918 3283 y Fl(x)p Fg(\005)p Fl(y)3052 3271 y Fi(2)c(F)8 b Fs(\()p Fp(C)e Fs(\),)2078 3450 y Fp(R)2141 3462 y Fl(C)2197 3450 y Fs(\()p Fp(x)p Fs(\))p Fp(R)2371 3462 y Fl(C)2428 3450 y Fs(\()p Fp(y)s Fs(\))265 b(otherwise,)456 3639 y(and)36 b(where)g(the)h(pro)r(duct)f(extends)h(o)n(v)n(er)e(all)h (p)r(ossible)g(pairs)g(of)g(states,)i(and)f Fp(f)3089 3651 y Fl(x)p Fg(\005)p Fl(y)3237 3639 y Fs(is)f(the)456 3789 y(feature)26 b(asso)r(ciated)f(with)i(the)g(tok)n(en)f Fp(x)17 b Fi(\005)f Fp(y)s Fs(,)27 b(whic)n(h)f(coun)n(ts)h(the)g(n)n (um)n(b)r(er)f(of)g(o)r(ccurrences)g(of)456 3938 y Fp(x)19 b Fi(\005)e Fp(y)s Fs(.)555 4088 y(No)n(w)27 b(de\014ne)456 4306 y(\(19\))436 b Fp(\027)5 b Fs(\()p Fp(x)p Fs(\))25 b(=)1309 4228 y Fh(X)1351 4402 y Fl(y)1459 4285 y Fh(e)1443 4306 y Fp(R)1506 4318 y Fl(C)1562 4306 y Fs(\()p Fp(x)19 b Fi(\005)f Fp(y)s Fs(\))p Fp(;)97 b(P)12 b Fs(\()p Fp(x;)i(y)s Fs(\))23 b(=)2300 4285 y Fh(e)2284 4306 y Fp(R)2347 4318 y Fl(C)2403 4306 y Fs(\()p Fp(x)c Fi(\005)f Fp(y)s Fs(\))p Fp(=\027)5 b Fs(\()p Fp(x)p Fs(\))p Fp(;)456 4580 y Fs(whic)n(h)29 b(giv)n(es)901 4518 y Fh(P)988 4605 y Fl(y)1042 4580 y Fp(P)12 b Fs(\()p Fp(x;)i(y)s Fs(\))27 b(=)f(1)k(for)f(all)g Fp(x)p Fs(,)i(and)f(note)f(that)2369 4518 y Fh(P)2456 4605 y Fl(x)2512 4580 y Fp(\027)5 b Fs(\()p Fp(x)p Fs(\))28 b(=)e(1)j(b)r(ecause)3184 4559 y Fh(e)3169 4580 y Fp(R)3232 4592 y Fl(C)3317 4580 y Fs(is)h(a)456 4730 y(probabilit)n(y)d(measure)g (o)n(v)n(er)g(all)h(p)r(ossible)g(tok)n(ens,)g(Inserting)h(\(19\))f(in) n(to)g(\(18\),)h(and)f(noticing)456 4879 y(that)23 b(the)h(second)f (pro)r(duct)g(b)r(elo)n(w)h(has)f(only)g Fp(\037)1947 4891 y Fn(2)1984 4879 y Fs(\()p Fp(C)6 b Fs(\))24 b(terms)f(\(all)h (other)f(exp)r(onen)n(ts)g(are)f(zero\),)p 456 4988 499 4 v 555 5061 a Fn(2)588 5087 y Fw(W)-6 b(e)21 b(reserv)n(e)g(the)g (term)f(digram)f(for)h(a)g(c)n(haracter)i(pair.)29 b(A)20 b(bigram)g(can)h(b)r(e)f(consecutiv)n(e)i(w)n(ords,)f(or)e(more)456 5211 y(generally)24 b(an)n(y)g(t)n(w)n(o)g(strings)f(tagged)j(b)n(y)e (a)g(regular)f(expression.)p eop end %%Page: 16 16 TeXDict begin 16 15 bop 456 251 a Fn(16)1212 b(L.A.)22 b(BREYER)456 450 y Fs(whic)n(h)30 b(w)n(e)g(can)h(en)n(umerate)f(as)g (successiv)n(e)f(pairs)g(in)i(the)g(sequence)f Fp(x)2722 462 y Fn(0)2760 450 y Fp(;)14 b(x)2844 462 y Fn(1)2882 450 y Fp(;)g(:)g(:)g(:)f(;)h(x)3113 465 y Fl(\037)3154 473 y Fk(1)3188 465 y Fn(\()p Fl(C)t Fn(\))3295 450 y Fs(,)32 b(w)n(e)456 600 y(obtain)1172 879 y Fm(P)1223 891 y Fl(C)1279 879 y Fs(\()p Fp(s)p Fs(\))23 b(=)1493 737 y Fh( )1559 800 y(Y)1565 974 y Fl(x;y)1679 879 y Fp(\027)5 b Fs(\()p Fp(x)p Fs(\))1836 844 y Fl(f)1868 852 y Fj(x)p Fc(\005)p Fj(y)1969 844 y Fn(\()p Fl(s)p Fn(\))2056 762 y Fh(\023)2131 800 y(Y)2138 974 y Fl(x;y)2251 879 y Fp(P)12 b Fs(\()p Fp(x;)i(y)s Fs(\))2508 844 y Fl(f)2540 852 y Fj(x)p Fc(\005)p Fj(y)2640 844 y Fn(\()p Fl(s)p Fn(\))1405 1202 y Fs(=)23 b Fp(\031)s Fs(\()p Fp(s)p Fs(\))1660 1091 y Fl(\037)1701 1099 y Fk(2)1735 1091 y Fn(\()p Fl(C)t Fn(\))1696 1123 y Fh(Y)1695 1299 y Fl(t)p Fn(=0)1852 1202 y Fp(P)1917 1135 y Fh(\000)1955 1202 y Fp(x)2002 1214 y Fl(t)2032 1202 y Fp(;)14 b(x)2116 1214 y Fl(t)p Fn(+1)2229 1135 y Fh(\001)2267 1202 y Fp(:)456 1499 y Fs(When)20 b(sev)n(eral)d(sequences)i(are)f(p)r(ossible,)j(w)n (e)e(c)n(ho)r(ose)f(the)i(minimal)f(one)g(under)g(lexicographic)456 1649 y(ordering.)35 b(F)-7 b(rom)27 b(the)h(measure)f Fp(\031)s Fs(\()p Fp(s)p Fs(\),)h(w)n(e)f(de\014ne)1184 1924 y Fp(\031)s Fs(\()p Fp(x)1313 1936 y Fn(0)1352 1924 y Fs(\))c(=)g Fp(\031)1545 1856 y Fh(\000)1583 1924 y Fi(f)p Fp(s)g Fs(:)g Fp(s)g Fs(=)f Fp(x)1929 1936 y Fn(0)1985 1924 y Fi(\005)c Fp(x)2092 1936 y Fn(1)2149 1924 y Fi(\005)g(\001)c (\001)g(\001)k(\005)g Fp(x)2431 1939 y Fl(\037)2472 1947 y Fk(1)2505 1939 y Fn(\()p Fl(C)t Fn(\))2613 1924 y Fi(g)2655 1856 y Fh(\001)2692 1924 y Fp(;)456 2199 y Fs(and)24 b(using)g(the)h(facts)f(that)1337 2136 y Fh(P)1425 2224 y Fl(s)1474 2199 y Fm(P)1525 2211 y Fl(C)1581 2199 y Fs(\()p Fp(s)p Fs(\))g(=)e(1)i(and)2019 2136 y Fh(P)2107 2224 y Fl(y)2161 2199 y Fp(P)12 b Fs(\()p Fp(x;)i(y)s Fs(\))23 b(=)g(1)h(together,)g(it)h(follo)n(ws)e(that)456 2286 y Fh(P)543 2373 y Fl(x)599 2348 y Fp(\031)s Fs(\()p Fp(x)p Fs(\))h(=)f(1.)36 b(Th)n(us)25 b Fp(\031)k Fs(can)d(no)n(w)f(b)r (e)h(seen)g(as)f(the)h(initial)g(distribution)g(of)g(a)f(\014nite)i (Mark)n(o)n(v)456 2498 y(c)n(hain)g Fp(X)744 2510 y Fn(0)781 2498 y Fp(;)14 b(:)g(:)g(:)f(;)h(X)1034 2513 y Fl(\037)1075 2521 y Fk(1)1108 2513 y Fn(\()p Fl(C)t Fn(\))1243 2498 y Fs(with)28 b(la)n(w)f Fm(P)1633 2510 y Fl(C)1689 2498 y Fs(,)456 2824 y(\(20\))209 b Fm(P)864 2732 y Fh(h)903 2824 y Fp(X)972 2836 y Fn(0)1032 2824 y Fs(=)23 b Fp(x)1167 2836 y Fn(0)1205 2824 y Fp(;)14 b(X)1311 2836 y Fn(1)1371 2824 y Fs(=)22 b Fp(x)1505 2836 y Fn(1)1543 2824 y Fp(;)14 b(:)g(:)g(:)g(;)g(X)1797 2839 y Fl(\037)p Fn(\()p Fl(C)t Fn(\))1969 2824 y Fs(=)22 b Fp(x)2103 2839 y Fl(\037)p Fn(\()p Fl(C)t Fn(\))2253 2732 y Fh(i)2315 2824 y Fs(=)h Fp(\031)s Fs(\()p Fp(x)2532 2836 y Fn(0)2570 2824 y Fs(\))2616 2713 y Fl(\037)2657 2721 y Fk(2)2690 2713 y Fn(\()p Fl(C)t Fn(\))2652 2745 y Fh(Y)2650 2921 y Fl(t)p Fn(=0)2807 2824 y Fp(P)12 b Fs(\()p Fp(x)2951 2836 y Fl(t)2981 2824 y Fp(;)i(x)3065 2836 y Fl(t)p Fn(+1)3179 2824 y Fs(\))p Fp(:)456 3125 y Fs(If)31 b(w)n(e)f(compare)g(\(20\))g(with)i(\(18\))o (,)g(w)n(e)f(see)f(that)h Fp(f)2063 3137 y Fl(x)p Fg(\005)p Fl(y)2174 3125 y Fs(\()p Fp(C)6 b Fs(\))32 b(m)n(ust)f(b)r(e)g(the)h (empirical)e(n)n(um)n(b)r(er)456 3275 y(of)f(transitions)f Fi(f)p Fp(X)1076 3287 y Fl(t)1131 3275 y Fs(=)e Fp(x;)14 b(X)1375 3287 y Fl(t)p Fn(+1)1514 3275 y Fs(=)26 b Fp(y)s Fi(g)i Fs(in)i(the)g(corpus)e Fp(C)6 b Fs(,)30 b(and)g(if)g(w)n(e)f (pro)r(ceed)f(as)h(b)r(efore)g(in)456 3424 y(the)f(default)g(mo)r(del,) f(w)n(e)h(should)f(tak)n(e)g Fp(a)1757 3436 y Fl(f)1823 3424 y Fs(=)c Fp(f)9 b Fs(\()p Fp(C)d Fs(\).)456 3721 y(7.2.)40 b Fx(Pure)f Fp(n)p Fx(-gram)g(mo)s(dels.)g Fs(More)33 b(generally)-7 b(,)33 b(it)i(also)d(mak)n(es)h(sense)g(to)g (tag)g Fp(n)p Fs(-grams)456 3871 y(via)27 b(a)g(suitable)g(set)g(of)h (expressions)e Fp(G)p Fs(.)37 b(Since)27 b(regular)f(expressions)g (cannot)h(straddle)g(new-)456 4020 y(line)32 b(c)n(haracters,)e(there)i (are)f(diminishing)h(returns)f(with)h(this)g(idea)g(in)g(the)g(curren)n (t)f Fx(dbacl)456 4169 y Fs(implemen)n(tation.)k(Ho)n(w)n(ev)n(er,)23 b(since)g(regular)f(expression)g(matc)n(hing)h(is)g(often)h(p)r (olynomial)f(in)456 4319 y(the)29 b(size)g(of)g(the)g(string,)g(this)h (limitation)f(ensures)f(acceptable)h(training)f(and)h(classi\014cation) 456 4468 y(sp)r(eed.)555 4618 y(When)35 b(matc)n(hing)e Fp(n)p Fs(-grams,)g(w)n(e)h(pro)r(ceed)f(as)g(in)h(the)g(bigram)f (example,)i(and)e(obtain)h(a)456 4767 y(c)n(haracterization)20 b(of)j Fm(P)1199 4779 y Fl(C)1278 4767 y Fs(as)f(a)g(random)h(\014eld.) 35 b(T)-7 b(ok)n(ens)22 b(ha)n(v)n(e)g(the)h(form)g Fp(t)g Fs(=)g Fp(x)2930 4779 y Fn(1)2976 4767 y Fi(\005)9 b Fp(x)3074 4779 y Fn(2)3121 4767 y Fi(\005)g(\001)14 b(\001)g(\001)9 b(\005)g Fp(x)3376 4779 y Fl(n)3421 4767 y Fs(,)456 4917 y(and)39 b(a)h(string)f Fp(s)h Fs(with)g(complexit)n(y)g Fp(\037)1726 4929 y Fn(1)1763 4917 y Fs(\()p Fp(s)p Fs(\))g(is)g(in)n (terpreted)f(as)h(a)f Fq(c)l(on\014gur)l(ation)h Fs(of)g Fp(\037)3304 4929 y Fn(1)3341 4917 y Fs(\()p Fp(s)p Fs(\))456 5066 y(distinct)29 b(sites.)41 b(Then)29 b(from)g(\(7\),)h(the)f (measure)f Fm(P)2074 5078 y Fl(C)2159 5066 y Fs(is)h(a)f(Gibbs)h (random)f(\014eld)i(where)e(eac)n(h)456 5216 y(site)f(in)n(teracts)g (with)h(at)g(most)f Fp(n)18 b Fi(\000)g Fs(1)27 b(others.)p eop end %%Page: 17 17 TeXDict begin 17 16 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(17)555 450 y Fs(F)-7 b(or)27 b(a)g(non-symmetric)g (form)g(similar)g(to)h(\(19\))o(,)g(w)n(e)f(can)g(also)g(de\014ne)676 753 y Fh(e)660 774 y Fp(R)723 786 y Fl(C)779 774 y Fs(\()p Fp(x)858 786 y Fn(1)915 774 y Fi(\005)18 b(\001)c(\001)g(\001)k(\005)g Fp(x)1197 786 y Fl(n)1243 774 y Fs(\))23 b Fi(/)1386 579 y Fh(8)1386 654 y(>)1386 679 y(<)1386 828 y(>)1386 853 y(:)1459 699 y Fs(exp)1586 632 y Fh(\000)1624 699 y Fp(\025)1672 711 y Fl(x)1710 719 y Fk(1)1743 711 y Fg(\005\001\001\001)o(\005)p Fl(x)1908 719 y Fj(n)1952 632 y Fh(\001)2004 637 y(Q)2083 658 y Fl(n)2083 724 y(k)q Fn(=1)2221 699 y Fp(R)2284 711 y Fl(C)2340 699 y Fs(\()p Fp(x)2419 711 y Fl(k)2461 699 y Fs(\))83 b(if)28 b Fp(f)2693 711 y Fl(x)2731 719 y Fk(1)2763 711 y Fg(\005\001\001\001)o(\005)p Fl(x)2928 719 y Fj(n)2996 699 y Fi(2)23 b(F)8 b Fs(\()p Fp(C)e Fs(\))1459 817 y Fh(Q)1538 837 y Fl(n)1538 904 y(k)q Fn(=1)1677 879 y Fp(R)1740 891 y Fl(C)1795 879 y Fs(\()p Fp(x)1874 891 y Fl(k)1916 879 y Fs(\))628 b(otherwise,)717 1070 y Fp(\027)5 b Fs(\()p Fp(x)842 1082 y Fn(1)880 1070 y Fp(;)14 b(:)g(:)g(:)g(;)g(x)1112 1082 y Fl(n)p Fg(\000)p Fn(1)1243 1070 y Fs(\))23 b(=)1386 992 y Fh(X)1428 1166 y Fl(y)1535 1049 y Fh(e)1519 1070 y Fp(R)1582 1082 y Fl(C)1638 1070 y Fs(\()p Fp(x)1717 1082 y Fn(1)1774 1070 y Fi(\005)18 b(\001)c(\001)g(\001)k(\005)g Fp(x)2056 1082 y Fl(n)p Fg(\000)p Fn(1)2205 1070 y Fi(\005)g Fp(y)s Fs(\))p Fp(;)618 1323 y(P)12 b Fs(\()p Fp(x)762 1335 y Fn(1)800 1323 y Fp(;)i(:)g(:)g(:)f(;)h(x)1031 1335 y Fl(n)p Fg(\000)p Fn(1)1162 1323 y Fs(;)g Fp(y)s Fs(\))23 b(=)1401 1302 y Fh(e)1386 1323 y Fp(R)1449 1335 y Fl(C)1504 1323 y Fs(\()p Fp(x)1583 1335 y Fn(1)1640 1323 y Fi(\005)18 b(\001)c(\001)g(\001)k(\005)g Fp(x)1922 1335 y Fl(n)p Fg(\000)p Fn(1)2071 1323 y Fi(\005)g Fp(y)s Fs(\))p Fp(=\027)5 b Fs(\()p Fp(x)2374 1335 y Fn(1)2412 1323 y Fp(;)14 b(:)g(:)g(:)f(;)h (x)2643 1335 y Fl(n)p Fg(\000)p Fn(1)2774 1323 y Fs(\))p Fp(;)456 1568 y Fs(and)27 b(then)h(w)n(e)f(obtain)h(the)g(higher)f (order)f(Mark)n(o)n(vian)f(form)960 1850 y Fm(P)1011 1862 y Fl(C)1066 1850 y Fs(\()p Fp(s)p Fs(\))f(=)f Fp(\031)s Fs(\()p Fp(x)1410 1862 y Fn(0)1448 1850 y Fp(;)14 b(:)g(:)g(:)f(;)h(x) 1679 1862 y Fl(n)p Fg(\000)p Fn(2)1810 1850 y Fs(\))1856 1739 y Fl(\037)1897 1747 y Fj(n)1938 1739 y Fn(\()p Fl(C)t Fn(\))1896 1771 y Fh(Y)1894 1947 y Fl(t)p Fn(=0)2056 1850 y Fp(P)2121 1782 y Fh(\000)2159 1850 y Fp(x)2206 1862 y Fl(t)2235 1850 y Fp(;)g(:)g(:)g(:)g(;)g(x)2467 1862 y Fl(t)p Fn(+)p Fl(n)p Fg(\000)p Fn(2)2673 1850 y Fs(;)g Fp(x)2757 1862 y Fl(t)p Fn(+)p Fl(n)2879 1782 y Fh(\001)2917 1850 y Fp(:)456 2120 y Fs(The)24 b(measure)g Fp(\031)k Fs(is)c(a)g(probabilit)n(y)-7 b(,)24 b(as)g(is)h(apparen)n(t) e(from)h(using)g(the)h(relations)3010 2058 y Fh(P)3097 2145 y Fl(s)3147 2120 y Fm(P)3198 2132 y Fl(C)3253 2120 y Fs(\()p Fp(s)p Fs(\))f(=)456 2270 y(1,)31 b(and)717 2207 y Fh(P)805 2295 y Fl(y)859 2270 y Fp(P)12 b Fs(\()p Fp(x)1003 2282 y Fn(1)1041 2270 y Fp(;)i(:)g(:)g(:)f(;)h(x)1272 2282 y Fl(n)p Fg(\000)p Fn(1)1403 2270 y Fs(;)g Fp(y)s Fs(\))29 b(=)f(1.)48 b(Comparing)29 b(with)j(\(11\),)g(w)n(e)f(\014nd)g (once)g(again)f(that)456 2419 y(w)n(e)d(should)g(tak)n(e)g Fp(a)1065 2431 y Fl(f)1131 2419 y Fs(=)c Fp(f)9 b Fs(\()p Fp(C)d Fs(\).)456 2675 y(7.3.)40 b Fx(General)34 b(sequen)m(tial)f(mo)s (dels.)39 b Fs(F)-7 b(or)29 b(a)g(general)e(sequen)n(tial)i(set)g Fp(G)p Fs(,)h(the)g(in)n(terp)r(eta-)456 2825 y(tion)35 b(is)h(essen)n(tially)f(the)h(same.)61 b(Supp)r(ose)35 b(that)h Fp(G)h Fs(matc)n(hes)e Fp(k)s Fs(-grams)f(for)h Fp(k)k Fs(=)d(1)p Fp(;)14 b(:)g(:)g(:)g(;)g(n)p Fs(.)456 2974 y(F)-7 b(rom)30 b(\(11\))o(,)i(it)f(is)f(apparen)n(t)f(that)i(the) g(Maxim)n(um)f(En)n(trop)n(y)f(mo)r(del)i(asso)r(ciated)e(with)i Fp(G)g Fs(is)456 3123 y(an)j Fp(n)p Fs(-gram)g(mo)r(del)h(based)f(not)h (on)g Fm(R)1706 3135 y Fl(C)1762 3123 y Fs(,)i(but)e(rather)f Fm(P)2289 3135 y Fl(C;n)p Fg(\000)p Fn(1)2487 3123 y Fs(.)59 b(The)35 b(latter)g(measure)f(is)h(a)456 3273 y(smo)r(othed)c(v)n(ersion)e(of)i Fm(R)1279 3285 y Fl(C)1335 3273 y Fs(,)h(since)f(when)h(an)f(unkno)n(wn)f(feature)h Fp(f)38 b Fi(2)29 b(F)2801 3285 y Fl(n)2846 3273 y Fs(\()p Fp(G)p Fs(\))p Fi(nF)8 b Fs(\()p Fp(C)e Fs(\))33 b(is)e(en-)456 3422 y(coun)n(tered,)i(in)h(the)g(former)e(case)g(the)i(asso)r(ciated)e (tok)n(en)g Fp(x)2398 3434 y Fn(1)2458 3422 y Fi(\005)22 b(\001)14 b(\001)g(\001)22 b(\005)g Fp(x)2752 3434 y Fl(n)2831 3422 y Fs(is)33 b(predicted)g(only)456 3572 y(from)e(the)h(digramic)f(reference)g(measure)g Fm(R)1890 3584 y Fl(C)1945 3572 y Fs(,)i(while)f(in)g(the)h(latter)e(case,)h(an)n (y)f(recognized)456 3721 y(subset)c Fp(x)757 3733 y Fn(1)813 3721 y Fi(\005)18 b(\001)c(\001)g(\001)19 b(\005)f Fp(x)1096 3733 y Fl(k)1165 3721 y Fs(for)27 b Fp(k)f(<)c(n)28 b Fs(is)f(tak)n(en)g(in)n(to)g(accoun)n(t)g(as)g(w)n(ell.)555 3871 y(Since)k(the)g(nature)g(of)g(the)g(mo)r(del)g(is)g(nev)n (ertheless)e(an)i Fp(n)p Fs(-gram)e(mo)r(del,)j(it)f(mak)n(es)f(sense) 456 4020 y(to)36 b(tak)n(e)f Fp(a)798 4032 y Fl(f)879 4020 y Fs(=)i Fp(f)9 b Fs(\()p Fp(C)d Fs(\))37 b(for)f Fp(f)46 b Fi(2)38 b(F)1573 4032 y Fl(n)1618 4020 y Fs(\()p Fp(G)p Fs(\))25 b Fi(\\)f(F)8 b Fs(\()p Fp(C)e Fs(\).)64 b(No)n(w)36 b(the)h(recursiv)n(e)d(in)n(terpretation)i(of)456 4169 y Fm(P)507 4181 y Fl(C;n)p Fg(\000)p Fn(1)744 4169 y Fs(means)k(that)g(it)g(corresp)r(onds)e(to)i(a)g(maxim)n(um)f(en)n (trop)n(y)g(\()p Fp(n)27 b Fi(\000)f Fs(1\)-gram)38 b(mo)r(del,)456 4319 y(whic)n(h)29 b(suggests)g(w)n(e)h(tak)n(e)f(also)g Fp(a)1542 4331 y Fl(f)1611 4319 y Fs(=)e Fp(f)9 b Fs(\()p Fp(C)d Fs(\))30 b(for)g Fp(f)35 b Fi(2)27 b(F)2260 4331 y Fl(n)p Fg(\000)p Fn(1)2390 4319 y Fs(\()p Fp(G)p Fs(\))21 b Fi(\\)f(F)8 b Fs(\()p Fp(C)e Fs(\),)32 b(and)e(so)f(on,)h(un)n(til) 456 4468 y(w)n(e)d(arriv)n(e)f(at)h(a)g(complete)h(sp)r(eci\014cation)f (of)g(the)h(constrain)n(ts.)555 4618 y Fx(Remark.)45 b Fs(The)30 b(smo)r(othing)g(just)h(describ)r(ed)f(do)r(esn't)h(tak)n (e)f(in)n(to)g(accoun)n(t)f(all)h(the)h(p)r(os-)456 4767 y(sible)i Fp(k)s Fs(-gram)e(subsets)i(of)g Fp(x)1382 4779 y Fn(1)1442 4767 y Fi(\005)21 b(\001)14 b(\001)g(\001)22 b(\005)g Fp(x)1735 4779 y Fl(k)1776 4767 y Fs(,)35 b(as)d(one)h(migh)n (t)g(exp)r(ect.)54 b(When)34 b(the)f(complexit)n(y)456 4917 y Fp(\037)508 4929 y Fl(n)553 4917 y Fs(\()p Fp(s)p Fs(\))i(is)h(suitably)f(large,)g(the)h(appro)n(ximation)d(\(13\))i(is)g (certainly)f(go)r(o)r(d)h(enough,)i(and)e(of)456 5066 y(course)25 b(the)j(large)d(deviations)i(tak)n(e)f(e\013ect.)37 b(F)-7 b(or)27 b(small)f(v)-5 b(alues)27 b(of)g Fp(\037)2637 5078 y Fl(n)2682 5066 y Fs(\()p Fp(s)p Fs(\),)h(there)f(is)g(ro)r(om)f (for)456 5216 y(impro)n(v)n(emen)n(t,)32 b(whic)n(h)g(can)g(b)r(e)g (handled)g(b)n(y)g(more)g(general)e(smo)r(othing.)51 b(A)32 b(general)f(form)p eop end %%Page: 18 18 TeXDict begin 18 17 bop 456 251 a Fn(18)1212 b(L.A.)22 b(BREYER)456 450 y Fs(can)27 b(b)r(e)h(obtained)f(with)h(a)f (probabilit)n(y)g(measure)g Fp(\026)2119 462 y Fl(n)2164 450 y Fs(:)1196 679 y Fp(f)1237 691 y Fl(a)1273 699 y Fk(1)1305 691 y Fg(\005\001\001\001)o(\005)p Fl(a)1468 700 y Fj(k)1509 679 y Fs(\()p Fp(s)p Fs(\))c Fi(\031)1953 600 y Fh(X)1723 782 y Fl(a)1759 790 y Fk(1)1791 782 y Fg(\005\001\001\001)o(\005)p Fl(a)1954 791 y Fj(k)1991 782 y Fg(\022)p Fl(t)p Fg(2F)2161 790 y Fj(n)2201 782 y Fn(\()p Fl(G)p Fn(\))2318 679 y Fp(\026)2368 691 y Fl(n)2413 679 y Fs(\()p Fp(t)p Fs(\))p Fp(f)2548 691 y Fl(t)2578 679 y Fs(\()p Fp(s)p Fs(\))p Fp(;)456 950 y Fs(where)i(the)i(sum)g(is)f(o)n(v)n(er)e(those)j Fp(n)p Fs(-grams)d Fp(t)i Fs(whic)n(h)h(con)n(tain)e Fp(a)2435 962 y Fn(1)2488 950 y Fi(\005)16 b(\001)e(\001)g(\001)i(\005)f Fp(a)2760 962 y Fl(k)2827 950 y Fs(as)26 b(a)g(subset.)37 b(This)456 1099 y(p)r(oten)n(tial)30 b(impro)n(v)n(emen)n(t)f(is)i(not) f(implemen)n(ted)h(in)g Fx(dbacl)g Fs(due)g(to)f(the)h(added)f (complexit)n(y)456 1249 y(of)d(calculation.)1094 1519 y(8.)41 b Fr(Text)32 b(classifica)-6 b(tion)32 b(and)f(mixed)g(models) 555 1718 y Fs(The)41 b(equations)e(for)h(text)g(classi\014cation)f(are) g(obtained)h(b)n(y)g(inserting)h(\(10\))f(and)g(\(11\))456 1868 y(directly)27 b(in)n(to)g(\(1\).)456 2103 y(8.1.)40 b Fx(Simple)j(case.)e Fs(Ma)5 b(jor)37 b(simpli\014cations)h(o)r(ccur)g (when)g(comparing)f(sev)n(eral)g(corp)r(ora)456 2252 y Fp(C)515 2264 y Fn(1)552 2252 y Fp(;)14 b(:)g(:)g(:)g(C)759 2264 y Fl(k)824 2252 y Fs(whose)23 b(mo)r(del)h(probabilities)f(are)g (based)h(up)r(on)g(the)g(same)g(set)g(of)g(regular)e(expres-)456 2402 y(sions)k Fp(G)p Fs(.)36 b(If)28 b Fp(s)e Fs(is)h(a)f(string)g(to) g(b)r(e)i(classi\014ed,)e(then)h(its)g(complexit)n(y)f Fp(\037)p Fs(\()p Fp(s)p Fs(\))h(is)f(the)i(same)e(under)456 2551 y(eac)n(h)g(mo)r(del,)i(as)f(are)g(the)h(feature)f(coun)n(ts)g Fi(f)p Fp(f)9 b Fs(\()p Fp(s)p Fs(\))23 b(:)g Fp(f)31 b Fi(2)24 b(F)8 b Fs(\()p Fp(G)p Fs(\))p Fi(g)p Fs(.)37 b(Consequen)n(tly)-7 b(,)27 b(w)n(e)g(ha)n(v)n(e)515 2812 y Fm(P)p Fs(\()p Fp(C)657 2824 y Fl(j)706 2812 y Fi(j)14 b Fp(s)p Fs(\))23 b(=)g Fp(K)1002 2777 y Fg(\000)p Fn(1)1104 2812 y Fs(exp)1231 2719 y Fh(\020)1281 2733 y(X)1328 2907 y Fl(t)1415 2812 y Fp(f)1456 2824 y Fl(t)1484 2812 y Fs(\()p Fp(s)p Fs(\))14 b(log)1738 2791 y Fh(e)1723 2812 y Fp(R)1786 2824 y Fl(C)1834 2832 y Fj(j)1869 2812 y Fs(\()p Fp(t)p Fs(\))1963 2719 y Fh(\021)2013 2812 y Fp(;)97 b(K)28 b Fs(=)2361 2708 y Fl(k)2320 2733 y Fh(X)2322 2910 y Fl(j)s Fn(=1)2454 2812 y Fs(exp)2580 2719 y Fh(\020)2630 2733 y(X)2677 2907 y Fl(t)2764 2812 y Fp(f)2805 2824 y Fl(t)2834 2812 y Fs(\()p Fp(s)p Fs(\))14 b(log)3088 2791 y Fh(e)3072 2812 y Fp(R)3135 2824 y Fl(C)3183 2832 y Fj(j)3218 2812 y Fs(\()p Fp(t)p Fs(\))3312 2719 y Fh(\021)3362 2812 y Fp(:)456 3074 y Fs(These)31 b(equations)g(are)g (used)h(b)n(y)g Fx(dbacl)g Fs(whenev)n(er)f(the)h(comp)r(eting)g (categories)e(are)h(based)456 3224 y(on)24 b(the)h(same)f(set)h(of)f (regular)f(expressions.)34 b(This)25 b(do)r(es)f(not)h(apply)g(if)g (the)g(mo)r(dels)f(are)g(based)456 3373 y(on)36 b(functionally)g(equiv) -5 b(alen)n(t)37 b(expressions)e(whose)g(string)h(represen)n(tations)f (are)g(di\013eren)n(t.)456 3523 y(Ev)-5 b(aluation)29 b(of)i(the)g(sums)g(for)f(eac)n(h)h(category)d(can)j(b)r(e)g(done)g (sim)n(ultaneously)f(as)g(the)h(data)456 3672 y(is)g(read,)g(obtaining) g(an)f Fp(O)r Fs(\()p Fp(n)p Fs(\))j(classi\014cation)d(in)h(the)h(n)n (um)n(b)r(er)f Fp(n)g Fs(of)g(lines.)47 b(As)32 b(eac)n(h)e(line)i(is) 456 3821 y(pro)r(cessed)21 b(with)i(one)e(or)h(more)f(regular)g (expressions,)g(the)i(cost)f(in)n(v)n(olv)n(ed)f(is)h(also)f(p)r (olynomial)456 3971 y(in)g(the)h(a)n(v)n(erage)c(length)k(of)f(eac)n(h) g(line)g(of)h Fp(s)p Fs(.)35 b(Also,)22 b(the)g(memory)e(cost)h(for)g (\(fast\))h(classi\014cation)456 4120 y(is)27 b(clearly)g Fp(O)870 4053 y Fh(\000)908 4120 y Fp(\037)p Fs(\()p Fp(C)1051 4132 y Fn(1)1089 4120 y Fs(\))19 b(+)f Fi(\001)c(\001)g(\001) k Fs(+)g Fp(\037)p Fs(\()p Fp(C)1564 4132 y Fl(k)1606 4120 y Fs(\))1638 4053 y Fh(\001)1704 4120 y Fs(in)27 b(this)h(case.)555 4270 y(The)20 b(computations)f(are)g(more)g(in)n(v)n (olv)n(ed)f(when)i(the)g(training)f(corp)r(ora)f Fp(C)2879 4282 y Fn(1)2916 4270 y Fp(;)c(:)g(:)g(:)g(C)3123 4282 y Fl(k)3184 4270 y Fs(dep)r(end)456 4419 y(on)29 b(di\013eren)n(t)h (sets)g(of)f(regular)g(expressions)f Fp(G)1949 4431 y Fn(1)1986 4419 y Fp(;)14 b(:)g(:)g(:)g(;)g(G)2236 4431 y Fl(k)2307 4419 y Fs(sa)n(y)-7 b(.)42 b(The)30 b(feature)g(coun)n(ts)f Fi(f)p Fp(f)9 b Fs(\()p Fp(s)p Fs(\))26 b(:)456 4569 y Fp(f)47 b Fi(2)39 b Fp(G)703 4581 y Fl(k)744 4569 y Fi(g)d Fs(m)n(ust)h(b)r(e)h(tak)n(en)e(in)n(to)h(accoun)n(t)f(for)g (eac)n(h)g Fp(k)k Fs(separately)-7 b(,)38 b(and)f(the)g(complexit)n(y) 456 4718 y(of)g Fp(s)g Fs(v)-5 b(aries,)38 b(and)f(m)n(ust)g(therefore) g(b)r(e)g(written)g Fp(\037)2123 4730 y Fl(j)2158 4718 y Fs(\()p Fp(s)p Fs(\).)66 b(Using)37 b(Stirling's)g(form)n(ula)f Fp(n)p Fs(!)j Fi(\030)456 4799 y(p)p 525 4799 142 4 v 69 x Fs(2)p Fp(\031)s(n)18 b Fi(\001)g Fp(n)776 4837 y Fl(n)821 4868 y Fp(e)860 4837 y Fg(\000)p Fl(n)957 4868 y Fs(,)28 b(w)n(e)f(ha)n(v)n(e)g(from)g(\(10\))g(the)h(appro)n (ximation)502 5121 y Fm(P)p Fs(\()p Fp(C)644 5133 y Fl(j)693 5121 y Fi(j)14 b Fp(s)p Fs(\))23 b Fi(\030)g Fs(exp)1038 4979 y Fh(")1163 5042 y(X)1087 5224 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)1303 5232 y Fj(j)1333 5224 y Fn(\))1372 5121 y Fp(f)j Fs(\()p Fp(s)p Fs(\))14 b(log)1676 5100 y Fh(e)1660 5121 y Fp(R)1723 5133 y Fl(C)1771 5141 y Fj(j)1806 5121 y Fs(\()p Fp(f)9 b Fs(\))19 b(+)2032 5065 y(1)p 2032 5102 42 4 v 2032 5178 a(2)2097 5121 y(log)2204 5054 y Fh(\002)2239 5121 y Fs(2)p Fp(\031)s(\037)2383 5133 y Fl(j)2418 5121 y Fs(\()p Fp(s)p Fs(\))2521 5054 y Fh(\003)2574 5121 y Fs(+)f Fp(\037)2709 5133 y Fl(j)2744 5121 y Fs(\()p Fp(s)p Fs(\))c(log)h Fp(\037)3035 5133 y Fl(j)3069 5121 y Fs(\()p Fp(s)p Fs(\))p eop end %%Page: 19 19 TeXDict begin 19 18 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(19)985 512 y Fi(\000)1144 433 y Fh(X)1068 615 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)1284 623 y Fj(j)1314 615 y Fn(\))1101 684 y Fl(f)h Fn(\()p Fl(s)p Fn(\))p Fl(>)p Fn(0)1340 420 y Fh(\020)1400 456 y Fs(1)p 1400 493 42 4 v 1400 569 a(2)1465 512 y(log)1572 445 y Fh(\002)1607 512 y Fs(2)p Fp(\031)s(f)i Fs(\()p Fp(s)p Fs(\))1852 445 y Fh(\003)1905 512 y Fs(+)18 b Fp(f)9 b Fs(\()p Fp(s)p Fs(\))14 b(log)g Fp(f)9 b Fs(\()p Fp(s)p Fs(\))2429 420 y Fh(\021)2478 370 y(#)2527 512 y Fp(;)824 862 y Fs(=)23 b(exp)1038 770 y Fh(h)1078 862 y Fi(\000)p Fp(\037)1195 874 y Fl(j)1229 862 y Fs(\()p Fp(s)p Fs(\))p Fp(D)r Fs(\()p Fp(`)1470 874 y Fl(j)1506 862 y Fs(\()p Fp(s)p Fs(\))p Fi(k)1666 841 y Fh(e)1651 862 y Fp(R)1714 874 y Fl(C)1762 882 y Fj(j)1796 862 y Fs(\))c(+)1940 806 y(1)p 1940 843 V 1940 919 a(2)2005 862 y(log)2113 795 y Fh(\002)2147 862 y Fs(2)p Fp(\031)s(\037)2291 874 y Fl(j)2326 862 y Fs(\()p Fp(s)p Fs(\)])g Fi(\000)2630 783 y Fh(X)2554 965 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(G)2770 973 y Fj(j)2800 965 y Fn(\))2586 1034 y Fl(f)h Fn(\()p Fl(s)p Fn(\))p Fl(>)p Fn(0)2849 806 y Fs(1)p 2849 843 V 2849 919 a(2)2915 862 y(log)3022 795 y Fh(\002)3057 862 y Fs(2)p Fp(\031)s(f)i Fs(\()p Fp(s)p Fs(\))3302 795 y Fh(\003)3336 770 y(i)3375 862 y Fp(;)456 1189 y Fs(where)20 b Fp(`)724 1201 y Fl(j)759 1189 y Fs(\()p Fp(s)p Fs(\)\()p Fp(f)9 b Fs(\))23 b(=)g Fp(f)9 b Fs(\()p Fp(s)p Fs(\))p Fp(=\037)1334 1201 y Fl(j)1369 1189 y Fs(\()p Fp(s)p Fs(\))21 b(is)g(the)g(empirical)g (feature)f(distribution)i(of)e Fp(s)h Fs(\(i.e.)h(a)f(measure)456 1338 y(on)30 b Fi(F)8 b Fs(\()p Fp(G)p Fs(\)\),)33 b(and)e Fp(D)r Fs(\()p Fi(\001k\001)p Fs(\))h(is)e(the)i(Kullbac)n(k-Leibler)d (distance)i(on)f Fi(F)8 b Fs(\()p Fp(G)p Fs(\).)48 b(This)31 b(sho)n(ws)f(that)456 1488 y(the)f(exp)r(onen)n(t)f(is)g(essen)n (tially)g(prop)r(ortional)f(to)h(the)h(complexit)n(y)f(of)g Fp(s)h Fs(as)f Fp(\037)2907 1500 y Fl(j)2942 1488 y Fs(\()p Fp(s)p Fs(\))h(gets)f(large.)456 1637 y(Unfortunately)-7 b(,)25 b(ev)n(en)g(if)g(w)n(e)g(drop)f(the)i(last)f(t)n(w)n(o)f (correction)f(factors)h(in)i(the)f(limit,)h(calculat-)456 1787 y(ing)j Fp(D)r Fs(\()p Fp(`)734 1799 y Fl(j)769 1787 y Fs(\()p Fp(s)p Fs(\))p Fi(k)930 1766 y Fh(e)914 1787 y Fp(R)977 1799 y Fl(C)1025 1807 y Fj(j)1060 1787 y Fs(\))h(still)h(requires)d(the)j(storage)d(in)i(memory)f(of)h(all)g (the)g(\014nal)g(coun)n(ts)f Fp(f)9 b Fs(\()p Fp(s)p Fs(\).)456 1936 y(Th)n(us)21 b(w)n(e)g(see)g(that)h(for)f(mixed)g(m)n (ultinomial)h(mo)r(dels,)g(calculating)f Fm(P)p Fs(\()p Fp(C)2750 1948 y Fl(j)2799 1936 y Fi(j)14 b Fp(s)p Fs(\))22 b(is)f(una)n(v)n(oidably)456 2085 y Fp(O)521 2018 y Fh(\000)559 2085 y Fp(\037)p Fs(\()p Fp(s)p Fs(\))e(+)f Fp(\037)p Fs(\()p Fp(C)959 2097 y Fn(1)997 2085 y Fs(\))h(+)f Fi(\001)c(\001)g (\001)k Fs(+)g Fp(\037)p Fs(\()p Fp(C)1472 2097 y Fl(k)1514 2085 y Fs(\))1546 2018 y Fh(\001)1612 2085 y Fs(in)27 b(memory)g(storage.)555 2235 y(The)34 b(sp)r(ecial)g(case)f(when)i(a)e (single)h(category)e Fp(C)40 b Fs(=)34 b Fp(C)2326 2247 y Fn(1)2398 2235 y Fs(is)g(pro)n(vided)f(needs)h(a)f(di\013eren)n(t)456 2384 y(approac)n(h.)46 b(F)-7 b(rom)31 b(the)h(ab)r(o)n(v)n(e)e (computations,)h(the)h(probabilit)n(y)f(of)g(generating)f(a)h(string)f Fp(s)456 2534 y Fs(from)k(the)h(probabilit)n(y)e Fm(P)1291 2546 y Fl(C)1381 2534 y Fs(is)h(exp)r(onen)n(tially)g(small,)i(with)f (exp)r(onen)n(t)f Fp(\037)p Fs(\()p Fp(s)p Fs(\).)58 b(W)-7 b(e)35 b(assume)456 2683 y(that)26 b(the)g(features)g(of)g Fp(s)g Fs(are)f(stationary)f(with)j(marginal)d(distribution)i Fm(P)g Fs(\(a)g(probabilit)n(y)f(on)456 2833 y Fi(F)8 b Fs(\()p Fp(G)p Fs(\)\),)28 b(and)g(if)g(w)n(e)f(tak)n(e)g(the)h (limit)g(w)n(e)g(obtain)1318 3044 y(lim)1247 3101 y Fl(\037)p Fn(\()p Fl(s)p Fn(\))p Fg(!1)1518 3044 y Fp(\037)p Fs(\()p Fp(s)p Fs(\))1674 3002 y Fg(\000)p Fn(1)1777 3044 y Fs(log)14 b Fm(P)1949 3056 y Fl(C)2004 3044 y Fs(\()p Fp(s)p Fs(\))24 b(=)e Fi(\000)p Fp(D)r Fs(\()p Fm(P)p Fi(k)2494 3023 y Fh(e)2479 3044 y Fp(R)2542 3056 y Fl(C)2597 3044 y Fs(\))p Fp(:)456 3255 y Fs(If)32 b(the)g(logarithm)e(is)i(tak)n(en)f (to)h(the)g(base)f(2,)h(then)g(the)g(resulting)g Fq(cr)l(oss)h(entr)l (opy)h Fs(,)f(de\014ned)456 3405 y(as)28 b Fi(\000)p Fp(\037)p Fs(\()p Fp(s)p Fs(\))779 3375 y Fg(\000)p Fn(1)882 3405 y Fs(log)990 3425 y Fn(2)1041 3405 y Fm(P)1092 3417 y Fl(C)1147 3405 y Fs(\()p Fp(s)p Fs(\))i(and)f(measured)g(in)h(bits,)g (has)f(the)h(follo)n(wing)e(alternativ)n(e)g(in)n(tepre-)456 3554 y(tation:)37 b(if)29 b(w)n(e)e(compress)g(the)h(admissible)g (string)f Fp(s)h Fs(with)h(an)f(arithmetic)f(co)r(der,)h(and)g(using) 456 3704 y(the)i(mo)r(del)g Fm(P)901 3716 y Fl(C)957 3704 y Fs(,)h(then)f(the)h(cross)e(en)n(trop)n(y)f(giv)n(es)h(the)i(n)n (um)n(b)r(er)f(of)g(bits)g(needed)h(on)e(a)n(v)n(erage)456 3853 y(for)c(eac)n(h)h(enco)r(ded)g(feature.)36 b(This)26 b(quan)n(tit)n(y)g(can)g(b)r(e)h(used)f(when)g(c)n(ho)r(osing)f(the)i (b)r(est)f(\(most)456 4002 y(parsimonious\))g(mo)r(del)i(according)d (to)j(the)g Fq(Minimum)i(Description)h(L)l(ength)e(Principle)p Fs(.)456 4214 y(8.2.)40 b Fx(Sequen)m(tial)35 b(case.)42 b Fs(Due)31 b(to)f(the)h(absence)e(of)i(factorial)e(terms,)i(the)g (case)e(when)i Fp(G)g Fs(is)456 4364 y(sequen)n(tial)d(is)h(less)g(cum) n(b)r(ersome.)42 b(F)-7 b(rom)29 b(\(11\))g(and)g(the)g(Large)f (Deviation)h(appro)n(ximation)456 4513 y(\(Sano)n(v\),)e(if)h Fp(m)f Fs(is)h(the)g(highest)f Fp(n)p Fs(-gram)f(order)g(in)i(the)g(mo) r(del,)g(then)539 4762 y Fm(P)p Fs(\()p Fp(C)681 4774 y Fl(j)730 4762 y Fi(j)14 b Fp(s)p Fs(\))23 b Fi(\031)g Fp(K)1026 4728 y Fg(\000)p Fn(1)1128 4762 y Fs(exp)1255 4670 y Fh(\020)1378 4683 y(X)1304 4865 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)1516 4873 y Fj(j)1546 4865 y Fn(\))1586 4762 y Fp(\025)1634 4774 y Fl(t)1664 4762 y Fp(f)j Fs(\()p Fp(s)p Fs(\))18 b(+)1992 4683 y Fh(X)1918 4865 y Fl(f)7 b Fg(2F)2050 4873 y Fk(1)2082 4865 y Fn(\()p Fl(G)p Fn(\))2199 4762 y Fs(log)14 b Fp(R)2383 4774 y Fl(C)2431 4782 y Fj(j)2466 4762 y Fs(\()p Fp(f)9 b Fs(\))19 b Fi(\000)f Fp(\037)2734 4774 y Fl(m)2797 4762 y Fs(\()p Fp(s)p Fs(\))c(log)3052 4741 y(^)3035 4762 y Fp(Z)3092 4774 y Fl(C)3140 4782 y Fj(j)3170 4774 y Fl(;m)3253 4670 y Fh(\021)3303 4762 y Fp(;)843 5088 y(K)28 b Fs(=)1072 4984 y Fl(k)1030 5009 y Fh(X)1032 5186 y Fl(j)s Fn(=1)1164 5088 y Fs(exp)1291 4996 y Fh(\020)1414 5009 y(X)1340 5191 y Fl(f)7 b Fg(2F)f Fn(\()p Fl(C)1552 5199 y Fj(j)1582 5191 y Fn(\))1621 5088 y Fp(\025)1669 5100 y Fl(t)1699 5088 y Fp(f)j Fs(\()p Fp(s)p Fs(\))19 b(+)2027 5009 y Fh(X)1954 5191 y Fl(f)7 b Fg(2F)2086 5199 y Fk(1)2117 5191 y Fn(\()p Fl(G)p Fn(\))2235 5088 y Fs(log)14 b Fp(R)2419 5100 y Fl(C)2467 5108 y Fj(j)2502 5088 y Fs(\()p Fp(f)9 b Fs(\))18 b Fi(\000)g Fp(\037)2769 5100 y Fl(m)2832 5088 y Fs(\()p Fp(s)p Fs(\))c(log)3088 5067 y(^)3071 5088 y Fp(Z)3128 5100 y Fl(C)3176 5108 y Fj(j)3206 5100 y Fl(;m)3289 4996 y Fh(\021)3338 5088 y Fp(;)p eop end %%Page: 20 20 TeXDict begin 20 19 bop 456 251 a Fn(20)1212 b(L.A.)22 b(BREYER)456 450 y Fs(where)713 429 y(^)696 450 y Fp(Z)753 462 y Fl(C)801 470 y Fj(j)831 462 y Fl(;m)941 450 y Fs(w)n(as)27 b(calculated)g(as)g(part)g(of)h(the)g(en)n(trop)n(y)e(maximization)h (\(14\))o(,)h(\(15\))f(as)576 793 y(log)714 772 y(^)697 793 y Fp(Z)754 805 y Fl(C)802 813 y Fj(j)832 805 y Fl(;m)915 793 y Fs(\()p Fp(s)p Fs(\))c(=)1155 737 y(1)p 1139 774 73 4 v 1139 850 a Fp(m)1236 793 y Fs(log)1343 701 y Fh(h)1481 714 y(X)1382 896 y Fl(f)7 b Fg(2F)1514 904 y Fj(m)1569 896 y Fn(\()p Fl(C)1643 904 y Fj(j)1673 896 y Fn(\))1699 701 y Fh(\020)1749 793 y Fp(e)1788 756 y Fl(m\025)1886 765 y Fj(f)1923 756 y Fn(+)1974 712 y Fb(P)2044 775 y Fj(j)2086 756 y Fl(m\025)2184 776 y Fj(\034)2217 763 y(j)2249 776 y(f)2309 793 y Fi(\000)18 b Fs(1)2434 701 y Fh(\021)2483 793 y Fp(R)2547 758 y Fg(\012)p Fl(m)2546 818 y(C)2594 826 y Fj(j)2661 793 y Fs(\()p Fp(f)9 b Fs(\))19 b(+)f(\010)2937 805 y Fl(C)2985 813 y Fj(j)3016 805 y Fl(;m;m)p Fg(\000)p Fn(1)3262 701 y Fh(i)3301 793 y Fp(:)555 1181 y Fs(Ho)n(w)n(ev)n(er,)33 b(when)g(the)g(comp)r(eting)g (categories)e(are)h(based)h(on)f(di\013eren)n(t)i(sets)e(of)h(regular) 456 1330 y(expressions,)25 b(care)g(m)n(ust)i(b)r(e)g(tak)n(en)f(to)g (coun)n(t)g(eac)n(h)g(matc)n(hed)g(feature)h(the)g(correct)e(n)n(um)n (b)r(er)456 1480 y(of)33 b(times.)53 b(This)34 b(can)e(b)r(e)i (somewhat)e(tric)n(ky)h(with)g(a)g(single)g(pass)f(in)h(case)g(of)g (complicated)456 1629 y(o)n(v)n(erlapping)e(tok)n(ens,)j(so)g Fx(dbacl)g Fs(mak)n(es)e(sev)n(eral)g(passes)h(o)n(v)n(er)f(eac)n(h)h (line)h(of)f(the)h(string)f Fp(s)p Fs(,)456 1778 y(one)24 b(for)h(eac)n(h)g(regular)e(expression)h(in)h Fp(G)p Fs(.)37 b(This)25 b(metho)r(d)h(tak)n(es)e(adv)-5 b(an)n(tage)24 b(of)h(the)h(fact)f(that)456 1928 y(regular)i(expressions)g(do)i(not)h (straddle)e(newlines,)i(since)f(one)f(full)i(line)g(is)f(k)n(ept)g(in)g (memory)456 2077 y(for)e(regular)e(expression)i(matc)n(hing)g(an)n(yw)n (a)n(y)-7 b(.)555 2227 y(Ev)n(ery)35 b(simple)h(mo)r(del)h(also)e(has)h (a)g(sequen)n(tial)g(in)n(terpretation,)h(giv)n(en)f(b)n(y)h(\(10\),)h (when)456 2376 y(all)30 b(factorial)g(co)r(e\016cien)n(ts)h(are)f (omitted.)48 b(Probabilistically)-7 b(,)30 b(the)i(simple)f(mo)r(del)g (describ)r(es)456 2526 y(equiv)-5 b(alence)32 b(classes)f(of)h (strings,)h(while)g(the)g(corresp)r(onding)e(sequen)n(tial)g(mo)r(del)i (describ)r(es)456 2675 y(all)27 b(actual)g(p)r(erm)n(utations.)36 b(Ba)n(y)n(es')26 b(form)n(ula)h(\(1\))g(cannot)g(b)r(e)h(directly)g (applied)f(with)h(mixed)456 2825 y(string)19 b(in)n(terpretations,)i (so)f(when)g(comparing)f(sequen)n(tial)h(and)g(m)n(ultinomial)h(t)n(yp) r(es)f(of)h(mo)r(d-)456 2974 y(els,)27 b Fx(dbacl)h Fs(con)n(v)n(erts)e (them)i(all)g(to)f(sequen)n(tial)g(form.)555 3123 y(F)-7 b(or)40 b(simple)h(mo)r(dels,)i(if)e(the)g(option)f Fq(-M)h Fs(is)f(selected,)j Fx(dbacl)e Fs(will)g(p)r(erform)f(the)h(full)456 3273 y(m)n(ultinomial)26 b(score)f(calculation,)h(e.g.)g(for)g(purp)r (oses)g(of)g(comparison)f(with)i(other)f(soft)n(w)n(are.)456 3422 y(Note)21 b(that)h(the)g(cross)e(en)n(trop)n(y)g(rep)r(orted)h(in) h(the)g(m)n(ultinomial)g(case)e(is)i(alw)n(a)n(ys)e(lo)n(w)n(er)g(than) h(in)456 3572 y(the)27 b(sequen)n(tial)e(case,)h(since)h(feature)f (ordering,)f(while)i(irrelev)-5 b(an)n(t)25 b(in)i(b)r(oth)g(in)n (terpretations,)456 3721 y(is)h(only)f(ignored)g(in)i(the)f(m)n (ultinomial)g(case.)38 b(There)28 b(is)g(no)g(di\013erence)g(in)g(the)h (classi\014cation)456 3871 y(results)k(for)g(sequen)n(tial)g(or)f(m)n (ultinomial)i(unigram)e(mo)r(dels,)k(since)d(the)h(extra)f(terms)g (only)456 4020 y(dep)r(end)28 b(on)f(the)h(empirical)f(measure)g(of)g (the)h(do)r(cumen)n(t)g(b)r(eing)g(classi\014ed.)555 4169 y(In)23 b(the)g(case)f(of)g(a)h(single)f(\(sequen)n(tial\))g (category)-7 b(,)22 b(the)h(cross)e(en)n(trop)n(y)h(is)g(calculated)g (in)h(the)456 4319 y(usual)f(w)n(a)n(y)-7 b(,)23 b(namely)f Fi(\000)p Fp(\037)1249 4331 y Fl(m)1312 4319 y Fs(\()p Fp(s)p Fs(\))1415 4289 y Fg(\000)p Fn(1)1518 4319 y Fs(log)14 b Fm(P)1690 4331 y Fl(C;m)1821 4319 y Fs(\()p Fp(s)p Fs(\).)36 b(Under)22 b(suitable)h(stationarit)n(y)e(assumptions,)456 4468 y(the)33 b(Shannon-McMillan-Breiman)f(theorem)h(guaran)n(tees)e (that)j(this)f(quan)n(tit)n(y)g(con)n(v)n(erges)456 4618 y(as)27 b Fp(\037)610 4630 y Fl(m)673 4618 y Fs(\()p Fp(s)p Fs(\))h(tends)g(to)f(in\014nit)n(y)-7 b(.)555 4767 y Fx(Remark.)45 b Fs(The)30 b(user)g(is)g(resp)r(onsible)g(for)f (making)h(sure)g(that)g Fp(G)h Fs(is)f(in)h(fact)f(sequen)n(tial,)456 4917 y Fx(dbacl)h Fs(mak)n(es)f(no)h(attempt)h(to)f(v)n(erify)g (consistency)-7 b(.)46 b(The)32 b(basic)e(1-grams)f(are)h(tak)n(en)h (only)456 5066 y(from)e(those)g(regular)f(expressions)g(whic)n(h)i(tag) f(exactly)g(one)g(susbstring,)g(and)h(eac)n(h)e(1-gram)456 5216 y(is)f(coun)n(ted)g(as)g(man)n(y)g(times)h(as)f(some)g(regular)f (expression)g(in)i Fi(F)2549 5228 y Fn(1)2586 5216 y Fs(\()p Fp(G)p Fs(\))g(matc)n(hes)f(it.)p eop end %%Page: 21 21 TeXDict begin 21 20 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(21)1482 450 y Fs(9.)41 b Fr(Logarithmic)31 b(scores)555 649 y Fs(In)i(this)f(section,)h(w)n(e)f(further)h(describ) r(e)f(the)g(factorizations)f(of)h(the)h(logarithmic)e(scores)456 799 y(in)n(to)c(meaningul)g(information-theoretic)f(quan)n(tities.)456 1041 y(9.1.)40 b Fx(Simple)33 b(case.)41 b Fs(As)29 b(sho)n(wn)g(in)h (Section)f(8,)h(the)g(log)e(probabilit)n(y)h(of)g(b)r(elonging)g(to)g (the)456 1190 y(class)d Fp(C)709 1202 y Fl(j)772 1190 y Fs(is)i(appro)n(ximately)e(prop)r(ortional)f(to)j(the)g(complexit)n (y)f Fp(\037)2599 1202 y Fl(j)2634 1190 y Fs(\()p Fp(s)p Fs(\),)h(via)456 1424 y(\(21\))670 b Fi(\000)14 b Fs(log)g Fm(P)p Fs(\()p Fp(C)1616 1436 y Fl(j)1651 1424 y Fi(j)p Fp(s)p Fs(\))24 b Fi(\031)e Fp(\037)1908 1436 y Fl(j)1943 1424 y Fs(\()p Fp(s)p Fs(\))d Fi(\001)g Fp(D)r Fs(\()p Fp(`)2245 1436 y Fl(j)2279 1424 y Fs(\()p Fp(s)p Fs(\))p Fi(k)2440 1403 y Fh(e)2424 1424 y Fp(R)2487 1436 y Fl(C)2535 1444 y Fj(j)2570 1424 y Fs(\))p Fp(:)456 1658 y Fs(The)31 b(Kullbac)n(k-Leibler)f(div)n(ergence)g(measures)g(the)i(di\013erence)f (b)r(et)n(w)n(een)h(the)g(class)e(mo)r(del)471 1786 y Fh(e)456 1807 y Fp(R)519 1819 y Fl(C)567 1827 y Fj(j)630 1807 y Fs(and)e(the)g(empirical)g(measure)f Fp(`)1655 1819 y Fl(j)1690 1807 y Fs(\()p Fp(s)p Fs(\))i(of)f(the)g(do)r(cumen)n (t.)39 b(Note)29 b(that)f(b)r(oth)h(these)f(mea-)456 1957 y(sures)c(are)h(measures)f(on)i Fi(F)8 b Fs(\()p Fp(G)p Fs(\),)27 b(and)e(that)h(is)g(the)g(set)f(where)g(the)h(div)n (ergence)f(is)g(computed.)456 2199 y(9.2.)40 b Fx(Sequen)m(tial)35 b(case.)41 b Fs(F)-7 b(or)30 b(the)g(sequen)n(tial)f(case,)h(a)g (similar)f(factorization)g(is)h(p)r(ossible.)456 2348 y(Again,)35 b(w)n(e)f(m)n(ust)h(w)n(ork)e(on)h Fi(F)8 b Fs(\()p Fp(G)p Fs(\),)37 b(but)e(since)f(the)h(appro)n(ximations)d (dep)r(end)j(on)f Fp(m)h Fs(\(the)456 2498 y(highest)26 b Fp(n)p Fs(-gram)e(order\),)i(it)g(is)g(natural)g(to)g(w)n(ork)e(only) i(on)g(the)h(subset)f Fi(F)2805 2510 y Fl(m)2868 2498 y Fs(\()p Fp(G)p Fs(\).)37 b(As)26 b(in)h(\(10\))o(,)456 2647 y(de\014ne)456 2940 y(\(22\))705 2919 y Fh(e)689 2940 y Fp(R)752 2952 y Fl(C)808 2940 y Fs(\()p Fp(f)9 b Fs(\))23 b(=)1033 2745 y Fh(8)1033 2820 y(>)1033 2844 y(<)1033 2994 y(>)1033 3019 y(:)1107 2865 y Fp(Z)1170 2830 y Fg(\000)p Fn(1)1164 2890 y Fl(C;m)1308 2865 y Fs(exp)1435 2773 y Fh(h)1474 2865 y Fp(\025)1522 2877 y Fl(f)1584 2865 y Fs(+)1667 2803 y Fh(P)1755 2824 y Fl(m)p Fg(\000)p Fn(1)1755 2890 y Fl(j)s Fn(=1)1917 2865 y Fp(\025)1965 2881 y Fl(\034)2003 2864 y Fj(j)2033 2881 y Fl(f)2077 2773 y Fh(i)2134 2865 y Fi(\001)c Fp(R)2240 2830 y Fg(\012)p Fl(m)2239 2890 y(C)2354 2865 y Fs(\()p Fp(f)9 b Fs(\))83 b(if)29 b Fp(f)i Fi(2)24 b(F)2839 2877 y Fl(m)2901 2865 y Fs(\()p Fp(C)6 b Fs(\))1107 3045 y Fp(Z)1170 3009 y Fg(\000)p Fn(1)1164 3069 y Fl(C;m)1294 3045 y Fp(R)1358 3009 y Fg(\012)p Fl(m)1357 3069 y(C)1473 3045 y Fs(\()p Fp(f)j Fs(\))964 b(if)29 b Fp(f)i Fi(2)24 b(F)2839 3057 y Fl(m)2901 3045 y Fs(\()p Fp(G)p Fs(\))p Fi(nF)3132 3057 y Fl(m)3195 3045 y Fs(\()p Fp(C)6 b Fs(\))q Fp(;)456 3254 y Fs(where)30 b Fp(Z)756 3266 y Fl(C;m)918 3254 y Fs(w)n(as)g(computed)h(in)g(\(14\).)47 b(Let)31 b Fp(`)p Fs(\()p Fp(s)p Fs(\)\()p Fp(f)9 b Fs(\))29 b(=)g Fp(f)9 b Fs(\()p Fp(s)p Fs(\))p Fp(=\037)2559 3266 y Fl(m)2621 3254 y Fs(\()p Fp(s)p Fs(\),)33 b(and)e(write)g Fp(H)7 b Fs(\()p Fp(\026)p Fs(\))29 b(=)456 3403 y Fi(\000)535 3341 y Fh(P)622 3428 y Fl(f)679 3403 y Fp(\026)p Fs(\()p Fp(f)9 b Fs(\))14 b(log)g Fp(\026)p Fs(\()p Fp(f)9 b Fs(\))27 b(to)h(represen)n(t)e(the)i(Shannon)f(en)n(trop)n(y)f(of)i (the)g(measure)e Fp(\026)i Fs(on)f Fi(F)3229 3415 y Fl(m)3291 3403 y Fs(\()p Fp(G)p Fs(\).)456 3552 y(In)g(terms)h(of)f(these)h(quan) n(tities,)f(w)n(e)g(ha)n(v)n(e)456 3786 y(\(23\))473 b Fi(\000)14 b Fs(log)f Fm(P)p Fs(\()p Fp(C)6 b Fi(j)p Fp(s)p Fs(\))24 b Fi(\031)e Fp(\037)1681 3798 y Fl(m)1744 3786 y Fs(\()p Fp(s)p Fs(\))d Fi(\001)1908 3694 y Fh(h)1947 3786 y Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)2246 3765 y Fh(e)2230 3786 y Fp(R)2293 3798 y Fl(C)2349 3786 y Fs(\))g(+)f Fp(H)7 b Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\)\))2761 3694 y Fh(i)2800 3786 y Fp(;)456 4020 y Fs(whic)n(h)29 b(can)g(b)r(e)g(v)n(eri\014ed)g(b)n(y)g(expanding)g(the) g(quan)n(tities)g(on)g(the)h(left)g(and)f(comparing)f(with)456 4169 y(the)23 b(form)n(ula)f(in)h(Section)h(8.)34 b(The)24 b(extra)e(Shannon)h(en)n(trop)n(y)e(arises)h(here)h(b)r(ecause)f (sequen)n(tial)456 4319 y(mo)r(del)27 b(probabilities)f(are)g (de\014ned)h(on)g(actual)f(strings)g Fp(s)p Fs(,)h(whereas)f(in)h(the)h (simple)f(case,)f(the)456 4468 y(probabilities)34 b(are)g(de\014ned)i (on)f(the)h(equiv)-5 b(alence)35 b(classes)f(of)h(strings)f(\(i.e.)i Fq(typ)l(es)p Fs(,)i(Csiszar,)456 4618 y(1998\).)555 4767 y(Giv)n(en)f(the)g(score,)g(the)g(div)n(ergence)e(can)h(therefore) g(b)r(e)h(obtained)f(b)n(y)g(subtracting)g(the)456 4917 y(Shannon)19 b(en)n(trop)n(y)-7 b(.)33 b(Computationally)-7 b(,)21 b(this)f(requires)e(k)n(eeping)h(in)i(memory)e(all)g(the)h (relev)-5 b(an)n(t)456 5066 y(feature)22 b(coun)n(ts)h Fp(f)9 b Fs(\()p Fp(s)p Fs(\),)24 b(as)e(for)h(simple)g(mo)r(dels.)35 b(A)23 b(con)n(v)n(enien)n(t)f(w)n(a)n(y)g(of)h(calculating)f Fp(H)7 b Fs(\()p Fp(`)3274 5078 y Fl(j)3309 5066 y Fs(\()p Fp(s)p Fs(\)\))456 5216 y(for)37 b(sev)n(eral)e(categories)h(sim)n (ultaneously)-7 b(,)39 b(is)e(using)g(Stirling's)g(appro)n(ximation)f Fp(n)14 b Fs(log)g Fp(n)39 b Fi(\031)p eop end %%Page: 22 22 TeXDict begin 22 21 bop 456 251 a Fn(22)1212 b(L.A.)22 b(BREYER)456 450 y Fp(n)c Fi(\000)g Fs(log)728 381 y Fi(p)p 797 381 142 4 v 69 x Fs(2)p Fp(\031)s(n)g Fs(+)g(log)c Fp(n)p Fs(!,)28 b(and)f(expanding)g(in)n(to)h(a)f(telescoping)g(sum:) 490 697 y Fp(H)7 b Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\)\))24 b Fi(\031)946 640 y Fs(1)p 890 678 156 4 v 890 754 a Fp(\037)p Fs(\()p Fp(s)p Fs(\))1055 604 y Fh(h)1201 618 y(X)1094 800 y Fg(f)p Fl(f)7 b Fn(:)p Fl(f)g Fn(\()p Fl(s)p Fn(\))p Fl(>)p Fn(0)p Fg(g)1427 604 y Fh(\020)1477 697 y Fs(1)17 b Fi(\000)1629 640 y Fs(1)p 1629 678 42 4 v 1629 754 a(2)1695 697 y(log\(2)p Fp(\031)s Fs(\))1958 604 y Fh(\021)2026 697 y Fs(+)2109 586 y Fl(f)7 b Fn(\()p Fl(s)p Fn(\))2111 618 y Fh(X)2110 797 y Fl(k)q Fn(=2)2232 604 y Fh(\020)2281 697 y Fs(1)18 b(+)2434 640 y(1)p 2434 678 V 2434 754 a(2)2499 697 y(log)c Fp(k)s Fs(\()p Fp(k)22 b Fs(+)c(1\))2920 604 y Fh(\021)o(i)3027 697 y Fi(\000)g Fs(log)c Fp(\037)p Fs(\()p Fp(s)p Fs(\))p Fp(:)456 948 y Fs(This)28 b(has)g(the)g(adv)-5 b(an)n(tage)27 b(o)n(v)n(er)g(the)h (exact)g(computation)g(that)h(the)f(computed)h(div)n(ergence)456 1097 y(is)e(o)n(v)n(erestimated,)f(reducing)h(the)h(incidence)g(of)f (sometimes)g(negativ)n(e)g(v)-5 b(alues.)456 1306 y(9.3.)40 b Fx(Div)m(ergence)c(asymptotics.)41 b Fs(Let)32 b Fp(')p Fs(\()p Fp(x)p Fs(\))e(=)e(1)21 b Fi(\000)f Fp(x)i Fs(+)e Fp(x)14 b Fs(log)g Fp(x)p Fs(,)33 b(then)f(expanding)e(this)456 1455 y(function)e(in)n(to)f(a)g(T)-7 b(a)n(ylor)26 b(series)h(ab)r(out) g Fp(x)d Fs(=)e(1,)28 b(w)n(e)f(ha)n(v)n(e)456 1701 y(\(24\))161 b Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)1099 1713 y Fl(C)1155 1701 y Fs(\))23 b(=)1298 1588 y Fh(Z)1395 1701 y Fp(')1449 1609 y Fh(\020)1509 1645 y Fp(d`)p Fs(\()p Fp(s)p Fs(\))p 1509 1682 182 4 v 1524 1758 a Fp(d)p Fm(P)1618 1770 y Fl(C)1700 1609 y Fh(\021)1749 1701 y Fp(d)p Fm(P)1843 1713 y Fl(C)1922 1701 y Fi(\031)2020 1645 y Fs(1)p 2020 1682 42 4 v 2020 1758 a(2)2085 1622 y Fh(X)2126 1801 y Fl(f)2205 1559 y Fh( )2392 1645 y Fp(f)9 b Fs(\()p Fp(s)p Fs(\))p 2281 1682 377 4 v 2281 1758 a Fp(\037)p Fs(\()p Fp(s)p Fs(\))p Fm(P)2487 1770 y Fl(C)2543 1758 y Fs(\()p Fp(f)g Fs(\))2685 1701 y Fi(\000)18 b Fs(1)2810 1559 y Fh(!)2876 1576 y Fn(2)2913 1701 y Fm(P)2964 1713 y Fl(c)2997 1701 y Fs(\()p Fp(f)9 b Fs(\))p Fp(:)555 1950 y Fs(Standard)26 b(asymptotic)g(results)g(suggest)f(that) i Fp(\037)p Fs(\()p Fp(s)p Fs(\))17 b Fi(\001)f Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)2617 1962 y Fl(C)2672 1950 y Fs(\))27 b(has)f(an)g(appro)n(ximate)456 2100 y Fp(\037)508 2070 y Fn(2)571 2100 y Fs(distribution,)h(when)g Fp(\037)p Fs(\()p Fp(s)p Fs(\))f(is)h(big)f(enough,)g(but)h(in)f(fact,) h(the)g(analysis)e(is)h(more)g(delicate,)456 2249 y(b)r(ecause)d(the)h (n)n(um)n(b)r(er)g(of)f(features)h Fp(f)32 b Fs(considered)23 b(is)h(un)n(b)r(ounded)g(as)f Fp(\037)p Fs(\()p Fp(s)p Fs(\))h(tends)g(to)g(in\014nit)n(y)-7 b(.)456 2399 y(While)36 b(suc)n(h)g(an)f(analysis)g(is)h(b)r(ey)n(ond)f(the)i(scop)r(e)e(of)h (this)g(pap)r(er,)i(practical)d(exp)r(erimen)n(ts)456 2548 y(nev)n(ertheless)d(suggest)h(that)i Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)1743 2560 y Fl(C)1798 2548 y Fs(\))g(has)e(the)i(more)e(general)g(Gamma)g (distribution,)456 2698 y(\000\()p Fp(a)584 2710 y Fl(C)640 2698 y Fp(;)14 b(b)713 2710 y Fl(C)768 2698 y Fs(\).)36 b(Making)24 b(this)h(assumption)f(allo)n(ws)f(the)i(computation)g(of)f (con\014dence)h(estimates)456 2847 y(in)38 b(the)h(n)n(ull)g(h)n(yp)r (othesis)f(that)g(the)h(la)n(w)f(of)g Fp(`)p Fs(\()p Fp(s)p Fs(\))h(is)f Fm(P)2244 2859 y Fl(C)2300 2847 y Fs(.)69 b(More)37 b(precisely)-7 b(,)41 b(let)d Fp(F)3170 2859 y Fl(C)3227 2847 y Fs(\()p Fp(x)p Fs(\))k(=)456 2997 y Fm(P)p Fs(\(\000\()p Fp(a)667 3009 y Fl(C)723 2997 y Fp(;)14 b(b)796 3009 y Fl(C)851 2997 y Fs(\))23 b Fp(>)g(x)p Fs(\))28 b(b)r(e)g(the)g(tail)g(probabilit)n(y)-7 b(,)27 b(then)h(the)g(v)-5 b(ariable)26 b Fp(p)p Fs(\()p Fp(s)p Fs(\))i(de\014ned)g(b)n(y)456 3205 y(\(25\))320 b Fp(p)p Fs(\()p Fp(s)p Fs(\))24 b(=)e(2)c Fi(\001)1282 3088 y Fh(\024)1326 3205 y Fp(F)1379 3217 y Fl(C)1435 3113 y Fh(\020)1484 3205 y Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)1818 3217 y Fl(C)1874 3205 y Fs(\))1906 3113 y Fh(\021)1974 3205 y Fi(^)2048 3113 y Fh(\020)2098 3205 y Fs(1)g Fi(\000)g Fp(F)2294 3217 y Fl(C)2350 3113 y Fh(\020)2399 3205 y Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)2733 3217 y Fl(C)2789 3205 y Fs(\))2821 3113 y Fh(\021)2871 3088 y(\023\025)456 3414 y Fs(is)k(uniformly)g(distributed)g(on)g([0)p Fp(;)14 b Fs(1],)22 b(and)g(satis\014es)g Fp(p)p Fs(\()p Fp(s)p Fs(\))h Fi(!)g Fs(0)f(if)g(and)g(only)g(if)h Fp(D)r Fs(\()p Fp(`)p Fs(\()p Fp(s)p Fs(\))p Fi(k)p Fm(P)3251 3426 y Fl(C)3306 3414 y Fs(\))g Fi(!)456 3563 y(f)p Fs(0)p Fp(;)14 b Fs(+)p Fi(1g)p Fs(.)35 b(Th)n(us)27 b(it)h(can)f(b)r(e)h (view)n(ed)f(as)g(a)g Fq(p-value)i Fs(for)e(the)h(purp)r(ose)f(of)g (Fisher's)g Fp(\037)3148 3533 y Fn(2)3213 3563 y Fs(test.)1708 3796 y Fr(References)573 3970 y Fw([1])35 b(Berger,)20 b(A.,)f(Della)f(Pietra,)i(S.A.,)f(and)h(Della)e(Pietra,)i(V.J.)e (\(1996\))j Fo(A)h(maximum)g(entr)l(opy)g(appr)l(o)l(ach)683 4095 y(to)k(natur)l(al)h(language)f(pr)l(o)l(c)l(essing)p Fw(.)f(Computational)g(Linguistics)e(22\(1\):)33 b(39{71.)573 4219 y([2])i(Csiszar,)19 b(I.)g(\(1984\))i(Sano)n(v)f(prop)r(ert)n(y)-6 b(,)20 b(generalized)g(I-pro)t(jection)g(and)g(a)f(conditional)h(limit) e(theorem.)683 4344 y(Ann.)23 b(Probab.)h(12\(3\):)33 b(768{793.)573 4468 y([3])i(Csiszar,)23 b(I.)g(\(1998\))j(The)e(Metho)r (d)g(of)g(T)n(yp)r(es.)f(IEEE)h(T)-6 b(rans.)23 b(Inform.)g(Theory)-6 b(.)24 b(44\(6\):)33 b(2505{2523.)573 4593 y([4])i(Della)23 b(Pietra,)f(S.A.,)g(Della)h(Pietra,)g(V.J.,)f(and)h(La\013ert)n(y)-6 b(,)24 b(J.)f(\(1997\))i Fo(Inducing)g(fe)l(atur)l(es)h(of)f(r)l(andom) 683 4717 y(\014elds)p Fw(.)f(IEEE)g(T)-6 b(rans.)23 b(P)n(attern)i (Analysis)e(and)h(Mac)n(hine)g(In)n(telligence)h(19\(4\):)33 b(380{393.)573 4842 y([5])i(MacKa)n(y)-6 b(,)26 b(D.)f(and)i(P)n(eto,)f (L.)g(\(1995\))h Fo(A)g(Hier)l(ar)l(chic)l(al)j(Dirichlet)c(L)l (anguage)i(Mo)l(del)p Fw(.)f(Natural)e(Lan-)683 4967 y(guage)g(Engineering)f(1\(3\):)33 b(289{307.)573 5091 y([6])i(Shannon,)20 b(C.E.)d(\(1948\))i Fo(A)h(mathematic)l(al)i(the)l (ory)e(of)g(c)l(ommunic)l(ation)g Fw(The)e(Bell)f(System)h(T)-6 b(ec)n(hnical)683 5216 y(Journal)24 b(27:)31 b(379{423.)p eop end %%Page: 23 23 TeXDict begin 23 22 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(23)573 450 y Fw([7])35 b(Zhai,)19 b(C.)f(and)h (La\013ert)n(y)-6 b(,)20 b(J.)e(\(2001\))j(A)d(study)h(of)f(smo)r (othing)i(metho)r(ds)f(for)f(language)i(mo)r(dels)e(applied)683 575 y(to)24 b(ad)g(ho)r(c)h(information)e(retriev)l(al.)g Fo(SIGIR'01)p Fw(.)555 721 y Fo(E-mail)j(addr)l(ess)5 b Fw(:)33 b Fa(laird@lbreyer.com)p eop end %%Page: 24 24 TeXDict begin 24 23 bop 456 251 a Fn(24)1212 b(L.A.)22 b(BREYER)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page1.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E/F1 10.95/Times-Bold@0 SF -.219<4e41>72 84 S<4d45>.219 E F0<646261636c20ad20612064696772616d69 6320426179657369616e20636c617373698c657220666f72207465>108 96 Q <7874207265636f676e6974696f6e2e>-.15 E F1<53594e4f50534953>72 112.8 Q/F2 10/Times-Bold@0 SF<646261636c>108 124.8 Q F0 .152 <5b2d3064766e69726d4d4e445d205b2d54>2.652 F/F3 10/Times-Italic@0 SF <74797065>2.652 E F0 2.652<5d2d>2.652 G<6c>-2.652 E F3<63617465>2.852 E <676f7279>-.4 E F0<5b2d68>2.972 E F3<73697a65>2.652 E F0 2.652<5d5b>.18 G<2d48>-2.652 E F3<6773697a65>2.652 E F0 2.652<5d5b>.18 G<2d78>-2.652 E F3<646563696d>2.652 E F0 2.652<5d5b>.32 G<2d71>-2.652 E F3 <7175616c697479>2.651 E F0 2.651<5d5b>.32 G<2d77>-2.651 E F3 <6d61785f6f72>2.651 E<646572>-.37 E F0 2.651<5d5b>.73 G<2d65>-2.651 E F3 <646566746f6b>144 136.8 Q F0 2.5<5d5b>.67 G<2d6f>-2.5 E F3<6f6e6c696e65> 2.5 E F0 2.5<5d5b>.18 G<2d4c>-2.5 E F3<6d6561737572>2.5 E<65>-.37 E F0 2.5<5d5b>.18 G<2d67>-2.5 E F3 -.37<7265>2.5 G -.1<6765>-.03 G<78>-.1 E F0 2.5<5d2e2e2e205b46494c455d2e2e2e>.53 F F2<646261636c>108 153.6 Q F0 <5b2d766e696d4e52585d205b2d68>2.5 E F3<73697a65>2.5 E F0 2.5<5d5b>.18 G <2d54>-2.5 E F3<747970655d>2.5 E F0<2d63>2.5 E F3<63617465>2.7 E <676f7279>-.4 E F0<5b2d63>2.82 E F3<63617465>2.5 E<676f7279>-.4 E F0 2.5 <5d2e2e2e205b2d66>.32 F F3 -.1<6b65>2.5 G<6570>.1 E F0 2.5 <5d2e2e2e205b46494c455d2e2e2e>.19 F F2<646261636c>108 170.4 Q F0<2d56> 2.5 E F1<4445534352495054494f4e>72 187.2 Q F2<646261636c>108 199.2 Q F0 .888<6973206120426179657369616e207465>3.388 F .888 <787420646f63756d656e7420636c617373698c6572>-.15 F 3.389<2c77>-.4 G .889 <6869636820757365732061206d6178696d756d20656e74726f70>-3.389 F 3.389 <7928>-.1 G .889<6d696e696d756d206469>-3.389 F -.15<7665>-.25 G -.18 <7267>.15 G .889<656e636529206c616e2d>.18 F .296<6775616765206d6f64656c 20636f6e73747275637465642077697468207265737065637420746f2061206469677261 6d6963207265666572656e6365206d6561737572652028756e6b6e6f>108 211.2 R .295<776e2077>-.25 F .295 <6f72647320617265207072656469637465642066726f6d>-.1 F <64696772616d732c20692e652e207061697273206f66206c657474657273292e>108 223.2 Q .33<4966207573696e6720746865>108 240 R F2<2d6c>2.83 E F0 .33 <636f6d6d616e6420666f726d2c>2.83 F F2<646261636c>2.83 E F0 .33 <6c6561726e7320612063617465>2.83 F .331<676f7279207768656e206769>-.15 F -.15<7665>-.25 G 2.831<6e6f>.15 G .331 <6e65206f72206d6f72652046494c45206e616d65732c2077686963682073686f756c64> -2.831 F .044<636f6e7461696e207265616461626c65>108 252 R/F4 9 /Times-Roman@0 SF<4153434949>2.544 E F0<7465>2.294 E .043 <78742e204966206e6f2046494c45206973206769>-.15 F -.15<7665>-.25 G<6e2c> .15 E F2<646261636c>2.543 E F0 .043 <6c6561726e732066726f6d20535444494e2e2054686520726573756c74206973207361> 2.543 F -.15<7665>-.2 G 2.543<6469>.15 G 2.543<6e74>-2.543 G .043 <68652062696e617279>-2.543 F<8c6c65206e616d6564>108 264 Q F3<63617465> 2.5 E<676f7279>-.4 E F0<2e>.32 E .664<4966207573696e6720746865>108 280.8 R F2<2d63>3.164 E F0 .664<636f6d6d616e6420666f726d2c>3.164 F F2 <646261636c>3.164 E F0 .664 <617474656d70747320746f20636c61737369667920746865207465>3.164 F .665<78 7420666f756e6420696e2046494c452c206f7220535444494e206966206e6f2046494c45 206973>-.15 F<6769>108 292.8 Q -.15<7665>-.25 G .166 <6e2e204561636820706f737369626c65>.15 F F3<63617465>2.866 E<676f7279>-.4 E F0 .166<6d757374206265206769>2.986 F -.15<7665>-.25 G 2.666<6e73>.15 G <657061726174656c79>-2.666 E 2.666<2c61>-.65 G .166 <6e642073686f756c6420626520746865208c6c65206e616d65206f66206120707265> -2.666 F .165<76696f75736c79206c6561726e6564>-.25 F<7465>108 304.8 Q .77 <787420636f727075732e205768656e207365>-.15 F -.15<7665>-.25 G .77 <72616c20286d6f7265207468616e206f6e65292063617465>.15 F .771 <676f72696573206172652073706563698c65642c20746865207465>-.15 F .771 <787420636c617373698c636174696f6e20697320706572666f726d6564206279>-.15 F .197<636f6d707574696e672074686520426179657369616e20706f73746572696f7220 70726f626162696c69747920666f722065616368206d6f64656c2c206769>108 316.8 R -.15<7665>-.25 G 2.697<6e74>.15 G .197<686520696e707574207465>-2.697 F .197<78742c20616e642077697468206120756e69666f726d207072696f72>-.15 F <64697374726962>108 328.8 Q<7574696f6e206f6e2063617465>-.2 E <676f726965732e>-.15 E .237 <5768656e206f6e6c7920612073696e676c652063617465>108 345.6 R .237 <676f72792069732073706563698c65642c>-.15 F F2<646261636c>2.737 E F0 .237 <63616c63756c6174657320612073636f7265207768696368206973207468652070726f 64756374206f66207468652063726f737320656e74726f70>2.737 F<79>-.1 E .701 <616e642074686520636f6d706c65>108 357.6 R .701 <78697479206f662074686520696e707574207465>-.15 F .701 <787420286e6565647320746865>-.15 F F2<2d6e>3.201 E F0<616e64>3.201 E F2 <2d76>3.2 E F0 .7<6f7074696f6e73292e2041206c6f>3.2 F 3.2<7773>-.25 G .7 <636f72652028636c6f736520746f207a65726f2920696e646963617465732061>-3.2 F .496<676f6f64208c74206f6620746865>108 369.6 R F3<63617465>3.197 E <676f7279>-.4 E F0 .497<6d6f64656c2e205468652063726f737320656e74726f70> 3.317 F 2.997<796d>-.1 G .497<65617375726573207468652061>-2.997 F -.15 <7665>-.2 G .497<7261676520636f6d7072657373696f6e2072617465207768696368 206973206163686965>.15 F<762d>-.25 E <61626c652c20756e64657220746865206769>108 381.6 Q -.15<7665>-.25 G<6e> .15 E F3<63617465>2.5 E<676f7279>-.4 E F0 2.5<2c66>.32 G <6f7220746865206665617475726573206f662074686520696e707574207465>-2.5 E <78742e>-.15 E<546865>108 398.4 Q F2<2d58>3.025 E F0 .525<73776974636820 63616e2062652075736564207768656e20636c617373696679696e672c20746f206f7570 7574206120636f6e8c64656e6365206c65>3.025 F -.15<7665>-.25 G 3.025<6c69> .15 G 3.025<6e74>-3.025 G .524 <686520636f6d70757465642073636f7265732e20546869732069732061>-3.025 F .463<70657263656e7461676520776869636820657374696d6174657320686f>108 410.4 R 2.963<776c>-.25 G<696b>-2.963 E .464<656c79207468652073636f7265 2069732c207768656e20617373756d696e67207468617420746865206769>-.1 F -.15 <7665>-.25 G 2.964<6e63>.15 G<617465>-2.964 E .464 <676f727920697320636f72726563742e2054686973>-.15 F .228<6973206e6f742061 207375627374697475746520666f72207468652061637475616c2073636f72652c20616e 642073686f756c64206e6f742062652075736564206f6e20697473206f>108 422.4 R .228<776e20746f206465636964652074686520626573742063617465>-.25 F <676f7279>-.15 E 2.728<2e416c>-.65 G -.25<6f77>-2.728 G .305<636f6e8c64 656e63652028652e672e20313025206f72206c657373292063616e20626520696e746572 70726574656420617320616e2022756e7375726522208d61672e204e6f7420616c6c2063 617465>108 434.4 R .306 <676f7279206d6f64656c7320737570706f727420636f6e8c2d>-.15 F <64656e63652073636f7265732c2062>108 446.4 Q <75742022656d61696c222063617465>-.2 E<676f7269657320646f2e>-.15 E .571 <427920646566>108 463.2 R<61756c742c>-.1 E F2<646261636c>3.071 E F0 .571 <77696c6c20636c6173736966792074686520696e707574207465>3.071 F .571 <787420617320612077686f6c652e20486f>-.15 F<7765>-.25 E -.15<7665>-.25 G 1.37 -.4<722c2077>.15 H .57<68656e207573696e6720746865>.4 F F2<2d66>3.07 E F0<6f7074696f6e2c>3.07 E F2<646261636c>3.07 E F0 .57<63616e206265>3.07 F .681<7573656420746f208c6c746572206561636820696e707574206c696e65207365 7061726174656c79>108 475.2 R 3.181<2c70>-.65 G .681<72696e74696e67206f6e 6c792074686f7365206c696e6573207768696368206d61746368206f6e65206f72206d6f 7265206d6f64656c73206964656e74692d>-3.181 F<8c6564206279>108 487.2 Q F3 -.1<6b65>2.5 G<6570>.1 E F0<2e>.19 E .343<4c6561726e696e6720616e6420636c 617373696679696e672063616e6e6f74206265206d6978>108 504 R .343 <6564206f6e207468652073616d6520636f6d6d616e6420696e>-.15 F -.2<766f>-.4 G 2.843<636174696f6e2e204279>.2 F<646566>2.843 E .343 <61756c742c20696e207465>-.1 F .343<7874206d6f64652028>-.15 F F2<2d54> 2.842 E F0<7465>108 516 Q .371<787429206e6f6e2d616c70686162657469632063 68617261637465727320696e2074686520696e7075742061726520616c>-.15 F -.1 <7761>-.1 G .372<79732069676e6f7265642c2061732069732077>.1 F .372 <6f726420636173652c20756e6c657373206f6e65206f72206d6f7265207265>-.1 F <67756c6172>-.15 E -.15<6578>108 528 S 1.385<7072657373696f6e7320617265 20737570706c6965642e20496e20656d61696c206d6f64652028>.15 F F2<2d54>3.885 E F0 1.385<656d61696c292074686520646566>3.885 F 1.384<61756c7420746f6b> -.1 F 1.384 <656e7320617265206d6f726520636f6d706c696361746564202863757272656e746c79> -.1 F<22616470222c20736565>108 540 Q F2<2d65>2.5 E F0<6f7074696f6e292e> 2.5 E .219<496620746865>108 556.8 R F2<2d77>2.719 E F0 .219 <6f7074696f6e206973206769>2.719 F -.15<7665>-.25 G .219 <6e2c2074686520646566>.15 F .22<61756c7420666561747572657320636f6e736973 74206f6620616c6c206e2d6772616d7320757020746f>-.1 F F3<6d61785f6f72>2.72 E<646572>-.37 E F0 2.72<2c77>.73 G .22 <686572652065616368208c727374206f72646572>-2.72 F .171 <636f6d706f6e656e7420697320746f6b>108 568.8 R .171 <656e697a6564206163636f7264696e6720746f20746865206170706c696361626c65> -.1 F F2<2d65>2.671 E F0 .171<6f7074696f6e2e2059>2.671 F .171 <6f752063616e20616c>-1.1 F -.1<7761>-.1 G .17 <79732076697375616c697a652074686520746f6b>.1 F .17 <656e73206279207573696e67>-.1 F<746865>108 580.8 Q F2<2d44>3.522 E F0 1.022<6f7074696f6e207768696c65206c6561726e696e672e204966>3.522 F F2 <2d77>3.522 E F0 1.022<6973206e6f74206769>3.522 F -.15<7665>-.25 G<6e2c> .15 E F2<646261636c>3.522 E F0<617373756d6573>3.522 E F3<6d61785f6f72> 3.903 E<646572>-.37 E F0 1.023<657175616c7320312e2054686520646566>4.253 F 1.023<61756c742066656174757265>-.1 F <73656c656374696f6e20697320636f6d706c6574656c79206f>108 592.8 Q -.15 <7665>-.15 G<72726964656e20686f>.15 E<7765>-.25 E -.15<7665>-.25 G 2.5 <7269>.15 G 2.5<6674>-2.5 G<6865>-2.5 E F2<2d67>2.5 E F0 <73776974636820697320656e636f756e74657265642e>2.5 E .248 <5768656e20737570706c79696e67206f6e65206f72206d6f7265207265>108 609.6 R .247<67756c61722065>-.15 F .247<787072657373696f6e73207769746820746865> -.15 F F2<2d67>2.747 E F0 .247<6f7074696f6e2c206f6e6c792074686f73652066 65617475726573206f662074686520696e707574207465>2.747 F .247<7874206f72> -.15 F<7465>108 621.6 Q .607<787473207768696368206d61746368>-.15 F F3 -.37<7265>3.108 G -.1<6765>-.03 G<78>-.1 E F0 .608 <61726520616e616c7973656420287769746820706f737369626c65206f>3.638 F -.15 <7665>-.15 G .608<726c6170206265747765656e206d617463686573292c20616e6420 6f6e6c792074686f73652073756265>.15 F<78707265732d>-.15 E 1.218 <73696f6e73206f66>108 633.6 R F3 -.37<7265>3.717 G -.1<6765>-.03 G<78> -.1 E F0 1.217<7768696368206172652065>4.247 F 1.217<78706c696369746c7920 746167676564207769746820706172656e74686573657320617265207573656420617320 666561747572657320696e20746865206d6f64656c20286966207365>-.15 F -.15 <7665>-.25 G<72616c>.15 E<73756265>108 645.6 Q 1.033<787072657373696f6e 7320617265207461676765642073696d756c74616e656f75736c79>-.15 F 3.533 <2c74>-.65 G 1.033<686520726573756c74696e672066656174757265206973207468 6520636f6e636174656e6174656420737472696e67206f66207468657365207461676765 64>-3.533 F -.15<6578>108 657.6 S<7072657373696f6e7320696e206f7264657220 6f662074616720617070656172616e6365292e>.15 E -.15<466f>108 674.4 S 8.078 <7272>.15 G -.15<6567>-8.078 G 5.578<756c61722065>.15 F 5.578 <7872657373696f6e2073796e7461782c20736565>-.15 F F2 -.18<7265>8.078 G <676578>.18 E F0<2837292e>A F2 -.25<466f>C<72>.25 E F0<62657374>A F2 -.18<7265>C<73756c74732c>.18 E F0 -.1<6b65>C<6570>.1 E F2<746865>A F0 <6e756d626572>A F2<6f66>A F0<636f6e636174656e61746564>A F2<65787072>A <657373696f6e2d>-.18 E<73>108 686.4 Q F0<7374726963746c79>A F2<62656c6f> A<77>-.1 E F0 2.725<382e205768656e>B .225 <6c6561726e696e672077697468207265>2.725 F .226<67756c61722065>-.15 F .226<787072657373696f6e732c20746865>-.15 F F2<2d44>2.726 E F0 .226 <6f7074696f6e2077696c6c207072696e7420616c6c206d617463686564207465>2.726 F .226<78742066656174757265732c>-.15 F<77686963682069732076>108 698.4 Q <6572792075736566756c20746f20736565207768617420697320676f696e67206f6e2e> -.15 E 1.367<5768656e207361>108 715.2 R 1.367<76696e672063617465>-.2 F 1.367<676f7279208c6c65732c>-.15 F F2<646261636c>3.867 E F0 1.366<8c7273 7420777269746573206f757420612074656d706f72617279208c6c6520696e2074686520 73616d65206c6f636174696f6e2c20616e642072656e616d6573206974>3.867 F <616674657277>108 727.2 Q .859<617264732e20496620612070726f626c656d206f 72206372617368206f636375727320647572696e67206c6561726e696e672c2074686520 6f6c642063617465>-.1 F .86<676f7279208c6c65206973207468657265666f726520 6c65667420756e746f75636865642e>-.15 F -1.11<5665>72 768 S <7273696f6e20312e382e31>1.11 E<426179657369616e2054>111.915 E -.15<6578> -.7 G 2.5<7443>.15 G<6c617373698c636174696f6e2054>-2.5 E 157.465 <6f6f6c732031>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 25 25 TeXDict begin 25 24 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(25)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page2.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E .869 <5468697320656e737572657320746861742063617465>108 84 R .869 <676f726965732063616e206e65>-.15 F -.15<7665>-.25 G 3.369<7262>.15 G 3.369<6563>-3.369 G .869<6f727275707465642c206e6f206d617474657220686f> -3.369 F 3.368<776d>-.25 G<616e>-3.368 E 3.368<7970>-.15 G .868 <726f6365737365732074727920746f2073696d756c74616e656f75736c79>-3.368 F .59<6c6561726e206f7220636c617373696679>108 96 R 3.09<2c61>-.65 G .59 <6e64206d65616e7320746861742076>-3.09 F .59<616c69642063617465>-.25 F .59<676f72696573206172652061>-.15 F -.25<7661>-.2 G .59 <696c61626c6520666f7220636c617373698c636174696f6e20617420616e>.25 F 3.09 <7974>-.15 G .59<696d652e2043617465>-3.09 F .59<676f7279208c6c6573>-.15 F<61726520637265617465642077697468207573657220616e642067726f757020726561 64207065726d697373696f6e73206f6e6c79>108 108 Q<2e>-.65 E .439 <4c6561726e696e6720726f7567686c792077>108 124.8 R .439<6f726b7320627920 747765616b696e672070726f626162696c697469657320756e74696c2074686520747261 696e696e672064617461206973206c656173742073757270726973696e672e2054686520 616d6f756e74206f66>-.1 F .714 <747765616b696e672063616e2062652073656c656374656420627920746865>108 136.8 R/F1 10/Times-Bold@0 SF<2d71>3.214 E F0 .715<6f7074696f6e2e204d6f 726520747765616b696e67206d65616e73206c6f6e676572206c6561726e696e6720616e 64206265747465722061636375726163>3.214 F 2.015 -.65<792c2062>-.15 H <7574>.45 E<757375616c6c79207468652066>108 148.8 Q <6173746573742073657474696e6720697320636c6f736520656e6f7567682e>-.1 E .009<5768656e2072656c6561726e696e67207468652073616d652063617465>108 165.6 R .009<676f7279207365>-.15 F -.15<7665>-.25 G .009 <72616c2074696d65732c2074686520707265>.15 F .008<76696f75736c79206c6561 726e65642070726f626162696c6974696573206172652072657573656420696620706f73 7369626c652c>-.25 F<77686963682063616e20737065656420757020747765616b696e 67206472616d61746963616c6c792028796f752063616e2075736520746865>108 177.6 Q F1<2d30>2.5 E F0<6f7074696f6e20746f20666f7263652072656c6561726e696e67 2066726f6d2073637261746368292e>2.5 E .592 <4e6f7465207468617420636c617373698c636174696f6e2061636375726163>108 194.4 R 3.092<7964>-.15 G .592<6570656e647320666f72656d6f7374206f6e2074 686520616d6f756e7420616e64207175616c697479206f662074686520747261696e696e 672073616d706c65732c20616e64>-3.092 F <7468656e206f6e6c79206f6e20616d6f756e74206f6620747765616b696e672e>108 206.4 Q/F2 10.95/Times-Bold@0 SF<45584954205354>72 223.2 Q -1.04<4154> -.986 G<5553>1.04 E F0 1.125<5768656e207573696e6720746865>108 235.2 R F1 <2d6c>3.625 E F0 1.125<636f6d6d616e6420666f726d2c>3.625 F F1<646261636c> 3.625 E F0 1.125 <72657475726e73207a65726f2e205768656e207573696e6720746865>3.625 F F1 <2d63>3.625 E F0<666f726d2c>3.624 E F1<646261636c>3.624 E F0 1.124 <72657475726e73206120706f73697469>3.624 F -.15<7665>-.25 G<696e7465>108 247.2 Q .667<67657220636f72726573706f6e64696e6720746f20746865>-.15 F/F3 10/Times-Italic@0 SF<63617465>3.367 E<676f7279>-.4 E F0 .667<7769746820 746865206869676865737420706f73746572696f722070726f626162696c697479>3.487 F 3.167<2e49>-.65 G 3.167<6e63>-3.167 G .667 <617365206f662061207469652c20746865208c727374206d6f7374>-3.167 F <70726f6261626c652063617465>108 259.2 Q <676f72792069732063686f73656e2e20496620616e206572726f72206f63637572732c> -.15 E F1<646261636c>2.5 E F0<72657475726e73207a65726f2e>2.5 E F2 <4f5054494f4e53>72 276 Q F0 25.17<2d30205768656e>108 288 R 1.278 <6c6561726e696e672c20707265>3.778 F -.15<7665>-.25 G 1.278 <6e747320776569676874207072656c6f6164696e672e204e6f726d616c6c79>.15 F <2c>-.65 E F1<646261636c>3.778 E F0 1.277 <636865636b73206966207468652063617465>3.777 F 1.277 <676f7279208c6c6520616c7265616479>-.15 F -.15<6578>144 300 S .027 <697374732c20616e6420696620736f2c20747269657320746f20757365207468652065> .15 F .028<78697374696e6720776569676874732061732061207374617274696e6720 706f696e742e20546869732063616e206472616d61746963616c6c792073706565642075 70>-.15 F 3.664<6c6561726e696e672e204966>144 312 R<746865>3.664 E F1 <2d30>3.664 E F0 1.164 <287a65726f2920737769746368206973207365742c207468656e>3.664 F F1 <646261636c>3.664 E F0<62656861>3.663 E -.15<7665>-.2 G 3.663<7361>.15 G 3.663<7369>-3.663 G 3.663<666e>-3.663 G 3.663<6f63>-3.663 G<617465> -3.663 E 1.163<676f7279208c6c6520616c72656164792065>-.15 F<78697374732e> -.15 E <54686973206973206d61696e6c792075736566756c20666f722074657374696e672e> 144 324 Q 25.73<2d6120417070656e64>108 340.8 R .284 <73636f7265732e204576>2.784 F .284<65727920696e707574206c696e6520697320 7772697474656e20746f205354444f555420616e642074686520646261636c2073636f72 65732061726520617070656e6465642e2054686973206973>-.15 F 1.712 <75736566756c20666f7220706f737470726f63657373696e672077697468>144 352.8 R F1<626179>4.212 E<65736f6c>-.1 E F0 4.212<2831292e2046>B 1.712 <6f722065617365206f662070726f63657373696e672c2065>-.15 F -.15<7665>-.25 G 1.711<7279206f726967696e616c20696e707574206c696e65206973>.15 F .847<69 6e64656e74656420627920612073696e676c652073706163652028746f2064697374696e 6775697368207468656d2066726f6d2074686520617070656e6465642073636f72657329 2c20616e6420746865206c696e65207769746820746865>144 364.8 R .45 <73636f72657320286966>144 376.8 R F1<2d6e>2.95 E F0 .45 <6973207573656429206973207072658c78>2.95 F .449<656420776974682074686520 737472696e67202273636f72657320222e2049662061207365636f6e6420636f70>-.15 F 2.949<796f>-.1 G<66>-2.949 E F1<646261636c>2.949 E F0 .449 <6e6565647320746f2072656164>2.949 F<74686973206f7574707574206c61746572> 144 388.8 Q 2.5<2c69>-.4 G 2.5<7473>-2.5 G<686f756c6420626520696e>-2.5 E -.2<766f>-.4 G -.1<6b65>.2 G 2.5<6477>.1 G<69746820746865>-2.5 E F1 <2d41>2.5 E F0<7377697463682e>2.5 E 25.17<2d642044756d70>108 405.6 R 2.23<746865206d6f64656c20706172616d657465727320746f205354444f5554>4.73 F 4.73<2e49>-.74 G 4.73<6e63>-4.73 G 2.23 <6f6e6a756e6374696f6e207769746820746865>-4.73 F F1<2d6c>4.73 E F0 2.23 <6f7074696f6e2c20746869732070726f64756365732061>4.73 F .494<68756d616e2d 7265616461626c652073756d6d617279206f6620746865206d6178696d756d20656e7472 6f70>144 417.6 R 2.994<796d>-.1 G .494 <6f64656c2e20496e20636f6e6a756e6374696f6e207769746820746865>-2.994 F F1 <2d63>2.994 E F0 .493<6f7074696f6e2c206469732d>2.993 F <706c6179732074686520636f6e74726962>144 429.6 Q <7574696f6e206f66206561636820746f6b>-.2 E<656e20746f20746865208c6e616c20 73636f72652e205375707072657373657320616c6c206f74686572206e6f726d616c206f 75747075742e>-.1 E 25.73<2d652053656c656374>108 446.4 R .29 <63686172616374657220636c61737320666f7220646566>2.79 F .29 <61756c7420286e6f6e207265>-.1 F<6765>-.15 E .29 <782d62617365642920746f6b>-.15 F .29<656e697a6174696f6e2e20427920646566> -.1 F .29<61756c742c20746f6b>-.1 F .29 <656e732061726520616c7068616265746963>-.1 F .988 <737472696e6773206f6e6c79>144 458.4 R 3.488<2e54>-.65 G .988 <68697320636f72726573706f6e647320746f207468652063617365207768656e>-3.488 F F3<646566746f6b>3.837 E F0 .987 <69732022616c706861222e20506f737369626c652076>4.157 F .987 <616c75657320666f72>-.25 F F3<646566746f6b>3.837 E F0<617265>4.157 E .173<22616c706861222c2022616c6e756d222c20226772617068222c20226365662220 616e642022616470222e>144 470.4 R .173<546865206c617374207477>5.173 F 2.673<6f61>-.1 G .173<726520637573746f6d20746f6b>-2.673 F .173 <656e697a65727320696e74656e64656420666f7220656d61696c>-.1 F <6d657373616765732e2053656520616c736f>144 482.4 Q F1<6973616c706861>2.5 E F0<2833292e>A 26.84<2d662046696c746572>108 499.2 R .292 <65616368206c696e65206f6620696e7075742073657061726174656c79>2.792 F 2.791<2c6b>-.65 G .291<656570696e6720746865>-2.891 F F3<63617465>2.991 E <676f7279>-.4 E F0 .291<6964656e74698c6564206173>3.111 F F3 -.1<6b65> 2.791 G<6570>.1 E F0 5.291<2e54>.19 G .291 <686973206f7074696f6e2073686f756c64206265>-5.291 F .419 <757365642072657065617465646c7920666f722065616368>144 511.2 R F3 <63617465>3.119 E<676f7279>-.4 E F0 .419<7768696368206d757374206265206b> 3.239 F<6570742e>-.1 E F3 -.1<6b65>5.419 G<6570>.1 E F0 .42 <63616e2062652065697468657220746865>3.109 F F3<63617465>3.12 E<676f7279> -.4 E F0 .42<8c6c65206e616d652c>3.24 F .859<6f72206120706f73697469>144 523.2 R 1.159 -.15<76652069>-.25 H<6e7465>.15 E .859 <67657220726570726573656e74696e6720746865207265717569726564>-.15 F F3 <63617465>3.559 E<676f7279>-.4 E F0 .859<696e207468652073616d65206f7264 65722069742061707065617273206f6e2074686520636f6d2d>3.679 F <6d616e64206c696e652e>144 535.2 Q .589<4f7574707574206c696e657320617265 208d757368656420617320736f6f6e20617320746865>144 552 R 3.089<7961>-.15 G .59<7265207772697474656e2e2049662074686520696e707574208c6c65206973206120 70697065206f7220636861726163746572206465>-3.089 F<766963652c>-.25 E .225 <7468656e20616e20617474656d7074206973206d61646520746f20757365206c696e65 2062>144 564 R<7566>-.2 E .225 <666572696e67206d6f64652c206f746865727769736520746865206d6f7265206566> -.25 F .225<8c6369656e7420626c6f636b2062>-.25 F<7566>-.2 E .225 <666572696e67206973>-.25 F<757365642e>144 576 Q 25.17<2d67204c6561726e> 108 592.8 R .171 <6f6e6c7920666561747572657320646573637269626564206279207468652065>2.67 F .171<7874656e646564207265>-.15 F .171<67756c61722065>-.15 F <787072657373696f6e>-.15 E F3 -.37<7265>2.671 G -.1<6765>-.03 G<78>-.1 E F0 5.171<2e54>.53 G .171<686973206f>-5.171 F -.15<7665>-.15 G .171 <7272696465732074686520646566>.15 F<61756c74>-.1 E .172 <666561747572652073656c656374696f6e206d6574686f642028736565>144 604.8 R F1<2d77>2.672 E F0 .171<6f7074696f6e2920616e64206c6561726e732c20666f7220 65616368206c696e65206f6620696e7075742c206f6e6c7920746f6b>2.672 F .171 <656e7320636f6e7374727563746564>-.1 F 1.997<66726f6d2074686520636f6e6361 74656e6174696f6e206f6620737472696e6773207768696368206d617463682074686520 7461676765642073756265>144 616.8 R 1.998 <787072657373696f6e732077697468696e2074686520737570706c696564>-.15 F F3 -.37<7265>144 628.8 S -.1<6765>-.03 G<78>-.1 E F0 5.584<2e41>.53 G .583 <6c6c20737562737472696e6773207768696368206d61746368>-5.584 F F3 -.37 <7265>3.083 G -.1<6765>-.03 G<78>-.1 E F0 .583<77697468696e206120737566> 3.083 F .583<8c78206f66206561636820696e707574206c696e652061726520747265 617465642061732066656174757265732c>-.25 F -2.15 -.25<65762065>144 640.8 T 2.5<6e69>.25 G 2.5<6674>-2.5 G<6865>-2.5 E 2.5<796f>-.15 G -.15<7665> -2.65 G<726c6170206f6e2074686520696e707574206c696e652e>.15 E .073 <417320616e206f7074696f6e616c20636f6e>144 657.6 R -.15<7665>-.4 G <6e69656e63652c>.15 E F3 -.37<7265>2.574 G -.1<6765>-.03 G<78>-.1 E F0 .074<63616e20696e636c7564652074686520737566>3.104 F<8c78>-.25 E F3 <7c7c78797a>2.024 E F0 .074 <776869636820696e6469636174657320776869636820706172656e74686573697a6564> 2.984 F<73756265>144 669.6 Q .156<787072657373696f6e732073686f756c642062 65207461676765642e20496e207468697320636173652c>-.15 F F3<78797a>3.426 E F0 .156<73686f756c6420636f6e736973742065>3.066 F<78636c757369>-.15 E -.15<7665>-.25 G .155 <6c79206f6620646967697473203120746f20392c206e756d2d>.15 F <626572696e672065>144 681.6 Q<786163746c792074686f73652073756265>-.15 E <787072657373696f6e732077686963682073686f756c64206265207461676765642e> -.15 E 25.17<2d6820536574>108 698.4 R .712 <7468652073697a65206f66207468652068617368207461626c6520746f20325e>3.212 F F3<73697a65>A F0 .713 <656c656d656e74732e205768656e207573696e6720746865>3.213 F F1<2d6c>3.213 E F0 .713 <6f7074696f6e2c20746869732072656665727320746f2074686520746f74616c>3.213 F 1.669<6e756d626572206f6620666561747572657320616c6c6f>144 710.4 R 1.669 <77656420696e20746865206d6178696d756d20656e74726f70>-.25 F 4.169<796d> -.1 G 1.668 <6f64656c206265696e67206c6561726e65642e205768656e207573696e6720746865> -4.169 F F1<2d63>4.168 E F0 .54 <6f7074696f6e20746f67686574686572207769746820746865>144 722.4 R F1<2d4d> 3.04 E F0 .541 <73776974636820616e64206d756c74696e6f6d69616c20747970652063617465>3.041 F .541 <676f726965732c20746869732072656665727320746f20746865206d6178696d756d> -.15 F -1.11<5665>72 768 S<7273696f6e20312e382e31>1.11 E <426179657369616e2054>111.915 E -.15<6578>-.7 G 2.5<7443>.15 G <6c617373698c636174696f6e2054>-2.5 E 157.465<6f6f6c732032>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 26 26 TeXDict begin 26 25 bop 456 251 a Fn(26)1212 b(L.A.)22 b(BREYER)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page3.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E 1.187 <6e756d626572206f662066656174757265732074616b>144 84 R 1.187<656e20696e 746f206163636f756e7420647572696e6720636c617373698c636174696f6e2e>-.1 F -.4<5769>6.187 G 1.187<74686f757420746865>.4 F/F1 10/Times-Bold@0 SF <2d4d>3.687 E F0 1.187<7377697463682c2074686973206f7074696f6e>3.687 F <686173206e6f206566>144 96 Q<666563742e>-.25 E 27.39<2d692046756c6c79> 108 112.8 R .934<696e7465726e6174696f6e616c697a6564206d6f64652e2046> 3.434 F .935<6f726365732074686520757365206f6620776964652063686172616374 65727320696e7465726e616c6c79>-.15 F 3.435<2c77>-.65 G .935 <68696368206973206e656365737361727920696e>-3.435 F<736f6d65206c6f63616c 65732e205468697320696e637572732061206e6f7469636561626c6520706572666f726d 616e63652070656e616c7479>144 124.8 Q<2e>-.65 E 27.39<2d6a204d616b>108 141.6 R 2.736<6566>-.1 G .236<6561747572657320636173652073656e73697469> -2.736 F -.15<7665>-.25 G 2.736<2e4e>.15 G<6f726d616c6c79>-2.736 E 2.736 <2c61>-.65 G .235<6c6c2066656174757265732061726520636f6e>-2.736 F -.15 <7665>-.4 G .235<7274656420746f206c6f>.15 F .235 <776572206361736520647572696e672070726f63657373696e672c>-.25 F .169<7768 69636820726564756365732073746f7261676520726571756972656d656e747320616e64 20696d70726f>144 153.6 R -.15<7665>-.15 G 2.669<7373>.15 G .169<74617469 73746963616c20657374696d6174657320666f7220736d616c6c2064617461736574732e 2057>-2.669 F .17<6974682074686973>-.4 F 1.11<6f7074696f6e2c20746865206f 726967696e616c206361706974616c697a6174696f6e206973207573656420666f722065 61636820666561747572652e20546869732063616e20696d70726f>144 165.6 R 1.41 -.15<76652063>-.15 H 1.11<6c617373698c636174696f6e20616363752d>.15 F <726163>144 177.6 Q -.65<792e>-.15 G 22.39<2d6d204167677265737369>108 194.4 R -.15<7665>-.25 G .208<6c79206d6170732063617465>.15 F .209<676f72 69657320696e746f206d656d6f727920616e64206c6f636b73207468656d20696e746f20 52414d20746f20707265>-.15 F -.15<7665>-.25 G .209<6e74207377>.15 F .209 <617070696e672c20696620706f732d>-.1 F .653<7369626c652e2054686973206973 2075736566756c207768656e20737065656420697320706172616d6f756e7420616e6420 6d656d6f727920697320706c656e746966756c2c20666f722065>144 206.4 R .653 <78616d706c65207768656e2074657374696e67>-.15 F 1.514 <74686520636c617373698c6572206f6e206c6172>144 218.4 R 1.514 <67652064617461736574732e>-.18 F 1.514<4c6f636b696e67206d61792072657175 6972652072656c6178696e672075736572206c696d6974732077697468>6.514 F F1 <756c696d6974>4.015 E F0<2831292e>A F1<41736b>A F0<792d>A<6f7572>144 230.4 Q F1<73797374656d>A F0<61646d696e6973747261746f72>A<2e>-.55 E 25.17<2d6e205072696e74>108 247.2 R .832<73636f72657320666f722065616368> 3.332 F/F2 10/Times-Italic@0 SF<63617465>3.332 E<676f7279>-.4 E F0 5.832 <2e45>.32 G .832 <6163682073636f7265206973207468652070726f64756374206f66207477>-5.832 F 3.332<6f6e>-.1 G .832<756d626572732c207468652063726f737320656e74726f70> -3.332 F 3.331<7961>-.1 G<6e64>-3.331 E 1.682<74686520636f6d706c65>144 259.2 R 1.683<78697479206f662074686520696e707574207465>-.15 F 1.683<7874 20756e6465722065616368206d6f64656c2e204d756c7469706c69656420746f67657468 6572>-.15 F 4.183<2c74>-.4 G<6865>-4.183 E 4.183<7972>-.15 G 1.683 <6570726573656e7420746865206c6f67>-4.183 F 1.112<70726f626162696c697479 20746861742074686520696e70757420726573656d626c657320746865206d6f64656c2e 2054>144 271.2 R 3.611<6f73>-.8 G 1.111 <6565207468657365206e756d626572732073657061726174656c79>-3.611 F 3.611 <2c75>-.65 G 1.111<736520616c736f20746865>-3.611 F F1<2d76>3.611 E F0 .145<6f7074696f6e2e20496e20636f6e6a756e6374696f6e207769746820746865>144 283.2 R F1<2d66>2.645 E F0 .146 <6f7074696f6e2c2073746f7073208c6c746572696e672062>2.645 F .146<75742070 72696e7473206561636820696e707574206c696e652070726570656e6465642077697468 2061>-.2 F<6c697374206f662073636f72657320666f722074686174206c696e652e> 144 295.2 Q 25.17<2d712053656c656374>108 312 R F2<7175616c697479>3.825 E F0 1.075<6f66206c6561726e696e672c207768657265>3.895 F F2<7175616c697479> 3.825 E F0 1.075<63616e20626520312c322c332c342e204869676865722076>3.895 F 1.074<616c7565732074616b>-.25 F 3.574<656c>-.1 G 1.074 <6f6e67657220746f206c6561726e2c20616e64>-3.574 F 1.785<73686f756c642062 6520736c696768746c79206d6f72652061636375726174652e2054686520646566>144 324 R<61756c74>-.1 E F2<7175616c697479>4.535 E F0 1.785 <69732031206966207468652063617465>4.605 F 1.785 <676f7279208c6c6520646f65736e27>-.15 F 4.285<7465>-.18 G 1.785 <78697374206f72>-4.435 F<776569676874732063616e6e6f74206265207072656c6f 616465642c20616e642032206f74686572776973652e>144 336 Q 25.17 <2d6f205768656e>108 352.8 R 1.019 <6c6561726e696e672c2072656164732f777269746573207061727469616c20746f6b> 3.519 F 1.019<656e20636f756e747320736f20746865>-.1 F 3.518<7963>-.15 G 1.018<616e206265207265757365642e204e6f726d616c6c79>-3.518 F 3.518<2c63> -.65 G<617465>-3.518 E 1.018<676f7279208c6c6573>-.15 F .1 <617265206c6561726e65642066726f6d2065>144 364.8 R .1 <786163746c792074686520696e7075742064617461206769>-.15 F -.15<7665>-.25 G .1<6e2c20616e6420646f6e27>.15 F 2.6<7463>-.18 G .1<6f6e7461696e2065> -2.6 F .1 <787472616e656f757320696e666f726d6174696f6e2e205768656e2074686973>-.15 F .358<6f7074696f6e20697320696e206566>144 376.8 R .358 <666563742c20736f6d652065>-.25 F .358 <7874726120696e666f726d6174696f6e206973207361>-.15 F -.15<7665>-.2 G 2.858<6469>.15 G 2.858<6e74>-2.858 G .358<6865208c6c65>-2.858 F F2 <6f6e6c696e65>2.858 E F0 2.858<2c61>.18 G .357 <6674657220616c6c20696e7075742077>-2.858 F .357 <617320726561642e2054686973>-.1 F .025 <696e666f726d6174696f6e2063616e2062652072657265616420746865206e65>144 388.8 R .025<78742074696d65206c6561726e696e67206f63637572732c20746f2063 6f6e74696e75652077686572652074686520707265>-.15 F .026 <76696f75732064617461736574206c656674>-.25 F<6f66>144 400.8 Q 1.169 <662e204966>-.25 F F2<6f6e6c696e65>3.899 E F0<646f65736e27>3.849 E 3.669 <7465>-.18 G 1.169<786973742c20697420697320637265617465642e204966>-3.819 F F2<6f6e6c696e65>3.899 E F0 -.15<6578>3.849 G 1.169<697374732c20697420 69732072656164206265666f7265206c6561726e696e672c20616e642075706461746564> .15 F<616674657277>144 412.8 Q<617264732e20546865208c6c6520697320617070 726f78696d6174656c7920332074696d65732062696767657220286174206c6561737429 207468616e20746865206c6561726e6564>-.1 E F2<63617465>2.5 E<676f7279>-.4 E F0<2e>.32 E 26.84<2d72204c6561726e>108 429.6 R <7468652064696772616d6963207265666572656e6365206d6f64656c206f6e6c79>2.5 E 2.5<2e53>-.65 G<6b69707320746865206c6561726e696e67206f662065>-2.5 E <7874726120666561747572657320696e20746865207465>-.15 E <787420636f727075732e>-.15 E 25.17<2d762056>108 446.4 R .194<6572626f73 65206d6f64652e205768656e206c6561726e696e672c207072696e74206f757420646574 61696c73206f662074686520636f6d7075746174696f6e2c207768656e20636c61737369 6679696e672c207072696e74206f757420746865>-1.11 F 1.199 <6e616d65206f6620746865206d6f73742070726f6261626c65>144 458.4 R F2 <63617465>3.699 E<676f7279>-.4 E F0 6.199<2e49>.32 G 3.699<6e63>-6.199 G 1.199<6f6e6a756e6374696f6e207769746820746865>-3.699 F F1<2d6e>3.699 E F0 1.198<6f7074696f6e2c207072696e7473207468652073636f72657320617320616e> 3.699 F -.15<6578>144 470.4 S <706c696369742070726f64756374206f66207468652063726f737320656e74726f70> .15 E 2.5<7961>-.1 G<6e642074686520636f6d706c65>-2.5 E<78697479>-.15 E <2e>-.65 E 22.95<2d772053656c656374>108 487.2 R<646566>3.478 E .978 <61756c7420666561747572657320746f206265206e2d6772616d7320757020746f>-.1 F F2<6d61785f6f72>3.478 E<646572>-.37 E F0 5.978<2e54>.73 G .978 <68697320697320696e636f6d70617469626c65207769746820746865>-5.978 F F1 <2d67>3.478 E F0<6f7074696f6e2c>3.478 E .208<776869636820616c>144 499.2 R -.1<7761>-.1 G .208<79732074616b>.1 F .208 <657320707265636564656e63652e204966206e6f>-.1 F F1<2d77>2.707 E F0<6f72> 2.707 E F1<2d67>2.707 E F0 .207<6f7074696f6e7320617265206769>2.707 F -.15<7665>-.25 G<6e2c>.15 E F1<646261636c>2.707 E F0<617373756d6573> 2.707 E F1<2d77>2.707 E F0 .207<312e204e6f74652074686174206e2d>2.707 F .25<6772616d7320666f72206e2067726561746572207468616e20312063616e20737472 6164646c65206c696e6520627265616b732e20496620796f7527>144 511.2 R .251 <7265206c6561726e696e672073696e676c65206c696e6573206f66207465>-.5 F .251 <78742c20697427>-.15 F 2.751<736d>-.55 G<6f7265>-2.751 E <616363757261746520746f2075736520746865>144 523.2 Q F1<2d67>2.5 E F0 <6f7074696f6e20617320617070726f7072696174652e>2.5 E 25.17<2d7820536574> 108 540 R 1.846 <646563696d6174696f6e2070726f626162696c69747920746f2031202d20325e28> 4.346 F F2<2d646563696d>A F0 4.346<292e2054>B 4.346<6f72>-.8 G 1.846<65 64756365206d656d6f727920726571756972656d656e7473207768656e206c6561726e69 6e672c>-4.346 F 1.916<736f6d6520696e70757473206172652072616e646f6d6c7920 736b69707065642c20616e64206f6e6c792061206665>144 552 R 4.416<7761>-.25 G 1.916<726520616464656420746f20746865206d6f64656c2e>-4.416 F 1.916 <45786163742062656861>6.916 F<76696f7572>-.2 E 1.849 <646570656e6473206f6e20746865206170706c696361626c65>144 564 R F1<2d54> 4.348 E F0 1.848<6f7074696f6e2028646566>4.348 F 1.848<61756c74206973>-.1 F F1<2d54>4.348 E F0<227465>4.348 E 4.348<787422292e205768656e>-.15 F 1.848<7468652074797065206973206e6f742022656d61696c22202865>4.348 F<67> -.15 E<227465>144 576 Q 1.728<787422292c207468656e20696e6469>-.15 F 1.728<76696475616c20696e707574206665617475726573206172652061646465642077 6974682070726f626162696c69747920325e28>-.25 F F2<2d646563696d>A F0 1.729 <292e205768656e207468652074797065206973>B .981<22656d61696c222c20746865 6e2066756c6c20696e707574206d65737361676573206172652061646465642077697468 2070726f626162696c69747920325e28>144 588 R F2<2d646563696d>A F0 3.481 <292e2057>B .98<697468696e20656163682073756368206d65732d>-.4 F <736167652c20616c6c2066656174757265732061726520757365642e>144 600 Q 22.95<2d4120457870656374>108 616.8 R .619 <696e64656e74656420696e70757420616e642073636f7265732e2057>3.119 F .619 <6974682074686973207377697463682c>-.4 F F1<646261636c>3.119 E F0 -.15 <6578>3.119 G .62<706563747320696e707574206c696e657320746f20626520696e64 656e7465642062792061>.15 F .03<73696e676c652073706163652063686172616374 657220287768696368206973207468656e20736b6970706564292e>144 628.8 R .03 <4c696e6573207374617274696e67207769746820616e>5.03 F 2.53<796f>-.15 G .03<7468657220636861726163746572206172652069676e6f7265642e>-2.53 F .406 <546869732069732074686520636f756e7465727061727420746f20746865>144 640.8 R F1<2d61>2.906 E F0 .406<7377697463682061626f>2.906 F -.15<7665>-.15 G 5.406<2e57>.15 G .406 <68656e207573656420746f676574686572207769746820746865>-5.406 F F1<2d61> 2.906 E F0<7377697463682c>2.906 E F1<646261636c>2.906 E F0<6f75742d> 2.906 E<707574732074686520736b6970706564206c696e657320617320746865>144 652.8 Q 2.5<7961>-.15 G<72652c20616e64207265696e736572747320746865207370 616365206174207468652066726f6e74206f6620656163682070726f6365737365642069 6e707574206c696e652e>-2.5 E 22.95<2d44205072696e74>108 669.6 R<646562> 3.786 E 1.286 <7567206f75747075742e20446f206e6f7420757365206e6f726d616c6c79>-.2 F 3.786<2c62>-.65 G 1.286<75742063616e2062652076>-3.986 F 1.285<6572792075 736566756c20666f7220646973706c6179696e6720746865206c69737420666561747572 6573>-.15 F<7069636b>144 681.6 Q <6564207570207768696c65206c6561726e696e672e>-.1 E 22.95<2d4820416c6c6f> 108 698.4 R 3.932<7768>-.25 G 1.432<617368207461626c6520746f2067726f> -3.932 F 3.932<7775>-.25 G 3.932<7074>-3.932 G 3.932<6f616d>-3.932 G 1.433<6178696d756d206f6620325e>-3.932 F F2<6773697a65>A F0 1.433<656c65 6d656e747320647572696e67206c6561726e696e672e20496e697469616c2073697a6520 6973>3.933 F<6769>144 710.4 Q -.15<7665>-.25 G 2.5<6e62>.15 G<79>-2.5 E F1<2d68>2.5 E F0<6f7074696f6e2e>2.5 E -1.11<5665>72 768 S <7273696f6e20312e382e31>1.11 E<426179657369616e2054>111.915 E -.15<6578> -.7 G 2.5<7443>.15 G<6c617373698c636174696f6e2054>-2.5 E 157.465 <6f6f6c732033>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 27 27 TeXDict begin 27 26 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(27)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page4.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E 24.06 <2d4c2053656c656374>108 84 R .748<7468652064696772616d696320726566657265 6e6365206d65617375726520666f7220636861726163746572207472616e736974696f6e 732e20546865>3.248 F/F1 10/Times-Italic@0 SF<6d6561737572>3.248 E<65> -.37 E F0 .748<63616e206265206f6e65206f662022756e692d>3.248 F <666f726d222c20226469726963686c657422206f7220226d6178>144 96 Q <656e74222e20446566>-.15 E<61756c742069732022756e69666f726d222e>-.1 E 21.28<2d4d2046>108 112.8 R .193<6f726365206d756c74696e6f6d69616c2063616c 63756c6174696f6e732e205768656e206c6561726e696e672c20666f7263657320746865 206d6f64656c20666561747572657320746f2062652074726561746564206d756c74696e 6f6d692d>-.15 F<616c6c79>144 124.8 Q 2.589<2e57>-.65 G .088 <68656e20636c617373696679696e672c20636f72726563747320656e74726f70>-2.589 F 2.588<7973>-.1 G .088<636f72657320746f2072658d656374206d756c74696e6f6d 69616c2070726f626162696c697469657320286f6e6c79206170706c696361626c65> -2.588 F .294<746f206d756c74696e6f6d69616c2074797065206d6f64656c732c2069 662070726573656e74292e>144 136.8 R .295<53636f7265732077696c6c20616c> 5.295 F -.1<7761>-.1 G .295<7973206265206c6f>.1 F<776572>-.25 E 2.795 <2c62>-.4 G .295<65636175736520746865206f72646572696e67206f66206665612d> -2.795 F<7475726573206973206c6f73742e>144 148.8 Q 22.95 <2d4e205072696e74>108 165.6 R 2.052 <706f73746572696f722070726f626162696c697469657320666f722065616368>4.552 F F1<63617465>4.552 E<676f7279>-.4 E F0 7.052<2e54>.32 G 2.052 <68697320617373756d65732074686520737570706c6965642063617465>-7.052 F 2.051<676f7269657320666f726d20616e>-.15 F -.15<6578>144 177.6 S <686175737469>.15 E 1.675 -.15<7665206c>-.25 H 1.375 <697374206f6620706f73736962696c69746965732e>.15 F 1.375 <496e20636f6e6a756e6374696f6e207769746820746865>6.375 F/F2 10 /Times-Bold@0 SF<2d66>3.875 E F0 1.375 <6f7074696f6e2c2073746f7073208c6c746572696e672062>3.875 F 1.375 <7574207072696e74732065616368>-.2 F<696e707574206c696e652070726570656e64 6564207769746820612073756d6d617279206f662074686520706f73746572696f722064 697374726962>144 189.6 Q<7574696f6e20666f722074686174206c696e652e>-.2 E 23.5<2d5220496e636c756465>108 206.4 R .915<616e2065>3.415 F .915 <787472612063617465>-.15 F .914 <676f727920666f7220707572656c792072616e646f6d207465>-.15 F .914 <78742e205468652063617465>-.15 F .914 <676f72792069732063616c6c6564202272616e646f6d222e>-.15 F .914 <4f6e6c79206d616b>5.914 F<6573>-.1 E <73656e7365207768656e207573696e6720746865>144 218.4 Q F2<2d63>2.5 E F0 <6f7074696f6e2e>2.5 E 24.06<2d542053706563696679>108 235.2 R .917 <6e6f6e7374616e64617264207465>3.417 F .917 <787420666f726d61742e20427920646566>-.15 F<61756c742c>-.1 E F2 <646261636c>3.417 E F0 .917 <617373756d657320746861742074686520696e707574207465>3.417 F .918 <7874206973206120707572656c79>-.15 F/F3 9/Times-Roman@0 SF<4153434949> 3.418 E F0<7465>144 247.2 Q<7874208c6c652e205468697320636f72726573706f6e 647320746f207468652063617365207768656e>-.15 E F1<74797065>2.63 E F0 <697320227465>2.68 E<7874222e>-.15 E 1.744<546865726520617265207365>144 264 R -.15<7665>-.25 G 1.744<72616c20747970657320616e642073756274797065 732077686963682063616e206265207573656420746f20636c65616e2074686520696e70 7574207465>.15 F 1.743<7874206f662065>-.15 F<787472616e656f7573>-.15 E <746f6b>144 276 Q .862<656e73206265666f72652061637475616c206c6561726e69 6e67206f7220636c617373696679696e672074616b>-.1 F .863<657320706c6163652e 20456163682028737562297479706520796f75207769736820746f20757365206d757374 206265>-.1 F 1.445<696e6469636174656420776974682061207365706172617465> 144 288 R F2<2d54>3.945 E F0 1.444<6f7074696f6e206f6e2074686520636f6d6d 616e64206c696e652c20616e64206175746f6d61746963616c6c7920696d706c69657320 74686520636f7272652d>3.944 F<73706f6e64696e6720747970652e>144 300 Q 1.027<54686520227465>144 316.8 R 1.027<787422207479706520697320666f7220 756e7374727563747572656420706c61696e207465>-.15 F 1.027<78742e204e6f2063 6c65616e757020697320706572666f726d65642e20546869732069732074686520646566> -.15 F 1.027<61756c74206966206e6f>-.1 F<747970657320617265206769>144 328.8 Q -.15<7665>-.25 G 2.5<6e6f>.15 G 2.5<6e74>-2.5 G <686520636f6d6d616e64206c696e652e>-2.5 E .285<5468652022656d61696c222074 79706520697320666f72206d626f7820666f726d617420696e707574208c6c6573206f72 2073696e676c652052464338323220656d61696c732e>144 345.6 R .285 <4865616465727320617265207265636f676e697a6564>5.285 F 1.215 <616e64206d6f73742061726520736b69707065642e2054>144 357.6 R 3.715<6f69> -.8 G 1.215<6e636c7564652065>-3.715 F 1.215 <7874726120524643383232207374616e646172642068656164657273202865>-.15 F 1.216<786365707420666f7220747261636b696e672068656164657273292c>-.15 F .675 <757365207468652022656d61696c3a686561646572732220737562747970652e2054> 144 369.6 R 3.174<6f6e>-.8 G .674<616d6520616c6c206865616465727320696e20 74686520656d61696c2c20757365207468652022656d61696c3a78686561646572732220 7375622d>-3.174 F 1.063<747970652e2054>144 381.6 R 3.563<6f73>-.8 G 1.064<6b697020616c6c20686561646572732c2065>-3.563 F 1.064<78636570742074 6865207375626a6563742c207573652022656d61696c3a6e6f68656164657273222e2054> -.15 F 3.564<6f73>-.8 G 1.064 <63616e2062696e617279206174746163686d656e7473>-3.564 F<666f722073747269 6e67732c20757365207468652022656d61696c3a617474732220737562747970652e>144 393.6 Q .079 <5768656e207468652022656d61696c22207479706520697320696e206566>144 410.4 R .078<666563742c2048544d4c206d61726b7570206973206175746f6d61746963616c 6c792072656d6f>-.25 F -.15<7665>-.15 G 2.578<6466>.15 G .078 <726f6d207465>-2.578 F .078<7874206174746163686d656e7473>-.15 F -.15 <6578>144 422.4 S 1.605<63657074207465>.15 F 1.605 <78742f706c61696e206174746163686d656e74732e2054>-.15 F 4.106<6f61>-.8 G 1.606<6c736f2072656d6f>-4.106 F 1.906 -.15<76652048>-.15 H 1.606 <544d4c206d61726b75702066726f6d20706c61696e207465>.15 F 1.606 <7874206174746163686d656e74732c20757365>-.15 F <22656d61696c3a6e6f706c61696e222e2054>144 434.4 Q 2.5<6f70>-.8 G<7265> -2.5 E -.15<7665>-.25 G<6e742048544d4c206d61726b75702072656d6f>.15 E -.25<7661>-.15 G 2.5<6c69>.25 G 2.5<6e61>-2.5 G<6c6c207465>-2.5 E <7874206174746163686d656e74732c207573652022656d61696c3a706c61696e222e> -.15 E .034<546865202268746d6c22207479706520697320666f722072656d6f>144 451.2 R .033<76696e672048544d4c206d61726b757020286265747765656e203c6874 6d6c3e20616e64203c2f68746d6c3e20746167732920616e6420737572726f756e642d> -.15 F .13<696e67207465>144 463.2 R .131<78742e204e6f746520746861742069 66207468652022656d61696c22207479706520697320656e61626c65642c207468656e20 2268746d6c22206973206175746f6d61746963616c6c7920656e61626c656420666f7220 636f6d706174692d>-.15 F <626c65206d657373616765206174746163686d656e7473206f6e6c79>144 475.2 Q <2e>-.65 E .575<5468652022786d6c222074797065206973206c696b>144 492 R 3.075<6522>-.1 G .575<68746d6c222c2062>-3.075 F .575<757420646f65736e27> -.2 F 3.075<7468>-.18 G .574<6f6e6f7572203c68746d6c3e20616e64203c2f6874 6d6c3e2c20616e6420646f65736e27>-3.075 F 3.074<7469>-.18 G .574 <6e746572707265742074616773>-3.074 F .119<28736f20746869732073686f756c64 206265206d6f72652070726f7065726c792063616c6c65642022616e676c65206d61726b 7570222072656d6f>144 504 R -.25<7661>-.15 G .119<6c2c20616e642068617320 6e6f7468696e6720746f20646f20776974682061637475616c>.25 F <584d4c2073656d616e74696373292e>144 516 Q .505<5768656e202268746d6c2220 697320656e61626c65642c206d6f7374206d61726b757020617474726962>144 532.8 R .504<7574657320617265206c6f73742028666f722076>-.2 F .504 <616c756573206f6620276d6f73742720636c6f736520746f2027616c6c27292e>-.25 F <546865>5.504 E 1.939<2268746d6c3a6c696e6b7322207375627479706520666f7263 6573206c696e6b2075726c7320286e657477>144 544.8 R 1.939<6f726b206c6f6361 74696f6e206f6e6c792920746f2062652070617273656420616e64206c6561726e65642c 207768696368>-.1 F -.1<776f>144 556.8 S 2.01<756c64206f7468657277697365 2062652069676e6f7265642e20546865202268746d6c3a616c7422207375627479706520 666f726365732070617273696e67206f6620616c7465726e617469>.1 F 2.31 -.15 <76652074>-.25 H -.15<6578>.15 G 4.51<7469>.15 G 4.51<6e41>-4.51 G -.92 <4c54>-4.51 G<617474726962>144 568.8 Q .105<7574657320616e642076>-.2 F .106<6172696f7573206f7468657220746167732e20546865202268746d6c3a73637269 70747322207375627479706520666f726365732070617273696e67206f66207363726970 74732c202268746d6c3a7374796c657322>-.25 F 2.396<666f72636573207061727369 6e67206f66207374796c65732c202268746d6c3a666f726d732220666f72636573207061 7273696e67206f6620666f726d2076>144 580.8 R 2.396 <616c7565732c207768696c65202268746d6c3a636f6d6d656e747322>-.25 F <666f726365732070617273696e67206f662048544d4c20636f6d6d656e74732e>144 592.8 Q 22.95<2d56205072696e74>108 609.6 R<7468652070726f6772616d2076> 2.5 E<657273696f6e206e756d62657220616e642065>-.15 E<7869742e>-.15 E 22.95<2d58205072696e74>108 626.4 R .744<74686520636f6e8c64656e636520696e 207468652073636f72652063616c63756c6174656420666f722065616368>3.244 F F1 <63617465>3.245 E<676f7279>-.4 E F0 3.245<2c77>.32 G .745 <68656e207573656420746f676574686572207769746820746865>-3.245 F F2<2d6e> 3.245 E F0<6f72>A F2<2d>A<4e>144 638.4 Q F0 2.573 <7377697463682e20546865>B .073<636f6e8c64656e636520697320616e2065737469 6d617465206f6620746865207479706963616c697479206f66207468652073636f72652c 20617373756d696e6720746865206e756c6c2068>2.573 F<79706f746865736973>-.05 E .576<7468617420746865206769>144 650.4 R -.15<7665>-.25 G 3.076<6e63> .15 G<617465>-3.076 E .576 <676f727920697320636f72726563742e205768656e2075736564207769746820746865> -.15 F F2<2d76>3.077 E F0 .577<73776974636820616c6f6e652c2066>3.077 F .577<6163746f72697a6573207468652073636f726520617320746865>-.1 F 1.398 <656d7069726963616c206469>144 662.4 R -.15<7665>-.25 G -.18<7267>.15 G 1.398<656e636520706c757320746865207368616e6e6f6e20656e74726f70>.18 F 2.698 -.65<792c206d>-.1 H 1.398<756c7469706c69656420627920636f6d706c65> .65 F<78697479>-.15 E 3.898<2c69>-.65 G 3.897<6e74>-3.898 G 1.397 <686174206f72646572>-3.897 F 3.897<2e54>-.55 G<6865>-3.897 E F2<2d58> 3.897 E F0 .093<737769746368206973206e6f7420737570706f7274656420696e2061 6c6c20706f737369626c65206d6f64656c732c20616e6420646973706c61797320612070 657263656e74616765206f662022313031222069662069742063616e27>144 674.4 R 2.594<7462>-.18 G 2.594<6563>-2.594 G<616c2d>-2.594 E<63756c617465642e> 144 686.4 Q/F4 10.95/Times-Bold@0 SF<555341>72 703.2 Q<4745>-.602 E F0 2.411 -.8<546f2063>108 715.2 T .811<7265617465207477>.8 F 3.311<6f63>-.1 G<617465>-3.311 E .811<676f7279208c6c657320696e207468652063757272656e74 206469726563746f72792066726f6d207477>-.15 F<6f>-.1 E F3<4153434949>3.311 E F0<7465>3.06 E .81<7874208c6c6573206e616d6564204d61726b5f54>-.15 F -.1 <7761>-.8 G .81<696e2e74787420616e64>.1 F -.4<5769>108 727.2 S <6c6c69616d5f5368616b>.4 E<657370656172652e747874207265737065637469>-.1 E -.15<7665>-.25 G<6c79>.15 E 2.5<2c74>-.65 G<7970653a>-2.5 E -1.11 <5665>72 768 S<7273696f6e20312e382e31>1.11 E<426179657369616e2054> 111.915 E -.15<6578>-.7 G 2.5<7443>.15 G<6c617373698c636174696f6e2054> -2.5 E 157.465<6f6f6c732034>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 28 28 TeXDict begin 28 27 bop 456 251 a Fn(28)1212 b(L.A.)22 b(BREYER)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page5.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E 2.5<2564>108 84 S <6261636c202d6c207477>-2.5 E<61696e204d61726b5f54>-.1 E -.1<7761>-.8 G <696e2e747874>.1 E 2.5<2564>108 96 S<6261636c202d6c207368616b>-2.5 E 2.5 <6557>-.1 G<696c6c69616d5f5368616b>-2.9 E<657370656172652e747874>-.1 E <4e6f>108 112.8 Q 2.5<7779>-.25 G <6f752063616e20636c61737369667920696e707574207465>-2.5 E <78742c20666f722065>-.15 E<78616d706c653a>-.15 E 2.5<2565>108 129.6 S <63686f2022686f>-2.5 E<77647922207c20646261636c202d76202d63207477>-.25 E <61696e202d63207368616b>-.1 E<65>-.1 E<7477>108 141.6 Q<61696e>-.1 E 2.5 <2565>108 153.6 S<63686f2022746f206265206f72206e6f7420746f20626522207c20 646261636c202d76202d63207477>-2.5 E<61696e202d63207368616b>-.1 E<65>-.1 E<7368616b>108 165.6 Q<65>-.1 E .762<4e6f7465207468617420746865>108 182.4 R/F1 10/Times-Bold@0 SF<2d76>3.262 E F0 .762 <6f7074696f6e206973206e6563657373617279>3.262 F 3.262<2c6f>-.65 G <7468657277697365>-3.262 E F1<646261636c>3.262 E F0 .762 <646f6573206e6f74207072696e7420616e>3.262 F .762 <797468696e672e205468652072657475726e2076>-.15 F .762 <616c7565206973203120696e20746865>-.25 F <8c72737420636173652c203220696e20746865207365636f6e642e>108 194.4 Q .428 <537570706f73652061208c6c6520646f63756d656e742e74787420636f6e7461696e73 20456e676c697368207465>108 211.2 R .428<7874206c696e657320696e7465727370 65727365642077697468206e6f697365206c696e65732e2054>-.15 F 2.928<6f8c>-.8 G .428<6c746572206f757420746865206e6f697365>-2.928 F<6c696e65732066726f 6d2074686520456e676c697368206c696e65732c20617373756d696e6720796f75206861> 108 223.2 Q .3 -.15<76652061>-.2 H 2.5<6e65>.15 G <78697374696e672063617465>-2.65 E<676f7279207368616b>-.15 E 2.5<6573>-.1 G<6179>-2.5 E 2.5<2c74>-.65 G<7970653a>-2.5 E 2.5<2564>108 240 S <6261636c202d63207368616b>-2.5 E 2.5<652d>-.1 G 2.5<6673>-2.5 G<68616b> -2.5 E 2.5<652d>-.1 G 2.5<5264>-2.5 G <6f63756d656e742e747874203e20646f63756d656e742e7478745f656e67>-2.5 E 2.5 <2564>108 252 S<6261636c202d63207368616b>-2.5 E 2.5<652d>-.1 G 2.5<6672> -2.5 G<616e646f6d202d5220646f63756d656e742e747874203e20646f63756d656e74 2e7478745f726e64>-2.5 E .157<4e6f7465207468617420746865207175616c697479 206f662074686520726573756c74732077696c6c2076>108 268.8 R .157 <61727920646570656e64696e67206f6e20686f>-.25 F 2.657<7777>-.25 G .157 <656c6c207468652063617465>-2.657 F .158<676f72696573207368616b>-.15 F 2.658<6561>-.1 G .158<6e642072616e646f6d2072657072652d>-2.658 F <73656e74206561636820696e707574206c696e652e>108 280.8 Q<497420697320736f 6d6574696d65732075736566756c20746f207365652074686520706f73746572696f7220 70726f626162696c697469657320666f722065616368206c696e6520776974686f757420 8c6c746572696e673a>5 E 2.5<2564>108 297.6 S<6261636c202d63207368616b> -2.5 E 2.5<652d>-.1 G 2.5<6673>-2.5 G<68616b>-2.5 E 2.5<652d>-.1 G<524e 20646f63756d656e742e747874203e20646f63756d656e742e7478745f70726f6273> -2.5 E -1.1<596f>108 314.4 S 2.842<7563>1.1 G .342<616e206e6f>-2.842 F 2.842<7770>-.25 G .341<6f737470726f636573732074686520706f73746572696f72 2070726f626162696c697469657320666f722065616368206c696e65206f66207465> -2.842 F .341<7874207769746820616e6f74686572207363726970742c20746f207265 706c696361746520616e>-.15 F<61726269747261727920426179657369616e20646563 6973696f6e2072756c65206f6620796f75722063686f6963652e>108 326.4 Q .388 <496e20746865207370656369616c2063617365206f662065>108 343.2 R .389 <786163746c79207477>-.15 F 2.889<6f63>-.1 G<617465>-2.889 E .389<676f72 6965732c20746865206f7074696d616c20426179657369616e206465636973696f6e2070 726f6365647572652063616e20626520696d706c656d656e746564>-.15 F .304 <666f7220646f63756d656e747320617320666f6c6c6f>108 355.2 R .304 <77733a206c6574>-.25 F/F2 10/Times-Italic@0 SF<7031>4.054 E F0 .304<6265 20746865207072696f722070726f626162696c69747920746861742074686520696e7075 74207465>2.804 F .304<787420697320636c617373698c6564206173>-.15 F F2 <63617465>2.803 E<676f727931>-.4 E F0 5.303<2e43>C<6f6e2d>-5.303 E <73657175656e746c79>108 367.2 Q 2.616<2c74>-.65 G .117<6865207072696f72 2070726f626162696c697479206f6620636c617373696679696e67206173>-2.616 F F2 <63617465>2.817 E<676f727932>-.4 E F0 .117<69732031202d>2.637 F F2<7031> 2.617 E F0 5.117<2e4c>C<6574>-5.117 E F2<753132>2.697 E F0 .117 <62652074686520636f7374206f66206d6973636c617373696679696e672061>2.637 F F2<63617465>108 379.2 Q<676f727931>-.4 E F0 .213<696e707574207465>2.713 F .213<78742061732062656c6f6e67696e6720746f>-.15 F F2<63617465>2.913 E <676f727932>-.4 E F0 .213<616e6420766963652076>2.733 F .213 <6572736120666f72>-.15 F F2<753231>2.713 E F0 5.213<2e57>C 2.712<6561> -6.013 G .212 <7373756d65207468657265206973206e6f20636f737420666f7220636c61732d>-2.712 F<73696679696e6720636f72726563746c79>108 391.2 Q 5<2e54>-.65 G <68656e2074686520666f6c6c6f>-5 E<77696e6720636f6d6d616e6420696d706c656d 656e747320746865206f7074696d616c20426179657369616e206465636973696f6e3a> -.25 E 2.5<2564>108 408 S<6261636c202d6e202d63>-2.5 E F2<63617465>2.7 E <676f727931>-.4 E F0<2d63>2.5 E F2<63617465>2.7 E<676f727932>-.4 E F0 2.5<7c61>2.52 G<776b20277b206966282432202a>-2.65 E F2<7031>3.75 E F0<2a> 2.5 E F2<753132>2.58 E F0 2.5<3e24>2.52 G 2.5<342a28>-2.5 G 2.5<312d> -2.5 G F2<7031>A F0 2.5<292a>C F2<753231>A F0 2.5<297b70>C <72696e742024313b207d20656c7365207b>-2.5 E<7072696e742024333b207d207d27> 144 420 Q F1<646261636c>108 436.8 Q F0 .685<63616e20616c736f206265207573 656420696e20636f6e6a756e6374696f6e2077697468>3.185 F F1<7072>3.185 E <6f636d61696c>-.18 E F0 .684<28312920746f20696d706c656d656e742061207369 6d706c6520426179657369616e20656d61696c20636c617373698c63612d>B 1.495<74 696f6e2073797374656d2e20417373756d65207468617420696e636f6d696e67206d6169 6c2073686f756c64206265206175746f6d61746963616c6c792064656c69>108 448.8 R -.15<7665>-.25 G 1.496 <72656420746f206f6e65206f66207468726565206d61696c20666f6c64657273>.15 F 1.346<6c6f636174656420696e20244d41494c44495220616e64206e616d6564>108 460.8 R F2<776f726b>3.846 E F0<2c>.67 E F2<706572>3.846 E<736f6e616c>-.1 E F0 3.846<2c61>.51 G<6e64>-3.846 E F2<7370616d>3.846 E F0 6.346<2e49> .32 G<6e697469616c6c79>-6.346 E 3.846<2c74>-.65 G 1.346 <68657365206d757374206265206372656174656420616e64208c6c6c6564>-3.846 F .186<7769746820617070726f7072696174652073616d706c6520656d61696c732e>108 472.8 R<41>5.186 E F1<6372>2.686 E<6f6e746162>-.18 E F0 .187<283129208c 6c652063616e206265207573656420746f206c6561726e20746865207468726565206361 7465>B .187<676f72696573206f6e6365206120646179>-.15 F 2.687<2c65>-.65 G <2e672e>-2.687 E<4341>108 489.6 Q<54533d24484f4d452f2e646261636c>-1.11 E 5<3530>108 501.6 S 2.5<2a2a2a64>-2.5 G <6261636c202d5420656d61696c202d6c20244341>-2.5 E<54532f77>-1.11 E <6f726b20244d41494c4449522f77>-.1 E<6f726b>-.1 E <31302030202a202a202a20646261636c202d5420656d61696c202d6c20244341>108 513.6 Q<54532f706572736f6e616c20244d41494c4449522f706572736f6e616c>-1.11 E<31352030202a202a202a20646261636c202d5420656d61696c202d6c20244341>108 525.6 Q<54532f7370616d20244d41494c4449522f7370616d>-1.11 E 3.508 -.8 <546f2061>108 542.4 T 1.908<75746f6d61746963616c6c792064656c69>.8 F -.15 <7665>-.25 G 4.408<7265>.15 G 1.908<61636820696e636f6d696e6720656d61696c 20696e746f2074686520617070726f70726961746520666f6c646572>-4.408 F 4.407 <2c74>-.4 G 1.907<686520666f6c6c6f>-4.407 F<77696e67>-.25 E F1<7072> 4.407 E<6f636d61696c72>-.18 E<63>-.18 E F0<283529>A <72656369706520667261676d656e7420636f756c6420626520757365643a>108 554.4 Q<4341>108 571.2 Q<54533d24484f4d452f2e646261636c>-1.11 E 2.5<2372>108 588 S<756e20746865207370616d20636c617373698c6572>-2.5 E<3a302063>108 600 Q -1.15 -1.2<59412059>108 612 T <3d7c20646261636c202d765420656d61696c202d6320244341>1.2 E<54532f77>-1.11 E<6f726b202d6320244341>-.1 E<54532f706572736f6e616c202d6320244341>-1.11 E<54532f7370616d>-1.11 E 2.5<2373>108 628.8 S <656e6420746f2074686520617070726f707269617465206d61696c626f78>-2.5 E <3a303a>108 640.8 Q 2.5<2a3f74>108 652.8 S<657374202d6e20222459>-2.5 E -1.05<4159>-1.2 G<22>1.05 E<244d41494c4449522f2459>108 664.8 Q -1.05 <4159>-1.2 G<3a303a>108 681.6 Q<24444546>108 693.6 Q -.55<4155>-.74 G -.92<4c54>.55 G<536f6d6574696d65732c>108 710.4 Q F1<646261636c>2.816 E F0 .317<77696c6c2073656e642074686520656d61696c20746f207468652077726f6e67 206d61696c626f782e20496e207468617420636173652c20746865206d6973636c617373 698c6564206d6573736167652073686f756c64>2.816 F .109<62652072656d6f>108 722.4 R -.15<7665>-.15 G 2.609<6466>.15 G .109<726f6d206974732077726f6e 672064657374696e6174696f6e20616e6420706c6163656420696e2074686520636f7272 656374206d61696c626f782e>-2.609 F .108 <4966206974206973206c65667420696e207468652077726f6e672063617465>5.108 F <676f7279>-.15 E<2c>-.65 E -1.11<5665>72 768 S<7273696f6e20312e382e31> 1.11 E<426179657369616e2054>111.915 E -.15<6578>-.7 G 2.5<7443>.15 G <6c617373698c636174696f6e2054>-2.5 E 157.465<6f6f6c732035>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 29 29 TeXDict begin 29 28 bop 1428 251 a Fn(THE)30 b(DBA)n(CL)g(TEXT)f (CLASSIFIER)906 b(29)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page6.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E/F1 10/Times-Bold@0 SF <646261636c>108 84 Q F0<77696c6c206c6561726e207468652077726f6e6720636f72 70757320737461746973746963732e>2.5 E 1.185<54686520646566>108 100.8 R 1.185<61756c74207465>-.1 F 1.185<78742066656174757265732028746f6b>-.15 F 1.185<656e73292072656164206279>-.1 F F1<646261636c>3.685 E F0 1.185<6172 6520707572656c7920616c706861626574696320737472696e67732c207768696368206d 696e696d697a6573206d656d6f7279>3.685 F .49<726571756972656d656e74732062> 108 112.8 R .49<75742063616e20626520756e7265616c697374696320696e20736f6d 652063617365732e2054>-.2 F 2.989<6f63>-.8 G .489<6f6e737472756374206d6f 64656c73206261736564206f6e20616c7068616e756d6572696320746f6b>-2.989 F .489<656e732c20757365>-.1 F<746865>108 124.8 Q F1<2d65>3.907 E F0 1.407 <7377697463682e205468652065>3.907 F 1.407<78616d706c652062656c6f>-.15 F 3.907<7761>-.25 G 1.407<6c736f207573657320746865206f7074696f6e616c> -3.907 F F1<2d44>3.907 E F0 1.408<7377697463682c207768696368207072696e74 732061206c697374206f662061637475616c20746f6b>3.907 F<656e73>-.1 E <666f756e6420696e2074686520646f63756d656e743a>108 136.8 Q 2.5<2564>108 153.6 S<6261636c202d6520616c6e756d202d44202d6c207477>-2.5 E <61696e204d61726b5f54>-.1 E -.1<7761>-.8 G<696e2e747874207c206c657373>.1 E 1.543<497420697320616c736f20706f737369626c6520746f206f>108 170.4 R -.15<7665>-.15 G 1.543<72726964652074686520646566>.15 F 1.543<61756c7420 666561747572652073656c656374696f6e206d6574686f64207573656420746f206c6561 726e207468652063617465>-.1 F 1.543<676f7279206d6f64656c206279>-.15 F .255<6d65616e73206f66207265>108 182.4 R .255<67756c61722065>-.15 F .255 <787072657373696f6e732e2046>-.15 F .256<6f722065>-.15 F .256 <78616d706c652c2074686520666f6c6c6f>-.15 F .256 <77696e67206475706c6963617465732074686520646566>-.25 F .256 <61756c7420666561747572652073656c656374696f6e206d6574686f6420696e>-.1 F <7468652043206c6f63616c652c207768696c65206265696e67206d75636820736c6f> 108 194.4 Q<7765723a>-.25 E 2.5<2564>108 211.2 S<6261636c202d6c207477> -2.5 E<61696e202d6720275e285b5b3a616c7068613a5d5d2b2927202d6720275b5e5b 3a616c7068613a5d5d285b5b3a616c7068613a5d5d2b2927204d61726b5f54>-.1 E -.1 <7761>-.8 G<696e2e747874>.1 E 3.966<5468652063617465>108 228 R 3.966 <676f7279207477>-.15 F 3.966<61696e207768696368206973206f627461696e6564 20646570656e6473206f6e6c79206f6e2073696e676c6520616c70686162657469632077> -.1 F 3.966<6f72647320696e20746865207465>-.1 F 3.966<7874208c6c65>-.15 F <4d61726b5f54>108 240 Q -.1<7761>-.8 G .077<696e2e7478742028616e6420636f 6d70757465642064696772616d207374617469737469637320666f722070726564696374 696f6e292e>.1 F -.15<466f>5.078 G 2.578<726173>.15 G .078 <65636f6e642065>-2.578 F .078<78616d706c652c2074686520666f6c6c6f>-.15 F .078<77696e6720636f6d2d>-.25 F 1.215<6d616e642062>108 252 R 1.215 <75696c6473206120736d6f6f74686564204d61726b>-.2 F -.15<6f76>-.1 G 1.214 <69616e202877>.15 F 1.214<6f72642062696772616d29206d6f64656c207768696368 20646570656e6473206f6e207061697273206f6620636f6e736563757469>-.1 F 1.514 -.15<76652077>-.25 H<6f726473>.05 E <77697468696e2065616368206c696e65202862>108 264 Q<7574207061697273206361 6e6e6f74207374726164646c652061206c696e6520627265616b293a>-.2 E 2.5<2564> 108 280.8 S<6261636c202d6c207477>-2.5 E<61696e32202d672027285e7c5b5e5b3a 616c7068613a5d5d29285b5b3a616c7068613a5d5d2b297c7c3227202d67>-.1 E<2728 5e7c5b5e5b3a616c7068613a5d5d29285b5b3a616c7068613a5d5d2b295b5e5b3a616c70 68613a5d5d2b285b5b3a616c7068613a5d5d2b297c7c323327204d61726b5f54>144 292.8 Q -.1<7761>-.8 G<696e2e747874>.1 E .152<4d6f72652067656e6572616c2c 206c696e652062617365642c206e2d6772616d206d6f64656c73206f6620616c6c206f72 646572732063616e2062652062>108 309.6 R .151 <75696c7420696e20612073696d696c61722077>-.2 F<6179>-.1 E 5.151<2e54>-.65 G 2.651<6f63>-5.951 G .151<6f6e73747275637420706172616772617068>-2.651 F 1.084<6261736564206d6f64656c732c20796f752073686f756c64207265666f726d6174 2074686520696e70757420636f72706f72612077697468>108 321.6 R F1<61776b> 3.584 E F0 1.084<283129206f72>B F1<736564>3.585 E F0 1.085 <28312920746f206f627461696e206f6e652070617261677261706820706572>B 1.177 <6c696e652e204c696e652073697a65206973206c696d697465642062792061>108 333.6 R -.25<7661>-.2 G 1.176<696c61626c65206d656d6f7279>.25 F 3.676 <2c62>-.65 G 1.176<7574206e6f74652074686174207265>-3.876 F<6765>-.15 E 3.676<7870>-.15 G 1.176<6572666f726d616e63652077696c6c206465>-3.676 F 1.176<677261646520717569636b6c7920666f72>-.15 F<6c6f6e67206c696e65732e> 108 345.6 Q 1.644<48616e6479207469703a2043726561746520746865206869646465 6e206469726563746f72792024484f4d452f2e646261636c2c20616e6420736574204442> 108 362.4 R -.4<4143>-.35 G<4c5f50>.4 E -1.11<4154>-.92 G 1.644 <483d24484f4d452f2e646261636c20696e20796f7572>1.11 F<7368656c6c20696e69 7469616c697a6174696f6e207363726970742e205468656e20796f752063616e20726566 657220746f2063617465>108 374.4 Q <676f7269657320776974686f75742077726974696e672066756c6c2070617468732e> -.15 E/F2 10.95/Times-Bold@0 SF<454e564952>72 391.2 Q<4f4e4d454e54>-.329 E F0<4442>108 403.2 Q -.4<4143>-.35 G<4c5f50>.4 E -1.11<4154>-.92 G<48> 1.11 E 1.246<5768656e20746869732076>144 415.2 R 1.246 <61726961626c65206973207365742c206974732076>-.25 F 1.246 <616c75652069732070726570656e64656420746f2065>-.25 F -.15<7665>-.25 G <7279>.15 E/F3 10/Times-Italic@0 SF<63617465>3.946 E<676f7279>-.4 E F0 1.246<8c6c656e616d6520776869636820646f65736e27>4.066 F 3.746<7473>-.18 G <74617274>-3.746 E<77697468206120272f27206f72206120272e>144 427.2 Q <272e>-.7 E F2<5349474e>72 444 Q<414c53>-.219 E F0 16.84<494e54204966> 108 456 R .082<74686973207369676e616c206973206361756768742c>2.581 F F1 <646261636c>2.582 E F0 .082<73696d706c792065>2.582 F .082 <7869747320776974686f757420646f696e6720616e>-.15 F 2.582<7963>-.15 G .082<6c65616e7570206f72206f74686572206f7065726174696f6e732e205468697320 7369672d>-2.582 F<6e616c2063616e206f6674656e2062652073656e74206279207072 657373696e67204374726c2d43206f6e20746865206b>144 468 Q -.15<6579>-.1 G <626f6172642e20536565>.15 E F1<73747479>2.5 E F0<2831292e>A<485550>108 484.8 Q 2.5<2c51>-1.11 G<554954>-2.6 E 2.5<2c54>-.74 G<45524d>-2.5 E 1.237 <4966206f6e65206f66207468657365207369676e616c73206973206361756768742c> 144 496.8 R F1<646261636c>3.737 E F0 1.237<73746f70732072656164696e6720 696e70757420616e6420636f6e74696e75657320697473206f7065726174696f6e206173 206966206e6f>3.737 F .999<6d6f726520696e7075742077>144 508.8 R .999 <61732061>-.1 F -.25<7661>-.2 G .999 <696c61626c652e205468697320697320612077>.25 F .999 <6179206f66207175697474696e6720677261636566756c6c79>-.1 F 3.5<2c62>-.65 G 1<7574206e6f7465207468617420696e206c6561726e696e67206d6f64652c2061> -3.7 F<63617465>144 520.8 Q .437<676f7279208c6c652077696c6c206265207772 697474656e206261736564206f6e2074686520696e636f6d706c65746520696e7075742e 205468652051>-.15 F .436 <554954207369676e616c2063616e206f6674656e2062652073656e74206279>-.1 F <7072657373696e67204374726c2d206f6e20746865206b>144 532.8 Q -.15<6579> -.1 G<626f6172642e20536565>.15 E F1<73747479>2.5 E F0<2831292e>A 9.05 <55535231204966>108 549.6 R 1.363 <74686973207369676e616c206973206361756768742c>3.862 F F1<646261636c> 3.863 E F0 1.363<72656c6f616473207468652063757272656e742063617465>3.863 F 1.363<676f7269657320617420746865206561726c69657374206665617369626c6520 6f70706f7274756e697479>-.15 F<2e>-.65 E .402<54686973206973206e6f74206e 6f726d616c6c792075736566756c20617420616c6c2c2062>144 561.6 R .402<757420 6d6967687420626520696e207370656369616c2063617365732c20737563682061732069 6620746865>-.2 F F1<2d66>2.902 E F0 .402<73776974636820697320696e>2.902 F -.2<766f>-.4 G -.1<6b65>.2 G<64>.1 E<746f676574686572207769746820696e 7075742066726f6d2061206c6f6e672072756e6e696e6720706970652e>144 573.6 Q F2<4e4f>72 590.4 Q<544553>-.438 E F1<646261636c>108 602.4 Q F0 .233 <67656e6572617465642063617465>2.733 F .234<676f7279208c6c65732061726520 696e2062696e61727920666f726d61742c20616e64206d6179206f72206d6179206e6f74 20626520706f727461626c6520746f2073797374656d73207573696e672061206469662d> -.15 F .239<666572656e742062797465206f7264657220617263686974656374757265 20287468697320646570656e6473206f6e20686f>108 614.4 R<77>-.25 E F1 <646261636c>2.739 E F0 -.1<7761>2.739 G 2.739<7363>.1 G .239 <6f6d70696c6564292e20546865>-2.739 F F1<2d56>2.739 E F0 .238 <737769746368207072696e7473206f75742077686574686572>2.738 F<63617465>108 626.4 Q<676f726965732061726520706f727461626c652c206f7220656c736520796f75 2063616e206a7573742065>-.15 E<78706572696d656e742e>-.15 E F1<646261636c> 108 643.2 Q F0 1.332<646f6573206e6f74207265636f676e697a652066756e637469 6f6e616c6c792065717569>3.832 F -.25<7661>-.25 G 1.332<6c656e74207265>.25 F 1.332<67756c61722065>-.15 F 1.333<787072657373696f6e732c20616e6420696e 20746869732063617365206475706c6963617465206665617475726573>-.15 F <77696c6c20626520636f756e746564207365>108 655.2 Q -.15<7665>-.25 G <72616c2074696d65732e>.15 E -.4<5769>108 672 S .518<74682065>.4 F -.15 <7665>-.25 G .518<7279206c6561726e65642063617465>.15 F<676f7279>-.15 E 3.018<2c74>-.65 G .517<686520636f6d6d616e64206c696e65206f7074696f6e7320 746861742077657265207573656420617265207361>-3.018 F -.15<7665>-.2 G 3.017<642e205768656e>.15 F .517<636c617373696679696e672c206d616b>3.017 F <65>-.1 E .771<7375726520746861742065>108 684 R -.15<7665>-.25 G .771 <72792072656c65>.15 F -.25<7661>-.25 G .771<6e742063617465>.25 F .771 <676f72792077>-.15 F .771<6173206c6561726e65642077697468207468652073616d 6520736574206f66206f7074696f6e7320287265>-.1 F<6765>-.15 E -.15<7865> -.15 G 3.271<7361>.15 G .772<726520616c6c6f>-3.271 F .772 <77656420746f20646966>-.25 F<666572292c>-.25 E <6f74686572776973652062656861>108 696 Q <76696f757220697320756e64658c6e65642e>-.2 E 1.182<53706563698c6320646f63 756d656e746174696f6e2061626f7574207468652064657369676e206f66>108 712.8 R F1<646261636c>3.681 E F0 1.181<616e642074686520737461746973746963616c20 6d6f64656c73207468617420697420757365732063616e20626520666f756e6420696e> 3.681 F 1.93<2f686f6d652f6c616972642f6c6f63616c2f73686172652f646261636c 2f646f632f646261636c2e7073202e2046>108 724.8 R 1.93 <6f722061206261736963206f>-.15 F -.15<7665>-.15 G<72766965>.15 E 4.43 <776f>-.25 G 4.43<6674>-4.43 G -.15<6578>-4.43 G 4.43<7463>.15 G 1.93 <6c617373698c636174696f6e207573696e67>-4.43 F F1<646261636c>4.43 E F0 4.43<2c73>C<6565>-4.43 E -1.11<5665>72 768 S<7273696f6e20312e382e31>1.11 E<426179657369616e2054>111.915 E -.15<6578>-.7 G 2.5<7443>.15 G <6c617373698c636174696f6e2054>-2.5 E 157.465<6f6f6c732036>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Page: 30 30 TeXDict begin 30 29 bop 456 251 a Fn(30)1212 b(L.A.)22 b(BREYER)456 5216 y @beginspecial 72 @llx 72 @lly 540 @urx 802 @ury 5818 @rhi @setspecial %%BeginDocument: dbaclman1_8_1_page7.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 72 72 540 802 % EPSF created by ps2eps 1.28 %%Creator: groff version 1.18.1 %%CreationDate: Thu Jul 29 16:14:12 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic %%DocumentSuppliedResources: procset grops 1.18 1 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 /setpacking where{ pop currentpacking true setpacking }if /grops 120 dict dup begin /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def /C{0 exch ashow}bind def /D{0 exch 0 SC 5 2 roll awidthshow}bind def /E{0 rmoveto show}bind def /F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def /G{0 rmoveto 0 exch ashow}bind def /H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /I{0 exch rmoveto show}bind def /J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def /K{0 exch rmoveto 0 exch ashow}bind def /L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /M{rmoveto show}bind def /N{rmoveto 0 SC 3 -1 roll widthshow}bind def /O{rmoveto 0 exch ashow}bind def /P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def /Q{moveto show}bind def /R{moveto 0 SC 3 -1 roll widthshow}bind def /S{moveto 0 exch ashow}bind def /T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /MF{ findfont [5 2 roll 0 3 1 roll neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def /MANUAL{ statusdict begin/manualfeed true store end }bind def /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def /BP{ /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS{ 90 rotate }{ 0 PL translate }ifelse 1 -1 scale }bind def /EP{ level0 restore showpage }bind def /DA{ newpath arcn stroke }bind def /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def /DL{ SN moveto SN lineto stroke }bind def /DC{ newpath 0 360 arc closepath }bind def /TM matrix def /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def /Fr{ setrgbcolor fill }bind def /Fk{ setcmykcolor fill }bind def /Fg{ setgray fill }bind def /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def /Ck/setcmykcolor load def /Cg/setgray load def /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin { 1 index/FID ne{def}{pop pop}ifelse }forall /Encoding exch def dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def /EBEGIN{ moveto DEFS begin }bind def /EEND/end load def /CNT 0 def /level1 0 def /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit []0 setdash /setstrokeadjust where{ pop false setstrokeadjust }if /setoverprint where{ pop false setoverprint }if newpath /CNT countdictstack def userdict begin /showpage{}def }bind def /PEND{ clear countdictstack CNT sub{end}repeat level1 restore }bind def end def /setpacking where{ pop setpacking }if grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent /ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen /period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon /semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/circumflex /underscore/quoteleft/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/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft /guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl /endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen /brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft /logicalnot/minus/registered/macron/degree/plusminus/twosuperior /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior /ordmasculine/guilsinglright/onequarter/onehalf/threequarters /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash /ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def /Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE /Times-Roman@0 ENC0/Times-Roman RE BP /F0 10/Times-Roman@0 SF<4442>72 48 Q -.4<4143>-.35 G 375.9 <4c283129204442>.4 F -.4<4143>-.35 G<4c283129>.4 E 2.395<2f686f6d652f6c 616972642f6c6f63616c2f73686172652f646261636c2f646f632f7475746f7269616c2e 68746d6c202e204120636f6d70616e696f6e207475746f7269616c206765617265642074 6f>108 84 R -.1<7761>-.25 G 2.394 <72647320656d61696c208c6c746572696e67206973>.1 F<2f686f6d652f6c61697264 2f6c6f63616c2f73686172652f646261636c2f646f632f656d61696c2e68746d6c202e> 108 96 Q .337<496620796f7520676574206d616e>108 112.8 R 2.837<7964>-.15 G .337<69676974697a6174696f6e2077>-2.837 F .338<61726e696e67732c207468656e 20796f752061726520747279696e6720746f206c6561726e20746f6f206d756368206461 7461206174206f6e63652c206f7220796f7572206d6f64656c206973>-.1 F .708 <746f6f20636f6d706c65>108 124.8 R<782e>-.15 E/F1 10/Times-Bold@0 SF <646261636c>5.708 E F0 .708<697320636f6d70696c656420746f207361>3.208 F 1.008 -.15<7665206d>-.2 H .707 <656d6f7279206279206469676974697a696e67208c6e616c20776569676874732c2062> .15 F .707<757420796f752063616e2064697361626c65206469676974697a612d>-.2 F<74696f6e2062792065646974696e6720646261636c2e6820616e64207265636f6d7069 6c696e672e>108 136.8 Q F1<646261636c>108 153.6 Q F0<6f66>3.111 E .611 <66657273207365>-.25 F -.15<7665>-.25 G .611<72616c2062>.15 F .611 <75696c742d696e20746f6b>-.2 F .612<656e697a6572732028736565>-.1 F F1 <2d65>3.112 E F0 .612<737769746368292077697468206d6f726520746f20636f6d65 20696e206675747572652076>3.112 F .612 <657273696f6e732c2061732074686520617574686f72>-.15 F<696e>108 165.6 Q -.15<7665>-.4 G .959<6e7473207468656d2e>.15 F .958 <5768696c652074686520646566>5.959 F .958<61756c7420746f6b>-.1 F .958 <656e697a6572206d61792065>-.1 F -.2<766f>-.25 G<6c76>.2 E .958 <652c206e6f20746f6b>-.15 F .958<656e697a65722073686f756c642065>-.1 F -.15<7665>-.25 G 3.458<7262>.15 G 3.458<6572>-3.458 G<656d6f>-3.458 E -.15<7665>-.15 G .958<642c20736f207468617420796f75>.15 F<63616e20616c> 108 177.6 Q -.1<7761>-.1 G<79732073696d756c61746520707265>.1 E <76696f7573>-.25 E F1<646261636c>2.5 E F0<62656861>2.5 E <76696f7572207375626a65637420746f2062>-.2 E<7567208c78>-.2 E <657320616e64206172636869746563747572616c206368616e6765732e>-.15 E .335< 54686520636f6e8c64656e636520657374696d61746573206f627461696e656420746872 6f75676820746865>108 194.4 R F1<2d58>2.835 E F0 .335<737769746368206172 6520756e646572657374696d617465732c20696520617265206d6f726520636f6e736572 76>2.835 F<617469>-.25 E .635 -.15<76652074>-.25 H<68616e>.15 E<746865> 108 206.4 Q 2.5<7973>-.15 G<686f756c642062652e>-2.5 E/F2 10.95 /Times-Bold@0 SF -.11<4255>72 223.2 S<4753>.11 E F0<2259>108 235.2 Q 4.106<616b>-1 G<6e6f>-4.106 E 2.906 -.65<772c2073>-.25 H 1.606 <6f6d652064617920736369656e74697374732061726520676f6e6e6120696e>.65 F -.15<7665>-.4 G 1.606<6e7420736f6d657468696e6720746861742077696c6c206f75 74736d6172742061207261626269742e222028526f626f74205261626269742c>.15 F <3139353329>108 247.2 Q F2<534f55524345>72 264 Q F0 <54686520736f7572636520636f646520666f7220746865206c61746573742076>108 276 Q<657273696f6e206f6620746869732070726f6772616d2069732061>-.15 E -.25 <7661>-.2 G<696c61626c652061742074686520666f6c6c6f>.25 E <77696e67206c6f636174696f6e733a>-.25 E<687474703a2f2f777777>108 292.8 Q <2e6c627265>-.65 E<796572>-.15 E<2e636f6d2f67706c2e68746d6c>-.55 E <687474703a2f2f646261636c2e736f75726365666f72>108 304.8 Q<67652e6e6574> -.18 E F2 -.548<4155>72 321.6 S<54484f52>.548 E F0 <4c6169726420412e20427265>108 333.6 Q<796572203c6c61697264406c627265> -.15 E<796572>-.15 E<2e636f6d3e>-.55 E F2<53454520414c534f>72 350.4 Q F1 <61776b>108 362.4 Q F0<2831292c>A F1<626179>5.301 E<65736f6c>-.1 E F0 <2831292c>A F1<6372>5.301 E<6f6e746162>-.18 E F0<2831292c>A F1<6c657373> 5.301 E F0<2831292c>A F1<6d61696c6372>5.301 E<6f7373>-.18 E F0<2831292c> A F1<6d61696c66>5.301 E<6f6f74>-.25 E F0<2831292c>A F1 <6d61696c696e7370656374>5.301 E F0<2831292c>A F1<6d61696c746f65>5.302 E F0<2831292c>A F1<7072>5.302 E<6f632d>-.18 E<6d61696c6578>108 374.4 Q F0 <2835292c>A F1 -.18<7265>2.5 G<676578>.18 E F0<2837292c>A F1<73747479> 2.5 E F0<2831292c>A F1<736564>2.5 E F0<283129>A -1.11<5665>72 768 S <7273696f6e20312e382e31>1.11 E<426179657369616e2054>111.915 E -.15<6578> -.7 G 2.5<7443>.15 G<6c617373698c636174696f6e2054>-2.5 E 157.465 <6f6f6c732037>-.8 F 0 Cg EP end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF %%EndDocument @endspecial eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF dbacl-1.14.1/doc/email.html000066400000000000000000000641011325773323600154020ustar00rootroot00000000000000 Email classification with dbacl

Email classification with dbacl

Laird A. Breyer

Introduction

dbacl is a UNIX/POSIX command line toolset which can be used in scripts to classify a single email among one or more previously learned categories.

dbacl(1) supports several different statistical models and several different tokenization schemes, which can be adjusted to trade in speed and memory performance for statistical sophistication. dbacl(1) also permits the user to select cost weightings for different categories, thereby permitting simple adjustments to the type I and type II errors (a.k.a. false positives, etc.). Finally, dbacl(1) can print confidence percentages which help decide when a decision is ambiguous.

dbacl(1) is a general purpose text classifier which can understand email message formats. The tutorial explains general classification only. It is worth reading (of course :-), but doesn't describe the extra steps necessary to enable the email functionality. This document describes the necessary switches and caveats from first principles.

You can learn more about the dbacl suite of utilities (e.g dbacl, bayesol, mailinspect, mailcross) by typing for example:

% man dbacl

Before you begin

A statistical email classifier cannot work unless you show it some (as many as you can) examples of emails for every category of interest. This requires some work, because you must separate your emails into dedicated folders. dbacl works best with mbox style folders, which are the standard UNIX folder type that most mailreaders can import and export.

We'll assume that you want to define two categories called notspam and spam respectively. If you want dbacl(1) to recognize these categories, please take a moment to create two mbox folders named (for example) $HOME/mail/spam and $HOME/mail/notspam. You must make sure that the $HOME/mail/notspam folder doesn't contain any unwanted messages, and similarly $HOME/mail/spam must not contain any wanted messages. If you mix messages in the two folders, dbacl(1) will be somewhat confused, and its classification accuracy will drop.

If you've used other Bayesian spam filters, you will find that dbacl(1) is slightly different. While other filters can sometimes learn incrementally, one message at a time, dbacl always learns from scratch all the messages you give it, and only those. dbacl is optimized for learning a large number of messages quickly in one go, and to classify messages as fast as possible afterwards. The author has several good reasons for this choice, which are beyond the scope of this tutorial.

As time goes by, if you use dbacl(1) for classification, you will probably set up your filing system so that messages identified as spam go automatically into the $HOME/mail/notspam folder, and messages identified as notspam go into the $HOME/mail/notspam folder. dbacl(1) is far from perfect, and can make mistakes. This will result in messages going to the wrong folder. When dbacl(1) relearns, it will become slightly confused and over time its ability to distinguish spam and notspam will be diminished.

As with all email classifiers which learn your email, you should inspect your folders regularly, and if you find messages in the wrong folder, you must move them to the correct folder before relearning. If you keep your mail folders clean for learning, dbacl(1) will eventually make very few mistakes, and you will have plenty of time to inspect the folders once in a while. Or so the theory goes...

Since dbacl(1) must relearn categories from scratch each time, you will probably want to set up a cron(1) job to relearn your mail folders every day at midnight. This tutorial explains how to do this below. If you like, you don't need to relearn periodically at all. The author relearns his categories once every few months, without noticeable loss. This works as long as your mail folders contain enough representative emails for training.

Last but not least, if after reading this tutorial you have trouble to get classifications working, please read is_it_working.html.

Basic operation: Learning

To learn your spam category, go to the directory containing your $HOME/mail/notspam folder (we assume mbox type here) and at the command prompt (written %), type:

% dbacl -T email -l spam $HOME/mail/spam

This reads all the messages in $HOME/mail/notspam one at a time, ignoring certain mail headers and attachments, and also removes HTML markup. The result is a binary file called spam, which can be used by dbacl for classifications. This file is a snapshot, it cannot be modified by learning extra mail messages. (unlike other spam filters, which sometimes let you learn incrementally, see below for discussion).

If you get warning messages about the hash size being too small, you need to increase the memory reserved for email tokens. Type:

% dbacl -T email -H 20 -l spam $HOME/mail/spam

which reserves space for up to 2^20 (one million) unique words. The default dbacl(1) settings are chosen to limit dramatically the memory requirements (about 32 thousand tokens). Once the limit is reached, no new tokens are added and your category models will be strongly skewed towards the first few emails read. Heed the warnings.

If your spam folder contains too many messages, you can tell dbacl to pick the emails to be learned randomly. This is done by using the decimation switch -x. For example,

% dbacl -T email -H 20 -x 1 -l spam $HOME/mail/spam
will learn only about 1/2 or the emails found in the spam folder. Similarly, -x 2 would learn about 1/4, -x 3 would learn about 1/8 of available emails.

dbacl(1) has several options designed to control the way email messages are parsed. The man page lists them all, but of particular interest are the -T and -e options.

If your email isn't kept in mbox format, dbacl(1) can open one or more directories and read all the files in it. For example, if your messages are stored in the directory $HOME/mh/, one file per email, you can type

% dbacl -T email -l spam $HOME/mh
At present, dbacl(1) won't read the subdirectories, or look at the file names to decide whether to read some messages and not others. Another (but not necessarily faster) solution is to temporarily convert your mail into an mbox format file and use that for learning:
% find $HOME/mh -type f | while read f; \
    do formail <$f; done | dbacl -T email -l spam 

It is not enough to learn $HOME/mail/notspam emails, you must also learn the $HOME/mail/notspam emails. dbacl(1) can only choose among the categories which have been previously learned. It cannot say that an email is unlike spam (that's an open ended statement), only that an email is like spam or like notspam (these are both concrete statements). To learn the notspam category, type:

% dbacl -T email -l notspam $HOME/mail/notspam

Make sure to use the same switches for both spam and notspam categories. Once you've fully read the man page later, you can start to mix and match switches.

Every time dbacl(1) learns a category, it writes a binary file containing the statistical model into the hidden directory $HOME/.dbacl, so for example after learning the category spam, you will have a small file named $HOME/.dbacl/spam which contains everything dbacl(1) learned. The file is recreated from scratch each time you relearn spam, and is loaded each time you classify an email.

Basic operation: Classifying

Suppose you have a file named email.rfc which contains the body of a single email (in standard RFC822 format). You can classify the email into either spam or notspam by typing:

% cat email.rfc | dbacl -T email -c spam -c notspam -v
notspam

All you get is the name of the best category, the email itself is consumed. A variation of particular interest is to replace -v by -U, which gives a percentage representing how sure dbacl is of printing the correct category.

% cat email.rfc | dbacl -T email -c spam -c notspam -U
notspam # 67%

A result of 100% means dbacl is very sure of the printed category, while a result of 0% means at least one other category is equally likely. If you would like to see separate scores for each category, type:

% cat email.rfc | dbacl -T email -c spam -c notspam -n
spam 232.07 notspam 229.44

The winning category always has the smallest score (closest to zero). In fact, the numbers returned with the -n switch can be interpreted as unnormalized distances towards each category from the input document, in a mathematical space of high dimensions. If you prefer a return code, dbacl(1) returns a positive integer (1, 2, 3, ...) identifying the category by its position on the command line. So if you type:

% cat email.rfc | dbacl -T email -c spam -c notspam

then you get no output, but the return code is 2. If you use the bash(1) shell, the return code for the last run command is always in the variable $?.

Basic operation: Scripts

There is generally little point in running the commands above by hand, except if you want to understand how dbacl(1) operates, or want to experiment with switches.

Note, however, that simple scripts often do not check for error and warning messages on STDERR. It is always worth rehearsing the operations you intend to script, as dbacl(1) will let you know on STDERR if it encounters problems during learning. If you ignore warnings, you will likely end up with suboptimal classifications, because the dbacl system prefers to do what it is told predictably, rather than stop when an error condition occurs.

Once you are ready for spam filtering, you need to handle two issues.

The first issue is when and how to learn.

You should relearn your categories whenever you've received an appreciable number of emails or whenever you like. Unlike other spam filters, dbacl cannot learn new emails incrementally and update its category files. Instead, you must keep your messages organized and dbacl(1) will take a snapshot.

This limitation is actually advantageous in the long run, because it forces you to keep usable archives of your mail and gives you control over every message that is learned. By contrast, with incremental learning you must remember which messages have already been learned, how many times, and whether to unlearn them if you change your mind.

A dbacl category model normally doesn't change dramatically if you add a single new email (provided the original model depends on more than a handful of emails). Over time, you can even stop learning altogether when your error rate is low enough. The simplest strategy for continual learning is a cron(1) job run once a day:

% crontab -l > existing_crontab.txt

Edit the file existing_crontab.txt with your favourite editor and add the following three lines at the end:

CATS=$HOME/.dbacl
5 0 * * * dbacl -T email -H 18 -l $CATS/spam $HOME/mail/notspam
10 0 * * * dbacl -T email -H 18 -l $CATS/notspam $HOME/mail/notspam

Now you can install the new crontab file by typing

% crontab existing_crontab.txt

The second issue is how to invoke and what to do with the dbacl classification.

Many UNIX systems offer procmail(1) for email filtering. procmail(1) can pipe a copy of each incoming email into dbacl(1), and use the resulting category name to write the message directly to the appropriate mailbox.

To use procmail, first verify that the file $HOME/.forward exists and contains the single line:

|/usr/bin/procmail

Next, create the file $HOME/.procmailrc and make sure it contains something like this:

PATH=/bin:/usr/bin:/usr/local/bin
SHELL=/bin/bash
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/inbox

#
# this line runs the spam classifier
#
:0 
YAY=| dbacl -vT email -c $HOME/.dbacl/spam -c $HOME/.dbacl/notspam

#
# this line writes the email to your mail directory
#
:0:
* ? test -n "$YAY"
# if you prefer to write the spam status in a header,
# comment out the first line and uncomment the second
$MAILDIR/$YAY
#| formail -A "X-DBACL-Says: $YAY" >>$DEFAULT

#
# last rule: put mail into mailbox
#
:0:
$DEFAULT

The above script will automatically file your incoming email into one of two folders named $HOME/mail/spam and $HOME/mail/notspam respectively (if you have a POP account, and your mailreader contacts your ISP directly, this won't work. Try using fetchmail(1)).

Advanced operation: Costs

This section can be skipped. It is here for completeness, but probably won't be very useful to you, especially if you are a new user.

The classification performed by dbacl(1) as described above is known as a MAP estimate. The optimal category is chosen only by looking at the email contents. What is missing is your input as to the costs of misclassifications.

This section is by no means necessary for using dbacl(1) for most classification tasks. It is useful for tweaking dbacl's algorithms only. If you want to improve dbacl's accuracy, first try to learn bigger collections of email.

To understand the idea, imagine that an email being wrongly marked spam is likely to be sitting in the $HOME/mail/spam folder until you check through it, while an email wrongly marked notspam will prominently appear among your regular correspondence. For most people, the former case can mean a missed timely communication, while the latter case is merely an annoyance.

No classification system is perfect. Learned emails can only imperfectly predict never before seen emails. Statistical models vary in quality. If you try to lower one kind of error, you automatically increase the other kind.

The dbacl system allows you to specify how much you hate each type of misclassification, and does its best to accomodate this extra information. To input your settings, you will need a risk specification like this:

categories {
    spam, notspam
}
prior {
    1, 1
}
loss_matrix {
"" spam      [            0,  1^complexity ]
"" notspam   [ 2^complexity,  0            ]
}

This risk specification states that your cost for misclassifying spam emails into notspam is 1 for every word of the email (merely an annoyance). Your cost for misclassifying regular emails into spam is 2 for every word of the email (a more serious problem). The costs for classifying your email correctly are zero in each case. Note that the cost numbers are arbitrary, only their relative sizes matter. See the tutorial if you want to understand these statements.

Now save your risk specification above into a file named my.risk, and type

% cat email.rfc | dbacl -T email -c spam -c notspam \
  -vna | bayesol -c my.risk -v
notspam

The output category may or may not differ from the category selected via dbacl(1) alone, but over many emails, the resulting classifications will be more cautious about marking an email as spam.

Since dbacl(1) can output the score for each category (using the -n switch), you are also free to do your own processing and decision calculation, without using bayesol(1). For example, you could use:

% cat email.rfc | dbacl -T email -n -c spam -c notspam | \
  awk '{ if($2 * p1 * u12 > $4 * (1 - p1) * u21) { print $1; } \
       else { print $3; } }'

where p1 is the a priori probability that an email is spam, u12 is the cost of misclassifying spam as notspam, and u21 is the cost of seeing spam among your regular email.

When you take your misclassification costs into account, it is better to use the logarithmic scores (given by the -n) instead of the true probabilities (given by the -N switch).

The scores represent the amount of evidence away from each model, so the smaller the score the better. For each category, dbacl outputs both the score and the complexity of the email (ie the number of tokens/words actually looked at). For example

% cat email.rfc | dbacl -T email -c spam -c notspam -vn
spam 5.52 * 42 notspam 5.46 * 42
would indicate that there are 5.46 bits of evidence away from notspam, but 5.52 bits of evidence away from spam. This evidence is computed based on 42 tokens (it's a small email :-), and one would conclude that the notspam category is a slightly better fit.

Advanced operation: Parsing

dbacl(1) sets some default switches which should be acceptable for email classification, but probably not optimal. If you like to experiment, then this section should give you enough material to stay occupied, but reading it is not strictly necessary.

When dbacl(1) inspects an email message, it only looks at certain words/tokens. In all examples so far, the tokens picked up were purely alphabetic words. No numbers are picked up, or special characters such as $, @, % and punctuation.

The success of text classification schemes depends not only on the statistical models used, but also strongly on the type of tokens considered. dbacl(1) allows you to try out different tokenization schemes. What works best depends on your email.

By default, dbacl(1) picks up only purely alphabetic words as tokens (this uses the least amount of memory). To pick up alphanumeric tokens, use the -e switch as follows:

% dbacl -e alnum -T email -l spam $HOME/mail/notspam
% dbacl -e alnum -T email -l notspam $HOME/mail/notspam
% cat email.rfc | dbacl -T email -c spam -c notspam -v
notspam

You can also pick up printable words (use -e graph) or purely ASCII (use -e ascii) tokens. Note that you do not need to indicate the -e switch when classifying, but you should make sure that all the categories use the same -e switch when learning.

dbacl(1) can also look at single words, consecutive pairs of words, triples, quadruples. For example, a trigram model based on alphanumeric tokens can be learned as follows:

% dbacl -e alnum -w 3 -T email -l spam $HOME/mail/notspam

One thing to watch out for is that n-gram models require much more memory to learn in general. You will likely need to use the -H switch to reserve enough space.

If you prefer, you can specify the tokens to look at through a regular expression. The following example picks up single words which contain purely alphabetic characters followed by zero or more numeric characters. It can be considered an intermediate tokenization scheme between -e alpha and -e alnum:

% dbacl -T email \
  -g '(^|[^[:alpha:]])([[:alpha:]]+[[:digit:]]*)||2' \
  -l spam $HOME/mail/notspam
% dbacl -T email \
  -g '(^|[^[:alpha:]])([[:alpha:]]+[[:digit:]]*)||2' \
  -l notspam $HOME/mail/notspam
% cat email.rfc | dbacl -T email -c spam -c notspam -v
notspam

Note that there is no need to repeat the -g switch when classifying.

Cross Validation

This section explains quality control and accuracy testing, but is not needed for daily use.

If you have time to kill, you might be inspired by the instructions above to write your own learning and filtering shell scripts. For example, you might have a script $HOME/mylearner.sh containing

#!/bin/sh
dbacl -T email -H 19 -w 1 -l $@

With this script, you could learn your spam and notspam emails by typing

% ./mylearner.sh spam $HOME/mail/spam
% ./mylearner.sh notspam $HOME/mail/notspam

A second script $HOME/myfilter.sh might contain

#!/bin/sh
dbacl -T email -vna $@ | bayesol -c $HOME/my.risk -v

With this script, you could classify an email by typing

% cat email.rfc | $HOME/myfilter.sh -c spam -c notspam

What we've done with these scripts saves typing, but isn't necessarily very useful. However, we can use these scripts together with another utility, mailcross(1).

What mailcross(1) does is run an email n-fold cross-validation, thereby giving you an idea of the effects of various switches. It accomplishes this by splitting each of your spam and notspam folders (which normally are fully used up for learning categories) into n equal sized subsets. One of these subsets is chosen for testing each category, and the remaining subsets are used for learning, since you already know if they are spam or notspam. This gives you an idea how good the filter is, and how it improves (or not!) when you change switches.

Statistically, cross-validation is on very shaky ground, because it violates the fundamental principle that you must not reuse data for two different purposes, but that doesn't stop most of the world from using it.

Suppose you want to cross-validate your filtering scripts above. The following instructions only work with mbox files. First you should type:

% mailcross prepare 10
% mailcross add spam $HOME/mail/spam
% mailcross add notspam $HOME/mail/notspam

This creates several copies of all your spam and notspam emails for later testing. Your original $HOME/mail/{,not}spam files are not modified or even needed after these steps.

Next, you must indicate the learning and filtering scripts to use. Type

% export MAILCROSS_LEARNER="$HOME/mylearner.sh"
% export MAILCROSS_FILTER="$HOME/myfilter.sh"

Finally, it is time to run the cross validation. Type

% mailcross learn
% mailcross run
% mailcross summarize

The results you will see eventually are based on learning about 9/10th of the emails in $HOME/mail/spam and $HOME/mail/spam respectively for each category and testing with the other 1/10th.

Beware that the commands above may take a long time and have all the excitement of watching paint dry. When you get bored with cross validation, don't forget to type

% mailcross clean

Comparing Email Filters

Provided all runs use the same test corpora, you can compare any number of email classifiers with the mailcross command. This helps in choosing the best combination of switches for learning, although it can't be stressed enough that the results will depend strongly on your particular set of corpora.

It quickly gets tedious to run the cross validator multiple times, however. With this in mind, mailcross(1) has a "testsuite" subcommand, which runs the mailcross commands successively on any number of filters. These filters can be various versions of dbacl with different switches, or indeed can be other open source email classifiers.

For every email classifier you wish to cross validate, you need a wrapper script which performs the work of the scripts mylearner.sh and myfilter.sh in the previous section. Since every open source email classifier has its own interface, the wrapper must translate the mailcross instructions into something that the classifier understands. At the time of writing, wrapper scripts exist for dbacl, bogofilter, ifile and spambayes. The interface requirements are described in the mailcross(1) manual page.

Note that the supplied wrappers can be sometimes out of date for the most popular Bayesian filters, because these projects can change their interfaces frequently. Also, the wrappers may not use the most flattering combinations of switches and options, as only each filter author knows the best way to use his own filter.

Besides cross validation, you can also test Train On Error and Full Online Ordered Training schemes, via the mailtoe(1) and mailfoot(1) commands. Using them is very similar to using mailcross(1).

TREC

The (United States) National Institute of Standards and Technology organises an annual conference on text retrieval called TREC, which in 2005 began a new track on spam filtering. A goal of this conference is to develop over several years a set of standard methodologies for evaluating and comparing spam filtering systems.

For 2005, the initial goal is to compare spam filters in a laboratory environment, not directly connected to the internet. An identical stream of email messages addressed to a single person is shown in chronological order to all participating filters, which can learn them incrementally and must predict the type of each message as it arrives.

The spamjig is the automated system which performs this evaluation. You can download it yourself and run it with your own email collections to test any participating filters. Special instructions for dbacl can be found in the TREC subdirectory of the source package. Many other open source spam filters can also be tested in this framework. dbacl-1.14.1/doc/example1.risk000066400000000000000000000004761325773323600160400ustar00rootroot00000000000000# example risk specification using "interest rate" losses categories { one, two, three } prior { 1, 1, 1 } loss_matrix { "" one [ 0, (1.1)^complexity, (1.0)^complexity ] "" two [(1.1)^complexity, 0, (1.7)^complexity ] "" three [(1.5)^complexity, (1.01)^complexity, 0 ] } dbacl-1.14.1/doc/example2.risk000066400000000000000000000007041325773323600160330ustar00rootroot00000000000000# Same as example1.risk but with a small increase in two/three, # and an regular expression dependent loss matrix categories { one, two, three } prior { 2, 1, 1 } loss_matrix { "^proportion: ([0-9.]+)" one [ 0, (1+$1)^complexity, (1.2)^complexity ] "" one [ 0, (1.1)^complexity, (1.1)^complexity ] "" two [(1.1)^complexity, 0, (2.0)^complexity ] "" three [(1.5)^complexity, (1.01)^complexity, 0 ] } dbacl-1.14.1/doc/example3.risk000066400000000000000000000007511325773323600160360ustar00rootroot00000000000000# Same as example1.risk but with a small increase in two/three, # and an regular expression dependent loss matrix categories { one, two, three } prior { 2, 1, 1 } loss_matrix { "^proportion: ([0-9.]+)" one [ 0, (1+$1)^complexity, (1.2)^complexity ] "" one [ 0, (1.1)^complexity, (1.1)^complexity ] "Polly" two [inf, 0, inf ] "" two [(1.1)^complexity, 0, (2.0)^complexity ] "" three [(1.5)^complexity, (1.01)^complexity, 0 ] } dbacl-1.14.1/doc/is_it_working.html000066400000000000000000000151671325773323600171720ustar00rootroot00000000000000 dbacl: Is It Working?

dbacl: Is It Working?

Laird A. Breyer

Introduction

dbacl is a UNIX/POSIX command line toolset which can be used in scripts to classify a single email among one or more previously learned categories.

This document is intended to help you check that your installation of dbacl is working as it should. When trying out new software, there are many things to learn and things that can go wrong, and because dbacl is a statistical tool, it can sometimes be surprising and unpredictable. When you get unexpected results, is it because dbacl doesn't work as claimed, an undiscovered bug, problems to do with learning, problems in your scripts? Knowing what to look for is half the battle.

In the text below, some commands are written after a '%'. The '%' represents your shell prompt, and you are expected to enter the commands following it. If a line doesn't start with a '%', then it represents what you are likely to see as command output.

The basics

Let's first see if dbacl is properly installed on your system. At the shell prompt, type:

% dbacl -V
dbacl version 1.11
Copyright (c) 2002,2003,2004,2005 L.A. Breyer. All rights reserved.
dbacl comes with ABSOLUTELY NO WARRANTY, and is licensed
to you under the terms of the GNU General Public License.
.
.
If you get something that looks like this, then you know that dbacl is installed and ready to use. If the shell can't find the command dbacl, then you most likely need to download and install the program, as explained in the next section. If you get an error, you need to install the program first (read the next section). If you've built the program from sources yourself and your shell still can't find dbacl, then you need to indicate the full path to the program each time.

Installation time

Since dbacl is an open source (GPL) program, you are likely to first encounter it in one of two forms: a source code form as a compressed tar file named something like dbacl-1.11.tar.gz, or a preinstalled binary form that comes with your GNU/Linux or other operating system.

In the source code form you are expected to first build the program in the usual way:

% tar xfz dbacl-1.11.tar.gz
% cd dbacl-1.11
% ./configure && make
If something goes wrong during the build, you will see an error message and the build will not finish. Troubleshooting the build is beyond the scope of this document, so let's assume it finished without errors.

How do we know that the freshly built programs operate correctly? We run some standard tests:

% make check
.
.
===================
All 55 tests passed
===================
.
.

This command produces a lot of output on your terminal, but the important line is the one indicating whether all tests have passed. Normally, when dbacl is packaged, all the test are guaranteed to pass, but small differences between computer systems can cause failures. By running "make check" you will know if things are working on your system. If you see a failure, it is most likely that some error message during the build steps will point to some difficulties which you can fix.

On some systems, it is possible that a handful of tests will fail because the configure script cannot find a suitable Unicode environment. In that case, the error output contains "nbsp;" tokens which could not be converted to spaces. This is harmless.

Finally, you must install the freshly built programs in the correct location on your system. The simplest way is to type as root:

% make install-strip

If your version of dbacl was preinstalled on your operating system, then you do not need to build the programs from source, and you cannot "make check" to see if the tests passed. However, you can normally trust the distributor of your operating system and assume that all the build tests were successful.

Sanity checks

There are two simple ways to check that dbacl works correctly. The first way is to read the tutorials and type yourself the commands given there. The tutorials and where to find them are listed in the dbacl man page, which you can read by typing

% man dbacl
You should expect to see nearly identical output as described in the tutorials.

The second way to check that dbacl works is to run a small classification test with your own email collections. This is a better test because it gives you confidence that the system will work for you. Below is just a quick explanation, the full details can be read by typing

% man mailcross

You will need two mbox files containing collected emails of two different types. The types could be spam and notspam, or anything else, but make sure that the two mbox files do not have messages in common and represent different topics. There should also be roughly the same number of messages in each. Now type the following (you can replace spam and notspam by any names you like):

% mailcross prepare 5
% mailcross add spam /path/to/spam.mbox
% mailcross add notspam /path/to/notspam.mbox
% mailcross learn
% mailcross run
% mailcross summarize

These commands could take a while depending on how big your mbox files are. The summary is a table which shows the number of errors in the experiment, which consists in learning some random subsets of the spam.mbox and notspam.mbox files and trying to predict the remaining messages. If all went well, you should expect the number of errors to be less than 10%, but the exact percentage depends on how many messages you have, how easy to separate they are, and the default switches used by the test system.

Don't forget to clean up the mailcross temporary directory by typing

% mailcross clean

Particular symptoms

If you've tried the things above and you still suspect things aren't working correctly, here is a small list of symptoms and their likely causes.

dbacl seems to forget what it learns
You keep feeding data to dbacl for learning, but it seems to forget everything very soon. This symptom occurs because dbacl truly does forget data. Unlike certain other spam filters, dbacl doesn't support incremental learning. You must teach it everything in one go. You can simulate incremental learning by keeping and growing a collection of training examples, and periodically teaching dbacl the full collection.
dbacl-1.14.1/doc/japanese.txt000066400000000000000000000470161325773323600157620ustar00rootroot00000000000000% $Id: japanese.txt,v 1.1.1.1 2003/11/02 06:32:44 laird Exp $ % $Log: japanese.txt,v $ % Revision 1.1.1.1 2003/11/02 06:32:44 laird % Initial version % % Revision 1.1.1.1 2003/11/02 06:23:03 laird % Initial version % % Revision 1.2 1993/04/23 03:39:25 hikichi % *** empty log message *** % % Revision 1.1 1993/04/23 03:38:52 hikichi % Initial revision % GNU ˆê”ÊŒö—LŽg—p‹–‘ø‘ ======================= 1991 ”N6 ŒŽCƒo[ƒWƒ‡ƒ“2 Copyright (C) 1989,1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA ‰½l‚àAˆÈ‰º‚Ì“à—e‚ð•ÏX‚µ‚È‚¢‚Å‚»‚̂܂ܕ¡ŽÊ‚·‚éꇂɌÀ‚èA–{Žg—p‹–‘ø‘‚ð•¡»‚µ ‚½‚è”Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B ‚Í‚¶‚ß‚É -------- ‚Ù‚Æ‚ñ‚ǂ̃\ƒtƒgƒEƒFƒA‚ÌŽg—p‹–‘ø‚ÍAƒ\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µA•ÏX‚·‚郆[ƒU‚ÌŽ©—R‚ð ’D‚¤‚±‚Æ‚ðˆÓ}‚µ‚Ä‚¢‚Ü‚·B‚»‚ê‚ɑ΂µ‚ÄA‰äX‚ÌGNU ˆê”ÊŒö—LŽg—p‹–‘ø‚ÍAƒtƒŠ[Eƒ\ ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½‚è•ÏX‚·‚鎩—R‚ðƒ†[ƒU‚É•ÛØ‚·‚邽‚߂̂à‚ÌA‘¦‚¿ƒtƒŠ[Eƒ\ƒt ƒgƒEƒFƒA‚ª‚»‚̃†[ƒU‘S‚ĂɂƂÁ‚ătƒŠ[‚Å‚ ‚邱‚Æ‚ð•ÛØ‚·‚邽‚߂̂à‚̂ł·B–{Žg—p ‹–‘ø‚ÍAFree Software Foundation ‚̂قƂñ‚Ç‘S‚Ẵ\ƒtƒgƒEƒFƒA‚É“K—p‚³‚ê‚邾‚¯‚Å ‚È‚­AƒvƒƒOƒ‰ƒ€‚Ì쬎҂ª–{Žg—p‹–‘ø‚ÉˆË‚é‚Æ‚µ‚½ê‡‚Ì‚»‚̃vƒƒOƒ‰ƒ€‚É‚à“K—p‚·‚é ‚±‚Æ‚ª‚Å‚«‚Ü‚·B(‚»‚Ì‘¼‚ÌFree Software Foundation ‚̃\ƒtƒgƒEƒFƒA‚Ì‚¢‚­‚‚©‚ÍA–{ ‹–‘ø‘‚ł͂Ȃ­AGNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒö—LŽg—p‹–‘ø‚ŕی삳‚ê‚Ü‚·B) ‚ ‚È‚½‚ÍŽ©•ª‚̃v ƒƒOƒ‰ƒ€‚É‚à‚±‚ê‚ð“K—p‚Å‚«‚Ü‚·B‰äX‚ªƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚ɂ‚¢‚ÄŒ¾‚¤ê‡‚ÍŽ©—R ‚Ì‚±‚ƂɌ¾‹y‚µ‚Ä‚¢‚é‚̂ł ‚Á‚ÄA‰¿Ši‚Ì‚±‚Ƃł͂ ‚è‚Ü‚¹‚ñB‰äX‚̈ê”ÊŒö—LŽg—p‹–‘ø ‚ÌŠeð€‚ÍAŽŸ‚ÌŽ–•¿‚ðŠmŽÀ‚ÉŽÀŒ»‚·‚邱‚Æ‚ð–Ú“I‚Æ‚µ‚Ä—§ˆÄ‚³‚ê‚Ä‚¢‚Ü‚·B E ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ðŽ©—R‚ɔЕz‚Å‚«‚邱‚Æ(‚»‚µ‚ÄA–]‚ނȂ炠‚È‚½ ‚Ì‚±‚̃T[ƒrƒX‚ɑ΂µ‚đΉ¿‚ð¿‹‚Å‚«‚邱‚Æ)B E ƒ\[ƒXEƒR[ƒh‚ðŽÀۂɎ󂯎æ‚é‚©A‚ ‚é‚¢‚ÍAŠó–]‚µ‚³‚¦‚·‚ê‚΂»‚ê‚ð“üŽè‚·‚é ‚±‚Æ‚ª‰Â”\‚Å‚ ‚邱‚ÆB E “üŽè‚µ‚½ƒ\ƒtƒgƒEƒFƒA‚ð•ÏX‚µ‚½‚èAV‚µ‚¢ƒtƒŠ[EƒvƒƒOƒ‰ƒ€‚̈ꕔ‚Æ‚µ‚ÄŽg—p ‚Å‚«‚邱‚ÆB E ˆÈã‚ÌŠe“à—e‚ðs‚È‚¤‚±‚Æ‚ª‚Å‚«‚邯‚¢‚¤‚±‚Æ‚ðƒ†[ƒUŽ©g‚ª’m‚Á‚Ä‚¢‚邱‚ÆB ‚±‚̂悤‚ȃ†[ƒU‚ÌŒ —˜‚ðŽç‚邽‚ß‚ÉA‰äX‚ÍA‰½l‚à‚±‚ê‚ç‚ÌŒ —˜‚ð”ے肵‚½‚èA‚ ‚é ‚¢‚Í•úŠü‚·‚邿‚¤‚Ƀ†[ƒU‚É‹‚߂邱‚Ƃ͂ł«‚È‚¢‚Æ‚¢‚¤§ŒÀð€‚ðÝ‚¯‚é•K—v‚ª‚ ‚è‚Ü ‚·B‚±‚ê‚ç‚̧ŒÀð€‚ÍAƒ†[ƒU‚ªAƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚µ‚½‚è•ÏX‚µ ‚悤‚Æ‚·‚éꇂɂÍA‚»‚̃†[ƒUŽ©g‚ªŽç‚é‚ׂ«‹`–±‚Æ‚à‚È‚è‚Ü‚·B—Ⴆ‚ÎA‚ ‚È‚½‚ªƒt ƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚·‚éê‡A—Lž‚©–³ž‚©‚É‚©‚©‚í‚炸A‚ ‚È‚½‚ÍŽ©•ª ‚ÌŽ‚Á‚Ä‚¢‚錠—˜‚ð‘S‚Ä‘ŠŽè‚É—^‚¦‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚ ‚È‚½‚ÍA‘ŠŽè‚à‚Ü‚½ƒ\[ƒXE ƒR[ƒh‚ðŽó‚¯Žæ‚Á‚½‚è“üŽè‚Å‚«‚邯‚¢‚¤‚±‚Æ‚ð”F‚߂Ȃ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚³‚ç‚É‚ ‚È‚½‚ÍA ”Þ‚ç‚ªŽ©•ª‚½‚¿‚ÌŒ —˜‚ð’m‚邿‚¤‚ÉA‚±‚ê‚ç‚Ìð€‚ð’m‚炵‚߂Ȃ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB ‰äX‚ÍŽŸ‚Ì‚Q‚‚̕û–@‚ц[ƒU‚ÌŒ —˜‚ðŽç‚è‚Ü‚·B(1) ƒ\ƒtƒgƒEƒFƒA‚É’˜ìŒ ‚ðŽå’£‚µA (2) –{Žg—p‹–‘ø‚Ìð€‚̉º‚Ń\ƒtƒgƒEƒFƒA‚ð•¡»E”ЕzE•ÏX‚·‚錠—˜‚ðƒ†[ƒU‚É—^‚¦‚Ü ‚·B ‚Ü‚½AŠe쬎҂â‰äXŽ©g‚ðŽç‚邽‚ß‚ÉA–{ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚ª–³•ÛØ‚Å‚ ‚邱‚Æ‚ð ‘S‚Ä‚ÌlX‚ª—¹‰ð‚µ‚Ä‚¢‚é•K—v‚ª‚ ‚è‚Ü‚·B‚³‚ç‚ÉA‘¼‚Ì’N‚©‚É‚æ‚Á‚Ä•ÏX‚³‚ꂽƒ\ƒtƒg ƒEƒFƒA‚ª”Еz‚³‚ꂽê‡AŽó—ÌŽÒ‚Í‚»‚̃\ƒtƒgƒEƒFƒA‚ªƒIƒŠƒWƒiƒ‹Eƒo[ƒWƒ‡ƒ“‚ł͂Ȃ¢ ‚Æ‚¢‚¤‚±‚Æ‚ð’m‚炳‚ê‚é•K—v‚ª‚ ‚è‚Ü‚·B‚»‚ê‚ÍA‘¼l‚ÌŠÖ—^‚É‚æ‚Á‚ÄŒ´ŠJ”­ŽÒ‚ɑ΂·‚é •]‰¿‚ª‰e‹¿‚³‚ê‚È‚¢‚悤‚É‚·‚邽‚߂ł·B ÅŒã‚ÉA‚ǂ̃tƒŠ[EƒvƒƒOƒ‰ƒ€‚àƒ\ƒtƒgƒEƒFƒA“Á‹–‚É₦‚¸‹º‚©‚³‚ê‚Ä‚¢‚Ü‚·B‰äX‚ÍA ƒtƒŠ[EƒvƒƒOƒ‰ƒ€‚ÌĔЕzŽÒ‚ªŒÂl“I‚É“Á‹–Œ ‚ðŽæ“¾‚µAŽ–ŽÀã‚»‚̃vƒƒOƒ‰ƒ€‚ðŽ©•ª ‚ÌàŽY‚É‚µ‚Ä‚µ‚Ü‚¤‚Æ‚¢‚¤ŠëŒ¯‚ð”ð‚¯‚½‚¢‚ÆŠè‚Á‚Ä‚¢‚Ü‚·B‚±‚ê‚ð–h‚®‚½‚߂ɉäX‚ÍA‚¢ ‚¸‚ê‚Ì“Á‹–‚àA’N‚Å‚àŽ©—R‚ÉŽg—p‚Å‚«‚邿‚¤‚ÉŽg—p‹–‘ø‚³‚ê‚é‚ׂ«‚©A‚ ‚é‚¢‚͉½l‚ɑΠ‚µ‚Ä‚à‘S‚­Žg—p‚³‚¹‚È‚¢‚©‚ÌA‚¢‚¸‚ê‚©‚É‚·‚ׂ«‚Å‚ ‚邱‚Ƃ𖾂炩‚É‚µ‚Ä‚«‚Ü‚µ‚½B •¡ŽÊE”ЕzE•ÏX‚ɑ΂·‚鳊m‚Èð€‚ÆðŒ‚ðŽŸ‚ÉŽ¦‚µ‚Ü‚·B GNU ˆê”ÊŒö—LŽg—p‹–‘ø‚̉º‚ł̕¡»A”ЕzA•ÏX‚ÉŠÖ‚·‚éð€‚ÆðŒ ============================================================== 1. –{Žg—p‹–‘ø‚ÍA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŠeð€‚É]‚Á‚ĔЕz‚³‚ê‚邯‚¢‚¤’˜ìŒ ŽÒ‚© ‚ç‚Ì’m•¶‚ª•\ަ‚³‚ê‚Ä‚¢‚éƒvƒƒOƒ‰ƒ€‚â‚»‚Ì‘¼‚Ì쬕¨‚É“K—p‚³‚ê‚Ü‚·BˆÈ‰º‚É ‚¨‚¢‚ÄuƒvƒƒOƒ‰ƒ€v‚Æ‚ÍA‚»‚̂悤‚ȃvƒƒOƒ‰ƒ€‚â쬕¨‚ðŽw‚·‚à‚̂ƂµA‚Ü‚½A uƒvƒƒOƒ‰ƒ€¶¬•¨v‚Æ‚ÍAãq‚µ‚½uƒvƒƒOƒ‰ƒ€vŽ©gA‚Ü‚½‚ÍA’˜ìŒ –@‰º‚É ‚¨‚¯‚é‘S‚Ă̔h¶•¨G‚·‚Ȃ킿A‚»‚ÌuƒvƒƒOƒ‰ƒ€v‚Ì‘S•”–”‚͈ꕔ‚ðA‚»‚Ì‚Ü‚Ü –”‚Í•ÏX‚µ‚ÄAŠŽ‚Â^–”‚Í‘¼‚ÌŒ¾Œê‚ɕϊ·‚µ‚ÄA“à•”‚É‘g‚Ýž‚ñ‚¾ì¬•¨‚ðˆÓ–¡‚µ ‚Ü‚·B(ˆÈ‰ºAŒ¾Œê•ÏŠ·‚Íu•ÏXv‚Æ‚¢‚¤—pŒê‚Ì’†‚É–³ðŒ‚Ɋ܂܂ê‚é‚à‚̂Ƃµ‚Ü‚·B) –{Žg—p‹–‘ø‚É‚æ‚Á‚Ä‹–‘ø‚ðŽó‚¯‚éŽÒ‚ðu‚ ‚È‚½v‚ƌĂт܂·B •¡»A”ЕzA•ÏXˆÈŠO‚Ìsˆ×‚Í–{Žg—p‹–‘ø‚Ì‘ÎÛ‚Æ‚µ‚Ü‚¹‚ñB‚»‚ê‚ç‚Í–{Žg—p‹–‘ø ‚͈̔͊O‚Å‚·BuƒvƒƒOƒ‰ƒ€v‚ðŽÀs‚³‚¹‚ésˆ×‚ÉŠÖ‚µ‚ħ–ñ‚Í‚ ‚è‚Ü‚¹‚ñBuƒv ƒƒOƒ‰ƒ€v‚Ìo—Í‚ÍA( uƒvƒƒOƒ‰ƒ€v‚ðŽÀs‚³‚¹‚Ä쬂³‚¹‚½‚©‚Ç‚¤‚©‚Ƃ͖³ŠÖ ŒW‚É) ‚»‚Ì“à—e‚ªuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Å‚ ‚éꇂɌÀ‚è–{Žg—p‹–‘ø‚Ì‘ÎÛ‚Æ‚È‚è ‚Ü‚·B‚±‚ꂪ“–‚Ă͂܂邩‚Ç‚¤‚©‚ÍAuƒvƒƒOƒ‰ƒ€v‚ª‰½‚ð‚·‚é‚à‚Ì‚©‚Ɉ˂è‚Ü‚·B 2. ‚ ‚È‚½‚ÍA‚ǂ̂悤‚È”}‘Ìã‚Ö•¡»‚µ‚悤‚Æ‚·‚éꇂł ‚Á‚Ä‚àA“üŽè‚µ‚½uƒvƒ ƒOƒ‰ƒ€v‚̃\[ƒXEƒR[ƒh‚ð‚»‚Ì‚Ü‚Ü‚Ì“à—e‚Å•¡ŽÊ‚µ‚½ã‚Å“K³‚È’˜ìŒ •\ަ‚Æ•Û Ø‚Ì•úŠü‚𖾊mAŠŽ‚“K³‚É•t‹L‚·‚éꇂɌÀ‚èA•¡»–”‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü ‚·B‚»‚Ìê‡A–{Žg—p‹–‘ø‹y‚Ñ–³•ÛØ‚ÉŠÖ‚·‚é‹LÚ•”•ª‚ÍA‘S‚ÄŒ³‚̂܂܂̌`‚Å•\ ަ‚µ‚Ä‚­‚¾‚³‚¢B‚Ü‚½AuƒvƒƒO ƒ‰ƒ€v‚̔Еzæ‚ɑ΂µ‚Ä‚ÍAuƒvƒƒOƒ‰ƒ€v‚Æ ‹¤‚É–{Žg—p‹–‘ø‘‚ÌŽÊ‚µ‚ð“n‚µ‚Ä‚­‚¾‚³‚¢B•¡»•¨‚̈ø‚«“n‚µ‚É—v‚·‚éŽÀ”ï‚Í¿‹ ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚Ü‚½A‚ ‚È‚½“ÆŽ©‚Ì•ÛØ‚ðs‚È‚¤ê‡‚Í‚»‚ê‚ð—Lž‚Æ‚·‚邱 ‚Æ‚ª‚Å‚«‚Ü‚·B 3. ŽŸ‚ÌŠeðŒ‚ð‘S‚Ä–ž‚½‚µ‚Ä‚¢‚éŒÀ‚èA‚ ‚È‚½‚ÍAuƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚̈ꕔ•ª‚ð •ÏX‚µ‚ÄuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Æ‚·‚邱‚Æ‚ª‚Å‚«A‚³‚ç‚ÉA•ÏX”Å‚â‰E쬕¨‚ðã ‹L‘æ 2 €‚É]‚Á‚Ä•¡»–”‚͔Еz‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B (a) ƒtƒ@ƒCƒ‹‚ð•ÏX‚µ‚½Ž|‚Æ‚»‚Ì•ÏX“ú‚Æ‚ðA•ÏX‚µ‚½ƒtƒ@ƒCƒ‹ã‚É–¾Šm‚É•\ަ‚· ‚邱‚ÆB (b) •ÏX‚µ‚½‚©”Û‚©‚ð–â‚킸A–}‚»uƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚̈ꕔ•ª‚ð“à•”‚É‘g‚Ýž ‚ñ‚Å‚¢‚é‚©–”‚Í‚»‚ê‚©‚ç”h¶‚µ‚½¶¬•¨‚ð”Еz‚·‚éꇂɂÍA‚»‚Ì‘S‘Ì‚ð–{Žg —p‹–‘ø‚Ìð€‚É]‚Á‚Ä‘æŽOŽÒ‚Ö–³ž‚ÅŽg—p‹–‘ø‚·‚邱‚ÆB (c) •ÏX‚µ‚½ƒvƒƒOƒ‰ƒ€‚ªŽÀsŽž‚É’Êí‚̑Θb“I‚È•û–@‚ŃRƒ}ƒ“ƒh‚ð“ǂނ悤‚ɂȂÁ ‚Ä‚¢‚邯‚·‚ê‚ÎAÅ‚à•’Ê‚Ì•û–@‚őΘb“I‚É‚»‚̃vƒƒOƒ‰ƒ€‚ðŽÀs‚·‚鎞‚ÉA ŽŸ‚Ì“à—e‚ðŽ¦‚·•¶Œ¾‚ªƒvƒŠƒ“ƒ^‚ÖˆóŽš‚³‚ê‚é‚©Aˆ½‚¢‚͉æ–ʂɕ\ަ‚³‚ê‚邱‚ÆB E“K؂Ȓ˜ìŒ •\ަB E–³•ÛØ‚Å‚ ‚邱‚Æ(‚ ‚È‚½‚ª“ÆŽ©‚É•ÛØ‚·‚éꇂÍA‚»‚ÌŽ|)B E”Еz‚ðŽó‚¯‚éŽÒ‚àA–{Žg—p‹–‘ø‚Æ“¯ˆê‚Ìð€‚É]‚Á‚ÄuƒvƒƒOƒ‰ƒ€v‚ðĔР•z‚Å‚«‚邱‚ÆB E”Еz‚ðŽó‚¯‚éŽÒ‚ª–{Žg—p‹–‘ø‘‚ÌŽÊ‚µ‚ðŽQÆ‚·‚é•û–@B (—áŠO‚Æ‚µ‚ÄAuƒvƒƒOƒ‰ƒ€vŽ©‘̂͑Θb“I‚Å‚ ‚Á‚Ä‚à‹N“®Žž‚Ì•¶Œ¾‚ð’Êí‚Íˆó Žš‚µ‚È‚¢‚̂Ȃç‚ÎA‚ ‚È‚½‚ÌuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Í‚±‚̂悤‚È•¶Œ¾‚ðˆóŽš‚· ‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB) ‚±‚ê‚ç‚Ì—vŒ‚Í•ÏX‚³‚ꂽ쬕¨‚É‚à‘S‚Ä“K—p‚³‚ê‚Ü‚·B‚»‚Ì•ÏX”ł̈½‚é•”•ª‚ª uƒvƒƒOƒ‰ƒ€v‚Ì”h¶•¨‚ł͂Ȃ­A‚µ‚©‚à‚»‚ꎩ‘̓Ɨ§‚ňقȂé쬕¨‚¾‚Ƈ—“I‚É l‚¦‚ç‚ê‚éê‡A‚ ‚È‚½‚ª‚»‚ê‚ç‚ð•Ê‚Ì쬕¨‚Æ‚µ‚ĔЕz‚µ‚½Žž‚ÍA–{Žg—p‹–‘ø‚Æ ‚»‚Ìð€‚Í‚»‚ê‚ç‚Ì•”•ª‚ɂ͓K—p‚³‚ê‚Ü‚¹‚ñB‚µ‚©‚µA‚»‚ê‚ç‚ðuƒvƒƒOƒ‰ƒ€¶¬ •¨v‚̈ꕔ‚Æ‚µ‚ĔЕz‚·‚éꇂÍA‘S‘Ì‚ª–{Žg—p‹–‘ø‚Ìð€‚É]‚Á‚ĔЕz‚³‚ê‚È‚¯ ‚ê‚΂Ȃ炸AŽg—p‹–‘ø‚ðŽó‚¯‚鑼‚Ì‘S‚Ă̎҂ɑ΂·‚é‹–‘ø‚àƒvƒƒOƒ‰ƒ€‘S‘̂ɂ킽‚Á ‚Ä—^‚¦‚ç‚ê‚È‚¯‚ê‚΂Ȃ炸AŒ‹‰Ê‚Æ‚µ‚ÄA’N‚ª‘‚¢‚½‚©‚É‚©‚©‚í‚炸A‘S‚Ă̕”•ª ‚É–{Žg—p‹–‘ø‚ª“K—p‚³‚ê‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB ‚±‚̂悤‚ÉA–{ð€‚̈Ó}‚·‚邯‚±‚ë‚ÍAŠ®‘S‚É‚ ‚È‚½‚É‚æ‚Á‚Ä‘‚©‚ꂽ쬕¨‚É ‚‚¢‚ÄAŒ —˜‚ð—v‹‚µ‚½‚èA‚ ‚È‚½‚ÆŒ —˜ŠÖŒW‚𑈂¤‚±‚Ƃł͂ ‚è‚Ü‚¹‚ñB‚Þ‚µ‚ë ‚»‚Ì–Ú“I‚ÍA쬕¨‚ªuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Å‚ ‚éꇂɂ»‚Ì”h¶•¨‚âW‡•¨‚̔Р•z‚ð‹K§‚·‚邱‚Ƃɂ ‚è‚Ü‚·B ‚³‚ç‚ÉAuƒvƒƒOƒ‰ƒ€v(–”‚ÍuƒvƒƒOƒ‰ƒ€¶¬•¨v) ‚ÆuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Æ‚Í ‚È‚ç‚È‚¢‘¼‚̃vƒƒOƒ‰ƒ€‚Æ‚ðA’P‚ɕۊǂâ”Еz‚Ì‚½‚߂ɓ¯ˆê‚Ì”}‘Ìã‚ɂ܂Ƃ߂ċL ˜^‚µ‚½‚Æ‚µ‚Ä‚àA–{Žg—p‹–‘ø‚Í‘¼‚̃vƒƒOƒ‰ƒ€‚ɂ͓K—p‚³‚ê‚Ü‚¹‚ñB 4. ‚ ‚È‚½‚ÍAˆÈ‰º‚Ì‚¤‚¿‚¢‚¸‚ê‚©1 ‚‚𖞂½‚·ŒÀ‚èAã‹L‘æ2 €‹y‚Ñ‘æ3 €‚É]‚Á‚Ä uƒvƒƒOƒ‰ƒ€v(–”‚ÍAã‹L‘æ3 €‚ÅŒ¾‹y‚µ‚Ä‚¢‚éuƒvƒƒOƒ‰ƒ€¶¬•¨v)‚ðƒIƒuƒWƒF ƒNƒgEƒR[ƒh–”‚ÍŽÀs‰Â”\‚ÈŒ`Ž®‚Å•¡»‹y‚єЕz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B (a) ‘Ήž‚·‚é‹@ŠB“ǂݎæ‚è‰Â”\‚ȃ\[ƒXEƒR[ƒhˆêŽ®‚ðˆê‚Ɉø‚«“n‚·‚±‚ÆB‚»‚Ìê ‡A‚»‚̃\[ƒXEƒR[ƒh‚̈ø‚«“n‚µ‚Íã‹L‘æ2 €‹y‚Ñ‘æ 3 €‚É]‚Á‚ÄA’Êíƒ\ ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚É—p‚¢‚ç‚ê‚é”}‘Ì‚Ås‚È‚í‚ê‚邱‚ÆB (b) ­‚È‚­‚Æ‚à3 ”NŠÔ‚Ì—LŒøŠúŠÔ‚ð’è‚ßAŠŽ‚‚»‚ÌŠúŠÔ“à‚Å‚ ‚ê‚ΑΉž‚·‚é‹@ŠB“Ç‚Ý Žæ‚è‰Â”\‚ȃ\[ƒXEƒR[ƒhˆêŽ®‚Ì•¡»‚ðAƒ\[ƒX”Еz‚ÉŠÖ‚í‚éŽÀ”ïˆÈã‚̑Ή¿‚ð —v‹‚¹‚¸‚É’ñ‹Ÿ‚·‚éŽ|A‹y‚Ñ‚»‚ÌꇂɂÍã‹L‘æ2 €‹y‚Ñ‘æ3 €‚É]‚Á‚ÄA’Êí ƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚É—p‚¢‚ç‚ê‚é”}‘̂Œñ‹Ÿ‚³‚ê‚éŽ|‚ð‹LÚ‚µ‚½‘–Ê‚ðA‘æŽOŽÒ ‚Ɉê‚Ɉø‚«“n‚·‚±‚ÆB (c) ‘Ήž‚·‚éƒ\[ƒXEƒR[ƒh”Еz‚Ì\‚µo‚ÉÛ‚µ‚ÄA‚ ‚È‚½‚ª“¾‚½î•ñ‚ðˆê‚Ɉø‚« “n‚·‚±‚ÆB(‚±‚Ì‘I‘ðŽˆ‚ÍA‰c—˜‚ð–Ú“I‚Æ‚µ‚È‚¢”Еz‚Å‚ ‚Á‚ÄAŠŽ‚‚ ‚È‚½‚ªã ‹L‚Ì (b) €‚ÉŠî‚¢‚ÄAƒIƒuƒWƒFƒNƒgEƒR[ƒhˆ½‚¢‚ÍŽÀs‰Â”\Œ`Ž®‚̃vƒƒOƒ‰ƒ€ ‚µ‚©“üŽè‚µ‚Ä‚¢‚È‚¢ê‡‚ÉŒÀ‚è“K—p‚³‚ê‚é‘I‘ð€–Ú‚Å‚·B) ‚È‚¨Aƒ\[ƒXEƒR[ƒh‚Æ‚ÍA•ÏXì‹Æ‚É“K‚µ‚½‹LqŒ`Ž®‚ðŽw‚µ‚Ü‚·B‚Ü‚½AŽÀs‰Â”\ Œ`Ž®‚̃tƒ@ƒCƒ‹‚ɑΉž‚·‚éƒ\[ƒXEƒR[ƒhˆêŽ®‚Æ‚ÍA‚»‚ê‚Ɋ܂܂ê‚é‘Sƒ‚ƒWƒ…[ƒ‹‚É ‘Ήž‚·‚é‘S‚Ẵ\[ƒXEƒR[ƒhA‹y‚Ñ‚ ‚ç‚ä‚éŠÖ˜A‚̃Cƒ“ƒ^ƒtƒF[ƒX’è‹`ƒtƒ@ƒCƒ‹A ‹y‚ÑŽÀs‚ð‰Â”\‚É‚·‚éƒRƒ“ƒpƒCƒ‹‚ƃCƒ“ƒXƒg[ƒ‹‚̧Œä‚ÉŠÖ‚·‚é‹Lq‚ðŽw‚µ‚Ü‚·B“Á •ʂȗáŠO‚Æ‚µ‚ÄAŽÀs‰Â”\‚ȃtƒ@ƒCƒ‹‚ª“®ì‚·‚éƒIƒyƒŒ[ƒeƒBƒ“ƒOEƒVƒXƒeƒ€‚ÌŽå—v ‚È\¬—v‘f(ƒRƒ“ƒpƒCƒ‰AƒJ[ƒlƒ‹‚È‚Ç) ‚Æ‹¤‚É(ƒ\[ƒXEƒR[ƒh–”‚̓oƒCƒiƒŠ‚̂ǂ¿ ‚ç‚©‚Å) ”Еz‚³‚ê‚Ä‚¢‚é‚à‚̂ɂ‚¢‚Ä‚ÍA‚»‚Ì\¬—v‘fŽ©‘Ì‚ªŽÀsŒ`Ž®‚É•t‚µ‚Ä‚¢ ‚È‚¢ê‡‚ÉŒÀ‚èA”Еz‚³‚ê‚éƒ\[ƒXEƒR[ƒh‚Ɋ܂߂é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB ŽÀs‰Â”\Œ`Ž®‚Ü‚½‚̓IƒuƒWƒFƒNƒgEƒR[ƒh‚̔Еz‚ªAŽwަ‚³‚ꂽꊂ©‚ç‚Ì•¡»‚Ì‚½ ‚߂̃AƒNƒZƒXŒ ‚Ì•Š—^‚Å‚ ‚éê‡A“¯‚¶êŠ‚©‚ç‚̃\[ƒXEƒR[ƒh‚Ì•¡»‚Ì‚½‚߂̓¯ “™‚ȃAƒNƒZƒXŒ ‚𕊗^‚·‚ê‚ÎA‚½‚Æ‚¦‘æŽOŽÒ‚ɃIƒuƒWƒFƒNƒgEƒR[ƒh‚Æ‹¤‚Ƀ\[ƒX‚Ì •¡»‚ð‹­‚¢‚È‚­‚Æ‚àAƒ\[ƒXEƒR[ƒh‚ð”Еz‚µ‚½‚à‚̂Ƃ݂Ȃµ‚Ü‚·B 5. –{Žg—p‹–‘ø‚ª–¾Ž¦“I‚É‹–‘ø‚µ‚Ä‚¢‚éꇂ𜂫A‚ ‚È‚½‚ÍAuƒvƒƒOƒ‰ƒ€v‚ð•¡»A •ÏXAƒTƒuƒ‰ƒCƒZƒ“ƒXA”Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB–{Žg—p‹–‘ø‚É]‚킸‚ÉuƒvƒƒO ƒ‰ƒ€v‚ð•¡»A•ÏXAƒTƒuƒ‰ƒCƒZƒ“ƒXA”Еz‚µ‚悤‚Æ‚·‚ésˆ×‚ÍA‚»‚ꎩ‘Ì‚ª–³Œø‚Å ‚ ‚èAŠŽ‚ÂA–{Žg—p‹–‘ø‚ª‚ ‚È‚½‚É‹–‘ø‚µ‚Ä‚¢‚éuƒvƒƒOƒ‰ƒ€v‚ÌŒ —˜‚ðŽ©“®“I‚ÉÁ –Å‚³‚¹‚Ü‚·B‚»‚Ìê‡A–{Žg—p‹–‘ø‚É]‚Á‚Ä‚ ‚È‚½‚©‚ç•¡»•¨‚â‚»‚ÌŒ —˜‚𓾂Ă¢‚é ‘æŽOŽÒ‚ÍA–{Žg—p‹–‘ø‚ÉŠ®‘S‚É]‚Á‚Ä‚¢‚éꇂɌÀ‚èAˆø‘±‚«—LŒø‚ÈŽg—pŒ ŒÀ‚ðŽ‚Â ‚à‚̂Ƃµ‚Ü‚·B 6. ‚ ‚È‚½‚͂܂¾“¯ˆÓ‚Ìˆó‚Æ‚µ‚Ä–¼‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅA–{Žg—p‹–‘ø‚ðŽó‚¯“ü‚ê‚é•K—v‚Í‚  ‚è‚Ü‚¹‚ñB‚µ‚©‚µA‚ ‚È‚½‚ÉuƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚Ì”h¶•¨‚ð•ÏX–”‚ÍĔЕz‚·‚é‹– ‰Â‚ð—^‚¦‚é‚à‚͖̂{Žg—p‹–‘øˆÈŠO‚ɂ͂ ‚è‚Ü‚¹‚ñB‚±‚ê‚ç‚Ìsˆ×‚ÍA‚ ‚È‚½‚ª‚à‚µ–{ Žg—p‹–‘ø‚ðŽó‚¯“ü‚ê‚È‚¢‚̂ł ‚ê‚ÎA–@—¥‚É‚æ‚Á‚ċւ¶‚ç‚ê‚Ü‚·B]‚Á‚ÄA‚ ‚È‚½‚ª uƒvƒƒOƒ‰ƒ€v(–”‚ÍuƒvƒƒOƒ‰ƒ€¶¬•¨v) ‚Ì•ÏX–”‚͔Еz‚ðs‚¦‚ÎA‚»‚ꎩ‘̂ł  ‚È‚½‚Í–{Žg—p‹–‘ø‚ðŽó‚¯“ü‚êAŠŽ‚ÂAuƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚ÌuƒvƒƒOƒ‰ƒ€¶¬•¨v ‚Ì•¡»A”ЕzA•ÏX‚ÉŠÖ‚·‚邱‚ê‚ç‚Ìð€‚ÆðŒ‚Ì‘S‚Ä‚ðŽó‚¯“ü‚ꂽ‚±‚Æ‚ðŽ¦‚µ‚Ü‚·B 7. ‚ ‚È‚½‚ªuƒvƒƒOƒ‰ƒ€v(–”‚Í‚»‚ÌuƒvƒƒOƒ‰ƒ€¶¬•¨v) ‚ðĔЕz‚·‚邯ީ“®“I‚ÉA ‚»‚ÌŽó—ÌŽÒ‚ÍAŒ³‚ÌŽg—p‹–‘øŽÒ‚©‚çA–{Žg—p‹–‘ø‚Ìð€‚É]‚Á‚ÄuƒvƒƒOƒ‰ƒ€v‚ð•¡ »A”ЕzA•ÏX‚·‚邱‚Æ‚ð“à—e‚Æ‚·‚éŽg—p‹–‘ø‚ðŽó‚¯‚½‚à‚̂Ƃµ‚Ü‚·B‚ ‚È‚½‚ÍAŽó —ÌŽÒ‚É‹–‘ø‚³‚ꂽŒ —˜‚ÌsŽg‚ɂ‚¢‚ÄA‚³‚ç‚ɧ–ñ‚ð‰Á‚¦‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB‚ ‚È ‚½‚É‚ÍA‘æŽOŽÒ‚É–{Žg—p‹–‘ø‚̎󂯓ü‚ê‚ð‹­‚¢‚éÓ”C‚Í‚ ‚è‚Ü‚¹‚ñB 8. Ù”»Š‚Ì”»ŒˆA–”‚Í“Á‹–NŠQ‚Ì\‚µ—§‚ÄA–”‚Í(“Á‹––â‘è‚ÉŒÀ‚ç‚È‚¢) ‰½‚ç‚©‚Ì——R ‚ÌŒ‹‰Ê‚Æ‚µ‚ÄA‚ ‚È‚½‚ɉۂ¹‚ç‚ê‚½ðŒ‚ª–{Žg—p‹–‘ø‚Æ‘Š“ü‚ê‚È‚¢‚à‚̂ł ‚Á‚½‚Æ‚µ ‚Ä‚à(Ù”»Š‚Ì–½—ßAŒ_–ñA‚»‚Ì‘¼‚É‚æ‚é‚à‚̂ł ‚ê)A–{Žg—p‹–‘ø‚ÌðŒ‚ª–Æœ‚³‚ê ‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñB–{Žg—p‹–‘ø‚É‚æ‚éÓ–±‚ÆA‚»‚Ì‘¼‚̉½‚ç‚©‚ÌŠÖ˜AÓ–±‚𓯎ž ‚É–ž‚½‚·‘Ô—l‚ŔЕz‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢‚È‚ç‚ÎA‚ ‚È‚½‚ÍuƒvƒƒOƒ‰ƒ€v‚ð‘S‚­”Еz ‚µ‚Ă͂¢‚¯‚Ü‚¹‚ñB—Ⴆ‚ÎA“Á‹–Œ ‚Ì“à—e‚ªA‚ ‚È‚½‚©‚ç’¼Ú–”‚ÍŠÔÚ‚É•¡»‚ðŽó‚¯ Žæ‚Á‚½‘S‚Ä‚Ìl‚ÉŽg—p—¿‚̂Ȃ¢ƒvƒƒOƒ‰ƒ€‚ÌĔЕz‚ð‹–‚³‚È‚¢‚à‚̂ł ‚ê‚ÎA‚ ‚È‚½ ‚ª‚©‚©‚é“Á‹–ã‚Ì—v¿‚Æ–{Žg—p‹–‘ø‚Ì—¼•û‚ð–ž‘«‚³‚¹‚é•û–@‚ÍAuƒvƒƒOƒ‰ƒ€v‚̔Р•z‚ðŠ®‘S‚É’f”O‚·‚邱‚Æ‚¾‚¯‚Å‚·B –{ð€‚̈½‚é•”•ª‚ª‰½‚ç‚©‚Ì“Á•Ê‚È󋵉º‚Å–³Œø‚Ü‚½‚Í“K—p•s‰Â”\‚ɂȂÁ‚½ê‡A–{ ð€‚Ì‚»‚Ì‘¼‚ÌŽc‚è‚Ì•”•ª‚ª“K—p‚³‚ê‚邿‚¤‚ɈÓ}‚³‚ê‚Ä‚¨‚èA‚Ü‚½A–{ð€‚Í‘S‘Ì ‚Æ‚µ‚Ä‚»‚Ì‘¼‚Ì󋵂ɓ–‚Ä‚Í‚Ü‚é‚æ‚¤‚ɈÓ}‚³‚ê‚Ä‚¢‚Ü‚·B –{ð€‚Ì–Ú“I‚ÍA“Á‹–‚â‚»‚Ì‘¼‚ÌàŽYŒ ‚ðNŠQ‚µ‚½‚èA‚»‚̂悤‚ÈŒ —˜‚ÉŠî‚­Žå’£ ‚̑Ó–«‚𑈂¤‚悤‚É‚ ‚È‚½‚ÉŠ©‚߂邱‚Ƃł͂ ‚è‚Ü‚¹‚ñB–{ð€‚Ì—Bˆê‚Ì–Ú“I‚ÍA ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚̔ЕzƒVƒXƒeƒ€‚ÌŠ®‘S«‚ðŽç‚邱‚Æ‚ÅA‚»‚ê‚ÍŒö—LŽg—p‹–‘ø‚Ì ŽÀ‘H‚É‚æ‚Á‚Ä—šs‚³‚ê‚Ü‚·B‘½‚­‚ÌlX‚ªA‚±‚̃VƒXƒeƒ€‚̈êŠÑ‚µ‚½“K—p‚ðM—Š‚µ‚ÄA ‚±‚̃VƒXƒeƒ€‚ð’Ê‚¶‚ĔЕz‚³‚ê‚Ä‚¢‚é•L‚¢”͈͂̃\ƒtƒgƒEƒFƒA‚ÉÉ‚µ‚݂Ȃ¢vŒ£‚ð ‚µ‚Ä‚­‚ê‚Ü‚µ‚½B쬎҂âŠñ‘¡ŽÒ‚ª‘¼‚̉½‚ç‚©‚̃VƒXƒeƒ€‚ð’Ê‚¶‚ă\ƒtƒgƒEƒFƒA‚ð”Ð •z‚µ‚½‚¢‚ÆŒˆ‚߂邱‚Ƃ͔ނç‚ÌŽ©—RˆÓŽu‚Å‚ ‚èAŽg—p‹–‘ø‚ðŽó‚¯‚éŽÒ‚Í‚»‚Ì‘I‘ð‚ð‹­ ‚¢‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB –{ð€‚ÍA–{Žg—p‹–‘ø‚Ì‘¼‚Ìð€‚̈Ӗ¡“à—e‚ª‰½‚Å‚ ‚é‚©‚ðŠ®‘S‚É–¾‚ç‚©‚É‚·‚邱‚Æ ‚ðˆÓ}‚µ‚Ä‚¢‚Ü‚·B 9. uƒvƒƒOƒ‰ƒ€v‚̔ЕzEŽg—p‚ªA‚ ‚é‘‚É‚¨‚¢‚Ä“Á‹––”‚Í’˜ìŒ ‚ŕی삳‚ꂽƒCƒ“ƒ^ ƒtƒF[ƒX‚̂ǂ¿‚ç‚©‚ŧŒÀ‚³‚ê‚éê‡AuƒvƒƒOƒ‰ƒ€v‚ð–{Žg—p‹–‘ø‰º‚É‚¨‚¢‚½Œ´’˜ 쌠•ÛŽŽÒ‚ÍA‚»‚Ì‘‚ðœŠO‚·‚éŽ|‚Ì–¾Ž¦“I‚ȔЕz’nˆæ§ŒÀ‚ð‰Á‚¦A‚»‚êˆÈŠO‚Ì(œ ŠO‚³‚ê‚È‚¢) ‘‚ÉŒÀ’肵‚ĔЕz‚ª‹–‚³‚ê‚邿‚¤‚É‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚»‚̂悤‚Èê ‡A‚»‚̧ŒÀ‚ð–{Žg—p‹–‘ø‚Ì–{•¶‚É‚ ‚½‚©‚à‘‚©‚ê‚Ä‚¢‚é‚©‚̂悤‚É–{Žg—p‹–‘ø‚Ì’† ‚É‘g‚Ý“ü‚ê‚ç‚ê‚é‚à‚̂Ƃµ‚Ü‚·B 10. Free Software Foundation ‚ÍŽžA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚̉ü’ù”ÅA–”‚ÍV”Å‚ðŒö•\ ‚·‚邱‚Æ‚ª‚ ‚è‚Ü‚·B‚»‚̂悤‚ÈV‚µ‚¢ƒo[ƒWƒ‡ƒ“‚ÍAŒ»s‚̃o[ƒWƒ‡ƒ“‚ÆŠî–{“I‚É •Ï‚í‚邯‚±‚ë‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAV‚µ‚¢–â‘è‚⌜ˆÄŽ–€‚ɑΉž‚·‚邽‚ß‚Éו”‚Å‚ÍˆÙ‚È ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB Šeƒo[ƒWƒ‡ƒ“‚ÍAƒo[ƒWƒ‡ƒ“”Ô†‚É‚æ‚Á‚Ä‹æ•Ê‚µ‚Ü‚·BuƒvƒƒOƒ‰ƒ€v’†‚É–{Žg—p‹– ‘ø‚̃o[ƒWƒ‡ƒ“”Ô†‚ÌŽw’肪‚ ‚éꇂÍA‚»‚ÌŽw’肳‚ꂽƒo[ƒWƒ‡ƒ“‚©A–”‚Í‚»‚ÌŒã ‚É Free Software Foundation ‚©‚çŒö•\‚³‚ê‚Ä‚¢‚é‚¢‚¸‚ê‚©‚̃o[ƒWƒ‡ƒ“‚©‚ç1 ‚‚ð ‘I‘ð‚µ‚ÄA‚»‚Ìð€‚ÆðŒ‚É]‚Á‚Ä‚­‚¾‚³‚¢BuƒvƒƒOƒ‰ƒ€v’†‚É–{Žg—p‹–‘ø‚̃o[ ƒWƒ‡ƒ“”Ô†‚ÌŽw’肪‚È‚¢ê‡‚ÍAFree Software Foundation ‚ªŒö•\‚µ‚½‚ǂ̃o[ƒWƒ‡ ƒ“‚Å‚à‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B 11. uƒvƒƒOƒ‰ƒ€v‚̈ꕔ‚ð”ЕzðŒ‚̈قȂ鑼‚̃tƒŠ[EƒvƒƒOƒ‰ƒ€‚É‘g‚Ýž‚Ý‚½‚¢ê ‡‚ÍA‚»‚ÌŠJ”­ŽÒ‚É‘–ʂŋ–‰Â‚ð‹‚߂Ă­‚¾‚³‚¢BFree Software Foundation ‚ª’˜ 쌠‚ðŽ‚Á‚Ä‚¢‚éƒ\ƒtƒgƒEƒFƒA‚ɂ‚¢‚Ä‚ÍAFree Software Foundation ‚Ö‘–Ê‚ð’ñ o‚µ‚Ä‚­‚¾‚³‚¢B‚±‚̂悤‚ÈꇂɑΉž‚·‚邽‚߂ɉäX‚Í—áŠO“Iˆ—‚ð‚·‚é‚±‚Æ‚à‚  ‚è‚Ü‚·‚ªA‚»‚Ì”»’fŠî€‚ƂȂé‚Ì‚ÍAŽŸ‚Ì2 ‚‚̖ڕW‚ÌŽÀŒ»‚ɇ’v‚·‚é‚©”Û‚©‚Æ‚¢‚¤ “_‚Å‚·B‘¦‚¿A‚P‚‚͉äX‚̃tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì‘S‚Ă̔h¶•¨‚ðƒtƒŠ[‚Èó‘Ô‚É •ۂ‚±‚Ƃł ‚èA‚à‚¤‚P‚‚̓\ƒtƒgƒEƒFƒA‚Ì‹¤—L‚ÆÄ—˜—p‚Æ‚ðL‚­‘£i‚³‚¹‚邱‚ƂŠ‚·B –³•ÛØ ------ 12. uƒvƒƒOƒ‰ƒ€v‚Í–³ž‚ÅŽg—p‹–‘ø‚³‚ê‚Ü‚·‚Ì‚ÅA“K—p–@—߂͈͓̔à‚ÅAuƒvƒƒOƒ‰ƒ€v ‚Ì•ÛØ‚ÍˆêØ‚ ‚è‚Ü‚¹‚ñB’˜ìŒ ŽÒ‚â‚»‚Ì‘¼‚Ì‘æŽOŽÒ‚Í‘S‚­–³•ÛØ‚Åu‚»‚̂܂Üv ‚Ìó‘Ô‚ÅAŠŽ‚ÂA–¾Ž¦‚©ˆÃ–Ù‚Å‚ ‚é‚©‚ð–â‚킸ˆêØ‚Ì•ÛØ‚ð‚‚¯‚È‚¢‚Å’ñ‹Ÿ‚·‚é‚à‚Ì ‚Æ‚µ‚Ü‚·B‚±‚±‚Å‚¢‚¤•ÛØ‚Æ‚ÍAŽsê«‚â“Á’è–Ú“I“K‡«‚ɂ‚¢‚Ä‚ÌˆÃ–Ù‚Ì•ÛØ‚àŠÜ ‚Ü‚ê‚Ü‚·‚ªA‚»‚ê‚ÉŒÀ’肳‚ê‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñBuƒvƒƒOƒ‰ƒ€v‚Ì•iŽ¿‚â«”\‚É ŠÖ‚·‚é‘S‚Ä‚ÌƒŠƒXƒN‚Í‚ ‚È‚½‚ª•‰‚¤‚à‚̂Ƃµ‚Ü‚·BuƒvƒƒOƒ‰ƒ€v‚ÉŒ‡Š×‚ª‚ ‚邯‚í ‚©‚Á‚½ê‡A‚»‚ê‚É”º‚¤ˆê؂̔h¶”ï—p‚âC—E’ù³‚É—v‚·‚é”ï—p‚Í‘S‚Ä‚ ‚È‚½‚Ì•‰ ’S‚Æ‚µ‚Ü‚·B 13. “K—p–@—߂̒è‚ßA–”‚Í‘–ʂɂæ‚釈ӂª‚ ‚éꇂ𜂫A’˜ìŒ ŽÒ‚âã‹L‹–‘ø‚ðŽó‚¯ ‚ÄuƒvƒƒOƒ‰ƒ€v‚Ì•ÏXEĔЕz‚ðˆ×‚µ“¾‚鑿ŽOŽÒ‚ÍAuƒvƒƒOƒ‰ƒ€v‚ðŽg—p‚µ‚½‚± ‚ÆA‚Ü‚½‚ÍŽg—p‚Å‚«‚È‚¢‚±‚ƂɋNˆö‚·‚éˆê؂̑¹ŠQ‚ɂ‚¢‚ĉ½‚ç‚ÌÓ”C‚à•‰‚¢‚Ü‚¹‚ñB ’˜ìŒ ŽÒ‚â‘O‹L‚Ì‘æŽOŽÒ‚ªA‚»‚̂悤‚È‘¹ŠQ‚Ì”­¶‚·‚é‰Â”\«‚ɂ‚¢‚Ä’m‚炳‚ê‚Ä‚¢ ‚½ê‡‚Å‚à“¯—l‚Å‚·B‚È‚¨A‚±‚±‚Å‚¢‚¤‘¹ŠQ‚ɂ͒Ê푹ŠQA“Á•Ê‘¹ŠQA‹ô”­‘¹ŠQAŠÔ Ú‘¹ŠQ‚ªŠÜ‚Ü‚ê‚Ü‚·(ƒf[ƒ^‚ÌÁޏA–”‚Í‚»‚̳Šm‚³‚Ì‘rޏA‚ ‚È‚½‚â‘æŽOŽÒ‚ª”í‚Á ‚½‘¹Ž¸A‘¼‚̃vƒƒOƒ‰ƒ€‚Ƃ̃Cƒ“ƒ^ƒtƒF[ƒX‚Ì•s“K‡‰»A“™‚àŠÜ‚Ü‚ê‚Ü‚·‚ªA‚±‚ê‚É ŒÀ’肳‚ê‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñ)B ˆÈã ’ˆÓ **** ‰p•¶•¶‘(GNU General Public Licence) ‚𳎮•¶‘‚Æ‚·‚éB‚±‚̘a•¶•¶‘‚ٌ͕ìŽm‚ÌˆÓ Œ©‚ðÌ‚è“ü‚ê‚ÄA‚Å‚«‚邾‚¯³Šm‚ɉp•¶•¶‘‚ð–|–󂵂½‚à‚̂ł ‚邪A–@—¥“I‚É—LŒø‚ÈŒ_ –ñ‘‚ł͂Ȃ¢B ˜a•¶•¶‘Ž©‘Ì‚ÌÄ”z•z‚ÉŠÖ‚µ‚Ä **************************** ‚¢‚©‚È‚é”}‘Ì‚Å‚àŽŸ‚ÌðŒ‚ª‚·‚ׂĖž‚½‚³‚ê‚Ä‚¢‚éꇂɌÀ‚èA–{˜a•¶•¶‘‚ð‚»‚Ì‚Ü‚Ü •¡ŽÊ‚µ”z•z‚·‚邱‚Æ‚ð‹–‰Â‚·‚éB‚Ü‚½A‚ ‚È‚½‚Í‘æŽOŽÒ‚ɑ΂µ‚Ä–{‹–‰Â’m‚Æ“¯ˆê‚Ì‹–‰Â ‚ð—^‚¦‚éꇂɌÀ‚èAÄ”z•z‚·‚邱‚Æ‚ª‹–‰Â‚³‚ê‚Ä‚¢‚Ü‚·B EŽó—ÌA”z•z‚³‚ꂽƒRƒs[‚É’˜ìŒ •\ަ‚¨‚æ‚Ñ–{‹–‘ø’m‚ª‘O‚à‚Á‚ÄÚ‚¹‚ç‚ê‚Ä‚¢‚é ‚±‚ÆB EƒRƒs[‚ÌŽó—ÌŽÒ‚ª‚³‚ç‚ÉÄ”z•z‚·‚éê‡A‚»‚Ì”z•zŽÒ‚ª–{’m‚Æ“¯‚¶‹–‰Â‚ð—^‚¦‚Ä ‚¢‚邱‚ÆB E˜a•¶•¶‘‚Ì–{•¶‚ð‰ü•Ï‚µ‚È‚¢‚±‚ÆB ‚ ‚È‚½‚ÌV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚É‚±‚ê‚ç‚Ìð€‚ð“K—p‚·‚é•û–@ ==================================================== ‚ ‚È‚½‚ªV‚µ‚­ƒvƒƒOƒ‰ƒ€‚ð쬂µA‚»‚ê‚ðŒö—p‚É‹Ÿ‚µ‚½‚¢ê‡‚ÍAƒvƒƒOƒ‰ƒ€‚ðƒtƒŠ[E ƒ\ƒtƒgƒEƒFƒA‚É‚µ‚ÄA‘S‚Ä‚ÌlX‚ªˆÈã‚ÌŠeð€‚É]‚Á‚Ä‚±‚ê‚ðĔЕz‚â•ÏX‚ð‚·‚é‚±‚Æ ‚ª‚Å‚«‚邿‚¤‚É‚·‚é‚Ì‚ªÅ—ǂ̕û–@‚Å‚·B ‚»‚¤‚·‚邽‚߂ɂÍAƒvƒƒOƒ‰ƒ€‚Ɉȉº‚Ì•\ަ‚ð‚µ‚Ä‚­‚¾‚³‚¢B‚»‚Ìê‡A–³•ÛØ‚Å‚ ‚邯 ‚¢‚¤‚±‚Æ‚ðÅ‚àŒø‰Ê“I‚É“`‚¦‚邽‚ß‚ÉAƒ\[ƒXEƒtƒ@ƒCƒ‹‚Ì–`“ª‚É‚»‚Ì‘S•¶‚ð•\ަ‚·‚ê‚Î Å‚àˆÀ‘S‚Å‚·‚ªA‚»‚Ì‘¼‚Ì•û–@‚Å•\ަ‚·‚éꇂłàAu’˜ìŒ •\ަv‚Æ‘S•¶‚ð“Ç‚Ýo‚·ˆ× ‚̃AƒhƒŒƒX‚ւ̃|ƒCƒ“ƒ^‚¾‚¯‚̓tƒ@ƒCƒ‹ã‚É•\ަ‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B ƒvƒƒOƒ‰ƒ€–¼‚Ƃǂñ‚È“®ì‚ð‚·‚é‚à‚Ì‚©‚ɂ‚¢‚Ă̊ȒP‚Èà–¾‚Ìs ------------------------------------------------------------ Copyright (C) 19 ››”NA’˜ìŒ ŽÒ–¼ ---------- –{ƒvƒƒOƒ‰ƒ€‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚ÍAFree Software Foundation ‚ªŒö•\‚µ‚½GNU ˆê”ÊŒö—LŽg—p‹–‘ø‚Ìuƒo[ƒWƒ‡ƒ“‚Qvˆ½‚¢‚Í‚»‚êˆÈ~‚ÌŠeƒo[ƒWƒ‡ ƒ“‚Ì’†‚©‚ç‚¢‚¸‚ê‚©‚ð‘I‘ð‚µA‚»‚̃o[ƒWƒ‡ƒ“‚ª’è‚ß‚éð€‚É]‚Á‚Ä–{ƒvƒƒOƒ‰ƒ€ ‚ðĔЕz‚Ü‚½‚Í•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B –{ƒvƒƒOƒ‰ƒ€‚Í—L—p‚Ƃ͎v‚¢‚Ü‚·‚ªA”Еz‚É‚ ‚½‚Á‚Ä‚ÍAŽsê«‹y‚Ñ“Á’è–Ú“I“K‡ «‚ɂ‚¢‚Ä‚ÌˆÃ–Ù‚Ì•ÛØ‚ðŠÜ‚ß‚ÄA‚¢‚©‚È‚é•ÛØ‚às‚È‚¢‚Ü‚¹‚ñBÚׂɂ‚¢‚Ä‚Í GNU ˆê”ÊŒö—LŽg—p‹–‘ø‘‚ð‚¨“Ç‚Ý‚­‚¾‚³‚¢B ‚ ‚È‚½‚ÍA–{ƒvƒƒOƒ‰ƒ€‚ƈê‚ÉGNU ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŽÊ‚µ‚ðŽó‚¯Žæ‚Á‚Ä‚¢ ‚é‚Í‚¸‚Å‚·B‚»‚¤‚łȂ¢ê‡‚ÍAFree Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA ‚֎莆‚ð‘‚¢‚Ä‚­‚¾‚³‚¢B ‚Ü‚½Aƒ†[ƒU‚ª“dŽqƒƒCƒ‹‚â‘M‚Å‚ ‚È‚½‚ƘA—‚ð‚Æ‚é•û–@‚ɂ‚¢‚Ä‚Ìî•ñ‚à‘‚«“Y‚¦‚Ä ‚­‚¾‚³‚¢B ƒvƒƒOƒ‰ƒ€‚ª‘Θb“I‚É“®ì‚·‚éꇂÍA‘Θbƒ‚[ƒh‚Å‹N“®‚µ‚½Žž‚ÉŽŸ‚̂悤‚È’Z‚¢’m•¶ ‚ª•\ަ‚³‚ê‚邿‚¤‚É‚µ‚Ä‚­‚¾‚³‚¢B Gnomovision ƒo[ƒWƒ‡ƒ“69ACopyright (C) 19 ››”N’˜ìŒ ŽÒ–¼ ---------- Gnomovision ‚ÍŠ®‘S‚É–³•ÛØ‚Å‚·BÚ×‚Í show w ‚ƃ^ƒCƒv‚µ‚Ä‚­‚¾‚³‚¢B‚±‚ê‚Í ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ȃ̂ÅA“Á’è‚ÌðŒ‚̉º‚Å‚±‚ê‚ðĔЕz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B Ú×‚Í show c ‚ƃ^ƒCƒv‚µ‚Ä‚­‚¾‚³‚¢B ã‹L‚Ìshow w ‚âshow c ‚ÍŠeXA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŠÖ˜A‚·‚é•”•ª‚ð•\ަ‚·‚éƒRƒ}ƒ“ƒh ‚ðŽw‚µ‚Ü‚·B‚à‚¿‚ë‚ñA‚ ‚È‚½‚ªŽg‚¤‚±‚ê‚ç‚̃Rƒ}ƒ“ƒh‚Íshow w ‚âshow c ‚Æ‚¢‚Á‚½ŒÄ‚Ñ –¼‚łȂ­‚Ä‚à\‚¢‚Ü‚¹‚ñB‚³‚ç‚ÉA‚»‚ê‚ç‚̃Rƒ}ƒ“ƒh‚Í‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ɇ‚킹‚éˆ× ‚ÉAƒ}ƒEƒX‚ŃNƒŠƒbƒN‚µ‚½‚胃jƒ…[Œ`Ž®‚É‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B ‚Ü‚½A•K—v‚Æ”F‚ß‚½ê‡‚É‚ÍA‚ ‚È‚½‚̌ق¢Žå(‚ ‚È‚½‚ªƒvƒƒOƒ‰ƒ}‚Æ‚µ‚Ä“­‚¢‚Ä‚¢‚éê ‡) ‚âÝЂ·‚éŠwZ‚©‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ɑ΂·‚éu’˜ìŒ •úŠüv‚ð”F‚ß‚½–¼“ü‚è‚Ì‘ –Ê‚ð“üŽè‚µ‚Ä‚­‚¾‚³‚¢B‚±‚±‚É‚»‚Ì•¶—á‚ðÚ‚¹‚Ü‚·B–¼‘O‚͕ς¦‚Ä‚­‚¾‚³‚¢B Yoyodyne, Inc. ‚ÍAJames Hacker ‚ªŠJ”­‚µ‚½ƒvƒƒOƒ‰ƒ€`Gnomovision' (ƒRƒ“ƒpƒC ƒ‰‚ɂ‚Ȃ°‚éƒvƒƒOƒ‰ƒ€) ‚ɂ‚¢‚Ă̒˜ìŒ –@ã‚Ì‘S‚Ă̌ —˜‚ð•úŠü‚·‚éB Ty Coon ‚Ì–¼, 1 April 1989 -------------- Ty Coon, •›ŽÐ’· –{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÍA‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ðàŽYŒ ‚Ì‘ÎۂƂȂÁ‚Ä‚¢‚鑼‚̃vƒƒOƒ‰ƒ€ ‚É‘g‚Ýž‚Þ‚±‚Ƃ͔F‚߂Ă¢‚Ü‚¹‚ñB‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ªƒTƒuƒ‹[ƒ`ƒ“Eƒ‰ƒCƒuƒ‰ƒŠ‚Å‚ ‚Á ‚ÄA‚ ‚È‚½‚ª‚»‚̃‰ƒCƒuƒ‰ƒŠ‚ðàŽYŒ ‚Ì‘ÎۂƂȂÁ‚Ä‚¢‚鑼‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ÆƒŠƒ“ƒN ‚³‚¹‚邱‚Ƃɂæ‚Á‚ÄA‚³‚ç‚É—L—p‚È‚à‚̂ɂµ‚悤‚Æ‚·‚éꇂɂÍA–{Žg—p‹–‘ø‘‚Ì‘ã‚í‚è ‚ÉAGNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒö—LŽg—p‹–‘ø‘‚É]‚Á‚Ä‚­‚¾‚³‚¢B % % Local variables: % fill-column: 80 % eval: (auto-fill-mode 1) % kanji-fileio-code: 1 % End: % dbacl-1.14.1/doc/prop.pl000077500000000000000000000002501325773323600147400ustar00rootroot00000000000000#!/usr/bin/perl $special = $normal = 0; while() { $special++ if /^ >/; $normal++; print; } $prop = $special/$normal; print "proportion: $prop\n"; dbacl-1.14.1/doc/sample1.txt000066400000000000000000000063661325773323600155410ustar00rootroot00000000000000"TOM!" No answer. "TOM!" No answer. "What's gone with that boy, I wonder? You TOM!" No answer. The old lady pulled her spectacles down and looked over them about the room; then she put them up and looked out under them. She seldom or never looked THROUGH them for so small a thing as a boy; they were her state pair, the pride of her heart, and were built for "style," not service -- she could have seen through a pair of stove-lids just as well. She looked perplexed for a moment, and then said, not fiercely, but still loud enough for the furniture to hear: "Well, I lay if I get hold of you I'll --" She did not finish, for by this time she was bending down and punching under the bed with the broom, and so she needed breath to punctuate the punches with. She resurrected nothing but the cat. "I never did see the beat of that boy!" She went to the open door and stood in it and looked out among the tomato vines and "jimpson" weeds that constituted the garden. No Tom. So she lifted up her voice at an angle calculated for distance and shouted: "Y-o-u-u TOM!" There was a slight noise behind her and she turned just in time to seize a small boy by the slack of his roundabout and arrest his flight. "There! I might 'a' thought of that closet. What you been doing in there?" "Nothing." "Nothing! Look at your hands. And look at your mouth. What IS that truck?" "I don't know, aunt." "Well, I know. It's jam -- that's what it is. Forty times I've said if you didn't let that jam alone I'd skin you. Hand me that switch." The switch hovered in the air -- the peril was des- perate -- "My! Look behind you, aunt!" The old lady whirled round, and snatched her skirts out of danger. The lad fled on the instant, scrambled up the high board-fence, and disappeared over it. His aunt Polly stood surprised a moment, and then broke into a gentle laugh. "Hang the boy, can't I never learn anything? Ain't he played me tricks enough like that for me to be look- ing out for him by this time? But old fools is the big- gest fools there is. Can't learn an old dog new tricks, as the saying is. But my goodness, he never plays them alike, two days, and how is a body to know what's coming? He 'pears to know just how long he can torment me before I get my dander up, and he knows if he can make out to put me off for a minute or make me laugh, it's all down again and I can't hit him a lick. I ain't doing my duty by that boy, and that's the Lord's truth, goodness knows. Spare the rod and spile the child, as the Good Book says. I'm a laying up sin and suffering for us both, I know. He's full of the Old Scratch, but laws-a-me! he's my own dead sister's boy, poor thing, and I ain't got the heart to lash him, some- how. Every time I let him off, my conscience does hurt me so, and every time I hit him my old heart most breaks. Well-a-well, man that is born of woman is of few days and full of trouble, as the Scripture says, and I reckon it's so. He'll play hookey this evening, * and [* Southwestern for "afternoon"] I'll just be obleeged to make him work, to-morrow, to punish him. It's mighty hard to make him work Saturdays, when all the boys is having holiday, but he hates work more than he hates anything else, and I've GOT to do some of my duty by him, or I'll be the ruination of the child." dbacl-1.14.1/doc/sample2.txt000066400000000000000000000075441325773323600155410ustar00rootroot00000000000000Rhetoric is the counterpart of Dialectic. Both alike are concerned with such things as come, more or less, within the general ken of all men and belong to no definite science. Accordingly all men make use, more or less, of both; for to a certain extent all men attempt to discuss statements and to maintain them, to defend themselves and to attack others. Ordinary people do this either at random or through practice and from acquired habit. Both ways being possible, the subject can plainly be handled systematically, for it is possible to inquire the reason why some speakers succeed through practice and others spontaneously; and every one will at once agree that such an inquiry is the function of an art. Now, the framers of the current treatises on rhetoric have constructed but a small portion of that art. The modes of persuasion are the only true constituents of the art: everything else is merely accessory. These writers, however, say nothing about enthymemes, which are the substance of rhetorical persuasion, but deal mainly with non-essentials. The arousing of prejudice, pity, anger, and similar emotions has nothing to do with the essential facts, but is merely a personal appeal to the man who is judging the case. Consequently if the rules for trials which are now laid down some states -- especially in well-governed states -- were applied everywhere, such people would have nothing to say. All men, no doubt, think that the laws should prescribe such rules, but some, as in the court of Areopagus, give practical effect to their thoughts and forbid talk about non-essentials. This is sound law and custom. It is not right to pervert the judge by moving him to anger or envy or pity -- one might as well warp a carpenter's rule before using it. Again, a litigant has clearly nothing to do but to show that the alleged fact is so or is not so, that it has or has not happened. As to whether a thing is important or unimportant, just or unjust, the judge must surely refuse to take his instructions from the litigants: he must decide for himself all such points as the law-giver has not already defined for him. Now, it is of great moment that well-drawn laws should themselves define all the points they possibly can and leave as few as may be to the decision of the judges; and this for several reasons. First, to find one man, or a few men, who are sensible persons and capable of legislating and administering justice is easier than to find a large number. Next, laws are made after long consideration, whereas decisions in the courts are given at short notice, which makes it hard for those who try the case to satisfy the claims of justice and expediency. The weightiest reason of all is that the decision of the lawgiver is not particular but prospective and general, whereas members of the assembly and the jury find it their duty to decide on definite cases brought before them. They will often have allowed themselves to be so much influenced by feelings of friendship or hatred or self-interest that they lose any clear vision of the truth and have their judgement obscured by considerations of personal pleasure or pain. In general, then, the judge should, we say, be allowed to decide as few things as possible. But questions as to whether something has happened or has not happened, will be or will not be, is or is not, must of necessity be left to the judge, since the lawgiver cannot foresee them. If this is so, it is evident that any one who lays down rules about other matters, such as what must be the contents of the "introduction" or the "narration" or any of the other divisions of a speech, is theorizing about non-essentials as if they belonged to the art. The only question with which these writers here deal is how to put the judge into a given frame of mind. About the orator's proper modes of persuasion they have nothing to tell us; nothing, that is, about how to gain skill in enthymemes. dbacl-1.14.1/doc/sample3.txt000066400000000000000000000063231325773323600155340ustar00rootroot00000000000000"Hello, old chap, you got to work, hey?" Tom wheeled suddenly and said: "Why, it's you, Ben! I warn't noticing." "Say -- I'm going in a-swimming, I am. Don't you wish you could? But of course you'd druther WORK -- wouldn't you? Course you would!" Tom contemplated the boy a bit, and said: "What do you call work?" "Why, ain't THAT work?" Tom resumed his whitewashing, and answered care- lessly: "Well, maybe it is, and maybe it ain't. All I know, is, it suits Tom Sawyer." "Oh come, now, you don't mean to let on that you LIKE it?" The brush continued to move. "Like it? Well, I don't see why I oughtn't to like it. Does a boy get a chance to whitewash a fence every day?" That put the thing in a new light. Ben stopped nibbling his apple. Tom swept his brush daintily back and forth -- stepped back to note the effect -- added a touch here and there -- criticised the effect again -- Ben watching every move and getting more and more interested, more and more absorbed. Pres- ently he said: "Say, Tom, let ME whitewash a little." Tom considered, was about to consent; but he altered his mind: "No -- no -- I reckon it wouldn't hardly do, Ben. You see, Aunt Polly's awful particular about this fence -- right here on the street, you know -- but if it was the back fence I wouldn't mind and SHE wouldn't. Yes, she's awful particular about this fence; it's got to be done very careful; I reckon there ain't one boy in a thousand, maybe two thousand, that can do it the way it's got to be done." "No -- is that so? Oh come, now -- lemme just try. Only just a little -- I'd let YOU, if you was me, Tom." "Ben, I'd like to, honest injun; but Aunt Polly -- well, Jim wanted to do it, but she wouldn't let him; Sid wanted to do it, and she wouldn't let Sid. Now don't you see how I'm fixed? If you was to tackle this fence and anything was to happen to it --" "Oh, shucks, I'll be just as careful. Now lemme try. Say -- I'll give you the core of my apple." "Well, here -- No, Ben, now don't. I'm afeard --" "I'll give you ALL of it!" Tom gave up the brush with reluctance in his face, but alacrity in his heart. And while the late steamer Big Missouri worked and sweated in the sun, the retired artist sat on a barrel in the shade close by, dangled his legs, munched his apple, and planned the slaughter of more innocents. There was no lack of material; boys happened along every little while; they came to jeer, but remained to whitewash. By the time Ben was fagged out, Tom had traded the next chance to Billy Fisher for a kite, in good repair; and when he played out, Johnny Miller bought in for a dead rat and a string to swing it with -- and so on, and so on, hour after hour. And when the middle of the afternoon came, from being a poor poverty-stricken boy in the morning, Tom was literally rolling in wealth. He had besides the things before mentioned, twelve marbles, part of a jews-harp, a piece of blue bottle-glass to look through, a spool cannon, a key that wouldn't unlock anything, a fragment of chalk, a glass stopper of a decanter, a tin soldier, a couple of tadpoles, six fire-crackers, a kitten with only one eye, a brass door- knob, a dog-collar -- but no dog -- the handle of a knife, four pieces of orange-peel, and a dilapidated old window sash. dbacl-1.14.1/doc/sample4.txt000066400000000000000000000055641325773323600155430ustar00rootroot00000000000000First, then, we must ascertain what are the kinds of things, good or bad, about which the political orator offers counsel. For he does not deal with all things, but only with such as may or may not take place. Concerning things which exist or will exist inevitably, or which cannot possibly exist or take place, no counsel can be given. Nor, again, can counsel be given about the whole class of things which may or may not take place; for this class includes some good things that occur naturally, and some that occur by accident; and about these it is useless to offer counsel. Clearly counsel can only be given on matters about which people deliberate; matters, namely, that ultimately depend on ourselves, and which we have it in our power to set going. [1359b] For we turn a thing over in our mind until we have reached the point of seeing whether we can do it or not. Now to enumerate and classify accurately the usual subjects of public business, and further to frame, as far as possible, true definitions of them is a task which we must not attempt on the present occasion. For it does not belong to the art of rhetoric, but to a more instructive art and a more real branch of knowledge; and as it is, rhetoric has been given a far wider subject-matter than strictly belongs to it. The truth is, as indeed we have said already, that rhetoric is a combination of the science of logic and of the ethical branch of politics; and it is partly like dialectic, partly like sophistical reasoning. But the more we try to make either dialectic rhetoric not, what they really are, practical faculties, but sciences, the more we shall inadvertently be destroying their true nature; for we shall be re-fashioning them and shall be passing into the region of sciences dealing with definite subjects rather than simply with words and forms of reasoning. Even here, however, we will mention those points which it is of practical importance to distinguish, their fuller treatment falling naturally to political science. The main matters on which all men deliberate and on which political speakers make speeches are some five in number: ways and means, war and peace, national defence, imports and exports, and legislation. As to Ways and Means, then, the intending speaker will need to know the number and extent of the country's sources of revenue, so that, if any is being overlooked, it may be added, and, if any is defective, it may be increased. Further, he should know all the expenditure of the country, in order that, if any part of it is superfluous, it may be abolished, or, if any is too large, it may be reduced. For men become richer not only by increasing their existing wealth but also by reducing their expenditure. A comprehensive view of these questions cannot be gained solely from experience in home affairs; in order to advise on such matters a man must be keenly interested in the methods worked out in other lands. dbacl-1.14.1/doc/sample5.txt000066400000000000000000000033601325773323600155340ustar00rootroot00000000000000ABOUT half-past ten the cracked bell of the small church began to ring, and pres- ently the people began to gather for the morning sermon. The Sunday-school children distributed themselves about the house and occupied pews with their par- ents, so as to be under supervision. Aunt Polly came, and Tom and Sid and Mary sat with her -- Tom being placed next the aisle, in order that he might be as far away from the open window and the seductive outside summer scenes as possible. The crowd filed up the aisles: the aged and needy postmaster, who had seen better days; the mayor and his wife -- for they had a mayor there, among other unnecessaries; the justice of the peace; the widow Douglass, fair, smart, and forty, a generous, good-hearted soul and well-to-do, her hill mansion the only palace in the town, and the most hospitable and much the most lavish in the matter of festivities that St. Petersburg could boast; the bent and venerable Major and Mrs. Ward; lawyer Riverson, the new notable from a dis- tance; next the belle of the village, followed by a troop of lawn-clad and ribbon-decked young heart-breakers; then all the young clerks in town in a body -- for they had stood in the vestibule sucking their cane-heads, a circling wall of oiled and simpering admirers, till the last girl had run their gantlet; and last of all came the Model Boy, Willie Mufferson, taking as heedful care of his mother as if she were cut glass. He always brought his mother to church, and was the pride of all the matrons. The boys all hated him, he was so good. And besides, he had been "thrown up to them" so much. His white handkerchief was hanging out of his pocket behind, as usual on Sundays -- accidentally. Tom had no handkerchief, and he looked upon boys who had as snobs. dbacl-1.14.1/doc/sample6.txt000066400000000000000000000077271325773323600155500ustar00rootroot00000000000000From xxxxxxxxx Tue Nov 18 22:51:52 1997 Return-Path: Received: by lion.statslab.cam.ac.uk (UK-Smail 3.1.25.1/17); Tue, 18 Nov 97 22:50 GMT Received: (from js@localhost) by axiom.maths.uq.edu.au (8.8.7/8.8.7) id IAA28052; Wed, 19 Nov 1997 08:29:53 +1000 (EST) Date: Wed, 19 Nov 1997 08:29:53 +1000 (EST) From: xxxxx To: JOKE -- xxxxx Subject: forwarded humour (fwd) Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Status: RO Content-Length: 3497 Lines: 80 Subject: political cows ---------------------------------------------------------------------------- >BUREAUCRATIC SOCIALISM: You have two cows. The government takes >them and puts them in a barn with everyone else's cows. They are cared >for by ex-chicken farmers. You have to take care of the chickens the >government took from the chicken farmers. The government gives you as >much milk and as many eggs as the regulations say you should need. > >FASCISM: You have two cows. The government takes both, hires you to >take care of them, and sells you the milk. > >PURE COMMUNISM: You have two cows. Your neighbors help you take >care of them, and you all share the milk. > >RUSSIAN COMMUNISM: You have two cows. You have to take care of >them, but the government takes all the milk. > >DICTATORSHIP: You have two cows. The government takes both and shoots you. > >SINGAPOREAN DEMOCRACY: You have two cows. The government fines >you for keeping two unlicensed farm animals in an apartment. > >MILITARIANISM: You have two cows. The government takes both and drafts you. > >PURE DEMOCRACY: You have two cows. Your neighbors decide who gets the milk. > >REPRESENTATIVE DEMOCRACY: You have two cows. Your neighbors >pick someone to tell you who gets the milk. > >AMERICAN DEMOCRACY: The government promises to give you two >cows if you vote for it. After the election, the president is impeached >for speculating in cow futures. The press dubs the affair "Cowgate". > >BRITISH DEMOCRACY: You have two cows. You feed them sheeps' >brains and they go mad. The government doesn't do anything. > >BUREAUCRACY: You have two cows. At first the government regulates >what you can feed them and when you can milk them. Then it pays you >not to milk them. After that it takes both, shoots one, milks the other >and pours the milk down the drain. Then it requires you to fill out forms >accounting for the missing cows. > >ANARCHY: You have two cows. Either you sell the milk at a fair price or >your neighbors try to kill you and take the cows. > >CAPITALISM: You have two cows. You sell one and buy a bull. > >HONG KONG CAPITALISM: You have two cows. You sell three of them >to your publicly listed company, using letters of credit opened by your >brother-in-law at the bank, then execute a debt/equity swap with >associated general offer so that you get all four cows back, with a tax >deduction for keeping five cows. The milk rights of six cows are >transferred via a Panamanian intermediary to a Cayman Islands company >secretly owned by the majority shareholder, who sells the rights to all >seven cows' milk back to the listed company. The annual report says >that the company owns eight cows, with an option on one more. >Meanwhile, you kill the two cows because the fung shui is bad. > >ENVIRONMENTALISM: You have two cows. The government bans you >from milking or killing them. > >FEMINISM: You have two cows. They get married and adopt a veal calf. > >TOTALITARIANISM: You have two cows. The government takes them >and denies they ever existed. Milk is banned. > >POLITICAL CORRECTNESS: You are associated with (the concept of >"ownership" is a symbol of the phallo-centric, war-mongering, intolerant >past) two differently-aged (but no less valuable to society) bovines of >non-specified gender. > >COUNTER CULTURE: Wow, dude, there's like... these two cows, man. >You got to have some of this milk. > >SURREALISM: You have two giraffes. The government requires you to >take harmonica lessons dbacl-1.14.1/doc/spam_chess.html000066400000000000000000002072761325773323600164540ustar00rootroot00000000000000
Can a Bayesian spam filter play chess?

Can a Bayesian spam filter play chess?

by Laird A. Breyer

Introduction

Many people these days depend on Bayesian filters to protect them from the ever present email scourge that is spam. Unlike older technologies, these programs' claim to fame is that they learn the spam patterns automatically, and more importantly, learn personalized spam (bad) and ham (good) email patterns.

Like many others, I wrote a Bayesian filter to protect me from unwanted email, which I called dbacl. My implementation functions as a Unix command line text classifier, with special email support, and can be used with procmail.

People are often astonished at how well statistical mail filtering works after they first try it, and it's tempting to imagine that such programs actually understand the emails being delivered, rather than merely matching patterns.

Now chess has always been a popular gauge of intelligence that everyone can understand, so if we put all these ideas together, then the question "Can a Bayesian spam filter play chess?" seems like a fun experiment with a lot of appeal.

Let's put down some ground rules: This experiment will test a real spam filter, not a specially designed chess program. It won't aim to beat Deep Thought (I wouldn't know where to start, and I have a feeling this could be difficult anyway ;-), but it will aim to show signs of "intelligence", or we won't claim success. Finally, since dry tables and graphs are no fun, a theoretical proof of concept is not enough: the spam filter must really play chess in a way that everyone can see, and try out at home.

The account below is designed so that you can follow and duplicate it by yourself. All you need is a Unix compatible computer. You'll have to open a terminal and be ready to type shell commands. All shell commands below are preceded by % to indicate the prompt, but you don't type the '%'. Instructions are fairly detailed, and various scripts can be downloaded when needed, but it helps if you're familiar with the shell. Ask a friend if you need help.

Important: You must follow these instructions if you want to actually play chess against the spam filter. You must also download some training games and teach the filter beforehand. Running the scripts alone is not enough. The instructions below have been tested to work with the GNU utilities and bash.

Start by making a directory to keep all the workings in one place.

% mkdir chess
% cd chess

Setting up the game(s)

The first thing we have to do is obtain a (preferably large) collection of chess games that we can learn.

Not being an expert, I started off by browsing the web for likely keywords. It became soon apparent that a large collection of free games is available electronically in something called the PGN format. So I ended up downloading all the files available from Chessopolis and placing them into a subdirectory.

% mkdir zipfiles
% cd zipfiles
% ls
100-pg.zip    can92-pg.zip  gmcom3pg.zip  krp-pg.zip    swede2pg.zip
4queenpg.zip  cp8687pg.zip  irish-pg.zip  lonepine.zip  ten-pg.zip
acbul-pg.zip  cp8891pg.zip  italy-pg.zip  maxg-pgn.zip  trap-pg.zip
bril-pg.zip   croat-pg.zip  kbp-pg.zip    minis-pg.zip  wchamppg.zip
brit60pg.zip  denm-pg.zip   knp-pg.zip    pca9395.zip
brit70pg.zip  gmcom1pg.zip  kp-kp-pg.zip  sams-pg.zip
cal-pg.zip    gmcom2pg.zip  kqp-pg.zip    storm-pg.zip

Now that we have a collection, let's look at a typical game, say from sams-pg.zip:

% zcat sams-pg.zip | head -15
[Event "?"]
[Site "Active Chess Championship, Kuala Lumpur (Malays"]
[Date "1989.??.??"]
[Round "?"]
[White "Anand Viswanathan (IND)"]
[Black "Sloan Sam"]
[Result "1-0"]
[ECO "C57"]

1. e4 e5 2. Nf3 Nc6 3. Bc4 Nf6 4. Ng5 Nxe4 5. Bxf7+ Ke7 6. d3 Nf6 7. 
Bb3 d5 8. Nc3 Bg4 9. f3 Bf5 10. f4 Bg4 11. Qd2 h6 12. fxe5 Nxe5 13. Qe3 
Kd6 14. d4 Nd3+ 15. Qxd3 Qe7+ 16. Be3 Re8 17. Nf7+ Qxf7 18. O-O c6 19. 
Bf4+ Kd7 20. Be5 Be7 21. Rae1 Rhf8 22. Nxd5 cxd5 23. Ba4+ Kd8 24. Qc3 
Bb4 25. Qxb4 Re6 26. c4 Rb6 27. Qa5 Bc8 28. c5 1-0

The trouble with data collections is that they are never exactly in the format we want. The chess game is obviously the bit at the bottom, while the text in square brackets looks quite useless to teach our filter.

Looking at the game itself, the numbers obviously count the moves, while the actual symbols that follow just seem like noise. But look more closely, and each move is actually followed by two expressions, one for each player.

In chess, the White player always starts first, and if you know that a chess board's columns are marked by letters, and the rows are marked by numbers, then e4 is a square on the board. The capital letters such as B, N, Q, K probably stand for Bishop, kNight, Queen and King. Of course, if you get stuck, you might just want to read the PGN format specification instead of guessing.

So now we know that each player's moves are separated by spaces, and that the numbers ending in a dot are just there to help people read the moves, and can be ignored just like the text in brackets with the names of the players etc. The real game information could be simply written like this:

e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 Nxe4 Bxf7+ Ke7 d3 Nf6 
Bb3 d5 Nc3 Bg4 f3 Bf5 f4 Bg4 Qd2 h6 fxe5 Nxe5 Qe3 
Kd6 d4 Nd3+ Qxd3 Qe7+ Be3 Re8 Nf7+ Qxf7 O-O c6 
Bf4+ Kd7 Be5 Be7 Rae1 Rhf8 Nxd5 cxd5 Ba4+ Kd8 Qc3 
Bb4 Qxb4 Re6 c4 Rb6 Qa5 Bc8 c5 1-0

The engine's brain

dbacl is a text classifier. It reads words and builds a probability model from their frequencies. It can also look at pairs of words, triples, etc. up to 7. The tokens it looks at can be up to 30 characters long. These limitations are technical and would take too long to explain, but are useful to know up front.

What happens when dbacl classifies a text is that it computes the probability of seeing the text naturally occurring under the model. This is how spam filtering works: we build two models, one for spam and one for good emails, and then dbacl checks which model probability is higher for every incoming email.

Before we go on, make sure that dbacl is available. You'll need version 1.11 at least, so the easiest way is to download the program from its homepage. Place the dbacl-1.11.tar.gz file in your chess directory.

% cd ..
% tar xfz dbacl-1.11.tar.gz
% mv dbacl-1.11 dbacl
% cd dbacl
% ./configure && make && make check
% cd ..

For chess, we first want to learn a model from many, many games. But then what? If we play an actual game, we'll end up with another piece of text that looks like the game above, but it will be incomplete. And we want dbacl to choose each move for the side it plays.

Now dbacl doesn't know the rules of chess, in fact anybody would be hard pressed to recognize that the text above is actually a game played on a board with wooden or plastic pieces. Anybody who has never heard of PGN of course.

What dbacl can do is choose. So here's what we will do: we take an incomplete game, and we add one extra (half) move at the end ourselves. We repeat this for all possible legal moves at that point. We'll get nearly identical partial games whose only difference is the last expression. We'll ask dbacl to work out the probabilities of each partial game under its model. And then we'll pick the most likely partial game.

Figuring out what to learn

We know that dbacl can tell us if a piece of text is typical for a model, and in turn a model is learned by reading many examples together. So if a pattern occurs very often in the games being learned, then such a typical pattern will be recommended by dbacl. And if the pattern is rare then dbacl will recommend it rarely.

But we want dbacl to win. So we want it to recommend the kind of things winners often do. So when dbacl plays White, it must learn a model from games where White wins, and if dbacl plays Black, then its model must be from games where Black wins.

At least that's a good first assumption. Sometimes, strong players lose a game against weaker players, and if dbacl learns this type of game, then it will pick up bad habits from the weaker player. But we'll assume that most games the better player wins. Also, if we learn to play by studying games from terrible players, then we'll pick up bad habits no matter what. But this is for later, or we'll never get anywhere.

Unfortunately, we now have work to do. We must split our thousands of sample games into White-Win (1-0) and Black-Win (0-1). And what to do about draws (1/2-1/2)? We can put them in both categories or just ignore them.

The files I downloaded are zipped MS-DOS files called *.PGN whose lines end in "\r\n" instead of ending in "\n", which is the Unix convention.

% cd zipfiles
% for f in *.zip; do unzip $f; done
% mkdir ../gamefiles
% mv *.PGN ../gamefiles
% cd ..

After inspecting a few *.PGN files, it's clear that a typical game takes several lines to write out fully, but the lines in between are either empty or contain all sorts of comments and useless information which must be scrubbed. We can do this by recombining the lines of a game into a single long line, and since all games start with a "1.", any lines left that don't start this way can be thrown away.

% cd gamefiles
% cat *.PGN  | sed -e 's/\r//g' \
  | sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \
  | sed -e 's/^ *//' \
  | grep '^1\.' \
  > allgames.txt

What we now have is a big file allgames.txt which contains very long lines where each line is a single game. In the PGN format, the end result is marked at the end of the game, so it is easy for us to sort the games by throwing away the lines which either contain 1-0 (White wins) or 0-1 (Black wins). We also remove the move numbers which we don't need anymore.

% cat allgames.txt | grep -v '0-1' | sed 's/[0-9]*\.[ ]*//g' > WhiteWinDraw.txt
% cat allgames.txt | grep -v '1-0' | sed 's/[0-9]*\.[ ]*//g' > BlackWinDraw.txt
% cat allgames.txt | grep '1-0' | sed 's/[0-9]*\.[ ]*//g' > WhiteWin.txt
% cat allgames.txt | grep '0-1' | sed 's/[0-9]*\.[ ]*//g' > BlackWin.txt
Let's see how many games we've got:
% wc -l *.txt
   46245 allgames.txt
   26809 BlackWinDraw.txt
   14913 BlackWin.txt
   31332 WhiteWinDraw.txt
   19436 WhiteWin.txt
  138735 total
All right, around 15-20 thousand winning games of each type. That should give dbacl something to read!

Remember, each game is on its own line. I'm going to leave the final scores at the end of each line where they are, as they are harmless (they can't occur in the middle of a game in progress). Let's learn the models:

% cd ..
% ./dbacl/src/dbacl -T text -l ./WhiteWinDraw -e alnum -L uniform -j -w 2 -H 20 ./gamefiles/WhiteWinDraw.txt
% ./dbacl/src/dbacl -T text -l ./BlackWinDraw -e alnum -L uniform -j -w 2 -H 20 ./gamefiles/BlackWinDraw.txt

The most important option here is "-w 2", which tells dbacl that it must pick up single words as well as word pairs. We'll see later if that's a good idea. If all went well, then you should have two files in your chess directory.

% ls -lh *Win*
-rw-r-----  1 laird laird 3.2M 2005-06-24 17:16 BlackWinDraw
-rw-r-----  1 laird laird 3.2M 2005-06-24 17:15 WhiteWinDraw

Building the engine

Now let's build the engine. This is where we'll cheat take advantage of the wonderful world of open source.

Remember that what we want to do is take a PGN game that's in progress, and let dbacl complete the next move by picking all possible legal next moves and adding them in turn to the current game, then we let dbacl compute the most probable game under its model. We don't really know if dbacl's model is a good one for chess, and let's not even think about competing with Deep Thought here, but this procedure will at least give us a way to pick the move.

Unfortunately, computing legal moves is straightforward but tedious, so I looked around the internet for something useful, and found the SAN Toolkit. This is an old freeware toolkit for chess which does everything we want, even though it was last updated in 1993 and probably no longer state of the art. It's written in C and we have to compile it, but most importantly we can use it directly in a Unix shell environment. Download it and place it in the chess directory.

% untar xfz san.tgz
% cd SAN
% cp SAN_DOC/Makefile SAN_SRC
% cd SAN_SRC
% make
% cd ../..

The documentation for this program is a little wanting, but it's not too hard to figure out, and the source code helps. Everything is calculated by the program san, which accepts commands. We'll write a script which accepts a PGN partial game and one of the dbacl categories we learned, and outputs the "best" move, meaning what dbacl thinks is closest to the category that was learned.

Let's try those ideas out before we proceed. We'll need a test PGN file.

% cat > test.pgn
1. e4 c5 2. Nf3 e6 3. d3 Nc6
The cat commands waits until you press CTRL-D to finish. Let's first ask the san program for a list of legal moves.
% echo -ne "svop verb namd nabd napr\nlfer test.pgn\nenum 1\n" \
 | ./SAN/SAN_SRC/san > test.legal 2>&1
% head -10 test.legal
: : : Welcome to the SAN Kit.
Revised: 1993.05.16

Bd2             : 1
Be2             : 1
Be3             : 1
Bf4             : 1
Bg5             : 1
Bh6             : 1
Kd2             : 1

Okay, this looks promising! There are some pieces of text we'll have to remove, but the possible first moves are all there (the listing is cut after 10 lines). Let's build the game line.

% cat test.pgn | sed 's/[0-9]*\.[ ]*//g' > test.gameline
% cat test.gameline
e4 c5 Nf3 e6 d3 Nc6

Next, we complete this gameline with each possible move:

% cat test.legal | grep '^.* : 1$' | cut -f 1 -d ' ' | \
 while read move; do
	echo `cat test.gameline` $move
 done > test.complete
% head -10 test.complete
e4 c5 Nf3 e6 d3 Nc6 Bd2
e4 c5 Nf3 e6 d3 Nc6 Be2
e4 c5 Nf3 e6 d3 Nc6 Be3
e4 c5 Nf3 e6 d3 Nc6 Bf4
e4 c5 Nf3 e6 d3 Nc6 Bg5
e4 c5 Nf3 e6 d3 Nc6 Bh6
e4 c5 Nf3 e6 d3 Nc6 Kd2
e4 c5 Nf3 e6 d3 Nc6 Ke2
e4 c5 Nf3 e6 d3 Nc6 Na3
e4 c5 Nf3 e6 d3 Nc6 Nbd2

And of course, let's check what dbacl thinks of this:

% cat test.complete | ./dbacl/src/dbacl -n -c ./WhiteWinDraw -f 1 > test.scores
% cat test.scores
WhiteWinDraw  53.88 e4 c5 Nf3 e6 d3 Nc6 Bd2
WhiteWinDraw  52.93 e4 c5 Nf3 e6 d3 Nc6 Be2
WhiteWinDraw  52.16 e4 c5 Nf3 e6 d3 Nc6 Be3
WhiteWinDraw  53.11 e4 c5 Nf3 e6 d3 Nc6 Bf4
WhiteWinDraw  52.88 e4 c5 Nf3 e6 d3 Nc6 Bg5
WhiteWinDraw  54.64 e4 c5 Nf3 e6 d3 Nc6 Bh6
WhiteWinDraw  55.32 e4 c5 Nf3 e6 d3 Nc6 Kd2
WhiteWinDraw  54.82 e4 c5 Nf3 e6 d3 Nc6 Ke2
WhiteWinDraw  54.55 e4 c5 Nf3 e6 d3 Nc6 Na3
WhiteWinDraw  57.48 e4 c5 Nf3 e6 d3 Nc6 Nbd2
WhiteWinDraw  52.07 e4 c5 Nf3 e6 d3 Nc6 Nc3
WhiteWinDraw  54.69 e4 c5 Nf3 e6 d3 Nc6 Nd4
WhiteWinDraw  53.83 e4 c5 Nf3 e6 d3 Nc6 Ne5
WhiteWinDraw  60.95 e4 c5 Nf3 e6 d3 Nc6 Nfd2
WhiteWinDraw  56.18 e4 c5 Nf3 e6 d3 Nc6 Ng1
WhiteWinDraw  54.51 e4 c5 Nf3 e6 d3 Nc6 Ng5
WhiteWinDraw  55.05 e4 c5 Nf3 e6 d3 Nc6 Nh4
WhiteWinDraw  52.88 e4 c5 Nf3 e6 d3 Nc6 Qd2
WhiteWinDraw  53.56 e4 c5 Nf3 e6 d3 Nc6 Qe2
WhiteWinDraw  53.83 e4 c5 Nf3 e6 d3 Nc6 Rg1
WhiteWinDraw  48.60 e4 c5 Nf3 e6 d3 Nc6 a3
WhiteWinDraw  49.86 e4 c5 Nf3 e6 d3 Nc6 a4
WhiteWinDraw  49.73 e4 c5 Nf3 e6 d3 Nc6 b3
WhiteWinDraw  49.77 e4 c5 Nf3 e6 d3 Nc6 b4
WhiteWinDraw  48.51 e4 c5 Nf3 e6 d3 Nc6 c3
WhiteWinDraw  49.23 e4 c5 Nf3 e6 d3 Nc6 c4
WhiteWinDraw  47.56 e4 c5 Nf3 e6 d3 Nc6 d4
WhiteWinDraw  49.77 e4 c5 Nf3 e6 d3 Nc6 e5
WhiteWinDraw  48.33 e4 c5 Nf3 e6 d3 Nc6 g3
WhiteWinDraw  50.00 e4 c5 Nf3 e6 d3 Nc6 g4
WhiteWinDraw  49.23 e4 c5 Nf3 e6 d3 Nc6 h3
WhiteWinDraw  49.86 e4 c5 Nf3 e6 d3 Nc6 h4

First, you'll note that each line contains the current game, but ends with one of the legal moves. Just before each game sequence, there is a score for that sequence, and since the sequences are nearly identical, the scores are nearly identical too.

In the world of dbacl, these scores are the negative logarithm (base 2) of the probability of the sequence, based on the model WhiteWinDraw. It's best to think of these scores as a distance away from the category model, so the line with the smallest score is the most likely. If you want to know what probability each sequence has, it's 1/(2^54.73) etc., which is pretty close to zero! But that's normal with these kinds of models.

So what's the best move? Simply sort the lines in increasing order by score and print out the first line:

% cat test.scores | sort -k 2 -n | head -1
WhiteWinDraw  47.56 e4 c5 Nf3 e6 d3 Nc6 d4
Remember, dbacl recommends what it thinks most of the games it has learned would do. We can take a peek at the effect of each half move on the score for the first line of test.complete by using dbacl's debugging switch:
% head -1 test.complete
e4 c5 Nf3 e6 d3 Nc6 Bd2
% head -1 test.complete | ./dbacl/src/dbacl  -nv -c ./WhiteWinDraw -f 1 -d
# categories: WhiteWinDraw 
# format: avg_score * complexity
    20.25 * 0.5         []e4[](1)
     2.91 * 1.0         []e4[]c5[](1)
     8.82 * 1.5         []c5[](1)
     4.55 * 2.0         []c5[]Nf3[](1)
     7.65 * 2.5         []Nf3[](1)
     3.15 * 3.0         []Nf3[]e6[](1)
     5.71 * 3.5         []e6[](1)
     3.21 * 4.0         []e6[]d3[](1)
     5.48 * 4.5         []d3[](1)
     4.34 * 5.0         []d3[]Nc6[](1)
     5.83 * 5.5         []Nc6[](1)
     4.31 * 6.0         []Nc6[]Bd2[](1)
     5.75 * 6.5         []Bd2[](1)
The scores we saw earlier are obtained by multiplying the average by the complexity, but dbacl internally works with nats, not bits, so 5.75 * 6.5 / ln(2) = 53.9. Since here we just want to see the tokens that are being used, these values aren't important. The most important thing to see is that there are contributions from single half moves as well as pairs of half moves, and the score balances them all.

Playing against people

Chess without a board is not as much fun as chess with an actual board. If we really want to claim that dbacl can play chess, then we need to make it work with something like GNU XBoard so it can play against people. Before we go on, you'll have to make sure this program is installed. It comes standard with most GNU/Linux distributions, for example on Debian you can type as root:

% apt-get install xboard

A real chess engine that works with XBoard must implement the Chess Engine Communication Protocol. This is a bit tedious, so I prepared one earlier. Save it as a file named dce-basic.sh in your chess directory, or type it yourself from the listing below. Note that I've just created enough code to play a simple game without undo, force, switch sides or board setup. In other words, the only thing you can do is start a new game, and play the moves, and dbacl must play Black.

% cat > dce-basic.sh
#!/bin/bash
# This script functions as an incomplete chess engine for XBoard.

DBACL=./dbacl/src/dbacl
SAN=./SAN/SAN_SRC/san
TMP=.
DCE=dce-basic

SANOK="no"
PGN="$TMP/$DCE.current.pgn"
GAMELINE="$TMP/$DCE.current.gameline"
SCORES="$TMP/$DCE.current.scores"
ENGINEMOVE="$TMP/$DCE.current.emove"
SANOUT="$TMP/$DCE.current.stdout"
SANERR="$TMP/$DCE.current.stderr"

SIDE="black"
MOVENOW="no"
CATFILE="./BlackWinDraw"

trap "" SIGTERM
trap "" SIGINT

function exec_san() {
	rm -rf $PGN.new $SANOUT $SANERR
	echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \
		| "$SAN" > "$SANOUT" 2> "$SANERR"
	if grep Error "$SANOUT" > /dev/null; then
		echo "Error (illegal move): $cmd"
		return 1
	else 
		mv $PGN.new $PGN
	fi
	return 0
}

function do_engine_move() {
	if exec_san "enum 1"; then
		# legal moves are in $SANOUT
		cat "$PGN" \
		| sed -e 's/\r//g' \
		| sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \
		| sed -e 's/^ *//' \
		| grep '^1\.' \
		| sed 's/[0-9]*\.[ ]*//g' \
		| sed 's/ \*.*$//' \
		> "$GAMELINE"

		# make all completions and let dbacl decide
		cat "$SANOUT" \
		| grep '.* : 1$' \
		| cut -f 1 -d ' ' \
		| while read move; do
			echo "`cat $GAMELINE` $move" 
		done \
		| "$DBACL" -n -c "$CATFILE" -f 1 \
		> "$SCORES"

		if [ `cat "$SCORES"| wc -l` = "0" ]; then
			# no moves left, game over!
			# the gameline contains the result
			echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}"
			return 0
		else
			# pick best scoring move
			cat "$SCORES" \
			| sort -k 2 -n \
			| head -1 \
			| sed -e 's/^.* //' \
			> "$ENGINEMOVE"
	
			if exec_san "`cat $ENGINEMOVE`"; then
				echo "move `cat $ENGINEMOVE`"
				return 0
			fi
		fi

	fi
	return 1
}

function do_reset() {
	rm -f $PGN
	touch $PGN
	exec_san ""
}

function do_move() {
	if [ "$SANOK" != "yes" ]; then
		echo "Illegal move (you must use SAN): $1"
		echo "Error (cannot play): $1"
	fi
	if exec_san "$1"; then
		MOVENOW="yes"
	fi
}

while read cmd; do
	case "$cmd" in
	xboard)
		echo "feature san=1 done=1"
		;;
	"accepted san")
		SANOK="yes"		
		;;
	quit)
		exit 0
		;;
	new)
		do_reset
		;;
	variant*)
		echo "Error (only standard chess please): $cmd"
		;;
	[a-h][x1-8]*)
		do_move "$cmd"
		;;
	[KQBNRP][xa-h]*)
		do_move "$cmd"
		;;
	O-O*)
		do_move "$cmd"
		;;
	analyze)
		echo "Error (unknown command): $cmd"
		;;
	*) 
		# ignore other commands
		echo "Error (command not implemented): $cmd"
		;;
	esac
	if [ "$MOVENOW" = "yes" ]; then
		if do_engine_move; then
			MOVENOW="no"
		else
			echo "Error (engine blew up): kaboom"
			exit 1
		fi
	fi
done

The source code above is not very complex. The last part reads commands one line at a time and calls various functions depending on the command. Then, if it is Black's turn, it calls the do_engine_move function. The current state of the game is constantly updated in the dce-basic.current.pgn file which is created in your chess directory, the list of scores computed by dbacl is in the file dce-basic.current.scores, and the final best engine move is saved in the file dce-basic.current.emove.

Once you have this engine script in your chess directory, make sure it has execute permissions, and then you can try it out with XBoard.

% chmod +x ./dce-basic.sh
% xboard -fcp ./dce-basic.sh

It's much more fun to read this account if you actually try this out with XBoard yourself, so I won't say what happens next or how well dbacl does as a chess player. The discussion with answers continues in the next section so consider this a spoiler warning. Don't peek!

When playing chess on XBoard, don't forget that dce-basic.sh is incomplete. All you can do is play White, and restart the game whenever you want. No fancy menu choices. However, you can follow what's going on at any time by looking at the temporary files named dce-basic.current.* which are placed in your chess directory.

spoiler space

First steps

Okay, you've tried your first game against dbacl, and it wasn't very impressive. In fact, it was practically random play! Note that it isn't entirely random - dbacl doesn't pick for example a random pawn on first move but slightly prefers positions towards the middle of the board. What's going on?

There can be only one culprit, and it's the model we used for learning, namely the "-w 2" switch. To understand this, let's look at the game line again:

% cat test.gameline
e4 c5 Nf3 e6 d3 Nc6

Now dbacl learns by reading single words (ie half moves) and consecutive pairs of words, then building a model out of these frequencies. This means that there is nothing in the model which makes for example the third word Nf3 depend on the first one e4 except through the second one c5, which could well be anything. In other words, consecutive moves by one colour are largely independent, which is why it feels that dbacl has no strategy.

We can force dbacl instead to learn 3, or better yet 4 consecutive words as a pattern. That should link e4 with Nf3 and even e6. Let's try it (this could take a few minutes to run):

% ./dbacl/src/dbacl -T text -l ./BlackWinDraw -e alnum -L uniform -j -w 4 -H 20 ./gamefiles/BlackWinDraw.txt
dbacl:warning: table full, some tokens ignored - try with option -h 21
Oh, oh. Here's a problem that we might as well get out of the way now. Looking at pairs, triples, etc. (these are called n-grams) uses a lot of memory because of all the possible combinations. That's one reason why long n-grams aren't that popular in machine classification. Here dbacl ran out of space and told us so, but still tried to learn something. But we don't want a skewed model, so we'll increase the allowable space and relearn. You will have to be mindful of this when you experiment.
% ./dbacl/src/dbacl -T text -l ./BlackWinDraw -e alnum -L uniform -j -w 4 -H 22 ./gamefiles/BlackWinDraw.txt
% xboard -fcp ./dce-basic.sh

spoiler space

Several steps

It's hard to see a big improvement with "-w 4", which is not very surprising if you think about it. Let's try with "-w 7", which for technical reasons is the maximum dbacl can handle. But before we do this, I want to briefly mention the work of C.E. Shannon.

One of Shannon's famous experiments concerns the approximation of English. He asked what would sentences look like if letters or words were picked randomly from a book. Here is what he found:

(Single letters) OCRO HLI RGWR NMIELWIS EU LL NBNESEBYA TH EEI ALHENHTTPA OOBTTVA NAH BRL.

(Pairs of letters) ON IE ANTSOUTINYS ARE T INCTORE ST BE S DEAMY ACHIN D ILONASIVE TUCOOWE AT TEASONARE FUSO TIZIN ANDY TOBE SEACE CTISBE.

(Triples of letters) IN NO IST LAT WHEY CRATICT FROURE BIRS GROCID PONDENOME OF DEMONSTURES OF THE REPTAGIN IS REGOACTIONA OF CRE.

(Single words) REPRESENTING AND SPEEDILY IS AN GOOD APT OR COME CAN DIFFERENT NATURAL HERE HE THE A IN CAME THE TO OF TO EXPERT GRAY COME TO FURNISHES THE LINE MESSAGE HAD BE THESE.

(Pairs of words) THE HEAD AND IN FRONTAL ATTACK ON AN ENGLISH WRITER THAT THE CHARACTER OF THIS POINT IS THEREFORE ANOTHER METHOD FOR THE LETTERS THAT THE TIME OF WHO EVER TOLD THE PROBLEM FOR AN UNEXPECTED.

So can we expect this also with chess moves? Let's try it. Because of the heavy memory requirements when "-w 7" is used (and the long time it takes), we'll learn a smaller game collection BlackWin.txt (but we keep the BlackWinDraw category name so we don't have to modify dce-basic.sh).

% ./dbacl/src/dbacl -T text -l ./BlackWinDraw -e alnum -L uniform -j -w 7 -H 23 ./gamefiles/BlackWin.txt

Before we start playing, how can we be sure that dbacl will match patterns in the way we expect? Let's try the debug switch like we did before on our test gameline:

% head -1 test.complete | ./dbacl/src/dbacl -nv -c ./BlackWinDraw -f 1 -d
# categories: BlackWinDraw 
# format: avg_score * complexity
    63.73 * 0.1         []e4[](1)
    -9.44 * 0.3         []e4[]c5[](1)
    15.46 * 0.4         []c5[](1)
     6.91 * 0.6         []e4[]c5[]Nf3[](1)
    -6.53 * 0.7         []c5[]Nf3[](1)
     5.07 * 0.9         []Nf3[](1)
     4.17 * 1.0         []e4[]c5[]Nf3[]e6[](1)
     1.31 * 1.1         []c5[]Nf3[]e6[](1)
    -9.96 * 1.3         []Nf3[]e6[](1)
    -2.22 * 1.4         []e6[](1)
    -0.86 * 1.6         []e4[]c5[]Nf3[]e6[]d3[](1)
    -1.00 * 1.7         []c5[]Nf3[]e6[]d3[](1)
    -3.88 * 1.9         []Nf3[]e6[]d3[](1)
    -9.31 * 2.0         []e6[]d3[](1)
    -3.80 * 2.1         []d3[](1)
    -2.59 * 2.3         []e4[]c5[]Nf3[]e6[]d3[]Nc6[](1)
    -1.58 * 2.4         []c5[]Nf3[]e6[]d3[]Nc6[](1)
    -2.16 * 2.6         []Nf3[]e6[]d3[]Nc6[](1)
    -2.99 * 2.7         []e6[]d3[]Nc6[](1)
    -5.49 * 2.9         []d3[]Nc6[](1)
    -2.12 * 3.0         []Nc6[](1)
     0.51 * 3.1         []e4[]c5[]Nf3[]e6[]d3[]Nc6[]Bd2[](1)
     2.92 * 3.3         []c5[]Nf3[]e6[]d3[]Nc6[]Bd2[](1)
     5.13 * 3.4         []Nf3[]e6[]d3[]Nc6[]Bd2[](1)
     7.16 * 3.6         []e6[]d3[]Nc6[]Bd2[](1)
     6.37 * 3.7         []d3[]Nc6[]Bd2[](1)
     3.35 * 3.9         []Nc6[]Bd2[](1)
     5.84 * 4.0         []Bd2[](1)

Perfect! Clearly dbacl is picking up sequences up to seven long. Now let's make a proper check:

% xboard -fcp ./dce-basic.sh

spoiler space

Another improvement

If you've tried the case "-w 7", then you may have noticed a true improvement over the previous attempts. But while dbacl no longer plays quite so randomly, the overall game seems touch and go. Openings are sometimes recognized, but there's no strategy and frequently dbacl seems to forget what it was doing. Also, there aren't many attempts to protect the 8th row from even direct attacks.

We can explain this type of behaviour with what we already know about the dbacl model. Since one chess move needs two words in PGN notation, then even with "-w 7", the longest connected word sequences are just over 3 chess moves long. These sequences aren't under dbacl's control since you play White, so when they break, this causes confusion and another potential sequence is followed. That's why dbacl seems to lose interest.

Another problem is that dbacl's model has no concept of opening, middle and endgame. If row 8 is attacked, it has no way of knowing if there are pawns which protect the piece, and whether there is room to move away, because the training patterns are averaged over many games. We'll come back to this observation later.

So far we've treated half-moves as fundamental, but perhaps it makes more sense to base our models on full moves? Since our engine always plays Black, then the completed gamelines will always have an even number of words. Moreover, the '-w 7" model shall truly be seven chess moves long, not three and a half. Let's try it. We can combine pairs of moves by replacing the space between them with underscores as follows (combine_half_moves.sh).

% cat test.gameline
e4 c5 Nf3 e6 d3 Nc6
% cat > combine_half_moves.sh
#!/bin/sh
sed -e 's/$/ Z/' -e 's/ \([^ ]* *[^ ]\)/_\1/g' -e 's/[ ]*Z$//'
% chmod +x combine_half_moves.sh
% cat test.gameline | ./combine_half_moves.sh
e4_c5 Nf3_e6 d3_Nc6

Now we have to adapt the training sets, and change the code of dce-basic.sh slightly. I've called this modification dce-1.sh

% cd gamefiles
% cat BlackWinDraw.txt | ../combine_half_moves.sh > BlackWinDraw-1.txt
% cat BlackWin.txt | ../combine_half_moves.sh > BlackWin-1.txt
% cd ..

Naturally, we must learn the new dataset. You might want to make a cup of coffee while you wait.

% ./dbacl/src/dbacl -T text -l ./BlackWin-1 -e graph -L uniform -j -w 7 -H 23  ./gamefiles/BlackWin-1.txt

One last safety check and we'll be ready:

% cat test.gameline | ./combine_half_moves.sh | ./dbacl/src/dbacl -nv -c ./BlackWin-1 -f 1 -d
# categories: BlackWin-1 
# format: avg_score * complexity
   128.93 * 0.1         []e4_c5[](1)
   -11.83 * 0.3         []e4_c5[]Nf3_e6[](1)
    37.71 * 0.4         []Nf3_e6[](1)
    17.15 * 0.6         []e4_c5[]Nf3_e6[]d3_Nc6[](1)
   -20.69 * 0.7         []Nf3_e6[]d3_Nc6[](1)
     7.60 * 0.9         []d3_Nc6[](1)
Okay, it seems to be working.
% chmod +x dce-1.sh
% xboard -fcp ./dce-1.sh

spoiler space

Aimless behaviour

Compared to the earlier attempts, this change seems to have improved dbacl's tactics. However, we still have much aimless behaviour in the middle and end games. How do we address this?

Our biggest problem is possibly that dbacl is blind. It simply doesn't know or care about the true configuration of the board pieces, like a real chess engine would. Instead, everything it knows are the likely sequences of moves that it found in the training games.

Computer chess is an area which has been studied extensively for a long time, and while we could try to apply these methods to our little engine, we wouldn't learn anything new about chess or about dbacl. So instead, I am only going to try the kind of things that would not be out of place in spam filtering.

Deep in the dawn of spam filtering, people devised keyword rules to send unwanted email to the trash. Even today, this is a popular method to detect, for example, those messages which contain "VIAGRA" in the subject line, and automatically pick an action to take. Maybe we can detect some fixed text pattern in the gameline and use this to override the normal dbacl scores? Let's look at a typical game.

% head -1 ./gamefiles/BlackWin.txt | fmt
d4 Nf6 c4 e6 Nf3 b6 g3 Ba6  Qc2 c5 Bg2 Bb7 O-O Be7 Nc3 cxd4  Nxd4 Bxg2
Kxg2 Qc7 Qd3 O-O e4 d6  f3 Nbd7 b3 a6 Be3 Qb7 Rfd1 Rfe8  Bf2 Bf8 Nc2 Rec8
Ne3 Rab8 a4 Ne5  Qd2 Rc7 Rac1 Rbc8 Qe2 Nc6 Be1 Nd7  g4 Nc5 Qc2 Nb4 Qb1
Be7 Ne2 Nc6  Bc3 Ne5 Ng3 Bg5 Ngf1 Bf4 Bxe5 Bxe5  Rd2 Bf4 Rcd1 b5 axb5
axb5 Ra2 Nd7  Qd3 Nc5 Qc2 h6 Ra5 bxc4 bxc4 Nd7  Qe2 Ne5 Rb5 Qa6 Rb2
Nxc4 Nxc4 Qxc4  Rd3 Qc5 Ne3 Qg5 Qf2 Rc3 Rxc3 Rxc3  Nf1 Kh7 Rc2 Qe5 Ng3
Be3 Qe2 g6  Nf1 Bf4 Ng3 Kg7 Qf2 Be3 Qe2 Qd4  Nf1 Bf4 Ng3 Rxc2 Qxc2 Qd2+
Qxd2 Bxd2  Ne2 g5 Nd4 Kf6 Nb3 Bc3 Kf2 Ke5  Ke3 Bb4 Nc1 Bc5+ Ke2 Bg1 Nd3+
Kd4  h3 Kc3 Nc1 Bh2 Nd3 Bf4 Nf2 d5  exd5 exd5 Nd3 Be5 Nc1 Kd4 Nd3 Bf4  Nb4
Ke5 Nd3+ Kd6 Nb4 Ke6 Nd3 Bd6  Nb2 Ke5 Nd3+ Kf6 Nb2 Ke6 Nd3 h5  Nf2 f5 Nd1
fxg4 fxg4 hxg4 hxg4 Kf6  Nb2 Ke5 Kf3 Kd4 Nd1 Kd3 Nf2+ Kd2  Nh3 Be7 Nf2
Bc5 Nh1 Bd6 Nf2 Bf4  Nh1 Be3 Ng3 Kd3 Nh1 Bg1 Ng3 Kd2  Nf5 d4 Ng3 d3  0-1

Besides the normal moves that represent a change in position, the most obvious feature is that some of the moves above also contain an 'x', which means that this is a capturing move. Interesting! One of the problems with the dbacl engine so far is that often, an opportunity for capturing White's pieces is simply ignored. Can we devise a keyword rule which triggers on 'x' to force dbacl to capture an available piece instead of ignoring it?

Let's try it: first we'll need a gameline which includes an 'x' type move, since our previous test.gameline file doesn't. Note that we'll forget temporarily the underscore trick we used in the previous section, just to keep things simple at first.

If you look at the full game listed two paragraphs ago, you'll see that the last full move on the first line is "Nxd4 Bxg2", so if we use this line and delete the last full move, then the possible completions will contain at least "Nxd4" and we have a suitable test case.

% cat > test2.pgn
1. d4 Nf6 2. c4 e6 3. Nf3 b6 4. g3 Ba6 5. Qc2 c5 6. Bg2 Bb7 7. O-O Be7 8. Nc3 cxd4
% echo -ne "svop verb namd nabd napr\nlfer test2.pgn\nenum 1\n" \
 | ./SAN/SAN_SRC/san > test2.legal 2>&1
% cat test2.legal | grep '^.* : 1$' | cut -f 1 -d ' ' | \
 while read move; do
        echo `cat test2.gameline` $move
 done > test2.complete
% cat test2.complete | ./dbacl/src/dbacl -n -c ./WhiteWinDraw -f 1 > test2.scores

There are 48 different potential moves in the test2.scores file, and what we are interested in is the score (column 2) and the potential half move (column 21).

% cat test2.scores | sort -k 2 -n | cut -f 2,21 -d ' ' | head -25
129.08 h3
129.35 a4
129.89 a3
129.89 b3
129.89 e3
133.09 Qg6
133.36 Bf4
133.36 Bg5
133.36 Qa4
133.36 Rb1
133.36 Rd1
133.86 Be3
133.86 Bh3
133.86 Nb5
133.86 Ne4
133.86 Nh4
133.86 Qb3
133.86 Qd3
133.86 Qe4
137.87 Nxd4
154.68 e4
154.96 c5
155.77 b4
155.81 h4
155.95 g4

I've only listed the first 25 moves by score but it's clear that dbacl's model puts "h3" as the most likely move, and "Nxd4" way down in 20th position! Let's extract the capturing moves.

% cat test2.scores | grep 'x[^ _]*$' | sort -k 2 -n
WhiteWinDraw 138.73 d4 Nf6 c4 e6 Nf3 b6 g3 Ba6 Qc2 c5 Bg2 Bb7 O-O Be7 Nc3 cxd4 Nxd4 Bxg2 Nxd4
WhiteWinDraw 162.90 d4 Nf6 c4 e6 Nf3 b6 g3 Ba6 Qc2 c5 Bg2 Bb7 O-O Be7 Nc3 cxd4 Nxd4 Bxg2 Qxh7

Since there is more than one possible capturing move, the engine has to decide what it wants to play. By sorting the capturing moves by their scores, we let dbacl tell us which move it prefers. Obviously, "Nxd4" is this preferred candidate. It's also possible that for some gamelines, there is no legal capturing move; we'll have to use the full list of scores as before in that case.

Finally, we must decide how we are going to integrate this special handling of capturing moves into our chess engine. In spam filters, a keyword rule typically stops all other tests from happening afterwards, because the rule is trusted to override other decisions. Here, this means that we first score all the capturing moves if there are any, and use the best one regardless of other options. It's only if there are no capturing moves that we look at the remaining possibilities.

By using the explanations above, you can modify dce-basic.sh yourself, or try out dce-2.sh, which implements both the 'x' and "underscore" tricks together.

% chmod +x dce-2.sh
% xboard -fcp ./dce-2.sh

spoiler space

Tactical adjustments

Quite a change in behaviour! The engine no longer ignores capture opportunities, but our method has made it greedy. dbacl is now so greedy that there is no tension left in the game, and since it doesn't know the value of each piece, it often makes bad bargains.

Unfortunately, there isn't enough data in the PGN format to let dbacl read off easily the value of an exchange. If you look at the full training game listed earlier, you'll see many moves marked with an 'x', such as "cxd4" "Nxd4" "Bxg2" "Kxg2", but none of these moves identifies the type of the captured piece, only the piece doing the capturing. It's certainly possible to deduce the relevant piece by replaying all the moves on an imaginary board, but then our chess engine would no longer act like a spam filter. Keeping an imaginary board is roughly the equivalent of understanding the actual meaning of an email.

So dbacl, as a chess-playing-spam-filter, is limited to two things: it can limit the risk of an exchange, and limit the frequency of exchanges.

To limit risk, if there are several capture scenarios available, it can always prefer to capture with the least valued piece (since the type of the piece doing the capturing is known by looking at the move), but note that this doesn't help when there is exactly one capture move possible.

Limiting the frequency of exchanges would make dbacl less greedy and refuse to capture pieces all the time. As we noted earlier, dbacl doesn't naturally tend to capture pieces, so we must find a balance.

We can force a capture when there are two or more capture opportunities. Together with the risk limitation idea, these types of captures are then performed by lower value pieces in relative terms.

Clearly, there are endless other things we can try, but there is a price to pay. As capture rules become heavier and more complex, the original patterns learned by dbacl from the training games lose their importance. The dbacl chess engine becomes a hybrid, part ordinary chess engine and part Bayesian text classifier.

I've implemented the two rules above in dce-3.sh. Try it out now.

% chmod +x dce-3.sh
% xboard -fcp ./dce-3.sh

spoiler space

Randomized play

We've come a long way, so let's go back to the initial question. "Can a spam filter play chess?". To answer this question affirmatively, we need at least one example which can't be explained by random play. While dbacl undoubtedly makes some strange chess decisions sometimes, let's look at the following game fragment played against dce-3.sh:

Clearly, dbacl picked up the pawn defensive moves from the games archive, as this succession of moves is very unlikely to be random (all moves are on the same side of the board, and none of the moves are capturing moves, so cannot be explained by capture heuristics which partially override dbacl's natural choices).

So dbacl has definitely learned something about chess, at least in some tactical situations, and can probably hold its own against an average three year old. Mission accomplished!

Well, the title of this section is "randomized play", and there is one more thing to do. So far, the dbacl chess engine is deterministic: when faced with identical White moves, it will always play the same way. This gets boring very fast. What we would like is more randomized play, but which still uses the dbacl scoring system.

For randomized play, we can think of the scores as equivalent probabilities. Then we can pick not just the highest probability (lowest score) move as we've done so far, but instead any move according to its probability. Let's look again at the file test.scores that we created earlier:

% head -5 test.scores
WhiteWinDraw  53.88 e4 c5 Nf3 e6 d3 Nc6 Bd2
WhiteWinDraw  52.93 e4 c5 Nf3 e6 d3 Nc6 Be2
WhiteWinDraw  52.16 e4 c5 Nf3 e6 d3 Nc6 Be3
WhiteWinDraw  53.11 e4 c5 Nf3 e6 d3 Nc6 Bf4
WhiteWinDraw  52.88 e4 c5 Nf3 e6 d3 Nc6 Bg5

As I already mentioned, the dbacl model probabilities are related to these scores as follows: Prob[Bd2] = 2^(-53.88), Prob[Be2] = 2^(-52.93), etc. Unfortunately, these are all very small probabilities and we can't easily represent them as floating point numbers once the gameline becomes much longer, let alone pick them at random. So first, let's subtract the biggest common factor: If we sort the scores, then the top score is the factor we want:

% cat test.scores | sort -k 2 -n > test.scores.prob
% head -1 test.scores.prob
WhiteWinDraw  47.56 e4 c5 Nf3 e6 d3 Nc6 d4

We'll write an awk program to do the randomizing, so here's the first part:

% cat > renorm.awk
#!/usr/bin/awk -f
{
  if( cf == 0 ) {
    cf = $2
  }
  print $2 - cf, $0
}
% cat test.scores.prob | awk -f ./renorm.awk | head -5
0 WhiteWinDraw  47.56 e4 c5 Nf3 e6 d3 Nc6 d4
0.77 WhiteWinDraw  48.33 e4 c5 Nf3 e6 d3 Nc6 g3
0.95 WhiteWinDraw  48.51 e4 c5 Nf3 e6 d3 Nc6 c3
1.04 WhiteWinDraw  48.60 e4 c5 Nf3 e6 d3 Nc6 a3
1.67 WhiteWinDraw  49.23 e4 c5 Nf3 e6 d3 Nc6 c4

Okay, the first column gives the modified score and the rest is the original line. Since these are binary exponents rather than actual probabilities, we'll use a rejection sampler to pick the correct line and print it out. Here's the full randomizer:

% cat > randomizer.awk
#!/usr/bin/awk -f
{
  if( cf == 0 ) {
    cf = $2;
  }
  score[NR] = $2 - cf;
  line[NR] = $0;
}

END{
  # randomizer seeded by time of day
  # don't use more often than once per second.
  srand();
  while(1) {
    x = int(rand() * NR) + 1;
    t = -log(rand());
    if( log(2) * score[x] < t ) {
      print line[x];
      break;
    }
  }
}
% cat test.scores.prob | ./randomizer.awk 
WhiteWinDraw  48.33 e4 c5 Nf3 e6 d3 Nc6 g3
% cat test.scores.prob | ./randomizer.awk 
WhiteWinDraw  47.56 e4 c5 Nf3 e6 d3 Nc6 d4

Awk's randomizer is seeded by the time of day, so if you repeatedly run the randomizer.awk script in a fast loop, it will always output the same result. But for chess against people, we don't really care about the quality of the randomness involved.

I've added the randomizer to the final version of the chess engine, dce.sh, which also contains a few other improvements. If you feel like experimenting further with the dbacl chess engine, that script is probably the best starting point. Enjoy!

% chmod +x ./dce.sh
% xboard -fcp ./dce.sh

spoiler space

Wrapping up

It's time to conclude this investigation and see what we've learned. The original question was "Can a spam filter play chess?". Clearly, the answer to this is yes, but making it play well is not so easy.

A crucial aspect I haven't touched on here are chess tournaments. The only way to reliably judge potential improvements in an engine is to make it play other engines with known strengths. Not all types of tournaments are appropriate for the dbacl chess engine - for example randomized initial positions and endgame puzzles are meaningless, because dbacl doesn't think ahead more than one half move, and it needs the full game history for matching patterns. Moreover, the fundamental behaviour is learned entirely from training sets. Thus dbacl's strength as a chess player is meaningless without reference to its training archive. However, if this archive is fixed, then incremental improvements to the algorithms can be evaluated in that context.

dbacl is able to learn some tactics simply by reading large collections of games. However, it seems that strategy is beyond its capabilities. Moreover, there are some fundamental limitations in treating a PGN format game like a text document: some information such as the values of exchanged pieces aren't easy to read off without keeping an imaginary board for replaying moves.

There are many ways to change the characteristics of the basic chess engine we've built here. Besides more complex capture heuristics, one can try to account for the length of the game (opening/middle/endgame), the difference in the number of pieces captured by each side, etc. Beyond that, the PGN gameline representation which we used here can be replaced with more informative symbol sequences. In principle, one could replace each move with a pictorial representation of the board such as FEN, but besides the added implementational complications, this causes difficulties because of dbacl's limit of 30 character tokens, and possibly statistical issues in recognizing similar but not identical board configurations.

Perhaps most interestingly overall, it should be remembered that dbacl doesn't think ahead like most chess engines do. Its successes and failures are almost entirely based on the historical record of the game as it develops and mimicry of training games, not at all on calculating moves and countermoves in the future.

Download the latest dbacl chess engine: dce.sh

Post Scriptum

After this essay was written, it appeared on slashdot. This resulted in some interesting comments and emails. I've selected some of them below and added some responses.

aug24 writes on slashdot "For example, it currently uses entire games to compare. So if it comes across an unusual opening, even one close to a standard one, it's not able to decide effectively. Perhaps something using game fragments would be possible, then it might reproduce structured plays even when the previous game play has been unusual."

It's true that in the essay, the full game is scored from the beginning, but this is only for convenience. For the actual decisions, solely the last few moves matter (how many depends on the -w switch), and the extra score contributions from the beginning are identical for all possible choices, so cancel out in the final decision. The beginnings of the games could be cut away before scoring, but this would be more work and would make no difference in the way dbacl plays chess.

N3Roaster writes on slashdot "I've got one. I read somewhere that high level chess players don't view the current game state so much in terms of exactly where each piece is, but in terms of piece groupings. I'm more of a go player myself, but it seems like that would probably be right. Perhaps a richer yet more abstract structure representing game state would be better. In this way, situations where the structure of play dynamics are the same even while the key pieces are in different positions could be picked up on. This combined with your game fragment notion would probably allow the chess filter to learn much faster."

Other representations besides PGN are certainly possible and worth trying. Since dbacl learns patterns directly from input text, it is first necessary to convert the training games into such another representation, then the current game must also be available in this representation during play.

pclminion writes on slashdot "I'm sure people have thought of it before, but they haven't done it because it's clear that it can't work unless it's given an infinite context of moves. Otherwise, you can set the computer up to fail by creating a situation near the beginning of the midgame and then playing out a line that traps the computer as soon as it runs out of context. It is also limited to what it learns by "observing" other games. So it can never move creatively or unexpectedly."

dbacl does not operate this way. It is not limited to matching known sequences which were seen in the training games, but instead predicts likelihoods for never before seen sequences from its model by generalization. There is no need for an infinite context of moves, the model is in fact learned from a limited number of training games, and once learned, it can handle any game sequence "creatively", since such a sequence is decomposed into known and unknown fragments and recombined through the rules of probability. The dbacl chess engine can also move "unexpectedly", either because the model differs from a player's expectation, or becasue of the randomization step explained at the end of the essay.

mrthoughtful writes on slashdot "It would never get to beat modern computer chess programs, as it depends upon a database of previous games that are similar to the current game played, and has no scope for examining possible futures."

While it is true that in the essay, dbacl predicts the next move by examining the immediate past, there is nothing inherently impossible about predicting several moves ahead. With some work, the engine can be modified to generate all the game sequences which are two or more moves into the future, and dbacl will happily score each such sequence as well. However, the fundamental difficulty with chess is that the number of game sequences grows exponentially with the number of predicted moves, so the computational cost of predicting several moves into the future grows very quickly.

Steinfiend writes on slashdot "So a Chess playing Bayesian filter isn't necessarily 100% useful now, but what they learned from doing it might be able to be applied in some other situation. Maybe they can reapply whatever they learned back into spam filtering and improve all of our in-boxes."

Perhaps a different way of saying this is that both spam filtering and this chess playing experiment exhibit common weaknesses. For example, currently the dbacl chess engine has difficulty adapting to the middle and end games. This is difficult because there is no simple boundary between the phases of a chess game. Similarly, general emails have a complicated structure but it can be hard to distinguish its semantic parts. A message can switch from being professional to personal etc. This weakness is hard to observe in spam filtering, but much easier to see in the chess experiment.

Chris_Mir writes on slashdot "I can imagine, depending on how many games are played and the available memory space, that it will develop to have a decent opening. But nothing more then that." and aug24 responds "Absolutely, because it is effectively playing with complete games in order to do well, which is equivalent to making a tree of every possible chess move from the start - a rather big data set.

dbacl doesn't remember full trees, it picks up game fragments of a certain number of moves and uses these to analyze unknown and longer sequences using Bayesian theory. The openings are learned more quickly because everyone starts with the same initial board setup, and there are only a handful of very popular openings in training games.

Flyboy Connor writes on slashdot "The premise of a Bayesian filter is that is learns sequences of words, or characters, or whatever. Spam-chess learns sequences of moves. This premise is wrong, since good moves are related to complete board positions, not to what was done in the previous few moves. Of course, the longer your string of moves is, the better it will represent the board position, especially during the opening phase of the game. And the example the article provides of reasonable play of spam-chess, is actually from the game's opening, where the learned sequences indeed represent the complete game. For the middle game, however, spam chess will perform badly, always."

This is a good comment. It's true that chess requires an understanding of the board positions, and the PGN format is very limited in this respect (however, the PGN sequence is indirectly equivalent to a full board representation, since it is possible to reconstruct the board from such a sequence). However, it does not follow that this approach must always perform badly in the middle game. Chess is a combination of both strategy and tactics, and tactical thinking is confined to a small number of consecutive moves, precisely what dbacl tends to pick up. A good tactician can play well in the middle game, even if he is a bad strategist.

m50d writes on slashdot "How about applying it differently, getting it to learn to pick a move for each position? Obviously that's a little harder than a simple spam/not spam judgement, but I'd have thought you could get it to recognise that if there are 3 pawns in front of the king and you have a rook available you can do a back rank mate, etc."

This can be done by using an appropriate choice of representation. The PGN format is not the only possible format for representing chess. The FEN format represents the full board, and a hybrid representation could include any features of interest. One could represent each game as a sequence of FEN positions. dbacl has a limit on the length of words which makes using straight FEN impractical, but the positions could just as well be compressed by using a hash function.

barawn writes on slashdot "I think the main limitation - not being able to understand values of exchanges - is probably the biggest problem. It's also the easiest to fix, as you can just write a program to add the piece that's being taken (i.e. instead of Bxc4, you'd have BxBc4). The relative value of each piece can be determined just from the number of times an exchange happens for winners."

Nice idea. Does anyone want to try?

aridg writes on slashdot "Reading this article, I was reminded of the old children's story about "stone soup". You remember that one -- someone advertises that he can make soup from a stone, and various others gather around to watch this amazing feat. Well, the soup needs a little extra seasoning, so he gets someone to put in some carrots while the stone cooks, then he adds some onions, etc, etc... I think you can see where this is going. Sure you can make a chess playing program from a spam filter. You just need to throw in a legal move generator, and a game database, and some capture heuristics, and position displayer, etc, etc..."

This is an interesting criticism, but is problematic on inspection. What does it take to play chess? Since a game is defined as a sequence of legal moves, there is nothing optional about a legal move generator. Imagine if two people are playing chess, and one tries an illegal move. The opponent will point out the mistake and refuse to allow it. The first person will try again until a legal move is found. Statistically, dbacl could learn to distinguish legal from illegal moves in any one board position by observing enough training games, ie the illegal moves can be learned to have arbitrarily small probabilities. However, in a real game the opponent won't allow illegal moves, so dbacl would continue to generate moves until it obtains a legal move. Mathematically, this is equivalent to using a move generator like SAN, but using SAN is faster. Similar comments apply to the other criticisms.

lawrenqj writes on slashdot "Well actually Bayesian filters aught to be able to discard inserted "noise". I'm not sure how the package the article pointed out works, but usually the attempt at pattern recognition accounts for either noise or randomization and finds appropriate matches despite small changes. So a bad move on the human's part should be ignored by the filter. I'm not sure it would be able to take advantage of the situation though."

This is correct. dbacl builds a statistical model from the training games. The model handles noise as appropriate via the rules of probability and the model assumptions. In other words, when a sequence of moves is analysed, it is decomposed into known subsequences and unknown subsequences, which are combined through a Bayesian weighting mechanism which depends on the model. In this way, all relevant training sequences, even if they only overlap partially, are used to predict the scores of a game.

blacksky writes on slashdot "Someone alluded to the Wargames movie/book. Which begs the question: would you see an improvement if you set the bayesian filter against itself, and fed the resulting games back into its knowledge base? Would favouring the shorter games in this feedback loop improve it further?"

This could be an interesting experiment. The chess engine presented in the essay is incomplete, it only plays Black, but with some work it can be completed. I don't know if playing against itself is a good idea. It might help to extract the likely moves, but it might also cause degeneration similar to incest.

Chuckstar writes on slashdot "What if you ignore the 'x' altogether. Specifically, delete all the 'x's before running anything through dbacl. Put back the 'x' where necessary in returning the move to the chess program. That way Nxd5 = Nd5 The idea being that whether or not you make a specific move is not always dependent on whether you make a capture. Sometimes you just want the piece on that spot on the board. The program currently treats those two instances (moving a piece for a to b, and moving a piece from a while capturing the piece at b) as different moves, so that the presence of a piece at b alters the outcome of the decision process."

This is an idea worth trying. However, if dbacl never sees an 'x' in the training games, then it will assign any move containing an 'x' during play a low probability, identical for all capturing moves. This would make it even more reluctant to capture pieces naturally, and give no way of choosing which pieces should be captured. A simple way to make things work correctly would be to remove all the 'x' from the training games and train on both the old games containing 'x', and the same games where the 'x' is missing.

Eric Towers writes in an email "[I] wondered if dbacl would play better if instead of learning multi-move sequences, it learned {board state, next move} pairs."

It's possible. I only tried the simplest things in the essay, but that approach is very promising. You don't actually have to represent the full board state, for example you might also represent a slightly higher level state which tells things like the number and values of important pieces etc.

John Kipling Lewis writes in an email "Also, as end games are probably going to be a bit of a bother, it would be nice to select a sub-section of possible moves when in the middle game and then compare their LAST 7 moves as an additional modifier."

While I didn't do it in the writeup, it is certainly possible to generate more than a single move ahead and apply the same scoring method. In principle, up to 7 moves could be generated, although the exponential branching will always pose a practical problem just as in real chess engines. It's an interesting question however because it isn't obvious I think if this might help or not. It might help because it's a form of educated guessing where the opponent's moves are filled in from experience with a large collection of games, but it might not help because it would amount to wishful thinking, that the opponent behaves like in the training games. In the best case, it would amount to an effective doubling of the sequence length from 7 to about 14, since the calculations would involve all the overlapping 7-move (or less) sequences straddling the current move.

dbacl-1.14.1/doc/toy.risk000066400000000000000000000002101325773323600151210ustar00rootroot00000000000000categories { one, two, three } prior { 2, 1, 1 } loss_matrix { "" one [ 0, 1, 2 ] "" two [ 3, 0, 5 ] "" three [ 1, 1, 0 ] } dbacl-1.14.1/doc/tutorial.html000066400000000000000000001055331325773323600161630ustar00rootroot00000000000000 Language models, classification and dbacl

Language models, classification and dbacl

Laird A. Breyer

Introduction

This is a non-mathematical tutorial on how to use the dbacl Bayesian text classifier. The mathematical details can be read here. This tutorial was revised for dbacl 1.11. As dbacl evolves, some statements below may become inaccurate, but reasonable effort is made to keep the tutorial synchronized.

dbacl is a UNIX command line tool, so you will need to work at the shell prompt (here written %, even though we use bash semantics). The program comes with five sample text documents and a few scripts. Look for them in the same directory as this tutorial, or you can use any other plain text documents instead. Make sure the sample documents you will use are in the current working directory. You need all *.txt, *.pl and *.risk files.

The tutorial below is geared towards generic text classification. If you intend to use dbacl for email classification, please read this.

For the impatient

dbacl has two major modes of operation. The first is learning mode, where one or more text documents are analysed to find out what make them look the way they do. At the shell prompt, type (without the leading %)

% dbacl -l one sample1.txt
% dbacl -l two sample2.txt

This creates two files named one and two, which contain the important features of each sample document.

The second major mode is classification mode. Let's say that you want to see if sample3.txt is closer to sample1.txt or sample2.txt; type

% dbacl -c one -c two sample3.txt -v
one

and dbacl should tell you it thinks sample3.txt is less like two (which is the category learned from sample2.txt) and more like one (which is the category learned from sample1.txt). That's it.

Tips

Besides giving the best category (note: best means best among available choices only), dbacl can measure how sure it is of being right. Try this:

% dbacl -c one -c two sample3.txt -U
one # 100%
In this case dbacl is very sure. If the percentage was zero, then it would mean that there is another equally likely category. Try this:
% dbacl -c one -c two -c one sample3.txt -U
one # 0%
Obviously we've repeated the category one but dbacl treats them separately. dbacl can also print other measures of certainty besides the -U switch, but they take longer to explain.

You can create as many categories as you want, one, two, three, good, bad, important, jokes, but remember that each one must be learned from a representative collection of plain text documents.

dbacl is designed to be easy to use within a script, so you can make it part of your own projects, perhaps a spam detection script, or an agent which automatically downloads the latest newspaper articles on your favourite topic...

Tip: The category files are created in the current directory, or whichever path you indicate. If you want, you can keep all your category files in a single common directory. For example, if you use the bash shell, type

% mkdir $HOME/.dbacl
% echo "DBACL_PATH=$HOME/.dbacl" >> $HOME/.bashrc
% source $HOME/.bashrc
From now on, all your categories will be kept in $HOME/.dbacl, and searched for there.

Language models

dbacl works by scanning the text it learns for features, which can be nearly anything you like. For example, unless you tell it otherwise, the standard features are all alphabetic single words in the document. dbacl builds a statistical model, ie a probability distribution, based only on those features, so anything that is not a feature will be ignored both during learning, and during classification.

This dependence on features is a double edged sword, because it helps dbacl focus on the things that matter (single alphabetic words by default), but if something else matters more then it is ignored if you don't tell dbacl it's a feature. This is the hard part, and it's up to you.

When telling dbacl what kind of features to look out for, you must use the language of regular expressions. For example, if you think the only interesting features for category one are words which contain the letter 'q', then you would type

% dbacl -l justq -g '^([a-zA-Z]*q[a-zA-Z]*)' \
  -g '[^a-zA-Z]([a-zA-Z]*q[a-zA-Z]*)' sample2.txt

The rule is that dbacl always takes as a feature whatever it finds within round brackets. Reading this can be painful if you don't know regular expressions, however.

In English, the first expression after the -g option above reads: take as a feature any string which looks like: "start of the line" (written ^) followed by "zero or more characters within the range a-z or A-Z" (written [a-zA-Z]*), followed by "the character q" (written q), followed by "zero or more characters within the range a-z or A-Z" (written [a-zA-Z]*). The second expression is nearly identical: "a single character which is not in the range a-zA-Z" (written [^a-zA-Z]), followed by "zero or more characters within the range a-z or A-Z" (can you guess?), followed by "the character q", followed by "zero or more characters within the range a-z or A-Z". The single quote marks are used to keep the whole expression together.

A regular expression is a simultaneous superposition of many text strings. Just like a word, you read and write it one character at a time.

$COUNT$1$VERDICT$FROM$FULLSCORES
Symbol What it means
. any character except newline
* zero or more copies of preceding character or parenthesized expression
+ one or more copies of preceding character or parenthesized expression
? zero or one copies of preceding character or parenthesized expression
^ beginning of line
$ end of line
a|b a or b
[abc] one character equal to a, b or c
[^abc] one character not equal to a, b or c
\*, \?, or \. the actual character *, ? or .

To get a feel for the kinds of features taken into account by dbacl in the example above, you can use the -D option. Retype the above in the slightly changed form

% dbacl -l justq -g '^([a-zA-Z]*q[a-zA-Z]*)' \
 -g '[^a-zA-Z]([a-zA-Z]*q[a-zA-Z]*)' sample2.txt -D | grep match
match d191e93e []acquired[](1) 1
match 8c56f142 []inquire[](1) 1
match 7a2ccda2 []inquiry[](1) 1
match 38f595f3 []consequently[](1) 1
match a52053f2 []questions[](1) 1
match 78a0e302 []question[](1) 1

This command lists the first few matches, one per line, which exist in the sample1.txt document. Obviously, only taking into account features which consist of words with the letter 'q' in them makes a poor model. However, when you are trying out regular expressions, you can compare this output with the contents of the document to see if your expression misses out on words or reads too many.

Sometimes, it's convenient to use parentheses which you want to throw away. dbacl understands the special notation ||xyz which you can place at the end of a regular expression, where x, y, z should be digits corresponding to the parentheses you want to keep. Here is an example for mixed Japanese and English documents, which matches alphabetic words and single ideograms:

% LANG=ja_JP dbacl -D -l konichiwa japanese.txt -i \
 -g '(^|[^a-zA-Z0-9])([a-zA-Z0-9]+|[[:alpha:]])||2'

Note that you need a multilingual terminal and Japanese fonts to view this, and your computer must have a Japanese locale available.

In the table below, you will find a list of some simple regular expressions to get you started:

If you want to match... Then you need this expression... Examples
alphabetic words (^|[^[:alpha:]]) ([[:alpha:]]+) ||2 hello, kitty
words in capitals (^|[^[A-Z]]) ([A-Z]+) ||2 MAKE, MONEY, FAST
strings of characters separated by spaces (^|[ ]) ([^ ]+) ||2 w$%&tf9(, amazing!, :-)
time of day (^|[^0-9]) ([0-9?[0-9]:[0-9][0-9](am|pm)) ||2 9:17am, 12:30pm
words which end in a number (^|[^a-zA-Z0-9]) ([a-zA-Z]+[0-9]+) [^a-zA-Z] ||2 borg17234, A1
alphanumeric word pairs (^|[^[:alnum:]]) ([[:alnum:]]+) [^[:alnum:]]+ ([[:alnum:]]+) ||23 good morning, how are

The last entry in the table above shows how to take word pairs as features. Such models are called bigram models, as opposed to the unigram models whose features are only single words, and they are used to capture extra information.

For example, in a unigram model the pair of words "well done" and "done well" have the same probability. A bigram model can learn that "well done" is more common in food related documents (provided this combination of words was actually found within the learning corpus).

However, there is a big statistical problem: because there exist many more meaningful bigrams than unigrams, you'll need a much bigger corpus to obtain meaningful statistics. One way around this is a technique called smoothing, which predicts unseen bigrams from already seen unigrams. To obtain such a combined unigram/bigram alphabetic word model, type

% dbacl -l smooth -g '(^|[^a-zA-Z])([a-zA-Z]+)||2' \
 -g '(^|[^a-zA-Z])([a-zA-Z]+)[^a-zA-Z]+([a-zA-Z]+)||23' sample1.txt

If all you want are alphabetic bigrams, trigrams, etc, there is a special switch -w you can use. The command

% dbacl -l slick -w 2 sample1.txt

produces a model slick which is nearly identical to smooth (the difference is that a regular expression cannot straddle newlines, but -w ngrams can). Let's look at the first few features: type

% dbacl -l slick -w 2 sample1.txt -D | grep match | head -10
match 818ad280 []tom[](1) 1
match 5d20c0e2 []tom[]no[](1) 2
match 3db5da99 []no[](1) 1
match 4a18ad66 []no[]answer[](1) 2
match eea4a1c4 []answer[](1) 1
match 95392743 []answer[]tom[](1) 2
match 61cc1403 []answer[]what[](1) 2
match 8c953ec2 []what[](1) 1
match 4291d86e []what[]s[](1) 2
match b09aa375 []s[](1) 1
You can see both pairs and single words, all lower case because dbacl converts everything to lower case unless you tell it otherwise. This saves a little on memory. But what did the original document look like?
% head -10 sample1.txt 
"TOM!"

No answer.

"TOM!"

No answer.

"What's gone with that boy,  I wonder? You TOM!"

Now you see how the pairs are formed. But wait, the pair of words ("TOM!", No) occurs twice in the text, but only once in the list of matches? Did we miss one? No, look again at the line
match 5d20c0e2 []tom[]no[](1) 2
and you will see that the last value is '2', since we've seen it twice. dbacl uses the frequencies of features to build its model.

Obviously, all this typing is getting tedious, and you will eventually want to automate the learning stage in a shell script. Use regular expressions sparingly, as they can quickly degrade the performance (speed and memory) of dbacl. See Appendix A for ways around this.

Evaluating the models

Now that you have a grasp of the variety of language models which dbacl can generate, the important question is what set of features should you use?

There is no easy answer to this problem. Intuitively, a larger set of features seems always preferable, since it takes more information into account. However, there is a tradeoff. Comparing more features requires extra memory, but much more importantly, too many features can overfit the data. This results in a model which is so good at predicting the learned documents, that virtually no other documents are considered even remotely similar.

It is beyond the scope of this tutorial to describe the variety of statistical methods which can help decide what features are meaningful. However, to get a rough idea of the quality of the model, we can look at the cross entropy reported by dbacl.

The cross entropy is measured in bits and has the following meaning: If we use our probabilistic model to construct an optimal compression algorithm, then the cross entropy of a text string is the predicted number of bits which is needed on average, after compression, for each separate feature. This rough description isn't complete, since the cross entropy doesn't measure the amount of space also needed for the probability model itself, and moreover what we mean by compression is the act of compressing the features, not the full document, which also contains punctuation and white space which is ignored.

To compute the cross entropy of category one, type

% dbacl -c one sample1.txt -vn
one  7.42 * 678.0

The cross entropy is the first value (7.42) returned. The second value essentially measures how many features describe the document. Now suppose we try other models trained on the same document:

% dbacl -c slick sample1.txt -vn
slick  4.68 * 677.5
% dbacl -c smooth sample1.txt -vn
smooth  6.03 * 640.5

The first thing to nota is that the complexity terms are not the same. The slick category is based on word pairs (also called bigrams), of which tere are 677 in this document. But there are 678 words, and the fractional value indicates that the last word only counts for half a feature. The smooth category also depends on word pairs, but unlike slick, pairs cannot be counted if they straddle a newline (this is a limitation of line-oriented regular expressions). So in smooth, there are several missing word pairs, and various single words which count as a fractional pair, giving a grand total of 640.5.

The second thing to note is that both bigram models fit sample1.txt better. This is easy to see for slick, since the complexity (essentially the number of features) is nearly the same as for one, so the comparison reduces to seeing which cross entropy is lowest. Let's ask dbacl which category fits better:

% dbacl -c one -c slick sample1.txt -v
slick

You can do the same thing to compare one and smooth. Let's ask dbacl which category fits better overall:

% dbacl -c one -c slick -c smooth sample1.txt -v
slick

We already know that slick is better than one, but why is slick better than smooth? While slick looks at more features than smooth (677.5 versus 640.5), it needs just 4.68 bits of information per feature to represent the sample1.txt document, while smooth needs 6.03 bits on average. So slick wins based on economies of scale.

WARNING: it is not always appropriate to classify documents whose models look at different feature set like we did above. The underlying statistical basis for these comparisons is the likelihood, but it is easy to compare "apples and oranges" incorrectly. It is safest if you learn and classify documents by using exactly the same command line switches for every category.

Decision Theory

If you've read this far, then you probably intend to use dbacl to automatically classify text documents, and possibly execute certain actions depending on the outcome. The bad news is that dbacl isn't designed for this. The good news is that there is a companion program, bayesol, which is. To use it, you just need to learn some Bayesian Decision Theory.

We'll suppose that the document sample4.txt must be classified in one of the categories one, two and three. To make optimal decisions, you'll need three ingredients: a prior distribution, a set of conditional probabilities and a measure of risk. We'll get to these in turn.

The prior distribution is a set of weights, which you must choose yourself, representing your beforehand beliefs. You choose this before you even look at sample4.txt. For example, you might know from experience that category one is twice as likely as two and three. The prior distribution is a set of weights you choose to reflect your beliefs, e.g. one:2, two:1, three:1. If you have no idea what to choose, give each an equal weight (one:1, two:1, three:1).

Next, we need conditional probabilities. This is what dbacl is for. Type

% dbacl -l three sample3.txt
% dbacl -c one -c two -c three sample4.txt -N
one  0.00% two 100.00% three  0.00%

As you can see, dbacl is 100% sure that sample4.txt resembles category two. Such accurate answers are typical with the kinds of models used by dbacl. In reality, the probabilities for one and three are very, very small and the probability for two is really close, but not equal to 1. See Appendix B for a rough explanation.

We combine the prior (which represents your own beliefs and experiences) with the conditionals (which represent what dbacl thinks about sample4.txt) to obtain a set of posterior probabilities. In our example,

  • Posterior probability that sample4.txt resembles one: 0%*2/(2+1+1) = 0%
  • Posterior probability that sample4.txt resembles two: 100%*1/(2+1+1) = 100%
  • Posterior probability that sample4.txt resembles three: 0%*1/(2+1+1) = 0%
Okay, so here the prior doesn't have much of an effect. But it's there if you need it.

Now comes the tedious part. What you really want to do is take these posterior distributions under advisement, and make an informed decision.

To decide which category best suits your own plans, you need to work out the costs of misclassifications. Only you can decide these numbers, and there are many. But at the end, you've worked out your risk. Here's an example:

  • If sample4.txt is like one but it ends up marked like one, then the cost is 0
  • If sample4.txt is like one but it ends up marked like two, then the cost is 1
  • If sample4.txt is like one but it ends up marked like three, then the cost is 2
  • If sample4.txt is like two but it ends up marked like one, then the cost is 3
  • If sample4.txt is like two but it ends up marked like two, then the cost is 0
  • If sample4.txt is like two but it ends up marked like three, then the cost is 5
  • If sample4.txt is like three but it ends up marked like one, then the cost is 1
  • If sample4.txt is like three but it ends up marked like two, then the cost is 1
  • If sample4.txt is like three but it ends up marked like three, then the cost is 0
These numbers are often placed in a table called the loss matrix (this way, you can't forget a case), like so:

correct category misclassified as
one two three
one 0 1 2
two 3 0 5
three 1 1 0

We are now ready to combine all these numbers to obtain the True Bayesian Decision. For every possible category, we simply weigh the risk with the posterior probabilities of obtaining each of the possible misclassifications. Then we choose the category with least expected posterior risk.

  • For category one, the expected risk is 0*0% + 3*1000% + 1*0% = 3
  • For category two, the expected risk is 1*0% + 0*100% + 1*0% = 0 <-- smallest
  • For category three, the expected risk is 2*0% + 5*100% + 0*0% = 5

The lowest expected risk is for caterogy two, so that's the category we choose to represent sample4.txt. Done!

Of course, the loss matrix above doesn't really have an effect on the probability calculations, because the conditional probabilities strongly point to category two anyway. But now you understand how the calculation works. Below, we'll look at a more realistic example (but still specially chosen to illustrate some points).

One last point: you may wonder how dbacl itself decides which category to display when classifying with the -v switch. The simple answer is that dbacl always displays the category with maximal conditional probability (often called the MAP estimate). This is mathematically completely equivalent to the special case of decision theory when the prior has equal weights, and the loss matrix takes the value 1 everywhere, except on the diagonal (ie correct classifications have no cost, everything else costs 1).

Using bayesol

bayesol is a companion program for dbacl which makes the decision calculations easier. The bad news is that you still have to write down a prior and loss matrix yourself. Eventually, someone, somewhere may write a graphical interface. The good news is that for most classification tasks, you don't need to bother with bayesol at all, and can skip this section. Really.

bayesol reads a risk specification file, which is a text file containing information about the categories required, the prior distribution and the cost of misclassifications. For the toy example discussed earlier, the file toy.risk looks like this:

categories {
    one, two, three
}
prior {
    2, 1, 1
}
loss_matrix {
"" one   [ 0, 1, 2 ]
"" two   [ 3, 0, 5 ]
"" three [ 1, 1, 0 ]
}

Let's see if our hand calculation was correct:

% dbacl -c one -c two -c three sample4.txt -vna | bayesol -c toy.risk -v
two

Good! However, as discussed above, the misclassification costs need improvement. This is completely up to you, but here are some possible suggestions to get you started.

To devise effective loss matrices, it pays to think about the way that dbacl computes the probabilities. Appendix B gives some details, but we don't need to go that far. Recall that the language models are based on features (which are usually kinds of words). Every feature counts towards the final probabilities, and a big document will have more features, hence more opportunities to steer the probabilities one way or another. So a feature is like an information bearing unit of text.

When we read a text document which doesn't accord with our expectations, we grow progressively more annoyed as we read further into the text. This is like an annoyance interest rate which compounds on information units within the text. For dbacl, the number of information bearing units is reported as the complexity of the text. This suggests that the cost of reading a misclassified document could have the form (1 + interest)^complexity. Here's an example loss matrix which uses this idea

loss_matrix { 
"" one   [ 0,               (1.1)^complexity,  (1.1)^complexity ]
"" two   [(1.1)^complexity, 0,                 (1.7)^complexity ] 
"" three [(1.5)^complexity, (1.01)^complexity, 0 ]
} 

Remember, these aren't monetary interest rates, they are value judgements. You can see this loss matrix in action by typing

% dbacl -c one -c two -c three sample5.txt -vna | bayesol -c example1.risk -v
three

Now if we increase the cost of misclassifying two as three from 1.7 to 2.0, the optimal category becomes

% dbacl -c one -c two -c three sample5.txt -vna | bayesol -c example2.risk -v
two

bayesol can also handle infinite costs. Just write "inf" where you need it. This is particularly useful with regular expressions. If you look at each row of loss_matrix above, you see an empty string "" before each category. This indicates that this row is to be used by default in the actual loss matrix. But sometimes, the losses can depend on seeing a particular string in the document we want to classify.

Suppose you normally like to use the loss matrix above, but in case the document contains the word "Polly", then the cost of misclassification is infinite. Here is an updated loss_matrix:

loss_matrix { 
""          one   [ 0,               (1.1)^complexity,  (1.1)^complexity ]
"Polly"     two   [ inf,             0,                 inf ]
""          two   [(1.1)^complexity, 0,                 (2.0)^complexity ] 
""          three [(1.5)^complexity, (1.01)^complexity, 0 ]
}

bayesol looks in its input for the regular expression "Polly", and if it is found, then for misclassifications away from two, it uses the row with the infinite values, otherwise it uses the default row, which starts with "". If you have several rows with regular expressions for each category, bayesol always uses the first one from the top which matches within the input. You must always have at least a default row for every category.

The regular expression facility can also be used to perform more complicated document dependent loss calculations. Suppose you like to count the number of lines of the input document which start with the character '>', as a proportion of the total number of lines in the document. The following perl script transcribes its input and appends the calculated proportion.

#!/usr/bin/perl 
# this is file prop.pl

$special = $normal = 0; 
while(<SDTIN>) {
    $special++ if /^ >/; 
    $normal++; 
    print; 
} 
$prop = $special/$normal; 
print "proportion: $prop\n"; 

If we used this script, then we could take the output of dbacl, append the proportion of lines containing '>', and pass the result as input to bayesol. For example, the following line is included in the example3.risk specification

"^proportion: ([0-9.]+)" one [ 0, (1+$1)^complexity, (1.2)^complexity ]

and through this, bayesol reads, if present, the line containing the proportion we calculated and takes this into account when it constructs the loss matrix. You can try this like so:

% dbacl -T email -c one -c two -c three sample6.txt -nav \
  | perl prop.pl | bayesol -c example3.risk -v

Note that in the loss_matrix specification above, $1 refers to the numerical value of the quantity inside the parentheses. Also, it is useful to remember that when using the -a switch, dbacl outputs all the original lines from unknown.txt with an extra space in front of them. If another instance of dbacl needs to read this output again (e.g. in a pipeline), then the latter should be invoked with the -A switch.

Miscellaneous

Be careful when classifying very small strings. Except for the multinomial models (which includes the default model), the dbacl calculations are optimized for large strings with more than 20 or 30 features. For small text lines, the complex models give only approximate scores. In those cases, stick with unigram models, which are always exact.

In the UNIX philosophy, programs are small and do one thing well. Following this philosophy, dbacl essentially only reads plain text documents. If you have non-textual documents (word, html, postscript) which you want to learn from, you will need to use specialized tools to first convert these into plain text. There are many free tools available for this.

dbacl has limited support for reading mbox files (UNIX email) and can filter out html tags in a quick and dirty way, however this is only intended as a convenience, and should not be relied upon to be fully accurate.

Appendix A: memory requirements

When experimenting with complicated models, dbacl will quickly fill up its hash tables. dbacl is designed to use a predictable amount of memory (to prevent nasty surprises on some systems). The default hash table size in version 1.1 is 15, which is enough for 32,000 unique features and produces a 512K category file on my system. You can use the -h switch to select hash table size, in powers of two. Beware that learning takes much more memory than classifying. Use the -V switch to find out the cost per feature. On my system, each feature costs 6 bytes for classifying but 17 bytes for learning.

For testing, I use the collected works of Mark Twain, which is a 19MB pure text file. Timings are on a 500Mhz Pentium III.

command Unique features Category size Learning time
dbacl -l twain1 Twain-Collected_Works.txt -w 1 -h 16 49,251 512K 0m9.240s
dbacl -l twain2 Twain-Collected_Works.txt -w 2 -h 20 909,400 6.1M 1m1.100s
dbacl -l twain3 Twain-Collected_Works.txt -w 3 -h 22 3,151,718 24M 3m42.240s

As can be seen from this table, including bigrams and trigrams has a noticeable memory and performance effect during learning. Luckily, classification speed is only affected by the number of features found in the unknown document.

command features Classification time
dbacl -c twain1 Twain-Collected_Works.txt unigrams 0m4.860s
dbacl -c twain2 Twain-Collected_Works.txt unigrams and bigrams 0m8.930s
dbacl -c twain3 Twain-Collected_Works.txt unigrams, bigrams and trigrams 0m12.750s

The heavy memory requirements during learning of complicated models can be reduced at the expense of the model itself. dbacl has a feature decimation switch which slows down the hash table filling rate by simply ignoring many of the features found in the input.

Appendix B: Extreme probabilities

Why is the result of a dbacl probability calculation always so accurate?

% dbacl -c one -c two -c three sample4.txt -N
one 0.00% two  100.00% three  0.00%

The reason for this has to do with the type of model which dbacl uses. Let's look at some scores:

% dbacl -c one -c two -c three sample4.txt -n
one 13549.34 two 8220.22 three 13476.84 
% dbacl -c one -c two -c three sample4.txt -nv
one 26.11 * 519.0 two 15.84 * 519.0 three 25.97 * 519.0

The first set of numbers are minus the logarithm (base 2) of each category's probability of producing the full document sample4.txt. This represents the evidence away from each category, and is measured in bits. one and three are fairly even, but two has by far the lowest score and hence highest probability (in other words, the model for two is the least bad at predicting sample4.txt, so if there are only three possible choices, it's the best). To understand these numbers, it's best to split each of them up into a product of cross entropy and complexity, as is done in the second line.

Remember that dbacl calculates probabilities about resemblance by weighing the evidence for all the features found in the input document. There are 519 features in sample4.txt, and each feature contributes on average 26.11 bits of evidence against category one, 15.84 bits against category two and 25.97 bits against category three. Let's look at what happens if we only look at the first 25 lines of sample4.txt:

% head -25 sample4.txt | dbacl -c one -c two -c three -nv
one 20.15 * 324.0 two 15.18 * 324.0 three 20.14 * 324.0

There are fewer features in the first 25 lines of sample4.txt than in the full text file, but the picture is substantially unchanged.

% head -25 sample4.txt | dbacl -c one -c two -c three -N
one  0.00% two 100.00% three  0.00%

dbacl is still very sure, because it has looked at many features (324) and found small differences which add up to quite different scores. However, you can see that each feature now contributes less information (20.15, 15.18, 20.14) bits compared to the earlier (26.11, 15.84, 25.97).

Since category two is obviously the best (closest to zero) choice among the three models, let's drop it for a moment and consider the other two categories. We also reduce dramatically the number of features (words) we shall look at. The first line of sample4.txt has 15 words:

% head -1 sample4.txt | dbacl -c one -c three -N
one 25.65% three 74.35%
Finally, we are getting probabilities we can understand! Unfortunately, this is somewhat misleading. Each of the 15 words gave a score and these scores were added for each category. Since both categories here are about equally bad at predicting words in sample4.txt, the difference in the final scores for category one and three amounts to less than 3 bits of information, which is why the probabilities are mixed:
% head -1 sample4.txt | dbacl -c one -c three -nv
one 16.61 * 15.0 three 16.51 * 15.0

So the interpretation of the probabilities is clear. dbacl weighs the evidence from each feature it finds, and reports the best fit among the choices it is offered. Because it sees so many features separately (hundreds usually), it believes its verdict is very sure. Wouldn't you be after hundreds of checks? Of course, whether these features are independent, and are the right features to look at for best classification is another matter entirely, and it's entirely up to you to decide. dbacl can't do much about its inbuilt assumptions.

Last but not least, the probabilities above are not the same as the confidence percentages printed by the -U switch. The -U switch was developed to overcome the limitations above, by looking at dbacl's calculations from a higher level, but this is a topic for another time. dbacl-1.14.1/man/000077500000000000000000000000001325773323600134315ustar00rootroot00000000000000dbacl-1.14.1/man/Makefile.am000066400000000000000000000007351325773323600154720ustar00rootroot00000000000000SUFFIXES = .1 .1in datarootdir ?= $(prefix)/share man_MANS = dbacl.1 bayesol.1 mailcross.1 mailinspect.1 mailtoe.1 mailfoot.1 hmine.1 hypex.1 EXTRA_DIST = dbacl.1in bayesol.1in mailcross.1in mailinspect.1in mailfoot.1in mailtoe.1in hmine.1in hypex.1in spherecl.1in .1in.1: cat $< \ | sed -e "s|[@]VERSION@|$(VERSION)|g" \ | sed -e "s|[@]PKGDATADIR@|$(pkgdatadir)|g" \ > $@ CLEANFILES = dbacl.1 bayesol.1 mailcross.1 mailinspect.1 mailtoe.1 mailfoot.1 hmine.1 hypex.1 dbacl-1.14.1/man/Makefile.in000066400000000000000000000337701325773323600155100ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = man DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUFFIXES = .1 .1in man_MANS = dbacl.1 bayesol.1 mailcross.1 mailinspect.1 mailtoe.1 mailfoot.1 hmine.1 hypex.1 EXTRA_DIST = dbacl.1in bayesol.1in mailcross.1in mailinspect.1in mailfoot.1in mailtoe.1in hmine.1in hypex.1in spherecl.1in CLEANFILES = dbacl.1 bayesol.1 mailcross.1 mailinspect.1 mailtoe.1 mailfoot.1 hmine.1 hypex.1 all: all-am .SUFFIXES: .SUFFIXES: .1 .1in $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 datarootdir ?= $(prefix)/share .1in.1: cat $< \ | sed -e "s|[@]VERSION@|$(VERSION)|g" \ | sed -e "s|[@]PKGDATADIR@|$(pkgdatadir)|g" \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/man/bayesol.1in000066400000000000000000000113721325773323600155040ustar00rootroot00000000000000\" t .TH BAYESOL 1 "Bayesian Classification Tools" "Version @VERSION@" "" .SH NAME bayesol \- a Bayes solution calculator for use with dbacl. .SH SYNOPSIS .HP .B bayesol [-DVNniv] -c .I riskspec [FILE]... .HP .B bayesol -V .SH DESCRIPTION .PP .B bayesol is a Bayes solution calculator designed to combine the output of .BR dbacl (1) with a prior distribution and a risk specification, and calculate the optimal Bayesian decision (which minimizes the posterior risk). .PP The risk specification is read from the text file .I riskspec and must be written in a simple format described below. The .BR dbacl (1) output can either be read from FILE or from STDIN. .SH EXIT STATUS On success, .B bayesol returns a positive integer corresponding to the category with the lowest risk. In case of a problem, .B bayesol returns zero. .SH OPTIONS .IP -c Classify using .IR riskspec . See the section RISK SPECIFICATION. .IP -i Fully internationalized mode. Forces the use of wide characters internally, which is necessary in some locales. This incurs a noticeable performance penalty. .IP -n Print risk scores for each .IR category . Each score is (approximately) the logarithm of the expected risk under that category. The lowest score (ie closest to -infinity) is best, etc. .IP -N Print recursive risk scores for each .IR category . Each score is (approximately) the logarithm of the best score based on the remaining categories, after the previously best scoring categories have been removed, and a normalizing factor was added. A full description is given in the technical report listed at the end of this manpange. The largest score (ie closest to +infinity) is best, etc. .IP -v Verbose mode. Prints to STDOUT the category with minimum posterior risk. In case several categories are possible, prints the first category in the order in which they appear in the categories section of .IR riskpspec . .IP -D Print debug output. Do not use. .IP -V Print the program version number and exit. .SH RISK SPECIFICATION .B bayesol needs to read a text file .I riskspec containing a risk specification. The format of this text file is as follows .IP .na categories { .IR cat1 , .IR cat2 , "" ..., .IR catN } .br prior { .IR p1 , .IR p2 , "" ..., .IR pN } .br loss_matrix { .br "\fIregex1\fR" \fIc1\fR [ .IR formula11 , .IR formula12 , "" ..., .IR formula1N ] .br "\fIregex2\fR" \fIc2\fR [ .IR formula21 , .IR formula22 , "" ..., .IR formula2N ] .br . .br . .br "\fIregexM\fR" \fIcM\fR [ .IR formulaM1 , .IR formulaM2 , "" ..., .IR formulaMN ] .br } .br .ad .PP In the above, .IR cat1 , .IR cat2 , "" ..., .IR catN , are category names, .IR p1 , .IR p2 , "" ..., .IR pN , are non-negative numbers, .IR regex1 , .IR regex2 , "" ..., .IR regexM , are (possibly empty) regular expression strings, .IR c1 , .IR c2 , "" ..., .IR cM , are instances of the category names .IR cat1 , .IR cat2 , "" ..., .IR catN , and the formulas are numbers or mathematical expressions. .PP Every category which appears in the categories section must appear at least once in the loss_matrix section, with an empty "" regular expression. To construct the actual loss matrix used in the decision calculations, .B bayesol selects, for each category appearing in the categories section, the first row whose regular expression is matched within FILE or STDIN, or the first row with empty regular expression if there are no matches. .PP Each formula can be either a single number, or an algebraic combination of the operators exp(), log(), +, -, *, /, ^ and parentheses (). The string "inf" is parsed as the value infinity. Also, the string "complexity" is recognized, and converted to the complexity for that category as reported by .BR dbacl (1). Finally, if the corresponding regular expression contains submatches delimited by parentheses, their numerical values can be used inside the formulas as the special variables $1, ..., $9. Note that submatches which aren't numerical are converted to the value zero. .PP Case is important. Spaces and newlines can be liberally inserted. Comments must start with a # and extend to the end of the line. .SH USAGE .PP Typically, .B bayesol is used together with .BR dbacl (1). An invocation looks like this: .PP .na % dbacl -c one -c two -c three sample.txt -vna | bayesol -c toy.risk -v .ad .PP See @PKGDATADIR@/doc/costs.ps for a description of the algorithm used. See also @PKGDATADIR@/doc/tutorial.html for a more detailed overview. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR dbacl (1), .BR mailcross (1), .BR mailfoot (1), .BR mailinspect (1), .BR mailtoe (1), .BR regex (7) dbacl-1.14.1/man/dbacl.1in000066400000000000000000001240221325773323600151100ustar00rootroot00000000000000\" t .TH DBACL 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME dbacl \- a digramic Bayesian classifier for text recognition. .SH SYNOPSIS .HP .B dbacl [-01dvnirmwMNDXW] [-T .IR type ] -l .I category [-h .IR size ] [-H .IR gsize ] [-x .IR decim ] [-q .IR quality ] [-w .IR max_order ] [-e .IR deftok ] [-o .IR online ] [-L .IR measure ] [-z .IR ftresh ] [-O .IR ronline ]... [-g .IR regex ]... [FILE]... .HP .B dbacl [-vnimNRXYP] [-h .IR size ] [-T .IR type] -c .I category [-c .IR category ]... [-f .IR keep ]... [FILE]... .HP .B dbacl -V .SH OVERVIEW .PP .B dbacl is a Bayesian text and email classifier. When using the .B -l switch, it learns a body of text and produce a file named .I category which summarizes the text. When using the .B -c switch, it compares an input text stream with any number of .I category files, and outputs the name of the closest match, or optionally various numerical scores explained below. .PP Whereas this manual page is intended as a reference, there are several tutorials and documents you can read to get specialized information. Specific documentation about the design of .B dbacl and the statistical models that it uses can be found in dbacl.ps. For a basic overview of text classification using .BR dbacl , see tutorial.html. A companion tutorial geared towards email filtering is email.html. If you have trouble getting dbacl to classify reliably, read is_it_working.html. The USAGE section of this manual page also has some examples. .IP @PKGDATADIR@/doc/dbacl.ps .IP @PKGDATADIR@/doc/tutorial.html .IP @PKGDATADIR@/doc/email.html .IP @PKGDATADIR@/doc/is_it_working.html .PP .B dbacl uses a maximum entropy (minimum divergence) language model constructed with respect to a digramic reference measure (unknown tokens are predicted from digrams, i.e. pairs of letters). Practically, this means that a .I category is constructed from tokens in the training set, while previously unseen tokens can be predicted automatically from their letters. A token here is either a word (fragment) or a combination of words (fragments), selected according to various switches. Learning roughly works by tweaking token probabilities until the training data is least surprising. .SH EXIT_STATUS The normal shell exit conventions aren't followed (sorry!). When using the .B -l command form, .B dbacl returns zero on success, nonzero if an error occurs. When using the .B -c form, .B dbacl returns a positive integer corresponding to the .I category with the highest posterior probability. In case of a tie, the first most probable category is chosen. If an error occurs, .B dbacl returns zero. .SH DESCRIPTION .PP When using the .B -l command form, .B dbacl learns a category when given one or more FILE names, which should contain readable .SM ASCII text. If no FILE is given, .B dbacl learns from STDIN. If FILE is a directory, it is opened and all its files are read, but not its subdirectories. The result is saved in the binary file named .IR "category" , and completely replaces any previous contents. As a convenience, if the environment variable DBACL_PATH contains a directory, then that is prepended to the file path, unless .I category starts with a '/' or a '.'. .PP The input text for learning is assumed to be unstructured plain text by default. This is not suitable for learning email, because email contains various transport encodings and formatting instructions which can reduce classification effectiveness. You must use the .B -T switch in that case so that .B dbacl knows it should perform decoding and filtering of MIME and HTML as appropriate. Apropriate switch values are "-T email" for RFC2822 email input, "-T html" for HTML input, "-T xml" for generic XML style input and "-T text" is the default plain text format. There are other values of the .B -T switch that also allow fine tuning of the decoding capabilities. .PP When using the .B -c command form, .B dbacl attempts to classify the text found in FILE, or STDIN if no FILE is given. Each possible .I category must be given separately, and should be the file name of a previously learned text corpus. As a convenience, if the variable DBACL_PATH contains a directory, it is prepended to each file path which doesn't start with a '/' or a '.'. The visible output of the classification depends on the combination of extra switches used. If no switch is used, then no output is shown on STDOUT. However, .B dbacl always produces an exit code which can be tested. .PP To see an output for a classification, you must use at least one of the .BR -v , -U , -n , -N , -D , -d switches. Sometimes, they can be used in combination to produce a natural variation of their individual outputs. Sometimes, .B dbacl also produces warnings on STDERR if applicable. .PP The .B -v switch outputs the name of the best category among all the choices given. .PP The .B -U switch outputs the name of the best category followed by a confidence percentage. Normally, this is the switch that you want to use. A percentage of 100% means that .B dbacl is sure of its choice, while a percentage of 0% means that some other category is equally likely. This is not the model probability, but measures how unambiguous the classification is, and can be used to tag unsure classifications (e.g. if the confidence is 25% or less). .PP The .B -N switch prints each category name followed by its (posterior) probability, expressed as a percentage. The percentages always sum to 100%. This is intuitive, but only valuable if the document being classified contains a handful of tokens (ten or less). In the common case with many more tokens, the probabilities are always extremely close to 100% and 0%. .PP The .B -n switch prints each category name followed by the negative logarithm of its probability. This is equivalent to using the .B -N switch, but much more useful. The smallest number gives the best category. A more convenient form is to use both .B -n and .B -v which prints each category name followed by the cross entropy and the number of tokens analyzed. The cross entropy measures (in bits) the average compression rate which is achievable, under the given category model, per token of input text. If you use all three of .BR -n , -v , -X then an extra value is output for each category, representing a kind of p-value for each category score. This indicates how typical the score is compared to the training documents, but only works if the .B -X switch was used during learning, and only for some types of models (e.g. email). These p-values are uniformly distributed and independent (if the categories are independent), so can be combined using Fisher's chi squared test to obtain composite p-values for groupings of categories. .PP The .B -v and .B -X switches together print each category name followed by a detailed decomposition of the category score, factored into ( divergence rate + shannon entropy rate )* token count @ p-value. Again, this only works in some types of models. .PP The .B -v and .B -U switches print each category name followed by a decomposition of the category score into ( divergence rate + shannon entropy rate # score variance )* token count. .PP The .B -D switch prints out the input text as modified internally by .B dbacl prior to tokenization. For example, if a MIME encoded email document is classified, then this prints the decoded text that will be actually tokenized and classified. This switch is mainly useful for debugging. .PP The .B -d switch dumps tokens and scores while they are being read. It is useful for debugging, or if you want to create graphical representations of the classification. A detailed explanation of the output is beyond the scope of this manual page, but is straightforward if you've read dbacl.ps. Possible variations include .B -d together with .B -n or .BR -N . .PP Classification can be done with one or several categories in principle. When two or more categories are used, the Bayesian posterior probability is used, given the input text, with a uniform prior distribution on categories. For other choices of prior, see the companion utility .BR bayesol (1). When a single category is used, classification can be done by comparing the score with a treshold. In practice however, much better results are obtained with several categories. .PP Learning and classifying cannot be mixed on the same command invocation, however there are no locking issues and separate .B dbacl processes can operate simultaneously with obvious results, because file operations are designed to be atomic. .PP Finally, note that .B dbacl does not manage your document corpora or your computed categories. In particular, .B dbacl cannot add or subtract a document from a category file directly. If you want to learn a category incrementally, the standard way is to keep adding to your document corpus, and learn the whole corpus each time. By keeping control of your archives, you can never lose the information in your categories, and you can easily experiment with different switches or tokenizations or sets of training documents if you like. .PP If the standard incremental learning method is too slow, the .B -o switch can help. This creates a data file named .IR online which contains all the document statistics that have been learned. When you use the .B -l and .B -o switches together, dbacl merges the .IR online data file (if it exists) with the new document(s) to be learned, and recreates an updated version of .IR online . This is equivalent to adding the new documents to the corpus and relearning the whole corpus, but faster. However, documents cannot be removed if you change your mind. This is a limitation of dbacl which cannot be changed for mathematical reasons. You can work around this by making backups of the .IR online data file. It is also possible to merge one or more extra .IR online data files simultaneously by using the .B -O switch one or more times. .SH SECONDARY_SWITCHES .PP By default, .B dbacl classifies the input text as a whole, ie it only outputs a single result even if you specify several input files. If you want to classify multiple input files you can either call .B dbacl repeatedly (which is fast when you use the .B -m switch), or use the .BR -F switch, which prints each input FILE followed by the result for that FILE. Alternatively, you can classify each line of the input individually, by using the .B -f option, which prints only those lines which match one or more models identified by .I keep (use the category name or number to refer to a category). This last switch is useful if you want to filter out some lines, but note that if the lines are short, then the error rate can be high. .PP The .BR -e , -w , -g , -j switches are used for selecting an appropriate tokenization scheme. A token is a word or word fragment or combination of words or fragments. The shape of tokens is important because it forms the basis of the language models used by .BR dbacl . The .B -e switch selects a predefined tokenization scheme, which is speedy but limited. The .B -w switch specifies composite tokens derived from the .B -e switch. For example, "-e alnum -w 2" means that tokens should be alphanumeric word fragments combined into overlapping pairs (bigrams). When the .B -j switch is used, all tokens are converted to lowercase, which reduces the number of possible tokens and therefore memory consumption. .PP If the .B -g switch is used, you can completely specify what the tokens should look like using a regular expression. Several .B -g switches can be used to construct complex tokenization schemes, and parentheses within each expression can be used to select fragments and combine them into n-grams. The cost of such flexibility is reduced classification and learning speed. When experimenting with tokenization schemes, try using the .B -d or .B -D switches while learning or classifying, as they will print the tokens explicitly so you can see what text fragments are picked up or missed out. For regular exression syntax, see .BR regex (7). .PP The .B -h and .B -H switches regulate how much memory .B dbacl may use for learning. Text classification can use a lot of memory, and by default .B dbacl limits itself even at the expense of learning accuracy. In many cases if a limit is reached, a warning message will be printed on STDERR with some advice. .PP When relearning the same category several times, a significant speedup can be obtained by using the .B -1 switch, as this allows the previously learned probabilities to be read from the category and reused. .PP Note that classification accuracy depends foremost on the amount and quality of the training samples, and then only on amount of tweaking. .SH EXIT STATUS When using the .B -l command form, .B dbacl returns zero on success. When using the .B -c form, .B dbacl returns a positive integer (1,2,3...) corresponding to the .I category with the highest posterior probability. In case of a tie, the first most probable category is chosen. If an error occurs, .B dbacl returns zero. .SH OPTIONS .IP -0 When learning, prevents weight preloading. Normally, .B dbacl checks if the category file already exists, and if so, tries to use the existing weights as a starting point. This can dramatically speed up learning. If the .B -0 (zero) switch is set, then .B dbacl behaves as if no category file already exists. This is mainly useful for testing. This switch is now enabled by default, to protect against weight drift which can reduce accuracy over many learning iterations. Use .B -1 to force preloading. .IP -1 Force weight preloading if the category file already exists. See discussion of the .B -0 switch. .IP -a Append scores. Every input line is written to STDOUT and the dbacl scores are appended. This is useful for postprocessing with .BR bayesol (1). For ease of processing, every original input line is indented by a single space (to distinguish them from the appended scores), and the line with the scores (if .B -n is used) is prefixed with the string "scores ". If a second copy of .B dbacl needs to read this output later, it should be invoked with the .B -A switch. .IP -d Dump the model parameters to STDOUT. In conjunction with the .B -l option, this produces a human-readable summary of the maximum entropy model. In conjunction with the .B -c option, displays the contribution of each token to the final score. Suppresses all other normal output. .IP -e Select character class for default (not regex-based) tokenization. By default, tokens are alphabetic strings only. This corresponds to the case when .I deftok is "alpha". Possible values for .I deftok are "alpha", "alnum", "graph", "char", "cef" and "adp". The last two are custom tokenizers intended for email messages. See also .BR isalpha (3). The "char" tokenizer picks up single printable characters rather than bigger tokens, and is intended for testing only. .IP -f Filter each line of input separately, passing to STDOUT only lines which match the .I category identified as .IR keep . This option should be used repeatedly for each .I category which must be kept. .I keep can be either the .I category file name, or a positive integer representing the required .I category in the same order it appears on the command line. .IP Output lines are flushed as soon as they are written. If the input file is a pipe or character device, then an attempt is made to use line buffering mode, otherwise the more efficient block buffering is used. .IP -g Learn only features described by the extended regular expression .IR regex . This overrides the default feature selection method (see .B -w option) and learns, for each line of input, only tokens constructed from the concatenation of strings which match the tagged subexpressions within the supplied .IR regex . All substrings which match .IR regex within a suffix of each input line are treated as features, even if they overlap on the input line. .IP As an optional convenience, .I regex can include the suffix .I ||xyz which indicates which parenthesized subexpressions should be tagged. In this case, .I xyz should consist exclusively of digits 1 to 9, numbering exactly those subexpressions which should be tagged. Alternatively, if no parentheses exist within .IR regex , then it is assumed that the whole expression must be captured. .IP -h Set the size of the hash table to 2^\fIsize\fP elements. When using the .B -l option, this refers to the total number of features allowed in the maximum entropy model being learned. When using the .B -c option toghether with the .B -M switch and multinomial type categories, this refers to the maximum number of features taken into account during classification. Without the .B -M switch, this option has no effect. .IP -i Fully internationalized mode. Forces the use of wide characters internally, which is necessary in some locales. This incurs a noticeable performance penalty. .IP -j Make features case sensitive. Normally, all features are converted to lower case during processing, which reduces storage requirements and improves statistical estimates for small datasets. With this option, the original capitalization is used for each feature. This can improve classification accuracy. .IP -m Aggressively maps categories into memory and locks them into RAM to prevent swapping, if possible. This is useful when speed is paramount and memory is plentiful, for example when testing the classifier on large datasets. .IP Locking may require relaxing user limits with .BR ulimit (1). Ask your system administrator. Beware when using the .B -m switch together with the .B -o switch, as only one dbacl process must learn or classify at a time to prevent file corruption. If no learning takes place, then the .B -m switch for classifying is always safe to use. See also the discussion for the .B -o switch. .IP -n Print scores for each .IR category . Each score is the product of two numbers, the cross entropy and the complexity of the input text under each model. Multiplied together, they represent the log probability that the input resembles the model. To see these numbers separately, use also the .B -v option. In conjunction with the .B -f option, stops filtering but prints each input line prepended with a list of scores for that line. .IP -q Select .I quality of learning, where .I quality can be 1,2,3,4. Higher values take longer to learn, and should be slightly more accurate. The default .I quality is 1 if the category file doesn't exist or weights cannot be preloaded, and 2 otherwise. .IP -o When learning, reads/writes partial token counts so they can be reused. Normally, category files are learned from exactly the input data given, and don't contain extraneous information. When this option is in effect, some extra information is saved in the file .IR online , after all input was read. This information can be reread the next time that learning occurs, to continue where the previous dataset left off. If .I online doesn't exist, it is created. If .I online exists, it is read before learning, and updated afterwards. The file is approximately 3 times bigger (at least) than the learned .IR category . .IP In .BR dbacl , file updates are atomic, but if using the .B -o switch, two or more processes should not learn simultaneously, as only one process will write a lasting category and memory dump. The .B -m switch can also speed up online learning, but beware of possible corruption. Only one process should read or write a file. This option is intended primarily for controlled test runs. See also the .B -O (big-oh) switch. .IP -r Learn the digramic reference model only. Skips the learning of extra features in the text corpus. .IP -v Verbose mode. When learning, print out details of the computation, when classifying, print out the name of the most probable .IR category . In conjunction with the .B -n option, prints the scores as an explicit product of the cross entropy and the complexity. .IP -w Select default features to be n-grams up to .IR max_order . This is incompatible with the .B -g option, which always takes precedence. If no .B -w or .B -g options are given, .B dbacl assumes .B -w 1. Note that n-grams for n greater than 1 do not straddle line breaks by default. The .B -S switch enables line straddling. .IP -x Set decimation probability to 1 - 2^(\fI-decim\fP). To reduce memory requirements when learning, some inputs are randomly skipped, and only a few are added to the model. Exact behaviour depends on the applicable .B -T option (default is .B -T "text"). When the type is not "email" (eg "text"), then individual input features are added with probability 2^(\fI-decim\fP). When the type is "email", then full input messages are added with probability 2^(\fI-decim\fP). Within each such message, all features are used. .IP -z When learning, only take into account features whose occurrence count is strictly greater than ftreshold. By default, ftreshold is zero, so all features in the training corpus are used. A negative value of ftreshold causes dbacl to subtract from the maximum observed feature count, and to use that if it is positive. For example, -z 1 means dbacl only learns features which occur at least twice in the corpus, and -z -5 means dbacl only learns the feature(s) whose occurrence count is within 4 of the global maximum. .IP -A Expect indented input and scores. With this switch, .B dbacl expects input lines to be indented by a single space character (which is then skipped). Lines starting with any other character are ignored. This is the counterpart to the .B -a switch above. When used together with the .B -a switch, .B dbacl outputs the skipped lines as they are, and reinserts the space at the front of each processed input line. .IP -D Print debug output. Do not use normally, but can be very useful for displaying the list features picked up while learning. .IP -F For each FILE of input, print the FILE name followed by the classification result (normally .B dbacl only prints a single result even if multiple files are listed as input). .IP -H Allow hash table to grow up to a maximum of 2^\fIgsize\fP elements during learning. Initial size is given by .B -h option. .IP -L Select the digramic reference measure for character transitions. The .IR measure can be one of "uniform", "dirichlet" or "maxent". Default is "uniform". .IP -M Force multinomial calculations. When learning, forces the model features to be treated multinomially. When classifying, corrects entropy scores to reflect multinomial probabilities (only applicable to multinomial type models, if present). Scores will always be lower, because the ordering of features is lost. .IP -N Print posterior probabilities for each .IR category . This assumes the supplied categories form an exhaustive list of possibilities. In conjunction with the .B -f option, stops filtering but prints each input line prepended with a summary of the posterior distribution for that line. .IP -O This switch causes the online data file named .IR ronline to be merged during learning. The .IR ronline file must be created using the -o (little-oh) switch. Several -O data files can be merged simultaneously. This is intended to be a read only version of -o, to allow piecing together of several sets of preparsed data. See the description of the -o switch. .IP -R Include an extra category for purely random text. The category is called "random". Only makes sense when using the .B -c option. .IP -P Correct the category scores to include estimated prior probabilities. The prior probability estimate for each category is proportional to the number of documents or, if that doesn't make sense, the number of unique features. This can help with "balancing" when one category is learned from much more data than another. If all categories are learned from approximately the same amount of data (or maybe within a factor of 2), then this option should have little qualitative effect. .IP -S Enable line straddling. This is useful together with the .B -w option to allow n-grams for n > 1 to ignore line breaks, so a complex token can continue past the end of the line. This is not recommended for email. .IP -T Specify nonstandard text format. By default, .B dbacl assumes that the input text is a purely .SM ASCII text file. This corresponds to the case when .I type is "text". .IP There are several types and subtypes which can be used to clean the input text of extraneous tokens before actual learning or classifying takes place. Each (sub)type you wish to use must be indicated with a separate .B -T option on the command line, and automatically implies the corresponding type. .IP The "text" type is for unstructured plain text. No cleanup is performed. This is the default if no types are given on the command line. .IP The "email" type is for mbox format input files or single RFC822 emails. Headers are recognized and most are skipped. To include extra RFC822 standard headers (except for trace headers), use the "email:headers" subtype. To include trace headers, use the "email:theaders" subtype. To include all headers in the email, use the "email:xheaders" subtype. To skip all headers, except the subject, use "email:noheaders". To scan binary attachments for strings, use the "email:atts" subtype. .IP When the "email" type is in effect, HTML markup is automatically removed from text attachments except text/plain attachments. To also remove HTML markup from plain text attachments, use "email:noplain". To prevent HTML markup removal in all text attachments, use "email:plain". .IP The "html" type is for removing HTML markup (between and tags) and surrounding text. Note that if the "email" type is enabled, then "html" is automatically enabled for compatible message attachments only. .IP The "xml" type is like "html", but doesn't honour and , and doesn't interpret tags (so this should be more properly called "angle markup" removal, and has nothing to do with actual XML semantics). .IP When "html" is enabled, most markup attributes are lost (for values of 'most' close to 'all'). The "html:links" subtype forces link urls to be parsed and learned, which would otherwise be ignored. The "html:alt" subtype forces parsing of alternative text in ALT attributes and various other tags. The "html:scripts" subtype forces parsing of scripts, "html:styles" forces parsing of styles, "html:forms" forces parsing of form values, while "html:comments" forces parsing of HTML comments. .IP -U Print (U)nambiguity. When used in conjunction with the .B -v switch, prints scores followed by their empirical standard deviations. When used alone, prints the best category, followed by an estimated probability that this category choice is unambiguous. More precisely, the probability measures lack of overlap of CLT confidence intervals for each category score (If there is overlap, then there is ambiguity). .IP This estimated probability can be used as an "unsure" flag, e.g. if the estimated probability is lower than 50%. Formally, a score of 0% means another category is equally likely to apply to the input, and a score of 100% means no other category is likely to apply to the input. Note that this type of confidence is unrelated to the .B -X switch. Also, the probability estimate is usually low if the document is short, or if the message contains many tokens that have never been seen before (only applies to uniform digramic measure). .IP -V Print the program version number and exit. .IP -W Like -w, but prevents features from straddling newlines. See the description of .BR -w . .IP -X Print the confidence in the score calculated for each .IR category , when used together with the .B -n or .B -N switch. Prepares the model for confidence scores, when used with the .B -l switch. The confidence is an estimate of the typicality of the score, assuming the null hypothesis that the given category is correct. When used with the .B -v switch alone, factorizes the score as the empirical divergence plus the shannon entropy, multiplied by complexity, in that order. The .B -X switch is not supported in all possible models, and displays a percentage of "0.0" if it can't be calculated. Note that for unknown documents, it is quite common to have confidences close to zero. .IP -Y Print the cumulative media counts. Some tokenizers include a medium variable with each token: for example, in email classification the word "the" can appear in the subject or the body of a message, but the subject is counted as a separate medium from the body. This allows the token frequencies to be kept separate, even though the word is the same. Currently, up to 16 different media are supported (0-15), with the following interpretation for email: 0 unused. 1 default medium. 2 mail body or attachment in HTML format. 3 mail body or attachment in plain text format. 4 mail header unknown. 5 User-Agent, Comments, Keywords, Note 6 X-MS*, Categor*, Priority, Importance, Thread-* 7 X-* 8 List-* 9 MIME-Version, Content-* 10 Subject 11 To 12 Sender, Sent, BCC, CC, From 13 Resent-*, Original-* 14 Message-ID, References, In-Reply-To 15 Received, Return-Path, Return-Receipt-To, Reply-To The .B -Y switch prints the number of tokens observed in each separate medium, in order from 0 to 15. .SH USAGE .PP To create two category files in the current directory from two .SM ASCII text files named Mark_Twain.txt and William_Shakespeare.txt respectively, type: .PP .na % dbacl -l twain Mark_Twain.txt .br % dbacl -l shake William_Shakespeare.txt .ad .PP Now you can classify input text, for example: .PP .na % echo "howdy" | dbacl -v -c twain -c shake .br twain .br % echo "to be or not to be" | dbacl -v -c twain -c shake .br shake .ad .PP Note that the .B -v option at least is necessary, otherwise .B dbacl does not print anything. The return value is 1 in the first case, 2 in the second. .PP .ad % echo "to be or not to be" | dbacl -v -N -c twain -c shake .br twain 22.63% shake 77.37% .br % echo "to be or not to be" | dbacl -v -n -c twain -c shake .br twain 7.04 * 6.0 shake 6.74 * 6.0 .ad .PP These invocations are equivalent. The numbers 6.74 and 7.04 represent how close the average token is to each category, and 6.0 is the number of tokens observed. If you want to print a simple confidence value together with the best category, replace .B -v with .BR -U . .PP .na % echo "to be or not to be" | dbacl -U -c twain -c shake .br shake # 34% .ad .PP Note that the true probability of category .I shake versus category .I twain is 77.37%, but the calculation is somewhat ambiguous, and 34% is the confidence out of 100% that the calculation is qualitatively correct. .PP Suppose a file document.txt contains English text lines interspersed with noise lines. To filter out the noise lines from the English lines, assuming you have an existing category shake say, type: .PP .na % dbacl -c shake -f shake -R document.txt > document.txt_eng .br % dbacl -c shake -f random -R document.txt > document.txt_rnd .ad .PP Note that the quality of the results will vary depending on how well the categories shake and random represent each input line. It is sometimes useful to see the posterior probabilities for each line without filtering: .PP .na % dbacl -c shake -f shake -RN document.txt > document.txt_probs .ad .PP You can now postprocess the posterior probabilities for each line of text with another script, to replicate an arbitrary Bayesian decision rule of your choice. .PP In the special case of exactly two categories, the optimal Bayesian decision procedure can be implemented for documents as follows: let .I p1 be the prior probability that the input text is classified as .IR category1 . Consequently, the prior probability of classifying as .I category2 is 1 - .IR p1 . Let .I u12 be the cost of misclassifying a .I category1 input text as belonging to .I category2 and vice versa for .IR u21 . We assume there is no cost for classifying correctly. Then the following command implements the optimal Bayesian decision: .HP .na % dbacl -n -c .I category1 -c .I category2 | awk '{ if($2 * .I p1 * .I u12 > $4 * (1 - .IR p1 ) * .IR u21 ) { print $1; } else { print $3; } }' .ad .PP .B dbacl can also be used in conjunction with .BR procmail (1) to implement a simple Bayesian email classification system. Assume that incoming mail should be automatically delivered to one of three mail folders located in $MAILDIR and named .IR work , .IR personal , and .IR spam . Initially, these must be created and filled with appropriate sample emails. A .BR crontab (1) file can be used to learn the three categories once a day, e.g. .PP .na CATS=$HOME/.dbacl .br 5 0 * * * dbacl -T email -l $CATS/work $MAILDIR/work .br 10 0 * * * dbacl -T email -l $CATS/personal $MAILDIR/personal .br 15 0 * * * dbacl -T email -l $CATS/spam $MAILDIR/spam .ad .PP To automatically deliver each incoming email into the appropriate folder, the following .BR procmailrc (5) recipe fragment could be used: .PP .na CATS=$HOME/.dbacl .ad .PP .na # run the spam classifier .br :0 c .br YAY=| dbacl -vT email -c $CATS/work -c $CATS/personal -c $CATS/spam .ad .PP .na # send to the appropriate mailbox .br :0: .br * ? test -n "$YAY" .br $MAILDIR/$YAY .ad .PP .na :0: .br $DEFAULT .ad .PP Sometimes, .B dbacl will send the email to the wrong mailbox. In that case, the misclassified message should be removed from its wrong destination and placed in the correct mailbox. The error will be corrected the next time your messages are learned. If it is left in the wrong category, .B dbacl will learn the wrong corpus statistics. .PP The default text features (tokens) read by .B dbacl are purely alphabetic strings, which minimizes memory requirements but can be unrealistic in some cases. To construct models based on alphanumeric tokens, use the .B -e switch. The example below also uses the optional .B -D switch, which prints a list of actual tokens found in the document: .PP .na % dbacl -e alnum -D -l twain Mark_Twain.txt | less .ad .PP It is also possible to override the default feature selection method used to learn the category model by means of regular expressions. For example, the following duplicates the default feature selection method in the C locale, while being much slower: .HP .na % dbacl -l twain -g '^([[:alpha:]]+)' -g '[^[:alpha:]]([[:alpha:]]+)' Mark_Twain.txt .ad .PP The category twain which is obtained depends only on single alphabetic words in the text file Mark_Twain.txt (and computed digram statistics for prediction). For a second example, the following command builds a smoothed Markovian (word bigram) model which depends on pairs of consecutive words within each line (but pairs cannot straddle a line break): .HP .na % dbacl -l twain2 -g '(^|[^[:alpha:]])([[:alpha:]]+)||2' -g '(^|[^[:alpha:]])([[:alpha:]]+)[^[:alpha:]]+([[:alpha:]]+)||23' Mark_Twain.txt .ad .PP More general, line based, n-gram models of all orders (up to 7) can be built in a similar way. To construct paragraph based models, you should reformat the input corpora with .BR awk (1) or .BR sed (1) to obtain one paragraph per line. Line size is limited by available memory, but note that regex performance will degrade quickly for long lines. .SH PERFORMANCE .PP The underlying assumption of statistical learning is that a relatively small number of training documents can represent a much larger set of input documents. Thus in the long run, learning can grind to a halt without serious impact on classification accuracy. While not true in reality, this assumption is surprisingly accurate for problems such as email filtering. In practice, this means that a well chosen corpus on the order of ten thousand documents is sufficient for highly accurate results for years. Continual learning after such a critical mass results in diminishing returns. Of course, when real world input document patterns change dramatically, the predictive power of the models can be lost. At the other end, a few hundred documents already give acceptable results in most cases. .PP .B dbacl is heavily optimized for the case of frequent classifications but infrequent batch learning. This is the long run optimum described above. Under ideal conditions, .B dbacl can classify a hundred emails per second on low end hardware (500Mhz Pentium III). Learning speed is not very much slower, but takes effectively much longer for large document collections for various reasons. When using the .B -m switch, data structures are aggressively mapped into memory if possible, reducing overheads for both I/O and memory allocations. .PP .B dbacl throws away its input as soon as possible, and has no limits on the input document size. Both classification and learning speed are directly proportional to the number of tokens in the input, but learning also needs a nonlinear optimization step which takes time proportional to the number of unique tokens discovered. At time of writing, .B dbacl is one of the fastest open source mail filters given its optimal usage scenario, but uses more memory for learning than other filters. .SH MULTIPLE PROCESSES AND DATA CORRUPTION .PP When saving category files, .B dbacl first writes out a temporary file in the same location, and renames it afterwards. If a problem or crash occurs during learning, the old category file is therefore left untouched. This ensures that categories can never be corrupted, no matter how many processes try to simultaneously learn or classify, and means that valid categories are available for classification at any time. .PP When using the .B -m switch, file contents are memory mapped for speedy reading and writing. This, together with the .B -o switch, is intended mainly for testing purposes, when tens of thousands of messages must be learned and scored in a laboratory to measure .BR dbacl 's accuracy. Because no file locking is attempted for performance reasons, corruptions are possible, unless you make sure that only one .B dbacl process reads or writes any file at any given time. This is the only case (-m and -o together) when corruption is possible. .SH MEMORY USE .PP When classifying a document, .B dbacl loads all indicated categories into RAM, so the total memory needed is approximately the sum of the category file sizes plus a fixed small overhead. The input document is consumed while being read, so its size doesn't matter, but very long lines can take up space. When using the .B -m switch, the categories are read using .BR mmap (2) as available. .PP When learning, .B dbacl keeps a large structure in memory which contains many objects which won't be saved into the output category. The size of this structure is proportional to the number of unique tokens read, but not the size of the input documents, since they are discarded while being read. As a rough guide, this structure is 4x-5x the size of the final category file that is produced. .PP To prevent unchecked memory growth, .B dbacl allocates by default a fixed smallish amount of memory for tokens. When this space is used up, further tokens are discarded which has the effect of skewing the learned category making it less usable as more tokens are dropped. A warning is printed on STDERR in such a case. .PP The .B -h switch lets you fix the initial size of the token space in powers of 2, ie "-h 17" means 2^17 = 131072 possible tokens. If you type "dbacl -V", you can see the number of bytes needed for each token when either learning or classifying. Multiply this number by the maximum number of possible tokens to estimate the memory needed for learning. The .B -H switch lets .B dbacl grow its tables automatically if and when needed, up to a maximum specified. So if you type "-H 21", then the initial size will be doubled repeatedly if necessary, up to approximately two million unique tokens. .PP When learning with the .B -X switch, a handful of input documents are also kept in RAM throughout. .SH ENVIRONMENT .PP .IP DBACL_PATH When this variable is set, its value is prepended to every .I category filename which doesn't start with a '/' or a '.'. .SH SIGNALS .PP .IP INT If this signal is caught, .B dbacl simply exits without doing any cleanup or other operations. This signal can often be sent by pressing Ctrl-C on the keyboard. See .BR stty (1). .IP "HUP, QUIT, TERM" If one of these signals is caught, .B dbacl stops reading input and continues its operation as if no more input was available. This is a way of quitting gracefully, but note that in learning mode, a category file will be written based on the incomplete input. The QUIT signal can often be sent by pressing Ctrl-\ on the keyboard. See .BR stty (1). .IP USR1 If this signal is caught, .B dbacl reloads the current categories at the earliest feasible opportunity. This is not normally useful at all, but might be in special cases, such as if the .B -f switch is invoked together with input from a long running pipe. .SH NOTES .PP .B dbacl generated category files are in binary format, and may or may not be portable to systems using a different byte order architecture (this depends on how .B dbacl was compiled). The .B -V switch prints out whether categories are portable, or else you can just experiment. .PP .B dbacl does not recognize functionally equivalent regular expressions, and in this case duplicate features will be counted several times. .PP With every learned category, the command line options that were used are saved. When classifying, make sure that every relevant category was learned with the same set of options (regexes are allowed to differ), otherwise behaviour is undefined. There is no need to repeat all the switches when classifying. .PP If you get many digitization warnings, then you are trying to learn too much data at once, or your model is too complex. .B dbacl is compiled to save memory by digitizing final weights, but you can disable digitization by editing dbacl.h and recompiling. .PP .B dbacl offers several built-in tokenizers (see .B -e switch) with more to come in future versions, as the author invents them. While the default tokenizer may evolve, no tokenizer should ever be removed, so that you can always simulate previous .B dbacl behaviour subject to bug fixes and architectural changes. .PP The confidence estimates obtained through the .B -X switch are underestimates, ie are more conservative than they should be. .SH BUGS .PP "Ya know, some day scientists are gonna invent something that will outsmart a rabbit." (Robot Rabbit, 1953) .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR awk (1), .BR bayesol (1), .BR crontab (1), .BR hmine (1), .BR hypex (1), .BR less (1), .BR mailcross (1), .BR mailfoot (1), .BR mailinspect (1), .BR mailtoe (1), .BR procmailex (5), .BR regex (7), .BR stty (1), .BR sed (1) dbacl-1.14.1/man/hmine.1in000066400000000000000000000026541325773323600151510ustar00rootroot00000000000000\" t .TH HMINE 1 "Bayesian Classification Tools" "Version @VERSION@" "" .SH NAME hmine \- a mail message header analyzer. .SH SYNOPSIS .HP .B hmine [-vDa] [FILE] .HP .B hmine -V .SH DESCRIPTION .PP .B hmine reads a mail message from FILE or STDIN and outputs a variety of information found in the message headers. The message is expected in Internet mail format (RFC 821,822,2821,2822 or variations thereof). The body is not inspected. .SH EXIT STATUS On success, .B hmine returns 1. In case of a problem, .B hmine returns zero. .SH OPTIONS .IP -a Print mailboxes and groups found in various header fields, one per line, preceded by the field name. Actual email addresses are always enclosed in '<' and '>' for easy parsing, ie anything not within these delimiters is not part of an email address. Beware that not every line need contain an email address. .IP -D Debug output. .IP -V Print the program version number and exit. .SH USAGE .PP An invocation looks like this: .PP .na % hmine email.txt .ad .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH BUGS .PP At present, hmine parses messages but doesn't output anything useful. .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR dbacl (1), .BR mailcross (1), .BR mailfoot (1), .BR mailinspect (1), .BR mailtoe (1), .BR regex (7) dbacl-1.14.1/man/hypex.1in000066400000000000000000000035101325773323600151760ustar00rootroot00000000000000\" t .TH HYPEX 1 "Bayesian Classification Tools" "Version @VERSION@" "" .SH NAME hypex \- computes the Chernoff exponent between two simple categories. .SH SYNOPSIS .HP .B hypex [-hH size] [-s stepsize] CATDUMP1 CATDUMP2 .HP .B hmine -V .SH DESCRIPTION .PP .B hypex reads two category dumps produced by dbacl(1) after learning. A category dump is obtained using the .B -d and .B -l switches, and is a textual representation of the feature weights which exist in the binary category files. .PP Given two such category dumps for simple unigram categories, .B hypex calculates the Kullback Leibler divergence between the probability models, and prints out exponential error exponents for Neyman-Pearson hypothesis tests under a range of threshold values. See .BR "Cover and Thomas (1991) Elements of Information Theory" , Chap. 12. .PP Note that only simple categories are supported, and the output only makes sense under appropriate theoretical conditions. This is a very specialized calculator. .SH EXIT STATUS .B hypex returns 0 on success, 1 if an error occurs. .SH OPTIONS .IP -h .IP -H Same as dbacl(1). Selects the hash sizes in powers of two. .IP -s Stepsize for the threshold. .B hypex outputs exponents for different values of the threshold, within an interval bounded by the Kullback Leibler divergences between the categories. .IP -V Print the program version number and exit. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH BUGS .PP Doesn't work with complex categories, and theoretical assumptions are unrealistic in practice. .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR dbacl (1), .BR mailcross (1), .BR mailfoot (1), .BR mailinspect (1), .BR mailtoe (1), .BR regex (7) dbacl-1.14.1/man/mailcross.1in000066400000000000000000000261771325773323600160530ustar00rootroot00000000000000\" t .TH MAILCROSS 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME mailcross \- a cross-validation simulator for use with dbacl. .SH SYNOPSIS .HP .B mailcross .I command [ .I command_arguments ] .SH DESCRIPTION .PP .B mailcross automates the task of cross-validating email filtering and classification programs such as .BR dbacl (1). Given a set of categorized documents, mailcross initiates simulation runs to estimate the classification errors and thereby permits fine tuning of the parameters of the classifier. .PP Cross-validation is a method which is widely used to compare the quality of classification and learning algorithms, and as such permits rudimentary comparisons between those classifiers which make use of .BR dbacl (1) and .BR bayesol (1), and other competing classifiers. .PP The mechanics of cross-validation are as follows: A set of pre-classified email messages is first split into a number of roughly equal-sized subsets. For each subset, the filter (by default, .BR dbacl (1)) is used to classify each message within this subset, based upon having learned the categories from the remaining subsets. The resulting classification errors are then averaged over all subsets. .PP The results obtained by cross validation essentially do not depend upon the ordering of the sample emails. Other methods (see .BR mailtoe (1), mailfoot (1)) attempt to capture the behaviour of classification errors over time. .PP .B mailcross uses the environment variables MAILCROSS_LEARNER and MAILCROSS_FILTER when executing, which permits the cross-validation of arbitrary filters, provided these satisfy the compatibility conditions stated in the ENVIRONMENT section below. .PP For convenience, .B mailcross implements a .B testsuite framework with predefined wrappers for several open source classifiers. This permits the direct comparison of .BR dbacl (1) with competing classifiers on the same set of email samples. See the USAGE section below. .PP During preparation, .B mailcross builds a subdirectory named mailcross.d in the current working directory. All needed calculations are performed inside this subdirectory. .SH EXIT STATUS .B mailcross returns 0 on success, 1 if a problem occurred. .SH COMMANDS .PP .IP "\fBprepare\fR \fIsize\fR" Prepares a subdirectory named mailcross.d in the current working directory, and populates it with empty subdirectories for exactly .I size subsets. .IP "\fBadd\fR \fIcategory\fR [FILE]..." Takes a set of emails from either FILE if specified, or STDIN, and associates them with .IR category . All emails are distributed randomly into the subdirectories of mailcross.d for later use. For each .IR category , this command can be repeated several times, but should be executed at least once. .IP "\fBclean\fR" Deletes the directory mailcross.d and all its contents. .IP "\fBlearn\fR" For every previously built subset of email messages, pre-learns all the categories based on the contents of all the subsets except this one. The .I command_arguments are passed to MAILCROSS_LEARNER. .IP "\fBrun\fR" For every previously built subset of email messages, performs the classification based upon the pre-learned categories associated with all but this subset. The .I command_arguments are passed to MAILCROSS_FILTER. .IP "\fBsummarize\fR" Prints statistics for the latest cross-validation run. .IP "\fBreview\fR \fItruecat\fR \fIpredcat\fR" Scans the last run statistics and extracts all the messages which belong to category .I truecat but have been classified into category .IR predcat . The extracted messages are copied to the directory mailcross.d/review for perusal. .PP .IP "\fBtestsuite list\fR" Shows a list of available filters/wrapper scripts which can be selected. .IP "\fBtestsuite select\fR [FILTER]..." Prepares the filter(s) named .I FILTER to be used for simulation. The filter name is the name of a wrapper script located in the directory .IR @PKGDATADIR@/testsuite . Each filter has a rigid interface documented below, and the act of selecting it copies it to the .I mailcross.d/filters directory. Only filters located there are used in the simulations. .IP "\fBtestsuite deselect\fR [FILTER]..." Removes the named filter(s) from the directory .I mailcross.d/filters so that they are not used in the simulation. .IP "\fBtestsuite run\fR" Invokes every selected filter on the datasets added previously, and calculates misclassification rates. .IP "\fBtestsuite status\fR" Describes the scheduled simulations. .IP "\fBtestsuite summarize\fR" Shows the cross validation results for all filters. Only makes sense after the .I run command. .SH USAGE .PP The normal usage pattern is the following: first, you should separate your email collection into several categories (manually or otherwise). Each category should be associated with one or more folders, but each folder should not contain more than one category. Next, you should decide how many subsets to use, say 10. Note that too many subsets will slow down the calculations rapidly. Now you can type .HP .na % mailcross prepare 10 .ad .PP Next, for every category, you must add every folder associated with this category. Suppose you have three categories named .IR spam , .IR work , and .IR play , which are associated with the mbox files .IR spam.mbox , .IR work.mbox , and .IR play.mbox respectively. You would type .PP .na % mailcross add spam spam.mbox .br % mailcross add work work.mbox .br % mailcross add play play.mbox .ad .PP You can now perform as many simulations as desired. Every cross validation consists of a learning, a running and a summarizing stage. These operations are performed on the classifier specified in the MAILCROSS_FILTER and MAILCROSS_LEARNER variables. By setting these variables appropriately, you can compare classification performance as you vary the command line options of your classifier(s). .PP .na % mailcross learn .br % mailcross run .br % mailcross summarize .ad .PP The testsuite commands are designed to simplify the above steps and allow comparison of a wide range of email classifiers, including but not limited to .BR dbacl . Classifiers are supported through wrapper scripts, which are located in the .I @PKGDATADIR@/testsuite directory. .PP The first stage when using the testsuite is deciding which classifiers to compare. You can view a list of available wrappers by typing: .PP .na % mailcross testsuite list .ad .PP Note that the wrapper scripts are NOT the actual email classifiers, which must be installed separately by your system administrator or otherwise. Once this is done, you can select one or more wrappers for the simulation by typing, for example: .PP .na % mailcross testsuite select dbaclA ifile .ad .PP If some of the selected classifiers cannot be found on the system, they are not selected. Note also that some wrappers can have hard-coded category names, e.g. if the classifier only supports binary classification. Heed the warning messages. .PP It remains only to run the simulation. Beware, this can take a long time (several hours depending on the classifier). .PP .na % mailcross testsuite run .br % mailcross testsuite summarize .ad .PP Once you are all done with simulations, you can delete the working files, log files etc. by typing .PP .na % mailcross clean .ad .PP The progress of the cross validation is written silently in various log files which are located in the .I mailcross.d/log directory. Check these in case of problems. .SH SCRIPT INTERFACE .PP .B mailcross testsuite takes care of learning and classifying your prepared email corpora for each selected classifier. Since classifiers have widely varying interfaces, this is only possible by wrapping those interfaces individually into a standard form which can be used by .BR "mailcross testsuite" . .PP Each wrapper script is a command line tool which accepts a single command followed by zero or more optional arguments, in the standard form: .PP .na wrapper command [argument]... .ad .PP Each wrapper script also makes use of STDIN and STDOUT in a well defined way. If no behaviour is described, then no output or input should be used. The possible commands are described below: .IP filter In this case, a single email is expected on STDIN, and a list of category filenames is expected in $2, $3, etc. The script writes the category name corresponding to the input email on STDOUT. No trailing newline is required or expected. .IP learn In this case, a standard mbox stream is expected on STDIN, while a suitable category file name is expected in $2. No output is written to STDOUT. .IP clean In this case, a directory is expected in $2, which is examined for old database information. If any old databases are found, they are purged or reset. No output is written to STDOUT. .IP describe IN this case, a single line of text is written to STDOUT, describing the filter's functionality. The line should be kept short to prevent line wrapping on a terminal. .IP bootstrap In this case, a directory is expected in $2. The wrapper script first checks for the existence of its associated classifier, and other prerequisites. If the check is successful, then the wrapper is cloned into the supplied directory. A courtesy notification should be given on STDOUT to express success or failure. It is also permissible to give longer descriptions caveats. .IP toe Used by .BR mailtoe (1). .IP foot Used by .BR mailfoot (1). .SH ENVIRONMENT .PP Right after loading, .B mailcross reads the hidden file .mailcrossrc in the $HOME directory, if it exists, so this would be a good place to define custom values for environment variables. .IP MAILCROSS_FILTER This variable contains a shell command to be executed repeatedly during the running stage. The command should accept an email message on STDIN and output a resulting category name. It should also accept a list of category file names on the command line. If undefined, .B mailcross uses the default value MAILCROSS_FILTER="dbacl -T email -T xml -v" (and also magically adds the -c option before each category). .IP MAILCROSS_LEARNER This variable contains a shell command to be executed repeatedly during the learning stage. The command should accept a mbox type stream of emails on STDIN for learning, and the file name of the category on the command line. If undefined, .B mailcross uses the default value MAILCROSS_LEARNER="dbacl -H 19 -T email -T xml -l". .IP TEMPDIR This directory is exported for the benefit of wrapper scripts. Scripts which need to create temporary files should place them a the location given in TEMPDIR. .SH NOTES .PP The subdirectory mailcross.d can grow quite large. It contains a full copy of the training corpora, as well as learning files for .I size times all the added categories, and various log files. .SH WARNING .PP Cross-validation is a widely used, but ad-hoc statistical procedure, completely unrelated to Bayesian theory, and subject to controversy. Use this at your own risk. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR bayesol (1) .BR dbacl (1), .BR mailinspect (1), .BR mailtoe (1), .BR mailfoot (1), .BR regex (7) dbacl-1.14.1/man/mailfoot.1in000066400000000000000000000301531325773323600156560ustar00rootroot00000000000000\" t .TH MAILFOOT 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME mailfoot \- a full-online-ordered-training simulator for use with dbacl. .SH SYNOPSIS .HP .B mailfoot .I command [ .I command_arguments ] .SH DESCRIPTION .PP .B mailfoot automates the task of testing email filtering and classification programs such as .BR dbacl (1). Given a set of categorized documents, mailfoot initiates test runs to estimate the classification errors and thereby permit fine tuning of the parameters of the classifier. .PP Full Online Ordered Training is a learning method for email classifiers where each incoming email is learned as soon as it arrives, thereby always keeping category descriptions up to date for the next classification. This directly models the way that some email classifiers are used in practice. .PP FOOT's error rates depend directly on the order in which emails are seen. A small change in ordering, as might happen due to networking delays, can have an impact on the number of misclassifications. Consequently, .B mailfoot does not give meaningful results, unless the sample emails are chosen carefully. However, as this method is commonly used by spam filters, it is still worth computing to foster comparisons. Other methods (see .BR mailcross (1), mailtoe (1)) attempt to capture the behaviour of classification errors in other ways. .PP To improve and stabilize the error rate calculation, .B mailfoot performs the FOOT simulations several times on slightly reordered email streams, and averages the results. The reorderings occur by multiplexing the emails from each category mailbox in random order. Thus if there are three categories, the first email classified is chosen randomly from the front of the sample email streams of each type. The second email is also chosen randomly among the three types, from the front of the streams after the first email was removed. Simulation stops when all sample streams are exhausted. .PP .B mailfoot uses the environment variable MAILFOOT_FILTER when executing, which permits the simulation of arbitrary filters, provided these satisfy the compatibility conditions stated in the ENVIRONMENT section below. .PP For convenience, .B mailfoot implements a .B testsuite framework with predefined wrappers for several open source classifiers. This permits the direct comparison of .BR dbacl (1) with competing classifiers on the same set of email samples. See the USAGE section below. .PP During preparation, .B mailfoot builds a subdirectory named mailfoot.d in the current working directory. All needed calculations are performed inside this subdirectory. .SH EXIT STATUS .B mailfoot returns 0 on success, 1 if a problem occurred. .SH COMMANDS .PP .PP .IP "\fBprepare\fR \fIsize\fR" Prepares a subdirectory named mailfoot.d in the current working directory, and populates it with empty subdirectories for exactly .I size subsets. .IP "\fBadd\fR \fIcategory\fR [ \fIFILE\fR ]..." Takes a set of emails from either FILE if specified, or STDIN, and associates them with .IR category . The ordering of emails within \fIFILE\fR is preserved, and subsequent \fIFILE\fRs are appended to the first in each category. This command can be repeated several times, but should be executed at least once. .IP "\fBclean\fR" Deletes the directory mailfoot.d and all its contents. .IP "\fBrun\fR" Multiplexes randomly from the email streams added earlier, and relearns categories only when a misclassification occurs. The simulation is repeated .I size times. .IP "\fBsummarize\fR" Prints average error rates for the simulations. .IP "\fBplot\fR [ \fIps\fR | \fIlogscale\fR ]..." Plots the number of errors over simulation time. The "ps" option, if present, writes the plot to a postscript file in the directory mailfoot/plots, instead of being shown on-screen. The "logscale" option, if present, causes the plot to be on the log scale for both ordinates. .IP "\fBreview\fR \fItruecat\fR \fIpredcat\fR" Scans the last run statistics and extracts all the messages which belong to category .I truecat but have been classified into category .IR predcat . The extracted messages are copied to the directory .I mailfoot.d/review for perusal. .PP .IP "\fBtestsuite list\fR" Shows a list of available filters/wrapper scripts which can be selected. .IP "\fBtestsuite select\fR [ \fIFILTER\fR ]..." Prepares the filter(s) named .I FILTER to be used for simulation. The filter name is the name of a wrapper script located in the directory .IR @PKGDATADIR@/testsuite . Each filter has a rigid interface documented below, and the act of selecting it copies it to the .I mailfoot.d/filters directory. Only filters located there are used in the simulations. .IP "\fBtestsuite deselect\fR [ \fIFILTER\fR ]..." Removes the named filter(s) from the directory .I mailfoot.d/filters so that they are not used in the simulation. .IP "\fBtestsuite run\fR [ \fIplots\fR ]" Invokes every selected filter on the datasets added previously, and calculates misclassification rates. If the "plots" option is present, each filter simulation is plotted as a postscript file in the directory .IR mailfoot.d/plots . .IP "\fBtestsuite status\fR" Describes the scheduled simulations. .IP "\fBtestsuite summarize\fR" Shows the cross validation results for all filters. Only makes sense after the .I run command. .SH USAGE .PP The normal usage pattern is the following: first, you should separate your email collection into several categories (manually or otherwise). Each category should be associated with one or more folders, but each folder should not contain more than one category. Next, you should decide how many runs to use, say 10. The more runs you use, the better the predicted error rates. However, more runs take more time. Now you can type .HP .na % mailfoot prepare 10 .ad .PP Next, for every category, you must add every folder associated with this category. Suppose you have three categories named .IR spam , .IR work , and .IR play , which are associated with the mbox files .IR spam.mbox , .IR work.mbox , and .IR play.mbox respectively. You would type .PP .na % mailfoot add spam spam.mbox .br % mailfoot add work work.mbox .br % mailfoot add play play.mbox .ad .PP You should aim for a similar number of emails in each category, as the random multiplexing will be unbalanced otherwise. The ordering of the email messages in each .I *.mbox file is important, and is preserved during each simulation. If you repeatedly add to the same category, the later mailboxes will be appended to the first, preserving the implied ordering. .PP You can now perform as many FOOT simulations as desired. The multiplexed emails are classified and learned one at a time, by executing the command given in the environment variable MAILFOOT_FILTER. If not set, a default value is used. .PP .na % mailfoot run .br % mailfoot summarize .ad .PP The testsuite commands are designed to simplify the above steps and allow comparison of a wide range of email classifiers, including but not limited to .BR dbacl . Classifiers are supported through wrapper scripts, which are located in the .I @PKGDATADIR@/testsuite directory. .PP The first stage when using the testsuite is deciding which classifiers to compare. You can view a list of available wrappers by typing: .PP .na % mailfoot testsuite list .ad .PP Note that the wrapper scripts are NOT the actual email classifiers, which must be installed separately by your system administrator or otherwise. Once this is done, you can select one or more wrappers for the simulation by typing, for example: .PP .na % mailfoot testsuite select dbaclA ifile .ad .PP If some of the selected classifiers cannot be found on the system, they are not selected. Note also that some wrappers can have hard-coded category names, e.g. if the classifier only supports binary classification. Heed the warning messages. .PP It remains only to run the simulation. Beware, this can take a long time (several hours depending on the classifier). .PP .na % mailfoot testsuite run .br % mailfoot testsuite summarize .ad .PP Once you are all done, you can delete the working files, log files etc. by typing .PP .na % mailfoot clean .ad .SH SCRIPT INTERFACE .PP .B mailfoot testsuite takes care of learning and classifying your prepared email corpora for each selected classifier. Since classifiers have widely varying interfaces, this is only possible by wrapping those interfaces individually into a standard form which can be used by .BR "mailfoot testsuite" . .PP Each wrapper script is a command line tool which accepts a single command followed by zero or more optional arguments, in the standard form: .PP .na wrapper command [argument]... .ad .PP Each wrapper script also makes use of STDIN and STDOUT in a well defined way. If no behaviour is described, then no output or input should be used. The possible commands are described below: .IP filter In this case, a single email is expected on STDIN, and a list of category filenames is expected in $2, $3, etc. The script writes the category name corresponding to the input email on STDOUT. No trailing newline is required or expected. .IP learn In this case, a standard mbox stream is expected on STDIN, while a suitable category file name is expected in $2. No output is written to STDOUT. .IP clean In this case, a directory is expected in $2, which is examined for old database information. If any old databases are found, they are purged or reset. No output is written to STDOUT. .IP describe IN this case, a single line of text is written to STDOUT, describing the filter's functionality. The line should be kept short to prevent line wrapping on a terminal. .IP bootstrap In this case, a directory is expected in $2. The wrapper script first checks for the existence of its associated classifier, and other prerequisites. If the check is successful, then the wrapper is cloned into the supplied directory. A courtesy notification should be given on STDOUT to express success or failure. It is also permissible to give longer descriptions caveats. .IP toe Used by .BR mailtoe (1). .IP foot In this case, a list of categories is expected in $3, $4, etc. Every possible category must be listed. Preceding this list, the true category is given in $2. .SH ENVIRONMENT .PP Right after loading, .B mailfoot reads the hidden file .mailfootrc in the $HOME directory, if it exists, so this would be a good place to define custom values for environment variables. .IP MAILFOOT_FILTER This variable contains a shell command to be executed repeatedly during the running stage. The command should accept an email message on STDIN and output a resulting category name. On the command line, it should also accept first the true category name, then a list of all possible category file names. If the output category does not match the true category, then the relevant categories are assumed to have been silently updated/relearned. If MAILFOOT_FILTER is undefined, .B mailfoot uses a default value. .IP TEMPDIR This directory is exported for the benefit of wrapper scripts. Scripts which need to create temporary files should place them a the location given in TEMPDIR. .SH NOTES .PP The subdirectory mailfoot.d can grow quite large. It contains a full copy of the training corpora, as well as learning files for .I size times all the added categories, and various log files. .PP FOOT simulations for .BR dbacl (1) are very, very slow (order n squared) and will take all night to perform. This is not easy to improve. .SH WARNING .PP Because the ordering of emails within the added mailboxes matters, the estimated error rates are not well defined or even meaningful in an objective sense. However, if the sample emails represent an actual snapshot of a user's incoming email, then the error rates are somewhat meaningful. The simulations can then be interpreted as alternate realities where a given classifier would have intercepted the incoming mail. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR bayesol (1) .BR dbacl (1), .BR mailcross (1), .BR mailinspect (1), .BR mailtoe (1), .BR regex (7) dbacl-1.14.1/man/mailinspect.1in000066400000000000000000000140071325773323600163540ustar00rootroot00000000000000\" t .TH MAILINSPECT 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME mailinspect \- sort an mbox by category and pipe emails to a command. .SH SYNOPSIS .HP .B mailinspect [-zjiI] -c .I category FILE [-gG .IR regex ]... [-s .IR command ] [-p .IR style ] [-o .IR scoring ] .HP .B mailinspect -V .SH DESCRIPTION .PP .B mailinspect reads the single mbox folder named FILE and sorts it in order of similarity to the .IR category , which must have been created by .BR dbacl (1). It can be used as a command line tool or interactively, when given the .B -I switch. .PP When used as a command line tool, .B mailinspect prints the sorted list of emails on STDOUT. Each line consists of a seek position for the given email within FILE, followed by the score and a description string in one of several styles chosen via the .B -p option. .PP When supplying a .I command string in conjunction with the .B -s option, .B mailinspect spawns a shell and executes .I command for every email in FILE (possibly selected via the .BR -g " or" -G options), in the sorted order. This is similar to the .BR formail (1) functionality, except the latter doesn't order the emails. .PP In interactive mode, all the command line functionality is available via keypresses. The sorted list of emails is displayed in a scrollable format, and can be viewed, searched, tagged, resorted and sent to shell commands. Predefined shell commands can be associated with function keys. See the usage section below. .PP The sorting heuristics are currently (and may always be) experimental, so there is no guarantee that the orderings are particularly well suited for anything. .SH EXIT STATUS .B mailinspect returns 1 on success, 0 if some error occurred. .SH OPTIONS .IP -c Use .I category to compute the scores and sort the emails, which should be the file name of a .BR dbacl (1) category. .IP -g Only emails matching the regular expression .I regex are sorted. All other emails are ignored. When several .B -g and .B -G options are present on the command line, earlier regular expressions are overridden by later ones where applicable. .IP -i Force internationalized mode. .IP -j Force regular expression searches to be case sensitive. .IP -o Determines the scoring formula to be used. The parameter .I scoring must be an integer greater than or equal to zero. By default, .I scoring equals zero. .IP -p Prints the email index in the given style. The parameter .I style must be an integer greater than or equal to zero. By default, .I style equals zero. .IP -s For each email in the list, execute the shell .IR command , with the email body on STDIN. Emails are processed in sorted order. .IP -z Reverse sort order. Normally, emails are sorted in order of closest to furthest relative to .IR category , but in this case, the opposite is true. .IP -I Interactive mode. Instead of printing the sorted list of emails on STDOUT, emails are displayed and can be scrolled, viewed, searched and piped interactively at the terminal. .IP -G Only emails .B not matching the regular expression .I regex are sorted. Opposite of .B -g switch. .IP -V Print the program version number and exit. .SH USAGE .PP .B mailinspect needs to read a prelearned .I category before it can sort the emails in FILE. See .BR dbacl (1). .PP Suppose you have two mail folders named .I good.mbox and .IR bad.mbox respectively. You can create appropriate categories by typing the commands .PP .na % dbacl -l good good.mbox -T email .br % dbacl -l bad bad.mbox -T email .ad .PP Next, you can type the following command to view interactively the .I bad.mbox file with the emails whose score is closest to the category .I good listed first: .PP .na % mailinspect -I -c good bad.mbox .ad .PP Alternatively, you might be interested only in the five emails in the folder .I bad.mbox whose score marks them as the furthest away from the category .BR bad , completely independently from any other category such as .I good (ie you want outliers in the scoring sense). .PP .na % mailinspect -z -c bad bad.mbox | head -5 .ad .PP In interactive mode, the following keys are defined: .IP o toggles another scoring formula. .IP p toggles another display style. .IP q exits .BR mailinspect . .IP s sends the currently highlighted email to a shell command. .IP S sends all currently tagged emails to a shell command, in sorted order. Every email executes the shell command independently. .IP t tags the currently highlighted email. .IP T tags all listed emails. .IP v sends the currently highlighted email to $PAGER for viewing. If the environment variable PAGER is not defined, sends the email to .BR less (1). .IP u untags the highlighted email. .IP U untags all listed emails. .IP z reverses the sort order of displayed emails. .IP / searches for a regular expression (see .BR regex (7)) anywhere within the contents of all listed emails. Hides all emails which don't match. .IP ? like /, but hides all emails which match, keeping all those which don't match. .PP As a convenience, the function keys F1-F10 can each be associated with a shell command string. In this case, typing a function key has the same effect as the S key, but the command is already typed and ready to be edited/accepted. The function key associations are read from the configuration file .mailinspectrc if it exits. .SH FILES .PP .IP $HOME/.mailinspectrc .B mailinspect reads the file .mailinspectrc in the $HOME directory, if it exists. This is a plain text file which contains entries of the form .IP .na # this is a comment .br F2 cat >> interesting.mbox .br F5 mail zarniwoop@megadodo.com .ad .SH ENVIRONMENT .PP .IP DBACL_PATH When this variable is set, its value is prepended to every .I category filename which doesn't start with a '/'. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR bayesol (1), .BR dbacl (1), .BR less (1), .BR mailcross (1), .BR regex (7) dbacl-1.14.1/man/mailtoe.1in000066400000000000000000000307161325773323600155030ustar00rootroot00000000000000\" t .TH MAILTOE 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME mailtoe \- a train-on-error simulator for use with dbacl. .SH SYNOPSIS .HP .B mailtoe .I command [ .I command_arguments ] .SH DESCRIPTION .PP .B mailtoe automates the task of testing email filtering and classification programs such as .BR dbacl (1). Given a set of categorized documents, mailtoe initiates test runs to estimate the classification errors and thereby permit fine tuning of the parameters of the classifier. .PP Train-on-error (TOE) is a learning method which is sometimes advocated for email classifiers. Given an incoming email stream, the method consists in reusing a fixed set of category databases until the first misclassification occurs. At that point, the offending email is used to relearn the relevant category, until the next misclassification. In this way, categories are only updated when errors occur. This directly models the way that some email classifiers are used in practice. .PP TOE's error rates depend directly on the order in which emails are seen. A small change in ordering, as might happen due to networking delays, can have a large impact on the number of misclassifications. Consequently, .B mailtoe does not give meaningful results, unless the sample emails are chosen carefully. However, as this method is commonly used by spam filters, it is still worth computing to foster comparisons. Other methods (see .BR mailcross (1), mailfoot (1)) attempt to capture the behaviour of classification errors in other ways. .PP To improve and stabilize the error rate calculation, .B mailtoe performs the TOE simulations several times on slightly reordered email streams, and averages the results. The reorderings occur by multiplexing the emails from each category mailbox in random order. Thus if there are three categories, the first email classified is chosen randomly from the front of the sample email streams of each type. The second email is also chosen randomly among the three types, from the front of the streams after the first email was removed. Simulation stops when all sample streams are exhausted. .PP .B mailtoe uses the environment variable MAILTOE_FILTER when executing, which permits the simulation of arbitrary filters, provided these satisfy the compatibility conditions stated in the ENVIRONMENT section below. .PP For convenience, .B mailtoe implements a .B testsuite framework with predefined wrappers for several open source classifiers. This permits the direct comparison of .BR dbacl (1) with competing classifiers on the same set of email samples. See the USAGE section below. .PP During preparation, .B mailtoe builds a subdirectory named mailtoe.d in the current working directory. All needed calculations are performed inside this subdirectory. .SH EXIT STATUS .B mailtoe returns 0 on success, 1 if a problem occurred. .SH COMMANDS .PP .PP .IP "\fBprepare\fR \fIsize\fR" Prepares a subdirectory named mailtoe.d in the current working directory, and populates it with empty subdirectories for exactly .I size subsets. .IP "\fBadd\fR \fIcategory\fR [ \fIFILE\fR ]..." Takes a set of emails from either \fIFILE\fR if specified, or STDIN, and associates them with .IR category . The ordering of emails within \fIFILE\fR is preserved, and subsequent \fIFILE\fRs are appended to the first in each category. This command can be repeated several times, but should be executed at least once. .IP "\fBclean\fR" Deletes the directory mailtoe.d and all its contents. .IP "\fBrun\fR" Multiplexes randomly from the email streams added earlier, and relearns categories only when a misclassification occurs. The simulation is repeated .I size times. .IP "\fBsummarize\fR" Prints average error rates for the simulations. .IP "\fBplot\fR [ \fIps\fR | \fIlogscale\fR ]..." Plots the number of errors over simulation time. The "ps" option, if present, writes the plot to a postscript file in the directory mailtoe/plots, instead of being shown on-screen. The "logscale" option, if present, causes the plot to be on the log scale for both ordinates. .IP "\fBreview\fR \fItruecat\fR \fIpredcat\fR" Scans the last run statistics and extracts all the messages which belong to category .I truecat but have been classified into category .IR predcat . The extracted messages are copied to the directory .I mailtoe.d/review for perusal. .PP .IP "\fBtestsuite list\fR" Shows a list of available filters/wrapper scripts which can be selected. .IP "\fBtestsuite select\fR [ \fIFILTER\fR ]..." Prepares the filter(s) named .I FILTER to be used for simulation. The filter name is the name of a wrapper script located in the directory .IR @PKGDATADIR@/testsuite . Each filter has a rigid interface documented below, and the act of selecting it copies it to the .I mailtoe.d/filters directory. Only filters located there are used in the simulations. .IP "\fBtestsuite deselect\fR [ \fIFILTER\fR ]..." Removes the named filter(s) from the directory .I mailtoe.d/filters so that they are not used in the simulation. .IP "\fBtestsuite run\fR [ \fIplots\fR ]" Invokes every selected filter on the datasets added previously, and calculates misclassification rates. If the "plots" option is present, each filter simulation is plotted as a postscript file in the directory .IR mailtoe.d/plots . .IP "\fBtestsuite status\fR" Describes the scheduled simulations. .IP "\fBtestsuite summarize\fR" Shows the cross validation results for all filters. Only makes sense after the .I run command. .SH USAGE .PP The normal usage pattern is the following: first, you should separate your email collection into several categories (manually or otherwise). Each category should be associated with one or more folders, but each folder should not contain more than one category. Next, you should decide how many runs to use, say 10. The more runs you use, the better the predicted error rates. However, more runs take more time. Now you can type .HP .na % mailtoe prepare 10 .ad .PP Next, for every category, you must add every folder associated with this category. Suppose you have three categories named .IR spam , .IR work , and .IR play , which are associated with the mbox files .IR spam.mbox , .IR work.mbox , and .IR play.mbox respectively. You would type .PP .na % mailtoe add spam spam.mbox .br % mailtoe add work work.mbox .br % mailtoe add play play.mbox .ad .PP You should aim for a similar number of emails in each category, as the random multiplexing will be unbalanced otherwise. The ordering of the email messages in each .I *.mbox file is important, and is preserved during each simulation. If you repeatedly add to the same category, the later mailboxes will be appended to the first, preserving the implied ordering. .PP You can now perform as many TOE simulations as desired. The multiplexed emails are classified and learned one at a time, by executing the command given in the environment variable MAILTOE_FILTER. If not set, a default value is used. .PP .na % mailtoe run .br % mailtoe summarize .ad .PP The testsuite commands are designed to simplify the above steps and allow comparison of a wide range of email classifiers, including but not limited to .BR dbacl . Classifiers are supported through wrapper scripts, which are located in the .I @PKGDATADIR@/testsuite directory. .PP The first stage when using the testsuite is deciding which classifiers to compare. You can view a list of available wrappers by typing: .PP .na % mailtoe testsuite list .ad .PP Note that the wrapper scripts are NOT the actual email classifiers, which must be installed separately by your system administrator or otherwise. Once this is done, you can select one or more wrappers for the simulation by typing, for example: .PP .na % mailtoe testsuite select dbaclA ifile .ad .PP If some of the selected classifiers cannot be found on the system, they are not selected. Note also that some wrappers can have hard-coded category names, e.g. if the classifier only supports binary classification. Heed the warning messages. .PP It remains only to run the simulation. Beware, this can take a long time (several hours depending on the classifier). .PP .na % mailtoe testsuite run .br % mailtoe testsuite summarize .ad .PP Once you are all done, you can delete the working files, log files etc. by typing .PP .na % mailtoe clean .ad .SH SCRIPT INTERFACE .PP .B mailtoe testsuite takes care of learning and classifying your prepared email corpora for each selected classifier. Since classifiers have widely varying interfaces, this is only possible by wrapping those interfaces individually into a standard form which can be used by .BR "mailtoe testsuite" . .PP Each wrapper script is a command line tool which accepts a single command followed by zero or more optional arguments, in the standard form: .PP .na wrapper command [argument]... .ad .PP Each wrapper script also makes use of STDIN and STDOUT in a well defined way. If no behaviour is described, then no output or input should be used. The possible commands are described below: .IP filter In this case, a single email is expected on STDIN, and a list of category filenames is expected in $2, $3, etc. The script writes the category name corresponding to the input email on STDOUT. No trailing newline is required or expected. .IP learn In this case, a standard mbox stream is expected on STDIN, while a suitable category file name is expected in $2. No output is written to STDOUT. .IP clean In this case, a directory is expected in $2, which is examined for old database information. If any old databases are found, they are purged or reset. No output is written to STDOUT. .IP describe IN this case, a single line of text is written to STDOUT, describing the filter's functionality. The line should be kept short to prevent line wrapping on a terminal. .IP bootstrap In this case, a directory is expected in $2. The wrapper script first checks for the existence of its associated classifier, and other prerequisites. If the check is successful, then the wrapper is cloned into the supplied directory. A courtesy notification should be given on STDOUT to express success or failure. It is also permissible to give longer descriptions caveats. .IP toe In this case, a list of categories is expected in $3, $4, etc. Every possible category must be listed. Preceding this list, the true category is given in $2. .IP foot Used by .BR mailfoot (1). .SH ENVIRONMENT .PP Right after loading, .B mailtoe reads the hidden file .mailtoerc in the $HOME directory, if it exists, so this would be a good place to define custom values for environment variables. .IP MAILTOE_FILTER This variable contains a shell command to be executed repeatedly during the running stage. The command should accept an email message on STDIN and output a resulting category name. On the command line, it should also accept first the true category name, then a list of all possible category file names. If the output category does not match the true category, then the relevant categories are assumed to have been silently updated/relearned. If MAILTOE_FILTER is undefined, .B mailtoe uses a default value. .IP TEMPDIR This directory is exported for the benefit of wrapper scripts. Scripts which need to create temporary files should place them a the location given in TEMPDIR. .SH NOTES .PP The subdirectory mailtoe.d can grow quite large. It contains a full copy of the training corpora, as well as learning files for .I size times all the added categories, and various log files. .PP While TOE simulations for .BR dbacl (1) can be used to compare with other classifiers, TOE should not be used for real world classifications. This is because, unlike many other filters, .BR dbacl (1) learns evidence weights in a nonlinear way, and does not preserve relative weights between tokens, even if those tokens aren't seen in new emails. .SH WARNING .PP Because the ordering of emails within the added mailboxes matters, the estimated error rates are not well defined or even meaningful in an objective sense. However, if the sample emails represent an actual snapshot of a user's incoming email, then the error rates are somewhat meaningful. The simulations can then be interpreted as alternate realities where a given classifier would have intercepted the incoming mail. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR bayesol (1) .BR dbacl (1), .BR mailinspect (1), .BR mailcross (1), .BR mailfoot (1), .BR regex (7) dbacl-1.14.1/man/spherecl.1in000066400000000000000000000054431325773323600156550ustar00rootroot00000000000000\" t .TH SPHERECL 1 "Bayesian Text Classification Tools" "Version @VERSION@" "" .SH NAME sphercl \- a spam header reweighting classifier for binary email filtering. .SH SYNOPSIS .HP .B spherecl [-@] -C .I category1:category2 [-l .I category] [FILE]... .HP .B spherecl -V .SH DESCRIPTION .PP .B THIS TOOL IS NOT READY FOR USE. IT IS A WORK IN PROGRESS. .PP .B spherecl is a (binary) Bayesian email classifier. It expects one or more FILE(s) containing single email messages in RFC2822 format, and outputs for each a best guess category name, which is either category1 or category2. If the .B -l switch is used, spherecl learns the messages in FILE(s) as examples of the category (which must be one of category1 or category2), rather than classifying the messages. .PP spherecl in fact delegates some of its work to dbacl(1) behind the scenes. Essentially, it modifies the dbacl scores to retroactively give more weight to header tokens in such a way as to try to maximize the binary classification ROC score. .PP Because spherecl must make certain assumptions about the dbacl output, it contains a hardcoded list of command line options for dbacl. These options cannot be adjusted, however it is possible to pass additional options to dbacl if desired (not recommended). .SH EXIT STATUS The normal shell exit conventions aren't followed (sorry!). When using the .B -l command form, .B spherecl returns zero on success, nonzero if an error occurs. When using the .B -c form, .B spherecl returns a positive integer corresponding to the best .IR category . If an error occurs, .B spherecl returns zero. .SH OPTIONS .IP -@ This is a marker switch. It can be used to tell spherecl to stop analyzing switches that follow the marker. These switches will be passed on to the dbacl child process verbatim. Note that spherecl expects the mandatory .B -l or .B -c switches to be used before .IR -@ . Use with caution. .IP -C This switch is mandatory. It identifies the binary model uses by spherecl. .IP -l When this switch is used, spherecl considers each FILE to be a mail message that must be learned as an example of category. Note that when this switch is absent, spherecl will classify each FILE as one of category1 or category2. .SH USAGE .PP See the documentation for dbacl regarding email filtering. .SH ENVIRONMENT .PP .IP DBACL_PATH When this variable is set, its value is prepended to every .I category filename which doesn't start with a '/' or a '.'. .SH SOURCE .PP The source code for the latest version of this program is available at the following locations: .PP .na http://www.lbreyer.com/gpl.html .br http://dbacl.sourceforge.net .ad .SH AUTHOR .PP Laird A. Breyer .SH SEE ALSO .PP .BR dbacl (1), .BR bayesol (1), .BR hmine (1), .BR hypex (1), .BR mailcross (1), .BR mailfoot (1), .BR mailinspect (1), .BR mailtoe (1) dbacl-1.14.1/src/000077500000000000000000000000001325773323600134455ustar00rootroot00000000000000dbacl-1.14.1/src/Makefile.am000066400000000000000000000041471325773323600155070ustar00rootroot00000000000000# note . occurs before tests SUBDIRS = . tests bin_PROGRAMS = dbacl bayesol mailinspect hmine hypex bin_SCRIPTS = mailcross mailtoe mailfoot PUBDOM = jenkins.c jenkins2.c \ mconf.h mtherr.c igam.c gamma.c const.c polevl.c isnan.c ndtr.c datarootdir ?= $(prefix)/share dbacl_SOURCES = dbacl.c dbacl.h fram.c catfun.c fh.c util.c util.h probs.c $(PUBDOM) dbacl_LDADD = mb.o wc.o EXTRA_dbacl_SOURCES = mbw.h mbw.c splintrc lint-check.sh bayesol_SOURCES = bayesol.c bayesol.h fram.c risk-lexer.l risk-parser.y risk-parser.h probs.c util.c util.h $(PUBDOM) bayesol_LDADD = @LEXLIB@ mailinspect_SOURCES = mailinspect.c mailinspect.h dbacl.h fram.c fh.c catfun.c probs.c util.c util.h $(PUBDOM) mailinspect_LDADD = mb.o wc.o $(LDADDINTER) INCLUDES = $(INCLUDESINTER) EXTRA_mailinspect_SOURCES = mbw.h mbw.c hmine_SOURCES = hmine.c hmine.h hparse.c fram.c util.h util.c dbacl.h rfc822.c rfc2822.c $(PUBDOM) hypex_SOURCES = hypex.c hypex.h dbacl.h fram.c catfun.c util.h util.c probs.c $(PUBDOM) # stuff_SOURCES = stuff.c stuff.h fram.c stuff-lexer.l stuff-parser.y stuff-parser.h probs.c util.c util.h $(PUBDOM) # stuff_LDADD = @LEXLIB@ AM_CFLAGS = -funsigned-char -std=c99 -Wall -pedantic $(CFLAGSIEEE) -O3 AM_YFLAGS = -d CLEANFILES = mailcross mailtoe mailfoot EXTRA_DIST = README mailcross.in mailtoe.in mailfoot.in mailtest.functions.in plot-scores.sh mb.o: mbw.c dbacl.h mbw.h $(COMPILE) -DMBW_MB -c $(srcdir)/mbw.c -o $@ wc.o: mbw.c dbacl.h mbw.h $(COMPILE) -DMBW_WIDE -c $(srcdir)/mbw.c -o $@ SUFFIXES = .in .in: cat $< \ | sed -e '/# begin mailtest.functions/r mailtest.functions.in' \ | sed -e '/# begin mailtest/,/# begin mailtest/d;/# end/,/# end/d' \ | sed -e "s|[@]VERSION@|$(VERSION)|g;s|[@]PKGDATADIR@|$(pkgdatadir)|g" \ > $@ chmod +x $@ check_PROGRAMS = icheck pcheck icheck_SOURCES = icheck.c dbacl.h fram.c catfun.c util.c util.h fh.c probs.c $(PUBDOM) icheck_LDADD = mb.o wc.o pcheck_SOURCES = hparse.c pcheck: hparse.c hmine.h dbacl.h rfc822.c rfc2822.c $(COMPILE) -DTEST_PARSER $(srcdir)/hparse.c $(srcdir)/rfc822.c $(srcdir)/rfc2822.c util.o fram.o jenkins2.o -o pcheck lint-check: sh ./lint-check.sh dbacl-1.14.1/src/Makefile.in000066400000000000000000000753271325773323600155300ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = dbacl$(EXEEXT) bayesol$(EXEEXT) mailinspect$(EXEEXT) \ hmine$(EXEEXT) hypex$(EXEEXT) check_PROGRAMS = icheck$(EXEEXT) pcheck$(EXEEXT) subdir = src DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in TODO risk-lexer.c risk-parser.c \ risk-parser.h ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = jenkins.$(OBJEXT) jenkins2.$(OBJEXT) mtherr.$(OBJEXT) \ igam.$(OBJEXT) gamma.$(OBJEXT) const.$(OBJEXT) \ polevl.$(OBJEXT) isnan.$(OBJEXT) ndtr.$(OBJEXT) am_bayesol_OBJECTS = bayesol.$(OBJEXT) fram.$(OBJEXT) \ risk-lexer.$(OBJEXT) risk-parser.$(OBJEXT) probs.$(OBJEXT) \ util.$(OBJEXT) $(am__objects_1) bayesol_OBJECTS = $(am_bayesol_OBJECTS) bayesol_DEPENDENCIES = am_dbacl_OBJECTS = dbacl.$(OBJEXT) fram.$(OBJEXT) catfun.$(OBJEXT) \ fh.$(OBJEXT) util.$(OBJEXT) probs.$(OBJEXT) $(am__objects_1) dbacl_OBJECTS = $(am_dbacl_OBJECTS) dbacl_DEPENDENCIES = mb.o wc.o am_hmine_OBJECTS = hmine.$(OBJEXT) hparse.$(OBJEXT) fram.$(OBJEXT) \ util.$(OBJEXT) rfc822.$(OBJEXT) rfc2822.$(OBJEXT) \ $(am__objects_1) hmine_OBJECTS = $(am_hmine_OBJECTS) hmine_LDADD = $(LDADD) am_hypex_OBJECTS = hypex.$(OBJEXT) fram.$(OBJEXT) catfun.$(OBJEXT) \ util.$(OBJEXT) probs.$(OBJEXT) $(am__objects_1) hypex_OBJECTS = $(am_hypex_OBJECTS) hypex_LDADD = $(LDADD) am_icheck_OBJECTS = icheck.$(OBJEXT) fram.$(OBJEXT) catfun.$(OBJEXT) \ util.$(OBJEXT) fh.$(OBJEXT) probs.$(OBJEXT) $(am__objects_1) icheck_OBJECTS = $(am_icheck_OBJECTS) icheck_DEPENDENCIES = mb.o wc.o am_mailinspect_OBJECTS = mailinspect.$(OBJEXT) fram.$(OBJEXT) \ fh.$(OBJEXT) catfun.$(OBJEXT) probs.$(OBJEXT) util.$(OBJEXT) \ $(am__objects_1) mailinspect_OBJECTS = $(am_mailinspect_OBJECTS) am__DEPENDENCIES_1 = mailinspect_DEPENDENCIES = mb.o wc.o $(am__DEPENDENCIES_1) am_pcheck_OBJECTS = hparse.$(OBJEXT) pcheck_OBJECTS = $(am_pcheck_OBJECTS) pcheck_LDADD = $(LDADD) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) YLWRAP = $(top_srcdir)/config/ylwrap YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) SOURCES = $(bayesol_SOURCES) $(dbacl_SOURCES) $(EXTRA_dbacl_SOURCES) \ $(hmine_SOURCES) $(hypex_SOURCES) $(icheck_SOURCES) \ $(mailinspect_SOURCES) $(EXTRA_mailinspect_SOURCES) \ $(pcheck_SOURCES) DIST_SOURCES = $(bayesol_SOURCES) $(dbacl_SOURCES) \ $(EXTRA_dbacl_SOURCES) $(hmine_SOURCES) $(hypex_SOURCES) \ $(icheck_SOURCES) $(mailinspect_SOURCES) \ $(EXTRA_mailinspect_SOURCES) $(pcheck_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # note . occurs before tests SUBDIRS = . tests bin_SCRIPTS = mailcross mailtoe mailfoot PUBDOM = jenkins.c jenkins2.c \ mconf.h mtherr.c igam.c gamma.c const.c polevl.c isnan.c ndtr.c dbacl_SOURCES = dbacl.c dbacl.h fram.c catfun.c fh.c util.c util.h probs.c $(PUBDOM) dbacl_LDADD = mb.o wc.o EXTRA_dbacl_SOURCES = mbw.h mbw.c splintrc lint-check.sh bayesol_SOURCES = bayesol.c bayesol.h fram.c risk-lexer.l risk-parser.y risk-parser.h probs.c util.c util.h $(PUBDOM) bayesol_LDADD = @LEXLIB@ mailinspect_SOURCES = mailinspect.c mailinspect.h dbacl.h fram.c fh.c catfun.c probs.c util.c util.h $(PUBDOM) mailinspect_LDADD = mb.o wc.o $(LDADDINTER) INCLUDES = $(INCLUDESINTER) EXTRA_mailinspect_SOURCES = mbw.h mbw.c hmine_SOURCES = hmine.c hmine.h hparse.c fram.c util.h util.c dbacl.h rfc822.c rfc2822.c $(PUBDOM) hypex_SOURCES = hypex.c hypex.h dbacl.h fram.c catfun.c util.h util.c probs.c $(PUBDOM) # stuff_SOURCES = stuff.c stuff.h fram.c stuff-lexer.l stuff-parser.y stuff-parser.h probs.c util.c util.h $(PUBDOM) # stuff_LDADD = @LEXLIB@ AM_CFLAGS = -funsigned-char -std=c99 -Wall -pedantic $(CFLAGSIEEE) -O3 AM_YFLAGS = -d CLEANFILES = mailcross mailtoe mailfoot EXTRA_DIST = README mailcross.in mailtoe.in mailfoot.in mailtest.functions.in plot-scores.sh SUFFIXES = .in icheck_SOURCES = icheck.c dbacl.h fram.c catfun.c util.c util.h fh.c probs.c $(PUBDOM) icheck_LDADD = mb.o wc.o pcheck_SOURCES = hparse.c all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .in .c .l .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) risk-parser.h: risk-parser.c @if test ! -f $@; then rm -f risk-parser.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) risk-parser.c; else :; fi bayesol$(EXEEXT): $(bayesol_OBJECTS) $(bayesol_DEPENDENCIES) $(EXTRA_bayesol_DEPENDENCIES) @rm -f bayesol$(EXEEXT) $(LINK) $(bayesol_OBJECTS) $(bayesol_LDADD) $(LIBS) dbacl$(EXEEXT): $(dbacl_OBJECTS) $(dbacl_DEPENDENCIES) $(EXTRA_dbacl_DEPENDENCIES) @rm -f dbacl$(EXEEXT) $(LINK) $(dbacl_OBJECTS) $(dbacl_LDADD) $(LIBS) hmine$(EXEEXT): $(hmine_OBJECTS) $(hmine_DEPENDENCIES) $(EXTRA_hmine_DEPENDENCIES) @rm -f hmine$(EXEEXT) $(LINK) $(hmine_OBJECTS) $(hmine_LDADD) $(LIBS) hypex$(EXEEXT): $(hypex_OBJECTS) $(hypex_DEPENDENCIES) $(EXTRA_hypex_DEPENDENCIES) @rm -f hypex$(EXEEXT) $(LINK) $(hypex_OBJECTS) $(hypex_LDADD) $(LIBS) icheck$(EXEEXT): $(icheck_OBJECTS) $(icheck_DEPENDENCIES) $(EXTRA_icheck_DEPENDENCIES) @rm -f icheck$(EXEEXT) $(LINK) $(icheck_OBJECTS) $(icheck_LDADD) $(LIBS) mailinspect$(EXEEXT): $(mailinspect_OBJECTS) $(mailinspect_DEPENDENCIES) $(EXTRA_mailinspect_DEPENDENCIES) @rm -f mailinspect$(EXEEXT) $(LINK) $(mailinspect_OBJECTS) $(mailinspect_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bayesol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/catfun.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/const.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbacl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icheck.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/igam.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isnan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jenkins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jenkins2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mailinspect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtherr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndtr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polevl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/probs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfc2822.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfc822.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/risk-lexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/risk-parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .l.c: $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f risk-lexer.c -rm -f risk-parser.c -rm -f risk-parser.h clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-generic ctags ctags-recursive \ distclean distclean-compile distclean-generic distclean-hdr \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-binSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-binSCRIPTS datarootdir ?= $(prefix)/share mb.o: mbw.c dbacl.h mbw.h $(COMPILE) -DMBW_MB -c $(srcdir)/mbw.c -o $@ wc.o: mbw.c dbacl.h mbw.h $(COMPILE) -DMBW_WIDE -c $(srcdir)/mbw.c -o $@ .in: cat $< \ | sed -e '/# begin mailtest.functions/r mailtest.functions.in' \ | sed -e '/# begin mailtest/,/# begin mailtest/d;/# end/,/# end/d' \ | sed -e "s|[@]VERSION@|$(VERSION)|g;s|[@]PKGDATADIR@|$(pkgdatadir)|g" \ > $@ chmod +x $@ pcheck: hparse.c hmine.h dbacl.h rfc822.c rfc2822.c $(COMPILE) -DTEST_PARSER $(srcdir)/hparse.c $(srcdir)/rfc822.c $(srcdir)/rfc2822.c util.o fram.o jenkins2.o -o pcheck lint-check: sh ./lint-check.sh # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/src/README000066400000000000000000000005621325773323600143300ustar00rootroot00000000000000Some files in the src directory are in the public domain or freely redistributable. Copyright belongs to their respective authors, and is marked in the files. Public domain hash function (c) by Bob Jenkins: jenkins.c jenkins2.c Special functions from the Cephes math library (c) by Stephen L. Moshier: mconf.h mtherr.c igam.c gamma.c const.c polevl.c isnan.c ndtr.cdbacl-1.14.1/src/TODO000066400000000000000000000000351325773323600141330ustar00rootroot00000000000000binhex uudecode yenc rfc1843 dbacl-1.14.1/src/bayesol.c000066400000000000000000000517211325773323600152550ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ /* * Note to regenerate the Makefile and configure script: * aclocal * autoconf * touch NEWS README AUTHORS ChangeLog * automake -a */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #if defined HAVE_UNISTD_H #include #endif #include #if defined HAVE_MBRTOWC #include #include #endif #include #include #include "util.h" #include "bayesol.h" /* global variables */ extern options_t u_options; extern options_t m_options; extern char *progname; extern char *inputfile; extern long inputline; Spec spec; /* used in risk-parser */ extern char *textbuf; extern charbuf_len_t textbuf_len; extern char *aux_textbuf; extern charbuf_len_t aux_textbuf_len; #if defined HAVE_MBRTOWC extern wchar_t *wc_textbuf; extern charbuf_len_t wc_textbuf_len; #endif /* for option processing */ extern char *optarg; extern int optind, opterr, optopt; options_t options = 0; char *title = ""; /* parser interface */ extern int parse_loss_vec(category_count_t i, char *buf); extern int parse_risk_spec(FILE *input); bool_t found_scores = 0; extern int cmd; int exit_code = 0; /* default */ /*********************************************************** * MISCELLANEOUS FUNCTIONS * ***********************************************************/ static void usage(char **argv) { fprintf(stderr, "\n"); fprintf(stderr, "bayesol [-vinN] -c RISKSPEC [FILE]...\n"); fprintf(stderr, " calculates the optimal Bayes solution using RISKSPEC, with\n"); fprintf(stderr, " input from FILE or STDIN.\n"); fprintf(stderr, "\n"); fprintf(stderr, "bayesol -V\n"); fprintf(stderr, "\n"); fprintf(stderr, " prints program version.\n"); } void print_line() { fprintf(stdout, "%s", textbuf); } void init_spec() { category_count_t i; spec.num_cats = 0; spec.num_priors = 0; for( i = 0; i < MAX_CAT; spec.loss_list[i++] = NULL); for( i = 0; i < MAX_CAT; spec.cross_entropy[i++] = 0.0); for( i = 0; i < MAX_CAT; spec.complexity[i++] = 0.0); } /*********************************************************** * PARSING RELATED FUNCTIONS * ***********************************************************/ /* this function is called before processing each file. It constructs a linked list of regular expressions if there are any. Each regex is associated with the string representation of the corresponding loss vector */ void setup_regexes() { category_count_t i; bool_t has_empty_string; LossVector *p; RegMatch *q, *r; for( i = 0; i < spec.num_cats; i++ ) { /* if spec.loss_list[i] does not contain a LossVector whose regex is the empty string, then this specification is not complete and we exit */ if( spec.loss_list[i] == NULL ) { errormsg(E_FATAL, "missing loss_matrix entry for category %s\n", spec.catname[i]); } else { has_empty_string = 0; /* step through the list of vectors looking for regexes */ for(p = spec.loss_list[i]; p != NULL; p = p->next) { if( !(p->re[0]) ) { has_empty_string = 1; p->found = 1; } else { /* it's a genuine regex, try compiling it */ q = malloc(sizeof(RegMatch)); if(q) { /* GNU regexes accept ordinary strings */ if( regcomp(&(q->reg), p->re, REG_EXTENDED) == 0 ) { p->found = 0; q->lv = p; q->next = NULL; } else { errormsg(E_WARNING, "couldn't compile regex '%s', ignoring\n", p->re); free(q); q = NULL; } } else { errormsg(E_WARNING, "no memory for regex '%s', ignoring\n", p->re); } /* add this regex to the list we have to check online */ if( spec.regs == NULL ) { spec.regs = q; } else { for(r = spec.regs; r->next != NULL; r = r->next); r->next = q; } } } /* consistency check */ if( !has_empty_string ) { errormsg(E_FATAL, "missing loss_matrix entry for category %s (need \"\" case)\n", spec.catname[i]); } } } } /* parses the dbacl scores. Format used is scores [cat s * c]... Note: destroys the buf */ int parse_dbacl_scores(char *buf) { char *tok; category_count_t index, counter; /* first token is scores */ tok = strtok(buf, "# \n"); counter = 0; /* next gobble up tokens four at a time */ while(tok) { /* first we get the category name/index */ if( !(tok = strtok(NULL, " \n")) ) { break; } else { for(index = 0; index < spec.num_cats; index++) { if( strcmp(spec.catname[index], tok) == 0 ) { break; } } if( index == spec.num_cats ) { return 0; } } /* now that we have the index, associate the cross entropy */ if( !(tok = strtok(NULL, " \n")) ) { errormsg(E_ERROR, "scores in wrong format\n"); return 0; } else { spec.cross_entropy[index] = strtod(tok, NULL); } /* now skip the '*' */ if( !(tok = strtok(NULL, " \n")) ) { errormsg(E_ERROR, "scores in wrong format\n"); return 0; } /* now get the complexity */ if( !(tok = strtok(NULL, " \n")) ) { errormsg(E_ERROR, "scores in wrong format\n"); return 0; } else { spec.complexity[index] = strtod(tok, NULL); } counter++; } /* last consistency check */ if( counter > spec.num_cats ) { return 0; } else { found_scores = 1; return 1; } } void finish_parsing() { category_count_t i; LossVector *p; real_value_t min_complexity, max_complexity; /* consistency checks */ if( !found_scores ) { errormsg(E_FATAL, "no scores found. Did you use dbacl with the -a switch?\n"); } else { min_complexity = spec.complexity[0]; max_complexity = spec.complexity[0]; for(i = 0; i < spec.num_cats; i++) { if( !spec.catname[i] ) { errormsg(E_FATAL, "too few categories scored. Is your risk specification correct?\n"); exit(0); } min_complexity = (min_complexity < spec.complexity[i]) ? min_complexity : spec.complexity[i]; max_complexity = (max_complexity > spec.complexity[i]) ? max_complexity : spec.complexity[i]; } if( min_complexity < MEANINGLESS_THRESHOLD * max_complexity ) { errormsg(E_WARNING, "\n" " There is a significant disparity between the complexities\n" " reported under each category. This most likely indicates that\n" " you've chosen categories whose features aren't comparable.\n" "\n" " The Bayes solution calculations will be meaningless.\n\n"); } } /* first, we must finish building the loss matrix We pick for each category the first lossvector which reported a match */ for(i = 0; i < spec.num_cats; i++) { for(p = spec.loss_list[i]; p != NULL; p = p->next) { if( p->found ) { break; } } if( p == NULL ) { errormsg(E_ERROR, "something's wrong with loss_list.\n"); } else { /* now build the ith row of the loss matrix */ if( options & (1<ve); } if( parse_loss_vec(i, p->ve) != 0 ) { errormsg(E_FATAL, "couldn't parse spec for (%s, \"%s\")\n", spec.catname[i], p->re); } } } if( options & (1< *((real_value_t *)b)) ? -1 : 1; } /* now we are ready to score the losses This is a simple matrix multiplication, but because the entries are all exponentials with enormously varying exponents, the simple calculation fails due to massive precision problems. We approximate the true minimization by comparing the magnitude of the individual terms. The scores output via OPTION_SCORES are only approximate. */ category_count_t score_losses() { category_count_t i, j; real_value_t tmp[MAX_CAT], min_tmp[MAX_CAT]; real_value_t norm, score, min_score; category_count_t min_cat; if( options & (1< 0 ) { break; } else if( norm < 0 ) { memcpy(min_tmp, tmp, sizeof(real_value_t) * spec.num_cats); min_cat = i; min_score = min_tmp[0]; /* norm; */ } else { /* they're equal, continue loop */ } } if( options & (1<next) { if( regexec(&(r->reg), textbuf, MAX_SUBMATCH, pmatch, 0) == 0 ) { r->lv->found = 1; /* convert each submatch to a number - pad remaining elements to zero */ for(z = 1; z < MAX_SUBMATCH; z++) { if(pmatch[z].rm_so > -1) { r->lv->sm[z-1] = strtod(textbuf + pmatch[z].rm_so, NULL); } else { r->lv->sm[z-1] = 0.0; } } if( options & (1<lv->re); for(z = 1; (z < MAX_SUBMATCH) && (pmatch[z].rm_so > -1); z++) { fprintf(stdout, " %f", r->lv->sm[z-1]); } fprintf(stdout, "\n"); } } } } } } /*********************************************************** * WIDE CHARACTER FILE HANDLING FUNCTIONS * * this is needed for any locale whose character set * * encoding can include NUL bytes inside characters * * * * Actually, at present this is quite useless. But it might* * prove handy in the future. * ***********************************************************/ #if defined HAVE_MBRTOWC /* reads a text file as input, converting each line into a wide character representation and applies several filters. */ void w_b_process_file(FILE *input, void (*line_fun)(void)) { mbstate_t input_shiftstate; category_count_t i; RegMatch *r; regmatch_t pmatch[MAX_SUBMATCH]; submatch_order_t z; int extra_lines = 2; memset(&input_shiftstate, 0, sizeof(mbstate_t)); while( fill_textbuf(input, &extra_lines) ) { if( !fill_wc_textbuf(textbuf, &input_shiftstate) ) { continue; } /* now summarize this line if required */ if( line_fun ) { (*line_fun)(); } /* the scores are written by dbacl, so there's no need for the conversion */ if( (textbuf[0] == 's') && (strncmp(MAGIC, textbuf, 7) == 0) ) { if( !parse_dbacl_scores(textbuf) ) { errormsg(E_FATAL, "scores don't match risk specification\n"); } else if( options & (1<next) { if( regexec(&(r->reg), textbuf, MAX_SUBMATCH, pmatch, 0) == 0 ) { r->lv->found = 1; /* convert each submatch to a number - pad remaining elements to zero */ for(z = 1; z < MAX_SUBMATCH; z++) { if(pmatch[z].rm_so > -1) { r->lv->sm[z-1] = strtod(textbuf + pmatch[z].rm_so, NULL); } else { r->lv->sm[z-1] = 0.0; } } if( options & (1<lv->re); for(z = 1; (z < MAX_SUBMATCH) && (pmatch[z].rm_so > -1); z++) { fprintf(stdout, " %f", r->lv->sm[z-1]); } fprintf(stdout, "\n"); } } } } } } #endif /* HAVE_WCHAR_H */ /*********************************************************** * MAIN FUNCTIONS * ***********************************************************/ int main(int argc, char **argv) { FILE *input; signed char op; void (*preprocess_fun)(void) = NULL; void (*line_fun)(void) = NULL; void (*postprocess_fun)(void) = NULL; progname = "bayesol"; inputfile = "stdin"; inputline = 0; /* set up internationalization */ if( !setlocale(LC_ALL, "") ) { errormsg(E_WARNING, "could not set locale, internationalization disabled\n"); } else { if( options & (1< -1 ) { switch(op) { case 'V': fprintf(stdout, "bayesol version %s\n", VERSION); fprintf(stdout, COPYBLURB, "bayesol"); exit(1); break; case 'n': options |= (1< -1) && *(argv + optind) ) { /* if it's a filename, process it */ if( (input = fopen(argv[optind], "rb")) ) { inputfile = argv[optind]; options |= (1< */ #ifndef BAYESOL_H #define BAYESOL_H #ifdef HAVE_CONFIG_H #undef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "dbacl.h" typedef double real_value_t; typedef u_int8_t submatch_order_t; #define BUFLEN ((charbuf_len_t)1024) /* options */ #define OPTION_RISKSPEC 1 #define OPTION_SCORES 4 #define OPTION_VERBOSE 5 #define INPUT_FROM_CMDLINE 6 #define OPTION_FILTER 10 #define OPTION_DEBUG 15 #define OPTION_I18N 16 #define OPTION_SCORES_EX 17 /* when the ratio of complexities is below this value, flag a problem */ #define MEANINGLESS_THRESHOLD 0.9 /* macros */ /* data structures */ typedef struct lvec { char *re; char *ve; bool_t found; struct lvec *next; real_value_t sm[MAX_SUBMATCH]; } LossVector; typedef struct regm { regex_t reg; LossVector *lv; struct regm *next; } RegMatch; typedef struct { category_count_t num_cats; category_count_t num_priors; char* catname[MAX_CAT]; real_value_t prior[MAX_CAT]; LossVector* loss_list[MAX_CAT]; RegMatch *regs; real_value_t cross_entropy[MAX_CAT]; real_value_t complexity[MAX_CAT]; real_value_t loss_matrix[MAX_CAT][MAX_CAT]; } Spec; #endif dbacl-1.14.1/src/catfun.c000066400000000000000000001000731325773323600150720ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "util.h" #include "dbacl.h" extern options_t m_options; extern charparser_t m_cp; extern options_t u_options; extern empirical_t empirical; extern category_t cat[MAX_CAT]; extern category_count_t cat_count; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern char *extn; extern long system_pagesize; /*********************************************************** * MISCELLANEOUS FUNCTIONS * ***********************************************************/ char *sanitize_path(char *in, char *extension) { char *q; char *path; charbuf_len_t l; if( !extension ) { extension = ""; } /* this bit likely fails in DOS ;-) */ path = getenv(DEFAULT_CATPATH); if( path && (*in != '/') && (*in != '.') ) { l = strlen(path); q = (char *)malloc(l + strlen(in) + 3 + strlen(extension)); strcpy(q, path); if( q[l - 1] != '/' ) { q[l] = '/'; q[l + 1] = 0; } strcat(q, in); strcat(q, extension); } else { q = (char *)malloc(strlen(in) + strlen(extension) + 1); strcpy(q, in); strcat(q, extension); } return q; } #define MOPTION(x,opt) (((opt) & (1<<(x))) ? ("|" #x) : "") char *print_charparser_type(charparser_t mcp, char *buf) { strcpy(buf, (mcp == CP_DEFAULT) ? "CP_DEFAULT" : (mcp == CP_CHAR) ? "CP_CHAR" : (mcp == CP_ALPHA) ? "CP_ALPHA" : (mcp == CP_ALNUM) ? "CP_ALNUM" : (mcp == CP_GRAPH) ? "CP_GRAPH" : (mcp == CP_CEF) ? "CP_CEF" : (mcp == CP_ADP) ? "CP_ADP" : (mcp == CP_CEF2) ? "CP_CEF2" : "CP_UNKNOWN"); return buf; } char *print_model_options(options_t opt, charparser_t mcp, char *buf) { print_charparser_type(mcp, buf); strcat(buf, MOPTION(M_OPTION_REFMODEL, opt)); strcat(buf, MOPTION(M_OPTION_TEXT_FORMAT, opt)); strcat(buf, MOPTION(M_OPTION_MBOX_FORMAT, opt)); strcat(buf, MOPTION(M_OPTION_XML, opt)); strcat(buf, MOPTION(M_OPTION_I18N, opt)); strcat(buf, MOPTION(M_OPTION_CASEN, opt)); strcat(buf, MOPTION(M_OPTION_CALCENTROPY, opt)); strcat(buf, MOPTION(M_OPTION_MULTINOMIAL, opt)); strcat(buf, MOPTION(M_OPTION_HEADERS, opt)); strcat(buf, MOPTION(M_OPTION_PLAIN, opt)); strcat(buf, MOPTION(M_OPTION_NOPLAIN, opt)); strcat(buf, MOPTION(M_OPTION_SHOW_LINKS, opt)); strcat(buf, MOPTION(M_OPTION_SHOW_ALT, opt)); strcat(buf, MOPTION(M_OPTION_HTML, opt)); strcat(buf, MOPTION(M_OPTION_XHEADERS, opt)); strcat(buf, MOPTION(M_OPTION_THEADERS, opt)); strcat(buf, MOPTION(M_OPTION_SHOW_SCRIPT, opt)); strcat(buf, MOPTION(M_OPTION_SHOW_STYLE, opt)); strcat(buf, MOPTION(M_OPTION_SHOW_HTML_COMMENTS, opt)); strcat(buf, MOPTION(M_OPTION_USE_STDTOK, opt)); strcat(buf, MOPTION(M_OPTION_ATTACHMENTS, opt)); strcat(buf, MOPTION(M_OPTION_WARNING_BAD, opt)); strcat(buf, MOPTION(M_OPTION_NGRAM_STRADDLE_NL, opt)); return buf; } char *print_user_options(options_t opt, char *buf) { strcpy(buf, MOPTION(U_OPTION_CLASSIFY, opt)); strcat(buf, MOPTION(U_OPTION_LEARN, opt)); strcat(buf, MOPTION(U_OPTION_FASTEMP, opt)); strcat(buf, MOPTION(U_OPTION_CUTOFF, opt)); strcat(buf, MOPTION(U_OPTION_VERBOSE, opt)); strcat(buf, MOPTION(U_OPTION_STDIN, opt)); strcat(buf, MOPTION(U_OPTION_SCORES, opt)); strcat(buf, MOPTION(U_OPTION_POSTERIOR, opt)); strcat(buf, MOPTION(U_OPTION_FILTER, opt)); strcat(buf, MOPTION(U_OPTION_DEBUG, opt)); strcat(buf, MOPTION(U_OPTION_DUMP, opt)); strcat(buf, MOPTION(U_OPTION_APPEND, opt)); strcat(buf, MOPTION(U_OPTION_DECIMATE, opt)); strcat(buf, MOPTION(U_OPTION_GROWHASH, opt)); strcat(buf, MOPTION(U_OPTION_INDENTED, opt)); strcat(buf, MOPTION(U_OPTION_NOZEROLEARN, opt)); strcat(buf, MOPTION(U_OPTION_MMAP, opt)); strcat(buf, MOPTION(U_OPTION_CONFIDENCE, opt)); strcat(buf, MOPTION(U_OPTION_VAR, opt)); return buf; } error_code_t sanitize_model_options(options_t *mopt, charparser_t *mcp, category_t *cat) { options_t mask; /* things that always override mopt */ mask = (1<model.options & mask); /* things that are problematic */ if( *mopt & (1<model.options & (1<filename); } } else if( *mopt & (1<model.options & (1<filename); } } else { *mopt |= (cat->model.options & ((1<model.options & (1<filename); } } else if( *mopt & (1<model.options & (1<filename); } } else { *mopt |= (cat->model.options & ((1<model.options & (1<filename); } } else if( *mopt & (1<model.options & (1<filename); } } else { *mopt |= (cat->model.options & ((1<m_options & mask) != (*mopt & mask)) ) { */ /* errormsg(E_FATAL, */ /* "category %s has incompatible token set (check -e switch)\n", */ /* cat->filename); */ /* return 0; */ /* } else { */ /* *mopt |= (cat->m_options & mask); */ /* } */ if( (*mcp != CP_DEFAULT) && (*mcp != cat->model.cp) ) { errormsg(E_FATAL, "category %s has incompatible token set (check -e switch)\n", cat->filename); return 0; } else { *mcp = cat->model.cp; } return 1; } regex_count_t load_regex(char *buf) { char *p; regex_count_t c; /* set up the submatch bitmap */ re[regex_count].submatches |= 0; re[regex_count].flags = 0; p = strrchr(buf, '|'); if( p && ( *(--p) == '|') ) { /* assume string ends in ||12345, use as bitmap */ *p = '\0'; for(p += 2; *p; p++) { /* assume ascii number positions */ if( (*p > '9') || (*p < '1')) { if( *p != '\n' ) { errormsg(E_WARNING, "could not decode || suffix for '%s'.\n", buf); } } else { re[regex_count].submatches |= (1<<(*p - '0')); } } } else { /* no bitmap specified */ re[regex_count].submatches = ~0; } /* remove trailing newline */ if( buf[strlen(buf) - 1] == '\n' ) { buf[strlen(buf) - 1] = '\0'; } /* GNU regexes use ordinary strings */ /* it's a regex - see if we've got it already */ for(c = 0; c < regex_count; c++) { if( strcmp(re[c].string, buf) == 0 ) { break; } } if( c >= regex_count ) { /* not found */ /* add it to our list */ if( strchr(buf, '(') ) { re[regex_count].string = strdup(buf); } else { char *dup = (char *)malloc(strlen(buf)+2); if( dup ) { sprintf(dup, "(%s)", buf); errormsg(E_WARNING, "no captures found in regex, converting to '%s'\n", dup); } re[regex_count].string = dup; } if( !re[regex_count].string ) { errormsg(E_FATAL, "could not prepare regular expression '%s'.\n", buf); } /* and compile the regex */ if( regcomp(&re[regex_count].regex, re[regex_count].string, REG_EXTENDED) != 0 ) { errormsg(E_FATAL, /* not much point going on */ "could not compile regular expression '%s'.\n", re[regex_count].string); } else { regex_count++; if( regex_count >= MAX_RE ) { errormsg(E_FATAL, "too many regular expressions\n"); /* no point in going on */ } } } return c; } void free_all_regexes() { regex_count_t k; for(k = 0; k < regex_count; k++) { regfree(&re[k].regex); } } /*********************************************************** * EMPIRICAL DISTRIBUTION OF TOKENS * ***********************************************************/ /* initialize global learner object */ void init_empirical(empirical_t *emp, hash_count_t dmt, hash_bit_count_t dmhb) { /* some constants */ emp->max_tokens = dmt; emp->max_hash_bits = dmhb; emp->full_token_count = 0; emp->unique_token_count = 0; emp->track_features = 0; emp->feature_stack_top = 0; emp->hashfull_warning = 0; /* allocate room for hash */ emp->hash = (h_item_t *)calloc(emp->max_tokens, sizeof(h_item_t)); if( !emp->hash ) { errormsg(E_FATAL, "not enough memory? I couldn't allocate %li bytes\n", (sizeof(h_item_t) * ((long int)emp->max_tokens))); } MADVISE(emp->hash, sizeof(h_item_t) * emp->max_tokens, MADV_RANDOM); } void free_empirical(empirical_t *emp) { if( emp->hash ) { free(emp->hash); } } void clear_empirical(empirical_t *emp) { token_stack_t i; if( emp->track_features ) { /* this may actually be slower than a global memset */ for(i = 0; i < emp->feature_stack_top; i++) { memset(emp->feature_stack[i], 0, sizeof(h_item_t)); } } else { memset(emp->hash, 0, sizeof(h_item_t) * emp->max_tokens); } emp->full_token_count = 0; emp->unique_token_count = 0; emp->feature_stack_top = 0; if( u_options & (1<track_features = 1; } } h_item_t *find_in_empirical(empirical_t *emp, hash_value_t id) { register h_item_t *i, *loop; /* start at id */ i = loop = &emp->hash[id & (emp->max_tokens - 1)]; while( FILLEDP(i) ) { if( EQUALP(i->id,id) ) { return i; /* found id */ } else { i++; /* not found */ /* wrap around */ i = (i >= &emp->hash[emp->max_tokens]) ? emp->hash : i; if( i == loop ) { return NULL; /* when hash table is full */ } } } /* empty slot, so not found */ return i; } /* calculates the entropy of the full empirical measure */ score_t empirical_entropy(empirical_t *emp) { token_stack_t j; hash_count_t i; score_t e = 0.0; if( emp->track_features && (emp->feature_stack_top < MAX_TOKEN_LINE_STACK) ) { for(j = 0; j < emp->feature_stack_top; j++) { e += ((score_t)emp->feature_stack[j]->count) * log((score_t)emp->feature_stack[j]->count); } } else { for(i = 0; i < emp->max_tokens; i++) { if( FILLEDP(&emp->hash[i]) ) { e += ((score_t)emp->hash[i].count) * log((score_t)emp->hash[i].count); } } } e = e/emp->full_token_count - log((score_t)emp->full_token_count); return -e; } /*********************************************************** * CATEGORY FUNCTIONS * ***********************************************************/ /* initialize to zero. fullfilename specified elsewhere */ void init_category(category_t *cat) { char *p; cat->model_full_token_count = 0; cat->model_unique_token_count = 0; cat->score = 0.0; cat->score_div = 0.0; cat->score_s2 = 0.0; cat->score_shannon = 0.0; cat->shannon = 0.0; cat->shannon_s2 = 0.0; cat->alpha = 0.0; cat->beta = 0.0; cat->mu = 0.0; cat->s2 = 0.0; cat->prior = 0.0; cat->complexity = 0.0; cat->fcomplexity = 0; cat->fmiss = 0; cat->max_order = 0; memset(cat->mediacounts, 0, sizeof(token_count_t)*TOKEN_CLASS_MAX); p = strrchr(cat->fullfilename, '/'); if( p ) { cat->filename = p + 1; /* only keep basename */ } else { cat->filename = cat->fullfilename; } cat->filename = strdup(cat->filename); if( extn && *extn ) { p = strstr(cat->filename, extn); if( p ) { *p = '\0'; } } cat->retype = 0; cat->model.type = simple; cat->model.options = 0; cat->model.cp = 0; cat->model.dt = 0; cat->c_options = 0; cat->hash = NULL; cat->mmap_offset = 0; cat->mmap_start = NULL; } bool_t create_category_hash(category_t *cat, FILE *input, int protf) { hash_count_t i, j; if( u_options & (1<mmap_offset = ftell(input); if( cat->mmap_offset > 0 ) { cat->mmap_start = (byte_t *)MMAP(0, sizeof(c_item_t) * cat->max_tokens + cat->mmap_offset, protf, MAP_SHARED, fileno(input), 0); if( cat->mmap_start == MAP_FAILED ) { cat->mmap_start = NULL; } if( cat->mmap_start ) { cat->hash = (c_item_t *)(cat->mmap_start + cat->mmap_offset); MADVISE(cat->hash, sizeof(c_item_t) * cat->max_tokens, MADV_SEQUENTIAL|MADV_WILLNEED); /* lock the pages to prevent swapping - on Linux, this works without root privs so long as the user limits are big enough - mine are unlimited ;-) On other OSes, root may me necessary. If we can't lock, it doesn't really matter, but cross validations and multiple classifications are a _lot_ faster with locking. */ MLOCK(cat->hash, sizeof(c_item_t) * cat->max_tokens); cat->c_options |= (1<hash ) { cat->c_options &= ~(1<hash = (c_item_t *)malloc(sizeof(c_item_t) * cat->max_tokens); if( !cat->hash ) { errormsg(E_ERROR, "not enough memory for category %s\n", cat->filename); return 0; } MADVISE(cat->hash, sizeof(c_item_t) * cat->max_tokens, MADV_SEQUENTIAL); /* read in hash table */ i = cat->max_tokens; j = 0; while(!ferror(input) && !feof(input) && (j < i) ) { j += fread(cat->hash + j, sizeof(c_item_t), i - j, input); } if( j < i ) { errormsg(E_ERROR, "corrupt category? %s\n", cat->fullfilename); free(cat->hash); return 0; } } return 1; } void free_category_hash(category_t *cat) { if( cat->hash ) { if( cat->mmap_start != NULL ) { MUNMAP(cat->mmap_start, cat->max_tokens * sizeof(c_item_t) + cat->mmap_offset); cat->mmap_start = NULL; cat->mmap_offset = 0; cat->hash = NULL; } if( cat->hash ) { free(cat->hash); cat->hash = NULL; } } } /* frees the resrouces associated with a category */ void free_category(category_t *cat) { free_category_hash(cat); if( cat->filename ) { free(cat->filename); } if( cat->fullfilename ) { free(cat->fullfilename); } } /* turns purely random text into a category of its own */ void init_purely_random_text_category(category_t *cat) { alphabet_size_t i, j; weight_t z = -log((double)(ASIZE - AMIN)); #if defined DIGITIZE_DIGRAMS digitized_weight_t zz = PACK_DIGRAMS(z); #endif for(i = AMIN; i < ASIZE; i++) { for(j = AMIN; j < ASIZE; j++) { #if defined DIGITIZE_DIGRAMS cat->dig[i][j] = zz; #else cat->dig[i][j] = z; #endif } } z = -log((double)(ASIZE - AMIN)); #if defined DIGITIZE_DIGRAMS zz = PACK_DIGRAMS(z); #endif for(j = AMIN; j < ASIZE; j++) { #if defined DIGITIZE_DIGRAMS cat->dig[(alphabet_size_t)DIAMOND][j] = zz; #else cat->dig[(alphabet_size_t)DIAMOND][j] = z; #endif } /* not needed: set DIAMOND-DIAMOND score for completeness only */ #if defined DIGITIZE_DIGRAMS cat->dig[(alphabet_size_t)DIAMOND][(alphabet_size_t)DIAMOND] = DIGITIZED_WEIGHT_MIN; #else cat->dig[(alphabet_size_t)DIAMOND][(alphabet_size_t)DIAMOND] = log(0.0); #endif cat->logZ = 0.0; cat->divergence = 0.0; cat->delta = 0.0; cat->renorm = 0.0; cat->hash = NULL; cat->mmap_start = NULL; cat->mmap_offset = 0; cat->model.type = simple; cat->max_order = 1; cat->model.options = 0; cat->model.cp = 0; cat->model.dt = 0; } c_item_t *find_in_category(category_t *cat, hash_value_t id) { register c_item_t *i, *loop; if( cat->hash ) { /* start at id */ i = loop = &cat->hash[id & (cat->max_tokens - 1)]; while( FILLEDP(i) ) { if( EQUALP(NTOH_ID(i->id),id) ) { return i; /* found id */ } else { i++; /* not found */ /* wrap around */ i = (i >= &cat->hash[cat->max_tokens]) ? cat->hash : i; if( i == loop ) { return NULL; /* when hash table is full */ } } } return i; } else { return NULL; } } /* for each loaded category, this calculates the score. Tokens have the format DIAMOND t1 DIAMOND t2 ... tn DIAMOND CLASSEP class NUL */ void score_word(char *tok, token_type_t tt, regex_count_t re) { category_count_t i = 0; weight_t multinomial_correction = 0.0; weight_t shannon_correction = 0.0; weight_t lambda, ref, oldscore; bool_t apply; alphabet_size_t pp, pc, len; hash_value_t id; char *q; register c_item_t *k = NULL; h_item_t *h = NULL; /* we skip "empty" tokens */ for(q = tok; q && *q == DIAMOND; q++); if( q && (*q != EOTOKEN) ) { id = hash_full_token(tok); if( (m_options & (1<count < K_TOKEN_COUNT_MAX ) { h->count++; #if defined SHANNON_STIRLING shannon_correction = 1.0 + log((weight_t)h->count * (weight_t)(h->count - 1))/2.0; #else shannon_correction += log((weight_t)h->count)*(weight_t)h->count - log((weight_t)(h->count - 1))*(weight_t)(h->count - 1); #endif } } else { if( /* !FILLEDP(i) && */ ((100 * empirical.unique_token_count) < (HASH_FULL * empirical.max_tokens) )) { /* fill the empirical hash */ SET(h->id,id); empirical.unique_token_count += ( empirical.unique_token_count < K_TOKEN_COUNT_MAX ) ? 1 : 0; h->count = 1; #if defined SHANNON_STIRLING shannon_correction = 1.0 - log(2.0 * M_PI)/2.0; #else shannon_correction = 0; #endif } else { /* hash full */ h = NULL; if( !empirical.hashfull_warning ) { errormsg(E_WARNING, "empirical hash full, calculation may be skewed. " "Try option -h %d\n", (empirical.max_hash_bits + 1)); empirical.hashfull_warning = 1; } return; /* pretend word doesn't exist */ } if( empirical.track_features ) { if( empirical.feature_stack_top < MAX_TOKEN_LINE_STACK ) { empirical.feature_stack[empirical.feature_stack_top++] = h; } else { empirical.track_features = 0; empirical.feature_stack_top = 0; } } } empirical.full_token_count += ( empirical.full_token_count < K_TOKEN_COUNT_MAX ) ? 1 : 0; } } /* now do scoring for all available categories */ for(i = 0; i < cat_count; i++) { oldscore = cat[i].score; lambda = 0.0; ref = 0.0; /* see if this token is for us. The rule is: a category either uses the standard tokenizer (in that case re = INVALID_RE), or it uses only those regexes which are listed in the retype bitmap. Since re = 0 is taken by the standard tokenizer, this occurs when re > 0 and we have to subtract 1 to check the bitmap. Simple, really ;-) */ apply = ( ((re == INVALID_RE) && (tt.order <= cat[i].max_order) && !cat[i].retype) || ((re > 0) && (cat[i].retype & (1<<(re-1)))) ); if( apply ) { /* if token found, add its lambda weight */ k = find_in_category(&cat[i], id); if( k ) { lambda = UNPACK_LAMBDA(NTOH_LAMBDA(k->lam)); } if( tt.order == 1 ) { /* now compute the reference weight from digram model, (while duplicating the digitization error) */ pp = (unsigned char)*tok; CLIP_ALPHABET(pp); q = tok + 1; len = 1; while( *q != EOTOKEN ) { if( *q == '\r' ) { q++; continue; } pc = (unsigned char)*q; CLIP_ALPHABET(pc); ref += UNPACK_DIGRAMS(cat[i].dig[pp][pc]); pp = pc; q++; if( *q != DIAMOND ) { len++; } } ref += UNPACK_DIGRAMS(cat[i].dig[RESERVED_TOKLEN][len]) - UNPACK_DIGRAMS(cat[i].dig[RESERVED_TOKLEN][0]); ref = UNPACK_RWEIGHTS(PACK_RWEIGHTS(ref)); } /* update the complexity */ /* note: complexity has nothing to do with Kolmogorov's definition */ /* this is actually very simple in hindsight, but took me a long time to get right. Different versions of dbacl compute the complexity in different ways, and I kept changing the method because I wasn't happy. In previous versions, complexity is an integer, which begs the question "what does it count?". For simple models (max_order = 1) this is easy: we count the number of tokens. But for max_order > 1, it's not obvious, because we need to divide by 1/max_order asymptotically. One way is to increment the complexity if we encounter a token of order max_order. This is correct for Markovian models and corresponds to the dbacl.ps writeup, but causes trouble in some edge cases. For example, if we classify a very short document, there might not be enough tokens to make sense. This actually occurs when dbacl must classify individual lines, and some lines contain one or two tokens only. Worse, dbacl used to renormalize at the same time as updating the complexity, which increases the likelihood of having a negative divergence score estimate in the first few iterations - very bad. Finally, the complexity is nearly meaningless for models built up from regular expressions, because both the start and the end of each line contains incomplete n-grams (recall regexes can't straddle newlines). So to solve these problems, some previous versions of dbacl counted always the order 1 tokens. Asymptotically, this makes no difference, but again it fails on edge cases. Firstly, doing this means that the complexity for a simple model is the same as the complexity for an n-gram model for any n, so that makes it hard to compare mixed models because n-gram model scores are consitently biased for n > 1. Another problem is again with regexes, because the incomplete n-gram tokens at the start and end of each line add up to a pretty large error over thousands of tokens. The solution to the above problems is twofold: first, we renormalize after each token, regardless of its order. Of course this means we must divide logZ by the number of tokens per complexity unit, ie renorm = delta * logZ with delta = 1/max_order. Once I realized this it was obvious that the complexity should be also incremented by delta for every token. As a side effect, the complexity is now a real number, and actually measures not just the max_order token count, but also the fraction of incomplete n-grams. This seems like the right way to go, especially for models based on regexes, since now we also count the incomplete n-grams at both ends of the line, which adds up to quite a bit over many lines. */ cat[i].fcomplexity++; /* don't actually need this, but nice to have */ cat[i].complexity += cat[i].delta; /* now adjust the score */ switch(cat[i].model.type) { case simple: multinomial_correction = h ? (log((weight_t)cat[i].complexity) - log((weight_t)h->count)) : 0.0; cat[i].score += lambda + multinomial_correction + ref - cat[i].renorm; break; case sequential: default: cat[i].score += lambda + ref - cat[i].renorm; if( tt.order == cat[i].max_order ) { cat[i].score_shannon += shannon_correction; } break; } if( !k || !NTOH_ID(k->id) ) { /* missing data */ cat[i].fmiss++; } if( tt.order == 1 ) { /* sample variance */ cat[i].score_s2 += (cat[i].score - oldscore) * (cat[i].score - oldscore); /* only count medium for 1-grams */ cat[i].mediacounts[tt.cls]++; } } if( u_options & (1<id) : 0)); } } } if( u_options & (1< 0 ) { fprintf(stdout, "\n", re); } else { fprintf(stdout, "\n"); } } } } /* * Returns 2 * min[ F(obs), 1 - F(obs) ], and calls it * the "confidence". In reality, this is a type of p-value, * which is zero when obs = +/- infinity, and 1 at the median. * Under the null hypothesis obs ~ Gamma(alpha, beta), this * p-value is uniformly distributed. This is chosen so that * we can combine our p-palues with Fisher's chi^2 test, viz. * -2\sum_i=1^n \log X_i ~ chi^2(2n), if all X_i are IID uniform. * */ confidence_t gamma_pvalue(category_t *cat, double obs) { double m; if( (obs <= 0.0) || (cat->alpha <= 0.0) || (cat->beta <= 0.0) ) { return 0; /* bogus value */ } else if( obs > 120.0 ) { /* large values can produce underflow in gamma_tail() */ return 0; /* bogus value */ } m = gamma_tail(cat->alpha, cat->beta, obs); /* uncomment below to get one sided confidence */ /* return (int)(1000.0 * m); */ /* result is per-thousand */ return (confidence_t)(2000.0 * ((m > 0.5) ? 1.0 - m : m)); } /*********************************************************** * FILE MANAGEMENT FUNCTIONS * ***********************************************************/ error_code_t load_category_header(FILE *input, category_t *cat) { char buf[MAGIC_BUFSIZE]; char scratchbuf[MAGIC_BUFSIZE]; short int shint_val, shint_val2; long int lint_val1, lint_val2, lint_val3; if( input ) { if( !fgets(buf, MAGIC_BUFSIZE, input) || strncmp(buf, MAGIC1, MAGIC1_LEN) ) { errormsg(E_ERROR, "not a dbacl " SIGNATURE " category file [%s]\n", cat->fullfilename); return 0; } init_category(cat); /* changes filename */ if( !fgets(buf, MAGIC_BUFSIZE, input) || (sscanf(buf, MAGIC2_i, &cat->divergence, &cat->logZ, &shint_val, scratchbuf) < 4) ) { errormsg(E_ERROR, "bad category file [2]\n"); return 0; } cat->max_order = (token_order_t)shint_val; cat->delta = 1.0/(score_t)(cat->max_order); cat->renorm = cat->delta * cat->logZ; if( scratchbuf[0] == 'm' ) { cat->model.type = simple; } else { cat->model.type = sequential; } if( !fgets(buf, MAGIC_BUFSIZE, input) || (sscanf(buf, MAGIC3, &shint_val, &lint_val1, &lint_val2, &lint_val3) < 4) ) { errormsg(E_ERROR, "bad category file [3]\n"); return 0; } cat->max_hash_bits = (token_order_t)shint_val; cat->model_full_token_count = (token_count_t)lint_val1; cat->model_unique_token_count = (token_count_t)lint_val2; cat->model_num_docs = (document_count_t)lint_val3; cat->max_tokens = (1<max_hash_bits); if( !fgets(buf, MAGIC_BUFSIZE, input) || (sscanf(buf, MAGIC8_i, &cat->shannon, &cat->shannon_s2) < 2) ) { errormsg(E_ERROR, "bad category file [8]\n"); return 0; } if( !fgets(buf, MAGIC_BUFSIZE, input) || (sscanf(buf, MAGIC10_i, &cat->alpha, &cat->beta, &cat->mu, &cat->s2) < 4) ) { errormsg(E_ERROR, "bad category file [10]\n"); return 0; } /* see if there are any regexes */ while(fgets(buf, MAGIC_BUFSIZE, input)) { if( strncmp(buf, MAGIC6, 2) == 0 ) { break; } else if( strncmp(buf, MAGIC5_i, 8) == 0 ) { /* if regex can't be compiled, load_regex() exits */ cat->retype |= (1<model.options = (options_t)lint_val1; cat->model.cp = (charparser_t)shint_val; cat->model.dt = (digtype_t)shint_val2; } } /* finished with current line, get next one */ } /* if this category did not register a regex, it wants the default processing, so we flag this */ if( !cat->retype ) { cat->model.options |= (1<model.cp == CP_DEFAULT ) { if( cat->model.options & (1<model.cp = CP_ADP; } else { cat->model.cp = CP_ALPHA; } } /* if we're here, success! */ return 1; } return 0; } error_code_t explicit_load_category(category_t *cat, char *openf, int protf) { hash_count_t i, j; FILE *input; /* this is needed in case we try to open with write permissions, which would otherwise create the file */ input = fopen(cat->fullfilename, "rb"); if( input && (strcmp(openf, "rb") != 0) ) { input = freopen(cat->fullfilename, openf, input); } if( input ) { if( !load_category_header(input, cat) ) { fclose(input); return 0; } /* read character frequencies */ i = ASIZE * ASIZE; j = 0; while(!ferror(input) && !feof(input) && (j < i) ) { j += fread(cat->dig + j, SIZEOF_DIGRAMS, i - j, input); } if( j < i ) { errormsg(E_ERROR, "is this category corrupt: %s?\n", cat->fullfilename); fclose(input); return 0; } #if defined PORTABLE_CATS for(i = 0; i < ASIZE; i++) { for(j = 0; j < ASIZE; j++) { cat->dig[i][j] = NTOH_DIGRAM(cat->dig[i][j]); } } #endif if( !create_category_hash(cat, input, protf) ) { fclose(input); return 0; } fclose(input); return 1; } return 0; } /* loads a category hash returns 0 on failure, you should free the category in that case */ error_code_t load_category(category_t *cat) { return explicit_load_category(cat, "rb", PROT_READ); } /* loads a category file for potential read/write */ error_code_t open_category(category_t *cat) { return explicit_load_category(cat, "r+b", PROT_READ|PROT_WRITE); } error_code_t reload_category(category_t *cat) { if( cat ) { /* free the hash, but keep the cat->fullfilename */ free_category_hash(cat); return load_category(cat) && sanitize_model_options(&m_options,&m_cp,cat); } return 0; } void reload_all_categories() { category_count_t c; for(c = 0; c < cat_count; c++) { if( !reload_category(&cat[c]) ) { errormsg(E_FATAL, "could not reload %s, exiting\n", cat[c].fullfilename); } } } dbacl-1.14.1/src/config.h.in000066400000000000000000000106201325773323600154670ustar00rootroot00000000000000/* src/config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_FEATURES_H /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* ncurses needed for readline */ #undef HAVE_LIBNCURSES /* readline needed for interactive mailinspect */ #undef HAVE_LIBREADLINE /* slang needed for interactive mailinspect */ #undef HAVE_LIBSLANG /* Define to 1 if you have the `madvise' function. */ #undef HAVE_MADVISE /* Define to 1 if mbrtowc and mbstate_t are properly declared. */ #undef HAVE_MBRTOWC /* Define to 1 if you have the `memalign' function. */ #undef HAVE_MEMALIGN /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_MMAN_H /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if `posix_memalign' works. */ #undef HAVE_POSIX_MEMALIGN /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `valloc' function. */ #undef HAVE_VALLOC /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the `wcstol' function. */ #undef HAVE_WCSTOL /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* this is a Mac system */ #undef OS_DARWIN /* this is an HP-UX system */ #undef OS_HPUX /* this is a Linux system */ #undef OS_LINUX /* this is a Sun system */ #undef OS_SUN /* this is an unrecognized system */ #undef OS_UNKNOWN /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* identify processor if categories not portable */ #undef TARGETCPU /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `unsigned int' if does not define. */ #undef size_t dbacl-1.14.1/src/const.c000066400000000000000000000225261325773323600147460ustar00rootroot00000000000000/* const.c * * Globally declared constants * * * * SYNOPSIS: * * extern double nameofconstant; * * * * * DESCRIPTION: * * This file contains a number of mathematical constants and * also some needed size parameters of the computer arithmetic. * The values are supplied as arrays of hexadecimal integers * for IEEE arithmetic; arrays of octal constants for DEC * arithmetic; and in a normal decimal scientific notation for * other machines. The particular notation used is determined * by a symbol (DEC, IBMPC, or UNK) defined in the include file * mconf.h. * * The default size parameters are as follows. * * For DEC and UNK modes: * MACHEP = 1.38777878078144567553E-17 2**-56 * MAXLOG = 8.8029691931113054295988E1 log(2**127) * MINLOG = -8.872283911167299960540E1 log(2**-128) * MAXNUM = 1.701411834604692317316873e38 2**127 * * For IEEE arithmetic (IBMPC): * MACHEP = 1.11022302462515654042E-16 2**-53 * MAXLOG = 7.09782712893383996843E2 log(2**1024) * MINLOG = -7.08396418532264106224E2 log(2**-1022) * MAXNUM = 1.7976931348623158E308 2**1024 * * The global symbols for mathematical constants are * PI = 3.14159265358979323846 pi * PIO2 = 1.57079632679489661923 pi/2 * PIO4 = 7.85398163397448309616E-1 pi/4 * SQRT2 = 1.41421356237309504880 sqrt(2) * SQRTH = 7.07106781186547524401E-1 sqrt(2)/2 * LOG2E = 1.4426950408889634073599 1/log(2) * SQ2OPI = 7.9788456080286535587989E-1 sqrt( 2/pi ) * LOGE2 = 6.93147180559945309417E-1 log(2) * LOGSQ2 = 3.46573590279972654709E-1 log(2)/2 * THPIO4 = 2.35619449019234492885 3*pi/4 * TWOOPI = 6.36619772367581343075535E-1 2/pi * * These lists are subject to change. */ /* const.c */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #ifdef UNK #if 1 double MACHEP = 1.11022302462515654042E-16; /* 2**-53 */ #else double MACHEP = 1.38777878078144567553E-17; /* 2**-56 */ #endif double UFLOWTHRESH = 2.22507385850720138309E-308; /* 2**-1022 */ #ifdef DENORMAL double MAXLOG = 7.09782712893383996732E2; /* log(MAXNUM) */ /* double MINLOG = -7.44440071921381262314E2; */ /* log(2**-1074) */ double MINLOG = -7.451332191019412076235E2; /* log(2**-1075) */ #else double MAXLOG = 7.08396418532264106224E2; /* log 2**1022 */ double MINLOG = -7.08396418532264106224E2; /* log 2**-1022 */ #endif double MAXNUM = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ double PI = 3.14159265358979323846; /* pi */ double PIO2 = 1.57079632679489661923; /* pi/2 */ double PIO4 = 7.85398163397448309616E-1; /* pi/4 */ double SQRT2 = 1.41421356237309504880; /* sqrt(2) */ double SQRTH = 7.07106781186547524401E-1; /* sqrt(2)/2 */ double LOG2E = 1.4426950408889634073599; /* 1/log(2) */ double SQ2OPI = 7.9788456080286535587989E-1; /* sqrt( 2/pi ) */ double LOGE2 = 6.93147180559945309417E-1; /* log(2) */ double LOGSQ2 = 3.46573590279972654709E-1; /* log(2)/2 */ double THPIO4 = 2.35619449019234492885; /* 3*pi/4 */ double TWOOPI = 6.36619772367581343075535E-1; /* 2/pi */ #ifdef INFINITIES double INFINITY = 1.0/0.0; /* 99e999; */ #else double INFINITY = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ #endif #ifdef NANS double NAN = 1.0/0.0 - 1.0/0.0; #else double NAN = 0.0; #endif #ifdef MINUSZERO double NEGZERO = -0.0; #else double NEGZERO = 0.0; #endif #endif #ifdef IBMPC /* 2**-53 = 1.11022302462515654042E-16 */ unsigned short MACHEP[4] = {0x0000,0x0000,0x0000,0x3ca0}; unsigned short UFLOWTHRESH[4] = {0x0000,0x0000,0x0000,0x0010}; #ifdef DENORMAL /* log(MAXNUM) = 7.09782712893383996732224E2 */ unsigned short MAXLOG[4] = {0x39ef,0xfefa,0x2e42,0x4086}; /* log(2**-1074) = - -7.44440071921381262314E2 */ /*unsigned short MINLOG[4] = {0x71c3,0x446d,0x4385,0xc087};*/ unsigned short MINLOG[4] = {0x3052,0xd52d,0x4910,0xc087}; #else /* log(2**1022) = 7.08396418532264106224E2 */ unsigned short MAXLOG[4] = {0xbcd2,0xdd7a,0x232b,0x4086}; /* log(2**-1022) = - 7.08396418532264106224E2 */ unsigned short MINLOG[4] = {0xbcd2,0xdd7a,0x232b,0xc086}; #endif /* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ unsigned short MAXNUM[4] = {0xffff,0xffff,0xffff,0x7fef}; unsigned short PI[4] = {0x2d18,0x5444,0x21fb,0x4009}; unsigned short PIO2[4] = {0x2d18,0x5444,0x21fb,0x3ff9}; unsigned short PIO4[4] = {0x2d18,0x5444,0x21fb,0x3fe9}; unsigned short SQRT2[4] = {0x3bcd,0x667f,0xa09e,0x3ff6}; unsigned short SQRTH[4] = {0x3bcd,0x667f,0xa09e,0x3fe6}; unsigned short LOG2E[4] = {0x82fe,0x652b,0x1547,0x3ff7}; unsigned short SQ2OPI[4] = {0x3651,0x33d4,0x8845,0x3fe9}; unsigned short LOGE2[4] = {0x39ef,0xfefa,0x2e42,0x3fe6}; unsigned short LOGSQ2[4] = {0x39ef,0xfefa,0x2e42,0x3fd6}; unsigned short THPIO4[4] = {0x21d2,0x7f33,0xd97c,0x4002}; unsigned short TWOOPI[4] = {0xc883,0x6dc9,0x5f30,0x3fe4}; #ifdef INFINITIES unsigned short INFINITY[4] = {0x0000,0x0000,0x0000,0x7ff0}; #else unsigned short INFINITY[4] = {0xffff,0xffff,0xffff,0x7fef}; #endif #ifdef NANS unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x7ffc}; #else unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #ifdef MINUSZERO unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x8000}; #else unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #endif #ifdef MIEEE /* 2**-53 = 1.11022302462515654042E-16 */ unsigned short MACHEP[4] = {0x3ca0,0x0000,0x0000,0x0000}; unsigned short UFLOWTHRESH[4] = {0x0010,0x0000,0x0000,0x0000}; #ifdef DENORMAL /* log(2**1024) = 7.09782712893383996843E2 */ unsigned short MAXLOG[4] = {0x4086,0x2e42,0xfefa,0x39ef}; /* log(2**-1074) = - -7.44440071921381262314E2 */ /* unsigned short MINLOG[4] = {0xc087,0x4385,0x446d,0x71c3}; */ unsigned short MINLOG[4] = {0xc087,0x4910,0xd52d,0x3052}; #else /* log(2**1022) = 7.08396418532264106224E2 */ unsigned short MAXLOG[4] = {0x4086,0x232b,0xdd7a,0xbcd2}; /* log(2**-1022) = - 7.08396418532264106224E2 */ unsigned short MINLOG[4] = {0xc086,0x232b,0xdd7a,0xbcd2}; #endif /* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ unsigned short MAXNUM[4] = {0x7fef,0xffff,0xffff,0xffff}; unsigned short PI[4] = {0x4009,0x21fb,0x5444,0x2d18}; unsigned short PIO2[4] = {0x3ff9,0x21fb,0x5444,0x2d18}; unsigned short PIO4[4] = {0x3fe9,0x21fb,0x5444,0x2d18}; unsigned short SQRT2[4] = {0x3ff6,0xa09e,0x667f,0x3bcd}; unsigned short SQRTH[4] = {0x3fe6,0xa09e,0x667f,0x3bcd}; unsigned short LOG2E[4] = {0x3ff7,0x1547,0x652b,0x82fe}; unsigned short SQ2OPI[4] = {0x3fe9,0x8845,0x33d4,0x3651}; unsigned short LOGE2[4] = {0x3fe6,0x2e42,0xfefa,0x39ef}; unsigned short LOGSQ2[4] = {0x3fd6,0x2e42,0xfefa,0x39ef}; unsigned short THPIO4[4] = {0x4002,0xd97c,0x7f33,0x21d2}; unsigned short TWOOPI[4] = {0x3fe4,0x5f30,0x6dc9,0xc883}; #ifdef INFINITIES unsigned short INFINITY[4] = {0x7ff0,0x0000,0x0000,0x0000}; #else unsigned short INFINITY[4] = {0x7fef,0xffff,0xffff,0xffff}; #endif #ifdef NANS unsigned short NAN[4] = {0x7ff8,0x0000,0x0000,0x0000}; #else unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #ifdef MINUSZERO unsigned short NEGZERO[4] = {0x8000,0x0000,0x0000,0x0000}; #else unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #endif #ifdef DEC /* 2**-56 = 1.38777878078144567553E-17 */ unsigned short MACHEP[4] = {0022200,0000000,0000000,0000000}; unsigned short UFLOWTHRESH[4] = {0x0080,0x0000,0x0000,0x0000}; /* log 2**127 = 88.029691931113054295988 */ unsigned short MAXLOG[4] = {041660,007463,0143742,025733,}; /* log 2**-128 = -88.72283911167299960540 */ unsigned short MINLOG[4] = {0141661,071027,0173721,0147572,}; /* 2**127 = 1.701411834604692317316873e38 */ unsigned short MAXNUM[4] = {077777,0177777,0177777,0177777,}; unsigned short PI[4] = {040511,007732,0121041,064302,}; unsigned short PIO2[4] = {040311,007732,0121041,064302,}; unsigned short PIO4[4] = {040111,007732,0121041,064302,}; unsigned short SQRT2[4] = {040265,002363,031771,0157145,}; unsigned short SQRTH[4] = {040065,002363,031771,0157144,}; unsigned short LOG2E[4] = {040270,0125073,024534,013761,}; unsigned short SQ2OPI[4] = {040114,041051,0117241,0131204,}; unsigned short LOGE2[4] = {040061,071027,0173721,0147572,}; unsigned short LOGSQ2[4] = {037661,071027,0173721,0147572,}; unsigned short THPIO4[4] = {040426,0145743,0174631,007222,}; unsigned short TWOOPI[4] = {040042,0174603,067116,042025,}; /* Approximate infinity by MAXNUM. */ unsigned short INFINITY[4] = {077777,0177777,0177777,0177777,}; unsigned short NAN[4] = {0000000,0000000,0000000,0000000}; #ifdef MINUSZERO unsigned short NEGZERO[4] = {0000000,0000000,0000000,0100000}; #else unsigned short NEGZERO[4] = {0000000,0000000,0000000,0000000}; #endif #endif #ifndef UNK extern unsigned short MACHEP[]; extern unsigned short UFLOWTHRESH[]; extern unsigned short MAXLOG[]; extern unsigned short UNDLOG[]; extern unsigned short MINLOG[]; extern unsigned short MAXNUM[]; extern unsigned short PI[]; extern unsigned short PIO2[]; extern unsigned short PIO4[]; extern unsigned short SQRT2[]; extern unsigned short SQRTH[]; extern unsigned short LOG2E[]; extern unsigned short SQ2OPI[]; extern unsigned short LOGE2[]; extern unsigned short LOGSQ2[]; extern unsigned short THPIO4[]; extern unsigned short TWOOPI[]; extern unsigned short INFINITY[]; extern unsigned short NAN[]; extern unsigned short NEGZERO[]; #endif dbacl-1.14.1/src/dbacl.c000066400000000000000000004163221325773323600146660ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ /* * Note to regenerate the Makefile and configure script: * aclocal * autoconf * touch NEWS README AUTHORS ChangeLog * automake -a * * You can also just run the bootstrap script. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #if defined HAVE_UNISTD_H #include #include #endif #include #if defined HAVE_LANGINFO_H #include #if !defined CODESET /* on OpenBSD, CODESET doesn't seem to be defined - we use 3, which should be US-ASCII, but it's not ideal... */ #define CODESET 3 #endif #endif #include "util.h" #include "dbacl.h" /* make sure this is last */ /* global variables */ extern signal_cleanup_t cleanup; extern hash_bit_count_t default_max_hash_bits; extern hash_count_t default_max_tokens; extern hash_bit_count_t default_max_grow_hash_bits; extern hash_count_t default_max_grow_tokens; hash_bit_count_t decimation; int zthreshold = 0; learner_t learner; dirichlet_t dirichlet; int filter[MAX_CAT]; category_count_t filter_count = 0; extern category_t cat[MAX_CAT]; extern category_count_t cat_count; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern empirical_t empirical; extern options_t u_options; extern options_t m_options; extern charparser_t m_cp; extern digtype_t m_dt; extern char *extn; extern token_order_t ngram_order; /* defaults to 1 */ /* for counting emails */ bool_t not_header; extern MBOX_State mbox; extern XML_State xml; /* for option processing */ extern char *optarg; extern int optind, opterr, optopt; char *title = ""; char *digtype = ""; char *online = ""; char *ronline[MAX_CAT]; category_count_t ronline_count = 0; extern char *progname; extern char *inputfile; extern long inputline; extern int cmd; int exit_code = 0; /* default */ int overflow_warning = 0; int digramic_overflow_warning = 0; int skewed_constraints_warning = 0; extern long system_pagesize; extern void *in_iobuf; extern void *out_iobuf; /* tolerance for the error in divergence - this can be changed with -q. More accuracy means slower learning. This should be the same order of magnitude as the error due to digitization, but we tweak them to obtain timely output */ int quality = 0; double qtol_alpha = 0.0001; double qtol_div = 0.01; double qtol_lam = CLIP_LAMBDA_TOL(0.05); double qtol_logz = 0.05; bool_t qtol_multipass = 0; /*********************************************************** * MISCELLANEOUS FUNCTIONS * ***********************************************************/ static void usage(/*@unused@*/ char **argv) { fprintf(stderr, "\n"); fprintf(stderr, "dbacl [-vniNR] [-T type] -c CATEGORY [-c CATEGORY]...\n"); fprintf(stderr, " [-f KEEP]... [FILE]...\n"); fprintf(stderr, "\n"); fprintf(stderr, " classifies FILE or STDIN using CATEGORY, optionally\n"); fprintf(stderr, " removing all lines which don't fit the category KEEP.\n"); fprintf(stderr, "\n"); fprintf(stderr, "dbacl [-vnirNDL] [-h size] [-T type] -l CATEGORY \n"); fprintf(stderr, " [-g regex]... [FILE]...\n"); fprintf(stderr, "\n"); fprintf(stderr, " builds a maximum entropy model from the words in FILE or STDIN\n"); fprintf(stderr, " or concatenated regex submatches if using the -g option.\n"); fprintf(stderr, "\n"); fprintf(stderr, "dbacl -V\n"); fprintf(stderr, "\n"); fprintf(stderr, " prints program version.\n"); } /*********************************************************** * CATEGORY FUNCTIONS * ***********************************************************/ void reset_all_scores() { category_count_t i; for(i = 0; i < cat_count; i++) { cat[i].score = 0.0; cat[i].score_s2 = 0.0; cat[i].score_div = 0.0; cat[i].score_shannon = 0.0; cat[i].complexity = 0.0; cat[i].fcomplexity = 0; } } /* calculate the overlap probabilities (ie the probability that the given score is the minimal score assuming independent Gaussian distributions.) NOTE: I also toyed with the idea of multiplying each uncertainty score by the percentage of recognized tokens for that category. It seems plausible that uncertainty should also be proportional to the unknown token count, but in practice, a typical email has a substantial fraction of unknown tokens, and this dominates the uncertainty obtained from the Gaussian assumption. I've disabled this code again, see ALTERNATIVE UNCERTAINTY code below */ double calc_uncertainty(int map) { double mu[MAX_CAT]; double sigma[MAX_CAT]; int i; double p, u, t, pmax; for(i = 0; i < cat_count; i++) { mu[i] = -sample_mean(cat[i].score, cat[i].complexity); sigma[i] = sqrt(cat[i].score_s2/cat[i].complexity); } /* even though p below is a true probability, it doesn't quite sum to 1, because of numerical errors in the min_prob function, which is only designed to do about 1% error for speed. So we might get up to 1 + cat_count% total mass, which means that u could be 102% say in spam filtering. Doesn't look good. So we compute the normalizing constant t. */ t = 0.0; pmax = 1.0; for(i = 0; i < cat_count; i++) { p = min_prob(i, cat_count, mu, sigma); if( i == map ) { pmax = p; } t += p; } /* pmax is proportional to the MAP probability, which is guaranteed to be >= 0.5. The value 0.5 occurs when the MAP is totally ambiguous, ie the classification is completely uncertain. Since people prefer a range 0-100%, we stretch the MAP probability into the interval [0,1] here. */ u = 2.0 * pmax / t - 1.0; /* ALTERNATIVE UNCERTAINTY : uncomment below to enable */ /* now multiply by the feature hit rate, which is also in [0,1] */ /* u *= ((cat[map].complexity - cat[map].fmiss) / cat[map].complexity); */ return u; } /* note: don't forget to flush after each line */ void line_score_categories(char *textbuf) { category_count_t i; category_count_t map; score_t c, cmax; if( !textbuf ) { return; } /* find MAP */ cmax = cat[0].score; map = 0; for(i = 0; i < cat_count; i++) { if(cmax < cat[i].score) { cmax = cat[i].score; map = i; } /* finish sample variance calculation */ cat[i].score_s2 = sample_variance(cat[i].score_s2, cat[i].score, cat[i].complexity); } if( !(u_options & (1< 0); sumdocs += cat[i].model_num_docs; sumfeats += cat[i].model_unique_token_count; } if( (u_options & (1< 0 ) { if( no_title ) { fprintf(stdout, "# mean_complexity "); no_title = (bool_t)0; } fprintf(stdout, "%s %5.2" FMT_printf_score_t " ", cat[i].filename, (double)cat[i].model_full_token_count/cat[i].model_num_docs); } } if( !no_title ) { fprintf(stdout, "\n"); } } } else if(u_options & (1< 5.0 ) { */ /* c = 1.0; */ /* } else if( c < -5.0 ) { */ /* c = 0.0; */ /* } else { */ /* /\* normal_cdf(c) has a range of 0.5 - 1.0, we convert to a full range *\/ */ /* c = 2 * normal_cdf(c) - 1.0; */ /* } */ /* cmax = (cmax > c) ? c : cmax; */ /* } */ /* } */ fprintf(stdout, "%s # %d%%\n", cat[exit_code].filename, (int)ceil(cmax * 100.0)); } } } exit_code++; /* make number between 1 and cat_count+1 */ } void file_score_categories(char *name) { fprintf(stdout, "%s ", name); score_categories(); /* clean up for next file */ reset_all_scores(); if( m_options & (1<mediaprobs[t])); } fprintf(out, "\n"); } bool_t write_category_headers(learner_t *learner, FILE *output) { regex_count_t c; char scratchbuf[MAGIC_BUFSIZE]; char smb[MAX_SUBMATCH+1]; token_order_t s; char *p; bool_t ok = (bool_t)1; /* print out standard category file headers */ ok = ok && (0 < fprintf(output, MAGIC1, learner->filename, (m_options & (1<divergence, learner->logZ, (short int)learner->max_order, (m_options & (1<max_hash_bits, (long int)learner->full_token_count, (long int)learner->unique_token_count, (long int)(learner->doc.count))); ok = ok && (0 < fprintf(output, MAGIC8_o, learner->shannon, learner->shannon2)); ok = ok && (0 < fprintf(output, MAGIC10_o, learner->alpha, learner->beta, learner->mu, learner->s2)); write_mediaprobs(output, learner); /* print out any regexes we might need */ for(c = 0; c < regex_count; c++) { /* write the bitmap */ smb[0] = '\0'; for(p = smb, s = 1; s <= MAX_SUBMATCH; s++) { if( re[c].submatches & (1<filename); } /* don't overwrite data files */ if( !check_magic_write(learner->filename, MAGIC1, 10) ) { exit(1); } /* In case we have both the -m and -o switches we try to write the data with mmap. We don't do this in general, because mmap can cause corruption, but if -m and -o are used together, we assume the user knows that a single process must read/write the file at a time. Also, we don't try to create the file - if the file doesn't exist, we won't gain much time by using mmap on that single occasion. */ if( opath && *opath && (u_options & (1<filename, "r+b"); if( output ) { ok = (bool_t)1; if( out_iobuf ) { setvbuf(output, (char *)out_iobuf, (int)_IOFBF, (size_t)(BUFFER_MAG * system_pagesize)); } ok = ok && write_category_headers(learner, output); if( !ok ) { goto skip_mmap; } /* now mmap the file and write out the arrays real quick */ mmap_offset = ftell(output); if( mmap_offset == (long)-1 ) { ok = 0; goto skip_mmap; } mmap_length = (size_t)mmap_offset + (ASIZE * ASIZE * SIZEOF_DIGRAMS) + learner->max_tokens * sizeof(c_item_t); ok = ok && (-1 != ftruncate(fileno(output), (off_t)mmap_length)); if( !ok ) { goto skip_mmap; } mmap_start = (byte_t *)MMAP(0, mmap_length, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(output), 0); if( mmap_start == MAP_FAILED ) { mmap_start = NULL; } if( !mmap_start ) { ok = 0; goto skip_mmap; } MLOCK(mmap_start, mmap_length); MADVISE(mmap_start, mmap_length, MADV_SEQUENTIAL|MADV_WILLNEED); /* character frequencies */ shval_ptr = (myweight_t *)(mmap_start + mmap_offset); for(i = 0; i < ASIZE; i++) { for(j = 0; j < ASIZE; j++) { *shval_ptr = HTON_DIGRAM(PACK_DIGRAMS(learner->dig[i][j])); shval_ptr++; } } /* token/feature weights */ ci_ptr = (c_item_t *)(mmap_start + mmap_offset + (ASIZE * ASIZE * SIZEOF_DIGRAMS)); for(t = 0; t < learner->max_tokens; t++) { /* write each element so that it's easy to read back in a c_item_t array */ SET(ci_ptr->id,learner->hash[t].id); ci_ptr->lam = learner->hash[t].lam; ci_ptr->id = HTON_ID(ci_ptr->id); ci_ptr->lam = HTON_LAMBDA(ci_ptr->lam); ci_ptr++; } skip_mmap: fclose(output); if( mmap_start ) { MUNMAP(mmap_start, mmap_length); mmap_start = NULL; } } if( ok ) { return 1; /* we're done */ } else { errormsg(E_WARNING, "could not mmap %s, trying stdio.\n", learner->filename); /* oh oh, file is corrupt. We delete it and try again below without mmap */ unlink(learner->filename); } } /* this keeps track to see if writing is successful, it's not foolproof, but probably good enough */ ok = (bool_t)1; output = mytmpfile(learner->filename, &tempname); if( output ) { if( out_iobuf ) { setvbuf(output, (char *)out_iobuf, (int)_IOFBF, (size_t)(BUFFER_MAG * system_pagesize)); } ok = ok && write_category_headers(learner, output); /* end of readable stuff */ if( ok ) { /* now write arrays: this is far(!) from efficient, but the bits we need are not nicely tucked into a block of memory, and due to the sizes involved when dealing with possibly millions of tokens, we can't afford to malloc a brand new block just to pack everything nicely. At least, the file buffering should mitigate the performance hit, and we prefer to learn slowly and classify fast. */ /* character frequencies */ for(i = 0; i < ASIZE; i++) { for(j = 0; j < ASIZE; j++) { shval = HTON_DIGRAM(PACK_DIGRAMS(learner->dig[i][j])); for(n = 0; n < 1; ) { if( 0 > (n = fwrite(&shval, SIZEOF_DIGRAMS, (size_t)1, output)) ) { ok = 0; goto skip_remaining; } } } } MADVISE(learner->hash, sizeof(l_item_t) * learner->max_tokens, MADV_SEQUENTIAL|MADV_WILLNEED); /* token/feature weights */ for(t = 0; t < learner->max_tokens; t++) { /* write each element so that it's easy to read back in a c_item_t array */ SET(ci.id,learner->hash[t].id); ci.lam = learner->hash[t].lam; ci.id = HTON_ID(ci.id); ci.lam = HTON_LAMBDA(ci.lam); for(n = 0; n < 1; ) { if( 0 > (n = fwrite(&ci, sizeof(ci), (size_t)1, output)) ) { ok = 0; goto skip_remaining; } } } } skip_remaining: fclose(output); /* the rename is atomic on posix */ if( !ok || !myrename(tempname, learner->filename) ) { errormsg(E_ERROR, "due to a potential file corruption, category %s was not updated\n", learner->filename); unlink(tempname); cleanup.tempfile = NULL; } free(tempname); } else { errormsg(E_ERROR, "cannot open tempfile for writing %s\n", learner->filename); return 0; } return 1; } /* Instead of saving a full new category file, we try to * overwrite the contents of an already open, memory mapped category. * CAREFUL: THIS CAN CORRUPT THE CATEGORY! * If the return value is 0, then you should assume the category no * longer exists on disk. */ error_code_t fast_partial_save_learner(learner_t *learner, category_t *xcat) { char *p, *q; #define REPLBUF (3*128) char buf[REPLBUF]; charbuf_len_t n, max; alphabet_size_t i, j; hash_count_t t; c_item_t *ci_ptr; myweight_t *shval_ptr; if( xcat->mmap_start && (xcat->model.options == learner->model.options) && (xcat->max_order == learner->max_order) && (xcat->max_hash_bits == learner->max_hash_bits) ) { max = 0; buf[0] = '\0'; /* we only overwrite the header if there's exactly enough space */ /* we must overwrite 3 lines which all start with # */ q = p = strchr((char *)xcat->mmap_start + 1, '#'); if( p ) { n = snprintf(buf, (size_t)(REPLBUF - max), MAGIC2_o, learner->divergence, learner->logZ, (short int)learner->max_order, (m_options & (1<max_hash_bits, (long int)learner->full_token_count, (long int)learner->unique_token_count, (long int)(learner->doc.count)); max += n; } q = strchr(q + 1, '#'); if( q && (max < REPLBUF) ) { n = snprintf(buf + max, (size_t)(REPLBUF - max), MAGIC8_o, learner->shannon, learner->shannon2); max += n; } q = strchr(q + 1, '#'); if( q && (max < REPLBUF) ) { n = snprintf(buf + max, (size_t)(REPLBUF - max), MAGIC10_o, learner->alpha, learner->beta, learner->mu, learner->s2); max += n; } /* now check it fits into the existing space */ q = strchr(q + 1, '#'); if( (q - p) == max ) { /* from here on, there's no turning back. Since we don't overwrite everything, if there's a problem, we'll have to unlink the category */ /* header */ memcpy(p, buf, (size_t)max); /* character frequencies */ shval_ptr = (myweight_t *)(xcat->mmap_start + xcat->mmap_offset - ASIZE * ASIZE * sizeof(myweight_t)); for(i = 0; i < ASIZE; i++) { for(j = 0; j < ASIZE; j++) { *shval_ptr = HTON_DIGRAM(PACK_DIGRAMS(learner->dig[i][j])); shval_ptr++; } } /* token/feature weights (we assume cat->max_tokens <= learner->max_tokens, and that filled hash values in cat are also filled in learner) */ ci_ptr = (c_item_t *)(xcat->mmap_start + xcat->mmap_offset); for(t = 0; t < learner->max_tokens; t++) { /* write each element so that it's easy to read back in a c_item_t array */ SET(ci_ptr->id,learner->hash[t].id); ci_ptr->lam = learner->hash[t].lam; ci_ptr->id = HTON_ID(ci_ptr->id); ci_ptr->lam = HTON_LAMBDA(ci_ptr->lam); ci_ptr++; } if( u_options & (1<filename); } return 1; } } if( u_options & (1<tmp.mmap_start ) { learner->tmp.mmap_cursor = learner->tmp.mmap_offset; return (bool_t)1; } else if( learner->tmp.file ) { clearerr(learner->tmp.file); return (fseek(learner->tmp.file, learner->tmp.offset, SEEK_SET) == 0); } return (bool_t)0; } bool_t tmp_seek_end(learner_t *learner) { if( learner->tmp.mmap_start ) { learner->tmp.mmap_cursor = learner->tmp.mmap_offset + learner->tmp.used; return (bool_t)1; } else if( learner->tmp.file ) { return (fseek(learner->tmp.file, learner->tmp.offset + learner->tmp.used, SEEK_SET) == 0); } return (bool_t)0; } long tmp_get_pos(learner_t *learner) { if( learner->tmp.mmap_start ) { return learner->tmp.mmap_cursor - learner->tmp.mmap_offset; } else if( learner->tmp.file ) { return ftell(learner->tmp.file) - learner->tmp.offset; } return (bool_t)0; } size_t tmp_read_block(learner_t *learner, byte_t *buf, size_t bufsiz, const byte_t **startp) { long left = learner->tmp.used - tmp_get_pos(learner); if( bufsiz > (size_t)left ) { bufsiz = (left >= 0) ? (size_t)left : 0; } if( learner->tmp.mmap_start ) { /* memcpy(buf, learner->tmp.mmap_start + learner->tmp.mmap_cursor, bufsiz); */ *startp = learner->tmp.mmap_start + learner->tmp.mmap_cursor; learner->tmp.mmap_cursor += bufsiz; return bufsiz; } else if( learner->tmp.file ) { if( ferror(learner->tmp.file) || feof(learner->tmp.file) ) { return 0; } *startp = buf; return fread(buf, 1, bufsiz, learner->tmp.file); } return 0; } /* must unmap/ftruncate/remap if using mmap, don't touch mmap_cursor */ bool_t tmp_grow(learner_t *learner) { long offset; if( learner->tmp.file && ((learner->tmp.used + 2 * MAX_TOKEN_LEN) >= learner->tmp.avail) ) { if( learner->tmp.mmap_start ) { MUNLOCK(learner->tmp.mmap_start, learner->tmp.mmap_length); MUNMAP(learner->tmp.mmap_start, learner->tmp.mmap_length); } learner->tmp.avail += TOKEN_LIST_GROW; if( -1 == ftruncate(fileno(learner->tmp.file), learner->tmp.offset + learner->tmp.avail) ) { errormsg(E_FATAL, "could not resize the tempfile, unable to proceed.\n"); } /* mmap_start is still old value, but invalid */ if( learner->tmp.mmap_start ) { offset = PAGEALIGN(learner->tmp.offset); learner->tmp.mmap_length = learner->tmp.avail + system_pagesize; learner->tmp.mmap_start = (byte_t *)MMAP(learner->tmp.mmap_start, learner->tmp.mmap_length, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(learner->tmp.file), offset); if( learner->tmp.mmap_start == MAP_FAILED ) { learner->tmp.mmap_start = NULL; } if( !learner->tmp.mmap_start ) { if( u_options & (1<tmp.file,learner->tmp.offset + (learner->tmp.mmap_cursor - learner->tmp.mmap_offset), SEEK_SET) ) { /* ok, this is fatal */ errormsg(E_FATAL, "could not resize and seek in tempfile, unable to proceed.\n"); } learner->tmp.mmap_length = 0; learner->tmp.mmap_offset = 0; learner->tmp.mmap_cursor = 0; } else { /* all is well, relock the pages */ MLOCK(learner->tmp.mmap_start, learner->tmp.mmap_length); MADVISE(learner->tmp.mmap_start, learner->tmp.mmap_length, MADV_SEQUENTIAL|MADV_WILLNEED); } /* if there was a fatal error, we simply don't return */ return (bool_t)1; } } return (bool_t)0; } /* assume we are at the end of the token list and there is enough room */ void tmp_write_token(learner_t *learner, const char *tok) { byte_t *p; if( learner->tmp.mmap_start ) { p = learner->tmp.mmap_start + learner->tmp.mmap_cursor; while( *tok ) { *p++ = *tok++; } *p++ = TOKENSEP; learner->tmp.mmap_cursor = p - learner->tmp.mmap_start; learner->tmp.used = learner->tmp.mmap_cursor - learner->tmp.mmap_offset; } else if( learner->tmp.file ) { /* now save token to temporary file */ if( (EOF == fputs(tok, learner->tmp.file)) || (EOF == fputc(TOKENSEP, learner->tmp.file)) ) { errormsg(E_ERROR, "could not write a token to tempfile, calculations will be skewed.\n"); } else { learner->tmp.used += (strlen(tok) + 1); } } } void tmp_close(learner_t *learner) { if( learner->tmp.mmap_start ) { MUNLOCK(learner->tmp.mmap_start, learner->tmp.mmap_length); MUNMAP(learner->tmp.mmap_start, learner->tmp.mmap_length); learner->tmp.mmap_start = NULL; } if( learner->tmp.file ) { fclose(learner->tmp.file); learner->tmp.file = NULL; if( learner->tmp.filename ) { unlink(learner->tmp.filename); cleanup.tempfile = NULL; free(learner->tmp.filename); learner->tmp.filename = NULL; } } } /*********************************************************** * EMPLIST FUNCTIONS * ***********************************************************/ bool_t emplist_grow(emplist_t *emp) { hash_count_t *n; if( emp ) { if( u_options & (1<max * 2); } n = (hash_value_t *)realloc(emp->stack, sizeof(hash_value_t *) * emp->max * 2); if( n != NULL ) { emp->max *= 2; emp->stack = n; return 1; } } errormsg(E_WARNING, "disabling emp.stack. Not enough memory? I couldn't allocate %li bytes\n", (sizeof(l_item_t *) * ((long int)emp->max) * 2)); m_options &= ~(1<top > reservoir[n].max) ) { free(reservoir[n].stack); reservoir[n].stack = NULL; } if( !reservoir[n].stack ) { for(reservoir[n].max = 1; emp->top > reservoir[n].max; reservoir[n].max *=2); reservoir[n].stack = (hash_value_t *)malloc(reservoir[n].max * sizeof(hash_value_t)); } if( reservoir[n].stack ) { memcpy(reservoir[n].stack, emp->stack, emp->top * sizeof(hash_value_t)); reservoir[n].top = emp->top; reservoir[n].shannon = emp->shannon; } else { errormsg(E_WARNING, "couldn't replace document #%" FMT_printf_integer_t " in reservoir, ignoring\n", n); } } /* * Adds emp to the reservoir in such a way that we * end up with a uniform random sample of size RESERVOIR_SIZE. * This algorithm is a short form of reservoir sampling, and we use * it here because we don't know the total number of documents * until it's too late. */ void emplist_add_to_reservoir(emplist_t *reservoir, document_count_t docno, emplist_t *emp) { double xi; if( docno < RESERVOIR_SIZE) { emplist_replace(reservoir, docno, emp); } else { xi = ((double)rand()/(RAND_MAX + 1.0)); if( (docno + 1) * xi < RESERVOIR_SIZE ) { xi = ((double)rand()/(RAND_MAX + 1.0)); emplist_replace(reservoir, (int)(RESERVOIR_SIZE * xi), emp); } } } /*********************************************************** * LEARNER FUNCTIONS * ***********************************************************/ void free_learner_hash(learner_t *learner) { if( learner->hash ) { if( learner->mmap_start != NULL ) { MUNMAP(learner->mmap_start, learner->mmap_hash_offset + cat->max_tokens * sizeof(c_item_t)); learner->mmap_start = NULL; learner->mmap_learner_offset = 0; learner->mmap_hash_offset = 0; learner->hash = NULL; } if( learner->hash ) { free(learner->hash); learner->hash = NULL; } } } bool_t create_learner_hash(learner_t *learner, FILE *input, bool_t readonly) { size_t j, n; byte_t *mmap_start; long mmap_learner_offset; long mmap_hash_offset; if( learner->hash ) { free_learner_hash(learner); } if( u_options & (1<max_tokens, PROT_READ|(readonly ? 0 : PROT_WRITE), MAP_SHARED, fileno(input), 0); if( mmap_start == MAP_FAILED ) { mmap_start = NULL; } if( mmap_start ) { /* now fill some member variables */ learner->mmap_start = mmap_start; learner->mmap_learner_offset = mmap_learner_offset; learner->mmap_hash_offset = mmap_hash_offset; learner->hash = (l_item_t *)(mmap_start + mmap_hash_offset); MADVISE(learner->mmap_start, learner->mmap_hash_offset + sizeof(l_item_t) * learner->max_tokens, MADV_SEQUENTIAL|MADV_WILLNEED); /* lock the pages to prevent swapping - on Linux, this works without root privs so long as the user limits are big enough - mine are unlimited ;-) On other OSes, root may me necessary. */ MLOCK(learner->mmap_start, learner->mmap_hash_offset + sizeof(l_item_t) * learner->max_tokens); } } } if( !learner->hash ) { for(n = 0; n < 1; ) { n = fread(learner, sizeof(learner_t), 1, input); if( (n == 0) && ferror(input) ) { return 0; } } /* allocate hash table normally */ learner->hash = (l_item_t *)malloc(learner->max_tokens * sizeof(l_item_t)); if( !learner->hash ) { errormsg(E_WARNING, "failed to allocate %li bytes for learner hash.\n", (sizeof(l_item_t) * ((long int)learner->max_tokens))); /* this error is not fatal, because we have another opportunity to allocate the hash later */ return 0; } MADVISE(learner->hash, sizeof(l_item_t) * learner->max_tokens, MADV_SEQUENTIAL); for(n = j = 0; n < learner->max_tokens; n += j) { j = fread(&learner->hash[n], sizeof(l_item_t), learner->max_tokens - n, input); if( (j == 0) && ferror(input) ) { errormsg(E_WARNING, "could not read online learner dump, ignoring.\n"); return 0; } } } return (learner->hash != NULL); } /* returns true if the hash could be grown, false otherwise. When the hash is grown, the old values must be redistributed. To do this, we reuse the l_item.lam member as a flag, since this is only needed later during minimization */ bool_t grow_learner_hash(learner_t *learner) { hash_count_t c, new_size; l_item_t *i, temp_item; if( !(u_options & (1<max_hash_bits < default_max_grow_hash_bits ) { /* this warning is mostly useless and distracting errormsg(E_WARNING, "growing hash table, next time perhaps consider using -h %d\n", learner.max_hash_bits + 1); */ /* there are two cases - if learner is mmapped, we must malloc a * new hash, otherwise we can realloc. An easy way to reduce the * first case to the second is to create a throwaway hash with * the old size and copy the mmapped contents to it. */ if( learner->mmap_start ) { if( (i = (l_item_t *)malloc(learner->max_tokens * sizeof(l_item_t))) == NULL ) { errormsg(E_WARNING, "failed to malloc hash table for growing.\n"); return 0; } memcpy(i, learner->hash, sizeof(l_item_t) * learner->max_tokens); free_learner_hash(learner); learner->hash = i; /* there's a MUNLOCK call below, so in theory we should balance this out by calling MLOCK here, since the i pointed region was never locked. However mlock/munlock calls do not nest, so there's no need. */ /* if( u_options & (1<hash, sizeof(l_item_t) * learner->max_tokens); */ /* } */ } if( u_options & (1<hash, sizeof(l_item_t) * learner->max_tokens); } /* grow the memory around the hash */ if( (i = (l_item_t *)realloc(learner->hash, sizeof(l_item_t) * (1<<(learner->max_hash_bits+1)))) == NULL ) { errormsg(E_WARNING, "failed to grow hash table.\n"); return 0; } /* we need the old value of learner->max_tokens for a while yet */ learner->max_hash_bits++; if( u_options & (1<max_hash_bits)); } MADVISE(i, sizeof(l_item_t) * (1<max_hash_bits), MADV_SEQUENTIAL); /* realloc doesn't initialize the memory */ memset(&((l_item_t *)i)[learner->max_tokens], 0, ((1<max_hash_bits) - learner->max_tokens) * sizeof(l_item_t)); learner->hash = i; /* now mark every used slot */ for(c = 0; c < learner->max_tokens; c++) { if( FILLEDP(&learner->hash[c]) ) { SETMARK(&learner->hash[c]); } } MADVISE(i, sizeof(l_item_t) * (1<max_hash_bits), MADV_RANDOM); /* now relocate each marked slot and clear it */ new_size = (1<max_hash_bits) - 1; for(c = 0; c < learner->max_tokens; c++) { while( MARKEDP(&learner->hash[c]) ) { /* find where it belongs */ i = &learner->hash[learner->hash[c].id & new_size]; while( FILLEDP(i) && !MARKEDP(i) ) { i++; i = (i > &learner->hash[new_size]) ? learner->hash : i; } /* guaranteed to exit since hash is larger than original */ /* clear the mark - this must happen after we look for i, since it should be possible to find i == learner->hash[c] */ UNSETMARK(&learner->hash[c]); /* now refile */ if( i != &learner->hash[c] ) { if( MARKEDP(i) ) { /* swap */ memcpy(&temp_item, i, sizeof(l_item_t)); memcpy(i, &learner->hash[c], sizeof(l_item_t)); memcpy(&learner->hash[c], &temp_item, sizeof(l_item_t)); } else { /* copy and clear */ memcpy(i, &learner->hash[c], sizeof(l_item_t)); memset(&learner->hash[c], 0, sizeof(l_item_t)); } } /* now &learner->hash[c] is marked iff there was a swap */ } } learner->max_tokens = (1<max_hash_bits); } else { u_options &= ~(1<filename; if( !create_learner_hash(learner, input, readonly) ) { ok = 0; goto skip_read_online; } /* restore members */ learner->filename = sav_filename; /* override options */ if( (m_options != learner->model.options) || (zthreshold != learner->model.tmin) || (m_cp != learner->model.cp) || (m_dt != learner->model.dt) ) { /* we don't warn about changes in u_options, as they can happen during computations */ errormsg(E_WARNING, "some command line options were changed when loading %s\n", path); m_options = learner->model.options; m_cp = learner->model.cp; m_dt = learner->model.dt; /* u_options = learner->u_options; */ zthreshold = learner->model.tmin; } /* last, there is a long list of token strings, we compute the start offset, and seek to the end so we can append more tokens */ learner->tmp.file = input; learner->tmp.filename = NULL; learner->tmp.offset = strlen(MAGIC_ONLINE) + sizeof(learner_t) + sizeof(l_item_t) * learner->max_tokens; learner->tmp.iobuf = NULL; if( u_options & (1<tmp.offset); /* since offset can be up to a page less than the true beginning, we must allow an extra page in the mmap length */ learner->tmp.mmap_length = learner->tmp.avail + system_pagesize; learner->tmp.mmap_start = (byte_t *)MMAP(0, learner->tmp.mmap_length, PROT_READ|(readonly ? 0 : PROT_WRITE), MAP_SHARED, fileno(learner->tmp.file), offset); if( learner->tmp.mmap_start == MAP_FAILED ) { learner->tmp.mmap_start = NULL; } if( learner->tmp.mmap_start ) { MLOCK(learner->tmp.mmap_start, learner->tmp.mmap_length); MADVISE(learner->tmp.mmap_start, learner->tmp.mmap_length, MADV_SEQUENTIAL|MADV_WILLNEED); learner->tmp.mmap_offset = learner->tmp.offset - offset; learner->tmp.mmap_cursor = 0; } else { learner->tmp.mmap_length = 0; if( u_options & (1<tmp.file = NULL; learner->tmp.filename = NULL; goto skip_read_online; } /* consistency check */ if( tmp_get_pos(learner) != learner->tmp.used ) { ok = 0; learner->tmp.file = NULL; learner->tmp.filename = NULL; goto skip_read_online; } /* printf("tmp.used = %ld tmp.avail = %ld tmp.offset = %ld\n", */ /* learner->tmp.used, learner->tmp.avail, learner->tmp.offset); */ /* last but not least, hash may contain junk because mmapped, so clear some data */ e = learner->hash + learner->max_tokens; for(p = learner->hash; p < e; p++) { if( FILLEDP(p) ) { p->tmp.read.eff = 0; } } } skip_read_online: /* if we're ok, we must leave the file open, even if it's mmapped, because we must be able to unmap/remap it on the fly */ if( !ok ) { if( learner->tmp.mmap_start ) { MUNMAP(learner->tmp.mmap_start, learner->tmp.mmap_length); learner->tmp.mmap_start = 0; learner->tmp.mmap_length = 0; learner->tmp.mmap_offset = 0; learner->tmp.mmap_cursor = 0; } fclose(input); errormsg(E_FATAL, "the file %s could not be read, learning from scratch.\n", path); } } if( u_options & (1<mmap_start != NULL ) { mml = (learner_t *)(learner->mmap_start + learner->mmap_learner_offset); memcpy(mml, learner, sizeof(learner_t)); /* clear some variables just to be safe */ mml->mmap_start = NULL; mml->mmap_learner_offset = 0; mml->mmap_hash_offset = 0; mml->hash = NULL; return; } /* if we're here, then we must write out a completely new memory dump, * and the mmap_ variables are all zero. */ output = mytmpfile(path, &tempname); if( output ) { if( out_iobuf ) { setvbuf(output, (char *)out_iobuf, (int)_IOFBF, (size_t)(BUFFER_MAG * system_pagesize)); } ok = 1; ok = ok && (0 < fprintf(output, MAGIC_ONLINE)); /* save current model options - don't want them to change next time we learn */ learner->model.options = m_options; learner->model.cp = m_cp; learner->model.dt = m_dt; learner->u_options = u_options; /* make sure some stuff is zeroed out */ /* but leave others untouched, eg doc.A, doc.S, doc.count for shannon */ learner->mmap_start = NULL; /* assert mmap_start == NULL */ learner->mmap_learner_offset = 0; learner->mmap_hash_offset = 0; learner->doc.emp.top = 0; learner->doc.emp.max = 0; learner->doc.emp.stack = NULL; memset(learner->doc.reservoir, 0, RESERVOIR_SIZE * sizeof(emplist_t)); /* write learner */ ok = ok && (0 < fwrite(learner, sizeof(learner_t), 1, output)); for(t = j = 0; t < learner->max_tokens; t += j) { j = fwrite(&(learner->hash[t]), sizeof(l_item_t), learner->max_tokens - t, output); if( (j == 0) && ferror(output) ) { ok = 0; goto skip_write_online; } } tokoff = ftell(output); /* extend the size ofthe file - this is needed mostly for mmapping, but it might also marginally speed up the repeated writes below */ if( -1 == ftruncate(fileno(output), tokoff + learner->tmp.avail) ) { ok = 0; goto skip_write_online; } /* write temporary tokens */ if( !tmp_seek_start(learner) ) { errormsg(E_ERROR, "cannot seek in online token file %s\n", tempname); ok = 0; goto skip_write_online; } n = 0; while( (n = tmp_read_block(learner, buf, BUFSIZ, &sp)) > 0 ) { for(t = j = 0; t < n; t += j) { j = fwrite(sp + t, 1, n - t, output); if( (j == 0) && ferror(output) ) { ok = 0; goto skip_write_online; } } } /* consistency check */ if( (tokoff + learner->tmp.used) != ftell(output) ) { ok = 0; goto skip_write_online; } skip_write_online: fclose(output); if( u_options & (1<filename); return 0; } if( !tmp_seek_end(dest) ) { errormsg(E_ERROR, "cannot seek in temporary token file [%s]\n", dest->filename); return 0; } q = tok; while( (n = tmp_read_block(src, buf, BUFSIZ, &p)) > 0 ) { /* p = buf; */ /* p[n] = '\0'; */ while( n-- > 0 ) { if( *p != TOKENSEP) { *q++ = *p; /* copy into tok */ } else { /* interword space */ *q = 0; /* append NUL to tok */ /* now lookup weight in hash */ id = hash_full_token(tok); k = find_in_learner(dest, id); if( !k || !FILLEDP(k) ) { tmp_grow(dest); /* just in case we're full */ tmp_write_token(dest, tok); } q = tok; /* reset q */ } p++; } } return 1; } bool_t merge_hashes(learner_t *dest, learner_t *src) { register l_item_t *i, *j, *e; alphabet_size_t ci, cj; e = src->hash + src->max_tokens; for(j = src->hash ; j != e; j++) { if( FILLEDP(j) ) { i = find_in_learner(dest, j->id); if( i && !FILLEDP(i) && ((100 * dest->unique_token_count) >= (HASH_FULL * dest->max_tokens)) && grow_learner_hash(dest) ) { i = find_in_learner(dest,j->id); /* new i, go through all tests again */ } if( i ) { if( FILLEDP(i) ) { /* nothing */ } else if( /* !FILLEDP(i) && */ ((100 * dest->unique_token_count) < (HASH_FULL * dest->max_tokens) ) ) { SET(i->id, j->id); INCREMENT(dest->unique_token_count, K_TOKEN_COUNT_MAX, overflow_warning); i->typ = j->typ; /* order accounting */ dest->max_order = MAXIMUM(dest->max_order,i->typ.order); INCREMENT(dest->fixed_order_unique_token_count[i->typ.order], K_TOKEN_COUNT_MAX, overflow_warning); } INCREASE(i->count, j->count, K_TOKEN_COUNT_MAX, overflow_warning); dest->tmax = MAXIMUM(dest->tmax, i->count); INCREASE(dest->full_token_count, j->count, K_TOKEN_COUNT_MAX, overflow_warning); INCREASE(dest->fixed_order_token_count[i->typ.order], j->count, K_TOKEN_COUNT_MAX, skewed_constraints_warning); } } } for(ci = 0; ci < ASIZE; ci++) { for(cj = 0; cj < ASIZE; cj++) { dest->dig[ci][cj] += src->dig[ci][cj]; } } return 1; } bool_t merge_learner_struct(learner_t *learner, char *path) { learner_t dummy; bool_t ok = 0; options_t m_sav, u_sav; m_sav = m_options; u_sav = u_options; init_learner(&dummy, path, 1); m_options = m_sav; u_options = u_sav; if( dummy.retype != 0 ) { errormsg(E_WARNING, "merging regular expressions is not supported, ignoring %s\n", path); ok = 0; } else { /* in case these changed while initing dummy */ learner->model.options = m_options; learner->model.cp = m_cp; learner->model.dt = m_dt; /* _before_ we fill the hash, we merge the temp tokens (we only add those thokens not found in learner->hash) */ ok = merge_temp_tokens(learner, &dummy) && merge_hashes(learner, &dummy); if( ok ) { learner->doc.A += dummy.doc.A; learner->doc.S += dummy.doc.S; learner->doc.count += dummy.doc.count; learner->doc.nullcount += dummy.doc.nullcount; /* can't use these when merging */ learner->alpha = 0.0; learner->beta = 0.0; learner->mu = 0.0; learner->s2 = 0.0; } } free_learner(&dummy); if( !ok ) { errormsg(E_WARNING, "%s could not be merged, the learned category might be corrupt\n", path); } return ok; } /* returns an approximate binomial r.v.; if np < 10 and n > 20, * a Poisson approximation is used, else the variable is exact. */ token_count_t binomial(token_count_t n, double p) { double sum, thresh; token_count_t i, x; x = 0; if( (n > 20) && (n * p < 10) ) { /* approximate poisson has lambda = np */ sum = -log( ((double)rand())/(RAND_MAX + 1.0) ); thresh = n * p; /* printf("poisson with sum = %g thresh = %g\n", sum, thresh); */ while( (sum < thresh) && (x < n) ) { x++; sum += -log( ((double)rand())/(RAND_MAX + 1.0) ); /* printf("poisson with sum = %g thresh = %g, x = %d\n", sum, thresh, x); */ } } else { /* direct calculation of binomial */ for(i = 0; i < n; i++) { x += (int)(p + ((double)rand())/(RAND_MAX + 1.0)); } } /* if( x > 0 ) { printf("binomial x = %d, n = %d, p = %g, np = %g\n", x, n, p, n * p); } */ return x; } void update_shannon_partials(learner_t *learner, bool_t fulldoc) { hash_count_t i; weight_t ell, lell; bool_t docount; docount = (learner->doc.emp.top > 0); /* if force is true, we have a document, else we check emp.top to see if this is a nonempty document */ if( m_options & (1<doc.emp.shannon = 0; if( learner->doc.emp.top > 0 ) { /* assume all marks are zero to start with */ for(i = 0; i < learner->doc.emp.top; i++) { l_item_t *p = find_in_learner(learner, learner->doc.emp.stack[i]); if( p && !MARKEDP(p) ) { ell = ((weight_t)p->tmp.read.eff)/learner->doc.emp.top; /* it would be nice to be able to digitize p->B, but ell is often smaller than the smallest value, and if there are many documents, there could simultaneously be overflow on the most frequent features. So we need p->B to be a floating point type. */ p->B += ell; /* the standard entropy convention is that 0*inf = 0. here, if * ell is so small that log(ell) is infinite, we pretend ell * == 0 this is slightly better than testing for ell == 0 * directly. */ lell = -log(ell); if( !isinf(lell) ) { learner->doc.emp.shannon += ell * lell; } SETMARK(p); } } if( u_options & (1<doc.reservoir, learner->doc.count, &learner->doc.emp); } /* fprintf(stderr, "udate_shannon A +(%f) S +(%f)\n", */ /* -learner->doc.emp.shannon, (learner->doc.emp.shannon * learner->doc.emp.shannon)); */ learner->doc.A += -learner->doc.emp.shannon; learner->doc.S += (learner->doc.emp.shannon * learner->doc.emp.shannon); /* clear the empirical counts and marks */ for(i = 0; i < learner->doc.emp.top; i++) { l_item_t *p = find_in_learner(learner, learner->doc.emp.stack[i]); if( p && MARKEDP(p) ) { p->tmp.read.eff = 0; UNSETMARK(p); } } /* now reset the empirical features */ learner->doc.emp.top = 0; } } if( docount ) { learner->doc.count++; } } void calc_shannon(learner_t *learner) { l_item_t *i, *e; document_count_t c, n; hash_count_t q; emplist_t *empl; score_t score; score_t effective_count = 0.0; double Lambda, jensen, s2; learner->mu = 0.0; learner->s2 = 0.0; learner->alpha = 0.0; learner->beta = 0.0; effective_count = learner->doc.count; /* cast to real value for readability */ if( (m_options & (1<doc.count > 1) ) { learner->shannon += -(learner->doc.A/effective_count); learner->shannon2 = (effective_count * learner->doc.S - (learner->doc.A * learner->doc.A)) / (effective_count * (effective_count - 1.0)); /* fprintf(stderr, "[%f %f %f %f]\n", effective_count * learner->doc.S, (learner->doc.A * learner->doc.A), (effective_count * learner->doc.S - (learner->doc.A * learner->doc.A)), (effective_count * (effective_count - 1.0)) ); */ /* fprintf(stderr, "calc_entropy eff %f sha %f sha2 %f A %f S %f\n", effective_count, learner->shannon, learner->shannon2, learner->doc.A , learner->doc.S); */ } else { /* no individual documents, so compute global entropy */ learner->shannon = 0.0; learner->shannon2 = 0.0; e = learner->hash + learner->max_tokens; for(i = learner->hash; i != e; i++) { if( FILLEDP(i) && (i->typ.order == learner->max_order) ) { learner->shannon += log((weight_t)i->count) * (weight_t)i->count; } } learner->shannon = -( learner->shannon/learner->full_token_count - log((weight_t)learner->full_token_count) ); } if( (u_options & (1<doc.count > 0) ) { /* shannon was computed during update */ jensen = 0.0; e = learner->hash + learner->max_tokens; for(i = learner->hash; i != e; i++) { if( NOTNULL(i->lam) ) { Lambda = UNPACK_LAMBDA(i->lam); if( i->typ.order == 1 ) { Lambda += UNPACK_RWEIGHTS(i->tmp.min.dref) - learner->logZ; } learner->mu += (Lambda * i->B); jensen += (Lambda * Lambda * i->B); } } learner->mu /= effective_count; learner->mu = -(learner->shannon + learner->mu); s2 = 0.0; n = 1; for(c = 0; c < RESERVOIR_SIZE; c++) { empl = &(learner->doc.reservoir[c]); if( !empl->stack ) { n++; continue; } else { score = 0; for(q = 0; q < empl->top; q++) { i = find_in_learner(learner, empl->stack[q]); if( i && NOTNULL(i->lam) ) { Lambda = UNPACK_LAMBDA(i->lam); if( i->typ.order == 1 ) { Lambda += UNPACK_RWEIGHTS(i->tmp.min.dref) - learner->logZ; } score += Lambda; } } score = score/empl->top + empl->shannon; if( u_options & (1<shannon), empl->top); } score = -score - learner->mu; s2 += (score)*(score); } } /* the reservoir doesn't contain enough extreme samples, so the variance is necessarily underestimated. */ if( (c <= n) || isinf(learner->s2) ) { learner->s2 = 0.0; learner->alpha = 0.0; learner->beta = 0.0; } else { learner->s2 = s2/(c-n); learner->alpha = (learner->mu*learner->mu)/learner->s2; learner->beta = learner->s2/learner->mu; } } else { learner->alpha = 0.0; learner->beta = 0.0; learner->mu = 0.0; learner->s2 = 0.0; } if( m_options & (1<shannon), nats2bits(learner->mu), nats2bits(learner->s2), nats2bits(learner->alpha), nats2bits(learner->beta)); } } void reset_mbox_messages(learner_t *learner, MBOX_State *mbox) { not_header = 1; learner->doc.count = 0; learner->doc.nullcount = 0; /* first header doesn't count */ learner->doc.skip = 0; } void count_mbox_messages(learner_t *learner, Mstate mbox_state, char *textbuf) { if( !textbuf ) { update_shannon_partials(learner, 0); /* don't count document */ } else { switch(mbox_state) { case msHEADER: if(not_header) { if( u_options & (1<doc.skip = ( rand() > (int)(RAND_MAX>>decimation) ); } if( !learner->doc.skip ) { if( m_options & (1<doc.emp.top == 0) ) { learner->doc.nullcount++; } update_shannon_partials(learner, 1); } } not_header = 0; break; default: not_header = 1; break; } } } l_item_t *find_in_learner(learner_t *learner, hash_value_t id) { register l_item_t *i, *loop; /* start at id */ i = loop = &learner->hash[id & (learner->max_tokens - 1)]; while( FILLEDP(i) ) { if( EQUALP(i->id,id) ) { return i; /* found id */ } else { i++; /* not found */ /* wrap around */ i = (i >= &learner->hash[learner->max_tokens]) ? learner->hash : i; if( i == loop ) { return NULL; /* when hash table is full */ } } } /* empty slot, so not found */ return i; } /* places the token in the global hash and writes the token to a temporary file for later, then updates the digram frequencies. Tokens have the format DIAMOND t1 DIAMOND t2 ... tn DIAMOND CLASSEP class NUL */ void hash_word_and_learn(learner_t *learner, char *tok, token_type_t tt, regex_count_t re) { hash_value_t id; l_item_t *i; char *s; alphabet_size_t p,q,len; for(s = tok; s && *s == DIAMOND; s++); if( s && (*s != EOTOKEN) ) { if( overflow_warning ) { return; /* for there be troubles ahead */ } if( m_options & (1<doc.skip ) { return; } } else { if( rand() > (int)(RAND_MAX>>decimation) ) { return; } } } id = hash_full_token(tok); i = find_in_learner(learner, id); if( i && !FILLEDP(i) && ((100 * learner->unique_token_count) >= (HASH_FULL * learner->max_tokens)) && grow_learner_hash(learner) ) { i = find_in_learner(learner,id); /* new i, go through all tests again */ } if( i ) { if( FILLEDP(i) ) { /* redundant :-) */ } else if( /* !FILLEDP(i) && */ ((100 * learner->unique_token_count) < (HASH_FULL * learner->max_tokens) ) ) { /* fill the hash and write to file */ SET(i->id,id); INCREMENT(learner->unique_token_count, K_TOKEN_COUNT_MAX, overflow_warning); i->typ = tt; /* order accounting */ learner->max_order = MAXIMUM(learner->max_order,i->typ.order); INCREMENT(learner->fixed_order_unique_token_count[i->typ.order], K_TOKEN_COUNT_MAX, overflow_warning); if( (u_options & (1<id); print_token(stdout, tok); fprintf(stdout, " %d\n", i->typ.order); } tmp_grow(learner); /* just in case we're full */ tmp_write_token(learner, tok); } INCREMENT(i->count, K_TOKEN_COUNT_MAX, overflow_warning); learner->tmax = MAXIMUM(learner->tmax, i->count); if( m_options & (1<doc.emp.top < learner->doc.emp.max) || emplist_grow(&learner->doc.emp) ) { i->tmp.read.eff++; /* this can never overflow before i->count */ UNSETMARK(i); /* needed for calculating shannon */ learner->doc.emp.stack[learner->doc.emp.top++] = i->id; } } INCREMENT(learner->full_token_count, K_TOKEN_COUNT_MAX, overflow_warning); INCREMENT(learner->fixed_order_token_count[i->typ.order], K_TOKEN_COUNT_MAX, skewed_constraints_warning); } if( digramic_overflow_warning ) { return; } /* now update digram frequency counts */ if( tt.order == 1 ) { /* count each token only once */ p = *tok++; CLIP_ALPHABET(p); len = 1; /* finally update character frequencies */ while( *tok != EOTOKEN ) { q = (unsigned char)*tok; CLIP_ALPHABET(q); if( learner->dig[p][q] < K_DIGRAM_COUNT_MAX ) { learner->dig[p][q]++; } else { digramic_overflow_warning = 1; } if( learner->dig[RESERVED_MARGINAL][q] < K_DIGRAM_COUNT_MAX ) { learner->dig[RESERVED_MARGINAL][q]++; } /* no warning on overflow */ p = q; tok++; if( q != DIAMOND ) { len++; } } learner->dig[RESERVED_TOKLEN][len]++; if( digramic_overflow_warning ) { errormsg(E_WARNING, "ran out of integers (too much data), " "reference measure may be skewed.\n"); m_options |= (1<max_tokens = default_max_tokens; learner->max_hash_bits = default_max_hash_bits; learner->full_token_count = 0; learner->unique_token_count = 0; learner->tmax = 0; learner->logZ = 0.0; learner->shannon = 0.0; learner->shannon2 = 0.0; learner->alpha = 0.0; learner->beta = 0.0; learner->mu = 0.0; learner->s2 = 0.0; learner->max_order = 0; memset(learner->mediaprobs, 0 , TOKEN_CLASS_MAX * sizeof(score_t)); learner->doc.A = 0.0; learner->doc.S = 0.0; learner->doc.count = 0; learner->doc.nullcount = 0; learner->doc.emp.top = 0; learner->doc.emp.max = 0; learner->doc.emp.stack = NULL; memset(learner->doc.reservoir, 0, RESERVOIR_SIZE * sizeof(emplist_t)); learner->model.options = m_options; learner->model.cp = m_cp; learner->model.dt = m_dt; learner->model.tmin = zthreshold; learner->u_options = u_options; learner->mmap_start = NULL; learner->mmap_learner_offset = 0; learner->mmap_hash_offset = 0; learner->hash = NULL; /* init character frequencies */ for(i = 0; i < ASIZE; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } for(c = 0; c < MAX_RE + 1; c++) { learner->regex_token_count[c] = 0; } for(z = 0; z < MAX_SUBMATCH; z++) { learner->fixed_order_token_count[z] = 0; learner->fixed_order_unique_token_count[z] = 0; } if( m_options & (1<hash = (l_item_t *)calloc(learner->max_tokens, sizeof(l_item_t)); if( !learner->hash ) { errormsg(E_FATAL, "not enough memory? I couldn't allocate %li bytes\n", (sizeof(l_item_t) * ((long int)learner->max_tokens))); } /* open temporary file for writing tokens */ learner->tmp.file = mytmpfile(learner->filename ? learner->filename : progname, &learner->tmp.filename); /* set this: in case of a fatal signal, we can unlink the temprile */ cleanup.tempfile = learner->tmp.filename; learner->tmp.iobuf = NULL; /* can't reuse in_iobuf or out_iobuf */ learner->tmp.offset = 0; learner->tmp.avail = 0; learner->tmp.used = 0; learner->tmp.mmap_start = NULL; learner->tmp.mmap_offset = 0; learner->tmp.mmap_length = 0; learner->tmp.mmap_cursor = 0; if( learner->tmp.file ) { #if defined HAVE_POSIX_MEMALIGN /* buffer must exist until after fclose() */ if( 0 != posix_memalign(&learner->tmp.iobuf, system_pagesize, BUFFER_MAG * system_pagesize) ) { learner->tmp.iobuf = NULL; } #elif defined HAVE_MEMALIGN /* buffer can't be free()'d */ learner->tmpiobuf = (void *)memalign(system_pagesize, BUFFER_MAG * system_pagesize); #elif defined HAVE_VALLOC /* buffer can't be free()'d */ learner->tmpiobuf = (void *)valloc(BUFFER_MAG * system_pagesize); #endif if( learner->tmp.iobuf ) { setvbuf(learner->tmp.file, (char *)learner->tmp.iobuf, (int)_IOFBF, (size_t)(BUFFER_MAG * system_pagesize)); } } } if( u_options & (1<hash, sizeof(l_item_t) * learner->max_tokens); } MADVISE(learner->hash, sizeof(l_item_t) * learner->max_tokens, MADV_SEQUENTIAL); if( m_options & (1<doc.emp.max = system_pagesize/sizeof(hash_count_t); learner->doc.emp.stack = (hash_value_t *)malloc(learner->doc.emp.max * sizeof(hash_value_t)); if( !learner->doc.emp.stack ) { errormsg(E_WARNING, "disabling emp.stack. Not enough memory? I couldn't allocate %li bytes\n", sizeof(hash_count_t *) * ((long int)learner->doc.emp.max)); m_options &= ~(1<doc.emp.stack ) { free(learner->doc.emp.stack); learner->doc.emp.stack = NULL; } for( i = 0; i < RESERVOIR_SIZE; i++ ) { if( learner->doc.reservoir[i].stack ) { free(learner->doc.reservoir[i].stack); learner->doc.reservoir[i].stack = NULL; } } if( learner->tmp.file ) { fclose(learner->tmp.file); learner->tmp.file = NULL; } cleanup_tempfiles(); } /* calculates the most probable Dirichlet parameters given digram counts. Method described in MacKay and Peto (1995) Since we don't count the DIAMOND-DIAMOND digram, including the prior will overestimate the DIAMOND-DIAMOND transition probability. However, for this transition as well as the others, the Dirichlet will have practically no effect when there's enough data in the corpus. HOWEVER: * A property of the MP posterior estimates is that if character j * never appears as a transition *target*, then the corresponding * u[j] entry is null. Sometimes, this makes sense, as j isn't part * of the "vocabulary", but other times it's not sensible, becasue sooner * or later some spam message will make use of that character in * some combination with another character. When that happens, we're * in trouble. * * Previous versions of dbacl.c had a simple hack to prevent this * possibility: we pretend we saw a DIAMOND-j-DIAMOND * double transition, for each j. Equivalently, we simply increment * the count by 1 for each such transition, i.e. * learner->dig[i][(alphabet_size_t)DIAMOND]++; * learner->dig[(alphabet_size_t)DIAMOND][i]++; * * This hack has now been removed again, to prevent confusion. * It's not really needed, since the uniform measure can be used * for spam filtering. */ void make_dirichlet_digrams(learner_t *learner) { alphabet_size_t i, j; token_count_t k; float G[ASIZE]; float H[ASIZE]; float V[ASIZE]; float F[ASIZE]; double prev_alpha; double K, t; /* initialize */ dirichlet.alpha = 1.0; for(i = AMIN; i < ASIZE; i++) { dirichlet.u[i] = 1.0/((double)(ASIZE - AMIN)); } /* precompute useful constants */ for(j = AMIN; j < ASIZE; j++) { G[j] = 0.0; H[j] = 0.0; V[j] = 0.0; F[j] = 0.0; for(i = AMIN; i < ASIZE; i++) { for(k = AMIN; k < (token_count_t)learner->dig[i][j]; k++) { G[j] += 1.0/k; H[j] += 1.0/((double)k*k); } if( learner->dig[i][j] > 0 ) { V[j]++; F[j] += learner->dig[i][j]; } } if( 0 && u_options & (1< %g\n", prev_alpha, dirichlet.alpha); } } while((k++ < MAX_DIRITER) && (fabs(prev_alpha - dirichlet.alpha) > qtol_alpha) ); if( k >= MAX_DIRITER ) { errormsg(E_WARNING, "dirichlet measure did not converge.\n"); } if(u_options & (1<dig[i][j]; } for(j = AMIN; j < ASIZE; j++) { /* note: simulate the effect of digitizing the digrams */ learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(log(((weight_t)learner->dig[i][j] + dirichlet.u[j]) / (t + dirichlet.alpha)))); if( 1 && u_options & (1<dig[%d][%d] = %f\n", i, j, learner->dig[i][j]); } } } /* clear other data */ for(i = 0; i < AMIN; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } } void make_uniform_digrams(learner_t *learner) { alphabet_size_t i, j; for(i = AMIN; i < ASIZE; i++) { for(j = AMIN; j < ASIZE; j++) { /* note: simulate the effect of digitizing the digrams */ learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(-log(ASIZE - AMIN))); if(0 && u_options & (1<dig[%d][%d] = %f\n", i, j, learner->dig[i][j]); } } } /* clear other data */ for(i = 0; i < AMIN; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } } void make_toklen_digrams(learner_t *learner) { alphabet_size_t i, j; weight_t lam[MAX_TOKEN_LEN+2]; weight_t total; /* zero out usual digrams, we only use token length */ { for(i = AMIN; i < ASIZE; i++) { for(j = AMIN; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } for(j = AMIN; j < ASIZE; j++) { learner->dig[RESERVED_MARGINAL][j] = 0.0; } } /* note: toklen counts the number of transitions, not number of chars */ total = 0.0; for(i = 2; i < MAX_TOKEN_LEN+2; i++) { if( learner->dig[RESERVED_TOKLEN][i] <= 0.0 ) { /* don't want infinities */ learner->dig[RESERVED_TOKLEN][i]++; } total += learner->dig[RESERVED_TOKLEN][i]; } lam[0] = 0.0; /* normalizing constant */ for(i = 2; i < MAX_TOKEN_LEN+2; i++) { lam[i] = log(learner->dig[RESERVED_TOKLEN][i]/total) - i * log(ASIZE - AMIN); } for(i = 0; i < MAX_TOKEN_LEN+2; i++) { if(0 && u_options & (1<dig[%d][%d] = %f %f %f\n", RESERVED_TOKLEN, i, learner->dig[RESERVED_TOKLEN][i], -i * log(ASIZE - AMIN), lam[i]); } learner->dig[RESERVED_TOKLEN][i] = UNPACK_DIGRAMS(PACK_DIGRAMS(lam[i])); } } void make_mle_digrams(learner_t *learner) { alphabet_size_t i, j; double total; double missing; /* for the mle we use a slightly modified emprirical frequency histogram. This is necessary because the true mle causes a singularity in classification whenever a word contains a character transition which was never seen before. The modification is to mix the true mle with a uniform distribution, but the uniform only accounts for 1/total of the mass, so ie it disappears quickly. */ for(i = AMIN; i < ASIZE; i++) { total = 0.0; missing = 0.0; for(j = AMIN; j < ASIZE; j++) { if( learner->dig[i][j] > 0.0 ) { total += learner->dig[i][j]; } else { missing++; } } if( total > 0.0 ) { if( missing > 0.0 ) { missing = 1.0/missing; for(j = AMIN; j < ASIZE; j++) { learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(log((learner->dig[i][j]/total) * (1.0 - missing) + missing))); } } else { for(j = AMIN; j < ASIZE; j++) { learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(log(learner->dig[i][j] / total))); } } } else { for(j = AMIN; j < ASIZE; j++) { learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(-log(missing))); } } } /* clear other data */ for(i = 0; i < AMIN; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } } void make_iid_digrams(learner_t *learner) { alphabet_size_t i, j; double total; double missing; /* the digrams here are not character transitions, but merely destination character frequencies, ie the characters of a token are assumed independent and identically distributed. */ total = 0.0; missing = 0.0; for(j = AMIN; j < ASIZE; j++) { if( learner->dig[RESERVED_MARGINAL][j] > 0.0 ) { total += learner->dig[RESERVED_MARGINAL][j]; } else { missing++; } } if( total > 0.0 ) { if( missing > 0.0 ) { missing = 1.0/missing; for(j = AMIN; j < ASIZE; j++) { learner->dig[RESERVED_MARGINAL][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(log((learner->dig[RESERVED_MARGINAL][j]/total) * (1.0 - missing) + missing))); } } else { for(j = AMIN; j < ASIZE; j++) { learner->dig[RESERVED_MARGINAL][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(log(learner->dig[RESERVED_MARGINAL][j] / total))); } } } else { for(j = AMIN; j < ASIZE; j++) { learner->dig[RESERVED_MARGINAL][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(-log(missing))); } } /* now make all transitions identical */ for(j = 0; j < ASIZE; j++) { for(i = AMIN; i < ASIZE; i++) { learner->dig[i][j] = learner->dig[RESERVED_MARGINAL][j]; } } /* clear other data */ for(i = 0; i < AMIN; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } } /* use 0.0 for small datasets, 1.0 for huge datasets. * 0.6 works well generally. I don't understand this :-( */ void transpose_digrams(learner_t *learner) { register alphabet_size_t i, j; register weight_t t; /* we skip transitions involving DIAMOND, TOKENSEP */ /* code below uses fact that DIAMOND == 0x01 */ /* code below uses fact that TOKENSEP == 0x02 */ for(i = AMIN; i < ASIZE; i++) { for(j = AMIN; j < i; j++) { t = (learner->dig[i][j] + learner->dig[j][i])/2.0; learner->dig[j][i] = 0.6 * learner->dig[j][i] + 0.4 * t; learner->dig[i][j] = 0.6 * learner->dig[i][j] + 0.4 * t; } } } void recompute_ed(learner_t *learner, weight_t *plogzon, weight_t *pdiv, int i, weight_t lam[ASIZE], weight_t Xi) { register alphabet_size_t j; weight_t logA = log((weight_t)(ASIZE - AMIN)); weight_t logzon, div; weight_t maxlogz, tmp; maxlogz = 0.0; for(j = AMIN; j < ASIZE; j++) { if( lam[j] > 0.0 ) { tmp = lam[j] + log(1.0 - exp(-lam[j])) - logA; if( maxlogz < tmp ) { maxlogz = tmp; } } } logzon = exp(0.0 - maxlogz); div = 0.0; for(j = AMIN; j < ASIZE; j++) { if( lam[j] > 0.0 ) { tmp = -logA - maxlogz; logzon += (exp( lam[j] + tmp) - exp(tmp)); div += lam[j] * learner->dig[i][j]; } } tmp = maxlogz + log(logzon); if( isnan(tmp) ) { errormsg(E_FATAL,"sorry, digramic partition function went kaboom.\n"); } logzon = tmp; div = div/Xi - logzon; *plogzon = logzon; *pdiv = div; } void make_entropic_digrams(learner_t *learner) { weight_t lam[ASIZE]; weight_t lam_delta, old_lam, logt, maxlogt; weight_t Xi, logXi, logzon, div, old_logzon, old_div; weight_t logA = log((weight_t)(ASIZE - AMIN)); register alphabet_size_t i, j; int itcount; for(i = AMIN; i < ASIZE; i++) { /* initializations */ Xi = 0.0; for(j = AMIN; j < ASIZE; j++) { Xi += learner->dig[i][j]; lam[j] = 0.0; } logXi = log(Xi); recompute_ed(learner, &logzon, &div, i, lam, Xi); /* now iterate - this is like minimize_learner_divergence() */ itcount = 0; do { itcount++; old_logzon = logzon; old_div = div; lam_delta = 0.0; for(j = AMIN; j < ASIZE; j++) { if( learner->dig[i][j] > 0.0 ) { old_lam = lam[j]; lam[j] = log(learner->dig[i][j]) - logXi + logA + logzon; if( isnan(lam[j]) ) { lam[j] = old_lam; recompute_ed(learner, &logzon, &div, i, lam, Xi); } else { if( lam[j] > (old_lam + MAX_LAMBDA_JUMP) ) { lam[j] = (old_lam + MAX_LAMBDA_JUMP); } else if( lam[j] < (old_lam - MAX_LAMBDA_JUMP) ) { lam[j] = (old_lam - MAX_LAMBDA_JUMP); } /* don't want negative weights */ if( lam[j] < 0.0 ) { lam[j] = 0.0; } if( lam_delta < fabs(lam[j] - old_lam) ) { lam_delta = fabs(lam[j] - old_lam); } } } } recompute_ed(learner, &logzon, &div, i, lam, Xi); if( u_options & (1< %" FMT_printf_score_t " (%10f, %10f)\n", i, old_div, div, lam_delta, fabs(logzon - old_logzon)); } } while( ((fabs(div - old_div) > 0.001) || (lam_delta > 0.001) || (fabs(logzon - old_logzon) > 0.001)) && (itcount < 500) ); /* now make the probabilities */ /* transitions should already sum to 1, but better safe than sorry */ maxlogt = log(0.0); for(j = AMIN; j < ASIZE; j++) { if( maxlogt < lam[j] ) { maxlogt = lam[j]; } } maxlogt += -logA -logzon; logt = 0.0; for(j = AMIN; j < ASIZE; j++) { logt += exp(lam[j] - logA - logzon - maxlogt); } logt = maxlogt + log(logt); for(j = AMIN; j < ASIZE; j++) { /* note: simulate the effect of digitizing the digrams */ learner->dig[i][j] = UNPACK_DIGRAMS(PACK_DIGRAMS(lam[j] - logA - logzon - logt)); if(0 && u_options & (1<dig[%d][%d] = %f\n", i, j, learner->dig[i][j]); } } } /* clear other data */ for(i = 0; i < AMIN; i++) { for(j = 0; j < ASIZE; j++) { learner->dig[i][j] = 0.0; } } } void interpolate_digrams(weight_t N, weight_t count[], weight_t p[]) { weight_t lambda = 0.5; weight_t Clam, Dlam, Zlam; alphabet_size_t i; int q = 0; for(q = 0; q < 100; q++) { Zlam = Dlam = Clam = 0.0; for(i = AMIN; i < ASIZE; i++) { Clam += log(p[i]) * (count[i]/N); Zlam += pow(p[i], lambda); Dlam += log(p[i]) * pow(p[i], lambda); } lambda += 0.1 * (Clam - Dlam/Zlam); /* if( lambda > 1.0 ) { lambda = 1.0; } */ /* else if( lambda < 0.0 ) { lambda = 0.0; } */ /* printf("Clam = %g Dlam = %g, Zlam = %g, lamdba = %g\n", Clam, Dlam, Zlam, lambda); */ } } weight_t calc_learner_digramic_excursion(learner_t *learner, char *tok) { register alphabet_size_t p, q; register weight_t t = 0.0; register alphabet_size_t len; /* now update digram frequency counts */ p = (unsigned char)*tok++; CLIP_ALPHABET(p); len = 1; /* finally update character frequencies */ while( *tok != EOTOKEN ) { q = (unsigned char)*tok; CLIP_ALPHABET(q); t += learner->dig[p][q]; p = q; tok++; if( q != DIAMOND ) { len++; } } t += learner->dig[RESERVED_TOKLEN][len] - learner->dig[RESERVED_TOKLEN][0]; return t; } /* calculates the rth-order divergence but needs normalizing constant note: this isn't the full divergence from digref, just the bits needed for the r-th optimization - fwd indicates the traversal direction in the hash (alternate between them to reduce numerical errors */ score_t learner_divergence(learner_t *learner, score_t logzonr, score_t Xi, token_order_t r, bool_t fwd) { register l_item_t *i, *e; register token_count_t c = 0; score_t t = 0.0; e = fwd ? (learner->hash + learner->max_tokens) : learner->hash - 1; for(i = fwd ? learner->hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { t += UNPACK_LAMBDA(i->lam) * (score_t)i->count; if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } return -logzonr + t/Xi; } /* calculates the normalizing constant - fwd indicates the traversal direction in the hash (alternate between them to reduce numerical errors */ score_t learner_logZ(learner_t *learner, token_order_t r, score_t log_unchanging_part, bool_t fwd) { register l_item_t *i, *e; register token_count_t c = 0; score_t maxlogz, tmp; score_t t =0.0; score_t R = (score_t)r; /* printf("learner_logZ(%d, %f)\n", r, log_unchanging_part); */ e = fwd ? (learner->hash + learner->max_tokens) : learner->hash - 1; maxlogz = log_unchanging_part; for(i = fwd ? learner->hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { tmp = R * UNPACK_LAMBDA(i->lam) + R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref); if( maxlogz < tmp ) { maxlogz = tmp; } if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } t = exp(log_unchanging_part - maxlogz); for(i = fwd ? learner->hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { tmp = R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref) - maxlogz; t += (exp(R * UNPACK_LAMBDA(i->lam) + tmp) - exp(tmp)); if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } tmp = (maxlogz + log(t))/R; /* printf("t =%f maxlogz = %f logZ/R = %f\n", t, maxlogz, tmp); */ /* investigate this someday */ if( isnan(tmp) ) { errormsg(E_FATAL,"sorry, partition function went kaboom.\n"); } return tmp; } /* reconstructs the order of a token (can be zero for empty token) */ token_order_t get_token_order(char *tok) { token_order_t o = 0; if( tok && *tok ) { while( *(++tok) ) { if( *tok == DIAMOND ) { o++; } } } return o; } /* fills the hash with partial calculations */ void fill_ref_vars(learner_t *learner, l_item_t *k, char *tok) { hash_value_t id; char *t, *e; l_item_t *l; /* weight of the r-th order excursion */ k->tmp.min.dref = PACK_RWEIGHTS(calc_learner_digramic_excursion(learner,tok)); /* for each suffix of tok, add its weight */ k->tmp.min.ltrms = PACK_LWEIGHTS(0.0); if( tok && *tok ) { e = strchr(tok + 1, EOTOKEN); for( t = tok + 1; t + 1 < e; t++ ) { if( *t == DIAMOND ) { id = hash_partial_token(t, e - t, e); l = find_in_learner(learner, id); if( l ) { k->tmp.min.ltrms += PACK_LWEIGHTS(UNPACK_LAMBDA(l->lam)); } } } /* extra smoothing doesn't seem that good */ #undef EXTRA_SMOOTHING #if defined EXTRA_SMOOTHING /* rather than adding only suffixes, this adds all * the prefixes also, then divides by two. */ if( e ) { /* for each prefix of tok, add its weight */ for(t = e - 2; t > tok; t--) { if( *t == DIAMOND ) { id = hash_partial_token(tok, t - tok + 1, e); l = find_in_learner(id); if( l ) { k->ltrms += PACK_LWEIGHTS(UNPACK_LAMBDA(l->lam)); } } } /* now we have twice as many weights as we need */ k->ltrms /= 2; } #endif } } /* fills hash with partial calculations and returns the * log unchanging part of the normalizing constant, for all * orders < r (not r). On return, kappa contains the reference probability * mass of the set of all features <= r (including r). */ score_t recalculate_reference_measure(learner_t *learner, token_order_t r, score_t *kappa) { hash_value_t id; byte_t buf[BUFSIZ+1]; char tok[(MAX_TOKEN_LEN+1)*MAX_SUBMATCH+EXTRA_TOKEN_LEN]; size_t n = 0; const byte_t *p; char *q; l_item_t *k, *i; score_t tmp, lunch; score_t R = (score_t)r; score_t max = 0.0; score_t mykappa = 0.0; /* for r == 1, the partial_z is not modified, but we still have to go through the tokens and prebuild k-dref */ /* now we calculate the logarithmic word weight from the digram model, for each token in the hash */ if( !tmp_seek_start(learner) ) { errormsg(E_ERROR, "cannot seek in temporary token file, reference weights not calculated.\n"); } else { q = tok; while( (n = tmp_read_block(learner, buf, BUFSIZ, &p)) > 0 ) { /* p = buf; */ /* p[n] = '\0'; */ while( n-- > 0 ) { if( *p != TOKENSEP) { *q++ = *p; /* copy into tok */ } else { /* interword space */ *q = 0; /* append NUL to tok */ /* now write weight in hash */ id = hash_full_token(tok); k = find_in_learner(learner, id); if( k && (get_token_order(tok) == k->typ.order) ) { if( k->typ.order <= r) { if( k->typ.order == r ) { fill_ref_vars(learner, k, tok); } else if(k->typ.order < r) { /* assume ref_vars were already filled */ if( NOTNULL(k->lam) ) { tmp = R * UNPACK_LAMBDA(k->lam) + R * UNPACK_LWEIGHTS(k->tmp.min.ltrms) + UNPACK_RWEIGHTS(k->tmp.min.dref); if( max < tmp ) { max = tmp; } } } mykappa += exp(UNPACK_RWEIGHTS(k->tmp.min.dref)); } } q = tok; /* reset q */ } p++; } } } lunch = 1.0; k = learner->hash + learner->max_tokens; for(i = learner->hash; i != k; i++) { if( FILLEDP(i) ) { if( i->typ.order < r ) { if( NOTNULL(i->lam) ) { tmp = -max + R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref); lunch += (exp(R * UNPACK_LAMBDA(i->lam) + tmp) - exp(tmp)); } } } } lunch = max + log(lunch); /* kappa is the reference mass of all features <= rth order. */ *kappa = mykappa; return lunch; } /* just for debugging */ void print_score(learner_t *learner, token_order_t r) { hash_count_t i; double logprob = 0.0; double lpapprox = 0.0; for(i = 0; i < learner->max_tokens; i++) { if( FILLEDP(&learner->hash[i]) && (learner->hash[i].typ.order <= r) ) { logprob += learner->hash[i].count * (learner->hash[i].lam); if( learner->hash[i].typ.order == 1 ) { logprob += learner->hash[i].count * UNPACK_RWEIGHTS(learner->hash[i].tmp.min.dref)/((weight_t)r); } } if( FILLEDP(&learner->hash[i]) && (learner->hash[i].typ.order == r) ) { lpapprox += learner->hash[i].count * ((learner->hash[i].lam) + UNPACK_LWEIGHTS(learner->hash[i].tmp.min.ltrms) + UNPACK_RWEIGHTS(learner->hash[i].tmp.min.dref)/((weight_t)r)); } } fprintf(stdout, "*** logprob = %" FMT_printf_score_t " * %d (r = %" FMT_printf_integer_t ", logZ = %" FMT_printf_score_t ")\n", ((score_t)(logprob / learner->fixed_order_token_count[r])), learner->fixed_order_token_count[r], r, learner->logZ); fprintf(stdout, "*** lpapprox = %" FMT_printf_score_t " * %ld (r = %d, logZ = %" FMT_printf_score_t ")\n", ((score_t)(lpapprox / learner->fixed_order_token_count[r])), learner->fixed_order_token_count[r], r, learner->logZ); } /* experimental: this sounded like a good idea, but isn't ?? */ void theta_rescale(learner_t *learner, token_order_t r, score_t logupz, score_t Xi, bool_t fwd) { register l_item_t *i, *e; register token_count_t c = 0; score_t tmp; score_t theta =0.0; score_t R = (score_t)r; score_t mu; score_t sum1, sum2; score_t msum1, msum2; score_t s = 0; e = fwd ? (learner->hash + learner->max_tokens) : learner->hash - 1; msum1 = msum2 = log(0.0); for(i = fwd ? learner->hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { if( NOTNULL(i->lam) ) { s += i->count; tmp = R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref); if( tmp > msum1 ) { msum1 = tmp; } tmp += R * UNPACK_LAMBDA(i->lam); if( tmp > msum2 ) { msum2 = tmp; } } if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } mu = ((score_t)s)/Xi; s = log(mu) - log(1 - mu) + logupz; if( s > msum1 ) { msum1 = s; } sum1 = exp(s - msum1); sum2 = 0.0; for(i = fwd ? learner->hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { if( NOTNULL(i->lam) ) { tmp = R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref); sum1 += exp(tmp - msum1); tmp += R * UNPACK_LAMBDA(i->lam); sum2 += exp(tmp - msum2); } if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } theta = ((msum1 + log(sum1)) - (msum2 + log(sum2)))/R; if( isnan(theta) ) { return; /* ignore */ } if( u_options & (1<hash : learner->hash + learner->max_tokens - 1; i != e; fwd ? i++ : i--) { if( FILLEDP(i) && (i->typ.order == r) ) { if( NOTNULL(i->lam) ) { i->lam = PACK_LAMBDA(UNPACK_LAMBDA(i->lam) + theta); } if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } } /* the mediaprobs are the token probabilities for each token class. (summing the mediaprobs) == 1. We put a uniform prior on the media. */ void compute_mediaprobs(learner_t *learner) { l_item_t *k, *i; token_class_t j; weight_t R, tmp; R = (weight_t)learner->max_order; for(j = 0; j < TOKEN_CLASS_MAX; j++) { learner->mediaprobs[j] = 1.0/TOKEN_CLASS_MAX; } k = learner->hash + learner->max_tokens; for(i = learner->hash; i != k; i++) { if( FILLEDP(i) && NOTNULL(i->lam)) { tmp = R * UNPACK_LWEIGHTS(i->tmp.min.ltrms) + UNPACK_RWEIGHTS(i->tmp.min.dref); learner->mediaprobs[i->typ.cls] += exp(R * UNPACK_LAMBDA(i->lam) + tmp) - exp(tmp); } } tmp = 0; for(j = 0; j < TOKEN_CLASS_MAX; j++) { learner->mediaprobs[j] *= exp(-learner->logZ); tmp += learner->mediaprobs[j]; } /* should have tmp == 1.0 */ } /* minimizes the divergence by solving for lambda one component at a time. */ void minimize_learner_divergence(learner_t *learner) { l_item_t *i, *e; token_order_t r; token_count_t lzero, c = 0; token_count_t zcut = 0; int itcount, mcount; score_t d, dd, b; score_t lam_delta, old_lam, new_lam; score_t logzonr, old_logzonr; score_t logupz, div_extra_bits, kappa; score_t R, Xi, logXi; score_t mp_logz; bool_t fwd = 1; if( u_options & (1<logZ = 0.0; learner->divergence = 0.0; mp_logz = 0.0; /* disable multipass if we only have one order to play with */ if( (m_options & (1<max_order == 1) ) { qtol_multipass = 0; } if( learner->model.tmin != 0 ) { /* ftreshold is unsigned */ if( learner->model.tmin > 0 ) { zcut = learner->model.tmin; } else if (learner->model.tmin + learner->tmax > 0) { zcut = learner->model.tmin + learner->tmax; } } e = learner->hash + learner->max_tokens; for(mcount = 0; mcount < (qtol_multipass ? 50 : 1); mcount++) { for(r = 1; r <= ((m_options & (1<max_order); r++) { /* here we precalculate various bits and pieces which aren't going to change during this iteration */ logupz = recalculate_reference_measure(learner, r, &kappa); R = (score_t)r; Xi = (score_t)learner->fixed_order_token_count[r]; logXi = log(Xi); if( r == 1 ) { /* Xi /= kappa; */ div_extra_bits = 0.0; } else { /* calculate extra bits for divergence score display */ b = 0.0; for(i = learner->hash; i != e; i++) { if( FILLEDP(i) && (i->typ.order < r) ) { b += UNPACK_LAMBDA(i->lam) * (score_t)i->count; } } div_extra_bits = b/Xi; } if( m_options & (1<fixed_order_token_count[r], learner->fixed_order_unique_token_count[r], kappa); } logzonr = learner_logZ(learner, r, logupz, fwd); dd = learner_divergence(learner, logzonr, Xi, r, fwd); fwd = 1 - fwd; /* printf("logzonr = %f dd = %f logupz = %f Xi = %f\n", logzonr, dd, logupz, Xi); */ itcount = 0; do { itcount++; lzero= 0; d = dd; /* save old divergence */ old_logzonr = logzonr; lam_delta = 0.0; c = 0; for(i = learner->hash; i != e; i++) { if( FILLEDP(i) && (i->typ.order == r) /* && (rand() > RAND_MAX/2) */ ) { old_lam = UNPACK_LAMBDA(i->lam); if( /* (i->typ.order == 1) || */ (i->count > zcut) ) { /* "iterative scaling" lower bound */ new_lam = (log((score_t)i->count) - logXi - UNPACK_RWEIGHTS(i->tmp.min.dref))/R + logzonr - UNPACK_LWEIGHTS(i->tmp.min.ltrms); } else { new_lam = 0.0; } if( isnan(new_lam) ) { /* precision problem, just ignore, don't change lambda */ logzonr = learner_logZ(learner, r, logupz, fwd); } else { /* this code shouldn't be necessary, but is crucial */ if( new_lam > (old_lam + MAX_LAMBDA_JUMP) ) { new_lam = (old_lam + MAX_LAMBDA_JUMP); } else if( new_lam < (old_lam - MAX_LAMBDA_JUMP) ) { new_lam = (old_lam - MAX_LAMBDA_JUMP); } /* don't want negative weights */ if( new_lam < 0.0 ) { new_lam = 0.0; lzero++; } if( lam_delta < fabs(new_lam - old_lam) ) { lam_delta = fabs(new_lam - old_lam); } i->lam = PACK_LAMBDA(new_lam); } if( ++c >= learner->fixed_order_unique_token_count[r] ) { c = 0; break; } } } /* theta_rescale(r, logupz, Xi, fwd); */ /* update values */ logzonr = learner_logZ(learner, r, logupz, fwd); dd = learner_divergence(learner, logzonr, Xi, r, fwd); fwd = 1 - fwd; if( u_options & (1< %" FMT_printf_score_t " (%10f, %10f)\n", d + div_extra_bits, dd + div_extra_bits, lam_delta, fabs(logzonr - old_logzonr)); } process_pending_signal(NULL); } while( ((fabs(d - dd) > qtol_div) || (lam_delta > qtol_lam) || (fabs(logzonr - old_logzonr) > qtol_logz)) && (itcount < 50) ); learner->logZ = logzonr; learner->divergence = dd + div_extra_bits; } /* for multipass, we wait until logZ stabilizes */ if( fabs(1.0 - mp_logz/learner->logZ) < 0.01 ) { break; } mp_logz = learner->logZ; } /* compute the probability mass of each token class (medium) separately */ compute_mediaprobs(learner); } /* dumps readable model weights to the output */ void dump_model(learner_t *learner, FILE *out, FILE *in) { hash_value_t id; byte_t buf[BUFSIZ+1]; char tok[(MAX_TOKEN_LEN+1)*MAX_SUBMATCH+EXTRA_TOKEN_LEN]; char smb[MAX_SUBMATCH+1]; token_order_t s; regex_count_t c; const byte_t *p; char *q; l_item_t *k; size_t n = 0; /* preamble - this is copied from save_learner */ fprintf(out, MAGIC1, learner->filename, (m_options & (1<divergence, learner->logZ, learner->max_order, (m_options & (1<max_hash_bits, (long int)learner->full_token_count, (long int)learner->unique_token_count, (long int)learner->doc.count); fprintf(out, MAGIC8_o, learner->shannon, learner->shannon2); fprintf(out, MAGIC10_o, learner->alpha, learner->beta, learner->mu, learner->s2); write_mediaprobs(out, learner); fprintf(out, MAGIC9, (long int)learner->model.tmin, (long int)learner->tmax); /* print out any regexes we might need */ for(c = 0; c < regex_count; c++) { /* write the bitmap */ for(q = smb, s = 1; s <= MAX_SUBMATCH; s++) { if( re[c].submatches & (1< 0 ) { /* p = buf; */ /* p[n] = '\0'; */ while( n-- > 0 ) { if( *p != TOKENSEP) { *q++ = *p; /* copy into tok */ } else { /* interword space */ *q = 0; /* append NUL to tok */ /* now write weight in hash */ id = hash_full_token(tok); k = find_in_learner(learner, id); /* guaranteed to be found */ fprintf(out, MAGIC_DUMPTBL_o, (weight_t)UNPACK_LAMBDA(k->lam), UNPACK_RWEIGHTS(k->tmp.min.dref), k->count, (long unsigned int)k->id); print_token(out, tok); fprintf(out, "\n"); q = tok; /* reset q */ } p++; } } } } /* This is a quick hack to 1) speed up the optimization and 2) stabilise the estimated category model over a sequence of learning runs. Normally, if the dataset is nearly the same, then the optimal lambda weights should be fairly similar (This is not strictly true if the digramic measure varies too much). By reading the old category and presetting the lambdas from it, we typically get close enough to the true weights that one or two optimization iterations suffice. Moreover in that case, most weights should stay close to their "previous" values in the category, so the user doesn't think it's weird. A side effect is that there is entropy creep when relearing the same dataset over and over. Unless there's a bug I haven't noticed, this occurs because the entropy maximum we compute is affected by numerical precision and feature ordering within the hash. Each time we relearn the same dataset, we start off with a perturbation from the previous best weights, and obtain a small improvement. WARNING: THIS USES cat[0], SO IS NOT COMPATIBLE WITH CLASSIFYING. */ void learner_prefill_lambdas(learner_t *learner, category_t **pxcat) { hash_count_t c; c_item_t *i, *e; l_item_t *k; category_t *xcat = &(cat[0]); *pxcat = NULL; xcat->fullfilename = strdup(learner->filename); if( open_category(cat) ) { if( xcat->model.options & (1<fullfilename); } } else if( (xcat->model.options == m_options) && (xcat->retype == learner->retype) && (fabs((xcat->model_unique_token_count/ (double)learner->unique_token_count) - 1.0) < 0.15) ) { c = xcat->model_unique_token_count; if( u_options & (1<hash, sizeof(c_item_t) * xcat->max_tokens, MADV_SEQUENTIAL); e = xcat->hash + xcat->max_tokens; for(i = xcat->hash; i != e; i++) { if( FILLEDP(i) ) { k = find_in_learner(learner, NTOH_ID(i->id)); if( k ) { k->lam = NTOH_LAMBDA(i->lam); } if( --c <= 0 ) { break; } } } /* tweak default quality settings */ if( !quality ) { qtol_div = 0.01; qtol_lam = CLIP_LAMBDA_TOL(0.01); qtol_logz = 0.05; } } /* we're done, but don't close the category yet, as we might want to overwrite it */ *pxcat = xcat; } else { if( u_options & (1<fullfilename); } free(xcat->fullfilename); } } void optimize_and_save(learner_t *learner) { hash_count_t i; token_order_t c; category_t *opencat = NULL; if(100 * learner->unique_token_count >= HASH_FULL * learner->max_tokens) { errormsg(E_WARNING, "table full, some tokens ignored - " "try with option -h %i\n", learner->max_hash_bits + 1); } else if( learner->unique_token_count <= 0 ) { errormsg(E_WARNING, "no tokens matched - have I learned nothing?\n"); tmp_close(learner); exit(0); /* exit code for success */ } if( skewed_constraints_warning ) { errormsg(E_WARNING, "ran out of integers (too much data) constraints will be skewed.\n"); m_options |= (1<full_token_count, learner->unique_token_count); fprintf(stdout, "calculating reference word weights\n"); } if( *online ) { write_online_learner_struct(learner, online); } /* transposition smoothing */ /* transpose_digrams(); */ if( *digtype && !strcmp(digtype, "uniform") ) { make_uniform_digrams(learner); } else if( *digtype && !strcmp(digtype, "dirichlet") ) { make_dirichlet_digrams(learner); } else if( *digtype && !strcmp(digtype, "maxent") ) { make_entropic_digrams(learner); } else if( *digtype && !strcmp(digtype, "toklen") ) { make_toklen_digrams(learner); } else if( *digtype && !strcmp(digtype, "mle") ) { make_mle_digrams(learner); } else if( *digtype && !strcmp(digtype, "iid") ) { make_iid_digrams(learner); } else { make_uniform_digrams(learner); } if( learner->fixed_order_token_count[1] == 0 ) { /* it's a higher order model but there are no first order tokens! We can't handle that! Go through the hash converting everything to first order. This will result in incorrect calculations, unless the higher order tokens don't overlap. Suitable only for geniuses and fools. */ errormsg(E_WARNING, "\n" " You have not defined any unigrams, so in this model\n" " features will be treated independently, which is quite\n" " likely incorrect. I hope you know what you're doing,\n" " because I don't!\n\n"); m_options |= (1<max_order; c++) { learner->fixed_order_token_count[1] += learner->fixed_order_token_count[c]; learner->fixed_order_unique_token_count[1] += learner->fixed_order_unique_token_count[c]; } for(i = 0; i < learner->max_tokens; i++) { if( FILLEDP(&learner->hash[i]) ) { learner->hash[i].typ.order = 1; } } } /* if the category already exists, we read its lambda values. this should speed up the minimization slightly */ if( u_options & (1<tmp.file); } tmp_close(learner); /* we don't free learner->tmpiobuf, as we'll be exiting soon anyway */ #if defined HAVE_POSIX_MEMALIGN /* if( learner->tmpiobuf ) { free(learner->tmpiobuf); } */ #endif /* now save the model to a file */ if( !opencat || !fast_partial_save_learner(learner, opencat) ) { save_learner(learner, online); } if( opencat ) { free_category(opencat); } } /*********************************************************** * MULTIBYTE FILE HANDLING FUNCTIONS * * this is suitable for any locale whose character set * * encoding doesn't include NUL bytes inside characters * ***********************************************************/ /* this code executed before processing each line of input. - handles indents and appends via -Aa switches */ char *handle_indents_and_appends(char *textbuf) { char *pptextbuf = textbuf; /* default */ if( u_options & (1<state, buf); return retval; } #if defined HAVE_MBRTOWC int w_email_line_filter(MBOX_State *mbox, wchar_t *buf) { return w_mbox_line_filter(mbox, buf, &xml); } #endif int set_option(int op, char *optarg) { int c = 0; switch(op) { case '@': /* this is an official NOOP, it MUST be ignored (see spherecl) */ break; case '0': u_options &= ~(1<= MAX_CAT ) { errormsg(E_WARNING, "maximum reached, random text category omitted\n"); } else if( u_options & (1< MAX_HASH_BITS ) { errormsg(E_WARNING, "maximum hash size will be 2^%d\n", MAX_HASH_BITS); default_max_hash_bits = MAX_HASH_BITS; } default_max_tokens = (1< MAX_HASH_BITS ) { errormsg(E_WARNING, "maximum hash size will be 2^%d\n", MAX_HASH_BITS); default_max_grow_hash_bits = MAX_HASH_BITS; } default_max_grow_tokens = (1<= MAX_CAT ) { errormsg(E_WARNING, "maximum reached, category ignored\n"); } else if( u_options & (1< 7) ) { errormsg(E_FATAL, "the -w switch needs a number between 1 and 7\n"); } c++; break; case 'S': m_options |= (1< MAX_HASH_BITS) ) { errormsg(E_WARNING, "option -x ignored, needs an integer between 1 and %d\n", MAX_HASH_BITS); } else { u_options |= (1<= MAX_CAT ) { errormsg(E_WARNING, "maximum reached, filter ignored\n"); } else if( u_options & (1<>U_OPTION_CLASSIFY) & 1) + ((u_options>>U_OPTION_LEARN) & 1) != 1 ) { errormsg(E_ERROR, "please use either -c or -l option.\n"); exit(1); } if( (*online || (ronline_count > 0)) && (u_options & (1<>M_OPTION_TEXT_FORMAT) & 1) + ((m_options>>M_OPTION_MBOX_FORMAT) & 1) > 1 ) { errormsg(E_ERROR, "please use only one of either -T text or -T email options.\n"); exit(1); } if( ((m_options>>M_OPTION_XML) & 1) + ((m_options>>M_OPTION_HTML) & 1) > 1 ) { errormsg(E_ERROR, "please use only one of either -T xml or -T html options.\n"); exit(1); } if( m_options & (1< 1 ) { for(c = 1; c < cat_count; c++) { if( cat[c].model.type == sequential ) { break; } if( cat[c].retype != cat[c-1].retype ) { break; } } if( c == cat_count ) { m_options |= (1< -1 ) { set_option(op, optarg); } /* end option processing */ sanitize_options(); /* set up callbacks */ if( u_options & (1< -1) && *(argv + optind) && !(cmd & (1< */ #ifndef DBACL_H #define DBACL_H #ifdef HAVE_CONFIG_H #undef HAVE_CONFIG_H #include "config.h" #endif #ifndef VERSION #ifdef PACKAGE_VERSION #define VERSION PACKAGE_VERSION #endif #endif #define COPYBLURB "Copyright (c) 2002-2013 L.A. Breyer. All rights reserved.\n" \ "%s comes with ABSOLUTELY NO WARRANTY, and is licensed\n" \ "to you under the terms of the GNU General Public License 3 or later.\n\n" #define DEFAULT_CATPATH "DBACL_PATH" /* define this to save category files with a temporary name, then atomically * rename them. This makes corrupt category files nearly impossible, and * obviates the need for file locking in case another instance of dbacl is * trying to read the category while it is being written. */ #define ATOMIC_CATSAVE /* we give our files the 640 permissions - I've added "write" permission because sometimes we want to mmap/readwrite such files so we need those permissions. Also, O_BINARY is not portable, but a good idea for some platforms */ #ifndef O_BINARY #define O_BINARY 0 #endif #define ATOMIC_CREATE(x) open(x, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0640) /* we define several memory models, which differ basically in the number of bytes used for the hash tables. Adjust to taste */ /* use this for 64-bit hashes */ #undef HUGE_MEMORY_MODEL /* use this for 32-bit hashes */ #define NORMAL_MEMORY_MODEL /* use this for 16-bit hashes */ #undef SMALL_MEMORY_MODEL /* use this for 8-bit hashes */ #undef TINY_MEMORY_MODEL /* the following defines set up a tradeoff between modelling accuracy and memory requirements - season to taste (if you often get digitization errors, undef the appropriate macro) */ /* digram digitization: avg loss of precision = 0.01 * token size */ #define DIGITIZE_DIGRAMS /* lambda digitization: avg loss of precision = 0.01 */ #define DIGITIZE_LAMBDA /* learner.hash digitization: avg loss of precision = 0.01 */ #define DIGITIZE_LWEIGHTS #if defined HAVE_MBRTOWC #include #include #endif #include #include #if !defined LOADED_REGEX #include #include #endif #if defined HAVE_NETINET_IN_H #include #endif #ifndef htonl #define htonl(x) (x) #define ntohl(x) (x) #define htons(x) (x) #define ntohs(x) (x) #endif #if defined OS_SUN #include #endif /* some systems seem to have broken sys/types */ #if defined OS_SUN || defined OS_HPUX #include typedef uint8_t u_int8_t; typedef uint16_t u_int16_t; typedef uint32_t u_int32_t; typedef uint64_t u_int64_t; #endif #ifdef HAVE_MMAP #ifdef HAVE_MADVISE #ifdef HAVE_SYS_MMAN_H #include #include #ifdef OS_SUN #define MADVISE(x,y,z) madvise((caddr_t)(x),y,z) #define MLOCK(x,y) mlock((caddr_t)(x),y) #define MUNLOCK(x,y) munlock((caddr_t)(x),y) #define MUNMAP(x,y) munmap((void *)(x),y) #define MMAP(x,y,z,t,u,v) mmap((void *)(x),y,z,t,u,v) #else #define MADVISE(x,y,z) madvise(x,y,z) #define MLOCK(x,y) mlock(x,y) #define MUNLOCK(x,y) munlock(x,y) #define MUNMAP(x,y) munmap((void *)(x), y) #define MMAP(x,y,z,t,u,v) mmap((void *)(x),y,z,t,u,v) #endif #endif #endif #endif #ifndef MADVISE #define MAP_FAILED ((void *)-1) #define MADVISE(x,y,z) #define MLOCK(x,y) #define MUNLOCK(x,y) #define MUNMAP(x,y) #define MMAP(x,y,z,t,u,v) NULL #endif /* constants used by mmap */ #ifndef PROT_READ #define PROT_READ 0 #define PROT_WRITE 0 #define PROT_EXEC 0 #define PROT_NONE 0 #endif #define PAGEALIGN(x) ((x) / system_pagesize) * system_pagesize /* below, FMT_* macros are used in printf/scanf format strings */ #if defined HUGE_MEMORY_MODEL typedef u_int64_t token_count_t; typedef unsigned int token_order_t; /* used in bit-field, therefore uint */ typedef unsigned int token_class_t; /* used in bit-field, therefore uint */ typedef u_int8_t hash_bit_count_t; typedef u_int64_t hash_count_t; typedef unsigned int hash_percentage_t; typedef u_int16_t category_count_t; typedef u_int16_t regex_count_t; typedef u_int64_t document_count_t; typedef u_int16_t confidence_t; typedef float weight_t; typedef double score_t; #define FMT_printf_score_t "f" #define FMT_scanf_score_t "lf" #define FMT_printf_integer_t "ld" typedef u_int16_t token_stack_t; typedef int charbuf_len_t; typedef u_int16_t alphabet_size_t; typedef u_int16_t smbitmap_t; typedef u_int8_t regex_flags_t; typedef int error_code_t; typedef int bool_t; typedef u_int8_t byte_t; #if defined DIGITIZE_DIGRAMS && defined DIGITIZE_LAMBDA /* cats not portable because hash value is too big */ #undef PORTABLE_CATS #endif /* keep typedefs and macros togegher */ typedef u_int64_t hash_value_t; #define hton_hash_value_t(x) (x) #define ntoh_hash_value_t(x) (x) typedef u_int16_t digitized_weight_t; #define hton_digitized_weight_t(x) (x) #define ntoh_digitized_weight_t(x) (x) /* where token counts wrap around */ #define K_TOKEN_COUNT_MAX ((token_count_t)18446744073709551615U) /* where digrams wrap around */ #define K_DIGRAM_COUNT_MAX ((weight_t)1.0e+9) /* size of hash in bits */ #define MAX_HASH_BITS ((hash_bit_count_t)64) /* for line filtering: maximum number of tokens allowed on a single line */ #define MAX_TOKEN_LINE_STACK ((token_stack_t)16384) /* number of pages we want to use for I/O buffering */ #define BUFFER_MAG 64 /* we need 8 byte hash values */ #define JENKINS8 #undef JENKINS4 #elif defined NORMAL_MEMORY_MODEL typedef u_int32_t token_count_t; typedef unsigned int token_order_t;/* used in bit-field, therefore uint */ typedef unsigned int token_class_t;/* used in bit-field, therefore uint */ typedef u_int8_t hash_bit_count_t; typedef u_int32_t hash_count_t; typedef unsigned int hash_percentage_t; typedef u_int8_t category_count_t; typedef u_int8_t regex_count_t; typedef u_int32_t document_count_t; typedef u_int16_t confidence_t; typedef float weight_t; typedef double score_t; #define FMT_printf_score_t "f" #define FMT_scanf_score_t "lf" #define FMT_printf_integer_t "d" typedef u_int8_t token_stack_t; typedef int charbuf_len_t; typedef u_int16_t alphabet_size_t; typedef u_int16_t smbitmap_t; typedef u_int8_t regex_flags_t; typedef int error_code_t; typedef int bool_t; typedef u_int8_t byte_t; #if defined DIGITIZE_DIGRAMS && defined DIGITIZE_LAMBDA && defined HAVE_NETINET_IN_H #define PORTABLE_CATS #endif /* keep typedefs and macros togegher */ typedef u_int32_t hash_value_t; #define hton_hash_value_t(x) htonl(x) #define ntoh_hash_value_t(x) ntohl(x) typedef u_int16_t digitized_weight_t; #define hton_digitized_weight_t(x) htons(x) #define ntoh_digitized_weight_t(x) ntohs(x) /* where token counts wrap around */ #define K_TOKEN_COUNT_MAX ((token_count_t)4294967295U) /* where digrams wrap around */ #define K_DIGRAM_COUNT_MAX ((weight_t)1.0e+9) /* size of hash in bits */ #define MAX_HASH_BITS ((hash_bit_count_t)30) /* for line filtering: maximum number of tokens allowed on a single line */ #define MAX_TOKEN_LINE_STACK ((token_stack_t)255) /* number of pages we want to use for I/O buffering */ #define BUFFER_MAG 32 /* we need 4 byte hash values */ #define JENKINS8 #undef JENKINS4 #elif defined SMALL_MEMORY_MODEL typedef u_int32_t token_count_t; typedef unsigned int token_order_t;/* used in bit-field, therefore uint */ typedef unsigned int token_class_t;/* used in bit-field, therefore uint */ typedef u_int8_t hash_bit_count_t; typedef u_int16_t hash_count_t; typedef unsigned int hash_percentage_t; typedef u_int8_t category_count_t; typedef u_int8_t regex_count_t; typedef u_int16_t document_count_t; typedef u_int16_t confidence_t; typedef float weight_t; typedef double score_t; #define FMT_printf_score_t "f" #define FMT_scanf_score_t "lf" #define FMT_printf_integer_t "d" typedef u_int8_t token_stack_t; typedef int charbuf_len_t; typedef u_int16_t alphabet_size_t; typedef u_int16_t smbitmap_t; typedef u_int8_t regex_flags_t; typedef int error_code_t; typedef int bool_t; typedef u_int8_t byte_t; #if defined DIGITIZE_DIGRAMS && defined DIGITIZE_LAMBDA && defined HAVE_NETINET_IN_H #define PORTABLE_CATS #endif /* keep typedefs and macros togegher */ typedef u_int16_t hash_value_t; #define hton_hash_value_t(x) htons(x) #define ntoh_hash_value_t(x) ntohs(x) typedef u_int16_t digitized_weight_t; #define hton_digitized_weight_t(x) htons(x) #define ntoh_digitized_weight_t(x) ntohs(x) /* where token counts wrap around */ #define K_TOKEN_COUNT_MAX ((token_count_t)4294967295U) /* where digrams wrap around */ #define K_DIGRAM_COUNT_MAX ((weight_t)1.0e+9) /* size of hash in bits */ #define MAX_HASH_BITS ((hash_bit_count_t)15) /* for line filtering: maximum number of tokens allowed on a single line */ #define MAX_TOKEN_LINE_STACK ((token_stack_t)128) /* number of pages we want to use for I/O buffering */ #define BUFFER_MAG 16 /* we need 4 byte hash values */ #undef JENKINS8 #define JENKINS4 #elif defined TINY_MEMORY_MODEL /* not tested, this model probably doesn't work ;-) */ #undef DIGITIZE_DIGRAMS typedef u_int32_t token_count_t; typedef unsigned int token_order_t;/* used in bit-field, therefore uint */ typedef unsigned int token_class_t;/* used in bit-field, therefore uint */ typedef u_int8_t hash_bit_count_t; typedef u_int8_t hash_count_t; typedef unsigned int hash_percentage_t; typedef u_int8_t category_count_t; typedef u_int8_t regex_count_t; typedef u_int8_t document_count_t; typedef u_int16_t confidence_t; typedef float weight_t; typedef double score_t; #define FMT_printf_score_t "f" #define FMT_scanf_score_t "lf" #define FMT_printf_integer_t "d" typedef u_int8_t token_stack_t; typedef int charbuf_len_t; typedef u_int16_t alphabet_size_t; typedef u_int16_t smbitmap_t; typedef u_int8_t regex_flags_t; typedef int error_code_t; typedef int bool_t; typedef u_int8_t byte_t; #if defined DIGITIZE_DIGRAMS && defined DIGITIZE_LAMBDA #undef PORTABLE_CATS #endif /* keep typedefs and macros togegher */ typedef u_int8_t hash_value_t; #define hton_hash_value_t(x) (x) #define ntoh_hash_value_t(x) (x) typedef u_int16_t digitized_weight_t; #define hton_digitized_weight_t(x) htons(x) #define ntoh_digitized_weight_t(x) ntohs(x) #define K_TOKEN_COUNT_MAX ((token_count_t)4294967295U) /* where digrams wrap around */ #define K_DIGRAM_COUNT_MAX ((weight_t)1.0e+9) /* size of hash in bits */ #define MAX_HASH_BITS ((hash_bit_count_t)8) /* for line filtering: maximum number of tokens allowed on a single line */ #define MAX_TOKEN_LINE_STACK ((token_stack_t)128) /* number of pages we want to use for I/O buffering */ #define BUFFER_MAG 2 /* we need 4 byte hash values */ #undef JENKINS8 #define JENKINS4 #endif /* this is common to all memory models */ #if defined OS_DARWIN /* the system I tested this on didn't seem to like packed structures */ #define PACK_STRUCTS #else /* disable this if speed is paramount */ #if defined __GNUC__ #define PACK_STRUCTS __attribute__ ((packed)) #else #define PACK_STRUCTS #endif #endif /* when digitizing transitions, this stands for -infinity */ #define DIGITIZED_WEIGHT_MIN ((digitized_weight_t)0) #define DIGITIZED_WEIGHT_MAX ((digitized_weight_t)USHRT_MAX) #define DIG_FACTOR 5 /* maximum number of categories we can handle simultaneously */ #define MAX_CAT ((category_count_t)16383) /* percentage of hash we use */ #define HASH_FULL ((hash_percentage_t)95) /* alphabet size */ #define ASIZE ((alphabet_size_t)256) /* we need three special markers, which cannot be part * of the alphabet. Fortunately, we can use ASCII control * characters. Hopefully, these won't be used for anything important. * Make sure AMIN equals DIAMOND is the last reserved char. */ #define TOKENSEP '\001' #define CLASSEP '\002' #define DIAMOND '\003' #define AMIN DIAMOND #define EOTOKEN CLASSEP /* enough room to pad token with NULL, DIAMOND, CLASSEP and class */ #define EXTRA_CLASS_LEN 2 #define EXTRA_TOKEN_LEN (EXTRA_CLASS_LEN + 2) #define MULTIBYTE_EPSILON 10 /* enough for a multibyte char and a null char */ /* make sure a character is in the alphabet range */ #define CLIP_ALPHABET(x) x = (((unsigned char)x) < AMIN) ? AMIN : (x) /* the space outside of AMIN-ASIZE is used for auxiliary RESERVED_* data */ #define RESERVED_UNUSED0 0 /* dig[0][0-255] */ #define RESERVED_MARGINAL 2 /* dig[2][0-255] counts single char marginal freqs */ #define RESERVED_TOKLEN 1 /* dig[1][0-MAX_TOKEN_LEN] counts token lengths */ /* decides how we compute the shannon entropy */ #undef SHANNON_STIRLING /* maximum size of a token, beyond that rest is ignored (ie put into * another token) The value should not be too big, because it protects * against extreme probabilities failing to digitize properly. * * Here's the back-of-the-envelope calculation: In the model, for each * token, we save the reference weight, and the lambda weight. It * seems that the lambdas are of the same order as the corresponding * n-gram's reference weight, * * The reference weights are most extreme for the uniform, equal to * about -5 per token character. Thus, for an n-gram lambda weight, * the most extreme values are about (-5) * total number of * characters. Our calculations blow up for n >= 6 anyway, so the most * extreme value in the worst case (=7) should be about (-5) * * MAX_TOKEN_LEN * 7. * * The other constraint is that we must be able to digitize the * weights, and with DIG_FACTOR = 5, the extreme weight values can be * up to 2048. Giving us a margin of error, we assume that 35 * * MAX_TOKEN_LEN < 1024, which gives MAX_TOKEN_LEN = 30. */ #define MAX_TOKEN_LEN ((charbuf_len_t)30) #define TOKEN_LIST_GROW 1048576L /* user options */ #define U_OPTION_CLASSIFY 1 #define U_OPTION_LEARN 2 #define U_OPTION_FASTEMP 3 #define U_OPTION_CUTOFF 4 #define U_OPTION_VERBOSE 5 #define U_OPTION_STDIN 6 #define U_OPTION_SCORES 7 #define U_OPTION_POSTERIOR 8 #define U_OPTION_FILTER 9 #define U_OPTION_DEBUG 10 #define U_OPTION_DUMP 12 #define U_OPTION_APPEND 13 #define U_OPTION_DECIMATE 14 #define U_OPTION_GROWHASH 15 #define U_OPTION_INDENTED 16 #define U_OPTION_NOZEROLEARN 17 #define U_OPTION_MMAP 21 #define U_OPTION_CONFIDENCE 22 #define U_OPTION_VAR 23 #define U_OPTION_HM_ADDRESSES 24 #define U_OPTION_CLASSIFY_MULTIFILE 25 #define U_OPTION_PRIOR_CORRECTION 26 #define U_OPTION_MEDIACOUNTS 27 /* model options */ #define M_OPTION_REFMODEL 1 #define M_OPTION_TEXT_FORMAT 2 #define M_OPTION_MBOX_FORMAT 3 #define M_OPTION_XML 4 #define M_OPTION_I18N 5 #define M_OPTION_CASEN 6 #define M_OPTION_CALCENTROPY 7 #define M_OPTION_MULTINOMIAL 8 #define M_OPTION_HEADERS 13 #define M_OPTION_PLAIN 14 #define M_OPTION_NOPLAIN 15 #define M_OPTION_SHOW_LINKS 16 #define M_OPTION_SHOW_ALT 17 #define M_OPTION_HTML 18 #define M_OPTION_XHEADERS 19 #define M_OPTION_SHOW_SCRIPT 21 #define M_OPTION_SHOW_HTML_COMMENTS 22 #define M_OPTION_USE_STDTOK 23 #define M_OPTION_ATTACHMENTS 24 #define M_OPTION_WARNING_BAD 25 #define M_OPTION_SHOW_STYLE 26 #define M_OPTION_SHOW_FORMS 28 #define M_OPTION_NOHEADERS 29 #define M_OPTION_NGRAM_STRADDLE_NL 30 #define M_OPTION_THEADERS 31 /* category options */ #define C_OPTION_MMAPPED_HASH 1 typedef u_int32_t options_t; /* make sure big enough for all options */ typedef enum { DT_DEFAULT=0, DT_UNIFORM, DT_DIRICHLET, DT_MAXENT, DT_MLE, DT_IID } digtype_t; typedef enum { CP_DEFAULT=0, CP_CHAR, CP_ALPHA, CP_ALNUM, CP_GRAPH, CP_CEF, CP_ADP, CP_CEF2 } charparser_t; #define FMT_printf_options_t "d" #define FMT_scanf_options_t "ld" typedef long int re_bitfield; #define MAX_RE ((regex_count_t)(8 * sizeof(re_bitfield))) #define INVALID_RE 0 /* maximum number of tagged subexpressions we can handle for each regex */ #define MAX_SUBMATCH ((token_order_t)9) typedef enum {gcUNDEF = 0, gcDISCARD, gcTOKEN, gcTOKEN_END, gcIGNORE} good_char_t; /* macros */ /* used for digitizing */ #if defined DIGITIZE_LWEIGHTS /* use this when digitizing positive weights */ #define PACK_LWEIGHTS(a) ((digitized_weight_t)digitize_a_weight(a,1)) #define UNPACK_LWEIGHTS(a) ((weight_t)undigitize_a_weight(a,1)) /* use this when digitizing negative weights */ #define PACK_RWEIGHTS(a) ((digitized_weight_t)digitize_a_weight(-(a),1)) #define UNPACK_RWEIGHTS(a) (-(weight_t)undigitize_a_weight(a,1)) #define DW "w" #else #define PACK_LWEIGHTS(a) ((weight_t)(a)) #define UNPACK_LWEIGHTS(a) ((weight_t)(a)) #define PACK_RWEIGHTS(a) ((weight_t)(a)) #define UNPACK_RWEIGHTS(a) ((weight_t)(a)) #define DW ":" #endif #if defined DIGITIZE_LAMBDA #define PACK_LAMBDA(a) ((digitized_weight_t)digitize_a_weight(a,1)) #define UNPACK_LAMBDA(a) ((weight_t)undigitize_a_weight(a,1)) #define DL "l" #else #define PACK_LAMBDA(a) ((weight_t)(a)) #define UNPACK_LAMBDA(a) ((weight_t)(a)) #define DL ":" #endif #if defined DIGITIZE_DIGRAMS #define PACK_DIGRAMS(a) ((digitized_weight_t)digitize_a_weight(-(a),1)) #define UNPACK_DIGRAMS(a) (-(weight_t)undigitize_a_weight(a,1)) #define SIZEOF_DIGRAMS (sizeof(digitized_weight_t)) #define DD "d" #else #define PACK_DIGRAMS(a) ((weight_t)(a)) #define UNPACK_DIGRAMS(a) ((weight_t)(a)) #define SIZEOF_DIGRAMS (sizeof(weight_t)) #define DD ":" #endif #define CLIP_LAMBDA_TOL(x) (x < 1.0/(1<id) #define EQUALP(a,b) ((a)==(b)) #define SET(a,b) (a = (b)) #define SETMARK(a) ((a)->typ.mark = (unsigned int)1) #define UNSETMARK(a) ((a)->typ.mark = (unsigned int)0) #define MARKEDP(a) ((a)->typ.mark == (unsigned int)1) #define NOTNULL(x) ((x) > 0) #define MAXIMUM(x,y) (((x)<(y))?(y):(x)) #define INCREMENT(x,y,z) if( (x) < (y) ) { (x)++; } else { z = 1; } #define INCREASE(x,d,y,z) if( (x) < ((y)-(d)) ) { (x) += (d); } else { z = 1; } #if defined PORTABLE_CATS #define SIGNATURE VERSION " " DD DL DW " " "portable" #define NTOH_ID(x) ntoh_hash_value_t(x) #define HTON_ID(x) hton_hash_value_t(x) #define NTOH_DIGRAM(x) ntoh_digitized_weight_t(x) #define HTON_DIGRAM(x) hton_digitized_weight_t(x) #define NTOH_LAMBDA(x) ntoh_digitized_weight_t(x) #define HTON_LAMBDA(x) hton_digitized_weight_t(x) #else #define SIGNATURE VERSION " " DD DL DW " " TARGETCPU #define NTOH_ID(x) (x) #define HTON_ID(x) (x) #define NTOH_DIGRAM(x) (x) #define HTON_DIGRAM(x) (x) #define NTOH_LAMBDA(x) (x) #define HTON_LAMBDA(x) (x) #endif /* used by both category load and learner save functions */ #define MAGIC_BUFSIZE 512 #define MAGIC1 "# dbacl " SIGNATURE " category %s %s\n" #define MAGIC1_LEN (17 + strlen(SIGNATURE)) #define MAGIC2_i "# entropy %" FMT_scanf_score_t \ " logZ %" FMT_scanf_score_t " max_order %hd" \ " type %s\n" #define MAGIC2_o "# entropy %" FMT_printf_score_t \ " logZ %" FMT_printf_score_t " max_order %hd" \ " type %s\n" #define MAGIC3 "# hash_size %hd" \ " features %ld unique_features %ld" \ " documents %ld\n" #define MAGIC4_i "# options %" FMT_scanf_options_t " %hd %hd (%s)\n" #define MAGIC4_o "# options %" FMT_printf_options_t " %hd %hd (%s)\n" #define MAGIC5_i "# regex %s\n" #define MAGIC5_o "# regex %s||%s\n" #define MAGIC5_wo "# regex %ls||%s\n" #define MAGIC7_i "# antiregex %s\n" #define MAGIC7_o "# antiregex %s||%s\n" #define MAGIC7_wo "# antiregex %ls||%s\n" #define MAGIC9 "# min_feature_count %ld max_feature_count %ld\n" #define RESTARTPOS 8 #define MAGIC6 "#\n" #define MAGIC8_i "# shannon %" FMT_scanf_score_t \ " shannon_s2 %" FMT_scanf_score_t "\n" #define MAGIC8_o "# shannon %" FMT_printf_score_t \ " shannon_s2 %" FMT_printf_score_t "\n" #define MAGIC10_i "# alpha %" FMT_scanf_score_t \ " beta %" FMT_scanf_score_t \ " mu %" FMT_scanf_score_t \ " s2 %" FMT_scanf_score_t "\n" #define MAGIC10_o "# alpha %" FMT_printf_score_t \ " beta %" FMT_printf_score_t \ " mu %" FMT_printf_score_t \ " s2 %" FMT_printf_score_t "\n" #define MAGIC11 "# medialp " #define MAGIC_ONLINE "# dbacl " SIGNATURE " online memory dump\n" #define MAGIC_DUMP "# lambda | dig_ref | count | id | token\n" #define MAGIC_DUMPTBL_o "%9.3f %9.3f %7" FMT_printf_integer_t " %8lx " #define MAGIC_DUMPTBL_i "%f %f %d %lx " /* data structures */ #define TOKEN_CLASS_MAX 16 #define TOKEN_ORDER_MAX 8 typedef struct { token_class_t cls: 4; token_order_t order: 3; unsigned int mark: 1; } PACK_STRUCTS token_type_t; typedef struct { hash_value_t id; token_count_t count; } h_item_t; typedef struct { hash_count_t max_tokens; hash_bit_count_t max_hash_bits; token_count_t full_token_count; token_count_t unique_token_count; h_item_t *hash; bool_t track_features; h_item_t *feature_stack[MAX_TOKEN_LINE_STACK]; token_stack_t feature_stack_top; int hashfull_warning; } empirical_t; typedef struct { hash_value_t id; #if defined DIGITIZE_LAMBDA digitized_weight_t lam; #else weight_t lam; #endif } PACK_STRUCTS c_item_t; typedef enum {simple, sequential} mtype; typedef struct { char *filename; char *fullfilename; token_order_t max_order; token_count_t fcomplexity; token_count_t model_unique_token_count; token_count_t model_full_token_count; document_count_t model_num_docs; hash_count_t max_tokens; hash_bit_count_t max_hash_bits; re_bitfield retype; score_t logZ; score_t divergence; score_t renorm; score_t delta; score_t complexity; score_t score; score_t score_div; score_t score_s2; score_t score_shannon; score_t shannon; score_t shannon_s2; score_t alpha; score_t beta; score_t mu; score_t s2; score_t prior; token_count_t fmiss; token_count_t mediacounts[TOKEN_CLASS_MAX]; struct { mtype type; options_t options; charparser_t cp; digtype_t dt; } model; options_t c_options; c_item_t *hash; byte_t *mmap_start; long mmap_offset; #if defined DIGITIZE_DIGRAMS digitized_weight_t dig[ASIZE][ASIZE]; #else weight_t dig[ASIZE][ASIZE]; #endif } category_t; typedef struct { token_count_t count; weight_t B; /* mustn't digitize this :-( */ #if defined DIGITIZE_LAMBDA digitized_weight_t lam; #else weight_t lam; #endif union { struct { #if defined DIGITIZE_LWEIGHTS digitized_weight_t ltrms; digitized_weight_t dref; #else weight_t ltrms; weight_t dref; #endif } min; struct { token_count_t eff; } read; } tmp; hash_value_t id; token_type_t typ; } PACK_STRUCTS l_item_t; typedef struct { hash_value_t *stack; hash_count_t top; hash_count_t max; score_t shannon; } emplist_t; typedef struct { char *filename; struct { FILE *file; char *filename; void *iobuf; long offset; long used; off_t avail; byte_t *mmap_start; long mmap_offset; size_t mmap_length; long mmap_cursor; } tmp; re_bitfield retype; token_order_t max_order; token_count_t fixed_order_token_count[MAX_SUBMATCH]; token_count_t fixed_order_unique_token_count[MAX_SUBMATCH]; hash_bit_count_t max_hash_bits; hash_count_t max_tokens; token_count_t full_token_count; token_count_t unique_token_count; token_count_t tmax; score_t logZ; score_t divergence; score_t shannon; score_t shannon2; score_t alpha; score_t beta; score_t mu; score_t s2; score_t mediaprobs[TOKEN_CLASS_MAX]; struct { options_t options; charparser_t cp; digtype_t dt; int tmin; } model; options_t u_options; byte_t *mmap_start; long mmap_learner_offset; long mmap_hash_offset; l_item_t *hash; weight_t dig[ASIZE][ASIZE]; long int regex_token_count[MAX_RE + 1]; struct { score_t A; score_t S; document_count_t count; document_count_t nullcount; bool_t skip; #define RESERVOIR_SIZE 25 /* #define RESERVOIR_SIZE 12 */ /* the reservoir size constrains the accuracy of the variance * estimate. Since this is a heavy computation, we want * to choose the lowest value we can get away with. Here 12 * gives an estimate for the error term to within sigma/3, which * hopefully is godd enough for most cases. */ emplist_t emp; emplist_t reservoir[RESERVOIR_SIZE]; } doc; } learner_t; /* this is used when minimizing learner divergence */ #define MAX_LAMBDA_JUMP 100 typedef struct { double alpha; double u[ASIZE]; } dirichlet_t; typedef struct { regex_t regex; char *string; smbitmap_t submatches; regex_flags_t flags; } myregex_t; #define MAX_BOUNDARIES 8 #define MAX_BOUNDARY_BUFSIZE 70 typedef enum { ceUNDEF, ceID, ceB64, ceQP, ceBIN, ceSEVEN} MIME_Content_Encoding; typedef enum { ctUNDEF, ctTEXT_PLAIN, ctTEXT_RICH, ctTEXT_HTML, ctTEXT_XML, ctTEXT_SGML, ctTEXT_UNKNOWN, ctIMAGE, ctAUDIO, ctVIDEO, ctMODEL, ctMESSAGE_RFC822, ctOTHER, ctOCTET_STREAM, ctAPPLICATION_MSWORD } MIME_Content_Type; typedef struct { MIME_Content_Type type; MIME_Content_Encoding encoding; } MIME_Struct; typedef enum { htSTANDARD, htEXTENDED, htTRACE, htMIME, htCONT, htUNDEF } HEADER_Type; typedef enum { msUNDEF=1, msHEADER, msBODY, msATTACH} Mstate; typedef enum { msuUNDEF=1, msuTRACK, msuMIME, msuARMOR, msuOTHER } Msubstate; typedef enum { mhsUNDEF=1, mhsSUBJECT, mhsFROM, mhsTO, mhsMIME, mhsXHEADER, mhsTRACE} Mhstate; typedef enum { maUNDEF=1, maENABLED} Marmor; typedef enum { psPLAIN, psUUENCODE } Mplainstate; typedef enum { hidUNDEF=1, hidCONTINUATION, hidRECEIVED, hidRETURN_PATH, hidRETURN_RECEIPT_TO, hidREPLY_TO, hidMESSAGE_ID, hidREFERENCES, hidIN_REPLY_TO, hidRESENT_, hidORIGINAL_, hidFROM, hidCC, hidBCC, hidSENT, hidSENDER, hidTO, hidSUBJECT, hidCONTENT_, hidMIME_VERSION, hidLIST_, hidX_, hidUSER_AGENT, hidX_MS, hidCATEGORY, hidPRIORITY, hidIMPORTANCE, hidTHREAD_, hidCOMMENTS, hidKEYWORDS, hidNOTE } Mheaderid; typedef struct { char *cache; char *data_ptr; size_t cache_len; size_t max_line_len; } decoding_cache; #if defined HAVE_MBRTOWC typedef struct { wchar_t *cache; wchar_t *data_ptr; size_t cache_len; size_t max_line_len; } w_decoding_cache; #endif typedef struct { Mstate state; Msubstate substate; Mhstate hstate; Mheaderid hid; Marmor armor; MIME_Struct header, body; bool_t prev_line_empty; bool_t skip_until_boundary; bool_t corruption_check; bool_t skip_header; char strip_header_char; #if defined HAVE_MBRTOWC wchar_t w_strip_header_char; #endif Mplainstate plainstate; struct { int size[MAX_BOUNDARIES]; char identifier[MAX_BOUNDARIES][MAX_BOUNDARY_BUFSIZE]; #if defined HAVE_MBRTOWC wchar_t w_identifier[MAX_BOUNDARIES][MAX_BOUNDARY_BUFSIZE]; #endif int index; bool_t was_end; } boundary; decoding_cache b64_dc; decoding_cache qp_dc; #if defined HAVE_MBRTOWC w_decoding_cache w_b64_dc; w_decoding_cache w_qp_dc; #endif } MBOX_State; typedef enum {TEXT=1, XTAG, XTAGQUOTE, XTAGDQUOTE, XTAGPREQ, TAG, TAGQUOTE, TAGDQUOTE, TAGPREQ, CMNT, DISABLED} Xstate; typedef enum {ALT=1, SRC, SRC_NETLOC, SRC_NETLOC_PREFIX, SRC_NETLOC_PATH, SRC_NETLOC_SUFFIX, UNDEF, JSCRIPT, ASTYLE} Xattribute; typedef enum {xpDUMB=1, xpHTML, xpSMART} Xparser; typedef enum {SCRIPT=1,STYLE,COMMENT,NOFRAMES,NOEMBED,NOSCRIPT,NOLAYER,TITLE,VISIBLE} Xhide; typedef struct { Xstate state; Xattribute attribute; Xparser parser; Xhide hide; } XML_State; typedef enum {xmlRESET,xmlDISABLE,xmlSMART,xmlHTML,xmlDUMB,xmlUNDEF} XML_Reset; #ifdef __cplusplus extern "C" { #endif /* these are defined in dbacl.c */ void sanitize_options(); int set_option(int op, char *optarg); void init_learner(learner_t *learner, char *opath, bool_t readonly); void free_learner(learner_t *learner); void reset_mbox_messages(learner_t *learner, MBOX_State *mbox); void count_mbox_messages(learner_t *learner, Mstate mbox_state, char *buf); void calc_shannon(learner_t *learner); void update_shannon_partials(learner_t *learner, bool_t fulldoc); void optimize_and_save(learner_t *learner); l_item_t *find_in_learner(learner_t *learner, hash_value_t id); bool_t grow_learner_hash(learner_t *learner); void hash_word_and_learn(learner_t *learner, char *tok, token_type_t tt, regex_count_t re); void make_dirichlet_digrams(learner_t *learner); void make_uniform_digrams(learner_t *learner); void transpose_digrams(learner_t *learner); bool_t read_online_learner_struct(learner_t *learner, char *opath, bool_t readonly); void write_online_learner_struct(learner_t *learner, char *opath); error_code_t save_learner(learner_t *learner, char *opath); /* these are defined in catfun.c */ char *sanitize_path(char *in, char *extension); error_code_t sanitize_model_options(options_t *to, charparser_t *mcp, category_t *cat); /*@shared@*/ char *print_model_options(options_t opt, charparser_t mcp, /*@out@*/ char *buf); char *print_user_options(options_t opt, char *buf); void init_empirical(empirical_t *emp, hash_count_t dmt, hash_bit_count_t dmhb); void free_empirical(empirical_t *emp); void clear_empirical(empirical_t *emp); h_item_t *find_in_empirical(empirical_t *emp, hash_value_t id); score_t empirical_entropy(empirical_t *emp); void init_category(category_t *cat); void free_category(category_t *cat); c_item_t *find_in_category(category_t *cat, hash_value_t id); void init_purely_random_text_category(category_t *cat); error_code_t load_category(category_t *cat); error_code_t load_category_header(FILE *input, category_t *cat); error_code_t open_category(category_t *cat); void reload_all_categories(); void score_word(char *tok, token_type_t tt, regex_count_t re); confidence_t gamma_pvalue(category_t *cat, double obs); /* file format handling in fh.c */ void init_file_handling(); void cleanup_file_handling(); token_class_t get_token_class(); regex_count_t load_regex(char *buf); void free_all_regexes(); /* common multibyte and wide char functions in mbw.c */ good_char_t good_char(char *c); void std_tokenizer(char *p, char **pq, char *hbuf, token_order_t *hbuf_order, token_order_t max_order, void (*word_fun)(char *, token_type_t, regex_count_t), token_type_t (*get_tt)(token_order_t)); void regex_tokenizer(char *p, int i, void (*word_fun)(char *, token_type_t, regex_count_t), token_type_t (*get_tt)(token_order_t)); void init_decoding_caches(MBOX_State *mbox); void free_decoding_caches(MBOX_State *mbox); bool_t b64_line_filter(decoding_cache *b64cache, char *line); char *b64_line_filter2(char *line, char *q); bool_t b64_line_flush(char *line, bool_t all); bool_t qp_line_filter(decoding_cache *qpcache, char *line); char *qp_line_filter2(char *line, char *q); bool_t qp_line_flush(char *line, bool_t all); bool_t mhe_line_filter(char *line); int extract_header_label(MBOX_State *mbox, char *line); bool_t extract_mime_boundary(MBOX_State *mbox, char *line); bool_t check_mime_boundary(MBOX_State *mbox, const char *line); bool_t mbox_line_filter(MBOX_State *mbox, char *line, XML_State *xml); bool_t plain_text_filter(MBOX_State *mbox, char *line); bool_t strings1_filter(char *line); void xml_character_filter(XML_State *xml, char *line); void process_file(FILE *input, int (*line_filter)(MBOX_State *, char *), void (*character_filter)(XML_State *, char *), void (*word_fun)(char *, token_type_t, regex_count_t), char *(*pre_line_fun)(char *), void (*post_line_fun)(char *)); void process_directory(char *name, int (*line_filter)(MBOX_State *, char *), void (*character_filter)(XML_State *, char *), void (*word_fun)(char *, token_type_t, regex_count_t), char *(*pre_line_fun)(char *), void (*post_line_fun)(char *), void (*post_file_fun)(char *)); void init_mbox_line_filter(MBOX_State *mbox); void free_mbox_line_filter(MBOX_State *mbox); void reset_mbox_line_filter(MBOX_State *mbox); void reset_xml_character_filter(XML_State *xml, XML_Reset reset); XML_Reset select_xml_defaults(MIME_Struct *mime); /* probabilities in probs.c */ double log_poisson(int k, double lambda); double sample_mean(double x, double n); double sample_variance(double ss, double x, double n); double min_prob(int k, int n, double mu[], double sigma[]); #if defined HAVE_MBRTOWC /* int w_b64_code(wchar_t c); */ /* int w_qp_code(wchar_t c); */ good_char_t w_good_char(wchar_t *c); void w_std_tokenizer(wchar_t *p, char **pq, char *hbuf, token_order_t *hbuf_order, token_order_t max_order, void (*word_fun)(char *, token_type_t, regex_count_t), token_type_t (*get_tt)(token_order_t)); void w_regex_tokenizer(wchar_t *p, int i, void (*word_fun)(char *, token_type_t, regex_count_t), token_type_t (*get_tt)(token_order_t)); void w_init_decoding_caches(MBOX_State *mbox); void w_free_decoding_caches(MBOX_State *mbox); bool_t w_b64_line_filter(w_decoding_cache *w_b64cache, wchar_t *line); wchar_t *w_b64_line_filter2(wchar_t *line, wchar_t *q); bool_t w_b64_line_flush(wchar_t *line, bool_t all); bool_t w_qp_line_filter(w_decoding_cache *w_qpcache, wchar_t *line); wchar_t *w_qp_line_filter2(wchar_t *line, wchar_t *q); bool_t w_qp_line_flush(wchar_t *line, bool_t all); bool_t w_mhe_line_filter(wchar_t *line); int w_extract_header_label(MBOX_State *mbox, wchar_t *line); bool_t w_extract_mime_boundary(MBOX_State *mbox, wchar_t *line); bool_t w_check_mime_boundary(MBOX_State *mbox, const wchar_t *line); bool_t w_mbox_line_filter(MBOX_State *mbox, wchar_t *line, XML_State *xml); bool_t w_plain_text_filter(MBOX_State *mbox, wchar_t *line); bool_t w_strings1_filter(wchar_t *line); int wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n); void w_xml_character_filter(XML_State *xml, wchar_t *line); void w_process_file(FILE *input, int (*line_filter)(MBOX_State *, wchar_t *), void (*character_filter)(XML_State *, wchar_t *), void (*word_fun)(char *, token_type_t, regex_count_t), char *(*pre_line_fun)(char *), void (*post_line_fun)(char *)); void w_process_directory(char *name, int (*line_filter)(MBOX_State *, wchar_t *), void (*character_filter)(XML_State *, wchar_t *), void (*word_fun)(char *, token_type_t, regex_count_t), char *(*pre_line_fun)(char *), void (*post_line_fun)(char *), void (*post_file_fun)(char *)); #endif #ifdef _SC_PAGE_SIZE #ifndef _SC_PAGESIZE #define _SC_PAGESIZE _SC_PAGE_SIZE #endif #endif #ifdef __cplusplus } #endif #endif dbacl-1.14.1/src/fh.c000066400000000000000000000523111325773323600142100ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #undef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #if defined HAVE_UNISTD_H #include #endif #include "util.h" #include "dbacl.h" extern options_t u_options; extern options_t m_options; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern regex_count_t antiregex_count; extern MBOX_State mbox; extern XML_State xml; extern char *textbuf; extern charbuf_len_t textbuf_len; extern char *aux_textbuf; extern charbuf_len_t aux_textbuf_len; #if defined HAVE_MBRTOWC extern wchar_t *wc_textbuf; extern charbuf_len_t wc_textbuf_len; #endif extern token_order_t ngram_order; extern long system_pagesize; extern void *in_iobuf; extern void *out_iobuf; extern int cmd; extern char *inputfile; extern long inputline; /*********************************************************** * EXPERIMENTAL: * * this code is an experiment to see if memory mapping is * * faster than buffered I/O. Surprisingly, the gain is at * * best marginal (less than two percent on my test). * * The code is left in for future experiments * * * * I suspect that mmap() isn't faster because we only read * * the input files sequentially, never backtrack, and my * * Debian development system probably reads ahead quite * * agressively. So normal buffered I/O does about the same * * amount of work, In any case, most of the time is spent * * in the hash tables and calculations anyway. * * * * The mmap() code below is written so as to easily replace* * the buffered I/O functions * ***********************************************************/ #undef EXPERIMENTAL #if defined EXPERIMENTAL #include #include typedef struct { FILE *f; size_t fsize; size_t fmappos; size_t fmapsize; char *seekpos; char *mstart; } MMFILE; int MMEOF(MMFILE *stream) { return stream->mstart && ((stream->seekpos - stream->mstart) + stream->fmappos >= stream->fsize); } MMFILE *MMOPEN(FILE *f) { MMFILE *stream = NULL; struct stat sb; if( f ) { stream = (MMFILE *)malloc(sizeof(MMFILE)); if( stream ) { stream->f = f; #define MEGABYTES 20 stream->fmapsize = MEGABYTES*1024*1024; if( fstat(fileno(f), &sb) == -1 ) { free(stream); return NULL; } stream->fsize = sb.st_size; stream->fmappos = 0; stream->mstart = MMAP(NULL, stream->fmapsize, PROT_READ, MAP_SHARED, fileno(stream->f), stream->fmappos); if( stream->mstart == MAP_FAILED ) { free(stream); return NULL; } stream->seekpos = stream->mstart; if( stream->mstart ) { MADVISE(stream->mstart, stream->fmapsize, MADV_SEQUENTIAL); } } } return stream; } int MMCLOSE(MMFILE *stream) { int r = 0; if( stream ) { r = MUNMAP(stream->mstart, stream->fmapsize); free(stream); } return r; } void MMFORWARD(MMFILE *stream) { size_t offset; if( stream->fmappos + stream->fmapsize < stream->fsize ) { offset = stream->seekpos - stream->mstart; if( MUNMAP(stream->mstart, stream->fmapsize) == -1 ) { free(stream); exit(0); } stream->fmappos += system_pagesize * (offset/system_pagesize); stream->mstart = MMAP(0, stream->fmapsize, PROT_READ, MAP_SHARED, fileno(stream->f), stream->fmappos); if( stream->mstart == MAP_FAILED ) { free(stream); exit(0); } stream->seekpos = stream->mstart + (offset - system_pagesize * (offset/system_pagesize)); if( stream->mstart ) { MADVISE(stream->mstart, stream->fmapsize, MADV_SEQUENTIAL); } } } char *MMGETS(char *s, size_t size, MMFILE *stream) { char *result = NULL; size_t left; left = stream->fmapsize - (stream->seekpos - stream->mstart); if( left < size ) { MMFORWARD(stream); left = stream->fmapsize - (stream->seekpos - stream->mstart); } if( left <= 0 ) { return NULL; } else if( size <= left + 1) { result = memccpy(s, stream->seekpos, '\n', size - 1); if( result ) { *result = '\0'; stream->seekpos += result - s; return s; } } else { result = memccpy(s, stream->seekpos, '\n', left); if( result ) { *result = '\0'; stream->seekpos = result; } else { memcpy(s, stream->seekpos, left); s[left] = '\0'; stream->seekpos += left; } return s; } return NULL; } #endif /*********************************************************** * MISCELLANEOUS FILE HANDLING * ***********************************************************/ void init_file_handling() { init_buffers(); init_mbox_line_filter(&mbox); } void cleanup_file_handling() { free_mbox_line_filter(&mbox); cleanup_buffers(); } /* Given a mime type, this selects an appropriate * xml default setting for the character filter. */ XML_Reset select_xml_defaults(MIME_Struct *mime) { switch(mime->type) { case ctUNDEF: case ctMESSAGE_RFC822: case ctTEXT_PLAIN: return (m_options & (1<hide = VISIBLE; xml->state = TEXT; if( m_options & (1<parser = xpSMART; } else if( m_options & (1<parser = xpDUMB; } else { xml->parser = xpSMART; } break; case xmlDISABLE: xml->state = DISABLED; break; case xmlSMART: if( (xml->state == DISABLED) || ((xml->parser != xpHTML) && (xml->parser != xpSMART)) ) { xml->state = TEXT; xml->hide = VISIBLE; xml->parser = xpSMART; } break; case xmlHTML: if( (xml->state == DISABLED) || ((xml->parser != xpHTML) && (xml->parser != xpSMART)) ) { xml->state = TEXT; xml->hide = VISIBLE; xml->parser = xpHTML; } break; case xmlDUMB: if( (xml->state == DISABLED) || (xml->parser != xpDUMB) ) { xml->state = TEXT; xml->hide = VISIBLE; xml->parser = xpDUMB; break; } case xmlUNDEF: /* ignore */ break; } } } void reset_mbox_line_filter(MBOX_State *mbox) { mbox->state = msUNDEF; mbox->substate = msuUNDEF; mbox->hid = hidUNDEF; mbox->header.type = mbox->body.type = ctUNDEF; mbox->header.encoding = mbox->body.encoding = ceUNDEF; mbox->prev_line_empty = 1; mbox->corruption_check = 0; mbox->skip_header = 0; mbox->skip_until_boundary = 0; mbox->strip_header_char = '\0'; #if defined HAVE_MBRTOWC mbox->w_strip_header_char = L'\0'; #endif mbox->plainstate = psPLAIN; memset(&mbox->boundary, 0, sizeof(mbox->boundary)); /* no need to reserve space for both char and wide char caches */ if( m_options & (1<state) { case msHEADER: switch(mbox->hstate) { case mhsTRACE: return 9; case mhsFROM: return 8; case mhsTO: return 7; case mhsSUBJECT: return 6; case mhsXHEADER: return 5; default: case mhsUNDEF: return 4; } case msUNDEF: case msBODY: return 3; case msATTACH: return 2; default: return 1; } return 0; } /* note: the token_class_t has a practical range of 0-15, because it is represented as a 4 bit integer in token_type_t. The class returned by this function is concatenated with the token before hashing, so two identical tokens with different classes are different. Note that for some headers it makes sense to use the same class, eg for Message-ID: and References: */ token_class_t getclass_dbacl1_13post(MBOX_State *mbox) { switch(mbox->state) { case msHEADER: switch(mbox->hid) { case hidCONTINUATION: /* we should never be here, because the parser should have filled in the correct value already */ return 0; case hidRECEIVED: case hidRETURN_PATH: case hidRETURN_RECEIPT_TO: case hidREPLY_TO: return 15; case hidMESSAGE_ID: case hidREFERENCES: case hidIN_REPLY_TO: return 14; case hidRESENT_: case hidORIGINAL_: return 13; case hidFROM: case hidCC: case hidBCC: case hidSENT: case hidSENDER: return 12; case hidTO: return 11; case hidSUBJECT: return 10; case hidCONTENT_: case hidMIME_VERSION: return 9; case hidLIST_: return 8; case hidX_: return 7; case hidX_MS: case hidCATEGORY: case hidPRIORITY: case hidIMPORTANCE: case hidTHREAD_: return 6; case hidUSER_AGENT: case hidCOMMENTS: case hidKEYWORDS: case hidNOTE: return 5; case hidUNDEF: default: return 4; } case msBODY: case msATTACH: default: switch(mbox->body.type) { case ctTEXT_PLAIN: case ctUNDEF: case ctTEXT_UNKNOWN: return 3; case ctTEXT_RICH: case ctTEXT_HTML: case ctTEXT_XML: case ctTEXT_SGML: return 2; default: return 1; } } return 0; } /* the token class is a common label for a subset of features, such as e.g. all features which appear in one header. If all tokens have the same class, then we effectively obtain the dbacl 1.7 and earlier behaviour. IT DOESN"T MAKE SENSE to have multiple classes and multiple orders. It's one or the other, otherwise we need several normalizing constants. */ token_type_t get_token_type(token_order_t o) { token_type_t tt; tt.order = o; tt.mark = 0; tt.cls = (( (m_options & (1< 0 ) { strcmp(textbuf, "\r\n\r\n"); return 1; } return 0; } void process_directory(char *name, int (*line_filter)(MBOX_State *, char *), void (*character_filter)(XML_State *, char *), void (*word_fun)(char *, token_type_t, regex_count_t), char *(*pre_line_fun)(char *), void (*post_line_fun)(char *), void (*post_file_fun)(char *)) { DIR *d; struct dirent *sd; FILE *input; struct stat statinfo; char fullp[_POSIX_PATH_MAX + 1]; char *fp; d = opendir(name); if( d ) { /* directory returns relative file names, but we need full paths */ strcpy(fullp, name); fp = fullp + strlen(name); if( (fp > fullp) && (fp[-1] != '/') ) { *fp++ = '/'; } for(sd = readdir(d); sd; sd = readdir(d)) { strcpy(fp, sd->d_name); if( stat(fullp, &statinfo) == 0 ) { switch(statinfo.st_mode & S_IFMT) { case S_IFREG: input = fopen(fullp, "rb"); if( input ) { inputfile = fullp; /* set some initial options */ reset_xml_character_filter(&xml, xmlRESET); if( m_options & (1< fullp) && (fp[-1] != '/') ) { *fp++ = '/'; } for(sd = readdir(d); sd; sd = readdir(d)) { strcpy(fp, sd->d_name); if( stat(fullp, &statinfo) == 0 ) { switch(statinfo.st_mode & S_IFMT) { case S_IFREG: input = fopen(fullp, "rb"); if( input ) { inputfile = fullp; /* set some initial options */ reset_xml_character_filter(&xml, xmlRESET); if( m_options & (1< */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dbacl.h" #include "hmine.h" char *progname; char *inputfile; long inputline; int cmd = 0; options_t u_options = 0; options_t m_options = 0; charparser_t m_cp = 0; digtype_t m_dt = 0; /* default value in case we don't have getpagesize() */ long system_pagesize = BUFSIZ; category_t cat[MAX_CAT]; category_count_t cat_count = 0; /* the myregex_t array contains both regexes (first half) and antiregexes (second half) */ myregex_t re[MAX_RE]; regex_count_t regex_count = 0; regex_count_t antiregex_count = 0; char *extn = ""; empirical_t empirical; MBOX_State mbox; XML_State xml; HEADER_State head; char *textbuf = NULL; charbuf_len_t textbuf_len = 0; #if defined HAVE_MBRTOWC wchar_t *wc_textbuf = NULL; charbuf_len_t wc_textbuf_len = 0; #endif char *aux_textbuf = NULL; charbuf_len_t aux_textbuf_len = 0; hash_bit_count_t default_max_hash_bits = 15; hash_count_t default_max_tokens = (1<<15); hash_bit_count_t default_max_grow_hash_bits = 16; hash_count_t default_max_grow_tokens = (1<<16); void *in_iobuf = NULL; /* only used for input stream */ void *out_iobuf = NULL; /* used for all category/learner file operations */ token_order_t ngram_order = 1; decoding_cache b64_dc = {NULL, NULL, 0, 0}; decoding_cache qp_dc = {NULL, NULL, 0, 0}; #if defined HAVE_MBRTOWC w_decoding_cache w_b64_dc = {NULL, NULL, 0, 0}; w_decoding_cache w_qp_dc = {NULL, NULL, 0, 0}; #endif dbacl-1.14.1/src/gamma.c000066400000000000000000000333451325773323600147030ustar00rootroot00000000000000/* gamma.c * * Gamma function * * * * SYNOPSIS: * * double x, y, gamma(); * extern int sgngam; * * y = gamma( x ); * * * * DESCRIPTION: * * Returns gamma function of the argument. The result is * correctly signed, and the sign (+1 or -1) is also * returned in a global (extern) variable named sgngam. * This variable is also filled in by the logarithmic gamma * function lgam(). * * Arguments |x| <= 34 are reduced by recurrence and the function * approximated by a rational function of degree 6/7 in the * interval (2,3). Large arguments are handled by Stirling's * formula. Large negative arguments are made positive using * a reflection formula. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -34, 34 10000 1.3e-16 2.5e-17 * IEEE -170,-33 20000 2.3e-15 3.3e-16 * IEEE -33, 33 20000 9.4e-16 2.2e-16 * IEEE 33, 171.6 20000 2.3e-15 3.2e-16 * * Error for arguments outside the test range will be larger * owing to error amplification by the exponential function. * */ /* lgam() * * Natural logarithm of gamma function * * * * SYNOPSIS: * * double x, y, lgam(); * extern int sgngam; * * y = lgam( x ); * * * * DESCRIPTION: * * Returns the base e (2.718...) logarithm of the absolute * value of the gamma function of the argument. * The sign (+1 or -1) of the gamma function is returned in a * global (extern) variable named sgngam. * * For arguments greater than 13, the logarithm of the gamma * function is approximated by the logarithmic version of * Stirling's formula using a polynomial approximation of * degree 4. Arguments between -33 and +33 are reduced by * recurrence to the interval [2,3] of a rational approximation. * The cosecant reflection formula is employed for arguments * less than -33. * * Arguments greater than MAXLGM return MAXNUM and an error * message. MAXLGM = 2.035093e36 for DEC * arithmetic or 2.556348e305 for IEEE arithmetic. * * * * ACCURACY: * * * arithmetic domain # trials peak rms * DEC 0, 3 7000 5.2e-17 1.3e-17 * DEC 2.718, 2.035e36 5000 3.9e-17 9.9e-18 * IEEE 0, 3 28000 5.4e-16 1.1e-16 * IEEE 2.718, 2.556e305 40000 3.5e-16 8.3e-17 * The error criterion was relative when the function magnitude * was greater than one but absolute when it was less than one. * * The following test used the relative error criterion, though * at certain points the relative error could be much higher than * indicated. * IEEE -200, -4 10000 4.8e-16 1.3e-16 * */ /* gamma.c */ /* gamma function */ /* Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier */ #include "mconf.h" #ifdef UNK static double P[] = { 1.60119522476751861407E-4, 1.19135147006586384913E-3, 1.04213797561761569935E-2, 4.76367800457137231464E-2, 2.07448227648435975150E-1, 4.94214826801497100753E-1, 9.99999999999999996796E-1 }; static double Q[] = { -2.31581873324120129819E-5, 5.39605580493303397842E-4, -4.45641913851797240494E-3, 1.18139785222060435552E-2, 3.58236398605498653373E-2, -2.34591795718243348568E-1, 7.14304917030273074085E-2, 1.00000000000000000320E0 }; #define MAXGAM 171.624376956302725 static double LOGPI = 1.14472988584940017414; #endif #ifdef DEC static unsigned short P[] = { 0035047,0162701,0146301,0005234, 0035634,0023437,0032065,0176530, 0036452,0137157,0047330,0122574, 0037103,0017310,0143041,0017232, 0037524,0066516,0162563,0164605, 0037775,0004671,0146237,0014222, 0040200,0000000,0000000,0000000 }; static unsigned short Q[] = { 0134302,0041724,0020006,0116565, 0035415,0072121,0044251,0025634, 0136222,0003447,0035205,0121114, 0036501,0107552,0154335,0104271, 0037022,0135717,0014776,0171471, 0137560,0034324,0165024,0037021, 0037222,0045046,0047151,0161213, 0040200,0000000,0000000,0000000 }; #define MAXGAM 34.84425627277176174 static unsigned short LPI[4] = { 0040222,0103202,0043475,0006750, }; #define LOGPI *(double *)LPI #endif #ifdef IBMPC static unsigned short P[] = { 0x2153,0x3998,0xfcb8,0x3f24, 0xbfab,0xe686,0x84e3,0x3f53, 0x14b0,0xe9db,0x57cd,0x3f85, 0x23d3,0x18c4,0x63d9,0x3fa8, 0x7d31,0xdcae,0x8da9,0x3fca, 0xe312,0x3993,0xa137,0x3fdf, 0x0000,0x0000,0x0000,0x3ff0 }; static unsigned short Q[] = { 0xd3af,0x8400,0x487a,0xbef8, 0x2573,0x2915,0xae8a,0x3f41, 0xb44a,0xe750,0x40e4,0xbf72, 0xb117,0x5b1b,0x31ed,0x3f88, 0xde67,0xe33f,0x5779,0x3fa2, 0x87c2,0x9d42,0x071a,0xbfce, 0x3c51,0xc9cd,0x4944,0x3fb2, 0x0000,0x0000,0x0000,0x3ff0 }; #define MAXGAM 171.624376956302725 static unsigned short LPI[4] = { 0xa1bd,0x48e7,0x50d0,0x3ff2, }; #define LOGPI *(double *)LPI #endif #ifdef MIEEE static unsigned short P[] = { 0x3f24,0xfcb8,0x3998,0x2153, 0x3f53,0x84e3,0xe686,0xbfab, 0x3f85,0x57cd,0xe9db,0x14b0, 0x3fa8,0x63d9,0x18c4,0x23d3, 0x3fca,0x8da9,0xdcae,0x7d31, 0x3fdf,0xa137,0x3993,0xe312, 0x3ff0,0x0000,0x0000,0x0000 }; static unsigned short Q[] = { 0xbef8,0x487a,0x8400,0xd3af, 0x3f41,0xae8a,0x2915,0x2573, 0xbf72,0x40e4,0xe750,0xb44a, 0x3f88,0x31ed,0x5b1b,0xb117, 0x3fa2,0x5779,0xe33f,0xde67, 0xbfce,0x071a,0x9d42,0x87c2, 0x3fb2,0x4944,0xc9cd,0x3c51, 0x3ff0,0x0000,0x0000,0x0000 }; #define MAXGAM 171.624376956302725 static unsigned short LPI[4] = { 0x3ff2,0x50d0,0x48e7,0xa1bd, }; #define LOGPI *(double *)LPI #endif /* Stirling's formula for the gamma function */ #if UNK static double STIR[5] = { 7.87311395793093628397E-4, -2.29549961613378126380E-4, -2.68132617805781232825E-3, 3.47222221605458667310E-3, 8.33333333333482257126E-2, }; #define MAXSTIR 143.01608 static double SQTPI = 2.50662827463100050242E0; #endif #if DEC static unsigned short STIR[20] = { 0035516,0061622,0144553,0112224, 0135160,0131531,0037460,0165740, 0136057,0134460,0037242,0077270, 0036143,0107070,0156306,0027751, 0037252,0125252,0125252,0146064, }; #define MAXSTIR 26.77 static unsigned short SQT[4] = { 0040440,0066230,0177661,0034055, }; #define SQTPI *(double *)SQT #endif #if IBMPC static unsigned short STIR[20] = { 0x7293,0x592d,0xcc72,0x3f49, 0x1d7c,0x27e6,0x166b,0xbf2e, 0x4fd7,0x07d4,0xf726,0xbf65, 0xc5fd,0x1b98,0x71c7,0x3f6c, 0x5986,0x5555,0x5555,0x3fb5, }; #define MAXSTIR 143.01608 static unsigned short SQT[4] = { 0x2706,0x1ff6,0x0d93,0x4004, }; #define SQTPI *(double *)SQT #endif #if MIEEE static unsigned short STIR[20] = { 0x3f49,0xcc72,0x592d,0x7293, 0xbf2e,0x166b,0x27e6,0x1d7c, 0xbf65,0xf726,0x07d4,0x4fd7, 0x3f6c,0x71c7,0x1b98,0xc5fd, 0x3fb5,0x5555,0x5555,0x5986, }; #define MAXSTIR 143.01608 static unsigned short SQT[4] = { 0x4004,0x0d93,0x1ff6,0x2706, }; #define SQTPI *(double *)SQT #endif int sgngam = 0; extern int sgngam; extern double MAXLOG, MAXNUM, PI; #ifdef ANSIPROT extern double pow ( double, double ); extern double log ( double ); extern double exp ( double ); extern double sin ( double ); extern double polevl ( double, void *, int ); extern double p1evl ( double, void *, int ); extern double floor ( double ); extern double fabs ( double ); extern int isnan ( double ); extern int isfinite ( double ); static double stirf ( double ); double lgam ( double ); #else double pow(), log(), exp(), sin(), polevl(), p1evl(), floor(), fabs(); int isnan(), isfinite(); static double stirf(); double lgam(); #endif #ifdef INFINITIES extern double INFINITY; #endif #ifdef NANS extern double NAN; #endif /* Gamma function computed by Stirling's formula. * The polynomial STIR is valid for 33 <= x <= 172. */ static double stirf(x) double x; { double y, w, v; w = 1.0/x; w = 1.0 + w * polevl( w, STIR, 4 ); y = exp(x); if( x > MAXSTIR ) { /* Avoid overflow in pow() */ v = pow( x, 0.5 * x - 0.25 ); y = v * (v / y); } else { y = pow( x, x - 0.5 ) / y; } y = SQTPI * y * w; return( y ); } double gamma(x) double x; { double p, q, z; int i; sgngam = 1; #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES #ifdef NANS if( x == INFINITY ) return(x); if( x == -INFINITY ) return(NAN); #else if( !isfinite(x) ) return(x); #endif #endif q = fabs(x); if( q > 33.0 ) { if( x < 0.0 ) { p = floor(q); if( p == q ) { #ifdef NANS gamnan: mtherr( "gamma", DOMAIN ); return (NAN); #else goto goverf; #endif } i = p; if( (i & 1) == 0 ) sgngam = -1; z = q - p; if( z > 0.5 ) { p += 1.0; z = q - p; } z = q * sin( PI * z ); if( z == 0.0 ) { #ifdef INFINITIES return( sgngam * INFINITY); #else goverf: mtherr( "gamma", OVERFLOW ); return( sgngam * MAXNUM); #endif } z = fabs(z); z = PI/(z * stirf(q) ); } else { z = stirf(x); } return( sgngam * z ); } z = 1.0; while( x >= 3.0 ) { x -= 1.0; z *= x; } while( x < 0.0 ) { if( x > -1.E-9 ) goto small; z /= x; x += 1.0; } while( x < 2.0 ) { if( x < 1.e-9 ) goto small; z /= x; x += 1.0; } if( x == 2.0 ) return(z); x -= 2.0; p = polevl( x, P, 6 ); q = polevl( x, Q, 7 ); return( z * p / q ); small: if( x == 0.0 ) { #ifdef INFINITIES #ifdef NANS goto gamnan; #else return( INFINITY ); #endif #else mtherr( "gamma", SING ); return( MAXNUM ); #endif } else return( z/((1.0 + 0.5772156649015329 * x) * x) ); } /* A[]: Stirling's formula expansion of log gamma * B[], C[]: log gamma function between 2 and 3 */ #ifdef UNK static double A[] = { 8.11614167470508450300E-4, -5.95061904284301438324E-4, 7.93650340457716943945E-4, -2.77777777730099687205E-3, 8.33333333333331927722E-2 }; static double B[] = { -1.37825152569120859100E3, -3.88016315134637840924E4, -3.31612992738871184744E5, -1.16237097492762307383E6, -1.72173700820839662146E6, -8.53555664245765465627E5 }; static double C[] = { /* 1.00000000000000000000E0, */ -3.51815701436523470549E2, -1.70642106651881159223E4, -2.20528590553854454839E5, -1.13933444367982507207E6, -2.53252307177582951285E6, -2.01889141433532773231E6 }; /* log( sqrt( 2*pi ) ) */ static double LS2PI = 0.91893853320467274178; #define MAXLGM 2.556348e305 #endif #ifdef DEC static unsigned short A[] = { 0035524,0141201,0034633,0031405, 0135433,0176755,0126007,0045030, 0035520,0006371,0003342,0172730, 0136066,0005540,0132605,0026407, 0037252,0125252,0125252,0125132 }; static unsigned short B[] = { 0142654,0044014,0077633,0035410, 0144027,0110641,0125335,0144760, 0144641,0165637,0142204,0047447, 0145215,0162027,0146246,0155211, 0145322,0026110,0010317,0110130, 0145120,0061472,0120300,0025363 }; static unsigned short C[] = { /*0040200,0000000,0000000,0000000*/ 0142257,0164150,0163630,0112622, 0143605,0050153,0156116,0135272, 0144527,0056045,0145642,0062332, 0145213,0012063,0106250,0001025, 0145432,0111254,0044577,0115142, 0145366,0071133,0050217,0005122 }; /* log( sqrt( 2*pi ) ) */ static unsigned short LS2P[] = {040153,037616,041445,0172645,}; #define LS2PI *(double *)LS2P #define MAXLGM 2.035093e36 #endif #ifdef IBMPC static unsigned short A[] = { 0x6661,0x2733,0x9850,0x3f4a, 0xe943,0xb580,0x7fbd,0xbf43, 0x5ebb,0x20dc,0x019f,0x3f4a, 0xa5a1,0x16b0,0xc16c,0xbf66, 0x554b,0x5555,0x5555,0x3fb5 }; static unsigned short B[] = { 0x6761,0x8ff3,0x8901,0xc095, 0xb93e,0x355b,0xf234,0xc0e2, 0x89e5,0xf890,0x3d73,0xc114, 0xdb51,0xf994,0xbc82,0xc131, 0xf20b,0x0219,0x4589,0xc13a, 0x055e,0x5418,0x0c67,0xc12a }; static unsigned short C[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x12b2,0x1cf3,0xfd0d,0xc075, 0xd757,0x7b89,0xaa0d,0xc0d0, 0x4c9b,0xb974,0xeb84,0xc10a, 0x0043,0x7195,0x6286,0xc131, 0xf34c,0x892f,0x5255,0xc143, 0xe14a,0x6a11,0xce4b,0xc13e }; /* log( sqrt( 2*pi ) ) */ static unsigned short LS2P[] = { 0xbeb5,0xc864,0x67f1,0x3fed }; #define LS2PI *(double *)LS2P #define MAXLGM 2.556348e305 #endif #ifdef MIEEE static unsigned short A[] = { 0x3f4a,0x9850,0x2733,0x6661, 0xbf43,0x7fbd,0xb580,0xe943, 0x3f4a,0x019f,0x20dc,0x5ebb, 0xbf66,0xc16c,0x16b0,0xa5a1, 0x3fb5,0x5555,0x5555,0x554b }; static unsigned short B[] = { 0xc095,0x8901,0x8ff3,0x6761, 0xc0e2,0xf234,0x355b,0xb93e, 0xc114,0x3d73,0xf890,0x89e5, 0xc131,0xbc82,0xf994,0xdb51, 0xc13a,0x4589,0x0219,0xf20b, 0xc12a,0x0c67,0x5418,0x055e }; static unsigned short C[] = { 0xc075,0xfd0d,0x1cf3,0x12b2, 0xc0d0,0xaa0d,0x7b89,0xd757, 0xc10a,0xeb84,0xb974,0x4c9b, 0xc131,0x6286,0x7195,0x0043, 0xc143,0x5255,0x892f,0xf34c, 0xc13e,0xce4b,0x6a11,0xe14a }; /* log( sqrt( 2*pi ) ) */ static unsigned short LS2P[] = { 0x3fed,0x67f1,0xc864,0xbeb5 }; #define LS2PI *(double *)LS2P #define MAXLGM 2.556348e305 #endif /* Logarithm of gamma function */ double lgam(x) double x; { double p, q, u, w, z; int i; sgngam = 1; #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES if( !isfinite(x) ) return(INFINITY); #endif if( x < -34.0 ) { q = -x; w = lgam(q); /* note this modifies sgngam! */ p = floor(q); if( p == q ) { lgsing: #ifdef INFINITIES mtherr( "lgam", SING ); return (INFINITY); #else goto loverf; #endif } i = p; if( (i & 1) == 0 ) sgngam = -1; else sgngam = 1; z = q - p; if( z > 0.5 ) { p += 1.0; z = p - q; } z = q * sin( PI * z ); if( z == 0.0 ) goto lgsing; /* z = log(PI) - log( z ) - w;*/ z = LOGPI - log( z ) - w; return( z ); } if( x < 13.0 ) { z = 1.0; p = 0.0; u = x; while( u >= 3.0 ) { p -= 1.0; u = x + p; z *= u; } while( u < 2.0 ) { if( u == 0.0 ) goto lgsing; z /= u; p += 1.0; u = x + p; } if( z < 0.0 ) { sgngam = -1; z = -z; } else sgngam = 1; if( u == 2.0 ) return( log(z) ); p -= 2.0; x = x + p; p = x * polevl( x, B, 5 ) / p1evl( x, C, 6); return( log(z) + p ); } if( x > MAXLGM ) { #ifdef INFINITIES return( sgngam * INFINITY ); #else loverf: mtherr( "lgam", OVERFLOW ); return( sgngam * MAXNUM ); #endif } q = ( x - 0.5 ) * log(x) - x + LS2PI; if( x > 1.0e8 ) return( q ); p = 1.0/(x*x); if( x >= 1000.0 ) q += (( 7.9365079365079365079365e-4 * p - 2.7777777777777777777778e-3) *p + 0.0833333333333333333333) / x; else q += polevl( p, A, 4 ) / x; return( q ); } dbacl-1.14.1/src/hmine.c000066400000000000000000000207641325773323600147220ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #if defined HAVE_LANGINFO_H #include #if !defined CODESET /* on OpenBSD, CODESET doesn't seem to be defined - we use 3, which should be US-ASCII, but it's not ideal... */ #define CODESET 3 #endif #endif #include #include #include #include #include #include #if defined HAVE_UNISTD_H #include #endif #include "dbacl.h" #include "util.h" #include "hmine.h" extern HEADER_State head; extern char *textbuf; extern charbuf_len_t textbuf_len; extern options_t u_options; extern char *progname; extern char *inputfile; extern long inputline; extern int cmd; extern long system_pagesize; int exit_code = 0; /* default */ /*********************************************************** * FUNNY FUNCTIONS * ***********************************************************/ void print_mailbox(hline_t *h, char *buf, int buflen) { char *p = NULL; char *q = NULL; parse_2822_mls_t *mls = NULL; parse_2822_mbx_t *mbx = NULL; parse_2822_als_t *als = NULL; switch(h->tag) { case hltFRM: p = "from"; mls = &h->data.frm.rfc2822; break; case hltRFR: p = "resend-from"; mls = &h->data.rfr.rfc2822; break; case hltRPT: p = "reply-to"; als = &h->data.rpt.rfc2822; break; case hltRRT: p = "resend-reply-to"; als = &h->data.rrt.rfc2822; break; case hltSND: p = "sender"; mbx = &h->data.snd.rfc2822; break; case hltRSN: p = "resend-sender"; mbx = &h->data.rsn.rfc2822; break; case hltTO: p = "to"; als = &h->data.to.rfc2822; break; case hltRTO: p = "resend-to"; als = &h->data.rto.rfc2822; break; case hltCC: p = "cc"; als = &h->data.cc.rfc2822; break; case hltRCC: p = "resend-cc"; als = &h->data.rcc.rfc2822; break; case hltBCC: p = "bcc"; als = &h->data.bcc.rfc2822; break; case hltRBC: p = "resend-bcc"; als = &h->data.rbc.rfc2822; break; default: /* nothing */ break; } if( p && !(h->state & (1<mailboxl_.begin, mls->mailboxl_.end, ','); while( q ) { bracketize_mailbox(buf, buflen); fprintf(stdout, "%s %s\n", p, buf); if( q >= mls->mailboxl_.end ) { break; } q = unfold_token(buf, buflen, q, mls->mailboxl_.end, ','); } } else if( als ) { q = unfold_token(buf, buflen, als->addressl_.begin, als->addressl_.end, ','); while( q ) { bracketize_mailbox(buf, buflen); fprintf(stdout, "%s %s\n", p, buf); if( q >= als->addressl_.end ) { break; } q = unfold_token(buf, buflen, q, als->addressl_.end, ','); } } else if( mbx ) { q = unfold_token(buf, buflen, mbx->mailbox_.begin, mbx->mailbox_.end, ','); bracketize_mailbox(buf, buflen); fprintf(stdout, "%s %s\n", p, buf); } } } void print_summary() { int i; char buf[1024]; /* time_t numsec = (time_t)-1; */ /* for(i = 0; i < head.hstack.top; i++) { */ /* if( head.hstack.hlines[i].tag == hltRCV ) { */ /* if( head.hstack.hlines[i].state & (1< -1 ) { hset_option(op, optarg); } /* set up callbacks */ if( preprocess_fun ) { (*preprocess_fun)(); } init_header_handling(); /* now process only the first file on the command line, or if none provided read stdin */ if( (optind > -1) && *(argv + optind) ) { /* if it's a filename, process it */ input = fopen(argv[optind], "rb"); if( input ) { inputfile = argv[optind]; u_options |= (1< */ #ifndef HFORGE_H #define HFORGE_H #ifdef HAVE_CONFIG_H #undef HAVE_CONFIG_H #include "config.h" #endif #include typedef struct { char *begin; char *end; } token_delim_t; #define NULLTOKEN(t) ((t).begin && ((t).end > (t).begin)) /* format specific parse structures */ typedef struct { token_delim_t path_; } parse_822_pth_t; typedef struct { token_delim_t path_; } parse_2822_pth_t; typedef struct { token_delim_t from_; token_delim_t by_; token_delim_t via_; token_delim_t withl_; token_delim_t id_; token_delim_t for_; token_delim_t datetime_; } parse_822_rcv_t; typedef struct { token_delim_t naval_; token_delim_t from_; token_delim_t by_; token_delim_t via_; token_delim_t withl_; token_delim_t id_; token_delim_t for_; token_delim_t datetime_; } parse_2822_rcv_t; typedef struct { token_delim_t from_; token_delim_t by_; token_delim_t via_; token_delim_t with_; token_delim_t id_; token_delim_t for_; token_delim_t datetime_; } parse_821_rcv_t; typedef struct { token_delim_t from_; token_delim_t by_; token_delim_t via_; token_delim_t with_; token_delim_t smid_; token_delim_t for_; token_delim_t datetime_; } parse_2821_rcv_t; typedef struct { token_delim_t addressl_; } parse_822_als_t; typedef struct { token_delim_t addressl_; } parse_2822_als_t; typedef struct { token_delim_t mailboxl_; } parse_822_mls_t; typedef struct { token_delim_t mailboxl_; } parse_2822_mls_t; typedef struct { token_delim_t mailbox_; } parse_822_mbx_t; typedef struct { token_delim_t mailbox_; } parse_2822_mbx_t; typedef struct { token_delim_t datetime_; } parse_822_dat_t; typedef struct { token_delim_t datetime_; } parse_2822_dat_t; typedef struct { token_delim_t msg_id_; } parse_822_mid_t; typedef struct { token_delim_t msg_id_; } parse_2822_mid_t; typedef struct { token_delim_t refs_; } parse_822_ref_t; typedef struct { token_delim_t refs_; } parse_2822_ref_t; typedef struct { token_delim_t phrasel_; } parse_822_pls_t; typedef struct { token_delim_t text_; } parse_822_txt_t; typedef struct { token_delim_t text_; } parse_2822_txt_t; typedef struct { char *line; } ignored_t; /* generic parse structures */ typedef struct { parse_822_pth_t rfc821; parse_822_pth_t rfc822; parse_2822_pth_t rfc2821; parse_2822_pth_t rfc2822; } return_path_t; typedef struct { parse_821_rcv_t rfc821; parse_822_rcv_t rfc822; parse_2821_rcv_t rfc2821; parse_2822_rcv_t rfc2822; time_t numsec; } received_t; typedef struct { parse_822_als_t rfc822; parse_2822_als_t rfc2822; } reply_to_t; typedef struct { parse_822_mls_t rfc822; parse_2822_mls_t rfc2822; } from_t; typedef struct { parse_822_mbx_t rfc822; parse_2822_mbx_t rfc2822; } sender_t; typedef struct { parse_822_dat_t rfc822; parse_2822_dat_t rfc2822; time_t numsec; } dat_t; typedef struct { parse_822_als_t rfc822; parse_2822_als_t rfc2822; } to_t; typedef struct { parse_822_als_t rfc822; parse_2822_als_t rfc2822; } cc_t; typedef struct { parse_822_als_t rfc822; parse_2822_als_t rfc2822; } bcc_t; typedef struct { parse_822_mid_t rfc822; parse_2822_mid_t rfc2822; } message_id_t; typedef struct { parse_822_ref_t rfc822; parse_2822_ref_t rfc2822; } in_reply_to_t; typedef struct { parse_822_ref_t rfc822; parse_2822_ref_t rfc2822; } references_t; typedef struct { parse_822_txt_t rfc822; parse_2822_txt_t rfc2822; } subject_t; #define H_STATE_OK 1 #define H_STATE_BAD_LABEL 2 #define H_STATE_RFC2821 3 #define H_STATE_RFC2821loc 4 #define H_STATE_RFC2822 5 #define H_STATE_RFC2822obs 6 #define H_STATE_RFC821 7 #define H_STATE_RFC822 8 #define H_STATE_RFC2822lax 9 #define H_STATE_BAD_DATA 10 #define H_STATE_RFC2821lax 11 typedef enum { hltUNDEF, hltIGN, hltRET, hltRCV, hltRPT, hltFRM, hltSND, hltRRT, hltRFR, hltRSN, hltDAT, hltRDT, hltTO, hltRTO, hltCC, hltRCC, hltBCC, hltRBC, hltMID, hltRID, hltIRT, hltREF, hltSBJ } HLINE_Tag; typedef enum { hleNONE, hleLABEL } HLINE_Error; typedef struct { options_t state; HLINE_Tag tag; charbuf_len_t toffset; union { ignored_t ign; return_path_t ret; received_t rcv; reply_to_t rpt; reply_to_t rrt; from_t frm; from_t rfr; sender_t snd; sender_t rsn; dat_t dat; dat_t rdt; to_t to; to_t rto; cc_t cc; cc_t rcc; bcc_t bcc; bcc_t rbc; message_id_t mid; message_id_t rid; in_reply_to_t irt; references_t ref; subject_t sbj; } data; } hline_t; typedef int hline_count_t; typedef struct { struct { char *textbuf; char *textbuf_end; charbuf_len_t textbuf_len; charbuf_len_t curline; } hdata; struct { hline_t *hlines; hline_count_t max; hline_count_t top; } hstack; } HEADER_State; void init_head_filter(HEADER_State *head); void free_head_filter(HEADER_State *head); char *head_append_hline(HEADER_State *head, const char *what); hline_t *head_push_header(HEADER_State *head, char *line); void print_token_delim(FILE *out, char *sym, token_delim_t *d); /* useful macros */ #define BOT if( tok ) { tok->begin = line; } #define EOT if( tok ) { tok->end = line; } /* #define DT(x) print_token_delim(stdout, (x), tok); */ #define DT(x) char *parse_822_return(char *line, parse_822_pth_t *p); char *parse_822_received(char *line, parse_822_rcv_t *p); char *parse_822_reply_to(char *line, parse_822_als_t *p); char *parse_822_from(char *line, parse_822_mls_t *p); char *parse_822_sender(char *line, parse_822_mbx_t *p); char *parse_822_resent_reply_to(char *line, parse_822_als_t *p); char *parse_822_resent_from(char *line, parse_822_mls_t *p); char *parse_822_resent_sender(char *line, parse_822_mbx_t *p); char *parse_822_date(char *line, parse_822_dat_t *p); char *parse_822_resent_date(char *line, parse_822_dat_t *p); char *parse_822_to(char *line, parse_822_als_t *p); char *parse_822_resent_to(char *line, parse_822_als_t *p); char *parse_822_cc(char *line, parse_822_als_t *p); char *parse_822_resent_cc(char *line, parse_822_als_t *p); char *parse_822_bcc(char *line, parse_822_als_t *p); char *parse_822_resent_bcc(char *line, parse_822_als_t *p); char *parse_822_message_id(char *line, parse_822_mid_t *p); char *parse_822_resent_message_id(char *line, parse_822_mid_t *p); char *parse_822_in_reply_to(char *line, parse_822_ref_t *p); char *parse_822_references(char *line, parse_822_ref_t *p); char *parse_822_keywords(char *line, parse_822_pls_t *p); char *parse_822_subject(char *line, parse_822_txt_t *p); char *parse_822_comments(char *line, parse_822_txt_t *p); char *parse_821_return_path_line(char *line, parse_822_pth_t *p); char *parse_821_time_stamp_line(char *line, parse_821_rcv_t *p); #define O_2822_OBS 1 #define O_2821_NO_SP_BEFORE_DATE 2 #define O_2822_ALLOW_NFQDN 3 #define O_2821_NO_PARENS_ADDRESS 4 #define RFC_2822_STRICT 0 #define RFC_2821_STRICT 0 #define RFC_2822_OBSOLETE (1< */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dbacl.h" #include "hmine.h" #include "util.h" extern options_t u_options; extern long system_pagesize; /* #define DEBUG_TOKEN(s,d) print_token_delim(stdout, (s), (d)) */ #define DEBUG_TOKEN(s,d) /*********************************************************** * PARSING FUNCTIONS * * * * The RFC 821,822,2821,2822 standards each define grammars* * which are subtly incompatible, most likely due to typos.* * For us, this poses a problem. The easiest solution is * * to define four different parsing functions, and try them* * all out. * *********************************************************** * The skip functions operate as follows: if line is NULL, * * the function returns NULL. Otherwise, line is returned * * as a pointer to the first character after the skipped * * pattern. If the patterns couldn't be traversed * * successfully, the function returns NULL. * ***********************************************************/ void print_token_delim(FILE *out, char *sym, token_delim_t *d) { char *p; if( sym && d) { fprintf(out, "%s[", sym); for(p = d->begin; p < d->end; p++) { fprintf(out, "%c", *p); } fprintf(out, "]\n"); } } void print_state(FILE *out, hline_t *t) { fprintf(stdout, "%s%s%s%s%s%s%s%s\n", (t->state & (1<state & (1<state & (1<state & (1<state & (1<state & (1<state & (1<state & (1<hdata.textbuf_len = system_pagesize; head->hdata.textbuf = (char *)malloc(head->hdata.textbuf_len); head->hdata.textbuf_end = head->hdata.textbuf; head->hdata.curline = 0; head->hstack.max = 100; head->hstack.top = 0; head->hstack.hlines = (hline_t *)calloc(head->hstack.max, sizeof(hline_t)); } void free_head_filter(HEADER_State *head) { if( head->hdata.textbuf ) { free(head->hdata.textbuf); head->hdata.textbuf = NULL; head->hdata.textbuf_end = NULL; head->hdata.curline = 0; } if( head->hstack.hlines ) { free(head->hstack.hlines); head->hstack.top = 0; } } char *head_append_hline(HEADER_State *head, const char *line) { int l, n; char *tmp; if( head->hdata.textbuf && line ) { l = head->hdata.textbuf_end - head->hdata.textbuf; n = strlen(line); while( (l+n) >= head->hdata.textbuf_len ) { tmp = (char *)realloc(head->hdata.textbuf, 2 * head->hdata.textbuf_len); if( !tmp ) { errormsg(E_ERROR, "not enough memory for input line (%d bytes)\n", head->hdata.textbuf_len); return NULL; } head->hdata.textbuf = tmp; head->hdata.textbuf_end = tmp + l; head->hdata.textbuf_len *= 2; } if( !isblank(*line) ) { /* separate logical header lines by NUL chars */ *head->hdata.textbuf_end++ = '\0'; head->hdata.curline = head->hdata.textbuf_end - head->hdata.textbuf; } strcpy(head->hdata.textbuf_end, line); head->hdata.textbuf_end += n; return head->hdata.textbuf + head->hdata.curline; } return NULL; } /*********************************************************** * CONVERSION FUNCTIONS * ***********************************************************/ int adjust_tz(struct tm *tim, char *p) { int s, a, i; typedef struct { char *nam; int offs; } zon_t; static zon_t zones[] = { /* note: zone offsets are already added to printed date */ {"UT", 0}, {"GMT", 0}, {"EST", -5}, {"EDT", -4}, {"CST", -6}, {"CDT", -5}, {"MST", -7}, {"MDT", -6}, {"PST", -8}, {"PDT", -7}, {"A", -1}, {"B", -2}, {"C", -3}, {"D", -4}, {"E", -5}, {"F", -6}, {"G", -7}, {"H", -8}, {"I", -9}, {"K", -10}, {"L", -11}, {"M", -12}, {"N", +1}, {"O", +2}, {"P", +3}, {"Q", +4}, {"R", +5}, {"S", +6}, {"T", +7}, {"U", +8}, {"V", +9}, {"W", +10}, {"X", +11}, {"Y", +12}, {"Z", 0} }; while( *p && !isalpha((int)*p) && (*p != '+') && (*p != '-') ) { p++; } switch(*p) { case '+': case '-': if( *p == '+' ) { s = -1; } else { s = +1; } while( *p && !isdigit((int)*p) ) { p++; } a = atoi(p); tim->tm_hour += s * (int)(a / 100); tim->tm_min += s * (int)(a % 100); break; default: a = -25; for(i = 0; i < sizeof(zones)/sizeof(zon_t); i++) { if( strncasecmp(p, zones[i].nam, strlen(zones[i].nam)) == 0 ) { a = -zones[i].offs; break; } } if( a == -25 ) { return -1; } else { tim->tm_hour += a; } } return 0; } /* not sure that we can use strptime(), so we do this manually :-( */ time_t cvt_date(token_delim_t *tok) { struct tm tim; time_t retval; char *p, *q; int i; static char *month_name[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static char *day_name[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; p = tok->begin; if( !p ) { return -1; } while( *p && !isdigit((int)*p) ) { p++; } tim.tm_mday = atoi(p); if( (tim.tm_mday < 1) || (tim.tm_mday > 31) ) { return -1; } while( *p && !isalpha((int)*p) ) { p++; } tim.tm_mon = -1; for(i = 0; i < sizeof(month_name)/sizeof(char*); i++) { if( strncasecmp(p, month_name[i], 3) == 0 ) { tim.tm_mon = i; break; } } if( (tim.tm_mon < 0) || (tim.tm_mon > 11) ) { return -1; } while( *p && !isdigit((int)*p) ) { p++; } tim.tm_year = atoi(p) - 1900; if( (tim.tm_year < 0) || (tim.tm_year > 132) ) { return -1; } while( *p && !isspace((int)*p) ) { p++; } while( *p && !isdigit((int)*p) ) { p++; } tim.tm_hour = atoi(p); if( (tim.tm_hour < 0) || (tim.tm_hour > 23) ) { return -1; } while( *p && (*p != ':') ) { p++; } while( *p && !isdigit((int)*p) ) { p++; } tim.tm_min = atoi(p); if( (tim.tm_min < 0) || (tim.tm_min > 59) ) { return -1; } for(q = p; *q && (*q != ':'); q++); if( *q == ':' ) { for(p = q; *p && !isdigit((int)*p); p++); tim.tm_sec = atoi(p); if( (tim.tm_sec < 0) || (tim.tm_sec > 59) ) { return -1; } } else { tim.tm_sec = 0; } while( *p && isdigit((int)*p) ) { p++; } tim.tm_isdst = 0; /* verify weekday if present - this must be done before the time zone * adjustment! */ for(q = tok->begin; *q && !isalnum((int)*q); q++); /* used later */ if( isalpha((int)*q) ) { for(i = 0; i < sizeof(day_name)/sizeof(char*); i++) { if( strncasecmp(q, day_name[i], 3) == 0 ) { if( tim.tm_wday != i ) { retval = -1; } break; } } } /* time zone parsing is messy */ if( adjust_tz(&tim, p) > -1 ) { /* mktime assumes UTC */ retval = mktime(&tim); } else { retval = -1; } return retval; } /*********************************************************** * HEADER LINE FUNCTIONS * ***********************************************************/ hline_t *mkh_ignore(HEADER_State *head, hline_t *t, char *line) { memset(t, 0, sizeof(hline_t)); t->tag = hltIGN; t->data.ign.line = line; t->toffset = head->hdata.curline; if( (u_options & (1<tag = hltRET; t->toffset = head->hdata.curline; if( parse_822_return(line, &t->data.ret.rfc822) ) { t->state |= (1<data.ret.rfc821) ) { t->state |= (1<data.ret.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.ret.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.ret.rfc2822, RFC_2822_LAX) ) { t->state |= (1<data.ret.rfc2821, RFC_2821_STRICT) ) { t->state |= (1<tag = hltRCV; t->toffset = head->hdata.curline; if( parse_822_received(line, &t->data.rcv.rfc822) ) { t->state |= (1<data.rcv.rfc821) ) { t->state |= (1<data.rcv.rfc2821, RFC_2821_STRICT) ) { t->state |= (1<data.rcv.rfc2821, RFC_2821_LAX) ) { t->state |= (1<data.rcv.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rcv.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rcv.rfc2822, RFC_2822_LAX) ) { t->state |= (1<state & ((1<data.rcv.numsec = cvt_date(&t->data.rcv.rfc2821.datetime_); } else if( t->state & ((1<data.rcv.numsec = cvt_date(&t->data.rcv.rfc2822.datetime_); } else if( t->state & (1<data.rcv.numsec = cvt_date(&t->data.rcv.rfc822.datetime_); } else { t->data.rcv.numsec = -1; } if( t->data.dat.numsec == (time_t)(-1) ) { t->state |= (1<data.rcv.numsec); print_state(stdout, t); } return t; } hline_t *mkh_reply_to(HEADER_State *head, hline_t *t, char *line) { memset(t, 0, sizeof(hline_t)); t->tag = hltRPT; t->toffset = head->hdata.curline; if( parse_822_reply_to(line, &t->data.rpt.rfc822) ) { t->state |= (1<data.rpt.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rpt.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rpt.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltFRM; t->toffset = head->hdata.curline; if( parse_822_from(line, &t->data.frm.rfc822) ) { t->state |= (1<data.frm.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.frm.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.frm.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltSND; t->toffset = head->hdata.curline; if( parse_822_sender(line, &t->data.snd.rfc822) ) { t->state |= (1<data.snd.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.snd.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.snd.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRRT; t->toffset = head->hdata.curline; if( parse_822_resent_reply_to(line, &t->data.rrt.rfc822) ) { t->state |= (1<data.rrt.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rrt.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rrt.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRFR; t->toffset = head->hdata.curline; if( parse_822_from(line, &t->data.rfr.rfc822) ) { t->state |= (1<data.rfr.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rfr.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rfr.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRSN; t->toffset = head->hdata.curline; if( parse_822_resent_sender(line, &t->data.rsn.rfc822) ) { t->state |= (1<data.rsn.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rsn.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rsn.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltDAT; t->toffset = head->hdata.curline; if( parse_822_date(line, &t->data.dat.rfc822) ) { t->state |= (1<data.dat.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.dat.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.dat.rfc2822, RFC_2822_LAX) ) { t->state |= (1<state & ((1<data.dat.numsec = cvt_date(&t->data.dat.rfc2822.datetime_); } else if( t->state & (1<data.dat.numsec = cvt_date(&t->data.dat.rfc822.datetime_); } else { t->data.dat.numsec = -1; } if( t->data.dat.numsec == (time_t)(-1) ) { t->state |= (1<data.dat.numsec); print_state(stdout, t); } return t; } hline_t *mkh_resent_date(HEADER_State *head, hline_t *t, char *line) { memset(t, 0, sizeof(hline_t)); t->tag = hltRDT; t->toffset = head->hdata.curline; if( parse_822_resent_date(line, &t->data.rdt.rfc822) ) { t->state |= (1<data.rdt.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rdt.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rdt.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltTO; t->toffset = head->hdata.curline; if( parse_822_to(line, &t->data.to.rfc822) ) { t->state |= (1<data.to.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.to.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.to.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRTO; t->toffset = head->hdata.curline; if( parse_822_resent_to(line, &t->data.rto.rfc822) ) { t->state |= (1<data.rto.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rto.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rto.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltCC; t->toffset = head->hdata.curline; if( parse_822_cc(line, &t->data.cc.rfc822) ) { t->state |= (1<data.cc.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.cc.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.cc.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRCC; t->toffset = head->hdata.curline; if( parse_822_resent_cc(line, &t->data.rcc.rfc822) ) { t->state |= (1<data.rcc.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rcc.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rcc.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltBCC; t->toffset = head->hdata.curline; if( parse_822_bcc(line, &t->data.bcc.rfc822) ) { t->state |= (1<data.bcc.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.bcc.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.bcc.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRBC; t->toffset = head->hdata.curline; if( parse_822_resent_bcc(line, &t->data.rbc.rfc822) ) { t->state |= (1<data.rbc.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rbc.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rbc.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltMID; t->toffset = head->hdata.curline; if( parse_822_message_id(line, &t->data.mid.rfc822) ) { t->state |= (1<data.mid.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.mid.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.mid.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltRID; t->toffset = head->hdata.curline; if( parse_822_resent_message_id(line, &t->data.rid.rfc822) ) { t->state |= (1<data.rid.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.rid.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.rid.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltIRT; t->toffset = head->hdata.curline; if( parse_822_in_reply_to(line, &t->data.irt.rfc822) ) { t->state |= (1<data.irt.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.irt.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.irt.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltREF; t->toffset = head->hdata.curline; if( parse_822_references(line, &t->data.ref.rfc822) ) { t->state |= (1<data.ref.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.ref.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.ref.rfc2822, RFC_2822_LAX) ) { t->state |= (1<tag = hltSBJ; t->toffset = head->hdata.curline; if( parse_822_subject(line, &t->data.sbj.rfc822) ) { t->state |= (1<data.sbj.rfc2822, RFC_2822_STRICT) ) { t->state |= (1<data.sbj.rfc2822, RFC_2822_OBSOLETE) ) { t->state |= (1<data.sbj.rfc2822, RFC_2822_LAX) ) { t->state |= (1<hstack.top >= head->hstack.max ) { tmp = (hline_t *)realloc(head->hstack.hlines, 2 * head->hstack.max); if( !tmp ) { errormsg(E_ERROR, "could not grow header stack (%d)\n", head->hstack.max * 2); return NULL; } head->hstack.hlines = tmp; head->hstack.max *= 2; } tmp = make_new_header(head, head->hstack.hlines + head->hstack.top, line); if( tmp ) { head->hstack.top++; } return tmp; } /*********************************************************** * MORE UTILITY FUNCTIONS * ***********************************************************/ char *unfold_token(char *buf, int buflen, char *tokb, char *toke, char delim) { if( buf && tokb && toke ) { buflen--; /* need space for the NUL */ for(; (tokb < toke) && isspace((int)*tokb); tokb++); /* skip leading whitespace */ while( (tokb < toke) && (buflen > 0) ) { switch(*tokb) { case '\n': case '\r': for(; (tokb < toke) && isspace((int)*tokb); tokb++); *buf++ = ' '; buflen--; break; case '\0': /* ignore */ break; default: if( *tokb != delim ) { *buf++ = *tokb; buflen--; } else { *buf = '\0'; return (++tokb); } } tokb++; } *buf = '\0'; return tokb; } return NULL; } /* * Assumes that buf contains a mailbox token or similar and uses * heuristics to check for an email address. Makes sure such an email * is bracketed <>. Returns true if email appears to exist. */ bool_t bracketize_mailbox(char *buf, int buflen) { /* a group ends in ; othewise it's a mailbox */ char *p; int n; if( !strrchr(buf, ';') ) { p = strrchr(buf, '<'); if( !p || (p >= strrchr(buf, '>')) ) { n = strlen(buf); if( (n + 2) < buflen ) { memmove(buf + 1, buf, n); buf[0] = '<'; buf[n+1] = '>'; buf[n+2] = '\0'; } } return 1; } return 0; } /*********************************************************** * TESTING * ***********************************************************/ #if defined TEST_PARSER #define CHECK_EQ(x,y) if( (x) != (y) ) { \ fprintf(stdout, "%s != %s\n", #x, #y); \ return 1; \ } #define CHECK_NEQ(x,y) if( (x) == (y) ) { \ fprintf(stdout, "%s == %s\n", #x, #y); \ return 1; \ } #if defined HAVE_UNISTD_H #include #endif extern HEADER_State head; extern char *textbuf; extern charbuf_len_t textbuf_len; /* call this as: cat sample.headers.2822.good | pcheck 2822 good */ int main(int argc, char **argv) { options_t mask = 0; hline_count_t i = 0; char *pptextbuf = NULL; int extra_lines = 0; hline_t *h = NULL; #if defined(HAVE_GETPAGESIZE) system_pagesize = getpagesize(); #endif if( system_pagesize == -1 ) { system_pagesize = BUFSIZ; } init_buffers(); init_head_filter(&head); set_iobuf_mode(stdin); /* u_options |= (1< */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #if defined HAVE_UNISTD_H #include #endif #include #if defined HAVE_LANGINFO_H #include #if !defined CODESET /* on OpenBSD, CODESET doesn't seem to be defined - we use 3, which should be US-ASCII, but it's not ideal... */ #define CODESET 3 #endif #endif #include "util.h" #include "dbacl.h" #include "hypex.h" /* global variables */ extern hash_bit_count_t default_max_hash_bits; extern hash_count_t default_max_tokens; extern hash_bit_count_t default_max_grow_hash_bits; extern hash_count_t default_max_grow_tokens; hash_bit_count_t decimation; extern options_t u_options; extern options_t m_options; extern char *extn; extern token_order_t ngram_order; /* defaults to 1 */ /* for option processing */ extern char *optarg; extern int optind, opterr, optopt; extern char *textbuf; extern charbuf_len_t textbuf_len; extern char *progname; extern char *inputfile; extern long inputline; int exit_code = 0; /* default */ int overflow_warning = 0; score_t default_stepsize = 0.1; extern long system_pagesize; extern void *in_iobuf; extern void *out_iobuf; /*********************************************************** * MISCELLANEOUS FUNCTIONS * ***********************************************************/ static void usage(char **argv) { fprintf(stderr, "\n"); fprintf(stderr, "hypex CATDUMP1 CATDUMP2...\n"); fprintf(stderr, "\n"); fprintf(stderr, " computes the Chernoff information and related quantities for\n"); fprintf(stderr, " a binary hypothesis test based on the category dump files CATDUMP1, CATDUMP2.\n"); fprintf(stderr, "\n"); fprintf(stderr, "hypex -V\n"); fprintf(stderr, "\n"); fprintf(stderr, " prints program version.\n"); } /*********************************************************** * CATEGORY PAIRED HASH TABLE FUNCTIONS * ***********************************************************/ cp_item_t *find_in_category_pair(category_pair_t *cp, hash_value_t id) { register cp_item_t *i, *loop; /* start at id */ i = loop = &cp->hash[id & (cp->max_tokens - 1)]; while( FILLEDP(i) ) { if( EQUALP(i->id,id) ) { return i; /* found id */ } else { i++; /* not found */ /* wrap around */ i = (i >= &cp->hash[cp->max_tokens]) ? cp->hash : i; if( i == loop ) { return NULL; /* when hash table is full */ } } } /* empty slot, so not found */ return i; } /* returns true if the hash could be grown, false otherwise. When the hash is grown, the old values must be redistributed. */ bool_t grow_category_pair(category_pair_t *cp) { hash_count_t c, new_size; cp_item_t *i, temp_item; if( !(u_options & (1<max_hash_bits < default_max_grow_hash_bits ) { /* grow the memory around the hash */ if( (i = (cp_item_t *)realloc(cp->hash, sizeof(cp_item_t) * (1<<(cp->max_hash_bits+1)))) == NULL ) { errormsg(E_WARNING, "failed to grow hash table.\n"); return 0; } /* we need the old value of learner->max_tokens for a while yet */ cp->max_hash_bits++; /* realloc doesn't initialize the memory */ memset(&((cp_item_t *)i)[cp->max_tokens], 0, ((1<max_hash_bits) - cp->max_tokens) * sizeof(cp_item_t)); cp->hash = i; /* now mark every used slot */ for(c = 0; c < cp->max_tokens; c++) { if( FILLEDP(&cp->hash[c]) ) { SETMARK(&cp->hash[c]); } } /* now relocate each marked slot and clear it */ new_size = (1<max_hash_bits) - 1; for(c = 0; c < cp->max_tokens; c++) { while( MARKEDP(&cp->hash[c]) ) { /* find where it belongs */ i = &cp->hash[cp->hash[c].id & new_size]; while( FILLEDP(i) && !MARKEDP(i) ) { i++; i = (i > &cp->hash[new_size]) ? cp->hash : i; } /* guaranteed to exit since hash is larger than original */ /* clear the mark - this must happen after we look for i, since it should be possible to find i == learner->hash[c] */ UNSETMARK(&cp->hash[c]); /* now refile */ if( i != &cp->hash[c] ) { if( MARKEDP(i) ) { /* swap */ memcpy(&temp_item, i, sizeof(cp_item_t)); memcpy(i, &cp->hash[c], sizeof(cp_item_t)); memcpy(&cp->hash[c], &temp_item, sizeof(cp_item_t)); } else { /* copy and clear */ memcpy(i, &cp->hash[c], sizeof(cp_item_t)); memset(&cp->hash[c], 0, sizeof(cp_item_t)); } } /* now &cp->hash[c] is marked iff there was a swap */ } } cp->max_tokens = (1<max_hash_bits); } else { u_options &= ~(1<max_tokens = default_max_tokens; cp->max_hash_bits = default_max_hash_bits; cp->unique_token_count = 0; cp->hash = (cp_item_t *)malloc(cp->max_tokens * sizeof(cp_item_t)); if( !cp->hash ) { errormsg(E_FATAL, "failed to allocate %li bytes for pair hash.\n", (sizeof(cp_item_t) * ((long int)cp->max_tokens))); } } void free_category_pair(category_pair_t *cp) { if( cp->hash ) { free(cp->hash); cp->hash = NULL; } } /*********************************************************** * DIVERGENCE CALCULATIONS * ***********************************************************/ void edge_divergences(category_pair_t *cp, score_t *div_01, score_t *div_10) { cp_item_t *i, *e; double sum01 = 0.0; double sum10 = 0.0; double safetycheck0 = 1.0; double safetycheck1 = 1.0; e = cp->hash + cp->max_tokens; for(i = cp->hash; i != e; i++) { if( FILLEDP(i) ) { sum01 += (i->lam[0] - i->lam[1]) * exp(i->lam[0] + i->ref - cp->cat[0].logZ); sum10 += (i->lam[1] - i->lam[0]) * exp(i->lam[1] + i->ref - cp->cat[1].logZ); safetycheck0 += (exp(i->lam[0]) - 1.0) * exp(i->ref); safetycheck1 += (exp(i->lam[1]) - 1.0) * exp(i->ref); } } *div_01 = cp->cat[1].logZ - cp->cat[0].logZ + sum01; *div_10 = cp->cat[0].logZ - cp->cat[1].logZ + sum10; if( u_options & (1<cat[0].logZ, log(safetycheck1) - cp->cat[1].logZ); } fprintf(stdout, "# D(P0|P1) = %f\tD(P1|P0) = %f\n", nats2bits(*div_01), nats2bits(*div_10)); } void calculate_divergences(category_pair_t *cp, score_t beta, score_t div_Qbeta_P[2], score_t *logZbeta, score_t *Psibeta) { double logQbetainc; double Zbeta = 1.0; double sum0 = 0.0; double sum1 = 0.0; double sum2 = 0.0; cp_item_t *i, *e; e = cp->hash + cp->max_tokens; for(i = cp->hash; i != e; i++) { if( FILLEDP(i) ) { logQbetainc = beta * i->lam[0] + (1.0 - beta) * i->lam[1]; Zbeta += (exp(logQbetainc) - 1.0) * exp(i->ref); sum0 += (logQbetainc - i->lam[0]) * exp(logQbetainc + i->ref); sum1 += (logQbetainc - i->lam[1]) * exp(logQbetainc + i->ref); sum2 += (i->lam[1] - i->lam[0]) * exp(logQbetainc + i->ref); } } *logZbeta = log(Zbeta); div_Qbeta_P[0] = sum0/Zbeta + cp->cat[0].logZ - (*logZbeta); div_Qbeta_P[1] = sum1/Zbeta + cp->cat[1].logZ - (*logZbeta); *Psibeta = sum2/Zbeta + cp->cat[0].logZ - cp->cat[1].logZ; /* the divergences can be calculated two slightly different ways, either by directly using the definition as above, or by using the expression containing Psibeta. We do both and average, which might hopefully make the result more accurate. */ div_Qbeta_P[0] = (div_Qbeta_P[0] + cp->cat[0].logZ - (*logZbeta) + (1.0 - beta) * (*Psibeta))/2.0; div_Qbeta_P[1] = (div_Qbeta_P[1] + cp->cat[1].logZ - (*logZbeta) - beta * (*Psibeta))/2.0; fprintf(stdout, "%f %f %f %f %f %f\n", beta, nats2bits(*logZbeta), nats2bits(*Psibeta), nats2bits(div_Qbeta_P[0]), nats2bits(div_Qbeta_P[1]), nats2bits(div_Qbeta_P[1] - div_Qbeta_P[0])); } /*********************************************************** * FILE MANAGEMENT FUNCTIONS * ***********************************************************/ bool_t load_category_dump(const char *filename, category_pair_t *cp, int c) { FILE *input; char buf[MAGIC_BUFSIZE]; int extra_lines = 0; bool_t ok = (bool_t)1; long unsigned int id; weight_t lam, dig_ref; int count; cp_item_t *i; hash_count_t linecount; if( (c != 0) && (c != 1) ) { errormsg(E_WARNING, "too many categories.\n"); return 0; } inputline = 0; inputfile = (char *)filename; input = fopen(filename, "rb"); if( input ) { set_iobuf_mode(input); cp->cat[c].fullfilename = strdup(filename); ok = load_category_header(input, &(cp->cat[c])); if( ok ) { if( !fgets(buf, MAGIC_BUFSIZE, input) || strncmp(buf, MAGIC_DUMP, strlen(MAGIC_DUMP)) != 0 ) { errormsg(E_ERROR, "%s is not a dbacl model dump! (see dbacl(1) -d switch)\n", filename); ok = (bool_t)0; } else if( (cp->cat[c].max_order != 1) ) { /* we don't support complicated models, only uniform reference measures and unigram features */ errormsg(E_ERROR, "the category %s is not supported (model too complex)\n", cp->cat[c].filename); ok = (bool_t)0; } else { linecount = 0; while( ok && fill_textbuf(input, &extra_lines) ) { inputline++; /* we don't parse the full line, only the numbers */ if( sscanf(textbuf, MAGIC_DUMPTBL_i, &lam, &dig_ref, &count, &id) == 4 ) { linecount++; i = find_in_category_pair(cp, id); if( i && !FILLEDP(i) && ((100 * cp->unique_token_count) >= (HASH_FULL * cp->max_tokens)) && grow_category_pair(cp) ) { i = find_in_category_pair(cp,id); /* new i, go through all tests again */ } if( i ) { /* we cannot allow collisions, so we simply drop the weight if the slot is full */ switch(c) { case 0: if( !FILLEDP(i) ) { SET(i->id,id); i->lam[c] = lam; i->ref = dig_ref; i->typ.cls |= 0x01; if( cp->unique_token_count < K_TOKEN_COUNT_MAX ) { cp->unique_token_count++; } else { overflow_warning = 1; } } break; case 1: if( FILLEDP(i) ) { if( fabs(dig_ref - i->ref) > 0.00001 ) { errormsg(E_WARNING, "unequal reference measures! New token ignored (id=%lx).\n", id); } else { i->lam[c] = lam; i->typ.cls++; } } else { SET(i->id,id); i->lam[c] = lam; i->ref = dig_ref; i->typ.cls |= 0x02; if( cp->unique_token_count < K_TOKEN_COUNT_MAX ) { cp->unique_token_count++; } else { overflow_warning = 1; } } default: break; } } else { errormsg(E_ERROR, "ran out of hashes.\n"); ok = (bool_t)0; } } else if( *textbuf ) { errormsg(E_ERROR, "unable to parse line %ld of %s\n", inputline, cp->cat[c].fullfilename); ok = (bool_t)0; } } if( ok && (linecount != cp->cat[c].model_unique_token_count) ) { errormsg(E_ERROR, "incorrect number of features, expectig %ld, got %ld\n", (long int)cp->cat[c].model_unique_token_count, inputline); ok = (bool_t)0; } } } fclose(input); } else { errormsg(E_ERROR, "couldn't open %s\n", filename); } return ok; } bool_t process_dump_pair(const char *d1, const char *d2, category_pair_t *cp) { score_t div01, div10; score_t beta; score_t div_Qbeta_P[2] = {0.0, 0.0}; score_t logZbeta; score_t Psibeta; score_t chernoff_rate = 0.0; score_t chernoff_beta = 0.0; if( u_options & (1< MAX_HASH_BITS ) { errormsg(E_WARNING, "maximum hash size will be 2^%d\n", MAX_HASH_BITS); default_max_hash_bits = MAX_HASH_BITS; } default_max_tokens = (1< MAX_HASH_BITS ) { errormsg(E_WARNING, "maximum hash size will be 2^%d\n", MAX_HASH_BITS); default_max_grow_hash_bits = MAX_HASH_BITS; } default_max_grow_tokens = (1<= 1.0) ) { errormsg(E_WARNING, "stepsize must be between 0.0 and 1.0, using 0.1\n"); default_stepsize = 0.1; } c++; break; case 'v': u_options |= (1< -1 ) { set_option(op, optarg); } /* end option processing */ sanitize_options(); init_buffers(); /* now process each pair of files on the command line */ if( (optind > -1) && *(argv + optind) ) { for(i = optind; i < argc; i++) { for(j = i + 1; j < argc; j++) { process_dump_pair(argv[i], argv[j], &cp); } } } else { errormsg(E_ERROR, "missing model dumps! Use dbacl(1) with -d switch\n"); usage(argv); exit(0); } free_category_pair(&cp); cleanup_buffers(); return exit_code; } dbacl-1.14.1/src/hypex.h000066400000000000000000000021741325773323600147570ustar00rootroot00000000000000/* * Copyright (C) 2005 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifndef HYPEX_H #define HYPEX_H typedef struct { hash_value_t id; weight_t lam[2]; weight_t ref; token_type_t typ; } PACK_STRUCTS cp_item_t; typedef struct { category_t cat[2]; hash_bit_count_t max_hash_bits; hash_count_t max_tokens; token_count_t unique_token_count; cp_item_t *hash; } category_pair_t; #endif dbacl-1.14.1/src/icheck.c000066400000000000000000000066321325773323600150460ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "util.h" #include "dbacl.h" /* make sure this is last */ extern options_t u_options; extern options_t m_options; extern digtype_t m_dt; extern category_t cat[MAX_CAT]; extern category_count_t cat_count; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern empirical_t empirical; extern int cmd; char *progname = "icheck"; char *inputfile = ""; long inputline = 0; extern long system_pagesize; extern void *in_iobuf; extern void *out_iobuf; void dump(category_t *mycat) { c_item_t *i, *e; if( u_options & (1<hash + mycat->max_tokens; for(i = mycat->hash; i != e; i++) { if( FILLEDP(i) ) { fprintf(stdout, "%9.3f %8lx\n", UNPACK_LAMBDA(NTOH_LAMBDA(i->lam)), (long unsigned int)NTOH_ID(i->id)); } } } } void integrity_check2(category_t *mycat) { int i,j; float five; if( m_dt == DT_UNIFORM ) { five = UNPACK_DIGRAMS(PACK_DIGRAMS(-log(ASIZE - AMIN))); for(i = AMIN; i < ASIZE; i++) { for(j = AMIN; j < ASIZE; j++) { if( fabs(five - UNPACK_DIGRAMS(cat->dig[i][j])) > 0.01 ) { errormsg(E_ERROR, "Laplace digram failure (dig[%d][%d]=%f)", i, j, UNPACK_DIGRAMS(cat->dig[i][j])); exit(1); } } } } } void integrity_check1(category_t *mycat) { hash_count_t c; hash_count_t n = 0; for(c = 0; c < mycat->max_tokens; c++) { if( FILLEDP(&(mycat->hash[c])) ) { if( UNPACK_LWEIGHTS(mycat->hash[c].lam) < 0.0 ) { errormsg(E_ERROR, "negative lambda weight c = %ld, %s\n", (long int)c, mycat->fullfilename); exit(1); } n++; } } if( n != mycat->model_unique_token_count ) { errormsg(E_ERROR, "wrong number of filled slots %s\n", mycat->fullfilename); exit(1); } } /* This code intended for integrity checks returns 0 on success, and 1 * on failure. */ int main(int argc, char **argv) { int i; if( argc < 2) { exit(1); } for(i = 1; i < argc; i++) { if( argv[i] ) { if( argv[i][0] == '-' ) { switch(argv[i][1]) { case 'd': u_options |= (1< big ) { pkm2 *= biginv; pkm1 *= biginv; qkm2 *= biginv; qkm1 *= biginv; } } while( t > MACHEP ); return( ans * ax ); } /* left tail of incomplete gamma function: * * inf. k * a -x - x * x e > ---------- * - - * k=0 | (a+k+1) * */ double igam( a, x ) double a, x; { double ans, ax, c, r; if( (x <= 0) || ( a <= 0) ) return( 0.0 ); if( (x > 1.0) && (x > a ) ) return( 1.0 - igamc(a,x) ); /* Compute x**a * exp(-x) / gamma(a) */ ax = a * log(x) - x - lgam(a); if( ax < -MAXLOG ) { mtherr( "igam", UNDERFLOW ); return( 0.0 ); } ax = exp(ax); /* power series */ r = a; c = 1.0; ans = 1.0; do { r += 1.0; c *= x/r; ans += c; } while( c/ans > MACHEP ); return( ans * ax/a ); } dbacl-1.14.1/src/isnan.c000066400000000000000000000075031325773323600147260ustar00rootroot00000000000000/* isnan() * signbit() * isfinite() * * Floating point numeric utilities * * * * SYNOPSIS: * * double ceil(), floor(), frexp(), ldexp(); * int signbit(), isnan(), isfinite(); * double x, y; * int expnt, n; * * y = floor(x); * y = ceil(x); * y = frexp( x, &expnt ); * y = ldexp( x, n ); * n = signbit(x); * n = isnan(x); * n = isfinite(x); * * * * DESCRIPTION: * * All four routines return a double precision floating point * result. * * floor() returns the largest integer less than or equal to x. * It truncates toward minus infinity. * * ceil() returns the smallest integer greater than or equal * to x. It truncates toward plus infinity. * * frexp() extracts the exponent from x. It returns an integer * power of two to expnt and the significand between 0.5 and 1 * to y. Thus x = y * 2**expn. * * ldexp() multiplies x by 2**n. * * signbit(x) returns 1 if the sign bit of x is 1, else 0. * * These functions are part of the standard C run time library * for many but not all C compilers. The ones supplied are * written in C for either DEC or IEEE arithmetic. They should * be used only if your compiler library does not already have * them. * * The IEEE versions assume that denormal numbers are implemented * in the arithmetic. Some modifications will be required if * the arithmetic has abrupt rather than gradual underflow. */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #ifdef UNK /* ceil(), floor(), frexp(), ldexp() may need to be rewritten. */ #undef UNK #if BIGENDIAN #define MIEEE 1 #else #define IBMPC 1 #endif #endif /* Return 1 if the sign bit of x is 1, else 0. */ int signbit(x) double x; { union { double d; short s[4]; int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC return( u.i[1] < 0 ); #endif #ifdef DEC return( u.s[3] < 0 ); #endif #ifdef MIEEE return( u.i[0] < 0 ); #endif } else { #ifdef IBMPC return( u.s[3] < 0 ); #endif #ifdef DEC return( u.s[3] < 0 ); #endif #ifdef MIEEE return( u.s[0] < 0 ); #endif } } /* Return 1 if x is a number that is Not a Number, else return 0. */ int isnan(x) double x; { #ifdef NANS union { double d; unsigned short s[4]; unsigned int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC if( ((u.i[1] & 0x7ff00000) == 0x7ff00000) && (((u.i[1] & 0x000fffff) != 0) || (u.i[0] != 0))) return 1; #endif #ifdef DEC if( (u.s[1] & 0x7fff) == 0) { if( (u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef MIEEE if( ((u.i[0] & 0x7ff00000) == 0x7ff00000) && (((u.i[0] & 0x000fffff) != 0) || (u.i[1] != 0))) return 1; #endif return(0); } else { /* size int not 4 */ #ifdef IBMPC if( (u.s[3] & 0x7ff0) == 0x7ff0) { if( ((u.s[3] & 0x000f) | u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef DEC if( (u.s[3] & 0x7fff) == 0) { if( (u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef MIEEE if( (u.s[0] & 0x7ff0) == 0x7ff0) { if( ((u.s[0] & 0x000f) | u.s[1] | u.s[2] | u.s[3]) != 0 ) return(1); } #endif return(0); } /* size int not 4 */ #else /* No NANS. */ return(0); #endif } /* Return 1 if x is not infinite and is not a NaN. */ int isfinite(x) double x; { #ifdef INFINITIES union { double d; unsigned short s[4]; unsigned int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC if( (u.i[1] & 0x7ff00000) != 0x7ff00000) return 1; #endif #ifdef DEC if( (u.s[3] & 0x7fff) != 0) return 1; #endif #ifdef MIEEE if( (u.i[0] & 0x7ff00000) != 0x7ff00000) return 1; #endif return(0); } else { #ifdef IBMPC if( (u.s[3] & 0x7ff0) != 0x7ff0) return 1; #endif #ifdef DEC if( (u.s[3] & 0x7fff) != 0) return 1; #endif #ifdef MIEEE if( (u.s[0] & 0x7ff0) != 0x7ff0) return 1; #endif return(0); } #else /* No INFINITY. */ return(1); #endif } dbacl-1.14.1/src/jenkins.c000066400000000000000000000104041325773323600152510ustar00rootroot00000000000000/* -------------------------------------------------------------------- lookup2.c, by Bob Jenkins, December 1996, Public Domain. hash(), hash2(), hash3, and mix() are externally useful functions. Routines to test the hash are included if SELF_TEST is defined. You can use this free for any purpose. It has no warranty. -------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dbacl.h" #if defined JENKINS4 typedef unsigned long int ub4; /* unsigned 4-byte quantities */ typedef unsigned char ub1; /* unsigned 1-byte quantities */ #define hashsize(n) ((ub4)1<<(n)) #define hashmask(n) (hashsize(n)-1) /* mix -- mix 3 32-bit values reversibly. For every delta with one or two bits set, and the deltas of all three high bits or all three low bits, whether the original value of a,b,c is almost all zero or is uniformly distributed, * If mix() is run forward or backward, at least 32 bits in a,b,c have at least 1/4 probability of changing. * If mix() is run forward, every bit of c will change between 1/3 and 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) mix() takes 36 machine instructions, but only 18 cycles on a superscalar machine (like a Pentium or a Sparc). No faster mixer seems to work, that's the result of my brute-force search. There were about 2^68 hashes to choose from. I only tested about a billion of those. */ #define mix(a,b,c) \ { \ a -= b; a -= c; a ^= (c>>13); \ b -= c; b -= a; b ^= (a<<8); \ c -= a; c -= b; c ^= (b>>13); \ a -= b; a -= c; a ^= (c>>12); \ b -= c; b -= a; b ^= (a<<16); \ c -= a; c -= b; c ^= (b>>5); \ a -= b; a -= c; a ^= (c>>3); \ b -= c; b -= a; b ^= (a<<10); \ c -= a; c -= b; c ^= (b>>15); \ } /* hash() -- hash a variable-length key into a 32-bit value k : the key (the unaligned variable-length array of bytes) len : the length of the key, counting by bytes initval : can be any 4-byte value Returns a 32-bit value. Every bit of the key affects every bit of the return value. Every 1-bit and 2-bit delta achieves avalanche. About 6*len+35 instructions. The best hash table sizes are powers of 2. There is no need to do mod a prime (mod is sooo slow!). If you need less than 32 bits, use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. If you are hashing n strings (ub1 **)k, do it like this: for (i=0, h=0; i= 12) { a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24)); b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24)); c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24)); mix(a,b,c); k += 12; len -= 12; } /*------------------------------------- handle the last 11 bytes */ c += length; switch(len) /* all the case statements fall through */ { case 11: c+=((ub4)k[10]<<24); case 10: c+=((ub4)k[9]<<16); case 9 : c+=((ub4)k[8]<<8); /* the first byte of c is reserved for the length */ case 8 : b+=((ub4)k[7]<<24); case 7 : b+=((ub4)k[6]<<16); case 6 : b+=((ub4)k[5]<<8); case 5 : b+=k[4]; case 4 : a+=((ub4)k[3]<<24); case 3 : a+=((ub4)k[2]<<16); case 2 : a+=((ub4)k[1]<<8); case 1 : a+=k[0]; /* case 0: nothing left to add */ } mix(a,b,c); /*-------------------------------------------- report the result */ return c; } #endif dbacl-1.14.1/src/jenkins2.c000066400000000000000000000230701325773323600153360ustar00rootroot00000000000000/* -------------------------------------------------------------------- lookup8.c, by Bob Jenkins, January 4 1997, Public Domain. hash(), hash2(), hash3, and mix() are externally useful functions. Routines to test the hash are included if SELF_TEST is defined. You can use this free for any purpose. It has no warranty. -------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dbacl.h" #if defined JENKINS8 /* #include */ /* #include */ /* #include */ typedef unsigned long long ub8; /* unsigned 8-byte quantities */ typedef unsigned long int ub4; /* unsigned 4-byte quantities */ typedef unsigned char ub1; #define hashsize(n) ((ub8)1<<(n)) #define hashmask(n) (hashsize(n)-1) /* -------------------------------------------------------------------- mix -- mix 3 64-bit values reversibly. mix() takes 48 machine instructions, but only 24 cycles on a superscalar machine (like Intel's new MMX architecture). It requires 4 64-bit registers for 4::2 parallelism. All 1-bit deltas, all 2-bit deltas, all deltas composed of top bits of (a,b,c), and all deltas of bottom bits were tested. All deltas were tested both on random keys and on keys that were nearly all zero. These deltas all cause every bit of c to change between 1/3 and 2/3 of the time (well, only 113/400 to 287/400 of the time for some 2-bit delta). These deltas all cause at least 80 bits to change among (a,b,c) when the mix is run either forward or backward (yes it is reversible). This implies that a hash using mix64 has no funnels. There may be characteristics with 3-bit deltas or bigger, I didn't test for those. -------------------------------------------------------------------- */ #define mix64(a,b,c) \ { \ a -= b; a -= c; a ^= (c>>43); \ b -= c; b -= a; b ^= (a<<9); \ c -= a; c -= b; c ^= (b>>8); \ a -= b; a -= c; a ^= (c>>38); \ b -= c; b -= a; b ^= (a<<23); \ c -= a; c -= b; c ^= (b>>5); \ a -= b; a -= c; a ^= (c>>35); \ b -= c; b -= a; b ^= (a<<49); \ c -= a; c -= b; c ^= (b>>11); \ a -= b; a -= c; a ^= (c>>12); \ b -= c; b -= a; b ^= (a<<18); \ c -= a; c -= b; c ^= (b>>22); \ } /* -------------------------------------------------------------------- hash() -- hash a variable-length key into a 64-bit value k : the key (the unaligned variable-length array of bytes) len : the length of the key, counting by bytes level : can be any 8-byte value Returns a 64-bit value. Every bit of the key affects every bit of the return value. No funnels. Every 1-bit and 2-bit delta achieves avalanche. About 41+5len instructions. The best hash table sizes are powers of 2. There is no need to do mod a prime (mod is sooo slow!). If you need less than 64 bits, use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. If you are hashing n strings (ub1 **)k, do it like this: for (i=0, h=0; i= 24) { a += (k[0] +((ub8)k[ 1]<< 8)+((ub8)k[ 2]<<16)+((ub8)k[ 3]<<24) +((ub8)k[4 ]<<32)+((ub8)k[ 5]<<40)+((ub8)k[ 6]<<48)+((ub8)k[ 7]<<56)); b += (k[8] +((ub8)k[ 9]<< 8)+((ub8)k[10]<<16)+((ub8)k[11]<<24) +((ub8)k[12]<<32)+((ub8)k[13]<<40)+((ub8)k[14]<<48)+((ub8)k[15]<<56)); c += (k[16] +((ub8)k[17]<< 8)+((ub8)k[18]<<16)+((ub8)k[19]<<24) +((ub8)k[20]<<32)+((ub8)k[21]<<40)+((ub8)k[22]<<48)+((ub8)k[23]<<56)); mix64(a,b,c); k += 24; len -= 24; } /*------------------------------------- handle the last 23 bytes */ c += length; switch(len) /* all the case statements fall through */ { case 23: c+=((ub8)k[22]<<56); case 22: c+=((ub8)k[21]<<48); case 21: c+=((ub8)k[20]<<40); case 20: c+=((ub8)k[19]<<32); case 19: c+=((ub8)k[18]<<24); case 18: c+=((ub8)k[17]<<16); case 17: c+=((ub8)k[16]<<8); /* the first byte of c is reserved for the length */ case 16: b+=((ub8)k[15]<<56); case 15: b+=((ub8)k[14]<<48); case 14: b+=((ub8)k[13]<<40); case 13: b+=((ub8)k[12]<<32); case 12: b+=((ub8)k[11]<<24); case 11: b+=((ub8)k[10]<<16); case 10: b+=((ub8)k[ 9]<<8); case 9: b+=((ub8)k[ 8]); case 8: a+=((ub8)k[ 7]<<56); case 7: a+=((ub8)k[ 6]<<48); case 6: a+=((ub8)k[ 5]<<40); case 5: a+=((ub8)k[ 4]<<32); case 4: a+=((ub8)k[ 3]<<24); case 3: a+=((ub8)k[ 2]<<16); case 2: a+=((ub8)k[ 1]<<8); case 1: a+=((ub8)k[ 0]); /* case 0: nothing left to add */ } mix64(a,b,c); /*-------------------------------------------- report the result */ return c; } /* -------------------------------------------------------------------- This works on all machines, is identical to hash() on little-endian machines, and it is much faster than hash(), but it requires -- that the key be an array of ub8's, and -- that all your machines have the same endianness, and -- that the length be the number of ub8's in the key -------------------------------------------------------------------- */ ub8 hash2( k, length, level) register ub8 *k; /* the key */ register ub8 length; /* the length of the key */ register ub8 level; /* the previous hash, or an arbitrary value */ { register ub8 a,b,c,len; /* Set up the internal state */ len = length; a = b = level; /* the previous hash value */ c = 0x9e3779b97f4a7c13LL; /* the golden ratio; an arbitrary value */ /*---------------------------------------- handle most of the key */ while (len >= 3) { a += k[0]; b += k[1]; c += k[2]; mix64(a,b,c); k += 3; len -= 3; } /*-------------------------------------- handle the last 2 ub8's */ c += length; switch(len) /* all the case statements fall through */ { /* c is reserved for the length */ case 2: b+=k[1]; case 1: a+=k[0]; /* case 0: nothing left to add */ } mix64(a,b,c); /*-------------------------------------------- report the result */ return c; } /* -------------------------------------------------------------------- This is identical to hash() on little-endian machines, and it is much faster than hash(), but a little slower than hash2(), and it requires -- that all your machines be little-endian, for example all Intel x86 chips or all VAXen. It gives wrong results on big-endian machines. -------------------------------------------------------------------- */ ub8 hash3( k, length, level) register ub1 *k; /* the key */ register ub8 length; /* the length of the key */ register ub8 level; /* the previous hash, or an arbitrary value */ { register ub8 a,b,c,d,len; /* Set up the internal state */ len = length; a = b = level; /* the previous hash value */ c = 0x9e3779b97f4a7c13LL; /* the golden ratio; an arbitrary value */ /*---------------------------------------- handle most of the key */ if (((size_t)k)&7) { while (len >= 24) { a += (k[0] +((ub8)k[ 1]<< 8)+((ub8)k[ 2]<<16)+((ub8)k[ 3]<<24) +((ub8)k[4 ]<<32)+((ub8)k[ 5]<<40)+((ub8)k[ 6]<<48)+((ub8)k[ 7]<<56)); b += (k[8] +((ub8)k[ 9]<< 8)+((ub8)k[10]<<16)+((ub8)k[11]<<24) +((ub8)k[12]<<32)+((ub8)k[13]<<40)+((ub8)k[14]<<48)+((ub8)k[15]<<56)); c += (k[16] +((ub8)k[17]<< 8)+((ub8)k[18]<<16)+((ub8)k[19]<<24) +((ub8)k[20]<<32)+((ub8)k[21]<<40)+((ub8)k[22]<<48)+((ub8)k[23]<<56)); mix64(a,b,c); k += 24; len -= 24; } } else { while (len >= 24) /* aligned */ { a += *(ub8 *)(k+0); b += *(ub8 *)(k+8); c += *(ub8 *)(k+16); mix64(a,b,c); k += 24; len -= 24; } } /*------------------------------------- handle the last 23 bytes */ c += length; switch(len) /* all the case statements fall through */ { case 23: c+=((ub8)k[22]<<56); case 22: c+=((ub8)k[21]<<48); case 21: c+=((ub8)k[20]<<40); case 20: c+=((ub8)k[19]<<32); case 19: c+=((ub8)k[18]<<24); case 18: c+=((ub8)k[17]<<16); case 17: c+=((ub8)k[16]<<8); /* the first byte of c is reserved for the length */ case 16: b+=((ub8)k[15]<<56); case 15: b+=((ub8)k[14]<<48); case 14: b+=((ub8)k[13]<<40); case 13: b+=((ub8)k[12]<<32); case 12: b+=((ub8)k[11]<<24); case 11: b+=((ub8)k[10]<<16); case 10: b+=((ub8)k[ 9]<<8); case 9: b+=((ub8)k[ 8]); case 8: a+=((ub8)k[ 7]<<56); case 7: a+=((ub8)k[ 6]<<48); case 6: a+=((ub8)k[ 5]<<40); case 5: a+=((ub8)k[ 4]<<32); case 4: a+=((ub8)k[ 3]<<24); case 3: a+=((ub8)k[ 2]<<16); case 2: a+=((ub8)k[ 1]<<8); case 1: a+=((ub8)k[ 0]); /* case 0: nothing left to add */ } mix64(a,b,c); /*-------------------------------------------- report the result */ return c; } #endif dbacl-1.14.1/src/lint-check.sh000066400000000000000000000041241325773323600160230ustar00rootroot00000000000000#!/bin/bash # This isn't an ordinary regression test, but instead it runs splint # on the source files in the src directory. If the user doesn't have # splint, we do nothing and pretend success. # splint is very fussy, and prints many spurious errors, which cannot # all be fixed by editing the dbacl source code. In particular, # nonstandard header files cause a problem, as do compiler # idiosyncracies. So it is not a good idea to run the lint check as # part of the regular regression tests, since it would make dbacl # uncompilable on some systems. # There are other issues such as the fact that dbacl uses realloc and # splint can't deal with this properly. But overall, it's worth using # it. PATH=/bin:/usr/bin SRCDIR=. prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 splint # This part is messy. Some source files need special preprocessor symbols, # so I've chosen to run a separate splint command on each source file. # Ideally, this would be generated automatically by analysing the automake # file, but I have no idea how to do it. Note that splint should only # check the dbacl files, not the public domain files included from elsewhere. splint -f $SRCDIR/splintrc $SRCDIR/dbacl.c \ && splint -f $SRCDIR/splintrc $SRCDIR/bayesol.c \ && splint -f $SRCDIR/splintrc $SRCDIR/catfun.c \ && splint -f $SRCDIR/splintrc $SRCDIR/const.c \ && splint -f $SRCDIR/splintrc $SRCDIR/dbacl.c \ && splint -f $SRCDIR/splintrc $SRCDIR/fh.c \ && splint -f $SRCDIR/splintrc $SRCDIR/fram.c \ && splint -f $SRCDIR/splintrc $SRCDIR/hmine.c \ && splint -f $SRCDIR/splintrc $SRCDIR/hparse.c \ && splint -f $SRCDIR/splintrc $SRCDIR/hypex.c \ && splint -f $SRCDIR/splintrc $SRCDIR/mailinspect.c \ && splint -f $SRCDIR/splintrc -DMBW_WIDE $SRCDIR/mbw.c \ && splint -f $SRCDIR/splintrc -DMBW_MB $SRCDIR/mbw.c \ && splint -f $SRCDIR/splintrc $SRCDIR/probs.c \ && splint -f $SRCDIR/splintrc $SRCDIR/rfc2822.c \ && splint -f $SRCDIR/splintrc $SRCDIR/rfc822.c \ && splint -f $SRCDIR/splintrc $SRCDIR/util.c dbacl-1.14.1/src/mailcross.in000077500000000000000000000164461325773323600160070ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Author: Laird Breyer # PROGNAME="$0" PROGNAME2=`basename $0` VERSION="$PROGNAME version @VERSION@\nCross validation simulator" MXDIR="$PWD/mailcross.d" ALOG="$MXDIR/log/activity.log" CLOG="$MXDIR/log/crossval.log" BLOG="$MXDIR/log/biplot.log" SLOG="$MXDIR/log/summary.log" TEMPDIR="$MXDIR/tmp" BOOTSTRAP="@PKGDATADIR@/testsuite" FILTERS="$MXDIR/filters" # use this for debugging # set -x usage() { echo " Usage: $PROGNAME2 prepare size $PROGNAME2 add category [MBOX]... $PROGNAME2 learn $PROGNAME2 run $PROGNAME2 summarize [LEVEL] $PROGNAME2 review TRUECAT PREDCAT $PROGNAME2 biplot CAT1 CAT2 $PROGNAME2 clean $PROGNAME2 killall $PROGNAME2 testsuite select [FILTER]... $PROGNAME2 testsuite deselect [FILTER]... $PROGNAME2 testsuite list $PROGNAME2 testsuite status $PROGNAME2 testsuite run $PROGNAME2 testsuite summarize " exit 1 } # begin mailtest.functions # end mailtest.functions # check this for environment variable overrrides [ -e $HOME/.mailcrossrc ] && . $HOME/.mailcrossrc # this is the default filter if [ -z "$MAILCROSS_FILTER" ]; then MAILCROSS_FILTER="dbacl -v -m -T email" fi # this is the default scorer if [ -z "$MAILCROSS_SCORER" ]; then MAILCROSS_SCORER="dbacl -T email -m -v -X" fi # this is the default learner if [ -z "$MAILCROSS_LEARNER" ]; then MAILCROSS_LEARNER="dbacl -H 19 -T email -l" MAILCROSS_CPREFIX="-c" # needed by dbacl fi export TEMPDIR # main switch statement - this processes commands case $1 in '-V') echo $VERSION ;; clean) # delete working tree clean_working_tree ;; killall) prerequisite_command "killall" "killall" killall -9 -g mailcross ;; prepare) # create directory tree shift prepare_working_tree "$@" ;; add) shift CATNAME="$1" if [ -z "$CATNAME" ]; then echo "error: missing category name." usage fi prerequisite_command "formail" "mailutils" get_number_of_subsets echo "=== $PROGNAME $*" >> $ALOG shift # either add files on command line or from stdin if [ -n "$*" ]; then cat "$@" | formail -s /bin/bash -c \ "cat >> $MXDIR/\$((\$RANDOM % $NUM))/$CATNAME.mbox" else formail -s /bin/bash -c \ "cat >> $MXDIR/\$((\$RANDOM % $NUM))/$CATNAME.mbox" fi ;; learn) shift get_number_of_subsets NUM=`expr $NUM - 1` # we count from zero to NUM-1 get_categories prerequisite_command "seq" "shellutils" echo "=== $PROGNAME learn $*" >> $ALOG for n in $CATS; do echo "Learning `basename $n .mbox`" >> $ALOG for i in `seq 0 $NUM`; do echo "| $MAILCROSS_LEARNER $MXDIR/$i/`basename $n .mbox` $*" >> $ALOG for j in `seq 0 $NUM`; do if [ "$i" != "$j" ]; then echo " cat $MXDIR/$j/$n |" >> $ALOG cat "$MXDIR/$j/$n" fi done | $MAILCROSS_LEARNER "$MXDIR/$i/`basename $n .mbox`" "$@" done done ;; run) shift get_number_of_subsets NUM=`expr $NUM - 1` # we count from zero to NUM-1 get_categories STUFF="$MXDIR/log/run.stuff" prerequisite_command "formail" "mailutils" prerequisite_command "sed" "sed" prerequisite_command "seq" "shellutils" echo "=== $PROGNAME run $*" >> $ALOG echo "# location | true | predicted | from" > $CLOG for i in `seq 0 $NUM`; do ARGS=`for n in $CATS; do echo -n "$MAILCROSS_CPREFIX $MXDIR/$i/\`basename $n .mbox\` "; done` COMMAND="$MAILCROSS_FILTER $ARGS" echo "| $COMMAND" >> $ALOG for m in $CATS; do cat $MXDIR/$i/$m | formail -s /bin/bash -c \ "sed -e 'h' -e '/^From /s/^From//w $STUFF' -e 'x' | $COMMAND | xargs echo -ne '$i `basename $m .mbox`' && cat $STUFF" >> $CLOG echo " cat $MXDIR/$i/$m |" >> $ALOG done done ;; summarize) shift get_number_of_subsets # includes check that directory tree is present get_categories prerequisite_command "awk" "awk or equivalent" echo "=== $PROGNAME summarize $*" >> $ALOG if [ -s $CLOG ]; then cat $CLOG | summarize_log else echo "Error: No results found. You must run the cross validation first." usage fi ;; review) shift prerequisite_command "formail" "mailutils" prerequisite_command "grep" "grep" if [ -z "$1" -o -z "$2" ]; then echo "Error: Missing category, e.g. $PROGNAME review notspam spam" else review_misclassified "$MXDIR/tmp/save_msg.sh" "$1" "$2" fi ;; biplot) shift get_number_of_subsets NUM=`expr $NUM - 1` # we count from zero to NUM-1 if [ -z "$1" -o -z "$2" ]; then echo "Error: Needs two categories, e.g. $PROGNAME biplot spam notspam" usage else CAT1=$1 CAT2=$2 CATS="$1 $2" prerequisite_command "formail" "mailutils" prerequisite_command "sed" "sed" prerequisite_command "seq" "shellutils" echo "=== $PROGNAME biplot $*" >> $ALOG echo "# location | true | cat1 ... | cat2 ..." > $BLOG for i in `seq 0 $NUM`; do ARGS=`for n in $CATS; do echo -n "$MAILCROSS_CPREFIX $MXDIR/$i/$n "; done` COMMAND="$MAILCROSS_SCORER $ARGS" echo "| $COMMAND" >> $ALOG for m in $CATS; do cat $MXDIR/$i/$m.mbox | formail -s /bin/bash -c \ "$COMMAND | xargs echo -ne '$i $m' && echo" >> $BLOG echo " cat $MXDIR/$i/$m |" >> $ALOG done echo >> $BLOG done plot_biplot "$CAT1-$CAT2" $BLOG fi ;; testsuite) shift case $1 in list) testsuite_list_wrappers ;; deselect) testsuite_deselect_wrappers "$@" ;; select) testsuite_select_wrappers "$@" ;; status) echo -e "The following categories are ready to be cross validated:\n" get_categories for c in $CATS; do echo -n "$c - counting... " NUM=`grep '^From ' $MXDIR/*/$c | wc -l` echo "$NUM messages" done echo -e "\nThe following classifiers are ready to be cross validated:\n" get_filters for f in $FILTS; do echo "$f - `$FILTERS/$f describe`" done ;; run) get_filters for f in $FILTS; do echo -ne "Now testing: " "$FILTERS/$f" describe echo "Cleanup." "$FILTERS/$f" clean "$MXDIR" export MAILCROSS_FILTER="$FILTERS/$f filter" export MAILCROSS_LEARNER="$FILTERS/$f learn" echo "Learning." time "$PROGNAME" learn echo "Running." time "$PROGNAME" run echo "Writing results." echo -e "\n---------------" >> "$SLOG" "$FILTERS/$f" describe >> "$SLOG" date >> "$CLOG" echo "---------------" >> "$SLOG" "$PROGNAME" summarize >> "$SLOG" done ;; summarize) if [ -s "$SLOG" ]; then cat "$SLOG" else echo "Error: No results found. You must run the testsuite first." fi ;; *) usage ;; esac ;; *) usage ;; esac exit 0dbacl-1.14.1/src/mailfoot.in000066400000000000000000000167571325773323600156270ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Author: Laird Breyer # PROGNAME="$0" PROGNAME2=`basename $0` VERSION="$PROGNAME version @VERSION@\nFull Online Ordered Training simulator" MXDIR="$PWD/mailfoot.d" ALOG="$MXDIR/log/activity.log" CLOG="$MXDIR/log/foot.log" SLOG="$MXDIR/log/summary.log" TEMPDIR="$MXDIR/tmp" BOOTSTRAP="@PKGDATADIR@/testsuite" FILTERS="$MXDIR/filters" # use this for debugging # set -x usage() { echo " Usage: $PROGNAME2 prepare size $PROGNAME2 add category [MBOX]... $PROGNAME2 run $PROGNAME2 summarize [LEVEL] $PROGNAME2 plot [ps|logscale] $PROGNAME2 review TRUECAT PREDCAT $PROGNAME2 clean $PROGNAME2 killall $PROGNAME2 testsuite select [FILTER]... $PROGNAME2 testsuite deselect [FILTER]... $PROGNAME2 testsuite list $PROGNAME2 testsuite status $PROGNAME2 testsuite run [plots] $PROGNAME2 testsuite summarize " exit 1 } mbox_multiplex() { perl -e ' # usage: $0 seqno seed [MBOX]... -s COMMAND ARGS use strict; $SIG{PIPE} = "IGNORE"; my %mbox; my %line; my $cmd = ""; my $args = ""; my $n = shift; srand shift; foreach my $g (@ARGV) { if( "$g" eq "-s" ) { $cmd = "|"; } elsif( $cmd ne "" ) { $cmd .= " $g"; } else { if( open($mbox{$g}, "<$g") ) { $args .= " $g"; } else { delete $mbox{$g}; } } } $args =~ s/\.mbox//g; $args =~ s|/mbox/|/$n/|g; $| = 1; while( scalar keys %mbox > 0 ) { my $j = int(rand scalar keys %mbox); foreach my $f (keys %mbox) { if( $j-- <= 0 ) { if( eof($mbox{$f}) ) { close($mbox{$f}); delete $mbox{$f}; } else { my $c = $f; $c =~ s|\.mbox$||; $c =~ s|/mbox/|/$n/|; open(CPIPE, "$cmd $c $args"); while( ($line{$f} !~ /^From /) && !eof($mbox{$f}) ) { $line{$f} = readline $mbox{$f}; } my $fromline = $line{$f}; $fromline =~ s/^From//; $c =~ s|^.*/||; print "$n $c "; print CPIPE $line{$f}; $line{$f} = readline $mbox{$f}; while( !eof($mbox{$f}) && ($line{$f} !~ /^From /) ) { print CPIPE $line{$f}; $line{$f} = readline $mbox{$f}; } close(CPIPE); # expect the piped command to output result without trailing newline print $fromline; } last; } } } ' "$@" } # this is the default filter if [ -z "$MAILFOOT_FILTER" ]; then MAILFOOT_FILTER="@PKGDATADIR@/dbaclB foot" fi # begin mailtest.functions # end mailtest.functions # check this for environment variable overrrides [ -e $HOME/.mailfootrc ] && . $HOME/.mailfootrc export TEMPDIR # main switch statement - this processes commands case $1 in '-V') echo $VERSION ;; clean) # delete working tree clean_working_tree ;; killall) prerequisite_command "killall" "killall" killall -9 -g mailfoot ;; prepare) # create directory tree shift prepare_working_tree "$@" NUM=`expr $1 - 1` # use parent process id to randomize RANDOM=$PPID for i in `seq 0 $NUM`; do echo $RANDOM > "$MXDIR/$i/seed" done ;; add) shift CATNAME="$1" if [ -z "$CATNAME" ]; then echo "error: missing category name." usage fi prerequisite_command "formail" "mailutils" get_number_of_subsets echo "=== $PROGNAME $*" >> $ALOG shift # use formail to ensure mbox format is clean if [ -n "$*" ]; then cat "$@" | formail -s /bin/bash -c \ "cat >> $MXDIR/mbox/$CATNAME.mbox" else formail -s /bin/bash -c \ "cat >> $MXDIR/mbox/$CATNAME.mbox" fi ;; learn) echo "This command is not meaningful." ;; run) shift get_number_of_subsets NUM=$(($NUM - 1)) # we count from zero to NUM-1 get_categories STUFF="$MXDIR/log/run.stuff" prerequisite_command "perl" "perl" prerequisite_command "sed" "sed" prerequisite_command "seq" "shellutils" echo "=== $PROGNAME run $*" >> $ALOG echo "# location | true | predicted | from" > $CLOG for i in `seq 0 $NUM`; do COMMAND="$MAILFOOT_FILTER " SEED=`cat $MXDIR/$i/seed` CATPATHS=`for n in $CATS; do echo -ne "$MXDIR/mbox/$n "; done` echo "| $COMMAND" >> $ALOG mbox_multiplex $i $SEED $CATPATHS -s $COMMAND >> $CLOG echo " toe $COMMAND |" >> $ALOG done ;; summarize) shift get_number_of_subsets # includes check that directory tree is present get_categories prerequisite_command "awk" "awk or equivalent" echo "=== $PROGNAME summarize $*" >> $ALOG if [ -s $CLOG ]; then cat $CLOG | summarize_log else echo "Error: No results found. You must run the FOOT simulations first." usage fi ;; review) shift prerequisite_command "formail" "mailutils" prerequisite_command "grep" "grep" if [ -z "$1" -o -z "$2" ]; then echo "Error: Missing category, e.g. $PROGNAME review notspam spam" else review_misclassified "$MXDIR/tmp/save_msg.sh" "$1" "$2" fi ;; plot) shift prerequisite_command "gnuplot" "gnuplot" if [ -e "$MXDIR/log/foot.log" ]; then plot_errors "$MXDIR/log/foot.log" "Misclassifications over time in FOOT simulation\n$MAILFOOT_FILTER" "$@" fi ;; testsuite) shift case $1 in list) testsuite_list_wrappers ;; deselect) testsuite_deselect_wrappers "$@" ;; select) testsuite_select_wrappers "$@" ;; status) echo -e "The following categories are ready to be FOOT tested:\n" get_categories for c in $CATS; do echo -n "$c - counting... " NUM=`grep '^From ' $MXDIR/*/$c | wc -l` echo "$NUM messages" done echo -e "\nThe following classifiers are ready to be FOOT tested:\n" get_filters for f in $FILTS; do echo "$f - `$FILTERS/$f describe`" done ;; run) get_filters get_categories get_number_of_subsets NUM=`expr $NUM - 1` make_dummy_mbox for f in $FILTS; do echo -ne "Now testing: " "$FILTERS/$f" describe echo "Cleanup." "$FILTERS/$f" clean "$MXDIR" # before we can classify, we need to create all the # category databases - we use a dummy mailbox for this for i in `seq 0 $NUM`; do for j in $CATS; do cat $MXDIR/mbox/dummy.mailbox | "$FILTERS/$f" learn "$MXDIR/$i/${j/.mbox/}" done done export MAILFOOT_FILTER="$FILTERS/$f foot" echo "Running." time "$PROGNAME" run echo "Writing results." echo -e "\n---------------" >> "$SLOG" "$FILTERS/$f" describe >> "$SLOG" date >> "$CLOG" echo "---------------" >> "$SLOG" "$PROGNAME" summarize >> "$SLOG" if [ "$2" = "plots" ]; then prerequisite_command "gnuplot" "gnuplot" plot_errors "$MXDIR/plots/$f.foot.ps" "Misclassifications over time in FOOT simulation\n$f" ps fi done ;; summarize) if [ -s "$SLOG" ]; then cat "$SLOG" else echo "Error: No results found. You must run the testsuite first." fi ;; *) usage ;; esac ;; *) usage ;; esac exit 0dbacl-1.14.1/src/mailinspect.c000066400000000000000000001065751325773323600161370ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ /* * Note to regenerate the Makefile and configure script: * aclocal * autoconf * touch NEWS README AUTHORS ChangeLog * automake -a */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #if defined HAVE_UNISTD_H #include #endif #include #if defined HAVE_LANGINFO_H #include #if !defined CODESET /* on OpenBSD, CODESET doesn't seem to be defined - we use 3, which should be US-ASCII, but it's not ideal... */ #define CODESET 3 #endif #endif #include /* defines SIGWINCH equals 28 */ /* we need lots of libraries for interactive mode */ #if defined HAVE_LIBSLANG && defined HAVE_LIBREADLINE #define COMPILE_INTERACTIVE_MODE 1 #endif /* now back to our regularly scheduled program */ #if defined COMPILE_INTERACTIVE_MODE #include #include #include #endif #include "util.h" #include "mailinspect.h" /* global variables */ extern hash_bit_count_t default_max_hash_bits; extern hash_count_t default_max_tokens; /* needed for scoring */ extern category_t cat[MAX_CAT]; extern category_count_t cat_count; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern regex_count_t antiregex_count; extern empirical_t empirical; /* regexes used for tagging */ myregex_t tagre[MAX_RE]; char tagre_inclex[MAX_RE]; regex_count_t tagre_count = 0; Emails emails; extern MBOX_State mbox; /* this should only be used read-only */ extern XML_State xml; /* for option processing */ extern char *optarg; extern int optind, opterr, optopt; extern options_t u_options; extern options_t m_options; extern charparser_t m_cp; extern char *extn; extern char *progname; extern char *inputfile; extern long inputline; char *execute_command = NULL; FILE *mbox_handle; bool_t pipe_done; int regcomp_flags; display_state disp; /* used interactively */ extern long system_pagesize; extern int cmd; /*********************************************************** * MISCELLANEOUS FUNCTIONS * ***********************************************************/ static void usage(char **argv) { fprintf(stderr, "\n"); fprintf(stderr, "mailinspect -c CATEGORY FILE [-s command]\n"); fprintf(stderr, "\n"); fprintf(stderr, " sorts the emails found in the mbox folder named FILE\n"); fprintf(stderr, " by order of importance relative to CATEGORY.\n"); fprintf(stderr, "\n"); fprintf(stderr, "mailinspect -V\n"); fprintf(stderr, "\n"); fprintf(stderr, " prints program version.\n"); } void load_rc_file() { FILE *input; char name[128]; char buf[PIPE_BUFLEN]; int n; name[0] = '\0'; strcat(name, getenv("HOME")); strcat(name, "/.mailinspectrc"); if( (input = fopen(name, "rb")) ) { while( !feof(input) ) { fgets(buf, PIPE_BUFLEN, input); if( buf[0] == 'F' ) { n = atoi(&buf[1]) - 1; if( (n <= 9) && (n >= 0) ) { if( disp.fkey_cmd[n] ) { free(disp.fkey_cmd[n]); } disp.fkey_cmd[n] = strdup(strchr(buf, ' ') + 1); /* rid of trailing newline */ disp.fkey_cmd[n][strlen(disp.fkey_cmd[n]) - 1] = '\0'; } } } fclose(input); } } /*********************************************************** * EMAIL LIST CONSTRUCTION * ***********************************************************/ void init_emails() { if( (emails.list = malloc(INITIAL_LIST_SIZE * sizeof(mbox_item))) == NULL ) { errormsg(E_FATAL, "couldn't allocate memory for emails\n"); } if( u_options & (1< 0) ? (cat[0].model_full_token_count / cat[0].model_num_docs) : 100; if( m_options & (1< 0 */ void build_other_descriptions(char **d) { char *p; /* format some extra descriptions */ if( (d[1] = malloc(HEADER_BUFLEN * sizeof(char))) ) { d[1][0] = '\0'; strcat(d[1], "["); strncat(d[1], emails.header.from + 6, 20); strcat(d[1], "] "); strncat(d[1], emails.header.subject + 9, 60); /* clean up embedded newlines */ for(p = d[1]; *p; p++) { if( *p == '\n' ) { *p = ' '; } } *(--p) = '\n'; } } /* fills the emails list one line at a time */ char *process_email_line(char *textbuf) { regex_count_t r; if( mbox.prev_line_empty ) { if( strncmp(textbuf, "From ", 5) == 0 ) { /* save the previous email's score etc */ if( emails.num_emails > 0 ) { emails.list[emails.num_emails - 1].state &= ~(1<= emails.list_size ) { emails.list_size *= 2; if( (emails.list = realloc(emails.list, emails.list_size * sizeof(mbox_item))) == NULL ) { errormsg(E_FATAL, "couldn't allocate memory for emails, failed at %ld bytes\n", (long)emails.list_size * sizeof(mbox_item)); } if( u_options & (1< 0 ) { emails.list[emails.num_emails - 1].state &= ~(1<score[emails.score_type] - ((mbox_item *)b)->score[emails.score_type]) < 0.0 ) { return -1; } else if( ((mbox_item *)a)->score[emails.score_type] == ((mbox_item *)b)->score[emails.score_type] ) { return 0; } else { return +1; } } /* call this after a limit change */ void recalculate_limited() { email_count_t i; emails.num_limited = 0; for(i = 0; i < emails.num_emails; i++) { if( emails.list[i].state & (1<seekpos, SEEK_SET); done = 0; while( !done ) { fgets(buf, PIPE_BUFLEN, input); if( feof(input) || (strncmp(buf, "From ", 5) == 0) ) { done = 1; } else { if( regexec(re, buf, 0, NULL, 0) == 0 ) { return (positive) ? 1 : 0; } } } /* if we're here, then we found no match */ return (positive) ? 0 : 1; } /* opens the current filename and for every limited message, looks to see if it matches (or not) the regex. Messages which fail the test are hidden */ void limit_on_regex(bool_t positive, char *regex) { FILE *input; email_count_t i; mbox_item *w; regex_t re; /* GNU regexes use regular strings */ if( regcomp(&re, regex, regcomp_flags) != 0 ) { errormsg(E_WARNING, "could not compile regular expression '%s', ignored\n", regex); } if( emails.filename ) { input = fopen(emails.filename, "rb"); for(i = 0; i < emails.num_limited; i++) { w = emails.llist[i]; if( grep_single_email(input, &re, positive, w) ) { w->state |= (1<state &= ~(1<seekpos, SEEK_SET); pipe_done = 0; fputs(what->description[0], output); while( !pipe_done ) { fgets(buf, PIPE_BUFLEN, input); if( feof(input) || (strncmp(buf, "From ", 5) == 0) ) { pipe_done = 1; } else { fputs(buf, output); } } } fclose(input); } } /* pipes all emails to an external command. Each email is sent to a different instance of the command */ void pipe_all_to_command(char *command) { email_count_t i; FILE *pipe; for(i = 0; i < emails.num_emails; i++) { if( (pipe = popen(command, "w")) ) { pipe_single_email(&emails.list[i], pipe); pclose(pipe); } } } /* sends the sorted list of emails to a file */ void display_results(FILE *output) { email_count_t i; fprintf(output, "# position| score | description\n"); for(i = 0; i < emails.num_emails; i++) { fprintf(output, "%-10ld %8.1f %s", emails.list[i].seekpos, emails.list[i].score[emails.score_type], emails.list[i].description[emails.index_format]); } } /*********************************************************** * EMAIL TAGGING AND PIPING (INTERACTIVE) * ***********************************************************/ /* tags currently displayed email */ void tag_current(bool_t tag) { if( tag ) { emails.llist[disp.first_visible + disp.highlighted]->state |= (1<state &= ~(1<state &= ~(1<state |= (1<= 20000) /* libslang2 */ char *s = NULL; char *buf; unsigned int len = 0; SLrline_Type *rli; rli = SLrline_open(SLtt_Screen_Cols, SL_RLINE_BLINK_MATCH); if( rli ) { SLtt_set_cursor_visibility(1); SLsmg_normal_video(); len = 255; rline_update(NULL, len, strlen(title)); buf = SLrline_read_line(rli, title, &len); if( buf ) { s = strdup(buf); add_history(s); } SLfree(buf); SLtt_set_cursor_visibility(0); } #else /* libslang1 */ char *s; SLang_RLine_Info_Type *rli; s = malloc(256 * sizeof(char)); if( s ) { rli = (SLang_RLine_Info_Type *)malloc(sizeof(SLang_RLine_Info_Type)); if( rli ) { memset(rli, 0, sizeof(SLang_RLine_Info_Type)); rli->buf = (unsigned char *)s; /* buf is unsigned */ rli->buf_len = 255; rli->tab = 8; rli->dhscroll = 5; rli->getkey = SLang_getkey; rli->tt_goto_column = NULL; rli->update_hook = rline_update; rli->flags |= SL_RLINE_BLINK_MATCH; rli->input_pending = SLang_input_pending; SLang_init_readline(rli); rli->edit_width = SLtt_Screen_Cols - 1; rli->prompt = title; /* now prefill if necessary */ if( *prefill ) { strncpy(s, prefill, 255); rli->buf[255] = '\0'; rli->point = strlen((char *)rli->buf); } else { *rli->buf = 0; rli->point = 0; } SLtt_set_cursor_visibility(1); SLsmg_normal_video(); SLang_read_line(rli); add_history(s); /* buf is unsigned */ SLtt_set_cursor_visibility(0); free(rli); } } #endif return s; } #endif /*********************************************************** * INTERACTIVE DISPLAY FUNCTIONS * ***********************************************************/ #if COMPILE_INTERACTIVE_MODE void interactive_pipe_current(char *prefill) { char *s; FILE *pipe; mbox_item *what; if( (s = get_input_line("Send current email to command: ", prefill)) ) { if( s[0] != '\0' ) { disp.delay_sigwinch = 1; SLsmg_suspend_smg(); if( (pipe = popen(s, "w")) ) { what = emails.llist[disp.first_visible + disp.highlighted]; pipe_single_email(what, pipe); pclose(pipe); } SLsmg_resume_smg(); disp.delay_sigwinch = 0; } free(s); } } void interactive_pipe_all_tagged(char *prefill) { char *s; email_count_t i; FILE *pipe; if( (s = get_input_line("Send TAGGED emails to command: ", prefill)) ) { if( s[0] != '\0' ) { disp.delay_sigwinch = 1; SLsmg_suspend_smg(); for(i = 0; i < emails.num_emails; i++) { if( emails.list[i].state & (1< 0 ) { for(r = 0; r < (disp.num_rows - 2); r++) { if( r + disp.first_visible < emails.num_limited ) { e = emails.llist[r + disp.first_visible]; SLsmg_gotorc(r + 1, 0); SLsmg_printf("%c %8.1f %s", (e->state & (1<score[emails.score_type], e->description[emails.index_format]); SLsmg_erase_eol(); } else { SLsmg_gotorc(r + 1, 0); SLsmg_erase_eol(); } } } else { SLsmg_cls(); r = disp.num_rows - 2; } SLsmg_reverse_video(); e = emails.llist[disp.first_visible + disp.highlighted]; SLsmg_gotorc(disp.highlighted + 1, 0); if( emails.num_limited > 0 ) { SLsmg_printf("%c %8.1f %s", (e->state & (1<score[emails.score_type], e->description[emails.index_format]); } SLsmg_erase_eol(); SLsmg_set_color(2); SLsmg_gotorc(0,0); SLsmg_printf("mailinspect %s %ld msgs sorted(%d) by category %s", emails.filename, (long)emails.num_limited, emails.score_type, cat[0].filename); SLsmg_erase_eol(); SLsmg_gotorc(r + 1, 0); SLsmg_printf("q: quit o: scoring z: rev. sort /: search tT: tag uU: untag sS: send to shell p: summary c: category"); SLsmg_erase_eol(); SLsmg_refresh(); SLsig_unblock_signals(); } void init_disp_state() { int i; /* initialize the display state */ disp.first_visible = 0; disp.highlighted = 0; SLtt_set_color(0, NULL, "lightgray", "default"); SLtt_set_color(1, NULL, "black", "lightgray"); SLtt_set_color(2, NULL, "lightgray", "blue"); SLtt_set_color(3, NULL, "red", "blue"); SLtt_set_cursor_visibility(0); for(i = 0; i < 10; i++) { disp.fkey_cmd[i] = NULL; } load_rc_file(); } /* this is the main key processing loop for interactive mode */ void display_results_interactively() { bool_t done = 0; int c, c1; /* set up the terminal etc. */ SLang_init_tty(-1, 0, 0); SLtt_get_terminfo(); if(-1 == SLsmg_init_smg() ) { fprintf (stderr, "Unable to initialize terminal."); return; } SLkp_init(); /* for cursor keys */ SLsignal(SIGWINCH, sigwinch_handler); init_disp_state(); while(!done) { redraw_current_state(); c = SLang_getkey(); /* if it's a meta combination, translate */ if( c == '' ) { c1 = SLang_getkey(); switch(c1) { case '<': c = SL_KEY_HOME; break; case '>': c = SL_KEY_END; break; case 'v': case 'V': c = SL_KEY_PPAGE; break; case 'r': case 'R': c = '?'; break; case 's': case 'S': c = '/'; break; default: /* could be special cursor keys */ SLang_ungetkey(c1); SLang_ungetkey(c); c = SLkp_getkey(); } } /* handle key press */ switch(c) { case 'q': case 'Q': done = 1; break; case 'c': interactive_categorize(); disp.highlighted = disp.first_visible = 0; break; case '\r': case 'v': if( emails.num_limited > 0 ) { view_current_email(); } break; case SL_KEY_F(1): if( emails.num_limited > 0 && disp.fkey_cmd[0] ) { interactive_pipe_all_tagged(disp.fkey_cmd[0]); } break; case SL_KEY_F(2): if( emails.num_limited > 0 && disp.fkey_cmd[1] ) { interactive_pipe_all_tagged(disp.fkey_cmd[1]); } break; case SL_KEY_F(3): if( emails.num_limited > 0 && disp.fkey_cmd[2] ) { interactive_pipe_all_tagged(disp.fkey_cmd[2]); } break; case SL_KEY_F(4): if( emails.num_limited > 0 && disp.fkey_cmd[3] ) { interactive_pipe_all_tagged(disp.fkey_cmd[3]); } break; case SL_KEY_F(5): if( emails.num_limited > 0 && disp.fkey_cmd[4] ) { interactive_pipe_all_tagged(disp.fkey_cmd[4]); } break; case SL_KEY_F(6): if( emails.num_limited > 0 && disp.fkey_cmd[5] ) { interactive_pipe_all_tagged(disp.fkey_cmd[5]); } break; case SL_KEY_F(7): if( emails.num_limited > 0 && disp.fkey_cmd[6] ) { interactive_pipe_all_tagged(disp.fkey_cmd[6]); } break; case SL_KEY_F(8): if( emails.num_limited > 0 && disp.fkey_cmd[7] ) { interactive_pipe_all_tagged(disp.fkey_cmd[7]); } break; case SL_KEY_F(9): if( emails.num_limited > 0 && disp.fkey_cmd[8] ) { interactive_pipe_all_tagged(disp.fkey_cmd[8]); } break; case SL_KEY_F(10): if( emails.num_limited > 0 && disp.fkey_cmd[9] ) { interactive_pipe_all_tagged(disp.fkey_cmd[9]); } break; case 's': if( emails.num_limited > 0 ) { interactive_pipe_current(""); } break; case 'S': if( emails.num_limited > 0 ) { interactive_pipe_all_tagged(""); } break; case 'o': if( ++emails.score_type >= MAX_SCORES ) { emails.score_type = 0; } qsort(emails.list, emails.num_emails, sizeof(mbox_item), compare_scores); recalculate_limited(); break; case 'p': if( ++emails.index_format >= MAX_FORMATS ) { emails.index_format = 0; } break; case 't': if( emails.num_limited > 0 ) { tag_current(1); } break; case 'T': if( emails.num_limited > 0 ) { tag_all_limited(1); } break; case 'u': if( emails.num_limited > 0 ) { tag_current(0); } break; case 'U': if( emails.num_limited > 0 ) { tag_all_limited(0); } break; case 'z': reverse_sort(); recalculate_limited(); break; case 'G': case SL_KEY_END: if( emails.num_limited > 0 ) { disp.first_visible = emails.num_limited - 1; } else { disp.highlighted = disp.first_visible = 0; } break; case '1': case SL_KEY_HOME: disp.first_visible = 0; break; case '': case SL_KEY_PPAGE: if( disp.first_visible > disp.num_rows ) { disp.first_visible -= disp.num_rows; } else { disp.first_visible = 0; disp.highlighted = 0; } /* assert emails.num_limited >= disp.first_visible */ if( disp.highlighted > (emails.num_limited - disp.first_visible) ) { disp.highlighted = (emails.num_limited - disp.first_visible); } break; case 'k': case '': case SL_KEY_UP: if( disp.highlighted > 0 ) { disp.highlighted--; } else { if( disp.first_visible > 1 ) { disp.first_visible -= 1; } else { disp.first_visible = 0; } } break; case 'j': case '': case SL_KEY_DOWN: if( emails.num_limited > 0 ) { if( disp.highlighted < (emails.num_limited - disp.first_visible - 1) ) { if( disp.highlighted < (disp.num_rows - 3) ) { disp.highlighted++; } else { if( (disp.first_visible += 1) >= emails.num_limited ) { disp.first_visible = emails.num_limited - 1; } } } } else { disp.highlighted = disp.first_visible = 0; } break; case '': case '': case ' ': case SL_KEY_NPAGE: if( emails.num_limited > 0 ) { if( (disp.first_visible += disp.num_rows) >= emails.num_limited ) { disp.first_visible = emails.num_limited - 1; } if( disp.highlighted > (emails.num_limited - disp.first_visible) ) { disp.highlighted = (emails.num_limited - disp.first_visible) - 1; } } else { disp.highlighted = disp.first_visible = 0; } break; case '?': interactive_search(0, ""); disp.highlighted = disp.first_visible = 0; break; case '/': interactive_search(1, ""); disp.highlighted = disp.first_visible = 0; break; default: break; } } /* we're done */ SLsmg_reset_smg(); SLang_reset_tty(); } #endif /*********************************************************** * MAIN FUNCTIONS * ***********************************************************/ int main(int argc, char **argv) { regex_count_t k; FILE *input; signed char op; void (*preprocess_fun)(void) = NULL; void (*postprocess_fun)(void) = NULL; progname = "mailinspect"; inputfile = "stdin"; inputline = 0; /* set up internationalization */ if( !setlocale(LC_ALL, "") ) { errormsg(E_WARNING, "could not set locale, internationalization disabled\n"); } else { if( u_options & (1< -1 ) { switch(op) { case 'j': m_options |= (1<= MAX_SCORES ) { emails.score_type = 0; } break; case 'p': if( !*optarg ) { errormsg(E_ERROR, "you need a number with the -p switch\n"); usage(argv); exit(0); } u_options |= (1<= MAX_FORMATS ) { emails.index_format = 0; } break; case 'c': if( cat_count >= 1 ) { errormsg(E_WARNING, "maximum reached, category ignored\n"); } else { u_options |= (1< -1) && *(argv + optind) ) { /* if it's a filename, process it */ if( (input = fopen(argv[optind], "rb")) ) { if( cat[0].model_num_docs == 0 ) { errormsg(E_WARNING, "category %s was not created for emails." " Messages may not be sorted optimally.\n", cat[0].filename); } if( u_options & (1< */ #ifndef MAILINSPECT_H #define MAILINSPECT_H #ifdef HAVE_CONFIG_H #undef HAVE_CONFIG_H #include "config.h" #endif #include "dbacl.h" typedef long seek_t; typedef u_int32_t line_count_t; typedef u_int32_t email_count_t; typedef u_int16_t rank_t; #define INITIAL_LIST_SIZE 256 #define PIPE_BUFLEN 2048 #define HEADER_BUFLEN 128 #define SORT_INCREASING 1 #define SORT_DECREASING -1 #define TAGRE_INCLUDE 0 #define TAGRE_EXCLUDE 1 #define MAX_FORMATS 2 #define MAX_SCORES 4 /* make sure these options don't interfere with those options defined in dbacl.h which we want to use */ #define U_OPTION_INTERACTIVE 29 #define U_OPTION_REVSORT 30 #define U_OPTION_FORMAT 31 #define STATE_TAGGED 2 #define STATE_LIMITED 3 /* data structures */ typedef struct { char from[HEADER_BUFLEN]; char subject[HEADER_BUFLEN]; } email_header; typedef struct { seek_t seekpos; char *description[MAX_FORMATS]; weight_t score[MAX_SCORES]; char state; } mbox_item; typedef struct { mbox_item *list; mbox_item **llist; email_header header; email_count_t list_size; email_count_t num_limited; email_count_t num_emails; int sortedby; char *filename; unsigned char index_format; unsigned char score_type; } Emails; typedef struct { int num_rows; int num_cols; bool_t delay_sigwinch; int highlighted; email_count_t first_visible; char *fkey_cmd[10]; } display_state; void redraw_current_state(); #endif dbacl-1.14.1/src/mailtest.functions.in000066400000000000000000000171011325773323600176260ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Author: Laird Breyer # # These functions are included by the test scripts. They could be # just sourced, but then where to put the common functions in the filesystem? # begin mailtest.functions prerequisite_command() { if [ -z "`type -p $1`" ]; then echo "Error: $1 not found. Please install $2 to proceed." exit 1 fi } clean_working_tree() { if [ -e $MXDIR ]; then rm -rf $MXDIR else echo "Nothing to clean" fi } make_dummy_mbox() { cat > $MXDIR/mbox/dummy.mailbox < Subject: DON\'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA Message-ID: <1070509855@scooby> X-IMAP: 1023007291 0000010227 Status: RO This text is part of the internal format of your mail folder, and is not a real message. It is created automatically by the mail system software. If deleted, important folder data will be lost, and it will be re-created with the data reset to initial values. EOF } prepare_working_tree() { if [ -d $MXDIR ]; then echo "Error: Directory $MXDIR already exists. Remove it or use it."; usage; elif [ -n "$1" ]; then prerequisite_command "seq" "shellutils" NUM=`expr $1 - 1`; if [ $NUM -gt -1 ]; then mkdir "$MXDIR" && \ mkdir "$MXDIR/tmp" && \ mkdir "$MXDIR/log" && \ mkdir "$MXDIR/plots" && \ mkdir "$MXDIR/mbox" && \ mkdir "$MXDIR/review" && \ mkdir "$MXDIR/filters" && \ for i in `seq 0 $NUM`; do mkdir "$MXDIR/$i"; done && \ echo "=== prepare_working_tree $*" >> $ALOG else echo "Error: Please specify a number greater than zero." usage fi else echo "Error: Please specify a number." usage fi } get_categories() { CATS=`find $MXDIR -type f -name '*.mbox' -exec basename {} \; | sort -u` [ -z "$CATS" ] && echo "No categories found" } get_filters() { FILTS=`find $FILTERS -type f -perm +0111 -exec basename {} \; | sort -u` [ -z "$FILTS" ] && echo "No filters found" } get_number_of_subsets() { NUM=`ls $MXDIR | grep '^[0-9]' | wc -l` if [ $(($NUM)) -le 0 ]; then echo "error: you need to prepare first." usage fi } review_misclassified() { SM=$1 shift cat > "$SM" < msg.tmp.\$POSITION.\$FILENO M=\`head -1 msg.tmp.\$POSITION.\$FILENO | grep -e "\$EMAIL.*\$DATE"\` if [ -n "\$M" ]; then mv msg.tmp.\$POSITION.\$FILENO $MXDIR/review/\$1.\$2.\$POSITION.\$FILENO else rm msg.tmp.\$POSITION.\$FILENO fi EOF if [ -d "$MXDIR/review" ]; then rm -f "$MXDIR/review/*" else echo "Error: You need to prepare first." usage fi if [ -s "$CLOG" ]; then grep " $1 $2 " "$CLOG" | \ while read f; do BOX=`echo $f | cut -d' ' -f2` export POSITION=`echo $f | cut -d' ' -f1` export EMAIL=`echo $f | cut -d' ' -f4` export DATE=`echo $f | cut -d' ' -f5-` echo "$f" [ -e "$MXDIR/$POSITION/$BOX.mbox" ] || export POSITION=mbox cat "$MXDIR/$POSITION/$BOX.mbox" | formail -s /bin/sh "$SM" "$1" "$2" done else echo "Error: There are no logs - run the classifier(s) first" fi rm -f "$SM" } testsuite_list_wrappers() { if [ -d $BOOTSTRAP ] ; then echo -ne "The following classification wrappers are selectable:\n\n" for f in `ls $BOOTSTRAP` ; do [ -x "$BOOTSTRAP/$f" ] && echo "$f - `$BOOTSTRAP/$f describe`" done else echo "Bootstrap directory $BOOTSTRAP does not exist." fi } testsuite_deselect_wrappers() { shift if [ -z "$*" ] ; then usage else for f in "$@" ; do if [ -e $FILTERS/$f ] ; then echo "deselecting $f" rm -f $FILTERS/$f else echo "$f: no such filter." fi done fi } testsuite_select_wrappers() { shift if [ -z "$*" ] ; then usage else for f in $* ; do if [ -x $BOOTSTRAP/$f ] ; then $BOOTSTRAP/$f bootstrap $FILTERS else echo "The wrapper $f cannot be selected, skipping." fi done fi } summarize_log() { awk -v "num=$NUM" -v "cats=${CATS//.mbox/}" ' BEGIN{ split(cats,names) } /^[^#]/{ f[$2,$3]++ fn[$3]++ fp[$2]++ } END{ printf("Where do misclassifications go?\n(numbers on diagonal represent \"recall\")\n\n") printf(" true | but predicted as...\n") printf(" * | ") for(c in names) printf("%10s", names[c]) printf("\n") for(c in names) { printf("%-10s | ", names[c]) for(d in names) { printf("%9.2f%%", 100 * f[names[c],names[d]]/fp[names[c]]) } printf("\n") } printf("\n") printf("What is really in each category after prediction?\n(numbers on diagonal represent \"precision\")\n\n") printf("category | contains mixture of...\n") printf(" * | ") for(c in names) printf("%10s", names[c]) printf("\n") for(c in names) { printf("%-10s | ", names[c]) for(d in names) { printf("%9.2f%%", 100 * f[names[d],names[c]]/fn[names[c]]) } printf("\n") } printf("\n") x = y = 0 for(c in names) { x += f[names[c],names[c]] for(d in names) { y += f[names[c],names[d]] } } printf("Total correct classifications: %9.2f%%\n\n", (100 * x)/y) } ' } plot_errors() { OUTFILE=$MXDIR/plots/`basename $1 .log` CMDFILE=$OUTFILE.cmd DATAFILE=$OUTFILE.plotdata TITLE=$2 cat $1 \ | grep -v '^#' \ | cut -f1,2,3 -d ' ' \ | awk '{count[$1]++; ecount[$1] += ($2 != $3); print (count[$1] == 1) ? "\n" : "", count[$1], ecount[$1]}' \ > $DATAFILE shift 2 OUTPUT="set terminal x11" SCALE="unset logscale" PAUSE="pause -1 \"Press any key...\"" OUTPRINT="" for o in "$@"; do if [ "$o" = "ps" ]; then OUTPUT="set terminal postscript" OUTPRINT="set output \"$OUTFILE.ps\"" PAUSE="" echo "writing $OUTFILE.ps" elif [ "$o" = "logscale" ]; then SCALE="set logscale" fi done cat > $CMDFILE < $DATAFILE cat $2 \ | grep -v '^#' \ | awk '{if( (($2 == $3) && ($5 > $14)) || (($2 != $3) && ($5 < $14)) ) print }' \ | awk '{print $5, $14}' \ > $ERRORFILE shift 2 OUTPUT="set terminal x11" SCALE="unset logscale" PAUSE="pause -1 \"Press any key...\"" OUTPRINT="" for o in "$@"; do if [ "$o" = "ps" ]; then OUTPUT="set terminal postscript" OUTPRINT="set output \"$OUTFILE.ps\"" PAUSE="" echo "writing $OUTFILE.ps" elif [ "$o" = "logscale" ]; then SCALE="set logscale" fi done cat > $CMDFILE < # PROGNAME="$0" PROGNAME2=`basename $0` VERSION="$PROGNAME version @VERSION@\nTrain On Error simulator" MXDIR="$PWD/mailtoe.d" ALOG="$MXDIR/log/activity.log" CLOG="$MXDIR/log/toe.log" SLOG="$MXDIR/log/summary.log" TEMPDIR="$MXDIR/tmp" BOOTSTRAP="@PKGDATADIR@/testsuite" FILTERS="$MXDIR/filters" # use this for debugging # set -x usage() { echo " Usage: $PROGNAME2 prepare size $PROGNAME2 add category [MBOX]... $PROGNAME2 run $PROGNAME2 summarize [LEVEL] $PROGNAME2 plot [ps|logscale] $PROGNAME2 review TRUECAT PREDCAT $PROGNAME2 clean $PROGNAME2 killall $PROGNAME2 testsuite select [FILTER]... $PROGNAME2 testsuite deselect [FILTER]... $PROGNAME2 testsuite list $PROGNAME2 testsuite status $PROGNAME2 testsuite run [plots] $PROGNAME2 testsuite summarize " exit 1 } mbox_multiplex() { perl -e ' # usage: $0 seqno seed [MBOX]... -s COMMAND ARGS use strict; $SIG{PIPE} = "IGNORE"; my %mbox; my %line; my $cmd = ""; my $args = ""; my $n = shift; srand shift; foreach my $g (@ARGV) { if( "$g" eq "-s" ) { $cmd = "|"; } elsif( $cmd ne "" ) { $cmd .= " $g"; } else { if( open($mbox{$g}, "<$g") ) { $args .= " $g"; } else { delete $mbox{$g}; } } } $args =~ s/\.mbox//g; $args =~ s|/mbox/|/$n/|g; $| = 1; while( scalar keys %mbox > 0 ) { my $j = int(rand scalar keys %mbox); foreach my $f (keys %mbox) { if( $j-- <= 0 ) { if( eof($mbox{$f}) ) { close($mbox{$f}); delete $mbox{$f}; } else { my $c = $f; $c =~ s|\.mbox$||; $c =~ s|/mbox/|/$n/|; open(CPIPE, "$cmd $c $args"); while( ($line{$f} !~ /^From /) && !eof($mbox{$f}) ) { $line{$f} = readline $mbox{$f}; } my $fromline = $line{$f}; $fromline =~ s/^From//; $c =~ s|^.*/||; print "$n $c "; print CPIPE $line{$f}; $line{$f} = readline $mbox{$f}; while( !eof($mbox{$f}) && ($line{$f} !~ /^From /) ) { print CPIPE $line{$f}; $line{$f} = readline $mbox{$f}; } close(CPIPE); # expect the piped command to output result without trailing newline print $fromline; } last; } } } ' "$@" } # this is the default filter if [ -z "$MAILTOE_FILTER" ]; then MAILTOE_FILTER="@PKGDATADIR@/dbaclB toe" fi # begin mailtest.functions # end mailtest.functions # check this for environment variable overrrides [ -e $HOME/.mailtoerc ] && . $HOME/.mailtoerc export TEMPDIR # main switch statement - this processes commands case $1 in '-V') echo $VERSION ;; clean) # delete working tree clean_working_tree ;; killall) prerequisite_command "killall" "killall" killall -9 -g mailtoe ;; prepare) # create directory tree shift prepare_working_tree "$@" NUM=`expr $1 - 1` # use parent process id to randomize RANDOM=$PPID for i in `seq 0 $NUM`; do echo $RANDOM > "$MXDIR/$i/seed" done ;; add) shift CATNAME="$1" if [ -z "$CATNAME" ]; then echo "error: missing category name." usage fi prerequisite_command "formail" "mailutils" get_number_of_subsets echo "=== $PROGNAME $*" >> $ALOG shift # use formail to ensure mbox format is clean if [ -n "$*" ]; then cat "$@" | formail -s /bin/bash -c \ "cat >> $MXDIR/mbox/$CATNAME.mbox" else formail -s /bin/bash -c \ "cat >> $MXDIR/mbox/$CATNAME.mbox" fi ;; learn) echo "This command is not meaningful." ;; run) shift get_number_of_subsets NUM=`expr $NUM - 1` # we count from zero to NUM-1 get_categories STUFF="$MXDIR/log/run.stuff" prerequisite_command "perl" "perl" prerequisite_command "sed" "sed" prerequisite_command "seq" "shellutils" echo "=== $PROGNAME run $*" >> $ALOG echo "# location | true | predicted | from" > $CLOG for i in `seq 0 $NUM`; do COMMAND="$MAILTOE_FILTER " SEED=`cat $MXDIR/$i/seed` CATPATHS=`for n in $CATS; do echo -ne "$MXDIR/mbox/$n "; done` echo "| $COMMAND" >> $ALOG mbox_multiplex $i $SEED $CATPATHS -s $COMMAND >> $CLOG echo " toe $COMMAND |" >> $ALOG done ;; summarize) shift get_number_of_subsets # includes check that directory tree is present get_categories prerequisite_command "awk" "awk or equivalent" echo "=== $PROGNAME summarize $*" >> $ALOG if [ -s $CLOG ]; then cat $CLOG | summarize_log else echo "Error: No results found. You must run the TOE simulations first." usage fi ;; review) shift prerequisite_command "formail" "mailutils" prerequisite_command "grep" "grep" if [ -z "$1" -o -z "$2" ]; then echo "Error: Missing category, e.g. $PROGNAME review notspam spam" else review_misclassified "$MXDIR/tmp/save_msg.sh" "$1" "$2" fi ;; plot) shift prerequisite_command "gnuplot" "gnuplot" if [ -e "$MXDIR/log/toe.log" ]; then plot_errors "$MXDIR/log/toe.log" "Misclassifications over time in TOE simulation\n$MAILTOE_FILTER" "$@" fi ;; testsuite) shift case $1 in list) testsuite_list_wrappers ;; deselect) testsuite_deselect_wrappers "$@" ;; select) testsuite_select_wrappers "$@" ;; status) echo -e "The following categories are ready to be TOE tested:\n" get_categories for c in $CATS; do echo -n "$c - counting... " NUM=`grep '^From ' $MXDIR/*/$c | wc -l` echo "$NUM messages" done echo -e "\nThe following classifiers are ready to be TOE tested:\n" get_filters for f in $FILTS; do echo "$f - `$FILTERS/$f describe`" done ;; run) get_filters get_categories get_number_of_subsets NUM=`expr $NUM - 1` make_dummy_mbox for f in $FILTS; do echo -ne "Now testing: " "$FILTERS/$f" describe echo "Cleanup." "$FILTERS/$f" clean "$MXDIR" # before we can classify, we need to create all the # category databases - we use a dummy mailbox for this for i in `seq 0 $NUM`; do for j in $CATS; do cat $MXDIR/mbox/dummy.mailbox | "$FILTERS/$f" learn "$MXDIR/$i/${j/.mbox/}" done done export MAILTOE_FILTER="$FILTERS/$f toe" echo "Running." time "$PROGNAME" run echo "Writing results." echo -e "\n---------------" >> "$SLOG" "$FILTERS/$f" describe >> "$SLOG" date >> "$CLOG" echo "---------------" >> "$SLOG" "$PROGNAME" summarize >> "$SLOG" if [ "$2" = "plots" ]; then prerequisite_command "gnuplot" "gnuplot" plot_errors "$MXDIR/plots/$f.toe.ps" "Misclassifications over time in TOE simulation\n$f" ps fi done ;; summarize) if [ -s "$SLOG" ]; then cat "$SLOG" else echo "Error: No results found. You must run the testsuite first." fi ;; *) usage ;; esac ;; *) usage ;; esac exit 0dbacl-1.14.1/src/mbw.c000066400000000000000000003651321325773323600144100ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dbacl.h" /* most functions in this file are logically identical in wide char * and multibyte versions, except that char is replaced by wchar_t * etc. It's become unwieldy to keep two slightly different copies of * all functions involved, so we use the preprocessor to build a poor * man's template facility. * * The "template" macros work as follows: * mbw_lit("abc") -> "abc" or L"abc" * mbw_t -> char or wchar_t * mbw_prefix(good_char)(x) -> good_char(x) or w_good_char(x) * * Once the template macros have done their work, we obtain ordinary * functions named in a parallel fashion, where the wide character * functions have a w_ prefix, and instances of char are substituted * with instances of wchar_t. * * The code below is split into uncommon code, where the * implementations of corresponding functions is different, and common * code where the implementation is identical. Only identical code is * "templatized". */ #include "mbw.h" extern options_t u_options; extern charparser_t m_cp; extern options_t m_options; extern myregex_t re[MAX_RE]; extern regex_count_t regex_count; extern long system_pagesize; /* uncommon code */ /*********************************************************** * UTILITY FUNCTIONS * ***********************************************************/ #if defined HAVE_MBRTOWC && defined MBW_WIDE /* compiler doesn't seem to know this function is in the * library, so we define our own - bug or just plain weird? */ static __inline__ int mywcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n) { register size_t i = 0; while( i < n ) { if( tolower(*s1) != tolower(*s2) ) { return towlower(*s1) - towlower(*s2); } s1++; s2++; } return 0; } #endif #if defined HAVE_MBRTOWC && defined MBW_WIDE static __inline__ int w_b64_code(wchar_t c) { if( (c >= L'A') && (c <= L'Z') ) { return (c - L'A'); } else if( (c >= L'a') && (c <= L'z') ) { return (c - L'a') + 26; } else if( (c >= L'0') && (c <= L'9') ) { return (c - L'0') + 52; } else if( c == L'+' ) { return 62; } else if( c == L'/' ) { return 63; } else if( c == L'=' ) { return 64; } else { return -1; } } static __inline__ int w_qp_code(wchar_t c) { if( (c >= L'0') && (c <= L'9') ) { return (c - L'0'); } else if( (c >= L'A') && (c <= L'F') ) { return (c - L'A') + 10; } else { return -1; } } #else /* warning: only use char here so we never have to bother about endianness */ static const signed char b64_code_table[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,62,-1,-1,-1,63,52,53, 54,55,56,57,58,59,60,61,-1,-1, -1,64,-1,-1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, 15,16,17,18,19,20,21,22,23,24, 25,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1 }; #define b64_code(c) ((int)b64_code_table[(int)c]) static const signed char qp_code_table[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,-1,10,11,12,13,14, 15,16,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1 }; #define qp_code(c) (qp_code_table[(int)c]) #endif /* common code */ #if defined MBW_MB || (defined MBW_WIDE && defined HAVE_MBRTOWC) /* this is dbacl's idea of an empty line. Note that a single \n or * a \r\n both constitute an empty line, contrary to RFC 2822, which * doesn't allow single \n chars in headers. However, we might be * reading the mail from a Unix mbox, where \r\n was replaced with \n. * We don't accept single \r however. */ #define MBW_EMPTYLINE(line) ((!(line) || \ (line[0] == mbw_lit('\0')) || \ ((line)[0] == mbw_lit('\n')) || \ (((line)[0] == mbw_lit('\r')) && \ ((line)[1] == mbw_lit('\n')))) ? 1 : 0) #define MBW_DOUBLEDASH(line) ((line[0] == mbw_lit('-')) && \ (line[1] == mbw_lit('-')) && \ !mbw_isspace(line[2])) /*********************************************************** * TABLES * ***********************************************************/ typedef struct { const mbw_t *type_subtype; MIME_Content_Type medium; } mbw_prefix(MIME_Media); /* Wildcards such as text are represented as "text/" and must * be placed after all other text/xxx types. * More generally, comparison uses mystrcasestr, so the smallest strings * must come after the more detailed ones. * * For a description of official mime types, see * http://www.iana.org/assignments/ */ static const mbw_prefix(MIME_Media) mbw_prefix(mime_media)[] = { { mbw_lit("text/html"), ctTEXT_HTML }, { mbw_lit("text/xhtml"), ctTEXT_HTML }, { mbw_lit("text/plain"), ctTEXT_PLAIN }, { mbw_lit("text/richtext"), ctTEXT_RICH }, { mbw_lit("text/enriched"), ctTEXT_RICH }, { mbw_lit("text/rtf"), ctTEXT_PLAIN }, { mbw_lit("text/xml"), ctTEXT_XML }, { mbw_lit("text/sgml"), ctTEXT_SGML }, { mbw_lit("text/"), ctTEXT_PLAIN }, { mbw_lit("multipart/"), ctTEXT_PLAIN }, { mbw_lit("message/rfc822"), ctMESSAGE_RFC822 }, { mbw_lit("message/partial"), ctOTHER }, { mbw_lit("message/external-body"), ctMESSAGE_RFC822 }, { mbw_lit("message/news"), ctMESSAGE_RFC822 }, { mbw_lit("message/"), ctOCTET_STREAM }, { mbw_lit("application/sgml"), ctTEXT_PLAIN }, { mbw_lit("application/xml"), ctTEXT_PLAIN }, { mbw_lit("application/rtf"), ctTEXT_PLAIN }, { mbw_lit("application/news-transmission"), ctMESSAGE_RFC822 }, { mbw_lit("application/andrew-inset"), ctTEXT_PLAIN }, { mbw_lit("application/msword"), ctAPPLICATION_MSWORD }, { mbw_lit("application/"), ctOCTET_STREAM }, { mbw_lit("image/"), ctIMAGE }, { mbw_lit("audio/"), ctAUDIO }, { mbw_lit("video/"), ctVIDEO }, { mbw_lit("model/"), ctMODEL }, }; static int num_mime_media = sizeof(mbw_prefix(mime_media))/sizeof(mbw_prefix(MIME_Media)); static const mbw_t *mbw_prefix(armor_start)[] = { mbw_lit("-----BEGIN PGP MESSAGE"), mbw_lit("-----BEGIN PGP PUBLIC KEY BLOCK"), mbw_lit("-----BEGIN PGP PRIVATE KEY BLOCK"), mbw_lit("-----BEGIN PGP SIGNATURE"), }; static int num_armor_start = sizeof(mbw_prefix(armor_start))/sizeof(mbw_t *); static const mbw_t *mbw_prefix(armor_end)[] = { mbw_lit("-----END PGP MESSAGE"), mbw_lit("-----END PGP PUBLIC KEY BLOCK"), mbw_lit("-----END PGP PRIVATE KEY BLOCK"), mbw_lit("-----END PGP SIGNATURE"), }; static int num_armor_end = sizeof(mbw_prefix(armor_end))/sizeof(mbw_t *); /*********************************************************** * UTILITY FUNCTIONS * ***********************************************************/ /* checks if the line is "binary", ie contains printable chars but not too many extended ascii chars */ static bool_t mbw_prefix(is_binline)(const mbw_t *line) { int numa = 0; const mbw_t *p = line; while( *p ) { if( mbw_isspace(*p) || (mbw_isascii(*p) && !mbw_iscntrl(*p)) ) { numa++; } else if( !mbw_isprint(*p) ) { return 1; } p++; } return (numa < (p - line)/2); } static bool_t mbw_prefix(is_emptyspace)(const mbw_t *line) { const mbw_t *p = line; while( *p ) { if( !mbw_isspace(*p) ) { return 0; } p++; } return 1; } static bool_t mbw_prefix(is_b64line)(const mbw_t *line) { const mbw_t *p = line; while( *p ) { if( (mbw_prefix(b64_code)(*p) == -1) && !mbw_isspace(*p) ) { return 0; } p++; } return 1; } static int mbw_prefix(is_uuline)(const mbw_t *line) { int count = 0; const mbw_t *p = line; int len = (int)(line[0] - mbw_lit(' ')); if( (len < 0) || (len > 63) ) { return -1; } while(*p && (*p != mbw_lit('\r')) && (*p != mbw_lit('\n')) ) { if( (*p > mbw_lit('`')) || (*p < mbw_lit(' ')) ) { return -2; } else { count++; } p++; } return (abs(count - 4*(len/3)) <= 3); } /* detecting true yEnc lines is too hard, so we detect nonprintable characters instead */ static bool_t mbw_prefix(is_yencline)(const mbw_t *line) { int nonprint = 0; const mbw_t *p = line; while( *p ) { nonprint += !mbw_isprint(*p); p++; } return (nonprint > 5); } /* * this code generates mystrcasestr() and w_mystrcasestr() * (similar to strstr, but case insensitive) */ static __inline__ const mbw_t *mbw_prefix(mystrcasestr)(const mbw_t *haystack, const mbw_t *needle) { const mbw_t *p, *q, *r; for(p = haystack; *p; p++) { q = needle; r = p; while( *q && *r && ((mbw_tolower(*q) - mbw_tolower(*r)) == 0) ) { q++; r++; } if( !*q ) { return p; } } return NULL; } static __inline__ int mbw_prefix(mystrncasecmp)(const mbw_t *s1, const mbw_t *s2, size_t n) { int s = -1; if( s1 && s2 ) { while(--n > 0) { s = (mbw_tolower(*s1++) - mbw_tolower(*s2++)); if( (s != 0) || (s1 == mbw_lit('\0')) || (s2 == mbw_lit('\0')) ) { break; } } } return s; } static __inline__ int mbw_prefix(mystrncmp)(const mbw_t *s1, const mbw_t *s2, size_t n) { int s = -1; if( s1 && s2 ) { while(--n > 0) { s = (*s1++ - *s2++); if( (s != 0) || (s1 == mbw_lit('\0')) || (s2 == mbw_lit('\0')) ) { break; } } } return s; } /*********************************************************** * DECODING CACHE FUNCTIONS * ***********************************************************/ static void mbw_prefix(init_dc)(mbw_prefix(decoding_cache) *dc, size_t len) { if( !dc->cache ) { dc->cache = (mbw_t *)malloc(len * sizeof(mbw_t)); dc->data_ptr = dc->cache; dc->cache_len = dc->cache ? len : 0; dc->max_line_len = len; } } static void mbw_prefix(adjust_cache_size)(mbw_prefix(decoding_cache) *dc, size_t n) { mbw_t *p; size_t m = (dc->data_ptr - dc->cache); while( dc->cache_len < m + n ) { p = (mbw_t *)realloc(dc->cache, 2 * dc->cache_len * sizeof(mbw_t)); if( p ) { dc->cache = p; dc->data_ptr = p + m; dc->cache_len *= 2; } else { break; } } dc->max_line_len = (dc->max_line_len < n) ? n : dc->max_line_len; } static bool_t mbw_prefix(flush_cache)(mbw_prefix(decoding_cache) *dc, mbw_t *line, bool_t all) { mbw_t *q; mbw_t *p; int i; if( dc->cache && (dc->data_ptr > dc->cache) ) { /* never output more bytes than will fit on output_line */ p = (dc->data_ptr > dc->cache + dc->max_line_len) ? (dc->cache + dc->max_line_len): dc->data_ptr; if( !all ) { /* we break the line at the last space, or ampersand, or seventy chars (> b64/qp limit) from the end - there may well be stretches longer than this, but we try to flush as much as possible, so the limit should be small. Also, we don't want to break entities if possible. */ /* for(i = 25; !mbw_isspace(*p) && */ /* (p > dc->cache) && i; --p, --i); */ for(i = 70; !mbw_isspace(*p) && (*p != mbw_lit('&')) && (p > dc->cache) && i; --p, --i); } if( p > dc->cache ) { for(q = dc->cache; q < p; q++) { *line++ = *q; } *line = mbw_lit('\0'); dc->data_ptr = dc->cache; if( !all ) { /* now fold unused part back into cache. Note that * b64_line_cache is always NUL terminated, so we don't * need b64_cache_ptr to mark the end. */ while( *p ) { *dc->data_ptr++ = *p++; } } *dc->data_ptr = mbw_lit('\0'); return 1; } } return 0; } /*********************************************************** * DECODING FUNCTIONS * ***********************************************************/ #define REPNUL mbw_lit('\t') /* * this code generates b64_line_filter2() and w_b64_line_filter2() * works ok so long as q <= line, or q >> line * WARNING: it is assumed that the buffer at q can hold (at most) all of line * * The string which is written is always NUL terminated, but if NULs * were decoded in the middle, those are replaced by tabs (we could * also replace them with a more neutral char, but the cache flushing * code breaks up lines on spaces, and we want to take advantage of that. See * the REPNUL define) */ mbw_t *mbw_prefix(b64_line_filter2)(mbw_t *line, mbw_t *q) { mbw_t *p = line; mbw_t buf[4]; mbw_t *buf_start = buf; mbw_t *buf_end = buf + 4; if( q ) { while( *p ) { if( mbw_prefix(b64_code)(*p) > -1 ) { *buf_start++ = *p; if( buf_start == buf_end ) { buf_start = buf; *q = (mbw_prefix(b64_code)(buf[0])<<2) + (mbw_prefix(b64_code)(buf[1])>>4); if( !*q ) { *q = REPNUL; } q++; if( buf[2] != mbw_lit('=') ) { *q = (mbw_prefix(b64_code)(buf[1])<<4) + (mbw_prefix(b64_code)(buf[2])>>2); if( !*q ) { *q = REPNUL; } q++; if( buf[3] != mbw_lit('=') ) { *q = (mbw_prefix(b64_code)(buf[2])<<6) + mbw_prefix(b64_code)(buf[3]); if( !*q ) { *q = REPNUL; } q++; } else { break; } } else { break; } } } p++; } *q = mbw_lit('\0'); } return q; } /* * this code generates b64_line_filter() and w_b64_line_filter() * Decodes a base64 encoded line. The input line is overwritten. * * The b64 standard arbitrarily truncates lines to 57 characters, so * here we place the chunks in a cache and only overwrite line when * the cache is full. Unfortunately, malformed email messages may not * follow the standard, so in practice all this means is that we get * arbitrarily truncated input. * * Note that when we overwrite line with the cached data, we assume * the line is big enough to hold all the cached data. This is guaranteed * by registering the current line length with the cache. */ bool_t mbw_prefix(b64_line_filter)(mbw_prefix(decoding_cache) *b64cache, mbw_t *line) { mbw_prefix(adjust_cache_size)(b64cache, mbw_strlen(line)); b64cache->data_ptr = mbw_prefix(b64_line_filter2)(line, b64cache->data_ptr); return mbw_prefix(flush_cache)(b64cache, line, 0); } /* * this code generates qp_line_filter2() and w_qp_line_filter2() * this works ok so long as q <= line, or q >> line * WARNING: it is assumed that the buffer at q can hold (at most) all of line */ mbw_t *mbw_prefix(qp_line_filter2)(mbw_t *line, mbw_t *q) { mbw_t *p = line; if( q ) { while( *p ) { if( *p != mbw_lit('=') ) { *q++ = *p++; } else { if( !*(++p) || mbw_isspace(*p) ) { break; } else { /* if the equal sign isn't followed by */ /* an upper case hex number, something's wrong */ *q = mbw_prefix(qp_code)(*p); if( ((signed char)*q < 0) || !p[1] || (mbw_prefix(qp_code)(p[1]) < 0) ) { *q++ = p[-1]; } else { *q = (*q << 4) + mbw_prefix(qp_code)(p[1]); if( *q ) { q++; } p += 2; } } } } *q = mbw_lit('\0'); } return q; } /* * this code generates qp_line_filter() and w_qp_line_filter() * Decodes a quoted-printable line. The input line is overwritten. * * The QP standard arbitrarily truncates lines to 76 characters, so * here we place the chunks in a cache and only overwrite line when * the cache is full. Unfortunately, malformed email messages may not * follow the standard, so in practice all this means is that we get * arbitrarily truncated input. * * Note that when we overwrite line with the cached data, we assume * the line is big enough to hold all the cached data. This is guaranteed * by registering the current line length with the cache. */ bool_t mbw_prefix(qp_line_filter)(mbw_prefix(decoding_cache) *qpcache, mbw_t *line) { mbw_prefix(adjust_cache_size)(qpcache, mbw_strlen(line)); qpcache->data_ptr = mbw_prefix(qp_line_filter2)(line, qpcache->data_ptr); return mbw_prefix(flush_cache)(qpcache, line, 0); } /*********************************************************** * TOKENIZER FUNCTIONS * ***********************************************************/ /* the following modules handle state transitions, you can mix and * match them, or write new ones. The is_func() is called in the * default state, and switches the internal state if necessary. If it * can't recognize the current char, it should return gcUNDEF, not * gcDISCARD, that way the next is_func() can look at the character. * The handle_func() is similar to the is_func(), but is * called when the state is not the default. It should return gcDISCARD * and switch to the default state if it can't recognize the current char, * otherwise it can switch states any way it wants. When it detects the * end of the current token, it must switch back to the default state. */ /* these are macros to save typing, modules below */ #define SET1(c) ( (*(c) == mbw_lit('\'')) || (*(c) == mbw_lit('-')) || (*(c) == mbw_lit('.')) ) /* #define SET1(c) ( (*(c) == mbw_lit('-')) || (*(c) == mbw_lit('+')) || (*(c) == mbw_lit('.')) || (*(c) == mbw_lit('_')) || (*(c) == mbw_lit(',')) || (*(c) >= 0xA0) ) */ /* #define SET1(c) ( (*(c) == mbw_lit('-')) || (*(c) == mbw_lit('+')) || (*(c) == mbw_lit('.')) || (*(c) == mbw_lit('_')) || (*(c) == mbw_lit(',')) || (*(c) == mbw_lit('$')) || (*(c) >= 0xA0) ) */ #define SET2(c) ( (*(c) == mbw_lit(',')) || (*(c) == mbw_lit('.')) ) #define SET3(c) ( (*(c) > mbw_lit(' ')) && (*(c) <= mbw_lit('~')) && (*(c) != mbw_lit('>')) ) #define IO(c) ((*(c) & 0xC0) == 0x80) #define I2O(c) ((*(c) & 0xE0) == 0xC0) #define I3O(c) ((*(c) & 0xF0) == 0xE0) #define I4O(c) ((*(c) & 0xF8) == 0xF0) #define I5O(c) ((*(c) & 0xFC) == 0xF8) #define I6O(c) ((*(c) & 0xFE) == 0xFC) #define RANGE(c,x,y) ((*(c) >= x) && (*(c) <= y)) #define DRANGE(c,x,y,u,v) (RANGE(c,x,y) || RANGE(c,u,v)) #define DTEST(s,t,r) (s && t && (char_filter_state = r)) #define TTEST(s,t,u,r) (s && t && u && (char_filter_state = r)) #define QTEST(s,t,u,v,r) (s && t && u && v && (char_filter_state = r)) #define VTEST(s,t,u,v,w,r) (s && t && u && v && w && (char_filter_state = r)) #define STEST(s,t,u,v,w,x,r) (s && t && u && v && w && x && (char_filter_state = r)) #define Shift_JIS(c) ( DTEST(DRANGE(c,0x81,0x9F,0xE0,0xFC),DRANGE(c+1,0x40,0x7E,0x80,0xFC),fShift_JIS_1) ) #define EUC_Japanese(c) ( DTEST(RANGE(c,0xA1,0xFE),RANGE(c+1,0xA1,0xFE),fEUC_Japanese_1) || DTEST((*c == 0x8E),RANGE(c+1,0xA0,0xDF),fEUC_Japanese_1) || TTEST((*c == 0x8F),RANGE(c+1,0xA1,0xFE),RANGE(c+2,0xA1,0xFE),fEUC_Japanese_2) ) #define BIG5(c) ( DTEST(RANGE(c,0xA1,0xFE),DRANGE(c+1,0x40,0x7E,0xA1,0xFE),fBIG5_1) ) #define BIG5P(c) ( DTEST(RANGE(c,0x81,0xFE),DRANGE(c+1,0x40,0x7E,0x80,0xFE),fBIG5P_1) ) #define EUC_CN(c) ( DTEST(RANGE(c,0xA1,0xFE),RANGE(c+1,0xA1,0xFE),fEUC_CN_1) ) #define EUC_TW(c) ( DTEST(RANGE(c,0xA1,0xFE),RANGE(c+1,0xA1,0xFE),fEUC_TW_1) || QTEST((*c == 0x8E),RANGE(c+1,0xA1,0xB0),RANGE(c+2,0xA1,0xFE),RANGE(c+3,0xA1,0xFE),fEUC_TW_3) ) #define Johab(c) ( DTEST(RANGE(c,0x84,0xD3),DRANGE(c+1,0x41,0x7E,0x81,0xFE),fJohab_1) || DTEST(DRANGE(c,0xD8,0xDE,0xE0,0xF9),DRANGE(c+1,0x31,0x7E,0x91,0xFE),fJohab_1) ) #define UTF8(c) ( DTEST(I2O(c),IO(c+1),fUTF8_1) || TTEST(I3O(c),IO(c+1),IO(c+2),fUTF8_2) || QTEST(I4O(c),IO(c+1),IO(c+2),IO(c+3),fUTF8_3) || VTEST(I5O(c),IO(c+1),IO(c+2),IO(c+3),IO(c+4),fUTF8_4) || STEST(I6O(c),IO(c+1),IO(c+2),IO(c+3),IO(c+4),IO(c+5),fUTF8_5) ) #define ISO8859(c) ( RANGE(c,0xA1,0xFE) ) /* atom without slash */ static char rfc2822_atom[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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', '9', 0, 0, 0, '=', 0, '?', 0, '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, 0, 0, '^', '_', '`', '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, }; #define ATOM(c) (((unsigned int)(*(c)) < 255) && rfc2822_atom[(unsigned int)(*(c))]) #define DOTTED_ATOM(c) ( ((c[0] == mbw_lit('.')) && ATOM((c+1))) || ATOM(c) ) #define COLON_ATOM(c) ( ((c[0] == mbw_lit(':')) && ATOM((c+1))) || ATOM(c) ) #define DOTTED_DIGITS(c) ( ((c[0] == mbw_lit('.')) && mbw_isdigit(c[1])) || mbw_isdigit(c[0]) ) #define COLON_DIGITS(c) ( ((c[0] == mbw_lit(':')) && mbw_isdigit(c[1])) || mbw_isdigit(c[0]) ) #define DOTTED_ALPHA(c) ( ((c[0] == mbw_lit('.')) && mbw_isalpha(c[1])) || mbw_isalpha(c[0]) ) /* warning: macros and modules work directly with this structure */ static enum { fDEF = 1, fANX, fNAX, fMUL, fCUR, fADD, fSEP_1, fSEP_2, fSEP_3, fUTF8_1, fUTF8_2, fUTF8_3, fUTF8_4, fUTF8_5, fShift_JIS_1, fEUC_Japanese_1, fEUC_Japanese_2, fBIG5_1, fBIG5P_1, fEUC_CN_1, fEUC_TW_1,fEUC_TW_2,fEUC_TW_3, fJohab_1, fALNUM, fALPHA, fNUMERIC, fSYMBOL, fANSX_1, fANSX_2, fANSX_3, fCEF2_ATOM, fCEF2_DOTTED_ATOM, fCEF2_COLON_ATOM } char_filter_state = fDEF; /* * asian character tokens */ /* macro to be used in case statememt */ #define ASIAN_CASES fShift_JIS_1: case fBIG5_1: case fBIG5P_1: case fEUC_CN_1: case fJohab_1: case fEUC_TW_1: case fEUC_TW_2: case fEUC_TW_3: case fEUC_Japanese_1: case fEUC_Japanese_2 static __inline__ good_char_t mbw_prefix(is_asian_case)(const mbw_t *c) { return (Shift_JIS(c) || EUC_Japanese(c) || BIG5(c) || BIG5P(c) || EUC_CN(c) || EUC_TW(c) || Johab(c)) ? gcTOKEN : gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_asian_case)(const mbw_t *c) { switch(char_filter_state) { case fShift_JIS_1: case fBIG5_1: case fBIG5P_1: case fEUC_CN_1: case fJohab_1: char_filter_state = fDEF; return gcTOKEN_END; case fEUC_TW_1: char_filter_state = fDEF; return gcTOKEN_END; case fEUC_TW_2: char_filter_state = fEUC_TW_1; return gcTOKEN; case fEUC_TW_3: char_filter_state = fEUC_TW_2; return gcTOKEN; case fEUC_Japanese_1: char_filter_state = fDEF; return gcTOKEN_END; case fEUC_Japanese_2: char_filter_state = fEUC_Japanese_1; return gcTOKEN; default: break; } char_filter_state = fDEF; return gcDISCARD; } /* * utf8 character tokens - only makes sense if parsing multibyte strings */ /* macro to be used in case statememt */ #define UNICODE_CASES fUTF8_1: case fUTF8_2: case fUTF8_3: case fUTF8_4: case fUTF8_5 static __inline__ good_char_t mbw_prefix(is_unicode_case)(const mbw_t *c) { return (UTF8(c)) ? gcTOKEN : gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_unicode_case)(const mbw_t *c) { switch(char_filter_state) { case fUTF8_1: char_filter_state = fDEF; return gcTOKEN_END; case fUTF8_2: char_filter_state = fUTF8_1; return gcTOKEN; case fUTF8_3: char_filter_state = fUTF8_2; return gcTOKEN; case fUTF8_4: char_filter_state = fUTF8_3; return gcTOKEN; case fUTF8_5: char_filter_state = fUTF8_4; return gcTOKEN; default: break; } char_filter_state = fDEF; return gcDISCARD; } /* * alpha character tokens */ #define ALPHA_CASES fALPHA /* checks for alpha and switches to alphabetic state, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_alpha_case)(const mbw_t *c) { if( mbw_isalpha(*c++) ) { if( mbw_isalpha(*c) || (*c == mbw_lit('\0')) ) { char_filter_state = fALPHA; return gcTOKEN; } return gcTOKEN_END; } return gcUNDEF; } /* checks for alpha or discards, may switch back to default state */ static __inline__ good_char_t mbw_prefix(handle_alpha_case)(const mbw_t *c) { if( mbw_isalpha(*c++) ) { if( mbw_isalpha(*c) || (*c == mbw_lit('\0')) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * alphanumeric character tokens */ #define ALNUM_CASES fALNUM /* checks for alnum and switches to alphanumeric state, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_alnum_case)(const mbw_t *c) { if( mbw_isalnum(*c++) ) { if( mbw_isalnum(*c) || (*c == mbw_lit('\0')) ) { char_filter_state = fALNUM; return gcTOKEN; } else { return gcTOKEN_END; } } return gcUNDEF; } /* checks for alnum or discards, may switch back to default state */ static __inline__ good_char_t mbw_prefix(handle_alnum_case)(const mbw_t *c) { if( mbw_isalnum(*c) ) { if( mbw_isalnum(*(++c)) || (*c == mbw_lit('\0')) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * numeric tokens */ #define NUMERIC_CASES fNUMERIC /* checks for digit and switches to numeric state, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_numeric_case)(const mbw_t *c) { if( mbw_isdigit(*c++) ) { if( mbw_isdigit(*c) || (*c == mbw_lit('\0')) ) { char_filter_state = fNUMERIC; return gcTOKEN; } else { return gcTOKEN_END; } } return gcUNDEF; } /* checks for numeric or discards, may switch back to default state */ static __inline__ good_char_t mbw_prefix(handle_numeric_case)(const mbw_t *c) { if( mbw_isdigit(*c++) ) { if( mbw_isdigit(*c) || (*c == mbw_lit('\0')) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * punctuation tokens */ #define SYMBOLIC_CASES fSYMBOL static __inline__ good_char_t mbw_prefix(is_symbolic_case)(const mbw_t *c) { if( mbw_ispunct(*c++) ) { if( mbw_ispunct(*c) || (*c == mbw_lit('\0')) ) { char_filter_state = fSYMBOL; return gcTOKEN; } else { return gcTOKEN_END; } } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_symbolic_case)(const mbw_t *c) { if( mbw_ispunct(*c++) ) { if( mbw_ispunct(*c) || (*c == mbw_lit('\0')) ) { if( (c[-1] == c[0]) && (c[0] == c[1]) ) { return gcIGNORE; } return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * repeated character tokens, squeezed down to 3. */ #define REPEAT_CASES fSEP_1: case fSEP_2: case fSEP_3 /* checks for repeated char, replaces with 3 copies only, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_repeat_case)(const mbw_t *c) { if( (c[1] == c[0]) ) { if( (c[2] == c[0]) ) { char_filter_state = fSEP_3; return gcTOKEN; } else { char_filter_state = fSEP_2; return gcTOKEN; } } return gcUNDEF; } /* checks for repeated char, replaces with 3 copies only */ static __inline__ good_char_t mbw_prefix(handle_repeat_case)(const mbw_t *c) { switch(char_filter_state) { case fSEP_1: if( c[0] != c[1] ) { char_filter_state = fDEF; } return gcDISCARD; case fSEP_2: char_filter_state = fSEP_1; return gcTOKEN; case fSEP_3: char_filter_state = fSEP_2; return gcTOKEN; default: break; } char_filter_state = fDEF; return gcDISCARD; } /* * currency tokens, very simple and naive, not localized */ #define CURRENCY_CASES fCUR /* checks for currency, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_currency_case)(const mbw_t *c) { /* this should be done properly (locale) sometime ... */ if( (*c == mbw_lit('$')) || (*c == mbw_lit('\xa3')) ) { if( mbw_isdigit(c[1]) && (!mbw_isdigit(c[2]) || !mbw_isdigit(c[3]) || !mbw_isdigit(c[4])) ) { char_filter_state = fCUR; return gcTOKEN; } } return gcUNDEF; } /* checks for currency */ static __inline__ good_char_t mbw_prefix(handle_currency_case)(const mbw_t *c) { if( mbw_isdigit(c[1]) ) { return gcTOKEN; } else if( SET2(c+1) && mbw_isdigit(c[2]) ) { char_filter_state = fCUR; return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } /* * internet embedded address */ #define ADDRESS_CASES fADD static __inline__ good_char_t mbw_prefix(is_address_case)(const mbw_t *c) { if( *c == mbw_lit('<') ) { for(c++; SET3(c); c++); if( *c == mbw_lit('>') ) { char_filter_state = fADD; } } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_address_case)(const mbw_t *c) { switch(*c) { case mbw_lit('@'): /* case mbw_lit('#'): */ /* case mbw_lit('?'): */ /* case mbw_lit('&'): */ /* case mbw_lit(':'): */ /* case mbw_lit('/'): */ return gcDISCARD; case mbw_lit('>'): char_filter_state = fDEF; return gcDISCARD; default: break; } return gcTOKEN; } /* * multiple alpha tokens separated by punctuation */ #define MULTI_ALPHA_CASES fMUL /* checks for alpha and switches to alphabetic state, or returns gcUNDEF if unrecognized */ static __inline__ good_char_t mbw_prefix(is_multi_alpha_case)(const mbw_t *c) { /* don't increment c in SET1 */ if( mbw_isalpha(*c++) && SET1(c) && mbw_isalpha(*(++c)) ) { char_filter_state = fMUL; return gcTOKEN; } return gcUNDEF; } /* checks for alpha or discards, may switch back to default state */ static __inline__ good_char_t mbw_prefix(handle_multi_alpha_case)(const mbw_t *c) { if( mbw_isalpha(c[1]) ) { return gcTOKEN; } else if( SET1(c+1) && mbw_isalpha(c[2]) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } /* * xxx123 identifiers */ #define ALPHA_NUMBER_CASES fANX static __inline__ good_char_t mbw_prefix(is_alpha_number_case)(const mbw_t *c) { if( mbw_isalpha(*c++) && mbw_isdigit(*c) ) { char_filter_state = fANX; return gcTOKEN; } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_alpha_number_case)(const mbw_t *c) { if( mbw_isdigit(*c++) ) { if( mbw_isdigit(*c) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * 123xxx identifiers */ #define NUMBER_ALPHA_CASES fNAX static __inline__ good_char_t mbw_prefix(is_number_alpha_case)(const mbw_t *c) { if( mbw_isdigit(*c++) && mbw_isalpha(*c) ) { char_filter_state = fNAX; return gcTOKEN; } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_number_alpha_case)(const mbw_t *c) { if( mbw_isalpha(*c++) ) { if( mbw_isalpha(*c) ) { return gcTOKEN; } char_filter_state = fDEF; return gcTOKEN_END; } char_filter_state = fDEF; return gcDISCARD; } /* * xxx123% identifiers */ #define ALPHA_NUMBER_SYMBOL_CASES fANSX_1: case fANSX_2: case fANSX_3 static __inline__ good_char_t mbw_prefix(is_alpha_number_symbol_case)(const mbw_t *c) { if( mbw_isalpha(*c++) ) { if( mbw_isdigit(*c) ) { char_filter_state = fANSX_2; return gcTOKEN; } else if( mbw_ispunct(*c) ) { char_filter_state = fANSX_1; return gcTOKEN; } else if( !mbw_isalpha(*c) || (*c == mbw_lit('\0')) ) { return gcTOKEN_END; } char_filter_state = fANSX_3; return gcTOKEN; } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(is_number_symbol_case)(const mbw_t *c) { if( mbw_isdigit(*c++) ) { if( mbw_ispunct(*c) ) { char_filter_state = fANSX_1; return gcTOKEN; } else if( !mbw_isdigit(*c) || (*c == mbw_lit('\0')) ) { return gcTOKEN_END; } char_filter_state = fANSX_2; return gcTOKEN; } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_alpha_number_symbol_case)(const mbw_t *c) { if( *(c++) == mbw_lit('\0') ) { return gcTOKEN; } switch(char_filter_state) { case fANSX_1: if( !mbw_ispunct(*c) ) { char_filter_state = fDEF; return gcTOKEN_END; } else if( (c[-1] == c[0]) && (c[0] == c[1]) ) { return gcIGNORE; } return gcTOKEN; case fANSX_2: if( mbw_ispunct(*c) ) { char_filter_state = fANSX_1; return gcTOKEN; } else if( mbw_isalpha(*c) || ISO8859(c) ) { char_filter_state = fANSX_3; return gcTOKEN; } else if( !mbw_isdigit(*c) ) { char_filter_state = fDEF; return gcTOKEN_END; } return gcTOKEN; case fANSX_3: if( mbw_isdigit(*c) ) { char_filter_state = fANSX_2; return gcTOKEN; } else if( mbw_ispunct(*c) ) { char_filter_state = fANSX_1; return gcTOKEN; } else if( !mbw_isalpha(*c) && !ISO8859(c) ) { char_filter_state = fDEF; return gcTOKEN_END; } else if( (c[-1] == c[0]) && (c[0] == c[1]) ) { return gcIGNORE; } return gcTOKEN; default: /* ignore */ break; } char_filter_state = fDEF; return gcDISCARD; } /* * This is the CEF (common encoding formats) tokenizer. * It was the first attempt at a specialized email tokenizer. */ static __inline__ good_char_t mbw_prefix(is_cef_char)(const mbw_t *c) { good_char_t retval; switch(char_filter_state) { case fDEF: #if defined MBW_MB /* this doesn't make sense for wide characters */ if(*c & 0x80) { if( mbw_prefix(is_unicode_case)(c) || mbw_prefix(is_asian_case)(c) ) { return gcTOKEN; } else if( *c < 0xa0 ) { return gcDISCARD; } } #endif if( mbw_isalpha(*c) ) { if( (retval = mbw_prefix(is_alpha_number_case)(c)) || (retval = mbw_prefix(is_multi_alpha_case)(c)) ) { return retval; } return gcTOKEN; } else if( mbw_ispunct(*c) ) { if( (retval = mbw_prefix(is_repeat_case)(c)) || (retval = mbw_prefix(is_currency_case)(c)) || (retval = mbw_prefix(is_address_case)(c)) ) { return retval; } } else if( mbw_isdigit(*c) ) { if( (retval = mbw_prefix(is_number_alpha_case)(c)) ) { return retval; } } return gcDISCARD; case ALPHA_CASES: retval = mbw_prefix(handle_alpha_case)(c); if( retval == gcTOKEN_END ) { if( (retval = mbw_prefix(is_multi_alpha_case)(c)) || (retval = mbw_prefix(is_alpha_number_case)(c)) ) { return retval; } } return retval; case ALPHA_NUMBER_CASES: return mbw_prefix(handle_alpha_number_case)(c); case NUMBER_ALPHA_CASES: return mbw_prefix(handle_number_alpha_case)(c); case MULTI_ALPHA_CASES: return mbw_prefix(handle_multi_alpha_case)(c); case ADDRESS_CASES: return mbw_prefix(handle_address_case)(c); case CURRENCY_CASES: return mbw_prefix(handle_currency_case)(c); case REPEAT_CASES: return mbw_prefix(handle_repeat_case)(c); case ASIAN_CASES: return mbw_prefix(handle_asian_case)(c); case UNICODE_CASES: return mbw_prefix(handle_unicode_case)(c); default: /* nothing */ break; } char_filter_state = fDEF; return gcDISCARD; /* otherwise compiler complains */ } /* * This is the ADP (alpha digit punctuation) tokenizer. * It was the second attempt at a specialized email tokenizer. */ static __inline__ good_char_t mbw_prefix(is_adp_char)(const mbw_t *c) { good_char_t retval; switch(char_filter_state) { case fDEF: #if defined MBW_MB /* this doesn't make sense for wide characters */ if(*c & 0x80) { if( (retval = mbw_prefix(is_unicode_case)(c)) || (retval = mbw_prefix(is_asian_case)(c)) ) { return retval; } else if( *c < 0xa0 ) { return gcDISCARD; } } #endif if( (retval = mbw_prefix(is_alpha_number_symbol_case)(c)) || (retval = mbw_prefix(is_number_symbol_case)(c)) || (retval = mbw_prefix(is_symbolic_case)(c)) ) { return retval; } return gcDISCARD; case ALPHA_NUMBER_SYMBOL_CASES: return mbw_prefix(handle_alpha_number_symbol_case)(c); case SYMBOLIC_CASES: return mbw_prefix(handle_symbolic_case)(c); case ASIAN_CASES: return mbw_prefix(handle_asian_case)(c); case UNICODE_CASES: return mbw_prefix(handle_unicode_case)(c); default: /* nothing */ break; } char_filter_state = fDEF; return gcDISCARD; } /* * This is the CEF2 (common email format v2) tokenizer. */ static __inline__ good_char_t mbw_prefix(is_cef2_special_case)(const mbw_t *c) { return gcUNDEF; } static __inline__ good_char_t mbw_prefix(is_cef2_atom_case)(const mbw_t *c) { if( ATOM(c) ) { char_filter_state = fCEF2_ATOM; return gcTOKEN; } return gcUNDEF; } static __inline__ good_char_t mbw_prefix(handle_cef2_atom_case)(const mbw_t *c) { if( ATOM(c) ) { return gcTOKEN; } else if( DOTTED_ATOM(c) ) { char_filter_state = fCEF2_DOTTED_ATOM; return gcTOKEN; } else if( COLON_ATOM(c) ) { char_filter_state = fCEF2_COLON_ATOM; return gcTOKEN; } char_filter_state = fDEF; return gcDISCARD; } static __inline__ good_char_t mbw_prefix(handle_cef2_dotted_atom_case)(const mbw_t *c) { if( DOTTED_ATOM(c) ) { return gcTOKEN; } char_filter_state = fDEF; return gcDISCARD; } static __inline__ good_char_t mbw_prefix(handle_cef2_colon_atom_case)(const mbw_t *c) { if( COLON_ATOM(c) ) { return gcTOKEN; } char_filter_state = fDEF; return gcDISCARD; } static __inline__ good_char_t mbw_prefix(is_cef2_char)(const mbw_t *c) { good_char_t retval; switch(char_filter_state) { case fDEF: #if defined MBW_MB /* this doesn't make sense for wide characters */ if(*c & 0x80) { if( (retval = mbw_prefix(is_unicode_case)(c)) || (retval = mbw_prefix(is_asian_case)(c)) ) { return retval; } else if( *c < 0xa0 ) { return gcDISCARD; } } #endif if( (retval = mbw_prefix(is_cef2_special_case)(c)) || (retval = mbw_prefix(is_cef2_atom_case)(c)) ) { return retval; } return gcDISCARD; case fCEF2_ATOM: return mbw_prefix(handle_cef2_atom_case)(c); case fCEF2_DOTTED_ATOM: return mbw_prefix(handle_cef2_dotted_atom_case)(c); case fCEF2_COLON_ATOM: return mbw_prefix(handle_cef2_colon_atom_case)(c); case ASIAN_CASES: return mbw_prefix(handle_asian_case)(c); case UNICODE_CASES: return mbw_prefix(handle_unicode_case)(c); default: /* nothing */ break; } char_filter_state = fDEF; return gcDISCARD; } static __inline__ good_char_t mbw_prefix(is_char_char)(const mbw_t *c) { /* return (mbw_isgraph(*c) ? gcTOKEN_END : */ /* (mbw_isspace(*c) ? (mbw_isspace(c[1]) ? gcDISCARD : gcTOKEN_END) : */ /* gcDISCARD)); */ return mbw_isgraph(*c) ? gcTOKEN_END : gcDISCARD; } /* * this code generates good_char() and w_good_char() * returns true if the character is part of a token * * gcTOKEN: character should be part of a token * gcTOKEN_END: like gcTOKEN, but token must end immediately * gcDISCARD: character is not part of a token * gcIGNORE: pretend there is no character here * * gcDISCARD is also returned if the line is empty */ good_char_t mbw_prefix(good_char)(mbw_t *c) { if( c && (*c != mbw_lit('\0')) ) { if( !(m_options & (1< -1); z++) { if( !(re[i].submatches & (1< hbuf + (MAX_TOKEN_LEN+1)*MAX_SUBMATCH+EXTRA_TOKEN_LEN) ) { q = hbuf; *q++ = DIAMOND; #if defined MBW_WIDE memset(©char_shiftstate, 0, sizeof(mbstate_t)); #endif } for(tstart = q - 1; *tstart != DIAMOND; --tstart); /* p[0] at least is nonzero */ do { switch( mbw_prefix(good_char)(p) ) { case gcIGNORE: /* pretend there is no character here */ break; case gcTOKEN: if( p && q < tstart + MAX_TOKEN_LEN ) { mbw_copychar(q,*p); break; } /* if we're here, fall through */ case gcTOKEN_END: if( p && q < tstart + MAX_TOKEN_LEN + 1) { mbw_copychar(q,*p); } /* don't break, always fall through */ case gcUNDEF: case gcDISCARD: reset = ( !(m_options & (1< max_order ) { o--; /* move all tokens down by one */ for(q = hbuf + 1; *q != DIAMOND; q++) {}; for(q++, qq = hbuf + 1; *q; *qq++ = *q++) {}; *qq = '\0'; tstart = q = qq; } tt = (*get_tt)(o); cq = q; *cq++ = CLASSEP; *cq++ = (char)(AMIN + tt.cls); *cq = '\0'; qq = hbuf; for(n = o; n > 0; n--) { /* let each category process the token */ tt.order = n; (*word_fun)(qq, tt, INVALID_RE); qq++; /* skip to next token and repeat */ while(*qq != DIAMOND ) { qq++; } } } if( reset ) { /* reset the current ngrams to zero */ tstart = hbuf; q = hbuf + 1; o = 0; } } } } while( p && (*(p++) != mbw_lit('\0')) ); *pq = q; *hbuf_order = o; } /*********************************************************** * FILTERING FUNCTIONS * ***********************************************************/ /* * this code generates mhe_line_filter() and w_mhe_line_filter() * translates a MIME message header extension encoded * token into its equivalent byte sequence. */ bool_t mbw_prefix(mhe_line_filter)(mbw_t *line) { mbw_t *p = line; mbw_t *q = line; mbw_t *r; while( *p ) { if( (p[0] == mbw_lit('=')) && (p[1] == mbw_lit('?')) ) { r = p + 2; while( *r && (*r != mbw_lit('?'))) { r++; } r++; /* I think lower case is illegal */ if( (*r == mbw_lit('Q')) || (*r == mbw_lit('q')) ) { if( *(++r) == mbw_lit('?') ) { r++; /* we are now committed. find end marker and replace with NUL */ for(p = r; *p; p++) { if( *p == mbw_lit('_') ) { *p = ' '; } else if( (p[0] == mbw_lit('?')) && (p[1] == mbw_lit('=')) ) { *p = mbw_lit('\0'); break; } } q = mbw_prefix(qp_line_filter2)(r, q); p += 2; } else { /* malformed encoding */ *q++ = *p++; } } else if( (*r == mbw_lit('B')) || (*r == mbw_lit('b')) ) { /* I think lower case is illegal, but we're lenient */ if( *(++r) == mbw_lit('?') ) { r++; /* we are now committed. find end marker and replace with NUL */ for(p = r; *p; p++) { if( (p[0] == mbw_lit('?')) && (p[1] == mbw_lit('=')) ) { *p = mbw_lit('\0'); break; } } q = mbw_prefix(b64_line_filter2)(r, q); p += 2; } else { /* malformed encoding */ *q++ = *p++; } } else { /* malformed encoding */ *q++ = *p++; } } else { *q++ = *p++; } } *q = '\0'; return 1; } int mbw_prefix(extract_header_label)(MBOX_State *mbox, mbw_t *line) { mbw_t *p = line; if( m_options & (1<skip_header) ) { mbox->skip_header = 1; return 0; } else { mbox->skip_header = 0; return mbw_prefix(mhe_line_filter)(line); } } return 0; } /*********************************************************** * MBOX PARSING FUNCTIONS * ***********************************************************/ /* * this code generates extract_mime_boundary() and w_extract_mime_boundary() * retrieves the MIME boundary if one is found. Doesn't cope with rfc2184 */ bool_t mbw_prefix(extract_mime_boundary)(MBOX_State *mbox,mbw_t *line) { const mbw_t *q; mbw_t *r; int size; bool_t quoted = 0; /* used both in calsulation and for return value */ q = mbw_prefix(mystrcasestr)(line, mbw_lit("boundary=")); if( q ) { /* we skip white space after = sign, even though it is not allowed */ for(q += 9; mbw_isspace(*q); q++); if( *q ) { quoted = (*q == mbw_lit('"')); r = mbox->boundary.mbw_prefix(identifier)[mbox->boundary.index]; size = 0; if( quoted ) { for(q++; *q && (*q != mbw_lit('"')) && (size < MAX_BOUNDARY_BUFSIZE); q++, size++) { *r++ = *q; } } else { for(; *q && !mbw_isspace(*q) && (size < MAX_BOUNDARY_BUFSIZE); q++, size++) { *r++ = *q; } } mbox->boundary.size[mbox->boundary.index] = size; if( ++mbox->boundary.index >= MAX_BOUNDARIES ) { mbox->boundary.index = 0; } quoted = (size > 0) ? 1 : 0; } else { /* this is bad */ quoted = 0; } } /* MIME messages look like this: head-preamble-sec1-...-secN-postamble, * and the RFCs recommend that preambles/postambles be ignored. * However, this introduces a loophole for spammers, who can define a * boundary, but then never cite it. "Robust" MUAs will show the * contents of the preamble, but we would not see it. To ignore preambles, * define the symbol IGNORE_MIME_PREAMBLE below. */ #undef IGNORE_MIME_PREAMBLE #if defined(IGNORE_MIME_PREAMBLE) return quoted; #else return 0; #endif } static bool_t mbw_prefix(check_old_style_digest)(const mbw_t *line) { #define THIRTYDASHES mbw_lit("------------------------------") #define SEVENTYDASHES mbw_lit("----------------------------------------------------------------------") /* messages are separated by either exactly 30 or exactly 70 dashes */ return ( ((mbw_strncmp(line, THIRTYDASHES, 30) == 0) && (line[30] == mbw_lit('\r') || line[30] == mbw_lit('\n'))) || ((mbw_strncmp(line, SEVENTYDASHES, 70) == 0) && (line[70] == mbw_lit('\r') || line[70] == mbw_lit('\n'))) ); } /* static */ /* bool_t mbw_prefix(outlook_message_announce)(const mbw_t *line) { */ /* #define OLDASHES mbw_lit("-----Original Message-----") */ /* #define OEDASHES mbw_lit("----- Original Message -----") */ /* return ( ((mbw_strncmp(line, OLDASHES, 26) == 0) && */ /* (line[26] == mbw_lit('\r') || line[26] == mbw_lit('\n'))) || */ /* ((mbw_strncmp(line, OEDASHES, 28) == 0) && */ /* (line[28] == mbw_lit('\r') || line[28] == mbw_lit('\n'))) ); */ /* } */ /* * this code generates check_mime_boundary() and w_check_mime_boundary() * The check is only approximate. */ bool_t mbw_prefix(check_mime_boundary)(MBOX_State *mbox, const mbw_t *line) { int c = (mbox->boundary.index > 0) ? (mbox->boundary.index - 1) : (MAX_BOUNDARIES - 1); int k = 0; const mbw_t *p = mbox->boundary.mbw_prefix(identifier)[c]; const mbw_t *q = line + 2; while(*q) { if( (k >= mbox->boundary.size[c]) || (*q != *p) ) { c--; if( c < 0 ) { c = MAX_BOUNDARIES - 1; } p = &mbox->boundary.mbw_prefix(identifier)[c][k]; if( c == mbox->boundary.index ) { if( (k >= mbox->boundary.size[c]) || (*q != *p) ) { mbox->boundary.was_end = 0; return 0; } } } else if( k == mbox->boundary.size[c] - 1) { if((q[1] == mbw_lit('-')) && (q[2] == mbw_lit('-'))) { mbox->boundary.was_end = 1; } else { mbox->boundary.was_end = 0; } return 1; } else { /* normally, a space isn't allowed in the boundary, but we're lenient */ q++; p++; k++; } } mbox->boundary.was_end = 0; return 0; } static bool_t mbw_prefix(check_armor_start)(const mbw_t *line) { int i; for(i = 0; i < num_armor_start; i++) { if( mbw_strncmp(line, mbw_prefix(armor_start)[i], mbw_strlen(mbw_prefix(armor_start)[i])) == 0 ) { return 1; } } if( (mbw_strncmp(line, mbw_lit("begin "), 6) == 0) && ISOCT(line[6]) && ISOCT(line[7]) && ISOCT(line[8]) ) { /* uuencoded */ return 1; } else if( (mbw_strncmp(line, mbw_lit("=ybegin"), 7) == 0) && ((line[7] == mbw_lit(' ')) || (line[7] == mbw_lit('2'))) && mbw_prefix(mystrcasestr)(line + 8, mbw_lit("line=")) && mbw_prefix(mystrcasestr)(line + 8, mbw_lit("size=")) && mbw_prefix(mystrcasestr)(line + 8, mbw_lit("name=")) ) { /* yEnc */ return 1; } return 0; } static bool_t mbw_prefix(check_armor_end)(const mbw_t *line) { int i; for(i = 0; i < num_armor_end; i++) { if( mbw_strncmp(line, mbw_prefix(armor_end)[i], mbw_strlen(mbw_prefix(armor_end)[i])) == 0 ) { return 1; } } if( (mbw_strncmp(line, mbw_lit("end"),3) == 0) && (!line[3] || (line[3] == mbw_lit('\n')) || (line[3] == mbw_lit('\r'))) ) { /* uuencoded */ return 1; } else if( (mbw_strncmp(line, mbw_lit("=yend "), 6) == 0) && mbw_prefix(mystrcasestr)(line + 8, mbw_lit("size=")) ) { /* yEnc */ return 1; } return 0; } /* return true if line should be shown, false otherwise */ static bool_t mbw_prefix(armor_filter)(const mbw_t *line) { if( (mbw_prefix(is_b64line)(line) == 1) || (mbw_prefix(is_uuline)(line) == 1) || (mbw_prefix(is_yencline)(line) == 1) ) { return 0; } return 1; } /* * this code generates extract_mime_types() and w_extract_mime_types() */ static void mbw_prefix(extract_mime_types)(mbw_t *line, MIME_Struct *ms) { int i; if( !mbw_strncasecmp(line, mbw_lit("Content-Type:"), 13) ) { line += 13; for(i = 0; i < num_mime_media; i++) { if( mbw_prefix(mystrcasestr)(line, mbw_prefix(mime_media)[i].type_subtype) ) { ms->type = mbw_prefix(mime_media)[i].medium; return; } } ms->type = ctOTHER; } else if( !mbw_strncasecmp(line, mbw_lit("Content-Transfer-Encoding:"), 26) ) { line += 26; if( mbw_prefix(mystrcasestr)(line, mbw_lit("base64")) ) { ms->encoding = ceB64; } else if( mbw_prefix(mystrcasestr)(line, mbw_lit("quoted-printable")) ) { ms->encoding = ceQP; } else if( mbw_prefix(mystrcasestr)(line, mbw_lit("binary")) ) { ms->encoding = ceBIN; } else if( mbw_prefix(mystrcasestr)(line, mbw_lit("7bit")) ) { ms->encoding = ceSEVEN; } else { ms->encoding = ceID; } } } /* scans the line for the character strip_header_char, and truncates * from that point on, and switches strip_header_char to the special value 1. * If special value 1, truncates line from second char onwards. * If special value 0, does nothing. */ static __inline__ void mbw_prefix(strip_from_char)(MBOX_State *mbox, mbw_t *q) { if( mbox->mbw_prefix(strip_header_char) == mbw_lit('\x01') ) { if( *q++ ) { *q = mbw_lit('\0'); } } else if( mbox->mbw_prefix(strip_header_char) ) { while(*q++) { if( *q == mbox->mbw_prefix(strip_header_char) ) { *q++ = mbw_lit('\n'); *q = mbw_lit('\0'); mbox->mbw_prefix(strip_header_char) = mbw_lit('\x01'); break; } } } } static Mheaderid mbw_prefix(identify_header)(mbw_t *line) { #define HDRID(s,l,h) !mbw_strncasecmp(line, s,l) ? h if( mbw_isspace(*line) ) { return hidCONTINUATION; } switch(mbw_tolower(line[0])) { case mbw_lit('b'): return HDRID(mbw_lit("BCC:"),4,hidBCC) : hidUNDEF; case mbw_lit('c'): return HDRID(mbw_lit("Content-"),8,hidCONTENT_) : HDRID(mbw_lit("CC:"),3,hidCC) : HDRID(mbw_lit("Categor"),7,hidCATEGORY) : HDRID(mbw_lit("Comments:"),9,hidCOMMENTS) : hidUNDEF; case mbw_lit('f'): return HDRID(mbw_lit("From:"),5,hidFROM) : hidUNDEF; case mbw_lit('i'): return HDRID(mbw_lit("In-Reply-To:"),12,hidIN_REPLY_TO) : HDRID(mbw_lit("Importance:"),11,hidIMPORTANCE) : hidUNDEF; case mbw_lit('k'): return HDRID(mbw_lit("Keywords:"),9,hidKEYWORDS) : hidUNDEF; case mbw_lit('l'): return HDRID(mbw_lit("List-"),5,hidLIST_) : hidUNDEF; case mbw_lit('m'): return HDRID(mbw_lit("Message-ID:"),11,hidMESSAGE_ID) : HDRID(mbw_lit("MIME-Version:"),13,hidMIME_VERSION) : hidUNDEF; case mbw_lit('n'): return HDRID(mbw_lit("Notes:"),6,hidNOTE) : hidUNDEF; case mbw_lit('o'): return HDRID(mbw_lit("Original-"),8,hidORIGINAL_) : hidUNDEF; case mbw_lit('p'): return HDRID(mbw_lit("Priority:"),9,hidPRIORITY) : hidUNDEF; case mbw_lit('r'): return HDRID(mbw_lit("Received:"),9,hidRECEIVED) : HDRID(mbw_lit("Return-Path:"),12,hidRETURN_PATH) : HDRID(mbw_lit("References:"),11,hidREFERENCES) : HDRID(mbw_lit("Return-Receipt-To:"),18,hidRETURN_RECEIPT_TO) : HDRID(mbw_lit("Reply-To:"),9,hidREPLY_TO) : HDRID(mbw_lit("Resent-"),7,hidRESENT_) : hidUNDEF; case mbw_lit('s'): return HDRID(mbw_lit("Subject:"),8,hidSUBJECT) : HDRID(mbw_lit("Sent:"),5,hidSENT) : HDRID(mbw_lit("Sender:"),7,hidSENDER) : hidUNDEF; case mbw_lit('t'): return HDRID(mbw_lit("To:"),3,hidTO) : HDRID(mbw_lit("Thread-"),7,hidTHREAD_) : hidUNDEF; case mbw_lit('x'): return HDRID(mbw_lit("X-MS"),4,hidX_MS) : HDRID(mbw_lit("X-"),2,hidX_) : hidUNDEF; case mbw_lit('u'): return HDRID(mbw_lit("User-Agent:"),11,hidUSER_AGENT) : hidUNDEF; } return hidUNDEF; } static HEADER_Type mbw_prefix(scan_header_type)(MBOX_State *mbox, mbw_t *line) { #define STRIP(q) {while(*q++) { if( *q == mbw_lit(';') ) { *q++ = mbw_lit('\n'); *q = mbw_lit('\0'); break; }}} #define HDRIDCHK(x,y) ((mbox->hid == x) && (mbox->hstate = y)) Mheaderid hid = mbw_prefix(identify_header)(line); if( hid == hidCONTINUATION ) { /* we don't update mbox->hid */ mbw_prefix(strip_from_char)(mbox, line); return htCONT; } mbox->hid = hid; if( HDRIDCHK(hidFROM,mhsFROM) || HDRIDCHK(hidTO,mhsTO) || HDRIDCHK(hidMESSAGE_ID,mhsUNDEF) || HDRIDCHK(hidIN_REPLY_TO,mhsUNDEF) || HDRIDCHK(hidSUBJECT,mhsSUBJECT) ) { mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); mbw_prefix(strip_from_char)(mbox, line); return htSTANDARD; } else if( HDRIDCHK(hidRETURN_PATH,mhsTRACE) || HDRIDCHK(hidRECEIVED,mhsTRACE) ) { mbox->mbw_prefix(strip_header_char) = mbw_lit(';'); mbw_prefix(strip_from_char)(mbox, line); return htTRACE; } else if( (mbox->hid == hidCONTENT_) && mbw_strchr(line + 8, mbw_lit(':')) ) { mbox->hstate = mhsMIME; mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); return htMIME; } else if( HDRIDCHK(hidSENDER,mhsUNDEF) || HDRIDCHK(hidREPLY_TO,mhsUNDEF) || HDRIDCHK(hidBCC,mhsUNDEF) || HDRIDCHK(hidCC,mhsUNDEF) || HDRIDCHK(hidREFERENCES,mhsUNDEF) ) { mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); mbw_prefix(strip_from_char)(mbox, line); return htEXTENDED; } else { /* if the line starts with a word missing a :, then it could be a malformed continuation line */ while( *line && !mbw_isspace(*line) && (*line != mbw_lit(':')) ) { line++; } if( *line == mbw_lit(':') ) { mbox->hstate = mhsUNDEF; mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); return htUNDEF; } else { return htCONT; } } } /* static */ /* HEADER_Type mbw_prefix(scan_header_type)(MBOX_State *mbox, mbw_t *line) { */ /* #define STRIP(q) {while(*q++) { if( *q == mbw_lit(';') ) { *q++ = mbw_lit('\n'); *q = mbw_lit('\0'); break; }}} */ /* #define HDRCHK(s,l,h) (!mbw_strncasecmp(line, s,l) && (mbox->hstate = h)) */ /* mbox->mm = mbw_prefix(identify_header)(line); */ /* if( mbw_isspace(*line) ) { */ /* mbw_prefix(strip_from_char)(mbox, line); */ /* return htCONT; */ /* } else if( HDRCHK(mbw_lit("From:"),5,mhsFROM) || */ /* HDRCHK(mbw_lit("To:"),3,mhsTO) || */ /* HDRCHK(mbw_lit("Message-ID:"),11,mhsUNDEF) || */ /* HDRCHK(mbw_lit("In-Reply-To:"),12,mhsUNDEF) || */ /* HDRCHK(mbw_lit("Subject:"),8,mhsSUBJECT) ) { */ /* mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); */ /* mbw_prefix(strip_from_char)(mbox, line); */ /* return htSTANDARD; */ /* } else if( HDRCHK(mbw_lit("Return-Path:"),12,mhsTRACE) || */ /* HDRCHK(mbw_lit("Received:"),9,mhsTRACE) ) { */ /* mbox->mbw_prefix(strip_header_char) = mbw_lit(';'); */ /* mbw_prefix(strip_from_char)(mbox, line); */ /* return htTRACE; */ /* } else if( !mbw_strncasecmp(line, mbw_lit("Content-"),8) && */ /* mbw_strchr(line + 8, mbw_lit(':')) ) { */ /* mbox->hstate = mhsMIME; */ /* mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); */ /* return htMIME; */ /* } else if( HDRCHK(mbw_lit("Sender:"),7,mhsUNDEF) || */ /* HDRCHK(mbw_lit("Reply-To:"),9,mhsUNDEF) || */ /* HDRCHK(mbw_lit("Bcc:"),4,mhsUNDEF) || */ /* HDRCHK(mbw_lit("Cc:"),3,mhsUNDEF) || */ /* HDRCHK(mbw_lit("References:"),11,mhsUNDEF) ) { */ /* mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); */ /* mbw_prefix(strip_from_char)(mbox, line); */ /* return htEXTENDED; */ /* } else { */ /* /\* if the line starts with a word missing a :, then */ /* it could be a malformed continuation line *\/ */ /* while( *line && !mbw_isspace(*line) && (*line != mbw_lit(':')) ) { line++; } */ /* if( *line == mbw_lit(':') ) { */ /* mbox->hstate = mhsUNDEF; */ /* mbox->mbw_prefix(strip_header_char) = mbw_lit('\0'); */ /* return htUNDEF; */ /* } else { */ /* return htCONT; */ /* } */ /* } */ /* } */ static int mbw_prefix(extract_mime_label)(mbw_t *line) { mbw_t *q; if( m_options & (1<state = msATTACH; mbox->substate = msuMIME; mbox->hstate = mhsUNDEF; mbox->armor = maUNDEF; mbox->skip_until_boundary = 0; mbox->corruption_check = 0; break; default: /* do nothing - so far so good */ break; } } else if( !mbw_strncmp(line, mbw_lit("From "), 5) ) { mbox->state = msHEADER; mbox->hid = hidUNDEF; mbox->substate = msuUNDEF; mbox->hstate = mhsUNDEF; mbox->armor = maUNDEF; mbox->skip_until_boundary = 0; mbox->corruption_check = 0; } } else if( mbox->corruption_check > 0 ) { mbox->corruption_check--; /* we filter out mail header extension codings - shouldn't do any harm */ mbw_prefix(mhe_line_filter)(line); switch(mbw_prefix(scan_header_type)(mbox, line)) { case htMIME: mbox->state = msATTACH; mbox->substate = msuMIME; mbox->hstate = mhsUNDEF; mbox->armor = maUNDEF; mbox->skip_until_boundary = 0; mbox->corruption_check = 0; break; default: /* do nothing - so far so good */ break; } } break; case msATTACH: if( line_empty ) { switch(mbox->body.type) { case ctMESSAGE_RFC822: /* our mime parse isn't recursive - instead we start a new message and associate with it all later attachments */ mbox->state = msHEADER; break; case ctAPPLICATION_MSWORD: mbox->state = msBODY; /* override encoding if undefined */ if( mbox->body.encoding == ceUNDEF ) { mbox->body.encoding = ceB64; } break; default: mbox->state = msBODY; break; } mbox->substate = msuUNDEF; mbox->hid = hidUNDEF; mbox->hstate = mhsUNDEF; mbox->armor = maUNDEF; mbox->skip_until_boundary = 0; mbox->corruption_check = 0; } break; } mbox->prev_line_empty = line_empty; /* for next time */ /* STEP 2: now clean up and prepare the line according to current state * and substate. * After cleanup, the variable process_line indicates if the line * should be ignored. * The substate can evolve while the current state is unchanging. */ switch(mbox->state) { case msUNDEF: /* line is not processed */ break; case msHEADER: switch(mbox->substate) { case msuUNDEF: /* flush caches */ process_line = mbw_prefix(flush_cache)(&(mbox->mbw_prefix(b64_dc)), line, 1) || mbw_prefix(flush_cache)(&(mbox->mbw_prefix(qp_dc)), line, 1); if( process_line ) { /* we still remember previous type/encoding, decide if we need filter */ force_filter = select_xml_defaults(&mbox->body); octet_stream = (mbox->body.type == ctOCTET_STREAM) || (mbox->body.type == ctAPPLICATION_MSWORD); } /* there are no default mime types for headers */ mbox->header.type = mbox->body.type = ctUNDEF; mbox->header.encoding = mbox->body.encoding = ceUNDEF; /* switch to normal state next time */ mbox->substate = msuOTHER; mbox->corruption_check = 0; mbox->skip_header = 0; mbox->plainstate = psPLAIN; /* don't break, as the current line could contain interesting headers already */ default: /* switch substate if necessary */ switch(mbw_prefix(scan_header_type)(mbox, line)) { case htSTANDARD: if( m_options & (1<substate = (mbox->hstate == mhsSUBJECT) ? msuTRACK : msuOTHER; } else { mbox->substate = msuTRACK; } break; case htEXTENDED: mbox->substate = (m_options & (1<substate = (m_options & (1<substate = msuMIME; break; case htCONT: /* nothing */ break; case htUNDEF: mbox->substate = msuOTHER; break; } /* process substate */ switch(mbox->substate) { case msuTRACK: process_line = mbw_prefix(mhe_line_filter)(line); break; case msuMIME: mbw_prefix(mhe_line_filter)(line); mbw_prefix(extract_mime_types)(line, &mbox->header); mbox->skip_until_boundary = mbw_prefix(extract_mime_boundary)(mbox, line) || mbox->skip_until_boundary; /* this comes last, modifies line */ process_line = mbw_prefix(extract_mime_label)(line); break; case msuUNDEF: case msuOTHER: mbox->hstate = mhsXHEADER; case msuARMOR: process_line = mbw_prefix(extract_header_label)(mbox, line); break; } } break; case msBODY: switch(mbox->substate) { case msuUNDEF: /* flush caches */ process_line = mbw_prefix(flush_cache)(&(mbox->mbw_prefix(b64_dc)), line, 1) || mbw_prefix(flush_cache)(&(mbox->mbw_prefix(qp_dc)), line, 1); if( process_line ) { /* we still remember previous type/encoding, decide if we need filter */ force_filter = select_xml_defaults(&mbox->body); octet_stream = (mbox->body.type == ctOCTET_STREAM) || (mbox->body.type == ctAPPLICATION_MSWORD); } /* bodies by default inherit the header mime types */ if( mbox->body.type == ctUNDEF ) { mbox->body.type = mbox->header.type; } if( mbox->body.encoding == ceUNDEF ) { mbox->body.encoding = mbox->header.encoding; } /* switch to normal state next time */ mbox->substate = msuTRACK; mbox->plainstate = psPLAIN; break; case msuARMOR: switch(mbox->armor) { case maUNDEF: process_line = 1; break; case maENABLED: process_line = mbw_prefix(armor_filter)(line); break; } break; default: if( mbox->skip_until_boundary ) { process_line = 0; } else { switch(mbox->body.type) { case ctOCTET_STREAM: case ctAPPLICATION_MSWORD: if( !(m_options & (1<body.encoding) { case ceBIN: process_line = 1; break; case ceUNDEF: case ceSEVEN: case ceID: process_line = ((m_options & (1<mbw_prefix(qp_dc)), line); break; case ceB64: process_line = mbw_prefix(b64_line_filter)(&(mbox->mbw_prefix(b64_dc)), line); break; } break; case ctTEXT_RICH: case ctTEXT_HTML: case ctTEXT_XML: case ctTEXT_SGML: case ctTEXT_UNKNOWN: switch(mbox->body.encoding) { case ceBIN: case ceUNDEF: case ceSEVEN: case ceID: process_line = 1; break; case ceQP: process_line = mbw_prefix(qp_line_filter)(&(mbox->mbw_prefix(qp_dc)), line); break; case ceB64: process_line = mbw_prefix(b64_line_filter)(&(mbox->mbw_prefix(b64_dc)), line); break; } break; case ctIMAGE: case ctAUDIO: case ctVIDEO: case ctMODEL: case ctOTHER: process_line = 0; break; } } break; } break; case msATTACH: switch(mbox->substate) { case msuUNDEF: /* flush caches */ process_line = mbw_prefix(flush_cache)(&(mbox->mbw_prefix(b64_dc)), line, 1) || mbw_prefix(flush_cache)(&(mbox->mbw_prefix(qp_dc)), line, 1); if( process_line ) { /* we still remember previous type/encoding, decide if we need filter */ force_filter = select_xml_defaults(&mbox->body); octet_stream = (mbox->body.type == ctOCTET_STREAM) || (mbox->body.type == ctAPPLICATION_MSWORD); } /* attachments by default inherit the header mime types */ mbox->body.type = mbox->header.type; mbox->body.encoding = mbox->header.encoding; /* switch to normal state next time */ /* this has a nice side-effect: if the first line is a htCONT, then it gets displayed and that's the right thing to do, because if the first line is a htCONT, then the ATTACH header is not a header at all, ie the paragraph was misidentified. */ mbox->substate = msuTRACK; mbox->plainstate = psPLAIN; break; default: /* switch substate if necessary */ switch(mbw_prefix(scan_header_type)(mbox, line)) { case htSTANDARD: mbox->substate = msuTRACK; break; case htEXTENDED: mbox->substate = (m_options & (1<substate = (m_options & (1<substate = msuMIME; break; case htCONT: /* nothing */ break; case htUNDEF: mbox->substate = msuOTHER; break; } /* process substate */ switch(mbox->substate) { case msuTRACK: process_line = 1; break; case msuUNDEF: case msuOTHER: case msuARMOR: process_line = 0; break; case msuMIME: mbw_prefix(mhe_line_filter)(line); mbw_prefix(extract_mime_types)(line, &mbox->body); mbox->skip_until_boundary = mbw_prefix(extract_mime_boundary)(mbox, line) || mbox->skip_until_boundary; /* this comes last, modifies line */ process_line = mbw_prefix(extract_mime_label)(line); break; } break; } break; } /* STEP 3: activate filters */ if( octet_stream ) { process_line = mbw_prefix(strings1_filter)(line); } if( !process_line && line_empty ) { /* don't touch this: the end of file is artificially marked by an empty line */ process_line = mbw_prefix(flush_cache)(&(mbox->mbw_prefix(b64_dc)), line, 1) || mbw_prefix(flush_cache)(&(mbox->mbw_prefix(qp_dc)), line, 1); } if( force_filter != xmlUNDEF ) { reset_xml_character_filter(xml, force_filter); } else { if( mbox->state == msBODY ) { if( mbox->skip_until_boundary ) { process_line = 0; } else { reset_xml_character_filter(xml, select_xml_defaults(&(mbox->body))); } } else { reset_xml_character_filter(xml, xmlDISABLE); } } /* we also process empty lines, as they can be helpful for n-gram boundaries */ return process_line || line_empty; } /*********************************************************** * HTML PARSING FUNCTIONS * ***********************************************************/ /* * this code generates decode_html_entity() and w_decode_html_entity() * (this is ugly, but I am _not_ building a string hash, sheesh). * * note: the conversion from unicode to multibyte depends on the current * locale, but also assumes that wchar_t *is* unicode internally. Both assumptions * can be false on weird compilers. In case the locale is incapable of doing the job, * we convert based on the hex code. * * note2: the conversion is not always faithful, even so. We try not to convert * characters which could look like control codes to the html parser later. * * note3: upon successful conversion, *qq is incremented by the * character, and *lline is incremented by the entity length - 1, so * that you still need to increment *lline by one to obtain the next * parseable input. If conversion is unsuccessful, the pointers are not * modified. Check the return value for success or failure. * * note4: this function really needs to be reworked a bit. It ought to be possible * to do the right thing even for machines with missing wchar_t. */ static bool_t mbw_prefix(decode_html_entity)(mbw_t **lline, mbw_t **qq) { bool_t retval = 0; mbw_t *line = *lline; mbw_t *q = *qq; /* printf("\nline = %p q = %p (line - q) = %d\n", line, q, line - q); */ /* printf("[[[%s]]]\n", line); */ #if defined HAVE_MBRTOWC mbw_t *r = NULL; #if defined MBW_MB int s,t; mbw_t scratch[16]; /* C compiler complains about MB_CUR_MAX */ #endif wchar_t c = 0; /* this must always be wchar_t */ switch(line[1]) { case mbw_lit('#'): if( (line[2] == mbw_lit('x')) || (line[2] == mbw_lit('X')) ) { #if defined MBW_MB || (defined MBW_WIDE && defined HAVE_WCSTOL) c = (wchar_t)mbw_strtol(line + 3, &r, 16); #else /* can't convert, but skip the payload anyway */ for(r = line + 3; isxdigit(*r); r++); #endif } else { #if defined MBW_MB || (defined MBW_WIDE && defined HAVE_WCSTOL) c = (wchar_t)mbw_strtol(line + 2, &r, 10); #else /* can't convert, but skip the payload anyway */ for(r = line + 2; isdigit(*r); r++); #endif } break; #define ENTITY(x,y,z) if( !mbw_strncmp((line + 3), (x + 2), (y - 2)) ) \ { c = (z); r = line + (y) + 1; } case mbw_lit('a'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("aacute"),6,0xe1); break; case mbw_lit('c'): ENTITY(mbw_lit("acute"),5,0xb4) else ENTITY(mbw_lit("acirc"),4,0xe2); break; case mbw_lit('e'): ENTITY(mbw_lit("aelig"),5,0xe6); break; case mbw_lit('g'): ENTITY(mbw_lit("agrave"),6,0xe0); break; case mbw_lit('l'): ENTITY(mbw_lit("alpha"),5,0x03b1) else ENTITY(mbw_lit("alefsym"),7,0x2135); break; case mbw_lit('m'): ENTITY(mbw_lit("amp"),3,0x26); break; case mbw_lit('n'): ENTITY(mbw_lit("ang"),3,0x2220) else ENTITY(mbw_lit("and"),3,0x2227); break; case mbw_lit('r'): ENTITY(mbw_lit("aring"),5,0xe5); break; case mbw_lit('s'): ENTITY(mbw_lit("asymp"),5,0x2248); break; case mbw_lit('t'): ENTITY(mbw_lit("atilde"),6,0xe3); break; case mbw_lit('u'): ENTITY(mbw_lit("auml"),4,0xe4); break; } break; case mbw_lit('A'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Aacute"),6,0xc1); break; case mbw_lit('c'): ENTITY(mbw_lit("Acirc"),5,0xc2); break; case mbw_lit('E'): ENTITY(mbw_lit("AElig"),5,0xc6); break; case mbw_lit('g'): ENTITY(mbw_lit("Agrave"),6,0xc0); break; case mbw_lit('l'): ENTITY(mbw_lit("Alpha"),5,0x0391); break; case mbw_lit('r'): ENTITY(mbw_lit("Aring"),5,0xc5); break; case mbw_lit('t'): ENTITY(mbw_lit("Atilde"),6,0xc3); break; case mbw_lit('u'): ENTITY(mbw_lit("Auml"),4,0xc4); break; } break; case mbw_lit('b'): switch(line[2]) { case mbw_lit('d'): ENTITY(mbw_lit("bdquo"),5,0x201e); break; case mbw_lit('e'): ENTITY(mbw_lit("beta"),4,0x03b2); break; case mbw_lit('u'): ENTITY(mbw_lit("bull"),4,0x2022); break; } break; case mbw_lit('B'): switch(line[2]) { case mbw_lit('e'): ENTITY(mbw_lit("Beta"),4,0x0392); break; case mbw_lit('r'): ENTITY(mbw_lit("Brvbar"),6,0xa6); break; } break; case mbw_lit('c'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("cap"),3,0x2229); break; case mbw_lit('c'): ENTITY(mbw_lit("ccedil"),6,0xe7); break; case mbw_lit('e'): ENTITY(mbw_lit("cent"),4,0xa2) else ENTITY(mbw_lit("cedil"),5,0xb8); break; case mbw_lit('h'): ENTITY(mbw_lit("chi"),3,0x03c7); break; case mbw_lit('i'): ENTITY(mbw_lit("circ"),4,0x02c6); break; case mbw_lit('l'): ENTITY(mbw_lit("clubs"),5,0x2663); break; case mbw_lit('o'): ENTITY(mbw_lit("copy"),4,0xa9) else ENTITY(mbw_lit("cong"),4,0x2245); break; case mbw_lit('r'): ENTITY(mbw_lit("crarr"),5,0x21b5); break; case mbw_lit('u'): ENTITY(mbw_lit("curren"),6,0xa4) else ENTITY(mbw_lit("cup"),3,0x222a); break; } break; case mbw_lit('C'): switch(line[2]) { case mbw_lit('c'): ENTITY(mbw_lit("Ccedil"),6,0xc7); break; case mbw_lit('h'): ENTITY(mbw_lit("Chi"),3,0x03a7); break; } break; case mbw_lit('d'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("darr"),4,0x2193) else ENTITY(mbw_lit("dagger"),6,0x2020); break; case mbw_lit('A'): ENTITY(mbw_lit("dArr"),4,0x21d3); break; case mbw_lit('e'): ENTITY(mbw_lit("delta"),5,0x03b4); break; case mbw_lit('i'): ENTITY(mbw_lit("divide"),6,0xf7) else ENTITY(mbw_lit("diams"),5,0x2666); break; } break; case mbw_lit('D'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Dagger"),6,0x2021); break; case mbw_lit('e'): ENTITY(mbw_lit("Deg"),3,0xb0) else ENTITY(mbw_lit("Delta"),5,0x0394); break; } break; case mbw_lit('e'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("eacute"),6,0xe9); break; case mbw_lit('c'): ENTITY(mbw_lit("ecirc"),5,0xea); break; case mbw_lit('g'): ENTITY(mbw_lit("egrave"),6,0xe8); break; case mbw_lit('m'): ENTITY(mbw_lit("empty"),5,0x2205) else ENTITY(mbw_lit("emsp"),4,0x2003); break; case mbw_lit('n'): ENTITY(mbw_lit("ensp"),4,0x2002); break; case mbw_lit('p'): ENTITY(mbw_lit("epsilon"),7,0x03b5); break; case mbw_lit('q'): ENTITY(mbw_lit("equiv"),5,0x2261); break; case mbw_lit('t'): ENTITY(mbw_lit("eth"),3,0xf0) else ENTITY(mbw_lit("eta"),3,0x03b7); break; case mbw_lit('u'): ENTITY(mbw_lit("euml"),4,0xeb) else ENTITY(mbw_lit("euro"),4,0x20ac); break; case mbw_lit('x'): ENTITY(mbw_lit("exist"),5,0x2203); break; } break; case mbw_lit('E'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Eacute"),6,0xc9); break; case mbw_lit('c'): ENTITY(mbw_lit("Ecirc"),5,0xca); break; case mbw_lit('g'): ENTITY(mbw_lit("Egrave"),6,0xc8); break; case mbw_lit('p'): ENTITY(mbw_lit("Epsilon"),7,0x0395); break; case mbw_lit('T'): ENTITY(mbw_lit("ETH"),3,0xd0); break; case mbw_lit('t'): ENTITY(mbw_lit("Eta"),3,0x0397); break; case mbw_lit('u'): ENTITY(mbw_lit("Euml"),4,0xcb); break; } break; case mbw_lit('f'): switch(line[2]) { case mbw_lit('n'): ENTITY(mbw_lit("fnof"),4,0x0192); break; case mbw_lit('o'): ENTITY(mbw_lit("forall"),6,0x2200); break; case mbw_lit('r'): ENTITY(mbw_lit("frac14"),6,0xbc) else ENTITY(mbw_lit("frac12"),6,0xbd) else ENTITY(mbw_lit("frac34"),6,0xbe) else ENTITY(mbw_lit("frasl"),5,0x2044); break; } break; case mbw_lit('F'): /* nothing */ break; case mbw_lit('g'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("gamma"),5,0x3b3); break; case mbw_lit('e'): ENTITY(mbw_lit("ge"),2,0x2265); break; case mbw_lit('t'): ENTITY(mbw_lit("gt"),2,0x3e); break; } break; case mbw_lit('G'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Gamma"),5,0x0393); break; } break; case mbw_lit('h'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("harr"),4,0x2194); break; case mbw_lit('A'): ENTITY(mbw_lit("hArr"),4,0x21d4); break; case mbw_lit('e'): ENTITY(mbw_lit("hearts"),6,0x2665) else ENTITY(mbw_lit("hellip"),6,0x2026); break; } break; case mbw_lit('H'): /* nothing */ break; case mbw_lit('i'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("iacute"),6,0xed); break; case mbw_lit('c'): ENTITY(mbw_lit("icirc"),5,0xee); break; case mbw_lit('e'): ENTITY(mbw_lit("iexcl"),5,0xa1); break; case mbw_lit('g'): ENTITY(mbw_lit("igrave"),6,0xec); break; case mbw_lit('m'): ENTITY(mbw_lit("image"),5,0x2111); break; case mbw_lit('n'): ENTITY(mbw_lit("infin"),5,0x221e) else ENTITY(mbw_lit("int"),3,0x222b); break; case mbw_lit('o'): ENTITY(mbw_lit("iota"),4,0x03b9); break; case mbw_lit('q'): ENTITY(mbw_lit("iquest"),6,0xbf); break; case mbw_lit('s'): ENTITY(mbw_lit("isin"),4,0x2208); break; case mbw_lit('u'): ENTITY(mbw_lit("iuml"),4,0xef); break; } break; case mbw_lit('I'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Iacute"),6,0xcd); break; case mbw_lit('c'): ENTITY(mbw_lit("Icirc"),5,0xce); break; case mbw_lit('g'): ENTITY(mbw_lit("Igrave"),6,0xcc); break; case mbw_lit('o'): ENTITY(mbw_lit("Iota"),4,0x0399); break; case mbw_lit('u'): ENTITY(mbw_lit("Iuml"),4,0xcf); break; } break; case mbw_lit('j'): /* nothing */ break; case mbw_lit('J'): /* nothing */ break; case mbw_lit('k'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("kappa"),5,0x03ba); break; } break; case mbw_lit('K'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Kappa"),5,0x039a); break; } break; case mbw_lit('l'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("lambda"),6,0x03bb) else ENTITY(mbw_lit("lang"),4,0x2329); break; case mbw_lit('A'): ENTITY(mbw_lit("lArr"),4,0x21d0); break; case mbw_lit('c'): ENTITY(mbw_lit("lceil"),5,0x2308); break; case mbw_lit('d'): ENTITY(mbw_lit("ldquo"),5,0x201c); break; case mbw_lit('e'): ENTITY(mbw_lit("le"),2,0x2264); break; case mbw_lit('f'): ENTITY(mbw_lit("lfloor"),6,0x2309); break; case mbw_lit('o'): ENTITY(mbw_lit("lowast"),6,0x2217) else ENTITY(mbw_lit("loz"),3,0x25ca); break; case mbw_lit('r'): ENTITY(mbw_lit("lrm"),3,0x200e); break; case mbw_lit('s'): ENTITY(mbw_lit("lsquo"),5,0x2018) else ENTITY(mbw_lit("lsaquo"),6,0x2039); break; case mbw_lit('t'): ENTITY(mbw_lit("lt"),2,0x3c); break; } break; case mbw_lit('L'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Laquo"),5,0xab) else ENTITY(mbw_lit("Lambda"),6,0x039b) else ENTITY(mbw_lit("Larr"),4,0x2190); break; } break; case mbw_lit('m'): switch(line[2]) { case mbw_lit('d'): ENTITY(mbw_lit("mdash"),5,0x2014); break; case mbw_lit('i'): ENTITY(mbw_lit("minus"),5,0x2212); break; case mbw_lit('u'): ENTITY(mbw_lit("mu"),2,0x03bc); break; } break; case mbw_lit('M'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Macr"),4,0xaf); break; case mbw_lit('i'): ENTITY(mbw_lit("Micro"),5,0xb5) else ENTITY(mbw_lit("Middot"),6,0xb7); break; case mbw_lit('u'): ENTITY(mbw_lit("Mu"),2,0x039c); break; } break; case mbw_lit('n'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("nabla"),5,0x2207); break; case mbw_lit('b'): ENTITY(mbw_lit("nbsp"),4,0xa0); break; case mbw_lit('d'): ENTITY(mbw_lit("ndash"),5,0x2013); break; case mbw_lit('e'): ENTITY(mbw_lit("ne"),2,0x2260); break; case mbw_lit('i'): ENTITY(mbw_lit("ni"),2,0x220b); break; case mbw_lit('o'): ENTITY(mbw_lit("not"),3,0xac) else ENTITY(mbw_lit("notin"),5,0x2209); break; case mbw_lit('s'): ENTITY(mbw_lit("nsub"),4,0x2284); break; case mbw_lit('t'): ENTITY(mbw_lit("ntilde"),6,0xf1); break; case mbw_lit('u'): ENTITY(mbw_lit("nu"),2,0x03bd); break; } break; case mbw_lit('N'): switch(line[2]) { case mbw_lit('t'): ENTITY(mbw_lit("Ntilde"),6,0xd1); break; case mbw_lit('u'): ENTITY(mbw_lit("Nu"),2,0x039d); break; } break; case mbw_lit('o'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("oacute"),6,0xf3); break; case mbw_lit('c'): ENTITY(mbw_lit("ocirc"),5,0xf4); break; case mbw_lit('e'): ENTITY(mbw_lit("oelig"),5,0x0153); break; case mbw_lit('g'): ENTITY(mbw_lit("ograve"),6,0xf2); break; case mbw_lit('l'): ENTITY(mbw_lit("oline"),5,0x203e); break; case mbw_lit('m'): ENTITY(mbw_lit("omicron"),7,0x03bf) else ENTITY(mbw_lit("omega"),5,0x03c9); break; case mbw_lit('p'): ENTITY(mbw_lit("oplus"),5,0x2295); break; case mbw_lit('r'): ENTITY(mbw_lit("ordf"),4,0xaa) else ENTITY(mbw_lit("ordm"),4,0xba) else ENTITY(mbw_lit("or"),2,0x2228); break; case mbw_lit('s'): ENTITY(mbw_lit("oslash"),6,0xf8); break; case mbw_lit('t'): ENTITY(mbw_lit("otilde"),6,0xf5) else ENTITY(mbw_lit("otimes"),6,0x2297); break; case mbw_lit('u'): ENTITY(mbw_lit("ouml"),4,0xf6); break; } break; case mbw_lit('O'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Oacute"),6,0xd3); break; case mbw_lit('c'): ENTITY(mbw_lit("Ocirc"),5,0xd4); break; case mbw_lit('E'): ENTITY(mbw_lit("OElig"),5,0x0152); break; case mbw_lit('m'): ENTITY(mbw_lit("Omicron"),7,0x039f) else ENTITY(mbw_lit("Omega"),5,0x03a9); break; case mbw_lit('g'): ENTITY(mbw_lit("Ograve"),6,0xd2); break; case mbw_lit('s'): ENTITY(mbw_lit("Oslash"),6,0xd8); break; case mbw_lit('t'): ENTITY(mbw_lit("Otilde"),6,0xd5); break; case mbw_lit('u'): ENTITY(mbw_lit("Ouml"),4,0xd6); break; } break; case mbw_lit('p'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("part"),4,0x2202); break; case mbw_lit('e'): ENTITY(mbw_lit("perp"),4,0x22a5) else ENTITY(mbw_lit("permil"),6,0x2030); break; case mbw_lit('h'): ENTITY(mbw_lit("phi"),3,0x03c6); break; case mbw_lit('i'): ENTITY(mbw_lit("pi"),2,0x03c0) else ENTITY(mbw_lit("piv"),3,0x03d6); break; case mbw_lit('r'): ENTITY(mbw_lit("prime"),5,0x2032) else ENTITY(mbw_lit("prod"),4,0x220f); break; case mbw_lit('s'): ENTITY(mbw_lit("psi"),3,0x03c8); break; } break; case mbw_lit('P'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Para"),4,0xb6); break; case mbw_lit('h'): ENTITY(mbw_lit("Phi"),3,0x03a6); break; case mbw_lit('i'): ENTITY(mbw_lit("Pi"),2,0x03a0); break; case mbw_lit('l'): ENTITY(mbw_lit("Plusmn"),6,0xb1); break; case mbw_lit('o'): ENTITY(mbw_lit("Pound"),5,0xa3); break; case mbw_lit('r'): ENTITY(mbw_lit("Prime"),5,0x2033) else ENTITY(mbw_lit("Prop"),4,0x221d); break; case mbw_lit('s'): ENTITY(mbw_lit("Psi"),3,0x03a8); break; } break; case mbw_lit('q'): switch(line[2]) { case mbw_lit('u'): ENTITY(mbw_lit("quot"),4,0x22); break; } break; case mbw_lit('Q'): /* nothing */ break; case mbw_lit('r'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("rarr"),4,0x2192) else ENTITY(mbw_lit("radic"),5,0x221a) else ENTITY(mbw_lit("rang"),4,0x232a); break; case mbw_lit('A'): ENTITY(mbw_lit("rArr"),4,0x21d2); break; case mbw_lit('c'): ENTITY(mbw_lit("rceil"),5,0x2309); break; case mbw_lit('d'): ENTITY(mbw_lit("rdquo"),5,0x201d); break; case mbw_lit('e'): ENTITY(mbw_lit("real"),4,0x211C) else ENTITY(mbw_lit("reg"),3,0xae); break; case mbw_lit('f'): ENTITY(mbw_lit("rfloor"),6,0x230a); break; case mbw_lit('h'): ENTITY(mbw_lit("rho"),3,0x03c1); break; case mbw_lit('l'): ENTITY(mbw_lit("rlm"),3,0x200f); break; case mbw_lit('s'): ENTITY(mbw_lit("rsquo"),5,0x2019) else ENTITY(mbw_lit("rsaquo"),6,0x203a); break; } break; case mbw_lit('R'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Raquo"),5,0xbb); break; case mbw_lit('e'): ENTITY(mbw_lit("Reg"),3,0xae); break; case mbw_lit('h'): ENTITY(mbw_lit("Rho"),3,0x03a1); break; } break; case mbw_lit('s'): switch(line[2]) { case mbw_lit('b'): ENTITY(mbw_lit("sbquo"),5,0x201a); break; case mbw_lit('c'): ENTITY(mbw_lit("scaron"),6,0x0161); break; case mbw_lit('d'): ENTITY(mbw_lit("sdot"),4,0x22c5); break; case mbw_lit('e'): ENTITY(mbw_lit("sect"),4,0xa7); break; case mbw_lit('h'): ENTITY(mbw_lit("shy"),3,0xad); break; case mbw_lit('i'): ENTITY(mbw_lit("sigmaf"),6,0x03c2) else ENTITY(mbw_lit("sigma"),5,0x03c3) else ENTITY(mbw_lit("sim"),3,0x223c); break; case mbw_lit('p'): ENTITY(mbw_lit("spades"),6,0x2660); break; case mbw_lit('u'): ENTITY(mbw_lit("sup2"),4,0xb2) else ENTITY(mbw_lit("sup3"),4,0xb3) else ENTITY(mbw_lit("sup1"),4,0xb9) else ENTITY(mbw_lit("sum"),3,0x2211) else ENTITY(mbw_lit("sub"),3,0x2282) else ENTITY(mbw_lit("sup"),3,0x2283) else ENTITY(mbw_lit("sube"),4,0x2286) else ENTITY(mbw_lit("supe"),4,0x2287); break; case mbw_lit('z'): ENTITY(mbw_lit("szlig"),5,0xdf); break; } break; case mbw_lit('S'): switch(line[2]) { case mbw_lit('c'): ENTITY(mbw_lit("Scaron"),6,0x0160); break; case mbw_lit('i'): ENTITY(mbw_lit("Sigma"),5,0x03a3); break; } break; case mbw_lit('t'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("tau"),3,0x03c4); break; case mbw_lit('h'): ENTITY(mbw_lit("thorn"),5,0xfe) else ENTITY(mbw_lit("theta"),5,0x03b8) else ENTITY(mbw_lit("thetasym"),8,0x03d1) else ENTITY(mbw_lit("there4"),6,0x2234) else ENTITY(mbw_lit("thinsp"),6,0x2009); break; case mbw_lit('i'): ENTITY(mbw_lit("times"),5,0xd7) else ENTITY(mbw_lit("tilde"),5,0x02dc); break; case mbw_lit('r'): ENTITY(mbw_lit("trade"),5,0x2122); break; } break; case mbw_lit('T'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Tau"),3,0x03a4); break; case mbw_lit('h'): ENTITY(mbw_lit("Theta"),5,0x0398); break; case mbw_lit('H'): ENTITY(mbw_lit("THORN"),5,0xde); break; } break; case mbw_lit('u'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("uacute"),6,0xfa) else ENTITY(mbw_lit("uarr"),4,0x2191); break; case mbw_lit('A'): ENTITY(mbw_lit("uArr"),4,0x21d1); break; case mbw_lit('c'): ENTITY(mbw_lit("ucirc"),5,0xfb); break; case mbw_lit('g'): ENTITY(mbw_lit("ugrave"),6,0xf9); break; case mbw_lit('m'): ENTITY(mbw_lit("uml"),3,0xa8); break; case mbw_lit('p'): ENTITY(mbw_lit("upsilon"),7,0xc5) else ENTITY(mbw_lit("upsih"),5,0x03d2); break; case mbw_lit('u'): ENTITY(mbw_lit("uuml"),4,0xfc); break; } break; case mbw_lit('U'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Uacute"),6,0xda); break; case mbw_lit('c'): ENTITY(mbw_lit("Ucirc"),5,0xdb); break; case mbw_lit('g'): ENTITY(mbw_lit("Ugrave"),6,0xd9); break; case mbw_lit('p'): ENTITY(mbw_lit("Upsilon"),7,0xa5); break; case mbw_lit('u'): ENTITY(mbw_lit("Uuml"),4,0xdc); break; } break; case mbw_lit('v'): /* nothing */ break; case mbw_lit('V'): /* nothing */ break; case mbw_lit('w'): switch(line[2]) { case mbw_lit('e'): ENTITY(mbw_lit("weierp"),6,0x2118); break; } break; case mbw_lit('W'): /* nothing */ break; case mbw_lit('x'): switch(line[2]) { case mbw_lit('i'): ENTITY(mbw_lit("xi"),2,0x03be); break; } break; case mbw_lit('X'): switch(line[2]) { case mbw_lit('i'): ENTITY(mbw_lit("Xi"),2,0x039e); break; } break; case mbw_lit('y'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("yacute"),6,0xfd); break; case mbw_lit('e'): ENTITY(mbw_lit("yen"),3,0xa5); break; case mbw_lit('u'): ENTITY(mbw_lit("yuml"),4,0xff); break; } break; case mbw_lit('Y'): switch(line[2]) { case mbw_lit('a'): ENTITY(mbw_lit("Yacute"),6,0xdd); break; case mbw_lit('u'): ENTITY(mbw_lit("Yuml"),4,0x0178); break; } break; case mbw_lit('z'): switch(line[2]) { case mbw_lit('e'): ENTITY(mbw_lit("zeta"),4,0x03b6); break; case mbw_lit('w'): ENTITY(mbw_lit("zwnj"),4,0x200c) else ENTITY(mbw_lit("zwj"),3,0x200d); break; } break; case mbw_lit('Z'): switch(line[2]) { case mbw_lit('e'): ENTITY(mbw_lit("Zeta"),4,0x0396); break; } break; default: break; } /* some values of c are not allowed, because they interfere with the html parser */ switch(c) { case L'\0': case L'\001': /* TOKENSEP */ case L'\002': /* CLASSEP */ case L'\003': /* DIAMOND */ /* reserved control codes */ c = L' '; break; case L'<': c = L'('; break; case L'>': c = L')'; break; default: break; } /* normally, entities end with ';', which will be skipped after we exit this function. However, we're lenient: if we don't point to ';', then we back up by one so that later we don't skip this character. Note this is safe, because ENTITY makes r point to at least line +1, and otherwise r is NULL */ if( r && (*r != mbw_lit(';')) ) { r--; } #if defined MBW_WIDE if( c && r ) { *q++ = c; line = r; retval = 1; } else { /* do nothing */ } #else /* now if c is nonzero, then we found the entity */ if( c && r ) { if( c == 0xa0 ) { /* shortcut for   */ *q++ = mbw_lit(' '); } else { s = wcrtomb(scratch,c,NULL); if( (s > -1) && (q + s <= r) ) { for(t = 0; t < s; t++) { *q++ = scratch[t]; } } else { /* locale doesn't recognize this char */ s = c; if( s < 0xFF ) { *q++ = (mbw_t)s; } } } line = r; retval = 1; } else { /* do nothing */ } #endif #else /* HAVE_MBRTOWC is not defined */ /* do nothing */ #endif /* reminder: if no conversion is possible, we do nothing - I always forget this and try to update q and line, thereby introducing bugs */ *lline = line; *qq = q; return retval; } /* * this code generates decode_escaped_uri_character() and * w_decode_escaped_uri_character(). * * NOTE: this doesn't cope correctly with the case that the * URI encoded character is itself encoded as html entities. * For example, %20 can itself be encoded as %20 * Since the first char is decoded as '%' (otherwise we wouldn't * be inside decode_uri_character(), the function effectively * tries to decode %20 and fails. This is harmless, as * the ultimately decode line will be %20 instead of ' '. */ void mbw_prefix(decode_uri_character)(mbw_t **lline, mbw_t **qq) { mbw_t *line = *lline; mbw_t *q = *qq; mbw_t scratch[3]; mbw_t c = 0; mbw_t *r; if( *line == mbw_lit('%') ) { #if defined MBW_MB || (defined MBW_WIDE && defined HAVE_WCSTOL) /* check that the next two chars are hex */ for(r = line + 1; mbw_isspace(*r); r++); if( mbw_isxdigit(*r) ) { scratch[0] = *r; for(r++; mbw_isspace(*r); r++); if( mbw_isxdigit(*r) ) { scratch[1] = *r; scratch[2] = mbw_lit('\0'); c = (mbw_t)mbw_strtol(scratch, NULL, 16); } } #endif if( c ) { *q++ = c; line = r; } else { *q++ = *line; } } else if( mbw_isspace(*line) ) { /* ignore */ } else { /* not an escaped character */ *q++ = *line; } *lline = line; *qq = q; } /* this reads one or more characters from line and outputs * zero or one character at q. * The characters output depend on the xml.attribute state, but * the function never outputs more than it reads. Thus if q <= line * to begin with, this is preserved. This is necessary as the function * is normally used to modify line in-place. * * For URL type attributes, this function assumes the standard URI * form scheme:netloc/extra, and only prints the netloc part. * * A special case is the URI javascript:xxxxx, which is treated differently. * * CAUTION: if you increment qq, don't also call decode_uri_character(). * Just do one or the other. */ static void mbw_prefix(xml_attribute_filter)(XML_State *xml, mbw_t **lline, mbw_t **qq) { if( (xml->attribute != UNDEF) && (*(*lline) == mbw_lit('&')) ) { if( mbw_prefix(decode_html_entity)(lline, qq) ) { (*lline)++; } } switch(xml->attribute) { case SRC: if( *(*lline) == mbw_lit(':') ) { xml->attribute = SRC_NETLOC_PREFIX; *(*qq)++ = *(*lline); } else if( mbw_strncasecmp(*lline, mbw_lit("javascript:"), 11) == 0 ) { /* scripts are dealt differently */ xml->attribute = JSCRIPT; if( m_options & (1<attribute = SRC_NETLOC_SUFFIX; *(*qq)++ = *(*lline); break; default: mbw_prefix(decode_uri_character)(lline,qq); xml->attribute = SRC_NETLOC; break; } break; case SRC_NETLOC: switch(*(*lline)) { case mbw_lit('/'): *(*qq)++ = *(*lline); xml->attribute = SRC_NETLOC_PATH; break; case mbw_lit('?'): case mbw_lit(';'): case mbw_lit('#'): case mbw_lit('&'): xml->attribute = SRC_NETLOC_SUFFIX; break; default: mbw_prefix(decode_uri_character)(lline,qq); break; } break; case SRC_NETLOC_PATH: switch(*(*lline)) { case mbw_lit('.'): *(*qq)++ = *(*lline); break; case mbw_lit('?'): case mbw_lit(';'): case mbw_lit('#'): case mbw_lit('&'): xml->attribute = SRC_NETLOC_SUFFIX; *(*qq)++ = *(*lline); break; default: mbw_prefix(decode_uri_character)(lline,qq); break; } break; case SRC_NETLOC_SUFFIX: /* *(*qq)++ = mbw_lit(' '); */ *(*qq)++ = *(*lline); break; case ALT: *(*qq)++ = *(*lline); break; case UNDEF: /* nothing */ break; case JSCRIPT: if( m_options & (1< and tags. If these * tags are found, then everything outside them is handled by xpSMART mode. * * Thus, in particular, a new document should be started in xpSMART mode. * For text documents, this ensures that any preambles are not rendered, * until true HTML is encountered. * * However, there is a small problem, namely the tags are * optional. For text documents, missing tags are rare, but * email often contains only fragments with missing. To cope * with this, in mail mode, xpSMART scans the current line and * switches immediately to xpHTML mode if the line is printable. * * This turns out to be an extremely important function, because * spammers don't always label attachments correctly. So it's possible * to get a binary stream labeled as text/html, and of course lots of * junk tokens. If xpSMART mode detects binary, then it does NOT * switch to xpHTML mode immediately, and nothing gets printed. If * and when a valid tag is found later, HTML will be enabled as * necessary. I think this is a robust partial solution to an * intractable problem. */ void mbw_prefix(xml_character_filter)(XML_State *xml, mbw_t *line) { mbw_t *q; q = line; /* int k; */ /* don't call this with y < 1 */ #define TAGMATCH(x,y) (!mbw_strncasecmp(line + 1, x + 1, y - 1) && (mbw_isspace(line[y]) || (line[y] == mbw_lit('>')) || (line[y] == mbw_lit('\0'))) && (line += (y - 1))) #define ATTRMATCH(x,y) (!mbw_strncasecmp(line + 1, x + 1, y - 1) && (mbw_isspace(line[y]) || (line[y] == mbw_lit('=')) || (line[y] == mbw_lit('\0'))) && (line += (y - 1))) /* this is convenient for debugging */ #define PDEBUG(x) printf(#x"{%c%c%c%c%c%c%c%c%c%c}\n", line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7], line[8], line[9]) #define PDEBUG2(x,y) {printf(#x"2{"); for(k = 0; k < y; k++) printf("%c",line[k]); printf("}\n"); } /* this is important - read comments above */ if( (m_options & (1<parser == xpSMART) && !mbw_prefix(is_binline)(line) && !mbw_prefix(is_emptyspace)(line) ) { xml->parser = xpHTML; } while( *line ) { /* printf("%d %d ->", xml->state, xml->attribute); */ /* PDEBUG(LINE); */ switch(xml->state) { case TEXT: switch(line[0]) { case mbw_lit('<'): /* does it look like state = TAG; xml->attribute = UNDEF; switch(mbw_tolower(line[0])) { case mbw_lit('a'): if( (line[1] == mbw_lit('\0')) || mbw_isspace(line[1]) || TAGMATCH(mbw_lit("area"),4) || TAGMATCH(mbw_lit("applet"),6) ) { xml->state = XTAG; } break; case mbw_lit('b'): if( TAGMATCH(mbw_lit("base"),4) || TAGMATCH(mbw_lit("bgsound"),7) ) { xml->state = XTAG; } else if( TAGMATCH(mbw_lit("br"),2) ) { *q++ = mbw_lit('\n'); xml->state = TAG; } else if( TAGMATCH(mbw_lit("body"),4) ) { xml->hide = VISIBLE; if( xml->parser == xpSMART ) { xml->parser = xpHTML; } xml->state = XTAG; } break; case mbw_lit('c'): if( TAGMATCH(mbw_lit("comment"),7) ) { if( xml->parser == xpHTML ) { xml->hide = COMMENT; } } break; case mbw_lit('d'): if( TAGMATCH(mbw_lit("div"),3) ) { xml->state = XTAG; } break; case mbw_lit('e'): if( TAGMATCH(mbw_lit("embed"),5) ) { xml->state = XTAG; } break; case mbw_lit('f'): if( TAGMATCH(mbw_lit("frame"),5) || TAGMATCH(mbw_lit("form"),4) ) { xml->state = XTAG; } break; case mbw_lit('h'): if( TAGMATCH(mbw_lit("html"),4) || TAGMATCH(mbw_lit("head"),4) ) { xml->hide = VISIBLE; if( xml->parser == xpSMART ) { xml->parser = xpHTML; } } else if( TAGMATCH(mbw_lit("hr"),2) ) { *q++ = mbw_lit('\n'); xml->state = TAG; } break; case mbw_lit('i'): if( TAGMATCH(mbw_lit("img"),3) || TAGMATCH(mbw_lit("iframe"),6) || TAGMATCH(mbw_lit("ilayer"),6) || TAGMATCH(mbw_lit("input"),5) ) { xml->state = XTAG; } break; case mbw_lit('l'): if( TAGMATCH(mbw_lit("layer"),5) || TAGMATCH(mbw_lit("link"),4) ) { xml->state = XTAG; } break; case mbw_lit('n'): if( (TAGMATCH(mbw_lit("noframes"),8) && (xml->hide = NOFRAMES)) || (TAGMATCH(mbw_lit("nolayer"),7) && (xml->hide = NOLAYER)) || (TAGMATCH(mbw_lit("noscript"),8) && (xml->hide = NOSCRIPT)) || (TAGMATCH(mbw_lit("noembed"),7) && (xml->hide = NOEMBED)) ) { if( xml->parser == xpHTML ) { if( (m_options & (1<hide = VISIBLE; } } } break; case mbw_lit('o'): if( TAGMATCH(mbw_lit("object"),6) ) { xml->state = XTAG; } break; case mbw_lit('s'): if( TAGMATCH(mbw_lit("span"),4) ) { xml->state = XTAG; } else if( TAGMATCH(mbw_lit("script"),6) ) { xml->hide = SCRIPT; } else if( TAGMATCH(mbw_lit("style"),5) ) { xml->hide = STYLE; } break; case mbw_lit('t'): if( TAGMATCH(mbw_lit("title"),5) ) { xml->hide = TITLE; } break; default: /* ignore, ie it's a TAG */ break; } } else if( line[1] == mbw_lit('/') ) { line++; /* tags aren't mined, xtags are */ xml->state = TAG; xml->attribute = UNDEF; switch(mbw_tolower(line[1])) { case mbw_lit('b'): if( TAGMATCH(mbw_lit("/body"),5) ) { if( xml->parser == xpHTML ) { xml->parser = xpSMART; } xml->hide = VISIBLE; } break; case mbw_lit('c'): if( (xml->hide == COMMENT) && TAGMATCH(mbw_lit("/comment"),8) ) { /* nothing */ } break; case mbw_lit('h'): if( TAGMATCH(mbw_lit("/html"),5) || TAGMATCH(mbw_lit("/head"),5) ) { if( xml->parser == xpHTML ) { xml->parser = xpSMART; } xml->hide = VISIBLE; } break; case mbw_lit('n'): if( ((xml->hide == NOFRAMES) && TAGMATCH(mbw_lit("/noframes"),9)) || ((xml->hide == NOSCRIPT) && TAGMATCH(mbw_lit("/noscript"),9)) || ((xml->hide == NOLAYER) && TAGMATCH(mbw_lit("/nolayer"),8)) || ((xml->hide == NOEMBED) && TAGMATCH(mbw_lit("/noembed"),8)) ) { xml->hide = VISIBLE; } break; case mbw_lit('s'): if( ((xml->hide == SCRIPT) && TAGMATCH(mbw_lit("/script"),7)) || ((xml->hide == STYLE) && TAGMATCH(mbw_lit("/style"),6)) ) { xml->hide = VISIBLE; } break; case mbw_lit('t'): if( TAGMATCH(mbw_lit("/title"),6) ) { xml->hide = VISIBLE; } break; default: /* ignore, ie it's a TAG */ break; } } else { /* second char is not alpha or slash */ if( mbw_strncmp(line + 1, mbw_lit("!--"), 3) == 0 ) { if( line[4] == mbw_lit('>') ) { /* buggy MSHTML accepts as a comment, so ignore this */ line += 4; } else { /* real comment */ xml->state = CMNT; line += 3; } } else if( line[1] == mbw_lit('<') ) { /* stay in TEXT state */ if( xml->parser == xpDUMB ) { line++; } else { switch(xml->hide) { case VISIBLE: case TITLE: *q++ = *line; break; case SCRIPT: if( m_options & (1<state = TAG; line++; } } break; case mbw_lit('&'): if( (xml->parser == xpHTML) || (xml->parser == xpDUMB) ) { switch(xml->hide) { case VISIBLE: case TITLE: mbw_prefix(decode_html_entity)(&line, &q); break; case SCRIPT: if( m_options & (1<parser == xpHTML) || (xml->parser == xpDUMB) ) { switch(xml->hide) { case VISIBLE: case TITLE: *q++ = *line; break; case SCRIPT: if( m_options & (1<') ) { xml->state = TEXT; } else if( line[0] == mbw_lit('=') ) { xml->state = TAGPREQ; } break; case TAGPREQ: if( line[0] == mbw_lit('\'') ) { xml->state = TAGQUOTE; } else if( line[0] == mbw_lit('"') ) { xml->state = TAGDQUOTE; } else if( !mbw_isspace(line[0]) ) { xml->state = TAG; mbw_prefix(xml_attribute_filter)(xml, &line,&q); } break; case TAGQUOTE: if( (line[0] == '\\') && (line[1] == mbw_lit('\'')) ) { line++; } else if( line[0] == mbw_lit('\'') ) { xml->state = TAG; } break; case TAGDQUOTE: if( (line[0] == '\\') && (line[1] == mbw_lit('"')) ) { line++; } else if( line[0] == mbw_lit('"') ) { xml->state = TAG; } break; case XTAG: if( xml->parser == xpSMART ) { /* we've recognized an HTML tag */ xml->parser = xpHTML; } if( (xml->attribute != UNDEF) && mbw_isspace(line[0]) && !MBW_EMPTYLINE(line) ) { xml->attribute = UNDEF; *q++ = ATTRIBSEP; } else switch(mbw_tolower(line[0])) { case mbw_lit('>'): xml->state = TEXT; if( xml->attribute != UNDEF ) { xml->attribute = UNDEF; *q++ = ATTRIBSEP; } break; case mbw_lit('='): xml->state = XTAGPREQ; break; case mbw_lit('a'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = ALT; line += 2; *q++ = ATTRIBSEP; } } if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 5; *q++ = ATTRIBSEP; } } break; case mbw_lit('c'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = ASTYLE; line += 4; *q++ = ATTRIBSEP; } } break; case mbw_lit('d'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 3; *q++ = ATTRIBSEP; } } break; case mbw_lit('h'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 3; *q++ = ATTRIBSEP; } } break; case mbw_lit('o'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( mbw_tolower(line[1]) != mbw_lit('n') ) { /* false alarm */ } else if( ATTRMATCH(mbw_lit("onmousedown"), 11) || ATTRMATCH(mbw_lit("onmousemove"), 11) || ATTRMATCH(mbw_lit("onmouseout"), 10) || ATTRMATCH(mbw_lit("onmouseover"), 11) || ATTRMATCH(mbw_lit("onmouseup"), 9) || ATTRMATCH(mbw_lit("onclick"), 7) || ATTRMATCH(mbw_lit("ondblclick"), 10) || ATTRMATCH(mbw_lit("onfocus"), 7) || ATTRMATCH(mbw_lit("onkeydown"), 9) || ATTRMATCH(mbw_lit("onkeypress"), 10) || ATTRMATCH(mbw_lit("onkeyup"), 7) || ATTRMATCH(mbw_lit("ondataavailable"), 15) || ATTRMATCH(mbw_lit("ondatasetchanged"), 16) || ATTRMATCH(mbw_lit("ondatasetcomplete"), 17) || ATTRMATCH(mbw_lit("onabort"), 7) || ATTRMATCH(mbw_lit("onload"), 6) || ATTRMATCH(mbw_lit("onunload"), 8) || ATTRMATCH(mbw_lit("onmove"), 6) || ATTRMATCH(mbw_lit("onresize"), 8) || ATTRMATCH(mbw_lit("onsubmit"), 8) ) { if( xml->attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = JSCRIPT; *q++ = ATTRIBSEP; /* line is already updated by ATTRMATCH */ } break; case mbw_lit('s'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 2; *q++ = ATTRIBSEP; } } if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = ASTYLE; line += 4; *q++ = ATTRIBSEP; } } break; case mbw_lit('t'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = ALT; line += 4; *q++ = ATTRIBSEP; } } break; case mbw_lit('u'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 2; *q++ = ATTRIBSEP; } } break; case mbw_lit('v'): mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( m_options & (1<attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = SRC; line += 4; *q++ = ATTRIBSEP; } } break; default: mbw_prefix(xml_attribute_filter)(xml, &line,&q); break; } break; case XTAGPREQ: if( line[0] == mbw_lit('\'') ) { xml->state = XTAGQUOTE; } else if( line[0] == mbw_lit('"') ) { xml->state = XTAGDQUOTE; } else if( !mbw_isspace(line[0]) ) { xml->state = XTAG; mbw_prefix(xml_attribute_filter)(xml, &line,&q); } break; case XTAGQUOTE: if( line[0] == mbw_lit('\'') ) { xml->state = XTAG; if( xml->attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = UNDEF; } else { mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( (line[0] == mbw_lit('\\')) && (line[1] == mbw_lit('\'')) ) { line++; mbw_prefix(xml_attribute_filter)(xml, &line,&q); } } break; case XTAGDQUOTE: if( line[0] == mbw_lit('"') ) { xml->state = XTAG; if( xml->attribute != UNDEF ) { *q++ = ATTRIBSEP; } xml->attribute = UNDEF; } else { mbw_prefix(xml_attribute_filter)(xml, &line,&q); if( (line[0] == mbw_lit('\\')) && (line[1] == mbw_lit('"')) ) { line++; mbw_prefix(xml_attribute_filter)(xml, &line,&q); } } break; case CMNT: if( (line[0] == mbw_lit('-')) && (line[1] == mbw_lit('-')) ) { xml->state = TAG; } else { /* ignore comments in some circumstances */ if( m_options & (1<hide) { case SCRIPT: if( m_options & (1<plainstate) { case psPLAIN: if( (line[0] == mbw_lit('b')) && !mbw_strncmp(line, mbw_lit("begin "),6) && ISOCT(line[6]) && ISOCT(line[7]) && ISOCT(line[8]) ) { mbox->plainstate = psUUENCODE; return 1; } break; case psUUENCODE: switch(mbw_prefix(is_uuline)(line)) { case -1: return 1; case -2: mbox->plainstate = psPLAIN; break; default: return 0; } break; } /* now assume psPLAIN */ q = line; while(*line) { switch(*line) { case mbw_lit('%'): if( !censor ) { mbw_prefix(decode_uri_character)(&line, &q); } break; case mbw_lit('&'): if( !censor ) { if( !url ) { mbw_prefix(decode_html_entity)(&line, &q); } else { censor = 1; } } break; case mbw_lit('H'): case mbw_lit('h'): if( !mbw_strncasecmp(line, mbw_lit("http://"), 7) ) { censor = 0; url = 1; } if( !censor ) { *q++ = *line; } break; case mbw_lit('?'): case mbw_lit(';'): case mbw_lit('#'): if( url ) { censor = 1; } else { *q++ = *line; } break; case mbw_lit(' '): case mbw_lit('\t'): case mbw_lit('>'): case mbw_lit('\''): case mbw_lit('"'): if( censor && url ) { censor = 0; url = 0; } *q++ = *line; break; default: if( !censor ) { *q++ = *line; } break; } line++; } *q = mbw_lit('\0'); return 1; } /* assume string is binary with embedded NULs replaced by FFs, the strings that are found are separated by spaces */ /* note: this doesn't work like strings(1) yet, but eventually it will ;-) */ bool_t mbw_prefix(strings1_filter)(mbw_t *line) { size_t c; mbw_t *q; #define MIN_STRING_SIZE 4 for(q = line, c = 0; *line; line++) { /* if( mbw_isalnum(*line) || */ /* mbw_ispunct(*line) || */ /* (*line == mbw_lit(' ')) ) { */ if( mbw_isprint(*line) && (*line != mbw_lit('\t')) ) { *q++ = *line; c++; } else if( c >= MIN_STRING_SIZE ) { *q++ = mbw_lit(' '); c = 0; } else if( c > 0 ) { q -= c; c = 0; } } *q = mbw_lit('\0'); return 1; } /*********************************************************** * CALLED OUTSIDE THIS SOURCE FILE * ***********************************************************/ void mbw_prefix(init_decoding_caches)(MBOX_State *mbox) { mbw_prefix(init_dc)(&(mbox->mbw_prefix(b64_dc)),system_pagesize); mbw_prefix(init_dc)(&(mbox->mbw_prefix(qp_dc)),system_pagesize); } void mbw_prefix(free_decoding_caches)(MBOX_State *mbox) { if( mbox->mbw_prefix(b64_dc).cache ) { free(mbox->mbw_prefix(b64_dc).cache); mbox->mbw_prefix(b64_dc).cache = NULL; } if( mbox->mbw_prefix(qp_dc).cache ) { free(mbox->mbw_prefix(qp_dc).cache); mbox->mbw_prefix(qp_dc).cache = NULL; } } #endif dbacl-1.14.1/src/mbw.h000066400000000000000000000072731325773323600144140ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ /* don't guard this file, it must be parsed differently several times */ #if defined MBW_WIDE #define mbw_lit(x) L##x #define mbw_t wchar_t #define mbw_prefix(f) w_##f #define mbw_isalnum(c) iswalnum(c) #define mbw_isalpha(c) iswalpha(c) #define mbw_isgraph(c) iswgraph(c) #define mbw_isspace(c) iswspace(c) #define mbw_isblank(c) iswblank(c) #define mbw_iscntrl(c) iswcntrl(c) #define mbw_ispunct(c) iswpunct(c) #define mbw_isxdigit(c) iswxdigit(c) #define mbw_isdigit(c) iswdigit(c) #define mbw_isprint(c) iswprint(c) #define mbw_isascii(c) (c <= 127) #define mbw_strncmp(x,y,z) wcsncmp(x,y,z) #define mbw_strcmp(x,y) wcscmp(x,y) #define mbw_strncasecmp(x,y,z) mbw_prefix(mystrncasecmp)(x,y,z) /* wcsncasecmp is broken in glibc */ #define mbw_strtol(x,y,z) wcstol(x,y,z) #define mbw_tolower(x) towlower(x) #define mbw_strchr(x,y) wcschr(x,y) #define mbw_strncpy(x,y,z) wcsncpy(x,y,z) #define mbw_strlen(x) wcslen(x) #if defined HAVE_MBRTOWC static mbstate_t copychar_shiftstate; static charbuf_len_t copychar_len; #define mbw_copychar(x,y) { \ copychar_len = wcrtomb((x), (y), ©char_shiftstate); \ if( copychar_len > -1) { \ x += copychar_len; \ } \ } #endif /* regexes are disabled in wide character mode for now - there are too many issues: how does dbacl decide when to use wide char regexes, and when to use multibyte regexes? Thsi must be consistent when -i switch can be anywhere on the command line, when categories are loaded (even if one uses wide, another uses multibyte), etc. */ #define mbw_regcomp(x,y,z) (-1) #define mbw_regexec(x,y,z,t,u) (-1) #define mbw_regerror(x,y,z,t) (-1) #define mbw_regfree(x) (-1) #elif defined MBW_MB #define mbw_lit(x) x #define mbw_t char #define mbw_prefix(f) f #define mbw_isalnum(c) isalnum((int)(c)) #define mbw_isalpha(c) isalpha((int)(c)) #define mbw_isgraph(c) isgraph((int)(c)) #define mbw_isspace(c) isspace((int)(c)) #define mbw_isblank(c) isblank((int)(c)) #define mbw_iscntrl(c) iscntrl((int)(c)) #define mbw_ispunct(c) ispunct((int)(c)) #define mbw_isxdigit(c) isxdigit((int)(c)) #define mbw_isdigit(c) isdigit((int)(c)) #define mbw_isprint(c) isprint((int)(c)) #define mbw_isascii(c) ((int)c <= 127) #define mbw_strncmp(x,y,z) strncmp(x,y,z) #define mbw_strcmp(x,y) strcmp(x,y) #define mbw_strncasecmp(x,y,z) strncasecmp(x,y,z) #define mbw_strtol(x,y,z) strtol(x,y,z) #define mbw_tolower(x) tolower(x) #define mbw_strchr(x,y) strchr(x,y) #define mbw_strncpy(x,y,z) strncpy(x,y,z) #define mbw_strlen(x) strlen(x) #define mbw_copychar(x,y) { *(x)++ = (y); } #define mbw_regcomp(x,y,z) regcomp(x,y,z) #define mbw_regexec(x,y,z,t,u) regexec(x,y,z,t,u) #define mbw_regerror(x,y,z,t) regerror(x,y,z,t) #define mbw_regfree(x) regfree(x) #else #error "This file must be compiled with -DMBW_WIDE or -DMBW_P" #endif #define ISOCT(x) ((x <= mbw_lit('6')) && (x >= mbw_lit('0'))) #define ATTRIBSEP mbw_lit('\n') dbacl-1.14.1/src/mconf.h000066400000000000000000000125021325773323600147200ustar00rootroot00000000000000/* mconf.h * * Common include file for math routines * * * * SYNOPSIS: * * #include "mconf.h" * * * * DESCRIPTION: * * This file contains definitions for error codes that are * passed to the common error handling routine mtherr() * (which see). * * The file also includes a conditional assembly definition * for the type of computer arithmetic (IEEE, DEC, Motorola * IEEE, or UNKnown). * * For Digital Equipment PDP-11 and VAX computers, certain * IBM systems, and others that use numbers with a 56-bit * significand, the symbol DEC should be defined. In this * mode, most floating point constants are given as arrays * of octal integers to eliminate decimal to binary conversion * errors that might be introduced by the compiler. * * For little-endian computers, such as IBM PC, that follow the * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE * Std 754-1985), the symbol IBMPC should be defined. These * numbers have 53-bit significands. In this mode, constants * are provided as arrays of hexadecimal 16 bit integers. * * Big-endian IEEE format is denoted MIEEE. On some RISC * systems such as Sun SPARC, double precision constants * must be stored on 8-byte address boundaries. Since integer * arrays may be aligned differently, the MIEEE configuration * may fail on such machines. * * To accommodate other types of computer arithmetic, all * constants are also provided in a normal decimal radix * which one can hope are correctly converted to a suitable * format by the available C language compiler. To invoke * this mode, define the symbol UNK. * * An important difference among these modes is a predefined * set of machine arithmetic constants for each. The numbers * MACHEP (the machine roundoff error), MAXNUM (largest number * represented), and several other parameters are preset by * the configuration symbol. Check the file const.c to * ensure that these values are correct for your computer. * * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL * may fail on many systems. Verify that they are supposed * to work on your computer. */ /* Cephes Math Library Release 2.3: June, 1995 Copyright 1984, 1987, 1989, 1995 by Stephen L. Moshier */ /* Define if the `long double' type works. */ #define HAVE_LONG_DOUBLE 1 /* Define as the return type of signal handlers (int or void). */ #define RETSIGTYPE void /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define if floating point words are bigendian. */ /* #undef FLOAT_WORDS_BIGENDIAN */ /* The number of bytes in a int. */ #define SIZEOF_INT 4 /* Define if you have the header file. */ #define HAVE_STRING_H 1 /* Name of package */ #define PACKAGE "cephes" /* Version number of package */ #define VERSION "2.7" /* Constant definitions for math error conditions */ #define DOMAIN 1 /* argument domain error */ #define SING 2 /* argument singularity */ #define OVERFLOW 3 /* overflow range error */ #define UNDERFLOW 4 /* underflow range error */ #define TLOSS 5 /* total loss of precision */ #define PLOSS 6 /* partial loss of precision */ #define EDOM 33 #define ERANGE 34 /* Complex numeral. */ typedef struct { double r; double i; } cmplx; #ifdef HAVE_LONG_DOUBLE /* Long double complex numeral. */ typedef struct { long double r; long double i; } cmplxl; #endif /* Type of computer arithmetic */ /* PDP-11, Pro350, VAX: */ /* #define DEC 1 */ /* Intel IEEE, low order words come first: */ /* #define IBMPC 1 */ /* Motorola IEEE, high order words come first * (Sun 680x0 workstation): */ /* #define MIEEE 1 */ /* UNKnown arithmetic, invokes coefficients given in * normal decimal format. Beware of range boundary * problems (MACHEP, MAXLOG, etc. in const.c) and * roundoff problems in pow.c: * (Sun SPARCstation) */ #define UNK 1 /* If you define UNK, then be sure to set BIGENDIAN properly. */ #ifdef FLOAT_WORDS_BIGENDIAN #define BIGENDIAN 1 #else #define BIGENDIAN 0 #endif /* Define this `volatile' if your compiler thinks * that floating point arithmetic obeys the associative * and distributive laws. It will defeat some optimizations * (but probably not enough of them). * * #define VOLATILE volatile */ #define VOLATILE /* For 12-byte long doubles on an i386, pad a 16-bit short 0 * to the end of real constants initialized by integer arrays. * * #define XPD 0, * * Otherwise, the type is 10 bytes long and XPD should be * defined blank (e.g., Microsoft C). * * #define XPD */ #define XPD 0, /* Define to support tiny denormal numbers, else undefine. */ #define DENORMAL 1 /* Define to ask for infinity support, else undefine. */ #define INFINITIES 1 /* Define to ask for support of numbers that are Not-a-Number, else undefine. This may automatically define INFINITIES in some files. */ #define NANS 1 /* Define to distinguish between -0.0 and +0.0. */ #define MINUSZERO 1 /* Define 1 for ANSI C atan2() function See atan.c and clog.c. */ #define ANSIC 1 /* Get ANSI function prototypes, if you want them. */ #if 1 /* #ifdef __STDC__ */ #define ANSIPROT 1 int mtherr ( char *, int ); #else int mtherr(); #endif /* Variable for error reporting. See mtherr.c. */ extern int merror; dbacl-1.14.1/src/mtherr.c000066400000000000000000000045011325773323600151120ustar00rootroot00000000000000/* mtherr.c * * Library common error handling routine * * * * SYNOPSIS: * * char *fctnam; * int code; * int mtherr(); * * mtherr( fctnam, code ); * * * * DESCRIPTION: * * This routine may be called to report one of the following * error conditions (in the include file mconf.h). * * Mnemonic Value Significance * * DOMAIN 1 argument domain error * SING 2 function singularity * OVERFLOW 3 overflow range error * UNDERFLOW 4 underflow range error * TLOSS 5 total loss of precision * PLOSS 6 partial loss of precision * EDOM 33 Unix domain error code * ERANGE 34 Unix range error code * * The default version of the file prints the function name, * passed to it by the pointer fctnam, followed by the * error condition. The display is directed to the standard * output device. The routine then returns to the calling * program. Users may wish to modify the program to abort by * calling exit() under severe error conditions such as domain * errors. * * Since all error conditions pass control to this function, * the display may be easily changed, eliminated, or directed * to an error logging device. * * SEE ALSO: * * mconf.h * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include #include "mconf.h" int merror = 0; /* Notice: the order of appearance of the following * messages is bound to the error codes defined * in mconf.h. */ static char *ermsg[7] = { "unknown", /* error code 0 */ "domain", /* error code 1 */ "singularity", /* et seq. */ "overflow", "underflow", "total loss of precision", "partial loss of precision" }; int mtherr( name, code ) char *name; int code; { /* Display string passed by calling program, * which is supposed to be the name of the * function in which the error occurred: */ printf( "\n%s ", name ); /* Set global error message word */ merror = code; /* Display error message defined * by the code argument. */ if( (code <= 0) || (code >= 7) ) code = 0; printf( "%s error\n", ermsg[code] ); /* Return to calling * program */ return( 0 ); } dbacl-1.14.1/src/ndtr.c000066400000000000000000000234021325773323600145610ustar00rootroot00000000000000/* ndtr.c * * Normal distribution function * * * * SYNOPSIS: * * double x, y, ndtr(); * * y = ndtr( x ); * * * * DESCRIPTION: * * Returns the area under the Gaussian probability density * function, integrated from minus infinity to x: * * x * - * 1 | | 2 * ndtr(x) = --------- | exp( - t /2 ) dt * sqrt(2pi) | | * - * -inf. * * = ( 1 + erf(z) ) / 2 * = erfc(z) / 2 * * where z = x/sqrt(2). Computation is via the functions * erf and erfc. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -13,0 8000 2.1e-15 4.8e-16 * IEEE -13,0 30000 3.4e-14 6.7e-15 * * * ERROR MESSAGES: * * message condition value returned * erfc underflow x > 37.519379347 0.0 * */ /* erf.c * * Error function * * * * SYNOPSIS: * * double x, y, erf(); * * y = erf( x ); * * * * DESCRIPTION: * * The integral is * * x * - * 2 | | 2 * erf(x) = -------- | exp( - t ) dt. * sqrt(pi) | | * - * 0 * * The magnitude of x is limited to 9.231948545 for DEC * arithmetic; 1 or -1 is returned outside this range. * * For 0 <= |x| < 1, erf(x) = x * P4(x**2)/Q5(x**2); otherwise * erf(x) = 1 - erfc(x). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,1 14000 4.7e-17 1.5e-17 * IEEE 0,1 30000 3.7e-16 1.0e-16 * */ /* erfc.c * * Complementary error function * * * * SYNOPSIS: * * double x, y, erfc(); * * y = erfc( x ); * * * * DESCRIPTION: * * * 1 - erf(x) = * * inf. * - * 2 | | 2 * erfc(x) = -------- | exp( - t ) dt * sqrt(pi) | | * - * x * * * For small x, erfc(x) = 1 - erf(x); otherwise rational * approximations are computed. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 9.2319 12000 5.1e-16 1.2e-16 * IEEE 0,26.6417 30000 5.7e-14 1.5e-14 * * * ERROR MESSAGES: * * message condition value returned * erfc underflow x > 9.231948545 (DEC) 0.0 * * */ /* Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 1988, 1992, 2000 by Stephen L. Moshier */ #include "mconf.h" extern double SQRTH; extern double MAXLOG; #ifdef UNK static double P[] = { 2.46196981473530512524E-10, 5.64189564831068821977E-1, 7.46321056442269912687E0, 4.86371970985681366614E1, 1.96520832956077098242E2, 5.26445194995477358631E2, 9.34528527171957607540E2, 1.02755188689515710272E3, 5.57535335369399327526E2 }; static double Q[] = { /* 1.00000000000000000000E0,*/ 1.32281951154744992508E1, 8.67072140885989742329E1, 3.54937778887819891062E2, 9.75708501743205489753E2, 1.82390916687909736289E3, 2.24633760818710981792E3, 1.65666309194161350182E3, 5.57535340817727675546E2 }; static double R[] = { 5.64189583547755073984E-1, 1.27536670759978104416E0, 5.01905042251180477414E0, 6.16021097993053585195E0, 7.40974269950448939160E0, 2.97886665372100240670E0 }; static double S[] = { /* 1.00000000000000000000E0,*/ 2.26052863220117276590E0, 9.39603524938001434673E0, 1.20489539808096656605E1, 1.70814450747565897222E1, 9.60896809063285878198E0, 3.36907645100081516050E0 }; static double T[] = { 9.60497373987051638749E0, 9.00260197203842689217E1, 2.23200534594684319226E3, 7.00332514112805075473E3, 5.55923013010394962768E4 }; static double U[] = { /* 1.00000000000000000000E0,*/ 3.35617141647503099647E1, 5.21357949780152679795E2, 4.59432382970980127987E3, 2.26290000613890934246E4, 4.92673942608635921086E4 }; #define UTHRESH 37.519379347 #endif #ifdef DEC static unsigned short P[] = { 0030207,0054445,0011173,0021706, 0040020,0067272,0030661,0122075, 0040756,0151236,0173053,0067042, 0041502,0106175,0062555,0151457, 0042104,0102525,0047401,0003667, 0042403,0116176,0011446,0075303, 0042551,0120723,0061641,0123275, 0042600,0070651,0007264,0134516, 0042413,0061102,0167507,0176625 }; static unsigned short Q[] = { /*0040200,0000000,0000000,0000000,*/ 0041123,0123257,0165741,0017142, 0041655,0065027,0173413,0115450, 0042261,0074011,0021573,0004150, 0042563,0166530,0013662,0007200, 0042743,0176427,0162443,0105214, 0043014,0062546,0153727,0123772, 0042717,0012470,0006227,0067424, 0042413,0061103,0003042,0013254 }; static unsigned short R[] = { 0040020,0067272,0101024,0155421, 0040243,0037467,0056706,0026462, 0040640,0116017,0120665,0034315, 0040705,0020162,0143350,0060137, 0040755,0016234,0134304,0130157, 0040476,0122700,0051070,0015473 }; static unsigned short S[] = { /*0040200,0000000,0000000,0000000,*/ 0040420,0126200,0044276,0070413, 0041026,0053051,0007302,0063746, 0041100,0144203,0174051,0061151, 0041210,0123314,0126343,0177646, 0041031,0137125,0051431,0033011, 0040527,0117362,0152661,0066201 }; static unsigned short T[] = { 0041031,0126770,0170672,0166101, 0041664,0006522,0072360,0031770, 0043013,0100025,0162641,0126671, 0043332,0155231,0161627,0076200, 0044131,0024115,0021020,0117343 }; static unsigned short U[] = { /*0040200,0000000,0000000,0000000,*/ 0041406,0037461,0177575,0032714, 0042402,0053350,0123061,0153557, 0043217,0111227,0032007,0164217, 0043660,0145000,0004013,0160114, 0044100,0071544,0167107,0125471 }; #define UTHRESH 14.0 #endif #ifdef IBMPC static unsigned short P[] = { 0x6479,0xa24f,0xeb24,0x3df0, 0x3488,0x4636,0x0dd7,0x3fe2, 0x6dc4,0xdec5,0xda53,0x401d, 0xba66,0xacad,0x518f,0x4048, 0x20f7,0xa9e0,0x90aa,0x4068, 0xcf58,0xc264,0x738f,0x4080, 0x34d8,0x6c74,0x343a,0x408d, 0x972a,0x21d6,0x0e35,0x4090, 0xffb3,0x5de8,0x6c48,0x4081 }; static unsigned short Q[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x23cc,0xfd7c,0x74d5,0x402a, 0x7365,0xfee1,0xad42,0x4055, 0x610d,0x246f,0x2f01,0x4076, 0x41d0,0x02f6,0x7dab,0x408e, 0x7151,0xfca4,0x7fa2,0x409c, 0xf4ff,0xdafa,0x8cac,0x40a1, 0xede2,0x0192,0xe2a7,0x4099, 0x42d6,0x60c4,0x6c48,0x4081 }; static unsigned short R[] = { 0x9b62,0x5042,0x0dd7,0x3fe2, 0xc5a6,0xebb8,0x67e6,0x3ff4, 0xa71a,0xf436,0x1381,0x4014, 0x0c0c,0x58dd,0xa40e,0x4018, 0x960e,0x9718,0xa393,0x401d, 0x0367,0x0a47,0xd4b8,0x4007 }; static unsigned short S[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xce21,0x0917,0x1590,0x4002, 0x4cfd,0x21d8,0xcac5,0x4022, 0x2c4d,0x7f05,0x1910,0x4028, 0x7ff5,0x959c,0x14d9,0x4031, 0x26c1,0xaa63,0x37ca,0x4023, 0x2d90,0x5ab6,0xf3de,0x400a }; static unsigned short T[] = { 0x5d88,0x1e37,0x35bf,0x4023, 0x067f,0x4e9e,0x81aa,0x4056, 0x35b7,0xbcb4,0x7002,0x40a1, 0xef90,0x3c72,0x5b53,0x40bb, 0x13dc,0xa442,0x2509,0x40eb }; static unsigned short U[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xa6ba,0x3fef,0xc7e6,0x4040, 0x3aee,0x14c6,0x4add,0x4080, 0xfd12,0xe680,0xf252,0x40b1, 0x7c0a,0x0101,0x1940,0x40d6, 0xf567,0x9dc8,0x0e6c,0x40e8 }; #define UTHRESH 37.519379347 #endif #ifdef MIEEE static unsigned short P[] = { 0x3df0,0xeb24,0xa24f,0x6479, 0x3fe2,0x0dd7,0x4636,0x3488, 0x401d,0xda53,0xdec5,0x6dc4, 0x4048,0x518f,0xacad,0xba66, 0x4068,0x90aa,0xa9e0,0x20f7, 0x4080,0x738f,0xc264,0xcf58, 0x408d,0x343a,0x6c74,0x34d8, 0x4090,0x0e35,0x21d6,0x972a, 0x4081,0x6c48,0x5de8,0xffb3 }; static unsigned short Q[] = { 0x402a,0x74d5,0xfd7c,0x23cc, 0x4055,0xad42,0xfee1,0x7365, 0x4076,0x2f01,0x246f,0x610d, 0x408e,0x7dab,0x02f6,0x41d0, 0x409c,0x7fa2,0xfca4,0x7151, 0x40a1,0x8cac,0xdafa,0xf4ff, 0x4099,0xe2a7,0x0192,0xede2, 0x4081,0x6c48,0x60c4,0x42d6 }; static unsigned short R[] = { 0x3fe2,0x0dd7,0x5042,0x9b62, 0x3ff4,0x67e6,0xebb8,0xc5a6, 0x4014,0x1381,0xf436,0xa71a, 0x4018,0xa40e,0x58dd,0x0c0c, 0x401d,0xa393,0x9718,0x960e, 0x4007,0xd4b8,0x0a47,0x0367 }; static unsigned short S[] = { 0x4002,0x1590,0x0917,0xce21, 0x4022,0xcac5,0x21d8,0x4cfd, 0x4028,0x1910,0x7f05,0x2c4d, 0x4031,0x14d9,0x959c,0x7ff5, 0x4023,0x37ca,0xaa63,0x26c1, 0x400a,0xf3de,0x5ab6,0x2d90 }; static unsigned short T[] = { 0x4023,0x35bf,0x1e37,0x5d88, 0x4056,0x81aa,0x4e9e,0x067f, 0x40a1,0x7002,0xbcb4,0x35b7, 0x40bb,0x5b53,0x3c72,0xef90, 0x40eb,0x2509,0xa442,0x13dc }; static unsigned short U[] = { 0x4040,0xc7e6,0x3fef,0xa6ba, 0x4080,0x4add,0x14c6,0x3aee, 0x40b1,0xf252,0xe680,0xfd12, 0x40d6,0x1940,0x0101,0x7c0a, 0x40e8,0x0e6c,0x9dc8,0xf567 }; #define UTHRESH 37.519379347 #endif #ifdef ANSIPROT extern double polevl ( double, void *, int ); extern double p1evl ( double, void *, int ); extern double exp ( double ); extern double log ( double ); extern double fabs ( double ); double erf ( double ); double erfc ( double ); #else double polevl(), p1evl(), exp(), log(), fabs(); double erf(), erfc(); #endif double ndtr(a) double a; { double x, y, z; x = a * SQRTH; z = fabs(x); if( z < SQRTH ) y = 0.5 + 0.5 * erf(x); else { y = 0.5 * erfc(z); if( x > 0 ) y = 1.0 - y; } return(y); } double erfc(a) double a; { double p,q,x,y,z; if( a < 0.0 ) x = -a; else x = a; if( x < 1.0 ) return( 1.0 - erf(a) ); z = -a * a; if( z < -MAXLOG ) { under: /* mtherr( "erfc", UNDERFLOW ); */ if( a < 0 ) return( 2.0 ); else return( 0.0 ); } z = exp(z); if( x < 8.0 ) { p = polevl( x, P, 8 ); q = p1evl( x, Q, 8 ); } else { p = polevl( x, R, 5 ); q = p1evl( x, S, 6 ); } y = (z * p)/q; if( a < 0 ) y = 2.0 - y; if( y == 0.0 ) goto under; return(y); } double erf(x) double x; { double y, z; if( fabs(x) > 1.0 ) return( 1.0 - erfc(x) ); z = x * x; y = x * polevl( z, T, 4 ) / p1evl( z, U, 5 ); return( y ); } dbacl-1.14.1/src/plot-scores.sh000077500000000000000000000047161325773323600162660ustar00rootroot00000000000000#!/bin/bash # quick script to plot the scores of training documents. # needs mbox format file on command line. DBACL=/home/laird/proj/cpp/dbacl/src/dbacl DATAFILE=/home/laird/dummy.scores PVALUES=/home/laird/dummy.pvalues RESFILE=/home/laird/dummy.results SMPMV=/home/laird/dummy.samplemv CMDFILE=/home/laird/dummy.gnuplot if [ ! -e $DBACL ] ; then echo "$DBACL not found!" exit 1 fi if [ -z "$1" ] ; then echo "usage: $0 MBOX-FILE" exit 1 fi # uncomment this for the MULTINOMIAL model #cat $@ | $DBACL -T email -T email:headers -T html:links -H 25 -e adp -l dummy -0 -v -X -M #cat $@ | formail -s $DBACL -c dummy -m -n -v | awk '{print $2}' | freq > $DATAFILE # uncomment this for the SEQUENTIAL model cat $@ | $DBACL -T email -T email:headers -T html:links -H 25 -e adp -l dummy -0 -v -X | grep reservoir > dummy.reservoir cat $@ | formail -s $DBACL -c dummy -m -X -v > $RESFILE cat $RESFILE | awk '{print $3}' | freq > $DATAFILE cat $RESFILE | tr -s ']%[' ' ' | awk '{print $3, $8}' > $PVALUES cat $RESFILE | awk '{n++; d += $3; dd += $3*$3;}END{print d/n, ((n*dd -(d*d))/(n*(n-1)))}' > $SMPMV MALPHA=`head -5 $DBACL_PATH/dummy | grep shannon | awk '{print $5}'` MBETA=`head -5 $DBACL_PATH/dummy | grep shannon | awk '{print $7}'` MMU=`head -5 $DBACL_PATH/dummy | grep shannon | awk '{print $9}'` MS2=`head -5 $DBACL_PATH/dummy | grep shannon | awk '{print $11}'` echo "ALPHA $MALPHA BETA $MBETA MU $MMU S2 $MS2" MU=`cat $SMPMV | awk '{print $1}'` SIGMA2=`cat $SMPMV | awk '{print $2}'` cat > $CMDFILE < */ #include #include "util.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #define M_SQRT2 1.41421356237309504880 #define M_2_SQRTPI 1.12837916709551257390 #endif double sample_mean(double x, double n) { return x/n; } double sample_variance(double s, double x, double n) { return (n * s - (x * x))/(n * (n - 1.0)); } /* returns the logarithm of a Poisson distribution (calculations based on Stirling's formula) */ double log_poisson(int k, double lambda) { return (double)k * (log(lambda) -log((double)k) + 1.0) - log(2.0 * M_PI * (double)k ) / 2.0 - lambda; } /* returns the probability that a chi squared with df degrees of freedom is less than or equal to x */ double chi2_cdf(double df, double x) { /* to be implemented */ return 1.0 - igamc(df/2.0, x/2.0); } double gamma_tail(double a, double b, double x) { /* don't call igamc with extreme numbers, it can exit with an error */ return igamc(a, x/b); } double normal_cdf(double x) { return ndtr(x); } /* Given X_1,...,X_n independent Gaussians, computes the probability that X_k = min_j X_j. eg: Prob(X_1 <= min_j X_j) = \int \phi(x) \prod_{j\neq 1} Prob(X_j > x) Call this function once for each X_j. The computation uses Gaussian quadrature with Hermite polynomials, 10 points from Abramovitz and Stegun, p.924. It doesn't need to be very accurate, but an error of more than 1% looks bad when displayed to the user. */ double min_prob(int k, int n, double mu[], double sigma[]) { const double gauss_hermite[10][2] = { {-3.4361591188, 1.0254516913}, {-2.5327316742, 0.8206661264}, {-1.7566836492, 0.7414419319}, {-1.0366108297 , 0.7032963231}, {-0.3429013272, 0.6870818539}, {0.3429013272, 0.6870818539}, {1.0366108297 , 0.7032963231}, {1.7566836492, 0.7414419319}, {2.5327316742, 0.8206661264}, {3.4361591188, 1.0254516913}, }; double x, p, srt, f, g; int i,j; srt = sigma[k] * M_SQRT2; p = 0.0; for(i = 0; i < 10; i++) { x = gauss_hermite[i][0]; f = exp(-x*x); g = f; /* don't compute full product if too small to matter (less than 1%) */ for(j = 0; (j < n) && (g > 0.01); j++) { if( j == k ) continue; g *= (1.0 - ndtr( ((mu[k] + x * srt) - mu[j])/sigma[j] )); } p += gauss_hermite[i][1] * g; } return p * M_2_SQRTPI / 2.0; } dbacl-1.14.1/src/rfc2822.c000066400000000000000000001145721325773323600147130ustar00rootroot00000000000000/* * Copyright (C) 2004 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dbacl.h" #include "hmine.h" #include "util.h" /*********************************************************** * PARSING FUNCTIONS RFC 2822/2821 * * The skip functions operate as follows: if line is NULL, * * the function returns NULL. Otherwise, line is returned * * as a pointer to the first character after the skipped * * pattern. If the patterns couldn't be traversed * * successfully, the function returns NULL. * ***********************************************************/ /*********************************************************** * GENERAL LEXICAL TOKENS * ***********************************************************/ static __inline__ char *skip_recursive(char *line, char opening, char closing, char quote) { int c = 1; if( !line || !(*line == opening) ) { return NULL; } line++; while( *line ) { /* when closing == opening, we never increment c */ if( *line == closing ) { c--; } else if( *line == opening ) { c++; } else if( *line == quote ) { line++; } line++; if( c <= 0 ) { break; } } return (c == 0) ? line : NULL; } static __inline__ char *skip_single_char(char *line, char what) { if( !line || (*line != what) ) { return NULL; } return ++line; } static __inline__ char *skip_twodigit(char *line) { if( !line || !isdigit((int)line[0]) || !isdigit((int)line[1]) ) { return NULL; } line += 2; return line; } static __inline__ char *skip_onetwodigit(char *line) { if( !line || !isdigit((int)line[0]) ) { return NULL; } line++; if( isdigit((int)line[0]) ) { line++; } return line; } static __inline__ char *skip_fourdigit(char *line) { if( !line || !isdigit((int)line[0]) || !isdigit((int)line[1]) || !isdigit((int)line[2]) || !isdigit((int)line[3]) ) { return NULL; } line += 4; return line; } static __inline__ char *skip_single_string(char *line, char *what) { if( !line || (strncasecmp(line, what, strlen(what)) != 0) ) { return NULL; } return line + strlen(what); } static __inline__ char *skip_string_list(char *line, char *list[], int n) { int i; if( !line ) { return NULL; } for(i = 0; i < n; i++) { if( strncasecmp(line, list[i], strlen(list[i])) == 0 ) { return line + strlen(list[i]); } } return NULL; } /*********************************************************** * RFC 2822 LEXICAL TOKENS * ***********************************************************/ /* fws parsing is slightly wrong: we don't check for CRLF as a unit, * instead we accept isspace(). It's possible the OS has mangled the actual CRLF. */ static __inline__ char *skip_2822_fws(char *line) { if( !line ) { return NULL; } while( !isblank((int)*line) ) { if( !isspace((int)*line) ) { return NULL; } line++; } line++; while( isblank((int)*line) ) { line++; } return line; } /* the grammar sometimes allows constructs such as token1 token2, where * token1 = t1 [CFWS] and token2 = CFWS t2. By the time token1 was parsed, * token2 cannot be obtained anymore! We could change the grammar, or we could * inspect token pairs critically to prevent this special case. The easiest solution * is to allow FWS "undo" and use it just before CFWS. Use this carefully only if you * know you can't fall off the beginning of the string. */ static __inline__ char *unskip_2822_fws(char *line) { while( line && isspace((int)line[-1]) ) { line--; } return line; } static __inline__ char *skip_2822_cfws(char *line, int min) { char *tmp; if( !line ) { return NULL; } while(min-- > 0) { if( isspace((int)*line ) ) { line = skip_2822_fws(line); } else if( *line == '(' ) { line = skip_recursive(line, '(', ')', '\\'); } else { return NULL; } } /* below space is optional */ while( line ) { if( isspace((int)*line ) ) { tmp = skip_2822_fws(line); if( tmp ) { line = tmp; } else { break; } } else if( *line == '(' ) { line = skip_recursive(line, '(', ')', '\\'); } else { break; } } return line; } static __inline__ char *skip_2822_obs_list(char *line, token_delim_t *tok, char *(*skip)(char *,token_delim_t *, options_t opt), options_t opt) { char *tmp; BOT; tmp = (*skip)(line, NULL, opt); if( tmp ) { line = tmp; } line = skip_2822_cfws(line, 0); line = skip_single_char(line, ','); line = skip_2822_cfws(line, 0); do { tmp = (*skip)(line, NULL, opt); if( tmp ) { line = tmp; } tmp = skip_2822_cfws(line, 0); tmp = skip_single_char(tmp, ','); tmp = skip_2822_cfws(tmp, 0); if( tmp ) { line = tmp; } } while( tmp ); EOT; DT("2822_obs_list"); return line; } char *skip_2822_seq(char *line, token_delim_t *tok, char *(*skip)(char *,token_delim_t *, options_t), char delim, options_t opt) { char *tmp; BOT; line = (*skip)(line, NULL, opt); tmp = skip_single_char(line, delim); while( tmp ) { line = (*skip)(tmp, NULL, opt); tmp = skip_single_char(line, delim); } EOT; DT("2822_seq"); return line; } static char rfc2822_atom[256] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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', '9', 0, 0, 0, '=', 0, '?', 0, '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, 0, 0, '^', '_', '`', '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, }; static __inline__ char *skip_2822_1atext(char *line, token_delim_t *tok, options_t opt) { if( !line || (rfc2822_atom[(unsigned int)*line] != *line) ) { return NULL; } BOT; while( rfc2822_atom[(unsigned int)*line] == *line ) { line++; } EOT; DT("2822_atext"); return line; } static __inline__ char *skip_2822_quoted_string(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_cfws(line, 0); BOT; line = skip_recursive(line, '"', '"', '\\'); EOT; line = skip_2822_cfws(line, 0); DT("2822_quoted_string"); return line; } static __inline__ char *skip_2822_atom(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_cfws(line, 0); BOT; line = skip_2822_1atext(line, NULL, opt); EOT; line = skip_2822_cfws(line, 0); DT("2822_atom"); return line; } static __inline__ char *skip_2822_word(char *line, token_delim_t *tok, options_t opt) { char *tmp = line; if( !line ) { return NULL; } BOT; line = skip_2822_quoted_string(line, NULL, opt); if( !line ) { line = skip_2822_atom(tmp, NULL, opt); } EOT; DT("2822_word"); return line; } static __inline__ char *skip_2822_dot_atom_text(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_seq(line, tok, skip_2822_1atext, '.', opt); DT("2822_dot_atom_text"); return line; } static __inline__ char *skip_2822_dot_atom(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_cfws(line, 0); BOT; line = skip_2822_dot_atom_text(line, tok, opt); EOT; line = skip_2822_cfws(line, 0); DT("2822_dot_atom"); return line; } static __inline__ char *skip_2822_domain_literal(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_cfws(line, 0); if( !line || (*line != '[') ) { return NULL; } BOT; line = skip_recursive(line, '[', ']', '\\'); EOT; line = skip_2822_cfws(line, 0); DT("2822_domain_literal"); return line; } static __inline__ char *skip_2822_obs_domain(char *line, token_delim_t *tok, options_t opt) { line = skip_2822_seq(line, tok, skip_2822_atom, '.', opt); DT("2822_obs_domain"); return line; } static __inline__ char *skip_2822_domain(char *line, token_delim_t *tok, options_t opt) { if( !line ) { return NULL; } BOT; if( *line == '[' ) { line = skip_2822_domain_literal(line, NULL, opt); } else { /* we try obs form before normal form, as both could work and normal form would be smaller */ if( opt & (1<'); EOT; line = skip_2822_cfws(line, 0); DT("2822_obs_angle_addr"); return line; } static __inline__ char *skip_2822_obs_path(char *line, token_delim_t *tok, options_t opt) { opt |= (1<'); if( (opt & (1<'); if( (opt & (1<'); EOT; line = skip_2822_cfws(line, 0); DT("2822_msg_id"); return line; } static __inline__ char *skip_2822_refs(char *line, token_delim_t *tok, options_t opt) { char *tmp; BOT; line = skip_2822_msg_id(line, NULL, opt); tmp = skip_2822_msg_id(line, NULL, opt); while( tmp ) { line = tmp; tmp = skip_2822_msg_id(line, NULL, opt); } EOT; DT("2822_refs"); return line; } static __inline__ char *skip_2822_text(char *line, token_delim_t *tok) { if( !line ) { return NULL; } BOT; while( *line ) { line++; } EOT; DT("2822_text"); return line; } static __inline__ char *skip_2822_field_name(char *line, char *name, options_t opt) { line = skip_single_string(line, name); if( (opt & (1< 2) ) { return NULL; } while( isspace((int)*line) ) { line++; } return (*line) ? NULL : line; } /*********************************************************** * FULL RFC 822 HEADER LINES * ***********************************************************/ char *parse_2822_return(char *line, parse_2822_pth_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_pth_t)); line = skip_2822_field_name(line, "Return-Path", opt); line = skip_2822_path(line, &p->path_, opt); return skip_2822_end_of_line(line); } char *parse_2822_received(char *line, parse_2822_rcv_t *p, options_t opt) { char *tmp; memset(p, 0, sizeof(parse_2822_rcv_t)); line = skip_2822_field_name(line, "Received", opt); tmp = line; line = skip_2822_name_val_list(line, &p->naval_, opt); line = skip_single_char(line, ';'); line = skip_2822_date_time(line, &p->datetime_, opt); if( (opt & (1<naval_, opt); } return skip_2822_end_of_line(line); } char *parse_2822_from(char *line, parse_2822_mls_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_mls_t)); line = skip_2822_field_name(line, "From", opt); line = skip_2822_mailbox_list(line, &p->mailboxl_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_from(char *line, parse_2822_mls_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_from(line, p, opt); } char *parse_2822_sender(char *line, parse_2822_mbx_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_mbx_t)); line = skip_2822_field_name(line, "Sender", opt); line = skip_2822_mailbox(line, &p->mailbox_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_sender(char *line, parse_2822_mbx_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_sender(line, p, opt); } char *parse_2822_reply_to(char *line, parse_2822_als_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_als_t)); line = skip_2822_field_name(line, "Reply-To", opt); line = skip_2822_address_list(line, &p->addressl_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_reply_to(char *line, parse_2822_als_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_reply_to(line, p, opt); } char *parse_2822_to(char *line, parse_2822_als_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_als_t)); line = skip_2822_field_name(line, "To", opt); line = skip_2822_address_list(line, &p->addressl_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_to(char *line, parse_2822_als_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_to(line, p, opt); } char *parse_2822_cc(char *line, parse_2822_als_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_als_t)); line = skip_2822_field_name(line, "Cc", opt); line = skip_2822_address_list(line, &p->addressl_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_cc(char *line, parse_2822_als_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_cc(line, p, opt); } char *parse_2822_bcc(char *line, parse_2822_als_t *p, options_t opt) { char *tmp; memset(p, 0, sizeof(parse_2822_als_t)); line = skip_2822_field_name(line, "Bcc", opt); tmp = skip_2822_address_list(line, &p->addressl_, opt); if( tmp ) { line = tmp; } else { line = skip_2822_cfws(line, 0); } return skip_2822_end_of_line(line); } char *parse_2822_resent_bcc(char *line, parse_2822_als_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_bcc(line, p, opt); } char *parse_2822_message_id(char *line, parse_2822_mid_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_mid_t)); line = skip_2822_field_name(line, "Message-ID", opt); line = skip_2822_msg_id(line, &p->msg_id_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_message_id(char *line, parse_2822_mid_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_message_id(line, p, opt); } char *parse_2822_date(char *line, parse_2822_dat_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_dat_t)); line = skip_2822_field_name(line, "Date", opt); line = skip_2822_date_time(line, &p->datetime_, opt); return skip_2822_end_of_line(line); } char *parse_2822_resent_date(char *line, parse_2822_dat_t *p, options_t opt) { line = skip_single_string(line, "Resent-"); return parse_2822_date(line, p, opt); } char *parse_2822_in_reply_to(char *line, parse_2822_ref_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_ref_t)); line = skip_2822_field_name(line, "In-Reply-To", opt); line = skip_2822_refs(line, &p->refs_, opt); return skip_2822_end_of_line(line); } char *parse_2822_references(char *line, parse_2822_ref_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_ref_t)); line = skip_2822_field_name(line, "References", opt); line = skip_2822_refs(line, &p->refs_, opt); return skip_2822_end_of_line(line); } char *parse_2822_subject(char *line, parse_2822_txt_t *p, options_t opt) { memset(p, 0, sizeof(parse_2822_txt_t)); line = skip_2822_field_name(line, "Subject", opt); line = skip_2822_text(line, &p->text_); return skip_2822_end_of_line(line); } /*********************************************************** * RFC 2821 LEXICAL TOKENS * ***********************************************************/ static __inline__ char *skip_2821_sub_domain(char *line, token_delim_t *tok, options_t opt) { if( !line || !isalnum((int)*line) ) { return NULL; } BOT; line++; while( isalnum((int)*line) || (*line == '-') ) { line++; } EOT; if( line[-1] == '-' ) { return NULL; } DT("2821_sub_domain"); return line; } /* this is not correct, but we won't quibble */ static __inline__ char *skip_2821_address_literal(char *line) { return skip_recursive(line, '[', ']', '\\'); } static __inline__ char *skip_2821_domain(char *line, token_delim_t *tok, options_t opt) { char *tmp; if( !line ) { return NULL; } BOT; if( *line == '[' ) { line = skip_2821_address_literal(line); } else { line = skip_2821_sub_domain(line, NULL, opt); tmp = skip_single_char(line, '.'); tmp = skip_2822_seq(tmp, NULL, skip_2821_sub_domain, '.', opt); if( tmp ) { line = tmp; } else if( !(opt & (1<'); EOT; DT("2821_path"); return line; } static __inline__ char *skip_2821_reverse_path(char *line, token_delim_t *tok, options_t opt) { return skip_2821_path(line, tok, opt); } static __inline__ char *skip_2821_tcp_info(char *line, options_t opt) { if( !line ) { return NULL; } if( *line == '[' ) { return skip_2821_address_literal(line); } line = skip_2821_domain(line, NULL, opt); line = skip_2822_fws(line); return skip_2821_address_literal(line); } static __inline__ char *skip_2821_extended_domain(char *line, token_delim_t *tok, options_t opt) { char *tmp; if( !line ) { return NULL; } BOT; if( *line == '[' ) { line = skip_2821_address_literal(line); line = skip_2822_fws(line); line = skip_single_char(line, '('); line = skip_2821_tcp_info(line, opt); line = skip_single_char(line, ')'); } else { line = skip_2821_domain(line, NULL, opt); tmp = skip_2822_fws(line); tmp = skip_single_char(tmp, '('); tmp = skip_2821_tcp_info(tmp, opt); tmp = skip_single_char(tmp, ')'); if( tmp ) { line = tmp; } else if( opt & (1<path_, opt); return skip_2822_end_of_line(line); } char *parse_2821_time_stamp_line(char *line, parse_2821_rcv_t *p, options_t opt) { char *tmp; memset(p, 0, sizeof(parse_2821_rcv_t)); line = skip_single_string(line, "Received:"); line = skip_2822_fws(line); line = skip_2821_from_domain(line, &p->from_, opt); line = skip_2821_by_domain(line, &p->by_, opt); tmp = skip_single_string(line, "via"); if( tmp ) { line = skip_2822_fws(tmp); line = skip_2821_link(line, &p->via_, opt); tmp = unskip_2822_fws(line); /* link eats trailing space */ tmp = skip_2822_cfws(line, 1); if( tmp ) { line = tmp; } else if( !(opt & (1<with_, opt); tmp = unskip_2822_fws(line); /* protocol eats trailing space */ tmp = skip_2822_cfws(line, 1); if( tmp ) { line = tmp; } else if( !(opt & (1<smid_, opt); tmp = unskip_2822_fws(line); /* id eats trailing space */ tmp = skip_2822_cfws(line, 1); if( tmp ) { line = tmp; } else if( !(opt & (1<for_, opt); tmp = unskip_2822_fws(line); /* previous eats trailing space */ tmp = skip_2822_cfws(line, 1); if( tmp ) { line = tmp; } else if( !(opt & (1<datetime_, opt); return skip_2822_end_of_line(line); } dbacl-1.14.1/src/rfc822.c000066400000000000000000000717271325773323600146350ustar00rootroot00000000000000/* * Copyright (C) 2004 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dbacl.h" #include "hmine.h" #include "util.h" /*********************************************************** * PARSING FUNCTIONS RFC 822/821 * * The skip functions operate as follows: if line is NULL, * * the function returns NULL. Otherwise, line is returned * * as a pointer to the first character after the skipped * * pattern. If the patterns couldn't be traversed * * successfully, the function returns NULL. * ***********************************************************/ /*********************************************************** * GENERAL LEXICAL TOKENS * ***********************************************************/ static __inline__ char *skip_recursive(char *line, char opening, char closing, char quote) { int c = 1; if( !line || !(*line == opening) ) { return NULL; } line++; while( *line ) { /* when closing == opening, we never increment c */ if( *line == closing ) { c--; } else if( *line == opening ) { c++; } else if( *line == quote ) { line++; } line++; if( c <= 0 ) { break; } } return (c == 0) ? line : NULL; } static __inline__ char *skip_single_char(char *line, char what) { if( !line || (*line != what) ) { return NULL; } return ++line; } static __inline__ char *skip_twodigit(char *line) { if( !line || !isdigit((int)line[0]) || !isdigit((int)line[1]) ) { return NULL; } line += 2; return line; } static __inline__ char *skip_fourdigit(char *line) { if( !line || !isdigit((int)line[0]) || !isdigit((int)line[1]) || !isdigit((int)line[2]) || !isdigit((int)line[3]) ) { return NULL; } line += 4; return line; } static __inline__ char *skip_single_string(char *line, char *what) { if( !line || (strncasecmp(line, what, strlen(what)) != 0) ) { return NULL; } return line + strlen(what); } static __inline__ char *skip_string_list(char *line, char *list[], int n) { int i; if( !line ) { return NULL; } for(i = 0; i < n; i++) { if( strncasecmp(line, list[i], strlen(list[i])) == 0 ) { return line + strlen(list[i]); } } return NULL; } /*********************************************************** * RFC 822 LEXICAL TOKENS * ***********************************************************/ /* comments can contain basically any character, except an unquoted * \r. However, a fold can exist within a comment, so \r\n is * acceptable. Since the OS may have converted this sequence, it's * possible this shows up as \r only. So we accept unquoted \r in * comments also. */ static __inline__ char *skip_822_comment(char *line, token_delim_t *tok) { BOT; line = skip_recursive(line, '(', ')', '\\'); EOT; DT("822_comment"); return line; } /* This accepts not just LWSP-char, but also \r, \n, because folds can * happen just about anywhere. Also, parsing is slightly wrong: we * don't check for "\r\n" as a fold, but accept "\r", or "\n"; this * isn't just lazyness: it's also possible the OS has already * converted end of line sequences before we see them. */ static __inline__ char *skip_822_lwsp(char *line, int min) { if( !line ) { return NULL; } for(; min-- > 0; line++) { if( !isspace((int)*line) ) { return NULL; } } while(line) { if( isspace((int)*line) ) { line++; } else if( *line == '(' ) { line = skip_822_comment(line, NULL); } else { break; } } return line; } /* * parsing is slightly wrong: we don't check for "\r\n[ \t]+" * sequences, this isn't just lazyness: it's also possible the OS has * converted end of line sequences before we see them. */ static __inline__ char *skip_822_linwsp(char *line) { return skip_822_lwsp(line, 1); } static __inline__ char *assert_char(char *line, char c) { return (line && (*line == c)) ? line : NULL; } static __inline__ char *skip_822_sharp(char *line, token_delim_t *tok, char *(*skip)(char *,token_delim_t *), int min) { char *tmp; BOT; while( line && (min > 0) ) { while( line && (*line == ',') ) { min--; line = skip_822_lwsp(line, 0); } line = (*skip)(line, NULL); line = skip_822_lwsp(line, 0); min--; } tmp = line; while( tmp ) { while( tmp && (*tmp == ',') ) { tmp = skip_822_lwsp(tmp + 1, 0); } if( tmp ) { line = tmp; } tmp = (*skip)(tmp, NULL); tmp = skip_822_lwsp(tmp, 0); if( tmp ) { line = tmp; } } EOT; DT("822_sharp"); return line; } char *skip_822_seq(char *line, token_delim_t *tok, char *(*skip)(char *,token_delim_t *), char delim) { char *tmp; BOT; line = (*skip)(line, NULL); tmp = skip_822_lwsp(line, 0); tmp = skip_single_char(tmp, delim); while( tmp ) { line = skip_822_lwsp(tmp, 0); line = (*skip)(line, NULL); tmp = skip_822_lwsp(line, 0); tmp = skip_single_char(tmp, delim); } EOT; DT("821_seq"); return line; } static char rfc822_atom[256] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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', '9', 0, 0, 0, '=', 0, '?', 0, '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, 0, 0, '^', '_', '`', '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, }; static __inline__ char *skip_822_atom(char *line, token_delim_t *tok) { if( !line || (rfc822_atom[(unsigned int)*line] != *line) ) { return NULL; } BOT; while( rfc822_atom[(unsigned int)*line] == *line ) { line++; } EOT; DT("822_atom"); return line; } static __inline__ char *skip_822_quoted_string(char *line, token_delim_t *tok) { BOT; line = skip_recursive(line, '"', '"', '\\'); EOT; DT("822_quoted_string"); return line; } /* normally text can't include "\r\n", but we're lenient ;) */ static __inline__ char *skip_822_text(char *line, token_delim_t *tok) { if( !line ) { return NULL; } BOT; while( *line ) { line++; } EOT; DT("822_text"); return line; } static __inline__ char *skip_822_domain_literal(char *line, token_delim_t *tok) { BOT; line = skip_recursive(line, '[', ']', '\\'); EOT; DT("822_domain_literal"); return line; } static __inline__ char *skip_822_word(char *line, token_delim_t *tok) { BOT; if( line && (*line == '"') ) { line = skip_822_quoted_string(line, NULL); } else { line = skip_822_atom(line, NULL); } EOT; DT("822_word"); return line; } static __inline__ char *skip_822_phrase(char *line, token_delim_t *tok) { char *tmp; BOT; line = skip_822_word(line, NULL); tmp = skip_822_lwsp(line, 0); tmp = skip_822_word(tmp, NULL); while(tmp) { line = tmp; tmp = skip_822_lwsp(line, 0); tmp = skip_822_word(tmp, NULL); } EOT; DT("822_phrase"); return line; } static __inline__ char *skip_822_phrase_list(char *line, token_delim_t *tok, int min) { line = skip_822_sharp(line, tok, skip_822_phrase, min); DT("822_phrase_list"); return line; } static __inline__ char *skip_822_domain_ref(char *line, token_delim_t *tok) { return skip_822_atom(line, tok); } static __inline__ char *skip_822_sub_domain(char *line, token_delim_t *tok) { BOT; if( line && (*line == '[') ) { line = skip_822_domain_literal(line, NULL); } else { line = skip_822_domain_ref(line, NULL); } EOT; DT("822_sub_domain"); return line; } static __inline__ char *skip_822_domain(char *line, token_delim_t *tok) { BOT; line = skip_822_seq(line, tok, skip_822_sub_domain, '.'); EOT; DT("822_domain"); return line; } static __inline__ char *skip_822_local_part(char *line, token_delim_t *tok) { BOT; line = skip_822_seq(line, tok, skip_822_word, '.'); EOT; DT("822_local_part"); return line; } static __inline__ char *skip_822_addr_spec(char *line, token_delim_t *tok) { BOT; line = skip_822_local_part(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, '@'); line = skip_822_lwsp(line, 0); line = skip_822_domain(line, NULL); EOT; DT("822_addr_spec"); return line; } static __inline__ char *skip_822_msg_id(char *line, token_delim_t *tok) { BOT; line = skip_single_char(line, '<'); line = skip_822_lwsp(line, 0); line = skip_822_addr_spec(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, '>'); EOT; DT("822_msg_id"); return line; } static __inline__ char *skip_822_at_domain(char *line, token_delim_t *tok) { BOT; line = skip_single_char(line, '@'); line = skip_822_lwsp(line, 0); line = skip_822_domain(line, NULL); EOT; DT("822_at_domain"); return line; } static __inline__ char *skip_822_route(char *line, token_delim_t *tok) { line = skip_822_sharp(line, tok, skip_822_at_domain, 1); line = skip_822_lwsp(line,0); line = skip_single_char(line, ':'); EOT; DT("822_route"); return line; } static __inline__ char *skip_822_route_addr(char *line, token_delim_t *tok) { char *tmp; BOT; line = skip_single_char(line, '<'); line = skip_822_lwsp(line, 0); tmp = skip_822_route(line, NULL); if( tmp ) { line = tmp; line = skip_822_lwsp(line, 0); } line = skip_822_addr_spec(line, NULL); line = skip_single_char(line, '>'); EOT; DT("822_route_addr"); return line; } static __inline__ char *skip_822_mailbox(char *line, token_delim_t *tok) { char *tmp = line; BOT; line = skip_822_addr_spec(line, NULL); if( !line ) { line = skip_822_phrase(tmp, NULL); line = skip_822_lwsp(line, 0); line = skip_822_route_addr(line, NULL); } EOT; DT("822_mailbox"); return line; } static __inline__ char *skip_822_mailbox_list(char *line, token_delim_t *tok, int min) { line = skip_822_sharp(line, tok, skip_822_mailbox, min); DT("822_mailbox_list"); return line; } static __inline__ char *skip_822_field_name(char *line, char *field_no_colon) { line = skip_single_string(line, field_no_colon); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ':'); return line; } static __inline__ char *skip_822_group(char *line, token_delim_t *tok) { BOT; line = skip_822_phrase(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ':'); line = skip_822_lwsp(line, 0); line = skip_822_sharp(line, tok, skip_822_mailbox, 0); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ';'); EOT; DT("822_group"); return line; } static __inline__ char *skip_822_address(char *line, token_delim_t *tok) { char *tmp; BOT; tmp = skip_822_mailbox(line, NULL); if( tmp ) { line = tmp; } else { line = skip_822_group(line, NULL); } EOT; DT("822_address"); return line; } static __inline__ char *skip_822_address_list(char *line, token_delim_t *tok, int min) { line = skip_822_sharp(line, tok, skip_822_address, min); DT("822_address_list"); return line; } static __inline__ char *skip_822_refs(char *line, token_delim_t *tok) { BOT; while( line ) { if( *line == '<' ) { line = skip_822_msg_id(line, NULL); } else { line = skip_822_phrase(line, NULL); } line = skip_822_lwsp(line, 0); } EOT; DT("822_address"); return line; } static __inline__ char *skip_822_hour(char *line, token_delim_t *tok) { char *tmp; line = skip_twodigit(line); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ':'); line = skip_822_lwsp(line, 0); line = skip_twodigit(line); tmp = skip_822_lwsp(line, 0); tmp = skip_single_char(tmp, ':'); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_twodigit(line); } return line; } static __inline__ char *skip_822_zone_name(char *line) { static char *zone_name[] = { "UT", "GMT", "EST", "EDT", "CST", "CDT", "MST", "MDT", "PST", "PDT" }; return skip_string_list(line, zone_name, sizeof(zone_name)/sizeof(char*)); } static __inline__ char *skip_822_zone(char *line, token_delim_t *tok) { if( !line ) { return NULL; } BOT; if( isalpha((int)line[0]) ) { if( !isalpha((int)line[1]) ) { line++; } else { line = skip_822_zone_name(line); } } else if( (line[0] == '+') || (line[0] == '-') ) { line = skip_822_lwsp(line, 0); line = skip_fourdigit(line); } else { line = NULL; } EOT; DT("822_zone"); return line; } static __inline__ char *skip_822_time(char *line, token_delim_t *tok) { BOT; line = skip_822_hour(line, NULL); line = skip_822_lwsp(line, 0); line = skip_822_zone(line, NULL); EOT; DT("822_time"); return line; } static __inline__ char *skip_822_day_name(char *line) { static char *day_name[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" }; return skip_string_list(line, day_name, sizeof(day_name)/sizeof(char*)); } static __inline__ char *skip_822_month_name(char *line) { static char *month_name[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; return skip_string_list(line, month_name, sizeof(month_name)/sizeof(char*)); } static __inline__ char *skip_822_date(char *line, token_delim_t *tok) { BOT; line = skip_twodigit(line); line = skip_822_lwsp(line, 0); line = skip_822_month_name(line); line = skip_822_lwsp(line, 0); line = skip_twodigit(line); EOT; DT("822_date"); return line; } static __inline__ char *skip_822_date_time(char *line, token_delim_t *tok) { char *tmp; BOT; tmp = skip_822_day_name(line); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_single_char(line, ','); line = skip_822_lwsp(line, 0); } line = skip_822_date(line, NULL); line = skip_822_lwsp(line, 0); line = skip_822_time(line, NULL); EOT; DT("822_date_time"); return line; } static __inline__ char *skip_822_end_of_line(char *line) { /* there should be nothing left except CRLF or folding space, and * the CRLF could be absent or mangled by OS. */ line = skip_822_lwsp(line,0); if( line && *line ) { return NULL; } return line; } /*********************************************************** * FULL RFC 822 HEADER LINES * ***********************************************************/ char *parse_822_return(char *line, parse_822_pth_t *p) { memset(p, 0, sizeof(parse_822_pth_t)); line = skip_822_field_name(line, "Return-path"); line = skip_822_lwsp(line, 0); line = skip_822_route_addr(line, &p->path_); return skip_822_end_of_line(line); } char *parse_822_received(char *line, parse_822_rcv_t *p) { char *tmp; memset(p, 0, sizeof(parse_822_rcv_t)); line = skip_822_field_name(line, "Received"); line = skip_822_lwsp(line, 0); tmp = skip_single_string(line, "from"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_domain(line, &p->from_); line = skip_822_lwsp(line, 0); } tmp = skip_single_string(line, "by"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_domain(line, &p->by_); line = skip_822_lwsp(line, 0); } tmp = skip_single_string(line, "via"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_atom(line, &p->via_); line = skip_822_lwsp(line, 0); } tmp = skip_single_string(line, "with"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_atom(line, &p->withl_); line = skip_822_lwsp(line, 0); } tmp = skip_single_string(line, "with"); while( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_atom(line, NULL); p->withl_.end = line; line = skip_822_lwsp(line, 0); tmp = skip_single_string(line, "with"); } tmp = skip_single_string(line, "id"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_msg_id(line, &p->id_); line = skip_822_lwsp(line, 0); } tmp = skip_single_string(line, "for"); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_822_addr_spec(line, &p->for_); line = skip_822_lwsp(line, 0); } line = skip_single_char(line, ';'); line = skip_822_lwsp(line, 0); line = skip_822_date_time(line, &p->datetime_); return skip_822_end_of_line(line); } char *parse_822_reply_to(char *line, parse_822_als_t *p) { memset(p, 0, sizeof(parse_822_als_t)); line = skip_822_field_name(line, "Reply-To"); line = skip_822_lwsp(line, 0); line = skip_822_address_list(line, &p->addressl_, 1); return skip_822_end_of_line(line); } char *parse_822_from(char *line, parse_822_mls_t *p) { memset(p, 0, sizeof(parse_822_mls_t)); line = skip_822_field_name(line, "From"); line = skip_822_lwsp(line, 0); line = skip_822_mailbox_list(line, &p->mailboxl_, 1); return skip_822_end_of_line(line); } char *parse_822_sender(char *line, parse_822_mbx_t *p) { memset(p, 0, sizeof(parse_822_mbx_t)); line = skip_822_field_name(line, "Sender"); line = skip_822_lwsp(line, 0); line = skip_822_mailbox_list(line, &p->mailbox_, 1); return skip_822_end_of_line(line); } char *parse_822_resent_reply_to(char *line, parse_822_als_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_reply_to(line, p); } char *parse_822_resent_from(char *line, parse_822_mls_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_from(line, p); } char *parse_822_resent_sender(char *line, parse_822_mbx_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_sender(line, p); } char *parse_822_date(char *line, parse_822_dat_t *p) { memset(p, 0, sizeof(parse_822_dat_t)); line = skip_822_field_name(line, "Date"); line = skip_822_lwsp(line, 0); line = skip_822_date_time(line, &p->datetime_); return skip_822_end_of_line(line); } char *parse_822_resent_date(char *line, parse_822_dat_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_date(line, p); } char *parse_822_to(char *line, parse_822_als_t *p) { memset(p, 0, sizeof(parse_822_als_t)); line = skip_822_field_name(line, "To"); line = skip_822_lwsp(line, 0); line = skip_822_address_list(line, &p->addressl_, 1); return skip_822_end_of_line(line); } char *parse_822_resent_to(char *line, parse_822_als_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_to(line, p); } char *parse_822_cc(char *line, parse_822_als_t *p) { memset(p, 0, sizeof(parse_822_als_t)); line = skip_822_field_name(line, "cc"); line = skip_822_lwsp(line, 0); line = skip_822_address_list(line, &p->addressl_, 1); return skip_822_end_of_line(line); } char *parse_822_resent_cc(char *line, parse_822_als_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_cc(line, p); } char *parse_822_bcc(char *line, parse_822_als_t *p) { memset(p, 0, sizeof(parse_822_als_t)); line = skip_822_field_name(line, "bcc"); line = skip_822_lwsp(line, 0); line = skip_822_address_list(line, &p->addressl_, 0); return skip_822_end_of_line(line); } char *parse_822_resent_bcc(char *line, parse_822_als_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_bcc(line, p); } char *parse_822_message_id(char *line, parse_822_mid_t *p) { memset(p, 0, sizeof(parse_822_mid_t)); line = skip_822_field_name(line, "Message-ID"); line = skip_822_lwsp(line, 0); line = skip_822_msg_id(line, &p->msg_id_); return skip_822_end_of_line(line); } char *parse_822_resent_message_id(char *line, parse_822_mid_t *p) { line = skip_single_string(line, "Resent-"); return parse_822_message_id(line, p); } char *parse_822_in_reply_to(char *line, parse_822_ref_t *p) { memset(p, 0, sizeof(parse_822_ref_t)); line = skip_822_field_name(line, "In-Reply-To"); line = skip_822_lwsp(line, 0); line = skip_822_refs(line, &p->refs_); return skip_822_end_of_line(line); } char *parse_822_references(char *line, parse_822_ref_t *p) { memset(p, 0, sizeof(parse_822_ref_t)); line = skip_822_field_name(line, "References"); line = skip_822_lwsp(line, 0); line = skip_822_refs(line, &p->refs_); return skip_822_end_of_line(line); } char *parse_822_keywords(char *line, parse_822_pls_t *p) { memset(p, 0, sizeof(parse_822_pls_t)); line = skip_822_field_name(line, "Keywords"); line = skip_822_lwsp(line, 0); line = skip_822_phrase_list(line, &p->phrasel_, 0); return skip_822_end_of_line(line); } char *parse_822_subject(char *line, parse_822_txt_t *p) { memset(p, 0, sizeof(parse_822_txt_t)); line = skip_822_field_name(line, "Subject"); line = skip_822_lwsp(line, 0); line = skip_822_text(line, &p->text_); return skip_822_end_of_line(line); } char *parse_822_comments(char *line, parse_822_txt_t *p) { memset(p, 0, sizeof(parse_822_txt_t)); line = skip_822_field_name(line, "Comments"); line = skip_822_lwsp(line, 0); line = skip_822_text(line, &p->text_); return skip_822_end_of_line(line); } /*********************************************************** * RFC 821 LEXICAL TOKENS * ***********************************************************/ static __inline__ char *skip_821_name(char *line, token_delim_t *tok) { if( !line || !isalpha((int)*line) ) { return NULL; } BOT; while( isalnum((int)*line) || (*line == '-') ) { line++; } EOT; DT("821_name"); return line; } static __inline__ char *skip_821_number(char *line, token_delim_t *tok) { if( !line || !isdigit((int)*line) ) { return NULL; } BOT; while( isdigit((int)*line) ) { line++; } EOT; DT("821_number"); return line; } static __inline__ char *skip_821_dotnum(char *line, token_delim_t *tok) { if( !line ) { return NULL; } BOT; if( isdigit((int)*line) ) { line++; } else { return NULL; } if( isdigit((int)*line) ) { line++; } if( isdigit((int)*line) ) { line++; } if( *line != '.' ) { return NULL; } if( isdigit((int)*line) ) { line++; } else { return NULL; } if( isdigit((int)*line) ) { line++; } if( isdigit((int)*line) ) { line++; } if( *line != '.' ) { return NULL; } if( isdigit((int)*line) ) { line++; } else { return NULL; } if( isdigit((int)*line) ) { line++; } if( isdigit((int)*line) ) { line++; } if( *line != '.' ) { return NULL; } if( isdigit((int)*line) ) { line++; } else { return NULL; } if( isdigit((int)*line) ) { line++; } if( isdigit((int)*line) ) { line++; } EOT; DT("821_dotnum"); return line; } static __inline__ char *skip_821_element(char *line, token_delim_t *tok) { BOT; if( !line ) { return NULL; } else if( *line == '#' ) { line = skip_single_char(line, '#'); line = skip_822_lwsp(line, 0); line = skip_821_number(line, NULL); } else if( *line == '[' ) { line = skip_single_char(line, '['); line = skip_822_lwsp(line, 0); line = skip_821_dotnum(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ']'); } else { line = skip_821_name(line, NULL); } EOT; DT("821_element"); return line; } static __inline__ char *skip_821_domain(char *line, token_delim_t *tok) { BOT; line = skip_822_seq(line, tok, skip_821_element, '.'); EOT; DT("821_domain"); return line; } static __inline__ char *skip_821_string(char *line, token_delim_t *tok) { return skip_822_atom(line, tok); } static __inline__ char *skip_821_dot_string(char *line, token_delim_t *tok) { BOT; line = skip_822_seq(line, tok, skip_821_string, '.'); EOT; DT("821_dot_string"); return line; } static __inline__ char *skip_821_local_part(char *line, token_delim_t *tok) { if( !line ) { return NULL; } BOT; if( *line == '"' ) { line = skip_822_quoted_string(line, NULL); } else { line = skip_821_dot_string(line, NULL); } EOT; DT("821_local_part"); return line; } static __inline__ char *skip_821_mailbox(char *line, token_delim_t *tok) { BOT; line = skip_821_local_part(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, '@'); line = skip_822_lwsp(line, 0); line = skip_821_domain(line, NULL); EOT; DT("821_mailbox"); return line; } static __inline__ char *skip_821_at_domain(char *line, token_delim_t *tok) { BOT; line = skip_single_char(line, '@'); line = skip_822_lwsp(line, 0); line = skip_821_domain(line, NULL); EOT; DT("821_at_domain"); return line; } static __inline__ char *skip_821_adl(char *line, token_delim_t *tok) { BOT; line = skip_822_seq(line, tok, skip_821_at_domain, ','); EOT; DT("821_adl"); return line; } static __inline__ char *skip_821_path(char *line, token_delim_t *tok) { char *tmp; if( !line || (*line != '<') ) { return NULL; } BOT; line = skip_single_char(line, '<'); line = skip_822_lwsp(line, 0); tmp = skip_821_adl(line, NULL); if( tmp ) { line = skip_822_lwsp(tmp, 0); line = skip_single_char(line, ':'); line = skip_822_lwsp(line, 0); } line = skip_821_mailbox(line, NULL); line = skip_822_lwsp(line, 0); line = skip_single_char(line, '>'); EOT; DT("821_path"); return line; } static __inline__ char *skip_821_reverse_path(char *line, token_delim_t *tok) { return skip_821_path(line, tok); } static __inline__ char *skip_821_link(char *line, token_delim_t *tok) { return skip_822_atom(line, tok); } static __inline__ char *skip_821_protocol(char *line, token_delim_t *tok) { return skip_822_atom(line, tok); } static __inline__ char *skip_821_from_domain(char *line, token_delim_t *tok) { BOT; line = skip_single_string(line, "from"); line = skip_822_lwsp(line, 1); line = skip_821_domain(line, tok); EOT; line = skip_822_lwsp(line, 1); DT("821_from_domain"); return line; } static __inline__ char *skip_821_by_domain(char *line, token_delim_t *tok) { BOT; line = skip_single_string(line, "by"); line = skip_822_lwsp(line, 1); line = skip_821_domain(line, tok); EOT; line = skip_822_lwsp(line, 1); DT("821_by_domain"); return line; } static __inline__ char *skip_821_date(char *line, token_delim_t *tok) { BOT; line = skip_twodigit(line); line = skip_822_lwsp(line, 1); line = skip_822_month_name(line); line = skip_822_lwsp(line, 1); line = skip_twodigit(line); EOT; DT("821_date"); return line; } static __inline__ char *skip_821_time(char *line, token_delim_t *tok) { BOT; line = skip_twodigit(line); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ':'); line = skip_822_lwsp(line, 0); line = skip_twodigit(line); line = skip_822_lwsp(line, 0); line = skip_single_char(line, ':'); line = skip_822_lwsp(line, 0); line = skip_twodigit(line); line = skip_822_lwsp(line, 1); line = skip_822_zone_name(line); EOT; DT("821_time"); return line; } static __inline__ char *skip_821_daytime(char *line, token_delim_t *tok) { BOT; line = skip_821_date(line, NULL); line = skip_822_lwsp(line, 1); line = skip_821_time(line, NULL); EOT; DT("821_daytime"); return line; } /*********************************************************** * FULL RFC 821 HEADER LINES * ***********************************************************/ char *parse_821_return_path_line(char *line, parse_822_pth_t *p) { memset(p, 0, sizeof(parse_822_pth_t)); line = skip_single_string(line, "Return-Path:"); line = skip_822_lwsp(line, 1); line = skip_821_reverse_path(line, &p->path_); return skip_822_end_of_line(line); } char *parse_821_time_stamp_line(char *line, parse_821_rcv_t *p) { char *tmp; memset(p, 0, sizeof(parse_821_rcv_t)); line = skip_single_string(line, "Received:"); line = skip_822_lwsp(line, 1); line = skip_821_from_domain(line, &p->from_); line = skip_821_by_domain(line, &p->by_); tmp = skip_single_string(line, "via"); if( tmp ) { line = skip_822_lwsp(tmp, 1); line = skip_821_link(line, &p->via_); line = skip_822_lwsp(line, 1); } tmp = skip_single_string(line, "with"); if( tmp ) { line = skip_822_lwsp(tmp, 1); line = skip_821_protocol(line, &p->with_); line = skip_822_lwsp(line, 1); } tmp = skip_single_string(line, "id"); if( tmp ) { line = skip_822_lwsp(tmp, 1); line = skip_821_string(line, &p->id_); line = skip_822_lwsp(line, 1); } tmp = skip_single_string(line, "for"); if( tmp ) { line = skip_822_lwsp(tmp, 1); line = skip_821_path(line, &p->for_); line = skip_822_lwsp(line, 1); } line = skip_single_char(line, ';'); line = skip_822_lwsp(line, 1); line = skip_821_daytime(line, &p->datetime_); return skip_822_end_of_line(line); } dbacl-1.14.1/src/risk-lexer.c000066400000000000000000001403011325773323600156750ustar00rootroot00000000000000 #line 3 "risk-lexer.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef unsigned int yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 18 #define YY_END_OF_BUFFER 19 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[75] = { 0, 0, 0, 19, 17, 8, 9, 17, 17, 13, 14, 14, 17, 14, 14, 14, 14, 14, 17, 0, 15, 0, 4, 12, 13, 14, 14, 0, 16, 14, 14, 14, 14, 14, 14, 0, 10, 0, 12, 0, 11, 14, 14, 6, 7, 14, 14, 0, 0, 11, 14, 14, 14, 14, 14, 14, 0, 3, 14, 14, 0, 14, 14, 0, 14, 14, 0, 14, 14, 0, 1, 5, 0, 2, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 1, 8, 9, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 11, 11, 11, 11, 12, 13, 11, 11, 14, 11, 11, 11, 11, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 17, 18, 1, 19, 1, 20, 11, 21, 11, 22, 23, 24, 11, 25, 11, 11, 26, 27, 28, 29, 30, 11, 31, 32, 33, 11, 11, 11, 34, 35, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[36] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; static yyconst flex_int16_t yy_base[81] = { 0, 0, 118, 122, 124, 124, 124, 32, 111, 28, 0, 105, 101, 19, 84, 89, 87, 84, 111, 36, 124, 0, 124, 32, 36, 0, 100, 94, 124, 78, 83, 79, 85, 19, 82, 103, 124, 43, 40, 48, 0, 83, 74, 0, 0, 71, 73, 53, 91, 90, 75, 72, 78, 65, 66, 72, 66, 0, 61, 57, 70, 58, 44, 35, 45, 33, 34, 32, 28, 36, 0, 0, 25, 124, 124, 70, 38, 74, 77, 81, 85 } ; static yyconst flex_int16_t yy_def[81] = { 0, 74, 1, 74, 74, 74, 74, 75, 74, 74, 76, 76, 77, 76, 76, 76, 76, 76, 78, 75, 74, 79, 74, 74, 74, 76, 76, 77, 74, 76, 76, 76, 76, 76, 76, 78, 74, 80, 74, 74, 76, 76, 76, 76, 76, 76, 76, 80, 74, 74, 76, 76, 76, 76, 76, 76, 74, 76, 76, 76, 74, 76, 76, 74, 76, 76, 74, 76, 76, 74, 76, 76, 74, 74, 0, 74, 74, 74, 74, 74, 74 } ; static yyconst flex_int16_t yy_nxt[160] = { 0, 4, 5, 6, 7, 4, 8, 4, 4, 4, 9, 10, 10, 10, 11, 10, 12, 4, 4, 4, 10, 13, 14, 10, 10, 15, 16, 10, 10, 10, 17, 10, 10, 10, 10, 10, 20, 23, 24, 29, 20, 25, 38, 44, 39, 23, 24, 20, 30, 21, 38, 45, 39, 21, 39, 48, 48, 20, 49, 73, 21, 72, 39, 71, 70, 69, 68, 67, 66, 65, 21, 19, 19, 19, 19, 27, 27, 27, 35, 35, 35, 35, 37, 64, 37, 37, 47, 47, 47, 47, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 49, 49, 53, 52, 51, 50, 36, 46, 40, 43, 42, 41, 28, 40, 36, 34, 33, 32, 31, 28, 26, 22, 74, 18, 3, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74 } ; static yyconst flex_int16_t yy_chk[160] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 9, 9, 13, 19, 76, 23, 33, 23, 24, 24, 37, 13, 7, 38, 33, 38, 19, 23, 39, 39, 47, 39, 72, 37, 69, 38, 68, 67, 66, 65, 64, 63, 62, 47, 75, 75, 75, 75, 77, 77, 77, 78, 78, 78, 78, 79, 61, 79, 79, 80, 80, 80, 80, 60, 59, 58, 56, 55, 54, 53, 52, 51, 50, 49, 48, 46, 45, 42, 41, 35, 34, 32, 31, 30, 29, 27, 26, 18, 17, 16, 15, 14, 12, 11, 8, 3, 2, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "risk-lexer.l" #line 2 "risk-lexer.l" /* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Author: Laird Breyer */ #include #include #include "bayesol.h" #include "risk-parser.h" int yyerror(char *); int current_lineno = 1; YY_BUFFER_STATE handle; #line 537 "risk-lexer.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 44 "risk-lexer.l" #line 696 "risk-lexer.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 75 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 124 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 46 "risk-lexer.l" { return tCATEGORIES; } YY_BREAK case 2: YY_RULE_SETUP #line 47 "risk-lexer.l" { return tLOSS; } YY_BREAK case 3: YY_RULE_SETUP #line 48 "risk-lexer.l" { return tPRIOR; } YY_BREAK case 4: YY_RULE_SETUP #line 49 "risk-lexer.l" { yylval.numval = atoi(yytext + 1); if(yylval.numval > 0) yylval.numval--; return tMATCH; } YY_BREAK case 5: YY_RULE_SETUP #line 50 "risk-lexer.l" { return tCOMPLEXITY; } YY_BREAK case 6: YY_RULE_SETUP #line 51 "risk-lexer.l" { return tEXP; } YY_BREAK case 7: YY_RULE_SETUP #line 52 "risk-lexer.l" { return tLOG; } YY_BREAK case 8: YY_RULE_SETUP #line 53 "risk-lexer.l" /* ignore white space */ YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 54 "risk-lexer.l" { current_lineno++; } YY_BREAK case 10: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 55 "risk-lexer.l" /* ignore comments */ YY_BREAK case 11: YY_RULE_SETUP #line 56 "risk-lexer.l" { yylval.numval = strtod(yytext, NULL); return tNUMBER; } YY_BREAK case 12: YY_RULE_SETUP #line 57 "risk-lexer.l" { yylval.numval = strtod(yytext, NULL); return tNUMBER; } YY_BREAK case 13: YY_RULE_SETUP #line 58 "risk-lexer.l" { yylval.numval = strtod(yytext, NULL); return tNUMBER; } YY_BREAK case 14: YY_RULE_SETUP #line 59 "risk-lexer.l" { yylval.strval = strdup(yytext); return tNAME; } YY_BREAK case 15: /* rule 15 can match eol */ YY_RULE_SETUP #line 60 "risk-lexer.l" { yylval.strval = strdup(yytext+1); yylval.strval[yyleng - 2] = '\0'; return tREGEX; } YY_BREAK case 16: /* rule 16 can match eol */ YY_RULE_SETUP #line 62 "risk-lexer.l" { yylval.strval = strdup(yytext+1); yylval.strval[yyleng -2] = '\0'; return tVEC; } YY_BREAK case 17: YY_RULE_SETUP #line 64 "risk-lexer.l" { return *yytext; } YY_BREAK case 18: YY_RULE_SETUP #line 66 "risk-lexer.l" ECHO; YY_BREAK #line 878 "risk-lexer.c" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 75 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 75 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 74); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 66 "risk-lexer.l" void reset_lexer() { current_lineno = 1; } void lexer_prepare_string(char *buf) { handle = yy_scan_string(buf); } void lexer_free_string() { yy_delete_buffer(handle); } dbacl-1.14.1/src/risk-lexer.l000066400000000000000000000050641325773323600157140ustar00rootroot00000000000000%{ /* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Author: Laird Breyer */ #include #include #include "bayesol.h" #include "risk-parser.h" int yyerror(char *); int current_lineno = 1; YY_BUFFER_STATE handle; %} EXP "E"|"e" DIGIT [0-9] DECIMAL "." SIGN "+"|"-" INF "INF"|"inf" NUMBER1 {DIGIT}+{DECIMAL}{DIGIT}*{EXP}{SIGN}?{DIGIT}+|{INF} NUMBER2 {DIGIT}+{DECIMAL}{DIGIT}* NUMBER3 {DIGIT}+ NAME [A-Za-z][A-Za-z0-9]* REGEX \"[^\"\\]*(\\.[^\"\\]*)*\" VEC \[[^\[\]]*\] %% "categories" { return tCATEGORIES; } "loss_matrix" { return tLOSS; } "prior" { return tPRIOR; } \$[0-9] { yylval.numval = atoi(yytext + 1); if(yylval.numval > 0) yylval.numval--; return tMATCH; } "complexity" { return tCOMPLEXITY; } "exp" { return tEXP; } "log" { return tLOG; } [ \t] /* ignore white space */ [\n] { current_lineno++; } ^\#.*$ /* ignore comments */ {NUMBER1} { yylval.numval = strtod(yytext, NULL); return tNUMBER; } {NUMBER2} { yylval.numval = strtod(yytext, NULL); return tNUMBER; } {NUMBER3} { yylval.numval = strtod(yytext, NULL); return tNUMBER; } {NAME} { yylval.strval = strdup(yytext); return tNAME; } {REGEX} { yylval.strval = strdup(yytext+1); yylval.strval[yyleng - 2] = '\0'; return tREGEX; } {VEC} { yylval.strval = strdup(yytext+1); yylval.strval[yyleng -2] = '\0'; return tVEC; } . { return *yytext; } %% void reset_lexer() { current_lineno = 1; } void lexer_prepare_string(char *buf) { handle = yy_scan_string(buf); } void lexer_free_string() { yy_delete_buffer(handle); } dbacl-1.14.1/src/risk-parser.c000066400000000000000000001416601325773323600160630ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { tCATEGORIES = 258, tPRIOR = 259, tLOSS = 260, tEXP = 261, tLOG = 262, tNUMBER = 263, tMATCH = 264, tCOMPLEXITY = 265, tNAME = 266, tREGEX = 267, tVEC = 268 }; #endif /* Tokens. */ #define tCATEGORIES 258 #define tPRIOR 259 #define tLOSS 260 #define tEXP 261 #define tLOG 262 #define tNUMBER 263 #define tMATCH 264 #define tCOMPLEXITY 265 #define tNAME 266 #define tREGEX 267 #define tVEC 268 /* Copy the first part of user declarations. */ #line 1 "risk-parser.y" /* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Author: Laird Breyer */ #define YYDEBUG 0 #include #include #include #include #include "bayesol.h" extern char *yytext; extern FILE *yyin; extern int current_lineno; extern int yylex(void); extern void reset_lexer(); extern void lexer_prepare_string(char *buf); extern void lexer_free_string(); extern Spec spec; /* defined here */ void set_loss_and_increment(real_value_t v); int parse_loss_vec(category_count_t i, char *buf); int parse_risk_spec(FILE *input); int yyerror(char *s); void add_prior_weight(real_value_t w); void add_cat_name(char *n); void attach_cat_vec(char *n, char *r, char *v); category_count_t x, y; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 51 "risk-parser.y" { real_value_t numval; char *strval; } /* Line 187 of yacc.c. */ #line 177 "risk-parser.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 190 "risk-parser.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 16 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 83 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 24 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 10 /* YYNRULES -- Number of rules. */ #define YYNRULES 25 /* YYNRULES -- Number of states. */ #define YYNSTATES 58 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 268 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 23, 16, 14, 21, 15, 2, 17, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 2, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 9, 14, 16, 20, 25, 27, 31, 36, 40, 45, 47, 51, 53, 55, 57, 61, 65, 69, 73, 77, 81, 86 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 25, 0, -1, 26, 28, 30, -1, 32, -1, 3, 19, 27, 20, -1, 11, -1, 27, 21, 11, -1, 4, 19, 29, 20, -1, 8, -1, 29, 21, 8, -1, 5, 19, 31, 20, -1, 12, 11, 13, -1, 31, 12, 11, 13, -1, 33, -1, 32, 21, 33, -1, 8, -1, 9, -1, 10, -1, 33, 14, 33, -1, 33, 15, 33, -1, 33, 16, 33, -1, 33, 17, 33, -1, 33, 18, 33, -1, 22, 33, 23, -1, 6, 22, 33, 23, -1, 7, 22, 33, 23, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 80, 80, 81, 84, 87, 88, 91, 94, 95, 98, 101, 102, 105, 106, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "tCATEGORIES", "tPRIOR", "tLOSS", "tEXP", "tLOG", "tNUMBER", "tMATCH", "tCOMPLEXITY", "tNAME", "tREGEX", "tVEC", "'+'", "'-'", "'*'", "'/'", "'^'", "'{'", "'}'", "','", "'('", "')'", "$accept", "spec", "catlist", "catvec", "priorlist", "priorvec", "lossmat", "multivec", "flist", "formula", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 43, 45, 42, 47, 94, 123, 125, 44, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 1, 4, 1, 3, 4, 1, 3, 4, 3, 4, 1, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 15, 16, 17, 0, 0, 0, 3, 13, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 23, 0, 0, 2, 14, 18, 19, 20, 21, 22, 4, 0, 24, 25, 8, 0, 0, 6, 7, 0, 0, 0, 9, 0, 0, 10, 11, 0, 12 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 8, 9, 26, 18, 44, 32, 50, 10, 11 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -20 static const yytype_int8 yypact[] = { -3, 22, 31, 40, -20, -20, -20, 20, 63, 60, 44, 43, 55, 20, 20, -5, -20, 48, 64, 20, 20, 20, 20, 20, 20, -20, -19, 17, 29, -20, 62, 49, -20, 43, 21, 33, -1, 53, 53, -20, 61, -20, -20, -20, 34, 65, -20, -20, 66, 67, 36, -20, 68, 69, -20, -20, 70, -20 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -20, -20, -20, -20, -20, -20, -20, -20, -20, 1 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 1, 39, 40, 2, 3, 4, 5, 6, 15, 20, 21, 22, 23, 24, 27, 28, 23, 24, 29, 7, 33, 34, 35, 36, 37, 38, 2, 3, 4, 5, 6, 20, 21, 22, 23, 24, 21, 22, 23, 24, 41, 12, 7, 20, 21, 22, 23, 24, 53, 22, 23, 24, 42, 13, 47, 48, 54, 20, 21, 22, 23, 24, 14, 16, 17, 19, 25, 30, 45, 31, 43, 24, 46, 0, 51, 0, 0, 49, 52, 0, 56, 55, 0, 57 }; static const yytype_int8 yycheck[] = { 3, 20, 21, 6, 7, 8, 9, 10, 7, 14, 15, 16, 17, 18, 13, 14, 17, 18, 23, 22, 19, 20, 21, 22, 23, 24, 6, 7, 8, 9, 10, 14, 15, 16, 17, 18, 15, 16, 17, 18, 23, 19, 22, 14, 15, 16, 17, 18, 12, 16, 17, 18, 23, 22, 20, 21, 20, 14, 15, 16, 17, 18, 22, 0, 4, 21, 11, 19, 19, 5, 8, 18, 11, -1, 8, -1, -1, 12, 11, -1, 11, 13, -1, 13 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 6, 7, 8, 9, 10, 22, 25, 26, 32, 33, 19, 22, 22, 33, 0, 4, 28, 21, 14, 15, 16, 17, 18, 11, 27, 33, 33, 23, 19, 5, 30, 33, 33, 33, 33, 33, 33, 20, 21, 23, 23, 8, 29, 19, 11, 20, 21, 12, 31, 8, 11, 12, 20, 13, 11, 13 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 5: #line 87 "risk-parser.y" { add_cat_name((yyvsp[(1) - (1)].strval)); } break; case 6: #line 88 "risk-parser.y" { add_cat_name((yyvsp[(3) - (3)].strval)); } break; case 8: #line 94 "risk-parser.y" { add_prior_weight((yyvsp[(1) - (1)].numval)); } break; case 9: #line 95 "risk-parser.y" { add_prior_weight((yyvsp[(3) - (3)].numval)); } break; case 11: #line 101 "risk-parser.y" { attach_cat_vec((yyvsp[(2) - (3)].strval),(yyvsp[(1) - (3)].strval),(yyvsp[(3) - (3)].strval)); } break; case 12: #line 102 "risk-parser.y" { attach_cat_vec((yyvsp[(3) - (4)].strval),(yyvsp[(2) - (4)].strval),(yyvsp[(4) - (4)].strval)); } break; case 13: #line 105 "risk-parser.y" { set_loss_and_increment((yyvsp[(1) - (1)].numval)); } break; case 14: #line 106 "risk-parser.y" { set_loss_and_increment((yyvsp[(3) - (3)].numval)); } break; case 15: #line 109 "risk-parser.y" { (yyval.numval) = log((yyvsp[(1) - (1)].numval)); } break; case 16: #line 110 "risk-parser.y" { (yyval.numval) = log(spec.loss_list[x]->sm[(int)(yyvsp[(1) - (1)].numval)]); } break; case 17: #line 111 "risk-parser.y" { (yyval.numval) = log(spec.complexity[x]); } break; case 18: #line 112 "risk-parser.y" { (yyval.numval) = log(exp((yyvsp[(1) - (3)].numval)) + exp((yyvsp[(3) - (3)].numval))); } break; case 19: #line 113 "risk-parser.y" { (yyval.numval) = log(exp((yyvsp[(1) - (3)].numval)) - exp((yyvsp[(3) - (3)].numval))); } break; case 20: #line 114 "risk-parser.y" { (yyval.numval) = (yyvsp[(1) - (3)].numval) + (yyvsp[(3) - (3)].numval); } break; case 21: #line 115 "risk-parser.y" { (yyval.numval) = (yyvsp[(1) - (3)].numval) - (yyvsp[(3) - (3)].numval); } break; case 22: #line 116 "risk-parser.y" { (yyval.numval) = (yyvsp[(1) - (3)].numval) * exp((yyvsp[(3) - (3)].numval)); } break; case 23: #line 117 "risk-parser.y" { (yyval.numval) = (yyvsp[(2) - (3)].numval); } break; case 24: #line 118 "risk-parser.y" { (yyval.numval) = exp((yyvsp[(3) - (4)].numval)); } break; case 25: #line 119 "risk-parser.y" { (yyval.numval) = log((yyvsp[(3) - (4)].numval)); } break; /* Line 1267 of yacc.c. */ #line 1518 "risk-parser.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 122 "risk-parser.y" void set_loss_and_increment(real_value_t v) { if( isnan(v) ) { fprintf(stderr, "error: negative losses not supported (%s,%s)\n", spec.catname[x], spec.catname[y]); exit(0); } else { spec.loss_matrix[x][y++] = v; } } int parse_loss_vec(category_count_t i, char *buf) { int result; #if YYDEBUG yydebug = 1; #endif reset_lexer(); x = i; y = 0; lexer_prepare_string(buf); result = yyparse(); lexer_free_string(); return result; } int parse_risk_spec(FILE *input) { #if YYDEBUG yydebug = 1; #endif yyin = input; reset_lexer(); return yyparse(); } int yyerror(char *s) { fprintf(stderr, "parse error at line %d before '%s'\n", current_lineno, yytext); return 0; } void add_prior_weight(real_value_t w) { if( w < 0.0 ) { fprintf(stderr, "error: prior can't have negative values (%f)\n", w); exit(0); } else if(spec.num_priors < MAX_CAT) { spec.prior[spec.num_priors++] = log(w); } else { fprintf(stderr, "warning: maximum reached, prior weight ignored\n"); } } void add_cat_name(char *n) { if(spec.num_cats < MAX_CAT) { spec.catname[spec.num_cats++] = n; } else { fprintf(stderr, "warning: maximum reached, category ignored\n"); } } void attach_cat_vec(char *n, char *r, char *v) { category_count_t i; LossVector *p, *q; /* see if category name is known */ for( i = 0; i < spec.num_cats; i++ ) { if( strcmp(spec.catname[i], n) == 0 ) { break; } } if( i < spec.num_cats ) { /* create a new LossVector */ p = malloc(sizeof(LossVector)); if( p ) { p->re = r; p->ve = v; p->next = NULL; } else { fprintf(stderr, "error: couldn't allocate memory needed for loss matrix\n"); yyerror(NULL); } /* add this vector spec to the appropriate list */ if( spec.loss_list[i] == NULL ) { spec.loss_list[i] = p; } else { for(q = spec.loss_list[i]; q->next != NULL; q = q->next); q->next = p; } } else { fprintf(stderr, "error: encountered unknown category\n"); yyerror(NULL); } } /* we never parse multiple files */ int yywrap() { return 1; } dbacl-1.14.1/src/risk-parser.h000066400000000000000000000050711325773323600160630ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { tCATEGORIES = 258, tPRIOR = 259, tLOSS = 260, tEXP = 261, tLOG = 262, tNUMBER = 263, tMATCH = 264, tCOMPLEXITY = 265, tNAME = 266, tREGEX = 267, tVEC = 268 }; #endif /* Tokens. */ #define tCATEGORIES 258 #define tPRIOR 259 #define tLOSS 260 #define tEXP 261 #define tLOG 262 #define tNUMBER 263 #define tMATCH 264 #define tCOMPLEXITY 265 #define tNAME 266 #define tREGEX 267 #define tVEC 268 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 51 "risk-parser.y" { real_value_t numval; char *strval; } /* Line 1489 of yacc.c. */ #line 80 "risk-parser.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; dbacl-1.14.1/src/risk-parser.y000066400000000000000000000127621325773323600161110ustar00rootroot00000000000000%{ /* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Author: Laird Breyer */ #define YYDEBUG 0 #include #include #include #include #include "bayesol.h" extern char *yytext; extern FILE *yyin; extern int current_lineno; extern int yylex(void); extern void reset_lexer(); extern void lexer_prepare_string(char *buf); extern void lexer_free_string(); extern Spec spec; /* defined here */ void set_loss_and_increment(real_value_t v); int parse_loss_vec(category_count_t i, char *buf); int parse_risk_spec(FILE *input); int yyerror(char *s); void add_prior_weight(real_value_t w); void add_cat_name(char *n); void attach_cat_vec(char *n, char *r, char *v); category_count_t x, y; %} %union { real_value_t numval; char *strval; } %token tCATEGORIES %token tPRIOR %token tLOSS %token tEXP %token tLOG %token tNUMBER %token tMATCH %token tCOMPLEXITY %token tNAME %token tREGEX %token tVEC %type catvec priorvec %type formula %type multivec %start spec %left '+' %left '-' %left '*' %left '/' %right '^' %% spec: catlist priorlist lossmat | flist ; catlist: tCATEGORIES '{' catvec '}' ; catvec: tNAME { add_cat_name($1); } | catvec ',' tNAME { add_cat_name($3); } ; priorlist: tPRIOR '{' priorvec '}' ; priorvec: tNUMBER { add_prior_weight($1); } | priorvec ',' tNUMBER { add_prior_weight($3); } ; lossmat: tLOSS '{' multivec '}' ; multivec: tREGEX tNAME tVEC { attach_cat_vec($2,$1,$3); } | multivec tREGEX tNAME tVEC { attach_cat_vec($3,$2,$4); } ; flist: formula { set_loss_and_increment($1); } | flist ',' formula { set_loss_and_increment($3); } ; formula: tNUMBER { $$ = log($1); } | tMATCH { $$ = log(spec.loss_list[x]->sm[(int)$1]); } | tCOMPLEXITY { $$ = log(spec.complexity[x]); } | formula '+' formula { $$ = log(exp($1) + exp($3)); } | formula '-' formula { $$ = log(exp($1) - exp($3)); } | formula '*' formula { $$ = $1 + $3; } | formula '/' formula { $$ = $1 - $3; } | formula '^' formula { $$ = $1 * exp($3); } | '(' formula ')' { $$ = $2; } | tEXP '(' formula ')' { $$ = exp($3); } | tLOG '(' formula ')' { $$ = log($3); } ; %% void set_loss_and_increment(real_value_t v) { if( isnan(v) ) { fprintf(stderr, "error: negative losses not supported (%s,%s)\n", spec.catname[x], spec.catname[y]); exit(0); } else { spec.loss_matrix[x][y++] = v; } } int parse_loss_vec(category_count_t i, char *buf) { int result; #if YYDEBUG yydebug = 1; #endif reset_lexer(); x = i; y = 0; lexer_prepare_string(buf); result = yyparse(); lexer_free_string(); return result; } int parse_risk_spec(FILE *input) { #if YYDEBUG yydebug = 1; #endif yyin = input; reset_lexer(); return yyparse(); } int yyerror(char *s) { fprintf(stderr, "parse error at line %d before '%s'\n", current_lineno, yytext); return 0; } void add_prior_weight(real_value_t w) { if( w < 0.0 ) { fprintf(stderr, "error: prior can't have negative values (%f)\n", w); exit(0); } else if(spec.num_priors < MAX_CAT) { spec.prior[spec.num_priors++] = log(w); } else { fprintf(stderr, "warning: maximum reached, prior weight ignored\n"); } } void add_cat_name(char *n) { if(spec.num_cats < MAX_CAT) { spec.catname[spec.num_cats++] = n; } else { fprintf(stderr, "warning: maximum reached, category ignored\n"); } } void attach_cat_vec(char *n, char *r, char *v) { category_count_t i; LossVector *p, *q; /* see if category name is known */ for( i = 0; i < spec.num_cats; i++ ) { if( strcmp(spec.catname[i], n) == 0 ) { break; } } if( i < spec.num_cats ) { /* create a new LossVector */ p = malloc(sizeof(LossVector)); if( p ) { p->re = r; p->ve = v; p->next = NULL; } else { fprintf(stderr, "error: couldn't allocate memory needed for loss matrix\n"); yyerror(NULL); } /* add this vector spec to the appropriate list */ if( spec.loss_list[i] == NULL ) { spec.loss_list[i] = p; } else { for(q = spec.loss_list[i]; q->next != NULL; q = q->next); q->next = p; } } else { fprintf(stderr, "error: encountered unknown category\n"); yyerror(NULL); } } /* we never parse multiple files */ int yywrap() { return 1; } dbacl-1.14.1/src/splintrc000066400000000000000000000024701325773323600152310ustar00rootroot00000000000000# This is the splint config file. It lists many options which must be # set for splint to run properly on the dbacl sources. # we want posix checking, but not strict (see splint manual, strict # gives spurious warnings when we ignore return values from fprintf etc.) -posix-strict-lib -retvalint # read system header files even if we know what they contain # this slows parsing, but otherwise we might get an error # because splint is missing function prototypes (this happened # in Debian with ftruncate, for example) +gnuextensions -skip-posix-headers -DHAVE_CONFIG_H # splint doesn't understand u_intXX_t even though it's posix -Du_int64_t=uint64_t -Du_int32_t=uint32_t -Du_int16_t=uint16_t -Du_int8_t=uint8_t # splint thinks variables that start with m_ are special, and chokes # on m_options. So we disable namechecks -namechecks # I know what I'm doing with floating point comparisons -realcompare # splint has special support for boolean testing, but # this does not exist in older C languages and we don't want it. -boolops -pred-bool-int -pred-bool-others -booltype bool_t # splint doesn't recognize "%6.2" "f" as equivalent to "%6.2f", this is # a bug. I've sent a report to the splint team, but meanwhile we disable # the check. -formatcode # we're not interested in errno and which functions might change it -globsdbacl-1.14.1/src/tests/000077500000000000000000000000001325773323600146075ustar00rootroot00000000000000dbacl-1.14.1/src/tests/Makefile.am000066400000000000000000000072711325773323600166520ustar00rootroot00000000000000AUTOMAKE_OPTIONS = 1.4 gnits ACLOCAL = -I ../../config datarootdir ?= $(prefix)/share BTESTS = dbacl-V.sh \ bayesol-V.sh \ mailinspect-V.sh LTESTS = dbacl-l.sh \ dbacl-j.sh \ dbacl-w3.sh \ dbacl-alpha.sh \ dbacl-alnum.sh \ dbacl-graph.sh \ dbacl-cef.sh \ dbacl-adp.sh \ dbacl-cef2.sh \ dbacl-g.sh \ dbacl-jap.sh \ dbacl-a.sh \ dbacl-o.sh \ dbacl-O.sh \ dbacl-z.sh \ dbacl-zo.sh MLTESTS = html.sh html-links.sh html-alt.sh \ xml.sh EMTESTS = email-mbox.sh email-maildir.sh \ email-l.sh email-pgp.sh email-uu.sh \ email-headers.sh email-xheaders.sh email-theaders.sh \ email-badmime1.sh email-badmime2.sh \ email-uri.sh email-forms.sh email-scripts.sh \ email-2047.sh email-style.sh CTESTS = icheck.sh lscheck.sh model-sym1.sh model-sym2.sh \ model-sym3.sh model-sum1.sh \ class-unknown1.sh class-unknown2.sh \ shannon.sh shannon-1.sh shannon-2.sh \ score-1.sh score-2.sh reservoir.sh HTESTS = pcheck-822g.sh pcheck-822b.sh \ pcheck-821g.sh pcheck-821b.sh \ pcheck-2822g.sh pcheck-2822b.sh \ pcheck-2821g.sh pcheck-2821b.sh TESTS = $(BTESTS) $(LTESTS) $(MLTESTS) $(EMTESTS) $(CTESTS) $(HTESTS) # tests expected to fail in OSes with incomplete unicode #XFAIL_TESTS= email-forms.sh email-pgp.sh html-alt.sh email-badmime1.sh SAMPLEIN = sample.spam-1 sample.spam-2 sample.spam-3 sample.spam-4 \ sample.email-5 sample.email-6 sample.spam-7 sample.spam-8 \ sample.spam-9 sample.spam-10 sample.spam-11 \ sample.headers-821g sample.headers-821b \ sample.headers-822g sample.headers-822b \ sample.headers-2821g sample.headers-2821b \ sample.headers-2822g sample.headers-2822b SAMPLEOUT = verify.html verify.html-links verify.html-alt \ verify.xml \ verify.email-l verify.email-pgp verify.email-uu verify.email-style \ verify.email-headers verify.email-xheaders verify.email-theaders \ verify.email-badmime1 verify.email-badmime2 \ verify.email-uri verify.email-forms verify.email-scripts # this is a hack. GNU make makes CURDIR available, but that doesn't exist # on BSD make, which uses .CURDIR instead, and vice versa. So if we # concatenate both together, we should only get one value. #CURDIR = $(CURDIR)$(.CURDIR) # this line below is another way of doing the same thing, but apparently # it is broken on IRIX. I don't have the hardware to investigate this. CURDIR ?= $(.CURDIR) # use this for debugging test scripts #TESTS_ENVIRONMENT = TESTBIN=$(srcdir)/.. DOCDIR=$(srcdir)/../../doc $(SHELL) -x TESTS_ENVIRONMENT = TESTBIN=$(CURDIR)/.. DOCDIR=$(srcdir)/../../doc sourcedir=$(srcdir) check_SCRIPTS = $(BTESTS) $(LTESTS) $(MLTESTS) $(EMTESTS) $(CTESTS) $(HTESTS) EXTRA_DIST = dbacl-V.shin bayesol-V.shin mailinspect-V.shin \ dbacl-l.shin dbacl-j.shin dbacl-w3.shin \ dbacl-alpha.shin dbacl-alnum.shin dbacl-graph.shin \ dbacl-cef.shin dbacl-adp.shin dbacl-cef2.shin \ dbacl-g.shin dbacl-jap.shin \ dbacl-a.shin dbacl-o.shin dbacl-O.shin dbacl-z.shin dbacl-zo.shin \ html.shin html-links.shin html-alt.shin \ xml.shin \ email-mbox.shin email-maildir.shin \ email-l.shin email-pgp.shin email-uu.shin email-style.shin \ email-headers.shin email-xheaders.shin email-theaders.shin \ email-badmime1.shin email-badmime2.shin \ email-uri.shin email-forms.shin email-scripts.shin \ email-2047.shin \ icheck.shin lscheck.shin model-sym1.shin model-sym2.shin \ model-sym3.shin model-sum1.shin \ class-unknown1.shin class-unknown2.shin \ shannon.shin shannon-1.shin shannon-2.shin \ score-1.shin score-2.shin reservoir.shin \ pcheck-822g.shin pcheck-822b.shin \ pcheck-821g.shin pcheck-821b.shin \ pcheck-2822g.shin pcheck-2822b.shin \ pcheck-2821g.shin pcheck-2821b.shin \ $(SAMPLEIN) $(SAMPLEOUT) SUFFIXES = .shin .sh .shin.sh: cat $< \ | sed -e "s|[@]VERSION@|$(VERSION)|g" \ > $@ chmod +x $@ dbacl-1.14.1/src/tests/Makefile.in000066400000000000000000000404711325773323600166620ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = -I ../../config AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.4 gnits BTESTS = dbacl-V.sh \ bayesol-V.sh \ mailinspect-V.sh LTESTS = dbacl-l.sh \ dbacl-j.sh \ dbacl-w3.sh \ dbacl-alpha.sh \ dbacl-alnum.sh \ dbacl-graph.sh \ dbacl-cef.sh \ dbacl-adp.sh \ dbacl-cef2.sh \ dbacl-g.sh \ dbacl-jap.sh \ dbacl-a.sh \ dbacl-o.sh \ dbacl-O.sh \ dbacl-z.sh \ dbacl-zo.sh MLTESTS = html.sh html-links.sh html-alt.sh \ xml.sh EMTESTS = email-mbox.sh email-maildir.sh \ email-l.sh email-pgp.sh email-uu.sh \ email-headers.sh email-xheaders.sh email-theaders.sh \ email-badmime1.sh email-badmime2.sh \ email-uri.sh email-forms.sh email-scripts.sh \ email-2047.sh email-style.sh CTESTS = icheck.sh lscheck.sh model-sym1.sh model-sym2.sh \ model-sym3.sh model-sum1.sh \ class-unknown1.sh class-unknown2.sh \ shannon.sh shannon-1.sh shannon-2.sh \ score-1.sh score-2.sh reservoir.sh HTESTS = pcheck-822g.sh pcheck-822b.sh \ pcheck-821g.sh pcheck-821b.sh \ pcheck-2822g.sh pcheck-2822b.sh \ pcheck-2821g.sh pcheck-2821b.sh TESTS = $(BTESTS) $(LTESTS) $(MLTESTS) $(EMTESTS) $(CTESTS) $(HTESTS) # tests expected to fail in OSes with incomplete unicode #XFAIL_TESTS= email-forms.sh email-pgp.sh html-alt.sh email-badmime1.sh SAMPLEIN = sample.spam-1 sample.spam-2 sample.spam-3 sample.spam-4 \ sample.email-5 sample.email-6 sample.spam-7 sample.spam-8 \ sample.spam-9 sample.spam-10 sample.spam-11 \ sample.headers-821g sample.headers-821b \ sample.headers-822g sample.headers-822b \ sample.headers-2821g sample.headers-2821b \ sample.headers-2822g sample.headers-2822b SAMPLEOUT = verify.html verify.html-links verify.html-alt \ verify.xml \ verify.email-l verify.email-pgp verify.email-uu verify.email-style \ verify.email-headers verify.email-xheaders verify.email-theaders \ verify.email-badmime1 verify.email-badmime2 \ verify.email-uri verify.email-forms verify.email-scripts # use this for debugging test scripts #TESTS_ENVIRONMENT = TESTBIN=$(srcdir)/.. DOCDIR=$(srcdir)/../../doc $(SHELL) -x TESTS_ENVIRONMENT = TESTBIN=$(CURDIR)/.. DOCDIR=$(srcdir)/../../doc sourcedir=$(srcdir) check_SCRIPTS = $(BTESTS) $(LTESTS) $(MLTESTS) $(EMTESTS) $(CTESTS) $(HTESTS) EXTRA_DIST = dbacl-V.shin bayesol-V.shin mailinspect-V.shin \ dbacl-l.shin dbacl-j.shin dbacl-w3.shin \ dbacl-alpha.shin dbacl-alnum.shin dbacl-graph.shin \ dbacl-cef.shin dbacl-adp.shin dbacl-cef2.shin \ dbacl-g.shin dbacl-jap.shin \ dbacl-a.shin dbacl-o.shin dbacl-O.shin dbacl-z.shin dbacl-zo.shin \ html.shin html-links.shin html-alt.shin \ xml.shin \ email-mbox.shin email-maildir.shin \ email-l.shin email-pgp.shin email-uu.shin email-style.shin \ email-headers.shin email-xheaders.shin email-theaders.shin \ email-badmime1.shin email-badmime2.shin \ email-uri.shin email-forms.shin email-scripts.shin \ email-2047.shin \ icheck.shin lscheck.shin model-sym1.shin model-sym2.shin \ model-sym3.shin model-sum1.shin \ class-unknown1.shin class-unknown2.shin \ shannon.shin shannon-1.shin shannon-2.shin \ score-1.shin score-2.shin reservoir.shin \ pcheck-822g.shin pcheck-822b.shin \ pcheck-821g.shin pcheck-821b.shin \ pcheck-2822g.shin pcheck-2822b.shin \ pcheck-2821g.shin pcheck-2821b.shin \ $(SAMPLEIN) $(SAMPLEOUT) SUFFIXES = .shin .sh all: all-am .SUFFIXES: .SUFFIXES: .shin .sh $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits src/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ distclean distclean-generic distdir dvi dvi-am html html-am \ info info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am datarootdir ?= $(prefix)/share # this is a hack. GNU make makes CURDIR available, but that doesn't exist # on BSD make, which uses .CURDIR instead, and vice versa. So if we # concatenate both together, we should only get one value. #CURDIR = $(CURDIR)$(.CURDIR) # this line below is another way of doing the same thing, but apparently # it is broken on IRIX. I don't have the hardware to investigate this. CURDIR ?= $(.CURDIR) .shin.sh: cat $< \ | sed -e "s|[@]VERSION@|$(VERSION)|g" \ > $@ chmod +x $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/src/tests/bayesol-V.shin000066400000000000000000000002171325773323600173330ustar00rootroot00000000000000#!/bin/sh # test bayesol -V switch PATH=/bin:/usr/bin BAYESOL=$TESTBIN/bayesol test x"`$BAYESOL -V | head -1`" = x"bayesol version @VERSION@" dbacl-1.14.1/src/tests/class-unknown1.shin000066400000000000000000000016121325773323600203550ustar00rootroot00000000000000#!/bin/sh # verify classification of unknown words # delta verification: score depends only on word length PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 sort prerequisite_command $0 grep prerequisite_command $0 wc prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -q 2 echo "bla br ptoli lira s lsk wqe" \ | $DBACL -c dummy -dN -R \ | grep -v '^#' \ | grep -v '^dummy' \ | tr 'a-z' 'x' \ | sort -u \ | wc -l \ > $DBACL_PATH/dummy.count L=`cat $DBACL_PATH/dummy.count` RESULT=`test x"$L" = x5` rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/class-unknown2.shin000066400000000000000000000011141325773323600203530ustar00rootroot00000000000000#!/bin/sh # verify classification of unknown words # because some words have been learned, unknown words # have a lower probability compared to the purely random case PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -q 2 echo "bla bri pto lir lsk wqe" \ | $DBACL -c dummy -v -R \ > $DBACL_PATH/verdict V=`cat $DBACL_PATH/verdict` RESULT=`test x"$V" = xrandom` rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-O.shin000066400000000000000000000025231325773323600167350ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -O switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo "From -" ; cat ${sourcedir}/sample.spam-1 ; echo ; echo "From -" ; cat ${sourcedir}/sample.spam-2 ; echo ; echo "From -" ; cat ${sourcedir}/sample.spam-3) \ | $DBACL -0 -l dummy -T email -X -d \ | grep -v '^# alpha' \ | grep -v '^# shannon' \ > $DBACL_PATH/dump1 head -3 $DBACL_PATH/dummy \ | grep '^# hash' \ > $DBACL_PATH/out1 (echo "From -" ; cat ${sourcedir}/sample.spam-1) \ | $DBACL -0 -l dummy1 -T email -o dummy1.onl -X (echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -0 -l dummy2 -T email -o dummy2.onl -X (echo "From -" ; cat ${sourcedir}/sample.spam-3) \ | $DBACL -0 -l dummy -T email -O dummy1.onl -O dummy2.onl -X -d \ | grep -v '^# alpha' \ | grep -v '^# shannon' \ > $DBACL_PATH/dump2 head -3 $DBACL_PATH/dummy \ | grep '^# hash' \ > $DBACL_PATH/out2 # test x"`cat $DBACL_PATH/out1`" = x"`cat $DBACL_PATH/out2`" diff $DBACL_PATH/dump1 $DBACL_PATH/dump2 RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-V.shin000066400000000000000000000002051325773323600167370ustar00rootroot00000000000000#!/bin/sh # test dbacl -V switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl test x"`$DBACL -V | head -1`" = x"dbacl version @VERSION@" dbacl-1.14.1/src/tests/dbacl-a.shin000066400000000000000000000005271325773323600167610ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -a switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr test 91 -eq `cat ${sourcedir}/sample.spam-1 | $DBACL -R -a -n -v | wc -l` dbacl-1.14.1/src/tests/dbacl-adp.shin000066400000000000000000000011171325773323600173010ustar00rootroot00000000000000#!/bin/sh # test -e alnum switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo '123 xyz Hello234 %*# +123' \ | $DBACL -l dummy -e adp head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 6 unique_features 5 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-alnum.shin000066400000000000000000000011211325773323600176440ustar00rootroot00000000000000#!/bin/sh # test -e alnum switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "123 xyz Hello234 %*# +123" \ | $DBACL -l dummy -e alnum head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 4 unique_features 3 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-alpha.shin000066400000000000000000000011211325773323600176150ustar00rootroot00000000000000#!/bin/sh # test -e alnum switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "123 xyz Hello234 %*# +123" \ | $DBACL -l dummy -e alpha head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 2 unique_features 2 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-cef.shin000066400000000000000000000011171325773323600172720ustar00rootroot00000000000000#!/bin/sh # test -e alnum switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "123 xyz Hello234 %*# +123" \ | $DBACL -l dummy -e cef head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 2 unique_features 2 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-cef2.shin000066400000000000000000000011261325773323600173540ustar00rootroot00000000000000#!/bin/sh # test -e cef2 switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH exit 0 mkdir "$DBACL_PATH" echo '123 xyz Hello234%*# +123' \ | $DBACL -l dummy -e cef2 head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 6 unique_features 5 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-g.shin000066400000000000000000000012151325773323600167620ustar00rootroot00000000000000#!/bin/sh # test -g switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl LC_ALL="C" # this test assumes C locale export LC_ALL prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "123 xyz Hello234 %*# +123" \ | $DBACL -l dummy -g '([a-z2-9]{2})' head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 10 unique_features 8 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-graph.shin000066400000000000000000000011211325773323600176310ustar00rootroot00000000000000#!/bin/sh # test -e alnum switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "123 xyz Hello234 %*# +123" \ | $DBACL -l dummy -e graph head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 5 unique_features 5 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-j.shin000066400000000000000000000011731325773323600167700ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -l switch, case sensitive tokens PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -j head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 9 unique_features 9 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-jap.shin000066400000000000000000000012731325773323600173120ustar00rootroot00000000000000#!/bin/sh # test Japanese parsing # this should work in the C locale # # you can also check out the tokens directly in a "kterm -km sjis". # PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat $DOCDIR/japanese.txt \ | $DBACL -l dummy -e cef -j head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 8614 unique_features 543 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-l.shin000066400000000000000000000011411325773323600167650ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -l switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 9 unique_features 8 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-o.shin000066400000000000000000000017021325773323600167730ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -a switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo "From -" ; cat ${sourcedir}/sample.spam-1 ; echo ; echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -0 -l dummy -T email head -3 $DBACL_PATH/dummy \ | grep '^# hash' \ > $DBACL_PATH/out1 (echo "From -" ; cat ${sourcedir}/sample.spam-1) \ | $DBACL -0 -l dummy -T email -o dummy.onl (echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -0 -l dummy -T email -o dummy.onl head -3 $DBACL_PATH/dummy \ | grep '^# hash' \ > $DBACL_PATH/out2 test x"`cat $DBACL_PATH/out1`" = x"`cat $DBACL_PATH/out2`" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-w3.shin000066400000000000000000000011621325773323600170660ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -l switch, trigrams PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -w 3 head -3 "$DBACL_PATH/dummy" \ | grep '# hash_size 15 features 24 unique_features 23 documents 0' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-z.shin000066400000000000000000000011571325773323600170120ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -l switch with -z 1 PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick the brown brown brown fox jumped over the over lazy dog" \ | $DBACL -l dummy -z 1 -d | grep '^[ ]*0.000' | wc -l > "$DBACL_PATH/counts" test "`cat $DBACL_PATH/counts`" '=' "5" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/dbacl-zo.shin000066400000000000000000000017431325773323600171720ustar00rootroot00000000000000#!/bin/sh # test dbacl -z and -o switches together PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo "From -" ; cat ${sourcedir}/sample.spam-1 ; echo ; echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -0 -l dummy -T email -z 2 -d \ | grep -v '^[ ]*0.000' \ | grep -v '# shannon' \ > $DBACL_PATH/out1 (echo "From -" ; cat ${sourcedir}/sample.spam-1) \ | $DBACL -0 -l dummy -T email -o dummy.onl -z 2 (echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -0 -l dummy -T email -o dummy.onl -z 2 -d \ | grep -v '^[ ]*0.000' \ | grep -v '# shannon' \ > $DBACL_PATH/out2 diff "$DBACL_PATH/out1" "$DBACL_PATH/out2" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-2047.shin000066400000000000000000000014151325773323600171540ustar00rootroot00000000000000#!/bin/sh # test rfc2047 decoder. Came across this test case on bogofilter mailing list. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo 'header: =?US-ASCII?Q?=3D=3FUS-ASCII=3FQ=3Ftest=3F=3D?=' > $DBACL_PATH/out0 echo 'header: =?US-ASCII?Q?=3D=3FUS-ASCII=3FQ=3F=3D3D=3D3FUS-ASCII=3D3FQ=3D3Ftest=3D3F=3D3D=3F=3D?=' \ | $DBACL -R -D -T email -T email:xheaders \ | grep header \ > $DBACL_PATH/out1 diff $DBACL_PATH/out0 $DBACL_PATH/out1 RESULT=$? rm -rf "$DBACL_PATH" exit $RESULT dbacl-1.14.1/src/tests/email-badmime1.shin000066400000000000000000000012111325773323600202310ustar00rootroot00000000000000#!/bin/sh # test incorrectly labeled html content type PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.email-6 \ | $DBACL -R -D -T email -T email:headers \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-badmime1 "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-badmime2.shin000066400000000000000000000012251325773323600202370ustar00rootroot00000000000000#!/bin/sh # test base64 attachment without a trailing mime boundary PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-7 \ | $DBACL -R -D -T email -T email:headers \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-badmime2 "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-forms.shin000066400000000000000000000011611325773323600177040ustar00rootroot00000000000000#!/bin/sh # test -T html:links switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-9 \ | $DBACL -R -D -T email -T html:forms \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-forms "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-headers.shin000066400000000000000000000011711325773323600201720ustar00rootroot00000000000000#!/bin/sh # test -T email:headers switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T email -T email:headers \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-headers "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-l.shin000066400000000000000000000011361325773323600170130ustar00rootroot00000000000000#!/bin/sh # test basic email parsing PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T email \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-l "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-maildir.shin000066400000000000000000000011571325773323600202040ustar00rootroot00000000000000#!/bin/sh # test basic maildir style parsing PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 cut DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" $DBACL -l dummy -T email ${sourcedir}/sample.spam-1 ${sourcedir}/sample.spam-2 \ > "$DBACL_PATH/out" NUM=`head -3 "$DBACL_PATH/dummy" | grep '# hash_size' | cut -d ' ' -f 9` rm -rf "$DBACL_PATH" test x$NUM = x"2"dbacl-1.14.1/src/tests/email-mbox.shin000066400000000000000000000012761325773323600175320ustar00rootroot00000000000000#!/bin/sh # test basic mbox parsing PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 head prerequisite_command $0 grep prerequisite_command $0 cut DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo "From -" ; cat ${sourcedir}/sample.spam-1 ; echo ; echo "From -" ; cat ${sourcedir}/sample.spam-2) \ | $DBACL -l dummy -T email \ > "$DBACL_PATH/out" NUM=`head -3 "$DBACL_PATH/dummy" | grep '# hash_size' | cut -d ' ' -f 9` rm -rf "$DBACL_PATH" test x$NUM = x"2"dbacl-1.14.1/src/tests/email-pgp.shin000066400000000000000000000011411325773323600173420ustar00rootroot00000000000000#!/bin/sh # test parsing of PGP armor PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-4 \ | $DBACL -R -D -T email \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-pgp "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-scripts.shin000066400000000000000000000011661325773323600202520ustar00rootroot00000000000000#!/bin/sh # test -T html:links switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-10 \ | $DBACL -R -D -T email -T html:scripts \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-scripts "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-style.shin000066400000000000000000000011631325773323600177200ustar00rootroot00000000000000#!/bin/sh # test -T html:links switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-11 \ | $DBACL -R -D -T email -T html:styles \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-style "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-theaders.shin000066400000000000000000000011741325773323600203610ustar00rootroot00000000000000#!/bin/sh # test -T email:theaders switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-4 \ | $DBACL -R -D -T email -T email:theaders \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-theaders "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-uri.shin000066400000000000000000000012421325773323600173550ustar00rootroot00000000000000#!/bin/sh # test decoding of encoded URI, even in plain text attachment PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 tr prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-8 \ | $DBACL -R -D -T email -T email:headers -T html:links \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-uri "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-uu.shin000066400000000000000000000011471325773323600172130ustar00rootroot00000000000000#!/bin/sh # test parsing of uuencoded armor PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.email-5 \ | $DBACL -R -D -T email \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-uu "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/email-xheaders.shin000066400000000000000000000011741325773323600203650ustar00rootroot00000000000000#!/bin/sh # test -T email:xheaders switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T email -T email:xheaders \ | tr -s '[ \t\n\r]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.email-xheaders "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/html-alt.shin000066400000000000000000000011531325773323600172140ustar00rootroot00000000000000#!/bin/sh # test -T html:links switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-3 \ | $DBACL -R -D -T html -T html:alt \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.html-alt "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/html-links.shin000066400000000000000000000011571325773323600175600ustar00rootroot00000000000000#!/bin/sh # test -T html:links switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T html -T html:links \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.html-links "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/html.shin000066400000000000000000000011251325773323600164350ustar00rootroot00000000000000#!/bin/sh # test -T html switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T html \ | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.html "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/icheck.shin000066400000000000000000000006511325773323600167220ustar00rootroot00000000000000#!/bin/sh # category file integrity test PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl ICHECK=$TESTBIN/icheck LC_ALL="C" # this test assumes C locale export LC_ALL DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform $ICHECK -u "$DBACL_PATH/dummy" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/lscheck.shin000066400000000000000000000016551325773323600171150ustar00rootroot00000000000000#!/bin/sh # category file load/save test PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl ICHECK=$TESTBIN/icheck LC_ALL="C" # this test assumes C locale export LC_ALL prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 awk prerequisite_command $0 sort prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -d \ | grep -v '^#' \ | awk '{print $1, $4}' \ | sort -k 2 \ > "$DBACL_PATH/out1" $ICHECK -d -u "$DBACL_PATH/dummy" \ | grep -v '^#' \ | awk '{print $1, $2}' \ | sort -k 2 \ > "$DBACL_PATH/out2" diff "$DBACL_PATH/out1" "$DBACL_PATH/out2" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/mailinspect-V.shin000066400000000000000000000002431325773323600202040ustar00rootroot00000000000000#!/bin/sh # test mailinspect -V switch PATH=/bin:/usr/bin MAILINSPECT=$TESTBIN/mailinspect test x"`$MAILINSPECT -V | head -1`" = x"mailinspect version @VERSION@" dbacl-1.14.1/src/tests/model-sum1.shin000066400000000000000000000016551325773323600174640ustar00rootroot00000000000000#!/bin/sh # maxent model sum check (-w 1) must sum to less than 1. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl LC_ALL="C" # this test assumes C locale export LC_ALL prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 cut prerequisite_command $0 grep prerequisite_command $0 awk DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -d -q 2 \ > $DBACL_PATH/dummy.dump cat $DBACL_PATH/dummy.dump \ | grep logZ \ | cut -d ' ' -f 5 \ > $DBACL_PATH/dummy.logZ cat $DBACL_PATH/dummy.dump \ | grep -v '^#' \ | awk " BEGIN{ logz=`cat $DBACL_PATH/dummy.logZ` } { s += exp(\$1 + \$2 - logz) } END{ exit(s > 1.0) }" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/model-sym1.shin000066400000000000000000000014751325773323600174700ustar00rootroot00000000000000#!/bin/sh # maxent model symmetry check (-w 1) words with identical # length and frequency must have identical weights. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 tr prerequisite_command $0 sort prerequisite_command $0 wc DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -d -q 2 \ | grep -v '^#' \ | tr 'a-z' 'x' \ | sort -u \ | wc -l \ > $DBACL_PATH/dummy.count L=`cat $DBACL_PATH/dummy.count` RESULT=`test x"$L" = x5` rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/model-sym2.shin000066400000000000000000000015031325773323600174610ustar00rootroot00000000000000#!/bin/sh # maxent model symmetry check (-w 1) - all tokens must have same probability PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 tr prerequisite_command $0 sort prerequisite_command $0 wc DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -d -q 2 \ | grep -v '^#' \ | awk 'BEGIN{ OFMT="%.2f" }{ print exp($1 + $2)/$3 }' \ | sort -u \ | wc -l \ > $DBACL_PATH/dummy.count L=`cat $DBACL_PATH/dummy.count` RESULT=`test x"$L" = x1` rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/model-sym3.shin000066400000000000000000000015401325773323600174630ustar00rootroot00000000000000#!/bin/sh # maxent model symmetry check (-w 2) 2-grams with identical # length must have identical reference weights (but lambda weights will differ). PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 tr prerequisite_command $0 sort prerequisite_command $0 wc DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -L uniform -d -q 2 \ | grep -v '^#' \ | awk '{print $2}' \ | sort -u \ | wc -l \ > $DBACL_PATH/dummy.count L=`cat $DBACL_PATH/dummy.count` RESULT=`test x"$L" = x8` rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/pcheck-2821b.shin000066400000000000000000000004431325773323600174640ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-2821b | $PCHECK 2821 bad dbacl-1.14.1/src/tests/pcheck-2821g.shin000066400000000000000000000004441325773323600174720ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-2821g | $PCHECK 2821 good dbacl-1.14.1/src/tests/pcheck-2822b.shin000066400000000000000000000004431325773323600174650ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-2822b | $PCHECK 2822 bad dbacl-1.14.1/src/tests/pcheck-2822g.shin000066400000000000000000000004441325773323600174730ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-2822g | $PCHECK 2822 good dbacl-1.14.1/src/tests/pcheck-821b.shin000066400000000000000000000004411325773323600174000ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-821b | $PCHECK 821 bad dbacl-1.14.1/src/tests/pcheck-821g.shin000066400000000000000000000004421325773323600174060ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-821g | $PCHECK 821 good dbacl-1.14.1/src/tests/pcheck-822b.shin000066400000000000000000000004411325773323600174010ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-822b | $PCHECK 822 bad dbacl-1.14.1/src/tests/pcheck-822g.shin000066400000000000000000000004421325773323600174070ustar00rootroot00000000000000#!/bin/sh # header parsing test # many of the header examples in sample.headers* are copied from #Bruce Lilly's mparse testing suite http://users.erols.com/blilly/mparse PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl PCHECK=$TESTBIN/pcheck cat ${sourcedir}/sample.headers-822g | $PCHECK 822 good dbacl-1.14.1/src/tests/reservoir.shin000066400000000000000000000020451325773323600175130ustar00rootroot00000000000000#!/bin/sh # verify that reservoir sample scores are correct. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 formail prerequisite_command $0 grep prerequisite_command $0 awk DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (cat ${sourcedir}/sample.spam-8 ; echo ; \ cat ${sourcedir}/sample.spam-9 ; echo ; \ cat ${sourcedir}/sample.spam-7 ; echo ; \ cat ${sourcedir}/sample.spam-3 ) \ > "$DBACL_PATH/mbox" cat "$DBACL_PATH/mbox" \ | $DBACL -l dummy -X -v -T email 2>&1 \ | grep '^reservoir' \ > "$DBACL_PATH/out1" cat "$DBACL_PATH/mbox" \ | formail -s $DBACL -c dummy -vX \ > "$DBACL_PATH/out2" paste "$DBACL_PATH/out1" "$DBACL_PATH/out2" \ | awk ' function abs(x) { return (x >= 0) ? x : -x } { if( abs($3 - $10) > 0.1 ) { print; exit 1 } }' RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/sample.email-5000066400000000000000000000630011325773323600172430ustar00rootroot00000000000000From owner-linux-xfs@oss.sgi.com Sat Sep 27 13:33:53 2003 Return-Path: Received: from oss.sgi.com (oss.sgi.com [128.167.58.27]) by eclectic.kluge.net (8.11.6/8.11.6) with ESMTP id g7H7BVC31814 for ; Sat, 17 Aug 2002 03:11:32 -0400 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.12.5/8.12.5) with ESMTP id g7H78ERw020962; Sat, 17 Aug 2002 00:08:14 -0700 Received: from localhost (mail@localhost) by oss.sgi.com (8.12.5/8.12.3/Submit) with SMTP id g7H78Bra020961; Sat, 17 Aug 2002 00:08:11 -0700 X-Authentication-Warning: oss.sgi.com: mail owned process doing -bs Received: by oss.sgi.com (bulk_mailer v1.13); Sat, 17 Aug 2002 00:06:05 -0700 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.12.5/8.12.5) with ESMTP id g7H765Rw020865 for ; Sat, 17 Aug 2002 00:06:05 -0700 Received: (from majordomo@localhost) by oss.sgi.com (8.12.5/8.12.3/Submit) id g7H7659K020864 for linux-xfs-outgoing; Sat, 17 Aug 2002 00:06:05 -0700 X-Authentication-Warning: oss.sgi.com: majordomo set sender to owner-linux-xfs@oss.sgi.com using -f Received: from pepsi.splentec.com (ns.splentec.com [209.47.35.194]) by oss.sgi.com (8.12.5/8.12.5) with SMTP id g7H74wRw020790 for ; Sat, 17 Aug 2002 00:04:59 -0700 Received: from corona (corona.splentec.com [209.47.35.254]) by pepsi.splentec.com (8.11.6/8.11.0) with SMTP id g7H77Vs07556; Sat, 17 Aug 2002 03:07:32 -0400 Message-ID: <04b201c245bd$787c4220$d3232fd1@corona> From: "James Lee" To: "Eric Sandeen" Cc: , References: <012301c241cb$16ea8530$fe232fd1@corona> <1029265417.14205.29.camel@stout.americas.sgi.com> Subject: Re: kernel BUG at filemap.c:843! Date: Sat, 17 Aug 2002 03:12:38 -0400 X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Sender: owner-linux-xfs@oss.sgi.com Precedence: bulk X-Reject: Spamassassin match! MIME-Version: 1.0 Status: RO Content-Length: 23922 Lines: 447 I did more testing with your patch on top of today's CVS, but the patch didn't help at all. The following is the results of the tests: Testing setup: 1. created a "/dev/md0" with 4 scsi disks 2. created a LVM Volume group "vg" with the "/dev/md0" 3. created a LVM logical volume "vol1" with "vg" 4. created a XFS fs with a command: mkfs.xfs -f -d sunit=8,swidth=8 /dev/vg/vol1 -----------meta-data=/dev/vg/vol1 isize=256 agcount=8, agsize=32767 blks -----------data = bsize=4096 blocks=262136, imaxpct=25 ----------- = sunit=1 swidth=1 blks, unwritten=0 -----------naming =version 2 bsize=4096 -----------log =internal log bsize=4096 blocks=1200, version=1 ----------- = sunit=1 blks -----------realtime =none extsz=65536 blocks=0, rtextents=0 Test results: 1. mount with quota enabled => occasional kernel oops, attached the file oops1 2. mount without quota enabled => occasional kernel oops, attached the file oops2 3. mount without quota enabled, while md device is in degraded mode => always kernel oops, attached the file oops3 Thanks, JLee ----- Original Message ----- From: "Eric Sandeen" To: "James Lee" Cc: ; Sent: Tuesday, August 13, 2002 3:03 PM Subject: Re: kernel BUG at filemap.c:843! > Hi guys - > > We treat MD and LVM somewhat specially, and I wonder if in this case MD > is masking the fact that you're using LVM, and that might be where the > problem starts. > > Can you try this patch, which will cause LVM & MD to be treated the > same, to see if it helps? It's probably not the final solution, but it > might offer some hints. > > Thanks, > > -Eric > > --- linux/fs/xfs/pagebuf/page_buf_locking.c_1.24 Tue Aug 13 14:05:18 2002 > +++ linux/fs/xfs/pagebuf/page_buf_locking.c Tue Aug 13 13:59:37 2002 > @@ -198,7 +196,7 @@ > pagebuf_target_blocksize(target, PAGE_CACHE_SIZE); > > if ((MAJOR(dev) == MD_MAJOR) || (MAJOR(dev) == EVMS_MAJOR)) > - target->pbr_flags = PBR_ALIGNED_ONLY; > + target->pbr_flags = PBR_SECTOR_ONLY; > else if (MAJOR(dev) == LVM_BLK_MAJOR) > target->pbr_flags = PBR_SECTOR_ONLY; > else > > > > On Mon, 2002-08-12 at 01:40, James Lee wrote: > > Hi, > > > > I'm also having the exactly same problem. > > Tested with 2.4.19-xfs(checked out from SGI's CVS on Aug 10) on Redhat 7.2. > > Kernel and userland tools are compiled with gcc 2.91.66 > > The following is the result of some tests: > > > > scsidisks -> xfs: OK > > scsidisks -> raid5 -> xfs: OK > > scsidisks -> lvm -> xfs: OK > > scsidisks -> raid0 -> lvm -> xfs: OK > > scsidisks -> raid1 -> lvm -> xfs: OK > > scsidisks -> raid5 -> lvm -> xfs: kernel BUG at filemap.c:843! > > > > This problem is always reproducible with the following shell script: > > > > #!/bin/sh > > mkraid /dev/md0 > > vgcreate VolumeGroup /dev/md0 > > lvcreate -L1G -nTestVolume VolumeGroup > > mkfs.xfs -f -d size=32m /dev/VolumeGroup/TestVolume > > mount -t xfs /dev/VolumeGroup/TestVolume > > /mnt -onoatime,nodiratime,usrquota,grpquota > > > > Whenever I run the above script, mount command always generates kernel oops. > > But, if I insert some delay as of the following, then mount goes well: > > > -- > Eric Sandeen XFS for Linux http://oss.sgi.com/projects/xfs > sandeen@sgi.com SGI, Inc. 651-683-3102 begin 666 oops1.dat M=&5S=&5D.B R+C0N,3DM>&9S("A31TDG7-T96T@8W)E871E9"!O;B!T;W @;V8@ M3%9-("L@340L('-O;65T:6UE6UO;W!S(#(N-"XQ(&]N(&DV.#8@,BXT+C$Y+B @3W!T:6]N6UB;VP@:6YF;W)M871I;VXN("!) M('=I;&P*87-S=6UE('1H870@=&AE(&QO9R!M871C:&5S('1H92!K97)N96P@ M86YD(&UO9'5L97,@=&AA="!A6UO;W!S("UT(&5L9C,R+6DS.#8@ M+6$@:3,X-@I%1DQ!1U,Z(# P,#$P,C0V"F5A>#H@8S$Y969B-# @("!E8G@Z M(&,P,V$W9#$T(" @96-X.B P,# P,# Q-B @(&5D>#H@,# P,# P,# *97-I M.B!C,6,P,&5C8R @(&5D:3H@9C5F,F9F,C @("!E8G Z(# P,# P,# Q(" @ M97-P.B!F-6-D,3DY. ID2MA8R\Q,3 ^"E1R86-E.R!C,#(T-C4X.2 \<&%G96)U9E]I M;W)E<75E&9S7W)E861?8G5F*S-E+V8P M/@I4&9S7W)E861S8BLX,"]C,#X*5')A8V4[(&,P,C-B960T(#QX9G-?8VUO=6YT M9G,K-37-T96U?8V%L;"LS,R\S.#X*0V]D93L@(&,P,3)B9&0V(#QU;FQO8VM? M<&%G92LT-B\W,#X*,# P,# P,# @/%]%25 ^.@I#;V1E.R @8S Q,F)D9#8@ M/'5N;&]C:U]P86=E*S0V+S

&9F9F9F9F5A*"5E8W@I+"5E8W@*0V]D93L@(&,P M,3)B9&1C(#QU;FQO8VM?<&%G92LT8R\W,#X*(" @-CH@(" S-"!C," @(" @ M(" @(" @(" @(" @(" @('AO#0H)65S:2DL)65A> I#;V1E.R @8S Q M,F)D93$@/'5N;&]C:U]P86=E*S4Q+S

&9S("A31TDG7-T96T@=VET:"!Q=6]T82!E;F%B;&5D M+"!C&9S("UF("UD('-U;FET/3@L6]U(&-A;B!G970*;6]R92!A8V-U'!L86EN#H@8S S83=D M,30@("!E8W@Z(# P,# P,#$V(" @961X.B P,# P,# P, IE&9S M7V)U;&MS=&%T*S%B,R]B.# ^"E1R86-E.R!C,#%F,3,Y.2 \>&9S7W%M7W%U M;W1A8VAE8VLK8SDO,34P/@I4&9S7VUO=6YT M9G,K9C!B+S$P,# ^"E1R86-E.R!C,#(S,S9B8B \>&9S7W)E861S8BLS8B]C M,#X*5')A8V4[(&,P,C,S-S P(#QX9G-? I#;V1E.R @8S Q,F)D9#D@/'5N;&]C:U]P86=E*S0Y+S

"DL)65C> I#;V1E.R @8S Q,F)D9&,@/'5N;&]C:U]P86=E*S1C+S

&]R(" @("0P M>&,P+"5A; I#;V1E.R @8S Q,F)D9&4@/'5N;&]C:U]P86=E*S1E+S

"PP>#0H)65S:2D*0V]D93L@(&,P,3)B9&4T(#QU;FQO8VM?<&%G92LU-"\W M,#X*(" @93H@(" W-" Q," @(" @(" @(" @(" @(" @(" @(&IE(" @(" R M," \7T5)4"LP>#(P/B!C,#$R8F1F-B \=6YL;V-K7W!A9V4K-C8O-S ^"D-O M9&4[("!C,#$R8F1E-B \=6YL;V-K7W!A9V4K-38O-S ^"B @,3 Z(" @-6(@ M(" @(" @(" @(" @(" @(" @(" @("!P;W @(" @)65B> I#;V1E.R @8S Q M,F)D93<@/'5N;&]C:U]P86=E*S4W+S

I#;V1E.R @8S Q,F)D M93D@/'5N;&]C:U]P86=E*S4Y+S

&]R(" @("5E87@L*"5E87@I"@H*-B!W87)N:6YG2!N;W0@8F4@&9S("A31TDG7-T96T@8W)E871E9"!O;B!T;W @;V8@ M3%9-("L@340L('=H:6QE($U$(&ES(&EN(&1E9W)A9&5D(&UO9&4@86QW87ES M(&=E;F5R871E&9S("UF("UD('-U;FET/3@L6UO;W!S(#T]/3T] M/3T]/3T]/3T]/3T]/3T]/0IK6US("AD969A=6QT*0H@(" @("UL("]P6US(&5T8RX@(&MS>6UO;W!S("UH(&5X<&QA:6YS('1H92!O M<'1I;VYS+@H*:V5R;F5L($)51R!A="!F:6QE;6%P+F,Z.#0S(0II;G9A;&ED M(&]P97)A;F0Z(# P,# *0U!5.B @(" P"D5)4#H@(" @,# Q,#I;/&,P,3)B M9&0V/ET@(" @3F]T('1A:6YT960*57-I;F<@9&5F875L=',@9G)O;2!K#H@,# P,# P,38@ M("!E9'@Z(# P,# P,# P"F5S:3H@8S%C,#)A8S@@("!E9&DZ(&5F,#EE96,P M(" @96)P.B P,# P,# P,2 @(&5S<#H@968P-F9A-&,*9',Z(# P,3@@("!E M2MA8R\Q,3 ^"E1R86-E.R!C,#(T-C4X.2 \<&%G96)U M9E]I;W)E<75E&9S7W)E861S8BLR,2]C M,#X*5')A8V4[(&,P,C-B9#1E(#QX9G-?8VUO=6YT9G,K,V5E+S8Q,#X*5')A M8V4[(&,P,C-C,#!B(#QX9G-?;6]U;G0K-&(O-C ^"E1R86-E.R!C,#(T968R M-B \;&EN=F9S7W)E861? I#;V1E.R @8S Q,F)D9#D@/'5N;&]C:U]P86=E M*S0Y+S

"DL)65C> I#;V1E.R @8S Q,F)D9&,@/'5N M;&]C:U]P86=E*S1C+S

&]R(" @("0P>&,P+"5A; I#;V1E.R @8S Q,F)D9&4@/'5N;&]C M:U]P86=E*S1E+S

"PP>#0H)65S:2D*0V]D93L@(&,P,3)B9&4T(#QU M;FQO8VM?<&%G92LU-"\W,#X*(" @93H@(" W-" Q," @(" @(" @(" @(" @ M(" @(" @(&IE(" @(" R," \7T5)4"LP>#(P/B!C,#$R8F1F-B \=6YL;V-K M7W!A9V4K-C8O-S ^"D-O9&4[("!C,#$R8F1E-B \=6YL;V-K7W!A9V4K-38O M-S ^"B @,3 Z(" @-6(@(" @(" @(" @(" @(" @(" @(" @("!P;W @(" @ M)65B> I#;V1E.R @8S Q,F)D93<@/'5N;&]C:U]P86=E*S4W+S

I#;V1E.R @8S Q,F)D93D@/'5N;&]C:U]P86=E*S4Y+S

&]R(" @("5E87@L*"5E87@I M"@H]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T] +/3T]/3T]/3T]/0H` ` end dbacl-1.14.1/src/tests/sample.email-6000066400000000000000000003137461325773323600172620ustar00rootroot00000000000000From zope-admin@zope.org Thu Jul 18 09:38:36 2002 Return-Path: Received: from localhost (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g6HNcYE29564 for ; Thu, 18 Jul 2002 09:38:34 +1000 Received: from mail.interlink.com.au [203.9.111.130] by localhost with POP3 (fetchmail-5.9.0) for anthony@localhost (single-drop); Thu, 18 Jul 2002 09:38:34 +1000 (EST) Received: from mail.python.org (mail.python.org [63.102.49.29]) by valdez.interlink.com.au (8.11.6/8.11.2) with ESMTP id g6HN0qD05728 for ; Thu, 18 Jul 2002 09:00:52 +1000 Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org) by mail.python.org with esmtp (Exim 4.05) id 17Uxmc-0004ON-00; Wed, 17 Jul 2002 19:00:34 -0400 Received: from exim by mail.python.org with spamc (Exim 4.05) id 17Uxm3-0003qi-00 for zope@zope.org; Wed, 17 Jul 2002 18:59:59 -0400 Received: from vaemail.bankofamerica.com ([171.159.192.14]) by mail.python.org with esmtp (Exim 4.05) id 17Uxlz-0002xv-00 for zope@zope.org; Wed, 17 Jul 2002 18:59:55 -0400 Received: from vaimail.bankofamerica.com (vaimail.bankofamerica.com [171.182.200.13]) by vaemail.bankofamerica.com (8.11.1/8.11.1) with ESMTP id g6HMxOm11808; Wed, 17 Jul 2002 22:59:24 GMT Received: from smtpsw04 (smtpsw04.bankofamerica.com [171.172.129.20]) by vaimail.bankofamerica.com (8.11.1/8.11.1) with ESMTP id g6HMvv226357; Wed, 17 Jul 2002 22:57:57 GMT From: eric.n.dunn@bankofamerica.com To: Deb Hazarika Cc: zope@zope.org Message-id: <86256BF9.007E3E16.00@notes.bankofamerica.com> MIME-version: 1.0 Content-type: multipart/mixed; boundary="Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ)" X-Lotus-FromDomain: BANKOFAMERICA Subject: [Zope] Re: BITS Sender: zope-admin@zope.org Errors-To: zope-admin@zope.org X-BeenThere: zope@zope.org X-Mailman-Version: 2.0.12 (101270) Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Users of the Z Object Publishing Environment List-Unsubscribe: , List-Archive: Date: Wed, 17 Jul 2002 18:50:38 -0400 X-Spam-Level: X-UIDL: [>4"!P0D"!+,^"!!]+!! X-Spam-Status: No, hits=0.6 required=5.0 tests=NO_REAL_NAME version=2.20 X-Spam-Level: Status: RO Content-Length: 101826 Lines: 1412 --Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ) Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline (Embedded image moved to file: pic12055.pcx) (Embedded image moved to file: pic30813.pcx) Set as Projectmanager.. temamanager etc... (Embedded image moved to file: pic17450.pcx) "View" None of the screens allow me to start a Project Am I missing a dependency? Zope 2.5.0 on Debian Eric Dunn Deb Hazarika on 07/17/2002 05:05:58 PM To: Eric N. Dunn/USA/BAC@BankofAmerica cc: sam@zeomega.com Subject: BITS Hello Eric, Sorry for not providing a document along with the product, actually i am working on the documents and soon it will be available for download. As of now i can help you out with some basic instructions: 1) Initiate a BITS instance in your ZMI. 2) BITS will by default have an acl_users folder within it, If you don't want to use it and use the existing users in a acl_users folder at it's top then please delete the acl_users folder within BITS. 3) Set the role Projectmanager to the users whom you want to give the ability to add project 4) Set the roles (Developer,Teammember) or (Developer,Teamleader) to those users who are going to participate in BITS. Now you are ready with the configurations. Go to the view tab of bits and create a project with a projectmanager and some team member. And then you can keep adding and tracking BUGS in this project. All the best Cheers DEB --Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ) Content-type: text/html; name=att1.htm Content-transfer-encoding: 7BIT Content-disposition: attachment; filename=att1.htm Content-description: Internet HTML

Hello Eric,
 
Sorry for not providing a document along with the product,
actually i am working on the documents and soon it will be available for download.
 
As of now i can help you out with some basic instructions:
 
1) Initiate a BITS instance in your ZMI.
 
2) BITS will by default have an acl_users folder within it, If you don't want to use it and use the existing users in a acl_users folder at it's top then please
    delete the acl_users folder within BITS.
 
3) Set the role Projectmanager to the users whom you want to give the ability to add project
 
4) Set the roles (Developer,Teammember) or (Developer,Teamleader) to those users who are going to participate in BITS.
 
Now you are ready with the configurations. Go to the view tab of bits and create a project with a projectmanager and some team member.
And then you can keep adding and tracking BUGS in this project.
 
All the best
 
Cheers
DEB
 
--Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ) Content-type: text/html; name=pic12055.pcx Content-transfer-encoding: base64 Content-disposition: attachment; filename=pic12055.pcx Content-description: Internet HTML CgUBCAAAAACSAWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABkwEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/////////////7f/W/8v/xv/D/8H//////////////+3/1v/L/8b/w//B ///////////////t/9b/y//G/8P/wf//////////////7f/W/8v/xv/D/8H//////////////+3/ 1v/L/8b/w//B/8H//wf/B/8H/wf/B+wH1gfLB8YHwwcHwf//B/8H/wf/B/8H7AfWB8sHxgfDBwfB //8H/wf/B/8H/wfsB9YHywfGB8MHB8H//wf/B/8H/wf/B+wH1gfLB8YHwwcHwf//B/8H/wf/B/8H 7AfWB8sHxgfDBwfB//8H/wf/B/8H/wfsB9YHywfGB8MHB8H/4AfHBN4HwwTEBwT/B/8H/wf/B+UH 0wfJB8UHwgcHwf/jBwThB8MExAcE/wf/B/8H/wflB9MHyQfFB8IHB8H/4wcExQcExAcEwgcEB8ME xAfEBMcHBAfCBMMHBMMHxQTDB8IEB8MEwgfDBMQHxQT/B/8H/wf1B9sHzQfHB8MHwgfB/+MHBMUH BMQHBMIHwgTDBwTCBwTEBwTGBwQHwgTDBwTHB8IEwgfDBMIHwwTCB8IEwgfCBMMHwgT/B/8H/wf1 B9oHzQfHB8MHwgfB/+MHBMYHBMIHBMMHBMQHBMIHBMQHBMYHBMIHwgTCBwTDB8YEwgfCBMMHwgTD B8IEwgfCBMMHwgT/B/8H/wf1B9oHzQfHB8MHwgfB/+MHBMYHBMIHBMMHBMQHBMIHxgTGBwTDB8IE BwTCB8IEwwfCBMIHwgTDB8IEwwfCBMIHxwT/B/8H/wf1B9oHzQfHB8MHwgfB/+MHBMYHBMIHBMMH BMQHBMIHBMsHBMMHwgQHBMIHwgTDB8IEwgfCBMMHwgTDB8IEwgfCBP8H/wf/B/cH3AfOB8cHwwfC B8H/4wcExwfCBMQHBMQHBMIHBMQHBMYHBMQHwwTCB8IEwwfCBMIHwgTDB8IEwwfCBMIHwgTDB8IE /wf/B/8H9QfaB80HxwfDB8IHwf/jBwTHB8IExAfFBMQHxATHBwTEB8MEwwfGBMIHwgTDB8IEwwfC BMMHxQT/B/8H/wf1B9sHzQfHB8MHwgfB/+sHBMUHBP8H/wf/B/8H8wfZB80HxgfDB8IHwf/rBwTF BwT/B/8H/wf/B/MH2QfNB8YHwwfCB8H/6gcExgcE/wf/B/8H/wfzB9kHzQfGB8MHwgfB//8H/wf/ B/8H/wfsB9YHywfGB8MHB8H//wf/B/8H/wf/B+wH1gfLB8YHwwcHwf//9v/2//b/9v/27PbW9sv2 xvbD9sH2wf//9v/2//b/9v/27PbW9sv2xvbD9sH2wf//9v/2//b/9v/27PbW9sv2xvbD9sH2wf// 9v/2//b/9v/27PbW9sv2xvbD9sH2wf//9v/2//b/9v/27PbW9sv2xvbD9sH2wf//9v/2//b/9v/2 7PbW9sv2xvbD9sH2wf/G9sykwf/y9sQExPbDBML2xwTD9sUE//b/9v/2+/bd9s/2x/bE9sL2wf/G 9qTKUgjB/9z2B9X2BMP2BMT2BMb2BMX2BMX2BP/2//b/9vr23fbP9sf2xPbC9sH/xvakUsn/CMH/ 2/bB9wBS1PYEw/YExPYExvYExfYE//b/9v/2/fbf9s/2yPbE9sL2wf/G9qRSyf8Iwf/b9lLCAMH3 0/YEw/YExPYExvYExfYE//b/9v/2/fbf9s/2yPbE9sL2wf/G9qRSyf8Iwf/a9psHAFLU9sUExPYE xvYExvbFBP/2//b/9vv23fbP9sf2xPbC9sH/xvakUsn/CMH/2fabwgDW9gTE9gTD9gTG9gTL9gT/ 9v/2//b69t32z/bH9sT2wvbB/8b2pFLJ/wjB/9j2ncQAUtT2BMT2BMP2BMb2BMv2BP/2//b/9vr2 3fbP9sf2xPbC9sH/xvakUsn/CMH/1/abAFLD953U9gTE9gTD9gTG9gTF9gTF9gT/9v/2//b69t32 z/bH9sT2wvbB/8b2pFLJ/wjB/9b2mxIAw1LW9sUEw/bDBMX2BMb2xQT/9v/2//b79t32z/bH9sT2 wvbB/8b2pFLJ/wjB/9X2wffCAEDDAJr/9v/2//b/9vT22vbN9sb2w/bC9sH/xvakUsn/CMH/1Pab AFLC9psAUv/2//b/9v/29Pba9s32x/bD9sL2wf/G9qTLCMH/0/bB9wBSwvabAJP/9v/2//b/9vX2 2vbN9sf2w/bC9sH/xvbN/9P2wvfD9sL3//b/9v/2//b19tv2zfbH9sP2wvbB///2//b/9v/2//bs 9tb2y/bG9sP2wfbB///2//b/9v/2//bs9tb2y/bG9sP2wfbB/972B55Vwq6drsL2wfdVnsL2we6d rpWew67B9sKuB8L2rrb/9v/2//b/9u721/bL9sb2w/bB9sH/3/adlQeuXZ7C9q5VnsX2XZ7C9sHu wfaunsSu//b/9v/2//bu9tf2zPbG9sP2wfbB/9/2nVWvrpWuwvaunZ7F9p2exPbB7q6enZ6dnv/2 //b/9v/27vbX9sv2xvbD9sH2wf/f9p6dwvadnsL2rp6dxfaersT2wq7C9sKunf/2//b/9v/27vbX 9sv2xvbD9sH2wf/e9raunq7B7sKuwvaunq7E9geewfeuw/autsP2rrb/9v/2//b/9u721/bL9sb2 w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/ 9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2//b/9uz2 1vbL9sb2w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB 9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2//b/9uz21vbL9sb2w/bB9sH///b/9v/2 //b/9uz21vbL9sb2w/bB9v/////////////t/9b/y//G/8P/wf//////////////7f/W/8v/xv/D /8H////j/1Lm/1L1/1L//8T/Uv//6f/U/8r/xf/B/1LC/9j//wjKCKRSxv/fCKRSxv/uCKRSxv/8 CKRSxv//COYI0wjJCMQIpFLC/9j//wjKCKRSxv/fCKRSxv/uCKRSxv/8CKRSxv//COYI0wjJCMQI pFLC/9j//wjKCKRSxv/fCKRSxv/uCKRSxv/8CKRSxv//COYI0wjJCMQIpFLC/9j//wjKCKRSxv/f CKRSxv/uCKRSxv/8CKRSxv//COYI0wjJCMQIpFLC/9j//wjKCKRSxv/fCKRSxv/uCKRSxv/8CKRS xv//COYI0wjJCMQIpFLC/9j//wjKCKRSxv/fCKRSxv/uCKRSxv/bCADgCKRSxv//CMYIAOII0QjJ CMMIpFLC/9j/zAjFAPgIpFLG/8cIxADMCADHCKRSxv/KCMQA4AikUsb/ygjFAMwIAMsIANQIpFLG /9YIwwDjCADICAAIxgDfCADPCMcIwgikUsL/2P/MCADECAD3CKRSxv/GCADECADLCADHCKRSxv/J CADECADfCKRSxv/KCADECADLCADLCADUCKRSxv/XCADkCADHCADCCADhCMMIAM8IxwjCCKRSwv/Y /8wIAMQIAMMIxADDCAAIwwDECMQAwwgACMIAwgjCAMQIxADNCKRSxv/FCADICADECADCCMQAxQik Usb/yAgAyQjEAMMIAAjDAMMIAMQIAMcIpFLG/8oIAMUIAMMIxADDCADDCMQAwwjEAMMIxADLCKRS xv/XCADDCAAIwgDCCMIAwwgACMMAxAjEAMMIAAjCAAjEAMUIAMIIAMcIAMMIAMIIAAjDAMQIxADD CAAIwgAIxADOCMcICKRSwv/Y/8wIAMQIAMIIAMQIAMIIwgDDCADHCADCCMIAwgjCAMIIAMIIAMQI AMwIpFLG/8UIAMgIAMQIAMMIAMcIpFLG/8gIAMgIAMQIAMIIwgDDCADCCADECADHCKRSxv/KCADF CADCCADECADCCADCCADECADDCADECADECADKCKRSxv/XCADDCMIAwgjCAMIIAMIIwgDDCADCCADE CADCCMIAxAgAxggAwwgAxwgAwwgAwgjCAMMIAMIIAMQIAMIIwgDECADPCMcIwgikUsL/2P/MCADD CADDCADECADCCADECADHCADCCADDCADDCADCCADECADMCKRSxv/FCADICADECADDCADHCKRSxv/I CADICADECADCCADECADDCADCCADICKRSxv/KCADFCADCCADECADCCADCCADECADDCADECADECADK CKRSxv/XCADDCADDCADDCADCCADECADCCADECADCCADFCADGCADDCMYAwwgACADDCADECADCCADE CADCCADFCADPCMcIwgikUsL/2P/MCMQAxAjGAMIIAMQIAMMIxQDCCADDCADDCADCCMYAzAikUsb/ xQgAyAgAxAgAwwgAxwikUsb/yAgAyAgAxAgAwggAxAgAwwgAwggAyAikUsb/yggAxQgAwgjGAMII AMIIxgDDCADECMYAygikUsb/1wgAwwgAwwgAwwgAwggAxAgAwggAxAgAwggAxQgAxQgAxAgAyQgA xAgAxAgAwggAxAgAwggAxQgAzwjHCMIIpFLC/9j/zAgAwwgAwwgAxwgAxAgAwggAxAgAwggAwwgA wwgAwggA0QikUsb/xQgAyAgAxAgAwwgAxwikUsb/yAgAyAgAxAgAwggAxAgAwwgAwggAyAikUsb/ yggAxQgAwggAxwgAwggAyAgAxAgAzwikUsb/1wgAwwgAwwgAwwgAwggAxAgAwggAxAgAwggAxQgA xQgAxAgAyAgACADDCADECADCCADECADCCADFCADPCMcIwgikUsL/2P/MCADECADCCADECADCCADE CADCCADECADCCADDCADDCADCCADECADMCKRSxv/GCADECADCCADDCMIAwwgAxwikUsb/yQgAxAgA wggAxAgAwggAxAgAxAjCAMkIpFLG/8oIAMQIAMMIAMQIAMIIAMIIAMQIAMMIAMQIAMQIAMoIpFLG /9cIAMMIAMMIAMMIAMIIAMQIAMIIAMQIAMIIAMUIAMQIAMUIAMcIAMMIAMIIAMQIAMIIAMQIAMII AMUIAM8IxwjCCKRSwv/Y/8wIAMUIAMIIxADDCADECADDCMUAwggAwwgAwwgAwwjEAM0IpFLG/8cI xADECMMACADECMIAxQikUsb/ygjEAMQIxADDCMUAxQjCAMkIpFLG/8oIxQDFCMQAwwgAwwjEAMUI wgDDCMQAywikUsb/1gjDAMIIAMMIAMMIAMIIxQDECMQAwwgAxgjCAMIIAMUIxgDCCADDCADCCMUA xAjEAMMIAMYIwgDOCMcICKRSwv/Y//8IygikUsb/3wikUsb/2QgAyQgAygikUsb//AikUsb/5ggA 2QgA1QgA2gjNCMYICKRSwv/Y//8IygikUsb/3wikUsb/2QgAyQgAygikUsb//AikUsb/5ggA2QgA 1QgA2gjNCMYICKRSwv/Y//8IygikUsb/3wikUsb/2QgAyAgAywikUsb//AikUsb/5ggA7wgA2gjN CMYICKRSwv/Y//8IygikUsb/3wikUsb/7gikUsb//AikUsb//wjmCNMIyQjECKRSwv/Y//8Iygik Usb/3wikUsb/7gikUsb//AikUsb//wjmCNMIyQjECKRSwv/Y//8IygikUsb/3wikUsb/7gikUsb/ /AikUsb//wjmCNMIyQjECKRSwv/Y//+ky6RSxv/gpFLG/++kUsb//aRSxv//pOak06TJpMWkUsL/ 1///Us1Sxf/iUsX/8VLF//9Sxf//UuZS01LKUsVSUsL//////////////+3/1v/L/8b/w//B//// ///////////t/9b/y//G/8P/wf//////////////7f/W/8v/xv/D/8H//////////////+3/1v/L /8b/w//B///////////////t/9b/y//G/8P/wf//////////////7f/W/8v/xv/D/8H///////// /////+3/1v/L/8b/w//B///////////////t/9b/y//G/8P/wf//////////////7f/W/8v/xv/D /8H//////////////+3/1v/L/8b/w//B///////////////t/9b/y//G/8P/wf////////////// 7f/W/8v/xv/D/8H//////////////+3/1v/L/8b/w//B///////////////t/9b/y//G/8P/wf// ////////////7f/W/8v/xv/D/8H//////////////+3/1v/L/8b/w//B///////////////t/9b/ y//G/8P/wf//////////////7f/W/8v/xv/D/8H//////////////+3/1v/L/8b/w//B/wwAAACA AAAAgACAgAAAAICAAIAAgIDAwMDA3MCmyvBAIABgIACAIACgIADAIADgIAAAQAAgQABAQABgQACA QACgQADAQADgQAAAYAAgYABAYABgYACAYACgYADAYADgYAAAgAAggABAgABggACAgACggADAgADg gAAAoAAgoABAoABgoACAoACgoADAoADgoAAAwAAgwABAwABgwACAwACgwADAwADgwAAA4AAg4ABA 4ABg4ACA4ACg4ADA4ADg4AAAAEAgAEBAAEBgAECAAECgAEDAAEDgAEAAIEAgIEBAIEBgIECAIECg IEDAIEDgIEAAQEAgQEBAQEBgQECAQECgQEDAQEDgQEAAYEAgYEBAYEBgYECAYECgYEDAYEDgYEAA gEAggEBAgEBggECAgECggEDAgEDggEAAoEAgoEBAoEBgoECAoECgoEDAoEDgoEAAwEAgwEBAwEBg wECAwECgwEDAwEDgwEAA4EAg4EBA4EBg4ECA4ECg4EDA4EDg4EAAAIAgAIBAAIBgAICAAICgAIDA AIDgAIAAIIAgIIBAIIBgIICAIICgIIDAIIDgIIAAQIAgQIBAQIBgQICAQICgQIDAQIDgQIAAYIAg YIBAYIBgYICAYICgYIDAYIDgYIAAgIAggIBAgIBggICAgICggIDAgIDggIAAoIAgoIBAoIBgoICA oICgoIDAoIDgoIAAwIAgwIBAwIBgwICAwICgwIDAwIDgwIAA4IAg4IBA4IBg4ICA4ICg4IDA4IDg 4IAAAMAgAMBAAMBgAMCAAMCgAMDAAMDgAMAAIMAgIMBAIMBgIMCAIMCgIMDAIMDgIMAAQMAgQMBA QMBgQMCAQMCgQMDAQMDgQMAAYMAgYMBAYMBgYMCAYMCgYMDAYMDgYMAAgMAggMBAgMBggMCAgMCg gMDAgMDggMAAoMAgoMBAoMBgoMCAoMCgoMDAoMDgoMAAwMAgwMBAwMBgwMCAwMCgwMD/+/CgoKSA gID/AAAA/wD//wAAAP//AP8A//////8= --Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ) Content-type: text/html; name=pic30813.pcx Content-transfer-encoding: base64 Content-disposition: attachment; filename=pic30813.pcx Content-description: Internet HTML CgUBCAAAAACnAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABqAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD///X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv// //X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N/8f/w//C///2 9fbb9sr2yP/E/8L/wf//9vX22/bK9sj/xP/C/8H///b19tv2yvbI/8T/wv/B/932xAD/9uX20vbC 9sj/xP/C/8H/3fbEAP/25fbS9sL2yP/E/8L/wf/d9sQA//bl9tL2wvbI/8T/wv/B/8P2zKTB/832 xAD/9uX20vbC9sj/xP/C/8H/w/akylIIwf//9u321/bG9sj/xP/C/8H/w/akUsn/CMH/yfbMAN72 BPP22fbJ9sj/xP/C/8H/w/akUsn/CMH/yfbMAPL2BOn21PbE9sj/xP/C/8H/w/akUsn/CMH/zfbE APb2BOn21PbE9sj/xP/C/8H/w/akUsn/CMH/zfbEAMz2BMH2wwTD9gTB9sIEwvbEBMP2wgTD9sQE xPbEBMP2xATo9tT2w/bI/8T/wv/B/8P2pFLJ/wjB/832xADM9sIEw/YEwvbCBMP2BMT2BMP2BML2 BMT2BML2BMT2BMP2BOn21PbE9sj/xP/C/8H/w/akUsn/CMH/zPbGAMv2BMT2BML2BMT2BMT2BMP2 BML2BMT2BML2BMj2BOn21PbE9sj/xP/C/8H/w/akUsn/CMH/zPbCAML2wgDL9gTE9gTC9gTE9gTE 9gTD9gTC9sYEwvYEyPYE6fbU9sT2yP/E/8L/wf/D9qRSyf8Iwf/L9sMAwvbDAMr2BMT2BML2BMT2 BMT2BMP2BML2BMf2BMj2BOn21PbE9sj/xP/C/8H/w/akUsn/CMH/y/bCAMT2wgDK9gTE9gTC9gTE 9gTE9gTD9gTC9gTE9gTC9gTE9gTD9gTp9tT2xPbI/8T/wv/B/8P2pMsIwf/K9sMAxPbDAMn2xQTD 9gTF9sQExPYEw/bEBMT2xATF9sIE6PbU9sP2yP/E/8L/wf/D9s3/3fYE1fYE8/bZ9sn2yP/E/8L/ wf/t9gTV9gTz9tn2yfbI/8T/wv/B/+32BNL2wwTz9tr2yfbI/8T/wv/B///29fbb9sr2yP/E/8L/ wf//9vX22/bK9sj/xP/C/8H///b19tv2yvbI/8T/wv/B///29fbb9sr2yP/E/8L/wf////X/2//N /8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv/d/8QA///l/9L/yf/F/8L/wf/d/8QA ///l/9L/yf/F/8L/wf/d/8QA///l/9L/yf/F/8L/wf/D/8ykzv/EAP//5f/S/8n/xf/C/8H/w/+k ylII///u/9f/y//G/8P/wf/D/6RSyf8Iyv/MAP//4//R/8n/xP/C/8H/w/+kUsn/CMr/zADJ/wT9 /9//z//I/8T/wv/D/6RSyf8Izv/EAM3/BP3/3//P/8j/xP/C/8P/pFLJ/wjO/8QAzP/EBMP/xATE /8QEw/8Ewf/CBML/wgTv/9j/zP/G/8P/wf/D/6RSyf8Izv/EAM3/BMT/BMT/BMf/BML/wgTC/8IE wv8E7//X/8z/xv/D/8H/w/+kUsn/CM3/xgDM/wTE/wTE/wTH/wTC/wTD/wTD/wTv/9f/zP/G/8P/ wf/D/6RSyf8Izf/CAML/wgDM/wTE/8YEw//FBML/BMP/BMP/BO//1//M/8b/w//B/8P/pFLJ/wjM /8MAwv/DAMv/BMT/BMf/BMT/BML/BMP/BMP/BO//1//M/8b/w//B/8P/pFLJ/wjM/8IAxP/CAMv/ BMT/BMT/BML/BMT/BML/BMP/BMP/BO//1//M/8b/w//B/8P/pMsIy//DAMT/wwDL/8IEw//EBMT/ xQTC/wTD/wTD/wTv/9f/zP/G/8P/wf////X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/ zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N /8f/w//C///29fbb9sr2yP/E/8L/wf//9vX22/bK9sj/xP/C/8H///b19tv2yvbI/8T/wv/B/932 xAD/9uX20vbC9sj/xP/C/8H/3fbEAP/25fbS9sL2yP/E/8L/wf/d9sQA//bl9tL2wvbI/8T/wv/B /8P2zKTB/832xAD/9uX20vbC9sj/xP/C/8H/w/akylIIwf//9u321/bG9sj/xP/C/8H/w/akUsn/ CMH/yfbMAP/24/bR9sH2yP/E/8L/wf/D9qRSyf8Iwf/J9swAyfYE4PbEBOv21vbF9sj/xP/C/8H/ w/akUsn/CMH/zfbEAM32BN/2BMT2BOv21fbF9sj/xP/C/8H/w/akUsn/CMH/zfbEAMz2xATD9sQE xPbEBMP2BMH2wgTC9sIEw/YExPYE6/bV9sX2yP/E/8L/wf/D9qRSyf8Iwf/N9sQAzfYExPYExPYE x/YEwvbCBML2wgTC9gTH9gTr9tX2xfbI/8T/wv/B/8P2pFLJ/wjB/8z2xgDM9gTE9gTE9gTH9gTC 9gTD9gTD9gTG9gTr9tb2xfbI/8T/wv/B/8P2pFLJ/wjB/8z2wgDC9sIAzPYExPbGBMP2xQTC9gTD 9gTD9gTE9sIE7PbW9sX2yP/E/8L/wf/D9qRSyf8Iwf/L9sMAwvbDAMv2BMT2BMf2BMT2BML2BMP2 BMP2BMP2BO321vbG9sj/xP/C/8H/w/akUsn/CMH/y/bCAMT2wgDL9gTE9gTE9gTC9gTE9gTC9gTD 9gTD9gTC9gTt9tf2xvbI/8T/wv/B/8P2pMsIwf/K9sMAxPbDAMv2wgTD9sQExPbFBML2BMP2BMP2 BML2xgTr9tX2xfbI/8T/wv/B/8P2zf//9u321/bG9sj/xP/C/8H///b19tv2yvbI/8T/wv/B///2 9fbb9sr2yP/E/8L/wf//9vX22/bK9sj/xP/C/8H///b19tv2yvbI/8T/wv/B///29fbb9sr2yP/E /8L/wf//9vX22/bK9sj/xP/C/8H////1/9v/zf/H/8P/wv////X/2//N/8f/w//C////0/9S6//W /8L/Usn/xf/C/8H/2P/5CKRSxv/oCNQIpFLJ/8X/wv/B/9j/+QikUsb/6AjUCKRSyf/F/8L/wf/Y //kIpFLG/+gI1AikUsn/xf/C/8H/2P/5CKRSxv/oCNQIpFLJ/8X/wv/B/9j/+QikUsb/6AjUCKRS yf/F/8L/wf/Y/9gIAMcIANgIpFLG/9sIANoIxgikUsn/xf/C/8H/2P/NCADKCADHCADYCKRSxv/K CMUAzAgAywgA1AikUsn/xf/C/8H/2P/NCADKCADHCADYCKRSxv/KCADECADLCADLCADUCKRSyf/F /8L/wf/Y/8wIAAgAxQjFAMMIxQDYCKRSxv/KCADFCADDCMQAwwgAwwjEAMMIxADDCMQAywikUsn/ xf/C/8H/2P/MCAAIAMQIAMQIAMIIAMQIANgIpFLG/8oIAMUIAMIIAMQIAMIIAMIIAMQIAMMIAMQI AMQIAMoIpFLJ/8X/wv/B/9j/ywgAwwgAwwgAxAgAwggAxAgA2AikUsb/yggAxQgAwggAxAgAwggA wggAxAgAwwgAxAgAxAgAygikUsn/xf/C/8H/2P/LCADDCADDCADECADCCADECADYCKRSxv/KCADF CADCCMYAwggAwgjGAMMIAMQIxgDKCKRSyf/F/8L/wf/Y/8sIxQDDCADECADCCADECADYCKRSxv/K CADFCADCCADHCADCCADICADECADPCKRSyf/F/8L/wf/Y/8oIAMUIAMIIAMMIwgDCCADDCMIAwwgA xAgAxAgAygikUsb/yggAxAgAwwgAxAgAwggAwggAxAgAwwgAxAgAxAgAygikUsn/xf/C/8H/2P/K CADFCADDCMMACADDCMMACADDCADECADECADKCKRSxv/KCMUAxQjEAMMIAMMIxADFCMIAwwjEAMsI pFLJ/8X/wv/B/9j/+QikUsb/6AjUCKRSyf/F/8L/wf/Y//kIpFLG/+gI1AikUsn/xf/C/8H/2P/5 CKRSxv/oCNQIpFLJ/8X/wv/B/9j/+QikUsb/6AjUCKRSyf/F/8L/wf/Y//kIpFLG/+gI1AikUsn/ xf/C/8H/2P/5CKRSxv/oCNQIpFLJ/8X/wv/B/9j/+qRSxv/opNSkpFLJ/8X/wv/B/9f//FLF/+lS 1FLCUsn/xf/C/8H////1/9v/zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/x//D/8L////1 /9v/zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/ 2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N/8f/w//C////9f/b /83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/ zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N /8f/w//C////9f/b/83/x//D/8L////1/9v/zf/H/8P/wv////X/2//N/8f/w//C////9f/b/83/ x//D/8L////1/9v/zf/H/8P/wv8MAAAAgAAAAIAAgIAAAACAgACAAICAwMDAwNzApsrwQCAAYCAA gCAAoCAAwCAA4CAAAEAAIEAAQEAAYEAAgEAAoEAAwEAA4EAAAGAAIGAAQGAAYGAAgGAAoGAAwGAA 4GAAAIAAIIAAQIAAYIAAgIAAoIAAwIAA4IAAAKAAIKAAQKAAYKAAgKAAoKAAwKAA4KAAAMAAIMAA QMAAYMAAgMAAoMAAwMAA4MAAAOAAIOAAQOAAYOAAgOAAoOAAwOAA4OAAAABAIABAQABAYABAgABA oABAwABA4ABAACBAICBAQCBAYCBAgCBAoCBAwCBA4CBAAEBAIEBAQEBAYEBAgEBAoEBAwEBA4EBA AGBAIGBAQGBAYGBAgGBAoGBAwGBA4GBAAIBAIIBAQIBAYIBAgIBAoIBAwIBA4IBAAKBAIKBAQKBA YKBAgKBAoKBAwKBA4KBAAMBAIMBAQMBAYMBAgMBAoMBAwMBA4MBAAOBAIOBAQOBAYOBAgOBAoOBA wOBA4OBAAACAIACAQACAYACAgACAoACAwACA4ACAACCAICCAQCCAYCCAgCCAoCCAwCCA4CCAAECA IECAQECAYECAgECAoECAwECA4ECAAGCAIGCAQGCAYGCAgGCAoGCAwGCA4GCAAICAIICAQICAYICA gICAoICAwICA4ICAAKCAIKCAQKCAYKCAgKCAoKCAwKCA4KCAAMCAIMCAQMCAYMCAgMCAoMCAwMCA 4MCAAOCAIOCAQOCAYOCAgOCAoOCAwOCA4OCAAADAIADAQADAYADAgADAoADAwADA4ADAACDAICDA QCDAYCDAgCDAoCDAwCDA4CDAAEDAIEDAQEDAYEDAgEDAoEDAwEDA4EDAAGDAIGDAQGDAYGDAgGDA oGDAwGDA4GDAAIDAIIDAQIDAYIDAgIDAoIDAwIDA4IDAAKDAIKDAQKDAYKDAgKDAoKDAwKDA4KDA AMDAIMDAQMDAYMDAgMDAoMDA//vwoKCkgICA/wAAAP8A//8AAAD//wD/AP////// --Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ) Content-type: text/html; name=pic17450.pcx Content-transfer-encoding: base64 Content-disposition: attachment; filename=pic17450.pcx Content-description: Internet HTML CgUBCAAAAABEAxACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABRQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/tv+2/7b/tv+2/7b/tv+2/7b/tv+2/7bpttW2yrbFtsO2tv+2/7b/tv+2 /7b/tv+2/7b/tv+2/7b/tum21bbKtsW2w7a2/7b/tv+2/7b/tv+2/7b/tv+2/7b/tv+26bbVtsq2 xbbDtrbCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEBwrb/Af8B/wH/Af8B/wH/ Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B6AHUAcoBxQHD AQHCtv8B/wH/Af8B5QHGtt0BwrbLAcO25QHCtuoBwrbFAci21QHCtsUBwrbXAcW2/wH/Af8B/wHt AdcBywHGAcMBAcK2/wH/Af8B/wHlAcK2wwHCttwBwrbKAcK25AG2wgHCtuoBwrbIAcK22AHCtsUB wrbWAcK2wwHCttABtv8B/wH/Af8B5AHSAckBxQHCAQHCtv8B/wH/Af8B5QHCtsMBwrbcAcK2ygHC tuMBwrbuAcK2yAHCttgBwrbdAcK21AHCtv8B/wH/Af8B5AHSAckBxQHCAQHCtv8B/wH/Af8B5QHC tsMBwrbCAcK2wgHCtsMBwrYBwrbCAcS2xgHCtsIBwrYBwrbCAcS2wgHEtsMBxLYBwrYBw7YBwrbE AcS2wgHEtgHCtsMBxLbDAcK2AcK2yAHEtsMBwrYBwrbEAcK2AcK2yAHCtsQBxLbCAcS2xAHEtsIB wrbCAcK2AcK2wgHCtgHCtsQBwrYBwrbGAcO2xQHCtsMBwrYBxLYBxLbCAcS2wwHCtgHDtgHCtv8B /wH/AfoB3QHPAccBxAHCAcK2/wH/Af8B/wHlAca2wwHCtsIBwrbCAcK2AcO2AcK2wgHCtsUBwrbC AcO2AcK2wgHCtsIBwrbCAcK2wgHCtsMBw7YBw7YBwrbCAbbDAcK2wgHCtsIBwrbCAcK2wgHCtsIB w7YBwrbGAbbDAcK2wgHDtgHCtsIBwrYBw7bIAcK2xAHCtsMBtsMBwrbCAcK2wgHCtgHCtgHCtsIB wrbCAcO2AcK2wgHCtgHDtscBxLbDAcK2wwHEtsIBwrYBwrbCAcK2wgHCtsIBw7YBw7YBwrb/Af8B /wH6Ad0BzgHHAcQBwgHCtv8B/wH/Af8B5QHCtsMBwrbCAcK2wgHCtsIBwrbCAcK2AcO2yAHCtsIB wrbCAcK2wgHCtsIBwrbCAcK2wgHCtsMBwrbCAcK2wgHCtsQBxLbCAcK2wgHCtsIBwrbCAcK2wgHC tsIBwrbIAcS2wgHCtsIBwrbCAcK2wgHCtsgBwrbEAcK2xQHEtsIBwrbFAcS2wwHCtsIBwrbCAcK2 wgHCtsIBwrbIAcS2wwHCtgHCtgHDtsQBwrbCAcK2wgHCtsIBwrbCAcK2wgHCtv8B/wH/AfoB3QHO AccBxAHCAcK2/wH/Af8B/wHlAcK2wwHCtsIBwrbCAcK2wgHCtsIBwrbCAcS2xgHCtsIBwrbCAcK2 wgHCtsIBwrbCAcK2wgHCtsMBwrbCAcK2wgHCtsMBwrYBwrbCAcK2wgHCtsIBwrbCAcK2wgHCtsIB wrbHAcK2AcK2wgHCtsIBwrbCAcK2wgHCtsgBwrbEAcK2xAHCtgHCtsIBwrbFAcS2wwHCtsIBwrbC AcK2wgHCtsIBwrbKAcO2wgHCtgHCtsIBxLbCAcK2wgHGtsIBwrbCAcK2wgHCtv8B/wH/AfoB3QHO AccBxAHCAcK2/wH/Af8B/wHlAcK2wwHCtsIBwrbCAcK2wgHCtsIBwrbEAcO2xQHCtsIBwrbCAcK2 wgHCtsIBwrbCAcK2wgHCtsMBwrbCAcK2wgHCtsIBwrbCAcK2wgHCtsIBwrbCAcK2wgHCtsIBwrbC AcK2xgHCtsIBwrbCAcK2wgHCtsIBwrbCAcK2yAHCtsQBwrbDAcK2wgHCtsIBwrbFAcK2AcK2wgHC tsIBwrbCAcK2wgHCtsIBwrbLAcK2wgHCtgHCtsQBw7YBwrbCAcK2xgHCtsIBwrbCAcK2/wH/Af8B +gHdAc4BxwHEAcIBwrb/Af8B/wH/AeUBwrbDAcK2wgHCtgHDtsIBwrYBw7YBwrbCAcK2xQHCtsIB wrbCAcK2wgHCtsIBwrbCAcK2wgHCtsMBwrbCAcK2wgHCtsIBwrbCAcK2wgHCtsIBwrbCAcK2wgHC tsIBwrbCAcK2xgHCtsIBwrbCAcK2wgHCtsIBwrYBw7bIAcK2xAHCtsMBwrbCAcK2wgHCtsIBwrYB wrYBwrbCAcK2wgHCtsIBwrbCAcK2AcO2xgHCtsMBwrbDAcO2wgHCtsIBwrYBwrbCAcK2wgHCtsIB wrbCAcK2wgHCtv8B/wH/AfoB3QHOAccBxAHCAcK2/wH/Af8B/wHlAca2xAHCtgHCtsMBwrYBwrbC AcS2xgHCtsIBwrbCAcK2wgHCtsMBxLbDAcK2wwHCtsIBwrbCAcK2wwHFtsMBwrYBwrbDAcS2wwHC tsIBwrbHAcW2wgHCtsIBwrbDAcK2AcK2yAHCtsQBwrbEAcW2wwHEtsIBwrbCAcK2AcK2wgHCtsIB wrbDAcK2AcK2xwHFtsQBw7bDAcS2wwHCtsIBxLbDAcK2wgHCtsIBwrb/Af8B/wH6Ad0BzgHHAcQB wgHCtv8B/wH/Af8B+gHCtv8B/wHqAcK20AHDtv8B/wH/Af8B6gHVAcoBxQHDAQHCtv8B/wH/Af8B 9gG2wwHCtv8B/wHmAbbDAcK20AHCtv8B/wH/Af8B6gHVAcsBxQHDAQHCtv8B/wH/Af8B9wHEtv8B /wHoAcS2zwHEtv8B/wH/Af8B6gHVAcsBxQHDAQH/tv+2/7b/tv+2/7b/tv+2/7b/tv+2/7bpttW2 xbbIAcQBwgHDtv8B/wH/Ac8Bwrb/Af8B/wHOAcK2/wH/Af8BzgHCtv8B/wHvAdcBxwG2yAHEAcIB w7b/Af8B/wHPAcK2/wH/Af8BzgHCtv8B/wH/Ac4Bwrb/Af8B7wHXAccBtsgBxAHCAcO2/wH/Af8B zwHCtv8B/wH/Ac4Bwrb/Af8B/wHOAcK2/wH/Ae8B1wHHAbbIAcQBwgHDtv8BxAG2xwG24QG2ygG2 wgG2/wHRAcK2/wHIAbbFAbbCAbbaAbbKAbbCAbb/AdIBwrb/AckBtsYBtu0Btv8BzgHCtv8B1wHE tsQBtv4B3wHPAbbIAcQBwgHDtv8BxAHCtsUBwrbNAbbTAbbKAbbNAbb/AcYBwrb/AccBtgG2xAG2 wgG2xgG20wG2ygG2zQG2/wHHAcK2/wHJAcK2xQG22QG20wG2/wHOAcK2/wHVAcK2xAG2wwG2/gHf Ac8BtsgBxAHCAcO2/wHEAcK2xQHCts0BttMBtsoBts0Btv8BxgHCtv8BxwG2AbbEAbbCAbbGAbbT AbbKAbbNAbb/AccBwrb/AckBtgG2xAG22QG20wG2/wHOAcK2/wHVAbbGAbbCAbb+Ad8BzwG2yAHE AcIBw7b/AcQBtgG2wwG2AbYBtsUBtsQBxLbCAcS2xAHEtsMBtsQBtsUBtsIBtsMBxLbCAcS2/wHE AcK2/wHHAbYBtsQBtsIBtsUBxLbCAcS2xAHEtsMBtsQBtsUBtsIBtsMBxLbCAcS2/wHFAcK2/wHJ AbYBtsQBtsMBxLbCAbbEAbbEAbbEAcS2wgHEtsQBxLbDAbbEAbb/AckBwrb/AdQBtsoBtsMBxLbE AcS2xAHEtvMB2QHJAbbIAcQBwgHDtv8BxAG2AbbDAbYBtgG2xQG2xQG2wwG2xAG2wgG2xAG2wgG2 wwG2xgG2wgG2wgG2xAG2wgG2/wHGAcK2/wHGAbbDAbbDAbbCAbbGAbbDAbbEAbbCAbbEAbbCAbbD AbbGAbbCAbbCAbbEAbbCAbb/AccBwrb/AckBtsIBtsMBtsIBtsQBtgG2wwG2AbbDAbbFAbbDAbbE AbbCAbbEAbbCAbbDAbb/AcoBwrb/AdQBtsoBtsIBtsQBtsIBtsQBtsIBtsQBtvIB2QHJAbbIAcQB wgHDtv8BxAG2AbbDAbYBtsIBtsMBtsYBtsgBtsIBtscBtsIBtscBtsIBtsIBtscBtv8BxgHCtv8B xgG2wwG2wwG2wgG2xgG2yAG2wgG2xwG2wgG2xwG2wgG2wgG2xwG2/wHHAcK2/wHJAbbCAbbDAbbC AbbEAbbCAbbCAbYBtsIBtsYBtsgBtsIBtscBtsIBtv8BywHCtv8B1AG2ygG2wgG2xAG2wgG2xwG2 xAG28gHZAckBtsgBxAHCAcO2/wHEAbbCAbYBtsIBtsIBtsMBtsYBtsUBxLbDAcK2xQG2AbbIAbbC AbbDAcK2xQG2/wHGAcK2/wHFAbbFAbbCAbbCAbbGAbbFAcS2wwHCtsUBtgG2yAG2wgG2wwHCtsUB tv8BxwHCtv8ByQG2wwG2wgG2wgHGtsIBtsIBtgG2wgG2xgG2xQHEtsMBwrbFAbYBtv8BzAHCtv8B 1AG2ygG2wgG2xAG2wwHCtsUBxrbyAdkByQG2yAHEAcIBw7b/AcQBtsIBtgG2wgG2wwG2AbbHAbbE AbbDAbbFAcK2wwHCtgG2xwG2wgG2xQHCtsMBtv8BxgHCtv8BxQHHtsIBtsIBtsYBtsQBtsMBtsUB wrbDAcK2AbbHAbbCAbbFAcK2wwG2/wHHAcK2/wHJAbbEAbYBtsIBtscBtgG2wwG2AbbGAbbEAbbD AbbFAcK2wwHCtgG2/wHLAcK2/wHUAbbKAbbCAbbEAbbFAcK2wwG29QHaAcoBtsgBxAHCAcO2/wHE AbbCAbYBtsIBtsMBtgG2xwG2wwG2xAG2xwG2wgG2wwG2xgG2wgG2xwG2wgG2/wHGAcK2/wHFAbbF AbbCAbbCAbbGAbbDAbbEAbbHAbbCAbbDAbbGAbbCAbbHAbbCAbb/AccBwrb/AckBtsQBtgG2wgG2 xwG2AbbDAbYBtsYBtsMBtsQBtscBtsIBtsMBtv8BygHCtv8B1QG2xgG2wgG2wgG2xAG2xwG2wgG2 9QHaAcoBtsgBxAHCAcO2/wHEAbbDAbbDAbbDAbYBtscBtsMBtsMBwrbCAbbEAbbCAbbDAbbGAbbC AbbCAbbEAbbCAbb/AcYBwrb/AcQBtscBtgG2wgG2xgG2wwG2wwHCtsIBtsQBtsIBtsMBtsYBtsIB tsIBtsQBtsIBtv8BxwHCtv8ByQG2xQHCtsIBtsQBtsMBtsUBtscBtsMBtsMBwrbCAbbEAbbCAbbD Abb/AcoBwrb/AdUBwrbEAbbDAbbCAbbEAbbCAbbEAbbCAbbEAbbyAdkByQG2yAHEAcIBw7b/AcQB tsMBtsMBtsQBtsgBw7bCAcO2AbbDAcS2wwG2xAG2xQG2wgG2wwHEtsMBw7b/AcQBwrb/AcQBtscB tgG2wgG2xgHDtsIBw7YBtsMBxLbDAbbEAbbFAbbCAbbDAcS2wwHDtv8BxQHCtv8ByQG2xgG2wwHE tsQBtsUBtscBw7bCAcO2AbbDAcS2wwG2xAG2/wHJAcK2/wHXAcS2xAG2wwHEtsQBxLbEAcS28wHZ AckBtsgBxAHCAcO2/wHRAbb/AfwBwrb/Af8B/wHOAcK2/wH/Af8BzgHCtv8B/wHvAdcBxwG2yAHE AcIBw7b/AdEBtv8B/AHCtv8B/wH/Ac4Bwrb/Af8B/wHOAcK2/wH/Ae8B1wHHAbbIAcQBwgHDtv8B zwHCtv8B/QHCtv8B/wH/Ac4Bwrb/Af8B/wHOAcK2/wH/Ae8B1wHHAbbIAcQBwgH/tv+2/7b/tv+2 /7b/tv+2/7b/tv+2/7bpttW2xbbIAcQBwgHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHK AcUBwwEBwrb/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B /wH/Af8B/wH/Af8B6AHUAcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUB wwEBwrb/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/ Af8B/wH/Af8B6AHUAcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEB wrb/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/Af8B /wH/Af8B6AHUAcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEBwrb/ Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/Af8B/wH/ Af8B6AHUAcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEBwrb/Af8B /wH/Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B 6AHUAcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEBwrb/Af8B/wH/ Af8B/wH/Af8B/wH/Af8B/wHoAdQBygHFAcMBAcK2/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B6AHU AcoBxQHDAQHCtv8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/AegB1AHKAcUBwwEB/7b/tv+2/7b/tv+2 /7b/tv+2/7b/tv+26bbVtsq2xbbDtrb/tv+2/7b/tv+2/7b/tv+2/7b/tv+2/7bpttW2yrbFtsO2 tv///////////////////////////////+n/1f/K/8X/w//B//////////////////////////// /////+n/1f/K/8X/w//B//+2/7b/tv+2/7b/tv+2/7b/tv+2/7b/tum21bbKtsW2w7a2/7b/tv+2 /7b/tv+2/7b/tv+2/7b/tv+26bbVtsq2xbbDtrb/tv+2/7b/tv+2/7b/tv+2/7b/tv+2/7bpttW2 yrbFtsO2tv+2/7b/tv+2/7b/tv+2/7b/tv+2/7b/tum21bbKtsW2w7a2xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb/////4v+Qxf+Q//// /8//xpDD/8aQxf/EkMf/wpDC/8aQxP/FkMH/yJDC/8WQ2f+Qy/+Q2v+Q1P+Qwv+Qzf+Qxv+Qyv/C kOH/kOL/kOD/kOP/kP/////l/9P/yf/F/8L/wf/Etv/////i/5DF/5D//+T/kOn/wpDD/8KQwv/C kMP/wpDD/8KQwv/CkMb/wpDC/8KQx//CkMP/wpDD/8KQxP/CkMP/wpDY/5Dm/5DJ/5DN/5DN/5DQ /5Df/5Dm/5DU/5DH/5DD/5D0/5D///z/3v/P/8j/xP/C/8S2/////+L/kMX/kP//5P+Q6f/CkMP/ wpDC/8KQw//CkML/wpDE/8KQxf/CkML/wpDG/8KQyf/CkMT/wpDd/5Dm/5DJ/5DN/5DN/5DQ/5Df /5Dm/5DU/5DH/5DD/5D0/5D///z/3v/P/8j/xP/C/8S2/////+L/kMX/kMP/w5DD/5DB/5DC/8OQ x/+Qw/+Qw//DkMP/kMP/kMf/w5DE/8OQw/+Qwf/CkMj/w5DD/5DB/5DC/8OQxP/DkML/w5DD/8OQ x/+Qwf/CkMT/w5DC/5DD/5DD/5DF/8KQw//CkML/wpDD/8KQwv/CkMT/wpDF/8KQwv/CkMb/wpDJ /8KQxP/DkMv/w5DD/5DB/8KQxP/CkMH/kMX/kMP/kMH/kMP/w5DC/5DD/5DD/5DG/8KQwf+Qw//D kML/w5DD/8OQw/+Qwv+Qw//DkMT/wpDB/5DG/5DC/5DB/8KQwv/DkML/w5DD/5DB/5DB/5DB/8KQ wv/CkMT/w5DC/8OQwv+Qw//DkMP/kMH/wpDE/8OQyP/DkMP/kMH/wpDE/8OQw/+Qw/+Qwf/DkMX/ w5DC/5DB/8KQxP/DkMf/kMH/wpDD/5DB/5DC/8OQw/+Qw//DkMT/w5DC/8OQ///8/97/z//H/8T/ wv/Etv/////i/8eQwv+Qw/+Qwv/CkML/kMP/kMb/kMP/kML/kMP/kML/kMP/kMb/kMP/kML/kMP/ kML/wpDC/5DG/5DD/5DC/8KQwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qw/+Qxv/CkML/kML/kMP/kMH/kMP/ kMP/kMX/wpDD/8KQwv/CkMP/wpDC/8KQxP/CkMX/wpDC/8aQwv/CkMn/wpDF/8SQyP+Qw/+Qwv/C kML/kML/kML/wpDF/5DD/5DB/5DC/5DD/5DB/5DD/5DD/5DF/5DC/8KQwv+Qw/+Qwv+Qw/+Qw/+Q wv+Qwv+Qwv+Qw/+Qwv+Qwv/CkMb/kML/wpDC/5DC/5DC/5DD/5DC/8KQwv/CkML/wpDC/5DC/5DD /5DC/5DD/5DC/5DD/5DC/8KQwv+Qwv+Qw/+Qxv+Qw/+Qwv/CkML/kML/kMP/kML/kMP/kML/kMf/ kMP/wpDC/5DC/5DD/5DG/8KQwv+Qwv/CkML/kMP/kML/kML/kMP/kML/kMP/kML/kP///P/e/8// yP/E/8L/xLb/////4v+Qxf+Qwv+Qw/+Qwv+Qw/+Qw/+Qx/+Qwf+Qw/+Qw/+Qwv+Qw/+Qxv+Qyv+Q wv+Qw/+Qxv+Qxv+Qw/+Qw/+Qxv+Qwv+Qw/+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qwf+Qwf+Qwf+Qxv/G kMP/xpDD/8KQxP/CkMX/wpDC/8KQxv/CkMn/wpDG/8SQy/+Qwv+Qw/+Qwv+Qw/+Qxv+Qwf+Qwv+Q wv+Qw/+Qwv+Qwf+Qwf+Qwf+Qxv+Qw/+Qwv+Qw/+Qwv+Qx/+Qwv+Qwv+Qwv+Qw/+Qwv+Qw/+Qxv+Q wv+Qw/+Qwv+Qwv+Qw/+Qwv+Qw/+Qw/+Qw/+Qxv+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qzv+Qwv+Q w/+Qwv+Qw/+Qwv+Qw/+Qwv+Qx/+Qw/+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qw/+Qwv+Qwv+Qw/+Q wv+Qxv+Q///8/97/z//I/8T/wv/Etv/////i/5DF/5DC/8WQwv+Qw//FkMf/kMH/kMP/kMP/kML/ kMP/kMb/kMf/xJDC/5DD/5DG/5DG/5DD/8WQw//EkML/kMP/xZDG/5DD/5DC/8WQwv+Qwf+Qwf+Q wf+Qxv/CkMf/wpDC/8KQw//CkMT/wpDF/8KQwv/CkMb/wpDJ/8KQyP/DkMf/xJDC/5DD/5DC/5DD /5DG/5DB/5DC/5DC/8WQwv+Qwf+Qwf+Qwf+Qxv+Qw/+Qwv/FkML/kMT/xJDC/5DC/5DC/8WQwv+Q w/+Qxv+Qwv+Qw/+Qwv+Qwv+Qw/+Qwv+Qw/+Qw/+Qw/+Qw//EkML/kMP/kML/kMP/kML/kMP/kMP/ w5DI/8SQwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qx/+Qw/+Qw/+Qwv/FkMb/kMP/kML/kMP/kMP/kML/ kML/xZDC/5DG/5D///z/3v/P/8j/xP/C/8S2/////+L/kMX/kML/kMb/kMP/kMv/kMH/kMP/kMP/ kML/kMP/kMb/kMb/kMP/kML/kMP/kMb/kMb/kMP/kMb/kMP/kML/kMP/kMr/kMP/kML/kMb/kMH/ kMH/kMH/kMb/wpDH/8KQw//CkML/wpDE/8KQwf/CkML/wpDC/8KQxv/CkMn/wpDJ/8KQxv+Qw/+Q wv+Qw/+Qwv+Qw/+Qxv+Qwf+Qwv+Qwv+Qxv+Qwf+Qwf+Qwf+Qxv+Qw/+Qwv+Qxv+Qw/+Qw/+Qwv+Q wv+Qwv+Qxv+Qw/+Qxv+Qwv+Qw/+Qwv+Qwv+Qw/+Qwv+Qw/+Qw/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Q w/+Qwv+Qw/+Qxv+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qx/+Qw/+Qw/+Qwv+Qyv+Qw/+Q wv+Qw/+Qw/+Qwv+Qwv+Qxv+Qxv+Q///8/97/z//I/8T/wv/Etv/////i/5DF/5DC/5DD/5DC/5DD /5DD/5DI/5DE/5DD/5DC/5DD/5DG/5DD/5DC/5DC/8KQwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qw/+Qwv+Q wv/CkML/kMP/kMP/kMb/kMP/kML/kMP/kMP/kMP/kMf/wpDH/8KQw//CkMP/wpDC/8KQwv/CkML/ wpDC/8KQx//CkMP/wpDD/8KQxP/CkMP/wpDG/5DC/8KQwv+Qw/+Qwv+Qw/+Qx/+Qw/+Qwv+Qw/+Q w/+Qw/+Qx/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv/CkML/kML/kML/kMP/kML/kMP/kMb/kML/kMP/kML/ kML/kMP/kML/kMP/kMP/kMP/kML/kML/wpDC/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DG/5DC/8KQ wv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qx/+Qw/+Qw/+Qwv+Qw/+Qxv/CkML/kML/kMP/kMP/kML/kML/ kMP/kML/kMP/kML/kP///P/e/8//yP/E/8L/xLb/////4v+Qxf+Qw//DkMP/kMT/w5DJ/5DF/8OQ xP/EkMf/w5DE/8KQwf+Qwv+Qw/+Qx//DkMP/kMT/w5DE/8KQwf+Qwv/CkMP/w5DH/5DD/5DD/8OQ xP+Qw/+Qx//CkMf/wpDE/8KQw//EkMT/xJDD/8aQxP/FkMT/wpDF/8WQyP/CkMH/kML/kMP/kMP/ xJDH/5DD/5DD/8OQxP+Qw/+QyP/EkMP/w5DD/8KQw//CkMH/kML/kML/kMP/w5DE/8SQxv+Qwv+Q w/+Qwv+Qw//DkMP/kMP/kMP/kMP/kMP/wpDB/5DC/8KQwv+Qw//DkMP/kMP/kMP/w5DI/8KQwf+Q wv/EkMT/w5DE/8SQwv/CkMb/wpDC/5DD/5DD/8OQx/+Qwf/CkMP/kMT/w5DD/5DD/8OQxP/DkMP/ wpDC/5D///r/3f/P/8f/xP/C/8S2////////xP+Q////////////////6/+Q0f+Q/////+X/0//J /8X/wv/B/8S2////////xP+Q////////////////6/+Q0f+Q/////+X/0//J/8X/wv/B/8S2//// ////wv/CkP///////////////+z/kM//wpD/////5v/T/8n/xf/C/8H/xLb///////////////// ///////////////n/9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/ wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///j/kMn/kMb/kMT/ kMH/kMf/kM3/kML/kMP/wpDJ/5DB/8WQy/+Q///P/5Dg/5DN/5DV/5Db/5DJ/5DG/5DE/5DB/5DH /5DN/5DC/5DD/8KQyf+Qwf/FkMv/kNz/kML/kMP/wpDB/8KQ9P+Qwv+Q/P+Qxv+Q0f+Q/////+H/ 0f/I/8T/wv/B/8S2///3/5DB/5DI/5DG/5DE/5DB/8KQxf/CkM3/kMX/kMv/kMH/kMT/kMr/kMn/ kP//xf+Q1P+Qx/+Qw/+Q4/+Q2v+Qwf+QyP+Qxv+QxP+Qwf/CkMX/wpDN/5DF/5DL/5DB/5DE/5DK /5DJ/5DS/5DF/5DC/5Db/5DO/5DD/5DK/5DN/5Du/5DU/5DD/5Dm/5D//+3/1//L/8b/w//B/8S2 ///3/5DB/5DI/5DG/5DD/5DC/8KQxf/CkM3/kMX/kMr/kML/kMX/kMn/kMn/kP//xf+Q1P+Qx/+Q w/+Q4/+Q2v+Qwf+QyP+Qxv+Qw/+Qwv/CkMX/wpDN/5DF/5DK/5DC/5DF/5DJ/5DJ/5DS/5DF/5DC /5Db/5DO/5DD/5DK/5DN/5Du/5DU/5DD/5Dm/5D//+3/1//L/8b/w//B/8S2///3/5DB/5DF/8KQ wf+Qw//CkMH/kMP/kML/kMH/kMP/kMH/kMP/w5DE/8KQwf+Qwv+Qwf/DkMH/kMP/kMP/kML/kMX/ kMP/w5DD/5DD/8OQwv/DkMP/w5DH/5DD/5DD/8OQxP/DkMP/kMH/kML/w5DI/8OQw/+Qwf/CkMT/ wpDB/5DH/8OQxP/DkML/w5DF/8OQwv+Qwf/CkMT/w5DD/5DC/5DB/5DF/5DB/5DC/8OQw/+Qw//D kMT/w5DN/5DB/5DF/8KQwf+Qw//CkMH/kMP/kML/kMH/kMP/kMH/kMP/w5DE/8KQwf+Qwv+Qwf/D kMH/kMP/kMP/kML/kMX/kMP/w5DD/5DD/8OQwv/DkMP/w5DI/8KQwf+Qwv+Qwf/GkML/w5DD/5DB /5DC/8OQw/+Qwf/CkML/w5DH/8OQwv/DkMH/w5DC/5DB/5DB/5DC/5DB/8KQw/+Qw/+Qwf/DkMP/ w5DE/8OQx/+Qw/+Qw//DkMT/w5DE/8KQwf+Qxv+Qwv+Qwf/CkMb/w5DC/5DB/8KQxP/DkMj/w5DD /5DD/5DD/8OQwv/DkMP/w5DD/5DB/8KQwv/CkP//5P/S/8n/xf/C/8H/xLb///b/kMP/kMP/kML/ wpDC/5DC/8KQw/+Qwv+Qwf+Qw/+Qwf+Qwv+Qw/+Qwv+Qwv/CkML/kML/kML/kMP/kMP/kML/kMX/ kML/kMP/kML/kML/kMP/kML/kMP/kMP/kMb/kMP/kML/kMP/kML/kMP/kML/wpDC/5DD/5DG/5DD /5DC/8KQwv+Qwv+Qwv/CkMb/kMP/kML/kMP/kML/kMf/kMP/wpDC/5DC/5DD/5DC/5DC/8KQxv/C kML/kMP/kML/kML/kMP/kML/kMP/kMv/kMP/kMP/kML/wpDC/5DC/8KQw/+Qwv+Qwf+Qw/+Qwf+Q wv+Qw/+Qwv+Qwv/CkML/kML/kML/kMP/kMP/kML/kMX/kML/kMP/kML/kML/kMP/kML/kMP/kMP/ kMb/kML/wpDC/5DC/5DC/5DC/5DD/5DC/8KQwv+Qw/+Qwv/CkML/kML/kMf/kMP/kML/kMP/kMP/ wpDC/5DC/8KQwv+Qwv+Qw/+Qwv+Qw/+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qwv/C kMb/kML/wpDC/5DG/5DD/8KQwv+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qw/+Qwv/C kML/wpDC/5D//+T/0v/J/8T/wv/B/8S2///2/5DD/5DD/5DD/5DC/5DD/5DC/5DD/5DC/5DB/5DC /5DC/5DD/5DC/5DD/5DC/5DC/5DD/5DB/5DD/5DD/5DF/5DC/5DD/5DC/5DC/5DD/5DC/5DD/5DD /5DG/5DD/5DC/5DG/5DD/5DC/5DD/5DO/5DC/5DD/5DC/5DD/5DG/5DG/5DD/5DC/5DH/5DD/5DD /5DC/5DD/5DC/5DC/5DH/5DD/5DD/5DC/5DC/5DD/5DC/5DP/5DD/5DD/5DD/5DC/5DD/5DC/5DD /5DC/5DB/5DC/5DC/5DD/5DC/5DD/5DC/5DC/5DD/5DB/5DD/5DD/5DF/5DC/5DD/5DC/5DC/5DD /5DC/5DD/5DD/5DG/5DD/5DC/5DC/5DC/5DC/5DD/5DC/5DD/5DD/5DC/5DD/5DC/5DL/5DC/5DD /5DD/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DD/5DC/5DK/5DD/5DC/5DG/5DD/5DC/5DD/5DG/5DC /5DD/5DG/5DD/5DD/5DC/5DD/5DG/5DH/5DB/5DD/5DG/5DD/5DD/5DC/5DD/5DD/5D//+T/0v/J /8T/wv/B/8S2///1/8eQwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qwf+Qwv+Qwv+Qw/+Qwv+Qw/+Qwv+Q wv+Qw/+Qwf+Qw/+Qw/+Qxf+Qwv/FkML/kML/xZDC/5DD/8WQxv+Qw/+Qw//DkMP/xZDC/5DE/8OQ yP/EkML/kMP/kML/kMP/kMf/w5DD/8WQwv+Qx/+Qw/+Qw/+Qwv/FkML/kML/kMf/kMP/kMP/kML/ kML/xZDD/8OQy//HkML/kMP/kML/kMP/kML/kMP/kML/kMH/kML/kML/kMP/kML/kMP/kML/kML/ kMP/kMH/kMP/kMP/kMX/kML/xZDC/5DC/8WQwv+Qw//FkMb/kMP/kML/kML/kML/kML/xZDC/5DD /8WQwv+Qw/+Qwv+QyP/EkML/kMP/kMP/kMP/kML/kMP/kML/kMP/kML/kMP/xZDD/8OQx/+Qw/+Q w//DkMP/xZDC/5DD/5DG/5DC/5DD/5DG/5DD/5DD/5DC/8WQx//DkMT/kMH/kMT/w5DD/5DD/8WQ wv+Qw/+Qw/+Q///k/9L/yf/E/8L/wf/Etv//9f+Qxf+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qwf+Q wv+Qwv+Qw/+Qwv+Qw/+Qwv+Qwv+Qw/+Qwf+Qw/+Qw/+Qxf+Qwv+Qxv+Qwv+Qxv+Qw/+Qyv+Qw/+Q xv+Qwv+Qxv+Qx/+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qyv+Qwv+Qxv+Qx/+Qw/+Qw/+Qwv+Qxv+Qwv+Q x/+Qw/+Qw/+Qwv+Qwv+Qyv+Qyv+Qxf+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qwf+Qwv+Qwv+Qw/+Q wv+Qw/+Qwv+Qwv+Qw/+Qwf+Qw/+Qw/+Qxf+Qwv+Qxv+Qwv+Qxv+Qw/+Qyv+Qw/+Qwv+Qwv+Qwv+Q wv+Qxv+Qw/+Qxv+Qw/+Qwv+Qx/+Qw/+Qwv+Qw/+Qw/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qyv+Q xv+Qw/+Qxv+Qwv+Qxv+Qw/+Qxv+Qwv+Qw/+Qxv+Qw/+Qw/+Qwv+Qzv+Qw/+Qwf+Qx/+Qwv+Qw/+Q xv+Qw/+Qw/+Q///k/9L/yf/E/8L/wf/Etv//9P+Qx/+Qwf+Qw/+Qwv+Qw/+Qwf+QxP+Qw/+Qw/+Q wv+Qw/+Qwv+Qw/+Qwv+Qwv+QxP+Qw/+QxP+QxP+Qw/+Qw/+Qwv+Qwv+Qw/+Qwv+Qw/+Qw/+Qxv+Q w/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qw/+Qxv+Qwv/CkML/kMP/kML/kMP/kMb/kMP/kML/kMP/kML/ kMf/kMP/kMP/kML/kMP/kML/kML/kMf/kMP/kMP/kML/kML/kMP/kML/kMP/kMn/kMf/kMH/kMP/ kML/kMP/kMH/kMT/kMP/kMP/kML/kMP/kML/kMP/kML/kML/kMT/kMP/kMT/kMT/kMP/kMP/kML/ kML/kMP/kML/kMP/kMP/kMb/kMP/kML/kML/kML/kML/kMP/kML/kMP/kMP/kML/kMP/kML/kMf/ kML/wpDC/5DD/5DD/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DC /5DD/5DC/5DD/5DG/5DC/5DD/5DG/5DD/5DD/5DC/5DD/5DG/5DD/5DE/5DE/5DD/5DC/5DD/5DD /5DC/5DD/5DD/5D//+T/0v/J/8T/wv/B/8S2///0/5DH/5DC/8SQw//EkMH/kMT/kMP/kMP/kMP/ w5DE/8SQwv+Qwv+QxP+Qw/+QxP/FkMX/w5DD/5DD/8OQw//CkMP/w5DI/8SQw//DkMT/w5DD/5DE /8OQyP/CkMH/kML/kMP/kMP/xJDH/8OQxP/DkMP/wpDG/8KQwv+Qw/+Qw//DkMP/kML/kMf/kMT/ w5DD/5DD/8OQxP/DkMP/kMb/kMf/kML/xJDD/8SQwf+QxP+Qw/+Qw/+Qw//DkMT/xJDC/5DC/5DE /5DD/5DE/8WQxf/DkMP/kMP/w5DD/8KQw//DkMj/xJDC/5DC/5DC/5DD/8OQw/+QxP/DkMP/kMP/ kML/wpDH/8KQwf+Qwv/CkML/wpDC/5DD/5DC/8SQxP/EkML/wpDD/8OQxP/DkMj/xJDD/8OQxP/D kMT/xJDG/5DC/5DD/5DG/8KQwv+Qw/+Qw//DkMj/w5DF/5DF/8OQw//CkMP/w5DD/5DD/5DD/5D/ /+T/0v/J/8T/wv/B/8S2//////L/kP//////////xf+Q////////7P+Q///z/9r/zf/G/8P/wv/E tv/////y/5D//////////8X/kP///////+z/kP//8//a/83/xv/D/8L/xLb/////8P/CkP////// ////xP/CkP///////+v/wpD///T/2v/N/8b/w//C/8S2//////////////////////////////// 5//U/8r/xf/C/8H/xLb////////////////////////////////n/9T/yv/F/8L/wf/Etv////// /////////////////////////+f/1P/K/8X/wv/B/8S2////////w//FkO//kND/kNz/wpDa/5Dn /5DK/8OQ1P+Q3v+Q4f+Qwv+Qwv+Qx//DkNr/kN//kM7/kOb/kML/kNT/kP/////x/9j/zP/G/8P/ wv/Etv///////8L/kMX/kMn/kP//0v+Q3P+Q1P+Q0v+Qyf+Q1/+Q2v+Qw/+Q5P+Qwv+Qxv+Qwv+Q 1v+Qw/+Q3/+Qyv+Qw/+Q5v+Q0/+Q//////P/2f/N/8b/w//C/8S2////////wv+Qxf+Qyf+Q///S /5Dc/5DU/5DS/5DJ/5DX/5Da/5DD/5Dk/5DC/5DG/5DC/5DW/5DD/5Df/5DK/5DD/5Dm/5DT/5D/ ////8//Z/83/xv/D/8L/xLb////////C/5DJ/8OQwv/DkMb/kMH/wpDE/8OQw/+Qwf+Qwf+Qwf/C kML/wpDD/5DD/8OQxP/DkMP/kMP/w5DD/5DB/8KQxP/DkMb/w5DC/8OQw/+Qwf+Qxf+Qwf+Qwv/D kMP/kMP/w5DE/8OQxv/DkMP/w5DI/8KQwf+Qw//DkML/w5DB/5DC/5DB/8KQxP/DkMf/kMH/wpDE /8OQwv+Qw/+Qw/+QxP/DkML/kMH/wpDE/8OQw/+Qw/+Qxf+Qw/+Qw/+Qwf+Qwv+Qwv+Qxf/DkMH/ kMP/w5DC/5DD/5DD/5DE/8OQwv+Qwf/CkMP/kMH/kML/w5DD/5DD/5DD/8KQwf+Qwv+Qwf/CkMb/ w5DC/5DB/8KQxP/DkMj/w5DD/5DB/8KQw/+Qwf/CkMP/kML/kMP/w5DE/8OQwv/DkML/kMP/w5DD /5DB/8KQ/////+r/1f/L/8X/w//B/8S2////////w//DkMX/kMP/kML/kMf/wpDC/5DC/5DD/5DC /8KQwv/CkML/wpDC/5DC/5DC/5DD/5DC/5DD/5DC/5DC/5DD/5DC/8KQwv+Qwv+Qw/+Qxv+Qwv+Q w/+Qwv/CkMb/wpDC/5DD/5DC/5DC/5DD/5DC/5DD/5DG/5DD/5DD/5DG/5DC/8KQwv+Qw/+Qwv+Q wv+Qwv/CkML/kML/kMP/kMb/wpDC/5DC/5DD/5DB/5DD/5DD/5DF/5DD/8KQwv+Qwv+Qw/+Qwv+Q w/+Qxf+Qw/+Qw/+Qwf+Qwv+Qwv+Qxv+Qwv+Qwv+Qw/+Qwf+Qw/+Qw/+Qxf+Qw//CkML/kML/wpDC /5DD/5DC/5DD/5DC/5DC/8KQwv/CkML/kMb/kMP/wpDC/5DC/5DD/5DG/5DD/5DC/8KQwv+Qwv/C kML/kML/kML/kML/kMP/kML/kMP/kML/kMP/kML/kMP/kML/wpDC/5D/////6v/V/8r/xf/D/8H/ xLb////////G/8KQw/+Qw/+Qwv+Qx/+Qw/+Qwv+Qw/+Qwv+Qw/+Qw/+Qw/+Qwv+Qwv+Qxv+Qxv+Q wv+Qw/+Qwv+Qw/+Qwv+Qyv+Qwv+Qw/+Qwv+Qx/+Qw/+Qw/+Qwv+Qwv+Qw/+Qwv+Qyv+Qw/+Qw/+Q xv+Qw/+Qwv+Qw/+Qwv+Qwv+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qwf+Qwf+Qwf+Qxv+Q w/+Qw/+Qwv+Qw/+Qw/+Qwf+Qx/+Qwf+Qwf+Qwf+Qwv+Qwv+Qwv+Qxv+Qwv+Qwv+Qw/+Qwv+Qwf+Q wf+Qwf+Qxv+Qw/+Qw/+Qwv+Qw/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qw/+Qwv+Qw/+Q yv+Qwv+Qw/+Qwv+Qw/+Qwv+Qwv+Qwv+Qyv+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Q/////+r/1f/K/8X/ w//B/8S2////////yP+Qwv/FkML/kMf/kMP/kML/xZDC/5DD/5DD/5DD/5DC/5DD/8OQxP/DkMP/ kML/kMP/kML/kMP/kMP/w5DH/5DC/5DD/5DC/5DH/5DD/5DD/5DC/5DC/8WQw//DkMf/kMP/kMP/ kMb/kMP/kML/xZDC/5DC/5DC/5DD/5DC/8WQxv+Qw/+Qwv+Qw/+Qwv+Qwf+Qwf+Qwf+Qxv+Qw/+Q w/+Qwv/FkMP/kMH/kMf/kMH/kMH/kMH/kML/kML/kML/kMb/kML/kML/kMP/kML/kMH/kMH/kMH/ kMb/kMP/kMP/kML/kMP/kMP/kML/kMP/kML/kMP/kML/kMP/kMb/kMP/kMP/kML/xZDH/8SQwv+Q w/+Qwv+Qw/+Qwv+Qwv+Qwv+Qx//EkML/kMP/kML/kMP/kML/kMP/kP/////q/9X/yv/F/8P/wf/E tv///////8L/kMX/kML/kMb/kMf/kMP/kML/kMb/kMP/kMP/kMP/kML/kMb/kMb/kML/kML/kMP/ kML/kMP/kMb/kMb/kML/kMP/kML/kMf/kMP/kMP/kML/kML/kMr/kMb/kMP/kMP/kMb/kMP/kML/ kMb/kML/kML/kMP/kML/kMr/kMP/kML/kMP/kML/kMH/kMH/kMH/kMb/kMP/kMP/kML/kMf/kMH/ kMf/kMH/kMH/kMH/kML/kML/kML/kMb/kML/kML/kMP/kML/kMH/kMH/kMH/kMb/kMP/kMP/kML/ kMP/kMP/kML/kMP/kML/kMP/kML/kMP/kMb/kMP/kMP/kML/kMr/kMP/kML/kMP/kML/kMP/kML/ kML/kML/kMb/kMP/kML/kMP/kML/kMP/kML/kMP/kP/////q/9X/yv/F/8P/wf/Etv///////8L/ kMX/kML/kMP/kML/kMf/wpDC/5DC/5DD/5DC/5DD/5DD/5DD/5DC/5DC/5DD/5DC/5DD/5DC/5DC /5DD/5DC/5DD/5DC/5DD/5DG/5DC/5DD/5DC/5DH/5DD/5DD/5DC/5DC/5DD/5DC/5DD/5DG/5DD /5DD/5DG/5DD/5DC/5DD/5DC/5DC/5DC/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DD/5DD/5DH/5DD /5DD/5DC/5DD/5DE/5DJ/5DD/5DD/5DC/5DC/5DG/5DC/5DC/5DD/5DD/5DD/5DH/5DD/5DD/5DC /5DD/5DD/5DC/5DD/5DC/5DC/8KQwv+Qw/+Qxv+Qw/+Qw/+Qwv+Qw/+Qxv+Qwv/CkML/wpDC/5DC /8KQwv+Qwv+Qwv+Qwv+Qw/+Qwv+Qwv/CkML/kMP/kML/kMP/kML/kMP/kP/////q/9X/yv/F/8P/ wf/Etv///////8P/xZDE/8OQw//CkMb/kMH/wpDE/8OQw/+Qw/+Qw/+Qw/+Qwv+Qw//DkMT/w5DD /5DD/8OQw/+Qw/+Qw//DkMf/kMP/w5DD/5DH/5DE/8OQw/+Qw//DkMT/w5DH/8KQw//DkMj/xJDD /8OQw/+Qwv+Qwv+Qw/+Qw//DkMf/kMP/kMP/w5DE/5DD/5DH/8KQwv+Qw/+Qw//DkMX/kMn/kMP/ kMP/kML/kML/kMb/kML/kMP/w5DE/5DD/5DH/8KQwv+Qw/+Qwv+QxP/DkMT/xJDD/8KQwf+Qwv+Q w/+Qxv/CkML/kMP/kMP/w5DI/8KQwf+Qwv+Qwf/CkMP/kMH/wpDD/5DC/5DD/8OQxP/CkMH/kML/ wpDC/5DD/8OQw/+Qw/+Q/////+r/1f/K/8X/w//B/8S2////////2v+Q////////4v+Q///a/5Dq /5DG/5D////////h/9D/yP/E/8L/wf/Etv///////9r/kP///////+L/kP//1v+Qw/+Q6v+Qxv+Q ////////4f/Q/8j/xP/C/8H/xLb////////a/5D////////g/8KQ///Y/8OQ6/+Qxv+Q//////// 4f/Q/8j/xP/C/8H/xLb////////////////////////////////n/9T/yv/F/8L/wf/Etv////// /////////////////////////+f/1P/K/8X/wv/B/8S2//////////////////////////////// 5//U/8r/xf/C/8H/xLb//83/kNH/kMb/kM3/kO7/kMb/kP//yP+Q1P+Qwv+Q1f/CkMT/kP//zP+Q xv+Q///I/5DK/5DV/5D//97/kMr/x5DQ/5DK/5DY/5DU/5D///T/2v/N/8f/w//C/8S2///N/5DN /5DD/5DU/5DY/5DV/5Dw/5Dd/5DJ/5DN/5DU/5DG/5D8/5DO/5DG/5D//8j/kMr/kNX/kP//xP+Q 2f+Qyv+Q1v+Qyv+Q///a/5DK/5D4/9z/zv/H/8T/wv/Etv//zf+Qzf+Qw/+Q1P+Q2P+Q1f+Q8P+Q 3f+Qyf+Qzf+Q1P+Qxv+Q/P+Qzv+Qxv+Q///I/5DK/5DV/5D//8T/kNn/kMr/kNb/kMr/kP//2v+Q yv+Q+P/c/87/x//E/8L/xLb//83/kML/kMH/wpDG/8OQwv+Qwf/CkMP/kMP/w5DH/5DB/8KQw/+Q w/+Qw//CkMH/kMX/w5DC/5DB/5DC/8OQxP/DkMP/kMP/kML/kML/kMH/wpDE/8KQwf+Qx//DkMP/ kMP/kMP/w5DC/8OQw//DkMP/kMH/wpDC/8KQyP/CkMH/kMP/w5DC/8OQw//DkMP/kML/kMP/w5DI /8OQwv/DkMX/kMH/wpDD/5DD/5DD/8KQwf+Qw//DkMf/kMH/kML/w5DD/5DB/8KQxP/DkMP/kMH/ xJDD/8OQxP/CkMH/kMb/kMH/wpDD/5DD/5DG/5DD/5DD/8OQxP/DkMP/kMH/kML/w5DI/8OQw/+Q wf/CkMT/wpDB/5DH/8KQwf+Qw//DkML/kMP/kML/w5DD/5DD/8OQw/+Qwf/CkMT/w5DD/5DB/5DC /8OQyP/DkMP/kMH/kML/w5DI/8OQwv/DkMP/w5DD/5DB/5DC/8OQxP/CkMH/kMr/kMn/w5DE/8OQ w/+Qwf/CkMf/kMH/wpDD/5DD/5DD/8KQwf+Qxv+Qw//DkMj/wpDB/5DC/5DB/5DD/5DC/8OQw/+Q wf/CkMj/w5DI/8OQwv/DkMP/w5DC/8OQwv+Qw/+Qw//DkPH/2f/M/8b/w//C/8S2///N/5DC/8KQ wv+Qxv+Qw//CkML/kML/kML/kMP/kMb/wpDC/5DC/5DD/5DC/5DC/8KQxv+Qw//CkML/kMP/kML/ kMP/kML/kML/kMP/kML/wpDC/5DC/5DC/8KQxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qw/+Qwv/C kML/wpDC/5DG/5DC/8KQwv+Qw/+Qwv+Qw/+Qw/+Qwv+Qwv+Qwv+Qw/+Qxv+Qw/+Qwv+Qxv/CkML/ kML/kMP/kML/kML/wpDC/5DD/5DG/8KQwv+Qw/+Qwv/CkML/kML/kMP/kML/wpDC/5DD/5DD/5DC /5DC/8KQxv/CkML/kML/kMP/kMb/kMP/kML/kMP/kML/kMP/kML/wpDC/5DD/5DG/5DD/5DC/8KQ wv+Qwv+Qwv/CkMb/kML/wpDC/5DD/5DB/5DD/5DB/5DD/5DC/5DC/5DD/5DC/8KQwv+Qwv+Qw/+Q wv/CkML/kMP/kMb/kMP/kML/wpDC/5DD/5DG/5DD/5DC/5DD/5DD/5DC/8KQwv+Qw/+Qwv+Qwv/C kMr/x5DC/5DD/5DC/5DD/5DC/8KQwv+Qxv/CkML/kML/kMP/kML/kML/wpDG/5DC/5DD/5DG/5DC /8KQwv+Qwf+Qw/+Qwf+Qw/+Qwv/CkML/kMb/kMP/kMb/kMP/kML/kMP/kMP/kML/kMP/kMP/kML/ kMP/kPH/2P/M/8b/w//C/8S2///N/5DC/5DD/5DG/5DD/5DD/5DC/5DC/5DK/5DD/5DC/5DD/5DC /5DD/5DG/5DD/5DH/5DC/5DG/5DB/5DE/5DC/5DD/5DC/5DD/5DG/5DH/5DB/5DD/5DG/5DD/5DD /5DC/5DD/5DD/5DG/5DD/5DC/5DD/5DC/5DH/5DC/5DC/5DC/5DK/5DD/5DC/5DG/5DD/5DC/5DD /5DC/5DD/5DC/5DK/5DD/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DD/5DD/5DC/5DD/5DG/5DD/5DD /5DB/5DH/5DD/5DC/5DG/5DD/5DC/5DD/5DO/5DC/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DC/5DB /5DC/5DD/5DC/5DC/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DO/5DC/5DD/5DD/5DG/5DG/5DD/5DD /5DC/5DD/5DD/5DC/5DD/5DK/5DM/5DC/5DG/5DD/5DG/5DD/5DC/5DD/5DC/5DD/5DG/5DC/5DK /5DD/5DC/5DC/5DB/5DC/5DD/5DC/5DD/5DK/5DG/5DG/5DH/5DC/5DD/5DD/5DC/5Dz/9n/zf/G /8P/wv/Etv//zf+Qwv+Qw/+Qxv+Qw/+Qw/+Qwv+Qw//DkMf/kMP/kML/kMP/kML/kMP/kMb/kMP/ kMT/xJDC/5DG/8OQxP+Qwv+Qw/+Qwv+Qw/+Qx//DkMT/kMH/kMT/w5DD/5DD/8WQwv+Qw/+Qw/+Q xv+Qw/+Qwv/FkML/kMT/xJDC/5DC/5DD/8OQx/+Qw/+Qwv+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qw//D kMf/kMP/xZDC/5DD/5DC/5DD/5DC/5DD/5DD/8WQwv+Qw/+Qxv+Qw/+Qw/+Qwf+Qx/+Qw/+Qw//D kMP/xZDC/5DE/8OQyP/EkML/kMP/kML/kMP/kMb/kMP/kML/xZDC/5DB/5DC/8WQwv+Qwv+Qw/+Q wv+Qw/+Qwv/FkML/kMT/w5DI/8SQwv+Qw//FkMf/w5DD/5DD/5DD/5DC/5DD/8WQwv+Qw/+Qyv+Q yf/EkML/kMb/kMP/kMb/kMP/kML/kMP/kML/kMP/kMb/kMP/w5DH/5DD/5DC/5DC/5DB/5DC/8WQ wv+Qw/+Qx//EkMf/w5DD/5DE/8SQwv+Qw/+Qw/+Qw//DkPH/2f/M/8b/w//C/8S2///N/5DC/5DD /5DG/5DD/5DD/5DC/5DG/5DG/5DD/5DC/5DD/5DC/5DD/5DG/5DD/5DD/5DD/5DC/5DG/5DC/5DD /5DC/5DD/5DC/5DD/5DK/5DD/5DB/5DH/5DC/5DD/5DG/5DD/5DD/5DG/5DD/5DC/5DG/5DD/5DD /5DC/5DC/5DG/5DG/5DD/5DC/5DG/5DD/5DC/5DD/5DC/5DD/5DG/5DG/5DD/5DG/5DD/5DC/5DD /5DC/5DD/5DD/5DG/5DD/5DG/5DD/5DD/5DB/5DH/5DD/5DG/5DC/5DG/5DH/5DG/5DD/5DC/5DD /5DC/5DD/5DG/5DD/5DC/5DG/5DB/5DC/5DG/5DC/5DD/5DC/5DD/5DC/5DG/5DH/5DG/5DD/5DC /5DD/5DO/5DC/5DD/5DD/5DC/5DD/5DG/5DD/5DK/5DI/5DD/5DC/5DG/5DD/5DG/5DD/5DC/5DD /5DC/5DD/5DG/5DG/5DG/5DD/5DC/5DC/5DB/5DC/5DG/5DD/5DG/5DD/5DK/5DC/5DD/5DD/5DC /5DD/5DD/5DG/5Dx/9j/zP/G/8P/wv/Etv//zf+Qwv+Qw/+Qxv+Qw/+Qw/+Qwv+Qwv+Qw/+Qxv+Q w/+Qwv+Qw/+Qwv+Qwv/CkMb/kMP/kMP/kML/wpDC/5DD/5DC/5DC/5DD/5DC/5DD/5DC/5DC/8KQ xv+Qw/+QxP+QxP+Qw/+Qwv+Qw/+Qw/+Qwv+Qw/+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv/CkML/ kML/kML/kMP/kMb/kMP/kML/kMb/kMP/kML/kMP/kML/kML/wpDC/5DD/5DG/5DD/5DD/5DC/8KQ wv+Qwv+Qw/+Qwv+Qw/+Qw/+Qw/+Qwv+Qw/+Qxv+Qw/+QxP+QyP+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Q w/+Qw/+Qxv+Qwv/CkML/kMP/kML/kMP/kMb/kMP/kML/kMP/kMP/kMP/kMP/kML/kML/kMP/kML/ wpDC/5DC/5DD/5DC/5DD/5DD/5DG/5DC/8KQwv+Qw/+Qw/+Qxv+Qw/+Qwv+Qw/+Qw/+Qwv+Qw/+Q w/+Qwv+Qw/+Qyv+QyP+Qwv/CkML/kMP/kML/kMP/kMb/kMP/kML/kMP/kML/kML/wpDG/5DC/5DD /5DG/5DC/8KQwv+Qw/+Qw/+Qw/+Qwv+Qw/+Qxv+Qwv/CkMb/kMP/kML/kMP/kML/wpDC/5DD/5DD /5DC/5DD/5Dx/9j/zP/G/8P/wv/Etv//zf+Qwv+Qw/+Qxv/CkML/kMP/kML/kMP/w5DH/8SQxP/E kMP/wpDB/5DG/8KQwv+QxP/CkMH/kMP/w5DD/5DD/5DC/5DC/5DD/5DD/8KQwf+Qx//DkMX/kMX/ w5DD/8KQw//DkMP/kMP/kMP/kMf/xJDD/8OQw//CkMP/wpDB/5DC/5DC/5DD/8OQyP/DkMP/kMb/ xJDE/8SQw//CkMH/kMP/w5DH/5DE/8OQw/+Qwf/CkMT/w5DD/5DD/8KQw//DkMT/xJDG/8SQxf+Q yf/EkMP/w5DE/8OQw/+QxP/DkMj/wpDB/5DC/5DD/5DD/8SQx//EkMP/w5DE/5DE/8OQw/+Qw//D kMP/kMH/wpDE/8OQw/+QxP/DkMj/wpDB/5DC/5DE/8OQyP/DkMP/wpDD/8OQw/+QxP/DkMT/xJDC /5DH/8eQw//CkMH/kMP/w5DD/5DD/5DG/8SQxP/EkMP/wpDB/5DG/5DD/8OQyP/CkMH/kML/kMP/ kMT/w5DD/5DD/5DH/8KQwf+Qx//DkMP/wpDD/8KQwf+Qwv/CkMP/xJDD/8OQxP+Q7//X/8z/xv/D /8H/xLb/////x/+Q8f+Qz/+Q///w/5DY/5Dw/5D//+r/kP/////U/5DY/5D//83/kO//1//M/8b/ w//B/8S2/////8P/kMP/kO3/kMP/kM//kP//7P+Qw/+Q2P+Q8P+Q///q/5D/////0P+Qw/+Q1P+Q w/+Q///N/5Dv/9f/zP/G/8P/wf/Etv/////E/8OQ7//DkM7/wpD//+7/w5DZ/5Du/8KQ///r/5D/ ////0f/DkNb/w5D///b/2//O/8f/w//C/8S2////////////////////////////////5//U/8r/ xf/C/8H/xLb////////////////////////////////n/9T/yv/F/8L/wf/Etv////////////// /////////////////+f/1P/K/8X/wv/B/8S2////////7P+Qxv+Qzf+Q///B/5DN/5Dm/5DC/5DG /5DK/5Dj/5DR/5DY/5DS/5DU/5Dj/5DQ/5DT/5DG/5D/////+v/d/87/x//E/8L/xLb////////s /5DU/5DU/5Dr/5DJ/5Dm/5DG/5DJ/5Dr/5DR/5DY/5Dn/5Dj/5DQ/5DC/5DT/5DD/5D/////+v/d /87/x//E/8L/xLb////////s/5DU/5DU/5Dr/5DJ/5Dm/5DG/5DJ/5Dr/5DR/5DY/5Dn/5Dj/5DQ /5DC/5DT/5DD/5D/////+v/d/87/x//E/8L/xLb////////b/8OQw/+Qwf/CkMT/wpDB/5DG/5DD /8OQx/+Qw/+Qw//DkMP/kMH/wpDC/8OQx//DkMP/kMH/wpDH/5DD/5DC/5DB/8KQxP/CkMH/kMP/ w5DC/8OQwv+Qwv+Qwf/CkMT/wpDB/5DG/5DD/5DC/5DB/8KQwv/DkML/kML/kMb/kMH/w5DG/5DD /8OQx/+Qwf/CkML/wpDE/8OQw/+Qwf+Qwf+Qw/+Qw//DkMT/wpDB/5DH/8OQxP/DkMf/kMH/wpDE /8OQwv+Qw/+Qwf+Qwv+Qwf/CkMT/wpDB/5DG/5DB/8KQxP/DkMT/w5DD/5DB/8KQyP/CkMH/kMP/ w5DE/8OQw/+Qwf/DkMX/kMP/kMP/kMH/kMH/w5DC/5DB/8KQ//////j/3P/O/8f/xP/C/8S2//// ////2v+Qw/+Qwv/CkML/kML/kML/wpDG/5DC/5DD/5DG/5DC/5DD/5DD/5DC/8KQwv+Qwv+Qx/+Q w/+Qwv/CkML/kMb/kMP/kML/wpDC/5DC/5DC/8KQwv+Qw/+Qwv+Qw/+Qwv/CkML/kML/kML/wpDG /5DD/5DC/8KQwv+Qwv+Qw/+Qwv+Qxv+Qwv+Qx/+Qwv+Qw/+Qxv/CkML/wpDC/5DC/5DD/5DC/8KQ wv+Qwv+Qw/+Qw/+Qwv+Qwv/CkMb/kMP/kML/kMP/kMb/wpDC/5DC/5DD/5DB/5DD/5DB/5DC/8KQ wv+Qwv+Qwv/CkMb/wpDC/5DC/5DD/5DC/5DD/5DC/8KQwv+Qxv+Qwv/CkML/kMP/kML/kMP/kML/ kML/kMb/kMP/kMP/kMH/kML/kMP/wpDC/5D/////+P/c/87/x//D/8L/xLb////////e/5DC/5DD /5DC/5DD/5DG/5DC/5DK/5DB/5DE/5DD/5DC/5DD/5DC/5DH/5DD/5DC/5DD/5DG/5DD/5DC/5DD /5DC/5DD/5DG/5DC/5DD/5DC/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DC/5DD/5DC/5DG/5DC/5DH /5DC/5DK/5DD/5DD/5DG/5DC/5DD/5DB/5DE/5DD/5DC/5DD/5DK/5DC/5DK/5DD/5DG/5DC/5DB /5DC/5DC/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DG/5DD/5DC/5DD/5DG/5DC /5DC/5DH/5DB/5DB/5DB/5DC/5DC/5DD/5DD/5D/////+P/c/87/x//D/8L/xLb////////b/8SQ wv+Qw/+Qwv+Qw/+Qxv+Qw//DkMf/w5DE/8WQwv+Qw/+Qwv+Qx/+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Q w/+Qwv+Qw/+Qw//EkML/kMP/kML/kMP/kML/kMP/kMb/kMP/kML/kMP/kML/kMP/kML/kMb/kML/ kMf/kMP/w5DH/5DD/5DD/5DD/8SQwv+Qw//DkMT/xZDC/5DD/5DH/8SQw//DkMf/kMP/kMP/xJDC /5DB/5DC/5DC/5DD/5DC/5DD/5DG/5DD/5DC/8WQwv/FkML/kMP/kMb/kMP/kML/xZDD/8SQwv+Q wv+Qx/+Qwf+Qwf+Qwf+Qwv+Qwv+Qw/+Qw/+Q//////j/3P/O/8f/w//C/8S2////////2v+Qw/+Q wv+Qw/+Qwv+Qw/+Qxv+Qxv+Qxv+Qwv+Qw/+Qxv+Qw/+Qwv+Qx/+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Q w/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qxv+Q wv+Qx/+Qxv+Qxv+Qw/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qxv+Qw/+Qxv+Qxv+Qw/+Q wv+Qw/+Qwv+Qwf+Qwv+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qxv+Qxv+Qw/+Qxv+Qw/+Qwv+Qxv+Q w/+Qwv+Qwv+Qx/+Qwf+Qwf+Qwf+Qwv+Qwv+Qw/+Qw/+Q//////j/3P/O/8f/w//C/8S2//////// 2v+Qwv/CkML/kMP/kML/kMP/kMb/kML/kMP/kMb/kML/kMP/kMP/kML/wpDC/5DC/5DH/5DD/5DC /5DD/5DG/5DD/5DC/8KQwv+Qwv+Qw/+Qwv+Qwv/CkML/kMP/kML/kMP/kML/kML/wpDG/5DD/5DC /5DD/5DC/5DD/5DC/5DG/5DC/5DH/5DC/5DD/5DG/5DD/5DD/5DC/5DC/8KQwv+Qw/+Qwv+Qw/+Q w/+Qwv+Qw/+Qxv+Qwv/CkML/kMP/kMb/kMP/kML/kML/wpDD/5DD/5DC/5DD/5DC/5DC/8KQxv+Q w/+Qwv+Qw/+Qwv+Qw/+Qwv+Qw/+Qxv+Qw/+Qwv+Qw/+Qwv+Qwv/CkML/kML/kMj/kMP/kMP/kML/ kMP/kMP/kP/////4/9z/zv/H/8P/wv/Etv///////9v/wpDB/5DC/5DD/5DD/8SQxv+Qw//DkMf/ kMP/kMP/w5DD/5DB/8KQw//CkMf/w5DD/5DD/5DH/8SQwv+Qwf/CkMT/xJDD/8KQwf+Qwv/CkML/ kML/kMP/kMP/wpDB/5DH/8SQwv+Qw/+Qwv/CkML/kML/kMb/kML/wpDG/5DD/8OQx/+Qw/+Qw/+Q w//CkMH/kML/kMP/kMP/kMP/w5DE/8SQx//CkMH/kMP/w5DH/5DD/5DD/8KQwf+Qw/+Qw/+Qwv+Q w/+Qw//CkMH/kMb/xJDE/8OQxP/DkMP/kMP/kMf/xJDD/8OQxP/CkMH/kML/kML/wpDH/5DD/5DD /5DC/8KQwv+Qw/+Qwv+Q//////b/2//O/8f/w//C/8S2///////////Q/5Dn/5Dm/5D/////3/+Q ///////////m/9P/yv/F/8L/wf/Etv//////////0P+Q5/+Q4v+Qw/+Q/////9v/kMP/kP////// ////5v/T/8r/xf/C/8H/xLb//////////9D/kOf/kOP/w5D/////3f/DkP//////////5//T/8r/ xf/C/8H/xLb////////////////////////////////n/9T/yv/F/8L/wf/Etv////////////// /////////////////+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/ xf/C/8H/xLb////////h/5DK/5Dm/5D6/5DK/5D//9f/kP3/wpDd/5D////////9/9//z//I/8T/ wv/Etv///////+H/kML/kO7/kMb/kM7/kM7/kNX/kMr/kPX/kOD/kO3/kM7/kN//kPv/kP////// /9//0P/I/8T/wv/Etv///////+H/kML/kO7/kMb/kM7/kM7/kNX/kMr/kPX/kOD/kO3/kM7/kN// kPv/kP///////9//0P/I/8T/wv/Etv///////+H/kMH/w5DG/5DD/8OQx/+Qw/+Qw//DkMT/w5DE /8KQwf+Qxf/DkMP/w5DG/8OQw//DkMb/w5DC/5DB/5DC/8OQxP/DkMP/kMP/kMb/kMH/wpDD/5DD /5DD/8KQwf+Qxv+Qwf+Qwv/DkMP/kMH/wpDE/8OQw/+Qwf/EkMP/w5DI/8OQw/+Qwf/CkMT/wpDB /5DG/5DB/5DC/8OQxP/CkMH/kML/kMP/kMP/w5DE/8OQwv/DkMP/w5DG/8OQwv/DkMP/kMH/kMb/ w5DD/5DB/8KQw/+Qwf/CkMT/w5DD/5DB/8KQxP/DkMT/w5DD/5DB/8KQwv/CkMT/w5DD/5DB/8KQ wv/DkMP/w5D/////+//e/8//x//E/8L/xLb////////h/5DC/5DH/5DC/5DD/5DG/5DD/5DC/5DD /5DC/5DD/5DC/5DC/8KQxv+Qw/+Qw/+Qxv+Qw/+Qw/+Qxv+Qw//CkML/kMP/kML/kMP/kML/kML/ kMf/wpDC/5DC/5DD/5DC/5DC/8KQxv/CkML/kMP/kML/wpDC/5DC/5DD/5DC/8KQwv+Qw/+Qw/+Q xv+Qw/+Qwv/CkML/kML/kML/wpDG/8KQwv+Qw/+Qwv+Qwv/CkML/kMP/kML/kMP/kML/kMP/kML/ kMP/kMP/kMb/kML/kMP/kML/wpDG/5DD/5DC/8KQwv+Qwv/CkML/kML/kMP/kML/wpDC/5DC/5DD /5DC/5DD/5DC/8KQwv/CkML/kML/kMP/kML/wpDC/5DC/5DD/5DD/5D/////+//d/8//x//E/8L/ xLb////////h/5DC/5DH/5DC/5DK/5DD/5DC/5DG/5DD/5DC/5DD/5DG/5DD/5DD/5DG/5DD/5DD /5DG/5DD/5DH/5DC/5DG/5DB/5DI/5DD/5DC/5DD/5DC/5DD/5DG/5DD/5DD/5DC/5DD/5DC/5DD /5DC/5DD/5DD/5DO/5DC/5DD/5DC/5DD/5DG/5DD/5DD/5DC/5DD/5DC/5DD/5DC/5DD/5DC/5DG /5DD/5DK/5DC/5DD/5DC/5DH/5DD/5DC/5DD/5DC/5DD/5DG/5DC/5DD/5DC/5DG/5DD/5DC/5DD /5DD/5DC/5DD/5DC/5DD/5DC/5DD/5D//////f/e/8//yP/E/8L/xLb////////h/5DC/5DH/5DD /8OQx/+Qw/+Qw//DkMP/xZDC/5DD/5DG/5DD/5DD/5DG/5DD/5DD/5DG/5DD/5DE/8SQwv+Qxv/D kMj/kMP/kML/kMP/kML/kMP/kMb/kMP/xZDC/5DD/5DC/5DD/5DC/5DD/5DE/8OQyP/EkML/kMP/ kML/kMP/kMb/kMP/xZDC/5DD/5DC/5DD/5DC/8WQw//DkMP/kMT/w5DH/5DC/5DD/5DC/5DH/8WQ wv+Qw/+Qwv+Qw/+Qw//EkML/kMP/kML/kMb/xZDC/5DD/5DD/5DC/8WQwv+Qw/+Qwv+QxP/DkP// ///7/97/z//H/8T/wv/Etv///////+H/kML/kMf/kMb/kMb/kMP/kMb/kML/kMb/kMP/kMb/kMP/ kMP/kMb/kMP/kMP/kMb/kMP/kMP/kMP/kML/kMb/kML/kMf/kMP/kML/kMP/kML/kMP/kMb/kMP/ kMb/kMP/kML/kMP/kML/kMP/kMf/kMb/kMP/kML/kMP/kML/kMP/kMb/kMP/kMb/kMP/kML/kMP/ kML/kMr/kML/kMf/kMb/kML/kMP/kML/kMf/kMb/kMP/kML/kMP/kML/kMP/kML/kMP/kML/kMb/ kMb/kMP/kMP/kML/kMb/kMP/kML/kMf/kP/////7/93/z//H/8T/wv/Etv///////+H/kML/kMf/ kML/kMP/kMb/kMP/kML/kMP/kML/kMP/kML/kMP/kMb/kMP/kMP/kMb/kMP/kMP/kMb/kMP/kMP/ kML/wpDC/5DD/5DC/5DC/5DH/5DD/5DC/5DD/5DC/5DC/8KQxv+Qw/+Qw/+Qwv/CkML/kML/kMP/ kML/kMP/kMP/kMP/kMb/kML/wpDC/5DD/5DC/5DD/5DG/5DD/5DD/5DC/5DC/8KQwv+Qw/+Qwv+Q w/+Qwv+Qw/+Qwv+Qw/+Qw/+Qxv+Qwv+Qw/+Qwv+Qx/+Qw/+Qwv+Qw/+Qwv+Qw/+Qwv+Qwv/CkML/ kMP/kML/kMP/kML/kMP/kML/kMP/kMP/kML/kMP/kML/kMP/kML/kMP/kMP/kP/////7/93/z//H /8T/wv/Etv///////+H/kML/wpDG/5DD/8OQyP/EkMP/w5DE/8OQxP/EkMb/wpDD/8OQx//CkMP/ w5DH/8KQwv+QxP/CkMH/kMP/w5DD/5DD/5DG/8SQxP/EkMP/wpDB/5DG/5DE/8OQw/+Qwf/CkMT/ w5DD/5DD/8KQw//DkMj/wpDB/5DC/5DD/5DD/8SQxv+QxP/DkMT/wpDB/5DD/8SQw//DkMT/w5DD /8KQw//DkMf/kMP/w5DD/5DI/8OQw/+Qw/+Qwv+Qw/+Qw//CkMH/kML/kMP/kMP/w5DE/8OQw/+Q w/+Qw/+Qw//DkMP/kMP/kML/wpDD/8OQw/+Q//////n/3f/O/8f/xP/C/8S2/////////////+3/ kNH/kP//yf+Q/////////////+L/0f/I/8T/wv/B/8S2/////////////+n/kMP/kNH/kP//yf+Q /////////////+L/0f/I/8T/wv/B/8S2/////////////+r/w5DS/5D//8n/kP/////////////i /9H/yP/E/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////////////////////n /9T/yv/F/8L/wf/Etv///////////////////////////////+f/1P/K/8X/wv/B/8S2//////// ////////////////////////5//U/8r/xf/C/8H/xLb////////////////9/8X2y//B9tD/wvb/ //////////b/2//O/8f/w//C/8S2/////////////////v/E9sP/wfbF/8P2zP/D9v////////// +P/c/87/x//D/8L/xLb//////////////////9v/xPb///////////f/3P/O/8f/w//C/8S2//// ///////////////b/8b2///////////2/9v/zv/H/8P/wv/Etv//////////0//B9v////////// /////////f/e/8//yP/E/8L/xLb////////////////////////////////n/9T/yv/F/8L/wf/E tv////////////////v/wfbE/8L2wv/C9tT/yfbB/8H2wf/C9v//////////8v/Z/83/xv/D/8L/ xLb//////////9P/wvb6/8H2///1/8X2/////////////+H/0f/I/8T/wv/B/8S2///////////P /8P27f/D9sn/wfbD/8H2wv/N9v//6f/C9sz/wvb///////////r/3f/O/8f/xP/C/8S2//////// ///P/8L27//C9sX/xPbB/8H2yv/H9v//1//D9sj/xfbB/8P2yP/B9sP/xPbE/8r2///////////y /9n/zf/G/8P/wv/Etv//////////zP/B9vr/w/bC/8H2z//B9sv/wvb//8f/xPbM/8j2x//E9sH/ wfb///////////v/3f/P/8f/xP/C/8S2///////////a/8H23//F9sf/xPbK/8r2xf/C9sT/wvbB /8H2///T/8L2w//C9sf/yfbE/8n22f/D9v//////////5v/T/8n/xf/C/8H/xLb////////3/8P2 wf/B9sz/w/bI/8H2w//E9tv/wfbD/8H2wf/C9sT/zPbB/872wv/B9sH/xfbC/8P2x//C9sP/wvbJ /8L2zP/C9s3/wvbO/8L2wv/D9sT/zPbC/832wv/N9sL/xvbC/8L2xf/C9sL/wfb//////////+j/ 1P/K/8X/wv/B/8S2////////9//D9sH/wfbK/8T2y//G9sL/wvbE/8H2wv/E9sn/y/bE/8z2wv/N 9sL/y/bI/8L25//B9sL/xfbL/8H2xP/T9sL/zvbB/8z2xP/F9sn/wvbg/8L2////////+P/c/87/ x//D/8L/xLb////////3/8X2yv/D9sz/xvbC/8P2xv/D9sz/xPbB/8T2w//M9sP/zfbC/8v2xP/H 9sL/wfbG/8X2yf/G9sn/zfbF/8L2zP/K9sP/3PbC/8b2yv/D9sH/wfba/8T2////////+P/c/87/ x//D/8L/xLb////////2/8f2x//F9sz/1PbK/9/2wgjH9gjP9sL/1vbK/8H2zf/M9sT/yPbC/8H2 w//f9sII0vbK/8P2wf/B9sv/w/b//////////+D/0P/I/8T/wv/B/8S2////////9v/H9sb/x/bJ /9b2yf/g9sIIzfbCCM72zf/C9sP/xPbG/8P2w//B9sf/yPbI/+32CNH2zP/D9v//////////6P/U /8r/xf/D/8H/xLb////////1/8j2xP/H9sz/1vbI/8T2wv/69sH/wfbL/8L2wv/G9sH/yvbG/9L2 w//I9sH/7PbB/8X2x//B9sT/w/b//////////+j/1P/K/8X/w//B/8S2////////9f/B9sL/xfbD /8b20///9sL2CMP2xQjf9tj/yPbB/8H2zP/G9sT/z/bMCMP2wgjR9sX/wvbD/9v2/////////P/e /8//yP/E/8L/xLb////////4/8X2wv/H9sL/wvbC/8H2xv/E9sL/wvbC/8b2wv/E9sL/wfbH/+z2 wwjB9sMIz/bB/8L2wv/G9tf/xvbU/9r2wwjE9gjU9sH/wvbD/8H2wf/I9sH/y/b//////////+P/ 0v/J/8T/wv/B/8S2////////9f/C9sL/xfbC/8X2wv/C9sP/wfbF/9L20v/S9gjB9gjC9gjI9gkI CQjY9sH/wfbG/8H22f/E9sL/wfbY/8H2wv/J9sH/6vbC/8L2wv/C9sL/wfbB/8H2wv8Iwfb///// /////+f/1P/K/8X/wv/B/8S2////////9f/K9sH/xfbG/8L2wf/F9sH/z/bO/8P2wf/T9gjB9sII w/bCCAnCCMH2wggJCAnHCAkIwfbECMr2wf/Q9sH/xfbC/+D2wv/R9sMIxPYIwvbDCMH2xwjB9sMI w/YI0PbB/8L2wv/D9sP/xPYIwfbB/8H2///////////m/9P/yf/F/8L/wf/Etv////////P/wfbB /9D2wv/H9sH/wvbC/9T2yf/Y9gnF9gnB9gnB9ggJwfYJCML2wggJwvbDCcL2CQje9tD/yPbE/8P2 wf/B9s//2PbDCAnF9gjG9sIIzvbG/8L2wv/E9sH/CMH2///////////n/9P/yv/F/8L/wf/Etv// //////P/wfbC/832wv/J9sL/wfbC/9T2xP/B9sP/w/bB/872xAjB9sIICcIIwwnCCAkICcIICQfF CQjHCccI0/bC/872wv/B9sL/1/bB/9f2wgjB9gjB9sUICcT2wgjB9gjB9sIICcIIwfYI2fbB/8L2 wf8Iwvb//////////+b/0//K/8X/wv/B/8S2////////8v/C9sL/2fbB/8T2xP/L9sj/wfbC/8P2 xP/R9gnB9gjB9gnDCMMJxPbKCcP2wgnECAkIwfYI3vbE/8X2w//T9sT/z/bHCAkIwgnECMIJxgjC CcMIwfbCCMb2wgjN9sH/xfbC/8X2wf/B9sL/wfb//////////+T/0v/J/8T/wv/B/8S2//////// 8f/D9sL/3PbG/8r2xv/E9sL/wvbF/832wv8ICQgJCMP2CQjF9soJxvbDCcL2CcT2w//L9sf/xPbC /8H2x//K9sX/yPbH/8r2xP/J9gnC9sL/zPbE/8v2w//N9sH/wfbC/8T2wf/C9v//////////5f/S /8n/xf/C/8H/xLb////////w/8T2wv/b9sb/yvbG/8X2wf/C9sX/yvYIxPYICQcJwfbCCQfDCcL2 xAnHB8kJCAnGCMb2CNf2w//M9sT/yvbE/8H2wf/K9sP/zfbB/8T2CcQICcIICcH/xfYICcIICcX2 wf/S9sH/x/bK/8H2///////////f/9D/yP/E/8L/xLb////////w/8T2wv/Y9sH/w/bD/8z2wv/M 9sT/zfbB/8H2CQjKCcH2xgnEB8QJwvbFCQfDCcMICcf2CMf2wf/O9sL/zvbB/832wv/J9sIIxfbF CML2CMMJw/bCCAkIwgfECQfCCcH2xQkICcYIw/YIy/bC/8f2wgjD9sH/wfbE/8X2y//C9v////// //j/3P/O/8f/xP/C/8S2////////9v/H9gjT9sL/z/bB/8z2w//F9gjJ9sIJwfbCCcIIxQnD9sQJ wgfHCcL2xAkHxwnH9sIIx/bC/8z2w//O9sH/zPbD/832wv/B9sUIxPYIxPbCCQjHCcX2CcH2wwkH CAnC9gjB9gjN9sP/yPYHwfbB/8P2w//G9sH/w/bI/8L2////////+P/c/87/x//D/8L/xLb///// ///3/9v2wf/c9sL/xfbCCMP2xAgJCMIJxAfMCcP1ygnE9cIHxgkICQgHCQgHwgjI9sIIwvbDCNv2 wgjN9sIIyfbECAkHCQgJwggJCAkIwgkHCQfICcH2xgkHxwjF9sQIxvbB/8j2B8T2w//H9sH/w/bF /8b2////////9//c/87/x//D/8L/xLb////////3//72wwjC9gjB9sMJwvbFCQjMCcL1B8oJB8sJ wwgJCMIJCMT2wgjD9sUI2fbFCNL2xQjB9sUIwwkICQjB9gjECcQHyAnB9sYJB8QICcT2xAjM9sII xPYHCNL2w//G9v////////j/3P/O/8f/w//C/8S2////////9//L9gj39sQICcH2wgnGB8sJB8wJ B80JxQgJyvYI+vbFCAnE9gjVCQgJwgcJBwgJwggJCMIJwgcIzPbDCMP2CAfT9sL/xfb////////4 /9z/zv/H/8T/wv/Etv////////b///bG9gjC9sQJB+UJwwfECQcJwgfCCMIJyAjC9sQI1PbCCNv2 CcMICQfhCcH2CMUJwvYJwwjN9sIIxPYH2fb////////5/9z/zv/H/8T/wv/Etv////////X/y/bC CPn2wgnCCML27QkIwwnE9gnC9sMI//bCCcL2CQjECQjVCQjCCQgJCAkIwfbCCdH2wgjE9sII1/bD /8L2////////9//b/87/x//D/8L/xLb////////0/8z2CPf2wwjDCQj0Ccz2wgjS9sIIyfbFCM72 wggJwvbCCcL2CcH2zgnB9tYJwfYJwfYJCMIJz/YIB8T2wgjV9v////////r/3f/P/8f/xP/C/8S2 ////////8//J9gj89sIIwwkI9QnECAnECAkICQgJwwgJ6vbCCMH2wggJwgjB9gkI5gkIwwnC9sUI yfYIwvYHCMP2wgjb9sH/wfb////////2/9v/zv/H/8P/wv/Etv////////L/x/YI/vbDCcIIwwnF B9gJyvXMCQjDCQjCCcIICfn2CcL2wgnB9s8JxgcJwfUJB9IJwgfLCMT2CAfE9sII2fb////////4 /9z/zv/H/8P/wv/Etv////////L/x/YI/fbCCcIIwwnFBwnCB8T1B8H1Ccv1wu3O9cUJwgfGCQgJ CMIJxAjDCQgJwfYJyQjF9sMIx/bLCMv2CAkIwgkIyQkHxwnCB8UJB8L1CQcJwgcJwgfCCQfECQjC CQgHCcQHyAjB9gjC9sIIw/bCB9v2////////9//b/87/x//D/8L/xLb////////v/8H2wv/E9sUI 8vbJCMMJCMIJwfb2CQjGCQjB9sgJwgjE9gjE9gnDCML2CAnECMIJwwjM9sIIxPYICcT2wgnB9tgJ wgfCCQfCCQfLCcIIwgnFCML2CcL2CMT2wgfE9gcI2fb////////3/9z/zv/H/8P/wv/Etv////// /+z/wfbC/8H2wf/F9sIIx/YIwfYI6vbDCMf2wwgJCAkIwwnB9gnC9usJwvbCCcIIwgkIxAnJ9sMJ yPYJxPbDCAnJ9gjI9sH/x/YJyPbMCcL2ygnCB9MJyQgJwgjE9ggHCMP2wgfQ9sH/wfbD/8P2//// ////+P/c/87/x//D/8L/xLb////////s/8H2wv/B9sH/xPbDCMb2wgjj9sL/zPbB/8X2CMIJwgjE CcT2ywnC9s4JwfbLCcH1xQnHB84J0PYJwgjC9sL/zPbB/8H2wf/C9sMIBwkICcIICcL2wgkIwgnC B8YJxPbLCcP2zAnD9ggJxgjCCcIIxfbCCAfC9gjCB9D2xv/D9sH/wfb////////2/9v/zv/H/8P/ wv/Etv///////+z/wfbB/8H2wf/F9sQIwfYIwvbDCPf2xAjECcP23AnB9s4JwfbNCcT2yAkHCcII wvYIwgnCCAkIwgnCCMX2wwgJxQgJCMP2xgjC9sQJw/bMCcL2xQkHxQkHwgnB9s0Jw/bLCMb2wgjC B8IIwfYIwfUIz/bC/8H2w//F9v////////b/2//O/8f/w//C/8S2////////6f/C9sH/wfbB/8H2 wf/F9scIwfbDCNj2wgjO9sIIwfYIx/bECAnDB8MJw/bFCcP1xQnB9s4JwfbOCcL2zQnC9sgJCMMJ xPbFCQgJwfYJCAnD9sQJCMIJCMIJwgjH9sMICQjG9gkIywnB9sQJwwfFCQcIwvYIwwkHyAnC9sIJ CMMHwwjH9gjB9sMIwgfDCMIHz/bC/8f2wf/B9v////////b/2//O/8f/w//C/8S2////////6P/H 9sH/wfYIwvbICMH2wwjY9sMIyfbGCMj2CMH2wgjDB8UJCML2xQnC9cwJwfXNCcH1we3B9cwJBwnC B8YJwvbFCQfDCcn2xQjB9sIJCAnC9gjCCQgJwgjG9sH/wfbHCMH2CMH2CAnC9sUJwgfKCcMHwfUH xQkHCcH2xAkHwfXHCQjB9sMJCMMHwwgJCMT2xwgHCML2wgfC9sMIwfbCCMf2wv/H9sH/wfb///// ///2/9v/zv/H/8P/wv/Etv///////+f/yvYIwvbICMH2wgjE9gjT9sQIyPbHCMj2wgjCCcIHCAnC CMMJwfbFCcL1zAnD7csJwvXC7cH1yQnB9cIHwfXCB9kJCMMHwwkICcIIwfYICQjDCQfCCcQICcH2 CMIJwgjCCQgJCMcJxgfJCQcJxAfDCQfICQfICcH2CQcJxQcIx/bECAfDCAcIwfYIB8L2xgjH9sH/ yfbB/8P2////////9f/a/83/x//D/8L/xLb////////n/832ywjE9sII0PbFCML2CML2CML2yAjB 9gjG9sQIxgkIxAnCB8H1we3B9dkJwvXD7cH1xQnB9cMJxfUJB94JCMYJwgjCBwnCCMIJwgjCCQjB 9sMIxQkIwfbHCcUHyAkIwwfB9cIHCQjCCQfHCcL1xwnDCAnGBwgJwgjE9ggHCMIHCMH2CAfDCAcI wfYIwfbFCNP2xf/C9v////////L/2f/M/8b/w//C/8S2////////4v/B9sP/zfbHCMH2CMIHCMT2 CAcIzvbHCMH2CML2CML2yQjG9sIIwgfECMIHCQjDCQfC9cLtwfXLCcL1zAnB9cPtwfXDCcj1wu3C 9cIHwwnEBwnDB8kJwvYIxQkIwgnB9sIJCAkIyAnB9gnF9gkICcQICcIIwwkICccHwgnCB8IJBwnH B8UJB8IJB8L1wgcJB8kJxAcJwgjDCcMIwvbFCMH2CMH2B8IIwfbCB8L2xAjR9sH/wvbG/8H2//// ////8v/Z/83/xv/D/8L/xLb////////i/8L2wf/K9sIIwvbFCMT2CAcIxfbCCM321gjC9sUIwvbF CAnCCAfCCMMJB8H1B88JwfXNCcP1Ccv1wu3D9cgHwwkHzAkICQjCCQjFCcMIwwnCB8MJBwkIxgkH CQgJxAjCCcMICcsHw/XF7cH1yAfCCMYHygnDB8MJwwgJxQgHxQjB9gjCB8IIB8L2CMH2wgjB9gjP 9sH/wvb////////2/9v/zf/H/8P/wv/Etv///////+H/wvbD/8n2CMP2xAjC9sYIxvbCCM72xAjC 9sIIwvYIwvbGCMP2xQjC9sIICcUICcMHw/XiCcL1ye3B9cLtyvXDBwkH6QnCCMIJwggJCAnHCMUH wfXF7cv3xe3B9cgHywkHCQjFCQjCCQcIwwnDCML2CMIHxAjB9gjR9sH/w/b////////3/9v/zv/H /8P/wv/Etv///////+H/0fbDCAfECMIHwwjG9sIIz/bVCML2wwjFBwkHCcIIwgnCB+UJz+3H9cHt wfXC7cL1ygnB9sIJwfbCCQjCCQjQCcH2wwnC9sIJwfYIxAnECMQHwfXT7cv3we3GB8wJCMIJwwgJ wfYJwwjCCcIIwfYIwfYIB8MIB8MIwfbB/9T2////////9v/b/83/x//D/8L/xLb////////g/9H2 wggHCMIHCMMHxgjF9sIIyvbHCNQHwgjKBwkICQflCcH1w+3C7NXtwvXKCcIHxQkHwwkH1QnDBwgJ wggJwgjDB8b10wfC7cH3we3H98HtwfXDB8IJwgcJCAnDB8kJwfbECcMICQjEBwjCBwjCB8wIwfbF CMX2////////9f/b/83/x//D/8L/xLb////////e/9P2CMIHCMcHCMn2wgfI9soI0wfKCMQHCcMH 4gnB9cPtw+zB99XtwfUH5wkIxAnFCMUHwfXJBwnCCAnEBwjEB8Htxfekm8RSwpujxKTB98H1wwcI wwcJwgjCCQjMCQcIxAcIB8HtCMIHwfYIwfbFCML2CML2CMj2////////9v/b/83/x//D/8L/xLb/ ///////d/9P2wgjKBwjJ9ggHCMX22wjB9gjB9sIIwfbGCAnCCAfCCN8Jw/XDCcP1wu3B7MHkwuzI 7cP1y+3B9ecJxAjB9gjFB8L1yAfCCMQJwgcIxQfB7aSbwpqjw/fC7cL1xO3C96SbwlLCm8HtwfXF B8MICcIIwwkIwgkIwwnDCMIHCMIHwfbB98IHwe3CCML2CNP2////////9f/a/83/x//D/8L/xLb/ ///////d/9X2CMgHwgjD9gjF9gjCBwjE9gjC9gjB9scIB9AIwvYIwfYIwvbICOYJwvXC7cLsweTC 7MftxPXH7cLswe3B9c0JB8IJB8QJB8gJwgfDCcMHCcIIwgfCCMkHCAkICcIHwwkIwwkICQgJwgfB 7cH3wqTB98Ht0QfB7cL3pMObpMH3wfXCB8UIxAkIxQnGCMIHCMH1wgfB9cj2wf/P9v////////X/ 2v/N/8f/w//C/8S2////////3f/T9sMIwwcIxQcIyvbDCMP2wgjB9sUIwvbECAcIxwfFCML2wwjH 9sIICcIIwgkH5QnB7cHsw+TB98Hswu3C9cUHxfXE7cHswu3B9dwJwfbJCcYIxwfCCMIJBwkICQgJ B8IJB8IJwgcJB8HtwffB7cH1BwnIB8cJxwfB9cHtw/fEpMH3B8kICcP2wwgHCMH2CMMHwfcIwe0H wwjDB8QIz/b////////0/9r/zf/G/8P/wv/Etv///////93/0/bCCMoHCML2CMv2yAjF9ggHxAjD B8IIwvYIwwfGCAfDCMH2wwjGCQfCCcL24AnB7cHswuTB98PtwfXCB8IICcIHxfXD7cHsw+3B9csJ xvbLCcP2CQjCCcIICcMIwfYIxgfECMQJwvbCCMQJBwkIB8H3o8H3BwnC9sQJwgfD9cIJw/bCCcsH wfXB7cH3wqTCm6TB7QcICcIIxPYICcoHwfcIxgfGCAfN9v////////T/2v/N/8f/w//C/8S2//// ////3f/U9sIIxwfB9wcIzfbCCMH2xQjE9sIIxAfFCMP2zAjD9scIBwnCBwnC9uAJwfXB7cHswuTB 98LtwfXCB8MIwwfF9cjtwfUH2QnB9sIJ0gfECMQJw/YICcIHCMIHCcHto6TB9cH2wf/ECcMHwgnC B8H1wgnB9sUJB8UJB8QIwgfE7cH3m6TB9wcIw/bDCAkHCcMHwwjCB8H3B8MIB8UIwfbB/8H2wfUH zPb////////0/9r/zf/H/8P/wv/Etv///////93/1PYIygcIyfbCCMH2yAjD9sQIxQfCCAcIwvbF CAfGCMT2xAgHwggJwgfCCcH21AnC9cUJwfXECcH1wu3C5KTB5MHtwfXCBwnDCMgHwvXC7cH1wu3B 9QkHwvXNCcH1CQfLCcUHwgnIB8IIwgkIxQnC9sIJBwnC9QkHw+0HCcH2xQnC9cMJwvXCCcH2xgnC 9ckJxAfD7cH1wffDpMIHxAjDBwgJwfbCCMH2CAfB7cH1xAjF9gjC9sIHCMr2w//D9v////////L/ 2f/M/8b/w//C/8S2////////3P/V9ssHCMH2wgjG9swIwvbDCMQHxgjB9sIIxQcIwvbDCMP2wwjE B8IIxAnB9sUJwvXMCcH1wu3B9cgJwfXB7cLsw6TB5MHtwwcICQjLB8L1B8L1wgkHwu3B9cYJwfbF CQcJB8wJwwcJCAnGB8IIwgcJBwjFCcH2wgnGB8LtwgfECcIHCcL1we3B9QkHygnC9coJxwfE9QfC pMH3yAcJwgjB9gjC9QfICMT2B8H1zPbC/8b2////////8P/Y/8z/xv/D/8L/xLb////////c/9X2 BwjHBwjCB8T2CMP2CMH2ywjB9sIIyAfECMH2wwjDB8MIx/bECMIHwggJwwfDCQfCCcH1wu3KCcHt wfXB7cLswfXICcLtwezB5MOkwffB7cIJBwkICcQHwe3CBwnLB8H1we3B9csJwfXC7cH1yAkHxPXG B8L1wgfCCMMHygnDB8HtB8HtpMHtwgfGCcP1we3B9cIJw/XECcT1wu3B9coJBwnDBwjDB8H1we3C B8H3pMH3we3DB8cIB8LtBwjCB8IIwfYIw/YIB8HtCMf2wv/C9sL/xvb////////w/9j/zP/G/8P/ wv/Etv///////9n/2PbCBwjCB8H1wgfCCAcIxPYIxPbOCMkHxgjEB8MIyfbCCMMHCAnDB8QJwgfD 9csJxe3C9cYJwfXB7cLsweTEpMH1wgjCB8IJxAfB9cwHCcIHzAnE9ckJwfXC7cH1xgfB9cHtBwjC CcQHygnCB8HtB8H3pMHtwgfGCcb1xAnB9cQJwfXD7cL1yQnF9QfECcIHwvXB7cH1B8HtwqTC98IH CMH2wwgHwfXB98YHxAjB9ggHwe0IyfbF/8X2////////8P/Y/8z/xv/D/8L/xLb////////Z/9j2 wgfCCAfB7cIHwggHCMH2xAjC9tAIygfFCMQHwwjI9sMIB8QIBwnCB8MJB8T1ygnG7cH1xAnB9cIJ wu3C7MHkw6TB9wfB9ggHwgnKBwnGBwgJwgfaCcQHwgnDB8HtwfXCBwkHCQfMCcMHwe2kwfcHCQfG CcX1xQnB9cQJxfXJCcT1wgkHxgnDB8LtwfUHwffEpMHtBwjB9ggHCAfB7cIHxPfCB8IIwwfCCMX2 wf/D9sP/wfbE/8L2////////8P/Y/8z/xv/D/8H/xLb////////Z/9j2wgfC9sMHCMH2wgcIxPYI xPbOCMsHxAjCB8QIwvYIxfbJCAcIwgkIwgkHzgnB9cLtwfXHCcH1CcH1wu3D7MLkwffB7QjB9sIH wgnGB8T1xu0HCAnB9cHtwfXPCcL1yQkHwfUHwgkHwfXB7cH1wgfCCMYJwwfGCcIHwfXC98IHyQnC 9cYJB8H1xAnE9coJB8H1BwkHxAnCBwnCCMQHwe3B9cIHwffEpMHtwgjDB8H1wvesxPfB9QcIwwfB 9gjH9sH/x/bD/8H2////////8P/Y/8z/xv/D/8H/xLb////////Z/9j2wgcIxvYHwfXCCMH2xAjC 9tAIB8IIxgfKCM32xQgJCN8JxPXD7cLspMHkwe0JwfbKB8H1wu3B9cbtB8L2CcH10QnB9cgJxgfB 9cLtwgcI0AnDB8LtwfUH0QnD9dIJB80JCMUHwvXDB8H3w6TC96TM98LtB8H/wfYIyfbE/8H2//// ////8v/Z/8z/xv/D/8L/xLb////////Z/9j2wgcIxvbCBwjC9sMIxvbMCMkHzAjB9gjK9scI2wnJ 9cLtwuzC5MHtwgjCB8j1B8b1wu3B9QfC9t8JwwfC7cMH0wkHwu3B9cIH0QnC9dEJwvXNCQfDCcMH w/XB7QfB7cH3w6TB9wfB9cr3we3B9wfB9gjK9sH/wvb////////z/9n/zf/G/8P/wv/Etv////// /9n/2PbCBwjG9ggHCML2wwjB9tIIyAfMCM72wwgHCQcJCNwJxfXC7cHswe3C98H1CQjE7cL1B8L1 B8H1wu3B9cbtB8L2CQfbCQgJB8H1we3B9cUH0gnC7cMH0gnC9eMJBwkHwgjCB8H1xAfB98PtB8P3 rML3B8X3BwjC9gjC9gcIxPbDCML2////////8v/Z/8z/xv/D/8L/xLb////////Z/9f2CMIHCMb2 CMIHCMH2xAjC9tMIxQfJCNP2wwjCCcII3AnE9cLtwezD98H1wvbB9cHtw/XFB8f1w+0HwvYHwfXZ CQfCCcIHwu3EB9MJwfXB5MH1wwfSCcL10QnC9dIJwgfDCMIHwe3CB8PtwgfB9wcIwfXC9wfC98Ht wffB7cL3BwjB9gjDBwjC9gjCBwjD9sP/wfb////////v/9j/zP/G/8P/wf/Etv///////9n/1/YI wgcIxvYIwgfC9sQIwfbPCMIHwgjGB8kI1PbDCN8JxPXD7cLkwffB7cL2wfXB7cH1wu3C9cHtxvUH w/XC7QfB/8H2B8H12QkHwwnB9cLtwfUHCcIH0gnB7cHkxAfSCcL10QnC9dEJBwkHxQjDB8L3we3C B8H3wgfC9cHtxPcHwe3B98MHwgjIBwjD9gjD9v////////D/2P/M/8b/w//B/8S2////////2f/X 9sMHx/YIwgcIwfbECMH2zwjFBwjFB8cI1fbECAfCCMQJxAfMCcP1xAnC9QnB9cLtwezD98HtwfYI xu3C9cPtxPXE7cIHwvYHwvXbCQfB9cHtwfUHwgnCB88JBwgHweQHCQfC9dIJwvXQCcL10QnCB8IJ CAfFCAfC98LtwgfC9cIHwfXE9wfB98HtwgcIwfYIxwcIwfbB/8H2wf/B9gjB9sL/wfb////////v /9f/zP/G/8P/wf/Etv///////9v/1fbCCMj2CMIHxwjF9tAIxQfFCNf2xQgJwgjFCcQH0QnC9cMJ wfXB7cL3weTB7cIJxe3B9cIHw+3C9cbtBwjC/wfB9cQJwfXE7cP1wgnG9cgJwfXD7cH1B8P1wgfN CQcJB8H3CMMJwfXSCcT1zgnB9dIJwgjCCQfCCMIHwwgHwe3B98IHwfXC7QgHwffB7cL3we3B7sH3 zQfCCMH2wf/D9sIIwfbE/8H2////////7f/W/8v/xv/D/8H/xLb////////b/9v2wv/C9gjCBwjB 9sQIxvbKCMP2wwjEB8QI0fbC/8b2xQjE9gjCCQcJxAfMCcX1xQnB9cHtwvfB7cL2w+3B9QfB9QfB 9cjtwvfB9QcIwv8JB8MJwfXB7cT1xAnH9cgJwfXB7cH3we3C9cIHwvXOCQfCCcHtwfbCCQfTCcP1 zwnB9csJBwnCBwjFCcYIwgfB7cL3pMH3wfXD9wfB9cH3wgfB9wfB7QfB980HwgjB9sP/wvYIwvb/ ///////u/9f/zP/G/8P/wf/Etv///////9r/2vbD/8P2B8H3BwjB9sMIxvbCCAfHCML2xAjFB8QI 2fbFCMP2wwgJB8MJB8QJwfbFCcH1wwnD9cQJw/XB7cH3we3B9cL2we3B98HtwfUHwfXE7cH3x+3C 9QfC/wnB9cMJwvXICcT1xwnB9sMJwfXC7cH1xQfNCQfECcHtxAnB9dEJxPXCCcH2zAnB9ccJBwkH wwnDCML2xQjCB8LtwvfCB8KkwfeswfcHwffB7cP3B8IIB8HtzwfCCML2w//B9gjC9v///////+7/ 1//L/8b/w//B/8S2////////2f/b9sH/xfYIwgcIw/YIxPbECAfHCMH2wgjGB8UIx/bCCM72CMP2 wwjD9sIICcQHwgnCB8gJwu3B9cIJw/XDCcH1w+3B7MH3wu3C9sL3we3CB8PtwvekwffG7cL1B8L/ wfXC7cH1xAnB9dEJwfbCCQfB9cLtwfUH1AnB9gfB7cMJwfXB7cH1zAnC9cIJxPUJwfbFCcP1xAnB 9cYJBwkHCQcJCAfCCMH2CMIHwggHwfXC7cH3wfXCB8IIwvfCpML3wgfD99MHxAjJ9v///////+3/ 1//L/8b/w//B/8S2////////2f/g9sQIwvbECML2xAjCB8cIwfYIxwfGCMP2CML2wgjO9gjC9sQI w/bDCMQHyQnB9QnB9cLtwfXCCcL1xAnC9cLtwvfC7cL2wvfB7cH1wu3D98HkpMLsxe3DB8H/wfbB 7cPswe3CCcL1wwnC9cIJwvXKCQfB9cHtwffC7QfJCQfC9cHtwfXGCcH2B8HtBwnB9cPtwfXKCcH1 wu3CCcP1xQnD9cLtwfXECcH1xAnDB8H1BwnCBwjDBwjEB8PtwfXCB8QIwfYHw/ekwffCB8P3wwfB 9cH3zgfGCMP2wf/E9v///////+3/1v/L/8b/w//B/8S2////////2f/f9gjDBwjC9sMIwvbECMMH yQjIB8IIwwcIwfbDCMH2CNL2CMH2wgjC9sMIxQfECQfECcL1w+3B9cgJwvXC7cL3we3B9cL2wvfD 7cL3weTDpMH3xe3B9cMHwf/B9sHtwuzC7cT1wwnB9cbtyAnC9cLtwvfB7cT1xAfE9cHtwfXICQfB 7cIHwfXD7cH1yAnB9QnB9cLtwwnD9cQJw/XC7cH1xAnB9cUJB8P1xwcIB8T3wfUHCMQHCMMHwfek wfekpcX3wgcIB8H1ywfCCAfFCMH2CMH2wf/B9sH/w/b////////t/9b/y//G/8P/wf/Etv////// /9n/3fbDCAfCCMH2CML2wwjB9sMIwwfKCMgHywjV9sMIwfbCCMYHwgkHCcIHwgnB9cXtwfXDCcL1 wwnD7cHswu3B9QfB9sH/xe3C98OkwffG7cH1wwfC/8LtwfXJCcL1wu3C9cQJwfXECcL1xe0HxwnE 9csJwffB7cL1wu3B9cgJwfXB7cH1w+3DCcP1wwnB9cTtwvXECcL1wgkHw/UHwfXEB8HtwfXB7cH3 wqTB98YHCMYHwfekyPfB7QcIzQfLCMH2w//D9sP/xPb////////p/9T/yv/F/8P/wf/Etv////// /9v/2/bECMP2yQjEB8oIxwfMCNb2CML2wgjKB8IJBwnB9cLtwvXCCcX1wgnB9cbtwgfC9sTtxvfE 7cT1wwfB/8H2wu3B9ckJwfXC7cL1ygnE9cLtwfUHxwkHw/XLCcHtwezD9cIJwfXHCcH1wu3D9cMJ wvXECcH1w+3C9cQJwvXCBwnCB8H1xQfB7cH1wfejpKPB98HtxQcIyQfB7cP3pMX3B8H2CMgHCMMH wggHxwjB9gjB9sT/xvb////////q/9X/yv/F/8P/wf/Etv///////9v/2vbDCML2wgjB9tgIwwfI CMP2wwjb9sgIxAfCCcIHw/UHwgnCB8L1wgnC9cTtwvXCCcH/wfbF7cL3xu3E9QnB9cIHwv/D9ckJ xfXKCcT1w+3B9cIHxgnB9QfMCcH1wezB9cMJwvXHCcT1xQnC9cQJxfXGCQfDCcYHwqTC98KkwffV B8HtxvfCBwjLBwjC9ggHyAjD9sX/w/b////////q/9X/yv/F/8P/wf/Etv///////9v/3fYIxvbE CMH20QgHygji9sYIxQfDCQfFCQfDCcf1xgnB/8H2wvXC7cH1w+3D9cHtxPUHw/UHwv/C9c4JwvXM CcL1w+3CB8UJB88Jwu3B9cIJwvXPCcP10AnCB8IJxAfB9cKbpML3we3HB8H1we3B9cYHCMcHxffB 7QcIxQcIwgcIB8H2xAgHyQjD9sX/wfb////////q/9X/y//F/8P/wf/Etv///////9v/4PYIw/bD CMH23Ajm9sYIxgnEB9IJwf/B9s4HwfUHCcL1BwnC/8P1zQnD9csJwvXD7cH1xgkH0AnB7cH1wgnD 9c4JxPXTCcQHwe2kwffB9cUHwfXC7cH1we3B9cMHwwjCB8IIwgcIxAfD98MHwfbCBwjEB8MIwfYI xgcIB8UIxPb////////t/9b/y//G/8P/wf/Etv///////9v/3/YIw/bFCMH2wwjC9tUI5fbCCMH2 xwgJwgfDCcQHzAnB9cMJwvbJB8IIwgcJB8IJB8MJwf/B9sP1zwnB9cwJwvXD7cH1B8QJB9AJwvXC CcP1zgnD9ccJwfXHCQfDCcwHwu3D98LtwfXCB8kIB8IIygcIBwjC9sIHCAfB9gjHB8UIwfbDCMP2 ////////7P/W/8v/xv/D/8H/xLb////////b/+T2xAjC9tkI5fYIwvbHCMUHCcQHCQfCCcL1ygnC 9s4HxwnC9gnC9c8JxPXECcH1xQnC9cLtwfXbCcL1zgnD9c4JwgcJzAfB7cX3we3GB8QIwgfCCMIH CMIHCMcHwfYIwgcIxAcIyQfECMH2xQjD9v///////+v/1v/L/8X/w//B/8S2////////2//k9sMI wfbMCMT2yAjt9sYIwgcJyQfHCcL1xQkIzgfHCcH2wgnB9dAJxvXCCcH1xgnB9cPtwfUH2gnB9c4J w/UJwvXDCcL1xAnRB8L3we0HwfXB7cH1xgcICcIIxgfFCMUHwffB9cII0QfFCMH2wwjD9sH/w/b/ ///////p/9X/yv/F/8P/wf/Etv///////9v/3PbECMT2wwjB9s0Iw/bCCMP2xQjC9sMI0/bB/8/2 yQjMB8kJwfXFCcsHCMIHwggHxgnD9dAJxfXKCcH1w+3C9dgJw/XNCcb1xAnD9dMHwe3B9csHCQgJ wgjGB8UIxAfC98HtxQcIBwjHBwjCB8IIwvbHCMb2////////6f/U/8r/xf/D/8H/xLb////////b /+P2xAjI9sIIzPbFCNT2xP/U9ssIxgfOCcUHxQjDB8MIwgfHCcH10gnB9cHtw/XKCcP1wu3B9dcJ w/XNCcX1xwnB9QfCCcMHwfXCB8IJwgfG9ccHCMYHwgnDCMIHCMIHxQgHCMIHwvfB7QfC9wfB98H1 B8IIBwjEB8IIwgfDCMH2xwjG9v///////+j/1P/K/8X/w//B/8S2////////3P/i9sUI2PYIzvbB /8P2wf/B9sb/1PbFCMT2CMUHzwnFB8IIwfbCCMkH2QnB9cLtwvXCCcL2yAnD9dEJwfbHCcT1ywnE 9coJxAfB9cIHCMIJwgfB9cTtwvXEB8QIxQcICQgJCMH2wgjEB8UIBwjCB8H3wgfD9wfB7QfB9sYH wfYIBwjB9sIIwfbHCMf2////////6P/U/8r/xf/C/8H/xLb////////c/9n2wf/F9gjD9sIIyfYI 4PbO/8f2wf/J9sMIxfbCCMUHxQnB9sgJwfXEB8QIyQfC9ccJwfXICcH2yAnC9cHtwvXOCcH1xwnC 9ccJwfbICcL1zgnD9ccJwvUHCcIHwvUHwwkHwfXG7cL1wgcIxwfB9cIHwgkICcL2CMIJBwkHxQgH wwjFB8H3B8HtBwgHCMH2wgcIwvYIxfbICMP2wv/B9v///////+j/1P/K/8X/wv/B/8S2//////// 2//f9sIIxPYIx/bDCM72CNH2zv/C9sH/w/bC/8r2wgjD9sMIyAfICcLtwgnB9cQHwgjEB8PtwwfC 9QfDCcH1wgnB9cHtwfXLCcH1wu3B9cIJw/XHCcL1zQnB9cHtwfXGCcH2xQnH9cgJwu3B9cIJwfXB 7cH1xAnD9cLtwfUJB8P1B8IJwfXD7cH3wu3B9cgHwvXE7cH1wgfDCML2xwfECAfDCMH1yAfB7QcI wfbDBwjB9ggHCML2ywjF9v///////+f/1P/K/8X/wv/B/8S2////////2//f9sIIw/bCCMf2wwjN 9sII0fbR/8P2wv/K9gjE9sMIxQcJB8kJwe3B7MH1CcH1yQfE98Ltw/UHwgnC9QnB7cHswu3KCcL1 wu3B9cMJwvXECcH1CcH1wu3B9cYJwfbFCcLtwfXGCcH2wgnB9QnB9cLtxvXECcL1we3C7MH1wgnB 9cHtxQnD9cLtxvUHCQfC7cLsweTB7MHtxgcJB8L1w+3B98HtwvUHCAkIwvYIwgfB9cQHxgjNB8H3 wgfB9QjC9gfOCMX2////////5//U/8r/xf/C/8H/xLb////////b/9/2wgjE9gjH9sMI3/bS/8P2 wf/M9gjD9sIIxgcJBwkHxAnB9QnB7cLswfUJwfXHB8HtxPfB7cL1wu3C9cIJwvUJwe3C7MH1yQnC 9cPtwfXCCcT1wgnB9cXtwfXKCcH1xO3JCcH1xO3B9cIJwvXECcH1w+3C7MH1wgnB9cHtwfXDCcH1 xe3G9QfB9cLtwvfB7MHkwezB7cH1B8H1we3C9QfB9cjtwfXCBwkIwfbCCAfB9cHtwfXCBwnGCMwH we0Iwu0HCMH2CAcIwgcIB8kIwfYIxPb////////n/9P/yv/F/8L/wf/Etv///////9z/3vYIy/bE CN/21P/B9sL/z/bCCMYHCMgJxO3B9cIJwfXGB8HuxffB7QfB9cPtwfXCCcTtwezB7ckJwfXF7cH1 wgnG9cLsw+3B9coJwvXC7cL1yAnB9cXtwwnD9cMJwfXC7cLswe3B9QnB9cLtxAnF7cf1w+3B7MTk wezC7cH1xO3B9cntwvUHxAjCB8PtwwcIBwnDCM0HwffHBwjCBwjDB8kIxfb////////m/9P/yv/F /8L/wf/Etv///////93/xvbB/+L2CMH2CN722f/P9sIIxAfDCMgJwu3C9cMJwvXFB8X3we0HwfXE 7cH1wgnB7cLswu3JCcH1xe3B9cMJwvUJw/XC7MLtwfXLCcX1CcL1xgnB9cTtwfXDCcHtCcL1wgnB 7cLswu3B9cIJwfXC7cT1we3C7MLtwfUJxfXC7cHsweTCpMHkwuzT7QcJwwjCB8H1we3B9cUHwgnC CM0HCMIHCMMHCMcHygjF9v///////+b/0//J/8X/wv/B/8S2////////5P/H9sH//fbV/9H2ywjG CcP1xQnHB8L3wwfB9cHtxPXB7cL1w+3B9csJxPXGCcH1wgnC9cTtwfXSCcH1CcH1xAnB9cHtw/XE CcT1CcH1w+3C9cMJwfXC7QnC9cLtwezC7QnH9cLtwezD5MPsxu3C9cvtwfUHCcIICcMHwfXGB8MI 0QcIBwjB9skHxgjB9gjB9sH/w/b////////m/9P/yf/F/8L/wf/Etv///////+P/yPbC/8L2wf/3 9tn/w/bC/8z2CML2CMH2xAgHwwkHyAnOB8L1B8j1zQnC9ccJwvUJxvXTCcH1zgnB9cPtwfXKCcH1 wu0JwvXD7cH1wgnB9cHtxPXB7cjswffM7cH1x+3CBwgJwgjJB8QIygfCCMMHCAcIygfKCMX2//// ////5f/T/8n/xf/C/8H/xLb////////j/8b2wf/B9sL/wvbB//b22//C9sT/zPbICMwJ0gfJ9dQJ wfXECcT14wnB9cLtwfXKCcP1CcH1w+3F9cHtw/XC7cnsx+3H9cPtwfXC7cH1BwjDCQgJyAfDCMIH wffHB8IIwwcIBwjLB8kIxvb////////l/9L/yf/F/8L/wf/Etv///////+T///bE9uD/zfbCCMH2 wwgHywnB9dMHyfXYCcb10wnB9c4JwfXB7cH1wgnC9cYJwfXC7cL1w+3E9cLtwfUJwfXB7cbs2e0H CcMIwgnCB8H1xwcIwgfC98cHwgjDBwgHwwjJB8IIB8YIwfbB/8P2////////5f/S/8n/xf/C/8H/ xLb////////k///2xPbe/8L2wf/P9scIyQnUBwnG9d0JwvXiCcLtwfXGCcL1wgnB9cPtwfXD7cP1 wu3C9QnB9cHtweze7cH1B8QJwgfB9cHtygfC98gHwwjDB8IIzAcIB8UIwfbB/8T2////////5P/S /8n/xf/C/8H/xLb////////l/8T2wf/B9sT/xPbB/+/25v/M9gjC9gjB9sMIygnUB8j11QnB9cYJ wvXTCcP1ywnB9cPtwfXCCcX1wgnB9cLtwvXD7cb1CcH14u3B9QnFB8P1yQfB9aTJB8IIB8IIwwcI wfYIygfFCMf2////////5P/S/8n/xP/C/8H/xLb////////w/8H2wf/f9sH/w/bB/8f27P/L9sH/ wgjB9sUICQfJCdMHwvXDCcL1we3VCcH12wnE9csJwfXC7cH1yQnB9cLtwvXB7cH1wwnD9cIJwfXD 7cH1xe3C7MjtwuzN7cH1wgcJ0Aekwe3KBwjDB8IIzQfFCML2wf/E9v///////+T/0v/J/8T/wv/B /8S2////////9f/Z9sr/wfbw/8b2xv/ICMoJwfXTB8cJwfXB7cH18AnC9cwJwfXC7cH1yAnB9cXt wfXFCcL1wgnB9cLtwfXC7cP1xe3B9cLtwuzD7cP1yu3B9QfCCAnMB8MIwvfJB8IIwfbCCMMHCMoH wggHwwjC9sL/xPb////////j/9L/yf/E/8L/wf/Etv////////L/wvbD/9b2+v/I9sL/w/bB/8MI B8H2wwgJw/bECcP1xQfCCAcIygfHCcT1xQnB9gnB9s0JwfbGCcT1xQnB9sgJw/XCCcH2yQnB9cLt xwnB9QnB9cTtwfXCCcL2wgnC9cIJwfXC7cH1we3B9cMJwvXB7cP1wu3B7MLtwvUJw/XJ7cH1xQnC B8L1xgfCCMH2CAekyAfECMH2wwjCB8IIygfCCAcIwfbE/8T2////////4//R/8n/xP/C/8H/xLb/ ///////3/9b2+P/K9sH/xPbB/8IIwfbCCAfCCML2xgnF9cIHwgjNB8YJw/XCCcL1yQnB9dEJw/XO CcL1xwnC9cQJwfXB7cH1xgnB9cHtwvXD7ccJw/XCCcH1wu3B9cYJwvXF7cHswu3CCcL1y+3B9cIJ BwnEB8H1xgcIxAekwe3HB8IIwfbHCMIHCMMHCMcHwgjB9sT/xvb////////i/9H/yP/E/8L/wf/E tv///////+//xPbC/9f2+P/L9sH/xPbB/8QIB8MIwvbECcj1BwjFB8L3xwfB9sQJxPXCCcP1xgnC 9cHtwfXECcH1xwnB9cHtwfUJxPXHCcL1xQnB9cYJwfXC7cH1wwnC7cQJwvUJw+3B9cPtwfXFCcL1 wu3B9QfB9cLtwfXDCQfD9cntCcH1xe3B7MbtwfXCB8L1wgfB9cHtwfUHwfXCB8H1xwfC98H1xgfF CMIHCML2CAfCCMIHyQjC9sb/xfb////////h/9H/yP/E/8L/wf/Etv////////D/w/bC/9b2+f/L 9sH/w/YIwf/CB8cIxQnB9cHtwfXCCcH1wwcIxAfE98YHwfbECcH1wu3B9cMJwvXDCcH1CcL1wu3B 9cQJwfXFCcL1wu3B9QnE9cYJwfXC7cH1xAnB9cMJw/XB7cLswe3B9cIJwfXB7cH1wgnB9cHtwfXB 7cLswe3C9cPtwwnC9cLtwffB7cX1wgcJwgfB9cvtB8H1xO3C5MHsxu0HwfXC7cL1w+0HxPXHB8Lt xwfCCAfCCMMHCMP2wwjCB8IIyPbG/8b2////////4f/Q/8j/xP/C/8H/xLb////////x/8L2wf/P 9sL/xvb4/8z2wf/B9gjB9gjB/wfECAfDCMMJwvXB7MLtCcT1wwfB98IHw/fB9cUHwwnD9cHtwezB 7cH1xAnC9cIJwvXE7cH1xAnB9cMJwvXC7cLswfUJxPXDCcP1we3C7MH1xAnB9cMJw+3D7MHtxAnB 7cH1wgnB9cLtw+zB7cH1xO3B9cIJwfXD7cH3we3B9ckHwfXD7cHkwffG7QfD7cH3weTCpMftwfXI 7cX1wwfB7cL1we3B9cHtwfXCB8H1xAcIxgcIw/bCCMH2CMIHw/bD/8P2x//E9v///////+H/0f/I /8T/wv/B/8S2////////9P/X9vj/zPbB/8H2wggHwf/FCAcIwwnD9cLtwvXCCQfC9cMHxvfHB8IJ wfXC7cLswe3B9cUJwfUJwfXC7cLswu3C9cIJwvXCCcH1w+3C7MHtwfXDCcP1CcH1xO3B7MHtxQnB 9cIJwfXF7MHtwfXDCcH1wu3C9cHtxOzI7cL1wu3C98LtwfXFB8H1wgfB9cPtw/fG7QfC7cH3w6TB 5Mrtw/fC7cf1B8H1xe3C984HwgjE9gjB9gjCB8T2wv/C9sj/wfb////////i/9H/yf/E/8L/wf/E tv////////T/1fb6/872wwjB/8UIwgcIBwnG9cIJxfXCB8X3yQfC9cPtw/UHxgnB9cLtwuzB7cH1 CcH1CcL1CcH1CcH1xe3C9cMJxPXG7cH1xwnB9cHtw+zD7cH1wwnB9cXtw+zB7cL1xu3B9cPtwffC 7cH1xgfB7cIHxO3B98Ltw/XEB8Ltwfekw/fJ7cT3wu3E9cLtwfXG7cH1wvfOB8IIxPYHCMH2CAfE 9v///////+n/1P/K/8X/w//B/8S2////////8//V9vv/z/YIw/bDCAfDCMIHxfXCCcP1B8P1wgfC 98wHxfUJyAfB9cTtwvUHwgnC9QfE9cLtzPXD7cP1CcL1CcT1we3C7MHtyfXH7cT1wu3D9QfB9cLt wffB7c0Hwe3B98Ltwe7HB8Huwe3F98XtwvfB7cT3ye3B9cTtwfXC7cH3pMH3yQfGCMX2wwjCB8H2 ////////6v/V/8r/xf/D/8H/xLb////////1/872///V9sb/wfbCB8b/B8H1BwjF/8H2wgcIzP/B 9ggHCM3/wfbCB8IICcUIwgfGCcIIwgnCB8H1we3CB8IIyQnB9cHtwffB9cQHxAkHw+3B9cMHwgkH we3C98HtxQfB7sHtB8IIwgfDCMIHCML2B8H3pcH3we7GB8P3pcKknMWbwlvCm1vCUlvPm8ikxffC BwjFBwjF9ggHCMIHwfb////////p/9X/yv/F/8P/wf/Etv////////X/zvb//9T2xwjB9sIHwfYJ wwjB/8H1wu0Hwf/DCML2CMj2x//B9gjB9s3/wfYHwfXIB8QIwwnECMMHwfXB7cH1wgfCCAfDCAfC CcIHwe3C98QHCcIHCQfB7cL3wfXDB8IJB8H1wvfB7cQHw/cHwgjB9sQIBwjC9gfD98HuxgfD98Kl wqScm1vEm8RbwlJTxFvLm6Sjx6TE98IHwgjCB8H3B8P2CAfECMH2Bwj////////p/9X/yv/F/8P/ wf/Etv////////b/zfb//9L2CMH2xQgHCML2CcH/CAfB9QfB/8H1wvcHwf/DCML2CMH2wf/H9sH/ wfbE/8P2zv/B9tAICcUIwwfB7cH1yAfDCAfB9cHtwffB7cMHxAkHwe3C98H1xgfB7cKkwffDB8P3 wgfFCAfCCMP2B8L3yAfB7sP3wqWkwpzFm8NbU8NSx1vIm6Obx6TE98IHwgjCB8H3BwgHwwjD9gjB 9ggHCP///////+n/1P/K/8X/w//B/8S2////////9//M9v//0vbICAnC9gfB/wkIwgfB/8H1wvcH wfYHwgjC9gfG9sH/wvbG/8L2z//B9gjFB9EIwgfC7cH1yAfCCMIHwe3B98HtxAcICQgHwfXC98H1 xwfB96TB98QHwe7CB8L2wwjDBwjC9ggHwffJB8LuwvfDpaScm8JbwpvCW1NSW8JTy1vGm8ekxfcH wgjCB8H3xAcIxfYIwfbCBwj////////o/9T/yv/F/8P/wf/Etv////////j/y/b//9f2CAcICcL2 B8H/CQcIB8H/wfXC7QfB9gfCCMH2CAfB/8T2yv/C9s//wfYIyAfOCMMHwfXB7cH1wgfECMIHwggH we3B98HtyAfB7cH3pMH3xwfB96TB98IHCMUHxAjDBwjB9ggHrsoHwe7Drq3CpaTCnFvDm8NbU8Zb UslbxZvFpKWtxPcHwggHwvcHwgjI9sIIwgfB9sH/wfb////////n/9P/yv/F/8L/wf/Etv////// //n/xPb//8b/1fbB/8L2wggJwvYJwf/DCQfB/8IHwfUHwfbCBwjB9ggHxfbB/8P2xv/B9gjH/8P2 xv/B9sH/w/bHCAfMCAfB9cLtwfXCB8MIB8MIB8H1wffC7ccHwfXB96TC98IHw/XB98KkpcHuBwgH xfcHCMQHwvYHwq7KB8Huw66txKXEpJzDW1PGW1LJW8abxKStpcT3xAfC9wfJ9sH/xQjB9v////// /+f/1P/K/8X/wv/B/8S2/////////////8X/0fbB/8L2CMH2wf/CCAnC9gnB/8IJwgfB/8MHCMH/ wwjB9gjB9QjE9sH/xAjF/8H2CMb/wvYIwfbG/8L2CMkHzQjCB8HtwvfB9cIHxgjCB8HtwvfB7cUH CAfB98KkwffC9cIHwfXB98KkwffEB8L3we4HwvfEBwjC9gfCrsoHwe7DrsalxKScwlvEU8Nbw1LH W8abnMOkraXE98QHwe0HCMj2wv/C9gjB9sIIwvb////////m/9P/yv/F/8L/wf/Etv////////// ///F/9H2wf/DCMH2wf/DCML2CcH/wgkIB8H/wwcIwf/E9ggHCMT2wf/DBwjF/8H2CMb/wfbCCMH2 xf/D9gjDB8L1wffB9cIHzgjCB8P3wwfCCMIHCMIHwfXD98H1wwfC9cHtrMKkwvfB9cMHwffCpMH3 BwgHwe7C9wcIB8H3rsIHwgjB9gfCrsIHwgjC9gjDB8HvxK7GpcOknFzDW8JSU8NbU1vCUsdbm1vD m8SkwfetxfcHCMMHyfbB/8H2wf/B9sUIwvb////////m/9P/yf/F/8L/wf/Etv/////////////E /9L2wf/B9sIIwfbB/8MIwvYJwf8JCAcIwf/DBwjB/8H2CML2CAfC9sIIwfbB/8L1BwjB/8H2w//D 9sX/wvYIwfbF/8P2wwjCB8H1wvfB7cIHzgjCB8HtwvfDBwjFB8H1we3C98HtB8H1we3D98SkwffE B8H3wqStwwfB960HwfbCCAfB98IHCML2w64HCMX2wwfB7sWurcWlwqScXMNbw1PDW8RSyVvDm5zD pKXB962lwvfCBwjCBwjL9sL/wfbDCAcIwfb////////m/9P/yf/F/8L/wf/Etv/////////////E /9H2CMH/CMIHCMH/wwjC9gfB/wnCBwjB/8MHCMH/wgjC9ggHwvbCCMH2wf/C7cH1B8H/wvbC/8H2 CMb/wvYIwfbH/8X2CMIHwu3B9cUHygjCB8H1wvfB9ccHCAfB9cP3w+3E98KkwffFB8H3wqSlwe4H w/cHwgjB9gfCrgfDCMKuBwjF9sIIwwfB7siurcKlpJxcxFtTUlPCW1PEUshbw5ucw6TC98KkrcH3 xAcIy/bD/8L2wggHCMH2////////5v/T/8n/xf/C/8H/xLb/////////////xP/P9sIIwfbB/wjC B8L2wwjC9gfB/wjCBwjB/8MHCMH/wfYIwfbB/8H2B8X2wf/B7cL3B8H/w/bB/8H2CMX/wvbQCMMH wvXB7cH1wwfLCMIHwfXC98H1yAfB9cH3wqTC98TtwffDpMH3xAfB98KkpcH3wgfC9wcIwvYIB64H CMH2wwcIwvbDCMH2CMIHwe4Hwe6uyKWknMJcxVtTUlPDW1PDUlPHW8Sbw6StpcOkw/fCBwjM9sP/ wvbDCMH2////////5v/T/8n/xf/C/8H/xLb/////////////xP/S9sH/wwjC9sMIwvYHwf8IwgcI wf/DBwjB/8P2wf/B9gfF9sH/B8H1wffB9cH/w/bB/8H2CMH/wfbN/8X2xQjDB8H1we3B9cQHygjC B8P3we3HB8H1wfespKzB98PtwvfDpMH3xAfB98KkrcP3rcH3CMH2BwjC9gfDCMMHwwgHwwjB9geu wqWkW8JTW1ycpMOcXMhbU1LCU1vFUlPGW8ObnMekpcH3wgcIzfbB/8H2w//E9v///////+b/0//K /8X/wv/B/8S2/////////////8X/z/bCCMH/wggHwvbDCML2B8H/CAfCCMH/wwcIwf/B9gjB9sH/ wfYHxfbB/8QHxPbB/wgHwfbO/8P2wwjIB8TtwgfKCMIHwe3D98HtxwfB7cH3pKzB98L1we3C98Ok wffB7cQHwfekpcH3B8OlwffC9sIIwfYIwfYIywcIwe6cwlNSSlJTnK3Drq3CpJxcx1tTyVLGW8Ob nMekwfcHwgjO9v///////+v/1f/L/8X/w//B/8S2/////////////8T/z/bDCMH/wwjC9sMIwvYH wf8IB8IIwf/DB8H2wf/D9sH/CAfF9sH/BwgHCML/w/YIB8H2zv/E9skIwwfB7cH3we3CB8oIwgfB 7cP3wfXGB8H1wffCpMH3wwfB9cH3rMOkwe3DB8H3paStwfelnMKkXMH3wvbCCML2CMwHpVPDCkpT W1ykxaXDpJzIW8RSwlvDUsVbw5ucx6TB9wfCCML2CMv2////////6//V/8v/xf/D/8H/xLb///// ////////wf/T9sIIwfbDCML2wwjC9gfB9ggHwgjB/8MHCMH/w/bB/8H2B8X2wf8HwgjB9sL/wvbB /wgHCM//x/bHCMIHwfXB7cH1wwfCCAfDCMUHxPfB9cYHwveswffB7cQHwffDpMHtwwfB96SlwffB 7sKkpcIHpQfCCMP2B8KlrsYHwe4Hwe6kUkrCCkrCUlPIW8Ocx1vFUsJbWlLFW8Sbx6TB9wjR9v// /////+r/1f/L/8X/w//B/8S2/////////////8H/y/YIwfYIxfbCCMH2CMIHCMH2wwjC9gfB9ggH wgjB/8MHCMH2wgjB9sH/wfYIwf/E9sH/wgfCCML/wvbB/8H2BwjO/8L2yQjGB8H1wu3B98HtwgcI B8MIwgcIwgfB9cT3we3GB8T3wfXEB8H3wqTB98HtwgfB96WkwvekwqUHwfbB96QHCML2B6XCU1yl wq7B7sMHwe6upMJTUkpJClJbnKScU1LCSlJTyFtTxVLEW1LEW5vCW5vHpMH3xAjN9sf/x/b///// ///k/9L/yf/E/8L/wf/Etv/////////////N9sQIwvbDCMH2xAjB9gfCCMH2CAfB/8H2CAcIwf/D BwjG9gjF9sH/wwjB9sX/wfbDCMj2xf/I9scIxAfB7cP3we3EBwjGB8HtxPfB7cUHwe3E98QHwffC pML3wgfB7cH3pML3wqXB98IHCMKlB8L2wfdbSgpSU5ytrsHuwgeupVxbU1JKwgrCUsJTwlLESlJT W1zCW1PCW1PGUsRbU8RbxJvFpMH3B8QIzfbC/8n2////////5f/T/8n/xf/C/8H/xLb///////// ////zvbDCML2wwjB/8IIBwjB9sIIB8H2CMH3wfbEB8H/wwcIwf/E9ggHxfbB/8MIwfbC/8H2wv/B 9sIIyAcIwfbE/8f2ywjCB8Htw/fB9cgHCMIHwvekwvfGB8T3xAfB98KkwvfCB8HtwfekwvfCpMH3 B8IIB6QHwfYIpVJKCkpTW6StwweunFPDUsdJwkrDSUpSW8KcxVtTx1LIW8SbxaTB9wfDCNb2//// ////5//T/8r/xf/C/8H/xLb/////////////0/bDCMH2wwcIwfYIwgfB9gfB98H2xAfB/wcIB8H2 wf/D9sH/CAfF9sH/wwjB9sL/wfbC/8H2CMH2xQjEB8H2xP/K9skIwgfB9cHtwffB7cH1xwcIwgfB 9cH3wqzB98YHwe3D98HtwwfC96TC98IHxfebpMH3BwgHCAfCCMH3U0rDUsJTW6UHCAeuXFPDSkkK w0lKUlNSw0lKU5zCpMJcw1tTx1Jbm5ybxVvDm8WkwfcHwgjM9sMIxvb////////o/9T/yv/F/8L/ wf/Etv/////////////T9sMIwfbDBwjB9sMHwfYIB8H2xAjB/8MIwfbB/8P2wf/B9gfF9sH/wwjB 9sX/wfbJCAcIxf/D9s4IB8IIwwfB9cHtwffC9ckHwfXD98HtxgfC96zB98MHwe3B96TC98IHxfec pcH3wggHCMH2CMH3W8IKSlLDU1ulrsIHrpxTw1JKCsJJUlvCnFPDSVJbpMKlpJxcnMJbU8ZSW5vC nFvHm8WkwvcHwgjG9sgIw/b////////p/9X/yv/F/8P/wf/Etv/////////////P9sIIwvYIBwjB 9sMHCMH2CMIHwfYIB8H2xAjB/8MIwfbB/8P2wf/B9gjB9sH/w/bB/8MIwfbF/8H2CMH2xAjB9gjB 9gjB9sX/wvbUCMIHwe3D98H1yQfB9cP3we3FB8HtxPfCB8HtwveswffCB8H3pMP3pK0HCAfDCAek SsIAClJTwltcpcHuCAeupMRTxVLDW1JKwlJbnMSlw5xcwltTxVJbnKTEnKSbW5ucxqTB9wfGCAcI wwfDCMT2////////6v/V/8r/xf/D/8H/xLb/////////////zvbDCML2wwjB9sMHCMH2wwfB9ggH wfbECMH/wwjB9sH/xfYIxfbB/8MIwfbF/8r2CMH2xf/H9tAIwgfB7cP3we3C9ccHwe3D98HtxQfB 96zC98MHwvekwffB7cH1wfeswvelpMH3wwcIwgetUwpKwklbpKXCXKUHwfYHrqVcxFvEnFvDU1uc pKXCrcOlpMKcXMNbw1JTwlucpMScpJxbm5zGpMH3yQfDCMf2////////6v/V/8r/xf/D/8H/xLb/ ////////////zfbECML2wwjB9sMHCMH2wwfB9ggHwfbECMH/wwjB9sH/w/bB/8H2CMX2wf/DCMH2 xf/C9sb/xPbF/8L2yAfLCAfCCMIHwfXF98H1xwfB7cP3wfXEB8H3wqzB98MHwffCpML3B8T3pFvB 98IHCMMHWwoASQpSpcHuwfelpK7DB66lxFykpcP3rcOlwvfD7q7DpcKknFxbnFvDUlNbm8acpJxb wpvGpML3xgfCCM72////////6P/U/8r/xf/C/8H/xLb///////////3/wfbB/832xAjB9sIIBwjB 9sMHCMH2wwfC9gfB9sIIwvbB/8MIwfbB/8P2wf/B9gfB9sH/w/bB/8MIwfbF/8L2xv/E9sX/wfYI ywfMCAcIwfXF98H1xwfB9cL3wu3DB8HtwffCrMH3wgfC96TC9wfE91tSwffCBwjCB61TSsIAClKk w6WtBwjCB6WkwpzCXKStwffKB8Hurq3CpaTCnFxbnFvEU1vEnKScw6TCnJucxaStwffDB8II2Pb/ ///////k/9L/yf/F/8L/wf/Etv///////////f/B9sH/zPYIwfbDCMH2wwgHwfYIwgcIwfbDB8L2 B8H2wgjB9gjB/8IIB8H2wf/D9sH/wfYHwv/D9sH/wwjB9sP/wfbB/8H2CMH2xf/E9sb/w/bCCMkH yAjFB8HtwvekwvfB9cgHwfXC98QHxPfCB8HtwfekwvcHwffCpKVSW8H3wweuwe6tnFNKwgpSU1yc pcHuBwgHwe6lnMJcwpykrcH3wwcIxQfB7sKuwqWkwpxcwltcwlvCU8NbXJzGpMKcm8WkwqXB9wfC CNL2////////6P/U/8r/xf/D/8H/xLb///////////v/w/bB/8v2xgjB9sQIwfbCCAcIwfYIwgfC 9gfE9gjB9sMIwfbB/8P2wf/B9gjF9sH/wwjB9sX/wvbF/8X2xv/F9sIIxAfC9cQHwgjFBwjDB8H1 we3D98HtwfXGB8L1wvfB7cQHwffCpMH3we3C96TC9wfB98OkU6TDB66twq6lXFPCSlJbpMH3xgel nMJcnKSlwffB7sMHCMUHwq7DpcKcwlzCW1zCW8JTxFtcpMSlpMOcxKSlrcH3BwjR9v///////+r/ 1f/K/8X/w//B/8S2///////////7/8P2wf/L9sUIB8H2CAcIBwjE9gjDB8IIwffC9sIIwfbB/8H2 wf/G9sH/wfYIwf/E9sH/wfbI/8L2x//C9sf/xfbDCMMHwfXD7c8Hwe3E98HtxwfB7cL3we3B9cIH wvekwvfB7cT3we7B98Okm6XDB66lwq6lnFxTW6TB98IHwvYIBwgHpVxTwlycpa3B7scHwe/CrsSl w1zDW1zDW1PEW1ycpMOlyKStwvfCBwjO9v///////+v/1f/L/8X/w//B/8S2///////////7/8P2 wf/K9scIwfYIwgfFCMUHCAfB98H2CMIHwgjI9sH/wfYIwf/B9sH/wfbL/8L2z//I9sMIwwfB7cP3 wfXOB8H1w/fB7ccHw/fB7cIHwe3E9wfF96WkwffCpMH3wweupcHurqWcpKXB9wfECMIHCAeupVxT w1ycpa7GB8Hvwq7EpZzDXMNbXMJbwlPDW8NcnMKlyaStwvcHwwjN9v///////+v/1f/L/8X/w//B /8S2///////////7/8P2wf/K9sQIwgcIwfYIxAfDCMUHwfYHwffB9gjEB8UIw/bB/8H2CML2wf/B 9sv/wvbQ/8f2xQjDB8Htw/fB7cH1zAfB9cHtwvfB7cYHwe3D98IHwe3C96XB98HtxvekwfecpMH3 wwfCrsHurqWkrQcIxPYIB8L2CK6lw1ykwlylrsYHwq7DpaTJXMJbwlPCW8RcnMqkpcP3BwjB9sII zPb////////r/9X/y//F/8P/wf/Etv//////////6v/B9tD/w/bB/8n2xggHCMH2CMMHCMgHwfYI B8L2ywjC9ggHwfbB/8T2yf/D9s//yPbGCMMHwe3E98HtwfXLB8HtwvfB7cUHwfXB7cP3wgfB7cb3 wqXC98KkU63B98QHw67CpQcIw/bDCAcIwgeunFycpaRcW6SuxQfDrsOlnMhcyFvCXJykwqXHpKXE 9wcIwfbCCMv2////////6//W/8v/xf/D/8H/xLb///////////v/w/bB/8j2yQjB9sMIyQcIwvYH xfbICML2B8H3B8X2wv/B9sb/w/bP/8b2ywjCB8HtxffB9cQHCMUHwe3D98HtxAfB9cP3we7CB8T3 we7C96XC96WbUsL3xAfB7sKupa4HCMX2CMMHrqXFXMJTXKXEB8OuxKXJXMdbXMKcpKXB98WkwqWk pcP3wgcIzvb////////r/9b/y//F/8P/wf/Etv//////////7//C9s7/yPbHCMMHyvbC/8L2wgfB 9s3/wfYHwfcHCMn/wfbD/8P2z//F9sQIwfbJCAfB9cHtxffB7ckHwe3E98QHwfXD98IHwe4Hwe7H 96WbW8P3xgfCrgfECMH2wggHrsKlnFtTClPCXFtcpK7CB8OupsSlylzGW1ycwqSlwfekwpykpcL3 wqXD9wfCCM72////////6//W/8v/xf/D/8H/xLb//////////+L/5PbJCNIH0AgHCMkHxf/HCML2 CMH2CML2xAjB9tMIwwfB9cX3yQfB7cT3we3DB8HuxPfCB8T3wqXC96RSnMP3we7JB8QIwfYHrcJc wpzCU0pSU1xbXKWuwe7B78KupsOlnctcxVtcnMKkpcH3paSbw6StwffCpcL3wgfCCM72//////// 6//W/8v/xf/D/8H/xLb//////////+H/4/bJCNMH2AjDBwjF/wjEB8YIxPbHCMMHzwjCB8HtxvfI B8Huwe3E98QHwvfB7QfB7sT3wqXB962kUpukpcH3wwfCCMcHwwgHpVycwqXDXFvCXFtcpa7C7sKu xKXNXMRbnMKkwqWtwqScw6TC96SlwvcHwgjQ9v///////+v/1f/L/8X/w//B/8S2///////////f /+X2yQjTB9IIxvbECMX/wfbCCMcHwgjLB8LtwffB7cQHygjFB8Htw/fB7cgHwe3E98HuwwfD98Lu xvelpFvCpKXB98MHCML2xwfC9geupa7B7gfCrsKlwqScpcKuwgfCrsOlnc9cwlvDpMKlwqTCnMKk pcL3wqXC9wfDCM/2x//B9v///////+f/0//K/8X/wv/B/8S2///////////e/+f2yAjTB9IIxv/D CMH2xf/D9sIIBwjFB8H1ygfH98MHyAjDBwjDB8P3wu3HB8HtxPfDB8H3pcL3we7G98KknMKlwffB 7sMHCML2xwcIwvbHB8HurcOlxq7DpZ2cz1zCW8akwpzDpK3G9wfCCN32////////5P/S/8n/xf/C /8H/xLb//////////93/5/bICNQH0QjB9sb/wwjB9sX/xfYI0gfF98KkpcL3we3CB8MIwwfDCMQH wfXB7cH3wu3GB8T3we4Hwe7G96TD96XDpKWtwvfEB8L2B8KuxQfDCMYHwe7Irq3EpZ2cy1zEnFtc xqTCnMOkx/cHwgjI9sII0fb////////l/9P/yf/F/8L/wf/Etv//////////2//p9sYI1gfSCMb/ wwjB9sX/wvbDCMMHxgjFB8KlwqSlw/fCpMObnKTE98MHxwjEB8LtwvfB7cYHxvfB7sT3wqXD98Kk xKXC98MHwvYHra7B7scHCMIHwe4HrsalrcKuw6WkwpzLXMKcw6RcnMKkxZzDpMf3wwfMCMb2//// ////6v/V/8v/xf/D/8H/xLb//////////9r/6vbGCNYH0gjG/8T2xf/B9gjEBwjF9sIIwwfE98QH we7B9wfD7sT3pMKbpMH3B8kIwwfB9cHtxPfFB8L3pcL3B8n3nMSkpa3B98HuwgcIwfYHwq2uxgcI wgeuw6XDXMOcxaWknM1cnMSkwpykxJzFpML3xAfB98MHCMIHxQjJ9v///////+v/1f/L/8X/w//B /8S2///////////a/+n2yQjTB88IwfbDCM7/wfYIwgfCCMb2CAfB98HtwgfECMgHwe3B98HtxPek m1pbm8H3B8UIB8MIxAfB7cT3wwfN962kwlucwqSlwvcHrsIHwfYHwq3CrscHpcOcXMJTXMJTXFNc wqWknMVcw5zFXJzFpMKcpJzCm5zEpKXC98cHxAjJ9v///////+3/1//L/8b/w//B/8S2//////// ///W/+b2ygjMB67EB8P3wfXEB9IIwvbL/8L2CAfCCMb2wgfB98IHCMb2xgjFB8H1xffCpJvCpMHt xQfECMUH0PelwfekpaTCU8OcpK3C98KuBwgHwqWuwe7GB6XEXMdTUlNbwqTGXMWcXMOcxaScwqSc m5zFpML3xwcIzfb////////t/9f/y//G/8P/wf/Etv//////////1//m9sYIzgfCrsQHw/fC9cIH 0wjB9sv/wfYIBwjH9gjDB832xgjGB8HtxPfDpML3wwfDCAfCCMUHwe7L98KlraXCpJzCU8NbpKWt wveuwgeuwqXCrsHvxAetXFPDXJykpZxcxFNcpKWkxVzJnMWknMKkwpzFpKXC98IHwgjDBwjM9v// /////+7/1//L/8b/w//B/8S2///////////E/8H20f/m9sQIw/bFCNYHwwjB9sUIxfbFCML2x//D 9sIIwfbB/8H2CMT2CMIHz/bLCMQHwu3C96TCm6TB98cHCMcHyffGpJvCU1vCU1ykpa2lrcIHrsOl rsQHrqRTXMKlwq7B7q6lnFzCU1tcwqWkw1zDnMqkpcKknMKkwpzFpML3wgfDCMIHwgjM9v////// /+7/1//L/8b/w//B/8S2///////////E/8H20P/r9skI1AfJCML2ygjC9sb/wfbCCMH2w//E9gjC B8z2CMP2zQjIB8H3wpukwffCB8H1zAfH96XGpFvDU1JTW6TDpcQHw6WuxAetwlylwe7EB66lw1yc pMOlnMJcxJzFpJzCpJykpaTDnKScm8WkwvfCB8MIwgfCCM72////////7f/W/8v/xv/D/8H/xLb/ /////////8T/xPbM/+z2yQjTB8MIwfbDCMH2ygjB9sMIxPbB/8L2wggHwvbB/8H2CML2CAfB9QjN 9sgIwvbGCMH2xwjCB8H3w6TB98UHwe7FB8n3paSlxKScW8VTW8KcpK7DB66lpKWuxAeuwqWuwe7D rqWkwlycxqWcXJzCXMecXMOcpKWkwpzCpJybxaTC98IHwgjB9ggHCM/2////////7f/W/8v/xv/D /8H/xLb//////////8T/y/bE/872wwjd9ssI0AfDCMH2zQjI9sIIwfYIwgfH9gjDB9j2zgjB9gjC B8H3wqTJB8HuzfetpJyknFvDU8NbU1ytBwjCB66lXKWuwe7DB8HuxK7DpcKcxKWtxKXDnMZcnMNc wpzEpMKcwqScm8OkpcP3BwjD9ggHCM32////////7v/X/8v/xv/D/8H/xLb//////////8T/zPbC /8/2xQjY9swI0gfDCMH2ygjC9sIIxvYIwvYIB8IIx/YIB9n2zAjC9gjC9sIIB8H3raTB98IIyAfD 98LuxvekwpyknMRTW8JTW6UHCMMHrqVcwqXB7scHwq6twqXCrsHuwq6txaWkylycxqRcnMekxPcH CML2xAjJ9v////////D/2P/M/8b/w//B/8S2///////////E/8z2wf/v9ssIwgfCCM0HwgjB9gjD 9gjC9sQIwvbDCMP2wwjB9gjCBwjB9gjF9sIHwfYIw/YIwvYIyvbMCMIHzggHw/cHwgjJB8X3wqWk wpybpFvHU6QHwfYIwwetpFykpa7JB8HursHuwwfB7q7CrcSlpJzKXJzCpJzDXJzHpMT3wgfC9sQI yfbC/8H2wv/C9v///////+z/1v/L/8b/w//B/8S2///////////D/+H2xAjX9s8IzgfaCMIHyAjD B8cIwvbGCOIHw/fKB8X3pcKkw5yknFtTw1vCU5zB7sL2xAelpJykrcwHwgjEB8KurcOlpJzJXMOc xVzCnMWkpcT3wgfC9sQIxvb////////x/9n/zP/G/8P/wv/Etv//////////w//d9ggHwgjF9sMI 0/bMCPgHCN0HwffB7cn3wfXIB8H3wqTGB8f3pcOkw5zCpJzEW1NbrQfB9gjDB8H3pZxcnKWuwe7H BwjE9gjDB8Huwq7DpaTCnFyczlzHpMX3wgfC9sQIxPb////////y/9n/zf/G/8P/wv/Etv////// ////w//a9scIwfbECNb2zQjFBwjHB8H1ygfD9doHCAfOCOYHwqTHB8b3wqWkw5zCpMOcwlxbpAcI BwjB9sIHpZzDXKSlrsUHwgjF9gjDB8Huwq7DpaTEnMhcxFvCXMekxffCB8L2wwjG9sL/w/b///// ///v/9j/zP/G/8P/wf/Etv//////////wv/i9sMIB8MIwfbCCNH2zgjDBwjHB8L11AfFCMMHyAjC BwjC9gjW9sUIwfbGCMMHzAjDB6WkB8QIwgfB7sT3pcKknMekw5yuB8IIwvYHrpzEXJylwffDB8MI xfYIxAfB7q7B98OlpMScxlzFW8JcnMekxffCB8UIy/b////////v/9j/zP/G/8P/wf/Etv////// ////wv/h9sMIwfbDCNL20QjPB8gIwvbCCMv2CAcIyPYHCOr2xwjE9sIIB8HuwvfDCAfD98HuB8L3 pcekpaRcW1ykrgfD9giupcJbw1ycpKWuwgfCCMT2CMUHwe7C963DpcOkwpzDXMhbwlycx6TB9wfD 98IHxQjS9v///////+z/1v/L/8X/w//B/8S2///////////C/932CMP2xQjD9gjR9s8IzAfECNP2 wgjB9sIIBwjH9ggH5fYIzfbFCMIHwfekwfcHxPfDB8Huw/fHpJzDW6TB9wcIwfYIB61cxVtcpMKl wffCBwjC9sIIxgfB7sKuxKXDpMKcwlzJW8Jcx6SlwffCB8L3B8YI2fb////////o/9T/yv/F/8P/ wf/Etv//////////wv/e9skIwgfDCNP2zQjCB8MIwgfICM/2CMX2CAcIyPbCCPD2xQgHCAfCCMIH pMH3wwfCCMIHyPekwpvCW8JcpQcIwvYIwe6lW1PEW5zCpKWtwffCB8MIxwfB7q6tw6XEpMKcwlzI W8JcnMekwffGBwjB9gje9v///////+f/1P/K/8X/wv/B/8S2///////////C/932CMP2ygjR9tYI xgfDCNL2CMP2wgjI9gfn9sMIwvbGCAfCCAcIB8QIB8H3pMH3BwjDB8n3w5vDW1ylB8L2CAetXMJT wltTW5zDpKWtwffHB8TursH3rcSlw6Scw1zIW1zCnMOkpcOkwffCBwjDBwjB9gjE9sL/wfbK/8L2 w//D9v///////+r/1f/K/8X/w//B/8S2///////////C/972yAjC9ggHwgjT9tEIBwjEB8YI1PbD CMj2wgjj9sYIxwfFCMX2wggHwvfFB8H3B8b3pFvDm8KkpcH3BwjB9giupFxbnKScwlucwqTEpcH3 xgfB967B98KuwfetxKXFpMNcx1tcnMSkpcKkwvcHwgjDBwjB9gjE9v////////T/2v/N/8f/w//C /8S2///////////C/932xgjB9sgI0fYIwfbTCMMHxgjV9sIIyfYI4PbFCMoHwwjK9gjDB8L3xAfB 98LuwvfB7cH3pJukwpvDpcL3wwelpKXD96WcW5ykw6WkpcT3wwfB7sT3rsH3rcOlxqScwlzGW8Kc w6TCpcKkwvcIwvYIwgcIyPb////////z/9r/zf/G/8P/wv/Etv//////////wv/e9sQIw/bECNb2 0gjCB8cI1/bCCMj2CN72wwjKB8MIzfbDCMIHwvcHCMIHwvcHwvfB7aybwqSbnML3pMT3raWtwffC B8H3paSbnKSlwffCpKXE98QHwe7F98KtwqXHpJxcxVubwpzDpKXD98HuBwjB9sIIB8IIxfb///// ///1/9r/zf/H/8P/wv/Etv//////////w//c9scIwfbDCNn22QjX9gjO9sL/w/bF/8r2xAjJB8QI zvbGCMQHw/fGB8L3pJukxPelwqTG98IHwe7C98Skpcf3xwfC7sb3wqXHpMecxKSlw/cHCMP2xQjD 9v////////X/2//N/8f/w//C/8S2///////////D/9v2ywjD9sII0/b7CMH2wgjW9ssI3PbCCAfB 98KkxgfB9cHtwqTB7cIHwfXB7cH3wqTF98cHwu3LB8II0QfB7cn3we3HBwjL9v////////b/2//N /8f/w//C/8S2///////////E/9r2xgjC9sII2/bDCMH2CMT26AjCCcH2wgjY9skI4vbDCAfB96Sl xgfB96TB98QHwvXB7QfB9cT31AfDCAfCCM4HwfXI7ccHCMz2////////9v/b/83/x//D/8L/xLb/ /////////8f/2/bCCMr2wgjc9uQIwwkIxAkIw/YI1vYIxfYI4vYIwfYIwgfB98KkxQfB96TB7ccH w/XB7cKkwfXHB8H1wwcJwgfDCAfICMgHx/XH7cH1xgcIy/b////////2/9v/zv/H/8P/wv/Etv// ////////x//b9sQIwvbCCMP2wwjd9sMIwfbiCAnB9sIJ/vbB/8n2CMIHwfekwffEB8HtwffIB8P1 we3CpMYHwvXFBwnPCMgHy/XIB8IIyPb////////3/9z/zv/H/8P/wv/Etv//////////xf/c9gjw 9toIwfbCCML2wgjB9sIJCML2wgjH9gjv9sL/y/bCCMIHwqTB98QHwffCB8HtxwfB98HtwqTMB9II zQfF9cYHwwjI9v////////j/3P/O/8f/w//C/8S2///////////G///2yvbTCMH2zwjE9gjC9sII wvbDCP/2wfbCCAfB98KkwvfC7cX3we3FB8HtwfekwffLB9MIzQfC9ckHwwjI9v////////j/3P/O /8f/w//C/8S2///////////I///2x/YIxfbKCMf2yAjH9sQIwfbDCND2xP/c9sL/w/bB/8f2wv/D 9gjB9sIIwgfD96zC98Okm6Okwe3DB8LtwfekwfXCCMkHxAjC9sYIw/YIwfYIwvbCCNMHxQjI9v// //////j/3P/O/8f/w//C/8S2///////////J///2xvYIxvbJCMb2yQjC9sH/w/bICML2xP/J9sf/ yvbE/8r2x//B9sH/xvbE/8T2xAgHxffGpMH3wwfB9cHtwffB7QfCCMUHxgjG9sIIy/YIygfDCMYH xAjE9sP/wvb////////4/9z/zv/H/8P/wv/Etv//////////yP//9s72wwjB9sMIx/bJCMT2wwgJ wwjG9sL/y/bF/8v2w//M9sb/xvbG/8X2xAjFB8L3pMKsw6TB7cIHwfXC9wcIxwfFCMf2CMr2wwjJ B8IIxwfECMb2wv/B9v////////j/3P/O/8f/xP/C/8S2///////////H/+X2COj2wwjB9sMIxvbK CMP2xwjG9sL/y/bF/8v2w//N9sP/yfbF/8b2wwjCB8H1wgfB9cL3rMKkwffCpML3we3C9wcIxwfF CMb2wwjK9sMIyQfCCMcHCMH2CMf2////////+v/d/87/x//E/8L/xLb//////////8b/4vbCCOr2 xAjC9gjB9gjD9sUIB8YIxfbFCMb2wf/M9sX/5fbB/8r2xQgHwfUHCAfB9cIHwfXE98OkwfekB8II xwfCCMn2wwjJ9sQIyQfCCMYHwgjI9v////////r/3f/P/8f/xP/C/8S2///////////G/+L2wgjq 9sQIwfbCCMX2xAjCB8UIxfbFCNT2xP/H9sH/6/bDCMMHCMQHwfXC98H1wfesw6TB7QfB9gjGB8MI yfbDCMn2wwjEBwjFBwjHB8IIyPbD/8H2////////+P/c/87/x//E/8L/xLb//////////8b///bO 9sQIxfYIwvbFCAfCCMn2xQjU9sP/8vbDCAcIwwcIxQfC98HtxfcHwwjFB8QIyPbCCMv2xAjCB8UI wgfCCMYHCMr2////////+v/d/87/x//E/8L/xLb//////////8b///bX9gjC9sYIyvbFCNP2xf/d 9sMI1fYIwwfCCMMHwggHx/cHxAjCB8UI1vbOCMUHwgjL9v////////r/3f/O/8f/xP/C/8S2//// ///////G///22/bDCOT2w//s9sL/yvbHB8IIwgfB98PuB8P3B8YIw/YI1/bOCMIHwwjM9v////// //r/3f/O/8f/xP/C/8S2///////////H///2/fbB/8H2yP/F9sL/w/bE/9T2y//I9s4Hwe3CB8L3 wgfCCMIHwwjB9gjb9s8IzPb////////6/93/zv/H/8T/wv/Etv//////////x///9v72yP/F9sn/ xPbH/8T2w//B9s3/yPYIwwfCCMQHCMcHwffGB8IIwvYIwfYI2fYIwfbMCM32////////+v/d/87/ x//E/8L/xLb//////////8j///b99sT/yPbM/8L2wv/H9sT/wfbG/8H2x//H9sIIwwfDCMMHCMgH wvYHwfXDBwjB9sQIw/bC/8H2wv/V9sIIwfbGCM72////////+v/d/87/x//E/8L/xLb///////// /8j///b99sb/wvbT/8b21f/C9sH/xPbECAfC9gjDBwjB9gjOBwjDBwjD9sL/wfbC/9n2wgjK9sH/ xfb////////6/93/z//H/8T/wv/Etv//////////yP//9vr2w//C9s7/wfbL/8P22f/G9sMIB8II BwgHwgjB9gjRB8IIw/bC/8H2w//G9sH/3fbB/8T2////////+//d/8//x//E/8L/xLb///////// /8n///b+9vj/xvbNCM0HCMP2CMP2wf/B9sH/wfbB/+T2w//E9v////////r/3f/O/8f/xP/C/8S2 ///////////K///25vbD/8r2xP/F9vr/xfbHCML2xgjKBwjI9sb/yvbC/9f2/////////f/f/8// yP/E/8L/xLb//////////8v/6fbC/8b2wf/C9sf/yvbB/8/2w//K9sX/yvbF/8H2wv/B9vv/x/bD CMP20QjC9sH/wvYIwvbI/8b2xf/L9sH/yfb////////+/9//z//I/8T/wv/Etv//////////zP/o 9sH/w/bE/8P2x//J9sP/zPbC/8z2xv/K9v//xP/J9gjE9tIIxPYIwvbL/8L2xv/L9sH/yPb///// ///+/9//0P/I/8T/wv/Etv//////////yv/C9sH/6/bE/8L2x//F9sL/w/bC/832wv/M9sT/zPbC /8L2///D/872wgjB9swIwvbC/8P2xf/B9sz/yvbD/8f2///////////f/9D/yP/E/8L/xLb///// /////8n/w/bD/8P2wf/h9sH/xPbC/8H2yP/F9sP/w/bB/872wf/N9sP/y/bF/8H2w//B9v//wf/P 9gjB9sgIxPbC/8T2xP/B9s3/yfbD/8f2///////////f/9D/yP/E/8L/xLb//////////8n/w/bE /+T2wf/D9sz/xPbE/8P2wf/O9sH/zvbC/8v2///L/9X2wgjM9tL/xfbB/8P2w//G9v////////// 4P/Q/8j/xP/C/8S2///////////K/8L2xP/h9sL/xfbL/8T2xf/D9sH/yPbB/8X2wf/N9sH/zfbG /8H2///H/9z2wf/D9tD/xvbE/8H2w//G9v//////////4P/Q/8j/xP/C/8S2///////////U/9v2 xf/D9tn/xfbB/+L2xv/D9v//xv/c9sL/xPbe/8H2///////////i/9H/yP/E/8L/wf/Etv////// ////1P/a9uP/wvbL/8L2wf/F9sH/z/b//9L/0PbC/8n2wv/E9v//////////8f/Z/8z/xv/D/8L/ xLb//////////9L/wvbC/8z2wv/J9vP/xPbE/8r2wv/E9v//0P/D9sH/wfbC/8b2wv/B9sL/yvbC /8P2///////////x/9n/zP/G/8P/wv/Etv//////////0v/C9sH/1/b0/8T2w//J9sT/w/b//9H/ w/bC/8H2wf/F9sP/zfbD/8H2///////////y/9n/zP/G/8P/wv/Etv//////////0//J9sP/xfb4 /9v2///R/8P2wv/C9sH/w/bC/8/2w//B9v//////////8v/Z/8z/xv/D/8L/xLb//////////9f/ wvbL/8H2+//M9sL/w/b//9j/wfbD/8H2wv/J9sH/yvb///////////T/2v/N/8b/w//C/8S2//// ///////f/8L2/f/G9sb/wvbK/8L2///V/8H2w//E9sL/zfb///////////T/2v/N/8b/w//C/8S2 ///////////f/8L2/f/H9v//6//C9sL/wvbB/8H2wv/L9v//////////8//a/83/xv/D/8L/xLb/ ////////////7f/B9sf/wfb//9//wfbB/8L2wf/E9v//////////9//c/87/x//D/8L/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/8S2////////////////////////////////5//U/8r/xf/C/8H/xLb///// ///////////////////////////n/9T/yv/F/8L/wf/Etv////////////////////////////// /+f/1P/K/8X/wv/B/wwAAACAAAAAgACAgAAAAICAAIAAgIDAwMDA3MCmyvBAIABgIACAIACgIADA IADgIAAAQAAgQABAQABgQACAQACgQADAQADgQAAAYAAgYABAYABgYACAYACgYADAYADgYAAAgAAg gABAgABggACAgACggADAgADggAAAoAAgoABAoABgoACAoACgoADAoADgoAAAwAAgwABAwABgwACA wACgwADAwADgwAAA4AAg4ABA4ABg4ACA4ACg4ADA4ADg4AAAAEAgAEBAAEBgAECAAECgAEDAAEDg AEAAIEAgIEBAIEBgIECAIECgIEDAIEDgIEAAQEAgQEBAQEBgQECAQECgQEDAQEDgQEAAYEAgYEBA YEBgYECAYECgYEDAYEDgYEAAgEAggEBAgEBggECAgECggEDAgEDggEAAoEAgoEBAoEBgoECAoECg oEDAoEDgoEAAwEAgwEBAwEBgwECAwECgwEDAwEDgwEAA4EAg4EBA4EBg4ECA4ECg4EDA4EDg4EAA AIAgAIBAAIBgAICAAICgAIDAAIDgAIAAIIAgIIBAIIBgIICAIICgIIDAIIDgIIAAQIAgQIBAQIBg QICAQICgQIDAQIDgQIAAYIAgYIBAYIBgYICAYICgYIDAYIDgYIAAgIAggIBAgIBggICAgICggIDA gIDggIAAoIAgoIBAoIBgoICAoICgoIDAoIDgoIAAwIAgwIBAwIBgwICAwICgwIDAwIDgwIAA4IAg 4IBA4IBg4ICA4ICg4IDA4IDg4IAAAMAgAMBAAMBgAMCAAMCgAMDAAMDgAMAAIMAgIMBAIMBgIMCA IMCgIMDAIMDgIMAAQMAgQMBAQMBgQMCAQMCgQMDAQMDgQMAAYMAgYMBAYMBgYMCAYMCgYMDAYMDg YMAAgMAggMBAgMBggMCAgMCggMDAgMDggMAAoMAgoMBAoMBgoMCAoMCgoMDAoMDgoMAAwMAgwMBA wMBgwMCAwMCgwMD/+/CgoKSAgID/AAAA/wD//wAAAP//AP8A//////8= --Boundary_(ID_ddo/CwmUvagu0//a/XZaaQ)-- _______________________________________________ Zope maillist - Zope@zope.org http://lists.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope-dev ) dbacl-1.14.1/src/tests/sample.headers-2821b000066400000000000000000000000001325773323600201470ustar00rootroot00000000000000dbacl-1.14.1/src/tests/sample.headers-2821g000066400000000000000000000000001325773323600201540ustar00rootroot00000000000000dbacl-1.14.1/src/tests/sample.headers-2822b000066400000000000000000000000001325773323600201500ustar00rootroot00000000000000dbacl-1.14.1/src/tests/sample.headers-2822g000066400000000000000000000063101325773323600201670ustar00rootroot00000000000000From: John Doe To: Mary Smith Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> From: John Doe Sender: Michael Jones To: Mary Smith Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> From: "Joe Q. Public" To: Mary Smith , jdoe@example.org, Who? Cc: , "Giant; \"Big\" Box" Date: Tue, 1 Jul 2003 10:52:37 +0200 Message-ID: <5678.21-Nov-1997@example.com> From: Pete To: A Group:Chris Jones ,joe@where.test,John ; Cc: Undisclosed recipients:; Date: Thu, 13 Feb 1969 23:32:54 -0330 Message-ID: From: Mary Smith To: John Doe Reply-To: "Mary Smith: Personal Account" Subject: Re: Saying Hello Date: Fri, 21 Nov 1997 10:01:10 -0600 Message-ID: <3456@example.net> In-Reply-To: <1234@local.machine.example> References: <1234@local.machine.example> To: "Mary Smith: Personal Account" From: John Doe Subject: Re: Saying Hello Date: Fri, 21 Nov 1997 11:00:00 -0600 Message-ID: In-Reply-To: <3456@example.net> References: <1234@local.machine.example> <3456@example.net> Resent-From: Mary Smith Resent-To: Jane Brown Resent-Date: Mon, 24 Nov 1997 14:22:01 -0800 Resent-Message-ID: <78910@example.net> From: John Doe To: Mary Smith Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> Received: from x.y.test by example.net via TCP with ESMTP id ABC12345 for ; 21 Nov 1997 10:05:43 -0600 Received: from machine.example by x.y.test; 21 Nov 1997 10:01:22 -0600 From: John Doe To: Mary Smith Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> From: Pete(A wonderful \) chap) To:A Group(Some people) :Chris Jones , joe@example.org, John (my dear friend); (the end of the group) Cc:(Empty list)(start)Undisclosed recipients :(nobody(that I know)) ; Date: Thu, 13 Feb 1969 23:32 -0330 (Newfoundland Time) Message-ID: From: Joe Q. Public To: Mary Smith <@machine.tld:mary@example.net>, , jdoe@test . example Date: Tue, 1 Jul 2003 10:52:37 +0200 Message-ID: <5678.21-Nov-1997@example.com> From: John Doe To: Mary Smith Subject: Saying Hello Date: 21 Nov 97 09:55:06 GMT Message-ID: <1234@local.machine.example> From : John Doe To : Mary Smith Subject : Saying Hello Date : Fri, 21 Nov 1997 09(comment): 55 : 06 -0600 Message-ID : <1234 @ local(blah) .machine .example> dbacl-1.14.1/src/tests/sample.headers-821b000066400000000000000000000000001325773323600200650ustar00rootroot00000000000000dbacl-1.14.1/src/tests/sample.headers-821g000066400000000000000000000000001325773323600200720ustar00rootroot00000000000000dbacl-1.14.1/src/tests/sample.headers-822b000066400000000000000000000006121325773323600200770ustar00rootroot00000000000000Date: 26 Aug 76 1430 EDT Date : 27 Aug 76 0932 PDT Date: 26 Aug 76 1429 EDT cc : Important folk: Tom Softwood , "Sam Irving"@Other-Host;, Standard Distribution: /main/davis/people/standard@Other-Host, "standard.dist.3"@Tops-20-Host>; In-Reply-To: , George's message dbacl-1.14.1/src/tests/sample.headers-822g000066400000000000000000000012471325773323600201110ustar00rootroot00000000000000From: George Jones Sender: Secy@SHOST To: "Al Neuman"@Mad-Host, Sam.Irving@Other-Host Message-ID: From : Ken Davis Subject : Re: The Syntax in the RFC Sender : KSecy@Other-Host Reply-To : Sam.Irving@Reg.Organization To : George Jones , Al.Neuman@MAD.Publisher cc : Important folk: Tom Softwood , "Sam Irving"@Other-Host;, Standard Distribution: /main/davis/people/standard@Other-Host; Message-ID: <4231.629.XYzi-What@Other-Host> From: Jones@Registry.Org To: Smith@Registry.Org Bcc: dbacl-1.14.1/src/tests/sample.spam-1000066400000000000000000000125551325773323600171200ustar00rootroot00000000000000Return-Path: Delivered-To: vhost-harrison-org-trevor@harrison.org Received: (qmail 24289 invoked from network); 19 Nov 2003 12:43:41 -0700 Received: from adsl-200-59-68-139.capfed1.uolsinectis.com.ar (200.59.68.139) by steastwood.harrison.org with SMTP; 19 Nov 2003 12:43:41 -0700 Message-ID: <7931my78dr57e12oa-1b8k1@vf79fhr090d47> From: "" Reply-To: "" To: trevor@harrison.org Subject: Re: Please fill this out and return Date: Wed, 19 Nov 2003 18:36:00 -0100 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="_20_B38.6D..DA1FE8C1CE6" X-Bogosity: Unsure, tests=bogofilter, spamicity=0.840539, version=0.15.6 --_20_B38.6D..DA1FE8C1CE6 Content-Type: text/html; Content-Transfer-Encoding: quoted-printable Hi</tit= le> </head> <body vlink=3D"#0000ff" alink=3D"#= 0000ff"> <p style=3D"line-height: 100%; word-spacing: 0= ; margin-top: 0; margin-bottom: 0">Hi, <br> <br= > Refinance t&= #111;day to as lo&#= 119; as 2.95%! Sa = 8;e thousands = 11;f </p> <p style=3D"line-height: 100%; word-spacing: = 0; margin-top: 0; margin-bottom: 0"> dolla = 4;s or buy the = ; home of you = 4; dreams!</p> <p style=3D"l= ine-height: 100%; word-spacing: 0; margin-top: 0; margin-bottom: 0"><br>&#= 13; Apply today= 3; It only take= ;s 2 minutes. = ;<br> <br> <a href=3D"http:/= /www.quick-ho= me-loan-searc&= #104;.biz"><b>CLICK HE&#= 82;E</b></a></p> <p style=3D"line-height: 100%; word-spacing:= 0; margin-top: 0; margin-bottom: 0"><br> Than&= #107;s,<br> Jennife= 14; Santos </p> <p style=3D"l= ine-height: 100%; word-spacing: 0; margin-top: 0; margin-bottom: 0"> = </p> <p style=3D"line-height: 100%; word-spacing: 0; margin-top: = 0; margin-bottom: 0"> </p> <p style=3D"line-height: 100= %; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> <= p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margin-botto= m: 0"> </p> <p style=3D"line-height: 100%; word-spacing: 0; = margin-top: 0; margin-bottom: 0"> </p> <p style=3D"line-heig= ht: 100%; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> = ; <p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margi= n-bottom: 0"> </p> <p style=3D"line-height: 100= %; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> <= p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margin-botto= m: 0"> </p> <p style=3D"line-height: 100%; word-spacing: 0; = margin-top: 0; margin-bottom: 0"> </p> <p style=3D"line-heig= ht: 100%; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> = ; <p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margi= n-bottom: 0"> </p> <p style=3D"line-height: 100= %; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> <= p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margin-botto= m: 0"> </p> <p style=3D"line-height: 100%; word-spacing: 0; = margin-top: 0; margin-bottom: 0"> </p> <p style=3D"line-heig= ht: 100%; word-spacing: 0; margin-top: 0; margin-bottom: 0"><font size=3D"= 2">To be remov = 1;d, please <a href=3D"h= ;ttp://www.qui= ;ck-home-loan-= search.biz/go"= >click here</a></font><br>&= #13; <br> </p> <p style=3D"line-height: 100= %; word-spacing: 0; margin-top: 0; margin-bottom: 0"> </p> <= p style=3D"line-height: 100%; word-spacing: 0; margin-top: 0; margin-botto= m: 0"> </p> <p style=3D"line-height: 100%; word-spacing: 0; = margin-top: 0; margin-bottom: 0"> </p> </body> = ; </html> zapjv cdjyssfsrulgmmxlgggcnri --_20_B38.6D..DA1FE8C1CE6-- ���������������������������������������������������������������������������������������������������������������������������������������������������dbacl-1.14.1/src/tests/sample.spam-10���������������������������������������������������������������0000664�0000000�0000000�00000013745�13257733236�0017202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������From betty.crookers@firemail.de Fri May 24 13:23:01 2002 Return-Path: <betty.crookers@firemail.de> Received: from localhost (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g4O3N0X00974 for <anthony@localhost>; Fri, 24 May 2002 13:23:01 +1000 Received: from mail.interlink.com.au [203.9.111.130] by localhost with POP3 (fetchmail-5.9.0) for anthony@localhost (single-drop); Fri, 24 May 2002 13:23:01 +1000 (EST) Received: from koro.off.connect.com.au (koro.off.connect.com.au [192.94.41.1]) by valdez.interlink.com.au (8.11.6/8.11.2) with ESMTP id g4O3KOD20156 for <anthony@interlink.com.au>; Fri, 24 May 2002 13:20:25 +1000 Received: by koro.off.connect.com.au (Postfix) id B80C244ADE; Fri, 24 May 2002 13:20:20 +1000 (EST) Delivered-To: arb@connect.com.au Received: from yarrina.connect.com.au (yarrina.connect.com.au [192.189.54.17]) by koro.off.connect.com.au (Postfix) with ESMTP id 8C351449D8 for <arb@connect.com.au>; Fri, 24 May 2002 13:20:20 +1000 (EST) Received: from aainternetsolutions.com (unknown [202.8.246.74]) by yarrina.connect.com.au (Postfix) with SMTP id E11432CA3EC for <arb@connect.com.au>; Fri, 24 May 2002 13:20:10 +1000 (EST) From: betty.crookers@firemail.de X-Priority: 3 Subject: *****SPAM***** Lowest Mortgage Rates Around Message-Id: <9TQ60S4TBD9W4QQYQX.P0H05JPF89SF8MVTOP3.betty.crookers@firemail.de> Received: from aainternetsolutions.com by 25FW4I5.aainternetsolutions.com with SMTP for willyswonka@freenet.de; Thu, 23 May 2002 23:18:13 -0500 X-MSMail-Priority: Normal Reply-To: willyswonka@freenet.de Importance: Normal X-Encoding: MIME X-Sender: betty.crookers@firemail.de Date: Thu, 23 May 2002 23:18:13 -0500 To: willyswonka@freenet.de MIME-Version: 1.0 X-UIDL: +m~!!TN3"!3F%!!C(@!! Content-Type: multipart/alternative; boundary="----=_NextPart_721_4775680025070300" Content-Transfer-Encoding: Quoted-Printable This is a multi-part message in MIME format. ------=_NextPart_721_4775680025070300 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: Quoted-Printable We will help you get the mortgage loan you want! Only takes 2 minutes to fill out our form. http://81.9.8.42/ Whether a new home loan is what you seek or to refinance your current home = loan at a lower interest rate and payment, we can help! Mortgage rates haven't been this low in the last 12 months, take action now! Refinance your home with us and include all of those pesky credit card bills = or use the extra cash for that pool you've always wanted... Where others says NO, we say YES!!! Even if you have been turned down elsewhere, we can help! Easy terms! Our mortgage referral service combines the highest quality loans with most economical rates and the easiest = qualification! Click Here to fill out our form. http://81.9.8.42/ ------=_NextPart_721_4775680025070300 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: Quoted-Printable <HTML> <HEAD><TITLE>Mortgage companies make you wait

Mortgage companies make you wait...They Demand to Interview you..= They Intimidate you...They Humiliate you...And All of That is = While They Decide If They Even Want to Do Business With You...=

We Turn the Tables = on Them...
Now, You're In Charge

Just Fill Out Our Simple = Form and They Will Have to Compete For Your Business...

CLICK HERE FOR THE = FORM


We have hundreds of loan programs, including:
  • Purchase Loans
  • Refinance
  • Debt Consolidation
  • Home Improvement
  • Second Mortgages
  • No Income Verification

You can save Thousands = Of Dollars over the course of your loan with just a 1/4 of 1% Drop = in your rate!







CLICK HERE FOR THE = FORM

You = will often be contacted with an offer the
very same day you fill out the = form!

Remove ------=_NextPart_721_4775680025070300-- dbacl-1.14.1/src/tests/sample.spam-11000066400000000000000000000056411325773323600171770ustar00rootroot00000000000000From lorisudeso@txwin.net Sun Mar 19 10:20:02 2006 Return-Path: Delivered-To: unknown Message-ID: <000001c64aea$254c5500$3228a8c0@izs51> Reply-To: "Loris Desormeaux" From: "Loris Desormeaux" Subject: Re: news Date: Sat, 18 Mar 2006 19:14:53 -0500 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_01C64AC0.3C764D00" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-UIDL: Dh#!!'AQ!!0;`!!?f##! X-DBACL-Says: notspam # 14% Status: RO Content-Length: 2301 Lines: 138 This is a multi-part message in MIME format. ------=_NextPart_000_0001_01C64AC0.3C764D00 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, =20 Do you want to t O t V b E s R q P l A f Y for your a M d e p d w i u a v c o t u i k o r n u s? =20 Nothing like you need it, e S s a v v n e over a 5 m 0 k % with http://aiei61.ecectimi.com ------=_NextPart_000_0001_01C64AC0.3C764D00 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,
 
Do you want to t O t V b E s R q P l A f Y for your a M d e p d w i u a v c o t u i k o r n u s?
 
Nothing like you need it, e S s a v v n e over a 5 m 0 k % with http://aiei61.ecectimi.com=
------=_NextPart_000_0001_01C64AC0.3C764D00-- dbacl-1.14.1/src/tests/sample.spam-2000066400000000000000000000020051325773323600171060ustar00rootroot00000000000000Return-Path: Received: from pobox.com (d36-13-33.home1.cgocable.net [24.36.13.33]) by secure.intgrp.com (8.11.6/linuxconf) with ESMTP id i2G1Lqk09106 for ; Mon, 15 Mar 2004 20:21:52 -0500 Message-ID: <7ba301c40af5$2c0edba7$09478a3f@pobox.com> From: "Carson T. Smith" Subject: secret affairs Date: Tue, 16 Mar 2004 01:21:58 +0000 MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 7bit Browse online listing of real wives looking for an affair

They need someone to satisfy them tonight.



Stop offers

qrkthdotmpigco ofjanxdwdzjx poccbzbhwncan zcakbnczmhaps

jDNyQM44vSnNluagR

brndogbcjb djhaxmdtngfar

dbacl-1.14.1/src/tests/sample.spam-3000066400000000000000000000123301325773323600171110ustar00rootroot00000000000000From listserver@chessbrain.net Mon Dec 22 14:32:48 2003 Return-Path: Delivered-To: johnny@localhost Received: from localhost (localhost [127.0.0.1]) by ender.scoobynet (Postfix) with ESMTP id 235F7C4E8 for ; Mon, 22 Dec 2003 14:32:48 +1000 (EST) Delivered-To: johnny@localhost.scooby Received: from scooby by localhost with POP3 (fetchmail-6.2.4) for johnny@localhost (single-drop); Mon, 22 Dec 2003 14:32:48 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by scooby (Postfix) with ESMTP id 7AF644802 for ; Mon, 22 Dec 2003 14:52:26 +1000 (EST) Received: from mail.thenet.com by localhost with POP3 (fetchmail-5.3.3) for johnny@localhost (single-drop); Mon, 22 Dec 2003 14:52:26 +1000 (EST) Received: from smtp812.mail.sc5.yahoo.com [66.163.170.82] by danny.smallhosts.co.uk (SMTPD32-6.00) id A46B2DF40138; Mon, 22 Dec 2003 04:34:19 +0000 Received: from unknown (HELO quasar) (carlos?lora@sbcglobal.net@67.119.136.19 with login) by smtp812.mail.sc5.yahoo.com with SMTP; 22 Dec 2003 04:34:19 -0000 To: johnny@thenet.com From: "The ChessBrain Network" Subject: ChessBrain: World Record! Date: Sun, 21 Dec 2003 20:34:31 -0800 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="--boundary.ipw.20031212243430.545865424" Message-Id: <200312220434240.SM00193@smtp812.mail.sc5.yahoo.com> X-RCPT-TO: X-UIDL: 347419121 X-DBACL-Says: spam Status: RO Content-Length: 3811 Lines: 95 ----boundary.ipw.20031212243430.545865424 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit The ChessBrain Network T o be removed from our mailing list, send an email to support@chessbrain.net Secure Your Place In History! On January 30th 2004 a single individual will battle the largest chess playing computer ever created! ChessBrain is virtual supercomputer which plays using the processing power of thousands of machines connected via the Internet. You can help ChessBrain by running our free software and participating in this Official Guiness World Record attempt. Every computer connected will help to make ChessBrain stronger! " It is similar to SETI@home .... The difference is that all that power is used, not in the search for extra-terrestrial life or to fold proteins, but to play the ancient game of chess. " - Linux.com Everyone who participates will be eligible to receive a printed certificate acknowledging their involvement! ChessBrain has become the first distributed computer in history to play chess using 846 computers from over 50 different countries. Register now! at http://www.chessbrain.net/reg.html Carlos Justiniano ChessBrain Founder cjus@chessbrain.net Cedric Griss ChessBrain Organizer cedric@DCFoundation.org ----boundary.ipw.20031212243430.545865424 Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit The ChessBrain Network

Sponsors Click Here Visit The ChessBrain Network Chess / PC Enthusiasts Click Here
T o be removed from our mailing list, send an email to support@chessbrain.net
Secure Your Place In History!

On January 30th 2004 a single individual will battle the largest chess playing computer ever created!

ChessBrain is virtual supercomputer which plays using the processing power of thousands of machines connected via the Internet.

You can help ChessBrain by running our free software and participating in this Official Guiness World Record attempt. Every computer connected will help to make ChessBrain stronger!

" It is similar to SETI@home .... The difference is that all that power is used, not in the search for extra-terrestrial life or to fold proteins, but to play the ancient game of chess. " - Linux.com

Everyone who participates will be eligible to receive a printed certificate acknowledging their involvement!

ChessBrain has become the first distributed computer in history to play chess using 846 computers from over 50 different countries.

Register now! at http://www.chessbrain.net/reg.html

Carlos Justiniano
ChessBrain Founder
cjus@chessbrain.net

Cedric Griss
ChessBrain Organizer
cedric@DCFoundation.org

----boundary.ipw.20031212243430.545865424-- dbacl-1.14.1/src/tests/sample.spam-4000066400000000000000000000367161325773323600171300ustar00rootroot00000000000000From UTKCNSDI@msn.com Mon Jun 14 20:31:55 2004 Return-Path: X-Original-To: laird@localhost Delivered-To: laird@localhost.ender Received: from localhost (localhost.localdomain [127.0.0.1]) by ender (Postfix) with ESMTP id DA220C4E6 for ; Mon, 14 Jun 2004 20:31:54 +1000 (EST) Delivered-To: laird@localhost.scooby Received: from scooby by localhost with POP3 (fetchmail-6.2.5) for laird@localhost (single-drop); Mon, 14 Jun 2004 20:31:54 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by scooby (Postfix) with ESMTP id CC2A528FF for ; Mon, 14 Jun 2004 20:29:53 +1000 (EST) Received: from mail.lbreyer.com [213.171.192.146] by localhost with POP3 (fetchmail-5.9.11) for laird@localhost (single-drop); Mon, 14 Jun 2004 20:29:53 +1000 (EST) Received: from srnjmail.srivernj.org [141.150.69.30] by vicky.fasthosts.co.uk (SMTPD32-6.00) id AD8D53650140; Mon, 14 Jun 2004 11:27:25 +0100 Received: from smtp8.nix.paypal.com by msn.com (8.13.10/8.19.10) with ESMTP id i4M1AVjw010458 for ; %CURRENT_DATE_TIME Received: from smtp9.nix.paypal.com (smtp2.nix.paypal.com [141.150.69.18]) by msn.com (8.14.10/8.15.10) with ESMTP id i4M1AVjw010159 for ; Mon, 14 Jun 2004 17:23:57 +0500 Received: (qmail 18832 invoked by uid 888); Mon, 14 Jun 2004 05:26:57 -0700 Message-Id: <1083886700.16361@paypal.com> X-country: US X-language: en_US MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_00BU_04A4593DE_07E.354N31R0" X-Mailer: Microsoft Office Outlook, Build 11.0.5510 From: "Van Melvin" To: Laird Subject: Fwd:Get meds over night - no prescription required X-Spam-Checker-Version: SpamAssassin 2.60-spambr_20030926a on msn.com X-Spam-Level: X-Spam-Status: No, hits=-5.9 required=5.0 tests=AWL,NO_REAL_NAME autolearn=no version=2.60-spambr_20030926a X-RCPT-TO: Date: Mon, 14 Jun 2004 11:27:27 +0100 X-UIDL: 385768778 Status: U This is a multi-part message in MIME format. ------=_NextPart_000_00BU_04A4593DE_07E.354N31R0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_00OJ_00A0652YW_09G.821U00O0" ------=_NextPart_000_00OJ_00A0652YW_09G.821U00O0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Your mailer do not support HTML messages. Switch to a better mailer. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (MingW32) iD8DBQFAk9uTqH6NtwbH1FARAuaTAJ0erO4hUhVjiwosDk7dLvy7s4VTeQCeJuQF YrgfFpQBmN2lfLXxxcZosIw= =d5JJ -----END PGP SIGNATURE----- ------=_NextPart_000_00OJ_00A0652YW_09G.821U00O0 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable =

>>>>>>>>>>>&g= t;>>ENTER HERE<<<<<<<<<<<= <<<

 

 

 

 

 

 

 

 

 

 

 

Take me off your list please

=
------=_NextPart_000_00OJ_00A0652YW_09G.821U00O0-- ------=_NextPart_000_00BU_04A4593DE_07E.354N31R0 Content-Type: image/gif; name="image001.gif" Content-Transfer-Encoding: base64 Content-ID: R0lGODlhVQIfAaIAAAAAgP////8AAACAAAAA/wAAAAAAAAAAACH5BAQUAP8ALAAAAABVAh8BAAP/ GLrc/jDKSau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBILLoEAhiytww0b0+jdErd RRdRpDap2G4jV0m4iuU2xk40Rc3xajFN9ks+ddNN7lTWnCZLx097XXxphIMXd0aAi4YWiYiEbxWP R419dZGUH4KHIpydfkSLoJ1hppITX6EMjA6qGpprhomxK2i1NqeVZ2a4D5+Xq0Kjwa6NV69iqIfJ S81cqF5lxmXLg87HxU7F0rzY1b7E15zfvOB8cYHJ49rj6tbT5u6smaW61OfGy+mzloXRz/7JI+VL 2C588EjFs5cKGjp11RZiSxfvHkSJgLgluagx/2IwXOI4UrTYq6TAjw894sP4qx8ojgzXtUO5kCYz eAkVioQJrKBBFiHXibskh2JNovUKDWRYMSmybB+ZNpXnU6FUpkavIk06lR4EYDPJOR3rL6xDqmQb 4kzpVRtPtj9/DP1nciXYti/Hol15lV8et1CN+u32lB2Ybkub2sHK1k7Wc6oKt8RrtSNgnWeVTb7M mVZAyJIkW64cN8dcj0EpL4WJdG/ii6xVZ2TWdTPGnJOOZd4Mu67to7Itgb21W7LxsmYxK5+pzDdz zqOfl86l+3Dld4j1IT7uOnhtNaJZgavNFzDI6s+zqvd37zfz4cKL621bFD13+sht3z36VvV00//2 zYdXe/491hp+5e2x33JnUGagd+VBYhd7u51EWjvgcbWaht7ApdWDidlE3oHWDejha/n9N4Ronzzl 3HUuKZWXb6nRE95OUBHkHI55tZGJh4I9dGOFNfHoXmw2ctUiiMHBtSRwG0Joz45ApqhiDIslqWB2 GKKHYECfaeellj9ulONvf42HnZUtpUnmiIwA9BWXX2S4pixtnlJOfW7m0+GJeepZ0isTabjglYiW kGGijCJaVaOaQSqpDotOaqkfj14aoqac2kJhp6CuyGaokZJq6qmopqrqqqy26uqrsMYqawaZtlDr f7fmduGsvJbWp6eO+QgCn7g1JAxxo/qXm0z/kT6aa6/QbgKorcm6t4GdNsJSLROtXJvsPp4pum20 5JIQ3hzjKkvrp5sau8pa560b4ZzilmvvDMS+iFKxUNKlnUZydtdukIOaqSV+HO4L35SuuAWwoArH R28fn40E77n3ZqwCbr0hpO+8/V3DUpekEXfTejSaJFSMO+0lk8HTtHxbj/NuNTI/RVKp8c5AMSuw gfUlSGSlT1rLMITHlSWWwDaD8dKHQxNpNImMLcdiujxnvaygjw3mM3D38UeYkxLzFqNifwUNZ9S7 bnOg16GRpXTZ9wHtUJbSaa23tDpLFQuBVIto04Imk4zgxM2+aHfbKo8oJZf9Lv62gFPvbbkH/5KT +PfZUDPYddkeC30hHesxzSQW42klpWEDsz050+1eLru7ayepbqliW20ovyHGFnbNHSJN+S8OSp17 ze3V7fqzs19etMip50y7iSZWCC7GKsmYHPSW3bGy9NAXVTz4+9KsT7a6d65jv823L2aZMEP5K/Iv v3EnxvkmzM6WSBoNeZ3GE0+J3FGmiKnFGspjEF2m5b4Gpop5NYCgAydIQUZJEF9Yq6AGNwipC8rA gxwMoQhHSMISmvCEKEyhClfIwha68IUwjKEMZ0jDGtrwhjjMoQ53yMMe+vCHQAyiEIdIxCIa8YhI TKISl8jEJjrxiVCMohSnSMUqWvGKWMyiFv+3yMUuevGLYAyjGMd4JQKQ8YytMuMD1LgBAriRjTGA IxwpMMcA1PEDb8zjHWWwxz1awI8kACQDBGkCQqKxB25cYxvlaMgSyBEDdWzkBSQZxztS0gGX5EAj M4nHQ07BjJFsIyb5OEhIsoCTLQDlKDVpxx2gsgOv9CQpW1nKBeRRAoS8pS3t+MYG6HGXvgQmL3tp S10OM5EKmKMxW7nMVUKgmcf0JTRNSUthRpOO1UzmNbUJzWayEZTETKYuwYlMb4aTmef8pTjPKcsb qFGZ1vSjIB8pzlpmk5ah1KY19SnMfPKzmsj8ZzCfac9sfnOgorznQffpTEbaM6AGLeg36Sn/UIha NJ7FlChCBdpOGixUn/7cqDOBmc8+NrSgBOXoR0k60kHq8Z2rLOkIVgpTkSKUoiwdqD9Xyk94orSm tdypTTuKA4oClaEcRSk+Y5rShyr1mAEVqk5bitR7LnWqFVDnSBca0pMy9Kgg9apVeerTnAZVrEkl qg18ClarplWlcF1nVNHaVZ4ClKlDdStUifnSqE5zkljt6k+/GlepjnWfZQVpX+M61r+q9QWhbKtJ IyDTvEoWo0q1q2YZa1nKApaVwbzsM19K2MOa9q43FSlbPZtaXD62BpHlrE1FK9iwtraiaO0pXp+q V3l+NqGlFC1Vr3pWrDqVsYlV6FsN29TX/8ZxjTTFpUP/uVnlUje6G51rdo/LW99y17ZVzSp0MavI mBoVp+gtrXURy97TJjeWzoVlcx3rUojKNbPFZOctyWrRXjKSvxftLGXNmU76YrO892XtVJdJzkjq V73DxK1EjRnScGo1vhhGpIIzzOENerfDIKbgh0NM4hKb+MQoTjEV4atiTU0WkhdGsAdIO4NNDvcE NFYBi9964Bu7drbihXAIcvxY+/K4uXo98h/zugIbM9mRTx6yCF5p5CRvWLbz9TFow3tIVUZZxkru 5JdhS+YxF1W+tZ0APJMbZB1r+Yxg/S8gZcpXaV6UnYWNcILza99x6vmgDKawnR9J4CrLtv+b/kXu Li2M5/3Kd73bzDJOofpQQXOz0YkGs0IxfWe+4tmIcSYvVd+Z2PP+OKilbm9E+5xRUVO30t/t7VY1 2mrDslrUhg5yWSe93fR+d6e+rqemgx1RYRvbykHEbporG2viItnZpn0xfhV9W7Na+9SvNu61UQtp 8HJZzZhNM7ft+uvcQlvWtC6uuiWcRKNimd3M9TaYybrbocab2/2st7wH7E19n/ujbBbuoKXNVR8D HLFa5XV1lx1jZl+bzUVc7WkHrvDSzvPCylysXMl97+pGu6GOnXRfaSvWjNNY3D22Lcq9vGjVuhrf +yY4kD8+WCXGduK8da+/mQzxlFrS3B7/d3hapV3sYVO729MGbstxHtqmq7fieRbwy0le83aPUuA5 7/iRR4zsdT8d6Ba/MdFhPm1b8/zN2Obmu5fOdp1/XdtDBzvNVY1ES2JX0xB2d9qTLu/oAjvduA57 dxG8a5fG8+Auv+6jpfny4Vb47vmutqF/nu3Kv3eJBP90eOuaTnA/m9J8NrlwG4xJ7fI56TEe/MYH bdBMkx30p6fyfDVvb+gmEsCRn/DtPw9QTovczC0ewo6Fz8LhBz9Vxg9C8jPG6+NrbPk/gP69DOz8 6lv/+tjPvva3z/3ue//74A+/+MdP/vKb//zoT7/618/+9rv//fCPv/znT//62//++M+///73z//+ +///ABiAACh9OESA/JZLZVYuBkgqY0dHGvdbjbJyqQd8vAcDF5dr1MRl8IVygFd607SAbTZa1Ld3 YjZjBlFlmcRiIOhKWtZzYUaCzzVahmeCOdd1nleDHahaLugC80SBPphyWxYKLPdteJcBK6gDK4d2 i5eAo1aCIah0RliDlIeEN0iEFciEfhBqp3dlweVpc4VoFhZh5BR69fWFXih6XdhfYciFMFVn7AZ7 GEd7ZHhpRuZoRViGaShnceZ6kUZ6c7hpnaeBMqaHrIdOE1WHBaZ5j6dfbnh4jLh7ugWGLHeETQZv WTdgM6hYHUhqmShhbDVdutVPxMZjJf9VeLHmcVb2iYA3eVU4UZs4YeQVYJxliqTYVPT2ardWeUX3 bLe4aq+oeD1FbKYnhOEmdhp3eUz3cAdGdBLndWQ3Z/6md7Y4c7oWjVcodDC3cNa4dqFYi4RXVVMY dc1GjTtHbs6IeOdohcQXect2Zc3oiI2YVCeHZO8Yc0KWeBMHYGt4j2VYTtvYgv9Ii9s2ei2VY80H jrlXe2Vnbvi4cW11bnt1dNhojp8UWGLnjnCXjW8Ib5bWXiN3dBqIcbOmi9n4gAUpjgjJhiD5jA7p j9VGkpB3kde1jz91jA94gQ/mjMw0bxIZkCd4dWvHdfX4bxvZjt32kCuZiioZXKgHfBP/GZR7R5DN hpRuN5WNh1QHCZEuCI0wOHeGF3A9mZEUKQU3Z5Q8mY5eiXSThYxc93pdWVe72I0vmJZEyYsoKZcs mWRal5RcGJc6uZVduVzlOHVhiZZxYXdXqZeJJ4utt5GNaV3ICJlyV4GC9XhCNmIu+WvyBIrSmJC7 OIx1mY+ZmJWb9pJ+d5KWGJicyZS4RlPomJCgSQaZh4EfeZR06GCQCHF2CIcNmXBbFZuXSI6xV1/9 qGaZtohDaHu4CXVHyYe+mV2guZukSWTwiIZu1XAEdoXRJGdvuJvb6ZmtB4k2KID2p4LkOYA4mGXn OYByaJwYuJ7wGZ/yOZ/0WZ/2eZ/4/5mf+rmf/Nmf/vmfABqgAjqgBFqgBnqgCJqgCrqgDNqgDvqg EBqhEjqhHQVCx5JBG8MuRWChApomHNozczIulBAsKFApIzA/HeAss/Gf4NI2PIAt5+MtcKA/IOoJ CiIs7DOjZ4I73JcfPoonh7OhFNIP8SIhsaMHGAo2IspAtIIhjpAiP5oKh6Q2AwQ8FHMxRCoI9YNA hPI/DsM//3In1kIwfkIyW/IwjQE4U/E1eVAoYuI0DlOmC4Q4dFo5YUSldborAWM+IrKnfZoyTqOl gDozgqOkJyMfVlEO5WM+bto63GOi2vM8DUIQIzM6yIGn7YSpolOlgUM0w8Mk4PE0nf+6PD7KMufy OeqTNDxaO2jyqTmSBZ4zJnaaN1N6qbaao0nTJ2kjN2OjpqjzOgsUN2jBBlezqUvTGSSqqerDF7kK OW4jqo6hOLe6qo+lrNTDqafTPcPzJ7fTOKpzPP4SKC2KIt9BqpxKPwo0PkEqpfShpzSao7SKRtYK rkcSQMgKO/8yOtFzOqeaEMTKOYNTF79zpO/hOsy6rV9BFe46q/N6Rg1bsKZjrwObrddKPOADqdtz pIBzpqyKsWMqrXQ6sHDqFfaaHtN6rmT0sP+apgNxrOETMn7zMV2grqPxDnyKq17iImSjEi57GEJC rzTLpyuKPjV7snlKsFwUpWLwpF3/uiHPYD9nsaXXo7MNU6W6CrVyejsF66+7o6hz6qIERK4hGj86 4jO6ISRcSqxrsLb0+aEUqmJu+7YoFrdyW7d2e7d4m7cTCgAA4AB8q7fn97cNILiAW36EGwCHW7jk J7iJi7h8e7h/+7h9O7iSywCJ27iKK0aMO7kLQLie+7mWy7mQK7qcm7loVLkTsLmUGwGgqwCYa7pE JLmYK7ul67ePCwG067q1e7myG7qOC7uHpLq+27mTy7vEO7zEW7vAq7nFW7rG+7vD+7y6C73Ly7zI +7zYu7uke7zVC0aNK7y627yrS72Ou73T271f9L2ke7vge77lG7nii7zoO7/0W7/2/3u/+Ju/+ru/ jdK+/CtL6lsB/vu/wau8rzu+BKxWAUwBB5zAp+u82nu73Ou/qou6qOvATjS612u+FNy868u9GNxE Azy+wpu98tvAIYxCuWu7F2y77hu6Fhy/JgzC5JvCSdTB0SvD2vvCGmzDTNTCNVzC8TvBECy/PoxE QDzDOEy+PXzESrTA4Xu+rVu+PFzETvzEyvu+fSvEMLzFQ8zEWXzFYjzGZFzGZnzGaJzGzoXCBzzC ahy7BvzFD9DGcvzGRQTFH4DCdixEeOwBerzHQdTEoyvBg+zFUuzFfwzIMiTI5vu7U0zIHkzDiqxD 7TvCS7zEk6xBK0y5QJzDnuzCQf+swwicyThUyXUMvUq8w6RMyRJMxHMsx1xsxKtcQ0l8ypcMy2E8 y4scxyAMv70cy5KsyzSEx70Lxr6MyqoszMq8zMzczM78zNAczS7wx24szax8wdR8ytZcyk1sAYm8 zcOczN6cy+B8Qw1cyFb8ua1czjB0zo3cuuD7zewsQu7MuqJcw/PcPJvcxbNLzrwbw4csz/lMz/7c yMjsvsU80C1Uz6F8yJxMzgpNQqlMwrYM0RFN0On8xZDs0C980Sq0yep8zPHcyR5d0iZ90iid0iq9 0izd0i790jAd0zI90zRd0zZ90zid0zq90zzd0z7900Ad1EI91EykomBL1KwSrSX/a6R06yseGh9P 27TKQqIEJKw++z2rAxpTWywkERnJyiF2gtXD6qxvUtWgStXBChlk8iMWSyq+qi0z2ioim9WoWq/s g7ELo7UZa6kH261gDTrrEzp+va6Oiq0nMiQ72ilvLS9GqiokgTuPzdcVi64TQrS06quFQ6+QOq4g 8zGZI7YeK9lBGxJOaiqFIbXsIqZfG6Zom6Xw0xyCeiv/Ctlzs7CTXdgt+7Pwaji4rUCbTTg5GyC9 HTuZbaWB3bKlHSp6Qj6FUzq2Hal986eIY7NHDaRHSz5mw6P9A7GtehMu+tbFPSTusieATdiqgyyV U9xIC9wzS6mmDbCf3RXqLTwR//vdrhoCs221tZ0//OOn6kIO39o75X3b/W0cAd7cwq21K/PUYyvV tD0xO3IqG2smaC3fp5GoZHuou1rb9T0sHB6yc0M6SqKhvU3e7T09JZPanBM0goGygTMlZG07dz3g u83ezxoV7y06j4AyNKoLPm6r8x3fOHrdxx0oKL7d870+KgOlADvjGK7XzhAzJG7ewMq0Tp7epfrf 0DAgOQ7aVvIg/k3f5uA9p+G18aorRA4dlW3Yot3ZYx4zaL4ps00gIv6sUY6yvmM9o8KvNA6v2BMH 1JCkF2qsX248SH7fZz4XmdMTU56t/VrkBSKxU47huo3iMHJAfS0Lle4/+iLk6f9z3fmN3dvjEoL+ LvAd3YcjM9Ot6toaOYNaqdGR6aF+sfpTrGn+5+863CI+JmS+3n9923t96GkeHRP+q94g4ade1oId rtETPGD6J60N24eN6vmj1RSetmHONVvt1XiT1nYd5+/D5PBzN7+CPeEurlN9ttseN4sRrdCu1mst QMe+Q02N1LFyKPYuQiia7/ze79Y8AAMwHQDfAgM/OwVfAgd/AQCf8AYf8CbA8BwA8SEg8Taw8Bbv 8ApA8X6g8STA8Tvj8RGP8RYA8npD8hpA8hd/8Rkv8iNg8ijA8DCP8S5fBTPfABpf8xmA86Wh8xRQ 8zwfKjz/8xLg8ywfAEIfAUf//wEx7wAFn/RB8PM3X/QdL/WT4vRMT/VIj/WvEvRa3wFEf/UnYPUh b/NF3/Qir/Jkv/BpH/NqDwEJ//Znb/EMYPZy/wBov/J1P/dx3/Z6z/d4f/Apb/d5//cyX/aF7/cD P/hX7/dGr/iNn/h7D/ePb/iQvwB3v/aRH/d47/aDv/SNv/lkP/mLD/FyD/eM3/d8f/mhb/mOr/qi //Wh3/qdH/Czr/dgv/qTr/m2v/K4z/q8//uf7/vAD/iFL/y3D/zBn/zEb/yCz/xRb/ySP/zFj/y4 v/y/T/oOb/2Pz/y7r/zTL/3fT/zf7/3ZP/7dL/2+7/jez/1mL/pp7/zjL/7Q/4/1np/81R//+M/6 XX/8+g//8x/+CDCxo/uhQeYkfRa7uO+0YMdNUEiOpait3olmmftt8dzeNkrW6VmbrF9FxNP1jkIc MEgcyo7KoQrqSXKmrOzOiWy6YtZceBt9+lRjsfeFNS6ra6McJm3Ym3eK8G7/1nFXfTpFM3mATHx7 goZUhXiJNyGJXFoainxlc5RwaoRaVp6ZoG2Zlotrk4RgcV05pm9yZrFpkJoXoauicZeCnDK5enSy QQyRHUu4xzRtsK6DjLEpvcktnmmvlY2w25vPvWSVzc5samZhwKPDxuO+WeiswzznyrrfZ9Wou/Dl fuOGoVsk0Wt1qJS1btoeZf8LiJBgtFJnxOnix8SfvU/5zGV02I8jOY9PgC3kNrGRLHkbK3ZRQO0Z RXzsQIabItGPwIQwO7pj1hDiTnU1g5mcebKnraPphqoaqPJXynY6oX5sWhQnuKRUXWoEl5WkVptM pbbU+U5aTjekRBqjdNBswa9Tr5xtexbtGK+uhP3Us/eot7pW4ZJlekrjMoyH+a67B2Vp31WJ5b7N hlVy5YPzGutdiPgbJjr2ajk1+XkTNGyQ0SiDVhqbNJqnRY/E5NP1K4Wpw9pluewiZdakbJuKey92 ntS7k4GmG+wR79eCGQdujXTf7IvHI6vbzr279+/gw4sfT768+fPo06uPCR494Pr38ONvlU+/vv37 +PPr38+fu/vRk/Un4IBDEWjggQgmqOCCBv7nlG8MRiifgxJWaOGFGGao4YYcdhhAAgA7 ------=_NextPart_000_00BU_04A4593DE_07E.354N31R0-- dbacl-1.14.1/src/tests/sample.spam-7000066400000000000000000000055331325773323600171240ustar00rootroot00000000000000From rob5403x30@excite.com Thu May 23 09:13:42 2002 Return-Path: Received: from localhost (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g4MNDfp17343 for ; Thu, 23 May 2002 09:13:42 +1000 Received: from mail.interlink.com.au [203.9.111.130] by localhost with POP3 (fetchmail-5.9.0) for anthony@localhost (single-drop); Thu, 23 May 2002 09:13:42 +1000 (EST) Received: from excite.com ([210.187.5.227]) by valdez.interlink.com.au (8.11.6/8.11.2) with SMTP id g4MNDGD07876 for ; Thu, 23 May 2002 09:13:17 +1000 Received: from [163.141.191.122] by m10.grp.snv.yahui.com with NNFMP; Wed, 22 May 2002 10:13:08 +0100 Received: from sparc.zubilam.net ([145.116.40.100]) by rly-xl04.mx.aolmd.com with QMQP; Wed, 22 May 2002 11:03:51 +1100 Received: from unknown (175.154.133.214) by q4.quickslow.com with asmtp; Wed, 22 May 2002 21:54:34 +0100 Reply-To: Message-ID: <028b84e81a2b$8854c5e8$5ce46ca7@ihdhtw> From: To: Subject: *****SPAM***** Re: Whoa, she's gorgeous! 5695Yx-6 Date: Wed, 22 May 2002 16:01:49 +0700 MiME-Version: 1.0 X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 Importance: Normal X-UIDL: BT7"!#~:!!0:C!!9$G!! Content-Type: multipart/mixed; boundary="----=_NextPart_000_00C5_04A83B7D.A1528E24" Status: RO Content-Length: 1380 Lines: 27 ------=_NextPart_000_00C5_04A83B7D.A1528E24 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: base64 MTc2NHRZU2I1LTMzNEpaaXo4MTYyQURKTzgtNjExa2ZYWjk2MThnSUJDMi01 NDJiaVh6NzI4NEJUZmcxLTY0MGJsNjENCjxCUj46LSkNCjxCUj48QlI+PEEg SFJFRj0iaHR0cDovL3d3dy5hbWF0dXJleHh4Lm5ldCI+DQpXYW5uYSBzZWUg c29tZSBob3QgeW91bmcgdGVlbiBnaXJscyBudWRlDQphbmQgaGF2aW5nIGhh cmRjb3JlIHNleCBhZnRlcnNjaG9vbD88L0E+DQo8QlI+aHR0cDovL3d3dy5h bWF0dXJleHh4Lm5ldC8NCg0KPEJSPjxCUj48QSBIUkVGPSJodHRwOi8vd3d3 LmFtYXR1cmV4eHgubmV0Ij4NClRoZXNlIHRlZW4gZ2lybHMgYXJlIGhvdCBh bmQgYXJlIHdhaXRpbmcgaW5zaWRlDQpmb3IgeW91LiBDdW0gaW5zaWRlIG5v dyBhbmQgaGF2ZSBzb21lIGZ1bi48L0E+DQo8QlI+aHR0cDovL3d3dy5hbWF0 dXJleHh4Lm5ldC8NCg0KPEJSPjxCUj48QlI+PEJSPjxCUj48QlI+PEJSPg0K DQoNCg0KDQoNCg0KDQpUaGlzIGlzIG5vdCBzcGFtIQ0KPEJSPlJFTU9WQUwg SU5TVFJVQ1RJT05TOiBJZiB5b3Ugd2lzaGVkIHRvIGJlIHJlbW92ZWQgZnJv bSBvdXIgbWFpbGluZ3MsIHBsZWFzZSByZXBseSB0byB0aGlzIGVtYWlsIHdp dGggdGhlIHdvcmQgUkVNT1ZFIGluIHRoZSBzdWJqZWN0IGxpbmUuICBUaGlz IG1lc3NhZ2UgaXMgc2VudCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHByb3Bv c2VkIEJJTEwgc2VjdGlvbiAzMDEsIFBhcmFncmFwaCAoYSkgKDIpIChjKSBv ZiBTLjE2MTguIFdlIG9idGFpbiBvdXIgbGlzdCBkYXRhIGZyb20gYSB2YXJp ZXR5IG9mIG9ubGluZSBzb3VyY2VzLCBpbmNsdWRpbmcgb3B0LWluIGxpc3Rz LiBSZXN0IGFzc3VyZWQgdGhhdCB5b3VyIHJlcXVlc3QgdG8gYmUgdGFrZW4g b2ZmIHRoaXMgbGlzdCB3aWxsIGJlIGhvbm9yZWQuDQoNCjkyNjJMQWZUNi0w NzNuVE16NzYxNEZMbUIxLTYwMHdsMjk= dbacl-1.14.1/src/tests/sample.spam-8000066400000000000000000000074261325773323600171300ustar00rootroot00000000000000From Myrtie7625d78@freemail.com.pk Sun May 26 16:32:44 2002 Return-Path: Received: from localhost (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g4Q6WgO27875 for ; Sun, 26 May 2002 16:32:44 +1000 Received: from mail.interlink.com.au [203.9.111.130] by localhost with POP3 (fetchmail-5.9.0) for anthony@localhost (single-drop); Sun, 26 May 2002 16:32:44 +1000 (EST) Received: from ALPHA1.CC.MONASH.EDU.AU (alpha1.cc.monash.edu.au [130.194.1.1]) by valdez.interlink.com.au (8.11.6/8.11.2) with ESMTP id g4Q6CxD09381 for ; Sun, 26 May 2002 16:13:01 +1000 Received: from kapow.its.monash.edu.au ([130.194.1.71]) by vaxc.cc.monash.edu.au (PMDF V6.1 #39306) with ESMTP id <01KI6U5UL7R6923YNJ@vaxc.cc.monash.edu.au> for anthony@interlink.com.au; Sun, 26 May 2002 16:12:55 +1000 Received: from kapow (unknown [127.0.0.1]) by localhost (Postfix) with ESMTP id 9E09420006 for ; Sun, 26 May 2002 06:12:55 +0000 (/etc/localtime) Received: from yoyo.its.monash.edu.au (yoyo.its.monash.edu.au [130.194.9.1]) by kapow.its.monash.edu.au (Postfix) with ESMTP id 1B0B120007 for ; Sun, 26 May 2002 16:11:22 +1000 (EST) Received: from ALPHA8.CC.MONASH.EDU.AU (alpha8.cc.monash.edu.au [130.194.1.8]) by yoyo.its.monash.edu.au (8.9.3/8.9.3) with ESMTP id QAA308364; Sun, 26 May 2002 16:11:21 +1000 (EST) Received: from thwack.its.monash.edu.au ([130.194.1.72]) by vaxh.cc.monash.edu.au (PMDF V5.2-31 #39306) with ESMTP id <01KI6U3JWDTC8ZG5WP@vaxh.cc.monash.edu.au>; Sun, 26 May 2002 16:11:05 +1000 Received: from thwack (unknown [127.0.0.1]) by localhost (Postfix) with ESMTP id 63D5612C002; Sun, 26 May 2002 06:11:04 +0000 (/etc/localtime) Received: from freemail.com.pk (unknown [12.22.236.68]) by thwack.its.monash.edu.au (Postfix) with SMTP id 1F3D912C002; Sun, 26 May 2002 16:10:41 +1000 (EST) Date: Sun, 26 May 2002 03:58:22 +0200 From: Myrtie7625d78@freemail.com.pk Subject: *****SPAM***** Free money To: mij@yoyo.its.monash.edu.au, shanyap@yoyo.its.monash.edu.au, barkly@yoyo.its.monash.edu.au, anthony@yoyo.its.monash.edu.au Reply-to: Myrtie7625d78@freemail.com.pk Message-id: <010a11d80c8c$2331a8c0$3db28ab8@hjdtji> MIME-version: 1.0 X-Mailer: eGroups Message Poster Importance: Normal X-Priority: 3 (Normal) X-MSMail-priority: Normal X-UIDL: 8Z~"!VpT"![aB!!^d9"! Content-Type: multipart/mixed; boundary="Boundary_(ID_p8H1Hn0MvIMyoRcvyH6Bkg)" Status: RO Content-Length: 1289 Lines: 45 --Boundary_(ID_p8H1Hn0MvIMyoRcvyH6Bkg) Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: 7BIT On January 1st 2002, the European countries began using the new Euro. Never before have so many countries with such powerful economies united to use a single currency. Get your piece of history now! We would like to send you a FREE Euro and a FREE report on world currency. Just visit our site to request your Euro: http://%381%2E9%2E%38.4%2F%54heE%75ro%45%78%63h%61%6E%67e/ In addition to our currency report, you can receive: * FREE trading software for commodities and currencies * FREE online trading advice via email * FREE trading system for stock and commodity traders Find out how the new Euro will affect you. If you are over age 18 and have some risk capital, it's important that you find out how the Euro will change the economic world. CLICK NOW! http://%381%2E9%2E%38.4%2F%54heE%75ro%45%78%63h%61%6E%67e/ $5,000 minimum investment Please carefully evaluate your financial position before trading. Only risk capital should be used. Investors can and do lose money. http://%38%31%2E9%2E%38%2E%34/Li%73%74O%70t%4F%75t%2F To OptOut 7839HJzy5-730eyBq8547zzzd4-587cwWP6745tFzK5-012aUsP0713DpJhl56 --Boundary_(ID_p8H1Hn0MvIMyoRcvyH6Bkg)-- dbacl-1.14.1/src/tests/sample.spam-9000066400000000000000000000074061325773323600171270ustar00rootroot00000000000000From Jenn_bliair007@inbox.lv Fri May 24 11:10:44 2002 Return-Path: Received: from localhost (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g4O1AiX31326 for ; Fri, 24 May 2002 11:10:44 +1000 Received: from mail.interlink.com.au [203.9.111.130] by localhost with POP3 (fetchmail-5.9.0) for anthony@localhost (single-drop); Fri, 24 May 2002 11:10:44 +1000 (EST) Received: from transmagix (mcns232.docsis81.scvmaxonline.com.sg [202.156.81.232]) by valdez.interlink.com.au (8.11.6/8.11.2) with SMTP id g4O1ALD19463 for ; Fri, 24 May 2002 11:10:22 +1000 Message-Id: <200205240110.g4O1ALD19463@valdez.interlink.com.au> From: Jennifer Blair Reply-To: Jenn_bliair007@inbox.lv Subject: *****SPAM***** Some relating to import/export business Date: Fri, 24 May 2002 09:10:56 +0800 MIME-Version: 1.0 X-UIDL: B_h!!~jK!!(D(#!jKh!! Content-Type: multipart/related; boundary="22ea98ee-9269-4bdf-9689-bfda407227e7" Status: RO Content-Length: 2757 Lines: 68 This is a multi-part message in MIME format --22ea98ee-9269-4bdf-9689-bfda407227e7 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable

 Top ten businesses to start from Entrepreneur = Magazine

Click here

If = you to start doing Import/Export Business
you may need the Know-how
AND HERE
IT IS

3D= Import/Export Business

The world is your oyster. And we=A1=AFll show you how to = crack it open with this best selling guide. As a top import/export agent, you = can net a healthy six-figure income by matching buyers and sellers from = around the globe, right from your home.

You don=A1=AFt need any specialized training or experience to succeed. This = guide teaches you everything you need to know to become an import/export = professional. We=A1=AFve even included overviews of 16 specific foreign = markets to help you get a running start. Order today and discover the = glamourous world of international exchange.

This guide makes an ideal homebased business.


--22ea98ee-9269-4bdf-9689-bfda407227e7-- dbacl-1.14.1/src/tests/score-1.shin000066400000000000000000000020541325773323600167440ustar00rootroot00000000000000#!/bin/sh # verify that empirical divergence is zero for a single email. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep prerequisite_command $0 awk prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -0 -l dummy -X -d -T email \ | grep '# shannon' \ | awk '{print $5/log(2)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out1" cat ${sourcedir}/sample.spam-2 \ | $DBACL -c dummy -vX \ | awk '{print $3, $5}' \ > "$DBACL_PATH/out2" echo "`cat \"$DBACL_PATH/out1\"` `cat \"$DBACL_PATH/out2\"`" \ | awk ' function abs(x) { return (x >= 0) ? x : -x } { # error in divergence can be up to 15% of shannon entropy estimate # must invert exit value exit !( abs($1 - $2) < (0.15) * ($3) ) }' RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/score-2.shin000066400000000000000000000024361325773323600167510ustar00rootroot00000000000000#!/bin/sh # verify that average empirical divergence is correct. PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 formail prerequisite_command $0 grep prerequisite_command $0 awk prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (cat ${sourcedir}/sample.spam-8 ; echo ; \ cat ${sourcedir}/sample.spam-9 ; echo ; \ cat ${sourcedir}/sample.spam-7 ; echo ; \ cat ${sourcedir}/sample.spam-3 ) \ > "$DBACL_PATH/mbox" cat "$DBACL_PATH/mbox" \ | $DBACL -l dummy -X -d -T email \ | grep '# alpha' \ | awk '{print $7/log(2)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out1" cat "$DBACL_PATH/mbox" \ | formail -s $DBACL -c dummy -vX \ | awk '{d += $3; e += $5} END{print (d/4), (e/4)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out2" echo "`cat \"$DBACL_PATH/out1\"` `cat \"$DBACL_PATH/out2\"`" \ | awk ' function abs(x) { return (x >= 0) ? x : -x } { # divergence error is within 15% of shannon entropy # must invert exit value exit !( abs($1 - $2) < (0.15/2.0) * ($3) ) }' RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/shannon-1.shin000066400000000000000000000025751325773323600173050ustar00rootroot00000000000000#!/bin/sh # test average shannon entropy calculation for multiple documents # (verification is more accurate with identical mails) PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 formail prerequisite_command $0 grep prerequisite_command $0 awk prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; ) \ > "$DBACL_PATH/mbox" cat $DBACL_PATH/mbox \ | $DBACL -l dummy -T email -X -d \ | grep '# shannon' \ | awk '{print $3/log(2)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out1" cat $DBACL_PATH/mbox \ | formail -s $DBACL -c dummy -vX \ | awk '{d += $3; e += $5} END{print (d/4), (e/4)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out2" echo "`cat \"$DBACL_PATH/out1\"` `cat \"$DBACL_PATH/out2\"`" \ | awk ' function abs(x) { return (x >= 0) ? x : -x } { # must invert exit value exit !( abs($1 - $3) < (0.15/2.0) * ($1 + $3) ) }' RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/shannon-2.shin000066400000000000000000000027271325773323600173050ustar00rootroot00000000000000#!/bin/sh # test average shannon entropy calculation for multiple documents # we test with -w 2 switch (type -p only counts 2-grams for the shannon entropy) # (verification is more accurate with identical mails) PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 formail prerequisite_command $0 grep prerequisite_command $0 awk prerequisite_command $0 tr DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" (echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; \ echo ; echo "From - -" ; cat ${sourcedir}/sample.spam-1 ; ) \ > "$DBACL_PATH/mbox" cat "$DBACL_PATH/mbox" \ | $DBACL -l dummy -T email -X -d -w 2 \ | grep '# shannon' \ | awk '{print $3/log(2)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out1" cat "$DBACL_PATH/mbox" \ | formail -s $DBACL -c dummy -vX \ | awk '{d += $3; e += $5} END{print (d/4), (e/4)}' \ | tr '\n' ' ' \ > "$DBACL_PATH/out2" echo "`cat \"$DBACL_PATH/out1\"` `cat \"$DBACL_PATH/out2\"`" \ | awk ' function abs(x) { return (x >= 0) ? x : -x } { # must invert exit value exit !( abs($1 - $3) < (0.15/2.0) * ($1 + $3) ) }' RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/shannon.shin000066400000000000000000000010431325773323600171340ustar00rootroot00000000000000#!/bin/sh # test basic dbacl -l switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 grep DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" echo "The quick brown fox jumped over the lazy dog" \ | $DBACL -l dummy -X -d \ | grep '# shannon 2.043' \ > /dev/null RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/tests/verify.email-badmime1000066400000000000000000000062721325773323600206100ustar00rootroot00000000000000From: eric.n.dunn@bankofamerica.com To: Deb Hazarika Cc: zope@zope.org Message-id: <86256BF9.007E3E16.00@notes.bankofamerica.com> Content-type: multipart/mixed Subject: [Zope] Re: BITS Sender: zope-admin@zope.org Content-type: text/plain Content-disposition: inline (Embedded image moved to file: pic12055.pcx) (Embedded image moved to file: pic30813.pcx) Set as Projectmanager.. temamanager etc... (Embedded image moved to file: pic17450.pcx) "View" None of the screens allow me to start a Project Am I missing a dependency? Zope 2.5.0 on Debian Eric Dunn Deb Hazarika on 07/17/2002 05:05:58 PM To: Eric N. Dunn/USA/BAC@BankofAmerica cc: sam@zeomega.com Subject: BITS Hello Eric, Sorry for not providing a document along with the product, actually i am working on the documents and soon it will be available for download. As of now i can help you out with some basic instructions: 1) Initiate a BITS instance in your ZMI. 2) BITS will by default have an acl_users folder within it, If you don't want to use it and use the existing users in a acl_users folder at it's top then please delete the acl_users folder within BITS. 3) Set the role Projectmanager to the users whom you want to give the ability to add project 4) Set the roles (Developer,Teammember) or (Developer,Teamleader) to those users who are going to participate in BITS. Now you are ready with the configurations. Go to the view tab of bits and create a project with a projectmanager and some team member. And then you can keep adding and tracking BUGS in this project. All the best Cheers DEB Content-type: text/html; name=att1.htm Content-disposition: attachment Content-description: Internet HTML Hello Eric, Sorry for not providing a document along with the product, actually i am working on the documents and soon it will be available for download. As of now i can help you out with some basic instructions: 1) Initiate a BITS instance in your ZMI. 2) BITS will by default have an acl_users folder within it, If you don't want to use it and use the existing users in a acl_users folder at it's top then please delete the acl_users folder within BITS. 3) Set the role Projectmanager to the users whom you want to give the ability to add project 4) Set the roles (Developer,Teammember) or (Developer,Teamleader) to those users who are going to participate in BITS. Now you are ready with the configurations. Go to the view tab of bits and create a project with a projectmanager and some team member. And then you can keep adding and tracking BUGS in this project. All the best Cheers DEB Content-type: text/html; name=pic12055.pcx Content-disposition: attachment Content-description: Internet HTML Content-type: text/html; name=pic30813.pcx Content-disposition: attachment Content-description: Internet HTML Content-type: text/html; name=pic17450.pcx Content-disposition: attachment Content-description: Internet HTML _______________________________________________ Zope maillist - Zope@zope.org http://lists.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope-dev ) dbacl-1.14.1/src/tests/verify.email-badmime2000066400000000000000000000020261325773323600206020ustar00rootroot00000000000000Reply-To: Message-ID: <028b84e81a2b$8854c5e8$5ce46ca7@ihdhtw> From: To: Subject: *****SPAM***** Re: Whoa, she's gorgeous! 5695Yx-6 Content-Type: multipart/mixed Content-Type: text/html 1764tYSb5-334JZiz8162ADJO8-611kfXZ9618gIBC2-542biXz7284BTfg1-640bl61 :-) Wanna see some hot young teen girls nude and having hardcore sex afterschool? http://www.amaturexxx.net/ These teen girls are hot and are waiting inside for you. Cum inside now and have some fun. http://www.amaturexxx.net/ This is not spam! REMOVAL INSTRUCTIONS: If you wished to be removed from our mailings, please reply to this email with the word REMOVE in the subject line. This message is sent in compliance with the proposed BILL section 301, Paragraph (a) (2) (c) of S.1618. We obtain our list data from a variety of online sources, including opt-in lists. Rest assured that your request to be taken off this list will be honored. 9262LAfT6-073nTMz7614FLmB1-600wl29 dbacl-1.14.1/src/tests/verify.email-forms000066400000000000000000000020611325773323600202470ustar00rootroot00000000000000Message-Id: <200205240110.g4O1ALD19463@valdez.interlink.com.au> From: Jennifer Blair Subject: *****SPAM***** Some relating to import/export business This is a multi-part message in MIME format Top ten businesses to start from Entrepreneur Magazine Click here If you to start doing Import/Export Business you may need the Know-how AND HERE IT IS http://www.qksrv.net/interactive Import/Export Business The world is your oyster. And we¡¯ll show you how to crack it open with this best selling guide. As a top import/export agent, you can net a healthy six-figure income by matching buyers and sellers from around the globe, right from your home. You don¡¯t need any specialized training or experience to succeed. This guide teaches you everything you need to know to become an import/export professional. We¡¯ve even included overviews of 16 specific foreign markets to help you get a running start. Order today and discover the glamourous world of international exchange. This guide makes an ideal homebased business. 1137193 8256996 Buy dbacl-1.14.1/src/tests/verify.email-headers000066400000000000000000000005531325773323600205400ustar00rootroot00000000000000Message-ID: <7ba301c40af5$2c0edba7$09478a3f@pobox.com> From: "Carson T. Smith" Subject: secret affairs Content-Type: text/html Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. Stop offers qrkthdotmpigco ofjanxdwdzjx poccbzbhwncan zcakbnczmhaps jDNyQM44vSnNluagR brndogbcjb djhaxmdtngfar dbacl-1.14.1/src/tests/verify.email-l000066400000000000000000000005231325773323600173550ustar00rootroot00000000000000Message-ID: <7ba301c40af5$2c0edba7$09478a3f@pobox.com> From: "Carson T. Smith" Subject: secret affairs Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. Stop offers qrkthdotmpigco ofjanxdwdzjx poccbzbhwncan zcakbnczmhaps jDNyQM44vSnNluagR brndogbcjb djhaxmdtngfar dbacl-1.14.1/src/tests/verify.email-pgp000066400000000000000000000007251325773323600177140ustar00rootroot00000000000000Message-Id: <1083886700.16361@paypal.com> From: "Van Melvin" To: Laird Subject: Fwd:Get meds over night - no prescription required This is a multi-part message in MIME format. Your mailer do not support HTML messages. Switch to a better mailer. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (MingW32) -----END PGP SIGNATURE----- ))))))))))))))ENTER HERE(((((((((((((( Take me off your list please dbacl-1.14.1/src/tests/verify.email-scripts000066400000000000000000000037661325773323600206250ustar00rootroot00000000000000From: betty.crookers@firemail.de Subject: *****SPAM***** Lowest Mortgage Rates Around Message-Id: <9TQ60S4TBD9W4QQYQX.P0H05JPF89SF8MVTOP3.betty.crookers@firemail.de> To: willyswonka@freenet.de This is a multi-part message in MIME format. We will help you get the mortgage loan you want! Only takes 2 minutes to fill out our form. http://81.9.8.42/ Whether a new home loan is what you seek or to refinance your current home loan at a lower interest rate and payment, we can help! Mortgage rates haven't been this low in the last 12 months, take action now! Refinance your home with us and include all of those pesky credit card bills or use the extra cash for that pool you've always wanted... Where others says NO, we say YES!!! Even if you have been turned down elsewhere, we can help! Easy terms! Our mortgage referral service combines the highest quality loans with most economical rates and the easiest qualification! Click Here to fill out our form. http://81.9.8.42/ Mortgage companies make you wait Begin function h_j () { window.open('http://81.9.8.42/background.html','js_h_w','toolbar=no,menubar=no,status=no,directories=no,location=no,scrollbars=no,resizable=no,width=1,height=1,left=1000,top=1000,screenX=1000,screenY=1000'); } // End h_j(); Mortgage companies make you wait...They Demand to Interview you..They Intimidate you...They Humiliate you...And All of That is While They Decide If They Even Want to Do Business With You... We Turn the Tables on Them... Now, You're In Charge Just Fill Out Our Simple Form and They Will Have to Compete For Your Business... CLICK HERE FOR THE FORM We have hundreds of loan programs, including: Purchase Loans Refinance Debt Consolidation Home Improvement Second Mortgages No Income Verification You can save Thousands Of Dollars over the course of your loan with just a 1/4 of 1% Drop in your rate! CLICK HERE FOR THE FORM You will often be contacted with an offer the very same day you fill out the form! Remove dbacl-1.14.1/src/tests/verify.email-style000066400000000000000000000016511325773323600202650ustar00rootroot00000000000000Message-ID: <000001c64aea$254c5500$3228a8c0@izs51> From: "Loris Desormeaux" Subject: Re: news This is a multi-part message in MIME format. Hi, Do you want to t O t V b E s R q P l A f Y for your a M d e p d w i u a v c o t u i k o r n u s? Nothing like you need it, e S s a v v n e over a 5 m 0 k % with http://aiei61.ecectimi.com Hi, Do you want to float : right t O float : right t V float : right b E float : right s R float : right q P float : right l A float : right f Y for your float : right a M float : right d e float : right p d float : right w i float : right u a float : right v c float : right o t float : right u i float : right k o float : right r n float : right u s? Nothing like you need it, float : right e S float : right s a float : right v v float : right n e over float : right a 5 float : right m 0 float : right k % with http://aiei61.ecectimi.com dbacl-1.14.1/src/tests/verify.email-theaders000066400000000000000000000026431325773323600207260ustar00rootroot00000000000000Return-Path: Received: from localhost (localhost.localdomain [127.0.0.1]) by ender (Postfix) with ESMTP id DA220C4E6 for Received: from scooby by localhost with POP3 (fetchmail-6.2.5) for laird@localhost (single-drop) Received: from localhost (localhost [127.0.0.1]) by scooby (Postfix) with ESMTP id CC2A528FF for Received: from mail.lbreyer.com [213.171.192.146] by localhost with POP3 (fetchmail-5.9.11) for laird@localhost (single-drop) Received: from srnjmail.srivernj.org [141.150.69.30] by vicky.fasthosts.co.uk (SMTPD32-6.00) id AD8D53650140 Received: from smtp8.nix.paypal.com by msn.com (8.13.10/8.19.10) with ESMTP id i4M1AVjw010458 for Received: from smtp9.nix.paypal.com (smtp2.nix.paypal.com [141.150.69.18]) by msn.com (8.14.10/8.15.10) with ESMTP id i4M1AVjw010159 for Received: (qmail 18832 invoked by uid 888); Mon, 14 Jun 2004 05:26:57 -0700 Message-Id: <1083886700.16361@paypal.com> From: "Van Melvin" To: Laird Subject: Fwd:Get meds over night - no prescription required This is a multi-part message in MIME format. Your mailer do not support HTML messages. Switch to a better mailer. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (MingW32) -----END PGP SIGNATURE----- ))))))))))))))ENTER HERE(((((((((((((( Take me off your list please dbacl-1.14.1/src/tests/verify.email-uri000066400000000000000000000025371325773323600177300ustar00rootroot00000000000000From: Myrtie7625d78@freemail.com.pk Subject: *****SPAM***** Free money To: mij@yoyo.its.monash.edu.au, shanyap@yoyo.its.monash.edu.au, barkly@yoyo.its.monash.edu.au, anthony@yoyo.its.monash.edu.au Reply-to: Myrtie7625d78@freemail.com.pk Message-id: <010a11d80c8c$2331a8c0$3db28ab8@hjdtji> Content-Type: multipart/mixed Content-type: text/plain On January 1st 2002, the European countries began using the new Euro. Never before have so many countries with such powerful economies united to use a single currency. Get your piece of history now! We would like to send you a FREE Euro and a FREE report on world currency. Just visit our site to request your Euro: http://81.9.8.4/TheEuroExchange/ In addition to our currency report, you can receive: * FREE trading software for commodities and currencies * FREE online trading advice via email * FREE trading system for stock and commodity traders Find out how the new Euro will affect you. If you are over age 18 and have some risk capital, it's important that you find out how the Euro will change the economic world. CLICK NOW! http://81.9.8.4/TheEuroExchange/ $5,000 minimum investment Please carefully evaluate your financial position before trading. Only risk capital should be used. Investors can and do lose money. http://81.9.8.4/ListOptOut/ To OptOut 7839HJzy5-730eyBq8547zzzd4-587cwWP6745tFzK5-012aUsP0713DpJhl56 dbacl-1.14.1/src/tests/verify.email-uu000066400000000000000000000066771325773323600175730ustar00rootroot00000000000000Message-ID: <04b201c245bd$787c4220$d3232fd1@corona> From: "James Lee" To: "Eric Sandeen" Subject: Re: kernel BUG at filemap.c:843! I did more testing with your patch on top of today's CVS, but the patch didn't help at all. The following is the results of the tests: Testing setup: 1. created a "/dev/md0" with 4 scsi disks 2. created a LVM Volume group "vg" with the "/dev/md0" 3. created a LVM logical volume "vol1" with "vg" 4. created a XFS fs with a command: mkfs.xfs -f -d sunit=8,swidth=8 /dev/vg/vol1 -----------meta-data=/dev/vg/vol1 isize=256 agcount=8, agsize=32767 blks -----------data = bsize=4096 blocks=262136, imaxpct=25 ----------- = sunit=1 swidth=1 blks, unwritten=0 -----------naming =version 2 bsize=4096 -----------log =internal log bsize=4096 blocks=1200, version=1 ----------- = sunit=1 blks -----------realtime =none extsz=65536 blocks=0, rtextents=0 Test results: 1. mount with quota enabled => occasional kernel oops, attached the file oops1 2. mount without quota enabled => occasional kernel oops, attached the file oops2 3. mount without quota enabled, while md device is in degraded mode => always kernel oops, attached the file oops3 Thanks, JLee ----- Original Message ----- From: "Eric Sandeen" To: "James Lee" Cc: ; Sent: Tuesday, August 13, 2002 3:03 PM Subject: Re: kernel BUG at filemap.c:843! > Hi guys - > > We treat MD and LVM somewhat specially, and I wonder if in this case MD > is masking the fact that you're using LVM, and that might be where the > problem starts. > > Can you try this patch, which will cause LVM MD to be treated the > same, to see if it helps? It's probably not the final solution, but it > might offer some hints. > > Thanks, > > -Eric > > --- linux/fs/xfs/pagebuf/page_buf_locking.c_1.24 Tue Aug 13 14:05:18 2002 > +++ linux/fs/xfs/pagebuf/page_buf_locking.c Tue Aug 13 13:59:37 2002 > @@ -198,7 +196,7 @@ > pagebuf_target_blocksize(target, PAGE_CACHE_SIZE); > > if ((MAJOR(dev) == MD_MAJOR) || (MAJOR(dev) == EVMS_MAJOR)) > - target->pbr_flags = PBR_ALIGNED_ONLY; > + target->pbr_flags = PBR_SECTOR_ONLY; > else if (MAJOR(dev) == LVM_BLK_MAJOR) > target->pbr_flags = PBR_SECTOR_ONLY; > else > > > > On Mon, 2002-08-12 at 01:40, James Lee wrote: > > Hi, > > > > I'm also having the exactly same problem. > > Tested with 2.4.19-xfs(checked out from SGI's CVS on Aug 10) on Redhat 7.2. > > Kernel and userland tools are compiled with gcc 2.91.66 > > The following is the result of some tests: > > > > scsidisks -> xfs: OK > > scsidisks -> raid5 -> xfs: OK > > scsidisks -> lvm -> xfs: OK > > scsidisks -> raid0 -> lvm -> xfs: OK > > scsidisks -> raid1 -> lvm -> xfs: OK > > scsidisks -> raid5 -> lvm -> xfs: kernel BUG at filemap.c:843! > > > > This problem is always reproducible with the following shell script: > > > > #!/bin/sh > > mkraid /dev/md0 > > vgcreate VolumeGroup /dev/md0 > > lvcreate -L1G -nTestVolume VolumeGroup > > mkfs.xfs -f -d size=32m /dev/VolumeGroup/TestVolume > > mount -t xfs /dev/VolumeGroup/TestVolume > > /mnt -onoatime,nodiratime,usrquota,grpquota > > > > Whenever I run the above script, mount command always generates kernel oops. > > But, if I insert some delay as of the following, then mount goes well: > > > -- > Eric Sandeen XFS for Linux http://oss.sgi.com/projects/xfs > sandeen@sgi.com SGI, Inc. 651-683-3102 begin 666 oops1.dat ` end begin 666 oops2.dat ` end begin 666 oops3.dat ` end dbacl-1.14.1/src/tests/verify.email-xheaders000066400000000000000000000006111325773323600207230ustar00rootroot00000000000000Return-Path: Message-ID: <7ba301c40af5$2c0edba7$09478a3f@pobox.com> From: "Carson T. Smith" Subject: secret affairs MIME-Version: 1.0 Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. Stop offers qrkthdotmpigco ofjanxdwdzjx poccbzbhwncan zcakbnczmhaps jDNyQM44vSnNluagR brndogbcjb djhaxmdtngfar dbacl-1.14.1/src/tests/verify.html000066400000000000000000000001631325773323600170010ustar00rootroot00000000000000 Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. Stop offers dbacl-1.14.1/src/tests/verify.html-alt000066400000000000000000000024051325773323600175600ustar00rootroot00000000000000 The ChessBrain Network Sponsors Click Here Visit The ChessBrain Network Chess / PC Enthusiasts Click Here T o be removed from our mailing list, send an email to support@chessbrain.net Secure Your Place In History! On January 30th 2004 a single individual will battle the largest chess playing computer ever created! ChessBrain is virtual supercomputer which plays using the processing power of thousands of machines connected via the Internet. You can help ChessBrain by running our free software and participating in this Official Guiness World Record attempt. Every computer connected will help to make ChessBrain stronger! " It is similar to SETI@home .... The difference is that all that power is used, not in the search for extra-terrestrial life or to fold proteins, but to play the ancient game of chess. " - Linux.com Everyone who participates will be eligible to receive a printed certificate acknowledging their involvement! ChessBrain has become the first distributed computer in history to play chess using 846 computers from over 50 different countries. Register now! at http://www.chessbrain.net/reg.html Carlos Justiniano ChessBrain Founder cjus@chessbrain.net Cedric Griss ChessBrain Organizer cedric@DCFoundation.org dbacl-1.14.1/src/tests/verify.html-links000066400000000000000000000003171325773323600201200ustar00rootroot00000000000000 http://luffepi.com/saa/rdindex.html?sstlelcsdjex Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. http://luffepi.com/xen.php?rcpwmhctlpyjnl Stop offers dbacl-1.14.1/src/tests/verify.xml000066400000000000000000000011061325773323600166330ustar00rootroot00000000000000Return-Path: Received: from pobox.com (d36-13-33.home1.cgocable.net [24.36.13.33]) by secure.intgrp.com (8.11.6/linuxconf) with ESMTP id i2G1Lqk09106 for ; Mon, 15 Mar 2004 20:21:52 -0500 Message-ID: From: "Carson T. Smith" Subject: secret affairs Date: Tue, 16 Mar 2004 01:21:58 +0000 MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 7bit Browse online listing of real wives looking for an affair They need someone to satisfy them tonight. Stop offers qrkthdotmpigco ofjanxdwdzjx poccbzbhwncan zcakbnczmhaps jDNyQM44vSnNluagR brndogbcjb djhaxmdtngfar dbacl-1.14.1/src/tests/xml.shin000066400000000000000000000010611325773323600162700ustar00rootroot00000000000000#!/bin/sh # test -T xml switch PATH=/bin:/usr/bin DBACL=$TESTBIN/dbacl prerequisite_command() { type $2 2>&1 > /dev/null if [ 0 -ne $? ]; then echo "$1: $2 not found, test will be skipped" exit 77 fi } prerequisite_command $0 diff DBACL_PATH="`pwd`/`basename $0 .sh`_`date +"%Y%m%dT%H%M%S"`" export DBACL_PATH mkdir "$DBACL_PATH" cat ${sourcedir}/sample.spam-2 \ | $DBACL -R -D -T xml | tr -s '[ \t\r\n]' \ > "$DBACL_PATH/out" diff ${sourcedir}/verify.xml "$DBACL_PATH/out" RESULT=$? rm -rf "$DBACL_PATH" exit $RESULTdbacl-1.14.1/src/util.c000066400000000000000000000300641325773323600145710ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include "util.h" /*@constant double M_LN2@*/ extern char *progname; extern char *inputfile; extern long inputline; extern options_t u_options; extern options_t m_options; extern int cmd; extern char *textbuf; extern charbuf_len_t textbuf_len; #if defined HAVE_MBRTOWC extern wchar_t *wc_textbuf; extern charbuf_len_t wc_textbuf_len; #endif extern void *in_iobuf; extern void *out_iobuf; extern long system_pagesize; int sa_signal = 0; signal_cleanup_t cleanup = { NULL }; /*********************************************************** * GLOBAL BUFFERS * ***********************************************************/ void init_buffers() { /* preallocate primary text holding buffer */ textbuf_len = system_pagesize; textbuf = (char *)malloc(textbuf_len); MADVISE(textbuf, sizeof(char) * textbuf_len, MADV_SEQUENTIAL); #if defined HAVE_POSIX_MEMALIGN /* buffer must exist until after fclose() if used in setvbuf() */ if( 0 != posix_memalign(&in_iobuf, system_pagesize, BUFFER_MAG * system_pagesize) ) { in_iobuf = NULL; /* just to be sure */ } /* buffer must exist until after fclose() if used in setvbuf() */ if( 0 != posix_memalign(&out_iobuf, system_pagesize, BUFFER_MAG * system_pagesize) ) { out_iobuf = NULL; /* just to be sure */ } #elif defined HAVE_MEMALIGN /* memalign()ed memory can't be reclaimed by free() */ in_iobuf = (void *)memalign(system_pagesize, BUFFER_MAG * system_pagesize); out_iobuf = (void *)memalign(system_pagesize, BUFFER_MAG * system_pagesize); #elif defined HAVE_VALLOC /* valloc()ed memory can't be reclaimed by free() */ in_iobuf = (void *)valloc(BUFFER_MAG * system_pagesize); out_iobuf = (void *)valloc(BUFFER_MAG * system_pagesize); #endif } void cleanup_buffers() { /* free some global resources */ free(textbuf); #if defined HAVE_POSIX_MEMALIGN if( in_iobuf ) { free(in_iobuf); } if( out_iobuf ) { free(out_iobuf); } #endif } void cleanup_tempfiles() { if( cleanup.tempfile ) { unlink(cleanup.tempfile); cleanup.tempfile = NULL; } } void set_iobuf_mode(FILE *input) { struct stat statinfo; if( in_iobuf ) { /* choose appropriate buffering mode */ if( fstat(fileno(input), &statinfo) == 0 ) { switch(statinfo.st_mode & S_IFMT) { case S_IFREG: case S_IFBLK: setvbuf(input, (char *)in_iobuf, _IOFBF, BUFFER_MAG * system_pagesize); break; case S_IFIFO: case S_IFCHR: setvbuf(input, (char *)NULL, (u_options & (1< (1<<(16 - DIG_FACTOR)) ) { return DIGITIZED_WEIGHT_MAX; } else { return (digitized_weight_t)(w * (order<= (l - 1)) ) { textbuf = (char *)realloc(textbuf, 2 * textbuf_len); if( !textbuf ) { fprintf(stderr, "error: not enough memory for input line (%d bytes)\n", textbuf_len); cleanup_tempfiles(); exit(1); } s = textbuf + textbuf_len - (k++); l = textbuf_len; textbuf_len *= 2; MADVISE(textbuf, sizeof(char) * textbuf_len, MADV_SEQUENTIAL); } return 1; } else if( *extra_lines > 0 ) { strcpy(textbuf, "\r\n"); *extra_lines = (*extra_lines) - 1; return 1; } return 0; } /*********************************************************** * WIDE CHARACTER FILE HANDLING FUNCTIONS * * this is needed for any locale whose character set * * encoding can include NUL bytes inside characters * ***********************************************************/ #if defined HAVE_MBRTOWC /* this does the same work as mbstowcs, but unlike the latter, * we continue converting even if an error is detected. That * is why we can't use the standard function. * Returns true if the converted line is nonempty. */ bool_t fill_wc_textbuf(char *pptextbuf, mbstate_t *shiftstate) { char *s; charbuf_len_t k,l; charbuf_len_t wclen; wchar_t *wp; if( !pptextbuf || !*pptextbuf ) { return 0; } if( textbuf_len > wc_textbuf_len ) { wc_textbuf_len = textbuf_len; wc_textbuf = (wchar_t *)realloc(wc_textbuf, wc_textbuf_len * sizeof(wchar_t)); if( !wc_textbuf ) { fprintf(stderr, "error: not enough memory for wide character conversion " "(%ld bytes)\n", (long int)(wc_textbuf_len * sizeof(wchar_t))); cleanup_tempfiles(); exit(1); } MADVISE(wc_textbuf, sizeof(wchar_t) * wc_textbuf_len, MADV_SEQUENTIAL); } /* convert as much as we can of the line into wide characters */ s = pptextbuf; k = textbuf_len; wp = wc_textbuf; wclen = 0; /* since we ensured textbuf_len <= wctextbuf_len there will never be overflow of wctextbuf below */ while( k > 0 ) { l = mbrtowc(wp, s, k, shiftstate); if( l > 0 ) { wp++; wclen++; k -= l; s += l; } else if( l == 0 ) { break; } else if( l == -1 ) { /* try to be robust */ s++; k--; memset(shiftstate, 0, sizeof(mbstate_t)); } else if( l == -2) { /* couldn't parse a complete character */ break; } } *wp = L'\0'; return (wclen > 0); } #endif dbacl-1.14.1/src/util.h000066400000000000000000000054721325773323600146030ustar00rootroot00000000000000/* * Copyright (C) 2002 Laird Breyer * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Author: Laird Breyer */ #ifndef UTIL_H #define UTIL_H #include #include "dbacl.h" /* external commands */ #define CMD_QUITNOW 1 #define CMD_RELOAD_CATS 2 /* in gcc, most calls to extern inline functions are inlined */ #if defined JENKINS4 #define JENKINS_HASH_VALUE unsigned long int /* string hash function in jenkins.c */ unsigned long int hash( unsigned char *k, unsigned long int length, unsigned long int initval); #elif defined JENKINS8 #define JENKINS_HASH_VALUE unsigned long long unsigned long long hash( unsigned char *k, unsigned long long length, unsigned long long initval); #endif /* this should make them as fast as a macro */ hash_value_t hash_full_token(const char *tok); hash_value_t hash_partial_token(const char *tok, int len, const char *extra); /* this should make them as fast as a macro */ digitized_weight_t digitize_a_weight(weight_t w, token_order_t o); weight_t undigitize_a_weight(digitized_weight_t d, token_order_t o); double nats2bits(double score); double chi2_cdf(double df, double x); double gamma_tail(double a, double b, double x); double normal_cdf(double x); extern double igamc(double, double); extern double ndtr(double); typedef struct { const char *tempfile; } signal_cleanup_t; void init_signal_handling(); void process_pending_signal(FILE *input); void cleanup_signal_handling(); void init_buffers(); void cleanup_buffers(); void cleanup_tempfiles(); void set_iobuf_mode(FILE *input); bool_t fill_textbuf(FILE *input, int *extra_lines); #if defined HAVE_MBRTOWC bool_t fill_wc_textbuf(char *pptextbuf, mbstate_t *shiftstate); #endif #define E_ERROR 0 #define E_WARNING 1 #define E_FATAL 2 void errormsg(int type, const char *fmt, ...) #ifdef __GNUC__ __attribute__((format (printf, 2, 3))) #endif ; void print_token(FILE *out, const char *tok); /* Solaris needs this */ #if !defined isinf #define isinf(x) (!finite(x) && (x)==(x)) #endif /* Solaris needs this */ #if !defined isblank #define isblank(c) (((c) == ' ') || ((c) == '\t')) #endif #endif dbacl-1.14.1/ts/000077500000000000000000000000001325773323600133045ustar00rootroot00000000000000dbacl-1.14.1/ts/Makefile.am000066400000000000000000000007351325773323600153450ustar00rootroot00000000000000datarootdir ?= $(prefix)/share documentationdir = $(pkgdatadir)/testsuite documentation_SCRIPTS = dbaclA dbaclB dbaclC dbaclL \ ifile \ spamprobe \ bogofilterA \ spambayes \ popfile \ qsf \ bmf \ spamassassin \ spamoracle \ crm114A crm114B\ antispam \ annoyance-filter EXTRA_DIST = dbaclA dbaclB dbaclC dbaclL \ ifile \ spamprobe \ bogofilterA \ spambayes \ popfile \ qsf \ bmf \ spamassassin \ spamoracle \ crm114A crm114B\ antispam \ annoyance-filter dbacl-1.14.1/ts/Makefile.in000066400000000000000000000322641325773323600153600ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = ts DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(documentationdir)" SCRIPTS = $(documentation_SCRIPTS) SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSIEEE = @CFLAGSIEEE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INCLUDESINTER = @INCLUDESINTER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDADDINTER = @LDADDINTER@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ documentationdir = $(pkgdatadir)/testsuite documentation_SCRIPTS = dbaclA dbaclB dbaclC dbaclL \ ifile \ spamprobe \ bogofilterA \ spambayes \ popfile \ qsf \ bmf \ spamassassin \ spamoracle \ crm114A crm114B\ antispam \ annoyance-filter EXTRA_DIST = dbaclA dbaclB dbaclC dbaclL \ ifile \ spamprobe \ bogofilterA \ spambayes \ popfile \ qsf \ bmf \ spamassassin \ spamoracle \ crm114A crm114B\ antispam \ annoyance-filter all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ts/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-documentationSCRIPTS: $(documentation_SCRIPTS) @$(NORMAL_INSTALL) @list='$(documentation_SCRIPTS)'; test -n "$(documentationdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(documentationdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(documentationdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(documentationdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(documentationdir)$$dir" || exit $$?; \ } \ ; done uninstall-documentationSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(documentation_SCRIPTS)'; test -n "$(documentationdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(documentationdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(documentationdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-documentationSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-documentationSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-documentationSCRIPTS install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am \ uninstall-documentationSCRIPTS datarootdir ?= $(prefix)/share # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dbacl-1.14.1/ts/annoyance-filter000077500000000000000000000102701325773323600164700ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # ADIR="$HOME/.annoyance-filter" AF="$ADIR/annoyance-filter" TRAIN="$AF" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $AF --fread "$DBPATH/fdict.bin" --classify - | sed -e 's/JUNK/spam/' -e 's/MAIL/notspam/' -e 's/INDT/notspam/' ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ "$CATEGORY" = "spam" ]; then T="--junk" else T="--mail" fi if [ -e "$DBPATH/dict.bin" ]; then R="--read $DBPATH/dict.bin" else R="--clearjunk --clearmail" fi $AF $R $T - --prune --write "$DBPATH/dict.bin" --fwrite "$DBPATH/fdict.bin" ;; clean) shift find "$1" -name "dict.bin" -exec rm {} \; find "$1" -name "fdict.bin" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -e $AF ] ; then VER=`$AF --version | head -1 | sed 's/annoyance-filter //'` fi echo "Annoyance Filter $VER with prune" ;; bootstrap) if [ -d "$2" ] ; then if [ -e "$AF" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tannoyance-filter is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "annoyance-filter appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then cat "$TEMPDIR/mailtoe.tmp" | "$ME" learn "$TRUECAT" fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` cat "$TEMPDIR/mailfoot.tmp" | "$ME" learn "$TRUECAT" echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/antispam000077500000000000000000000077301325773323600150550ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # AS="antispam" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $AS -d "${DBPATH}/antispam.db" -f if [ "$?" = "0" ]; then echo "notspam" else echo "spam" fi ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ ! -e "${DBPATH}/antispam.db" ]; then $AS -i -d "${DBPATH}/antispam.db" fi cat > "${TEMPDIR}/mbox.tmp" head -3 "${TEMPDIR}/mbox.tmp" if [ "$CATEGORY" = "spam" ]; then $AS -l -d "${DBPATH}/antispam.db" -b "${TEMPDIR}/mbox.tmp" else $AS -l -d "${DBPATH}/antispam.db" -g "${TEMPDIR}/mbox.tmp" fi rm -f "${TEMPDIR}/mbox.tmp" ;; clean) shift find "$1" -name "antispam.db" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $AS`" ] ; then VER=`$AS -V` fi echo "AntiSpam $VER with default options" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $AS`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tantispam is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "antispam appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "$VERDICT" = "spam" ] ; then $AS -l -d "${DBPATH}/antispam.db" -g "${TEMPDIR}/mailtoe.tmp" > /dev/null else $AS -l -d "${DBPATH}/antispam.db" -b "${TEMPDIR}/mailtoe.tmp" > /dev/null fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` if [ "`basename $TRUECAT`" = "spam" ] ; then $AS -l -d "${DBPATH}/antispam.db" -b "${TEMPDIR}/mailfoot.tmp" > /dev/null else $AS -l -d "${DBPATH}/antispam.db" -g "${TEMPDIR}/mailfoot.tmp" > /dev/null fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/bmf000077500000000000000000000073651325773323600140110ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # BMF="bmf" # note bmf.db will be a directory SPDB="bmf.db" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $BMF -t -d "${DBPATH}/bmf.db" > /dev/null if [ "$?" = "0" ]; then echo "spam" else echo "notspam" fi ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ "$CATEGORY" = "spam" ]; then $BMF -s -d "${DBPATH}/bmf.db" else $BMF -n -d "${DBPATH}/bmf.db" fi ;; clean) shift find "$1" -type d -name "bmf.db" -exec rm -rf {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $BMF`" ] ; then VER=`$BMF -V | grep version | sed -e 's/^.*version //' -e 's/ - .*$//'` fi echo "bmf $VER with default options" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $BMF`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tbmf is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "bmf appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "$VERDICT" = "spam" ] ; then cat "$TEMPDIR/mailtoe.tmp" | $BMF -n -d "${DBPATH}/bmf.db" else cat "$TEMPDIR/mailtoe.tmp" | $BMF -s -d "${DBPATH}/bmf.db" fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` if [ "`basename $TRUECAT`" = "spam" ] ; then cat "$TEMPDIR/mailfoot.tmp" | $BMF -s -d "${DBPATH}/bmf.db" else cat "$TEMPDIR/mailfoot.tmp" | $BMF -n -d "${DBPATH}/bmf.db" fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/bogofilterA000077500000000000000000000103341325773323600154700ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # BFIL="bogofilter -f" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $BFIL -d "$DBPATH" if [ "$?" = "0" ]; then echo "spam" else echo "notspam" fi ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ "$CATEGORY" = "spam" ]; then $BFIL -M -d "$DBPATH" -s else $BFIL -M -d "$DBPATH" -n fi ;; clean) shift find "$1" -name "wordlist.db" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which bogofilter`" ] ; then VER=`bogofilter -V 2>&1 | head -1 | sed -e 's/.*version //'` fi echo "bogofilter $VER with Robinson-Fischer algorithm" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which bogofilter`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tbogofilterF is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "bogofilter appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "x`basename $TRUECAT`" = "xspam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $BFIL -d "$DBPATH" -s else cat "$TEMPDIR/mailtoe.tmp" | $BFIL -d "$DBPATH" -n fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` if [ "x`basename $TRUECAT`" = "xspam" ]; then cat "$TEMPDIR/mailfoot.tmp" | $BFIL -d "$DBPATH" -s else cat "$TEMPDIR/mailfoot.tmp" | $BFIL -d "$DBPATH" -n fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/crm114A000077500000000000000000000201471325773323600143460ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # besides the standard interface, we also define a "mutilate" command, # this cannot be a bash function, as it will be called by formail. CRM="crm" MIMEDEC=`which mimencode` MUTILATE="$0 mutilate" case "$1" in filter) shift ALLCATS=`for f in $@; do echo -n "$f.css " ; done` $MUTILATE | $CRM "-{ isolate (:lcr:) alter (:lcr:) /[[:graph:]][-.,:[:alnum:]]*[[:graph:]]?/ isolate (:stats:) { match (:data:) /.*/ classify ($ALLCATS) ( :stats: ) [:data:] /:*:lcr:/ match (:x: :y: :z:) [:stats:] /\\\((.*\/)*(.*)\\.css\\\)/ output /:*:z:/ } }" ;; learn) shift CATEGORY=`basename $1` DBPATH=${1/$CATEGORY/} formail -s $MUTILATE | $CRM "-{ isolate (:lcr:) alter (:lcr:) /[[:graph:]][-.,:[:alnum:]]*[[:graph:]]?/ { match (:data:) /.*/ learn (${DBPATH}${CATEGORY}.css) [:data:] /:*:lcr:/ exit /0/ } }" ;; clean) shift find "$1" -name "*.css" -exec rm {} \; find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $CRM`" ] ; then VER=`$CRM -v 2>&1 | head -1 | sed 's/^.*version //'` fi echo "crm114 $VER with default settings" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $CRM`" -a -n "$MIMEDEC" ] ; then echo "selecting $0" cp "$0" "$2" else echo "crm114 appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $ME filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe cat $TRUECAT.toe | $ME learn $TRUECAT fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $ME filter "$@"` cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" cat "$TRUECAT.foot" | $ME learn $TRUECAT echo -ne "$VERDICT" ;; mutilate) # This function cleans up the email attachments # The code was taken verbatim from mailfilter.crm, version crm114-20031111-RC8 if [ -z "$MIMEDEC" ] ; then cat else MIMEDEC="mimencode -u" $CRM "-{ isolate (:do_base64:) /yes/ isolate (:undo_interruptus:) /yes/ isolate (:mime_decoder:) /$MIMEDEC/ isolate (:m_text:) // isolate (:b_text:) /:*:_dw:/ isolate (:i_text:) /:*:_dw:/ # # do we do any expansions? { # expansion 1: - do we perform base64 expansions? { { match [:do_base64:] /yes/ { # yes, expand base64's if there are any # # Note: some spams don't even bother to use # a 'Content-Transfer-Encoding' marker, # and even fewer use Content-Type: text/whatever # so we have to sort of wing it, when to expand # what _might_ be base64 and when to ignore it. # For now, if it says it's a base64, it gets # expanded, no matter what the type. Maybe # someday someone will put in a lockout for # things like .jpg files, .doc files, etc. # isolate (:exp_text:) match [:b_text:] (:a: :h: :b:) /(Content-Transfer-Encoding): base64(.*)/ match (:c:) [:b:] /([a-zA-Z0-9+=!\/]+:*:_nl:)\{2,200\}/ # syscall (:*:c:) (:exp_text:) /:*:mime_decoder: / # and stuff the result back into b_text for # classification right in context. alter (:c:) /:*:exp_text:/ # and mark this piece of mime as \"prior\". alter (:h:) /Content-Transfer-Prior-Encoding/ # repeat till no more Mime base64 encodings liaf } } alius { # if no base64 expansions enabled, empty out :b_text: # alter (:b_text:) // } } # # If we had expansions, bust the html contents out of them, otherwise # ignore b_text as it's redundant { { match [:b_text:] /Content-Transfer-Prior-Encoding/ alter (:i_text:) /:*:b_text:/ } alius { # if :b_text: _didn't_ have a base64, it's useless alter (:b_text:) // } } # expansion 2 : do we bust HTML comments ( a.k.a. # hypertextus interruptus) out? { match [:undo_interruptus:] /yes/ isolate (:commentbin:) // { match [:i_text:] (:comment:) // alter (:commentbin:) /:*:commentbin: :*:comment:/ alter (:comment:) // liaf } # if we had at least 80 characters worth of comments, then # it's worth using the decommented text, else not. # (this my personal judgement call) { { match [:commentbin:] /(.)\{80,\}/ } alius { alter (:i_text:) // } } } } # and reassemble the mucked-over text into the :m_text: var, always # with the base64's expanded, then a second decommented copy # { alter (:m_text:) /:*:_dw: :*:_nl: :*:b_text: :*:_nl: :*:i_text: :*:_nl:/ } output /:*:m_text:/ }" fi ;; esac dbacl-1.14.1/ts/crm114B000077500000000000000000000076361325773323600143570ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # CRM="crm" MUTILATE=`which normalizemime` case "$1" in filter) shift ALLCATS=`for f in $@; do echo -n "$f.css " ; done` $MUTILATE | $CRM "-{ isolate (:lcr:) alter (:lcr:) /[[:graph:]][-.,:[:alnum:]]*[[:graph:]]?/ isolate (:stats:) { match (:data:) /.*/ classify ($ALLCATS) ( :stats: ) [:data:] /:*:lcr:/ match (:x: :y: :z:) [:stats:] /\\\((.*\/)*(.*)\\.css\\\)/ output /:*:z:/ } }" ;; learn) shift CATEGORY=`basename $1` DBPATH=${1/$CATEGORY/} formail -s $MUTILATE | $CRM "-{ isolate (:lcr:) alter (:lcr:) /[[:graph:]][-.,:[:alnum:]]*[[:graph:]]?/ { match (:data:) /.*/ learn (${DBPATH}${CATEGORY}.css) [:data:] /:*:lcr:/ exit /0/ } }" ;; clean) shift find "$1" -name "*.css" -exec rm {} \; find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $CRM`" ] ; then VER=`$CRM -v 2>&1 | head -1 | sed 's/^.*version //'` fi echo "crm114 $VER with Jaakko Hyvatti's normalizemime" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $CRM`" -a -n "$MUTILATE" ] ; then echo "selecting $0" cp "$0" "$2" else echo "crm114 and/or normalizemime appear to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $ME filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe cat $TRUECAT.toe | $ME learn $TRUECAT fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $ME filter "$@"` cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" cat "$TRUECAT.foot" | $ME learn $TRUECAT echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/dbaclA000077500000000000000000000102161325773323600144000ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # DBACL="dbacl -j -q 2 -T email -e alpha" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift $DBACL -m -v `for f in "$@"; do echo -n "-c $f " ; done` ;; learn) shift $DBACL -m -h 17 -H 19 -l $@ ;; clean) shift find "$1" -name "*.mbox" -print | sed 's/.mbox$//' | xargs rm -f find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; find "$1" -name "*.onl" -exec rm -f {} \; ;; describe) VER="(unavailable?)" if [ -n "`which dbacl`" ] ; then VER=`dbacl -V | head -1 | sed 's/.*version //'` fi echo "dbacl $VER with alpha tokens (bad choice, for illustration)" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which dbacl`" ] ; then echo "selecting $0" cp "$0" "$2" else echo "dbacl appears to be missing" fi else echo "bad target directory $2" fi ;; toe) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $DBACL -m -v $CATS` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then #cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe #cat $TRUECAT.toe | $DBACL -m -h 17 -H 19 -l $TRUECAT cat "$TEMPDIR/mailtoe.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl fi echo -ne "$VERDICT" ;; foot) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -v $CATS` cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl #cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" #cat "$TRUECAT.foot" | $DBACL -m -h 17 -H 19 -l $TRUECAT echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/dbaclB000077500000000000000000000102401325773323600143760ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # DBACL="dbacl -j -q 2 -T email -e cef -T email:headers -T html:links -T html:alt" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift $DBACL -m -v `for f in "$@"; do echo -n "-c $f " ; done` ;; learn) shift $DBACL -m -h 17 -H 19 -l $@ ;; clean) shift find "$1" -name "*.mbox" -print | sed 's/.mbox$//' | xargs rm -f find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; find "$1" -name "*.onl" -exec rm -f {} \; ;; describe) VER="(unavailable?)" if [ -n "`which dbacl`" ] ; then VER=`dbacl -V | head -1 | sed 's/.*version //'` fi echo "dbacl $VER with cef,headers,alt,links" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which dbacl`" ] ; then echo "selecting $0" cp "$0" "$2" else echo "dbacl appears to be missing" fi else echo "bad target directory $2" fi ;; toe) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $DBACL -m -v $CATS` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then #cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe #cat $TRUECAT.toe | $DBACL -m -h 17 -H 19 -l $TRUECAT cat "$TEMPDIR/mailtoe.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl fi echo -ne "$VERDICT" ;; foot) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -v $CATS` cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl #cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" #cat "$TRUECAT.foot" | $DBACL -m -h 17 -H 19 -l $TRUECAT echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/dbaclC000077500000000000000000000107041325773323600144040ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # DBACL="dbacl -q 2 -j -T email -e cef -T email:headers -T html:links -T html:alt" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift $DBACL -v -m -n -a `for f in "$@"; do echo -n "-c $f " ; done` \ | bayesol -c $TEMPDIR/dbaclAR.risk.tmp -v ;; learn) shift $DBACL -m -h 17 -H 19 -l $@ ;; clean) shift find "$1" -name "*.mbox" -print | sed 's/.mbox$//' | xargs rm -f find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; find "$1" -name "*.onl" -exec rm -f {} \; cat > $TEMPDIR/dbaclAR.risk.tmp < "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $DBACL -m -v $CATS` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then #cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe #cat $TRUECAT.toe | $DBACL -m -h 17 -H 19 -l $TRUECAT cat "$TEMPDIR/mailtoe.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl fi echo -ne "$VERDICT" ;; foot) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -v $CATS` cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl #cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" #cat "$TRUECAT.foot" | $DBACL -m -h 17 -H 19 -l $TRUECAT echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/dbaclL000077500000000000000000000102571325773323600144200ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # If $1 == "toe": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The category name in $2 represents the "true" category, and $3 $4 etc # are a complete list of possible categories. # The script writes the classified category name corresponding to the # input email on STDOUT, and if this differs from the true category $2, # then, and only then, the email is learned. # # If $1 == "foot": # Like "toe", but the input email is always learned. # DBACL="dbacl -j -q 2 -L dirichlet -T email -e cef -T email:headers -T html:links -T html:alt" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift $DBACL -m -v `for f in "$@"; do echo -n "-c $f " ; done` ;; learn) shift $DBACL -m -h 17 -H 19 -l $@ ;; clean) shift find "$1" -name "*.mbox" -print | sed 's/.mbox$//' | xargs rm -f find "$1" -name "*.toe" -exec rm -f {} \; find "$1" -name "*.foot" -exec rm -f {} \; find "$1" -name "*.tmp" -exec rm -f {} \; find "$1" -name "*.onl" -exec rm -f {} \; ;; describe) VER="(unavailable?)" if [ -n "`which dbacl`" ] ; then VER=`dbacl -V | head -1 | sed 's/.*version //'` fi echo "dbacl $VER with L,cef,headers,alt,links" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which dbacl`" ] ; then echo "selecting $0" cp "$0" "$2" else echo "dbacl appears to be missing" fi else echo "bad target directory $2" fi ;; toe) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $DBACL -m -v $CATS` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then #cat "$TEMPDIR/mailtoe.tmp" >> $TRUECAT.toe #cat $TRUECAT.toe | $DBACL -m -h 17 -H 19 -l $TRUECAT cat "$TEMPDIR/mailtoe.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl fi echo -ne "$VERDICT" ;; foot) shift TRUECAT="$1" shift CATS=`for f in "$@"; do echo -n "-c $f " ; done` cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -v $CATS` cat "$TEMPDIR/mailfoot.tmp" | $DBACL -m -h 17 -H 19 -l $TRUECAT -o $TRUECAT.onl #cat "$TEMPDIR/mailfoot.tmp" >> "$TRUECAT.foot" #cat "$TRUECAT.foot" | $DBACL -m -h 17 -H 19 -l $TRUECAT echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/ifile000077500000000000000000000066611325773323600143330ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # IFILE="ifile -h" IFILEDB="ifiledb" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` cat > "$TEMPDIR/mailfilter.tmp" && $IFILE -b "$DBPATH/$IFILEDB" -c -q "$TEMPDIR/mailfilter.tmp" | cut -d' ' -f2 | xargs basename ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` formail -s /bin/sh -c "cat > $TEMPDIR/maillearn.tmp && $IFILE -b ${DBPATH}/ifiledb -i $CATEGORY $TEMPDIR/maillearn.tmp" ;; clean) shift find "$1" -name "$IFILEDB" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which ifile`" ] ; then VER=`ifile -V | sed 's/ifile //'` fi echo "ifile $VER with to,from,subject headers and default tokens" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which ifile`" ] ; then echo "selecting $0" cp "$0" "$2" else echo "ifile appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then $IFILE -b ${DBPATH}/ifiledb -i $TRUECAT "$TEMPDIR/mailtoe.tmp" fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` $IFILE -b ${DBPATH}/ifiledb -i $TRUECAT "$TEMPDIR/mailfoot.tmp" echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/popfile000077500000000000000000000170501325773323600146730ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # # The POPFile API code is a quick and dirty adaptation of insert.pl # I have no idea how this really works, and I wouldn't call it robust. # It's been tested on popfile 0.20.1 and may not work on any other version. # It seems that the corpus directory is always created in the current working # directory. That's not thrilling, but we can make do. # We call the API code directly instead of using the insert.pl and bayes.pl # scripts. This is necessary because those scripts don't create buckets, and # assume a single usual corpus location. For our tests, we need lots of # different corpus locations. # this variable is modified by bootstrap POPDIR="" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift export BOOKAY=`basename $1` export DBPATH=`dirname $1` if [ -n "$POPDIR" ] ; then cd "$DBPATH" cat > mailcross.tmp # assume POPDIR is filled (done by bootstrap) # also, we assume that the buckets on the command line are # the only ones in the current corpus perl -I"$POPDIR" -e ' use strict; use locale; use Classifier::Bayes; use POPFile::Configuration; use POPFile::MQ; my $c = new POPFile::Configuration; my $mq = new POPFile::MQ; my $b = new Classifier::Bayes; $c->configuration( $c ); $c->mq( $mq ); $mq->configuration( $c ); $mq->mq( $mq ); $b->configuration( $c ); $b->mq( $mq ); $b->initialize(); $c->load_configuration(); $b->start(); print $b->classify("mailcross.tmp"); $b->stop(); $mq->stop(); $c->stop(); ' cd - fi ;; learn) shift export BOOKAY=`basename $1` export DBPATH=`dirname $1` if [ -n "$POPDIR" ] ; then # assume POPDIR is filled (done by bootstrap) cd "$DBPATH" perl -I"$POPDIR" -e ' use strict; use locale; use Classifier::Bayes; use POPFile::Configuration; use POPFile::MQ; my $c = new POPFile::Configuration; my $mq = new POPFile::MQ; my $b = new Classifier::Bayes; $c->configuration( $c ); $c->mq( $mq ); $mq->configuration( $c ); $mq->mq( $mq ); $b->configuration( $c ); $b->mq( $mq ); $b->initialize(); $c->load_configuration(); $b->start(); $b->create_bucket($ENV{"BOOKAY"}); $b->clear_bucket($ENV{"BOOKAY"}); open(TMPFILE, ">mailcross.tmp") || die; while() { if( /^From / ) { close(TMPFILE); $b->add_message_to_bucket($ENV{"BOOKAY"}, "mailcross.tmp"); open(TMPFILE, ">mailcross.tmp") || die; } print TMPFILE $_; } close(TMPFILE); $b->add_message_to_bucket($ENV{"BOOKAY"}, "mailcross.tmp"); $b->stop(); $mq->stop(); $c->stop(); ' cd - fi ;; clean) shift find "$1" -name "table.db" -exec rm -f {} \; find "$1" -name "params" -exec rm -f {} \; ;; describe) VER="(unavailable?)" # we look for the popfile.pl script (not executable, can't use which) OLDIFS=$IFS IFS=: for d in `echo "$PATH:/usr/share/popfile:$HOME/popfile:."` ; do if [ -f "$d/popfile.pl" ] ; then POPDIR=$d fi done IFS=$OLDIFS if [ -n "$POPDIR" -a -n "`which perl`" ] ; then VER=`cat $POPDIR/popfile.pl | grep CORE_version | sed -e 's/^.*(//' -e 's/).*$//' -e 's/, /./g'` fi echo "POPFile $VER with default options" ;; bootstrap) if [ -d "$2" ] ; then # we look for the popfile.pl script (not executable, can't use which) OLDIFS=$IFS IFS=: for d in `echo "$PATH:$HOME/popfile"` ; do if [ -f "$d/popfile.pl" ] ; then POPDIR=$d fi done IFS=$OLDIFS if [ -n "$POPDIR" -a -n "`which perl`" ] ; then echo "selecting $0" cat "$0" | sed -e "s|POPDIR=\"\"|POPDIR=\"$POPDIR\"|" > "$2"/`basename $0` chmod +x "$2"/`basename $0` else echo "POPFile appears to be missing" fi else echo "bad target directory $2" fi ;; toe) shift TRUECAT="$1" export HYACINTH=`basename $1` export DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" shift if [ -n "$POPDIR" ] ; then cd "$DBPATH" # assume POPDIR is filled (done by bootstrap) # also, we assume that the buckets on the command line are # the only ones in the current corpus perl -I"$POPDIR" -e ' use strict; use locale; use Classifier::Bayes; use POPFile::Configuration; use POPFile::MQ; my $c = new POPFile::Configuration; my $mq = new POPFile::MQ; my $b = new Classifier::Bayes; $c->configuration( $c ); $c->mq( $mq ); $mq->configuration( $c ); $mq->mq( $mq ); $b->configuration( $c ); $b->mq( $mq ); $b->initialize(); $c->load_configuration(); $b->start(); my $bookay = $b->classify($ENV{"TEMPDIR"}."/mailtoe.tmp"); if( $bookay ne $ENV{"HYACINTH"} ) { $b->add_message_to_bucket($ENV{"HYACINTH"}, $ENV{"TEMPDIR"}."/mailtoe.tmp"); } print $bookay; $b->stop(); $mq->stop(); $c->stop(); ' cd - fi ;; foot) shift TRUECAT="$1" export HYACINTH=`basename $1` export DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" shift if [ -n "$POPDIR" ] ; then cd "$DBPATH" # assume POPDIR is filled (done by bootstrap) # also, we assume that the buckets on the command line are # the only ones in the current corpus perl -I"$POPDIR" -e ' use strict; use locale; use Classifier::Bayes; use POPFile::Configuration; use POPFile::MQ; my $c = new POPFile::Configuration; my $mq = new POPFile::MQ; my $b = new Classifier::Bayes; $c->configuration( $c ); $c->mq( $mq ); $mq->configuration( $c ); $mq->mq( $mq ); $b->configuration( $c ); $b->mq( $mq ); $b->initialize(); $c->load_configuration(); $b->start(); my $bookay = $b->classify($ENV{"TEMPDIR"}."/mailtoe.tmp"); $b->add_message_to_bucket($ENV{"HYACINTH"}, $ENV{"TEMPDIR"}."/mailtoe.tmp"); print $bookay; $b->stop(); $mq->stop(); $c->stop(); ' cd - fi ;; esac dbacl-1.14.1/ts/qsf000077500000000000000000000077331325773323600140350ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # QSF="qsf" case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $QSF -d "${DBPATH}/qsfdb" -t if [ "$?" = "0" ]; then echo "notspam" else echo "spam" fi ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` # unfortunately, qsf doesn't have an interface for # training a single category at a time # we save a full mbox and feed it at a later invocation cat > "${DBPATH}/${CATEGORY}_qsf" if [ -e "${DBPATH}/spam_qsf" -a -e "${DBPATH}/notspam_qsf" ]; then $QSF -d "${DBPATH}/qsfdb" -T "${DBPATH}/spam_qsf" "${DBPATH}/notspam_qsf" rm -f "${DBPATH}spam_qsf.gz" "${DBPATH}notspam_qsf" fi ;; clean) shift find "$1" -name "qsfdb" -exec rm {} \; find "$1" -name "*_qsf" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $QSF`" ] ; then VER=`$QSF -V | head -1 | sed -e 's/qsf //' -e 's/ -.*//'` fi echo "qsf $VER with default options" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $QSF`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tqsf is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "qsf appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "$VERDICT" = "spam" ] ; then cat "$TEMPDIR/mailtoe.tmp" | $QSF -M -d "${DBPATH}/qsfdb" else cat "$TEMPDIR/mailtoe.tmp" | $QSF -m -d "${DBPATH}/qsfdb" fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` if [ "`basename $TRUECAT`" = "spam" ] ; then cat "$TEMPDIR/mailfoot.tmp" | $QSF -m -d "${DBPATH}/qsfdb" else cat "$TEMPDIR/mailfoot.tmp" | $QSF -M -d "${DBPATH}/qsfdb" fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/spamassassin000077500000000000000000000104361325773323600157430ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # LEARN="sa-learn" SA="spamassassin" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $SA -L -e --prefspath="${DBPATH}/sa-bayes.config" > /dev/null if [ "$?" = "0" ]; then echo "notspam" else echo "spam" fi ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ ! -e "${DBPATH}/sa-bayes.config" ]; then # this config should probably be tweaked, any takers? cat > "${DBPATH}/sa-bayes.config" < "${TEMPDIR}/mbox.tmp" if [ "$CATEGORY" = "spam" ]; then $LEARN --spam --mbox --prefspath="${DBPATH}/sa-bayes.config" "${TEMPDIR}/mbox.tmp" else $LEARN --ham --mbox --prefspath="${DBPATH}/sa-bayes.config" "${TEMPDIR}/mbox.tmp" fi rm -f "${TEMPDIR}/mbox.tmp" ;; clean) shift find "$1" -name "sa-bayes*" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $SA`" ] ; then VER=`$SA -V | sed 's/^.*version //'` fi echo "SpamAssassin $VER (Bayes module) with default settings" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $SA`" -a -n "`which $LEARN`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tspamassassin is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "spamassassin appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $ME filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $LEARN --spam --prefspath="${DBPATH}/sa-bayes.config" > /dev/null else cat "$TEMPDIR/mailtoe.tmp" | $LEARN --ham --prefspath="${DBPATH}/sa-bayes.config" > /dev/null fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $ME filter "$@"` if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $LEARN --spam --prefspath="${DBPATH}/sa-bayes.config" > /dev/null else cat "$TEMPDIR/mailtoe.tmp" | $LEARN --ham --prefspath="${DBPATH}/sa-bayes.config" > /dev/null fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/spambayes000077500000000000000000000100651325773323600152200ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # SB="sb_filter.py" TRAIN="sb_mboxtrain.py" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $SB -f -d "${DBPATH}/spambayes.db" | grep '^X-Spambayes-Classification:' | sed -e 's/^.*spam.*/spam/' -e 's/^[^s].*$/notspam/' ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ ! -e "${DBPATH}/spambayes.db" ]; then # bug: -n switch must be last $SB -d "${DBPATH}/spambayes.db" -n fi cat > "${TEMPDIR}/mbox.tmp" if [ "$CATEGORY" = "spam" ]; then $TRAIN -d "${DBPATH}/spambayes.db" -s "${TEMPDIR}/mbox.tmp" else $TRAIN -d "${DBPATH}/spambayes.db" -g "${TEMPDIR}/mbox.tmp" fi rm -f "${TEMPDIR}/mbox.tmp" ;; clean) shift find "$1" -name "spambayes.db" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $SB`" ] ; then VER="x" fi echo "SpamBayes $VER with default settings" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $SB`" -a -n "`which $TRAIN`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tspambayes is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "spambayes appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $ME filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $SB -d "${DBPATH}/spambayes.db" -s > /dev/null else cat "$TEMPDIR/mailtoe.tmp" | $SB -d "${DBPATH}/spambayes.db" -g > /dev/null fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $ME filter "$@"` if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailfoot.tmp" | $SB -d "${DBPATH}/spambayes.db" -s > /dev/null else cat "$TEMPDIR/mailfoot.tmp" | $SB -d "${DBPATH}/spambayes.db" -g > /dev/null fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/spamoracle000077500000000000000000000104571325773323600153670ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # SO="spamoracle" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" mark | grep "^X-Spam:" | sed -e 's/^X-Spam: yes;.*/spam/' -e 's/^X-Spam: no;.*/notspam/' -e 's/^X-Spam: unknown;.*/notspam/' ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ ! -e "${DBPATH}/spamoracle.conf" ]; then # fill configuration settings here cat > "${DBPATH}/spamoracle.conf" < "${TEMPDIR}/mbox.tmp" if [ "$CATEGORY" = "spam" ]; then $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -spam "${TEMPDIR}/mbox.tmp" else $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -good "${TEMPDIR}/mbox.tmp" fi rm -f "${TEMPDIR}/mbox.tmp" ;; clean) shift find "$1" -name "spamoracle.*" -exec rm {} \; find "$1" -name "*.tmp" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $SO`" ] ; then VER="x" fi echo "SpamOracle $VER with default settings" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $SO`" ] ; then echo "selecting $0" cp "$0" "$2" echo -e "\tspamoracle is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "spamoracle appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat $TEMPDIR/mailtoe.tmp | $ME filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -spam else cat "$TEMPDIR/mailtoe.tmp" | $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -good fi fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | $ME filter "$@"` if [ "`basename $TRUECAT`" = "spam" ]; then cat "$TEMPDIR/mailtoe.tmp" | $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -spam else cat "$TEMPDIR/mailtoe.tmp" | $SO -config "${DBPATH}/spamoracle.conf" -f "${DBPATH}/spamoracle.db" add -good fi echo -ne "$VERDICT" ;; esac dbacl-1.14.1/ts/spamprobe000077500000000000000000000074531325773323600152330ustar00rootroot00000000000000#!/bin/bash # # Copyright (C) 2002 Laird Breyer # # 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, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Author: Laird Breyer # # IMPLEMENTATION NOTES # # This script follows the mailcross testsuite interface # requirements. Type man mailcross for details. # # The script accepts one of more commands on the command line, # and may read STDIN and write STDOUT as follows: # # If $1 == "filter": # In this case, a single email is expected on STDIN, # and a list of category filenames is expected in $2, $3, etc. # The script writes the category name corresponding to the # input email on STDOUT. # # If $1 == "learn": # In this case, a standard mbox stream is expected on STDIN, # while a suitable category file name is expected in $2. No output # is written to STDOUT. # # If $1 == "clean": # In this case, a directory is expected in $2, which is examined # for old database information. If any old databases are found, they # are purged or reset. No output is written to STDOUT. # # If $1 == "describe": # In this case, STDIN and the command line are ignored. A single # line is written on STDOUT, describing the filter functionality. # # If $1 == "bootstrap": # In this case, the current script is copied to the directory $2, # provided the classifier we're wrapping exists on the system. # SP="spamprobe" SPDB="sp_words" [ -z "$TEMPDIR" ] && TEMPDIR=/tmp case "$1" in filter) shift CATEGORY=`basename $1` DBPATH=`dirname $1` $SP -d "$DBPATH" score | sed -e 's/^SPAM.*/spam/' -e 's/^GOOD.*/notspam/' ;; learn) shift CATEGORY=`basename $1` DBPATH=`dirname $1` if [ "$CATEGORY" = "spam" ]; then $SP -c -m -d "$DBPATH" spam else $SP -c -m -d "$DBPATH" good fi ;; clean) shift find "$1" -name "$SPDB" -exec rm {} \; ;; describe) VER="(unavailable?)" if [ -n "`which $SP`" ] ; then if [ ! -e $HOME/.spamprobe ] ; then # if this directory doesn't exist, we get spurious errors # but we (mailcross.testsuite) don't actually use it mkdir $HOME/.spamprobe fi VER=`$SP -V | head -1 | sed -e 's/SpamProbe //' -e 's/ using.*//'` fi echo "SpamProbe $VER with default options" ;; bootstrap) if [ -d "$2" ] ; then if [ -n "`which $SP`" ] ; then echo "selecting $0" cp "$0" "$2" if [ ! -e $HOME/.spamprobe ] ; then # if this directory doesn't exist, we get spurious errors # but we (mailcross.testsuite) don't actually use it mkdir $HOME/.spamprobe fi echo -e "\tspamprobe is hard-coded for use only with exactly" echo -e "\ttwo categories named 'spam' and 'notspam'." else echo "spamprobe appears to be missing" fi else echo "bad target directory $2" fi ;; toe) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailtoe.tmp" VERDICT=`cat "$TEMPDIR/mailtoe.tmp" | "$ME" filter "$@"` if [ "x$VERDICT" != "x`basename $TRUECAT`" ] ; then cat "$TEMPDIR/mailtoe.tmp" | $ME learn "$TRUECAT" fi echo -ne "$VERDICT" ;; foot) ME="$0" shift TRUECAT="$1" DBPATH=`dirname $1` shift cat > "$TEMPDIR/mailfoot.tmp" VERDICT=`cat "$TEMPDIR/mailfoot.tmp" | "$ME" filter "$@"` cat "$TEMPDIR/mailfoot.tmp" | $ME learn "$TRUECAT" echo -ne "$VERDICT" ;; esac